From 5876b386e1211137597cafccd0cc752b112a1acd Mon Sep 17 00:00:00 2001 From: pfaedit Date: Tue, 2 Mar 2004 22:35:56 +0000 Subject: Initial add. --- AUTHORS | 1 + INSTALL | 182 + Makefile.dynamic.in | 77 + Makefile.in | 77 + Makefile.static.in | 65 + README | 159 + README-MS | 138 + README-MS~ | 138 + README-MacOSX | 168 + README-MacOSX~ | 168 + README-unix | 159 + README-unix~ | 159 + aclocal.m4 | 3573 ++ config.guess | 1317 + config.sub | 1411 + configure | 12295 +++++++ configure.dynamic | 12295 +++++++ configure.dynamic.in | 287 + configure.in | 287 + configure.static | 7656 +++++ configure.static.in | 227 + descrip.mms | 7 + fontforge/Makefile.dynamic.in | 89 + fontforge/Makefile.in | 89 + fontforge/Makefile.static.in | 81 + fontforge/acorn2sfd.c | 924 + fontforge/alignment.c | 660 + fontforge/autohint.c | 4750 +++ fontforge/autosave.c | 172 + fontforge/autotrace.c | 724 + fontforge/autowidth.c | 2037 ++ fontforge/bitmapdlg.c | 770 + fontforge/bitmapview.c | 1737 + fontforge/bvedit.c | 757 + fontforge/charinfo.c | 5984 ++++ fontforge/charview.c | 7643 +++++ fontforge/charviewicons.c | 164 + fontforge/combinations.c | 1213 + fontforge/configure-pfaedit.h | 152 + fontforge/contextchain.c | 2716 ++ fontforge/crctab.c | 63 + fontforge/cursors.c | 684 + fontforge/cvaddpoints.c | 525 + fontforge/cvdebug.c | 1235 + fontforge/cvexport.c | 977 + fontforge/cvfreehand.c | 895 + fontforge/cvgetinfo.c | 2345 ++ fontforge/cvgridfit.c | 256 + fontforge/cvhand.c | 45 + fontforge/cvhints.c | 855 + fontforge/cvimages.c | 1466 + fontforge/cvknife.c | 171 + fontforge/cvpalettes.c | 2761 ++ fontforge/cvpointer.c | 1042 + fontforge/cvruler.c | 160 + fontforge/cvshapes.c | 308 + fontforge/cvstroke.c | 1363 + fontforge/cvtranstools.c | 96 + fontforge/cvundoes.c | 2561 ++ fontforge/diffstubs.c | 616 + fontforge/displayfonts.c | 672 + fontforge/dumpbdf.c | 514 + fontforge/dumppfa.c | 2039 ++ fontforge/edgelist.h | 146 + fontforge/effects.c | 1195 + fontforge/encoding.c | 1690 + fontforge/fontforge.1 | 262 + fontforge/fontinfo.c | 5952 ++++ fontforge/fontview.c | 6562 ++++ fontforge/freetype.c | 1090 + fontforge/fvcomposit.c | 1937 ++ fontforge/fvfonts.c | 1480 + fontforge/fvimportbdf.c | 2118 ++ fontforge/fvmetrics.c | 384 + fontforge/genttfinstrs.c | 1724 + fontforge/gotodlg.c | 619 + fontforge/histograms.c | 903 + fontforge/ikarus.c | 709 + fontforge/images.c | 3095 ++ fontforge/kernclass.c | 1885 ++ fontforge/macbinary.c | 2903 ++ fontforge/macenc.c | 3391 ++ fontforge/makenomenh.c | 804 + fontforge/metafont.c | 2199 ++ fontforge/metricsview.c | 4019 +++ fontforge/mm.c | 2942 ++ fontforge/nomen-de.c | 63 + fontforge/nomen-en.c | 3444 ++ fontforge/nomen-es.c | 55 + fontforge/nomen-fr.c | 3362 ++ fontforge/nomen-it.c | 1918 ++ fontforge/nomen-ja.c | 3229 ++ fontforge/nomen-ru.c | 1925 ++ fontforge/nonlineartrans.c | 847 + fontforge/openfontdlg.c | 206 + fontforge/othersubrs.c | 463 + fontforge/parsepfa.c | 2475 ++ fontforge/parsettf.c | 4395 +++ fontforge/parsettfatt.c | 4087 +++ fontforge/parsettfbmf.c | 1156 + fontforge/pfaedit.h | 117 + fontforge/pfaeditui.h | 89 + fontforge/prefs.c | 1935 ++ fontforge/print.c | 3083 ++ fontforge/problems.c | 2930 ++ fontforge/psfont.h | 184 + fontforge/psread.c | 3599 ++ fontforge/psunicodenames.c | 70995 ++++++++++++++++++++++++++++++++++++++++ fontforge/savedimage.c | 18048 ++++++++++ fontforge/savefontdlg.c | 2774 ++ fontforge/scripting.c | 5274 +++ fontforge/sd.h | 111 + fontforge/search.c | 1423 + fontforge/sfd.c | 4028 +++ fontforge/sfddiff.1 | 84 + fontforge/sfddiff.c | 487 + fontforge/sftextfield.c | 2613 ++ fontforge/showatt.c | 2584 ++ fontforge/simplifydlg.c | 333 + fontforge/splashimage.c | 18074 ++++++++++ fontforge/splinefill.c | 1757 + fontforge/splinefont.h | 1565 + fontforge/splineorder2.c | 1156 + fontforge/splineoverlap.c | 2225 ++ fontforge/splinerefigure.c | 98 + fontforge/splinesave.c | 2851 ++ fontforge/splinesaveafm.c | 2094 ++ fontforge/splinestroke.c | 1760 + fontforge/splineutil.c | 4117 +++ fontforge/splineutil2.c | 2800 ++ fontforge/stamp.c | 5 + fontforge/stamper.c | 20 + fontforge/start.c | 475 + fontforge/statemachine.c | 3139 ++ fontforge/svg.c | 2649 ++ fontforge/threaddummy.c | 4 + fontforge/tilepath.c | 897 + fontforge/tottf.c | 5195 +++ fontforge/tottfaat.c | 2013 ++ fontforge/tottfgpos.c | 3764 +++ fontforge/transform.c | 584 + fontforge/ttf.h | 624 + fontforge/ttfinstrs.c | 1884 ++ fontforge/ttfspecial.c | 412 + fontforge/typofeatures.c | 1463 + fontforge/uiutil.c | 397 + fontforge/utils.c | 27 + fontforge/views.h | 980 + fontforge/windowmenu.c | 238 + fontforge/winfonts.c | 637 + fontforge/zapfnomen.c | 287 + install-sh | 251 + ltmain.sh | 5064 +++ 153 files changed, 358988 insertions(+) create mode 100644 AUTHORS create mode 100644 INSTALL create mode 100644 Makefile.dynamic.in create mode 100644 Makefile.in create mode 100644 Makefile.static.in create mode 100644 README create mode 100644 README-MS create mode 100644 README-MS~ create mode 100644 README-MacOSX create mode 100644 README-MacOSX~ create mode 100644 README-unix create mode 100644 README-unix~ create mode 100644 aclocal.m4 create mode 100755 config.guess create mode 100755 config.sub create mode 100755 configure create mode 100755 configure.dynamic create mode 100644 configure.dynamic.in create mode 100644 configure.in create mode 100755 configure.static create mode 100644 configure.static.in create mode 100644 descrip.mms create mode 100644 fontforge/Makefile.dynamic.in create mode 100644 fontforge/Makefile.in create mode 100644 fontforge/Makefile.static.in create mode 100644 fontforge/acorn2sfd.c create mode 100644 fontforge/alignment.c create mode 100644 fontforge/autohint.c create mode 100644 fontforge/autosave.c create mode 100644 fontforge/autotrace.c create mode 100644 fontforge/autowidth.c create mode 100644 fontforge/bitmapdlg.c create mode 100644 fontforge/bitmapview.c create mode 100644 fontforge/bvedit.c create mode 100644 fontforge/charinfo.c create mode 100644 fontforge/charview.c create mode 100644 fontforge/charviewicons.c create mode 100644 fontforge/combinations.c create mode 100644 fontforge/configure-pfaedit.h create mode 100644 fontforge/contextchain.c create mode 100644 fontforge/crctab.c create mode 100644 fontforge/cursors.c create mode 100644 fontforge/cvaddpoints.c create mode 100644 fontforge/cvdebug.c create mode 100644 fontforge/cvexport.c create mode 100644 fontforge/cvfreehand.c create mode 100644 fontforge/cvgetinfo.c create mode 100644 fontforge/cvgridfit.c create mode 100644 fontforge/cvhand.c create mode 100644 fontforge/cvhints.c create mode 100644 fontforge/cvimages.c create mode 100644 fontforge/cvknife.c create mode 100644 fontforge/cvpalettes.c create mode 100644 fontforge/cvpointer.c create mode 100644 fontforge/cvruler.c create mode 100644 fontforge/cvshapes.c create mode 100644 fontforge/cvstroke.c create mode 100644 fontforge/cvtranstools.c create mode 100644 fontforge/cvundoes.c create mode 100644 fontforge/diffstubs.c create mode 100644 fontforge/displayfonts.c create mode 100644 fontforge/dumpbdf.c create mode 100644 fontforge/dumppfa.c create mode 100644 fontforge/edgelist.h create mode 100644 fontforge/effects.c create mode 100644 fontforge/encoding.c create mode 100644 fontforge/fontforge.1 create mode 100644 fontforge/fontinfo.c create mode 100644 fontforge/fontview.c create mode 100644 fontforge/freetype.c create mode 100644 fontforge/fvcomposit.c create mode 100644 fontforge/fvfonts.c create mode 100644 fontforge/fvimportbdf.c create mode 100644 fontforge/fvmetrics.c create mode 100644 fontforge/genttfinstrs.c create mode 100644 fontforge/gotodlg.c create mode 100644 fontforge/histograms.c create mode 100644 fontforge/ikarus.c create mode 100644 fontforge/images.c create mode 100644 fontforge/kernclass.c create mode 100644 fontforge/macbinary.c create mode 100644 fontforge/macenc.c create mode 100644 fontforge/makenomenh.c create mode 100644 fontforge/metafont.c create mode 100644 fontforge/metricsview.c create mode 100644 fontforge/mm.c create mode 100644 fontforge/nomen-de.c create mode 100644 fontforge/nomen-en.c create mode 100644 fontforge/nomen-es.c create mode 100644 fontforge/nomen-fr.c create mode 100644 fontforge/nomen-it.c create mode 100644 fontforge/nomen-ja.c create mode 100644 fontforge/nomen-ru.c create mode 100644 fontforge/nonlineartrans.c create mode 100644 fontforge/openfontdlg.c create mode 100644 fontforge/othersubrs.c create mode 100644 fontforge/parsepfa.c create mode 100644 fontforge/parsettf.c create mode 100644 fontforge/parsettfatt.c create mode 100644 fontforge/parsettfbmf.c create mode 100644 fontforge/pfaedit.h create mode 100644 fontforge/pfaeditui.h create mode 100644 fontforge/prefs.c create mode 100644 fontforge/print.c create mode 100644 fontforge/problems.c create mode 100644 fontforge/psfont.h create mode 100644 fontforge/psread.c create mode 100644 fontforge/psunicodenames.c create mode 100644 fontforge/savedimage.c create mode 100644 fontforge/savefontdlg.c create mode 100644 fontforge/scripting.c create mode 100644 fontforge/sd.h create mode 100644 fontforge/search.c create mode 100644 fontforge/sfd.c create mode 100644 fontforge/sfddiff.1 create mode 100644 fontforge/sfddiff.c create mode 100644 fontforge/sftextfield.c create mode 100644 fontforge/showatt.c create mode 100644 fontforge/simplifydlg.c create mode 100644 fontforge/splashimage.c create mode 100644 fontforge/splinefill.c create mode 100644 fontforge/splinefont.h create mode 100644 fontforge/splineorder2.c create mode 100644 fontforge/splineoverlap.c create mode 100644 fontforge/splinerefigure.c create mode 100644 fontforge/splinesave.c create mode 100644 fontforge/splinesaveafm.c create mode 100644 fontforge/splinestroke.c create mode 100644 fontforge/splineutil.c create mode 100644 fontforge/splineutil2.c create mode 100644 fontforge/stamp.c create mode 100644 fontforge/stamper.c create mode 100644 fontforge/start.c create mode 100644 fontforge/statemachine.c create mode 100644 fontforge/svg.c create mode 100644 fontforge/threaddummy.c create mode 100644 fontforge/tilepath.c create mode 100644 fontforge/tottf.c create mode 100644 fontforge/tottfaat.c create mode 100644 fontforge/tottfgpos.c create mode 100644 fontforge/transform.c create mode 100644 fontforge/ttf.h create mode 100644 fontforge/ttfinstrs.c create mode 100644 fontforge/ttfspecial.c create mode 100644 fontforge/typofeatures.c create mode 100644 fontforge/uiutil.c create mode 100644 fontforge/utils.c create mode 100644 fontforge/views.h create mode 100644 fontforge/windowmenu.c create mode 100644 fontforge/winfonts.c create mode 100644 fontforge/zapfnomen.c create mode 100755 install-sh create mode 100644 ltmain.sh diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..9b6fb61e --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +George Williams diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..b42a17ac --- /dev/null +++ b/INSTALL @@ -0,0 +1,182 @@ +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 `README' 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). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' 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/Makefile.dynamic.in b/Makefile.dynamic.in new file mode 100644 index 00000000..29b9644c --- /dev/null +++ b/Makefile.dynamic.in @@ -0,0 +1,77 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +libdir = @libdir@ +mandir = @mandir@ +includedir = @includedir@ +sharedir = $(prefix)/share/fontforge + +srcdir = @srcdir@ +top_builddir = . + +LIBTOOL = @LIBTOOL@ +INSTALL = @INSTALL@ + +all: fontforge + +libs: libgunicode libgdraw + +fontforge: libgunicode libgdraw + ( cd fontforge ; $(MAKE) ) + +libgunicode: + ( cd Unicode ; $(MAKE) ) + +libgdraw: + ( cd gdraw ; $(MAKE) ) + +clean: + ( cd fontforge ; $(MAKE) clean ) + ( cd Unicode ; $(MAKE) clean ) + ( cd gdraw ; $(MAKE) clean ) + -rm -rf .libs + +distclean cleaner: + ( cd fontforge ; $(MAKE) distclean ) + ( cd Unicode ; $(MAKE) distclean ) + ( cd gdraw ; $(MAKE) distclean ) + -rm -rf .libs + -rm Makefile config.cache config.log config.status libtool + +install_libs: libs +# You may need to be root to do the install + mkdir -p $(libdir) + #-rm $(libdir)/libgdraw.so* $(libdir)/libgunicode.so.* + $(LIBTOOL) $(INSTALL) -c libgdraw.la $(libdir)/libgdraw.la + $(LIBTOOL) $(INSTALL) -c libgunicode.la $(libdir)/libgunicode.la + #cp .libs/*.so.*.* $(libdir) + $(LIBTOOL) --finish $(libdir) + +install: $(sharedir) all install_libs +# You may need to be root to do the install + mkdir -p $(bindir) + mkdir -p $(mandir)/man1 + mkdir -p $(sharedir) + $(LIBTOOL) $(INSTALL) -c fontforge/fontforge $(bindir) + $(LIBTOOL) $(INSTALL) -c fontforge/sfddiff $(bindir) + cp fontforge/pfaedit-*.ui $(sharedir) +#The next line will fail for most installs. If you have downloaded the cidmaps +# this will install them. If you haven't it won't. You only need the cidmaps +# if you are editing CID keyed files (and even then you can live without them + -cp $(srcdir)/cidmap/*.cidmap $(sharedir) >/dev/null 2>&1 + cp $(srcdir)/fontforge/fontforge.1 $(mandir)/man1 + cp $(srcdir)/fontforge/sfddiff.1 $(mandir)/man1 + +uninstall: + -rm $(bindir)/fontforge + -rm $(bindir)/sfddiff + -rm $(sharedir)/pfaedit-*.ui + -rm $(mandir)/man1/fontforge.1 + -rm $(mandir)/man1/sfddiff.1 + -rm $(libdir)/libgdraw.so* + -rm $(libdir)/libgunicode.so* + -rm $(sharedir)/*.cidmap + +$(sharedir): + mkdir -p $(sharedir) diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 00000000..29b9644c --- /dev/null +++ b/Makefile.in @@ -0,0 +1,77 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +libdir = @libdir@ +mandir = @mandir@ +includedir = @includedir@ +sharedir = $(prefix)/share/fontforge + +srcdir = @srcdir@ +top_builddir = . + +LIBTOOL = @LIBTOOL@ +INSTALL = @INSTALL@ + +all: fontforge + +libs: libgunicode libgdraw + +fontforge: libgunicode libgdraw + ( cd fontforge ; $(MAKE) ) + +libgunicode: + ( cd Unicode ; $(MAKE) ) + +libgdraw: + ( cd gdraw ; $(MAKE) ) + +clean: + ( cd fontforge ; $(MAKE) clean ) + ( cd Unicode ; $(MAKE) clean ) + ( cd gdraw ; $(MAKE) clean ) + -rm -rf .libs + +distclean cleaner: + ( cd fontforge ; $(MAKE) distclean ) + ( cd Unicode ; $(MAKE) distclean ) + ( cd gdraw ; $(MAKE) distclean ) + -rm -rf .libs + -rm Makefile config.cache config.log config.status libtool + +install_libs: libs +# You may need to be root to do the install + mkdir -p $(libdir) + #-rm $(libdir)/libgdraw.so* $(libdir)/libgunicode.so.* + $(LIBTOOL) $(INSTALL) -c libgdraw.la $(libdir)/libgdraw.la + $(LIBTOOL) $(INSTALL) -c libgunicode.la $(libdir)/libgunicode.la + #cp .libs/*.so.*.* $(libdir) + $(LIBTOOL) --finish $(libdir) + +install: $(sharedir) all install_libs +# You may need to be root to do the install + mkdir -p $(bindir) + mkdir -p $(mandir)/man1 + mkdir -p $(sharedir) + $(LIBTOOL) $(INSTALL) -c fontforge/fontforge $(bindir) + $(LIBTOOL) $(INSTALL) -c fontforge/sfddiff $(bindir) + cp fontforge/pfaedit-*.ui $(sharedir) +#The next line will fail for most installs. If you have downloaded the cidmaps +# this will install them. If you haven't it won't. You only need the cidmaps +# if you are editing CID keyed files (and even then you can live without them + -cp $(srcdir)/cidmap/*.cidmap $(sharedir) >/dev/null 2>&1 + cp $(srcdir)/fontforge/fontforge.1 $(mandir)/man1 + cp $(srcdir)/fontforge/sfddiff.1 $(mandir)/man1 + +uninstall: + -rm $(bindir)/fontforge + -rm $(bindir)/sfddiff + -rm $(sharedir)/pfaedit-*.ui + -rm $(mandir)/man1/fontforge.1 + -rm $(mandir)/man1/sfddiff.1 + -rm $(libdir)/libgdraw.so* + -rm $(libdir)/libgunicode.so* + -rm $(sharedir)/*.cidmap + +$(sharedir): + mkdir -p $(sharedir) diff --git a/Makefile.static.in b/Makefile.static.in new file mode 100644 index 00000000..f3052cc7 --- /dev/null +++ b/Makefile.static.in @@ -0,0 +1,65 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +libdir = @libdir@ +mandir = @mandir@ +includedir = @includedir@ +sharedir = $(prefix)/share/fontforge + +srcdir = @srcdir@ +top_builddir = . + +INSTALL = @INSTALL@ + +all: fontforge + +libs: libgunicode libgdraw + +fontforge: libgunicode libgdraw + ( cd fontforge ; $(MAKE) ) + +libgunicode: + ( cd Unicode ; $(MAKE) ) + +libgdraw: + ( cd gdraw ; $(MAKE) ) + +clean: + ( cd fontforge ; $(MAKE) clean ) + ( cd Unicode ; $(MAKE) clean ) + ( cd gdraw ; $(MAKE) clean ) + +distclean cleaner: + ( cd fontforge ; $(MAKE) distclean ) + ( cd Unicode ; $(MAKE) distclean ) + ( cd gdraw ; $(MAKE) distclean ) + -rm Makefile config.cache config.log config.status libtool + +install_libs: libs + +install: $(sharedir) all install_libs +# You may need to be root to do the install + mkdir -p $(bindir) + mkdir -p $(mandir)/man1 + mkdir -p $(sharedir) + cp fontforge/fontforge $(bindir) + cp fontforge/sfddiff $(bindir) + cp fontforge/pfaedit-*.ui $(sharedir) +#The next line will fail for most installs. If you have downloaded the cidmaps +# this will install them. If you haven't it won't. You only need the cidmaps +# if you are editing CID keyed files (and even then you can live without them + -cp $(srcdir)/cidmap/*.cidmap $(sharedir) >/dev/null 2>&1 + cp $(srcdir)/fontforge/fontforge.1 $(mandir)/man1 + cp $(srcdir)/fontforge/sfddiff.1 $(mandir)/man1 + +uninstall: + -rm $(bindir)/fontforge + -rm $(bindir)/sfddiff + -rm $(sharedir)/pfaedit-*.ui + -rm $(mandir)/man1/fontforge.1 + -rm $(mandir)/man1/sfddiff.1 + -rm $(sharedir)/*.cidmap + +$(sharedir): + mkdir -p $(sharedir) diff --git a/README b/README new file mode 100644 index 00000000..d5d68524 --- /dev/null +++ b/README @@ -0,0 +1,159 @@ +CAVEAT + FontForge used to be called PfaEdit. Early releases may be found at + http://pfaedit.sf.net/ + +INSTALLATION NOTES: + This distribution may be in two formats, either it contains dynamic libraries + or it does not. + +INSTALLATION WITH DYNAMIC LIBRARIES + contains two executables: + fontforge -- a font editor + sfddiff -- a program for comparing fonts + man pages for the above + fontforge.1 + sfddiff.1 + two libraries + libgdraw.so + libgunicode.so + and some user interface files + fontforge.{en,fr,de,ru,ja}.ui + and a shell script + doinstall + which should put everything into a reasonable place (you probably need to be + root to run it). + + If you want to edit CID-keyed fonts (for CJK fonts) you may want to pull down + the cidmap package from http://fontforge.sf.net/cidmaps.tgz and move the + contents to /usr/share/fontforge also. + +INSTALLATION WITHOUT DYNAMIC LIBRARIES + Otherwise the package will contain: + A README file or two + fontforge -- the executable + fontforge.1 -- the man page. + pfaedit-*.ui -- various user interface string files for different + languages + You should: + $ su + # mkdir -p /usr/local/bin /usr/local/man/man1 /usr/local/share/fontforge + # mv fontforge /usr/local/bin + # mv *.1 /usr/local/man/man1 + # mv *.ui /usr/local/share/fontforge + + You may need to add /usr/local/bin to your PATH environment variable (and + /usr/local/man to your MANPATH environment variable). If you use bash edit + ~/.bashrc and add + PATH=${PATH}:/usr/local/bin + MANPATH=${MANPATH:-}:/usr/local/man ; export MANPATH + Or if you use csh, tcsh, etc. edit your ~/.cshrc and add: + setenv PATH ${PATH}:/usr/local/bin + if ( $?MANPATH == "0" ) then + setenv MANPATH /usr/local/man + else + setenv MANPATH ${MANPATH}:/usr/local/man + endif + +BUILDING + Just download the file fontforge_full-*.tgz which you will find on + http://fontforge.sourceforge.net/index.html#source + Move it somewhere appropriate (/usr/local/src perhaps?) and type: + $ gunzip fontforge_full-*.tgz ; tar xf fontforge_full-*.tar + $ cd fontforge + $ configure + $ make + $ su + # make install + On those machines where I can't figure out how to build dynamic + libraries you should substitute "configure.static" for configure. + +If you want access to FontForge's type3 editing capabilities then + $ configure --with-multilayer + +More complex installations + "make install" will also install a few other things which are not part of + the standard package, but which are useful for some people. + CIDMAPS: + If you are going to be editing CID keyed fonts you should also down- + load my cidmap files from + http://fontforge.sourceforge.net/cidmaps.tgz + put that file in the same place as you put fontforge_full*.tgz, then + $ mkdir -p fontforge/cidmaps + $ mv cidmaps.tgz fontforge/cidmaps + $ cd fontforge/cidmaps + $ gunzip *.tgz ; tar xf *.tar + $ cd ../.. + And then proceed to do the normal install. + DOCUMENTATION: + You can choose to install FontForge's documentation on your system, then + pressing the [Help] or [F1] key within FontForge will go to the local + docs rather than those on the web. + Download the doc bundle from + http://fontforge.sourceforge.net/index.html#docs + Then (assuming you have not changed the install prefix) + # mkdir -p /usr/local/share/doc/fontforge + # mv fontforge_htdocs-*.tgz /usr/local/share/doc/fontforge + # cd /usr/local/share/doc/fontforge + # gunzip *.tgz; tar xf *.tar + +BUILDING for OpenVMS + Jouk Jansen has provided me with OpenVMS makefile scripts. There should + be mms files in all the appropriate directories. + +BUILDING without X11 + FontForge can be built without X11. You will probably only want to do this + if your system lacks X (in which case configure should figure that out and + do it automagically). But if, for some strange reason you wish to build a + non-X version on a machine with X type: + $ configure --without-x + +BITMAP FONTS + The program sort of assumes you've got some unicode fonts lying around. + The program will choose fonts as best it can depending on what you have + installed on your machine. + Sources of unicode fonts: + http://czyborra.com/unifont/ + http://clr.nmsu.edu/~mleisher/cu.html + http://savannah.nongnu.org/projects/freefont + http://bibliofile.mc.duke.edu/gww/fonts/{Monospace,Caliban} + +DEPENDENCIES + FontForge has more functionality if libpng and libungif are installed on your + system. If they are not then you can find them at: + http://www.libpng.org/pub/png/libpng.html + http://www.gzip.org/zlib/ + ttp://prtr-13.ucsc.edu/~badger/software/libungif/index.shtml + + FontForge also makes use of libuninameslist to be found at: + http://libuninameslist.sf.net/ + + FontForge's truetype debugger is completely dependent on: + http://freetype.sf.net/ + The default configuration is useful to FontForge, but more functionality + is obtained if you enable the bytecode interpreter (but note: you must + have a license from Apple to do this). Instructions for doing so are + in the file README.UNX in the freetype distribution. + *** FontForge also needs to have the freetype sources available to it *** + *** when it builds (it needs some internal include files). The configure *** + *** script can usually figure this out, but it is very time-consuming *** + *** you might want to say $ ./configure --with-freetype-src= *** + *** where is the top-level freetype source directory *** + + Finally, if you want to do autotracing you should install + http://sourceforge.net/projects/autotrace/ + +RUNNING +$ fontforge -new + Creates a new font +$ fontforge -nosplash + (No splash screen in case you have a very slow X connection) +$ fontforge font.pfa font2.pfb font3.ttf font4.otf font4.sfd font5.svg + Opens those fonts (sfd files are fontforge's own spline font database files) +$ fontforge + Brings up a file picker dlg. + +DOCUMENTATION + http://fontforge.sourceforge.net/overview.html + +Please report any bugs to + fontforge-devel@lists.sourceforge.net diff --git a/README-MS b/README-MS new file mode 100644 index 00000000..5cc1ba05 --- /dev/null +++ b/README-MS @@ -0,0 +1,138 @@ +CAVEAT + FontForge used to be called FontForge. Early releases may be found at + http://fontforge.sf.net/ + +BEFORE INSTALLATION + To run fontforge under MS Windows you must first download the cygwin environment + and probably the X windows package (of cygwin) as well. + Look at + http://www.cygwin.com/ + and download the setup.exe program from there. + run setup.exe + it will ask you what components of cygwin you wish to install + You will definitely need the base components, and you almost certainly want + the X windowing system too. + + It is possible to use fontforge without X, but in this case there is no user + interface and you are limited to running scripts. + +INSTALLATION NOTES: + Download the appropriate binary from + http://fontforge.sourceforge.net/index.html#binary + If it is a .tgz file then it should contain + A README file or two + fontforge.exe -- the executable + fontforge.1 -- the man page. + fontforge-*.ui -- various user interface string files for different + languages + You should: + $ gunzip fontforge_cygwin-*.tgz; tar xf fontforge_cygwin-*.tar + $ mkdir -p /usr/local/bin /usr/local/man/man1 /usr/local/share/fontforge + $ mv fontforge /usr/local/bin + $ mv fontforge.1 /usr/local/man/man1 + $ mv *.ui /usr/local/share/fontforge + + You may need to add /usr/local/bin to your PATH environment variable (and + /usr/local/man to your MANPATH environment variable) + If your shell is bash then edit your ~/.bashrc and add + PATH=${PATH}:/usr/local/bin + MANPATH=${MANPATH:-}:/usr/local/man ; export MANPATH + +RUNNING + Before running FontForge you must start X. Just start a cygwin shell and type + $ xinit + in it. This will bring up a big window that convers the screen (this is X's + root window) and a smaller window inside it (this is called an xterm). + Move the mouse into that window and type + $ twm + After this you can start fontforge... + +$ fontforge -new + Creates a new font +$ fontforge -nosplash + (No splash screen in case you have a very slow X connection) +$ fontforge font.pfa font2.pfb font3.ttf font4.otf font4.sfd + Opens those fonts (sfd files are fontforge's own spline font database files) +$ fontforge + Brings up a file picker dlg. +$ fontforge -script script-file [script arguments] + Starts fontforge up without bringing up any windows. It will run the script-file + (passing it any other arguments given on the command line) and then exit. + +BUILDING + Just download the file fontforge_full-*.tgz which you will find on + http://fontforge.sourceforge.net/index.html#source + Move it somewhere appropriate (/usr/local/src perhaps?) and type: + $ gunzip fontforge_full-*.tgz ; tar xf fontforge_full-*.tar + $ cd fontforge + $ configure + $ make + $ su + # make install + +If you want access to FontForge's type3 editing capabilities then + $ configure --with-multilayer + +More complex installations + "make install" will also install a few other things which are not part of + the standard package, but which are useful for some people. + CIDMAPS: + If you are going to be editing CID keyed fonts you should also down- + load my cidmap files from + http://fontforge.sourceforge.net/cidmaps.tgz + put that file in the same place as you put fontforge_full*.tgz, then + $ mkdir -p fontforge/cidmaps + $ mv cidmaps.tgz fontforge/cidmaps + $ cd fontforge/cidmaps + $ gunzip *.tgz ; tar xf *.tar + $ cd ../.. + And then proceed to do the normal install. + DOCUMENTATION: + You can choose to install FontForge's documentation on your system, then + pressing the [Help] or [F1] key within FontForge will go to the local + docs rather than those on the web. + Download the doc bundle from + http://fontforge.sourceforge.net/index.html#docs + Then (assuming you have not changed the install prefix) + # mkdir -p /usr/local/share/doc/fontforge + # mv fontforge_htdocs-*.tgz /usr/local/share/doc/fontforge + # cd /usr/local/share/doc/fontforge + # gunzip *.tgz; tar xf *.tar + +DEPENDENCIES + FontForge has more functionality if libpng and libungif are installed on your + system. If they are not then you can find them at: + http://www.libpng.org/pub/png/libpng.html + http://www.gzip.org/zlib/ + ttp://prtr-13.ucsc.edu/~badger/software/libungif/index.shtml + + FontForge also makes use of libuninameslist to be found at: + http://libuninameslist.sf.net/ + + FontForge's truetype debugger is completely dependent on: + http://freetype.sf.net/ + The default configuration is useful to FontForge, but more functionality + is obtained if you enable the bytecode interpreter (but note: you must + have a license from Apple to do this). Instructions for doing so are + in the file README.UNX in the freetype distribution. + *** FontForge also needs to have the freetype sources available to it *** + *** when it builds (it needs some internal include files). The configure *** + *** script can usually figure this out, but it is very time-consuming *** + *** you might want to say $ ./configure --with-freetype-src= *** + *** where is the top-level freetype source directory *** + + Finally, if you want to do autotracing you should install + http://sourceforge.net/projects/autotrace/ + +BUILDING without X11 + FontForge can be built without X11. You will probably only want to do this + if your system lacks X (in which case configure should figure that out and + do it automagically). But if, for some strange reason you wish to build a + non-X version on a machine with X type: + $ configure --without-x + +Please report any bugs to + fontforge-devel@lists.sourceforge.net + +Documentation is at: + http://fontforge.sourceforge.net/index.html diff --git a/README-MS~ b/README-MS~ new file mode 100644 index 00000000..dfdc8f4f --- /dev/null +++ b/README-MS~ @@ -0,0 +1,138 @@ +CAVEAT + PfaEdit is changing its name to FontForge. Future releases will be found + at http://fontforge.sf.net/ + +BEFORE INSTALLATION + To run pfaedit under MS Windows you must first download the cygwin environment + and probably the X windows package (of cygwin) as well. + Look at + http://www.cygwin.com/ + and download the setup.exe program from there. + run setup.exe + it will ask you what components of cygwin you wish to install + You will definitely need the base components, and you almost certainly want + the X windowing system too. + + It is possible to use pfaedit without X, but in this case there is no user + interface and you are limited to running scripts. + +INSTALLATION NOTES: + Download the appropriate binary from + http://pfaedit.sourceforge.net/index.html#binary + If it is a .tgz file then it should contain + A README file or two + pfaedit.exe -- the executable + pfaedit.1 -- the man page. + pfaedit-*.ui -- various user interface string files for different + languages + You should: + $ gunzip pfaedit_cygwin-*.tgz; tar xf pfaedit_cygwin-*.tar + $ mkdir -p /usr/local/bin /usr/local/man/man1 /usr/local/share/pfaedit + $ mv pfaedit /usr/local/bin + $ mv pfaedit.1 /usr/local/man/man1 + $ mv *.ui /usr/local/share/pfaedit + + You may need to add /usr/local/bin to your PATH environment variable (and + /usr/local/man to your MANPATH environment variable) + If your shell is bash then edit your ~/.bashrc and add + PATH=${PATH}:/usr/local/bin + MANPATH=${MANPATH:-}:/usr/local/man ; export MANPATH + +RUNNING + Before running PfaEdit you must start X. Just start a cygwin shell and type + $ xinit + in it. This will bring up a big window that convers the screen (this is X's + root window) and a smaller window inside it (this is called an xterm). + Move the mouse into that window and type + $ twm + After this you can start pfaedit... + +$ pfaedit -new + Creates a new font +$ pfaedit -nosplash + (No splash screen in case you have a very slow X connection) +$ pfaedit font.pfa font2.pfb font3.ttf font4.otf font4.sfd + Opens those fonts (sfd files are pfaedit's own spline font database files) +$ pfaedit + Brings up a file picker dlg. +$ pfaedit -script script-file [script arguments] + Starts pfaedit up without bringing up any windows. It will run the script-file + (passing it any other arguments given on the command line) and then exit. + +BUILDING + Just download the file pfaedit_full-*.tgz which you will find on + http://pfaedit.sourceforge.net/index.html#source + Move it somewhere appropriate (/usr/local/src perhaps?) and type: + $ gunzip pfaedit_full-*.tgz ; tar xf pfaedit_full-*.tar + $ cd pfaedit + $ configure + $ make + $ su + # make install + +If you want access to PfaEdit's type3 editing capabilities then + $ configure --with-multilayer + +More complex installations + "make install" will also install a few other things which are not part of + the standard package, but which are useful for some people. + CIDMAPS: + If you are going to be editing CID keyed fonts you should also down- + load my cidmap files from + http://pfaedit.sourceforge.net/cidmaps.tgz + put that file in the same place as you put pfaedit_full*.tgz, then + $ mkdir -p pfaedit/cidmaps + $ mv cidmaps.tgz pfaedit/cidmaps + $ cd pfaedit/cidmaps + $ gunzip *.tgz ; tar xf *.tar + $ cd ../.. + And then proceed to do the normal install. + DOCUMENTATION: + You can choose to install PfaEdit's documentation on your system, then + pressing the [Help] or [F1] key within PfaEdit will go to the local + docs rather than those on the web. + Download the doc bundle from + http://pfaedit.sourceforge.net/index.html#docs + Then (assuming you have not changed the install prefix) + # mkdir -p /usr/local/share/doc/pfaedit + # mv pfaedit_htdocs-*.tgz /usr/local/share/doc/pfaedit + # cd /usr/local/share/doc/pfaedit + # gunzip *.tgz; tar xf *.tar + +DEPENDENCIES + PfaEdit has more functionality if libpng and libungif are installed on your + system. If they are not then you can find them at: + http://www.libpng.org/pub/png/libpng.html + http://www.gzip.org/zlib/ + ttp://prtr-13.ucsc.edu/~badger/software/libungif/index.shtml + + PfaEdit also makes use of libuninameslist to be found at: + http://libuninameslist.sf.net/ + + PfaEdit's truetype debugger is completely dependent on: + http://freetype.sf.net/ + The default configuration is useful to PfaEdit, but more functionality + is obtained if you enable the bytecode interpreter (but note: you must + have a license from Apple to do this). Instructions for doing so are + in the file README.UNX in the freetype distribution. + *** PfaEdit also needs to have the freetype sources available to it *** + *** when it builds (it needs some internal include files). The configure *** + *** script can usually figure this out, but it is very time-consuming *** + *** you might want to say $ ./configure --with-freetype-src= *** + *** where is the top-level freetype source directory *** + + Finally, if you want to do autotracing you should install + http://sourceforge.net/projects/autotrace/ + +BUILDING without X11 + PfaEdit can be built without X11. You will probably only want to do this + if your system lacks X (in which case configure should figure that out and + do it automagically). But if, for some strange reason you wish to build a + non-X version on a machine with X type: + $ configure --without-x + +Please report any bugs to + pfaedit-devel@lists.sourceforge.net + +Documentation is at: + http://pfaedit.sourceforge.net/index.html diff --git a/README-MacOSX b/README-MacOSX new file mode 100644 index 00000000..5f9c8e71 --- /dev/null +++ b/README-MacOSX @@ -0,0 +1,168 @@ +CAVEAT + FontForge used to be called FontForge. Early releases may be found at + http://fontforge.sf.net/ + +BEFORE INSTALLATION + Before you install fontforge under Mac OS/X you should first install the X + window system. This is available at: + http://www.osxgnu.org/ + or + http://www.apple.com/macosx/x11/download/ + + It is possible to use fontforge without X, but in this case there is no user + interface and you are limited to running scripts. (see below for details) + +INSTALLATION NOTES: + Download the appropriate binary from + http://fontforge.sourceforge.net/MacOSX.html#binary + There should be a mac package there which will do the installation for you. + You may need to add /usr/local/bin to your PATH environment variable (and + /usr/local/share/man to your MANPATH environment variable). + If your shell is tcsh (or csh), edit ~/.cshrc and add: + setenv PATH ${PATH}:/usr/local/bin + if ( "$MANPATH" == "" ) then + setenv MANPATH /usr/local/man + else + setenv MANPATH ${MANPATH}:/usr/local/share/man + endif + If your shell is bash then edit your ~/.bashrc and add + PATH=${PATH}:/usr/local/bin + MANPATH=${MANPATH:-}:/usr/local/share/man ; export MANPATH + At least one person also needed to define DYLD_LIBRARY_PATH to contain + /usr/local/lib + +BUILDING + Just download the file fontforge_full-*.tgz which you will find on + http://fontforge.sourceforge.net/index.html#source + Move it somewhere appropriate (/usr/local/src perhaps?) and type: + $ gunzip fontforge_full-*.tgz ; tar xf fontforge_full-*.tar + $ cd fontforge + $ configure + $ make + $ sudo -s + # make install + +If you want access to FontForge's type3 editing capabilities then + $ configure --with-multilayer + +More complex installations + "make install" will also install a few other things which are not part of + the standard package, but which are useful for some people. + CIDMAPS: + If you are going to be editing CID keyed fonts you should also down- + load my cidmap files from + http://fontforge.sourceforge.net/cidmaps.tgz + put that file in the same place as you put fontforge_full*.tgz, then + $ mkdir -p fontforge/cidmaps + $ mv cidmaps.tgz fontforge/cidmaps + $ cd fontforge/cidmaps + $ gunzip *.tgz ; tar xf *.tar + $ cd ../.. + And then proceed to do the normal install. + Or install them manually: + # mkdir -p /usr/local/share/fontforge + # mv fontforge/cidmaps/* /usr/local/share/fontforge + DOCUMENTATION: + You can choose to install FontForge's documentation on your system, then + pressing the [Help] or [F1] key within FontForge will go to the local + docs rather than those on the web. + Download the doc bundle from + http://fontforge.sourceforge.net/index.html#docs + Then (assuming you have not changed the install prefix) + # mkdir -p /usr/local/share/doc/fontforge + # mv fontforge_htdocs-*.tgz /usr/local/share/doc/fontforge + # cd /usr/local/share/doc/fontforge + # gunzip *.tgz; tar xf *.tar + +DEPENDENCIES + FontForge has more functionality if libpng and libungif are installed on your + system. If they are not then you can find them at: + http://www.libpng.org/pub/png/libpng.html + http://www.gzip.org/zlib/ + ttp://prtr-13.ucsc.edu/~badger/software/libungif/index.shtml + + FontForge also makes use of libuninameslist to be found at: + http://libuninameslist.sf.net/ + + FontForge's truetype debugger is completely dependent on: + http://freetype.sf.net/ + The default configuration is useful to FontForge, but more functionality + is obtained if you enable the bytecode interpreter (but note: you must + have a license from Apple to do this). Instructions for doing so are + in the file README.UNX in the freetype distribution. + *** FontForge also needs to have the freetype sources available to it *** + *** when it builds (it needs some internal include files). The configure *** + *** script can usually figure this out, but it is very time-consuming *** + *** you might want to say $ ./configure --with-freetype-src= *** + *** where is the top-level freetype source directory *** + + Finally, if you want to do autotracing you should install + http://sourceforge.net/projects/autotrace/ + +BUILDING without X11 + FontForge can be built without X11. You will probably only want to do this + if your system lacks X (in which case configure should figure that out and + do it automagically). But if, for some strange reason you wish to build a + non-X version on a machine with X type: + $ configure --without-x + during the build process instead of "$ configure" + +RUNNING + Before running FontForge you must start XDarwin. It lives in the Applications + folder, and you start it by double clicking on it. + You can start fontforge either from one of the xterms it creates, or from a + Terminal window. If you start from a Terminal window you must first type: +$ setenv DISPLAY :0 + +$ fontforge -new + Creates a new font +$ fontforge -nosplash + (No splash screen in case you have a very slow X connection) +$ fontforge font.pfa font2.pfb font3.ttf font4.otf font4.sfd + Opens those fonts (sfd files are fontforge's own spline font database files) +$ fontforge + Brings up a file picker dlg. +$ fontforge -script script-file [script arguments] + Starts fontforge up without bringing up any windows. It will run the script-file + (passing it any other arguments given on the command line) and then exit. + +Either the Command (Apple, Cloverleaf) key or the Control key may be used for +invoking menu items (that is both ^Q and Cmd-Q will cause FontForge to quit). + +CAVEATS + 1) FontForge does not conform to Apple's Human Interface Guidelines, and never + will. + 2) The default window manager (twm) does not work well when + run in Rootless mode. + FontForge allows the window manager to position its windows for it, and + twm does this by allowing the user to click anywhere on the screen to + mark the upper left corner of the window. Unfortunately if you click on + top of an Aqua window (ie. anything that isn't X window) Aqua will put + X into the background and the click will be lost to X. + + So in rootless mode you can only open a window if you position it so + that it's upper left corner is in one of X's already existing windows. + +Please report any bugs to + fontforge-devel@lists.sourceforge.net + +DOCUMENTATION + http://fontforge.sourceforge.net/overview.html + +FONTS UNDER Mac OS/X + Macintosh fonts live in /Library/Fonts, /System/Library/Fonts or + ~/Library/Fonts. On Mac OS/X FontForge can edit .dfont and resource fork + fonts. On other systems FontForge can only edit Mac .dfonts (the concept + of a resource fork is Mac specific). + + (X11 fonts on the mac are completely seperate from the mac fonts. + they reside somewhere in the X tree). + +FONTS UNDER Mac OS/9 + Note Bene: As far as I know FontForge has not been ported to Mac OS/9 (or 8 or 7) + + Fonts live in :System Folder:Fonts: They are stored in resource forks, which + means that if you want to work with them you must first wrap them up with + either macbinary or binhex (Fetch may be used to do either conversion as you + transfer the font to a different system to edit it). + diff --git a/README-MacOSX~ b/README-MacOSX~ new file mode 100644 index 00000000..b2b6906d --- /dev/null +++ b/README-MacOSX~ @@ -0,0 +1,168 @@ +CAVEAT + PfaEdit is changing its name to FontForge. Future releases will be found + at http://fontforge.sf.net/ + +BEFORE INSTALLATION + Before you install pfaedit under Mac OS/X you should first install the X + window system. This is available at: + http://www.osxgnu.org/ + or + http://www.apple.com/macosx/x11/download/ + + It is possible to use pfaedit without X, but in this case there is no user + interface and you are limited to running scripts. (see below for details) + +INSTALLATION NOTES: + Download the appropriate binary from + http://pfaedit.sourceforge.net/MacOSX.html#binary + There should be a mac package there which will do the installation for you. + You may need to add /usr/local/bin to your PATH environment variable (and + /usr/local/share/man to your MANPATH environment variable). + If your shell is tcsh (or csh), edit ~/.cshrc and add: + setenv PATH ${PATH}:/usr/local/bin + if ( "$MANPATH" == "" ) then + setenv MANPATH /usr/local/man + else + setenv MANPATH ${MANPATH}:/usr/local/share/man + endif + If your shell is bash then edit your ~/.bashrc and add + PATH=${PATH}:/usr/local/bin + MANPATH=${MANPATH:-}:/usr/local/share/man ; export MANPATH + At least one person also needed to define DYLD_LIBRARY_PATH to contain + /usr/local/lib + +BUILDING + Just download the file pfaedit_full-*.tgz which you will find on + http://pfaedit.sourceforge.net/index.html#source + Move it somewhere appropriate (/usr/local/src perhaps?) and type: + $ gunzip pfaedit_full-*.tgz ; tar xf pfaedit_full-*.tar + $ cd pfaedit + $ configure + $ make + $ sudo -s + # make install + +If you want access to PfaEdit's type3 editing capabilities then + $ configure --with-multilayer + +More complex installations + "make install" will also install a few other things which are not part of + the standard package, but which are useful for some people. + CIDMAPS: + If you are going to be editing CID keyed fonts you should also down- + load my cidmap files from + http://pfaedit.sourceforge.net/cidmaps.tgz + put that file in the same place as you put pfaedit_full*.tgz, then + $ mkdir -p pfaedit/cidmaps + $ mv cidmaps.tgz pfaedit/cidmaps + $ cd pfaedit/cidmaps + $ gunzip *.tgz ; tar xf *.tar + $ cd ../.. + And then proceed to do the normal install. + Or install them manually: + # mkdir -p /usr/local/share/pfaedit + # mv pfaedit/cidmaps/* /usr/local/share/pfaedit + DOCUMENTATION: + You can choose to install PfaEdit's documentation on your system, then + pressing the [Help] or [F1] key within PfaEdit will go to the local + docs rather than those on the web. + Download the doc bundle from + http://pfaedit.sourceforge.net/index.html#docs + Then (assuming you have not changed the install prefix) + # mkdir -p /usr/local/share/doc/pfaedit + # mv pfaedit_htdocs-*.tgz /usr/local/share/doc/pfaedit + # cd /usr/local/share/doc/pfaedit + # gunzip *.tgz; tar xf *.tar + +DEPENDENCIES + PfaEdit has more functionality if libpng and libungif are installed on your + system. If they are not then you can find them at: + http://www.libpng.org/pub/png/libpng.html + http://www.gzip.org/zlib/ + ttp://prtr-13.ucsc.edu/~badger/software/libungif/index.shtml + + PfaEdit also makes use of libuninameslist to be found at: + http://libuninameslist.sf.net/ + + PfaEdit's truetype debugger is completely dependent on: + http://freetype.sf.net/ + The default configuration is useful to PfaEdit, but more functionality + is obtained if you enable the bytecode interpreter (but note: you must + have a license from Apple to do this). Instructions for doing so are + in the file README.UNX in the freetype distribution. + *** PfaEdit also needs to have the freetype sources available to it *** + *** when it builds (it needs some internal include files). The configure *** + *** script can usually figure this out, but it is very time-consuming *** + *** you might want to say $ ./configure --with-freetype-src= *** + *** where is the top-level freetype source directory *** + + Finally, if you want to do autotracing you should install + http://sourceforge.net/projects/autotrace/ + +BUILDING without X11 + PfaEdit can be built without X11. You will probably only want to do this + if your system lacks X (in which case configure should figure that out and + do it automagically). But if, for some strange reason you wish to build a + non-X version on a machine with X type: + $ configure --without-x + during the build process instead of "$ configure" + +RUNNING + Before running PfaEdit you must start XDarwin. It lives in the Applications + folder, and you start it by double clicking on it. + You can start pfaedit either from one of the xterms it creates, or from a + Terminal window. If you start from a Terminal window you must first type: +$ setenv DISPLAY :0 + +$ pfaedit -new + Creates a new font +$ pfaedit -nosplash + (No splash screen in case you have a very slow X connection) +$ pfaedit font.pfa font2.pfb font3.ttf font4.otf font4.sfd + Opens those fonts (sfd files are pfaedit's own spline font database files) +$ pfaedit + Brings up a file picker dlg. +$ pfaedit -script script-file [script arguments] + Starts pfaedit up without bringing up any windows. It will run the script-file + (passing it any other arguments given on the command line) and then exit. + +Either the Command (Apple, Cloverleaf) key or the Control key may be used for +invoking menu items (that is both ^Q and Cmd-Q will cause PfaEdit to quit). + +CAVEATS + 1) PfaEdit does not conform to Apple's Human Interface Guidelines, and never + will. + 2) The default window manager (twm) does not work well when + run in Rootless mode. + PfaEdit allows the window manager to position its windows for it, and + twm does this by allowing the user to click anywhere on the screen to + mark the upper left corner of the window. Unfortunately if you click on + top of an Aqua window (ie. anything that isn't X window) Aqua will put + X into the background and the click will be lost to X. + + So in rootless mode you can only open a window if you position it so + that it's upper left corner is in one of X's already existing windows. + +Please report any bugs to + pfaedit-devel@lists.sourceforge.net + +DOCUMENTATION + http://pfaedit.sourceforge.net/overview.html + +FONTS UNDER Mac OS/X + Macintosh fonts live in /Library/Fonts, /System/Library/Fonts or + ~/Library/Fonts. On Mac OS/X PfaEdit can edit .dfont and resource fork + fonts. On other systems PfaEdit can only edit Mac .dfonts (the concept + of a resource fork is Mac specific). + + (X11 fonts on the mac are completely seperate from the mac fonts. + they reside somewhere in the X tree). + +FONTS UNDER Mac OS/9 + Note Bene: As far as I know PfaEdit has not been ported to Mac OS/9 (or 8 or 7) + + Fonts live in :System Folder:Fonts: They are stored in resource forks, which + means that if you want to work with them you must first wrap them up with + either macbinary or binhex (Fetch may be used to do either conversion as you + transfer the font to a different system to edit it). + diff --git a/README-unix b/README-unix new file mode 100644 index 00000000..d5d68524 --- /dev/null +++ b/README-unix @@ -0,0 +1,159 @@ +CAVEAT + FontForge used to be called PfaEdit. Early releases may be found at + http://pfaedit.sf.net/ + +INSTALLATION NOTES: + This distribution may be in two formats, either it contains dynamic libraries + or it does not. + +INSTALLATION WITH DYNAMIC LIBRARIES + contains two executables: + fontforge -- a font editor + sfddiff -- a program for comparing fonts + man pages for the above + fontforge.1 + sfddiff.1 + two libraries + libgdraw.so + libgunicode.so + and some user interface files + fontforge.{en,fr,de,ru,ja}.ui + and a shell script + doinstall + which should put everything into a reasonable place (you probably need to be + root to run it). + + If you want to edit CID-keyed fonts (for CJK fonts) you may want to pull down + the cidmap package from http://fontforge.sf.net/cidmaps.tgz and move the + contents to /usr/share/fontforge also. + +INSTALLATION WITHOUT DYNAMIC LIBRARIES + Otherwise the package will contain: + A README file or two + fontforge -- the executable + fontforge.1 -- the man page. + pfaedit-*.ui -- various user interface string files for different + languages + You should: + $ su + # mkdir -p /usr/local/bin /usr/local/man/man1 /usr/local/share/fontforge + # mv fontforge /usr/local/bin + # mv *.1 /usr/local/man/man1 + # mv *.ui /usr/local/share/fontforge + + You may need to add /usr/local/bin to your PATH environment variable (and + /usr/local/man to your MANPATH environment variable). If you use bash edit + ~/.bashrc and add + PATH=${PATH}:/usr/local/bin + MANPATH=${MANPATH:-}:/usr/local/man ; export MANPATH + Or if you use csh, tcsh, etc. edit your ~/.cshrc and add: + setenv PATH ${PATH}:/usr/local/bin + if ( $?MANPATH == "0" ) then + setenv MANPATH /usr/local/man + else + setenv MANPATH ${MANPATH}:/usr/local/man + endif + +BUILDING + Just download the file fontforge_full-*.tgz which you will find on + http://fontforge.sourceforge.net/index.html#source + Move it somewhere appropriate (/usr/local/src perhaps?) and type: + $ gunzip fontforge_full-*.tgz ; tar xf fontforge_full-*.tar + $ cd fontforge + $ configure + $ make + $ su + # make install + On those machines where I can't figure out how to build dynamic + libraries you should substitute "configure.static" for configure. + +If you want access to FontForge's type3 editing capabilities then + $ configure --with-multilayer + +More complex installations + "make install" will also install a few other things which are not part of + the standard package, but which are useful for some people. + CIDMAPS: + If you are going to be editing CID keyed fonts you should also down- + load my cidmap files from + http://fontforge.sourceforge.net/cidmaps.tgz + put that file in the same place as you put fontforge_full*.tgz, then + $ mkdir -p fontforge/cidmaps + $ mv cidmaps.tgz fontforge/cidmaps + $ cd fontforge/cidmaps + $ gunzip *.tgz ; tar xf *.tar + $ cd ../.. + And then proceed to do the normal install. + DOCUMENTATION: + You can choose to install FontForge's documentation on your system, then + pressing the [Help] or [F1] key within FontForge will go to the local + docs rather than those on the web. + Download the doc bundle from + http://fontforge.sourceforge.net/index.html#docs + Then (assuming you have not changed the install prefix) + # mkdir -p /usr/local/share/doc/fontforge + # mv fontforge_htdocs-*.tgz /usr/local/share/doc/fontforge + # cd /usr/local/share/doc/fontforge + # gunzip *.tgz; tar xf *.tar + +BUILDING for OpenVMS + Jouk Jansen has provided me with OpenVMS makefile scripts. There should + be mms files in all the appropriate directories. + +BUILDING without X11 + FontForge can be built without X11. You will probably only want to do this + if your system lacks X (in which case configure should figure that out and + do it automagically). But if, for some strange reason you wish to build a + non-X version on a machine with X type: + $ configure --without-x + +BITMAP FONTS + The program sort of assumes you've got some unicode fonts lying around. + The program will choose fonts as best it can depending on what you have + installed on your machine. + Sources of unicode fonts: + http://czyborra.com/unifont/ + http://clr.nmsu.edu/~mleisher/cu.html + http://savannah.nongnu.org/projects/freefont + http://bibliofile.mc.duke.edu/gww/fonts/{Monospace,Caliban} + +DEPENDENCIES + FontForge has more functionality if libpng and libungif are installed on your + system. If they are not then you can find them at: + http://www.libpng.org/pub/png/libpng.html + http://www.gzip.org/zlib/ + ttp://prtr-13.ucsc.edu/~badger/software/libungif/index.shtml + + FontForge also makes use of libuninameslist to be found at: + http://libuninameslist.sf.net/ + + FontForge's truetype debugger is completely dependent on: + http://freetype.sf.net/ + The default configuration is useful to FontForge, but more functionality + is obtained if you enable the bytecode interpreter (but note: you must + have a license from Apple to do this). Instructions for doing so are + in the file README.UNX in the freetype distribution. + *** FontForge also needs to have the freetype sources available to it *** + *** when it builds (it needs some internal include files). The configure *** + *** script can usually figure this out, but it is very time-consuming *** + *** you might want to say $ ./configure --with-freetype-src= *** + *** where is the top-level freetype source directory *** + + Finally, if you want to do autotracing you should install + http://sourceforge.net/projects/autotrace/ + +RUNNING +$ fontforge -new + Creates a new font +$ fontforge -nosplash + (No splash screen in case you have a very slow X connection) +$ fontforge font.pfa font2.pfb font3.ttf font4.otf font4.sfd font5.svg + Opens those fonts (sfd files are fontforge's own spline font database files) +$ fontforge + Brings up a file picker dlg. + +DOCUMENTATION + http://fontforge.sourceforge.net/overview.html + +Please report any bugs to + fontforge-devel@lists.sourceforge.net diff --git a/README-unix~ b/README-unix~ new file mode 100644 index 00000000..adf2b43b --- /dev/null +++ b/README-unix~ @@ -0,0 +1,159 @@ +CAVEAT + PfaEdit is changing its name to FontForge. Future releases will be found + at http://fontforge.sf.net/ + +INSTALLATION NOTES: + This distribution may be in two formats, either it contains dynamic libraries + or it does not. + +INSTALLATION WITH DYNAMIC LIBRARIES + contains two executables: + pfaedit -- a font editor + sfddiff -- a program for comparing fonts + man pages for the above + pfaedit.1 + sfddiff.1 + two libraries + libgdraw.so + libgunicode.so + and some user interface files + pfaedit.{en,fr,de,ru,ja}.ui + and a shell script + doinstall + which should put everything into a reasonable place (you probably need to be + root to run it). + + If you want to edit CID-keyed fonts (for CJK fonts) you may want to pull down + the cidmap package from http://pfaedit.sf.net/cidmaps.tgz and move the + contents to /usr/share/pfaedit also. + +INSTALLATION WITHOUT DYNAMIC LIBRARIES + Otherwise the package will contain: + A README file or two + pfaedit -- the executable + pfaedit.1 -- the man page. + pfaedit-*.ui -- various user interface string files for different + languages + You should: + $ su + # mkdir -p /usr/local/bin /usr/local/man/man1 /usr/local/share/pfaedit + # mv pfaedit /usr/local/bin + # mv *.1 /usr/local/man/man1 + # mv *.ui /usr/local/share/pfaedit + + You may need to add /usr/local/bin to your PATH environment variable (and + /usr/local/man to your MANPATH environment variable). If you use bash edit + ~/.bashrc and add + PATH=${PATH}:/usr/local/bin + MANPATH=${MANPATH:-}:/usr/local/man ; export MANPATH + Or if you use csh, tcsh, etc. edit your ~/.cshrc and add: + setenv PATH ${PATH}:/usr/local/bin + if ( $?MANPATH == "0" ) then + setenv MANPATH /usr/local/man + else + setenv MANPATH ${MANPATH}:/usr/local/man + endif + +BUILDING + Just download the file pfaedit_full-*.tgz which you will find on + http://pfaedit.sourceforge.net/index.html#source + Move it somewhere appropriate (/usr/local/src perhaps?) and type: + $ gunzip pfaedit_full-*.tgz ; tar xf pfaedit_full-*.tar + $ cd pfaedit + $ configure + $ make + $ su + # make install + On those machines where I can't figure out how to build dynamic + libraries you should substitute "configure.static" for configure. + +If you want access to PfaEdit's type3 editing capabilities then + $ configure --with-multilayer + +More complex installations + "make install" will also install a few other things which are not part of + the standard package, but which are useful for some people. + CIDMAPS: + If you are going to be editing CID keyed fonts you should also down- + load my cidmap files from + http://pfaedit.sourceforge.net/cidmaps.tgz + put that file in the same place as you put pfaedit_full*.tgz, then + $ mkdir -p pfaedit/cidmaps + $ mv cidmaps.tgz pfaedit/cidmaps + $ cd pfaedit/cidmaps + $ gunzip *.tgz ; tar xf *.tar + $ cd ../.. + And then proceed to do the normal install. + DOCUMENTATION: + You can choose to install PfaEdit's documentation on your system, then + pressing the [Help] or [F1] key within PfaEdit will go to the local + docs rather than those on the web. + Download the doc bundle from + http://pfaedit.sourceforge.net/index.html#docs + Then (assuming you have not changed the install prefix) + # mkdir -p /usr/local/share/doc/pfaedit + # mv pfaedit_htdocs-*.tgz /usr/local/share/doc/pfaedit + # cd /usr/local/share/doc/pfaedit + # gunzip *.tgz; tar xf *.tar + +BUILDING for OpenVMS + Jouk Jansen has provided me with OpenVMS makefile scripts. There should + be mms files in all the appropriate directories. + +BUILDING without X11 + PfaEdit can be built without X11. You will probably only want to do this + if your system lacks X (in which case configure should figure that out and + do it automagically). But if, for some strange reason you wish to build a + non-X version on a machine with X type: + $ configure --without-x + +BITMAP FONTS + The program sort of assumes you've got some unicode fonts lying around. + The program will choose fonts as best it can depending on what you have + installed on your machine. + Sources of unicode fonts: + http://czyborra.com/unifont/ + http://clr.nmsu.edu/~mleisher/cu.html + http://savannah.nongnu.org/projects/freefont + http://bibliofile.mc.duke.edu/gww/fonts/{Monospace,Caliban} + +DEPENDENCIES + PfaEdit has more functionality if libpng and libungif are installed on your + system. If they are not then you can find them at: + http://www.libpng.org/pub/png/libpng.html + http://www.gzip.org/zlib/ + ttp://prtr-13.ucsc.edu/~badger/software/libungif/index.shtml + + PfaEdit also makes use of libuninameslist to be found at: + http://libuninameslist.sf.net/ + + PfaEdit's truetype debugger is completely dependent on: + http://freetype.sf.net/ + The default configuration is useful to PfaEdit, but more functionality + is obtained if you enable the bytecode interpreter (but note: you must + have a license from Apple to do this). Instructions for doing so are + in the file README.UNX in the freetype distribution. + *** PfaEdit also needs to have the freetype sources available to it *** + *** when it builds (it needs some internal include files). The configure *** + *** script can usually figure this out, but it is very time-consuming *** + *** you might want to say $ ./configure --with-freetype-src= *** + *** where is the top-level freetype source directory *** + + Finally, if you want to do autotracing you should install + http://sourceforge.net/projects/autotrace/ + +RUNNING +$ pfaedit -new + Creates a new font +$ pfaedit -nosplash + (No splash screen in case you have a very slow X connection) +$ pfaedit font.pfa font2.pfb font3.ttf font4.otf font4.sfd font5.svg + Opens those fonts (sfd files are pfaedit's own spline font database files) +$ pfaedit + Brings up a file picker dlg. + +DOCUMENTATION + http://pfaedit.sourceforge.net/overview.html + +Please report any bugs to + pfaedit-devel@lists.sourceforge.net diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 00000000..a4119369 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,3573 @@ +# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001 +## 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + +# serial 46 AC_PROG_LIBTOOL + +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +]) + +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.13)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl + +_LT_AC_PROG_ECHO_BACKSLASH +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE(libtool-lock, + [ --disable-libtool-lock avoid locking (might break parallel builds)]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_SAVE + AC_LANG_C + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_RESTORE]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + +ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one + AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain, + [AC_TRY_LINK([], + [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*); + DllMain (0, 0, 0);], + [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])]) + + case $host/$CC in + *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*) + # old mingw systems require "-dll" to link a DLL, while more recent ones + # require "-mdll" + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mdll" + AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch, + [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])]) + CFLAGS="$SAVE_CFLAGS" ;; + *-*-cygwin* | *-*-pw32*) + # cygwin systems need to pass --dll to the linker, and not link + # crt.o which will require a WinMain@16 definition. + lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;; + esac + ;; + ]) +esac + +_LT_AC_LTCONFIG_HACK + +]) + +# AC_LIBTOOL_HEADER_ASSERT +# ------------------------ +AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT], +[AC_CACHE_CHECK([whether $CC supports assert without backlinking], + [lt_cv_func_assert_works], + [case $host in + *-*-solaris*) + if test "$GCC" = yes && test "$with_gnu_ld" != yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) lt_cv_func_assert_works=no ;; + *) lt_cv_func_assert_works=yes ;; + esac + fi + ;; + esac]) + +if test "x$lt_cv_func_assert_works" = xyes; then + AC_CHECK_HEADERS(assert.h) +fi +])# AC_LIBTOOL_HEADER_ASSERT + +# _LT_AC_CHECK_DLFCN +# -------------------- +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h) +])# _LT_AC_CHECK_DLFCN + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix*) + symcode='[[BCDEGRST]]' + ;; +solaris* | sysv5*) + symcode='[[BDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[[ABCDGISTW]]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. +lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[[]] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if AC_TRY_EVAL(ac_link) && test -s conftest; then + pipe_works=yes + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AC_FD_CC + fi + else + echo "cannot find nm_test_var in $nlist" >&AC_FD_CC + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC + fi + else + echo "$progname: failed program was:" >&AC_FD_CC + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + +# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR +# --------------------------------- +AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR], +[# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi +])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-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. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +AC_DIVERT_POP +])# _LT_AC_PROG_ECHO_BACKSLASH + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ------------------------------------------------------------------ +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[if test "$cross_compiling" = yes; then : + [$4] +else + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_unknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + +# AC_LIBTOOL_DLOPEN_SELF +# ------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + +AC_DEFUN([_LT_AC_LTCONFIG_HACK], +[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([[\\"\\`$\\\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="[$]2" + +## FIXME: this should be a separate macro +## +AC_MSG_CHECKING([for objdir]) +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +AC_MSG_RESULT($objdir) +## +## END FIXME + + +## FIXME: this should be a separate macro +## +AC_ARG_WITH(pic, +[ --with-pic try to use only PIC/non-PIC objects [default=use both]], +pic_mode="$withval", pic_mode=default) +test -z "$pic_mode" && pic_mode=default + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +AC_MSG_CHECKING([for $compiler option to produce PIC]) +AC_CACHE_VAL(lt_cv_prog_cc_pic, +[ lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + if test "x$host_vendor" = xsni; then + lt_cv_prog_cc_wl='-LD' + else + lt_cv_prog_cc_wl='-Wl,' + fi + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi +]) +if test -z "$lt_cv_prog_cc_pic"; then + AC_MSG_RESULT([none]) +else + AC_MSG_RESULT([$lt_cv_prog_cc_pic]) + + # Check to make sure the pic_flag actually works. + AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works]) + AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + AC_TRY_COMPILE([], [], [dnl + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + ], [dnl + lt_cv_prog_cc_pic_works=no + ]) + CFLAGS="$save_CFLAGS" + ]) + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + AC_MSG_RESULT([$lt_cv_prog_cc_pic_works]) +fi +## +## END FIXME + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries]) + if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then : + else + AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure]) + lt_cv_prog_cc_can_build_shared=no + fi +fi + +## FIXME: this should be a separate macro +## +AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works]) +AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes]) + LDFLAGS="$save_LDFLAGS" +]) + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +AC_MSG_RESULT([$lt_cv_prog_cc_static_works]) + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" +## +## END FIXME + + +## FIXME: this should be a separate macro +## +# Check to see if options -o and -c are simultaneously supported by compiler +AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext]) +AC_CACHE_VAL([lt_cv_compiler_c_o], [ +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&AC_FD_CC + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null +]) +compiler_c_o=$lt_cv_compiler_c_o +AC_MSG_RESULT([$compiler_c_o]) + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + AC_MSG_CHECKING([if $compiler supports -c -o file.lo]) + AC_CACHE_VAL([lt_cv_compiler_o_lo], [ + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + ]) + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + ]) + compiler_o_lo=$lt_cv_compiler_o_lo + AC_MSG_RESULT([$compiler_o_lo]) +else + compiler_o_lo=no +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions]) + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + AC_TRY_COMPILE([], [int some_variable = 0;], [dnl + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + ]) + CFLAGS="$save_CFLAGS" + AC_MSG_RESULT([$compiler_rtti_exceptions]) + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +# See if the linker supports building shared libraries. +AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries]) + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +old_archive_from_expsyms_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. +extract_expsyms_cmds= + +case $host_os in +cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; +openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \[$]# in + 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall can do strange things, so it is better to + # generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[[012]]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case "$host_os" in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + #Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [[12]].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + if test "x$host_vendor" = xsno; then + archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + else + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +AC_MSG_RESULT([$ld_shlibs]) +test "$ld_shlibs" = no && can_build_shared=no +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Check hardcoding attributes. +AC_MSG_CHECKING([how to hardcode library paths into programs]) +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +AC_MSG_RESULT([$hardcode_action]) +## +## END FIXME + +## FIXME: this should be a separate macro +## +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi +## +## END FIXME + +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +## FIXME: this should be a separate macro +## +# PORTME Fill in your ld.so characteristics +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4* | aix5*) + version_type=linux + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can + # not hardcode correct soname into executable. Probably we can + # add versioning support to collect2, so additional links can + # be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}.so$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + *) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case "$host_os" in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Report the final consequences. +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) +## +## END FIXME + +## FIXME: this should be a separate macro +## +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) +## +## END FIXME + +## FIXME: this should be a separate macro +## +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) +## +## END FIXME + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +AC_LIBTOOL_DLOPEN_SELF + +## FIXME: this should be a separate macro +## +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + AC_CACHE_VAL([lt_cv_archive_cmds_need_lc], + [$rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile); then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi]) + AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc]) + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} +## +## END FIXME + +## FIXME: this should be a separate macro +## +# The second clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + : +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case $var in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + cat <<__EOF__ > "${ofile}T" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996-2000 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$need_lc + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# The default C compiler. +CC=$lt_CC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_pic_flag +pic_mode=$pic_mode + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + case $host_os in + aix3*) + cat <<\EOF >> "${ofile}T" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public 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 /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +fi +## +## END FIXME + +])# _LT_AC_LTCONFIG_HACK + +# AC_LIBTOOL_DLOPEN - enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])]) + +# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])]) + +# AC_ENABLE_SHARED - implement the --enable-shared flag +# Usage: AC_ENABLE_SHARED[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(shared, +changequote(<<, >>)dnl +<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl +]) + +# AC_DISABLE_SHARED - set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no)]) + +# AC_ENABLE_STATIC - implement the --enable-static flag +# Usage: AC_ENABLE_STATIC[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(static, +changequote(<<, >>)dnl +<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_static=AC_ENABLE_STATIC_DEFAULT)dnl +]) + +# AC_DISABLE_STATIC - set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no)]) + + +# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag +# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)] +# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to +# `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(fast-install, +changequote(<<, >>)dnl +<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case $enableval in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl +]) + +# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no)]) + +# AC_LIBTOOL_PICMODE - implement the --with-pic flag +# Usage: AC_LIBTOOL_PICMODE[(MODE)] +# Where MODE is either `yes' or `no'. If omitted, it defaults to +# `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default)]) + + +# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +]) + + +# AC_PATH_MAGIC - find a file program which can recognise a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl +AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH) + else + MAGIC_CMD=: + fi +fi +]) + + +# AC_PROG_LD - find the path to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH(gnu-ld, +[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], +test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | [[A-Za-z]]:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$lt_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_PROG_LD_GNU +]) + +# AC_PROG_LD_GNU - +AC_DEFUN([AC_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi]) +with_gnu_ld=$lt_cv_prog_gnu_ld +]) + +# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +AC_DEFUN([AC_PROG_LD_RELOAD_FLAG], +[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag, +[lt_cv_ld_reload_flag='-r']) +reload_flag=$lt_cv_ld_reload_flag +test -n "$reload_flag" && reload_flag=" $reload_flag" +]) + +# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +AC_DEFUN([AC_DEPLIBS_CHECK_METHOD], +[AC_CACHE_CHECK([how to recognise dependant libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[[012]]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20*|hpux11*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6*) + case $host_os in + irix5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux-gnu*) + case $host_cpu in + alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[[78]]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + esac + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +]) + + +# AC_PROG_NM - find the path to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl +AC_MSG_CHECKING([for BSD-compatible nm]) +AC_CACHE_VAL(lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}nm + if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +AC_MSG_RESULT([$NM]) +]) + +# AC_CHECK_LIBM - check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32*) + # These system don't have libm + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, main, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, main, LIBM="-lm") + ;; +esac +]) + +# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl convenience library and INCLTDL to the include flags for +# the libltdl header and adds --enable-ltdl-convenience to the +# configure arguments. Note that LIBLTDL and INCLTDL are not +# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not +# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed +# with '${top_builddir}/' and INCLTDL will be prefixed with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) +]) + +# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for +# the libltdl installable library and INCLTDL to the include flags for +# the libltdl header and adds --enable-ltdl-install to the configure +# arguments. Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is +# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed +# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will +# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed +# with '${top_srcdir}/' (note the single quotes!). If your package is +# not flat and you're not using automake, define top_builddir and +# top_srcdir appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, main, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + INCLTDL= + fi +]) + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) diff --git a/config.guess b/config.guess new file mode 100755 index 00000000..dff9e481 --- /dev/null +++ b/config.guess @@ -0,0 +1,1317 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. + +timestamp='2001-09-04' + +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + +# Written by Per Bothner . +# Please send patches to . +# +# 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 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; + for c in cc gcc c89 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/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 + +# 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. + # Determine the machine/vendor (is the vendor relevant). + case "${UNAME_MACHINE}" in + amiga) machine=m68k-unknown ;; + arm32) machine=arm-unknown ;; + atari*) machine=m68k-atari ;; + sun3*) machine=m68k-sun ;; + mac68k) machine=m68k-apple ;; + macppc) machine=powerpc-apple ;; + hp3[0-9][05]) machine=m68k-hp ;; + ibmrt|romp-ibm) machine=romp-ibm ;; + *) machine=${UNAME_MACHINE}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE}" in + i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k) + 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 + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # 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 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # 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. + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + 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 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + arc64:OpenBSD:*:*) + echo mips64el-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hkmips:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mips-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + 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 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + 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 0 ;; + 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 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(head -1 /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 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + sparc*:NetBSD:*) + echo `uname -p`-unknown-netbsd${UNAME_RELEASE} + exit 0 ;; + atari*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + # 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 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + sun3*:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + 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 $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + 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 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + 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 0 ;; + *: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 + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + 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 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | 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 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 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]) + case "${HPUX_REV}" in + 11.[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" ;; + esac ;; + esac + fi ;; + esac + 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 $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 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 $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + hppa*:OpenBSD:*:*) + echo hppa-unknown-openbsd + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*X-MP:*:*:*) + echo xmp-cray-unicos + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + 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 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY-2:*:*:*) + echo cray2-cray-unicos + exit 0 ;; + 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 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + 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 i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in + big) echo mips-unknown-linux-gnu && exit 0 ;; + little) echo mipsel-unknown-linux-gnu && exit 0 ;; + esac + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + 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="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + 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-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + 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. + ld_supported_targets=`cd /; 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-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + cat >$dummy.c < +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif +#ifdef __ELF__ +# ifdef __GLIBC__ +# if __GLIBC__ >= 2 + printf ("%s-pc-linux-gnu\n", argv[1]); +# else + printf ("%s-pc-linux-gnulibc1\n", argv[1]); +# endif +# else + printf ("%s-pc-linux-gnulibc1\n", argv[1]); +# endif +#else + printf ("%s-pc-linux-gnuaout\n", argv[1]); +#endif + return 0; +} +EOF + $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + 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 0 ;; + 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 0 ;; + 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 0 ;; + i*86:*:5:[78]*) + 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 0 ;; + 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|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + 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 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + 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 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*: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 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *: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 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + 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 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + if test "${UNAME_MACHINE}" = "x86pc"; then + UNAME_MACHINE=pc + fi + echo `uname -p`-${UNAME_MACHINE}-nto-qnx + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[KW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *: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 0 ;; + 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 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; +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"); 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 $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# 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 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + 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/config.sub b/config.sub new file mode 100755 index 00000000..393f13d3 --- /dev/null +++ b/config.sub @@ -0,0 +1,1411 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. + +timestamp='2001-09-07' + +# 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., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, 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 . +# +# 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 +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 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # 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 0;; + + * ) + 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* | storm-chaos* | os2-emx* | windows32-*) + 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) + 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 + ;; + -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/'` + ;; + -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] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ + | mipsisa32 \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | s390 | s390x \ + | sh | sh[34] | sh[34]eb | shbe | shle \ + | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \ + | stormy16 | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 \ + | we32k \ + | x86 | xscale \ + | 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) + ;; + + # 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]-* \ + | alphapca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armv*-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cray2-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ + | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | s390-* | s390x-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \ + | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \ + | ymp-* \ + | z8k-*) + ;; + # 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 + ;; + 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 + ;; + 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 + ;; + 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 | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [cjt]90) + basic_machine=${basic_machine}-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + 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 + ;; + 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 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + 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 + ;; + 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 + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`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 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-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=t3e-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + 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 + ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + 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 + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + 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 + ;; + sh3 | sh4 | sh3eb | sh4eb) + basic_machine=sh-unknown + ;; + sparc | sparcv9 | sparcv9b) + 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 + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-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* | -netbsd* | -openbsd* | -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* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -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 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -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 + ;; + -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 + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + 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 + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-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 + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + 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 0 + +# 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/configure b/configure new file mode 100755 index 00000000..dfc2913d --- /dev/null +++ b/configure @@ -0,0 +1,12295 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.57. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# 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 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-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. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="fontforge/pfaedit.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA build build_cpu build_vendor build_os host host_cpu host_vendor host_os LN_S ECHO RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CPP EGREP LIBTOOL X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS X_11LIB STATIC_LIBS LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -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 | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$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 ;; + + -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 ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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 ;; + + -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=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 ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +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 + 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 + + +# 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 its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# 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 \`..'] + +_ACEOF + + cat <<_ACEOF +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] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --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] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-static=PKGS build static libraries default=no + --enable-shared=PKGS build shared libraries default=yes + --enable-fast-install=PKGS optimize for fast installation default=yes + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-pic try to use only PIC/non-PIC objects default=use both + --with-freetype-bytecode Control whether we build with the bytecode interpreter + --with-freetype-src=dir Specify freetype source directory + --with-x use the X Window System + --with-regular-link Don't try to dlopen libraries + --with-multilayer Control whether we build with support for type3/svg fonts containing multilayered drawing with strokes, fills, images, etc. + +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 + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP 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. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style 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 + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +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 0 +fi +exec 5>config.log +cat >&5 <<_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.57. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +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` +hostinfo = `(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=. + echo "PATH: $as_dir" +done + +} >&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_sep= +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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >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 + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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 `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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=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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$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" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out 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. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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; +} +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 +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +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_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 + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# 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" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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/* | \ + /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 $as_executable_p "$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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_static=no +fi; +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=yes +fi; +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} +case $enableval in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_fast_install=yes +fi; +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + +echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 +if test "${lt_cv_ld_reload_flag+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_ld_reload_flag='-r' +fi +echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +reload_flag=$lt_cv_ld_reload_flag +test -n "$reload_flag" && reload_flag=" $reload_flag" + +echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +if test "${lt_cv_path_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}nm + if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi + +NM="$lt_cv_path_NM" +echo "$as_me:$LINENO: result: $NM" >&5 +echo "${ECHO_T}$NM" >&6 + +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:$LINENO: checking how to recognise dependant libraries" >&5 +echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" >&6 +if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[012]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20*|hpux11*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6*) + case $host_os in + irix5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux-gnu*) + case $host_cpu in + alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[78]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + esac + ;; +esac + +fi +echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method + + + + + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo "$as_me:$LINENO: checking command to parse $NM output" >&5 +echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6 +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris* | sysv5*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. +lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest; then + pipe_works=yes + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then + echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6 +else + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 +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 +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f 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 +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +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 + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#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)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 4022 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + 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 + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +lt_cv_cc_needs_belf=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + 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 + +fi +echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + + +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$as_me:$LINENO: result: $objdir" >&5 +echo "${ECHO_T}$objdir" >&6 +## +## END FIXME + + +## FIXME: this should be a separate macro +## + +# Check whether --with-pic or --without-pic was given. +if test "${with_pic+set}" = set; then + withval="$with_pic" + pic_mode="$withval" +else + pic_mode=default +fi; +test -z "$pic_mode" && pic_mode=default + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +if test "${lt_cv_prog_cc_pic+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + if test "x$host_vendor" = xsni; then + lt_cv_prog_cc_wl='-LD' + else + lt_cv_prog_cc_wl='-Wl,' + fi + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi + +fi + +if test -z "$lt_cv_prog_cc_pic"; then + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +else + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6 + + # Check to make sure the pic_flag actually works. + echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6 + if test "${lt_cv_prog_cc_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_prog_cc_pic_works=no + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi + + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6 +fi +## +## END FIXME + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6 +if test "${lt_cv_prog_cc_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_prog_cc_static_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi + + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6 + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" +## +## END FIXME + + +## FIXME: this should be a separate macro +## +# Check to see if options -o and -c are simultaneously supported by compiler +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:4569: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +fi + +compiler_c_o=$lt_cv_compiler_c_o +echo "$as_me:$LINENO: result: $compiler_c_o" >&5 +echo "${ECHO_T}$compiler_c_o" >&6 + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6 + if test "${lt_cv_compiler_o_lo+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + +fi + + compiler_o_lo=$lt_cv_compiler_o_lo + echo "$as_me:$LINENO: result: $compiler_o_lo" >&5 +echo "${ECHO_T}$compiler_o_lo" >&6 +else + compiler_o_lo=no +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$compiler_rtti_exceptions" >&6 + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +# See if the linker supports building shared libraries. +echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +old_archive_from_expsyms_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. +extract_expsyms_cmds= + +case $host_os in +cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; +openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \$# in + 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall can do strange things, so it is better to + # generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + #Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [12].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + if test "x$host_vendor" = xsno; then + archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + else + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6 +test "$ld_shlibs" = no && can_build_shared=no +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Check hardcoding attributes. +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6 +## +## END FIXME + +## FIXME: this should be a separate macro +## +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +## +## END FIXME + +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +## FIXME: this should be a separate macro +## +# PORTME Fill in your ld.so characteristics +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4* | aix5*) + version_type=linux + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can + # not hardcode correct soname into executable. Probably we can + # add versioning support to collect2, so additional links can + # be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}.so$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + *) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case "$host_os" in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Report the final consequences. +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 +## +## END FIXME + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 +## +## END FIXME + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 +## +## END FIXME + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* 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_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* 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_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +## FIXME: this should be a separate macro +## +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + if test "${lt_cv_archive_cmds_need_lc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + $rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi +fi + + echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5 +echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6 + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} +## +## END FIXME + +## FIXME: this should be a separate macro +## +# The second clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + : +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case $var in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + cat <<__EOF__ > "${ofile}T" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996-2000 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$need_lc + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# The default C compiler. +CC=$lt_CC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_pic_flag +pic_mode=$pic_mode + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + case $host_os in + aix3*) + cat <<\EOF >> "${ofile}T" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public 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 /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +fi +## +## END FIXME + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + +gww_nodynamic="no" +gww_needsstatic="no" +gww_needsstaticimages="no" +case "$host" in +*-apple-darwin*) +gww_needsstaticimages="yes" + +cat >>confdefs.h <<\_ACEOF +#define _CursorsMustBe16x16 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define __Mac 1 +_ACEOF + +LIBS="/System/Library/Frameworks/CoreServices.framework/CoreServices $LIBS" + ;; +powerpc-*-*linux*) +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 3 +_ACEOF + + ;; +*sparc*) +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 2 +_ACEOF + + ;; +*-pc-cygwin*) +cat >>confdefs.h <<\_ACEOF +#define _BrokenBitmapImages 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define _ModKeysAutoRepeat 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define __CygWin 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define NODYNAMIC 1 +_ACEOF + +gww_nodynamic="yes" +gww_needsstatic="yes" + + +cat >>confdefs.h <<\_ACEOF +#define _NO_XINPUT 1 +_ACEOF + + ;; +esac + +echo "$as_me:$LINENO: checking for library containing dlopen" >&5 +echo $ECHO_N "checking for library containing dlopen... $ECHO_C" >&6 +if test "${ac_cv_search_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_dlopen=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_dlopen" = no; then + for ac_lib in dl; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_dlopen" >&5 +echo "${ECHO_T}$ac_cv_search_dlopen" >&6 +if test "$ac_cv_search_dlopen" != no; then + test "$ac_cv_search_dlopen" = "none required" || LIBS="$ac_cv_search_dlopen $LIBS" + +fi + echo "$as_me:$LINENO: checking for library containing inet_aton" >&5 +echo $ECHO_N "checking for library containing inet_aton... $ECHO_C" >&6 +if test "${ac_cv_search_inet_aton+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_inet_aton=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char inet_aton (); +int +main () +{ +inet_aton (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_inet_aton="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_inet_aton" = no; then + for ac_lib in resolv; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char inet_aton (); +int +main () +{ +inet_aton (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_inet_aton="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_inet_aton" >&5 +echo "${ECHO_T}$ac_cv_search_inet_aton" >&6 +if test "$ac_cv_search_inet_aton" != no; then + test "$ac_cv_search_inet_aton" = "none required" || LIBS="$ac_cv_search_inet_aton $LIBS" + +fi + echo "$as_me:$LINENO: checking for library containing libiconv" >&5 +echo $ECHO_N "checking for library containing libiconv... $ECHO_C" >&6 +if test "${ac_cv_search_libiconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_libiconv=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libiconv (); +int +main () +{ +libiconv (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_libiconv="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_libiconv" = no; then + for ac_lib in iconv; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libiconv (); +int +main () +{ +libiconv (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_libiconv="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_libiconv" >&5 +echo "${ECHO_T}$ac_cv_search_libiconv" >&6 +if test "$ac_cv_search_libiconv" != no; then + test "$ac_cv_search_libiconv" = "none required" || LIBS="$ac_cv_search_libiconv $LIBS" + +fi + + +FreeType2_IncRoot= +if sh -c "freetype-config --prefix" >/dev/null 2>&1 ; then + FreeType2_IncRoot=`freetype-config --prefix` + as_ac_File=`echo "ac_cv_file_$FreeType2_IncRoot/include/freetype2" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $FreeType2_IncRoot/include/freetype2" >&5 +echo $ECHO_N "checking for $FreeType2_IncRoot/include/freetype2... $ECHO_C" >&6 +if eval "test \"\${$as_ac_File+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "$FreeType2_IncRoot/include/freetype2"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_File'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_File'}'`" >&6 +if test `eval echo '${'$as_ac_File'}'` = yes; then + CFLAGS="$CFLAGS -I$FreeType2_IncRoot/include/freetype2/" +else + FreeType2_IncRoot= +fi + +fi + +if test "FreeType2_IncRoot" = "" >/dev/null 2>&1 ; then + echo "$as_me:$LINENO: checking for /usr/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/include/freetype2"; then + ac_cv_file__usr_include_freetype2=yes +else + ac_cv_file__usr_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_include_freetype2" >&6 +if test $ac_cv_file__usr_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/include/freetype2/" + FreeType2_IncRoot="/usr" + +else + + echo "$as_me:$LINENO: checking for /usr/local/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/local/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_local_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/local/include/freetype2"; then + ac_cv_file__usr_local_include_freetype2=yes +else + ac_cv_file__usr_local_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_local_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_local_include_freetype2" >&6 +if test $ac_cv_file__usr_local_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/freetype2/" + FreeType2_IncRoot="/usr/local/" + +else + + echo "$as_me:$LINENO: checking for /usr/X11R6/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/X11R6/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_X11R6_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/X11R6/include/freetype2"; then + ac_cv_file__usr_X11R6_include_freetype2=yes +else + ac_cv_file__usr_X11R6_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_X11R6_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_X11R6_include_freetype2" >&6 +if test $ac_cv_file__usr_X11R6_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/X11R6/include -I/usr/X11R6/include/freetype2/" + FreeType2_IncRoot="/usr/X11R6/" + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_FREETYPE 1 +_ACEOF + +fi + +fi + +fi + +fi + +echo "$as_me:$LINENO: checking for /usr/include/libxml2/libxml" >&5 +echo $ECHO_N "checking for /usr/include/libxml2/libxml... $ECHO_C" >&6 +if test "${ac_cv_file__usr_include_libxml2_libxml+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/include/libxml2/libxml"; then + ac_cv_file__usr_include_libxml2_libxml=yes +else + ac_cv_file__usr_include_libxml2_libxml=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_include_libxml2_libxml" >&5 +echo "${ECHO_T}$ac_cv_file__usr_include_libxml2_libxml" >&6 +if test $ac_cv_file__usr_include_libxml2_libxml = yes; then + CFLAGS="$CFLAGS -I/usr/include/libxml2/" +else + + echo "$as_me:$LINENO: checking for /usr/local/include/libxml2/libxml" >&5 +echo $ECHO_N "checking for /usr/local/include/libxml2/libxml... $ECHO_C" >&6 +if test "${ac_cv_file__usr_local_include_libxml2_libxml+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/local/include/libxml2/libxml"; then + ac_cv_file__usr_local_include_libxml2_libxml=yes +else + ac_cv_file__usr_local_include_libxml2_libxml=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_local_include_libxml2_libxml" >&5 +echo "${ECHO_T}$ac_cv_file__usr_local_include_libxml2_libxml" >&6 +if test $ac_cv_file__usr_local_include_libxml2_libxml = yes; then + CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/libxml2/" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBXML 1 +_ACEOF + +fi + +fi + + + +echo "$as_me:$LINENO: checking for DGifOpenFileName in -lungif" >&5 +echo $ECHO_N "checking for DGifOpenFileName in -lungif... $ECHO_C" >&6 +if test "${ac_cv_lib_ungif_DGifOpenFileName+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lungif $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char DGifOpenFileName (); +int +main () +{ +DGifOpenFileName (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ungif_DGifOpenFileName=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ungif_DGifOpenFileName=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ungif_DGifOpenFileName" >&5 +echo "${ECHO_T}$ac_cv_lib_ungif_DGifOpenFileName" >&6 +if test $ac_cv_lib_ungif_DGifOpenFileName = yes; then + +echo -n checking for ExtensionBlock.Function in gif_lib.h... +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + ExtensionBlock foo; foo.Function=3; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo " " yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo " " no + ac_cv_lib_ungif_DGifOpenFileName=no + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNGIF 1 +_ACEOF + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNGIF 1 +_ACEOF + +fi + + +echo "$as_me:$LINENO: checking for deflateEnd in -lz" >&5 +echo $ECHO_N "checking for deflateEnd in -lz... $ECHO_C" >&6 +if test "${ac_cv_lib_z_deflateEnd+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char deflateEnd (); +int +main () +{ +deflateEnd (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_z_deflateEnd=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_z_deflateEnd=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_z_deflateEnd" >&5 +echo "${ECHO_T}$ac_cv_lib_z_deflateEnd" >&6 +if test $ac_cv_lib_z_deflateEnd = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBPNG 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for png_create_read_struct in -lpng" >&5 +echo $ECHO_N "checking for png_create_read_struct in -lpng... $ECHO_C" >&6 +if test "${ac_cv_lib_png_png_create_read_struct+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng -lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char png_create_read_struct (); +int +main () +{ +png_create_read_struct (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_png_png_create_read_struct=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_png_png_create_read_struct=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_png_png_create_read_struct" >&5 +echo "${ECHO_T}$ac_cv_lib_png_png_create_read_struct" >&6 +if test $ac_cv_lib_png_png_create_read_struct = yes; then + : +else + + echo "$as_me:$LINENO: checking for png_create_read_struct in -lpng12" >&5 +echo $ECHO_N "checking for png_create_read_struct in -lpng12... $ECHO_C" >&6 +if test "${ac_cv_lib_png12_png_create_read_struct+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng12 -lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char png_create_read_struct (); +int +main () +{ +png_create_read_struct (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_png12_png_create_read_struct=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_png12_png_create_read_struct=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_png12_png_create_read_struct" >&5 +echo "${ECHO_T}$ac_cv_lib_png12_png_create_read_struct" >&6 +if test $ac_cv_lib_png12_png_create_read_struct = yes; then + cat >>confdefs.h <<\_ACEOF +#define _LIBPNG12 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBPNG 1 +_ACEOF + +fi + +fi + +echo "$as_me:$LINENO: checking for jpeg_CreateDecompress in -ljpeg" >&5 +echo $ECHO_N "checking for jpeg_CreateDecompress in -ljpeg... $ECHO_C" >&6 +if test "${ac_cv_lib_jpeg_jpeg_CreateDecompress+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char jpeg_CreateDecompress (); +int +main () +{ +jpeg_CreateDecompress (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_jpeg_jpeg_CreateDecompress=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_jpeg_jpeg_CreateDecompress=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_jpeg_jpeg_CreateDecompress" >&5 +echo "${ECHO_T}$ac_cv_lib_jpeg_jpeg_CreateDecompress" >&6 +if test $ac_cv_lib_jpeg_jpeg_CreateDecompress = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBJPEG 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for TIFFOpen in -ltiff" >&5 +echo $ECHO_N "checking for TIFFOpen in -ltiff... $ECHO_C" >&6 +if test "${ac_cv_lib_tiff_TIFFOpen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char TIFFOpen (); +int +main () +{ +TIFFOpen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_tiff_TIFFOpen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_tiff_TIFFOpen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_tiff_TIFFOpen" >&5 +echo "${ECHO_T}$ac_cv_lib_tiff_TIFFOpen" >&6 +if test $ac_cv_lib_tiff_TIFFOpen = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBTIFF 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for xmlParseFile in -lxml2" >&5 +echo $ECHO_N "checking for xmlParseFile in -lxml2... $ECHO_C" >&6 +if test "${ac_cv_lib_xml2_xmlParseFile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxml2 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char xmlParseFile (); +int +main () +{ +xmlParseFile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_xml2_xmlParseFile=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_xml2_xmlParseFile=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_xml2_xmlParseFile" >&5 +echo "${ECHO_T}$ac_cv_lib_xml2_xmlParseFile" >&6 +if test $ac_cv_lib_xml2_xmlParseFile = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBXML 1 +_ACEOF + +fi + + + +for ac_header in iconv.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +gww_hasbytecode="no" + +# Check whether --with-freetype-bytecode or --without-freetype-bytecode was given. +if test "${with_freetype_bytecode+set}" = set; then + withval="$with_freetype_bytecode" + + gww_hasbytecode="$withval" + +echo "$as_me:$LINENO: checking for FT_New_Memory_Face in -lfreetype" >&5 +echo $ECHO_N "checking for FT_New_Memory_Face in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_FT_New_Memory_Face+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char FT_New_Memory_Face (); +int +main () +{ +FT_New_Memory_Face (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_FT_New_Memory_Face=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_FT_New_Memory_Face=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_New_Memory_Face" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_FT_New_Memory_Face" >&6 +if test $ac_cv_lib_freetype_FT_New_Memory_Face = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBFREETYPE 1 +_ACEOF + + LIBS="-lfreetype $LIBS" + +fi + + +else + + echo "$as_me:$LINENO: checking for FT_New_Memory_Face in -lfreetype" >&5 +echo $ECHO_N "checking for FT_New_Memory_Face in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_FT_New_Memory_Face+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char FT_New_Memory_Face (); +int +main () +{ +FT_New_Memory_Face (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_FT_New_Memory_Face=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_FT_New_Memory_Face=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_New_Memory_Face" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_FT_New_Memory_Face" >&6 +if test $ac_cv_lib_freetype_FT_New_Memory_Face = yes; then + + echo checking for bytecode interpreter in freetype... + echo "$as_me:$LINENO: checking for TT_RunIns in -lfreetype" >&5 +echo $ECHO_N "checking for TT_RunIns in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_TT_RunIns+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char TT_RunIns (); +int +main () +{ +TT_RunIns (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_TT_RunIns=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_TT_RunIns=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_TT_RunIns" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_TT_RunIns" >&6 +if test $ac_cv_lib_freetype_TT_RunIns = yes; then + gww_hasbytecode="yes" +else + : +fi + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_FREETYPE 1 +_ACEOF + +fi + + +fi; +if test "$gww_hasbytecode" = "yes" ; then + echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 +echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6 +if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_create (); +int +main () +{ +pthread_create (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pthread_pthread_create=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pthread_pthread_create=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 +echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6 +if test $ac_cv_lib_pthread_pthread_create = yes; then + LIBS="$LIBS -lpthread" +else + gww_hasbytecode="no" +fi + +fi + +if test \( "$gww_hasbytecode" = "yes" \) -a \( "$FreeType2_IncRoot" != "" \); then + gww_hasbytecode="no" + +# Check whether --with-freetype-src or --without-freetype-src was given. +if test "${with_freetype_src+set}" = set; then + withval="$with_freetype_src" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC="$withval/src/truetype" + echo "$as_me:$LINENO: checking for valid freetype tree" >&5 +echo $ECHO_N "checking for valid freetype tree... $ECHO_C" >&6 + if test -f "$FreeType2_TT_BUILD_INC/ttobjs.h"; then + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + else + echo "$as_me:$LINENO: result: missing ttobjs.h" >&5 +echo "${ECHO_T}missing ttobjs.h" >&6 + echo "Unable to find $FreeType2_TT_BUILD_INC/ttobjs.h" + fi + fi + +else + + echo "$as_me:$LINENO: checking trying to find the freetype source directory -- be patient" >&5 +echo $ECHO_N "checking trying to find the freetype source directory -- be patient... $ECHO_C" >&6 + FreeType2_TT_SRC_DIRs=`find / -name ttobjs.h -print 2>/dev/null |grep 'freetype[^/\]*2[^/\]*/src/truetype/ttobjs.h' | sort -r | sed -e 's/ttobjs.h//'` + for dir in $FreeType2_TT_SRC_DIRs; do + if cmp -s ${dir}../../include/freetype/freetype.h ${FreeType2_IncRoot}/freetype/freetype.h >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC=$dir + break + fi + done + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + for dir in $FreeType2_TT_SRC_DIRs; do + has_goodft2sources="no" + FreeType2_TT_BUILD_INC=$dir + break + done + fi + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + echo " " no + else + echo " " probably + fi + +fi; + if test "$FreeType2_TT_BUILD_INC" \!= "" >/dev/null 2>&1 ; then + if test -f $FreeType2_TT_BUILD_INC/ttdriver.h >/dev/null 2>&1 ; then + CFLAGS="$CFLAGS -I$FreeType2_TT_BUILD_INC" + gww_hasbytecode="yes" + cat >>confdefs.h <<\_ACEOF +#define FREETYPE_HAS_DEBUGGER 1 +_ACEOF + + fi + fi +fi + + +echo "$as_me:$LINENO: checking for snprintf" >&5 +echo $ECHO_N "checking for snprintf... $ECHO_C" >&6 +if test "${ac_cv_func_snprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char snprintf (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char snprintf (); +/* 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_snprintf) || defined (__stub___snprintf) +choke me +#else +char (*f) () = snprintf; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != snprintf; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_snprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_snprintf=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_snprintf" >&5 +echo "${ECHO_T}$ac_cv_func_snprintf" >&6 +if test $ac_cv_func_snprintf = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_SNPRINTF 1 +_ACEOF + +fi + + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* 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"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 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; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_nospace=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_space=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:$LINENO: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main () +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +/* 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_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +char (*f) () = gethostbyname; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != gethostbyname; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +/* 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_connect) || defined (__stub___connect) +choke me +#else +char (*f) () = connect; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != connect; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +int +main () +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:$LINENO: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +/* 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_remove) || defined (__stub___remove) +choke me +#else +char (*f) () = remove; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != remove; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:$LINENO: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +int +main () +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:$LINENO: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +/* 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_shmat) || defined (__stub___shmat) +choke me +#else +char (*f) () = shmat; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shmat; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +int +main () +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (); +int +main () +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + +X_11LIB=-lX11 +if test "$no_x" = "yes"; then + X_11LIB= +else + + echo "$as_me:$LINENO: checking for XOpenDevice in -lXi" >&5 +echo $ECHO_N "checking for XOpenDevice in -lXi... $ECHO_C" >&6 +if test "${ac_cv_lib_Xi_XOpenDevice+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXi $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDevice (); +int +main () +{ +XOpenDevice (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xi_XOpenDevice=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xi_XOpenDevice=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xi_XOpenDevice" >&5 +echo "${ECHO_T}$ac_cv_lib_Xi_XOpenDevice" >&6 +if test $ac_cv_lib_Xi_XOpenDevice = yes; then + X_11LIB="-lXi -lX11" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_XINPUT 1 +_ACEOF + +fi + + echo "$as_me:$LINENO: checking for XkbQueryExtension in -lxkbui" >&5 +echo $ECHO_N "checking for XkbQueryExtension in -lxkbui... $ECHO_C" >&6 +if test "${ac_cv_lib_xkbui_XkbQueryExtension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxkbui $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XkbQueryExtension (); +int +main () +{ +XkbQueryExtension (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_xkbui_XkbQueryExtension=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_xkbui_XkbQueryExtension=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_xkbui_XkbQueryExtension" >&5 +echo "${ECHO_T}$ac_cv_lib_xkbui_XkbQueryExtension" >&6 +if test $ac_cv_lib_xkbui_XkbQueryExtension = yes; then + X_11LIB="$X_11LIB -lxkbui" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_XKB 1 +_ACEOF + +fi + +fi + +echo -n checking for long long ... +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +long long foo=0x400000000000; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define _HAS_LONGLONG 1 +_ACEOF + + echo " " yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo " " no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +gww_regular_link="no" + +# Check whether --with-regular-link or --without-regular-link was given. +if test "${with_regular_link+set}" = set; then + withval="$with_regular_link" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + gww_regular_link="yes" + cat >>confdefs.h <<\_ACEOF +#define NODYNAMIC 1 +_ACEOF + + fi + +else + : +fi; + + + +STATIC_LIBS= +if test "$gww_nodynamic" = "yes" -o "$gww_regular_link" = "yes"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + fi + if test "$ac_cv_lib_freetype_FT_New_Memory_Face" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lfreetype" + fi + if test "$ac_cv_lib_xml2_xmlParseFile" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lxml2" + fi + echo "$as_me:$LINENO: checking for UnicodeNameAnnot in -luninameslist" >&5 +echo $ECHO_N "checking for UnicodeNameAnnot in -luninameslist... $ECHO_C" >&6 +if test "${ac_cv_lib_uninameslist_UnicodeNameAnnot+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-luninameslist $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char UnicodeNameAnnot (); +int +main () +{ +UnicodeNameAnnot (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_uninameslist_UnicodeNameAnnot=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_uninameslist_UnicodeNameAnnot=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_uninameslist_UnicodeNameAnnot" >&5 +echo "${ECHO_T}$ac_cv_lib_uninameslist_UnicodeNameAnnot" >&6 +if test $ac_cv_lib_uninameslist_UnicodeNameAnnot = yes; then + + STATIC_LIBS="$STATIC_LIBS -luninameslist" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBUNINAMESLIST 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNINAMESLIST 1 +_ACEOF + +fi + +fi +if test "$gww_needsstaticimages" = "yes" -a "$gww_regular_link" = "no"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBUNGIF 1 +_ACEOF + + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBPNG 1 +_ACEOF + + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBPNG 1 +_ACEOF + + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBTIFF 1 +_ACEOF + + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBJPEG 1 +_ACEOF + + fi +fi + + +# Check whether --with-multilayer or --without-multilayer was given. +if test "${with_multilayer+set}" = set; then + withval="$with_multilayer" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + cat >>confdefs.h <<\_ACEOF +#define FONTFORGE_CONFIG_TYPE3 1 +_ACEOF + + fi + +else + : +fi; + +test -d libs || mkdir libs + +cp Makefile.dynamic.in Makefile.in +cp Unicode/Makefile.dynamic.in Unicode/Makefile.in +cp gdraw/Makefile.dynamic.in gdraw/Makefile.in +cp fontforge/Makefile.dynamic.in fontforge/Makefile.in + ac_config_files="$ac_config_files Makefile Unicode/Makefile gdraw/Makefile fontforge/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Unicode/Makefile" ) CONFIG_FILES="$CONFIG_FILES Unicode/Makefile" ;; + "gdraw/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdraw/Makefile" ;; + "fontforge/Makefile" ) CONFIG_FILES="$CONFIG_FILES fontforge/Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@X_11LIB@,$X_11LIB,;t t +s,@STATIC_LIBS@,$STATIC_LIBS,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + +if test -e umap >/dev/null 2>&1 ; then + cp umap/Makefile.dynamic.in umap/Makefile.in + ac_config_files="$ac_config_files umap/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Unicode/Makefile" ) CONFIG_FILES="$CONFIG_FILES Unicode/Makefile" ;; + "gdraw/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdraw/Makefile" ;; + "fontforge/Makefile" ) CONFIG_FILES="$CONFIG_FILES fontforge/Makefile" ;; + "umap/Makefile" ) CONFIG_FILES="$CONFIG_FILES umap/Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@X_11LIB@,$X_11LIB,;t t +s,@STATIC_LIBS@,$STATIC_LIBS,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + +fi + +echo Configuration defines: $DEFS +echo CFLAGS: $CFLAGS +if test "$STATIC_LIBS" != ""; then + echo Static Libraries: $STATIC_LIBS +fi + +if test "$no_x" = "yes"; then + echo " *******************************************************************" + echo " * This version of fontforge will only run scripts. No X libraries *" + echo " * were found so there is NO user interface!!!!! If you want a UI *" + echo " * try installing X11 on your system. *" + echo " *******************************************************************" +fi + diff --git a/configure.dynamic b/configure.dynamic new file mode 100755 index 00000000..921e563a --- /dev/null +++ b/configure.dynamic @@ -0,0 +1,12295 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.57. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# 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 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-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. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="pfaedit/pfaedit.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA build build_cpu build_vendor build_os host host_cpu host_vendor host_os LN_S ECHO RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP CPP EGREP LIBTOOL X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS X_11LIB STATIC_LIBS LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -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 | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$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 ;; + + -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 ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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 ;; + + -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=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 ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +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 + 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 + + +# 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 its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# 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 \`..'] + +_ACEOF + + cat <<_ACEOF +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] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --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] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-static=PKGS build static libraries default=no + --enable-shared=PKGS build shared libraries default=yes + --enable-fast-install=PKGS optimize for fast installation default=yes + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-pic try to use only PIC/non-PIC objects default=use both + --with-freetype-bytecode Control whether we build with the bytecode interpreter + --with-freetype-src=dir Specify freetype source directory + --with-x use the X Window System + --with-regular-link Don't try to dlopen libraries + --with-multilayer Control whether we build with support for type3/svg fonts containing multilayered drawing with strokes, fills, images, etc. + +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 + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP 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. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style 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 + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +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 0 +fi +exec 5>config.log +cat >&5 <<_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.57. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +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` +hostinfo = `(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=. + echo "PATH: $as_dir" +done + +} >&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_sep= +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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >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 + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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 `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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=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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$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" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out 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. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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; +} +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 +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +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_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 + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# 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" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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/* | \ + /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 $as_executable_p "$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 + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +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. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$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' + +# Check whether --enable-static or --disable-static was given. +if test "${enable_static+set}" = set; then + enableval="$enable_static" + p=${PACKAGE-default} +case $enableval in +yes) enable_static=yes ;; +no) enable_static=no ;; +*) + enable_static=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_static=no +fi; +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +# Check whether --enable-shared or --disable-shared was given. +if test "${enable_shared+set}" = set; then + enableval="$enable_shared" + p=${PACKAGE-default} +case $enableval in +yes) enable_shared=yes ;; +no) enable_shared=no ;; +*) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_shared=yes +fi; +# Check whether --enable-fast-install or --disable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval="$enable_fast_install" + p=${PACKAGE-default} +case $enableval in +yes) enable_fast_install=yes ;; +no) enable_fast_install=no ;; +*) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac +else + enable_fast_install=yes +fi; +# Find the correct PATH separator. Usually this is `:', but +# DJGPP uses `;' like DOS. +if test "X${PATH_SEPARATOR+set}" != Xset; then + UNAME=${UNAME-`uname 2>/dev/null`} + case X$UNAME in + *-DOS) lt_cv_sys_path_separator=';' ;; + *) lt_cv_sys_path_separator=':' ;; + esac + PATH_SEPARATOR=$lt_cv_sys_path_separator +fi + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${lt_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" +else + lt_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$lt_cv_path_LD" +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${lt_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + lt_cv_prog_gnu_ld=yes +else + lt_cv_prog_gnu_ld=no +fi +fi +echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5 +echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6 +with_gnu_ld=$lt_cv_prog_gnu_ld + + +echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6 +if test "${lt_cv_ld_reload_flag+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_ld_reload_flag='-r' +fi +echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6 +reload_flag=$lt_cv_ld_reload_flag +test -n "$reload_flag" && reload_flag=" $reload_flag" + +echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6 +if test "${lt_cv_path_NM+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/${ac_tool_prefix}nm + if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then + lt_cv_path_NM="$tmp_nm -B" + break + elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + lt_cv_path_NM="$tmp_nm -p" + break + else + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi + +NM="$lt_cv_path_NM" +echo "$as_me:$LINENO: result: $NM" >&5 +echo "${ECHO_T}$NM" >&6 + +echo "$as_me:$LINENO: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +echo "$as_me:$LINENO: checking how to recognise dependant libraries" >&5 +echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" >&6 +if test "${lt_cv_deplibs_check_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix4* | aix5*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi4*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin* | mingw* | pw32*) + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library' + lt_cv_file_magic_cmd='/usr/bin/file -L' + case "$host_os" in + rhapsody* | darwin1.[012]) + lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1` + ;; + *) # Darwin 1.3 on + lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib' + ;; + esac + ;; + +freebsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20*|hpux11*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + +irix5* | irix6*) + case $host_os in + irix5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1" + ;; + esac + lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*` + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux-gnu*) + case $host_cpu in + alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; + esac + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +openbsd*) + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + else + lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library' + fi + ;; + +osf3* | osf4* | osf5*) + # this will be overridden with pass_all, but let us keep it just in case + lt_cv_deplibs_check_method='file_magic COFF format alpha shared library' + lt_cv_file_magic_test_file=/shlib/libc.so + lt_cv_deplibs_check_method=pass_all + ;; + +sco3.2v5*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + lt_cv_file_magic_test_file=/lib/libc.so + ;; + +sysv5uw[78]* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + esac + ;; +esac + +fi +echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6 +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method + + + + + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo "$as_me:$LINENO: checking command to parse $NM output" >&5 +echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6 +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris* | sysv5*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $host_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. +lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{ +EOF + sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest; then + pipe_works=yes + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -f conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +global_symbol_pipe="$lt_cv_sys_global_symbol_pipe" +if test -z "$lt_cv_sys_global_symbol_pipe"; then + global_symbol_to_cdecl= + global_symbol_to_c_name_address= +else + global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl" + global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address" +fi +if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address"; +then + echo "$as_me:$LINENO: result: failed" >&5 +echo "${ECHO_T}failed" >&6 +else + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 +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 +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f 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 +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +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 + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#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)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo "$as_me:$LINENO: checking for file" >&5 +echo $ECHO_N "checking for file... $ECHO_C" >&6 +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $MAGIC_CMD in + /*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; + ?:/*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path. + ;; + *) + ac_save_MAGIC_CMD="$MAGIC_CMD" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="/usr/bin:$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$ac_save_ifs" + MAGIC_CMD="$ac_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +echo "${ECHO_T}$MAGIC_CMD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # 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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock or --disable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval="$enable_libtool_lock" + +fi; +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 4022 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6 +if test "${lt_cv_cc_needs_belf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + + 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 + + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_cc_needs_belf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +lt_cv_cc_needs_belf=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + 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 + +fi +echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6 + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; + + +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" +need_locks="$enable_libtool_lock" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +if test x"$host" != x"$build"; then + ac_tool_prefix=${host_alias}- +else + ac_tool_prefix= +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case $host_os in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds" + ;; + *) + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking for objdir" >&5 +echo $ECHO_N "checking for objdir... $ECHO_C" >&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$as_me:$LINENO: result: $objdir" >&5 +echo "${ECHO_T}$objdir" >&6 +## +## END FIXME + + +## FIXME: this should be a separate macro +## + +# Check whether --with-pic or --without-pic was given. +if test "${with_pic+set}" = set; then + withval="$with_pic" + pic_mode="$withval" +else + pic_mode=default +fi; +test -z "$pic_mode" && pic_mode=default + +# We assume here that the value for lt_cv_prog_cc_pic will not be cached +# in isolation, and that seeing it set (from the cache) indicates that +# the associated values are set (in the cache) correctly too. +echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6 +if test "${lt_cv_prog_cc_pic+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_pic= + lt_cv_prog_cc_shlib= + lt_cv_prog_cc_wl= + lt_cv_prog_cc_static= + lt_cv_prog_cc_no_builtin= + lt_cv_prog_cc_can_build_shared=$can_build_shared + + if test "$GCC" = yes; then + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-static' + + case $host_os in + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # not sure about C++ programs. + lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC" + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_cv_prog_cc_pic='-fno-common' + ;; + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_cv_prog_cc_pic=-Kconform_pic + fi + ;; + *) + lt_cv_prog_cc_pic='-fPIC' + ;; + esac + else + # PORTME Check for PIC flags for the system compiler. + case $host_os in + aix3* | aix4* | aix5*) + lt_cv_prog_cc_wl='-Wl,' + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_cv_prog_cc_static='-Bstatic' + else + lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better lt_cv_prog_cc_static that works with the bundled CC? + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive" + lt_cv_prog_cc_pic='+Z' + ;; + + irix5* | irix6*) + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_cv_prog_cc_pic='-DDLL_EXPORT' + ;; + + newsos6) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + lt_cv_prog_cc_wl='-Wl,' + lt_cv_prog_cc_static='-non_shared' + ;; + + sco3.2v5*) + lt_cv_prog_cc_pic='-Kpic' + lt_cv_prog_cc_static='-dn' + lt_cv_prog_cc_shlib='-belf' + ;; + + solaris*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Wl,' + ;; + + sunos4*) + lt_cv_prog_cc_pic='-PIC' + lt_cv_prog_cc_static='-Bstatic' + lt_cv_prog_cc_wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + lt_cv_prog_cc_pic='-KPIC' + lt_cv_prog_cc_static='-Bstatic' + if test "x$host_vendor" = xsni; then + lt_cv_prog_cc_wl='-LD' + else + lt_cv_prog_cc_wl='-Wl,' + fi + ;; + + uts4*) + lt_cv_prog_cc_pic='-pic' + lt_cv_prog_cc_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_cv_prog_cc_pic='-Kconform_pic' + lt_cv_prog_cc_static='-Bstatic' + fi + ;; + + *) + lt_cv_prog_cc_can_build_shared=no + ;; + esac + fi + +fi + +if test -z "$lt_cv_prog_cc_pic"; then + echo "$as_me:$LINENO: result: none" >&5 +echo "${ECHO_T}none" >&6 +else + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6 + + # Check to make sure the pic_flag actually works. + echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5 +echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6 + if test "${lt_cv_prog_cc_pic_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + case $host_os in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then + # they create non-PIC objects. So, if there were any warnings, we + # assume that PIC is not supported. + if test -s conftest.err; then + lt_cv_prog_cc_pic_works=no + else + lt_cv_prog_cc_pic_works=yes + fi + ;; + *) + lt_cv_prog_cc_pic_works=yes + ;; + esac + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_prog_cc_pic_works=no + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + +fi + + + if test "X$lt_cv_prog_cc_pic_works" = Xno; then + lt_cv_prog_cc_pic= + lt_cv_prog_cc_can_build_shared=no + else + lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic" + fi + + echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6 +fi +## +## END FIXME + +# Check for any special shared library compilation flags. +if test -n "$lt_cv_prog_cc_shlib"; then + { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5 +echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;} + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then : + else + { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5 +echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;} + lt_cv_prog_cc_can_build_shared=no + fi +fi + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5 +echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6 +if test "${lt_cv_prog_cc_static_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + lt_cv_prog_cc_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + lt_cv_prog_cc_static_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi + + +# Belt *and* braces to stop my trousers falling down: +test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static= +echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5 +echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6 + +pic_flag="$lt_cv_prog_cc_pic" +special_shlib_compile_flags="$lt_cv_prog_cc_shlib" +wl="$lt_cv_prog_cc_wl" +link_static_flag="$lt_cv_prog_cc_static" +no_builtin_flag="$lt_cv_prog_cc_no_builtin" +can_build_shared="$lt_cv_prog_cc_can_build_shared" +## +## END FIXME + + +## FIXME: this should be a separate macro +## +# Check to see if options -o and -c are simultaneously supported by compiler +echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6 +if test "${lt_cv_compiler_c_o+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +echo "int some_variable = 0;" > conftest.$ac_ext +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.$ac_objext" +compiler_c_o=no +if { (eval echo configure:4569: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + lt_cv_compiler_c_o=no + else + lt_cv_compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + lt_cv_compiler_c_o=no +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +fi + +compiler_c_o=$lt_cv_compiler_c_o +echo "$as_me:$LINENO: result: $compiler_c_o" >&5 +echo "${ECHO_T}$compiler_c_o" >&6 + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5 +echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6 + if test "${lt_cv_compiler_o_lo+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + lt_cv_compiler_o_lo=no + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + save_objext="$ac_objext" + ac_objext=lo + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + lt_cv_compiler_o_lo=no + else + lt_cv_compiler_o_lo=yes + fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + ac_objext="$save_objext" + CFLAGS="$save_CFLAGS" + +fi + + compiler_o_lo=$lt_cv_compiler_o_lo + echo "$as_me:$LINENO: result: $compiler_o_lo" >&5 +echo "${ECHO_T}$compiler_o_lo" >&6 +else + compiler_o_lo=no +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$as_me:$LINENO: result: $hard_links" >&5 +echo "${ECHO_T}$hard_links" >&6 + if test "$hard_links" = no; then + { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +if test "$GCC" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6 + echo "int some_variable = 0;" > conftest.$ac_ext + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext" + compiler_rtti_exceptions=no + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int some_variable = 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + compiler_rtti_exceptions=no + else + compiler_rtti_exceptions=yes + fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$save_CFLAGS" + echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5 +echo "${ECHO_T}$compiler_rtti_exceptions" >&6 + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi +fi +## +## END FIXME + +## FIXME: this should be a separate macro +## +# See if the linker supports building shared libraries. +echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5 +echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +old_archive_from_expsyms_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_into_libs=no +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +link_all_deplibs=unknown +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. +extract_expsyms_cmds= + +case $host_os in +cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; +openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case $host_os in + aix3* | aix4* | aix5*) + # On AIX, the GNU linker is very broken + # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available. + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + extract_expsyms_cmds='test -f $output_objdir/impgen.c || \ + sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~ + test -f $output_objdir/impgen.exe || (cd $output_objdir && \ + if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \ + else $CC -o impgen impgen.c ; fi)~ + $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def' + + old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib' + + # cygwin and mingw dlls have different entry points and sets of symbols + # to exclude. + # FIXME: what about values for MSVC? + dll_entry=__cygwin_dll_entry@12 + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~ + case $host_os in + mingw*) + # mingw values + dll_entry=_DllMainCRTStartup@12 + dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~ + ;; + esac + + # mingw and cygwin differ, and it's simplest to just exclude the union + # of the two symbol sets. + dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12 + + # recent cygwin and mingw systems supply a stub DllMain which the user + # can override, but on older systems we have to supply one (in ltdll.c) + if test "x$lt_cv_need_dllmain" = "xyes"; then + ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext " + ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~ + test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~' + else + ltdll_obj= + ltdll_cmds= + fi + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + # Be careful not to strip the DATA tag left be newer dlltools. + export_symbols_cmds="$ltdll_cmds"' + $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols' + + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is. + # If DATA tags from a recent dlltool are present, honour them! + archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname-def; + else + echo EXPORTS > $output_objdir/$soname-def; + _lt_hint=1; + cat $export_symbols | while read symbol; do + set dummy \$symbol; + case \$# in + 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;; + *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;; + esac; + _lt_hint=`expr 1 + \$_lt_hint`; + done; + fi~ + '"$ltdll_cmds"' + $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~ + $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~ + $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw* | pw32*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + hardcode_direct=yes + archive_cmds='' + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + + shared_flag='-shared' + else + # not using gcc + if test "$host_cpu" = ia64; then + shared_flag='${wl}-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall can do strange things, so it is better to + # generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib' + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols" + else + hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib' + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='${wl}-berok' + # This is a bit strange, but is similar to how AIX traditionally builds + # it's shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + ;; + + darwin* | rhapsody*) + case "$host_os" in + rhapsody* | darwin1.[012]) + allow_undefined_flag='-undefined suppress' + ;; + *) # Darwin 1.3 on + allow_undefined_flag='-flat_namespace -undefined suppress' + ;; + esac + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring' + # We need to add '_' to the symbols in $export_symbols first + #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' + hardcode_direct=yes + hardcode_shlibpath_var=no + whole_archive_flag_spec='-all_load $convenience' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case $host_os in + hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp' + + #Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + export_dynamic_flag_spec='${wl}-Bexport' + ;; + + solaris*) + # gcc --version < 3.0 without binutils cannot create self contained + # shared libraries reliably, requiring libgcc.a to resolve some of + # the object symbols generated in some cases. Libraries that use + # assert need libgcc.a to resolve __eprintf, for example. Linking + # a copy of libgcc.a into every shared library to guarantee resolving + # such symbols causes other problems: According to Tim Van Holder + # , C++ libraries end up with a separate + # (to the application) exception stack for one thing. + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + case `$CC --version 2>/dev/null` in + [12].*) + cat <&2 + +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably +*** create self contained shared libraries on Solaris systems, without +*** introducing a dependency on libgcc.a. Therefore, libtool is disabling +*** -no-undefined support, which will at least allow you to build shared +*** libraries. However, you may find that when you link such libraries +*** into an application without using GCC, you have to manually add +*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to +*** upgrade to a newer version of GCC. Another option is to rebuild your +*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer. + +EOF + no_undefined_flag= + ;; + esac + fi + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + if test "x$host_vendor" = xsno; then + archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + else + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + sysv5uw7* | unixware7*) + no_undefined_flag='${wl}-z ${wl}text' + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +echo "${ECHO_T}$ld_shlibs" >&6 +test "$ld_shlibs" = no && can_build_shared=no +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Check hardcoding attributes. +echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$as_me:$LINENO: result: $hardcode_action" >&5 +echo "${ECHO_T}$hardcode_action" >&6 +## +## END FIXME + +## FIXME: this should be a separate macro +## +striplib= +old_striplib= +echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6 +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +## +## END FIXME + +reload_cmds='$LD$reload_flag -o $output$reload_objs' +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +## FIXME: this should be a separate macro +## +# PORTME Fill in your ld.so characteristics +echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6 +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4* | aix5*) + version_type=linux + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can + # not hardcode correct soname into executable. Probably we can + # add versioning support to collect2, so additional links can + # be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}.so$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + need_version=no + need_lib_prefix=no + case $GCC,$host_os in + yes,cygwin*) + library_names_spec='$libname.dll.a' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog .libs/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + ;; + yes,mingw*) + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"` + ;; + yes,pw32*) + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll' + ;; + *) + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + # FIXME: Relying on posixy $() will cause problems for + # cross-compilation, but unfortunately the echo tests do not + # yet detect zsh echo's removal of \ escapes. + library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)' + soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + *) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so' + case $host_os in + irix5*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case "$host_os" in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +echo "${ECHO_T}$dynamic_linker" >&6 +test "$dynamic_linker" = no && can_build_shared=no +## +## END FIXME + +## FIXME: this should be a separate macro +## +# Report the final consequences. +echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $can_build_shared" >&5 +echo "${ECHO_T}$can_build_shared" >&6 +## +## END FIXME + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +echo "$as_me:$LINENO: result: $enable_shared" >&5 +echo "${ECHO_T}$enable_shared" >&6 +## +## END FIXME + +## FIXME: this should be a separate macro +## +echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +echo "$as_me:$LINENO: result: $enable_static" >&5 +echo "${ECHO_T}$enable_static" >&6 +## +## END FIXME + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + cygwin* | mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + *) + echo "$as_me:$LINENO: checking for shl_load" >&5 +echo $ECHO_N "checking for shl_load... $ECHO_C" >&6 +if test "${ac_cv_func_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +/* 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_shl_load) || defined (__stub___shl_load) +choke me +#else +char (*f) () = shl_load; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shl_load; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shl_load=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +echo "${ECHO_T}$ac_cv_func_shl_load" >&6 +if test $ac_cv_func_shl_load = yes; then + lt_cv_dlopen="shl_load" +else + echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main () +{ +shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_shl_load=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_shl_load=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6 +if test $ac_cv_lib_dld_shl_load = yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" +else + echo "$as_me:$LINENO: checking for dlopen" >&5 +echo $ECHO_N "checking for dlopen... $ECHO_C" >&6 +if test "${ac_cv_func_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +/* 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_dlopen) || defined (__stub___dlopen) +choke me +#else +char (*f) () = dlopen; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != dlopen; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_dlopen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +echo "${ECHO_T}$ac_cv_func_dlopen" >&6 +if test $ac_cv_func_dlopen = yes; then + lt_cv_dlopen="dlopen" +else + echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6 +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dl_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dl_dlopen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6 +if test $ac_cv_lib_dl_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6 +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_svld_dlopen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_svld_dlopen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6 +if test $ac_cv_lib_svld_dlopen = yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6 +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main () +{ +dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dld_dld_link=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dld_dld_link=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6 +if test $ac_cv_lib_dld_dld_link = yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self" >&6 + + if test "x$lt_cv_dlopen_self" = xyes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6 + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +## FIXME: this should be a separate macro +## +if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6 + if test "${lt_cv_archive_cmds_need_lc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + $rm conftest* + echo 'static int dummy;' > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_cv_prog_cc_wl + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi +fi + + echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5 +echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6 + ;; + esac +fi +need_lc=${lt_cv_archive_cmds_need_lc-yes} +## +## END FIXME + +## FIXME: this should be a separate macro +## +# The second clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + : +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + test -f Makefile && make "$ltmain" +fi + +if test -f "$ltmain"; then + trap "$rm \"${ofile}T\"; exit 1" 1 2 15 + $rm -f "${ofile}T" + + echo creating $ofile + + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS \ + AR AR_FLAGS CC LD LN_S NM SHELL \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \ + postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \ + old_striplib striplib file_magic_cmd export_symbols_cmds \ + deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + global_symbol_to_c_name_address \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case $var in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + extract_expsyms_cmds | old_archive_from_expsyms_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + cat <<__EOF__ > "${ofile}T" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996-2000 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$need_lc + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# The default C compiler. +CC=$lt_CC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_pic_flag +pic_mode=$pic_mode + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$lt_compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + case $host_os in + aix3*) + cat <<\EOF >> "${ofile}T" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + case $host_os in + cygwin* | mingw* | pw32* | os2*) + cat <<'EOF' >> "${ofile}T" + # This is a source program that is used to create dlls on Windows + # Don't remove nor modify the starting and closing comments +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ + # This is a source program that is used to create import libraries + # on Windows for dlls which lack them. Don't remove nor modify the + # starting and closing comments +# /* impgen.c starts here */ +# /* Copyright (C) 1999-2000 Free Software Foundation, Inc. +# +# This file is part of GNU libtool. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public 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 /* for printf() */ +# #include /* for open(), lseek(), read() */ +# #include /* for O_RDONLY, O_BINARY */ +# #include /* for strdup() */ +# +# /* O_BINARY isn't required (or even defined sometimes) under Unix */ +# #ifndef O_BINARY +# #define O_BINARY 0 +# #endif +# +# static unsigned int +# pe_get16 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[2]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 2); +# return b[0] + (b[1]<<8); +# } +# +# static unsigned int +# pe_get32 (fd, offset) +# int fd; +# int offset; +# { +# unsigned char b[4]; +# lseek (fd, offset, SEEK_SET); +# read (fd, b, 4); +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# static unsigned int +# pe_as32 (ptr) +# void *ptr; +# { +# unsigned char *b = ptr; +# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24); +# } +# +# int +# main (argc, argv) +# int argc; +# char *argv[]; +# { +# int dll; +# unsigned long pe_header_offset, opthdr_ofs, num_entries, i; +# unsigned long export_rva, export_size, nsections, secptr, expptr; +# unsigned long name_rvas, nexp; +# unsigned char *expdata, *erva; +# char *filename, *dll_name; +# +# filename = argv[1]; +# +# dll = open(filename, O_RDONLY|O_BINARY); +# if (dll < 1) +# return 1; +# +# dll_name = filename; +# +# for (i=0; filename[i]; i++) +# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':') +# dll_name = filename + i +1; +# +# pe_header_offset = pe_get32 (dll, 0x3c); +# opthdr_ofs = pe_header_offset + 4 + 20; +# num_entries = pe_get32 (dll, opthdr_ofs + 92); +# +# if (num_entries < 1) /* no exports */ +# return 1; +# +# export_rva = pe_get32 (dll, opthdr_ofs + 96); +# export_size = pe_get32 (dll, opthdr_ofs + 100); +# nsections = pe_get16 (dll, pe_header_offset + 4 +2); +# secptr = (pe_header_offset + 4 + 20 + +# pe_get16 (dll, pe_header_offset + 4 + 16)); +# +# expptr = 0; +# for (i = 0; i < nsections; i++) +# { +# char sname[8]; +# unsigned long secptr1 = secptr + 40 * i; +# unsigned long vaddr = pe_get32 (dll, secptr1 + 12); +# unsigned long vsize = pe_get32 (dll, secptr1 + 16); +# unsigned long fptr = pe_get32 (dll, secptr1 + 20); +# lseek(dll, secptr1, SEEK_SET); +# read(dll, sname, 8); +# if (vaddr <= export_rva && vaddr+vsize > export_rva) +# { +# expptr = fptr + (export_rva - vaddr); +# if (export_rva + export_size > vaddr + vsize) +# export_size = vsize - (export_rva - vaddr); +# break; +# } +# } +# +# expdata = (unsigned char*)malloc(export_size); +# lseek (dll, expptr, SEEK_SET); +# read (dll, expdata, export_size); +# erva = expdata - export_rva; +# +# nexp = pe_as32 (expdata+24); +# name_rvas = pe_as32 (expdata+32); +# +# printf ("EXPORTS\n"); +# for (i = 0; i> "${ofile}T" || (rm -f "${ofile}T"; exit 1) + + mv -f "${ofile}T" "$ofile" || \ + (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T") + chmod +x "$ofile" +fi +## +## END FIXME + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + +gww_nodynamic="no" +gww_needsstatic="no" +gww_needsstaticimages="no" +case "$host" in +*-apple-darwin*) +gww_needsstaticimages="yes" + +cat >>confdefs.h <<\_ACEOF +#define _CursorsMustBe16x16 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define __Mac 1 +_ACEOF + +LIBS="/System/Library/Frameworks/CoreServices.framework/CoreServices $LIBS" + ;; +powerpc-*-*linux*) +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 3 +_ACEOF + + ;; +*sparc*) +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 2 +_ACEOF + + ;; +*-pc-cygwin*) +cat >>confdefs.h <<\_ACEOF +#define _BrokenBitmapImages 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define _ModKeysAutoRepeat 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define __CygWin 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define NODYNAMIC 1 +_ACEOF + +gww_nodynamic="yes" +gww_needsstatic="yes" + + +cat >>confdefs.h <<\_ACEOF +#define _NO_XINPUT 1 +_ACEOF + + ;; +esac + +echo "$as_me:$LINENO: checking for library containing dlopen" >&5 +echo $ECHO_N "checking for library containing dlopen... $ECHO_C" >&6 +if test "${ac_cv_search_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_dlopen=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_dlopen" = no; then + for ac_lib in dl; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_dlopen" >&5 +echo "${ECHO_T}$ac_cv_search_dlopen" >&6 +if test "$ac_cv_search_dlopen" != no; then + test "$ac_cv_search_dlopen" = "none required" || LIBS="$ac_cv_search_dlopen $LIBS" + +fi + echo "$as_me:$LINENO: checking for library containing inet_aton" >&5 +echo $ECHO_N "checking for library containing inet_aton... $ECHO_C" >&6 +if test "${ac_cv_search_inet_aton+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_inet_aton=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char inet_aton (); +int +main () +{ +inet_aton (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_inet_aton="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_inet_aton" = no; then + for ac_lib in resolv; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char inet_aton (); +int +main () +{ +inet_aton (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_inet_aton="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_inet_aton" >&5 +echo "${ECHO_T}$ac_cv_search_inet_aton" >&6 +if test "$ac_cv_search_inet_aton" != no; then + test "$ac_cv_search_inet_aton" = "none required" || LIBS="$ac_cv_search_inet_aton $LIBS" + +fi + echo "$as_me:$LINENO: checking for library containing libiconv" >&5 +echo $ECHO_N "checking for library containing libiconv... $ECHO_C" >&6 +if test "${ac_cv_search_libiconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_libiconv=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libiconv (); +int +main () +{ +libiconv (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_libiconv="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_libiconv" = no; then + for ac_lib in iconv; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libiconv (); +int +main () +{ +libiconv (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_libiconv="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_libiconv" >&5 +echo "${ECHO_T}$ac_cv_search_libiconv" >&6 +if test "$ac_cv_search_libiconv" != no; then + test "$ac_cv_search_libiconv" = "none required" || LIBS="$ac_cv_search_libiconv $LIBS" + +fi + + +FreeType2_IncRoot= +if sh -c "freetype-config --prefix" >/dev/null 2>&1 ; then + FreeType2_IncRoot=`freetype-config --prefix` + as_ac_File=`echo "ac_cv_file_$FreeType2_IncRoot/include/freetype2" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $FreeType2_IncRoot/include/freetype2" >&5 +echo $ECHO_N "checking for $FreeType2_IncRoot/include/freetype2... $ECHO_C" >&6 +if eval "test \"\${$as_ac_File+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "$FreeType2_IncRoot/include/freetype2"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_File'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_File'}'`" >&6 +if test `eval echo '${'$as_ac_File'}'` = yes; then + CFLAGS="$CFLAGS -I$FreeType2_IncRoot/include/freetype2/" +else + FreeType2_IncRoot= +fi + +fi + +if test "FreeType2_IncRoot" = "" >/dev/null 2>&1 ; then + echo "$as_me:$LINENO: checking for /usr/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/include/freetype2"; then + ac_cv_file__usr_include_freetype2=yes +else + ac_cv_file__usr_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_include_freetype2" >&6 +if test $ac_cv_file__usr_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/include/freetype2/" + FreeType2_IncRoot="/usr" + +else + + echo "$as_me:$LINENO: checking for /usr/local/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/local/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_local_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/local/include/freetype2"; then + ac_cv_file__usr_local_include_freetype2=yes +else + ac_cv_file__usr_local_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_local_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_local_include_freetype2" >&6 +if test $ac_cv_file__usr_local_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/freetype2/" + FreeType2_IncRoot="/usr/local/" + +else + + echo "$as_me:$LINENO: checking for /usr/X11R6/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/X11R6/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_X11R6_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/X11R6/include/freetype2"; then + ac_cv_file__usr_X11R6_include_freetype2=yes +else + ac_cv_file__usr_X11R6_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_X11R6_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_X11R6_include_freetype2" >&6 +if test $ac_cv_file__usr_X11R6_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/X11R6/include -I/usr/X11R6/include/freetype2/" + FreeType2_IncRoot="/usr/X11R6/" + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_FREETYPE 1 +_ACEOF + +fi + +fi + +fi + +fi + +echo "$as_me:$LINENO: checking for /usr/include/libxml2/libxml" >&5 +echo $ECHO_N "checking for /usr/include/libxml2/libxml... $ECHO_C" >&6 +if test "${ac_cv_file__usr_include_libxml2_libxml+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/include/libxml2/libxml"; then + ac_cv_file__usr_include_libxml2_libxml=yes +else + ac_cv_file__usr_include_libxml2_libxml=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_include_libxml2_libxml" >&5 +echo "${ECHO_T}$ac_cv_file__usr_include_libxml2_libxml" >&6 +if test $ac_cv_file__usr_include_libxml2_libxml = yes; then + CFLAGS="$CFLAGS -I/usr/include/libxml2/" +else + + echo "$as_me:$LINENO: checking for /usr/local/include/libxml2/libxml" >&5 +echo $ECHO_N "checking for /usr/local/include/libxml2/libxml... $ECHO_C" >&6 +if test "${ac_cv_file__usr_local_include_libxml2_libxml+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/local/include/libxml2/libxml"; then + ac_cv_file__usr_local_include_libxml2_libxml=yes +else + ac_cv_file__usr_local_include_libxml2_libxml=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_local_include_libxml2_libxml" >&5 +echo "${ECHO_T}$ac_cv_file__usr_local_include_libxml2_libxml" >&6 +if test $ac_cv_file__usr_local_include_libxml2_libxml = yes; then + CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/libxml2/" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBXML 1 +_ACEOF + +fi + +fi + + + +echo "$as_me:$LINENO: checking for DGifOpenFileName in -lungif" >&5 +echo $ECHO_N "checking for DGifOpenFileName in -lungif... $ECHO_C" >&6 +if test "${ac_cv_lib_ungif_DGifOpenFileName+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lungif $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char DGifOpenFileName (); +int +main () +{ +DGifOpenFileName (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ungif_DGifOpenFileName=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ungif_DGifOpenFileName=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ungif_DGifOpenFileName" >&5 +echo "${ECHO_T}$ac_cv_lib_ungif_DGifOpenFileName" >&6 +if test $ac_cv_lib_ungif_DGifOpenFileName = yes; then + +echo -n checking for ExtensionBlock.Function in gif_lib.h... +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + ExtensionBlock foo; foo.Function=3; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo " " yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo " " no + ac_cv_lib_ungif_DGifOpenFileName=no + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNGIF 1 +_ACEOF + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNGIF 1 +_ACEOF + +fi + + +echo "$as_me:$LINENO: checking for deflateEnd in -lz" >&5 +echo $ECHO_N "checking for deflateEnd in -lz... $ECHO_C" >&6 +if test "${ac_cv_lib_z_deflateEnd+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char deflateEnd (); +int +main () +{ +deflateEnd (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_z_deflateEnd=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_z_deflateEnd=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_z_deflateEnd" >&5 +echo "${ECHO_T}$ac_cv_lib_z_deflateEnd" >&6 +if test $ac_cv_lib_z_deflateEnd = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBPNG 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for png_create_read_struct in -lpng" >&5 +echo $ECHO_N "checking for png_create_read_struct in -lpng... $ECHO_C" >&6 +if test "${ac_cv_lib_png_png_create_read_struct+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng -lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char png_create_read_struct (); +int +main () +{ +png_create_read_struct (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_png_png_create_read_struct=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_png_png_create_read_struct=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_png_png_create_read_struct" >&5 +echo "${ECHO_T}$ac_cv_lib_png_png_create_read_struct" >&6 +if test $ac_cv_lib_png_png_create_read_struct = yes; then + : +else + + echo "$as_me:$LINENO: checking for png_create_read_struct in -lpng12" >&5 +echo $ECHO_N "checking for png_create_read_struct in -lpng12... $ECHO_C" >&6 +if test "${ac_cv_lib_png12_png_create_read_struct+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng12 -lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char png_create_read_struct (); +int +main () +{ +png_create_read_struct (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_png12_png_create_read_struct=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_png12_png_create_read_struct=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_png12_png_create_read_struct" >&5 +echo "${ECHO_T}$ac_cv_lib_png12_png_create_read_struct" >&6 +if test $ac_cv_lib_png12_png_create_read_struct = yes; then + cat >>confdefs.h <<\_ACEOF +#define _LIBPNG12 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBPNG 1 +_ACEOF + +fi + +fi + +echo "$as_me:$LINENO: checking for jpeg_CreateDecompress in -ljpeg" >&5 +echo $ECHO_N "checking for jpeg_CreateDecompress in -ljpeg... $ECHO_C" >&6 +if test "${ac_cv_lib_jpeg_jpeg_CreateDecompress+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char jpeg_CreateDecompress (); +int +main () +{ +jpeg_CreateDecompress (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_jpeg_jpeg_CreateDecompress=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_jpeg_jpeg_CreateDecompress=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_jpeg_jpeg_CreateDecompress" >&5 +echo "${ECHO_T}$ac_cv_lib_jpeg_jpeg_CreateDecompress" >&6 +if test $ac_cv_lib_jpeg_jpeg_CreateDecompress = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBJPEG 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for TIFFOpen in -ltiff" >&5 +echo $ECHO_N "checking for TIFFOpen in -ltiff... $ECHO_C" >&6 +if test "${ac_cv_lib_tiff_TIFFOpen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char TIFFOpen (); +int +main () +{ +TIFFOpen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_tiff_TIFFOpen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_tiff_TIFFOpen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_tiff_TIFFOpen" >&5 +echo "${ECHO_T}$ac_cv_lib_tiff_TIFFOpen" >&6 +if test $ac_cv_lib_tiff_TIFFOpen = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBTIFF 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for xmlParseFile in -lxml2" >&5 +echo $ECHO_N "checking for xmlParseFile in -lxml2... $ECHO_C" >&6 +if test "${ac_cv_lib_xml2_xmlParseFile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxml2 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char xmlParseFile (); +int +main () +{ +xmlParseFile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_xml2_xmlParseFile=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_xml2_xmlParseFile=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_xml2_xmlParseFile" >&5 +echo "${ECHO_T}$ac_cv_lib_xml2_xmlParseFile" >&6 +if test $ac_cv_lib_xml2_xmlParseFile = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBXML 1 +_ACEOF + +fi + + + +for ac_header in iconv.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +gww_hasbytecode="no" + +# Check whether --with-freetype-bytecode or --without-freetype-bytecode was given. +if test "${with_freetype_bytecode+set}" = set; then + withval="$with_freetype_bytecode" + + gww_hasbytecode="$withval" + +echo "$as_me:$LINENO: checking for FT_New_Memory_Face in -lfreetype" >&5 +echo $ECHO_N "checking for FT_New_Memory_Face in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_FT_New_Memory_Face+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char FT_New_Memory_Face (); +int +main () +{ +FT_New_Memory_Face (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_FT_New_Memory_Face=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_FT_New_Memory_Face=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_New_Memory_Face" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_FT_New_Memory_Face" >&6 +if test $ac_cv_lib_freetype_FT_New_Memory_Face = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBFREETYPE 1 +_ACEOF + + LIBS="-lfreetype $LIBS" + +fi + + +else + + echo "$as_me:$LINENO: checking for FT_New_Memory_Face in -lfreetype" >&5 +echo $ECHO_N "checking for FT_New_Memory_Face in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_FT_New_Memory_Face+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char FT_New_Memory_Face (); +int +main () +{ +FT_New_Memory_Face (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_FT_New_Memory_Face=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_FT_New_Memory_Face=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_New_Memory_Face" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_FT_New_Memory_Face" >&6 +if test $ac_cv_lib_freetype_FT_New_Memory_Face = yes; then + + echo checking for bytecode interpreter in freetype... + echo "$as_me:$LINENO: checking for TT_RunIns in -lfreetype" >&5 +echo $ECHO_N "checking for TT_RunIns in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_TT_RunIns+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char TT_RunIns (); +int +main () +{ +TT_RunIns (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_TT_RunIns=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_TT_RunIns=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_TT_RunIns" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_TT_RunIns" >&6 +if test $ac_cv_lib_freetype_TT_RunIns = yes; then + gww_hasbytecode="yes" +else + : +fi + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_FREETYPE 1 +_ACEOF + +fi + + +fi; +if test "$gww_hasbytecode" = "yes" ; then + echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 +echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6 +if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_create (); +int +main () +{ +pthread_create (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pthread_pthread_create=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pthread_pthread_create=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 +echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6 +if test $ac_cv_lib_pthread_pthread_create = yes; then + LIBS="$LIBS -lpthread" +else + gww_hasbytecode="no" +fi + +fi + +if test \( "$gww_hasbytecode" = "yes" \) -a \( "$FreeType2_IncRoot" != "" \); then + gww_hasbytecode="no" + +# Check whether --with-freetype-src or --without-freetype-src was given. +if test "${with_freetype_src+set}" = set; then + withval="$with_freetype_src" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC="$withval/src/truetype" + echo "$as_me:$LINENO: checking for valid freetype tree" >&5 +echo $ECHO_N "checking for valid freetype tree... $ECHO_C" >&6 + if test -f "$FreeType2_TT_BUILD_INC/ttobjs.h"; then + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + else + echo "$as_me:$LINENO: result: missing ttobjs.h" >&5 +echo "${ECHO_T}missing ttobjs.h" >&6 + echo "Unable to find $FreeType2_TT_BUILD_INC/ttobjs.h" + fi + fi + +else + + echo "$as_me:$LINENO: checking trying to find the freetype source directory -- be patient" >&5 +echo $ECHO_N "checking trying to find the freetype source directory -- be patient... $ECHO_C" >&6 + FreeType2_TT_SRC_DIRs=`find / -name ttobjs.h -print 2>/dev/null |grep 'freetype[^/\]*2[^/\]*/src/truetype/ttobjs.h' | sort -r | sed -e 's/ttobjs.h//'` + for dir in $FreeType2_TT_SRC_DIRs; do + if cmp -s ${dir}../../include/freetype/freetype.h ${FreeType2_IncRoot}/freetype/freetype.h >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC=$dir + break + fi + done + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + for dir in $FreeType2_TT_SRC_DIRs; do + has_goodft2sources="no" + FreeType2_TT_BUILD_INC=$dir + break + done + fi + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + echo " " no + else + echo " " probably + fi + +fi; + if test "$FreeType2_TT_BUILD_INC" \!= "" >/dev/null 2>&1 ; then + if test -f $FreeType2_TT_BUILD_INC/ttdriver.h >/dev/null 2>&1 ; then + CFLAGS="$CFLAGS -I$FreeType2_TT_BUILD_INC" + gww_hasbytecode="yes" + cat >>confdefs.h <<\_ACEOF +#define FREETYPE_HAS_DEBUGGER 1 +_ACEOF + + fi + fi +fi + + +echo "$as_me:$LINENO: checking for snprintf" >&5 +echo $ECHO_N "checking for snprintf... $ECHO_C" >&6 +if test "${ac_cv_func_snprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char snprintf (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char snprintf (); +/* 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_snprintf) || defined (__stub___snprintf) +choke me +#else +char (*f) () = snprintf; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != snprintf; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_snprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_snprintf=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_snprintf" >&5 +echo "${ECHO_T}$ac_cv_func_snprintf" >&6 +if test $ac_cv_func_snprintf = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_SNPRINTF 1 +_ACEOF + +fi + + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* 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"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 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; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_nospace=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_space=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:$LINENO: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main () +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +/* 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_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +char (*f) () = gethostbyname; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != gethostbyname; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +/* 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_connect) || defined (__stub___connect) +choke me +#else +char (*f) () = connect; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != connect; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +int +main () +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:$LINENO: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +/* 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_remove) || defined (__stub___remove) +choke me +#else +char (*f) () = remove; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != remove; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:$LINENO: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +int +main () +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:$LINENO: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +/* 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_shmat) || defined (__stub___shmat) +choke me +#else +char (*f) () = shmat; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shmat; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +int +main () +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (); +int +main () +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + +X_11LIB=-lX11 +if test "$no_x" = "yes"; then + X_11LIB= +else + + echo "$as_me:$LINENO: checking for XOpenDevice in -lXi" >&5 +echo $ECHO_N "checking for XOpenDevice in -lXi... $ECHO_C" >&6 +if test "${ac_cv_lib_Xi_XOpenDevice+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXi $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDevice (); +int +main () +{ +XOpenDevice (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xi_XOpenDevice=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xi_XOpenDevice=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xi_XOpenDevice" >&5 +echo "${ECHO_T}$ac_cv_lib_Xi_XOpenDevice" >&6 +if test $ac_cv_lib_Xi_XOpenDevice = yes; then + X_11LIB="-lXi -lX11" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_XINPUT 1 +_ACEOF + +fi + + echo "$as_me:$LINENO: checking for XkbQueryExtension in -lxkbui" >&5 +echo $ECHO_N "checking for XkbQueryExtension in -lxkbui... $ECHO_C" >&6 +if test "${ac_cv_lib_xkbui_XkbQueryExtension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxkbui $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XkbQueryExtension (); +int +main () +{ +XkbQueryExtension (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_xkbui_XkbQueryExtension=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_xkbui_XkbQueryExtension=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_xkbui_XkbQueryExtension" >&5 +echo "${ECHO_T}$ac_cv_lib_xkbui_XkbQueryExtension" >&6 +if test $ac_cv_lib_xkbui_XkbQueryExtension = yes; then + X_11LIB="$X_11LIB -lxkbui" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_XKB 1 +_ACEOF + +fi + +fi + +echo -n checking for long long ... +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +long long foo=0x400000000000; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define _HAS_LONGLONG 1 +_ACEOF + + echo " " yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo " " no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +gww_regular_link="no" + +# Check whether --with-regular-link or --without-regular-link was given. +if test "${with_regular_link+set}" = set; then + withval="$with_regular_link" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + gww_regular_link="yes" + cat >>confdefs.h <<\_ACEOF +#define NODYNAMIC 1 +_ACEOF + + fi + +else + : +fi; + + + +STATIC_LIBS= +if test "$gww_nodynamic" = "yes" -o "$gww_regular_link" = "yes"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + fi + if test "$ac_cv_lib_freetype_FT_New_Memory_Face" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lfreetype" + fi + if test "$ac_cv_lib_xml2_xmlParseFile" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lxml2" + fi + echo "$as_me:$LINENO: checking for UnicodeNameAnnot in -luninameslist" >&5 +echo $ECHO_N "checking for UnicodeNameAnnot in -luninameslist... $ECHO_C" >&6 +if test "${ac_cv_lib_uninameslist_UnicodeNameAnnot+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-luninameslist $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char UnicodeNameAnnot (); +int +main () +{ +UnicodeNameAnnot (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_uninameslist_UnicodeNameAnnot=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_uninameslist_UnicodeNameAnnot=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_uninameslist_UnicodeNameAnnot" >&5 +echo "${ECHO_T}$ac_cv_lib_uninameslist_UnicodeNameAnnot" >&6 +if test $ac_cv_lib_uninameslist_UnicodeNameAnnot = yes; then + + STATIC_LIBS="$STATIC_LIBS -luninameslist" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBUNINAMESLIST 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNINAMESLIST 1 +_ACEOF + +fi + +fi +if test "$gww_needsstaticimages" = "yes" -a "$gww_regular_link" = "no"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBUNGIF 1 +_ACEOF + + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBPNG 1 +_ACEOF + + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBPNG 1 +_ACEOF + + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBTIFF 1 +_ACEOF + + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBJPEG 1 +_ACEOF + + fi +fi + + +# Check whether --with-multilayer or --without-multilayer was given. +if test "${with_multilayer+set}" = set; then + withval="$with_multilayer" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + cat >>confdefs.h <<\_ACEOF +#define PFAEDIT_CONFIG_TYPE3 1 +_ACEOF + + fi + +else + : +fi; + +test -d libs || mkdir libs + +cp Makefile.dynamic.in Makefile.in +cp Unicode/Makefile.dynamic.in Unicode/Makefile.in +cp gdraw/Makefile.dynamic.in gdraw/Makefile.in +cp pfaedit/Makefile.dynamic.in pfaedit/Makefile.in + ac_config_files="$ac_config_files Makefile Unicode/Makefile gdraw/Makefile pfaedit/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Unicode/Makefile" ) CONFIG_FILES="$CONFIG_FILES Unicode/Makefile" ;; + "gdraw/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdraw/Makefile" ;; + "pfaedit/Makefile" ) CONFIG_FILES="$CONFIG_FILES pfaedit/Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@X_11LIB@,$X_11LIB,;t t +s,@STATIC_LIBS@,$STATIC_LIBS,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + +if test -e umap >/dev/null 2>&1 ; then + cp umap/Makefile.dynamic.in umap/Makefile.in + ac_config_files="$ac_config_files umap/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Unicode/Makefile" ) CONFIG_FILES="$CONFIG_FILES Unicode/Makefile" ;; + "gdraw/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdraw/Makefile" ;; + "pfaedit/Makefile" ) CONFIG_FILES="$CONFIG_FILES pfaedit/Makefile" ;; + "umap/Makefile" ) CONFIG_FILES="$CONFIG_FILES umap/Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@LN_S@,$LN_S,;t t +s,@ECHO@,$ECHO,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@LIBTOOL@,$LIBTOOL,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@X_11LIB@,$X_11LIB,;t t +s,@STATIC_LIBS@,$STATIC_LIBS,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + +fi + +echo Configuration defines: $DEFS +echo CFLAGS: $CFLAGS +if test "$STATIC_LIBS" != ""; then + echo Static Libraries: $STATIC_LIBS +fi + +if test "$no_x" = "yes"; then + echo " *****************************************************************" + echo " * This version of pfaedit will only run scripts. No X libraries *" + echo " * were found so there is NO user interface!!!! If you want a UI *" + echo " * try installing X11 on your system. *" + echo " *****************************************************************" +fi + diff --git a/configure.dynamic.in b/configure.dynamic.in new file mode 100644 index 00000000..338e97bd --- /dev/null +++ b/configure.dynamic.in @@ -0,0 +1,287 @@ +dnl Process this file with autoconf to produce a configure script. + +orig_args="$*" + +AC_INIT(fontforge/pfaedit.h) +AC_PROG_CC +AC_PROG_INSTALL +AC_DISABLE_STATIC +AC_CANONICAL_HOST +AC_PROG_LIBTOOL + +gww_nodynamic="no" +gww_needsstatic="no" +gww_needsstaticimages="no" +case "$host" in +*-apple-darwin*) +gww_needsstaticimages="yes" +dnl Mac doesn't ship with image libraries, so my builds should include +dnl static versions, else users won't have them. Used just to set NODYNAMIC +dnl but I've figured out the dynamic loader now. + +AC_DEFINE(_CursorsMustBe16x16) +AC_DEFINE(_Keyboard,1) +AC_DEFINE(__Mac,1) +LIBS="/System/Library/Frameworks/CoreServices.framework/CoreServices $LIBS" + ;; +powerpc-*-*linux*) +AC_DEFINE(_Keyboard,3) + ;; +*sparc*) +AC_DEFINE(_Keyboard,2) + ;; +*-pc-cygwin*) +AC_DEFINE(_BrokenBitmapImages) +AC_DEFINE(_ModKeysAutoRepeat) +AC_DEFINE(__CygWin,1) +AC_DEFINE(NODYNAMIC) +gww_nodynamic="yes" +gww_needsstatic="yes" + +dnl Although present on my cygwin system the Xi library does not load +dnl and crashes gdb if we attempt to use it. + +AC_DEFINE(_NO_XINPUT) + ;; +esac + +AC_SEARCH_LIBS(dlopen, dl) dnl some systems have this in libc (Darwin uses dyld) +AC_SEARCH_LIBS(inet_aton, resolv) dnl some systems have this in libc +AC_SEARCH_LIBS(libiconv, iconv) dnl linux has iconv in libc, mac,solaris have libiconv in libiconv, and a define to map iconv() to libiconv(), so we can't do the obvious check + +dnl Is there a better way to add a directory to the include path? + +FreeType2_IncRoot= +if sh -c "freetype-config --prefix" >/dev/null 2>&1 ; then + FreeType2_IncRoot=`freetype-config --prefix` + AC_CHECK_FILE($FreeType2_IncRoot/include/freetype2,CFLAGS="$CFLAGS -I$FreeType2_IncRoot/include/freetype2/",FreeType2_IncRoot=) +fi + +if test "FreeType2_IncRoot" = "" >/dev/null 2>&1 ; then + AC_CHECK_FILE(/usr/include/freetype2,[CFLAGS="$CFLAGS -I/usr/include/freetype2/" + FreeType2_IncRoot="/usr" + ],[ + AC_CHECK_FILE(/usr/local/include/freetype2,[CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/freetype2/" + FreeType2_IncRoot="/usr/local/" + ],[ + AC_CHECK_FILE(/usr/X11R6/include/freetype2,[CFLAGS="$CFLAGS -I/usr/X11R6/include -I/usr/X11R6/include/freetype2/" + FreeType2_IncRoot="/usr/X11R6/" + ],AC_DEFINE(_NO_FREETYPE))])]) +fi + +AC_CHECK_FILE(/usr/include/libxml2/libxml,[CFLAGS="$CFLAGS -I/usr/include/libxml2/"],[ + AC_CHECK_FILE(/usr/local/include/libxml2/libxml,[CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/libxml2/"], + AC_DEFINE(_NO_LIBXML))]) + +dnl Some old versions of lib(un)gif don't work for us, they've got the +dnl Function argument in the wrong place. So two checks for gif. + +AC_CHECK_LIB(ungif, DGifOpenFileName, [ +echo -n checking for ExtensionBlock.Function in gif_lib.h... +AC_TRY_COMPILE([#include ], [ ExtensionBlock foo; foo.Function=3; ], echo " " yes , [echo " " no + ac_cv_lib_ungif_DGifOpenFileName=no + AC_DEFINE(_NO_LIBUNGIF)]) +] , AC_DEFINE(_NO_LIBUNGIF)) + +AC_CHECK_LIB(z, deflateEnd, : ,AC_DEFINE(_NO_LIBPNG), -lm) +AC_CHECK_LIB(png, png_create_read_struct, : ,[ + AC_CHECK_LIB(png12, png_create_read_struct, AC_DEFINE(_LIBPNG12), AC_DEFINE(_NO_LIBPNG), -lz -lm)], -lz -lm) +AC_CHECK_LIB(jpeg, jpeg_CreateDecompress, : ,AC_DEFINE(_NO_LIBJPEG)) +AC_CHECK_LIB(tiff, TIFFOpen, : , AC_DEFINE(_NO_LIBTIFF), -lm ) +AC_CHECK_LIB(xml2, xmlParseFile, : , AC_DEFINE(_NO_LIBXML)) + +AC_CHECK_HEADERS([iconv.h]) + +gww_hasbytecode="no" +AC_ARG_WITH(freetype-bytecode, + [ --with-freetype-bytecode Control whether we build with the bytecode interpreter], + [ + gww_hasbytecode="$withval" + AC_CHECK_LIB(freetype, FT_New_Memory_Face) + ], + [ + AC_CHECK_LIB(freetype, FT_New_Memory_Face, [ + echo checking for bytecode interpreter in freetype... + AC_CHECK_LIB(freetype, TT_RunIns, gww_hasbytecode="yes", : )], + AC_DEFINE(_NO_FREETYPE)) + ]) +if test "$gww_hasbytecode" = "yes" ; then + AC_CHECK_LIB(pthread, pthread_create, LIBS="$LIBS -lpthread", gww_hasbytecode="no") +fi + +if test \( "$gww_hasbytecode" = "yes" \) -a \( "$FreeType2_IncRoot" != "" \); then + gww_hasbytecode="no" + AC_ARG_WITH(freetype-src, + [ --with-freetype-src=dir Specify freetype source directory], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC="$withval/src/truetype" + AC_MSG_CHECKING(for valid freetype tree) + if test -f "$FreeType2_TT_BUILD_INC/ttobjs.h"; then + AC_MSG_RESULT(ok) + else + AC_MSG_RESULT(missing ttobjs.h) + echo "Unable to find $FreeType2_TT_BUILD_INC/ttobjs.h" + fi + fi + ], + [ + dnl guess directory + AC_MSG_CHECKING(trying to find the freetype source directory -- be patient) + FreeType2_TT_SRC_DIRs=`find / -name ttobjs.h -print 2>/dev/null |grep '[freetype[^/\]*2[^/\]*/src/truetype/ttobjs.h]' | sort -r | sed -e 's/ttobjs.h//'` + for dir in $FreeType2_TT_SRC_DIRs; do + if cmp -s ${dir}../../include/freetype/freetype.h ${FreeType2_IncRoot}/freetype/freetype.h >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC=$dir + break + fi + done + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + for dir in $FreeType2_TT_SRC_DIRs; do + has_goodft2sources="no" + FreeType2_TT_BUILD_INC=$dir + break + done + fi + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + echo " " no + else + echo " " probably + fi + ]) + if test "$FreeType2_TT_BUILD_INC" \!= "" >/dev/null 2>&1 ; then + if test -f $FreeType2_TT_BUILD_INC/ttdriver.h >/dev/null 2>&1 ; then + CFLAGS="$CFLAGS -I$FreeType2_TT_BUILD_INC" + gww_hasbytecode="yes" + AC_DEFINE(FREETYPE_HAS_DEBUGGER) + fi + fi +fi + +dnl older libc's don't have snprintf + +AC_CHECK_FUNC(snprintf, : , AC_DEFINE(_NO_SNPRINTF)) + +AC_C_CONST +AC_PATH_XTRA +AC_SUBST(X_11LIB) +X_11LIB=-lX11 +if test "$no_x" = "yes"; then + X_11LIB= +else + dnl AC_CHECK_HEADER("X11/extensions/XInput.h", : ,AC_DEFINE(_NO_XINPUT),) + dnl AC_CHECK_HEADER("X11/extensions/XI.h", : ,AC_DEFINE(_NO_XINPUT),) + dnl /usr/share/doc/XFree86-doc-4.2.0/Xi/lib.PS + + AC_CHECK_LIB(Xi, XOpenDevice, X_11LIB="-lXi -lX11" ,AC_DEFINE(_NO_XINPUT), $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 ) + AC_CHECK_LIB(xkbui, XkbQueryExtension, X_11LIB="$X_11LIB -lxkbui" ,AC_DEFINE(_NO_XKB), $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 ) +fi + +echo -n checking for long long ... +AC_TRY_COMPILE(,[long long foo=0x400000000000;],[ AC_DEFINE(_HAS_LONGLONG) + echo " " yes] , echo " " no ) + +gww_regular_link="no" +AC_ARG_WITH(regular-link, + [ --with-regular-link Don't try to dlopen libraries], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + gww_regular_link="yes" + AC_DEFINE(NODYNAMIC) + fi + ], : ) + +dnl If we can't/don't want to use dynamic libraries then we must link with +dnl the static libraries we've found + +AC_SUBST(STATIC_LIBS) +STATIC_LIBS= +if test "$gww_nodynamic" = "yes" -o "$gww_regular_link" = "yes"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + fi + if test "$ac_cv_lib_freetype_FT_New_Memory_Face" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lfreetype" + fi + if test "$ac_cv_lib_xml2_xmlParseFile" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lxml2" + fi + AC_CHECK_LIB(uninameslist, UnicodeNameAnnot, [ + STATIC_LIBS="$STATIC_LIBS -luninameslist" + AC_DEFINE(_STATIC_LIBUNINAMESLIST) ] , AC_DEFINE(_NO_LIBUNINAMESLIST)) +fi +if test "$gww_needsstaticimages" = "yes" -a "$gww_regular_link" = "no"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + AC_DEFINE(_STATIC_LIBUNGIF) + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + AC_DEFINE(_STATIC_LIBPNG) + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + AC_DEFINE(_STATIC_LIBPNG) + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + AC_DEFINE(_STATIC_LIBTIFF) + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + AC_DEFINE(_STATIC_LIBJPEG) + fi +fi + +AC_ARG_WITH(multilayer, + [ --with-multilayer Control whether we build with support for type3/svg fonts containing multilayered drawing with strokes, fills, images, etc.], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + AC_DEFINE(FONTFORGE_CONFIG_TYPE3) + fi + ], : ) + +test -d libs || mkdir libs + +cp Makefile.dynamic.in Makefile.in +cp Unicode/Makefile.dynamic.in Unicode/Makefile.in +cp gdraw/Makefile.dynamic.in gdraw/Makefile.in +cp fontforge/Makefile.dynamic.in fontforge/Makefile.in +AC_OUTPUT(Makefile Unicode/Makefile gdraw/Makefile fontforge/Makefile) +if test -e umap >/dev/null 2>&1 ; then + cp umap/Makefile.dynamic.in umap/Makefile.in + AC_OUTPUT( umap/Makefile ) +fi + +echo Configuration defines: $DEFS +echo CFLAGS: $CFLAGS +if test "$STATIC_LIBS" != ""; then + echo Static Libraries: $STATIC_LIBS +fi + +if test "$no_x" = "yes"; then + echo " *******************************************************************" + echo " * This version of fontforge will only run scripts. No X libraries *" + echo " * were found so there is NO user interface!!!!! If you want a UI *" + echo " * try installing X11 on your system. *" + echo " *******************************************************************" +fi + +dnl EOF diff --git a/configure.in b/configure.in new file mode 100644 index 00000000..338e97bd --- /dev/null +++ b/configure.in @@ -0,0 +1,287 @@ +dnl Process this file with autoconf to produce a configure script. + +orig_args="$*" + +AC_INIT(fontforge/pfaedit.h) +AC_PROG_CC +AC_PROG_INSTALL +AC_DISABLE_STATIC +AC_CANONICAL_HOST +AC_PROG_LIBTOOL + +gww_nodynamic="no" +gww_needsstatic="no" +gww_needsstaticimages="no" +case "$host" in +*-apple-darwin*) +gww_needsstaticimages="yes" +dnl Mac doesn't ship with image libraries, so my builds should include +dnl static versions, else users won't have them. Used just to set NODYNAMIC +dnl but I've figured out the dynamic loader now. + +AC_DEFINE(_CursorsMustBe16x16) +AC_DEFINE(_Keyboard,1) +AC_DEFINE(__Mac,1) +LIBS="/System/Library/Frameworks/CoreServices.framework/CoreServices $LIBS" + ;; +powerpc-*-*linux*) +AC_DEFINE(_Keyboard,3) + ;; +*sparc*) +AC_DEFINE(_Keyboard,2) + ;; +*-pc-cygwin*) +AC_DEFINE(_BrokenBitmapImages) +AC_DEFINE(_ModKeysAutoRepeat) +AC_DEFINE(__CygWin,1) +AC_DEFINE(NODYNAMIC) +gww_nodynamic="yes" +gww_needsstatic="yes" + +dnl Although present on my cygwin system the Xi library does not load +dnl and crashes gdb if we attempt to use it. + +AC_DEFINE(_NO_XINPUT) + ;; +esac + +AC_SEARCH_LIBS(dlopen, dl) dnl some systems have this in libc (Darwin uses dyld) +AC_SEARCH_LIBS(inet_aton, resolv) dnl some systems have this in libc +AC_SEARCH_LIBS(libiconv, iconv) dnl linux has iconv in libc, mac,solaris have libiconv in libiconv, and a define to map iconv() to libiconv(), so we can't do the obvious check + +dnl Is there a better way to add a directory to the include path? + +FreeType2_IncRoot= +if sh -c "freetype-config --prefix" >/dev/null 2>&1 ; then + FreeType2_IncRoot=`freetype-config --prefix` + AC_CHECK_FILE($FreeType2_IncRoot/include/freetype2,CFLAGS="$CFLAGS -I$FreeType2_IncRoot/include/freetype2/",FreeType2_IncRoot=) +fi + +if test "FreeType2_IncRoot" = "" >/dev/null 2>&1 ; then + AC_CHECK_FILE(/usr/include/freetype2,[CFLAGS="$CFLAGS -I/usr/include/freetype2/" + FreeType2_IncRoot="/usr" + ],[ + AC_CHECK_FILE(/usr/local/include/freetype2,[CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/freetype2/" + FreeType2_IncRoot="/usr/local/" + ],[ + AC_CHECK_FILE(/usr/X11R6/include/freetype2,[CFLAGS="$CFLAGS -I/usr/X11R6/include -I/usr/X11R6/include/freetype2/" + FreeType2_IncRoot="/usr/X11R6/" + ],AC_DEFINE(_NO_FREETYPE))])]) +fi + +AC_CHECK_FILE(/usr/include/libxml2/libxml,[CFLAGS="$CFLAGS -I/usr/include/libxml2/"],[ + AC_CHECK_FILE(/usr/local/include/libxml2/libxml,[CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/libxml2/"], + AC_DEFINE(_NO_LIBXML))]) + +dnl Some old versions of lib(un)gif don't work for us, they've got the +dnl Function argument in the wrong place. So two checks for gif. + +AC_CHECK_LIB(ungif, DGifOpenFileName, [ +echo -n checking for ExtensionBlock.Function in gif_lib.h... +AC_TRY_COMPILE([#include ], [ ExtensionBlock foo; foo.Function=3; ], echo " " yes , [echo " " no + ac_cv_lib_ungif_DGifOpenFileName=no + AC_DEFINE(_NO_LIBUNGIF)]) +] , AC_DEFINE(_NO_LIBUNGIF)) + +AC_CHECK_LIB(z, deflateEnd, : ,AC_DEFINE(_NO_LIBPNG), -lm) +AC_CHECK_LIB(png, png_create_read_struct, : ,[ + AC_CHECK_LIB(png12, png_create_read_struct, AC_DEFINE(_LIBPNG12), AC_DEFINE(_NO_LIBPNG), -lz -lm)], -lz -lm) +AC_CHECK_LIB(jpeg, jpeg_CreateDecompress, : ,AC_DEFINE(_NO_LIBJPEG)) +AC_CHECK_LIB(tiff, TIFFOpen, : , AC_DEFINE(_NO_LIBTIFF), -lm ) +AC_CHECK_LIB(xml2, xmlParseFile, : , AC_DEFINE(_NO_LIBXML)) + +AC_CHECK_HEADERS([iconv.h]) + +gww_hasbytecode="no" +AC_ARG_WITH(freetype-bytecode, + [ --with-freetype-bytecode Control whether we build with the bytecode interpreter], + [ + gww_hasbytecode="$withval" + AC_CHECK_LIB(freetype, FT_New_Memory_Face) + ], + [ + AC_CHECK_LIB(freetype, FT_New_Memory_Face, [ + echo checking for bytecode interpreter in freetype... + AC_CHECK_LIB(freetype, TT_RunIns, gww_hasbytecode="yes", : )], + AC_DEFINE(_NO_FREETYPE)) + ]) +if test "$gww_hasbytecode" = "yes" ; then + AC_CHECK_LIB(pthread, pthread_create, LIBS="$LIBS -lpthread", gww_hasbytecode="no") +fi + +if test \( "$gww_hasbytecode" = "yes" \) -a \( "$FreeType2_IncRoot" != "" \); then + gww_hasbytecode="no" + AC_ARG_WITH(freetype-src, + [ --with-freetype-src=dir Specify freetype source directory], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC="$withval/src/truetype" + AC_MSG_CHECKING(for valid freetype tree) + if test -f "$FreeType2_TT_BUILD_INC/ttobjs.h"; then + AC_MSG_RESULT(ok) + else + AC_MSG_RESULT(missing ttobjs.h) + echo "Unable to find $FreeType2_TT_BUILD_INC/ttobjs.h" + fi + fi + ], + [ + dnl guess directory + AC_MSG_CHECKING(trying to find the freetype source directory -- be patient) + FreeType2_TT_SRC_DIRs=`find / -name ttobjs.h -print 2>/dev/null |grep '[freetype[^/\]*2[^/\]*/src/truetype/ttobjs.h]' | sort -r | sed -e 's/ttobjs.h//'` + for dir in $FreeType2_TT_SRC_DIRs; do + if cmp -s ${dir}../../include/freetype/freetype.h ${FreeType2_IncRoot}/freetype/freetype.h >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC=$dir + break + fi + done + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + for dir in $FreeType2_TT_SRC_DIRs; do + has_goodft2sources="no" + FreeType2_TT_BUILD_INC=$dir + break + done + fi + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + echo " " no + else + echo " " probably + fi + ]) + if test "$FreeType2_TT_BUILD_INC" \!= "" >/dev/null 2>&1 ; then + if test -f $FreeType2_TT_BUILD_INC/ttdriver.h >/dev/null 2>&1 ; then + CFLAGS="$CFLAGS -I$FreeType2_TT_BUILD_INC" + gww_hasbytecode="yes" + AC_DEFINE(FREETYPE_HAS_DEBUGGER) + fi + fi +fi + +dnl older libc's don't have snprintf + +AC_CHECK_FUNC(snprintf, : , AC_DEFINE(_NO_SNPRINTF)) + +AC_C_CONST +AC_PATH_XTRA +AC_SUBST(X_11LIB) +X_11LIB=-lX11 +if test "$no_x" = "yes"; then + X_11LIB= +else + dnl AC_CHECK_HEADER("X11/extensions/XInput.h", : ,AC_DEFINE(_NO_XINPUT),) + dnl AC_CHECK_HEADER("X11/extensions/XI.h", : ,AC_DEFINE(_NO_XINPUT),) + dnl /usr/share/doc/XFree86-doc-4.2.0/Xi/lib.PS + + AC_CHECK_LIB(Xi, XOpenDevice, X_11LIB="-lXi -lX11" ,AC_DEFINE(_NO_XINPUT), $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 ) + AC_CHECK_LIB(xkbui, XkbQueryExtension, X_11LIB="$X_11LIB -lxkbui" ,AC_DEFINE(_NO_XKB), $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 ) +fi + +echo -n checking for long long ... +AC_TRY_COMPILE(,[long long foo=0x400000000000;],[ AC_DEFINE(_HAS_LONGLONG) + echo " " yes] , echo " " no ) + +gww_regular_link="no" +AC_ARG_WITH(regular-link, + [ --with-regular-link Don't try to dlopen libraries], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + gww_regular_link="yes" + AC_DEFINE(NODYNAMIC) + fi + ], : ) + +dnl If we can't/don't want to use dynamic libraries then we must link with +dnl the static libraries we've found + +AC_SUBST(STATIC_LIBS) +STATIC_LIBS= +if test "$gww_nodynamic" = "yes" -o "$gww_regular_link" = "yes"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + fi + if test "$ac_cv_lib_freetype_FT_New_Memory_Face" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lfreetype" + fi + if test "$ac_cv_lib_xml2_xmlParseFile" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lxml2" + fi + AC_CHECK_LIB(uninameslist, UnicodeNameAnnot, [ + STATIC_LIBS="$STATIC_LIBS -luninameslist" + AC_DEFINE(_STATIC_LIBUNINAMESLIST) ] , AC_DEFINE(_NO_LIBUNINAMESLIST)) +fi +if test "$gww_needsstaticimages" = "yes" -a "$gww_regular_link" = "no"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + AC_DEFINE(_STATIC_LIBUNGIF) + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + AC_DEFINE(_STATIC_LIBPNG) + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + AC_DEFINE(_STATIC_LIBPNG) + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + AC_DEFINE(_STATIC_LIBTIFF) + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + AC_DEFINE(_STATIC_LIBJPEG) + fi +fi + +AC_ARG_WITH(multilayer, + [ --with-multilayer Control whether we build with support for type3/svg fonts containing multilayered drawing with strokes, fills, images, etc.], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + AC_DEFINE(FONTFORGE_CONFIG_TYPE3) + fi + ], : ) + +test -d libs || mkdir libs + +cp Makefile.dynamic.in Makefile.in +cp Unicode/Makefile.dynamic.in Unicode/Makefile.in +cp gdraw/Makefile.dynamic.in gdraw/Makefile.in +cp fontforge/Makefile.dynamic.in fontforge/Makefile.in +AC_OUTPUT(Makefile Unicode/Makefile gdraw/Makefile fontforge/Makefile) +if test -e umap >/dev/null 2>&1 ; then + cp umap/Makefile.dynamic.in umap/Makefile.in + AC_OUTPUT( umap/Makefile ) +fi + +echo Configuration defines: $DEFS +echo CFLAGS: $CFLAGS +if test "$STATIC_LIBS" != ""; then + echo Static Libraries: $STATIC_LIBS +fi + +if test "$no_x" = "yes"; then + echo " *******************************************************************" + echo " * This version of fontforge will only run scripts. No X libraries *" + echo " * were found so there is NO user interface!!!!! If you want a UI *" + echo " * try installing X11 on your system. *" + echo " *******************************************************************" +fi + +dnl EOF diff --git a/configure.static b/configure.static new file mode 100755 index 00000000..b209ad25 --- /dev/null +++ b/configure.static @@ -0,0 +1,7656 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.57. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +# 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 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="pfaedit/pfaedit.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os CPP EGREP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS X_11LIB STATIC_LIBS LIBOBJS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# 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. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +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 + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -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 | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$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 ;; + + -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 ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + 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 ;; + + -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=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 ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + 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'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +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 + 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 + + +# 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 its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + 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 + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# 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 \`..'] + +_ACEOF + + cat <<_ACEOF +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] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --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] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-freetype-src=dir Specify freetype source directory + --with-x use the X Window System + --with-multilayer Control whether we build with support for type3/svg fonts containing multilayered drawing with strokes, fills, images, etc. + +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 + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP 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. + +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style 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 + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +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 0 +fi +exec 5>config.log +cat >&5 <<_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.57. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +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` +hostinfo = `(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=. + echo "PATH: $as_dir" +done + +} >&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_sep= +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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core core.* *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >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 + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +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 `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +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 + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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=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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$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" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +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 + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + 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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out 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. +echo "$as_me:$LINENO: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$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 +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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; +} +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 +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest.$ac_ext +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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}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 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + +gww_nodynamic="no" +gww_needsstatic="no" +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 + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +case "$host" in +*-apple-darwin*) cat >>confdefs.h <<\_ACEOF +#define NODYNAMIC 1 +_ACEOF + +gww_nodynamic="yes" +cat >>confdefs.h <<\_ACEOF +#define _CursorsMustBe16x16 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define __Mac 1 +_ACEOF + +LIBS="/System/Library/Frameworks/CoreServices.framework/CoreServices $LIBS" + ;; +powerpc-*-*linux*) +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 3 +_ACEOF + + ;; +*sparc*) +cat >>confdefs.h <<\_ACEOF +#define _Keyboard 2 +_ACEOF + + ;; +*-pc-cygwin*) +cat >>confdefs.h <<\_ACEOF +#define _BrokenBitmapImages 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define _ModKeysAutoRepeat 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define __CygWin 1 +_ACEOF + +cat >>confdefs.h <<\_ACEOF +#define NODYNAMIC 1 +_ACEOF + +gww_nodynamic="yes" +gww_needsstatic="yes" + ;; +esac + + +echo "$as_me:$LINENO: checking for library containing dlopen" >&5 +echo $ECHO_N "checking for library containing dlopen... $ECHO_C" >&6 +if test "${ac_cv_search_dlopen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_dlopen=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_dlopen" = no; then + for ac_lib in dl; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main () +{ +dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_dlopen="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_dlopen" >&5 +echo "${ECHO_T}$ac_cv_search_dlopen" >&6 +if test "$ac_cv_search_dlopen" != no; then + test "$ac_cv_search_dlopen" = "none required" || LIBS="$ac_cv_search_dlopen $LIBS" + +fi + echo "$as_me:$LINENO: checking for library containing inet_aton" >&5 +echo $ECHO_N "checking for library containing inet_aton... $ECHO_C" >&6 +if test "${ac_cv_search_inet_aton+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_inet_aton=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char inet_aton (); +int +main () +{ +inet_aton (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_inet_aton="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_inet_aton" = no; then + for ac_lib in resolv; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char inet_aton (); +int +main () +{ +inet_aton (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_inet_aton="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_inet_aton" >&5 +echo "${ECHO_T}$ac_cv_search_inet_aton" >&6 +if test "$ac_cv_search_inet_aton" != no; then + test "$ac_cv_search_inet_aton" = "none required" || LIBS="$ac_cv_search_inet_aton $LIBS" + +fi + echo "$as_me:$LINENO: checking for library containing libiconv" >&5 +echo $ECHO_N "checking for library containing libiconv... $ECHO_C" >&6 +if test "${ac_cv_search_libiconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_func_search_save_LIBS=$LIBS +ac_cv_search_libiconv=no +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libiconv (); +int +main () +{ +libiconv (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_libiconv="none required" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_search_libiconv" = no; then + for ac_lib in iconv; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char libiconv (); +int +main () +{ +libiconv (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_search_libiconv="-l$ac_lib" +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_libiconv" >&5 +echo "${ECHO_T}$ac_cv_search_libiconv" >&6 +if test "$ac_cv_search_libiconv" != no; then + test "$ac_cv_search_libiconv" = "none required" || LIBS="$ac_cv_search_libiconv $LIBS" + +fi + + +FreeType2_IncRoot= +if sh -c "freetype-config --prefix" >/dev/null 2>&1 ; then + FreeType2_IncRoot=`freetype-config --prefix` + as_ac_File=`echo "ac_cv_file_$FreeType2_IncRoot/include/freetype2" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $FreeType2_IncRoot/include/freetype2" >&5 +echo $ECHO_N "checking for $FreeType2_IncRoot/include/freetype2... $ECHO_C" >&6 +if eval "test \"\${$as_ac_File+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "$FreeType2_IncRoot/include/freetype2"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_File'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_File'}'`" >&6 +if test `eval echo '${'$as_ac_File'}'` = yes; then + CFLAGS="$CFLAGS -I$FreeType2_IncRoot/include/freetype2/" +else + FreeType2_IncRoot= +fi + +fi + +if test "FreeType2_IncRoot" = "" >/dev/null 2>&1 ; then + echo "$as_me:$LINENO: checking for /usr/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/include/freetype2"; then + ac_cv_file__usr_include_freetype2=yes +else + ac_cv_file__usr_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_include_freetype2" >&6 +if test $ac_cv_file__usr_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/include/freetype2/" + FreeType2_IncRoot="/usr" + +else + + echo "$as_me:$LINENO: checking for /usr/local/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/local/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_local_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/local/include/freetype2"; then + ac_cv_file__usr_local_include_freetype2=yes +else + ac_cv_file__usr_local_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_local_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_local_include_freetype2" >&6 +if test $ac_cv_file__usr_local_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/freetype2/" + FreeType2_IncRoot="/usr/local/" + +else + + echo "$as_me:$LINENO: checking for /usr/X11R6/include/freetype2" >&5 +echo $ECHO_N "checking for /usr/X11R6/include/freetype2... $ECHO_C" >&6 +if test "${ac_cv_file__usr_X11R6_include_freetype2+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/X11R6/include/freetype2"; then + ac_cv_file__usr_X11R6_include_freetype2=yes +else + ac_cv_file__usr_X11R6_include_freetype2=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_X11R6_include_freetype2" >&5 +echo "${ECHO_T}$ac_cv_file__usr_X11R6_include_freetype2" >&6 +if test $ac_cv_file__usr_X11R6_include_freetype2 = yes; then + CFLAGS="$CFLAGS -I/usr/X11R6/include -I/usr/X11R6/include/freetype2/" + FreeType2_IncRoot="/usr/X11R6/" + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_FREETYPE 1 +_ACEOF + +fi + +fi + +fi + +fi + +echo "$as_me:$LINENO: checking for /usr/include/libxml2/libxml" >&5 +echo $ECHO_N "checking for /usr/include/libxml2/libxml... $ECHO_C" >&6 +if test "${ac_cv_file__usr_include_libxml2_libxml+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/include/libxml2/libxml"; then + ac_cv_file__usr_include_libxml2_libxml=yes +else + ac_cv_file__usr_include_libxml2_libxml=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_include_libxml2_libxml" >&5 +echo "${ECHO_T}$ac_cv_file__usr_include_libxml2_libxml" >&6 +if test $ac_cv_file__usr_include_libxml2_libxml = yes; then + CFLAGS="$CFLAGS -I/usr/include/libxml2/" +else + + echo "$as_me:$LINENO: checking for /usr/local/include/libxml2/libxml" >&5 +echo $ECHO_N "checking for /usr/local/include/libxml2/libxml... $ECHO_C" >&6 +if test "${ac_cv_file__usr_local_include_libxml2_libxml+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + test "$cross_compiling" = yes && + { { echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/usr/local/include/libxml2/libxml"; then + ac_cv_file__usr_local_include_libxml2_libxml=yes +else + ac_cv_file__usr_local_include_libxml2_libxml=no +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_file__usr_local_include_libxml2_libxml" >&5 +echo "${ECHO_T}$ac_cv_file__usr_local_include_libxml2_libxml" >&6 +if test $ac_cv_file__usr_local_include_libxml2_libxml = yes; then + CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/libxml2/" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBXML 1 +_ACEOF + +fi + +fi + + + +echo "$as_me:$LINENO: checking for DGifOpenFileName in -lungif" >&5 +echo $ECHO_N "checking for DGifOpenFileName in -lungif... $ECHO_C" >&6 +if test "${ac_cv_lib_ungif_DGifOpenFileName+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lungif $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char DGifOpenFileName (); +int +main () +{ +DGifOpenFileName (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ungif_DGifOpenFileName=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ungif_DGifOpenFileName=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ungif_DGifOpenFileName" >&5 +echo "${ECHO_T}$ac_cv_lib_ungif_DGifOpenFileName" >&6 +if test $ac_cv_lib_ungif_DGifOpenFileName = yes; then + +echo -n checking for ExtensionBlock.Function in gif_lib.h... +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ + ExtensionBlock foo; foo.Function=3; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo " " yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo " " no + ac_cv_lib_ungif_DGifOpenFileName=no + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNGIF 1 +_ACEOF + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNGIF 1 +_ACEOF + +fi + + +echo "$as_me:$LINENO: checking for deflateEnd in -lz" >&5 +echo $ECHO_N "checking for deflateEnd in -lz... $ECHO_C" >&6 +if test "${ac_cv_lib_z_deflateEnd+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char deflateEnd (); +int +main () +{ +deflateEnd (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_z_deflateEnd=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_z_deflateEnd=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_z_deflateEnd" >&5 +echo "${ECHO_T}$ac_cv_lib_z_deflateEnd" >&6 +if test $ac_cv_lib_z_deflateEnd = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBPNG 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for png_create_read_struct in -lpng" >&5 +echo $ECHO_N "checking for png_create_read_struct in -lpng... $ECHO_C" >&6 +if test "${ac_cv_lib_png_png_create_read_struct+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng -lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char png_create_read_struct (); +int +main () +{ +png_create_read_struct (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_png_png_create_read_struct=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_png_png_create_read_struct=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_png_png_create_read_struct" >&5 +echo "${ECHO_T}$ac_cv_lib_png_png_create_read_struct" >&6 +if test $ac_cv_lib_png_png_create_read_struct = yes; then + : +else + + echo "$as_me:$LINENO: checking for png_create_read_struct in -lpng12" >&5 +echo $ECHO_N "checking for png_create_read_struct in -lpng12... $ECHO_C" >&6 +if test "${ac_cv_lib_png12_png_create_read_struct+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng12 -lz -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char png_create_read_struct (); +int +main () +{ +png_create_read_struct (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_png12_png_create_read_struct=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_png12_png_create_read_struct=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_png12_png_create_read_struct" >&5 +echo "${ECHO_T}$ac_cv_lib_png12_png_create_read_struct" >&6 +if test $ac_cv_lib_png12_png_create_read_struct = yes; then + cat >>confdefs.h <<\_ACEOF +#define _LIBPNG12 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBPNG 1 +_ACEOF + +fi + +fi + +echo "$as_me:$LINENO: checking for jpeg_CreateDecompress in -ljpeg" >&5 +echo $ECHO_N "checking for jpeg_CreateDecompress in -ljpeg... $ECHO_C" >&6 +if test "${ac_cv_lib_jpeg_jpeg_CreateDecompress+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char jpeg_CreateDecompress (); +int +main () +{ +jpeg_CreateDecompress (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_jpeg_jpeg_CreateDecompress=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_jpeg_jpeg_CreateDecompress=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_jpeg_jpeg_CreateDecompress" >&5 +echo "${ECHO_T}$ac_cv_lib_jpeg_jpeg_CreateDecompress" >&6 +if test $ac_cv_lib_jpeg_jpeg_CreateDecompress = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBJPEG 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for TIFFOpen in -ltiff" >&5 +echo $ECHO_N "checking for TIFFOpen in -ltiff... $ECHO_C" >&6 +if test "${ac_cv_lib_tiff_TIFFOpen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff -lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char TIFFOpen (); +int +main () +{ +TIFFOpen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_tiff_TIFFOpen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_tiff_TIFFOpen=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_tiff_TIFFOpen" >&5 +echo "${ECHO_T}$ac_cv_lib_tiff_TIFFOpen" >&6 +if test $ac_cv_lib_tiff_TIFFOpen = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBTIFF 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for xmlParseFile in -lxml2" >&5 +echo $ECHO_N "checking for xmlParseFile in -lxml2... $ECHO_C" >&6 +if test "${ac_cv_lib_xml2_xmlParseFile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxml2 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char xmlParseFile (); +int +main () +{ +xmlParseFile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_xml2_xmlParseFile=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_xml2_xmlParseFile=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_xml2_xmlParseFile" >&5 +echo "${ECHO_T}$ac_cv_lib_xml2_xmlParseFile" >&6 +if test $ac_cv_lib_xml2_xmlParseFile = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBXML 1 +_ACEOF + +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 +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f 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 +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +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 + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#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)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +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=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in iconv.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc in + yes:no ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; + no:yes ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------ ## +## Report this to bug-autoconf@gnu.org. ## +## ------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +gww_hasbytecode="no" +echo "$as_me:$LINENO: checking for FT_New_Memory_Face in -lfreetype" >&5 +echo $ECHO_N "checking for FT_New_Memory_Face in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_FT_New_Memory_Face+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char FT_New_Memory_Face (); +int +main () +{ +FT_New_Memory_Face (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_FT_New_Memory_Face=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_FT_New_Memory_Face=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_FT_New_Memory_Face" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_FT_New_Memory_Face" >&6 +if test $ac_cv_lib_freetype_FT_New_Memory_Face = yes; then + + echo checking for bytecode interpreter in freetype... + echo "$as_me:$LINENO: checking for TT_RunIns in -lfreetype" >&5 +echo $ECHO_N "checking for TT_RunIns in -lfreetype... $ECHO_C" >&6 +if test "${ac_cv_lib_freetype_TT_RunIns+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char TT_RunIns (); +int +main () +{ +TT_RunIns (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_freetype_TT_RunIns=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_freetype_TT_RunIns=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_freetype_TT_RunIns" >&5 +echo "${ECHO_T}$ac_cv_lib_freetype_TT_RunIns" >&6 +if test $ac_cv_lib_freetype_TT_RunIns = yes; then + gww_hasbytecode="yes" +else + : +fi + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_FREETYPE 1 +_ACEOF + +fi + +if test "$gww_hasbytecode" = "yes" ; then + echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 +echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6 +if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpthread $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pthread_create (); +int +main () +{ +pthread_create (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pthread_pthread_create=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_pthread_pthread_create=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 +echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6 +if test $ac_cv_lib_pthread_pthread_create = yes; then + LIBS="$LIBS -lpthread" +else + gww_hasbytecode="no" +fi + +fi + +if test \( "$gww_hasbytecode" = "yes" \) -a \( "$FreeType2_IncRoot" != "" \); then + gww_hasbytecode="no" + +# Check whether --with-freetype-src or --without-freetype-src was given. +if test "${with_freetype_src+set}" = set; then + withval="$with_freetype_src" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC="$withval/src/truetype" + echo "$as_me:$LINENO: checking for valid freetype tree" >&5 +echo $ECHO_N "checking for valid freetype tree... $ECHO_C" >&6 + if test -f "$FreeType2_TT_BUILD_INC/ttobjs.h"; then + echo "$as_me:$LINENO: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + else + echo "$as_me:$LINENO: result: missing ttobjs.h" >&5 +echo "${ECHO_T}missing ttobjs.h" >&6 + echo "Unable to find $FreeType2_TT_BUILD_INC/ttobjs.h" + fi + fi + +else + + echo "$as_me:$LINENO: checking trying to find the freetype source directory -- be patient" >&5 +echo $ECHO_N "checking trying to find the freetype source directory -- be patient... $ECHO_C" >&6 + FreeType2_TT_SRC_DIRs=`find / -name ttobjs.h -print 2>/dev/null |grep 'freetype[^/\]*2[^/\]*/src/truetype/ttobjs.h' | sort -r | sed -e 's/ttobjs.h//'` + for dir in $FreeType2_TT_SRC_DIRs; do + if cmp -s ${dir}../../include/freetype/freetype.h ${FreeType2_IncRoot}/freetype/freetype.h >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC=$dir + break + fi + done + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + for dir in $FreeType2_TT_SRC_DIRs; do + has_goodft2sources="no" + FreeType2_TT_BUILD_INC=$dir + break + done + fi + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + echo " " no + else + echo " " probably + fi + +fi; + if test "$FreeType2_TT_BUILD_INC" \!= "" >/dev/null 2>&1 ; then + if test -f $FreeType2_TT_BUILD_INC/ttdriver.h >/dev/null 2>&1 ; then + CFLAGS="$CFLAGS -I$FreeType2_TT_BUILD_INC" + gww_hasbytecode="yes" + cat >>confdefs.h <<\_ACEOF +#define FREETYPE_HAS_DEBUGGER 1 +_ACEOF + + fi + fi +fi + + +echo "$as_me:$LINENO: checking for snprintf" >&5 +echo $ECHO_N "checking for snprintf... $ECHO_C" >&6 +if test "${ac_cv_func_snprintf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char snprintf (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char snprintf (); +/* 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_snprintf) || defined (__stub___snprintf) +choke me +#else +char (*f) () = snprintf; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != snprintf; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_snprintf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_snprintf=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_snprintf" >&5 +echo "${ECHO_T}$ac_cv_func_snprintf" >&6 +if test $ac_cv_func_snprintf = yes; then + : +else + cat >>confdefs.h <<\_ACEOF +#define _NO_SNPRINTF 1 +_ACEOF + +fi + + +echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 +if test "${ac_cv_c_const+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 x; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *ccp; + char **p; + /* 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"; + ccp = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++ccp; + p = (char**) ccp; + ccp = (char const *const *) p; + { /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 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; + } +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_const=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_c_const=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +echo "${ECHO_T}$ac_cv_c_const" >&6 +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'_ACEOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +_ACEOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:$LINENO: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\_ACEOF +#define X_DISPLAY_MISSING 1 +_ACEOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_nospace=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_R_space=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:$LINENO: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main () +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main () +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:$LINENO: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char gethostbyname (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +/* 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_gethostbyname) || defined (__stub___gethostbyname) +choke me +#else +char (*f) () = gethostbyname; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != gethostbyname; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main () +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:$LINENO: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char connect (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +/* 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_connect) || defined (__stub___connect) +choke me +#else +char (*f) () = connect; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != connect; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:$LINENO: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +int +main () +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_socket_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:$LINENO: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char remove (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +/* 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_remove) || defined (__stub___remove) +choke me +#else +char (*f) () = remove; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != remove; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:$LINENO: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +int +main () +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_posix_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:$LINENO: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shmat (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ +#ifdef __STDC__ +# include +#else +# include +#endif +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +/* 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_shmat) || defined (__stub___shmat) +choke me +#else +char (*f) () = shmat; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != shmat; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:$LINENO: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +int +main () +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (); +int +main () +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + +X_11LIB=-lX11 +if test "$no_x" = "yes"; then + X_11LIB= +else + + echo "$as_me:$LINENO: checking for XOpenDevice in -lXi" >&5 +echo $ECHO_N "checking for XOpenDevice in -lXi... $ECHO_C" >&6 +if test "${ac_cv_lib_Xi_XOpenDevice+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXi $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDevice (); +int +main () +{ +XOpenDevice (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xi_XOpenDevice=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_Xi_XOpenDevice=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_Xi_XOpenDevice" >&5 +echo "${ECHO_T}$ac_cv_lib_Xi_XOpenDevice" >&6 +if test $ac_cv_lib_Xi_XOpenDevice = yes; then + X_11LIB="-lXi -lX11" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_XINPUT 1 +_ACEOF + +fi + + echo "$as_me:$LINENO: checking for XkbQueryExtension in -lxkbui" >&5 +echo $ECHO_N "checking for XkbQueryExtension in -lxkbui... $ECHO_C" >&6 +if test "${ac_cv_lib_xkbui_XkbQueryExtension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lxkbui $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XkbQueryExtension (); +int +main () +{ +XkbQueryExtension (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_xkbui_XkbQueryExtension=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_xkbui_XkbQueryExtension=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_xkbui_XkbQueryExtension" >&5 +echo "${ECHO_T}$ac_cv_lib_xkbui_XkbQueryExtension" >&6 +if test $ac_cv_lib_xkbui_XkbQueryExtension = yes; then + X_11LIB="$X_11LIB -lxkbui" +else + cat >>confdefs.h <<\_ACEOF +#define _NO_XKB 1 +_ACEOF + +fi + +fi + +echo -n checking for long long ... +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +long long foo=0x400000000000; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\_ACEOF +#define _HAS_LONGLONG 1 +_ACEOF + + echo " " yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo " " no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + + + +STATIC_LIBS= +if test "$gww_nodynamic" = "yes"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + fi + if test "$ac_cv_lib_freetype_FT_New_Face" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lfreetype" + fi + echo "$as_me:$LINENO: checking for UnicodeNameAnnot in -luninameslist" >&5 +echo $ECHO_N "checking for UnicodeNameAnnot in -luninameslist... $ECHO_C" >&6 +if test "${ac_cv_lib_uninameslist_UnicodeNameAnnot+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-luninameslist $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line $LINENO "configure" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char UnicodeNameAnnot (); +int +main () +{ +UnicodeNameAnnot (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_uninameslist_UnicodeNameAnnot=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_uninameslist_UnicodeNameAnnot=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_uninameslist_UnicodeNameAnnot" >&5 +echo "${ECHO_T}$ac_cv_lib_uninameslist_UnicodeNameAnnot" >&6 +if test $ac_cv_lib_uninameslist_UnicodeNameAnnot = yes; then + + STATIC_LIBS="$STATIC_LIBS -luninameslist" + cat >>confdefs.h <<\_ACEOF +#define _STATIC_LIBUNINAMESLIST 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define _NO_LIBUNINAMESLIST 1 +_ACEOF + +fi + +fi + + +# Check whether --with-multilayer or --without-multilayer was given. +if test "${with_multilayer+set}" = set; then + withval="$with_multilayer" + + if test "$withval" != "no" >/dev/null 2>&1 ; then + cat >>confdefs.h <<\_ACEOF +#define PFAEDIT_CONFIG_TYPE3 1 +_ACEOF + + fi + +else + : +fi; + +test -d libs || mkdir libs + +cp Makefile.static.in Makefile.in +cp Unicode/Makefile.static.in Unicode/Makefile.in +cp gdraw/Makefile.static.in gdraw/Makefile.in +cp pfaedit/Makefile.static.in pfaedit/Makefile.in + ac_config_files="$ac_config_files Makefile Unicode/Makefile gdraw/Makefile pfaedit/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Unicode/Makefile" ) CONFIG_FILES="$CONFIG_FILES Unicode/Makefile" ;; + "gdraw/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdraw/Makefile" ;; + "pfaedit/Makefile" ) CONFIG_FILES="$CONFIG_FILES pfaedit/Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@X_11LIB@,$X_11LIB,;t t +s,@STATIC_LIBS@,$STATIC_LIBS,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + +if test -e umap >/dev/null 2>&1 ; then + cp umap/Makefile.static.in umap/Makefile.in + ac_config_files="$ac_config_files umap/Makefile" +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, don't put newlines in cache variables' values. +# 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. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *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 \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + 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}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then we branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +cat >confdef2opt.sed <<\_ACEOF +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g +t quote +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g +t quote +d +: quote +s,[ `~#$^&*(){}\\|;'"<>?],\\&,g +s,\[,\\&,g +s,\],\\&,g +s,\$,$$,g +p +_ACEOF +# We use echo to avoid assuming a particular line-breaking character. +# The extra dot is to prevent the shell from consuming trailing +# line-breaks from the sub-command output. A line-break within +# single-quotes doesn't work because, if this script is created in a +# platform that uses two characters for line-breaks (e.g., DOS), tr +# would break. +ac_LF_and_DOT=`echo; echo .` +DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` +rm -f confdef2opt.sed + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be 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+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; 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 + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# 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 + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + 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 + + ;; + 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 + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); 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 sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="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="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by $as_me, which was +generated by GNU Autoconf 2.57. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet 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 + +Configuration files: +$config_files + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.57, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +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=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + 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 +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + + + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "Unicode/Makefile" ) CONFIG_FILES="$CONFIG_FILES Unicode/Makefile" ;; + "gdraw/Makefile" ) CONFIG_FILES="$CONFIG_FILES gdraw/Makefile" ;; + "pfaedit/Makefile" ) CONFIG_FILES="$CONFIG_FILES pfaedit/Makefile" ;; + "umap/Makefile" ) CONFIG_FILES="$CONFIG_FILES umap/Makefile" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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 +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@X_11LIB@,$X_11LIB,;t t +s,@STATIC_LIBS@,$STATIC_LIBS,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac +# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +# absolute. +ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` + + + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # 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. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;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,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + +done +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# 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 || { (exit 1); exit 1; } +fi + +fi + +echo Configuration defines: $DEFS +echo CFLAGS: $CFLAGS +if test "$STATIC_LIBS" != ""; then + echo Static Libraries: $STATIC_LIBS +fi + +if test "$no_x" = "yes"; then + echo " *****************************************************************" + echo " * This version of pfaedit will only run scripts. No X libraries *" + echo " * were found so there is NO user interface!!!! If you want a UI *" + echo " * try installing X11 on your system. *" + echo " *****************************************************************" +fi + diff --git a/configure.static.in b/configure.static.in new file mode 100644 index 00000000..0a51ffa5 --- /dev/null +++ b/configure.static.in @@ -0,0 +1,227 @@ +dnl Process this file with autoconf to produce a configure script. + +AC_INIT(fontforge/pfaedit.h) +AC_PROG_CC +AC_PROG_RANLIB + +gww_nodynamic="no" +gww_needsstatic="no" +AC_CANONICAL_HOST +case "$host" in +*-apple-darwin*) AC_DEFINE(NODYNAMIC) +gww_nodynamic="yes" +AC_DEFINE(_CursorsMustBe16x16) +AC_DEFINE(_Keyboard,1) +AC_DEFINE(__Mac,1) +LIBS="/System/Library/Frameworks/CoreServices.framework/CoreServices $LIBS" + ;; +powerpc-*-*linux*) +AC_DEFINE(_Keyboard,3) + ;; +*sparc*) +AC_DEFINE(_Keyboard,2) + ;; +*-pc-cygwin*) +AC_DEFINE(_BrokenBitmapImages) +AC_DEFINE(_ModKeysAutoRepeat) +AC_DEFINE(__CygWin,1) +AC_DEFINE(NODYNAMIC) +gww_nodynamic="yes" +gww_needsstatic="yes" + ;; +esac + +AC_SEARCH_LIBS(dlopen, dl) dnl some systems have this in libc +AC_SEARCH_LIBS(inet_aton, resolv) dnl some systems have this in libc +AC_SEARCH_LIBS(libiconv, iconv) dnl linux has iconv in libc, mac has libiconv in libiconv, and a define to map iconv() to libiconv(), so we can't do the obvious check + +dnl Is there a better way to add a directory to the include path? + +FreeType2_IncRoot= +if sh -c "freetype-config --prefix" >/dev/null 2>&1 ; then + FreeType2_IncRoot=`freetype-config --prefix` + AC_CHECK_FILE($FreeType2_IncRoot/include/freetype2,CFLAGS="$CFLAGS -I$FreeType2_IncRoot/include/freetype2/",FreeType2_IncRoot=) +fi + +if test "FreeType2_IncRoot" = "" >/dev/null 2>&1 ; then + AC_CHECK_FILE(/usr/include/freetype2,[CFLAGS="$CFLAGS -I/usr/include/freetype2/" + FreeType2_IncRoot="/usr" + ],[ + AC_CHECK_FILE(/usr/local/include/freetype2,[CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/freetype2/" + FreeType2_IncRoot="/usr/local/" + ],[ + AC_CHECK_FILE(/usr/X11R6/include/freetype2,[CFLAGS="$CFLAGS -I/usr/X11R6/include -I/usr/X11R6/include/freetype2/" + FreeType2_IncRoot="/usr/X11R6/" + ],AC_DEFINE(_NO_FREETYPE))])]) +fi + +AC_CHECK_FILE(/usr/include/libxml2/libxml,[CFLAGS="$CFLAGS -I/usr/include/libxml2/"],[ + AC_CHECK_FILE(/usr/local/include/libxml2/libxml,[CFLAGS="$CFLAGS -I/usr/local/include -I/usr/local/include/libxml2/"], + AC_DEFINE(_NO_LIBXML))]) + +dnl Some old versions of lib(un)gif don't work for us, they've got the +dnl Function argument in the wrong place. So two checks for gif. + +AC_CHECK_LIB(ungif, DGifOpenFileName, [ +echo -n checking for ExtensionBlock.Function in gif_lib.h... +AC_TRY_COMPILE([#include ], [ ExtensionBlock foo; foo.Function=3; ], echo " " yes , [echo " " no + ac_cv_lib_ungif_DGifOpenFileName=no + AC_DEFINE(_NO_LIBUNGIF)]) +] , AC_DEFINE(_NO_LIBUNGIF)) + +AC_CHECK_LIB(z, deflateEnd, : ,AC_DEFINE(_NO_LIBPNG), -lm) +AC_CHECK_LIB(png, png_create_read_struct, : ,[ + AC_CHECK_LIB(png12, png_create_read_struct, AC_DEFINE(_LIBPNG12), AC_DEFINE(_NO_LIBPNG), -lz -lm)], -lz -lm) +AC_CHECK_LIB(jpeg, jpeg_CreateDecompress, : ,AC_DEFINE(_NO_LIBJPEG)) +AC_CHECK_LIB(tiff, TIFFOpen, : , AC_DEFINE(_NO_LIBTIFF), -lm ) +AC_CHECK_LIB(xml2, xmlParseFile, : , AC_DEFINE(_NO_LIBXML)) + +AC_CHECK_HEADERS([iconv.h]) + +gww_hasbytecode="no" +AC_CHECK_LIB(freetype, FT_New_Memory_Face, [ + echo checking for bytecode interpreter in freetype... + AC_CHECK_LIB(freetype, TT_RunIns, gww_hasbytecode="yes", : )], + AC_DEFINE(_NO_FREETYPE)) +if test "$gww_hasbytecode" = "yes" ; then + AC_CHECK_LIB(pthread, pthread_create, LIBS="$LIBS -lpthread", gww_hasbytecode="no") +fi + +if test \( "$gww_hasbytecode" = "yes" \) -a \( "$FreeType2_IncRoot" != "" \); then + gww_hasbytecode="no" + AC_ARG_WITH(freetype-src, + [ --with-freetype-src=dir Specify freetype source directory], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC="$withval/src/truetype" + AC_MSG_CHECKING(for valid freetype tree) + if test -f "$FreeType2_TT_BUILD_INC/ttobjs.h"; then + AC_MSG_RESULT(ok) + else + AC_MSG_RESULT(missing ttobjs.h) + echo "Unable to find $FreeType2_TT_BUILD_INC/ttobjs.h" + fi + fi + ], + [ + dnl guess directory + AC_MSG_CHECKING(trying to find the freetype source directory -- be patient) + FreeType2_TT_SRC_DIRs=`find / -name ttobjs.h -print 2>/dev/null |grep '[freetype[^/\]*2[^/\]*/src/truetype/ttobjs.h]' | sort -r | sed -e 's/ttobjs.h//'` + for dir in $FreeType2_TT_SRC_DIRs; do + if cmp -s ${dir}../../include/freetype/freetype.h ${FreeType2_IncRoot}/freetype/freetype.h >/dev/null 2>&1 ; then + FreeType2_TT_BUILD_INC=$dir + break + fi + done + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + for dir in $FreeType2_TT_SRC_DIRs; do + has_goodft2sources="no" + FreeType2_TT_BUILD_INC=$dir + break + done + fi + if test "$FreeType2_TT_BUILD_INC" = "" >/dev/null 2>&1 ; then + echo " " no + else + echo " " probably + fi + ]) + if test "$FreeType2_TT_BUILD_INC" \!= "" >/dev/null 2>&1 ; then + if test -f $FreeType2_TT_BUILD_INC/ttdriver.h >/dev/null 2>&1 ; then + CFLAGS="$CFLAGS -I$FreeType2_TT_BUILD_INC" + gww_hasbytecode="yes" + AC_DEFINE(FREETYPE_HAS_DEBUGGER) + fi + fi +fi + +dnl older libc's don't have snprintf + +AC_CHECK_FUNC(snprintf, : , AC_DEFINE(_NO_SNPRINTF)) + +AC_C_CONST +AC_PATH_XTRA +AC_SUBST(X_11LIB) +X_11LIB=-lX11 +if test "$no_x" = "yes"; then + X_11LIB= +else + dnl AC_CHECK_HEADER("X11/extensions/XInput.h", : ,AC_DEFINE(_NO_XINPUT),) + dnl AC_CHECK_HEADER("X11/extensions/XI.h", : ,AC_DEFINE(_NO_XINPUT),) + dnl /usr/share/doc/XFree86-doc-4.2.0/Xi/lib.PS + + AC_CHECK_LIB(Xi, XOpenDevice, X_11LIB="-lXi -lX11" ,AC_DEFINE(_NO_XINPUT), $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 ) + AC_CHECK_LIB(xkbui, XkbQueryExtension, X_11LIB="$X_11LIB -lxkbui" ,AC_DEFINE(_NO_XKB), $X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS -lX11 ) +fi + +echo -n checking for long long ... +AC_TRY_COMPILE(,[long long foo=0x400000000000;],[ AC_DEFINE(_HAS_LONGLONG) + echo " " yes] , echo " " no ) + +dnl If we can't/don't want to use dynamic libraries then we must link with +dnl the static libraries we've found + +AC_SUBST(STATIC_LIBS) +STATIC_LIBS= +if test "$gww_nodynamic" = "yes"; then + if test "$gww_needsstatic" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -static" + fi + if test "$ac_cv_lib_ungif_DGifOpenFileName" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lungif" + fi + if test "$ac_cv_lib_png_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng -lz" + fi + if test "$ac_cv_lib_png12_png_create_read_struct" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lpng12 -lz" + fi + if test "$ac_cv_lib_tiff_TIFFOpen" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ltiff" + fi + if test "$ac_cv_lib_jpeg_jpeg_CreateDecompress" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -ljpeg" + fi + if test "$ac_cv_lib_freetype_FT_New_Face" = "yes"; then + STATIC_LIBS="$STATIC_LIBS -lfreetype" + fi + AC_CHECK_LIB(uninameslist, UnicodeNameAnnot, [ + STATIC_LIBS="$STATIC_LIBS -luninameslist" + AC_DEFINE(_STATIC_LIBUNINAMESLIST) ] , AC_DEFINE(_NO_LIBUNINAMESLIST)) +fi + +AC_ARG_WITH(multilayer, + [ --with-multilayer Control whether we build with support for type3/svg fonts containing multilayered drawing with strokes, fills, images, etc.], + [ + if test "$withval" != "no" >/dev/null 2>&1 ; then + AC_DEFINE(FONTFORGE_CONFIG_TYPE3) + fi + ], : ) + +test -d libs || mkdir libs + +cp Makefile.static.in Makefile.in +cp Unicode/Makefile.static.in Unicode/Makefile.in +cp gdraw/Makefile.static.in gdraw/Makefile.in +cp fontforge/Makefile.static.in fontforge/Makefile.in +AC_OUTPUT(Makefile Unicode/Makefile gdraw/Makefile fontforge/Makefile) +if test -e umap >/dev/null 2>&1 ; then + cp umap/Makefile.static.in umap/Makefile.in + AC_OUTPUT( umap/Makefile ) +fi + +echo Configuration defines: $DEFS +echo CFLAGS: $CFLAGS +if test "$STATIC_LIBS" != ""; then + echo Static Libraries: $STATIC_LIBS +fi + +if test "$no_x" = "yes"; then + echo " *******************************************************************" + echo " * This version of fontforge will only run scripts. No X libraries *" + echo " * were found so there is NO user interface!!!!! If you want a UI *" + echo " * try installing X11 on your system. *" + echo " *******************************************************************" +fi + +dnl EOF diff --git a/descrip.mms b/descrip.mms new file mode 100644 index 00000000..12477624 --- /dev/null +++ b/descrip.mms @@ -0,0 +1,7 @@ +all : + set def [.unicode] + mms + set def [-.gdraw] + mms + set def [-.pfaedit] + mms diff --git a/fontforge/Makefile.dynamic.in b/fontforge/Makefile.dynamic.in new file mode 100644 index 00000000..b2fb51a8 --- /dev/null +++ b/fontforge/Makefile.dynamic.in @@ -0,0 +1,89 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +sharedir = @prefix@/share/fontforge +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = @srcdir@ +bindir = @bindir@ +libdir = @libdir@ + +LIBTOOL = @LIBTOOL@ +CC = @CC@ + +X_CFLAGS = @X_CFLAGS@ +X_LIBS = @X_LIBS@ +X_11LIB = @X_11LIB@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +STATIC_LIBS = @STATIC_LIBS@ + +fontforge_OBJECTS = autohint.o autosave.o autowidth.o bitmapdlg.o \ + bitmapview.o bvedit.o charview.o charviewicons.o cursors.o \ + cvaddpoints.o cvexport.o cvgetinfo.o cvhints.o cvimages.o cvknife.o \ + cvpalettes.o cvpointer.o cvruler.o cvshapes.o cvstroke.o cvtranstools.o \ + cvundoes.o dumpbdf.o dumppfa.o fontinfo.o fontview.o fvcomposit.o \ + fvfonts.o fvimportbdf.o fvmetrics.o images.o metricsview.o \ + parsepfa.o parsettf.o prefs.o psread.o psunicodenames.o savefontdlg.o \ + sfd.o splashimage.o splinefill.o splineoverlap.o splinesave.o \ + splinesaveafm.o splinestroke.o splineutil.o splineutil2.o stamp.o \ + start.o tottf.o transform.o uiutil.o utils.o windowmenu.o \ + zapfnomen.o othersubrs.o autotrace.o openfontdlg.o encoding.o print.o \ + problems.o pfaedit-ui.o metafont.o alignment.o parsettfbmf.o \ + macbinary.o crctab.o scripting.o freetype.o gotodlg.o search.o \ + combinations.o tilepath.o sftextfield.o displayfonts.o ikarus.o \ + cvhand.o cvfreehand.o simplifydlg.o winfonts.o tottfgpos.o tottfaat.o \ + charinfo.o splineorder2.o genttfinstrs.o ttfinstrs.o cvgridfit.o \ + cvdebug.o showatt.o kernclass.o nonlineartrans.o effects.o \ + histograms.o ttfspecial.o svg.o parsettfatt.o contextchain.o \ + macenc.o statemachine.o typofeatures.o splinerefigure.o mm.o +DIFFOBJS = sfddiff.o sfd.o diffstubs.o stamp.o +ACORNOBJS = acorn2sfd.o sfd.o diffstubs.o psunicodenames.o stamp.o + +WFLAGS = -Wmissing-prototypes -Wunused -Wimplicit -Wreturn-type -Wparentheses \ + -Wformat -Wchar-subscripts +_CFLAGS = -I$(top_srcdir)/inc -I$(srcdir) -I. $(WFLAGS) $(X_CFLAGS) \ + @DEFS@ '-DSHAREDIR="$(sharedir)"' -DLIBDIR='"$(libdir)"' +CFLAGS = @CFLAGS@ $(_CFLAGS) + +LIBS = -rpath $(libdir) $(X_LIBS) ../libgdraw.la ../libgunicode.la \ + $(X_PRE_LIBS) $(X_11LIB) $(X_EXTRA_LIBS) @LIBS@ $(STATIC_LIBS) -L/usr/lib -lm +DLIBS = -rpath $(libdir) ../libgunicode.la @LIBS@ -lm + +all: pfaedit-en.ui fontforge sfddiff + +fontforge: nomen.h $(fontforge_OBJECTS) + $(LIBTOOL) $(CC) -o fontforge $(fontforge_OBJECTS) $(LIBS) + +sfddiff: $(DIFFOBJS) + $(LIBTOOL) $(CC) -o sfddiff $(DIFFOBJS) $(DLIBS) + +acorn2sfd: $(ACORNOBJS) + $(LIBTOOL) $(CC) -o acorn2sfd $(ACORNOBJS) $(DLIBS) + +# The slight error introduced occasionally by optimization turns out to have +# disasterous effects. This file may not be compiled with the optimizer. +splinerefigure.o: splinerefigure.c + $(CC) -g -c -o splinerefigure.o $(_CFLAGS) splinerefigure.c + +#this makes all the .ui files but wildcarding doesn't work too well if the +# files don't exist. +nomen.h pfaedit-ui.c pfaedit-en.ui: $(srcdir)/nomen-*.c makenomenh.c + $(LIBTOOL) $(CC) -o makenomenh $(CFLAGS) $(srcdir)/makenomenh.c $(LIBS) + -ln -s $(srcdir)/nomen-*.c . + ./makenomenh + mv pfaedit-ui-en.c pfaedit-ui.c + +clean: + -rm -f *.o fontforge *.ui nomen.h pfaedit-ui.c makenomenh _nomen-*.c sfddiff + -rm -rf .libs + +distclean cleaner: clean + -rm -f Makefile + -for i in nomen-*.c; do \ + test -L $$i && rm $$i; \ + done; + +install: + ( cd .. ; make install ) diff --git a/fontforge/Makefile.in b/fontforge/Makefile.in new file mode 100644 index 00000000..3fb7a22e --- /dev/null +++ b/fontforge/Makefile.in @@ -0,0 +1,89 @@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +sharedir = @prefix@/share/fontforge +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +top_builddir = .. +VPATH = @srcdir@ +bindir = @bindir@ +libdir = @libdir@ + +LIBTOOL = @LIBTOOL@ +CC = @CC@ + +X_CFLAGS = @X_CFLAGS@ +X_LIBS = @X_LIBS@ +X_11LIB = @X_11LIB@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +STATIC_LIBS = @STATIC_LIBS@ + +fontforge_OBJECTS = autohint.o autosave.o autowidth.o bitmapdlg.o \ + bitmapview.o bvedit.o charview.o charviewicons.o cursors.o \ + cvaddpoints.o cvexport.o cvgetinfo.o cvhints.o cvimages.o cvknife.o \ + cvpalettes.o cvpointer.o cvruler.o cvshapes.o cvstroke.o cvtranstools.o \ + cvundoes.o dumpbdf.o dumppfa.o fontinfo.o fontview.o fvcomposit.o \ + fvfonts.o fvimportbdf.o fvmetrics.o images.o metricsview.o \ + parsepfa.o parsettf.o prefs.o psread.o psunicodenames.o savefontdlg.o \ + sfd.o splashimage.o splinefill.o splineoverlap.o splinesave.o \ + splinesaveafm.o splinestroke.o splineutil.o splineutil2.o stamp.o \ + start.o tottf.o transform.o uiutil.o utils.o windowmenu.o \ + zapfnomen.o othersubrs.o autotrace.o openfontdlg.o encoding.o print.o \ + problems.o pfaedit-ui.o metafont.o alignment.o parsettfbmf.o \ + macbinary.o crctab.o scripting.o freetype.o gotodlg.o search.o \ + combinations.o tilepath.o sftextfield.o displayfonts.o ikarus.o \ + cvhand.o cvfreehand.o simplifydlg.o winfonts.o tottfgpos.o tottfaat.o \ + charinfo.o splineorder2.o genttfinstrs.o ttfinstrs.o cvgridfit.o \ + cvdebug.o showatt.o kernclass.o nonlineartrans.o effects.o \ + histograms.o ttfspecial.o svg.o parsettfatt.o contextchain.o \ + macenc.o statemachine.o typofeatures.o splinerefigure.o mm.o +DIFFOBJS = sfddiff.o sfd.o diffstubs.o stamp.o +ACORNOBJS = acorn2sfd.o sfd.o diffstubs.o psunicodenames.o stamp.o + +WFLAGS = -Wmissing-prototypes -Wunused -Wimplicit -Wreturn-type -Wparentheses \ + -Wformat -Wchar-subscripts +_CFLAGS = -I$(top_srcdir)/inc -I$(srcdir) -I. $(WFLAGS) $(X_CFLAGS) \ + @DEFS@ '-DSHAREDIR="$(sharedir)"' -DLIBDIR='"$(libdir)"' +CFLAGS = @CFLAGS@ $(_CFLAGS) + +LIBS = -rpath $(libdir) $(X_LIBS) ../libgdraw.la ../libgunicode.la \ + $(X_PRE_LIBS) $(X_11LIB) $(X_EXTRA_LIBS) @LIBS@ $(STATIC_LIBS) -L/usr/lib -lm +DLIBS = -rpath $(libdir) ../libgunicode.la @LIBS@ -lm + +all: pfaedit-en.ui fontforge sfddiff + +fontforge: nomen.h $(fontforge_OBJECTS) + $(LIBTOOL) $(CC) -o fontforge $(fontforge_OBJECTS) $(LIBS) + +sfddiff: $(DIFFOBJS) + $(LIBTOOL) $(CC) -o sfddiff $(DIFFOBJS) $(DLIBS) + +acorn2sfd: $(ACORNOBJS) + $(LIBTOOL) $(CC) -o acorn2sfd $(ACORNOBJS) $(DLIBS) + +# The slight error introduced occasionally by optimization turns out to have +# disasterous effects. This file may not be compiled with the optimizer. +splinerefigure.o: splinerefigure.c + $(CC) -g -c -o splinerefigure.o $(_CFLAGS) splinerefigure.c + +#this makes all the .ui files but wildcarding doesn't work too well if the +# files don't exist. +nomen.h pfaedit-ui.c pfaedit-en.ui: $(srcdir)/nomen-*.c makenomenh.c + $(LIBTOOL) $(CC) -o makenomenh $(CFLAGS) $(srcdir)/makenomenh.c $(LIBS) + -ln -s $(srcdir)/nomen-*.c . + ./makenomenh + mv pfaedit-ui-en.c pfaedit-ui.c + +clean: + -rm -f *.o fontforge *.ui nomen.h pfaedit-ui.c makenomenh _nomen-*.c sfddiff + -rm -rf .libs + +distclean cleaner: clean + -rm -f Makefile + -for i in nomen-*.c; do \ + test -L $$i && rm $$i; \ + done; + +install: + ( cd .. ; make install ) diff --git a/fontforge/Makefile.static.in b/fontforge/Makefile.static.in new file mode 100644 index 00000000..a2f87acb --- /dev/null +++ b/fontforge/Makefile.static.in @@ -0,0 +1,81 @@ +sharedir = @prefix@/share/fontforge +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +bindir = @bindir@ + +CC = @CC@ + +X_CFLAGS = @X_CFLAGS@ +X_LIBS = @X_LIBS@ +X_11LIB = @X_11LIB@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +STATIC_LIBS = @STATIC_LIBS@ + +fontforge_OBJECTS = autohint.o autosave.o autowidth.o bitmapdlg.o \ + bitmapview.o bvedit.o charview.o charviewicons.o cursors.o \ + cvaddpoints.o cvexport.o cvgetinfo.o cvhints.o cvimages.o cvknife.o \ + cvpalettes.o cvpointer.o cvruler.o cvshapes.o cvstroke.o cvtranstools.o \ + cvundoes.o dumpbdf.o dumppfa.o fontinfo.o fontview.o fvcomposit.o \ + fvfonts.o fvimportbdf.o fvmetrics.o images.o metricsview.o \ + parsepfa.o parsettf.o prefs.o psread.o psunicodenames.o savefontdlg.o \ + sfd.o splashimage.o splinefill.o splineoverlap.o splinesave.o \ + splinesaveafm.o splinestroke.o splineutil.o splineutil2.o stamp.o \ + start.o tottf.o transform.o uiutil.o utils.o windowmenu.o \ + zapfnomen.o othersubrs.o autotrace.o openfontdlg.o encoding.o print.o \ + problems.o pfaedit-ui.o metafont.o alignment.o parsettfbmf.o \ + macbinary.o crctab.o scripting.o freetype.o gotodlg.o search.o \ + combinations.o tilepath.o sftextfield.o displayfonts.o ikarus.o \ + cvhand.o cvfreehand.o simplifydlg.o winfonts.o tottfgpos.o tottfaat.o \ + charinfo.o splineorder2.o genttfinstrs.o ttfinstrs.o cvgridfit.o \ + cvdebug.o showatt.o kernclass.o nonlineartrans.o effects.o \ + histograms.o ttfspecial.o svg.o parsettfatt.o contextchain.o \ + macenc.o statemachine.o typofeatures.o splinerefigure.o mm.o +DIFFOBJS = sfddiff.o sfd.o diffstubs.o stamp.o +ACORNOBJS = acorn2sfd.o sfd.o diffstubs.o psunicodenames.o stamp.o + +WFLAGS = -Wmissing-prototypes -Wunused -Wimplicit -Wreturn-type -Wparentheses \ + -Wformat -Wchar-subscripts +_CFLAGS = -I$(top_srcdir)/inc -I$(srcdir) -I. $(WFLAGS) $(X_CFLAGS) \ + @DEFS@ '-DSHAREDIR="$(sharedir)"' -DLIBDIR='"$(libdir)"' +CFLAGS = @CFLAGS@ $(_CFLAGS) + +LDFLAGS = @LDFLAGS@ +LIBS = -L../libs $(X_LIBS) ../libs/libgdraw.a ../libs/libgunicode.a \ + $(X_PRE_LIBS) $(X_11LIB) $(X_EXTRA_LIBS) @LIBS@ $(STATIC_LIBS) -lm +DLIBS = ../libs/libgunicode.a @LIBS@ -lm + +all: pfaedit-en.ui fontforge sfddiff acorn2sfd + +fontforge: nomen.h $(fontforge_OBJECTS) + $(CC) -o fontforge $(fontforge_OBJECTS) $(LIBS) + +sfddiff: $(DIFFOBJS) + $(CC) -o sfddiff $(DIFFOBJS) $(DLIBS) + +acorn2sfd: $(ACORNOBJS) + $(CC) -o acorn2sfd $(ACORNOBJS) $(DLIBS) + +# The slight error introduced occasionally by optimization turns out to have +# disasterous effects. This file may not be compiled with the optimizer. +splinerefigure.o: splinerefigure.c + $(CC) -g -c -o splinerefigure.o $(_CFLAGS) splinerefigure.c + +#this makes all the .ui files but wildcarding doesn't work too well if the +# files don't exist. +nomen.h pfaedit-ui.c pfaedit-en.ui: $(srcdir)/nomen-*.c makenomenh.c + $(CC) -o makenomenh $(CFLAGS) $(srcdir)/makenomenh.c $(LIBS) + -ln -s $(srcdir)/nomen-*.c . + ./makenomenh + mv pfaedit-ui-en.c pfaedit-ui.c + +clean: + -rm -f *.o fontforge *.ui nomen.h pfaedit-ui.c makenomenh _nomen-*.c sfddiff acorn2sfd + +distclean cleaner: clean + -rm -f Makefile + -for i in nomen.*.c; do \ + test -L $$i && rm $$i; \ + done; diff --git a/fontforge/acorn2sfd.c b/fontforge/acorn2sfd.c new file mode 100644 index 00000000..8c0901cf --- /dev/null +++ b/fontforge/acorn2sfd.c @@ -0,0 +1,924 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "splinefont.h" +#include + +extern char *psunicodenames[]; +extern int psunicodenames_cnt; +extern struct psaltnames { + char *name; + int unicode; +} psaltuninames[]; +extern int psaltuninames_cnt; + +static int includestrokes = false; + +#define true 1 +#define false 0 + +struct r_kern { + int right; + int amount; + struct r_kern *next; +}; + +struct Outlines { + int version; + int design_size; + int nchunks; /* Each chunk holds outlines for 32 characters. I think */ + int *chunk_offset; /* if chunk[i]==chunk[i+1] => empty. One extra chunk offset at end to give size of final chunk */ + int scaf_flags; + int ns; + int scaffold_size; + int *scaffold_offset; + char *scaffold_indexsize; + char *fontname; + char *metrics_fontname; + int metrics_n; + int *xadvance, *yadvance; + int defxadvance, defyadvance; + struct r_kern **kerns; + SplineFont *sf; +}; + +/* Little-endian */ +static int r_getushort(FILE *file) { + int ch1; + + ch1 = getc(file); +return( (getc(file)<<8)|ch1 ); +} + +static int r_getshort(FILE *file) { +return( (short) r_getushort(file)); +} + +static int r_getint(FILE *file) { + int ch1, ch2, ch3; + + ch1 = getc(file); + ch2 = getc(file); + ch3 = getc(file); +return( (((((getc(file)<<8)|ch3)<<8)|ch2)<<8)|ch1 ); +} + +void SplinePointFree(SplinePoint *sp) { + free(sp); +} + +static char *knownweights[] = { "Demi", "Bold", "Regu", "Medi", "Book", "Thin", + "Ligh", "Heav", "Blac", "Ultr", "Nord", "Norm", "Gras", "Stan", "Halb", + "Fett", "Mage", "Mitt", "Buch", NULL }; +static char *realweights[] = { "Demi", "Bold", "Regular", "Medium", "Book", "Thin", + "Light", "Heavy", "Black", "Ultra", "Nord", "Normal", "Gras", "Standard", "Halbfett", + "Fett", "Mager", "Mittel", "Buchschrift", NULL}; +static char *modifierlist[] = { "Ital", "Obli", "Kursive", "Cursive", "Slanted", + "Expa", "Cond", NULL }; +static char **mods[] = { knownweights, modifierlist, NULL }; +#if 0 +static char *modifierlistfull[] = { "Italic", "Oblique", "Kursive", "Cursive", + "Expanded", "Condensed", NULL }; +static char **fullmods[] = { realweights, modifierlistfull, NULL }; +#endif + + +static char *GuessFamily(char *fontname) { + char *fpt, *pt; + int i,j; + + if ( (fpt=strchr(fontname,'-'))!=NULL && fpt!=fontname ) +return( copyn(fontname,fpt-fontname)); + if ( (fpt=strchr(fontname,'.'))!=NULL && fpt!=fontname ) +return( copyn(fontname,fpt-fontname)); + + for ( i=0; mods[i]!=NULL; ++i ) for ( j=0; mods[i][j]!=NULL; ++j ) { + pt = strstr(fontname,mods[i][j]); + if ( pt!=NULL && (fpt==NULL || pt=0 ; --i ) { + if ( psunicodenames[i]!=NULL ) + if ( strcmp(name,psunicodenames[i])==0 ) + break; + } + if ( i==-1 ) for ( i=psaltuninames_cnt-1; i>=0 ; --i ) { + if ( strcmp(name,psaltuninames[i].name)==0 ) + break; + } +return( i ); +} + +static void readcoords(FILE *file,int is12, int *x, int *y) { + int ch1, ch2, ch3; + + if ( is12 ) { + ch1 = getc(file); + ch2 = getc(file); + ch3 = getc(file); +#if 0 + ch1 = (ch1<<4)|(ch2>>4); + ch2 = ((ch2&0xf)<<8)|ch3; +#else + ch1 = ch1|((ch2&0xf)<<8); + ch2 = (ch2>>4)|(ch3<<4); +#endif + *x = (ch1<<(32-12))>>(32-12); /* Sign extend */ + *y = (ch2<<(32-12))>>(32-12); /* Sign extend */ + } else { + *x = (signed char) getc(file); + *y = (signed char) getc(file); + } +} + +static int readcharindex(FILE *file,int twobyte) { + if ( twobyte ) +return( r_getushort(file)); + else +return( getc(file)); +} + +static SplineSet *FinishSet(SplineSet *old,SplineSet *active,int closed) { + if ( active!=NULL ) { + if ( active->first->me.x==active->last->me.x && + active->first->me.y==active->last->me.y && + active->first!=active->last ) { + active->first->prevcp = active->last->prevcp; + active->first->noprevcp = active->last->noprevcp; + active->last->prev->to = active->first; + active->first->prev = active->last->prev; + SplinePointFree(active->last); + active->last = active->first; + } else if ( closed ) { + SplineMake3(active->last,active->first); + active->last = active->first; + } + active->next = old; +return( active ); + } +return( old ); +} + +static SplineSet *ReadSplineSets(FILE *file,int flags,SplineSet *old,int closed) { + int verb; + int x1,y1, x2,y2, x3,y3; + SplineSet *active=NULL; + SplinePoint *next; + + while ( (verb=getc(file))!=EOF && (verb&0x3)!=0 ) { + readcoords(file,flags&1,&x1,&y1); + if ( (verb&0x3)==1 ) { /* Move to */ + old = FinishSet(old,active,closed); + active = gcalloc(1,sizeof(SplineSet)); + active->first = active->last = gcalloc(1,sizeof(SplinePoint)); + active->first->me.x = x1; active->first->me.y = y1; + active->first->nextcp = active->first->prevcp = active->first->me; + active->first->nonextcp = active->first->noprevcp = true; + } else { + if ( active==NULL ) { + fprintf( stderr, "No initial point, assuming 0,0\n" ); + active = gcalloc(1,sizeof(SplineSet)); + active->first = active->last = gcalloc(1,sizeof(SplinePoint)); + active->first->nonextcp = active->first->noprevcp = true; + } + next = gcalloc(1,sizeof(SplinePoint)); + if ( (verb&3)==2 ) { /* Line to */ + next->me.x = x1; next->me.y = y1; + next->nextcp = next->prevcp = next->me; + next->nonextcp = next->noprevcp = true; + } else { /* Curve to */ + readcoords(file,flags&1,&x2,&y2); + readcoords(file,flags&1,&x3,&y3); + active->last->nextcp.x = x1; active->last->nextcp.y = y1; + active->last->nonextcp = false; + next->prevcp.x = x2; next->prevcp.y = y2; + next->me.x = x3; next->me.y = y3; + next->nextcp = next->me; + next->nonextcp = true; + } + SplineMake3(active->last,next); + active->last = next; + } + } + ungetc(verb,file); +return( FinishSet(old,active,closed)); +} + +static SplineChar *ReadChar(FILE *file,struct Outlines *outline,int enc) { + SplineChar *sc = SplineCharCreate(); + char buffer[12]; + int flags, x, y, verb, ch; + RefChar *r1, *r2; + SplineFont *sf = outline->sf; + + flags = getc(file); + if ( !(flags&(1<<3)) ) { + fprintf( stderr, "Character %d is a bitmap character\n", enc ); +return( NULL ); + } + + sc->parent = sf; + sc->enc = sc->unicodeenc = enc; + sc->changedsincelasthinted = true; /* I don't understand the scaffold lines */ + /* which I think are the same as hints. So no hints processed. PfaEdit */ + /* should autohint the char */ + sprintf( buffer,"uni%04X", enc); + sc->name = copy( psunicodenames[enc]==NULL ? buffer : psunicodenames[enc]); + sc->width = (outline->defxadvance*(sf->ascent + sf->descent))/1000; + sc->vwidth = (outline->defyadvance*(sf->ascent + sf->descent))/1000; + if ( outline->xadvance!=NULL ) + sc->width = (outline->xadvance[enc]*(sf->ascent+sf->descent))/1000; + if ( outline->yadvance!=NULL ) + sc->vwidth = (outline->yadvance[enc]*(sf->ascent+sf->descent))/1000; + + if ( flags&(1<<4) ) { + r1 = gcalloc(1,sizeof(RefChar)); + r1->transform[0] = r1->transform[3] = 1; + r1->local_enc = readcharindex(file,flags&(1<<6)); + if ( flags&(1<<5) ) { + r2 = gcalloc(1,sizeof(RefChar)); + r2->transform[0] = r2->transform[3] = 1; + r2->local_enc = readcharindex(file,flags&(1<<6)); + readcoords(file,flags&1,&x,&y); + r2->transform[4] = x; r2->transform[5] = y; + r1->next = r2; + } + sc->refs = r1; +return(sc); + } + + readcoords(file,flags&1,&x,&y); /* bounding box, lbearing, ybase */ + readcoords(file,flags&1,&x,&y); /* bounding box, width,height */ + + sc->splines = ReadSplineSets(file,flags,NULL,true); + verb = getc(file); + if ( verb!=EOF && verb&(1<<2) ) { + /* It looks to me as though the stroked paths are duplicates of the */ + /* filled paths, I'm assuming they are some form of hinting (if pixel*/ + /* size is too small then just stroke, otherwise fill?) */ + /* Every character has them... */ + /*fprintf( stderr, "There are some stroked paths in %s, you should run\n Element->Expand Stroke on this character\n", sc->name );*/ + if ( includestrokes ) + sc->splines = ReadSplineSets(file,flags,sc->splines,false); + else + ReadSplineSets(file,flags,NULL,false); /* read and ignore */ + verb = getc(file); + } + if ( verb!=EOF && verb&(1<<3)) { + while ( (ch=readcharindex(file,flags&(1<<6)))!=0 && !feof(file)) { + r1 = gcalloc(1,sizeof(RefChar)); + r1->transform[0] = r1->transform[3] = 1; + r1->local_enc = ch; + readcoords(file,flags&1,&x,&y); + r1->transform[4] = x; r1->transform[5] = y; + r1->next = sc->refs; + sc->refs = r1; + } + } +return( sc ); +} + +static void ReadChunk(FILE *file,struct Outlines *outline,int chunk) { + int flag=0x80000000; + int i, offsets[32]; + int index_start; + + fseek(file,outline->chunk_offset[chunk],SEEK_SET); + + if ( outline->version>=7 ) + flag = r_getint(file); + else if ( outline->version==6 ) + flag = (1<<7); + if ( !flag&0x80000000 ) + fprintf( stderr, "Bad flag at beginning of chunk %d\n", chunk ); + + index_start = ftell(file); + for ( i=0; i<32; ++i ) + offsets[i] = r_getint(file); + + if ( flag & (1<<7) ) { + /* Does this chunk have any composit characters which refer to things */ + /* in other chunks? I don't really care so I ignore them all */ + for ( i=0; i<((outline->nchunks+7)>>3); ++i ) + getc(file); + } + + for ( i=0; i<32; ++i ) if ( offsets[i]!=0 && 32*chunk+imetrics_n ) { + fseek(file,index_start+offsets[i],SEEK_SET); + outline->sf->chars[32*chunk+i] = ReadChar(file,outline,32*chunk+i); + } +} + +/* Handles *?{}[] wildcards */ +static int WildMatch(char *pattern, char *name,int ignorecase) { + char ch, *ppt, *npt, *ept; + + if ( pattern==NULL ) +return( true ); + + while (( ch = *pattern)!='\0' ) { + if ( ch=='*' ) { + for ( npt=name; ; ++npt ) { + if ( WildMatch(pattern+1,npt,ignorecase)) +return( true ); + if ( *npt=='\0' ) +return( false ); + } + } else if ( ch=='?' ) { + if ( *name=='\0' ) +return( false ); + ++name; + } else if ( ch=='[' ) { + /* [...] matches the chars + /* [-...] matches any char within the range (inclusive) + /* the above may be concattenated and the resultant pattern matches + /* anything thing which matches any of them. + /* [^...] matches any char which does not match the rest of + /* the pattern + /* []...] as a special case a ']' immediately after the '[' matches + /* itself and does not end the pattern */ + int found = 0, not=0; + ++pattern; + if ( pattern[0]=='^' ) { not = 1; ++pattern; } + for ( ppt = pattern; (ppt!=pattern || *ppt!=']') && *ppt!='\0' ; ++ppt ) { + ch = *ppt; + if ( ppt[1]=='-' && ppt[2]!=']' && ppt[2]!='\0' ) { + int ch2 = ppt[2]; + if ( (*name>=ch && *name<=ch2) || + (ignorecase && islower(ch) && islower(ch2) && + *name>=toupper(ch) && *name<=toupper(ch2)) || + (ignorecase && isupper(ch) && isupper(ch2) && + *name>=tolower(ch) && *name<=tolower(ch2))) { + if ( !not ) { + found = 1; + break; + } + } else { + if ( not ) { + found = 1; + break; + } + } + ppt += 2; + } else if ( ch==*name || (ignorecase && tolower(ch)==tolower(*name)) ) { + if ( !not ) { + found = 1; + break; + } + } else { + if ( not ) { + found = 1; + break; + } + } + } + if ( !found ) +return( false ); + while ( *ppt!=']' && *ppt!='\0' ) ++ppt; + pattern = ppt; + ++name; + } else if ( ch=='{' ) { + /* matches any of a comma seperated list of substrings */ + for ( ppt = pattern+1; *ppt!='\0' ; ppt = ept ) { + for ( ept=ppt; *ept!='}' && *ept!=',' && *ept!='\0'; ++ept ); + for ( npt = name; pptd_name,true) ) { + strcpy(buffer,dirname); + strcat(buffer,"/"); + strcat(buffer,ent->d_name); + closedir(dir); +return( 1 ); /* Good */ + } + } + closedir(dir); +return( 0 ); /* Not found */ +} + +static int dirfind(char *dir, char *pattern,char *buffer) { + char *pt, *space; + int ret = dirmatch(dir,pattern,buffer); + + if ( ret==-1 ) { + /* Just in case the give us the pathspec for the Outlines file rather than the dir containing it */ + space = copy(dir); + pt = strrchr(space,'/'); + if ( pt!=NULL ) { + *pt = '\0'; + ret = dirmatch(space,pattern,buffer); + } + free( space ); + } + if ( ret==-1 ) + ret = 0; + if ( !ret ) { + strcpy(buffer,dir); + strcat(buffer,"/"); + strcat(buffer,pattern); + } +return( ret ); +} + +static void ReadIntmetrics(char *dir, struct Outlines *outline) { + char *filename = malloc(strlen(dir)+strlen("/Intmetrics")+3); + FILE *file=NULL; + int i, flags, m, n, left, right; + int kern_offset, table_base, misc_offset; + char buffer[100]; + uint8 *mapping=NULL; + int *widths; + struct r_kern *kern; + + if ( dirfind(dir, "IntMet?",filename) ) + file = fopen(filename,"rb"); + else if ( dirfind(dir, "Intmetric?",filename) ) + file = fopen(filename,"rb"); + if ( file==NULL ) { + fprintf(stderr,"Couldn't open %s (for advance width data)\n Oh well, advance widths will all be wrong.\n", filename ); + free(filename); +return; + } + for ( i=0; i<40; ++i ) { + buffer[i] = getc(file); + if ( buffer[i]=='\r' ) buffer[i] = '\0'; + } + buffer[i] = '\0'; + outline->metrics_fontname = copy(buffer); + r_getint(file); /* Must be 16 */ + r_getint(file); /* Must be 16 */ + n = getc(file); /* low order byte */ + /* version number = */ getc(file); + flags = getc(file); + n |= getc(file)<<8; /* high order byte */ + if ( flags&(1<<5) ) + m = r_getushort(file); + else + m = 256; + if ( m!=0 ) { + mapping = galloc(m); + for ( i=0; imetrics_n = m; + } else + outline->metrics_n = n; + if ( !(flags&1) ) { + /* I ignore bbox data */ + for ( i=0; i<4*n; ++i ) + r_getshort(file); + } + if ( !(flags&2) ) { + widths = galloc(n*sizeof(int)); + for ( i=0; ixadvance = widths; + else { + outline->xadvance = gcalloc(outline->metrics_n,sizeof(int)); + for ( i=0; ixadvance[i] = widths[mapping[i]]; + free(widths); + } + } + if ( !(flags&4) ) { + widths = galloc(n*sizeof(int)); + for ( i=0; iyadvance = widths; + else { + outline->yadvance = gcalloc(outline->metrics_n,sizeof(int)); + for ( i=0; iyadvance[i] = widths[mapping[i]]; + free(widths); + } + } + + outline->defxadvance = outline->defyadvance = 1000; + + if ( flags&8 ) { + table_base = ftell(file); + misc_offset = r_getshort(file); + kern_offset = r_getshort(file); + if ( misc_offset!=0 ) { + fseek(file,misc_offset+table_base,SEEK_SET); + /* font bounding box */ r_getshort(file); r_getshort(file); r_getshort(file); r_getshort(file); + if ( (flags&2) ) + outline->defxadvance = r_getshort(file); + if ( (flags&4) ) + outline->defyadvance = r_getshort(file); + } + if ( kern_offset!=0 && !feof(file) && outline->metrics_n!=0 ) { + fseek(file,kern_offset+table_base,SEEK_SET); + outline->kerns = gcalloc(outline->metrics_n,sizeof(struct r_kern *)); + if ( flags&(1<<6) ) { + /* 16 bit */ + while ( (left=r_getshort(file))!=0 && !feof(file)) { + while ( (right=r_getshort(file))!=0 ) { + if ( !(flags&2) && !feof(file)) { + kern = galloc(sizeof(struct r_kern)); + kern->amount = r_getshort(file); + kern->right = right; + kern->next = outline->kerns[left]; + outline->kerns[left] = kern; + } + if ( !(flags&4) ) + /* I don't care about vertical kerning */ r_getshort(file); + } + } + } else { + while ( (left=getc(file))!=0 && !feof(file)) { + while ( (right=getc(file))!=0 && !feof(file)) { + if ( !(flags&2) ) { + kern = galloc(sizeof(struct r_kern)); + kern->amount = r_getshort(file); + kern->right = right; + kern->next = outline->kerns[left]; + outline->kerns[left] = kern; + } + if ( !(flags&4) ) + /* I don't care about vertical kerning */ r_getshort(file); + } + } + } + } + } + fclose(file); +} + +static void FixupKerns(SplineFont *sf,struct Outlines *outline) { + int i; + struct r_kern *kern; + KernPair *kp; + int em = sf->ascent+sf->descent; + + if ( outline->kerns==NULL ) +return; + + for ( i=0; imetrics_n; ++i ) { + for ( kern = outline->kerns[i]; kern!=NULL; kern=kern->next ) { + kp = gcalloc(1,sizeof(KernPair)); + kp->off = em*kern->amount/1000; + kp->sc = sf->chars[kern->right]; + kp->next = sf->chars[i]->kerns; + sf->chars[i]->kerns = kp; + } + } +} + +static void FixupRefs(SplineChar *sc,SplineFont *sf) { + RefChar *rf, *prev, *next; + + if ( sc==NULL || sc->refs==NULL ) +return; + prev = NULL; + for ( rf = sc->refs; rf!=NULL; rf=next ) { + next = rf->next; + if ( rf->local_enc<0 || rf->local_enc>=sf->charcnt || sf->chars[rf->local_enc]==NULL ) { + fprintf( stderr, "%s contains a reference to a character at index %d which does not exist.\n", + sc->name, rf->local_enc ); + if ( prev==NULL ) + sc->refs = next; + else + prev->next = next; + free(rf); + } else { + rf->sc = sf->chars[rf->local_enc]; + rf->adobe_enc = getAdobeEnc(rf->sc->name); + prev = rf; + } + } +} + +static void FindEncoding(SplineFont *sf,char *filename) { + char *pt, *end; + char pattern[12]; + char *otherdir; + char *encfilename; + FILE *file; + char buffer[200]; + int pos; + + strcpy(pattern,"Base *"); + pattern[4] = filename[strlen(filename)-1]; + pt = strrchr(filename,'/'); + if ( pt!=NULL ) + *pt = '\0'; + otherdir = galloc(strlen(filename)+strlen("/../Encodings")+5); + strcpy(otherdir,filename); + strcat(otherdir,"/../Encodings"); + encfilename = galloc(strlen(otherdir)+strlen("base0encoding")+20); + + if ( dirfind(otherdir, pattern,encfilename) ) + file = fopen(encfilename,"r"); + else if ( dirfind(filename, pattern,encfilename) ) + file = fopen(encfilename,"r"); + free(otherdir); + + if ( file==NULL ) { + fprintf(stderr,"Couldn't open %s\n", encfilename ); + free(encfilename); +return; + } + + pos = 0; + while ( fgets(buffer,sizeof(buffer),file)!=NULL ) { + if ( *buffer=='%' || *buffer=='\n' ) + continue; + for ( pt = buffer; *pt!='\0' ; ) { + while ( isspace(*pt)) ++pt; + if ( *pt=='/' ) { + for ( end = ++pt; !isspace(*end) && *end!='\0'; ++end ); + if ( sf->chars[pos]!=NULL ) { + free(sf->chars[pos]->name); + sf->chars[pos]->name = copyn(pt,end-pt); + sf->chars[pos]->unicodeenc = UnicodeFromName(sf->chars[pos]->name); + } + ++pos; + pt = end; + } else + break; + } + } + free(encfilename); + fclose(file); +} + +static SplineFont *ReadOutline(char *dir) { + char *filename = malloc(strlen(dir)+strlen("/Outlines*")+3); + FILE *file = NULL; + struct Outlines outline; + int i, ch; + char buffer[100]; + + if ( dirfind(dir, "Outlines*",filename) ) + file = fopen(filename,"rb"); + if ( file==NULL ) { + fprintf(stderr,"Couldn't open %s\n", filename ); + free(filename); +return( NULL ); + } + + if ( getc(file)!='F' || getc(file)!='O' || getc(file)!='N' || getc(file)!='T' || + getc(file)!='\0') { /* Final null means outline font */ + fprintf(stderr, "%s is not an acorn risc outline font file\n", filename ); + free(filename); + fclose(file); +return( NULL ); + } + + memset(&outline,0,sizeof(outline)); + + ReadIntmetrics(dir,&outline); + + outline.version = getc(file); + outline.design_size = r_getushort(file); + + /* bounding box, I don't care */ + /* minx = */ r_getshort(file); + /* miny = */ r_getshort(file); + /* width = */ r_getshort(file); + /* height = */ r_getshort(file); + + if ( outline.version<8 ) { + outline.nchunks = 8; + outline.chunk_offset = malloc(9*sizeof(int)); + for ( i=0; i<9; ++i ) + outline.chunk_offset[i] = r_getint(file); + outline.scaf_flags = 0; + outline.ns = -1; + } else { + int chunk_off = r_getint(file), pos; + outline.nchunks = r_getint(file); + outline.ns = r_getint(file); + outline.scaf_flags = r_getint(file); + for ( i=0; i<5; ++i ) + /* MBZ = */ r_getint(file); + pos = ftell(file); + fseek(file,chunk_off,SEEK_SET); + outline.chunk_offset = malloc((outline.nchunks+1)*sizeof(int)); + for ( i=0; i<=outline.nchunks; ++i ) + outline.chunk_offset[i] = r_getint(file); + fseek(file,pos,SEEK_SET); + } + + /* I really have no idea what these scaffold thingies are */ + outline.scaffold_size = r_getushort(file); + if ( outline.ns==-1 ) + outline.ns = outline.scaffold_size/2; + else if ( 2*outline.ns+1 > outline.scaffold_size ) + fprintf( stderr, "Inconsistant scaffold count\n" ); + /* I don't understand the scaffold stuff. */ + /* there should be outline.ns-1 shorts of offsets, followed by a byte */ + /* followed by the data the offsets point to. I'm just going to skip */ + /* all of it. */ + for ( i=0; ii ) + outline.metrics_n = i; + + outline.sf = SplineFontEmpty(); + outline.sf->charcnt = outline.metrics_n; + outline.sf->chars = gcalloc(outline.sf->charcnt,sizeof(SplineChar *)); + outline.sf->fontname = despace(outline.fontname); + outline.sf->fullname = copy(outline.fontname); + outline.sf->familyname = GuessFamily(outline.fontname); + outline.sf->weight = GuessWeight(outline.fontname); + if ( strcmp(buffer,"Outlines")!=0 ) + outline.sf->copyright = copy(buffer); + strcpy(buffer,outline.fontname); + strcat(buffer,".sfd"); + outline.sf->filename = copy(buffer); + + outline.sf->ascent = 4*outline.design_size/5; + outline.sf->descent = outline.design_size - outline.sf->ascent; + + outline.sf->display_antialias = true; + outline.sf->display_size = -24; + + for ( i=0; icharcnt; ++i ) + FixupRefs(outline.sf->chars[i],outline.sf); + + if ( isdigit(filename[strlen(filename)-1]) ) + FindEncoding(outline.sf,filename); + + free(filename); + fclose(file); + + if ( !SFDWrite(outline.sf->filename,outline.sf) ) + fprintf( stderr, "Failed to write outputfile %s\n", outline.sf->filename ); + else + fprintf( stderr, "Created: %s\n", outline.sf->filename ); +return( outline.sf ); +} + +extern const char *source_modtime_str; + +void doversion(void) { + extern const char *source_version_str; + + fprintf( stderr, "Copyright \251 2002 by George Williams.\n Executable based on sources from %s.\n", + source_modtime_str ); + + printf( "acorn2sfd %s\n", source_version_str ); +exit(0); +} + +static void dousage(void) { + printf( "acorn2sfd [options] {acorndirs}\n" ); + printf( "\t-version\t (prints the version of acorn2sfd and exits)\n" ); + printf( "\t-help\t\t (prints a brief help text and exits)\n" ); + printf( "For more information see:\n\thttp://pfaedit.sourceforge.net/\n" ); + printf( "Send bug reports to:\tgww@silcom.com\n" ); +exit(0); +} + +static void dohelp(void) { + printf( "acorn2sfd -- reads an acorn RISCOS font and creates an sfd file.\n" ); + printf( " Acorn RISCOS fonts consist of two files \"Outlines\" and \"Intmetrics\" in a\n" ); + printf( " directory. This program takes a list of directory names and attempts to\n" ); + printf( " convert the font data within each directory to one of PfaEdit's sfd files\n\n" ); + dousage(); +} + +int main(int argc, char **argv) { + int i, any=false; + char *pt; + + for ( i=1; i +#include "splinefont.h" +#include "ustring.h" + +static void SpAdjustTo(SplinePoint *sp,real newx, real newy) { + sp->prevcp.x += newx-sp->me.x; + sp->nextcp.x += newx-sp->me.x; + sp->prevcp.y += newy-sp->me.y; + sp->nextcp.y += newy-sp->me.y; + sp->me.x = newx; + sp->me.y = newy; +} + +static void SpaceOne(CharView *cv,SplinePoint *sp) { + SplinePoint *prev = sp->prev->from, *next = sp->next->to; + BasePoint v, new; + real len, off; + /* Rotate the coordinate system so that one axis is parallel to the */ + /* line between sp->next->to and sp->prev->from. Position sp so that */ + /* it is mid-way between the two on that axis while its distance from */ + /* the axis (ie. the other coord) remains unchanged */ + /* Of course we do this with dot products rather than actual rotations */ + + v.x = next->me.x - prev->me.x; + v.y = next->me.y - prev->me.y; + len = sqrt(v.x*v.x + v.y*v.y); + v.x /= len; v.y /= len; + off = (sp->me.x-prev->me.x)*v.y - (sp->me.y-prev->me.y)*v.x; + new.x = (next->me.x + prev->me.x)/2 + off*v.y; + new.y = (next->me.y + prev->me.y)/2 - off*v.x; + + CVPreserveState(cv); + SpAdjustTo(sp,new.x,new.y); + SplineRefigure(sp->prev); SplineRefigure(sp->next); + CVCharChangedUpdate(cv); +} + +static void SpaceMany(CharView *cv,DBounds *b, int dir, int region_size, int cnt) { + SplinePoint *sp; + SplineSet *spl; + struct region { real begin, end, offset; } *regions; + int rcnt,i,j; + real range, rtot, space, rpos; + + if ( dir==-1 ) { + if ( b->maxx - b->minx > b->maxy - b->miny ) + dir = 0; /* Space out along x axis */ + else + dir = 1; /* Space out along y axis */ + } + + regions = galloc(cnt*sizeof(struct region)); + rcnt = 0; + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + sp=spl->first; + while ( 1 ) { + if ( sp->selected ) { + real coord = dir?sp->me.y:sp->me.x; + for ( i=0; iregions[i].end+region_size; ++i ); + if ( i==rcnt ) { + regions[i].begin = regions[i].end = coord; + ++rcnt; + } else if ( coordi; --j ) + regions[j] = regions[j-1]; + regions[i].begin = regions[i].end = coord; + } else { + if ( regions[i].begin>coord ) + regions[i].begin = coord; + else if ( regions[i].end < coord ) { + regions[i].end = coord; + if ( i=regions[i+1].begin ) { + /* Merge two regions */ + regions[i].end = regions[i+1].end; + --rcnt; + for ( j=i+1; jnext==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + + /* we need at least three regions to space things out */ + if ( rcnt<3 ) +return; + + /* Now should I allow equal spaces between regions, or spaces between */ + /* region mid-points? I think spaces between regions */ + range = regions[rcnt-1].end-regions[0].begin; + rtot = 0; + for ( j=0; jlayerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + sp=spl->first; + while ( 1 ) { + if ( sp->selected ) { + real coord = dir?sp->me.y:sp->me.x; + for ( i=0; iregions[i].end; ++i ); + if ( i==rcnt ) + GDrawIError( "Region list is screwed up"); + else { + if ( dir==0 ) { + sp->me.x += regions[i].offset; + sp->prevcp.x += regions[i].offset; + sp->nextcp.x += regions[i].offset; + } else { + sp->me.y += regions[i].offset; + sp->prevcp.y += regions[i].offset; + sp->nextcp.y += regions[i].offset; + } + if ( sp->prev!=NULL ) + SplineRefigure(sp->prev); + if ( sp->next!=NULL ) + SplineRefigure(sp->next); + } + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + CVCharChangedUpdate(cv); + free(regions); +} + +static void AverageTwo(CharView *cv,SplinePoint *sp1, SplinePoint *sp2) { + real xoff, yoff, xpos, ypos, pos0, pos1; + + xoff = sp1->me.x - sp2->me.x; + yoff = sp1->me.y - sp2->me.y; + CVPreserveState(cv); + if ( fabs(yoff)me.y+sp2->me.y)/2 ); + sp1->prevcp.y += ypos-sp1->me.y; + sp1->nextcp.y += ypos-sp1->me.y; + sp2->prevcp.y += ypos-sp2->me.y; + sp2->nextcp.y += ypos-sp2->me.y; + sp1->me.y = sp2->me.y = ypos; + } else if ( fabs(xoff)me.x+sp2->me.x)/2 ); + sp1->prevcp.x += xpos-sp1->me.x; + sp1->nextcp.x += xpos-sp1->me.x; + sp2->prevcp.x += xpos-sp2->me.x; + sp2->nextcp.x += xpos-sp2->me.x; + sp1->me.x = sp2->me.x = xpos; + } else if ( (xoff>0 && yoff>0) || (xoff<0 && yoff<0 ) ) { + if ( xoff<0 ) { xoff= -xoff; yoff= -ypos; } + pos1 = rint((sp1->me.x+sp2->me.x-sp1->me.y-sp2->me.y)/4); + pos0 = (sp1->me.x+sp1->me.y)/2; + SpAdjustTo(sp1,pos0+pos1,pos0-pos1); + pos0 = (sp2->me.x+sp2->me.y)/2; + SpAdjustTo(sp2,pos0+pos1,pos0-pos1); + } else { + if ( xoff<0 ) { xoff= -xoff; yoff= -ypos; } + pos0 = rint((sp1->me.x+sp2->me.x+sp1->me.y+sp2->me.y)/4); + pos1 = (sp1->me.x-sp1->me.y)/2; + SpAdjustTo(sp1,pos0+pos1,pos0-pos1); + pos1 = (sp2->me.x-sp2->me.y)/2; + SpAdjustTo(sp2,pos0+pos1,pos0-pos1); + } + if ( sp1->prev ) SplineRefigure(sp1->prev); + if ( sp1->next ) SplineRefigure(sp1->next); + if ( sp2->prev ) SplineRefigure(sp2->prev); + if ( sp2->next ) SplineRefigure(sp2->next); + CVCharChangedUpdate(cv); +} + +static void AverageMany(CharView *cv,DBounds *b) { + real xoff, yoff, xpos, ypos; + SplinePoint *sp; + SplineSet *spl; + + xoff = b->maxx - b->minx; + yoff = b->maxy - b->miny; + CVPreserveState(cv); + if ( yoffmaxy+b->miny)/2 ); + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + sp=spl->first; + while ( 1 ) { + if ( sp->selected ) { + sp->prevcp.y += ypos-sp->me.y; + sp->nextcp.y += ypos-sp->me.y; + sp->me.y = ypos; + if ( sp->prev ) SplineRefigure(sp->prev); + if ( sp->next ) SplineRefigure(sp->next); + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + } else if ( xoffmaxx+b->minx)/2 ); + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + sp=spl->first; + while ( 1 ) { + if ( sp->selected ) { + sp->prevcp.x += xpos-sp->me.x; + sp->nextcp.x += xpos-sp->me.x; + sp->me.x = xpos; + if ( sp->prev ) SplineRefigure(sp->prev); + if ( sp->next ) SplineRefigure(sp->next); + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + } else { + } + CVCharChangedUpdate(cv); +} + +struct rcd { + CharView *cv; + int done; + DBounds *b; + int cnt; +}; +static real lastsize = 100; + +#define CID_Y 1001 +#define CID_X 1002 +#define CID_Size 1003 + + +static int RC_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct rcd *rcd = GDrawGetUserData(gw); + int err=false; + real size; + int dir = GGadgetIsChecked(GWidgetGetControl(gw,CID_Y)); + size = GetRealR(gw,CID_Size,_STR_Size,&err); + if ( err ) +return(true); + SpaceMany(rcd->cv,rcd->b, dir, size, rcd->cnt); + + rcd->done = true; + } +return( true ); +} + +static int RC_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct rcd *rcd = GDrawGetUserData(GGadgetGetWindow(g)); + rcd->done = true; + } +return( true ); +} + +static int rcd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct rcd *rcd = GDrawGetUserData(gw); + rcd->done = true; + } +return( event->type!=et_char ); +} + +static void RegionControl(CharView *cv,DBounds *b,int cnt) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + struct rcd rcd; + char buffer[20]; + + rcd.cv = cv; + rcd.b = b; + rcd.cnt = cnt; + rcd.done = false; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<maxx-b->minx > b->maxy-b->miny ) + gcd[1].gd.flags |= gg_cb_on; + else + gcd[2].gd.flags |= gg_cb_on; + + label[3].text = (unichar_t *) _STR_MaximumDistanceBetweenPts; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 5; gcd[3].gd.pos.y = gcd[1].gd.pos.y+16; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].creator = GLabelCreate; + + sprintf( buffer, "%g", lastsize ); + label[4].text = (unichar_t *) buffer; + label[4].text_is_1byte = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.pos.x = gcd[1].gd.pos.x; gcd[4].gd.pos.y = gcd[3].gd.pos.y+14; gcd[4].gd.pos.width = 40; + gcd[4].gd.flags = gg_enabled|gg_visible; + gcd[4].gd.cid = CID_Size; + gcd[4].creator = GTextFieldCreate; + + gcd[5].gd.pos.x = 20-3; gcd[5].gd.pos.y = gcd[4].gd.pos.y+35-3; + gcd[5].gd.pos.width = -1; gcd[5].gd.pos.height = 0; + gcd[5].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[5].text = (unichar_t *) _STR_OK; + label[5].text_in_resource = true; + gcd[5].gd.mnemonic = 'O'; + gcd[5].gd.label = &label[5]; + gcd[5].gd.handle_controlevent = RC_OK; + gcd[5].creator = GButtonCreate; + + gcd[6].gd.pos.x = -20; gcd[6].gd.pos.y = gcd[5].gd.pos.y+3; + gcd[6].gd.pos.width = -1; gcd[6].gd.pos.height = 0; + gcd[6].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[6].text = (unichar_t *) _STR_Cancel; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.mnemonic = 'C'; + gcd[6].gd.handle_controlevent = RC_Cancel; + gcd[6].creator = GButtonCreate; + + gcd[7].gd.pos.x = 2; gcd[7].gd.pos.y = 2; + gcd[7].gd.pos.width = pos.width-4; gcd[7].gd.pos.height = pos.height-2; + gcd[7].gd.flags = gg_enabled|gg_visible| gg_pos_in_pixels; + gcd[7].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + + GTextFieldSelect(GWidgetGetControl(gw,CID_Size),0,-1); + + GDrawSetVisible(gw,true); + while ( !rcd.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); +} + +void CVConstrainSelection(CharView *cv,int type) { + DBounds b; + SplinePoint *first=NULL, *second=NULL, *other=NULL, *sp; + SplineSet *spl; + int cnt=0; + + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + sp=spl->first; + while ( 1 ) { + if ( sp->selected ) { + ++cnt; + if ( first == NULL ) { + first = sp; + b.minx = b.maxx = sp->me.x; + b.miny = b.maxy = sp->me.y; + } else { + if ( second==NULL ) second = sp; + else other = sp; + if ( b.minx>sp->me.x ) b.minx = sp->me.x; + if ( b.maxxme.x ) b.maxx = sp->me.x; + if ( b.miny>sp->me.y ) b.miny = sp->me.y; + if ( b.maxyme.y ) b.maxy = sp->me.y; + } + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + + if ( type==0 ) { + /* Average points */ + if ( second==NULL ) + /* Do Nothing */; + else if ( other==NULL ) + AverageTwo(cv,first,second); + else + AverageMany(cv,&b); + } else if ( type==1 ) { + /* Space points */ + if ( other!=NULL ) + SpaceMany(cv,&b,-1,0,cnt); + else if ( second!=NULL ) + /* Can't deal with it */; + else if ( first!=NULL ) + SpaceOne(cv,first); + else + /* Nothing selected */; + } else if ( type==2 ) { + /* Space selected regions */ + if ( other==NULL ) +return; /* Do nothing, need at least three regions */ + RegionControl(cv,&b,cnt); + } +} + +static void MakeParallel(Spline *e1, Spline *e2, SplinePoint *mobile) { + /* Splines e1&e2 are to be made parallel */ + /* The spline containing mobile is the one which is to be moved */ + Spline *temp; + double xdiff, ydiff, axdiff, aydiff; + SplinePoint *other; + + if ( e1->to==mobile || e1->from==mobile ) { + temp = e1; + e1 = e2; + e2 = temp; + } + /* Now the spline to be moved is e2 */ + other = e2->from==mobile ? e2->to : e2->from; + + if ( (axdiff = xdiff = e1->to->me.x-e1->from->me.x)<0 ) axdiff = -axdiff; + if ( (aydiff = ydiff = e1->to->me.y-e1->from->me.y)<0 ) aydiff = -aydiff; + if ( aydiff > axdiff ) { + /* Hold the y coordinate fixed in e2 and move the x coord appropriately */ + int oldx = mobile->me.x; + mobile->me.x = (mobile->me.y-other->me.y)*xdiff/ydiff + other->me.x; + mobile->nextcp.x += mobile->me.x-oldx; + mobile->prevcp.x += mobile->me.x-oldx; + } else { + int oldy = mobile->me.y; + mobile->me.y = (mobile->me.x-other->me.x)*ydiff/xdiff + other->me.y; + mobile->nextcp.y += mobile->me.y-oldy; + mobile->prevcp.y += mobile->me.y-oldy; + } + if ( mobile->next!=NULL ) + SplineRefigure(mobile->prev); + if ( mobile->prev!=NULL ) + SplineRefigure(mobile->next); +} + +static void MakeParallelogram(Spline *e11, Spline *e12, Spline *e21, Spline *e22, + SplinePoint *mobile) { + /* Splines e11&e12 are to be made parallel, as are e21&e22 */ + /* The spline containing mobile is the one which is to be moved */ + Spline *temp; + SplinePoint *other1, *other2, *unconnected; + double denom; + + if ( e11->to==mobile || e11->from==mobile ) { + temp = e11; + e11 = e12; + e12 = temp; + } + if ( e21->to==mobile || e21->from==mobile ) { + temp = e21; + e21 = e22; + e22 = temp; + } + /* Now the splines to be moved are e?2, while e?1 is held fixed */ + other1 = e12->from==mobile ? e12->to : e12->from; + other2 = e22->from==mobile ? e22->to : e22->from; + unconnected = e11->from==other2 ? e11->to : e11->from; + + denom = (unconnected->me.y-other1->me.y)*(unconnected->me.x-other2->me.x) - + (unconnected->me.y-other2->me.y)*(unconnected->me.x-other1->me.x); + if ( denom>-.0001 && denom<.0001 ) { + /* The two splines e11 and e21 are essentially parallel, so we can't */ + /* move mobile to the place where they intersect */ + mobile->me = unconnected->me; + } else { + mobile->me.y = + ((other2->me.x-other1->me.x)*(unconnected->me.y-other1->me.y)* + (unconnected->me.y-other2->me.y) - + other2->me.y*(unconnected->me.y-other2->me.y)*(unconnected->me.x-other1->me.x) + + other1->me.y*(unconnected->me.y-other1->me.y)*(unconnected->me.x-other2->me.x))/ + denom; + if ( unconnected->me.y-other1->me.y==0 ) + mobile->me.x = other1->me.x + (unconnected->me.x-other2->me.x)/(unconnected->me.y-other2->me.y)* + (mobile->me.y-other1->me.y); + else + mobile->me.x = other2->me.x + (unconnected->me.x-other1->me.x)/(unconnected->me.y-other1->me.y)* + (mobile->me.y-other2->me.y); + } + mobile->nextcp = mobile->prevcp = mobile->me; + SplineRefigure(mobile->prev); + SplineRefigure(mobile->next); +} + +static int CommonEndPoint(Spline *s1, Spline *s2) { +return( s1->to==s2->to || s1->to==s2->from || s1->from==s2->to || s1->from==s2->from ); +} + +void CVMakeParallel(CharView *cv) { + /* takes exactly four selected points and tries to find two lines between */ + /* them which it then makes parallel */ + /* If the points are a quadralateral then we make it a parallelogram */ + /* If the points define 3 lines then throw out the middle one */ + /* If the points define 2 lines then good */ + /* Else complain */ + /* If possible, fix things by moving the lastselpt */ + SplinePoint *pts[4]; + Spline *edges[4]; + int cnt=0, mobilis; + SplineSet *ss; + SplinePoint *sp; + + for ( ss = cv->layerheads[cv->drawmode]->splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->selected ) { + if ( cnt>=4 ) +return; + pts[cnt++] = sp; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp == ss->first ) + break; + } + } + if ( cnt!=4 ) +return; + + for ( mobilis=0; mobilis<4; ++mobilis ) + if ( pts[mobilis]==cv->lastselpt ) + break; + if ( mobilis==4 ) mobilis=3; /* lastselpt didn't match, pick one */ + + cnt=0; + if ( pts[0]->next!=NULL && pts[0]->next->islinear && + (pts[0]->next->to==pts[1] || + pts[0]->next->to==pts[2] || + pts[0]->next->to==pts[3]) && + (pts[0]->me.x!=pts[0]->next->to->me.x || pts[0]->me.y!=pts[0]->next->to->me.y)) + edges[cnt++] = pts[0]->next; + if ( pts[1]->next!=NULL && pts[1]->next->islinear && + (pts[1]->next->to==pts[0] || + pts[1]->next->to==pts[2] || + pts[1]->next->to==pts[3]) && + (pts[1]->me.x!=pts[1]->next->to->me.x || pts[1]->me.y!=pts[1]->next->to->me.y)) + edges[cnt++] = pts[1]->next; + if ( pts[2]->next!=NULL && pts[2]->next->islinear && + (pts[2]->next->to==pts[0] || + pts[2]->next->to==pts[1] || + pts[2]->next->to==pts[3]) && + (pts[2]->me.x!=pts[2]->next->to->me.x || pts[2]->me.y!=pts[2]->next->to->me.y)) + edges[cnt++] = pts[2]->next; + if ( pts[3]->next!=NULL && pts[3]->next->islinear && + (pts[3]->next->to==pts[0] || + pts[3]->next->to==pts[1] || + pts[3]->next->to==pts[2]) && + (pts[3]->me.x!=pts[3]->next->to->me.x || pts[3]->me.y!=pts[3]->next->to->me.y)) + edges[cnt++] = pts[3]->next; + + if ( cnt<2 ) { + GWidgetErrorR(_STR_NotEnoughLines,_STR_NotEnoughLines); +return; + } else if ( cnt==2 && CommonEndPoint(edges[0],edges[1]) ) { + GWidgetErrorR(_STR_CantParallel,_STR_ShareCommonEndpoint); +return; + } + + CVPreserveState(cv); + if ( cnt==4 ) { + int second=3, third=1, fourth=2; + if ( !CommonEndPoint(edges[0],edges[1])) { + second = 1; third = 3; + } else if ( !CommonEndPoint(edges[0],edges[2])) { + second = 2; + fourth = 3; + } + MakeParallelogram(edges[0],edges[second], edges[third],edges[fourth], + pts[mobilis]); + } else if ( cnt==3 ) { + if ( !CommonEndPoint(edges[0],edges[1]) ) + MakeParallel(edges[0],edges[1],pts[mobilis]); + else if ( !CommonEndPoint(edges[0],edges[2]) ) + MakeParallel(edges[0],edges[2],pts[mobilis]); + else + MakeParallel(edges[1],edges[2],pts[mobilis]); + } else { + MakeParallel(edges[0],edges[1],pts[mobilis]); + } + CVCharChangedUpdate(cv); +} diff --git a/fontforge/autohint.c b/fontforge/autohint.c new file mode 100644 index 00000000..4be487a8 --- /dev/null +++ b/fontforge/autohint.c @@ -0,0 +1,4750 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include "splinefont.h" +#include "views.h" +#include +#include +#include "edgelist.h" + +/* to create a type 1 font we must come up with the following entries for the + private dictionary: + BlueValues -- an array of 2n entries where Blue[2i]0 + OtherBlues -- (optional) OtherBlue[i]<0 + (blue zones should be at least 3 units appart) + StdHW -- (o) array with one entry, standard hstem height + StdVW -- (o) ditto vstem width + StemSnapH -- (o) up to 12 numbers containing various hstem heights (includes StdHW), small widths first + StemSnapV -- (o) ditto, vstem +This file has routines to figure out at least some of these + +Also other routines to guess at good per-character hints +*/ + +static void AddBlue(real val, real array[5], int force) { + val = rint(val); + if ( !force && (valarray[0]+array[1] )) +return; /* Outside of one sd */ + if ( array[3]==0 && array[4]==0 ) + array[3] = array[4] = val; + else if ( val>array[4] ) + array[4] = val; + else if ( valzone2[3] && zone1[3]<=zone2[3]) || + (zone2[4]+3>zone1[3] && zone2[3]<=zone1[3]) )) { + if (( zone2[0]zone1[0]+zone1[1] ) && + ( zone1[0]zone2[0]+zone2[1] )) + /* the means of the zones are too far appart, don't merge em */; + else { + if ( zone1[0]zone2[1] ) zone2[1] = zone1[1]; + } + zone1[2] = 0; + } +} + +/* I can deal with latin, greek and cyrillic because the they all come from */ +/* the same set of letter shapes and have all evolved together and have */ +/* various common features (ascenders, descenders, lower case, etc.). Other */ +/* scripts don't fit */ +void FindBlues( SplineFont *sf, real blues[14], real otherblues[10]) { + real caph[5], xh[5], ascenth[5], digith[5], descenth[5], base[5]; + real otherdigits[5]; + int i, any = 0, j, k; + DBounds b; + + /* Go through once to get some idea of the average value so we can weed */ + /* out undesireables */ + caph[0] = caph[1] = caph[2] = xh[0] = xh[1] = xh[2] = 0; + ascenth[0] = ascenth[1] = ascenth[2] = digith[0] = digith[1] = digith[2] = 0; + descenth[0] = descenth[1] = descenth[2] = base[0] = base[1] = base[2] = 0; + otherdigits[0] = otherdigits[1] = otherdigits[2] = 0; + for ( i=0; icharcnt; ++i ) { + if ( sf->chars[i]!=NULL && sf->chars[i]->layers[ly_fore].splines!=NULL ) { + int enc = sf->chars[i]->unicodeenc; + const unichar_t *upt; + if ( isalnum(enc) && + ((enc>=32 && enc<128 ) || enc == 0xfe || enc==0xf0 || enc==0xdf || + enc==0x131 || + (enc>=0x391 && enc<=0x3f3 ) || + (enc>=0x400 && enc<=0x4e9 ) )) { + /* no accented characters (or ligatures) */ + if ( unicode_alternates[enc>>8]!=NULL && + (upt =unicode_alternates[enc>>8][enc&0xff])!=NULL && + upt[1]!='\0' ) + continue; + any = true; + SplineCharFindBounds(sf->chars[i],&b); + if ( b.miny==0 && b.maxy==0 ) + continue; + if ( enc=='g' || enc=='j' || enc=='p' || enc=='q' || enc=='y' || + enc==0xfe || + enc==0x3c1 /* rho */ || + enc==0x3c6 /* phi */ || + enc==0x3c7 /* chi */ || + enc==0x3c8 /* psi */ || + enc==0x440 /* cyr er */ || + enc==0x443 /* cyr u */ || + enc==0x444 /* cyr ef */) { + descenth[0] += b.miny; + descenth[1] += b.miny*b.miny; + ++descenth[2]; + } else if ( enc=='x' || enc=='r' || enc=='o' || enc=='e' || + enc=='s' || enc=='c' || enc=='h' || enc=='k' || + enc=='l' || enc=='m' || enc=='n' || + enc==0x3b5 /* epsilon */ || + enc==0x3b9 /* iota */ || + enc==0x3ba /* kappa */ || + enc==0x3bf /* omicron */ || + enc==0x3c3 /* sigma */ || + enc==0x3c5 /* upsilon */ || + enc==0x430 /* cyr a */ || + enc==0x432 /* cyr ve */ || + enc==0x433 /* cyr ge */ || + enc==0x435 /* cyr e */ || + enc==0x436 /* cyr zhe */ || + enc==0x438 /* cyr i */ || + enc==0x43a /* cyr ka */ || + enc==0x43d /* cyr en */ || + enc==0x43e /* cyr o */ || + enc==0x441 /* cyr es */ || + enc==0x445 /* cyr ha */ || + enc==0x447 /* cyr che */ || + enc==0x448 /* cyr sha */ || + enc==0x44f /* cyr ya */ ){ + base[0] += b.miny; + base[1] += b.miny*b.miny; + ++base[2]; + } + /* careful of lowercase digits, 6 and 8 should be ascenders */ + if ( enc=='6' || enc=='8' ) { + digith[0] += b.maxy; + digith[1] += b.maxy*b.maxy; + ++digith[2]; + } else if ( isdigit(enc) ) { + otherdigits[0] += b.maxy; + otherdigits[1] += b.maxy*b.maxy; + ++otherdigits[2]; + } else if ( isupper(enc)) { + caph[0] += b.maxy; + caph[1] += b.maxy*b.maxy; + ++caph[2]; + } else if ( enc=='b' || enc=='d' || enc=='f' || enc=='h' || enc=='k' || + enc == 'l' || enc==0xf0 || enc==0xfe || enc == 0xdf || + enc == 0x3b2 || enc==0x3b6 || enc==0x3b8 || enc==0x3bb || + enc == 0x3be || + enc == 0x431 /* cyr be */ /* || enc == 0x444 - ef may have varible height */) { + ascenth[0] += b.maxy; + ascenth[1] += b.maxy*b.maxy; + ++ascenth[2]; + } else if ( enc=='c' || enc=='e' || enc=='o' || enc=='s' || enc=='u' || + enc=='u' || enc=='v' || enc=='w' || enc=='x' || enc=='y' || + enc=='z' || + enc==0x3b5 /* epsilon */ || + enc==0x3b9 /* iota */ || + enc==0x3ba /* kappa */ || + enc==0x3bc /* mu */ || + enc==0x3bd /* nu */ || + enc==0x3bf /* omicron */ || + enc==0x3c0 /* pi */ || + enc==0x3c1 /* rho */ || + enc==0x3c5 /* upsilon */ || + enc==0x433 /* cyr ge */ || + enc==0x435 /* cyr e */ || + enc==0x436 /* cyr zhe */ || + enc==0x438 /* cyr i */ || + enc==0x43b /* cyr el */ || + enc==0x43d /* cyr en */ || + enc==0x43e /* cyr o */ || + enc==0x43f /* cyr pe */ || + enc==0x440 /* cyr er */ || + enc==0x441 /* cyr es */ || + enc==0x442 /* cyr te */ || + enc==0x443 /* cyr u */ || + enc==0x445 /* cyr ha */ || + enc==0x446 /* cyr tse */ || + enc==0x447 /* cyr che */ || + enc==0x448 /* cyr sha */ || + enc==0x449 /* cyr shcha */ || + enc==0x44a /* cyr hard sign */ || + enc==0x44b /* cyr yery */ || + enc==0x44c /* cyr soft sign */ || + enc==0x44d /* cyr reversed e */ || + enc==0x44f /* cyr ya */ ) { + xh[0] += b.maxy; + xh[1] += b.maxy*b.maxy; + ++xh[2]; + } + } + } + if ( !GProgressNext()) + break; + } + if ( otherdigits[2]>0 && digith[2]>0 ) { + if ( otherdigits[0]/otherdigits[2] >= .95*digith[0]/digith[2] ) { + /* all digits are about the same height, not lowercase */ + digith[0] += otherdigits[0]; + digith[1] += otherdigits[1]; + digith[2] += otherdigits[2]; + } + } + + if ( xh[2]>1 ) { + xh[1] = sqrt((xh[1]-xh[0]*xh[0]/xh[2])/(xh[2]-1)); + xh[0] /= xh[2]; + } + if ( ascenth[2]>1 ) { + ascenth[1] = sqrt((ascenth[1]-ascenth[0]*ascenth[0]/ascenth[2])/(ascenth[2]-1)); + ascenth[0] /= ascenth[2]; + } + if ( caph[2]>1 ) { + caph[1] = sqrt((caph[1]-caph[0]*caph[0]/caph[2])/(caph[2]-1)); + caph[0] /= caph[2]; + } + if ( digith[2]>1 ) { + digith[1] = sqrt((digith[1]-digith[0]*digith[0]/digith[2])/(digith[2]-1)); + digith[0] /= digith[2]; + } + if ( base[2]>1 ) { + base[1] = sqrt((base[1]-base[0]*base[0]/base[2])/(base[2]-1)); + base[0] /= base[2]; + } + if ( descenth[2]>1 ) { + descenth[1] = sqrt((descenth[1]-descenth[0]*descenth[0]/descenth[2])/(descenth[2]-1)); + descenth[0] /= descenth[2]; + } + + /* we'll accept values between +/- 1sd of the mean */ + /* array[0] == mean, array[1] == sd, array[2] == cnt, array[3]=min, array[4]==max */ + caph[3] = caph[4] = 0; + xh[3] = xh[4] = 0; + ascenth[3] = ascenth[4] = 0; + digith[3] = digith[4] = 0; + descenth[3] = descenth[4] = 0; + base[3] = base[4] = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + int enc = sf->chars[i]->unicodeenc; + const unichar_t *upt; + if ( isalnum(enc) && + ((enc>=32 && enc<128 ) || enc == 0xfe || enc==0xf0 || enc==0xdf || + (enc>=0x391 && enc<=0x3f3 ) || + (enc>=0x400 && enc<=0x4e9 ) )) { + /* no accented characters (or ligatures) */ + if ( unicode_alternates[enc>>8]!=NULL && + (upt =unicode_alternates[enc>>8][enc&0xff])!=NULL && + upt[1]!='\0' ) + continue; + any = true; + SplineCharFindBounds(sf->chars[i],&b); + if ( b.miny==0 && b.maxy==0 ) + continue; + if ( enc=='g' || enc=='j' || enc=='p' || enc=='q' || enc=='y' || + enc==0xfe || enc == 0x3c6 || enc==0x3c8 || + enc==0x440 || enc==0x443 || enc==0x444) { + AddBlue(b.miny,descenth,false); + } else { + /* O and o get forced into the baseline blue value even if they*/ + /* are beyond 1 sd */ + AddBlue(b.miny,base,enc=='O' || enc=='o'); + } + if ( isdigit(enc)) { + AddBlue(b.maxy,digith,false); + } else if ( isupper(enc)) { + AddBlue(b.maxy,caph,enc=='O'); + } else if ( enc=='b' || enc=='d' || enc=='f' || enc=='h' || enc=='k' || + enc == 'l' || enc=='t' || enc==0xf0 || enc==0xfe || enc == 0xdf || + enc == 0x3b2 || enc==0x3b6 || enc==0x3b8 || enc==0x3bb || + enc == 0x3be || + enc == 0x431 ) { + AddBlue(b.maxy,ascenth,false); + } else if ( enc=='c' || enc=='e' || enc=='o' || enc=='s' || enc=='u' || + enc=='u' || enc=='v' || enc=='w' || enc=='x' || enc=='y' || + enc=='z' || + enc==0x3b5 /* epsilon */ || + enc==0x3b9 /* iota */ || + enc==0x3ba /* kappa */ || + enc==0x3bc /* mu */ || + enc==0x3bd /* nu */ || + enc==0x3bf /* omicron */ || + enc==0x3c0 /* pi */ || + enc==0x3c1 /* rho */ || + enc==0x3c5 /* upsilon */ || + enc==0x433 /* cyr ge */ || + enc==0x435 /* cyr e */ || + enc==0x436 /* cyr zhe */ || + enc==0x438 /* cyr i */ || + enc==0x43b /* cyr el */ || + enc==0x43d /* cyr en */ || + enc==0x43e /* cyr o */ || + enc==0x43f /* cyr pe */ || + enc==0x440 /* cyr er */ || + enc==0x441 /* cyr es */ || + enc==0x442 /* cyr te */ || + enc==0x443 /* cyr u */ || + enc==0x445 /* cyr ha */ || + enc==0x446 /* cyr tse */ || + enc==0x447 /* cyr che */ || + enc==0x448 /* cyr sha */ || + enc==0x449 /* cyr shcha */ || + enc==0x44a /* cyr hard sign */ || + enc==0x44b /* cyr yery */ || + enc==0x44c /* cyr soft sign */ || + enc==0x44d /* cyr reversed e */ || + enc==0x44f /* cyr ya */ ) { + AddBlue(b.maxy,xh,enc=='o' || enc=='x'); + } + } + } + + /* the descent blue zone merges into the base zone */ + MergeZones(descenth,base); + MergeZones(xh,base); + MergeZones(ascenth,caph); + MergeZones(digith,caph); + MergeZones(xh,caph); + MergeZones(ascenth,digith); + MergeZones(xh,digith); + + if ( otherblues!=NULL ) + for ( i=0; i<10; ++i ) + otherblues[i] = 0; + for ( i=0; i<14; ++i ) + blues[i] = 0; + + if ( otherblues!=NULL && descenth[2]!=0 ) { + otherblues[0] = descenth[3]; + otherblues[1] = descenth[4]; + } + i = 0; + if ( base[2]==0 && (xh[2]!=0 || ascenth[2]!=0 || caph[2]!=0 || digith[2]!=0 )) { + /* base line blue value must be present if any other value is */ + /* make one up if we don't have one */ + blues[0] = -20; + blues[1] = 0; + i = 2; + } else if ( base[2]!=0 ) { + blues[0] = base[3]; + blues[1] = base[4]; + i = 2; + } + if ( xh[2]!=0 ) { + blues[i++] = xh[3]; + blues[i++] = xh[4]; + } + if ( caph[2]!=0 ) { + blues[i++] = caph[3]; + blues[i++] = caph[4]; + } + if ( digith[2]!=0 ) { + blues[i++] = digith[3]; + blues[i++] = digith[4]; + } + if ( ascenth[2]!=0 ) { + blues[i++] = ascenth[3]; + blues[i++] = ascenth[4]; + } + + for ( j=0; jblues[k] ) { + real temp = blues[j]; + blues[j]=blues[k]; + blues[k] = temp; + temp = blues[j+1]; + blues[j+1] = blues[k+1]; + blues[k+1] = temp; + } + } +} + +static int PVAddBlues(BlueData *bd,int bcnt,char *pt) { + char *end; + real val1, val2; + int i,j; + + if ( pt==NULL ) +return( bcnt ); + + while ( isspace(*pt) || *pt=='[' ) ++pt; + while ( *pt!=']' && *pt!='\0' ) { + val1 = strtod(pt,&end); + if ( *end=='\0' || end==pt ) + break; + for ( pt=end; isspace(*pt) ; ++pt ); + val2 = strtod(pt,&end); + if ( end==pt ) + break; + if ( bcnt==0 || val1>bd->blues[bcnt-1][0] ) + i = bcnt; + else { + for ( i=0; ibd->blues[i][0]; ++i ); + for ( j=bcnt; j>i; --j ) { + bd->blues[j][0] = bd->blues[j-1][0]; + bd->blues[j][1] = bd->blues[j-1][1]; + } + } + bd->blues[i][0] = val1; + bd->blues[i][1] = val2; + ++bcnt; + if ( bcnt>=sizeof(bd->blues)/sizeof(bd->blues[0])) + break; + for ( pt=end; isspace(*pt) ; ++pt ); + } +return( bcnt ); +} + +/* Quick and dirty (and sometimes wrong) approach to figure out the common */ +/* alignment zones in latin (greek, cyrillic) alphabets */ +void QuickBlues(SplineFont *_sf, BlueData *bd) { + real xheight = -1e10, caph = -1e10, ascent = -1e10, descent = 1e10, max, min; + real xheighttop = -1e10, caphtop = -1e10; + real numh = -1e10, numhtop = -1e10; + real base = -1e10, basebelow = 1e10; + SplineFont *sf; + SplinePoint *sp; + SplineSet *spl; + int i,j, bcnt; + SplineChar *t; + char *pt; + + /* Get the alignment zones we care most about */ + + /* be careful of cid fonts */ + if ( _sf->cidmaster!=NULL ) + _sf = _sf->cidmaster; + + j=0; + do { + sf = ( _sf->subfontcnt==0 )? _sf : _sf->subfonts[j]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + int enc = sf->chars[i]->unicodeenc; + if ( enc=='I' || enc=='O' || enc=='x' || enc=='o' || enc=='p' || enc=='l' || +/* Jean-Christophe Dubacq points out that x-height should be calculated from */ +/* various characters and not just x and o. Italic "x"s often have strange */ +/* shapes */ + enc=='A' || enc==0x391 || enc==0x410 || + enc=='V' || + enc=='u' || enc=='v' || enc=='w' || enc=='y' || enc=='z' || + enc=='7' || enc=='8' || /* numbers with ascenders */ + enc==0x399 || enc==0x39f || enc==0x3ba || enc==0x3bf || enc==0x3c1 || enc==0x3be || enc==0x3c7 || + enc==0x41f || enc==0x41e || enc==0x43e || enc==0x43f || enc==0x440 || enc==0x452 || enc==0x445 ) { + t = sf->chars[i]; + while ( t->layers[ly_fore].splines==NULL && t->layers[ly_fore].refs!=NULL ) + t = t->layers[ly_fore].refs->sc; + max = -1e10; min = 1e10; + if ( t->layers[ly_fore].splines!=NULL ) { + for ( spl=t->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; ) { + if ( sp->me.y > max ) max = sp->me.y; + if ( sp->me.y < min ) min = sp->me.y; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + if ( enc>0x400 ) { + /* Only use ascent and descent here if we don't have anything better */ + if ( enc==0x41f ) { caph = max; base = min; } + else if ( enc==0x41e ) { if ( max>caphtop ) caphtop = max; basebelow = min; } + else if ( enc==0x410 ) { if ( max>caphtop ) caphtop = max; } + else if ( enc==0x43f && xheight<0 ) xheight = max; + else if ( enc==0x445 && xheight<0 ) xheight = max; + else if ( enc==0x43e ) xheighttop = max; + else if ( enc==0x452 && ascent<0 ) ascent = max; + else if ( enc==0x440 && descent>0 ) descent = min; + } else if ( enc>0x300 ) { + if ( enc==0x399 ) { caph = max; base = min; } + else if ( enc==0x391 ) { if ( max>caphtop ) caphtop = max; } + else if ( enc==0x39f ) { if ( max>caphtop ) caphtop = max; basebelow = min; } + else if ( enc==0x3ba && xheight<0 ) xheight = max; + else if ( enc==0x3c7 && xheight<0 ) xheight = max; + else if ( enc==0x3bf ) xheighttop = max; + else if ( enc==0x3be && ascent<0 ) ascent = max; + else if ( enc==0x3c1 && descent>0 ) descent = min; + } else { + if ( enc=='I' ) { caph = max; base = min; } + else if ( enc=='O' ) { if ( max>caphtop ) caphtop = max; if ( basebelowcaphtop ) caphtop = max; } + else if ( enc=='7' ) numh = max; + else if ( enc=='0' ) numhtop = max; + else if ( enc=='x' || enc=='o' || enc=='u' || enc=='v' || + enc =='w' || enc=='y' || enc=='z' ) { + if ( xheighttop==-1e10 ) xheighttop = max; + if ( xheight==-1e10 ) xheight = max; + if ( max > xheighttop ) xheighttop = max; + else if ( max20 ) xheight = max; + if ( enc=='y' && descent==1e10 ) descent = min; + } else if ( enc=='l' ) ascent = max; + else descent = min; + } + } + } + } + ++j; + } while ( j<_sf->subfontcnt ); + + if ( basebelow==1e10 ) basebelow=-1e10; + + if ( caphtopbase ) basebelow = base; else if ( base==-1e10 ) base=basebelow; + if ( base==-1e10 ) { base=basebelow = 0; } + if ( xheighttopxheight = xheight; bd->xheighttop = xheighttop; + bd->caph = caph; bd->caphtop = caphtop; + bd->numh = numh; bd->numhtop = numhtop; + bd->ascent = ascent; bd->descent = descent; + bd->base = base; bd->basebelow = basebelow; + + bcnt = 0; + if ( (pt=PSDictHasEntry(sf->private,"BlueValues"))!=NULL ) + bcnt = PVAddBlues(bd,bcnt,pt); + if ( (pt=PSDictHasEntry(sf->private,"OtherBlues"))!=NULL ) + bcnt = PVAddBlues(bd,bcnt,pt); + if ( bcnt==0 ) { + if ( basebelow==-1e10 ) basebelow = base; + if ( base==-1e10 ) base = basebelow; + if ( xheight==-1e10 ) xheight = xheighttop; + if ( xheighttop==-1e10 ) xheighttop = xheight; + if ( caph==-1e10 ) caph = caphtop; + if ( caphtop==-1e10 ) caphtop = caph; + if ( numh==-1e10 ) numh = numhtop; + if ( numhtop==-1e10 ) numhtop = numh; + if ( numh!=-1e10 && (numhtop>caph-2 && numhcaphtop ) caphtop = numhtop; + numh = numhtop = -1e10; + } + if ( ascent!=-1e10 && (ascent>caph-2 && ascentcaphtop ) caphtop = ascent; + ascent = -1e10; + } + if ( ascent!=-1e10 && (ascent>numh-2 && ascentnumhtop ) numhtop = ascent; + ascent = -1e10; + if ( numhtop>caph-2 && numhcaphtop ) caphtop = numhtop; + numh = numhtop = -1e10; + } + } + + if ( descent!=1e10 ) { + bd->blues[0][0] = bd->blues[0][1] = descent; + ++bcnt; + } + if ( basebelow!=-1e10 ) { + bd->blues[bcnt][0] = basebelow; + bd->blues[bcnt][1] = base; + ++bcnt; + } + if ( xheight!=-1e10 ) { + bd->blues[bcnt][0] = xheight; + bd->blues[bcnt][1] = xheighttop; + ++bcnt; + } + if ( numh!=-1e10 ) { + bd->blues[bcnt][0] = numh; + bd->blues[bcnt][1] = numhtop; + ++bcnt; + } + if ( caph!=-1e10 ) { + bd->blues[bcnt][0] = caph; + bd->blues[bcnt][1] = caphtop; + ++bcnt; + } + if ( ascent!=-1e10 ) { + bd->blues[bcnt][0] = bd->blues[bcnt][1] = ascent; + ++bcnt; + } + } + bd->bluecnt = bcnt; +} + +void ElFreeEI(EIList *el) { + EI *e, *next; + + for ( e = el->edges; e!=NULL; e = next ) { + next = e->next; + free(e); + } +} + +static int EIAddEdge(Spline *spline, real tmin, real tmax, EIList *el) { + EI *new = gcalloc(1,sizeof(EI)); + real min, max, temp; + Spline1D *s; + real dxdtmin, dxdtmax, dydtmin, dydtmax; + + new->spline = spline; + new->tmin = tmin; + new->tmax = tmax; + + s = &spline->splines[1]; + if (( dydtmin = (3*s->a*tmin + 2*s->b)*tmin + s->c )<0 ) dydtmin = -dydtmin; + if (( dydtmax = (3*s->a*tmax + 2*s->b)*tmax + s->c )<0 ) dydtmax = -dydtmax; + s = &spline->splines[0]; + if (( dxdtmin = (3*s->a*tmin + 2*s->b)*tmin + s->c )<0 ) dxdtmin = -dxdtmin; + if (( dxdtmax = (3*s->a*tmax + 2*s->b)*tmax + s->c )<0 ) dxdtmax = -dxdtmax; + + /*s = &spline->splines[0];*/ + min = ((s->a * tmin + s->b)* tmin + s->c)* tmin + s->d; + max = ((s->a * tmax + s->b)* tmax + s->c)* tmax + s->d; + if ( tmax==1 ) max = spline->to->me.x; /* beware rounding errors */ + if ( !el->leavetiny && floor(min)==floor(max) ) { /* If it doesn't cross a pixel boundary then it might as well be vertical */ + if ( tmin==0 ) max = min; + else if ( tmax==1 ) min = max; + else max = min; + } + if ( min==max ) + new->vert = true; + else if ( minhup = true; + else { + temp = min; min = max; max=temp; + } + if ( !el->leavetiny && min+1>max ) new->almostvert = true; + if ( 40*dxdtminvertattmin = true; + if ( 40*dxdtmaxvertattmax = true; + /*if ( new->vertattmin && new->vertattmax && s->a==0 && s->b==0 ) new->almostvert = true;*/ + new->coordmin[0] = min; new->coordmax[0] = max; + if ( el->coordmin[0]>min ) + el->coordmin[0] = min; + if ( el->coordmax[0]coordmax[0] = max; + + s = &spline->splines[1]; + min = ((s->a * tmin + s->b)* tmin + s->c)* tmin + s->d; + max = ((s->a * tmax + s->b)* tmax + s->c)* tmax + s->d; + if ( tmax==1 ) max = spline->to->me.y; + if ( !el->leavetiny && floor(min)==floor(max) ) { /* If it doesn't cross a pixel boundary then it might as well be horizontal */ + if ( tmin==0 ) max = min; + else if ( tmax==1 ) min = max; + else max = min; + } + if ( min==max ) + new->hor = true; + else if ( minvup = true; + else { + temp = min; min = max; max=temp; + } + if ( !el->leavetiny && min+1>max ) new->almosthor = true; + if ( 40*dydtminhorattmin = true; + if ( 40*dydtmaxhorattmax = true; + /*if ( new->horattmin && new->horattmax && s->a==0 && s->b==0 ) new->almosthor = true;*/ + new->coordmin[1] = min; new->coordmax[1] = max; + if ( el->coordmin[1]>min ) + el->coordmin[1] = min; + if ( el->coordmax[1]coordmax[1] = max; + + if ( new->hor && new->vert ) { + /* This spline is too small for us to notice */ + free(new); +return( false ); + } else { + new->next = el->edges; + el->edges = new; + + if ( el->splinelast!=NULL ) + el->splinelast->splinenext = new; + el->splinelast = new; + if ( el->splinefirst==NULL ) + el->splinefirst = new; + +return( true ); + } +} + +static void EIAddSpline(Spline *spline, EIList *el) { + double ts[6], temp; + int i, j, base, last; + + ts[0] = 0; ts[5] = 1.0; + SplineFindExtrema(&spline->splines[0],&ts[1],&ts[2]); + SplineFindExtrema(&spline->splines[1],&ts[3],&ts[4]); + /* avoid teeny tiny segments, they just confuse us */ + SplineRemoveInflectionsTooClose(&spline->splines[0],&ts[1],&ts[2]); + SplineRemoveInflectionsTooClose(&spline->splines[1],&ts[3],&ts[4]); + for ( i=0; i<4; ++i ) for ( j=i+1; j<5; ++j ) { + if ( ts[i]>ts[j] ) { + temp = ts[i]; + ts[i] = ts[j]; + ts[j] = temp; + } + } + for ( base=0; ts[base]==-1; ++base); + for ( i=5; i>base ; --i ) { + if ( ts[i]==ts[i-1] ) { + for ( j=i-1; j>base; --j ) + ts[j] = ts[j-1]; + ts[j] = -1; + ++base; + } + } + last = base; + for ( i=base; i<5 ; ++i ) + if ( EIAddEdge(spline,ts[last],ts[i+1],el) ) + last = i+1; +} + +void ELFindEdges(SplineChar *sc, EIList *el) { + Spline *spline, *first; + SplineSet *spl; + + el->sc = sc; + if ( sc->layers[ly_fore].splines==NULL ) +return; + + el->coordmin[0] = el->coordmax[0] = sc->layers[ly_fore].splines->first->me.x; + el->coordmin[1] = el->coordmax[1] = sc->layers[ly_fore].splines->first->me.y; + + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl = spl->next ) if ( spl->first->prev!=NULL && spl->first->prev->from!=spl->first ) { + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + EIAddSpline(spline,el); + if ( first==NULL ) first = spline; + } + if ( el->splinefirst!=NULL && spl->first->prev!=NULL ) + el->splinelast->splinenext = el->splinefirst; + el->splinelast = NULL; el->splinefirst = NULL; + } +} + +static int IsBiggerSlope(EI *test, EI *base, int major) { + int other = !major; + real tdo, tdm, bdo, bdm, t; + + if (( major && test->vup ) || (!major && test->hup)) + t = test->tmin; + else + t = test->tmax; + tdm = (3*test->spline->splines[major].a*t + 2*test->spline->splines[major].b)*t + test->spline->splines[major].c; + tdo = (3*test->spline->splines[other].a*t + 2*test->spline->splines[other].b)*t + test->spline->splines[other].c; + + if (( major && base->vup ) || (!major && base->hup)) + t = base->tmin; + else + t = base->tmax; + bdm = (3*base->spline->splines[major].a*t + 2*base->spline->splines[major].b)*t + base->spline->splines[major].c; + bdo = (3*base->spline->splines[other].a*t + 2*base->spline->splines[other].b)*t + base->spline->splines[other].c; + + if ( tdm==0 && bdm==0 ) +return( tdo > bdo ); + if ( tdo==0 ) +return( tdo>0 ); + else if ( bdo==0 ) +return( bdo>0 ); + +return( tdo/tdm > bdo/bdm ); +} + +void ELOrder(EIList *el, int major ) { + int other = !major; + int pos; + EI *ei, *prev, *test; + BasePoint *me; + + el->low = floor(el->coordmin[major]); el->high = ceil(el->coordmax[major]); + el->cnt = el->high-el->low+1; + el->ordered = gcalloc(el->cnt,sizeof(EI *)); + el->ends = gcalloc(el->cnt,1); + + for ( ei = el->edges; ei!=NULL ; ei=ei->next ) { + me = &ei->spline->from->me; + pos = ceil(ei->coordmax[major])-el->low; + el->ends[pos] = true; + pos = floor(ei->coordmin[major])-el->low; + ei->ocur = (ei->hup == ei->vup)?ei->coordmin[other]:ei->coordmax[other]; + ei->tcur = ((major && ei->vup) || (!major && ei->hup)) ? + ei->tmin: ei->tmax; + if ( major ) { + ei->up = ei->vup; + ei->hv = (ei->vert || ei->almostvert); + ei->hvbottom = ei->vup ? ei->vertattmin : ei->vertattmax; + ei->hvtop =!ei->vup ? ei->vertattmin : ei->vertattmax; + if ( ei->hor || ei->almosthor) + continue; + } else { + ei->up = ei->hup; + ei->hv = (ei->hor || ei->almosthor); + ei->hvbottom = ei->hup ? ei->horattmin : ei->horattmax; + ei->hvtop =!ei->hup ? ei->horattmin : ei->horattmax; + if ( ei->vert || ei->almostvert) + continue; + } + if ( el->ordered[pos]==NULL || ei->ocurordered[pos]->ocur ) { + ei->ordered = el->ordered[pos]; + el->ordered[pos] = ei; + } else { + for ( prev=el->ordered[pos], test = prev->ordered; test!=NULL; + prev = test, test = test->ordered ) { + if ( test->ocur>ei->ocur || + (test->ocur==ei->ocur && IsBiggerSlope(test,ei,major))) + break; + } + ei->ordered = test; + prev->ordered = ei; + } + } +} + +/* If the stem is vertical here, return an approximate height over which it is */ +/* if major is 1 then we check for vertical lines, if 0 then horizontal */ +static real IsEdgeHorVertHere(EI *e,int major, int i, real *up, real *down) { + /* It's vertical if dx/dt == 0 or if (dy/dt)/(dx/dt) is infinite */ + Spline *spline = e->spline; + Spline1D *msp = &spline->splines[major], *osp = &spline->splines[!major]; + real dodt = (3*osp->a*e->tcur+2*osp->b)*e->tcur + osp->c; + real dmdt = (3*msp->a*e->tcur+2*msp->b)*e->tcur + msp->c; + real tmax, tmin, t, o, ocur; + real dup, ddown; + + if ( dodt<0 ) dodt = -dodt; + if ( dmdt<0 ) dmdt = -dmdt; + if ( dodt>.02 && dmdt/dodt<40 ) /* very rough defn of 0 and infinite */ +return( 0.0 ); + + if ( osp->a==0 && osp->b==0 && osp->c==0 ) { + *up = e->coordmax[major]-i; + if ( *up<0 && *up>-1 ) + *up = 0; + *down = e->coordmin[major]-i; + if ( *down>0 && *down<1 ) + *down = 0; +return( e->coordmax[major]-e->coordmin[major] ); + } + + dup = ddown = 0; + tmax = (e->tmax+1)/2; + tmin = e->tcur; + ocur = ((osp->a*tmin+osp->b)*tmin+osp->c)*tmin + osp->d; + while ( tmax-tmin>.0005 ) { + t = (tmin+tmax)/2; + o = ((osp->a*t+osp->b)*t+osp->c)*t + osp->d; + if ( o-ocur<1 && o-ocur>-1 ) { + dup = ((msp->a*t+msp->b)*t+msp->c)*t+msp->d-i; + if ( tmax-tmin<.001 ) + break; + tmin = t; + } else + tmax = t; + } + tmin = (e->tmin+0)/2; + tmax = e->tcur; + while ( tmax-tmin>.0005 ) { + t = (tmin+tmax)/2; + o = ((osp->a*t+osp->b)*t+osp->c)*t + osp->d; + if ( o-ocur<1 && o-ocur>-1 ) { + ddown = ((msp->a*t+msp->b)*t+msp->c)*t+msp->d-i; + if ( tmax-tmin<.001 ) + break; + tmax = t; + } else + tmin = t; + } + if ( dup<0 && ddown<0 ) { + if ( ddown>-1 && ddown>dup ) ddown = 0; + if ( dup>-1 && dup>ddown ) dup =0; + } else if ( dup>0 && ddown>0 ) { + if ( ddown<1 && ddown0 && ddown>0 )) + fprintf( stderr, "Bad values in IsEdgeHorVertHere dup=%g, ddown=%g\n", dup, ddown ); +#endif + if ( dup<0 || ddown>0 ) { /* one might be 0, so test both */ + *down = dup; + *up = ddown; + } else { + *down = ddown; + *up = dup; + } +#if 0 + if ( *up<0 || *down>0 ) + fprintf( stderr, "Bad values in IsEdgeHorVertHere dup=%g, ddown=%g\n", dup, ddown ); +#endif +return( dup+ddown ); +} + +static int IsNearHV(EI *hv,EI *test,int i,real *up, real *down, int major) { + real u1, u2, d1, d2; + if ( IsEdgeHorVertHere(test,major,i,&u2,&d2)==0 ) +return( false ); + if ( IsEdgeHorVertHere(hv,major,i,&u1,&d1)==0 ) +return( false ); + if ( u1d2 ) d2=d1; + if ( u2==0 && d2==0 ) +return( false ); /* A set of parallel segments one starts where the other ends. No real stem */ + *up = u2; + *down = d2; +return( true ); +} + +static real EIFigurePos(EI *e,int other, int *hadpt ) { + real val = e->ocur; + int oup = other==0?e->hup:e->vup; + int major = !other; + Spline1D *sp = &e->spline->splines[major]; + real mcur = ((sp->a*e->tcur+sp->b)*e->tcur+sp->c)*e->tcur+sp->d; + + *hadpt = false; + if ( e->spline->from->nonextcp && e->spline->to->noprevcp && + e->spline->splines[other].c!=0 ) { + /* Pretend that a slightly sloped line is horizontal/vertical */ + /* and the location is that of the lower end point */ + /* (I had to pick somewhere, that seems as good as any) */ + /* I supose I should check to make sure the lower end point is on */ + /* the stem in question (don't know which it is yet though), and if */ + /* not pick the upper end point... But that's too hard */ + val = e->coordmin[other]; + if ( (e->up && e->coordmin[major]+2>mcur) || + (!e->up && e->coordmax[major]-2tmin==0 && + ((e->up && e->coordmin[major]+2>mcur) || + (!e->up && e->coordmax[major]-2coordmin[other]+1>val) || + (!oup && e->coordmax[other]-1coordmin[other] : e->coordmax[other]; + } else if ( e->tmax==1 && + ((!e->up && e->coordmin[major]+2>mcur) || + (e->up && e->coordmax[major]-2coordmin[other]+1>val) || + (oup && e->coordmax[other]-1coordmin[other] : e->coordmax[other]; + } +return( val ); +} + +static HintInstance *HIMerge(HintInstance *into, HintInstance *hi) { + HintInstance *n, *first = NULL, *last; + + while ( into!=NULL && hi!=NULL ) { + if ( into->beginbegin ) { + n = into; + into = into->next; + } else { + n = hi; + hi = hi->next; + } + if ( first==NULL ) + first = n; + else + last->next = n; + last = n; + } + if ( into!=NULL ) { + if ( first==NULL ) + first = into; + else + last->next = into; + } else if ( hi!=NULL ) { + if ( first==NULL ) + first = hi; + else + last->next = hi; + } +return( first ); +} + +StemInfo *HintCleanup(StemInfo *stem,int dosort,int instance_count) { + StemInfo *s, *p=NULL, *t, *pt, *sn; + int swap; + + for ( s=stem; s!=NULL; p=s, s=s->next ) { + if ( s->backwards ) { + s->start += s->width; + s->width = -s->width; + s->backwards = false; + } + s->reordered = false; + if ( p!=NULL && p->start> s->start ) + dosort = true; + } + if ( dosort ) { + for ( p=NULL, s=stem; s!=NULL; p=s, s = sn ) { + sn = s->next; + for ( pt=s, t=sn; t!=NULL; pt=t, t=t->next ) { + if ( instance_count>1 && + t->u.unblended!=NULL && s->u.unblended!=NULL ) { + int temp = UnblendedCompare((*t->u.unblended)[0],(*s->u.unblended)[0],instance_count); + if ( temp==0 ) + swap = UnblendedCompare((*t->u.unblended)[1],(*s->u.unblended)[1],instance_count); + else + swap = temp<0; + } else if ( t->startstart ) + swap=true; + else if ( t->start>s->start ) + swap = false; + else + swap = (t->widthwidth); + if ( swap ) { + s->next = t->next; + if ( pt==s ) { + t->next = s; + sn = s; + } else { + t->next = sn; + pt->next = s; + } + if ( p==NULL ) + stem = t; + else + p->next = t; + pt = s; /* swap s and t */ + s = t; + t = pt; + } + } + } + for ( s=stem; s!=NULL; p=s, s=s->next ) { + if ( s->width<0 ) { + s->start += s->width; + s->width = -s->width; + s->backwards = true; + } + } + /* Remove duplicates */ + if ( stem!=NULL ) for ( p=stem, s=stem->next; s!=NULL; s = sn ) { + sn = s->next; + if ( p->start==s->start && p->width==s->width && p->hintnumber==s->hintnumber ) { + p->where = HIMerge(p->where,s->where); + s->where = NULL; + p->next = sn; + StemInfoFree(s); + } else + p = s; + } + } +return( stem ); +} + +static StemInfo *StemInsert(StemInfo *stems,StemInfo *new) { + StemInfo *prev, *test; + + if ( stems==NULL || new->startstart || + (new->start==stems->start && new->widthwidth)) { + new->next = stems; +return( new ); + } + prev = stems; + for ( test=stems->next; test!=NULL; prev=test, test=test->next ) + if ( new->startstart || (new->start==test->start && new->widthwidth)) + break; + prev->next = new; + new->next = test; +return(stems); +} + +static StemInfo *_StemsFind(StemInfo *stems,real start, real end, + int shadpt, int ehadpt, int lin) { + StemInfo *test; + + /* I'm giving up on non integral hints. In post cases it means the user */ + /* didn't design his/her font properly */ + if ( start!=floor(start) || end!=floor(end)) +return( NULL ); + + for ( test=stems; test!=NULL; test=test->next ) { + if ( start-3start && start+3>test->start && + end-3start+test->width && end+3>test->start+test->width ) { + if ( start!=test->start && shadpt && !test->haspointleft ) { + test->width = test->start+test->width - start; + test->start = start; + test->haspointleft = true; + test->reordered = true; + } else if ( shadpt ) + test->haspointleft = true; + if ( end!=test->start+test->width && ehadpt && !test->haspointright ) { + test->width = end-test->start; + test->haspointright = true; + } else if ( ehadpt ) + test->haspointright = true; +return( test ); + } + } + + test = chunkalloc(sizeof(StemInfo)); + test->start = start; + test->width = end-start; + test->haspointleft = shadpt; + test->haspointright = ehadpt; + test->linearedges = lin; +return( test ); +} + +static StemInfo *StemsFind(StemInfo *stems,EI *apt,EI *e, int major) { + int other = !major; + int shadpt, ehadpt; + real start = EIFigurePos(apt,other,&shadpt); + real end = EIFigurePos(e,other,&ehadpt); + int lin = apt->spline->knownlinear && e->spline->knownlinear; + +return( _StemsFind(stems,start,end,shadpt,ehadpt,lin)); +} + +static void _StemAddBrief(StemInfo *new, real mstart, real mend ) { + HintInstance *hi, *thi; + + if ( mend<=mstart ) { + real temp; +#if 0 + fprintf( stderr, "Bad values in StemAddBrief, mstart=%g mend=%g\n", mstart, mend); +#endif + /* Have to add some HI, else we might crash later */ + temp = mstart; + mstart = mend; + mend = temp; + } + thi=new->where; + if ( thi!=NULL && !(mendbegin || mstart>thi->end) ) { + if ( mstartbegin ) thi->begin = mstart; + if ( mend>thi->end ) thi->end = mend; +return; + } + hi = chunkalloc(sizeof(HintInstance)); + hi->begin = mstart; + hi->end = mend; + hi->next = new->where; + hi->closed = true; + new->where = hi; +return; +} + +struct pendinglist { + struct pendinglist *next; + EI *apt, *e; + int checka; + real otherpos, mpos; +}; + +static StemInfo *StemAddBrief(StemInfo *stems,EI *apt,EI *e, + real mstart, real mend, int major) { + StemInfo *new; + + new = StemsFind(stems,apt,e,major); + if ( new==NULL ) { +return( stems ); + } else if ( new->where==NULL ) { + stems = StemInsert(stems,new); + } else if ( new->reordered ) + stems = HintCleanup(stems,false,1); + _StemAddBrief(new,mstart,mend); +return( stems ); +} + +static StemInfo *StemAddUpdate(StemInfo *stems,EI *apt,EI *e, int i, int major, + struct pendinglist *pendings) { + StemInfo *new; + HintInstance *hi; + real up, down; + struct pendinglist *p; + int begun = i, ap=i, ep=i; + double atcur = apt->tcur, aocur = apt->ocur, etcur = e->tcur, eocur = e->ocur; + Spline1D *sp; + + /* This nasty bit of code is to get the hints at the top and bottom of "a" in n021004l.pfb */ + if (( major && (apt->vertattmin || apt->vertattmax)) || + ( !major && (apt->horattmin || apt->horattmax))) { + if ( major ) + apt->tcur = apt->vertattmin ? apt->tmin : apt->tmax; + else + apt->tcur = apt->horattmin ? apt->tmin : apt->tmax; + sp = &apt->spline->splines[!major]; + apt->ocur = ((sp->a*apt->tcur+sp->b)*apt->tcur+sp->c)*apt->tcur+sp->d; + sp = &apt->spline->splines[major]; + ap = ((sp->a*apt->tcur+sp->b)*apt->tcur+sp->c)*apt->tcur+sp->d; + } + if (( major && (e->vertattmin || e->vertattmax)) || + ( !major && (e->horattmin || e->horattmax))) { + if ( major ) + e->tcur = e->vertattmin ? e->tmin : e->tmax; + else + e->tcur = e->horattmin ? e->tmin : e->tmax; + sp = &e->spline->splines[!major]; + e->ocur = ((sp->a*e->tcur+sp->b)*e->tcur+sp->c)*e->tcur+sp->d; + sp = &e->spline->splines[major]; + ep = ((sp->a*e->tcur+sp->b)*e->tcur+sp->c)*e->tcur+sp->d; + } + new = StemsFind(stems,apt,e,major); + apt->tcur = atcur; apt->ocur = aocur; e->tcur=etcur; e->ocur = eocur; + + if ( new==NULL ) +return( stems ); + + if ( new->where==NULL ) { + if ( !new->haspointleft || !new->haspointright ) { + for ( p=pendings; p!=NULL; p=p->next ) + if ( p->apt==apt && p->e==e ) { + if ( !new->haspointleft && p->checka && p->otherposocur ) { + new->width += new->start-p->otherpos; + new->start = p->otherpos; + new->haspointleft = true; + begun = p->mpos; + } else if ( !new->haspointright && !p->checka && p->otherpos>apt->ocur ) { + new->width = p->otherpos-new->start; + new->haspointright = true; + begun = p->mpos; + } + } + /*new->haspoints = new->haspointleft && new->haspointright;*/ + } + stems = StemInsert(stems,new); + } else { + if ( new->reordered ) + stems = HintCleanup(stems,false,1); + if ( new->where->end>=i ) { + new->where->closed = false; +return(stems); + } + } + if ( new->where==NULL || (new->where->closed && new->where->endep ) ep = i+1; /* so add/subtract 1 to make up for that */ + } + if ( (!apt->spline->from->nonextcp || !apt->spline->to->noprevcp || + !e->spline->from->nonextcp || !e->spline->to->noprevcp ) && + IsNearHV(apt,e,i,&up,&down,major)) { + if ( down<0 && i+down>ap ) down = ap-i; + else if ( up<0 && i+up>ep ) up = ep-i; + _StemAddBrief(new,i+down,i+up); +return( stems ); + } + hi = chunkalloc(sizeof(HintInstance)); + hi->begin = ap; + hi->end = ep; + hi->next = new->where; + new->where = hi; + } else { + if ( new->where->end <= i ) + new->where->end = i+1; /* see comment above */ + new->where->closed = false; + } +return( stems ); +} + +static StemInfo *StemsOffsetHack(StemInfo *stems,EI *apt,EI *e, int major) { + double at, et, start, end; + StemInfo *new; + + /* This nasty bit of code is to get the hints at the top and bottom of "a" in n021004l.pfb */ + if ( major && + ((apt->vertattmin && apt->tmin==0) || (apt->vertattmax && apt->tmax==1.0)) && + ((e->vertattmin && e->tmin==0) || (e->vertattmax && e->tmax==1.0))) { + at = et = 0; + if ( apt->vertattmin && apt->vertattmax && apt->tmin==0 && apt->tmax==1.0 ) { + if ( apt->tcur>.5 ) + at = 1; + } else if ( apt->vertattmax && apt->tmax==1.0 ) + at = 1; + if ( e->vertattmin && e->vertattmax && e->tmin==0 && e->tmax==1.0 ) { + if ( e->tcur>.5 ) + et = 1; + } else if ( e->vertattmax && e->tmax==1.0 ) + et = 1; + start = (at==1)?apt->spline->to->me.x: apt->spline->from->me.x; + end = (et==1)?e->spline->to->me.x: e->spline->from->me.x; + if ( start>end ) { double temp = start; start = end; end = temp; } + new = _StemsFind(stems,start,end,true,true,false); + if ( new==NULL || new->where!=NULL ) +return( stems ); + stems = StemInsert(stems,new); + start = (at==1)?apt->spline->to->me.y: apt->spline->from->me.y; + end = (et==1)?e->spline->to->me.y: e->spline->from->me.y; + } else if ( !major && + ((apt->horattmin && apt->tmin==0) || (apt->horattmax && apt->tmax==1.0)) && + ((e->horattmin && e->tmin==0) || (e->horattmax && e->tmax==1.0))) { + at = et = 0; + if ( apt->horattmin && apt->horattmax && apt->tmin==0 && apt->tmax==1.0 ) { + if ( apt->tcur>.5 ) + at = 1; + } else if ( apt->horattmax && apt->tmax==1.0 ) + at = 1; + if ( e->horattmin && e->horattmax && e->tmin==0 && e->tmax==1.0 ) { + if ( e->tcur>.5 ) + et = 1; + } else if ( e->horattmax && e->tmax==1.0 ) + et = 1; + start = (at==1)?apt->spline->to->me.y: apt->spline->from->me.y; + end = (et==1)?e->spline->to->me.y: e->spline->from->me.y; + if ( start>end ) { double temp = start; start = end; end = temp; } + new = _StemsFind(stems,start,end,true,true,false); + if ( new==NULL || new->where!=NULL ) +return( stems ); + stems = StemInsert(stems,new); + start = (at==1)?apt->spline->to->me.x: apt->spline->from->me.x; + end = (et==1)?e->spline->to->me.x: e->spline->from->me.x; + } else +return( stems ); + + if ( start>end ) { double temp = start; start = end; end = temp; } + _StemAddBrief(new,start,end); +return( stems ); +} + +static void PendingListFree( struct pendinglist *pl ) { + struct pendinglist *n; + + while ( pl!=NULL ) { + n = pl->next; + free(pl); + pl = n; + } +} + +static struct pendinglist *StemPending(struct pendinglist *pendings, + EI *apt,EI *e, int checka, int major, StemInfo **stems) { + EI *checkme = checka ? apt : e; + int other = !major; + Spline1D *sp = &checkme->spline->splines[major]; + Spline1D *osp = &checkme->spline->splines[other]; + real mcur = ((sp->a*checkme->tcur+sp->b)*checkme->tcur+sp->c)*checkme->tcur+sp->d; + real ocur = checkme->ocur; + int oup = other==0?checkme->hup:checkme->vup; + int atmin; + struct pendinglist *t, *p; + real wide, mdiff; + StemInfo *new; + + if ( checkme->tmin==0 && + ((checkme->up && checkme->coordmin[major]+2>mcur) || + (!checkme->up && checkme->coordmax[major]-2coordmin[other]+1>ocur) || + (!oup && checkme->coordmax[other]-1tmax==1 && + ((!checkme->up && checkme->coordmin[major]+2>mcur) || + (checkme->up && checkme->coordmax[major]-2coordmin[other]+1>ocur) || + (oup && checkme->coordmax[other]-1d; + mcur = sp->d; + } else { + ocur = osp->a+osp->b+osp->c+osp->d; + mcur = sp->a+sp->b+sp->c+sp->d; + } + + for ( p=NULL, t=pendings; t!=NULL && (t->apt!=apt || t->e!=e); p=t, t=t->next ); + if ( t==NULL ) { + /* This stem isn't on the list, add it */ + t = gcalloc(1,sizeof(struct pendinglist)); + t->next = pendings; + /*pendings = t;*/ + t->apt = apt; t->e = e; t->checka = checka; + t->otherpos = ocur; t->mpos = mcur; +return( t ); + } else if ( t->checka==checka ) +return( pendings ); + else { + /* We've got the other endpoint for the stem */ + /* Make sure the stem is wider than the difference between the points */ + /* in the other dimension */ + if ( (wide = ocur-t->otherpos)<0 ) wide = -wide; + if ( (mdiff = mcur-t->mpos)<0 ) mdiff = -mdiff; + if ( wideotherpos?ocur:t->otherpos, + ocurotherpos?t->otherpos:ocur, + true,true,false); /* pending hints only happen at endpoints */ + if ( new==NULL ) +return( pendings ); + + if ( new->where==NULL ) { + new->pendingpt = true; + *stems = StemInsert(*stems,new); + } + _StemAddBrief(new,mcurmpos ? mcur : t->mpos, + mcurmpos ? t->mpos : mcur); + if ( p==NULL ) + pendings = t->next; + else + p->next = t->next; + free(t); +return( pendings ); + } +} + +static void StemCloseUntouched(StemInfo *stems,int i ) { + StemInfo *test; + + for ( test=stems; test!=NULL; test=test->next ) + if ( test->where->endwhere->closed = true; +} + + +real EITOfNextMajor(EI *e, EIList *el, real sought_m ) { + /* We want to find t so that Mspline(t) = sought_m */ + /* the curve is monotonic */ + Spline1D *msp = &e->spline->splines[el->major]; + real new_t; + real found_m; + real t_mmax, t_mmin; + real mmax, mmin; + + if ( msp->a==0 && msp->b==0 ) { + if ( msp->c == 0 ) { + GDrawIError("Hor/Vert line when not expected"); +return( 0 ); + } + new_t = (sought_m-msp->d)/(msp->c); +return( new_t ); + } + + mmax = e->coordmax[el->major]; + t_mmax = e->up?e->tmax:e->tmin; + mmin = e->coordmin[el->major]; + t_mmin = e->up?e->tmin:e->tmax; + /* sought_m += el->low; */ + + while ( 1 ) { + new_t = (t_mmin+t_mmax)/2; + found_m = ( ((msp->a*new_t+msp->b)*new_t+msp->c)*new_t + msp->d ); + if ( found_m>sought_m-.001 && found_m sought_m ) { + mmax = found_m; + t_mmax = new_t; + } else { + mmin = found_m; + t_mmin = new_t; + } + if ( t_mmax==t_mmin ) { + GDrawIError("EITOfNextMajor failed! on %s", el->sc!=NULL?el->sc->name:"Unknown" ); +return( new_t ); + } + } +} + +EI *EIActiveListReorder(EI *active,int *change) { + int any; + EI *pr, *apt; + + *change = false; + if ( active!=NULL ) { + any = true; + while ( any ) { + any = false; + for ( pr=NULL, apt=active; apt->aenext!=NULL; ) { + if ( apt->ocur <= apt->aenext->ocur ) { + /* still ordered */; + pr = apt; + apt = apt->aenext; + } else if ( pr==NULL ) { + active = apt->aenext; + apt->aenext = apt->aenext->aenext; + active->aenext = apt; + *change = true; + /* don't need to set any, since this reorder can't disorder the list */ + pr = active; + } else { + pr->aenext = apt->aenext; + apt->aenext = apt->aenext->aenext; + pr->aenext->aenext = apt; + any = *change = true; + pr = pr->aenext; + } + } + } + } +return( active ); +} + +EI *EIActiveEdgesRefigure(EIList *el, EI *active,real i,int major, int *_change) { + EI *apt, *pr, *npt; + int change = false, subchange; + int other = !major; + + /* first remove any entry which doesn't intersect the new scan line */ + /* (ie. stopped on last line) */ + for ( pr=NULL, apt=active; apt!=NULL; apt = apt->aenext ) { + if ( apt->coordmax[major]low ) { + if ( pr==NULL ) + active = apt->aenext; + else + pr->aenext = apt->aenext; + change = true; + } else + pr = apt; + } + /* then move the active list to the next line */ + for ( apt=active; apt!=NULL; apt = apt->aenext ) { + Spline1D *osp = &apt->spline->splines[other]; + apt->tcur = EITOfNextMajor(apt,el,i+el->low); + apt->ocur = ( ((osp->a*apt->tcur+osp->b)*apt->tcur+osp->c)*apt->tcur + osp->d ); + } + /* reorder list */ + active = EIActiveListReorder(active,&subchange); + if ( subchange ) change = true; + + /* Insert new nodes */ + if ( el->ordered[(int) i]!=NULL ) change = true; + for ( pr=NULL, apt=active, npt=el->ordered[(int) i]; apt!=NULL && npt!=NULL; ) { + if ( npt->ocurocur ) { + npt->aenext = apt; + if ( pr==NULL ) + active = npt; + else + pr->aenext = npt; + pr = npt; + npt = npt->ordered; + } else { + pr = apt; + apt = apt->aenext; + } + } + while ( npt!=NULL ) { + npt->aenext = NULL; + if ( pr==NULL ) + active = npt; + else + pr->aenext = npt; + pr = npt; + npt = npt->ordered; + } + *_change = change; +return( active ); +} + +/* Should I consider e and n to be a continuation of the same spline? */ +/* If we are at an intersection (and it's the same intersection on both) */ +/* and they go in vaguely the same direction then we should */ +/* Ah, but also if they are at different intersections and are connected */ +/* by a series of horizontal/vertical lines (whichever are invisible to major)*/ +/* then we still should. */ +int EISameLine(EI *e, EI *n, real i, int major) { + EI *t; + + if ( n!=NULL && /*n->up==e->up &&*/ + (ceil(e->coordmin[major])==i || floor(e->coordmin[major])==i || floor(e->coordmax[major])==i || ceil(e->coordmax[major])==i) && + (ceil(n->coordmin[major])==i || floor(n->coordmin[major])==i || floor(n->coordmax[major])==i || ceil(n->coordmax[major])==i) ) { + if ( + (n==e->splinenext && n->tmin==e->tmax && + n->tcurtmin+.2 && e->tcur>e->tmax-.2 ) || + (n->splinenext==e && n->tmax==e->tmin && + n->tcur>n->tmax-.2 && e->tcurtmin+.2 ) ) +return( true ); + /* can be seperated by a horizontal/vertical line in the other direction */ + if ( n->tmax==1 && e->tmin==0 && n->tcur>.8 && e->tcur<.2) { + t = n; + while ( (t = t->splinenext)!=e ) { + if ( t==NULL || t==n || + (major && !t->hor) || ( !major && !t->vert )) +return( false ); + } +return( n->up==e->up ); + } else if ( n->tmin==0 && e->tmax==1 && n->tcur<.2 && e->tcur>.8) { + t = e; + while ( (t = t->splinenext)!=n ) { + if ( t==NULL || t==e || + (major && !t->hor) || ( !major && !t->vert )) +return( false ); + } +return( n->up==e->up ); + } + } +return( false ); +} + +#if 1 +int EISkipExtremum(EI *e, real i, int major) { + EI *n = e->aenext, *t; + + if ( n==NULL ) +return( false ); + if ( + (ceil(e->coordmin[major])==i || floor(e->coordmin[major])==i || floor(e->coordmax[major])==i || ceil(e->coordmax[major])==i) && + (ceil(n->coordmin[major])==i || floor(n->coordmin[major])==i || floor(n->coordmax[major])==i || ceil(n->coordmax[major])==i) ) { + if ( + (n==e->splinenext && n->tmin==e->tmax && + n->tcurtmin+.2 && e->tcur>e->tmax-.2 ) || + (n->splinenext==e && n->tmax==e->tmin && + n->tcur>n->tmax-.2 && e->tcurtmin+.2 ) ) +return( n->up!=e->up ); + /* can be seperated by a horizontal/vertical line in the other direction */ + if ( n->tmax==1 && e->tmin==0 && n->tcur>.8 && e->tcur<.2) { + t = n; + while ( (t = t->splinenext)!=e ) { + if ( t==NULL || t==n || + (major && !t->hor) || ( !major && !t->vert )) +return( false ); + } +return( n->up!=e->up ); + } else if ( n->tmin==0 && e->tmax==1 && n->tcur<.2 && e->tcur>.8) { + t = e; + while ( (t = t->splinenext)!=n ) { + if ( t==NULL || t==e || + (major && !t->hor) || ( !major && !t->vert )) +return( false ); + } +return( n->up!=e->up ); + } + } +return( false ); +} +#else +int EISkipExtremum(EI *e, real pos, int major) { + Spline1D *s; + real slopem, slopeo; + + s = &e->spline->splines[major]; + slopem = (3*s->a*e->tcur+2*s->b)*e->tcur+s->c; + s = &e->spline->splines[!major]; + slopeo = (3*s->a*e->tcur+2*s->b)*e->tcur+s->c; + if ( !RealNear(slopeo,0)) { + slopem/=slopeo; + if ( slopem>-.15 && slopem<.15 ) +return( true ); + } +return( false ); +} +#endif + +EI *EIActiveEdgesFindStem(EI *apt, real i, int major) { + int cnt=apt->up?1:-1; + EI *pr, *e, *p; + + /* If we're at an intersection point and the next spline continues */ + /* in about the same direction then this doesn't count as two lines */ + /* but as one */ + if ( EISameLine(apt,apt->aenext,i,major)) + apt = apt->aenext; + + pr=apt; e=apt->aenext; + if ( e==NULL ) +return( NULL ); + + for ( ; e!=NULL && cnt!=0; pr=e, e=e->aenext ) { + p = e; + if ( EISkipExtremum(e,i,major)) { + e = e->aenext; + if ( e==NULL ) + break; + continue; + } + if ( EISameLine(e,e->aenext,i,major)) + e = e->aenext; + cnt += (e->up?1:-1); + } +return( p ); +} + +static HintInstance *HIReverse(HintInstance *cur) { + HintInstance *p, *n; + + p = NULL; + for ( ; (n=cur->next)!=NULL; cur = n ) { + cur->next = p; + p = cur; + } + cur->next = p; +return( cur ); +} + +static void CheckDiagEnd(SplinePoint *nl,SplinePoint *l,SplinePoint *r, + SplinePoint *nr,int top,MinimumDistance **mds) { + MinimumDistance *md; + + if ( nl->me.y==nr->me.y && nl->me.xme.x && nr->me.x>r->me.x && + ((top && nl->me.y>l->me.y && nl->me.y>r->me.y ) || + (!top&& nl->me.yme.y && nl->me.yme.y )) ) { + md = chunkalloc(sizeof(MinimumDistance)); + md->sp1 = nl; + md->sp2 = nr; + md->x = true; + md->next = *mds; + *mds = md; + } +} + +static void AddDiagMD(DStemInfo *new,EI *apt,EI *e,MinimumDistance **mds) { + SplinePoint *lt, *lb, *rt, *rb; + SplinePoint *nlt, *nlb, *nrt, *nrb; + + nlt = nlb = nrt = nrb = NULL; + if ( apt->spline->to->me.y > apt->spline->from->me.y ) { + lt = apt->spline->to; + if ( lt->next!=NULL ) nlt = lt->next->to; + lb = apt->spline->from; + if ( lb->prev!=NULL ) nlb = lb->prev->from; + } else { + lt = apt->spline->from; + if ( lt->prev!=NULL ) nlt = lt->prev->from; + lb = apt->spline->to; + if ( lb->next!=NULL ) nlb = lb->next->to; + } + if ( e->spline->to->me.y > e->spline->from->me.y ) { + rt = e->spline->to; + if ( rt->next!=NULL ) nrt = rt->next->to; + rb = e->spline->from; + if ( rb->prev!=NULL ) nrb = rb->prev->from; + } else { + rt = e->spline->from; + if ( rt->prev!=NULL ) nrt = rt->prev->from; + rb = e->spline->to; + if ( rb->next!=NULL ) nrb = rb->next->to; + } + if ( nlt!=NULL && nrt!=NULL ) + CheckDiagEnd(nlt,lt,rt,nrt,1,mds); + if ( nlb!=NULL && nrb!=NULL ) + CheckDiagEnd(nlb,lb,rb,nrb,0,mds); +} + +static int MakeDStem(DStemInfo *d,EI *apt,EI *e) { + memset(d,'\0',sizeof(DStemInfo)); + if ( apt->spline->to->me.y > apt->spline->from->me.y ) { + d->leftedgetop = apt->spline->to->me; + d->leftedgebottom = apt->spline->from->me; + } else if ( apt->spline->to->me.y == apt->spline->from->me.y || + apt->spline->to->me.x == apt->spline->from->me.x ) +return(false); /* If it's horizontal/vertical, I'm not interested */ + else { + d->leftedgetop = apt->spline->from->me; + d->leftedgebottom = apt->spline->to->me; + } + + if ( e->spline->to->me.y > e->spline->from->me.y ) { + d->rightedgetop = e->spline->to->me; + d->rightedgebottom = e->spline->from->me; + } else if ( e->spline->to->me.y == e->spline->from->me.y || + e->spline->to->me.x == e->spline->from->me.x ) +return(false); /* If it's horizontal/vertical, I'm not interested */ + else { + d->rightedgetop = e->spline->from->me; + d->rightedgebottom = e->spline->to->me; + } +return( true ); +} + +static int AreNearlyParallel(EI *apt,EI *e) { + DStemInfo d; + real x,y,len, len1,len2, stemwidth; + BasePoint top, bottom; + double scale, slope; + + if ( !MakeDStem(&d,apt,e)) +return( false ); + + scale = (d.rightedgetop.y-d.rightedgebottom.y)/(d.leftedgetop.y-d.leftedgebottom.y); + slope = (d.leftedgetop.y-d.leftedgebottom.y)/(d.leftedgetop.x-d.leftedgebottom.x); + if ( !RealWithin(d.rightedgetop.x,d.rightedgebottom.x+(d.leftedgetop.x-d.leftedgebottom.x)*scale,10) && + !RealWithin(d.rightedgetop.y,d.rightedgebottom.y+slope*(d.rightedgetop.x-d.rightedgebottom.x),12) ) +return( false ); + + /* Now check that the two segments have considerable overlap */ + /* First find the normal vector to either segment (should be approximately the same) */ + x = d.leftedgetop.y-d.leftedgebottom.y; y = -(d.leftedgetop.x-d.leftedgebottom.x); + len = sqrt(x*x+y*y); + x/=len; y/=len; + /* Now find the projection onto this normal of the vector between any */ + /* point on the first segment to any point on the second (should be the same) */ + stemwidth = x*(d.leftedgetop.x-d.rightedgetop.x) + + y*(d.leftedgetop.y-d.rightedgetop.y); + x *= stemwidth; y *= stemwidth; + /* Now we should have a vector which will move us orthogonal to the */ + /* segments from one to the other */ + + /* Now figure the overlap... */ + if ( d.leftedgetop.y>d.rightedgetop.y+y ) { + top = d.rightedgetop; + top.x += x; top.y += y; + } else + top = d.leftedgetop; + + if ( d.leftedgebottom.ylen2 ) + len1 = len2; + x = top.x-bottom.x; y = top.y-bottom.y; + len = x*x + y*y; + if ( len3) */ +return( false ); + + /* Now suppose we have a parallelogram. Then there are two possibilities for */ + /* dstems, but we only want one of them. We want the dstem where the stem */ + /* width is less than the stem length */ /* len1 is the smaller stem length */ + if ( stemwidth*stemwidth >= len1 ) +return( false ); + +return( true ); +} + +static DStemInfo *AddDiagStem(DStemInfo *dstems,EI *apt,EI *e,MinimumDistance **mds) { + DStemInfo d, *test, *prev, *new; + + if ( !MakeDStem(&d,apt,e)) +return( dstems ); + if ( dstems==NULL || d.leftedgetop.x < dstems->leftedgetop.x ) { + new = chunkalloc(sizeof(DStemInfo)); + *new = d; + new->next = dstems; + AddDiagMD(new,apt,e,mds); +return( new ); + } + for ( prev=NULL, test=dstems; test!=NULL && d.leftedgetop.x>test->leftedgetop.x; + prev = test, test = test->next ); + if ( test!=NULL && + d.leftedgetop.x==test->leftedgetop.x && d.leftedgetop.y==test->leftedgetop.y && + d.rightedgetop.x==test->rightedgetop.x && d.rightedgetop.y==test->rightedgetop.y && + d.leftedgebottom.x==test->leftedgebottom.x && d.leftedgebottom.y==test->leftedgebottom.y && + d.rightedgebottom.x==test->rightedgebottom.x && d.rightedgebottom.y==test->rightedgebottom.y ) +return( dstems ); + new = chunkalloc(sizeof(DStemInfo)); + *new = d; + new->next = test; + AddDiagMD(new,apt,e,mds); + if ( prev==NULL ) +return( new ); + prev->next = new; +return( dstems ); +} + +static StemInfo *URWSerifChecker(SplineChar *sc,StemInfo *stems) { + /* Some serifs we just don't notice because they are too far from */ + /* horizontal/vertical. So do a special check for these cases */ + SplineSet *spl; + SplinePoint *sp, *n; + BasePoint *bp, *bn; + double maxheight = .04*(sc->parent->ascent+sc->parent->descent); + StemInfo *prev, *test, *cur; + + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp = spl->first; ; sp=n ) { + if ( sp->next==NULL ) + break; + n = sp->next->to; + if ( n->next==NULL ) + break; + if ( sp->me.x==n->me.x && sp->prev!=NULL && + n->me.y-sp->me.y>-maxheight && n->me.y-sp->me.yprev->from->me.x-sp->me.x<0) == (n->next->to->me.x-sp->me.x<0) ) { + double slope = 20; + if ( n->nonextcp ) bn = &n->next->to->me; else bn = &n->nextcp; + if ( sp->noprevcp ) bp = &sp->prev->from->me; else bp = &sp->prevcp; + if ( bp->y == sp->me.y && n->me.x!=bn->x ) + slope = (n->me.y-bn->y)/( n->me.x-bn->x ); + else if ( bn->y == n->me.y && sp->me.x!=bp->x ) + slope = (sp->me.y-bp->y)/( sp->me.x-bp->x ); + if ( slope<0 ) slope = -slope; + if ( slope< 1/7. ) { /* URW NimbusRoman has slope of 6/74 */ + double start, width; + start = sp->me.y; width = n->me.y-sp->me.y; + if ( width<0 ) { + start += width; + width = -width; + } + for ( prev=NULL, test=stems; test!=NULL && + (test->startstart==start && test->widthnext ); + if ( test==NULL || test->start!=start || test->width!=width ) { + cur = chunkalloc(sizeof(StemInfo)); + cur->start = start; + cur->width = width; + cur->haspointleft = cur->haspointright = true; + cur->next = test; + if ( prev==NULL ) stems = cur; + else prev->next = cur; + test = cur; + } + if ( test->start==start && test->width==width && slope!=0 ) { + double b, e; + HintInstance *p, *t, *hi; + if ( sp->prev->from->me.x>sp->me.x ) { + b = sp->me.x; + e = sp->me.x+1/slope; + } else { + b = sp->me.x-1/slope; + e = sp->me.x; + } + for ( p=NULL, t=test->where; t!=NULL && + (t->beginbegin==b && t->endnext ); + if ( t!=NULL && ((b>=t->begin && bend) || (e>=t->begin && eend)) ) + /* already there */; + else { + hi = chunkalloc(sizeof(HintInstance)); + hi->begin = b; + hi->end = e; + hi->next = t; + if ( p==NULL ) test->where = hi; + else p->next = hi; + } + } + } + } + if ( n==spl->first ) + break; + } + } +return( stems ); +} + +static StemInfo *MergePossible(StemInfo *stems,StemInfo *possible) { + StemInfo *next, *s, *prev; + + prev = NULL; + if ( possible!=NULL ) + for ( s=possible; s->next!=NULL; s=next ) { + next = s->next; + if ( s->start+s->width>=next->start ) { + if ( /*s->widthwidth*/HIlen(s)next = next->next; + next->next = NULL; + StemInfoFree(next); + next = s; + } else { + if ( prev==NULL ) + possible=next; + else + prev->next = next; + s->next = NULL; + StemInfoFree(s); + } + } else + prev = s; + } + + while ( possible!=NULL ) { + next = possible->next; + possible->next = NULL; + for ( s=stems; s!=NULL; s=s->next ) { + if ( s->start==possible->start && s->width==possible->width ) + break; + if ((( s->start>=possible->start && s->start<=possible->start+possible->width ) || + (s->start+s->width>=possible->start && s->start+s->width<=possible->start+possible->width)) && + (HIlen(s)>s->width && s->linearedges)) + break; + } + if ( s==NULL ) + stems = StemInsert(stems,possible); + else + StemInfoFree(possible); + possible = next; + } +return( stems ); +} + +static StemInfo *ELFindStems(EIList *el, int major, DStemInfo **dstems, MinimumDistance **mds ) { + EI *active=NULL, *apt, *e, *p; + int i, change, ahv, ehv, waschange; + StemInfo *stems=NULL, *s; + real up, down; + struct pendinglist *pendings = NULL; + int other = !major; + StemInfo *possible = NULL; + + waschange = false; + for ( i=0; icnt; ++i ) { + active = EIActiveEdgesRefigure(el,active,i,major,&change); + /* Change means something started, ended, crossed */ + /* I'd like to know when a crossing is going to happen the pixel before*/ + /* it does. but that's too hard to compute */ + /* We also check every 16 pixels, mostly for cosmetic reasons */ + /* (long almost horizontal/vert regions may appear to end to abruptly) */ + if ( !( waschange || change || el->ends[i] || el->ordered[i]!=NULL || + (i!=el->cnt-1 && (el->ends[i+1] || el->ordered[i+1]!=NULL)) || + (i&0xf)==0 )) + /* It's in the middle of everything. Nothing will have changed */ + continue; + waschange = change; + for ( apt=active; apt!=NULL; apt = e->aenext ) { + if ( EISkipExtremum(apt,i+el->low,major)) { + e = apt->aenext; + if ( e==NULL ) + break; + else + continue; + } + if ( !apt->hv && apt->aenext!=NULL && apt->aenext->hv && + EISameLine(apt,apt->aenext,i+el->low,major)) + apt = apt->aenext; + e = p = EIActiveEdgesFindStem(apt, i+el->low, major); + if ( e==NULL ) + break; + if ( !e->hv && e->aenext!=NULL && e->aenext->hv && + EISameLine(e,e->aenext,i+el->low,major)) + e = e->aenext; + ahv = ( apt->hv || + (apt->coordmax[other]-apt->ocur<1 && + ((apt->hup==apt->vup && apt->hvtop) || + (apt->hup!=apt->vup && apt->hvbottom))) || + (apt->ocur-apt->coordmin[other]<1 && + ((apt->hup==apt->vup && apt->hvbottom) || + (apt->hup!=apt->vup && apt->hvtop)) ) ); + ehv = ( e->hv || + (e->coordmax[other]-e->ocur<1 && + ((e->hup==e->vup && e->hvtop) || + (e->hup!=e->vup && e->hvbottom))) || + (e->ocur-e->coordmin[other]<1 && + ((e->hup==e->vup && e->hvbottom) || + (e->hup!=e->vup && e->hvtop)) ) ); + if ( ahv && ehv ) + stems = StemAddUpdate(stems,apt,e,el->low+i,major,pendings); + else if ( ahv && IsNearHV(apt,e,i+el->low,&up,&down,major)) + stems = StemAddBrief(stems,apt,e,el->low+i+down,el->low+i+up,major); + else if ( ehv && IsNearHV(e,apt,i+el->low,&up,&down,major)) + stems = StemAddBrief(stems,apt,e,el->low+i+down,el->low+i+up,major); + else if ( ( ehv && !e->hv ) || ( ahv && !apt->hv ) ) { + StemInfo *temp = stems; + possible = StemsOffsetHack(possible,apt,e,major); + pendings = StemPending(pendings,apt,e,ahv,major,&temp); + stems = temp; + } else if ( dstems!=NULL && + apt->spline->knownlinear && e->spline->knownlinear && + AreNearlyParallel(apt,e)) { + *dstems = AddDiagStem(*dstems,apt,e,mds); + } + + if ( EISameLine(p,p->aenext,i+el->low,major)) /* There's one case where this doesn't happen in FindStem */ + e = p->aenext; /* If the e is horizontal and e->aenext is not */ + } + StemCloseUntouched(stems,i+el->low); + } + for ( s=stems; s!=NULL; s=s->next ) + s->where = HIReverse(s->where); + PendingListFree(pendings); + stems = MergePossible(stems,possible); + if ( major==0 ) + stems = URWSerifChecker(el->sc,stems); +return( stems ); +} + +static void HIExtendTo(HintInstance *where, real val ) { + while ( where!=NULL ) { + if ( where->begin>val && where->begin<=val+1 ) { + where->begin=val; +return; + } else if ( where->endend>=val-1 ) { + where->end = val; +return; + } + where = where->next; + } +} + +static StemInfo *StemRemoveZeroHIlen(StemInfo *stems) { + StemInfo *s, *p, *t, *sn; + HintInstance *hi; + /* Ok, consider the vstems of a serifed I */ + /* Now at the top of the main stem (at the base of the top serif) we have */ + /* four points on a horizontal line (left of serif, left of stem, right of stem, right of serif) */ + /* PfaEdit will pick two of these at random and attempt to draw a stem there */ + /* If we picked the left edge of the serif and the right edge of the stem */ + /* we made a mistake. It will show up as a 0 hilen stem. But it will also*/ + /* keep the serif and main stems from reaching the endpoints, so fix that*/ + + for ( p=NULL, s=stems; s!=NULL; s = sn ) { + sn = s->next; + if ( HIlen(s)==0 ) { + if ( s->where!=NULL ) { + t = NULL; + if ( sn!=NULL && sn->start==s->start ) + t = sn; + else if ( p!=NULL && p->start==s->start ) + t = p; + if ( t!=NULL ) + for ( hi = s->where; hi!=NULL; hi=hi->next ) + HIExtendTo(t->where,hi->begin); + for ( t=s->next; t!=NULL && t->startstart+s->width; t=t->next ) + if ( t->start+t->width==s->start+s->width ) + break; + if ( t!=NULL && t->start+t->width==s->start+s->width ) + for ( hi = s->where; hi!=NULL; hi=hi->next ) + HIExtendTo(t->where,hi->begin); + } + if ( p==NULL ) + stems = sn; + else + p->next = sn; + StemInfoFree(s); + } else + p = s; + } +return( stems ); +} + +static int AnyPointsAt(SplineSet *spl,int major,real coord) { + SplinePoint *sp; + + while ( spl!=NULL ) { + sp = spl->first; + do { + if (( major && sp->me.x==coord ) || (!major && sp->me.y==coord)) +return( true ); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } while ( sp!=spl->first ); + spl = spl->next; + } +return( false ); +} + +/* I don't do a good job of figuring points left/right because sometimes */ +/* the point is actually outside the (obvious) range of the hint. So check */ +/* and see if there are any points with our coord value. If there are none */ +/* then it's safe to remove the hint */ +static StemInfo *StemRemovePointlessHints(SplineChar *sc,int major,StemInfo *stems) { + StemInfo *head=stems, *n, *p; + int right, left; + + p = NULL; + while ( stems!=NULL ) { + n = stems->next; + right = stems->haspointright; left = stems->haspointleft; + if ( !left ) + left = AnyPointsAt(sc->layers[ly_fore].splines,major,stems->start); + if ( !right ) + right = AnyPointsAt(sc->layers[ly_fore].splines,major,stems->start+stems->width); + if ( !right || !left ) { + StemInfoFree(stems); + if ( p==NULL ) + head = n; + else + p->next = n; + } else + p = stems; + stems = n; + } +return( head ); +} + +static StemInfo *StemRemoveWiderThanLong(StemInfo *stems,real big) { + StemInfo *s, *p, *sn; + /* Consider hyphen */ + /* It seems to confuse freetype if we give it a vertical stem (even though*/ + /* it certainly is one). Instead, for rectangular stems remove the orientation */ + /* which is wider than long */ + + for ( p=NULL, s=stems; s!=NULL; s = sn ) { + sn = s->next; + if ( (s->linearedges || s->width>big || !(s->haspointleft || s->haspointright)) && + s->width>HIlen(s)) { + if ( p==NULL ) + stems = sn; + else + p->next = sn; + StemInfoFree(s); + } else + p = s; + } +return( stems ); +} + +static StemInfo *StemRemoveSerifOverlaps(StemInfo *stems) { + /* I don't think the rasterizer will be able to do much useful stuff with*/ + /* with a serif vstem. What we want is to make sure the distance between*/ + /* the nested (main) stem and the serif is the same on both sides but */ + /* there is no mechanism for that */ + /* There are also a few hstem serifs (the central stem of "E" or the low */ + /* stem of "F" for instance) */ + /* So I think they are useless. But they provide overlaps, which means */ + /* we need to invoke hint substitution for something useless. So let's */ + /* just get rid of them */ + + /* The stems list is ordered by stem start. Look for any overlaps where: */ + /* the nested stem has about the same distance to the right as to the left */ + /* the nested stem's height is large compared to that of the serif (containing) */ + /* the containing stem only happens at the top and bottom of the nested */ + + StemInfo *serif, *main, *prev, *next; + HintInstance *hi; + + prev = NULL; + for ( serif=stems; serif!=NULL; serif=next ) { + next = serif->next; + for ( main=serif->next; main!=NULL && main->startstart+serif->width; + main = main->next ) { + real left, right, sh, top, bottom; + left = main->start-serif->start; + right = serif->start+serif->width - (main->start+main->width); + if ( left-right<-20 || left-right>20 || left==0 || right==0 ) + continue; + /* In "H" the main stem is broken in two */ + bottom = main->where->begin; top = main->where->end; + for ( hi = main->where; hi!=NULL; hi=hi->next ) { + if ( bottom>hi->begin ) bottom = hi->begin; + if ( top < hi->end ) top = hi->end; + } + sh = 0; + for ( hi = serif->where; hi!=NULL; hi=hi->next ) { + sh += hi->end-hi->begin; + if ( hi->endbegin>bottom ) + break; /* serif in middle => not serif */ + } + if ( hi!=NULL ) + continue; /* serif in middle => not serif */ + if ( 2*sh>(top-bottom) ) + continue; + if ( serif->where!=NULL && serif->where->next!=NULL && serif->where->next->next!=NULL ) + continue; /* No more that two serifs, top & bottom */ + /* If we get here, then we've got a serif and a main stem */ + break; + } + if ( main!=NULL && main->startstart+serif->width ) { + /* If we get here, then we've got a serif and a main stem */ + if ( prev==NULL ) + stems = next; + else + prev->next = next; + StemInfoFree(serif); + } else + prev = serif; + } +return( stems ); +} + +real HIlen( StemInfo *stems) { + HintInstance *hi; + real len = 0; + + for ( hi=stems->where; hi!=NULL; hi = hi->next ) + len += hi->end-hi->begin; +return( len ); +} + +real HIoverlap( HintInstance *mhi, HintInstance *thi) { + HintInstance *hi; + real len = 0; + real s, e; + + for ( ; mhi!=NULL; mhi = mhi->next ) { + for ( hi = thi; hi!=NULL && hi->begin<=mhi->end; hi = hi->next ) { + if ( hi->endbegin ) { + thi = hi; + continue; + } + s = hi->beginbegin?mhi->begin:hi->begin; + e = hi->end>mhi->end?mhi->end:hi->end; + if ( ehasconflicts ) +return( true ); + stems = stems->next; + } +return( false ); +} + +static int StemWouldConflict(StemInfo *stems,double base, double width) { + int found; + + if ( width<0 ) { + base += width; + width = -width; + } + while ( stems!=NULL && stems->startstart+stems->widthnext; + + found = false; + while ( stems!=NULL && stems->startstart+stems->widthstart==base && stems->width==width ) || + (stems->start+stems->width==base && stems->width==-width )) +return( false ); /* If it has already been added, then too late to worry about conflicts */ + if ( stems->width>0 ) { + if ( stems->start+stems->width>=base && stems->start<=base+width ) + found = true; + } else { + if ( stems->start>=base && stems->start+stems->width<=base+width ) + found = true; + } + stems = stems->next; + } +return( found ); +} + +int StemListAnyConflicts(StemInfo *stems) { + StemInfo *s; + int any= false; + double end; + + for ( s=stems; s!=NULL ; s=s->next ) + s->hasconflicts = false; + while ( stems!=NULL ) { + end = stems->width<0 ? stems->start : stems->start+stems->width; + for ( s=stems->next; s!=NULL && (s->width>0 ? s->start : s->start+s->width)next ) { + stems->hasconflicts = true; + s->hasconflicts = true; + any = true; + } + stems = stems->next; + } +return( any ); +} + +#if 0 +static StemInfo *StemRemoveConflictingHintsWithoutPoints(StemInfo *stems) { + StemInfo *head=stems, *n, *p; + + p = NULL; + while ( stems!=NULL ) { + n = stems->next; + if ( n==NULL ) + break; + if ( stems->start==n->start || stems->start+stems->width>=n->start+n->width ) { + if ( !stems->haspointright || !stems->haspointleft ) { + StemInfoFree(stems); + if ( p==NULL ) + head = n; + else + p->next = n; + stems = n; + continue; + } else if ( !n->haspointright || !n->haspointleft ) { + stems->next = n->next; + StemInfoFree(n); + continue; + } + } + p = stems; + stems = n; + } +return( head ); +} +#endif + +static StemInfo *StemRemoveWideConflictingHintsContainingLittleOnes(StemInfo *stems) { + /* The crossbar of the H when treated as a vstem is an annoyance */ + /* There are no points for which the hint applies, but it's existance */ + /* means that we have conflicts. So let's just get rid of it. It does */ + /* no good */ + StemInfo *head=stems, *n, *sn, *p; + int any; + + p = NULL; + while ( stems!=NULL ) { + n = stems->next; + if ( n==NULL ) + break; + if ( stems->start==n->start && stems->pendingpt && stems->width>n->width ) { + StemInfoFree(stems); + if ( p==NULL ) + head = n; + else + p->next = n; + stems = n; + continue; + } else if ( stems->start==n->start && n->pendingpt && n->width>stems->width ) { + stems->next = n->next; + StemInfoFree(n); + p = stems; + n = stems->next; + } + p = stems; + stems = n; + } + + while ( stems!=NULL ) { + n = stems->next; + while ( n!=NULL && RealNear(n->start,stems->start) && n->width>4*stems->width && + 4*HIlen(stems)>HIlen(n) ) { + stems->next = n->next; + StemInfoFree(n); + n = stems->next; + } + stems = n; + } + for ( p=NULL, stems=head; stems!=NULL; stems=sn ) { + sn = stems->next; + any = false; + for ( n=stems->next; n!=NULL && n->startstart+stems->width; n=n->next ) { + if ( (RealNear(n->start+n->width,stems->start+stems->width) && + HIlen(stems)width>4*n->width && 4*HIlen(stems)next = sn; + StemInfoFree(stems); + any = true; + break; + } + } + if ( !any ) + p = stems; + } +return( head ); +} + +static StemInfo *StemRemoveConflictingBigHint(StemInfo *stems,real big) { + /* In "I" we may have a hint that runs from the top of the character to */ + /* the bottom (especially if the serif is slightly curved), if it's the */ + /* whole character then it doesn't do much good */ + /* Unless it is needed for blue zones?... */ + /* It should be a ghost instead */ + StemInfo *p, *head=stems, *n, *biggest, *bp, *s; + int any=true, conflicts; + double max; + + while ( any ) { + any = false; + stems = head; + p = NULL; + while ( stems!=NULL ) { + max = stems->width<0 ? stems->start : stems->start+stems->width; + biggest = stems; + bp = p; + conflicts = false; + for ( p = stems, s=stems->next; + s!=NULL && (s->width<0 ? s->start+s->width : s->start) < max ; + p = s, s=s->next ) { + conflicts = true; + if ( (s->width<0 ? s->start : s->start+s->width)>max ) + max = (s->width<0 ? s->start : s->start+s->width); + if ( fabs(s->width) > fabs(biggest->width) ) { + biggest = s; + bp = p; + } + } + if ( conflicts && biggest->width>big ) { + any = true; + n = biggest->next; + /* Die! */ + if ( bp==NULL ) + head = n; + else + bp->next = n; + if ( biggest==p ) + p = bp; + StemInfoFree(biggest); + } + stems = s; + } + } +#if 0 + /* if we have a hint which controls no points, conflicts with another hint*/ + /* and contains the other hint completely then remove it */ + for ( p=NULL, stems=head; stems!=NULL; stems = n ) { + n = stems->next; + if ( n==NULL ) + break; + if ( stems->hasconflicts && n->start==stems->start && n->width>=stems->width && + !n->haspointleft && !n->haspointright && + (stems->haspointleft || stems->haspointright) ) { + stems->next = n->next; + StemInfoFree(n); + n = stems->next; + p = stems; + } else if ( stems->hasconflicts && stems->start+stems->width>n->start+n->width && + (n->haspointleft || n->haspointright) && + !stems->haspointleft && !stems->haspointright ) { + if ( p==NULL ) + head = n; + else + p->next = n; + StemInfoFree(stems); + } else + p = stems; + } +#endif +return( head ); +} + +HintInstance *HICopyTrans(HintInstance *hi, real mul, real offset) { + HintInstance *first=NULL, *last, *cur, *p; + + while ( hi!=NULL ) { + cur = chunkalloc(sizeof(HintInstance)); + if ( mul>0 ) { + cur->begin = hi->begin*mul+offset; + cur->end = hi->end*mul+offset; + if ( first==NULL ) + first = cur; + else + last->next = cur; + last = cur; + } else { + cur->begin = hi->end*mul+offset; + cur->end = hi->begin*mul+offset; + if ( first==NULL || cur->beginbegin ) { + cur->next = first; + first = cur; + } else { + for ( p=first, last=p->next; last!=NULL && cur->begin>last->begin; last=last->next ); + p->next = cur; + cur->next = last; + } + } + hi = hi->next; + } +return( first ); +} + +static int inhints(StemInfo *stems,real base, real width) { + + while ( stems!=NULL ) { + if ( stems->start==base || stems->start+stems->width==base+width || + stems->start+stems->width==base || stems->start==base+width ) +return( true ); + stems = stems->next; + } +return( false ); +} + +static StemInfo *GhostAdd(StemInfo *ghosts, StemInfo *stems, real base, + real width, real xstart, real xend ) { + StemInfo *s, *prev, *test; + HintInstance *hi; + + if ( base!=rint(base)) +return( ghosts ); + + if ( xstart>xend ) { + real temp = xstart; + xstart = xend; + xend = temp; + } + if ( width==20 ) base -= 20; + + if ( inhints(stems,base,width)) +return(ghosts); /* already recorded */ + if ( StemWouldConflict(stems,base,width)) +return(ghosts); /* Let's not add a conflicting ghost hint */ + if ( StemWouldConflict(ghosts,base,width)) +return(ghosts); + + for ( s=ghosts; s!=NULL; s=s->next ) + if ( s->start==base && s->width==width ) + break; + if ( s==NULL ) { + s = chunkalloc(sizeof(StemInfo)); + s->start = base; + s->width = width; + s->ghost = true; + s->backwards = true; + if ( ghosts==NULL || basestart ) { + s->next = ghosts; + ghosts = s; + } else { + for ( prev=ghosts, test=ghosts->next; test!=NULL && basestart; + prev = test, test = test->next); + prev->next = s; + s->next = test; + } + } + hi = chunkalloc(sizeof(HintInstance)); + hi->begin = xstart; + hi->end = xend; + s->where = HIMerge(s->where,hi); +return( ghosts ); +} + +static StemInfo *CheckForGhostHints(StemInfo *stems,SplineChar *sc) { + /* PostScript doesn't allow a hint to stretch from one alignment zone to */ + /* another. (Alignment zones are the things in bluevalues). This means */ + /* that we can't define a horizontal stem hint which stretches from */ + /* the baseline to the top of a capital I, or the x-height of lower i */ + /* If we find any such hints we must remove them, and replace them with */ + /* ghost hints. The bottom hint has height -21, and the top -20 */ + BlueData bd; + SplineFont *sf = sc->parent; + StemInfo *prev, *s, *n, *snext, *ghosts = NULL; + SplineSet *spl; + Spline *spline, *first; + SplinePoint *sp; + real base, width, toobig = (sc->parent->ascent+sc->parent->descent)/2; + int i,startfound, widthfound; + + /* Get the alignment zones */ + QuickBlues(sf,&bd); + + /* look for any stems stretching from one zone to another and remove them */ + /* (I used to turn them into ghost hints here, but that didn't work (for */ + /* example on "E" where we don't need any ghosts from the big stem because*/ + /* the narrow stems provide the hints that PS needs */ + /* However, there are counter-examples. in Garamond-Pro the "T" character */ + /* has a horizontal stem at the top which stretches between two adjacent */ + /* bluezones. Removing it is wrong. Um... Thanks Adobe */ + /* I'd guess the "big" check is more important */ + for ( prev=NULL, s=stems; s!=NULL; s=snext ) { + snext = s->next; + startfound = widthfound = -1; + for ( i=0; istart>=bd.blues[i][0]-1 && s->start<=bd.blues[i][1]+1 ) + startfound = i; + else if ( s->start+s->width>=bd.blues[i][0]-1 && s->start+s->width<=bd.blues[i][1]+1 ) + widthfound = i; + } + if ( startfound!=-1 && widthfound!=-1 && + (startfound+1==widthfound || startfound==widthfound+1) && + s->widthnext = snext; + s->next = NULL; + StemInfoFree(s); + } else + prev = s; + } + + /* Now look and see if we can find any edges which lie in */ + /* these zones. Edges which are not currently in hints */ + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl = spl->next ) if ( spl->first->prev!=NULL ) { + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = spline->to->next ) { + base = spline->from->me.y; + if ( spline->knownlinear && base == spline->to->me.y ) { + for ( i=0; i=bd.blues[i][0]-1 && base<=bd.blues[i][1]+1 ) + break; + } + if ( i!=bd.bluecnt ) { + width = (spline->from->prev->from->me.y > spline->from->me.y)?21:20; + ghosts = GhostAdd(ghosts,stems, base,width,spline->from->me.x,spline->to->me.x); + } + } + if ( first==NULL ) first = spline; + } + /* And check for the horizontal top of a curved surface */ + for ( sp = spl->first; ; ) { + base = sp->me.y; + if ( !sp->nonextcp && !sp->noprevcp && sp->nextcp.y==base && + sp->prevcp.y==base ) { + for ( i=0; i=bd.blues[i][0]-1 && base<=bd.blues[i][1]+1 ) + break; + } + if ( i!=bd.bluecnt ) { + width = (spline->from->prev->from->me.y > spline->from->me.y)?21:20; + ghosts = GhostAdd(ghosts,stems, base,width,(sp->me.x+sp->prevcp.x)/2,(sp->me.x+sp->nextcp.x)/2); + } + } + sp = sp->next->to; + if ( sp == spl->first ) + break; + } +/* It's just too hard to detect what isn't a dished serifs... */ +/* We find so much stuff that is just wrong. */ +#if 0 + for ( sp=spl->first; ; ) { + if ( sp->next==NULL ) + break; + /* Look for dished serifs */ + if ( !sp->nonextcp && !sp->noprevcp && sp->me.y==sp->nextcp.y && + sp->me.y==sp->prevcp.y && + sp->prev!=NULL && sp->prev->from->prev!=NULL && + /* sp->next!=NULL &&*/ sp->next->to->next!=NULL && + sp->next->to->me.x != sp->me.x && + sp->prev->from->me.x != sp->me.x && + sp->next->to->me.y != sp->me.y && + sp->next->to->me.y == sp->prev->from->me.y && + sp->next->to->next->knownlinear && + sp->prev->from->prev->knownlinear && + (sp->next->to->me.y>sp->next->to->next->to->me.y)== + (sp->prev->from->me.y>sp->prev->from->prev->from->me.y)) { + real xstart = (sp->prev->from->me.x-sp->me.x)/(sp->prev->from->me.y-sp->me.y); + real xend = (sp->next->to->me.x-sp->me.x)/(sp->next->to->me.y-sp->me.y); + if (( xstart<0 && sp->prev->from->me.x>sp->me.x) || + (xstart>0 && sp->prev->from->me.xme.x)) + xstart = -xstart; + if (( xend<0 && sp->next->to->me.x>sp->me.x) || + (xend>0 && sp->next->to->me.xme.x)) + xend = -xend; + width = (sp->next->to->me.y>sp->next->to->next->to->me.y)?21:20; + ghosts = GhostAdd(ghosts,stems, base,width,sp->me.x+xstart,sp->me.x+xend); + } + sp = sp->next->to; + if ( sp==spl->first ) + break; + } +#endif + } + + /* Finally add any ghosts we've got back into the stem list */ + for ( s=ghosts; s!=NULL; s=snext ) { + snext = s->next; + for ( prev=NULL, n=stems; n!=NULL && s->start>n->start; prev=n, n=n->next ); + if ( prev==NULL ) { + s->next = stems; + stems = s; + } else { + prev->next = s; + s->next = n; + } + } +return( stems ); +} + +static int DStemsOverlapBigger(DStemInfo *t1,DStemInfo *t2,int ls /*leftsame*/) { + real width1, width2; + real x,y,len, dist; + + x = (t1->leftedgetop.y-t1->leftedgebottom.y); + y = -(t1->leftedgetop.x-t1->leftedgebottom.x); + len = sqrt(x*x+y*y); + x /= len; y/= len; + /* We now have a unit vector perpendicular to the stems (all stems should */ + /* be parallel, so we could have chosen any of them */ + + dist = ( (&t1->leftedgetop)[ls].x-(&t2->leftedgetop)[ls].x )*x + + ( (&t1->leftedgetop)[ls].y-(&t2->leftedgetop)[ls].y )*y; + /* This is the distance (along our unit vector) from the edge of t1 that */ + /* is not an edge of t2 TO the edge of t2 that is not an edge of t1 */ + if ( (&t2->leftedgebottom)[ls].y+dist*y>=(&t1->leftedgetop)[ls].y ) +return( 0 ); /* no overlap */ + if ( (&t2->leftedgetop)[ls].y+dist*y<=(&t1->leftedgebottom)[ls].y ) +return( 0 ); /* no overlap */ + + width1 = (t1->leftedgetop.x-t1->rightedgetop.x)*x + + (t1->leftedgetop.y-t1->rightedgetop.y)*y; + width2 = (t2->leftedgetop.x-t2->rightedgetop.x)*x + + (t2->leftedgetop.y-t2->rightedgetop.y)*y; + if ( width1*width2<0 ) +return( 0 ); + if ( width1<0 ) { + width1 = -width1; + width2 = -width2; + } + if ( width1>width2 ) +return( 1 ); /* t1 has the wider dstem */ + else if ( width1==width2 ) +return( -1 ); /* they must be the same, remove either one */ + +return( -1 ); /* t2 has the wider dstem */ +} + +static DStemInfo *DStemPrune(DStemInfo *dstems) { + DStemInfo *test, *prev, *t2, *next, *t2next, *t2prev; + int which; + + prev = NULL; + for ( test=dstems; test!=NULL; test=next ) { + next = test->next; + t2prev = test; + which = 0; + for ( t2 = test->next; t2!=NULL; t2 = t2next ) { + t2next = t2->next; + which = 0; + if ( t2->leftedgetop.x==test->leftedgetop.x && + t2->leftedgetop.y==test->leftedgetop.y && + t2->leftedgebottom.x==test->leftedgebottom.x && + t2->leftedgebottom.y==test->leftedgebottom.y ) + which = DStemsOverlapBigger(test,t2,1); + else if ( t2->rightedgetop.x==test->rightedgetop.x && + t2->rightedgetop.y==test->rightedgetop.y && + t2->rightedgebottom.x==test->rightedgebottom.x && + t2->rightedgebottom.y==test->rightedgebottom.y ) + which = DStemsOverlapBigger(test,t2,0); + if ( which==1 ) { + if ( prev==NULL ) + dstems = next; + else + prev->next = next; + chunkfree(test,sizeof(DStemInfo)); + break; + } else if ( which==-1 ) { + t2prev->next = t2next; + if ( t2prev==test ) + next = t2next; + chunkfree(t2,sizeof(DStemInfo)); + } else + t2prev = t2; + } + if ( which!=1 ) + prev = test; + } +return( dstems ); +} + +static StemInfo *SCFindStems(EIList *el, int major, int removeOverlaps,DStemInfo **dstems,MinimumDistance **mds) { + StemInfo *stems; + real big = (el->coordmax[1-major]-el->coordmin[1-major])*.40; + + el->major = major; + ELOrder(el,major); + stems = ELFindStems(el,major,dstems,mds); + free(el->ordered); + free(el->ends); + stems = StemRemoveZeroHIlen(stems); + stems = StemRemoveWiderThanLong(stems,big); + stems = StemRemovePointlessHints(el->sc,major,stems); + if ( removeOverlaps ) { + /*if ( major==1 )*/ /* There are a few hstem serifs that should be removed, central stem of "E" */ + stems = StemRemoveSerifOverlaps(stems); + stems = StemRemoveWideConflictingHintsContainingLittleOnes(stems); + if ( major==0 ) + stems = CheckForGhostHints(stems,el->sc); + /* Should be done by WiderThanLong now, and done better */ + /* Nope. There are some fonts where these hints are longer than wide but still should go. */ + if ( StemListAnyConflicts(stems) ) { + real big = (el->coordmax[1-major]-el->coordmin[1-major])*.40; + char *pt; + if ( (major==1 && (pt=PSDictHasEntry(el->sc->parent->private,"StdVW"))!=NULL ) || + (major==0 && (pt=PSDictHasEntry(el->sc->parent->private,"StdHW"))!=NULL )) { + real val; + while ( isspace(*pt) || *pt=='[' ) ++pt; + val = strtod(pt,NULL); + if ( val>big ) + big = val*1.3; + } + stems = StemRemoveConflictingBigHint(stems,big); + /* Now we need to run AnyConflicts again, but we'll have to do that */ + /* anyway after adding hints from References */ + } + /*stems = StemRemoveConflictingHintsWithoutPoints(stems);*/ /* Too extreme */ + } + if ( dstems!=NULL ) + *dstems = DStemPrune( *dstems ); +return( stems ); +} + +static HintInstance *SCGuessHintPoints(SplineChar *sc, StemInfo *stem,int major, int off) { + SplinePoint *starts[20], *ends[20]; + int spt=0, ept=0; + SplinePointList *spl; + SplinePoint *sp, *np; + int sm, wm, i, j, val; + real coord; + HintInstance *head, *test, *cur, *prev; + + for ( spl=sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; sp = np ) { + coord = (major?sp->me.x:sp->me.y); + sm = coord>=stem->start-off && coord<=stem->start+off; + wm = coord>=stem->start+stem->width-off && coord<=stem->start+stem->width+off; + if ( sm && spt<20 ) + starts[spt++] = sp; + if ( wm && ept<20 ) + ends[ept++] = sp; + if ( sp->next==NULL ) + break; + np = sp->next->to; + if ( np==spl->first ) + break; + } + } + + head = NULL; + for ( i=0; ime.y>=ends[j]->me.y-1 && starts[i]->me.y<=ends[j]->me.y+1 ) { + val = starts[i]->me.y; + break; + } else if ( !major && starts[i]->me.x>=ends[j]->me.x-1 && starts[i]->me.x<=ends[j]->me.x+1 ) { + val = starts[i]->me.x; + break; + } + } + if ( val!=0x80000000 ) { + for ( prev=NULL, test=head; test!=NULL && val>test->begin; prev=test, test=test->next ); + if ( test==NULL || val!=test->begin ) { + cur = chunkalloc(sizeof(HintInstance)); + cur->begin = cur->end = val; + cur->next = test; + if ( prev==NULL ) head = cur; + else prev->next = cur; + } + } + } +return( head ); +} + +static void SCGuessHintInstances(SplineChar *sc, StemInfo *stem,int major) { + SplinePointList *spl; + SplinePoint *sp, *np; + int sm, wm, off; + real ob, oe; + HintInstance *s=NULL, *w=NULL, *cur, *p, *t, *n, *w2; + /* We've got a hint (from somewhere, old data, reading in a font, user specified etc.) */ + /* but we don't have HintInstance info. So see if we can find those data */ + /* Will get confused by stems with holes in them (for example if you make */ + /* a hint from one side of an H to the other, it will get the whole thing */ + /* not just the cross stem) */ + + for ( spl=sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; sp = np ) { + sm = (major?sp->me.x:sp->me.y)==stem->start; + wm = (major?sp->me.x:sp->me.y)==stem->start+stem->width; + if ( sp->next==NULL ) + break; + np = sp->next->to; + if ( sm || wm ) { + if ( !major ) { + if ( np->me.y==sp->me.y ) { + ob = sp->me.x; oe = np->me.x; + } else if ( sp->nextcp.y==sp->me.y ) { + ob = sp->me.x; oe = (sp->me.x+sp->nextcp.x)/2; + if ( sp->prevcp.y==sp->me.y ) + ob = (sp->prevcp.x+sp->me.x)/2; + } else if ( sp->prevcp.y==sp->me.y ) { + ob = sp->me.x; oe = (sp->prevcp.x+sp->me.x)/2; + } else + sm = wm = false; + } else { + if ( np->me.x==sp->me.x ) { + ob = sp->me.y; oe = np->me.y; + } else if ( sp->nextcp.x==sp->me.x ) { + ob = sp->me.y; oe = (sp->nextcp.y+sp->me.y)/2; + if ( sp->prevcp.x==sp->me.x ) + ob = (sp->prevcp.y+sp->me.y)/2; + } else if ( sp->prevcp.x==sp->me.x ) { + ob = sp->me.y; oe = (sp->prevcp.y+sp->me.y)/2; + } else + sm = wm = false; + } + } + if ( sm || wm ) { + cur = chunkalloc(sizeof(HintInstance)); + if ( ob>oe ) { real temp=ob; ob=oe; oe=temp;} + cur->begin = ob; + cur->end = oe; + if ( sm ) { + if ( s==NULL || s->begin>cur->begin ) { + cur->next = s; + s = cur; + } else { + p = s; + for ( t=s->next; t!=NULL && t->beginbegin; p=t, t=t->next ); + p->next = cur; cur->next = t; + } + } else { + if ( w==NULL || w->begin>cur->begin ) { + cur->next = w; + w = cur; + } else { + p = w; + for ( t=w->next; t!=NULL && t->beginbegin; p=t, t=t->next ); + p->next = cur; cur->next = t; + } + } + } + if ( np==spl->first ) + break; + } + } + + /* Now we know what the right side of the stem looks like, and we know */ + /* what the left side looks like. They may not look the same (H for example) */ + /* Figure out the set where both are active */ + /* Unless it's a ghost hint */ + if ( stem->width==20 && s==NULL && w!=NULL ) { + s = w; + w = NULL; + } else if ( stem->width==21 && s!=NULL && w==NULL) { + /* Just use s */; + } else for ( p=NULL, t=s; t!=NULL; t=n ) { + n = t->next; + for ( w2=w; w2!=NULL && w2->beginend ; w2=w2->next ) { + if ( w2->end<=t->begin ) + continue; + if ( w2->begin<=t->begin && w2->end>=t->end ) { + /* Perfect match */ + break; + } + if ( w2->begin>=t->begin ) + t->begin = w2->begin; + if ( w2->end<=t->end ) { + cur = chunkalloc(sizeof(HintInstance)); + cur->begin = w2->end; + cur->end = t->end; + cur->next = n; + t->next = cur; + n = cur; + t->end = w2->end; + } + break; + } + if ( w2==NULL || w2->begin>=t->end ) { + /* No match for t (or if there were it wasn't complete) get rid */ + /* of what's left of t */ + chunkfree(t,sizeof(*t)); + if ( p==NULL ) + s = n; + else + p->next = n; + } else + p = t; + } + while ( w!=NULL ) { + n = w->next; + chunkfree(w,sizeof(*w)); + w=n; + } + + /* If we couldn't find anything, then see if there are two points which */ + /* have the same x or y value and whose other coordinates match those of */ + /* the hint */ + /* Surprisingly many fonts have hints which don't accurately match the */ + /* points. Perhaps BlueFuzz (default 1) applies here too */ + for ( off=0; off<1 && s==NULL; ++off ) + s = SCGuessHintPoints(sc,stem,major,off); + + stem->where = s; +} + +static StemInfo *StemInfoAdd(StemInfo *list, StemInfo *new) { + StemInfo *prev, *test; + + for ( prev=NULL, test=list; test!=NULL && new->start>test->start; prev=test, test=test->next ); + if ( test!=NULL && test->start==new->start && test->width==new->width ) { + /* Replace the old with the new */ + /* can't just free the new, because the Guess routines depend on it */ + /* being around */ + new->next = test->next; + StemInfoFree(test); + } else + new->next = test; + if ( prev==NULL ) + list = new; + else + prev->next = new; +return( list ); +} + +#if 0 +/* Make sure that the hi list in stem does not contain any regions covered by */ +/* the cantuse list (if it does, remove them) */ +static void HIRemoveFrom(StemInfo *stem, HintInstance *cantuse) { + HintInstance *hi, *p, *t; + + p = NULL; + for ( hi=stem->where; hi!=NULL && cantuse!=NULL; ) { + if ( cantuse->endbegin ) + cantuse = cantuse->next; + else if ( hi->endbegin ) { + p = hi; + hi = hi->next; + } else if ( cantuse->begin<=hi->begin && cantuse->end>=hi->end ) { + /* Perfect match, remove entirely */ + t = hi->next; + if ( p==NULL ) + stem->where = t; + else + p->next = t; + chunkfree(hi,sizeof(HintInstance)); + hi = t; + } else if ( cantuse->begin<=hi->begin ) { + hi->begin = cantuse->end; + cantuse = cantuse->next; + } else if ( cantuse->end>=hi->end ) { + hi->end = cantuse->begin; + p = hi; + hi = hi->next; + } else { + /* cantuse breaks hi into two bits */ + t = chunkalloc(sizeof(HintInstance)); + t->begin = cantuse->end; + t->end = hi->end; + t->next = hi->next; + hi->next = t; + hi->end = cantuse->begin; + p = hi; + hi = t; + cantuse = cantuse->next; + } + } +} + +static void StemInfoReduceOverlap(StemInfo *list, StemInfo *stem) { + /* Find all stems which conflict with this one */ + /* then for every stem which contains this one, remove this one's hi's from*/ + /* its where list (so if this one is active, that one can't be) */ + /* Do the reverse if this stem contains others */ + /* And if they just overlap? Neither containing the other? */ + + for ( ; list!=NULL && list->startstart+stem->width; list=list->next ) { + if ( list==stem || stem->start>list->start+list->width ) + continue; + /* They overlap somehow */ + if ( list->start<=stem->start && list->start+list->width>=stem->start+stem->width ) + HIRemoveFrom(list,stem->where); /* Remove stem's hi's from list's */ + else if ( stem->start<=list->start && stem->start+stem->width>=list->start+list->width ) + HIRemoveFrom(stem,list->where); /* Remove list's hi's from stem's */ + else + /* I should do something here, but I've no idea what. */ + /* Remove the intersection from both? */ + /* Remove from the stem with greater width? */; + } +} +#endif + +void SCGuessHHintInstancesAndAdd(SplineChar *sc, StemInfo *stem, real guess1, real guess2) { + SCGuessHintInstances(sc, stem, 0); + sc->hstem = StemInfoAdd(sc->hstem,stem); + if ( stem->where==NULL && guess1!=0x80000000 ) { + if ( guess1>guess2 ) { real temp = guess1; guess1 = guess2; guess2 = temp; } + stem->where = chunkalloc(sizeof(HintInstance)); + stem->where->begin = guess1; + stem->where->end = guess2; + } + sc->hconflicts = StemListAnyConflicts(sc->hstem); + if ( stem->hasconflicts ) { + /*StemInfoReduceOverlap(sc->hstem,stem);*/ /* User asked for it, assume s/he knows what s/he's doing */ + if ( stem->where==NULL ) + GDrawError("Couldn't figure out where this hint is active"); + } +} + +void SCGuessVHintInstancesAndAdd(SplineChar *sc, StemInfo *stem, real guess1, real guess2) { + SCGuessHintInstances(sc, stem, 1); + sc->vstem = StemInfoAdd(sc->vstem,stem); + if ( stem->where==NULL && guess1!=0x80000000 ) { + if ( guess1>guess2 ) { real temp = guess1; guess1 = guess2; guess2 = temp; } + stem->where = chunkalloc(sizeof(HintInstance)); + stem->where->begin = guess1; + stem->where->end = guess2; + } + sc->vconflicts = StemListAnyConflicts(sc->vstem); + if ( stem->hasconflicts ) { + /*StemInfoReduceOverlap(sc->vstem,stem);*/ /* User asked for it, assume s/he knows what s/he's doing */ + if ( stem->where==NULL ) + GDrawError("Couldn't figure out where this hint is active"); + } +} + +void SCGuessHHintInstancesList(SplineChar *sc) { + StemInfo *h; + int any = false; + + for ( h= sc->hstem; h!=NULL; h=h->next ) + if ( h->where==NULL ) { + SCGuessHintInstances(sc,h,0); + any |= h->where!=NULL; + } +/* + if ( any ) + for ( h= sc->hstem; h!=NULL; h=h->next ) + StemInfoReduceOverlap(h->next,h); +*/ +} + +void SCGuessVHintInstancesList(SplineChar *sc) { + StemInfo *h; + int any = false; + + for ( h= sc->vstem; h!=NULL; h=h->next ) + if ( h->where==NULL ) { + SCGuessHintInstances(sc,h,1); + any |= h->where!=NULL; + } +/* + if ( any ) + for ( h= sc->vstem; h!=NULL; h=h->next ) + StemInfoReduceOverlap(h->next,h); +*/ +} + +static StemInfo *RefHintsMerge(StemInfo *into, StemInfo *rh, real mul, real offset, + real omul, real oofset) { + StemInfo *prev, *h, *n; + real start, width; + + for ( ; rh!=NULL; rh=rh->next ) { + start = rh->start*mul + offset; + width = rh->width *mul; + if ( width<0 ) { + start += width; width = -width; + } + for ( h=into, prev=NULL; h!=NULL && (start>h->start || (start==h->start && width>h->width)); prev=h, h=h->next ); + if ( h==NULL || start!=h->start || width!=h->width ) { + n = chunkalloc(sizeof(StemInfo)); + n->start = start; n->width = width; + n->next = h; + if ( prev==NULL ) + into = n; + else + prev->next = n; + n->where = HICopyTrans(rh->where,omul,oofset); + } else + h->where = HIMerge(h->where,HICopyTrans(rh->where,omul,oofset)); + } +return( into ); +} + +static DStemInfo *RefDHintsMerge(DStemInfo *into, DStemInfo *rh, real xmul, real xoffset, + real ymul, real yoffset) { + DStemInfo *new; + BasePoint temp; + DStemInfo *prev, *n; + + for ( ; rh!=NULL; rh=rh->next ) { + new = chunkalloc(sizeof(DStemInfo)); + *new = *rh; + new->leftedgetop.x = xmul*new->leftedgetop.x + xoffset; + new->rightedgetop.x = xmul*new->rightedgetop.x + xoffset; + new->leftedgebottom.x = xmul*new->leftedgebottom.x + xoffset; + new->rightedgebottom.x = xmul*new->rightedgebottom.x + xoffset; + new->leftedgetop.y = ymul*new->leftedgetop.y + yoffset; + new->rightedgetop.y = ymul*new->rightedgetop.y + yoffset; + new->leftedgebottom.y = ymul*new->leftedgebottom.y + yoffset; + new->rightedgebottom.y = ymul*new->rightedgebottom.y + yoffset; + if ( xmul<0 ) { + temp = new->leftedgetop; + new->leftedgetop = new->rightedgetop; + new->rightedgetop = temp; + temp = new->leftedgebottom; + new->leftedgebottom = new->rightedgebottom; + new->rightedgebottom = temp; + } + if ( ymul<0 ) { + temp = new->leftedgetop; + new->leftedgetop = new->leftedgebottom; + new->leftedgebottom = temp; + temp = new->rightedgetop; + new->rightedgetop = new->rightedgebottom; + new->rightedgebottom = temp; + } + if ( into==NULL || new->leftedgetop.xleftedgetop.x ) { + new->next = into; + into = new; + } else { + for ( prev=into, n=prev->next; n!=NULL && new->leftedgetop.x>n->leftedgetop.x; + prev = n, n = n->next ); + new->next = n; + prev->next = new; + } + } +return( into ); +} + +static void AutoHintRefs(SplineChar *sc,int removeOverlaps) { + RefChar *ref; + + /* Add hints for base characters before accent hints => if there are any */ + /* conflicts, the base characters win */ + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[1]==0 && ref->transform[2]==0 ) { + if ( !ref->sc->manualhints && ref->sc->changedsincelasthinted ) + SplineCharAutoHint(ref->sc,removeOverlaps); + if ( ref->sc->unicodeenc!=-1 && isalnum(ref->sc->unicodeenc) ) { + sc->hstem = RefHintsMerge(sc->hstem,ref->sc->hstem,ref->transform[3], ref->transform[5], ref->transform[0], ref->transform[4]); + sc->vstem = RefHintsMerge(sc->vstem,ref->sc->vstem,ref->transform[0], ref->transform[4], ref->transform[3], ref->transform[5]); + sc->dstem = RefDHintsMerge(sc->dstem,ref->sc->dstem,ref->transform[0], ref->transform[4], ref->transform[3], ref->transform[5]); + } + } + } + + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[1]==0 && ref->transform[2]==0 && + (ref->sc->unicodeenc==-1 || !isalnum(ref->sc->unicodeenc)) ) { + sc->hstem = RefHintsMerge(sc->hstem,ref->sc->hstem,ref->transform[3], ref->transform[5], ref->transform[0], ref->transform[4]); + sc->vstem = RefHintsMerge(sc->vstem,ref->sc->vstem,ref->transform[0], ref->transform[4], ref->transform[3], ref->transform[5]); + sc->dstem = RefDHintsMerge(sc->dstem,ref->sc->dstem,ref->transform[0], ref->transform[4], ref->transform[3], ref->transform[5]); + } + } +} + +void MDAdd(SplineChar *sc, int x, SplinePoint *sp1, SplinePoint *sp2) { + StemInfo *h; + real low, high, temp; + MinimumDistance *md; + int c1, c2, nc1; + + /* Don't add this if there's an md with this info already... */ + /* Also, don't add if there's an md with a stricter requirement (ie which */ + /* is closer */ + for ( md=sc->md; md!=NULL; md = md->next ) { + if ( md->x==x && md->sp2==sp2 ) { + if ( md->sp1==sp1 ) +return; + if ( x ) { + c1 = md->sp1->me.x; nc1 = sp1->me.x; + c2 = sp2==NULL ? sc->width : sp2->me.x; + } else { + c1 = md->sp1->me.y; nc1 = sp1->me.y; + c2 = sp2->me.y; + } + if ( c1>c2 && nc1>c2 ) { + if ( c1 > nc1 ) + md->sp1 = sp1; +return; + } else if ( c1sp1 = sp1; +return; + } + } + if ( md->x==x && md->sp1==sp2 && md->sp2==sp1 ) +return; + } + + /* Don't add this if there's an hstem with this info already... */ + if ( x ) { + low = sp1->me.x; + if ( sp2==NULL ) + high = low; + else + high = sp2->me.x; + h = sc->vstem; + } else { + low = sp1->me.y; + if ( sp2==NULL ) + high = low; + else + high = sp2->me.y; + h = sc->hstem; + } + if ( low>high ) { + temp = low; + low = high; + high = temp; + } + for ( ; h!=NULL && (h->startstart==low && h->start+h->width!=high)); h = h->next ); + if ( h==NULL || h->start!=low || h->start+h->width!=high ) { + md = chunkalloc(sizeof(MinimumDistance)); + md->sp1 = sp1; + md->sp2 = sp2; + md->x = x; + md->next = sc->md; + sc->md = md; + } +} + +#if 0 +static void SCAddWidthMD(SplineChar *sc) { + StemInfo *h; + DStemInfo *dh; + SplineSet *ss; + SplinePoint *sp; + int xmax = 0; + MinimumDistance *md; + + /* find the max of: vertical stems, diagonal stems, md's */ + + if ( sc->vstem==NULL && sc->dstem==NULL && sc->md==NULL ) +return; + + if ( sc->vstem!=NULL ) { + for ( h=sc->vstem; h->next!=NULL; h=h->next ); + xmax = h->width>0?h->start+h->width:h->start; + } + for ( dh = sc->dstem; dh!=NULL; dh=dh->next ) { + if ( dh->rightedgetop.x>xmax ) xmax = dh->rightedgetop.x; + if ( dh->rightedgebottom.x>xmax ) xmax = dh->rightedgebottom.x; + } + for ( md=sc->md; md!=NULL; md=md->next ) { + if ( md->x && md->sp1!=NULL && md->sp1->me.x>xmax ) + xmax = md->sp1->me.x; + if ( md->x && md->sp2!=NULL && md->sp2->me.x>xmax ) + xmax = md->sp2->me.x; + } + if ( xmaxwidth ) { + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next) { + for ( sp=ss->first ; ; ) { + if ( sp->me.x>=xmax-1 && sp->me.xx = true; + md->sp1 = sp; + md->sp2 = NULL; + md->next = sc->md; + sc->md = md; + sp->dontinterpolate = true; +return; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + } + /* Couldn't find a point on the last hint. Oh well, no md */ +} + +/* Look for simple serifs (a vertical stem to the left or right of a hinted */ +/* stem). Serifs will not be hinted because they overlap the main stem. */ +/* To be a serif it must be a vertical stem that doesn't overlap (in y) the */ +/* hinted stem. It must be to the left of the left edge, or to the right of */ +/* the right edge of the hint. */ +/* This is a pretty dumb detector, but it gets simple cases */ +/* */ +/* | | | | */ +/* | | + + */ +/* | | | | */ +/* | | \ \ */ +/* +----+ +-----+ -+---+ -+ */ +/* | + | | */ +/* +-----+ +------+ +-------+ +----+ */ +/* */ +/* Simplest case is just a slab serif, all right angles, no extrenious points */ +/* slighlty more complex, we allow one curved point between the two on the */ +/* vertical (now curved) edge (the remaining two cases can also have */ +/* rounded edges on the bottom */ +/* We can also have a curved segment connecting the slab to the stem */ +/* and the curve may be so long that there is no horizontal edge to the slab */ +/* (I've only shown one orientation, but obviously these can be flipped) */ +static void ptserifcheck(SplineChar *sc,StemInfo *hint, SplinePoint *sp, int xdir) { + int up, right; + SplinePoint *serif0, *serif1, *serif2, *serif3; + int coord= !xdir, other=xdir; + + if ( sp->prev==NULL || sp->next==NULL ) +return; + + serif0 = sp; + if ( (&sp->prev->from->me.x)[coord]==(&sp->me.x)[coord] ) { + up = ((&sp->prev->from->me.x)[other]<(&sp->me.x)[other]); + serif1 = sp->next->to; + if ( serif1->next==NULL ) +return; + serif2 = serif1->next->to; + if ( (&serif1->me.x)[other]!=(&sp->me.x)[other] ) { + if ( up!=((&sp->me.x)[other]<(&serif1->me.x)[other])) +return; + /* should be vertical at sp, and horizontal at serif1 */ + if ( !RealNear(sp->next->splines[coord].c,0) || + !RealNear(3*sp->next->splines[other].a+2*sp->next->splines[other].b+sp->next->splines[other].c,0)) +return; + serif0 = serif1; + serif1 = serif2; + if ( (&serif0->me.x)[other]!=(&serif1->me.x)[other] ) + serif1 = serif0; + else { + if ( serif1->next==NULL ) +return; + serif2 = serif1->next->to; + } + } + if ( serif2->next==NULL ) +return; + serif3 = serif2->next->to; + if ( (&serif1->me.x)[coord]!=(&serif2->me.x)[coord] && (&serif1->me.x)[coord]==(&serif3->me.x)[coord] ) { + /* Allow for one curved point in the serif's "vertical" edge */ + serif2 = serif3; + if ( serif2->next==NULL ) +return; + serif3 = serif2->next->to; + } + } else if ( (&sp->next->to->me.x)[coord]==(&sp->me.x)[coord] ) { + up = (&sp->next->to->me.x)[other]<(&sp->me.x)[other]; + serif1 = sp->prev->from; + if ( serif1->prev==NULL ) +return; + serif2 = serif1->prev->from; + if ( (&serif1->me.x)[other]!=(&sp->me.x)[other] ) { + if ( up!=((&sp->me.x)[other]<(&serif1->me.x)[other])) +return; + /* should be vertical at sp, and horizontal at serif1 */ + if ( !RealNear(3*sp->prev->splines[coord].a+2*sp->prev->splines[coord].b+sp->prev->splines[coord].c,0) || + !RealNear(sp->prev->splines[other].c,0)) +return; + serif0 = serif1; + serif1 = serif2; + if ( (&serif0->me.x)[other]!=(&serif1->me.x)[other] ) + serif1 = serif0; + else { + if ( serif1->prev==NULL ) +return; + serif2 = serif1->prev->from; + } + } + if ( serif2->prev==NULL ) +return; + serif3 = serif2->prev->from; + if ( (&serif1->me.x)[coord]!=(&serif2->me.x)[coord] && (&serif1->me.x)[coord]==(&serif3->me.x)[coord] ) { + /* Allow for one curved point in the serif's "vertical" edge */ + serif2 = serif3; + if ( serif2->prev==NULL ) +return; + serif3 = serif2->prev->from; + } + } else /* no vertical stem here, unlikely to be serifs */ +return; + + right = false; + if ( (&sp->me.x)[coord]>=hint->start-1 && (&sp->me.x)[coord]<=hint->start+1 ) + right = hint->width<0; + else + right = hint->width>0; + + /* must go in the right direction... */ + if (( right && (&serif1->me.x)[coord]<=(&sp->me.x)[coord] ) || + ( !right && (&serif1->me.x)[coord]>=(&sp->me.x)[coord] ) || + ( up && (&serif2->me.x)[other]<(&sp->me.x)[other] ) || + ( !up && (&serif2->me.x)[other]>(&sp->me.x)[other] )) +return; + if ( serif0!=sp ) { + if (( right && (&serif0->me.x)[coord]<=(&sp->me.x)[coord] ) || + ( !right && (&serif0->me.x)[coord]>=(&sp->me.x)[coord] )) +return; + } + /* Must have a vertical edge between serif1 and serif2 */ + if ( (&serif1->me.x)[coord]!=(&serif2->me.x)[coord] ) +return; + /* Must go in the same vertical direction as the stem's edge */ + if ( serif1->next->to!=serif2 && up != (&serif1->next->to->me.x)[other]<(&serif2->me.x)[other] ) +return; + /* Must return back towards the stem */ + if ( right != ( (&serif2->me.x)[coord]>(&serif3->me.x)[coord] )) +return; + + /* Well, It's probably a serif... */ + /* So create a set of minimum distances for it */ + MDAdd(sc,xdir,sp,serif1); + MDAdd(sc,xdir,sp,serif2); + MDAdd(sc,!xdir,serif2,serif0); +} + +/* So. We look for all points that lie on the edges of all vertical stem hint */ +/* and see if there are any serifs protruding from them */ +static void SCSerifCheck(SplineChar *sc,StemInfo *hint, int xdir) { + SplineSet *ss; + SplinePoint *sp; + + for ( ; hint!=NULL ; hint=hint->next ) { + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first ; ; ) { + if ( xdir && ((sp->me.x>=hint->start-1 && sp->me.x<=hint->start+1) || + (sp->me.x>=hint->start+hint->width-1 && sp->me.x<=hint->start+hint->width+2)) ) + ptserifcheck(sc,hint,sp,xdir); + else if (!xdir && ((sp->me.y>=hint->start-1 && sp->me.y<=hint->start+1) || + (sp->me.y>=hint->start+hint->width-1 && sp->me.y<=hint->start+hint->width+2)) ) + ptserifcheck(sc,hint,sp,xdir); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + } +} +#endif + +static void _SCClearHintMasks(SplineChar *sc,int counterstoo) { + SplineSet *spl; + SplinePoint *sp; + RefChar *ref; + + if ( counterstoo ) { + free(sc->countermasks); + sc->countermasks = NULL; sc->countermask_cnt = 0; + } + + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp = spl->first ; ; ) { + chunkfree(sp->hintmask,sizeof(HintMask)); + sp->hintmask = NULL; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + + for ( ref = sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + for ( spl = ref->layers[0].splines; spl!=NULL; spl=spl->next ) { + for ( sp = spl->first ; ; ) { + chunkfree(sp->hintmask,sizeof(HintMask)); + sp->hintmask = NULL; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + } +} + +static void SCFigureSimpleCounterMasks(SplineChar *sc) { + SplineChar *scs[MmMax]; + int hadh3, hadv3, i; + HintMask mask; + + if ( sc->countermask_cnt!=0 ) +return; + + scs[0] = sc; + hadh3 = CvtPsStem3(NULL,scs,1,true,false); + hadv3 = CvtPsStem3(NULL,scs,1,false,false); + if ( hadh3 || hadv3 ) { + memset(mask,0,sizeof(mask)); + if ( hadh3 ) mask[0] = 0x80|0x40|0x20; + if ( hadv3 ) { + for ( i=0; i<3 ; ++i ) { + int j = i+sc->vstem->hintnumber; + mask[j>>3] |= (0x80>>(j&7)); + } + } + sc->countermask_cnt = 1; + sc->countermasks = galloc(sizeof(HintMask)); + memcpy(sc->countermasks[0],mask,sizeof(HintMask)); +return; + } +} + +/* find all the other stems (after main) which seem to form a counter group */ +/* with main. That is their stems have a considerable overlap (in the other */ +/* coordinate) with main */ +static int stemmatches(StemInfo *main) { + StemInfo *last=main, *test; + real mlen, olen; + int cnt; + + cnt = 1; /* for the main stem */ + main->tobeused = true; + mlen = HIlen(main); + for ( test=main->next; test!=NULL; test=test->next ) + test->tobeused = false; + for ( test=main->next; test!=NULL; test=test->next ) { + if ( test->used || last->start+last->width>test->start || test->hintnumber==-1 ) + continue; + olen = HIoverlap(main->where,test->where); + if ( olen>mlen/3 && olen>HIlen(test)/3 ) { + test->tobeused = true; + ++cnt; + } + } +return( cnt ); +} + +static int FigureCounters(StemInfo *stems,HintMask mask ) { + StemInfo *h, *first; + + while ( stems!=NULL ) { + for ( first=stems; first!=NULL && first->used; first = first->next ); + if ( first==NULL ) + break; + if ( first->where==NULL || first->hintnumber==-1 || stemmatches(first)<=2 ) { + first->used = true; + stems = first->next; + continue; + } + for ( h = first; h!=NULL; h = h->next ) { + if ( h->tobeused ) { + mask[h->hintnumber>>3] |= (0x80>>(h->hintnumber&7)); + h->used = true; + } + } +return( true ); + } +return( false ); +} + +void SCFigureCounterMasks(SplineChar *sc) { + HintMask masks[30]; + uint32 script; + StemInfo *h; + int mc=0, i; + + /* I'm not supporting counter hints for mm fonts */ + + if ( sc==NULL ) +return; + + free(sc->countermasks); + sc->countermask_cnt = 0; + sc->countermasks = NULL; + + /* Check for h/vstem3 case */ + /* Which is allowed even for non-CJK letters */ + script = SCScriptFromUnicode(sc); + if ( script==CHR('l','a','t','n') || script==CHR('c','y','r','l') || + script==CHR('g','r','e','k') ) { + SCFigureSimpleCounterMasks(sc); +return; + } + + for ( h=sc->hstem; h!=NULL ; h=h->next ) + h->used = false; + for ( h=sc->vstem; h!=NULL ; h=h->next ) + h->used = false; + + mc = 0; + + while ( mchstem,masks[mc]) && !FigureCounters(sc->vstem,masks[mc])) + break; + ++mc; + } + if ( mc!=0 ) { + sc->countermask_cnt = mc; + sc->countermasks = galloc(mc*sizeof(HintMask)); + for ( i=0; icountermasks[i],masks[i],sizeof(HintMask)); + } +} + +void SCClearHintMasks(SplineChar *sc,int counterstoo) { + MMSet *mm = sc->parent->mm; + int i; + + if ( mm==NULL ) + _SCClearHintMasks(sc,counterstoo); + else { + for ( i=0; iinstance_count; ++i ) { + if ( sc->encinstances[i]->charcnt ) + _SCClearHintMasks(mm->instances[i]->chars[sc->enc],counterstoo); + } + if ( sc->encnormal->charcnt ) + _SCClearHintMasks(mm->normal->chars[sc->enc],counterstoo); + } +} + +static StemInfo *OnHHint(SplinePoint *sp, StemInfo *s) { + StemInfo *possible=NULL; + HintInstance *hi; + + if ( sp==NULL ) +return( NULL ); + + for ( ; s!=NULL; s=s->next ) { + if ( sp->me.ystart ) +return( possible ); + if ( s->start==sp->me.y || s->start+s->width==sp->me.y ) { + if ( !s->hasconflicts ) +return( s ); + for ( hi=s->where; hi!=NULL; hi=hi->next ) { + if ( hi->begin<=sp->me.x && hi->end>=sp->me.x ) +return( s ); + } + if ( !s->used ) + possible = s; + } + } +return( possible ); +} + +static StemInfo *OnVHint(SplinePoint *sp, StemInfo *s) { + StemInfo *possible=NULL; + HintInstance *hi; + + if ( sp==NULL ) +return( NULL ); + + for ( ; s!=NULL; s=s->next ) { + if ( sp->me.xstart ) +return( possible ); + if ( s->start==sp->me.x || s->start+s->width==sp->me.x ) { + if ( !s->hasconflicts ) +return( s ); + for ( hi=s->where; hi!=NULL; hi=hi->next ) { + if ( hi->begin<=sp->me.y && hi->end>=sp->me.y ) +return( s ); + } + if ( !s->used ) + possible = s; + } + } +return( possible ); +} + +/* Does h have a conflict with any of the stems in the list which have bits */ +/* set in the mask */ +static int ConflictsWithMask(StemInfo *stems, HintMask mask,StemInfo *h) { + while ( stems!=NULL && stems->startstart+h->width ) { + if ( stems->start+stems->width>=h->start && stems!=h ) { + if ( stems->hintnumber!=-1 && + (mask[stems->hintnumber>>3]&(0x80>>(stems->hintnumber&7))) ) +return( true ); + } + stems = stems->next; + } +return( false ); +} + +/* All instances of a MM set must have the same hint mask at all points */ +static void FigureHintMask(SplineChar *scs[MmMax], SplinePoint *to[MmMax], int instance_count, + HintMask mask) { + StemInfo *s; + int i; + SplinePoint *sp; + + memset(mask,'\0',sizeof(HintMask)); + + /* Install all hints that are always active */ + i=0; { + SplineChar *sc = scs[i]; + + if ( sc==NULL ) +return; + + for ( s=sc->hstem; s!=NULL; s=s->next ) + if ( s->hintnumber!=-1 && !s->hasconflicts ) + mask[s->hintnumber>>3] |= (0x80>>(s->hintnumber&7)); + for ( s=sc->vstem; s!=NULL; s=s->next ) + if ( s->hintnumber!=-1 && !s->hasconflicts ) + mask[s->hintnumber>>3] |= (0x80>>(s->hintnumber&7)); + + if ( sc->hconflicts ) { + for ( sp=to[i]; sp!=NULL; ) { + s = OnHHint(sp,sc->hstem); + if ( s!=NULL && s->hintnumber!=-1 ) { + if ( ConflictsWithMask(scs[i]->hstem,mask,s)) + break; + mask[s->hintnumber>>3] |= (0x80>>(s->hintnumber&7)); + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( to[i]==sp ) + break; + } + } + if ( sc->vconflicts ) { + for ( sp=to[i]; sp!=NULL; ) { + s = OnVHint(sp,sc->vstem); + if ( s!=NULL && s->hintnumber!=-1 ) { + if ( ConflictsWithMask(scs[i]->vstem,mask,s)) + break; + mask[s->hintnumber>>3] |= (0x80>>(s->hintnumber&7)); + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( to[i]==sp ) + break; + } + } + } + for ( i=0; ihintmask = chunkalloc(sizeof(HintMask)); + memcpy(to[i]->hintmask,mask,sizeof(HintMask)); + } +} + +static int TestHintMask(SplineChar *scs[MmMax], SplinePoint *to[MmMax], int instance_count, + HintMask mask) { + StemInfo *h=NULL, *v=NULL; + int i; + + for ( i=0; ihconflicts && !sc->vconflicts )) + continue; + + /* Does this point lie on any hints? */ + if ( scs[i]->hconflicts ) + h = OnHHint(to[i],sc->hstem); + if ( scs[i]->vconflicts ) + v = OnVHint(to[i],sc->vstem); + + /* Need to set this hint */ + if ( (h!=NULL && h->hintnumber!=-1 && (mask[h->hintnumber>>3]&(0x80>>(h->hintnumber&7)))==0 ) || + (v!=NULL && v->hintnumber!=-1 && (mask[v->hintnumber>>3]&(0x80>>(v->hintnumber&7)))==0 )) + break; + } + if ( i==instance_count ) /* All hint masks were ok */ +return( false ); + + FigureHintMask(scs,to,instance_count,mask); +return( true ); +} + +static void UnnumberHints(SplineChar *sc) { + StemInfo *h; + + for ( h=sc->hstem; h!=NULL; h=h->next ) + h->hintnumber = -1; + for ( h=sc->vstem; h!=NULL; h=h->next ) + h->hintnumber = -1; +} + +static int NumberHints(SplineChar *sc) { + StemInfo *h; + int hcnt=0; + + for ( h=sc->hstem; h!=NULL; h=h->next ) + h->hintnumber = hcnt>=HntMax ? -1 : hcnt++; + for ( h=sc->vstem; h!=NULL; h=h->next ) + h->hintnumber = hcnt>=HntMax ? -1 : hcnt++; +return( hcnt ); +} + +static void UntickHints(SplineChar *sc) { + StemInfo *h; + + for ( h=sc->hstem; h!=NULL; h=h->next ) + h->used = false; + for ( h=sc->vstem; h!=NULL; h=h->next ) + h->used = false; +} + +struct coords { + real coords[MmMax]; + struct coords *next; +}; + +typedef struct mmh { + StemInfo *hints[MmMax], *map[MmMax]; + struct coords *where; + struct mmh *next; +} MMH; + +static void AddCoord(MMH *mmh,SplinePoint *sps[MmMax],int instance_count, int ish) { + struct coords *coords; + int i; + + coords = chunkalloc(sizeof(struct coords)); + coords->next = mmh->where; + mmh->where = coords; + if ( ish ) + for ( i=0; icoords[i] = sps[i]->me.x; + else + for ( i=0; icoords[i] = sps[i]->me.y; +} + +static MMH *AddHintSet(MMH *hints,StemInfo *h[MmMax], int instance_count, + SplinePoint *sps[MmMax], int ish) { + int i, cnt, bestc; + MMH *test, *best; + + for ( i=0; inext ) { + cnt = 0; + for ( i=0; ihints[i]==h[i] ) + ++cnt; + if ( cnt==instance_count ) { + AddCoord(test,sps,instance_count,ish); +return( hints ); + } + if ( cnt>bestc ) { + bestc = cnt; + best = test; + } + } + test = chunkalloc(sizeof(MMH)); + test->next = hints; + AddCoord(test,sps,instance_count,ish); + for ( i=0; ihints[i]=h[i]; + if ( bestc!=0 ) { + for ( i=0; ihints[i]==h[i] ) { + h[i]->hasconflicts = true; + test->map[i] = chunkalloc(sizeof(StemInfo)); + *test->map[i] = *h[i]; + test->map[i]->where = NULL; + test->map[i]->used = true; + h[i]->next = test->map[i]; + } else + test->map[i] = h[i]; + } + } else { + for ( i=0; imap[i]=h[i]; + } +return( test ); +} + +static int CompareMMH(MMH *mmh1,MMH *mmh2, int instance_count) { + int i; + + if ( mmh1->map[0]==NULL ) +return( 1 ); + if ( mmh2->map[0]==NULL ) +return( -1 ); + + for ( i=0; imap[i]->start!=mmh2->map[i]->start ) { + if ( mmh1->map[i]->start > mmh2->map[i]->start ) +return( 1 ); + else +return( -1 ); + } + } + for ( i=0; imap[i]->width!=mmh2->map[i]->width ) { + if ( mmh1->map[i]->width > mmh2->map[i]->width ) +return( 1 ); + else +return( -1 ); + } + } +return( 0 ); +} + +static MMH *SortMMH(MMH *head,int instance_count) { + MMH *mmh, *p, *smallest, *psmallest, *test, *ptest; + + for ( mmh = head, p=NULL; mmh!=NULL ; ) { + smallest = mmh; psmallest = p; + ptest = mmh; test = mmh->next; + while ( test!=NULL ) { + if ( CompareMMH(test,smallest,instance_count)<0 ) { + smallest = test; + psmallest = ptest; + } + ptest = test; + test = test->next; + } + if ( smallest!=mmh ) { + if ( p==NULL ) + head = smallest; + else + p->next = smallest; + if ( mmh->next==smallest ) { + mmh->next = smallest->next; + smallest->next = mmh; + } else { + test = mmh->next; + mmh->next = smallest->next; + smallest->next = test; + psmallest->next = mmh; + } + } + p = smallest; + mmh = smallest->next; + } +return( head ); +} + +static int NumberMMH(MMH *mmh,int hstart,int instance_count) { + int i; + HintInstance *hi, *n; + struct coords *coords; + + while ( mmh!=NULL ) { + for ( i=0; imap[i]; + if ( h==NULL ) + continue; + + h->hintnumber = hstart; + + for ( hi=h->where; hi!=NULL; hi=n ) { + n = hi->next; + chunkfree(hi,sizeof(HintInstance)); + } + h->where = NULL; + for ( coords=mmh->where; coords!=NULL; coords = coords->next ) { + hi = chunkalloc(sizeof(HintInstance)); + hi->next = h->where; + h->where = hi; + hi->begin = coords->coords[i]-1; + hi->end = coords->coords[i]+1; + } + } + if ( mmh->map[0]!=NULL ) ++hstart; + mmh = mmh->next; + } +return( hstart ); +} + +static void SortMMH2(SplineChar *scs[MmMax],MMH *mmh,int instance_count,int ish) { + int i; + StemInfo *h, *n; + MMH *m; + + for ( i=0; ihstem : scs[i]->vstem; h!=NULL; h=n ) { + n = h->next; + if ( h->hintnumber==-1 ) + StemInfoFree(h); + } + n = NULL; + for ( m = mmh ; m!=NULL; m=m->next ) { + h = m->map[i]; + if ( n!=NULL ) + n->next = h; + else if ( ish ) + scs[i]->hstem = h; + else + scs[i]->vstem = h; + n = h; + } + if ( n!=NULL ) + n->next = NULL; + else if ( ish ) + scs[i]->hstem = NULL; + else + scs[i]->vstem = NULL; + } +} + +static void MMHFreeList(MMH *mmh) { + MMH *mn; + struct coords *c, *n; + + for ( ; mmh!=NULL; mmh = mn ) { + mn = mmh->next; + for ( c=mmh->where; c!=NULL; c=n ) { + n = c->next; + chunkfree(c,sizeof(struct coords)); + } + chunkfree(mmh,sizeof(struct coords)); + } +} + +static void SplResolveSplitHints(SplineChar *scs[MmMax], SplineSet *spl[MmMax], + int instance_count, MMH **hs, MMH **vs) { + SplinePoint *to[MmMax]; + StemInfo *h[MmMax], *v[MmMax]; + int i, anymore; + + forever { + for ( i=0; ifirst; + else + to[i] = NULL; + } + forever { + for ( i=0; ihstem); + v[i] = OnVHint(to[i],scs[i]->vstem); + } + *hs = AddHintSet(*hs,h,instance_count,to,true); + *vs = AddHintSet(*vs,v,instance_count,to,false); + anymore = false; + for ( i=0; inext==NULL ) to[i] = NULL; + else { + to[i] = to[i]->next->to; + if ( to[i]==spl[i]->first ) to[i] = NULL; + } + if ( to[i]!=NULL ) anymore = true; + } + if ( !anymore ) + break; + } + anymore = false; + for ( i=0; inext; + if ( spl[i]!=NULL ) anymore = true; + } + if ( !anymore ) + break; + } +} + +static void ResolveSplitHints(SplineChar *scs[16],int instance_count) { + /* It is possible for a single hint in one mm instance to split into two */ + /* in a different MM set. For example, we have two stems which happen */ + /* to line up in one instance but which do not in another instance. */ + /* It is even possible that there could be no instance with any conflicts */ + /* but some of the intermediate forms might conflict. */ + /* We can't deal (nor can postscript) with the case where hints change order*/ + SplinePointList *spl[MmMax]; + RefChar *ref[MmMax]; + int i, hcnt, hmax=0, anymore; + MMH *hs=NULL, *vs=NULL; + + for ( i=0; ihmax ) hmax = hcnt; + spl[i] = scs[i]->layers[ly_fore].splines; + } + if ( hmax==0 ) +return; + + SplResolveSplitHints(scs,spl,instance_count,&hs,&vs); + anymore = false; + for ( i=0; ilayers[ly_fore].refs; + if ( ref[i]!=NULL ) anymore = true; + } + while ( anymore ) { + for ( i=0; ilayers[0].splines : NULL; + SplResolveSplitHints(scs,spl,instance_count,&hs,&vs); + anymore = false; + for ( i=0; inext; + if ( ref[i]!=NULL ) anymore = true; + } + } + } + + for ( i=0; ifirst; + anymore = true; + } else + to[i] = NULL; + } + + /* Assign the initial hint mask */ + if ( anymore && !inited ) { + FigureHintMask(scs,to,instance_count,mask); + inited = true; + } + + forever { + for ( i=0; ifirst; + else + to[i] = NULL; + } + forever { + TestHintMask(scs,to,instance_count,mask); + anymore = false; + for ( i=0; inext==NULL ) to[i] = NULL; + else { + to[i] = to[i]->next->to; + if ( to[i]==spl[i]->first ) to[i] = NULL; + } + if ( to[i]!=NULL ) anymore = true; + } + if ( !anymore ) + break; + } + anymore = false; + for ( i=0; inext; + } + if ( spl[i]!=NULL ) anymore = true; + } + if ( !anymore ) + break; + } +return( inited ); +} + +void SCFigureHintMasks(SplineChar *sc) { + SplineChar *scs[MmMax]; + SplinePointList *spl[MmMax]; + RefChar *ref[MmMax]; + MMSet *mm = sc->parent->mm; + int i, instance_count, conflicts, anymore, inited; + HintMask mask; + + if ( mm==NULL ) { + scs[0] = sc; + instance_count = 1; + SCClearHintMasks(sc,false); + } else { + instance_count = mm->instance_count; + for ( i=0; ienc < mm->instances[i]->charcnt ) { + scs[i] = mm->instances[i]->chars[sc->enc]; + SCClearHintMasks(scs[i],false); + } + ResolveSplitHints(scs,instance_count); + } + conflicts = false; + for ( i=0; ihconflicts || scs[i]->vconflicts ) + conflicts = true; + } + if ( !conflicts && instance_count==1 ) { /* All hints always active */ + SCFigureSimpleCounterMasks(sc); +return; /* In an MM font we may still need to resolve things like different numbers of hints */ + } + + for ( i=0; ilayers[ly_fore].splines; + ref[i] = scs[i]->layers[ly_fore].refs; + } + inited = SplFigureHintMasks(scs,spl,instance_count,mask,false); + forever { + for ( i=0; ilayers[0].splines; + } + inited = SplFigureHintMasks(scs,spl,instance_count,mask,inited); + anymore = false; + for ( i=0; inext; + if ( ref[i]!=NULL ) anymore = true; + } + } + if ( !anymore ) + break; + } + if ( instance_count==1 ) + SCFigureSimpleCounterMasks(sc); +} + +static void _SplineCharAutoHint( SplineChar *sc, int removeOverlaps ) { + EIList el; + + StemInfosFree(sc->vstem); sc->vstem=NULL; + StemInfosFree(sc->hstem); sc->hstem=NULL; + DStemInfosFree(sc->dstem); sc->dstem=NULL; + MinimumDistancesFree(sc->md); sc->md=NULL; + + free(sc->countermasks); + sc->countermasks = NULL; sc->countermask_cnt = 0; + /* We'll free the hintmasks when we call SCFigureHintMasks */ + + memset(&el,'\0',sizeof(el)); + ELFindEdges(sc, &el); + + sc->changedsincelasthinted = false; + sc->manualhints = false; + + sc->vstem = SCFindStems(&el,1,removeOverlaps,&sc->dstem,&sc->md); + sc->hstem = SCFindStems(&el,0,removeOverlaps,NULL,NULL); +#if 0 + SCSerifCheck(sc,sc->vstem,1); + SCSerifCheck(sc,sc->hstem,0); + SCAddWidthMD(sc); +#endif + AutoHintRefs(sc,removeOverlaps); + sc->vconflicts = StemListAnyConflicts(sc->vstem); + sc->hconflicts = StemListAnyConflicts(sc->hstem); + + ElFreeEI(&el); + SCOutOfDateBackground(sc); + sc->parent->changed = true; +} + +void SplineCharAutoHint( SplineChar *sc, int removeOverlaps ) { + MMSet *mm = sc->parent->mm; + int i; + + if ( mm==NULL ) + _SplineCharAutoHint(sc,removeOverlaps); + else { + for ( i=0; iinstance_count; ++i ) + if ( sc->enc < mm->instances[i]->charcnt ) + _SplineCharAutoHint(mm->instances[i]->chars[sc->enc],removeOverlaps); + if ( sc->enc < mm->normal->charcnt ) + _SplineCharAutoHint(mm->normal->chars[sc->enc],removeOverlaps); + } + SCFigureHintMasks(sc); + SCUpdateAll(sc); +} + +int SFNeedsAutoHint( SplineFont *_sf) { + int i,k; + SplineFont *sf; + + k=0; + do { + sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]->changedsincelasthinted && + !sf->chars[i]->manualhints ) +return( true ); + } + ++k; + } while ( k<_sf->subfontcnt ); +return( false ); +} + +void SplineFontAutoHint( SplineFont *_sf) { + int i,k; + SplineFont *sf; + + k=0; + do { + sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]->changedsincelasthinted && + !sf->chars[i]->manualhints ) + SplineCharAutoHint(sf->chars[i],true); + if ( !GProgressNext()) { + k = _sf->subfontcnt+1; + break; + } + } + ++k; + } while ( k<_sf->subfontcnt ); +} + +static void FigureStems( SplineFont *sf, real snaps[12], real cnts[12], + int which ) { + int i, j, k, cnt, smax=0, smin=2000; + real stemwidths[2000]; + StemInfo *stems, *test; + int len; + HintInstance *hi; + + memset(stemwidths,'\0',sizeof(stemwidths)); + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + stems = which?sf->chars[i]->hstem:sf->chars[i]->vstem; + for ( test=stems; test!=NULL; test = test->next ) if ( !test->ghost ) { + if ( (j=test->width)<0 ) j= -j; + if ( j<2000 ) { + len = 0; + for ( hi=test->where; hi!=NULL; hi=hi->next ) + len += hi->end-hi->begin; + if ( len==0 ) len = 100; + stemwidths[j] += len; + if ( smaxj ) smin=j; + } + } + } + + for ( i=smin, cnt=0; i<=smax; ++i ) { + if ( stemwidths[i]!=0 ) + ++cnt; + } + + if ( cnt>12 ) { + /* Merge width windows */ + int windsize=3, j; + for ( i=smin; i<=smax; ++i ) if ( stemwidths[i]!=0 ) { + if ( (j = i-windsize)<0 ) j=0; + for ( ; ji+windsize ) { + if ( (j = i-windsize)<0 ) j=0; + for ( ; jstemwidths[i+1] ) { + stemwidths[i] += stemwidths[i+1]; + stemwidths[i+1] = 0; + } else { + if ( i<=smax-2 && stemwidths[i+2] && stemwidths[i+2]biggest ) { biggest = stemwidths[i]; biggesti=i; } + } + /* array must be sorted */ + if ( biggestbiggesti ) + break; + for ( k=cnt-1; k>=j; --k ) { + snaps[k+1] = snaps[k]; + cnts[k+1]=cnts[k]; + } + snaps[j] = biggesti; + cnts[j] = biggest; + stemwidths[biggesti] = 0; + if ( firstbiggest==0 ) firstbiggest = biggest; + } + } + for ( ; cnt<12; ++cnt ) { + snaps[cnt] = 0; + cnts[cnt] = 0; + } +} + +void FindHStems( SplineFont *sf, real snaps[12], real cnt[12]) { + FigureStems(sf,snaps,cnt,1); +} + +void FindVStems( SplineFont *sf, real snaps[12], real cnt[12]) { + FigureStems(sf,snaps,cnt,0); +} + +static int _SplineCharIsFlexible(SplineChar *sc, int blueshift) { + /* Need two splines + outer endpoints have same x (or y) values + inner point must be less than 20 horizontal (v) units from the outer points + inner point must also be less than BlueShift units (defaults to 7=>6) + (can increase BlueShift up to 21) + the inner point must be a local extremum + (something incomprehensible is written about the control points) + perhaps that they should have the same x(y) value as the center + */ + SplineSet *spl; + SplinePoint *sp, *np, *pp; + int max=0, val; + + if ( sc==NULL ) +return(false); + + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + if ( spl->first->prev==NULL ) { + /* Mark everything on the open path as inflexible */ + sp=spl->first; + while ( 1 ) { + sp->flexx = sp->flexy = false; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } + continue; /* Ignore open paths */ + } + sp=spl->first; + do { + if ( sp->next==NULL || sp->prev==NULL ) + break; + np = sp->next->to; + pp = sp->prev->from; + if ( !pp->flexx && !pp->flexy ) { + sp->flexy = sp->flexx = 0; + val = 0; + if ( RealNear(sp->nextcp.x,sp->me.x) && + RealNear(sp->prevcp.x,sp->me.x) && + RealNear(np->me.x,pp->me.x) && + !RealNear(np->me.x,sp->me.x) && + np->me.x-sp->me.x < blueshift && + np->me.x-sp->me.x > -blueshift ) { + if ( (np->me.x>sp->me.x && + np->prevcp.x<=np->me.x && np->prevcp.x>=sp->me.x && + pp->nextcp.x<=pp->me.x && pp->prevcp.x>=sp->me.x ) || + (np->me.xme.x && + np->prevcp.x>=np->me.x && np->prevcp.x<=sp->me.x && + pp->nextcp.x>=pp->me.x && pp->prevcp.x<=sp->me.x )) { + sp->flexx = true; + val = np->me.x-sp->me.x; + } + } + if ( RealNear(sp->nextcp.y,sp->me.y) && + RealNear(sp->prevcp.y,sp->me.y) && + RealNear(np->me.y,pp->me.y) && + !RealNear(np->me.y,sp->me.y) && + np->me.y-sp->me.y < blueshift && + np->me.y-sp->me.y > -blueshift ) { + if ( (np->me.y>sp->me.y && + np->prevcp.y<=np->me.y && np->prevcp.y>=sp->me.y && + pp->nextcp.y<=pp->me.y && pp->nextcp.y>=sp->me.y ) || + (np->me.yme.y && + np->prevcp.y>=np->me.y && np->prevcp.y<=sp->me.y && + pp->nextcp.y>=pp->me.y && pp->nextcp.y<=sp->me.y )) { + sp->flexy = true; + val = np->me.y-sp->me.y; + } + } + if ( val<0 ) val = -val; + if ( val>max ) max = val; + } + sp = np; + } while ( sp!=spl->first ); + } + sc->anyflexes = max>0; +return( max ); +} + +static int MatchFlexes(MMSet *mm,int enc) { + int any=false, i; + SplineSet *spl[16]; + SplinePoint *sp[16]; + int mismatchx, mismatchy; + + for ( i=0; iinstance_count; ++i ) + if ( encinstances[i]->charcnt && mm->instances[i]->chars[enc]!=NULL ) + spl[i] = mm->instances[i]->chars[enc]->layers[ly_fore].splines; + else + spl[i] = NULL; + while ( spl[0]!=NULL ) { + for ( i=0; iinstance_count; ++i ) + if ( spl[i]!=NULL ) + sp[i] = spl[i]->first; + else + sp[i] = NULL; + while ( sp[0]!=NULL ) { + mismatchx = mismatchy = false; + for ( i=1 ; iinstance_count; ++i ) { + if ( sp[i]==NULL ) + mismatchx = mismatchy = true; + else { + if ( sp[i]->flexx != sp[0]->flexx ) + mismatchx = true; + if ( sp[i]->flexy != sp[0]->flexy ) + mismatchy = true; + } + } + if ( mismatchx || mismatchy ) { + for ( i=0 ; iinstance_count; ++i ) if ( sp[i]!=NULL ) { + if ( mismatchx ) sp[i]->flexx = false; + if ( mismatchy ) sp[i]->flexy = false; + } + } + if ( sp[0]->flexx || sp[0]->flexy ) + any = true; + for ( i=0 ; iinstance_count; ++i ) if ( sp[i]!=NULL ) { + if ( sp[i]->next==NULL ) sp[i] = NULL; + else sp[i] = sp[i]->next->to; + } + if ( sp[0] == spl[0]->first ) + break; + } + for ( i=0; iinstance_count; ++i ) + if ( spl[i]!=NULL ) + spl[i] = spl[i]->next; + } +return( any ); +} + +int SplineCharIsFlexible(SplineChar *sc) { + char *pt; + int blueshift; + int i; + MMSet *mm; + + pt = PSDictHasEntry(sc->parent->private,"BlueShift"); + blueshift = 7; /* use default value here */ + if ( pt!=NULL ) { + blueshift = strtol(pt,NULL,10); + if ( blueshift>21 ) blueshift = 21; + } else if ( PSDictHasEntry(sc->parent->private,"BlueValues")!=NULL ) + blueshift = 7; + if ( sc->parent->mm==NULL ) +return( _SplineCharIsFlexible(sc,blueshift)); + + mm = sc->parent->mm; + for ( i = 0; iinstance_count; ++i ) + if ( sc->encinstances[i]->charcnt && mm->instances[i]->chars[sc->enc]!=NULL ) + _SplineCharIsFlexible(mm->instances[i]->chars[sc->enc],blueshift); +return( MatchFlexes(mm,sc->enc)); +} + +static void SCUnflex(SplineChar *sc) { + SplineSet *spl; + SplinePoint *sp; + + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + /* Mark everything on the path as inflexible */ + sp=spl->first; + while ( 1 ) { + sp->flexx = sp->flexy = false; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + sc->anyflexes = false; +} + +int SplineFontIsFlexible(SplineFont *sf,int flags) { + int i; + int max=0, val; + char *pt; + int blueshift; + /* if the return value is bigger than 6 and we don't have a BlueShift */ + /* then we must set BlueShift to ret+1 before saving private dictionary */ + /* If the first point in a spline set is flexible, then we must rotate */ + /* the splineset */ + + if ( flags&(ps_flag_nohints|ps_flag_noflex)) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + SCUnflex(sf->chars[i]); +return( 0 ); + } + + pt = PSDictHasEntry(sf->private,"BlueShift"); + blueshift = 21; /* maximum posible flex, not default */ + if ( pt!=NULL ) { + blueshift = strtol(pt,NULL,10); + if ( blueshift>21 ) blueshift = 21; + } else if ( PSDictHasEntry(sf->private,"BlueValues")!=NULL ) + blueshift = 7; /* The BlueValues array may depend on BlueShift having its default value */ + + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL ) { + val = _SplineCharIsFlexible(sf->chars[i],blueshift); + if ( val>max ) max = val; + } +return( max ); +} diff --git a/fontforge/autosave.c b/fontforge/autosave.c new file mode 100644 index 00000000..f076c395 --- /dev/null +++ b/fontforge/autosave.c @@ -0,0 +1,172 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "ustring.h" +#include +#include +#include +#include +#include +#include +#include +#include + +static char *gethomedir(void) { + static char *dir=NULL; + int uid; + struct passwd *pw; + + if ( dir!=NULL ) +return( dir ); + + if ( (dir=getenv("HOME"))!=NULL ) +return( (dir=copy(dir)) ); + + uid = getuid(); + while ( (pw=getpwent())!=NULL ) { + if ( pw->pw_uid==uid ) { + dir = copy(pw->pw_dir); + endpwent(); +return( dir ); + } + } + endpwent(); +return( NULL ); +} + +char *getPfaEditDir(char *buffer) { + static char *dir=NULL; + + if ( dir!=NULL ) +return( dir ); + if ( gethomedir()==NULL ) +return( NULL ); + sprintf(buffer,"%s/.PfaEdit", gethomedir()); + if ( access(buffer,F_OK)==-1 ) + if ( mkdir(buffer,0700)==-1 ) +return( NULL ); + dir = copy(buffer); +return( dir ); +} + +static char *getAutoDirName(char *buffer) { + static char *dir=NULL; + + if ( dir!=NULL ) +return( dir ); + if ( getPfaEditDir(buffer)==NULL ) +return( NULL ); + sprintf(buffer,"%s/autosave", getPfaEditDir(buffer)); + if ( access(buffer,F_OK)==-1 ) + if ( mkdir(buffer,0700)==-1 ) +return( NULL ); + dir = copy(buffer); +return( dir ); +} + +static void MakeAutoSaveName(SplineFont *sf) { + char buffer[1025]; + char *autosavedir = getAutoDirName(buffer); + static int cnt=0; + + if ( sf->autosavename ) +return; + if ( autosavedir==NULL ) +return; + while ( 1 ) { + sprintf( buffer, "%s/auto%06x-%d.asfd", autosavedir, getpid(), ++cnt ); + if ( access(buffer,F_OK)==-1 ) { + sf->autosavename = copy(buffer); +return; + } + } +} + +int DoAutoRecovery(void) { + char buffer[1025]; + char *recoverdir = getAutoDirName(buffer); + DIR *dir; + struct dirent *entry; + int any = false; + SplineFont *sf; + + if ( recoverdir==NULL ) +return( false ); + if ( (dir = opendir(recoverdir))==NULL ) +return( false ); + while ( (entry=readdir(dir))!=NULL ) { + if ( strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0 ) + continue; + sprintf(buffer,"%s/%s",recoverdir,entry->d_name); + fprintf( stderr, "Recovering from %s... ", buffer); + if ( (sf = SFRecoverFile(buffer)) ) { + any=true; + if ( sf->fv==NULL ) /* Doesn't work, cli arguments not parsed yet */ + FontViewCreate(sf); + } + fprintf( stderr, " Done\n" ); + } + closedir(dir); +return( any ); +} + +void CleanAutoRecovery(void) { + char buffer[1025]; + char *recoverdir = getAutoDirName(buffer); + DIR *dir; + struct dirent *entry; + + if ( recoverdir==NULL ) +return; + if ( (dir = opendir(recoverdir))==NULL ) +return; + while ( (entry=readdir(dir))!=NULL ) { + if ( strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0 ) + continue; + sprintf(buffer,"%s/%s",recoverdir,entry->d_name); + if ( unlink(buffer)!=0 ) { + fprintf( stderr, "Failed to clean " ); + perror(buffer); + } + } + closedir(dir); +} + +void DoAutoSaves(void) { + FontView *fv; + SplineFont *sf; + + for ( fv=fv_list; fv!=NULL; fv=fv->next ) { + sf = fv->cidmaster?fv->cidmaster:fv->sf; + if ( sf->changed_since_autosave ) { + if ( sf->autosavename==NULL ) + MakeAutoSaveName(sf); + if ( sf->autosavename!=NULL ) + SFAutoSave(sf); + } + } +} diff --git a/fontforge/autotrace.c b/fontforge/autotrace.c new file mode 100644 index 00000000..794f6c6e --- /dev/null +++ b/fontforge/autotrace.c @@ -0,0 +1,724 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include "sd.h" +#include "views.h" + +#include /* for waitpid */ +#include /* for waitpid */ +#include /* for access, unlink, fork, execvp, getcwd */ +#include /* for open */ +#include /* for open */ +#include /* for getenv */ +#include /* for errors */ +#include /* for opendir,etc. */ + +int preferpotrace = false; + +/* Interface to Martin Weber's autotrace program */ +/* http://homepages.go.com/~martweb/AutoTrace.htm */ +/* Oops, now at http://sourceforge.net/projects/autotrace/ */ + +/* Also interface to Peter Selinger's potrace program (which does the same thing */ +/* and has a cleaner interface) */ +/* http://potrace.sf.net/ */ + + +static SplinePointList *localSplinesFromEntities(Entity *ent, Color bgcol, int ispotrace) { + Entity *enext; + SplinePointList *head=NULL, *last, *test, *next, *prev, *new, *nlast, *temp; + int clockwise; + SplineChar sc; + StrokeInfo si; + DBounds bb, sbb; + int removed; + real fudge; + /* We have a problem. The autotrace program includes contours for the */ + /* background color (there's supposed to be a way to turn that off, but */ + /* it didn't work when I tried it, so...). I don't want them, so get */ + /* rid of them. But we must be a bit tricky. If the contour specifies a */ + /* counter within the letter (the hole in the O for instance) then we */ + /* do want the contour, but we want it to be counterclockwise. */ + /* So first turn all background contours counterclockwise, and flatten */ + /* the list */ + /* potrace does not have this problem */ + /* But potrace does not close its paths (well, it closes the last one) */ + /* and as with standard postscript fonts I need to reverse the splines */ + int bgr = COLOR_RED(bgcol), bgg = COLOR_GREEN(bgcol), bgb = COLOR_BLUE(bgcol); + + memset(&sc,'\0',sizeof(sc)); + for ( ; ent!=NULL; ent = enext ) { + enext = ent->next; + if ( ent->type == et_splines ) { + if ( /* ent->u.splines.fill.col==0xffffffff && */ ent->u.splines.stroke.col!=0xffffffff ) { + memset(&si,'\0',sizeof(si)); + si.join = ent->u.splines.join; + si.cap = ent->u.splines.cap; + si.radius = ent->u.splines.stroke_width/2; + new = NULL; + for ( test = ent->u.splines.splines; test!=NULL; test=test->next ) { + temp = SplineSetStroke(test,&si,NULL); + if ( new==NULL ) + new=temp; + else + nlast->next = temp; + for ( nlast=temp; nlast->next!=NULL; nlast=nlast->next ); + } + SplinePointListFree(ent->u.splines.splines); + ent->u.splines.fill.col = ent->u.splines.stroke.col; + } else { + new = ent->u.splines.splines; + } + if ( head==NULL ) + head = new; + else + last->next = new; + if ( ispotrace ) { + for ( test = new; test!=NULL; test=test->next ) { + if ( test->first!=test->last && + RealNear(test->first->me.x,test->last->me.x) && + RealNear(test->first->me.y,test->last->me.y)) { + test->first->prevcp = test->last->prevcp; + test->first->noprevcp = test->last->noprevcp; + test->first->prevcpdef = test->last->prevcpdef; + test->first->prev = test->last->prev; + test->last->prev->to = test->first; + SplinePointFree(test->last); + test->last=test->first; + } + SplineSetReverse(test); + last = test; + } + } else { + for ( test = new; test!=NULL; test=test->next ) { + clockwise = SplinePointListIsClockwise(test); + /* colors may get rounded a little as we convert from RGB to */ + /* a postscript color and back. */ + if ( COLOR_RED(ent->u.splines.fill.col)>=bgr-2 && COLOR_RED(ent->u.splines.fill.col)<=bgr+2 && + COLOR_GREEN(ent->u.splines.fill.col)>=bgg-2 && COLOR_GREEN(ent->u.splines.fill.col)<=bgg+2 && + COLOR_BLUE(ent->u.splines.fill.col)>=bgb-2 && COLOR_BLUE(ent->u.splines.fill.col)<=bgb+2 ) { + if ( clockwise ) + SplineSetReverse(test); + } else { + if ( !clockwise ) + SplineSetReverse(test); + clockwise = SplinePointListIsClockwise(test); + } + last = test; + } + } + } + free(ent); + } + + /* Then remove all counter-clockwise (background) contours which are at */ + /* the edge of the character */ + if ( !ispotrace ) do { + removed = false; + sc.layers[ly_fore].splines = head; + SplineCharFindBounds(&sc,&bb); + fudge = (bb.maxy-bb.miny)/64; + if ( (bb.maxx-bb.minx)/64 > fudge ) + fudge = (bb.maxx-bb.minx)/64; + for ( last=head, prev=NULL; last!=NULL; last=next ) { + next = last->next; + if ( !SplinePointListIsClockwise(last)) { + last->next = NULL; + SplineSetFindBounds(last,&sbb); + last->next = next; + if ( sbb.minx<=bb.minx+fudge || sbb.maxx>=bb.maxx-fudge || + sbb.maxy >= bb.maxy-fudge || sbb.miny <= bb.miny+fudge ) { + if ( prev==NULL ) + head = next; + else + prev->next = next; + last->next = NULL; + SplinePointListFree(last); + removed = true; + } else + prev = last; + } else + prev = last; + } + } while ( removed ); +return( head ); +} + +/* I think this is total paranoia. but it's annoying to have linker complaints... */ +static int mytempnam(char *buffer) { + char *dir; + int fd; + /* char *old; */ + + if ( (dir=getenv("TMPDIR"))!=NULL ) + strcpy(buffer,dir); +#ifndef P_tmpdir +#define P_tmpdir "/tmp" +#endif + else + strcpy(buffer,P_tmpdir); + strcat(buffer,"/PfaEdXXXXXX"); + fd = mkstemp(buffer); +#if 0 + old = copy(buffer); + strcat(buffer,".bmp"); + if ( rename(old,buffer)==-1 ) + strcpy(buffer,old); + free(old); +#endif +return( fd ); +} + +static char *mytempdir(void) { + char buffer[300]; + char *dir, *eon; + static int cnt=0; + int tries=0; + + if ( (dir=getenv("TMPDIR"))!=NULL ) + strcpy(buffer,dir); +#ifndef P_tmpdir +#define P_tmpdir "/tmp" +#endif + else + strcpy(buffer,P_tmpdir); + strcat(buffer,"/PfaEd"); + eon = buffer+strlen(buffer); + while ( 1 ) { + sprintf( eon, "%04X_mf%d", getpid(), ++cnt ); + if ( mkdir(buffer,0770)==0 ) +return( copy(buffer) ); + else if ( errno!=EEXIST ) +return( NULL ); + if ( ++tries>100 ) +return( NULL ); + } +} + +static void _SCAutoTrace(SplineChar *sc, char **args) { + ImageList *images; + char *prog; + SplineSet *new, *last; + struct _GImage *ib; + Color bgcol; + real transform[6]; + int changed = false; + char tempname[1025]; + char *arglist[30]; + int ac,i; + FILE *ps; + int pid, status, fd; + int ispotrace; + + if ( sc->layers[ly_back].images==NULL ) +return; + prog = FindAutoTraceName(); + if ( prog==NULL ) +return; + ispotrace = (strstrmatch(prog,"potrace")!=NULL ); + for ( images = sc->layers[ly_back].images; images!=NULL; images=images->next ) { +/* the linker tells me not to use tempnam(). Which does almost exactly what */ +/* I want. So we go through a much more complex set of machinations to make */ +/* it happy. */ + ib = images->image->list_len==0 ? images->image->u.image : images->image->u.images[0]; + if ( ib->width==0 || ib->height==0 ) { + /* pk fonts can have 0 sized bitmaps for space characters */ + /* but autotrace gets all snooty about being given an empty image */ + /* so if we find one, then just ignore it. It won't produce any */ + /* results anyway */ + continue; + } + fd = mytempnam(tempname); + GImageWriteBmp(images->image,tempname); + if ( ib->trans==-1 ) + bgcol = 0xffffff; /* reasonable guess */ + else if ( ib->image_type==it_true ) + bgcol = ib->trans; + else if ( ib->clut!=NULL ) + bgcol = ib->clut->clut[ib->trans]; + else + bgcol = 0xffffff; + + ac = 0; + arglist[ac++] = prog; + if ( ispotrace ) { + /* If I use the long names (--cleartext) potrace hangs) */ + /* version 1.1 */ + arglist[ac++] = "-c"; + arglist[ac++] = "--output=-"; /* output to stdout */ + arglist[ac++] = "--eps"; + arglist[ac++] = "-r"; + arglist[ac++] = "72"; + } else { + arglist[ac++] = "--output-format=eps"; + arglist[ac++] = "--input-format=BMP"; + } + if ( args ) { + for ( i=0; args[i]!=NULL && acxscale; transform[3] = images->yscale; + transform[1] = transform[2] = 0; + transform[4] = images->xoff; + transform[5] = images->yoff - images->yscale*ib->height; + new = SplinePointListTransform(new,transform,true); + if ( sc->parent->order2 ) { + SplineSet *o2 = SplineSetsTTFApprox(new); + SplinePointListFree(new); + new = o2; + } + if ( new!=NULL ) { + sc->parent->onlybitmaps = false; + if ( !changed ) + SCPreserveState(sc,false); + for ( last=new; last->next!=NULL; last=last->next ); + last->next = sc->layers[ly_fore].splines; + sc->layers[ly_fore].splines = new; + changed = true; + } + } + } + fclose(ps); + close(fd); + unlink(tempname); /* Might not be needed, but probably is*/ + } + if ( changed ) + SCCharChangedUpdate(sc); +} + +static char **makevector(const char *str) { + char **vector; + const char *start, *pt; + int i,cnt; + + if ( str==NULL ) +return( NULL ); + + vector = NULL; + for ( i=0; i<2; ++i ) { + cnt = 0; + for ( start=str; isspace(*start); ++start ); + while ( *start ) { + for ( pt=start; !isspace(*pt) && *pt!='\0'; ++pt ); + if ( vector!=NULL ) + vector[cnt] = copyn(start,pt-start); + ++cnt; + for ( start=pt; isspace(*start); ++start); + } + if ( cnt==0 ) +return( NULL ); + if ( vector ) { + vector[cnt] = NULL; +return( vector ); + } + vector = galloc((cnt+1)*sizeof(char *)); + } +return( NULL ); +} + +static char *flatten(char *const *args) { + char *ret, *rpt; + int j, i, len; + + if ( args==NULL ) +return( NULL ); + + ret = rpt = NULL; + for ( i=0; i<2; ++i ) { + for ( j=0, len=0; args[j]!=NULL; ++j ) { + if ( rpt!=NULL ) { + strcpy(rpt,args[j]); + rpt += strlen( args[j] ); + *rpt++ = ' '; + } else + len += strlen(args[j])+1; + } + if ( rpt ) { + rpt[-1] = '\0'; +return( ret ); + } else if ( len<=1 ) +return( NULL ); + ret = rpt = galloc(len); + } +return( NULL ); +} + +static char **args=NULL; +int autotrace_ask=0, mf_ask=0, mf_clearbackgrounds=0, mf_showerrors=0; +char *mf_args = NULL; + +void *GetAutoTraceArgs(void) { +return( flatten(args)); +} + +void SetAutoTraceArgs(void *a) { + int i; + + if ( args!=NULL ) { + for ( i=0; args[i]!=NULL; ++i ) + free(args[i]); + free(args); + } + args = makevector((char *) a); +} + +static char **AutoTraceArgs(int ask) { + + if ( ask || autotrace_ask ) { + char *cdef = flatten(args); + unichar_t *def = uc_copy(cdef); + unichar_t *ret; + char *cret; + + ret = GWidgetAskStringR(_STR_AdditionalAutotraceArgs, def,_STR_AdditionalAutotraceArgs); + free(def); free(cdef); + if ( ret==NULL ) +return( (char **) -1 ); + cret = cu_copy(ret); free(ret); + args = makevector(cret); + free(cret); + SavePrefs(); + } +return( args ); +} + +void FVAutoTrace(FontView *fv,int ask) { + char **args; + int i,cnt; + GCursor ct=0; + + if ( FindAutoTraceName()==NULL ) { + GWidgetErrorR(_STR_NoAutotrace,_STR_NoAutotraceProg); +return; + } + + args = AutoTraceArgs(ask); + if ( args==(char **) -1 ) +return; + if ( fv->v!=NULL ) { + ct = GDrawGetCursor(fv->v); + GDrawSetCursor(fv->v,ct_watch); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } + + for ( i=cnt=0; isf->charcnt; ++i ) + if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_back].images ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Autotracing,_STR_Autotracing,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) { + if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_back].images ) { + _SCAutoTrace(fv->sf->chars[i], args); + if ( !GProgressNext()) + break; + } + } + GProgressEndIndicator(); + if ( fv->v!=NULL ) + GDrawSetCursor(fv->v,ct); +} + +void SCAutoTrace(SplineChar *sc,GWindow v,int ask) { + char **args; + GCursor ct; + + if ( sc->layers[ly_back].images==NULL ) { + GWidgetErrorR(_STR_NothingToTrace,_STR_NothingToTrace); +return; + } else if ( FindAutoTraceName()==NULL ) { + GWidgetErrorR(_STR_NoAutotrace,_STR_NoAutotraceProg); +return; + } + + args = AutoTraceArgs(ask); + if ( args==(char **) -1 ) +return; + ct = GDrawGetCursor(v); + GDrawSetCursor(v,ct_watch); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + _SCAutoTrace(sc, args); + GDrawSetCursor(v,ct); +} + +char *ProgramExists(char *prog,char *buffer) { + char *path, *pt; + + if (( path = getenv("PATH"))==NULL ) +return( NULL ); + + while ( 1 ) { + pt = strchr(path,':'); + if ( pt==NULL ) pt = path+strlen(path); + if ( pt-path<1000 ) { + strncpy(buffer,path,pt-path); + buffer[pt-path] = '\0'; + if ( pt!=path && buffer[pt-path-1]!='/' ) + strcat(buffer,"/"); + strcat(buffer,prog); + /* Under cygwin, applying access to "potrace" will find "potrace.exe" */ + /* no need for special check to add ".exe" */ + if ( access(buffer,X_OK)!=-1 ) { +return( buffer ); + } + } + if ( *pt=='\0' ) + break; + path = pt+1; + } +return( NULL ); +} + +char *FindAutoTraceName(void) { + static int searched=0; + static int waspotraceprefered; + static char *name = NULL; + char buffer[1025]; + + if ( searched && waspotraceprefered==preferpotrace ) +return( name ); + + searched = true; + waspotraceprefered = preferpotrace; + if ( preferpotrace ) { + if (( name = getenv("POTRACE"))!=NULL ) +return( name ); + } + if (( name = getenv("AUTOTRACE"))!=NULL ) +return( name ); + if (( name = getenv("POTRACE"))!=NULL ) +return( name ); + + if ( preferpotrace ) { + if ( ProgramExists("potrace",buffer)!=NULL ) + name = "potrace"; + } + if ( name==NULL && ProgramExists("autotrace",buffer)!=NULL ) + name = "autotrace"; + if ( name==NULL && ProgramExists("potrace",buffer)!=NULL ) + name = "potrace"; +return( name ); +} + +char *FindMFName(void) { + static int searched=0; + static char *name = NULL; + char buffer[1025]; + + if ( searched ) +return( name ); + + searched = true; + if (( name = getenv("MF"))!=NULL ) +return( name ); + if ( ProgramExists("mf",buffer)!=NULL ) + name = "mf"; +return( name ); +} + +static char *FindGfFile(char *tempdir) { + DIR *temp; + struct dirent *ent; + char buffer[1025], *ret=NULL; + + temp = opendir(tempdir); + if ( temp!=NULL ) { + while ( (ent=readdir(temp))!=NULL ) { + if ( strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0 ) + continue; + if ( strlen(ent->d_name)>2 && strcmp(ent->d_name+strlen(ent->d_name)-2,"gf")==0 ) { + strcpy(buffer,tempdir); + strcat(buffer,"/"); + strcat(buffer,ent->d_name); + ret = copy(buffer); + break; + } + } + closedir(temp); + } +return( ret ); +} + +static void cleantempdir(char *tempdir) { + DIR *temp; + struct dirent *ent; + char buffer[1025], *eod; + char *todelete[100]; + int cnt=0; + + temp = opendir(tempdir); + if ( temp!=NULL ) { + strcpy(buffer,tempdir); + strcat(buffer,"/"); + eod = buffer+strlen(buffer); + while ( (ent=readdir(temp))!=NULL ) { + if ( strcmp(ent->d_name,".")==0 || strcmp(ent->d_name,"..")==0 ) + continue; + strcpy(eod,ent->d_name); + /* Hmm... doing an unlink right here means changing the dir file */ + /* which might mean we could not read it properly. So save up the*/ + /* things we need to delete and trash them later */ + if ( cnt<99 ) + todelete[cnt++] = copy(buffer); + } + closedir(temp); + todelete[cnt] = NULL; + for ( cnt=0; todelete[cnt]!=NULL; ++cnt ) { + unlink(todelete[cnt]); + free(todelete[cnt]); + } + } + rmdir(tempdir); +} + +void MfArgsInit(void) { + if ( mf_args==NULL ) + mf_args = copy("\\scrollmode; mode=proof ; mag=2; input"); +} + +static char *MfArgs(void) { + MfArgsInit(); + + if ( mf_ask ) { + unichar_t *def = uc_copy(mf_args); + unichar_t *ret; + + ret = GWidgetAskStringR(_STR_AdditionalAutotraceArgs, def,_STR_AdditionalAutotraceArgs); + free(def); + if ( ret==NULL ) +return( (char *) -1 ); + mf_args = cu_copy(ret); free(ret); + SavePrefs(); + } +return( mf_args ); +} + +SplineFont *SFFromMF(char *filename) { + char *tempdir; + char *arglist[8]; + int pid, status, ac, i; + SplineFont *sf=NULL; + SplineChar *sc; + + if ( FindMFName()==NULL ) { + GWidgetErrorR(_STR_NoMF,_STR_NoMFProg); +return( NULL ); + } else if ( FindAutoTraceName()==NULL ) { + GWidgetErrorR(_STR_NoAutotrace,_STR_NoAutotraceProg); +return( NULL ); + } + if ( MfArgs()==(char *) -1 || AutoTraceArgs(false)==(char **) -1 ) +return( NULL ); + + /* I don't know how to tell mf to put its files where I want them. */ + /* so instead I create a temporary directory, cd mf there, and it */ + /* will put the files there. */ + tempdir = mytempdir(); + if ( tempdir==NULL ) { + GWidgetErrorR(_STR_NoTempDir,_STR_NoTempDir); +return( NULL ); + } + + ac = 0; + arglist[ac++] = FindMFName(); + arglist[ac++] = galloc(strlen(mf_args)+strlen(filename)+20); + arglist[ac] = NULL; + strcpy(arglist[1],mf_args); + strcat(arglist[1]," "); + strcat(arglist[1],filename); + if ( (pid=fork())==0 ) { + /* Child */ + int fd; + chdir(tempdir); + if ( !mf_showerrors ) { + close(1); /* mf generates a lot of verbiage to stdout. Throw it away */ + fd = open("/dev/null",O_WRONLY); + if ( fd!=1 ) + dup2(fd,1); + close(0); /* mf sometimes asks the user questions, but I have no answers... */ + fd = open("/dev/null",O_RDONLY); + if ( fd!=0 ) + dup2(fd,0); + } + exit(execvp(arglist[0],arglist)==-1); /* If exec fails, then die */ + } else if ( pid!=-1 ) { + GProgressShow(); + waitpid(pid,&status,0); + if ( WIFEXITED(status)) { + char *gffile = FindGfFile(tempdir); + if ( gffile==NULL ) + GWidgetErrorR(_STR_CantRunMF,_STR_MFBadOutput); + else { + sf = SFFromBDF(gffile,3,true); + free(gffile); + if ( sf!=NULL ) { + GProgressChangeLine1R(_STR_Autotracing); + GProgressChangeTotal(sf->charcnt); + for ( i=0; icharcnt; ++i ) { + if ( (sc = sf->chars[i])!=NULL && sc->layers[ly_back].images ) { + _SCAutoTrace(sc, args); + if ( mf_clearbackgrounds ) { + GImageDestroy(sc->layers[ly_back].images->image); + free(sc->layers[ly_back].images); + sc->layers[ly_back].images = NULL; + } + } + if ( !GProgressNext()) + break; + } + } else + GWidgetErrorR(_STR_CantRunMF,_STR_MFBadOutput); + } + } else + GWidgetErrorR(_STR_CantRunMF,_STR_MFHadError); + } else + GWidgetErrorR(_STR_CantRunMF,_STR_CantRunMF); + free(arglist[1]); + cleantempdir(tempdir); +return( sf ); +} diff --git a/fontforge/autowidth.c b/fontforge/autowidth.c new file mode 100644 index 00000000..32228ab7 --- /dev/null +++ b/fontforge/autowidth.c @@ -0,0 +1,2037 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "ustring.h" +#include "utype.h" +#include +#include + +#define THIRDS_IN_WIDTH 0 + +/* The basic idea behind autowidth: + We figure out how high serifs are (and if they exist at all) + And we guess at the cap height, xheight and descender and we mark off + zones where the serifs go (caph,caph-serifsize) (xh,xh-serifsize) + (0,serifsize), (ds,ds+serifsize). In the future we will ignore + those zones. + We look at each character and we get a rough idea of the right and + left edge of that character. (we create an array with about 60 + entries in it for a capital letter, and we divide the edge into + 60 regions and figure out roughly what the leftmost(rightmost) + point of the character is in each region). + The for every character pair we try to figure out what the visual + spacing between the two letters is (we subtract off the lbearing, + rbearing so that our result is the visual spacing if the two + characters were jammed up against each other). + Here we look at all regions the characters have in common and + just find the seperation between. + Then given this array of distances we use a heuristic to define what + the visual spacing is. + Then we find the "average visual distance" between two characters + (deducting the right and left bearings so it is in some sense absolute) + And foreach character on the left side we find the average visual + distance of all characters paired with it and deduct this from the + more general average found above. This gives us the amount by which + this character's rbearing should differ from the general rbearing. + The general rbearing should be 2*(spacing-average)/3, so the specific + is 2*(spacing-average)/3 + average-local_average. + Do the same thing to find lbearings for characters on the right side. +=================================== +Autokern has similar ideas, but is simpler: + Once we've found the average of the zone distances + Adjust the kerning between the two characters so that + = -(--) + Again check for overlap (/4 in any zone) + Kerning by the left character can always propigate to dependents + Kerning by the right char should not + (ie. A and À kern the same with V + but V kerns differently with e and è-- the accent gets in the way) + No, I think it is better not to propigate kerning. +*/ + +static GTextInfo widthlist[] = { + { (unichar_t *) _STR_StdCharRange, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeGreek, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeCyr, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_All, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Selected, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + NULL }; +static GTextInfo kernllist[] = { + { (unichar_t *) _STR_StdCharRangeKernL, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeGreek, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeCyr, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_All, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Selected, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + NULL }; +static GTextInfo kernrlist[] = { + { (unichar_t *) _STR_StdCharRangeKernR, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeKernR2, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeKernRGreek, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeKernR2Greek, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeKernRCyr, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StdCharRangeKernR2Cyr, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_All, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Selected, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + NULL }; + +static SplineFont *old_sf=NULL; +static int old_spaceguess; + +struct charone { + real lbearing, rmax; + real newl, newr; + int baseserif, lefttops, righttops; /* serif zones which affect this character */ + SplineChar *sc; + int base, top; /* bottom of character, number of decimation zones we've got */ + short *ledge; + short *redge; + struct charpair *asleft; + struct charpair *asright; +}; + +struct charpair { + struct charone *left, *right; + struct charpair *nextasleft, *nextasright; + int base, top; + short *distances; + short visual; +}; + +typedef struct widthinfo { + real spacing; /* desired spacing between letters */ + real decimation; + real serifsize; + real seriflength; + real caph; + real descent; + real xheight; + real n_stem_exterior_width, n_stem_interior_width; + real current_I_spacing; + int serifs[4][2]; /* Four serif zones: descent, baseline, xheight, cap */ + int lcnt, rcnt; /* count of left and right chars respectively */ + int real_lcnt, real_rcnt; /* what the user asked for. We might add I */ + int tcnt; /* sum of r+l cnt */ + int pcnt; /* pair count, often r*l cnt */ + int l_Ipos, r_Ipos; + struct charone **left, **right; + struct charpair **pairs; + int space_guess; + int threshold; + SplineFont *sf; + int done: 1; + int autokern: 1; +} WidthInfo; + +#define NOTREACHED -9999.0 + + +/* We want to find some measure of the visual distance between the lbearing */ +/* and the left edge of a character. For example serifs usually don't count */ +/* in the "visual" left edge. Should we just average the left edges outside */ +/* of serifs? No that would mean that "T" would be shifted too far left. */ +/* Should we just take the minimum seperation outside of the serifs? No */ +/* because "O" won't be shifted far enough left. So to shift "O" a little */ +/* more to the left I will average the values close to the minimum */ +#if 0 +static real LineFindLeftDistance(struct charone *right,WidthInfo *wi) { + int i, base, enc; + real sum, cnt, min, fudge; + + min = NOTREACHED; + base = right->base; + /* j often stick out far to the left under the baseline. This is almost */ + /* completely irrelevant because there are so few characters with descenders */ + /* so it is better fixed up with a kern. the stem of "j" should be about */ + /* where the stem of the "i" is and we should ignore the bowl down below */ + if ( (enc=right->sc->unicodeenc)=='g' || enc=='j' || enc=='y' || enc==0x3f3 || + enc==0x443 || enc==0x458 || enc==0xf6be ) + base = 0; + for ( i=base; i<=right->top; ++i ) { + if ( right->ledge[i-right->base]!=NOTREACHED && + (iserifs[0][0] || i>wi->serifs[0][1]) && + (iserifs[1][0] || i>wi->serifs[1][1]) && + (iserifs[2][0] || i>wi->serifs[2][1]) && + (iserifs[3][0] || i>wi->serifs[3][1]) ) { + if ( min==NOTREACHED || min>right->ledge[i-right->base] ) + min = right->ledge[i-right->base]; + } + } + + fudge = (wi->sf->ascent+wi->sf->descent)/100; + if ( min==NOTREACHED ) +return( 0 ); + else { + sum = cnt = 0; + for ( i=base; i<=right->top; ++i ) { + if ( right->ledge[i-right->base]!=NOTREACHED && + (iserifs[0][0] || i>wi->serifs[0][1]) && + (iserifs[1][0] || i>wi->serifs[1][1]) && + (iserifs[2][0] || i>wi->serifs[2][1]) && + (iserifs[3][0] || i>wi->serifs[3][1]) && + right->ledge[i-right->base]<=min+fudge ) { + ++cnt; + sum += right->ledge[i-right->base]; + } + } +return( (min+sum/cnt)/2-right->lbearing ); + } +} + +static real LineFindRightDistance(struct charone *left,WidthInfo *wi) { + int i; + real sum, cnt, max, fudge; + + max = NOTREACHED; + for ( i=left->base; i<=left->top; ++i ) { + if ( left->redge[i-left->base]!=NOTREACHED && + (iserifs[0][0] || i>wi->serifs[0][1]) && + (iserifs[1][0] || i>wi->serifs[1][1]) && + (iserifs[2][0] || i>wi->serifs[2][1]) && + (iserifs[3][0] || i>wi->serifs[3][1]) ) { + if ( max==NOTREACHED || maxredge[i-left->base] ) + max = left->redge[i-left->base]; + } + } + + fudge = (wi->sf->ascent+wi->sf->descent)/100; + if ( max==NOTREACHED ) +return( 0 ); + else { + sum = cnt = 0; + for ( i=left->base; i<=left->top; ++i ) { + if ( left->redge[i-left->base]!=NOTREACHED && + (iserifs[0][0] || i>wi->serifs[0][1]) && + (iserifs[1][0] || i>wi->serifs[1][1]) && + (iserifs[2][0] || i>wi->serifs[2][1]) && + (iserifs[3][0] || i>wi->serifs[3][1]) && + left->redge[i-left->base]>=max-fudge ) { + ++cnt; + sum += left->redge[i-left->base]; + } + } +return( (max+sum/cnt)/2-left->rmax ); + } +} +#endif + +static void FigureLR(WidthInfo *wi) { + int i; + real sum, subsum, subsum_left_I, subsum_right_I, spacing; + struct charone *ch; + struct charpair *cp; + + sum = 0; + for ( i=0; ipcnt; ++i ) + sum += wi->pairs[i]->visual; + sum /= (wi->pcnt); + + subsum_left_I = subsum_right_I = sum; + if ( wi->l_Ipos!=-1 ) { + subsum_left_I = 0; + for ( cp = wi->left[wi->l_Ipos]->asleft; cp!=NULL; cp = cp->nextasleft ) + subsum_left_I += cp->visual; + subsum_left_I /= wi->rcnt; + } + if ( wi->r_Ipos!=-1 ) { + subsum_right_I = 0; + for ( cp = wi->right[wi->r_Ipos]->asright; cp!=NULL; cp = cp->nextasright ) + subsum_right_I += cp->visual; + subsum_right_I /= wi->lcnt; + } + + /* Normalize so that spacing between two "I"s is correct... */ + spacing = wi->spacing - (2*sum-subsum_left_I-subsum_right_I); + + for ( i=0; ireal_lcnt; ++i ) { + ch = wi->left[i]; + subsum = 0; + for ( cp = ch->asleft; cp!=NULL; cp = cp->nextasleft ) + subsum += cp->visual; + subsum /= wi->rcnt; +#if THIRDS_IN_WIDTH + ch->newr = rint( spacing*2/3.0 + sum-subsum ); +#else + ch->newr = rint( spacing/2.0 + sum-subsum ); +#endif + } + for ( i=0; ireal_rcnt; ++i ) { + ch = wi->right[i]; + subsum = 0; + for ( cp = ch->asright; cp!=NULL; cp = cp->nextasright ) + subsum += cp->visual; + subsum /= wi->lcnt; +#if THIRDS_IN_WIDTH + ch->newl = rint( spacing/3.0+ sum-subsum ); +#else + ch->newl = rint( spacing/2.0+ sum-subsum ); +#endif + } +} + +static void CheckOutOfBounds(WidthInfo *wi) { + int i,j; + struct charpair *cp; + real min=NOTREACHED, temp, lr; + real minsp = wi->spacing/3; + + for ( i=0; ireal_rcnt; ++i ) { + if ( wi->right[i]->newl<-wi->spacing || wi->right[i]->newl>wi->spacing ) + fprintf( stderr, "AutoWidth failure on %s\n", wi->right[i]->sc->name ); + if ( wi->right[i]->newl<-minsp ) + wi->right[i]->newl = -rint(minsp); + } + for ( i=0; ireal_lcnt; ++i ) { + if ( wi->left[i]->newr<-wi->spacing-wi->seriflength || + wi->left[i]->newr>wi->spacing+wi->seriflength ) { + fprintf( stderr, "AutoWidth failure on %s\n", wi->right[i]->sc->name ); + if ( wi->left[i]->newr>wi->spacing ) + wi->left[i]->newr = wi->spacing; + } + } + for ( i=0; ipcnt; ++i ) { + cp = wi->pairs[i]; + if ( cp->left->newr==NOTREACHED || cp->right->newl==NOTREACHED ) + continue; + lr = cp->left->newr + cp->right->newl; + min = NOTREACHED; + for ( j=0; j<=cp->top-cp->base; ++j ) if ( cp->distances[j]!=NOTREACHED ) { + temp = lr + cp->distances[j]; + if ( min==NOTREACHED || templeft->newr += rint(minsp-min); + } +} + +static void ApplyChanges(WidthInfo *wi) { + uint8 *rsel = gcalloc(wi->sf->charcnt,sizeof(char)); + int i, width; + real transform[6]; + struct charone *ch; + DBounds bb; + + for ( i=0; ireal_rcnt; ++i ) + rsel[wi->right[i]->sc->enc] = true; + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0; + + for ( i=0; ireal_rcnt; ++i ) { + ch = wi->right[i]; + transform[4] = ch->newl-ch->lbearing; + if ( transform[4]!=0 ) { + FVTrans(wi->sf->fv,ch->sc,transform,rsel,false); + SCCharChangedUpdate(ch->sc); + } + } + free(rsel); + + for ( i=0; ireal_lcnt; ++i ) { + ch = wi->left[i]; + SplineCharFindBounds(ch->sc,&bb); + width = rint(bb.maxx + ch->newr); + if ( width!=ch->sc->width ) { + SCPreserveWidth(ch->sc); + SCSynchronizeWidth(ch->sc,width,ch->sc->width,wi->sf->fv); + SCCharChangedUpdate(ch->sc); + } + } +} + +static void AutoWidth(WidthInfo *wi) { + FigureLR(wi); + CheckOutOfBounds(wi); + ApplyChanges(wi); +} + +static void AutoKern(WidthInfo *wi) { + struct charpair *cp; + SplineChar *lsc, *rsc; + int i, diff; + KernPair *kp; + MetricsView *mv; + + for ( i=0; ipcnt; ++i ) { + cp = wi->pairs[i]; + + diff = rint( wi->spacing-(cp->left->sc->width-cp->left->rmax+cp->right->lbearing+cp->visual)); + + if ( wi->threshold!=0 && diff>-wi->threshold && diffthreshold ) + diff = 0; + lsc = cp->left->sc; + rsc = cp->right->sc; + for ( kp = lsc->kerns; kp!=NULL && kp->sc!=rsc; kp = kp->next ); + if ( kp!=NULL ) { + if ( kp->off!=diff ) { + kp->off = diff; + wi->sf->changed = true; + } + } else if ( diff!=0 ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = rsc; + kp->off = diff; + kp->next = lsc->kerns; + lsc->kerns = kp; + wi->sf->changed = true; + } + } + for ( mv=wi->sf->fv->metrics; mv!=NULL; mv=mv->next ) + MVReKern(mv); +} + +static real SplineFindMinXAtY(Spline *spline,real y,real min) { + double t,t1,t2,tbase,val; + Spline1D *xsp; + + if ( y>spline->from->me.y && y>spline->from->nextcp.y && + y>spline->to->me.y && y>spline->to->prevcp.y ) +return( min ); + if ( yfrom->me.y && yfrom->nextcp.y && + yto->me.y && yto->prevcp.y ) +return( min ); + if ( min!=NOTREACHED ) { + if ( min<=spline->from->me.x && min<=spline->from->nextcp.x && + min<=spline->to->me.x && min<=spline->to->prevcp.x ) +return( min ); + } + + xsp = &spline->splines[0]; + SplineFindExtrema(&spline->splines[1], &t1, &t2 ); + tbase = 0; + if ( t1!=-1 ) { + t = SplineSolve(&spline->splines[1],0,t1,y,.01); + if ( t>=0 && t<=1 ) { + val = ((xsp->a*t+xsp->b)*t+xsp->c)*t + xsp->d; + if ( min==NOTREACHED || valsplines[1],tbase,t2,y,.01); + if ( t>=0 && t<=1 ) { + val = ((xsp->a*t+xsp->b)*t+xsp->c)*t + xsp->d; + if ( min==NOTREACHED || valsplines[1],tbase,1.0,y,.01); + if ( t>=0 && t<=1 ) { + val = ((xsp->a*t+xsp->b)*t+xsp->c)*t + xsp->d; + if ( min==NOTREACHED || valdecimation); + if ( i>ch->top ) i=ch->top; /* Can't happen */ + i -= ch->base; + if ( i<0 ) i=0; /* Can't happen */ + + if ( ch->ledge[i]==NOTREACHED || xledge[i] ) + ch->ledge[i] = x; + if ( ch->redge[i]==NOTREACHED || x>ch->redge[i] ) + ch->redge[i] = x; +} + +static void SplineFindEdges(Spline *spline,struct charone *ch, WidthInfo *wi) { + Spline1D *xsp, *ysp; + double t1, t2, t, toff, ymin, ymax; + + /* first try the end points */ + PtFindEdges(spline->to->me.x,spline->to->me.y,ch,wi); + PtFindEdges(spline->from->me.x,spline->from->me.y,ch,wi); + + /* then try the extrema of the spline (assuming they are between t=(0,1) */ + xsp = &spline->splines[0]; ysp = &spline->splines[1]; + SplineFindExtrema(xsp, &t1, &t2 ); + if ( t1!=-1 ) + PtFindEdges( ((xsp->a*t1+xsp->b)*t1+xsp->c)*t1+xsp->d, + ((ysp->a*t1+ysp->b)*t1+ysp->c)*t1+ysp->d, + ch,wi); + if ( t2!=-1 ) + PtFindEdges( ((xsp->a*t2+xsp->b)*t2+xsp->c)*t2+xsp->d, + ((ysp->a*t2+ysp->b)*t2+ysp->c)*t2+ysp->d, + ch,wi); + + ymin = ymax = spline->from->me.y; + if ( spline->from->nextcp.y > ymax ) ymax = spline->from->nextcp.y; + if ( spline->from->nextcp.y < ymin ) ymin = spline->from->nextcp.y; + if ( spline->to->prevcp.y > ymax ) ymax = spline->to->prevcp.y; + if ( spline->to->prevcp.y < ymin ) ymin = spline->to->prevcp.y; + if ( spline->to->me.y > ymax ) ymax = spline->to->me.y; + if ( spline->to->me.y < ymin ) ymin = spline->to->me.y; + + if ( ymin!=ymax ) { + toff = wi->decimation/(2*(ymax-ymin)); + for ( t=toff; t<1; t+=toff ) { + PtFindEdges( ((xsp->a*t+xsp->b)*t+xsp->c)*t+xsp->d, + ((ysp->a*t+ysp->b)*t+ysp->c)*t+ysp->d, + ch,wi); + } + } +} + +static real SSFindMinXAtY(SplineSet *spl,real y,real min) { + Spline *sp, *first; + + while ( spl!=NULL ) { + first = NULL; + for ( sp = spl->first->next; sp!=NULL && sp!=first; sp = sp->to->next ) { + min = SplineFindMinXAtY(sp,y,min); + if ( first==NULL ) first = sp; + } + spl = spl->next; + } +return( min ); +} + +static real SSIsMinXAtYCurved(SplineSet *spl,real y,real oldmin,int *curved) { + Spline *sp, *first; + real min; + + while ( spl!=NULL ) { + first = NULL; + for ( sp = spl->first->next; sp!=NULL && sp!=first; sp = sp->to->next ) { + min = SplineFindMinXAtY(sp,y,oldmin); + if ( min!=oldmin ) { + oldmin = min; + *curved = !sp->knownlinear; + } + if ( first==NULL ) first = sp; + } + spl = spl->next; + } +return( oldmin ); +} + +static void SSFindEdges(SplineSet *spl,struct charone *ch, WidthInfo *wi) { + Spline *sp, *first; + + while ( spl!=NULL ) { + first = NULL; + for ( sp = spl->first->next; sp!=NULL && sp!=first; sp = sp->to->next ) { + SplineFindEdges(sp,ch,wi); + if ( first==NULL ) first = sp; + } + spl = spl->next; + } +} + +static real SCFindMinXAtY(SplineChar *sc,real y) { + real min = NOTREACHED; + RefChar *ref; + + min = SSFindMinXAtY(sc->layers[ly_fore].splines,y,NOTREACHED); + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + min = SSFindMinXAtY(ref->layers[0].splines,y,min); +return( min ); +} + +static int SCIsMinXAtYCurved(SplineChar *sc,real y) { + real min = NOTREACHED; + int curved = false; + RefChar *ref; + + min = SSFindMinXAtY(sc->layers[ly_fore].splines,y,NOTREACHED); + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + min = SSIsMinXAtYCurved(ref->layers[0].splines,y,min,&curved); +return( curved ); +} + +static void SCFindEdges(struct charone *ch,WidthInfo *wi) { + RefChar *ref; + SplineChar *sc; + int i; + DBounds bb; + + SplineCharQuickConservativeBounds(ch->sc,&bb); + ch->base = rint(bb.miny/wi->decimation); + ch->top = rint(bb.maxy/wi->decimation); + ch->ledge = galloc((ch->top-ch->base+1)*sizeof(short)); + ch->redge = galloc((ch->top-ch->base+1)*sizeof(short)); + for ( i=0; i<=ch->top-ch->base; ++i ) + ch->ledge[i] = ch->redge[i] = NOTREACHED; + SSFindEdges(ch->sc->layers[ly_fore].splines,ch,wi); + for ( ref=ch->sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + SSFindEdges(ref->layers[0].splines,ch,wi); + ch->lbearing = ch->rmax = NOTREACHED; + for ( i=0; i<=ch->top-ch->base; ++i ) { + if ( ch->ledge[i]!=NOTREACHED ) + if ( ch->lbearing==NOTREACHED || ch->ledge[i]lbearing ) + ch->lbearing = ch->ledge[i]; + if ( ch->redge[i]!=NOTREACHED ) + if ( ch->rmax==NOTREACHED || ch->redge[i]>ch->rmax ) + ch->rmax = ch->redge[i]; + } + + /* In accented characters find the base letter, compute its dimensions */ + /* then figure out its serif zones */ + sc = ch->sc; + while ( sc->layers[ly_fore].refs!=NULL ) { + for ( ref=ch->sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + if ( ref->sc->unicodeenc!=-1 && isalpha(ref->sc->unicodeenc)) + break; + if ( ref==NULL ) + break; + sc = ref->sc; + } + SplineCharQuickBounds(ch->sc,&bb); + if ( sc->unicodeenc=='k' ) { + ch->baseserif = 1; + ch->lefttops = 3; + ch->righttops = 2; + } else { + ch->baseserif = ( bb.miny>=0 || -bb.miny<-wi->descent/2 )? 1 : 0; + ch->lefttops = ch->righttops = + ( bb.maxy<=wi->xheight || bb.maxy-wi->xheightcaph-bb.maxy )? 2 : 3; + } +} + +/* See the discussion at LineFindLeftDistance for the basic idea on guessing */ +/* at a visual distance. However things are a bit more complicated here */ +/* because we've actually got something on the other side which we compare */ +/* to. Consider the Fz combination. The cross bar of the F is usually slightly */ +/* lower than the top bar of the z. Which means it can slide nicely into the */ +/* middle of "z". But that looks really bad. Instead we need a fudge zone */ +/* that extends around every point on the edge */ +static void PairFindDistance(struct charpair *cp,WidthInfo *wi) { + int i,j, wasserif, wasseriff; + real sum, cnt, min, fudge, minf, temp; + struct charone *left=cp->left, *right=cp->right; + int fudgerange; + + fudgerange = rint(wi->caph/(20*wi->decimation) ); + if ( wi->serifsize!=0 ) /* the serifs provide some fudging themselves */ + fudgerange = rint(wi->caph/(30*wi->decimation) ); + + cp->base = (left->base>right->base?left->base : right->base) - fudgerange; + cp->top = (left->toptop ? left->top : right->top) + fudgerange; + if ( cp->topbase ) + cp->distances = galloc(sizeof(short)); + else + cp->distances = galloc((cp->top-cp->base+1)*sizeof(short)); + + min = NOTREACHED; wasserif = false; + for ( i=cp->base; i<=cp->top; ++i ) { + cp->distances[i-cp->base] = NOTREACHED; + if ( i>=left->base && i<=left->top && + left->redge[i-left->base]!=NOTREACHED ) { + minf = NOTREACHED; wasseriff = false; + for ( j=i-fudgerange ; j<=i+fudgerange; ++j ) { + if ( j>=right->base && j<=right->top && + right->ledge[j-right->base]!=NOTREACHED ) { + temp = right->ledge[j-right->base]-right->lbearing + + left->rmax-left->redge[i-left->base]; + if ( minf==NOTREACHED || temp=wi->serifs[left->baseserif][0] && i<=wi->serifs[left->baseserif][1]) || + (i>=wi->serifs[left->lefttops][0] && i<=wi->serifs[left->lefttops][1]) || + (j>=wi->serifs[right->baseserif][0] && j<=wi->serifs[right->baseserif][1]) || + (j>=wi->serifs[right->righttops][0] && j<=wi->serifs[right->righttops][1])); + } + } + } + cp->distances[i-cp->base] = minf; + if ( minf!=NOTREACHED && ( min==NOTREACHED || min>minf )) { + min = minf; + wasserif = wasseriff; + } + } + } + + fudge = (wi->sf->ascent+wi->sf->descent)/100; + if ( min==NOTREACHED ) + cp->visual=0; + else { + sum = cnt = 0; + for ( i=cp->base; i<=cp->top; ++i ) { + if ( cp->distances[i-cp->base]!=NOTREACHED && + cp->distances[i-cp->base]<=min+fudge ) { + ++cnt; + sum += cp->distances[i-cp->base]; + } + } + if ( cnt==0 ) + cp->visual = min; /* Can't happen */ + else + cp->visual = (min+sum/cnt)/2; + if ( !wasserif ) + cp->visual -= wi->seriflength/2; + } +} + +static void FindFontParameters(WidthInfo *wi) { + DBounds bb; + SplineFont *sf=wi->sf; + int i, j, si=-1; + real caph, ds, xh, serifsize, angle, ca, seriflength = 0; + int cnt; + static unichar_t caps[] = { 'A', 'Z', 0x391, 0x3a9, 0x40f, 0x418, 0x41a, 0x42f, 0 }; +#if 0 + static unichar_t ascent[] = { 'b','d','h','k','l', + 0x444, 0x452, 0x45b, 0x431, 0 }; +#endif + static unichar_t descent[] = { 'p','q','g','y','j', + 0x3c8, 0x3b7, 0x3b3, 0x3b2, 0x3b6, 0x3bc, 0x3be, 0x3c1, 0x3c6, + 0x444, 0x443, 0x458, 0x434, 0 }; + static unichar_t xheight[] = { 'x','u','v','w','y','z', + 0x3b3, 0x3b9, 0x3ba, 0x3bc, 0x3bd, 0x3c0, 0x3c4, 0x3c5, 0x3c7, 0x3c8, + 0x432, 0x433, 0x436, 0x438, 0x43a, 0x43d, 0x43f, 0x442, 0x443, 0x445, + 0x446, 0x447, 0x448, 0x449, 0 }; + static unichar_t easyserif[] = { 'I','B','D','E','F','H','K','L','N','P','R', + 0x399, 0x406, 0x392, 0x393, 0x395, 0x397, 0x39a, + 0x3a0, 0x3a1, 0x40a, 0x412, 0x413, 0x415, 0x41a, 0x41d, 0x41f, + 0x420, 0x428, 0 }; + real stemx, testx, y, ytop, ybottom, yorig, topx, bottomx; + + caph = 0; cnt = 0; + for ( i=0; caps[i]!='\0' && cnt<5; i+=2 ) + for ( j=caps[i]; j<=caps[i+1] && cnt<5; ++j ) + if ( (si=SFFindExistingChar(sf,j,NULL))!=-1 && sf->chars[si]!=NULL ) { + SplineCharQuickBounds(sf->chars[si],&bb); + caph += bb.maxy; + ++cnt; + } + if ( cnt!=0 ) + caph /= cnt; + else + caph = sf->ascent; + + for ( i=0; descent[i]!='\0'; ++i ) + if ( (si=SFFindExistingChar(sf,descent[i],NULL))!=-1 && sf->chars[si]!=NULL ) + break; + if ( descent[i]!='\0' ) { + SplineCharQuickBounds(sf->chars[si],&bb); + ds = bb.miny; + } else + ds = -sf->descent; + + cnt = 0; xh = 0; + for ( i=0; xheight[i]!='\0' && cnt<5; ++i ) + if ( (si=SFFindExistingChar(sf,xheight[i],NULL))!=-1 && sf->chars[si]!=NULL ) { + SplineCharQuickBounds(sf->chars[si],&bb); + xh += bb.maxy; + ++cnt; + } + if ( cnt!=0 ) + xh /= cnt; + else + xh = 3*caph/4; + + for ( i=0; easyserif[i]!='\0'; ++i ) + if ( (si=SFFindExistingChar(sf,easyserif[i],NULL))!=-1 && sf->chars[si]!=NULL ) + break; + if ( si!=-1 ) { + topx = SCFindMinXAtY(sf->chars[si],2*caph/3); + bottomx = SCFindMinXAtY(sf->chars[si],caph/3); + /* Some fonts don't sit on the baseline... */ + SplineCharQuickBounds(sf->chars[si],&bb); + /* beware of slanted (italic, oblique) fonts */ + ytop = caph/2; ybottom=bb.miny; + stemx = SCFindMinXAtY(sf->chars[si],ytop); + if ( topx==bottomx ) { + ca = 0; + while ( ytop-ybottom>=.5 ) { + y = (ytop+ybottom)/2; + testx = SCFindMinXAtY(sf->chars[si],y); + if ( testx+1>=stemx ) + ytop = y; + else + ybottom = y; + } + } else { + angle = atan2(caph/3,topx-bottomx); + ca = cos(angle); + yorig = ytop; + while ( ytop-ybottom>=.5 ) { + y = (ytop+ybottom)/2; + testx = SCFindMinXAtY(sf->chars[si],y)+ + (yorig-y)*ca; + if ( testx+4>=stemx ) /* the +4 is to counteract rounding */ + ytop = y; + else + ybottom = y; + } + } + /* If "I" has a curved stem then it's probably in a script style and */ + /* serifs don't really make sense (or not the simplistic ones I deal with) */ + if ( ytop<=bb.miny+.5 || SCIsMinXAtYCurved(sf->chars[si],caph/2) ) + serifsize = 0; + else if ( ytop>caph/4 ) + serifsize = /*.06*(sf->ascent+sf->descent)*/ 0; + else + serifsize = ytop-bb.miny; + + if ( serifsize!=0 ) { + y = serifsize/4 + bb.miny; + testx = SCFindMinXAtY(sf->chars[si],y); + if ( testx==NOTREACHED ) + serifsize=0; + else { + testx += (yorig-y)*ca; + seriflength = stemx-testx; + if ( seriflength < (sf->ascent+sf->descent)/200 ) + serifsize = 0; + } + } + } else + serifsize = .06*(sf->ascent+sf->descent); + serifsize = rint(serifsize); + if ( seriflength>.1*(sf->ascent+sf->descent) || serifsize<0 ) { + seriflength = 0; /* that's an unreasonable value, we must be wrong */ + serifsize = 0; + } + + if ( (si=SFFindExistingChar(sf,'n',"n"))!=-1 && sf->chars[si]!=NULL ) { + SplineChar *sc = sf->chars[si]; + if ( sc->changedsincelasthinted && !sc->manualhints ) + SplineCharAutoHint(sc,true); + SplineCharQuickBounds(sc,&bb); + if ( sc->vstem!=NULL && sc->vstem->next!=NULL ) { + wi->n_stem_exterior_width = sc->vstem->next->start+sc->vstem->next->width- + sc->vstem->start; + wi->n_stem_interior_width = sc->vstem->next->start- + (sc->vstem->start+sc->vstem->width); + } + if ( wi->n_stem_exterior_widthn_stem_exterior_width>bb.maxx-bb.minx+seriflength || + wi->n_stem_interior_width <= 0 ) { + wi->n_stem_exterior_width = bb.maxx-bb.minx - 2*seriflength; + /* guess that the stem width is somewhere around the seriflength and */ + /* one quarter of the character width */ + wi->n_stem_interior_width = wi->n_stem_exterior_width - seriflength - + wi->n_stem_exterior_width/4; + } + } + if ( ((si=SFFindExistingChar(sf,'I',"I"))!=-1 && sf->chars[si]!=NULL ) || + ((si=SFFindExistingChar(sf,0x399,"Iota"))!=-1 && sf->chars[si]!=NULL ) || + ((si=SFFindExistingChar(sf,0x406,"afii10055"))!=-1 && sf->chars[si]!=NULL ) ) { + SplineChar *sc = sf->chars[si]; + SplineCharQuickBounds(sc,&bb); + wi->current_I_spacing = sc->width - (bb.maxx-bb.minx); + } + + wi->caph = caph; + wi->descent = ds; + wi->xheight = xh; + wi->serifsize = serifsize; + wi->seriflength = seriflength; + wi->decimation = caph<=1?10:caph/60; + + if ( serifsize==0 ) { + wi->serifs[0][0] = wi->serifs[0][1] = wi->serifs[1][0] = wi->serifs[1][1] = NOTREACHED; + wi->serifs[2][0] = wi->serifs[2][1] = wi->serifs[3][0] = wi->serifs[3][1] = NOTREACHED; + } else { + wi->serifs[0][0] = rint(ds/wi->decimation); + wi->serifs[0][1] = rint((ds+serifsize)/wi->decimation); + wi->serifs[1][0] = 0; + wi->serifs[1][1] = rint(serifsize/wi->decimation); + wi->serifs[2][0] = rint((xh-serifsize)/wi->decimation); + wi->serifs[2][1] = rint(xh/wi->decimation); + wi->serifs[3][0] = rint((caph-serifsize)/wi->decimation); + wi->serifs[3][1] = rint(caph/wi->decimation); + } + + if ( wi->sf==old_sf ) + wi->space_guess = old_spaceguess; + else if ( wi->autokern && wi->current_I_spacing ) + wi->space_guess = rint(wi->current_I_spacing); + else if ( wi->n_stem_interior_width>0 ) + wi->space_guess = rint(wi->n_stem_interior_width); + else if ( caph!=sf->ascent && ds!=-sf->descent ) + wi->space_guess = rint(.205*(caph-ds)); + else + wi->space_guess = rint(.184*(sf->ascent+sf->descent)); +} + +real SFGuessItalicAngle(SplineFont *sf) { + static char *easyserif = "IBDEFHKLNPR"; + int i,si; + real as, topx, bottomx; + DBounds bb; + double angle; + + for ( i=0; easyserif[i]!='\0'; ++i ) + if ( (si=SFFindExistingChar(sf,easyserif[i],NULL))!=-1 && sf->chars[si]!=NULL ) + break; + if ( easyserif[i]=='\0' ) /* can't guess */ +return( 0 ); + + SplineCharFindBounds(sf->chars[si],&bb); + as = bb.maxy-bb.miny; + + topx = SCFindMinXAtY(sf->chars[si],2*as/3+bb.miny); + bottomx = SCFindMinXAtY(sf->chars[si],as/3+bb.miny); + if ( topx==bottomx ) +return( 0 ); + + angle = atan2(as/3,topx-bottomx)*180/3.1415926535897932-90; + if ( angle<1 && angle>-1 ) angle = 0; +return( angle ); +} + +void SFHasSerifs(SplineFont *sf) { + static unichar_t easyserif[] = { 'I','B','D','E','F','H','I','K','L','N','P','R', + 0x399, 0x406, 0x392, 0x393, 0x395, 0x397, 0x39a, + 0x3a0, 0x3a1, 0x40a, 0x412, 0x413, 0x415, 0x41a, 0x41d, 0x41f, + 0x420, 0x428, 0 }; + int i,si; + real as, topx, bottomx, serifbottomx, seriftopx; + DBounds bb; + + for ( i=0; easyserif[i]!='\0'; ++i ) + if ( (si=SFFindExistingChar(sf,easyserif[i],NULL))!=-1 && sf->chars[si]!=NULL ) + break; + if ( easyserif[i]=='\0' ) /* Can't guess */ +return; + + sf->serifcheck = true; + + SplineCharFindBounds(sf->chars[si],&bb); + as = bb.maxy-bb.miny; + + topx = SCFindMinXAtY(sf->chars[si],2*as/3+bb.miny); + bottomx = SCFindMinXAtY(sf->chars[si],as/3+bb.miny); + serifbottomx = SCFindMinXAtY(sf->chars[si],1+bb.miny); + seriftopx = SCFindMinXAtY(sf->chars[si],bb.maxy-1); + if ( RealNear(topx,bottomx) ) { + if ( RealNear(serifbottomx,bottomx) && RealNear(seriftopx,topx)) + sf->issans = true; + else if ( RealNear(serifbottomx,seriftopx) && topx-seriftopx>0 ) + sf->isserif = true; + } else { + /* It's Italic. I'm just going to give up.... */ + } +} + +static void InitCharPairs(WidthInfo *wi) { + int i, j; + struct charpair *cp; + + wi->pcnt = wi->lcnt*wi->rcnt; + wi->pairs = galloc(wi->pcnt*sizeof(struct charpair *)); + for ( i=0; ilcnt; ++i ) for ( j=0; jrcnt; ++j ) { + wi->pairs[i*wi->rcnt+j] = cp = gcalloc(1,sizeof(struct charpair)); + cp->left = wi->left[i]; + cp->right = wi->right[j]; + cp->nextasleft = cp->left->asleft; + cp->left->asleft = cp; + cp->nextasright = cp->right->asright; + cp->right->asright = cp; + } + wi->tcnt = wi->lcnt+wi->rcnt; +} + +static void BuildCharPairs(WidthInfo *wi) { + int i; + + /* FindFontParameters(wi); */ /* Moved earlier */ + + for ( i=0; ilcnt; ++i ) + SCFindEdges(wi->left[i],wi); + for ( i=0; ircnt; ++i ) + SCFindEdges(wi->right[i],wi); + + for ( i=0; ipcnt; ++i ) + PairFindDistance(wi->pairs[i],wi); +} + +static void FreeCharList(struct charone **list) { + int i; + + if ( list==NULL ) +return; + for ( i=0; list[i]!=NULL; ++i ) { + free( list[i]->ledge ); + free( list[i]->redge ); + free( list[i] ); + } + free(list); +} + +static void FreeCharPairs(struct charpair **list, int cnt) { + int i; + + if ( list==NULL ) +return; + for ( i=0; iascent + sf->descent; + totals = gcalloc(high+1,sizeof(int)); + tot=0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kp = sf->chars[i]->kerns; kp!=NULL; kp = kp->next ) { + val = kp->off; + if ( val!=0 ) { + if ( val<0 ) val = -val; + if ( val>high ) val = high; + ++totals[val]; + ++tot; + } + } + } + if ( tot>cnt ) { + tot = 0; + for ( i=high; i>0 && tot+totals[i]charcnt; ++i ) if ( sf->chars[i]!=NULL ) { + prev = NULL; + for ( kp = sf->chars[i]->kerns; kp!=NULL; kp = next ) { + next = kp->next; + if ( kp->off>=threshold || kp->off<=-threshold ) + prev = kp; + else { + if ( prev==NULL ) + sf->chars[i]->kerns = next; + else + prev->next = next; + chunkfree(kp,sizeof(KernPair)); + } + } + } + for ( mv=sf->fv->metrics; mv!=NULL; mv=mv->next ) + MVReKern(mv); +} + +#define CID_Spacing 1001 +#define CID_Total 1002 +#define CID_Threshold 1003 +#define CID_Left 1010 +#define CID_Right 1020 +#define CID_Browse 2001 +#define CID_OK 2002 + +static struct charone *MakeCharOne(SplineChar *sc) { + struct charone *ch = gcalloc(1,sizeof(struct charone)); + + ch->sc = sc; + ch->newr = ch->newl = NOTREACHED; +return( ch ); +} + +static void ReplaceGlyphWith(SplineFont *sf, struct charone **ret, int cnt, int ch1, int ch2 ) { + int s,e,j; + + for ( s=0; ssc->unicodeenc==ch1 ) + break; + if ( s!=cnt && ( j=SFFindExistingChar(sf,ch2,NULL))!=-1 && + sf->chars[j]->width==ret[s]->sc->width && /* without this, they won't sync up */ + ret[s]->sc->layers[ly_fore].refs!=NULL && + (ret[s]->sc->layers[ly_fore].refs->sc->unicodeenc==ch2 || + (ret[s]->sc->layers[ly_fore].refs->next!=NULL && + ret[s]->sc->layers[ly_fore].refs->next->sc->unicodeenc==ch2)) ) { + for ( e=0; esc->unicodeenc==ch2 ) + break; + if ( e==cnt ) + ret[s]->sc = sf->chars[j]; + } +} + +static struct charone **BuildCharList(SplineFont *sf,GWindow gw, int base, + int *tot, int *rtot, int *ipos, int iswidth) { + int i, cnt, rcnt=0, doit, s, e; + struct charone **ret=NULL; + int all, sel, parse=false; + const unichar_t *str, *pt; + + str = _GGadgetGetTitle(GWidgetGetControl(gw,base)); + all = u_strcmp(str,GStringGetResource(_STR_All,NULL))==0; + sel = u_strcmp(str,GStringGetResource(_STR_Selected,NULL))==0; + if ( !all && !sel ) + parse = true; + + for ( doit=0; doit<2; ++doit ) { + if ( all ) { + for ( i=cnt=0; icharcnt && cnt<300; ++i ) { + if ( sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) { + if ( doit ) + ret[cnt++] = MakeCharOne(sf->chars[i]); + else + ++cnt; + } + } + } else if ( sel ) { + for ( i=cnt=0; icharcnt && cnt<300; ++i ) { + if ( sf->fv->selected[i] && sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) { + if ( doit ) + ret[cnt++] = MakeCharOne(sf->chars[i]); + else + ++cnt; + } + } + } else { + for ( pt=str, cnt=0; *pt && cnt<300 ; ) { + if ( pt[1]=='-' && pt[2]!='\0' ) { + s = pt[0]; e = pt[2]; + pt += 3; + } else { + s = e = pt[0]; + ++pt; + } + for ( ; s<=e && cnt<300 ; ++s ) { + i = SFFindExistingChar(sf,s,NULL); + if ( i!=-1 && sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) { + if ( doit ) + ret[cnt++] = MakeCharOne(sf->chars[i]); + else + ++cnt; + } + } + } + } + if ( cnt==0 ) + break; + if ( !doit ) + ret = galloc((cnt+2)*sizeof(struct charone *)); + else { + rcnt = cnt; + /* If lower case i is used, and it's a composite, then use */ + /* dotlessi instead */ /* could do the same for dotless j */ + if ( iswidth ) { + ReplaceGlyphWith(sf,ret,cnt,'i',0x131); + ReplaceGlyphWith(sf,ret,cnt,'j',0xf6be); + } + + if ( iswidth && /* I always want 'I' in the character list when doing widths */ + /* or at least when doing widths of LGC alphabets where */ + /* concepts like serifs make sense */ + (( ret[0]->sc->unicodeenc>='A' && ret[0]->sc->unicodeenc<0x530) || + ( ret[0]->sc->unicodeenc>=0x1d00 && ret[0]->sc->unicodeenc<0x2000)) ) { + + for ( s=0; ssc->unicodeenc=='I' ) + break; + if ( s==cnt ) { + i = SFFindExistingChar(sf,'I',NULL); + if ( i!=-1 && sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) + ret[cnt++] = MakeCharOne(sf->chars[i]); + else + s = -1; + } + *ipos = s; + } + ret[cnt] = NULL; + } + } + *tot = cnt; + *rtot = rcnt; +return( ret ); +} + +struct kernsets { + unichar_t *ch1; + int max, cur; + unichar_t **ch2s; /* first level array is same dim as ch1 */ +}; + +static unichar_t *ugetstr(FILE *file,int format,unichar_t *buffer,int len) { + int ch, ch2; + unichar_t *upt = buffer; + + if ( format==0 ) { + while ( (ch=getc(file))!='\n' && ch!='\r' && ch!=EOF ) { + if ( uptcur && buffer[0]>ks->ch1[i]; ++i ); + if ( i>=ks->cur || buffer[0]!=ks->ch1[i] ) { + if ( ks->cur+1>=ks->max ) { + ks->max += 100; + if ( ks->cur==0 ) { + ks->ch1 = galloc(ks->max*sizeof(unichar_t)); + ks->ch2s = galloc(ks->max*sizeof(unichar_t *)); + } else { + ks->ch1 = grealloc(ks->ch1,ks->max*sizeof(unichar_t)); + ks->ch2s = grealloc(ks->ch2s,ks->max*sizeof(unichar_t *)); + } + } + for ( j=ks->cur; j>i; --j ) { + ks->ch1[j] = ks->ch1[j-1]; + ks->ch2s[j] = ks->ch2s[j-1]; + } + ks->ch1[i] = buffer[0]; + ks->ch2s[i] = galloc(50*sizeof(unichar_t)); + ks->ch2s[i][0] = '\0'; + ++ks->cur; + } + if ( (u_strlen(ks->ch2s[i])+1)%50 == 0 ) + ks->ch2s[i] = grealloc(ks->ch2s[i],(u_strlen(ks->ch2s[i])+50)*sizeof(unichar_t)); + for ( j=0 ; ks->ch2s[i][j]!=0 && buffer[1]>ks->ch2s[i][j]; ++j ); + if ( ks->ch2s[i][j]!=buffer[1] ) { + for ( k=u_strlen(ks->ch2s[i])+1; k>j; --k ) + ks->ch2s[i][k] = ks->ch2s[i][k-1]; + ks->ch2s[i][j] = buffer[1]; + } +} + +static void ScriptSerifChecker(WidthInfo *wi) { + /* If not LGC (latin, greek, cyrillic) then ignore serif checks */ + /* What about letterlike-symbols? */ + if (( wi->left[0]->sc->unicodeenc>='A' && wi->left[0]->sc->unicodeenc<0x530) || + ( wi->left[0]->sc->unicodeenc>=0x1d00 && wi->left[0]->sc->unicodeenc<0x2000)) { + /* They are working with letters where serif checks are reasonable */ + } else { + wi->serifsize = wi->seriflength = 0; + wi->serifs[0][0] = wi->serifs[0][1] = NOTREACHED; + wi->serifs[1][0] = wi->serifs[1][1] = NOTREACHED; + wi->serifs[2][0] = wi->serifs[2][1] = NOTREACHED; + wi->serifs[3][0] = wi->serifs[3][1] = NOTREACHED; + } +} + +static int figurekernsets(WidthInfo *wi,struct kernsets *ks) { + int i,j,k,cnt,lcnt,max; + unichar_t *ch2s; + unichar_t *cpt, *upt; + struct charpair *cp; + SplineFont *sf = wi->sf; + + if ( ks->cur==0 ) +return( false ); + + wi->left = galloc((ks->cur+1)*sizeof(struct charone *)); + for ( i=cnt=0; icur; ++i ) { + j = SFFindExistingChar(sf,ks->ch1[i],NULL); + if ( j!=-1 && sf->chars[j]!=NULL && + (sf->chars[j]->layers[ly_fore].splines!=NULL || sf->chars[j]->layers[ly_fore].refs!=NULL )) + wi->left[cnt++] = MakeCharOne(sf->chars[j]); + else + ks->ch1[i] = '\0'; + } + wi->lcnt = cnt; + wi->left[cnt] = NULL; + if ( cnt==0 ) { + free(wi->left); wi->left = NULL; +return( false ); + } + + for ( i=max=0; icur; ++i ) + if ( ks->ch1[i]!='\0' ) + max += u_strlen(ks->ch2s[i]); + ch2s = galloc((max+1)*sizeof(unichar_t)); + for ( i=0; icur && ks->ch1[i]=='\0'; ++i ); + u_strcpy(ch2s,ks->ch2s[i]); + for ( ++i; icur; ++i ) if ( ks->ch1[i]!='\0' ) { + for ( upt=ks->ch2s[i]; *upt!='\0'; ++upt ) { + for ( cpt = ch2s; *cpt!='\0' && *upt<*cpt; ++cpt ); + if ( *cpt==*upt ) /* already listed */ + continue; + for ( k=u_strlen(cpt)+1; k>0; --k ) + cpt[k] = cpt[k-1]; + *cpt = *upt; + } + } + + wi->right = galloc((u_strlen(ch2s)+1)*sizeof(struct charone *)); + for ( cnt=0,cpt=ch2s; *cpt ; ++cpt ) { + j = SFFindExistingChar(sf,*cpt,NULL); + if ( j!=-1 && sf->chars[j]!=NULL && + (sf->chars[j]->layers[ly_fore].splines!=NULL || sf->chars[j]->layers[ly_fore].refs!=NULL )) + wi->right[cnt++] = MakeCharOne(sf->chars[j]); + } + wi->rcnt = cnt; + wi->right[cnt] = NULL; + free( ch2s ); + if ( cnt==0 ) { + free(wi->left); wi->left = NULL; + free(wi->right); wi->right = NULL; +return( false ); + } + ScriptSerifChecker(wi); + + wi->pairs = galloc(max*sizeof(struct charpair *)); + for ( i=lcnt=cnt=0; icur; ++i ) if ( ks->ch1[i]!='\0' ) { + for ( cpt=ks->ch2s[i]; *cpt; ++cpt ) { + for ( j=0; jrcnt && wi->right[j]->sc->unicodeenc!=*cpt; ++j ); + if ( jrcnt ) { + wi->pairs[cnt++] = cp = gcalloc(1,sizeof(struct charpair)); + cp->left = wi->left[lcnt]; + cp->right = wi->right[j]; + cp->nextasleft = cp->left->asleft; + cp->left->asleft = cp; + cp->nextasright = cp->right->asright; + cp->right->asright = cp; + } + } + ++lcnt; + } + wi->pcnt = cnt; +return( true ); +} + +static void kernsetsfree(struct kernsets *ks) { + int i; + + for ( i=0; icur; ++i ) + free(ks->ch2s[i]); + free(ks->ch2s); + free(ks->ch1); +} + +static int ReadKernPairFile(unichar_t *fn,WidthInfo *wi) { + char *filename; + FILE *file; + int ch, format=0; + unichar_t buffer[300]; + struct kernsets ks; + + filename = u2def_copy(fn); + free(fn); + file = fopen(filename,"r"); + if ( file==NULL ) { + GWidgetErrorR(_STR_CouldNotOpenFile, _STR_CouldNotOpenFileName, filename ); + free( filename ); +return( false ); + } + + ch = getc(file); + if ( ch==0xff || ch==0xfe ) { + int ch2 = getc(file); + if ( ch==0xfe && ch2==0xff ) + format = 1; /* normal ucs2 */ + else if ( ch==0xff && ch2==0xfe ) + format = 2; /* byte-swapped ucs2 */ + else + rewind(file); + } else + ungetc(ch,file); + + memset(&ks,0,sizeof(ks)); + while ( ugetstr(file,format,buffer,sizeof(buffer)/sizeof(buffer[0]))!=NULL ) + parsekernstr(buffer,&ks); + + fclose(file); + if ( !figurekernsets(wi,&ks)) { + GWidgetErrorR(_STR_NoKernPairs, _STR_NoKernPairsFile, filename ); + free( filename ); + kernsetsfree(&ks); +return( false ); + } + kernsetsfree(&ks); + free( filename ); +return( true ); +} + +static int AW_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + WidthInfo *wi = GDrawGetUserData(gw); + int err = false; + int tot; + + wi->spacing = GetRealR(gw,CID_Spacing, _STR_Spacing,&err); + if ( wi->autokern ) { + wi->threshold = GetIntR(gw,CID_Threshold, _STR_Threshold, &err); + tot = GetIntR(gw,CID_Total, _STR_TotalKerns, &err); + if ( tot<0 ) tot = 0; + } + if ( err ) +return( true ); + + old_sf = wi->sf; + old_spaceguess = wi->spacing; + + wi->done = true; + GDrawSetVisible(gw,false); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + + if ( GGadgetGetCid(g)==CID_OK ) { + wi->left = BuildCharList(wi->sf,gw,CID_Left, &wi->lcnt, &wi->real_lcnt, &wi->l_Ipos, !wi->autokern ); + wi->right = BuildCharList(wi->sf,gw,CID_Right, &wi->rcnt, &wi->real_rcnt, &wi->r_Ipos, !wi->autokern ); + if ( wi->real_lcnt==0 || wi->real_rcnt==0 ) { + FreeCharList(wi->left); + FreeCharList(wi->right); + GWidgetErrorR(_STR_NoCharsSelected,_STR_NoCharsSelected); +return( true ); + } + ScriptSerifChecker(wi); + InitCharPairs(wi); + } else { + static unichar_t filter[] = { '*','.','t', 'x', 't', '\0' }; + unichar_t *fn = GWidgetOpenFile(GStringGetResource(_STR_LoadKernPairs,NULL), NULL, filter, NULL,NULL); + if ( fn==NULL ) { + GDrawSetVisible(gw,true); + wi->done = false; +return( true ); + } + if ( !ReadKernPairFile(fn,wi)) { + GDrawSetVisible(gw,true); + wi->done = false; +return( true ); + } + } + BuildCharPairs(wi); + if ( wi->autokern ) { + AutoKern(wi); + KernRemoveBelowThreshold(wi->sf,KernThreshold(wi->sf,tot)); + } else + AutoWidth(wi); + FreeCharList(wi->left); + FreeCharList(wi->right); + FreeCharPairs(wi->pairs,wi->pcnt); + } +return( true ); +} + +static int AW_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + WidthInfo *wi = GDrawGetUserData(gw); + wi->done = true; + } +return( true ); +} + +static int AW_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + WidthInfo *wi = GDrawGetUserData(gw); + wi->done = true; + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + WidthInfo *wi = GDrawGetUserData(gw); + help(wi->autokern?"autowidth.html#AutoKern":"autowidth.html#AutoWidth"); +return( true ); + } +return( false ); + } +return( true ); +} + +#define SelHeight 34 +static int MakeSelGadgets(GGadgetCreateData *gcd, GTextInfo *label, + int i, int base, int labr, int y, int pixel_width, GWindow gw, + int toomany, int autokern ) { + int std = !autokern ? _STR_StdCharRange : + base==CID_Left ? _STR_StdCharRangeKernL : + _STR_StdCharRangeKernR; + int epos; + + label[i].text = (unichar_t *) labr; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 12; gcd[i].gd.pos.y = y; + gcd[i].gd.flags = gg_visible | gg_enabled; + gcd[i++].creator = GLabelCreate; + + label[i].text = (unichar_t *) std; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 12; gcd[i].gd.pos.y = y+14; + gcd[i].gd.flags = gg_visible | gg_enabled; + gcd[i].gd.u.list = !autokern ? widthlist : base==CID_Left ? kernllist : kernrlist; + gcd[i].gd.cid = base; + gcd[i++].creator = GListFieldCreate; + + for ( epos = 0; gcd[i-1].gd.u.list[epos].text!=NULL; ++epos ); + gcd[i-1].gd.u.list[epos-2].disabled = (toomany&1); + gcd[i-1].gd.u.list[epos-1].disabled = (toomany&2)?1:0; +return( i ); +} + +static int SFCount(SplineFont *sf) { + int i, cnt; + + for ( i=cnt=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) + ++cnt; +return( cnt ); +} + +static int SFCountSel(SplineFont *sf) { + int i, cnt; + uint8 *sel = sf->fv->selected; + + for ( i=cnt=0; icharcnt; ++i ) + if ( sel[i] && sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) + ++cnt; +return( cnt ); +} + +static void AutoWKDlg(SplineFont *sf,int autokern) { + WidthInfo wi; + GWindow gw; + GWindowAttrs wattrs; + GRect pos; + GGadgetCreateData gcd[29]; + GTextInfo label[29]; + int i, y, selfield; + char buffer[30], buffer2[30]; + int selcnt = SFCountSel(sf); + int toomany = ((SFCount(sf)>=300)?1:0) | ((selcnt==0 || selcnt>=300)?2:0); + + memset(&wi,'\0',sizeof(wi)); + wi.autokern = autokern; + wi.sf = sf; + FindFontParameters(&wi); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<ascent+sf->descent)/25 ); + label[i].text = (unichar_t *) buffer2; + label[i].text_is_1byte = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 65; gcd[i].gd.pos.y = y+3; + gcd[i].gd.flags = gg_visible | gg_enabled; + gcd[i].gd.cid = CID_Threshold; + gcd[i++].creator = GTextFieldCreate; + y += 32; + } + + if ( autokern ) { + gcd[i].gd.pos.width = 80; gcd[i].gd.pos.height = 0; + gcd[i].gd.pos.x = (200-gcd[i].gd.pos.width)/2; gcd[i].gd.pos.y = y; + gcd[i].gd.flags = gg_visible | gg_enabled; + label[i].text = (unichar_t *) _STR_Browse; + label[i].text_in_resource = true; + gcd[i].gd.mnemonic = 'B'; + gcd[i].gd.label = &label[i]; + gcd[i].gd.handle_controlevent = AW_OK; /* Yes, really */ + gcd[i].gd.popup_msg = GStringGetResource(_STR_KernPairFilePopup,NULL); + gcd[i].gd.cid = CID_Browse; + gcd[i++].creator = GButtonCreate; + y += 32; + } + + gcd[i].gd.pos.x = 30-3; gcd[i].gd.pos.y = y-3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.mnemonic = 'O'; + gcd[i].gd.label = &label[i]; + gcd[i].gd.handle_controlevent = AW_OK; + gcd[i].gd.cid = CID_OK; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -30; gcd[i].gd.pos.y = y; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.mnemonic = 'C'; + gcd[i].gd.handle_controlevent = AW_Cancel; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = GDrawPointsToPixels(gw,2); + gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[i++].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + + GWidgetIndicateFocusGadget(gcd[selfield].ret); + GTextFieldSelect(gcd[selfield].ret,0,-1); + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !wi.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); +} + +void FVAutoKern(FontView *fv) { + AutoWKDlg(fv->sf,true); +} + +void FVAutoWidth(FontView *fv) { + AutoWKDlg(fv->sf,false); +} + +void FVRemoveKerns(FontView *fv) { + int i; + SplineChar *sc; + int changed = false; + MetricsView *mv; + + KernClassListFree(fv->sf->kerns); fv->sf->kerns = NULL; + + for ( i=0; isf->charcnt; ++i ) if ( (sc = fv->sf->chars[i])!=NULL ) { + if ( sc->kerns!=NULL ) { + changed = true; + KernPairsFree(sc->kerns); + sc->kerns = NULL; + } + } + if ( changed ) { + fv->sf->changed = true; + for ( mv=fv->metrics; mv!=NULL; mv=mv->next ) + MVReKern(mv); + } +} + +void FVRemoveVKerns(FontView *fv) { + int i; + SplineChar *sc; + int changed = false; + MetricsView *mv; + + KernClassListFree(fv->sf->vkerns); fv->sf->vkerns = NULL; + + for ( i=0; isf->charcnt; ++i ) if ( (sc = fv->sf->chars[i])!=NULL ) { + if ( sc->vkerns!=NULL ) { + changed = true; + KernPairsFree(sc->vkerns); + sc->vkerns = NULL; + } + } + if ( changed ) { + fv->sf->changed = true; + for ( mv=fv->metrics; mv!=NULL; mv=mv->next ) + MVReKern(mv); + } +} + +static SplineChar *SCHasVertVariant(SplineChar *sc) { + PST *pst; + + if ( sc==NULL ) +return( NULL ); + + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_substitution && + (pst->tag==CHR('v','e','r','t') || pst->tag==CHR('v','r','t','2'))) { +return( SFGetCharDup(sc->parent,-1,pst->u.subs.variant)); + } + } +return( NULL ); +} + +static SplineChar **CharNamesToVertSC(SplineFont *sf,char *names ) { + char *pt, *end, ch; + int cnt; + SplineChar **list; + + if ( names==NULL || *names=='\0' ) +return( NULL ); + cnt=1; + for ( pt=names; (pt=strchr(pt,' '))!=NULL; ++pt ) + ++cnt; + list = gcalloc(cnt+1,sizeof(SplineChar *)); + + cnt = 0; + for ( pt=names ; *pt ; pt = end ) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + end = strchr(pt,' '); + if ( end==NULL ) end = pt+strlen(pt); + ch = *end; *end = '\0'; + list[cnt] = SCHasVertVariant( SFGetChar(sf,-1,pt)); + *end = ch; + if ( list[cnt]!=NULL ) + ++cnt; + } + if ( cnt==0 ) { + free(list); + list = NULL; + } +return( list ); +} + +static char *SCListToName(SplineChar **sclist) { + int i, len; + char *names, *pt; + + for ( i=len=0; sclist[i]!=NULL; ++i ) + len += strlen(sclist[i]->name)+1; + names = pt = galloc(len+1); + *pt = '\0'; + for ( i=0; sclist[i]!=NULL; ++i ) { + strcat(pt,sclist[i]->name); + strcat(pt," "); + pt += strlen(pt); + } + if ( pt>names ) pt[-1] = '\0'; +return( names ); +} + +void FVVKernFromHKern(FontView *fv) { + int i,j; + KernPair *kp, *vkp; + SplineChar *sc1, *sc2; + KernClass *kc, *vkc; + SplineChar ***firsts, ***seconds; + int any1, any2; + SplineFont *sf = fv->sf; + int *map1, *map2; + + FVRemoveVKerns(fv); + if ( !sf->hasvmetrics ) +return; + + for ( i=0; icharcnt; ++i ) { + if ( (sc1 = SCHasVertVariant(sf->chars[i]))!=NULL ) { + for ( kp = sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) { + if ( (sc2 = SCHasVertVariant(kp->sc))!=NULL ) { + vkp = chunkalloc(sizeof(KernPair)); + *vkp = *kp; + vkp->sc = sc2; + vkp->next = sc1->vkerns; + sc1->vkerns = vkp; + } + } + } + } + + for ( kc = sf->kerns; kc!=NULL; kc=kc->next ) { + firsts = galloc(kc->first_cnt*sizeof(SplineChar *)); + map1 = gcalloc(kc->first_cnt,sizeof(int)); + seconds = galloc(kc->second_cnt*sizeof(SplineChar *)); + map2 = gcalloc(kc->second_cnt,sizeof(int)); + any1=0; + for ( i=1; ifirst_cnt; ++i ) { + if ( (firsts[i] = CharNamesToVertSC(sf,kc->firsts[i]))!=NULL ) + map1[i] = ++any1; + } + any2 = 0; + for ( i=1; isecond_cnt; ++i ) { + if ((seconds[i] = CharNamesToVertSC(sf,kc->seconds[i]))!=NULL ) + map2[i] = ++any2; + } + if ( any1 && any2 ) { + vkc = chunkalloc(sizeof(KernClass)); + *vkc = *kc; + vkc->next = sf->vkerns; + sf->vkerns = vkc; + vkc->first_cnt = any1+1; + vkc->second_cnt = any2+1; + vkc->firsts = gcalloc(any1+1,sizeof(char *)); + for ( i=0; ifirst_cnt; ++i ) if ( map1[i]!=0 ) + vkc->firsts[map1[i]] = SCListToName(firsts[i]); + vkc->seconds = gcalloc(any2+1,sizeof(char *)); + for ( i=0; isecond_cnt; ++i ) if ( map2[i]!=0 ) + vkc->seconds[map2[i]] = SCListToName(seconds[i]); + vkc->offsets = gcalloc((any1+1)*(any2+1),sizeof(int16)); + for ( i=0; ifirst_cnt; ++i ) if ( map1[i]!=0 ) { + for ( j=0; jsecond_cnt; ++j ) if ( map2[j]!=0 ) { + vkc->offsets[map1[i]*vkc->second_cnt+map2[j]] = + kc->offsets[i*kc->second_cnt+j]; + } + } + } + free(map1); + free(map2); + for ( i=1; ifirst_cnt; ++i ) + free(firsts[i]); + for ( i=1; isecond_cnt; ++i ) + free(seconds[i]); + free(firsts); + free(seconds); + } +} + +/* Scripting hooks */ + +static struct charone **autowidthBuildCharList(SplineFont *sf, + int *tot, int *rtot, int *ipos, int iswidth) { + int i, cnt, doit, s; + struct charone **ret=NULL; + + for ( doit=0; doit<2; ++doit ) { + for ( i=cnt=0; icharcnt && cnt<300; ++i ) { + if ( sf->fv->selected[i] && sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) { + if ( doit ) + ret[cnt++] = MakeCharOne(sf->chars[i]); + else + ++cnt; + } + } + + if ( !doit ) + ret = galloc((cnt+2)*sizeof(struct charone *)); + else { + *rtot = cnt; + if ( iswidth && /* I always want 'I' in the character list when doing widths */ + /* or at least when doing widths of LGC alphabets where */ + /* concepts like serifs make sense */ + (( ret[0]->sc->unicodeenc>='A' && ret[0]->sc->unicodeenc<0x530) || + ( ret[0]->sc->unicodeenc>=0x1d00 && ret[0]->sc->unicodeenc<0x2000)) ) { + for ( s=0; ssc->unicodeenc=='I' ) + break; + if ( s==cnt ) { + i = SFFindExistingChar(sf,'I',NULL); + if ( i!=-1 && sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL )) + ret[cnt++] = MakeCharOne(sf->chars[i]); + else + s = -1; + } + *ipos = s; + } + ret[cnt] = NULL; + } + } + *tot = cnt; + return( ret ); +} + +int AutoWidthScript(SplineFont *sf,int spacing) { + WidthInfo wi; + + memset(&wi,'\0',sizeof(wi)); + wi.autokern = 0; + wi.sf = sf; + FindFontParameters(&wi); + if ( spacing>-(sf->ascent+sf->descent) ) + wi.spacing = spacing; + + wi.left = autowidthBuildCharList(wi.sf, &wi.lcnt, &wi.real_lcnt, &wi.l_Ipos, true ); + wi.right = autowidthBuildCharList(wi.sf, &wi.rcnt, &wi.real_rcnt, &wi.r_Ipos, true ); + if ( wi.real_lcnt==0 || wi.real_rcnt==0 ) { + FreeCharList(wi.left); + FreeCharList(wi.right); +return( 0 ); + } + ScriptSerifChecker(&wi); + wi.done = true; + InitCharPairs(&wi); + BuildCharPairs(&wi); + AutoWidth(&wi); + FreeCharList(wi.left); + FreeCharList(wi.right); + FreeCharPairs(wi.pairs,wi.lcnt*wi.rcnt); +return( true ); +} + +int AutoKernScript(SplineFont *sf,int spacing, int threshold,char *kernfile) { + WidthInfo wi; + + memset(&wi,'\0',sizeof(wi)); + wi.autokern = 1; + wi.sf = sf; + FindFontParameters(&wi); + if ( spacing>-(sf->ascent+sf->descent) ) + wi.spacing = spacing; + wi.threshold = threshold; + + if ( kernfile==NULL ) { + wi.left = autowidthBuildCharList(wi.sf, &wi.lcnt, &wi.real_lcnt, &wi.l_Ipos, false ); + wi.right = autowidthBuildCharList(wi.sf, &wi.rcnt, &wi.real_rcnt, &wi.r_Ipos, false ); + if ( wi.lcnt==0 || wi.rcnt==0 ) { + FreeCharList(wi.left); + FreeCharList(wi.right); +return( false ); + } + ScriptSerifChecker(&wi); + InitCharPairs(&wi); + } else { + if ( !ReadKernPairFile(uc_copy(kernfile),&wi)) +return( false ); + } + wi.done = true; + BuildCharPairs(&wi); + AutoKern(&wi); + KernRemoveBelowThreshold(wi.sf,KernThreshold(wi.sf,0)); + FreeCharList(wi.left); + FreeCharList(wi.right); + FreeCharPairs(wi.pairs,wi.lcnt*wi.rcnt); +return( true ); +} diff --git a/fontforge/bitmapdlg.c b/fontforge/bitmapdlg.c new file mode 100644 index 00000000..d212cfb6 --- /dev/null +++ b/fontforge/bitmapdlg.c @@ -0,0 +1,770 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "gwidget.h" +#include "ustring.h" +#include +#include + +static int oldusefreetype=1; +int oldsystem=0 /* X */; + +typedef struct createbitmapdata { + unsigned int done: 1; + FontView *fv; + SplineFont *sf; + SplineChar *sc; + int isavail; + int which; + GWindow gw; +} CreateBitmapData; + +enum { bd_all, bd_selected, bd_current }; +static GTextInfo which[] = { + { (unichar_t *) _STR_AllChars, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_SelChars, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_CurChar, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { NULL }}; +static int lastwhich = bd_selected; + +static void RemoveBDFWindows(BDFFont *bdf) { + int i; + BitmapView *bv, *next; + + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + for ( bv = bdf->chars[i]->views; bv!=NULL; bv=next ) { + next = bv->next; + GDrawDestroyWindow(bv->gw); + } + } + if ( screen_display!=NULL ) { + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + /* Just in case... */ + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } + /* We can't free the bdf until all the windows have executed their destroy*/ + /* routines (which they will when they get the destroy window event) */ + /* because those routines depend on the bdf existing ... */ +} + +void SFOrderBitmapList(SplineFont *sf) { + BDFFont *bdf, *prev, *next; + BDFFont *bdf2, *prev2; + + for ( prev = NULL, bdf=sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + for ( prev2=NULL, bdf2=bdf->next; bdf2!=NULL; bdf2 = bdf2->next ) { + if ( bdf->pixelsize>bdf2->pixelsize || + (bdf->pixelsize==bdf2->pixelsize && BDFDepth(bdf)>BDFDepth(bdf2)) ) { + if ( prev==NULL ) + sf->bitmaps = bdf2; + else + prev->next = bdf2; + if ( prev2==NULL ) { + bdf->next = bdf2->next; + bdf2->next = bdf; + } else { + next = bdf->next; + bdf->next = bdf2->next; + bdf2->next = next; + prev2->next = bdf; + } + next = bdf; + bdf = bdf2; + bdf2 = next; + } + prev2 = bdf2; + } + prev = bdf; + } +} + +static void SFRemoveUnwantedBitmaps(SplineFont *sf,int32 *sizes) { + BDFFont *bdf, *prev, *next; + FontView *fv; + int i; + + for ( prev = NULL, bdf=sf->bitmaps; bdf!=NULL; bdf = next ) { + next = bdf->next; + for ( i=0; sizes[i]!=0 && ((sizes[i]&0xffff)!=bdf->pixelsize || (sizes[i]>>16)!=BDFDepth(bdf)); ++i ); + if ( sizes[i]==0 ) { + /* To be deleted */ + if ( prev==NULL ) + sf->bitmaps = next; + else + prev->next = next; + for ( fv=sf->fv; fv!=NULL; fv=fv->nextsame ) { + if ( fv->show==bdf ) { + if ( sf->onlybitmaps ) + FVChangeDisplayBitmap(fv,sf->bitmaps); + else + FVShowFilled(sf->fv); + } + } + RemoveBDFWindows(bdf); + BDFFontFree(bdf); + sf->changed = true; + } else { + sizes[i] = -sizes[i]; /* don't need to create it */ + prev = bdf; + } + } +} + +static void SFFigureBitmaps(SplineFont *sf,int32 *sizes,int usefreetype) { + BDFFont *bdf; + int i, first; + void *freetypecontext = NULL; + + SFRemoveUnwantedBitmaps(sf,sizes); + + first = true; + for ( i=0; sizes[i]!=0 ; ++i ) if ( sizes[i]>0 ) { + if ( first && autohint_before_rasterize ) + SplineFontAutoHint(sf); + if ( first && usefreetype ) + freetypecontext = FreeTypeFontContext(sf,NULL,NULL); + if ( freetypecontext ) + bdf = SplineFontFreeTypeRasterize(freetypecontext,sizes[i]&0xffff,sizes[i]>>16); + else + bdf = SplineFontAntiAlias(sf,sizes[i]&0xffff,1<<((sizes[i]>>16)/2)); + bdf->next = sf->bitmaps; + sf->bitmaps = bdf; + sf->changed = true; + first = false; + } + if ( freetypecontext ) + FreeTypeFreeContext(freetypecontext); + + /* Order the list */ + SFOrderBitmapList(sf); +} + +static void FVScaleBitmaps(FontView *fv,int32 *sizes) { + BDFFont *bdf, *scale; + int i, cnt=0, warned = false; + + for ( i=0; sizes[i]!=0 ; ++i ) if ( sizes[i]>0 ) + ++cnt; + scale = fv->show; + if ( scale->clut!=NULL ) + for ( scale = fv->sf->bitmaps; scale->next!=NULL; scale=scale->next ); + GProgressStartIndicatorR(10,_STR_ScalingBitmaps,_STR_ScalingBitmaps,0,cnt,1); + + for ( i=0; sizes[i]!=0 ; ++i ) if ( sizes[i]>0 && (sizes[i]>>16)==1 ) { + bdf = BitmapFontScaleTo(scale,sizes[i]&0xffff); + if ( bdf==NULL ) + continue; + bdf->next = fv->sf->bitmaps; + fv->sf->bitmaps = bdf; + fv->sf->changed = true; + if ( !GProgressNext()) + break; + } else if ( sizes[i]>0 && (sizes[i]>>16)!=1 && !warned ) { + GWidgetErrorR(_STR_CantScaleGreymap,_STR_CantScaleGreymap); + warned = true; + } + GProgressEndIndicator(); + + /* Order the list */ + SFOrderBitmapList(fv->sf); + + SFRemoveUnwantedBitmaps(fv->sf,sizes); +} + +static void ReplaceBDFC(SplineFont *sf,int32 *sizes,int enc,void *freetypecontext) { + BDFFont *bdf; + BDFChar *bdfc, temp; + int i; + BitmapView *bv; + + if ( enc>=sf->charcnt || sf->chars[enc]==NULL ) +return; + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + for ( i=0; sizes[i]!=0 && (bdf->pixelsize!=(sizes[i]&0xffff) || BDFDepth(bdf)!=(sizes[i]>>16)); ++i ); + if ( sizes[i]!=0 ) { + if ( freetypecontext ) + bdfc = SplineCharFreeTypeRasterize(freetypecontext,enc,bdf->pixelsize,BDFDepth(bdf)); + else { + if ( autohint_before_rasterize && + sf->chars[enc]->changedsincelasthinted && + !sf->chars[enc]->manualhints ) + SplineCharAutoHint(sf->chars[enc],true); + bdfc = SplineCharAntiAlias(sf->chars[enc],bdf->pixelsize,(1<<(BDFDepth(bdf)/2))); + } + if ( bdf->chars[enc]==NULL ) + bdf->chars[enc] = bdfc; + else { + temp = *(bdf->chars[enc]); + *bdf->chars[enc] = *bdfc; + *bdfc = temp; + bdf->chars[enc]->views = bdfc->views; + bdfc->views = NULL; + BDFCharFree(bdfc); + for ( bv = bdf->chars[enc]->views; bv!=NULL; bv=bv->next ) { + GDrawRequestExpose(bv->v,NULL,false); + /* Mess with selection?????!!!!! */ + } + } + } + } +} + +static int FVRegenBitmaps(CreateBitmapData *bd,int32 *sizes,int usefreetype) { + FontView *fv = bd->fv; + SplineFont *sf = bd->sf, *subsf; + int i,j; + BDFFont *bdf; + void *freetypecontext=NULL; + + for ( i=0; sizes[i]!=0; ++i ) { + for ( bdf = sf->bitmaps; bdf!=NULL && + (bdf->pixelsize!=(sizes[i]&0xffff) || BDFDepth(bdf)!=(sizes[i]>>16)); + bdf=bdf->next ); + if ( bdf==NULL ) { + unichar_t temp[100]; + char buffer[10]; + u_strcpy(temp,GStringGetResource(_STR_BadRegenSize,NULL)); + if ( (sizes[i]>>16)==1 ) + sprintf(buffer,"%d", sizes[i]&0xffff); + else + sprintf(buffer,"%d@%d", sizes[i]&0xffff, sizes[i]>>16); + uc_strcat(temp,buffer); + GWidgetPostNotice(temp,temp); +return( false ); + } + } + if ( bd->which==bd_current && bd->sc!=NULL ) { + if ( usefreetype ) + freetypecontext = FreeTypeFontContext(bd->sc->parent,bd->sc,fv); + ReplaceBDFC(bd->sc->parent,sizes,bd->sc->enc,freetypecontext); + if ( freetypecontext ) + FreeTypeFreeContext(freetypecontext); + } else { + if ( sf->subfontcnt!=0 ) { + for ( j=0 ; jsubfontcnt; ++j ) { + subsf = sf->subfonts[j]; + for ( i=0; icharcnt; ++i ) { + if (( fv->selected[i] || bd->which == bd_all ) && + SCWorthOutputting(subsf->chars[i])) { + if ( usefreetype && freetypecontext==NULL ) + freetypecontext = FreeTypeFontContext(subsf,NULL,fv); + ReplaceBDFC(subsf,sizes,i,freetypecontext); + } + } + if ( freetypecontext ) + FreeTypeFreeContext(freetypecontext); + freetypecontext = NULL; + } + } else { + for ( i=0; icharcnt; ++i ) { + if ( fv->selected[i] || bd->which == bd_all ) { + if ( usefreetype && freetypecontext==NULL ) + freetypecontext = FreeTypeFontContext(sf,NULL,fv); + ReplaceBDFC(sf,sizes,i,freetypecontext); + } + } + if ( freetypecontext ) + FreeTypeFreeContext(freetypecontext); + freetypecontext = NULL; + } + } + sf->changed = true; + if ( fv->show!=fv->filled ) { + for ( i=0; sizes[i]!=0 && ((sizes[i]&0xffff)!=fv->show->pixelsize || (sizes[i]>>16)!=BDFDepth(fv->show)); ++i ); + if ( sizes[i]!=0 && fv->v!=NULL ) + GDrawRequestExpose(fv->v,NULL,false ); + } +return( true ); +} + +#define CID_Which 1001 +#define CID_Pixel 1002 +#define CID_75 1003 +#define CID_100 1004 +#define CID_75Lab 1005 +#define CID_100Lab 1006 +#define CID_X 1007 +#define CID_Win 1008 +#define CID_Mac 1009 +#define CID_FreeType 1010 + +static int GetSystem(GWindow gw) { + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_X)) ) +return( CID_X ); + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_Win)) ) +return( CID_Win ); + +return( CID_Mac ); +} + +static int32 *ParseList(GWindow gw, int cid,int *err, int final) { + const unichar_t *val = _GGadgetGetTitle(GWidgetGetControl(gw,cid)), *pt; + unichar_t *end, *end2; + int i; + real *sizes; + int32 *ret; + int system = GetSystem(gw); + int scale; + + *err = false; + end2 = NULL; + for ( i=1, pt = val; (end = u_strchr(pt,',')) || (end2=u_strchr(pt,' ')); ++i ) { + if ( end!=NULL && end2!=NULL ) { + if ( end20 ) ++i; + if ( *end!=' ' && *end!=',' && *end!='\0' ) { + free(sizes); free(ret); + if ( final ) + ProtestR(_STR_PixelSizes); + *err = true; +return( NULL ); + } + while ( *end==' ' || *end==',' ) ++end; + pt = end; + } + sizes[i] = 0; ret[i] = 0; + + if ( cid==CID_75 ) { + scale = system==CID_X?75:system==CID_Win?96:72; + for ( i=0; sizes[i]!=0; ++i ) + ret[i] |= (int) rint(sizes[i]*scale/72); + } else if ( cid==CID_100 ) { + scale = system==CID_X?100:system==CID_Win?120:100; + for ( i=0; sizes[i]!=0; ++i ) + ret[i] |= (int) rint(sizes[i]*scale/72); + } else + for ( i=0; sizes[i]!=0; ++i ) + ret[i] |= (int) rint(sizes[i]); + free(sizes); +return( ret ); +} + +static void BitmapsDoIt(CreateBitmapData *bd,int32 *sizes,int usefreetype) { + + if ( bd->isavail && bd->sf->onlybitmaps && bd->sf->bitmaps!=NULL ) { + if ( sizes[0]!=0 ) + FVScaleBitmaps(bd->fv,sizes); + else { + GWidgetErrorR(_STR_CantDeleteAllBitmaps,_STR_CantDeleteAllBitmaps); +return; + } + } else if ( bd->isavail ) + SFFigureBitmaps(bd->sf,sizes,usefreetype); + else { + if ( !FVRegenBitmaps(bd,sizes,usefreetype)) + bd->done = false; + else + lastwhich = bd->which; + } + bd->done = true; +} + +static int CB_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + int err; + CreateBitmapData *bd = GDrawGetUserData(GGadgetGetWindow(g)); + int32 *sizes = ParseList(bd->gw, CID_Pixel,&err, true); + if ( err ) +return( true ); + oldusefreetype = GGadgetIsChecked(GWidgetGetControl(bd->gw,CID_FreeType)); + oldsystem = GetSystem(bd->gw)-CID_X; + if ( !bd->isavail ) + bd->which = GGadgetGetFirstListSelectedItem(GWidgetGetControl(bd->gw,CID_Which)); + BitmapsDoIt(bd,sizes,oldusefreetype); + free(sizes); + SavePrefs(); + } +return( true ); +} + +static int CB_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CreateBitmapData *bd = GDrawGetUserData(GGadgetGetWindow(g)); + bd->done = true; + } +return( true ); +} + +static unichar_t *GenText(int32 *sizes,real scale) { + int i; + char *cret, *pt; + unichar_t *uret; + + for ( i=0; sizes[i]!=0; ++i ); + pt = cret = galloc(i*10+1); + for ( i=0; sizes[i]!=0; ++i ) { + if ( pt!=cret ) *pt++ = ','; + sprintf(pt,"%.1f",(sizes[i]&0xffff)*scale ); + pt += strlen(pt); + if ( pt[-1]=='0' && pt[-2]=='.' ) { + pt -= 2; + *pt = '\0'; + } + if ( (sizes[i]>>16)!=1 ) { + sprintf(pt,"@%d", sizes[i]>>16 ); + pt += strlen(pt); + } + } + *pt = '\0'; + uret = uc_copy(cret); + free(cret); +return( uret ); +} + +static void _CB_TextChange(CreateBitmapData *bd, GGadget *g) { + int cid = (int) GGadgetGetCid(g); + unichar_t *val; + int err=false; + int32 *sizes = ParseList(bd->gw,cid,&err,false); + int ncid; + int system = GetSystem(bd->gw); + int scale; + + if ( err ) +return; + for ( ncid=CID_Pixel; ncid<=CID_100; ++ncid ) if ( ncid!=cid ) { + if ( ncid==CID_Pixel ) + scale = 72; + else if ( ncid==CID_75 ) + scale = system==CID_X?75: system==CID_Win?96 : 72; + else + scale = system==CID_X?100: system==CID_Win?120 : 100; + val = GenText(sizes,72./scale); + GGadgetSetTitle(GWidgetGetControl(bd->gw,ncid),val); + free(val); + } + free(sizes); +return; +} + +static int CB_TextChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + CreateBitmapData *bd = GDrawGetUserData(GGadgetGetWindow(g)); + _CB_TextChange(bd,g); + } +return( true ); +} + +static void _CB_SystemChange(CreateBitmapData *bd) { + int system = GetSystem(bd->gw); + GGadgetSetTitle(GWidgetGetControl(bd->gw,CID_75Lab), + GStringGetResource(system==CID_X?_STR_PointSizes75: + system==CID_Win?_STR_PointSizes96: + _STR_PointSizes72,NULL)); + GGadgetSetTitle(GWidgetGetControl(bd->gw,CID_100Lab), + GStringGetResource(system==CID_Win?_STR_PointSizes120: + _STR_PointSizes100,NULL)); + GGadgetSetEnabled(GWidgetGetControl(bd->gw,CID_100Lab),system!=CID_Mac); + GGadgetSetEnabled(GWidgetGetControl(bd->gw,CID_100),system!=CID_Mac); + _CB_TextChange(bd,GWidgetGetControl(bd->gw,CID_Pixel)); +} + +static int CB_SystemChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + CreateBitmapData *bd = GDrawGetUserData(GGadgetGetWindow(g)); + _CB_SystemChange(bd); + } +return( true ); +} + +static int bd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + CreateBitmapData *bd = GDrawGetUserData(gw); + bd->done = true; + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("elementmenu.html#Bitmaps"); +return( true ); + } +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +void BitmapDlg(FontView *fv,SplineChar *sc, int isavail) { + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[17]; + GTextInfo label[17]; + CreateBitmapData bd; + int i,j,y; + int32 *sizes; + BDFFont *bdf; + + bd.fv = fv; + bd.sc = sc; + bd.sf = fv->cidmaster ? fv->cidmaster : fv->sf; + bd.isavail = isavail; + bd.done = false; + + for ( bdf=bd.sf->bitmaps, i=0; bdf!=NULL; bdf=bdf->next, ++i ); + if ( i==0 && isavail ) + i = 2; + sizes = galloc((i+1)*sizeof(int32)); + for ( bdf=bd.sf->bitmaps, i=0; bdf!=NULL; bdf=bdf->next, ++i ) + sizes[i] = bdf->pixelsize | (BDFDepth(bdf)<<16); +/* + if ( i==0 && isavail ) { + sizes[i++] = 12.5; + sizes[i++] = 17; + } +*/ + sizes[i] = 0; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<onlybitmaps && bd.sf->bitmaps!=NULL ) + label[2].text = (unichar_t *) _STR_AddingSizeScale; + else + label[2].text = (unichar_t *) _STR_AddingSize; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 5; gcd[2].gd.pos.y = 5+26; + gcd[2].gd.flags = gg_enabled|gg_visible; + gcd[2].creator = GLabelCreate; + j = 3; y = 5+39+3; + } else { + label[0].text = (unichar_t *) _STR_SpecifyRegenSizes; + label[0].text_in_resource = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 5; + gcd[0].gd.flags = gg_enabled|gg_visible|gg_cb_on; + gcd[0].creator = GLabelCreate; + + if ( lastwhich==bd_current && sc==NULL ) + lastwhich = bd_selected; + gcd[1].gd.label = &which[lastwhich]; + gcd[1].gd.u.list = which; + gcd[1].gd.pos.x = 5; gcd[1].gd.pos.y = 5+13; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].gd.cid = CID_Which; + gcd[1].creator = GListButtonCreate; + which[bd_current].disabled = sc==NULL; + which[lastwhich].selected = true; + + j=2; y = 5+13+28; + } + + label[j].text = (unichar_t *) _STR_XSizes; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 10; gcd[j].gd.pos.y = y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_X; + gcd[j].gd.handle_controlevent = CB_SystemChange; + gcd[j++].creator = GRadioCreate; + + label[j].text = (unichar_t *) _STR_WinSizes; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 50; gcd[j].gd.pos.y = y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Win; + gcd[j].gd.handle_controlevent = CB_SystemChange; + gcd[j++].creator = GRadioCreate; + + label[j].text = (unichar_t *) _STR_MacSizes; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 90; gcd[j].gd.pos.y = y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Mac; + gcd[j].gd.handle_controlevent = CB_SystemChange; + gcd[j++].creator = GRadioCreate; + y += 26; + gcd[j-3+oldsystem].gd.flags |= gg_cb_on; + + label[j].text = (unichar_t *) _STR_PointSizes75; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_75Lab; + gcd[j++].creator = GLabelCreate; + y += 13; + + label[j].text = GenText(sizes,oldsystem==0?72./75.:oldsystem==1?72/96.:1.); + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 15; gcd[j].gd.pos.y = y; + gcd[j].gd.pos.width = 170; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_75; + gcd[j].gd.handle_controlevent = CB_TextChange; + gcd[j++].creator = GTextFieldCreate; + y += 26; + + label[j].text = (unichar_t *) _STR_PointSizes100; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_100Lab; + gcd[j++].creator = GLabelCreate; + y += 13; + + label[j].text = GenText(sizes,oldsystem==1?72./120.:72/100.); + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 15; gcd[j].gd.pos.y = y; + gcd[j].gd.pos.width = 170; + gcd[j].gd.flags = gg_enabled|gg_visible; + if ( oldsystem==2 ) + gcd[j].gd.flags = gg_visible; + gcd[j].gd.cid = CID_100; + gcd[j].gd.handle_controlevent = CB_TextChange; + gcd[j++].creator = GTextFieldCreate; + y += 26; + + label[j].text = (unichar_t *) _STR_PixelSizes; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j++].creator = GLabelCreate; + y += 13; + + label[j].text = GenText(sizes,1.); + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 15; gcd[j].gd.pos.y = y; + gcd[j].gd.pos.width = 170; + gcd[j].gd.flags = gg_enabled|gg_visible|gg_cb_on; + gcd[j].gd.cid = CID_Pixel; + gcd[j].gd.handle_controlevent = CB_TextChange; + gcd[j++].creator = GTextFieldCreate; + y += 26; + + label[j].text = (unichar_t *) _STR_UseFreeType; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 10; gcd[j].gd.pos.y = y; + if ( !hasFreeType() || bd.sf->onlybitmaps) + gcd[j].gd.flags = gg_visible; + else if ( oldusefreetype ) + gcd[j].gd.flags = gg_enabled|gg_visible|gg_cb_on; + else + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_FreeType; + gcd[j].gd.handle_controlevent = CB_SystemChange; + gcd[j++].creator = GCheckBoxCreate; + y += 26; + + gcd[j].gd.pos.x = 2; gcd[j].gd.pos.y = 2; + gcd[j].gd.pos.width = pos.width-4; + gcd[j].gd.pos.height = pos.height-4; + gcd[j].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels; + gcd[j++].creator = GGroupCreate; + + gcd[j].gd.pos.x = 20-3; gcd[j].gd.pos.y = 252-32-3; + gcd[j].gd.pos.width = -1; gcd[j].gd.pos.height = 0; + gcd[j].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[j].text = (unichar_t *) _STR_OK; + label[j].text_in_resource = true; + gcd[j].gd.mnemonic = 'O'; + gcd[j].gd.label = &label[j]; + gcd[j].gd.handle_controlevent = CB_OK; + gcd[j++].creator = GButtonCreate; + + gcd[j].gd.pos.x = -20; gcd[j].gd.pos.y = 252-32; + gcd[j].gd.pos.width = -1; gcd[j].gd.pos.height = 0; + gcd[j].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[j].text = (unichar_t *) _STR_Cancel; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.mnemonic = 'C'; + gcd[j].gd.handle_controlevent = CB_Cancel; + gcd[j++].creator = GButtonCreate; + + GGadgetsCreate(bd.gw,gcd); + which[lastwhich].selected = false; + _CB_SystemChange(&bd); + + GWidgetHidePalettes(); + GDrawSetVisible(bd.gw,true); + while ( !bd.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(bd.gw); +} + +int BitmapControl(FontView *fv,int32 *sizes,int isavail) { + CreateBitmapData bd; + + memset(&bd,0,sizeof(bd)); + bd.fv = fv; + bd.sf = fv->sf; + bd.isavail = isavail; + bd.which = bd_selected; + BitmapsDoIt(&bd,sizes,hasFreeType()); +return( bd.done ); +} diff --git a/fontforge/bitmapview.c b/fontforge/bitmapview.c new file mode 100644 index 00000000..d4bd29cf --- /dev/null +++ b/fontforge/bitmapview.c @@ -0,0 +1,1737 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include "nomen.h" +#include +#include +#include + +extern int _GScrollBar_Width; +extern struct lconv localeinfo; +extern char *coord_sep; +struct bvshows BVShows = { 1, 1, 1, 0 }; + +#define RPT_BASE 3 /* Place to draw the pointer icon */ +#define RPT_DATA 24 /* x,y text after above */ +#define RPT_COLOR 40 /* Blob showing the foreground color */ + +static void BVNewScale(BitmapView *bv) { + int fh = bv->bdf->ascent+bv->bdf->descent; + + GScrollBarSetBounds(bv->vsb,-2*fh*bv->scale,4*fh*bv->scale,bv->height); + GScrollBarSetBounds(bv->hsb,-3*fh*bv->scale,6*fh*bv->scale,bv->width); + GScrollBarSetPos(bv->vsb,bv->yoff); + GScrollBarSetPos(bv->hsb,bv->xoff); + + GDrawRequestExpose(bv->v,NULL,false); +} + +static void BVFit(BitmapView *bv) { + int left, right, top, bottom, hsc, wsc; + int fh = bv->bdf->ascent+bv->bdf->descent; + extern int palettes_docked; + int offset = palettes_docked ? 80 : 0; + + if ( offset>bv->width ) offset = 0; + + bottom = bv->bc->ymin; + top = bv->bc->ymax; + left = bv->bc->xmin; + right = bv->bc->xmax; + + if ( bottom>0 ) bottom = 0; + if ( left>0 ) left = 0; + if ( top==-1 && bottom==0 ) { /* Empty */ + top = bv->bdf->ascent; + bottom = -bv->bdf->descent; + if ( right==-1 ) right = fh; + } + if ( topbdf->pixelsize; + if ( right==0 ) right = bv->bdf->pixelsize; + wsc = (8*(bv->width-offset)) / (10*right); + hsc = (8*bv->height) / (10*top); + if ( wsc32 ) hsc = 32; + + bv->scale = hsc; + + bv->xoff = left+(bv->width-offset-right*bv->scale)/2 + offset; + bv->yoff = bottom + (bv->height-top*bv->scale)/2; + if ( bv->xoff<-3*fh*bv->scale ) bv->xoff = -3*fh*bv->scale; + if ( bv->yoff<-2*fh*bv->scale ) bv->yoff = -2*fh*bv->scale; + + BVNewScale(bv); +} + +static void BVUnlinkView(BitmapView *bv ) { + BitmapView *test; + + if ( bv->bc->views == bv ) { + bv->bc->views = bv->next; + } else { + for ( test=bv->bc->views; test->next!=bv && test->next!=NULL; test=test->next ); + if ( test->next==bv ) + test->next = bv->next; + } + if ( bv->bc->views==NULL ) { + /* We just got rid of the last view. Do a little clean up */ + /* compress the bitmap, and get rid of the floating selection */ + BCCompressBitmap(bv->bc); + BCFlattenFloat(bv->bc); + } +} + +static void BVRefreshImage(BitmapView *bv) { + GRect box; + + box.x = 0; box.width = bv->infoh; + box.y = bv->mbh; box.height = bv->infoh; + GDrawRequestExpose(bv->gw,&box,false); +} + +static void BCCharUpdate(BDFChar *bc) { + BitmapView *bv; + + for ( bv = bc->views; bv!=NULL; bv=bv->next ) { + GDrawRequestExpose(bv->v, NULL, false ); + /*BVRefreshImage(bv);*/ /* Select All gives us a blank image if we do this */ + } +} + +void BCCharChangedUpdate(BDFChar *bc) { + BDFFont *bdf; + BitmapView *bv; + int waschanged = bc->changed; + FontView *fv; + + bc->changed = true; + for ( bv = bc->views; bv!=NULL; bv=bv->next ) { + GDrawRequestExpose(bv->v, NULL, false ); + BVRefreshImage(bv); + } + + fv = bc->sc->parent->fv; + fv->sf->changed = true; + if ( fv->show!=fv->filled ) { + for ( bdf=fv->sf->bitmaps; bdf!=NULL && bdf->chars[bc->enc]!=bc; bdf=bdf->next ); + if ( bdf!=NULL ) { + FVRefreshChar(fv,bdf,bc->enc); + if ( fv->sf->onlybitmaps && !waschanged ) + FVToggleCharChanged(fv->sf->chars[bc->enc]); + } + } +} + +BDFChar *BDFMakeChar(BDFFont *bdf,int i) { + SplineFont *sf=bdf->sf; + SplineChar *sc; + BDFChar *bc; + + if ( sf->cidmaster!=NULL ) { + int j = SFHasCID(sf,i); + if ( j==-1 ) { + for ( j=0; jsubfontcnt; ++j ) + if ( isubfonts[j]->charcnt ) + break; + if ( j==sf->subfontcnt ) +return( NULL ); + } + sf = sf->subfonts[j]; + } + sc = SFMakeChar(sf,i); + if ( (bc = bdf->chars[i])==NULL ) { + bc = bdf->chars[i] = SplineCharRasterize(sc,bdf->pixelsize); + bc->enc = i; + } +return( bc ); +} + +static unichar_t *BVMakeTitles(BitmapView *bv, BDFChar *bc,unichar_t *ubuf) { + unichar_t *title; + SplineChar *sc; + BDFFont *bdf = bv->bdf; + + sc = bc->sc; + u_sprintf(ubuf,GStringGetResource(_STR_BvTitle,NULL), + sc==NULL ? sc->name : "", bc->enc, bdf->pixelsize, sc==NULL ? "" : sc->parent->fontname); + title = u_copy(ubuf); + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x110000 && _UnicodeNameAnnot!=NULL && + _UnicodeNameAnnot[sc->unicodeenc>>16][(sc->unicodeenc>>8)&0xff][sc->unicodeenc&0xff].name!=NULL ) { + uc_strcat(ubuf, " "); + uc_strcat(ubuf, _UnicodeNameAnnot[sc->unicodeenc>>16][(sc->unicodeenc>>8)&0xff][sc->unicodeenc&0xff].name); + } +return( title ); +} + +void BVChangeBC(BitmapView *bv, BDFChar *bc, int fitit ) { + unichar_t *title; + unichar_t ubuf[300]; + + BVUnlinkView(bv); + bv->bc = bc; + bv->next = bc->views; + bc->views = bv; + + if ( fitit ) + BVFit(bv); + else + BVNewScale(bv); + BVRefreshImage(bv); + + title = BVMakeTitles(bv,bc,ubuf); + GDrawSetWindowTitles(bv->gw,ubuf,title); + free(title); + + BVPaletteChangedChar(bv); +} + +static void BVChangeChar(BitmapView *bv, int i, int fitit ) { + BDFChar *bc; + BDFFont *bdf = bv->bdf; + + if ( i<0 || i>=bdf->charcnt ) +return; + bc = BDFMakeChar(bdf,i); + + if ( bc==NULL || bv->bc == bc ) +return; + BVChangeBC(bv,bc,fitit); +} + +static void BVDoClear(BitmapView *bv); +static void BVHScroll(BitmapView *bv,struct sbevent *sb); +static void BVVScroll(BitmapView *bv,struct sbevent *sb); + +void BVChar(BitmapView *bv, GEvent *event ) { + +#if _ModKeysAutoRepeat + /* Under cygwin these keys auto repeat, they don't under normal X */ + if ( bv->autorpt!=NULL ) { + GDrawCancelTimer(bv->autorpt); bv->autorpt = NULL; + if ( bv->keysym == event->u.chr.keysym ) /* It's an autorepeat, ignore it */ +return; + BVToolsSetCursor(bv,bv->oldstate,NULL); + } +#endif + + BVPaletteActivate(bv); + BVToolsSetCursor(bv,TrueCharState(event),NULL); + if ( event->u.chr.keysym=='s' && + (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) + MenuSaveAll(NULL,NULL,NULL); + else if ( !(event->u.chr.state&(ksm_control|ksm_meta)) && + event->u.chr.keysym == GK_BackSpace ) { + /* Menu does delete */ + BVDoClear(bv); + } else if ( event->u.chr.keysym == GK_Help ) { + MenuHelp(NULL,NULL,NULL); /* Menu does F1 */ + } else if ( event->u.chr.keysym == GK_Left || + event->u.chr.keysym == GK_Up || + event->u.chr.keysym == GK_Right || + event->u.chr.keysym == GK_Down || + event->u.chr.keysym == GK_KP_Left || + event->u.chr.keysym == GK_KP_Up || + event->u.chr.keysym == GK_KP_Right || + event->u.chr.keysym == GK_KP_Down || + event->u.chr.keysym == GK_KP_Home || + event->u.chr.keysym == GK_Home ) { + int xoff=0, yoff=0; + if ( event->u.chr.keysym == GK_Up || event->u.chr.keysym == GK_KP_Up ) + yoff = 1; + else if ( event->u.chr.keysym == GK_Down || event->u.chr.keysym == GK_KP_Down ) + yoff = -1; + else if ( event->u.chr.keysym == GK_Right || event->u.chr.keysym == GK_KP_Right ) + xoff = 1; + else if ( event->u.chr.keysym == GK_Left || event->u.chr.keysym == GK_KP_Left ) + xoff = -1; + else if ( event->u.chr.keysym == GK_Home || event->u.chr.keysym == GK_KP_Home ) { + if ( bv->bc->selection==NULL ) { + xoff = -bv->bc->xmin; + yoff = -bv->bc->ymin; + } else { + xoff = bv->bc->xmin-bv->bc->selection->xmin; + yoff = bv->bc->ymin-bv->bc->selection->ymin; + } + } + if ( event->u.chr.state & (ksm_meta|ksm_control) ) { + struct sbevent sb; + sb.type = yoff>0 || xoff<0 ? et_sb_halfup : et_sb_halfdown; + if ( xoff==0 ) + BVVScroll(bv,&sb); + else + BVHScroll(bv,&sb); + } else { + BCPreserveState(bv->bc); + if ( bv->bc->selection==NULL ) { + bv->bc->xmin += xoff; bv->bc->xmax += xoff; + bv->bc->ymin += yoff; bv->bc->ymax += yoff; + } else { + bv->bc->selection->xmin += xoff; bv->bc->selection->xmax += xoff; + bv->bc->selection->ymin += yoff; bv->bc->selection->ymax += yoff; + } + BCCharChangedUpdate(bv->bc); + } + } else if ( !(event->u.chr.state&(ksm_control|ksm_meta)) && + event->type == et_char && + event->u.chr.chars[0]!='\0' && event->u.chr.chars[1]=='\0' ) { + SplineFont *sf = bv->bc->sc->parent; + int i; + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc==event->u.chr.chars[0] ) + break; + if ( i==sf->charcnt ) for ( i=0; icharcnt; ++i ) if ( sf->chars[i]==NULL ) { + SplineChar dummy; + SCBuildDummy(&dummy,sf,i); + if ( dummy.unicodeenc==event->u.chr.chars[0] ) + break; + } + if ( i!=sf->charcnt ) + BVChangeChar(bv,i,false); + } +} + +static void BVCharUp(BitmapView *bv, GEvent *event ) { + if ( event->u.chr.keysym=='I' && + (event->u.chr.state&ksm_shift) && + (event->u.chr.state&ksm_meta) ) + SCCharInfo(bv->bc->sc); +#if _ModKeysAutoRepeat + /* Under cygwin these keys auto repeat, they don't under normal X */ + else if ( event->u.chr.keysym == GK_Shift_L || event->u.chr.keysym == GK_Shift_R || + event->u.chr.keysym == GK_Control_L || event->u.chr.keysym == GK_Control_R || + event->u.chr.keysym == GK_Meta_L || event->u.chr.keysym == GK_Meta_R || + event->u.chr.keysym == GK_Alt_L || event->u.chr.keysym == GK_Alt_R || + event->u.chr.keysym == GK_Super_L || event->u.chr.keysym == GK_Super_R || + event->u.chr.keysym == GK_Hyper_L || event->u.chr.keysym == GK_Hyper_R ) { + if ( bv->autorpt!=NULL ) { + GDrawCancelTimer(bv->autorpt); + BVToolsSetCursor(bv,bv->oldstate,NULL); + } + bv->keysym = event->u.chr.keysym; + bv->oldstate = TrueCharState(event); + bv->autorpt = GDrawRequestTimer(bv->v,100,0,NULL); + } else { + if ( bv->autorpt!=NULL ) { + GDrawCancelTimer(bv->autorpt); bv->autorpt=NULL; + BVToolsSetCursor(bv,bv->oldstate,NULL); + } + BVToolsSetCursor(bv,TrueCharState(event),NULL); + } +#else + BVToolsSetCursor(bv,TrueCharState(event),NULL); +#endif +} + +static void BVDrawTempPoint(BitmapView *bv,int x, int y,void *pixmap) { + GRect pixel; + + pixel.width = pixel.height = bv->scale+1; + pixel.x = bv->xoff + x*bv->scale; + pixel.y = bv->height-bv->yoff-(y+1)*bv->scale; + GDrawSetStippled(pixmap,1, 0,0); + GDrawFillRect(pixmap,&pixel,0x909000); + GDrawSetStippled(pixmap,0, 0,0); +} + +static void BVDrawSelection(BitmapView *bv,void *pixmap) { + GRect pixel, rect; + BDFFloat *sel = bv->bc->selection; + GClut *clut = bv->bdf->clut; + Color bg = GDrawGetDefaultBackground(NULL); + int i,j; + + pixel.width = pixel.height = bv->scale+1; + for ( i=sel->ymax-sel->ymin; i>=0; --i ) { + for ( j=0; j<=sel->xmax-sel->xmin; ++j ) { + pixel.x = bv->xoff + (sel->xmin+j)*bv->scale; + pixel.y = bv->height-bv->yoff-(sel->ymax-i+1)*bv->scale; + if ( clut==NULL ) { + if ( sel->bitmap[i*sel->bytes_per_line+(j>>3)] & (1<<(7-(j&7))) ) { + GDrawFillRect(pixmap,&pixel,0x808080); + } else { + GDrawFillRect(pixmap,&pixel,bg); + } + } else + GDrawFillRect(pixmap,&pixel, + clut->clut[sel->bitmap[i*sel->bytes_per_line+j]]); + } + } + GDrawSetStippled(pixmap,1, 0,0); + rect.width = (sel->xmax-sel->xmin+1)*bv->scale; + rect.height = (sel->ymax-sel->ymin+1)*bv->scale; + rect.x = bv->xoff + sel->xmin*bv->scale; + rect.y = bv->height-bv->yoff-(sel->ymax+1)*bv->scale; + GDrawFillRect(pixmap,&rect,0x909000); + GDrawSetStippled(pixmap,0, 0,0); +} + +static void BVExpose(BitmapView *bv, GWindow pixmap, GEvent *event ) { + CharView cvtemp; + GRect old; + DRect clip; + int i,j; + GRect pixel; + BDFChar *bc = bv->bc; + BDFFont *bdf = bv->bdf; + RefChar *refs; + + GDrawPushClip(pixmap,&event->u.expose.rect,&old); + GDrawSetLineWidth(pixmap,0); + if ( bv->showfore ) { + /* fore ground is a misnomer. it's what we're interested in but we */ + /* actually need to draw it first, otherwise it obscures everything */ + pixel.width = pixel.height = bv->scale+1; + for ( i=bc->ymax-bc->ymin; i>=0; --i ) { + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + pixel.x = bv->xoff + (bc->xmin+j)*bv->scale; + pixel.y = bv->height-bv->yoff-(bc->ymax-i+1)*bv->scale; + if ( bdf->clut==NULL ) { + if ( bc->bitmap[i*bc->bytes_per_line+(j>>3)] & (1<<(7-(j&7))) ) + GDrawFillRect(pixmap,&pixel,0x808080); + } else { + int index = bc->bitmap[i*bc->bytes_per_line+j]; + if ( index!=0 ) + GDrawFillRect(pixmap,&pixel,bdf->clut->clut[index]); + } + } + } + if ( bv->active_tool!=bvt_none ) { + /* This does nothing for many tools, but for lines, rects and circles */ + /* it draws temporary points */ + BCGeneralFunction(bv,BVDrawTempPoint,pixmap); + } + if ( bv->bc->selection ) + BVDrawSelection(bv,pixmap); + } + if ( bv->showgrid ) { + if ( bv->scale>2 ) { + for ( i=bv->xoff+bv->scale; iwidth; i += bv->scale ) + GDrawDrawLine(pixmap,i,0, i,bv->height,0xa0a0a0); + for ( i=bv->xoff-bv->scale; i>0; i -= bv->scale ) + GDrawDrawLine(pixmap,i,0, i,bv->height,0xa0a0a0); + for ( i=-bv->yoff+bv->height-bv->scale; i>0; i -= bv->scale ) + GDrawDrawLine(pixmap,0,i,bv->width,i,0xa0a0a0); + for ( i=-bv->yoff+bv->height+bv->scale; iheight; i += bv->scale ) + GDrawDrawLine(pixmap,0,i,bv->width,i,0xa0a0a0); + } + GDrawDrawLine(pixmap,0,-bv->yoff+bv->height-0*bv->scale,bv->width,-bv->yoff+bv->height-0*bv->scale,0x404040); + GDrawDrawLine(pixmap,0,-bv->yoff+bv->height-bv->bdf->ascent*bv->scale, + bv->width,-bv->yoff+bv->height-bv->bdf->ascent*bv->scale,0x404040); + GDrawDrawLine(pixmap,0,-bv->yoff+bv->height+bv->bdf->descent*bv->scale, + bv->width,-bv->yoff+bv->height+bv->bdf->descent*bv->scale,0x404040); + GDrawDrawLine(pixmap,bv->xoff+0*bv->scale,0, bv->xoff+0*bv->scale,bv->height,0x404040); + GDrawDrawLine(pixmap,bv->xoff+bv->bc->width*bv->scale,0, bv->xoff+bv->bc->width*bv->scale,bv->height,0x000000); + } + if ( bv->showoutline ) { + Color col = bv->bc->byte_data ? 0x008800 : 0x004400; + memset(&cvtemp,'\0',sizeof(cvtemp)); + cvtemp.v = bv->v; + cvtemp.width = bv->width; + cvtemp.height = bv->height; + cvtemp.scale = bv->scscale*bv->scale; + cvtemp.xoff = bv->xoff/* *bv->scscale*/; + cvtemp.yoff = bv->yoff/* *bv->scscale*/; + cvtemp.sc = bv->bc->sc; + cvtemp.drawmode = dm_fore; + + clip.width = event->u.expose.rect.width/cvtemp.scale; + clip.height = event->u.expose.rect.height/cvtemp.scale; + clip.x = (event->u.expose.rect.x-cvtemp.xoff)/cvtemp.scale; + clip.y = (cvtemp.height-event->u.expose.rect.y-event->u.expose.rect.height-cvtemp.yoff)/cvtemp.scale; + CVDrawSplineSet(&cvtemp,pixmap,cvtemp.sc->layers[ly_fore].splines,col,false,&clip); + for ( refs = cvtemp.sc->layers[ly_fore].refs; refs!=NULL; refs = refs->next ) + CVDrawSplineSet(&cvtemp,pixmap,refs->layers[0].splines,col,false,&clip); + } + if ( bv->active_tool==bvt_pointer ) { + if ( bv->bc->selection==NULL ) { + int xmin, xmax, ymin, ymax; + xmin = bv->pressed_x; xmax = bv->info_x; + ymin = bv->info_y; ymax = bv->pressed_y; + if ( ymin>ymax ) { ymax = ymin; ymin = bv->pressed_y; } + if ( xmin>xmax ) { xmin = xmax; xmax = bv->pressed_x; } + pixel.width = (xmax-xmin+1) * bv->scale; + pixel.height = (ymax-ymin+1) * bv->scale; + pixel.x = bv->xoff + xmin*bv->scale; + pixel.y = bv->height-bv->yoff-(ymax+1)*bv->scale; + GDrawSetDashedLine(pixmap,3,3,0); + GDrawDrawRect(pixmap,&pixel,0xffffff); + GDrawSetDashedLine(pixmap,3,3,3); + GDrawDrawRect(pixmap,&pixel,0x000000); + GDrawSetDashedLine(pixmap,0,0,0); + } + } + GDrawPopClip(pixmap,&old); +} + +static void BVInfoDrawText(BitmapView *bv, GWindow pixmap ) { + GRect r; + Color bg = GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(pixmap)); + char buffer[50]; + unichar_t ubuffer[50]; + int ybase = bv->mbh+10+bv->sas; + + GDrawSetFont(pixmap,bv->small); + r.x = bv->infoh+RPT_DATA; r.width = 39; + r.y = bv->mbh; r.height = 36 /* bv->infoh-1 */; + GDrawFillRect(pixmap,&r,bg); + + sprintf(buffer,"%d%s%d", bv->info_x, coord_sep, bv->info_y ); + buffer[11] = '\0'; + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,bv->infoh+RPT_DATA,ybase,ubuffer,-1,NULL,0); + + if ( bv->active_tool!=cvt_none ) { + sprintf(buffer,"%d%s%d", bv->info_x-bv->pressed_x, coord_sep, bv->info_y-bv->pressed_y ); + buffer[11] = '\0'; + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,bv->infoh+RPT_DATA,ybase+bv->sfh+10,ubuffer,-1,NULL,0); + } +} + +static void BVMainExpose(BitmapView *bv, GWindow pixmap, GEvent *event ) { + GRect old, temp, box, old2, r; + GImage gi; + struct _GImage base; + GClut clut; + BDFChar *bdfc = bv->bc; + + temp = event->u.expose.rect; + if ( temp.y+temp.height < bv->mbh ) +return; + if ( temp.y mbh ) { + temp.height -= (bv->mbh-temp.y); + temp.y = bv->mbh; + } + GDrawPushClip(pixmap,&temp,&old); + GDrawSetLineWidth(pixmap,0); + + if ( event->u.expose.rect.x<6+bdfc->xmax-bdfc->xmin ) { + box.x = 0; box.width = bv->infoh; + box.y = bv->mbh; box.height = bv->infoh; + GDrawPushClip(pixmap,&box,&old2); + + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + memset(&clut,'\0',sizeof(clut)); + gi.u.image = &base; + if ( bv->bdf->clut==NULL ) { + base.image_type = it_mono; + base.clut = &clut; + clut.clut_len = 2; + clut.clut[0] = GDrawGetDefaultBackground(NULL); + } else { + base.image_type = it_index; + base.clut = bv->bdf->clut; + } + base.data = bdfc->bitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + GDrawDrawImage(pixmap,&gi,NULL, 5,bv->mbh+(bv->infoh-base.height)/2); + + GDrawPopClip(pixmap,&old2); + + GDrawDrawImage(pixmap,&GIcon_rightpointer,NULL,bv->infoh+RPT_BASE,bv->mbh+8); + GDrawDrawImage(pixmap,&GIcon_press2ptr,NULL,bv->infoh+RPT_BASE,bv->mbh+18+bv->sfh); + BVInfoDrawText(bv,pixmap ); + + r.x = bv->infoh+RPT_DATA; r.y = bv->mbh+36; + r.width = 20; r.height = 10; + GDrawFillRect(pixmap,&r, + bv->bdf->clut==NULL ? GDrawGetDefaultBackground(NULL) : + bv->bdf->clut->clut[bv->color/( 255/((1<bdf))-1) )] ); + + GDrawDrawImage(pixmap,&GIcon_press2ptr,NULL,bv->infoh+RPT_BASE,bv->mbh+18+bv->sfh); + } + GDrawDrawLine(pixmap,0,bv->mbh+bv->infoh-1,bv->width+300,bv->mbh+bv->infoh-1,0); + + r.x = bv->width; r.y = bv->height+bv->infoh+bv->mbh; + LogoExpose(pixmap,event,&r,dm_fore); + + GDrawPopClip(pixmap,&old); +} + +static void BVShowInfo(BitmapView *bv) { + BVInfoDrawText(bv,bv->gw ); +} + +static void BVResize(BitmapView *bv, GEvent *event ) { + int sbsize = GDrawPointsToPixels(bv->gw,_GScrollBar_Width); + int newwidth = event->u.resize.size.width-sbsize, + newheight = event->u.resize.size.height-sbsize - bv->mbh-bv->infoh; + + if ( newwidth == bv->width && newheight == bv->height ) +return; + + /* MenuBar takes care of itself */ + GDrawResize(bv->v,newwidth,newheight); + GGadgetMove(bv->vsb,newwidth, bv->mbh+bv->infoh); + GGadgetResize(bv->vsb,sbsize,newheight); + GGadgetMove(bv->hsb,0,event->u.resize.size.height-sbsize); + GGadgetResize(bv->hsb,newwidth,sbsize); + bv->width = newwidth; bv->height = newheight; + BVFit(bv); +} + +static void BVHScroll(BitmapView *bv,struct sbevent *sb) { + int newpos = bv->xoff; + int fh = bv->bdf->ascent+bv->bdf->descent; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos += 9*bv->width/10; + break; + case et_sb_up: + newpos += bv->width/15; + break; + case et_sb_down: + newpos -= bv->width/15; + break; + case et_sb_downpage: + newpos -= 9*bv->width/10; + break; + case et_sb_bottom: + newpos = 0; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = -sb->pos; + break; + case et_sb_halfup: + newpos += bv->width/30; + break; + case et_sb_halfdown: + newpos -= bv->width/30; + break; + } + if ( newpos>6*fh*bv->scale-bv->width ) + newpos = 6*fh*bv->scale-bv->width; + if ( newpos<-3*fh*bv->scale ) newpos = -3*fh*bv->scale; + if ( newpos!=bv->xoff ) { + int diff = newpos-bv->xoff; + bv->xoff = newpos; + GScrollBarSetPos(bv->hsb,-newpos); + GDrawScroll(bv->v,NULL,diff,0); + } +} + +static void BVVScroll(BitmapView *bv,struct sbevent *sb) { + int newpos = bv->yoff; + int fh = bv->bdf->ascent+bv->bdf->descent; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= 9*bv->width/10; + break; + case et_sb_up: + newpos -= bv->width/15; + break; + case et_sb_down: + newpos += bv->width/15; + break; + case et_sb_downpage: + newpos += 9*bv->width/10; + break; + case et_sb_bottom: + newpos = 0; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + case et_sb_halfup: + newpos -= bv->width/30; + break; + case et_sb_halfdown: + newpos += bv->width/30; + break; + } + if ( newpos>4*fh*bv->scale-bv->height ) + newpos = 4*fh*bv->scale-bv->height; + if ( newpos<-2*fh*bv->scale ) newpos = -2*fh*bv->scale; + if ( newpos!=bv->yoff ) { + int diff = newpos-bv->yoff; + bv->yoff = newpos; + GScrollBarSetPos(bv->vsb,newpos); + GDrawScroll(bv->v,NULL,0,diff); + } +} + +static int BVRecalc(GGadget *g, GEvent *e) { + BitmapView *bv; + BDFChar *bdfc; + void *freetypecontext=NULL; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + bv = GDrawGetUserData(GGadgetGetWindow(g)); + BCPreserveState(bv->bc); + BCFlattenFloat(bv->bc); + freetypecontext = FreeTypeFontContext(bv->bc->sc->parent,bv->bc->sc,false); + if ( freetypecontext!=NULL ) { + bdfc = SplineCharFreeTypeRasterize(freetypecontext,bv->bc->sc->enc,bv->bdf->pixelsize,BDFDepth(bv->bdf)); + FreeTypeFreeContext(freetypecontext); + } else + bdfc = SplineCharAntiAlias(bv->bc->sc,bv->bdf->pixelsize,(1<<(BDFDepth(bv->bdf)/2))); + free(bv->bc->bitmap); + bv->bc->bitmap = bdfc->bitmap; bdfc->bitmap = NULL; + bv->bc->width = bdfc->width; + bv->bc->xmin = bdfc->xmin; + bv->bc->xmax = bdfc->xmax; + bv->bc->ymin = bdfc->ymin; + bv->bc->ymax = bdfc->ymax; + bv->bc->bytes_per_line = bdfc->bytes_per_line; + BDFCharFree(bdfc); + BCCharChangedUpdate(bv->bc); + } +return( true ); +} + +static void BVSetWidth(BitmapView *bv, int x) { + int tot, cnt; + BDFFont *bdf; + BDFChar *bc = bv->bc; + + if ( bv->fv->sf->onlybitmaps ) { + bc->width = x; + tot=0; cnt=0; + for ( bdf = bv->fv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( bdf->chars[bc->enc]) { + tot += bdf->chars[bc->enc]->width*1000/(bdf->ascent+bdf->descent); + ++cnt; + } + if ( cnt!=0 ) + bv->fv->sf->chars[bc->enc]->width = tot/cnt; + BCCharChangedUpdate(bc); + } +} + +int BVColor(BitmapView *bv) { + int div = 255/((1<bdf))-1); +return ( (bv->color+div/2)/div ); +} + +static void BVMouseDown(BitmapView *bv, GEvent *event) { + int x = floor( (event->u.mouse.x-bv->xoff)/ (real) bv->scale); + int y = floor( (bv->height-event->u.mouse.y-bv->yoff)/ (real) bv->scale); + int ny; + BDFChar *bc = bv->bc; + BDFFloat *sel; + + if ( event->u.mouse.button==2 && event->u.mouse.device!=NULL && + strcmp(event->u.mouse.device,"stylus")==0 ) +return; /* I treat this more like a modifier key change than a button press */ + + if ( event->u.mouse.button==3 ) { + BVToolsPopup(bv,event); +return; + } + BVToolsSetCursor(bv,event->u.mouse.state|(1<<(7+event->u.mouse.button)), event->u.mouse.device ); + bv->active_tool = bv->showing_tool; + bv->pressed_x = x; bv->pressed_y = y; + bv->info_x = x; bv->info_y = y; + bv->event_x = event->u.mouse.x; bv->event_y = event->u.mouse.y; + bv->recentchange = false; + switch ( bv->active_tool ) { + case bvt_eyedropper: + if ( bc->byte_data ) { + ny = bc->ymax-y; + if ( x>=bc->xmin && x<=bc->xmax && ny>=0 && ny<=bc->ymax-bc->ymin ) + bv->color = bc->bitmap[(bc->ymax-y)*bc->bytes_per_line + x-bc->xmin] * + 255/((1<bdf))-1); + else + bv->color = 0; + /* Store color as a number between 0 and 255 no matter what the clut size is */ + BVPaletteColorChange(bv); + } + break; + case bvt_pencil: case bvt_line: + case bvt_rect: case bvt_filledrect: + ny = bc->ymax-y; + bv->clearing = false; + if ( !bc->byte_data && x>=bc->xmin && x<=bc->xmax && + ny>=0 && ny<=bc->ymax-bc->ymin ) { + int nx = x-bc->xmin; + if ( bc->bitmap[ny*bc->bytes_per_line + (nx>>3)] & + (1<<(7-(nx&7))) ) + bv->clearing = true; + } + BCPreserveState(bc); + BCFlattenFloat(bc); + if ( bv->active_tool == bvt_pencil ) + BCSetPoint(bc,x,y,bc->byte_data?BVColor(bv):!bv->clearing); + BCCharChangedUpdate(bc); + break; + case bvt_elipse: case bvt_filledelipse: + BCPreserveState(bc); + BCFlattenFloat(bc); + BCCharChangedUpdate(bc); + break; + case bvt_pointer: + if ( (sel = bc->selection)!=NULL ) { + if ( xxmin || x>sel->xmax || yymin || y>sel->ymax ) + BCFlattenFloat(bc); + else { + GDrawSetCursor(bv->v,ct_shift); + /* otherwise we'll move the selection */ + } + } else if ( bc->sc->parent->onlybitmaps && + event->u.mouse.x-bv->xoff > bc->width*bv->scale-3 && + event->u.mouse.x-bv->xoff < bc->width*bv->scale+3 ) { + bv->active_tool = bvt_setwidth; + BVToolsSetCursor(bv,event->u.mouse.state|(1<<(7+event->u.mouse.button)), event->u.mouse.device ); + } + BCCharUpdate(bc); + break; + case bvt_setwidth: + BVSetWidth(bv,x); + break; + } +} + +static void BVMouseMove(BitmapView *bv, GEvent *event) { + int x = floor( (event->u.mouse.x-bv->xoff)/ (real) bv->scale); + int y = floor( (bv->height-event->u.mouse.y-bv->yoff)/ (real) bv->scale); + int newx, newy; + int fh = bv->bdf->ascent+bv->bdf->descent; + BDFChar *bc = bv->bc; + + bv->info_x = x; bv->info_y = y; + BVShowInfo(bv); + if ( bv->active_tool==bvt_none ) +return; /* Not pressed */ + switch ( bv->active_tool ) { + case bvt_pencil: + BCSetPoint(bc,x,y,bc->byte_data?BVColor(bv):!bv->clearing); + BCCharChangedUpdate(bc); + break; + case bvt_line: case bvt_rect: case bvt_filledrect: + case bvt_elipse: case bvt_filledelipse: + BCCharChangedUpdate(bc); + break; + case bvt_hand: + newx = bv->xoff + event->u.mouse.x-bv->event_x; + newy = bv->yoff + bv->event_y-event->u.mouse.y; + if ( newy>4*fh*bv->scale-bv->height ) + newy = 4*fh*bv->scale-bv->height; + if ( newy<-2*fh*bv->scale ) newy = -2*fh*bv->scale; + if ( newx>6*fh*bv->scale-bv->width ) + newx = 6*fh*bv->scale-bv->width; + if ( newx<-3*fh*bv->scale ) newx = -3*fh*bv->scale; + if ( newx!=bv->xoff || newy!=bv->yoff ) { + newx -= bv->xoff; bv->xoff += newx; + newy -= bv->yoff; bv->yoff += newy; + GScrollBarSetPos(bv->hsb,-bv->xoff); + GScrollBarSetPos(bv->vsb,-bv->yoff); + GDrawScroll(bv->v,NULL,newx,newy); + } + bv->event_x = event->u.mouse.x; bv->event_y = event->u.mouse.y; + break; + case bvt_shift: + if ( x!=bv->pressed_x || y!=bv->pressed_y ) { + if ( !bv->recentchange ) { + BCPreserveState(bc); + BCFlattenFloat(bc); + bv->recentchange = true; + } + bc->xmin += x-bv->pressed_x; + bc->xmax += x-bv->pressed_x; + bc->ymin += y-bv->pressed_y; + bc->ymax += y-bv->pressed_y; + BCCharChangedUpdate(bc); + bv->pressed_x = x; bv->pressed_y = y; + } + break; + case bvt_pointer: + if ( bc->selection!=NULL ) { + if ( x!=bv->pressed_x || y!=bv->pressed_y ) { + if ( !bv->recentchange ) { + BCPreserveState(bc); + bv->recentchange = true; + } + bc->selection->xmin += x-bv->pressed_x; + bc->selection->xmax += x-bv->pressed_x; + bc->selection->ymin += y-bv->pressed_y; + bc->selection->ymax += y-bv->pressed_y; + BCCharChangedUpdate(bc); + bv->pressed_x = x; bv->pressed_y = y; + } + } else { + GDrawRequestExpose(bv->v,NULL,false); + } + break; + case bvt_setwidth: + BVSetWidth(bv,x); + break; + } +} + +static void BVSetPoint(BitmapView *bv, int x, int y, void *junk) { + BCSetPoint(bv->bc,x,y,bv->bc->byte_data?BVColor(bv):!bv->clearing); +} + +static void BVMagnify(BitmapView *bv, int midx, int midy, int bigger); + +static void BVMouseUp(BitmapView *bv, GEvent *event) { + int x = floor( (event->u.mouse.x-bv->xoff)/ (real) bv->scale); + int y = floor( (bv->height-event->u.mouse.y-bv->yoff)/ (real) bv->scale); + + BVMouseMove(bv,event); + switch ( bv->active_tool ) { + case bvt_magnify: case bvt_minify: + BVMagnify(bv,x,y,bv->active_tool==bvt_magnify?1:-1); + break; + case bvt_line: case bvt_rect: case bvt_filledrect: + case bvt_elipse: case bvt_filledelipse: + BCGeneralFunction(bv,BVSetPoint,NULL); + bv->active_tool = bvt_none; + BCCharChangedUpdate(bv->bc); + break; + case bvt_pointer: + if ( bv->bc->selection!=NULL ) { + /* we've been moving it */ + GDrawSetCursor(bv->v,ct_mypointer); + if ( !bv->recentchange ) { /* Oh, we just clicked in it, get rid of it */ + BCFlattenFloat(bv->bc); + BCCharChangedUpdate(bv->bc); + } + } else { + int dx,dy; + if ( (dx = event->u.mouse.x-bv->event_x)<0 ) dx = -dx; + if ( (dy = event->u.mouse.y-bv->event_y)<0 ) dy = -dy; + if ( dx+dy>4 ) { + /* we've just dragged out a new one */ + BDFFloatCreate(bv->bc,bv->pressed_x,bv->info_x,bv->pressed_y,bv->info_y,true); + } + bv->active_tool = bvt_none; + BCCharChangedUpdate(bv->bc); + } + break; + case bvt_setwidth: + BVSetWidth(bv,x); + break; + } + bv->active_tool = bvt_none; + BVToolsSetCursor(bv,event->u.mouse.state&~(1<<(7+event->u.mouse.button)), event->u.mouse.device); /* X still has the buttons set in the state, even though we just released them. I don't want em */ +} + +static int v_e_h(GWindow gw, GEvent *event) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + if ( !(event->u.mouse.state&(ksm_shift|ksm_control)) ) /* bind shift to magnify/minify */ +return( GGadgetDispatchEvent(bv->vsb,event)); + } + + switch ( event->type ) { + case et_selclear: + ClipboardClear(); + break; + case et_expose: + GDrawSetLineWidth(gw,0); + BVExpose(bv,gw,event); + break; + case et_crossing: + BVToolsSetCursor(bv,event->u.mouse.state, event->u.mouse.device); + break; + case et_mousedown: + BVPaletteActivate(bv); + BVMouseDown(bv,event); + break; + case et_mousemove: + BVMouseMove(bv,event); + break; + case et_mouseup: + BVMouseUp(bv,event); + break; + case et_char: + BVChar(bv,event); + break; + case et_charup: + BVCharUp(bv,event); + break; + case et_timer: +#if _ModKeysAutoRepeat + /* Under cygwin the modifier keys auto repeat, they don't under normal X */ + if ( bv->autorpt==event->u.timer.timer ) { + bv->autorpt = NULL; + BVToolsSetCursor(bv,bv->oldstate,NULL); + } +#endif + break; + case et_focus: +#if 0 + if ( event->u.focus.gained_focus ) + BVPaletteActivate(bv); +#endif + break; + } +return( true ); +} + +static int bv_e_h(GWindow gw, GEvent *event) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { +return( GGadgetDispatchEvent(bv->vsb,event)); + } + + switch ( event->type ) { + case et_expose: + GDrawSetLineWidth(gw,0); + BVMainExpose(bv,gw,event); + break; + case et_char: + BVChar(bv,event); + break; + case et_charup: + BVCharUp(bv,event); + break; + case et_resize: + if ( event->u.resize.sized ) + BVResize(bv,event); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + if ( event->u.control.g == bv->hsb ) + BVHScroll(bv,&event->u.control.u.sb); + else + BVVScroll(bv,&event->u.control.u.sb); + break; + } + break; + case et_destroy: + BVUnlinkView(bv); + BVPalettesHideIfMine(bv); + BitmapViewFree(bv); + break; + case et_map: + if ( event->u.map.is_visible ) + BVPaletteActivate(bv); + else + BVPalettesHideIfMine(bv); + break; + case et_close: + GDrawDestroyWindow(gw); + break; + case et_mouseup: case et_mousedown: + GGadgetEndPopup(); + BVPaletteActivate(bv); + break; + case et_mousemove: + SCPreparePopup(bv->gw,bv->bc->sc); + break; + case et_focus: +#if 0 + if ( event->u.focus.gained_focus ) + BVPaletteActivate(bv); +#endif + break; + } +return( true ); +} + +#define MID_Fit 2001 +#define MID_ZoomIn 2002 +#define MID_ZoomOut 2003 +#define MID_Next 2007 +#define MID_Prev 2008 +#define MID_Bigger 2009 +#define MID_Smaller 2010 +#define MID_NextDef 2012 +#define MID_PrevDef 2013 +#define MID_Cut 2101 +#define MID_Copy 2102 +#define MID_Paste 2103 +#define MID_Clear 2104 +#define MID_SelAll 2106 +#define MID_Undo 2109 +#define MID_Redo 2110 +#define MID_RemoveUndoes 2111 +#define MID_GetInfo 2203 +#define MID_AvailBitmaps 2210 +#define MID_RegenBitmaps 2211 +#define MID_Tools 2501 +#define MID_Layers 2502 +#define MID_Shades 2503 +#define MID_DockPalettes 2504 +#define MID_Revert 2702 +#define MID_Recent 2703 +#define MID_SetWidth 2601 + +static void BVMenuClose(GWindow gw,struct gmenuitem *mi,GEvent *g) { + GDrawDestroyWindow(gw); +} + +static void BVMenuOpenOutline(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + CharViewCreate(bv->bc->sc,bv->fv); +} + +static void BVMenuOpenMetrics(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + MetricsViewCreate(bv->fv,bv->bc->sc,bv->bdf); +} + +static void BVMenuSave(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + _FVMenuSave(bv->fv); +} + +static void BVMenuSaveAs(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + _FVMenuSaveAs(bv->fv); +} + +static void BVMenuGenerate(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + _FVMenuGenerate(bv->fv,false); +} + +static void BVMenuGenerateFamily(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + _FVMenuGenerate(bv->fv,true); +} + +static void BVMenuExport(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BVExport(bv); +} + +static void BVMenuImport(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BVImport(bv); +} + +static void BVMenuRevert(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + FVDelay(bv->fv,FVRevert); /* The revert command can potentially */ + /* destroy our window (if the char weren't in the */ + /* old font). If that happens before the menu finishes */ + /* we get a crash. So delay till after the menu completes */ +} + +static void fllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Revert: + mi->ti.disabled = bv->fv->sf->origname==NULL; + break; + case MID_Recent: + mi->ti.disabled = !RecentFilesAny(); + break; + } + } +} + +static void BVMagnify(BitmapView *bv, int midx, int midy, int bigger) { + + if ( bigger>0 ) { + bv->scale *= 2; + if ( bv->scale > 32 ) bv->scale = 32; + } else { + bv->scale /= 2; + if ( bv->scale < 1 ) bv->scale = 1; + } + bv->xoff = -(midx*bv->scale - bv->width/2); + bv->yoff = -(midy*bv->scale - bv->height/2); + BVNewScale(bv); +} + +static void BVMenuScale(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + if ( mi->mid == MID_Fit ) { + BVFit(bv); + } else { + real midx = (bv->width/2-bv->xoff)/bv->scale; + real midy = (bv->height/2-bv->yoff)/bv->scale; + BVMagnify(bv,midx,midy,mi->mid==MID_ZoomOut?-1:1); + } +} + +static void BVMenuChangeChar(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + SplineFont *sf = bv->bc->sc->parent; + int pos = -1; + + if ( mi->mid == MID_Next ) { + pos = bv->bc->enc+1; + } else if ( mi->mid == MID_Prev ) { + pos = bv->bc->enc-1; + } else if ( mi->mid == MID_NextDef ) { + for ( pos = bv->bc->enc+1; poscharcnt && sf->chars[pos]==NULL; ++pos ); + if ( pos==sf->charcnt ) +return; + } else if ( mi->mid == MID_PrevDef ) { + for ( pos = bv->bc->enc-1; pos>=0 && sf->chars[pos]==NULL; --pos ); + if ( pos<0 ) +return; + } + if ( pos>=0 && posfv->sf->charcnt ) + BVChangeChar(bv,pos,false); +} + +static void BVMenuChangePixelSize(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BDFFont *best=NULL, *bdf; + /* Bigger will find either a bigger pixelsize or a font with same pixelsize and greater depth */ + + if ( mi->mid == MID_Bigger ) { + best = bv->bdf->next; /* I rely on the bitmap list being ordered */ + } else { + for ( bdf=bv->fv->sf->bitmaps; bdf!=NULL && bdf->next!=bv->bdf; bdf=bdf->next ); + best = bdf; + } + if ( best!=NULL && bv->bdf!=best ) { + bv->bdf = best; + bv->scscale = ((real) (best->pixelsize))/(best->sf->ascent+best->sf->descent); + BVChangeChar(bv,bv->bc->enc,true); + BVShows.lastpixelsize = best->pixelsize; + } +} + +static void BVMenuGotoChar(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + int pos = GotoChar(bv->fv->sf); + + if ( pos!=-1 ) + BVChangeChar(bv,pos,false); +} + +static void BVMenuFindInFontView(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + FVChangeChar(bv->fv,bv->bc->sc->enc); + GDrawSetVisible(bv->fv->gw,true); + GDrawRaise(bv->fv->gw); +} + +static void BVMenuPalettesDock(GWindow gw,struct gmenuitem *mi,GEvent *e) { + PalettesChangeDocking(); +} + +static void BVMenuPaletteShow(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + BVPaletteSetVisible(bv, mi->mid==MID_Tools?1:mi->mid==MID_Shades?2:0, !BVPaletteIsVisible(bv, mi->mid==MID_Tools?1:mi->mid==MID_Shades?2:0)); +} + +static void BVUndo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + if ( bv->bc->undoes==NULL ) +return; + BCDoUndo(bv->bc,bv->fv); +} + +static void BVMenuSetWidth(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + char buffer[10]; + unichar_t ubuf[10], *ret; + BDFFont *bdf; + int mysize = bv->bdf->pixelsize; + SplineChar *sc; + int val; + + if ( !bv->fv->sf->onlybitmaps ) +return; + sprintf( buffer,"%d",bv->bc->width); + uc_strcpy(ubuf,buffer); + ret = GWidgetAskStringR(_STR_Setwidth,ubuf,_STR_Setwidth); + if ( ret==NULL ) +return; + val = u_strtol(ret,NULL,10); + free(ret); + if ( val<0 ) +return; + bv->bc->width = val; + BCCharChangedUpdate(bv->bc); + for ( bdf=bv->fv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( bdf->pixelsize > mysize ) +return; + if ( (sc=bv->fv->sf->chars[bv->bc->enc])!=NULL ) { + sc->width = val*(sc->parent->ascent+sc->parent->descent)/mysize; + SCCharChangedUpdate(sc); + } +} + +static void BVRedo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + if ( bv->bc->redoes==NULL ) +return; + BCDoRedo(bv->bc,bv->fv); +} + +static void BVRemoveUndoes(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + UndoesFree(bv->bc->undoes); bv->bc->undoes = NULL; + UndoesFree(bv->bc->redoes); bv->bc->redoes = NULL; +} + +static void BVCopy(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BCCopySelected(bv->bc,bv->bdf->pixelsize,BDFDepth(bv->bdf)); +} + +static void BVDoClear(BitmapView *bv) { + if ( bv->bc->selection!=NULL ) { + BCPreserveState(bv->bc); + BDFFloatFree(bv->bc->selection); + bv->bc->selection = NULL; + BCCharChangedUpdate(bv->bc); + } +} + +static void BVClear(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BVDoClear(bv); +} + +static void BVPaste(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + if ( CopyContainsBitmap()) + PasteToBC(bv->bc,bv->bdf->pixelsize,BDFDepth(bv->bdf),bv->fv); +} + +static void BVCut(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + if ( bv->bc->selection==NULL ) +return; + BVCopy(gw,mi,e); + BVDoClear(bv); +} + +static void BVSelectAll(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BDFChar *bc = bv->bc; + + BDFFloatCreate(bc,bc->xmin,bc->xmax,bc->ymin,bc->ymax, true); + BCCharUpdate(bc); +} + +static void BVMenuFontInfo(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + DelayEvent(FontMenuFontInfo,bv->fv); +} + +static void BVMenuGetInfo(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + SCCharInfo(bv->bc->sc); +} + +static void BVMenuBitmaps(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BitmapDlg(bv->fv,bv->bc->sc,mi->mid==MID_AvailBitmaps ); +} + +void BVMenuRotateInvoked(GWindow gw,struct gmenuitem *mi,GEvent *g) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BVRotateBitmap(bv,mi->mid); +} + +static void edlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_RegenBitmaps: + mi->ti.disabled = bv->fv->sf->onlybitmaps; + break; + } + } +} + +static void ellistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Cut: /*case MID_Copy:*/ case MID_Clear: + /* If nothing is selected, copy copies everything */ + mi->ti.disabled = bv->bc->selection==NULL; + break; + case MID_Paste: + mi->ti.disabled = !CopyContainsBitmap(); + break; + case MID_Undo: + mi->ti.disabled = bv->bc->undoes==NULL; + break; + case MID_Redo: + mi->ti.disabled = bv->bc->redoes==NULL; + break; + case MID_RemoveUndoes: + mi->ti.disabled = bv->bc->redoes==NULL && bv->bc->undoes==NULL; + break; + } + } +} + +static void pllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + extern int palettes_docked; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Tools: + mi->ti.checked = BVPaletteIsVisible(bv,1); + break; + case MID_Layers: + mi->ti.checked = BVPaletteIsVisible(bv,0); + break; + case MID_Shades: + mi->ti.disabled = BDFDepth(bv->bdf)==1; + if ( !mi->ti.disabled ) + mi->ti.checked = BVPaletteIsVisible(bv,2); + break; + case MID_DockPalettes: + mi->ti.checked = palettes_docked; + break; + } + } +} + +static void vwlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + BDFFont *bdf; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_ZoomIn: + mi->ti.disabled = bv->scale==32; + break; + case MID_ZoomOut: + mi->ti.checked = bv->scale==1; + break; + case MID_Bigger: + mi->ti.disabled = bv->bdf->next==NULL; + break; + case MID_Smaller: + for ( bdf=bv->fv->sf->bitmaps; bdf!=NULL && bdf->next!=bv->bdf; bdf=bdf->next ); + mi->ti.disabled = bdf==NULL; + break; + } + } +} + +static void mtlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_SetWidth: + mi->ti.disabled = !bv->fv->sf->onlybitmaps; + break; + } + } +} + +int BVFlipNames[] = { _STR_Fliph, _STR_Flipv, _STR_Rotate90cw, _STR_Rotate90ccw, _STR_Rotate180, _STR_Skew }; + +static GMenuItem dummyitem[] = { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, NULL }; +static GMenuItem fllist[] = { + { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, 'N', ksm_control, NULL, NULL, MenuNew }, + { { (unichar_t *) _STR_Open, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, 'O', ksm_control, NULL, NULL, MenuOpen }, + { { (unichar_t *) _STR_Recent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control, dummyitem, MenuRecentBuild, NULL, MID_Recent }, + { { (unichar_t *) _STR_Close, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'Q', ksm_control|ksm_shift, NULL, NULL, BVMenuClose }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Openoutline, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'u' }, 'H', ksm_control, NULL, NULL, BVMenuOpenOutline }, + { { (unichar_t *) _STR_Openbitmap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'J', ksm_control, NULL, NULL, /* No function, never avail */NULL }, + { { (unichar_t *) _STR_Openmetrics, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'K', ksm_control, NULL, NULL, BVMenuOpenMetrics }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Save, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'S', ksm_control, NULL, NULL, BVMenuSave }, + { { (unichar_t *) _STR_Saveas, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, 'S', ksm_control|ksm_shift, NULL, NULL, BVMenuSaveAs }, + { { (unichar_t *) _STR_Generate, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, 'G', ksm_control|ksm_shift, NULL, NULL, BVMenuGenerate }, + { { (unichar_t *) _STR_GenerateMac, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'G', ksm_control|ksm_meta, NULL, NULL, BVMenuGenerateFamily }, + { { (unichar_t *) _STR_Export, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control|ksm_shift, NULL, NULL, BVMenuExport }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Import, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control|ksm_shift, NULL, NULL, BVMenuImport }, + { { (unichar_t *) _STR_Revertfile, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'R', ksm_control|ksm_shift, NULL, NULL, BVMenuRevert, MID_Revert }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Prefs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control, NULL, NULL, MenuPrefs }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Quit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'Q' }, 'Q', ksm_control, NULL, NULL, MenuExit }, + { NULL } +}; + +static GMenuItem edlist[] = { + { { (unichar_t *) _STR_Undo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'Z', ksm_control, NULL, NULL, BVUndo, MID_Undo }, + { { (unichar_t *) _STR_Redo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'Y', ksm_control, NULL, NULL, BVRedo, MID_Redo }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Cut, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, 'X', ksm_control, NULL, NULL, BVCut, MID_Cut }, + { { (unichar_t *) _STR_Copy, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'C', ksm_control, NULL, NULL, BVCopy, MID_Copy }, + { { (unichar_t *) _STR_Paste, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'V', ksm_control, NULL, NULL, BVPaste, MID_Paste }, + { { (unichar_t *) _STR_Clear, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, GK_Delete, 0, NULL, NULL, BVClear, MID_Clear }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SelectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'A', ksm_control, NULL, NULL, BVSelectAll, MID_SelAll }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_RemoveUndoes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', ksm_control, NULL, NULL, BVRemoveUndoes, MID_RemoveUndoes }, + { NULL } +}; + +static GMenuItem trlist[] = { + { { (unichar_t *) _STR_Fliph, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control, NULL, NULL, BVMenuRotateInvoked, bvt_fliph }, + { { (unichar_t *) _STR_Flipv, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control, NULL, NULL, BVMenuRotateInvoked, bvt_flipv }, + { { (unichar_t *) _STR_Rotate90cw, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, '\0', ksm_control, NULL, NULL, BVMenuRotateInvoked, bvt_rotate90cw }, + { { (unichar_t *) _STR_Rotate90ccw, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '9' }, '\0', ksm_control, NULL, NULL, BVMenuRotateInvoked, bvt_rotate90ccw }, + { { (unichar_t *) _STR_Rotate180, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '1' }, '\0', ksm_control, NULL, NULL, BVMenuRotateInvoked, bvt_rotate180 }, + { { (unichar_t *) _STR_Skew, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control, NULL, NULL, BVMenuRotateInvoked, bvt_skew }, + { NULL } +}; + +static GMenuItem ellist[] = { + { { (unichar_t *) _STR_Fontinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control|ksm_shift, NULL, NULL, BVMenuFontInfo }, + { { (unichar_t *) _STR_Charinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control, NULL, NULL, BVMenuGetInfo, MID_GetInfo }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Bitmapsavail, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'B', ksm_control|ksm_shift, NULL, NULL, BVMenuBitmaps, MID_AvailBitmaps }, + { { (unichar_t *) _STR_Regenbitmaps, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'B', ksm_control, NULL, NULL, BVMenuBitmaps, MID_RegenBitmaps }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Transform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', 0, trlist, NULL }, + { NULL } +}; + +static GMenuItem pllist[] = { + { { (unichar_t *) _STR_Tools, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, BVMenuPaletteShow, MID_Tools }, + { { (unichar_t *) _STR_Layers, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'L' }, '\0', ksm_control, NULL, NULL, BVMenuPaletteShow, MID_Layers }, + { { (unichar_t *) _STR_Shades, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control, NULL, NULL, BVMenuPaletteShow, MID_Shades }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_DockedPalettes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'D' }, '\0', ksm_control, NULL, NULL, BVMenuPalettesDock, MID_DockPalettes }, + { NULL } +}; + +static GMenuItem vwlist[] = { + { { (unichar_t *) _STR_Fit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control, NULL, NULL, BVMenuScale, MID_Fit }, + { { (unichar_t *) _STR_Zoomout, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, '-', ksm_control|ksm_meta, NULL, NULL, BVMenuScale, MID_ZoomOut }, + { { (unichar_t *) _STR_Zoomin, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'i' }, '+', ksm_control|ksm_meta|ksm_shift, NULL, NULL, BVMenuScale, MID_ZoomIn }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_NextChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, ']', ksm_control, NULL, NULL, BVMenuChangeChar, MID_Next }, + { { (unichar_t *) _STR_PrevChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '[', ksm_control, NULL, NULL, BVMenuChangeChar, MID_Prev }, + { { (unichar_t *) _STR_NextDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, ']', ksm_control|ksm_meta, NULL, NULL, BVMenuChangeChar, MID_NextDef }, + { { (unichar_t *) _STR_PrevDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, '[', ksm_control|ksm_meta, NULL, NULL, BVMenuChangeChar, MID_PrevDef }, + { { (unichar_t *) _STR_Goto, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, '>', ksm_shift|ksm_control, NULL, NULL, BVMenuGotoChar }, + { { (unichar_t *) _STR_FindInFontView, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '<', ksm_shift|ksm_control, NULL, NULL, BVMenuFindInFontView }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Bigger, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '+', ksm_shift|ksm_control, NULL, NULL, BVMenuChangePixelSize, MID_Bigger }, + { { (unichar_t *) _STR_Smaller, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '-', ksm_control, NULL, NULL, BVMenuChangePixelSize, MID_Smaller }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Palettes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, '\0', 0, pllist, pllistcheck }, + { NULL } +}; + +static GMenuItem mtlist[] = { + { { (unichar_t *) _STR_Setwidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 'L', ksm_control|ksm_shift, NULL, NULL, BVMenuSetWidth, MID_SetWidth }, + { NULL } +}; + +static GMenuItem mblist[] = { + { { (unichar_t *) _STR_File, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 0, 0, fllist, fllistcheck }, + { { (unichar_t *) _STR_Edit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 0, 0, edlist, edlistcheck }, + { { (unichar_t *) _STR_Element, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, ellist, ellistcheck }, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, 0, 0, vwlist, vwlistcheck }, + { { (unichar_t *) _STR_Metric, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 0, 0, mtlist, mtlistcheck }, + { { (unichar_t *) _STR_Window, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 0, 0, NULL, WindowMenuBuild }, + { { (unichar_t *) _STR_Help, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, helplist, NULL }, + { NULL } +}; + +#define bitmap_width 16 +#define bitmap_height 16 +static unsigned char bitmap_bits[] = { + 0x00, 0x00, 0xfc, 0x03, 0xfc, 0x03, 0x30, 0x0c, 0x30, 0x0c, 0x30, 0x0c, + 0x30, 0x0c, 0xf0, 0x03, 0xf0, 0x03, 0x30, 0x0c, 0x30, 0x0c, 0x30, 0x0c, + 0x30, 0x0c, 0xfc, 0x03, 0xfc, 0x03, 0x00, 0x00}; + +BitmapView *BitmapViewCreate(BDFChar *bc, BDFFont *bdf, FontView *fv) { + BitmapView *bv = gcalloc(1,sizeof(BitmapView)); + GRect pos, zoom; + GWindow gw; + GWindowAttrs wattrs; + GGadgetData gd; + GRect gsize; + int sbsize; + unichar_t ubuf[300]; + static GWindow icon = NULL; + GTextInfo ti; + FontRequest rq; + int as, ds, ld; + static unichar_t fixed[] = { 'f','i','x','e','d',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + static unichar_t *infofamily = NULL; + + BVShows.lastpixelsize = bdf->pixelsize; + + if ( icon==NULL ) + icon = GDrawCreateBitmap(NULL,bitmap_width,bitmap_height,bitmap_bits); + + bv->bc = bc; + bv->scale = 1; + bv->xoff = bv->yoff = 20; + bv->next = bc->views; + bc->views = bv; + bv->fv = fv; + bv->bdf = bdf; + bv->color = 255; + bv->shades_hidden = bdf->clut==NULL; + + bv->showfore = BVShows.showfore; + bv->showoutline = BVShows.showoutline; + bv->showgrid = BVShows.showgrid; + bv->scscale = ((real) (bdf->pixelsize))/(bdf->sf->ascent+bdf->sf->descent); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_ititle; + wattrs.event_masks = ~(1<gw = gw = GDrawCreateTopWindow(NULL,&pos,bv_e_h,bv,&wattrs); + free( (unichar_t *) wattrs.icon_title ); + + GDrawGetSize(GDrawGetRoot(screen_display),&zoom); + zoom.x = BVPalettesWidth(); zoom.width -= zoom.x-10; + zoom.height -= 30; /* Room for title bar & such */ + GDrawSetZoom(gw,&zoom,-1); + + memset(&gd,0,sizeof(gd)); + gd.flags = gg_visible | gg_enabled; + gd.u.menu = mblist; + bv->mb = GMenuBarCreate( gw, &gd, NULL); + GGadgetGetSize(bv->mb,&gsize); + bv->mbh = gsize.height; + bv->infoh = GDrawPointsToPixels(gw,36); + + gd.pos.y = bv->mbh+bv->infoh; + gd.pos.width = sbsize = GDrawPointsToPixels(gw,_GScrollBar_Width); + gd.pos.height = pos.height-bv->mbh-bv->infoh - sbsize; + gd.pos.x = pos.width-sbsize; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + bv->vsb = GScrollBarCreate(gw,&gd,bv); + + gd.pos.y = pos.height-sbsize; gd.pos.height = sbsize; + gd.pos.width = pos.width - sbsize; + gd.pos.x = 0; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + bv->hsb = GScrollBarCreate(gw,&gd,bv); + + memset(&gd, '\0', sizeof(gd)); + memset(&ti, '\0', sizeof(ti)); + gd.pos.x = pos.width - GDrawPointsToPixels(gw,116); + gd.pos.y = bv->mbh + GDrawPointsToPixels(gw,6); + gd.pos.width = GDrawPointsToPixels(gw,106); + gd.label = &ti; + ti.text = (unichar_t *) _STR_RecalculateBitmaps; + ti.text_in_resource = true; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + if ( fv->sf->onlybitmaps ) + gd.flags = gg_pos_in_pixels; + gd.handle_controlevent = BVRecalc; + bv->recalc = GButtonCreate(gw,&gd,bv); + + pos.y = bv->mbh+bv->infoh; pos.height -= bv->mbh + sbsize + bv->infoh; + pos.x = 0; pos.width -= sbsize; + wattrs.mask = wam_events|wam_cursor; + wattrs.event_masks = -1; + wattrs.cursor = ct_pencil; + bv->v = GWidgetCreateSubWindow(gw,&pos,v_e_h,bv,&wattrs); + + bv->height = pos.height; bv->width = pos.width; + bv->b1_tool = bvt_pencil; bv->cb1_tool = bvt_pointer; + bv->b2_tool = bvt_magnify; bv->cb2_tool = bvt_shift; + bv->s1_tool = bv->s2_tool = bv->er_tool = bvt_pointer; + bv->showing_tool = bvt_pencil; + bv->pressed_tool = bv->pressed_display = bv->active_tool = bvt_none; + + /*GWidgetHidePalettes();*/ + /*bv->tools = BVMakeTools(bv);*/ + /*bv->layers = BVMakeLayers(bv);*/ + + if ( infofamily==NULL ) { /* Yes, let's use the same resource name */ + infofamily = uc_copy(GResourceFindString("CharView.InfoFamily")); + if ( infofamily==NULL ) + infofamily = fixed; + } + + memset(&rq,0,sizeof(rq)); + rq.family_name = infofamily; + rq.point_size = -7; + rq.weight = 400; + bv->small = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawFontMetrics(bv->small,&as,&ds,&ld); + bv->sfh = as+ds; bv->sas = as; + + BVFit(bv); + GDrawSetVisible(bv->v,true); + GDrawSetVisible(gw,true); +return( bv ); +} + +BitmapView *BitmapViewCreatePick(int enc, FontView *fv) { + BDFFont *bdf; + SplineFont *sf; + + sf = fv->cidmaster ? fv->cidmaster : fv->sf; + + if ( fv->show!=fv->filled ) + bdf = fv->show; + else + for ( bdf = sf->bitmaps; bdf!=NULL && bdf->pixelsize!=BVShows.lastpixelsize; bdf = bdf->next ); + if ( bdf==NULL ) + bdf = sf->bitmaps; + + BDFMakeChar(bdf,enc); +return( BitmapViewCreate(bdf->chars[enc],bdf,fv)); +} + +void BitmapViewFree(BitmapView *bv) { + free(bv); +} + diff --git a/fontforge/bvedit.c b/fontforge/bvedit.c new file mode 100644 index 00000000..66fb6f38 --- /dev/null +++ b/fontforge/bvedit.c @@ -0,0 +1,757 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include "ustring.h" + +static int askfraction(int *xoff, int *yoff) { + static int lastx=1, lasty = 3; + char buffer[30]; + unichar_t ubuffer[30]; + unichar_t *ret, *end, *end2; + int xv, yv; + + sprintf( buffer, "%d:%d", lastx, lasty ); + uc_strcpy(ubuffer,buffer); + ret = GWidgetAskStringR(_STR_Skew,ubuffer,_STR_SkewRatio); + if ( ret==NULL ) +return( 0 ); + xv = u_strtol(ret,&end,10); + yv = u_strtol(end+1,&end2,10); + if ( xv==0 || xv>10 || xv<-10 || yv<=0 || yv>10 || *end!=':' || *end2!='\0' ) { + GWidgetErrorR( _STR_BadNumber,_STR_BadNumber ); + free(ret); +return( 0 ); + } + *xoff = lastx = xv; *yoff = lasty = yv; +return( 1 ); +} + +static void BCTransFunc(BDFChar *bc,enum bvtools type,int xoff,int yoff) { + int i, j; + uint8 *pt, *end, *pt2, *bitmap; + int bpl, temp; + int xmin, xmax; + + BCFlattenFloat(bc); + if ( type==bvt_transmove ) { + bc->xmin += xoff; bc->xmax += xoff; + bc->ymin += yoff; bc->ymax += yoff; + bitmap = NULL; + } else if ( type==bvt_flipv ) { + for ( i=0, j=bc->ymax-bc->ymin; ibitmap + i*bc->bytes_per_line; + pt2 = bc->bitmap + j*bc->bytes_per_line; + end = pt+bc->bytes_per_line; + while ( ptbyte_data ) { + if ( type==bvt_fliph ) { + bitmap = gcalloc((bc->ymax-bc->ymin+1)*bc->bytes_per_line,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + pt2 = bitmap + i*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + if ( pt[j>>3]&(1<<(7-(j&7))) ) { + int nj = bc->xmax-bc->xmin-j; + pt2[nj>>3] |= (1<<(7-(nj&7))); + } + } + } + } else if ( type==bvt_rotate180 ) { + bitmap = gcalloc((bc->ymax-bc->ymin+1)*bc->bytes_per_line,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + pt2 = bitmap + (bc->ymax-bc->ymin-i)*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + if ( pt[j>>3]&(1<<(7-(j&7))) ) { + int nj = bc->xmax-bc->xmin-j; + pt2[nj>>3] |= (1<<(7-(nj&7))); + } + } + } + } else if ( type==bvt_rotate90cw ) { + bpl = ((bc->ymax-bc->ymin)>>3) + 1; + bitmap = gcalloc((bc->xmax-bc->xmin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + if ( pt[j>>3]&(1<<(7-(j&7))) ) { + int nx = bc->ymax-bc->ymin-i; + bitmap[j*bpl+(nx>>3)] |= (1<<(7-(nx&7))); + } + } + } + bc->bytes_per_line = bpl; + temp = bc->xmax; bc->xmax = bc->ymax; bc->ymax = temp; + temp = bc->xmin; bc->xmin = bc->ymin; bc->ymin = temp; + } else if ( type==bvt_rotate90ccw ) { + bpl = ((bc->ymax-bc->ymin)>>3) + 1; + bitmap = gcalloc((bc->xmax-bc->xmin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + if ( pt[j>>3]&(1<<(7-(j&7))) ) { + int ny = bc->xmax-bc->xmin-j; + bitmap[ny*bpl+(i>>3)] |= (1<<(7-(i&7))); + } + } + } + bc->bytes_per_line = bpl; + temp = bc->xmax; bc->xmax = bc->ymax; bc->ymax = temp; + temp = bc->xmin; bc->xmin = bc->ymin; bc->ymin = temp; + } else /* if ( type==bvt_skew ) */ { + if ( xoff>0 ) { + xmin = bc->xmin+(xoff*bc->ymin)/yoff; + xmax = bc->xmax+(xoff*bc->ymax)/yoff; + } else { + xmin = bc->xmin+(xoff*bc->ymax)/yoff; + xmax = bc->xmax+(xoff*bc->ymin)/yoff; + } + bpl = ((xmax-xmin)>>3) + 1; + bitmap = gcalloc((bc->ymax-bc->ymin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + pt2 = bitmap + i*bpl; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + if ( pt[j>>3]&(1<<(7-(j&7))) ) { + int nj = j+bc->xmin-xmin + (xoff*(bc->ymax-i))/yoff; + pt2[nj>>3] |= (1<<(7-(nj&7))); + } + } + } + bc->xmax = xmax; bc->xmin = xmin; bc->bytes_per_line = bpl; + } + } else { /* Byte data */ + if ( type==bvt_fliph ) { + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + for ( j=0; j<=(bc->xmax-bc->xmin)/2; ++j ) { + int nj = bc->xmax-bc->xmin-j; + int temp = pt[nj]; + pt[nj] = pt[j]; + pt[j] = temp; + } + } + bitmap = NULL; + } else if ( type==bvt_rotate180 ) { + bitmap = gcalloc((bc->ymax-bc->ymin+1)*bc->bytes_per_line,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + pt2 = bitmap + (bc->ymax-bc->ymin-i)*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + int nj = bc->xmax-bc->xmin-j; + pt2[nj] = pt[j]; + } + } + } else if ( type==bvt_rotate90cw ) { + bpl = bc->ymax-bc->ymin + 1; + bitmap = gcalloc((bc->xmax-bc->xmin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + int nx = bc->ymax-bc->ymin-i; + bitmap[j*bpl+nx] = pt[j]; + } + } + bc->bytes_per_line = bpl; + temp = bc->xmax; bc->xmax = bc->ymax; bc->ymax = temp; + temp = bc->xmin; bc->xmin = bc->ymin; bc->ymin = temp; + } else if ( type==bvt_rotate90ccw ) { + bpl = bc->ymax-bc->ymin + 1; + bitmap = gcalloc((bc->xmax-bc->xmin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + int ny = bc->xmax-bc->xmin-j; + bitmap[ny*bpl+i] = pt[j]; + } + } + bc->bytes_per_line = bpl; + temp = bc->xmax; bc->xmax = bc->ymax; bc->ymax = temp; + temp = bc->xmin; bc->xmin = bc->ymin; bc->ymin = temp; + } else /* if ( type==bvt_skew ) */ { + if ( xoff>0 ) { + xmin = bc->xmin+(xoff*bc->ymin)/yoff; + xmax = bc->xmax+(xoff*bc->ymax)/yoff; + } else { + xmin = bc->xmin+(xoff*bc->ymax)/yoff; + xmax = bc->xmax+(xoff*bc->ymin)/yoff; + } + bpl = xmax-xmin + 1; + bitmap = gcalloc((bc->ymax-bc->ymin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + pt2 = bitmap + i*bpl; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + int nj = j+bc->xmin-xmin + (xoff*(bc->ymax-i))/yoff; + pt2[nj] = pt[j]; + } + } + bc->xmax = xmax; bc->xmin = xmin; bc->bytes_per_line = bpl; + } + } + if ( bitmap!=NULL ) { + free(bc->bitmap); + bc->bitmap = bitmap; + } + BCCompressBitmap(bc); +} + +void BCTrans(BDFFont *bdf,BDFChar *bc,BVTFunc *bvts,FontView *fv ) { + int xoff=0, yoff=0, i; + + if ( bvts[0].func==bvt_none ) +return; + BCPreserveState(bc); + for ( i=0; bvts[i].func!=bvt_none; ++i ) { + if ( bvts[i].func==bvt_transmove ) { + xoff = rint(bvts[i].x*bdf->pixelsize/(fv->sf->ascent+fv->sf->descent)); + yoff = rint(bvts[i].y*bdf->pixelsize/(fv->sf->ascent+fv->sf->descent)); + } else if ( bvts[i].func==bvt_skew ) { + xoff = bvts[i].x; + yoff = bvts[i].y; + } + BCTransFunc(bc,bvts[i].func,xoff,yoff); + } + BCCharChangedUpdate(bc); +} + +void BCRotateCharForVert(BDFChar *bc,BDFChar *from, BDFFont *frombdf) { + /* Take the image in from, make a copy of it, put it in bc, rotate it */ + /* shift it around slightly so it is aligned properly to work as a CJK */ + /* vertically displayed latin letter */ + int xmin, ymax; + + BCPreserveState(bc); + BCFlattenFloat(from); + free(bc->bitmap); + bc->xmin = from->xmin; bc->xmax = from->xmax; bc->ymin = from->ymin; bc->ymax = from->ymax; + bc->width = from->width; bc->bytes_per_line = from->bytes_per_line; + bc->bitmap = galloc(bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + memcpy(bc->bitmap,from->bitmap,bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + BCTransFunc(bc,bvt_rotate90cw,0,0); + xmin = frombdf->descent + from->ymin; + ymax = frombdf->ascent - from->xmin; + bc->xmax += xmin-bc->xmin; bc->xmin = xmin; + bc->ymin += ymax-bc->ymax-1; bc->ymax = ymax-1; + bc->width = frombdf->pixelsize; +} + +void BVRotateBitmap(BitmapView *bv,enum bvtools type ) { + int xoff=0, yoff=0; + + if ( type==bvt_skew ) + if ( !askfraction(&xoff,&yoff)) +return; + BCPreserveState(bv->bc); + BCTransFunc(bv->bc,type,xoff,yoff); + BCCharChangedUpdate(bv->bc); +} + +static void BCExpandBitmap(BDFChar *bc, int x, int y) { + int xmin, xmax, bpl, ymin, ymax; + uint8 *bitmap; + int i,j,nj; + uint8 *pt, *npt; + + if ( xxmin || x>bc->xmax || yymin || y>bc->ymax ) { + xmin = xxmin?x:bc->xmin; + xmax = x>bc->xmax?x:bc->xmax; + ymin = yymin?y:bc->ymin; + ymax = y>bc->ymax?y:bc->ymax; + if ( !bc->byte_data ) { + bpl = ((xmax-xmin)>>3) + 1; + bitmap = gcalloc((ymax-ymin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + npt = bitmap + (i+ymax-bc->ymax)*bpl; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + if ( pt[j>>3] & (1<<(7-(j&7))) ) { + nj = j+bc->xmin-xmin; + npt[nj>>3] |= (1<<(7-(nj&7))); + } + } + } + } else { + bpl = xmax-xmin + 1; + bitmap = gcalloc((ymax-ymin+1)*bpl,sizeof(uint8)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + pt = bc->bitmap + i*bc->bytes_per_line; + npt = bitmap + (i+ymax-bc->ymax)*bpl; + memcpy(npt+bc->xmin-xmin,pt,bc->bytes_per_line); + } + } + free(bc->bitmap); + bc->bitmap = bitmap; + bc->xmin = xmin; bc->xmax = xmax; bc->bytes_per_line = bpl; + bc->ymin = ymin; bc->ymax = ymax; + } +} + +void BCSetPoint(BDFChar *bc, int x, int y, int color ) { + + if ( xxmin || x>bc->xmax || yymin || y>bc->ymax ) { + if ( color==0 ) +return; /* Already clear */ + BCExpandBitmap(bc,x,y); + } + y = bc->ymax-y; + x -= bc->xmin; + if ( bc->byte_data ) + bc->bitmap[y*bc->bytes_per_line+x] = color; + else if ( color==0 ) + bc->bitmap[y*bc->bytes_per_line+(x>>3)] &= ~(1<<(7-(x&7))); + else + bc->bitmap[y*bc->bytes_per_line+(x>>3)] |= (1<<(7-(x&7))); +} + +static void BCBresenhamLine(BitmapView *bv, + void (*SetPoint)(BitmapView *,int x, int y, void *data),void *data) { + /* Draw a line from (pressed_x,pressed_y) to (info_x,info_y) */ + /* and call SetPoint for each point */ + int dx,dy,incr1,incr2,d,x,y,xend; + int x1 = bv->pressed_x, y1 = bv->pressed_y; + int x2 = bv->info_x, y2 = bv->info_y; + int up; + + if ( y2x2 ) { + x = x2; y = y2; + xend = x1; + up = -1; + } else { + x = x1; y = y1; + xend = x2; + up = 1; + } + (SetPoint)(bv,x,y,data); + while ( xx2 ) up = -1; else up = 1; + (SetPoint)(bv,x,y,data); + while ( yactive_tool == bvt_filledelipse ) { + int j; + for ( j=2*oy+ymod-y; j<=y; ++j ) { + SetPoint(bv,x,j,data); + SetPoint(bv,2*ox+xmod-x,j,data); + } + } else { + SetPoint(bv,x,y,data); + SetPoint(bv,x,2*oy+ymod-y,data); + SetPoint(bv,2*ox+xmod-x,y,data); + SetPoint(bv,2*ox+xmod-x,2*oy+ymod-y,data); + } +} + +void BCGeneralFunction(BitmapView *bv, + void (*SetPoint)(BitmapView *,int x, int y, void *data),void *data) { + int i, j; + int xmin, xmax, ymin, ymax; + int ox, oy, modx, mody; + int dx, dy, c,d,dx2,dy2,xp,yp; + int x,y; + + if ( bv->pressed_xinfo_x ) { + xmin = bv->pressed_x; xmax = bv->info_x; + } else { + xmin = bv->info_x; xmax = bv->pressed_x; + } + if ( bv->pressed_yinfo_y ) { + ymin = bv->pressed_y; ymax = bv->info_y; + } else { + ymin = bv->info_y; ymax = bv->pressed_y; + } + + switch ( bv->active_tool ) { + case bvt_line: + BCBresenhamLine(bv,SetPoint,data); + break; + case bvt_rect: + for ( i=xmin; i<=xmax; ++i ) { + SetPoint(bv,i,bv->pressed_y,data); + SetPoint(bv,i,bv->info_y,data); + } + for ( i=ymin; i<=ymax; ++i ) { + SetPoint(bv,bv->pressed_x,i,data); + SetPoint(bv,bv->info_x,i,data); + } + break; + case bvt_filledrect: + for ( i=xmin; i<=xmax; ++i ) { + for ( j=ymin; j<=ymax; ++j ) + SetPoint(bv,i,j,data); + } + break; + case bvt_elipse: case bvt_filledelipse: + if ( xmax==xmin || ymax==ymin ) /* degenerate case */ + BCBresenhamLine(bv,SetPoint,data); + else { + ox = floor( (xmin+xmax)/2.0 ); + oy = floor( (ymin+ymax)/2.0 ); + modx = (xmax+xmin)&1; mody = (ymax+ymin)&1; + dx = ox-xmin; + dy = oy-ymin; + dx2 = dx*dx; dy2 = dy*dy; + xp = 0; yp = 4*dy*dx2; + c = dy2+(2-4*dy)*dx2; d = 2*dy2 + (1-2*dy)*dx2; + x = ox+modx; y = ymax; + CirclePoints(bv,x,y,ox,oy,modx,mody,SetPoint,data); + while ( x!=xmax ) { +#define move_right() (c += 4*dy2+xp, d += 6*dy2+xp, ++x, xp += 4*dy2 ) +#define move_down() (c += 6*dx2-yp, d += 4*dx2-yp, --y, yp -= 4*dx2 ) + if ( d<0 || y==0 ) + move_right(); + else if ( c > 0 ) + move_down(); + else { + move_right(); + move_down(); + } +#undef move_right +#undef move_down + if ( yactive_tool==bvt_elipse ) { + /* there may be quite a gap between the the two semi-circles */ + /* because the tangent is nearly vertical here. So just fill */ + /* it in */ + int j; + for ( j=2*oy+mody-y; j<=y; ++j ) { + SetPoint(bv,x,j,data); + SetPoint(bv,2*ox+modx-x,j,data); + } + } + } + break; + } +} + +void BDFFloatFree(BDFFloat *sel) { + if ( sel==NULL ) +return; + free(sel->bitmap); + free(sel); +} + +BDFFloat *BDFFloatCopy(BDFFloat *sel) { + BDFFloat *new; + if ( sel==NULL ) +return(NULL); + new = galloc(sizeof(BDFFloat)); + *new = *sel; + new->bitmap = galloc(sel->bytes_per_line*(sel->ymax-sel->ymin+1)); + memcpy(new->bitmap,sel->bitmap,sel->bytes_per_line*(sel->ymax-sel->ymin+1)); +return( new ); +} + +BDFFloat *BDFFloatConvert(BDFFloat *sel,int todepth,int fromdepth) { + BDFFloat *new; + int i,j,fdiv,tdiv; + if ( sel==NULL ) +return(NULL); + + if ( todepth==fromdepth ) +return( BDFFloatCopy(sel)); + + new = galloc(sizeof(BDFFloat)); + *new = *sel; + new->byte_data = todepth!=1; + new->depth = todepth; + new->bytes_per_line = new->byte_data ? new->xmax-new->xmin+1 : ((new->xmax-new->xmin)>>3)+1; + new->bitmap = gcalloc(new->bytes_per_line*(sel->ymax-sel->ymin+1),1); + if ( fromdepth==1 ) { + tdiv = ((1<ymax-sel->ymin; ++i ) { + for ( j=0; j<=sel->xmax-sel->xmin; ++j ) { + if ( sel->bitmap[i*sel->bytes_per_line+(j>>3)]&(0x80>>(j&7)) ) + new->bitmap[i*new->bytes_per_line+j] = tdiv; + } + } + } else if ( todepth==1 ) { + fdiv = (1<ymax-sel->ymin; ++i ) { + for ( j=0; j<=sel->xmax-sel->xmin; ++j ) { + if ( sel->bitmap[i*sel->bytes_per_line+j]>=fdiv ) + new->bitmap[i*new->bytes_per_line+(j>>3)] |= (0x80>>(j&7)); + } + } + } else { + fdiv = 255/((1<bitmap,sel->bitmap,sel->bytes_per_line*(sel->ymax-sel->ymin+1)); + for ( i=0 ; ibytes_per_line*(sel->ymax-sel->ymin+1); ++i ) + new->bitmap[i] = (sel->bitmap[i]*fdiv + tdiv/2)/tdiv; + } +return( new ); +} + +/* Creates a floating selection, and clears out the underlying bitmap */ +BDFFloat *BDFFloatCreate(BDFChar *bc,int xmin,int xmax,int ymin,int ymax, int clear) { + BDFFloat *new; + int x,y; + uint8 *bpt, *npt; + + if ( bc->selection!=NULL ) { + BCFlattenFloat(bc); + bc->selection = NULL; + } + BCCompressBitmap(bc); + + if ( xmin>xmax ) { + xmin ^= xmax; xmax ^= xmin; xmin ^= xmax; + } + if ( ymin>ymax ) { + ymin ^= ymax; ymax ^= ymin; ymin ^= ymax; + } + if ( xminxmin ) xmin = bc->xmin; + if ( xmax>bc->xmax ) xmax = bc->xmax; + if ( yminymin ) ymin = bc->ymin; + if ( ymax>bc->ymax ) ymax = bc->ymax; + if ( xmin>xmax || ymin>ymax ) +return( NULL ); + new = galloc(sizeof(BDFFloat)); + new->xmin = xmin; + new->xmax = xmax; + new->ymin = ymin; + new->ymax = ymax; + new->byte_data = bc->byte_data; + new->depth = bc->depth; + if ( bc->byte_data ) { + new->bytes_per_line = xmax-xmin+1; + new->bitmap = gcalloc(new->bytes_per_line*(ymax-ymin+1),sizeof(uint8)); + for ( y=ymin; y<=ymax; ++y ) { + bpt = bc->bitmap + (bc->ymax-y)*bc->bytes_per_line; + npt = new->bitmap + (ymax-y)*new->bytes_per_line; + memcpy(npt,bpt+xmin-bc->xmin,xmax-xmin+1); + if ( clear ) + memset(bpt+xmin-bc->xmin,0,xmax-xmin+1); + } + } else { + new->bytes_per_line = ((xmax-xmin)>>3)+1; + new->bitmap = gcalloc(new->bytes_per_line*(ymax-ymin+1),sizeof(uint8)); + for ( y=ymin; y<=ymax; ++y ) { + bpt = bc->bitmap + (bc->ymax-y)*bc->bytes_per_line; + npt = new->bitmap + (ymax-y)*new->bytes_per_line; + for ( x=xmin; x<=xmax; ++x ) { + int bx = x-bc->xmin, nx = x-xmin; + if ( bpt[bx>>3]&(1<<(7-(bx&7))) ) { + npt[nx>>3] |= (1<<(7-(nx&7))); + if ( clear ) + bpt[bx>>3] &= ~(1<<(7-(bx&7))); + } + } + } + } + if ( clear ) + bc->selection = new; +return( new ); +} + +void BCFlattenFloat(BDFChar *bc ) { + /* flatten any floating selection */ + BDFFloat *sel = bc->selection; + int x,y; + uint8 *bpt, *spt; + + if ( sel!=NULL ) { + BCExpandBitmap(bc,sel->xmin,sel->ymin); + BCExpandBitmap(bc,sel->xmax,sel->ymax); + if ( bc->byte_data ) { + for ( y=sel->ymin; y<=sel->ymax; ++y ) { + bpt = bc->bitmap + (bc->ymax-y)*bc->bytes_per_line; + spt = sel->bitmap + (sel->ymax-y)*sel->bytes_per_line; + memcpy(bpt+sel->xmin-bc->xmin,spt,sel->xmax-sel->xmin+1); + } + } else { + for ( y=sel->ymin; y<=sel->ymax; ++y ) { + bpt = bc->bitmap + (bc->ymax-y)*bc->bytes_per_line; + spt = sel->bitmap + (sel->ymax-y)*sel->bytes_per_line; + for ( x=sel->xmin; x<=sel->xmax; ++x ) { + int bx = x-bc->xmin, sx = x-sel->xmin; + if ( spt[sx>>3]&(1<<(7-(sx&7))) ) + bpt[bx>>3] |= (1<<(7-(bx&7))); + else + bpt[bx>>3] &= ~(1<<(7-(bx&7))); + } + } + } + BDFFloatFree(sel); + bc->selection = NULL; + } +} + +void BCPasteInto(BDFChar *bc,BDFChar *rbc,int ixoff,int iyoff, int invert, int cleartoo) { + int x,y; + uint8 *bpt, *rpt; + + BCExpandBitmap(bc,rbc->xmin+ixoff,rbc->ymin+iyoff); + BCExpandBitmap(bc,rbc->xmax+ixoff,rbc->ymax+iyoff); + for ( y=rbc->ymin; y<=rbc->ymax; ++y ) { + bpt = bc->bitmap + (bc->ymax-(y+iyoff))*bc->bytes_per_line; + if ( invert ) + rpt = rbc->bitmap + y*rbc->bytes_per_line; + else + rpt = rbc->bitmap + (rbc->ymax-y)*rbc->bytes_per_line; + if ( bc->byte_data ) + memcpy(bpt+x+ixoff-bc->xmax,rpt,rbc->xmax-rbc->xmin+1); + else { + for ( x=rbc->xmin; x<=rbc->xmax; ++x ) { + int bx = x+ixoff-bc->xmin, rx = x-rbc->xmin; + if ( rpt[rx>>3]&(1<<(7-(rx&7))) ) + bpt[bx>>3] |= (1<<(7-(bx&7))); + else if ( cleartoo ) + bpt[bx>>3] &= ~(1<<(7-(bx&7))); + } + } + } + BCCompressBitmap(bc); +} + +static BDFChar *BCScale(BDFChar *old,int from, int to) { + BDFChar *new; + int x,y, ox,oy, oxs,oys, oxend, oyend; + real tot, scale; + real yscale, xscale; + real dto = to; + + if ( old==NULL || old->byte_data ) +return( NULL ); + new = chunkalloc(sizeof(BDFChar)); + new->sc = old->sc; + new->xmin = rint(old->xmin*dto/from); + new->ymin = rint(old->ymin*dto/from); + new->xmax = new->xmin + rint((old->xmax-old->xmin+1)*dto/from-1); + new->ymax = new->ymin + rint((old->ymax-old->ymin+1)*dto/from-1); + if ( new->sc!=NULL && new->sc->width != new->sc->parent->ascent+new->sc->parent->descent ) + new->width = rint(new->sc->width*dto/(new->sc->parent->ascent+new->sc->parent->descent)+.5); + else + new->width = rint(old->width*dto/from+.5); + new->bytes_per_line = (new->xmax-new->xmin)/8+1; + new->bitmap = gcalloc((new->ymax-new->ymin+1)*new->bytes_per_line,sizeof(char)); + new->enc = old->enc; + + scale = dto/from; + scale *= scale; + scale /= 2; + + for ( y=0; y<=new->ymax-new->ymin; ++y ) for ( x=0; x<=new->xmax-new->xmin; ++x ) { + tot = 0; + oys = floor(y*from/dto); oyend = ceil((y+1)*from/dto); + oxs = floor(x*from/dto); oxend = ceil((x+1)*from/dto); + for ( oy = oys; oyymax-old->ymin; ++oy ) { + yscale = 1; + if ( oy==oys && oy==oyend-1 ) + yscale = 1-(oyend - (y+1)*dto/from) - (y*dto/from - oys); + else if ( oy==oys ) + yscale = 1-(y*dto/from-oys); + else if ( oy==oyend-1 ) + yscale = 1-(oyend - (y+1)*dto/from); + for ( ox = oxs; oxxmax-old->xmin; ++ox ) { + if ( old->bitmap[oy*old->bytes_per_line + (ox>>3)] & (1<<(7-(ox&7))) ) { + xscale = 1; + if ( ox==oxs && ox==oxend-1 ) + xscale = 1-(oxend - (x+1)*dto/from) - (x*dto/from - oxs); + else if ( ox==oxs ) + xscale = 1-(x*dto/from-oxs); + else if ( ox==oxend-1 ) + xscale = 1-(oxend - (x+1)*dto/from); + tot += yscale*xscale; + } + } + } + if ( tot>=scale ) + new->bitmap[y*new->bytes_per_line + (x>>3)] |= (1<<(7-(x&7))); + } + +return( new ); +} + +BDFFont *BitmapFontScaleTo(BDFFont *old, int to) { + BDFFont *new = gcalloc(1,sizeof(BDFFont)); + int i; + + if ( old->clut!=NULL ) { + fprintf( stderr, "Attempt to scale a greymap font, not supported\n" ); +return( NULL ); + } + + new->sf = old->sf; + new->charcnt = old->charcnt; + new->chars = galloc(new->charcnt*sizeof(BDFChar *)); + new->pixelsize = to; + new->ascent = (old->ascent*to+.5)/old->pixelsize; + new->descent = to-new->ascent; + new->encoding_name = old->encoding_name; + new->foundry = copy(old->foundry); + for ( i=0; icharcnt; ++i ) + new->chars[i] = BCScale(old->chars[i],old->pixelsize,to); +return( new ); +} diff --git a/fontforge/charinfo.c b/fontforge/charinfo.c new file mode 100644 index 00000000..cedb923d --- /dev/null +++ b/fontforge/charinfo.c @@ -0,0 +1,5984 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "pfaeditui.h" +#include +#include +#include +#include +#include +#include "ttf.h" /* For MAC_DELETED_GLYPH_NAME */ + +typedef struct charinfo { + CharView *cv; + SplineChar *sc; + SplineChar *oldsc; /* oldsc->charinfo will point to us. Used to keep track of that pointer */ + GWindow gw; + int done, first, changed; +} CharInfo; + +#define CI_Width 218 +#define CI_Height 272 + +#define CID_UName 1001 +#define CID_UValue 1002 +#define CID_UChar 1003 +#define CID_Cancel 1005 +#define CID_ComponentMsg 1006 +#define CID_Components 1007 +#define CID_Comment 1008 +#define CID_Color 1009 +#define CID_GClass 1010 +#define CID_Tabs 1011 + +/* Offsets for repeated fields. add 100*index */ +#define CID_List 1020 +#define CID_New 1021 +#define CID_Delete 1022 +#define CID_Edit 1023 +#define CID_Copy 1024 +#define CID_Paste 1025 + +#define CID_PST 1111 +#define CID_Tag 1112 +#define CID_Contents 1113 +#define CID_SelectResults 1114 +#define CID_MergeResults 1115 +#define CID_RestrictSelection 1116 + +static GTextInfo glyphclasses[] = { + { (unichar_t *) _STR_Automatic, NULL, 0, 0, NULL, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_NoClass, NULL, 0, 0, NULL, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_BaseGlyph, NULL, 0, 0, NULL, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_LigatureL, NULL, 0, 0, NULL, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MarkGlyph, NULL, 0, 0, NULL, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Component, NULL, 0, 0, NULL, NULL, false, false, false, false, false, false, false, true }, + { NULL, NULL } +}; + +static GTextInfo std_colors[] = { + { (unichar_t *) _STR_Default, &def_image, 0, 0, (void *) COLOR_DEFAULT, NULL, false, true, false, false, false, false, false, true }, + { NULL, &white_image, 0, 0, (void *) 0xffffff, NULL, false, true }, + { NULL, &red_image, 0, 0, (void *) 0xff0000, NULL, false, true }, + { NULL, &green_image, 0, 0, (void *) 0x00ff00, NULL, false, true }, + { NULL, &blue_image, 0, 0, (void *) 0x0000ff, NULL, false, true }, + { NULL, &yellow_image, 0, 0, (void *) 0xffff00, NULL, false, true }, + { NULL, &cyan_image, 0, 0, (void *) 0x00ffff, NULL, false, true }, + { NULL, &magenta_image, 0, 0, (void *) 0xff00ff, NULL, false, true }, + { NULL, NULL } +}; + +GTextInfo scripts[] = { + { (unichar_t *) _STR_Arab, NULL, 0, 0, (void *) CHR('a','r','a','b'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Aramaic, NULL, 0, 0, (void *) CHR('a','r','a','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Armn, NULL, 0, 0, (void *) CHR('a','r','m','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Avestan, NULL, 0, 0, (void *) CHR('a','v','e','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Batak, NULL, 0, 0, (void *) CHR('b','a','t','k'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Beng, NULL, 0, 0, (void *) CHR('b','e','n','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Bliss, NULL, 0, 0, (void *) CHR('b','l','i','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Bopo, NULL, 0, 0, (void *) CHR('b','o','p','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Brahmi, NULL, 0, 0, (void *) CHR('b','r','a','h'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Brai, NULL, 0, 0, (void *) CHR('b','r','a','i'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Buginese, NULL, 0, 0, (void *) CHR('b','u','g','i'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Buhid, NULL, 0, 0, (void *) CHR('b','u','h','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Byzm, NULL, 0, 0, (void *) CHR('b','y','z','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Cans, NULL, 0, 0, (void *) CHR('c','a','n','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Cham, NULL, 0, 0, (void *) CHR('c','h','a','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Cher, NULL, 0, 0, (void *) CHR('c','h','e','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Cirth, NULL, 0, 0, (void *) CHR('c','i','r','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Hani, NULL, 0, 0, (void *) CHR('h','a','n','i'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_CyproMinoan, NULL, 0, 0, (void *) CHR('c','p','r','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_CypriotSyl, NULL, 0, 0, (void *) CHR('c','p','m','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Cyrl, NULL, 0, 0, (void *) CHR('c','y','r','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_DFLT, NULL, 0, 0, (void *) CHR('D','F','L','T'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Deseret, NULL, 0, 0, (void *) CHR('d','s','r','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Deva, NULL, 0, 0, (void *) CHR('d','e','v','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_EgyptianDemotic, NULL, 0, 0, (void *) CHR('e','g','y','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_EgyptianHieratic, NULL, 0, 0, (void *) CHR('e','g','y','h'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_EgyptianHieroglyphs, NULL, 0, 0, (void *) CHR('e','g','y','p'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Ethi, NULL, 0, 0, (void *) CHR('e','t','h','i'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Geor, NULL, 0, 0, (void *) CHR('g','e','o','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Glagolitic, NULL, 0, 0, (void *) CHR('g','l','a','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Gothic, NULL, 0, 0, (void *) CHR('g','o','t','h'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Grek, NULL, 0, 0, (void *) CHR('g','r','e','k'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Gujr, NULL, 0, 0, (void *) CHR('g','u','j','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Guru, NULL, 0, 0, (void *) CHR('g','u','r','u'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Jamo, NULL, 0, 0, (void *) CHR('j','a','m','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Hang, NULL, 0, 0, (void *) CHR('h','a','n','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Hanunoo, NULL, 0, 0, (void *) CHR('h','a','n','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Hebr, NULL, 0, 0, (void *) CHR('h','e','b','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HmongPahawh, NULL, 0, 0, (void *) CHR('h','m','n','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Indus, NULL, 0, 0, (void *) CHR('i','n','d','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OldItalic, NULL, 0, 0, (void *) CHR('i','t','a','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Javanese, NULL, 0, 0, (void *) CHR('j','a','v','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_KayahLi, NULL, 0, 0, (void *) CHR('k','a','l','i'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Kana, NULL, 0, 0, (void *) CHR('k','a','n','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Kharosthi, NULL, 0, 0, (void *) CHR('k','h','a','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Knda, NULL, 0, 0, (void *) CHR('k','n','d','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Khmr, NULL, 0, 0, (void *) CHR('k','h','m','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Lao , NULL, 0, 0, (void *) CHR('l','a','o',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Latn, NULL, 0, 0, (void *) CHR('l','a','t','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Lepcha, NULL, 0, 0, (void *) CHR('l','e','p','c'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Limbu, NULL, 0, 0, (void *) CHR('l','i','m','b'), NULL, false, false, false, false, false, false, false, true }, /* Not in ISO 15924 !!!!!, just guessing */ + { (unichar_t *) _STR_LinearA, NULL, 0, 0, (void *) CHR('l','i','n','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_LinearB, NULL, 0, 0, (void *) CHR('l','i','n','b'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Mandaean, NULL, 0, 0, (void *) CHR('m','a','n','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Mayan, NULL, 0, 0, (void *) CHR('m','a','y','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Mlym, NULL, 0, 0, (void *) CHR('m','l','y','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Mong, NULL, 0, 0, (void *) CHR('m','o','n','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Mymr, NULL, 0, 0, (void *) CHR('m','y','m','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Ogam, NULL, 0, 0, (void *) CHR('o','g','a','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Orya, NULL, 0, 0, (void *) CHR('o','r','y','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Osmanya, NULL, 0, 0, (void *) CHR('o','s','m','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Pahlavi, NULL, 0, 0, (void *) CHR('p','a','l','v'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Permic, NULL, 0, 0, (void *) CHR('p','e','r','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Phoenician, NULL, 0, 0, (void *) CHR('p','h','n','x'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Phaistos, NULL, 0, 0, (void *) CHR('p','h','s','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Pollard, NULL, 0, 0, (void *) CHR('p','l','r','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Rongorongo, NULL, 0, 0, (void *) CHR('r','o','r','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Runr, NULL, 0, 0, (void *) CHR('r','u','n','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Shavian, NULL, 0, 0, (void *) CHR('s','h','a','w'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Sinh, NULL, 0, 0, (void *) CHR('s','i','n','h'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Syrc, NULL, 0, 0, (void *) CHR('s','y','r','c'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Tagbanwa, NULL, 0, 0, (void *) CHR('t','a','g','b'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TaiLe, NULL, 0, 0, (void *) CHR('t','a','i','l'), NULL, false, false, false, false, false, false, false, true }, /* Not in ISO 15924 !!!!!, just guessing */ + { (unichar_t *) _STR_Taml, NULL, 0, 0, (void *) CHR('t','a','m','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Telu, NULL, 0, 0, (void *) CHR('t','e','l','u'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Tengwar, NULL, 0, 0, (void *) CHR('t','e','n','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Tifinagh, NULL, 0, 0, (void *) CHR('t','f','n','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Tagalog, NULL, 0, 0, (void *) CHR('t','g','l','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Thaa, NULL, 0, 0, (void *) CHR('t','h','a','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Thai, NULL, 0, 0, (void *) CHR('t','h','a','i'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Tibt, NULL, 0, 0, (void *) CHR('t','i','b','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Ugaritic, NULL, 0, 0, (void *) CHR('u','g','r','t'), NULL, false, false, false, false, false, false, false, true }, /* Not in ISO 15924 !!!!!, just guessing */ + { (unichar_t *) _STR_Vai, NULL, 0, 0, (void *) CHR('v','a','i',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VisibleSpeech, NULL, 0, 0, (void *) CHR('v','i','s','p'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_CuneiformOP, NULL, 0, 0, (void *) CHR('x','p','e','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_CuneiformSA, NULL, 0, 0, (void *) CHR('x','s','u','x'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_CuneiformUg, NULL, 0, 0, (void *) CHR('x','u','g','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Yi , NULL, 0, 0, (void *) CHR('y','i',' ',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PrivateUseScript1 , NULL, 0, 0, (void *) CHR('q','a','a','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PrivateUseScript2 , NULL, 0, 0, (void *) CHR('q','a','a','b'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_UndeterminedScript , NULL, 0, 0, (void *) CHR('z','y','y','y'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_UncodedScript , NULL, 0, 0, (void *) CHR('z','z','z','z'), NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +GTextInfo languages[] = { + { (unichar_t *) _STR_OTFAbaza, NULL, 0, 0, (void *) CHR('A','B','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAbkhazian, NULL, 0, 0, (void *) CHR('A','B','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAdyghe, NULL, 0, 0, (void *) CHR('A','D','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAfrikaans, NULL, 0, 0, (void *) CHR('A','F','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAfar, NULL, 0, 0, (void *) CHR('A','F','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAgaw, NULL, 0, 0, (void *) CHR('A','G','W',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAltai, NULL, 0, 0, (void *) CHR('A','L','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAmharic, NULL, 0, 0, (void *) CHR('A','M','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFArabic, NULL, 0, 0, (void *) CHR('A','R','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAari, NULL, 0, 0, (void *) CHR('A','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFArakanese, NULL, 0, 0, (void *) CHR('A','R','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAssamese, NULL, 0, 0, (void *) CHR('A','S','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAthapaskan, NULL, 0, 0, (void *) CHR('A','T','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAvar, NULL, 0, 0, (void *) CHR('A','V','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAwadhi, NULL, 0, 0, (void *) CHR('A','W','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAymara, NULL, 0, 0, (void *) CHR('A','Y','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAzeri, NULL, 0, 0, (void *) CHR('A','Z','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBadaga, NULL, 0, 0, (void *) CHR('B','A','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBaghelkhandi, NULL, 0, 0, (void *) CHR('B','A','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBalkar, NULL, 0, 0, (void *) CHR('B','A','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBaule, NULL, 0, 0, (void *) CHR('B','A','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBerber, NULL, 0, 0, (void *) CHR('B','B','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBench, NULL, 0, 0, (void *) CHR('B','C','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBibleCree, NULL, 0, 0, (void *) CHR('B','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBelarussian, NULL, 0, 0, (void *) CHR('B','E','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBemba, NULL, 0, 0, (void *) CHR('B','E','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBengali, NULL, 0, 0, (void *) CHR('B','E','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBulgarian, NULL, 0, 0, (void *) CHR('B','G','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBhili, NULL, 0, 0, (void *) CHR('B','H','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBhojpuri, NULL, 0, 0, (void *) CHR('B','H','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBikol, NULL, 0, 0, (void *) CHR('B','I','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBilen, NULL, 0, 0, (void *) CHR('B','I','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBlackfoot, NULL, 0, 0, (void *) CHR('B','K','F',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBalochi, NULL, 0, 0, (void *) CHR('B','L','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBalante, NULL, 0, 0, (void *) CHR('B','L','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBalti, NULL, 0, 0, (void *) CHR('B','L','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBambara, NULL, 0, 0, (void *) CHR('B','M','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBamileke, NULL, 0, 0, (void *) CHR('B','M','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBreton, NULL, 0, 0, (void *) CHR('B','R','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBrahui, NULL, 0, 0, (void *) CHR('B','R','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBrajBhasha, NULL, 0, 0, (void *) CHR('B','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBurmese, NULL, 0, 0, (void *) CHR('B','R','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBashkir, NULL, 0, 0, (void *) CHR('B','S','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBeti, NULL, 0, 0, (void *) CHR('B','T','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCatalan, NULL, 0, 0, (void *) CHR('C','A','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCebuano, NULL, 0, 0, (void *) CHR('C','E','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChechen, NULL, 0, 0, (void *) CHR('C','H','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChahaGurage, NULL, 0, 0, (void *) CHR('C','H','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChattisgarhi, NULL, 0, 0, (void *) CHR('C','H','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChichewa, NULL, 0, 0, (void *) CHR('C','H','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChukchi, NULL, 0, 0, (void *) CHR('C','H','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChipewyan, NULL, 0, 0, (void *) CHR('C','H','P',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCherokee, NULL, 0, 0, (void *) CHR('C','H','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChuvash, NULL, 0, 0, (void *) CHR('C','H','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFComorian, NULL, 0, 0, (void *) CHR('C','M','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCoptic, NULL, 0, 0, (void *) CHR('C','O','P',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCree, NULL, 0, 0, (void *) CHR('C','R','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCarrier, NULL, 0, 0, (void *) CHR('C','R','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCrimeanTatar, NULL, 0, 0, (void *) CHR('C','R','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChurchSlavonic, NULL, 0, 0, (void *) CHR('C','S','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCzech, NULL, 0, 0, (void *) CHR('C','S','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDanish, NULL, 0, 0, (void *) CHR('D','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDargwa, NULL, 0, 0, (void *) CHR('D','A','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Default, NULL, 0, 0, (void *) DEFAULT_LANG, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFWoodsCree, NULL, 0, 0, (void *) CHR('D','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGermanStandard, NULL, 0, 0, (void *) CHR('D','E','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDogri, NULL, 0, 0, (void *) CHR('D','G','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDhivehi, NULL, 0, 0, (void *) CHR('D','H','V',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDjerma, NULL, 0, 0, (void *) CHR('D','J','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDangme, NULL, 0, 0, (void *) CHR('D','N','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Default, NULL, 0, 0, (void *) CHR('D','F','L','T'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDinka, NULL, 0, 0, (void *) CHR('D','N','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDungan, NULL, 0, 0, (void *) CHR('D','U','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDzongkha, NULL, 0, 0, (void *) CHR('D','Z','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEbira, NULL, 0, 0, (void *) CHR('E','B','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEasternCree, NULL, 0, 0, (void *) CHR('E','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEdo, NULL, 0, 0, (void *) CHR('E','D','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEfik, NULL, 0, 0, (void *) CHR('E','F','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGreek, NULL, 0, 0, (void *) CHR('E','L','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEnglish, NULL, 0, 0, (void *) CHR('E','N','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFErzya, NULL, 0, 0, (void *) CHR('E','R','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSpanish, NULL, 0, 0, (void *) CHR('E','S','P',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEstonian, NULL, 0, 0, (void *) CHR('E','T','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFBasque, NULL, 0, 0, (void *) CHR('E','U','Q',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEvenki, NULL, 0, 0, (void *) CHR('E','V','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEven, NULL, 0, 0, (void *) CHR('E','V','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEwe, NULL, 0, 0, (void *) CHR('E','W','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFrenchAntillean, NULL, 0, 0, (void *) CHR('F','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFarsi, NULL, 0, 0, (void *) CHR('F','A','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFinnish, NULL, 0, 0, (void *) CHR('F','I','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFijian, NULL, 0, 0, (void *) CHR('F','J','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFlemish, NULL, 0, 0, (void *) CHR('F','L','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFForestNenets, NULL, 0, 0, (void *) CHR('F','N','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFon, NULL, 0, 0, (void *) CHR('F','O','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFaroese, NULL, 0, 0, (void *) CHR('F','O','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFrenchStandard, NULL, 0, 0, (void *) CHR('F','R','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFrisian, NULL, 0, 0, (void *) CHR('F','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFriulian, NULL, 0, 0, (void *) CHR('F','R','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFuta, NULL, 0, 0, (void *) CHR('F','T','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFFulani, NULL, 0, 0, (void *) CHR('F','U','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGa, NULL, 0, 0, (void *) CHR('G','A','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGaelic, NULL, 0, 0, (void *) CHR('G','A','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGagauz, NULL, 0, 0, (void *) CHR('G','A','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGalician, NULL, 0, 0, (void *) CHR('G','A','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGarshuni, NULL, 0, 0, (void *) CHR('G','A','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGarhwali, NULL, 0, 0, (void *) CHR('G','A','W',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGeez, NULL, 0, 0, (void *) CHR('G','E','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGilyak, NULL, 0, 0, (void *) CHR('G','I','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGumuz, NULL, 0, 0, (void *) CHR('G','M','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGondi, NULL, 0, 0, (void *) CHR('G','O','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGreenlandic, NULL, 0, 0, (void *) CHR('G','R','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGaro, NULL, 0, 0, (void *) CHR('G','R','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGuarani, NULL, 0, 0, (void *) CHR('G','U','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGujarati, NULL, 0, 0, (void *) CHR('G','U','J',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHaitian, NULL, 0, 0, (void *) CHR('H','A','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHalam, NULL, 0, 0, (void *) CHR('H','A','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHarauti, NULL, 0, 0, (void *) CHR('H','A','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHausa, NULL, 0, 0, (void *) CHR('H','A','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHawaiin, NULL, 0, 0, (void *) CHR('H','A','W',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHammer_Banna, NULL, 0, 0, (void *) CHR('H','B','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHiligaynon, NULL, 0, 0, (void *) CHR('H','I','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHindi, NULL, 0, 0, (void *) CHR('H','I','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHighMari, NULL, 0, 0, (void *) CHR('H','M','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHindko, NULL, 0, 0, (void *) CHR('H','N','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHo, NULL, 0, 0, (void *) CHR('H','O',' ',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHarari, NULL, 0, 0, (void *) CHR('H','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFCroatian, NULL, 0, 0, (void *) CHR('H','R','V',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHungarian, NULL, 0, 0, (void *) CHR('H','U','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFArmenian, NULL, 0, 0, (void *) CHR('H','Y','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIgbo, NULL, 0, 0, (void *) CHR('I','B','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIjo, NULL, 0, 0, (void *) CHR('I','J','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIlokano, NULL, 0, 0, (void *) CHR('I','L','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIndonesian, NULL, 0, 0, (void *) CHR('I','N','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIngush, NULL, 0, 0, (void *) CHR('I','N','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFInuktitut, NULL, 0, 0, (void *) CHR('I','N','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIrish, NULL, 0, 0, (void *) CHR('I','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIrishTraditional, NULL, 0, 0, (void *) CHR('I','R','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFIcelandic, NULL, 0, 0, (void *) CHR('I','S','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFInariSami, NULL, 0, 0, (void *) CHR('I','S','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFItalian, NULL, 0, 0, (void *) CHR('I','T','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFHebrew, NULL, 0, 0, (void *) CHR('I','W','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFJavanese, NULL, 0, 0, (void *) CHR('J','A','V',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFYiddish, NULL, 0, 0, (void *) CHR('J','I','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFJapanese, NULL, 0, 0, (void *) CHR('J','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFJudezmo, NULL, 0, 0, (void *) CHR('J','U','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFJula, NULL, 0, 0, (void *) CHR('J','U','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKabardian, NULL, 0, 0, (void *) CHR('K','A','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKachchi, NULL, 0, 0, (void *) CHR('K','A','C',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKalenjin, NULL, 0, 0, (void *) CHR('K','A','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKannada, NULL, 0, 0, (void *) CHR('K','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKarachay, NULL, 0, 0, (void *) CHR('K','A','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFGeorgian, NULL, 0, 0, (void *) CHR('K','A','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKazakh, NULL, 0, 0, (void *) CHR('K','A','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKebena, NULL, 0, 0, (void *) CHR('K','E','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhutsuriGeorgian, NULL, 0, 0, (void *) CHR('K','G','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhakass, NULL, 0, 0, (void *) CHR('K','H','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhanty_Kazim, NULL, 0, 0, (void *) CHR('K','H','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhmer, NULL, 0, 0, (void *) CHR('K','H','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhanty_Shurishkar, NULL, 0, 0, (void *) CHR('K','H','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhanty_Vakhi, NULL, 0, 0, (void *) CHR('K','H','V',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhowar, NULL, 0, 0, (void *) CHR('K','H','W',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKikuyu, NULL, 0, 0, (void *) CHR('K','I','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKirghiz, NULL, 0, 0, (void *) CHR('K','I','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKisii, NULL, 0, 0, (void *) CHR('K','I','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKokni, NULL, 0, 0, (void *) CHR('K','K','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKalmyk, NULL, 0, 0, (void *) CHR('K','L','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKamba, NULL, 0, 0, (void *) CHR('K','M','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKumaoni, NULL, 0, 0, (void *) CHR('K','M','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKomo, NULL, 0, 0, (void *) CHR('K','M','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKomso, NULL, 0, 0, (void *) CHR('K','M','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKanuri, NULL, 0, 0, (void *) CHR('K','N','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKodagu, NULL, 0, 0, (void *) CHR('K','O','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKonkani, NULL, 0, 0, (void *) CHR('K','O','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKikongo, NULL, 0, 0, (void *) CHR('K','O','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKomi_Permyak, NULL, 0, 0, (void *) CHR('K','O','P',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKorean, NULL, 0, 0, (void *) CHR('K','O','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKomi_Zyrian, NULL, 0, 0, (void *) CHR('K','O','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKpelle, NULL, 0, 0, (void *) CHR('K','P','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKrio, NULL, 0, 0, (void *) CHR('K','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKarakalpak, NULL, 0, 0, (void *) CHR('K','R','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKarelian, NULL, 0, 0, (void *) CHR('K','R','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKaraim, NULL, 0, 0, (void *) CHR('K','R','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKaren, NULL, 0, 0, (void *) CHR('K','R','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKoorete, NULL, 0, 0, (void *) CHR('K','R','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKashmiri, NULL, 0, 0, (void *) CHR('K','S','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKhasi, NULL, 0, 0, (void *) CHR('K','S','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKildinSami, NULL, 0, 0, (void *) CHR('K','S','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKui, NULL, 0, 0, (void *) CHR('K','U','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKulvi, NULL, 0, 0, (void *) CHR('K','U','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKumyk, NULL, 0, 0, (void *) CHR('K','U','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKurdish, NULL, 0, 0, (void *) CHR('K','U','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKurukh, NULL, 0, 0, (void *) CHR('K','U','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKuy, NULL, 0, 0, (void *) CHR('K','U','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFKoryak, NULL, 0, 0, (void *) CHR('K','Y','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLadin, NULL, 0, 0, (void *) CHR('L','A','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLahuli, NULL, 0, 0, (void *) CHR('L','A','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLak, NULL, 0, 0, (void *) CHR('L','A','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLambani, NULL, 0, 0, (void *) CHR('L','A','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLao, NULL, 0, 0, (void *) CHR('L','A','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLatin, NULL, 0, 0, (void *) CHR('L','A','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLaz, NULL, 0, 0, (void *) CHR('L','A','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFL_Cree, NULL, 0, 0, (void *) CHR('L','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLadakhi, NULL, 0, 0, (void *) CHR('L','D','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLezgi, NULL, 0, 0, (void *) CHR('L','E','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLingala, NULL, 0, 0, (void *) CHR('L','I','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLowMari, NULL, 0, 0, (void *) CHR('L','M','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLimbu, NULL, 0, 0, (void *) CHR('L','M','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLomwe, NULL, 0, 0, (void *) CHR('L','M','W',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLowerSorbian, NULL, 0, 0, (void *) CHR('L','S','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLuleSami, NULL, 0, 0, (void *) CHR('L','S','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLithuanian, NULL, 0, 0, (void *) CHR('L','T','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLuba, NULL, 0, 0, (void *) CHR('L','U','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLuganda, NULL, 0, 0, (void *) CHR('L','U','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLuhya, NULL, 0, 0, (void *) CHR('L','U','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLuo, NULL, 0, 0, (void *) CHR('L','U','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFLatvian, NULL, 0, 0, (void *) CHR('L','V','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMajang, NULL, 0, 0, (void *) CHR('M','A','J',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMakua, NULL, 0, 0, (void *) CHR('M','A','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMalayalamTraditional, NULL, 0, 0, (void *) CHR('M','A','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMansi, NULL, 0, 0, (void *) CHR('M','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMarathi, NULL, 0, 0, (void *) CHR('M','A','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMarwari, NULL, 0, 0, (void *) CHR('M','A','W',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMbundu, NULL, 0, 0, (void *) CHR('M','B','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFManchu, NULL, 0, 0, (void *) CHR('M','C','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMooseCree, NULL, 0, 0, (void *) CHR('M','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMende, NULL, 0, 0, (void *) CHR('M','D','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMeen, NULL, 0, 0, (void *) CHR('M','E','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMizo, NULL, 0, 0, (void *) CHR('M','I','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMacedonian, NULL, 0, 0, (void *) CHR('M','K','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMale, NULL, 0, 0, (void *) CHR('M','L','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMalagasy, NULL, 0, 0, (void *) CHR('M','L','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMalinke, NULL, 0, 0, (void *) CHR('M','L','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMalayalamReformed, NULL, 0, 0, (void *) CHR('M','L','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMalay, NULL, 0, 0, (void *) CHR('M','L','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMandinka, NULL, 0, 0, (void *) CHR('M','N','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMongolian, NULL, 0, 0, (void *) CHR('M','N','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFManipuri, NULL, 0, 0, (void *) CHR('M','N','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFManinka, NULL, 0, 0, (void *) CHR('M','N','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFManxGaelic, NULL, 0, 0, (void *) CHR('M','N','X',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMoksha, NULL, 0, 0, (void *) CHR('M','O','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMoldavian, NULL, 0, 0, (void *) CHR('M','O','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMon, NULL, 0, 0, (void *) CHR('M','O','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMoroccan, NULL, 0, 0, (void *) CHR('M','O','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMaori, NULL, 0, 0, (void *) CHR('M','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMaithili, NULL, 0, 0, (void *) CHR('M','T','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMaltese, NULL, 0, 0, (void *) CHR('M','T','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFMundari, NULL, 0, 0, (void *) CHR('M','U','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNaga_Assamese, NULL, 0, 0, (void *) CHR('N','A','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNanai, NULL, 0, 0, (void *) CHR('N','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNaskapi, NULL, 0, 0, (void *) CHR('N','A','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFN_Cree, NULL, 0, 0, (void *) CHR('N','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNdebele, NULL, 0, 0, (void *) CHR('N','D','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNdonga, NULL, 0, 0, (void *) CHR('N','D','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNepali, NULL, 0, 0, (void *) CHR('N','E','P',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNewari, NULL, 0, 0, (void *) CHR('N','E','W',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNorwayHouseCree, NULL, 0, 0, (void *) CHR('N','H','C',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNisi, NULL, 0, 0, (void *) CHR('N','I','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNiuean, NULL, 0, 0, (void *) CHR('N','I','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNkole, NULL, 0, 0, (void *) CHR('N','K','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFDutch, NULL, 0, 0, (void *) CHR('N','L','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNogai, NULL, 0, 0, (void *) CHR('N','O','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNorwegian, NULL, 0, 0, (void *) CHR('N','O','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNorthernSami, NULL, 0, 0, (void *) CHR('N','S','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNorthernTai, NULL, 0, 0, (void *) CHR('N','T','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFEsperanto, NULL, 0, 0, (void *) CHR('N','T','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFNynorsk, NULL, 0, 0, (void *) CHR('N','Y','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFOji_Cree, NULL, 0, 0, (void *) CHR('O','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFOjibway, NULL, 0, 0, (void *) CHR('O','J','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFOriya, NULL, 0, 0, (void *) CHR('O','R','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFOromo, NULL, 0, 0, (void *) CHR('O','R','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFOssetian, NULL, 0, 0, (void *) CHR('O','S','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPalestinianAramaic, NULL, 0, 0, (void *) CHR('P','A','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPali, NULL, 0, 0, (void *) CHR('P','A','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPunjabi, NULL, 0, 0, (void *) CHR('P','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPalpa, NULL, 0, 0, (void *) CHR('P','A','P',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPashto, NULL, 0, 0, (void *) CHR('P','A','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPolytonicGreek, NULL, 0, 0, (void *) CHR('P','G','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPilipino, NULL, 0, 0, (void *) CHR('P','I','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPalaung, NULL, 0, 0, (void *) CHR('P','L','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPolish, NULL, 0, 0, (void *) CHR('P','L','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFProvencal, NULL, 0, 0, (void *) CHR('P','R','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFPortuguese, NULL, 0, 0, (void *) CHR('P','T','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChin, NULL, 0, 0, (void *) CHR('Q','I','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRajasthani, NULL, 0, 0, (void *) CHR('R','A','J',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFR_Cree, NULL, 0, 0, (void *) CHR('R','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRussianBuriat, NULL, 0, 0, (void *) CHR('R','B','U',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRiang, NULL, 0, 0, (void *) CHR('R','I','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRhaeto_Romanic, NULL, 0, 0, (void *) CHR('R','M','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRomanian, NULL, 0, 0, (void *) CHR('R','O','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRomany, NULL, 0, 0, (void *) CHR('R','O','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRusyn, NULL, 0, 0, (void *) CHR('R','S','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRuanda, NULL, 0, 0, (void *) CHR('R','U','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFRussian, NULL, 0, 0, (void *) CHR('R','U','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSadri, NULL, 0, 0, (void *) CHR('S','A','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSanskrit, NULL, 0, 0, (void *) CHR('S','A','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSantali, NULL, 0, 0, (void *) CHR('S','A','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSayisi, NULL, 0, 0, (void *) CHR('S','A','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSekota, NULL, 0, 0, (void *) CHR('S','E','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSelkup, NULL, 0, 0, (void *) CHR('S','E','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSango, NULL, 0, 0, (void *) CHR('S','G','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFShan, NULL, 0, 0, (void *) CHR('S','H','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSibe, NULL, 0, 0, (void *) CHR('S','I','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSidamo, NULL, 0, 0, (void *) CHR('S','I','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSilteGurage, NULL, 0, 0, (void *) CHR('S','I','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSkoltSami, NULL, 0, 0, (void *) CHR('S','K','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSlovak, NULL, 0, 0, (void *) CHR('S','K','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSlavey, NULL, 0, 0, (void *) CHR('S','L','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSlovenian, NULL, 0, 0, (void *) CHR('S','L','V',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSomali, NULL, 0, 0, (void *) CHR('S','M','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSamoan, NULL, 0, 0, (void *) CHR('S','M','O',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSena, NULL, 0, 0, (void *) CHR('S','N','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSindhi, NULL, 0, 0, (void *) CHR('S','N','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSinhalese, NULL, 0, 0, (void *) CHR('S','N','H',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSoninke, NULL, 0, 0, (void *) CHR('S','N','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSodoGurage, NULL, 0, 0, (void *) CHR('S','O','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSotho, NULL, 0, 0, (void *) CHR('S','O','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFAlbanian, NULL, 0, 0, (void *) CHR('S','Q','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSerbian, NULL, 0, 0, (void *) CHR('S','R','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSaraiki, NULL, 0, 0, (void *) CHR('S','R','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSerer, NULL, 0, 0, (void *) CHR('S','R','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSouthSlavey, NULL, 0, 0, (void *) CHR('S','S','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSouthernSami, NULL, 0, 0, (void *) CHR('S','S','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSuri, NULL, 0, 0, (void *) CHR('S','U','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSvan, NULL, 0, 0, (void *) CHR('S','V','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSwedish, NULL, 0, 0, (void *) CHR('S','V','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSwadayaAramaic, NULL, 0, 0, (void *) CHR('S','W','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSwahili, NULL, 0, 0, (void *) CHR('S','W','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSwazi, NULL, 0, 0, (void *) CHR('S','W','Z',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSutu, NULL, 0, 0, (void *) CHR('S','X','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFSyriac, NULL, 0, 0, (void *) CHR('S','Y','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTabasaran, NULL, 0, 0, (void *) CHR('T','A','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTajiki, NULL, 0, 0, (void *) CHR('T','A','J',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTamil, NULL, 0, 0, (void *) CHR('T','A','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTatar, NULL, 0, 0, (void *) CHR('T','A','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTH_Cree, NULL, 0, 0, (void *) CHR('T','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTelugu, NULL, 0, 0, (void *) CHR('T','E','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTongan, NULL, 0, 0, (void *) CHR('T','G','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTigre, NULL, 0, 0, (void *) CHR('T','G','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTigrinya, NULL, 0, 0, (void *) CHR('T','G','Y',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFThai, NULL, 0, 0, (void *) CHR('T','H','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTahitian, NULL, 0, 0, (void *) CHR('T','H','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTibetan, NULL, 0, 0, (void *) CHR('T','I','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTurkmen, NULL, 0, 0, (void *) CHR('T','K','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTemne, NULL, 0, 0, (void *) CHR('T','M','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTswana, NULL, 0, 0, (void *) CHR('T','N','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTundraNenets, NULL, 0, 0, (void *) CHR('T','N','E',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTonga, NULL, 0, 0, (void *) CHR('T','N','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTodo, NULL, 0, 0, (void *) CHR('T','O','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTurkish, NULL, 0, 0, (void *) CHR('T','R','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTsonga, NULL, 0, 0, (void *) CHR('T','S','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTuroyoAramaic, NULL, 0, 0, (void *) CHR('T','U','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTulu, NULL, 0, 0, (void *) CHR('T','U','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTuvin, NULL, 0, 0, (void *) CHR('T','U','V',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFTwi, NULL, 0, 0, (void *) CHR('T','W','I',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFUdmurt, NULL, 0, 0, (void *) CHR('U','D','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFUkrainian, NULL, 0, 0, (void *) CHR('U','K','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFUrdu, NULL, 0, 0, (void *) CHR('U','R','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFUpperSorbian, NULL, 0, 0, (void *) CHR('U','S','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFUyghur, NULL, 0, 0, (void *) CHR('U','Y','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFUzbek, NULL, 0, 0, (void *) CHR('U','Z','B',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFVenda, NULL, 0, 0, (void *) CHR('V','E','N',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFVietnamese, NULL, 0, 0, (void *) CHR('V','I','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFWa, NULL, 0, 0, (void *) CHR('W','A',' ',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFWagdi, NULL, 0, 0, (void *) CHR('W','A','G',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFWest_Cree, NULL, 0, 0, (void *) CHR('W','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFWelsh, NULL, 0, 0, (void *) CHR('W','E','L',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFWolof, NULL, 0, 0, (void *) CHR('W','L','F',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFXhosa, NULL, 0, 0, (void *) CHR('X','H','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFYakut, NULL, 0, 0, (void *) CHR('Y','A','K',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFYoruba, NULL, 0, 0, (void *) CHR('Y','B','A',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFY_Cree, NULL, 0, 0, (void *) CHR('Y','C','R',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFYiClassic, NULL, 0, 0, (void *) CHR('Y','I','C',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFYiModern, NULL, 0, 0, (void *) CHR('Y','I','M',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChinesePhonetic, NULL, 0, 0, (void *) CHR('Z','H','P',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChineseSimplified, NULL, 0, 0, (void *) CHR('Z','H','S',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFChineseTraditional, NULL, 0, 0, (void *) CHR('Z','H','T',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFZande, NULL, 0, 0, (void *) CHR('Z','N','D',' '), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OTFZulu, NULL, 0, 0, (void *) CHR('Z','U','L',' '), NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo ligature_tags[] = { + { (unichar_t *) _STR_AncientLig, NULL, 0, 0, (void *) CHR('a','l','i','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_DiscretionaryLig, NULL, 0, 0, (void *) CHR('d','l','i','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HistoricLig, NULL, 0, 0, (void *) CHR('h','l','i','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_RequiredLig, NULL, 0, 0, (void *) CHR('r','l','i','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StandardLig, NULL, 0, 0, (void *) CHR('l','i','g','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_FractionLig, NULL, 0, 0, (void *) CHR('f','r','a','c'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltFrac, NULL, 0, 0, (void *) CHR('a','f','r','c'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AboveBaseSubs, NULL, 0, 0, (void *) CHR('a','b','v','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_BelowBaseForms, NULL, 0, 0, (void *) CHR('b','l','w','f'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_BelowBaseSubs, NULL, 0, 0, (void *) CHR('b','l','w','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Akhand, NULL, 0, 0, (void *) CHR('a','k','h','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_GlyphCompDecomp, NULL, 0, 0, (void *) CHR('c','c','m','p'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HalfForm, NULL, 0, 0, (void *) CHR('h','a','l','f'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HalantForm, NULL, 0, 0, (void *) CHR('h','a','l','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_LeadingJamo, NULL, 0, 0, (void *) CHR('l','j','m','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TrailingJamo, NULL, 0, 0, (void *) CHR('t','j','m','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VowelJamo, NULL, 0, 0, (void *) CHR('v','j','m','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Nukta, NULL, 0, 0, (void *) CHR('n','u','k','t'), NULL, false, false, false, false, false, false, false, true }, /* for numero */ + { (unichar_t *) _STR_Ordinals, NULL, 0, 0, (void *) CHR('o','r','d','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PreBaseForms, NULL, 0, 0, (void *) CHR('p','r','e','f'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PreBaseSubs, NULL, 0, 0, (void *) CHR('p','r','e','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PostBaseForms, NULL, 0, 0, (void *) CHR('p','s','t','f'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PostBaseSubs, NULL, 0, 0, (void *) CHR('p','s','t','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Reph, NULL, 0, 0, (void *) CHR('r','e','p','h'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VattuVariants, NULL, 0, 0, (void *) CHR('v','a','t','u'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacLogos, NULL, 0, 0, (void *) CHR('M','L','O','G'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacRebus, NULL, 0, 0, (void *) CHR('M','R','E','B'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacDiphthongLig, NULL, 0, 0, (void *) CHR('M','D','L','G'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacSquareLig, NULL, 0, 0, (void *) CHR('M','S','L','G'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacAbbrevSquareLig, NULL, 0, 0, (void *) CHR('M','A','L','G'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacUnicodeDecomposition, NULL, 0, 0, (void *) CHR('M','U','C','M'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +GTextInfo simplepos_tags[] = { + { (unichar_t *) _STR_CaseSensForms, NULL, 0, 0, (void *) CHR('c','a','s','e'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_CapitalSpacing, NULL, 0, 0, (void *) CHR('c','p','s','p'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_FullWidths, NULL, 0, 0, (void *) CHR('f','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltHalfWidths, NULL, 0, 0, (void *) CHR('h','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HalfWidths, NULL, 0, 0, (void *) CHR('h','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_LeftBounds, NULL, 0, 0, (void *) CHR('l','f','b','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OpticalBounds, NULL, 0, 0, (void *) CHR('o','p','b','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PropAltMet, NULL, 0, 0, (void *) CHR('p','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_QuartWidths, NULL, 0, 0, (void *) CHR('q','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_RightBounds, NULL, 0, 0, (void *) CHR('r','t','b','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_ThirdWidths, NULL, 0, 0, (void *) CHR('t','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltVertMet, NULL, 0, 0, (void *) CHR('v','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltVertHalfMet, NULL, 0, 0, (void *) CHR('v','h','a','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltVertPropMet, NULL, 0, 0, (void *) CHR('v','p','a','l'), NULL, false, false, false, false, false, false, false, true }, +/* Added by me so I can do round trip conversion of TeX tfm files */ + { (unichar_t *) _STR_ItalicCorrection, NULL, 0, 0, (void *) CHR('I','T','L','C'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +GTextInfo pairpos_tags[] = { + { (unichar_t *) _STR_Distance, NULL, 0, 0, (void *) CHR('d','i','s','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HorizontalKerning, NULL, 0, 0, (void *) CHR('k','e','r','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VerticalKerning, NULL, 0, 0, (void *) CHR('v','k','r','n'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +GTextInfo simplesubs_tags[] = { + { (unichar_t *) _STR_AllAlt, NULL, 0, 0, (void *) CHR('a','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AboveBaseForms, NULL, 0, 0, (void *) CHR('a','b','v','f'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_CaseSensForms, NULL, 0, 0, (void *) CHR('c','a','s','e'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Cap2PetiteCaps, NULL, 0, 0, (void *) CHR('c','2','p','c'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Cap2SmallCaps, NULL, 0, 0, (void *) CHR('c','2','s','c'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Denominators, NULL, 0, 0, (void *) CHR('d','n','o','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_ExpertForms, NULL, 0, 0, (void *) CHR('e','x','p','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TerminalForms, NULL, 0, 0, (void *) CHR('f','i','n','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_FullWidths, NULL, 0, 0, (void *) CHR('f','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HistoricalForms, NULL, 0, 0, (void *) CHR('h','i','s','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HorKanaAlt, NULL, 0, 0, (void *) CHR('h','k','n','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Hanja2Hangul, NULL, 0, 0, (void *) CHR('h','n','g','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_HalfWidths, NULL, 0, 0, (void *) CHR('h','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_InitialForms, NULL, 0, 0, (void *) CHR('i','n','i','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_IsolatedForms, NULL, 0, 0, (void *) CHR('i','s','o','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Italics, NULL, 0, 0, (void *) CHR('i','t','a','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_JIS78Forms, NULL, 0, 0, (void *) CHR('j','p','7','8'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_JIS83Forms, NULL, 0, 0, (void *) CHR('j','p','8','3'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_JIS90Forms, NULL, 0, 0, (void *) CHR('j','p','9','0'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_LiningFigures, NULL, 0, 0, (void *) CHR('l','n','u','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_LocalizedForms, NULL, 0, 0, (void *) CHR('l','o','c','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MedialForms, NULL, 0, 0, (void *) CHR('m','e','d','i'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MathematicalGreek, NULL, 0, 0, (void *) CHR('m','g','r','k'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltAnnotForms, NULL, 0, 0, (void *) CHR('n','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Numerators, NULL, 0, 0, (void *) CHR('n','u','m','r'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_OldstyleFigures, NULL, 0, 0, (void *) CHR('o','n','u','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Ornaments, NULL, 0, 0, (void *) CHR('o','r','n','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PetiteCaps, NULL, 0, 0, (void *) CHR('p','c','a','p'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PropNumbers, NULL, 0, 0, (void *) CHR('p','n','u','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PropWidth, NULL, 0, 0, (void *) CHR('p','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_QuartWidths, NULL, 0, 0, (void *) CHR('q','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_R2LAlt, NULL, 0, 0, (void *) CHR('r','t','l','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_RubyNoteForms, NULL, 0, 0, (void *) CHR('r','u','b','y'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StylisticAlt, NULL, 0, 0, (void *) CHR('s','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_ScientificInf, NULL, 0, 0, (void *) CHR('s','i','n','f'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_SmallCaps, NULL, 0, 0, (void *) CHR('s','m','c','p'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_SimplifiedForms, NULL, 0, 0, (void *) CHR('s','m','p','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StyleSet1, NULL, 0, 0, (void *) CHR('s','s','0','1'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StyleSet2, NULL, 0, 0, (void *) CHR('s','s','0','2'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StyleSet3, NULL, 0, 0, (void *) CHR('s','s','0','3'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StyleSet4, NULL, 0, 0, (void *) CHR('s','s','0','4'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StyleSet5, NULL, 0, 0, (void *) CHR('s','s','0','5'), NULL, false, false, false, false, false, false, false, true }, + /* These are documented to go up to Style Set 20, but I'm not going to bother will all of them until someone cares */ + { (unichar_t *) _STR_Subscript, NULL, 0, 0, (void *) CHR('s','u','b','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Superscript, NULL, 0, 0, (void *) CHR('s','u','p','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Swash, NULL, 0, 0, (void *) CHR('s','w','s','h'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Titling, NULL, 0, 0, (void *) CHR('t','i','t','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TraditionalNameForms, NULL, 0, 0, (void *) CHR('t','n','a','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TabNumb, NULL, 0, 0, (void *) CHR('t','n','u','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TraditionalForms, NULL, 0, 0, (void *) CHR('t','r','a','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_ThirdWidths, NULL, 0, 0, (void *) CHR('t','w','i','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Unicase, NULL, 0, 0, (void *) CHR('u','n','i','c'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VerticalRot, NULL, 0, 0, (void *) CHR('v','e','r','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VertRotAlt, NULL, 0, 0, (void *) CHR('v','r','t','2'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VertKana, NULL, 0, 0, (void *) CHR('v','k','n','a'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_SlashedZero, NULL, 0, 0, (void *) CHR('z','e','r','o'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacWordInitialSwash, NULL, 0, 0, (void *) CHR('M','S','W','I'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacWordFinalSwash, NULL, 0, 0, (void *) CHR('M','S','W','F'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacLineInitialSwash, NULL, 0, 0, (void *) CHR('M','S','L','I'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacLineFinalSwash, NULL, 0, 0, (void *) CHR('M','S','L','F'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacNonFinalSwash, NULL, 0, 0, (void *) CHR('M','S','N','F'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MacMonospaceWidth, NULL, 0, 0, (void *) CHR('M','W','I','D'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +GTextInfo alternatesubs_tags[] = { + { (unichar_t *) _STR_AllAlt, NULL, 0, 0, (void *) CHR('a','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_FinalGlyphLine, NULL, 0, 0, (void *) CHR('f','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Hanja2Hangul, NULL, 0, 0, (void *) CHR('h','n','g','l'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_JustificationAlt, NULL, 0, 0, (void *) CHR('j','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_JIS78Forms, NULL, 0, 0, (void *) CHR('j','p','7','8'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltAnnotForms, NULL, 0, 0, (void *) CHR('n','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Ornaments, NULL, 0, 0, (void *) CHR('o','r','n','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Randomize, NULL, 0, 0, (void *) CHR('r','a','n','d'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_StylisticAlt, NULL, 0, 0, (void *) CHR('s','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Swash, NULL, 0, 0, (void *) CHR('s','w','s','h'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TraditionalForms, NULL, 0, 0, (void *) CHR('t','r','a','d'), NULL, false, false, false, false, false, false, false, true }, +/* My own invention, to provide data for tfm files for TeX's characters (like parens) which come in multiple sizes */ + { (unichar_t *) _STR_TeXCharList, NULL, 0, 0, (void *) CHR('T','C','H','L'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo multiplesubs_tags[] = { + { (unichar_t *) _STR_GlyphCompDecomp, NULL, 0, 0, (void *) CHR('c','c','m','p'), NULL, false, false, false, false, false, false, false, true }, +/* My own invention, to provide data for tfm files for TeX's characters (like parens) which can grow to an arbetrary size */ + { (unichar_t *) _STR_TeXExtensionList, NULL, 0, 0, (void *) CHR('T','E','X','L'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo mark_tags[] = { + { (unichar_t *) _STR_Abvm, NULL, 0, 0, (void *) CHR('a','b','v','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Blwm, NULL, 0, 0, (void *) CHR('b','l','w','m'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MarkT, NULL, 0, 0, (void *) CHR('m','a','r','k'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Mkmk, NULL, 0, 0, (void *) CHR('m','k','m','k'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Curs, NULL, 0, 0, (void *) CHR('c','u','r','s'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo contextualsubs_tags[] = { /* 5 */ + { (unichar_t *) _STR_TerminalForms2, NULL, 0, 0, (void *) CHR('f','i','n','2'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_TerminalForms3, NULL, 0, 0, (void *) CHR('f','i','n','3'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MedialForms2, NULL, 0, 0, (void *) CHR('m','e','d','2'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MarkPosViaSubs, NULL, 0, 0, (void *) CHR('m','s','e','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PreBaseSubs, NULL, 0, 0, (void *) CHR('p','r','e','s'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo contextualchainingsubs_tags[] = { /* 6 */ + { (unichar_t *) _STR_ContextAltern, NULL, 0, 0, (void *) CHR('c','a','l','t'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Ordinals, NULL, 0, 0, (void *) CHR('o','r','d','n'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo reversechainingsubs_tags[] = { /* 8 */ + { (unichar_t *) _STR_ContextLig, NULL, 0, 0, (void *) CHR('c','l','i','g'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_ContextSwash, NULL, 0, 0, (void *) CHR('c','s','w','h'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +/* No recommended contextualpos_tags */ +static GTextInfo contextualpos_tags[] = { /* 7 */ +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo contextualchainingpos_tags[] = { /* 8 */ + { (unichar_t *) _STR_HorizontalKerning, NULL, 0, 0, (void *) CHR('k','e','r','n'), NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VerticalKerning, NULL, 0, 0, (void *) CHR('v','k','r','n'), NULL, false, false, false, false, false, false, false, true }, +/* My hack to identify required features */ + { (unichar_t *) _STR_RQD, NULL, 0, 0, (void *) REQUIRED_FEATURE, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +static GTextInfo lcaret_tags[] = { /* This really shouldn't be here, but it makes parsing the pst_tag array easier */ + { NULL } +}; + +GTextInfo *pst_tags[] = { + simplepos_tags, pairpos_tags, simplesubs_tags, + alternatesubs_tags, multiplesubs_tags, + ligature_tags, + lcaret_tags, /* pst_lcaret */ + pairpos_tags, /* pst_kerning */ + pairpos_tags, /* pst_vkerning */ + mark_tags, /* pst_anchor */ + contextualpos_tags, contextualsubs_tags, + contextualchainingpos_tags, contextualchainingsubs_tags, + reversechainingsubs_tags, + NULL +}; + +static int newstrings[] = { _STR_NewPosition, _STR_NewPair, + _STR_NewSubstitution, + _STR_NewAlternate, _STR_NewMultiple, _STR_NewLigature }; +static int editstrings[] = { _STR_EditPosition, _STR_EditPair, + _STR_EditSubstitution, + _STR_EditAlternate, _STR_EditMultiple, _STR_EditLigature }; + +static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + +int SFAddScriptLangIndex(SplineFont *sf,uint32 script,uint32 lang) { + int i; + + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( script==0 ) script=DEFAULT_SCRIPT; + if ( lang==0 ) lang=DEFAULT_LANG; + if ( sf->script_lang==NULL ) + sf->script_lang = gcalloc(2,sizeof(struct script_record *)); + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + if ( sf->script_lang[i][0].script==script && sf->script_lang[i][1].script==0 && + sf->script_lang[i][0].langs[0]==lang && + sf->script_lang[i][0].langs[1]==0 ) +return( i ); + } + sf->script_lang = grealloc(sf->script_lang,(i+2)*sizeof(struct script_record *)); + sf->script_lang[i] = gcalloc(2,sizeof(struct script_record)); + sf->script_lang[i][0].script = script; + sf->script_lang[i][0].langs = galloc(2*sizeof(uint32)); + sf->script_lang[i][0].langs[0] = lang; + sf->script_lang[i][0].langs[1] = 0; + sf->script_lang[i+1] = NULL; + sf->sli_cnt = i+1; +return( i ); +} + +static void SFGuessScriptList(SplineFont *sf) { + uint32 scripts[32], script; + int i, scnt=0, j; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + script = SCScriptFromUnicode(sf->chars[i]); + if ( script!=0 && script!=DEFAULT_SCRIPT ) { + for ( j=scnt-1; j>=0 ; --j ) + if ( scripts[j]==script ) + break; + if ( j<0 ) { + scripts[scnt++] = script; + if ( scnt>=32 ) + break; + } + } + } + if ( scnt==0 ) + scripts[scnt++] = CHR('l','a','t','n'); + + /* order scripts */ + for ( i=0; iscripts[j] ) { + script = scripts[i]; + scripts[i] = scripts[j]; + scripts[j] = script; + } + } + + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( sf->script_lang!=NULL ) +return; + sf->script_lang = gcalloc(2,sizeof(struct script_record *)); + sf->script_lang[0] = gcalloc(scnt+1,sizeof(struct script_record)); + sf->sli_cnt = 1; + for ( j=0; jscript_lang[0][j].script = scripts[j]; + sf->script_lang[0][j].langs = galloc(2*sizeof(uint32)); + sf->script_lang[0][j].langs[0] = DEFAULT_LANG; + sf->script_lang[0][j].langs[1] = 0; + } + sf->script_lang[1] = NULL; +} + +int SRMatch(struct script_record *sr1,struct script_record *sr2) { + int i, j; + + for ( i=0; sr1[i].script!=0 && sr2[i].script!=0 ; ++i ) { + if ( sr1[i].script!=sr2[i].script ) +return( false ); + for ( j=0 ; sr1[i].langs[j]!=0 && sr2[i].langs[j]!=0 ; ++j ) { + if ( sr1[i].langs[j]!= sr2[i].langs[j] ) +return( false ); + } + if ( sr1[i].langs[j]!=0 || sr2[i].langs[j]!=0 ) +return( false ); + } + if ( sr1[i].script!=0 || sr2[i].script!=0 ) +return( false ); + +return( true ); +} + +static int SRIsRightToLeft(struct script_record *sr) { +return( ScriptIsRightToLeft(sr[0].script) ); +} + +int SFFindScriptLangRecord(SplineFont *sf,struct script_record *sr) { + int i; + + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( sf->script_lang==NULL ) +return( -1 ); + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + if ( SRMatch(sf->script_lang[i],sr)) +return( i ); + } +return( -1 ); +} + +int SFAddScriptLangRecord(SplineFont *sf,struct script_record *sr) { + int i; + + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( sf->script_lang==NULL ) + sf->script_lang = gcalloc(2,sizeof(struct script_record *)); + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + if ( SRMatch(sf->script_lang[i],sr)) { + ScriptRecordFree(sr); +return( i ); + } + } + sf->script_lang = grealloc(sf->script_lang,(i+2)*sizeof(struct script_record *)); + sf->script_lang[i] = sr; + sf->script_lang[i+1] = NULL; + sf->sli_cnt = i+1; +return( i ); +} + +unichar_t *ScriptLangLine(struct script_record *sr) { + int i,j, tot=0; + unichar_t *line, *pt; + + for ( i=0; sr[i].script!=0; ++i ) { + for ( j=0; sr[i].langs[j]!=0; ++j ); + tot += j; + } + line = pt = galloc((7*i+tot*5+1)*sizeof(unichar_t)); + for ( i=0; sr[i].script!=0; ++i ) { + *pt++ = sr[i].script>>24; + *pt++ = (sr[i].script>>16)&0xff; + *pt++ = (sr[i].script>>8)&0xff; + *pt++ = sr[i].script&0xff; + *pt++ = '{'; + for ( j=0; sr[i].langs[j]!=0; ++j ) { + *pt++ = sr[i].langs[j]>>24; + *pt++ = (sr[i].langs[j]>>16)&0xff; + *pt++ = (sr[i].langs[j]>>8)&0xff; + *pt++ = sr[i].langs[j]&0xff; + *pt++ = ','; + } + pt[-1] = '}'; + *pt++ = ' '; + } + *pt = '\0'; +return( line ); +} + +int SCDefaultSLI(SplineFont *sf, SplineChar *default_script) { + int i,j,k,l,best_sli,scnt,matched,def_sli; + uint32 script; + PST *pst; + + if ( sf->cidmaster ) sf = sf->cidmaster; + + /* Try to guess a reasonable default */ + if ( default_script==(SplineChar *) -1 ) { + default_script = NULL; + def_sli = -1; + } else { + script = SCScriptFromUnicode(default_script); + if ( sf->script_lang==NULL ) { + if ( script!=DEFAULT_SCRIPT && script!=0 ) + SFAddScriptLangIndex(sf,script,DEFAULT_LANG); + else + SFGuessScriptList(sf); + } + def_sli = -1; + if ( default_script!=NULL ) { + for ( pst=default_script->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type!=pst_lcaret && pst->script_lang_index!=SLI_NESTED ) { + def_sli = pst->script_lang_index; + break; + } + } + if ( def_sli==-1 && default_script->kerns!=NULL ) + def_sli = default_script->kerns->sli; + } + if ( def_sli==-1 ) { + best_sli = -1; scnt=0; + if ( script==DEFAULT_SCRIPT || script==0 ) { + /* Find the entry with the most scripts */ + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + for ( j=0; sf->script_lang[i][j].script!=0; ++j); + if ( j>scnt ) { + scnt = j; + best_sli = i; + } + } + } else { + /* Find the entry with the most languages that includes this script */ + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + matched = false; + for ( j=k=0; sf->script_lang[i][j].script!=0; ++j) { + if ( sf->script_lang[i][j].script==script ) matched = true; + for ( l=0; sf->script_lang[i][j].langs[l]!=0; ++l ) + ++k; + } + if ( matched && k>scnt ) { + scnt = k; + best_sli = i; + } + } + } + if ( best_sli==-1 ) + best_sli = SFAddScriptLangIndex(sf,script,DEFAULT_LANG); + def_sli = best_sli; + } + } +return( def_sli ); +} + +int SLICount(SplineFont *sf) { + int i = 0; + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( sf->script_lang!=NULL ) + for ( i=0; sf->script_lang[i]!=NULL; ++i ); +return( i ); +} + +static int sli_names[] = { _STR_AnyScript, _STR_HHDefaultHH, _STR_Nested, _STR_EditLangList }; +static int sli_ud[] = { SLI_UNKNOWN, SLI_UNKNOWN, SLI_NESTED, -1 }; + +GTextInfo *SFLangList(SplineFont *sf,int addfinal,SplineChar *default_script) { + int i,j,k,bit; + GTextInfo *ti; + int def_sli; + + if ( sf->cidmaster ) sf = sf->cidmaster; + def_sli = SCDefaultSLI(sf,default_script); + + i = 0; + if ( sf->script_lang!=NULL ) + for ( i=0; sf->script_lang[i]!=NULL; ++i ); + ti = gcalloc(i+4,sizeof( GTextInfo )); + if ( sf->script_lang!=NULL ) + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + ti[i].text = ScriptLangLine(sf->script_lang[i]); + ti[i].userdata = (void *) i; + } + if ( def_sli!=-1 && def_sli=0; --j, ++k, bit>>=1 ) { + if ( addfinal&bit ) { + ti[i].text = (unichar_t *) sli_names[k]; + ti[i].text_in_resource = true; + ti[i].userdata = (void *) sli_ud[k]; + if ( sli_ud[k]==def_sli ) + ti[i].selected = true; + ++i; + } + } +return( ti ); +} + +GTextInfo **SFLangArray(SplineFont *sf,int addfinal) { + int i, bit, j, k; + GTextInfo **ti; + + if ( sf->cidmaster ) sf = sf->cidmaster; + for ( i=0; sf->script_lang[i]!=NULL; ++i ); + ti = gcalloc(i+4,sizeof( GTextInfo * )); + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + ti[i] = gcalloc(1,sizeof( GTextInfo)); + ti[i]->text = ScriptLangLine(sf->script_lang[i]); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + ti[i]->userdata = (void *) i; + } + for ( k=0, j=sizeof(sli_names)/sizeof(sli_names[0])-1, bit = 1<=0; --j, ++k, bit>>=1 ) { + if ( addfinal&bit ) { + ti[i] = gcalloc(1,sizeof( GTextInfo)); + ti[i]->text = u_copy(GStringGetResource(sli_names[k],NULL));; + ti[i]->userdata = (void *) sli_ud[k]; + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + ++i; + } + } + ti[i] = gcalloc(1,sizeof( GTextInfo)); +return( ti ); +} + +struct sl_dlg { + int done; + int sel; + SplineFont *sf; + GGadget *list; +}; + +struct script_record *SRParse(const unichar_t *line) { + int scnt, lcnt, i, j, k; + const unichar_t *pt, *start, *lpt; + struct script_record *sr, srtemp; + unichar_t tag[6]; + + if ( line==NULL ) +return( NULL ); + + for ( scnt=0, pt=line; *pt; ++pt ) + if ( *pt=='{' ) ++scnt; + sr = gcalloc(scnt+1,sizeof(struct script_record)); + for ( i=0, pt=line; isr[j].script ) { + srtemp = sr[i]; + sr[i] = sr[j]; + sr[j] = srtemp; + } + } + for ( k=0; sr[k].script!=0; ++k ) { + struct script_record *srpt = &sr[k]; + if ( srpt->langs[0]!=0 ) + for ( i=0; srpt->langs[i+1]!=0; ++i ) for ( j=i+1; srpt->langs[j]!=0; ++j ) { + if ( srpt->langs[i]>srpt->langs[j] ) { + uint32 temp = srpt->langs[i]; + srpt->langs[i] = srpt->langs[j]; + srpt->langs[j] = temp; + } + } + } + +return( sr ); +} + +static struct script_record **SRParseList(GGadget *list,int *sel) { + int32 len, i; + GTextInfo **ti = GGadgetGetList(list,&len); + struct script_record **sr; + + *sel = -1; + sr = gcalloc(len+1,sizeof(struct script_record *)); + for ( i=0; itext); + if ( sr[i]==NULL ) { + ScriptRecordListFree(sr); +return( NULL ); + } + if ( ti[i]->selected ) + *sel = i; + } +return( sr ); +} + +static int sl_e_h(GWindow gw, GEvent *event) { + int *done = GDrawGetUserData(gw); + + if ( event->type==et_close ) { + *done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("charinfo.html#Language"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + switch ( GGadgetGetCid(event->u.control.g)) { + case _STR_OK: + *done = 2; + break; + case _STR_Cancel: + *done = true; + break; + } + } +return( true ); +} + +static uint32 *ShowLanguages(uint32 *langs) { + int i,j,done=0; + GWindowAttrs wattrs; + GGadgetCreateData gcd[5]; + GTextInfo label[5]; + GRect pos; + GWindow gw; + int32 len; + GTextInfo **ti; + const int width = 150; + uint32 *ret, *pt; + int warned=0; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<>24, + (langs[i]>>16)&0xff, + (langs[i]>>8)&0xff, + langs[i]&0xff); + warned = true; + } + } + + i = 0; + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = 5; + gcd[i].gd.pos.width = width-20; + gcd[i].gd.pos.height = 12*12+6; + gcd[i].gd.flags = gg_enabled|gg_visible|gg_list_alphabetic|gg_list_multiplesel; + gcd[i].gd.u.list = languages; + gcd[i].gd.cid = 0; + gcd[i++].creator = GListCreate; + + gcd[i].gd.pos.x = 15-3; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+gcd[i-1].gd.pos.height+5; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.mnemonic = 'O'; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = _STR_OK; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -15; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.mnemonic = 'C'; + gcd[i].gd.cid = _STR_Cancel; + gcd[i++].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + + GDrawSetVisible(gw,true); + retry: + while ( !done ) + GDrawProcessOneEvent(NULL); + ret = NULL; + ti = GGadgetGetList(gcd[0].ret,&len); + if ( done==2 ) { + int lcnt=0; + for ( i=0; iselected ) + ++lcnt; + } + if ( lcnt==0 ) { + GWidgetErrorR(_STR_LangMissing,_STR_AtLeastOneLang); + done = 0; + goto retry; + } + ret = galloc((lcnt+1)*sizeof(uint32)); + *ret = '\0'; + } + pt = ret; + for ( i=0; iselected ) + *pt++ = (uint32) (ti[i]->userdata); + } + if ( pt!=ret ) + *pt = 0; + GDrawDestroyWindow(gw); +return( ret ); +} + +static int FromScriptToList(GTextInfo **ti,int sindex) { + /* We've got an index in the script array. We want an index in the ti array*/ + /* everything in ti should be in script and vice-versa, but ti is in */ + /* alphabetic order (which may not be english ordering) */ + int i; + const unichar_t *match = GStringGetResource((int) (scripts[sindex].text),NULL); + + for ( i=0; ti[i]->text!=NULL; ++i ) { + if ( u_strcmp(ti[i]->text,match)==0 ) +return( i ); + } + GDrawIError("Failed to find corresponding script S2L" ); +return( -1 ); +} + +static int FromListToScript(GTextInfo **ti,int tindex) { + /* We've got an index in the script array. We want an index in the ti array*/ + /* everything in ti should be in script and vice-versa, but ti is in */ + /* alphabetic order (which may not be english ordering) */ + int i; + + for ( i=0; scripts[i].text!=NULL; ++i ) { + const unichar_t *match = GStringGetResource((int) (scripts[i].text),NULL); + if ( u_strcmp(ti[tindex]->text,match)==0 ) +return( i ); + } + GDrawIError("Failed to find corresponding script L2S" ); +return( -1 ); +} + +static int ss_e_h(GWindow gw, GEvent *event) { + int *done = GDrawGetUserData(gw); + GTextInfo *ti; + + if ( event->type==et_close ) { + *done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("charinfo.html#Script"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_listselected ) { + if ( event->u.control.u.list.changed_index>=0 ) { + ti = GGadgetGetListItem(event->u.control.g,event->u.control.u.list.changed_index); + if ( ti!=NULL && ti->selected && ti->userdata == NULL ) { + ti->userdata = gcalloc(2,sizeof(uint32)); + ((uint32 *) (ti->userdata))[0] = DEFAULT_LANG; + } + } + } else if ( event->type==et_controlevent && event->u.control.subtype == et_listdoubleclick ) { + if ( event->u.control.u.list.changed_index>=0 ) { + ti = GGadgetGetListItem(event->u.control.g,event->u.control.u.list.changed_index); + if ( ti!=NULL && ti->userdata!=NULL ) { + uint32 *ret =ShowLanguages(ti->userdata); + if ( ret!=NULL ) { + free(ti->userdata); + ti->userdata = ret; + } + } + } + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + switch ( GGadgetGetCid(event->u.control.g)) { + case _STR_OK: + *done = 2; + break; + case _STR_Cancel: + *done = true; + break; + } + } +return( true ); +} + +unichar_t *ShowScripts(unichar_t *usedef) { + struct script_record *sr = SRParse(usedef); + static struct script_record dummy = { 0 }; + int i,j,done=0; + GWindowAttrs wattrs; + GGadgetCreateData gcd[5]; + GTextInfo label[5]; + GRect pos; + GWindow gw; + int warned = false; + int32 len; + GTextInfo **ti; + const int width = 150; + unichar_t *ret, *pt; + + if ( sr==NULL ) sr = &dummy; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<selected = false; + ti[i]->userdata = NULL; + } + for ( i=0; sr[i].script!=0; ++i ) { + for ( j=0; jselected = true; + ti[jj]->userdata = sr[i].langs; + sr[i].langs = NULL; + } else if ( !warned ) { + GWidgetErrorR(_STR_ScriptMissing,_STR_ScriptMissingText, + sr[i].script>>24, + (sr[i].script>>16)&0xff, + (sr[i].script>>8)&0xff, + sr[i].script&0xff); + warned = true; + } + } + if ( sr!=&dummy ) + ScriptRecordFree(sr); + + GDrawSetVisible(gw,true); + retry: + while ( !done ) + GDrawProcessOneEvent(NULL); + ret = NULL; + ti = GGadgetGetList(gcd[0].ret,&len); + if ( done==2 ) { + int scnt=0, lcnt=0; + for ( i=0; iselected ) { + ++scnt; + for ( j=0; ((uint32 *) (ti[i]->userdata))[j]!=0; ++j ); + lcnt += j; + } + } + if ( scnt==0 ) { + GWidgetErrorR(_STR_ScriptMissing,_STR_AtLeastOneScript); + done = 0; + goto retry; + } + ret = galloc((7*scnt+5*lcnt+3)*sizeof(unichar_t)); + *ret = '\0'; + } + pt = ret; + for ( i=0; iselected ) { + int ii = FromListToScript(ti,i); + *pt++ = ((uint32) (scripts[ii].userdata))>>24; + *pt++ = (((uint32) (scripts[ii].userdata))>>16)&0xff; + *pt++ = (((uint32) (scripts[ii].userdata))>>8)&0xff; + *pt++ = ((uint32) (scripts[ii].userdata))&0xff; + *pt++ = '{'; + for ( j=0; ((uint32 *) (ti[i]->userdata))[j]!=0; ++j ) { + *pt++ = ((uint32 *) (ti[i]->userdata))[j]>>24; + *pt++ = (((uint32 *) (ti[i]->userdata))[j]>>16)&0xff; + *pt++ = (((uint32 *) (ti[i]->userdata))[j]>>8)&0xff; + *pt++ = ((uint32 *) (ti[i]->userdata))[j]&0xff; + *pt++ = ','; + } + pt[-1]= '}'; + *pt++ = ' '; + } + free(ti[i]->userdata); + } + if ( pt!=ret ) + pt[-1] = '\0'; + GDrawDestroyWindow(gw); +return( ret ); +} + +static void SLL_DoChange(struct sl_dlg *sld,unichar_t *def,GEvent *e) { + struct script_record *sr; + unichar_t *ret; + unichar_t *usedef = def; + + forever { + if ( e!=NULL && ( e->u.control.u.button.button!=1 || + (e->u.control.u.button.state&(ksm_control|ksm_meta|ksm_shift))) ) + ret = GWidgetAskStringR(_STR_ScriptLang,usedef,_STR_ScriptLangEnter); + else + ret = ShowScripts(usedef); + if ( usedef!=def ) + free(usedef); + if ( ret==NULL ) +return; + sr = SRParse(ret); + if ( sr!=NULL ) { + ScriptRecordFree(sr); + if ( def==NULL ) + GListAppendLine(sld->list,ret,true); + else + GListChangeLine(sld->list,GGadgetGetFirstListSelectedItem(sld->list),ret); + free(ret); +return; + } + usedef = ret; + } +} + +static int sld_e_h(GWindow gw, GEvent *event) { + struct sl_dlg *sld = GDrawGetUserData(gw); + struct script_record **srl; + GTextInfo *ti; + + if ( event->type==et_close ) { + sld->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("charinfo.html#ScriptLang"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_listselected ) { + GGadgetSetEnabled(GWidgetGetControl(gw,_STR_Edit), + GGadgetGetFirstListSelectedItem(sld->list)!=-1); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_listdoubleclick ) { + ti = GGadgetGetListItemSelected(sld->list); + if ( ti!=NULL ) + SLL_DoChange(sld,ti->text,NULL); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + switch ( GGadgetGetCid(event->u.control.g)) { + case _STR_OK: + if ( (srl = SRParseList(sld->list,&sld->sel))!=NULL ) { + sld->done = true; + ScriptRecordListFree(sld->sf->script_lang); + sld->sf->script_lang = srl; + } + break; + case _STR_Cancel: + sld->done = true; + sld->sel = -2; + break; + case _STR_NewDDD: + SLL_DoChange(sld,NULL,event); + break; + case _STR_Edit: + ti = GGadgetGetListItemSelected(sld->list); + if ( ti!=NULL ) + SLL_DoChange(sld,ti->text,event); + break; + } + } +return( true ); +} + +int ScriptLangList(SplineFont *sf,GGadget *list,int sli) { + int32 len; + GTextInfo **ti = GGadgetGetList(list,&len); + struct sl_dlg sld; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + GRect pos; + GWindow gw; + FontRequest rq; + GFont *font; + int i; + const int width = 300; + + if ( len>=2 && ti[len-2]->selected && ti[len-2]->userdata==(void *) SLI_NESTED ) +return(false); + if ( len>=1 && !ti[len-1]->selected ) +return(true); + /* the last entry in the script/lang pulldown is the one that allows them */ + /* to edit the script lang list. That's what the above check is for */ + + memset(&sld,0,sizeof(sld)); + sld.sf = sf; + sld.sel = -2; + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<text!=NULL; ++i ) + ti[i]->selected = i==sld.sel; + } + GGadgetSetList(list,ti,false); + if ( sld.sel>=0 ) + GGadgetSetTitle(list,ti[sld.sel]->text); + else + GGadgetSetTitle(list,ti[sli]->text); + } else { + int32 len; + GTextInfo **old = GGadgetGetList(list,&len); + GGadgetSetTitle(list,old[sli]->text); + } +return( true ); +} + +unichar_t *ClassName(const unichar_t *name,uint32 feature_tag, + uint16 flags, int script_lang_index,int merge_with,int act_type, + int macfeature) { + unichar_t *newname, *upt; + char index[20]; + + newname = galloc((u_strlen(name)+30)*sizeof(unichar_t)); + if ( macfeature ) { + sprintf(index,"<%d,%d> ", feature_tag>>16, feature_tag&0xffff); + uc_strcpy(newname,index); + upt = newname+strlen(index); + } else { + if ( (newname[0] = feature_tag>>24)==0 ) newname[0] = ' '; + if ( (newname[1] = (feature_tag>>16)&0xff)==0 ) newname[1] = ' '; + if ( (newname[2] = (feature_tag>>8)&0xff)==0 ) newname[2] = ' '; + if ( (newname[3] = feature_tag&0xff)==0 ) newname[3] = ' '; + newname[4] = ' '; + upt = newname+5; + } + + *upt++ = flags&pst_r2l?'r':' '; + *upt++ = flags&pst_ignorebaseglyphs?'b':' '; + *upt++ = flags&pst_ignoreligatures?'l':' '; + *upt++ = flags&pst_ignorecombiningmarks?'m':' '; + *upt++ = ' '; + + sprintf( index,"%3d ", script_lang_index ); + uc_strcpy(upt,index); + upt += u_strlen(upt); + + if ( act_type!=-1 ) { + sprintf( index,"%d ", act_type ); + uc_strcpy(upt,index); + upt += u_strlen(upt); + } + + if ( merge_with!=-1 ) { + sprintf( index,"%3d ", merge_with ); + uc_strcpy(upt,index); + upt += u_strlen(upt); + } + + u_strcpy(upt,name); +return( newname ); +} + +unichar_t *DecomposeClassName(const unichar_t *clsnm, unichar_t **name, + uint32 *feature_tag, int *macfeature, + uint16 *flags, uint16 *script_lang_index,int *merge_with,int *act_type) { + int sli, type, mw, wasmac; + uint32 tag; + unichar_t *end; + + if ( clsnm[0]=='\0' ) { + tag = CHR(' ',' ',' ',' '); + wasmac = false; + } else if ( clsnm[0]!='<' ) { + tag = (clsnm[0]<<24) | (clsnm[1]<<16) | (clsnm[2]<<8) | clsnm[3]; + clsnm += 5; + wasmac = false; + } else { + int temp = u_strtol(clsnm+1,&end,10); + tag = (temp<<16)|u_strtol(end+1,&end,10); + for ( clsnm=end; isspace(*clsnm); ++clsnm ); + if ( *clsnm=='>' ) ++clsnm; + if ( *clsnm==' ' ) ++clsnm; + wasmac = true; + } + if ( feature_tag!=NULL ) + *feature_tag = tag; + if ( macfeature!=NULL ) + *macfeature = wasmac; + if (( clsnm[0]=='r' || clsnm[0]==' ' ) && + ( clsnm[1]=='b' || clsnm[1]==' ' ) && + ( clsnm[2]=='l' || clsnm[2]==' ' ) && + ( clsnm[3]=='m' || clsnm[3]==' ' ) && + clsnm[4]==' ' ) { + if ( flags!=NULL ) { + *flags = 0; + if ( clsnm[0]=='r' ) *flags |= pst_r2l; + if ( clsnm[1]=='b' ) *flags |= pst_ignorebaseglyphs; + if ( clsnm[2]=='l' ) *flags |= pst_ignoreligatures; + if ( clsnm[3]=='m' ) *flags |= pst_ignorecombiningmarks; + } + clsnm += 5; + } + sli = u_strtol(clsnm,&end,10); + type = u_strtol(end,&end,10); + mw = u_strtol(end,&end,10); + if ( script_lang_index!=NULL ) *script_lang_index = sli; + if ( act_type!=NULL ) *act_type = type; + if ( merge_with!=NULL ) *merge_with = mw; + while ( *end==' ' ) ++end; + if ( name!=NULL ) + *name = u_copy(end); +return( end ); +} + +GTextInfo *AddMacFeatures(GTextInfo *opentype,enum possub_type type,SplineFont *sf) { + MacFeat *from_p, *from_f; + struct macsetting *s; + int i, feat, set, none, cnt; + GTextInfo *res = NULL; + + if ( type!=pst_substitution && type!=pst_ligature && type != pst_max ) +return( opentype ); + + if ( sf->cidmaster ) sf = sf->cidmaster; + + cnt = 0; /* Yes, I want it outside, look at the end of the loop */ + for ( i=0; i<2; ++i ) { + for ( feat=1; ; ++feat ) { /* I'm excluding "all typographic features", it isn't meaningful here */ + none=true; + for ( from_f = sf->features; from_f!=NULL && from_f->feature!=feat; from_f=from_f->next ) + if ( from_f->feature>feat ) + none = false; + for ( from_p = default_mac_feature_map; from_p!=NULL && from_p->feature!=feat; from_p=from_p->next ) + if ( from_p->feature>feat ) + none = false; + if ( from_f==NULL && from_p==NULL && none ) + break; + for ( set=0; ; ++set ) { + none = true; + s = NULL; + if ( from_f!=NULL ) { + for ( s = from_f->settings; s!=NULL && s->setting!=set; s=s->next ) + if ( s->setting>set ) + none = false; + } + if ( s!=NULL ) none=false; /* It might lack a name */ + if ( (s==NULL || s->setname==NULL ) && from_p!=NULL ) { + for ( s = from_p->settings; s!=NULL && s->setting!=set; s=s->next ) + if ( s->setting>set ) + none = false; + } + if ( s==NULL && none ) + break; + if ( s!=NULL && s->setname!=NULL ) { + if ( res!=NULL ) { + res[cnt].text = PickNameFromMacName(s->setname); + res[cnt].image_precedes = true; /* flag to say it's a mac thing */ + res[cnt].userdata = (void *) ((feat<<16)|set); + } + ++cnt; + } + } + } + if ( res==NULL ) { + int c; + if ( cnt==0 ) +return( opentype ); + if ( opentype!=NULL ) { + for ( c=0; opentype[c].text!=NULL; ++c ); + res = gcalloc(c+3+cnt,sizeof(GTextInfo)); + memcpy(res,opentype,c*sizeof(GTextInfo)); + res[c].line = true; + cnt = c+1; + } else { + res = gcalloc(3+cnt,sizeof(GTextInfo)); + cnt = 0; + } + } + } +return( res ); +} + +#define CID_ACD_Tag 1001 +#define CID_ACD_Sli 1002 +#define CID_ACD_R2L 1003 +#define CID_ACD_IgnBase 1004 +#define CID_ACD_IgnLig 1005 +#define CID_ACD_IgnMark 1006 +#define CID_ACD_Merge 1007 + +struct ac_dlg { + int done; + int ok; + int sli; + enum possub_type type; + GTextInfo *tags, *mactags; + GGadget *taglist; + SplineFont *sf; + GWindow gw; + unichar_t *skipname; + int was_normalsli; +}; + +static GTextInfo **ACD_FigureMerge(SplineFont *sf,uint32 tag, int flags, + int sli, unichar_t *skipname, int select, int *spos) { + int i, cnt, j; + GTextInfo **ti = NULL; + AnchorClass *ac; + + for ( j=0; j<2; ++j ) { + cnt = 0; + for ( ac = sf->anchor; ac!=NULL ; ac=ac->next ) { + if ( u_strcmp(skipname,ac->name)!=0 ) { + if ( ac->feature_tag==tag && ac->flags==flags && + ac->script_lang_index==sli ) { + if ( ti!=NULL ) { + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + ti[cnt]->fg = ti[cnt]->bg = COLOR_DEFAULT; + ti[cnt]->text = u_copy(ac->name); + ti[cnt]->userdata = (void *) (int32) (ac->merge_with); + if ( ac->merge_with == select ) { + ti[cnt]->selected = true; + *spos = cnt; + select = -2; + } + } + ++cnt; + } + } + } + if ( j==0 ) { + for ( i=1; i<0xfffff; ++i ) { + for ( ac=sf->anchor; ac!=NULL; ac=ac->next ) + if ( u_strcmp(ac->name,skipname)!=0 && + ac->merge_with==i ) + break; + if ( ac==NULL ) + break; + } + ti = galloc((cnt+2)*sizeof(GTextInfo *)); + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + ti[cnt]->fg = ti[cnt]->bg = COLOR_DEFAULT; + ti[cnt]->text = u_copy(GStringGetResource(_STR_Itself,NULL)); + ti[cnt]->userdata = (void *) (i); + ti[cnt+1] = gcalloc(1,sizeof(GTextInfo)); + } else if ( select!=-2 ) { + ti[cnt]->selected = true; + *spos = cnt; + } + } +return( ti ); +} + +static void ACD_RefigureMerge(struct ac_dlg *acd,int old) { + uint32 tag, flags, sli; int spos; + const unichar_t *utag; + GGadget *merge = GWidgetGetControl(acd->gw,CID_ACD_Merge); + unichar_t ubuf[8]; + GTextInfo **list; + + if ( merge==NULL ) +return; + + if ( old==-1 ) + old = (int) (GGadgetGetListItemSelected(merge)->userdata); + utag = _GGadgetGetTitle(GWidgetGetControl(acd->gw,CID_ACD_Tag)); + if ( (ubuf[0] = utag[0])==0 ) { + ubuf[0] = ubuf[1] = ubuf[2] = ubuf[3] = ' '; + } else { + if ( (ubuf[1] = utag[1])==0 ) + ubuf[1] = ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[2] = utag[2])==0 ) + ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[3] = utag[3])==0 ) + ubuf[3] = ' '; + } + tag = (ubuf[0]<<24) | (ubuf[1]<<16) | (ubuf[2]<<8) | ubuf[3]; + + sli = GGadgetGetFirstListSelectedItem(GWidgetGetControl(acd->gw,CID_ACD_Sli)); + + flags = 0; + if ( GGadgetIsChecked(GWidgetGetControl(acd->gw,CID_ACD_R2L)) ) flags |= pst_r2l; + if ( GGadgetIsChecked(GWidgetGetControl(acd->gw,CID_ACD_IgnBase)) ) flags |= pst_ignorebaseglyphs; + if ( GGadgetIsChecked(GWidgetGetControl(acd->gw,CID_ACD_IgnLig)) ) flags |= pst_ignoreligatures; + if ( GGadgetIsChecked(GWidgetGetControl(acd->gw,CID_ACD_IgnMark)) ) flags |= pst_ignorecombiningmarks; + + list = ACD_FigureMerge(acd->sf, tag, flags, sli, acd->skipname, old, &spos); + GGadgetSetList(merge,list,false); + GGadgetSetTitle(merge,list[spos]->text); +} + +static void ACD_ToggleNest(struct ac_dlg *acd) { + static unichar_t nullstr[] = { 0 }; + + acd->was_normalsli = !acd->was_normalsli; + if ( acd->was_normalsli ) { + GGadgetSetList(acd->taglist,GTextInfoArrayFromList(acd->mactags,NULL),false); + } else { + GGadgetSetList(acd->taglist,SFGenTagListFromType(&acd->sf->gentags,acd->type),false); + } + GGadgetSetTitle(acd->taglist,nullstr); +} + +static void ACD_SelectTag(struct ac_dlg *acd) { + const unichar_t *utag; + unichar_t ubuf[8], *end; + uint32 tag; + int macfeature; + int i,j; + int32 len; + GTextInfo **ti; + GGadget *list = GWidgetGetControl(acd->gw,CID_ACD_Tag); + + utag = _GGadgetGetTitle(list); + if ( (ubuf[0] = utag[0])==0 ) +return; + else if (( utag[0]=='<' && utag[u_strlen(utag)-1]=='>' ) || + ((u_strtol(utag,&end,10),*end==',') && + (u_strtol(end+1,&end,10),*end=='\0')) ) { + macfeature = true; + if ( utag[0]=='<' ) ++utag; + tag = u_strtol(utag,&end,10)<<16; + tag |= u_strtol(end+1,&end,10); + } else { + macfeature = false; + if ( utag[0]=='\'' && utag[5]=='\'' ) { + memcpy(ubuf,utag+1,4*sizeof(unichar_t)); + } else { + if ( (ubuf[1] = utag[1])==0 ) + ubuf[1] = ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[2] = utag[2])==0 ) + ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[3] = utag[3])==0 ) + ubuf[3] = ' '; + if ( u_strlen(utag)>4 || ubuf[0]>=0x7f || ubuf[1]>=0x7f || ubuf[2]>=0x7f || ubuf[3]>=0x7f ) +return; + } + tag = (ubuf[0]<<24) | (ubuf[1]<<16) | (ubuf[2]<<8) | ubuf[3]; + } + + ti = GGadgetGetList(list,&len); + for ( i=0; iuserdata == (void *) tag ) { + if ( ti[i]->selected ) +return; + for ( j=0; jselected = false; + ti[i]->selected = true; + } + } +} + +static int acd_e_h(GWindow gw, GEvent *event) { + struct ac_dlg *acd = GDrawGetUserData(gw); + if ( event->type==et_close ) { + acd->done = true; + acd->ok = false; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("charinfo.html#Feature-Tag"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + acd->done = true; + acd->ok = GGadgetGetCid(event->u.control.g); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_textchanged && + event->u.control.g == acd->taglist && acd->was_normalsli) { + if ( event->u.control.u.tf_changed.from_pulldown!=-1 ) { + uint32 tag = (uint32) acd->mactags[event->u.control.u.tf_changed.from_pulldown].userdata; + int macfeat = acd->mactags[event->u.control.u.tf_changed.from_pulldown].image_precedes; + unichar_t ubuf[20]; + char buf[20]; + /* If they select something from the pulldown, don't show the human */ + /* readable form, instead show the 4 character tag */ + if ( !macfeat ) { + ubuf[0] = tag>>24; + ubuf[1] = (tag>>16)&0xff; + ubuf[2] = (tag>>8)&0xff; + ubuf[3] = tag&0xff; + ubuf[4] = 0; + } else { + sprintf( buf,"<%d,%d>", tag>>16, tag&0xffff ); + uc_strcpy(ubuf,buf); + } + GGadgetSetTitle(event->u.control.g,ubuf); + } else + ACD_SelectTag(acd); + ACD_RefigureMerge(acd,-1); + } else if ( event->type==et_controlevent && + event->u.control.subtype == et_listselected && + GGadgetGetCid(event->u.control.g)==CID_ACD_Sli ) { + if ( ScriptLangList(acd->sf,event->u.control.g,acd->sli)!=acd->was_normalsli ) + ACD_ToggleNest(acd); + ACD_RefigureMerge(acd,-1); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_radiochanged ) { + ACD_RefigureMerge(acd,-1); + } +return( true ); +} + +static int GetSLI(GGadget *g) { + int len, sel = GGadgetGetFirstListSelectedItem(g); + GTextInfo **ti = GGadgetGetList(g,&len); + if ( ti[sel]->userdata == (void *) SLI_NESTED ) +return( SLI_NESTED ); + if ( ti[sel]->userdata == (void *) SLI_UNKNOWN ) +return( SLI_UNKNOWN ); + +return( sel ); +} + +unichar_t *AskNameTag(int title,unichar_t *def,uint32 def_tag, uint16 flags, + int script_lang_index, enum possub_type type, SplineFont *sf, + SplineChar *default_script, int merge_with, int act_type ) { + static unichar_t nullstr[] = { 0 }; + struct ac_dlg acd; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[18]; + GTextInfo label[18]; + GWindow gw; + char buf[16]; + unichar_t ubuf[16]; + unichar_t *ret; + const unichar_t *name, *utag; + unichar_t *end, *components=NULL; + uint32 tag; + int i, j, macfeature = false; + GTextInfo *tags = pst_tags[type-1], *mactags = tags; + + if ( def==NULL ) def=nullstr; + if ( def_tag==0 ) { + uint16 sli; + DecomposeClassName(def,&components,&def_tag,&macfeature, + &flags, &sli, + merge_with>=0 ? &merge_with : NULL, + merge_with>=0 ? &act_type: NULL); + script_lang_index = sli; + } else + components = u_copy(def); + + memset(&acd,0,sizeof(acd)); + acd.tags = tags; + acd.sf = sf; + acd.sli = script_lang_index; + acd.type = type; + acd.skipname = def; + acd.was_normalsli = true; + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<", def_tag>>16, def_tag&0xffff ); + uc_strcpy(ubuf,buf); + } else { + ubuf[0] = def_tag>>24; ubuf[1] = (def_tag>>16)&0xff; ubuf[2] = (def_tag>>8)&0xff; ubuf[3] = def_tag&0xff; ubuf[4] = 0; + } + label[3].text = ubuf; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 10; gcd[3].gd.pos.y = gcd[2].gd.pos.y+14; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].gd.u.list = mactags; + gcd[3].gd.cid = CID_ACD_Tag; + gcd[3].creator = GListFieldCreate; + + label[4].text = (unichar_t *) _STR_ScriptAndLangC; + label[4].text_in_resource = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.pos.x = 5; gcd[4].gd.pos.y = gcd[3].gd.pos.y+26; + gcd[4].gd.flags = gg_enabled|gg_visible; + gcd[4].creator = GLabelCreate; + + gcd[5].gd.pos.x = 10; gcd[5].gd.pos.y = gcd[4].gd.pos.y+14; + gcd[5].gd.pos.width = 140; + gcd[5].gd.flags = gg_enabled|gg_visible; + gcd[5].gd.u.list = SFLangList(sf,title==_STR_SuffixToTag?7:3,default_script); + j = script_lang_index; + if ( script_lang_index!=-1 ) { + for ( i=0; gcd[5].gd.u.list[i].text!=NULL; ++i ) + gcd[5].gd.u.list[i].selected = false; + if ( script_lang_index==SLI_NESTED ) { + for ( j=0 ; gcd[5].gd.u.list[j].userdata!=(void *) SLI_NESTED; ++j ); + gcd[5].gd.u.list[j].selected = true; + } else + gcd[5].gd.u.list[script_lang_index].selected = true; + } else { + for ( script_lang_index=0; !gcd[5].gd.u.list[script_lang_index].selected && + gcd[5].gd.u.list[script_lang_index].text!=NULL; ++script_lang_index ); + if ( gcd[5].gd.u.list[script_lang_index].text!=NULL ) { + acd.sli = script_lang_index; + if ( flags==0 && SRIsRightToLeft(sf->script_lang[acd.sli])) + flags = pst_r2l; + } + j = script_lang_index; + } + gcd[5].gd.label = &gcd[5].gd.u.list[j]; + gcd[5].gd.cid = CID_ACD_Sli; + gcd[5].creator = GListButtonCreate; + + gcd[6].gd.pos.x = 5; gcd[6].gd.pos.y = gcd[5].gd.pos.y+28; + gcd[6].gd.flags = gg_visible | gg_enabled | (flags&pst_r2l?gg_cb_on:0); + label[6].text = (unichar_t *) _STR_RightToLeft; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.cid = CID_ACD_R2L; + gcd[6].creator = GCheckBoxCreate; + + gcd[7].gd.pos.x = 5; gcd[7].gd.pos.y = gcd[6].gd.pos.y+15; + gcd[7].gd.flags = gg_visible | gg_enabled | (flags&pst_ignorebaseglyphs?gg_cb_on:0); + label[7].text = (unichar_t *) _STR_IgnoreBaseGlyphs; + label[7].text_in_resource = true; + gcd[7].gd.label = &label[7]; + gcd[7].gd.cid = CID_ACD_IgnBase; + gcd[7].creator = GCheckBoxCreate; + + gcd[8].gd.pos.x = 5; gcd[8].gd.pos.y = gcd[7].gd.pos.y+15; + gcd[8].gd.flags = gg_visible | gg_enabled | (flags&pst_ignoreligatures?gg_cb_on:0); + label[8].text = (unichar_t *) _STR_IgnoreLigatures; + label[8].text_in_resource = true; + gcd[8].gd.label = &label[8]; + gcd[8].gd.cid = CID_ACD_IgnLig; + gcd[8].creator = GCheckBoxCreate; + + gcd[9].gd.pos.x = 5; gcd[9].gd.pos.y = gcd[8].gd.pos.y+15; + gcd[9].gd.flags = gg_visible | gg_enabled | (flags&pst_ignorecombiningmarks?gg_cb_on:0); + label[9].text = (unichar_t *) _STR_IgnoreCombiningMarks; + label[9].text_in_resource = true; + gcd[9].gd.label = &label[9]; + gcd[9].gd.cid = CID_ACD_IgnMark; + gcd[9].creator = GCheckBoxCreate; + + i = 10; + if ( merge_with!=-1 ) { + label[i].text = (unichar_t *) _STR_Default; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[9].gd.pos.y+20; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.popup_msg = GStringGetResource(_STR_MarkToBaseLig,NULL); + gcd[i++].creator = GRadioCreate; + + label[i].text = (unichar_t *) "Mk-Mk"; + label[i].text_is_1byte = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 55; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.popup_msg = GStringGetResource(_STR_MarkToMark,NULL); + gcd[i++].creator = GRadioCreate; + + label[i].text = (unichar_t *) _STR_Cursive; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 103; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.popup_msg = GStringGetResource(_STR_CursiveAttach,NULL); + gcd[i++].creator = GRadioCreate; + + if ( act_type==act_mark ) gcd[10].gd.flags |= gg_cb_on; + else if ( act_type==act_mkmk ) gcd[11].gd.flags |= gg_cb_on; + else gcd[12].gd.flags |= gg_cb_on; + + label[i].text = (unichar_t *) _STR_MergeWith; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+17; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.popup_msg = GStringGetResource(_STR_MergeWithPopup,NULL); + gcd[i++].creator = GLabelCreate; + + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+13; + gcd[i].gd.pos.width = 140; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.popup_msg = GStringGetResource(_STR_MergeWithPopup,NULL); + gcd[i].gd.cid = CID_ACD_Merge; + gcd[i++].creator = GListButtonCreate; + + gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+26; + } else + gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+22; + + gcd[i].gd.pos.x = 15-3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = true; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -15; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = false; + gcd[i++].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + free(components); + acd.taglist = gcd[3].ret; + if ( merge_with!=-1 ) + ACD_RefigureMerge(&acd,merge_with); + if ( acd.sli==SLI_NESTED ) + ACD_ToggleNest(&acd); + ACD_SelectTag(&acd); + + GDrawSetVisible(gw,true); + GWidgetIndicateFocusGadget(gcd[1].ret); + tryagain: + acd.done = false; + while ( !acd.done ) + GDrawProcessOneEvent(NULL); + if ( acd.ok ) { + name = _GGadgetGetTitle(gcd[1].ret); + utag = _GGadgetGetTitle(gcd[3].ret); + script_lang_index = GetSLI(gcd[5].ret); + if ( (ubuf[0] = utag[0])==0 ) { + GWidgetErrorR(_STR_MissingTag,_STR_MissingTag); + goto tryagain; + } else if ((( utag[0]=='<' && utag[u_strlen(utag)-1]=='>' ) || + ((u_strtol(utag,&end,10),*end==',') && + (u_strtol(end+1,&end,10),*end=='\0')) ) && + (type==pst_substitution || pst_ligature)) { + macfeature = true; + if ( utag[0]=='<' ) ++utag; + tag = u_strtol(utag,&end,10)<<16; + tag |= u_strtol(end+1,&end,10); + } else { + macfeature = false; + if ( utag[0]=='\'' && utag[5]=='\'' ) { + memcpy(ubuf,utag+1,4*sizeof(unichar_t)); + } else { + if ( (ubuf[1] = utag[1])==0 ) + ubuf[1] = ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[2] = utag[2])==0 ) + ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[3] = utag[3])==0 ) + ubuf[3] = ' '; + if ( u_strlen(utag)>4 || ubuf[0]>=0x7f || ubuf[1]>=0x7f || ubuf[2]>=0x7f || ubuf[3]>=0x7f ) { + GWidgetErrorR(_STR_TagTooLong,_STR_FeatureTagTooLong); + goto tryagain; + } + } + tag = (ubuf[0]<<24) | (ubuf[1]<<16) | (ubuf[2]<<8) | ubuf[3]; + } + if ( script_lang_index==SLI_NESTED ) { + enum possub_type pstype = SFGTagUsed(&sf->gentags,tag); + if ( pstype == pst_null ) { + SFGenerateNewFeatureTag(&sf->gentags,type,tag); + } else { + if ( pstype==type && type<=pst_ligature ) + /* That's ok */; + else { + GWidgetErrorR(_STR_TagReuse,_STR_TagReuseLong); + goto tryagain; + } + } + } + flags = 0; + if ( GGadgetIsChecked(gcd[6].ret) ) flags |= pst_r2l; + if ( GGadgetIsChecked(gcd[7].ret) ) flags |= pst_ignorebaseglyphs; + if ( GGadgetIsChecked(gcd[8].ret) ) flags |= pst_ignoreligatures; + if ( GGadgetIsChecked(gcd[9].ret) ) flags |= pst_ignorecombiningmarks; + if ( merge_with!=-1 ) { + merge_with = (int) (GGadgetGetListItemSelected(gcd[14].ret)->userdata); + act_type = GGadgetIsChecked(gcd[10].ret) ? act_mark : + GGadgetIsChecked(gcd[11].ret) ? act_mkmk : act_curs; + } + ret = ClassName(name,tag,flags,script_lang_index,merge_with,act_type, + macfeature); + } else + ret = NULL; + GDrawDestroyWindow(gw); + if ( mactags!=tags ) + GTextInfoListFree(mactags); +return( ret ); +} + +struct pt_dlg { + int done; + int ok; + int sli; + enum possub_type type; + GTextInfo *tags; + GGadget *taglist; + SplineFont *sf; + GWindow gw; + int ispair; + int was_normalsli; +}; + +static void PTD_ToggleNest(struct pt_dlg *ptd) { + static unichar_t nullstr[] = { 0 }; + + ptd->was_normalsli = !ptd->was_normalsli; + if ( ptd->was_normalsli ) { + GGadgetSetList(ptd->taglist,GTextInfoArrayFromList(ptd->tags,NULL),false); + } else { + GGadgetSetList(ptd->taglist,SFGenTagListFromType(&ptd->sf->gentags,ptd->type),false); + } + GGadgetSetTitle(ptd->taglist,nullstr); +} + +static int ptd_e_h(GWindow gw, GEvent *event) { + struct pt_dlg *ptd = GDrawGetUserData(gw); + if ( event->type==et_close ) { + ptd->done = true; + ptd->ok = false; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("charinfo.html#Feature-Tag"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + ptd->done = true; + ptd->ok = GGadgetGetCid(event->u.control.g); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_textchanged && + event->u.control.u.tf_changed.from_pulldown!=-1 && ptd->was_normalsli ) { + uint32 tag; + unichar_t ubuf[8]; + /* If they select something from the pulldown, don't show the human */ + /* readable form, instead show the 4 character tag */ + if ( ptd->ispair ) + tag = (uint32) pairpos_tags[event->u.control.u.tf_changed.from_pulldown].userdata; + else + tag = (uint32) simplepos_tags[event->u.control.u.tf_changed.from_pulldown].userdata; + ubuf[0] = tag>>24; + ubuf[1] = (tag>>16)&0xff; + ubuf[2] = (tag>>8)&0xff; + ubuf[3] = tag&0xff; + ubuf[4] = 0; + GGadgetSetTitle(event->u.control.g,ubuf); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_listselected ) { + if ( ScriptLangList(ptd->sf,event->u.control.g,ptd->sli)!=ptd->was_normalsli ) + PTD_ToggleNest(ptd); + } +return( true ); +} + +static unichar_t *AskPosTag(int title,unichar_t *def,uint32 def_tag, uint16 flags, + int script_lang_index, enum possub_type type,SplineFont *sf, + SplineChar *default_script) { + struct pt_dlg ptd; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[25]; + GTextInfo label[25]; + GWindow gw; + unichar_t ubuf[8]; + unichar_t *ret, *pt, *end, *other=NULL; + const unichar_t *utag; + uint32 tag; + int dx=0, dy=0, dxa=0, dya=0; + int dx2=0, dy2=0, dxa2=0, dya2=0; + char buf[200]; + unichar_t udx[12], udy[12], udxa[12], udya[12]; + unichar_t udx2[12], udy2[12], udxa2[12], udya2[12]; + int i, j, temp, tag_pos, sli_pos; + static unichar_t nullstr[] = { 0 }; + static int buts[3] = { _STR_OK, _STR_Cancel, 0 }; + GTextInfo *tags = pst_tags[type-1]; + + if ( def==NULL ) def=nullstr; + if ( def_tag==0 && u_strlen(def)>4 && def[4]==' ' && def[0]<0x7f && def[1]<0x7f && def[2]<0x7f && def[3]<0x7f ) { + if ( def[0]!=' ' ) + def_tag = (def[0]<<24) | (def[1]<<16) | (def[2]<<8) | def[3]; + def += 5; + if (( def[0]=='r' || def[0]==' ' ) && + ( def[1]=='b' || def[1]==' ' ) && + ( def[2]=='l' || def[2]==' ' ) && + ( def[3]=='m' || def[3]==' ' ) && + def[4]==' ' ) { + flags = 0; + if ( def[0]=='r' ) flags |= pst_r2l; + if ( def[1]=='b' ) flags |= pst_ignorebaseglyphs; + if ( def[2]=='l' ) flags |= pst_ignoreligatures; + if ( def[3]=='m' ) flags |= pst_ignorecombiningmarks; + def += 5; + } + temp = u_strtol(def,&end,10); + if ( end!=def ) { + script_lang_index = temp; + def = end; + if ( *def==' ' ) ++def; + } + } + + if ( type==pst_pair ) { + for ( pt=def; *pt==' ' ; ++pt ); + other = pt; + while ( *pt!=' ' && *pt!='\0' ) ++pt; + other = u_copyn(other,pt-other); + } + for ( pt=def; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dx = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dy = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dxa = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dya = u_strtol(pt,&end,10); + if ( type==pst_pair ) { + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dx2 = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dy2 = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dxa2 = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + dya2 = u_strtol(pt,&end,10); + } + sprintf(buf,"%d",dx); + uc_strcpy(udx,buf); + sprintf(buf,"%d",dy); + uc_strcpy(udy,buf); + sprintf(buf,"%d",dxa); + uc_strcpy(udxa,buf); + sprintf(buf,"%d",dya); + uc_strcpy(udya,buf); + if ( type==pst_pair ) { + sprintf(buf,"%d",dx2); + uc_strcpy(udx2,buf); + sprintf(buf,"%d",dy2); + uc_strcpy(udy2,buf); + sprintf(buf,"%d",dxa2); + uc_strcpy(udxa2,buf); + sprintf(buf,"%d",dya2); + uc_strcpy(udya2,buf); + } + + + memset(&ptd,0,sizeof(ptd)); + ptd.sf = sf; + ptd.sli = script_lang_index; + ptd.type = type; + ptd.ispair = type==pst_pair; + ptd.tags = tags; + ptd.was_normalsli = true; + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<>24; ubuf[1] = (def_tag>>16)&0xff; ubuf[2] = (def_tag>>8)&0xff; ubuf[3] = def_tag&0xff; ubuf[4] = 0; + label[i].text = ubuf; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+14; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.u.list = tags; + gcd[i].gd.cid = i+1; + gcd[i++].creator = GListFieldCreate; + + label[i].text = (unichar_t *) _STR_ScriptAndLangC; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+26; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i++].creator = GLabelCreate; + + sli_pos = i; + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+14; + gcd[i].gd.pos.width = 140; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.u.list = SFLangList(sf,3,default_script); + if ( script_lang_index!=-1 ) { + for ( j=0; gcd[i].gd.u.list[j].text!=NULL; ++j ) + gcd[i].gd.u.list[j].selected = false; + if ( script_lang_index==SLI_NESTED ) { + for ( j=0 ; gcd[i].gd.u.list[j].userdata!=(void *) SLI_NESTED; ++j ); + gcd[i].gd.u.list[j].selected = true; + } else { + gcd[i].gd.u.list[script_lang_index].selected = true; + j = script_lang_index; + } + } else { + for ( script_lang_index=0; !gcd[i].gd.u.list[script_lang_index].selected && + gcd[i].gd.u.list[script_lang_index].text!=NULL; ++script_lang_index ); + if ( gcd[i].gd.u.list[script_lang_index].text!=NULL ) { + ptd.sli = script_lang_index; + if ( flags==0 && SRIsRightToLeft(sf->script_lang[ptd.sli])) + flags = pst_r2l; + } + j = script_lang_index; + } + gcd[i].gd.label = &gcd[i].gd.u.list[j]; + gcd[i].gd.cid = i+1; + gcd[i++].creator = GListButtonCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+28; + gcd[i].gd.flags = gg_visible | gg_enabled | (flags&pst_r2l?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_RightToLeft; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_visible | gg_enabled | (flags&pst_ignorebaseglyphs?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_IgnoreBaseGlyphs; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_visible | gg_enabled | (flags&pst_ignoreligatures?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_IgnoreLigatures; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_visible | gg_enabled | (flags&pst_ignorecombiningmarks?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_IgnoreCombiningMarks; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 15-3; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+22; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.mnemonic = 'O'; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = true; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -15; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.mnemonic = 'C'; + gcd[i].gd.cid = false; + gcd[i++].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + free(other); + GTextInfoListFree(gcd[sli_pos].gd.u.list); + ptd.taglist = gcd[tag_pos].ret; + + GDrawSetVisible(gw,true); + GWidgetIndicateFocusGadget(gcd[1].ret); + tryagain: + while ( !ptd.done ) + GDrawProcessOneEvent(NULL); + if ( ptd.ok ) { + int err=false; + char *other; + dx = GetIntR(gw,2, _STR_Dx,&err); + dy = GetIntR(gw,4, _STR_Dy,&err); + dxa = GetIntR(gw,6, _STR_Dxa,&err); + dya = GetIntR(gw,8, _STR_Dya,&err); + if ( ptd.ispair ) { + dx2 = GetIntR(gw,9, _STR_Dx,&err); + dy2 = GetIntR(gw,10, _STR_Dy,&err); + dxa2 = GetIntR(gw,11, _STR_Dxa,&err); + dya2 = GetIntR(gw,12, _STR_Dya,&err); + other = cu_copy(_GGadgetGetTitle(GWidgetGetControl(gw,14))); + if ( *other=='\0' ) { + GWidgetErrorR(_STR_MissingPaired,_STR_NeedPaired); + err = true; + } else if ( SFGetCharDup(sf,-1,other)==NULL ) { + if ( GWidgetAskR(_STR_MissingPaired,buts,0,1,_STR_PairedNotInFont,other)==1 ) + err = true; + } + } + utag = _GGadgetGetTitle(gcd[tag_pos].ret); + script_lang_index = GetSLI(gcd[tag_pos+2].ret); + if ( err ) { + ptd.done = false; + goto tryagain; + } + if ( (ubuf[0] = utag[0])==0 ) { + GWidgetErrorR(_STR_MissingTag,_STR_MissingTag); + goto tryagain; + /* Can't get any mac features here */ + } else { + if ( utag[0]=='\'' && utag[5]=='\'' ) { + memcpy(ubuf,utag+1,4*sizeof(unichar_t)); + } else { + if ( (ubuf[1] = utag[1])==0 ) + ubuf[1] = ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[2] = utag[2])==0 ) + ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[3] = utag[3])==0 ) + ubuf[3] = ' '; + if ( u_strlen(utag)>4 || ubuf[0]>=0x7f || ubuf[1]>=0x7f || ubuf[2]>=0x7f || ubuf[3]>=0x7f ) { + GWidgetErrorR(_STR_TagTooLong,_STR_FeatureTagTooLong); + goto tryagain; + } + } + tag = (ubuf[0]<<24) | (ubuf[1]<<16) | (ubuf[2]<<8) | ubuf[3]; + } + if ( script_lang_index==SLI_NESTED ) { + enum possub_type pstype = SFGTagUsed(&sf->gentags,tag); + if ( pstype == pst_null ) { + SFGenerateNewFeatureTag(&sf->gentags,type,tag); + } else { + if ( pstype==type && type<=pst_ligature ) + /* That's ok */; + else { + GWidgetErrorR(_STR_TagReuse,_STR_TagReuseLong); + goto tryagain; + } + } + } + flags = 0; + if ( GGadgetIsChecked(gcd[i-6].ret) ) flags |= pst_r2l; + if ( GGadgetIsChecked(gcd[i-5].ret) ) flags |= pst_ignorebaseglyphs; + if ( GGadgetIsChecked(gcd[i-4].ret) ) flags |= pst_ignoreligatures; + if ( GGadgetIsChecked(gcd[i-3].ret) ) flags |= pst_ignorecombiningmarks; + if ( ptd.ispair ) { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf(buf,"%c%c%c%c %c%c%c%c %d %.50s dx=%d dy=%d dx_adv=%d dy_adv=%d", +#else + snprintf(buf,sizeof(buf), "%c%c%c%c %c%c%c%c %d %.50s dx=%d dy=%d dx_adv=%d dy_adv=%d | dx=%d dy=%d dx_adv=%d dy_adv=%d", +#endif + tag>>24, tag>>16, tag>>8, tag, + flags&pst_r2l?'r':' ', + flags&pst_ignorebaseglyphs?'b':' ', + flags&pst_ignoreligatures?'l':' ', + flags&pst_ignorecombiningmarks?'m':' ', + script_lang_index, + other, + dx, dy, dxa, dya, + dx2, dy2, dxa2, dya2 ); + } else { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf(buf,"%c%c%c%c %c%c%c%c %d dx=%d dy=%d dx_adv=%d dy_adv=%d", +#else + snprintf(buf,sizeof(buf), "%c%c%c%c %c%c%c%c %d dx=%d dy=%d dx_adv=%d dy_adv=%d", +#endif + tag>>24, tag>>16, tag>>8, tag, + flags&pst_r2l?'r':' ', + flags&pst_ignorebaseglyphs?'b':' ', + flags&pst_ignoreligatures?'l':' ', + flags&pst_ignorecombiningmarks?'m':' ', + script_lang_index, + dx, dy, dxa, dya ); + } + ret = uc_copy(buf); + } else + ret = NULL; + GDrawDestroyWindow(gw); +return( ret ); +} + +static unichar_t *CounterMaskLine(SplineChar *sc, HintMask *hm) { + unichar_t *textmask = NULL; + int j,k,len; + StemInfo *h; + char buffer[100]; + + for ( j=0; j<2; ++j ) { + len = 0; + for ( h=sc->hstem, k=0; h!=NULL && knext, ++k ) { + if ( (*hm)[k>>3]& (0x80>>(k&7)) ) { + sprintf( buffer, "H<%g,%g>, ", + rint(h->start*100)/100, rint(h->width*100)/100 ); + if ( textmask!=NULL ) + uc_strcpy(textmask+len,buffer); + len += strlen(buffer); + } + } + for ( h=sc->vstem; h!=NULL && knext, ++k ) { + if ( (*hm)[k>>3]& (0x80>>(k&7)) ) { + sprintf( buffer, "V<%g,%g>, ", + rint(h->start*100)/100, rint(h->width*100)/100 ); + if ( textmask!=NULL ) + uc_strcpy(textmask+len,buffer); + len += strlen(buffer); + } + } + if ( textmask==NULL ) { + textmask = galloc((len+1)*sizeof(unichar_t)); + *textmask = '\0'; + } + } + if ( len>1 && textmask[len-2]==',' ) + textmask[len-2] = '\0'; +return( textmask ); +} + +#define CID_HintMask 2020 +#define HI_Width 200 +#define HI_Height 260 + +struct hi_data { + int done, ok, empty; + GWindow gw; + HintMask *cur; + SplineChar *sc; +}; + +static int HI_Ok(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct hi_data *hi = GDrawGetUserData(GGadgetGetWindow(g)); + int32 i, len; + GTextInfo **ti = GGadgetGetList(GWidgetGetControl(hi->gw,CID_HintMask),&len); + + for ( i=0; iselected ) + break; + + memset(hi->cur,0,sizeof(HintMask)); + if ( i==len ) { + hi->empty = true; + } else { + for ( i=0; iselected ) + (*hi->cur)[i>>3] |= (0x80>>(i&7)); + } + PI_ShowHints(hi->sc,GWidgetGetControl(hi->gw,CID_HintMask),false); + + hi->done = true; + hi->ok = true; + } +return( true ); +} + +static void HI_DoCancel(struct hi_data *hi) { + hi->done = true; + PI_ShowHints(hi->sc,GWidgetGetControl(hi->gw,CID_HintMask),false); +} + +static int HI_HintSel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct hi_data *hi = GDrawGetUserData(GGadgetGetWindow(g)); + + PI_ShowHints(hi->sc,g,true); + /* Do I need to check for overlap here? */ + } +return( true ); +} + +static int HI_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + HI_DoCancel( GDrawGetUserData(GGadgetGetWindow(g))); + } +return( true ); +} + +static int hi_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + HI_DoCancel( GDrawGetUserData(gw)); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("charinfo.html#Counters"); +return( true ); + } +return( false ); + } +return( true ); +} + +static void CI_AskCounters(CharInfo *ci,HintMask *old) { + HintMask *cur = old != NULL ? old : chunkalloc(sizeof(HintMask)); + struct hi_data hi; + GWindowAttrs wattrs; + GGadgetCreateData hgcd[4]; + GTextInfo hlabel[4]; + GGadget *list = GWidgetGetControl(ci->gw,CID_List+600); + int j; + GRect pos; + + memset(&hi,0,sizeof(hi)); + hi.cur = cur; + hi.sc = ci->sc; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<sc,old); + hgcd[j].gd.handle_controlevent = HI_HintSel; + hgcd[j++].creator = GListCreate; + + hgcd[j].gd.pos.x = 20-3; hgcd[j].gd.pos.y = HI_Height-31-3; + hgcd[j].gd.pos.width = -1; hgcd[j].gd.pos.height = 0; + hgcd[j].gd.flags = gg_visible | gg_enabled | gg_but_default; + hlabel[j].text = (unichar_t *) _STR_OK; + hlabel[j].text_in_resource = true; + hgcd[j].gd.label = &hlabel[j]; + hgcd[j].gd.handle_controlevent = HI_Ok; + hgcd[j++].creator = GButtonCreate; + + hgcd[j].gd.pos.x = -20; hgcd[j].gd.pos.y = HI_Height-31; + hgcd[j].gd.pos.width = -1; hgcd[j].gd.pos.height = 0; + hgcd[j].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + hlabel[j].text = (unichar_t *) _STR_Cancel; + hlabel[j].text_in_resource = true; + hgcd[j].gd.label = &hlabel[j]; + hgcd[j].gd.handle_controlevent = HI_Cancel; + hgcd[j++].creator = GButtonCreate; + + GGadgetsCreate(hi.gw,hgcd); + GTextInfoListFree(hgcd[0].gd.u.list); + + PI_ShowHints(hi.sc,hgcd[0].ret,true); + + GDrawSetVisible(hi.gw,true); + while ( !hi.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(hi.gw); + + if ( !hi.ok ) { + if ( old==NULL ) chunkfree(cur,sizeof(HintMask)); +return; /* Cancelled */ + } else if ( old==NULL && hi.empty ) { + if ( old==NULL ) chunkfree(cur,sizeof(HintMask)); +return; /* Didn't add anything new */ + } else if ( old==NULL ) { + GListAddStr(list,CounterMaskLine(hi.sc,cur),cur); +return; + } else if ( !hi.empty ) { + GListReplaceStr(list,GGadgetGetFirstListSelectedItem(list), + CounterMaskLine(hi.sc,cur),cur); +return; + } else { + GListDelSelected(list); + chunkfree(cur,sizeof(HintMask)); + } +} + +static int LigCheck(SplineChar *sc,enum possub_type type, + uint32 tag, unichar_t *components) { + int i; + static int buts[3] = { _STR_OK, _STR_Cancel, 0 }; + unichar_t *pt, *start, ch; + PST *pst; + SplineFont *sf = sc->parent; + SplineChar *found; + char *temp; + + if ( components==NULL || *components=='\0' ) +return( true ); + + if ( type==pst_ligature ) { + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=sc && sf->chars[i]!=NULL && sf->chars[i]->possub!=NULL ) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) + if ( pst->type==pst_ligature && pst->tag==tag && + uc_strcmp(components,pst->u.lig.components)==0 ) { +return( GWidgetAskR(_STR_Multiple,buts,0,1,_STR_AlreadyLigature,sf->chars[i]->name,i)==0 ); + } + } + } + + if ( type==pst_substitution && uc_strcmp(components,MAC_DELETED_GLYPH_NAME)==0 ) +return( true ); + + start = components; + while ( 1 ) { + pt = u_strchr(start+1,' '); + if ( pt==NULL ) pt = start+u_strlen(start); + ch = *pt; *pt = '\0'; + if ( uc_strcmp(start,sc->name)==0 && type == pst_ligature ) { + GWidgetErrorR(_STR_Badligature,_STR_SelfReferential ); + *pt = ch; +return( false ); + } + temp = cu_copy(start); + found = SFGetChar(sf,-1,temp); + free(temp); + if ( found==NULL ) { + int ret = GWidgetAskR(_STR_Multiple,buts,0,1,_STR_MissingComponent,start); + *pt = ch; +return( ret==0 ); + } + *pt = ch; + if ( ch=='\0' ) + break; + start = pt+1; + while ( *start==' ' ) ++start; + } +return( true ); +} + +static int UnicodeContainsCombiners(int uni) { + const unichar_t *alt; + + if ( uni<0 || uni>0xffff ) +return( -1 ); + if ( iscombining(uni)) +return( true ); + + if ( !isdecompositionnormative(uni) || unicode_alternates[uni>>8]==NULL ) +return( false ); + alt = unicode_alternates[uni>>8][uni&0xff]; + if ( alt==NULL ) +return( false ); + while ( *alt ) { + if ( UnicodeContainsCombiners(*alt)) +return( true ); + ++alt; + } +return( false ); +} + +uint16 PSTDefaultFlags(enum possub_type type,SplineChar *sc ) { + uint16 flags = 0; + + if ( sc!=NULL ) { + if ( SCRightToLeft(sc)) + flags = pst_r2l; +#if 0 /* Better not. Yudit doesn't support the ligature substitution if the bit is set */ + if ( type==pst_ligature ) { + int script = SCScriptFromUnicode(sc); + if ( ScriptIsRightToLeft(script) ) { + if ( !UnicodeContainsCombiners(sc->unicodeenc)) + flags |= pst_ignorecombiningmarks; + } + } +#endif + } +return( flags ); +} + +static void CI_DoNew(CharInfo *ci, unichar_t *def) { + int len, i, sel; + GTextInfo **old, **new; + GGadget *list; + unichar_t *newname, *upt; + uint16 flags=0; + + sel = GTabSetGetSel(GWidgetGetControl(ci->gw,CID_Tabs))-2; + flags = PSTDefaultFlags(sel+1,ci->sc); + + if ( sel==7 ) { + CI_AskCounters(ci,NULL); +return; + } + + newname = sel<=1 + ? AskPosTag(newstrings[sel],def,0,flags,-1,sel+1,ci->sc->parent,ci->sc) + : AskNameTag(newstrings[sel],def,0,flags,-1,sel+1,ci->sc->parent,ci->sc,-1,-1); + if ( newname!=NULL ) { + if ( sel>1 ) { + uint32 tag; int macfeat; + unichar_t *comp; + DecomposeClassName(newname,&comp,&tag,&macfeat,NULL,NULL,NULL,NULL); + if ( !LigCheck(ci->sc,sel+1,tag,comp)) { + free( newname ); free(comp); +return; + } + free(comp); + } + list = GWidgetGetControl(ci->gw,CID_List+sel*100); + old = GGadgetGetList(list,&len); + upt = DecomposeClassName(newname,NULL,NULL,NULL,NULL,NULL,NULL,NULL); + for ( i=0; itext,newname,upt-newname)==0 ) + break; + } + if ( itext = u_copy(new[i]->text); + } + new[i] = gcalloc(1,sizeof(GTextInfo)); + new[i]->fg = new[i]->bg = COLOR_DEFAULT; + new[i]->userdata = NULL; + new[i]->text = newname; + new[i+1] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); + } +} + +static void CI_Drop(CharInfo *ci, GEvent *e) { + char *cnames; + unichar_t *unames, *ucnames; + int sel; + int32 len; + + sel = GTabSetGetSel(GWidgetGetControl(ci->gw,CID_Tabs))-1; + if ( sel<=pst_pair || sel>=pst_lcaret ) { + GDrawBeep(NULL); +return; + } + + if ( !GDrawSelectionHasType(ci->gw,sn_drag_and_drop,"STRING")) +return; + cnames = GDrawRequestSelection(ci->gw,sn_drag_and_drop,"STRING",&len); + if ( cnames==NULL ) +return; + + if ( sel==pst_substitution && strchr(cnames,' ')!=NULL ) { + GWidgetErrorR(_STR_TooManyComponents,_STR_SubsOnlyOne); + free(cnames); +return; + } + + ucnames = uc_copy(cnames); + free(cnames); + unames = ClassName(ucnames,CHR(' ',' ',' ',' '),PSTDefaultFlags(sel,ci->sc), + -1,-1,-1,false); + CI_DoNew(ci,unames); + free(ucnames); + free(unames); +} + +static int CI_New(GGadget *g, GEvent *e) { + CharInfo *ci; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ci = GDrawGetUserData(GGadgetGetWindow(g)); + CI_DoNew(ci,NULL); + } +return( true ); +} + +static int CI_Delete(GGadget *g, GEvent *e) { + int len, i,j, offset; + GTextInfo **old, **new; + GGadget *list; + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + offset = GGadgetGetCid(g)-CID_Delete; + list = GWidgetGetControl(GGadgetGetWindow(g),CID_List+offset); + old = GGadgetGetList(list,&len); + new = gcalloc(len+1,sizeof(GTextInfo *)); + for ( i=j=0; iselected ) { + new[j] = galloc(sizeof(GTextInfo)); + *new[j] = *old[i]; + new[j]->text = u_copy(new[j]->text); + ++j; + } + new[j] = gcalloc(1,sizeof(GTextInfo)); + if ( offset==600 ) { + for ( i=0; iselected ) + chunkfree(old[i]->userdata,sizeof(HintMask)); + } + GGadgetSetList(list,new,false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Delete+offset),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Edit+offset),false); + } +return( true ); +} + +static int CI_Edit(GGadget *g, GEvent *e) { + int len, i; + GTextInfo **old, **new, *ti; + GGadget *list; + CharInfo *ci; + unichar_t *newname, *upt; + int sel; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ci = GDrawGetUserData(GGadgetGetWindow(g)); + sel = GTabSetGetSel(GWidgetGetControl(ci->gw,CID_Tabs))-2; + if ( sel==7 ) sel=6; + list = GWidgetGetControl(GGadgetGetWindow(g),CID_List+sel*100); + if ( (ti = GGadgetGetListItemSelected(list))==NULL ) +return( true ); + if ( sel==6 ) { + CI_AskCounters(ci,ti->userdata); +return(true); + } + newname = sel<=1 + ? AskPosTag(editstrings[sel],ti->text,0,0,0,sel+1,ci->sc->parent,ci->sc) + : AskNameTag(editstrings[sel],ti->text,0,0,0,sel+1,ci->sc->parent,ci->sc,-1,-1); + if ( newname!=NULL ) { + old = GGadgetGetList(list,&len); + upt = DecomposeClassName(newname,NULL,NULL,NULL,NULL,NULL,NULL,NULL); + for ( i=0; itext,newname,upt-newname)==0 ) + break; + } + if ( iselected && newname!=NULL ) { + new[i]->text = newname; + newname = NULL; + } else + new[i]->text = u_copy(new[i]->text); + } + new[i] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); + } + } +return( true ); +} + +static int CI_SelChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + int sel = GGadgetGetFirstListSelectedItem(g); + int offset = GGadgetGetCid(g)-CID_List; + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Delete+offset),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Edit+offset),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Copy+offset),sel!=-1); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + int offset = GGadgetGetCid(g)-CID_List; + e->u.control.subtype = et_buttonactivate; + e->u.control.g = GWidgetGetControl(ci->gw,CID_Edit+offset); + CI_Edit(e->u.control.g,e); + } +return( true ); +} + +static void CI_CanPaste(CharInfo *ci) { + int i, canpaste=false; + enum undotype copytype = CopyUndoType(); + + if ( copytype==ut_possub ) + canpaste = true; + else if ( copytype==ut_none ) + canpaste = GDrawSelectionHasType(ci->gw,sn_clipboard,"STRING"); + for ( i=0; i<5; ++i ) + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Paste+i*100),canpaste); +} + +static void CI_DoCopy(CharInfo *ci) { + GGadget *list; + int sel, i, len, cnt; + GTextInfo **tis; + char **data; + + sel = GTabSetGetSel(GWidgetGetControl(ci->gw,CID_Tabs))-2; + list = GWidgetGetControl(ci->gw,CID_List+sel*100); + if ( list==NULL ) { + GGadgetActiveGadgetEditCmd(ci->gw,ec_copy); +return; + } + tis = GGadgetGetList(list,&len); + for ( i=cnt=0; iselected ) + ++cnt; + if ( cnt==0 ) +return; + data = gcalloc(cnt+1,sizeof(char *)); + for ( i=cnt=0; iselected ) + data[cnt++] = cu_copy(tis[i]->text); + PosSubCopy(sel+1,data); + CI_CanPaste(ci); +} + +static int CI_Copy(GGadget *g, GEvent *e) { + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) + CI_DoCopy( GDrawGetUserData(GGadgetGetWindow(g)) ); +return( true ); +} + +static enum possub_type PSTGuess(char *data) { + enum possub_type type; + int i; + uint32 tag; + + if ( data[0]=='<' ) { + type=pst_max; + } else { + tag = (((uint8 *) data)[0]<<24) | (((uint8 *) data)[1]<<16 ) | + (((uint8 *) data)[2]<<8) | ((uint8 *) data)[3]; + for ( type=pst_position; typeparent; + int new, i; + int merge, act, macfeat; + uint32 tag; + uint16 flags, sli; + unichar_t *name, *ret; + + DecomposeClassName(data,&name,&tag,&macfeat,&flags,&sli,&merge,&act); + + /* We've got a string. Don't know what font it came from, can't really */ + /* make the sli right. Best we can do is insure against crashes and hope */ + /* it was copied from us */ + new = sli; + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( sf->script_lang==NULL ) + new = SFAddScriptLangIndex(sf,SCScriptFromUnicode(sc),DEFAULT_LANG); + else { + for ( i=0; sf->script_lang[i]!=NULL; ++i ); + if ( sli>=i ) + new = SFAddScriptLangIndex(sf,SCScriptFromUnicode(sc),DEFAULT_LANG); + } + + if ( sli==new ) { + free(name); +return( data ); + } + + ret = ClassName(name,tag,flags,new,merge,act,macfeat); + free(name); free(data); +return( ret ); +} + +static void CI_DoPaste(CharInfo *ci,char **data, enum possub_type type) { + GGadget *list; + int sel, i,j,k, len, cnt; + uint32 tag; + GTextInfo **tis, **newlist; + char **tempdata=NULL, *paste = NULL; + char *pt; + int lcnt; + + sel = GTabSetGetSel(GWidgetGetControl(ci->gw,CID_Tabs))-2; + list = GWidgetGetControl(ci->gw,CID_List+sel*100); + if ( list==NULL ) { + GGadgetActiveGadgetEditCmd(ci->gw,ec_paste); +return; + } + tis = GGadgetGetList(list,&len); + if ( data==NULL ) + data = CopyGetPosSubData(&type); + if ( data==NULL ) { + int plen; + paste = GDrawRequestSelection(ci->gw,sn_clipboard,"STRING",&plen); + if ( paste==NULL || plen==0 ) +return; + if ( paste[strlen(paste)-1]=='\n' ) paste[strlen(paste)-1] = '\0'; + for ( pt=paste, lcnt=1; *pt; ++pt ) + if ( *pt=='\n' ) ++lcnt; + tempdata = gcalloc(lcnt+1,sizeof(char *)); + tempdata[0] = paste; + for ( pt=paste, lcnt=1; *pt; ++pt ) + if ( *pt=='\n' ) { + tempdata[lcnt++] = pt+1; + *pt = '\0'; + } + data = tempdata; + if ( paste[0]=='<' ) + type = pst_null; + else { + tag = (((uint8 *) paste)[0]<<24) | (((uint8 *) paste)[1]<<16 ) | + (((uint8 *) paste)[2]<<8) | ((uint8 *) paste)[3]; + type = pst_null; + if ( sel+1>pst_null && sel+1text = u_copy(tis[i]->text); + } + k = 0; + for ( i=0; itext,udata,upt-udata)==0 ) + break; + if ( jtext); + newlist[j]->text = SLICheck(ci->sc,udata); + } else { + newlist[len+k] = gcalloc(1,sizeof(GTextInfo)); + newlist[len+k]->fg = newlist[len+k]->bg = COLOR_DEFAULT; + newlist[len+k]->text = SLICheck(ci->sc,udata); + ++k; + } + } + newlist[len+k] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,newlist,false); + free(paste); free(tempdata); +} + +static int CI_Paste(GGadget *g, GEvent *e) { + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) + CI_DoPaste( GDrawGetUserData(GGadgetGetWindow(g)),NULL,pst_null ); +return( true ); +} + +static int MultipleValues(char *name, int local) { + int buts[3] = { _STR_OK, _STR_Cancel, 0 }; + + if ( GWidgetAskR(_STR_Multiple,buts,0,1,_STR_AlreadyCharUnicode,name,local)==0 ) +return( true ); + +return( false ); +} + +static int MultipleNames(void) { + int buts[] = { _STR_OK, _STR_Cancel, 0 }; + + if ( GWidgetAskR(_STR_Multiple,buts,0,1,_STR_Alreadycharnamed)==0 ) +return( true ); + +return( false ); +} + +static int ParseUValue(GWindow gw, int cid, int minusoneok, SplineFont *sf) { + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + unichar_t *end; + int val; + + if (( *ret=='U' || *ret=='u' ) && ret[1]=='+' ) + val = u_strtoul(ret+2,&end,16); + else if ( *ret=='#' ) + val = u_strtoul(ret+1,&end,16); + else + val = u_strtoul(ret,&end,16); + if ( val==-1 && minusoneok ) +return( -1 ); + if ( *end || val<0 || val>0x7fffffff ) { + ProtestR( _STR_UnicodeValue ); +return( -2 ); + } else if ( val>65535 && sf->encoding_name!=em_unicode4 && + sf->encoding_name=0 && val=32 && val<0x7f ) || val>=0xa1 || + (uc_strcmp(curname,".notdef")==0 && val!=0)) { + if ( val>= 0x10000 ) + sprintf( buf,"u%04X", val ); /* u style names may contain 4,5 or 6 hex digits */ + else + sprintf( buf,"uni%04X", val ); + temp = uc_copy(buf); + } else + temp = uc_copy(".notdef"); + GGadgetSetTitle(GWidgetGetControl(gw,cid),temp); + free(temp); +} + +void SCInsertPST(SplineChar *sc,PST *new) { +#if 0 + PST *old, *prev; + + if ( new->type == pst_ligature || new->type==pst_pair ) { +#endif + new->next = sc->possub; + sc->possub = new; +#if 0 +return; + } + for ( old=sc->possub, prev = NULL; old!=NULL; prev = old, old = old->next ) { + if ( old->tag==new->tag && old->type==new->type && + old->script_lang_index == new->script_lang_index ) { + new->next = old->next; + PSTFree(old); + break; + } + } + if ( prev==NULL ) + sc->possub = new; + else + prev->next = new; +#endif +} + +PST *SCFindPST(SplineChar *sc,int type,uint32 tag,int sli,int flags) { + PST *old; + + for ( old=sc->possub; old!=NULL; old = old->next ) { + if ( old->tag==tag && old->type==type && + (old->script_lang_index == sli || sli==-1) && + (old->flags == flags || flags==-1)) +return( old ); + } +return( NULL ); +} + +static int ParseVR(unichar_t *end,struct vr *vr,unichar_t **done) { + unichar_t *pt; + + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + vr->xoff = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + vr->yoff = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); if ( *pt=='=' ) ++pt; + vr->h_adv_off = u_strtol(pt,&end,10); + for ( pt=end; *pt!='\0' && *pt!='='; ++pt ); + if ( *pt=='=' ) + ++pt; + else { + GWidgetErrorR(_STR_BadPOSSUB,_STR_ExpectedEquals); +return(false); + } + vr->v_adv_off = u_strtol(pt,&end,10); + *done = end; +return( true ); +} + +void SCAppendPosSub(SplineChar *sc,enum possub_type type, char **d) { + PST *new; + char *data; + unichar_t *pt, *end, *rest, *udata, *other, *spt, *tpt; + char *cend; + int i, macfeat; + uint16 flags; + + if ( sc->charinfo!=NULL ) { + CI_DoPaste(sc->charinfo,d,type); + GDrawRaise(sc->charinfo->gw); +return; + } + + for ( i=0; d[i]!=NULL; ++i ) { + data = d[i]; + if ( data[0]=='<' && (strtol(data+1,&cend,10),*cend==',') && + (strtol(cend+1,&cend,10),*cend=='>') && cend[1]==' ' && + cend[6]==' ' ) + /* Don't check any further */; + else if ( strlen(data)<10 || data[4]!=' ' || data[9]!=' ' ) { + GWidgetErrorR(_STR_BadPOSSUB,_STR_BadPOSSUBPaste); +return; + } + if ( type==pst_null ) { + type = PSTGuess(data); + if ( type==pst_null ) { + GWidgetErrorR(_STR_BadPOSSUB,_STR_BadPOSSUB); +return; + } + } + + new = chunkalloc(sizeof(PST)); + new->type = type; + udata = uc_copy(data); + DecomposeClassName(udata,&rest,&new->tag,&macfeat, + &flags, &new->script_lang_index, + NULL,NULL); + new->flags = flags; + new->macfeature = macfeat; + free(udata); + + if ( type==pst_position ) { + if ( !ParseVR(rest,&new->u.pos,&end)) { + chunkfree(new,sizeof(PST)); + free(rest); +return; + } + } else if ( type==pst_pair ) { + for ( pt=rest; *pt==' ' ; ++pt ); + other = pt; + while ( *pt!=' ' && *pt!='\0' ) ++pt; + new->u.pair.paired = cu_copyn(other,pt-other); + new->u.pair.vr = chunkalloc(sizeof(struct vr [2])); + if ( !ParseVR(pt,&new->u.pair.vr[0],&end)) { + free(new->u.pair.paired); + chunkfree(new->u.pair.vr,sizeof(struct vr [2])); + chunkfree(new,sizeof(PST)); + free(rest); +return; + } + if ( !ParseVR(end,&new->u.pair.vr[1],&end)) { + free(new->u.pair.paired); + chunkfree(new->u.pair.vr,sizeof(struct vr [2])); + chunkfree(new,sizeof(PST)); + free(rest); +return; + } + + } else { + /* remove leading/training spaces */ + for ( pt=rest; *pt==' '; ++pt ); + for ( end=pt+u_strlen(pt)-1; *pt==' '; --pt ) + *pt = '\0'; + if ( type==pst_substitution && u_strchr(pt,' ')!=NULL ) { + GWidgetErrorR(_STR_BadPOSSUB,_STR_SimpleSubsOneComponent); + free(rest); +return; + } + /* Remove multiple spaces */ + for ( spt=tpt=pt; *spt; ++spt ) { + *tpt++ = *spt; + if ( *spt==' ' ) { + while ( *spt==' ' ) ++spt; + --spt; + } + } + *tpt = '\0'; + new->u.subs.variant = cu_copy(pt); + if ( type==pst_ligature ) + new->u.lig.lig = sc; + } + + SCInsertPST(sc,new); + free(rest); + } + if ( i!=0 ) + sc->parent->changed = true; +} + +int SCSetMetaData(SplineChar *sc,char *name,int unienc,const unichar_t *comment) { + SplineFont *sf = sc->parent; + int i, mv=0; + int isnotdef, samename=false; + + if ( sc->unicodeenc == unienc && strcmp(name,sc->name)==0 ) { + samename = true; /* No change, it must be good */ + } else { + isnotdef = strcmp(name,".notdef")==0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]!=sc ) { + if ( unienc!=-1 && sf->chars[i]->unicodeenc==unienc ) { + if ( !mv && !MultipleValues(sf->chars[i]->name,i)) { +return( false ); + } + mv = 1; + } else if ( !isnotdef && strcmp(name,sf->chars[i]->name)==0 && + SCDuplicate(sc)!=SCDuplicate(sf->chars[i]) ) { + if ( !MultipleNames()) { +return( false ); + } + free(sf->chars[i]->name); + sf->chars[i]->namechanged = true; + if ( strncmp(sc->name,"uni",3)==0 && sf->chars[i]->unicodeenc!=-1) { + char buffer[12]; + if ( sf->chars[i]->unicodeenc<0x10000 ) + sprintf( buffer,"uni%04X", sf->chars[i]->unicodeenc); + else + sprintf( buffer,"u%04X", sf->chars[i]->unicodeenc); + sf->chars[i]->name = copy(buffer); + } else { + sf->chars[i]->name = sc->name; + sc->name = NULL; + } + break; + } + } + } + sc->unicodeenc = unienc; + if ( sc->name==NULL || strcmp(name,sc->name)!=0 ) { + free(sc->name); + sc->name = copy(name); + sc->namechanged = true; + GlyphHashFree(sf); + } + sf->changed = true; + if ( (sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4) && + unienc==sc->enc && unienc>=0xe000 && unienc<=0xf8ff ) + /* Ok to name things in the private use area */; + else if ( samename ) + /* Ok to name it itself */; + else if ( (sf->encoding_nameenc<256) || + (sf->encoding_name>=em_big5 && sf->encoding_name<=em_unicode && sc->enc<65536 ) || + (sf->encoding_name>=e_first2byte && sf->encoding_nameenc<0x7e7e ) || + sc->unicodeenc!=-1 ) + sf->encoding_name = em_none; + + free(sc->comment); sc->comment = NULL; + if ( comment!=NULL && *comment!='\0' ) + sc->comment = u_copy(comment); + + SCRefreshTitles(sc); +return( true ); +} + +static int CI_ProcessPosSubs(CharInfo *ci) { + int i, j, len; + GTextInfo **tis; + PST *old = ci->sc->possub, *prev, *lcaret; + char **data; + + for ( prev=NULL, lcaret=old; lcaret!=NULL && lcaret->type!=pst_lcaret; + prev = lcaret, lcaret=lcaret->next ); + if ( lcaret!=NULL ) { + if ( prev==NULL ) + old = lcaret->next; + else + prev->next = lcaret->next; + lcaret->next = NULL; + } + + ci->sc->possub = lcaret; + ci->sc->charinfo = NULL; /* Without this we put them back into the charinfo dlg */ + for ( i=0; i<6; ++i ) { + tis = GGadgetGetList(GWidgetGetControl(ci->gw,CID_List+i*100),&len); + if ( len!=0 ) { + data = galloc((len+1)*sizeof(char *)); + for ( j=0; jtext); + data[j] = NULL; + SCAppendPosSub(ci->sc,i+1,data); + for ( j=0; jsc->charinfo = ci; + PSTFree(old); + SCLigCaretCheck(ci->sc,true); +return( true ); +} + +static int CI_NameCheck(const unichar_t *name) { + int bad, questionable; + static int buts[] = { _STR_Yes, _STR_No, 0 }; + + if ( uc_strcmp(name,".notdef")==0 ) /* This name is a special case and doesn't follow conventions */ +return( true ); + if ( u_strlen(name)>31 ) { + GWidgetErrorR(_STR_BadName,_STR_GlyphNameTooLong); +return( false ); + } else if ( *name=='\0' ) { + GWidgetErrorR(_STR_BadName,_STR_BadName); +return( false ); + } else if ( isdigit(*name) || *name=='.' ) { + GWidgetErrorR(_STR_BadName,_STR_GlyphNameNoDigits); +return( false ); + } + bad = questionable = false; + while ( *name ) { + if ( *name<=' ' || *name>=0x7f || + *name=='(' || *name=='[' || *name=='{' || *name=='<' || + *name==')' || *name==']' || *name=='}' || *name=='>' || + *name=='%' || *name=='/' ) + bad=true; + else if ( !isalnum(*name) && *name!='.' && *name!='_' ) + questionable = true; + ++name; + } + if ( bad ) { + GWidgetErrorR(_STR_BadName,_STR_GlyphNameBadChars); +return( false ); + } else if ( questionable ) { + if ( GWidgetAskR(_STR_BadName,buts,0,1,_STR_GlyphNameQuestionableChars)==1 ) +return(false); + } +return( true ); +} + +static void CI_ParseCounters(CharInfo *ci) { + int32 i,len; + GTextInfo **ti = GGadgetGetList(GWidgetGetControl(ci->gw,CID_List+600),&len); + SplineChar *sc = ci->sc; + + free(sc->countermasks); + + sc->countermask_cnt = len; + if ( len==0 ) + sc->countermasks = NULL; + else { + sc->countermasks = galloc(len*sizeof(HintMask)); + for ( i=0; icountermasks[i],ti[i]->userdata,sizeof(HintMask)); + chunkfree(ti[i]->userdata,sizeof(HintMask)); + ti[i]->userdata = NULL; + } + } +} + +static int _CI_OK(CharInfo *ci) { + int val; + int ret, refresh_fvdi=0; + char *name; + const unichar_t *comment, *nm; + FontView *fvs; + int err = false; + + val = ParseUValue(ci->gw,CID_UValue,true,ci->sc->parent); + if ( val==-2 ) +return( false ); + if ( err ) +return( false ); + if ( !CI_ProcessPosSubs(ci)) +return( false ); + nm = _GGadgetGetTitle(GWidgetGetControl(ci->gw,CID_UName)); + if ( !CI_NameCheck(nm) ) +return( false ); + name = cu_copy( nm ); + if ( strcmp(name,ci->sc->name)!=0 || val!=ci->sc->unicodeenc ) + refresh_fvdi = 1; + comment = _GGadgetGetTitle(GWidgetGetControl(ci->gw,CID_Comment)); + SCPreserveState(ci->sc,2); + ret = SCSetMetaData(ci->sc,name,val,comment); + free(name); + if ( refresh_fvdi ) { + for ( fvs=ci->sc->parent->fv; fvs!=NULL; fvs=fvs->next ) + GDrawRequestExpose(fvs->gw,NULL,false); /* Redraw info area just in case this char is selected */ + } + if ( ret ) { + ci->sc->glyph_class = GGadgetGetFirstListSelectedItem(GWidgetGetControl(ci->gw,CID_GClass)); + val = GGadgetGetFirstListSelectedItem(GWidgetGetControl(ci->gw,CID_Color)); + if ( val!=-1 ) { + if ( ci->sc->color != (int) (std_colors[val].userdata) ) { + ci->sc->color = (int) (std_colors[val].userdata); + for ( fvs=ci->sc->parent->fv; fvs!=NULL; fvs=fvs->next ) + GDrawRequestExpose(fvs->v,NULL,false); /* Redraw info area just in case this char is selected */ + } + } + CI_ParseCounters(ci); + } + if ( ret ) + ci->sc->parent->changed = true; +return( ret ); +} + +static void CI_Finish(CharInfo *ci) { + GDrawDestroyWindow(ci->gw); +} + +static int CI_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + if ( _CI_OK(ci) ) + CI_Finish(ci); + } +return( true ); +} + +static char *LigDefaultStr(int uni, char *name, int alt_lig ) { + const unichar_t *alt=NULL, *pt; + char *components = NULL; + int len; + const char *uname; + unichar_t hack[30], *upt; + + /* If it's not (bmp) unicode we have no info on it */ + /* Unless it looks like one of adobe's special ligature names */ + if ( uni==-1 || uni>=0x10000 ) + /* Nope */; + else if ( isdecompositionnormative(uni) && + unicode_alternates[uni>>8]!=NULL && + (alt = unicode_alternates[uni>>8][uni&0xff])!=NULL ) { + if ( alt[1]=='\0' ) + alt = NULL; /* Single replacements aren't ligatures */ +#if 0 + else if ( iscombining(alt[1]) && ( alt[2]=='\0' || iscombining(alt[2]))) + alt = NULL; /* Don't treat accented letters as ligatures */ +#endif /* The mac does treat accented letters as ligatures (Unicode decomposition) */ + else if ( _UnicodeNameAnnot!=NULL && + (uname = _UnicodeNameAnnot[uni>>16][(uni>>8)&0xff][uni&0xff].name)!=NULL && + strstr(uname,"LIGATURE")==NULL && + strstr(uname,"VULGAR FRACTION")==NULL && + (uni<0xfb2a || uni>0xfb4f) && /* Allow hebrew precomposed chars */ + uni!=0x215f ) + alt = NULL; + } + if ( alt==NULL ) { + if ( name==NULL || alt_lig ) +return( NULL ); + else +return( AdobeLigatureFormat(name)); + } + + if ( uni==0xfb03 && alt_lig==1 ) + components = copy("ff i"); + else if ( uni==0xfb04 && alt_lig==1 ) + components = copy("ff l"); + else if ( alt!=NULL ) { + if ( alt[1]==0x2044 && (alt[2]==0 || alt[3]==0) && alt_lig==1 ) { + u_strcpy(hack,alt); + hack[1] = '/'; + alt = hack; + } else if ( alt_lig ) +return( NULL ); + + if ( isarabisolated(uni) || isarabinitial(uni) || isarabmedial(uni) || isarabfinal(uni) ) { + /* If it is arabic, then convert from the unformed version to the formed */ + if ( u_strlen(alt)=0x600 && *upt<=0x6ff ) + *upt = ArabicForms[*upt-0x600].medial; + } + if ( isarabisolated(uni) || isarabfinal(uni) ) { + int len = upt-hack-1; + if ( alt[len]>=0x600 && alt[len]<=0x6ff ) + hack[len] = ArabicForms[alt[len]-0x600].final; + } + if ( isarabisolated(uni) || isarabinitial(uni) ) { + if ( alt[0]>=0x600 && alt[0]<=0x6ff ) + hack[0] = ArabicForms[alt[0]-0x600].initial; + } + alt = hack; + } + } + + components=NULL; + while ( 1 ) { + len = 0; + for ( pt=alt; *pt; ++pt ) { + if ( psunicodenames[*pt]!=NULL ) { + if ( components!=NULL ) + strcpy(components+len,psunicodenames[*pt]); + len += strlen( psunicodenames[*pt])+1; + if ( components!=NULL ) + components[len-1] = ' '; + } else { + if ( components!=NULL ) + sprintf(components+len, "uni%04X ", *pt ); + len += 8; + } + } + if ( components!=NULL ) + break; + components = galloc(len+1); + } + components[len-1] = '\0'; + } +return( components ); +} + +static int psnamesinited=false; +#define HASH_SIZE 257 +struct psbucket { const char *name; int uni; struct psbucket *prev; } *psbuckets[HASH_SIZE]; + +static int hashname(const char *name) { + /* Name is assumed to be ascii */ + int hash=0; + + while ( *name ) { + if ( *name<=' ' || *name>=0x7f ) + break; + hash = (hash<<3)|((hash>>29)&0x7); + hash ^= *name++-(' '+1); + } + hash ^= (hash>>16); + hash &= 0xffff; +return( hash%HASH_SIZE ); +} + +static void psaddbucket(const char *name, int uni) { + int hash = hashname(name); + struct psbucket *buck = gcalloc(1,sizeof(struct psbucket)); + + buck->name = name; + buck->uni = uni; + buck->prev = psbuckets[hash]; + psbuckets[hash] = buck; +} + +static void psinitnames(void) { + int i; + + for ( i=psaltuninames_cnt-1; i>=0 ; --i ) + psaddbucket(psaltuninames[i].name,psaltuninames[i].unicode); + for ( i=psunicodenames_cnt-1; i>=0 ; --i ) + if ( psunicodenames[i]!=NULL ) + psaddbucket(psunicodenames[i],i); + psnamesinited = true; +} + +int UniFromName(const char *name) { + int i = -1; + char *end; + struct psbucket *buck; + + if ( strncmp(name,"uni",3)==0 ) { + i = strtol(name+3,&end,16); + if ( *end || end-name!=7 ) /* uniXXXXXXXX means a ligature of uniXXXX and uniXXXX */ + i = -1; + } else if ( name[0]=='u' && strlen(name)>=5 ) { + i = strtol(name+1,&end,16); + if ( *end ) + i = -1; + } else if ( name[0]=='U' && name[1]=='+' && strlen(name)==6 ) { + /* Unifont uses this convention */ + i = strtol(name+2,&end,16); + if ( *end ) + i = -1; + } + if ( i==-1 ) { + if ( !psnamesinited ) + psinitnames(); + for ( buck = psbuckets[hashname(name)]; buck!=NULL; buck=buck->prev ) + if ( strcmp(buck->name,name)==0 ) + break; + if ( buck!=NULL ) + i = buck->uni; + } +return( i ); +} + +int uUniFromName(const unichar_t *name) { + int i = -1; + unichar_t *end; + + if ( uc_strncmp(name,"uni",3)==0 ) { + i = u_strtol(name+3,&end,16); + if ( *end || end-name!=7 ) /* uniXXXXXXXX means a ligature of uniXXXX and uniXXXX */ + i = -1; + } else if ( name[0]=='u' && u_strlen(name)>=5 ) { + i = u_strtol(name+1,&end,16); + if ( *end ) + i = -1; + } else if ( name[0]=='U' && name[1]=='+' && u_strlen(name)==6 ) { + /* Unifont uses this convention */ + i = u_strtol(name+2,&end,16); + if ( *end ) + i = -1; + } + if ( i==-1 ) for ( i=psunicodenames_cnt-1; i>=0 ; --i ) { + if ( psunicodenames[i]!=NULL ) + if ( uc_strcmp(name,psunicodenames[i])==0 ) + break; + } + if ( i==-1 ) for ( i=psaltuninames_cnt-1; i>=0 ; --i ) { + if ( uc_strcmp(name,psaltuninames[i].name)==0 ) +return( psaltuninames[i].unicode ); + } +return( i ); +} + +char *AdobeLigatureFormat(char *name) { + /* There are two formats for ligs: _{...} or */ + /* uni{...} (only works for BMP) */ + /* I'm not checking to see if all the components are valid */ + char *components, *pt, buffer[12]; + const char *next; + int len = strlen(name), uni; + + if ( strncmp(name,"uni",3)==0 && (len-3)%4==0 && len>7 ) { + pt = name+3; + components = galloc(1); *components = '\0'; + while ( *pt ) { + if ( sscanf(pt,"%4x", (unsigned *) &uni )==0 ) { + free(components); components = NULL; + break; + } + if ( uni=0xbc && uni<=0xbe ) || (uni>=0x2153 && uni<=0x215f) ) + tag = CHR('f','r','a','c'); /* Fraction */ + else if ( uni==0xfb4f ) + tag = CHR('h','l','i','g'); + else if ( uni>=0xfb2a && uni<=0xfb4e ) + tag = CHR('c','c','m','p'); + else switch ( uni ) { + case 0xfb05: /* long-s t */ + tag = CHR('h','l','i','g'); + break; + case 0xfb06: /* s t */ + tag = CHR('d','l','i','g'); + break; + case 0xfefb: case 0xfefc: /* Lam & Alef, required ligs */ + tag = CHR('r','l','i','g'); + break; + } + if ( tag==CHR('l','i','g','a') && uni!=-1 && uni<0x10000 ) { + const unichar_t *alt=NULL; + if ( isdecompositionnormative(uni) && + unicode_alternates[uni>>8]!=NULL && + (alt = unicode_alternates[uni>>8][uni&0xff])!=NULL ) { + if ( iscombining(alt[1]) && ( alt[2]=='\0' || iscombining(alt[2]))) + tag = CHR('M','U','C','M'); + } + } +return( tag ); +} + +static PST *AddPos(PST *last,uint32 tag,int dx, int dy, int dxa, int dya, uint16 flags, + SplineChar *sc) { + PST *pos = chunkalloc(sizeof(PST)); + pos->tag = tag; + pos->flags = flags; + pos->type = pst_position; + pos->next = last; + pos->script_lang_index = SFAddScriptLangIndex(sc->parent, + SCScriptFromUnicode(sc),DEFAULT_LANG); + pos->u.pos.xoff = dx; + pos->u.pos.yoff = dy; + pos->u.pos.h_adv_off = dxa; + pos->u.pos.v_adv_off = dya; +return( pos ); +} + +PST *AddSubs(PST *last,uint32 tag,char *name,uint16 flags, + uint16 sli,SplineChar *sc) { + PST *sub = chunkalloc(sizeof(PST)); + sub->tag = tag; + sub->flags = flags; + sub->type = pst_substitution; + if ( sli==SLI_UNKNOWN ) + sub->script_lang_index = SFAddScriptLangIndex(sc->parent, + SCScriptFromUnicode(sc),DEFAULT_LANG); + else + sub->script_lang_index = sli; + sub->next = last; + sub->u.subs.variant = copy(name); +return( sub ); +} + +static SplineChar *SuffixCheck(SplineChar *sc,char *suffix) { + SplineChar *alt = NULL; + SplineFont *sf = sc->parent; + char namebuf[100]; + + if ( *suffix=='.' ) ++suffix; + if ( sf->cidmaster!=NULL ) { + sprintf( namebuf, "cid-%d.%s", sc->enc, suffix ); + alt = SFGetChar(sf,-1,namebuf); + } + if ( alt==NULL && sc->unicodeenc!=-1 ) { + sprintf( namebuf, "uni%04X.%s", sc->unicodeenc, suffix ); + alt = SFGetChar(sf,-1,namebuf); + } + if ( alt==NULL ) { + sprintf( namebuf, "%s.%s", sc->name, suffix ); + alt = SFGetChar(sf,-1,namebuf); + } +return( alt ); +} + +static PST *LigDefaultList(SplineChar *sc, uint32 tag) { + /* This fills in default ligatures as the name suggests */ + /* it also builds up various other default gpos/gsub tables */ + char *components; + PST *lig, *last=NULL; + int i, alt_index; + SplineChar *alt; + SplineFont *sf = sc->parent; + const unichar_t *variant; + static uint32 form_tags[] = { CHR('i','n','i','t'), CHR('m','e','d','i'), CHR('f','i','n','a'), CHR('i','s','o','l'), 0 }; + DBounds bb; + + if ( tag==0 || tag==0xffffffff || tag == LigTagFromUnicode(sc->unicodeenc) ) { + for ( alt_index = 0; ; ++alt_index ) { + components = LigDefaultStr(sc->unicodeenc,sc->name,alt_index); + if ( components==NULL ) + break; + lig = chunkalloc(sizeof(PST)); + lig->tag = LigTagFromUnicode(sc->unicodeenc); + lig->flags = PSTDefaultFlags(pst_ligature,sc); + lig->script_lang_index = SFAddScriptLangIndex(sc->parent, + SCScriptFromUnicode(sc),DEFAULT_LANG); + lig->type = pst_ligature; + lig->next = last; + last = lig; + lig->u.lig.lig = sc; + lig->u.lig.components = components; +#if 0 + if ( lig->tag==CHR('r','l','i','g') ) { + lig2 = chunkalloc(sizeof(PST)); + *lig2 = *lig; + lig2->tag = CHR('l','i','g','a'); + lig2->next = last; + last = lig2; + } +#endif + } + } + + /* Look for left to right mirrored characters */ + if ( tag==0 || tag==CHR('r','t','l','a') ) { + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10000 && tomirror(sc->unicodeenc)!=0 ) { + alt = SFGetChar(sf,tomirror(sc->unicodeenc),NULL); + if ( alt!=NULL ) + last=AddSubs(last,CHR('r','t','l','a'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + } + + /* Look for vertically rotated text */ + if ( tag==0 || tag==CHR('v','r','t','2') ) { + alt = SuffixCheck(sc,"vert"); + if ( alt!=NULL ) + last=AddSubs(last,CHR('v','r','t','2'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + + /* Look for small caps */ + if ( tag==0 || tag==CHR('s','m','c','p') ) { + alt = SuffixCheck(sc,"sc"); +#if 0 /* Adobe says oldstyles can be included in smallcaps */ + if ( alt==NULL ) + alt = SuffixCheck(sc,"oldstyle"); +#endif + if ( alt!=NULL ) + last=AddSubs(last,CHR('s','m','c','p'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + + /* And for oldstyle */ + if ( tag==0 || tag==CHR('o','n','u','m') ) { + alt = SuffixCheck(sc,"oldstyle"); + if ( alt!=NULL ) + last=AddSubs(last,CHR('o','n','u','m'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + + /* Look for superscripts */ + if ( tag==0 || tag==CHR('s','u','p','s') ) { + alt = SuffixCheck(sc,"superior"); + if ( alt==NULL ) { + for ( i=0x2070; i<0x2080; ++i ) { + if ( unicode_alternates[i>>8]!=NULL && + (variant = unicode_alternates[i>>8][i&0xff])!=NULL && variant[1]=='\0' && + *variant == sc->unicodeenc ) + break; + } + if ( i==0x2080 ) { + if ( sc->unicodeenc=='1' ) i = 0xb9; + else if ( sc->unicodeenc=='2' ) i = 0xb2; + else if ( sc->unicodeenc=='3' ) i = 0xb3; + } + if ( i!=0x2080 ) + alt = SFGetChar(sf,i,NULL); + } + if ( alt!=NULL ) + last=AddSubs(last,CHR('s','u','p','s'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + + /* Look for subscripts */ + if ( tag==0 || tag==CHR('s','u','b','s') ) { + alt = SuffixCheck(sc,"inferior"); + if ( alt==NULL ) { + for ( i=0x2080; i<0x2080; ++i ) { + if ( unicode_alternates[i>>8]!=NULL && + (variant = unicode_alternates[i>>8][i&0xff])!=NULL && variant[1]=='\0' && + *variant == sc->unicodeenc ) + break; + } + if ( i!=0x2090 ) + alt = SFGetChar(sf,i,NULL); + } + if ( alt!=NULL ) + last=AddSubs(last,CHR('s','u','b','s'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + + /* Look for swash forms */ + if ( tag==0 || tag==CHR('s','w','s','h')) { + alt = SuffixCheck(sc,"swash"); + if ( alt!=NULL ) { + last=AddSubs(last,CHR('s','w','s','h'),alt->name, 0x0,SLI_UNKNOWN,sc); + last->type = pst_alternate; + } + } + + if ( tag==0 || tag==CHR('p','w','i','d') ) { + if (( sc->unicodeenc>=0xff01 && sc->unicodeenc<=0xff5e ) || + ( sc->unicodeenc>=0xffe0 && sc->unicodeenc<0xffe6)) { + /* these are full width latin */ + if ( unicode_alternates[sc->unicodeenc>>8]!=NULL && + (variant = unicode_alternates[sc->unicodeenc>>8][sc->unicodeenc&0xff])!=NULL && + variant[1]=='\0' ) { + alt = SFGetChar(sf,variant[0],NULL); + if ( alt!=NULL ) + last=AddSubs(last,CHR('p','w','i','d'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + } + } + + if ( tag==0 || tag==CHR('f','w','i','d') ) { + alt = NULL; + if ( sc->unicodeenc>=0xff61 && sc->unicodeenc<0xffdc ) { + /* These are halfwidth katakana and sung */ + if ( unicode_alternates[sc->unicodeenc>>8]!=NULL && + (variant = unicode_alternates[sc->unicodeenc>>8][sc->unicodeenc&0xff])!=NULL && + variant[1]=='\0' ) { + alt = SFGetChar(sf,variant[0],NULL); + if ( alt!=NULL ) + last=AddSubs(last,CHR('f','w','i','d'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + } else if ( sc->unicodeenc>=0x0021 && sc->unicodeenc<=0x100 ) { + for ( i=0xff01; i<0xffef; ++i ) { + if ( unicode_alternates[i>>8]!=NULL && + (variant = unicode_alternates[i>>8][i&0xff])!=NULL && + variant[1]=='\0' && variant[0]==sc->unicodeenc ) + break; + } + if ( i<0xffef ) { + alt = SFGetChar(sf,i,NULL); + if ( alt!=NULL ) + last=AddSubs(last,CHR('f','w','i','d'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + } + if ( alt==NULL ) { + alt = SuffixCheck(sc,"full"); + if ( alt!=NULL ) + last=AddSubs(last,CHR('f','w','i','d'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + } + + if ( tag==0 || tag==CHR('h','w','i','d') ) { + alt = NULL; + if ( sc->unicodeenc>=0x3000 && sc->unicodeenc<=0x31ff ) { + /* Japanese katakana & Korean sung full */ + for ( i=0xff61; i<0xffdf; ++i ) { + if ( unicode_alternates[i>>8]!=NULL && + (variant = unicode_alternates[i>>8][i&0xff])!=NULL && + variant[1]=='\0' && variant[0]==sc->unicodeenc ) + break; + } + if ( i<0xffdf ) { + alt = SFGetChar(sf,i,NULL); + if ( alt!=NULL ) + last=AddSubs(last,CHR('h','w','i','d'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + } + if ( alt==NULL ) { + alt = SuffixCheck(sc,"hw"); + if ( alt!=NULL ) + last=AddSubs(last,CHR('h','w','i','d'),alt->name, 0x0,SLI_UNKNOWN,sc); + } + } + + if ( sc->unicodeenc>=0x600 && sc->unicodeenc<0x700 ) { + /* Arabic forms */ + for ( i=0; form_tags[i]!=0; ++i ) if ( tag==0 || form_tags[i]==tag ) { + if ( (&(ArabicForms[sc->unicodeenc-0x600].initial))[i]!=0 && + (&(ArabicForms[sc->unicodeenc-0x600].initial))[i]!=sc->unicodeenc && + (alt = SFGetChar(sf,(&(ArabicForms[sc->unicodeenc-0x600].initial))[i],NULL))!=NULL ) + last=AddSubs(last,form_tags[i],alt->name,0,SLI_UNKNOWN,sc); + } +#if 0 /* Silvan Toledo tells me that Hebrew doesn't need (and shouldn't have) this tag */ + } else if ( sc->unicodeenc>=0x5db && sc->unicodeenc<=0x5e6 && + (tag==0 || tag==CHR('f','i','n','a')) ) { + /* Hebrew finals */ + alt = NULL; + if ( sc->unicodeenc==0x5db ) + alt = SFGetChar(sf,0x5da,NULL); + else if ( sc->unicodeenc==0x5de ) + alt = SFGetChar(sf,0x5dd,NULL); + else if ( sc->unicodeenc==0x5e0 ) + alt = SFGetChar(sf,0x5df,NULL); + else if ( sc->unicodeenc==0x5e4 ) + alt = SFGetChar(sf,0x5e3,NULL); + else if ( sc->unicodeenc==0x5e6 ) + alt = SFGetChar(sf,0x5e5,NULL); + if ( alt!=NULL ) + last=AddSubs(last,CHR('f','i','n','a'),alt->name,0,SLI_UNKNOWN,sc); +#endif + } else if ( sc->unicodeenc>=0x3c3 && + (tag==0 || tag==CHR('f','i','n','a')) ) { + /* Greek final sigma */ + alt = SFGetChar(sf,0x3c2,NULL); + if ( alt!=NULL ) + last=AddSubs(last,CHR('f','i','n','a'),alt->name,0,SLI_UNKNOWN,sc); +/* I'd really like to add an entry for long-s (initial & medial) but it would */ +/* confuse most people. There's no historical initial entry, and although the*/ +/* open type docs suggest long-s as an example of the 'hist' tag, the */ +/* semantics are incorrect (ie. it would change final short-s to long-s and */ +/* that's not valid) so... we do nothing for latin here. */ + } + + if ( tag==0 || tag==CHR('l','f','b','d') ) { + SplineCharFindBounds(sc,&bb); + last = AddPos(last,CHR('l','f','b','d'),-bb.minx,0,-bb.minx,0, 0x0, sc); + } + + if ( tag==0 || tag==CHR('r','t','b','d') ) { + SplineCharFindBounds(sc,&bb); + last = AddPos(last,CHR('r','t','b','d'),0,0,bb.maxx-sc->width,0, 0x0, sc); + } +return( last ); +} + +static void SCMergePSList(SplineChar *sc,PST *list) { + PST *test, *next, *prev; + + for ( ; list!=NULL; list=next ) { + next = list->next; + prev = NULL; + for ( test=sc->possub; test!=NULL ; prev=test, test=test->next ) { + if ( test->tag==list->tag && (test->type!=pst_ligature || + strcmp(test->u.lig.components,list->u.lig.components)==0 )) + break; + } + if ( test!=NULL ) { + if ( prev==NULL ) + sc->possub = list; + else + prev->next = list; + list->next = test->next; + test->next = NULL; + PSTFree(test); + } else { + list->next = sc->possub; + sc->possub = list; + } + } +} + +void SCLigDefault(SplineChar *sc) { + PST *pst, *prev, *n; + + /* Free any ligatures */ + for ( prev=NULL, pst = sc->possub; pst!=NULL; pst = n ) { + n = pst->next; + if ( pst->type == pst_ligature ) { + if ( prev==NULL ) + sc->possub = n; + else + prev->next = n; + pst->next = NULL; + PSTFree(pst); + } else + prev = pst; + } + + if ( LigTagFromUnicode(sc->unicodeenc)!=CHR('M','U','C','M') ) { + pst = LigDefaultList(sc,0xffffffff); + if ( pst!=NULL ) { + for ( n=pst; n->next!=NULL ; n=n->next ); + n->next = sc->possub; + sc->possub = pst; + } + } +} + +void SCTagDefault(SplineChar *sc,uint32 tag) { + + SCMergePSList(sc,LigDefaultList(sc,tag)); +} + +void SCSuffixDefault(SplineChar *sc,uint32 tag,char *suffix,uint16 flags,uint16 sli) { + SplineChar *alt; + + alt = SuffixCheck(sc,suffix); + if ( alt!=NULL ) + SCMergePSList(sc,AddSubs(NULL,tag,alt->name,flags,sli,sc)); +} + +void SCLigCaretCheck(SplineChar *sc,int clean) { + PST *pst, *carets=NULL, *prev_carets, *prev; + int lig_comp_max=0, lc, i; + char *pt; + /* Check to see if this is a ligature character, and if so, does it have */ + /* a ligature caret structure. If a lig but no lig caret structure then */ + /* create a lig caret struct */ + + for ( pst=sc->possub, prev=NULL; pst!=NULL; prev = pst, pst=pst->next ) { + if ( pst->type == pst_lcaret ) { + if ( carets!=NULL ) + GDrawIError("Too many ligature caret structures" ); + else { + carets = pst; + prev_carets = prev; + } + } else if ( pst->type==pst_ligature ) { + for ( lc=0, pt=pst->u.lig.components; *pt; ++pt ) + if ( *pt==' ' ) ++lc; + if ( lc>lig_comp_max ) + lig_comp_max = lc; + } + } + if ( lig_comp_max == 0 ) { + if ( clean && carets!=NULL ) { + if ( prev_carets==NULL ) + sc->possub = carets->next; + else + prev_carets->next = carets->next; + carets->next = NULL; + PSTFree(carets); + } +return; + } + if ( carets==NULL ) { + carets = chunkalloc(sizeof(PST)); + carets->type = pst_lcaret; + carets->script_lang_index = -1; /* Not really relevant here */ + carets->next = sc->possub; + sc->possub = carets; + } + if ( carets->u.lcaret.cnt>=lig_comp_max ) { + carets->u.lcaret.cnt = lig_comp_max; +return; + } + if ( carets->u.lcaret.carets==NULL ) + carets->u.lcaret.carets = gcalloc(lig_comp_max,sizeof(real)); + else { + carets->u.lcaret.carets = grealloc(carets->u.lcaret.carets,lig_comp_max*sizeof(real)); + for ( i=carets->u.lcaret.cnt; iu.lcaret.carets[i] = 0; + } + carets->u.lcaret.cnt = lig_comp_max; +} + +static int CI_SName(GGadget *g, GEvent *e) { /* Set From Name */ + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(ci->gw,CID_UName)); + int i; + char buf[40]; unichar_t ubuf[2], *temp; + i = uUniFromName(ret); + if ( i==-1 ) { + /* Adobe says names like uni00410042 represent a ligature (A&B) */ + /* (that is "uni" followed by two 4-digit codes). */ + /* But that names outside of BMP should be uXXXX or uXXXXX or uXXXXXX */ + if ( ret[0]=='u' && ret[1]!='n' && u_strlen(ret)<=1+6 ) { + unichar_t *end; + i = u_strtol(ret+1,&end,16); + if ( *end ) + i = -1; + else /* Make sure it is properly capitalized */ + SetNameFromUnicode(ci->gw,CID_UName,i); + } + } + + sprintf(buf,"U+%04x", i); + temp = uc_copy(i==-1?"-1":buf); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UValue),temp); + free(temp); + + ubuf[0] = i; + if ( i==-1 || i>0xffff ) + ubuf[0] = '\0'; + ubuf[1] = '\0'; + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UChar),ubuf); + } +return( true ); +} + +static int CI_SValue(GGadget *g, GEvent *e) { /* Set From Value */ + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + unichar_t ubuf[2]; + int val; + + val = ParseUValue(ci->gw,CID_UValue,false,ci->sc->parent); + if ( val<0 ) +return( true ); + + SetNameFromUnicode(ci->gw,CID_UName,val); + + ubuf[0] = val; + if ( val==-1 ) + ubuf[0] = '\0'; + ubuf[1] = '\0'; + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UChar),ubuf); + } +return( true ); +} + +static GTextInfo *TIFromName(const char *name) { + GTextInfo *ti = gcalloc(1,sizeof(GTextInfo)); + ti->text = uc_copy(name); + ti->fg = COLOR_DEFAULT; + ti->bg = COLOR_DEFAULT; +return( ti ); +} + +static void CI_SetNameList(CharInfo *ci,int val) { + GGadget *g = GWidgetGetControl(ci->gw,CID_UName); + int cnt, i; + char buffer[20]; + + if ( GGadgetGetUserData(g)==(void *) val ) +return; /* Didn't change */ + if ( val<0 || val>=0x1000000 ) { + static GTextInfo notdef = { (unichar_t *) ".notdef", NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + empty = { NULL }, + *list[] = { ¬def, &empty }; + GGadgetSetList(g,list,true); + } else { + GTextInfo **list = NULL; + while ( 1 ) { + cnt=0; + if ( val=0x7f && val<0xa0)) { + if ( list ) list[cnt] = TIFromName(".notdef"); + ++cnt; + } + for ( i=0; psaltuninames[i].name!=NULL; ++i ) + if ( psaltuninames[i].unicode==val ) { + if ( list ) list[cnt] = TIFromName(psaltuninames[i].name); + ++cnt; + } + if ( val<0x10000 ) { + if ( list ) { + sprintf( buffer, "uni%04X", val); + list[cnt] = TIFromName(buffer); + } + ++cnt; + } + if ( list ) { + sprintf( buffer, "u%04X", val); + list[cnt] = TIFromName(buffer); + list[cnt+1] = TIFromName(NULL); + } + ++cnt; + if ( list!=NULL ) + break; + list = galloc((cnt+1)*sizeof(GTextInfo*)); + } + GGadgetSetList(g,list,true); + } + GGadgetSetUserData(g,(void *) val); +} + +static int CI_UValChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(ci->gw,CID_UValue)); + unichar_t *end; + int val; + + if (( *ret=='U' || *ret=='u' ) && ret[1]=='+' ) + ret += 2; + val = u_strtol(ret,&end,16); + if ( *end=='\0' ) + CI_SetNameList(ci,val); + } +return( true ); +} + +static int CI_CharChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(ci->gw,CID_UChar)); + int val = *ret; + unichar_t *temp, ubuf[1]; char buf[10]; + + if ( ret[1]!='\0' ) { + temp = uc_copy("Only a single character allowed"); + GWidgetPostNotice(temp,temp); + free(temp); + ubuf[0] = '\0'; + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UChar),ubuf); +return( true ); + } else if ( ret[0]=='\0' ) +return( true ); + + SetNameFromUnicode(ci->gw,CID_UName,val); + CI_SetNameList(ci,val); + + sprintf(buf,"U+%04x", val); + temp = uc_copy(buf); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UValue),temp); + free(temp); + } +return( true ); +} + +static int CI_CommentChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + /* Let's give things with comments a white color. This may not be a good idea */ + if ( ci->first && ci->sc->color==COLOR_DEFAULT && + 0==GGadgetGetFirstListSelectedItem(GWidgetGetControl(ci->gw,CID_Color)) ) + GGadgetSelectOneListItem(GWidgetGetControl(ci->gw,CID_Color),1); + ci->first = false; + } +return( true ); +} + +static void CIFillup(CharInfo *ci) { + SplineChar *sc = ci->sc; + SplineFont *sf = sc->parent; + unichar_t *temp; + char buffer[400]; + unichar_t ubuf[200]; + const unichar_t *bits; + int i,j; + GTextInfo **arrays[pst_max], **ti; + int cnts[pst_max]; + PST *pst; + + u_sprintf(ubuf,GStringGetResource(_STR_CharInfoFor,NULL),sc->name); + GDrawSetWindowTitles(ci->gw, ubuf, GStringGetResource(_STR_Charinfo,NULL)); + + if ( ci->oldsc!=NULL && ci->oldsc->charinfo==ci ) + ci->oldsc->charinfo = NULL; + sc->charinfo = ci; + ci->oldsc = sc; + + CI_CanPaste(ci); + + GGadgetSetEnabled(GWidgetGetControl(ci->gw,-1), sc->enc>0 && + (sf->chars[sc->enc-1]==NULL || sf->chars[sc->enc-1]->charinfo==NULL)); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,1), sc->enccharcnt-1 && + (sf->chars[sc->enc+1]==NULL || sf->chars[sc->enc+1]->charinfo==NULL)); + + temp = uc_copy(sc->name); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UName),temp); + free(temp); + CI_SetNameList(ci,sc->unicodeenc); + + sprintf(buffer,"U+%04x", sc->unicodeenc); + temp = uc_copy(sc->unicodeenc==-1?"-1":buffer); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UValue),temp); + free(temp); + + ubuf[0] = sc->unicodeenc; + if ( sc->unicodeenc==-1 ) + ubuf[0] = '\0'; + ubuf[1] = '\0'; + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_UChar),ubuf); + + memset(cnts,0,sizeof(cnts)); + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) + ++cnts[pst->type]; + for ( i=pst_null+1; ipossub; pst!=NULL; pst=pst->next ) { + j = cnts[pst->type]++; + arrays[pst->type][j] = gcalloc(1,sizeof(GTextInfo)); + if ( pst->type==pst_position || pst->type==pst_pair ) { + if ( pst->type==pst_position ) { + sprintf(buffer," %3d dx=%d dy=%d dx_adv=%d dy_adv=%d", + pst->script_lang_index, + pst->u.pos.xoff, pst->u.pos.yoff, + pst->u.pos.h_adv_off, pst->u.pos.v_adv_off ); + arrays[pst->type][j]->text = uc_copy(buffer); + } else if ( pst->type==pst_pair ) { + sprintf(buffer," %3d %s dx=%d dy=%d dx_adv=%d dy_adv=%d | dx=%d dy=%d dx_adv=%d dy_adv=%d", + pst->script_lang_index, + pst->u.pair.paired, + pst->u.pair.vr[0].xoff, pst->u.pair.vr[0].yoff, + pst->u.pair.vr[0].h_adv_off, pst->u.pair.vr[0].v_adv_off, + pst->u.pair.vr[1].xoff, pst->u.pair.vr[1].yoff, + pst->u.pair.vr[1].h_adv_off, pst->u.pair.vr[1].v_adv_off ); + arrays[pst->type][j]->text = uc_copy(buffer); + } + arrays[pst->type][j]->text[0] = pst->tag>>24; + arrays[pst->type][j]->text[1] = (pst->tag>>16)&0xff; + arrays[pst->type][j]->text[2] = (pst->tag>>8)&0xff; + arrays[pst->type][j]->text[3] = (pst->tag)&0xff; + arrays[pst->type][j]->text[4] = ' '; + arrays[pst->type][j]->text[5] = pst->flags&pst_r2l?'r':' '; + arrays[pst->type][j]->text[6] = pst->flags&pst_ignorebaseglyphs?'b':' '; + arrays[pst->type][j]->text[7] = pst->flags&pst_ignoreligatures?'l':' '; + arrays[pst->type][j]->text[8] = pst->flags&pst_ignorecombiningmarks?'m':' '; + arrays[pst->type][j]->text[9] = ' '; + } else { + unichar_t *temp = uc_copy(pst->u.subs.variant); + arrays[pst->type][j]->text = ClassName(temp,pst->tag,pst->flags, + pst->script_lang_index,-1,-1,pst->macfeature); + free(temp); + } + arrays[pst->type][j]->fg = arrays[pst->type][j]->bg = COLOR_DEFAULT; + } + for ( i=pst_null+1; igw,CID_List+(i-1)*100), + arrays[i],false); + } + + bits = SFGetAlternate(sc->parent,sc->unicodeenc,sc,true); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_ComponentMsg),GStringGetResource( + bits==NULL ? _STR_NoComponents : + hascomposing(sc->parent,sc->unicodeenc,sc) ? _STR_AccentedComponents : + _STR_CompositComponents, NULL)); + if ( bits==NULL ) { + ubuf[0] = '\0'; + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_Components),ubuf); + } else { + unichar_t *temp = galloc(11*u_strlen(bits)*sizeof(unichar_t)); + unichar_t *upt=temp; + while ( *bits!='\0' ) { + sprintf(buffer, "U+%04x ", *bits ); + uc_strcpy(upt,buffer); + upt += u_strlen(upt); + ++bits; + } + upt[-1] = '\0'; + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_Components),temp); + free(temp); + } + + GGadgetSelectOneListItem(GWidgetGetControl(ci->gw,CID_Color),0); + + ubuf[0] = '\0'; + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_Comment), + sc->comment?sc->comment:ubuf); + GGadgetSelectOneListItem(GWidgetGetControl(ci->gw,CID_GClass),sc->glyph_class); + for ( i=0; std_colors[i].image!=NULL; ++i ) { + if ( std_colors[i].userdata == (void *) sc->color ) + GGadgetSelectOneListItem(GWidgetGetControl(ci->gw,CID_Color),i); + } + ci->first = sc->comment==NULL; + + ti = galloc((sc->countermask_cnt+1)*sizeof(GTextInfo *)); + ti[sc->countermask_cnt] = gcalloc(1,sizeof(GTextInfo)); + for ( i=0; icountermask_cnt; ++i ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + ti[i]->text = CounterMaskLine(sc,&sc->countermasks[i]); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + ti[i]->userdata = chunkalloc(sizeof(HintMask)); + memcpy(ti[i]->userdata,sc->countermasks[i],sizeof(HintMask)); + } + GGadgetSetList(GWidgetGetControl(ci->gw,CID_List+600),ti,false); +} + +static int CI_NextPrev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + int enc = ci->sc->enc + GGadgetGetCid(g); /* cid is 1 for next, -1 for prev */ + SplineChar *new; + + if ( enc<0 || enc>=ci->sc->parent->charcnt ) { + GGadgetSetEnabled(g,false); +return( true ); + } + if ( !_CI_OK(ci)) +return( true ); + new = SFMakeChar(ci->sc->parent,enc); + if ( new->charinfo!=NULL && new->charinfo!=ci ) { + GGadgetSetEnabled(g,false); +return( true ); + } + ci->sc = new; + CIFillup(ci); + } +return( true ); +} + +static void CI_DoCancel(CharInfo *ci) { + int32 i,len; + GTextInfo **ti = GGadgetGetList(GWidgetGetControl(ci->gw,CID_List+600),&len); + + for ( i=0; iuserdata,sizeof(HintMask)); + CI_Finish(ci); +} + +static int CI_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CharInfo *ci = GDrawGetUserData(GGadgetGetWindow(g)); + CI_DoCancel(ci); + } +return( true ); +} + +static int ci_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + CharInfo *ci = GDrawGetUserData(gw); + CI_DoCancel(ci); + } else if ( event->type==et_char ) { + CharInfo *ci = GDrawGetUserData(gw); + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("charinfo.html"); +return( true ); + } else if ( event->u.chr.keysym=='c' && (event->u.chr.state&ksm_control)) { + CI_DoCopy(ci); +return( true ); + } else if ( event->u.chr.keysym=='v' && (event->u.chr.state&ksm_control)) { + CI_DoPaste(ci,NULL,pst_null); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + CI_DoCancel(ci); + else + MenuExit(NULL,NULL,NULL); + } +return( false ); + } else if ( event->type == et_drop ) { + CharInfo *ci = GDrawGetUserData(gw); + CI_Drop(ci,event); + } else if ( event->type == et_destroy ) { + CharInfo *ci = GDrawGetUserData(gw); + ci->sc->charinfo = NULL; + free(ci); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +void SCCharInfo(SplineChar *sc) { + CharInfo *ci; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData ugcd[12], cgcd[6], psgcd[7][7], cogcd[3], mgcd[9]; + GTextInfo ulabel[12], clabel[6], pslabel[7][6], colabel[3], mlabel[9]; + int i; + GTabInfo aspects[12]; + static GBox smallbox = { bt_raised, bs_rect, 2, 1, 0, 0, 0,0,0,0, COLOR_DEFAULT,COLOR_DEFAULT }; + static int boxset=0; + FontRequest rq; + GFont *font; + + if ( sc->charinfo!=NULL ) { + GDrawSetVisible(sc->charinfo->gw,true); + GDrawRaise(sc->charinfo->gw); +return; + } + + ci = gcalloc(1,sizeof(CharInfo)); + ci->sc = sc; + ci->done = false; + + if ( !boxset ) { + extern GBox _ggadget_Default_Box; + extern void GGadgetInit(void); + GGadgetInit(); + smallbox = _ggadget_Default_Box; + smallbox.padding = 1; + boxset = 1; + } + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<gw = GDrawCreateTopWindow(NULL,&pos,ci_e_h,ci,&wattrs); + + memset(&ugcd,0,sizeof(ugcd)); + memset(&ulabel,0,sizeof(ulabel)); + + ulabel[0].text = (unichar_t *) _STR_UnicodeName; + ulabel[0].text_in_resource = true; + ugcd[0].gd.label = &ulabel[0]; + ugcd[0].gd.pos.x = 5; ugcd[0].gd.pos.y = 5+4; + ugcd[0].gd.flags = gg_enabled|gg_visible; + ugcd[0].gd.mnemonic = 'N'; + ugcd[0].creator = GLabelCreate; + + ugcd[1].gd.pos.x = 85; ugcd[1].gd.pos.y = 5; + ugcd[1].gd.flags = gg_enabled|gg_visible; + ugcd[1].gd.mnemonic = 'N'; + ugcd[1].gd.cid = CID_UName; + ugcd[1].creator = GListFieldCreate; + ugcd[1].data = (void *) (-2); + + ulabel[2].text = (unichar_t *) _STR_UnicodeValue; + ulabel[2].text_in_resource = true; + ugcd[2].gd.label = &ulabel[2]; + ugcd[2].gd.pos.x = 5; ugcd[2].gd.pos.y = 31+4; + ugcd[2].gd.flags = gg_enabled|gg_visible; + ugcd[2].gd.mnemonic = 'V'; + ugcd[2].creator = GLabelCreate; + + ugcd[3].gd.pos.x = 85; ugcd[3].gd.pos.y = 31; + ugcd[3].gd.flags = gg_enabled|gg_visible; + ugcd[3].gd.mnemonic = 'V'; + ugcd[3].gd.cid = CID_UValue; + ugcd[3].gd.handle_controlevent = CI_UValChanged; + ugcd[3].creator = GTextFieldCreate; + + ulabel[4].text = (unichar_t *) _STR_UnicodeChar; + ulabel[4].text_in_resource = true; + ugcd[4].gd.label = &ulabel[4]; + ugcd[4].gd.pos.x = 5; ugcd[4].gd.pos.y = 57+4; + ugcd[4].gd.flags = gg_enabled|gg_visible; + ugcd[4].gd.mnemonic = 'h'; + ugcd[4].creator = GLabelCreate; + + ugcd[5].gd.pos.x = 85; ugcd[5].gd.pos.y = 57; + ugcd[5].gd.flags = gg_enabled|gg_visible|gg_text_xim; + ugcd[5].gd.mnemonic = 'h'; + ugcd[5].gd.cid = CID_UChar; + ugcd[5].gd.handle_controlevent = CI_CharChanged; + ugcd[5].creator = GTextFieldCreate; + + ugcd[6].gd.pos.x = 5; ugcd[6].gd.pos.y = 83+4; + ugcd[6].gd.flags = gg_visible | gg_enabled; + ulabel[6].text = (unichar_t *) _STR_GlyphClass; + ulabel[6].text_in_resource = true; + ugcd[6].gd.label = &ulabel[6]; + ugcd[6].creator = GLabelCreate; + + ugcd[7].gd.pos.x = 85; ugcd[7].gd.pos.y = 83; + ugcd[7].gd.flags = gg_visible | gg_enabled; + ulabel[7].text = (unichar_t *) _STR_SetFromValue; + ulabel[7].text_in_resource = true; + ugcd[7].gd.cid = CID_GClass; + ugcd[7].gd.u.list = glyphclasses; + ugcd[7].gd.label = &ulabel[7]; + ugcd[7].creator = GListButtonCreate; + + ugcd[8].gd.pos.x = 12; ugcd[8].gd.pos.y = 117; + ugcd[8].gd.flags = gg_visible | gg_enabled; + ulabel[8].text = (unichar_t *) _STR_SetFromName; + ulabel[8].text_in_resource = true; + ugcd[8].gd.mnemonic = 'a'; + ugcd[8].gd.label = &ulabel[8]; + ugcd[8].gd.handle_controlevent = CI_SName; + ugcd[8].creator = GButtonCreate; + + ugcd[9].gd.pos.x = 107; ugcd[9].gd.pos.y = 117; + ugcd[9].gd.flags = gg_visible | gg_enabled; + ulabel[9].text = (unichar_t *) _STR_SetFromValue; + ulabel[9].text_in_resource = true; + ugcd[9].gd.mnemonic = 'l'; + ugcd[9].gd.label = &ulabel[9]; + ugcd[9].gd.handle_controlevent = CI_SValue; + ugcd[9].creator = GButtonCreate; + + memset(&cgcd,0,sizeof(cgcd)); + memset(&clabel,0,sizeof(clabel)); + + clabel[0].text = (unichar_t *) _STR_Comment; + clabel[0].text_in_resource = true; + cgcd[0].gd.label = &clabel[0]; + cgcd[0].gd.pos.x = 5; cgcd[0].gd.pos.y = 5; + cgcd[0].gd.flags = gg_enabled|gg_visible; + cgcd[0].creator = GLabelCreate; + + cgcd[1].gd.pos.x = 5; cgcd[1].gd.pos.y = cgcd[0].gd.pos.y+13; + cgcd[1].gd.pos.width = CI_Width-20; + cgcd[1].gd.pos.height = 7*12+6; + cgcd[1].gd.flags = gg_enabled|gg_visible|gg_textarea_wrap|gg_text_xim; + cgcd[1].gd.cid = CID_Comment; + cgcd[1].gd.handle_controlevent = CI_CommentChanged; + cgcd[1].creator = GTextAreaCreate; + + clabel[2].text = (unichar_t *) _STR_Color; + clabel[2].text_in_resource = true; + cgcd[2].gd.label = &clabel[2]; + cgcd[2].gd.pos.x = 5; cgcd[2].gd.pos.y = cgcd[1].gd.pos.y+cgcd[1].gd.pos.height+5+6; + cgcd[2].gd.flags = gg_enabled|gg_visible; + cgcd[2].creator = GLabelCreate; + + cgcd[3].gd.pos.x = cgcd[3].gd.pos.x; cgcd[3].gd.pos.y = cgcd[2].gd.pos.y-6; + cgcd[3].gd.pos.width = cgcd[3].gd.pos.width; + cgcd[3].gd.flags = gg_enabled|gg_visible; + cgcd[3].gd.cid = CID_Color; + cgcd[3].gd.u.list = std_colors; + cgcd[3].creator = GListButtonCreate; + + memset(&psgcd,0,sizeof(psgcd)); + memset(&pslabel,0,sizeof(pslabel)); + + for ( i=0; i<7; ++i ) { + psgcd[i][0].gd.pos.x = 5; psgcd[i][0].gd.pos.y = 5; + psgcd[i][0].gd.pos.width = CI_Width-28; psgcd[i][0].gd.pos.height = 7*12+10; + psgcd[i][0].gd.flags = gg_visible | gg_enabled | gg_list_alphabetic | gg_list_multiplesel; + psgcd[i][0].gd.cid = CID_List+i*100; + psgcd[i][0].gd.handle_controlevent = CI_SelChanged; + psgcd[i][0].gd.box = &smallbox; + psgcd[i][0].creator = GListCreate; + + psgcd[i][1].gd.pos.x = 10; psgcd[i][1].gd.pos.y = psgcd[i][0].gd.pos.y+psgcd[i][0].gd.pos.height+4; + psgcd[i][1].gd.pos.width = -1; + psgcd[i][1].gd.flags = gg_visible | gg_enabled; + pslabel[i][1].text = (unichar_t *) _STR_NewDDD; + pslabel[i][1].text_in_resource = true; + psgcd[i][1].gd.label = &pslabel[i][1]; + psgcd[i][1].gd.cid = CID_New+i*100; + psgcd[i][1].gd.handle_controlevent = CI_New; + psgcd[i][1].gd.box = &smallbox; + psgcd[i][1].creator = GButtonCreate; + + psgcd[i][2].gd.pos.x = 20+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); psgcd[i][2].gd.pos.y = psgcd[i][1].gd.pos.y; + psgcd[i][2].gd.pos.width = -1; + psgcd[i][2].gd.flags = gg_visible; + pslabel[i][2].text = (unichar_t *) _STR_Delete; + pslabel[i][2].text_in_resource = true; + psgcd[i][2].gd.label = &pslabel[i][2]; + psgcd[i][2].gd.cid = CID_Delete+i*100; + psgcd[i][2].gd.handle_controlevent = CI_Delete; + psgcd[i][2].gd.box = &smallbox; + psgcd[i][2].creator = GButtonCreate; + + psgcd[i][3].gd.pos.x = -10; psgcd[i][3].gd.pos.y = psgcd[i][1].gd.pos.y; + psgcd[i][3].gd.pos.width = -1; + psgcd[i][3].gd.flags = gg_visible; + pslabel[i][3].text = (unichar_t *) _STR_EditDDD; + pslabel[i][3].text_in_resource = true; + psgcd[i][3].gd.label = &pslabel[i][3]; + psgcd[i][3].gd.cid = CID_Edit+i*100; + psgcd[i][3].gd.handle_controlevent = CI_Edit; + psgcd[i][3].gd.box = &smallbox; + psgcd[i][3].creator = GButtonCreate; + + psgcd[i][4].gd.pos.x = 20; psgcd[i][4].gd.pos.y = psgcd[i][3].gd.pos.y+22; + psgcd[i][4].gd.pos.width = -1; + psgcd[i][4].gd.flags = gg_visible; + pslabel[i][4].text = (unichar_t *) _STR_Copy; + pslabel[i][4].text_in_resource = true; + psgcd[i][4].gd.label = &pslabel[i][4]; + psgcd[i][4].gd.cid = CID_Copy+i*100; + psgcd[i][4].gd.handle_controlevent = CI_Copy; + psgcd[i][4].gd.box = &smallbox; + psgcd[i][4].creator = GButtonCreate; + + psgcd[i][5].gd.pos.x = -20; psgcd[i][5].gd.pos.y = psgcd[i][4].gd.pos.y; + psgcd[i][5].gd.pos.width = -1; + psgcd[i][5].gd.flags = gg_visible; + pslabel[i][5].text = (unichar_t *) _STR_Paste; + pslabel[i][5].text_in_resource = true; + psgcd[i][5].gd.label = &pslabel[i][5]; + psgcd[i][5].gd.cid = CID_Paste+i*100; + psgcd[i][5].gd.handle_controlevent = CI_Paste; + psgcd[i][5].gd.box = &smallbox; + psgcd[i][5].creator = GButtonCreate; + } + psgcd[6][4].gd.flags = psgcd[6][5].gd.flags = 0; /* No copy, paste for hint masks */ + + memset(&cogcd,0,sizeof(cogcd)); + memset(&colabel,0,sizeof(colabel)); + + colabel[0].text = (unichar_t *) _STR_AccentedComponents; + colabel[0].text_in_resource = true; + cogcd[0].gd.label = &colabel[0]; + cogcd[0].gd.pos.x = 5; cogcd[0].gd.pos.y = 5; + cogcd[0].gd.flags = gg_enabled|gg_visible; + cogcd[0].gd.cid = CID_ComponentMsg; + /*cogcd[0].gd.popup_msg = GStringGetResource(_STR_Ligpop,NULL);*/ + cogcd[0].creator = GLabelCreate; + + cogcd[1].gd.pos.x = 5; cogcd[1].gd.pos.y = cogcd[0].gd.pos.y+12; + cogcd[1].gd.pos.width = CI_Width-20; + cogcd[1].gd.flags = gg_enabled|gg_visible; + cogcd[1].gd.cid = CID_Components; + /*cogcd[1].gd.popup_msg = GStringGetResource(_STR_Ligpop,NULL);*/ + cogcd[1].creator = GLabelCreate; + + memset(&mgcd,0,sizeof(mgcd)); + memset(&mlabel,0,sizeof(mlabel)); + memset(&aspects,'\0',sizeof(aspects)); + + i = 0; + aspects[i].text = (unichar_t *) _STR_UnicodeL; + aspects[i].text_in_resource = true; + aspects[i].selected = true; + aspects[i++].gcd = ugcd; + + aspects[i].text = (unichar_t *) _STR_Comment; + aspects[i].text_in_resource = true; + aspects[i++].gcd = cgcd; + + aspects[i].text = (unichar_t *) _STR_AltPos; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd[0]; + + aspects[i].text = (unichar_t *) _STR_Pair; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd[1]; + + aspects[i].text = (unichar_t *) _STR_Subs; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd[2]; + + aspects[i].text = (unichar_t *) _STR_AltSubs; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd[3]; + + aspects[i].text = (unichar_t *) _STR_MultSubs; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd[4]; + + aspects[i].text = (unichar_t *) _STR_LigatureL; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd[5]; + + aspects[i].text = (unichar_t *) _STR_Components; + aspects[i].text_in_resource = true; + aspects[i++].gcd = cogcd; + + aspects[i].text = (unichar_t *) _STR_Counters; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd[6]; + + mgcd[0].gd.pos.x = 4; mgcd[0].gd.pos.y = 6; + mgcd[0].gd.pos.width = CI_Width-10; + mgcd[0].gd.pos.height = CI_Height-70; + mgcd[0].gd.u.tabs = aspects; + mgcd[0].gd.flags = gg_visible | gg_enabled; + mgcd[0].gd.cid = CID_Tabs; + mgcd[0].creator = GTabSetCreate; + + mgcd[1].gd.pos.x = 40; mgcd[1].gd.pos.y = mgcd[0].gd.pos.y+mgcd[0].gd.pos.height+3; + mgcd[1].gd.pos.width = -1; mgcd[1].gd.pos.height = 0; + mgcd[1].gd.flags = gg_visible | gg_enabled ; + mlabel[1].text = (unichar_t *) _STR_PrevArrow; + mlabel[1].text_in_resource = true; + mgcd[1].gd.mnemonic = 'P'; + mgcd[1].gd.label = &mlabel[1]; + mgcd[1].gd.handle_controlevent = CI_NextPrev; + mgcd[1].gd.cid = -1; + mgcd[1].creator = GButtonCreate; + + mgcd[2].gd.pos.x = -40; mgcd[2].gd.pos.y = mgcd[1].gd.pos.y; + mgcd[2].gd.pos.width = -1; mgcd[2].gd.pos.height = 0; + mgcd[2].gd.flags = gg_visible | gg_enabled ; + mlabel[2].text = (unichar_t *) _STR_NextArrow; + mlabel[2].text_in_resource = true; + mgcd[2].gd.label = &mlabel[2]; + mgcd[2].gd.mnemonic = 'N'; + mgcd[2].gd.handle_controlevent = CI_NextPrev; + mgcd[2].gd.cid = 1; + mgcd[2].creator = GButtonCreate; + + mgcd[3].gd.pos.x = 25-3; mgcd[3].gd.pos.y = CI_Height-31-3; + mgcd[3].gd.pos.width = -1; mgcd[3].gd.pos.height = 0; + mgcd[3].gd.flags = gg_visible | gg_enabled | gg_but_default; + mlabel[3].text = (unichar_t *) _STR_OK; + mlabel[3].text_in_resource = true; + mgcd[3].gd.mnemonic = 'O'; + mgcd[3].gd.label = &mlabel[3]; + mgcd[3].gd.handle_controlevent = CI_OK; + mgcd[3].creator = GButtonCreate; + + mgcd[4].gd.pos.x = -25; mgcd[4].gd.pos.y = mgcd[3].gd.pos.y+3; + mgcd[4].gd.pos.width = -1; mgcd[4].gd.pos.height = 0; + mgcd[4].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + mlabel[4].text = (unichar_t *) _STR_Done; + mlabel[4].text_in_resource = true; + mgcd[4].gd.label = &mlabel[4]; + mgcd[4].gd.mnemonic = 'C'; + mgcd[4].gd.handle_controlevent = CI_Cancel; + mgcd[4].gd.cid = CID_Cancel; + mgcd[4].creator = GButtonCreate; + + GGadgetsCreate(ci->gw,mgcd); + memset(&rq,0,sizeof(rq)); + rq.family_name = monospace; + rq.point_size = 12; + rq.weight = 400; + font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(ci->gw),&rq); + for ( i=0; i<5; ++i ) + GGadgetSetFont(psgcd[i][0].ret,font); + + CIFillup(ci); + + GWidgetHidePalettes(); + GDrawSetVisible(ci->gw,true); +} + +void CharInfoDestroy(CharInfo *ci) { + GDrawDestroyWindow(ci->gw); +} + +struct sel_dlg { + int done; + int ok; + FontView *fv; +}; + +GTextInfo pst_names[] = { + { (unichar_t *) _STR_LigatureL, NULL, 0, 0, (void *) pst_ligature, NULL, false, false, false, false, true, false, false, true }, + { (unichar_t *) _STR_SimpSubstitution, NULL, 0, 0, (void *) pst_substitution, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AltSubstitutions, NULL, 0, 0, (void *) pst_alternate, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_MultSubstitution, NULL, 0, 0, (void *) pst_multiple, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_SimpPos, NULL, 0, 0, (void *) pst_position, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_PairPos, NULL, 0, 0, (void *) pst_pair, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_Kerning, NULL, 0, 0, (void *) pst_kerning, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_VKerning, NULL, 0, 0, (void *) pst_vkerning, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_AnchorClass, NULL, 0, 0, (void *) pst_anchors, NULL, false, false, false, false, false, false, false, true }, + { (unichar_t *) _STR_LigCaret, NULL, 0, 0, (void *) pst_lcaret, NULL, false, false, false, false, false, false, false, true }, + { NULL } +}; + +struct match_data { + SplineFont *sf; + enum possub_type type; + int tagcnt; + uint32 tags[10]; + char *contains; + AnchorClass *ac; + SplineChar *kernwith; +}; + +static int SCMatchAnchor(SplineChar *sc,struct match_data *md) { + AnchorPoint *ap; + + if ( sc==NULL ) +return( false ); + + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) { + if ( ap->anchor==md->ac ) +return( true ); + } +return( false ); +} + +static int SCMatchPST(SplineChar *sc,struct match_data *md) { + PST *pst; + int j; + + if ( sc==NULL ) +return( false ); + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == md->type ) { + if ( md->tagcnt!=0 ) { + for ( j=md->tagcnt-1; j>=0; --j ) + if ( pst->tag==md->tags[j] ) + break; + if ( j==-1 ) + continue; + } + if ( md->type==pst_position || md->contains==NULL || + PSTContains(pst->u.lig.components,md->contains)) /* pair names will match here too */ +return( true ); + } + } +return( false ); +} + +static int SCMatchLCaret(SplineChar *sc,struct match_data *md) { + PST *pst; + int j; + + if ( sc==NULL ) +return( false ); + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_lcaret ) { + for ( j = pst->u.lcaret.cnt-1; j>=0; --j ) { + if ( pst->u.lcaret.carets[j]!=0 ) +return( true ); + } +return( false ); + } + } +return( false ); +} + +static int _SCMatchKern(SplineChar *sc,struct match_data *md,int isv) { + SplineFont *sf = md->sf; + int i; + KernPair *kp, *head; + KernClass *kc; + + if ( sc==NULL ) +return( false ); + head = isv ? sc->vkerns : sc->kerns; + + if ( md->kernwith==NULL ) { + /* Is the current character involved in ANY kerning */ + if ( head!=NULL ) +return( true ); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kp = isv ? sf->chars[i]->vkerns : sf->chars[i]->kerns; kp!=NULL; kp = kp->next ) { + if ( kp->sc == sc ) +return( true ); + } + } + for ( kc = isv ? sf->vkerns : sf->kerns; kc!=NULL; kc=kc->next ) { + for ( i=1; ifirst_cnt; ++i ) + if ( PSTContains(kc->firsts[i],sc->name) ) +return( true ); + for ( i=1; isecond_cnt; ++i ) + if ( PSTContains(kc->seconds[i],sc->name) ) +return( true ); + } + } else { + for ( kp=head; kp!=NULL; kp=kp->next ) { + if ( kp->sc==md->kernwith ) +return( true ); + } + for ( kp=isv ? md->kernwith->vkerns : md->kernwith->kerns ; kp!=NULL; kp=kp->next ) { + if ( kp->sc==sc ) +return( true ); + } + for ( kc = isv ? sf->vkerns : sf->kerns; kc!=NULL; kc=kc->next ) { + if ( KernClassContains(kc,sc->name,md->kernwith->name,false)!=0 ) +return( true ); + } + } +return( false ); +} + +static int SCMatchKern(SplineChar *sc,struct match_data *md) { +return( _SCMatchKern(sc,md,false)); +} + +static int SCMatchVKern(SplineChar *sc,struct match_data *md) { +return( _SCMatchKern(sc,md,true)); +} + +static GTextInfo **LListFromList(GTextInfo *array) { + int cnt; + GTextInfo **ti; + + for ( cnt=0; array[cnt].text!=NULL; ++cnt); + ti = galloc((cnt+1)*sizeof(GTextInfo *)); + for ( cnt=0; array[cnt].text!=NULL; ++cnt) { + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + *(ti[cnt]) = array[cnt]; + if ( ti[cnt]->text_in_resource ) { + ti[cnt]->text_in_resource = false; + ti[cnt]->text = u_copy(GStringGetResource((int) ti[cnt]->text,NULL)); + } + ti[cnt]->fg = ti[cnt]->bg = COLOR_DEFAULT; + } + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); +return( ti ); +} + +int FVParseSelectByPST(FontView *fv,int type, + const unichar_t *tags,const unichar_t *contents, + int search_type) { + struct match_data md; + const unichar_t *ret; + uint8 u[4]; + int i, j; + int (*tester)(SplineChar *sc,struct match_data *md); + SplineFont *sf; + AnchorClass *ac; + int first; + + memset(&md,0,sizeof(md)); + md.sf = fv->sf; + md.type = type; + if ( type!=pst_anchors || type!=pst_position || type!=pst_lcaret ) { + md.contains = cu_copy( contents ); + if ( strcmp( md.contains,"" )==0 || strcmp( md.contains,"*" )==0 ) { + free( md.contains ); + md.contains = NULL; + } + if (( type==pst_kerning || type==pst_vkerning ) && + md.contains!=NULL ) { + md.kernwith = SFGetCharDup(md.sf,-1,md.contains); + if ( md.kernwith==NULL ) + GWidgetErrorR(_STR_SelectByATT,_STR_Couldntfindchar,md.contains); + free(md.contains); + md.contains = NULL; + if ( md.kernwith==NULL ) +return( false ); + } + } + if ( type==pst_anchors ) { + for ( ac = md.sf->anchor; ac!=NULL; ac=ac->next ) + if ( u_strcmp(tags,ac->name)==0 ) + break; + md.ac = ac; + if ( ac==NULL ) { + free( md.contains ); + GWidgetErrorR(_STR_SelectByATT,_STR_UnknownAnchorClass,ret); +return( false ); + } + } else if ( type!=pst_kerning && type!=pst_vkerning && type!=pst_lcaret ) { + if ( uc_strcmp( tags,"" )==0 || uc_strcmp( tags,"*" )==0 ) + md.tagcnt = 0; + else { + for ( i=0; isf; + first = -1; + if ( search_type==1 ) { /* Select results */ + for ( i=0; icharcnt; ++i ) + if ( (fv->selected[i] = tester(sf->chars[i],&md)) && first==-1 ) + first = i; + } else if ( search_type==2) {/* merge results */ + for ( i=0; icharcnt; ++i ) if ( !fv->selected[i] ) + if ( (fv->selected[i] = tester(sf->chars[i],&md)) && first==-1 ) + first = i; + } else { /* restrict selection */ + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] ) + if ( (fv->selected[i] = tester(sf->chars[i],&md)) && first==-1 ) + first = i; + } + if ( first!=-1 ) + FVScrollToChar(fv,first); + else if (screen_display!=NULL ) + GWidgetPostNoticeR(_STR_SelectByATT,_STR_NoMatch); + if ( screen_display!=NULL ) + GDrawRequestExpose(fv->v,NULL,false); +return( true ); +} + +static int SelectStuff(struct sel_dlg *sld,GWindow gw) { + int type = (int) (GGadgetGetListItemSelected(GWidgetGetControl(gw,CID_PST))->userdata); + int search_type = GGadgetIsChecked(GWidgetGetControl(gw,CID_SelectResults)) ? 1 : + GGadgetIsChecked(GWidgetGetControl(gw,CID_MergeResults)) ? 2 : + 3; +return( FVParseSelectByPST(sld->fv, type, + _GGadgetGetTitle(GWidgetGetControl(gw,CID_Tag)), + _GGadgetGetTitle(GWidgetGetControl(gw,CID_Contents)), + search_type)); +} + +static int selpst_e_h(GWindow gw, GEvent *event) { + struct sel_dlg *sld = GDrawGetUserData(gw); + static unichar_t nullstr[] = { 0 }; + static GTextInfo *tags[] = { NULL, + simplepos_tags, + pairpos_tags, + simplesubs_tags, + alternatesubs_tags, + multiplesubs_tags, + ligature_tags, + NULL, + NULL, + NULL }; + + if ( event->type==et_close ) { + sld->done = true; + sld->ok = false; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("selectbyatt.html"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + sld->ok = GGadgetGetCid(event->u.control.g); + if ( !sld->ok || SelectStuff(sld,gw)) + sld->done = true; + } else if ( event->type==et_controlevent && + event->u.control.subtype == et_listselected && + GGadgetGetCid(event->u.control.g)==CID_PST ) { + int type = (int) (GGadgetGetListItemSelected(event->u.control.g)->userdata); + if ( type==pst_anchors ) { + GGadgetSetList(GWidgetGetControl(gw,CID_Tag),AnchorClassesSimpleLList(sld->fv->sf),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Tag),true); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Contents),false); + } else if ( type==pst_kerning ) { + GGadgetSetTitle(GWidgetGetControl(gw,CID_Tag),nullstr); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Tag),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Contents),true); + } else if ( type==pst_lcaret ) { + GGadgetSetTitle(GWidgetGetControl(gw,CID_Tag),nullstr); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Tag),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Contents),false); + } else if ( type==pst_position ) { + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Contents),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Tag),true); + GGadgetSetList(GWidgetGetControl(gw,CID_Tag),LListFromList(simplepos_tags),false); + } else { + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Contents),true); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Tag),true); + GGadgetSetList(GWidgetGetControl(gw,CID_Tag),LListFromList(tags[type]),false); + } + } else if ( event->type==et_controlevent && event->u.control.subtype == et_textchanged && + event->u.control.u.tf_changed.from_pulldown!=-1 && + GGadgetGetCid(event->u.control.g)==CID_Tag ) { + int type = (int) (GGadgetGetListItemSelected(GWidgetGetControl(gw,CID_PST))->userdata); + if ( type!=pst_kerning && type!=pst_anchors && type!=pst_lcaret ) { + uint32 tag = (uint32) tags[type][event->u.control.u.tf_changed.from_pulldown].userdata; + unichar_t ubuf[8]; + /* If they select something from the pulldown, don't show the human */ + /* readable form, instead show the 4 character tag */ + ubuf[0] = tag>>24; + ubuf[1] = (tag>>16)&0xff; + ubuf[2] = (tag>>8)&0xff; + ubuf[3] = tag&0xff; + ubuf[4] = 0; + GGadgetSetTitle(event->u.control.g,ubuf); + } + } +return( true ); +} + +void FVSelectByPST(FontView *fv) { + static struct sel_dlg sld; + static GWindow gw; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[14]; + GTextInfo label[14]; + int i,j; + + memset(&sld,0,sizeof(sld)); + sld.fv = fv; + if ( gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<sf->anchor==NULL ) + for ( j=0; pst_names[j].text!=NULL; ++j ) + if ( pst_names[j].text == (void *) _STR_AnchorClass ) + pst_names[j].disabled = true; + + label[i].text = (unichar_t *) _STR_TagC; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+26; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i++].creator = GLabelCreate; + + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+14; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.u.list = ligature_tags; + gcd[i].gd.cid = CID_Tag; + gcd[i++].creator = GListFieldCreate; + + label[i].text = (unichar_t *) _STR_Containing; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+26; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i++].creator = GLabelCreate; + + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+14; + gcd[i].gd.pos.width = 140; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.cid = CID_Contents; + gcd[i++].creator = GTextFieldCreate; + + label[i].text = (unichar_t *) _STR_SelectResults; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+26; + gcd[i].gd.flags = gg_enabled|gg_visible|gg_cb_on; + gcd[i].gd.popup_msg = GStringGetResource(_STR_SelectResultsPopup,NULL); + gcd[i].gd.cid = CID_SelectResults; + gcd[i++].creator = GRadioCreate; + + label[i].text = (unichar_t *) _STR_MergeResults; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.popup_msg = GStringGetResource(_STR_MergeResultsPopup,NULL); + gcd[i].gd.cid = CID_MergeResults; + gcd[i++].creator = GRadioCreate; + + label[i].text = (unichar_t *) _STR_RestrictSelection; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.popup_msg = GStringGetResource(_STR_RestrictSelectionPopup,NULL); + gcd[i].gd.cid = CID_RestrictSelection; + gcd[i++].creator = GRadioCreate; + + gcd[i].gd.pos.x = 15-3; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+22; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.mnemonic = 'O'; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = true; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -15; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.mnemonic = 'C'; + gcd[i].gd.cid = false; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2; + gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[i++].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + } else { + if ( (int) (GGadgetGetListItemSelected(GWidgetGetControl(gw,CID_PST))->userdata) == + pst_anchors ) { + if ( fv->sf->anchor==NULL ) { + GGadgetSelectOneListItem(GWidgetGetControl(gw,CID_PST),0); + GGadgetSetList(GWidgetGetControl(gw,CID_Tag),LListFromList(ligature_tags),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_Contents),true); + } else + GGadgetSetList(GWidgetGetControl(gw,CID_Tag),AnchorClassesSimpleLList(fv->sf),false); + } + } + + GDrawSetVisible(gw,true); + while ( !sld.done ) + GDrawProcessOneEvent(NULL); + if ( sld.ok ) { + } + GDrawSetVisible(gw,false); +} diff --git a/fontforge/charview.c b/fontforge/charview.c new file mode 100644 index 00000000..3e506d3a --- /dev/null +++ b/fontforge/charview.c @@ -0,0 +1,7643 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "nomen.h" +#include +#include +#include +#include +#include +#include + +extern int _GScrollBar_Width; +extern struct lconv localeinfo; +extern char *coord_sep; +struct cvshows CVShows = { + 1, /* show foreground */ + 1, /* show background */ + 1, /* show grid plane */ + 1, /* show horizontal hints */ + 1, /* show vertical hints */ + 1, /* show diagonal hints */ + 1, /* show points */ + 0, /* show filled */ + 1, /* show rulers */ + 1, /* show points which are to be rounded to the ttf grid and aren't on hints */ + 1, /* show x minimum distances */ + 1, /* show y minimum distances */ + 1, /* show horizontal metrics */ + 0, /* show vertical metrics */ + 0, /* mark extrema */ + 1, /* show blue values */ + 1, /* show family blues too */ + 1 /* show anchor points */ +}; +static Color pointcol = 0xff0000; +static Color firstpointcol = 0x707000; +static Color selectedpointcol = 0xffff00; +static int selectedpointwidth = 2; +static Color extremepointcol = 0xc00080; +Color nextcpcol = 0x007090; +Color prevcpcol = 0xff00ff; +static Color selectedcpcol = 0xffffff; +static Color coordcol = 0x808080; +static Color widthcol = 0x000000; +static Color widthselcol = 0x00ff00; +static Color widthgridfitcol = 0x009800; +static Color lcaretcol = 0x909040; +static Color rastercol = 0xa0a0a0; +static Color rastergridcol = 0xb0b0ff; +static Color italiccoordcol = 0x909090; +static Color metricslabelcol = 0x00000; +static Color hintlabelcol = 0x00ffff; +static Color bluevalstipplecol = 0x8080ff; +static Color fambluestipplecol = 0xff7070; +static Color mdhintcol = 0xe04040; +static Color dhintcol = 0xd0a0a0; +static Color hhintcol = 0xa0d0a0; +static Color vhintcol = 0xc0c0ff; +static Color hflexhintcol = 0x00ff00; +static Color vflexhintcol = 0x00ff00; +static Color conflicthintcol = 0x00ffff; +static Color hhintactivecol = 0x00a000; +static Color vhintactivecol = 0x0000ff; +static Color anchorcol = 0x0040ff; +static Color templateoutlinecol = 0x009800; +static Color oldoutlinecol = 0x008000; +static Color transformorigincol = 0x000000; +static Color guideoutlinecol = 0x808080; +static Color gridfitoutlinecol = 0x009800; +static Color backoutlinecol = 0x009800; +static Color foreoutlinecol = 0x000000; +static Color backimagecol = 0x707070; +static Color fillcol = 0x707070; +static Color tracecol = 0x008000; + +static int cvcolsinited = false; + +static void CVColInit( void ) { + GResStruct cvcolors[] = { + { "PointColor", rt_color, &pointcol }, + { "FirstPointColor", rt_color, &firstpointcol }, + { "SelectedPointColor", rt_color, &selectedpointcol }, + { "SelectedPointWidth", rt_int, &selectedpointwidth }, + { "ExtremePointColor", rt_color, &extremepointcol }, + { "NextCPColor", rt_color, &nextcpcol }, + { "PrevCPColor", rt_color, &prevcpcol }, + { "SelectedCPColor", rt_color, &selectedcpcol }, + { "CoordinateLineColor", rt_color, &coordcol }, + { "WidthColor", rt_color, &widthcol }, + { "WidthSelColor", rt_color, &widthselcol }, + { "GridFitWidthColor", rt_color, &widthgridfitcol }, + { "LigatureCaretColor", rt_color, &lcaretcol }, + { "RasterColor", rt_color, &rastercol }, + { "RasterGridColor", rt_color, &rastergridcol }, + { "ItalicCoordColor", rt_color, &italiccoordcol }, + { "MetricsLabelColor", rt_color, &metricslabelcol }, + { "HintLabelColor", rt_color, &hintlabelcol }, + { "BlueValuesStippledColor", rt_color, &bluevalstipplecol }, + { "FamilyBlueStippledColor", rt_color, &fambluestipplecol }, + { "MDHintColor", rt_color, &mdhintcol }, + { "DHintColor", rt_color, &dhintcol }, + { "HHintColor", rt_color, &hhintcol }, + { "VHintColor", rt_color, &vhintcol }, + { "HFlexHintColor", rt_color, &hflexhintcol }, + { "VFlexHintColor", rt_color, &vflexhintcol }, + { "ConflictHintColor", rt_color, &conflicthintcol }, + { "HHintActiveColor", rt_color, &hhintactivecol }, + { "VHintActiveColor", rt_color, &vhintactivecol }, + { "AnchorColor", rt_color, &anchorcol }, + { "TemplateOutlineColor", rt_color, &templateoutlinecol }, + { "OldOutlineColor", rt_color, &oldoutlinecol }, + { "TransformOriginColor", rt_color, &transformorigincol }, + { "GuideOutlineColor", rt_color, &guideoutlinecol }, + { "GridFitOutlineColor", rt_color, &gridfitoutlinecol }, + { "BackgroundOutlineColor", rt_color, &backoutlinecol }, + { "ForegroundOutlineColor", rt_color, &foreoutlinecol }, + { "BackgroundImageColor", rt_color, &backimagecol }, + { "FillColor", rt_color, &fillcol }, + { "TraceColor", rt_color, &tracecol }, + { NULL } + }; + GResourceFind( cvcolors, "CharView."); +} + + +GDevEventMask input_em[] = { + /* Event masks for wacom devices */ + /* negative utility in opening Mouse1 */ + /* No point in distinguishing cursor from core mouse */ + { (1<p.rubberbanding ) +return; + r.x = cv->xoff + rint(cv->p.cx*cv->scale); + r.y = -cv->yoff + cv->height - rint(cv->p.cy*cv->scale); + r.width = rint( (cv->p.ex-cv->p.cx)*cv->scale ); + r.height = -rint( (cv->p.ey-cv->p.cy)*cv->scale ); + if ( r.width<0 ) { + r.x += r.width; + r.width = -r.width; + } + if ( r.height<0 ) { + r.y += r.height; + r.height = -r.height; + } + GDrawSetDashedLine(pixmap,2,2,0); + GDrawSetLineWidth(pixmap,0); + GDrawSetXORMode(pixmap); + GDrawSetXORBase(pixmap,GDrawGetDefaultBackground(NULL)); + GDrawDrawRect(pixmap,&r,0x000000); + GDrawSetCopyMode(pixmap); + GDrawSetDashedLine(pixmap,0,0,0); +} + +static void CVDrawRubberLine(GWindow pixmap, CharView *cv) { + int x,y, xend,yend; + if ( !cv->p.rubberlining ) +return; + x = cv->xoff + rint(cv->p.cx*cv->scale); + y = -cv->yoff + cv->height - rint(cv->p.cy*cv->scale); + xend = cv->xoff + rint(cv->info.x*cv->scale); + yend = -cv->yoff + cv->height - rint(cv->info.y*cv->scale); + GDrawSetXORMode(pixmap); + GDrawSetLineWidth(pixmap,0); + GDrawSetXORBase(pixmap,GDrawGetDefaultBackground(NULL)); + GDrawDrawLine(pixmap,x,y,xend,yend,0x000000); + GDrawSetCopyMode(pixmap); +} + +static void CVDrawBB(CharView *cv, GWindow pixmap, DBounds *bb) { + GRect r; + int off = cv->xoff+cv->height-cv->yoff; + + r.x = cv->xoff + rint(bb->minx*cv->scale); + r.y = -cv->yoff + cv->height - rint(bb->maxy*cv->scale); + r.width = rint((bb->maxx-bb->minx)*cv->scale); + r.height = rint((bb->maxy-bb->miny)*cv->scale); + GDrawSetDashedLine(pixmap,1,1,off); + GDrawDrawRect(pixmap,&r,0x000000); + GDrawSetDashedLine(pixmap,0,0,0); +} + +/* Sigh. I have to do my own clipping because at large magnifications */ +/* things can easily exceed 16 bits */ +static int CVSplineOutside(CharView *cv, Spline *spline) { + int x[4], y[4]; + + x[0] = cv->xoff + rint(spline->from->me.x*cv->scale); + y[0] = -cv->yoff + cv->height - rint(spline->from->me.y*cv->scale); + + x[1] = cv->xoff + rint(spline->to->me.x*cv->scale); + y[1] = -cv->yoff + cv->height - rint(spline->to->me.y*cv->scale); + + if ( spline->from->nonextcp && spline->to->noprevcp ) { + if ( (x[0]<0 && x[1]<0) || (x[0]>=cv->width && x[1]>=cv->width) || + (y[0]<0 && y[1]<0) || (y[0]>=cv->height && y[1]>=cv->height) ) +return( true ); + } else { + x[2] = cv->xoff + rint(spline->from->nextcp.x*cv->scale); + y[2] = -cv->yoff + cv->height - rint(spline->from->nextcp.y*cv->scale); + x[3] = cv->xoff + rint(spline->to->prevcp.x*cv->scale); + y[3] = -cv->yoff + cv->height - rint(spline->to->prevcp.y*cv->scale); + if ( (x[0]<0 && x[1]<0 && x[2]<0 && x[3]<0) || + (x[0]>=cv->width && x[1]>=cv->width && x[2]>=cv->width && x[3]>=cv->width ) || + (y[0]<0 && y[1]<0 && y[2]<0 && y[3]<0 ) || + (y[0]>=cv->height && y[1]>=cv->height && y[2]>=cv->height && y[3]>=cv->height) ) +return( true ); + } + +return( false ); +} + +static int CVLinesIntersectScreen(CharView *cv, LinearApprox *lap) { + LineList *l; + int any = false; + int x,y; + int bothout; + + for ( l=lap->lines; l!=NULL; l=l->next ) { + l->asend.x = l->asstart.x = cv->xoff + l->here.x; + l->asend.y = l->asstart.y = -cv->yoff + cv->height-l->here.y; + l->flags = 0; + if ( l->asend.x<0 || l->asend.x>=cv->width || l->asend.y<0 || l->asend.y>=cv->height ) { + l->flags = cvli_clipped; + any = true; + } + } + if ( !any ) { + for ( l=lap->lines; l!=NULL; l=l->next ) + l->flags = cvli_onscreen; + lap->any = true; +return( true ); + } + + any = false; + for ( l=lap->lines; l->next!=NULL; l=l->next ) { + if ( !(l->flags&cvli_clipped) && !(l->next->flags&cvli_clipped) ) + l->flags = cvli_onscreen; + else { + bothout = (l->flags&cvli_clipped) && (l->next->flags&cvli_clipped); + if (( l->asstart.x<0 && l->next->asend.x>0 ) || + ( l->asstart.x>0 && l->next->asend.x<0 )) { + y = -(l->next->asend.y-l->asstart.y)*(double)l->asstart.x/(l->next->asend.x-l->asstart.x) + + l->asstart.y; + if ( l->asstart.x<0 ) { + l->asstart.x = 0; + l->asstart.y = y; + } else { + l->next->asend.x = 0; + l->next->asend.y = y; + } + } else if ( l->asstart.x<0 && l->next->asend.x<0 ) + continue; + if (( l->asstart.xwidth && l->next->asend.x>cv->width ) || + ( l->asstart.x>cv->width && l->next->asend.xwidth )) { + y = (l->next->asend.y-l->asstart.y)*(double)(cv->width-l->asstart.x)/(l->next->asend.x-l->asstart.x) + + l->asstart.y; + if ( l->asstart.x>cv->width ) { + l->asstart.x = cv->width; + l->asstart.y = y; + } else { + l->next->asend.x = cv->width; + l->next->asend.y = y; + } + } else if ( l->asstart.x>cv->width && l->next->asend.x>cv->width ) + continue; + if (( l->asstart.y<0 && l->next->asend.y>0 ) || + ( l->asstart.y>0 && l->next->asend.y<0 )) { + x = -(l->next->asend.x-l->asstart.x)*(double)l->asstart.y/(l->next->asend.y-l->asstart.y) + + l->asstart.x; + if (( x<0 || x>=cv->width ) && bothout ) + continue; /* Not on screen */; + if ( l->asstart.y<0 ) { + l->asstart.y = 0; + l->asstart.x = x; + } else { + l->next->asend.y = 0; + l->next->asend.x = x; + } + } else if ( l->asstart.y<0 && l->next->asend.y< 0 ) + continue; + if (( l->asstart.yheight && l->next->asend.y>cv->height ) || + ( l->asstart.y>cv->height && l->next->asend.yheight )) { + x = (l->next->asend.x-l->asstart.x)*(double)(cv->height-l->asstart.y)/(l->next->asend.y-l->asstart.y) + + l->asstart.x; + if (( x<0 || x>=cv->width ) && bothout ) + continue; /* Not on screen */; + if ( l->asstart.y>cv->height ) { + l->asstart.y = cv->height; + l->asstart.x = x; + } else { + l->next->asend.y = cv->height; + l->next->asend.x = x; + } + } else if ( l->asstart.y>cv->height && l->next->asend.y>cv->height ) + continue; + l->flags |= cvli_onscreen; + any = true; + } + } + lap->any = any; +return( any ); +} + +typedef struct gpl { struct gpl *next; GPoint *gp; int cnt; } GPointList; + +static void GPLFree(GPointList *gpl) { + GPointList *next; + + while ( gpl!=NULL ) { + next = gpl->next; + free( gpl->gp ); + free( gpl ); + gpl = next; + } +} + +/* Before we did clipping this was a single polygon. Now it is a set of */ +/* sets of line segments. If no clipping is done, then we end up with */ +/* one set which is the original polygon, otherwise we get the segments */ +/* which are inside the screen. Each set of segments is contiguous */ +static GPointList *MakePoly(CharView *cv, SplinePointList *spl) { + int i, len; + LinearApprox *lap; + LineList *line, *prev; + Spline *spline, *first; + GPointList *head=NULL, *last=NULL, *cur; + int closed; + + for ( i=0; i<2; ++i ) { + len = 0; first = NULL; + closed = true; + cur = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( !CVSplineOutside(cv,spline) && !isnan(spline->splines[0].a) && !isnan(spline->splines[1].a)) { + lap = SplineApproximate(spline,cv->scale); + if ( i==0 ) + CVLinesIntersectScreen(cv,lap); + if ( lap->any ) { + for ( prev = lap->lines, line=prev->next; line!=NULL; prev=line, line=line->next ) { + if ( !(prev->flags&cvli_onscreen) ) { + closed = true; + continue; + } + if ( closed || (prev->flags&cvli_clipped) ) { + if ( i==0 ) { + cur = gcalloc(1,sizeof(GPointList)); + if ( head==NULL ) + head = cur; + else { + last->cnt = len; + last->next = cur; + } + last = cur; + } else { + if ( cur==NULL ) + cur = head; + else + cur = cur->next; + cur->gp = galloc(cur->cnt*sizeof(GPoint)); + cur->gp[0].x = prev->asstart.x; + cur->gp[0].y = prev->asstart.y; + } + len=1; + closed = false; + } + if ( i!=0 ) { + if ( len>=cur->cnt ) + fprintf( stderr, "Clipping is screwed up, about to die %d (should be less than %d)\n", len, cur->cnt ); + cur->gp[len].x = line->asend.x; + cur->gp[len].y = line->asend.y; + } + ++len; + if ( line->flags&cvli_clipped ) + closed = true; + } + } else + closed = true; + } else + closed = true; + if ( first==NULL ) first = spline; + } + if ( i==0 && cur!=NULL ) + cur->cnt = len; + } +return( head ); +} + +static void DrawPoint(CharView *cv, GWindow pixmap, SplinePoint *sp, SplineSet *spl) { + GRect r; + int x, y, cx, cy; + Color col = sp==spl->first ? firstpointcol : pointcol, subcol; + int pnum; + char buf[12]; unichar_t ubuf[12]; + + if ( cv->markextrema && !sp->nonextcp && !sp->noprevcp && + ((sp->nextcp.x==sp->me.x && sp->prevcp.x==sp->me.x) || + (sp->nextcp.y==sp->me.y && sp->prevcp.y==sp->me.y)) ) + col = extremepointcol; + if ( sp->selected ) + col = selectedpointcol; + + x = cv->xoff + rint(sp->me.x*cv->scale); + y = -cv->yoff + cv->height - rint(sp->me.y*cv->scale); + if ( x<-4000 || y<-4000 || x>cv->width+4000 || y>=cv->height+4000 ) +return; + + /* draw the control points if it's selected */ + if ( sp->selected || cv->showpointnumbers || cv->show_ft_results || cv->dv ) { + int iscurrent = sp==(cv->p.sp!=NULL?cv->p.sp:cv->lastselpt); + if ( !sp->nonextcp ) { + cx = cv->xoff + rint(sp->nextcp.x*cv->scale); + cy = -cv->yoff + cv->height - rint(sp->nextcp.y*cv->scale); + if ( cx<-100 ) { /* Clip */ + cy = cx==x ? x : (cy-y) * (double)(-100-x)/(cx-x) + y; + cx = -100; + } else if ( cx>cv->width+100 ) { + cy = cx==x ? x : (cy-y) * (double)(cv->width+100-x)/(cx-x) + y; + cx = cv->width+100; + } + if ( cy<-100 ) { + cx = cy==y ? y : (cx-x) * (double)(-100-y)/(cy-y) + x; + cy = -100; + } else if ( cy>cv->height+100 ) { + cx = cy==y ? y : (cx-x) * (double)(cv->height+100-y)/(cy-y) + x; + cy = cv->height+100; + } + subcol = nextcpcol; + if ( iscurrent && cv->p.nextcp ) { + r.x = cx-3; r.y = cy-3; r.width = r.height = 7; + GDrawFillRect(pixmap,&r, nextcpcol); + subcol = selectedcpcol; + } + GDrawDrawLine(pixmap,x,y,cx,cy, nextcpcol); + GDrawDrawLine(pixmap,cx-3,cy-3,cx+3,cy+3,subcol); + GDrawDrawLine(pixmap,cx+3,cy-3,cx-3,cy+3,subcol); + if ( cv->showpointnumbers || cv->show_ft_results || cv->dv ) { + pnum = sp->nextcpindex; + if ( pnum!=0xffff ) { + sprintf( buf,"%d", pnum ); + uc_strcpy(ubuf,buf); + GDrawDrawText(pixmap,cx,cy-6,ubuf,-1,NULL,nextcpcol); + } + } + } + if ( !sp->noprevcp ) { + cx = cv->xoff + rint(sp->prevcp.x*cv->scale); + cy = -cv->yoff + cv->height - rint(sp->prevcp.y*cv->scale); + if ( cx<-100 ) { /* Clip */ + cy = cx==x ? x : (cy-y) * (double)(-100-x)/(cx-x) + y; + cx = -100; + } else if ( cx>cv->width+100 ) { + cy = cx==x ? x : (cy-y) * (double)(cv->width+100-x)/(cx-x) + y; + cx = cv->width+100; + } + if ( cy<-100 ) { + cx = cy==y ? y : (cx-x) * (double)(-100-y)/(cy-y) + x; + cy = -100; + } else if ( cy>cv->height+100 ) { + cx = cy==y ? y : (cx-x) * (double)(cv->height+100-y)/(cy-y) + x; + cy = cv->height+100; + } + subcol = prevcpcol; + if ( iscurrent && cv->p.prevcp ) { + r.x = cx-3; r.y = cy-3; r.width = r.height = 7; + GDrawFillRect(pixmap,&r, prevcpcol); + subcol = selectedcpcol; + } + GDrawDrawLine(pixmap,x,y,cx,cy, prevcpcol); + GDrawDrawLine(pixmap,cx-3,cy-3,cx+3,cy+3,subcol); + GDrawDrawLine(pixmap,cx+3,cy-3,cx-3,cy+3,subcol); + } + } + + if ( x<-4 || y<-4 || x>cv->width+4 || y>=cv->height+4 ) +return; + r.x = x-2; + r.y = y-2; + r.width = r.height = 5; + if ( sp->selected ) + GDrawSetLineWidth(pixmap,selectedpointwidth); + if ( sp->pointtype==pt_curve ) { + --r.x; --r.y; r.width +=2; r.height += 2; + if ( sp->selected ) + GDrawDrawElipse(pixmap,&r,col); + else + GDrawFillElipse(pixmap,&r,col); + } else if ( sp->pointtype==pt_corner ) { + if ( sp->selected ) + GDrawDrawRect(pixmap,&r,col); + else + GDrawFillRect(pixmap,&r,col); + } else { + GPoint gp[5]; + int dir; + BasePoint *cp=NULL; + if ( !sp->nonextcp ) + cp = &sp->nextcp; + else if ( !sp->noprevcp ) + cp = &sp->prevcp; + dir = 0; + if ( cp!=NULL ) { + float dx = cp->x-sp->me.x, dy = cp->y-sp->me.y; + if ( dx<0 ) dx= -dx; + if ( dy<0 ) dy= -dy; + if ( dx>2*dy ) { + if ( cp->x>sp->me.x ) dir = 0 /* right */; + else dir = 1 /* left */; + } else if ( dy>2*dx ) { + if ( cp->y>sp->me.y ) dir = 2 /* up */; + else dir = 3 /* down */; + } else { + if ( cp->y>sp->me.y && cp->x>sp->me.x ) dir=4; + else if ( cp->x>sp->me.x ) dir=5; + else if ( cp->y>sp->me.y ) dir=7; + else dir = 6; + } + } + if ( dir==1 /* left */ || dir==0 /* right */) { + gp[0].y = y; gp[0].x = (dir==0)?x+4:x-4; + gp[1].y = y-4; gp[1].x = x; + gp[2].y = y+4; gp[2].x = x; + } else if ( dir==2 /* up */ || dir==3 /* down */ ) { + gp[0].x = x; gp[0].y = dir==2?y-4:y+4; /* remember screen coordinates are backwards in y from character coords */ + gp[1].x = x-4; gp[1].y = y; + gp[2].x = x+4; gp[2].y = y; + } else { + /* at a 45 angle, a value of 4 looks too small. I probably want 4*1.414 */ + int xdiff= cp->x>sp->me.x?5:-5, ydiff = cp->y>sp->me.y?-5:5; + gp[0].x = x+xdiff/2; gp[0].y = y+ydiff/2; + gp[1].x = gp[0].x-xdiff; gp[1].y = gp[0].y; + gp[2].x = gp[0].x; gp[2].y = gp[0].y-ydiff; + } + gp[3] = gp[0]; + if ( sp->selected ) + GDrawDrawPoly(pixmap,gp,4,col); + else + GDrawFillPoly(pixmap,gp,4,col); + } + GDrawSetLineWidth(pixmap,0); + if ( (cv->showpointnumbers || cv->show_ft_results|| cv->dv ) && sp->ttfindex!=0xffff ) { + sprintf( buf,"%d", sp->ttfindex ); + uc_strcpy(ubuf,buf); + GDrawDrawText(pixmap,x,y-6,ubuf,-1,NULL,col); + } + if ((( sp->roundx || sp->roundy ) && + (((cv->showrounds&1) && cv->scale>=.3) || (cv->showrounds&2))) || + (sp->watched && cv->dv!=NULL) || + sp->hintmask!=NULL ) { + r.x = x-5; r.y = y-5; + r.width = r.height = 11; + GDrawDrawElipse(pixmap,&r,col); + } + if (( sp->flexx && cv->showhhints ) || (sp->flexy && cv->showvhints)) { + r.x = x-5; r.y = y-5; + r.width = r.height = 11; + GDrawDrawElipse(pixmap,&r,sp->flexx ? hflexhintcol : vflexhintcol ); + } +} + +static void DrawLine(CharView *cv, GWindow pixmap, + real x1, real y1, real x2, real y2, Color fg) { + int ix1 = cv->xoff + rint(x1*cv->scale); + int iy1 = -cv->yoff + cv->height - rint(y1*cv->scale); + int ix2 = cv->xoff + rint(x2*cv->scale); + int iy2 = -cv->yoff + cv->height - rint(y2*cv->scale); + if ( iy1==iy2 ) { + if ( iy1<0 || iy1>cv->height ) +return; + if ( ix1<0 ) ix1 = 0; + if ( ix2>cv->width ) ix2 = cv->width; + } else if ( ix1==ix2 ) { + if ( ix1<0 || ix1>cv->width ) +return; + if ( iy1<0 ) iy1 = 0; + if ( iy2<0 ) iy2 = 0; + if ( iy1>cv->height ) iy1 = cv->height; + if ( iy2>cv->height ) iy2 = cv->height; + } + GDrawDrawLine(pixmap, ix1,iy1, ix2,iy2, fg ); +} + +static void DrawDirection(CharView *cv,GWindow pixmap, SplinePoint *sp) { + BasePoint dir, *other; + double len; + int x,y,xe,ye; + + if ( sp->next==NULL ) +return; + + x = cv->xoff + rint(sp->me.x*cv->scale); + y = -cv->yoff + cv->height - rint(sp->me.y*cv->scale); + if ( x<0 || y<0 || x>cv->width || y>cv->width ) +return; + + if ( sp->nonextcp ) + other = &sp->next->to->me; + else + other = &sp->nextcp; + dir.x = other->x-sp->me.x; + dir.y = sp->me.y-other->y; /* screen coordinates are the mirror of user coords */ + len = sqrt(dir.x*dir.x + dir.y*dir.y); + dir.x /= len; dir.y /= len; + + x += rint(5*dir.y); + y -= rint(5*dir.x); + xe = x + rint(7*dir.x); + ye = y + rint(7*dir.y); + GDrawDrawLine(pixmap,x,y,xe,ye,firstpointcol); + GDrawDrawLine(pixmap,xe,ye,xe+rint(2*(dir.y-dir.x)),ye+rint(2*(-dir.y-dir.x)), firstpointcol); + GDrawDrawLine(pixmap,xe,ye,xe+rint(2*(-dir.y-dir.x)),ye+rint(2*(dir.x-dir.y)), firstpointcol); +} + +void CVDrawSplineSet(CharView *cv, GWindow pixmap, SplinePointList *set, + Color fg, int dopoints, DRect *clip ) { + Spline *spline, *first; + SplinePointList *spl; + + if ( cv->inactive ) + dopoints = false; + + for ( spl = set; spl!=NULL; spl = spl->next ) { + GPointList *gpl = MakePoly(cv,spl), *cur; + if ( dopoints ) { + first = NULL; + DrawDirection(cv,pixmap,spl->first); + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + DrawPoint(cv,pixmap,spline->from,spl); + if ( first==NULL ) first = spline; + } + if ( spline==NULL ) + DrawPoint(cv,pixmap,spl->last,spl); + } + for ( cur=gpl; cur!=NULL; cur=cur->next ) + GDrawDrawPoly(pixmap,cur->gp,cur->cnt,fg); + GPLFree(gpl); + } +} + +static void CVDrawLayerSplineSet(CharView *cv, GWindow pixmap, Layer *layer, + Color fg, int dopoints, DRect *clip ) { +#ifdef FONTFORGE_CONFIG_TYPE3 + int active = cv->layerheads[cv->drawmode]==layer; + + if ( layer->dostroke ) { + if ( layer->stroke_pen.brush.col!=COLOR_INHERITED && + layer->stroke_pen.brush.col!=GDrawGetDefaultBackground(NULL)) + fg = layer->stroke_pen.brush.col; +#if 0 + if ( layer->stroke_pen.width!=WIDTH_INHERITED ) + GDrawSetLineWidth(pixmap,rint(layer->stroke_pen.width*layer->stroke_pen.trans[0]*cv->scale)); +#endif + } + if ( layer->dofill ) { + if ( layer->fill_brush.col!=COLOR_INHERITED && + layer->fill_brush.col!=GDrawGetDefaultBackground(NULL)) + fg = layer->fill_brush.col; + } + if ( !active && layer!=&cv->sc->layers[ly_back] ) + GDrawSetDashedLine(pixmap,5,5,cv->xoff+cv->height-cv->yoff); + CVDrawSplineSet(cv,pixmap,layer->splines,fg,dopoints && active,clip); + if ( !active && layer!=&cv->sc->layers[ly_back] ) + GDrawSetDashedLine(pixmap,0,0,0); +#if 0 + if ( layer->dostroke && layer->stroke_pen.width!=WIDTH_INHERITED ) + GDrawSetLineWidth(pixmap,0); +#endif +#else + CVDrawSplineSet(cv,pixmap,layer->splines,fg,dopoints,clip); +#endif +} + +static void CVDrawTemplates(CharView *cv,GWindow pixmap,SplineChar *template,DRect *clip) { + RefChar *r; + + CVDrawSplineSet(cv,pixmap,template->layers[ly_fore].splines,templateoutlinecol,false,clip); + for ( r=template->layers[ly_fore].refs; r!=NULL; r=r->next ) + CVDrawSplineSet(cv,pixmap,r->layers[0].splines,templateoutlinecol,false,clip); +} + +static void CVShowDHint(CharView *cv, GWindow pixmap, DStemInfo *dstem) { + IPoint ip[40], ip2[40]; + GPoint clipped[13]; + int i,j, tot,last; + + ip[0].x = cv->xoff + rint(dstem->leftedgetop.x*cv->scale); + ip[0].y = -cv->yoff + cv->height - rint(dstem->leftedgetop.y*cv->scale); + ip[1].x = cv->xoff + rint(dstem->rightedgetop.x*cv->scale); + ip[1].y = -cv->yoff + cv->height - rint(dstem->rightedgetop.y*cv->scale); + ip[2].x = cv->xoff + rint(dstem->rightedgebottom.x*cv->scale); + ip[2].y = -cv->yoff + cv->height - rint(dstem->rightedgebottom.y*cv->scale); + ip[3].x = cv->xoff + rint(dstem->leftedgebottom.x*cv->scale); + ip[3].y = -cv->yoff + cv->height - rint(dstem->leftedgebottom.y*cv->scale); + + if (( ip[0].x<0 && ip[1].x<0 && ip[2].x<0 && ip[3].x<0 ) || + ( ip[0].x>=cv->width && ip[1].x>=cv->width && ip[2].x>=cv->width && ip[3].x>=cv->width ) || + ( ip[0].y<0 && ip[1].y<0 && ip[2].y<0 && ip[3].y<0 ) || + ( ip[0].y>=cv->height && ip[1].y>=cv->height && ip[2].y>=cv->height && ip[3].y>=cv->height )) +return; /* Offscreen */ + + /* clip to left edge */ + tot = 4; + for ( i=j=0; i=0 && ip[last].x>=0) { + ip2[j++] = ip[i]; + } else if ( ip[i].x<0 && ip[last].x<0 ) { + if ( j==0 || ip2[j-1].x!=0 || ip2[j-1].y!=ip[i].y ) { + ip2[j].x = 0; + ip2[j++].y = ip[i].y; + } + } else { + ip2[j].x = 0; + ip2[j++].y = ip[last].y - ip[last].x * ((real) (ip[i].y-ip[last].y))/(ip[i].x-ip[last].x); + if ( ip[i].x>0 ) + ip2[j++] = ip[i]; + else { + ip2[j].x = 0; + ip2[j++].y = ip[i].y; + } + } + } + /* clip to right edge */ + tot = j; + for ( i=j=0; iwidth && ip2[last].xwidth ) { + ip[j++] = ip2[i]; + } else if ( ip2[i].x>=cv->width && ip2[last].x>=cv->width ) { + if ( j==0 || ip[j-1].x!=cv->width-1 || ip[j-1].y!=ip2[i].y ) { + ip[j].x = cv->width-1; + ip[j++].y = ip2[i].y; + } + } else { + ip[j].x = cv->width-1; + ip[j++].y = ip2[last].y + (cv->width-1- ip2[last].x) * ((real) (ip2[i].y-ip2[last].y))/(ip2[i].x-ip2[last].x); + if ( ip2[i].xwidth ) + ip[j++] = ip2[i]; + else { + ip[j].x = cv->width-1; + ip[j++].y = ip2[i].y; + } + } + } + /* clip to bottom edge */ + tot = j; + for ( i=j=0; i=0 && ip[last].y>=0) { + ip2[j++] = ip[i]; + } else if ( ip[i].y<0 && ip[last].y<0 ) { + ip2[j].y = 0; + ip2[j++].x = ip[i].x; + } else { + ip2[j].y = 0; + ip2[j++].x = ip[last].x - ip[last].y * ((real) (ip[i].x-ip[last].x))/(ip[i].y-ip[last].y); + if ( ip[i].y>0 ) + ip2[j++] = ip[i]; + else { + ip2[j].y = 0; + ip2[j++].x = ip[i].x; + } + } + } + /* clip to top edge */ + tot = j; + for ( i=j=0; iheight && ip2[last].yheight ) { + ip[j++] = ip2[i]; + } else if ( ip2[i].y>=cv->height && ip2[last].y>=cv->height ) { + ip[j].y = cv->height-1; + ip[j++].x = ip2[i].x; + } else { + ip[j].y = cv->height-1; + ip[j++].x = ip2[last].x + (cv->height-1- ip2[last].y) * ((real) (ip2[i].x-ip2[last].x))/(ip2[i].y-ip2[last].y); + if ( ip2[i].ywidth ) + ip[j++] = ip2[i]; + else { + ip[j].y = cv->height-1; + ip[j++].x = ip2[i].x; + } + } + } + + tot=j; + clipped[0].x = ip[0].x; clipped[0].y = ip[0].y; + for ( i=j=1; ixoff+cv->height-cv->yoff; + + if (( md->x && !cv->showmdx ) || (!md->x && !cv->showmdy)) +return; + if ( md->sp1==NULL && md->sp2==NULL ) +return; + if ( md->sp1!=NULL ) { + x1 = cv->xoff + rint( md->sp1->me.x*cv->scale ); + y1 = -cv->yoff + cv->height - rint(md->sp1->me.y*cv->scale); + } else { + x1 = cv->xoff + rint( cv->sc->width*cv->scale ); + y1 = 0x80000000; + } + if ( md->sp2!=NULL ) { + x2 = cv->xoff + rint( md->sp2->me.x*cv->scale ); + y2 = -cv->yoff + cv->height - rint(md->sp2->me.y*cv->scale); + } else { + x2 = cv->xoff + rint( cv->sc->width*cv->scale ); + y2 = y1-8; + } + if ( y1==0x80000000 ) + y1 = y2-8; + if ( md->x ) { + ya = (y1+y2)/2; + GDrawDrawArrow(pixmap, x1,ya, x2,ya, 2, mdhintcol); + GDrawSetDashedLine(pixmap,5,5,off); + GDrawDrawLine(pixmap, x1,ya, x1,y1, mdhintcol); + GDrawDrawLine(pixmap, x2,ya, x2,y2, mdhintcol); + } else { + xa = (x1+x2)/2; + GDrawDrawArrow(pixmap, xa,y1, xa,y2, 2, mdhintcol); + GDrawSetDashedLine(pixmap,5,5,off); + GDrawDrawLine(pixmap, xa,y1, x1,y1, mdhintcol); + GDrawDrawLine(pixmap, xa,y2, x2,y2, mdhintcol); + } + GDrawSetDashedLine(pixmap,0,0,0); +} + +static void dtou(unichar_t *ubuf,real val) { + char buffer[8], *pt; + sprintf( buffer,"%.1f", val); + pt = buffer+strlen(buffer); + if ( pt[-1]=='0' && pt[-2]=='.' ) pt[-2] = '\0'; + uc_strcpy(ubuf,buffer); +} + +static void CVDrawBlues(CharView *cv,GWindow pixmap,char *bluevals,char *others, + Color col) { + double blues[24]; + char *pt, *end; + int i=0, bcnt=0; + GRect r; + unichar_t ubuf[8]; + int len,len2; + + if ( bluevals!=NULL ) { + for ( pt = bluevals; isspace( *pt ) || *pt=='['; ++pt); + while ( i<14 && *pt!='\0' && *pt!=']' ) { + blues[i] = strtod(pt,&end); + if ( pt==end ) + break; + ++i; + pt = end; + while ( isspace( *pt )) ++pt; + } + if ( i&1 ) --i; + } + if ( others!=NULL ) { + for ( pt = others; isspace( *pt ) || *pt=='['; ++pt); + while ( i<24 && *pt!='\0' && *pt!=']' ) { + blues[i] = strtod(pt,&end); + if ( pt==end ) + break; + ++i; + pt = end; + while ( isspace( *pt )) ++pt; + } + if ( i&1 ) --i; + } + bcnt = i; + if ( i==0 ) +return; + + r.x = 0; r.width = cv->width; + for ( i=0; iyoff + cv->height - rint(blues[i]*cv->scale); + other = -cv->yoff + cv->height - rint(blues[i+1]*cv->scale); + r.y = first; + if ( ( r.y<0 && other<0 ) || (r.y>cv->height && other>cv->height)) + continue; + if ( r.y<0 ) r.y = 0; + else if ( r.y>cv->height ) r.y = cv->height; + if ( other<0 ) other = 0; + else if ( other>cv->height ) other = cv->height; + if ( other-20 && firstheight+20 ) { + dtou( ubuf, blues[i]); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,cv->width-len-5,first-3,ubuf,-1,NULL,hintlabelcol); + } else + len = 0; + if ( other>-20 && otherheight+20 ) { + dtou( ubuf, blues[i+1]-blues[i]); + len2 = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,cv->width-len-5-len2-5,other+cv->sas-3,ubuf,-1,NULL,hintlabelcol); + } + } +} + +static void CVShowHints(CharView *cv, GWindow pixmap) { + StemInfo *hint; + GRect r; + HintInstance *hi; + int end; + Color col; + DStemInfo *dstem; + MinimumDistance *md; + char *blues, *others; + struct psdict *private = cv->sc->parent->private; + unichar_t ubuf[8]; + int len, len2; + SplinePoint *sp; + SplineSet *spl; + + GDrawSetFont(pixmap,cv->small); + blues = PSDictHasEntry(private,"BlueValues"); others = PSDictHasEntry(private,"OtherBlues"); + if ( cv->showblues && (blues!=NULL || others!=NULL)) + CVDrawBlues(cv,pixmap,blues,others,bluevalstipplecol); + blues = PSDictHasEntry(private,"FamilyBlues"); others = PSDictHasEntry(private,"FamilyOtherBlues"); + if ( cv->showfamilyblues && (blues!=NULL || others!=NULL)) + CVDrawBlues(cv,pixmap,blues,others,fambluestipplecol); + + if ( cv->showdhints ) for ( dstem = cv->sc->dstem; dstem!=NULL; dstem = dstem->next ) { + CVShowDHint(cv,pixmap,dstem); + } + + if ( cv->showhhints && cv->sc->hstem!=NULL ) { + GDrawSetDashedLine(pixmap,5,5,cv->xoff); + for ( hint = cv->sc->hstem; hint!=NULL; hint = hint->next ) { + if ( hint->width<0 ) { + r.y = -cv->yoff + cv->height - rint(hint->start*cv->scale); + r.height = rint(-hint->width*cv->scale)+1; + } else { + r.y = -cv->yoff + cv->height - rint((hint->start+hint->width)*cv->scale); + r.height = rint(hint->width*cv->scale)+1; + } + col = hint->active ? hhintactivecol : hhintcol; + /* XRectangles are shorts! */ + if ( r.y<32767 && r.y+r.height>-32768 ) { + if ( r.y<-32768 ) { + r.height -= (-32768-r.y); + r.y = -32768; + } + if ( r.y+r.height>32767 ) + r.height = 32767-r.y; + for ( hi=hint->where; hi!=NULL; hi=hi->next ) { + r.x = cv->xoff + rint(hi->begin*cv->scale); + end = cv->xoff + rint(hi->end*cv->scale); + if ( end>=0 && r.x<=cv->width ) { + r.width = end-r.x+1; + GDrawFillRect(pixmap,&r,col); + } + } + } + col = (!hint->active && hint->hasconflicts) ? conflicthintcol : col; + if ( r.y>=0 && r.y<=cv->height ) + GDrawDrawLine(pixmap,0,r.y,cv->width,r.y,col); + if ( r.y+r.height>=0 && r.y+r.height<=cv->width ) + GDrawDrawLine(pixmap,0,r.y+r.height-1,cv->width,r.y+r.height-1,col); + + r.y = -cv->yoff + cv->height - rint(hint->start*cv->scale); + r.y += ( hint->width>0 ) ? -3 : cv->sas+3; + if ( r.y>-20 && r.yheight+20 ) { + dtou( ubuf, hint->start); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,cv->width-len-5,r.y,ubuf,-1,NULL,hintlabelcol); + } else + len = 0; + r.y = -cv->yoff + cv->height - rint((hint->start+hint->width)*cv->scale); + r.y += ( hint->width>0 ) ? cv->sas+3 : -3; + if ( r.y>-20 && r.yheight+20 ) { + dtou( ubuf, hint->width); + len2 = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,cv->width-len-5-len2-5,r.y,ubuf,-1,NULL,hintlabelcol); + } + } + } + if ( cv->showvhints && cv->sc->vstem!=NULL ) { + GDrawSetDashedLine(pixmap,5,5,cv->height-cv->yoff); + for ( hint = cv->sc->vstem; hint!=NULL; hint = hint->next ) { + if ( hint->width<0 ) { + r.x = cv->xoff + rint( (hint->start+hint->width)*cv->scale ); + r.width = rint(-hint->width*cv->scale)+1; + } else { + r.x = cv->xoff + rint(hint->start*cv->scale); + r.width = rint(hint->width*cv->scale)+1; + } + col = hint->active ? vhintactivecol : vhintcol; + if ( r.x<32767 && r.x+r.width>-32768 ) { + if ( r.x<-32768 ) { + r.width -= (-32768-r.x); + r.x = -32768; + } + if ( r.x+r.width>32767 ) + r.width = 32767-r.x; + for ( hi=hint->where; hi!=NULL; hi=hi->next ) { + r.y = -cv->yoff + cv->height - rint(hi->end*cv->scale); + end = -cv->yoff + cv->height - rint(hi->begin*cv->scale); + if ( end>=0 && r.y<=cv->height ) { + r.height = end-r.y+1; + GDrawFillRect(pixmap,&r,col); + } + } + } + col = (!hint->active && hint->hasconflicts) ? conflicthintcol : col; + if ( r.x>=0 && r.x<=cv->width ) + GDrawDrawLine(pixmap,r.x,0,r.x,cv->height,col); + if ( r.x+r.width>=0 && r.x+r.width<=cv->width ) + GDrawDrawLine(pixmap,r.x+r.width-1,0,r.x+r.width-1,cv->height,col); + + r.x = cv->xoff + rint(hint->start*cv->scale); + if ( r.x>-60 && r.xwidth+20 ) { + dtou( ubuf, hint->start); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + r.x += ( hint->width>0 ) ? 3 : -len-3; + GDrawDrawText(pixmap,r.x,cv->sas+3,ubuf,-1,NULL,hintlabelcol); + } + r.x = cv->xoff + rint((hint->start+hint->width)*cv->scale); + if ( r.x>-60 && r.xwidth+20 ) { + dtou( ubuf, hint->width); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + r.x += ( hint->width>0 ) ? -len-3 : 3; + GDrawDrawText(pixmap,r.x,cv->sas+cv->sfh+3,ubuf,-1,NULL,hintlabelcol); + } + } + } + GDrawSetDashedLine(pixmap,0,0,0); + + for ( md=cv->sc->md; md!=NULL; md=md->next ) + CVShowMinimumDistance(cv, pixmap,md); + + if ( cv->showvhints || cv->showhhints ) { + for ( spl=cv->sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + if ( spl->first->prev!=NULL ) for ( sp=spl->first ; ; ) { + if ( cv->showhhints && sp->flexx ) { + double x,y,end; + x = cv->xoff + rint(sp->me.x*cv->scale); + y = -cv->yoff + cv->height - rint(sp->me.y*cv->scale); + end = cv->xoff + rint(sp->next->to->me.x*cv->scale); + if ( x>-4096 && x<32767 && y>-4096 && y<32767 ) { + GDrawDrawLine(pixmap,x,y,end,y,hflexhintcol); + } + } + if ( cv->showvhints && sp->flexy ) { + double x,y,end; + x = cv->xoff + rint(sp->me.x*cv->scale); + y = -cv->yoff + cv->height - rint(sp->me.y*cv->scale); + end = -cv->yoff + cv->height - rint(sp->next->to->me.y*cv->scale); + if ( x>-4096 && x<32767 && y>-4096 && y<32767 ) { + GDrawDrawLine(pixmap,x,y,x,end,vflexhintcol); + } + } + if ( sp->next==NULL ) /* This can happen if we get an internal error inside of RemoveOverlap when the pointlist is not in good shape */ + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + } +} + +static void CVDrawRefName(CharView *cv,GWindow pixmap,RefChar *ref,int fg) { + unichar_t namebuf[100]; + int x,y, len; + + x = cv->xoff + rint(ref->top.x*cv->scale); + y = -cv->yoff + cv->height - rint(ref->top.y*cv->scale); + y -= 5; + if ( x<-400 || y<-40 || x>cv->width+400 || y>cv->height ) +return; + + uc_strncpy(namebuf,ref->sc->name,sizeof(namebuf)/sizeof(namebuf[0])); + GDrawSetFont(pixmap,cv->small); + len = GDrawGetTextWidth(pixmap,namebuf,-1,NULL); + GDrawDrawText(pixmap,x-len/2,y,namebuf,-1,NULL,fg); +} + +void DrawAnchorPoint(GWindow pixmap,int x, int y,int selected) { + GPoint gp[9]; + Color col = anchorcol; + + gp[0].x = x-1; gp[0].y = y-1; + gp[1].x = x; gp[1].y = y-6; + gp[2].x = x+1; gp[2].y = y-1; + gp[3].x = x+6; gp[3].y = y; + gp[4].x = x+1; gp[4].y = y+1; + gp[5].x = x; gp[5].y = y+6; + gp[6].x = x-1; gp[6].y = y+1; + gp[7].x = x-6; gp[7].y = y; + gp[8] = gp[0]; + if ( selected ) + GDrawDrawPoly(pixmap,gp,9,col); + else + GDrawFillPoly(pixmap,gp,9,col); +} + +static void CVDrawAnchorPoints(CharView *cv,GWindow pixmap) { + int x,y, len, sel; + Color col = anchorcol; + AnchorPoint *ap; + char buf[10]; + unichar_t *name, ubuf[30]; + GRect r; + + if ( cv->drawmode!=dm_fore || cv->sc->anchor==NULL || !cv->showanchor ) +return; + GDrawSetFont(pixmap,cv->normal); + + for ( sel=0; sel<2; ++sel ) { + for ( ap = cv->sc->anchor; ap!=NULL; ap=ap->next ) if ( ap->selected==sel ) { + x = cv->xoff + rint(ap->me.x*cv->scale); + y = -cv->yoff + cv->height - rint(ap->me.y*cv->scale); + if ( x<-400 || y<-40 || x>cv->width+400 || y>cv->height ) + continue; + + DrawAnchorPoint(pixmap,x,y,ap->selected); + if ( ap->type==at_basechar || ap->type==at_mark || ap->type==at_basemark ) + name = ap->anchor->name; + else if ( ap->type==at_centry || ap->type==at_cexit ) { + u_strncpy(ubuf,ap->anchor->name,20); + uc_strcat(ubuf,ap->type==at_centry ? " Entry" : " Exit" ); + name = ubuf; + } else if ( ap->type==at_baselig ) { + u_strncpy(ubuf,ap->anchor->name,20); + sprintf(buf,"#%d", ap->lig_index); + uc_strcat(ubuf,buf); + name = ubuf; + } + len = GDrawGetTextWidth(pixmap,name,-1,NULL); + r.x = x-len/2; r.width = len; + r.y = y+7; r.height = cv->nfh; + GDrawFillRect(pixmap,&r,GDrawGetDefaultBackground(NULL)); + GDrawDrawText(pixmap,x-len/2,y+7+cv->nas,name,-1,NULL,col); + } + } +} + +static void DrawImageList(CharView *cv,GWindow pixmap,ImageList *backimages) { + GRect size, temp; + int x,y; + + GDrawGetSize(pixmap,&size); + + while ( backimages!=NULL ) { + struct _GImage *base = backimages->image->list_len==0? + backimages->image->u.image:backimages->image->u.images[0]; + + temp = size; + x = (int) (cv->xoff + rint(backimages->xoff * cv->scale)); + y = (int) (-cv->yoff + cv->height - rint(backimages->yoff*cv->scale)); + temp.x -= x; temp.y -= y; + + GDrawDrawImageMagnified(pixmap, backimages->image, &temp, + x,y, + (int) rint((base->width*backimages->xscale*cv->scale)), + (int) rint((base->height*backimages->yscale*cv->scale))); + backimages = backimages->next; + } +} + +static void DrawSelImageList(CharView *cv,GWindow pixmap,ImageList *images) { + while ( images!=NULL ) { + if ( images->selected ) + CVDrawBB(cv,pixmap,&images->bb); + images = images->next; + } +} + +static void DrawOldState(CharView *cv, GWindow pixmap, Undoes *undo, DRect *clip) { + RefChar *refs; + + if ( undo==NULL ) +return; + + CVDrawSplineSet(cv,pixmap,undo->u.state.splines,oldoutlinecol,false,clip); + for ( refs=undo->u.state.refs; refs!=NULL; refs=refs->next ) + if ( refs->layers[0].splines!=NULL ) + CVDrawSplineSet(cv,pixmap,refs->layers[0].splines,oldoutlinecol,false,clip); + /* Don't do images... */ +} + +static void DrawTransOrigin(CharView *cv, GWindow pixmap) { + int x = rint(cv->p.cx*cv->scale) + cv->xoff, y = cv->height-cv->yoff-rint(cv->p.cy*cv->scale); + + GDrawDrawLine(pixmap,x-4,y,x+4,y,transformorigincol); + GDrawDrawLine(pixmap,x,y-4,x,y+4,transformorigincol); +} + +static void DrawVLine(CharView *cv,GWindow pixmap,real pos,Color fg, int flags) { + unichar_t ubuf[20]; + int x = cv->xoff + rint(pos*cv->scale); + DrawLine(cv,pixmap,pos,-32768,pos,32767,fg); + if ( flags&1 ) { + if ( x>-400 && xwidth+400 ) { + dtou( ubuf, pos); + GDrawSetFont(pixmap,cv->small); + GDrawDrawText(pixmap,x+5,cv->sas+3,ubuf,-1,NULL,metricslabelcol); + } + } + if ( ItalicConstrained && cv->sc->parent->italicangle!=0 ) { + double s = sin(-cv->sc->parent->italicangle*3.1415926535897932/180.); + int xoff = rint(8096*s); + DrawLine(cv,pixmap,pos-xoff,-8096,pos+xoff,8096,italiccoordcol); + } +} + +static void DrawMMGhosts(CharView *cv,GWindow pixmap,DRect *clip) { + /* In an MM font, draw any selected alternate versions of the current char */ + MMSet *mm = cv->sc->parent->mm; + int j; + SplineFont *sub; + SplineChar *sc; + RefChar *rf; + + if ( mm==NULL ) +return; + for ( j = 0; jinstance_count+1; ++j ) { + if ( j==0 ) + sub = mm->normal; + else + sub = mm->instances[j-1]; + sc = NULL; + if ( cv->sc->parent!=sub && (cv->mmvisible & (1<sc->enccharcnt ) + sc = sub->chars[cv->sc->enc]; + if ( sc!=NULL ) { + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + CVDrawSplineSet(cv,pixmap,rf->layers[0].splines,backoutlinecol,false,clip); + CVDrawSplineSet(cv,pixmap,sc->layers[ly_fore].splines,backoutlinecol,false,clip); + } + } +} + +static void CVExpose(CharView *cv, GWindow pixmap, GEvent *event ) { + SplineFont *sf = cv->sc->parent; + RefChar *rf; + GRect old; + DRect clip; + unichar_t ubuf[20]; + PST *pst; int i, layer, rlayer; + + GDrawPushClip(pixmap,&event->u.expose.rect,&old); + + clip.width = event->u.expose.rect.width/cv->scale; + clip.height = event->u.expose.rect.height/cv->scale; + clip.x = (event->u.expose.rect.x-cv->xoff)/cv->scale; + clip.y = (cv->height-event->u.expose.rect.y-event->u.expose.rect.height-cv->yoff)/cv->scale; + + GDrawSetFont(pixmap,cv->small); + GDrawSetLineWidth(pixmap,0); + + if ( !cv->show_ft_results && cv->dv==NULL ) { + /* if we've got bg images (and we're showing them) then the hints live in */ + /* the bg image pixmap (else they get overwritten by the pixmap) */ + if ( (cv->showhhints || cv->showvhints || cv->showdhints) && ( cv->sc->layers[ly_back].images==NULL || !cv->showback) ) + CVShowHints(cv,pixmap); + + for ( layer = ly_back; layersc->layer_cnt; ++layer ) if ( cv->sc->layers[layer].images!=NULL ) { + if ( (( cv->showback || cv->drawmode==dm_back ) && layer==ly_back ) || + (( cv->showfore || cv->drawmode==dm_fore ) && layer>ly_back )) { + /* This really should be after the grids, but then it would completely*/ + /* hide them. */ + GRect r; + if ( cv->backimgs==NULL ) + cv->backimgs = GDrawCreatePixmap(GDrawGetDisplayOfWindow(cv->v),cv->width,cv->height); + if ( cv->back_img_out_of_date ) { + GDrawFillRect(cv->backimgs,NULL,GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(cv->v))); + if ( cv->showhhints || cv->showvhints || cv->showdhints) + CVShowHints(cv,cv->backimgs); + DrawImageList(cv,cv->backimgs,cv->sc->layers[layer].images); + cv->back_img_out_of_date = false; + } + r.x = r.y = 0; r.width = cv->width; r.height = cv->height; + GDrawDrawPixmap(pixmap,cv->backimgs,&r,0,0); + } + } + if ( cv->showgrids || cv->drawmode==dm_grid ) { + CVDrawSplineSet(cv,pixmap,cv->fv->sf->grid.splines,guideoutlinecol, + cv->showpoints && cv->drawmode==dm_grid,&clip); + } + if ( cv->showhmetrics ) { + DrawVLine(cv,pixmap,0,coordcol,false); + DrawLine(cv,pixmap,-8096,0,8096,0,coordcol); + DrawLine(cv,pixmap,-8096,sf->ascent,8096,sf->ascent,coordcol); + DrawLine(cv,pixmap,-8096,-sf->descent,8096,-sf->descent,coordcol); + } + if ( cv->showvmetrics ) { + DrawLine(cv,pixmap,(sf->ascent+sf->descent)/2,-8096,(sf->ascent+sf->descent)/2,8096,coordcol); + DrawLine(cv,pixmap,-8096,sf->vertical_origin,8096,sf->vertical_origin,coordcol); + } + + DrawSelImageList(cv,pixmap,cv->layerheads[cv->drawmode]->images); + + if (( cv->showfore || cv->drawmode==dm_fore ) && cv->showfilled ) { + /* Wrong order, I know. But it is useful to have the background */ + /* visible on top of the fill... */ + cv->gi.u.image->clut->clut[1] = fillcol; + GDrawDrawImage(pixmap, &cv->gi, NULL, cv->xoff + cv->filled->xmin, + -cv->yoff + cv->height-cv->filled->ymax); + cv->gi.u.image->clut->clut[1] = backimagecol; + } + } else { + /* Draw FreeType Results */ + if ( cv->showgrids ) { + /* Draw ppem grid, and the raster */ + GRect pixel; + real grid_spacing = (cv->sc->parent->ascent+cv->sc->parent->descent) / (real) cv->ft_ppem; + int max,jmax,j; + + pixel.width = pixel.height = grid_spacing*cv->scale+1; + if ( cv->raster!=NULL ) { + for ( i=0; iraster->rows; ++i ) { + for ( j=0; jraster->cols; ++j ) { + if ( cv->raster->bitmap[i*cv->raster->bytes_per_row+(j>>3)] & (1<<(7-(j&7))) ) { + pixel.x = (j+cv->raster->lb)*grid_spacing*cv->scale + cv->xoff; + pixel.y = cv->height-cv->yoff - rint((cv->raster->as-i)*grid_spacing*cv->scale); + GDrawFillRect(pixmap,&pixel,rastercol); + } + } + } + } + + for ( i = floor( clip.x/grid_spacing ), max = ceil((clip.x+clip.width)/grid_spacing); + i<=max; ++i ) + DrawLine(cv,pixmap,i*grid_spacing,-32768,i*grid_spacing,32767,i==0?coordcol:rastergridcol); + for ( i = floor( clip.y/grid_spacing ), max = ceil((clip.y+clip.height)/grid_spacing); + i<=max; ++i ) + DrawLine(cv,pixmap,-32768,i*grid_spacing,32767,i*grid_spacing,i==0?coordcol:rastergridcol); + if ( grid_spacing*cv->scale>=7 ) { + for ( i = floor( clip.x/grid_spacing ), max = ceil((clip.x+clip.width)/grid_spacing); + i<=max; ++i ) + for ( j = floor( clip.y/grid_spacing ), jmax = ceil((clip.y+clip.height)/grid_spacing); + j<=jmax; ++j ) { + int x = (i+.5)*grid_spacing*cv->scale + cv->xoff; + int y = cv->height-cv->yoff - rint((j+.5)*grid_spacing*cv->scale); + GDrawDrawLine(pixmap,x-2,y,x+2,y,rastergridcol); + GDrawDrawLine(pixmap,x,y-2,x,y+2,rastergridcol); + } + } + } + if ( cv->showback ) { + CVDrawSplineSet(cv,pixmap,cv->gridfit,gridfitoutlinecol, + cv->showpoints,&clip); + } + } + + if ( cv->layerheads[cv->drawmode]->undoes!=NULL && cv->layerheads[cv->drawmode]->undoes->undotype==ut_tstate ) + DrawOldState(cv,pixmap,cv->layerheads[cv->drawmode]->undoes, &clip); + + if ( !cv->show_ft_results && cv->dv==NULL ) { + if ( cv->showback || cv->drawmode==dm_back ) { + /* Used to draw the image list here, but that's too slow. Optimization*/ + /* is to draw to pixmap, dump pixmap a bit earlier */ + /* Then when we moved the fill image around, we had to deal with the */ + /* images before the fill... */ + CVDrawLayerSplineSet(cv,pixmap,&cv->sc->layers[ly_back],backoutlinecol, + cv->showpoints && cv->drawmode==dm_back,&clip); + if ( cv->template1!=NULL ) + CVDrawTemplates(cv,pixmap,cv->template1,&clip); + if ( cv->template2!=NULL ) + CVDrawTemplates(cv,pixmap,cv->template2,&clip); + } + if ( cv->mmvisible!=0 ) + DrawMMGhosts(cv,pixmap,&clip); + } + + if ( cv->showfore || (cv->drawmode==dm_fore && !cv->show_ft_results && cv->dv==NULL)) { + CVDrawAnchorPoints(cv,pixmap); + for ( layer=ly_fore ; layersc->layer_cnt; ++layer ) { + for ( rf=cv->sc->layers[layer].refs; rf!=NULL; rf = rf->next ) { + CVDrawRefName(cv,pixmap,rf,0); + for ( rlayer=0; rlayerlayer_cnt; ++rlayer ) + CVDrawSplineSet(cv,pixmap,rf->layers[rlayer].splines,foreoutlinecol,false,&clip); + if ( rf->selected && cv->layerheads[cv->drawmode]==&cv->sc->layers[layer]) + CVDrawBB(cv,pixmap,&rf->bb); + } + + CVDrawLayerSplineSet(cv,pixmap,&cv->sc->layers[layer],foreoutlinecol, + cv->showpoints && cv->drawmode==dm_fore,&clip); + } + } + + if ( cv->freehand.current_trace!=NULL ) + CVDrawSplineSet(cv,pixmap,cv->freehand.current_trace,tracecol, + false,&clip); + + if ( cv->showhmetrics && cv->searcher==NULL ) { + DrawVLine(cv,pixmap,cv->sc->width,(!cv->inactive && cv->widthsel)?widthselcol:widthcol,true); + for ( pst=cv->sc->possub; pst!=NULL && pst->type!=pst_lcaret; pst=pst->next ); + if ( pst!=NULL ) { + for ( i=0; iu.lcaret.cnt; ++i ) + DrawVLine(cv,pixmap,pst->u.lcaret.carets[i],lcaretcol,true); + } + if ( cv->show_ft_results || cv->dv!=NULL ) + DrawVLine(cv,pixmap,cv->ft_gridfitwidth,widthgridfitcol,true); + } + if ( cv->showvmetrics ) { + int len, y = -cv->yoff + cv->height - rint((sf->vertical_origin-cv->sc->vwidth)*cv->scale); + DrawLine(cv,pixmap,-32768,sf->vertical_origin-cv->sc->vwidth, + 32767,sf->vertical_origin-cv->sc->vwidth, + (!cv->inactive && cv->vwidthsel)?widthselcol:widthcol); + if ( y>-40 && yheight+40 ) { + dtou( ubuf, cv->sc->vwidth); + GDrawSetFont(pixmap,cv->small); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,cv->width-len-5,y,ubuf,-1,NULL,metricslabelcol); + } + } + + if ( cv->p.rubberbanding ) + CVDrawRubberRect(pixmap,cv); + if ( cv->p.rubberlining ) + CVDrawRubberLine(pixmap,cv); + if ((( cv->active_tool >= cvt_scale && cv->active_tool <= cvt_skew ) || + cv->active_shape!=NULL ) && + cv->p.pressed ) + DrawTransOrigin(cv,pixmap); + + GDrawPopClip(pixmap,&old); +} + +void SCUpdateAll(SplineChar *sc) { + CharView *cv; + struct splinecharlist *dlist; + + for ( cv=sc->views; cv!=NULL; cv=cv->next ) + GDrawRequestExpose(cv->v,NULL,false); + for ( dlist=sc->dependents; dlist!=NULL; dlist=dlist->next ) + SCUpdateAll(dlist->sc); +} + +void SCOutOfDateBackground(SplineChar *sc) { + CharView *cv; + + for ( cv=sc->views; cv!=NULL; cv=cv->next ) + cv->back_img_out_of_date = true; +} + +static void CVRegenFill(CharView *cv) { + if ( cv->showfilled ) { + BDFCharFree(cv->filled); + cv->filled = SplineCharRasterize(cv->sc,cv->scale*(cv->fv->sf->ascent+cv->fv->sf->descent)+.1); + cv->gi.u.image->data = cv->filled->bitmap; + cv->gi.u.image->bytes_per_line = cv->filled->bytes_per_line; + cv->gi.u.image->width = cv->filled->xmax-cv->filled->xmin+1; + cv->gi.u.image->height = cv->filled->ymax-cv->filled->ymin+1; + GDrawRequestExpose(cv->v,NULL,false); + } +} + +static void FVRedrawAllCharViews(FontView *fv) { + int i; + CharView *cv; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL ) + for ( cv = fv->sf->chars[i]->views; cv!=NULL; cv=cv->next ) + GDrawRequestExpose(cv->v,NULL,false); +} + +static void SCRegenFills(SplineChar *sc) { + struct splinecharlist *dlist; + CharView *cv; + + for ( cv = sc->views; cv!=NULL; cv=cv->next ) + CVRegenFill(cv); + for ( dlist=sc->dependents; dlist!=NULL; dlist=dlist->next ) + SCRegenFills(dlist->sc); +} + +static void SCRegenDependents(SplineChar *sc) { + struct splinecharlist *dlist; + FontView *fv; + + for ( fv = sc->parent->fv; fv!=NULL; fv=fv->nextsame ) { + if ( fv->sv!=NULL ) { + SCReinstanciateRef(&fv->sv->sc_srch,sc); + SCReinstanciateRef(&fv->sv->sc_rpl,sc); + } + } + + for ( dlist=sc->dependents; dlist!=NULL; dlist=dlist->next ) { + SCReinstanciateRef(dlist->sc,sc); + SCRegenDependents(dlist->sc); + } +} + +static void CVUpdateInfo(CharView *cv, GEvent *event) { + + cv->info_within = true; + cv->e.x = event->u.mouse.x; cv->e.y = event->u.mouse.y; + cv->info.x = (event->u.mouse.x-cv->xoff)/cv->scale; + cv->info.y = (cv->height-event->u.mouse.y-cv->yoff)/cv->scale; + CVInfoDraw(cv,cv->gw); +} + +static void CVNewScale(CharView *cv) { + GEvent e; + + CVRegenFill(cv); + cv->back_img_out_of_date = true; + + GScrollBarSetBounds(cv->vsb,-20000*cv->scale,8000*cv->scale,cv->height); + GScrollBarSetBounds(cv->hsb,-8000*cv->scale,32000*cv->scale,cv->width); + GScrollBarSetPos(cv->vsb,cv->yoff-cv->height); + GScrollBarSetPos(cv->hsb,-cv->xoff); + + GDrawRequestExpose(cv->v,NULL,false); + if ( cv->showrulers ) + GDrawRequestExpose(cv->gw,NULL,false); + GDrawGetPointerPosition(cv->v,&e); + CVUpdateInfo(cv,&e); +} + +static void _CVFit(CharView *cv,DBounds *b) { + real left, right, top, bottom, hsc, wsc; + extern int palettes_docked; + int offset = palettes_docked ? 90 : 0; + + if ( offset>cv->width ) offset = 0; + + bottom = b->miny; + top = b->maxy; + left = b->minx; + right = b->maxx; + + if ( topwidth-offset) / right; + hsc = cv->height / top; + if ( wscscale = hsc/1.2; + if ( cv->scale > 1.0 ) { + cv->scale = floor(cv->scale); + } else { + cv->scale = 1/ceil(1/cv->scale); + } + + cv->xoff = -(left - (right/10))*cv->scale + offset; + cv->yoff = -(bottom - (top/10))*cv->scale; + + CVNewScale(cv); +} + +static void CVFit(CharView *cv) { + DBounds b; + + SplineCharFindBounds(cv->sc,&b); + if ( b.miny>=0 ) b.miny = -cv->sc->parent->descent; + if ( b.minx>0 ) b.minx = 0; + if ( b.maxxsc->width ) b.maxx = cv->sc->width; + _CVFit(cv,&b); +} + +static void CVUnlinkView(CharView *cv ) { + CharView *test; + + if ( cv->sc->views == cv ) { + cv->sc->views = cv->next; + } else { + for ( test=cv->sc->views; test->next!=cv && test->next!=NULL; test=test->next ); + if ( test->next==cv ) + test->next = cv->next; + } +} + +static GWindow CharIcon(CharView *cv, FontView *fv) { + SplineChar *sc = cv->sc; + BDFFont *bdf, *bdf2; + BDFChar *bdfc; + GWindow icon = cv->icon; + GRect r; + + r.x = r.y = 0; r.width = r.height = fv->cbw-1; + if ( icon == NULL ) + cv->icon = icon = GDrawCreateBitmap(NULL,r.width,r.width,NULL); + GDrawFillRect(icon,&r,0x0); /* for some reason icons seem to be color reversed by my defn */ + + bdf = NULL; bdfc = NULL; + if ( sc->layers[ly_fore].refs!=NULL || sc->layers[ly_fore].splines!=NULL ) { + bdf = fv->show; + if ( bdf->chars[sc->enc]==NULL ) + bdf = fv->filled; + if ( bdf->chars[sc->enc]==NULL ) { + bdf2 = NULL; bdfc = NULL; + for ( bdf=fv->sf->bitmaps; bdf!=NULL && bdf->pixelsize<24 ; bdf=bdf->next ) + bdf2 = bdf; + if ( bdf2!=NULL && bdf!=NULL ) { + if ( 24-bdf2->pixelsize < bdf->pixelsize-24 ) + bdf = bdf2; + } else if ( bdf==NULL ) + bdf = bdf2; + } + if ( bdf!=NULL ) + bdfc = bdf->chars[sc->enc]; + } + + if ( bdfc!=NULL ) { + GClut clut; + struct _GImage base; + GImage gi; + /* if not empty, use the font's own shape, otherwise use a standard */ + /* font */ + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + memset(&clut,'\0',sizeof(clut)); + gi.u.image = &base; + base.trans = -1; + base.clut = &clut; + if ( bdfc->byte_data ) { int i; + base.image_type = it_index; + clut.clut_len = bdf->clut->clut_len; + for ( i=0; ibitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + GDrawDrawImage(icon,&gi,NULL,(r.width-base.width)/2,(r.height-base.height)/2); + } else if ( sc->unicodeenc!=-1 ) { + FontRequest rq; + GFont *font; + static unichar_t times[] = { 't', 'i', 'm', 'e', 's',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + unichar_t text[2]; + int as, ds, ld, width; + + memset(&rq,0,sizeof(rq)); + rq.family_name = times; + rq.point_size = 24; + rq.weight = 400; + font = GDrawInstanciateFont(NULL,&rq); + GDrawSetFont(icon,font); + text[0] = sc->unicodeenc; text[1] = 0; + GDrawFontMetrics(font,&as,&ds,&ld); + width = GDrawGetTextWidth(icon,text,1,NULL); + GDrawDrawText(icon,(r.width-width)/2,(r.height-as-ds)/2+as,text,1,NULL,0xffffff); + } +return( icon ); +} + +static unichar_t *CVMakeTitles(CharView *cv,unichar_t *ubuf) { + unichar_t *title; + SplineChar *sc = cv->sc; + + u_sprintf(ubuf,GStringGetResource(_STR_CvTitle,NULL), + sc->name, sc->enc, sc->parent->fontname); + if ( sc->changed ) + uc_strcat(ubuf," *"); + title = u_copy(ubuf); + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x110000 && _UnicodeNameAnnot!=NULL && + _UnicodeNameAnnot[sc->unicodeenc>>16][(sc->unicodeenc>>8)&0xff][sc->unicodeenc&0xff].name!=NULL ) { + uc_strcat(ubuf, " "); + uc_strcat(ubuf, _UnicodeNameAnnot[sc->unicodeenc>>16][(sc->unicodeenc>>8)&0xff][sc->unicodeenc&0xff].name); + } +return( title ); +} + +void SCRefreshTitles(SplineChar *sc) { + /* Called if the user changes the unicode encoding or the character name */ + CharView *cv; + unichar_t ubuf[300], *title; + + if ( sc->views==NULL ) +return; + title = CVMakeTitles(sc->views,ubuf); + for ( cv = sc->views; cv!=NULL; cv=cv->next ) + GDrawSetWindowTitles(cv->gw,ubuf,title); + free(title); +} + +void CVChangeSC(CharView *cv, SplineChar *sc ) { + unichar_t *title; + unichar_t ubuf[300]; + extern int updateflex; + + CVDebugFree(cv->dv); + + if ( cv->expandedge != ee_none ) { + GDrawSetCursor(cv->v,ct_mypointer); + cv->expandedge = ee_none; + } + + SplinePointListsFree(cv->gridfit); cv->gridfit = NULL; + FreeType_FreeRaster(cv->raster); cv->raster = NULL; + + SCLigCaretCheck(sc,false); + + CVUnlinkView(cv); + cv->p.nextcp = cv->p.prevcp = cv->widthsel = cv->vwidthsel = false; + if ( sc->views==NULL && updateflex ) + SplineCharIsFlexible(sc); + cv->sc = sc; + cv->next = sc->views; + sc->views = cv; + cv->layerheads[dm_fore] = &sc->layers[ly_fore]; + cv->layerheads[dm_back] = &sc->layers[ly_back]; + cv->layerheads[dm_grid] = &sc->parent->grid; + cv->p.sp = cv->lastselpt = NULL; + cv->template1 = cv->template2 = NULL; +#if HANYANG + if ( cv->sc->parent->rules!=NULL && cv->sc->compositionunit ) + Disp_DefaultTemplate(cv); +#endif + if ( cv->show_ft_results ) + CVGridFitChar(cv); + + CVNewScale(cv); + + CharIcon(cv,cv->fv); + title = CVMakeTitles(cv,ubuf); + GDrawSetWindowTitles(cv->gw,ubuf,title); + cv->lastselpt = NULL; cv->p.sp = NULL; + CVInfoDraw(cv,cv->gw); + free(title); + _CVPaletteActivate(cv,true); +} + +static void CVChangeChar(CharView *cv, int i ) { + SplineChar *sc; + SplineFont *sf = cv->sc->parent; + + if ( i<0 || i>=sf->charcnt ) +return; + if ( (sc = sf->chars[i])==NULL ) + sc = SFMakeChar(sf,i); + sc = SCDuplicate(sc); + + if ( sc==NULL || cv->sc == sc ) +return; + CVChangeSC(cv,sc); +} + +static void CVClear(GWindow,GMenuItem *mi, GEvent *); +static void CVMouseMove(CharView *cv, GEvent *event ); +static void CVMouseUp(CharView *cv, GEvent *event ); +static void CVHScroll(CharView *cv,struct sbevent *sb); +static void CVVScroll(CharView *cv,struct sbevent *sb); +static void CVElide(GWindow gw,struct gmenuitem *mi,GEvent *e); +static void CVMerge(GWindow gw,struct gmenuitem *mi,GEvent *e); +static void SVElide(GWindow gw,struct gmenuitem *mi,GEvent *e); +static void SVMerge(GWindow gw,struct gmenuitem *mi,GEvent *e); +static void CVMenuSimplify(GWindow gw,struct gmenuitem *mi,GEvent *e); +static void CVMenuSimplifyMore(GWindow gw,struct gmenuitem *mi,GEvent *e); +static void SVMenuSimplify(GWindow gw,struct gmenuitem *mi,GEvent *e); +#if 0 +static void SVMenuSimplifyMore(GWindow gw,struct gmenuitem *mi,GEvent *e); +#endif + + +static void CVFakeMove(CharView *cv, GEvent *event) { + GEvent e; + + memset(&e,0,sizeof(e)); + e.type = et_mousemove; + e.w = cv->v; + if ( event->w!=cv->v ) { + GPoint p; + p.x = event->u.chr.x; p.y = event->u.chr.y; + GDrawTranslateCoordinates(event->w,cv->v,&p); + event->u.chr.x = p.x; event->u.chr.y = p.y; + } + e.u.mouse.state = TrueCharState(event); + e.u.mouse.x = event->u.chr.x; + e.u.mouse.y = event->u.chr.y; + e.u.mouse.device = NULL; + CVMouseMove(cv,&e); +} + +void CVChar(CharView *cv, GEvent *event ) { + extern float arrowAmount; + +#if _ModKeysAutoRepeat + /* Under cygwin these keys auto repeat, they don't under normal X */ + if ( cv->autorpt!=NULL ) { + GDrawCancelTimer(cv->autorpt); cv->autorpt = NULL; + if ( cv->keysym == event->u.chr.keysym ) /* It's an autorepeat, ignore it */ +return; + CVToolsSetCursor(cv,cv->oldstate,NULL); + } +#endif + +#if MyMemory + if ( event->u.chr.keysym == GK_F2 ) { + fprintf( stderr, "Malloc debug on\n" ); + __malloc_debug(5); + } else if ( event->u.chr.keysym == GK_F3 ) { + fprintf( stderr, "Malloc debug off\n" ); + __malloc_debug(0); + } +#endif +#if 0 + if ( event->u.chr.keysym == GK_F4 ) { + RepeatFromFile(cv); + } +#endif + + CVPaletteActivate(cv); + CVToolsSetCursor(cv,TrueCharState(event),NULL); + if ( cv->dv!=NULL && DVChar(cv->dv,event)) + /* All Done */; + else if ( event->u.chr.keysym=='s' && + (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) + MenuSaveAll(NULL,NULL,NULL); + else if ( event->u.chr.keysym=='q' && + (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) + MenuExit(NULL,NULL,NULL); + else if (( event->u.chr.keysym=='M' ||event->u.chr.keysym=='m' ) && + (event->u.chr.state&ksm_control) ) { + if ( (event->u.chr.state&ksm_meta) && (event->u.chr.state&ksm_shift)) + CVMenuSimplifyMore(cv->gw,NULL,NULL); + else if ( (event->u.chr.state&ksm_shift)) + CVMenuSimplify(cv->gw,NULL,NULL); + else if ( (event->u.chr.state&ksm_meta) && (event->u.chr.state&ksm_control)) + CVElide(cv->gw,NULL,NULL); + else + CVMerge(cv->gw,NULL,NULL); + } else if ( event->u.chr.keysym == GK_Shift_L || event->u.chr.keysym == GK_Shift_R || + event->u.chr.keysym == GK_Alt_L || event->u.chr.keysym == GK_Alt_R || + event->u.chr.keysym == GK_Meta_L || event->u.chr.keysym == GK_Meta_R ) { + CVFakeMove(cv, event); + } else if ( (event->u.chr.state&ksm_meta) && + !(event->u.chr.state&(ksm_control|ksm_shift)) && + event->u.chr.chars[0]!='\0' ) { + CVPaletteMnemonicCheck(event); + } else if ( !(event->u.chr.state&(ksm_control|ksm_meta)) && + event->u.chr.keysym == GK_BackSpace ) { + /* Menu does delete */ + CVClear(cv->gw,NULL,NULL); + } else if ( event->u.chr.keysym == GK_Help ) { + MenuHelp(NULL,NULL,NULL); /* Menu does F1 */ + } else if ( (event->u.chr.keysym=='[' || event->u.chr.keysym==']') && + (event->u.chr.state&ksm_control) ) { + /* some people have remapped keyboards so that shift is needed to get [] */ + int pos; + SplineFont *sf = cv->sc->parent; + if ( event->u.chr.keysym=='[' ) { + for ( pos = cv->sc->enc-1; pos>=0 && + sf->chars[pos]!=SCDuplicate(sf->chars[pos]); --pos ); + } else { + for ( pos = cv->sc->enc+1; poscharcnt && + sf->chars[pos]!=SCDuplicate(sf->chars[pos]); ++pos ); + } +#if 0 /* Werner doesn't want it to wrap */ + if ( pos<0 ) pos = cv->sc->parent->charcnt-1; + else if ( pos>= cv->sc->parent->charcnt ) pos = 0; +#endif + if ( pos>=0 && possc->parent->charcnt ) + CVChangeChar(cv,pos); + } else if ( event->u.chr.keysym == GK_Left || + event->u.chr.keysym == GK_Up || + event->u.chr.keysym == GK_Right || + event->u.chr.keysym == GK_Down || + event->u.chr.keysym == GK_KP_Left || + event->u.chr.keysym == GK_KP_Up || + event->u.chr.keysym == GK_KP_Right || + event->u.chr.keysym == GK_KP_Down ) { + real dx=0, dy=0; int anya; + switch ( event->u.chr.keysym ) { + case GK_Left: case GK_KP_Left: + dx = -1; + break; + case GK_Right: case GK_KP_Right: + dx = 1; + break; + case GK_Up: case GK_KP_Up: + dy = 1; + break; + case GK_Down: case GK_KP_Down: + dy = -1; + break; + } + if ( event->u.chr.state & ksm_control ) { + struct sbevent sb; + sb.type = dy>0 || dx<0 ? et_sb_halfup : et_sb_halfdown; + if ( dx==0 ) + CVVScroll(cv,&sb); + else + CVHScroll(cv,&sb); + } else { + if ( event->u.chr.state & ksm_meta ) { + dx *= 10; dy *= 10; + } + if ( event->u.chr.state & (ksm_shift) ) + dx -= dy*tan((cv->sc->parent->italicangle)*(3.1415926535897932/180) ); + if (( cv->p.sp!=NULL || cv->lastselpt!=NULL ) && + (cv->p.nextcp || cv->p.prevcp) ) { + SplinePoint *sp = cv->p.sp ? cv->p.sp : cv->lastselpt; + SplinePoint *old = cv->p.sp; + BasePoint *which = cv->p.nextcp ? &sp->nextcp : &sp->prevcp; + BasePoint to; + to.x = which->x + dx*arrowAmount; + to.y = which->y + dy*arrowAmount; + cv->p.sp = sp; + CVPreserveState(cv); + CVAdjustControl(cv,which,&to); + cv->p.sp = old; + SCUpdateAll(cv->sc); + } else if ( CVAnySel(cv,NULL,NULL,NULL,&anya) || cv->widthsel || cv->vwidthsel ) { + CVPreserveState(cv); + CVMoveSelection(cv,dx*arrowAmount,dy*arrowAmount); + if ( cv->widthsel ) + SCSynchronizeWidth(cv->sc,cv->sc->width,cv->sc->width-dx,NULL); + CVCharChangedUpdate(cv); + CVInfoDraw(cv,cv->gw); + } + } + } else if ( event->u.chr.keysym == GK_Page_Up || + event->u.chr.keysym == GK_KP_Page_Up || + event->u.chr.keysym == GK_Prior || + event->u.chr.keysym == GK_Page_Down || + event->u.chr.keysym == GK_KP_Page_Down || + event->u.chr.keysym == GK_Next ) { + /* Um... how do we scroll horizontally??? */ + struct sbevent sb; + sb.type = et_sb_uppage; + if ( event->u.chr.keysym == GK_Page_Down || + event->u.chr.keysym == GK_KP_Page_Down || + event->u.chr.keysym == GK_Next ) + sb.type = et_sb_downpage; + CVVScroll(cv,&sb); + } else if ( !(event->u.chr.state&(ksm_control|ksm_meta)) && + event->type == et_char && + cv->searcher==NULL && + event->u.chr.chars[0]>=' ' && event->u.chr.chars[1]=='\0' ) { + SplineFont *sf = cv->sc->parent; + int i; + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc==event->u.chr.chars[0] ) { + CVChangeChar(cv,i); + break; + } + if ( i==sf->charcnt ) for ( i=0; icharcnt; ++i ) if ( sf->chars[i]==NULL ) { + SplineChar dummy; + SCBuildDummy(&dummy,sf,i); + if ( dummy.unicodeenc==event->u.chr.chars[0] ) { + CVChangeChar(cv,i); + break; + } + } + } +} + +static void CVCharUp(CharView *cv, GEvent *event ) { +#if _ModKeysAutoRepeat + /* Under cygwin these keys auto repeat, they don't under normal X */ + if ( event->u.chr.keysym == GK_Shift_L || event->u.chr.keysym == GK_Shift_R || + event->u.chr.keysym == GK_Control_L || event->u.chr.keysym == GK_Control_R || + event->u.chr.keysym == GK_Meta_L || event->u.chr.keysym == GK_Meta_R || + event->u.chr.keysym == GK_Alt_L || event->u.chr.keysym == GK_Alt_R || + event->u.chr.keysym == GK_Super_L || event->u.chr.keysym == GK_Super_R || + event->u.chr.keysym == GK_Hyper_L || event->u.chr.keysym == GK_Hyper_R ) { + if ( cv->autorpt!=NULL ) { + GDrawCancelTimer(cv->autorpt); + CVToolsSetCursor(cv,cv->oldstate,NULL); + } + cv->keysym = event->u.chr.keysym; + cv->oldkeyx = event->u.chr.x; + cv->oldkeyy = event->u.chr.y; + cv->oldkeyw = event->w; + cv->oldstate = TrueCharState(event); + cv->autorpt = GDrawRequestTimer(cv->v,100,0,NULL); + } else { + if ( cv->autorpt!=NULL ) { + GDrawCancelTimer(cv->autorpt); cv->autorpt=NULL; + CVToolsSetCursor(cv,cv->oldstate,NULL); + } + CVToolsSetCursor(cv,TrueCharState(event),NULL); + } +#else + CVToolsSetCursor(cv,TrueCharState(event),NULL); + if ( event->u.chr.keysym == GK_Shift_L || event->u.chr.keysym == GK_Shift_R || + event->u.chr.keysym == GK_Alt_L || event->u.chr.keysym == GK_Alt_R || + event->u.chr.keysym == GK_Meta_L || event->u.chr.keysym == GK_Meta_R ) + CVFakeMove(cv, event); +#endif +} + +static void CVInfoDrawText(CharView *cv, GWindow pixmap ) { + GRect r; + Color bg = GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(pixmap)); + char buffer[50]; + unichar_t ubuffer[50]; + int ybase = cv->mbh+(cv->infoh-cv->sfh)/2+cv->sas; + real xdiff, ydiff; + SplinePoint *sp, dummy; + + GDrawSetFont(pixmap,cv->small); + r.x = RPT_DATA; r.width = 60; + r.y = cv->mbh; r.height = cv->infoh-1; + GDrawFillRect(pixmap,&r,bg); + r.x = SPT_DATA; r.width = 60; + GDrawFillRect(pixmap,&r,bg); + r.x = SOF_DATA; r.width = 60; + GDrawFillRect(pixmap,&r,bg); + r.x = SDS_DATA; r.width = 30; + GDrawFillRect(pixmap,&r,bg); + r.x = SAN_DATA; r.width = 30; + GDrawFillRect(pixmap,&r,bg); + r.x = MAG_DATA; r.width = 60; + GDrawFillRect(pixmap,&r,bg); + r.x = LAYER_DATA; r.width = 60; + GDrawFillRect(pixmap,&r,bg); + r.x = CODERANGE_DATA; r.width = 60; + GDrawFillRect(pixmap,&r,bg); + + if ( !cv->info_within ) +return; + + if ( cv->info.x>=1000 || cv->info.x<=-1000 || cv->info.y>=1000 || cv->info.y<=-1000 ) + sprintf(buffer,"%d%s%d", (int) cv->info.x, coord_sep, (int) cv->info.y ); + else + sprintf(buffer,"%.4g%s%.4g", cv->info.x, coord_sep, cv->info.y ); + buffer[11] = '\0'; + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,RPT_DATA,ybase,ubuffer,-1,NULL,0); + if ( cv->scale>=.25 ) + sprintf( buffer, "%d%%", (int) (100*cv->scale)); + else + sprintf( buffer, "%.3g%%", (100*cv->scale)); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,MAG_DATA,ybase,ubuffer,-1,NULL,0); + GDrawDrawText(pixmap,LAYER_DATA,ybase, + GStringGetResource(cv->drawmode==dm_fore ? _STR_Fore : + cv->drawmode==dm_back ? _STR_Back : _STR_Grid, NULL ), + -1,NULL,0); + if ( cv->coderange!=cr_none ) + GDrawDrawText(pixmap,CODERANGE_DATA,ybase, + GStringGetResource(cv->coderange==cr_fpgm ? _STR_Fpgm : + cv->coderange==cr_prep ? _STR_Prep : _STR_Glyph, NULL ), + -1,NULL,0); + sp = cv->p.sp!=NULL ? cv->p.sp : cv->lastselpt; + if ( sp==NULL ) if ( cv->active_tool==cvt_rect || cv->active_tool==cvt_elipse || + cv->active_tool==cvt_poly || cv->active_tool==cvt_star ) { + dummy.me.x = cv->p.cx; dummy.me.y = cv->p.cy; + sp = &dummy; + } + if ( sp ) { + real selx, sely; + if ( cv->pressed && sp==cv->p.sp ) { + selx = cv->p.constrain.x; + sely = cv->p.constrain.y; + } else { + selx = sp->me.x; + sely = sp->me.y; + } + xdiff=cv->info.x-selx; + ydiff = cv->info.y-sely; + + if ( selx>=1000 || selx<=-1000 || sely>=1000 || sely<=-1000 ) + sprintf(buffer,"%d%s%d", (int) selx, coord_sep, (int) sely ); + else + sprintf(buffer,"%.4g%s%.4g", selx, coord_sep, sely ); + buffer[11] = '\0'; + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,SPT_DATA,ybase,ubuffer,-1,NULL,0); + } else if ( cv->widthsel ) { + xdiff = cv->info.x-cv->p.cx; + ydiff = 0; + } else if ( cv->p.rubberbanding ) { + xdiff=cv->info.x-cv->p.cx; + ydiff = cv->info.y-cv->p.cy; + } else +return; + + if ( xdiff>=1000 || xdiff<=-1000 || ydiff>=1000 || ydiff<=-1000 ) + sprintf(buffer,"%d%s%d", (int) xdiff, coord_sep, (int) ydiff ); + else + sprintf(buffer,"%.4g%s%.4g", xdiff, coord_sep, ydiff ); + buffer[11] = '\0'; + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,SOF_DATA,ybase,ubuffer,-1,NULL,0); + + sprintf( buffer, "%.1f", sqrt(xdiff*xdiff+ydiff*ydiff)); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,SDS_DATA,ybase,ubuffer,-1,NULL,0); + + sprintf( buffer, "%d\260", (int) rint(180*atan2(ydiff,xdiff)/3.1415926535897932)); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,SAN_DATA,ybase,ubuffer,-1,NULL,0); +} + +static void CVInfoDrawRulers(CharView *cv, GWindow pixmap ) { + int rstart = cv->mbh+cv->infoh; + GDrawSetXORMode(pixmap); + GDrawSetXORBase(pixmap,GDrawGetDefaultBackground(NULL)); + GDrawSetLineWidth(pixmap,0); + if ( cv->olde.x!=-1 ) { + GDrawDrawLine(pixmap,cv->olde.x+cv->rulerh,rstart,cv->olde.x+cv->rulerh,rstart+cv->rulerh,0xff0000); + GDrawDrawLine(pixmap,0,cv->olde.y+rstart+cv->rulerh,cv->rulerh,cv->olde.y+rstart+cv->rulerh,0xff0000); + } + GDrawDrawLine(pixmap,cv->e.x+cv->rulerh,rstart,cv->e.x+cv->rulerh,rstart+cv->rulerh,0xff0000); + GDrawDrawLine(pixmap,0,cv->e.y+rstart+cv->rulerh,cv->rulerh,cv->e.y+rstart+cv->rulerh,0xff0000); + cv->olde = cv->e; + GDrawSetCopyMode(pixmap); +} + +void CVInfoDraw(CharView *cv, GWindow pixmap ) { + CVInfoDrawText(cv,pixmap); + if ( cv->showrulers ) + CVInfoDrawRulers(cv,pixmap); +} + +static void CVCrossing(CharView *cv, GEvent *event ) { + CVToolsSetCursor(cv,event->u.mouse.state,event->u.mouse.device); + cv->info_within = event->u.crossing.entered; + cv->info.x = (event->u.crossing.x-cv->xoff)/cv->scale; + cv->info.y = (cv->height-event->u.crossing.y-cv->yoff)/cv->scale; + CVInfoDraw(cv,cv->gw); +} + +static int CheckPoint(FindSel *fs, SplinePoint *sp, SplineSet *spl) { + + if ( fs->xl<=sp->me.x && fs->xh>=sp->me.x && + fs->yl<=sp->me.y && fs->yh >= sp->me.y ) { + fs->p->sp = sp; + fs->p->spline = NULL; + fs->p->anysel = true; + fs->p->spl = spl; + if ( !fs->seek_controls ) +return( true ); + } + if ( sp->selected && fs->select_controls ) { + if ( fs->xl<=sp->nextcp.x && fs->xh>=sp->nextcp.x && + fs->yl<=sp->nextcp.y && fs->yh >= sp->nextcp.y ) { + fs->p->sp = sp; + fs->p->spline = NULL; + fs->p->spl = spl; + fs->p->nextcp = true; + fs->p->anysel = true; + fs->p->cp = sp->nextcp; + if ( sp->nonextcp && sp->pointtype==pt_curve ) { + fs->p->cp.x = sp->me.x + (sp->me.x-sp->prevcp.x); + fs->p->cp.y = sp->me.y + (sp->me.y-sp->prevcp.y); + } +return( true ); + } else if ( fs->xl<=sp->prevcp.x && fs->xh>=sp->prevcp.x && + fs->yl<=sp->prevcp.y && fs->yh >= sp->prevcp.y ) { + fs->p->sp = sp; + fs->p->spline = NULL; + fs->p->spl = spl; + fs->p->prevcp = true; + fs->p->anysel = true; + fs->p->cp = sp->prevcp; + if ( sp->noprevcp && sp->pointtype==pt_curve ) { + fs->p->cp.x = sp->me.x + (sp->me.x-sp->nextcp.x); + fs->p->cp.y = sp->me.y + (sp->me.y-sp->nextcp.y); + } +return( true ); + } + } +return( false ); +} + +static int CheckSpline(FindSel *fs, Spline *spline, SplineSet *spl) { + + /* Anything else is better than a spline */ + if ( fs->p->anysel ) +return( false ); + + if ( NearSpline(fs,spline)) { + fs->p->spline = spline; + fs->p->spl = spl; + fs->p->anysel = true; +return( false /*true*/ ); /* Check if there's a point where we are first */ + /* if there is use it, if not (because anysel is true) we'll fall back */ + /* here */ + } +return( false ); +} + +static int InImage( FindSel *fs, ImageList *img) { + int x,y; + + x = floor((fs->p->cx-img->xoff)/img->xscale); + y = floor((img->yoff-fs->p->cy)/img->yscale); + if ( x<0 || y<0 || x>=GImageGetWidth(img->image) || y>=GImageGetHeight(img->image)) +return ( false ); + if ( GImageGetPixelColor(img->image,x,y)&0x80000000 ) /* Transparent */ +return( false ); + +return( true ); +} + +static int InSplineSet( FindSel *fs, SplinePointList *set) { + SplinePointList *spl; + Spline *spline, *first; + + for ( spl = set; spl!=NULL; spl = spl->next ) { + if ( CheckPoint(fs,spl->first,spl) && ( !fs->seek_controls || fs->p->nextcp || fs->p->prevcp )) { +return( true ); + } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( (CheckPoint(fs,spline->to,spl) && ( !fs->seek_controls || fs->p->nextcp || fs->p->prevcp )) || + ( CheckSpline(fs,spline,spl) && !fs->seek_controls )) { +return( true ); + } + if ( first==NULL ) first = spline; + } + } +return( fs->p->anysel ); +} + +static int NearSplineSetPoints( FindSel *fs, SplinePointList *set) { + SplinePointList *spl; + Spline *spline, *first; + + for ( spl = set; spl!=NULL; spl = spl->next ) { + if ( CheckPoint(fs,spl->first,spl)) { +return( true ); + } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( CheckPoint(fs,spline->to,spl) ) { +return( true ); + } + if ( first==NULL ) first = spline; + } + } +return( fs->p->anysel ); +} + +static void SetFS( FindSel *fs, PressedOn *p, CharView *cv, GEvent *event) { + extern float snapdistance; + + memset(p,'\0',sizeof(PressedOn)); + p->pressed = true; + + memset(fs,'\0',sizeof(*fs)); + fs->p = p; + fs->e = event; + p->x = event->u.mouse.x; + p->y = event->u.mouse.y; + p->cx = (event->u.mouse.x-cv->xoff)/cv->scale; + p->cy = (cv->height-event->u.mouse.y-cv->yoff)/cv->scale; + + fs->fudge = snapdistance/cv->scale; /* 3.5 pixel fudge */ + fs->xl = p->cx - fs->fudge; + fs->xh = p->cx + fs->fudge; + fs->yl = p->cy - fs->fudge; + fs->yh = p->cy + fs->fudge; +} + +static GEvent *CVConstrainedMouseDown(CharView *cv,GEvent *event, GEvent *fake) { + SplinePoint *base; + int basex, basey, dx, dy; + int sign; + + base = CVAnySelPoint(cv); + if ( base==NULL ) +return( event ); + + basex = cv->xoff + rint(base->me.x*cv->scale); + basey = -cv->yoff + cv->height - rint(base->me.y*cv->scale); + + dx= event->u.mouse.x-basex, dy = event->u.mouse.y-basey; + sign = dx*dy<0?-1:1; + + fake->u.mouse = event->u.mouse; + if ( dx<0 ) dx = -dx; if ( dy<0 ) dy = -dy; + if ( dy >= 2*dx ) { + cv->p.x = fake->u.mouse.x = basex; + cv->p.cx = base->me.x; + if ( !(event->u.mouse.state&ksm_meta) && + ItalicConstrained && cv->sc->parent->italicangle!=0 ) { + cv->p.cx -= tan(cv->sc->parent->italicangle*3.1415926535897932/180)* + (cv->p.cy-base->me.y); + cv->p.x = fake->u.mouse.x = cv->xoff + rint(cv->p.cx*cv->scale); + } + } else if ( dx >= 2*dy ) { + fake->u.mouse.y = basey; + cv->p.cy = base->me.y; + } else if ( dx > dy ) { + fake->u.mouse.x = basex + sign * (event->u.mouse.y-cv->p.y); + cv->p.cx = base->me.x - sign * (cv->p.cy-base->me.y); + } else { + fake->u.mouse.y = basey + sign * (event->u.mouse.x-cv->p.x); + cv->p.cy = base->me.y - sign * (cv->p.cx-base->me.x); + } + +return( fake ); +} + +static void CVSetConstrainPoint(CharView *cv, GEvent *event) { + SplineSet *sel; + + if ( (sel = CVAnySelPointList(cv))!=NULL ) { + if ( sel->first->selected ) cv->p.constrain = sel->first->me; + else cv->p.constrain = sel->last->me; + } else if ( cv->p.sp!=NULL ) { + cv->p.constrain = cv->p.sp->me; + } else { + cv->p.constrain.x = cv->info.x; + cv->p.constrain.y = cv->info.y; + } +} + +static void CVDoSnaps(CharView *cv, FindSel *fs) { + PressedOn *p = fs->p; + +#if 1 + if ( cv->drawmode!=dm_grid && cv->layerheads[dm_grid]->splines!=NULL ) { + PressedOn temp; + int oldseek = fs->seek_controls; + temp = *p; + fs->p = &temp; + fs->seek_controls = false; + if ( InSplineSet( fs, cv->layerheads[dm_grid]->splines)) { + if ( temp.spline!=NULL ) { + p->cx = ((temp.spline->splines[0].a*temp.t+ + temp.spline->splines[0].b)*temp.t+ + temp.spline->splines[0].c)*temp.t+ + temp.spline->splines[0].d; + p->cy = ((temp.spline->splines[1].a*temp.t+ + temp.spline->splines[1].b)*temp.t+ + temp.spline->splines[1].c)*temp.t+ + temp.spline->splines[1].d; + } else if ( temp.sp!=NULL ) { + p->cx = temp.sp->me.x; + p->cy = temp.sp->me.y; + } + } + fs->p = p; + fs->seek_controls = oldseek; + } +#endif + if ( p->cx>-fs->fudge && p->cxfudge ) + p->cx = 0; + else if ( p->cx>cv->sc->width-fs->fudge && p->cxsc->width+fs->fudge && + !cv->widthsel) + p->cx = cv->sc->width; + else if ( cv->widthsel && p!=&cv->p && + p->cx>cv->oldwidth-fs->fudge && p->cxoldwidth+fs->fudge ) + p->cx = cv->oldwidth; +#if 0 + else if ( cv->sc->parent->hsnaps!=NULL && cv->drawmode!=dm_grid ) { + int i, *hsnaps = cv->sc->parent->hsnaps; + for ( i=0; hsnaps[i]!=0x80000000; ++i ) { + if ( p->cx>hsnaps[i]-fs->fudge && p->cxfudge ) { + p->cx = hsnaps[i]; + break; + } + } + } +#endif + if ( p->cy>-fs->fudge && p->cyfudge ) + p->cy = 0; +#if 0 + else if ( cv->sc->parent->vsnaps!=NULL && cv->drawmode!=dm_grid ) { + int i, *vsnaps = cv->sc->parent->vsnaps; + for ( i=0; vsnaps[i]!=0x80000000; ++i ) { + if ( p->cy>vsnaps[i]-fs->fudge && p->cyfudge ) { + p->cy = vsnaps[i]; + break; + } + } + } +#endif +} + +static int _CVTestSelectFromEvent(CharView *cv,FindSel *fs) { + PressedOn temp; + ImageList *img; + + if ( !InSplineSet(fs,cv->layerheads[cv->drawmode]->splines)) { + if ( cv->drawmode==dm_fore) { + RefChar *rf; + temp = cv->p; + fs->p = &temp; + fs->seek_controls = false; + for ( rf=cv->sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) { + if ( InSplineSet(fs,rf->layers[0].splines)) { + cv->p.ref = rf; + cv->p.anysel = true; + break; + } + } + if ( cv->showanchor && !cv->p.anysel ) { + AnchorPoint *ap, *found=NULL; + /* I do this pecular search because: */ + /* 1) I expect there to be lots of times we get multiple */ + /* anchors at the same location */ + /* 2) The anchor points are drawn so that the bottommost */ + /* is displayed */ + for ( ap=cv->sc->anchor; ap!=NULL; ap=ap->next ) + if ( fs->xl<=ap->me.x && fs->xh>=ap->me.x && + fs->yl<=ap->me.y && fs->yh >= ap->me.y ) + found = ap; + if ( found!=NULL ) { + cv->p.ap = found; + cv->p.anysel = true; + } + } + } + for ( img = cv->layerheads[cv->drawmode]->images; img!=NULL; img=img->next ) { + if ( InImage(fs,img)) { + cv->p.img = img; + cv->p.anysel = true; + break; + } + } + } +return( cv->p.anysel ); +} + +int CVTestSelectFromEvent(CharView *cv,GEvent *event) { + FindSel fs; + + SetFS(&fs,&cv->p,cv,event); +return( _CVTestSelectFromEvent(cv,&fs)); +} + +static void CVMouseDown(CharView *cv, GEvent *event ) { + FindSel fs; + GEvent fake; + + if ( event->u.mouse.button==2 && event->u.mouse.device!=NULL && + strcmp(event->u.mouse.device,"stylus")==0 ) +return; /* I treat this more like a modifier key change than a button press */ + + if ( cv->expandedge != ee_none ) + GDrawSetCursor(cv->v,ct_mypointer); + if ( event->u.mouse.button==3 ) { + CVToolsPopup(cv,event); +return; + } + CVToolsSetCursor(cv,event->u.mouse.state|(1<<(7+event->u.mouse.button)), event->u.mouse.device ); + cv->active_tool = cv->showing_tool; + cv->needsrasterize = false; + cv->recentchange = false; + + SetFS(&fs,&cv->p,cv,event); + if ( event->u.mouse.state&ksm_shift ) + event = CVConstrainedMouseDown(cv,event,&fake); + + if ( cv->active_tool == cvt_pointer ) { + fs.select_controls = true; + if ( event->u.mouse.state&ksm_meta ) fs.seek_controls = true; + cv->lastselpt = NULL; + _CVTestSelectFromEvent(cv,&fs); + fs.p = &cv->p; + } else if ( cv->active_tool == cvt_curve || cv->active_tool == cvt_corner || + cv->active_tool == cvt_tangent || cv->active_tool == cvt_pen ) { + InSplineSet(&fs,cv->layerheads[cv->drawmode]->splines); + if ( fs.p->sp==NULL && fs.p->spline==NULL ) + CVDoSnaps(cv,&fs); + } else { + NearSplineSetPoints(&fs,cv->layerheads[cv->drawmode]->splines); + if ( fs.p->sp==NULL && fs.p->spline==NULL ) + CVDoSnaps(cv,&fs); + } + + cv->e.x = event->u.mouse.x; cv->e.y = event->u.mouse.y; + if ( cv->p.sp!=NULL ) { + BasePoint *p; + if ( cv->p.nextcp ) + p = &cv->p.sp->nextcp; + else if ( cv->p.prevcp ) + p = &cv->p.sp->prevcp; + else + p = &cv->p.sp->me; + cv->info.x = p->x; + cv->info.y = p->y; + cv->p.cx = p->x; cv->p.cy = p->y; + } else { + cv->info.x = cv->p.cx; + cv->info.y = cv->p.cy; + } + cv->info_within = true; + CVInfoDraw(cv,cv->gw); + CVSetConstrainPoint(cv,event); + + switch ( cv->active_tool ) { + case cvt_pointer: + CVMouseDownPointer(cv, &fs, event); + cv->lastselpt = fs.p->sp; + break; + case cvt_magnify: case cvt_minify: + break; + case cvt_hand: + CVMouseDownHand(cv); + break; + case cvt_freehand: + CVMouseDownFreeHand(cv,event); + break; + case cvt_curve: case cvt_corner: case cvt_tangent: case cvt_pen: + CVMouseDownPoint(cv); + break; + case cvt_ruler: + CVMouseDownRuler(cv,event); + break; + case cvt_rotate: case cvt_flip: case cvt_scale: case cvt_skew: + CVMouseDownTransform(cv); + break; + case cvt_knife: + CVMouseDownKnife(cv); + break; + case cvt_rect: case cvt_elipse: case cvt_poly: case cvt_star: + CVMouseDownShape(cv); + break; + } +} + +int SCNumberPoints(SplineChar *sc) { + int pnum=0; + SplineSet *ss; + SplinePoint *sp; + int starts_with_cp, startcnt; + + for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + starts_with_cp = (ss->first->ttfindex == pnum+1 || ss->first->ttfindex==0xffff) && + !ss->first->noprevcp; + startcnt = pnum; + if ( starts_with_cp ) ++pnum; + for ( sp=ss->first; ; ) { + if ( ((sc->ttf_instrs!=NULL && sp->ttfindex==0xffff) || + ( sp!=ss->first && !sp->nonextcp && !sp->noprevcp && + !sp->roundx && !sp->roundy && !sp->dontinterpolate && + sc->ttf_instrs==NULL )) && + (sp->nextcp.x+sp->prevcp.x)/2 == sp->me.x && + (sp->nextcp.y+sp->prevcp.y)/2 == sp->me.y ) + sp->ttfindex = 0xffff; + else + sp->ttfindex = pnum++; + if ( sc->ttf_instrs!=NULL && sp->nextcpindex!=0xffff ) { + if ( sp->nextcpindex!=startcnt || !starts_with_cp ) + sp->nextcpindex = pnum++; + } else if ( !sp->nonextcp ) { + if ( sp->next==NULL || sp->next->to!=ss->first ) + sp->nextcpindex = pnum++; + } else + sp->nextcpindex = 0xffff; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +return( pnum ); +} + +static void instrcheck(SplineChar *sc) { + int pnum=0, skipit, bad=false; + SplineSet *ss; + SplinePoint *sp; + int starts_with_cp; + + if ( sc->ttf_instrs==NULL ) +return; + /* If the points are no longer in order then the instructions are not valid */ + /* (because they'll refer to the wrong points) and should be removed */ + for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + starts_with_cp = (ss->first->ttfindex == pnum+1 || ss->first->ttfindex==0xffff) && + !ss->first->noprevcp; + if ( starts_with_cp ) ++pnum; + for ( sp=ss->first; ; ) { + skipit = sp!=ss->first && !sp->nonextcp && !sp->noprevcp && + !sp->roundx && !sp->roundy && !sp->dontinterpolate && + (sp->nextcp.x+sp->prevcp.x)/2 == sp->me.x && + (sp->nextcp.y+sp->prevcp.y)/2 == sp->me.y; + if ( sp->ttfindex==0xffff && skipit ) + /* Doesn't count */; + else if ( sp->ttfindex!=pnum || skipit ) + bad = true; + else + ++pnum; + if ( sp->nonextcp && sp->nextcpindex==0xffff ) + /* Doesn't count */; + else if ( sp->nextcpindex==pnum ) + ++pnum; + else + bad = true; + if ( bad ) { + free(sc->ttf_instrs); sc->ttf_instrs = NULL; + sc->ttf_instrs_len = 0; + SCMarkInstrDlgAsChanged(sc); +return; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + if ( starts_with_cp ) --pnum; + } +} + +void CVSetCharChanged(CharView *cv,int changed) { + FontView *fv = cv->fv; + SplineFont *sf = fv->sf; + SplineChar *sc = cv->sc; + + if ( cv->drawmode==dm_grid ) { + if ( changed ) { + sf->changed = true; + if ( fv->cidmaster!=NULL ) + fv->cidmaster->changed = true; + } + } else { + if ( cv->drawmode==dm_fore ) + sf->onlybitmaps = false; + if ( sc->changed != changed ) { + sc->changed = changed; + FVToggleCharChanged(sc); + SCRefreshTitles(sc); + if ( changed ) { + sf->changed = true; + if ( fv->cidmaster!=NULL ) + fv->cidmaster->changed = true; + if ( changed && sc->ttf_instrs ) + instrcheck(sc); + if ( changed ) + SCDeGridFit(sc); + } + } + if ( changed ) { + sc->changed_since_autosave = true; + sf->changed_since_autosave = true; + sf->changed_since_xuidchanged = true; + if ( fv->cidmaster!=NULL ) { + fv->cidmaster->changed_since_autosave = true; + fv->cidmaster->changed_since_xuidchanged = true; + } + } + if ( cv->drawmode==dm_fore ) { + if ( changed ) + sc->changed_since_search = cv->sc->changedsincelasthinted = true; + cv->needsrasterize = true; + } + } + cv->recentchange = true; +} + +void SCClearSelPt(SplineChar *sc) { + CharView *cv; + + for ( cv=sc->views; cv!=NULL; cv=cv->next ) { + cv->lastselpt = cv->p.sp = NULL; + } +} + +void _SCCharChangedUpdate(SplineChar *sc,int changed) { + SplineFont *sf = sc->parent; + extern int updateflex; + + if ( changed != -1 ) { + sc->changed_since_autosave = true; + if ( sc->changed!=changed ) { + sc->changed = changed; + FVToggleCharChanged(sc); + SCRefreshTitles(sc); + if ( changed && sc->ttf_instrs ) + instrcheck(sc); + if ( changed ) + SCDeGridFit(sc); + } + sc->changedsincelasthinted = true; + sc->changed_since_search = true; + sf->changed = true; + sf->changed_since_autosave = true; + sf->changed_since_xuidchanged = true; + } + if ( sf->cidmaster!=NULL ) + sf->cidmaster->changed = sf->cidmaster->changed_since_autosave = + sf->cidmaster->changed_since_xuidchanged = true; + SCRegenDependents(sc); /* All chars linked to this one need to get the new splines */ + if ( updateflex && sc->views!=NULL ) + SplineCharIsFlexible(sc); + SCUpdateAll(sc); +#ifdef FONTFORGE_CONFIG_TYPE3 + SCLayersChange(sc); +#endif + SCRegenFills(sc); + if ( sf->fv!=NULL ) + FVRegenChar(sf->fv,sc); +} + +void SCCharChangedUpdate(SplineChar *sc) { + _SCCharChangedUpdate(sc,true); +} + +void _CVCharChangedUpdate(CharView *cv,int changed) { + extern int updateflex; + + CVSetCharChanged(cv,changed); +#ifdef FONTFORGE_CONFIG_TYPE3 + CVLayerChange(cv); +#endif + if ( cv->needsrasterize ) { + SCRegenDependents(cv->sc); /* All chars linked to this one need to get the new splines */ + if ( updateflex ) + SplineCharIsFlexible(cv->sc); + SCUpdateAll(cv->sc); + SCRegenFills(cv->sc); + FVRegenChar(cv->fv,cv->sc); + cv->needsrasterize = false; + } else if ( cv->drawmode==dm_back ) { + /* If we changed the background then only views of this character */ + /* need to know about it. No dependents needed, but why write */ + /* another routine for a rare case... */ + SCUpdateAll(cv->sc); + } else if ( cv->drawmode==dm_grid ) { + /* If we changed the grid then any character needs to know it */ + FVRedrawAllCharViews(cv->fv); + } + cv->recentchange = false; + cv->p.sp = NULL; /* Might have been deleted */ +} + +void CVCharChangedUpdate(CharView *cv) { + _CVCharChangedUpdate(cv,true); +} + +static void CVMouseMove(CharView *cv, GEvent *event ) { + real cx, cy; + PressedOn p; + FindSel fs; + GEvent fake; + int stop_motion = false; + +#if 0 /* Debug wacom !!!! */ + printf( "dev=%s (%d,%d) 0x%x\n", event->u.mouse.device!=NULL?event->u.mouse.device:"", + event->u.mouse.x, event->u.mouse.y, event->u.mouse.state); +#endif + + if ( event->u.mouse.device!=NULL ) + CVToolsSetCursor(cv,event->u.mouse.state,event->u.mouse.device); + + if ( !cv->p.pressed ) { + CVUpdateInfo(cv, event); + if ( cv->showing_tool == cvt_pointer ) + CVCheckResizeCursors(cv); + else if ( cv->showing_tool == cvt_ruler ) + CVMouseMoveRuler(cv,event); +return; + } + + SetFS(&fs,&p,cv,event); + if ( cv->active_tool == cvt_freehand ) + /* freehand does it's own kind of constraining */; + else if ( (event->u.mouse.state&ksm_shift) && !cv->p.rubberbanding ) { + /* Constrained */ + + fake.u.mouse = event->u.mouse; + if ( ((event->u.mouse.state&ksm_meta) || + (!cv->cntrldown && (event->u.mouse.state&ksm_control))) && + (cv->p.nextcp || cv->p.prevcp)) { + real dot = (cv->p.cp.x-cv->p.constrain.x)*(p.cx-cv->p.constrain.x) + + (cv->p.cp.y-cv->p.constrain.y)*(p.cy-cv->p.constrain.y); + real len = (cv->p.cp.x-cv->p.constrain.x)*(cv->p.cp.x-cv->p.constrain.x)+ + (cv->p.cp.y-cv->p.constrain.y)*(cv->p.cp.y-cv->p.constrain.y); + if ( len!=0 ) { + dot /= len; + /* constrain control point to same angle with respect to base point*/ + if ( dot<0 ) dot = 0; + p.cx = cv->p.constrain.x + dot*(cv->p.cp.x-cv->p.constrain.x); + p.cy = cv->p.constrain.y + dot*(cv->p.cp.y-cv->p.constrain.y); + p.x = fake.u.mouse.x = cv->xoff + rint(p.cx*cv->scale); + p.y = fake.u.mouse.y = -cv->yoff + cv->height - rint(p.cy*cv->scale); + } + } else { + /* Constrain mouse to hor/vert/45 from base point */ + int basex = cv->active_tool!=cvt_hand ? cv->xoff + rint(cv->p.constrain.x*cv->scale) : cv->p.x; + int basey = cv->active_tool!=cvt_hand ?-cv->yoff + cv->height - rint(cv->p.constrain.y*cv->scale) : cv->p.y; + int dx= event->u.mouse.x-basex, dy = event->u.mouse.y-basey; + int sign = dx*dy<0?-1:1; + + if ( dx<0 ) dx = -dx; if ( dy<0 ) dy = -dy; + if ( dy >= 2*dx ) { + p.x = fake.u.mouse.x = basex; + p.cx = cv->p.constrain.x; + if ( ItalicConstrained && cv->sc->parent->italicangle!=0 ) { + p.cx -= tan(cv->sc->parent->italicangle*3.1415926535897932/180)* + (p.cy-cv->p.constrain.y); + p.x = fake.u.mouse.x = cv->xoff + rint(p.cx*cv->scale); + } + } else if ( dx >= 2*dy ) { + p.y = fake.u.mouse.y = basey; + p.cy = cv->p.constrain.y; + } else if ( dx > dy ) { + p.x = fake.u.mouse.x = basex + sign * (event->u.mouse.y-basey); + p.cx = cv->p.constrain.x - sign * (p.cy-cv->p.constrain.y); + } else { + p.y = fake.u.mouse.y = basey + sign * (event->u.mouse.x-basex); + p.cy = cv->p.constrain.y - sign * (p.cx-cv->p.constrain.x); + } + } + event = &fake; + } + + /* If we've changed the character (recentchange is true) we want to */ + /* snap to the original location, otherwise we'll keep snapping to the */ + /* current point as it moves across the screen (jerkily) */ + if ( cv->active_tool == cvt_hand || cv->active_tool == cvt_freehand ) + /* Don't snap to points */; + else if ( cv->active_tool == cvt_pointer && + ( cv->p.nextcp || cv->p.prevcp)) + /* Don't snap to points when moving control points */; + else if ( !cv->joinvalid || !CheckPoint(&fs,&cv->joinpos,NULL)) { + SplinePointList *spl; + spl = cv->layerheads[cv->drawmode]->splines; + if ( cv->recentchange && cv->active_tool==cvt_pointer && + cv->layerheads[cv->drawmode]->undoes!=NULL && + (cv->layerheads[cv->drawmode]->undoes->undotype==ut_state || + cv->layerheads[cv->drawmode]->undoes->undotype==ut_tstate )) + spl = cv->layerheads[cv->drawmode]->undoes->u.state.splines; + if ( cv->active_tool != cvt_knife ) + NearSplineSetPoints(&fs,spl); + else + InSplineSet(&fs,spl); + } + if ( p.sp!=NULL && p.sp!=cv->active_sp ) { /* Snap to points */ + p.cx = p.sp->me.x; + p.cy = p.sp->me.y; + } else { + CVDoSnaps(cv,&fs); + } + cx = (p.cx -cv->p.cx) / cv->scale; + cy = (p.cy - cv->p.cy) / cv->scale; + if ( cx<0 ) cx = -cx; + if ( cy<0 ) cy = -cy; + + /* If they haven't moved far from the start point, then snap to it */ + if ( cx+cy < 4 ) { + p.x = cv->p.x; p.y = cv->p.y; + } + + cv->info.x = p.cx; cv->info.y = p.cy; + cv->info_sp = p.sp; + cv->e.x = event->u.mouse.x; cv->e.y = event->u.mouse.y; + CVInfoDraw(cv,cv->gw); + + switch ( cv->active_tool ) { + case cvt_pointer: + stop_motion = CVMouseMovePointer(cv); + break; + case cvt_magnify: case cvt_minify: + if ( !cv->p.rubberbanding ) { + cv->p.ex = cv->p.cx; + cv->p.ey = cv->p.cy; + } + if ( cv->p.rubberbanding ) + CVDrawRubberRect(cv->v,cv); + cv->p.ex = cv->info.x; + cv->p.ey = cv->info.y; + cv->p.rubberbanding = true; + CVDrawRubberRect(cv->v,cv); + break; + case cvt_hand: + CVMouseMoveHand(cv,event); + break; + case cvt_freehand: + CVMouseMoveFreeHand(cv,event); + break; + case cvt_curve: case cvt_corner: case cvt_tangent: + CVMouseMovePoint(cv,&p); + break; + case cvt_pen: + CVMouseMovePen(cv,&p); + break; + case cvt_ruler: + CVMouseMoveRuler(cv,event); + break; + case cvt_rotate: case cvt_flip: case cvt_scale: case cvt_skew: + CVMouseMoveTransform(cv); + break; + case cvt_knife: + CVMouseMoveKnife(cv,&p); + break; + case cvt_rect: case cvt_elipse: case cvt_poly: case cvt_star: + CVMouseMoveShape(cv); + break; + } + if ( stop_motion ) { + event->type = et_mouseup; + CVMouseUp(cv,event); + } +} + +static void CVMagnify(CharView *cv, real midx, real midy, int bigger) { + static float scales[] = { 1, 2, 3, 4, 6, 8, 11, 16, 23, 32, 45, 64, 90, 128, 181, 256, 512, 1024, 0 }; + int i, j; + + if ( bigger!=0 ) { + if ( cv->scale>=1 ) { + for ( i=0; scales[i]!=0 && cv->scale>scales[i]; ++i ); + if ( scales[i]==0 ) i=j= i-1; + else if ( RealNear(scales[i],cv->scale) ) j=i; + else if ( i!=0 && RealNear(scales[i-1],cv->scale) ) j= --i; /* Round errors! */ + else j = i-1; + } else { real sinv = 1/cv->scale; int t; + for ( i=0; scales[i]!=0 && sinv>scales[i]; ++i ); + if ( scales[i]==0 ) i=j= i-1; + else if ( RealNear(scales[i],sinv) ) j=i; + else if ( i!=0 && RealNear(scales[i-1],sinv) ) j= --i; /* Round errors! */ + else j = i-1; + t = j; + j = -i; i = -t; + } + if ( bigger==1 ) { + if ( i==j ) ++i; + if ( i>0 && scales[i]==0 ) --i; + if ( i>=0 ) + cv->scale = scales[i]; + else + cv->scale = 1/scales[-i]; + } else { + if ( i==j ) --j; + if ( j<0 && scales[-j]==0 ) ++j; + if ( j>=0 ) + cv->scale = scales[j]; + else + cv->scale = 1/scales[-j]; + } + } + cv->xoff = -(rint(midx*cv->scale) - cv->width/2); + cv->yoff = -(rint(midy*cv->scale) - cv->height/2); + CVNewScale(cv); +} + +static void CVMouseUp(CharView *cv, GEvent *event ) { + + CVMouseMove(cv,event); + if ( cv->pressed!=NULL ) { + GDrawCancelTimer(cv->pressed); + cv->pressed = NULL; + } + + if ( cv->p.rubberbanding ) { + CVDrawRubberRect(cv->v,cv); + cv->p.rubberbanding = false; + } else if ( cv->p.rubberlining ) { + CVDrawRubberLine(cv->v,cv); + cv->p.rubberlining = false; + } + switch ( cv->active_tool ) { + case cvt_pointer: + CVMouseUpPointer(cv); + break; + case cvt_ruler: + CVMouseUpRuler(cv,event); + break; + case cvt_hand: + CVMouseUpHand(cv); + break; + case cvt_freehand: + CVMouseUpFreeHand(cv,event); + break; + case cvt_curve: case cvt_corner: case cvt_tangent: case cvt_pen: + CVMouseUpPoint(cv,event); + break; + case cvt_magnify: case cvt_minify: + if ( cv->p.x>=event->u.mouse.x-6 && cv->p.x<=event->u.mouse.x+6 && + cv->p.y>=event->u.mouse.y-6 && cv->p.y<=event->u.mouse.y+6 ) { + real cx, cy; + cx = (event->u.mouse.x-cv->xoff)/cv->scale ; + cy = (cv->height-event->u.mouse.y-cv->yoff)/cv->scale ; + CVMagnify(cv,cx,cy,cv->active_tool==cvt_minify?-1:1); + } else { + DBounds b; + if ( cv->p.cx>cv->info.x ) { + b.minx = cv->info.x; + b.maxx = cv->p.cx; + } else { + b.minx = cv->p.cx; + b.maxx = cv->info.x; + } + if ( cv->p.cy>cv->info.y ) { + b.miny = cv->info.y; + b.maxy = cv->p.cy; + } else { + b.miny = cv->p.cy; + b.maxy = cv->info.y; + } + _CVFit(cv,&b); + } + break; + case cvt_rotate: case cvt_flip: case cvt_scale: case cvt_skew: + CVMouseUpTransform(cv); + break; + case cvt_knife: + CVMouseUpKnife(cv); + break; + case cvt_rect: case cvt_elipse: case cvt_poly: case cvt_star: + CVMouseUpShape(cv); + break; + } + cv->active_tool = cvt_none; + CVToolsSetCursor(cv,event->u.mouse.state&~(1<<(7+event->u.mouse.button)),event->u.mouse.device); /* X still has the buttons set in the state, even though we just released them. I don't want em */ + cv->p.pressed = false; + if ( cv->needsrasterize || cv->recentchange ) + CVCharChangedUpdate(cv); +} + +static void CVTimer(CharView *cv,GEvent *event) { + + if ( event->u.timer.timer==cv->pressed ) { + GEvent e; + GDrawGetPointerPosition(cv->v,&e); + if ( e.u.mouse.x<0 || e.u.mouse.y<0 || + e.u.mouse.x>=cv->width || e.u.mouse.y >= cv->height ) { + real dx = 0, dy = 0; + if ( e.u.mouse.x<0 ) + dx = cv->width/8; + else if ( e.u.mouse.x>=cv->width ) + dx = -cv->width/8; + if ( e.u.mouse.y<0 ) + dy = -cv->height/8; + else if ( e.u.mouse.y>=cv->height ) + dy = cv->height/8; + cv->xoff += dx; cv->yoff += dy; + cv->back_img_out_of_date = true; + if ( dy!=0 ) + GScrollBarSetPos(cv->vsb,cv->yoff-cv->height); + if ( dx!=0 ) + GScrollBarSetPos(cv->hsb,-cv->xoff); + GDrawRequestExpose(cv->v,NULL,false); + } +#if _ModKeysAutoRepeat + /* Under cygwin the modifier keys auto repeat, they don't under normal X */ + } else if ( cv->autorpt==event->u.timer.timer ) { + cv->autorpt = NULL; + CVToolsSetCursor(cv,cv->oldstate,NULL); + if ( cv->keysym == GK_Shift_L || cv->keysym == GK_Shift_R || + cv->keysym == GK_Alt_L || cv->keysym == GK_Alt_R || + cv->keysym == GK_Meta_L || cv->keysym == GK_Meta_R ) { + GEvent e; + e.w = cv->oldkeyw; + e.u.chr.keysym = cv->keysym; + e.u.chr.x = cv->oldkeyx; + e.u.chr.y = cv->oldkeyy; + CVFakeMove(cv,&e); + } +#endif + } +} + +static void CVDrop(CharView *cv,GEvent *event) { + /* We should get a list of character names. Add each as a RefChar */ + int32 len; + int ch, first = true; + char *start, *pt, *cnames; + SplineChar *rsc; + RefChar *new; + + if ( cv->drawmode!=dm_fore ) { + GWidgetErrorR(_STR_NotForeground,_STR_RefsOnlyFore); +return; + } + if ( !GDrawSelectionHasType(cv->gw,sn_drag_and_drop,"STRING")) +return; + cnames = GDrawRequestSelection(cv->gw,sn_drag_and_drop,"STRING",&len); + if ( cnames==NULL ) +return; + + start = cnames; + while ( *start ) { + while ( *start==' ' ) ++start; + if ( *start=='\0' ) + break; + for ( pt=start; *pt && *pt!=' '; ++pt ); + ch = *pt; *pt = '\0'; + if ( (rsc=SFGetChar(cv->sc->parent,-1,start))!=NULL && rsc!=cv->sc ) { + if ( first ) { + CVPreserveState(cv); + first =false; + } + new = RefCharCreate(); + new->transform[0] = new->transform[3] = 1.0; + new->layers[0].splines = NULL; + new->sc = rsc; + new->next = cv->sc->layers[ly_fore].refs; + cv->sc->layers[ly_fore].refs = new; + SCReinstanciateRefChar(cv->sc,new); + SCMakeDependent(cv->sc,rsc); + } + *pt = ch; + start = pt; + } + + free(cnames); + CVCharChangedUpdate(cv); +} + +static int v_e_h(GWindow gw, GEvent *event) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + if ( !(event->u.mouse.state&(ksm_shift|ksm_control)) ) /* bind shift to magnify/minify */ +return( GGadgetDispatchEvent(cv->vsb,event)); + } + + switch ( event->type ) { + case et_expose: + GDrawSetLineWidth(gw,0); + CVExpose(cv,gw,event); + break; + case et_crossing: + CVCrossing(cv,event); + break; + case et_mousedown: + CVPaletteActivate(cv); + GDrawSetGIC(gw,cv->gic,0,20); + if ( cv->inactive ) + SVMakeActive(cv->searcher,cv); + CVMouseDown(cv,event); + break; + case et_mousemove: + if ( cv->p.pressed ) + GDrawSkipMouseMoveEvents(cv->v,event); + CVMouseMove(cv,event); + break; + case et_mouseup: + CVMouseUp(cv,event); + break; + case et_char: + if ( cv->searcher!=NULL ) + SVChar(cv->searcher,event); + else + CVChar(cv,event); + break; + case et_charup: + CVCharUp(cv,event); + break; + case et_timer: + CVTimer(cv,event); + break; + case et_drop: + CVDrop(cv,event); + break; + case et_focus: + if ( event->u.focus.gained_focus ) { + GDrawSetGIC(gw,cv->gic,0,20); +#if 0 + CVPaletteActivate(cv); +#endif + } + break; + } +return( true ); +} + +static void CVDrawNum(CharView *cv,GWindow pixmap,int x, int y, char *format,real val, int align) { + char buffer[40]; + unichar_t ubuf[40]; + int len; + + if ( val==0 ) val=0; /* avoid -0 */ + sprintf(buffer,format,val); + uc_strcpy(ubuf,buffer); + if ( align!=0 ) { + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + if ( align==1 ) + x-=len/2; + else + x-=len; + } + GDrawDrawText(pixmap,x,y,ubuf,-1,NULL,0x000000); +} + +static void CVDrawVNum(CharView *cv,GWindow pixmap,int x, int y, char *format,real val, int align) { + char buffer[40]; + unichar_t ubuf[40], *upt; + int len; + + if ( val==0 ) val=0; /* avoid -0 */ + sprintf(buffer,format,val); + uc_strcpy(ubuf,buffer); + if ( align!=0 ) { + len = strlen(buffer)*cv->sfh; + if ( align==1 ) + y-=len/2; + else + y-=len; + } + for ( upt=ubuf; *upt; ++upt ) { + GDrawDrawText(pixmap,x,y,upt,1,NULL,0x000000); + y += cv->sfh; + } +} + + +static void CVExposeRulers(CharView *cv, GWindow pixmap ) { + real xmin, xmax, ymin, ymax; + real onehundred, pos; + real units, littleunits; + int ybase = cv->mbh+cv->infoh; + int x,y; + GRect rect; + + xmin = -cv->xoff/cv->scale; + xmax = (cv->width-cv->xoff)/cv->scale; + ymin = -cv->yoff/cv->scale; + ymax = (cv->height-cv->yoff)/cv->scale; + onehundred = 100/cv->scale; + + if ( onehundred<5 ) { + units = 1; littleunits=0; + } else if ( onehundred<10 ) { + units = 5; littleunits=1; + } else if ( onehundred<50 ) { + units = 10; littleunits=2; + } else if ( onehundred<100 ) { + units = 25; littleunits=5; + } else if ( onehundred<500 ) { + units = 100; littleunits=20; + } else if ( onehundred<1000 ) { + units = 250; littleunits=50; + } else if ( onehundred<5000 ) { + units = 1000; littleunits=200; + } else if ( onehundred<10000 ) { + units = 2500; littleunits=500; + } else if ( onehundred<10000 ) { + units = 10000; littleunits=2000; + } else { + for ( units=1 ; unitswidth+cv->rulerh; rect.y = ybase; rect.height = cv->rulerh; + GDrawFillRect(pixmap,&rect,GDrawGetDefaultBackground(NULL)); + rect.y = ybase; rect.height = cv->height+cv->rulerh; rect.x = 0; rect.width = cv->rulerh; + GDrawFillRect(pixmap,&rect,GDrawGetDefaultBackground(NULL)); + GDrawSetLineWidth(pixmap,0); + GDrawDrawLine(pixmap,cv->rulerh,cv->mbh+cv->infoh+cv->rulerh-1,8096,cv->mbh+cv->infoh+cv->rulerh-1,0x000000); + GDrawDrawLine(pixmap,cv->rulerh-1,cv->mbh+cv->infoh+cv->rulerh,cv->rulerh-1,8096,0x000000); + + GDrawSetFont(pixmap,cv->small); + if ( xmax-xmin<1 && cv->width>100 ) { + CVDrawNum(cv,pixmap,cv->rulerh,ybase+cv->sas,"%.3f",xmin,0); + CVDrawNum(cv,pixmap,cv->rulerh+cv->width,ybase+cv->sas,"%.3f",xmax,2); + } + if ( ymax-ymin<1 && cv->height>100 ) { + CVDrawVNum(cv,pixmap,1,ybase+cv->rulerh+cv->sas,"%.3f",ymin,0); + CVDrawVNum(cv,pixmap,1,ybase+cv->rulerh+cv->height+cv->sas,"%.3f",ymax,2); + } + if ( fabs(xmin/units) < 1e5 && fabs(ymin/units)<1e5 && fabs(xmax/units)<1e5 && fabs(ymax/units)<1e5 ) { + if ( littleunits!=0 ) { + for ( pos=littleunits*ceil(xmin/littleunits); posxoff + rint(pos*cv->scale); + GDrawDrawLine(pixmap,x+cv->rulerh,ybase+cv->rulerh-4,x+cv->rulerh,ybase+cv->rulerh, 0x000000); + } + for ( pos=littleunits*ceil(ymin/littleunits); posyoff + cv->height - rint(pos*cv->scale); + GDrawDrawLine(pixmap,cv->rulerh-4,ybase+cv->rulerh+y,cv->rulerh,ybase+cv->rulerh+y, 0x000000); + } + } + for ( pos=units*ceil(xmin/units); posxoff + rint(pos*cv->scale); + GDrawDrawLine(pixmap,x+cv->rulerh,ybase+cv->rulerh-6,x+cv->rulerh,ybase+cv->rulerh, 0x000000); + CVDrawNum(cv,pixmap,x+cv->rulerh,ybase+cv->sas,"%g",pos,1); + } + for ( pos=units*ceil(ymin/units); posyoff + cv->height - rint(pos*cv->scale); + GDrawDrawLine(pixmap,cv->rulerh-6,ybase+cv->rulerh+y,cv->rulerh,ybase+cv->rulerh+y, 0x000000); + CVDrawVNum(cv,pixmap,1,y+ybase+cv->rulerh+cv->sas,"%g",pos,1); + } + } +} + +static void InfoExpose(CharView *cv, GWindow pixmap, GEvent *expose) { + GRect old1, old2, r; + + if ( expose->u.expose.rect.y + expose->u.expose.rect.height < cv->mbh || + (!cv->showrulers && expose->u.expose.rect.y >= cv->mbh+cv->infoh )) +return; + + GDrawPushClip(pixmap,&expose->u.expose.rect,&old1); + GDrawSetLineWidth(pixmap,0); + if ( expose->u.expose.rect.y< cv->mbh+cv->infoh ) { + r.x = 0; r.width = 8096; + r.y = cv->mbh; r.height = cv->infoh; + GDrawPushClip(pixmap,&expose->u.expose.rect,&old2); + + GDrawDrawLine(pixmap,0,cv->mbh+cv->infoh-1,8096,cv->mbh+cv->infoh-1,0); + GDrawDrawImage(pixmap,&GIcon_rightpointer,NULL,RPT_BASE,cv->mbh+2); + GDrawDrawImage(pixmap,&GIcon_selectedpoint,NULL,SPT_BASE,cv->mbh+2); + GDrawDrawImage(pixmap,&GIcon_sel2ptr,NULL,SOF_BASE,cv->mbh+2); + GDrawDrawImage(pixmap,&GIcon_distance,NULL,SDS_BASE,cv->mbh+2); + GDrawDrawImage(pixmap,&GIcon_angle,NULL,SAN_BASE,cv->mbh+2); + GDrawDrawImage(pixmap,&GIcon_mag,NULL,MAG_BASE,cv->mbh+2); + CVInfoDrawText(cv,pixmap); + GDrawPopClip(pixmap,&old2); + } + if ( cv->showrulers ) { + CVExposeRulers(cv,pixmap); + cv->olde.x = -1; + CVInfoDrawRulers(cv,pixmap); + } + GDrawPopClip(pixmap,&old1); +} + +void CVResize(CharView *cv ) { + int sbsize = GDrawPointsToPixels(cv->gw,_GScrollBar_Width); + GRect size; + GDrawGetSize(cv->gw,&size); + { + int newwidth = size.width-sbsize, + newheight = size.height-sbsize - cv->mbh-cv->infoh; + int sbwidth = newwidth, sbheight = newheight; + + if ( cv->dv!=NULL ) { + newwidth -= cv->dv->dwidth; + sbwidth -= cv->dv->dwidth; + } + if ( newwidth<30 || newheight<50 ) { + if ( newwidth<30 ) + newwidth = 30+sbsize+(cv->dv!=NULL ? cv->dv->dwidth : 0); + if ( newheight<50 ) + newheight = 50+sbsize+cv->mbh+cv->infoh; + GDrawResize(cv->gw,newwidth,newheight); +return; + } + + if ( cv->dv!=NULL ) { + int dvheight = size.height-(cv->mbh+cv->infoh); + GDrawMove(cv->dv->dv,size.width-cv->dv->dwidth,cv->mbh+cv->infoh); + GDrawResize(cv->dv->dv,cv->dv->dwidth,dvheight); + GDrawResize(cv->dv->ii.v,cv->dv->dwidth-sbsize,dvheight-cv->dv->toph); + GGadgetResize(cv->dv->ii.vsb,sbsize,dvheight-cv->dv->toph); + cv->dv->ii.vheight = dvheight-cv->dv->toph; + GDrawRequestExpose(cv->dv->dv,NULL,false); + GDrawRequestExpose(cv->dv->ii.v,NULL,false); + GScrollBarSetBounds(cv->dv->ii.vsb,0,cv->dv->ii.lheight, + cv->dv->ii.vheight/cv->dv->ii.fh); + } + if ( cv->showrulers ) { + newheight -= cv->rulerh; + newwidth -= cv->rulerh; + } + + if ( newwidth == cv->width && newheight == cv->height ) +return; + if ( cv->backimgs!=NULL ) + GDrawDestroyWindow(cv->backimgs); + cv->backimgs = NULL; + + /* MenuBar takes care of itself */ + GDrawResize(cv->v,newwidth,newheight); + GGadgetMove(cv->vsb,sbwidth, cv->mbh+cv->infoh); + GGadgetResize(cv->vsb,sbsize,sbheight); + GGadgetMove(cv->hsb,0,size.height-sbsize); + GGadgetResize(cv->hsb,sbwidth,sbsize); + cv->width = newwidth; cv->height = newheight; + CVFit(cv); + CVPalettesRaise(cv); + } +} + +static void CVHScroll(CharView *cv,struct sbevent *sb) { + int newpos = cv->xoff; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos += 9*cv->width/10; + break; + case et_sb_up: + newpos += cv->width/15; + break; + case et_sb_down: + newpos -= cv->width/15; + break; + case et_sb_downpage: + newpos -= 9*cv->width/10; + break; + case et_sb_bottom: + newpos = 0; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = -sb->pos; + break; + case et_sb_halfup: + newpos += cv->width/30; + break; + case et_sb_halfdown: + newpos -= cv->width/30; + break; + } + if ( newpos<-(32000*cv->scale-cv->width) ) + newpos = -(32000*cv->scale-cv->width); + if ( newpos>8000*cv->scale ) newpos = 8000*cv->scale; + if ( newpos!=cv->xoff ) { + int diff = newpos-cv->xoff; + cv->xoff = newpos; + cv->back_img_out_of_date = true; + GScrollBarSetPos(cv->hsb,-newpos); + GDrawScroll(cv->v,NULL,diff,0); + if (( cv->showhhints && cv->sc->hstem!=NULL ) || cv->showblues || cv->showvmetrics ) { + GRect r; + r.y = 0; r.height = cv->height; + r.width = 6*cv->sfh+10; + if ( diff>0 ) + r.x = cv->width-r.width; + else + r.x = cv->width+diff-r.width; + GDrawRequestExpose(cv->v,&r,false); + } + if ( cv->showrulers ) { + GRect r; + r.y = cv->infoh+cv->mbh; r.height = cv->rulerh; r.x = 0; r.width = cv->rulerh+cv->width; + GDrawRequestExpose(cv->gw,&r,false); + } + } +} + +static void CVVScroll(CharView *cv,struct sbevent *sb) { + int newpos = cv->yoff; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= 9*cv->height/10; + break; + case et_sb_up: + newpos -= cv->height/15; + break; + case et_sb_down: + newpos += cv->height/15; + break; + case et_sb_downpage: + newpos += 9*cv->height/10; + break; + case et_sb_bottom: + newpos = 0; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos+cv->height; + break; + case et_sb_halfup: + newpos -= cv->height/30; + break; + case et_sb_halfdown: + newpos += cv->height/30; + break; + } + if ( newpos<-(20000*cv->scale-cv->height) ) + newpos = -(20000*cv->scale-cv->height); + if ( newpos>8000*cv->scale ) newpos = 8000*cv->scale; + if ( newpos!=cv->yoff ) { + int diff = newpos-cv->yoff; + cv->yoff = newpos; + cv->back_img_out_of_date = true; + GScrollBarSetPos(cv->vsb,newpos-cv->height); + GDrawScroll(cv->v,NULL,0,diff); + if (( cv->showvhints && cv->sc->vstem!=NULL) || cv->showhmetrics ) { + GRect r; + r.x = 0; r.width = cv->width; + r.height = 2*cv->sfh+6; + if ( diff>0 ) + r.y = 0; + else + r.y = -diff; + GDrawRequestExpose(cv->v,&r,false); + } + if ( cv->showrulers ) { + GRect r; + r.x = 0; r.width = cv->rulerh; r.y = cv->infoh+cv->mbh; r.height = cv->rulerh+cv->height; + GDrawRequestExpose(cv->gw,&r,false); + } + } +} + +void LogoExpose(GWindow pixmap,GEvent *event, GRect *r,enum drawmode dm) { + int sbsize = GDrawPointsToPixels(pixmap,_GScrollBar_Width); + GRect old; + + r->width = r->height = sbsize; + if ( event->u.expose.rect.x+event->u.expose.rect.width >= r->x && + event->u.expose.rect.y+event->u.expose.rect.height >= r->y ) { + /* Put something into the little box where the two scroll bars meet */ + int xoff, yoff; + GImage *which = (dm==dm_fore) ? &GIcon_PfaEditLogo : + (dm==dm_back) ? &GIcon_PfaEditBack : + &GIcon_PfaEditGuide; + struct _GImage *base = which->u.image; + xoff = (sbsize-base->width); + yoff = (sbsize-base->height); + GDrawPushClip(pixmap,r,&old); + GDrawDrawImage(pixmap,which,NULL, + r->x+(xoff-xoff/2),r->y+(yoff-yoff/2)); + GDrawPopClip(pixmap,&old); + /*GDrawDrawLine(pixmap,r->x+sbsize-1,r->y,r->x+sbsize-1,r->y+sbsize,0x000000);*/ + } +} + +static void CVLogoExpose(CharView *cv,GWindow pixmap,GEvent *event) { + int rh = cv->showrulers ? cv->rulerh : 0; + GRect r; + + r.x = cv->width+rh; + r.y = cv->height+cv->mbh+cv->infoh+rh; + LogoExpose(pixmap,event,&r,cv->drawmode); +} + +static int cv_e_h(GWindow gw, GEvent *event) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { +return( GGadgetDispatchEvent(cv->vsb,event)); + } + + switch ( event->type ) { + case et_selclear: + ClipboardClear(); + break; + case et_expose: + GDrawSetLineWidth(gw,0); + InfoExpose(cv,gw,event); + CVLogoExpose(cv,gw,event); + break; + case et_char: + if ( cv->searcher!=NULL ) + SVChar(cv->searcher,event); + else + CVChar(cv,event); + break; + case et_charup: + CVCharUp(cv,event); + break; + case et_resize: + if ( event->u.resize.sized ) + CVResize(cv); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + if ( event->u.control.g == cv->hsb ) + CVHScroll(cv,&event->u.control.u.sb); + else + CVVScroll(cv,&event->u.control.u.sb); + break; + } + break; + case et_map: + if ( event->u.map.is_visible ) + CVPaletteActivate(cv); + else + CVPalettesHideIfMine(cv); + break; + case et_destroy: + CVUnlinkView(cv); + CVPalettesHideIfMine(cv); + if ( cv->backimgs!=NULL ) { + GDrawDestroyWindow(cv->backimgs); + cv->backimgs = NULL; + } + if ( cv->icon!=NULL ) { + GDrawDestroyWindow(cv->icon); + cv->icon = NULL; + } + CharViewFree(cv); + break; + case et_close: + GDrawDestroyWindow(gw); + break; + case et_mouseup: case et_mousedown: + GGadgetEndPopup(); + CVPaletteActivate(cv); + if ( cv->inactive ) + SVMakeActive(cv->searcher,cv); + break; + case et_mousemove: + if ( event->u.mouse.y>cv->mbh ) + SCPreparePopup(cv->gw,cv->sc); + break; + case et_drop: + CVDrop(cv,event); + break; + case et_focus: + if ( event->u.focus.gained_focus ) { + GDrawSetGIC(gw,cv->gic,0,20); +#if 0 + CVPaletteActivate(cv); +#endif + } + break; + } +return( true ); +} + +#define MID_Fit 2001 +#define MID_ZoomIn 2002 +#define MID_ZoomOut 2003 +#define MID_HidePoints 2004 +#define MID_Fill 2006 +#define MID_Next 2007 +#define MID_Prev 2008 +#define MID_HideRulers 2009 +#define MID_NextDef 2012 +#define MID_PrevDef 2013 +#define MID_DisplayCompositions 2014 +#define MID_MarkExtrema 2015 +#define MID_Goto 2016 +#define MID_FindInFontView 2017 +#define MID_KernPairs 2018 +#define MID_AnchorPairs 2019 +#define MID_ShowGridFit 2020 +#define MID_Ligatures 2021 +#define MID_Cut 2101 +#define MID_Copy 2102 +#define MID_Paste 2103 +#define MID_Clear 2104 +#define MID_Merge 2105 +#define MID_SelAll 2106 +#define MID_CopyRef 2107 +#define MID_UnlinkRef 2108 +#define MID_Undo 2109 +#define MID_Redo 2110 +#define MID_CopyWidth 2111 +#define MID_RemoveUndoes 2112 +#define MID_CopyFgToBg 2115 +#define MID_NextPt 2116 +#define MID_PrevPt 2117 +#define MID_FirstPt 2118 +#define MID_NextCP 2119 +#define MID_PrevCP 2120 +#define MID_SelNone 2121 +#define MID_SelectWidth 2122 +#define MID_SelectVWidth 2123 +#define MID_CopyLBearing 2124 +#define MID_CopyRBearing 2125 +#define MID_CopyVWidth 2126 +#define MID_Join 2127 +#define MID_CopyGridFit 2128 +#define MID_Elide 2129 +#define MID_SelectAllPoints 2130 +#define MID_SelectAnchors 2131 +#define MID_FirstPtNextCont 2132 +#define MID_Contours 2133 +#define MID_SelectHM 2134 +#define MID_Clockwise 2201 +#define MID_Counter 2202 +#define MID_GetInfo 2203 +#define MID_Correct 2204 +#define MID_AvailBitmaps 2210 +#define MID_RegenBitmaps 2211 +#define MID_Stroke 2205 +#define MID_RmOverlap 2206 +#define MID_Simplify 2207 +#define MID_BuildAccent 2208 +#define MID_Autotrace 2212 +#define MID_Round 2213 +#define MID_MetaFont 2217 +#define MID_Average 2219 +#define MID_SpacePts 2220 +#define MID_SpaceRegion 2221 +#define MID_MakeParallel 2222 +#define MID_ShowDependents 2223 +#define MID_AddExtrema 2224 +#define MID_CleanupChar 2225 +#define MID_TilePath 2226 +#define MID_BuildComposite 2227 +#define MID_Exclude 2228 +#define MID_Intersection 2229 +#define MID_FindInter 2230 +#define MID_Effects 2231 +#define MID_SimplifyMore 2232 +#define MID_First 2233 +#define MID_Earlier 2234 +#define MID_Later 2235 +#define MID_Last 2236 +#define MID_CharInfo 2240 +#define MID_Corner 2301 +#define MID_Tangent 2302 +#define MID_Curve 2303 +#define MID_MakeFirst 2304 +#define MID_AddAnchor 2310 +#define MID_AutoHint 2400 +#define MID_ClearHStem 2401 +#define MID_ClearVStem 2402 +#define MID_ClearDStem 2403 +#define MID_AddHHint 2404 +#define MID_AddVHint 2405 +#define MID_AddDHint 2406 +#define MID_ReviewHints 2407 +#define MID_CreateHHint 2408 +#define MID_CreateVHint 2409 +#define MID_MinimumDistance 2410 +#define MID_AutoInstr 2411 +#define MID_ClearInstr 2412 +#define MID_EditInstructions 2413 +#define MID_Debug 2414 +#define MID_HintSubsPt 2415 +#define MID_AutoCounter 2416 +#define MID_DontAutoHint 2417 +#define MID_ClearAllMD 2451 +#define MID_ClearSelMDX 2452 +#define MID_ClearSelMDY 2453 +#define MID_AddxMD 2454 +#define MID_AddyMD 2455 +#define MID_RoundX 2456 +#define MID_NoRoundX 2457 +#define MID_RoundY 2458 +#define MID_NoRoundY 2459 +#define MID_ClearWidthMD 2460 +#define MID_Tools 2501 +#define MID_Layers 2502 +#define MID_DockPalettes 2503 +#define MID_Center 2600 +#define MID_SetWidth 2601 +#define MID_SetLBearing 2602 +#define MID_SetRBearing 2603 +#define MID_Thirds 2604 +#define MID_RemoveKerns 2605 +#define MID_SetVWidth 2606 +#define MID_RemoveVKerns 2607 +#define MID_OpenBitmap 2700 +#define MID_Revert 2702 +#define MID_Recent 2703 +#define MID_Display 2706 +#define MID_RevertGlyph 2707 + +#define MID_MMReblend 2800 +#define MID_MMAll 2821 +#define MID_MMNone 2822 + +static void CVMenuClose(GWindow gw,struct gmenuitem *mi,GEvent *e) { + GDrawDestroyWindow(gw); +} + +static void CVMenuOpenBitmap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + if ( cv->fv->sf->bitmaps==NULL ) +return; + BitmapViewCreatePick(cv->sc->enc,cv->fv); +} + +static void CVMenuOpenMetrics(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + MetricsViewCreate(cv->fv,cv->sc,NULL); +} + +static void CVMenuSave(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _FVMenuSave(cv->fv); +} + +static void CVMenuSaveAs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _FVMenuSaveAs(cv->fv); +} + +static void CVMenuGenerate(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _FVMenuGenerate(cv->fv,false); +} + +static void CVMenuGenerateFamily(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _FVMenuGenerate(cv->fv,true); +} + +static void CVMenuExport(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVExport(cv); +} + +static void CVMenuImport(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVImport(cv); +} + +static void CVMenuRevert(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + FVDelay(cv->fv,FVRevert); /* The revert command can potentially */ + /* destroy our window (if the char weren't in the */ + /* old font). If that happens before the menu finishes */ + /* we get a crash. So delay till after the menu completes */ +} + +void RevertedGlyphReferenceFixup(SplineChar *sc, SplineFont *sf) { + int i; + RefChar *refs, *prev, *next; + + for ( prev=NULL, refs = sc->layers[ly_fore].refs ; refs!=NULL; refs = next ) { + next = refs->next; + if ( sf->encodingchanged && refs->unicode_enc>0 ) { + /* Well, try to fix things up based on the unicode encoding */ + /* Old sfd files won't have this */ + if ( refs->local_enccharcnt && + sf->chars[refs->local_enc]!=NULL && + sf->chars[refs->local_enc]->unicodeenc == refs->unicode_enc ) + /* Well, this character seems to be in the right place */; + else { + for ( i=0 ; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc==refs->unicode_enc ) { + refs->local_enc = i; + break; + } + } + } + if ( refs->local_enccharcnt && sf->chars[refs->local_enc]!=NULL ) { + prev = refs; + refs->sc = sf->chars[refs->local_enc]; + refs->unicode_enc = refs->sc->unicodeenc; + SCReinstanciateRefChar(sc,refs); + SCMakeDependent(sc,refs->sc); + } else { + if ( prev==NULL ) + sc->layers[ly_fore].refs = next; + else + prev->next = next; + RefCharFree(refs); + } + } +} + +static void CVMenuRevertGlyph(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplineChar *sc, temp; + static int buts[] = { _STR_OK, _STR_Cancel, 0 }; + + if ( cv->sc->parent->filename==NULL || cv->sc->namechanged || cv->sc->parent->mm!=NULL ) +return; + sc = SFDReadOneChar(cv->sc->parent->filename,cv->sc->name); + if ( sc==NULL ) { + GWidgetErrorR(_STR_CantFindGlyph,_STR_CantRevertGlyph,cv->sc->name); + cv->sc->namechanged = true; + } else if ( sc->layers[ly_fore].refs!=NULL && cv->sc->parent->encodingchanged && + GWidgetAskR(_STR_GlyphHasRefs,buts,0,1,_STR_GlyphHasRefsQuestion,cv->sc->name)==1 ) { + SplineCharFree(sc); + } else { + SCPreserveState(cv->sc,true); + SCPreserveBackground(cv->sc); + temp = *cv->sc; + cv->sc->dependents = NULL; + cv->sc->layers[ly_fore].undoes = cv->sc->layers[ly_back].undoes = NULL; + SplineCharFreeContents(cv->sc); + *cv->sc = *sc; + chunkfree(sc,sizeof(SplineChar)); + cv->sc->parent = temp.parent; + cv->sc->dependents = temp.dependents; + cv->sc->layers[ly_fore].undoes = temp.layers[ly_fore].undoes; + cv->sc->layers[ly_back].undoes = temp.layers[ly_back].undoes; + cv->sc->views = temp.views; + cv->sc->changed = temp.changed; + cv->sc->enc = temp.enc; + RevertedGlyphReferenceFixup(cv->sc, temp.parent); + _CVCharChangedUpdate(cv,false); + } +} + +static void CVMenuPrint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + PrintDlg(NULL,cv->sc,NULL); +} + +static void CVMenuDisplay(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + DisplayDlg(cv->sc->parent); +} + +static void fllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_OpenBitmap: + mi->ti.disabled = cv->sc->parent->bitmaps==NULL; + break; + case MID_Revert: + mi->ti.disabled = cv->fv->sf->origname==NULL; + break; + case MID_RevertGlyph: + mi->ti.disabled = cv->fv->sf->filename==NULL || + cv->sc->namechanged || + cv->fv->sf->mm!=NULL; + break; + case MID_Recent: + mi->ti.disabled = !RecentFilesAny(); + break; + case MID_Display: + mi->ti.disabled = (cv->fv->sf->onlybitmaps && cv->fv->sf->bitmaps==NULL) || + cv->fv->sf->multilayer; + break; + } + } +} + +static void CVMenuFontInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + DelayEvent(FontMenuFontInfo,cv->fv); +} + +static void CVMenuFindProblems(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + FindProblems(NULL,cv,NULL); +} + +static void CVMenuMetaFont(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + MetaFont(NULL,cv,NULL); +} + +static void CVMenuInline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + OutlineDlg(NULL,cv,NULL,true); +} + +static void CVMenuOutline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + OutlineDlg(NULL,cv,NULL,false); +} + +static void CVMenuShadow(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + ShadowDlg(NULL,cv,NULL,false); +} + +static void CVMenuWireframe(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + ShadowDlg(NULL,cv,NULL,true); +} + +static void _CVMenuScale(CharView *cv,struct gmenuitem *mi) { + + if ( mi->mid == MID_Fit ) { + CVFit(cv); + } else { + BasePoint c; + c.x = (cv->width/2-cv->xoff)/cv->scale; + c.y = (cv->height/2-cv->yoff)/cv->scale; + if ( CVAnySel(cv,NULL,NULL,NULL,NULL)) + CVFindCenter(cv,&c,false); + CVMagnify(cv,c.x,c.y,mi->mid==MID_ZoomOut?-1:1); + } +} + +static void CVMenuScale(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuScale(cv,mi); +} + +static void CVMenuShowHide(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + CVShows.showpoints = cv->showpoints = !cv->showpoints; + GDrawRequestExpose(cv->v,NULL,false); +} + +static void CVMenuMarkExtrema(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + CVShows.markextrema = cv->markextrema = !cv->markextrema; + SavePrefs(); + GDrawRequestExpose(cv->v,NULL,false); +} + +static void _CVMenuShowHideRulers(CharView *cv) { + GRect pos; + + CVShows.showrulers = cv->showrulers = !cv->showrulers; + pos.y = cv->mbh+cv->infoh; + pos.x = 0; + if ( cv->showrulers ) { + cv->height -= cv->rulerh; + cv->width -= cv->rulerh; + pos.y += cv->rulerh; + pos.x += cv->rulerh; + } else { + cv->height += cv->rulerh; + cv->width += cv->rulerh; + } + cv->back_img_out_of_date = true; + pos.width = cv->width; pos.height = cv->height; + GDrawMoveResize(cv->v,pos.x,pos.y,pos.width,pos.height); + GDrawSync(NULL); + GDrawRequestExpose(cv->v,NULL,false); + SavePrefs(); +} + +static void CVMenuShowHideRulers(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuShowHideRulers(cv); +} + +static void CVMenuFill(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + CVShows.showfilled = cv->showfilled = !cv->showfilled; + CVRegenFill(cv); + GDrawRequestExpose(cv->v,NULL,false); +} + +static void CVMenuShowGridFit(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( !hasFreeType() || cv->drawmode!=dm_fore || cv->dv!=NULL ) +return; + CVFtPpemDlg(cv,false); +} + +static void CVMenuEditInstrs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + SCEditInstructions(cv->sc); +} + +static void CVMenuDebug(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( !hasFreeTypeDebugger()) +return; + CVFtPpemDlg(cv,true); +} + +static void CVMenuClearInstrs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( cv->sc->ttf_instrs_len!=0 ) { + free(cv->sc->ttf_instrs); + cv->sc->ttf_instrs = NULL; + cv->sc->ttf_instrs_len = 0; + SCCharChangedUpdate(cv->sc); + SCMarkInstrDlgAsChanged(cv->sc); + } +} + +static void CVMenuKernPairs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SFShowKernPairs(cv->sc->parent,cv->sc,NULL); +} + +static void CVMenuLigatures(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SFShowLigatures(cv->fv->sf,cv->sc); +} + +static void CVMenuAnchorPairs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SFShowKernPairs(cv->sc->parent,cv->sc,(AnchorClass *) (-1)); +} + +static void CVMenuChangeChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplineFont *sf = cv->sc->parent; + int pos = -1; + + if ( cv->searcher!=NULL ) +return; + if ( mi->mid == MID_Next ) { + for ( pos = cv->sc->enc+1; poscharcnt && + sf->chars[pos]!=SCDuplicate(sf->chars[pos]); ++pos ); + } else if ( mi->mid == MID_Prev ) { + for ( pos = cv->sc->enc-1; pos>=0 && + sf->chars[pos]!=SCDuplicate(sf->chars[pos]); --pos ); + } else if ( mi->mid == MID_NextDef ) { + for ( pos = cv->sc->enc+1; poscharcnt && + (sf->chars[pos]==NULL || sf->chars[pos]!=SCDuplicate(sf->chars[pos])); ++pos ); + if ( pos>=sf->charcnt ) { + if ( cv->sc->enc<0xa140 && sf->encoding_name==em_big5 ) + pos = 0xa140; + else if ( cv->sc->enc<0xa140 && sf->encoding_name==em_big5hkscs ) + pos = 0x8140; + else if ( cv->sc->enc<0x8431 && sf->encoding_name==em_johab ) + pos = 0x8431; + else if ( cv->sc->enc<0xa1a1 && sf->encoding_name==em_wansung ) + pos = 0xa1a1; + else if ( cv->sc->enc<0xa1a1 && sf->encoding_name==em_jisgb ) + pos = 0xa1a1; + else if ( cv->sc->enc<0x8140 && sf->encoding_name==em_sjis ) + pos = 0x8140; + else if ( cv->sc->enc<0xe040 && sf->encoding_name==em_sjis ) + pos = 0xe040; + if ( pos>=sf->charcnt ) +return; + } + } else if ( mi->mid == MID_PrevDef ) { + for ( pos = cv->sc->enc-1; pos>=0 && + (sf->chars[pos]==NULL || sf->chars[pos]!=SCDuplicate(sf->chars[pos])); --pos ); + if ( pos<0 ) +return; + } + /* Werner doesn't think it should wrap */ + if ( pos<0 ) /* pos = cv->sc->parent->charcnt-1; */ +return; + else if ( pos>= cv->sc->parent->charcnt ) /* pos = 0; */ +return; + if ( pos>=0 && possc->parent->charcnt ) + CVChangeChar(cv,pos); +} + +void CVShowPoint(CharView *cv, SplinePoint *sp) { + int x, y; + int fudge = 30; + + if ( cv->width<60 ) + fudge = cv->width/3; + if ( cv->height<60 && fudge>cv->height/3 ) + fudge = cv->height/3; + + /* Make sure the point is visible and has some context around it */ + x = cv->xoff + rint(sp->me.x*cv->scale); + y = -cv->yoff + cv->height - rint(sp->me.y*cv->scale); + if ( xcv->width-fudge || y>cv->height-fudge ) + CVMagnify(cv,sp->me.x,sp->me.y,0); +} + +static void CVSelectContours(CharView *cv,struct gmenuitem *mi) { + SplineSet *spl; + SplinePoint *sp; + int sel; + + for ( spl=cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + sel = false; + for ( sp=spl->first ; ; ) { + if ( sp->selected ) { + sel = true; + break; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( sel ) { + for ( sp=spl->first ; ; ) { + sp->selected = true; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + } +} + +static void CVMenuSelectContours(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVSelectContours(cv,mi); +} + +static void CVNextPrevPt(CharView *cv,struct gmenuitem *mi) { + SplinePoint *selpt=NULL, *other; + RefChar *r; ImageList *il; + SplineSet *spl, *ss; + int x, y; + + if ( mi->mid != MID_FirstPt && !CVOneThingSel(cv,&selpt,&spl,&r,&il,NULL)) +return; + other = selpt; + if ( mi->mid == MID_NextPt ) { + if ( other->next!=NULL && other->next->to!=spl->first ) + other = other->next->to; + else { + if ( spl->next == NULL ) + spl = cv->layerheads[cv->drawmode]->splines; + else + spl = spl->next; + other = spl->first; + } + } else if ( mi->mid == MID_PrevPt ) { + if ( other!=spl->first ) { + other = other->prev->from; + } else { + if ( spl==cv->layerheads[cv->drawmode]->splines ) { + for ( ss = cv->layerheads[cv->drawmode]->splines; ss->next!=NULL; ss=ss->next ); + } else { + for ( ss = cv->layerheads[cv->drawmode]->splines; ss->next!=spl; ss=ss->next ); + } + spl = ss; + other = ss->last; + if ( spl->last==spl->first && spl->last->prev!=NULL ) + other = other->prev->from; + } + } else if ( mi->mid == MID_FirstPt ) { + if ( cv->layerheads[cv->drawmode]->splines==NULL ) +return; + other = (cv->layerheads[cv->drawmode]->splines)->first; + CVClearSel(cv); + } else if ( mi->mid == MID_FirstPtNextCont ) { + if ( spl->next!=NULL ) + other = spl->next->first; + else + other = NULL; + } + if ( selpt!=NULL ) + selpt->selected = false; + if ( other!=NULL ) + other->selected = true; + cv->p.sp = NULL; + cv->lastselpt = other; + + /* Make sure the point is visible and has some context around it */ + if ( other!=NULL ) { + x = cv->xoff + rint(other->me.x*cv->scale); + y = -cv->yoff + cv->height - rint(other->me.y*cv->scale); + if ( x<40 || y<40 || x>cv->width-40 || y>cv->height-40 ) + CVMagnify(cv,other->me.x,other->me.y,0); + } + + CVInfoDraw(cv,cv->gw); + SCUpdateAll(cv->sc); +} + +static void CVMenuNextPrevPt(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVNextPrevPt(cv,mi); +} + +static void CVNextPrevCPt(CharView *cv,struct gmenuitem *mi) { + SplinePoint *selpt=NULL; + RefChar *r; ImageList *il; + SplineSet *spl; + + if ( !CVOneThingSel(cv,&selpt,&spl,&r,&il,NULL)) +return; + if ( selpt==NULL ) +return; + cv->p.nextcp = mi->mid==MID_NextCP; + cv->p.prevcp = mi->mid==MID_PrevCP; + SCUpdateAll(cv->sc); +} + +static void CVMenuNextPrevCPt(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVNextPrevCPt(cv,mi); +} + +static void CVMenuGotoChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int pos = GotoChar(cv->sc->parent); + + if ( pos!=-1 ) + CVChangeChar(cv,pos); +} + +static void CVMenuFindInFontView(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + FVChangeChar(cv->fv,cv->sc->enc); + GDrawSetVisible(cv->fv->gw,true); + GDrawRaise(cv->fv->gw); +} + +static void CVMenuPalettesDock(GWindow gw,struct gmenuitem *mi,GEvent *e) { + PalettesChangeDocking(); +} + +static void CVMenuPaletteShow(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + CVPaletteSetVisible(cv, mi->mid==MID_Tools, !CVPaletteIsVisible(cv, mi->mid==MID_Tools)); +} + +static void cv_pllistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e) { + extern int palettes_docked; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Tools: + mi->ti.checked = CVPaletteIsVisible(cv,1); + break; + case MID_Layers: + mi->ti.checked = CVPaletteIsVisible(cv,0); + break; + case MID_DockPalettes: + mi->ti.checked = palettes_docked; + break; + } + } +} + +static void pllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_pllistcheck(cv,mi,e); +} + +static void CVUndo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVDoUndo(cv); +} + +static void CVRedo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVDoRedo(cv); +} + +static void _CVCopy(CharView *cv) { + int desel = false, anya; + + if ( !CVAnySel(cv,NULL,NULL,NULL,&anya)) + if ( !(desel = CVSetSel(cv,-1))) +return; + CopySelected(cv); + if ( desel ) + CVClearSel(cv); +} + +static void CVCopy(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVCopy(cv); +} + +static void CVCopyRef(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CopyReference(cv->sc); +} + +static void CVMenuCopyGridFit(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVCopyGridFit(cv); +} + +static void CVCopyWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + if ( mi->mid==MID_CopyVWidth && !cv->sc->parent->hasvmetrics ) +return; + CopyWidth(cv,mi->mid==MID_CopyWidth?ut_width: + mi->mid==MID_CopyVWidth?ut_vwidth: + mi->mid==MID_CopyLBearing?ut_lbearing: + ut_rbearing); +} + +static void CVDoClear(CharView *cv) { + ImageList *prev, *imgs, *next; + + CVPreserveState(cv); + if ( cv->drawmode==dm_fore ) + SCRemoveSelectedMinimumDistances(cv->sc,2); + cv->layerheads[cv->drawmode]->splines = SplinePointListRemoveSelected(cv->sc, + cv->layerheads[cv->drawmode]->splines); + if ( cv->drawmode==dm_fore ) { + RefChar *refs, *next; + AnchorPoint *ap, *aprev=NULL, *anext; + for ( refs=cv->sc->layers[ly_fore].refs; refs!=NULL; refs = next ) { + next = refs->next; + if ( refs->selected ) + SCRemoveDependent(cv->sc,refs); + } + if ( cv->showanchor ) for ( ap=cv->sc->anchor; ap!=NULL; ap=anext ) { + anext = ap->next; + if ( ap->selected ) { + if ( aprev!=NULL ) + aprev->next = anext; + else + cv->sc->anchor = anext; + chunkfree(ap,sizeof(AnchorPoint)); + } else + aprev = ap; + } + } + for ( prev = NULL, imgs=cv->layerheads[cv->drawmode]->images; imgs!=NULL; imgs = next ) { + next = imgs->next; + if ( !imgs->selected ) + prev = imgs; + else { + if ( prev==NULL ) + cv->layerheads[cv->drawmode]->images = next; + else + prev->next = next; + chunkfree(imgs,sizeof(ImageList)); + /* garbage collection of images????!!!! */ + } + } + if ( cv->lastselpt!=NULL || cv->p.sp!=NULL ) { + cv->lastselpt = NULL; cv->p.sp = NULL; + CVInfoDraw(cv,cv->gw); + } +} + +static void CVClear(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int anyanchor; + + if ( !CVAnySel(cv,NULL,NULL,NULL,&anyanchor)) +return; + CVDoClear(cv); + CVCharChangedUpdate(cv); +} + +static void CVClearBackground(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + SCClearBackground(cv->sc); +} + +static void _CVPaste(CharView *cv) { + enum undotype ut = CopyUndoType(); + if ( ut!=ut_lbearing ) /* The lbearing code does this itself */ + CVPreserveState(cv); + if ( ut!=ut_width && ut!=ut_vwidth && ut!=ut_lbearing && ut!=ut_rbearing ) + CVClearSel(cv); + PasteToCV(cv); + CVCharChangedUpdate(cv); +} + +static void CVPaste(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVPaste(cv); +} + +static void _CVMerge(CharView *cv,int elide) { + int anyp = 0; + + if ( !CVAnySel(cv,&anyp,NULL,NULL,NULL) || !anyp) +return; + CVPreserveState(cv); + SplineCharMerge(cv->sc,&cv->layerheads[cv->drawmode]->splines,!elide); + SCClearSelPt(cv->sc); + CVCharChangedUpdate(cv); +} + +static void CVMerge(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMerge(cv,false); +} + +static void CVElide(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMerge(cv,true); +} + +static void _CVJoin(CharView *cv) { + int anyp = 0, changed; + extern float joinsnap; + + CVAnySel(cv,&anyp,NULL,NULL,NULL); + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineSetJoin(cv->layerheads[cv->drawmode]->splines,!anyp,joinsnap/cv->scale,&changed); + if ( changed ) + CVCharChangedUpdate(cv); +} + +static void CVJoin(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVJoin(cv); +} + +static void _CVCut(CharView *cv) { + int anya; + + if ( !CVAnySel(cv,NULL,NULL,NULL,&anya)) +return; + _CVCopy(cv); + CVDoClear(cv); + CVCharChangedUpdate(cv); +} + +static void CVCut(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVCut(cv); +} + +static void CVCopyFgBg(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( cv->sc->layers[ly_fore].splines==NULL ) +return; + SCCopyFgToBg(cv->sc,true); +} + +static void CVSelectAll(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int mask = -1; + + if ( mi->mid==MID_SelectAllPoints ) + mask = 1; + else if ( mi->mid==MID_SelectAnchors ) + mask = 2; + if ( CVSetSel(cv,mask)) + SCUpdateAll(cv->sc); +} + +static void CVSelectNone(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + if ( CVClearSel(cv)) + SCUpdateAll(cv->sc); +} + +static void CVSelectWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv->widthsel = !cv->widthsel; + cv->oldwidth = cv->sc->width; + SCUpdateAll(cv->sc); +} + +static void CVSelectVWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + if ( !cv->showvmetrics || !cv->sc->parent->hasvmetrics ) +return; + cv->vwidthsel = !cv->widthsel; + cv->oldvwidth = cv->sc->vwidth; + SCUpdateAll(cv->sc); +} + +static void CVSelectHM(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplinePoint *sp; SplineSet *spl; RefChar *r; ImageList *im; + int exactlyone = CVOneThingSel(cv,&sp,&spl,&r,&im,NULL); + + if ( !exactlyone || sp==NULL || sp->hintmask == NULL || spl==NULL ) +return; + while ( sp!=NULL ) { + if ( sp->prev==NULL ) + break; + sp = sp->prev->from; + if ( sp == spl->first ) + break; + if ( sp->hintmask!=NULL ) + goto done; + sp->selected = true; + } + for ( spl = spl->next; spl!=NULL; spl = spl->next ) { + for ( sp=spl->first; sp!=NULL; ) { + if ( sp->hintmask!=NULL ) + goto done; + sp->selected = true; + if ( sp->prev==NULL ) + break; + sp = sp->prev->from; + if ( sp == spl->first ) + break; + } + } + done: + SCUpdateAll(cv->sc); +} + +static void _CVUnlinkRef(CharView *cv) { + int anyrefs=0; + RefChar *rf, *next; + + if ( cv->drawmode==dm_fore && cv->sc->layers[ly_fore].refs!=NULL ) { + CVPreserveState(cv); + for ( rf=cv->sc->layers[ly_fore].refs; rf!=NULL && !anyrefs; rf=rf->next ) + if ( rf->selected ) anyrefs = true; + for ( rf=cv->sc->layers[ly_fore].refs; rf!=NULL ; rf=next ) { + next = rf->next; + if ( rf->selected || !anyrefs) { + SCRefToSplines(cv->sc,rf); + } + } + CVSetCharChanged(cv,true); + SCUpdateAll(cv->sc); + /* Don't need to update dependancies, their splines won't have changed*/ + } +} + +static void CVUnlinkRef(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVUnlinkRef(cv); +} + +static void CVRemoveUndoes(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + UndoesFree(cv->layerheads[cv->drawmode]->undoes); + UndoesFree(cv->layerheads[cv->drawmode]->redoes); + cv->layerheads[cv->drawmode]->undoes = cv->layerheads[cv->drawmode]->redoes = NULL; +} + +/* We can only paste if there's something in the copy buffer */ +/* we can only copy if there's something selected to copy */ +/* figure out what things are possible from the edit menu before the user */ +/* pulls it down */ +static void cv_edlistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e,int is_cv) { + int anypoints, anyrefs, anyimages, anyanchor; + + CVAnySel(cv,&anypoints,&anyrefs,&anyimages,&anyanchor); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Join: + mi->ti.disabled = !anypoints; + break; + case MID_Merge: + mi->ti.disabled = !anypoints; + break; + case MID_Elide: + mi->ti.disabled = !anypoints; + break; + case MID_Clear: case MID_Cut: /*case MID_Copy:*/ + /* If nothing is selected, copy copies everything */ + mi->ti.disabled = !anypoints && !anyrefs && !anyimages && !anyanchor; + break; + case MID_CopyLBearing: case MID_CopyRBearing: + mi->ti.disabled = cv->drawmode!=dm_fore || + (cv->sc->layers[ly_fore].splines==NULL && cv->sc->layers[ly_fore].refs==NULL); + break; + case MID_CopyFgToBg: + mi->ti.disabled = cv->sc->layers[ly_fore].splines==NULL; + break; + case MID_CopyGridFit: + mi->ti.disabled = cv->gridfit==NULL; + break; + case MID_Paste: + mi->ti.disabled = !CopyContainsSomething() && +#ifndef _NO_LIBPNG + !GDrawSelectionHasType(cv->gw,sn_clipboard,"image/png") && +#endif + !GDrawSelectionHasType(cv->gw,sn_clipboard,"image/bmp") && + !GDrawSelectionHasType(cv->gw,sn_clipboard,"image/eps"); + break; + case MID_Undo: + mi->ti.disabled = cv->layerheads[cv->drawmode]->undoes==NULL; + break; + case MID_Redo: + mi->ti.disabled = cv->layerheads[cv->drawmode]->redoes==NULL; + break; + case MID_RemoveUndoes: + mi->ti.disabled = cv->layerheads[cv->drawmode]->undoes==NULL && cv->layerheads[cv->drawmode]->redoes==NULL; + break; + case MID_CopyRef: + mi->ti.disabled = cv->drawmode!=dm_fore || cv->searcher!=NULL; + break; + case MID_UnlinkRef: + mi->ti.disabled = cv->drawmode!=dm_fore || cv->sc->layers[ly_fore].refs==NULL; + break; + } + } +} + +static void edlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_edlistcheck(cv,mi,e,true); +} + +void SPChangePointType(SplinePoint *sp, int pointtype) { + BasePoint unitnext, unitprev; + double nextlen, prevlen; + int makedflt; + + if ( sp->pointtype==pointtype ) { + if ( pointtype==pt_curve ) { + if ( !sp->nextcpdef && sp->next!=NULL && !sp->next->order2 ) + SplineCharDefaultNextCP(sp); + if ( !sp->prevcpdef && sp->prev!=NULL && !sp->prev->order2 ) + SplineCharDefaultPrevCP(sp); + } +return; + } + sp->pointtype = pointtype; + + if ( pointtype==pt_corner ) { + /* Leave control points as they are */; + sp->nextcpdef = sp->nonextcp; + sp->prevcpdef = sp->noprevcp; + } else if ( pointtype==pt_tangent ) { + if ( sp->next!=NULL && !sp->nonextcp && sp->next->knownlinear ) { + sp->nonextcp = true; + sp->nextcp = sp->me; + } else { + SplineCharTangentNextCP(sp); + if ( sp->next ) SplineRefigure(sp->next); + } + if ( sp->prev!=NULL && !sp->noprevcp && sp->prev->knownlinear ) { + sp->noprevcp = true; + sp->prevcp = sp->me; + } else { + SplineCharTangentPrevCP(sp); + if ( sp->prev ) SplineRefigure(sp->prev); + } + } else { + unitnext.x = sp->nextcp.x-sp->me.x; unitnext.y = sp->nextcp.y-sp->me.y; + nextlen = sqrt(unitnext.x*unitnext.x + unitnext.y*unitnext.y); + unitprev.x = sp->me.x-sp->prevcp.x; unitprev.y = sp->me.y-sp->prevcp.y; + prevlen = sqrt(unitprev.x*unitprev.x + unitprev.y*unitprev.y); + makedflt=true; + if ( nextlen!=0 && prevlen!=0 ) { + unitnext.x /= nextlen; unitnext.y /= nextlen; + unitprev.x /= prevlen; unitprev.y /= prevlen; + if ( unitnext.x*unitprev.x + unitnext.y*unitprev.y>=.95 ) { + /* If the control points are essentially in the same direction*/ + /* (so valid for a curve) then leave them as is */ + makedflt = false; + } + } + if ( makedflt ) { + sp->nextcpdef = sp->prevcpdef = true; + if (( sp->prev!=NULL && sp->prev->order2 ) || + (sp->next!=NULL && sp->next->order2)) { + if ( sp->prev!=NULL ) + SplineRefigureFixup(sp->prev); + if ( sp->next!=NULL ) + SplineRefigureFixup(sp->next); + } else { + SplineCharDefaultPrevCP(sp); + SplineCharDefaultNextCP(sp); + } + } + } +} + +static void _CVMenuPointType(CharView *cv,struct gmenuitem *mi) { + int pointtype = mi->mid==MID_Corner?pt_corner:mi->mid==MID_Tangent?pt_tangent:pt_curve; + SplinePointList *spl; + Spline *spline, *first; + + CVPreserveState(cv); /* We should only get here if there's a selection */ + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL ; spl = spl->next ) { + first = NULL; + if ( spl->first->selected ) { + if ( spl->first->pointtype!=pointtype ) + SPChangePointType(spl->first,pointtype); + } + for ( spline=spl->first->next; spline!=NULL && spline!=first ; spline = spline->to->next ) { + if ( spline->to->selected ) { + if ( spline->to->pointtype!=pointtype ) + SPChangePointType(spline->to,pointtype); + } + if ( first == NULL ) first = spline; + } + } + CVCharChangedUpdate(cv); +} + +static void CVMenuPointType(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuPointType(cv,mi); +} + +static void cv_ptlistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e) { + int type = -2, cnt=0; + SplinePointList *spl, *sel=NULL; + Spline *spline, *first; + SplinePoint *selpt=NULL; + + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL && type!=-1; spl = spl->next ) { + first = NULL; + if ( spl->first->selected ) { + sel = spl; + selpt = spl->first; ++cnt; + if ( type==-2 ) type = spl->first->pointtype; + else if ( type!=spl->first->pointtype ) type = -1; + } + for ( spline=spl->first->next; spline!=NULL && spline!=first && type!=-1; spline = spline->to->next ) { + if ( spline->to->selected ) { + if ( type==-2 ) type = spline->to->pointtype; + else if ( type!=spline->to->pointtype ) type = -1; + selpt = spline->to; + sel = spl; ++cnt; + } + if ( first == NULL ) first = spline; + } + } + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Corner: + mi->ti.disabled = type==-2; + mi->ti.checked = type==pt_corner; + break; + case MID_Tangent: + mi->ti.disabled = type==-2; + mi->ti.checked = type==pt_tangent; + break; + case MID_Curve: + mi->ti.disabled = type==-2; + mi->ti.checked = type==pt_curve; + break; + case MID_MakeFirst: + mi->ti.disabled = cnt!=1 || sel->first->prev==NULL || sel->first==selpt; + break; +#if 0 + case MID_AddAnchor: + mi->ti.disabled = AnchorClassUnused(cv->sc,&waslig)==NULL; + break; +#endif + } + } +} + +static void ptlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_ptlistcheck(cv,mi,e); +} + +static void _CVMenuDir(CharView *cv,struct gmenuitem *mi) { + int splinepoints, dir; + SplinePointList *spl; + Spline *spline, *first; + int needsrefresh = false; + + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + first = NULL; + splinepoints = 0; + if ( spl->first->selected ) splinepoints = true; + for ( spline=spl->first->next; spline!=NULL && spline!=first && !splinepoints; spline = spline->to->next ) { + if ( spline->to->selected ) splinepoints = true; + if ( first == NULL ) first = spline; + } + if ( splinepoints && spl->first==spl->last && spl->first->next!=NULL ) { + dir = SplinePointListIsClockwise(spl); + if ( (mi->mid==MID_Clockwise && !dir) || (mi->mid==MID_Counter && dir)) { + if ( !needsrefresh ) + CVPreserveState(cv); + SplineSetReverse(spl); + needsrefresh = true; + } + } + } + if ( needsrefresh ) + CVCharChangedUpdate(cv); +} + +static void CVMenuDir(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuDir(cv,mi); +} + +static int getorigin(void *d,BasePoint *base,int index) { + CharView *cv = (CharView *) d; + + base->x = base->y = 0; + switch ( index ) { + case 0: /* Character origin */ + /* all done */ + break; + case 1: /* Center of selection */ + CVFindCenter(cv,base,!CVAnySel(cv,NULL,NULL,NULL,NULL)); + break; + case 2: /* last press */ + base->x = cv->p.cx; + base->y = cv->p.cy; + /* I don't have any way of telling if a press has happened. if one */ + /* hasn't they'll just get a 0,0 origin. oh well */ + break; + default: +return( false ); + } +return( true ); +} + +void BackgroundImageTransform(SplineChar *sc, ImageList *img,real transform[6]) { + if ( transform[1]==0 && transform[2]==0 && transform[0]>0 && transform[3]>0 ) { + img->xoff = transform[0]*img->xoff + transform[4]; + img->yoff = transform[3]*img->yoff + transform[5]; + if (( img->xscale *= transform[0])<0 ) img->xscale = -img->xscale; + if (( img->yscale *= transform[3])<0 ) img->yscale = -img->yscale; + img->bb.minx = img->xoff; img->bb.maxy = img->yoff; + img->bb.maxx = img->xoff + GImageGetWidth(img->image)*img->xscale; + img->bb.miny = img->yoff - GImageGetHeight(img->image)*img->yscale; + } else + /* Don't support rotating, flipping or skewing images */; + SCOutOfDateBackground(sc); +} + +void CVTransFunc(CharView *cv,real transform[6], enum fvtrans_flags flags) { + int anysel = cv->p.transany; + RefChar *refs; + ImageList *img; + real t[6]; + AnchorPoint *ap; + + SplinePointListTransform(cv->layerheads[cv->drawmode]->splines,transform,!anysel); + if ( flags&fvt_round_to_int ) + SplineSetsRound2Int(cv->layerheads[cv->drawmode]->splines); + if ( cv->layerheads[cv->drawmode]->images!=NULL ) { + ImageListTransform(cv->layerheads[cv->drawmode]->images,transform); + SCOutOfDateBackground(cv->sc); + } + if ( cv->drawmode==dm_fore ) { + for ( refs = cv->sc->layers[ly_fore].refs; refs!=NULL; refs=refs->next ) + if ( refs->selected || !anysel ) { + SplinePointListTransform(refs->layers[0].splines,transform,true); + t[0] = refs->transform[0]*transform[0] + + refs->transform[1]*transform[2]; + t[1] = refs->transform[0]*transform[1] + + refs->transform[1]*transform[3]; + t[2] = refs->transform[2]*transform[0] + + refs->transform[3]*transform[2]; + t[3] = refs->transform[2]*transform[1] + + refs->transform[3]*transform[3]; + t[4] = refs->transform[4]*transform[0] + + refs->transform[5]*transform[2] + + transform[4]; + t[5] = refs->transform[4]*transform[1] + + refs->transform[5]*transform[3] + + transform[5]; + if ( flags&fvt_round_to_int ) { + t[4] = rint( t[4] ); + t[5] = rint( t[5] ); + } + memcpy(refs->transform,t,sizeof(t)); + SplineSetFindBounds(refs->layers[0].splines,&refs->bb); + } + if ( cv->showanchor ) { + for ( ap=cv->sc->anchor; ap!=NULL; ap=ap->next ) if ( ap->selected || !anysel ) + ApTransform(ap,transform); + } + if ( transform[1]==0 && transform[2]==0 ) { + TransHints(cv->sc->hstem,transform[3],transform[5],transform[0],transform[4],flags&fvt_round_to_int); + TransHints(cv->sc->vstem,transform[0],transform[4],transform[3],transform[5],flags&fvt_round_to_int); + } + if ( transform[0]==1 && transform[3]==1 && transform[1]==0 && + transform[2]==0 && transform[5]==0 && + transform[4]!=0 && CVAllSelected(cv) && + cv->sc->unicodeenc!=-1 && isalpha(cv->sc->unicodeenc)) { + SCUndoSetLBearingChange(cv->sc,(int) rint(transform[4])); + SCSynchronizeLBearing(cv->sc,NULL,transform[4]); + } + if ( !(flags&fvt_dontmovewidth) && (cv->widthsel || !anysel)) + if ( transform[0]>0 && transform[3]>0 && transform[1]==0 && + transform[2]==0 && transform[4]!=0 ) + SCSynchronizeWidth(cv->sc,cv->sc->width*transform[0]+transform[4],cv->sc->width,NULL); + if ( !(flags&fvt_dontmovewidth) && (cv->vwidthsel || !anysel)) + if ( transform[0]==1 && transform[3]==1 && transform[1]==0 && + transform[2]==0 && transform[5]!=0 ) + cv->sc->vwidth+=transform[5]; + if ( (flags&fvt_dobackground) && !anysel ) { + SCPreserveBackground(cv->sc); + for ( img = cv->sc->layers[ly_back].images; img!=NULL; img=img->next ) + BackgroundImageTransform(cv->sc, img, transform); + SplinePointListTransform(cv->layerheads[cv->drawmode]->splines, + transform,true); + } + } +} + +static void transfunc(void *d,real transform[6],int otype,BVTFunc *bvts, + enum fvtrans_flags flags) { + CharView *cv = (CharView *) d; + int anya; + + cv->p.transany = CVAnySel(cv,NULL,NULL,NULL,&anya); + CVPreserveState(cv); + if ( cv->drawmode==dm_fore && (flags&fvt_dobackground) ) + SCPreserveBackground(cv->sc); + CVTransFunc(cv,transform,flags); + CVCharChangedUpdate(cv); +} + +static void CVMenuTransform(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int anysel = CVAnySel(cv,NULL,NULL,NULL,NULL); + TransformDlgCreate(cv,transfunc,getorigin,!anysel && cv->drawmode==dm_fore); +} + +#ifdef FONTFORGE_CONFIG_NONLINEAR +static void CVMenuNLTransform(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + NonLinearDlg(NULL,cv); +} +#endif + +static void SplinePointRound(SplinePoint *sp) { + sp->me.x = rint(sp->me.x); + sp->me.y = rint(sp->me.y); + sp->nextcp.x = rint(sp->nextcp.x); + sp->nextcp.y = rint(sp->nextcp.y); + if ( sp->next!=NULL && sp->next->order2 ) + sp->next->to->prevcp = sp->nextcp; + sp->prevcp.x = rint(sp->prevcp.x); + sp->prevcp.y = rint(sp->prevcp.y); + if ( sp->prev!=NULL && sp->prev->order2 ) + sp->prev->from->nextcp = sp->prevcp; +} + +void SplineSetsRound2Int(SplineSet *spl) { + SplinePoint *sp; + + for ( ; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; ) { + SplinePointRound(sp); + if ( sp->prev!=NULL ) + SplineRefigure(sp->prev); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) + SplineRefigure(spl->first->prev); + } +} + +void SplineSetsRound2Sixtyfourths(SplineSet *spl) { + SplinePoint *sp; + + for ( ; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; ) { + sp->me.x = rint(sp->me.x*64)/64.0; + sp->me.y = rint(sp->me.y*64)/64.0; + sp->nextcp.x = rint(sp->nextcp.x*64)/64.0; + sp->nextcp.y = rint(sp->nextcp.y*64)/64.0; + if ( sp->next!=NULL && sp->next->order2 ) + sp->next->to->prevcp = sp->nextcp; + sp->prevcp.x = rint(sp->prevcp.x*64)/64.0; + sp->prevcp.y = rint(sp->prevcp.y*64)/64.0; + if ( sp->prev!=NULL && sp->prev->order2 ) + sp->prev->from->nextcp = sp->prevcp; + + if ( sp->prev!=NULL ) + SplineRefigure(sp->prev); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) + SplineRefigure(spl->first->prev); + } +} + +static void SplineSetsChangeCoord(SplineSet *spl,real old, real new,int isy) { + SplinePoint *sp; + + for ( ; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; ) { + if ( isy ) { + if ( RealNear(sp->me.y,old) ) { + if ( RealNear(sp->nextcp.y,old)) + sp->nextcp.y = new; + else + sp->nextcp.y += new-sp->me.y; + if ( RealNear(sp->prevcp.y,old)) + sp->prevcp.y = new; + else + sp->prevcp.y += new-sp->me.y; + sp->me.y = new; + /* we expect to be called before SplineSetRound2Int and will */ + /* allow it to do any SplineRefigures */ + } + } else { + if ( RealNear(sp->me.x,old) ) { + if ( RealNear(sp->nextcp.x,old)) + sp->nextcp.x = new; + else + sp->nextcp.x += new-sp->me.x; + if ( RealNear(sp->prevcp.x,old)) + sp->prevcp.x = new; + else + sp->prevcp.x += new-sp->me.x; + sp->me.x = new; + } + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) + SplineRefigure(spl->first->prev); + } +} + +void SCRound2Int(SplineChar *sc) { + RefChar *r; + StemInfo *stems; + real old, new; + int layer; + + for ( stems = sc->hstem; stems!=NULL; stems=stems->next ) { + old = stems->start+stems->width; + stems->start = rint(stems->start); + stems->width = rint(stems->width); + new = stems->start+stems->width; + if ( old!=new ) + SplineSetsChangeCoord(sc->layers[ly_fore].splines,old,new,true); + } + for ( stems = sc->vstem; stems!=NULL; stems=stems->next ) { + old = stems->start+stems->width; + stems->start = rint(stems->start); + stems->width = rint(stems->width); + new = stems->start+stems->width; + if ( old!=new ) + SplineSetsChangeCoord(sc->layers[ly_fore].splines,old,new,false); + } + + for ( layer = ly_fore; layerlayer_cnt; ++layer ) { + SplineSetsRound2Int(sc->layers[layer].splines); + for ( r=sc->layers[layer].refs; r!=NULL; r=r->next ) { + r->transform[4] = rint(r->transform[4]); + r->transform[5] = rint(r->transform[5]); + RefCharFindBounds(r); + } + } + SCCharChangedUpdate(sc); +} + +static void CVMenuConstrain(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVConstrainSelection(cv,mi->mid==MID_Average?0: + mi->mid==MID_SpacePts?1: + 2); +} + +static void CVMenuMakeParallel(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVMakeParallel(cv); +} + +static void _CVMenuRound2Int(CharView *cv) { + int anysel = CVAnySel(cv,NULL,NULL,NULL,NULL); + SplinePointList *spl; + SplinePoint *sp; + RefChar *r; + + CVPreserveState(cv); + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; ) { + if ( sp->selected || !anysel ) + SplinePointRound(sp); + if ( sp->prev!=NULL ) + SplineRefigure(sp->prev); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) + SplineRefigure(spl->first->prev); + } + if ( cv->drawmode==dm_fore ) { + for ( r=cv->sc->layers[ly_fore].refs; r!=NULL; r=r->next ) { + if ( r->selected || !anysel ) { + r->transform[4] = rint(r->transform[4]); + r->transform[5] = rint(r->transform[5]); + } + } + } + CVCharChangedUpdate(cv); +} + +static void CVMenuRound2Int(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuRound2Int(cv); +} + +static void CVMenuStroke(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVStroke(cv); +} + +#ifdef FONTFORGE_CONFIG_TILEPATH +static void CVMenuTilePath(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVTile(cv); +} +#endif + +static void _CVMenuOverlap(CharView *cv,enum overlap_type ot) { + /* We know it's more likely that we'll find a problem in the overlap code */ + /* than anywhere else, so let's save the current state against a crash */ + DoAutoSaves(); + + CVPreserveState(cv); + if ( cv->drawmode==dm_fore ) { + MinimumDistancesFree(cv->sc->md); + cv->sc->md = NULL; + } + cv->layerheads[cv->drawmode]->splines = SplineSetRemoveOverlap(cv->sc,cv->layerheads[cv->drawmode]->splines,ot); + CVCharChangedUpdate(cv); +} + +static void CVMenuOverlap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuOverlap(cv,mi->mid==MID_RmOverlap ? over_remove : + mi->mid==MID_Intersection ? over_intersect : + mi->mid==MID_Exclude ? over_exclude : + over_findinter); +} + +static void CVMenuOrder(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplinePointList *spl; + RefChar *r; + ImageList *im; + int exactlyone = CVOneContourSel(cv,&spl,&r,&im); + + if ( !exactlyone ) +return; + + CVPreserveState(cv); + if ( spl!=NULL ) { + SplinePointList *p, *pp, *t; + p = pp = NULL; + for ( t=cv->layerheads[cv->drawmode]->splines; t!=NULL && t!=spl; t=t->next ) { + pp = p; p = t; + } + switch ( mi->mid ) { + case MID_First: + if ( p!=NULL ) { + p->next = spl->next; + spl->next = cv->layerheads[cv->drawmode]->splines; + cv->layerheads[cv->drawmode]->splines = spl; + } + break; + case MID_Earlier: + if ( p!=NULL ) { + p->next = spl->next; + spl->next = p; + if ( pp==NULL ) { + cv->layerheads[cv->drawmode]->splines = spl; + } else { + pp->next = spl; + } + } + break; + case MID_Last: + if ( spl->next!=NULL ) { + for ( t=cv->layerheads[cv->drawmode]->splines; t->next!=NULL; t=t->next ); + t->next = spl; + if ( p==NULL ) + cv->layerheads[cv->drawmode]->splines = spl->next; + else + p->next = spl->next; + spl->next = NULL; + } + break; + case MID_Later: + if ( spl->next!=NULL ) { + t = spl->next; + spl->next = t->next; + t->next = spl; + if ( p==NULL ) + cv->layerheads[cv->drawmode]->splines = t; + else + p->next = t; + } + break; + } + } else if ( r!=NULL ) { + RefChar *p, *pp, *t; + p = pp = NULL; + for ( t=cv->sc->layers[ly_fore].refs; t!=NULL && t!=r; t=t->next ) { + pp = p; p = t; + } + switch ( mi->mid ) { + case MID_First: + if ( p!=NULL ) { + p->next = r->next; + r->next = cv->sc->layers[ly_fore].refs; + cv->sc->layers[ly_fore].refs = r; + } + break; + case MID_Earlier: + if ( p!=NULL ) { + p->next = r->next; + r->next = p; + if ( pp==NULL ) { + cv->sc->layers[ly_fore].refs = r; + } else { + pp->next = r; + } + } + break; + case MID_Last: + if ( r->next!=NULL ) { + for ( t=cv->sc->layers[ly_fore].refs; t->next!=NULL; t=t->next ); + t->next = r; + if ( p==NULL ) + cv->sc->layers[ly_fore].refs = r->next; + else + p->next = r->next; + r->next = NULL; + } + break; + case MID_Later: + if ( r->next!=NULL ) { + t = r->next; + r->next = t->next; + t->next = r; + if ( p==NULL ) + cv->sc->layers[ly_fore].refs = t; + else + p->next = t; + } + break; + } + } else if ( im!=NULL ) { + ImageList *p, *pp, *t; + p = pp = NULL; + for ( t=cv->layerheads[cv->drawmode]->images; t!=NULL && t!=im; t=t->next ) { + pp = p; p = t; + } + switch ( mi->mid ) { + case MID_First: + if ( p!=NULL ) { + p->next = im->next; + im->next = cv->layerheads[cv->drawmode]->images; + cv->layerheads[cv->drawmode]->images = im; + } + break; + case MID_Earlier: + if ( p!=NULL ) { + p->next = im->next; + im->next = p; + if ( pp==NULL ) { + cv->layerheads[cv->drawmode]->images = im; + } else { + pp->next = im; + } + } + break; + case MID_Last: + if ( im->next!=NULL ) { + for ( t=cv->layerheads[cv->drawmode]->images; t->next!=NULL; t=t->next ); + t->next = im; + if ( p==NULL ) + cv->layerheads[cv->drawmode]->images = im->next; + else + p->next = im->next; + im->next = NULL; + } + break; + case MID_Later: + if ( im->next!=NULL ) { + t = im->next; + im->next = t->next; + t->next = im; + if ( p==NULL ) + cv->layerheads[cv->drawmode]->images = t; + else + p->next = t; + } + break; + } + } + CVCharChangedUpdate(cv); +} + +static void _CVMenuAddExtrema(CharView *cv) { + int anysel; + + (void) CVAnySel(cv,&anysel,NULL,NULL,NULL); + CVPreserveState(cv); + SplineCharAddExtrema(cv->layerheads[cv->drawmode]->splines,anysel); + CVCharChangedUpdate(cv); +} + +static void CVMenuAddExtrema(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuAddExtrema(cv); +} + +static void CVMenuSimplify(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + static struct simplifyinfo smpl = { sf_normal,.75,.05,0 }; + + smpl.err = (cv->sc->parent->ascent+cv->sc->parent->descent)/1000.; + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineCharSimplify(cv->sc,cv->layerheads[cv->drawmode]->splines, + &smpl); + CVCharChangedUpdate(cv); +} + +static void CVMenuSimplifyMore(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + static struct simplifyinfo smpl = { sf_normal,.75,.05,0 }; + + if ( !SimplifyDlg(cv->sc->parent,&smpl)) +return; + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineCharSimplify(cv->sc,cv->layerheads[cv->drawmode]->splines,&smpl); + CVCharChangedUpdate(cv); +} + +static void CVMenuCleanupChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + static struct simplifyinfo smpl = { sf_cleanup }; + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineCharSimplify(cv->sc,cv->layerheads[cv->drawmode]->splines,&smpl); + CVCharChangedUpdate(cv); +} + +static void _CVMenuMakeFirst(CharView *cv) { + SplinePoint *selpt; + int anypoints = 0, splinepoints; + SplinePointList *spl, *sel; + Spline *spline, *first; + + sel = NULL; + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + first = NULL; + splinepoints = 0; + if ( spl->first->selected ) { splinepoints = 1; sel = spl; selpt=spl->first; } + for ( spline=spl->first->next; spline!=NULL && spline!=first && !splinepoints; spline = spline->to->next ) { + if ( spline->to->selected ) { ++splinepoints; sel = spl; selpt=spline->to; } + if ( first == NULL ) first = spline; + } + anypoints += splinepoints; + } + + if ( anypoints!=1 || sel->first->prev==NULL || sel->first==selpt ) +return; + + CVPreserveState(cv); + sel->first = sel->last = selpt; + CVCharChangedUpdate(cv); +} + +static void CVMenuMakeFirst(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + _CVMenuMakeFirst(cv); +} + +void CVAddAnchor(CharView *cv) { + int waslig; + + if ( AnchorClassUnused(cv->sc,&waslig)==NULL ) { + GWidgetPostNoticeR(_STR_MakeNewClass,_STR_MakeNewAnchorClass); + FontInfo(cv->sc->parent,8,true); /* Anchor Class */ + if ( AnchorClassUnused(cv->sc,&waslig)==NULL ) +return; + } + ApGetInfo(cv,NULL); +} + +static void CVMenuAddAnchor(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + CVAddAnchor(cv); +} + +static void CVMenuAutotrace(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SCAutoTrace(cv->sc,cv->v,e!=NULL && (e->u.mouse.state&ksm_shift)); +} + +static void CVMenuBuildAccent(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + extern int onlycopydisplayed; + + if ( SFIsRotatable(cv->fv->sf,cv->sc)) + /* It's ok */; + else if ( !SFIsSomethingBuildable(cv->fv->sf,cv->sc,true) ) +return; + SCBuildComposit(cv->fv->sf,cv->sc,!onlycopydisplayed,cv->fv); +} + +static void CVMenuBuildComposite(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + extern int onlycopydisplayed; + + if ( SFIsRotatable(cv->fv->sf,cv->sc)) + /* It's ok */; + else if ( !SFIsCompositBuildable(cv->fv->sf,cv->sc->unicodeenc,cv->sc) ) +return; + SCBuildComposit(cv->fv->sf,cv->sc,!onlycopydisplayed,cv->fv); +} + +static void CVMenuCorrectDir(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int changed=false, refchanged=false; + RefChar *ref; + int asked=-1; + static int buts[] = { _STR_Unlink, _STR_No, _STR_Cancel, 0 }; + + if ( cv->drawmode==dm_fore ) for ( ref=cv->sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]*ref->transform[3]<0 || + (ref->transform[0]==0 && ref->transform[1]*ref->transform[2]>0)) { + if ( asked==-1 ) { + asked = GWidgetAskR(_STR_FlippedRef,buts,0,2,_STR_FlippedRefUnlink, cv->sc->name ); + if ( asked==2 ) +return; + else if ( asked==1 ) + break; + } + if ( asked==0 ) { + if ( !refchanged ) { + refchanged = true; + CVPreserveState(cv); + } + SCRefToSplines(cv->sc,ref); + } + } + } + + if ( !refchanged ) + CVPreserveState(cv); + + cv->layerheads[cv->drawmode]->splines = SplineSetsCorrect(cv->layerheads[cv->drawmode]->splines,&changed); + if ( changed || refchanged ) + CVCharChangedUpdate(cv); +} + +static void CVMenuGetInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + CVGetInfo(cv); +} + +static void CVMenuCharInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + if ( cv->fv->cidmaster==NULL ) + SCCharInfo(cv->sc); +} + +static void CVMenuShowDependents(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SCRefBy(cv->sc); +} + +static void CVMenuBitmaps(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + BitmapDlg(cv->fv,cv->sc,mi->mid==MID_AvailBitmaps ); +} + +static void cv_allistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e) { + int selpoints = 0; + SplinePointList *spl; + SplinePoint *sp=NULL; + + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + sp=spl->first; + while ( 1 ) { + if ( sp->selected ) + ++selpoints; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Average: + mi->ti.disabled = selpoints<2; + break; + case MID_SpacePts: + mi->ti.disabled = ((selpoints<3) && (selpoints!=1)); + break; + case MID_SpaceRegion: + mi->ti.disabled = selpoints<3; + break; + case MID_MakeParallel: + mi->ti.disabled = selpoints!=4; + break; + } + } +} + +static void allistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_allistcheck(cv,mi,e); +} + +static void cv_balistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e) { + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_BuildAccent: + mi->ti.disabled = !SFIsSomethingBuildable(cv->fv->sf,cv->sc,true); + break; + case MID_BuildComposite: + mi->ti.disabled = !SFIsSomethingBuildable(cv->fv->sf,cv->sc,false); + break; + } + } +} + +static void balistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_balistcheck(cv,mi,e); +} + +static void cv_ellistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e,int is_cv) { + int anypoints = 0, splinepoints, dir = -2; + SplinePointList *spl, *sel; + SplinePoint *selpt=NULL; + Spline *spline, *first; + AnchorPoint *ap; + int order2 = cv->sc->parent->order2; + +#ifdef FONTFORGE_CONFIG_TILEPATH + int badsel = false; + RefChar *ref; + ImageList *il; + + for ( ref=cv->layerheads[cv->drawmode]->refs; ref!=NULL; ref=ref->next ) + if ( ref->selected ) + badsel = true; + + for ( il=cv->layerheads[cv->drawmode]->images; il!=NULL; il=il->next ) + if ( il->selected ) + badsel = true; +#endif + + sel = NULL; + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + first = NULL; + splinepoints = 0; + if ( spl->first->selected ) { splinepoints = 1; sel = spl; selpt = spl->first;} + for ( spline=spl->first->next; spline!=NULL && spline!=first && !splinepoints; spline = spline->to->next ) { + if ( spline->to->selected ) { ++splinepoints; sel = spl; selpt = spline->to; } + if ( first == NULL ) first = spline; + } + if ( splinepoints ) { + anypoints += splinepoints; + if ( dir==-1 ) + /* Do nothing */; + else if ( spl->first!=spl->last || spl->first->next==NULL ) { + if ( dir==-2 || dir==2 ) + dir = 2; /* Not a closed path, no direction */ + else + dir = -1; + } else if ( dir==-2 ) + dir = SplinePointListIsClockwise(spl); + else { + int subdir = SplinePointListIsClockwise(spl); + if ( subdir!=dir ) + dir = -1; + } + } + } + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { +#if 0 + case MID_CharInfo: + mi->ti.disabled = ( cv->fv->cidmaster!=NULL ); + break; +#endif + case MID_GetInfo: + { + SplinePoint *sp; SplineSet *spl; RefChar *ref; ImageList *img; + mi->ti.disabled = !CVOneThingSel(cv,&sp,&spl,&ref,&img,&ap); + } + break; + case MID_ShowDependents: + mi->ti.disabled = cv->sc->dependents==NULL; + break; + case MID_Clockwise: + mi->ti.disabled = !anypoints || dir==2; + mi->ti.checked = dir==1; + break; + case MID_Counter: + mi->ti.disabled = !anypoints || dir==2; + mi->ti.checked = dir==0; + break; + case MID_Correct: + mi->ti.disabled = !anypoints || dir==2; + break; + case MID_MetaFont: + mi->ti.disabled = cv->drawmode!=dm_fore || cv->sc->layers[ly_fore].refs!=NULL || order2; + break; + case MID_Stroke: + mi->ti.disabled = ( cv->layerheads[cv->drawmode]->splines==NULL || order2 ); + break; + case MID_RmOverlap: case MID_Effects: + mi->ti.disabled = ( cv->layerheads[cv->drawmode]->splines==NULL || order2 ); + break; +#ifdef FONTFORGE_CONFIG_TILEPATH + case MID_TilePath: + mi->ti.disabled = badsel || ClipBoardToSplineSet()==NULL || order2; + break; +#endif + case MID_RegenBitmaps: + mi->ti.disabled = cv->fv->sf->bitmaps==NULL; + break; + case MID_AddExtrema: + mi->ti.disabled = cv->layerheads[cv->drawmode]->splines==NULL; + /* Like Simplify, always available, but may not do anything if */ + /* all extrema have points. I'm not going to check for that, too hard */ + break; + case MID_Simplify: + mi->ti.disabled = cv->layerheads[cv->drawmode]->splines==NULL; + /* Simplify is always available (it may not do anything though) */ + /* well, ok. Disable it if there is absolutely nothing to work on */ +#if 0 + free(mi->ti.text); + if ( e==NULL || !(e->u.mouse.state&ksm_shift) ) { + mi->ti.text = u_copy(GStringGetResource(_STR_Simplify,NULL)); + mi->short_mask = ksm_control|ksm_shift; + mi->invoke = is_cv ? CVMenuSimplify : SVMenuSimplify; + } else { + mi->ti.text = u_copy(GStringGetResource(_STR_SimplifyMore,NULL)); + mi->short_mask = (ksm_control|ksm_meta|ksm_shift); + mi->invoke = is_cv ? CVMenuSimplifyMore : SVMenuSimplifyMore; + } +#endif + break; + case MID_BuildAccent: + mi->ti.disabled = !SFIsSomethingBuildable(cv->fv->sf,cv->sc,false); + break; + case MID_Autotrace: + mi->ti.disabled = FindAutoTraceName()==NULL || cv->sc->layers[ly_back].images==NULL; + break; + } + } +} + +static void ellistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_ellistcheck(cv,mi,e,true); +} + +static void CVMenuAutoHint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int removeOverlap = e==NULL || !(e->u.mouse.state&ksm_shift); + + /* !!!! Hint undoes???? */ + cv->sc->manualhints = false; + SplineCharAutoHint(cv->sc,removeOverlap); + SCUpdateAll(cv->sc); +} + +static void CVMenuAutoHintSubs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + SCFigureHintMasks(cv->sc); + SCUpdateAll(cv->sc); +} + +static void CVMenuAutoCounter(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + SCFigureCounterMasks(cv->sc); +} + +static void CVMenuDontAutoHint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + cv->sc->manualhints = !cv->sc->manualhints; +} + +static void CVMenuAutoInstr(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + SCAutoInstr(cv->sc,NULL); +} + +static void CVMenuClearHints(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + MinimumDistance *md, *prev, *next; + + if ( mi->mid==MID_ClearHStem ) { + StemInfosFree(cv->sc->hstem); + cv->sc->hstem = NULL; + cv->sc->hconflicts = false; + } else if ( mi->mid==MID_ClearVStem ) { + StemInfosFree(cv->sc->vstem); + cv->sc->vstem = NULL; + cv->sc->vconflicts = false; + } else if ( mi->mid==MID_ClearDStem ) { + DStemInfosFree(cv->sc->dstem); + cv->sc->dstem = NULL; + } else if ( mi->mid==MID_ClearAllMD ) { + MinimumDistancesFree(cv->sc->md); + cv->sc->md = NULL; + SCClearRounds(cv->sc); + } else if ( mi->mid==MID_ClearWidthMD ) { + prev=NULL; + for ( md=cv->sc->md; md!=NULL; md=next ) { + next = md->next; + if ( md->sp2==NULL ) { + if ( prev==NULL ) + cv->sc->md = next; + else + prev->next = next; + chunkfree(md,sizeof(MinimumDistance)); + } else + prev = md; + } + } else { + SCRemoveSelectedMinimumDistances(cv->sc,mi->mid==MID_ClearSelMDX); + } + cv->sc->manualhints = true; + SCClearHintMasks(cv->sc,true); + SCOutOfDateBackground(cv->sc); + SCUpdateAll(cv->sc); +} + +static void CVMenuAddHint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplinePoint *sp1, *sp2, *sp3, *sp4; + StemInfo *h; + DStemInfo *d; + + if ( !CVTwoForePointsSelected(cv,&sp1,&sp2)) +return; + + if ( mi->mid==MID_AddHHint ) { + if ( sp1->me.y==sp2->me.y ) +return; + h = chunkalloc(sizeof(StemInfo)); + if ( sp2->me.y>sp1->me.y ) { + h->start = sp1->me.y; + h->width = sp2->me.y-sp1->me.y; + } else { + h->start = sp2->me.y; + h->width = sp1->me.y-sp2->me.y; + } + SCGuessHHintInstancesAndAdd(cv->sc,h,sp1->me.x,sp2->me.x); + cv->sc->hconflicts = StemListAnyConflicts(cv->sc->hstem); + } else if ( mi->mid==MID_AddVHint ) { + if ( sp1->me.x==sp2->me.x ) +return; + h = chunkalloc(sizeof(StemInfo)); + if ( sp2->me.x>sp1->me.x ) { + h->start = sp1->me.x; + h->width = sp2->me.x-sp1->me.x; + } else { + h->start = sp2->me.x; + h->width = sp1->me.x-sp2->me.x; + } + SCGuessVHintInstancesAndAdd(cv->sc,h,sp1->me.y,sp2->me.y); + cv->sc->vconflicts = StemListAnyConflicts(cv->sc->vstem); + } else { + if ( !CVIsDiagonalable(sp1,sp2,&sp3,&sp4)) +return; + /* Make sure sp1<->sp3 is further left than sp2<->sp4 */ + if ( sp1->me.x > sp2->me.x + (sp1->me.y-sp2->me.y) * (sp4->me.x-sp2->me.x)/(sp4->me.y-sp2->me.y) ) { + SplinePoint *temp; + temp = sp1; sp1 = sp2; sp2 = temp; + temp = sp3; sp3=sp4; sp4=temp; + } + /* Make sure sp1,sp2 are at the top */ + if ( sp1->me.yme.y ) { + SplinePoint *temp; + temp = sp1; sp1=sp3; sp3=temp; + temp = sp2; sp2=sp4; sp4=temp; + } + d = chunkalloc(sizeof(DStemInfo)); + d->next = cv->sc->dstem; + cv->sc->dstem = d; + d->leftedgetop = sp1->me; + d->rightedgetop = sp2->me; + d->leftedgebottom = sp3->me; + d->rightedgebottom = sp4->me; + } + cv->sc->manualhints = true; + SCClearHintMasks(cv->sc,true); + SCOutOfDateBackground(cv->sc); + SCUpdateAll(cv->sc); +} + +static void CVMenuCreateHint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + CVCreateHint(cv,mi->mid==MID_CreateHHint); +} + +static void CVMenuReviewHints(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( cv->sc->hstem==NULL && cv->sc->vstem==NULL ) +return; + CVReviewHints(cv); +} + +static void CVMenuRoundHint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplineSet *ss; + SplinePoint *sp; + + for ( ss=cv->sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->selected ) { + if ( mi->mid==MID_RoundX ) + sp->roundx = true; + else if ( mi->mid==MID_NoRoundX ) + sp->roundx = false; + else if ( mi->mid==MID_RoundY ) + sp->roundy = true; + else + sp->roundy = false; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +} + +static void CVMenuAddMD(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplineSet *ss; + SplinePoint *sp, *sel1=NULL, *sel2=NULL; + + for ( ss=cv->sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->selected ) { + if ( sel1==NULL ) + sel1 = sp; + else if ( sel2==NULL ) + sel2 = sp; + else +return; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + if ( sel1==NULL ) +return; + if ( sel2==NULL && mi->mid==MID_AddyMD ) +return; + + if ( sel2!=NULL && sel1==cv->lastselpt ) { + sel1 = sel2; + sel2 = cv->lastselpt; + } + MDAdd(cv->sc,mi->mid==MID_AddxMD,sel1,sel2); + SCOutOfDateBackground(cv->sc); + SCUpdateAll(cv->sc); +} + +static void mdlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplinePoint *sp, *sp1, *sp2; + SplineSet *ss; + int allrx=-1, allry=-1, cnt=0; + + sp1 = sp2 = NULL; + for ( ss=cv->sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->selected ) { + ++cnt; + if ( sp1==NULL ) + sp1 = sp; + else if ( sp2==NULL ) + sp2 = sp; + if ( allrx==-1 ) + allrx = sp->roundx; + else if ( allrx!=sp->roundx ) + allrx = -2; + if ( allry==-1 ) + allry = sp->roundy; + else if ( allry!=sp->roundy ) + allry = -2; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_ClearAllMD: case MID_ClearWidthMD: + mi->ti.disabled = cv->sc->md==NULL; + break; + case MID_ClearSelMDX: case MID_ClearSelMDY: + mi->ti.disabled = cv->sc->md==NULL || cnt==0; + break; + case MID_AddyMD: + mi->ti.disabled = cnt!=2 || sp2->me.y==sp1->me.y; + break; + case MID_AddxMD: + mi->ti.disabled = cnt==0 || cnt>2 || (sp2!=NULL && sp2->me.x==sp1->me.x); + free(mi->ti.text); + mi->ti.text = u_copy(GStringGetResource(cnt==1?_STR_AddMD2Width: _STR_AddxMD,NULL)); + break; + case MID_RoundX: + mi->ti.disabled = cnt==0; + mi->ti.checked = allrx==1; + break; + case MID_NoRoundX: + mi->ti.disabled = cnt==0; + mi->ti.checked = allrx==0; + break; + case MID_RoundY: + mi->ti.disabled = cnt==0; + mi->ti.checked = allry==1; + break; + case MID_NoRoundY: + mi->ti.disabled = cnt==0; + mi->ti.checked = allry==0; + break; + } + } +} + +static void htlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplinePoint *sp1, *sp2, *sp3, *sp4; + int removeOverlap; + int multilayer = cv->sc->parent->multilayer; + + sp1 = sp2 = NULL; + CVTwoForePointsSelected(cv,&sp1,&sp2); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_AutoHint: + mi->ti.disabled = multilayer; + removeOverlap = e==NULL || !(e->u.mouse.state&ksm_shift); + free(mi->ti.text); + mi->ti.text = u_copy(GStringGetResource(removeOverlap?_STR_Autohint: _STR_FullAutohint,NULL)); + break; + case MID_HintSubsPt: case MID_AutoCounter: + mi->ti.disabled = cv->sc->parent->order2 || multilayer; + break; + case MID_DontAutoHint: + mi->ti.disabled = cv->sc->parent->order2 || multilayer; + mi->ti.checked = cv->sc->manualhints; + break; + case MID_AutoInstr: + mi->ti.disabled = !cv->sc->parent->order2 || multilayer; + break; + case MID_EditInstructions: + mi->ti.disabled = !cv->fv->sf->order2 || multilayer; + break; + case MID_Debug: + mi->ti.disabled = !cv->fv->sf->order2 || multilayer || !hasFreeTypeDebugger(); + break; + case MID_ClearInstr: + mi->ti.disabled = cv->sc->ttf_instrs_len==0; + break; + case MID_AddHHint: + mi->ti.disabled = sp2==NULL || sp2->me.y==sp1->me.y || multilayer; + break; + case MID_AddVHint: + mi->ti.disabled = sp2==NULL || sp2->me.x==sp1->me.x || multilayer; + break; + case MID_AddDHint: + mi->ti.disabled = !CVIsDiagonalable(sp1,sp2,&sp3,&sp4) || multilayer; + break; + case MID_ReviewHints: + mi->ti.disabled = (cv->sc->hstem==NULL && cv->sc->vstem==NULL ) || multilayer; + break; + } + } +} + +static void mtlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_RemoveKerns: + mi->ti.disabled = cv->sc->kerns==NULL; + break; + case MID_RemoveVKerns: + mi->ti.disabled = cv->sc->vkerns==NULL; + break; + } + } +} + +static void cv_sllistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e) { + SplinePoint *sp; SplineSet *spl; RefChar *r; ImageList *im; + int exactlyone = CVOneThingSel(cv,&sp,&spl,&r,&im,NULL); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_NextPt: case MID_PrevPt: + case MID_NextCP: case MID_PrevCP: + case MID_FirstPtNextCont: + mi->ti.disabled = !exactlyone || sp==NULL; + break; + case MID_FirstPt: case MID_Contours: + mi->ti.disabled = cv->layerheads[cv->drawmode]->splines==NULL; + break; + case MID_SelectWidth: + mi->ti.disabled = !cv->showhmetrics; + if ( !mi->ti.disabled ) { + free(mi->ti.text); + mi->ti.text = u_copy(GStringGetResource(cv->widthsel?_STR_DeselectWidth:_STR_SelectWidth,NULL)); + } + break; + case MID_SelectVWidth: + mi->ti.disabled = !cv->showvmetrics || !cv->sc->parent->hasvmetrics; + if ( !mi->ti.disabled ) { + free(mi->ti.text); + mi->ti.text = u_copy(GStringGetResource(cv->vwidthsel?_STR_DeselectVWidth:_STR_SelectVWidth,NULL)); + } + break; + case MID_SelectHM: + mi->ti.disabled = !exactlyone || sp==NULL || sp->hintmask==NULL; + break; + } + } +} + +static void sllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_sllistcheck(cv,mi,e); +} + +static void cv_cblistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e) { + int i; + KernPair *kp; + SplineChar *sc = cv->sc; + SplineFont *sf = sc->parent; + PST *pst; + char *name; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_AnchorPairs: + mi->ti.disabled = sc->anchor==NULL; + break; + case MID_KernPairs: + mi->ti.disabled = sc->kerns==NULL; + if ( sc->kerns==NULL ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kp = sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) { + if ( kp->sc == sc ) { + mi->ti.disabled = false; + goto out; + } + } + } + out:; + } + break; + case MID_Ligatures: + name = sc->name; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_ligature && + PSTContains(pst->u.lig.components,name)) { + mi->ti.disabled = false; + goto break_out_2; + } + } + } + mi->ti.disabled = true; + break_out_2:; + break; + } + } +} + +static void cv_vwlistcheck(CharView *cv,struct gmenuitem *mi,GEvent *e) { + int pos; + SplineFont *sf = cv->sc->parent; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_NextDef: + for ( pos = cv->sc->enc+1; poscharcnt && sf->chars[pos]==NULL; ++pos ); + mi->ti.disabled = pos==sf->charcnt || cv->searcher!=NULL; + break; + case MID_PrevDef: + for ( pos = cv->sc->enc-1; pos>=0 && sf->chars[pos]==NULL; --pos ); + mi->ti.disabled = pos==-1 || cv->searcher!=NULL; + break; + case MID_Next: + mi->ti.disabled = cv->searcher!=NULL || cv->sc->enc==cv->sc->parent->charcnt-1; + break; + case MID_Prev: + mi->ti.disabled = cv->searcher!=NULL || cv->sc->enc==0; + break; + case MID_Goto: case MID_FindInFontView: + mi->ti.disabled = cv->searcher!=NULL; + break; + case MID_MarkExtrema: + mi->ti.checked = cv->markextrema; + break; + case MID_HidePoints: + free(mi->ti.text); + mi->ti.text = u_copy(GStringGetResource(cv->showpoints?_STR_Hidepoints:_STR_Showpoints,NULL)); + break; + case MID_HideRulers: + free(mi->ti.text); + mi->ti.text = u_copy(GStringGetResource(cv->showrulers?_STR_Hiderulers:_STR_Showrulers,NULL)); + break; + case MID_ShowGridFit: + mi->ti.disabled = !hasFreeType() || cv->drawmode!=dm_fore || cv->dv!=NULL; + mi->ti.checked = cv->show_ft_results; + break; + case MID_Fill: + mi->ti.checked = cv->showfilled; + break; +#if HANYANG + case MID_DisplayCompositions: + mi->ti.disabled = !cv->sc->compositionunit || cv->sc->parent->rules==NULL; + break; +#endif + } + } +} + +static void cblistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_cblistcheck(cv,mi,e); +} + +static void vwlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + cv_vwlistcheck(cv,mi,e); +} + +static void CVMenuCenter(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + DBounds bb; + real transform[6]; + int drawmode = cv->drawmode; + + cv->drawmode = dm_fore; + + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0.0; + SplineCharFindBounds(cv->sc,&bb); + if ( mi->mid==MID_Center ) + transform[4] = (cv->sc->width-(bb.maxx-bb.minx))/2 - bb.minx; + else + transform[4] = (cv->sc->width-(bb.maxx-bb.minx))/3 - bb.minx; + if ( transform[4]!=0 ) { + cv->p.transany = false; + CVPreserveState(cv); + CVTransFunc(cv,transform,fvt_dontmovewidth); + CVCharChangedUpdate(cv); + } + cv->drawmode = drawmode; +} + +static void CVMenuSetWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( mi->mid == MID_SetVWidth && !cv->sc->parent->hasvmetrics ) +return; + CVSetWidth(cv,mi->mid==MID_SetWidth?wt_width: + mi->mid==MID_SetLBearing?wt_lbearing: + mi->mid==MID_SetRBearing?wt_rbearing: + wt_vwidth); +} + +static void CVMenuRemoveKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( cv->sc->kerns!=NULL ) { + KernPairsFree(cv->sc->kerns); + cv->sc->kerns = NULL; + cv->sc->parent->changed = true; + if ( cv->fv->cidmaster!=NULL ) + cv->fv->cidmaster->changed = true; + } +} + +static void CVMenuRemoveVKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( cv->sc->vkerns!=NULL ) { + KernPairsFree(cv->sc->vkerns); + cv->sc->vkerns = NULL; + cv->sc->parent->changed = true; + if ( cv->fv->cidmaster!=NULL ) + cv->fv->cidmaster->changed = true; + } +} + +static GMenuItem dummyitem[] = { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, NULL }; +static GMenuItem fllist[] = { + { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, 'N', ksm_control, NULL, NULL, MenuNew }, + { { (unichar_t *) _STR_Open, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, 'O', ksm_control, NULL, NULL, MenuOpen }, + { { (unichar_t *) _STR_Recent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control, dummyitem, MenuRecentBuild, NULL, MID_Recent }, + { { (unichar_t *) _STR_Close, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'Q', ksm_control|ksm_shift, NULL, NULL, CVMenuClose }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Openoutline, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'u' }, 'H', ksm_control, NULL, NULL, /* No function, never avail */NULL }, + { { (unichar_t *) _STR_Openbitmap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'J', ksm_control, NULL, NULL, CVMenuOpenBitmap, MID_OpenBitmap }, + { { (unichar_t *) _STR_Openmetrics, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'K', ksm_control, NULL, NULL, CVMenuOpenMetrics }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Save, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'S', ksm_control, NULL, NULL, CVMenuSave }, + { { (unichar_t *) _STR_Saveas, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, 'S', ksm_control|ksm_shift, NULL, NULL, CVMenuSaveAs }, + { { (unichar_t *) _STR_Generate, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, 'G', ksm_control|ksm_shift, NULL, NULL, CVMenuGenerate }, + { { (unichar_t *) _STR_GenerateMac, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'G', ksm_control|ksm_meta, NULL, NULL, CVMenuGenerateFamily }, + { { (unichar_t *) _STR_Export, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuExport }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Import, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control|ksm_shift, NULL, NULL, CVMenuImport }, + { { (unichar_t *) _STR_Revertfile, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'R', ksm_control|ksm_shift, NULL, NULL, CVMenuRevert, MID_Revert }, + { { (unichar_t *) _STR_RevertGlyph, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'R', ksm_control|ksm_meta, NULL, NULL, CVMenuRevertGlyph, MID_RevertGlyph }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Print, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'P', ksm_control, NULL, NULL, CVMenuPrint }, + { { (unichar_t *) _STR_Display, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'P', ksm_control|ksm_meta, NULL, NULL, CVMenuDisplay, MID_Display }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Prefs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', ksm_control, NULL, NULL, MenuPrefs }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Quit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'Q' }, 'Q', ksm_control, NULL, NULL, MenuExit }, + { NULL } +}; + +static GMenuItem sllist[] = { + { { (unichar_t *) _STR_SelectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'A', ksm_control, NULL, NULL, CVSelectAll, MID_SelAll }, + { { (unichar_t *) _STR_DeselectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, GK_Escape, 0, NULL, NULL, CVSelectNone, MID_SelNone }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_FirstPoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '.', ksm_control, NULL, NULL, CVMenuNextPrevPt, MID_FirstPt }, + { { (unichar_t *) _STR_FirstPointNextContour, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '.', ksm_meta|ksm_control, NULL, NULL, CVMenuNextPrevPt, MID_FirstPtNextCont }, + { { (unichar_t *) _STR_Nextpoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, '}', ksm_shift|ksm_control, NULL, NULL, CVMenuNextPrevPt, MID_NextPt }, + { { (unichar_t *) _STR_Prevpoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '{', ksm_shift|ksm_control, NULL, NULL, CVMenuNextPrevPt, MID_PrevPt }, + { { (unichar_t *) _STR_NextControlPoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, ';', ksm_control, NULL, NULL, CVMenuNextPrevCPt, MID_NextCP }, + { { (unichar_t *) _STR_PrevControlPoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, ':', ksm_shift|ksm_control, NULL, NULL, CVMenuNextPrevCPt, MID_PrevCP }, + { { (unichar_t *) _STR_Contours, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, '\0', ksm_shift|ksm_control, NULL, NULL, CVMenuSelectContours, MID_Contours }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SelectAllPoints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'A', ksm_control|ksm_meta, NULL, NULL, CVSelectAll, MID_SelectAllPoints }, + { { (unichar_t *) _STR_SelectAnchors, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'c' }, '\0', ksm_control, NULL, NULL, CVSelectAll, MID_SelectAnchors }, + { { (unichar_t *) _STR_SelectWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, '\0', ksm_control, NULL, NULL, CVSelectWidth, MID_SelectWidth }, + { { (unichar_t *) _STR_SelectVWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_shift|ksm_control, NULL, NULL, CVSelectVWidth, MID_SelectVWidth }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SelectHMAffected, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_shift|ksm_control, NULL, NULL, CVSelectHM, MID_SelectHM }, + { NULL } +}; + +static GMenuItem edlist[] = { + { { (unichar_t *) _STR_Undo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'Z', ksm_control, NULL, NULL, CVUndo, MID_Undo }, + { { (unichar_t *) _STR_Redo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'Y', ksm_control, NULL, NULL, CVRedo, MID_Redo }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Cut, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, 'X', ksm_control, NULL, NULL, CVCut, MID_Cut }, + { { (unichar_t *) _STR_Copy, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'C', ksm_control, NULL, NULL, CVCopy, MID_Copy }, + { { (unichar_t *) _STR_Copyref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'G', ksm_control, NULL, NULL, CVCopyRef, MID_CopyRef }, + { { (unichar_t *) _STR_Copywidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 'W', ksm_control, NULL, NULL, CVCopyWidth, MID_CopyWidth }, + { { (unichar_t *) _STR_CopyLBearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'p' }, '\0', ksm_control, NULL, NULL, CVCopyWidth, MID_CopyLBearing }, + { { (unichar_t *) _STR_CopyRBearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'g' }, '\0', ksm_control, NULL, NULL, CVCopyWidth, MID_CopyRBearing }, + { { (unichar_t *) _STR_Paste, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'V', ksm_control, NULL, NULL, CVPaste, MID_Paste }, + { { (unichar_t *) _STR_Clear, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, GK_Delete, 0, NULL, NULL, CVClear, MID_Clear }, + { { (unichar_t *) _STR_ClearBackground, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 0, 0, NULL, NULL, CVClearBackground }, + { { (unichar_t *) _STR_Merge, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'M', ksm_control, NULL, NULL, CVMerge, MID_Merge }, + { { (unichar_t *) _STR_Elide, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'M', ksm_meta|ksm_control, NULL, NULL, CVElide, MID_Elide }, + { { (unichar_t *) _STR_Join, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'J' }, 'J', ksm_control|ksm_shift, NULL, NULL, CVJoin, MID_Join }, + { { (unichar_t *) _STR_CopyFgToBg, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'C', ksm_control|ksm_shift, NULL, NULL, CVCopyFgBg, MID_CopyFgToBg }, + { { (unichar_t *) _STR_CopyGridFit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuCopyGridFit, MID_CopyGridFit }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Select, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 0, ksm_control, sllist, sllistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Unlinkref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'U', ksm_control, NULL, NULL, CVUnlinkRef, MID_UnlinkRef }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_RemoveUndoes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', 0, NULL, NULL, CVRemoveUndoes, MID_RemoveUndoes }, + { NULL } +}; + +static GMenuItem ptlist[] = { + { { (unichar_t *) _STR_Curve, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'C' }, '2', ksm_control, NULL, NULL, CVMenuPointType, MID_Curve }, + { { (unichar_t *) _STR_Corner, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'o' }, '3', ksm_control, NULL, NULL, CVMenuPointType, MID_Corner }, + { { (unichar_t *) _STR_Tangent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'T' }, '4', ksm_control, NULL, NULL, CVMenuPointType, MID_Tangent }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_MakeFirst, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, '1', ksm_control, NULL, NULL, CVMenuMakeFirst, MID_MakeFirst }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_AddAnchor, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, '0', ksm_control, NULL, NULL, CVMenuAddAnchor, MID_AddAnchor }, + { NULL } +}; + +static GMenuItem allist[] = { + { { (unichar_t *) _STR_AveragePts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, '@', ksm_control|ksm_shift, NULL, NULL, CVMenuConstrain, MID_Average }, + { { (unichar_t *) _STR_SpacePts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '#', ksm_control|ksm_shift, NULL, NULL, CVMenuConstrain, MID_SpacePts }, + { { (unichar_t *) _STR_SpaceRegions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuConstrain, MID_SpaceRegion }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_MakeParallel, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuMakeParallel, MID_MakeParallel }, + { NULL } +}; + +static GMenuItem smlist[] = { + { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'M', ksm_control|ksm_shift, NULL, NULL, CVMenuSimplify, MID_Simplify }, + { { (unichar_t *) _STR_SimplifyMore, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'M', ksm_control|ksm_shift|ksm_meta, NULL, NULL, CVMenuSimplifyMore, MID_SimplifyMore }, + { { (unichar_t *) _STR_CleanupChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'n' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuCleanupChar, MID_CleanupChar }, + { NULL } +}; + +static void smlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Simplify: + case MID_CleanupChar: + mi->ti.disabled = cv->layerheads[cv->drawmode]->splines==NULL; + break; + case MID_SimplifyMore: + mi->ti.disabled = cv->layerheads[cv->drawmode]->splines==NULL; + break; + } + } +} + +static GMenuItem orlist[] = { + { { (unichar_t *) _STR_First, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuOrder, MID_First }, + { { (unichar_t *) _STR_Earlier, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, '\0', ksm_control|ksm_shift|ksm_meta, NULL, NULL, CVMenuOrder, MID_Earlier }, + { { (unichar_t *) _STR_Later, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'n' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuOrder, MID_Later }, + { { (unichar_t *) _STR_Last, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'n' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuOrder, MID_Last }, + { NULL } +}; + +static void orlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplinePointList *spl; + RefChar *r; + ImageList *im; + int exactlyone = CVOneContourSel(cv,&spl,&r,&im); + int isfirst, islast; + + isfirst = islast = false; + if ( spl!=NULL ) { + isfirst = cv->layerheads[cv->drawmode]->splines==spl; + islast = spl->next==NULL; + } else if ( r!=NULL ) { + isfirst = cv->layerheads[cv->drawmode]->refs==r; + islast = r->next==NULL; + } else if ( im!=NULL ) { + isfirst = cv->layerheads[cv->drawmode]->images==im; + islast = im->next!=NULL; + } + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_First: + case MID_Earlier: + mi->ti.disabled = !exactlyone || isfirst; + break; + case MID_Last: + case MID_Later: + mi->ti.disabled = !exactlyone || islast; + break; + } + } +} + +static GMenuItem rmlist[] = { + { { (unichar_t *) _STR_Rmoverlap, &GIcon_rmoverlap, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'O', ksm_control|ksm_shift, NULL, NULL, CVMenuOverlap, MID_RmOverlap }, + { { (unichar_t *) _STR_Intersect, &GIcon_intersection, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuOverlap, MID_Intersection }, + { { (unichar_t *) _STR_Exclude, &GIcon_exclude, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'E' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuOverlap, MID_Exclude }, + { { (unichar_t *) _STR_FindIntersections, &GIcon_findinter, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'F' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuOverlap, MID_FindInter }, + { NULL } +}; + +static GMenuItem eflist[] = { + { { (unichar_t *) _STR_Inline, &GIcon_inline, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuInline }, + { { (unichar_t *) _STR_OutlineMn, &GIcon_outline, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuOutline }, + { { (unichar_t *) _STR_Shadow, &GIcon_shadow, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuShadow }, + { { (unichar_t *) _STR_Wireframe, &GIcon_wireframe, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'W' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuWireframe }, + { NULL } +}; + +static GMenuItem balist[] = { + { { (unichar_t *) _STR_Buildaccent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'u' }, 'A', ksm_control|ksm_shift, NULL, NULL, CVMenuBuildAccent, MID_BuildAccent }, + { { (unichar_t *) _STR_Buildcomposit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuBuildComposite, MID_BuildComposite }, + { NULL } +}; + +static GMenuItem ellist[] = { + { { (unichar_t *) _STR_Fontinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control|ksm_shift, NULL, NULL, CVMenuFontInfo }, + { { (unichar_t *) _STR_Charinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control|ksm_shift|ksm_meta, NULL, NULL, CVMenuCharInfo, MID_CharInfo }, + { { (unichar_t *) _STR_Getinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control, NULL, NULL, CVMenuGetInfo, MID_GetInfo }, + { { (unichar_t *) _STR_ShowDependents, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'I', ksm_control|ksm_meta, NULL, NULL, CVMenuShowDependents, MID_ShowDependents }, + { { (unichar_t *) _STR_Findprobs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'E', ksm_control, NULL, NULL, CVMenuFindProblems }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Bitmapsavail, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'B', ksm_control|ksm_shift, NULL, NULL, CVMenuBitmaps, MID_AvailBitmaps }, + { { (unichar_t *) _STR_Regenbitmaps, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'B', ksm_control, NULL, NULL, CVMenuBitmaps, MID_RegenBitmaps }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Transform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\\', ksm_control, NULL, NULL, CVMenuTransform }, +#ifdef FONTFORGE_CONFIG_NONLINEAR + { { (unichar_t *) _STR_NonLinearTransform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '|', ksm_shift|ksm_control, NULL, NULL, CVMenuNLTransform }, +#endif + { { (unichar_t *) _STR_Stroke, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 'E', ksm_control|ksm_shift, NULL, NULL, CVMenuStroke, MID_Stroke }, +#ifdef FONTFORGE_CONFIG_TILEPATH + { { (unichar_t *) _STR_TilePath, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuTilePath, MID_TilePath }, +#endif + { { (unichar_t *) _STR_Overlap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'v' }, '\0', ksm_control|ksm_shift, rmlist, NULL, NULL, MID_RmOverlap }, + { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, smlist, smlistcheck, NULL, MID_Simplify }, + { { (unichar_t *) _STR_AddExtrema, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, 'X', ksm_control|ksm_shift, NULL, NULL, CVMenuAddExtrema, MID_AddExtrema }, + { { (unichar_t *) _STR_Effects, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, eflist, NULL, NULL, MID_Effects }, + { { (unichar_t *) _STR_MetaFont, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, '!', ksm_control|ksm_shift, NULL, NULL, CVMenuMetaFont, MID_MetaFont }, + { { (unichar_t *) _STR_Autotrace, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, 'T', ksm_control|ksm_shift, NULL, NULL, CVMenuAutotrace, MID_Autotrace }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Align, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, '\0', ksm_control|ksm_shift, allist, allistcheck }, + { { (unichar_t *) _STR_Round2int, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '_', ksm_control|ksm_shift, NULL, NULL, CVMenuRound2Int, MID_Round }, + { { (unichar_t *) _STR_Order, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, orlist, orlistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Clockwise, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'o' }, '\0', 0, NULL, NULL, CVMenuDir, MID_Clockwise }, + { { (unichar_t *) _STR_Cclockwise, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'n' }, '\0', 0, NULL, NULL, CVMenuDir, MID_Counter }, + { { (unichar_t *) _STR_Correct, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'D', ksm_control|ksm_shift, NULL, NULL, CVMenuCorrectDir, MID_Correct }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Build, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'u' }, '\0', ksm_control|ksm_shift, balist, balistcheck, NULL, MID_BuildAccent }, + { NULL } +}; + +static GMenuItem mdlist[] = { + { { (unichar_t *) _STR_ClearAllMD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, CVMenuClearHints, MID_ClearAllMD }, + { { (unichar_t *) _STR_ClearSelXMD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 's' }, '\0', ksm_control, NULL, NULL, CVMenuClearHints, MID_ClearSelMDX }, + { { (unichar_t *) _STR_ClearSelYMD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', ksm_control, NULL, NULL, CVMenuClearHints, MID_ClearSelMDY }, + { { (unichar_t *) _STR_ClearWidthMD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, '\0', ksm_control, NULL, NULL, CVMenuClearHints, MID_ClearWidthMD }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_AddxMD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, GK_F5, 0, NULL, NULL, CVMenuAddMD, MID_AddxMD }, + { { (unichar_t *) _STR_AddyMD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'y' }, GK_F6, 0, NULL, NULL, CVMenuAddMD, MID_AddyMD }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_RoundX, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'r' }, GK_F7, 0, NULL, NULL, CVMenuRoundHint, MID_RoundX }, + { { (unichar_t *) _STR_NoRoundX, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'n' }, GK_F8, 0, NULL, NULL, CVMenuRoundHint, MID_NoRoundX }, + { { (unichar_t *) _STR_RoundY, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'u' }, GK_F9, 0, NULL, NULL, CVMenuRoundHint, MID_RoundY }, + { { (unichar_t *) _STR_NoRoundY, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'o' }, GK_F10, 0, NULL, NULL, CVMenuRoundHint, MID_NoRoundY }, + { NULL } +}; + +static GMenuItem htlist[] = { + { { (unichar_t *) _STR_Autohint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 'H', ksm_control|ksm_shift, NULL, NULL, CVMenuAutoHint, MID_AutoHint }, + { { (unichar_t *) _STR_HintSubsPts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuAutoHintSubs, MID_HintSubsPt }, + { { (unichar_t *) _STR_AutoCounterHint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuAutoCounter, MID_AutoCounter }, + { { (unichar_t *) _STR_DontAutoHint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuDontAutoHint, MID_DontAutoHint }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_AutoInstr, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'T', ksm_control, NULL, NULL, CVMenuAutoInstr, MID_AutoInstr }, + { { (unichar_t *) _STR_EditInstructions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, '\0', 0, NULL, NULL, CVMenuEditInstrs, MID_EditInstructions }, + { { (unichar_t *) _STR_DebugDDD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, '\0', 0, NULL, NULL, CVMenuDebug, MID_Debug }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_MinimumDistance, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 'H', ksm_control|ksm_shift, mdlist, mdlistcheck, NULL, MID_MinimumDistance }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Clearhstem, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, CVMenuClearHints, MID_ClearHStem }, + { { (unichar_t *) _STR_Clearvstem, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control, NULL, NULL, CVMenuClearHints, MID_ClearVStem }, + { { (unichar_t *) _STR_Cleardstem, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, '\0', ksm_control, NULL, NULL, CVMenuClearHints, MID_ClearDStem }, + { { (unichar_t *) _STR_ClearInstructions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, NULL, NULL, CVMenuClearInstrs, MID_ClearInstr }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Addhhint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, '\0', ksm_control, NULL, NULL, CVMenuAddHint, MID_AddHHint }, + { { (unichar_t *) _STR_Addvhint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 's' }, '\0', ksm_control, NULL, NULL, CVMenuAddHint, MID_AddVHint }, + { { (unichar_t *) _STR_Adddhint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control, NULL, NULL, CVMenuAddHint, MID_AddDHint }, + { { (unichar_t *) _STR_Createhhint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, '\0', ksm_control, NULL, NULL, CVMenuCreateHint, MID_CreateHHint }, + { { (unichar_t *) _STR_Createvhint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', ksm_control, NULL, NULL, CVMenuCreateHint, MID_CreateVHint }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Reviewhints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'H', ksm_control|ksm_meta, NULL, NULL, CVMenuReviewHints, MID_ReviewHints }, + { NULL } +}; + +static GMenuItem mtlist[] = { + { { (unichar_t *) _STR_Center, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, CVMenuCenter, MID_Center }, + { { (unichar_t *) _STR_Thirds, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, CVMenuCenter, MID_Thirds }, + { { (unichar_t *) _STR_Setwidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 'L', ksm_control|ksm_shift, NULL, NULL, CVMenuSetWidth, MID_SetWidth }, + { { (unichar_t *) _STR_Setlbearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'L' }, 'L', ksm_control, NULL, NULL, CVMenuSetWidth, MID_SetLBearing }, + { { (unichar_t *) _STR_Setrbearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'R', ksm_control, NULL, NULL, CVMenuSetWidth, MID_SetRBearing }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Removekern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuRemoveKern, MID_RemoveKerns }, + { { (unichar_t *) _STR_RemoveVKern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuRemoveVKern, MID_RemoveVKerns }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SetVWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control|ksm_shift, NULL, NULL, CVMenuSetWidth, MID_SetVWidth }, + { NULL } +}; + +static GMenuItem pllist[] = { + { { (unichar_t *) _STR_Tools, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, CVMenuPaletteShow, MID_Tools }, + { { (unichar_t *) _STR_Layers, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'L' }, '\0', ksm_control, NULL, NULL, CVMenuPaletteShow, MID_Layers }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_DockedPalettes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'D' }, '\0', ksm_control, NULL, NULL, CVMenuPalettesDock, MID_DockPalettes }, + { NULL } +}; + +static GMenuItem cblist[] = { + { { (unichar_t *) _STR_KernPairs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', 0, NULL, NULL, CVMenuKernPairs, MID_KernPairs }, + { { (unichar_t *) _STR_AnchoredPairs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, '\0', 0, NULL, NULL, CVMenuAnchorPairs, MID_AnchorPairs }, + { { (unichar_t *) _STR_Ligatures, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'L' }, '\0', ksm_shift|ksm_control, NULL, NULL, CVMenuLigatures, MID_Ligatures }, + NULL +}; + +static GMenuItem vwlist[] = { + { { (unichar_t *) _STR_Fit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control, NULL, NULL, CVMenuScale, MID_Fit }, + { { (unichar_t *) _STR_Zoomout, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, '-', ksm_control|ksm_meta, NULL, NULL, CVMenuScale, MID_ZoomOut }, + { { (unichar_t *) _STR_Zoomin, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'i' }, '+', ksm_shift|ksm_control|ksm_meta, NULL, NULL, CVMenuScale, MID_ZoomIn }, +#if HANYANG + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_DisplayCompositions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'i' }, '\0', ksm_control, NULL, NULL, CVDisplayCompositions, MID_DisplayCompositions }, +#endif + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_NextChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, ']', ksm_control, NULL, NULL, CVMenuChangeChar, MID_Next }, + { { (unichar_t *) _STR_PrevChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '[', ksm_control, NULL, NULL, CVMenuChangeChar, MID_Prev }, + { { (unichar_t *) _STR_NextDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, ']', ksm_control|ksm_meta, NULL, NULL, CVMenuChangeChar, MID_NextDef }, + { { (unichar_t *) _STR_PrevDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, '[', ksm_control|ksm_meta, NULL, NULL, CVMenuChangeChar, MID_PrevDef }, + { { (unichar_t *) _STR_Goto, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, '>', ksm_shift|ksm_control, NULL, NULL, CVMenuGotoChar, MID_Goto }, + { { (unichar_t *) _STR_FindInFontView, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '<', ksm_shift|ksm_control, NULL, NULL, CVMenuFindInFontView, MID_FindInFontView }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Hidepoints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'D', ksm_control, NULL, NULL, CVMenuShowHide, MID_HidePoints }, + { { (unichar_t *) _STR_MarkExtrema, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'M' }, '\0', ksm_control, NULL, NULL, CVMenuMarkExtrema, MID_MarkExtrema }, + { { (unichar_t *) _STR_Fill, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'l' }, '\0', 0, NULL, NULL, CVMenuFill, MID_Fill }, + { { (unichar_t *) _STR_ShowGridFitDDD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'l' }, '\0', 0, NULL, NULL, CVMenuShowGridFit, MID_ShowGridFit }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + { { (unichar_t *) _STR_Combinations, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'b' }, '\0', ksm_shift|ksm_control, cblist, cblistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + { { (unichar_t *) _STR_Palettes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', 0, pllist, pllistcheck }, + { { (unichar_t *) _STR_Hiderulers, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, '\0', ksm_control, NULL, NULL, CVMenuShowHideRulers, MID_HideRulers }, + { NULL } +}; + +static void CVMenuShowMMMask(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + uint32 changemask = (uint32) mi->ti.userdata; + /* Change which mms get displayed in the "background" */ + + if ( mi->mid==MID_MMAll ) { + if ( (cv->mmvisible&changemask)==changemask ) cv->mmvisible = 0; + else cv->mmvisible = changemask; + } else if ( mi->mid == MID_MMNone ) { + if ( cv->mmvisible==0 ) cv->mmvisible = (1<<(cv->sc->parent->mm->instance_count+1))-1; + else cv->mmvisible = 0; + } else + cv->mmvisible ^= changemask; + GDrawRequestExpose(cv->v,NULL,false); +} + +static GMenuItem mvlist[] = { + { { (unichar_t *) _STR_All, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0xffffffff, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, NULL, NULL, CVMenuShowMMMask, MID_MMAll }, + { { (unichar_t *) _STR_None, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, NULL, NULL, CVMenuShowMMMask, MID_MMNone }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + /* 16 subfonts max */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, + { NULL } +}; + +static void mvlistcheck(GWindow gw,struct gmenuitem *mi, GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int i, base, j; + extern void GMenuItemArrayFree(GMenuItem *mi); + extern GMenuItem *GMenuItemArrayCopy(GMenuItem *mi, uint16 *cnt); + MMSet *mm = cv->sc->parent->mm; + uint32 submask; + SplineFont *sub; + static GMenuItem mvtemp[] = { + { { (unichar_t *) _STR_All, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0xffffffff, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, NULL, NULL, CVMenuShowMMMask, MID_MMAll }, + { { (unichar_t *) _STR_None, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, NULL, NULL, CVMenuShowMMMask, MID_MMNone }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + /* 16 subfonts max */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, + { NULL } + }; + + if ( mvtemp[0].ti.text_in_resource ) { + mvtemp[0].ti.text = u_copy(GStringGetResource((int) mvtemp[0].ti.text,NULL)); + mvtemp[0].ti.text_in_resource = false; + mvtemp[1].ti.text = u_copy(GStringGetResource((int) mvtemp[1].ti.text,NULL)); + mvtemp[1].ti.text_in_resource = false; + } + base = 3; + for ( i=base; mvtemp[i].ti.text!=NULL; ++i ) { + free( mvtemp[i].ti.text); + mvtemp[i].ti.text = NULL; + } + + if ( mm!=NULL ) { + for ( j = 0, i=base; + iinstance_count+1; + ++i, ++j ) { + if ( j==0 ) + sub = mm->normal; + else + sub = mm->instances[j-1]; + mvtemp[i].ti.text = uc_copy(sub->fontname); + mvtemp[i].ti.checkable = true; + mvtemp[i].ti.checked = (cv->mmvisible & (1<sc->parent; + mvtemp[i].invoke = CVMenuShowMMMask; + mvtemp[i].ti.fg = mvtemp[i].ti.bg = COLOR_DEFAULT; + if ( sub==cv->sc->parent ) + submask = (1<mmvisible == (uint32) mvtemp[0].ti.userdata); + /* None */ + mvtemp[1].ti.checked = (cv->mmvisible == 0 || cv->mmvisible == submask); + } + GMenuItemArrayFree(mi->sub); + mi->sub = GMenuItemArrayCopy(mvtemp,NULL); +} + +static void CVMenuReblend(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int err; + MMSet *mm = cv->sc->parent->mm; + + if ( mm==NULL ) +return; + err = MMBlendChar(mm,cv->sc->enc); + if ( mm->normal->chars[cv->sc->enc]!=NULL ) + _SCCharChangedUpdate(mm->normal->chars[cv->sc->enc],-1); + if ( err!=0 ) + GWidgetErrorR(_STR_BadMM,err); +} + +/* additions here should go to mmtemp below */ +static GMenuItem mmlist[] = { + { { (unichar_t *) _STR_MMReblend, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, 0, 0, NULL, NULL, CVMenuReblend, MID_MMReblend }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, 0, 0, mvlist, mvlistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + /* 16 subfonts max */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, + { NULL } +}; + +static void CVMenuShowSubChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + SplineFont *new = mi->ti.userdata; + /* Change to the same char in a different instance font of the mm */ + + CVChangeSC(cv,SFMakeChar(new,cv->sc->enc)); + cv->layerheads[dm_grid] = &new->grid; +} + +static void mmlistcheck(GWindow gw,struct gmenuitem *mi, GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + int i, base, j; + extern void GMenuItemArrayFree(GMenuItem *mi); + extern GMenuItem *GMenuItemArrayCopy(GMenuItem *mi, uint16 *cnt); + MMSet *mm = cv->sc->parent->mm; + SplineFont *sub; + static GMenuItem mmtemp[] = { + { { (unichar_t *) _STR_MMReblend, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, 0, 0, NULL, NULL, CVMenuReblend, MID_MMReblend }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, 0, 0, mvlist, mvlistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + /* 16 subfonts max */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, + { NULL } + }; + + base = sizeof(mmtemp)/sizeof(mmtemp[0])-16-1; + if ( mmtemp[0].ti.text_in_resource ) { + for ( i=0; iinstance_count+1; + ++i, ++j ) { + if ( j==0 ) + sub = mm->normal; + else + sub = mm->instances[j-1]; + mmtemp[i].ti.text = uc_copy(sub->fontname); + mmtemp[i].ti.checkable = true; + mmtemp[i].ti.checked = sub==cv->sc->parent; + mmtemp[i].ti.userdata = sub; + mmtemp[i].invoke = CVMenuShowSubChar; + mmtemp[i].ti.fg = mmtemp[i].ti.bg = COLOR_DEFAULT; + } + } + GMenuItemArrayFree(mi->sub); + mi->sub = GMenuItemArrayCopy(mmtemp,NULL); +} + +static GMenuItem mblist[] = { + { { (unichar_t *) _STR_File, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 0, 0, fllist, fllistcheck }, + { { (unichar_t *) _STR_Edit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 0, 0, edlist, edlistcheck }, + { { (unichar_t *) _STR_Point, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 0, 0, ptlist, ptlistcheck }, + { { (unichar_t *) _STR_Element, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, ellist, ellistcheck }, + { { (unichar_t *) _STR_Hints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, htlist, htlistcheck }, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, 0, 0, vwlist, vwlistcheck }, + { { (unichar_t *) _STR_Metric, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 0, 0, mtlist, mtlistcheck }, + { { (unichar_t *) _STR_MM, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, 0, 0, mmlist, mmlistcheck }, + { { (unichar_t *) _STR_Window, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 0, 0, NULL, WindowMenuBuild }, + { { (unichar_t *) _STR_Help, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, helplist, NULL }, + { NULL } +}; + +static GMenuItem mblist_nomm[] = { + { { (unichar_t *) _STR_File, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 0, 0, fllist, fllistcheck }, + { { (unichar_t *) _STR_Edit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 0, 0, edlist, edlistcheck }, + { { (unichar_t *) _STR_Point, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 0, 0, ptlist, ptlistcheck }, + { { (unichar_t *) _STR_Element, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, ellist, ellistcheck }, + { { (unichar_t *) _STR_Hints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, htlist, htlistcheck }, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, 0, 0, vwlist, vwlistcheck }, + { { (unichar_t *) _STR_Metric, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 0, 0, mtlist, mtlistcheck }, + { { (unichar_t *) _STR_Window, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 0, 0, NULL, WindowMenuBuild }, + { { (unichar_t *) _STR_Help, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, helplist, NULL }, + { NULL } +}; + +static void _CharViewCreate(CharView *cv, SplineChar *sc, FontView *fv) { + GRect pos; + GWindowAttrs wattrs; + GGadgetData gd; + int sbsize; + FontRequest rq; + int as, ds, ld; + extern int updateflex; + static unichar_t fixed[] = { 'f','i','x','e','d',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + static unichar_t *infofamily=NULL; + + if ( !cvcolsinited ) + CVColInit(); + + if ( sc->views==NULL && updateflex ) + SplineCharIsFlexible(sc); + + cv->sc = sc; + cv->scale = .5; + cv->xoff = cv->yoff = 20; + cv->next = sc->views; + sc->views = cv; + cv->fv = fv; + + cv->drawmode = dm_fore; + + cv->showback = CVShows.showback; + cv->showfore = CVShows.showfore; + cv->showgrids = CVShows.showgrids; + cv->showhhints = CVShows.showhhints; + cv->showvhints = CVShows.showvhints; + cv->showdhints = CVShows.showdhints; + cv->showpoints = CVShows.showpoints; + cv->showrulers = CVShows.showrulers; + cv->showfilled = CVShows.showfilled; + cv->showrounds = CVShows.showrounds; + cv->showmdx = CVShows.showmdx; + cv->showmdy = CVShows.showmdy; + cv->showhmetrics = CVShows.showhmetrics; + cv->showvmetrics = CVShows.showvmetrics; + cv->markextrema = CVShows.markextrema; + cv->showblues = CVShows.showblues; + cv->showfamilyblues = CVShows.showfamilyblues; + cv->showanchor = CVShows.showanchor; + + cv->infoh = 13; + cv->rulerh = 13; + + GDrawGetSize(cv->gw,&pos); + memset(&gd,0,sizeof(gd)); + gd.pos.y = cv->mbh+cv->infoh; + gd.pos.width = sbsize = GDrawPointsToPixels(cv->gw,_GScrollBar_Width); + gd.pos.height = pos.height-cv->mbh-cv->infoh - sbsize; + gd.pos.x = pos.width-sbsize; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + cv->vsb = GScrollBarCreate(cv->gw,&gd,cv); + + gd.pos.y = pos.height-sbsize; gd.pos.height = sbsize; + gd.pos.width = pos.width - sbsize; + gd.pos.x = 0; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + cv->hsb = GScrollBarCreate(cv->gw,&gd,cv); + + GDrawGetSize(cv->gw,&pos); + pos.y = cv->mbh+cv->infoh; pos.height -= cv->mbh + sbsize + cv->infoh; + pos.x = 0; pos.width -= sbsize; + if ( cv->showrulers ) { + pos.y += cv->rulerh; pos.height -= cv->rulerh; + pos.x += cv->rulerh; pos.width -= cv->rulerh; + } + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + cv->v = GWidgetCreateSubWindow(cv->gw,&pos,v_e_h,cv,&wattrs); + + if ( GDrawRequestDeviceEvents(cv->v,input_em_cnt,input_em)>0 ) { + /* Success! They've got a wacom tablet */ + } + + if ( infofamily==NULL ) { + infofamily = uc_copy(GResourceFindString("CharView.InfoFamily")); + if ( infofamily==NULL ) + infofamily = fixed; + } + + memset(&rq,0,sizeof(rq)); + rq.family_name = infofamily; + rq.point_size = -7; + rq.weight = 400; + cv->small = GDrawInstanciateFont(GDrawGetDisplayOfWindow(cv->gw),&rq); + GDrawFontMetrics(cv->small,&as,&ds,&ld); + cv->sfh = as+ds; cv->sas = as; + rq.point_size = 10; + cv->normal = GDrawInstanciateFont(GDrawGetDisplayOfWindow(cv->gw),&rq); + GDrawFontMetrics(cv->normal,&as,&ds,&ld); + cv->nfh = as+ds; cv->nas = as; + + cv->height = pos.height; cv->width = pos.width; + cv->gi.u.image = gcalloc(1,sizeof(struct _GImage)); + cv->gi.u.image->image_type = it_mono; + cv->gi.u.image->clut = gcalloc(1,sizeof(GClut)); + cv->gi.u.image->clut->trans_index = cv->gi.u.image->trans = 0; + cv->gi.u.image->clut->clut_len = 2; + cv->gi.u.image->clut->clut[0] = 0xffffff; + cv->gi.u.image->clut->clut[1] = backimagecol; + cv->b1_tool = cvt_pointer; cv->cb1_tool = cvt_pointer; + cv->b2_tool = cvt_magnify; cv->cb2_tool = cvt_ruler; + cv->s1_tool = cvt_freehand; cv->s2_tool = cvt_pen; + cv->er_tool = cvt_knife; + cv->showing_tool = cvt_pointer; + cv->pressed_tool = cv->pressed_display = cv->active_tool = cvt_none; + cv->layerheads[dm_fore] = &sc->layers[ly_fore]; + cv->layerheads[dm_back] = &sc->layers[ly_back]; + cv->layerheads[dm_grid] = &fv->sf->grid; + +#if HANYANG + if ( sc->parent->rules!=NULL && sc->compositionunit ) + Disp_DefaultTemplate(cv); +#endif + + cv->olde.x = -1; + + cv->ft_dpi = 72; cv->ft_pointsize = 12.0; cv->ft_ppem = 12; + + /*GWidgetHidePalettes();*/ + /*cv->tools = CVMakeTools(cv);*/ + /*cv->layers = CVMakeLayers(cv);*/ + + CVFit(cv); + GDrawSetVisible(cv->v,true); + cv->gic = GDrawCreateInputContext(cv->v,gic_root|gic_orlesser); + GDrawSetVisible(cv->gw,true); +} + +void DefaultY(GRect *pos) { + static int nexty=0; + GRect size; + + GDrawGetSize(GDrawGetRoot(NULL),&size); + if ( nexty!=0 ) { + FontView *fv; + int any=0, i; + BDFFont *bdf; + /* are there any open cv/bv windows? */ + for ( fv = fv_list; fv!=NULL && !any; fv = fv->next ) { + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL ) { + if ( fv->sf->chars[i]->views!=NULL ) { + any = true; + break; + } + } + for ( bdf = fv->sf->bitmaps; bdf!=NULL && !any; bdf=bdf->next ) { + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + if ( bdf->chars[i]->views!=NULL ) { + any = true; + break; + } + } + } + } + if ( !any ) nexty = 0; + } + pos->y = nexty; + nexty += 200; + if ( nexty+pos->height > size.height ) + nexty = 0; +} + +CharView *CharViewCreate(SplineChar *sc, FontView *fv) { + CharView *cv = gcalloc(1,sizeof(CharView)); + GWindowAttrs wattrs; + GRect pos, zoom; + GWindow gw; + GGadgetData gd; + GRect gsize; + unichar_t ubuf[300]; + + sc = SCDuplicate(sc); /* If they open a duplicate encoding point they should go to the real glyph */ + + cv->sc = sc; + SCLigCaretCheck(sc,false); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_ititle; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.icon_title = CVMakeTitles(cv,ubuf); + wattrs.window_title = ubuf; + wattrs.icon = CharIcon(cv, fv); + if ( wattrs.icon ) + wattrs.mask |= wam_icon; + pos.x = GGadgetScale(104)+6; pos.width=pos.height = 540; + DefaultY(&pos); + + cv->gw = gw = GDrawCreateTopWindow(NULL,&pos,cv_e_h,cv,&wattrs); + free( (unichar_t *) wattrs.icon_title ); + + GDrawGetSize(GDrawGetRoot(screen_display),&zoom); + zoom.x = CVPalettesWidth(); zoom.width -= zoom.x-10; + zoom.height -= 30; /* Room for title bar & such */ + GDrawSetZoom(gw,&zoom,-1); + + memset(&gd,0,sizeof(gd)); + gd.flags = gg_visible | gg_enabled; + gd.u.menu = sc->parent->mm==NULL ? mblist_nomm : mblist; + cv->mb = GMenuBarCreate( gw, &gd, NULL); + GGadgetGetSize(cv->mb,&gsize); + cv->mbh = gsize.height; + + _CharViewCreate(cv,sc,fv); +return( cv ); +} + +void CharViewFree(CharView *cv) { + BDFCharFree(cv->filled); + free(cv->gi.u.image->clut); + free(cv->gi.u.image); +#if HANYANG + if ( cv->jamodisplay!=NULL ) + Disp_DoFinish(cv->jamodisplay,true); +#endif + + CVDebugFree(cv->dv); + + SplinePointListsFree(cv->gridfit); + FreeType_FreeRaster(cv->raster); + + CVDebugFree(cv->dv); + + free(cv); +} + +int CVValid(SplineFont *sf, SplineChar *sc, CharView *cv) { + /* A charview may have been closed. A splinechar may have been removed */ + /* from a font */ + CharView *test; + + if ( cv->sc!=sc || sc->parent!=sf ) +return( false ); + if ( sc->enc<0 || sc->enc>sf->charcnt ) +return( false ); + if ( sf->chars[sc->enc]!=sc ) +return( false ); + for ( test=sc->views; test!=NULL; test=test->next ) + if ( test==cv ) +return( true ); + +return( false ); +} + +static void sv_fllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Recent: + mi->ti.disabled = !RecentFilesAny(); + break; + } + } +} + +static void sv_pllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + cv_pllistcheck(cv,mi,e); +} + +static void sv_edlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + cv_edlistcheck(cv,mi,e,false); +} + +static void sv_ptlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + cv_ptlistcheck(cv,mi,e); +} + +static void sv_allistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + cv_allistcheck(cv,mi,e); +} + +static void sv_ellistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + cv_ellistcheck(cv,mi,e,false); +} + +static void sv_sllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + cv_sllistcheck(cv,mi,e); +} + +static void sv_vwlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + cv_vwlistcheck(cv,mi,e); +} + +static void SVMenuSave(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + _FVMenuSave(sv->fv); +} + +static void SVMenuSaveAs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + _FVMenuSaveAs(sv->fv); +} + +static void SVMenuGenerate(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + _FVMenuGenerate(sv->fv,false); +} + +static void SVSelectAll(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + if ( CVSetSel(cv,-1)) + SCUpdateAll(cv->sc); +} + +static void SVSelectNone(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + if ( CVClearSel(cv)) + SCUpdateAll(cv->sc); +} + +static void SVMenuNextPrevPt(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVNextPrevPt(cv,mi); +} + +static void SVMenuNextPrevCPt(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVNextPrevCPt(cv,mi); +} + +static void SVUndo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVDoUndo(cv); +} + +static void SVRedo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVDoRedo(cv); +} + +static void SVCut(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVCut(cv); +} + +static void SVCopy(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVCopy(cv); +} + +static void SVPaste(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVPaste(cv); +} + +static void SVClear(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + + if ( !CVAnySel(cv,NULL,NULL,NULL,NULL)) +return; + CVDoClear(cv); + CVCharChangedUpdate(cv); +} + +static void SVMerge(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMerge(cv,false); +} + +static void SVElide(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMerge(cv,true); +} + +static void SVJoin(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVJoin(cv); +} + +static void SVUnlinkRef(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVUnlinkRef(cv); +} + +static void SVRemoveUndoes(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + + UndoesFree(sv->cv_srch.layerheads[sv->cv_srch.drawmode]->undoes); + UndoesFree(sv->cv_srch.layerheads[sv->cv_srch.drawmode]->redoes); + sv->cv_srch.layerheads[sv->cv_srch.drawmode]->undoes = sv->cv_srch.layerheads[sv->cv_srch.drawmode]->redoes = NULL; + + UndoesFree(sv->cv_rpl.layerheads[sv->cv_rpl.drawmode]->undoes); + UndoesFree(sv->cv_rpl.layerheads[sv->cv_rpl.drawmode]->redoes); + sv->cv_rpl.layerheads[sv->cv_rpl.drawmode]->undoes = sv->cv_rpl.layerheads[sv->cv_rpl.drawmode]->redoes = NULL; +} + +static void SVMenuPointType(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMenuPointType(cv,mi); +} + +static void SVMenuMakeFirst(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMenuMakeFirst(cv); +} + +static void SVMenuConstrain(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVConstrainSelection(cv,mi->mid==MID_Average?0: + mi->mid==MID_SpacePts?1: + 2); +} + +static void SVMenuMakeParallel(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVMakeParallel(cv); +} + +static void SVMenuFontInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + DelayEvent(FontMenuFontInfo,sv->fv); +} + +static void SVMenuGetInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + SplinePoint *sp; SplineSet *spl; RefChar *r; ImageList *im; + + if( !CVOneThingSel(cv,&sp,&spl,&r,&im,NULL)) +return; + CVGetInfo(cv); +} + +static void SVMenuTransform(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + int anysel = CVAnySel(cv,NULL,NULL,NULL,NULL); + TransformDlgCreate(cv,transfunc,getorigin,!anysel && cv->drawmode==dm_fore); +} + +static void SVMenuStroke(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVStroke(cv); +} + +static void SVMenuOverlap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMenuOverlap(cv,e!=NULL && (e->u.mouse.state&ksm_shift)); +} + +static void SVMenuSimplify(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + static struct simplifyinfo smpl = { sf_normal,.75,.05,0 }; + smpl.err = (cv->sc->parent->ascent+cv->sc->parent->descent)/1000.; + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineCharSimplify(cv->sc,cv->layerheads[cv->drawmode]->splines,&smpl); + CVCharChangedUpdate(cv); +} + +#if 0 +static void SVMenuSimplifyMore(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + static struct simplifyinfo smpl = { sf_normal,.75,.05,0 }; + if ( !SimplifyDlg(&smpl)) +return; + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineCharSimplify(cv->sc,cv->layerheads[cv->drawmode]->splines,&smpl); + CVCharChangedUpdate(cv); +} +#endif + +static void SVMenuCleanupChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + static struct simplifyinfo smpl = { sf_cleanup }; + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineCharSimplify(cv->sc,cv->layerheads[cv->drawmode]->splines,&smpl); + CVCharChangedUpdate(cv); +} + +static void SVMenuAddExtrema(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMenuAddExtrema(cv); +} + +static void SVMenuRound2Int(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMenuRound2Int(cv); +} + +static void SVMenuDir(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMenuDir(cv,mi); +} + +static void SVMenuCorrectDir(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + int changed=false; + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SplineSetsCorrect(cv->layerheads[cv->drawmode]->splines,&changed); + if ( changed ) + CVCharChangedUpdate(cv); +} + +static void SVMenuPaletteShow(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + + CVPaletteSetVisible(cv, mi->mid==MID_Tools, !CVPaletteIsVisible(cv, mi->mid==MID_Tools)); +} + +static void SVMenuScale(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + _CVMenuScale(cv,mi); +} + +static void SVMenuShowHide(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + + cv->showpoints = !cv->showpoints; + GDrawRequestExpose(cv->v,NULL,false); +} + +static void SVMenuMarkExtrema(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + + cv->markextrema = !cv->markextrema; + GDrawRequestExpose(cv->v,NULL,false); +} + +static void SVMenuShowHideRulers(GWindow gw,struct gmenuitem *mi,GEvent *e) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + CharView *cv = sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch; + + if ( cv->showrulers == sv->cv_srch.showrulers ) + _CVMenuShowHideRulers(&sv->cv_srch); + if ( cv->showrulers == sv->cv_rpl.showrulers ) + _CVMenuShowHideRulers(&sv->cv_rpl); +} + +static GMenuItem sv_fllist[] = { + { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, 'N', ksm_control, NULL, NULL, MenuNew }, + { { (unichar_t *) _STR_Open, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, 'O', ksm_control, NULL, NULL, MenuOpen }, + { { (unichar_t *) _STR_Recent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control, dummyitem, MenuRecentBuild, NULL, MID_Recent }, + { { (unichar_t *) _STR_Close, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'Q', ksm_control|ksm_shift, NULL, NULL, SVMenuClose }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Save, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'S', ksm_control, NULL, NULL, SVMenuSave }, + { { (unichar_t *) _STR_Saveas, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, 'S', ksm_control|ksm_shift, NULL, NULL, SVMenuSaveAs }, + { { (unichar_t *) _STR_Generate, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, 'G', ksm_control|ksm_shift, NULL, NULL, SVMenuGenerate }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Quit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'Q' }, 'Q', ksm_control, NULL, NULL, MenuExit }, + { NULL } +}; + +static GMenuItem sv_sllist[] = { + { { (unichar_t *) _STR_SelectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'A', ksm_control, NULL, NULL, SVSelectAll, MID_SelAll }, + { { (unichar_t *) _STR_DeselectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, GK_Escape, 0, NULL, NULL, SVSelectNone, MID_SelNone }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_FirstPoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '.', ksm_control, NULL, NULL, SVMenuNextPrevPt, MID_FirstPt }, + { { (unichar_t *) _STR_FirstPointNextContour, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '.', ksm_meta|ksm_control, NULL, NULL, SVMenuNextPrevPt, MID_FirstPtNextCont }, + { { (unichar_t *) _STR_Nextpoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, '}', ksm_shift|ksm_control, NULL, NULL, SVMenuNextPrevPt, MID_NextPt }, + { { (unichar_t *) _STR_Prevpoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '{', ksm_shift|ksm_control, NULL, NULL, SVMenuNextPrevPt, MID_PrevPt }, + { { (unichar_t *) _STR_NextControlPoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, ';', ksm_control, NULL, NULL, SVMenuNextPrevCPt, MID_NextCP }, + { { (unichar_t *) _STR_PrevControlPoint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, ':', ksm_shift|ksm_control, NULL, NULL, SVMenuNextPrevCPt, MID_PrevCP }, + { NULL } +}; + +static GMenuItem sv_edlist[] = { + { { (unichar_t *) _STR_Undo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'Z', ksm_control, NULL, NULL, SVUndo, MID_Undo }, + { { (unichar_t *) _STR_Redo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'Y', ksm_control, NULL, NULL, SVRedo, MID_Redo }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Cut, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, 'X', ksm_control, NULL, NULL, SVCut, MID_Cut }, + { { (unichar_t *) _STR_Copy, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'C', ksm_control, NULL, NULL, SVCopy, MID_Copy }, + { { (unichar_t *) _STR_Paste, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'V', ksm_control, NULL, NULL, SVPaste, MID_Paste }, + { { (unichar_t *) _STR_Clear, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, GK_Delete, 0, NULL, NULL, SVClear, MID_Clear }, + { { (unichar_t *) _STR_Merge, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'M', ksm_control, NULL, NULL, SVMerge, MID_Merge }, + { { (unichar_t *) _STR_Elide, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 'M', ksm_meta|ksm_control, NULL, NULL, SVElide, MID_Elide }, + { { (unichar_t *) _STR_Join, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'J' }, 'J', ksm_control|ksm_shift, NULL, NULL, SVJoin, MID_Join }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Select, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 0, ksm_control, sv_sllist, sv_sllistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Unlinkref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'U', ksm_control, NULL, NULL, SVUnlinkRef, MID_UnlinkRef }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_RemoveUndoes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', 0, NULL, NULL, SVRemoveUndoes, MID_RemoveUndoes }, + { NULL } +}; + +static GMenuItem sv_ptlist[] = { + { { (unichar_t *) _STR_Curve, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'C' }, '2', ksm_control, NULL, NULL, SVMenuPointType, MID_Curve }, + { { (unichar_t *) _STR_Corner, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'o' }, '3', ksm_control, NULL, NULL, SVMenuPointType, MID_Corner }, + { { (unichar_t *) _STR_Tangent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'T' }, '4', ksm_control, NULL, NULL, SVMenuPointType, MID_Tangent }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_MakeFirst, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, '1', ksm_control, NULL, NULL, SVMenuMakeFirst, MID_MakeFirst }, + { NULL } +}; + +static GMenuItem sv_allist[] = { + { { (unichar_t *) _STR_AveragePts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, '@', ksm_control|ksm_shift, NULL, NULL, SVMenuConstrain, MID_Average }, + { { (unichar_t *) _STR_SpacePts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '#', ksm_control|ksm_shift, NULL, NULL, SVMenuConstrain, MID_SpacePts }, + { { (unichar_t *) _STR_SpaceRegions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, '\0', ksm_control|ksm_shift, NULL, NULL, SVMenuConstrain, MID_SpaceRegion }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_MakeParallel, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, SVMenuMakeParallel, MID_MakeParallel }, + { NULL } +}; + +static GMenuItem sv_ellist[] = { + { { (unichar_t *) _STR_Fontinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control|ksm_shift, NULL, NULL, SVMenuFontInfo }, + { { (unichar_t *) _STR_Getinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control, NULL, NULL, SVMenuGetInfo, MID_GetInfo }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Transform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\\', ksm_control, NULL, NULL, SVMenuTransform }, + { { (unichar_t *) _STR_Stroke, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 'E', ksm_control|ksm_shift, NULL, NULL, SVMenuStroke, MID_Stroke }, + { { (unichar_t *) _STR_Rmoverlap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'v' }, 'O', ksm_control|ksm_shift, NULL, NULL, SVMenuOverlap, MID_RmOverlap }, + { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'M', ksm_control|ksm_shift, NULL, NULL, SVMenuSimplify, MID_Simplify }, + { { (unichar_t *) _STR_CleanupChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'n' }, '\0', ksm_control|ksm_shift, NULL, NULL, SVMenuCleanupChar, MID_CleanupChar }, + { { (unichar_t *) _STR_AddExtrema, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, 'X', ksm_control|ksm_shift, NULL, NULL, SVMenuAddExtrema, MID_AddExtrema }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Align, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, '\0', ksm_control|ksm_shift, sv_allist, sv_allistcheck }, + { { (unichar_t *) _STR_Round2int, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '_', ksm_control|ksm_shift, NULL, NULL, SVMenuRound2Int, MID_Round }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Clockwise, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'o' }, '\0', 0, NULL, NULL, SVMenuDir, MID_Clockwise }, + { { (unichar_t *) _STR_Cclockwise, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'n' }, '\0', 0, NULL, NULL, SVMenuDir, MID_Counter }, + { { (unichar_t *) _STR_Correct, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'D', ksm_control|ksm_shift, NULL, NULL, SVMenuCorrectDir, MID_Correct }, + { NULL } +}; + +static GMenuItem sv_pllist[] = { + { { (unichar_t *) _STR_Tools, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, SVMenuPaletteShow, MID_Tools }, + { { (unichar_t *) _STR_Layers, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'L' }, '\0', ksm_control, NULL, NULL, SVMenuPaletteShow, MID_Layers }, + { { (unichar_t *) _STR_DockedPalettes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'D' }, '\0', ksm_control, NULL, NULL, CVMenuPalettesDock, MID_DockPalettes }, + { NULL } +}; + +static GMenuItem sv_vwlist[] = { + { { (unichar_t *) _STR_Fit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control, NULL, NULL, SVMenuScale, MID_Fit }, + { { (unichar_t *) _STR_Zoomout, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, '-', ksm_control|ksm_meta, NULL, NULL, SVMenuScale, MID_ZoomOut }, + { { (unichar_t *) _STR_Zoomin, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'i' }, '+', ksm_shift|ksm_control|ksm_meta, NULL, NULL, SVMenuScale, MID_ZoomIn }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Hidepoints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'D', ksm_control, NULL, NULL, SVMenuShowHide, MID_HidePoints }, + { { (unichar_t *) _STR_MarkExtrema, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'M' }, '\0', ksm_control, NULL, NULL, SVMenuMarkExtrema, MID_MarkExtrema }, + /*{ { (unichar_t *) _STR_Fill, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'l' }, '\0', 0, NULL, NULL, SVMenuFill, MID_Fill },*/ + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, }}, + { { (unichar_t *) _STR_Palettes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', 0, sv_pllist, sv_pllistcheck }, + { { (unichar_t *) _STR_Hiderulers, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, '\0', ksm_control, NULL, NULL, SVMenuShowHideRulers, MID_HideRulers }, + { NULL } +}; + +static GMenuItem sv_mblist[] = { + { { (unichar_t *) _STR_File, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 0, 0, sv_fllist, sv_fllistcheck }, + { { (unichar_t *) _STR_Edit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 0, 0, sv_edlist, sv_edlistcheck }, + { { (unichar_t *) _STR_Point, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 0, 0, sv_ptlist, sv_ptlistcheck }, + { { (unichar_t *) _STR_Element, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, sv_ellist, sv_ellistcheck }, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, 0, 0, sv_vwlist, sv_vwlistcheck }, + { { (unichar_t *) _STR_Window, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 0, 0, NULL, WindowMenuBuild }, + { { (unichar_t *) _STR_Help, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, helplist, NULL }, + { NULL } +}; + +static int sv_cv_e_h(GWindow gw, GEvent *event) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + InfoExpose(cv,gw,event); + CVLogoExpose(cv,gw,event); + break; + case et_char: + SVChar(cv->searcher,event); + break; + case et_charup: + CVCharUp(cv,event); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + if ( event->u.control.g == cv->hsb ) + CVHScroll(cv,&event->u.control.u.sb); + else + CVVScroll(cv,&event->u.control.u.sb); + break; + } + break; + case et_map: + if ( event->u.map.is_visible ) + CVPaletteActivate(cv); + else + CVPalettesHideIfMine(cv); + break; + case et_resize: + if ( event->u.resize.sized ) + CVResize(cv); + break; + case et_destroy: + if ( cv->backimgs!=NULL ) { + GDrawDestroyWindow(cv->backimgs); + cv->backimgs = NULL; + } + break; + case et_mouseup: case et_mousedown: + GGadgetEndPopup(); + CVPaletteActivate(cv); + break; + case et_mousemove: + if ( event->u.mouse.y>cv->mbh ) + SCPreparePopup(cv->gw,cv->sc); + break; + } +return( true ); +} + +void SVCharViewInits(SearchView *sv) { + GGadgetData gd; + GWindowAttrs wattrs; + GRect pos, gsize; + + sv->cv_srch.searcher = sv; + sv->cv_rpl.inactive = true; + sv->cv_rpl.searcher = sv; + + memset(&gd,0,sizeof(gd)); + gd.flags = gg_visible | gg_enabled; + gd.u.menu = sv_mblist; + sv->mb = GMenuBarCreate( sv->gw, &gd, NULL); + GGadgetGetSize(sv->mb,&gsize); + sv->mbh = gsize.height; + + pos.y = sv->mbh+sv->fh+10; pos.height = 220; + pos.width = pos.height; pos.x = 10+pos.width+20; /* Do replace first so palettes appear propperly */ + sv->rpl_x = pos.x; sv->cv_y = pos.y; + sv->cv_height = pos.height; sv->cv_width = pos.width; + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + sv->cv_rpl.gw = GWidgetCreateSubWindow(sv->gw,&pos,sv_cv_e_h,&sv->cv_rpl,&wattrs); + _CharViewCreate(&sv->cv_rpl, &sv->sc_rpl, &sv->dummy_fv); + + pos.x = 10; + sv->cv_srch.gw = GWidgetCreateSubWindow(sv->gw,&pos,sv_cv_e_h,&sv->cv_srch,&wattrs); + _CharViewCreate(&sv->cv_srch, &sv->sc_srch, &sv->dummy_fv); +} diff --git a/fontforge/charviewicons.c b/fontforge/charviewicons.c new file mode 100644 index 00000000..ea4a40fb --- /dev/null +++ b/fontforge/charviewicons.c @@ -0,0 +1,164 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "gdraw.h" +#include "views.h" + +static GClut clut = { 2, 0, 1, + 0x0, 0xb0b0b0 }; + +static uint8 rightpointer0_data[] = { + 0xfb, + 0xf3, + 0xe3, + 0xc3, + 0x83, + 0x3, + 0xc3, + 0xcb, + 0x9b, + 0x9f, +}; + +static struct _GImage rightpointer0_base = { + it_mono, + 2081,8,10,1, + (uint8 *) rightpointer0_data, + &clut, + 1 +}; + +static uint8 sel2ptr0_data[] = { + 0xff, 0xe5, + 0xff, 0x39, + 0xf9, 0xf1, + 0x8f, 0xe1, + 0x77, 0xc1, + 0x77, 0x81, + 0x77, 0xe1, + 0x8f, 0xe5, + 0xff, 0xcd, + 0xff, 0xcf, +}; + +static struct _GImage sel2ptr0_base = { + it_mono, + 2081,16,10,2, + (uint8 *) sel2ptr0_data, + &clut, + 1 +}; + +static uint8 selectedpoint0_data[] = { + 0xdf, + 0xef, + 0xef, + 0xc7, + 0xbb, + 0xbb, + 0xbb, + 0xc7, + 0xef, + 0xef, +}; + +static struct _GImage selectedpoint0_base = { + it_mono, + 2081,8,10,1, + (uint8 *) selectedpoint0_data, + &clut, + 1 +}; + +static uint8 distance0_data[] = { + 0xff, 0xff, + 0xbf, 0xfe, + 0xbb, 0xee, + 0xb7, 0xf6, + 0xaa, 0xaa, + 0xb7, 0xf6, + 0xbb, 0xee, + 0xbf, 0xfe, + 0xbf, 0xfe, + 0xff, 0xff, +}; + +static struct _GImage distance0_base = { + it_mono, + 2081,16,10,2, + (uint8 *) distance0_data, + &clut, + 1 +}; + +static uint8 angle0_data[] = { + 0xff, 0xff, + 0xff, 0xcf, + 0xff, 0x9f, + 0xfe, 0x6f, + 0xfd, 0xef, + 0xf3, 0xf7, + 0xef, 0xf7, + 0x9f, 0xf7, + 0x0, 0x1, + 0xff, 0xff, +}; + +static struct _GImage angle0_base = { + it_mono, + 2081,16,10,2, + (uint8 *) angle0_data, + &clut, + 1 +}; + +static uint8 magicon0_data[] = { + 0xc7, + 0xbb, + 0x6d, + 0x45, + 0x6d, + 0xbb, + 0xc3, + 0xfb, + 0xfd, + 0xfd, +}; + +static struct _GImage magicon0_base = { + it_mono, + 2069,8,10,1, + (uint8 *) magicon0_data, + &clut, + 1 +}; + +GImage GIcon_mag = { 0, &magicon0_base }; +GImage GIcon_angle = { 0, &angle0_base }; +GImage GIcon_distance = { 0, &distance0_base }; +GImage GIcon_selectedpoint = { 0, &selectedpoint0_base }; +GImage GIcon_sel2ptr = { 0, &sel2ptr0_base }; +GImage GIcon_rightpointer = { 0, &rightpointer0_base }; diff --git a/fontforge/combinations.c b/fontforge/combinations.c new file mode 100644 index 00000000..48529b24 --- /dev/null +++ b/fontforge/combinations.c @@ -0,0 +1,1213 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "psfont.h" +#include +#include +#include +#include +#include "nomen.h" + + +GTextInfo sizes[] = { + { (unichar_t *) "24", NULL, 0, 0, (void *) 24, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "36", NULL, 0, 0, (void *) 36, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "48", NULL, 0, 0, (void *) 48, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "72", NULL, 0, 0, (void *) 72, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "96", NULL, 0, 0, (void *) 96, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "200", NULL, 0, 0, (void *) 200, NULL, 0, 0, 0, 0, 0, 0, 1}, + { NULL } +}; +enum sortby { sb_first, sb_second, sb_kern }; +GTextInfo sortby[] = { + { (unichar_t *) _STR_FirstChar, NULL, 0, 0, (void *) sb_first, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SecondChar, NULL, 0, 0, (void *) sb_second, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_KernSize, NULL, 0, 0, (void *) sb_kern, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL } +}; + +int PSTContains(const char *components,const char *name) { + const char *pt; + int len = strlen(name); + + for ( pt = strstr(components,name); pt!=NULL; pt = strstr(pt+len,name)) { + if (( pt==components || pt[-1]==' ') && (pt[len]==' ' || pt[len]=='\0')) +return( true ); + } +return( false ); +} + +void SFShowLigatures(SplineFont *sf,SplineChar *searchfor) { + int i, cnt; + unichar_t **choices=NULL; + int *where=NULL; + SplineChar *sc, *sc2; + unichar_t *pt, *line; + char *start, *end, ch; + PST *pst; + + while ( 1 ) { + for ( i=cnt=0; icharcnt; ++i ) { + if ( (sc=sf->chars[i])!=NULL && (sc->layers[ly_fore].splines!=NULL || sc->layers[ly_fore].refs!=NULL) ) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) + if ( pst->type==pst_ligature && + (searchfor==NULL || PSTContains(pst->u.lig.components,searchfor->name))) { + if ( choices!=NULL ) { + line = pt = galloc((strlen(sc->name)+8+3*strlen(pst->u.lig.components))*sizeof(unichar_t)); + uc_strcpy(pt,sc->name); + pt += u_strlen(pt); + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10000 ) { + *pt++='('; + *pt++ = sc->unicodeenc; + *pt++=')'; + } + *pt++ = ' '; + *pt++ = 0x21d0; + *pt++ = ' '; + for ( start= pst->u.lig.components; ; start=end ) { + while ( *start==' ' ) ++start; + if ( *start=='\0' ) + break; + for ( end=start+1; *end!='\0' && *end!=' '; ++end ); + ch = *end; + *end = '\0'; + uc_strcpy( pt,start ); + pt += u_strlen(pt); + sc2 = SFGetChar(sf,-1,start); + *end = ch; + if ( sc2!=NULL && sc2->unicodeenc!=-1 && sc2->unicodeenc<0x10000 ) { + *pt++='('; + *pt++ = sc2->unicodeenc; + *pt++=')'; + } + *pt++ = ' '; + } + pt[-1] = '\0'; + choices[cnt] = line; + where[cnt] = i; + } + ++cnt; + } + } + } + if ( choices!=NULL ) + break; + choices = galloc((cnt+2)*sizeof(unichar_t *)); + where = galloc((cnt+1)*sizeof(int)); + if ( cnt==0 ) { + choices[0] = uc_copy(""); + where[0] = -1; + choices[1] = NULL; + break; + } + } + choices[cnt] = NULL; + i = GWidgetChoicesR(_STR_Ligatures, (const unichar_t **) choices,cnt, 0,_STR_SelectLigature); + if ( i!=-1 && where[i]!=-1 ) + CharViewCreate(sf->chars[where[i]],sf->fv); + free(where); + for ( i=0; ifirst==k2->first ) /* If same first char, use second char as tie breaker */ +return( k1->second->enc-k2->second->enc ); + +return( k1->first->enc-k2->first->enc ); +} + +static int secondcmpr(const void *_k1, const void *_k2) { + const struct kerns *k1 = _k1, *k2 = _k2; + + if ( k1->second==k2->second ) /* If same second char, use first char as tie breaker */ +return( k1->first->enc-k2->first->enc ); + +return( k1->second->enc-k2->second->enc ); +} + +static int offcmpr(const void *_k1, const void *_k2) { + const struct kerns *k1 = _k1, *k2 = _k2; + int off1, off2; + + if ( (off1=k1->newoff)<0 ) off1 = -off1; + if ( (off2=k2->newoff)<0 ) off2 = -off2; + + if ( off1!=off2 ) /* If same offset, use first char as tie breaker */ +return( off1-off2 ); + + if ( k1->first!=k2->first ) /* If same first char, use second char as tie breaker */ +return( k1->first->enc-k2->first->enc ); + +return( k1->second->enc-k2->second->enc ); +} + +static void KPSortEm(KPData *kpd,enum sortby sort_func) { + int oldenc; + + if ( sort_func==sb_first || sort_func==sb_second ) { + if ( kpd->sc!=NULL ) { + oldenc = kpd->sc->enc; + kpd->sc->enc = -1; + } + qsort(kpd->kerns,kpd->kcnt,sizeof(struct kerns), + sort_func==sb_first ? firstcmpr : secondcmpr ); + if ( kpd->sc!=NULL ) + kpd->sc->enc = oldenc; + } else + qsort(kpd->kerns,kpd->kcnt,sizeof(struct kerns), offcmpr ); + + if ( sort_func==sb_first ) { + int cnt=1, i; + for ( i=1; ikcnt; ++i ) { + if ( kpd->kerns[i].first!=kpd->kerns[i-1].first ) + ++cnt; + } + kpd->firstcnt = cnt; + } +} + +static void CheckLeftRight(struct kerns *k) { + /* flag any hebrew/arabic entries */ + + /* Figure that there won't be any mixed orientation kerns (no latin "A" with hebrew "Alef" kern) */ + /* but there might be some hebrew/arabic ligatures or something that */ + /* we don't recognize as right-to-left (ie. not in unicode) */ + if ( SCRightToLeft(k->first) || SCRightToLeft(k->second) ) + k->r2l = true; +} + +static void KPBuildKernList(KPData *kpd) { + int i, cnt; + KernPair *kp; + + if ( kpd->sc!=NULL ) { + while ( 1 ) { + for ( cnt=0, kp=kpd->sc->kerns; kp!=NULL; kp=kp->next ) { + if ( kpd->kerns!=NULL ) { + kpd->kerns[cnt].first = kpd->sc; + kpd->kerns[cnt].second = kp->sc; + kpd->kerns[cnt].newoff = kp->off; + kpd->kerns[cnt].newyoff = 0; + kpd->kerns[cnt].kp = kp; + kpd->kerns[cnt].ac = NULL; + CheckLeftRight(&kpd->kerns[cnt]); + } + ++cnt; + } + for ( i=0; isf->charcnt; ++i ) if ( kpd->sf->chars[i]!=NULL ) { + for ( kp = kpd->sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) { + if ( kp->sc == kpd->sc ) { + if ( kpd->kerns!=NULL ) { + kpd->kerns[cnt].first = kpd->sf->chars[i]; + kpd->kerns[cnt].second = kp->sc; + kpd->kerns[cnt].newoff = kp->off; + kpd->kerns[cnt].newyoff = 0; + kpd->kerns[cnt].kp = kp; + kpd->kerns[cnt].ac = NULL; + CheckLeftRight(&kpd->kerns[cnt]); + } + ++cnt; + } + break; + } + } + if ( kpd->kerns!=NULL ) + break; + if ( cnt==0 ) +return; + kpd->kerns = galloc((cnt+1)*sizeof(struct kerns)); + kpd->kcnt = cnt; + } + } else { + while ( 1 ) { + for ( cnt=i=0; isf->charcnt; ++i ) if ( kpd->sf->chars[i]!=NULL ) { + for ( kp = kpd->sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) { + if ( kpd->kerns!=NULL ) { + kpd->kerns[cnt].first = kpd->sf->chars[i]; + kpd->kerns[cnt].second = kp->sc; + kpd->kerns[cnt].newoff = kp->off; + kpd->kerns[cnt].newyoff = 0; + kpd->kerns[cnt].kp = kp; + kpd->kerns[cnt].ac = NULL; + CheckLeftRight(&kpd->kerns[cnt]); + } + ++cnt; + } + } + if ( kpd->kerns!=NULL ) + break; + if ( cnt==0 ) +return; + kpd->kerns = galloc((cnt+1)*sizeof(struct kerns)); + kpd->kcnt = cnt; + } + } + KPSortEm(kpd,sb_first); +} + +AnchorClass *AnchorClassMatch(SplineChar *sc1,SplineChar *sc2,AnchorClass *restrict_, + AnchorPoint **_ap1,AnchorPoint **_ap2 ) { + AnchorPoint *ap1, *ap2; + + for ( ap1=sc1->anchor; ap1!=NULL ; ap1=ap1->next ) if ( restrict_==(AnchorClass *) -1 || ap1->anchor==restrict_ ) { + for ( ap2=sc2->anchor; ap2!=NULL; ap2=ap2->next ) if ( restrict_==(AnchorClass *) -1 || ap2->anchor==restrict_ ) { + if ( ap1->anchor==ap2->anchor && +#if 1 + ((ap1->type>=at_basechar && ap1->type<=at_basemark && ap2->type==at_mark) || + (ap1->type==at_cexit && ap2->type==at_centry) )) { +#else + ((ap1->type==at_mark && ap2->type>=at_basechar && ap2->type<=at_basemark) || + (ap1->type>=at_basechar && ap1->type<=at_basemark && ap2->type==at_mark) || + (ap1->type==at_cexit && ap2->type==at_centry) || + (ap1->type==at_centry && ap2->type==at_cexit) )) { +#endif + *_ap1 = ap1; + *_ap2 = ap2; +return( ap1->anchor ); + } + } + } +return( NULL ); +} + +AnchorClass *AnchorClassMkMkMatch(SplineChar *sc1,SplineChar *sc2, + AnchorPoint **_ap1,AnchorPoint **_ap2 ) { + AnchorPoint *ap1, *ap2; + + for ( ap1=sc1->anchor; ap1!=NULL ; ap1=ap1->next ) { + for ( ap2=sc2->anchor; ap2!=NULL; ap2=ap2->next ) { + if ( ap1->anchor==ap2->anchor && + ap1->type==at_basemark && ap2->type==at_mark) { + *_ap1 = ap1; + *_ap2 = ap2; +return( ap1->anchor ); + } + } + } +return( NULL ); +} + +AnchorClass *AnchorClassCursMatch(SplineChar *sc1,SplineChar *sc2, + AnchorPoint **_ap1,AnchorPoint **_ap2 ) { + AnchorPoint *ap1, *ap2; + + for ( ap1=sc1->anchor; ap1!=NULL ; ap1=ap1->next ) { + for ( ap2=sc2->anchor; ap2!=NULL; ap2=ap2->next ) { + if ( ap1->anchor==ap2->anchor && + ap1->type==at_cexit && ap2->type==at_centry) { + *_ap1 = ap1; + *_ap2 = ap2; +return( ap1->anchor ); + } + } + } +return( NULL ); +} + +static void KPBuildAnchorList(KPData *kpd) { + int i, j, cnt; + AnchorClass *ac; + AnchorPoint *ap1, *ap2, *temp; + SplineFont *sf = kpd->sf; + DBounds bb; + + if ( kpd->sc!=NULL ) { + while ( 1 ) { + cnt = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( (ac = AnchorClassMatch(kpd->sc,sf->chars[i],kpd->ac,&ap1,&ap2)) || + (ac = AnchorClassMatch(sf->chars[i],kpd->sc,kpd->ac,&ap1,&ap2)) ) { + if ( kpd->kerns!=NULL ) { + struct kerns *k = &kpd->kerns[cnt]; + switch ( ap1->type ) { + case at_cexit: case at_basechar: case at_baselig: case at_basemark: + k->first = kpd->sc; + k->second = sf->chars[i]; + break; + case at_centry: case at_mark: + k->first = sf->chars[i]; + k->second = kpd->sc; + temp = ap1; ap1=ap2; ap2=temp; + break; + } + CheckLeftRight(k); + if ( k->r2l ) { + SplineCharQuickBounds(k->second,&bb); + k->newoff = k->second->width-ap1->me.x + ap2->me.x; + } else + k->newoff = -k->first->width+ap1->me.x-ap2->me.x; + k->newyoff = ap1->me.y-ap2->me.y; + k->ac = ac; + k->kp = NULL; + } + ++cnt; + } + } + if ( kpd->kerns!=NULL ) + break; + if ( cnt==0 ) +return; + kpd->kerns = galloc((cnt+1)*sizeof(struct kerns)); + kpd->kcnt = cnt; + } + } else { + while ( 1 ) { + cnt = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->anchor ) { + if ( kpd->ac!=(AnchorClass *) -1 ) { + for ( temp = sf->chars[i]->anchor; temp!=NULL && temp->anchor!=kpd->ac; temp=temp->next ); + if ( temp==NULL ) + continue; + } + for ( j=0; jcharcnt; ++j ) if ( sf->chars[j]!=NULL ) { + if ( (ac = AnchorClassMatch(sf->chars[i],sf->chars[j],kpd->ac,&ap1,&ap2)) ) { + if ( kpd->kerns!=NULL ) { + struct kerns *k = &kpd->kerns[cnt]; + k->first = sf->chars[i]; + k->second = sf->chars[j]; + CheckLeftRight(k); + if ( k->r2l ) { + SplineCharQuickBounds(k->second,&bb); + k->newoff = k->second->width-ap1->me.x + ap2->me.x; + } else + k->newoff = -k->first->width+ap1->me.x-ap2->me.x; + k->newyoff = ap1->me.y-ap2->me.y; + k->ac = ac; + k->kp = NULL; + } + ++cnt; + } + } + } + if ( kpd->kerns!=NULL ) + break; + if ( cnt==0 ) +return; + kpd->kerns = galloc((cnt+1)*sizeof(struct kerns)); + kpd->kcnt = cnt; + } + } + KPSortEm(kpd,sb_first); +} + +static void KPScrollTo(KPData *kpd, unichar_t uch, enum sortby sort) { + int enc,i; + + enc = SFFindChar(kpd->sf,uch,NULL); + if ( enc==-1 ) { + GDrawBeep(NULL); +return; + } + + if ( sort==sb_first ) { + for ( i=0; ikcnt && kpd->kerns[i].first->enckcnt && kpd->kerns[i].second->encwh<=2 ) + /* As is */; + else if ( kpd->wh<5 ) + --i; + else + i -= kpd->wh/5; + + if ( i>kpd->kcnt-kpd->wh ) + i = kpd->kcnt-kpd->wh; + if ( i<0 ) + i = 0; + if ( i!=kpd->off_top ) { + int off = i-kpd->off_top; + kpd->off_top = i; + GScrollBarSetPos(GWidgetGetControl(kpd->gw,CID_ScrollBar),kpd->off_top); + GDrawScroll(kpd->v,NULL,0,off*kpd->uh); + } +} + +static void KP_Resize(KPData *kpd) { + GRect size, bsize; + int height; + GGadget *sb; + int minh, minw; + + kpd->uh = (4*kpd->bdf->pixelsize/3)+kpd->fh+6; + kpd->vpad = kpd->bdf->pixelsize/5 + 3; + + GDrawGetSize(kpd->gw,&size); + + GGadgetGetSize(GWidgetGetControl(kpd->gw,CID_Cancel),&bsize); + minh = kpd->header_height+(96+kpd->fh+6)+(9+bsize.height+8); + minw = 2*(15+bsize.width)+20; + if ( size.height < minh || size.width < minw ) { + if ( size.height < minh ) + size.height = minh; + if ( size.width < minw ) + size.width = minw; + GDrawResize(kpd->gw,size.width,size.height); +return; + } + + GGadgetMove(GWidgetGetControl(kpd->gw,CID_Cancel), + size.width-15-bsize.width, size.height-9-bsize.height); + GGadgetMove(GWidgetGetControl(kpd->gw,CID_OK), + 15-3, size.height-9-bsize.height-3); + height = size.height-9-bsize.height-8 - kpd->header_height; + kpd->wh = height/kpd->uh; + height = kpd->wh*kpd->uh - 1; + if ( kpd->first ) { + kpd->first = false; + size.height = kpd->header_height+(height+1)+(9+bsize.height+8); + GDrawResize(kpd->gw,size.width,size.height); +return; + } + + sb = GWidgetGetControl(kpd->gw,CID_ScrollBar); + GGadgetMove(sb, size.width-kpd->sb_width, kpd->header_height-1); + GGadgetResize(sb, kpd->sb_width, height+2); + GScrollBarSetBounds(sb,0,kpd->kcnt,kpd->wh); + if ( kpd->off_top>kpd->kcnt-kpd->wh ) + kpd->off_top = kpd->kcnt-kpd->wh; + if ( kpd->off_top<0 ) + kpd->off_top = 0; + GScrollBarSetPos(sb,kpd->off_top); + + GDrawResize(kpd->v,size.width-kpd->sb_width,height); + kpd->vwidth = size.width-kpd->sb_width; + GDrawRequestExpose(kpd->gw,NULL,false); + GDrawRequestExpose(kpd->v,NULL,false); +} + +static void BaseFillFromBDFC(struct _GImage *base,BDFChar *bdfc) { + base->data = bdfc->bitmap; + base->bytes_per_line = bdfc->bytes_per_line; + base->width = bdfc->xmax-bdfc->xmin+1; + base->height = bdfc->ymax-bdfc->ymin+1; +} + +static void KP_ExposeKerns(KPData *kpd,GWindow pixmap,GRect *rect) { + GRect old, subclip, subold, sel; + struct _GImage base; + GImage gi; + int index1, index2; + BDFChar *bdfc1, *bdfc2; + int i, as, x, em = kpd->sf->ascent+kpd->sf->descent, yoff; + int first, last; + struct kerns *kern; + char buffer[40]; unichar_t ubuf[100]; + + first = rect->y/kpd->uh; + last = (rect->y+rect->height+kpd->uh-1)/kpd->uh; + + for ( i=first; i<=last && i+kpd->off_topkcnt; ++i ) { + kern = &kpd->kerns[i+kpd->off_top]; + index1 = kern->first->enc; + if ( kpd->bdf->chars[index1]==NULL ) + BDFPieceMeal(kpd->bdf,index1); + index2 = kern->second->enc; + if ( kpd->bdf->chars[index2]==NULL ) + BDFPieceMeal(kpd->bdf,index2); + } + + as = kpd->vpad + kpd->sf->ascent * kpd->bdf->pixelsize / em; + + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + gi.u.image = &base; + base.image_type = it_index; + base.clut = kpd->bdf->clut; + GDrawSetDither(NULL, false); + + GDrawPushClip(pixmap,rect,&old); + GDrawSetFont(pixmap,kpd->font); + GDrawSetLineWidth(pixmap,0); + GDrawFillRect(pixmap,rect,GDrawGetDefaultBackground(NULL)); + subclip = *rect; + for ( i=first; i<=last && i+kpd->off_topkcnt; ++i ) { + subclip.y = i*kpd->uh; subclip.height = kpd->uh; + GDrawPushClip(pixmap,&subclip,&subold); + + kern = &kpd->kerns[i+kpd->off_top]; + index1 = kern->first->enc; + index2 = kern->second->enc; + bdfc1 = kpd->bdf->chars[index1]; + bdfc2 = kpd->bdf->chars[index2]; + + BaseFillFromBDFC(&base,bdfc1); + base.trans = base.clut->trans_index = -1; + /* the peculiar behavior concerning xmin/xmax is because the bitmaps */ + /* don't contain the side-bearings, we have to add that spacing manually */ + if ( !kern->r2l ) { + GDrawDrawImage(pixmap,&gi,NULL, 10,subclip.y+as-bdfc1->ymax); + x = 10 + (bdfc1->width-bdfc1->xmin) + bdfc2->xmin + + (kern->newoff*kpd->bdf->pixelsize/em); + } else { + x = kpd->vwidth-10-(bdfc1->xmax-bdfc1->xmin); + GDrawDrawImage(pixmap,&gi,NULL, x,subclip.y+as-bdfc1->ymax); + x -= bdfc1->xmin + (bdfc2->width-bdfc2->xmin) + + (kern->newoff*kpd->bdf->pixelsize/em); + } + BaseFillFromBDFC(&base,bdfc2); +#ifndef _BrokenBitmapImages + base.trans = base.clut->trans_index = 0; +#endif + yoff = (kern->newyoff*kpd->bdf->pixelsize/em); + GDrawDrawImage(pixmap,&gi,NULL, x,subclip.y+as-bdfc2->ymax-yoff); + GDrawDrawLine(pixmap,0,subclip.y+kpd->uh-1, + subclip.x+subclip.width,subclip.y+kpd->uh-1,0x000000); + if ( kern->kp!=NULL ) + sprintf( buffer, "%d ", kern->newoff); + else + sprintf( buffer, "%d,%d ", kern->newoff, kern->newyoff ); + uc_strcpy(ubuf,buffer); + if ( kern->ac!=NULL ) + u_strncat(ubuf,kern->ac->name,sizeof(ubuf)/sizeof(ubuf[0])); + GDrawDrawText(pixmap,15,subclip.y+kpd->uh-kpd->fh+kpd->as,ubuf,-1,NULL, + kern->kp!=NULL && kern->newoff!=kern->kp->off ? 0xff0000 : 0x000000 ); + if ( i+kpd->off_top==kpd->selected ) { + sel.x = 0; sel.width = kpd->vwidth-1; + sel.y = subclip.y; sel.height = kpd->uh-2; + GDrawDrawRect(pixmap,&sel,0x000000); + } + GDrawPopClip(pixmap,&subold); + } +#ifndef _BrokenBitmapImages + base.clut->trans_index = -1; +#endif + GDrawPopClip(pixmap,&old); + GDrawSetDither(NULL, true); +} + +static void KP_RefreshSel(KPData *kpd,int index) { + Color col = index==kpd->selected ? 0x000000 : GDrawGetDefaultBackground(NULL); + GRect sel; + + if ( index==-1 ) +return; + sel.x = 0; sel.width = kpd->vwidth-1; + sel.y = (index-kpd->off_top)*kpd->uh; sel.height = kpd->uh-2; + GDrawSetLineWidth(kpd->v,0); + GDrawDrawRect(kpd->v,&sel,col); +} + +static void KP_RefreshKP(KPData *kpd,int index) { + GRect sel; + + if ( indexoff_top || index>kpd->off_top+kpd->wh ) +return; + sel.x = 0; sel.width = kpd->vwidth; + sel.y = (index-kpd->off_top)*kpd->uh; sel.height = kpd->uh; + GDrawRequestExpose(kpd->v,&sel,false); +} + +static void KP_KernClassAlter(KPData *kpd,int index) { + KernPair *kp = kpd->kerns[index].kp; + int kc_pos, kc_pos2; + KernClass *kc = SFFindKernClass(kpd->sf,kpd->kerns[index].first,kpd->kerns[index].second, + &kc_pos,false); + int i; + + if ( kc==NULL ) +return; + + for ( i=0; ikcnt; ++i ) if ( i!=index && + kpd->kerns[i].kp->kcid==kp->kcid && + kpd->kerns[i].kp->off==kp->off ) { + if ( SFFindKernClass(kpd->sf,kpd->kerns[i].first,kpd->kerns[i].second, + &kc_pos2,false)==kc && kc_pos==kc_pos2 ) { + kpd->kerns[i].newoff = kpd->kerns[index].newoff; + KP_RefreshKP(kpd,i); + } + } +} + +static BDFChar *KP_Inside(KPData *kpd, GEvent *e) { + struct kerns *kern; + int index1, index2, i; + int baseline, x, em = kpd->sf->ascent+kpd->sf->descent; + BDFChar *bdfc1, *bdfc2; + + i = e->u.mouse.y/kpd->uh + kpd->off_top; + if ( i>=kpd->kcnt ) +return( NULL ); + + kern = &kpd->kerns[i]; + index1 = kern->first->enc; + index2 = kern->second->enc; + bdfc1 = kpd->bdf->chars[index1]; + bdfc2 = kpd->bdf->chars[index2]; + if ( bdfc1 ==NULL || bdfc2==NULL ) +return( NULL ); + if ( !kern->r2l ) + x = 10 + (bdfc1->width-bdfc1->xmin) + bdfc2->xmin + + (kpd->kerns[i+kpd->off_top].newoff*kpd->bdf->pixelsize/em); + else + x = kpd->vwidth-10- (bdfc1->xmax-bdfc1->xmin) - bdfc1->xmin - + (bdfc2->width-bdfc2->xmin) - + (kern->newoff*kpd->bdf->pixelsize/em); + if ( e->u.mouse.x < x || e->u.mouse.x>= x+bdfc2->xmax-bdfc2->xmin ) +return( NULL ); + + baseline = (i-kpd->off_top)*kpd->uh + kpd->sf->ascent * kpd->bdf->pixelsize / em + kpd->vpad; + if ( e->u.mouse.y < baseline-bdfc2->ymax || e->u.mouse.y >= baseline-bdfc2->ymin ) +return( NULL ); + +return( bdfc2 ); +} + +static void KP_SetCursor(KPData *kpd, int ismove ) { + + if ( kpd->movecursor!=ismove ) { + GDrawSetCursor(kpd->v,ismove ? ct_leftright : ct_mypointer ); + kpd->movecursor = ismove; + } +} + +static BDFChar *KP_Cursor(KPData *kpd, GEvent *e) { + if ( kpd->ac==NULL ) { + BDFChar *bdfc2 = KP_Inside(kpd,e); + + KP_SetCursor(kpd,bdfc2!=NULL ); +return( bdfc2 ); + } +return( NULL ); +} + +static void KP_ScrollTo(KPData *kpd,int where) { + /* Make sure the line "where" is visible */ + + if ( whereoff_top || where>=kpd->off_top+kpd->wh ) { + where -= kpd->wh/4; + if ( where>kpd->kcnt-kpd->wh ) + where = kpd->kcnt-kpd->wh; + if ( where<0 ) where = 0; + kpd->off_top = where; + GScrollBarSetPos(GWidgetGetControl(kpd->gw,CID_ScrollBar),where); + GDrawRequestExpose(kpd->v,NULL,false); + } +} + +static void KPRemove(KPData *kpd) { + if ( kpd->selected!=-1 ) { + kpd->kerns[kpd->selected].newoff = 0; + GDrawRequestExpose(kpd->v,NULL,false); + } +} + +static void KP_Commands(KPData *kpd, GEvent *e) { + int old_sel, amount; + + switch( e->u.chr.keysym ) { + case '\177': + KPRemove(kpd); + break; + case 'z': case 'Z': + if ( e->u.chr.state&ksm_control ) { + if ( kpd->last_index!=-1 ) { + kpd->kerns[kpd->last_index].newoff = kpd->old_val; + KP_RefreshKP(kpd,kpd->last_index); + if ( kpd->kerns[kpd->last_index].kp->kcid!=0 ) + KP_KernClassAlter(kpd,kpd->last_index); + kpd->last_index = -1; + } + } else if ( e->u.chr.state&ksm_meta ) { + if ( kpd->selected!=-1 ) { + kpd->kerns[kpd->selected].newoff = kpd->kerns[kpd->selected].kp->off; + KP_RefreshKP(kpd,kpd->selected); + if ( kpd->kerns[kpd->selected].kp->kcid!=0 ) + KP_KernClassAlter(kpd,kpd->selected); + kpd->last_index = -1; + } + } + break; + case GK_Up: case GK_KP_Up: + old_sel = kpd->selected; + if ( kpd->selected<=0 ) + kpd->selected = kpd->kcnt-1; + else + --kpd->selected; + KP_RefreshSel(kpd,old_sel); + KP_RefreshSel(kpd,kpd->selected); + KP_ScrollTo(kpd,kpd->selected); + break; + case GK_Down: case GK_KP_Down: + old_sel = kpd->selected; + if ( kpd->selected==-1 || kpd->selected==kpd->kcnt-1 ) + kpd->selected = 0; + else + ++kpd->selected; + KP_RefreshSel(kpd,old_sel); + KP_RefreshSel(kpd,kpd->selected); + KP_ScrollTo(kpd,kpd->selected); + break; + case GK_Left: case GK_KP_Left: case GK_Right: case GK_KP_Right: + amount = e->u.chr.keysym==GK_Left || e->u.chr.keysym==GK_KP_Left? -1 : 1; + if ( e->u.chr.state&(ksm_shift|ksm_control|ksm_meta) ) amount *= 10; + if ( kpd->selected!=-1 ) { + KP_ScrollTo(kpd,kpd->selected); + kpd->last_index = kpd->selected; + kpd->old_val = kpd->kerns[kpd->selected].newoff; + kpd->kerns[kpd->selected].newoff += amount; + KP_RefreshKP(kpd,kpd->selected); + if ( kpd->kerns[kpd->selected].kp->kcid!=0 ) + KP_KernClassAlter(kpd,kpd->selected); + } + break; + } +} + +static int KP_ChangeSize(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + KPData *kpd = GDrawGetUserData(GGadgetGetWindow(g)); + int newsize = (int) (GGadgetGetListItemSelected(g)->userdata); + BDFFont *temp; + if ( newsize==kpd->bdf->pixelsize ) +return( true ); + temp = SplineFontPieceMeal(kpd->sf,newsize,true,NULL); + BDFFontFree(kpd->bdf); + kpd->bdf = temp; + KP_Resize(kpd); + } +return( true ); +} + +static int KP_ChangeSort(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + KPData *kpd = GDrawGetUserData(GGadgetGetWindow(g)); + KernPair *old = kpd->selected==-1 ? NULL : kpd->kerns[kpd->selected].kp; + int i; + + KPSortEm(kpd,GGadgetGetFirstListSelectedItem(g)); + for ( i=0 ; ikcnt; ++i ) + if ( kpd->kerns[i].kp==old ) { + kpd->selected = i; + KP_ScrollTo(kpd,i); + break; + } + GDrawRequestExpose(kpd->v,NULL,false); + } +return( true ); +} + +static int KP_Scrolled(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_scrollbarchange ) { + KPData *kpd = GDrawGetUserData(GGadgetGetWindow(g)); + int newpos = kpd->off_top; + + switch( e->u.control.u.sb.type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_halfup: + case et_sb_uppage: + newpos -= kpd->wh==1?1:kpd->wh-1; + break; + case et_sb_up: + newpos -= 1; + break; + case et_sb_halfdown: + case et_sb_down: + newpos += 1; + break; + case et_sb_downpage: + newpos += kpd->wh==1?1:kpd->wh-1; + break; + case et_sb_bottom: + newpos = kpd->kcnt-kpd->wh; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = e->u.control.u.sb.pos; + break; + } + if ( newpos>kpd->kcnt-kpd->wh ) + newpos = kpd->kcnt-kpd->wh; + if ( newpos<0 ) + newpos = 0; + if ( newpos!=kpd->off_top ) { + int off = newpos-kpd->off_top; + kpd->off_top = newpos; + GScrollBarSetPos(g,kpd->off_top); + GDrawScroll(kpd->v,NULL,0,off*kpd->uh); + } + } +return( true ); +} + +static int KP_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KPData *kpd = GDrawGetUserData(GGadgetGetWindow(g)); + int i; + FontView *fv; MetricsView *mv; + + for ( i=0; ikcnt; ++i ) if ( kpd->kerns[i].kp!=NULL ) + if ( kpd->kerns[i].newoff != kpd->kerns[i].kp->off ) { + kpd->kerns[i].kp->off = kpd->kerns[i].newoff; + kpd->sf->changed = true; + for ( fv=kpd->sf->fv; fv!=NULL; fv = fv->nextsame ) { + for ( mv=fv->metrics; mv!=NULL; mv=mv->next ) + MVRefreshChar(mv,kpd->kerns[i].first); + } + } + kpd->done = true; + } +return( true ); +} + +static int KP_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KPData *kpd = GDrawGetUserData(GGadgetGetWindow(g)); + kpd->done = true; + } +return( true ); +} + +static void KPMenuRemove(GWindow gw,struct gmenuitem *mi,GEvent *e) { + KPData *kpd = GDrawGetUserData(gw); + KPRemove(kpd); +} + +static GMenuItem kernmenu[] = { + { { (unichar_t *) _STR_Clear, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, '\177', 0, NULL, NULL, KPMenuRemove }, + { NULL } +}; + +static unichar_t upopupbuf[100]; + +static int kpdv_e_h(GWindow gw, GEvent *event) { + KPData *kpd = GDrawGetUserData(gw); + int index, old_sel, temp; + char buffer[100]; + + switch ( event->type ) { + case et_expose: + KP_ExposeKerns(kpd,gw,&event->u.expose.rect); + break; + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("kernpairs.html"); +return( true ); + } + KP_Commands(kpd,event); + break; + case et_mousedown: + GGadgetEndPopup(); + kpd->pressed = true; + index = kpd->off_top + event->u.mouse.y/kpd->uh; + if ( index>=kpd->kcnt ) + index = -1; + if ( index!=kpd->selected ) { + old_sel = kpd->selected; + kpd->selected = index; + KP_RefreshSel(kpd,old_sel); + KP_RefreshSel(kpd,index); + } + if ( event->u.mouse.button==3 && index>=0 ) { + if ( kpd->ac==NULL ) + GMenuCreatePopupMenu(gw,event, kernmenu); + } else if ( KP_Cursor(kpd,event)!=NULL ) { + kpd->pressed_x = event->u.mouse.x; + kpd->old_val = kpd->kerns[index].newoff; + } else + kpd->pressed_x = -1; + break; + case et_mouseup: + if ( kpd->pressed_x!=-1 ) + kpd->last_index = kpd->selected; + else + kpd->last_index = -1; + /* Fall through... */ + case et_mousemove: + GGadgetEndPopup(); + index = kpd->off_top + event->u.mouse.y/kpd->uh; + if ( !kpd->pressed && indexkcnt ) { + sprintf( buffer, "%.20s %d U+%04x", + kpd->kerns[index].first->name, + kpd->kerns[index].first->enc, + kpd->kerns[index].first->unicodeenc ); + if ( kpd->kerns[index].first->unicodeenc==-1 ) + strcpy(buffer+strlen(buffer)-4, "????"); + sprintf( buffer+strlen(buffer), " + %.20s %d U+%04x", + kpd->kerns[index].second->name, + kpd->kerns[index].second->enc, + kpd->kerns[index].second->unicodeenc ); + if ( kpd->kerns[index].second->unicodeenc==-1 ) + strcpy(buffer+strlen(buffer)-4, "????"); + uc_strcpy(upopupbuf,buffer); + GGadgetPreparePopup(gw,upopupbuf); + KP_Cursor(kpd,event); + } else if ( kpd->pressed && kpd->pressed_x!=-1 ) { + if ( kpd->ac!=NULL ) { + /* Nothing to be done. That's what I find so wonderful. Happy Days */ + } else if ( index==kpd->selected ) { + KP_SetCursor(kpd,true); + temp = kpd->old_val + (event->u.mouse.x-kpd->pressed_x)*(kpd->sf->ascent+kpd->sf->descent)/kpd->bdf->pixelsize; + if ( temp!=kpd->kerns[index].newoff ) { + kpd->kerns[index].newoff = temp; + KP_RefreshKP(kpd,index); + } + } else { + if ( kpd->movecursor ) { + kpd->kerns[kpd->selected].newoff = kpd->old_val; + KP_SetCursor(kpd,false); + KP_RefreshKP(kpd,kpd->selected); + } + } + if ( kpd->ac==NULL && kpd->kerns[index].kp->kcid!=0 && event->type==et_mouseup ) + KP_KernClassAlter(kpd,index); + } + if ( event->type==et_mouseup ) + kpd->pressed = false; + break; + } +return( true ); +} + +static void kpdpopup(KPData *kpd) { + char buffer[100]; + + if ( kpd->ac==NULL ) { + sprintf( buffer, "total kern pairs=%d\nchars starting kerns=%d", + kpd->kcnt, kpd->firstcnt ); + } else { + sprintf( buffer, "total anchored pairs=%d\nbase char cnt=%d", + kpd->kcnt, kpd->firstcnt ); + } + uc_strcpy(upopupbuf,buffer); + GGadgetPreparePopup(kpd->gw,upopupbuf); +} + +static int kpd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + KPData *kpd = GDrawGetUserData(gw); + kpd->done = true; + } else if ( event->type == et_mousemove ) { + kpdpopup(GDrawGetUserData(gw)); + } else if ( event->type == et_expose ) { + KPData *kpd = GDrawGetUserData(gw); + GDrawSetLineWidth(gw,0); + GDrawDrawLine(gw,0,kpd->header_height-1, + event->u.expose.rect.x+event->u.expose.rect.width,kpd->header_height-1, + 0x000000); + GDrawDrawLine(gw,0,kpd->header_height+kpd->wh*kpd->uh, + event->u.expose.rect.x+event->u.expose.rect.width,kpd->header_height+kpd->wh*kpd->uh, + 0x000000); + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("kernpairs.html"); +return( true ); + } + if ( event->u.chr.chars[0]!='\0' && event->u.chr.chars[1]=='\0' ) { + enum sortby sort = GGadgetGetFirstListSelectedItem(GWidgetGetControl(gw,CID_SortBy)); + KPData *kpd = GDrawGetUserData(gw); + if ( sort!=sb_kern ) { + KPScrollTo(kpd,event->u.chr.chars[0],sort); +return( true ); + } else + GDrawBeep(NULL); + } +return( false ); + } else if ( event->type == et_resize && event->u.resize.sized ) { + KP_Resize((KPData *) GDrawGetUserData(gw) ); + } +return( true ); +} + +void SFShowKernPairs(SplineFont *sf,SplineChar *sc,AnchorClass *ac) { + KPData kpd; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + FontRequest rq; + static unichar_t helv[] = { 'h', 'e', 'l', 'v', 'e', 't', 'i', 'c', 'a',',','c','a','l','i','b','a','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + int as, ds, ld; + + memset(&kpd,0,sizeof(kpd)); + kpd.sf = sf; + kpd.sc = sc; + kpd.ac = ac; + kpd.first = true; + kpd.last_index = kpd.selected = -1; + if ( ac==NULL ) + KPBuildKernList(&kpd); + else + KPBuildAnchorList(&kpd); + if ( kpd.kcnt==0 ) +return; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<selected = true; + gcd[1].gd.pos.x = 50; gcd[1].gd.pos.y = 5; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].gd.cid = CID_Size; + gcd[1].gd.u.list = sizes; + gcd[1].gd.handle_controlevent = KP_ChangeSize; + gcd[1].creator = GListButtonCreate; + + label[2].text = (unichar_t *) _STR_SortBy; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = gcd[0].gd.pos.x; gcd[2].gd.pos.y = gcd[0].gd.pos.y+25; + gcd[2].gd.flags = gg_enabled|gg_visible; + gcd[2].creator = GLabelCreate; + + gcd[3].gd.label = &sortby[0]; gcd[3].gd.label->selected = true; + gcd[3].gd.pos.x = 50; gcd[3].gd.pos.y = gcd[1].gd.pos.y+25; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].gd.cid = CID_SortBy; + gcd[3].gd.u.list = sortby; + gcd[3].gd.handle_controlevent = KP_ChangeSort; + gcd[3].creator = GListButtonCreate; + + /* Will be moved to its proper place by KP_Resize */ + gcd[4].gd.pos.x = 50; gcd[4].gd.pos.y = gcd[0].gd.pos.y+22; + gcd[4].gd.flags = gg_enabled|gg_visible|gg_sb_vert; + gcd[4].gd.cid = CID_ScrollBar; + gcd[4].gd.handle_controlevent = KP_Scrolled; + gcd[4].creator = GScrollBarCreate; + + gcd[5].gd.pos.x = 20-3; gcd[5].gd.pos.y = 17+37; + gcd[5].gd.pos.width = -1; gcd[5].gd.pos.height = 0; + gcd[5].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[5].text = (unichar_t *) _STR_OK; + label[5].text_in_resource = true; + gcd[5].gd.mnemonic = 'O'; + gcd[5].gd.label = &label[5]; + gcd[5].gd.cid = CID_OK; + gcd[5].gd.handle_controlevent = KP_OK; + gcd[5].creator = GButtonCreate; + + gcd[6].gd.pos.x = -20; gcd[6].gd.pos.y = gcd[5].gd.pos.y+3; + gcd[6].gd.pos.width = -1; gcd[6].gd.pos.height = 0; + gcd[6].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[6].text = (unichar_t *) _STR_Cancel; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.mnemonic = 'C'; + gcd[6].gd.cid = CID_Cancel; + gcd[6].gd.handle_controlevent = KP_Cancel; + gcd[6].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + + GGadgetGetSize(gcd[4].ret,&pos); + kpd.sb_width = pos.width; + GGadgetGetSize(gcd[3].ret,&pos); + kpd.header_height = pos.y+pos.height+4; + + pos.x = 0; pos.y = kpd.header_height; + pos.width = pos.height = 100; /* Will be fixed later (KP_Resize) */ + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + kpd.v = GWidgetCreateSubWindow(gw,&pos,kpdv_e_h,&kpd,&wattrs); + + kpd.bdf = SplineFontPieceMeal(kpd.sf,(int) (gcd[1].gd.label->userdata),true,NULL); + + memset(&rq,'\0',sizeof(rq)); + rq.family_name = helv; + rq.point_size = -12; + rq.weight = 400; + kpd.font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawFontMetrics(kpd.font,&as,&ds,&ld); + kpd.fh = as+ds; kpd.as = as; + + KP_Resize(&kpd); + + GDrawSetVisible(kpd.v,true); + GDrawSetVisible(kpd.gw,true); + while ( !kpd.done ) + GDrawProcessOneEvent(NULL); + free( kpd.kerns ); + GDrawDestroyWindow(gw); +} diff --git a/fontforge/configure-pfaedit.h b/fontforge/configure-pfaedit.h new file mode 100644 index 00000000..872f07b3 --- /dev/null +++ b/fontforge/configure-pfaedit.h @@ -0,0 +1,152 @@ +/* Copyright (C) 2002-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _CONFIG_FONTFORGE_H_ +#define _CONFIG_FONTFORGE_H_ + +/* Making FontForge handle more of the capabilities of type3 & svg fonts is not*/ +/* something most people will want. It wastes space too. So I thought I'd */ +/* make it conditional. */ +/* */ +/* #define FONTFORGE_CONFIG_TYPE3 */ +/* */ +/* It allows people to have images in a font, multiple layers, strokes, fills */ +/* transparencies, etc. (type3 doesn't support transparency, svg doesn't do */ +/* images) */ +/* Can be set from configure --with-multilayer */ + + +/* I doubt anyone but me will be interested in the tile path command, so I */ +/* don't include code for it by default, but if you do want it simply define */ +/* the following macro */ +/* */ +/* #define FONTFORGE_CONFIG_TILEPATH */ +/* */ +/* The tile path command uses the contents of the clipboard as a tile which is*/ +/* applied to any selected paths, replacing them. It could be used to make a */ +/* font whose stems were filled with celtic knotwork, for example */ +/* It's sort of an extension to the Expand Stroke command, only it strokes */ +/* with a pattern */ + + +/* I thought it would be fun to write a generalized non linear transformation */ +/* routine. I'm not sure that it's very useful though. It can be used to do */ +/* perspective transformations and such */ +/* */ +/* #define FONTFORGE_CONFIG_NONLINEAR */ +/* */ +/* This command takes two strings which specify general expressions in x and y*/ +/* and applies the specified transformations to the splines. Note: Each */ +/* spline is transformed into a new spline, but some transformations require */ +/* that a spline be broken into components and each of those transformed eg: */ +/* "x' = x, y' = y+sin(x)" would not produce anything useful when applied to */ +/* a long line segment like [0,100]···[100,100], but if that were broken up */ +/* into sub-segments each pi long the results would be much better */ + + +/* There used to be a property _XFREE86_GLYPH_RANGES (in bdf/pcf) fonts which */ +/* gave a quick view about what glyphs were in a bdf font. From what I gather*/ +/* this property has been dropped because it was redundant. If you would */ +/* like FontForge to generate it */ +/* */ +/* #define FONTFORGE_CONFIG_BDF_GLYPH_RANGES */ +/* */ + + +/* Harald Harders would like to be able to generate a PFM file without */ +/* creating a font along with it. I don't see the need for this, but he pro- */ +/* vided a patch. Setting this flag will enable his patch */ +/* */ +/* #define FONTFORGE_CONFIG_WRITE_PFM */ +/* */ + + +/* Prior to late Sept of 2003 FontForge converted certain mac feature/settings*/ +/* into opentype-like tags. Some features could be converted directly but for*/ +/* a few I made up tags. Now FontForge is capable of using the mac feature */ +/* settings directly. If you set this flag then when FontForge loads in an sfd*/ +/* file with these non-standard opentype tags, it will convert them into the */ +/* appropriate mac feature/setting combinations. */ +/* */ +/* #define FONTFORGE_CONFIG_CVT_OLD_MAC_FEATURES */ +/* */ + +/* ************************************************************************** */ +/* *********************** Set by configure script ************************** */ +/* ************************************************************************** */ + +/* The following are expected to be set by the configure script, but I suppose*/ +/* you could set them here too */ + +/* If your system does not have a working ldopen (to do dynamic binding of */ +/* shared libaries) then set NODYNAMIC */ + +/* If you are on a Mac then set __Mac */ +/* If you are on a windows box with cygwin set __CygWin */ + +/* If you are on a Mac where cursors are restricted to 16x16 pixel boxes then */ +/* set _CursorsMustBe16x16 */ + +/* If you are on cygwin where even the modifier keys autorepeat then set */ +/* _ModKeysAutoRepeat */ + +/* If you are on cygwin where some of the drawmode funtions (like AND) don't */ +/* work then set _BrokenBitmapImages */ + +/* FontForge knows about 4 different keyboard settings, a windows keyboard, a */ +/* mac keyboard, a mac keyboard under SUSE linux, and a sun keyboard */ +/* When it starts up FontForge assumes that the keyboard is some default type*/ +/* You can override the type by setting _Keyboard to */ +/* 0 -- windows */ +/* 1 -- mac running mac osx */ +/* 3 -- mac running SUSE linux (7.1) */ +/* 2 -- sparc */ +/* Basically this affects the text that appears in menus. The sun keyboard */ +/* uses meta where the windows one uses alt, and the mac use command and */ +/* option. */ + +/* If there are no freetype header files then define _NO_FREETYPE */ +/* If the freetype library has the bytecode debugger then define FREETYPE_HAS_DEBUGGER */ +/* If there is no mmap system call then define _NO_MMAP */ + +/* If there is no ungif library (or if it is out of date) define _NO_LIBUNGIF */ +/* If there is no png (or z) library define _NO_LIBPNG */ +/* If there libpng is version 1.2 define _LIBPNG12 */ +/* If there is no jpeg library define _NO_LIBJPEG */ +/* If there is no tiff library define _NO_LIBTIFF */ +/* If there is no xml2 library define _NO_LIBXML */ +/* If there is no uninameslist library define _NO_LIBUNINAMESLIST */ + +/* If any of the above libraries exists, but only in static form (on a system */ +/* with a dynamic loader) then define _STATIC_LIBUNGIF, etc. */ + +/* If there is no snprintf define _NO_SNPRINTF */ + +/* If the XInput extension is not available define _NO_XINPUT */ +/* If the Xkb extension is not available define _NO_XKB */ + +/* If the compiler supports long long define _HAS_LONGLONG */ +#endif diff --git a/fontforge/contextchain.c b/fontforge/contextchain.c new file mode 100644 index 00000000..12cf5353 --- /dev/null +++ b/fontforge/contextchain.c @@ -0,0 +1,2716 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include + +static void FPSTRuleContentsFree(struct fpst_rule *r, enum fpossub_format format) { + int j; + + switch ( format ) { + case pst_glyphs: + free(r->u.glyph.names); + free(r->u.glyph.back); + free(r->u.glyph.fore); + break; + case pst_class: + free(r->u.class.nclasses); + free(r->u.class.bclasses); + free(r->u.class.fclasses); + break; + case pst_reversecoverage: + free(r->u.rcoverage.replacements); + case pst_coverage: + for ( j=0 ; ju.coverage.ncnt ; ++j ) + free(r->u.coverage.ncovers[j]); + free(r->u.coverage.ncovers); + for ( j=0 ; ju.coverage.bcnt ; ++j ) + free(r->u.coverage.bcovers[j]); + free(r->u.coverage.bcovers); + for ( j=0 ; ju.coverage.fcnt ; ++j ) + free(r->u.coverage.fcovers[j]); + free(r->u.coverage.fcovers); + break; + } + free(r->lookups); +} + +static void FPSTRulesFree(struct fpst_rule *r, enum fpossub_format format, int rcnt) { + int i; + for ( i=0; iu.glyph.names = copy(f->u.glyph.names); + t->u.glyph.back = copy(f->u.glyph.back); + t->u.glyph.fore = copy(f->u.glyph.fore); + break; + case pst_class: + t->u.class.ncnt = f->u.class.ncnt; + t->u.class.bcnt = f->u.class.bcnt; + t->u.class.fcnt = f->u.class.fcnt; + t->u.class.nclasses = galloc( f->u.class.ncnt*sizeof(uint16)); + memcpy(t->u.class.nclasses,f->u.class.nclasses, + f->u.class.ncnt*sizeof(uint16)); + if ( t->u.class.bcnt!=0 ) { + t->u.class.bclasses = galloc( f->u.class.bcnt*sizeof(uint16)); + memcpy(t->u.class.bclasses,f->u.class.bclasses, + f->u.class.bcnt*sizeof(uint16)); + } + if ( t->u.class.fcnt!=0 ) { + t->u.class.fclasses = galloc( f->u.class.fcnt*sizeof(uint16)); + memcpy(t->u.class.fclasses,f->u.class.fclasses, + f->u.class.fcnt*sizeof(uint16)); + } + break; + case pst_reversecoverage: + t->u.rcoverage.replacements = copy(f->u.rcoverage.replacements); + case pst_coverage: + t->u.coverage.ncnt = f->u.coverage.ncnt; + t->u.coverage.bcnt = f->u.coverage.bcnt; + t->u.coverage.fcnt = f->u.coverage.fcnt; + t->u.coverage.ncovers = galloc( f->u.coverage.ncnt*sizeof(char *)); + for ( j=0; ju.coverage.ncnt; ++j ) + t->u.coverage.ncovers[j] = copy(f->u.coverage.ncovers[j]); + if ( t->u.coverage.bcnt!=0 ) { + t->u.coverage.bcovers = galloc( f->u.coverage.bcnt*sizeof(char *)); + for ( j=0; ju.coverage.bcnt; ++j ) + t->u.coverage.bcovers[j] = copy(f->u.coverage.bcovers[j]); + } + if ( t->u.coverage.fcnt!=0 ) { + t->u.coverage.fcovers = galloc( f->u.coverage.fcnt*sizeof(char *)); + for ( j=0; ju.coverage.fcnt; ++j ) + t->u.coverage.fcovers[j] = copy(f->u.coverage.fcovers[j]); + } + break; + } + if ( f->lookup_cnt!=0 ) { + t->lookup_cnt = f->lookup_cnt; + t->lookups = galloc(t->lookup_cnt*sizeof(struct seqlookup)); + memcpy(t->lookups,f->lookups,t->lookup_cnt*sizeof(struct seqlookup)); + } + } +return( t ); +} +#endif + +void FPSTFree(FPST *fpst) { + FPST *next; + int i; + + while ( fpst!=NULL ) { + next = fpst->next; + for ( i=0; inccnt; ++i ) + free(fpst->nclass[i]); + for ( i=0; ibccnt; ++i ) + free(fpst->bclass[i]); + for ( i=0; ifccnt; ++i ) + free(fpst->fclass[i]); + free(fpst->nclass); free(fpst->bclass); free(fpst->fclass); + for ( i=0; irule_cnt; ++i ) { + FPSTRuleContentsFree( &fpst->rules[i],fpst->format ); + } + free(fpst->rules); + chunkfree(fpst,sizeof(FPST)); + fpst = next; + } +} + +int ClassesMatch(int cnt1,char **classes1,int cnt2,char **classes2) { + int i; + + if ( cnt1!=cnt2 ) +return( false ); + for ( i=1; iformat!=pst_glyphs ) +return( NULL ); + + new = chunkalloc(sizeof(FPST)); + new->type = fpst->type; + new->format = pst_class; + new->script_lang_index = fpst->script_lang_index; + new->flags = fpst->flags; + new->tag = fpst->tag; + new->rule_cnt = fpst->rule_cnt; + new->rules = gcalloc(fpst->rule_cnt,sizeof(struct fpst_rule)); + + max = 100; nextclass=1; + names = galloc(max*sizeof(char *)); + names[0] = NULL; + for ( i=0; irule_cnt; ++i ) { + for ( j=0; j<3; ++j ) { + cnt = 0; + if ( (&fpst->rules[i].u.glyph.names)[j]!=NULL && *(&fpst->rules[i].u.glyph.names)[j]!='\0' ) { + cnt = 1; + for ( pt=(&fpst->rules[i].u.glyph.names)[j]; *pt; ++pt ) { + if ( *pt==' ' ) { + ++cnt; + while ( *pt==' ' ) ++pt; + --pt; + } + } + } + (&new->rules[i].u.class.ncnt)[j] = cnt; + if ( cnt!=0 ) { + (&new->rules[i].u.class.nclasses)[j] = galloc(cnt*sizeof(uint16)); + cnt = 0; + for ( pt=(&fpst->rules[i].u.glyph.names)[j]; *pt; pt=end ) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + for ( end=pt ; *end!=' ' && *end!='\0'; ++end ); + ch = *end; *end='\0'; + for ( k=1; k=max ) + names = grealloc(names,(max+=100)*sizeof(char *)); + names[nextclass++] = copy(pt); + } + *end = ch; + (&new->rules[i].u.class.nclasses)[j][cnt++] = k; + } + } + } + new->rules[i].lookup_cnt = fpst->rules[i].lookup_cnt; + new->rules[i].lookups = galloc(fpst->rules[i].lookup_cnt*sizeof(struct seqlookup)); + memcpy(new->rules[i].lookups,fpst->rules[i].lookups, + fpst->rules[i].lookup_cnt*sizeof(struct seqlookup)); + } + new->nccnt = nextclass; + new->nclass = names; + if ( fpst->type==pst_chainpos || fpst->type==pst_chainsub ) { + /* our class set has one "class" for each glyph used anywhere */ + /* all three class sets are the same */ + new->bccnt = new->fccnt = nextclass; + new->bclass = classcopy(names,nextclass); + new->fclass = classcopy(names,nextclass); + } +return( new ); +} + +/* ************************************************************************** */ +/* ************************ Context/Chaining Dialog ************************* */ +/* ************************************************************************** */ +struct contextchaindlg { + struct gfi_data *gfi; + SplineFont *sf; + FPST *fpst; + unichar_t *newname; + int isnew; + GWindow gw; + GWindow formats, coverage, glist, glyphs, cselect, class, classbuild, classnumber; + enum activewindow { aw_formats, aw_coverage, aw_glist, aw_glyphs, aw_cselect, + aw_class, aw_classbuild, aw_classnumber } aw; + uint16 wasedit; + uint16 wasoffset; + uint8 foredefault; + int subheightdiff, canceldrop; +}; + +#define CID_OK 100 +#define CID_Cancel 101 +#define CID_Next 102 +#define CID_Prev 103 +#define CID_Group 104 + +#define CID_ByGlyph 200 +#define CID_ByClass 201 +#define CID_ByCoverage 202 + +/* There are more CIDs used in this file than those listed here */ +/* The CIDs given here are for glyph lists (aw_glyphs & aw_glist) */ +/* similar controls refering to coverage tables have 100 added to them */ +/* The CIDs here are also for the "match" aspect of the tabsets */ +/* those in backtrack get 20 added, those in lookahead get 40 */ +#define CID_New 300 +#define CID_Edit 301 +#define CID_Delete 302 +#define CID_Up 303 +#define CID_Down 304 +#define CID_GList 305 + +#define CID_MatchType 1003 +#define CID_Set 1004 +#define CID_Select 1005 +#define CID_GlyphList 1006 +#define CID_Set2 1007 +#define CID_Select2 1008 +#define CID_RplList 1009 +#define CID_LookupList 1010 +#define CID_LNew 1011 +#define CID_LEdit 1012 +#define CID_LDelete 1013 +#define CID_LUp 1014 +#define CID_LDown 1015 + +#define CID_ClassNumbers 2000 +#define CID_ClassList 2001 +#define CID_ClassType 2002 +#define CID_SameAsClasses 2003 + +char *cu_copybetween(const unichar_t *start, const unichar_t *end) { + char *ret = galloc(end-start+1); + cu_strncpy(ret,start,end-start); + ret[end-start] = '\0'; +return( ret ); +} + +static char *ccd_cu_copy(const unichar_t *start) { + char *ret, *pt; + int first; + + while ( isspace(*start)) ++start; + if ( *start=='\0' ) +return( NULL ); + ret = pt = galloc(u_strlen(start)+1); + first = true; + while ( *start ) { + while ( !isspace(*start) && *start!='\0' ) + *pt++ = *start++; + while ( isspace(*start)) ++start; + if ( *start!='\0' ) *pt++ = ' '; + } + *pt = '\0'; +return( ret ); +} + +static char *reversenames(char *str) { + char *ret; + char *rpt, *pt, *start, *spt; + + if ( str==NULL ) +return( NULL ); + + rpt = ret = galloc(strlen(str)+1); + *ret = '\0'; + for ( pt=str+strlen(str); pt>str; pt=start ) { + for ( start = pt-1; start>=str && *start!=' '; --start ); + for ( spt=start+1; sptret ) + rpt[-1] = '\0'; +return( ret ); +} + +static unichar_t *classnumbers(int cnt,uint16 *classes) { + char buf[20]; + int i, len; + unichar_t *pt, *ret; + + len = 0; + for ( i=0; i=0; --i ) { + sprintf( buf, "%d ", classes[i]); + uc_strcpy(pt,buf); + pt += strlen(buf); + } +return( ret ); +} + +static int CCD_GlyphNameCnt(const unichar_t *pt) { + int cnt = 0; + + while ( *pt ) { + while ( isspace( *pt )) ++pt; + if ( *pt=='\0' ) +return( cnt ); + ++cnt; + while ( !isspace(*pt) && *pt!='\0' ) ++pt; + } +return( cnt ); +} + +static unichar_t *glistitem(struct fpst_rule *r) { + unichar_t *ret, *pt; + int len, i; + char buf[20]; + + len = (r->u.glyph.back==NULL ? 0 : strlen(r->u.glyph.back)) + + strlen(r->u.glyph.names) + + (r->u.glyph.fore==0 ? 0 : strlen(r->u.glyph.fore))+ + 13*r->lookup_cnt; + ret = pt = galloc((len+8) * sizeof(unichar_t)); + if ( r->u.glyph.back!=NULL && *r->u.glyph.back!='\0' ) { + char *temp = reversenames(r->u.glyph.back); + uc_strcpy(pt,temp); + pt += strlen(temp); + free(temp); + *pt++ = ' '; + } + *pt++ = '['; + *pt++ = ' '; + uc_strcpy(pt,r->u.glyph.names); + pt += strlen(r->u.glyph.names); + *pt++ = ' '; + *pt++ = ']'; + *pt++ = ' '; + if ( r->u.glyph.fore!=NULL && *r->u.glyph.fore!='\0' ) { + uc_strcpy(pt,r->u.glyph.fore); + pt += strlen(r->u.glyph.fore); + *pt++ = ' '; + } + *pt++ = 0x21d2; + for ( i=0; ilookup_cnt; ++i ) { + sprintf( buf," %d '%c%c%c%c',", r->lookups[i].seq, + r->lookups[i].lookup_tag>>24, + (r->lookups[i].lookup_tag>>16)&0xff, + (r->lookups[i].lookup_tag>>8)&0xff, + r->lookups[i].lookup_tag&0xff ); + uc_strcpy(pt, buf); + pt += u_strlen(pt); + } + if ( pt[-1]==',' ) pt[-1] = '\0'; + *pt = '\0'; +return( ret ); +} + +static void glistitem2rule(const unichar_t *ret,struct fpst_rule *r) { + const unichar_t *pt; unichar_t *end; + char *temp; + int cnt; + + for ( pt=ret; *pt!='\0' && *pt!='['; ++pt ); + if ( *pt=='\0' ) +return; + if ( pt>ret ) { + temp = cu_copybetween(ret,pt-1); + r->u.glyph.back = reversenames(temp); + free(temp); + } + ret = pt+2; + for ( pt=ret; *pt!='\0' && *pt!=']'; ++pt ); + if ( *pt=='\0' ) +return; + r->u.glyph.names = cu_copybetween(ret,pt-1); + ret = pt+2; + for ( pt=ret; *pt!='\0' && *pt!=0x21d2; ++pt ); + if ( *pt=='\0' ) +return; + if ( pt!=ret ) + r->u.glyph.fore = cu_copybetween(ret,pt-1); + ret = pt+2; + for ( pt = ret, cnt=0; pt!=NULL; pt = u_strchr(pt,',')) { + ++cnt; ++pt; + } + r->lookup_cnt = cnt; + r->lookups = gcalloc(cnt,sizeof(struct seqlookup)); + cnt = 0; + pt = ret; + forever { + r->lookups[cnt].seq = u_strtol(pt,&end,10); + pt = end+2; + r->lookups[cnt].lookup_tag = (pt[0]<<24) | (pt[1]<<16) | (pt[2]<<8) | pt[3]; + pt += 5; + ++cnt; + if ( *pt!=',' ) + break; + ++pt; + } +} + +static GTextInfo **glistlist(FPST *fpst) { + GTextInfo **ti; + int i; + + if ( fpst->format!=pst_glyphs || fpst->rule_cnt==0 ) +return(NULL); + ti = galloc((fpst->rule_cnt+1)*sizeof(GTextInfo *)); + ti[fpst->rule_cnt] = gcalloc(1,sizeof(GTextInfo)); + for ( i=0; irule_cnt; ++i ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + ti[i]->text = glistitem(&fpst->rules[i]); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + } +return( ti ); +} + +static unichar_t *clslistitem(struct fpst_rule *r) { + unichar_t *ret, *pt; + int len, i, k; + char buf[20]; + + len = 0; + for ( i=0; i<3; ++i ) { + for ( k=0; k<(&r->u.class.ncnt)[i]; ++k ) { + sprintf( buf, "%d ", (&r->u.class.nclasses)[i][k]); + len += strlen(buf); + } + } + + ret = pt = galloc((len+8+13*r->lookup_cnt) * sizeof(unichar_t)); + for ( k=r->u.class.bcnt-1; k>=0; --k ) { + sprintf( buf, "%d ", r->u.class.bclasses[k]); + uc_strcpy(pt,buf); + pt += strlen(buf); + } + *pt++ = '['; + for ( k=0; ku.class.ncnt; ++k ) { + sprintf( buf, "%d ", r->u.class.nclasses[k]); + uc_strcpy(pt,buf); + pt += strlen(buf); + } + if ( pt[-1]==' ' ) --pt; + *pt++ = ']'; + for ( k=0; ku.class.fcnt; ++k ) { + sprintf( buf, " %d", r->u.class.fclasses[k]); + uc_strcpy(pt,buf); + pt += strlen(buf); + } + + *pt++ = ' '; + *pt++ = 0x21d2; + for ( i=0; ilookup_cnt; ++i ) { + sprintf( buf," %d '%c%c%c%c',", r->lookups[i].seq, + r->lookups[i].lookup_tag>>24, + (r->lookups[i].lookup_tag>>16)&0xff, + (r->lookups[i].lookup_tag>>8)&0xff, + r->lookups[i].lookup_tag&0xff ); + uc_strcpy(pt, buf); + pt += u_strlen(pt); + } + if ( pt[-1]==',' ) pt[-1] = '\0'; + *pt = '\0'; +return( ret ); +} + +static void clslistitem2rule(const unichar_t *ret,struct fpst_rule *r) { + const unichar_t *pt; unichar_t *end; + int cnt; + int len, i; + + memset(r,0,sizeof(*r)); + + len = 0; i=1; + for ( pt=ret; *pt; ++pt ) { + while ( *pt!='[' && *pt!=']' && *pt!=0x21d2 && *pt!='\0' ) { + if ( isdigit( *pt )) { + ++len; + while ( isdigit(*pt)) ++pt; + } else if ( *pt!=' ' && *pt!='[' && *pt!=']' && *pt!=0x21d2 && *pt!='\0' ) + ++pt; + while ( *pt==' ' ) ++pt; + } + (&r->u.class.ncnt)[i] = len; + (&r->u.class.nclasses)[i] = galloc(len*sizeof(uint16)); + len = 0; + if ( *pt=='\0' || *pt==0x21d2 ) + break; + if ( *pt=='[' ) i=0; + else i=2; + } + len = 0; i=1; + for ( pt=ret; *pt; ++pt ) { + while ( *pt!='[' && *pt!=']' && *pt!=0x21d2 && *pt!='\0' ) { + if ( isdigit( *pt )) { + if ( len>=(&r->u.class.ncnt)[i] ) + GDrawIError( "clslistitem2rule bad memory"); + (&r->u.class.nclasses)[i][len++] = u_strtol(pt,&end,10); + pt = end; + } else if ( *pt!=' ' && *pt!='[' && *pt!=']' && *pt!=0x21d2 && *pt!='\0' ) + ++pt; + while ( *pt==' ' ) ++pt; + } + len = 0; + if ( *pt=='[' ) i=0; + else i=2; + if ( *pt=='\0' || *pt==0x21d2 ) + break; + } + /* reverse the backtrack */ + for ( i=0; iu.class.bcnt/2; ++i ) { + int temp = r->u.class.bclasses[i]; + r->u.class.bclasses[i] = r->u.class.bclasses[r->u.class.bcnt-1-i]; + r->u.class.bclasses[r->u.class.bcnt-1-i] = temp; + } + + if ( *pt=='\0' ) +return; + ret = pt+2; + for ( pt = ret, cnt=0; pt!=NULL; pt = u_strchr(pt,',')) { + ++cnt; ++pt; + } + r->lookup_cnt = cnt; + r->lookups = gcalloc(cnt,sizeof(struct seqlookup)); + cnt = 0; + pt = ret; + forever { + r->lookups[cnt].seq = u_strtol(pt,&end,10); + pt = end+2; + r->lookups[cnt].lookup_tag = (pt[0]<<24) | (pt[1]<<16) | (pt[2]<<8) | pt[3]; + pt += 5; + ++cnt; + if ( *pt!=',' ) + break; + ++pt; + } +} + +static GTextInfo **clslistlist(FPST *fpst) { + GTextInfo **ti; + int i; + + if ( fpst->format!=pst_class || fpst->rule_cnt==0 ) +return(NULL); + ti = galloc((fpst->rule_cnt+1)*sizeof(GTextInfo *)); + ti[fpst->rule_cnt] = gcalloc(1,sizeof(GTextInfo)); + for ( i=0; irule_cnt; ++i ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + ti[i]->text = clslistitem(&fpst->rules[i]); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + } +return( ti ); +} + +static GTextInfo **clistlist(FPST *fpst,int which) { + GTextInfo **ti; + int cnt, i; + + if ( (fpst->format!=pst_coverage && fpst->format!=pst_reversecoverage) || + fpst->rule_cnt!=1 ) +return(NULL); + cnt = (&fpst->rules[0].u.coverage.ncnt)[which]; + if ( cnt == 0 ) +return( NULL ); + ti = galloc((cnt+1)*sizeof(GTextInfo *)); + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + if ( which != 1 ) { + for ( i=0; itext = uc_copy((&fpst->rules[0].u.coverage.ncovers)[which][i]); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + } + } else { + for ( i=0; itext = uc_copy(fpst->rules[0].u.coverage.bcovers[cnt-i-1]); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + } + } +return( ti ); +} + +static GTextInfo **slistlist(struct fpst_rule *r) { + GTextInfo **ti; + char buf[20]; + int i; + + if ( r->lookup_cnt==0 ) +return(NULL); + ti = galloc((r->lookup_cnt+1)*sizeof(GTextInfo *)); + ti[r->lookup_cnt] = gcalloc(1,sizeof(GTextInfo)); + for ( i=0; ilookup_cnt; ++i ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + sprintf( buf,"%d '%c%c%c%c'", r->lookups[i].seq, + r->lookups[i].lookup_tag>>24, + (r->lookups[i].lookup_tag>>16)&0xff, + (r->lookups[i].lookup_tag>>8)&0xff, + r->lookups[i].lookup_tag&0xff ); + ti[i]->text = uc_copy(buf); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + } +return( ti ); +} + +static void CCD_ParseLookupList(struct fpst_rule *r,GGadget *list) { + int32 len, i; + GTextInfo **ti = GGadgetGetList(list,&len); + unichar_t *end; + + r->lookup_cnt = len; + r->lookups = galloc(len*sizeof(struct seqlookup)); + for ( i=0; ilookups[i].seq = u_strtol(ti[i]->text,&end,10); + while ( *end==' ') ++end; + if ( *end=='\'' ) ++end; + r->lookups[i].lookup_tag = + ((*end&0xff)<<24) | ((end[1]&0xff)<<16) | ((end[2]&0xff)<<8)| (end[3]&0xff); + } +} + +static void CCD_EnableNextPrev(struct contextchaindlg *ccd) { + /* Cancel is always enabled */ + switch ( ccd->aw ) { + case aw_formats: + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Prev),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Next),true); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_OK),false); + break; + case aw_glyphs: + case aw_classbuild: + case aw_classnumber: + case aw_cselect: + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Prev),true); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Next),true); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_OK),false); + break; + case aw_coverage: + case aw_glist: + case aw_class: + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Prev),ccd->fpst->format!=pst_reversecoverage); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Next),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_OK),true); + break; + default: + GDrawIError("Can't get here"); + break; + } +} + +static int CCD_ValidNameList(const unichar_t *ret,int empty_bad) { + int first; + + while ( isspace(*ret)) ++ret; + if ( *ret=='\0' ) +return( !empty_bad ); + + first = true; + while ( *ret ) { + if ( *ret>=0x7f || *ret<' ' ) +return( false ); + if ( first && isdigit(*ret) ) +return( false ); + first = isspace(*ret); + if ( *ret=='(' || *ret=='[' || *ret=='{' || *ret=='<' || + *ret==')' || *ret==']' || *ret=='}' || *ret=='>' || + *ret=='%' || *ret=='/' ) +return( false ); + ++ret; + } +return( true ); +} + +static char *CCD_NonExistantName(SplineFont *sf,const unichar_t *ret) { + const unichar_t *pt, *end; char *name; + + for ( pt = ret; *pt; pt = end ) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + end = u_strchr(pt,' '); + if ( end==NULL ) end = pt+u_strlen(pt); + name = cu_copybetween(pt,end); + if ( SFGetChar(sf,-1,name)==NULL ) +return( name ); + free(name); + } +return( NULL ); +} + +int CCD_NameListCheck(SplineFont *sf,const unichar_t *ret,int empty_bad,int title) { + char *missingname; + static int buts[] = { _STR_Yes, _STR_No, 0 }; + int ans; + + if ( !CCD_ValidNameList(ret,empty_bad) ) { + GWidgetErrorR(title,title==_STR_BadClass?_STR_BadClassLong : + title==_STR_BadCoverage ? _STR_BadCoverageLong : + _STR_BadMatchGlyphLong); +return(false); + } + if ( (missingname=CCD_NonExistantName(sf,ret))!=NULL ) { + ans = GWidgetAskR(title,buts,0,1,title==_STR_BadClass?_STR_MissingClassMember : + title==_STR_BadCoverage ? _STR_MissingClassMember : + _STR_NoGlyphNamed,missingname ); + free(missingname); +return(!ans); + } +return( true ); +} + +int CCD_InvalidClassList(const unichar_t *ret,GGadget *list,int wasedit) { + int32 len; + GTextInfo **ti = GGadgetGetList(list,&len); + const unichar_t *pt, *end, *tpt, *tend; + int i; + + for ( pt = ret; *pt; pt = end ) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + end = u_strchr(pt,' '); + if ( end==NULL ) end = pt+u_strlen(pt); + for ( i=0; iselected ) + continue; + for ( tpt=ti[i]->text; *tpt; tpt = tend ) { + while ( *tpt==' ' ) ++tpt; + tend = u_strchr(tpt,' '); + if ( tend==NULL ) tend = tpt+u_strlen(tpt); + if ( tend-tpt==end-pt && u_strncmp(pt,tpt,end-pt)==0 ) { + unichar_t *dupname = u_copyn(pt,end-pt); + GWidgetErrorR(_STR_BadClass,_STR_BadClassName, dupname); + free(dupname); +return( true ); + } + } + } + } +return( false ); +} + +static int CCD_ReasonableClassNum(const unichar_t *match,GGadget *mlist, + const unichar_t *back, GGadget *blist, + const unichar_t *fore, GGadget *flist, + struct fpst_rule *r ) { + int mlen, blen, flen; + GTextInfo **ti; + const unichar_t *pt; unichar_t *end; + int any; + int val; + + ti = GGadgetGetList(mlist,&mlen); + ti = GGadgetGetList(blist,&blen); + ti = GGadgetGetList(flist,&flen); + + any = 0; + for ( pt=match;; pt = end) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + if ( isdigit( *pt )) ++any; + val = u_strtol(pt,&end,10); + if ( *end!=' ' && *end!='\0' ) { + GWidgetErrorR(_STR_BadClassNumber,_STR_InvalidCharInClassNumber); +return( false ); + } + if ( val>=mlen || val<0) { + GWidgetErrorR(_STR_BadClassNumber,_STR_ClassNumberOutOfRange,mlen,val); +return( false ); + } + } + r->u.class.ncnt = any; + if ( any==0 ) { + GWidgetErrorR(_STR_BadClassNumber,_STR_NoMatchClassNumber); +return( false ); + } + + any = 0; + for ( pt=back;; pt = end) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + if ( isdigit( *pt )) ++any; + val = u_strtol(pt,&end,10); + if ( *end!=' ' && *end!='\0' ) { + GWidgetErrorR(_STR_BadBackClassNumber,_STR_InvalidCharInClassNumber); +return( false ); + } + if ( val>=blen || val<0) { + GWidgetErrorR(_STR_BadBackClassNumber,_STR_ClassNumberOutOfRange,blen,val); +return( false ); + } + } + r->u.class.bcnt = any; + + any = 0; + for ( pt=fore;; pt = end) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + if ( isdigit( *pt )) ++any; + val = u_strtol(pt,&end,10); + if ( *end!=' ' && *end!='\0' ) { + GWidgetErrorR(_STR_BadLookClassNumber,_STR_InvalidCharInClassNumber); +return( false ); + } + if ( val>=flen || val<0) { + GWidgetErrorR(_STR_BadLookClassNumber,_STR_ClassNumberOutOfRange,flen,val); +return( false ); + } + } + r->u.class.fcnt = any; + + r->u.class.nclasses = galloc(r->u.class.ncnt*sizeof(uint16)); + r->u.class.bclasses = galloc(r->u.class.bcnt*sizeof(uint16)); + r->u.class.fclasses = galloc(r->u.class.fcnt*sizeof(uint16)); + + any = 0; + for ( pt=match;; pt = end) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + if ( any>=r->u.class.ncnt ) GDrawIError("ReasonableClassNumber unreasonable"); + r->u.class.nclasses[any++] = u_strtol(pt,&end,10); + } + + any = 0; + for ( pt=back;; pt = end) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + if (r->u.class.bcnt-1-any<0 || r->u.class.bcnt-1-any>=r->u.class.bcnt ) GDrawIError("ReasonableClassNumber unreasonable"); + r->u.class.bclasses[r->u.class.bcnt-1-any++] = u_strtol(pt,&end,10); + } + + any = 0; + for ( pt=fore;; pt = end) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + if ( any>=r->u.class.fcnt ) GDrawIError("ReasonableClassNumber unreasonable"); + r->u.class.fclasses[any++] = u_strtol(pt,&end,10); + } +return( true ); +} + +static void CCD_FinishEditNew(struct contextchaindlg *ccd) { + char *temp; + struct fpst_rule dummy; + GGadget *list = GWidgetGetControl(ccd->gw,CID_GList+ccd->wasoffset); + + if ( ccd->wasoffset>=300 ) { /* It's a class */ + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+300)); + if ( !CCD_NameListCheck(ccd->sf,ret,true,_STR_BadClass) ) +return; + if ( CCD_InvalidClassList(ret,list,ccd->wasedit) ) +return; + if ( ccd->wasedit ) { + GListChangeLine(list,GGadgetGetFirstListSelectedItem(list),ret); + } else { + GListAppendLine(list,ret,false); + } + ccd->aw = aw_class; + GDrawSetVisible(ccd->classbuild,false); + GDrawSetVisible(ccd->class,true); + } else if ( ccd->wasoffset>=200 ) { /* It's class numbers */ + unichar_t *ret; + memset(&dummy,0,sizeof(dummy)); + CCD_ParseLookupList(&dummy,GWidgetGetControl(ccd->gw,CID_LookupList+500)); + if ( dummy.lookup_cnt==0 ) { + GWidgetErrorR(_STR_BadSeqLookup,_STR_MissingSeqLookup); +return; + } + if ( !CCD_ReasonableClassNum( + _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_ClassNumbers)), + GWidgetGetControl(ccd->gw,CID_ClassList), + _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_ClassNumbers+20)), + GWidgetGetControl(ccd->gw,CID_ClassList+20), + _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_ClassNumbers+40)), + GWidgetGetControl(ccd->gw,CID_ClassList+40), &dummy )) { + FPSTRuleContentsFree(&dummy,pst_class); +return; + } + ret = clslistitem(&dummy); + FPSTRuleContentsFree(&dummy,pst_class); + if ( ccd->wasedit ) { + GListChangeLine(list,GGadgetGetFirstListSelectedItem(list),ret); + } else { + GListAppendLine(list,ret,false); + } + ccd->aw = aw_class; + GDrawSetVisible(ccd->classnumber,false); + GDrawSetVisible(ccd->class,true); + } else if ( ccd->wasoffset>=100 ) { /* It's from coverage */ + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+100)); + if ( !CCD_NameListCheck(ccd->sf,ret,true,_STR_BadCoverage) ) +return; + if ( ccd->wasedit ) { + GListChangeLine(list,GGadgetGetFirstListSelectedItem(list),ret); + } else { + GListAppendLine(list,ret,false); + } + ccd->aw = aw_coverage; + GDrawSetVisible(ccd->cselect,false); + GDrawSetVisible(ccd->coverage,true); + } else { /* It's from glyph list */ + unichar_t *ret; const unichar_t *val; + + memset(&dummy,0,sizeof(dummy)); + val = _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList)); + if ( !CCD_NameListCheck(ccd->sf,val,true,_STR_BadGlyphList) ) +return; + val = _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+20)); + if ( !CCD_NameListCheck(ccd->sf,val,false,_STR_BadBackGlyphList) ) +return; + val = _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+40)); + if ( !CCD_NameListCheck(ccd->sf,val,false,_STR_BadForeGlyphList) ) +return; + CCD_ParseLookupList(&dummy,GWidgetGetControl(ccd->gw,CID_LookupList)); + if ( dummy.lookup_cnt==0 ) { + GWidgetErrorR(_STR_BadSeqLookup,_STR_MissingSeqLookup); +return; + } + dummy.u.glyph.names = ccd_cu_copy(_GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList))); + temp = ccd_cu_copy(_GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+20))); + dummy.u.glyph.back = reversenames(temp); + free(temp); + dummy.u.glyph.fore = ccd_cu_copy(_GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+40))); + ret = glistitem(&dummy); + FPSTRuleContentsFree(&dummy,pst_glyphs); + if ( ccd->wasedit ) { + GListChangeLine(list,GGadgetGetFirstListSelectedItem(list),ret); + } else { + GListAppendLine(list,ret,false); + } + ccd->aw = aw_glist; + GDrawSetVisible(ccd->glyphs,false); + GDrawSetVisible(ccd->glist,true); + } +} + +static void _CCD_DoEditNew(struct contextchaindlg *ccd,int off,int isedit) { + static unichar_t nulstr[] = { 0 }; + int i; + + if ( off>=200 && off<300) { /* It's a list of class numbers from the class window */ + int32 i, len; + GTextInfo **ti; + if ( isedit ) { + GGadget *list = GWidgetGetControl(ccd->gw,CID_GList+off); + struct fpst_rule dummy; + unichar_t *temp; + int len; + GTextInfo **old = GGadgetGetList(list,&len); + i = GGadgetGetFirstListSelectedItem(list); + if ( i==-1 ) +return; + memset(&dummy,0,sizeof(dummy)); + clslistitem2rule(old[i]->text,&dummy); + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_ClassNumbers), + (temp=classnumbers(dummy.u.class.ncnt,dummy.u.class.nclasses))); + free(temp); + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_ClassNumbers+20), + (temp=rclassnumbers(dummy.u.class.bcnt,dummy.u.class.bclasses))); + free(temp); + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_ClassNumbers+40), + (temp=classnumbers(dummy.u.class.fcnt,dummy.u.class.fclasses))); + free(temp); + ti = slistlist(&dummy); + GGadgetSetList(GWidgetGetControl(ccd->gw,CID_LookupList+500),ti,false); + FPSTRuleContentsFree(&dummy,pst_class); + } else { + for ( i=0; i<3; ++i ) + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_ClassNumbers+i*20),nulstr); + GGadgetClearList(GWidgetGetControl(ccd->gw,CID_LookupList+500)); + } + for ( i=0; i<3; ++i ) { + if ( i!=0 && GGadgetIsChecked(GWidgetGetControl(ccd->gw,CID_SameAsClasses+i*20)) ) + ti = GGadgetGetList(GWidgetGetControl(ccd->gw,CID_GList+300),&len); + else + ti = GGadgetGetList(GWidgetGetControl(ccd->gw,CID_GList+300+i*20),&len); + GGadgetSetList(GWidgetGetControl(ccd->gw,CID_ClassList+i*20),ti,true); + } + ccd->aw = aw_classnumber; + GDrawSetVisible(ccd->class,false); + GDrawSetVisible(ccd->classnumber,true); + } else if ( off>=100 ) { /* It's from coverage or class */ + int to_off = off>=300 ? 300 : 100; + if ( isedit ) { + GGadget *list = GWidgetGetControl(ccd->gw,CID_GList+off); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + i = GGadgetGetFirstListSelectedItem(list); + if ( i==-1 ) +return; + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+to_off),old[i]->text); + } else { + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+to_off),nulstr); + } + if ( off>=300 ) { /* It's a class from the class window */ + ccd->aw = aw_classbuild; + GDrawSetVisible(ccd->class,false); + GDrawSetVisible(ccd->classbuild,true); + } else { + ccd->aw = aw_cselect; + GDrawSetVisible(ccd->coverage,false); + GDrawSetVisible(ccd->cselect,true); + } + } else { /* It's from glyph list */ + unichar_t *temp; char *temp2; + if ( isedit ) { + struct fpst_rule dummy; + GGadget *list = GWidgetGetControl(ccd->gw,CID_GList+off); + int len, i; + GTextInfo **old = GGadgetGetList(list,&len), **ti; + i = GGadgetGetFirstListSelectedItem(list); + if ( i==-1 ) +return; + memset(&dummy,0,sizeof(dummy)); + glistitem2rule(old[i]->text,&dummy); + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList),(temp=uc_copy(dummy.u.glyph.names))); + free(temp); + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+20),(temp=uc_copy((temp2 = reversenames(dummy.u.glyph.back))==NULL ? "" : temp2))); + free(temp); free(temp2); + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+40),(temp=uc_copy(dummy.u.glyph.fore?dummy.u.glyph.fore:""))); + free(temp); + ti = slistlist(&dummy); + GGadgetSetList(GWidgetGetControl(ccd->gw,CID_LookupList),ti,false); + FPSTRuleContentsFree(&dummy,pst_glyphs); + } else { + for ( i=0; i<3; ++i ) + GGadgetSetTitle(GWidgetGetControl(ccd->gw,CID_GlyphList+i*20),nulstr); + GGadgetClearList(GWidgetGetControl(ccd->gw,CID_LookupList)); + } + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LEdit),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LDelete),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LUp),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LDown),false); + ccd->aw = aw_glyphs; + GDrawSetVisible(ccd->glist,false); + GDrawSetVisible(ccd->glyphs,true); + } + CCD_EnableNextPrev(ccd); + ccd->wasedit = isedit; + ccd->wasoffset = off; +} + +static void _CCD_ToSelection(struct contextchaindlg *ccd,int cid,int order_matters ) { + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(ccd->gw,cid)); + SplineFont *sf = ccd->sf; + FontView *fv = sf->fv; + const unichar_t *end; + int i,pos, found=-1; + char *nm; + + GDrawRaise(fv->gw); + GDrawSetVisible(fv->gw,true); + memset(fv->selected,0,sf->charcnt); + i=1; + while ( *ret ) { + end = u_strchr(ret,' '); + if ( end==NULL ) end = ret+u_strlen(ret); + nm = cu_copybetween(ret,end); + for ( ret = end; isspace(*ret); ++ret); + if (( pos = SFFindChar(sf,-1,nm))!=-1 ) { + if ( found==-1 ) found = pos; + fv->selected[pos] = i; + if ( order_matters && i<255 ) ++i; + } + free(nm); + } + + if ( found!=-1 ) + FVScrollToChar(fv,found); + GDrawRequestExpose(fv->v,NULL,false); +} + +static int CCD_ToSelection(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Select; + int isglyph = ccd->aw==aw_glyphs; + + _CCD_ToSelection(ccd,CID_GlyphList+off,isglyph); + } +return( true ); +} + +static int CCD_ToSelection2(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Select2; + + _CCD_ToSelection(ccd,CID_RplList+off,true); + } +return( true ); +} + +static void _CCD_FromSelection(struct contextchaindlg *ccd,int cid,int order_matters ) { + SplineFont *sf = ccd->sf; + FontView *fv = sf->fv; + unichar_t *vals, *pt; + int i, j, len, max; + SplineChar *sc; + + for ( i=len=max=0; icharcnt; ++i ) if ( fv->selected[i]) { + sc = SFMakeChar(sf,i); + len += strlen(sc->name)+1; + if ( fv->selected[i]>max ) max = fv->selected[i]; + } + pt = vals = galloc((len+1)*sizeof(unichar_t)); + *pt = '\0'; + if ( order_matters ) { + /* in a glyph string the order of selection is important */ + /* also in replacement list */ + for ( j=1; j<=max; ++j ) { + for ( i=0; icharcnt; ++i ) if ( fv->selected[i]==j ) { + uc_strcpy(pt,sf->chars[i]->name); + pt += u_strlen(pt); + *pt++ = ' '; + } + } + } else { + /* in a coverage table (or class) the order of selection is irrelevant */ + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] ) { + uc_strcpy(pt,sf->chars[i]->name); + pt += u_strlen(pt); + *pt++ = ' '; + } + } + if ( pt>vals ) pt[-1]='\0'; + + GGadgetSetTitle(GWidgetGetControl(ccd->gw,cid),vals); + free(vals); +} + +static int CCD_FromSelection(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Set; + int isglyph = ccd->aw==aw_glyphs; + + _CCD_FromSelection(ccd,CID_GlyphList+off,isglyph); + } +return( true ); +} + +static int CCD_FromSelection2(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Set2; + + _CCD_FromSelection(ccd,CID_RplList+off,true); + } +return( true ); +} + +static int CCD_Delete(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Delete; + GListDelSelected(GWidgetGetControl(ccd->gw,CID_GList+off)); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Delete+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Edit+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Up+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Down+off),false); + } +return( true ); +} + +static int CCD_Up(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Up; + GGadget *list = GWidgetGetControl(ccd->gw,CID_GList+off); + int len, i; + + (void) GGadgetGetList(list,&len); + GListMoveSelected(list,-1); + i = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Up+off),i!=0); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Down+off),i!=len-1); + } +return( true ); +} + +static int CCD_Down(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Down; + GGadget *list = GWidgetGetControl(ccd->gw,CID_GList+off); + int len, i; + + (void) GGadgetGetList(list,&len); + GListMoveSelected(list,1); + i = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Up+off),i!=0); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Down+off),i!=len-1); + } +return( true ); +} + +static int CCD_Edit(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_Edit; + _CCD_DoEditNew(ccd,off,true); + } +return( true ); +} + +static int CCD_New(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_New; + _CCD_DoEditNew(ccd,off,false); + } +return( true ); +} + +static int CCD_GlyphSelected(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_GList; + int len, i; + + (void) GGadgetGetList(g,&len); + i = GGadgetGetFirstListSelectedItem(g); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Up+off),i>0 && + (i>1 || off<300)); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Down+off),i!=len-1 && + i!=-1 && (i!=0 || off<300)); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Delete+off),i!=-1 && + (i!=0 || off<300)); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Edit+off),i!=-1 && + (i!=0 || off<300)); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_GList; + int i = GGadgetGetFirstListSelectedItem(g); + if ( i!=0 || off<300 ) + _CCD_DoEditNew(ccd,off,true); + } +return( true ); +} + +static int CCD_SameAsClasses(GGadget *g, GEvent *e) { + int ison = GGadgetIsChecked(g); + int off = GGadgetGetCid(g)-CID_SameAsClasses; + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_GList+300+off),!ison); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_New+300+off),!ison); + if ( ison ) { + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Edit+300+off),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Delete+300+off),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Up+300+off),false); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_Down+300+off),false); + } else { + GEvent ev; + memset(&ev,0,sizeof(ev)); + ev.type =et_controlevent; + ev.u.control.subtype = et_listselected; + ev.u.control.g = GWidgetGetControl(ccd->gw,CID_GList+300+off); + CCD_GlyphSelected(ev.u.control.g,&ev); + } +return( true ); +} + +static int CCD_ClassSelected(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_ClassList; + int i; + GGadget *tf = GWidgetGetControl(ccd->gw,CID_ClassNumbers+off); + char buf[20]; + unichar_t ubuf[20]; + + i = GGadgetGetFirstListSelectedItem(g); + if ( i==-1 ) +return( true ); + sprintf( buf, " %d ", i ); + uc_strcpy(ubuf,buf); + GTextFieldReplace(tf,ubuf); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + } +return( true ); +} + +static int CCD_LDelete(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_LDelete; + GListDelSelected(GWidgetGetControl(ccd->gw,CID_LookupList+off)); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LDelete+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LEdit+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LUp+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LDown+off),false); + } +return( true ); +} + +static int CCD_LUp(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_LUp; + GGadget *list = GWidgetGetControl(ccd->gw,CID_LookupList+off); + int len, i; + + (void) GGadgetGetList(list,&len); + GListMoveSelected(list,-1); + i = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LUp+off),i!=0); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LDown+off),i!=len-1); + } +return( true ); +} + +static int CCD_LDown(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_LDown; + GGadget *list = GWidgetGetControl(ccd->gw,CID_LookupList+off); + int len, i; + + (void) GGadgetGetList(list,&len); + GListMoveSelected(list,1); + i = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LUp+off),i!=0); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_LDown+off),i!=len-1); + } +return( true ); +} + +struct seqlook_data { + int done; + int ok; +}; + +static int seqlook_e_h(GWindow gw, GEvent *e) { + if ( e->type==et_close ) { + struct seqlook_data *d = GDrawGetUserData(gw); + d->done = true; + } else if ( e->type == et_char ) { +return( false ); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct seqlook_data *d = GDrawGetUserData(gw); + d->done = true; + d->ok = GGadgetGetCid(e->u.control.g); + } +return( true ); +} + +static void _CCD_DoLEditNew(struct contextchaindlg *ccd,int off,int isedit) { + int seq; + char cbuf[20]; + unichar_t tagbuf[8], *end; + GGadget *list = GWidgetGetControl(ccd->gw,CID_LookupList+off); + struct seqlook_data d; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + const unichar_t *pt; + unichar_t *line; + int selpos= -1; + int searchtype; + + tagbuf[0] = 0; seq = 0; + if ( isedit ) { + int len; + GTextInfo **ti = GGadgetGetList(list,&len); + selpos = GGadgetGetFirstListSelectedItem(list); + seq = u_strtol(ti[selpos]->text,&end,10); + if ( *end==' ' ) ++end; + if ( *end=='\'' ) ++end; + u_strncpy(tagbuf,end,4); + tagbuf[4] = 0; + } + + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<fpst->type==pst_contextpos || ccd->fpst->type==pst_chainpos ) + searchtype = fpst_max; /* Search for positioning tables */ + else + searchtype = fpst_max+1; /* Search for substitution tables */ + GGadgetSetList(gcd[3].ret, SFGenTagListFromType(&ccd->sf->gentags,searchtype),false); + GDrawSetVisible(gw,true); + + retry: + memset(&d,'\0',sizeof(d)); + while ( !d.done ) + GDrawProcessOneEvent(NULL); + + if ( d.ok ) { + int err = false; + seq = GetIntR(gw,1000,_STR_Sequence,&err); + if ( err ) + goto retry; + pt = _GGadgetGetTitle(gcd[3].ret); + if ( u_strlen(pt)!=4 ) { + GWidgetErrorR(_STR_TagTooLong,_STR_TagTooLong); + goto retry; + } + sprintf(cbuf,"%d '",seq); + line = galloc((strlen(cbuf)+8)*sizeof(unichar_t)); + uc_strcpy(line,cbuf); + u_strcat(line,pt); + uc_strcat(line,"'"); + if ( isedit ) + GListChangeLine(list,selpos,line); + else + GListAppendLine(list,line,false); + free(line); + } + GDrawDestroyWindow(gw); +} + +static int CCD_LEdit(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_LEdit; + _CCD_DoLEditNew(ccd,off,true); + } +return( true ); +} + +static int CCD_LNew(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_LNew; + _CCD_DoLEditNew(ccd,off,false); + } +return( true ); +} + +static int CCD_LookupSelected(GGadget *g, GEvent *e) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_LookupList; + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + int len, i; + + (void) GGadgetGetList(g,&len); + i = GGadgetGetFirstListSelectedItem(g); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LUp+off),i>0); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LDown+off),i!=len-1 && i!=-1); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LDelete+off),i!=-1); + GGadgetSetEnabled(GWidgetGetControl(ccd->gw,CID_LEdit+off),i!=-1); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + _CCD_DoLEditNew(ccd,off,true); + } +return( true ); +} + +void CCD_Close(struct contextchaindlg *ccd) { + if ( ccd->isnew ) + GFI_FinishContextNew(ccd->gfi,ccd->fpst,ccd->newname,false); + GFI_CCDEnd(ccd->gfi); + GDrawDestroyWindow(ccd->gw); +} + +static char **CCD_ParseCoverageList(struct contextchaindlg *ccd,int cid,int *cnt) { + int i; + GTextInfo **ti = GGadgetGetList(GWidgetGetControl(ccd->gw,cid),cnt); + char **ret; + + if ( *cnt==0 ) +return( NULL ); + ret = galloc(*cnt*sizeof(char *)); + for ( i=0; i<*cnt; ++i ) + ret[i] = ccd_cu_copy(ti[i]->text); +return( ret ); +} + +static void CoverageReverse(char **bcovers,int bcnt) { + int i; + char *temp; + + for ( i=0; ifpst; + int32 len, i, k; + GTextInfo **old, **classes; + struct fpst_rule dummy; + int has[3]; + + switch ( ccd->aw ) { + case aw_glist: { + old = GGadgetGetList(GWidgetGetControl(ccd->gw,CID_GList),&len); + if ( len==0 ) { + GWidgetErrorR(_STR_MissingRules,_STR_MustBeRule); +return; + } + FPSTRulesFree(fpst->rules,fpst->format,fpst->rule_cnt); + fpst->format = pst_glyphs; + fpst->rule_cnt = len; + fpst->rules = gcalloc(len,sizeof(struct fpst_rule)); + for ( i=0; itext,&fpst->rules[i]); + } break; + case aw_class: { + old = GGadgetGetList(GWidgetGetControl(ccd->gw,CID_GList+200),&len); + if ( len==0 ) { + GWidgetErrorR(_STR_MissingRules,_STR_MustBeRule); +return; + } + FPSTRulesFree(fpst->rules,fpst->format,fpst->rule_cnt); + fpst->format = pst_class; + fpst->rule_cnt = len; + fpst->rules = gcalloc(len,sizeof(struct fpst_rule)); + fpst->nccnt = fpst->bccnt = fpst->fccnt = 0; + fpst->nclass = fpst->bclass = fpst->fclass = NULL; + has[1] = has[2] = false; has[0] = true; + for ( i=0; itext,&fpst->rules[i]); + if ( fpst->rules[i].u.class.bcnt!=0 ) has[1] = true; + if ( fpst->rules[i].u.class.fcnt!=0 ) has[2] = true; + } + for ( i=0; i<3; ++i ) { + if ( i==0 || !GGadgetIsChecked(GWidgetGetControl(ccd->gw,CID_SameAsClasses+i*20)) ) + classes = GGadgetGetList(GWidgetGetControl(ccd->gw,CID_GList+300+i*20),&len); + else if ( has[i] ) + classes = GGadgetGetList(GWidgetGetControl(ccd->gw,CID_GList+300),&len); + else + continue; + (&fpst->nccnt)[i] = len; + (&fpst->nclass)[i] = galloc(len*sizeof(char*)); + (&fpst->nclass)[i][0] = NULL; + for ( k=1; knclass)[i][k] = cu_copy(classes[k]->text); + } + } break; + case aw_coverage: + old = GGadgetGetList(GWidgetGetControl(ccd->gw,CID_GList+100),&len); + if ( len==0 ) { + GWidgetErrorR(_STR_BadCoverage,_STR_MissingMatch); +return; + } + if ( fpst->format==pst_reversecoverage ) { + if ( len!=1 ) { + GWidgetErrorR(_STR_BadCoverage,_STR_MatchCntWrong); +return; + } + if ( CCD_GlyphNameCnt(old[0]->text)!=CCD_GlyphNameCnt( + _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_RplList+100))) ) { + GWidgetErrorR(_STR_RplMismatch,_STR_ReplacementMismatch); +return; + } + dummy.u.rcoverage.replacements = ccd_cu_copy( + _GGadgetGetTitle(GWidgetGetControl(ccd->gw,CID_RplList+100))); + } else { + CCD_ParseLookupList(&dummy,GWidgetGetControl(ccd->gw,CID_LookupList+100)); + if ( dummy.lookup_cnt==0 ) { + GWidgetErrorR(_STR_BadSeqLookup,_STR_MissingSeqLookup); +return; + } + } + FPSTRulesFree(fpst->rules,fpst->format,fpst->rule_cnt); + fpst->format = fpst->type==pst_reversesub ? pst_reversecoverage : pst_coverage; + fpst->rule_cnt = 1; + fpst->rules = gcalloc(1,sizeof(struct fpst_rule)); + fpst->rules[0].u.coverage.ncovers = CCD_ParseCoverageList(ccd,CID_GList+100,&fpst->rules[0].u.coverage.ncnt); + fpst->rules[0].u.coverage.bcovers = CCD_ParseCoverageList(ccd,CID_GList+100+20,&fpst->rules[0].u.coverage.bcnt); + CoverageReverse(fpst->rules[0].u.coverage.bcovers,fpst->rules[0].u.coverage.bcnt); + fpst->rules[0].u.coverage.fcovers = CCD_ParseCoverageList(ccd,CID_GList+100+40,&fpst->rules[0].u.coverage.fcnt); + if ( fpst->format==pst_reversecoverage ) + fpst->rules[0].u.rcoverage.replacements = dummy.u.rcoverage.replacements; + else { + fpst->rules[0].lookup_cnt = dummy.lookup_cnt; + fpst->rules[0].lookups = dummy.lookups; + } + break; + default: + GDrawIError("The OK button should not be enabled here"); +return; + } + if ( ccd->isnew ) + GFI_FinishContextNew(ccd->gfi,ccd->fpst,ccd->newname,true); + GFI_CCDEnd(ccd->gfi); + GDrawDestroyWindow(ccd->gw); +} + +static int CCD_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + _CCD_Ok(ccd); + } +return( true ); +} + +static int CCD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + CCD_Close(ccd); + } +return( true ); +} + +static int CCD_Next(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + switch ( ccd->aw ) { + case aw_formats: + GDrawSetVisible(ccd->formats,false); + if ( GGadgetIsChecked(GWidgetGetControl(ccd->gw,CID_ByGlyph)) ) { + ccd->aw = aw_glist; + GDrawSetVisible(ccd->glist,true); + } else if ( GGadgetIsChecked(GWidgetGetControl(ccd->gw,CID_ByClass)) ) { + ccd->aw = aw_class; + GDrawSetVisible(ccd->class,true); + } else { + ccd->aw = aw_coverage; + GDrawSetVisible(ccd->coverage,true); + } + break; + case aw_glyphs: + case aw_classnumber: + case aw_classbuild: + case aw_cselect: + CCD_FinishEditNew(ccd); + break; + default: + GDrawIError("The next button should not be enabled here"); + break; + } + CCD_EnableNextPrev(ccd); + } +return( true ); +} + +static int CCD_Prev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct contextchaindlg *ccd = GDrawGetUserData(GGadgetGetWindow(g)); + switch ( ccd->aw ) { + case aw_formats: + CCD_Cancel(g,e); + break; + case aw_glyphs: + ccd->aw = aw_glist; + GDrawSetVisible(ccd->glyphs,false); + GDrawSetVisible(ccd->glist,true); + break; + case aw_cselect: + ccd->aw = aw_coverage; + GDrawSetVisible(ccd->cselect,false); + GDrawSetVisible(ccd->coverage,true); + break; + case aw_classnumber: + case aw_classbuild: + ccd->aw = aw_class; + GDrawSetVisible(ccd->classbuild,false); + GDrawSetVisible(ccd->classnumber,false); + GDrawSetVisible(ccd->class,true); + break; + case aw_coverage: + case aw_class: + case aw_glist: + ccd->aw = aw_formats; + GDrawSetVisible(ccd->coverage,false); + GDrawSetVisible(ccd->class,false); + GDrawSetVisible(ccd->glist,false); + GDrawSetVisible(ccd->formats,true); + break; + default: + GDrawIError("Can't get here"); + break; + } + CCD_EnableNextPrev(ccd); + } +return( true ); +} + +static void CCD_SimulateDefaultButton( struct contextchaindlg *ccd ) { + GEvent ev; + int i,j; + + /* figure out what the default action should be */ + memset(&ev,0,sizeof(ev)); + ev.type = et_controlevent; + ev.u.control.subtype = et_buttonactivate; + if ( ccd->aw==aw_formats || ccd->aw == aw_glyphs || ccd->aw == aw_cselect ) { + ev.u.control.g = GWidgetGetControl(ccd->gw,CID_Next); + CCD_Next(ev.u.control.g,&ev); +/* For the glyph list and the coverage list, the [Next] button is disabled */ +/* I think [OK] is probably inappropriate, so let's do either [New] or [Edit] */ +/* (which are what [Next] would logically do) depending on which of the two */ +/* is more appropriate */ +/* ev.u.control.g = GWidgetGetControl(ccd->gw,CID_OK); */ +/* CCD_OK(ev.u.control.g,&ev); */ + } else if ( ccd->aw==aw_glist ) { + i = GGadgetGetFirstListSelectedItem( GWidgetGetControl(ccd->gw,CID_GList)); + if ( i==-1 ) { + ev.u.control.g = GWidgetGetControl(ccd->gw,CID_New); + CCD_New(ev.u.control.g,&ev); + } else { + ev.u.control.g = GWidgetGetControl(ccd->gw,CID_Edit); + CCD_Edit(ev.u.control.g,&ev); + } + } else { + i = GTabSetGetSel( GWidgetGetControl(ccd->gw,CID_MatchType+100)); + j = GGadgetGetFirstListSelectedItem( GWidgetGetControl(ccd->gw,CID_GList+100+i*20)); + if ( j==-1 ) { + ev.u.control.g = GWidgetGetControl(ccd->gw,CID_New+100+i*20); + CCD_New(ev.u.control.g,&ev); + } else { + ev.u.control.g = GWidgetGetControl(ccd->gw,CID_Edit+100+i*20); + CCD_Edit(ev.u.control.g,&ev); + } + } +} + +static void CCD_Drop(struct contextchaindlg *ccd,GEvent *event) { + char *cnames; + unichar_t *unames, *pt; + const unichar_t *ret; + GGadget *g; + int len; + + if ( ccd->aw != aw_glyphs && ccd->aw != aw_cselect && + (ccd->aw != aw_coverage || ccd->fpst->format!=pst_reversecoverage)) { + GDrawBeep(NULL); +return; + } + + if ( ccd->aw==aw_cselect ) + g = GWidgetGetControl(ccd->gw,CID_GlyphList+100); + else if ( ccd->aw==aw_glyphs ) { + int which = GTabSetGetSel(GWidgetGetControl(ccd->glyphs,CID_MatchType)); + g = GWidgetGetControl(ccd->gw,CID_GlyphList+20*which); + } else { + int which = GTabSetGetSel(GWidgetGetControl(ccd->coverage,CID_MatchType+100)); + if ( which!=0 ) { + GDrawBeep(NULL); +return; + } + g = GWidgetGetControl(ccd->gw,CID_RplList+100); + } + + if ( !GDrawSelectionHasType(ccd->gw,sn_drag_and_drop,"STRING")) +return; + cnames = GDrawRequestSelection(ccd->gw,sn_drag_and_drop,"STRING",&len); + if ( cnames==NULL ) +return; + + ret = _GGadgetGetTitle(g); + unames = galloc((strlen(cnames)+u_strlen(ret)+8)*sizeof(unichar_t)); + u_strcpy(unames,ret); + pt = unames+u_strlen(unames); + if ( pt>unames && pt[-1]!=' ' ) + uc_strcpy(pt," "); + uc_strcat(pt,cnames); + free(cnames); + + GGadgetSetTitle(g,unames); +} + +static int subccd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("contextchain.html"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + CCD_Close(GDrawGetUserData(gw)); + else + MenuExit(NULL,NULL,NULL); +return( true ); + } else if ( event->u.chr.chars[0]=='\r' ) { + CCD_SimulateDefaultButton( (struct contextchaindlg *) GDrawGetUserData(gw)); +return( true ); + } +return( false ); + } else if ( event->type == et_drop ) { + CCD_Drop(GDrawGetUserData(gw),event); + } +return( true ); +} + +static int ccd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct contextchaindlg *ccd = GDrawGetUserData(gw); + CCD_Close(ccd); + } else if ( event->type==et_destroy ) { + struct contextchaindlg *ccd = GDrawGetUserData(gw); + chunkfree(ccd,sizeof(struct contextchaindlg)); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("contextchain.html"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + CCD_Close(GDrawGetUserData(gw)); + else + MenuExit(NULL,NULL,NULL); +return( true ); + } else if ( event->u.chr.chars[0]=='\r' ) { + CCD_SimulateDefaultButton( (struct contextchaindlg *) GDrawGetUserData(gw)); +return( true ); + } +return( false ); + } else if ( event->type==et_resize ) { + int blen = GDrawPointsToPixels(NULL,GIntGetResource(_NUM_Buttonsize)), i; + GRect wsize, csize; + struct contextchaindlg *ccd = GDrawGetUserData(gw); + GGadget *g; + + GDrawGetSize(ccd->gw,&wsize); + GGadgetResize(GWidgetGetControl(ccd->gw,CID_Group),wsize.width-4,wsize.height-4); + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_OK),&csize); + GGadgetMove(GWidgetGetControl(ccd->gw,CID_OK),csize.x,wsize.height-ccd->canceldrop); + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_Next),&csize); + GGadgetMove(GWidgetGetControl(ccd->gw,CID_Next),csize.x,wsize.height-ccd->canceldrop); + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_Prev),&csize); + GGadgetMove(GWidgetGetControl(ccd->gw,CID_Prev),csize.x,wsize.height-ccd->canceldrop); + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_Cancel),&csize); + GGadgetMove(GWidgetGetControl(ccd->gw,CID_Cancel),wsize.width-blen-20,wsize.height-ccd->canceldrop); + + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_MatchType),&csize); + GGadgetResize(GWidgetGetControl(ccd->gw,CID_MatchType),wsize.width-GDrawPointsToPixels(NULL,10),csize.height); + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_MatchType+100),&csize); + GGadgetResize(GWidgetGetControl(ccd->gw,CID_MatchType+100),wsize.width-GDrawPointsToPixels(NULL,10),csize.height); + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_LookupList),&csize); + GGadgetResize(GWidgetGetControl(ccd->gw,CID_LookupList),wsize.width-GDrawPointsToPixels(NULL,20),csize.height); + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_GList),&csize); + GGadgetResize(GWidgetGetControl(ccd->gw,CID_GList),wsize.width-GDrawPointsToPixels(NULL,20),csize.height); + if ( (g = GWidgetGetControl(ccd->gw,CID_LookupList+100))!=NULL ) { + GGadgetGetSize(g,&csize); + GGadgetResize(g,wsize.width-GDrawPointsToPixels(NULL,20),csize.height); + } else { + GGadgetGetSize(GWidgetGetControl(ccd->gw,CID_RplList+100),&csize); + GGadgetResize(GWidgetGetControl(ccd->gw,CID_RplList+100),wsize.width-GDrawPointsToPixels(NULL,25),csize.height); + } + for ( i=0; i<3; ++i ) { + if ( (g=GWidgetGetControl(ccd->gw,CID_GlyphList+i*20))!=NULL ) { + GGadgetGetSize(g,&csize); + GGadgetResize(g,wsize.width-GDrawPointsToPixels(NULL,25),csize.height); + } + if ( (g=GWidgetGetControl(ccd->gw,CID_GList+100+i*20))!=NULL ) { + GGadgetGetSize(g,&csize); + GGadgetResize(g,wsize.width-GDrawPointsToPixels(NULL,20),csize.height); + } + } + if ( (g=GWidgetGetControl(ccd->gw,CID_GlyphList+100))!=NULL ) { + GGadgetGetSize(g,&csize); + GGadgetResize(g,wsize.width-GDrawPointsToPixels(NULL,25),csize.height); + } + + GDrawResize(ccd->formats,wsize.width-8,wsize.height-ccd->subheightdiff); + GDrawResize(ccd->coverage,wsize.width-8,wsize.height-ccd->subheightdiff); + GDrawResize(ccd->glist,wsize.width-8,wsize.height-ccd->subheightdiff); + GDrawResize(ccd->glyphs,wsize.width-8,wsize.height-ccd->subheightdiff); + GDrawResize(ccd->cselect,wsize.width-8,wsize.height-ccd->subheightdiff); + GDrawResize(ccd->class,wsize.width-8,wsize.height-ccd->subheightdiff); + + GDrawRequestExpose(ccd->gw,NULL,false); + GDrawRequestExpose(ccd->aw==aw_formats ? ccd->formats : + ccd->aw==aw_coverage ? ccd->coverage : + ccd->aw==aw_glist ? ccd->glist : + ccd->aw==aw_glyphs ? ccd->glyphs : + ccd->cselect, NULL,false); + } else if ( event->type == et_drop ) { + CCD_Drop(GDrawGetUserData(gw),event); + } +return( true ); +} + +#define CCD_WIDTH 340 +#define CCD_HEIGHT 340 + +static int CCD_AddGList(GGadgetCreateData *gcd, GTextInfo *label,int off, + int y, int width,int height) { + int k = 0, space; + int blen = GIntGetResource(_NUM_Buttonsize); + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = y; + gcd[k].gd.pos.width = width; + gcd[k].gd.pos.height = height; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_GlyphSelected; + gcd[k].gd.cid = CID_GList+off; + gcd[k++].creator = GListCreate; + + space = width==CCD_WIDTH-30 ? 7 : 10; + label[k].text = (unichar_t *) _STR_New; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+gcd[k-1].gd.pos.height+10; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_New; + gcd[k].gd.cid = CID_New+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Edit; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_Edit; + gcd[k].gd.cid = CID_Edit+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Delete; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_Delete; + gcd[k].gd.cid = CID_Delete+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Up; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space+5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_Up; + gcd[k].gd.cid = CID_Up+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Down; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_Down; + gcd[k].gd.cid = CID_Down+off; + gcd[k++].creator = GButtonCreate; + +return( k ); +} + +static int CCD_AddGlyphList(GGadgetCreateData *gcd, GTextInfo *label,int off, + int y, int height) { + int k = 0; + + label[k].text = (unichar_t *) _STR_Set; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SetGlyphsFromSelectionPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_FromSelection; + gcd[k].gd.cid = CID_Set+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Select_nom; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 70; gcd[k].gd.pos.y = 4; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SelectFromGlyphsPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_ToSelection; + gcd[k].gd.cid = CID_Select+off; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 30; + gcd[k].gd.pos.width = CCD_WIDTH-25; gcd[k].gd.pos.height = 8*13+4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + gcd[k].gd.cid = CID_GlyphList+off; + gcd[k++].creator = GTextAreaCreate; +return( k ); +} + +static void CCD_AddSeqLookup(GGadgetCreateData *gcd, GTextInfo *label,int off, + int y, int width, int height) { + int k, space; + int blen = GIntGetResource(_NUM_Buttonsize); + + k = 0; + space = width==CCD_WIDTH-30 ? 7 : 10; + label[k].text = (unichar_t *) _STR_SeqLookList; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = y; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+13; + gcd[k].gd.pos.width = width; + gcd[k].gd.pos.height = height; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_LookupSelected; + gcd[k].gd.cid = CID_LookupList+off; + gcd[k++].creator = GListCreate; + + label[k].text = (unichar_t *) _STR_New; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+gcd[k-1].gd.pos.height+10; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_LNew; + gcd[k].gd.cid = CID_LNew+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Edit; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_LEdit; + gcd[k].gd.cid = CID_LEdit+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Delete; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_LDelete; + gcd[k].gd.cid = CID_LDelete+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Up; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space+5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_LUp; + gcd[k].gd.cid = CID_LUp+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Down; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = CCD_LDown; + gcd[k].gd.cid = CID_LDown+off; + gcd[k++].creator = GButtonCreate; +} + +static void CCD_AddReplacements(GGadgetCreateData *gcd, GTextInfo *label, + struct fpst_rule *r,int off, int y) { + int k; + + k=0; + label[k].text = (unichar_t *) _STR_Replacements; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = y; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k++].creator = GLabelCreate; + + label[k].text = (unichar_t *) _STR_Set; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+13; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SetGlyphsFromSelectionPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_FromSelection2; + gcd[k].gd.cid = CID_Set2+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Select_nom; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 70; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SelectFromGlyphsPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = CCD_ToSelection2; + gcd[k].gd.cid = CID_Select2+off; + gcd[k++].creator = GButtonCreate; + + if ( r!=NULL && r->u.rcoverage.replacements!=NULL ) { + label[k].text = (unichar_t *) r->u.rcoverage.replacements; + label[k].text_is_1byte = true; + gcd[k].gd.label = &label[k]; + } + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+25; + gcd[k].gd.pos.width = CCD_WIDTH-25; gcd[k].gd.pos.height = 4*13+4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + gcd[k].gd.cid = CID_RplList+off; + gcd[k++].creator = GTextAreaCreate; +} + +struct contextchaindlg *ContextChainEdit(SplineFont *sf,FPST *fpst, + struct gfi_data *gfi, unichar_t *newname) { + struct contextchaindlg *ccd; + int format; + int i,j,k, space; + static int titles[2][5] = { + { _STR_EditContextPos, _STR_EditContextSub, + _STR_EditChainPos, _STR_EditChainSub, + _STR_EditReverseChainSub, + }, + { _STR_NewContextPos, _STR_NewContextSub, + _STR_NewChainPos, _STR_NewChainSub, + _STR_NewReverseChainSub + }}; + GRect pos, subpos; + GWindow gw; + GWindowAttrs wattrs; + GTabInfo faspects[5]; + GGadgetCreateData glgcd[8], fgcd[3], ggcd[3][12], cgcd[3][18], csgcd[4], + clgcd[10]; + GTextInfo gllabel[8], flabel[3], glabel[3][12], clabel[3][18], cslabel[4], + cllabel[10]; + GGadgetCreateData bgcd[6], rgcd[15]; + GTextInfo blabel[4], rlabel[15]; + struct fpst_rule *r=NULL; + int blen = GIntGetResource(_NUM_Buttonsize)*100/GGadgetScale(100); + int text[] = { _STR_OTCCSubFormat1, _STR_OTCCSubFormat2, + _STR_OTCCSubFormat3, _STR_OTCCSubFormat4, + _STR_OTCCSubFormat5, _STR_OTCCSubFormat6, + _STR_OTCCSubFormat7, _STR_OTCCSubFormat8, + _STR_OTCCSubFormat9, _STR_OTCCSubFormat10, 0 }; + FPST *tempfpst; + + ccd = chunkalloc(sizeof(struct contextchaindlg)); + ccd->gfi = gfi; + ccd->sf = sf; + ccd->fpst = fpst; + ccd->newname = newname; + ccd->isnew = newname!=NULL; + format = fpst->format==pst_reversecoverage ? pst_coverage : fpst->format; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<isnew][fpst->type-pst_contextpos],NULL); + pos.x = pos.y = 0; + pos.width =GDrawPointsToPixels(NULL,GGadgetScale(CCD_WIDTH)); + pos.height = GDrawPointsToPixels(NULL,CCD_HEIGHT); + ccd->gw = gw = GDrawCreateTopWindow(NULL,&pos,ccd_e_h,ccd,&wattrs); + + subpos = pos; + subpos.y = subpos.x = 4; + subpos.width -= 8; + ccd->subheightdiff = GDrawPointsToPixels(NULL,44)-8; + subpos.height -= ccd->subheightdiff; + + + memset(&blabel,0,sizeof(blabel)); + memset(&bgcd,0,sizeof(bgcd)); + + ccd->canceldrop = GDrawPointsToPixels(NULL,30); + bgcd[0].gd.pos.x = 20; bgcd[0].gd.pos.y = GDrawPixelsToPoints(NULL,pos.height)-33; + bgcd[0].gd.pos.width = -1; bgcd[0].gd.pos.height = 0; + bgcd[0].gd.flags = gg_visible | gg_enabled; + blabel[0].text = (unichar_t *) _STR_OK; + blabel[0].text_in_resource = true; + bgcd[0].gd.label = &blabel[0]; + bgcd[0].gd.cid = CID_OK; + bgcd[0].gd.handle_controlevent = CCD_OK; + bgcd[0].creator = GButtonCreate; + + space = (CCD_WIDTH-4*blen-40)/3; + bgcd[1].gd.pos.x = bgcd[0].gd.pos.x+blen+space; bgcd[1].gd.pos.y = bgcd[0].gd.pos.y; + bgcd[1].gd.pos.width = -1; bgcd[1].gd.pos.height = 0; + bgcd[1].gd.flags = gg_visible; + blabel[1].text = (unichar_t *) _STR_PrevArrow; + blabel[1].text_in_resource = true; + bgcd[1].gd.label = &blabel[1]; + bgcd[1].gd.handle_controlevent = CCD_Prev; + bgcd[1].gd.cid = CID_Prev; + bgcd[1].creator = GButtonCreate; + + bgcd[2].gd.pos.x = bgcd[1].gd.pos.x+blen+space; bgcd[2].gd.pos.y = bgcd[1].gd.pos.y; + bgcd[2].gd.pos.width = -1; bgcd[2].gd.pos.height = 0; + bgcd[2].gd.flags = gg_visible; + blabel[2].text = (unichar_t *) _STR_NextArrow; + blabel[2].text_in_resource = true; + bgcd[2].gd.label = &blabel[2]; + bgcd[2].gd.handle_controlevent = CCD_Next; + bgcd[2].gd.cid = CID_Next; + bgcd[2].creator = GButtonCreate; + + bgcd[3].gd.pos.x = -20; bgcd[3].gd.pos.y = bgcd[1].gd.pos.y; + bgcd[3].gd.pos.width = -1; bgcd[3].gd.pos.height = 0; + bgcd[3].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + blabel[3].text = (unichar_t *) _STR_Cancel; + blabel[3].text_in_resource = true; + bgcd[3].gd.label = &blabel[3]; + bgcd[3].gd.handle_controlevent = CCD_Cancel; + bgcd[3].gd.cid = CID_Cancel; + bgcd[3].creator = GButtonCreate; + + bgcd[4].gd.pos.x = 2; bgcd[4].gd.pos.y = 2; + bgcd[4].gd.pos.width = pos.width-4; bgcd[4].gd.pos.height = pos.height-4; + bgcd[4].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + bgcd[4].gd.cid = CID_Group; + bgcd[4].creator = GGroupCreate; + + if ( fpst->type == pst_reversesub ) { + bgcd[1].gd.flags = bgcd[2].gd.flags = gg_visible; + ccd->aw = aw_coverage; + } else if ( ccd->isnew ) { + bgcd[0].gd.flags = gg_visible; + bgcd[2].gd.flags = gg_visible | gg_enabled; + ccd->aw = aw_formats; + } else if ( fpst->format==pst_coverage ) { + bgcd[1].gd.flags = gg_visible | gg_enabled; bgcd[2].gd.flags = gg_visible; + ccd->aw = aw_coverage; /* flags are different from those of reversesub above */ + } else if ( fpst->format==pst_class ) { + bgcd[1].gd.flags = gg_visible | gg_enabled; bgcd[2].gd.flags = gg_visible; + ccd->aw = aw_class; + } else { + bgcd[1].gd.flags = gg_visible | gg_enabled; bgcd[2].gd.flags = gg_visible; + ccd->aw = aw_glist; + } + + GGadgetsCreate(gw,bgcd); + + wattrs.mask = wam_events; + ccd->formats = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&rlabel,0,sizeof(rlabel)); + memset(&rgcd,0,sizeof(rgcd)); + + for ( i=0; text[i]!=0; ++i ) { + rgcd[i].gd.pos.x = 5; rgcd[i].gd.pos.y = 5+i*13; + rgcd[i].gd.flags = gg_visible | gg_enabled; + rlabel[i].text = (unichar_t *) text[i]; + rlabel[i].text_in_resource = true; + rgcd[i].gd.label = &rlabel[i]; + rgcd[i].creator = GLabelCreate; + } + + rgcd[i].gd.pos.x = 50; rgcd[i].gd.pos.y = rgcd[i-1].gd.pos.y+20; + rgcd[i].gd.flags = gg_visible | gg_enabled | (fpst->format==pst_glyphs ? gg_cb_on : 0 ); + rlabel[i].text = (unichar_t *) _STR_ByGlyphs; + rlabel[i].text_in_resource = true; + rgcd[i].gd.label = &rlabel[i]; + rgcd[i].gd.cid = CID_ByGlyph; + rgcd[i++].creator = GRadioCreate; + + rgcd[i].gd.pos.x = rgcd[i-1].gd.pos.x; rgcd[i].gd.pos.y = rgcd[i-1].gd.pos.y+16; + rgcd[i].gd.flags = gg_visible | gg_enabled | (fpst->format==pst_class ? gg_cb_on : 0 ); + rlabel[i].text = (unichar_t *) _STR_ByClasses; + rlabel[i].text_in_resource = true; + rgcd[i].gd.label = &rlabel[i]; + rgcd[i].gd.cid = CID_ByClass; + rgcd[i++].creator = GRadioCreate; + + rgcd[i].gd.pos.x = rgcd[i-1].gd.pos.x; rgcd[i].gd.pos.y = rgcd[i-1].gd.pos.y+16; + rgcd[i].gd.flags = gg_visible | gg_enabled | (fpst->format!=pst_glyphs && fpst->format!=pst_class ? gg_cb_on : 0 ); + rlabel[i].text = (unichar_t *) _STR_ByCoverage; + rlabel[i].text_in_resource = true; + rgcd[i].gd.label = &rlabel[i]; + rgcd[i].gd.cid = CID_ByCoverage; + rgcd[i].creator = GRadioCreate; + GGadgetsCreate(ccd->formats,rgcd); + + + ccd->glyphs = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&ggcd,0,sizeof(ggcd)); + memset(&fgcd,0,sizeof(fgcd)); + memset(&glabel,0,sizeof(glabel)); + memset(&flabel,0,sizeof(flabel)); + memset(&faspects,0,sizeof(faspects)); + for ( i=0; i<3; ++i ) { + k = CCD_AddGlyphList(&ggcd[i][0],&glabel[i][0],(0*100+i*20), 5, 8*13+4 ); + + if ( i==0 ) + CCD_AddSeqLookup(&ggcd[i][k],&glabel[i][k],(i*20),ggcd[0][k-1].gd.pos.y+ggcd[0][k-1].gd.pos.height+10, + CCD_WIDTH-20,4*13+10); + } + + j = 0; + + faspects[j].text = (unichar_t *) _STR_Match; + faspects[j].text_in_resource = true; + faspects[j].selected = true; + faspects[j].gcd = ggcd[j]; ++j; + + faspects[j].text = (unichar_t *) _STR_Backtrack; + faspects[j].text_in_resource = true; + faspects[j].disabled = fpst->type==pst_contextpos || fpst->type==pst_contextsub; + faspects[j].gcd = ggcd[j]; ++j; + + faspects[j].text = (unichar_t *) _STR_Lookahead; + faspects[j].text_in_resource = true; + faspects[j].disabled = fpst->type==pst_contextpos || fpst->type==pst_contextsub; + faspects[j].gcd = ggcd[j]; ++j; + + flabel[0].text = (unichar_t *) _STR_AGlyphList; + flabel[0].text_in_resource = true; + fgcd[0].gd.label = &flabel[0]; + fgcd[0].gd.pos.x = 5; fgcd[0].gd.pos.y = 5; + fgcd[0].gd.flags = gg_visible | gg_enabled; + fgcd[0].creator = GLabelCreate; + + fgcd[1].gd.pos.x = 3; fgcd[1].gd.pos.y = 18; + fgcd[1].gd.pos.width = CCD_WIDTH-10; + fgcd[1].gd.pos.height = CCD_HEIGHT-60; + fgcd[1].gd.u.tabs = faspects; + fgcd[1].gd.flags = gg_visible | gg_enabled; + fgcd[1].gd.cid = CID_MatchType; + fgcd[1].creator = GTabSetCreate; + GGadgetsCreate(ccd->glyphs,fgcd); + + + ccd->coverage = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&clabel,0,sizeof(clabel)); + memset(&cgcd,0,sizeof(cgcd)); + + for ( i=0; i<3; ++i ) { + k = CCD_AddGList(&cgcd[i][0],&clabel[i][0],100+i*20,5, + CCD_WIDTH-20,i==0 ? CCD_HEIGHT-250 : CCD_HEIGHT-150); + + if ( i==0 ) { + if ( ccd->fpst->format!=pst_reversecoverage ) + CCD_AddSeqLookup(&cgcd[i][k],&clabel[i][k],100,cgcd[0][k-1].gd.pos.y+40, + CCD_WIDTH-20,4*13+10); + else { + r = NULL; + if ( fpst->rule_cnt==1 ) r = &fpst->rules[0]; + CCD_AddReplacements(&cgcd[i][k],&clabel[i][k],r,100,cgcd[0][k-1].gd.pos.y+40); + } + } + faspects[i].gcd = cgcd[i]; + } + flabel[0].text = (unichar_t *) _STR_ACoverageTable; + fgcd[1].gd.cid = CID_MatchType+100; + GGadgetsCreate(ccd->coverage,fgcd); + if (( fpst->format==pst_coverage || fpst->format==pst_reversecoverage ) && + fpst->rule_cnt==1 ) { + for ( i=0; i<3; ++i ) { + if ( (&fpst->rules[0].u.coverage.ncnt)[i]!=0 ) + GGadgetSetList(cgcd[i][0].ret,clistlist(fpst,i),false); + } + if ( fpst->format==pst_coverage ) { + GTextInfo **ti = slistlist(&fpst->rules[0]); + GGadgetSetList(GWidgetGetControl(ccd->gw,CID_LookupList+100),ti,false); + } + } + + ccd->glist = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&gllabel,0,sizeof(gllabel)); + memset(&glgcd,0,sizeof(glgcd)); + + k = 0; + gllabel[k].text = (unichar_t *) _STR_GlyphLists; + gllabel[k].text_in_resource = true; + glgcd[k].gd.label = &gllabel[k]; + glgcd[k].gd.pos.x = 5; glgcd[k].gd.pos.y = 5; + glgcd[k].gd.flags = gg_visible | gg_enabled; + glgcd[k++].creator = GLabelCreate; + + k += CCD_AddGList(&glgcd[k],&gllabel[k],0,19, + CCD_WIDTH-20,CCD_HEIGHT-100); + + GGadgetsCreate(ccd->glist,glgcd); + if ( fpst->format==pst_glyphs && fpst->rule_cnt>0 ) + GGadgetSetList(glgcd[1].ret,glistlist(fpst),false); + + + ccd->cselect = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&cslabel,0,sizeof(cslabel)); + memset(&csgcd,0,sizeof(csgcd)); + + CCD_AddGlyphList(csgcd,cslabel,100,5,8*13+4); + GGadgetsCreate(ccd->cselect,csgcd); + + ccd->class = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&cllabel,0,sizeof(cllabel)); + memset(&clgcd,0,sizeof(clgcd)); + memset(&clabel,0,sizeof(clabel)); + memset(&cgcd,0,sizeof(cgcd)); + + k=0; + cllabel[k].text = (unichar_t *) _STR_ListOfListsOfClassNumbers; + cllabel[k].text_in_resource = true; + clgcd[k].gd.label = &cllabel[k]; + clgcd[k].gd.pos.x = 5; clgcd[k].gd.pos.y = 5; + clgcd[k].gd.flags = gg_visible | gg_enabled; + clgcd[k++].creator = GLabelCreate; + + k += CCD_AddGList(&clgcd[k],&cllabel[k],200,19, + CCD_WIDTH-20,CCD_HEIGHT-270); + + clgcd[k].gd.pos.x = 2; clgcd[k].gd.pos.y = clgcd[k-1].gd.pos.y+30; + clgcd[k].gd.pos.width = CCD_WIDTH-23; + clgcd[k].gd.flags = gg_visible | gg_enabled; + clgcd[k++].creator = GLineCreate; + + for ( i=0; i<3; ++i ) { + int l=0; + clabel[i][l].text = (unichar_t *) _STR_ClassListOfListsOfGlyphNames; + clabel[i][l].text_in_resource = true; + cgcd[i][l].gd.label = &clabel[i][l]; + cgcd[i][l].gd.pos.x = 5; cgcd[i][l].gd.pos.y = 5; + cgcd[i][l].gd.flags = gg_visible | gg_enabled; + cgcd[i][l++].creator = GLabelCreate; + + if ( i!=0 ) { + clabel[i][l].text = (unichar_t *) _STR_SameAsMatchClasses; + clabel[i][l].text_in_resource = true; + cgcd[i][l].gd.label = &clabel[i][l]; + cgcd[i][l].gd.pos.x = 185; cgcd[i][l].gd.pos.y = 2; + cgcd[i][l].gd.handle_controlevent = CCD_SameAsClasses; + cgcd[i][l].gd.flags = gg_visible | gg_enabled; + cgcd[i][l].gd.cid = CID_SameAsClasses + i*20; + cgcd[i][l++].creator = GCheckBoxCreate; + } + + CCD_AddGList(&cgcd[i][l],&clabel[i][l],300+i*20,cgcd[i][0].gd.pos.y+15, + CCD_WIDTH-20,CCD_HEIGHT-270); + faspects[i].gcd = cgcd[i]; + } + j=0; + faspects[j++].text = (unichar_t *) _STR_MatchClass; + faspects[j++].text = (unichar_t *) _STR_BacktrackClass; + faspects[j++].text = (unichar_t *) _STR_LookaheadClass; + + clgcd[k].gd.pos.x = 3; clgcd[k].gd.pos.y = clgcd[k-1].gd.pos.y+5; + clgcd[k].gd.pos.width = CCD_WIDTH-10; + clgcd[k].gd.pos.height = CCD_HEIGHT-185; + clgcd[k].gd.u.tabs = faspects; + clgcd[k].gd.flags = gg_visible | gg_enabled; + clgcd[k].gd.cid = CID_MatchType+300; + clgcd[k].creator = GTabSetCreate; + GGadgetsCreate(ccd->class,clgcd); + + tempfpst = fpst; + if ( fpst->format==pst_glyphs && fpst->rule_cnt>0 ) + tempfpst = FPSTGlyphToClass(fpst); + if ( tempfpst->format==pst_class && tempfpst->rule_cnt>0 ) { + GGadgetSetList(GWidgetGetControl(ccd->class,CID_GList+200),clslistlist(tempfpst),false); + for ( i=0; i<3; ++i ) { + GGadget *list = GWidgetGetControl(ccd->class,CID_GList+300+i*20); + GListAppendLine(list,GStringGetResource(_STR_EverythingElse,NULL),false); + for ( k=1; k<(&tempfpst->nccnt)[i]; ++k ) { + unichar_t *temp = uc_copy((&tempfpst->nclass)[i][k]); + GListAppendLine(list,temp,false); + free(temp); + } + if ( i!=0 && ClassesMatch((&tempfpst->nccnt)[i],(&tempfpst->nclass)[i],tempfpst->nccnt,tempfpst->nclass)) { + GGadgetSetChecked(GWidgetGetControl(ccd->class,CID_SameAsClasses+i*20),true); + CCD_SameAsClasses(GWidgetGetControl(ccd->class,CID_SameAsClasses+i*20),NULL); + } + } + if ( tempfpst!=fpst ) + FPSTFree(tempfpst); + } else { + for ( i=0; i<3; ++i ) + GListAppendLine(GWidgetGetControl(ccd->class,CID_GList+300+i*20), + GStringGetResource(_STR_EverythingElse,NULL),false); + for ( i=1; i<3; ++i ) { + GGadgetSetChecked(GWidgetGetControl(ccd->class,CID_SameAsClasses+i*20),true); + CCD_SameAsClasses(GWidgetGetControl(ccd->class,CID_SameAsClasses+i*20),NULL); + } + } + + ccd->classbuild = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&cslabel,0,sizeof(cslabel)); + memset(&csgcd,0,sizeof(csgcd)); + + CCD_AddGlyphList(csgcd,cslabel,300,5,8*13+4); + GGadgetsCreate(ccd->classbuild,csgcd); + + ccd->classnumber = GWidgetCreateSubWindow(ccd->gw,&subpos,subccd_e_h,ccd,&wattrs); + memset(&clabel,0,sizeof(clabel)); + memset(&cgcd,0,sizeof(cgcd)); + memset(&cllabel,0,sizeof(cllabel)); + memset(&clgcd,0,sizeof(clgcd)); + + for ( i=0; i<3; ++i ) { + k=0; + + clabel[i][k].text = (unichar_t *) _STR_ListOfClassNumbers; + clabel[i][k].text_in_resource = true; + cgcd[i][k].gd.label = &clabel[i][k]; + cgcd[i][k].gd.pos.x = 5; cgcd[i][k].gd.pos.y = 5; + cgcd[i][k].gd.flags = gg_visible | gg_enabled; + cgcd[i][k++].creator = GLabelCreate; + + cgcd[i][k].gd.pos.x = 5; cgcd[i][k].gd.pos.y = cgcd[i][k-1].gd.pos.y+14; + cgcd[i][k].gd.pos.width = CCD_WIDTH-25; cgcd[i][k].gd.pos.height = 4*13+4; + cgcd[i][k].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + cgcd[i][k].gd.cid = CID_ClassNumbers+i*20; + cgcd[i][k++].creator = GTextAreaCreate; + + clabel[i][k].text = (unichar_t *) _STR_Classes; + clabel[i][k].text_in_resource = true; + cgcd[i][k].gd.label = &clabel[i][k]; + cgcd[i][k].gd.pos.x = 5; cgcd[i][k].gd.pos.y = cgcd[i][k-1].gd.pos.y+cgcd[i][k-1].gd.pos.height+5; + cgcd[i][k].gd.flags = gg_visible | gg_enabled; + cgcd[i][k++].creator = GLabelCreate; + + cgcd[i][k].gd.pos.x = 5; cgcd[i][k].gd.pos.y = cgcd[i][k-1].gd.pos.y+14; + cgcd[i][k].gd.pos.width = CCD_WIDTH-25; cgcd[i][k].gd.pos.height = 4*13+10; + cgcd[i][k].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + cgcd[i][k].gd.handle_controlevent = CCD_ClassSelected; + cgcd[i][k].gd.cid = CID_ClassList+i*20; + cgcd[i][k++].creator = GListCreate; + + if ( i==0 ) + CCD_AddSeqLookup(&cgcd[i][k],&clabel[i][k],500,cgcd[0][k-1].gd.pos.y+cgcd[0][k-1].gd.pos.height+5, + CCD_WIDTH-20,4*13+10); + faspects[i].gcd = cgcd[i]; + } + + j=0; + faspects[j++].text = (unichar_t *) _STR_Match; + faspects[j++].text = (unichar_t *) _STR_Backtrack; + faspects[j++].text = (unichar_t *) _STR_Lookahead; + + k=0; + clgcd[k].gd.pos.x = 3; clgcd[k].gd.pos.y = 5; + clgcd[k].gd.pos.width = CCD_WIDTH-10; + clgcd[k].gd.pos.height = CCD_HEIGHT-45; + clgcd[k].gd.u.tabs = faspects; + clgcd[k].gd.flags = gg_visible | gg_enabled; + clgcd[k].gd.cid = CID_ClassType; + clgcd[k].creator = GTabSetCreate; + GGadgetsCreate(ccd->classnumber,clgcd); + + + if ( ccd->aw == aw_formats ) + GDrawSetVisible(ccd->formats,true); + else if ( ccd->aw == aw_glist ) + GDrawSetVisible(ccd->glist,true); + else if ( ccd->aw == aw_class ) + GDrawSetVisible(ccd->class,true); + else + GDrawSetVisible(ccd->coverage,true); + + GDrawSetVisible(gw,true); + +return( ccd ); +} diff --git a/fontforge/crctab.c b/fontforge/crctab.c new file mode 100644 index 00000000..d89cff8c --- /dev/null +++ b/fontforge/crctab.c @@ -0,0 +1,63 @@ +/* GWW: taken from http://www.ctan.org/tex-archive/tools/macutils/crc/ */ +/* This is the output (slightly modified) of makecrc for the binhex case */ + +extern unsigned long binhex_crc(unsigned char *buffer,int size); + +static const unsigned long binhex_crcinit = 0; + +static unsigned short crctab[256] = { + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, + 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, + 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, + 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, + 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, + 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, + 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, + 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, + 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, + 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, + 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, + 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, + 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, + 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, + 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, + 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, + 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, + 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, + 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, + 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, + 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, + 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, + 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, + 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, + 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, + 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, + 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, + 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, + 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, + 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, +}; + +static unsigned long binhex_updcrc(icrc, icp, icnt) + unsigned long icrc; + unsigned char *icp; + int icnt; +{ +#define M1 0xff +#define M2 0xff00 + register unsigned long crc = icrc; + register unsigned char *cp = icp; + register int cnt = icnt; + + while(cnt--) { + crc=((crc<<8)&M2)^crctab[((crc>>8)&0xff)^*cp++]; + } + + return(crc); +} + +unsigned long binhex_crc(unsigned char *buffer,int size) { +return ( binhex_updcrc(binhex_crcinit,buffer,size)); +} diff --git a/fontforge/cursors.c b/fontforge/cursors.c new file mode 100644 index 00000000..4f7c73a8 --- /dev/null +++ b/fontforge/cursors.c @@ -0,0 +1,684 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" + +#ifndef _CursorsMustBe16x16 +# define _CursorsMustBe16x16 0 /* X on Mac OSX can't handle anything bigger than 16x16 cursors (I think, it seems to manage smaller ones) */ +#endif + +GCursor ct_magplus, ct_magminus, ct_mypointer, ct_circle, ct_square, ct_triangle, + ct_ruler, ct_pen, ct_knife, ct_rotate, ct_skew, ct_scale, ct_flip; +GCursor ct_rect, ct_elipse, ct_poly, ct_star, ct_pencil, ct_shift, ct_line, + ct_myhand, ct_filledrect, ct_filledelipse, ct_setwidth, ct_eyedropper; +GCursor ct_updown, ct_leftright, ct_nesw, ct_nwse; +GCursor ct_rbearing, ct_kerning, ct_lbearing; +GCursor ct_prohibition, ct_ddcursor; +GWindow logo_icon; + +#define magplus_width 16 +#define magplus_height 16 +#define magplus_x_hot 5 +#define magplus_y_hot 5 +static unsigned char magplus_bits[] = { + 0xf8, 0x00, 0x06, 0x03, 0x22, 0x02, 0x21, 0x04, 0x21, 0x04, 0xfd, 0x05, + 0x21, 0x04, 0x21, 0x04, 0x22, 0x02, 0x06, 0x03, 0xf8, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80}; +#define magminus_width 16 +#define magminus_height 16 +#define magminus_x_hot 5 +#define magminus_y_hot 5 +static unsigned char magminus_bits[] = { + 0xf8, 0x00, 0x06, 0x03, 0x02, 0x02, 0x01, 0x04, 0x01, 0x04, 0xfd, 0x05, + 0x01, 0x04, 0x01, 0x04, 0x02, 0x02, 0x06, 0x03, 0xf8, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80}; +#if 0 +#define magmask_width 16 +#define magmask_height 16 +static unsigned char magmask_bits[] = { + 0xf8, 0x00, 0xfe, 0x03, 0x26, 0x03, 0x23, 0x06, 0x23, 0x06, 0xff, 0x07, + 0x23, 0x06, 0x23, 0x06, 0x26, 0x03, 0xfe, 0x07, 0xf8, 0x0e, 0x00, 0x1c, + 0x00, 0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0}; +#endif +#if _CursorsMustBe16x16 +#define pointertri_width 16 +#define pointertri_height 16 +#define pointertri_x_hot 1 +#define pointertri_y_hot 0 +static unsigned char pointertri_bits[] = { + 0x02, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x7e, 0x00, + 0xfe, 0x00, 0xfe, 0x01, 0x3e, 0x00, 0x36, 0x10, 0x62, 0x30, 0x60, 0x70, + 0xc0, 0xf0, 0xc0, 0x70, 0x80, 0x31, 0x80, 0x11}; +#define pointertrimask_width 16 +#define pointertrimask_height 16 +static unsigned char pointertrimask_bits[] = { + 0x02, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x3f, 0x00, 0x7f, 0x00, 0xff, 0x00, + 0xff, 0x01, 0xff, 0x03, 0xff, 0x03, 0x3f, 0x10, 0x67, 0x30, 0x63, 0x70, + 0xc0, 0xf0, 0xc0, 0x70, 0x80, 0x31, 0x80, 0x11}; +#define pointersqr_width 16 +#define pointersqr_height 16 +#define pointersqr_x_hot 2 +#define pointersqr_y_hot 0 +static unsigned char pointersqr_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xfc, 0x03, 0x7c, 0x00, 0x6c, 0x00, 0xc4, 0x00, 0xc0, 0x00, + 0x80, 0xf1, 0x80, 0xf1, 0x00, 0xf3, 0x00, 0xf3}; +#define pointersqrmask_width 16 +#define pointersqrmask_height 16 +static unsigned char pointersqrmask_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0xfe, 0x00, 0xfe, 0x01, + 0xfe, 0x03, 0xfe, 0x07, 0xfe, 0x07, 0x7e, 0x00, 0xde, 0x00, 0xc6, 0x00, + 0x80, 0xf1, 0x80, 0xf1, 0x00, 0xf3, 0x00, 0xf3}; +#define pointercic_width 16 +#define pointercic_height 16 +#define pointercic_x_hot 2 +#define pointercic_y_hot 0 +static unsigned char pointercic_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xfc, 0x03, 0x7c, 0x00, 0x6c, 0x00, 0xc4, 0x00, 0xc0, 0x70, + 0x80, 0xf9, 0x80, 0xf9, 0x00, 0xfb, 0x00, 0x73}; +#define pointercicmask_width 16 +#define pointercicmask_height 16 +static unsigned char pointercicmask_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0xfe, 0x00, 0xfe, 0x01, + 0xfe, 0x03, 0xfe, 0x07, 0xfe, 0x07, 0x7e, 0x00, 0xce, 0x00, 0xc6, 0x70, + 0x80, 0xf9, 0x80, 0xf9, 0x00, 0xfb, 0x00, 0x73}; +#else +#define pointertri_width 16 +#define pointertri_height 24 +#define pointertri_x_hot 2 +#define pointertri_y_hot 0 +static unsigned char pointertri_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xfc, 0x03, 0x7c, 0x00, 0x6c, 0x00, 0xc4, 0x00, 0xc0, 0x00, + 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x08, 0x00, 0x1c, + 0x00, 0x3e, 0x00, 0x7f, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#define pointertrimask_width 16 +#define pointertrimask_height 24 +static unsigned char pointertrimask_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0xfe, 0x00, 0xfe, 0x01, + 0xfe, 0x03, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x00, 0xee, 0x01, 0xe6, 0x01, + 0xc0, 0x03, 0xc0, 0x03, 0x80, 0x07, 0x80, 0x07, 0x00, 0x0b, 0x00, 0x1c, + 0x00, 0x3e, 0x00, 0x7f, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#define pointersqr_width 16 +#define pointersqr_height 24 +#define pointersqr_x_hot 2 +#define pointersqr_y_hot 0 +static unsigned char pointersqr_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xfc, 0x03, 0x7c, 0x00, 0x6c, 0x00, 0xc4, 0x00, 0xc0, 0x00, + 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00}; +#define pointersqrmask_width 16 +#define pointersqrmask_height 24 +static unsigned char pointersqrmask_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0xfe, 0x00, 0xfe, 0x01, + 0xfe, 0x03, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x00, 0xe6, 0x01, 0xe0, 0x01, + 0xc0, 0x03, 0xc0, 0x03, 0x80, 0x07, 0x80, 0x07, 0x00, 0x03, 0x00, 0x7c, + 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00}; +#define pointercic_width 16 +#define pointercic_height 24 +#define pointercic_x_hot 2 +#define pointercic_y_hot 0 +static unsigned char pointercic_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xfc, 0x03, 0x7c, 0x00, 0x6c, 0x00, 0xc4, 0x00, 0xc0, 0x00, + 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x38, 0x00, 0x7c, + 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x00}; +#define pointercicmask_width 16 +#define pointercicmask_height 24 +static unsigned char pointercicmask_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0xfe, 0x00, 0xfe, 0x01, + 0xfe, 0x03, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x00, 0xee, 0x01, 0xe6, 0x01, + 0xc0, 0x03, 0xc0, 0x03, 0x80, 0x07, 0x80, 0x07, 0x00, 0x3b, 0x00, 0x7c, + 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x00}; +#endif +#define pointercur_width 16 +#define pointercur_height 16 +#define pointercur_x_hot 2 +#define pointercur_y_hot 0 +static unsigned char pointercur_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x1c, 0x00, 0x3c, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xfc, 0x03, 0x7c, 0x00, 0x6c, 0x00, 0xc4, 0x00, 0xc0, 0x00, + 0x80, 0x01, 0x80, 0x01, 0x00, 0x03, 0x00, 0x03}; +#define pointercurmask_width 16 +#define pointercurmask_height 16 +static unsigned char pointercurmask_bits[] = { + 0x04, 0x00, 0x0c, 0x00, 0x3c, 0x00, 0x7e, 0x00, 0xfe, 0x00, 0xfe, 0x01, + 0xfe, 0x03, 0xfe, 0x07, 0xfe, 0x07, 0xfe, 0x00, 0xee, 0x01, 0xe6, 0x01, + 0xc0, 0x03, 0xc0, 0x03, 0x80, 0x07, 0x80, 0x07}; +#if _CursorsMustBe16x16 +#define rulercur_width 16 +#define rulercur_height 16 +#define rulercur_x_hot 0 +#define rulercur_y_hot 3 +static unsigned char rulercur_bits[] = { + 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x3f, 0x40, 0x22, 0x40, 0x24, 0x40, + 0x20, 0x40, 0x20, 0x49, 0x20, 0x49, 0x20, 0x49, 0xe0, 0x7f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#else +#define rulercur_width 24 +#define rulercur_height 12 +#define rulercur_x_hot 0 +#define rulercur_y_hot 3 +static unsigned char rulercur_bits[] = { + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x3f, 0x00, 0x80, + 0x22, 0x00, 0x80, 0x24, 0x40, 0x80, 0x20, 0x40, 0x80, 0x20, 0x49, 0x92, + 0x20, 0x49, 0x92, 0x20, 0x49, 0x92, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00}; +#endif +#define pencur_width 16 +#define pencur_height 16 +#define pencur_x_hot 6 +#define pencur_y_hot 0 +static unsigned char pencur_bits[] = { + 0x40, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x50, 0x01, 0x50, 0x01, 0x50, 0x01, + 0x48, 0x02, 0x48, 0x02, 0x44, 0x04, 0xa4, 0x04, 0x44, 0x04, 0x08, 0x02, + 0xf0, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01}; +#define pencurmask_width 16 +#define pencurmask_height 16 +static unsigned char pencurmask_bits[] = { + 0x40, 0x00, 0xe0, 0x00, 0xf0, 0x01, 0x58, 0x03, 0x58, 0x03, 0x58, 0x03, + 0x4c, 0x06, 0x4c, 0x06, 0x46, 0x0c, 0xe6, 0x0c, 0x46, 0x0c, 0x0c, 0x06, + 0xf8, 0x03, 0x18, 0x03, 0x18, 0x03, 0x18, 0x03}; +#define knifecur_width 16 +#define knifecur_height 16 +#define knifecur_x_hot 7 +#define knifecur_y_hot 4 +static unsigned char knifecur_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x38, 0x20, 0x40, 0x21, 0x00, 0xee, + 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#define knifecurmask_width 16 +#define knifecurmask_height 16 +static unsigned char knifecurmask_bits[] = { + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfe, 0xf8, 0xff, 0x00, 0xfe, + 0x00, 0x7e, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#define flipcur_width 16 +#define flipcur_height 16 +#define flipcur_x_hot 8 +#define flipcur_y_hot 8 +static unsigned char flipcur_bits[] = { + 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x20, 0x09, + 0x20, 0x09, 0x30, 0x11, 0x30, 0x09, 0x28, 0x21, 0x28, 0x09, 0x24, 0x41, + 0x3c, 0x69, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00}; +#define flipcurmask_width 16 +#define flipcurmask_height 16 +static unsigned char flipcurmask_bits[] = { + 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x20, 0x09, + 0x20, 0x09, 0x30, 0x19, 0x30, 0x19, 0x28, 0x29, 0x28, 0x29, 0x24, 0x49, + 0x3c, 0x79, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00}; +#define rotatecur_width 16 +#define rotatecur_height 16 +#define rotatecur_x_hot 3 +#define rotatecur_y_hot 12 +static unsigned char rotatecur_bits[] = { + 0x08, 0x01, 0x88, 0x07, 0x08, 0x09, 0x08, 0x10, 0x08, 0x20, 0x08, 0x20, + 0x08, 0x80, 0x08, 0x60, 0x08, 0x18, 0x08, 0x06, 0x88, 0x01, 0x68, 0x00, + 0xff, 0xff, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00}; +#define scalecur_width 16 +#define scalecur_height 16 +#define scalecur_x_hot 0 +#define scalecur_y_hot 15 +static unsigned char scalecur_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x01, 0x04, + 0x00, 0x00, 0x7f, 0x04, 0x41, 0x00, 0x41, 0x04, 0x41, 0x00, 0x41, 0x04, + 0x41, 0x00, 0x41, 0x04, 0x41, 0x00, 0x7f, 0x05}; +#define scalecurmask_width 16 +#define scalecurmask_height 16 +static unsigned char scalecurmask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x01, 0x04, 0x01, 0x04, + 0x01, 0x04, 0x7f, 0x04, 0x41, 0x04, 0x41, 0x04, 0x41, 0x04, 0x41, 0x04, + 0x41, 0x04, 0x41, 0x04, 0x41, 0x04, 0xff, 0x07}; +#define skewcur_width 16 +#define skewcur_height 16 +#define skewcur_x_hot 0 +#define skewcur_y_hot 15 +static unsigned char skewcur_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x7f, 0x05, 0x41, 0x00, 0x49, 0x02, 0x41, 0x00, 0x45, 0x01, + 0x41, 0x00, 0xc3, 0x00, 0x41, 0x00, 0x7f, 0x00}; +#define skewcurmask_width 16 +#define skewcurmask_height 16 +static unsigned char skewcurmask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x07, 0x49, 0x02, 0x49, 0x02, 0x45, 0x01, 0x45, 0x01, + 0xc3, 0x00, 0xc3, 0x00, 0x41, 0x00, 0x7f, 0x00}; +#define setwidthcur_width 16 +#define setwidthcur_height 16 +#define setwidthcur_x_hot 14 +#define setwidthcur_y_hot 7 +static unsigned char setwidthcur_bits[] = { + 0x00, 0x00, 0x01, 0x40, 0x00, 0x40, 0x01, 0x40, 0x00, 0x40, 0x09, 0x48, + 0x04, 0x50, 0xab, 0x6a, 0x04, 0x50, 0x09, 0x48, 0x00, 0x40, 0x01, 0x40, + 0x00, 0x40, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00}; +/*static unsigned char setwidthmask_bits[] = { +/* 0x00, 0x00, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x09, 0x48, +/* 0x05, 0x50, 0xff, 0x7f, 0x05, 0x50, 0x09, 0x48, 0x01, 0x40, 0x01, 0x40, +/* 0x01, 0x40, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00}; */ + +#define updown_width 8 +#define updown_height 15 +#define updown_x_hot 3 +#define updown_y_hot 7 +static unsigned char updown_bits[] = { + 0x08, 0x14, 0x36, 0x55, 0x14, 0x14, 0x14, 0x7f, 0x14, 0x14, 0x14, 0x55, + 0x36, 0x14, 0x08}; +#define leftright_width 16 +#define leftright_height 9 +#define leftright_x_hot 7 +#define leftright_y_hot 4 +static unsigned char leftright_bits[] = { + 0x80, 0x00, 0x88, 0x08, 0x84, 0x10, 0xfe, 0x3f, 0x81, 0x40, 0xfe, 0x3f, + 0x84, 0x10, 0x88, 0x08, 0x80, 0x00}; +#define nesw_width 16 +#define nesw_height 15 +#define nesw_x_hot 8 +#define nesw_y_hot 7 +static unsigned char nesw_bits[] = { + 0x00, 0xfc, 0x00, 0x90, 0x00, 0x88, 0x10, 0xc4, 0x20, 0xa2, 0x40, 0x91, + 0x80, 0x08, 0x40, 0x05, 0x20, 0x02, 0x12, 0x05, 0x8a, 0x08, 0x46, 0x10, + 0x22, 0x00, 0x12, 0x00, 0x7e, 0x00}; +#define nwse_width 16 +#define nwse_height 15 +#define nwse_x_hot 8 +#define nwse_y_hot 7 +static unsigned char nwse_bits[] = { + 0x7e, 0x00, 0x12, 0x00, 0x22, 0x00, 0x46, 0x10, 0x8a, 0x08, 0x12, 0x05, + 0x20, 0x02, 0x40, 0x05, 0x80, 0x08, 0x40, 0x91, 0x20, 0xa2, 0x10, 0xc4, + 0x00, 0x88, 0x00, 0x90, 0x00, 0xfc}; +#define rectcur_width 16 +#define rectcur_height 8 +#define rectcur_x_hot 0 +#define rectcur_y_hot 2 +static unsigned char rectcur_bits[] = { + 0x04, 0x00, 0x02, 0x00, 0xff, 0x7f, 0x12, 0x40, 0x14, 0x40, 0x10, 0x40, + 0xf0, 0x7f, 0x00, 0x00}; +#define elipsecur_width 16 +#define elipsecur_height 8 +#define elipsecur_x_hot 0 +#define elipsecur_y_hot 2 +static unsigned char elipsecur_bits[] = { + 0x04, 0x00, 0x02, 0x00, 0x3f, 0x1f, 0xc2, 0x60, 0x24, 0x80, 0xc0, 0x60, + 0x00, 0x1f, 0x00, 0x00}; +#define polycur_width 16 +#define polycur_height 16 +#define polycur_x_hot 1 +#define polycur_y_hot 7 +static unsigned char polycur_bits[] = { + 0x80, 0x01, 0x60, 0x06, 0x18, 0x18, 0x06, 0x60, 0x02, 0x40, 0x02, 0x40, + 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x06, 0x60, + 0x18, 0x18, 0x60, 0x06, 0x80, 0x01, 0x00, 0x00}; +#define starcur_width 16 +#define starcur_height 16 +#define starcur_x_hot 0 +#define starcur_y_hot 6 +static unsigned char starcur_bits[] = { + 0x10, 0x08, 0x70, 0x0e, 0x90, 0x09, 0x10, 0x08, 0x08, 0x10, 0x06, 0x60, + 0x01, 0x80, 0x06, 0x60, 0x08, 0x10, 0x10, 0x08, 0x90, 0x09, 0x70, 0x0e, + 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +#define pencil_width 16 +#define pencil_height 16 +#define pencil_x_hot 1 +#define pencil_y_hot 1 +static unsigned char pencil_bits[] = { + 0x00, 0x00, 0x0e, 0x00, 0x16, 0x00, 0x22, 0x00, 0x44, 0x00, 0x88, 0x00, + 0x10, 0x01, 0x20, 0x02, 0x40, 0x04, 0x80, 0x08, 0x00, 0x11, 0x00, 0x22, + 0x00, 0x64, 0x00, 0x98, 0x00, 0x50, 0x00, 0x20}; +#define pencilmask_width 16 +#define pencilmask_height 16 +static unsigned char pencilmask_bits[] = { + 0x00, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x7c, 0x00, 0xf8, 0x00, + 0xf0, 0x01, 0xe0, 0x03, 0xc0, 0x07, 0x80, 0x0f, 0x00, 0x1f, 0x00, 0x3e, + 0x00, 0x7c, 0x00, 0x98, 0x00, 0x50, 0x00, 0x20}; +#define eyedropper_width 16 +#define eyedropper_height 16 +#define eyedropper_x_hot 0 +#define eyedropper_y_hot 0 +static unsigned char eyedropper_bits[] = { + 0x02, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x22, 0x00, 0x44, 0x00, 0x88, 0x00, + 0x10, 0x09, 0x20, 0x0e, 0x40, 0x0e, 0x80, 0x1f, 0x80, 0x7f, 0xc0, 0xff, + 0x00, 0xfe, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x78}; +#define eyedroppermask_width 16 +#define eyedroppermask_height 16 +static unsigned char eyedroppermask_bits[] = { + 0x03, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x7c, 0x00, 0xf8, 0x00, + 0xf0, 0x09, 0xe0, 0x0f, 0xc0, 0x0f, 0x80, 0x1f, 0x80, 0x7f, 0xc0, 0xff, + 0x00, 0xfe, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x78}; +#define shift_width 16 +#define shift_height 16 +#define shift_x_hot 7 +#define shift_y_hot 7 +static unsigned char shift_bits[] = { + 0x80, 0x00, 0xc0, 0x01, 0xa0, 0x02, 0x80, 0x00, 0x80, 0x00, 0x84, 0x10, + 0x82, 0x20, 0xff, 0x7f, 0x82, 0x20, 0x84, 0x10, 0x80, 0x00, 0x80, 0x00, + 0xa0, 0x02, 0xc0, 0x01, 0x80, 0x00, 0x00, 0x00}; +#define linecur_width 16 +#define linecur_height 16 +#define linecur_x_hot 0 +#define linecur_y_hot 0 +static unsigned char linecur_bits[] = { + 0xc1, 0xff, 0x62, 0xa0, 0xc4, 0xff, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, + 0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, + 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80}; +#if _CursorsMustBe16x16 +#define hand_width 16 +#define hand_height 16 +#define hand_x_hot 8 +#define hand_y_hot 12 +static unsigned char hand_bits[] = { + 0x80, 0x01, 0x40, 0x02, 0x48, 0x0e, 0x54, 0x12, 0x54, 0x52, 0x64, 0xb2, + 0x68, 0xb2, 0x48, 0x92, 0x17, 0x80, 0x19, 0x40, 0x11, 0x40, 0x02, 0x40, + 0x04, 0x20, 0x08, 0x20, 0x08, 0x20, 0x10, 0x10}; +#define handmask_width 16 +#define handmask_height 16 +static unsigned char handmask_bits[] = { + 0x80, 0x01, 0xc0, 0x03, 0xc8, 0x0f, 0xdc, 0x1f, 0xdc, 0x5f, 0xfc, 0xff, + 0xf8, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xfe, 0x7f, + 0xfc, 0x3f, 0xf8, 0x3f, 0xf8, 0x3f, 0xf0, 0x1f}; +#else +#define hand_width 24 +#define hand_height 24 +#define hand_x_hot 11 +#define hand_y_hot 15 +static unsigned char hand_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x12, 0x00, 0x40, 0x72, 0x00, 0xa0, 0x92, 0x00, 0xa0, 0x92, 0x02, + 0x20, 0x93, 0x05, 0x40, 0x93, 0x05, 0x40, 0x92, 0x04, 0xb8, 0x00, 0x04, + 0xc8, 0x00, 0x02, 0x88, 0x00, 0x02, 0x10, 0x00, 0x02, 0x20, 0x00, 0x01, + 0x40, 0x00, 0x01, 0x40, 0x00, 0x01, 0x80, 0x80, 0x00, 0x00, 0x81, 0x00, + 0x00, 0x82, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#define handmask_width 24 +#define handmask_height 24 +static unsigned char handmask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x1e, 0x00, 0x40, 0x7e, 0x00, 0xe0, 0xfe, 0x00, 0xe0, 0xfe, 0x02, + 0xe0, 0xff, 0x07, 0xc0, 0xff, 0x07, 0xc0, 0xff, 0x07, 0xb8, 0xff, 0x07, + 0xf8, 0xff, 0x03, 0xf8, 0xff, 0x03, 0xf0, 0xff, 0x03, 0xe0, 0xff, 0x01, + 0xc0, 0xff, 0x01, 0xc0, 0xff, 0x01, 0x80, 0xff, 0x00, 0x00, 0xff, 0x00, + 0x00, 0xfe, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#endif +#define filledrectcur_width 16 +#define filledrectcur_height 8 +#define filledrectcur_x_hot 0 +#define filledrectcur_y_hot 2 +static unsigned char filledrectcur_bits[] = { + 0x04, 0x00, 0x02, 0x00, 0xff, 0xff, 0xe2, 0xff, 0xe4, 0xff, 0xe0, 0xff, + 0xe0, 0xff, 0x00, 0x00}; +#define filledelipsecur_width 16 +#define filledelipsecur_height 8 +#define filledelipsecur_x_hot 0 +#define filledelipsecur_y_hot 2 +static unsigned char filledelipsecur_bits[] = { + 0x04, 0x00, 0x02, 0x00, 0x3f, 0x1f, 0xc2, 0x7f, 0xe4, 0xff, 0xc0, 0x7f, + 0x00, 0x1f, 0x00, 0x00}; +#define kerncur_width 16 +#define kerncur_height 15 +#define kerncur_x_hot 7 +#define kerncur_y_hot 7 +static unsigned char kerncur_bits[] = { + 0x80, 0x00, 0x80, 0x00, 0xf8, 0x0f, 0x08, 0x08, 0x28, 0x0a, 0x28, 0x09, + 0xaa, 0x28, 0x6f, 0x78, 0xaa, 0x28, 0x28, 0x09, 0x28, 0x0a, 0x08, 0x08, + 0xf8, 0x0f, 0x80, 0x00, 0x80, 0x00}; +#define rbearcur_width 16 +#define rbearcur_height 15 +#define rbearcur_x_hot 7 +#define rbearcur_y_hot 7 +static unsigned char rbearcur_bits[] = { + 0x80, 0x00, 0x80, 0x00, 0xf8, 0x0f, 0x08, 0x08, 0xe8, 0x09, 0x28, 0x0a, + 0x2a, 0x2a, 0xef, 0x79, 0x2a, 0x29, 0x28, 0x09, 0x28, 0x0a, 0x08, 0x08, + 0xf8, 0x0f, 0x80, 0x00, 0x80, 0x00}; +#define rbearmask_width 16 +#define rbearmask_height 15 +static unsigned char rbearmask_bits[] = { + 0x80, 0x00, 0xfc, 0x1f, 0xfc, 0x1f, 0xfc, 0x1f, 0xfc, 0x1f, 0xfe, 0x3f, + 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xfc, 0x1f, + 0xfc, 0x1f, 0xfc, 0x1f, 0x80, 0x00}; +#define lbearcur_width 16 +#define lbearcur_height 15 +#define lbearcur_x_hot 7 +#define lbearcur_y_hot 7 +static unsigned char lbearcur_bits[] = { + 0x80, 0x00, 0x80, 0x00, 0xf0, 0x07, 0x10, 0x04, 0x50, 0x04, 0x54, 0x14, + 0x52, 0x24, 0x5f, 0x7c, 0x52, 0x24, 0x54, 0x14, 0xd0, 0x05, 0x10, 0x04, + 0xf0, 0x07, 0x80, 0x00, 0x80, 0x00}; +#define lbearmask_width 16 +#define lbearmask_height 15 +static unsigned char lbearmask_bits[] = { + 0x80, 0x00, 0xf8, 0x0f, 0xf8, 0x0f, 0xf8, 0x0f, 0xfc, 0x1f, 0xfe, 0x3f, + 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x0f, + 0xf8, 0x0f, 0xf8, 0x0f, 0x80, 0x00}; + +#define logo_width 16 +#define logo_height 16 +static unsigned char logo_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x01, 0x08, 0x02, 0x88, 0x03, 0x48, 0x02, + 0x48, 0x02, 0xf8, 0x01, 0x48, 0x1c, 0x48, 0x12, 0x48, 0x12, 0x48, 0x12, + 0x5c, 0x2c, 0x40, 0x00, 0x30, 0x00, 0x00, 0x00}; + +#define prohibition_width 16 +#define prohibition_height 16 +#define prohibition_x_hot 7 +#define prohibition_y_hot 7 +static unsigned char prohibition_bits[] = { + 0xc0, 0x01, 0x30, 0x06, 0x0c, 0x18, 0x0c, 0x10, 0x12, 0x20, 0x22, 0x20, + 0x41, 0x40, 0x81, 0x40, 0x01, 0x41, 0x02, 0x22, 0x02, 0x24, 0x04, 0x18, + 0x0c, 0x18, 0x30, 0x06, 0xc0, 0x01, 0x00, 0x00}; +static unsigned char prohibitionmask_bits[] = { + 0xc0, 0x01, 0xf0, 0x07, 0xfc, 0x1f, 0xfc, 0x1f, 0xfe, 0x3f, 0xfe, 0x3f, + 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0xfe, 0x3f, 0xfe, 0x3f, 0xfc, 0x1f, + 0xfc, 0x1f, 0xf0, 0x07, 0xc0, 0x01, 0x00, 0x00}; +#define ddcursor_width 16 +#define ddcursor_height 16 +#define ddcursor_x_hot 0 +#define ddcursor_y_hot 0 +static unsigned char ddcursor_bits[] = { + 0x0f, 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x02, 0x60, 0xc6, 0x50, 0x2a, 0x50, 0x2a, 0xa0, 0xc6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + +void InitCursors(void) { + GWindow mask, image; + /* The XServer shipping with redhat 7.1 seems to suffer a protocol change */ + /* with the red and blue members of XColor structure reversed */ + /* So all of my cursors which should be red (to match the points drawn */ + /* on the screen) come out blue. If I run the same image on another server*/ + /* it's red. Oh well. */ + + image = GDrawCreateBitmap(NULL,magplus_width,magplus_height,magplus_bits); + ct_magplus = GDrawCreateCursor(image,image,0x000000,0xffffff,magplus_x_hot, + magplus_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,magminus_width,magminus_height,magminus_bits); + ct_magminus = GDrawCreateCursor(image,image,0x000000,0xffffff,magminus_x_hot, + magminus_y_hot); + GDrawDestroyWindow(image); + + image = GDrawCreateBitmap(NULL,pointercur_width,pointercur_height,pointercur_bits); + mask = GDrawCreateBitmap(NULL,pointercurmask_width,pointercurmask_height,pointercurmask_bits); + ct_mypointer = GDrawCreateCursor(image,mask,0x000000,0xffffff,pointercur_x_hot, + pointercur_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + + image = GDrawCreateBitmap(NULL,pointercic_width,pointercic_height,pointercic_bits); + mask = GDrawCreateBitmap(NULL,pointercic_width,pointercic_height,pointercicmask_bits); + ct_circle = GDrawCreateCursor(image,mask,0xff0000,0xffffff,pointercic_x_hot, + pointercic_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,pointertri_width,pointertri_height,pointertri_bits); + mask = GDrawCreateBitmap(NULL,pointertri_width,pointertri_height,pointertrimask_bits); + ct_triangle = GDrawCreateCursor(image,mask,0xff0000,0xffffff,pointertri_x_hot, + pointertri_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,pointersqr_width,pointersqr_height,pointersqr_bits); + mask = GDrawCreateBitmap(NULL,pointersqr_width,pointersqr_height,pointersqrmask_bits); + ct_square = GDrawCreateCursor(image,mask,0xff0000,0xffffff,pointersqr_x_hot, + pointersqr_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,pencur_width,pencur_height,pencur_bits); + mask = GDrawCreateBitmap(NULL,pencur_width,pencur_height,pencurmask_bits); + ct_pen = GDrawCreateCursor(image,mask,0xff0000,0xffffff,pencur_x_hot, + pencur_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,setwidthcur_width,setwidthcur_height,setwidthcur_bits); + /*mask = GDrawCreateBitmap(NULL,setwidthcur_width,setwidthcur_height,setwidthmask_bits);*/ + ct_setwidth = GDrawCreateCursor(image,image,0xff0000,0xffffff,setwidthcur_x_hot, + setwidthcur_y_hot); + GDrawDestroyWindow(image); + + image = GDrawCreateBitmap(NULL,rulercur_width,rulercur_height,rulercur_bits); + ct_ruler = GDrawCreateCursor(image,image,0x000000,0xffffff,rulercur_x_hot, + rulercur_y_hot); + GDrawDestroyWindow(image); + + image = GDrawCreateBitmap(NULL,knifecur_width,knifecur_height,knifecur_bits); + mask = GDrawCreateBitmap(NULL,knifecur_width,knifecur_height,knifecurmask_bits); + ct_knife = GDrawCreateCursor(image,mask,0xff0000,0xffffff,knifecur_x_hot, + knifecur_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + + image = GDrawCreateBitmap(NULL,flipcur_width,flipcur_height,flipcur_bits); + mask = GDrawCreateBitmap(NULL,flipcur_width,flipcur_height,flipcurmask_bits); + ct_flip = GDrawCreateCursor(image,image,0xff0000,0xffffff,flipcur_x_hot, + flipcur_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + + image = GDrawCreateBitmap(NULL,rotatecur_width,rotatecur_height,rotatecur_bits); + ct_rotate = GDrawCreateCursor(image,image,0x000000,0xffffff,rotatecur_x_hot, + rotatecur_y_hot); + GDrawDestroyWindow(image); + + image = GDrawCreateBitmap(NULL,scalecur_width,scalecur_height,scalecur_bits); + mask = GDrawCreateBitmap(NULL,scalecur_width,scalecur_height,scalecurmask_bits); + ct_scale = GDrawCreateCursor(image,image,0xff0000,0xffffff,scalecur_x_hot, + scalecur_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + + image = GDrawCreateBitmap(NULL,skewcur_width,skewcur_height,skewcur_bits); + mask = GDrawCreateBitmap(NULL,skewcur_width,skewcur_height,skewcurmask_bits); + ct_skew = GDrawCreateCursor(image,image,0xff0000,0xffffff,skewcur_x_hot, + skewcur_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + + image = GDrawCreateBitmap(NULL,rectcur_width,rectcur_height,rectcur_bits); + ct_rect = GDrawCreateCursor(image,image,0xff0000,0xffffff,rectcur_x_hot, + rectcur_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,elipsecur_width,elipsecur_height,elipsecur_bits); + ct_elipse = GDrawCreateCursor(image,image,0xff0000,0xffffff,elipsecur_x_hot, + elipsecur_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,polycur_width,polycur_height,polycur_bits); + ct_poly = GDrawCreateCursor(image,image,0xff0000,0xffffff,polycur_x_hot, + polycur_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,starcur_width,starcur_height,starcur_bits); + ct_star = GDrawCreateCursor(image,image,0xff0000,0xffffff,starcur_x_hot, + starcur_y_hot); + GDrawDestroyWindow(image); + + image = GDrawCreateBitmap(NULL,nwse_width,nwse_height,nwse_bits); + ct_nwse = GDrawCreateCursor(image,image,0xff0000,0xffffff,nwse_x_hot, + nwse_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,nesw_width,nesw_height,nesw_bits); + ct_nesw = GDrawCreateCursor(image,image,0xff0000,0xffffff,nesw_x_hot, + nesw_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,leftright_width,leftright_height,leftright_bits); + ct_leftright = GDrawCreateCursor(image,image,0xff0000,0xffffff,leftright_x_hot, + leftright_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,updown_width,updown_height,updown_bits); + ct_updown = GDrawCreateCursor(image,image,0xff0000,0xffffff,updown_x_hot, + updown_y_hot); + GDrawDestroyWindow(image); + + image = GDrawCreateBitmap(NULL,pencil_width,pencil_height,pencil_bits); + mask = GDrawCreateBitmap(NULL,pencil_width,pencil_height,pencilmask_bits); + ct_pencil = GDrawCreateCursor(image,mask,0xff0000,0xffffff,pencil_x_hot, + pencil_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,eyedropper_width,eyedropper_height,eyedropper_bits); + mask = GDrawCreateBitmap(NULL,eyedropper_width,eyedropper_height,eyedroppermask_bits); + ct_eyedropper = GDrawCreateCursor(image,mask,0xff0000,0xffffff,eyedropper_x_hot, + eyedropper_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,shift_width,shift_height,shift_bits); + ct_shift = GDrawCreateCursor(image,image,0xff0000,0xffffff,shift_x_hot, + shift_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,linecur_width,linecur_height,linecur_bits); + ct_line = GDrawCreateCursor(image,image,0xff0000,0xffffff,linecur_x_hot, + linecur_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,hand_width,hand_height,hand_bits); + mask = GDrawCreateBitmap(NULL,hand_width,hand_height,handmask_bits); + ct_myhand = GDrawCreateCursor(image,mask,0xff0000,0xffffff,hand_x_hot, + hand_y_hot); + GDrawDestroyWindow(image); GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,filledrectcur_width,filledrectcur_height,filledrectcur_bits); + ct_filledrect = GDrawCreateCursor(image,image,0xff0000,0xffffff,filledrectcur_x_hot, + filledrectcur_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,filledelipsecur_width,filledelipsecur_height,filledelipsecur_bits); + ct_filledelipse = GDrawCreateCursor(image,image,0xff0000,0xffffff,filledelipsecur_x_hot, + filledelipsecur_y_hot); + GDrawDestroyWindow(image); + + image = GDrawCreateBitmap(NULL,kerncur_width,kerncur_height,kerncur_bits); + mask = GDrawCreateBitmap(NULL,rbearmask_width,rbearmask_height,rbearmask_bits); + ct_kerning = GDrawCreateCursor(image,mask,0xff0000,0xffffff,kerncur_x_hot, + kerncur_y_hot); + GDrawDestroyWindow(image); + image = GDrawCreateBitmap(NULL,rbearcur_width,rbearcur_height,rbearcur_bits); + ct_rbearing = GDrawCreateCursor(image,mask,0xff0000,0xffffff,rbearcur_x_hot, + rbearcur_y_hot); + GDrawDestroyWindow(image); + GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,lbearcur_width,lbearcur_height,lbearcur_bits); + mask = GDrawCreateBitmap(NULL,lbearmask_width,lbearmask_height,lbearmask_bits); + ct_lbearing = GDrawCreateCursor(image,mask,0xff0000,0xffffff,lbearcur_x_hot, + lbearcur_y_hot); + GDrawDestroyWindow(image); + GDrawDestroyWindow(mask); + + logo_icon = GDrawCreateBitmap(NULL,logo_width,logo_height,logo_bits); + GDrawSetDefaultIcon(logo_icon); + + image = GDrawCreateBitmap(NULL,prohibition_width,prohibition_height,prohibition_bits); + mask = GDrawCreateBitmap(NULL,prohibition_width,prohibition_height,prohibitionmask_bits); + ct_prohibition = GDrawCreateCursor(image,mask,0xff0000,0xffffff,prohibition_x_hot, + prohibition_y_hot); + GDrawDestroyWindow(image); + GDrawDestroyWindow(mask); + image = GDrawCreateBitmap(NULL,ddcursor_width,ddcursor_height,ddcursor_bits); + ct_ddcursor = GDrawCreateCursor(image,image,0xff0000,0xffffff,ddcursor_x_hot, + ddcursor_y_hot); + GDrawDestroyWindow(image); +} diff --git a/fontforge/cvaddpoints.c b/fontforge/cvaddpoints.c new file mode 100644 index 00000000..ef479442 --- /dev/null +++ b/fontforge/cvaddpoints.c @@ -0,0 +1,525 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include "splinefont.h" +#include "ustring.h" + +int CVOneThingSel(CharView *cv, SplinePoint **sp, SplinePointList **_spl, + RefChar **ref, ImageList **img, AnchorPoint **ap) { + /* if there is exactly one thing selected return it */ + SplinePointList *spl, *found=NULL; + Spline *spline; + SplinePoint *foundsp=NULL; + RefChar *refs, *foundref=NULL; + ImageList *imgs, *foundimg=NULL; + AnchorPoint *aps, *foundap=NULL; + + *sp = NULL; *_spl=NULL; *ref=NULL; *img = NULL; + if ( ap ) *ap = NULL; + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + if ( spl->first->selected ) { + if ( found!=NULL ) +return( 0 ); /* At least two points */ + found = spl; foundsp = spl->first; + } + for ( spline = spl->first->next; spline!=NULL ; spline=spline->to->next ) { + if ( spline->to==spl->first ) + break; + if ( spline->to->selected ) { + if ( found!=NULL ) +return( 0 ); + found = spl; foundsp = spline->to; + } + } + } + *sp = foundsp; *_spl = found; + + if ( cv->drawmode==dm_fore ) { + for ( refs=cv->layerheads[cv->drawmode]->refs; refs!=NULL; refs = refs->next ) { + if ( refs->selected ) { + if ( found!=NULL || foundref!=NULL ) +return( 0 ); + foundref = refs; + } + } + *ref = foundref; + if ( cv->showanchor && ap!=NULL ) { + for ( aps=cv->sc->anchor; aps!=NULL; aps=aps->next ) { + if ( aps->selected ) { + if ( found!=NULL || foundref!=NULL || foundap!=NULL ) +return( 0 ); + foundap = aps; + } + } + *ap = foundap; + } + } + + for ( imgs=cv->layerheads[cv->drawmode]->images; imgs!=NULL; imgs = imgs->next ) { + if ( imgs->selected ) { + if ( found!=NULL || foundimg!=NULL ) +return( 0 ); + foundimg = imgs; + } + } + *img = foundimg; + + if ( found ) +return( foundimg==NULL && foundref==NULL && foundap==NULL ); + else if ( foundref || foundimg || foundap ) +return( true ); + +return( false ); +} + +int CVOneContourSel(CharView *cv, SplinePointList **_spl, + RefChar **ref, ImageList **img) { + /* if there is exactly one contour/image/reg selected return it */ + SplinePointList *spl, *found=NULL; + Spline *spline; + RefChar *refs, *foundref=NULL; + ImageList *imgs, *foundimg=NULL; + + *_spl=NULL; *ref=NULL; *img = NULL; + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + if ( spl->first->selected ) { + if ( found!=NULL && found!=spl ) +return( 0 ); /* At least two contours */ + found = spl; + } + for ( spline = spl->first->next; spline!=NULL ; spline=spline->to->next ) { + if ( spline->to==spl->first ) + break; + if ( spline->to->selected ) { + if ( found!=NULL && found!=spl ) +return( 0 ); + found = spl; + } + } + } + *_spl = found; + + if ( cv->drawmode==dm_fore ) { + for ( refs=cv->layerheads[cv->drawmode]->refs; refs!=NULL; refs = refs->next ) { + if ( refs->selected ) { + if ( found!=NULL || foundref!=NULL ) +return( 0 ); + foundref = refs; + } + } + *ref = foundref; + } + + for ( imgs=cv->layerheads[cv->drawmode]->images; imgs!=NULL; imgs = imgs->next ) { + if ( imgs->selected ) { + if ( found!=NULL || foundimg!=NULL ) +return( 0 ); + foundimg = imgs; + } + } + *img = foundimg; + + if ( found ) +return( foundimg==NULL && foundref==NULL ); + else if ( foundref || foundimg ) +return( true ); + +return( false ); +} + +SplinePointList *CVAnySelPointList(CharView *cv) { + /* if there is exactly one point selected and it is on an open splineset */ + /* and it is one of the endpoints of the splineset, then return that */ + /* splineset */ + SplinePointList *spl, *found=NULL; + Spline *spline, *first; + + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + if ( spl->first->selected ) { + if ( found!=NULL ) +return( NULL ); /* At least two points */ + if ( spl->first->prev!=NULL ) +return( NULL ); /* Not an open splineset */ + found = spl; + } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( spline->to->selected ) { + if ( found!=NULL ) +return( NULL ); + if ( spline->to->next!=NULL ) +return( NULL ); /* Selected point is not at end of a splineset */ + found = spl; + } + if ( first==NULL ) first = spline; + } + } +return( found ); +} + +SplinePoint *CVAnySelPoint(CharView *cv) { + /* if there is exactly one point selected */ + SplinePointList *spl; + Spline *spline, *first; SplinePoint *found = NULL; + + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl=spl->next ) { + if ( spl->first->selected ) { + if ( found!=NULL ) +return( NULL ); /* At least two points */ + found = spl->first; + } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( spline->to->selected ) { + if ( found!=NULL ) +return( NULL ); + found = spline->to; + } + if ( first==NULL ) first = spline; + } + } +return( found ); +} + +/* When the user tries to add a point (by doing a mouse down with a point tool + selected) there are several cases to be looked at: + If there is a single point selected and it is at the begining/end of an open spline set + if we clicked on an other point which is the begining/end of an open splineset + draw a spline connecting the two spline sets and merge them + (or if it's the same spline set, then close it) + else + create a new point where we clicked + draw a spline between the selected point and the new one + deselect the old point + select the new one + endif + else if they clicked on a spline + split the spline into two bits at the point where they clicked + else + create a new point where they clicked + put it on a new splineset + select it + endif + + and, if the old point is a tangent, we may need to adjust its control pt +*/ +void CVMouseDownPoint(CharView *cv) { + SplineSet *sel, *ss; + SplinePoint *sp, *base = NULL; + SplineChar *sc = cv->sc; + enum pointtype ptype = (cv->active_tool==cvt_curve?pt_curve: + cv->active_tool==cvt_corner?pt_corner: + cv->active_tool==cvt_tangent?pt_tangent: + /*cv->active_tool==cvt_pen?*/pt_corner); + int order2 = cv->sc->parent->order2; + + cv->active_spl = NULL; + cv->active_sp = NULL; + + sel = CVAnySelPointList(cv); + if ( sel!=NULL ) { + if ( sel->first->selected ) base = sel->first; + else base = sel->last; + if ( base==cv->p.sp ) +return; /* We clicked on the active point, that's a no-op */ + } + CVPreserveState(cv); + CVClearSel(cv); + if ( sel!=NULL ) { + sp = cv->p.sp; + cv->lastselpt = base; + ss = sel; + if ( base->next!=NULL ) + SplineSetReverse(sel); + if ( base->next!=NULL ) + GDrawIError("Base point not at end of splineset in CVMouseDownPoint"); + if ( sp==NULL || (sp->next!=NULL && sp->prev!=NULL) || sp==base ) { + /* Add a new point */ + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = cv->p.cx; + sp->me.y = cv->p.cy; + sp->prevcp = sp->nextcp = sp->me; + sp->noprevcp = sp->nonextcp = 1; + sp->nextcpdef = sp->prevcpdef = 1; + sp->pointtype = ptype; + sp->selected = true; + if ( order2 && !base->nonextcp ) { + sp->prevcp = base->nextcp; + sp->noprevcp = false; + if ( cv->active_tool==cvt_pen ) { + sp->nextcp.x = sp->me.x - (sp->prevcp.x-sp->me.x); + sp->nextcp.y = sp->me.y - (sp->prevcp.y-sp->me.y); + sp->nonextcp = false; + } + } + SplineMake(base,sp,order2); + if ( cv->active_tool!=cvt_pen ) + SplineCharDefaultNextCP(base); + SplineCharDefaultPrevCP(sp); + ss->last = sp; + } else if ( cv->p.spl==sel ) { + /* Close the current spline set */ + cv->joinvalid = true; + cv->joinpos = *sp; cv->joinpos.selected = false; + if ( order2 ) { + if ( base->nonextcp || sp->noprevcp ) { + base->nonextcp = sp->noprevcp = true; + base->nextcp = base->me; + sp->prevcp = sp->me; + } else { + base->nextcp.x = sp->prevcp.x = (base->nextcp.x+sp->prevcp.x)/2; + base->nextcp.y = sp->prevcp.y = (base->nextcp.y+sp->prevcp.y)/2; + } + base->nextcpdef = sp->prevcpdef = true; + } + SplineMake(base,sp,order2); + if ( cv->active_tool!=cvt_pen ) + SplineCharDefaultNextCP(base); + SplineCharDefaultPrevCP(sp); + ss->last = sp; + if ( sp->pointtype==pt_tangent ) { + SplineCharTangentNextCP(sp); + if ( sp->next ) SplineRefigure(sp->next ); + } + } else { + /* Merge two spline sets */ + cv->joinvalid = true; + cv->joinpos = *sp; cv->joinpos.selected = false; + if ( sp->prev!=NULL ) + SplineSetReverse(cv->p.spl); + if ( sp->prev!=NULL ) + GDrawIError("Base point not at start of splineset in CVMouseDownPoint"); + /* remove the old spl entry from the chain */ + if ( cv->p.spl==cv->layerheads[cv->drawmode]->splines ) + cv->layerheads[cv->drawmode]->splines = cv->p.spl->next; + else { SplineSet *temp; + for ( temp = cv->layerheads[cv->drawmode]->splines; temp->next!=cv->p.spl; temp = temp->next ); + temp->next = cv->p.spl->next; + } + SplineMake(base,sp,order2); + if ( cv->active_tool!=cvt_pen ) + SplineCharDefaultNextCP(base); + SplineCharDefaultPrevCP(sp); + if ( sp->pointtype==pt_tangent ) { + SplineCharTangentNextCP(sp); + if ( sp->next ) SplineRefigure(sp->next ); + } + ss->last = cv->p.spl->last; + chunkfree( cv->p.spl,sizeof(SplinePointList) ); + } + sp->selected = true; + if ( base->pointtype==pt_tangent ) { + SplineCharTangentPrevCP(base); + if ( base->prev!=NULL ) + SplineRefigure(base->prev); + } + } else if ( cv->p.spline!=NULL ) { + sp = SplineBisect(cv->p.spline,cv->p.t); + cv->joinvalid = true; + cv->joinpos = *sp; cv->joinpos.selected = false; + sp->pointtype = ptype; + sp->selected = true; + ss = cv->p.spl; + } else { + ss = chunkalloc(sizeof(SplineSet)); + sp = chunkalloc(sizeof(SplinePoint)); + ss->first = ss->last = sp; + ss->next = cv->layerheads[cv->drawmode]->splines; + cv->layerheads[cv->drawmode]->splines = ss; + sp->me.x = cv->p.cx; + sp->me.y = cv->p.cy; + sp->nextcp = sp->me; + sp->prevcp = sp->me; + sp->nonextcp = sp->noprevcp = 1; + sp->nextcpdef = sp->prevcpdef = 1; + sp->pointtype = ptype; + sp->selected = true; + } + + cv->active_spl = ss; + cv->active_sp = sp; + CVSetCharChanged(cv,true); + CVInfoDraw(cv,cv->gw); + SCUpdateAll(sc); +} + +static void AdjustControls(SplinePoint *sp) { + if ( sp->next!=NULL ) { + SplineCharDefaultNextCP(sp); /* also fixes up tangents */ + SplineCharDefaultPrevCP(sp->next->to); + SplineRefigure(sp->next); + if ( sp->next->to->pointtype==pt_tangent && sp->next->to->next!=NULL ) { + SplineCharTangentNextCP(sp->next->to); + SplineRefigure(sp->next->to->next); + } + } + if ( sp->prev!=NULL ) { + SplineCharDefaultPrevCP(sp); + SplineCharDefaultNextCP(sp->prev->from); + SplineRefigure(sp->prev); + if ( sp->prev->from->pointtype==pt_tangent && sp->prev->from->prev!=NULL ) { + SplineCharTangentPrevCP(sp->prev->from); + SplineRefigure(sp->prev->from->prev); + } + } +} + +void CVAdjustPoint(CharView *cv, SplinePoint *sp) { + + if ( cv->info.x==sp->me.x && cv->info.y==sp->me.y ) +return; + sp->nextcp.x += (cv->info.x-sp->me.x); + sp->nextcp.y += (cv->info.y-sp->me.y); + sp->prevcp.x += (cv->info.x-sp->me.x); + sp->prevcp.y += (cv->info.y-sp->me.y); + sp->me.x = cv->info.x; + sp->me.y = cv->info.y; + AdjustControls(sp); + CVSetCharChanged(cv,true); +} + +void CVMergeSplineSets(CharView *cv, SplinePoint *active, SplineSet *activess, + SplinePoint *merge, SplineSet *mergess) { + SplinePointList *spl; + + cv->joinvalid = true; + cv->joinpos = *merge; cv->joinpos.selected = false; + + if ( active->prev==NULL ) + SplineSetReverse(activess); + if ( merge->next==NULL ) + SplineSetReverse(mergess); + active->nextcp = merge->nextcp; + active->nonextcp = merge->nonextcp; + active->nextcpdef = merge->nextcpdef; + active->next = merge->next; + if ( merge->next!= NULL ) { + active->next->from = active; + activess->last = mergess->last; + } + merge->next = NULL; + if ( mergess==activess ) { + activess->first = activess->last = active; + SplinePointMDFree(cv->sc,merge); + } else { + mergess->last = merge; + if ( mergess==cv->layerheads[cv->drawmode]->splines ) + cv->layerheads[cv->drawmode]->splines = mergess->next; + else { + for ( spl = cv->layerheads[cv->drawmode]->splines; spl->next!=mergess; spl=spl->next ); + spl->next = mergess->next; + } + SplinePointListMDFree(cv->sc,mergess); + } + AdjustControls(active); +} + +/* We move the active point around following the mouse. */ +/* There's one special case. If the active point is an end point on its splineset */ +/* and we've just moved on top of another splineset end-point, then join the */ +/* two splinesets at the active point. Of course we might close up our own */ +/* spline set... */ +void CVMouseMovePoint(CharView *cv, PressedOn *p) { + SplinePoint *active = cv->active_sp, *merge = p->sp; + SplineSet *activess = cv->active_spl; + + if ( active==NULL ) +return; + if ( cv->info.x==active->me.x && cv->info.y==active->me.y ) +return; + + if ( !cv->recentchange ) CVPreserveState(cv); + + CVAdjustPoint(cv,active); + if (( active->next==NULL || active->prev==NULL ) && merge!=NULL && + merge!=active && + (merge->next==NULL || merge->prev==NULL )) { + CVMergeSplineSets(cv,active,activess,merge,p->spl); + } + SCUpdateAll(cv->sc); +} + +void CVMouseMovePen(CharView *cv, PressedOn *p) { + SplinePoint *active = cv->active_sp; + + if ( active==NULL ) +return; + if ( cv->info.x==active->nextcp.x && cv->info.y==active->nextcp.y ) +return; + cv->lastselpt = cv->active_sp; + + active->nextcp.x = cv->info.x; + active->nextcp.y = cv->info.y; + if ( active->nextcp.x==active->me.x && active->nextcp.y==active->me.y ) { + active->prevcp = active->me; + active->nonextcp = active->noprevcp = true; + active->pointtype = pt_corner; + } else { + active->prevcp.x = active->me.x - (active->nextcp.x-active->me.x); + active->prevcp.y = active->me.y - (active->nextcp.y-active->me.y); + active->nonextcp = active->noprevcp = false; + active->nextcpdef = active->prevcpdef = false; + active->pointtype = pt_curve; + } + if ( cv->sc->parent->order2 ) { + if ( active->prev!=NULL ) { + if ( active->noprevcp ) + active->prev->from->nonextcp = true; + else { + active->prev->from->nextcp = active->prevcp; + active->prev->from->nonextcp = false; + } + SplineRefigureFixup(active->prev); + } + if ( active->next!=NULL ) { + if ( active->nonextcp ) + active->next->to->noprevcp = true; + else { + active->next->to->prevcp = active->nextcp; + active->next->to->noprevcp = false; + } + SplineRefigureFixup(active->next); + } + } else { + if ( active->prev!=NULL ) + SplineRefigure(active->prev); + if ( active->next!=NULL ) + SplineRefigure(active->next); + } + SCUpdateAll(cv->sc); +} + +void CVMouseUpPoint(CharView *cv,GEvent *event) { + cv->lastselpt = cv->active_sp; + cv->active_spl = NULL; + cv->active_sp = NULL; + cv->joinvalid = false; + CVInfoDraw(cv,cv->gw); + if ( event->u.mouse.clicks>1 ) + CVGetInfo(cv); +} diff --git a/fontforge/cvdebug.c b/fontforge/cvdebug.c new file mode 100644 index 00000000..a9456c3e --- /dev/null +++ b/fontforge/cvdebug.c @@ -0,0 +1,1235 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * dercved from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include + +#ifndef FREETYPE_HAS_DEBUGGER +void CVDebugReInit(CharView *cv,int restart_debug,int debug_fpgm) { +} + +void CVDebugFree(DebugView *dv) { +} + +int DVChar(DebugView *dv, GEvent *event) { +return( false ); +} +#else +#include +#include FT_FREETYPE_H +#include "ttinterp.h" + +static int DVBpCheck(struct instrinfo *ii, int ip) { + DebugView *dv = (ii->userdata); + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + + if ( exc==NULL ) +return( false ); + +return( DebuggerBpCheck( dv->dc,exc->curRange,ip)); +} + +static void DVToggleBp(struct instrinfo *ii, int ip) { + DebugView *dv = (ii->userdata); + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + + if ( exc==NULL ) +return; + DebuggerToggleBp(dv->dc,exc->curRange,ip); +} + +static void DVRegExpose(GWindow pixmap,DebugView *dv,GEvent *event) { + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + char buffer[100]; + unichar_t ubuffer[100]; + int y; + + GDrawFillRect(pixmap,&event->u.expose.rect,GDrawGetDefaultBackground(screen_display)); + if ( exc==NULL ) +return; + GDrawSetFont(pixmap,dv->ii.gfont); + y = 3+dv->ii.as; + + sprintf( buffer, " rp0: %d", exc->GS.rp0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, " rp1: %d", exc->GS.rp1 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, " rp2: %d", exc->GS.rp2 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "loop: %ld", exc->GS.loop ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + y+=2; + + sprintf( buffer, " zp0: %s", exc->GS.gep0?"Normal":"Twilight" ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, " zp1: %s", exc->GS.gep1?"Normal":"Twilight" ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, " zp2: %s", exc->GS.gep2?"Normal":"Twilight" ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + y+=2; + + sprintf( buffer, "MinDist: %.2f", exc->GS.minimum_distance/64.0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "CvtCutin: %.2f", exc->GS.control_value_cutin/64.0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "SingWidCut: %.2f", exc->GS.single_width_cutin/64.0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "SingWidVal: %.2f", exc->GS.single_width_value/64.0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + y+=2; + + sprintf( buffer, "freeVec: %g,%g", (((int)exc->GS.freeVector.x<<16)>>(16+14)) + ((exc->GS.freeVector.x&0x3fff)/16384.0), + (((int)exc->GS.freeVector.y<<16)>>(16+14)) + ((exc->GS.freeVector.y&0x3fff)/16384.0) ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "projVec: %g,%g", (((int)exc->GS.projVector.x<<16)>>(16+14)) + ((exc->GS.projVector.x&0x3fff)/16384.0), + (((int)exc->GS.projVector.y<<16)>>(16+14)) + ((exc->GS.projVector.y&0x3fff)/16384.0) ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "dualVec: %g,%g", (((int)exc->GS.dualVector.x<<16)>>(16+14)) + ((exc->GS.dualVector.x&0x3fff)/16384.0), + (((int)exc->GS.dualVector.y<<16)>>(16+14)) + ((exc->GS.dualVector.y&0x3fff)/16384.0) ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + y+=2; + + sprintf( buffer, "AutoFlip: %s", exc->GS.auto_flip?"True": "False" ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "DeltaBase: %d", exc->GS.delta_base ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "DeltaShift: %d", exc->GS.delta_shift ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "RndState: %s", + exc->GS.round_state==TT_Round_To_Half_Grid? "To Half Grid" : + exc->GS.round_state==TT_Round_To_Grid? "To Grid" : + exc->GS.round_state==TT_Round_To_Double_Grid? "To Double Grid" : + exc->GS.round_state==TT_Round_Down_To_Grid? "Down To Grid" : + exc->GS.round_state==TT_Round_Up_To_Grid? "Up To Grid" : + exc->GS.round_state==TT_Round_Off? "Off" : + exc->GS.round_state==TT_Round_Super? "Super" : + exc->GS.round_state==TT_Round_Super_45? "Super45" : + "Unknown" ); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "SRndPeriod: %.2f", exc->period/64.0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "SRndPhase: %.2f", exc->phase/64.0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "SRndThreshold: %.2f", exc->threshold/64.0 ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "InstrControl: %d", exc->GS.instruct_control ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "ScanControl: %s", exc->GS.scan_control?"True": "False" ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + sprintf( buffer, "ScanType: %d", exc->GS.scan_type ); uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); y += dv->ii.fh; + + /* Instruction control, scan control, scan type, phase, threshold for super rounding */ +} + +static void DVStackExpose(GWindow pixmap,DebugView *dv,GEvent *event) { + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + char buffer[100]; + unichar_t ubuffer[100]; + int i, y; + + GDrawFillRect(pixmap,&event->u.expose.rect,GDrawGetDefaultBackground(screen_display)); + if ( exc==NULL ) +return; + GDrawSetFont(pixmap,dv->ii.gfont); + y = 3+dv->ii.as; + for ( i=exc->top-1; i>=0; --i ) { + sprintf(buffer, "%3d: %3ld (%.2f)", i, exc->stack[i], exc->stack[i]/64.0 ); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + if ( y>event->u.expose.rect.y+event->u.expose.rect.height ) + break; + y += dv->ii.fh; + } + if ( exc->top==0 ) { + uc_strcpy(ubuffer,""); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + } +} + +static void DVStorageExpose(GWindow pixmap,DebugView *dv,GEvent *event) { + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + char buffer[100]; + unichar_t ubuffer[100]; + int i, y; + + GDrawFillRect(pixmap,&event->u.expose.rect,GDrawGetDefaultBackground(screen_display)); + if ( exc==NULL ) +return; + GDrawSetFont(pixmap,dv->ii.gfont); + y = 3+dv->ii.as; + for ( i=0; istoreSize; ++i ) { + sprintf(buffer, "%3d: %3ld (%.2f)", i, exc->storage[i], exc->storage[i]/64.0 ); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + if ( y>event->u.expose.rect.y+event->u.expose.rect.height ) + break; + y += dv->ii.fh; + } + if ( exc->storeSize==0 ) { + uc_strcpy(ubuffer,""); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + } +} + +static void DVCvtExpose(GWindow pixmap,DebugView *dv,GEvent *event) { + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + char buffer[100]; + unichar_t ubuffer[100]; + int i, y; + + GDrawFillRect(pixmap,&event->u.expose.rect,GDrawGetDefaultBackground(screen_display)); + if ( exc==NULL ) +return; + GDrawSetFont(pixmap,dv->ii.gfont); + y = 3+dv->ii.as; + for ( i=0; dv->cvt_offtop+icvtSize; ++i ) { + sprintf(buffer, "%3d: %3ld (%.2f)", dv->cvt_offtop+i, + exc->cvt[dv->cvt_offtop+i], exc->cvt[dv->cvt_offtop+i]/64.0 ); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + if ( y>event->u.expose.rect.y+event->u.expose.rect.height ) + break; + y += dv->ii.fh; + } + if ( exc->cvtSize==0 ) { + uc_strcpy(ubuffer,""); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + } +} + +#define CID_Twilight 1001 +#define CID_Normal 1002 +#define CID_Grid 1003 +#define CID_EmUnit 1004 +#define CID_Current 1005 +#define CID_Original 1006 +static int show_twilight = true, show_grid=true, show_current=true; + +static void DVPointsVExpose(GWindow pixmap,DebugView *dv,GEvent *event) { + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + char buffer[100]; + unichar_t ubuffer[100]; + int i, y; + FT_Vector *pts; + int n, n_watch; + char watched; + TT_GlyphZoneRec *r; + uint8 *watches; + + GDrawFillRect(pixmap,&event->u.expose.rect,GDrawGetDefaultBackground(screen_display)); + if ( exc==NULL ) +return; + + show_twilight = GGadgetIsChecked(GWidgetGetControl(dv->points,CID_Twilight)); + show_grid = GGadgetIsChecked(GWidgetGetControl(dv->points,CID_Grid)); + show_current = GGadgetIsChecked(GWidgetGetControl(dv->points,CID_Current)); + r = show_twilight ? &exc->twilight : &exc->pts; + n = r->n_points; + pts = show_current ? r->cur : r->org; + + watches = DebuggerGetWatches(dv->dc,&n_watch); + + GDrawSetFont(pixmap,dv->ii.gfont); + y = 3+dv->ii.as; + for ( i=0; itags[i]&FT_Curve_Tag_Touch_X?'H':' ', r->tags[i]&FT_Curve_Tag_Touch_Y?'V':' ', watched, + pts[i].x/64.0, pts[i].y/64.0 ); + else + sprintf(buffer, "%3d: %c%c%c %g,%g", i, + r->tags[i]&FT_Curve_Tag_Touch_X?'H':' ', r->tags[i]&FT_Curve_Tag_Touch_Y?'V':' ', watched, + pts[i].x*dv->scale, pts[i].y*dv->scale ); + uc_strcpy(ubuffer,buffer); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + if ( y>event->u.expose.rect.y+event->u.expose.rect.height ) + break; + y += dv->ii.fh; + } + if ( n==0 ) { + uc_strcpy(ubuffer,""); + GDrawDrawText(pixmap,3,y,ubuffer,-1,NULL,0); + } +} + +static void DVPointsExpose(GWindow pixmap,DebugView *dv,GEvent *event) { + GDrawSetLineWidth(pixmap,0); + GDrawDrawLine(pixmap,event->u.expose.rect.x,dv->pts_head-1,event->u.expose.rect.x+event->u.expose.rect.width,dv->pts_head-1,0x000000); +} + +static SplineSet *SplineSetsFromPoints(TT_GlyphZoneRec *pts, real scale) { + int i=0, c, last_off, start; + SplineSet *head=NULL, *last=NULL, *cur; + SplinePoint *sp; + /* very similar to parsettf.c: ttfbuildcontours */ + + for ( c=0; cn_contours; ++c ) { + if ( pts->contours[c]next = cur; + last = cur; + last_off = false; + start = i; + while ( i<=pts->contours[c] ) { + if ( pts->tags[i]&FT_Curve_Tag_On ) { + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = sp->nextcp.x = sp->prevcp.x = pts->cur[i].x*scale; + sp->me.y = sp->nextcp.y = sp->prevcp.y = pts->cur[i].y*scale; + sp->nonextcp = sp->noprevcp = true; + sp->ttfindex = i; + if ( last_off && cur->last!=NULL ) { + cur->last->nextcp.x = sp->prevcp.x = pts->cur[i-1].x*scale; + cur->last->nextcp.y = sp->prevcp.y = pts->cur[i-1].y*scale; + } + last_off = false; + } else if ( last_off ) { + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = (pts->cur[i].x+pts->cur[i-1].x)/2 * scale; + sp->me.y = (pts->cur[i].y+pts->cur[i-1].y)/2 * scale; + sp->nextcp = sp->prevcp = sp->me; + sp->nonextcp = true; + sp->ttfindex = 0xffff; + if ( last_off && cur->last!=NULL ) { + cur->last->nextcp.x = sp->prevcp.x = pts->cur[i-1].x * scale; + cur->last->nextcp.y = sp->prevcp.y = pts->cur[i-1].y * scale; + } + /* last_off continues to be true */ + } else { + last_off = true; + sp = NULL; + } + if ( sp!=NULL ) { + if ( cur->first==NULL ) + cur->first = sp; + else + SplineMake2(cur->last,sp); + cur->last = sp; + } + ++i; + } + if ( start==i-1 ) { + /* MS chinese fonts have contours consisting of a single off curve*/ + /* point. What on earth do they think that means? */ + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = pts->cur[start].x * scale; + sp->me.y = pts->cur[start].y * scale; + sp->nextcp = sp->prevcp = sp->me; + sp->nonextcp = sp->noprevcp = true; + sp->ttfindex = i-1; + cur->first = cur->last = sp; + } else if ( !(pts->tags[start]&FT_Curve_Tag_On) && !(pts->tags[i-1]&FT_Curve_Tag_On) ) { + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = (pts->cur[start].x+pts->cur[i-1].x)/2 * scale; + sp->me.y = (pts->cur[start].y+pts->cur[i-1].y)/2 * scale; + sp->nextcp = sp->prevcp = sp->me; + sp->nonextcp = true; + sp->ttfindex = 0xffff; + cur->last->nextcp.x = sp->prevcp.x = pts->cur[i-1].x * scale; + cur->last->nextcp.y = sp->prevcp.y = pts->cur[i-1].y * scale; + SplineMake2(cur->last,sp); + cur->last = sp; + cur->last->nextcp.x = cur->first->prevcp.x = pts->cur[start].x * scale; + cur->last->nextcp.y = cur->first->prevcp.y = pts->cur[start].y * scale; + } else if ( !(pts->tags[i-1]&FT_Curve_Tag_On)) { + cur->last->nextcp.x = cur->first->prevcp.x = pts->cur[i-1].x * scale; + cur->last->nextcp.y = cur->first->prevcp.y = pts->cur[i-1].y * scale; + } else if ( !(pts->tags[start]&FT_Curve_Tag_On) ) { + cur->last->nextcp.x = cur->first->prevcp.x = pts->cur[start].x * scale; + cur->last->nextcp.y = cur->first->prevcp.y = pts->cur[start].y * scale; + } + if ( cur->last!=cur->first ) { + SplineMake2(cur->last,cur->first); + cur->last = cur->first; + } + } +return( head ); +} + +static void DVFigureNewState(DebugView *dv,TT_ExecContext exc) { + int range = exc==NULL ? cr_none : exc->curRange; + + /* Code to look for proper function/idef rather than the full fpgm table */ + if ( exc==NULL ) { + dv->id.instrs = NULL; + dv->id.instr_cnt = 0; + IIReinit(&dv->ii,-1); + } else if ( dv->id.instrs!=(uint8 *) exc->code ) { + dv->id.instrs =(uint8 *) exc->code; + dv->id.instr_cnt = exc->codeSize; + IIReinit(&dv->ii,exc->IP); + } else + IIScrollTo(&dv->ii,exc->IP,true); + + if ( dv->cv!=NULL && dv->cv->coderange!=range ) { + dv->cv->coderange = range; + CVInfoDraw(dv->cv,dv->cv->gw); + } + + + if ( exc!=NULL ) { + SplinePointListsFree(dv->cv->gridfit); + dv->cv->gridfit = SplineSetsFromPoints(&exc->pts,dv->scale); + if ( exc->pts.n_points!=0 ) + dv->cv->ft_gridfitwidth = exc->pts.cur[exc->pts.n_points-1].x * dv->scale; + else + dv->cv->ft_gridfitwidth = 0; + GDrawRequestExpose(dv->cv->v,NULL,false); + if ( dv->regs!=NULL ) + GDrawRequestExpose(dv->regs,NULL,false); + if ( dv->stack!=NULL ) + GDrawRequestExpose(dv->stack,NULL,false); + if ( dv->storage!=NULL ) + GDrawRequestExpose(dv->storage,NULL,false); + if ( dv->cvt!=NULL ) + GDrawRequestExpose(dv->cvt,NULL,false); + } +} + +static void DVGoFigure(DebugView *dv,enum debug_gotype go) { + DebuggerGo(dv->dc,go); + DVFigureNewState(dv,DebuggerGetEContext(dv->dc)); +} + +static int DV_Run(GGadget *g, GEvent *e) { + DebugView *dv; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + dv = GDrawGetUserData(GGadgetGetWindow(g)); + DVGoFigure(dv,(enum debug_gotype) GGadgetGetCid(g)); + } +return( true ); +} + +static int DV_WatchPnt(GGadget *g, GEvent *e) { + DebugView *dv; + int pnum=0, n, any=0; + SplineSet *ss; + SplinePoint *sp; + uint8 *watches; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + dv = GDrawGetUserData(GGadgetGetWindow(g)); + if ( dv->cv->sc->layers[ly_fore].refs!=NULL ) { + GWidgetErrorR(_STR_NoWatchPoints,_STR_NoWatchPointsWithRefs); +return( true ); + } + + DebuggerGetWatches(dv->dc,&n); + watches = gcalloc(n,sizeof(uint8)); + + for ( ss = dv->cv->sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sp->watched = false; + if ( sp->ttfindex == 0xffff ) + /* Ignore it */; + else if ( sp->selected && sp->ttfindexttfindex] = true; + any = true; + sp->watched = true; + } + if ( !sp->nonextcp ) { + ++pnum; + if ( sp==dv->cv->p.sp && dv->cv->p.nextcp && pnumnext==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + if ( !any ) { + free(watches); + watches = NULL; + } + DebuggerSetWatches(dv->dc,n,watches); + GDrawRequestExpose(dv->cv->v,NULL,false); + + } +return( true ); +} + +#define MID_Registers 1001 +#define MID_Stack 1002 +#define MID_Storage 1003 +#define MID_Points 1004 +#define MID_Cvt 1005 + +static void DVCreateRegs(DebugView *dv); +static void DVCreateStack(DebugView *dv); +static void DVCreateStore(DebugView *dv); +static void DVCreatePoints(DebugView *dv); +static void DVCreateCvt(DebugView *dv); + +static void DVMenuCreate(GWindow v, GMenuItem *mi,GEvent *e) { + DebugView *dv = (DebugView *) GDrawGetUserData(v); + + if ( mi->mid==MID_Registers ) { + if ( dv->regs!=NULL ) GDrawDestroyWindow(dv->regs); + else DVCreateRegs(dv); + } else if ( mi->mid==MID_Stack ) { + if ( dv->stack!=NULL ) GDrawDestroyWindow(dv->stack); + else DVCreateStack(dv); + } else if ( mi->mid==MID_Storage ) { + if ( dv->storage!=NULL ) GDrawDestroyWindow(dv->storage); + else DVCreateStore(dv); + } else if ( mi->mid==MID_Points ) { + if ( dv->points!=NULL ) GDrawDestroyWindow(dv->points); + else DVCreatePoints(dv); + } else if ( mi->mid==MID_Cvt ) { + if ( dv->cvt!=NULL ) GDrawDestroyWindow(dv->cvt); + else DVCreateCvt(dv); + } +} + +static GMenuItem popupwindowlist[] = { + { { (unichar_t *) _STR_Registers, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, DVMenuCreate, MID_Registers }, + { { (unichar_t *) _STR_Stack, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, DVMenuCreate, MID_Stack }, + { { (unichar_t *) _STR_Storage, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, DVMenuCreate, MID_Storage }, + { { (unichar_t *) _STR_Points, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, DVMenuCreate, MID_Points }, + { { (unichar_t *) _STR_Cvt, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, DVMenuCreate, MID_Cvt }, + { NULL } +}; + +static int DV_WindowMenu(GGadget *g, GEvent *e) { + DebugView *dv; + GEvent fake; + GRect pos; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonpress ) { + dv = GDrawGetUserData(GGadgetGetWindow(g)); + popupwindowlist[0].ti.checked = dv->regs!=NULL; + popupwindowlist[1].ti.checked = dv->stack!=NULL; + popupwindowlist[2].ti.checked = dv->storage!=NULL; + popupwindowlist[3].ti.checked = dv->points!=NULL; + GGadgetGetSize(g,&pos); + memset(&fake,0,sizeof(fake)); + fake.type = et_mousedown; + fake.w = dv->dv; + fake.u.mouse.x = pos.x; + fake.u.mouse.y = pos.y+pos.height; + GMenuCreatePopupMenu(dv->dv,&fake, popupwindowlist); + } +return( true ); +} + +static int DV_Exit(GGadget *g, GEvent *e) { + DebugView *dv; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + dv = GDrawGetUserData(GGadgetGetWindow(g)); + CVDebugFree(dv); + } +return( true ); +} + +static void DVExpose(GWindow pixmap, DebugView *dv,GEvent *event) { + GDrawSetLineWidth(pixmap,0); + GDrawDrawLine(pixmap, 0, dv->toph-1, dv->dwidth, dv->toph-1, 0x000000 ); +} + +int DVChar(DebugView *dv, GEvent *event) { + + if ( event->u.chr.state&(ksm_control|ksm_meta) || dv==NULL ) +return( false ); + /* Can't redo F1, handled by menu */ + if ( event->u.chr.keysym == GK_Help ) +return( false ); + if ( event->u.chr.keysym >= GK_F1 && event->u.chr.keysym<=GK_F10 ) +return( false ); + + switch ( event->u.chr.keysym ) { + case 's': case 'S': /* Step */ + DVGoFigure(dv,dgt_step); + break; + case 'n': case 'N': /* Next */ + DVGoFigure(dv,dgt_next); + break; + case 'f': case 'F': /* finish */ + DVGoFigure(dv,dgt_stepout); + break; + case 'c': case 'C': /* Continue */ + DVGoFigure(dv,dgt_continue); + break; + case 'k': case 'K': case 'q': case 'Q': /* Kill (debugger) */ + CVDebugFree(dv); + break; + case 'r': case 'R': /* run/restart (debugger) */ + CVDebugReInit(dv->cv,true,DebuggingFpgm(dv->dc)); + break; + } +return( true ); +} + +static int DV_HandleChar(struct instrinfo *ii, GEvent *event) { + DebugView *dv = (ii->userdata); +return( DVChar(dv,event)); +} + +static int dvreg_e_h(GWindow gw, GEvent *event) { + DebugView *dv = (DebugView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + DVRegExpose(gw,dv,event); + break; + case et_char: +return( DVChar(dv,event)); + break; + case et_close: + GDrawDestroyWindow(dv->regs); + break; + case et_destroy: + dv->regs = NULL; + break; + case et_mouseup: case et_mousedown: + case et_mousemove: + GGadgetEndPopup(); + break; + } +return( true ); +} + +static int dvstack_e_h(GWindow gw, GEvent *event) { + DebugView *dv = (DebugView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + DVStackExpose(gw,dv,event); + break; + case et_char: +return( DVChar(dv,event)); + break; +#if 0 + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + stack_scroll(dv,&event->u.control.u.sb); + break; + } + break; +#endif + case et_close: + GDrawDestroyWindow(dv->stack); + break; + case et_destroy: + dv->stack = NULL; + break; + case et_mouseup: case et_mousedown: + case et_mousemove: + GGadgetEndPopup(); + break; + } +return( true ); +} + +static int dvstore_e_h(GWindow gw, GEvent *event) { + DebugView *dv = (DebugView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + DVStorageExpose(gw,dv,event); + break; + case et_char: +return( DVChar(dv,event)); + break; +#if 0 + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + stack_scroll(dv,&event->u.control.u.sb); + break; + } + break; +#endif + case et_close: + GDrawDestroyWindow(dv->storage); + break; + case et_destroy: + dv->storage = NULL; + break; + case et_mouseup: case et_mousedown: + case et_mousemove: + GGadgetEndPopup(); + break; + } +return( true ); +} + +static int dvpointsv_e_h(GWindow gw, GEvent *event) { + DebugView *dv = (DebugView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + DVPointsVExpose(gw,dv,event); + break; + case et_char: +return( DVChar(dv,event)); + break; + case et_mouseup: case et_mousedown: + case et_mousemove: + GGadgetEndPopup(); + break; + } +return( true ); +} + +static int dvpoints_e_h(GWindow gw, GEvent *event) { + DebugView *dv = (DebugView *) GDrawGetUserData(gw); + GRect r; + + switch ( event->type ) { + case et_expose: + DVPointsExpose(gw,dv,event); + break; + case et_char: +return( DVChar(dv,event)); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_radiochanged: + GDrawRequestExpose(dv->points_v,NULL,false); + break; + } + break; + case et_resize: + GDrawGetSize(gw,&r); + GDrawResize(dv->points_v,r.width,r.height-dv->pts_head); + break; + case et_close: + GDrawDestroyWindow(dv->points); + break; + case et_destroy: + dv->points = NULL; + dv->points_v = NULL; + break; + case et_mouseup: case et_mousedown: + case et_mousemove: + GGadgetEndPopup(); + break; + } +return( true ); +} + +static void DVCvt_SetScrollBar(DebugView *dv) { + GRect size; + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + int lh = exc==NULL ? 0 : exc->cvtSize; + + GDrawGetSize(dv->cvt,&size); + GScrollBarSetBounds(dv->cvtsb,0,lh,size.height/dv->ii.fh); + if ( dv->cvt_offtop + size.height/dv->ii.fh > lh ) { + int lpos = lh-size.height/dv->ii.fh; + if ( lpos<0 ) lpos = 0; + dv->cvt_offtop = lpos; + } + GScrollBarSetPos(dv->cvtsb,dv->cvt_offtop); +} + + +static void dvcvt_scroll(DebugView *dv,struct sbevent *sb) { + int newpos = dv->cvt_offtop; + GRect size; + TT_ExecContext exc = DebuggerGetEContext(dv->dc); + + GDrawGetSize(dv->cvt,&size); + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= size.height/dv->ii.fh; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += size.height/dv->ii.fh; + break; + case et_sb_bottom: + newpos = exc->cvtSize-size.height/dv->ii.fh; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>exc->cvtSize-size.height/dv->ii.fh ) + newpos = exc->cvtSize-size.height/dv->ii.fh; + if ( newpos<0 ) newpos =0; + if ( newpos!=dv->cvt_offtop ) { + int diff = newpos-dv->cvt_offtop; + dv->cvt_offtop = newpos; + GScrollBarSetPos(dv->cvtsb,dv->cvt_offtop); + GDrawScroll(dv->cvt,NULL,0,diff*dv->ii.fh); + } +} + +static int dvcvt_e_h(GWindow gw, GEvent *event) { + DebugView *dv = (DebugView *) GDrawGetUserData(gw); + GRect r,g; + + switch ( event->type ) { + case et_expose: + DVCvtExpose(gw,dv,event); + break; + case et_char: +return( DVChar(dv,event)); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + dvcvt_scroll(dv,&event->u.control.u.sb); + break; + } + break; + case et_resize: + GDrawGetSize(gw,&r); + GGadgetGetSize(dv->cvtsb,&g); + GGadgetMove(dv->cvtsb,r.width-g.width,0); + GGadgetResize(dv->cvtsb,g.width,r.height); + DVCvt_SetScrollBar(dv); + GDrawRequestExpose(dv->cvt,NULL,false); + break; + case et_close: + GDrawDestroyWindow(dv->cvt); + break; + case et_destroy: + dv->cvt = NULL; + break; + case et_mouseup: case et_mousedown: + case et_mousemove: + GGadgetEndPopup(); + break; + } +return( true ); +} + +static void DVCreateRegs(DebugView *dv) { + GWindowAttrs wattrs; + GRect pos; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.window_title = GStringGetResource(_STR_TTRegisters,NULL); + pos.x = 664; pos.y = 1; + pos.width = 133; pos.height = 269; + dv->regs = GDrawCreateTopWindow(NULL,&pos,dvreg_e_h,dv,&wattrs); + GDrawSetVisible(dv->regs,true); +} + +static void DVCreateStack(DebugView *dv) { + GWindowAttrs wattrs; + GRect pos; + /*extern int _GScrollBar_Width;*/ + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.window_title = GStringGetResource(_STR_TTStack,NULL); + pos.x = 664; pos.y = 302; + pos.width = 133; pos.height = 269; + dv->stack = GDrawCreateTopWindow(NULL,&pos,dvstack_e_h,dv,&wattrs); + GDrawSetVisible(dv->stack,true); +} + +static void DVCreateStore(DebugView *dv) { + GWindowAttrs wattrs; + GRect pos; + /*extern int _GScrollBar_Width;*/ + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.window_title = GStringGetResource(_STR_TTStorage,NULL); + pos.x = 664; pos.y = 602; + pos.width = 133; pos.height = 100; + dv->storage = GDrawCreateTopWindow(NULL,&pos,dvstore_e_h,dv,&wattrs); + GDrawSetVisible(dv->storage,true); +} + +static void DVCreatePoints(DebugView *dv) { + GWindowAttrs wattrs; + GRect pos; + /*extern int _GScrollBar_Width;*/ + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.window_title = GStringGetResource(_STR_TTPoints,NULL); + pos.x = 664; pos.y = 732; + pos.width = GGadgetScale(GDrawPointsToPixels(NULL,125)); pos.height = 269; + dv->points = GDrawCreateTopWindow(NULL,&pos,dvpoints_e_h,dv,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + label[0].text = (unichar_t *) _STR_Twilight; + label[0].text_in_resource = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 3; + gcd[0].gd.flags = gg_visible | gg_enabled | (show_twilight ? gg_cb_on : 0 ); + gcd[0].gd.cid = CID_Twilight; + gcd[0].creator = GRadioCreate; + + label[1].text = (unichar_t *) _STR_Normal; + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 60; gcd[1].gd.pos.y = gcd[0].gd.pos.y; + gcd[1].gd.flags = gg_visible | gg_enabled | (!show_twilight ? gg_cb_on : 0 ); + gcd[1].gd.cid = CID_Normal; + gcd[1].creator = GRadioCreate; + + label[2].text = (unichar_t *) _STR_Current; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 5; gcd[2].gd.pos.y = gcd[0].gd.pos.y+16; + gcd[2].gd.flags = gg_visible | gg_enabled | gg_rad_startnew | (show_current ? gg_cb_on : 0 ); + gcd[2].gd.cid = CID_Current; + gcd[2].creator = GRadioCreate; + + label[3].text = (unichar_t *) _STR_Original; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = gcd[1].gd.pos.x; gcd[3].gd.pos.y = gcd[2].gd.pos.y; + gcd[3].gd.flags = gg_visible | gg_enabled | (!show_current ? gg_cb_on : 0 ); + gcd[3].gd.cid = CID_Original; + gcd[3].creator = GRadioCreate; + + label[4].text = (unichar_t *) _STR_GridUnit; + label[4].text_in_resource = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.pos.x = 5; gcd[4].gd.pos.y = gcd[2].gd.pos.y+16; + gcd[4].gd.flags = gg_visible | gg_enabled | gg_rad_startnew | (show_current ? gg_cb_on : 0 ); + gcd[4].gd.cid = CID_Grid; + gcd[4].creator = GRadioCreate; + + label[5].text = (unichar_t *) _STR_EmUnit; + label[5].text_in_resource = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.pos.x = gcd[1].gd.pos.x; gcd[5].gd.pos.y = gcd[4].gd.pos.y; + gcd[5].gd.flags = gg_visible | gg_enabled | (!show_current ? gg_cb_on : 0 ); + gcd[5].gd.cid = CID_EmUnit; + gcd[5].creator = GRadioCreate; + + GGadgetsCreate(dv->points,gcd); + + dv->pts_head = GDrawPointsToPixels(NULL,GGadgetScale(5+3*16+3)); + pos.x = 0; + pos.y = dv->pts_head; + pos.height -= dv->pts_head; + dv->points_v = GWidgetCreateSubWindow(dv->points,&pos,dvpointsv_e_h,dv,&wattrs); + GDrawSetVisible(dv->points_v,true); + GDrawSetVisible(dv->points,true); +} + +static void DVCreateCvt(DebugView *dv) { + GWindowAttrs wattrs; + GRect pos; + /*extern int _GScrollBar_Width;*/ + GGadgetData gd; + extern int _GScrollBar_Width; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.window_title = GStringGetResource(_STR_Cvt,NULL); + pos.x = 664; pos.y = 732; + pos.width = GGadgetScale(GDrawPointsToPixels(NULL,125)); pos.height = 169; + dv->cvt = GDrawCreateTopWindow(NULL,&pos,dvcvt_e_h,dv,&wattrs); + + memset(&gd,0,sizeof(gd)); + + gd.pos.y = 0; gd.pos.height = pos.height; + gd.pos.width = GDrawPointsToPixels(dv->cvt,_GScrollBar_Width); + gd.pos.x = pos.width-gd.pos.width; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + dv->cvtsb = GScrollBarCreate(dv->cvt,&gd,dv); + + DVCvt_SetScrollBar(dv); + + GDrawSetVisible(dv->cvt,true); +} + +static int dv_e_h(GWindow gw, GEvent *event) { + DebugView *dv = (DebugView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + DVExpose(gw,dv,event); + break; + case et_char: +return( DVChar(dv,event)); + break; + case et_charup: + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + instr_scroll(&dv->ii,&event->u.control.u.sb); + break; + } + break; + case et_resize: + if ( event->u.resize.sized ) + /*DVResize(dv,event)*/; + break; + case et_destroy: + dv->dv = NULL; + free(dv->id.bts); + break; + case et_mouseup: case et_mousedown: + GGadgetEndPopup(); + break; + case et_mousemove: + break; + } +return( true ); +} + +void CVDebugFree(DebugView *dv) { + if ( dv!=NULL ) { + CharView *cv = dv->cv; + SplineSet *ss; + SplinePoint *sp; + + cv->show_ft_results = false; + DebuggerTerminate(dv->dc); + cv->dv = NULL; + if ( dv->points!=NULL ) + GDrawDestroyWindow(dv->points); + if ( dv->cvt!=NULL ) + GDrawDestroyWindow(dv->cvt); + if ( dv->regs!=NULL ) + GDrawDestroyWindow(dv->regs); + if ( dv->stack!=NULL ) + GDrawDestroyWindow(dv->stack); + if ( dv->storage!=NULL ) + GDrawDestroyWindow(dv->storage); + if ( dv->cvt!=NULL ) + GDrawDestroyWindow(dv->cvt); + if ( dv->dv!=NULL ) { + GDrawDestroyWindow(dv->dv); + CVResize(cv); + GDrawRequestExpose(cv->v,NULL,false); + } + free(dv); + + for ( ss = dv->cv->sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sp->watched = false; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + GDrawRequestExpose(cv->v,NULL,false); + + if ( cv->coderange!=cr_none ) { + cv->coderange = cr_none; + CVInfoDraw(cv,cv->gw); + } + } +} + +void CVDebugReInit(CharView *cv,int restart_debug,int dbg_fpgm) { + DebugView *dv = cv->dv; + GWindowAttrs wattrs; + GRect pos; + TT_ExecContext exc; + FontRequest rq; + static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','u','n','i','f','o','n','t', '\0' }; + int as,ds,ld; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + extern int _GScrollBar_Width; + double scale; + + if ( restart_debug ) + scale = (cv->sc->parent->ascent+cv->sc->parent->descent)/(cv->ft_pointsize*cv->ft_dpi/72.0) / (1<<6); + if ( !restart_debug ) { + CVDebugFree(dv); + } else if ( dv==NULL ) { + int sbsize = GDrawPointsToPixels(cv->gw,_GScrollBar_Width); + cv->show_ft_results = false; + cv->dv = dv = gcalloc(1,sizeof(DebugView)); + dv->dwidth = 260; + dv->scale = scale; + dv->cv = cv; + dv->dc = DebuggerCreate(cv->sc,cv->ft_pointsize,cv->ft_dpi,dbg_fpgm); + if ( dv->dc==NULL ) { + free(dv); + cv->dv = NULL; +return; + } + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_bordwidth|wam_bordcol; + wattrs.event_masks = -1; + wattrs.border_width = 0; + wattrs.border_color = 0x000000; + wattrs.cursor = ct_mypointer; + pos.x = 0; pos.y = 0; + pos.width = dv->dwidth; pos.height = cv->height; + dv->dv = GWidgetCreateSubWindow(cv->gw,&pos,dv_e_h,dv,&wattrs); + GDrawSetVisible(dv->dv,true); + + dv->toph = 36; + memset(&gcd,0,sizeof(gcd)); + memset(&label,0,sizeof(label)); + gcd[0].gd.pos.y = dv->toph; gcd[0].gd.pos.height = pos.height-dv->toph; + gcd[0].gd.pos.width = GDrawPointsToPixels(cv->gw,_GScrollBar_Width); + gcd[0].gd.pos.x = pos.width-gcd[0].gd.pos.width; + gcd[0].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + gcd[0].creator = GScrollBarCreate; + + gcd[1].gd.pos.y = 2; gcd[1].gd.pos.x = 2; + gcd[1].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gcd[1].gd.cid = dgt_step; + gcd[1].gd.label = &label[1]; + label[1].image = &GIcon_stepinto; + gcd[1].gd.handle_controlevent = DV_Run; + gcd[1].gd.popup_msg = GStringGetResource(_STR_StepPopup,NULL); + gcd[1].creator = GButtonCreate; + + gcd[2].gd.pos.y = 2; gcd[2].gd.pos.x = 38; + gcd[2].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gcd[2].gd.cid = dgt_next; + gcd[2].gd.label = &label[2]; + label[2].image = &GIcon_stepover; + gcd[2].gd.handle_controlevent = DV_Run; + gcd[2].gd.popup_msg = GStringGetResource(_STR_NextPopup,NULL); + gcd[2].creator = GButtonCreate; + + gcd[3].gd.pos.y = 2; gcd[3].gd.pos.x = 74; + gcd[3].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gcd[3].gd.cid = dgt_stepout; + gcd[3].gd.label = &label[3]; + label[3].image = &GIcon_stepout; + gcd[3].gd.handle_controlevent = DV_Run; + gcd[3].gd.popup_msg = GStringGetResource(_STR_StepOutOfPopup,NULL); + gcd[3].creator = GButtonCreate; + + gcd[4].gd.pos.y = 2; gcd[4].gd.pos.x = 110; + gcd[4].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gcd[4].gd.cid = dgt_continue; + gcd[4].gd.label = &label[4]; + label[4].image = &GIcon_continue; + gcd[4].gd.handle_controlevent = DV_Run; + gcd[4].gd.popup_msg = GStringGetResource(_STR_ContinuePopup,NULL); + gcd[4].creator = GButtonCreate; + + gcd[5].gd.pos.y = 2; gcd[5].gd.pos.x = 146; + gcd[5].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + /*gcd[5].gd.cid = dgt_continue;*/ + gcd[5].gd.label = &label[5]; + label[5].image = &GIcon_watchpnt; + gcd[5].gd.handle_controlevent = DV_WatchPnt; + gcd[5].gd.popup_msg = GStringGetResource(_STR_WatchPointPopup,NULL); + gcd[5].creator = GButtonCreate; + + gcd[6].gd.pos.y = 2; gcd[6].gd.pos.x = 182; + gcd[6].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + /*gcd[6].gd.cid = dgt_continue;*/ + gcd[6].gd.label = &label[6]; + label[6].image = &GIcon_menudelta; + gcd[6].gd.handle_controlevent = DV_WindowMenu; + gcd[6].gd.popup_msg = GStringGetResource(_STR_Window,NULL); + gcd[6].creator = GButtonCreate; + + gcd[7].gd.pos.y = 2; gcd[7].gd.pos.x = 218; + gcd[7].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + /*gcd[7].gd.cid = dgt_continue;*/ + gcd[7].gd.label = &label[7]; + label[7].image = &GIcon_exit; + gcd[7].gd.handle_controlevent = DV_Exit; + gcd[7].gd.popup_msg = GStringGetResource(_STR_ExitDebugger,NULL); + gcd[7].creator = GButtonCreate; + + GGadgetsCreate(dv->dv,gcd); + + dv->ii.vsb = gcd[0].ret; + dv->ii.sbw = gcd[0].gd.pos.width; + dv->ii.vheight = gcd[0].gd.pos.height; dv->ii.vwidth = pos.width-sbsize; + dv->ii.showaddr = true; + dv->ii.userdata = dv; + dv->ii.selection_callback = DVToggleBp; + dv->ii.bpcheck = DVBpCheck; + dv->ii.handle_char = DV_HandleChar; + + pos.y = dv->toph; + pos.width -= sbsize; pos.height -= pos.y; + dv->ii.v = GWidgetCreateSubWindow(dv->dv,&pos,ii_v_e_h,&dv->ii,&wattrs); + dv->ii.instrdata = &dv->id; + + memset(&rq,0,sizeof(rq)); + rq.family_name = monospace; + rq.point_size = -12; + rq.weight = 400; + dv->ii.gfont = GDrawInstanciateFont(GDrawGetDisplayOfWindow(cv->gw),&rq); + GDrawSetFont(dv->ii.v,dv->ii.gfont); + GDrawFontMetrics(dv->ii.gfont,&as,&ds,&ld); + dv->ii.as = as+1; + dv->ii.fh = dv->ii.as+ds; + dv->ii.isel_pos = -1; + + if (( exc = DebuggerGetEContext(dv->dc))!=NULL ) + DVFigureNewState(dv,exc); + GDrawSetVisible(dv->ii.v,true); + GDrawSetVisible(dv->dv,true); + CVResize(cv); + GDrawRequestExpose(cv->v,NULL,false); + DVCreateRegs(dv); + DVCreateStack(dv); + } else { + dv->scale = scale; + DebuggerReset(dv->dc,cv->ft_pointsize,cv->ft_dpi,dbg_fpgm); + if (( exc = DebuggerGetEContext(dv->dc))!=NULL ) + DVFigureNewState(dv,exc); + } +} +#endif diff --git a/fontforge/cvexport.c b/fontforge/cvexport.c new file mode 100644 index 00000000..7ffd4633 --- /dev/null +++ b/fontforge/cvexport.c @@ -0,0 +1,977 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include "ustring.h" +#include "gfile.h" +#include "gio.h" +#include "gicons.h" +#include +#include + +int _ExportEPS(FILE *eps,SplineChar *sc) { + DBounds b; + time_t now; + struct tm *tm; + int ret; + char *oldloc; + const char *author = GetAuthor(); + + oldloc = setlocale(LC_NUMERIC,"C"); + + fprintf( eps, "%%!PS-Adobe-3.0 EPSF-3.0\n" ); + SplineCharFindBounds(sc,&b); + fprintf( eps, "%%%%BoundingBox: %g %g %g %g\n", b.minx, b.miny, b.maxx, b.maxy ); + fprintf( eps, "%%%%Pages: 0\n" ); + fprintf( eps, "%%%%Title: %s from %s\n", sc->name, sc->parent->fontname ); + fprintf( eps, "%%%%Creator: FontForge\n" ); + if ( author!=NULL ) + fprintf( eps, "%%%%Creator: %s\n", author); + time(&now); + tm = localtime(&now); + fprintf( eps, "%%%%CreationDate: %d:%02d %d-%d-%d\n", tm->tm_hour, tm->tm_min, + tm->tm_mday, tm->tm_mon+1, 1900+tm->tm_year ); + fprintf( eps, "%%%%EndComments\n" ); + fprintf( eps, "%%%%EndProlog\n" ); + fprintf( eps, "%%%%Page \"%s\" 1\n", sc->name ); + + fprintf( eps, "gsave newpath\n" ); + SC_PSDump((void (*)(int,void *)) fputc,eps,sc,true,false); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer ) + fprintf( eps, "grestore\n" ); + else +#endif + fprintf( eps, "fill grestore\n" ); + fprintf( eps, "%%%%EOF\n" ); + ret = !ferror(eps); + setlocale(LC_NUMERIC,oldloc); +return( ret ); +} + +static int ExportEPS(char *filename,SplineChar *sc) { + FILE *eps; + int ret; + + eps = fopen(filename,"w"); + if ( eps==NULL ) { +return(0); + } + ret = _ExportEPS(eps,sc); + fclose(eps); +return( ret ); +} + +int _ExportPDF(FILE *pdf,SplineChar *sc) { + DBounds b; + time_t now; + struct tm *tm; + int ret; + char *oldloc; + uint32 objlocs[8], xrefloc, streamstart, streamlength; + const char *author = GetAuthor(); + int i; + + oldloc = setlocale(LC_NUMERIC,"C"); + + fprintf( pdf, "%%PDF-1.4\n%%\201â\202\203\n" ); /* Header comment + binary comment */ + /* Every document contains a catalog which points to a page tree, which */ + /* in our case, points to a single page */ + objlocs[1] = ftell(pdf); + fprintf( pdf, "1 0 obj\n << /Type /Catalog\n /Pages 2 0 R\n /PageMode /UseNone\n >>\nendobj\n" ); + objlocs[2] = ftell(pdf); + fprintf( pdf, "2 0 obj\n << /Type /Pages\n /Kids [ 3 0 R ]\n /Count 1\n >>\nendobj\n" ); + /* And our single page points to its contents */ + objlocs[3] = ftell(pdf); + fprintf( pdf, "3 0 obj\n" ); + fprintf( pdf, " << /Type /Page\n" ); + fprintf( pdf, " /Parent [ 2 0 R ]\n" ); + fprintf( pdf, " /Resources << >>\n" ); + SplineCharFindBounds(sc,&b); + fprintf( pdf, " /MediaBox [%g %g %g %g]\n", b.minx, b.miny, b.maxx, b.maxy ); + fprintf( pdf, " /Contents 4 0 R\n" ); + fprintf( pdf, " >>\n" ); + fprintf( pdf, "endobj\n" ); + /* And the contents are the interesting stuff */ + objlocs[4] = ftell(pdf); + fprintf( pdf, "4 0 obj\n" ); + fprintf( pdf, " << /Length 5 0 R >> \n" ); + fprintf( pdf, " stream \n" ); + streamstart = ftell(pdf); + SC_PSDump((void (*)(int,void *)) fputc,pdf,sc,true,true); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( !sc->parent->multilayer ) +#endif + fprintf( pdf, "f\n" ); + streamlength = ftell(pdf)-streamstart; + fprintf( pdf, " endstream\n" ); + fprintf( pdf, "endobj\n" ); + objlocs[5] = ftell(pdf); + fprintf( pdf, "5 0 obj\n" ); + fprintf( pdf, " %d\n", streamlength ); + fprintf( pdf, "endobj\n" ); + + /* Optional Info dict */ + objlocs[6] = ftell(pdf); + fprintf( pdf, "6 0 obj\n" ); + fprintf( pdf, " <<\n" ); + fprintf( pdf, " /Creator (FontForge)\n" ); + time(&now); + tm = localtime(&now); + tzset(); + fprintf( pdf, " /CreationDate (D:%04d%02d%02d%02d%2d%02d", + 1900+tm->tm_year, tm->tm_mon+1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec ); + if ( timezone==0 ) + fprintf( pdf, "Z)\n" ); + else + fprintf( pdf, "%+02d')\n", (int) timezone/3600 ); /* doesn't handle half-hour zones */ + fprintf( pdf, " /Title (%s from %s)\n", sc->name, sc->parent->fontname ); + if ( author!=NULL ) + fprintf( pdf, " /Author (%s)\n", author ); + fprintf( pdf, " >>\n" ); + fprintf( pdf, "endobj\n" ); + + xrefloc = ftell(pdf); + fprintf( pdf, "xref\n" ); + fprintf( pdf, " 0 7\n" ); + fprintf( pdf, "0000000000 65535 f \n" ); + for ( i=1; i<7; ++i ) + fprintf( pdf, "%010d %05d n \n", objlocs[i], 0 ); + fprintf( pdf, "trailer\n" ); + fprintf( pdf, " <<\n" ); + fprintf( pdf, " /Size 7\n" ); + fprintf( pdf, " /Root 1 0 R\n" ); + fprintf( pdf, " /Info 6 0 R\n" ); + fprintf( pdf, " >>\n" ); + fprintf( pdf, "startxref\n" ); + fprintf( pdf, "%d\n",xrefloc ); + fprintf( pdf, "%%%%EOF\n" ); + + ret = !ferror(pdf); + setlocale(LC_NUMERIC,oldloc); +return( ret ); +} + +static int ExportPDF(char *filename,SplineChar *sc) { + FILE *eps; + int ret; + + eps = fopen(filename,"w"); + if ( eps==NULL ) { +return(0); + } + ret = _ExportPDF(eps,sc); + fclose(eps); +return( ret ); +} + +static int ExportSVG(char *filename,SplineChar *sc) { + FILE *svg; + int ret; + + svg = fopen(filename,"w"); + if ( svg==NULL ) { +return(0); + } + ret = _ExportSVG(svg,sc); + fclose(svg); +return( ret ); +} + +static void FigDumpPt(FILE *fig,BasePoint *me,real scale,real ascent) { + fprintf( fig, "%d %d ", (int) rint(me->x*scale), (int) rint(ascent-me->y*scale)); +} + +static void FigSplineSet(FILE *fig,SplineSet *spl,int spmax, int asc) { + SplinePoint *sp; + int cnt; + real scale = 7*1200.0/spmax; + real ascent = 11*1200*asc/spmax; + + while ( spl!=NULL ) { + /* type=3, SPline; sub_type=3, closed interpreted; linestyle=0(solid); thickness=1*/ + /* colors (pen,fill)=0, black; depth=0(stacking order); pen_style(unused)*/ + /* area_fill=-1 (no fill) style_val (0.0 no dashes), capstyle=0 (don't care) */ + /* forward arrow=0 (none) backarrow (none); point count */ + cnt=0; + sp = spl->first; + while ( 1 ) { + ++cnt; + if ( !sp->noprevcp && sp->prev!=NULL ) ++cnt; + if ( !sp->nonextcp && sp->next!=NULL ) ++cnt; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) { + /* Must end with the start point if it's closed */ + ++cnt; + } + fprintf( fig, "3 %d 0 1 0 0 0 0 -1 0.0 0 0 0 %d\n", + spl->first->prev==NULL?4:5, cnt ); + /* line of coordinates pairs */ + sp = spl->first; + putc('\t',fig); + while ( 1 ) { + if ( !sp->noprevcp && sp->prev!=NULL && sp!=spl->first ) + FigDumpPt(fig,&sp->prevcp,scale,ascent); + FigDumpPt(fig,&sp->me,scale,ascent); + if ( !sp->nonextcp && sp->next!=NULL ) + FigDumpPt(fig,&sp->nextcp,scale,ascent); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) { + /* Must end with the start point if it's closed */ + if ( !sp->noprevcp && sp->prev!=NULL ) + FigDumpPt(fig,&sp->prevcp,scale,ascent); + FigDumpPt(fig,&sp->me,scale,ascent); + } + /* line of "shape factors", 0=> corner */ + putc('\n',fig); + sp = spl->first; + putc('\t',fig); + while ( 1 ) { + if ( !sp->noprevcp && sp->prev!=NULL && sp!=spl->first ) + fprintf(fig,"1 "); + if (( sp->noprevcp && sp->nonextcp ) || sp->pointtype==pt_corner ) + fprintf(fig,"0 "); + else + fprintf(fig,"-1 "); + if ( !sp->nonextcp && sp->next!=NULL ) + fprintf(fig,"1 "); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( spl->first->prev!=NULL ) { + /* Must end with the start point if it's closed */ + if ( !sp->noprevcp && sp->prev!=NULL ) + fprintf(fig,"1 "); + if (( sp->noprevcp && sp->nonextcp ) || sp->pointtype==pt_corner ) + fprintf(fig,"0 "); + else + fprintf(fig,"-1 "); + } + putc('\n',fig); + spl=spl->next; + } +} + +static int ExportFig(char *filename,SplineChar *sc) { + FILE *fig; + RefChar *rf; + int ret; + int spmax = sc->parent->ascent+sc->parent->descent; + /* This is by no means perfect. but it is a reasonable approximation */ + + fig = fopen(filename,"w"); + if ( fig==NULL ) { +return(0); + } + + fprintf( fig, "#FIG 3.2\n" ); + fprintf( fig, "Portrait\n" ); + fprintf( fig, "Center\n" ); + fprintf( fig, "Inches\n" ); + fprintf( fig, "Letter\n" ); + fprintf( fig, "100.00\n" ); + fprintf( fig, "Single\n" ); + fprintf( fig, "-2\n" ); + fprintf( fig, "1200 2\n" ); + FigSplineSet(fig,sc->layers[ly_fore].splines,spmax,sc->parent->ascent); + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf=rf->next ) + FigSplineSet(fig,rf->layers[0].splines, spmax, sc->parent->ascent ); + ret = !ferror(fig); + fclose(fig); +return( ret ); +} + +static unichar_t def[] = { '1', '0', '0', '\0' }; +static unichar_t def_bits[] = { '1', '\0' }; +static unichar_t *last = NULL; +static unichar_t *last_bits = NULL; + +struct sizebits { + GWindow gw; + int *pixels, *bits; + unsigned int done: 1; + unsigned int good: 1; +}; + +#define CID_Size 1000 +#define CID_Bits 1001 + +static int SB_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct sizebits *d = GDrawGetUserData(GGadgetGetWindow(g)); + int err=0; + *d->pixels = GetIntR(d->gw,CID_Size,_STR_PixelSize,&err); + *d->bits = GetIntR(d->gw,CID_Bits,_STR_BitsPerPixel,&err); + if ( err ) +return( true ); + if ( *d->bits!=1 && *d->bits!=2 && *d->bits!=4 && *d->bits!=8 ) { + GWidgetErrorR(_STR_InvalidBits,_STR_InvalidBits); +return( true ); + } + free( last ); free( last_bits ); + last = GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Size)); + last_bits = GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Bits)); + d->done = true; + d->good = true; + } +return( true ); +} + +static int SB_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct sizebits *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + } +return( true ); +} + +static int sb_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct sizebits *d = GDrawGetUserData(gw); + d->done = true; + } +return( event->type!=et_char ); +} + +static int AskSizeBits(int *pixelsize,int *bitsperpixel) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + struct sizebits sb; + + memset(&sb,'\0',sizeof(sb)); + sb.pixels = pixelsize; sb.bits = bitsperpixel; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<changedsincelasthinted && !sc->manualhints ) + SplineCharAutoHint(sc,true); + + memset(&gi,'\0', sizeof(gi)); + memset(&base,'\0', sizeof(base)); + memset(&clut,'\0', sizeof(clut)); + gi.u.image = &base; + + if ( bitsperpixel==1 ) { + if ( (freetypecontext = FreeTypeFontContext(sc->parent,sc,NULL))==NULL ) + bdfc = SplineCharRasterize(sc,pixelsize); + else { + bdfc = SplineCharFreeTypeRasterize(freetypecontext,sc->enc,pixelsize,1); + FreeTypeFreeContext(freetypecontext); + } + BCRegularizeBitmap(bdfc); + /* Sigh. Bitmaps use a different defn of set than images do. make it consistant */ + tot = bdfc->bytes_per_line*(bdfc->ymax-bdfc->ymin+1); + for ( pt = bdfc->bitmap, end = pt+tot; ptbitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + base.trans = -1; + if ( format==0 ) + ret = GImageWriteXbm(&gi,filename); +#ifndef _NO_LIBPNG + else if ( format==2 ) + ret = GImageWritePng(&gi,filename,false); +#endif + else + ret = GImageWriteBmp(&gi,filename); + BDFCharFree(bdfc); + } else { + if ( (freetypecontext = FreeTypeFontContext(sc->parent,sc,NULL))==NULL ) + bdfc = SplineCharAntiAlias(sc,pixelsize,(1<<(bitsperpixel/2))); + else { + bdfc = SplineCharFreeTypeRasterize(freetypecontext,sc->enc,pixelsize,bitsperpixel); + FreeTypeFreeContext(freetypecontext); + } + BCRegularizeGreymap(bdfc); + base.image_type = it_index; + base.data = bdfc->bitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + base.clut = &clut; + base.trans = -1; + clut.clut_len = 1<byte_data ) { + BCRegularizeBitmap(bdfc); + /* Sigh. Bitmaps use a different defn of set than images do. make it consistant */ + tot = bdfc->bytes_per_line*(bdfc->ymax-bdfc->ymin+1); + for ( pt = bdfc->bitmap, end = pt+tot; ptbitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + base.trans = -1; + if ( format==0 ) + ret = GImageWriteXbm(&gi,filename); +#ifndef _NO_LIBPNG + else if ( format==2 ) + ret = GImageWritePng(&gi,filename,false); +#endif + else + ret = GImageWriteBmp(&gi,filename); + /* And back to normal */ + for ( pt = bdfc->bitmap, end = pt+tot; ptbitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + base.clut = &clut; + clut.clut_len = 1<depth; + clut.is_grey = true; + clut.trans_index = base.trans = -1; + scale = 255/((1<depth)-1); + scale = COLOR_CREATE(scale,scale,scale); + for ( i=0; i< 1<depth; ++i ) + clut.clut[(1<depth)-1 - i] = i*scale; +#ifndef _NO_LIBPNG + if ( format==2 ) + ret = GImageWritePng(&gi,filename,false); + else +#endif + ret = GImageWriteBmp(&gi,filename); + } +return( ret ); +} + +void ScriptExport(SplineFont *sf, BDFFont *bdf, int format, int enc) { + char *ext = format==0?"eps":format==1?"fig": + format==2?"svg":format==3?"pdf": + format==4?"xbm":format==5?"bmp":"png"; + char buffer[100]; + SplineChar *sc = sf->chars[enc]; + BDFChar *bc = bdf!=NULL ? bdf->chars[enc] : NULL; + int good=true; + + if ( sc==NULL ) +return; + + sprintf( buffer, "%.40s_%.40s.%s", sc->name, sc->parent->fontname, ext); + if ( format==0 ) + good = ExportEPS(buffer,sc); + else if ( format==1 ) + good = ExportFig(buffer,sc); + else if ( format==2 ) + good = ExportSVG(buffer,sc); + else if ( format==3 ) + good = ExportPDF(buffer,sc); + else if ( bc!=NULL ) + good = BCExportXBM(buffer,bc,format-3); + if ( !good ) + GWidgetErrorR(_STR_Savefailedtitle,_STR_Savefailedtitle); +} + +struct gfc_data { + int done; + int ret; + GGadget *gfc; + GGadget *format; + SplineChar *sc; + BDFChar *bc; +}; + + +static GTextInfo bcformats[] = { + { (unichar_t *) "X Bitmap", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "BMP", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, +#ifndef _NO_LIBPNG + { (unichar_t *) "png", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, +#endif + { NULL }}; + +static GTextInfo formats[] = { + { (unichar_t *) "EPS", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 1, 0, 1 }, + { (unichar_t *) "XFig", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "SVG", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PDF", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "X Bitmap", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "BMP", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, +#ifndef _NO_LIBPNG + { (unichar_t *) "png", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, +#endif + { NULL }}; +static int last_format = 0; + +static void DoExport(struct gfc_data *d,unichar_t *path) { + char *temp; + int format, good; + + temp = cu_copy(path); + last_format = format = GGadgetGetFirstListSelectedItem(d->format); + if ( d->bc ) + last_format += 4; + if ( d->bc!=NULL ) + good = BCExportXBM(temp,d->bc,format); + else if ( format==0 ) + good = ExportEPS(temp,d->sc); + else if ( format==1 ) + good = ExportFig(temp,d->sc); + else if ( format==2 ) + good = ExportSVG(temp,d->sc); + else if ( format==3 ) + good = ExportPDF(temp,d->sc); + else + good = ExportXBM(temp,d->sc,format-4); + if ( !good ) + GWidgetErrorR(_STR_Savefailedtitle,_STR_Savefailedtitle); + free(temp); + d->done = good; + d->ret = good; +} + +static void GFD_doesnt(GIOControl *gio) { + /* The filename the user chose doesn't exist, so everything is happy */ + struct gfc_data *d = gio->userdata; + DoExport(d,gio->path); + GFileChooserReplaceIO(d->gfc,NULL); +} + +static void GFD_exists(GIOControl *gio) { + /* The filename the user chose exists, ask user if s/he wants to overwrite */ + struct gfc_data *d = gio->userdata; + unichar_t buffer[200]; + const unichar_t *rcb[3]; unichar_t rcmn[2]; + + rcb[2]=NULL; + rcb[0] = GStringGetResource( _STR_Replace, &rcmn[0]); + rcb[1] = GStringGetResource( _STR_Cancel, &rcmn[1]); + + u_strcpy(buffer, GStringGetResource(_STR_Fileexistspre,NULL)); + u_strcat(buffer, u_GFileNameTail(gio->path)); + u_strcat(buffer, GStringGetResource(_STR_Fileexistspost,NULL)); + if ( GWidgetAsk(GStringGetResource(_STR_Fileexists,NULL),rcb,rcmn,0,1,buffer)==0 ) { + DoExport(d,gio->path); + } + GFileChooserReplaceIO(d->gfc,NULL); +} + +static int GFD_SaveOk(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + unichar_t *ret = GGadgetGetTitle(d->gfc); + + GIOfileExists(GFileChooserReplaceIO(d->gfc, + GIOCreate(ret,d,GFD_exists,GFD_doesnt))); + free(ret); + } +return( true ); +} + +static int GFD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + d->ret = false; + } +return( true ); +} + +static int GFD_Format(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + unichar_t *pt, *file, *f2; + int format = GGadgetGetFirstListSelectedItem(g); + file = GGadgetGetTitle(d->gfc); + f2 = galloc(sizeof(unichar_t) * (u_strlen(file)+5)); + u_strcpy(f2,file); + free(file); + pt = u_strrchr(f2,'.'); + if ( pt==NULL ) + pt = f2+u_strlen(f2); + if ( d->bc!=NULL ) + uc_strcpy(pt,format==0?".xbm":format==1?".bmp":".png"); + else + uc_strcpy(pt,format==0?".eps": + format==1?".fig": + format==2?".svg": + format==3?".pdf": + format==4?".xbm": + format==5?".bmp": + ".png"); + GGadgetSetTitle(d->gfc,f2); + free(f2); + } +return( true ); +} + +static void GFD_dircreated(GIOControl *gio) { + struct gfc_data *d = gio->userdata; + unichar_t *dir = u_copy(gio->path); + + GFileChooserReplaceIO(d->gfc,NULL); + GFileChooserSetDir(d->gfc,dir); + free(dir); +} + +static void GFD_dircreatefailed(GIOControl *gio) { + /* We couldn't create the directory */ + struct gfc_data *d = gio->userdata; + unichar_t buffer[500]; + + u_strcpy(buffer, GStringGetResource(_STR_Couldntcreatedir,NULL)); + uc_strcat(buffer,": "); + u_strcat(buffer, u_GFileNameTail(gio->path)); + uc_strcat(buffer, ".\n"); + if ( gio->error!=NULL ) { + u_strcat(buffer,gio->error); + uc_strcat(buffer, "\n"); + } + if ( gio->status[0]!='\0' ) + u_strcat(buffer,gio->status); + GWidgetPostNotice(GStringGetResource(_STR_Couldntcreatedir,NULL),buffer); + GFileChooserReplaceIO(d->gfc,NULL); +} + +static int GFD_NewDir(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + unichar_t *newdir; + newdir = GWidgetAskStringR(_STR_Createdir,NULL,_STR_Dirname); + if ( newdir==NULL ) +return( true ); + if ( !u_GFileIsAbsolute(newdir)) { + unichar_t *temp = u_GFileAppendFile(GFileChooserGetDir(d->gfc),newdir,false); + free(newdir); + newdir = temp; + } + GIOmkDir(GFileChooserReplaceIO(d->gfc, + GIOCreate(newdir,d,GFD_dircreated,GFD_dircreatefailed))); + free(newdir); + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct gfc_data *d = GDrawGetUserData(gw); + d->done = true; + d->ret = false; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type==et_map ) { + GDrawRaise(gw); + } else if ( event->type == et_mousemove || + (event->type==et_mousedown && event->u.mouse.button==3 )) { + struct gfc_data *d = GDrawGetUserData(gw); + GFileChooserPopupCheck(d->gfc,event); + } else if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + struct gfc_data *d = GDrawGetUserData(gw); +return( GGadgetDispatchEvent((GGadget *) (d->gfc),event)); + } +return( true ); +} + +static int _Export(SplineChar *sc,BDFChar *bc) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[7]; + struct gfc_data d; + GGadget *pulldown, *files, *tf; + char buffer[100]; unichar_t ubuf[100]; + char *ext; + int _format, i; + int bs = GIntGetResource(_NUM_Buttonsize), bsbigger, totwid; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<totwid; totwid = bsbigger?3*bs+4*12:totwid; + pos.width = GDrawPointsToPixels(NULL,totwid); + pos.height = GDrawPointsToPixels(NULL,255); + gw = GDrawCreateTopWindow(NULL,&pos,e_h,&d,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; gcd[0].gd.pos.width = totwid*100/GIntGetResource(_NUM_ScaleFactor)-24; gcd[0].gd.pos.height = 182; + gcd[0].gd.flags = gg_visible | gg_enabled; + gcd[0].creator = GFileChooserCreate; + + gcd[1].gd.pos.x = 12; gcd[1].gd.pos.y = 224-3; gcd[1].gd.pos.width = -1; gcd[1].gd.pos.height = 0; + gcd[1].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[1].text = (unichar_t *) _STR_Save; + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.handle_controlevent = GFD_SaveOk; + gcd[1].creator = GButtonCreate; + + gcd[2].gd.pos.x = (totwid-bs)*100/GIntGetResource(_NUM_ScaleFactor)/2; gcd[2].gd.pos.y = 224; gcd[2].gd.pos.width = -1; gcd[2].gd.pos.height = 0; + gcd[2].gd.flags = gg_visible | gg_enabled; + label[2].text = (unichar_t *) _STR_Filter; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.handle_controlevent = GFileChooserFilterEh; + gcd[2].creator = GButtonCreate; + + gcd[3].gd.pos.x = -gcd[1].gd.pos.x; gcd[3].gd.pos.y = 224; gcd[3].gd.pos.width = -1; gcd[3].gd.pos.height = 0; + gcd[3].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[3].text = (unichar_t *) _STR_Cancel; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.handle_controlevent = GFD_Cancel; + gcd[3].creator = GButtonCreate; + + gcd[4].gd.pos.x = gcd[3].gd.pos.x; gcd[4].gd.pos.y = 194; gcd[4].gd.pos.width = -1; gcd[4].gd.pos.height = 0; + gcd[4].gd.flags = gg_visible | gg_enabled; + label[4].text = (unichar_t *) _STR_New; + label[4].text_in_resource = true; + label[4].image = &_GIcon_dir; + label[4].image_precedes = false; + gcd[4].gd.label = &label[4]; + gcd[4].gd.handle_controlevent = GFD_NewDir; + gcd[4].creator = GButtonCreate; + + gcd[5].gd.pos.x = 12; gcd[5].gd.pos.y = 200; gcd[5].gd.pos.width = 0; gcd[5].gd.pos.height = 0; + gcd[5].gd.flags = gg_visible | gg_enabled; + label[5].text = (unichar_t *) _STR_Format; + label[5].text_in_resource = true; + gcd[5].gd.label = &label[5]; + gcd[5].creator = GLabelCreate; + + _format = last_format; + if ( bc!=NULL ) { + _format-=2; + if ( _format<0 || _format>2 ) _format = 0; + } + gcd[6].gd.pos.x = 55; gcd[6].gd.pos.y = 194; + gcd[6].gd.flags = gg_visible | gg_enabled ; + gcd[6].gd.u.list = bc!=NULL?bcformats:formats; + if ( bc!=NULL ) { + bcformats[0].disabled = bc->byte_data; + if ( _format==0 ) _format=1; + } + gcd[6].gd.label = &gcd[6].gd.u.list[_format]; + gcd[6].gd.u.list[0].selected = true; + gcd[6].gd.handle_controlevent = GFD_Format; + gcd[6].creator = GListButtonCreate; + for ( i=0; gcd[6].gd.u.list[i].text!=NULL; ++i ) + gcd[6].gd.u.list[i].selected =false; + gcd[6].gd.u.list[_format].selected = true; + + GGadgetsCreate(gw,gcd); + GGadgetSetUserData(gcd[2].ret,gcd[0].ret); + + GFileChooserConnectButtons(gcd[0].ret,gcd[1].ret,gcd[2].ret); + if ( bc!=NULL ) + ext = _format==0 ? "xbm" : _format==1 ? "bmp" : "png"; + else + ext = _format==0?"eps":_format==1?"fig":_format==2?"xbm":_format==3?"bmp":"png"; + sprintf( buffer, "%.40s_%.40s.%s", sc->name, sc->parent->fontname,ext); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(gcd[0].ret,ubuf); + GFileChooserGetChildren(gcd[0].ret,&pulldown,&files,&tf); + GWidgetIndicateFocusGadget(tf); + + memset(&d,'\0',sizeof(d)); + d.sc = sc; + d.bc = bc; + d.gfc = gcd[0].ret; + d.format = gcd[6].ret; + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !d.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); +return(d.ret); +} + +int CVExport(CharView *cv) { +return( _Export(cv->sc,NULL)); +} + +int BVExport(BitmapView *bv) { +return( _Export(bv->bc->sc,bv->bc)); +} diff --git a/fontforge/cvfreehand.c b/fontforge/cvfreehand.c new file mode 100644 index 00000000..338b9552 --- /dev/null +++ b/fontforge/cvfreehand.c @@ -0,0 +1,895 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include + +const int min_line_cnt = 10; /* line segments must be at least this many datapoints to be distinguished */ +const int min_line_len = 20; /* line segments must be at least this many pixels to be distinguished */ +const double line_wobble = 1.0; /* data must not stray more than this many pixels from the true line */ +const int extremum_locale = 7; /* for something to be an extremum in x it must be an extremum for at least this many y pixels. Or vice versa */ +const int extremum_cnt = 4; /* for something to be an extremum in x it must be an extremum for at least this data samples. Or for y */ + +enum extreme { e_none=0, e_xmin, e_xmax, e_xflat, e_ymin, e_ymax, e_yflat }; + +typedef struct tracedata { + /* First the data */ + int x,y; + BasePoint here; + uint32 time; + int32 pressure, xtilt, ytilt, separation; + + /* Then overhead */ + struct tracedata *next, *prev; + + unsigned int extremum: 3; + unsigned int use_as_pt: 1; + unsigned int online: 1; + unsigned int wasconstrained: 1; + unsigned int constrained_corner: 1; + uint16 num; +} TraceData; + +static void TraceDataFree(TraceData *td) { + TraceData *next; + + while ( td!=NULL ) { + next = td->next; + chunkfree(td,sizeof(TraceData)); + td = next; + } +} + +static void TraceDataFromEvent(CharView *cv, GEvent *event) { + TraceData *new; + int skiplast; + + if ( cv->freehand.head!=NULL && + cv->freehand.last->here.x==(event->u.mouse.x-cv->xoff)/cv->scale && + cv->freehand.last->here.y==(cv->height-event->u.mouse.y-cv->yoff)/cv->scale ) { + /* Has not moved */ + int constrained = (event->u.mouse.state&ksm_shift)?1:0; + if ( constrained != cv->freehand.last->wasconstrained ) + cv->freehand.last->constrained_corner = true; +return; + } + + /* I sometimes seem to get events out of order on the wacom */ + skiplast = false; + if ( cv->freehand.last!=NULL && cv->freehand.last->prev!=NULL ) { + int x = (event->u.mouse.x-cv->xoff)/cv->scale; + int y = (cv->height-event->u.mouse.y-cv->yoff)/cv->scale; + TraceData *bad = cv->freehand.last, *base = bad->prev; + + if ( ((bad->here.x < x-15 && bad->here.x < base->here.x-15) || + (bad->here.x > x+15 && bad->here.x > base->here.x+15)) && + ((bad->here.y < y-15 && bad->here.y < base->here.y-15) || + (bad->here.y > y+15 && bad->here.y > base->here.y+15)) ) + skiplast = true; + } + + if ( skiplast ) + new = cv->freehand.last; + else { + new = chunkalloc(sizeof(TraceData)); + + if ( cv->freehand.head==NULL ) + cv->freehand.head = cv->freehand.last = new; + else { + cv->freehand.last->next = new; + new->prev = cv->freehand.last; + cv->freehand.last = new; + } + } + + new->here.x = (event->u.mouse.x-cv->xoff)/cv->scale; + new->here.y = (cv->height-event->u.mouse.y-cv->yoff)/cv->scale; + new->time = event->u.mouse.time; + new->pressure = event->u.mouse.pressure; + new->xtilt = event->u.mouse.xtilt; + new->ytilt = event->u.mouse.ytilt; + new->wasconstrained = (event->u.mouse.state&ksm_shift)?1:0; +#if 0 + printf( "(%d,%d) (%g,%g) %d %d\n", event->u.mouse.x, event->u.mouse.y, + new->here.x, new->here.y, new->pressure, new->time ); + if ( new->prev!=NULL && new->timeprev->time ) + printf( "\tAh ha!\n" ); +#endif + if ( new->wasconstrained && + ( new->prev==NULL || !new->prev->wasconstrained)) + new->constrained_corner = true; + else if ( new->prev!=NULL && !new->wasconstrained && new->prev->wasconstrained ) + new->prev->constrained_corner = true; +} + +static int TraceGoodLine(TraceData *base,TraceData *end) { + /* Make sure that we don't stray more than line_wobble pixels */ + int dx, dy; + double diff; + TraceData *pt; + + if (( dx = end->x-base->x )<0 ) dx = -dx; + if (( dy = end->y-base->y )<0 ) dy = -dy; + + if ( dy>dx ) { + dx = end->x-base->x; dy = end->y-base->y; + for ( pt=base->next; pt!=end; pt=pt->next ) { + diff = (pt->y-base->y)*dx/(double) dy + base->x - pt->x; + if ( diff>line_wobble || diff<-line_wobble ) +return( false ); + } + } else { + dx = end->x-base->x; dy = end->y-base->y; + for ( pt=base->next; pt!=end; pt=pt->next ) { + diff = (pt->x-base->x)*dy/(double) dx + base->y - pt->y; + if ( diff>line_wobble || diff<-line_wobble ) +return( false ); + } + } +return( true ); +} + +static TraceData *TraceLineCheck(TraceData *base) { + /* Look for a line. To be a line it must be at least min_line_len pixels */ + /* long (or reach the end of data with no real bends) */ + /* and we can't have strayed more than line_wobble pixels from the center */ + /* of the line */ + TraceData *pt, *end, *last_good; + int cnt; + + if ( base->next==NULL || base->next->next==NULL || base->next->next->next==NULL || + base->wasconstrained ) +return( base ); + + for ( end=base->next, cnt=0; end->next!=NULL; end=end->next, ++cnt ) { + if ( (end->x-base->x)*(end->x-base->x) + (end->y-base->y)*(end->y-base->y)>= + min_line_len*min_line_len && + cnt>=min_line_cnt ) + break; + if ( end->wasconstrained ) +return( base ); + } + + last_good = NULL; + while ( TraceGoodLine(base,end) ) { + last_good = end; + if ( end->wasconstrained ) + break; + end = end->next; + if ( end==NULL ) + break; + } + if ( last_good==NULL ) +return( base ); /* No good line */ + base->use_as_pt = last_good->use_as_pt = true; + for ( pt = base; pt!=last_good; pt=pt->next ) + pt->online = true; + last_good->online = true; +return( last_good ); +} + +static enum extreme TraceIsExtremum(TraceData *base) { + TraceData *pt; + enum extreme type; + int i; + + if ( base->online || base->use_as_pt ) +return( e_none ); + + type = e_xflat; + for ( pt = base->next, i=0; pt!=NULL && type!=e_none; pt=pt->next, ++i ) { + if ( i>=extremum_cnt && ( pt->y-base->y > extremum_locale || pt->y-base->y < -extremum_locale )) + break; + if ( pt->x>base->x ) { + if ( type==e_xmax ) + type = e_none; + else + type = e_xmin; + } else if ( pt->xx ) { + if ( type==e_xmin ) + type = e_none; + else + type = e_xmax; + } + } + for ( pt = base->prev, i=0; pt!=NULL && type!=e_none; pt=pt->prev, ++i ) { + if ( i>=extremum_cnt && ( pt->y-base->y > extremum_locale || pt->y-base->y < -extremum_locale )) + break; + if ( pt->x>base->x ) { + if ( type==e_xmax ) + type = e_none; + else + type = e_xmin; + } else if ( pt->xx ) { + if ( type==e_xmin ) + type = e_none; + else + type = e_xmax; + } + } + if ( type!=e_none ) +return( type ); + + type = e_yflat; + for ( pt = base->next, i=0; pt!=NULL && type!=e_none; pt=pt->next, ++i ) { + if ( i>=extremum_cnt && ( pt->x-base->x > extremum_locale || pt->x-base->x < -extremum_locale )) + break; + if ( pt->y>base->y ) { + if ( type==e_ymax ) + type = e_none; + else + type = e_ymin; + } else if ( pt->yy ) { + if ( type==e_ymin ) + type = e_none; + else + type = e_ymax; + } + } + for ( pt = base->prev, i=0; pt!=NULL && type!=e_none; pt=pt->prev, ++i ) { + if ( i>=extremum_cnt && ( pt->x-base->x > extremum_locale || pt->x-base->x < -extremum_locale )) + break; + if ( pt->y>base->y ) { + if ( type==e_ymax ) + type = e_none; + else + type = e_ymin; + } else if ( pt->yy ) { + if ( type==e_ymin ) + type = e_none; + else + type = e_ymax; + } + } + +return( type ); +} + +static TraceData *TraceNextPoint(TraceData *pt) { + if ( pt==NULL ) +return( NULL ); + for ( pt=pt->next; pt!=NULL && !pt->use_as_pt ; pt=pt->next ); +return( pt ); +} + +static void TraceMassage(TraceData *head, TraceData *end) { + TraceData *pt, *npt, *last, *nnpt; + double nangle, pangle; + /* Look for corners that are too close together */ + /* Paired tangents that might better be a single curve */ + /* tangent corner tangent that might better be a single curve */ + + for ( pt=head ; pt!=NULL ; pt=npt ) { + npt = TraceNextPoint(pt); + forever { + nnpt = TraceNextPoint(npt); + if ( nnpt!=NULL && + ((pt->x==npt->x && npt->x==nnpt->x) || + (pt->y==npt->y && npt->y==nnpt->y)) && + (pt->next == npt || pt->next->online) ) { + /*npt->online = true;*/ + npt->use_as_pt = false; + } else if ( nnpt==NULL && npt!=NULL && (pt->x==npt->x || pt->y==npt->y) && + (pt->next == npt || pt->next->online) ) { + pt->use_as_pt = false; + } else + break; + npt = nnpt; + } + } + + /* Remove very short segments */ + if ( head && head->next ) { + for ( pt=head->next; pt!=NULL && pt->use_as_pt && !pt->constrained_corner; pt = pt->next ) + pt->use_as_pt = false; + for ( pt=head->next ; pt->next!=NULL ; pt=pt->next ) { + if ( pt->use_as_pt && pt->next->use_as_pt && !pt->constrained_corner ) + pt->use_as_pt = false; + } + } + for ( pt=head ; pt!=NULL ; pt=npt ) { + npt = pt; + forever { + npt = TraceNextPoint(pt); + if ( npt == NULL || npt->constrained_corner ) + break; + if ( (npt->x-pt->x)*(npt->x-pt->x) + (npt->y-pt->y)*(npt->y-pt->y)<4 ) + npt->use_as_pt = false; + else + break; + } + } + + last = NULL; + for ( pt=head ; pt!=NULL ; pt=pt->next ) { + if ( pt->use_as_pt && pt->next!=NULL && pt->next->online && !pt->next->wasconstrained && + pt->prev!=NULL && !pt->prev->online ) { + npt = TraceNextPoint(pt); + if ( npt==NULL ) + break; + if ( npt->wasconstrained ) + /* Leave it */; + else if ( npt->next!=NULL && !npt->next->online ) { + /* We've got two adjacent tangents */ + nnpt = TraceNextPoint(npt); + if ( last!=NULL && nnpt!=NULL ) { + int lencur = (npt->x-pt->x)*(npt->x-pt->x) + (npt->y-pt->y)*(npt->y-pt->y); + int lennext = (nnpt->x-npt->x)*(nnpt->x-npt->x) + (nnpt->y-npt->y)*(nnpt->y-npt->y); + int lenprev = (npt->x-pt->x)*(npt->x-pt->x) + (npt->y-pt->y)*(npt->y-pt->y); + if ( lencur<16*lennext || lencur<16*lenprev ) { + /* Probably better done as one point */ + int which = (pt->num+npt->num)/2; + forever { + pt->online = pt->use_as_pt = false; + if ( pt->num==which ) + pt->use_as_pt = true; + if ( pt==npt ) + break; + pt = pt->next; + } + } + } + } else if ( (nnpt = TraceNextPoint(npt))!=NULL && + nnpt->next && !nnpt->next->online ) { + /* We've got tangent corner tangent */ + pangle = atan2(npt->y-pt->y,npt->x-pt->x); + nangle = atan2(nnpt->y-npt->y,nnpt->x-npt->x); + if ( pangle<0 && nangle>0 && nangle-pangle>=3.1415926 ) + pangle += 2*3.1415926535897932; + else if ( pangle>0 && nangle<0 && pangle-nangle>=3.1415926 ) + nangle += 2*3.1415926535897932; + if ( nangle-pangle<1 && nangle-pangle>-1 ) { + forever { + pt->online = pt->use_as_pt = false; + if ( pt==nnpt ) + break; + pt = pt->next; + } + pt = npt; + pt->use_as_pt = true; + } + } + } + if ( pt->use_as_pt ) + last = pt; + } + head->use_as_pt = end->use_as_pt = true; +} + +static void MakeExtremum(SplinePoint *cur,enum extreme extremum) { + double len; + /* If we decided this point should be an exteme point, then make sure */ + /* the control points agree with that (ie. must be horizontal or vertical)*/ + + if ( cur->pointtype==pt_tangent ) +return; + if ( extremum>=e_ymin ) { + if ( cur->me.y!=cur->nextcp.y ) { + len = sqrt((cur->nextcp.y-cur->me.y)*(cur->nextcp.y-cur->me.y) + + (cur->nextcp.x-cur->me.x)*(cur->nextcp.x-cur->me.x) ); + cur->nextcp.y = cur->me.y; + if ( cur->me.x>cur->nextcp.x ) + cur->nextcp.x = cur->me.x-len; + else + cur->nextcp.x = cur->me.x+len; + } + if ( cur->me.y!=cur->prevcp.y ) { + len = sqrt((cur->prevcp.y-cur->me.y)*(cur->prevcp.y-cur->me.y) + + (cur->prevcp.x-cur->me.x)*(cur->prevcp.x-cur->me.x) ); + cur->prevcp.y = cur->me.y; + if ( cur->me.x>cur->prevcp.x ) + cur->prevcp.x = cur->me.x-len; + else + cur->prevcp.x = cur->me.x+len; + } + } else { + if ( cur->me.x!=cur->nextcp.x ) { + len = sqrt((cur->nextcp.x-cur->me.x)*(cur->nextcp.x-cur->me.x) + + (cur->nextcp.y-cur->me.y)*(cur->nextcp.y-cur->me.y) ); + cur->nextcp.x = cur->me.x; + if ( cur->me.y>cur->nextcp.y ) + cur->nextcp.y = cur->me.y-len; + else + cur->nextcp.y = cur->me.y+len; + } + if ( cur->me.x!=cur->prevcp.x ) { + len = sqrt((cur->prevcp.x-cur->me.x)*(cur->prevcp.x-cur->me.x) + + (cur->prevcp.y-cur->me.y)*(cur->prevcp.y-cur->me.y) ); + cur->prevcp.x = cur->me.x; + if ( cur->me.y>cur->prevcp.y ) + cur->prevcp.y = cur->me.y-len; + else + cur->prevcp.y = cur->me.y+len; + } + } +} + +static double Trace_Factor(void *_cv,Spline *spline, real t) { + CharView *cv = (CharView *) _cv; + TraceData *head = cv->freehand.head, *pt, *from=NULL, *to=NULL; + int fromnum = spline->from->ptindex, tonum = spline->to->ptindex; + StrokeInfo *si = CVFreeHandInfo(); + int p; + + if ( si->radius<=0 || si->pressure1==si->pressure2 ) +return( 1.0 ); + + for ( pt = head; pt!=NULL; pt=pt->next ) { + if ( fromnum == pt->num ) { + from = pt; + if ( to!=NULL ) + break; + } + if ( tonum == pt->num ) { + to = pt; + if ( from!=NULL ) + break; + } + } + if ( from==NULL || to==NULL ) { + fprintf( stderr, "Not found\n" ); +return( 1.0 ); + } + p = from->pressure*t + to->pressure*(1-t); + + if ( p<=si->pressure1 && p<=si->pressure2 ) { + if ( si->pressure1pressure2 ) +return( 1.0 ); + else +return( si->radius2/si->radius ); + } else if ( p>=si->pressure1 && p>=si->pressure2 ) { + if ( si->pressure1pressure2 ) +return( si->radius2/si->radius ); + else +return( 1.0 ); + } else +return( ((p-si->pressure1)*si->radius2 + (si->pressure2-p)*si->radius)/ + (si->radius*(si->pressure2-si->pressure1)) ); +} + +static SplineSet *TraceCurve(CharView *cv) { + TraceData *head = cv->freehand.head, *pt, *base, *e; + SplineSet *spl; + SplinePoint *last, *cur; + int cnt, i, tot; + TPoint *mids; + double len,sofar; + StrokeInfo *si; + int order2 = cv->sc->parent->order2; + + /* First we look for straight lines in the data. We will put SplinePoints */ + /* at their endpoints */ + /* Then we find places that are local extrema, or just flat in x,y */ + /* SplinePoints here too. */ + /* Then approximate splines between */ + + cnt = 0; + for ( pt=head; pt!=NULL; pt = pt->next ) { + pt->extremum = e_none; + pt->online = pt->wasconstrained; + pt->use_as_pt = pt->constrained_corner; + /* We recalculate x,y because we might have autoscrolled the window */ + pt->x = cv->xoff + rint(pt->here.x*cv->scale); + pt->y = -cv->yoff + cv->height - rint(pt->here.y*cv->scale); + pt->num = cnt++; + } + head->use_as_pt = cv->freehand.last->use_as_pt = true; + + /* Look for lines */ + for ( pt=head->next ; pt!=NULL; pt=pt->next ) + pt = TraceLineCheck(pt); + + /* Look for extremum */ + for ( pt=head->next ; pt!=NULL; pt=pt->next ) + pt->extremum = TraceIsExtremum(pt); + /* Find the middle of a range of extremum points, that'll be the one we want */ + for ( base=head->next; base!=NULL; base = base->next ) { + if ( base->extremum>=e_xmin ) { + tot = 0; + if ( base->extremum>=e_ymin ) { + for ( pt=base->next ; pt->extremum>=e_ymin ; pt = pt->next ) ++tot; + } else { + for ( pt=base->next ; pt->extremum>=e_xmin && pt->extremumnext ) ++tot; + } + tot /= 2; + e = pt; + for ( pt=base->next, i=0 ; inext, ++i ); + pt->use_as_pt = true; + base = e; + } + } + + TraceMassage(head,cv->freehand.last); + + /* Calculate the mids array */ + mids = galloc(cnt*sizeof(TPoint)); + for ( base=head; base!=NULL && base->next!=NULL; base = pt ) { + mids[base->num].x = base->here.x; + mids[base->num].y = base->here.y; + mids[base->num].t = 0; + len = 0; + if ( base->next->online ) { + pt = base->next; /* Don't bother to calculate the length, we won't use the data */ + continue; + } + for ( pt=base->next; ; pt=pt->next ) { + len += sqrt((double) ( + (pt->x-pt->prev->x)*(pt->x-pt->prev->x) + + (pt->y-pt->prev->y)*(pt->y-pt->prev->y) )); + if ( pt->use_as_pt ) + break; + } + sofar = 0; + for ( pt=base->next; ; pt=pt->next ) { + sofar += sqrt((double) ( + (pt->x-pt->prev->x)*(pt->x-pt->prev->x) + + (pt->y-pt->prev->y)*(pt->y-pt->prev->y) )); + mids[pt->num].x = pt->here.x; + mids[pt->num].y = pt->here.y; + mids[pt->num].t = sofar/len; + if ( pt->use_as_pt ) + break; + } + } + + /* Splice things together */ + spl = chunkalloc(sizeof(SplineSet)); + spl->first = last = SplinePointCreate(head->here.x,head->here.y); + last->ptindex = 0; + + for ( base=head; base!=NULL && base->next!=NULL; base = pt ) { + for ( pt=base->next; !pt->use_as_pt ; pt=pt->next ); + cur = SplinePointCreate(pt->here.x,pt->here.y); + cur->ptindex = pt->num; + if ( base->next->online || base->next==pt ) + SplineMake(last,cur,order2); + else + ApproximateSplineFromPoints(last,cur,mids+base->num+1,pt->num-base->num-1,order2); + last = cur; + } + spl->last = last; + + /* Now we've got a rough approximation to the contour, but the joins are */ + /* probably not smooth. Clean things up a bit... */ + if ( spl->first->nonextcp ) + spl->first->pointtype = pt_corner; + else + spl->first->pointtype = pt_curve; + if ( spl->last->noprevcp ) + spl->last->pointtype = pt_corner; + else + spl->last->pointtype = pt_curve; + if ( spl->first->next!=NULL ) { + pt = head; + for ( cur=spl->first->next->to; cur->next!=NULL ; cur = cur->next->to ) { + if ( cur->nonextcp && cur->noprevcp ) + cur->pointtype = pt_corner; + else { + if ( !cur->nonextcp && !cur->noprevcp ) + cur->pointtype = pt_curve; + else + cur->pointtype = pt_tangent; + SPWeightedAverageCps(cur); + while ( pt!=NULL && pt->numptindex ) pt=pt->next; + if ( pt!=NULL && pt->extremum!=e_none ) + MakeExtremum(cur,pt->extremum); + if ( !cur->noprevcp ) + ApproximateSplineFromPointsSlopes(cur->prev->from,cur, + mids+cur->prev->from->ptindex+1, + cur->ptindex-cur->prev->from->ptindex-1,order2); + } + } + if ( !cur->nonextcp ) + ApproximateSplineFromPointsSlopes(cur,cur->next->to, + mids+cur->ptindex+1, + cur->next->to->ptindex-cur->ptindex-1,order2); + } + + free(mids); + + si = CVFreeHandInfo(); + if ( si->stroke_type!=si_centerline ) { + si->factor = ( si->pressure1==si->pressure2 ) ? NULL : Trace_Factor; + si->data = cv; + spl->next = SplineSetStroke(spl,si,cv->sc); + } +return( spl ); +} + +static void TraceDataClose(CharView *cv,GEvent *event) { + TraceData *new; + SplineSet *trace; + double langle, hangle, llen, hlen; + double dx,dy; + BasePoint oldp, oldn; + + if ( cv->freehand.head==NULL ) +return; /* Eh? No points? How did that happen? */ + if ( cv->freehand.head->here.x!=cv->freehand.last->here.x || + cv->freehand.head->here.y!=cv->freehand.last->here.y ) { + new = chunkalloc(sizeof(TraceData)); + *new = *cv->freehand.head; + new->time = event->u.mouse.time; +#if 0 /* nope. Have to bring it completely back to start values */ + new->pressure = (new->pressure + event->u.mouse.pressure)/2; + new->xtilt = (new->xtilt + event->u.mouse.xtilt)/2; + new->ytilt = (new->xtilt + event->u.mouse.ytilt)/2; +#endif + new->wasconstrained = (event->u.mouse.state&ksm_shift)?1:0; + + new->prev = cv->freehand.last; + new->next = NULL; + cv->freehand.last->next = new; + cv->freehand.last = new; + SplinePointListsFree(cv->freehand.current_trace); + cv->freehand.current_trace = TraceCurve(cv); + } else if ( cv->freehand.head == cv->freehand.last ) +return; /* Only one point, no good way to close it */ + + /* Now the first and last points are at the same location. We need to: */ + /* average their control points (so that they form a smooth curve) */ + /* merge the two SplinePoints into one */ + + trace = cv->freehand.current_trace; + trace->first->prevcp = trace->last->prevcp; + trace->first->noprevcp = trace->last->noprevcp; + trace->first->prevcpdef = trace->last->prevcpdef; + trace->first->prev = trace->last->prev; + trace->first->prev->to = trace->first; + SplinePointFree(trace->last); + trace->last = trace->first; + + if ( cv->freehand.head->wasconstrained || cv->freehand.last->wasconstrained ) +return; + + trace->first->pointtype = pt_curve; + + if ( trace->first->nonextcp && trace->first->noprevcp ) { + SplineCharDefaultPrevCP(trace->first); + SplineCharDefaultNextCP(trace->first); +return; + } + + dx = trace->first->nextcp.x-trace->first->me.x; + dy = trace->first->nextcp.y-trace->first->me.y; + hlen = sqrt(dx*dx+dy*dy); + hangle = atan2(dy,dx); + oldn = trace->first->nextcp; + dx = trace->first->me.x-trace->first->prevcp.x; + dy = trace->first->me.y-trace->first->prevcp.y; + llen = sqrt(dx*dx+dy*dy); + langle = atan2(dy,dx); + oldp = trace->first->prevcp; + + if ( trace->first->nonextcp ) { + SplineCharDefaultPrevCP(trace->first); + dx = trace->first->me.x-trace->first->prevcp.x; + dy = trace->first->me.y-trace->first->prevcp.y; + llen = sqrt(dx*dx+dy*dy); + trace->first->prevcp.x = trace->first->me.x - + cos(hangle)*llen; + trace->first->prevcp.y = trace->first->me.y - + sin(hangle)*llen; + trace->first->nextcp = oldn; + } else if ( trace->first->nonextcp ) { + SplineCharDefaultPrevCP(trace->first); + dx = trace->first->me.x-trace->first->nextcp.x; + dy = trace->first->me.y-trace->first->nextcp.y; + hlen = sqrt(dx*dx+dy*dy); + trace->first->nextcp.x = trace->first->me.x + + cos(langle)*hlen; + trace->first->nextcp.y = trace->first->me.y + + sin(langle)*hlen; + trace->first->prevcp = oldp; + } else { + if ( hangle>3.1415926535897932/2 && langle<-3.1415926535897932/2 ) + langle += 2*3.1415926535897932; + if ( hangle<-3.1415926535897932/2 && langle>3.1415926535897932/2 ) + hangle += 2*3.1415926535897932; + hangle = (hangle+langle)/2; + dx = cos(hangle); + dy = sin(hangle); + trace->first->prevcp.x = trace->first->me.x - dx*llen; + trace->first->prevcp.y = trace->first->me.y - dy*llen; + trace->first->nextcp.x = trace->first->me.x + dx*hlen; + trace->first->nextcp.y = trace->first->me.y + dy*hlen; + } + SplineRefigure(trace->first->next); + SplineRefigure(trace->first->prev); +} + +struct statistics { + double xmean, ymean, xsd, ysd; + int cnt; +}; + +static void TraceStatistics(TraceData *mid,struct statistics *stats) { + int i, cnt; + TraceData *test; + double x, x2, y, y2; + + x = x2 = y = y2 = 0; + cnt = 0; + + for ( test=mid->prev, i=0; test!=NULL && i<5; test=test->prev, ++i ) { + x += test->here.x; + x2 += test->here.x*test->here.x; + y += test->here.y; + y2 += test->here.y*test->here.y; + ++cnt; + } + for ( test=mid->next, i=0; test!=NULL && i<5; test=test->next, ++i ) { + x += test->here.x; + x2 += test->here.x*test->here.x; + y += test->here.y; + y2 += test->here.y*test->here.y; + ++cnt; + } + stats->cnt = cnt; + if ( cnt==0 || cnt==1 ) { + stats->xmean = mid->here.x; + stats->ymean = mid->here.y; + stats->xsd = stats->ysd = 1; + } else { + stats->xmean = x/cnt; + stats->ymean = y/cnt; + stats->xsd = sqrt(x2-x*x/cnt)/(cnt-1); + stats->ysd = sqrt(x2-x*x/cnt)/(cnt-1); + } +} + +static void TraceDataCleanup(CharView *cv) { + TraceData *mid, *next, *prev; + struct statistics stats; + + for ( mid = cv->freehand.head; mid!=NULL; mid=next ) { + next = mid->next; + TraceStatistics(mid,&stats); + if (( mid->here.x < stats.xmean-3*stats.xsd || + mid->here.x > stats.xmean+3*stats.xsd || + mid->here.y < stats.ymean-3*stats.ysd || + mid->here.y > stats.ymean+3*stats.ysd ) && + next!=NULL && mid->prev!=NULL ) { + prev = mid->prev; + prev->next = next; + next->prev = prev; + chunkfree(mid,sizeof(TraceData)); + } + } +} + +void CVMouseDownFreeHand(CharView *cv, GEvent *event) { + if ( cv->sc->parent->order2 ) +return; + + TraceDataFree(cv->freehand.head); + cv->freehand.head = cv->freehand.last = NULL; + cv->freehand.current_trace = NULL; + TraceDataFromEvent(cv,event); + + cv->freehand.current_trace = chunkalloc(sizeof(SplinePointList)); + cv->freehand.current_trace->first = cv->freehand.current_trace->last = + SplinePointCreate(cv->freehand.head->here.x,cv->freehand.head->here.y); +} + +void CVMouseMoveFreeHand(CharView *cv, GEvent *event) { + double dx, dy; + SplinePoint *last; + BasePoint *here; + + if ( cv->sc->parent->order2 ) +return; + + TraceDataFromEvent(cv,event); + /* I used to do the full processing here to get an path. But that took */ + /* too long to process them and we appeared to get events out of order */ + /* from the wacom tablet */ + last = cv->freehand.current_trace->last; + here = &cv->freehand.last->here; + if ( (dx=here->x-last->me.x)<0 ) dx = -dx; + if ( (dy=here->y-last->me.y)<0 ) dy = -dy; + if ( (dx+dy)*cv->scale > 4 ) { + SplineMake3(last,SplinePointCreate(here->x,here->y)); + cv->freehand.current_trace->last = last->next->to; + GDrawRequestExpose(cv->v,NULL,false); + } +} + +void CVMouseUpFreeHand(CharView *cv, GEvent *event) { + + if ( cv->sc->parent->order2 ) +return; + + TraceDataCleanup(cv); + + if ( event->u.chr.state&ksm_meta ) + TraceDataClose(cv,event); + else { + SplinePointListsFree(cv->freehand.current_trace); + cv->freehand.current_trace = TraceCurve(cv); + } + if ( cv->freehand.current_trace!=NULL ) { +#if 0 + SplinePointListSimplify(cv->sc,cv->freehand.current_trace, + sf_ignoreextremum,.75/cv->scale,0); + SplineCharAddExtrema(cv->freehand.current_trace,false); + SplinePointListSimplify(cv->sc,cv->freehand.current_trace, + sf_normal,.75/cv->scale,0); +#endif + CVPreserveState(cv); + if ( CVFreeHandInfo()->stroke_type==si_centerline ) { + cv->freehand.current_trace->next = cv->layerheads[cv->drawmode]->splines; + cv->layerheads[cv->drawmode]->splines = cv->freehand.current_trace; + } else { + SplineSet *ss = cv->freehand.current_trace; + while ( ss->next!=NULL ) + ss = ss->next; + ss->next = cv->layerheads[cv->drawmode]->splines; +#if 0 /* This branch is correct */ + cv->layerheads[cv->drawmode]->splines = cv->freehand.current_trace->next; + cv->freehand.current_trace->next = NULL; + SplinePointListFree(cv->freehand.current_trace); +#else /* Debug!!!! */ + cv->layerheads[cv->drawmode]->splines = cv->freehand.current_trace; +#endif + } + cv->freehand.current_trace = NULL; + } + TraceDataFree(cv->freehand.head); + cv->freehand.head = cv->freehand.last = NULL; + CVCharChangedUpdate(cv); + fflush( stdout ); +} + +#if 0 +void RepeatFromFile(CharView *cv) { + FILE *foo = fopen("mousemove","r"); + /*char buffer[100];*/ + GEvent e; + int x,y,p; + + if ( foo==NULL ) +return; + + memset(&e,0,sizeof(e)); + + e.w = cv->v; + e.type = et_mousedown; + fscanf(foo,"(%d,%d) (%*g,%*g) %d\n", &x, &y, &p); + e.u.mouse.x = x; e.u.mouse.y = y; e.u.mouse.pressure = p; + CVMouseDownFreeHand(cv,&e); + + e.type = et_mousemove; + while ( fscanf(foo,"(%d,%d) (%*g,%*g) %d\n", &x, &y, &p)==3 ) { + e.u.mouse.x = x; e.u.mouse.y = y; e.u.mouse.pressure = p; + CVMouseMoveFreeHand(cv,&e); + } + + e.type = et_mouseup; + CVMouseUpFreeHand(cv,&e); + fclose(foo); +} +#endif diff --git a/fontforge/cvgetinfo.c b/fontforge/cvgetinfo.c new file mode 100644 index 00000000..1fb4018c --- /dev/null +++ b/fontforge/cvgetinfo.c @@ -0,0 +1,2345 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include + +#define RAD2DEG (180/3.1415926535897932) +#define TCnt 3 + +typedef struct gidata { + CharView *cv; + SplineChar *sc; + RefChar *rf; + ImageList *img; + AnchorPoint *ap; + SplinePoint *cursp; + SplinePointList *curspl; + SplinePointList *oldstate; + AnchorPoint *oldaps; + GWindow gw; + int done, first, changed; + int prevchanged, nextchanged; +} GIData; + +#define CID_BaseX 2001 +#define CID_BaseY 2002 +#define CID_NextXOff 2003 +#define CID_NextYOff 2004 +#define CID_NextPos 2005 +#define CID_PrevXOff 2006 +#define CID_PrevYOff 2007 +#define CID_PrevPos 2008 +#define CID_NextDef 2009 +#define CID_PrevDef 2010 +#define CID_Curve 2011 +#define CID_Corner 2012 +#define CID_Tangent 2013 +#define CID_NextR 2014 +#define CID_NextTheta 2015 +#define CID_PrevR 2016 +#define CID_PrevTheta 2017 +#define CID_HintMask 2020 +#define CID_ActiveHints 2030 +#define CID_TabSet 2100 + +#define CID_X 3001 +#define CID_Y 3002 +#define CID_NameList 3003 +#define CID_Mark 3004 +#define CID_BaseChar 3005 +#define CID_BaseLig 3006 +#define CID_BaseMark 3007 +#define CID_CursEntry 3008 +#define CID_CursExit 3009 +#define CID_LigIndex 3010 +#define CID_Next 3011 +#define CID_Prev 3012 +#define CID_Delete 3013 +#define CID_New 3014 + +#define RI_Width 215 +#define RI_Height 180 + +#define II_Width 130 +#define II_Height 70 + +#define PI_Width 228 +#define PI_Height 308 + +#define AI_Width 160 +#define AI_Height 234 + +static int GI_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + ci->done = true; + } +return( true ); +} + +static int GI_TransChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + ci->changed = true; + } +return( true ); +} + +static int GI_ROK_Do(GIData *ci) { + int errs=false,i; + real trans[6]; + SplinePointList *spl, *new; + RefChar *ref = ci->rf, *subref; + + for ( i=0; i<6; ++i ) { + trans[i] = GetRealR(ci->gw,1000+i,_STR_TransformationMatrix,&errs); + if ( !errs && + ((i<4 && (trans[i]>30 || trans[i]<-30)) || + (i>=4 && (trans[i]>16000 || trans[i]<-16000))) ) { + /* Don't want the user to insert an enormous scale factor or */ + /* it will move points outside the legal range. */ + GTextFieldSelect(GWidgetGetControl(ci->gw,1000+i),0,-1); + GWidgetErrorR(_STR_OutOfRange,_STR_OutOfRange); + errs = true; + } + if ( errs ) +return( false ); + } + + for ( i=0; i<6 && ref->transform[i]==trans[i]; ++i ); + if ( i==6 ) /* Didn't really change */ +return( true ); + + for ( i=0; i<6; ++i ) + ref->transform[i] = trans[i]; + SplinePointListFree(ref->layers[0].splines); + ref->layers[0].splines = SplinePointListTransform(SplinePointListCopy(ref->sc->layers[ly_fore].splines),trans,true); + spl = NULL; + if ( ref->layers[0].splines!=NULL ) + for ( spl = ref->layers[0].splines; spl->next!=NULL; spl = spl->next ); + for ( subref = ref->sc->layers[ly_fore].refs; subref!=NULL; subref=subref->next ) { + new = SplinePointListTransform(SplinePointListCopy(subref->layers[0].splines),trans,true); + if ( spl==NULL ) + ref->layers[0].splines = new; + else + spl->next = new; + if ( new!=NULL ) + for ( spl = new; spl->next!=NULL; spl = spl->next ); + } + + SplineSetFindBounds(ref->layers[0].splines,&ref->bb); + CVCharChangedUpdate(ci->cv); +return( true ); +} + +static int GI_ROK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GI_ROK_Do(ci)) + ci->done = true; + } +return( true ); +} + +static int GI_Show(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + if ( ci->changed ) { + static int buts[] = { _STR_Change, _STR_Retain, _STR_Cancel, 0 }; + int ans = GWidgetAskR(_STR_TransformChanged,buts,0,2,_STR_TransformChangedApply); + if ( ans==2 ) +return( true ); + else if ( ans==0 ) { + if ( !GI_ROK_Do(ci)) +return( true ); + } + } + ci->done = true; + CharViewCreate(ci->rf->sc,ci->cv->fv); + } +return( true ); +} + +static int gi_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + GIData *ci = GDrawGetUserData(gw); + ci->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("getinfo.html"); +return( true ); + } +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +static void RefGetInfo(CharView *cv, RefChar *ref) { + static GIData gi; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[16]; + GTextInfo label[16]; + char namebuf[100], tbuf[6][40]; + char ubuf[40]; + int i,j; + + gi.cv = cv; + gi.sc = cv->sc; + gi.rf = ref; + gi.changed = false; + gi.done = false; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<sc->unicodeenc!=-1?RI_Height+12:RI_Height); + gi.gw = GDrawCreateTopWindow(NULL,&pos,gi_e_h,&gi,&wattrs); + + memset(&gcd,0,sizeof(gcd)); + memset(&label,0,sizeof(label)); + + sprintf( namebuf, "Reference to character %.20s at %d", ref->sc->name, ref->sc->enc); + label[0].text = (unichar_t *) namebuf; + label[0].text_is_1byte = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 5; + gcd[0].gd.flags = gg_enabled|gg_visible; + gcd[0].creator = GLabelCreate; + j = 1; + + if ( ref->sc->unicodeenc!=-1 ) { + sprintf( ubuf, " Unicode: U+%04x", ref->sc->unicodeenc ); + label[1].text = (unichar_t *) ubuf; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 5; gcd[1].gd.pos.y = 17; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].creator = GLabelCreate; + j=2; + } + + label[j].text = (unichar_t *) _STR_TransformedBy; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+14; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.popup_msg = GStringGetResource(_STR_TransformPopup,NULL); + gcd[j].creator = GLabelCreate; + ++j; + + for ( i=0; i<6; ++i ) { + sprintf(tbuf[i],"%g", ref->transform[i]); + label[i+j].text = (unichar_t *) tbuf[i]; + label[i+j].text_is_1byte = true; + gcd[i+j].gd.label = &label[i+j]; + gcd[i+j].gd.pos.x = 20+((i&1)?85:0); gcd[i+j].gd.pos.width=75; + gcd[i+j].gd.pos.y = gcd[j-1].gd.pos.y+14+(i/2)*26; + gcd[i+j].gd.flags = gg_enabled|gg_visible; + gcd[i+j].gd.cid = i+1000; + gcd[i+j].gd.handle_controlevent = GI_TransChange; + gcd[i+j].creator = GTextFieldCreate; + } + + gcd[6+j].gd.pos.x = (RI_Width-GIntGetResource(_NUM_Buttonsize))/2; + gcd[6+j].gd.pos.y = RI_Height+(j==3?12:0)-64; + gcd[6+j].gd.pos.width = -1; gcd[6+j].gd.pos.height = 0; + gcd[6+j].gd.flags = gg_visible | gg_enabled ; + label[6+j].text = (unichar_t *) _STR_Show; + label[6+j].text_in_resource = true; + gcd[6+j].gd.mnemonic = 'S'; + gcd[6+j].gd.label = &label[6+j]; + gcd[6+j].gd.handle_controlevent = GI_Show; + gcd[6+j].creator = GButtonCreate; + + gcd[7+j].gd.pos.x = 30-3; gcd[7+j].gd.pos.y = RI_Height+(j==3?12:0)-32-3; + gcd[7+j].gd.pos.width = -1; gcd[7+j].gd.pos.height = 0; + gcd[7+j].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[7+j].text = (unichar_t *) _STR_OK; + label[7+j].text_in_resource = true; + gcd[7+j].gd.mnemonic = 'O'; + gcd[7+j].gd.label = &label[7+j]; + gcd[7+j].gd.handle_controlevent = GI_ROK; + gcd[7+j].creator = GButtonCreate; + + gcd[8+j].gd.pos.x = -30; gcd[8+j].gd.pos.y = gcd[7+j].gd.pos.y+3; + gcd[8+j].gd.pos.width = -1; gcd[8+j].gd.pos.height = 0; + gcd[8+j].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[8+j].text = (unichar_t *) _STR_Cancel; + label[8+j].text_in_resource = true; + gcd[8+j].gd.mnemonic = 'C'; + gcd[8+j].gd.label = &label[8+j]; + gcd[8+j].gd.handle_controlevent = GI_Cancel; + gcd[8+j].creator = GButtonCreate; + + gcd[9+j].gd.pos.x = 5; gcd[9+j].gd.pos.y = gcd[6+j].gd.pos.y-6; + gcd[9+j].gd.pos.width = RI_Width-10; + gcd[9+j].gd.flags = gg_visible | gg_enabled; + gcd[9+j].creator = GLineCreate; + + gcd[10+j] = gcd[9+j]; + gcd[9+j].gd.pos.y = gcd[7+j].gd.pos.y-3; + + GGadgetsCreate(gi.gw,gcd); + GWidgetIndicateFocusGadget(gcd[j].ret); + + GWidgetHidePalettes(); + GDrawSetVisible(gi.gw,true); + while ( !gi.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gi.gw); +} + +static void ImgGetInfo(CharView *cv, ImageList *img) { + static GIData gi; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[12]; + GTextInfo label[12]; + char posbuf[100], scalebuf[100]; + + gi.cv = cv; + gi.sc = cv->sc; + gi.img = img; + gi.done = false; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<xoff, + img->yoff-GImageGetHeight(img->image)*img->yscale); + label[0].text = (unichar_t *) posbuf; + label[0].text_is_1byte = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 5; + gcd[0].gd.flags = gg_enabled|gg_visible; + gcd[0].creator = GLabelCreate; + + sprintf( scalebuf, "Scaled by: (%.2f,%.2f)", img->xscale, img->yscale ); + label[1].text = (unichar_t *) scalebuf; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 5; gcd[1].gd.pos.y = 19; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].creator = GLabelCreate; + + gcd[2].gd.pos.x = (II_Width-GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor)-6)/2; gcd[2].gd.pos.y = II_Height-32-3; + gcd[2].gd.pos.width = -1; gcd[2].gd.pos.height = 0; + gcd[2].gd.flags = gg_visible | gg_enabled | gg_but_default | gg_but_cancel; + label[2].text = (unichar_t *) _STR_OK; + label[2].text_in_resource = true; + gcd[2].gd.mnemonic = 'O'; + gcd[2].gd.label = &label[2]; + gcd[2].gd.handle_controlevent = GI_Cancel; + gcd[2].creator = GButtonCreate; + + GGadgetsCreate(gi.gw,gcd); + + GWidgetHidePalettes(); + GDrawSetVisible(gi.gw,true); + while ( !gi.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gi.gw); +} + +static int IsAnchorClassUsed(SplineChar *sc,AnchorClass *an) { + AnchorPoint *ap; + int waslig=0, sawentry=0, sawexit=0; + + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) { + if ( ap->anchor==an ) { + if ( ap->type==at_centry ) + sawentry = true; + else if ( ap->type==at_cexit ) + sawexit = true; + else if ( an->type==act_mkmk ) { + if ( ap->type==at_basemark ) + sawexit = true; + else + sawentry = true; + } else if ( ap->type!=at_baselig ) +return( -1 ); + else if ( wasliglig_index+1 ) + waslig = ap->lig_index+1; + } + } + if ( sawentry && sawexit ) +return( -1 ); + else if ( sawentry ) +return( -2 ); + else if ( sawexit ) +return( -3 ); +return( waslig ); +} + +AnchorClass *AnchorClassUnused(SplineChar *sc,int *waslig) { + AnchorClass *an, *maybe; + int val, maybelig; + SplineFont *sf; + /* Are there any anchors with this name? If so can't reuse it */ + /* unless they are ligature anchores */ + /* or 'curs' anchors, which allow exactly two points (entry, exit) */ + /* or 'mkmk' anchors, which allow a mark to be both a base and an attach */ + + *waslig = false; maybelig = false; maybe = NULL; + sf = sc->parent; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + for ( an=sf->anchor; an!=NULL; an=an->next ) { + val = IsAnchorClassUsed(sc,an); + if ( val>=0 ) { + *waslig = val; +return( an ); + } else if ( val!=-1 && maybe==NULL ) { + maybe = an; + maybelig = val; + } + } + *waslig = maybelig; +return( maybe ); +} + +static AnchorPoint *AnchorPointNew(CharView *cv) { + AnchorClass *an; + AnchorPoint *ap; + int waslig; + SplineChar *sc = cv->sc; + PST *pst; + + an = AnchorClassUnused(sc,&waslig); + if ( an==NULL ) +return(NULL); + ap = chunkalloc(sizeof(AnchorPoint)); + ap->anchor = an; + ap->me.x = cv->p.cx; /* cv->p.cx = 0; */ + ap->me.y = cv->p.cy; /* cv->p.cy = 0; */ + ap->type = an->type==act_mark ? at_basechar : + an->type==act_mkmk ? at_basemark : + at_centry; + for ( pst = cv->sc->possub; pst!=NULL && pst->type!=pst_ligature; pst=pst->next ); + if ( waslig<-1 && an->type==act_mkmk ) { + ap->type = waslig==-2 ? at_basemark : at_mark; + } else if ( waslig==-2 && an->type==act_curs ) + ap->type = at_cexit; + else if ( waslig==-3 || an->type==act_curs ) + ap->type = at_centry; + else if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10000 && + iscombining(sc->unicodeenc)) + ap->type = at_mark; + else if ( an->type==act_mkmk ) + ap->type = at_basemark; + else if ( pst!=NULL || waslig ) + ap->type = at_baselig; + if (( ap->type==at_basechar || ap->type==at_baselig ) && an->type==act_mkmk ) + ap->type = at_basemark; + ap->next = sc->anchor; + if ( waslig>=0 ) + ap->lig_index = waslig; + sc->anchor = ap; +return( ap ); +} + +void SCOrderAP(SplineChar *sc) { + int lc=0, cnt=0, out=false, i,j; + AnchorPoint *ap, **array; + /* Order so that first ligature index comes first */ + + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) { + if ( ap->lig_indexlig_index>lc ) lc = ap->lig_index; + ++cnt; + } + if ( !out ) +return; + + array = galloc(cnt*sizeof(AnchorPoint *)); + for ( i=0, ap=sc->anchor; ap!=NULL; ++i, ap=ap->next ) + array[i] = ap; + for ( i=0; ilig_index>array[j]->lig_index ) { + ap = array[i]; + array[i] = array[j]; + array[j] = ap; + } + } + } + sc->anchor = array[0]; + for ( i=0; inext = array[i+1]; + array[cnt-1]->next = NULL; + free( array ); +} + +static void AI_SelectList(GIData *ci,AnchorPoint *ap) { + int i; + AnchorClass *an; + SplineFont *sf = ci->sc->parent; + + if ( sf->cidmaster ) sf = sf->cidmaster; + + for ( i=0, an=sf->anchor; an!=ap->anchor; ++i, an=an->next ); + GGadgetSelectOneListItem(GWidgetGetControl(ci->gw,CID_NameList),i); +} + +static void AI_DisplayClass(GIData *ci,AnchorPoint *ap) { + AnchorClass *ac = ap->anchor; + AnchorPoint *aps; + int saw[at_max]; + + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_BaseChar),ac->type==act_mark); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_BaseLig),ac->type==act_mark); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_BaseMark),ac->type==act_mkmk); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_CursEntry),ac->type==act_curs); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_CursExit),ac->type==act_curs); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Mark),ac->type!=act_curs); + + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_LigIndex),ap->type==at_baselig); + + if ( ac->type==act_mkmk && (ap->type==at_basechar || ap->type==at_baselig)) { + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_BaseMark),true); + ap->type = at_basemark; + } else if ( ac->type==act_mark && ap->type==at_basemark ) { + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_BaseChar),true); + ap->type = at_basechar; + } else if ( ac->type==act_curs && ap->type!=at_centry && ap->type!=at_cexit ) { + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_CursEntry),true); + ap->type = at_centry; + } + + memset(saw,0,sizeof(saw)); + for ( aps=ci->sc->anchor; aps!=NULL; aps=aps->next ) if ( aps!=ap ) { + if ( aps->anchor==ac ) saw[aps->type] = true; + } + if ( ac->type==act_curs ) { + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_CursEntry),!saw[at_centry]); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_CursExit),!saw[at_cexit]); + } else { + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Mark),!saw[at_mark]); + if ( saw[at_basechar]) GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_BaseChar),false); + if ( saw[at_basemark]) GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_BaseMark),false); + } +} + +static void AI_DisplayIndex(GIData *ci,AnchorPoint *ap) { + char buffer[12]; + unichar_t ubuf[12]; + + sprintf(buffer,"%d", ap->lig_index ); + uc_strcpy(ubuf,buffer); + + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_LigIndex),ubuf); +} + +static void AI_DisplayRadio(GIData *ci,enum anchor_type type) { + switch ( type ) { + case at_mark: + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_Mark),true); + break; + case at_basechar: + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_BaseChar),true); + break; + case at_baselig: + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_BaseLig),true); + break; + case at_basemark: + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_BaseMark),true); + break; + case at_centry: + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_CursEntry),true); + break; + case at_cexit: + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_CursExit),true); + break; + } +} + +static void AI_Display(GIData *ci,AnchorPoint *ap) { + char val[40]; + unichar_t uval[40]; + AnchorPoint *aps; + + ci->ap = ap; + for ( aps=ci->sc->anchor; aps!=NULL; aps=aps->next ) + aps->selected = false; + ap->selected = true; + sprintf(val,"%g",ap->me.x); + uc_strcpy(uval,val); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_X),uval); + sprintf(val,"%g",ap->me.y); + uc_strcpy(uval,val); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_Y),uval); + sprintf(val,"%d",ap->type==at_baselig?ap->lig_index:0); + uc_strcpy(uval,val); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_LigIndex),uval); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_LigIndex),ap->type==at_baselig); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Next),ap->next!=NULL); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_Prev),ci->sc->anchor!=ap); + + AI_DisplayClass(ci,ap); + AI_DisplayRadio(ci,ap->type); + + AI_SelectList(ci,ap); + SCUpdateAll(ci->sc); +} + +static int AI_Next(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + + if ( ci->ap->next==NULL ) +return( true ); + AI_Display(ci,ci->ap->next); + } +return( true ); +} + +static int AI_Prev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + AnchorPoint *ap, *prev; + + prev = NULL; + for ( ap=ci->sc->anchor; ap!=ci->ap; ap = ap->next ) + prev = ap; + if ( prev==NULL ) +return( true ); + AI_Display(ci,prev); + } +return( true ); +} + +static int AI_Ok(GGadget *g, GEvent *e); +static int AI_Delete(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + AnchorPoint *ap, *prev; + + prev=NULL; + for ( ap=ci->sc->anchor; ap!=ci->ap; ap=ap->next ) + prev = ap; + if ( prev==NULL && ci->ap->next==NULL ) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; + if ( GWidgetAskR(_STR_LastAnchor,buts,0,1,_STR_RemoveLastAnchor)==1 ) { + AI_Ok(g,e); +return( true ); + } + } + ap = ci->ap->next; + if ( prev==NULL ) + ci->sc->anchor = ap; + else + prev->next = ap; + chunkfree(ci->ap,sizeof(AnchorPoint)); + AI_Display(ci,ap); + } +return( true ); +} + +static int AI_New(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + int waslig; + AnchorPoint *ap; + SplineFont *sf = ci->sc->parent; + + if ( sf->cidmaster ) sf = sf->cidmaster; + + if ( AnchorClassUnused(ci->sc,&waslig)==NULL ) { + GWidgetPostNoticeR(_STR_MakeNewClass,_STR_MakeNewAnchorClass); + FontInfo(sf,8,true); /* Anchor Class */ + if ( AnchorClassUnused(ci->sc,&waslig)==NULL ) +return(true); + GGadgetSetList(GWidgetGetControl(ci->gw,CID_NameList), + AnchorClassesLList(ci->sc->parent),false); + } + ap = AnchorPointNew(ci->cv); + if ( ap==NULL ) +return( true ); + AI_Display(ci,ap); + } +return( true ); +} + +static int AI_TypeChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + AnchorPoint *ap = ci->ap; + + if ( GGadgetIsChecked(GWidgetGetControl(ci->gw,CID_Mark)) ) + ap->type = at_mark; + else if ( GGadgetIsChecked(GWidgetGetControl(ci->gw,CID_BaseChar)) ) + ap->type = at_basechar; + else if ( GGadgetIsChecked(GWidgetGetControl(ci->gw,CID_BaseLig)) ) + ap->type = at_baselig; + else if ( GGadgetIsChecked(GWidgetGetControl(ci->gw,CID_BaseMark)) ) + ap->type = at_basemark; + else if ( GGadgetIsChecked(GWidgetGetControl(ci->gw,CID_CursEntry)) ) + ap->type = at_centry; + else if ( GGadgetIsChecked(GWidgetGetControl(ci->gw,CID_CursExit)) ) + ap->type = at_cexit; + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_LigIndex),ap->type==at_baselig); + } +return( true ); +} + +static void AI_TestOrdering(GIData *ci,real x) { + AnchorPoint *aps, *ap=ci->ap; + AnchorClass *ac = ap->anchor; + int isr2l; + + isr2l = SCRightToLeft(ci->sc); + for ( aps=ci->sc->anchor; aps!=NULL; aps=aps->next ) { + if ( aps->anchor==ac && aps!=ci->ap ) { + if (( aps->lig_indexlig_index && + ((!isr2l && aps->me.x>x) || + ( isr2l && aps->me.xlig_index>ap->lig_index && + (( isr2l && aps->me.x>x) || + (!isr2l && aps->me.xlig_index); +return; + } + } + } +return; +} + +static int AI_LigIndexChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + int index, max; + int err=false; + AnchorPoint *ap = ci->ap, *aps; + + index = GetCalmRealR(ci->gw,CID_LigIndex,_STR_LigIndex,&err); + if ( index<0 || err ) +return( true ); + if ( *_GGadgetGetTitle(g)=='\0' ) +return( true ); + max = 0; + AI_TestOrdering(ci,ap->me.x); + for ( aps=ci->sc->anchor; aps!=NULL; aps=aps->next ) { + if ( aps->anchor==ap->anchor && aps!=ap ) { + if ( aps->lig_index==index ) { + GWidgetErrorR(_STR_IndexInUse,_STR_LigIndexInUse); +return( true ); + } else if ( aps->lig_index>max ) + max = aps->lig_index; + } + } + if ( index>max+10 ) { + char buf[20]; unichar_t ubuf[20]; + GWidgetErrorR(_STR_TooBig,_STR_IndexTooBig); + sprintf(buf,"%d", max+1); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(g,ubuf); + index = max+1; + } + ap->lig_index = index; + } +return( true ); +} + +static int AI_ANameChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + AnchorPoint *ap; + GTextInfo *ti = GGadgetGetListItemSelected(g); + AnchorClass *an = ti->userdata; + int change=0, max=0; + int ntype; + int sawentry, sawexit; + + if ( an==ci->ap->anchor ) +return( true ); /* No op */ + + ntype = ci->ap->type; + if ( an->type==act_curs ) { + if ( ntype!=at_centry && ntype!=at_cexit ) + ntype = at_centry; + } else if ( an->type==act_mkmk ) { + if ( ntype!=at_basemark && ntype!=at_mark ) + ntype = at_basemark; + } else if ( ntype==at_centry || ntype==at_cexit || ntype==at_basemark ) { + PST *pst; + for ( pst = ci->sc->possub; pst!=NULL && pst->type!=pst_ligature; pst=pst->next ); + if ( ci->sc->unicodeenc!=-1 && ci->sc->unicodeenc<0x10000 && + iscombining(ci->sc->unicodeenc)) + ntype = at_mark; + else if ( pst!=NULL ) + ntype = at_baselig; + else + ntype = at_basechar; + } + sawentry = sawexit = false; + for ( ap=ci->sc->anchor; ap!=NULL; ap = ap->next ) { + if ( ap!=ci->ap && ap->anchor==an ) { + if ( an->type==act_curs ) { + if ( ap->type == at_centry ) sawentry = true; + else if ( ap->type== at_cexit ) sawexit = true; + } else if ( an->type==act_mkmk ) { + if ( ap->type == at_mark ) sawentry = true; + else if ( ap->type== at_basemark ) sawexit = true; + } else { + if ( ap->type!=at_baselig ) + break; + if ( ap->lig_index==ci->ap->lig_index ) + change = true; + else if ( ap->lig_index>max ) + max = ap->lig_index; + } + } else if ( ap!=ci->ap && ap->anchor->merge_with==an->merge_with && + ap->type==at_mark ) + break; + } + if ( ap!=NULL || (sawentry && sawexit)) { + AI_SelectList(ci,ci->ap); + GWidgetErrorR(_STR_ClassUsed,_STR_AnchorClassUsed); + } else { + ci->ap->anchor = an; + if ( an->type==act_curs ) { + if ( sawentry ) ntype = at_cexit; + else if ( sawexit ) ntype = at_centry; + } else if ( an->type==act_mkmk ) { + if ( sawentry ) ntype = at_basemark; + else if ( sawexit ) ntype = at_mark; + } + if ( ci->ap->type!=ntype ) { + ci->ap->type = ntype; + AI_DisplayRadio(ci,ntype); + } + if ( ci->ap->type!=at_baselig ) + ci->ap->lig_index = 0; + else if ( change ) { + ci->ap->lig_index = max+1; + AI_DisplayIndex(ci,ci->ap); + } + AI_DisplayClass(ci,ci->ap); + AI_TestOrdering(ci,ci->ap->me.x); + } + CVCharChangedUpdate(ci->cv); + } +return( true ); +} + +static int AI_PosChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + real dx=0, dy=0; + int err=false; + AnchorPoint *ap = ci->ap; + + if ( GGadgetGetCid(g)==CID_X ) { + dx = GetCalmRealR(ci->gw,CID_X,_STR_X,&err)-ap->me.x; + AI_TestOrdering(ci,ap->me.x+dx); + } else + dy = GetCalmRealR(ci->gw,CID_Y,_STR_Y,&err)-ap->me.y; + if ( (dx==0 && dy==0) || err ) +return( true ); + ap->me.x += dx; + ap->me.y += dy; + CVCharChangedUpdate(ci->cv); + } +return( true ); +} + +static void AI_DoCancel(GIData *ci) { + CharView *cv = ci->cv; + ci->done = true; + AnchorPointsFree(cv->sc->anchor); + cv->sc->anchor = ci->oldaps; + ci->oldaps = NULL; + CVRemoveTopUndo(cv); + SCUpdateAll(cv->sc); +} + +static int ai_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + AI_DoCancel( GDrawGetUserData(gw)); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("getinfo.html"); +return( true ); + } +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +static int AI_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + AI_DoCancel( GDrawGetUserData(GGadgetGetWindow(g))); + } +return( true ); +} + +static int AI_Ok(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + ci->done = true; + /* All the work has been done as we've gone along */ + /* Well, we should reorder the list... */ + SCOrderAP(ci->cv->sc); + } +return( true ); +} + +void ApGetInfo(CharView *cv, AnchorPoint *ap) { + static GIData gi; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[22]; + GTextInfo label[22]; + int j; + SplineFont *sf; + + memset(&gi,0,sizeof(gi)); + gi.cv = cv; + gi.sc = cv->sc; + gi.oldaps = AnchorPointsCopy(cv->sc->anchor); + CVPreserveState(cv); + if ( ap==NULL ) { + ap = AnchorPointNew(cv); + if ( ap==NULL ) +return; + } + + gi.ap = ap; + gi.changed = false; + gi.done = false; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<anchor->name; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = 5; + gcd[j].gd.pos.width = AI_Width-10; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_NameList; + sf = cv->sc->parent; + if ( sf->cidmaster ) sf = sf->cidmaster; + gcd[j].gd.u.list = AnchorClassesList(sf); + gcd[j].gd.handle_controlevent = AI_ANameChanged; + gcd[j].creator = GListButtonCreate; + ++j; + + label[j].text = (unichar_t *) _STR_XC; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+34; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 23; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-4; + gcd[j].gd.pos.width = 50; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_X; + gcd[j].gd.handle_controlevent = AI_PosChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_YC; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 85; gcd[j].gd.pos.y = gcd[j-2].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 103; gcd[j].gd.pos.y = gcd[j-2].gd.pos.y; + gcd[j].gd.pos.width = 50; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Y; + gcd[j].gd.handle_controlevent = AI_PosChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Mark; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+28; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Mark; + gcd[j].gd.handle_controlevent = AI_TypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].text = (unichar_t *) _STR_BaseChar; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 70; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_BaseChar; + gcd[j].gd.handle_controlevent = AI_TypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].text = (unichar_t *) _STR_BaseLig; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[j-2].gd.pos.x; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+14; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_BaseLig; + gcd[j].gd.handle_controlevent = AI_TypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].text = (unichar_t *) _STR_BaseMark; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[j-2].gd.pos.x; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_BaseMark; + gcd[j].gd.handle_controlevent = AI_TypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].text = (unichar_t *) _STR_CursiveEntry; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[j-2].gd.pos.x; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+14; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_CursEntry; + gcd[j].gd.handle_controlevent = AI_TypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].text = (unichar_t *) _STR_CursiveExit; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[j-2].gd.pos.x; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_CursExit; + gcd[j].gd.handle_controlevent = AI_TypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].text = (unichar_t *) _STR_LigIndex; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+26; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 65; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-4; + gcd[j].gd.pos.width = 50; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_LigIndex; + gcd[j].gd.handle_controlevent = AI_LigIndexChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_New; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+30; + gcd[j].gd.pos.width = -1; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_New; + gcd[j].gd.handle_controlevent = AI_New; + gcd[j].creator = GButtonCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Delete; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = -5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; + gcd[j].gd.pos.width = -1; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Delete; + gcd[j].gd.handle_controlevent = AI_Delete; + gcd[j].creator = GButtonCreate; + ++j; + + label[j].text = (unichar_t *) _STR_PrevArrow; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 15; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+28; + gcd[j].gd.pos.width = -1; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Prev; + gcd[j].gd.handle_controlevent = AI_Prev; + gcd[j].creator = GButtonCreate; + ++j; + + label[j].text = (unichar_t *) _STR_NextArrow; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = -15; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; + gcd[j].gd.pos.width = -1; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Next; + gcd[j].gd.handle_controlevent = AI_Next; + gcd[j].creator = GButtonCreate; + ++j; + + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+26; + gcd[j].gd.pos.width = AI_Width-10; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLineCreate; + ++j; + + label[j].text = (unichar_t *) _STR_OK; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+8; + gcd[j].gd.pos.width = -1; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.handle_controlevent = AI_Ok; + gcd[j].creator = GButtonCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Cancel; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = -5; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+3; + gcd[j].gd.pos.width = -1; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.handle_controlevent = AI_Cancel; + gcd[j].creator = GButtonCreate; + ++j; + + gcd[j].gd.pos.x = 2; gcd[j].gd.pos.y = 2; + gcd[j].gd.pos.width = pos.width-4; gcd[j].gd.pos.height = pos.height-4; + gcd[j].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels; + gcd[j].creator = GLineCreate; + ++j; + + GGadgetsCreate(gi.gw,gcd); + AI_Display(&gi,ap); + GWidgetIndicateFocusGadget(GWidgetGetControl(gi.gw,CID_X)); + + GWidgetHidePalettes(); + GDrawSetVisible(gi.gw,true); + while ( !gi.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gi.gw); + AnchorPointsFree(gi.oldaps); +} + +void MDReplace(MinimumDistance *md,SplineSet *old,SplineSet *rpl) { + /* Replace all the old points with the ones in rpl in the minimu distance hints */ + SplinePoint *osp, *rsp; + MinimumDistance *test; + + while ( old!=NULL && rpl!=NULL ) { + osp = old->first; rsp = rpl->first; + while ( 1 ) { + for ( test=md; test!=NULL ; test=test->next ) { + if ( test->sp1==osp ) + test->sp1 = rsp; + if ( test->sp2==osp ) + test->sp2 = rsp; + } + if ( osp->next==NULL ) + break; + osp = osp->next->to; + rsp = rsp->next->to; + if ( osp==old->first ) + break; + } + old = old->next; + rpl = rpl->next; + } +} + +void PI_ShowHints(SplineChar *sc, GGadget *list, int set) { + StemInfo *h; + int32 i, len; + + if ( !set ) { + for ( h = sc->hstem; h!=NULL; h=h->next ) + h->active = false; + for ( h = sc->vstem; h!=NULL; h=h->next ) + h->active = false; + } else { + GTextInfo **ti = GGadgetGetList(list,&len); + for ( h = sc->hstem, i=0; h!=NULL && inext, ++i ) + h->active = ti[i]->selected; + for ( h = sc->vstem; h!=NULL && inext, ++i ) + h->active = ti[i]->selected; + } + SCOutOfDateBackground(sc); + SCUpdateAll(sc); +} + +static void _PI_ShowHints(GIData *ci,int set) { + PI_ShowHints(ci->cv->sc,GWidgetGetControl(ci->gw,CID_HintMask),set); +} + +static void PI_DoCancel(GIData *ci) { + CharView *cv = ci->cv; + ci->done = true; + if ( cv->drawmode==dm_fore ) + MDReplace(cv->sc->md,cv->sc->layers[ly_fore].splines,ci->oldstate); + SplinePointListsFree(cv->layerheads[cv->drawmode]->splines); + cv->layerheads[cv->drawmode]->splines = ci->oldstate; + CVRemoveTopUndo(cv); + SCClearSelPt(cv->sc); + _PI_ShowHints(ci,false); + SCUpdateAll(cv->sc); +} + +static int pi_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + PI_DoCancel( GDrawGetUserData(gw)); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("getinfo.html"); +return( true ); + } +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +static void PIFillup(GIData *ci, int except_cid); + +static void PI_FigureNext(GIData *ci) { + if ( ci->prevchanged ) { + SplinePoint *cursp = ci->cursp; + if ( !ci->sc->parent->order2 && cursp->pointtype==pt_curve ) { + double dx, dy, len, len2; + dx = cursp->prevcp.x - cursp->me.x; + dy = cursp->prevcp.y - cursp->me.y; + len = sqrt(dx*dx+dy*dy); + if ( len!=0 ) { + len2 = sqrt((cursp->nextcp.x-cursp->me.x)*(cursp->nextcp.x-cursp->me.x)+ + (cursp->nextcp.y-cursp->me.y)*(cursp->nextcp.y-cursp->me.y)); + cursp->nextcp.x=cursp->me.x-dx*len2/len; + cursp->nextcp.y=cursp->me.y-dy*len2/len; + if ( cursp->next!=NULL ) + SplineRefigure(cursp->next); + CVCharChangedUpdate(ci->cv); + PIFillup(ci,-1); + } + } + } + ci->prevchanged = false; +} + +static void PI_FigurePrev(GIData *ci) { + if ( ci->nextchanged ) { + SplinePoint *cursp = ci->cursp; + if ( !ci->sc->parent->order2 && cursp->pointtype==pt_curve ) { + double dx, dy, len, len2; + dx = cursp->nextcp.x - cursp->me.x; + dy = cursp->nextcp.y - cursp->me.y; + len = sqrt(dx*dx+dy*dy); + if ( len!=0 ) { + len2 = sqrt((cursp->prevcp.x-cursp->me.x)*(cursp->prevcp.x-cursp->me.x)+ + (cursp->prevcp.y-cursp->me.y)*(cursp->prevcp.y-cursp->me.y)); + cursp->prevcp.x=cursp->me.x-dx*len2/len; + cursp->prevcp.y=cursp->me.y-dy*len2/len; + if ( cursp->prev!=NULL ) + SplineRefigure(cursp->prev); + CVCharChangedUpdate(ci->cv); + PIFillup(ci,-1); + } + } + } + ci->nextchanged = false; +} + +static void PI_FigureHintMask(GIData *ci) { + int32 i, len; + GTextInfo **ti = GGadgetGetList(GWidgetGetControl(ci->gw,CID_HintMask),&len); + + for ( i=0; iselected ) + break; + + if ( i==len ) + chunkfree(ci->cursp->hintmask,sizeof(HintMask)); + else { + if ( ci->cursp->hintmask==NULL ) + ci->cursp->hintmask = chunkalloc(sizeof(HintMask)); + else + memset(ci->cursp->hintmask,0,sizeof(HintMask)); + for ( i=0; iselected ) + (*ci->cursp->hintmask)[i>>3] |= (0x80>>(i&7)); + } +} + +static int PI_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + PI_DoCancel( GDrawGetUserData(GGadgetGetWindow(g))); + } +return( true ); +} + +static int PI_Ok(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + + PI_FigureHintMask(ci); + _PI_ShowHints(ci,false); + + PI_FigureNext(ci); + PI_FigurePrev(ci); + + ci->done = true; + /* All the work has been done as we've gone along */ + } +return( true ); +} + +static void mysprintf( char *buffer, char *format, real v) { + char *pt; + + sprintf( buffer, format, v ); + pt = strrchr(buffer,'.'); + if ( pt[1]=='0' && pt[2]=='0' ) + *pt='\0'; + else if ( pt[2]=='0' ) + pt[2] = '\0'; +} + +static void mysprintf2( char *buffer, real v1, real v2) { + char *pt; + + mysprintf(buffer,"%.2f", v1); + pt = buffer+strlen(buffer); + *pt++ = ','; + mysprintf(pt,"%.2f", v2); +} + +static void PIFillup(GIData *ci, int except_cid) { + char buffer[50]; + unichar_t ubuf[50]; + double dx, dy; + + mysprintf(buffer, "%.2f", ci->cursp->me.x ); + uc_strcpy(ubuf,buffer); + if ( except_cid!=CID_BaseX ) + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_BaseX),ubuf); + + mysprintf(buffer, "%.2f", ci->cursp->me.y ); + uc_strcpy(ubuf,buffer); + if ( except_cid!=CID_BaseY ) + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_BaseY),ubuf); + + dx = ci->cursp->nextcp.x-ci->cursp->me.x; + dy = ci->cursp->nextcp.y-ci->cursp->me.y; + mysprintf(buffer, "%.2f", dx ); + uc_strcpy(ubuf,buffer); + if ( except_cid!=CID_NextXOff ) + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_NextXOff),ubuf); + + mysprintf(buffer, "%.2f", dy ); + uc_strcpy(ubuf,buffer); + if ( except_cid!=CID_NextYOff ) + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_NextYOff),ubuf); + + if ( except_cid!=CID_NextR ) { + mysprintf(buffer, "%.2f", sqrt( dx*dx+dy*dy )); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_NextR),ubuf); + } + + if ( except_cid!=CID_NextTheta ) { + if ( ci->cursp->pointtype==pt_tangent && ci->cursp->prev!=NULL ) { + dx = ci->cursp->me.x-ci->cursp->prev->from->me.x; + dy = ci->cursp->me.y-ci->cursp->prev->from->me.y; + } + mysprintf(buffer, "%.1f", atan2(dy,dx)*RAD2DEG); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_NextTheta),ubuf); + } + + mysprintf2(buffer, ci->cursp->nextcp.x,ci->cursp->nextcp.y ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_NextPos),ubuf); + + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_NextDef), ci->cursp->nextcpdef ); + + dx = ci->cursp->prevcp.x-ci->cursp->me.x; + dy = ci->cursp->prevcp.y-ci->cursp->me.y; + mysprintf(buffer, "%.2f", dx ); + uc_strcpy(ubuf,buffer); + if ( except_cid!=CID_PrevXOff ) + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_PrevXOff),ubuf); + + mysprintf(buffer, "%.2f", dy ); + uc_strcpy(ubuf,buffer); + if ( except_cid!=CID_PrevYOff ) + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_PrevYOff),ubuf); + + if ( except_cid!=CID_PrevR ) { + mysprintf(buffer, "%.2f", sqrt( dx*dx+dy*dy )); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_PrevR),ubuf); + } + + if ( except_cid!=CID_PrevTheta ) { + if ( ci->cursp->pointtype==pt_tangent && ci->cursp->next!=NULL ) { + dx = ci->cursp->me.x-ci->cursp->next->to->me.x; + dy = ci->cursp->me.y-ci->cursp->next->to->me.y; + } + mysprintf(buffer, "%.1f", atan2(dy,dx)*RAD2DEG); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_PrevTheta),ubuf); + } + + mysprintf2(buffer, ci->cursp->prevcp.x,ci->cursp->prevcp.y ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(ci->gw,CID_PrevPos),ubuf); + + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_PrevDef), ci->cursp->prevcpdef ); + + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_Curve), ci->cursp->pointtype==pt_curve ); + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_Corner), ci->cursp->pointtype==pt_corner ); + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_Tangent), ci->cursp->pointtype==pt_tangent ); + + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_PrevTheta), ci->cursp->pointtype!=pt_tangent ); + GGadgetSetEnabled(GWidgetGetControl(ci->gw,CID_NextTheta), ci->cursp->pointtype!=pt_tangent ); +} + +static void PIChangePoint(GIData *ci) { + int aspect = GTabSetGetSel(GWidgetGetControl(ci->gw,CID_TabSet)); + GGadget *list = GWidgetGetControl(ci->gw,CID_HintMask); + int32 i, len; + HintMask *hm; + SplinePoint *sp; + SplineSet *spl; + + GGadgetGetList(list,&len); + + PIFillup(ci,0); + if ( ci->cursp->hintmask==NULL ) { + for ( i=0; icursp->hintmask)[i>>3]&(0x80>>(i&7))?true:false ); + } + _PI_ShowHints(ci,aspect==1); + + list = GWidgetGetControl(ci->gw,CID_ActiveHints); + hm = NULL; + /* Figure out what hintmask is active at the current point */ + /* Note: we must walk each ss backwards because we reverse the splineset */ + /* when we output postscript */ + for ( spl = ci->sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; ; ) { + if ( sp->hintmask ) + hm = sp->hintmask; + if ( sp==ci->cursp ) + break; + if ( sp->prev==NULL ) + break; + sp = sp->prev->from; + if ( sp==spl->first ) + break; + } + } + if ( hm==NULL ) { + for ( i=0; i>3]&(0x80>>(i&7))?true:false ); + } +} + +static int PI_Next(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + CharView *cv = ci->cv; + + PI_FigureHintMask(ci); + + PI_FigureNext(ci); + PI_FigurePrev(ci); + + ci->cursp->selected = false; + if ( ci->cursp->next!=NULL && ci->cursp->next->to!=ci->curspl->first ) + ci->cursp = ci->cursp->next->to; + else { + if ( ci->curspl->next == NULL ) + ci->curspl = cv->layerheads[cv->drawmode]->splines; + else + ci->curspl = ci->curspl->next; + ci->cursp = ci->curspl->first; + } + ci->cursp->selected = true; + PIChangePoint(ci); + CVShowPoint(cv,ci->cursp); + SCUpdateAll(cv->sc); + } +return( true ); +} + +static int PI_Prev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + CharView *cv = ci->cv; + SplinePointList *spl; + + PI_FigureHintMask(ci); + + PI_FigureNext(ci); + PI_FigurePrev(ci); + + ci->cursp->selected = false; + + if ( ci->cursp!=ci->curspl->first ) { + ci->cursp = ci->cursp->prev->from; + } else { + if ( ci->curspl==cv->layerheads[cv->drawmode]->splines ) { + for ( spl = cv->layerheads[cv->drawmode]->splines; spl->next!=NULL; spl=spl->next ); + } else { + for ( spl = cv->layerheads[cv->drawmode]->splines; spl->next!=ci->curspl; spl=spl->next ); + } + ci->curspl = spl; + ci->cursp = spl->last; + if ( spl->last==spl->first && spl->last->prev!=NULL ) + ci->cursp = ci->cursp->prev->from; + } + ci->cursp->selected = true; + cv->p.nextcp = cv->p.prevcp = false; + PIChangePoint(ci); + CVShowPoint(cv,ci->cursp); + SCUpdateAll(cv->sc); + } +return( true ); +} + +static int PI_BaseChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + real dx=0, dy=0; + int err=false; + SplinePoint *cursp = ci->cursp; + + if ( GGadgetGetCid(g)==CID_BaseX ) + dx = GetCalmRealR(ci->gw,CID_BaseX,_STR_BaseX,&err)-cursp->me.x; + else + dy = GetCalmRealR(ci->gw,CID_BaseY,_STR_BaseY,&err)-cursp->me.y; + if ( (dx==0 && dy==0) || err ) +return( true ); + cursp->me.x += dx; + cursp->nextcp.x += dx; + cursp->prevcp.x += dx; + cursp->me.y += dy; + cursp->nextcp.y += dy; + cursp->prevcp.y += dy; + if ( cursp->next!=NULL ) + SplineRefigure(cursp->next); + if ( cursp->prev!=NULL ) + SplineRefigure(cursp->prev); + CVCharChangedUpdate(ci->cv); + PIFillup(ci,GGadgetGetCid(g)); + } else if ( e->type==et_controlevent && + e->u.control.subtype == et_textfocuschanged && + e->u.control.u.tf_focus.gained_focus ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + PI_FigureNext(ci); + PI_FigurePrev(ci); + } +return( true ); +} + +static int PI_NextChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + real dx=0, dy=0; + int err=false; + SplinePoint *cursp = ci->cursp; + + if ( GGadgetGetCid(g)==CID_NextXOff ) { + dx = GetCalmRealR(ci->gw,CID_NextXOff,_STR_NextCPX,&err)-(cursp->nextcp.x-cursp->me.x); + if ( cursp->pointtype==pt_tangent && cursp->prev!=NULL ) { + if ( cursp->prev->from->me.x==cursp->me.x ) { + dy = dx; dx = 0; /* They should be constrained not to change in the x direction */ + } else + dy = dx*(cursp->prev->from->me.y-cursp->me.y)/(cursp->prev->from->me.x-cursp->me.x); + } + } else if ( GGadgetGetCid(g)==CID_NextYOff ) { + dy = GetCalmRealR(ci->gw,CID_NextYOff,_STR_NextCPY,&err)-(cursp->nextcp.y-cursp->me.y); + if ( cursp->pointtype==pt_tangent && cursp->prev!=NULL ) { + if ( cursp->prev->from->me.y==cursp->me.y ) { + dx = dy; dy = 0; /* They should be constrained not to change in the y direction */ + } else + dx = dy*(cursp->prev->from->me.x-cursp->me.x)/(cursp->prev->from->me.y-cursp->me.y); + } + } else { + double len, theta; + len = GetCalmRealR(ci->gw,CID_NextR,_STR_NextCPDist,&err); + theta = GetCalmRealR(ci->gw,CID_NextTheta,_STR_NextCPAngle,&err)/RAD2DEG; + dx = len*cos(theta) - (cursp->nextcp.x-cursp->me.x); + dy = len*sin(theta) - (cursp->nextcp.y-cursp->me.y); + } + if ( (dx==0 && dy==0) || err ) +return( true ); + cursp->nextcp.x += dx; + cursp->nextcp.y += dy; + cursp->nonextcp = false; + ci->nextchanged = true; + if (( dx>.1 || dx<-.1 || dy>.1 || dy<-.1 ) && cursp->nextcpdef ) { + cursp->nextcpdef = false; + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_NextDef), false ); + } + if ( ci->sc->parent->order2 ) + SplinePointNextCPChanged2(cursp,false); + else if ( cursp->next!=NULL ) + SplineRefigure3(cursp->next); + CVCharChangedUpdate(ci->cv); + PIFillup(ci,GGadgetGetCid(g)); + } else if ( e->type==et_controlevent && + e->u.control.subtype == et_textfocuschanged && + e->u.control.u.tf_focus.gained_focus ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + PI_FigureNext(ci); + } +return( true ); +} + +static int PI_PrevChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + real dx=0, dy=0; + int err=false; + SplinePoint *cursp = ci->cursp; + + if ( GGadgetGetCid(g)==CID_PrevXOff ) { + dx = GetCalmRealR(ci->gw,CID_PrevXOff,_STR_PrevCPX,&err)-(cursp->prevcp.x-cursp->me.x); + if ( cursp->pointtype==pt_tangent && cursp->next!=NULL ) { + if ( cursp->next->to->me.x==cursp->me.x ) { + dy = dx; dx = 0; /* They should be constrained not to change in the x direction */ + } else + dy = dx*(cursp->next->to->me.y-cursp->me.y)/(cursp->next->to->me.x-cursp->me.x); + } + } else if ( GGadgetGetCid(g)==CID_PrevYOff ) { + dy = GetCalmRealR(ci->gw,CID_PrevYOff,_STR_PrevCPY,&err)-(cursp->prevcp.y-cursp->me.y); + if ( cursp->pointtype==pt_tangent && cursp->next!=NULL ) { + if ( cursp->next->to->me.y==cursp->me.y ) { + dx = dy; dy = 0; /* They should be constrained not to change in the y direction */ + } else + dx = dy*(cursp->next->to->me.x-cursp->me.x)/(cursp->next->to->me.y-cursp->me.y); + } + } else { + double len, theta; + len = GetCalmRealR(ci->gw,CID_PrevR,_STR_PrevCPDist,&err); + theta = GetCalmRealR(ci->gw,CID_PrevTheta,_STR_PrevCPAngle,&err)/RAD2DEG; + dx = len*cos(theta) - (cursp->prevcp.x-cursp->me.x); + dy = len*sin(theta) - (cursp->prevcp.y-cursp->me.y); + } + if ( (dx==0 && dy==0) || err ) +return( true ); + cursp->prevcp.x += dx; + cursp->prevcp.y += dy; + cursp->noprevcp = false; + ci->prevchanged = true; + if (( dx>.1 || dx<-.1 || dy>.1 || dy<-.1 ) && cursp->prevcpdef ) { + cursp->prevcpdef = false; + GGadgetSetChecked(GWidgetGetControl(ci->gw,CID_PrevDef), false ); + } + if ( ci->sc->parent->order2 ) + SplinePointPrevCPChanged2(cursp,false); + else if ( cursp->prev!=NULL ) + SplineRefigure(cursp->prev); + CVCharChangedUpdate(ci->cv); + PIFillup(ci,GGadgetGetCid(g)); + } else if ( e->type==et_controlevent && + e->u.control.subtype == et_textfocuschanged && + e->u.control.u.tf_focus.gained_focus ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + PI_FigurePrev(ci); + } +return( true ); +} + +static int PI_NextDefChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + SplinePoint *cursp = ci->cursp; + + cursp->nextcpdef = GGadgetIsChecked(g); + /* If they turned def off, that's a noop, but if they turned it on... */ + /* then set things to the default */ + if ( cursp->nextcpdef ) { + BasePoint temp = cursp->prevcp; + SplineCharDefaultNextCP(cursp); + if ( !cursp->prevcpdef ) + cursp->prevcp = temp; + CVCharChangedUpdate(ci->cv); + PIFillup(ci,GGadgetGetCid(g)); + } + } +return( true ); +} + +static int PI_PrevDefChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + SplinePoint *cursp = ci->cursp; + + cursp->prevcpdef = GGadgetIsChecked(g); + /* If they turned def off, that's a noop, but if they turned it on... */ + /* then set things to the default */ + if ( cursp->prevcpdef ) { + BasePoint temp = cursp->nextcp; + SplineCharDefaultPrevCP(cursp); + if ( !cursp->nextcpdef ) + cursp->nextcp = temp; + CVCharChangedUpdate(ci->cv); + PIFillup(ci,GGadgetGetCid(g)); + } + } +return( true ); +} + +static int PI_PTypeChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + SplinePoint *cursp = ci->cursp; + enum pointtype pt = GGadgetGetCid(g)-CID_Curve + pt_curve; + + if ( pt==cursp->pointtype ) { + /* Can't happen */ + } else if ( pt==pt_corner ) { + cursp->pointtype = pt_corner; + CVCharChangedUpdate(ci->cv); + } else { + SPChangePointType(cursp,pt); + CVCharChangedUpdate(ci->cv); + PIFillup(ci,GGadgetGetCid(g)); + } + } +return( true ); +} + +static int PI_AspectChange(GGadget *g, GEvent *e) { + if ( e==NULL || (e->type==et_controlevent && e->u.control.subtype == et_radiochanged )) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + int aspect = GTabSetGetSel(g); + + _PI_ShowHints(ci,aspect==1); + } +return( true ); +} + +static int PI_HintSel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + GIData *ci = GDrawGetUserData(GGadgetGetWindow(g)); + + _PI_ShowHints(ci,true); + + if ( GGadgetIsListItemSelected(g,e->u.control.u.list.changed_index)) { + /* If we just selected something, check to make sure it doesn't */ + /* conflict with any other hints. */ + /* Adobe says this is an error, but in "three" in AdobeSansMM */ + /* (in black,extended) we have a hintmask which contains two */ + /* overlapping hints */ + /* So just make it a warning */ + int i,j; + StemInfo *h, *h2=NULL; + for ( i=0, h=ci->cv->sc->hstem; h!=NULL && i!=e->u.control.u.list.changed_index; h=h->next, ++i ); + if ( h!=NULL ) { + for ( h2 = ci->cv->sc->hstem, i=0 ; h2!=NULL; h2=h2->next, ++i ) { + if ( h2!=h && GGadgetIsListItemSelected(g,i)) { + if (( h2->startstart && h2->start+h2->width>h->start ) || + ( h2->start>=h->start && h->start+h->width>h2->start )) + break; + } + } + } else { + j = i; + for ( h=ci->cv->sc->vstem; h!=NULL && i!=e->u.control.u.list.changed_index; h=h->next, ++i ); + if ( h==NULL ) + GDrawIError("Failed to find hint"); + else { + for ( h2 = ci->cv->sc->hstem, i=j ; h2!=NULL; h2=h2->next, ++i ) { + if ( h2!=h && GGadgetIsListItemSelected(g,i)) { + if (( h2->startstart && h2->start+h2->width>h->start ) || + ( h2->start>=h->start && h->start+h->width>h2->start )) + break; + } + } + } + } + if ( h2!=NULL ) + GWidgetErrorR(_STR_OverlappedHints,_STR_OverlappedHintsLong, + h2->start,h2->width); + } + } +return( true ); +} + +GTextInfo *SCHintList(SplineChar *sc,HintMask *hm) { + StemInfo *h; + int i; + GTextInfo *ti; + char buffer[100]; + + for ( h=sc->hstem, i=0; h!=NULL; h=h->next, ++i ); + for ( h=sc->vstem ; h!=NULL; h=h->next, ++i ); + ti = gcalloc(i+1,sizeof(GTextInfo)); + + for ( h=sc->hstem, i=0; h!=NULL; h=h->next, ++i ) { + ti[i].fg = ti[i].bg = COLOR_DEFAULT; + ti[i].userdata = h; + if ( h->ghost && h->width>0 ) + sprintf( buffer, "H<%g,%g>", + rint(h->start*100)/100+rint(h->width*100)/100, -rint(h->width*100)/100 ); + else + sprintf( buffer, "H<%g,%g>", + rint(h->start*100)/100, rint(h->width*100)/100 ); + ti[i].text = uc_copy(buffer); + if ( hm!=NULL && ((*hm)[i>>3]&(0x80>>(i&7)))) + ti[i].selected = true; + } + + for ( h=sc->vstem ; h!=NULL; h=h->next, ++i ) { + ti[i].fg = ti[i].bg = COLOR_DEFAULT; + ti[i].userdata = h; + if ( h->ghost && h->width>0 ) + sprintf( buffer, "V<%g,%g>", + rint(h->start*100)/100+rint(h->width*100)/100, -rint(h->width*100)/100 ); + else + sprintf( buffer, "V<%g,%g>", + rint(h->start*100)/100, rint(h->width*100)/100 ); + ti[i].text = uc_copy(buffer); + if ( hm!=NULL && ((*hm)[i>>3]&(0x80>>(i&7)))) + ti[i].selected = true; + } +return( ti ); +} + +static void PointGetInfo(CharView *cv, SplinePoint *sp, SplinePointList *spl) { + static GIData gi; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[37], hgcd[2], h2gcd[2], mgcd[8]; + GTextInfo label[37], mlabel[8]; + GTabInfo aspects[4]; + static GBox cur, nextcp, prevcp; + extern Color nextcpcol, prevcpcol; + GWindow root; + GRect screensize; + GPoint pt; + int j, defxpos, nextstarty; + + cur.main_background = nextcp.main_background = prevcp.main_background = COLOR_DEFAULT; + cur.main_foreground = 0xff0000; + nextcp.main_foreground = nextcpcol; + prevcp.main_foreground = prevcpcol; + gi.cv = cv; + gi.sc = cv->sc; + gi.cursp = sp; + gi.curspl = spl; + gi.oldstate = SplinePointListCopy(cv->layerheads[cv->drawmode]->splines); + gi.done = false; + CVPreserveState(cv); + + root = GDrawGetRoot(NULL); + GDrawGetSize(root,&screensize); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_positioned|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<xoff + rint(sp->me.x*cv->scale); + pt.y = -cv->yoff + cv->height - rint(sp->me.y*cv->scale); + GDrawTranslateCoordinates(cv->v,root,&pt); + if ( pt.x+20+pos.width<=screensize.width ) + pos.x = pt.x+20; + else if ( (pos.x = pt.x-10-screensize.width)<0 ) + pos.x = 0; + pos.y = pt.y; + if ( pos.y+pos.height+20 > screensize.height ) + pos.y = screensize.height - pos.height - 20; + if ( pos.y<0 ) pos.y = 0; + gi.gw = GDrawCreateTopWindow(NULL,&pos,pi_e_h,&gi,&wattrs); + + memset(&gcd,0,sizeof(gcd)); + memset(&label,0,sizeof(label)); + memset(&hgcd,0,sizeof(hgcd)); + memset(&h2gcd,0,sizeof(h2gcd)); + memset(&mgcd,0,sizeof(mgcd)); + memset(&mlabel,0,sizeof(mlabel)); + memset(&aspects,0,sizeof(aspects)); + + j=0; + label[j].text = (unichar_t *) _STR_Base; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = 5+6; + gcd[j].gd.flags = gg_enabled|gg_visible|gg_dontcopybox; + gcd[j].gd.box = &cur; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = 5; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_BaseX; + gcd[j].gd.handle_controlevent = PI_BaseChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + gcd[j].gd.pos.x = 137; gcd[j].gd.pos.y = 5; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_BaseY; + gcd[j].gd.handle_controlevent = PI_BaseChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_PrevCP; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 9; gcd[j].gd.pos.y = 36; + gcd[j].gd.flags = gg_enabled|gg_visible|gg_dontcopybox; + gcd[j].gd.box = &prevcp; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; gcd[j].gd.pos.width = 65; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_PrevPos; + gcd[j].creator = GLabelCreate; + ++j; + + defxpos = 130; + label[j].text = (unichar_t *) _STR_Default; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = defxpos; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-3; + gcd[j].gd.flags = (gg_enabled|gg_visible); + gcd[j].gd.cid = CID_PrevDef; + gcd[j].gd.handle_controlevent = PI_PrevDefChanged; + gcd[j].creator = GCheckBoxCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Offset; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[3].gd.pos.x+10; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+18+4; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-4; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_PrevXOff; + gcd[j].gd.handle_controlevent = PI_PrevChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + gcd[j].gd.pos.x = 137; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_PrevYOff; + gcd[j].gd.handle_controlevent = PI_PrevChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Dist; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[3].gd.pos.x+10; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+28; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-4; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_PrevR; + gcd[j].gd.handle_controlevent = PI_PrevChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + gcd[j].gd.pos.x = 137; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; gcd[j].gd.pos.width = 60; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_PrevTheta; + gcd[j].gd.handle_controlevent = PI_PrevChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Degree; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[j-1].gd.pos.x+gcd[j-1].gd.pos.width+2; gcd[j].gd.pos.y = gcd[j-3].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = gcd[3].gd.pos.y-5; + gcd[j].gd.pos.width = PI_Width-10; gcd[j].gd.pos.height = 70; + gcd[j].gd.flags = gg_enabled | gg_visible; + gcd[j].creator = GGroupCreate; + ++j; + + nextstarty = gcd[j-3].gd.pos.y+34; + label[j].text = (unichar_t *) _STR_NextCP; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[3].gd.pos.x; gcd[j].gd.pos.y = nextstarty; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.flags = gg_enabled|gg_visible|gg_dontcopybox; + gcd[j].gd.box = &nextcp; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = nextstarty; gcd[j].gd.pos.width = 65; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_NextPos; + gcd[j].creator = GLabelCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Default; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = defxpos; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-3; + gcd[j].gd.flags = (gg_enabled|gg_visible); + gcd[j].gd.cid = CID_NextDef; + gcd[j].gd.handle_controlevent = PI_NextDefChanged; + gcd[j].creator = GCheckBoxCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Offset; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[3].gd.pos.x+10; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+18+4; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-4; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_NextXOff; + gcd[j].gd.handle_controlevent = PI_NextChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + gcd[j].gd.pos.x = 137; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_NextYOff; + gcd[j].gd.handle_controlevent = PI_NextChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Dist; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[3].gd.pos.x+10; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y+28; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-4; gcd[j].gd.pos.width = 70; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_NextR; + gcd[j].gd.handle_controlevent = PI_NextChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + gcd[j].gd.pos.x = 137; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; gcd[j].gd.pos.width = 60; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_NextTheta; + gcd[j].gd.handle_controlevent = PI_NextChanged; + gcd[j].creator = GTextFieldCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Degree; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[j-1].gd.pos.x+gcd[j-1].gd.pos.width+2; gcd[j].gd.pos.y = gcd[j-3].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + gcd[j].gd.pos.x = 5; gcd[j].gd.pos.y = nextstarty-5; + gcd[j].gd.pos.width = PI_Width-10; gcd[j].gd.pos.height = 70; + gcd[j].gd.flags = gg_enabled | gg_visible; + gcd[j].creator = GGroupCreate; + ++j; + + label[j].text = (unichar_t *) _STR_Type; + label[j].text_in_resource = true; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = gcd[0].gd.pos.x; gcd[j].gd.pos.y = gcd[j-3].gd.pos.y+32; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].creator = GLabelCreate; + ++j; + + label[j].image = &GIcon_midcurve; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 60; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y-2; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Curve; + gcd[j].gd.handle_controlevent = PI_PTypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].image = &GIcon_midcorner; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 100; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Corner; + gcd[j].gd.handle_controlevent = PI_PTypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + label[j].image = &GIcon_midtangent; + gcd[j].gd.label = &label[j]; + gcd[j].gd.pos.x = 140; gcd[j].gd.pos.y = gcd[j-1].gd.pos.y; + gcd[j].gd.flags = gg_enabled|gg_visible; + gcd[j].gd.cid = CID_Tangent; + gcd[j].gd.handle_controlevent = PI_PTypeChanged; + gcd[j].creator = GRadioCreate; + ++j; + + hgcd[0].gd.pos.x = 5; hgcd[0].gd.pos.y = 5; + hgcd[0].gd.pos.width = PI_Width-20; hgcd[0].gd.pos.height = gcd[j-1].gd.pos.y+10; + hgcd[0].gd.flags = gg_visible | gg_enabled | gg_list_multiplesel; + hgcd[0].gd.cid = CID_HintMask; + hgcd[0].gd.u.list = SCHintList(cv->sc,NULL); + hgcd[0].gd.handle_controlevent = PI_HintSel; + hgcd[0].creator = GListCreate; + + h2gcd[0].gd.pos.x = 5; h2gcd[0].gd.pos.y = 5; + h2gcd[0].gd.pos.width = PI_Width-20; h2gcd[0].gd.pos.height = gcd[j-1].gd.pos.y+10; + h2gcd[0].gd.flags = gg_visible | gg_list_multiplesel; + h2gcd[0].gd.cid = CID_ActiveHints; + h2gcd[0].gd.u.list = SCHintList(cv->sc,NULL); + h2gcd[0].creator = GListCreate; + + j = 0; + + aspects[j].text = (unichar_t *) _STR_Location; + aspects[j].text_in_resource = true; + aspects[j++].gcd = gcd; + + aspects[j].text = (unichar_t *) _STR_HintMask; + aspects[j].text_in_resource = true; + aspects[j++].gcd = hgcd; + + aspects[j].text = (unichar_t *) _STR_ActiveHints; + aspects[j].text_in_resource = true; + aspects[j++].gcd = h2gcd; + + j = 0; + + mgcd[j].gd.pos.x = 4; mgcd[j].gd.pos.y = 6; + mgcd[j].gd.pos.width = PI_Width-8; + mgcd[j].gd.pos.height = hgcd[0].gd.pos.height+10+24; + mgcd[j].gd.u.tabs = aspects; + mgcd[j].gd.flags = gg_visible | gg_enabled; + mgcd[j].gd.handle_controlevent = PI_AspectChange; + mgcd[j].gd.cid = CID_TabSet; + mgcd[j++].creator = GTabSetCreate; + + mgcd[j].gd.pos.x = (PI_Width-2*50-10)/2; mgcd[j].gd.pos.y = mgcd[j-1].gd.pos.y+mgcd[j-1].gd.pos.height+5; + mgcd[j].gd.pos.width = 53; mgcd[j].gd.pos.height = 0; + mgcd[j].gd.flags = gg_visible | gg_enabled; + mlabel[j].text = (unichar_t *) _STR_PrevArrow; + mlabel[j].text_in_resource = true; + mgcd[j].gd.mnemonic = 'P'; + mgcd[j].gd.label = &mlabel[j]; + mgcd[j].gd.handle_controlevent = PI_Prev; + mgcd[j].creator = GButtonCreate; + ++j; + + mgcd[j].gd.pos.x = PI_Width-50-(PI_Width-2*50-10)/2; mgcd[j].gd.pos.y = mgcd[j-1].gd.pos.y; + mgcd[j].gd.pos.width = 53; mgcd[j].gd.pos.height = 0; + mgcd[j].gd.flags = gg_visible | gg_enabled; + mlabel[j].text = (unichar_t *) _STR_NextArrow; + mlabel[j].text_in_resource = true; + mgcd[j].gd.label = &mlabel[j]; + mgcd[j].gd.mnemonic = 'N'; + mgcd[j].gd.handle_controlevent = PI_Next; + mgcd[j].creator = GButtonCreate; + ++j; + + mgcd[j].gd.pos.x = 5; mgcd[j].gd.pos.y = mgcd[j-1].gd.pos.y+30; + mgcd[j].gd.pos.width = PI_Width-10; + mgcd[j].gd.flags = gg_enabled|gg_visible; + mgcd[j].creator = GLineCreate; + ++j; + + mgcd[j].gd.pos.x = 20-3; mgcd[j].gd.pos.y = PI_Height-35-3; + mgcd[j].gd.pos.width = -1; mgcd[j].gd.pos.height = 0; + mgcd[j].gd.flags = gg_visible | gg_enabled | gg_but_default; + mlabel[j].text = (unichar_t *) _STR_OK; + mlabel[j].text_in_resource = true; + mgcd[j].gd.mnemonic = 'O'; + mgcd[j].gd.label = &mlabel[j]; + mgcd[j].gd.handle_controlevent = PI_Ok; + mgcd[j].creator = GButtonCreate; + ++j; + + mgcd[j].gd.pos.x = -20; mgcd[j].gd.pos.y = PI_Height-35; + mgcd[j].gd.pos.width = -1; mgcd[j].gd.pos.height = 0; + mgcd[j].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + mlabel[j].text = (unichar_t *) _STR_Cancel; + mlabel[j].text_in_resource = true; + mgcd[j].gd.label = &mlabel[j]; + mgcd[j].gd.mnemonic = 'C'; + mgcd[j].gd.handle_controlevent = PI_Cancel; + mgcd[j].creator = GButtonCreate; + ++j; + + mgcd[j].gd.pos.x = 2; mgcd[j].gd.pos.y = 2; + mgcd[j].gd.pos.width = pos.width-4; mgcd[j].gd.pos.height = pos.height-4; + mgcd[j].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + mgcd[j].creator = GGroupCreate; + ++j; + + GGadgetsCreate(gi.gw,mgcd); + GTextInfoListFree(hgcd[0].gd.u.list); + GTextInfoListFree(h2gcd[0].gd.u.list); + + PIChangePoint(&gi); + + GWidgetHidePalettes(); + GDrawSetVisible(gi.gw,true); + while ( !gi.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gi.gw); +} + +void CVGetInfo(CharView *cv) { + SplinePoint *sp; + SplinePointList *spl; + RefChar *ref; + ImageList *img; + AnchorPoint *ap; + + if ( !CVOneThingSel(cv,&sp,&spl,&ref,&img,&ap)) { +#if 0 + if ( cv->fv->cidmaster==NULL ) + SCCharInfo(cv->sc); +#endif + } else if ( ref!=NULL ) + RefGetInfo(cv,ref); + else if ( img!=NULL ) + ImgGetInfo(cv,img); + else if ( ap!=NULL ) + ApGetInfo(cv,ap); + else + PointGetInfo(cv,sp,spl); +} + +void CVPGetInfo(CharView *cv) { + + if ( cv->p.ref!=NULL ) + RefGetInfo(cv,cv->p.ref); + else if ( cv->p.img!=NULL ) + ImgGetInfo(cv,cv->p.img); + else if ( cv->p.ap!=NULL ) + ApGetInfo(cv,cv->p.ap); + else if ( cv->p.sp!=NULL ) + PointGetInfo(cv,cv->p.sp,cv->p.spl); +} + +void SCRefBy(SplineChar *sc) { + static int buts[] = { _STR_Show, _STR_Cancel }; + int cnt,i,tot=0; + unichar_t **deps = NULL; + struct splinecharlist *d; + + for ( i=0; i<2; ++i ) { + cnt = 0; + for ( d = sc->dependents; d!=NULL; d=d->next ) { + if ( deps!=NULL ) + deps[tot-cnt] = uc_copy(d->sc->name); + ++cnt; + } + if ( cnt==0 ) +return; + if ( i==0 ) + deps = gcalloc(cnt+1,sizeof(unichar_t *)); + tot = cnt-1; + } + + i = GWidgetChoicesBR(_STR_Dependents,(const unichar_t **) deps, cnt, 0, buts, _STR_Dependents ); + if ( i!=-1 ) { + i = tot-i; + for ( d = sc->dependents, cnt=0; d!=NULL && cntnext, ++cnt ); + CharViewCreate(d->sc,sc->parent->fv); + } + for ( i=0; i<=tot; ++i ) + free( deps[i] ); + free(deps); +} diff --git a/fontforge/cvgridfit.c b/fontforge/cvgridfit.c new file mode 100644 index 00000000..193d350f --- /dev/null +++ b/fontforge/cvgridfit.c @@ -0,0 +1,256 @@ +/* Copyright (C) 2001-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * dercved from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +static int last_fpgm = false; + +void SCDeGridFit(SplineChar *sc) { + CharView *cv; + + for ( cv=sc->views; cv!=NULL; cv=cv->next ) if ( cv->show_ft_results ) { + SplinePointListsFree(cv->gridfit); cv->gridfit = NULL; + FreeType_FreeRaster(cv->raster); cv->raster = NULL; + cv->show_ft_results = false; + GDrawRequestExpose(cv->v,NULL,false); + } +} + +void CVGridFitChar(CharView *cv) { + void *single_glyph_context; + SplineFont *sf = cv->sc->parent; + + SplinePointListsFree(cv->gridfit); cv->gridfit = NULL; + FreeType_FreeRaster(cv->raster); cv->raster = NULL; + + single_glyph_context = _FreeTypeFontContext(sf,cv->sc,NULL, + sf->order2?ff_ttf:ff_otf,0,NULL); + if ( single_glyph_context==NULL ) { + fprintf( stderr,"Freetype rasterization failed.\n" ); +return; + } + + cv->raster = FreeType_GetRaster(single_glyph_context,cv->sc->enc, + cv->ft_pointsize, cv->ft_dpi ); + cv->gridfit = FreeType_GridFitChar(single_glyph_context,cv->sc->enc, + cv->ft_pointsize, cv->ft_dpi, &cv->ft_gridfitwidth, + cv->sc->layers[ly_fore].splines ); + + + FreeTypeFreeContext(single_glyph_context); + GDrawRequestExpose(cv->v,NULL,false); +} + +#define CID_PointSize 1001 +#define CID_DPI 1002 +#define CID_ShowGrid 1003 +#define CID_Debugfpgm 1004 + +typedef struct ftsizedata { + unsigned int done: 1; + unsigned int debug: 1; + CharView *cv; + GWindow gw; +} FtSizeData; + +static int FtPpem_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + FtSizeData *fsd = GDrawGetUserData(GGadgetGetWindow(g)); + int dpi; + real ptsize; + int err = 0, bit; + CharView *cv = fsd->cv; + + ptsize = GetRealR(fsd->gw,CID_PointSize,_STR_Pointsize,&err); + dpi = GetIntR(fsd->gw,CID_DPI,_STR_DPI,&err); + if ( err ) +return(true); + + bit = GGadgetIsChecked(GWidgetGetControl(fsd->gw,CID_ShowGrid)); + last_fpgm = GGadgetIsChecked(GWidgetGetControl(fsd->gw,CID_Debugfpgm)); + cv->ft_pointsize = ptsize; cv->ft_dpi = dpi; + cv->ft_ppem = rint(cv->ft_pointsize*cv->ft_dpi/72.0); + + SplinePointListsFree(cv->gridfit); cv->gridfit = NULL; + FreeType_FreeRaster(cv->raster); cv->raster = NULL; + + if ( fsd->debug ) + CVDebugReInit(cv,bit,last_fpgm); + else { + cv->show_ft_results = bit; + if ( cv->show_ft_results ) + CVGridFitChar(cv); + else { + GDrawRequestExpose(cv->v,NULL,false); + } + } + CVLayersSet(cv); + fsd->done = true; + } +return( true ); +} + +static int FtPpem_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + FtSizeData *fsd = GDrawGetUserData(GGadgetGetWindow(g)); + fsd->done = true; + } +return( true ); +} + +static int fsd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + FtSizeData *hd = GDrawGetUserData(gw); + hd->done = true; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +void CVFtPpemDlg(CharView *cv,int debug) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[10]; + GTextInfo label[10]; + FtSizeData fsd; + char buffer[20], buffer2[20]; + + memset(&fsd,0,sizeof(fsd)); + fsd.cv = cv; + fsd.debug = debug; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<ft_pointsize ); + label[1].text = (unichar_t *) buffer; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 57; gcd[1].gd.pos.y = 17+5; gcd[1].gd.pos.width = 40; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].gd.cid = CID_PointSize; + gcd[1].creator = GTextFieldCreate; + + label[2].text = (unichar_t *) _STR_DPI; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 110; gcd[2].gd.pos.y = 17+5+6; + gcd[2].gd.flags = gg_enabled|gg_visible; + gcd[2].creator = GLabelCreate; + + sprintf( buffer2, "%d", cv->ft_dpi ); + label[3].text = (unichar_t *) buffer2; + label[3].text_is_1byte = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 140; gcd[3].gd.pos.y = 17+5; gcd[3].gd.pos.width = 40; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].gd.cid = CID_DPI; + gcd[3].creator = GTextFieldCreate; + + gcd[4].gd.pos.x = 20-3; gcd[4].gd.pos.y = 17+37; + gcd[4].gd.pos.width = -1; gcd[4].gd.pos.height = 0; + gcd[4].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[4].text = (unichar_t *) _STR_OK; + label[4].text_in_resource = true; + gcd[4].gd.mnemonic = 'O'; + gcd[4].gd.label = &label[4]; + gcd[4].gd.handle_controlevent = FtPpem_OK; + gcd[4].creator = GButtonCreate; + + gcd[5].gd.pos.x = -20; gcd[5].gd.pos.y = 17+37+3; + gcd[5].gd.pos.width = -1; gcd[5].gd.pos.height = 0; + gcd[5].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[5].text = (unichar_t *) _STR_Cancel; + label[5].text_in_resource = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.mnemonic = 'C'; + gcd[5].gd.handle_controlevent = FtPpem_Cancel; + gcd[5].creator = GButtonCreate; + + label[6].text = (unichar_t *) (debug ? _STR_Debug : _STR_ShowGridFit); + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.pos.x = 17; gcd[6].gd.pos.y = 4; + gcd[6].gd.flags = gg_enabled|gg_visible; + if ( !cv->show_ft_results || debug ) + gcd[6].gd.flags |= gg_cb_on; + gcd[6].gd.cid = CID_ShowGrid; + gcd[6].creator = GCheckBoxCreate; + + label[7].text = (unichar_t *) _STR_Debugfpgm; + label[7].text_in_resource = true; + gcd[7].gd.label = &label[7]; + gcd[7].gd.pos.x = 80; gcd[7].gd.pos.y = 4; + gcd[7].gd.flags = debug ? (gg_enabled|gg_visible) : 0; + if ( last_fpgm ) + gcd[7].gd.flags |= gg_cb_on; + gcd[7].gd.cid = CID_Debugfpgm; + gcd[7].creator = GCheckBoxCreate; + + gcd[8].gd.pos.x = 5; gcd[8].gd.pos.y = 17+31; + gcd[8].gd.pos.width = 190-10; + gcd[8].gd.flags = gg_enabled|gg_visible; + gcd[8].creator = GLineCreate; + + GGadgetsCreate(gw,gcd); + + GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_PointSize)); + GTextFieldSelect(GWidgetGetControl(gw,CID_PointSize),0,-1); + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !fsd.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); +} diff --git a/fontforge/cvhand.c b/fontforge/cvhand.c new file mode 100644 index 00000000..9de8bb15 --- /dev/null +++ b/fontforge/cvhand.c @@ -0,0 +1,45 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include + + +void CVMouseDownHand(CharView *cv) { + cv->handscroll_base.x = cv->p.x; + cv->handscroll_base.y = cv->p.y; +} + +void CVMouseMoveHand(CharView *cv, GEvent *event) { + cv->xoff += event->u.mouse.x-cv->handscroll_base.x; cv->handscroll_base.x = event->u.mouse.x; + cv->yoff -= event->u.mouse.y-cv->handscroll_base.y; cv->handscroll_base.y = event->u.mouse.y; + GScrollBarSetPos(cv->hsb,-cv->xoff); + GScrollBarSetPos(cv->vsb,cv->yoff-cv->height); + GDrawRequestExpose(cv->v,NULL,false); +} + +void CVMouseUpHand(CharView *cv) { +} diff --git a/fontforge/cvhints.c b/fontforge/cvhints.c new file mode 100644 index 00000000..19c2ee91 --- /dev/null +++ b/fontforge/cvhints.c @@ -0,0 +1,855 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "ustring.h" + +int CVTwoForePointsSelected(CharView *cv, SplinePoint **sp1, SplinePoint **sp2) { + SplineSet *spl; + SplinePoint *test, *sps[2], *first; + int cnt; + + if ( sp1!=NULL ) { *sp1 = NULL; *sp2 = NULL; } + if ( cv->drawmode!=dm_fore ) +return( false ) ; + cnt = 0; + for ( spl = cv->sc->layers[ly_fore].splines; spl!=NULL; spl = spl->next ) { + first = NULL; + for ( test = spl->first; test!=first; test = test->next->to ) { + if ( test->selected ) { + if ( cnt>=2 ) +return( false ); + sps[cnt++] = test; + } + if ( first == NULL ) first = test; + if ( test->next==NULL ) + break; + } + } + if ( cnt==2 ) { + if ( sp1!=NULL ) { *sp1 = sps[0]; *sp2 = sps[1]; } +return( true ); + } else if ( cnt==1 ) + if ( sp1!=NULL ) *sp1 = sps[0]; + /* But still return false */; +return( false ); +} + +static int DiagCheck(SplinePoint *sp1, SplinePoint *sp2, Spline *s1, Spline *s2, + SplinePoint **sp3, SplinePoint **sp4 ) { + + if ( s1==NULL || s2==NULL || !s1->knownlinear || !s2->knownlinear ) +return( false ); + *sp3 = s1->from==sp1?s1->to:s1->from; + *sp4 = s2->from==sp2?s2->to:s2->from; + if ( *sp3==sp2 || *sp4==sp1 || *sp3==*sp4 ) +return( false ); + + /* No horizontal,vertical edges */ + if ( sp1->me.x == (*sp3)->me.x || sp1->me.y==(*sp3)->me.y || + sp2->me.x == (*sp4)->me.x || sp2->me.y==(*sp4)->me.y ) +return( false ); + + /* Consistanly ordered */ + if (( (sp1->me.y>(*sp3)->me.y) && (sp2->me.y<(*sp4)->me.y)) || + ( (sp1->me.y<(*sp3)->me.y) && (sp2->me.y>(*sp4)->me.y)) ) +return ( false ); + + /* Similar slopes */ +return( RealApprox((sp1->me.y-(*sp3)->me.y)/(sp1->me.x-(*sp3)->me.x), + (sp2->me.y-(*sp4)->me.y)/(sp2->me.x-(*sp4)->me.x)) ); +} + +int CVIsDiagonalable(SplinePoint *sp1, SplinePoint *sp2, SplinePoint **sp3, SplinePoint **sp4) { + + if ( sp1==NULL || sp2==NULL ) +return( false ); + +return( DiagCheck(sp1,sp2,sp1->next,sp2->next,sp3,sp4) || + DiagCheck(sp1,sp2,sp1->next,sp2->prev,sp3,sp4) || + DiagCheck(sp1,sp2,sp1->prev,sp2->next,sp3,sp4) || + DiagCheck(sp1,sp2,sp1->prev,sp2->prev,sp3,sp4)); +} + + +#define CID_Base 1001 +#define CID_Width 1002 +#define CID_Label 1003 +#define CID_HStem 1004 +#define CID_VStem 1005 +#define CID_Next 1006 +#define CID_Prev 1007 +#define CID_Remove 1008 +#define CID_Add 1009 +#define CID_Overlap 1010 +#define CID_Count 1011 +#define CID_MovePoints 1012 + +typedef struct reviewhintdata { + unsigned int done: 1; + unsigned int ishstem: 1; + unsigned int oldmanual: 1; + unsigned int undocreated: 1; + unsigned int changed: 1; + CharView *cv; + GWindow gw; + StemInfo *active; + StemInfo *lastactive; + StemInfo *oldh, *oldv; +} ReviewHintData; + +static void RH_SetNextPrev(ReviewHintData *hd) { + if ( hd->active==NULL ) { + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Next),false); + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Prev),false); + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Remove),false); + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Base),false); + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Width),false); + } else { + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Remove),true); + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Base),true); + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Width),true); + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Next),hd->active->next!=NULL); + if ( hd->ishstem ) + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Prev),hd->active!=hd->cv->sc->hstem); + else + GGadgetSetEnabled(GWidgetGetControl(hd->gw,CID_Prev),hd->active!=hd->cv->sc->vstem); + } + GDrawRequestExpose(hd->gw,NULL,false); +} + +static void RH_SetupHint(ReviewHintData *hd) { + char buffer[20]; unichar_t ubuf[20]; + static unichar_t nullstr[] = {'\0'}; + StemInfo *h; + int pos,cnt; + + if ( hd->lastactive!=NULL ) + hd->lastactive->active = false; + + pos = cnt = 0; + for ( h=hd->ishstem ? hd->cv->sc->hstem : hd->cv->sc->vstem; h!=NULL; h=h->next ) { + ++cnt; + if ( h==hd->active ) pos=cnt; + } + sprintf( buffer,"%d/%d", pos, cnt ); + if ( cnt==3 ) { + StemInfo *h2, *h3; + h = hd->ishstem ? hd->cv->sc->hstem : hd->cv->sc->vstem; + h2 = h->next; h3 = h2->next; + if ( h->width == h2->width && h2->width==h3->width && + h2->start-h->start == h3->start-h2->start ) + strcat( buffer, hd->ishstem ? " hstem3" : " vstem3" ); + } + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Count),ubuf); + + if ( hd->active==NULL ) { + GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Base),nullstr); + GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Width),nullstr); + GGadgetSetVisible(GWidgetGetControl(hd->gw,CID_Overlap),false); + } else { + hd->active->active = true; + sprintf( buffer,"%g", hd->active->start ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Base),ubuf); + GTextFieldShow(GWidgetGetControl(hd->gw,CID_Base),0); + sprintf( buffer,"%g", hd->active->width ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(hd->gw,CID_Width),ubuf); + GTextFieldShow(GWidgetGetControl(hd->gw,CID_Width),0); + GGadgetSetVisible(GWidgetGetControl(hd->gw,CID_Overlap),hd->active->hasconflicts); + } + if ( hd->lastactive!=hd->active ) { + hd->lastactive = hd->active; + SCOutOfDateBackground(hd->cv->sc); + SCUpdateAll(hd->cv->sc); /* Changing the active Hint means we should redraw everything */ + } + RH_SetNextPrev(hd); +} + +static int OnHint(StemInfo *hint,real major,real minor) { + HintInstance *hi; + + if ( true /*hint->hasconflicts*/ ) { + for ( hi=hint->where; hi!=NULL; hi=hi->next ) { + if ( minor>=hi->begin && minor<=hi->end ) + break; + } + if ( hi==NULL ) +return( 0 ); + /* Ok, it's active */ + } + if ( major==hint->start ) +return( 1 ); + else if ( major==hint->start+hint->width ) +return( 2 ); + +return( 0 ); +} + +static void RH_MovePoints(ReviewHintData *hd,StemInfo *active,int start,int width) { + SplineChar *sc = hd->cv->sc; + SplineSet *spl; + SplinePoint *sp; + int which; + + if ( !hd->undocreated ) { + SCPreserveState(sc,false); + hd->undocreated = true; + } + + for ( spl=sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp = spl->first ; ; ) { + if ( hd->ishstem ) { + switch ((which = OnHint(active,sp->me.y,sp->me.x)) ) { + case 1: + sp->nextcp.y += start-sp->me.y; + sp->prevcp.y += start-sp->me.y; + sp->me.y = start; + break; + case 2: + sp->nextcp.y += start+width-sp->me.y; + sp->prevcp.y += start+width-sp->me.y; + sp->me.y = start+width; + break; + case 0: + /* Not on hint */; + break; + } + } else { + switch ( (which = OnHint(active,sp->me.x,sp->me.y)) ) { + case 1: + sp->nextcp.x += start-sp->me.x; + sp->prevcp.x += start-sp->me.x; + sp->me.x = start; + break; + case 2: + sp->nextcp.x += start+width-sp->me.x; + sp->prevcp.x += start+width-sp->me.x; + sp->me.x = start+width; + break; + case 0: + /* Not on hint */; + break; + } + } + if ( which ) { + if ( sp->prev ) + SplineRefigure(sp->prev); + if ( sp->next ) + SplineRefigure(sp->next); + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp== spl->first ) + break; + } + } +} + +static int RH_TextChanged(GGadget *g, GEvent *e) { + int wasconflict; + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + ReviewHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + if ( hd->active!=NULL ) { + int cid = GGadgetGetCid(g); + int err=0; + int val = GetIntR(hd->gw,cid,cid==CID_Base?_STR_Base:_STR_Size,&err); + if ( err ) +return( true ); + if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_MovePoints)) ) { + RH_MovePoints(hd,hd->active, + cid==CID_Base?val:hd->active->start, + cid==CID_Base?hd->active->width:val); + } + if ( cid==CID_Base ) + hd->active->start = val; + else + hd->active->width = val; + wasconflict = hd->active->hasconflicts; + if ( hd->ishstem ) + hd->cv->sc->hconflicts = StemListAnyConflicts(hd->cv->sc->hstem); + else + hd->cv->sc->vconflicts = StemListAnyConflicts(hd->cv->sc->vstem); + hd->cv->sc->manualhints = true; + hd->changed = true; + if ( wasconflict!=hd->active->hasconflicts ) + GGadgetSetVisible(GWidgetGetControl(hd->gw,CID_Overlap),hd->active->hasconflicts); + SCOutOfDateBackground(hd->cv->sc); + SCUpdateAll(hd->cv->sc); + } + } +return( true ); +} + +static int RH_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ReviewHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + StemInfosFree(hd->oldh); + StemInfosFree(hd->oldv); + if ( hd->lastactive!=NULL ) + hd->lastactive->active = false; + if ( hd->changed ) + SCClearHintMasks(hd->cv->sc,true); + /* Everything else got done as we went along... */ + SCOutOfDateBackground(hd->cv->sc); + SCUpdateAll(hd->cv->sc); + hd->done = true; + } +return( true ); +} + +static void DoCancel(ReviewHintData *hd) { + StemInfosFree(hd->cv->sc->hstem); + StemInfosFree(hd->cv->sc->vstem); + hd->cv->sc->hstem = hd->oldh; + hd->cv->sc->vstem = hd->oldv; + hd->cv->sc->hconflicts = StemListAnyConflicts(hd->cv->sc->hstem); + hd->cv->sc->vconflicts = StemListAnyConflicts(hd->cv->sc->vstem); + hd->cv->sc->manualhints = hd->oldmanual; + if ( hd->undocreated ) + SCDoUndo(hd->cv->sc,ly_fore); + SCOutOfDateBackground(hd->cv->sc); + SCUpdateAll(hd->cv->sc); + hd->done = true; +} + +static int RH_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + DoCancel( GDrawGetUserData(GGadgetGetWindow(g))); + } +return( true ); +} + +static int RH_Remove(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ReviewHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + StemInfo *prev; + if ( hd->active==NULL ) +return( true ); /* Eh? */ + if ( hd->active==hd->cv->sc->hstem ) { + hd->cv->sc->hstem = hd->active->next; + prev = hd->cv->sc->hstem; + } else if ( hd->active==hd->cv->sc->vstem ) { + hd->cv->sc->vstem = hd->active->next; + prev = hd->cv->sc->vstem; + } else { + prev = hd->ishstem ? hd->cv->sc->hstem : hd->cv->sc->vstem; + for ( ; prev->next!=hd->active && prev->next!=NULL; prev = prev->next ); + prev->next = hd->active->next; + } + if ( hd->ishstem ) + hd->cv->sc->hconflicts = StemListAnyConflicts(hd->cv->sc->hstem); + else + hd->cv->sc->vconflicts = StemListAnyConflicts(hd->cv->sc->vstem); + hd->cv->sc->manualhints = true; + hd->changed = true; + StemInfoFree( hd->active ); + hd->active = prev; + SCOutOfDateBackground(hd->cv->sc); + RH_SetupHint(hd); + /*SCUpdateAll(hd->cv->sc);*/ /* Done in RH_SetupHint now */ + } +return( true ); +} + +static int RH_Add(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ReviewHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + CVCreateHint(hd->cv,hd->ishstem); + hd->active = hd->ishstem ? hd->cv->sc->hstem : hd->cv->sc->vstem; + RH_SetupHint(hd); + } +return( true ); +} + +static int RH_NextPrev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ReviewHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + StemInfo *prev; + if ( GGadgetGetCid(g)==CID_Next ) { + if ( hd->active->next !=NULL ) + hd->active = hd->active->next; + } else { + prev = hd->ishstem ? hd->cv->sc->hstem : hd->cv->sc->vstem; + for ( ; prev->next!=hd->active && prev->next!=NULL; prev = prev->next ); + hd->active = prev; + } + RH_SetupHint(hd); + } +return( true ); +} + +static int RH_HVStem(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + ReviewHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + hd->ishstem = GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_HStem)); + hd->active = hd->ishstem ? hd->cv->sc->hstem : hd->cv->sc->vstem; + RH_SetupHint(hd); + } +return( true ); +} + +static int rh_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + DoCancel( GDrawGetUserData(gw)); + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +void CVReviewHints(CharView *cv) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[17]; + GTextInfo label[17]; + static ReviewHintData hd; + + hd.done = false; + hd.cv = cv; + + if ( hd.gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<sc->hstem==NULL && cv->sc->vstem==NULL ) + hd.active = NULL; + else if ( cv->sc->hstem!=NULL && cv->sc->vstem!=NULL ) { + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_HStem))) + hd.active = cv->sc->hstem; + else + hd.active = cv->sc->vstem; + } else if ( cv->sc->hstem!=NULL ) { + GGadgetSetChecked(GWidgetGetControl(gw,CID_HStem),true); + hd.active = cv->sc->hstem; + } else { + GGadgetSetChecked(GWidgetGetControl(gw,CID_VStem),true); + hd.active = cv->sc->vstem; + } + hd.ishstem = (hd.active==cv->sc->hstem); + hd.oldh = StemInfoCopy(cv->sc->hstem); + hd.oldv = StemInfoCopy(cv->sc->vstem); + hd.oldmanual = cv->sc->manualhints; + hd.changed = false; + RH_SetupHint(&hd); + if ( hd.active!=NULL ) { + GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Base)); + GTextFieldSelect(GWidgetGetControl(gw,CID_Base),0,-1); + } + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !hd.done ) + GDrawProcessOneEvent(NULL); + GDrawSetVisible(gw,false); +} + +typedef struct createhintdata { + unsigned int done: 1; + unsigned int ishstem: 1; + CharView *cv; + GWindow gw; +} CreateHintData; + +static int CH_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CreateHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + int base, width; + int err = 0; + StemInfo *h; + + base = GetIntR(hd->gw,CID_Base,_STR_Base,&err); + width = GetIntR(hd->gw,CID_Width,_STR_Size,&err); + if ( err ) +return(true); + h = chunkalloc(sizeof(StemInfo)); + h->start = base; + h->width = width; + if ( hd->ishstem ) { + SCGuessHHintInstancesAndAdd(hd->cv->sc,h,0x80000000,0x80000000); + hd->cv->sc->hconflicts = StemListAnyConflicts(hd->cv->sc->hstem); + } else { + SCGuessVHintInstancesAndAdd(hd->cv->sc,h,0x80000000,0x80000000); + hd->cv->sc->vconflicts = StemListAnyConflicts(hd->cv->sc->vstem); + } + hd->cv->sc->manualhints = true; + SCClearHintMasks(hd->cv->sc,true); + SCOutOfDateBackground(hd->cv->sc); + SCUpdateAll(hd->cv->sc); + hd->done = true; + } +return( true ); +} + +static int CH_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CreateHintData *hd = GDrawGetUserData(GGadgetGetWindow(g)); + hd->done = true; + } +return( true ); +} + +static int chd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + CreateHintData *hd = GDrawGetUserData(gw); + hd->done = true; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +void CVCreateHint(CharView *cv,int ishstem) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + static CreateHintData chd; + char buffer[20]; unichar_t ubuf[20]; + + chd.done = false; + chd.ishstem = ishstem; + chd.cv = cv; + + if ( chd.gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<p.cy : cv->p.cx ); + label[1].text = (unichar_t *) buffer; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 37; gcd[1].gd.pos.y = 17+5; gcd[1].gd.pos.width = 40; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].gd.cid = CID_Base; + gcd[1].creator = GTextFieldCreate; + + label[2].text = (unichar_t *) _STR_Size; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 90; gcd[2].gd.pos.y = 17+5+6; + gcd[2].gd.flags = gg_enabled|gg_visible; + gcd[2].creator = GLabelCreate; + + label[3].text = (unichar_t *) "60"; + label[3].text_is_1byte = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 120; gcd[3].gd.pos.y = 17+5; gcd[3].gd.pos.width = 40; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].gd.cid = CID_Width; + gcd[3].creator = GTextFieldCreate; + + gcd[4].gd.pos.x = 20-3; gcd[4].gd.pos.y = 17+37; + gcd[4].gd.pos.width = -1; gcd[4].gd.pos.height = 0; + gcd[4].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[4].text = (unichar_t *) _STR_OK; + label[4].text_in_resource = true; + gcd[4].gd.mnemonic = 'O'; + gcd[4].gd.label = &label[4]; + gcd[4].gd.handle_controlevent = CH_OK; + gcd[4].creator = GButtonCreate; + + gcd[5].gd.pos.x = -20; gcd[5].gd.pos.y = 17+37+3; + gcd[5].gd.pos.width = -1; gcd[5].gd.pos.height = 0; + gcd[5].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[5].text = (unichar_t *) _STR_Cancel; + label[5].text_in_resource = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.mnemonic = 'C'; + gcd[5].gd.handle_controlevent = CH_Cancel; + gcd[5].creator = GButtonCreate; + + label[6].text = (unichar_t *) _STR_CreateHorizontalHint; /* Initialize to bigger size */ + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.pos.x = 17; gcd[6].gd.pos.y = 5; + gcd[6].gd.flags = gg_enabled|gg_visible; + gcd[6].gd.cid = CID_Label; + gcd[6].creator = GLabelCreate; + + gcd[7].gd.pos.x = 5; gcd[7].gd.pos.y = 17+31; + gcd[7].gd.pos.width = 170-10; + gcd[7].gd.flags = gg_enabled|gg_visible; + gcd[7].creator = GLineCreate; + + GGadgetsCreate(gw,gcd); + } else { + gw = chd.gw; + sprintf( buffer, "%g", ishstem ? cv->p.cy : cv->p.cx ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(gw,CID_Base),ubuf); + } + GGadgetSetTitle(GWidgetGetControl(gw,CID_Label),GStringGetResource( + ishstem ? _STR_CreateHorizontalHint : _STR_CreateVerticalHint,NULL)); + GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Base)); + GTextFieldSelect(GWidgetGetControl(gw,CID_Base),0,-1); + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !chd.done ) + GDrawProcessOneEvent(NULL); + GDrawSetVisible(gw,false); +} + +void SCClearRounds(SplineChar *sc) { + SplineSet *ss; + SplinePoint *sp; + + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sp->roundx = sp->roundy = false; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +} + +void SCRemoveSelectedMinimumDistances(SplineChar *sc,int inx) { + /* Remove any minimum distance where at least one of the two points is */ + /* selected */ + MinimumDistance *md, *prev, *next; + SplineSet *ss; + SplinePoint *sp; + + prev = NULL; + for ( md = sc->md; md!=NULL; md = next ) { + next = md->next; + if ( (inx==2 || inx==md->x) && + ((md->sp1!=NULL && md->sp1->selected) || + (md->sp2!=NULL && md->sp2->selected))) { + if ( prev==NULL ) + sc->md = next; + else + prev->next = next; + chunkfree(md,sizeof(MinimumDistance)); + } else + prev = md; + } + + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->selected ) { + if ( inx==2 ) sp->roundx = sp->roundy = false; + else if ( inx==1 ) sp->roundx = false; + else sp->roundy = false; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +} diff --git a/fontforge/cvimages.c b/fontforge/cvimages.c new file mode 100644 index 00000000..2197a692 --- /dev/null +++ b/fontforge/cvimages.c @@ -0,0 +1,1466 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include +#include +#include "sd.h" + + +static unichar_t wildimg[] = { '*', '.', '{', +#ifndef _NO_LIBUNGIF +'g','i','f',',', +#endif +#ifndef _NO_LIBPNG +'p','n','g',',', +#endif +#ifndef _NO_LIBTIFF +'t','i','f','f',',', +'t','i','f',',', +#endif +'x','b','m',',', 'b','m','p', '}', '\0' }; +static unichar_t wildtemplate[] = { '{','u','n','i',',','u',',','c','i','d',',','e','n','c','}','[','0','-','9','a','-','f','A','-','F',']','*', '.', '{', +#ifndef _NO_LIBUNGIF +'g','i','f',',', +#endif +#ifndef _NO_LIBPNG +'p','n','g',',', +#endif +#ifndef _NO_LIBTIFF +'t','i','f','f',',', +'t','i','f',',', +#endif +'x','b','m',',', 'b','m','p', '}', '\0' }; +/* Hmm. Mac seems to use the extension 'art' for eps files sometimes */ +static unichar_t wildepstemplate[] = { '{','u','n','i',',','u',',','c','i','d',',','e','n','c','}','[','0','-','9','a','-','f','A','-','F',']','*', '.', '{', 'p','s',',', 'e','p','s',',','a','r','t','}', 0 }; +static unichar_t wildsvgtemplate[] = { '{','u','n','i',',','u',',','c','i','d',',','e','n','c','}','[','0','-','9','a','-','f','A','-','F',']','*', '.', 's', 'v','g', 0 }; +static unichar_t wildps[] = { '*', '.', '{', 'p','s',',', 'e','p','s',',', 'a','r','t','}', '\0' }; +static unichar_t wildsvg[] = { '*', '.', 's','v','g', '\0' }; +static unichar_t wildfig[] = { '*', '.', '{', 'f','i','g',',','x','f','i','g','}', '\0' }; +static unichar_t wildbdf[] = { '*', '.', 'b', 'd','{', 'f', ',','f','.','g','z',',','f','.','Z',',','f','.','b','z','2','}', '\0' }; +static unichar_t wildpcf[] = { '*', '.', 'p', 'c','{', 'f', ',','f','.','g','z',',','f','.','Z',',','f','.','b','z','2','}', '\0' }; +static unichar_t wildttf[] = { '*', '.', '{', 't', 't','f',',','o','t','f',',','o','t','b',',','t','t','c','}', '\0' }; +static unichar_t wildpk[] = { '*', '{', 'p', 'k', ',', 'g', 'f', '}', '\0' }; /* pk fonts can have names like cmr10.300pk, not a normal extension */ +static unichar_t wildmac[] = { '*', '{', 'b', 'i', 'n', ',', 'h', 'q', 'x', ',', 'd','f','o','n','t', '}', '\0' }; /* pk fonts can have names like cmr10.300pk, not a normal extension */ +static unichar_t wildwin[] = { '*', '{', 'f', 'o', 'n', ',', 'f', 'n', 't', '}', '\0' }; /* pk fonts can have names like cmr10.300pk, not a normal extension */ +static unichar_t *wildchr[] = { wildimg, wildps, +#ifndef _NO_LIBXML +wildsvg, +#endif +wildfig }; +static unichar_t *wildfnt[] = { wildbdf, wildttf, wildpk, wildpcf, wildmac, wildwin, wildimg, wildtemplate, wildps, wildepstemplate +#ifndef _NO_LIBXML +, wildsvg, wildsvgtemplate +#endif +}; + +#define PSSF_Width 220 +#define PSSF_Height 165 + +static int PSSF_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) + *(int *) GDrawGetUserData(GGadgetGetWindow(g)) = true; +return( true ); +} + +static int psstrokeflags_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + *(int *) GDrawGetUserData(gw) = true; + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("filemenu.html#type3-import"); +return( true ); + } +return( false ); + } +return( true ); +} + +enum psstrokeflags PsStrokeFlagsDlg(void) { + static enum psstrokeflags oldflags = sf_correctdir|sf_removeoverlap/*|sf_handle_eraser*/; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[11]; + GTextInfo label[11]; + int done = false; + int k, rm_k, he_k, cd_k; + + if ( screen_display==NULL ) +return( oldflags ); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<next, ++cnt ); + pos = sc->layer_cnt; + if ( cnt==0 ) +return; + sc->layers = grealloc(sc->layers,(sc->layer_cnt+cnt)*sizeof(Layer)); + for ( pos = sc->layer_cnt, e=ent; e!=NULL ; e=enext, ++pos ) { + enext = e->next; + LayerDefault(&sc->layers[pos]); + sc->layers[pos].splines = NULL; + sc->layers[pos].refs = NULL; + sc->layers[pos].images = NULL; + if ( e->type == et_splines ) { + sc->layers[pos].dofill = e->u.splines.fill.col != 0xffffffff; + sc->layers[pos].dostroke = e->u.splines.stroke.col != 0xffffffff; + sc->layers[pos].fill_brush.col = e->u.splines.fill.col==0xffffffff ? COLOR_INHERITED : e->u.splines.fill.col; + sc->layers[pos].stroke_pen.brush.col = e->u.splines.stroke.col==0xffffffff ? COLOR_INHERITED : e->u.splines.stroke.col; + sc->layers[pos].stroke_pen.width = e->u.splines.stroke_width; + sc->layers[pos].stroke_pen.linejoin = e->u.splines.join; + sc->layers[pos].stroke_pen.linecap = e->u.splines.cap; + memcpy(sc->layers[pos].stroke_pen.trans, e->u.splines.transform, + 4*sizeof(real)); + sc->layers[pos].splines = e->u.splines.splines; + } + free(e); + } + sc->layer_cnt += cnt; + SCMoreLayers(sc); +} +#endif + +void SCImportPSFile(SplineChar *sc,int layer,FILE *ps,int doclear) { + SplinePointList *spl, *espl; + SplineSet **head; + + if ( ps==NULL ) +return; +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer && layer>ly_back ) { + SCAppendEntityLayers(sc, EntityInterpretPS(ps)); + } else +#endif + { + spl = SplinePointListInterpretPS(ps); + if ( spl==NULL ) { + GDrawError( "I'm sorry this file is too complex for me to understand"); +return; + } + if ( sc->parent->order2 ) + spl = SplineSetsConvertOrder(spl,true); + for ( espl=spl; espl->next!=NULL; espl = espl->next ); + if ( layer==ly_grid ) + head = &sc->parent->grid.splines; + else { + SCPreserveLayer(sc,layer,false); + head = &sc->layers[layer].splines; + } + if ( doclear ) + SplinePointListsFree(*head); + espl->next = *head; + *head = spl; + } + SCCharChangedUpdate(sc); +} + +static void ImportPS(CharView *cv,char *path) { + FILE *ps = fopen(path,"r"); + + if ( ps==NULL ) +return; + SCImportPSFile(cv->sc,CVLayer(cv),ps,false); + fclose(ps); +} + +static void SCImportPS(SplineChar *sc,char *path) { + FILE *ps = fopen(path,"r"); + + if ( ps==NULL ) +return; + SCImportPSFile(sc,ly_fore,ps,false); + fclose(ps); +} + +#ifndef _NO_LIBXML +void SCImportSVG(SplineChar *sc,int layer,char *path,int doclear) { + SplinePointList *spl, *espl, **head; + +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer && layer>ly_back ) { + SCAppendEntityLayers(sc, EntityInterpretSVG(path,sc->parent->ascent+sc->parent->descent, + sc->parent->ascent)); + } else +#endif + { + spl = SplinePointListInterpretSVG(path,sc->parent->ascent+sc->parent->descent, + sc->parent->ascent); + for ( espl = spl; espl!=NULL && espl->first->next==NULL; espl=espl->next ); + if ( espl!=NULL ) + if ( espl->first->next->order2!=sc->parent->order2 ) + spl = SplineSetsConvertOrder(spl,sc->parent->order2); + if ( spl==NULL ) { + GDrawError( "I'm sorry this file is too complex for me to understand"); +return; + } + for ( espl=spl; espl->next!=NULL; espl = espl->next ); + if ( layer==ly_grid ) + head = &sc->parent->grid.splines; + else { + SCPreserveLayer(sc,layer,false); + head = &sc->layers[layer].splines; + } + if ( doclear ) + SplinePointListsFree(*head); + espl->next = *head; + *head = spl; + } + SCCharChangedUpdate(sc); +} + +static void ImportSVG(CharView *cv,char *path) { + SCImportSVG(cv->sc,CVLayer(cv),path,false); +} +#endif + +/**************************** Fig File Import *********************************/ + +static BasePoint *slurppoints(FILE *fig,SplineFont *sf,int cnt ) { + BasePoint *bps = galloc((cnt+1)*sizeof(BasePoint)); /* spline code may want to add another point */ + int x, y, i, ch; + real scale = sf->ascent/(8.5*1200.0); + real ascent = 11*1200*sf->ascent/(sf->ascent+sf->descent); + + for ( i = 0; inextcp.x = sp->me.x - len*ss; sp->nextcp.y = sp->me.y + len*sc; + ep->prevcp.x = ep->me.x + len*es; ep->prevcp.y = ep->me.y - len*ec; + sp->nonextcp = ep->noprevcp = false; + SplineMake3(sp,ep); +return( ep ); +} + +static SplineSet * slurparc(FILE *fig,SplineChar *sc, SplineSet *sofar) { + int ch; + int sub, dir, fa, ba; /* 0 clockwise, 1 counter */ + float cx, cy, r, sa, ea, ma; + float sx,sy,ex,ey; + int _sx,_sy,_ex,_ey; + SplinePoint *sp, *ep; + SplinePointList *spl; + real scale = sc->parent->ascent/(8.5*1200.0); + real ascent = 11*1200*sc->parent->ascent/(sc->parent->ascent+sc->parent->descent); + + fscanf(fig, "%d %*d %*d %*d %*d %*d %*d %*d %*f %*d %d %d %d %f %f %d %d %*d %*d %d %d", + &sub, &dir, &fa, &ba, &cx, &cy, &_sx, &_sy, &_ex, &_ey ); + while ((ch=getc(fig))!='\n' && ch!=EOF); + /* I ignore arrow lines */ + if ( fa ) + while ((ch=getc(fig))!='\n' && ch!=EOF); + if ( ba ) + while ((ch=getc(fig))!='\n' && ch!=EOF); + sx = _sx*scale; sy = (ascent-_sy)*scale; ex = _ex*scale; ey=(ascent-_ey)*scale; cx*=scale; cy=(ascent-cy)*scale; + r = sqrt( (sx-cx)*(sx-cx) + (sy-cy)*(sy-cy) ); + sa = atan2(sy-cy,sx-cx); + ea = atan2(ey-cy,ex-cx); + + spl = chunkalloc(sizeof(SplinePointList)); + spl->next = sofar; + spl->first = sp = SplinePointCreate(sx,sy); + spl->last = ep = SplinePointCreate(ex,ey); + + if ( dir==0 ) { /* clockwise */ + if ( ea>sa ) ea -= 2*3.1415926535897932; + ma=ceil(sa/(3.1415926535897932/2)-1)*(3.1415926535897932/2); + if ( RealNearish( sa,ma )) ma -= (3.1415926535897932/2); + while ( ma > ea ) { + sp = ArcSpline(sp,sa,NULL,ma,cx,cy,r); + sa = ma; + ma -= (3.1415926535897932/2); + } + sp = ArcSpline(sp,sa,ep,ea,cx,cy,r); + } else { /* counterclockwise */ + if ( eaparent; + real scale = sf->ascent/(8.5*1200.0); + real ascent = 11*1200*sf->ascent/(sf->ascent+sf->descent); + /* I ignore the angle */ + + fscanf(fig, "%d %*d %*d %*d %*d %*d %*d %*d %*f %d %f %d %d %d %d %*d %*d %*d %*d", + &sub, &dir, &angle, &cx, &cy, &rx, &ry ); + while ((ch=getc(fig))!='\n' && ch!=EOF); + + dcx = cx*scale; dcy = (ascent-cy)*scale; + drx = rx*scale; dry = ry*scale; + + spl = chunkalloc(sizeof(SplinePointList)); + spl->next = sofar; + spl->first = sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = dcx; sp->me.y = dcy+dry; + sp->nextcp.x = sp->me.x + .552*drx; sp->nextcp.y = sp->me.y; + sp->prevcp.x = sp->me.x - .552*drx; sp->prevcp.y = sp->me.y; + spl->last = sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = dcx+drx; sp->me.y = dcy; + sp->nextcp.x = sp->me.x; sp->nextcp.y = sp->me.y - .552*dry; + sp->prevcp.x = sp->me.x; sp->prevcp.y = sp->me.y + .552*dry; + SplineMake3(spl->first,sp); + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = dcx; sp->me.y = dcy-dry; + sp->nextcp.x = sp->me.x - .552*drx; sp->nextcp.y = sp->me.y; + sp->prevcp.x = sp->me.x + .552*drx; sp->prevcp.y = sp->me.y; + SplineMake3(spl->last,sp); + spl->last = sp; + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = dcx-drx; sp->me.y = dcy; + sp->nextcp.x = sp->me.x; sp->nextcp.y = sp->me.y + .552*dry; + sp->prevcp.x = sp->me.x; sp->prevcp.y = sp->me.y - .552*dry; + SplineMake3(spl->last,sp); + SplineMake3(sp,spl->first); + spl->last = spl->first; +return( spl ); +} + +static SplineSet * slurppolyline(FILE *fig,SplineChar *sc, SplineSet *sofar) { + int ch; + int sub, cnt, fa, ba, radius; /* radius of roundrects (sub==4) */ + BasePoint *bps; + BasePoint topleft, bottomright; + SplinePointList *spl=NULL; + SplinePoint *sp; + int i; + + fscanf(fig, "%d %*d %*d %*d %*d %*d %*d %*d %*f %*d %*d %d %d %d %d", + &sub, &radius, &fa, &ba, &cnt ); + /* sub==1 => polyline, 2=>box, 3=>polygon, 4=>arc-box, 5=>imported eps bb */ + while ((ch=getc(fig))!='\n' && ch!=EOF); + /* I ignore arrow lines */ + if ( fa ) + while ((ch=getc(fig))!='\n' && ch!=EOF); + if ( ba ) + while ((ch=getc(fig))!='\n' && ch!=EOF); + bps = slurppoints(fig,sc->parent,cnt); + if ( sub==5 ) /* skip picture line */ + while ((ch=getc(fig))!='\n' && ch!=EOF); + else { + if ( sub!=1 && bps[cnt-1].x==bps[0].x && bps[cnt-1].y==bps[0].y ) + --cnt; + spl = chunkalloc(sizeof(SplinePointList)); + if ( cnt==4 && sub==4/*arc-box*/ && radius!=0 ) { + SplineFont *sf = sc->parent; + real scale = sf->ascent/(8.5*80.0), r = radius*scale; /* radii are scaled differently */ + if ( bps[0].x>bps[2].x ) { + topleft.x = bps[2].x; + bottomright.x = bps[0].x; + } else { + topleft.x = bps[0].x; + bottomright.x = bps[2].x; + } + if ( bps[0].yfirst = SplinePointCreate(topleft.x,topleft.y-r); spl->first->pointtype = pt_tangent; + spl->first->nextcp.y += .552*r; spl->first->nonextcp = false; + spl->last = sp = SplinePointCreate(topleft.x+r,topleft.y); sp->pointtype = pt_tangent; + sp->prevcp.x -= .552*r; sp->noprevcp = false; + SplineMake3(spl->first,sp); + sp = SplinePointCreate(bottomright.x-r,topleft.y); sp->pointtype = pt_tangent; + sp->nextcp.x += .552*r; sp->nonextcp = false; + SplineMake3(spl->last,sp); spl->last = sp; + sp = SplinePointCreate(bottomright.x,topleft.y-r); sp->pointtype = pt_tangent; + sp->prevcp.y += .552*r; sp->noprevcp = false; + SplineMake3(spl->last,sp); spl->last = sp; + sp = SplinePointCreate(bottomright.x,bottomright.y+r); sp->pointtype = pt_tangent; + sp->nextcp.y -= .552*r; sp->nonextcp = false; + SplineMake3(spl->last,sp); spl->last = sp; + sp = SplinePointCreate(bottomright.x-r,bottomright.y); sp->pointtype = pt_tangent; + sp->prevcp.x += .552*r; sp->noprevcp = false; + SplineMake3(spl->last,sp); spl->last = sp; + sp = SplinePointCreate(topleft.x+r,bottomright.y); sp->pointtype = pt_tangent; + sp->nextcp.x -= .552*r; sp->nonextcp = false; + SplineMake3(spl->last,sp); spl->last = sp; + sp = SplinePointCreate(topleft.x,bottomright.y+r); sp->pointtype = pt_tangent; + sp->prevcp.y -= .552*r; sp->noprevcp = false; + SplineMake3(spl->last,sp); spl->last = sp; + } else { + for ( i=0; ime = sp->nextcp = sp->prevcp = bps[i]; + sp->nonextcp = sp->noprevcp = true; + sp->pointtype = pt_corner; + if ( spl->first==NULL ) + spl->first = sp; + else + SplineMake3(spl->last,sp); + spl->last = sp; + } + } + if ( sub!=1 ) { + SplineMake3(spl->last,spl->first); + spl->last = spl->first; + } + spl->next = sc->layers[ly_fore].splines; + spl->next = sofar; + } + free(bps); +return( spl ); +} + +/* http://dev.acm.org/pubs/citations/proceedings/graph/218380/p377-blanc/ */ +/* X-Splines: a spline model designed for the end-user */ +/* by Carole Blanc & Christophe Schlick */ +/* Also based on the helpful code fragment by Andreas Baerentzen */ +/* http://lin1.gk.dtu.dk/home/jab/software.html */ + +struct xspline { + int n; /* total number of control points */ + BasePoint *cp; /* an array of n control points */ + real *s; /* an array of n tension values */ + /* for a closed spline cp[0]==cp[n-1], but we may still need to wrap a bit*/ + unsigned int closed: 1; +}; + +static real g(real u, real q, real p) { +return( u * (q + u * (2*q + u *( 10-12*q+10*p + u * ( 2*p+14*q-15 + u*(6-5*q-p))))) ); +} + +static real h(real u, real q) { + /* The paper says that h(-1)==0, but the definition of h they give */ + /* doesn't do that. But if we negate the x^5 term it all works */ + /* (works for the higher derivatives too) */ +return( q*u * (1 + u * (2 - u * u * (u+2))) ); +} + +static void xsplineeval(BasePoint *ret,real t, struct xspline *xs) { + /* By choosing t to range between [0,n-1] we set delta in the article to 1*/ + /* and may therefore ignore it */ +#if 0 + if ( t>=0 && t<=xs->n-1 ) { +#endif + + /* For any value of t there are four possible points that might be */ + /* influencing things. These are cp[k], cp[k+1], cp[k+2], cp[k+3] */ + /* where k+1<=ts[k+1]>0?xs->s[k+1]:0); + real Tk1 = k+2 + (xs->s[k+2]>0?xs->s[k+2]:0); + real Tk2 = k+1 - (xs->s[k+1]>0?xs->s[k+1]:0); + real Tk3 = k+2 - (xs->s[k+2]>0?xs->s[k+2]:0); + /* Now each blending function has a "p" value that describes its shape*/ + real p0 = 2*(k-Tk0)*(k-Tk0); + real p1 = 2*(k+1-Tk1)*(k+1-Tk1); + real p2 = 2*(k+2-Tk2)*(k+2-Tk2); + real p3 = 2*(k+3-Tk3)*(k+3-Tk3); + /* and each negative tension blending function has a "q" value */ + real q0 = xs->s[k+1]<0?-xs->s[k+1]/2:0; + real q1 = xs->s[k+2]<0?-xs->s[k+2]/2:0; + real q2 = q0; + real q3 = q1; + /* the function f for positive s is the same as g if q==0 */ + real A0, A1, A2, A3; + if ( t<=Tk0 ) + A0 = g( (t-Tk0)/(k-Tk0), q0, p0); + else if ( q0>0 ) + A0 = h( (t-Tk0)/(k-Tk0), q0 ); + else + A0 = 0; + A1 = g( (t-Tk1)/(k+1-Tk1), q1, p1); + A2 = g( (t-Tk2)/(k+2-Tk2), q2, p2); + if ( t>=Tk3 ) + A3 = g( (t-Tk3)/(k+3-Tk3), q3, p3); + else if ( q3>0 ) + A3 = h( (t-Tk3)/(k+3-Tk3), q3 ); + else + A3 = 0; + k0 = k; k1=k+1; k2=k+2; k3=k+3; + if ( k<0 ) { k0=xs->n-2; if ( !xs->closed ) A0 = 0; } + if ( k3>=xs->n ) { k3 -= xs->n; if ( !xs->closed ) A3 = 0; } + if ( k2>=xs->n ) { k2 -= xs->n; if ( !xs->closed ) A2 = 0; } + ret->x = A0*xs->cp[k0].x + A1*xs->cp[k1].x + A2*xs->cp[k2].x + A3*xs->cp[k3].x; + ret->y = A0*xs->cp[k0].y + A1*xs->cp[k1].y + A2*xs->cp[k2].y + A3*xs->cp[k3].y; + ret->x /= (A0+A1+A2+A3); + ret->y /= (A0+A1+A2+A3); +#if 0 + } else + ret->x = ret->y = 0; +#endif +} + +static void AdjustTs(TPoint *mids,SplinePoint *from, SplinePoint *to) { + real len=0, sofar; + real lens[8]; + int i; + + lens[0] = sqrt((mids[0].x-from->me.x)*(mids[0].x-from->me.x) + + (mids[0].y-from->me.y)*(mids[0].y-from->me.y)); + lens[7] = sqrt((mids[6].x-to->me.x)*(mids[6].x-to->me.x) + + (mids[6].y-to->me.y)*(mids[6].y-to->me.y)); + for ( i=1; i<7; ++i ) + lens[i] = sqrt((mids[i].x-mids[i-1].x)*(mids[i].x-mids[i-1].x) + + (mids[i].y-mids[i-1].y)*(mids[i].y-mids[i-1].y)); + for ( len=0, i=0; i<8; ++i ) + len += lens[i]; + for ( sofar=0, i=0; i<7; ++i ) { + sofar += lens[i]; + mids[i].t = sofar/len; + } +} + +static SplineSet *ApproximateXSpline(struct xspline *xs,int order2) { + int i, j; + real t; + TPoint mids[7]; + SplineSet *spl = chunkalloc(sizeof(SplineSet)); + SplinePoint *sp; + + spl->first = spl->last = chunkalloc(sizeof(SplinePoint)); + xsplineeval(&spl->first->me,0,xs); + spl->first->pointtype = ( xs->s[0]==0 )?pt_corner:pt_curve; + for ( i=0; in-1; ++i ) { + if ( i==xs->n-2 && xs->closed ) + sp = spl->first; + else { + sp = chunkalloc(sizeof(SplinePoint)); + sp->pointtype = ( xs->s[i+1]==0 )?pt_corner:pt_curve; + xsplineeval(&sp->me,i+1,xs); + } + for ( j=0, t=1./8; jlast,sp); + ApproximateSplineFromPoints(spl->last,sp,mids,sizeof(mids)/sizeof(mids[0]),order2); + SPAverageCps(spl->last); + spl->last = sp; + } + if ( !xs->closed ) { + spl->first->noprevcp = spl->last->nonextcp = true; + spl->first->prevcp = spl->first->me; + spl->last->nextcp = spl->last->me; + } else + SPAverageCps(spl->first); +return( spl ); +} + +static SplineSet * slurpspline(FILE *fig,SplineChar *sc, SplineSet *sofar) { + int ch; + int sub, cnt, fa, ba; + SplinePointList *spl; + struct xspline xs; + int i; + + fscanf(fig, "%d %*d %*d %*d %*d %*d %*d %*d %*f %*d %d %d %d", + &sub, &fa, &ba, &cnt ); + while ((ch=getc(fig))!='\n' && ch!=EOF); + /* I ignore arrow lines */ + if ( fa ) + while ((ch=getc(fig))!='\n' && ch!=EOF); + if ( ba ) + while ((ch=getc(fig))!='\n' && ch!=EOF); + xs.n = cnt; + xs.cp = slurppoints(fig,sc->parent,cnt); + xs.s = galloc((cnt+1)*sizeof(real)); + xs.closed = (sub&1); + for ( i=0; iparent->order2); + + free(xs.cp); + free(xs.s); + + spl->next = sofar; +return( spl ); +} + +static SplineSet *slurpcompoundguts(FILE *fig,SplineChar *sc,SplineSet *sofar) { + int oc; + int ch; + + while ( 1 ) { + fscanf(fig,"%d",&oc); + if ( feof(fig) || oc==-6 ) +return(sofar); + switch ( oc ) { + case 6: + sofar = slurpcompound(fig,sc,sofar); + break; + case 0: + sofar = slurpcolor(fig,sc,sofar); + break; + case 1: + sofar = slurpelipse(fig,sc,sofar); + break; + case 5: + sofar = slurparc(fig,sc,sofar); + break; + case 2: + sofar = slurppolyline(fig,sc,sofar); + break; + case 3: + sofar = slurpspline(fig,sc,sofar); + break; + case 4: + default: + /* Text is also only one line */ + while ( (ch=getc(fig))!='\n' && ch!=EOF ); + break; + } + } +return( sofar ); +} + +static void ImportFig(CharView *cv,char *path) { + FILE *fig; + char buffer[100]; + SplineSet *spl, *espl; + int i; + + fig = fopen(path,"r"); + if ( fig==NULL ) { + GWidgetErrorR(_STR_CantFindFile,_STR_CantFindFile); +return; + } + if ( fgets(buffer,sizeof(buffer),fig)==NULL || strcmp(buffer,"#FIG 3.2\n")!=0 ) { + GWidgetErrorR(_STR_BadXFigFile,_STR_BadXFigFile); + fclose(fig); +return; + } + /* skip the header, it isn't interesting */ + for ( i=0; i<8; ++i ) + fgets(buffer,sizeof(buffer),fig); + spl = slurpcompoundguts(fig,cv->sc,NULL); + if ( spl!=NULL ) { + CVPreserveState(cv); + if ( cv->sc->parent->order2 ) + spl = SplineSetsConvertOrder(spl,true); + for ( espl=spl; espl->next!=NULL; espl=espl->next ); + espl->next = cv->layerheads[cv->drawmode]->splines; + cv->layerheads[cv->drawmode]->splines = spl; + CVCharChangedUpdate(cv); + } + fclose(fig); +} + +/************************** Normal Image Import *******************************/ + +GImage *ImageAlterClut(GImage *image) { + struct _GImage *base = image->list_len==0?image->u.image:image->u.images[0]; + GClut *clut; + + if ( base->image_type!=it_mono ) { + /* png b&w images come through as indexed, not mono */ + if ( base->clut!=NULL && base->clut->clut_len==2 ) { + GImage *new = GImageCreate(it_mono,base->width,base->height); + struct _GImage *nbase = new->u.image; + int i,j; + memset(nbase->data,0,nbase->height*nbase->bytes_per_line); + for ( i=0; iheight; ++i ) for ( j=0; jwidth; ++j ) + if ( base->data[i*base->bytes_per_line+j] ) + nbase->data[i*nbase->bytes_per_line+(j>>3)] |= (0x80>>(j&7)); + nbase->clut = base->clut; + base->clut = NULL; + nbase->trans = base->trans; + GImageDestroy(image); + image = new; + base = nbase; + } else +return( image ); + } + + clut = base->clut; + if ( clut==NULL ) { + clut=base->clut = gcalloc(1,sizeof(GClut)); + clut->clut_len = 2; + clut->clut[0] = 0x808080; + if ( screen_display!=NULL ) + clut->clut[1] = GDrawGetDefaultBackground(NULL); + else + clut->clut[1] = 0xb0b0b0; + clut->trans_index = 1; + base->trans = 1; + } else if ( base->trans!=-1 ) { + clut->clut[!base->trans] = 0x808080; + } else if ( clut->clut[0]clut[1] ) { + clut->clut[0] = 0x808080; + clut->trans_index = 1; + base->trans = 1; + } else { + clut->clut[1] = 0x808080; + clut->trans_index = 0; + base->trans = 0; + } +return( image ); +} + +void SCInsertImage(SplineChar *sc,GImage *image,real scale,real yoff,real xoff, + int layer) { + ImageList *im; + + SCPreserveLayer(sc,layer,false); + im = galloc(sizeof(ImageList)); + im->image = image; + im->xoff = xoff; + im->yoff = yoff; + im->xscale = im->yscale = scale; + im->selected = true; + im->next = sc->layers[layer].images; + im->bb.minx = im->xoff; im->bb.maxy = im->yoff; + im->bb.maxx = im->xoff + GImageGetWidth(im->image)*im->xscale; + im->bb.miny = im->yoff - GImageGetHeight(im->image)*im->yscale; + sc->layers[layer].images = im; + sc->parent->onlybitmaps = false; + SCOutOfDateBackground(sc); + SCCharChangedUpdate(sc); +} + +void SCAddScaleImage(SplineChar *sc,GImage *image,int doclear, int layer) { + double scale; + + image = ImageAlterClut(image); + scale = (sc->parent->ascent+sc->parent->descent)/(real) GImageGetHeight(image); + if ( doclear ) + ImageListsFree(sc->layers[layer].images); sc->layers[layer].images = NULL; + SCInsertImage(sc,image,scale,sc->parent->ascent,0,layer); +} + +static void ImportImage(CharView *cv,char *path) { + GImage *image; + int layer; + + image = GImageRead(path); + if ( image==NULL ) { + GWidgetErrorR(_STR_BadImageFile,_STR_BadImageFileName, path); +return; + } + layer = ly_back; + if ( cv->sc->parent->multilayer && cv->drawmode!=dm_grid ) + layer = cv->drawmode-dm_back + ly_back; + SCAddScaleImage(cv->sc,image,false,layer); +} + +static int BVImportImage(BitmapView *bv,char *path) { + GImage *image; + struct _GImage *base; + int tot; + uint8 *pt, *end; + BDFChar *bc = bv->bc; + int i, j; + + image = GImageRead(path); + if ( image==NULL ) { + GWidgetErrorR(_STR_BadImageFile,_STR_BadImageFileName, path); +return(false); + } + base = image->list_len==0?image->u.image:image->u.images[0]; + BCPreserveState(bc); + BCFlattenFloat(bc); + free(bc->bitmap); + bc->xmin = bc->ymin = 0; + bc->xmax = base->width-1; bc->ymax = base->height-1; + if ( !bc->byte_data && base->image_type==it_mono ) { + bc->bitmap = base->data; + bc->bytes_per_line = base->bytes_per_line; + + /* Sigh. Bitmaps use a different defn of set than images do. make it consistant */ + tot = bc->bytes_per_line*(bc->ymax-bc->ymin+1); + for ( pt = bc->bitmap, end = pt+tot; ptdata = NULL; + } else if ( base->image_type==it_mono /* && byte_data */) { + int set = (1<bdf))-1; + bc->bytes_per_line = base->width; + bc->bitmap = gcalloc(base->height,base->width); + for ( i=0; iheight; ++i ) for ( j=0; jwidth; ++j ) { + if ( !(base->data[i*base->bytes_per_line+(j>>3)]&(0x80>>(j&7))) ) + bc->bitmap[i*bc->bytes_per_line+j] = set; + } + } else if ( !bc->byte_data && base->image_type==it_true ) { + bc->bytes_per_line = (base->width>>3)+1; + bc->bitmap = gcalloc(base->height,bc->bytes_per_line); + for ( i=0; iheight; ++i ) for ( j=0; jwidth; ++j ) { + int col = ((Color *) (base->data+i*base->bytes_per_line))[j]; + col = (3*COLOR_RED(col)+6*COLOR_GREEN(col)+COLOR_BLUE(col)); + if ( col<=5*256 ) + bc->bitmap[i*bc->bytes_per_line+(j>>3)] |= (0x80>>(j&7)); + } + } else if ( /* byte_data && */ base->image_type==it_true ) { + int div = 255/((1<bdf))-1); + bc->bytes_per_line = base->width; + bc->bitmap = gcalloc(base->height,base->width); + for ( i=0; iheight; ++i ) for ( j=0; jwidth; ++j ) { + int col = ((Color *) (base->data+i*base->bytes_per_line))[j]; + col = 255-(3*COLOR_RED(col)+6*COLOR_GREEN(col)+COLOR_BLUE(col)+5)/10; + bc->bitmap[i*bc->bytes_per_line+j] = col/div; + } + } else if ( bc->byte_data /* && indexed */ ) { + int div = 255/((1<bdf))-1); + bc->bitmap = base->data; + bc->bytes_per_line = base->bytes_per_line; + for ( i=0; iheight; ++i ) for ( j=0; jwidth; ++j ) { + int col = base->clut->clut[base->data[i*base->bytes_per_line+j]]; + col = 255-(3*COLOR_RED(col)+6*COLOR_GREEN(col)+COLOR_BLUE(col)+5)/10; + base->data[i*base->bytes_per_line+j] = col/div; + } + base->data = NULL; + } else /* if ( mono && indexed ) */ { + bc->bytes_per_line = (base->width>>3)+1; + bc->bitmap = gcalloc(base->height,bc->bytes_per_line); + for ( i=0; iheight; ++i ) for ( j=0; jwidth; ++j ) { + int col = base->clut->clut[base->data[i*base->bytes_per_line+j]]; + col = (3*COLOR_RED(col)+6*COLOR_GREEN(col)+COLOR_BLUE(col)); + if ( col<=5*256 ) + bc->bitmap[i*bc->bytes_per_line+(j>>3)] |= (0x80>>(j&7)); + } + } + GImageDestroy(image); + BCCharChangedUpdate(bc); +return( true ); +} + +int FVImportImages(FontView *fv,char *path,int format) { + GImage *image; + struct _GImage *base; + int tot; + char *start = path, *endpath=path; + int i; + SplineChar *sc; + + tot = 0; + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i]) { + sc = SFMakeChar(fv->sf,i); + endpath = strchr(start,';'); + if ( endpath!=NULL ) *endpath = '\0'; + if ( format==fv_image ) { + image = GImageRead(start); + if ( image==NULL ) { + GWidgetErrorR(_STR_BadImageFile,_STR_BadImageFileName,start); +return(false); + } + base = image->list_len==0?image->u.image:image->u.images[0]; + if ( base->image_type!=it_mono ) { + GWidgetErrorR(_STR_BadImageFile,_STR_BadImageFileNotBitmap,start); + GImageDestroy(image); +return(false); + } + ++tot; + SCAddScaleImage(sc,image,true,ly_back); +#ifndef _NO_LIBXML + } else if ( format==fv_svg ) { + SCImportSVG(sc,ly_fore,start,false); + ++tot; +#endif + } else if ( format==fv_eps ) { + SCImportPS(sc,start); + ++tot; + } + if ( endpath==NULL ) + break; + start = endpath+1; + } + if ( tot==0 ) + GWidgetErrorR(_STR_NothingSelected,_STR_NothingSelected); + else if ( endpath!=NULL ) + GWidgetErrorR(_STR_MoreImagesThanSelected,_STR_MoreImagesThanSelected); +return( true ); +} + +int FVImportImageTemplate(FontView *fv,char *path,int format) { + GImage *image; + struct _GImage *base; + int tot; + char *ext, *name, *dirname, *pt, *end; + int i, val; + int isu=false, ise=false, isc=false; + DIR *dir; + struct dirent *entry; + SplineChar *sc; + BDFFont *bdf; + char start [1025]; + + ext = strrchr(path,'.'); + name = strrchr(path,'/'); + if ( ext==NULL ) { + GWidgetErrorR(_STR_BadTemplate,_STR_BadTemplateNoExtension); +return( false ); + } + if ( name==NULL ) name=path-1; + if ( name[1]=='u' ) isu = true; + else if ( name[1]=='c' ) isc = true; + else if ( name[1]=='e' ) ise = true; + else { + GWidgetErrorR(_STR_BadTemplate,_STR_BadTemplateUnrecognized); +return( false ); + } + if ( named_name,'.'); + if ( pt==NULL ) + continue; + if ( strmatch(pt,ext)!=0 ) + continue; + if ( !( + (isu && entry->d_name[0]=='u' && entry->d_name[1]=='n' && entry->d_name[2]=='i' && (val=strtol(entry->d_name+3,&end,16), end==pt)) || + (isu && entry->d_name[0]=='u' && (val=strtol(entry->d_name+1,&end,16), end==pt)) || + (isc && entry->d_name[0]=='c' && entry->d_name[1]=='i' && entry->d_name[2]=='d' && (val=strtol(entry->d_name+3,&end,10), end==pt)) || + (ise && entry->d_name[0]=='e' && entry->d_name[1]=='n' && entry->d_name[2]=='c' && (val=strtol(entry->d_name+3,&end,10), end==pt)) )) + continue; + sprintf (start, "%s/%s", dirname, entry->d_name); + if ( isu ) { + i = SFFindChar(fv->sf,val,NULL); + if ( i==-1 ) { + GWidgetErrorR(_STR_UnicodeNotInFont,_STR_UnicodeValueNotInFont,val); + continue; + } + sc = SFMakeChar(fv->sf,i); + } else { + if ( valsf->charcnt ) + /* It's there */; + else if ( val<10*65536 ) { + fv->sf->chars = grealloc(fv->sf->chars,val*sizeof(SplineChar *)); + fv->selected = grealloc(fv->selected,val); + for ( i=fv->sf->charcnt; isf->chars[i] = NULL; + fv->selected[i] = false; + } + for ( bdf=fv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + bdf->chars = grealloc(bdf->chars,val*sizeof(BDFChar *)); + for ( i=bdf->charcnt; ichars[i] = NULL; + } + } else { + GWidgetErrorR(_STR_EncodingNotInFont,_STR_EncodingValueNotInFont,val); + continue; + } + sc = SFMakeChar(fv->sf,val); + } + if ( format==fv_imgtemplate ) { + image = GImageRead(start); + if ( image==NULL ) { + GWidgetErrorR(_STR_BadImageFile,_STR_BadImageFileName,start); + continue; + } + base = image->list_len==0?image->u.image:image->u.images[0]; + if ( base->image_type!=it_mono ) { + GWidgetErrorR(_STR_BadImageFile,_STR_BadImageFileNotBitmap,start); + GImageDestroy(image); + continue; + } + ++tot; + SCAddScaleImage(sc,image,true,ly_back); +#ifndef _NO_LIBXML + } else if ( format==fv_svgtemplate ) { + SCImportSVG(sc,ly_fore,start,false); + ++tot; +#endif + } else { + SCImportPS(sc,start); + ++tot; + } + } + if ( tot==0 ) + GWidgetErrorR(_STR_NothingLoaded,_STR_NothingLoaded); +return( true ); +} + +/****************************** Import picker *********************************/ + +static int last_format, flast_format; +struct gfc_data { + int done; + int ret; + GGadget *gfc; + GGadget *format; + GGadget *background; + CharView *cv; + BitmapView *bv; + FontView *fv; +}; + +static GTextInfo formats[] = { + { (unichar_t *) _STR_Image, NULL, 0, 0, (void *) fv_image, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "EPS", NULL, 0, 0, (void *) fv_eps, 0, 0, 0, 0, 0, 0, 0, 1 }, +#ifndef _NO_LIBXML + { (unichar_t *) "SVG", NULL, 0, 0, (void *) fv_svg, 0, 0, 0, 0, 0, 0, 0, 1 }, +#endif + { (unichar_t *) "XFig", NULL, 0, 0, (void *) fv_fig, 0, 0, 0, 0, 0, 0, 0, 1 }, + { NULL }}; + +static GTextInfo fvformats[] = { + { (unichar_t *) "BDF", NULL, 0, 0, (void *) fv_bdf, 0, 0, 0, 0, 0, 1, 0, 1 }, + { (unichar_t *) "TTF", NULL, 0, 0, (void *) fv_ttf, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_TeXBitmap, NULL, 0, 0, (void *) fv_pk, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PCF", NULL, 0, 0, (void *) fv_pcf, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_MacBitmap, NULL, 0, 0, (void *) fv_mac, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "Win FON", NULL, 0, 0, (void *) fv_win, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_Image, NULL, 0, 0, (void *) fv_image, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_Template, NULL, 0, 0, (void *) fv_imgtemplate, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "EPS", NULL, 0, 0, (void *) fv_eps, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_EPSTemplate, NULL, 0, 0, (void *) fv_epstemplate, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, +#ifndef _NO_LIBXML + { (unichar_t *) "SVG", NULL, 0, 0, (void *) fv_svg, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_SVGTemplate, NULL, 0, 0, (void *) fv_svgtemplate, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, +#endif + { NULL }}; + +static int GFD_ImportOk(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + unichar_t *ret = GGadgetGetTitle(d->gfc); + char *temp = u2def_copy(ret); + int pos = GGadgetGetFirstListSelectedItem(d->format); + int format = (int) (GGadgetGetListItemSelected(d->format)->userdata); + + GDrawSetCursor(GGadgetGetWindow(g),ct_watch); + if ( d->fv!=NULL ) + flast_format = pos; + else + last_format = pos; + free(ret); + if ( d->fv!=NULL ) { + int toback = GGadgetIsChecked(d->background); + if ( toback && strchr(temp,';')!=NULL && format<3 ) + GWidgetErrorR(_STR_OnlyOneFont,_STR_OnlyOneFontBackground); + else if ( format==fv_bdf ) + d->done = FVImportBDF(d->fv,temp,false, toback); + else if ( format==fv_ttf ) + d->done = FVImportMult(d->fv,temp,toback,bf_ttf); + else if ( format==fv_pk ) /* pk */ + d->done = FVImportBDF(d->fv,temp,true, toback); + else if ( format==fv_pcf ) /* pcf */ + d->done = FVImportBDF(d->fv,temp,2, toback); + else if ( format==fv_mac ) + d->done = FVImportMult(d->fv,temp,toback,bf_nfntmacbin); + else if ( format==fv_win ) + d->done = FVImportMult(d->fv,temp,toback,bf_fon); + else if ( format==fv_image ) + d->done = FVImportImages(d->fv,temp,format); + else if ( format==fv_imgtemplate ) + d->done = FVImportImageTemplate(d->fv,temp,format); + else if ( format==fv_eps ) + d->done = FVImportImages(d->fv,temp,format); + else if ( format==fv_epstemplate ) + d->done = FVImportImageTemplate(d->fv,temp,format); + else if ( format==fv_svg ) + d->done = FVImportImages(d->fv,temp,format); + else if ( format==fv_svgtemplate ) + d->done = FVImportImageTemplate(d->fv,temp,format); + } else if ( d->bv!=NULL ) + d->done = BVImportImage(d->bv,temp); + else { + d->done = true; + if ( format==fv_image ) + ImportImage(d->cv,temp); + else if ( format==fv_eps ) + ImportPS(d->cv,temp); +#ifndef _NO_LIBXML + else if ( format==fv_svg ) + ImportSVG(d->cv,temp); +#endif + else + ImportFig(d->cv,temp); + } + free(temp); + } + GDrawSetCursor(GGadgetGetWindow(g),ct_pointer); +return( true ); +} + +static int GFD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + d->ret = false; + } +return( true ); +} + +static int GFD_Format(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int format = GGadgetGetFirstListSelectedItem(g); + GFileChooserSetFilterText(d->gfc,d->fv==NULL?wildchr[format]:wildfnt[format]); + GFileChooserRefreshList(d->gfc); + if ( d->fv!=NULL ) { + if ( format==fv_bdf || format==fv_ttf || format==fv_pcf || + format==fv_mac || format==fv_win ) { + GGadgetSetChecked(d->background,false); + GGadgetSetEnabled(d->background,true); + } else if ( format==fv_pk ) { + GGadgetSetChecked(d->background,true); + GGadgetSetEnabled(d->background,true); + } else if ( format==fv_eps || format==fv_epstemplate ) { + GGadgetSetChecked(d->background,false); + GGadgetSetEnabled(d->background,false); + } else { /* Images */ + GGadgetSetChecked(d->background,true); + GGadgetSetEnabled(d->background,false); + } + } + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct gfc_data *d = GDrawGetUserData(gw); + d->done = true; + d->ret = false; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type==et_map ) { + GDrawRaise(gw); + } else if ( event->type == et_mousemove || + (event->type==et_mousedown && event->u.mouse.button==3 )) { + struct gfc_data *d = GDrawGetUserData(gw); + GFileChooserPopupCheck(d->gfc,event); + } else if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + struct gfc_data *d = GDrawGetUserData(gw); +return( GGadgetDispatchEvent((GGadget *) (d->gfc),event)); + } +return( true ); +} + +static void _Import(CharView *cv,BitmapView *bv,FontView *fv) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + struct gfc_data d; + int i, format; + int bs = GIntGetResource(_NUM_Buttonsize), bsbigger, totwid, scalewid; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<scalewid; scalewid = bsbigger?3*bs+4*12:scalewid; + pos.width = GDrawPointsToPixels(NULL,scalewid); + pos.height = GDrawPointsToPixels(NULL,255); + gw = GDrawCreateTopWindow(NULL,&pos,e_h,&d,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; gcd[0].gd.pos.width = totwid-24; gcd[0].gd.pos.height = 182; + gcd[0].gd.flags = gg_visible | gg_enabled; + if ( fv!=NULL ) + gcd[0].gd.flags |= gg_file_multiple; + gcd[0].creator = GFileChooserCreate; + + gcd[1].gd.pos.x = 12; gcd[1].gd.pos.y = 224-3; gcd[1].gd.pos.width = -1; gcd[1].gd.pos.height = 0; + gcd[1].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[1].text = (unichar_t *) _STR_Import; + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.handle_controlevent = GFD_ImportOk; + gcd[1].creator = GButtonCreate; + + gcd[2].gd.pos.x = (totwid-bs)*100/GIntGetResource(_NUM_ScaleFactor)/2; gcd[2].gd.pos.y = 224; gcd[2].gd.pos.width = -1; gcd[2].gd.pos.height = 0; + gcd[2].gd.flags = gg_visible | gg_enabled; + label[2].text = (unichar_t *) _STR_Filter; + label[2].text_in_resource = true; + gcd[2].gd.mnemonic = 'F'; + gcd[2].gd.label = &label[2]; + gcd[2].gd.handle_controlevent = GFileChooserFilterEh; + gcd[2].creator = GButtonCreate; + + gcd[3].gd.pos.x = -gcd[1].gd.pos.x; gcd[3].gd.pos.y = 224; gcd[3].gd.pos.width = -1; gcd[3].gd.pos.height = 0; + gcd[3].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[3].text = (unichar_t *) _STR_Cancel; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.handle_controlevent = GFD_Cancel; + gcd[3].creator = GButtonCreate; + + gcd[4].gd.pos.x = 12; gcd[4].gd.pos.y = 200; gcd[4].gd.pos.width = 0; gcd[4].gd.pos.height = 0; + gcd[4].gd.flags = gg_visible | gg_enabled; + label[4].text = (unichar_t *) _STR_Format; + label[4].text_in_resource = true; + gcd[4].gd.label = &label[4]; + gcd[4].creator = GLabelCreate; + + gcd[5].gd.pos.x = 55; gcd[5].gd.pos.y = 194; + gcd[5].gd.flags = gg_visible | gg_enabled ; + if ( bv!=NULL ) { + gcd[5].gd.flags = gg_visible ; /* No postscript in bitmap mode */ + last_format=0; + } + format = fv==NULL?last_format:flast_format; + gcd[5].gd.u.list = fv==NULL?formats:fvformats; + gcd[5].gd.label = &gcd[5].gd.u.list[format]; + gcd[5].gd.handle_controlevent = GFD_Format; + gcd[5].creator = GListButtonCreate; + for ( i=0; i + +#if defined(KNIFE_CONTINUOUS) /* Use this code to do cuts as we move along. Probably a bad idea, let's wait till the end */ +static void ProcessKnife(CharView *cv, PressedOn *p) { + real dx, dy; + SplinePoint *n; + + /* If we've already made a cut, don't make another cut too close to it */ + /* ie. if the hand shakes over a cut let's not get about six tiny cut */ + /* segments adjacent to one another */ + if ( (dx=cv->info.x-cv->lastknife.x)<0 ) dx=-dx; + if ( (dy=cv->info.y-cv->lastknife.y)<0 ) dy=-dy; + if ( (dx+dy)/cv->scale <= 6 ) +return; + if ( p->sp==NULL && p->spline==NULL ) +return; /* Nothing to cut */ + + if ( p->spline!=NULL ) + p->sp = SplineBisect(p->spline,p->t,cv->sc->parent->order2); + if ( p->spl==NULL ) /* Kanou says this can happen. It doesn't hurt to check for it */ +return; + if ( p->spl->first!=p->spl->last ) + if ( p->sp==p->spl->first || p->sp==p->spl->last ) +return; /* Already cut here */ + n = chunkalloc(sizeof(SplinePoint)); + p->sp->pointtype = pt_corner; + *n = *p->sp; + n->hintmask = NULL; + p->sp->next = NULL; + n->prev = NULL; + n->next->from = n; + if ( p->spl->first==p->spl->last ) { + p->spl->first = n; + p->spl->last = p->sp; + } else { + SplinePointList *nspl = chunkalloc(sizeof(SplinePointList)); + nspl->next = p->spl->next; + p->spl->next = nspl; + nspl->first = n; + nspl->last = p->spl->last; + p->spl->last = p->sp; + } + + cv->lastknife.x = cv->info.x; + cv->lastknife.y = cv->info.y; + CVSetCharChanged(cv,true); + SCUpdateAll(cv->sc); +} +#endif + +void CVMouseDownKnife(CharView *cv) { +#if defined(KNIFE_CONTINUOUS) + CVPreserveState(cv); + cv->lastknife.x = cv->lastknife.y = -9999; + ProcessKnife(cv,&cv->p); +#else + cv->p.rubberlining = true; +#endif +} + +void CVMouseMoveKnife(CharView *cv, PressedOn *p) { +#if defined(KNIFE_CONTINUOUS) + ProcessKnife(cv,p); +#else + GDrawRequestExpose(cv->v,NULL,false); +#endif +} + +void CVMouseUpKnife(CharView *cv) { +#if !defined(KNIFE_CONTINUOUS) + /* draw a line from (cv->p.cx,cv->p.cy) to (cv->info.x,cv->info.y) */ + /* and cut anything intersected by it */ + SplineSet *spl, *spl2; + Spline *s, *nexts; + Spline dummy; + SplinePoint dummyfrom, dummyto, *mid, *mid2; + BasePoint inters[9]; + double t1s[10], t2s[10]; + int foundsomething = true, ever = false; + int i; + + memset(&dummy,0,sizeof(dummy)); + memset(&dummyfrom,0,sizeof(dummyfrom)); + memset(&dummyto,0,sizeof(dummyto)); + dummyfrom.me.x = cv->p.cx; dummyfrom.me.y = cv->p.cy; + dummyto.me.x = cv->info.x; dummyto.me.y = cv->info.y; + dummyfrom.nextcp = dummyfrom.prevcp = dummyfrom.me; + dummyto.nextcp = dummyto.prevcp = dummyto.me; + dummyfrom.nonextcp = dummyfrom.noprevcp = dummyto.nonextcp = dummyto.noprevcp = true; + dummy.splines[0].d = cv->p.cx; dummy.splines[0].c = cv->info.x-cv->p.cx; + dummy.splines[1].d = cv->p.cy; dummy.splines[1].c = cv->info.y-cv->p.cy; + dummy.from = &dummyfrom; dummy.to = &dummyto; + dummy.islinear = dummy.knownlinear = true; + dummyfrom.next = dummyto.prev = &dummy; + + while ( foundsomething ) { + foundsomething = false; + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL && !foundsomething; spl = spl->next ) { + for ( s = spl->first->next; s!=NULL ; ) { + nexts = NULL; + if ( s->to!=spl->first ) + nexts = s->to->next; + if ( SplinesIntersect(s,&dummy,inters,t1s,t2s)>0 ) { + for ( i=0; i<4 && t1s[i]!=-1 && (t1s[i]<.0001 || t1s[i]>1-.0001); ++i ); + if ( i<4 && t1s[i]!=-1 ) { + /* There's at least one intersection point that isn't */ + /* too close to an end point. Cut here, and then */ + /* start all over again (we may need to alter the */ + /* splineset structure so drastically that we just */ + /* can't continue these loops) */ + foundsomething = true; + nexts = NULL; + if ( !ever ) + CVPreserveState(cv); + ever = true; + /* Insert a break here */ + mid = SplineBisect(s,t1s[i]); + mid2 = chunkalloc(sizeof(SplinePoint)); + *mid2 = *mid; + mid2->hintmask = NULL; + mid->next = NULL; + mid2->prev = NULL; + mid2->next->from = mid2; + if ( spl->first==spl->last ) { + spl->first = mid2; + spl->last = mid; + } else { + spl2 = chunkalloc(sizeof(SplineSet)); + spl2->next = spl->next; + spl->next = spl2; + spl2->first = mid2; + spl2->last = spl->last; + spl->last = mid; + } + } + } + s = nexts; + } + } + } + if ( ever ) + CVCharChangedUpdate(cv); +#endif +} diff --git a/fontforge/cvpalettes.c b/fontforge/cvpalettes.c new file mode 100644 index 00000000..2a3eaf1f --- /dev/null +++ b/fontforge/cvpalettes.c @@ -0,0 +1,2761 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include "splinefont.h" +#include +#include + +extern GDevEventMask input_em[]; +extern const int input_em_cnt; + +static int cvvisible[2] = { 1, 1}, bvvisible[3]= { 1,1,1 }; +static GWindow cvlayers, cvtools, bvlayers, bvtools, bvshades; +#ifdef FONTFORGE_CONFIG_TYPE3 +static GWindow cvlayers2; +#endif +static GPoint cvtoolsoff = { -9999 }, cvlayersoff = { -9999 }, bvlayersoff = { -9999 }, bvtoolsoff = { -9999 }, bvshadesoff = { -9999 }; +static int palettesmoved=0; +int palettes_docked=0; +int palettes_fixed=1; + +static unichar_t helv[] = { 'h', 'e', 'l', 'v', 'e', 't', 'i', 'c', 'a',',','c','a','l','i','b','a','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; +static GFont *font; + +#define CV_TOOLS_WIDTH 53 +#define CV_TOOLS_HEIGHT (214+4*12+2) +#define CV_LAYERS_WIDTH 104 +#define CV_LAYERS_HEIGHT 196 +#define CV_LAYERS2_WIDTH 120 +#define CV_LAYERS2_LINE_HEIGHT 25 +#define CV_LAYERS2_HEADER_HEIGHT 20 +#define CV_LAYERS2_VISLAYERS ( (CV_LAYERS_HEIGHT-CV_LAYERS2_HEADER_HEIGHT-2*CV_LAYERS2_LINE_HEIGHT)/CV_LAYERS2_LINE_HEIGHT ) +#define BV_TOOLS_WIDTH 53 +#define BV_TOOLS_HEIGHT 80 +#define BV_LAYERS_HEIGHT 73 +#define BV_LAYERS_WIDTH 73 +#define BV_SHADES_HEIGHT (8+9*16) + +static void ReparentFixup(GWindow child,GWindow parent, int x, int y, int width, int height ) { + /* This is so nice */ + /* KDE does not honor my request for a border for top level windows */ + /* KDE does not honor my request for size (for narrow) top level windows */ + /* Gnome gets very confused by reparenting */ + /* If we've got a top level window, then reparenting it removes gnome's */ + /* decoration window, but sets the new parent to root (rather than what */ + /* we asked for */ + /* I have tried reparenting it twice, unmapping & reparenting. Nothing works */ + + GWidgetReparentWindow(child,parent,x,y); + if ( width!=0 ) + GDrawResize(child,width,height); + GDrawSetWindowBorder(child,1,GDrawGetDefaultForeground(NULL)); +} + +static GWindow CreatePalette(GWindow w, GRect *pos, int (*eh)(GWindow,GEvent *), void *user_data, GWindowAttrs *wattrs, GWindow v) { + GWindow gw; + GPoint pt, base; + GRect newpos; + GWindow root; + GRect ownerpos, screensize; + + pt.x = pos->x; pt.y = pos->y; + if ( !palettes_fixed ) { + root = GDrawGetRoot(NULL); + GDrawGetSize(w,&ownerpos); + GDrawGetSize(root,&screensize); + GDrawTranslateCoordinates(w,root,&pt); + base.x = base.y = 0; + GDrawTranslateCoordinates(w,root,&base); + if ( pt.x<0 ) { + if ( base.x+ownerpos.width+20+pos->width+20 > screensize.width ) + pt.x=0; + else + pt.x = base.x+ownerpos.width+20; + } + if ( pt.y<0 ) pt.y=0; + if ( pt.x+pos->width>screensize.width ) + pt.x = screensize.width-pos->width; + if ( pt.y+pos->height>screensize.height ) + pt.y = screensize.height-pos->height; + } + wattrs->mask |= wam_bordcol|wam_bordwidth; + wattrs->border_width = 1; + wattrs->border_color = GDrawGetDefaultForeground(NULL); + + newpos.x = pt.x; newpos.y = pt.y; newpos.width = pos->width; newpos.height = pos->height; + wattrs->mask |= wam_positioned; + wattrs->positioned = true; + gw = GDrawCreateTopWindow(NULL,&newpos,eh,user_data,wattrs); + if ( palettes_docked ) + ReparentFixup(gw,v,0,pos->y,pos->width,pos->height); +return( gw ); +} + +static void SaveOffsets(GWindow main, GWindow palette, GPoint *off) { + if ( !palettes_docked && !palettes_fixed && GDrawIsVisible(palette)) { + GRect mr, pr; + GWindow root, temp; + root = GDrawGetRoot(NULL); + while ( (temp=GDrawGetParentWindow(main))!=root ) + main = temp; + GDrawGetSize(main,&mr); + GDrawGetSize(palette,&pr); + off->x = pr.x-mr.x; + off->y = pr.y-mr.y; +#if 0 + printf( "%s is offset (%d,%d)\n", palette==cvtools?"CVTools": + palette==cvlayers?"CVLayers":palette==bvtools?"BVTools": + palette==bvlayers?"BVLayers":"BVShades", off->x, off->y ); +#endif + } +} + +static void RestoreOffsets(GWindow main, GWindow palette, GPoint *off) { + GPoint pt; + GWindow root,temp; + GRect screensize, pos; + + if ( palettes_fixed ) +return; + pt = *off; + root = GDrawGetRoot(NULL); + GDrawGetSize(root,&screensize); + GDrawGetSize(palette,&pos); + while ( (temp=GDrawGetParentWindow(main))!=root ) + main = temp; + GDrawTranslateCoordinates(main,root,&pt); + if ( pt.x<0 ) pt.x=0; + if ( pt.y<0 ) pt.y=0; + if ( pt.x+pos.width>screensize.width ) + pt.x = screensize.width-pos.width; + if ( pt.y+pos.height>screensize.height ) + pt.y = screensize.height-pos.height; + palettesmoved = true; + GDrawTrueMove(palette,pt.x,pt.y); + GDrawRaise(palette); +} + +/* Note: If you change this ordering, change enum cvtools */ +static int popupsres[] = { _STR_Pointer, _STR_PopMag, + _STR_FreeCurve, _STR_ScrollByHand, + _STR_AddCurvePoint, _STR_AddCornerPoint, + _STR_AddTangentPoint, _STR_AddPenPoint, + _STR_PopKnife, _STR_PopRuler, + _STR_PopScale, _STR_PopFlip, + _STR_PopRotate, _STR_PopSkew, + _STR_PopRectElipse, _STR_PopPolyStar, + _STR_PopRectElipse, _STR_PopPolyStar}; +static int editablelayers[] = { _STR_Fore, _STR_Back, _STR_Grid }; +int rectelipse=0, polystar=0, regular_star=1; +int center_out = false; +float rr_radius=0; +int ps_pointcnt=6; +float star_percent=1.7320508; /* Regular 6 pointed star */ +static StrokeInfo expand = { 25, lj_round, lc_butt, si_centerline, + /* toobigwarn */ true, + /* removeexternal */ false, + /* removeinternal */ false, + /* removeoverlapif*/ false, + /* gottoobig */ false, + /* gottoobiglocal */ false, + 3.1415926535897932/4, .2, 50 }; + +real CVRoundRectRadius(void) { +return( rr_radius ); +} + +int CVRectElipseCenter(void) { +return( center_out ); +} + +int CVPolyStarPoints(void) { +return( ps_pointcnt ); +} + +real CVStarRatio(void) { + if ( regular_star ) +return( sin(3.1415926535897932/ps_pointcnt)*tan(2*3.1415926535897932/ps_pointcnt)+cos(3.1415926535897932/ps_pointcnt) ); + +return( star_percent ); +} + +StrokeInfo *CVFreeHandInfo(void) { +return( &expand ); +} + +struct ask_info { + GWindow gw; + int done; + int ret; + real *val; + int *co; + GGadget *rb1; + GGadget *reg; + int isint; + int lab; +}; +#define CID_ValText 1001 +#define CID_PointPercent 1002 + +static int TA_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct ask_info *d = GDrawGetUserData(GGadgetGetWindow(g)); + real val, val2=0; + int err=0; + if ( d->isint ) { + val = GetIntR(d->gw,CID_ValText,d->lab,&err); + if ( !(regular_star = GGadgetIsChecked(d->reg))) + val2 = GetRealR(d->gw,CID_PointPercent,_STR_SizeOfPoints,&err); + } else { + val = GetRealR(d->gw,CID_ValText,d->lab,&err); + *(d->co) = !GGadgetIsChecked(d->reg); + } + if ( err ) +return( true ); + *d->val = val; + d->ret = !GGadgetIsChecked(d->rb1); + d->done = true; + if ( !regular_star && d->isint ) + star_percent = val2/100; + SavePrefs(); + } +return( true ); +} + +static int TA_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct ask_info *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + } +return( true ); +} + +static int toolask_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct ask_info *d = GDrawGetUserData(gw); + d->done = true; + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( event->type!=et_char ); +} + +static int Ask(int rb1, int rb2, int rb, int lab, real *val, int *co, int isint ) { + struct ask_info d; + char buffer[20], buf[20]; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[11]; + GTextInfo label[11]; + int off = isint?15:0; + + d.done = false; + d.ret = rb; + d.val = val; + d.co = co; + d.isint = isint; + d.lab = lab; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<cntrldown?cv->cb1_tool:cv->b1_tool; + int dither = GDrawSetDither(NULL,false); + GRect temp; + + GDrawPushClip(pixmap,r,&old); + GDrawFillRect(pixmap,r,GDrawGetDefaultBackground(NULL)); + GDrawSetLineWidth(pixmap,0); + for ( i=0; isc->parent->order2 && buttons[mi][j]==&GIcon_freehand ) + GDrawDrawImage(pixmap,&GIcon_greyfree,NULL,j*27+1,i*27+1); + else + GDrawDrawImage(pixmap,buttons[mi][j],NULL,j*27+1,i*27+1); + norm = (mi*2+j!=tool); + GDrawDrawLine(pixmap,j*27,i*27,j*27+25,i*27,norm?0xe0e0e0:0x707070); + GDrawDrawLine(pixmap,j*27,i*27,j*27,i*27+25,norm?0xe0e0e0:0x707070); + GDrawDrawLine(pixmap,j*27,i*27+25,j*27+25,i*27+25,norm?0x707070:0xe0e0e0); + GDrawDrawLine(pixmap,j*27+25,i*27,j*27+25,i*27+25,norm?0x707070:0xe0e0e0); + } + GDrawSetFont(pixmap,font); + temp.x = 52-16; temp.y = i*27; temp.width = 16; temp.height = 4*12; + GDrawFillRect(pixmap,&temp,GDrawGetDefaultBackground(NULL)); + for ( j=0; j<4; ++j ) { + GDrawDrawText(pixmap,2,i*27+j*12+10,_Mouse[j],-1,NULL,0x000000); + if ( (&cv->b1_tool)[j]!=cvt_none ) + GDrawDrawImage(pixmap,smalls[(&cv->b1_tool)[j]],NULL,52-16,i*27+j*12); + } + GDrawPopClip(pixmap,&old); + GDrawSetDither(NULL,dither); +} + +int TrueCharState(GEvent *event) { + int bit = 0; + /* X doesn't set the state until after the event. I want the state to */ + /* reflect whatever key just got depressed/released */ + int keysym = event->u.chr.keysym; + + if ( keysym == GK_Meta_L || keysym == GK_Meta_R || + keysym == GK_Alt_L || keysym == GK_Alt_R ) + bit = ksm_meta; + else if ( keysym == GK_Shift_L || keysym == GK_Shift_R ) + bit = ksm_shift; + else if ( keysym == GK_Control_L || keysym == GK_Control_R ) + bit = ksm_control; + else if ( keysym == GK_Caps_Lock || keysym == GK_Shift_Lock ) + bit = ksm_capslock; + else if ( keysym == GK_Super_L || keysym == GK_Super_L ) + bit = ksm_super; + else if ( keysym == GK_Hyper_L || keysym == GK_Hyper_L ) + bit = ksm_hyper; + else +return( event->u.chr.state ); + + if ( event->type == et_char ) +return( event->u.chr.state | bit ); + else +return( event->u.chr.state & ~bit ); +} + +void CVToolsSetCursor(CharView *cv, int state, char *device) { + int shouldshow; + static enum cvtools tools[cvt_max+1] = { cvt_none }; + int cntrl; + + if ( tools[0] == cvt_none ) { + tools[cvt_pointer] = ct_mypointer; + tools[cvt_magnify] = ct_magplus; + tools[cvt_freehand] = ct_pencil; + tools[cvt_hand] = ct_myhand; + tools[cvt_curve] = ct_circle; + tools[cvt_corner] = ct_square; + tools[cvt_tangent] = ct_triangle; + tools[cvt_pen] = ct_pen; + tools[cvt_knife] = ct_knife; + tools[cvt_ruler] = ct_ruler; + tools[cvt_scale] = ct_scale; + tools[cvt_flip] = ct_flip; + tools[cvt_rotate] = ct_rotate; + tools[cvt_skew] = ct_skew; + tools[cvt_rect] = ct_rect; + tools[cvt_poly] = ct_poly; + tools[cvt_elipse] = ct_elipse; + tools[cvt_star] = ct_star; + tools[cvt_minify] = ct_magminus; + } + + if ( cv->active_tool!=cvt_none ) + shouldshow = cv->active_tool; + else if ( cv->pressed_display!=cvt_none ) + shouldshow = cv->pressed_display; + else if ( device==NULL || strcmp(device,"Mouse1")==0 ) { + if ( (state&(ksm_shift|ksm_control)) && (state&ksm_button4)) + shouldshow = cvt_magnify; + else if ( (state&(ksm_shift|ksm_control)) && (state&ksm_button5)) + shouldshow = cvt_minify; + else if ( (state&ksm_control) && (state&(ksm_button2|ksm_super)) ) + shouldshow = cv->cb2_tool; + else if ( (state&(ksm_button2|ksm_super)) ) + shouldshow = cv->b2_tool; + else if ( (state&ksm_control) ) + shouldshow = cv->cb1_tool; + else + shouldshow = cv->b1_tool; + } else if ( strcmp(device,"eraser")==0 ) + shouldshow = cv->er_tool; + else if ( strcmp(device,"stylus")==0 ) { + if ( (state&(ksm_button2|ksm_control|ksm_super)) ) + shouldshow = cv->s2_tool; + else + shouldshow = cv->s1_tool; + } + if ( shouldshow==cvt_magnify && (state&ksm_meta)) + shouldshow = cvt_minify; + if ( shouldshow!=cv->showing_tool ) { + GDrawSetCursor(cv->v,tools[shouldshow]); + GDrawSetCursor(cvtools,tools[shouldshow]); + cv->showing_tool = shouldshow; + } + + if ( device==NULL || strcmp(device,"stylus")==0 ) { + cntrl = (state&ksm_control)?1:0; + if ( device!=NULL && (state&ksm_button2)) + cntrl = true; + if ( cntrl != cv->cntrldown ) { + cv->cntrldown = cntrl; + GDrawRequestExpose(cvtools,NULL,false); + } + } +} + +static int CVCurrentTool(CharView *cv, GEvent *event) { + if ( event->u.mouse.device!=NULL && strcmp(event->u.mouse.device,"eraser")==0 ) +return( cv->er_tool ); + else if ( event->u.mouse.device!=NULL && strcmp(event->u.mouse.device,"stylus")==0 ) { + if ( event->u.mouse.button==2 ) + /* Only thing that matters is touch which maps to button 1 */; + else if ( cv->had_control ) +return( cv->s2_tool ); + else +return( cv->s1_tool ); + } + if ( cv->had_control && event->u.mouse.button==2 ) +return( cv->cb2_tool ); + else if ( event->u.mouse.button==2 ) +return( cv->b2_tool ); + else if ( cv->had_control ) { +return( cv->cb1_tool ); + } else { +return( cv->b1_tool ); + } +} + +static void ToolsMouse(CharView *cv, GEvent *event) { + int i = (event->u.mouse.y/27), j = (event->u.mouse.x/27), mi=i; + int pos; + int isstylus = event->u.mouse.device!=NULL && strcmp(event->u.mouse.device,"stylus")==0; + int styluscntl = isstylus && (event->u.mouse.state&0x200); + static int settings[2]; + + if ( i==(cvt_rect)/2 ) { + int current = CVCurrentTool(cv,event); + int changed = false; + if ( event->type == et_mousedown && event->u.mouse.clicks>=2 ) { + rectelipse = settings[0]; + polystar = settings[1]; + } else if ( event->type == et_mousedown ) { + settings[0] = rectelipse; settings[1] = polystar; + /* A double click will change the type twice, which leaves it where it was, which is desired */ + if ( j==0 && ((!rectelipse && current==cvt_rect) || (rectelipse && current==cvt_elipse)) ) { + rectelipse = !rectelipse; + changed = true; + } else if (j==1 && ((!polystar && current==cvt_poly) || (polystar && current==cvt_star)) ) { + polystar = !polystar; + changed = true; + } + if ( changed ) { + SavePrefs(); + GDrawRequestExpose(cvtools,NULL,false); + } + } + if ( (j==0 && rectelipse) || (j==1 && polystar) ) + ++mi; + } + pos = mi*2 + j; + GGadgetEndPopup(); + /* we have two fewer buttons than commands as two bottons each control two commands */ + if ( pos<0 || pos>=cvt_max ) + pos = cvt_none; + if ( pos==cvt_freehand && cv->sc->parent->order2 ) +return; /* Not available in order2 spline mode */ + if ( event->type == et_mousedown ) { + if ( isstylus && event->u.mouse.button==2 ) + /* Not a real button press, only touch counts. This is a modifier */; + else { + cv->pressed_tool = cv->pressed_display = pos; + cv->had_control = ((event->u.mouse.state&ksm_control) || styluscntl)?1:0; + event->u.mouse.state |= (1<<(7+event->u.mouse.button)); + } + } else if ( event->type == et_mousemove ) { + if ( cv->pressed_tool==cvt_none && pos!=cvt_none ) + /* Not pressed */ + GGadgetPreparePopupR(cvtools,popupsres[pos]); + else if ( pos!=cv->pressed_tool || cv->had_control != (((event->u.mouse.state&ksm_control) || styluscntl)?1:0) ) + cv->pressed_display = cvt_none; + else + cv->pressed_display = cv->pressed_tool; + } else if ( event->type == et_mouseup ) { + if ( pos==cvt_freehand && event->u.mouse.clicks==2 ) { + FreeHandStrokeDlg(&expand); + } else if ( i==cvt_rect/2 && event->u.mouse.clicks==2 ) { + ((j==0)?CVRectElipse:CVPolyStar)(cv); + mi = i; + if ( (j==0 && rectelipse) || (j==1 && polystar) ) + ++mi; + pos = mi*2 + j; + cv->pressed_tool = cv->pressed_display = pos; + } + if ( pos!=cv->pressed_tool || cv->had_control != (((event->u.mouse.state&ksm_control)||styluscntl)?1:0) ) + cv->pressed_tool = cv->pressed_display = cvt_none; + else { + if ( event->u.mouse.device!=NULL && strcmp(event->u.mouse.device,"eraser")==0 ) + cv->er_tool = pos; + else if ( isstylus ) { + if ( event->u.mouse.button==2 ) + /* Only thing that matters is touch which maps to button 1 */; + else if ( cv->had_control ) + cv->s2_tool = pos; + else + cv->s1_tool = pos; + } else if ( cv->had_control && event->u.mouse.button==2 ) + cv->cb2_tool = pos; + else if ( event->u.mouse.button==2 ) + cv->b2_tool = pos; + else if ( cv->had_control ) { + cv->cb1_tool = pos; + } else { + cv->b1_tool = pos; + } + cv->pressed_tool = cv->pressed_display = cvt_none; + } + GDrawRequestExpose(cvtools,NULL,false); + event->u.chr.state &= ~(1<<(7+event->u.mouse.button)); + } + CVToolsSetCursor(cv,event->u.mouse.state,event->u.mouse.device); +} + +static void PostCharToWindow(GWindow to, GEvent *e) { + GPoint p; + + p.x = e->u.chr.x; p.y = e->u.chr.y; + GDrawTranslateCoordinates(e->w,to,&p); + e->u.chr.x = p.x; e->u.chr.y = p.y; + e->w = to; + GDrawPostEvent(e); +} + +static int cvtools_e_h(GWindow gw, GEvent *event) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( event->type==et_destroy ) { + cvtools = NULL; +return( true ); + } + + if ( cv==NULL ) +return( true ); + + switch ( event->type ) { + case et_expose: + ToolsExpose(gw,cv,&event->u.expose.rect); + break; + case et_mousedown: + ToolsMouse(cv,event); + break; + case et_mousemove: + ToolsMouse(cv,event); + break; + case et_mouseup: + ToolsMouse(cv,event); + break; + case et_crossing: + cv->pressed_display = cvt_none; + CVToolsSetCursor(cv,event->u.mouse.state,NULL); + break; + case et_char: case et_charup: + if ( cv->had_control != ((event->u.chr.state&ksm_control)?1:0) ) + cv->pressed_display = cvt_none; + PostCharToWindow(cv->gw,event); + break; + case et_close: + GDrawSetVisible(gw,false); + break; + } +return( true ); +} + +GWindow CVMakeTools(CharView *cv) { + GRect r; + GWindowAttrs wattrs; + FontRequest rq; + + if ( cvtools!=NULL ) +return( cvtools ); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_positioned|wam_isdlg; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.positioned = true; + wattrs.is_dlg = true; + wattrs.window_title = GStringGetResource(_STR_Tools,NULL); + + r.width = CV_TOOLS_WIDTH; r.height = CV_TOOLS_HEIGHT; + if ( cvtoolsoff.x==-9999 ) { + cvtoolsoff.x = -r.width-6; cvtoolsoff.y = cv->mbh+20; + } + r.x = cvtoolsoff.x; r.y = cvtoolsoff.y; + if ( palettes_docked ) + r.x = r.y = 0; + cvtools = CreatePalette( cv->gw, &r, cvtools_e_h, NULL, &wattrs, cv->v ); + + if ( GDrawRequestDeviceEvents(cvtools,input_em_cnt,input_em)>0 ) { + /* Success! They've got a wacom tablet */ + } + + memset(&rq,0,sizeof(rq)); + rq.family_name = helv; + rq.point_size = -10; + rq.weight = 400; + font = GDrawInstanciateFont(NULL,&rq); + + GDrawSetVisible(cvtools,true); +return( cvtools ); +} + + +#define CID_VFore 1001 +#define CID_VBack 1002 +#define CID_VGrid 1003 +#define CID_VHHints 1005 +#define CID_VVHints 1006 +#define CID_VDHints 1007 +#define CID_EFore 1008 +#define CID_EBack 1009 +#define CID_EGrid 1010 +#define CID_VHMetrics 1011 +#define CID_VVMetrics 1012 +#define CID_VVMetricsLab 1013 +#define CID_VBlues 1014 +#define CID_VAnchor 1015 +#define CID_SB 1016 + +#ifdef FONTFORGE_CONFIG_TYPE3 +struct l2 { + int active; + int offtop; + int current_layers, max_layers; + BDFChar **layers; + int sb_start; + GClut *clut; + GFont *font; +} layer2 = { 2 }; + +static BDFChar *BDFCharFromLayer(SplineChar *sc,int layer) { + SplineChar dummy; + memset(&dummy,0,sizeof(dummy)); + dummy.layer_cnt = 2; + dummy.layers = sc->layers+layer-1; + dummy.parent = sc->parent; +return( SplineCharAntiAlias(&dummy,24,4)); +} + +static void CVLayers2Set(CharView *cv) { + int i, top; + + GGadgetSetChecked(GWidgetGetControl(cvlayers2,CID_VFore),cv->showfore); + GGadgetSetChecked(GWidgetGetControl(cvlayers2,CID_VBack),cv->showback); + GGadgetSetChecked(GWidgetGetControl(cvlayers2,CID_VGrid),cv->showgrids); + + layer2.offtop = 0; + for ( i=2; isc->layer_cnt+1>=layer2.max_layers ) { + top = cv->sc->layer_cnt+10; + if ( layer2.layers==NULL ) + layer2.layers = gcalloc(top,sizeof(BDFChar *)); + else { + layer2.layers = grealloc(layer2.layers,top*sizeof(BDFChar *)); + for ( i=layer2.current_layers; isc->layer_cnt+1; + for ( i=ly_fore; isc->layer_cnt; ++i ) + layer2.layers[i+1] = BDFCharFromLayer(cv->sc,i); + layer2.active = CVLayer(cv)+1; + + GScrollBarSetBounds(GWidgetGetControl(cvlayers2,CID_SB),0,cv->sc->layer_cnt+1-2, + CV_LAYERS2_VISLAYERS); + if ( layer2.offtop>cv->sc->layer_cnt-1-CV_LAYERS2_VISLAYERS ) + layer2.offtop = cv->sc->layer_cnt-1-CV_LAYERS2_VISLAYERS; + if ( layer2.offtop<0 ) layer2.offtop = 0; + GScrollBarSetPos(GWidgetGetControl(cvlayers2,CID_SB),layer2.offtop); + + GDrawRequestExpose(cvlayers2,NULL,false); +} + +static void Layers2Expose(CharView *cv,GWindow pixmap,GEvent *event) { + int i, ll; + const unichar_t *str; + GRect r; + struct _GImage base; + GImage gi; + int as = (24*cv->sc->parent->ascent)/(cv->sc->parent->ascent+cv->sc->parent->descent); + + if ( event->u.expose.rect.y+event->u.expose.rect.heightu.expose.rect.y-CV_LAYERS2_HEADER_HEIGHT)/CV_LAYERS2_LINE_HEIGHT; + i<(event->u.expose.rect.y+event->u.expose.rect.height+CV_LAYERS2_LINE_HEIGHT-1-CV_LAYERS2_HEADER_HEIGHT)/CV_LAYERS2_LINE_HEIGHT; + ++i ) { + ll = i<2 ? i : i+layer2.offtop; + if ( ll==layer2.active ) { + r.x = 30; r.width = layer2.sb_start-r.x; + r.y = CV_LAYERS2_HEADER_HEIGHT + i*CV_LAYERS2_LINE_HEIGHT; + r.height = CV_LAYERS2_LINE_HEIGHT; + GDrawFillRect(pixmap,&r,0x000000); + } + GDrawDrawLine(pixmap,r.x,CV_LAYERS2_HEADER_HEIGHT+i*CV_LAYERS2_LINE_HEIGHT, + r.x+r.width,CV_LAYERS2_HEADER_HEIGHT+i*CV_LAYERS2_LINE_HEIGHT, + 0x808080); + if ( i==0 || i==1 ) { + str = GStringGetResource(i==0?_STR_Grid:_STR_Back,NULL); + GDrawDrawText(pixmap,r.x+2,CV_LAYERS2_HEADER_HEIGHT + i*CV_LAYERS2_LINE_HEIGHT + (CV_LAYERS2_LINE_HEIGHT-12)/2+12, + str,-1,NULL,ll==layer2.active?0xffffff:0x000000); + } else if ( layer2.offtop+i>=layer2.current_layers ) { + break; + } else if ( layer2.layers[layer2.offtop+i]!=NULL ) { + BDFChar *bdfc = layer2.layers[layer2.offtop+i]; + base.data = bdfc->bitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + GDrawDrawImage(pixmap,&gi,NULL, + r.x+2+bdfc->xmin, + CV_LAYERS2_HEADER_HEIGHT + i*CV_LAYERS2_LINE_HEIGHT+as-bdfc->ymax); + } + } +} + +#define MID_LayerInfo 1 +#define MID_NewLayer 2 +#define MID_DelLayer 3 +#define MID_First 4 +#define MID_Earlier 5 +#define MID_Later 6 +#define MID_Last 7 + +static void CVLayer2Invoked(GWindow v, GMenuItem *mi, GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(v); + Layer temp; + int layer = CVLayer(cv); + SplineChar *sc = cv->sc; + static int buts[] = { _STR_Yes, _STR_Cancel, 0 }; + int i; + + switch ( mi->mid ) { + case MID_LayerInfo: + if ( !LayerDialog(cv->layerheads[cv->drawmode])) +return; + break; + case MID_NewLayer: + LayerDefault(&temp); + if ( !LayerDialog(&temp)) +return; + sc->layers = grealloc(sc->layers,(sc->layer_cnt+1)*sizeof(Layer)); + sc->layers[sc->layer_cnt] = temp; + cv->layerheads[dm_fore] = &sc->layers[sc->layer_cnt]; + ++sc->layer_cnt; + break; + case MID_DelLayer: + if ( sc->layer_cnt==2 ) /* May not delete the last foreground layer */ +return; + if ( GWidgetAskR(_STR_CantBeUndone,buts,0,1,_STR_CantBeUndoneDoItAnyway)==1 ) +return; + SplinePointListsFree(sc->layers[layer].splines); + RefCharsFree(sc->layers[layer].refs); + ImageListsFree(sc->layers[layer].images); + UndoesFree(sc->layers[layer].undoes); + UndoesFree(sc->layers[layer].redoes); + for ( i=layer+1; ilayer_cnt; ++i ) + sc->layers[i-1] = sc->layers[i]; + --sc->layer_cnt; + if ( layer==sc->layer_cnt ) + cv->layerheads[dm_fore] = &sc->layers[layer-1]; + break; + case MID_First: + if ( layer==ly_fore ) +return; + temp = sc->layers[layer]; + for ( i=layer-1; i>=ly_fore; --i ) + sc->layers[i+1] = sc->layers[i]; + sc->layers[i+1] = temp; + cv->layerheads[dm_fore] = &sc->layers[ly_fore]; + break; + case MID_Earlier: + if ( layer==ly_fore ) +return; + temp = sc->layers[layer]; + sc->layers[layer] = sc->layers[layer-1]; + sc->layers[layer-1] = temp; + cv->layerheads[dm_fore] = &sc->layers[layer-1]; + break; + case MID_Later: + if ( layer==sc->layer_cnt-1 ) +return; + temp = sc->layers[layer]; + sc->layers[layer] = sc->layers[layer+1]; + sc->layers[layer+1] = temp; + cv->layerheads[dm_fore] = &sc->layers[layer+1]; + break; + case MID_Last: + if ( layer==sc->layer_cnt-1 ) +return; + temp = sc->layers[layer]; + for ( i=layer+1; ilayer_cnt; ++i ) + sc->layers[i-1] = sc->layers[i]; + sc->layers[i-1] = temp; + cv->layerheads[dm_fore] = &sc->layers[i-1]; + break; + } + CVLayers2Set(cv); + CVCharChangedUpdate(cv); +} + +static void Layer2Menu(CharView *cv,GEvent *event) { + GMenuItem mi[20]; + int i; + static int names[] = { _STR_LayerInfo, _STR_NewLayer, _STR_DelLayer, -1, + _STR_First, _STR_Earlier, _STR_Later, _STR_Last, 0 }; + static int mids[] = { MID_LayerInfo, MID_NewLayer, MID_DelLayer, -1, + MID_First, MID_Earlier, MID_Later, MID_Last, 0 }; + int layer = CVLayer(cv); + + memset(mi,'\0',sizeof(mi)); + for ( i=0; names[i]!=0; ++i ) { + if ( names[i]!=-1 ) { + mi[i].ti.text = (unichar_t *) names[i]; + mi[i].ti.text_in_resource = true; + } else + mi[i].ti.line = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = mids[i]; + mi[i].invoke = CVLayer2Invoked; + if (( mids[i]==MID_First || mids[i]==MID_Earlier ) && layer==ly_fore ) + mi[i].ti.disabled = true; + if (( mids[i]==MID_Last || mids[i]==MID_Later ) && layer==cv->sc->layer_cnt-1 ) + mi[i].ti.disabled = true; + if ( mids[i]==MID_DelLayer && cv->sc->layer_cnt==2 ) + mi[i].ti.disabled = true; + } + GMenuCreatePopupMenu(cvlayers2,event, mi); +} + +static void Layer2Scroll(CharView *cv, GEvent *event) { + int off = 0; + enum sb sbt = event->u.control.u.sb.type; + + if ( sbt==et_sb_top ) + off = 0; + else if ( sbt==et_sb_bottom ) + off = cv->sc->layer_cnt-1-CV_LAYERS2_VISLAYERS; + else if ( sbt==et_sb_up ) { + off = layer2.offtop-1; + } else if ( sbt==et_sb_down ) { + off = layer2.offtop+1; + } else if ( sbt==et_sb_uppage ) { + off = layer2.offtop-CV_LAYERS2_VISLAYERS+1; + } else if ( sbt==et_sb_downpage ) { + off = layer2.offtop+CV_LAYERS2_VISLAYERS-1; + } else /* if ( sbt==et_sb_thumb || sbt==et_sb_thumbrelease ) */ { + off = event->u.control.u.sb.pos; + } + if ( off>cv->sc->layer_cnt-1-CV_LAYERS2_VISLAYERS ) + off = cv->sc->layer_cnt-1-CV_LAYERS2_VISLAYERS; + if ( off<0 ) off=0; + if ( off==layer2.offtop ) +return; + layer2.offtop = off; + GScrollBarSetPos(GWidgetGetControl(cvlayers2,CID_SB),off); + GDrawRequestExpose(cvlayers2,NULL,false); +} + +static int cvlayers2_e_h(GWindow gw, GEvent *event) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( event->type==et_destroy ) { + cvlayers2 = NULL; +return( true ); + } + + if ( cv==NULL ) +return( true ); + + switch ( event->type ) { + case et_close: + GDrawSetVisible(gw,false); + break; + case et_char: case et_charup: + PostCharToWindow(cv->gw,event); + break; + case et_expose: + Layers2Expose(cv,gw,event); + break; + case et_mousedown: { + int layer = (event->u.mouse.y-CV_LAYERS2_HEADER_HEIGHT)/CV_LAYERS2_LINE_HEIGHT; + if ( event->u.mouse.y>CV_LAYERS2_HEADER_HEIGHT ) { + if ( layer<2 ) { + cv->drawmode = layer==0 ? dm_grid : dm_back; + layer2.active = layer; + } else { + layer2.active = layer+layer2.offtop; + cv->drawmode = dm_fore; + cv->layerheads[dm_fore] = &cv->sc->layers[layer-1+layer2.offtop]; + } + GDrawRequestExpose(cvlayers2,NULL,false); + GDrawRequestExpose(cv->v,NULL,false); + GDrawRequestExpose(cv->gw,NULL,false); /* the logo (where the scrollbars join) shows what layer we are in */ + if ( event->u.mouse.button==3 && cv->drawmode==dm_fore ) + Layer2Menu(cv,event); + else if ( event->u.mouse.clicks==2 && cv->drawmode==dm_fore ) { + if ( LayerDialog(cv->layerheads[cv->drawmode])) + CVCharChangedUpdate(cv); + } + } + } break; + case et_controlevent: + if ( event->u.control.subtype == et_radiochanged ) { + enum drawmode dm = cv->drawmode; + switch(GGadgetGetCid(event->u.control.g)) { + case CID_VFore: + CVShows.showfore = cv->showfore = GGadgetIsChecked(event->u.control.g); + break; + case CID_VBack: + CVShows.showback = cv->showback = GGadgetIsChecked(event->u.control.g); + break; + case CID_VGrid: + CVShows.showgrids = cv->showgrids = GGadgetIsChecked(event->u.control.g); + break; + } + GDrawRequestExpose(cv->v,NULL,false); + if ( dm!=cv->drawmode ) + GDrawRequestExpose(cv->gw,NULL,false); /* the logo (where the scrollbars join) shows what layer we are in */ + } else + Layer2Scroll(cv,event); + break; + } +return( true ); +} + +static void CVMakeLayers2(CharView *cv) { + GRect r; + GWindowAttrs wattrs; + GGadgetCreateData gcd[25]; + GTextInfo label[25]; + static GBox radio_box = { bt_none, bs_rect, 0, 0, 0, 0, 0,0,0,0, COLOR_DEFAULT,COLOR_DEFAULT }; + GFont *font; + FontRequest rq; + int i; + extern int _GScrollBar_Width; + + if ( layer2.clut==NULL ) + layer2.clut = _BDFClut(4); + if ( cvlayers2!=NULL ) +return; + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_positioned|wam_isdlg; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.positioned = true; + wattrs.is_dlg = true; + wattrs.window_title = GStringGetResource(_STR_Layers,NULL); + + r.width = GGadgetScale(CV_LAYERS2_WIDTH); r.height = CV_LAYERS_HEIGHT; + if ( cvlayersoff.x==-9999 ) { + cvlayersoff.x = -r.width-6; + cvlayersoff.y = cv->mbh+CV_TOOLS_HEIGHT+45/*25*/; /* 45 is right if there's decor, 25 when none. twm gives none, kde gives decor */ + } + r.x = cvlayersoff.x; r.y = cvlayersoff.y; + if ( palettes_docked ) { r.x = 0; r.y=CV_TOOLS_HEIGHT+2; } + cvlayers2 = CreatePalette( cv->gw, &r, cvlayers2_e_h, NULL, &wattrs, cv->v ); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + memset(&rq,'\0',sizeof(rq)); + rq.family_name = helv; + rq.point_size = -12; + rq.weight = 400; + font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(cvlayers2),&rq); + for ( i=0; igw,_GScrollBar_Width); + gcd[0].gd.pos.x = CV_LAYERS2_WIDTH-gcd[0].gd.pos.width; + gcd[0].gd.pos.y = CV_LAYERS2_HEADER_HEIGHT+2*CV_LAYERS2_LINE_HEIGHT; + gcd[0].gd.pos.height = CV_LAYERS_HEIGHT-gcd[0].gd.pos.y; + gcd[0].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels|gg_sb_vert; + gcd[0].gd.cid = CID_SB; + gcd[0].creator = GScrollBarCreate; + layer2.sb_start = gcd[0].gd.pos.x; + + label[1].text = (unichar_t *) _STR_V; + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 7; gcd[1].gd.pos.y = 5; + gcd[1].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels; + gcd[0].gd.popup_msg = GStringGetResource(_STR_IsVis,NULL); + gcd[1].creator = GLabelCreate; + + label[2].text = (unichar_t *) _STR_Layer; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 30; gcd[2].gd.pos.y = 5; + gcd[2].gd.flags = gg_enabled|gg_visible|gg_pos_in_pixels; + gcd[2].gd.popup_msg = GStringGetResource(_STR_IsEdit,NULL); + gcd[2].creator = GLabelCreate; + + gcd[3].gd.pos.x = 5; gcd[3].gd.pos.y = CV_LAYERS2_HEADER_HEIGHT+(CV_LAYERS2_LINE_HEIGHT-12)/2; + gcd[3].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[3].gd.cid = CID_VGrid; + gcd[3].gd.popup_msg = GStringGetResource(_STR_IsVis,NULL); + gcd[3].gd.box = &radio_box; + gcd[3].creator = GCheckBoxCreate; + + gcd[4].gd.pos.x = 5; gcd[4].gd.pos.y = gcd[3].gd.pos.y+CV_LAYERS2_LINE_HEIGHT; + gcd[4].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[4].gd.cid = CID_VBack; + gcd[4].gd.popup_msg = GStringGetResource(_STR_IsVis,NULL); + gcd[4].gd.box = &radio_box; + gcd[4].creator = GCheckBoxCreate; + + gcd[5].gd.pos.x = 5; gcd[5].gd.pos.y = gcd[4].gd.pos.y+CV_LAYERS2_LINE_HEIGHT; + gcd[5].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[5].gd.cid = CID_VFore; + gcd[5].gd.popup_msg = GStringGetResource(_STR_IsVis,NULL); + gcd[5].gd.box = &radio_box; + gcd[5].creator = GCheckBoxCreate; + + if ( cv->showgrids ) gcd[3].gd.flags |= gg_cb_on; + if ( cv->showback ) gcd[4].gd.flags |= gg_cb_on; + if ( cv->showfore ) gcd[5].gd.flags |= gg_cb_on; + + GGadgetsCreate(cvlayers2,gcd); + GDrawSetVisible(cvlayers2,true); +} + +static void LayersSwitch(CharView *cv) { +} + +void SCMoreLayers(SplineChar *sc) { /* We've added more layers */ + CharView *curcv; + if ( cvtools==NULL || !sc->parent->multilayer ) +return; + curcv = GDrawGetUserData(cvtools); + if ( curcv->sc!=sc ) +return; + CVLayers2Set(curcv); +} + +void SCLayersChange(SplineChar *sc) { /* many of the foreground layers need to be redrawn */ + CharView *curcv; + if ( cvtools==NULL || !sc->parent->multilayer ) +return; + curcv = GDrawGetUserData(cvtools); + if ( curcv->sc!=sc ) +return; + CVLayers2Set(curcv); +} + +void CVLayerChange(CharView *cv) { /* Current layer needs to be redrawn */ + CharView *curcv; + int layer; + + if ( cvtools==NULL || !cv->sc->parent->multilayer ) +return; + curcv = GDrawGetUserData(cvtools); + if ( curcv!=cv ) +return; + if ( cv->drawmode==dm_grid || cv->drawmode==dm_back ) +return; + layer = CVLayer(cv); + BDFCharFree(layer2.layers[layer+1]); + layer2.layers[layer+1] = BDFCharFromLayer(cv->sc,layer); + GDrawRequestExpose(cvlayers2,NULL,false); +} +#endif + +void CVLayersSet(CharView *cv) { + +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) { + CVLayers2Set(cv); +return; + } +#endif + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VFore),cv->showfore); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VBack),cv->showback); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VGrid),cv->showgrids); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VVHints),cv->showvhints); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VHHints),cv->showhhints); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VDHints),cv->showdhints); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VAnchor),cv->showanchor); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VHMetrics),cv->showhmetrics); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VVMetrics),cv->showvmetrics); + GGadgetSetChecked(GWidgetGetControl(cvlayers, + cv->drawmode==dm_fore?CID_EFore: + cv->drawmode==dm_back?CID_EBack:CID_EGrid ),true); + GGadgetSetEnabled(GWidgetGetControl(cvlayers,CID_VVMetrics), + cv->sc->parent->hasvmetrics); + GGadgetSetEnabled(GWidgetGetControl(cvlayers,CID_VVMetricsLab), + cv->sc->parent->hasvmetrics); + GGadgetSetChecked(GWidgetGetControl(cvlayers,CID_VBlues),cv->showblues); + + GGadgetSetEnabled(GWidgetGetControl(cvlayers,CID_EBack),!cv->show_ft_results); + GGadgetSetEnabled(GWidgetGetControl(cvlayers,CID_EGrid),!cv->show_ft_results); +} + +static int cvlayers_e_h(GWindow gw, GEvent *event) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + + if ( event->type==et_destroy ) { + cvlayers = NULL; +return( true ); + } + + if ( cv==NULL ) +return( true ); + + switch ( event->type ) { + case et_close: + GDrawSetVisible(gw,false); + break; + case et_char: case et_charup: + PostCharToWindow(cv->gw,event); + break; + case et_controlevent: + if ( event->u.control.subtype == et_radiochanged ) { + enum drawmode dm = cv->drawmode; + switch(GGadgetGetCid(event->u.control.g)) { + case CID_VFore: + CVShows.showfore = cv->showfore = GGadgetIsChecked(event->u.control.g); + break; + case CID_VBack: + CVShows.showback = cv->showback = GGadgetIsChecked(event->u.control.g); + break; + case CID_VGrid: + CVShows.showgrids = cv->showgrids = GGadgetIsChecked(event->u.control.g); + break; + case CID_VHHints: + CVShows.showhhints = cv->showhhints = + CVShows.showmdy = cv->showmdy = + GGadgetIsChecked(event->u.control.g); + cv->back_img_out_of_date = true; /* only this cv */ + break; + case CID_VVHints: + CVShows.showvhints = cv->showvhints = + CVShows.showmdx = cv->showmdx = + GGadgetIsChecked(event->u.control.g); + cv->back_img_out_of_date = true; /* only this cv */ + break; + case CID_VDHints: + CVShows.showdhints = cv->showdhints = + GGadgetIsChecked(event->u.control.g); + cv->back_img_out_of_date = true; /* only this cv */ + break; + case CID_VAnchor: + CVShows.showanchor = cv->showanchor = GGadgetIsChecked(event->u.control.g); + break; + case CID_VHMetrics: + CVShows.showhmetrics = cv->showhmetrics = GGadgetIsChecked(event->u.control.g); + break; + case CID_VVMetrics: + CVShows.showvmetrics = cv->showvmetrics = GGadgetIsChecked(event->u.control.g); + break; + case CID_VBlues: + CVShows.showfamilyblues = cv->showfamilyblues = + CVShows.showblues = cv->showblues = GGadgetIsChecked(event->u.control.g); + cv->back_img_out_of_date = true; /* only this cv */ + break; + case CID_EFore: + cv->drawmode = dm_fore; + cv->lastselpt = NULL; + break; + case CID_EBack: + cv->drawmode = dm_back; + cv->lastselpt = NULL; + break; + case CID_EGrid: + cv->drawmode = dm_grid; + cv->lastselpt = NULL; + break; + } + GDrawRequestExpose(cv->v,NULL,false); + if ( dm!=cv->drawmode ) + GDrawRequestExpose(cv->gw,NULL,false); /* the logo (where the scrollbars join) shows what layer we are in */ + } + break; + } +return( true ); +} + +int CVPaletteMnemonicCheck(GEvent *event) { + static struct strmatch { int str; int cid; } strmatch[] = { + { _STR_Fore, CID_EFore }, + { _STR_Back, CID_EBack }, + { _STR_Grid, CID_EGrid }, + { 0 } + }; + unichar_t mn, mnc; + int i; + const unichar_t *foo; + GEvent fake; + GGadget *g; +#ifdef FONTFORGE_CONFIG_TYPE3 + CharView *cv; +#endif + + if ( cvtools==NULL ) +return( false ); +#ifdef FONTFORGE_CONFIG_TYPE3 + cv = GDrawGetUserData(cvtools); +#endif + + for ( i=0; strmatch[i].str!=0 ; ++i ) { + foo = GStringGetResource(strmatch[i].str,&mn); + mnc = mn; + if ( islower(mn)) mnc = toupper(mn); + else if ( isupper(mn)) mnc = tolower(mn); + if ( event->u.chr.chars[0]==mn || event->u.chr.chars[0]==mnc ) { +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) { + fake.type = et_mousedown; + fake.w = cvlayers; + fake.u.mouse.x = 40; + if ( strmatch[i].cid==CID_EGrid ) { + fake.u.mouse.y = CV_LAYERS2_HEADER_HEIGHT+12; + } else if ( strmatch[i].cid==CID_EBack ) { + fake.u.mouse.y = CV_LAYERS2_HEADER_HEIGHT+12+CV_LAYERS2_LINE_HEIGHT; + } else { + fake.u.mouse.y = CV_LAYERS2_HEADER_HEIGHT+12+2*CV_LAYERS2_LINE_HEIGHT; + } + cvlayers2_e_h(cvlayers2,&fake); + } else +#endif + { + if ( !GGadgetIsChecked(g)) { + GGadgetSetChecked(g,true); + fake.type = et_controlevent; + fake.w = cvlayers; + fake.u.control.subtype = et_radiochanged; + fake.u.control.g = g; + cvlayers_e_h(cvlayers,&fake); + } + } +return( true ); + } + } +return( false ); +} + +GWindow CVMakeLayers(CharView *cv) { + GRect r; + GWindowAttrs wattrs; + GGadgetCreateData gcd[25]; + GTextInfo label[25]; + static GBox radio_box = { bt_none, bs_rect, 0, 0, 0, 0, 0,0,0,0, COLOR_DEFAULT,COLOR_DEFAULT }; + GFont *font; + FontRequest rq; + int i, base; + + if ( cvlayers!=NULL ) +return( cvlayers ); + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_positioned|wam_isdlg; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.positioned = true; + wattrs.is_dlg = true; + wattrs.window_title = GStringGetResource(_STR_Layers,NULL); + + r.width = GGadgetScale(104); r.height = CV_LAYERS_HEIGHT; + if ( cvlayersoff.x==-9999 ) { + cvlayersoff.x = -r.width-6; + cvlayersoff.y = cv->mbh+CV_TOOLS_HEIGHT+45/*25*/; /* 45 is right if there's decor, 25 when none. twm gives none, kde gives decor */ + } + r.x = cvlayersoff.x; r.y = cvlayersoff.y; + if ( palettes_docked ) { r.x = 0; r.y=CV_TOOLS_HEIGHT+2; } + cvlayers = CreatePalette( cv->gw, &r, cvlayers_e_h, NULL, &wattrs, cv->v ); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + memset(&rq,'\0',sizeof(rq)); + rq.family_name = helv; + rq.point_size = -12; + rq.weight = 400; + font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(cvlayers),&rq); + for ( i=0; idrawmode].gd.flags |= gg_cb_on; + base += 3; + + label[base].text = (unichar_t *) _STR_HHints; + label[base].text_in_resource = true; + gcd[base].gd.label = &label[base]; + gcd[base].gd.pos.x = 47; gcd[base].gd.pos.y = 72; + gcd[base].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[base++].creator = GLabelCreate; + + label[base].text = (unichar_t *) _STR_VHints; + label[base].text_in_resource = true; + gcd[base].gd.label = &label[base]; + gcd[base].gd.pos.x = 47; gcd[base].gd.pos.y = 89; + gcd[base].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[base++].creator = GLabelCreate; + + label[base].text = (unichar_t *) _STR_DHints; + label[base].text_in_resource = true; + gcd[base].gd.label = &label[base]; + gcd[base].gd.pos.x = 47; gcd[base].gd.pos.y = 106; + gcd[base].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[base++].creator = GLabelCreate; + + label[base].text = (unichar_t *) _STR_Blues; + label[base].text_in_resource = true; + gcd[base].gd.label = &label[base]; + gcd[base].gd.pos.x = 47; gcd[base].gd.pos.y = 123; + gcd[base].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[base++].creator = GLabelCreate; + + label[base].text = (unichar_t *) _STR_Anchors; + label[base].text_in_resource = true; + gcd[base].gd.label = &label[base]; + gcd[base].gd.pos.x = 47; gcd[base].gd.pos.y = 140; + gcd[base].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[base++].creator = GLabelCreate; + + label[base].text = (unichar_t *) _STR_HMetrics; + label[base].text_in_resource = true; + gcd[base].gd.label = &label[base]; + gcd[base].gd.pos.x = 47; gcd[base].gd.pos.y = 157; + gcd[base].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[base++].creator = GLabelCreate; + + label[base].text = (unichar_t *) _STR_VMetrics; + label[base].text_in_resource = true; + gcd[base].gd.label = &label[base]; + gcd[base].gd.pos.x = 47; gcd[base].gd.pos.y = 174; + gcd[base].gd.flags = gg_enabled|gg_visible|gg_dontcopybox|gg_pos_in_pixels; + gcd[base].gd.cid = CID_VVMetricsLab; + gcd[base++].creator = GLabelCreate; + + gcd[base].gd.pos.x = 1; gcd[base].gd.pos.y = 1; + gcd[base].gd.pos.width = r.width-2; gcd[base].gd.pos.height = r.height-2; + gcd[base].gd.flags = gg_enabled | gg_visible|gg_pos_in_pixels; + gcd[base++].creator = GGroupCreate; + + if ( cv->showfore ) gcd[3].gd.flags |= gg_cb_on; + if ( cv->showback ) gcd[4].gd.flags |= gg_cb_on; + if ( cv->showgrids ) gcd[5].gd.flags |= gg_cb_on; + if ( cv->showhhints ) gcd[6].gd.flags |= gg_cb_on; + if ( cv->showvhints ) gcd[7].gd.flags |= gg_cb_on; + if ( cv->showdhints ) gcd[8].gd.flags |= gg_cb_on; + if ( cv->showblues ) gcd[9].gd.flags |= gg_cb_on; + if ( cv->showanchor ) gcd[10].gd.flags |= gg_cb_on; + if ( cv->showhmetrics ) gcd[11].gd.flags |= gg_cb_on; + if ( cv->showvmetrics ) gcd[12].gd.flags |= gg_cb_on; + if ( !cv->sc->parent->hasvmetrics ) { + gcd[12].gd.flags &= ~gg_enabled; + gcd[base-2].gd.flags &= ~gg_enabled; + } + + GGadgetsCreate(cvlayers,gcd); + GDrawSetVisible(cvlayers,true); +return( cvlayers ); +} + +static void CVPopupInvoked(GWindow v, GMenuItem *mi, GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(v); + int pos; + + pos = mi->mid; + if ( (pos==14 && rectelipse) || (pos==15 && polystar )) + pos += 2; + if ( cv->had_control ) { + if ( cv->cb1_tool!=pos ) { + cv->cb1_tool = pos; + GDrawRequestExpose(cvtools,NULL,false); + } + } else { + if ( cv->b1_tool!=pos ) { + cv->b1_tool = pos; + GDrawRequestExpose(cvtools,NULL,false); + } + } + CVToolsSetCursor(cv,cv->had_control?ksm_control:0,NULL); +} + +static void CVPopupLayerInvoked(GWindow v, GMenuItem *mi, GEvent *e) { + int cid; + GGadget *g; + GEvent fake; + + cid = mi->mid==0 ? CID_EFore : mi->mid==1 ? CID_EBack : CID_EGrid; + g = GWidgetGetControl(cvlayers,cid); + if ( !GGadgetIsChecked(g)) { + GGadgetSetChecked(g,true); + fake.type = et_controlevent; + fake.w = cvlayers; + fake.u.control.subtype = et_radiochanged; + fake.u.control.g = g; + cvlayers_e_h(cvlayers,&fake); + } +} + +static void CVPopupSelectInvoked(GWindow v, GMenuItem *mi, GEvent *e) { + CharView *cv = (CharView *) GDrawGetUserData(v); + + switch ( mi->mid ) { + case 0: + CVPGetInfo(cv); + break; + case 1: + if ( cv->p.ref!=NULL ) + CharViewCreate(cv->p.ref->sc,cv->fv); + break; + case 2: + CVAddAnchor(cv); + break; + } +} + +void CVToolsPopup(CharView *cv, GEvent *event) { + GMenuItem mi[125]; + int i, j, anysel; + static int selectables[] = { _STR_Getinfo, _STR_OpenReference, _STR_AddAnchor, 0 }; + + memset(mi,'\0',sizeof(mi)); + for ( i=0;i<16; ++i ) { + mi[i].ti.text = (unichar_t *) popupsres[i]; + mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = i; + mi[i].invoke = CVPopupInvoked; + } + + if ( cvlayers!=NULL && !cv->sc->parent->multilayer ) { + mi[i].ti.line = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i++].ti.bg = COLOR_DEFAULT; + for ( j=0;j<3; ++j, ++i ) { + mi[i].ti.text = (unichar_t *) editablelayers[j]; + mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = j; + mi[i].invoke = CVPopupLayerInvoked; + } + } + + anysel = CVTestSelectFromEvent(cv,event); + mi[i].ti.line = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i++].ti.bg = COLOR_DEFAULT; + for ( j=0;selectables[j]!=0; ++j, ++i ) { + mi[i].ti.text = (unichar_t *) selectables[j]; + mi[i].ti.text_in_resource = true; + if ( (!anysel && j!=2 ) || + ( j==0 && cv->p.spline!=NULL ) || + ( j==1 && cv->p.ref==NULL )) + mi[i].ti.disabled = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = j; + mi[i].invoke = CVPopupSelectInvoked; + } + + cv->had_control = (event->u.mouse.state&ksm_control)?1:0; + GMenuCreatePopupMenu(cv->v,event, mi); +} + +static void CVPaletteCheck(CharView *cv) { + if ( cvtools==NULL ) { + if ( palettes_fixed ) { + cvtoolsoff.x = 0; cvtoolsoff.y = 0; + } + CVMakeTools(cv); + } +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer && cvlayers2==NULL ) { + if ( palettes_fixed ) { + cvlayersoff.x = 0; cvlayersoff.y = CV_TOOLS_HEIGHT+45/*25*/; /* 45 is right if there's decor, 25 when none. twm gives none, kde gives decor */ + } + CVMakeLayers2(cv); + } else if ( !cv->sc->parent->multilayer && cvlayers==NULL ) { +#else + if ( cvlayers==NULL ) { +#endif + if ( palettes_fixed ) { + cvlayersoff.x = 0; cvlayersoff.y = CV_TOOLS_HEIGHT+45/*25*/; /* 45 is right if there's decor, 25 when none. twm gives none, kde gives decor */ + } + CVMakeLayers(cv); + } +} + +int CVPaletteIsVisible(CharView *cv,int which) { + CVPaletteCheck(cv); + if ( which==1 ) +return( cvtools!=NULL && GDrawIsVisible(cvtools) ); + +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) +return( cvlayers2!=NULL && GDrawIsVisible(cvlayers2)); +#endif + +return( cvlayers!=NULL && GDrawIsVisible(cvlayers) ); +} + +void CVPaletteSetVisible(CharView *cv,int which,int visible) { + CVPaletteCheck(cv); + if ( which==1 && cvtools!=NULL) + GDrawSetVisible(cvtools,visible ); +#ifdef FONTFORGE_CONFIG_TYPE3 + else if ( which==0 && cv->sc->parent->multilayer && cvlayers2!=NULL ) + GDrawSetVisible(cvlayers2,visible ); +#endif + else if ( which==0 && cvlayers!=NULL ) + GDrawSetVisible(cvlayers,visible ); + cvvisible[which] = visible; +} + +void CVPalettesRaise(CharView *cv) { + if ( cvtools!=NULL && GDrawIsVisible(cvtools)) + GDrawRaise(cvtools); + if ( cvlayers!=NULL && GDrawIsVisible(cvlayers)) + GDrawRaise(cvlayers); +} + +void _CVPaletteActivate(CharView *cv,int force) { + CharView *old; + + CVPaletteCheck(cv); + if ( (old = GDrawGetUserData(cvtools))!=cv || force) { + if ( old!=NULL ) { + SaveOffsets(old->gw,cvtools,&cvtoolsoff); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( old->sc->parent->multilayer ) + SaveOffsets(old->gw,cvlayers2,&cvlayersoff); + else +#endif + SaveOffsets(old->gw,cvlayers,&cvlayersoff); + } + GDrawSetUserData(cvtools,cv); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) { + LayersSwitch(cv); + GDrawSetUserData(cvlayers2,cv); + } else +#endif + GDrawSetUserData(cvlayers,cv); + if ( palettes_docked ) { + ReparentFixup(cvtools,cv->v,0,0,CV_TOOLS_WIDTH,CV_TOOLS_HEIGHT); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) + ReparentFixup(cvlayers2,cv->v,0,CV_TOOLS_HEIGHT+2,0,0); + else +#endif + ReparentFixup(cvlayers,cv->v,0,CV_TOOLS_HEIGHT+2,0,0); + } else { + if ( cvvisible[0]) { +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) + RestoreOffsets(cv->gw,cvlayers2,&cvlayersoff); + else +#endif + RestoreOffsets(cv->gw,cvlayers,&cvlayersoff); + } + if ( cvvisible[1]) + RestoreOffsets(cv->gw,cvtools,&cvtoolsoff); + } + GDrawSetVisible(cvtools,cvvisible[1]); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) + GDrawSetVisible(cvlayers2,cvvisible[0]); + else +#endif + GDrawSetVisible(cvlayers,cvvisible[0]); + if ( cvvisible[1]) { + cv->showing_tool = cvt_none; + CVToolsSetCursor(cv,0,NULL); + GDrawRequestExpose(cvtools,NULL,false); + } + if ( cvvisible[0]) + CVLayersSet(cv); + } + if ( bvtools!=NULL ) { + BitmapView *bv = GDrawGetUserData(bvtools); + if ( bv!=NULL ) { + SaveOffsets(bv->gw,bvtools,&bvtoolsoff); + SaveOffsets(bv->gw,bvlayers,&bvlayersoff); + if ( !bv->shades_hidden ) + SaveOffsets(bv->gw,bvshades,&bvshadesoff); + GDrawSetUserData(bvtools,NULL); + GDrawSetUserData(bvlayers,NULL); + GDrawSetUserData(bvshades,NULL); + } + GDrawSetVisible(bvtools,false); + GDrawSetVisible(bvlayers,false); + GDrawSetVisible(bvshades,false); + } +} + +void CVPaletteActivate(CharView *cv) { + _CVPaletteActivate(cv,false); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +void SFLayerChange(SplineFont *sf) { + CharView *old; + if ( cvtools==NULL ) +return; /* No charviews open */ + old = GDrawGetUserData(cvtools); + if ( old->sc->parent!=sf ) /* Irrelevant */ +return; + _CVPaletteActivate(old,true); +} +#endif + +void CVPalettesHideIfMine(CharView *cv) { + if ( cvtools==NULL ) +return; + if ( GDrawGetUserData(cvtools)==cv ) { + SaveOffsets(cv->gw,cvtools,&cvtoolsoff); + GDrawSetVisible(cvtools,false); + GDrawSetUserData(cvtools,NULL); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer ) { + SaveOffsets(cv->gw,cvlayers2,&cvlayersoff); + GDrawSetVisible(cvlayers2,false); + GDrawSetUserData(cvlayers2,NULL); + } else +#endif + { + SaveOffsets(cv->gw,cvlayers,&cvlayersoff); + GDrawSetVisible(cvlayers,false); + GDrawSetUserData(cvlayers,NULL); + } + } +} + +int CVPalettesWidth(void) { +#ifdef FONTFORGE_CONFIG_TYPE3 +return( GGadgetScale(CV_LAYERS2_WIDTH)); +#else +return( GGadgetScale(CV_LAYERS_WIDTH)); +#endif +} + +/* ************************************************************************** */ +/* **************************** Bitmap Palettes ***************************** */ +/* ************************************************************************** */ + +static void BVLayersSet(BitmapView *bv) { + GGadgetSetChecked(GWidgetGetControl(bvlayers,CID_VFore),bv->showfore); + GGadgetSetChecked(GWidgetGetControl(bvlayers,CID_VBack),bv->showoutline); + GGadgetSetChecked(GWidgetGetControl(bvlayers,CID_VGrid),bv->showgrid); +} + +static int bvlayers_e_h(GWindow gw, GEvent *event) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + if ( event->type==et_destroy ) { + bvlayers = NULL; +return( true ); + } + + if ( bv==NULL ) +return( true ); + + switch ( event->type ) { + case et_close: + GDrawSetVisible(gw,false); + break; + case et_char: case et_charup: + PostCharToWindow(bv->gw,event); + break; + case et_controlevent: + if ( event->u.control.subtype == et_radiochanged ) { + switch(GGadgetGetCid(event->u.control.g)) { + case CID_VFore: + BVShows.showfore = bv->showfore = GGadgetIsChecked(event->u.control.g); + break; + case CID_VBack: + BVShows.showoutline = bv->showoutline = GGadgetIsChecked(event->u.control.g); + break; + case CID_VGrid: + BVShows.showgrid = bv->showgrid = GGadgetIsChecked(event->u.control.g); + break; + } + GDrawRequestExpose(bv->v,NULL,false); + } + break; + } +return( true ); +} + +GWindow BVMakeLayers(BitmapView *bv) { + GRect r; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + static GBox radio_box = { bt_none, bs_rect, 0, 0, 0, 0, 0,0,0,0, COLOR_DEFAULT,COLOR_DEFAULT }; + GFont *font; + FontRequest rq; + int i; + + if ( bvlayers!=NULL ) +return(bvlayers); + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_positioned|wam_isdlg; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.positioned = true; + wattrs.is_dlg = true; + wattrs.window_title = GStringGetResource(_STR_Layers,NULL); + + r.width = GGadgetScale(BV_LAYERS_WIDTH); r.height = BV_LAYERS_HEIGHT; + r.x = -r.width-6; r.y = bv->mbh+BV_TOOLS_HEIGHT+45/*25*/; /* 45 is right if there's decor, is in kde, not in twm. Sigh */ + if ( palettes_docked ) { + r.x = 0; r.y = BV_TOOLS_HEIGHT+4; + } else if ( palettes_fixed ) { + r.x = 0; r.y = BV_TOOLS_HEIGHT+45; + } + bvlayers = CreatePalette( bv->gw, &r, bvlayers_e_h, bv, &wattrs, bv->v ); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + memset(&rq,'\0',sizeof(rq)); + rq.family_name = helv; + rq.point_size = -12; + rq.weight = 400; + font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(bvlayers),&rq); + for ( i=0; ishowfore ) gcd[3].gd.flags |= gg_cb_on; + if ( bv->showoutline ) gcd[4].gd.flags |= gg_cb_on; + if ( bv->showgrid ) gcd[5].gd.flags |= gg_cb_on; + + GGadgetsCreate(bvlayers,gcd); + GDrawSetVisible(bvlayers,true); +return( bvlayers ); +} + +struct shades_layout { + int depth; + int div; + int cnt; /* linear number of squares */ + int size; +}; + +static void BVShadesDecompose(BitmapView *bv, struct shades_layout *lay) { + GRect r; + int temp; + + GDrawGetSize(bvshades,&r); + lay->depth = BDFDepth(bv->bdf); + lay->div = 255/((1<depth)-1); + lay->cnt = lay->depth==8 ? 16 : lay->depth; + temp = r.width>r.height ? r.height : r.width; + lay->size = (temp-8+1)/lay->cnt - 1; +} + +static void BVShadesExpose(GWindow pixmap, BitmapView *bv, GRect *r) { + struct shades_layout lay; + GRect old; + int i,j,index; + GRect block; + Color bg = GDrawGetDefaultBackground(NULL); + int greybg = (3*COLOR_RED(bg)+6*COLOR_GREEN(bg)+COLOR_BLUE(bg))/10; + + GDrawSetLineWidth(pixmap,0); + BVShadesDecompose(bv,&lay); + GDrawPushClip(pixmap,r,&old); + for ( i=0; i<=lay.cnt; ++i ) { + int p = 3+i*(lay.size+1); + int m = 8+lay.cnt*(lay.size+1); + GDrawDrawLine(pixmap,p,0,p,m,bg); + GDrawDrawLine(pixmap,0,p,m,p,bg); + } + block.width = block.height = lay.size; + for ( i=0; icolor >= index - lay.div/2 && + bv->color <= index + lay.div/2 ) { + GRect outline; + outline.x = block.x-1; outline.y = block.y-1; + outline.width = block.width+1; outline.height = block.height+1; + GDrawDrawRect(pixmap,&outline,0x00ff00); + } + index = (255-index) * greybg / 255; + GDrawFillRect(pixmap,&block,0x010101*index); + } + } +} + +static void BVShadesMouse(BitmapView *bv, GEvent *event) { + struct shades_layout lay; + int i, j; + + GGadgetEndPopup(); + if ( event->type == et_mousemove && !bv->shades_down ) +return; + BVShadesDecompose(bv,&lay); + if ( event->u.mouse.x<4 || event->u.mouse.y<4 || + event->u.mouse.x>=4+lay.cnt*(lay.size+1) || + event->u.mouse.y>=4+lay.cnt*(lay.size+1) ) +return; + i = (event->u.mouse.y-4)/(lay.size+1); + j = (event->u.mouse.x-4)/(lay.size+1); + if ( bv->color != (i*lay.cnt + j)*lay.div ) { + bv->color = (i*lay.cnt + j)*lay.div; + GDrawRequestExpose(bvshades,NULL,false); + } + if ( event->type == et_mousedown ) bv->shades_down = true; + else if ( event->type == et_mouseup ) bv->shades_down = false; + if ( event->type == et_mouseup ) + GDrawRequestExpose(bv->gw,NULL,false); +} + +static int bvshades_e_h(GWindow gw, GEvent *event) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + if ( event->type==et_destroy ) { + bvshades = NULL; +return( true ); + } + + if ( bv==NULL ) +return( true ); + + switch ( event->type ) { + case et_expose: + BVShadesExpose(gw,bv,&event->u.expose.rect); + break; + case et_mousemove: + case et_mouseup: + case et_mousedown: + BVShadesMouse(bv,event); + break; + break; + case et_char: case et_charup: + PostCharToWindow(bv->gw,event); + break; + case et_destroy: + break; + case et_close: + GDrawSetVisible(gw,false); + break; + } +return( true ); +} + +static GWindow BVMakeShades(BitmapView *bv) { + GRect r; + GWindowAttrs wattrs; + + if ( bvshades!=NULL ) +return( bvshades ); + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_positioned|wam_isdlg/*|wam_backcol*/; + wattrs.event_masks = -1; + wattrs.cursor = ct_eyedropper; + wattrs.positioned = true; + wattrs.is_dlg = true; + wattrs.background_color = 0xffffff; + wattrs.window_title = GStringGetResource(_STR_Shades,NULL); + + r.width = BV_SHADES_HEIGHT; r.height = r.width; + r.x = -r.width-6; r.y = bv->mbh+225; + if ( palettes_docked ) { + r.x = 0; r.y = BV_TOOLS_HEIGHT+BV_LAYERS_HEIGHT+4; + } else if ( palettes_fixed ) { + r.x = 0; r.y = BV_TOOLS_HEIGHT+BV_LAYERS_HEIGHT+90; + } + bvshades = CreatePalette( bv->gw, &r, bvshades_e_h, bv, &wattrs, bv->v ); + bv->shades_hidden = BDFDepth(bv->bdf)==1; + GDrawSetVisible(bvshades,!bv->shades_hidden); +return( bvshades ); +} + +static int bvpopups[] = { _STR_Pointer, _STR_PopMag, + _STR_PopPencil, _STR_PopLine, + _STR_PopShift, _STR_PopHand }; + +static void BVToolsExpose(GWindow pixmap, BitmapView *bv, GRect *r) { + GRect old; + /* Note: If you change this ordering, change enum bvtools */ + static GImage *buttons[][2] = { { &GIcon_pointer, &GIcon_magnify }, + { &GIcon_pencil, &GIcon_line }, + { &GIcon_shift, &GIcon_hand }}; + int i,j,norm; + int tool = bv->cntrldown?bv->cb1_tool:bv->b1_tool; + int dither = GDrawSetDither(NULL,false); + + GDrawPushClip(pixmap,r,&old); + GDrawSetLineWidth(pixmap,0); + for ( i=0; iactive_tool!=bvt_none ) + shouldshow = bv->active_tool; + else if ( bv->pressed_display!=bvt_none ) + shouldshow = bv->pressed_display; + else if ( device==NULL || strcmp(device,"Mouse1")==0 ) { + if ( (state&(ksm_shift|ksm_control)) && (state&ksm_button4)) + shouldshow = bvt_magnify; + else if ( (state&(ksm_shift|ksm_control)) && (state&ksm_button5)) + shouldshow = bvt_minify; + else if ( (state&ksm_control) && (state&(ksm_button2|ksm_super)) ) + shouldshow = bv->cb2_tool; + else if ( (state&(ksm_button2|ksm_super)) ) + shouldshow = bv->b2_tool; + else if ( (state&ksm_control) ) + shouldshow = bv->cb1_tool; + else + shouldshow = bv->b1_tool; + } else if ( strcmp(device,"eraser")==0 ) + shouldshow = bv->er_tool; + else if ( strcmp(device,"stylus")==0 ) { + if ( (state&(ksm_button2|ksm_control|ksm_super)) ) + shouldshow = bv->s2_tool; + else + shouldshow = bv->s1_tool; + } + + if ( shouldshow==bvt_magnify && (state&ksm_meta)) + shouldshow = bvt_minify; + if ( (shouldshow==bvt_pencil || shouldshow==bvt_line) && (state&ksm_meta) && bv->bdf->clut!=NULL ) + shouldshow = bvt_eyedropper; + if ( shouldshow!=bv->showing_tool ) { + GDrawSetCursor(bv->v,tools[shouldshow]); + if ( bvtools != NULL ) + GDrawSetCursor(bvtools,tools[shouldshow]); + bv->showing_tool = shouldshow; + } + + if ( device==NULL || strcmp(device,"stylus")==0 ) { + cntrl = (state&ksm_control)?1:0; + if ( device!=NULL && (state&ksm_button2)) + cntrl = true; + if ( cntrl != bv->cntrldown ) { + bv->cntrldown = cntrl; + GDrawRequestExpose(bvtools,NULL,false); + } + } +} + +static void BVToolsMouse(BitmapView *bv, GEvent *event) { + int i = (event->u.mouse.y/27), j = (event->u.mouse.x/27); + int pos; + int isstylus = event->u.mouse.device!=NULL && strcmp(event->u.mouse.device,"stylus")==0; + int styluscntl = isstylus && (event->u.mouse.state&0x200); + + pos = i*2 + j; + GGadgetEndPopup(); + if ( pos<0 || pos>=bvt_max ) + pos = bvt_none; + if ( event->type == et_mousedown ) { + if ( isstylus && event->u.mouse.button==2 ) + /* Not a real button press, only touch counts. This is a modifier */; + else { + bv->pressed_tool = bv->pressed_display = pos; + bv->had_control = ((event->u.mouse.state&ksm_control) || styluscntl)?1:0; + event->u.chr.state |= (1<<(7+event->u.mouse.button)); + } + } else if ( event->type == et_mousemove ) { + if ( bv->pressed_tool==bvt_none && pos!=bvt_none ) { + /* Not pressed */ + if ( !bv->shades_hidden && bvpopups[pos]==_STR_PopPencil ) + GGadgetPreparePopupR(bvtools,_STR_PopPencilGrey); + else + GGadgetPreparePopupR(bvtools,bvpopups[pos]); + } else if ( pos!=bv->pressed_tool || bv->had_control != (((event->u.mouse.state&ksm_control)||styluscntl)?1:0) ) + bv->pressed_display = bvt_none; + else + bv->pressed_display = bv->pressed_tool; + } else if ( event->type == et_mouseup ) { + if ( pos!=bv->pressed_tool || bv->had_control != (((event->u.mouse.state&ksm_control)||styluscntl)?1:0) ) + bv->pressed_tool = bv->pressed_display = bvt_none; + else { + if ( event->u.mouse.device!=NULL && strcmp(event->u.mouse.device,"eraser")==0 ) + bv->er_tool = pos; + else if ( isstylus ) { + if ( event->u.mouse.button==2 ) + /* Only thing that matters is touch which maps to button 1 */; + else if ( bv->had_control ) + bv->s2_tool = pos; + else + bv->s1_tool = pos; + } else if ( bv->had_control && event->u.mouse.button==2 ) + bv->cb2_tool = pos; + else if ( event->u.mouse.button==2 ) + bv->b2_tool = pos; + else if ( bv->had_control ) { + if ( bv->cb1_tool!=pos ) { + bv->cb1_tool = pos; + GDrawRequestExpose(bvtools,NULL,false); + } + } else { + if ( bv->b1_tool!=pos ) { + bv->b1_tool = pos; + GDrawRequestExpose(bvtools,NULL,false); + } + } + bv->pressed_tool = bv->pressed_display = bvt_none; + } + event->u.mouse.state &= ~(1<<(7+event->u.mouse.button)); + } + BVToolsSetCursor(bv,event->u.mouse.state,event->u.mouse.device); +} + +static int bvtools_e_h(GWindow gw, GEvent *event) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(gw); + + if ( event->type==et_destroy ) { + bvtools = NULL; +return( true ); + } + + if ( bv==NULL ) +return( true ); + + switch ( event->type ) { + case et_expose: + BVToolsExpose(gw,bv,&event->u.expose.rect); + break; + case et_mousedown: + BVToolsMouse(bv,event); + break; + case et_mousemove: + BVToolsMouse(bv,event); + break; + case et_mouseup: + BVToolsMouse(bv,event); + break; + case et_crossing: + bv->pressed_display = bvt_none; + BVToolsSetCursor(bv,event->u.mouse.state,event->u.mouse.device); + break; + case et_char: case et_charup: + if ( bv->had_control != ((event->u.chr.state&ksm_control)?1:0) ) + bv->pressed_display = bvt_none; + PostCharToWindow(bv->gw,event); + break; + case et_close: + GDrawSetVisible(gw,false); + break; + } +return( true ); +} + +GWindow BVMakeTools(BitmapView *bv) { + GRect r; + GWindowAttrs wattrs; + + if ( bvtools!=NULL ) +return( bvtools ); + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_positioned|wam_isdlg; + wattrs.event_masks = -1; + wattrs.cursor = ct_mypointer; + wattrs.positioned = true; + wattrs.is_dlg = true; + wattrs.window_title = GStringGetResource(_STR_Tools,NULL); + + r.width = BV_TOOLS_WIDTH; r.height = BV_TOOLS_HEIGHT; + r.x = -r.width-6; r.y = bv->mbh+20; + if ( palettes_fixed || palettes_docked ) { + r.x = 0; r.y = 0; + } + bvtools = CreatePalette( bv->gw, &r, bvtools_e_h, bv, &wattrs, bv->v ); + GDrawSetVisible(bvtools,true); +return( bvtools ); +} + +static void BVPopupInvoked(GWindow v, GMenuItem *mi,GEvent *e) { + BitmapView *bv = (BitmapView *) GDrawGetUserData(v); + int pos; + + pos = mi->mid; + if ( bv->had_control ) { + if ( bv->cb1_tool!=pos ) { + bv->cb1_tool = pos; + GDrawRequestExpose(bvtools,NULL,false); + } + } else { + if ( bv->b1_tool!=pos ) { + bv->b1_tool = pos; + GDrawRequestExpose(bvtools,NULL,false); + } + } + BVToolsSetCursor(bv,bv->had_control?ksm_control:0,NULL); +} + +void BVToolsPopup(BitmapView *bv, GEvent *event) { + GMenuItem mi[21]; + int i, j; + + memset(mi,'\0',sizeof(mi)); + for ( i=0;i<6; ++i ) { + mi[i].ti.text = (unichar_t *) bvpopups[i]; + mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = i; + mi[i].invoke = BVPopupInvoked; + } + + mi[i].ti.text = (unichar_t *) _STR_Rectangle; mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = bvt_rect; + mi[i++].invoke = BVPopupInvoked; + mi[i].ti.text = (unichar_t *) _STR_FilledRectangle; mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = bvt_filledrect; + mi[i++].invoke = BVPopupInvoked; + mi[i].ti.text = (unichar_t *) _STR_Elipse; mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = bvt_elipse; + mi[i++].invoke = BVPopupInvoked; + mi[i].ti.text = (unichar_t *) _STR_FilledElipse; mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = bvt_filledelipse; + mi[i++].invoke = BVPopupInvoked; + + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i++].ti.line = true; + for ( j=0; j<6; ++j, ++i ) { + mi[i].ti.text = (unichar_t *) BVFlipNames[j]; + mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = j; + mi[i].invoke = BVMenuRotateInvoked; + } + if ( bv->fv->sf->onlybitmaps ) { + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i++].ti.line = true; + mi[i].ti.text = (unichar_t *) _STR_Setwidth; mi[i].ti.text_in_resource = true; + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].mid = bvt_setwidth; + mi[i].invoke = BVPopupInvoked; + } + bv->had_control = (event->u.mouse.state&ksm_control)?1:0; + GMenuCreatePopupMenu(bv->v,event, mi); +} + +static void BVPaletteCheck(BitmapView *bv) { + if ( bvtools==NULL ) { + BVMakeTools(bv); + BVMakeLayers(bv); + BVMakeShades(bv); + } +} + +int BVPaletteIsVisible(BitmapView *bv,int which) { + BVPaletteCheck(bv); + if ( which==1 ) +return( bvtools!=NULL && GDrawIsVisible(bvtools) ); + if ( which==2 ) +return( bvshades!=NULL && GDrawIsVisible(bvshades) ); + +return( bvlayers!=NULL && GDrawIsVisible(bvlayers) ); +} + +void BVPaletteSetVisible(BitmapView *bv,int which,int visible) { + BVPaletteCheck(bv); + if ( which==1 && bvtools!=NULL) + GDrawSetVisible(bvtools,visible ); + else if ( which==1 && bvshades!=NULL) + GDrawSetVisible(bvshades,visible ); + else if ( which==0 && bvlayers!=NULL ) + GDrawSetVisible(bvlayers,visible ); + bvvisible[which] = visible; +} + +void BVPaletteActivate(BitmapView *bv) { + BitmapView *old; + + BVPaletteCheck(bv); + if ( (old = GDrawGetUserData(bvtools))!=bv ) { + if ( old!=NULL ) { + SaveOffsets(old->gw,bvtools,&bvtoolsoff); + SaveOffsets(old->gw,bvlayers,&bvlayersoff); + SaveOffsets(old->gw,bvshades,&bvshadesoff); + } + GDrawSetUserData(bvtools,bv); + GDrawSetUserData(bvlayers,bv); + GDrawSetUserData(bvshades,bv); + if ( palettes_docked ) { + ReparentFixup(bvtools,bv->v,0,0,BV_TOOLS_WIDTH,BV_TOOLS_HEIGHT); + ReparentFixup(bvlayers,bv->v,0,BV_TOOLS_HEIGHT+2,0,0); + ReparentFixup(bvshades,bv->v,0,BV_TOOLS_HEIGHT+BV_TOOLS_HEIGHT+4,0,0); + } else { + if ( bvvisible[0]) + RestoreOffsets(bv->gw,bvlayers,&bvlayersoff); + if ( bvvisible[1]) + RestoreOffsets(bv->gw,bvtools,&bvtoolsoff); + if ( bvvisible[2] && !bv->shades_hidden ) + RestoreOffsets(bv->gw,bvshades,&bvshadesoff); + } + GDrawSetVisible(bvtools,bvvisible[1]); + GDrawSetVisible(bvlayers,bvvisible[0]); + GDrawSetVisible(bvshades,bvvisible[2] && bv->bdf->clut!=NULL); + if ( bvvisible[1]) { + bv->showing_tool = bvt_none; + BVToolsSetCursor(bv,0,NULL); + GDrawRequestExpose(bvtools,NULL,false); + } + if ( bvvisible[0]) + BVLayersSet(bv); + if ( bvvisible[2] && !bv->shades_hidden ) + GDrawRequestExpose(bvtools,NULL,false); + } + if ( cvtools!=NULL ) { + CharView *cv = GDrawGetUserData(cvtools); + if ( cv!=NULL ) { + SaveOffsets(cv->gw,cvtools,&cvtoolsoff); + SaveOffsets(cv->gw,cvlayers,&cvlayersoff); + GDrawSetUserData(cvtools,NULL); + GDrawSetUserData(cvlayers,NULL); + } + GDrawSetVisible(cvtools,false); + GDrawSetVisible(cvlayers,false); + } +} + +void BVPalettesHideIfMine(BitmapView *bv) { + if ( bvtools==NULL ) +return; + if ( GDrawGetUserData(bvtools)==bv ) { + SaveOffsets(bv->gw,bvtools,&bvtoolsoff); + SaveOffsets(bv->gw,bvlayers,&bvlayersoff); + SaveOffsets(bv->gw,bvshades,&bvshadesoff); + GDrawSetVisible(bvtools,false); + GDrawSetVisible(bvlayers,false); + GDrawSetVisible(bvshades,false); + GDrawSetUserData(bvtools,NULL); + GDrawSetUserData(bvlayers,NULL); + GDrawSetUserData(bvshades,NULL); + } +} + +void CVPaletteDeactivate(void) { + if ( cvtools!=NULL ) { + CharView *cv = GDrawGetUserData(cvtools); + if ( cv!=NULL ) { + SaveOffsets(cv->gw,cvtools,&cvtoolsoff); + GDrawSetUserData(cvtools,NULL); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->sc->parent->multilayer && cvlayers2!=NULL ) { + SaveOffsets(cv->gw,cvlayers2,&cvlayersoff); + GDrawSetUserData(cvlayers2,NULL); + } else +#endif + if ( cvlayers!=NULL ) { + SaveOffsets(cv->gw,cvlayers,&cvlayersoff); + GDrawSetUserData(cvlayers,NULL); + } + } + GDrawSetVisible(cvtools,false); + if ( cvlayers!=NULL ) + GDrawSetVisible(cvlayers,false); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cvlayers2!=NULL ) + GDrawSetVisible(cvlayers2,false); +#endif + } + if ( bvtools!=NULL ) { + BitmapView *bv = GDrawGetUserData(bvtools); + if ( bv!=NULL ) { + SaveOffsets(bv->gw,bvtools,&bvtoolsoff); + SaveOffsets(bv->gw,bvlayers,&bvlayersoff); + SaveOffsets(bv->gw,bvshades,&bvshadesoff); + GDrawSetUserData(bvtools,NULL); + GDrawSetUserData(bvlayers,NULL); + GDrawSetUserData(bvshades,NULL); + } + GDrawSetVisible(bvtools,false); + GDrawSetVisible(bvlayers,false); + GDrawSetVisible(bvshades,false); + } +} + +void BVPaletteColorChange(BitmapView *bv) { + if ( bvshades!=NULL ) + GDrawRequestExpose(bvshades,NULL,false); + GDrawRequestExpose(bv->gw,NULL,false); +} + +void BVPaletteChangedChar(BitmapView *bv) { + if ( bvshades!=NULL ) { + int hidden = bv->bdf->clut==NULL; + if ( hidden!=bv->shades_hidden ) { + GDrawSetVisible(bvshades,!hidden); + bv->shades_hidden = hidden; + GDrawRequestExpose(bv->gw,NULL,false); + } else + GDrawRequestExpose(bvshades,NULL,false); + } +} + +void PalettesChangeDocking(void) { + + palettes_docked = !palettes_docked; + if ( palettes_docked ) { + if ( cvtools!=NULL ) { + CharView *cv = GDrawGetUserData(cvtools); + if ( cv!=NULL ) { + ReparentFixup(cvtools,cv->v,0,0,CV_TOOLS_WIDTH,CV_TOOLS_HEIGHT); + if ( cvlayers!=NULL ) + ReparentFixup(cvlayers,cv->v,0,CV_TOOLS_HEIGHT+2,0,0); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cvlayers2!=NULL ) + ReparentFixup(cvlayers2,cv->v,0,CV_TOOLS_HEIGHT+2,0,0); +#endif + } + } + if ( bvtools!=NULL ) { + BitmapView *bv = GDrawGetUserData(bvtools); + if ( bv!=NULL ) { + ReparentFixup(bvtools,bv->v,0,0,BV_TOOLS_WIDTH,BV_TOOLS_HEIGHT); + ReparentFixup(bvlayers,bv->v,0,BV_TOOLS_HEIGHT+2,0,0); + ReparentFixup(bvshades,bv->v,0,BV_TOOLS_HEIGHT+BV_LAYERS_HEIGHT+4,0,0); + } + } + } else { + if ( cvtools!=NULL ) { + GDrawReparentWindow(cvtools,GDrawGetRoot(NULL),0,0); + if ( cvlayers!=NULL ) + GDrawReparentWindow(cvlayers,GDrawGetRoot(NULL),0,CV_TOOLS_HEIGHT+2+45); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cvlayers2!=NULL ) + GDrawReparentWindow(cvlayers2,GDrawGetRoot(NULL),0,CV_TOOLS_HEIGHT+2+45); +#endif + } + if ( bvtools!=NULL ) { + GDrawReparentWindow(bvtools,GDrawGetRoot(NULL),0,0); + GDrawReparentWindow(bvlayers,GDrawGetRoot(NULL),0,BV_TOOLS_HEIGHT+2+45); + GDrawReparentWindow(bvshades,GDrawGetRoot(NULL),0,BV_TOOLS_HEIGHT+BV_LAYERS_HEIGHT+4+90); + } + } + SavePrefs(); +} + +int BVPalettesWidth(void) { +return( GGadgetScale(BV_LAYERS_WIDTH)); +} diff --git a/fontforge/cvpointer.c b/fontforge/cvpointer.c new file mode 100644 index 00000000..b2bfafbc --- /dev/null +++ b/fontforge/cvpointer.c @@ -0,0 +1,1042 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include + +extern int stop_at_join; + +/* if they changed the width, then change the width on all bitmap chars of */ +/* ours, and if we are a letter, then change the width on all chars linked */ +/* to us which had the same width that we used to have (so if we change the */ +/* width of A, we'll also change that of Á and  and ... */ +void SCSynchronizeWidth(SplineChar *sc,real newwidth, real oldwidth, FontView *flagfv) { + BDFFont *bdf; + struct splinecharlist *dlist; + FontView *fv = sc->parent->fv; + + sc->widthset = true; + if ( newwidth==oldwidth ) +return; + sc->width = newwidth; + for ( bdf=sc->parent->bitmaps; bdf!=NULL; bdf=bdf->next ) { + BDFChar *bc = bdf->chars[sc->enc]; + if ( bc!=NULL ) { + int width = rint(sc->width*bdf->pixelsize / (real) (sc->parent->ascent+sc->parent->descent)); + if ( bc->width!=width ) { + /*BCPreserveWidth(bc);*/ /* Bitmaps can't set width, so no undo for it */ + bc->width = width; + BCCharChangedUpdate(bc); + } + } + } + + if ( !adjustwidth ) +return; + + if ( sc->unicodeenc==-1 || sc->unicodeenc>=0x10000 || + !isalpha(sc->unicodeenc) || iscombining(sc->unicodeenc)) +return; + for ( dlist=sc->dependents; dlist!=NULL; dlist=dlist->next ) { + if ( dlist->sc->width==oldwidth && + (flagfv==NULL || !flagfv->selected[dlist->sc->enc])) { + SCSynchronizeWidth(dlist->sc,newwidth,oldwidth,fv); + if ( !dlist->sc->changed ) { + dlist->sc->changed = true; + if ( fv!=NULL ) + FVToggleCharChanged(dlist->sc); + } + SCUpdateAll(dlist->sc); + } + } +} + +/* If they change the left bearing of a character, then in all chars */ +/* that depend on it should be adjusted too. */ +/* Also all vstem hints */ +/* I deliberately don't set undoes in the dependants. The change is not */ +/* in them, after all */ +void SCSynchronizeLBearing(SplineChar *sc,char *selected,real off) { + struct splinecharlist *dlist; + RefChar *ref; + DStemInfo *d; + StemInfo *h; + HintInstance *hi; + + for ( h=sc->vstem; h !=NULL; h=h->next ) + h->start += off; + for ( h=sc->hstem; h !=NULL; h=h->next ) + for ( hi = h->where; hi!=NULL; hi=hi->next ) { + hi->begin += off; + hi->end += off; + } + for ( d=sc->dstem; d !=NULL; d=d->next ) { + d->leftedgetop.x += off; + d->rightedgetop.x += off; + d->leftedgebottom.x += off; + d->rightedgebottom.x += off; + } + + if ( !adjustlbearing ) +return; + + if ( sc->unicodeenc==-1 || sc->unicodeenc>=0x10000 || + !isalpha(sc->unicodeenc) || iscombining(sc->unicodeenc)) +return; + + for ( dlist=sc->dependents; dlist!=NULL; dlist=dlist->next ) { + if ( sc->width!=dlist->sc->width ) + continue; + if ( selected==NULL || !selected[dlist->sc->enc] ) { + SCPreserveState(dlist->sc,false); + SplinePointListShift(dlist->sc->layers[ly_fore].splines,off,true); + for ( ref = dlist->sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + if ( ref->sc!=sc && (selected==NULL || !selected[ref->sc->enc] )) { + SplinePointListShift(ref->layers[0].splines,off,true); + ref->transform[4] += off; + ref->bb.minx += off; ref->bb.maxx += off; + } + SCUpdateAll(dlist->sc); + SCSynchronizeLBearing(dlist->sc,selected,off); + } + } +} + +int CVAnySel(CharView *cv, int *anyp, int *anyr, int *anyi, int *anya) { + int anypoints = 0, anyrefs=0, anyimages=0, anyanchor=0; + SplinePointList *spl; + Spline *spline, *first; + RefChar *rf; + ImageList *il; + AnchorPoint *ap; + + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL && !anypoints; spl = spl->next ) { + first = NULL; + if ( spl->first->selected ) anypoints = true; + for ( spline=spl->first->next; spline!=NULL && spline!=first && !anypoints; spline = spline->to->next ) { + if ( spline->to->selected ) anypoints = true; + if ( first == NULL ) first = spline; + } + } + for ( rf=cv->layerheads[cv->drawmode]->refs; rf!=NULL && !anyrefs; rf=rf->next ) + if ( rf->selected ) anyrefs = true; + if ( cv->drawmode==dm_fore ) { + if ( cv->showanchor && anya!=NULL ) + for ( ap=cv->sc->anchor; ap!=NULL && !anyanchor; ap=ap->next ) + if ( ap->selected ) anyanchor = true; + } + for ( il=cv->layerheads[cv->drawmode]->images; il!=NULL && !anyimages; il=il->next ) + if ( il->selected ) anyimages = true; + if ( anyp!=NULL ) *anyp = anypoints; + if ( anyr!=NULL ) *anyr = anyrefs; + if ( anyi!=NULL ) *anyi = anyimages; + if ( anya!=NULL ) *anya = anyanchor; +return( anypoints || anyrefs || anyimages || anyanchor ); +} + +int CVClearSel(CharView *cv) { + SplinePointList *spl; + Spline *spline, *first; + RefChar *rf; + ImageList *img; + int needsupdate = 0; + AnchorPoint *ap; + + cv->lastselpt = NULL; + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + if ( spl->first->selected ) { needsupdate = true; spl->first->selected = false; } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( spline->to->selected ) + { needsupdate = true; spline->to->selected = false; } + if ( first==NULL ) first = spline; + } + } + for ( rf=cv->layerheads[cv->drawmode]->refs; rf!=NULL; rf = rf->next ) + if ( rf->selected ) { needsupdate = true; rf->selected = false; } + if ( cv->drawmode == dm_fore ) + for ( ap=cv->sc->anchor; ap!=NULL; ap = ap->next ) + if ( ap->selected ) { if ( cv->showanchor ) needsupdate = true; ap->selected = false; } + for ( img=cv->layerheads[cv->drawmode]->images; img!=NULL; img = img->next ) + if ( img->selected ) { needsupdate = true; img->selected = false; } + if ( cv->p.nextcp || cv->p.prevcp || cv->widthsel || cv->vwidthsel ) + needsupdate = true; + cv->p.nextcp = cv->p.prevcp = false; + cv->widthsel = cv->vwidthsel = false; +return( needsupdate ); +} + +int CVSetSel(CharView *cv,int mask) { + SplinePointList *spl; + Spline *spline, *first; + RefChar *rf; + ImageList *img; + int needsupdate = 0; + AnchorPoint *ap; + + cv->lastselpt = NULL; + if ( mask&1 ) + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + if ( !spl->first->selected ) { needsupdate = true; spl->first->selected = true; } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( !spline->to->selected ) + { needsupdate = true; spline->to->selected = true; } + cv->lastselpt = spline->to; + if ( first==NULL ) first = spline; + } + } + if ( mask&1 ) { + for ( rf=cv->layerheads[cv->drawmode]->refs; rf!=NULL; rf = rf->next ) + if ( !rf->selected ) { needsupdate = true; rf->selected = true; } + for ( img=cv->layerheads[cv->drawmode]->images; img!=NULL; img = img->next ) + if ( !img->selected ) { needsupdate = true; img->selected = true; } + } + if ( (mask&2) && cv->showanchor ) { + for ( ap=cv->sc->anchor; ap!=NULL; ap=ap->next ) + if ( !ap->selected ) { needsupdate = true; ap->selected = true; } + } + if ( cv->p.nextcp || cv->p.prevcp ) + needsupdate = true; + cv->p.nextcp = cv->p.prevcp = false; + if ( cv->showhmetrics && !cv->widthsel && (mask&4)) { + cv->widthsel = needsupdate = true; + cv->oldwidth = cv->sc->width; + } + if ( cv->showvmetrics && cv->sc->parent->hasvmetrics && !cv->vwidthsel && (mask&4)) { + cv->vwidthsel = needsupdate = true; + cv->oldvwidth = cv->sc->vwidth; + } +return( needsupdate ); +} + +int CVAllSelected(CharView *cv) { + SplinePointList *spl; + Spline *spline, *first; + RefChar *rf; + ImageList *img; + + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + if ( !spl->first->selected ) +return( false ); + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( !spline->to->selected ) +return( false ); + if ( first==NULL ) first = spline; + } + } + for ( rf=cv->layerheads[cv->drawmode]->refs; rf!=NULL; rf = rf->next ) + if ( !rf->selected ) +return( false ); + for ( img=cv->layerheads[cv->drawmode]->images; img!=NULL; img = img->next ) + if ( !img->selected ) +return( false ); +return( true ); +} + +static void SplineSetFindSelBounds(SplinePointList *spl, DBounds *bounds, + int nosel) { + SplinePoint *sp, *first; + + for ( ; spl!=NULL; spl = spl->next ) { + first = NULL; + for ( sp = spl->first; sp!=first; sp = sp->next->to ) { + if ( (nosel || sp->selected) && + bounds->minx==0 && bounds->maxx==0 && + bounds->miny==0 && bounds->maxy == 0 ) { + bounds->minx = bounds->maxx = sp->me.x; + bounds->miny = bounds->maxy = sp->me.y; + } else if ( nosel || sp->selected ) { + if ( sp->me.xminx ) bounds->minx = sp->me.x; + if ( sp->me.x>bounds->maxx ) bounds->maxx = sp->me.x; + if ( sp->me.yminy ) bounds->miny = sp->me.y; + if ( sp->me.y>bounds->maxy ) bounds->maxy = sp->me.y; + } + if ( first==NULL ) first = sp; + if ( sp->next==NULL ) + break; + } + } +} + +void CVFindCenter(CharView *cv, BasePoint *bp, int nosel) { + DBounds b; + ImageList *img; + + b.minx = b.miny = b.maxx = b.maxy = 0; + SplineSetFindSelBounds(cv->layerheads[cv->drawmode]->splines,&b,nosel); + if ( cv->drawmode==dm_fore ) { + RefChar *rf; + for ( rf=cv->layerheads[cv->drawmode]->refs; rf!=NULL; rf=rf->next ) { + if ( nosel || rf->selected ) { + if ( b.minx==0 && b.maxx==0 ) + b = rf->bb; + else { + if ( rf->bb.minxbb.minx; + if ( rf->bb.minybb.miny; + if ( rf->bb.maxx>b.maxx ) b.maxx = rf->bb.maxx; + if ( rf->bb.maxy>b.maxy ) b.maxy = rf->bb.maxy; + } + } + } + } + for ( img=cv->layerheads[cv->drawmode]->images; img!=NULL; img=img->next ) { + if ( nosel || img->selected ) { + if ( b.minx==0 && b.maxx==0 ) + b = img->bb; + else { + if ( img->bb.minxbb.minx; + if ( img->bb.minybb.miny; + if ( img->bb.maxx>b.maxx ) b.maxx = img->bb.maxx; + if ( img->bb.maxy>b.maxy ) b.maxy = img->bb.maxy; + } + } + } + bp->x = (b.minx+b.maxx)/2; + bp->y = (b.miny+b.maxy)/2; +} + +static int OnBB(CharView *cv, DBounds *bb, real fudge) { + + if ( cv->info.y < bb->miny-fudge || cv->info.y > bb->maxy+fudge || + cv->info.x < bb->minx-fudge || cv->info.x > bb->maxx+fudge ) +return( ee_none ); + + cv->expandorigin.x = (cv->info.x-bb->minx)<(bb->maxx-cv->info.x) ? + bb->maxx : bb->minx; + cv->expandorigin.y = (cv->info.y-bb->miny)<(bb->maxy-cv->info.y) ? + bb->maxy : bb->miny; + cv->expandwidth = cv->expandorigin.x==bb->maxx? bb->minx-bb->maxx : bb->maxx-bb->minx; + cv->expandheight = cv->expandorigin.y==bb->maxy? bb->miny-bb->maxy : bb->maxy-bb->miny; + + if (( cv->info.x < bb->minx + fudge && cv->info.y < bb->miny+ 4*fudge ) || + ( cv->info.x < bb->minx + 4*fudge && cv->info.y < bb->miny+ fudge )) { +return( ee_sw ); + } + if (( cv->info.x < bb->minx + fudge && cv->info.y > bb->maxy- 4*fudge ) || + ( cv->info.x < bb->minx + 4*fudge && cv->info.y > bb->maxy- fudge )) +return( ee_nw ); + if (( cv->info.x > bb->maxx - fudge && cv->info.y < bb->miny+ 4*fudge ) || + ( cv->info.x > bb->maxx - 4*fudge && cv->info.y < bb->miny+ fudge )) +return( ee_se ); + if (( cv->info.x > bb->maxx - fudge && cv->info.y > bb->maxy- 4*fudge ) || + ( cv->info.x > bb->maxx - 4*fudge && cv->info.y > bb->maxy- fudge )) +return( ee_ne ); + if ( cv->info.x < bb->minx + fudge ) +return( ee_right ); + if ( cv->info.x > bb->maxx - fudge ) +return( ee_left ); + if ( cv->info.y < bb->miny + fudge ) +return( ee_down ); + if ( cv->info.y > bb->maxy - fudge ) +return( ee_up ); + +return( ee_none ); +} + +static void SetCur(CharView *cv) { + static GCursor cursors[ee_max]; + + if ( cursors[ee_nw]==0 ) { + cursors[ee_none] = ct_mypointer; + cursors[ee_nw] = cursors[ee_se] = ct_nwse; cursors[ee_ne] = cursors[ee_sw] = ct_nesw; + cursors[ee_left] = cursors[ee_right] = ct_leftright; + cursors[ee_up] = cursors[ee_down] = ct_updown; + } + GDrawSetCursor(cv->v,cursors[cv->expandedge]); +} + +static int NearCaret(SplineChar *sc,real x,real fudge ) { + PST *pst; + int i; + + for ( pst=sc->possub; pst!=NULL && pst->type!=pst_lcaret; pst=pst->next ); + if ( pst==NULL ) +return( -1 ); + for ( i=0; iu.lcaret.cnt; ++i ) { + if ( x>pst->u.lcaret.carets[i]-fudge && xu.lcaret.carets[i]+fudge ) +return( i ); + } +return( -1 ); +} + +void CVCheckResizeCursors(CharView *cv) { + RefChar *ref; + ImageList *img; + int old_ee = cv->expandedge; + real fudge = 3.5/cv->scale; + + cv->expandedge = ee_none; + if ( cv->drawmode==dm_fore ) { + for ( ref=cv->layerheads[cv->drawmode]->refs; ref!=NULL; ref=ref->next ) if ( ref->selected ) { + if (( cv->expandedge = OnBB(cv,&ref->bb,fudge))!=ee_none ) + break; + } + if ( cv->expandedge == ee_none ) { + if ( cv->showhmetrics && cv->info.x > cv->sc->width-fudge && + cv->info.xsc->width+fudge && cv->searcher==NULL ) + cv->expandedge = ee_right; + else if ( cv->showhmetrics && NearCaret(cv->sc,cv->info.x,fudge)!=-1 ) + cv->expandedge = ee_right; + if ( cv->showvmetrics && cv->sc->parent->hasvmetrics && cv->searcher==NULL && + cv->info.y > cv->sc->parent->vertical_origin-cv->sc->vwidth-fudge && + cv->info.y < cv->sc->parent->vertical_origin-cv->sc->vwidth+fudge ) + cv->expandedge = ee_down; + } + } + for ( img=cv->layerheads[cv->drawmode]->images; img!=NULL; img=img->next ) if ( img->selected ) { + if (( cv->expandedge = OnBB(cv,&img->bb,fudge))!=ee_none ) + break; + } + if ( cv->expandedge!=old_ee ) + SetCur(cv); +} + +static int ImgRefEdgeSelected(CharView *cv, FindSel *fs,GEvent *event) { + RefChar *ref; + ImageList *img; + int update; + + cv->expandedge = ee_none; + /* Check the bounding box of references if meta is up, or if they didn't */ + /* click on a reference edge. Point being to allow people to select */ + /* macron or other reference which fills the bounding box */ + if ( cv->drawmode==dm_fore && (!(event->u.chr.state&ksm_meta) || + (fs->p->ref!=NULL && !fs->p->ref->selected))) { + for ( ref=cv->layerheads[cv->drawmode]->refs; ref!=NULL; ref=ref->next ) if ( ref->selected ) { + if (( cv->expandedge = OnBB(cv,&ref->bb,fs->fudge))!=ee_none ) { + ref->selected = false; + update = CVClearSel(cv); + ref->selected = true; + if ( update ) + SCUpdateAll(cv->sc); + CVPreserveTState(cv); + SetCur(cv); +return( true ); + } + } + } + for ( img=cv->layerheads[cv->drawmode]->images; img!=NULL; img=img->next ) if ( img->selected ) { + if (( cv->expandedge = OnBB(cv,&img->bb,fs->fudge))!=ee_none ) { + img->selected = false; + update = CVClearSel(cv); + img->selected = true; + if ( update ) + SCUpdateAll(cv->sc); + CVPreserveTState(cv); + SetCur(cv); +return( true ); + } + } +return( false ); +} + +void CVMouseDownPointer(CharView *cv, FindSel *fs, GEvent *event) { + int needsupdate = false; + int dowidth, dovwidth, nearcaret; + + if ( cv->pressed==NULL ) + cv->pressed = GDrawRequestTimer(cv->v,200,100,NULL); + cv->last_c.x = cv->info.x; cv->last_c.y = cv->info.y; + /* don't clear the selection if the things we clicked on were already */ + /* selected, or if the user held the shift key down */ + if ( ImgRefEdgeSelected(cv,fs,event)) +return; + dowidth = ( cv->showhmetrics && cv->p.cx>cv->sc->width-fs->fudge && + cv->p.cxsc->width+fs->fudge && cv->searcher==NULL ); + dovwidth = ( cv->showvmetrics && cv->sc->parent->hasvmetrics && cv->searcher == NULL && + cv->p.cy>cv->sc->parent->vertical_origin-cv->sc->vwidth-fs->fudge && + cv->p.cysc->parent->vertical_origin-cv->sc->vwidth+fs->fudge ); + cv->nearcaret = nearcaret = -1; + if ( cv->showhmetrics ) nearcaret = NearCaret(cv->sc,cv->p.cx,fs->fudge); + if ( (fs->p->sp==NULL || !fs->p->sp->selected) && + (fs->p->ref==NULL || !fs->p->ref->selected) && + (fs->p->img==NULL || !fs->p->img->selected) && + (fs->p->ap==NULL || !fs->p->ap->selected) && + (!dowidth || !cv->widthsel) && + (!dovwidth || !cv->vwidthsel) && + !(event->u.mouse.state&ksm_shift)) + needsupdate = CVClearSel(cv); + if ( !fs->p->anysel ) { + /* Nothing else... unless they clicked on the width line, check that */ + if ( dowidth ) { + if ( event->u.mouse.state&ksm_shift ) + cv->widthsel = !cv->widthsel; + else + cv->widthsel = true; + if ( cv->widthsel ) { + cv->oldwidth = cv->sc->width; + fs->p->cx = cv->sc->width; + CVInfoDraw(cv,cv->gw); + fs->p->anysel = true; + cv->expandedge = ee_right; + } else + cv->expandedge = ee_none; + SetCur(cv); + needsupdate = true; + } else if ( dovwidth ) { + if ( event->u.mouse.state&ksm_shift ) + cv->vwidthsel = !cv->vwidthsel; + else + cv->vwidthsel = true; + if ( cv->vwidthsel ) { + cv->oldvwidth = cv->sc->vwidth; + fs->p->cy = cv->sc->parent->vertical_origin-cv->sc->vwidth; + CVInfoDraw(cv,cv->gw); + fs->p->anysel = true; + cv->expandedge = ee_down; + } else + cv->expandedge = ee_none; + SetCur(cv); + needsupdate = true; + } else if ( nearcaret!=-1 ) { + PST *pst; + for ( pst=cv->sc->possub; pst!=NULL && pst->type!=pst_lcaret; pst=pst->next ); + cv->lcarets = pst; + cv->nearcaret = nearcaret; + cv->expandedge = ee_right; + SetCur(cv); + } + } else if ( event->u.mouse.clicks<=1 && !(event->u.mouse.state&ksm_shift)) { + if ( fs->p->nextcp || fs->p->prevcp ) + /* Nothing to do */; + else if ( fs->p->sp!=NULL ) { + if ( !fs->p->sp->selected ) needsupdate = true; + fs->p->sp->selected = true; + } else if ( fs->p->spline!=NULL ) { + if ( !fs->p->spline->to->selected && + !fs->p->spline->from->selected ) needsupdate = true; + fs->p->spline->to->selected = true; + fs->p->spline->from->selected = true; + } else if ( fs->p->img!=NULL ) { + if ( !fs->p->img->selected ) needsupdate = true; + fs->p->img->selected = true; + } else if ( fs->p->ref!=NULL ) { + if ( !fs->p->ref->selected ) needsupdate = true; + fs->p->ref->selected = true; + } else if ( fs->p->ap!=NULL ) { + if ( !fs->p->ap->selected ) needsupdate = true; + fs->p->ap->selected = true; + } + } else if ( event->u.mouse.clicks<=1 ) { + if ( fs->p->nextcp || fs->p->prevcp ) + /* Nothing to do */; + else if ( fs->p->sp!=NULL ) { + needsupdate = true; + fs->p->sp->selected = !fs->p->sp->selected; + } else if ( fs->p->spline!=NULL ) { + needsupdate = true; + fs->p->spline->to->selected = !fs->p->spline->to->selected; + fs->p->spline->from->selected = !fs->p->spline->from->selected; + } else if ( fs->p->img!=NULL ) { + needsupdate = true; + fs->p->img->selected = !fs->p->img->selected; + } else if ( fs->p->ref!=NULL ) { + needsupdate = true; + fs->p->ref->selected = !fs->p->ref->selected; + } else if ( fs->p->ap!=NULL ) { + needsupdate = true; + fs->p->ap->selected = !fs->p->ap->selected; + } + } else if ( event->u.mouse.clicks==2 ) { + if ( fs->p->spl!=NULL ) { + Spline *spline, *first; + if ( !fs->p->spl->first->selected ) { needsupdate = true; fs->p->spl->first->selected = true; } + first = NULL; + for ( spline = fs->p->spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( !spline->to->selected ) + { needsupdate = true; spline->to->selected = true; } + if ( first==NULL ) first = spline; + } + } else if ( fs->p->ref!=NULL || fs->p->img!=NULL ) { + /* Double clicking on a referenced character doesn't do much */ + } else if ( fs->p->ap!=NULL ) { + /* Select all Anchor Points at this location */ + AnchorPoint *ap; + for ( ap=cv->sc->anchor; ap!=NULL; ap=ap->next ) + if ( ap->me.x==fs->p->ap->me.x && ap->me.y==fs->p->ap->me.y ) + if ( !ap->selected ) { + ap->selected = true; + needsupdate = true; + } + } + } else if ( event->u.mouse.clicks==3 ) { + if ( CVSetSel(cv,1)) needsupdate = true; + /* don't select width or anchor points for three clicks */ + /* but select all points, refs */ + } else { + /* Select everything */ + if ( CVSetSel(cv,-1)) needsupdate = true; + } + if ( needsupdate ) + SCUpdateAll(cv->sc); + /* lastselpt is set by our caller */ +} + +static int CVRectSelect(CharView *cv, real newx, real newy) { + int any=false; + DBounds old, new; + RefChar *rf; + ImageList *img; + Spline *spline, *first; + SplinePointList *spl; + BasePoint *bp; + AnchorPoint *ap; + DBounds bb; + + if ( cv->p.cx<=cv->p.ex ) { + old.minx = cv->p.cx; + old.maxx = cv->p.ex; + } else { + old.minx = cv->p.ex; + old.maxx = cv->p.cx; + } + if ( cv->p.cy<=cv->p.ey ) { + old.miny = cv->p.cy; + old.maxy = cv->p.ey; + } else { + old.miny = cv->p.ey; + old.maxy = cv->p.cy; + } + + if ( cv->p.cx<=newx ) { + new.minx = cv->p.cx; + new.maxx = newx; + } else { + new.minx = newx; + new.maxx = cv->p.cx; + } + if ( cv->p.cy<=newy ) { + new.miny = cv->p.cy; + new.maxy = newy; + } else { + new.miny = newy; + new.maxy = cv->p.cy; + } + + if ( cv->drawmode==dm_fore ) { + for ( rf = cv->layerheads[cv->drawmode]->refs; rf!=NULL; rf=rf->next ) { + if (( rf->bb.minx>=old.minx && rf->bb.maxxbb.miny>=old.miny && rf->bb.maxybb.minx>=new.minx && rf->bb.maxxbb.miny>=new.miny && rf->bb.maxyselected = !rf->selected; + any = true; + } + } + if ( cv->showanchor ) for ( ap=cv->sc->anchor ; ap!=NULL; ap=ap->next ) { + bp = &ap->me; + if (( bp->x>=old.minx && bp->xy>=old.miny && bp->yx>=new.minx && bp->xy>=new.miny && bp->yselected = !ap->selected; + any = true; + } + } + } + + for ( img = cv->layerheads[cv->drawmode]->images; img!=NULL; img=img->next ) { + bb.minx = img->xoff; + bb.miny = img->yoff; + bb.maxx = img->xoff+GImageGetWidth(img->image)*img->xscale; + bb.maxy = img->yoff+GImageGetHeight(img->image)*img->yscale; + if (( bb.minx>=old.minx && bb.maxx=old.miny && bb.maxy=new.minx && bb.maxx=new.miny && bb.maxyselected = !img->selected; + any = true; + } + } + + for ( spl = cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + first = NULL; + if ( spl->first->prev==NULL ) { + bp = &spl->first->me; + if (( bp->x>=old.minx && bp->xy>=old.miny && bp->yx>=new.minx && bp->xy>=new.miny && bp->yfirst->selected = !spl->first->selected; + if ( spl->first->selected ) + cv->lastselpt = spl->first; + else if ( spl->first==cv->lastselpt ) + cv->lastselpt = NULL; + any = true; + } + } + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + bp = &spline->to->me; + if (( bp->x>=old.minx && bp->xy>=old.miny && bp->yx>=new.minx && bp->xy>=new.miny && bp->yto->selected = !spline->to->selected; + if ( spline->to->selected ) + cv->lastselpt = spline->to; + else if ( spline->to==cv->lastselpt ) + cv->lastselpt = NULL; + any = true; + } + if ( first==NULL ) first = spline; + } + } +return( any ); +} + +void CVAdjustControl(CharView *cv,BasePoint *cp, BasePoint *to) { + SplinePoint *sp = cv->p.sp; + BasePoint *othercp = cp==&sp->nextcp?&sp->prevcp:&sp->nextcp; + + if ( sp->pointtype==pt_corner ) { + cp->x = to->x; + cp->y = to->y; + } else if ( sp->pointtype==pt_curve ) { + cp->x = to->x; + cp->y = to->y; + if (( cp->x!=sp->me.x || cp->y!=sp->me.y ) && !cv->sc->parent->order2 ) { + double len1, len2; + len1 = sqrt((cp->x-sp->me.x)*(cp->x-sp->me.x) + + (cp->y-sp->me.y)*(cp->y-sp->me.y)); + len2 = sqrt((othercp->x-sp->me.x)*(othercp->x-sp->me.x) + + (othercp->y-sp->me.y)*(othercp->y-sp->me.y)); + len2 /= len1; + othercp->x = len2 * (sp->me.x-cp->x) + sp->me.x; + othercp->y = len2 * (sp->me.y-cp->y) + sp->me.y; + if ( sp->next!=NULL && othercp==&sp->nextcp ) + SplineRefigure3(sp->next); + if ( sp->prev!=NULL && othercp==&sp->prevcp ) + SplineRefigure3(sp->prev); + } + } else { + BasePoint *bp; + if ( cp==&sp->prevcp && sp->next!=NULL ) + bp = &sp->next->to->me; + else if ( cp==&sp->nextcp && sp->prev!=NULL ) + bp = &sp->prev->from->me; + else + bp = NULL; + if ( bp!=NULL ) { + real angle = atan2(bp->y-sp->me.y,bp->x-sp->me.x); + real len = sqrt((bp->x-sp->me.x)*(bp->x-sp->me.x) + (bp->y-sp->me.y)*(bp->y-sp->me.y)); + real dotprod = + ((to->x-sp->me.x)*(bp->x-sp->me.x) + + (to->y-sp->me.y)*(bp->y-sp->me.y)); + if ( len!=0 ) { + dotprod /= len; + if ( dotprod>0 ) dotprod = 0; + cp->x = sp->me.x + dotprod*cos(angle); + cp->y = sp->me.y + dotprod*sin(angle); + } + } + } + if ( cp->x==sp->me.x && cp->y==sp->me.y ) { + if ( cp==&sp->nextcp ) sp->nonextcp = true; + else sp->noprevcp = true; + } else { + if ( cp==&sp->nextcp ) sp->nonextcp = false; + else sp->noprevcp = false; + } + if ( cp==&sp->nextcp ) sp->nextcpdef = false; + else sp->prevcpdef = false; + + if ( sp->next!=NULL && cp==&sp->nextcp ) { + if ( sp->next->order2 && !sp->nonextcp ) { + sp->next->to->prevcp = *cp; + sp->next->to->noprevcp = false; + } + SplineRefigureFixup(sp->next); + } + if ( sp->prev!=NULL && cp==&sp->prevcp ) { + if ( sp->prev->order2 && !sp->noprevcp ) { + sp->prev->from->nextcp = *cp; + sp->prev->from->nonextcp = false; + } + SplineRefigureFixup(sp->prev); + } + CVSetCharChanged(cv,true); +} + +static void CVAdjustSpline(CharView *cv) { + Spline *old = cv->p.spline; + TPoint tp[5]; + real t; + Spline1D *oldx = &old->splines[0], *oldy = &old->splines[1]; + + if ( cv->sc->parent->order2 ) +return; + + tp[0].x = cv->info.x; tp[0].y = cv->info.y; tp[0].t = cv->p.t; + t = cv->p.t/10; + tp[1].x = ((oldx->a*t+oldx->b)*t+oldx->c)*t + oldx->d; + tp[1].y = ((oldy->a*t+oldy->b)*t+oldy->c)*t + oldy->d; + tp[1].t = t; + t = 1-(1-cv->p.t)/10; + tp[2].x = ((oldx->a*t+oldx->b)*t+oldx->c)*t + oldx->d; + tp[2].y = ((oldy->a*t+oldy->b)*t+oldy->c)*t + oldy->d; + tp[2].t = t; + tp[3] = tp[0]; /* Give more weight to this point than to the others */ + tp[4] = tp[0]; /* ditto */ + cv->p.spline = ApproximateSplineFromPoints(old->from,old->to,tp,5,old->order2); + old->from->pointtype = pt_corner; old->to->pointtype = pt_corner; + old->from->nextcpdef = old->to->prevcpdef = false; + SplineFree(old); + CVSetCharChanged(cv,true); +} + +static int Nearish(real a,real fudge) { +return( a>-fudge && ascale; + int cnt= -1; + + restart: + ++cnt; + for ( activess=cv->layerheads[cv->drawmode]->splines; activess!=NULL; activess=activess->next ) { + if ( activess->first->prev==NULL && (activess->first->selected || + activess->last->selected)) { + for ( mergess = cv->layerheads[cv->drawmode]->splines; mergess!=NULL; mergess=mergess->next ) { + if ( mergess->first->prev==NULL && (!mergess->first->selected || + !mergess->last->selected)) { + if ( !mergess->first->selected && activess->first->selected && + Nearish(mergess->first->me.x-activess->first->me.x,fudge) && + Nearish(mergess->first->me.y-activess->first->me.y,fudge)) { + CVMergeSplineSets(cv,activess->first,activess, + mergess->first,mergess); + goto restart; + } + if ( !mergess->last->selected && activess->first->selected && + Nearish(mergess->last->me.x-activess->first->me.x,fudge) && + Nearish(mergess->last->me.y-activess->first->me.y,fudge)) { + CVMergeSplineSets(cv,activess->first,activess, + mergess->last,mergess); + goto restart; + } + if ( !mergess->first->selected && activess->last->selected && + Nearish(mergess->first->me.x-activess->last->me.x,fudge) && + Nearish(mergess->first->me.y-activess->last->me.y,fudge)) { + CVMergeSplineSets(cv,activess->last,activess, + mergess->first,mergess); + goto restart; + } + if ( !mergess->last->selected && activess->last->selected && + Nearish(mergess->last->me.x-activess->last->me.x,fudge) && + Nearish(mergess->last->me.y-activess->last->me.y,fudge)) { + CVMergeSplineSets(cv,activess->last,activess, + mergess->last,mergess); + goto restart; + } + } + } + } + } +return( cnt>0 && stop_at_join ); +} + +/* Move the selection and return whether we did a merge */ +int CVMoveSelection(CharView *cv, real dx, real dy) { + real transform[6]; + RefChar *refs; + ImageList *img; + AnchorPoint *ap; + double fudge; + extern float snapdistance; + + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = 0.0; + transform[4] = dx; transform[5] = dy; + if ( transform[4]==0 && transform[5]==0 ) +return(false); + SplinePointListTransform(cv->layerheads[cv->drawmode]->splines,transform,false); + + for ( refs = cv->layerheads[cv->drawmode]->refs; refs!=NULL; refs=refs->next ) if ( refs->selected ) { + refs->transform[4] += transform[4]; + refs->transform[5] += transform[5]; + refs->bb.minx += transform[4]; refs->bb.maxx += transform[4]; + refs->bb.miny += transform[5]; refs->bb.maxy += transform[5]; + SplinePointListTransform(refs->layers[0].splines,transform,true); + } + if ( cv->drawmode==dm_fore ) { + if ( cv->showanchor ) { + for ( ap=cv->sc->anchor; ap!=NULL; ap=ap->next ) if ( ap->selected ) { + ap->me.x += transform[4]; + ap->me.y += transform[5]; + } + } + } + for ( img = cv->layerheads[cv->drawmode]->images; img!=NULL; img=img->next ) if ( img->selected ) { + img->xoff += transform[4]; + img->yoff += transform[5]; + img->bb.minx += transform[4]; img->bb.maxx += transform[4]; + img->bb.miny += transform[5]; img->bb.maxy += transform[5]; + SCOutOfDateBackground(cv->sc); + } + fudge = snapdistance/cv->scale/2; + if ( cv->widthsel ) { + cv->sc->width += dx; + if ( cv->sc->width>=-fudge && cv->sc->widthsc->width = 0; + } + if ( cv->vwidthsel ) { + cv->sc->vwidth -= dy; + if ( cv->sc->vwidth>=-fudge && cv->sc->vwidthsc->vwidth = 0; + } + CVSetCharChanged(cv,true); +return( CVCheckMerges( cv )); +} + +static int CVExpandEdge(CharView *cv) { + real transform[6]; + real xscale=1.0, yscale=1.0; + + CVRestoreTOriginalState(cv); + if ( cv->expandedge != ee_up && cv->expandedge != ee_down ) + xscale = (cv->info.x-cv->expandorigin.x)/cv->expandwidth; + if ( cv->expandedge != ee_left && cv->expandedge != ee_right ) + yscale = (cv->info.y-cv->expandorigin.y)/cv->expandheight; + transform[0] = xscale; transform[3] = yscale; + transform[1] = transform[2] = 0; + transform[4] = (1-xscale)*cv->expandorigin.x; + transform[5] = (1-yscale)*cv->expandorigin.y; + CVSetCharChanged(cv,true); + CVTransFunc(cv,transform,false); +return( true ); +} + +int CVMouseMovePointer(CharView *cv ) { + int needsupdate = false; + int did_a_merge = false; + + /* if we haven't moved from the original location (ever) then this is a noop */ + if ( !cv->p.rubberbanding && !cv->recentchange && + RealNear(cv->info.x,cv->p.cx) && RealNear(cv->info.y,cv->p.cy) ) +return( false ); + + /* This can happen if they depress on a control point, move it, then use */ + /* the arrow keys to move the point itself, and then try to move the cp */ + /* again (mouse still depressed) */ + if (( cv->p.nextcp || cv->p.prevcp ) && cv->p.sp==NULL ) + cv->p.nextcp = cv->p.prevcp = false; + + /* I used to have special cases for moving width lines, but that's now */ + /* done by move selection */ + if ( cv->expandedge!=ee_none && !cv->widthsel && !cv->vwidthsel && cv->nearcaret==-1 ) + needsupdate = CVExpandEdge(cv); + else if ( cv->nearcaret!=-1 && cv->lcarets!=NULL ) { + if ( cv->info.x!=cv->last_c.x ) { + if ( !cv->recentchange ) SCPreserveState(cv->sc,2); + cv->lcarets->u.lcaret.carets[cv->nearcaret] += cv->info.x-cv->last_c.x; + needsupdate = true; + CVSetCharChanged(cv,true); + } + } else if ( !cv->p.anysel ) { + if ( !cv->p.rubberbanding ) { + cv->p.ex = cv->p.cx; + cv->p.ey = cv->p.cy; + } + needsupdate = CVRectSelect(cv,cv->info.x,cv->info.y); + if ( !needsupdate && cv->p.rubberbanding ) + CVDrawRubberRect(cv->v,cv); + cv->p.ex = cv->info.x; + cv->p.ey = cv->info.y; + cv->p.rubberbanding = true; + if ( !needsupdate ) + CVDrawRubberRect(cv->v,cv); + } else if ( cv->p.nextcp ) { + if ( !cv->recentchange ) CVPreserveState(cv); + CVAdjustControl(cv,&cv->p.sp->nextcp,&cv->info); + needsupdate = true; + } else if ( cv->p.prevcp ) { + if ( !cv->recentchange ) CVPreserveState(cv); + CVAdjustControl(cv,&cv->p.sp->prevcp,&cv->info); + needsupdate = true; + } else if ( cv->p.spline!=NULL ) { + if ( !cv->recentchange ) CVPreserveState(cv); + CVAdjustSpline(cv); + CVSetCharChanged(cv,true); + needsupdate = true; + } else { + if ( !cv->recentchange ) CVPreserveState(cv); + did_a_merge = CVMoveSelection(cv,cv->info.x-cv->last_c.x,cv->info.y-cv->last_c.y); + needsupdate = true; + } + if ( needsupdate ) + SCUpdateAll(cv->sc); + cv->last_c.x = cv->info.x; cv->last_c.y = cv->info.y; +return( did_a_merge ); +} + +void CVMouseUpPointer(CharView *cv ) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; + if ( cv->widthsel ) { + /* cv->widthsel = false; */ + if ( cv->sc->width<0 && cv->oldwidth>=0 ) { + if ( GWidgetAskR(_STR_NegativeWidth, buts, 0, 1, _STR_NegativeWidthCheck )==1 ) + cv->sc->width = cv->p.cx; + } + SCSynchronizeWidth(cv->sc,cv->sc->width,cv->oldwidth,NULL); + cv->expandedge = ee_none; + GDrawSetCursor(cv->v,ct_mypointer); + } + if ( cv->vwidthsel ) { + /* cv->vwidthsel = false; */ + if ( cv->sc->vwidth<0 && cv->oldvwidth>=0 ) { + if ( GWidgetAskR(_STR_NegativeWidth, buts, 0, 1, _STR_NegativeWidthCheck )==1 ) + cv->sc->vwidth = cv->p.cy; + } + cv->expandedge = ee_none; + GDrawSetCursor(cv->v,ct_mypointer); + } + if ( cv->nearcaret!=-1 && cv->lcarets!=NULL ) { + cv->nearcaret = -1; + cv->expandedge = ee_none; + cv->lcarets = NULL; + GDrawSetCursor(cv->v,ct_mypointer); + } + if ( cv->expandedge!=ee_none ) { + CVUndoCleanup(cv); + cv->expandedge = ee_none; + GDrawSetCursor(cv->v,ct_mypointer); + } else if ( CVAllSelected(cv) && cv->drawmode==dm_fore && cv->p.spline==NULL && + !cv->p.prevcp && !cv->p.nextcp && cv->info.y==cv->p.cy ) { + SCUndoSetLBearingChange(cv->sc,(int) rint(cv->info.x-cv->p.cx)); + SCSynchronizeLBearing(cv->sc,NULL,cv->info.x-cv->p.cx); + } +} diff --git a/fontforge/cvruler.c b/fontforge/cvruler.c new file mode 100644 index 00000000..09bcf26c --- /dev/null +++ b/fontforge/cvruler.c @@ -0,0 +1,160 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include + +static void RulerText(CharView *cv, unichar_t *ubuf) { + char buf[60]; + real xoff = cv->info.x-cv->p.cx, yoff = cv->info.y-cv->p.cy; + + if ( !cv->p.pressed ) /* Give current location accurately */ + sprintf( buf, "%f,%f", cv->info.x, cv->info.y); + else /* Give displacement from press point */ + sprintf( buf, "%.1f %.0f\260 (%.0f,%.0f)", sqrt(xoff*xoff+yoff*yoff), + atan2(yoff,xoff)*180/3.1415926535897932, + xoff,yoff); + uc_strcpy(ubuf,buf); +} + +static int RulerText2(CharView *cv, unichar_t *ubuf) { + char buf[60]; + double len; + + if ( !cv->p.pressed ) +return( false ); + if ( cv->p.sp!=NULL && cv->info_sp!=NULL && + ((cv->p.sp->next!=NULL && cv->p.sp->next->to==cv->info_sp) || + (cv->p.sp->prev!=NULL && cv->p.sp->prev->from==cv->info_sp)) ) { + if ( cv->p.sp->next!=NULL && cv->p.sp->next->to==cv->info_sp ) + len = SplineLength(cv->p.sp->next); + else + len = SplineLength(cv->p.sp->prev); + sprintf( buf, "Spline Length=%.1f", len); + uc_strcpy(ubuf,buf); +return( true ); + } +return( false ); +} + +static int ruler_e_h(GWindow gw, GEvent *event) { + CharView *cv = (CharView *) GDrawGetUserData(gw); + unichar_t ubuf[60]; + + switch ( event->type ) { + case et_expose: + GDrawSetFont(gw,cv->rfont); + RulerText(cv,ubuf); + /*GDrawFillRect(gw,NULL,0xe0e0c0);*/ + GDrawDrawText(gw,2,cv->ras+1,ubuf,-1,NULL,0x000000); + if ( RulerText2(cv,ubuf)) + GDrawDrawText(gw,2,cv->rfh+cv->ras+2,ubuf,-1,NULL,0x000000); + break; + } +return( true ); +} + +static void RulerPlace(CharView *cv, GEvent *event) { + unichar_t ubuf[60]; + int width, x; + GRect size; + GPoint pt; + int h,w; + GWindowAttrs wattrs; + GRect pos; + FontRequest rq; + static unichar_t fixed[] = { 'f','i','x','e','d', ',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + int as, ds, ld; + + if ( cv->ruler_w==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_positioned|wam_nodecor|wam_backcol|wam_bordwidth; + wattrs.event_masks = (1<ruler_w = GWidgetCreateTopWindow(NULL,&pos,ruler_e_h,cv,&wattrs); + + memset(&rq,0,sizeof(rq)); + rq.family_name = fixed; + rq.point_size = -12; + rq.weight = 400; + cv->rfont = GDrawInstanciateFont(GDrawGetDisplayOfWindow(cv->ruler_w),&rq); + GDrawFontMetrics(cv->rfont,&as,&ds,&ld); + cv->rfh = as+ds; cv->ras = as; + } + + GDrawSetFont(cv->ruler_w,cv->rfont); + RulerText(cv,ubuf); + width = GDrawGetTextWidth(cv->ruler_w,ubuf,-1,NULL); + h = cv->rfh; + if ( RulerText2(cv,ubuf)) { + w = GDrawGetTextWidth(cv->ruler_w,ubuf,-1,NULL); + if ( widthrfh; + } + GDrawGetSize(GDrawGetRoot(NULL),&size); + pt.x = event->u.mouse.x; pt.y = event->u.mouse.y; + GDrawTranslateCoordinates(cv->v,GDrawGetRoot(NULL),&pt); + x = pt.x + 26; + if ( x+width > size.width ) + x = pt.x - width-30; + GDrawMoveResize(cv->ruler_w,x,pt.y-cv->ras-2,width+4,h+4); +} + +void CVMouseDownRuler(CharView *cv, GEvent *event) { + + RulerPlace(cv,event); + GDrawSetVisible(cv->ruler_w,true); +} + +void CVMouseMoveRuler(CharView *cv, GEvent *event) { + if ( !cv->p.pressed && !(event->u.mouse.state&ksm_meta) ) { + if ( cv->ruler_w!=NULL && GDrawIsVisible(cv->ruler_w)) { + GDrawDestroyWindow(cv->ruler_w); + cv->ruler_w = NULL; + } +return; + } + RulerPlace(cv,event); + if ( !cv->p.pressed ) + GDrawSetVisible(cv->ruler_w,true); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); /* The resize needs to happen before the expose */ + if ( !cv->p.pressed && !(event->u.mouse.state&ksm_meta) ) /* but a mouse up might sneak in... */ +return; + GDrawRequestExpose(cv->ruler_w,NULL,false); +} + +void CVMouseUpRuler(CharView *cv, GEvent *event) { + if ( cv->ruler_w!=NULL ) { + GDrawDestroyWindow(cv->ruler_w); + cv->ruler_w = NULL; + } +} diff --git a/fontforge/cvshapes.c b/fontforge/cvshapes.c new file mode 100644 index 00000000..fa549838 --- /dev/null +++ b/fontforge/cvshapes.c @@ -0,0 +1,308 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include + +static struct shapedescrip { BasePoint me, prevcp, nextcp; int nocp; } + ellipse3[] = { + { {-1,0}, { -1, -.552 }, { -1, .552 }, false}, + { {0,1}, { -.552, 1 }, { .552, 1 }, false}, + { {1,0}, { 1, .552 }, { 1, -.552 }, false}, + { {0,-1}, {.552, -1 }, {-.552, -1 }, false}, + { {0,0}}}, + ellipse2[] = { + { {-1,0}, {-1,-.273}, {-1,.273}, false}, + { {-.866,.5},{-1,.273}, {-.707,.707}, false}, + { {-.5,.866},{-.707,.707},{-.273,1}, false}, + { {0,1},{-.273,1},{.273,1}, false}, + { {.5,.866},{.273,1}, {.707,.707}, false}, + { {.866,.5},{.707,.707},{1,.273}, false}, + { {1,0},{1,.273},{1,-.273}, false}, + { {.866,-.5},{1,-.273},{.707,-.707}, false}, + { {.5,-.866},{.707,-.707},{.273,-1}, false}, + { {0,-1},{.273,-1},{-.273,-1}, false}, + { {-.5,-.866},{-.273,-1},{-.707,-.707}, false}, + { {-.866,-.5},{-.707,-.707},{-1,-.273}, false}, + { {0,0}}}; + +static SplinePoint *SPMake(BasePoint *base,int pt) { + SplinePoint *new; + + new = chunkalloc(sizeof(SplinePoint)); + new->me = *base; + new->nextcp = *base; + new->prevcp = *base; + new->nonextcp = new->noprevcp = true; + new->nextcpdef = new->prevcpdef = false; + new->pointtype = pt; + new->selected = true; +return( new ); +} + +static SplinePoint *SPMakeTo(BasePoint *base,int pt, SplinePoint *from,int order2) { + SplinePoint *to = SPMake(base,pt); + SplineMake(from,to,order2); +return( to ); +} + +void CVMouseDownShape(CharView *cv) { + real radius = CVRoundRectRadius(); int points = CVPolyStarPoints(); + SplinePoint *last; + int i; + int order2 = cv->sc->parent->order2; + struct shapedescrip *ellipse; + + CVClearSel(cv); + CVPreserveState(cv); + CVSetCharChanged(cv,true); + cv->active_shape = chunkalloc(sizeof(SplineSet)); + cv->active_shape->next = cv->layerheads[cv->drawmode]->splines; + cv->layerheads[cv->drawmode]->splines = cv->active_shape; + cv->active_shape->first = last = SPMake(&cv->info,pt_corner); + + switch ( cv->active_tool ) { + case cvt_rect: + if ( radius==0 ) { + last = SPMakeTo(&cv->info,pt_corner,last,order2); + last = SPMakeTo(&cv->info,pt_corner,last,order2); + last = SPMakeTo(&cv->info,pt_corner,last,order2); + } else { + last->pointtype = pt_tangent; + last = SPMakeTo(&cv->info,pt_tangent,last,order2); + last = SPMakeTo(&cv->info,pt_tangent,last,order2); + last = SPMakeTo(&cv->info,pt_tangent,last,order2); + last = SPMakeTo(&cv->info,pt_tangent,last,order2); + last = SPMakeTo(&cv->info,pt_tangent,last,order2); + last = SPMakeTo(&cv->info,pt_tangent,last,order2); + last = SPMakeTo(&cv->info,pt_tangent,last,order2); + } + break; + case cvt_elipse: + ellipse = order2 ? ellipse2 : ellipse3; + last->pointtype = pt_curve; + for ( i=1; ellipse[i].me.x!=0 || ellipse[i].me.y!=0 ; ++i ) { + last = SPMakeTo(&cv->info,pt_curve,last,order2); + } + break; + case cvt_poly: + for ( i=1; iinfo,pt_corner,last,order2); + break; + case cvt_star: + for ( i=1; i<2*points; ++i ) + last = SPMakeTo(&cv->info,pt_corner,last,order2); + break; + } + SplineMake(last,cv->active_shape->first,order2); + cv->active_shape->last = cv->active_shape->first; + SCUpdateAll(cv->sc); +} + +static void SetCorner(SplinePoint *sp,real x, real y) { + sp->me.x = x; sp->me.y = y; + sp->nextcp = sp->me; + sp->prevcp = sp->me; +} + +static void SetCurve(SplinePoint *sp,BasePoint *center,real xrad, real yrad, + struct shapedescrip *pt_d) { + sp->me.x = center->x+xrad*pt_d->me.x; sp->me.y = center->y+yrad*pt_d->me.y; + sp->nextcp.x = center->x+xrad*pt_d->nextcp.x; sp->nextcp.y = center->y+yrad*pt_d->nextcp.y; + sp->prevcp.x = center->x+xrad*pt_d->prevcp.x; sp->prevcp.y = center->y+yrad*pt_d->prevcp.y; + sp->nonextcp = sp->noprevcp = (xrad==0 && yrad==0); +} + +static void SetPTangent(SplinePoint *sp,real x, real y,real xrad, real yrad) { + sp->me.x = x; sp->me.y = y; + sp->nextcp = sp->me; + sp->prevcp = sp->me; + if ( !sp->next->order2 ) { + xrad *= .552; + yrad *= .552; + } + sp->prevcp.x += xrad; + sp->prevcp.y += yrad; + sp->noprevcp = (xrad==0 && yrad==0); +} + +static void SetNTangent(SplinePoint *sp,real x, real y,real xrad, real yrad) { + sp->me.x = x; sp->me.y = y; + sp->nextcp = sp->me; + if ( !sp->next->order2 ) { + xrad *= .552; + yrad *= .552; + } + sp->nextcp.x += xrad; + sp->nextcp.y += yrad; + sp->prevcp = sp->me; + sp->nonextcp = (xrad==0 && yrad==0); +} + +static void RedoActiveSplineSet(SplineSet *ss) { + Spline *spline, *first; + + first = NULL; + for ( spline = ss->first->next; spline!=NULL && spline!=first; spline = spline->to->next ) { + SplineRefigure(spline); + if ( first == NULL ) first = spline; + } +} + +void CVMouseMoveShape(CharView *cv) { + real radius = CVRoundRectRadius(); int points = CVPolyStarPoints(); + int center_out = CVRectElipseCenter(); + real xrad,yrad, xrr, yrr; + real r2; + SplinePoint *sp; + real base, off; + int i; + struct shapedescrip *ellipse; + BasePoint center; + + if ( cv->active_shape==NULL ) +return; + switch ( cv->active_tool ) { + case cvt_rect: + if ( radius==0 ) { + sp = cv->active_shape->first->next->to; + if ( !center_out ) { + SetCorner(sp,cv->p.cx,cv->info.y); + SetCorner(sp=sp->next->to, cv->info.x,cv->info.y); + SetCorner(sp=sp->next->to, cv->info.x,cv->p.cy); + } else { + if (( xrad = (cv->p.cx-cv->info.x) )<0 ) xrad = -xrad; + if (( yrad = (cv->p.cy-cv->info.y) )<0 ) yrad = -yrad; + SetCorner(sp,cv->p.cx-xrad,cv->info.y); + SetCorner(sp=sp->next->to, cv->info.x,cv->info.y); + SetCorner(sp=sp->next->to, cv->info.x,cv->p.cy-yrad); + SetCorner(sp=sp->next->to, cv->p.cx-xrad,cv->p.cy-yrad); + } + } else { + if ( !center_out ) { + if (( xrad = (cv->p.cx-cv->info.x)/2 )<0 ) xrad = -xrad; + if (( yrad = (cv->p.cy-cv->info.y)/2 )<0 ) yrad = -yrad; + if ( xrad>radius ) xrr = radius; else xrr = xrad; + if ( yrad>radius ) yrr = radius; else yrr = yrad; + if ( cv->info.xp.cx ) xrr = -xrr; + if ( cv->info.yp.cy ) yrr = -yrr; + sp = cv->active_shape->first; + SetPTangent(sp, + cv->p.cx+xrr,cv->p.cy, -xrr,0); + SetNTangent(sp=sp->next->to, + cv->info.x-xrr,cv->p.cy, xrr,0); + SetPTangent(sp=sp->next->to, + cv->info.x,cv->p.cy+yrr, 0,-yrr); + SetNTangent(sp=sp->next->to, + cv->info.x,cv->info.y-yrr, 0,yrr); + SetPTangent(sp=sp->next->to, + cv->info.x-xrr,cv->info.y, xrr,0); + SetNTangent(sp=sp->next->to, + cv->p.cx+xrr,cv->info.y, -xrr,0); + SetPTangent(sp=sp->next->to, + cv->p.cx,cv->info.y-yrr, 0,yrr); + SetNTangent(sp=sp->next->to, + cv->p.cx,cv->p.cy+yrr, 0,-yrr); + } else { + if (( xrad = (cv->p.cx-cv->info.x) )<0 ) xrad = -xrad; + if (( yrad = (cv->p.cy-cv->info.y) )<0 ) yrad = -yrad; + if ( xrad>radius ) xrr = radius; else xrr = xrad; + if ( yrad>radius ) yrr = radius; else yrr = yrad; + sp = cv->active_shape->first; + SetPTangent(sp, + cv->p.cx-xrad+xrr,cv->p.cy-yrad, -xrr,0); + SetNTangent(sp=sp->next->to, + cv->p.cx+xrad-xrr,cv->p.cy-yrad, xrr,0); + SetPTangent(sp=sp->next->to, + cv->p.cx+xrad,cv->p.cy-yrad+yrr, 0,-yrr); + SetNTangent(sp=sp->next->to, + cv->p.cx+xrad,cv->p.cy+yrad-yrr, 0,yrr); + SetPTangent(sp=sp->next->to, + cv->p.cx+xrad-xrr,cv->p.cy+yrad, xrr,0); + SetNTangent(sp=sp->next->to, + cv->p.cx-xrad+xrr,cv->p.cy+yrad, -xrr,0); + SetPTangent(sp=sp->next->to, + cv->p.cx-xrad,cv->p.cy+yrad-yrr, 0,yrr); + SetNTangent(sp=sp->next->to, + cv->p.cx-xrad,cv->p.cy-yrad+yrr, 0,-yrr); + } + } + break; + case cvt_elipse: + if ( !center_out ) { + center.x = (cv->p.cx+cv->info.x)/2; center.y = (cv->p.cy+cv->info.y)/2; + if (( xrad = (cv->p.cx-cv->info.x)/2 )<0 ) xrad = -xrad; + if (( yrad = (cv->p.cy-cv->info.y)/2 )<0 ) yrad = -yrad; + } else { + center.x = cv->p.cx; center.y = cv->p.cy; + if (( xrad = (cv->p.cx-cv->info.x) )<0 ) xrad = -xrad; + if (( yrad = (cv->p.cy-cv->info.y) )<0 ) yrad = -yrad; + } + ellipse = cv->sc->parent->order2 ? ellipse2 : ellipse3; + for ( i=0, sp=cv->active_shape->first; ellipse[i].me.x!=0 || ellipse[i].me.y!=0 ; ++i, sp=sp->next->to ) + SetCurve(sp,¢er,xrad,yrad,&ellipse[i]); + break; + case cvt_poly: + base = atan2(cv->p.cy-cv->info.y,cv->p.cx-cv->info.x); + radius = sqrt((cv->p.cy-cv->info.y)*(cv->p.cy-cv->info.y) + + (cv->p.cx-cv->info.x)*(cv->p.cx-cv->info.x)); + off = -2*3.1415926535897932/points; + sp = cv->active_shape->last->prev->from; + for ( i=0; inext->to, cv->p.cx+radius*cos(base+i*off), + cv->p.cy+radius*sin(base+i*off)); + break; + case cvt_star: + base = atan2(cv->p.cy-cv->info.y,cv->p.cx-cv->info.x)-3.1415926535897932; + if ( base<-3.1416 ) + base += 2*3.1415926535897932; + radius = sqrt((cv->p.cy-cv->info.y)*(cv->p.cy-cv->info.y) + + (cv->p.cx-cv->info.x)*(cv->p.cx-cv->info.x)); + off = -2*3.1415926535897932/(2*points); + sp = cv->active_shape->last->prev->from; + r2 = radius/CVStarRatio(); + for ( i=0; i<2*points; ++i ) { + if ( i&1 ) { + SetCorner(sp=sp->next->to, cv->p.cx+r2*cos(base+i*off), + cv->p.cy+r2*sin(base+i*off)); + } else { + SetCorner(sp=sp->next->to, cv->p.cx+radius*cos(base+i*off), + cv->p.cy+radius*sin(base+i*off)); + } + } + break; + } + RedoActiveSplineSet(cv->active_shape); + SCUpdateAll(cv->sc); +} + +void CVMouseUpShape(CharView *cv) { + if ( cv->active_tool==cvt_rect || cv->active_tool==cvt_elipse ) { + if ( !SplinePointListIsClockwise(cv->active_shape)) + SplineSetReverse(cv->active_shape); + } + cv->active_shape = NULL; +} diff --git a/fontforge/cvstroke.c b/fontforge/cvstroke.c new file mode 100644 index 00000000..86c200fc --- /dev/null +++ b/fontforge/cvstroke.c @@ -0,0 +1,1363 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +extern GDevEventMask input_em[]; +extern const int input_em_cnt; + +typedef struct strokedlg { + int done; + GWindow gw; + CharView *cv; + void (*strokeit)(void *,StrokeInfo *); + StrokeInfo *si; + GRect r1, r2; + int up[2]; + int dontexpand; +} StrokeDlg; + +#define CID_ButtCap 1001 +#define CID_RoundCap 1002 +#define CID_SquareCap 1003 +#define CID_BevelJoin 1004 +#define CID_RoundJoin 1005 +#define CID_MiterJoin 1006 +#define CID_Width 1007 +#define CID_Stroke 1008 +#define CID_Caligraphic 1009 +#define CID_PenAngle 1010 +#define CID_PenAngleTxt 1011 +#define CID_ThicknessRatio 1012 +#define CID_ThicknessRatioTxt 1013 +#define CID_LineCapTxt 1014 +#define CID_LineJoinTxt 1015 + /* For freehand */ +#define CID_CenterLine 1016 +#define CID_Width2 1017 +#define CID_Pressure1 1018 +#define CID_Pressure2 1019 +#define CID_WidthTxt 1020 +#define CID_PressureTxt 1021 + /* For Kanou (& me) */ +#define CID_RmInternal 1022 +#define CID_RmExternal 1023 +#define CID_CleanupSelfIntersect 1024 + /* Elipses */ +#define CID_Elipse 1025 +#define CID_PenAngle2 1026 +#define CID_PenAngle2Txt 1027 +#define CID_MinorAxis 1028 +#define CID_MinorAxisTxt 1029 + +static void CVStrokeIt(void *_cv, StrokeInfo *si) { + CharView *cv = _cv; + int anypoints; + SplineSet *spl, *prev, *head=NULL, *last=NULL, *cur, *snext; + + CVPreserveState(cv); + if ( CVAnySel(cv,&anypoints,NULL,NULL,NULL) && anypoints ) { + prev = NULL; + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = snext ) { + snext = spl->next; + if ( PointListIsSelected(spl)) { + cur = SplineSetStroke(spl,si,cv->sc); + if ( prev==NULL ) + cv->layerheads[cv->drawmode]->splines=cur; + else + prev->next = cur; + while ( cur->next ) cur=cur->next; + cur->next = snext; + spl->next = NULL; + SplinePointListMDFree(cv->sc,spl); + prev = cur; + } else + prev = spl; + } + } else { + for ( spl= cv->layerheads[cv->drawmode]->splines; spl!=NULL; spl = spl->next ) { + cur = SplineSetStroke(spl,si,cv->sc); + if ( head==NULL ) + head = cur; + else + last->next = cur; + while ( cur->next!=NULL ) cur = cur->next; + last = cur; + } + SplinePointListsFree( cv->layerheads[cv->drawmode]->splines ); + cv->layerheads[cv->drawmode]->splines = head; + } + CVCharChangedUpdate(cv); +} + +static void SCStrokeIt(void *_sc, StrokeInfo *si) { + SplineChar *sc = _sc; + SplineSet *temp; + + SCPreserveState(sc,false); + temp = SSStroke(sc->layers[ly_fore].splines,si,sc); + SplinePointListsFree( sc->layers[ly_fore].splines ); + sc->layers[ly_fore].splines = temp; + SCCharChangedUpdate(sc); +} + +static void FVStrokeIt(void *_fv, StrokeInfo *si) { + FontView *fv = _fv; + SplineSet *temp; + int i, cnt=0, layer; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Stroking,_STR_Stroking,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SCPreserveState(sc,false); + for ( layer = ly_fore; layerlayer_cnt; ++layer ) { + temp = SSStroke(sc->layers[layer].splines,si,sc); + SplinePointListsFree( sc->layers[layer].splines ); + sc->layers[layer].splines = temp; + } + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static int Stroke_OK(GGadget *g, GEvent *e) { + StrokeInfo *si, strokeinfo; + int err; + real r2; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow sw = GGadgetGetWindow(g); + StrokeDlg *sd = GDrawGetUserData(sw); + + err = false; + if ( (si = sd->si)==NULL ) { + memset(&strokeinfo,'\0',sizeof(strokeinfo)); + si = &strokeinfo; + } + si->stroke_type = si_std; + if ( GGadgetIsChecked( GWidgetGetControl(sw,CID_Caligraphic)) ) + si->stroke_type = si_caligraphic; + else if ( GGadgetIsChecked( GWidgetGetControl(sw,CID_Elipse)) ) + si->stroke_type = si_elipse; + else if ( si!= &strokeinfo && + GGadgetIsChecked( GWidgetGetControl(sw,CID_CenterLine)) ) + si->stroke_type = si_centerline; + if ( si!=&strokeinfo && si->stroke_type!=si_centerline ) { + si->pressure1 = GetRealR(sw,CID_Pressure1,_STR_Pressure,&err); + si->pressure2 = GetRealR(sw,CID_Pressure2,_STR_Pressure,&err); + if ( si->pressure1!=si->pressure2 ) + si->radius2 = GetRealR(sw,CID_Width2,_STR_StrokeWidth,&err)/2; + } + si->cap = GGadgetIsChecked( GWidgetGetControl(sw,CID_ButtCap))?lc_butt: + GGadgetIsChecked( GWidgetGetControl(sw,CID_RoundCap))?lc_round: + lc_square; + si->join = GGadgetIsChecked( GWidgetGetControl(sw,CID_BevelJoin))?lj_bevel: + GGadgetIsChecked( GWidgetGetControl(sw,CID_RoundJoin))?lj_round: + lj_miter; + si->removeinternal = GGadgetIsChecked( GWidgetGetControl(sw,CID_RmInternal)); + si->removeexternal = GGadgetIsChecked( GWidgetGetControl(sw,CID_RmExternal)); + si->removeoverlapifneeded = GGadgetIsChecked( GWidgetGetControl(sw,CID_CleanupSelfIntersect)); + if ( si->removeinternal && si->removeexternal ) { + GWidgetErrorR(_STR_BadValue,_STR_NotInternalAndExternal); + err = true; + } + si->radius = GetRealR(sw,CID_Width,_STR_StrokeWidth,&err)/2; + if ( si->stroke_type == si_elipse ) { + si->penangle = GetRealR(sw,CID_PenAngle2,_STR_PenAngle,&err); + if ( si->penangle>180 || si->penangle < -180 ) { + si->penangle = fmod(si->penangle,360); + if ( si->penangle>180 ) + si->penangle -= 360; + else if ( si->penangle<-180 ) + si->penangle += 360; + } + si->penangle *= 3.1415926535897932/180; + si->cap = lc_butt; + si->join = lj_bevel; + si->ratio = GetRealR(sw,CID_ThicknessRatio,_STR_PenHeightRatio,&err); + si->s = sin(si->penangle); + si->c = cos(si->penangle); + si->cap = lc_round; si->join = lj_round; + si->minorradius = GetRealR(sw,CID_MinorAxis,_STR_MinorAxis,&err)/2; + } else if ( si->stroke_type == si_caligraphic ) { + si->penangle = GetRealR(sw,CID_PenAngle,_STR_PenAngle,&err); + if ( si->penangle>180 || si->penangle < -180 ) { + si->penangle = fmod(si->penangle,360); + if ( si->penangle>180 ) + si->penangle -= 360; + else if ( si->penangle<-180 ) + si->penangle += 360; + } + si->penangle *= 3.1415926535897932/180; + si->cap = lc_butt; + si->join = lj_bevel; + si->ratio = GetRealR(sw,CID_ThicknessRatio,_STR_PenHeightRatio,&err); + si->s = sin(si->penangle); + si->c = cos(si->penangle); + r2 = si->ratio*si->radius; + si->xoff[0] = si->xoff[4] = si->radius*si->c + r2*si->s; + si->yoff[0] = si->yoff[4] = -r2*si->c + si->radius*si->s; + si->xoff[1] = si->xoff[5] = si->radius*si->c - r2*si->s; + si->yoff[1] = si->yoff[5] = r2*si->c + si->radius*si->s; + si->xoff[2] = si->xoff[6] = -si->radius*si->c - r2*si->s; + si->yoff[2] = si->yoff[6] = r2*si->c - si->radius*si->s; + si->xoff[3] = si->xoff[7] = -si->radius*si->c + r2*si->s; + si->yoff[3] = si->yoff[7] = -r2*si->c - si->radius*si->s; + } + if ( err ) +return( true ); + if ( sd->strokeit!=NULL ) + (sd->strokeit)(sd->cv,si); + sd->done = true; + } +return( true ); +} + +static int Stroke_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + StrokeDlg *sd = GDrawGetUserData(GGadgetGetWindow(g)); + sd->done = true; + } +return( true ); +} + +static void StrokePressureCheck(StrokeDlg *sd) { + int err = false; + real p1, p2; + + p1 = GetRealR(sd->gw,CID_Pressure1,_STR_Pressure,&err); + p2 = GetRealR(sd->gw,CID_Pressure2,_STR_Pressure,&err); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_Width2), + !err && p1!=p2 && !sd->dontexpand); +} + +static void StrokeSetup(StrokeDlg *sd, enum si_type stroke_type) { + + sd->dontexpand = ( stroke_type==si_centerline ); + + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_LineCapTxt), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_ButtCap), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_RoundCap), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_SquareCap), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_LineJoinTxt), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_BevelJoin), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_RoundJoin), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_MiterJoin), stroke_type==si_std); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_PenAngle), stroke_type==si_caligraphic); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_PenAngleTxt), stroke_type==si_caligraphic); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_ThicknessRatio), stroke_type==si_caligraphic); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_ThicknessRatioTxt), stroke_type==si_caligraphic); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_PenAngle2), stroke_type==si_elipse); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_PenAngle2Txt), stroke_type==si_elipse); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_MinorAxis), stroke_type==si_elipse); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_MinorAxisTxt), stroke_type==si_elipse); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_WidthTxt), stroke_type!=-si_caligraphic); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_Width), stroke_type!=-si_caligraphic); + if ( sd->si!=NULL ) { + StrokePressureCheck(sd); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_PressureTxt), stroke_type!=si_centerline); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_Pressure1), stroke_type!=si_centerline); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_Pressure2), stroke_type!=si_centerline); + } +#if 0 + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_RmInternal), true); + GGadgetSetEnabled(GWidgetGetControl(sd->gw,CID_RmExternal), stroke_type==si_std); +#endif +} + +static int Stroke_CenterLine(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + StrokeDlg *sd = GDrawGetUserData(GGadgetGetWindow(g)); + StrokeSetup(sd,si_centerline); + } +return( true ); +} + +static int Stroke_Elipse(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + StrokeDlg *sd = GDrawGetUserData(GGadgetGetWindow(g)); + StrokeSetup(sd,si_elipse); + } +return( true ); +} + +static int Stroke_Caligraphic(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + StrokeDlg *sd = GDrawGetUserData(GGadgetGetWindow(g)); + StrokeSetup(sd,si_caligraphic); + } +return( true ); +} + +static int Stroke_Stroke(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + StrokeDlg *sd = GDrawGetUserData(GGadgetGetWindow(g)); + StrokeSetup(sd,si_std); + } +return( true ); +} + +static int Stroke_PressureChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + StrokeDlg *sd = GDrawGetUserData(GGadgetGetWindow(g)); + StrokePressureCheck(sd); + } +return( true ); +} + +static void Stroke_PressureSet(StrokeDlg *sd,int cid, GEvent *event) { + char buff[20]; + unichar_t ubuf[20]; + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(sd->gw,cid)); + double old; + int i = cid==CID_Pressure1?0:1; + + old = u_strtol(ret,NULL,10); + if ( event->u.mouse.pressure==0 ) + sd->up[i] = true; + else if ( sd->up[i] || event->u.mouse.pressure>old ) { + sd->up[i] = false; + sprintf(buff,"%d",event->u.mouse.pressure); + uc_strcpy(ubuf,buff); + GGadgetSetTitle(GWidgetGetControl(sd->gw,cid),ubuf); + StrokePressureCheck(sd); + } +} + +static int stroke_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + StrokeDlg *sd = GDrawGetUserData(gw); + sd->done = true; + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("elementmenu.html#Expand"); +return( true ); + } +return( false ); + } else if ( event->type == et_mousemove ) { + StrokeDlg *sd = GDrawGetUserData(gw); + if ( sd->si && (!(event->u.mouse.state&0x0f00) || event->u.mouse.device!=NULL ) && + !sd->dontexpand ) { + if ( event->u.mouse.y >= sd->r1.y-3 && event->u.mouse.y < sd->r1.y+sd->r1.height+3 ) + GGadgetPreparePopup(gw,GStringGetResource(_STR_PressurePopup,NULL)); + if ( event->u.mouse.y >= sd->r1.y && event->u.mouse.y < sd->r1.y+sd->r1.height && + event->u.mouse.device!=NULL ) { + if ( event->u.mouse.x>=sd->r1.x && event->u.mouse.x < sd->r1.x+sd->r1.width ) + Stroke_PressureSet(sd,CID_Pressure1,event); + if ( event->u.mouse.x>=sd->r2.x && event->u.mouse.x < sd->r2.x+sd->r2.width ) + Stroke_PressureSet(sd,CID_Pressure2,event); + } + } + } else if ( event->type == et_expose ) { + StrokeDlg *sd = GDrawGetUserData(gw); + GDrawSetLineWidth(gw,0); + if ( sd->si ) { + GDrawDrawRect(gw,&sd->r1,0x000000); + GDrawDrawRect(gw,&sd->r2,0x000000); + } + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +#define SD_Width 230 +#define SD_Height 335 +#define FH_Height (SD_Height+75) + +static void MakeStrokeDlg(void *cv,void (*strokeit)(void *,StrokeInfo *),StrokeInfo *si) { + static StrokeDlg strokedlg; + StrokeDlg *sd, freehand_dlg; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[38]; + GTextInfo label[38]; + int yoff=0; + int gcdoff, stroke_gcd, width_pos; + static StrokeInfo defaults = { 25, lj_round, lc_butt, si_std, + /* toobigwarn */ false, + /* removeinternal */ false, + /* removeexternal */ false, + /* removeoverlapif*/ true, + /* gottoobig */ false, + /* gottoobiglocal */ false, + 3.1415926535897932/4, .2, 50 }; + StrokeInfo *def = si?si:&defaults; + char anglebuf[20], ratiobuf[20], widthbuf[20], width2buf[20], + pressurebuf[20], pressure2buf[20], axisbuf[20]; + + if ( strokeit!=NULL ) + sd = &strokedlg; + else { + sd = &freehand_dlg; + memset(&freehand_dlg,0,sizeof(freehand_dlg)); + sd->si = si; + yoff = 18; + } + + if ( sd->gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<gw = gw = GDrawCreateTopWindow(NULL,&pos,stroke_e_h,sd,&wattrs); + if ( si!=NULL ) + GDrawRequestDeviceEvents(gw,input_em_cnt,input_em); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + gcdoff = 0; + if ( strokeit==NULL ) { + label[0].text = (unichar_t *) _STR_CenterLine; + label[0].text_in_resource = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 5; + gcd[0].gd.flags = gg_enabled | gg_visible | (def->stroke_type==si_centerline ? gg_cb_on : 0 ); + gcd[0].gd.cid = CID_CenterLine; + gcd[0].gd.handle_controlevent = Stroke_CenterLine; + gcd[0].creator = GRadioCreate; + gcdoff = 1; + } + + label[gcdoff].text = (unichar_t *) _STR_Strok; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'S'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = 5+yoff; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->stroke_type==si_std? gg_cb_on : 0); + gcd[gcdoff].gd.cid = CID_Stroke; + gcd[gcdoff].gd.handle_controlevent = Stroke_Stroke; + gcd[gcdoff++].creator = GRadioCreate; + + /* This radio button is here rather than where it's location would */ + /* suggest because itneeds to be grouped with stroke and dont expand */ + label[gcdoff].text = (unichar_t *) _STR_Caligraphic; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'C'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6+84+4; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->stroke_type == si_caligraphic ? gg_cb_on : 0); + gcd[gcdoff].gd.cid = CID_Caligraphic; + gcd[gcdoff].gd.handle_controlevent = Stroke_Caligraphic; + gcd[gcdoff++].creator = GRadioCreate; + + /* ditto */ + label[gcdoff].text = (unichar_t *) _STR_ElipseM; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'E'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6+58+4; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->stroke_type == si_elipse ? gg_cb_on : 0); + gcd[gcdoff].gd.cid = CID_Elipse; + gcd[gcdoff].gd.handle_controlevent = Stroke_Elipse; + gcd[gcdoff++].creator = GRadioCreate; + + stroke_gcd = gcdoff; + gcd[gcdoff].gd.pos.x = 1; gcd[gcdoff].gd.pos.y = gcd[gcdoff-3].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = SD_Width-2; gcd[gcdoff].gd.pos.height = 84; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + gcd[gcdoff].gd.pos.x = 1; gcd[gcdoff].gd.pos.y = gcd[gcdoff-3].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = SD_Width-2; gcd[gcdoff].gd.pos.height = 58; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + gcd[gcdoff].gd.pos.x = 1; gcd[gcdoff].gd.pos.y = gcd[gcdoff-3].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = SD_Width-2; gcd[gcdoff].gd.pos.height = 58; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + label[gcdoff].text = (unichar_t *) _STR_LineCap; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 10; gcd[gcdoff].gd.pos.y = 23+yoff; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_LineCapTxt; + gcd[gcdoff++].creator = GLabelCreate; + + gcd[gcdoff].gd.pos.x = 6; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = SD_Width-12; gcd[gcdoff].gd.pos.height = 25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + label[gcdoff].text = (unichar_t *) _STR_Butt; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_buttcap; + gcd[gcdoff].gd.mnemonic = 'B'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 15; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+12; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->cap==lc_butt?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_ButtCap; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Round; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_roundcap; + gcd[gcdoff].gd.mnemonic = 'R'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->cap==lc_round?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_RoundCap; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Squareq; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_squarecap; + gcd[gcdoff].gd.mnemonic = 'q'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 150; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->cap==lc_square?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_SquareCap; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_LineJoin; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-5].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-3].gd.pos.y+25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_LineJoinTxt; + gcd[gcdoff++].creator = GLabelCreate; + + gcd[gcdoff].gd.pos.x = gcd[gcdoff-5].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = SD_Width-12; gcd[gcdoff].gd.pos.height = 25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + label[gcdoff].text = (unichar_t *) _STR_Miter; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_miterjoin; + gcd[gcdoff].gd.mnemonic = 'M'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-5].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+12; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->join==lj_miter?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_MiterJoin; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Roundu; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_roundjoin; + gcd[gcdoff].gd.mnemonic = 'u'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-5].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->join==lj_round?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_RoundJoin; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Bevel; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_beveljoin; + gcd[gcdoff].gd.mnemonic = 'v'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-5].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->join==lj_bevel?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_BevelJoin; + gcd[gcdoff++].creator = GRadioCreate; + + /* Caligraphic */ + label[gcdoff].text = (unichar_t *) _STR_PenAngle; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'A'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[stroke_gcd+5].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[stroke_gcd-2].gd.pos.y+15+3; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_PenAngleTxt; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( anglebuf, "%g", def->penangle*180/3.1415926535897932 ); + label[gcdoff].text = (unichar_t *) anglebuf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.mnemonic = 'A'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_PenAngle; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_PenHeightRatio; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'H'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-2].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+24; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_ThicknessRatioTxt; + gcd[gcdoff].gd.popup_msg = GStringGetResource(_STR_PenHeightRatioPopup,NULL); + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( ratiobuf, "%g", def->ratio ); + label[gcdoff].text = (unichar_t *) ratiobuf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.mnemonic = 'H'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-2].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+24; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_ThicknessRatio; + gcd[gcdoff].gd.popup_msg = GStringGetResource(_STR_PenHeightRatioPopup,NULL); + gcd[gcdoff++].creator = GTextFieldCreate; + + /* Elipse */ + label[gcdoff].text = (unichar_t *) _STR_PenAngle; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'A'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[stroke_gcd+5].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[stroke_gcd-1].gd.pos.y+15+3; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_PenAngle2Txt; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( anglebuf, "%g", def->penangle*180/3.1415926535897932 ); + label[gcdoff].text = (unichar_t *) anglebuf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.mnemonic = 'A'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_PenAngle2; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_MinorAxis; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'H'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-2].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+24; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_MinorAxisTxt; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( axisbuf, "%g", def->minorradius ); + label[gcdoff].text = (unichar_t *) axisbuf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.mnemonic = 'H'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-2].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+24; + gcd[gcdoff].gd.flags = gg_visible; + gcd[gcdoff].gd.cid = CID_MinorAxis; + gcd[gcdoff].gd.popup_msg = GStringGetResource(_STR_PenHeightRatioPopup,NULL); + gcd[gcdoff++].creator = GTextFieldCreate; + /* End radio area */ + + width_pos = gcdoff; + label[gcdoff].text = (unichar_t *) _STR_StrokeWidth; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'W'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+31; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_WidthTxt; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( widthbuf, "%g", 2*def->radius ); + label[gcdoff].text = (unichar_t *) widthbuf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.mnemonic = 'W'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_Width; + gcd[gcdoff++].creator = GTextFieldCreate; + + if ( si!=NULL ) { + gcd[gcdoff-1].gd.pos.width = 50; + + sprintf( width2buf, "%g", 2*def->radius2 ); + label[gcdoff].text = (unichar_t *) width2buf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 140; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_visible; + if ( def->pressure1!=def->pressure2 ) + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_Width2; + gcd[gcdoff].creator = GTextFieldCreate; + gcd[gcdoff++].gd.pos.width = 50; + + sd->r1.x = GDrawPointsToPixels(NULL,90); + sd->r1.width=sd->r1.height=GDrawPointsToPixels(NULL,20); + sd->r1.y = GDrawPointsToPixels(NULL,gcd[gcdoff-1].gd.pos.y+26); + sd->r2 = sd->r1; + sd->r2.x = GDrawPointsToPixels(NULL,150); + + label[gcdoff].text = (unichar_t *) _STR_Pressure; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'P'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; + gcd[gcdoff].gd.pos.y = GDrawPixelsToPoints(NULL,sd->r1.y+sd->r1.height)+5+3; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_PressureTxt; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( pressurebuf, "%d", def->pressure1 ); + label[gcdoff].text = (unichar_t *) pressurebuf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.mnemonic = 'W'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-3].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_Pressure1; + gcd[gcdoff].gd.handle_controlevent = Stroke_PressureChange; + gcd[gcdoff].creator = GTextFieldCreate; + gcd[gcdoff++].gd.pos.width = 50; + + sprintf( pressure2buf, "%d", def->pressure2 ); + label[gcdoff].text = (unichar_t *) pressure2buf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-3].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_Pressure2; + gcd[gcdoff].gd.handle_controlevent = Stroke_PressureChange; + gcd[gcdoff].creator = GTextFieldCreate; + gcd[gcdoff++].gd.pos.width = 50; + } + + label[gcdoff].text = (unichar_t *) _STR_RmInternalContour; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[width_pos].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+20; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->removeinternal?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_RmInternal; + gcd[gcdoff++].creator = GCheckBoxCreate; + + label[gcdoff].text = (unichar_t *) _STR_RmExternalContour; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-1].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+15; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->removeexternal?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_RmExternal; + gcd[gcdoff++].creator = GCheckBoxCreate; + + label[gcdoff].text = (unichar_t *) _STR_CleanupSelfIntersect; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-1].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+15; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (def->removeoverlapifneeded?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_CleanupSelfIntersect; + gcd[gcdoff].gd.popup_msg = GStringGetResource(_STR_CleanupSelfIntersectPopup,NULL); + gcd[gcdoff++].creator = GCheckBoxCreate; + + gcd[gcdoff].gd.pos.x = 30-3; gcd[gcdoff].gd.pos.y = (strokeit!=NULL?SD_Height:FH_Height)-30-3; + gcd[gcdoff].gd.pos.width = -1; + gcd[gcdoff].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[gcdoff].text = (unichar_t *) _STR_OK; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'O'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.handle_controlevent = Stroke_OK; + gcd[gcdoff++].creator = GButtonCreate; + + gcd[gcdoff].gd.pos.x = -30; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+3; + gcd[gcdoff].gd.pos.width = -1; + gcd[gcdoff].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[gcdoff].text = (unichar_t *) _STR_Cancel; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.mnemonic = 'C'; + gcd[gcdoff].gd.handle_controlevent = Stroke_Cancel; + gcd[gcdoff].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + } + + sd->cv = cv; + sd->strokeit = strokeit; + sd->done = false; + sd->up[0] = sd->up[1] = true; + GWidgetHidePalettes(); + GWidgetIndicateFocusGadget(GWidgetGetControl(sd->gw,CID_Width)); + if ( si==NULL ) + StrokeSetup(sd,GGadgetIsChecked( GWidgetGetControl(sd->gw,CID_Caligraphic))?si_caligraphic: + GGadgetIsChecked( GWidgetGetControl(sd->gw,CID_Stroke))?si_std: + GGadgetIsChecked( GWidgetGetControl(sd->gw,CID_Elipse))?si_elipse: + si_centerline); + else + StrokeSetup(sd,def->stroke_type); + GDrawSetVisible(sd->gw,true); + while ( !sd->done ) + GDrawProcessOneEvent(NULL); + if ( strokeit!=NULL ) + GDrawSetVisible(sd->gw,false); + else + GDrawDestroyWindow(sd->gw); +} + +void CVStroke(CharView *cv) { + + if ( cv->layerheads[cv->drawmode]->splines==NULL ) +return; + + MakeStrokeDlg(cv,CVStrokeIt,NULL); +} + +void SCStroke(SplineChar *sc) { + MakeStrokeDlg(sc,SCStrokeIt,NULL); +} + +void FVStroke(FontView *fv) { + MakeStrokeDlg(fv,FVStrokeIt,NULL); +} + +void FVStrokeItScript(FontView *fv, StrokeInfo *si) { + FVStrokeIt(fv, si); +} + +void FreeHandStrokeDlg(StrokeInfo *si) { + MakeStrokeDlg(NULL,NULL,si); +} + +/* ************************************************************************** */ +/* ****************************** Layer Dialog ****************************** */ +/* ************************************************************************** */ +#ifdef FONTFORGE_CONFIG_TYPE3 + +#define LY_Width 300 +#define LY_Height 310 + +#define CID_FillColor 2001 +#define CID_FillCInherit 2002 +#define CID_FillOpacity 2003 +#define CID_FillOInherit 2004 +#define CID_StrokeColor 2005 +#define CID_StrokeCInherit 2006 +#define CID_StrokeOpacity 2007 +#define CID_StrokeOInherit 2008 +#define CID_StrokeWInherit 2009 +#define CID_Trans 2010 +#define CID_InheritCap 2011 +#define CID_InheritJoin 2012 +#define CID_Fill 2013 + +struct layer_dlg { + int done; + int ok; + Layer *layer; + GWindow gw; +}; + +static uint32 getcol(GGadget *g,int *err) { + const unichar_t *ret=_GGadgetGetTitle(g); + unichar_t *end; + uint32 col = COLOR_INHERITED; + + if ( *ret=='#' ) ++ret; + col = u_strtol(ret,&end,16); + if ( col<0 || col>0xffffff || *end!='\0' ) { + *err = true; + GWidgetErrorR(_STR_BadColor,_STR_BadColor); + } +return( col ); +} + +static int Layer_OK(GGadget *g, GEvent *e) { + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct layer_dlg *ld = GDrawGetUserData(GGadgetGetWindow(g)); + Layer temp; + int err=false; + const unichar_t *ret; + unichar_t *end, *end2; + + LayerDefault(&temp); + temp.dofill = GGadgetIsChecked(GWidgetGetControl(gw,CID_Fill)); + temp.dostroke = GGadgetIsChecked(GWidgetGetControl(gw,CID_Stroke)); + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_FillCInherit)) ) + temp.fill_brush.col = COLOR_INHERITED; + else + temp.fill_brush.col = getcol(GWidgetGetControl(gw,CID_FillColor),&err); + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_FillOInherit)) ) + temp.fill_brush.opacity = -1; + else + temp.fill_brush.col = GetRealR(gw,CID_FillOpacity,_STR_Opacity,&err); + + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_StrokeCInherit)) ) + temp.stroke_pen.brush.col = COLOR_INHERITED; + else + temp.stroke_pen.brush.col = getcol(GWidgetGetControl(gw,CID_StrokeColor),&err); + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_StrokeOInherit)) ) + temp.stroke_pen.brush.opacity = -1; + else + temp.stroke_pen.brush.col = GetRealR(gw,CID_StrokeOpacity,_STR_Opacity,&err); + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_StrokeWInherit)) ) + temp.stroke_pen.width = WIDTH_INHERITED; + else + temp.stroke_pen.width = GetRealR(gw,CID_Width,_STR_Width,&err); + if ( err ) +return( true ); + + ret = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Trans)); + while ( *ret==' ' || *ret=='[' ) ++ret; + temp.stroke_pen.trans[0] = u_strtod(ret,&end); + temp.stroke_pen.trans[1] = u_strtod(end,&end); + temp.stroke_pen.trans[2] = u_strtod(end,&end); + temp.stroke_pen.trans[3] = u_strtod(end,&end2); + for ( ret = end2 ; *ret==' ' || *ret==']' ; ++ret ); + if ( end2==end || *ret!='\0' || temp.stroke_pen.trans[0] ==0 || temp.stroke_pen.trans[3]==0 ) { + GWidgetErrorR(_STR_BadMatrix,_STR_BadMatrix); +return( true ); + } + temp.stroke_pen.linecap = + GGadgetIsChecked(GWidgetGetControl(gw,CID_ButtCap))?lc_butt: + GGadgetIsChecked(GWidgetGetControl(gw,CID_RoundCap))?lc_round: + GGadgetIsChecked(GWidgetGetControl(gw,CID_SquareCap))?lc_square: + lc_inherited; + temp.stroke_pen.linejoin = + GGadgetIsChecked(GWidgetGetControl(gw,CID_BevelJoin))?lj_bevel: + GGadgetIsChecked(GWidgetGetControl(gw,CID_RoundJoin))?lj_round: + GGadgetIsChecked(GWidgetGetControl(gw,CID_MiterJoin))?lj_miter: + lj_inherited; + ld->done = ld->ok = true; + ld->layer->stroke_pen = temp.stroke_pen; + ld->layer->fill_brush = temp.fill_brush; + ld->layer->dofill = temp.dofill; + ld->layer->dostroke = temp.dostroke; + ld->layer->fillfirst = temp.fillfirst; + } +return( true ); +} + +static int Layer_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct layer_dlg *ld = GDrawGetUserData(GGadgetGetWindow(g)); + ld->done = true; + } +return( true ); +} + +static int Layer_Inherit(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GWindow gw = GGadgetGetWindow(g); + int cid = (intpt) GGadgetGetUserData(g); + GGadgetSetEnabled(GWidgetGetControl(gw,cid), + !GGadgetIsChecked(g)); + } +return( true ); +} + +static int layer_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct layer_dlg *ld = GDrawGetUserData(gw); + ld->done = true; + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("multilayer.html#Layer"); +return( true ); + } +return( false ); + } +return( true ); +} + +int LayerDialog(Layer *layer) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[38]; + GTextInfo label[38]; + struct layer_dlg ld; + int yoff=0; + int gcdoff, fill_gcd; + char widthbuf[20], fcol[12], scol[12], fopac[30], sopac[30], transbuf[150]; + + memset(&ld,0,sizeof(ld)); + ld.layer = layer; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<dofill? gg_cb_on : 0); + gcd[gcdoff].gd.cid = CID_Fill; + gcd[gcdoff++].creator = GCheckBoxCreate; + + fill_gcd = gcdoff; + gcd[gcdoff].gd.pos.x = 1; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = LY_Width-2; gcd[gcdoff].gd.pos.height = 65; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + label[gcdoff].text = (unichar_t *) _STR_Color; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+12; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( fcol, "#%06x", layer->fill_brush.col ); + label[gcdoff].text = (unichar_t *) fcol; + label[gcdoff].text_is_1byte = true; + if ( layer->fill_brush.col==COLOR_INHERITED ) + gcd[gcdoff].gd.flags = gg_visible; + else { + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + } + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.pos.width = 80; + gcd[gcdoff].gd.cid = CID_FillColor; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_Inherited; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 165; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+2; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->fill_brush.col==COLOR_INHERITED? gg_cb_on : 0); + gcd[gcdoff].data = (void *) CID_FillColor; + gcd[gcdoff].gd.cid = CID_FillCInherit; + gcd[gcdoff].gd.handle_controlevent = Layer_Inherit; + gcd[gcdoff++].creator = GCheckBoxCreate; + + label[gcdoff].text = (unichar_t *) _STR_Opacity; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'W'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( fopac, "%g", layer->fill_brush.opacity ); + label[gcdoff].text = (unichar_t *) fopac; + label[gcdoff].text_is_1byte = true; + if ( layer->stroke_pen.brush.opacity<0 ) + gcd[gcdoff].gd.flags = gg_visible; + else { + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + } + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.pos.width = 80; + gcd[gcdoff].gd.cid = CID_FillOpacity; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_Inherited; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 165; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+2; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->fill_brush.opacity<0? gg_cb_on : 0); + gcd[gcdoff].data = (void *) CID_FillOpacity; + gcd[gcdoff].gd.cid = CID_FillOInherit; + gcd[gcdoff].gd.handle_controlevent = Layer_Inherit; + gcd[gcdoff++].creator = GCheckBoxCreate; + + label[gcdoff].text = (unichar_t *) _STR_Strok; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'S'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[fill_gcd].gd.pos.y+gcd[fill_gcd].gd.pos.height+4; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->dostroke? gg_cb_on : 0); + gcd[gcdoff].gd.cid = CID_Stroke; + gcd[gcdoff++].creator = GCheckBoxCreate; + + gcd[gcdoff].gd.pos.x = 1; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = LY_Width-2; gcd[gcdoff].gd.pos.height = 180; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + label[gcdoff].text = (unichar_t *) _STR_Color; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+12; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( scol, "#%06x", layer->stroke_pen.brush.col ); + label[gcdoff].text = (unichar_t *) scol; + label[gcdoff].text_is_1byte = true; + if ( layer->stroke_pen.brush.col==COLOR_INHERITED ) + gcd[gcdoff].gd.flags = gg_visible; + else { + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + } + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.pos.width = 80; + gcd[gcdoff].gd.cid = CID_StrokeColor; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_Inherited; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 165; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+2; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.brush.col==COLOR_INHERITED? gg_cb_on : 0); + gcd[gcdoff].data = (void *) CID_StrokeColor; + gcd[gcdoff].gd.cid = CID_StrokeCInherit; + gcd[gcdoff].gd.handle_controlevent = Layer_Inherit; + gcd[gcdoff++].creator = GCheckBoxCreate; + + label[gcdoff].text = (unichar_t *) _STR_Opacity; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'W'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( sopac, "%g", layer->stroke_pen.brush.opacity ); + label[gcdoff].text = (unichar_t *) sopac; + label[gcdoff].text_is_1byte = true; + if ( layer->stroke_pen.brush.opacity<0 ) + gcd[gcdoff].gd.flags = gg_visible; + else { + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + } + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.pos.width = 80; + gcd[gcdoff].gd.cid = CID_StrokeOpacity; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_Inherited; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 165; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+2; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.brush.opacity<0? gg_cb_on : 0); + gcd[gcdoff].data = (void *) CID_StrokeOpacity; + gcd[gcdoff].gd.cid = CID_StrokeOInherit; + gcd[gcdoff].gd.handle_controlevent = Layer_Inherit; + gcd[gcdoff++].creator = GCheckBoxCreate; + + label[gcdoff].text = (unichar_t *) _STR_StrokeWidth; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'W'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+26; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_WidthTxt; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( widthbuf, "%g", layer->stroke_pen.width ); + label[gcdoff].text = (unichar_t *) widthbuf; + label[gcdoff].text_is_1byte = true; + if ( layer->stroke_pen.width==WIDTH_INHERITED ) + gcd[gcdoff].gd.flags = gg_visible; + else { + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + } + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.pos.width = 80; + gcd[gcdoff].gd.cid = CID_Width; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_Inherited; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 165; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+2; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.width==WIDTH_INHERITED? gg_cb_on : 0); + gcd[gcdoff].data = (void *) CID_Width; + gcd[gcdoff].gd.cid = CID_StrokeWInherit; + gcd[gcdoff].gd.handle_controlevent = Layer_Inherit; + gcd[gcdoff++].creator = GCheckBoxCreate; + + label[gcdoff].text = (unichar_t *) _STR_TransformPen; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'W'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 5; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GLabelCreate; + + sprintf( transbuf, "[%.4g %.4g %.4g %.4g]", layer->stroke_pen.trans[0], + layer->stroke_pen.trans[1], layer->stroke_pen.trans[2], + layer->stroke_pen.trans[3]); + label[gcdoff].text = (unichar_t *) transbuf; + label[gcdoff].text_is_1byte = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y-3; + gcd[gcdoff].gd.pos.width = 210; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_Trans; + gcd[gcdoff++].creator = GTextFieldCreate; + + label[gcdoff].text = (unichar_t *) _STR_LineCap; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 10; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+20; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_LineCapTxt; + gcd[gcdoff++].creator = GLabelCreate; + + gcd[gcdoff].gd.pos.x = 6; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = LY_Width-12; gcd[gcdoff].gd.pos.height = 25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + label[gcdoff].text = (unichar_t *) _STR_Butt; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_buttcap; + gcd[gcdoff].gd.mnemonic = 'B'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 15; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+12; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linecap==lc_butt?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_ButtCap; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Round; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_roundcap; + gcd[gcdoff].gd.mnemonic = 'R'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 80; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linecap==lc_round?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_RoundCap; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Squareq; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_squarecap; + gcd[gcdoff].gd.mnemonic = 'q'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 150; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linecap==lc_square?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_SquareCap; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Inherited; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 220; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linecap==lc_inherited?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_InheritCap; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_LineJoin; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-6].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-3].gd.pos.y+25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff].gd.cid = CID_LineJoinTxt; + gcd[gcdoff++].creator = GLabelCreate; + + gcd[gcdoff].gd.pos.x = gcd[gcdoff-6].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+6; + gcd[gcdoff].gd.pos.width = LY_Width-12; gcd[gcdoff].gd.pos.height = 25; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible; + gcd[gcdoff++].creator = GGroupCreate; + + label[gcdoff].text = (unichar_t *) _STR_Miter; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_miterjoin; + gcd[gcdoff].gd.mnemonic = 'M'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-6].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y+12; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linejoin==lj_miter?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_MiterJoin; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Roundu; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_roundjoin; + gcd[gcdoff].gd.mnemonic = 'u'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-6].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linejoin==lj_round?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_RoundJoin; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Bevel; + label[gcdoff].text_in_resource = true; + label[gcdoff].image = &GIcon_beveljoin; + gcd[gcdoff].gd.mnemonic = 'v'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = gcd[gcdoff-6].gd.pos.x; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linejoin==lj_bevel?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_BevelJoin; + gcd[gcdoff++].creator = GRadioCreate; + + label[gcdoff].text = (unichar_t *) _STR_Inherited; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.mnemonic = 'q'; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.pos.x = 220; gcd[gcdoff].gd.pos.y = gcd[gcdoff-2].gd.pos.y; + gcd[gcdoff].gd.flags = gg_enabled | gg_visible | (layer->stroke_pen.linejoin==lj_inherited?gg_cb_on:0); + gcd[gcdoff].gd.cid = CID_InheritCap; + gcd[gcdoff++].creator = GRadioCreate; + + + gcd[gcdoff].gd.pos.x = 30-3; gcd[gcdoff].gd.pos.y = LY_Height-30-3; + gcd[gcdoff].gd.pos.width = -1; + gcd[gcdoff].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[gcdoff].text = (unichar_t *) _STR_OK; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.handle_controlevent = Layer_OK; + gcd[gcdoff++].creator = GButtonCreate; + + gcd[gcdoff].gd.pos.x = -30; gcd[gcdoff].gd.pos.y = gcd[gcdoff-1].gd.pos.y+3; + gcd[gcdoff].gd.pos.width = -1; + gcd[gcdoff].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[gcdoff].text = (unichar_t *) _STR_Cancel; + label[gcdoff].text_in_resource = true; + gcd[gcdoff].gd.label = &label[gcdoff]; + gcd[gcdoff].gd.handle_controlevent = Layer_Cancel; + gcd[gcdoff].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + + GWidgetHidePalettes(); + /*GWidgetIndicateFocusGadget(GWidgetGetControl(ld.gw,CID_Width));*/ + GDrawSetVisible(ld.gw,true); + while ( !ld.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(ld.gw); +return( ld.ok ); +} +#endif diff --git a/fontforge/cvtranstools.c b/fontforge/cvtranstools.c new file mode 100644 index 00000000..96f38c26 --- /dev/null +++ b/fontforge/cvtranstools.c @@ -0,0 +1,96 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include + +void CVMouseDownTransform(CharView *cv) { + CVPreserveTState(cv); +} + +void CVMouseMoveTransform(CharView *cv) { + real transform[6]; + + CVRestoreTOriginalState(cv); + if ( cv->info.x != cv->p.cx || cv->info.y != cv->p.cy ) { + transform[0] = transform[3] = 1; + transform[1] = transform[2] = 0; + switch ( cv->active_tool ) { + case cvt_rotate: { + real angle = atan2(cv->info.y-cv->p.cy,cv->info.x-cv->p.cx); + transform[0] = transform[3] = cos(angle); + transform[2] = -(transform[1] = sin(angle)); + } break; + case cvt_flip: { + real dx,dy; + if (( dx = cv->info.x-cv->p.cx)<0 ) dx=-dx; + if (( dy = cv->info.y-cv->p.cy)<0 ) dy=-dy; + if ( dy>2*dx ) + transform[0] = -1; + else if ( dx>2*dy ) + transform[3] = -1; + else if ( (cv->info.x-cv->p.cx)*(cv->info.y-cv->p.cy)>0 ) { + transform[0] = transform[3] = 0; + transform[1] = transform[2] = -1; + } else { + transform[0] = transform[3] = 0; + transform[1] = transform[2] = 1; + } + } break; + case cvt_scale: { + transform[0] = 1.0+(cv->info.x-cv->p.cx)/(400*cv->scale); + transform[3] = 1.0+(cv->info.y-cv->p.cy)/(400*cv->scale); + } break; + case cvt_skew: { + real angle = atan2(cv->info.y-cv->p.cy,cv->info.x-cv->p.cx); + transform[2] = sin(angle); + } break; + default: + break; + } + /* Make the pressed point be the center of the transformation */ + transform[4] = -cv->p.cx*transform[0] - + cv->p.cy*transform[2] + + cv->p.cx; + transform[5] = -cv->p.cy*transform[3] - + cv->p.cx*transform[1] + + cv->p.cy; + CVSetCharChanged(cv,true); + CVTransFunc(cv,transform,false); + } + SCUpdateAll(cv->sc); +} + +void CVMouseUpTransform(CharView *cv) { + if ( cv->info.x == cv->p.cx && cv->info.y == cv->p.cy ) { + /* Nothing happened */ + cv->needsrasterize = cv->recentchange = false; + CVRemoveTopUndo(cv); + cv->p.pressed = false; + SCUpdateAll(cv->sc); + } else + CVUndoCleanup(cv); +} diff --git a/fontforge/cvundoes.c b/fontforge/cvundoes.c new file mode 100644 index 00000000..4dfd96a6 --- /dev/null +++ b/fontforge/cvundoes.c @@ -0,0 +1,2561 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +extern char *coord_sep; + +/* ********************************* Undoes ********************************* */ + +int maxundoes = 12; /* -1 is infinite */ + +static uint8 *bmpcopy(uint8 *bitmap,int bytes_per_line, int lines) { + uint8 *ret = galloc(bytes_per_line*lines); + memcpy(ret,bitmap,bytes_per_line*lines); +return( ret ); +} + +static RefChar *RefCharsCopyState(SplineChar *sc,int layer) { + RefChar *head=NULL, *last=NULL, *new, *crefs; + + if ( layer<0 || sc->layers[layer].refs==NULL ) +return( NULL ); + for ( crefs = sc->layers[layer].refs; crefs!=NULL; crefs=crefs->next ) { + new = RefCharCreate(); + *new = *crefs; + new->layers[0].splines = NULL; + new->next = NULL; + if ( last==NULL ) + head = last = new; + else { + last->next = new; + last = new; + } + } +return( head ); +} + +static MinimumDistance *MDsCopyState(SplineChar *sc,SplineSet *rpl) { + MinimumDistance *head=NULL, *last, *md, *cur; + + if ( sc->md==NULL ) +return( NULL ); + + for ( md = sc->md; md!=NULL; md=md->next ) { + cur = chunkalloc(sizeof(MinimumDistance)); + *cur = *md; + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + cur->next = NULL; + + MDReplace(head,sc->layers[ly_fore].splines,rpl); +return( head ); +} + +static int RefCharsMatch(RefChar *urefs,RefChar *crefs) { + /* I assume they are in the same order */ + while ( urefs!=NULL && crefs!=NULL ) { + if ( urefs->sc!=crefs->sc || + urefs->transform[0]!=crefs->transform[0] || + urefs->transform[1]!=crefs->transform[1] || + urefs->transform[2]!=crefs->transform[2] || + urefs->transform[3]!=crefs->transform[3] || + urefs->transform[4]!=crefs->transform[4] || + urefs->transform[5]!=crefs->transform[5] ) +return( false ); + urefs = urefs->next; + crefs = crefs->next; + } + if ( urefs==NULL && crefs==NULL ) +return( true ); + +return( false ); +} + +static int ImagesMatch(ImageList *uimgs,ImageList *cimgs) { + /* I assume they are in the same order */ + while ( uimgs!=NULL && cimgs!=NULL ) { + if ( uimgs->image!=cimgs->image || + uimgs->xoff!=cimgs->xoff || + uimgs->yoff!=cimgs->yoff || + uimgs->xscale!=cimgs->xscale || + uimgs->yscale!=cimgs->yscale ) +return( false ); + uimgs = uimgs->next; + cimgs = cimgs->next; + } + if ( uimgs==NULL && cimgs==NULL ) +return( true ); + +return( false ); +} + +static RefChar *RefCharInList(RefChar *search,RefChar *list) { + while ( list!=NULL ) { + if ( search->sc==list->sc && + search->transform[0]==list->transform[0] && + search->transform[1]==list->transform[1] && + search->transform[2]==list->transform[2] && + search->transform[3]==list->transform[3] && + search->transform[4]==list->transform[4] && + search->transform[5]==list->transform[5] ) +return( list ); + list = list->next; + } +return( NULL ); +} + +static ImageList *ImageInList(ImageList *search,ImageList *list) { + while ( list!=NULL ) { + if ( search->image!=list->image || + search->xoff!=list->xoff || + search->yoff!=list->yoff || + search->xscale!=list->xscale || + search->yscale!=list->yscale ) +return( list ); + list = list->next; + } +return( NULL ); +} + +static void FixupRefChars(SplineChar *sc,RefChar *urefs,int layer) { + RefChar *crefs = sc->layers[layer].refs, *cend, *cprev, *unext, *cnext; + + cprev = NULL; + while ( crefs!=NULL && urefs!=NULL ) { + if ( urefs->sc==crefs->sc && + urefs->transform[0]==crefs->transform[0] && + urefs->transform[1]==crefs->transform[1] && + urefs->transform[2]==crefs->transform[2] && + urefs->transform[3]==crefs->transform[3] && + urefs->transform[4]==crefs->transform[4] && + urefs->transform[5]==crefs->transform[5] ) { + unext = urefs->next; + crefs->selected = urefs->selected; + RefCharFree(urefs); + urefs = unext; + cprev = crefs; + crefs = crefs->next; + } else if ( (cend = RefCharInList(urefs,crefs->next))!=NULL ) { + /* if the undo refchar matches something further down the char's */ + /* ref list, then than means we need to delete everything on the */ + /* char's list between the two */ + while ( crefs!=cend ) { + cnext = crefs->next; + SCRemoveDependent(sc,crefs); + crefs = cnext; + } + } else { /* urefs isn't on the list. Add it here */ + unext = urefs->next; + urefs->next = crefs; + if ( cprev==NULL ) + sc->layers[layer].refs = urefs; + else + cprev->next = urefs; + cprev = urefs; + SCReinstanciateRefChar(sc,urefs); + SCMakeDependent(sc,urefs->sc); + urefs = unext; + } + } + if ( crefs!=NULL ) { + while ( crefs!=NULL ) { + cnext = crefs->next; + SCRemoveDependent(sc,crefs); + crefs = cnext; + } + } else if ( urefs!=NULL ) { + if ( cprev==NULL ) + sc->layers[layer].refs = urefs; + else + cprev->next = urefs; + while ( urefs!=NULL ) { + SCReinstanciateRefChar(sc,urefs); + SCMakeDependent(sc,urefs->sc); + urefs = urefs->next; + } + } +} + +static void FixupImages(SplineChar *sc,ImageList *uimgs,int layer) { + ImageList *cimgs = sc->layers[layer].images, *cend, *cprev, *unext, *cnext; + + cprev = NULL; + while ( cimgs!=NULL && uimgs!=NULL ) { + if ( uimgs->image==cimgs->image && + uimgs->xoff==cimgs->xoff && + uimgs->yoff==cimgs->yoff && + uimgs->xscale==cimgs->xscale && + uimgs->yscale==cimgs->yscale ) { + unext = uimgs->next; + cimgs->selected = uimgs->selected; + free(uimgs); + uimgs = unext; + cprev = cimgs; + cimgs = cimgs->next; + } else if ( (cend = ImageInList(uimgs,cimgs->next))!=NULL ) { + /* if the undo image matches something further down the char's */ + /* img list, then than means we need to delete everything on the */ + /* char's list between the two */ + if ( cprev==NULL ) + sc->layers[layer].images = cend; + else + cprev->next = cend; + while ( cimgs!=cend ) { + cnext = cimgs->next; + free(cimgs); + cimgs = cnext; + } + } else { /* uimgs isn't on the list. Add it here */ + unext = uimgs->next; + uimgs->next = cimgs; + if ( cprev==NULL ) + sc->layers[layer].images = uimgs; + else + cprev->next = uimgs; + cprev = uimgs; + uimgs = unext; + } + } + if ( cimgs!=NULL ) { + ImageListsFree(cimgs); + if ( cprev==NULL ) + sc->layers[layer].images = NULL; + else + cprev->next = NULL; + } else if ( uimgs!=NULL ) { + if ( cprev==NULL ) + sc->layers[layer].images = uimgs; + else + cprev->next = uimgs; + } +} + +static void UHintListFree(void *hints) { + StemInfo *h, *t, *p; + + if ( hints==NULL ) +return; + if ( ((StemInfo *) hints)->hinttype==ht_d ) + DStemInfosFree(hints); + else { + h = t = hints; + p = NULL; + while ( t!=NULL && t->hinttype!=ht_d ) { + p = t; + t = t->next; + } + p->next = NULL; + StemInfosFree(h); + DStemInfosFree((DStemInfo *) t); + } +} + +static void *UHintCopy(SplineChar *sc,int docopy) { + StemInfo *h = sc->hstem, *v = sc->vstem, *last=NULL; + DStemInfo *d = sc->dstem; + void *ret = NULL; + + if ( docopy ) { + h = StemInfoCopy(h); + v = StemInfoCopy(v); + d = DStemInfoCopy(d); + } else { + sc->hstem = NULL; + sc->vstem = NULL; + sc->dstem = NULL; + sc->hconflicts = sc->vconflicts = false; + } + ret = h; + if ( h!=NULL ) { + h->hinttype = ht_h; + for ( last=h; last->next!=NULL; last=last->next ) last->next->hinttype = ht_unspecified; + last->next = v; + } else + ret = v; + if ( v!=NULL ) { + v->hinttype = ht_v; + for ( last=v; last->next!=NULL; last=last->next ) last->next->hinttype = ht_unspecified; + } + if ( last!=NULL ) + last->next = (StemInfo *) d; + else + ret = d; + if ( d!=NULL ) { + d->hinttype = ht_d; + for ( d=d->next; d!=NULL; d=d->next ) d->hinttype = ht_unspecified; + } +return(ret); +} + +static void ExtractHints(SplineChar *sc,void *hints,int docopy) { + StemInfo *h = NULL, *v = NULL, *p; + DStemInfo *d = NULL; + StemInfo *pv = NULL, *pd = NULL; + + p = NULL; + while ( hints!=NULL ) { + if ( ((StemInfo *) hints)->hinttype == ht_h ) + h = hints; + else if ( ((StemInfo *) hints)->hinttype == ht_v ) { + v = hints; + pv = p; + } else if ( ((StemInfo *) hints)->hinttype == ht_d ) { + d = hints; + pd = p; + break; + } + p = hints; + hints = ((StemInfo *) hints)->next; + } + + if ( pv!=NULL ) pv->next = NULL; + if ( pd!=NULL ) pd->next = NULL; + if ( docopy ) { + h = StemInfoCopy(h); + if ( pv!=NULL ) pv->next = v; + v = StemInfoCopy(v); + if ( pd!=NULL ) pd->next = (StemInfo *) d; + d = DStemInfoCopy(d); + } + + StemInfosFree(sc->hstem); + StemInfosFree(sc->vstem); + DStemInfosFree(sc->dstem); + sc->hstem = h; + sc->vstem = v; + sc->dstem = d; + sc->hconflicts = StemInfoAnyOverlaps(h); + sc->vconflicts = StemInfoAnyOverlaps(v); +} + +void UndoesFree(Undoes *undo) { + Undoes *unext; + int i; + + while ( undo!=NULL ) { + unext = undo->next; + switch ( undo->undotype ) { + case ut_noop: + case ut_width: case ut_vwidth: case ut_lbearing: case ut_rbearing: + /* Nothing else to free */; + break; + case ut_state: case ut_tstate: case ut_statehint: case ut_statename: + SplinePointListsFree(undo->u.state.splines); + RefCharsFree(undo->u.state.refs); + MinimumDistancesFree(undo->u.state.md); +#ifdef FONTFORGE_CONFIG_TYPE3 + UHintListFree(undo->u.state.u.hints); + ImageListsFree(undo->u.state.u.images); +#else + if ( undo->undotype==ut_statehint || undo->undotype==ut_statename ) + UHintListFree(undo->u.state.u.hints); + else + ImageListsFree(undo->u.state.u.images); +#endif + if ( undo->undotype==ut_statename ) { + free( undo->u.state.charname ); + free( undo->u.state.comment ); + PSTFree( undo->u.state.possub ); + } + AnchorPointsFree(undo->u.state.anchor); + break; + case ut_bitmap: + free(undo->u.bmpstate.bitmap); + BDFFloatFree(undo->u.bmpstate.selection); + break; + case ut_composit: + UndoesFree(undo->u.composit.state); + UndoesFree(undo->u.composit.bitmaps); + break; + case ut_possub: + for ( i=0; undo->u.possub.data[i]!=NULL; ++i ) + free(undo->u.possub.data[i]); + free(undo->u.possub.data); + break; + default: + GDrawIError( "Unknown undo type in UndoesFree: %d", undo->undotype ); + break; + } + chunkfree(undo,sizeof(Undoes)); + undo = unext; + } +} + +static Undoes *AddUndo(Undoes *undo,Undoes **uhead,Undoes **rhead) { + int ucnt; + Undoes *u, *prev; + + UndoesFree(*rhead); + *rhead = NULL; + if ( maxundoes==0 ) maxundoes = 1; /* Must be at least one or snap to breaks */ + if ( maxundoes>0 ) { + ucnt = 0; + prev = NULL; + for ( u= *uhead; u!=NULL; u=u->next ) { + if ( ++ucnt>=maxundoes ) + break; + prev = u; + } + if ( u!=NULL ) { + UndoesFree(u); + if ( prev!=NULL ) + prev->next = NULL; + else + *uhead = NULL; + } + } + undo->next = *uhead; + *uhead = undo; +return( undo ); +} + +static Undoes *CVAddUndo(CharView *cv,Undoes *undo) { +return( AddUndo(undo,&cv->layerheads[cv->drawmode]->undoes, + &cv->layerheads[cv->drawmode]->redoes)); +} + +int CVLayer(CharView *cv) { + if ( cv->drawmode==dm_grid ) +return( ly_grid ); + +return( cv->layerheads[cv->drawmode]-cv->sc->layers ); +} + +Undoes *CVPreserveState(CharView *cv) { + Undoes *undo; + int layer = CVLayer(cv); + + if ( screen_display==NULL || maxundoes==0 ) /* No use for undoes in scripting */ +return(NULL); + + undo = chunkalloc(sizeof(Undoes)); + + undo->undotype = ut_state; + undo->was_modified = cv->sc->changed; + undo->was_order2 = cv->sc->parent->order2; + undo->u.state.width = cv->sc->width; + undo->u.state.vwidth = cv->sc->vwidth; + undo->u.state.splines = SplinePointListCopy(cv->layerheads[cv->drawmode]->splines); + undo->u.state.refs = RefCharsCopyState(cv->sc,layer); + if ( layer==ly_fore ) { + undo->u.state.md = MDsCopyState(cv->sc,undo->u.state.splines); + undo->u.state.anchor = AnchorPointsCopy(cv->sc->anchor); + } + undo->u.state.u.images = ImageListCopy(cv->layerheads[cv->drawmode]->images); +#ifdef FONTFORGE_CONFIG_TYPE3 + undo->u.state.fill_brush = cv->layerheads[cv->drawmode]->fill_brush; + undo->u.state.stroke_pen = cv->layerheads[cv->drawmode]->stroke_pen; + undo->u.state.dofill = cv->layerheads[cv->drawmode]->dofill; + undo->u.state.dostroke = cv->layerheads[cv->drawmode]->dostroke; + undo->u.state.fillfirst = cv->layerheads[cv->drawmode]->fillfirst; +#endif +return( CVAddUndo(cv,undo)); +} + +Undoes *SCPreserveLayer(SplineChar *sc,int layer, int dohints) { + Undoes *undo; + + if ( screen_display==NULL || maxundoes==0 ) /* No use for undoes in scripting */ +return(NULL); + + undo = chunkalloc(sizeof(Undoes)); + + undo->undotype = ut_state; + undo->was_modified = sc->changed; + undo->was_order2 = sc->parent->order2; + undo->u.state.width = sc->width; + undo->u.state.vwidth = sc->vwidth; + undo->u.state.splines = SplinePointListCopy(sc->layers[layer].splines); + undo->u.state.refs = RefCharsCopyState(sc,layer); + if ( layer==ly_fore ) { + undo->u.state.md = MDsCopyState(sc,undo->u.state.splines); + undo->u.state.anchor = AnchorPointsCopy(sc->anchor); + } + undo->u.state.u.images = ImageListCopy(sc->layers[layer].images); + if ( dohints ) { + undo->undotype = ut_statehint; + undo->u.state.u.hints = UHintCopy(sc,true); + if ( dohints==2 ) { + undo->undotype = ut_statename; + undo->u.state.unicodeenc = sc->unicodeenc; + undo->u.state.charname = copy(sc->name); + undo->u.state.comment = u_copy(sc->comment); + undo->u.state.possub = PSTCopy(sc->possub,sc,sc->parent); + } + } +#ifdef FONTFORGE_CONFIG_TYPE3 + undo->u.state.fill_brush = sc->layers[layer].fill_brush; + undo->u.state.stroke_pen = sc->layers[layer].stroke_pen; + undo->u.state.dofill = sc->layers[layer].dofill; + undo->u.state.dostroke = sc->layers[layer].dostroke; + undo->u.state.fillfirst = sc->layers[layer].fillfirst; +#endif + undo->u.state.copied_from = sc->parent; +return( AddUndo(undo,&sc->layers[layer].undoes,&sc->layers[layer].redoes)); +} + +Undoes *SCPreserveState(SplineChar *sc,int dohints) { +#ifdef FONTFORGE_CONFIG_TYPE3 + int i; + + for ( i=ly_fore+1; ilayer_cnt; ++i ) + SCPreserveLayer(sc,i,false); +#endif +return( SCPreserveLayer(sc,ly_fore,dohints)); +} + +Undoes *SCPreserveBackground(SplineChar *sc) { +return( SCPreserveLayer(sc,ly_back,false)); +} + +void SCUndoSetLBearingChange(SplineChar *sc,int lbc) { + Undoes *undo = sc->layers[ly_fore].undoes; + + if ( undo==NULL || undo->undotype != ut_state ) +return; + undo->u.state.lbearingchange = lbc; +} + +Undoes *CVPreserveTState(CharView *cv) { + Undoes *undo; + int anyrefs; + RefChar *refs, *urefs; + int was0 = false, j; + + cv->p.transany = CVAnySel(cv,NULL,&anyrefs,NULL,NULL); + cv->p.transanyrefs = anyrefs; + + if ( maxundoes==0 ) { + was0 = true; + maxundoes = 1; + } + + undo = CVPreserveState(cv); + if ( !cv->p.transany || cv->p.transanyrefs ) { + for ( refs = cv->layerheads[cv->drawmode]->refs, urefs=undo->u.state.refs; urefs!=NULL; refs=refs->next, urefs=urefs->next ) + if ( !cv->p.transany || refs->selected ) + for ( j=0; jlayer_cnt; ++j ) + urefs->layers[j].splines = SplinePointListCopy(refs->layers[j].splines); + } + undo->undotype = ut_tstate; + + if ( was0 ) + maxundoes = 0; + +return( undo ); +} + +Undoes *CVPreserveWidth(CharView *cv,int width) { + Undoes *undo; + + if ( screen_display==NULL || maxundoes==0 ) /* No use for undoes in scripting */ +return(NULL); + + undo = chunkalloc(sizeof(Undoes)); + + undo->undotype = ut_width; + undo->was_modified = cv->sc->changed; + undo->was_order2 = cv->sc->parent->order2; + undo->u.width = width; +return( CVAddUndo(cv,undo)); +} + +Undoes *CVPreserveVWidth(CharView *cv,int vwidth) { + Undoes *undo; + + if ( screen_display==NULL || maxundoes==0 ) /* No use for undoes in scripting */ +return(NULL); + + undo = chunkalloc(sizeof(Undoes)); + + undo->undotype = ut_vwidth; + undo->was_modified = cv->sc->changed; + undo->was_order2 = cv->sc->parent->order2; + undo->u.width = vwidth; +return( CVAddUndo(cv,undo)); +} + +Undoes *SCPreserveWidth(SplineChar *sc) { + Undoes *undo; + + if ( screen_display==NULL || maxundoes==0 ) /* No use for undoes in scripting */ +return(NULL); + + undo = chunkalloc(sizeof(Undoes)); + + undo->undotype = ut_width; + undo->was_modified = sc->changed; + undo->was_order2 = sc->parent->order2; + undo->u.state.width = sc->width; +return( AddUndo(undo,&sc->layers[ly_fore].undoes,&sc->layers[ly_fore].redoes)); +} + +Undoes *SCPreserveVWidth(SplineChar *sc) { + Undoes *undo; + + if ( screen_display==NULL || maxundoes==0 ) /* No use for undoes in scripting */ +return(NULL); + + undo = chunkalloc(sizeof(Undoes)); + + undo->undotype = ut_vwidth; + undo->was_modified = sc->changed; + undo->was_order2 = sc->parent->order2; + undo->u.state.width = sc->vwidth; +return( AddUndo(undo,&sc->layers[ly_fore].undoes,&sc->layers[ly_fore].redoes)); +} + +Undoes *BCPreserveState(BDFChar *bc) { + Undoes *undo; + + if ( screen_display==NULL || maxundoes==0 ) /* No use for undoes in scripting */ +return(NULL); + + undo = chunkalloc(sizeof(Undoes)); + + undo->undotype = ut_bitmap; + undo->u.bmpstate.width = bc->width; + undo->u.bmpstate.xmin = bc->xmin; + undo->u.bmpstate.xmax = bc->xmax; + undo->u.bmpstate.ymin = bc->ymin; + undo->u.bmpstate.ymax = bc->ymax; + undo->u.bmpstate.bytes_per_line = bc->bytes_per_line; + undo->u.bmpstate.bitmap = bmpcopy(bc->bitmap,bc->bytes_per_line, + bc->ymax-bc->ymin+1); + undo->u.bmpstate.selection = BDFFloatCopy(bc->selection); +return( AddUndo(undo,&bc->undoes,&bc->redoes)); +} + +static void SCUndoAct(SplineChar *sc,int layer, Undoes *undo) { + + switch ( undo->undotype ) { + case ut_noop: + break; + case ut_width: { + int width = sc->width; + if ( sc->width!=undo->u.width ) + SCSynchronizeWidth(sc,undo->u.width,width,NULL); + undo->u.width = width; + } break; + case ut_vwidth: { + int vwidth = sc->vwidth; + sc->vwidth = undo->u.width; + undo->u.width = vwidth; + } break; + case ut_state: case ut_tstate: case ut_statehint: case ut_statename: { + Layer *head = layer==ly_grid ? &sc->parent->grid : &sc->layers[layer]; + SplinePointList *spl = head->splines; + + if ( layer==ly_fore ) { + int width = sc->width; + int vwidth = sc->vwidth; + if ( sc->width!=undo->u.state.width ) + SCSynchronizeWidth(sc,undo->u.state.width,width,NULL); + sc->vwidth = undo->u.state.vwidth; + undo->u.state.width = width; + undo->u.state.vwidth = vwidth; + } + head->splines = undo->u.state.splines; + if ( layer==ly_fore ) { + MinimumDistance *md = sc->md; + AnchorPoint *ap = sc->anchor; + sc->md = undo->u.state.md; + undo->u.state.md = md; + sc->anchor = undo->u.state.anchor; + undo->u.state.anchor = ap; + } + if ( layer>=ly_fore && !RefCharsMatch(undo->u.state.refs,sc->layers[layer].refs)) { + RefChar *refs = RefCharsCopyState(sc,layer); + FixupRefChars(sc,undo->u.state.refs,layer); + undo->u.state.refs = refs; + } else if ( layer==ly_fore && undo->undotype==ut_statehint ) { + void *hints = UHintCopy(sc,false); + ExtractHints(sc,undo->u.state.u.hints,false); + undo->u.state.u.hints = hints; + } + if ( undo->undotype!=ut_statehint && + !ImagesMatch(undo->u.state.u.images,sc->layers[layer].images)) { + ImageList *images = ImageListCopy(sc->layers[layer].images); + FixupImages(sc,undo->u.state.u.images,layer); + undo->u.state.u.images = images; + SCOutOfDateBackground(sc); + } + undo->u.state.splines = spl; + if ( undo->u.state.lbearingchange ) { + undo->u.state.lbearingchange = -undo->u.state.lbearingchange; + SCSynchronizeLBearing(sc,NULL,undo->u.state.lbearingchange); + } + if ( layer==ly_fore && undo->undotype==ut_statename ) { + char *temp = sc->name; + int uni = sc->unicodeenc; + PST *possub = sc->possub; + unichar_t *comment = sc->comment; + sc->name = undo->u.state.charname; + undo->u.state.charname = temp; + sc->unicodeenc = undo->u.state.unicodeenc; + undo->u.state.unicodeenc = uni; + sc->possub = undo->u.state.possub; + undo->u.state.possub = possub; + sc->comment = undo->u.state.comment; + undo->u.state.comment = comment; + } + } break; + default: + GDrawIError( "Unknown undo type in SCUndoAct: %d", undo->undotype ); + break; + } +} + +void CVDoUndo(CharView *cv) { + Undoes *undo = cv->layerheads[cv->drawmode]->undoes; + + if ( undo==NULL ) /* Shouldn't happen */ +return; + cv->layerheads[cv->drawmode]->undoes = undo->next; + undo->next = NULL; + SCUndoAct(cv->sc,CVLayer(cv),undo); + undo->next = cv->layerheads[cv->drawmode]->redoes; + cv->layerheads[cv->drawmode]->redoes = undo; + _CVCharChangedUpdate(cv,undo->was_modified); + cv->lastselpt = NULL; +return; +} + +void CVDoRedo(CharView *cv) { + Undoes *undo = cv->layerheads[cv->drawmode]->redoes; + + if ( undo==NULL ) /* Shouldn't happen */ +return; + cv->layerheads[cv->drawmode]->redoes = undo->next; + undo->next = NULL; + SCUndoAct(cv->sc,CVLayer(cv),undo); + undo->next = cv->layerheads[cv->drawmode]->undoes; + cv->layerheads[cv->drawmode]->undoes = undo; + CVCharChangedUpdate(cv); + cv->lastselpt = NULL; +return; +} + +void SCDoUndo(SplineChar *sc,int layer) { + Undoes *undo = sc->layers[layer].undoes; + + if ( undo==NULL ) /* Shouldn't happen */ +return; + sc->layers[layer].undoes = undo->next; + undo->next = NULL; + SCUndoAct(sc,layer,undo); + undo->next = sc->layers[layer].redoes; + sc->layers[layer].redoes = undo; + _SCCharChangedUpdate(sc,undo->was_modified); +return; +} + +void SCDoRedo(SplineChar *sc, int layer) { + Undoes *undo = sc->layers[layer].redoes; + + if ( undo==NULL ) /* Shouldn't happen */ +return; + sc->layers[layer].redoes = undo->next; + undo->next = NULL; + SCUndoAct(sc,layer,undo); + undo->next = sc->layers[layer].undoes; + sc->layers[layer].undoes = undo; + SCCharChangedUpdate(sc); +return; +} + +/* Used when doing incremental transformations. If I just keep doing increments*/ +/* then rounding errors will mount. Instead I go back to the original state */ +/* each time */ +void CVRestoreTOriginalState(CharView *cv) { + Undoes *undo = cv->layerheads[cv->drawmode]->undoes; + RefChar *ref, *uref; + ImageList *img, *uimg; + int j; + + SplinePointListSet(cv->layerheads[cv->drawmode]->splines,undo->u.state.splines); + if ( cv->drawmode==dm_fore && (!cv->p.anysel || cv->p.transanyrefs)) { + for ( ref=cv->layerheads[cv->drawmode]->refs, uref=undo->u.state.refs; uref!=NULL; ref=ref->next, uref=uref->next ) + for ( j=0; jlayer_cnt; ++j ) + if ( uref->layers[j].splines!=NULL ) { + SplinePointListSet(ref->layers[j].splines,uref->layers[j].splines); + memcpy(&ref->transform,&uref->transform,sizeof(ref->transform)); + } + } + for ( img=cv->layerheads[cv->drawmode]->images, uimg=undo->u.state.u.images; uimg!=NULL; + img = img->next, uimg = uimg->next ) { + img->xoff = uimg->xoff; + img->yoff = uimg->yoff; + img->xscale = uimg->xscale; + img->yscale = uimg->yscale; + } +} + +void CVUndoCleanup(CharView *cv) { + Undoes * undo = cv->layerheads[cv->drawmode]->undoes; + RefChar *uref; + + if ( cv->drawmode==dm_fore && (!cv->p.anysel || cv->p.transanyrefs)) { + for ( uref=undo->u.state.refs; uref!=NULL; uref=uref->next ) { + SplinePointListFree(uref->layers[0].splines); + uref->layers[0].splines = NULL; + } + } + undo->undotype = ut_state; +} + +void CVRemoveTopUndo(CharView *cv) { + Undoes * undo = cv->layerheads[cv->drawmode]->undoes; + + cv->layerheads[cv->drawmode]->undoes = undo->next; + undo->next = NULL; + UndoesFree(undo); +} + +static void BCUndoAct(BDFChar *bc,Undoes *undo) { + + switch ( undo->undotype ) { + case ut_bitmap: { + uint8 *b; + int temp; + BDFFloat *sel; + temp = bc->width; bc->width = undo->u.bmpstate.width; undo->u.bmpstate.width = temp; + temp = bc->xmin; bc->xmin = undo->u.bmpstate.xmin; undo->u.bmpstate.xmin = temp; + temp = bc->xmax; bc->xmax = undo->u.bmpstate.xmax; undo->u.bmpstate.xmax = temp; + temp = bc->ymin; bc->ymin = undo->u.bmpstate.ymin; undo->u.bmpstate.ymin = temp; + temp = bc->ymax; bc->ymax = undo->u.bmpstate.ymax; undo->u.bmpstate.ymax = temp; + temp = bc->bytes_per_line; bc->bytes_per_line = undo->u.bmpstate.bytes_per_line; undo->u.bmpstate.bytes_per_line = temp; + b = bc->bitmap; bc->bitmap = undo->u.bmpstate.bitmap; undo->u.bmpstate.bitmap = b; + sel = bc->selection; bc->selection = undo->u.bmpstate.selection; undo->u.bmpstate.selection = sel; + } break; + default: + GDrawIError( "Unknown undo type in BCUndoAct: %d", undo->undotype ); + break; + } +} + +void BCDoUndo(BDFChar *bc,FontView *fv) { + Undoes *undo = bc->undoes; + + if ( undo==NULL ) /* Shouldn't happen */ +return; + bc->undoes = undo->next; + undo->next = NULL; + BCUndoAct(bc,undo); + undo->next = bc->redoes; + bc->redoes = undo; + BCCharChangedUpdate(bc); +return; +} + +void BCDoRedo(BDFChar *bc,FontView *fv) { + Undoes *undo = bc->redoes; + + if ( undo==NULL ) /* Shouldn't happen */ +return; + bc->redoes = undo->next; + undo->next = NULL; + BCUndoAct(bc,undo); + undo->next = bc->undoes; + bc->undoes = undo; + BCCharChangedUpdate(bc); +return; +} + +/* **************************** Cut, Copy & Paste *************************** */ + +static Undoes copybuffer; + +static void CopyBufferFree(void) { + + switch( copybuffer.undotype ) { + case ut_state: case ut_statehint: + SplinePointListsFree(copybuffer.u.state.splines); + RefCharsFree(copybuffer.u.state.refs); + AnchorPointsFree(copybuffer.u.state.anchor); + if ( copybuffer.undotype==ut_statehint ) + UHintListFree(copybuffer.u.state.u.hints); + else + ImageListsFree(copybuffer.u.state.u.images); + break; + case ut_bitmapsel: + BDFFloatFree(copybuffer.u.bmpstate.selection); + break; + case ut_multiple: + UndoesFree( copybuffer.u.multiple.mult ); + break; + case ut_composit: + UndoesFree( copybuffer.u.composit.state ); + UndoesFree( copybuffer.u.composit.bitmaps ); + break; + } + memset(©buffer,'\0',sizeof(copybuffer)); + copybuffer.undotype = ut_none; +} + +static void CopyBufferFreeGrab(void) { + CopyBufferFree(); + if ( fv_list!=NULL && screen_display!=NULL ) + GDrawGrabSelection(fv_list->gw,sn_clipboard); /* Grab the selection to one of my windows, doesn't matter which, aren't going to export it, but just want to clear things out so no one else thinks they have the selection */ +} + +static void noop(void *_copybuffer) { +} + +static void *copybufferPt2str(void *_copybuffer,int32 *len) { + Undoes *cur = ©buffer; + SplinePoint *sp; + char buffer[100]; + + while ( cur ) { + switch ( cur->undotype ) { + case ut_multiple: + cur = cur->u.multiple.mult; + break; + case ut_composit: + cur = cur->u.composit.state; + break; + case ut_state: case ut_statehint: case ut_statename: + goto out; + default: + cur = NULL; + break; + } + } + out: + if ( cur==NULL || fv_list==NULL || + cur->u.state.splines==NULL || cur->u.state.refs!=NULL || + cur->u.state.splines->next!=NULL || + cur->u.state.splines->first->next!=NULL ) { + *len=0; +return( copy("")); + } + + sp = cur->u.state.splines->first; + sprintf(buffer,"(%g%s%g)", sp->me.x, coord_sep, sp->me.y ); + *len = strlen(buffer); +return( copy(buffer)); +} + +static void *copybufferName2str(void *_copybuffer,int32 *len) { + Undoes *cur = ©buffer; + + while ( cur ) { + switch ( cur->undotype ) { + case ut_multiple: + cur = cur->u.multiple.mult; + break; + case ut_composit: + cur = cur->u.composit.state; + break; + case ut_statename: + goto out; + default: + cur = NULL; + break; + } + } + out: + if ( cur==NULL || fv_list==NULL || cur->u.state.charname==NULL ) { + *len=0; +return( copy("")); + } + *len = strlen(cur->u.state.charname); +return( copy( cur->u.state.charname )); +} + +static void *copybufferPosSub2str(void *_copybuffer,int32 *len) { + Undoes *cur = ©buffer; + char *pt, *data; + int lcnt, size; + + while ( cur ) { + switch ( cur->undotype ) { + case ut_multiple: + cur = cur->u.multiple.mult; + break; + case ut_composit: + cur = cur->u.composit.state; + break; + case ut_possub: + goto out; + default: + cur = NULL; + break; + } + } + out: + if ( cur==NULL || fv_list==NULL || cur->u.possub.data==NULL ) { + *len=0; +return( copy("")); + } + for ( lcnt=size=0; cur->u.possub.data[lcnt]!=NULL; ++lcnt ) + size += strlen(cur->u.possub.data[lcnt])+1; + data = pt = galloc(size+1); + for ( lcnt=0; cur->u.possub.data[lcnt]!=NULL; ++lcnt ) { + strcpy(pt,cur->u.possub.data[lcnt]); + pt += strlen(cur->u.possub.data[lcnt]); + *pt++='\n'; + } + if ( lcnt!=0 ) + pt[-1] = '\0'; + *pt = '\0'; + + *len = strlen(data); +return( data ); +} + +static void *copybuffer2eps(void *_copybuffer,int32 *len) { + Undoes *cur = ©buffer; + SplineChar dummy; + FILE *eps; + char *ret; + int old_order2; + + while ( cur ) { + switch ( cur->undotype ) { + case ut_multiple: + cur = cur->u.multiple.mult; + break; + case ut_composit: + cur = cur->u.composit.state; + break; + case ut_state: case ut_statehint: + goto out; + default: + cur = NULL; + break; + } + } + out: + if ( cur==NULL || fv_list==NULL ) { + *len=0; +return( copy("")); + } + + memset(&dummy,0,sizeof(dummy)); + dummy.name = "dummy"; + dummy.parent = fv_list->sf; /* might not be the actual parent */ + dummy.layers[ly_fore].splines = cur->u.state.splines; + dummy.layers[ly_fore].refs = cur->u.state.refs; + + eps = tmpfile(); + if ( eps==NULL ) { + *len=0; +return( copy("")); + } + + old_order2 = dummy.parent->order2; + dummy.parent->order2 = cur->was_order2; + _ExportEPS(eps,&dummy); + dummy.parent->order2 = old_order2; + + fseek(eps,0,SEEK_END); + *len = ftell(eps); + ret = galloc(*len); + rewind(eps); + fread(ret,1,*len,eps); + fclose(eps); +return( ret ); +} + +static void XClipCheckEps(void) { + Undoes *cur = ©buffer; + + if ( fv_list==NULL ) +return; + if ( screen_display==NULL ) +return; + + while ( cur ) { + switch ( cur->undotype ) { + case ut_multiple: + cur = cur->u.multiple.mult; + break; + case ut_composit: + cur = cur->u.composit.state; + break; + case ut_state: case ut_statehint: case ut_statename: + GDrawAddSelectionType(fv_list->gw,sn_clipboard,"image/eps",©buffer,0,sizeof(char), + copybuffer2eps,noop); + /* If the selection is one point, then export the coordinates as a string */ + if ( cur->u.state.splines!=NULL && cur->u.state.refs==NULL && + cur->u.state.splines->next==NULL && + cur->u.state.splines->first->next==NULL ) + GDrawAddSelectionType(fv_list->gw,sn_clipboard,"STRING",©buffer,0,sizeof(char), + copybufferPt2str,noop); + else if ( cur->undotype==ut_statename ) + GDrawAddSelectionType(fv_list->gw,sn_clipboard,"STRING",©buffer,0,sizeof(char), + copybufferName2str,noop); + cur = NULL; + break; + case ut_possub: + GDrawAddSelectionType(fv_list->gw,sn_clipboard,"STRING",©buffer,0,sizeof(char), + copybufferPosSub2str,noop); + cur = NULL; + break; + default: + cur = NULL; + break; + } + } +} + +void ClipboardClear(void) { + CopyBufferFree(); +} + +enum undotype CopyUndoType(void) { + Undoes *paster; + + paster = ©buffer; + while ( paster->undotype==ut_composit || paster->undotype==ut_multiple ) { + if ( paster->undotype==ut_multiple ) + paster = paster->u.multiple.mult; + else if ( paster->u.composit.state==NULL ) +return( ut_none ); + else + paster = paster->u.composit.state; + } +return( paster->undotype ); +} + +int CopyContainsSomething(void) { + Undoes *cur = ©buffer; + if ( cur->undotype==ut_multiple ) + cur = cur->u.multiple.mult; + if ( cur->undotype==ut_composit ) +return( cur->u.composit.state!=NULL ); + +return( cur->undotype==ut_state || cur->undotype==ut_tstate || + cur->undotype==ut_statehint || cur->undotype==ut_statename || + cur->undotype==ut_width || cur->undotype==ut_vwidth || + cur->undotype==ut_lbearing || cur->undotype==ut_rbearing || + cur->undotype==ut_noop ); +} + +int CopyContainsBitmap(void) { + Undoes *cur = ©buffer; + if ( cur->undotype==ut_multiple ) + cur = cur->u.multiple.mult; + if ( cur->undotype==ut_composit ) +return( cur->u.composit.bitmaps!=NULL ); + +return( cur->undotype==ut_bitmapsel || cur->undotype==ut_noop ); +} + +RefChar *CopyContainsRef(SplineFont *sf) { + Undoes *cur = ©buffer; + if ( cur->undotype==ut_multiple ) { + cur = cur->u.multiple.mult; + if ( cur->next!=NULL ) +return( NULL ); + } + if ( cur->undotype==ut_composit ) + cur = cur->u.composit.state; + if ( cur==NULL || (cur->undotype!=ut_state && cur->undotype!=ut_tstate && + cur->undotype!=ut_statehint && cur->undotype!=ut_statename )) +return( NULL ); + if ( cur->u.state.splines!=NULL || cur->u.state.refs==NULL || + cur->u.state.refs->next != NULL ) +return( NULL ); + if ( sf!=cur->u.state.copied_from ) +return( NULL ); + +return( cur->u.state.refs ); +} + +char **CopyGetPosSubData(enum possub_type *type) { + Undoes *cur = ©buffer; + + if ( cur->undotype==ut_multiple ) + cur = cur->u.multiple.mult; + if ( cur->undotype!=ut_possub ) +return( NULL ); + *type = cur->u.possub.pst; +return( cur->u.possub.data ); +} + +int getAdobeEnc(char *name) { + extern char *AdobeStandardEncoding[256]; + int i; + + for ( i=0; i<256; ++i ) + if ( strcmp(name,AdobeStandardEncoding[i])==0 ) + break; + if ( i==256 ) i = -1; +return( i ); +} + +void CopyReference(SplineChar *sc) { + RefChar *ref; + + CopyBufferFreeGrab(); + + copybuffer.undotype = ut_state; + copybuffer.was_order2 = sc->parent->order2; + copybuffer.u.state.width = sc->width; + copybuffer.u.state.vwidth = sc->vwidth; + copybuffer.u.state.refs = ref = RefCharCreate(); + copybuffer.u.state.copied_from = sc->parent; + ref->unicode_enc = sc->unicodeenc; + ref->local_enc = sc->enc; + ref->adobe_enc = getAdobeEnc(sc->name); + ref->transform[0] = ref->transform[3] = 1.0; + + XClipCheckEps(); +} + +void CopySelected(CharView *cv) { + + CopyBufferFreeGrab(); + + copybuffer.undotype = ut_state; + copybuffer.was_order2 = cv->sc->parent->order2; + copybuffer.u.state.width = cv->sc->width; + copybuffer.u.state.vwidth = cv->sc->vwidth; + copybuffer.u.state.splines = SplinePointListCopySelected(cv->layerheads[cv->drawmode]->splines); + if ( cv->drawmode==dm_fore ) { + RefChar *refs, *new; + for ( refs = cv->layerheads[cv->drawmode]->refs; refs!=NULL; refs = refs->next ) if ( refs->selected ) { + new = RefCharCreate(); + *new = *refs; + new->layers[0].splines = NULL; + new->local_enc = new->sc->enc; + new->sc = NULL; + new->next = copybuffer.u.state.refs; + copybuffer.u.state.refs = new; + } + if ( cv->showanchor ) { + AnchorPoint *ap, *new; + for ( ap=cv->sc->anchor; ap!=NULL; ap=ap->next ) if ( ap->selected ) { + new = chunkalloc(sizeof(AnchorPoint)); + *new = *ap; + new->next = copybuffer.u.state.anchor; + copybuffer.u.state.anchor = new; + } + } + } +#ifndef FONTFORGE_CONFIG_TYPE3 + if ( cv->drawmode==dm_back ) +#endif + { + ImageList *imgs, *new; + for ( imgs = cv->layerheads[cv->drawmode]->images; imgs!=NULL; imgs = imgs->next ) if ( imgs->selected ) { + new = chunkalloc(sizeof(ImageList)); + *new = *imgs; + new->next = copybuffer.u.state.u.images; + copybuffer.u.state.u.images = new; + } + } + copybuffer.u.state.copied_from = cv->sc->parent; + + XClipCheckEps(); +} + +void CVCopyGridFit(CharView *cv) { + SplineChar *sc = cv->sc; + + if ( cv->gridfit==NULL ) +return; + + CopyBufferFreeGrab(); + + copybuffer.undotype = ut_state; + copybuffer.was_order2 = sc->parent->order2; + copybuffer.u.state.width = cv->ft_gridfitwidth; + copybuffer.u.state.vwidth = sc->vwidth; + copybuffer.u.state.splines = SplinePointListCopy(cv->gridfit); + copybuffer.u.state.copied_from = cv->sc->parent; + + XClipCheckEps(); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static Undoes *SCCopyAllLayer(SplineChar *sc,int full,int layer) { +#else +static Undoes *SCCopyAll(SplineChar *sc,int full) { + const int layer = ly_fore; +#endif + Undoes *cur; + RefChar *ref; + extern int copymetadata; + + cur = chunkalloc(sizeof(Undoes)); + if ( sc==NULL ) { + cur->undotype = ut_noop; + } else { + cur->was_order2 = sc->parent->order2; + cur->u.state.width = sc->width; + cur->u.state.vwidth = sc->vwidth; + if ( full ) { + cur->undotype = copymetadata ? ut_statename : ut_statehint; + cur->u.state.splines = SplinePointListCopy(sc->layers[layer].splines); + cur->u.state.refs = RefCharsCopyState(sc,layer); + cur->u.state.anchor = AnchorPointsCopy(sc->anchor); + cur->u.state.u.hints = UHintCopy(sc,true); + cur->u.state.unicodeenc = sc->unicodeenc; + if ( copymetadata && layer==ly_fore ) { + cur->u.state.charname = copy(sc->name); + cur->u.state.comment = u_copy(sc->comment); + cur->u.state.possub = PSTCopy(sc->possub,sc,sc->parent); + } else { + cur->u.state.charname = NULL; + cur->u.state.comment = NULL; + cur->u.state.possub = NULL; + } +#ifdef FONTFORGE_CONFIG_TYPE3 + cur->u.state.u.images = ImageListCopy(sc->layers[layer].images); + cur->u.state.fill_brush = sc->layers[layer].fill_brush; + cur->u.state.stroke_pen = sc->layers[layer].stroke_pen; + cur->u.state.dofill = sc->layers[layer].dofill; + cur->u.state.dostroke = sc->layers[layer].dostroke; + cur->u.state.fillfirst = sc->layers[layer].fillfirst; +#endif + } else { /* Or just make a reference */ + sc = SCDuplicate(sc); + cur->undotype = ut_state; + cur->u.state.refs = ref = RefCharCreate(); + ref->unicode_enc = sc->unicodeenc; + ref->local_enc = sc->enc; + ref->adobe_enc = getAdobeEnc(sc->name); + ref->transform[0] = ref->transform[3] = 1.0; + } + cur->u.state.copied_from = sc->parent; + } +return( cur ); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static Undoes *SCCopyAll(SplineChar *sc,int full) { + int layer; + Undoes *ret, *cur, *last=NULL; + + ret = chunkalloc(sizeof(Undoes)); + if ( sc==NULL ) { + ret->undotype = ut_noop; + } else if ( !full || !sc->parent->multilayer ) { /* Make a reference */ + chunkfree(ret,sizeof(Undoes)); + ret = SCCopyAllLayer(sc,full,ly_fore ); + } else { + ret->undotype = ut_layers; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + cur = SCCopyAllLayer(sc,true,layer); + if ( ret->u.multiple.mult==NULL ) + ret->u.multiple.mult = cur; + else + last->next = cur; + last = cur; + full = false; + } + } +return( ret ); +} +#endif + +void SCCopyWidth(SplineChar *sc,enum undotype ut) { + DBounds bb; + + CopyBufferFreeGrab(); + + copybuffer.undotype = ut; + switch ( ut ) { + case ut_width: + copybuffer.u.width = sc->width; + break; + case ut_vwidth: + copybuffer.u.width = sc->width; + break; + case ut_lbearing: + SplineCharFindBounds(sc,&bb); + copybuffer.u.lbearing = bb.minx; + break; + case ut_rbearing: + SplineCharFindBounds(sc,&bb); + copybuffer.u.rbearing = sc->width-bb.maxx; + break; + } +} + +void CopyWidth(CharView *cv,enum undotype ut) { + SCCopyWidth(cv->sc,ut); +} + +static SplineChar *FindCharacter(SplineFont *sf,RefChar *rf) { + extern char *AdobeStandardEncoding[256]; + int i; + + if ( rf->local_enccharcnt && sf->chars[rf->local_enc]!=NULL && + sf->chars[rf->local_enc]->unicodeenc == rf->unicode_enc ) +return( sf->chars[rf->local_enc] ); + + if ( rf->unicode_enc!=-1 ) { + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && sf->chars[i]->unicodeenc == rf->unicode_enc ) +return( sf->chars[i] ); + } + if ( rf->adobe_enc!=-1 ) { + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && + strcmp(sf->chars[i]->name,AdobeStandardEncoding[rf->adobe_enc])==0 ) +return( sf->chars[i] ); + } + if ( rf->local_enccharcnt ) +return( sf->chars[rf->local_enc] ); + +return( NULL ); +} + +int SCDependsOnSC(SplineChar *parent, SplineChar *child) { + RefChar *ref; + + if ( parent==child ) +return( true ); + for ( ref=parent->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( SCDependsOnSC(ref->sc,child)) +return( true ); + } +return( false ); +} + +static void PasteNonExistantRefCheck(SplineChar *sc,Undoes *paster,RefChar *ref, + int *refstate) { + FontView *fv; + SplineChar *rsc=NULL; + SplineSet *new, *spl; + int yes = 3; + + for ( fv = fv_list; fv!=NULL && fv->sf!=paster->u.state.copied_from; fv=fv->next ); + if ( fv!=NULL ) { + rsc = FindCharacter(fv->sf,ref); + if ( rsc==NULL ) + fv = NULL; + } + if ( fv==NULL ) { + if ( !(*refstate&0x4) ) { + static int buts[] = { _STR_DontWarnAgain, _STR_OK, 0 }; + char buf[10]; const char *name; + if ( ref->unicode_enc==-1 ) + name = ""; + else if ( ref->unicode_encunicode_enc]!=NULL ) + name = psunicodenames[ref->unicode_enc]; + else { + if ( ref->unicode_enc<0x10000 ) + sprintf( buf, "uni%04X", ref->unicode_enc ); + else + sprintf( buf, "u%04X", ref->unicode_enc ); + name = buf; + } + yes = GWidgetAskCenteredR(_STR_BadReference,buts,1,1,_STR_FontNoRefNoOrig,name,sc->name); + if ( yes==0 ) + *refstate |= 0x4; + } + } else { + if ( !(*refstate&0x3) ) { + static int buts[] = { _STR_Yes, _STR_YesToAll, _STR_NoToAll, _STR_No, 0 }; + GProgressPauseTimer(); + yes = GWidgetAskCenteredR(_STR_BadReference,buts,0,3,_STR_FontNoRef,rsc->name,sc->name); + GProgressResumeTimer(); + if ( yes==1 ) + *refstate |= 1; + else if ( yes==2 ) + *refstate |= 2; + } + if ( (*refstate&1) || yes<=1 ) { + new = SplinePointListTransform(SplinePointListCopy(rsc->layers[ly_fore].splines),ref->transform,true); + SplinePointListSelect(new,true); + if ( new!=NULL ) { + for ( spl = new; spl->next!=NULL; spl = spl->next ); + spl->next = sc->layers[ly_fore].splines; + sc->layers[ly_fore].splines = new; + } + } + } +} + +static void SCCheckXClipboard(GWindow awindow,SplineChar *sc,int layer,int doclear) { + int type, len; + char *paste; + FILE *temp; + GImage *image; + + if ( screen_display==NULL ) +return; + type = 0; +#ifndef _NO_LIBPNG + if ( GDrawSelectionHasType(awindow,sn_clipboard,"image/png") ) + type = 1; + else +#endif + if ( GDrawSelectionHasType(awindow,sn_clipboard,"image/bmp") ) + type = 2; + else if ( GDrawSelectionHasType(awindow,sn_clipboard,"image/eps") ) + type = 3; + + if ( type==0 ) +return; + + paste = GDrawRequestSelection(awindow,sn_clipboard,type==1?"image/png": + type==2?"image/bmp":"image/eps",&len); + if ( paste==NULL ) +return; + + temp = tmpfile(); + if ( temp!=NULL ) { + fwrite(paste,1,len,temp); + rewind(temp); + if ( type==3 ) { + SCImportPSFile(sc,layer,temp,doclear); + } else { +#ifndef _NO_LIBPNG + if ( type==1 ) + image = GImageRead_Png(temp); + else +#endif + image = GImageRead_Bmp(temp); + SCAddScaleImage(sc,image,doclear,layer); + } + fclose(temp); + } + free(paste); +} + +/* When we paste a composit character from one font to another the references */ +/* refer to the glyphs in the new font. So the width should refer to the */ +/* width of the glyphs in the new font as well */ +static int PasteGuessCorrectWidth(SplineFont *sf,Undoes *paster,int *vwidth) { + RefChar *ref, *base=NULL; + + if ( paster->u.state.copied_from==NULL || + paster->u.state.vwidth == paster->u.state.copied_from->ascent+paster->u.state.copied_from->descent ) + *vwidth = sf->ascent+sf->descent; + for ( ref=paster->u.state.refs; ref!=NULL; ref=ref->next ) { + if ( ref->unicode_enc!=-1 && ref->unicode_enc<0x10000 && + isalpha(ref->unicode_enc) && !iscombining(ref->unicode_enc) && + ref->transform[0]==1 && ref->transform[3]==1 && + ref->transform[1]==0 && ref->transform[2]==0 && + ref->transform[4]==0 && ref->transform[5]==0 ) { + if ( base!=NULL ) { + base= NULL; + break; + } + base = ref; + } + } + if ( base!=NULL ) { + SplineChar *sc = FindCharacter(sf,base); + *vwidth = sc->vwidth; +return( sc->width ); + } + *vwidth = paster->u.state.vwidth; +return( paster->u.state.width ); +} + +static double PasteFigureScale(SplineFont *newsf,SplineFont *oldsf) { + FontView *fv; + + if ( newsf==oldsf ) +return( 1.0 ); + for ( fv = fv_list; fv!=NULL && fv->sf!=oldsf; fv=fv->next ); + if ( fv==NULL ) /* Font we copied from has been closed */ +return( 1.0 ); + +return( (newsf->ascent+newsf->descent) / (double) (oldsf->ascent+oldsf->descent) ); +} + +static int anchor_lost_warning = false; + +static void APMerge(SplineChar *sc,AnchorPoint *anchor) { + AnchorPoint *ap, *prev, *next, *test; + AnchorClass *ac; + + if ( anchor==NULL ) +return; + anchor = AnchorPointsCopy(anchor); + /* If we pasted from one font to another, the anchor class list will be */ + /* different. */ + for ( ac = sc->parent->anchor; ac!=NULL && ac!=anchor->anchor; ac=ac->next ); + if ( ac==NULL ) { /* Into a different font. See if we can find a class with same name in new font */ + prev = NULL; + for ( ap = anchor; ap!=NULL; ap=next ) { + next = ap->next; + for ( ac = sc->parent->anchor; ac!=NULL && u_strcmp(ac->name,ap->anchor->name)!=0; ac = ac->next ); + if ( ac!=NULL ) { + ap->anchor = ac; + prev = ap; + } else { + if ( prev==NULL ) + anchor = next; + else + prev->next = next; + chunkfree(ap,sizeof(AnchorPoint)); + anchor_lost_warning = true; + } + } + if ( anchor_lost_warning ) + GWidgetErrorR(_STR_AnchorLost,_STR_AnchorLostPaste); + if ( anchor==NULL ) +return; + } + if ( sc->anchor==NULL ) { + sc->anchor = anchor; +return; + } + + prev = NULL; + for ( ap=anchor; ap!=NULL; ap=next ) { + next = ap->next; + for ( test=sc->anchor; test!=NULL; test=test->next ) + if ( test->anchor==ap->anchor ) { + if (( test->type==at_centry && ap->type==at_cexit) || + (test->type==at_cexit && ap->type==at_centry)) + /* It's ok */; + else if ( test->type!=at_baselig || ap->type!=at_baselig || + test->lig_index==ap->lig_index ) + break; + } + if ( test!=NULL ) { + GWidgetErrorR(_STR_DupAnchor,_STR_DupAnchorIn,test->anchor->name,sc->name); + if ( prev==NULL ) + anchor = next; + else + prev->next = next; + chunkfree(ap,sizeof(AnchorPoint)); + } else + prev = ap; + } + if ( prev!=NULL ) { + prev->next = sc->anchor; + sc->anchor = anchor; + } +} + +/* when pasting from the fontview we do a clear first */ +#ifdef FONTFORGE_CONFIG_TYPE3 +static void _PasteToSC(SplineChar *sc,Undoes *paster,FontView *fv,int doclear, + int layer) { +#else +static void PasteToSC(SplineChar *sc,Undoes *paster,FontView *fv,int doclear) { + const int layer = ly_fore; +#endif + DBounds bb; + real transform[6]; + int width, vwidth; + FontView *fvs; + + switch ( paster->undotype ) { + case ut_noop: + break; + case ut_state: case ut_statehint: case ut_statename: + if ( paster->u.state.splines!=NULL || paster->u.state.refs!=NULL ) + sc->parent->onlybitmaps = false; + SCPreserveState(sc,paster->undotype==ut_statehint); + width = paster->u.state.width; + vwidth = paster->u.state.vwidth; + if ( doclear && paster->u.state.copied_from!=sc->parent && + paster->u.state.splines==NULL && + paster->u.state.refs!=NULL ) + width = PasteGuessCorrectWidth(sc->parent,paster,&vwidth); + if ( !sc->parent->onlybitmaps ) + SCSynchronizeWidth(sc,width,sc->width,fv); + sc->vwidth = vwidth; + if ( doclear ) { + SplinePointListsFree(sc->layers[layer].splines); + sc->layers[layer].splines = NULL; + ImageListsFree(sc->layers[layer].images); + sc->layers[layer].images = NULL; + SCRemoveLayerDependents(sc,layer); + AnchorPointsFree(sc->anchor); + sc->anchor = NULL; + } +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( layer>=ly_fore && sc->layers[layer].splines==NULL && + sc->layers[layer].refs==NULL && sc->layers[layer].images==NULL && + sc->parent->multilayer ) { + /* pasting into an empty layer sets the fill/stroke */ + sc->layers[layer].fill_brush = paster->u.state.fill_brush; + sc->layers[layer].stroke_pen = paster->u.state.stroke_pen; + sc->layers[layer].dofill = paster->u.state.dofill; + sc->layers[layer].dostroke = paster->u.state.dostroke; + sc->layers[layer].fillfirst = paster->u.state.fillfirst; + } +#endif + if ( paster->u.state.splines!=NULL ) { + SplinePointList *temp = SplinePointListCopy(paster->u.state.splines); + if ( paster->was_order2 != sc->parent->order2 ) + temp = SplineSetsConvertOrder(temp,sc->parent->order2); + if ( sc->layers[layer].splines!=NULL ) { + SplinePointList *e = sc->layers[layer].splines; + while ( e->next!=NULL ) e = e->next; + e->next = temp; + } else + sc->layers[layer].splines = temp; + } + if ( !sc->searcherdummy ) + APMerge(sc,paster->u.state.anchor); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( paster->u.state.u.images!=NULL && sc->parent->multilayer ) { + ImageList *new, *cimg; + for ( cimg = paster->u.state.u.images; cimg!=NULL; cimg=cimg->next ) { + new = galloc(sizeof(ImageList)); + *new = *cimg; + new->selected = true; + new->next = sc->layers[layer].images; + sc->layers[layer].images = new; + } + SCOutOfDateBackground(sc); + } +#else + /* Ignore any images, can't be in foreground level */ + /* but might be hints */ +#endif + if ( paster->undotype==ut_statehint || paster->undotype==ut_statename ) + if ( doclear ) /* Hints aren't meaningful unless we've cleared first */ + ExtractHints(sc,paster->u.state.u.hints,true); + if ( paster->undotype==ut_statename ) { + SCSetMetaData(sc,paster->u.state.charname, + paster->u.state.unicodeenc==0xffff?-1:paster->u.state.unicodeenc, + paster->u.state.comment); + PSTFree(sc->possub); + for ( fvs = fv_list; fvs!=NULL && fvs->sf!=paster->u.state.copied_from; fvs=fvs->next ); + sc->possub = PSTCopy(paster->u.state.possub,sc,fvs==NULL?NULL:fvs->sf); + } + if ( paster->u.state.refs!=NULL ) { + RefChar *new, *refs; + SplineChar *rsc; + double scale = PasteFigureScale(sc->parent,paster->u.state.copied_from); + for ( refs = paster->u.state.refs; refs!=NULL; refs=refs->next ) { + if ( sc->searcherdummy ) + rsc = FindCharacter(sc->views->searcher->fv->sf,refs); + else + rsc = FindCharacter(sc->parent,refs); + if ( rsc!=NULL && SCDependsOnSC(rsc,sc)) + GWidgetErrorR(_STR_SelfRef,_STR_AttemptSelfRef); + else if ( rsc!=NULL ) { + new = RefCharCreate(); + *new = *refs; + new->transform[4] *= scale; new->transform[5] *= scale; + new->layers[0].splines = NULL; + new->sc = rsc; + new->next = sc->layers[layer].refs; + sc->layers[layer].refs = new; + SCReinstanciateRefChar(sc,new); + SCMakeDependent(sc,rsc); + } else { + int refstate = fv->refstate; + PasteNonExistantRefCheck(sc,paster,refs,&refstate); + fv->refstate = refstate; + } + } + } + SCCharChangedUpdate(sc); + break; + case ut_possub: + SCAppendPosSub(sc,paster->u.possub.pst,paster->u.possub.data); + break; + case ut_width: + SCPreserveWidth(sc); + SCSynchronizeWidth(sc,paster->u.width,sc->width,fv); + SCCharChangedUpdate(sc); + break; + case ut_vwidth: + if ( !sc->parent->hasvmetrics ) + GWidgetErrorR(_STR_NoVerticalMetrics,_STR_FontNoVerticalMetrics); + else { + SCPreserveVWidth(sc); + sc->vwidth = paster->u.width; + SCCharChangedUpdate(sc); + } + break; + case ut_rbearing: + SCPreserveWidth(sc); + SplineCharFindBounds(sc,&bb); + SCSynchronizeWidth(sc,bb.maxx + paster->u.rbearing,sc->width,fv); + SCCharChangedUpdate(sc); + break; + case ut_lbearing: + SplineCharFindBounds(sc,&bb); + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0; + transform[4] = paster->u.lbearing-bb.minx; + if ( transform[4]!=0 ) + FVTrans(fv,sc,transform,NULL,false); + /* FVTrans will preserve the state and update the chars */ + break; + } +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static void PasteToSC(SplineChar *sc,Undoes *paster,FontView *fv,int doclear) { + if ( paster->undotype==ut_layers && sc->parent->multilayer ) { + int lc, start, layer; + Undoes *pl; + for ( lc=0, pl = paster->u.multiple.mult; pl!=NULL; pl=pl->next, ++lc ); + if ( doclear ) { + start = ly_fore; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + SplinePointListsFree(sc->layers[layer].splines); + sc->layers[layer].splines = NULL; + ImageListsFree(sc->layers[layer].images); + sc->layers[layer].images = NULL; + SCRemoveLayerDependents(sc,layer); + } + } else + start = sc->layer_cnt; + if ( start+lc > sc->layer_cnt ) { + sc->layers = grealloc(sc->layers,(start+lc)*sizeof(Layer)); + for ( layer = sc->layer_cnt; layerlayers[layer]); + sc->layer_cnt = start+lc; + } + for ( lc=0, pl = paster->u.multiple.mult; pl!=NULL; pl=pl->next, ++lc ); + _PasteToSC(sc,pl,fv,doclear,start+lc); + SCMoreLayers(sc); + } else if ( paster->undotype==ut_layers ) { + Undoes *pl; + for ( pl = paster->u.multiple.mult; pl!=NULL; pl=pl->next ); + _PasteToSC(sc,pl,fv,doclear,ly_fore); + } else + _PasteToSC(sc,paster,fv,doclear,ly_fore); +} +#endif + +static void _PasteToCV(CharView *cv,SplineChar *cvsc,Undoes *paster) { + int refstate = 0; + DBounds bb; + real transform[6]; + + if ( copybuffer.undotype == ut_none ) { + SCCheckXClipboard(cv->gw,cvsc,cv->drawmode,false); +return; + } + + anchor_lost_warning = false; + + cv->lastselpt = NULL; + switch ( paster->undotype ) { + case ut_noop: + break; + case ut_state: case ut_statehint: case ut_statename: + if ( cv->drawmode==dm_fore && cvsc->layers[ly_fore].splines==NULL && cvsc->layers[ly_fore].refs==NULL ) { + SCSynchronizeWidth(cvsc,paster->u.state.width,cvsc->width,NULL); + cvsc->vwidth = paster->u.state.vwidth; + } +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( cv->drawmode==dm_fore && cv->layerheads[dm_fore]->splines==NULL && + cv->layerheads[dm_fore]->refs==NULL && cv->layerheads[dm_fore]->images==NULL && + cvsc->parent->multilayer ) { + /* pasting into an empty layer sets the fill/stroke */ + cv->layerheads[dm_fore]->fill_brush = paster->u.state.fill_brush; + cv->layerheads[dm_fore]->stroke_pen = paster->u.state.stroke_pen; + cv->layerheads[dm_fore]->dofill = paster->u.state.dofill; + cv->layerheads[dm_fore]->dostroke = paster->u.state.dostroke; + cv->layerheads[dm_fore]->fillfirst = paster->u.state.fillfirst; + } +#endif + if ( paster->u.state.splines!=NULL ) { + SplinePointList *spl, *new = SplinePointListCopy(paster->u.state.splines); + if ( paster->was_order2 != cvsc->parent->order2 ) + new = SplineSetsConvertOrder(new,cvsc->parent->order2 ); + SplinePointListSelect(new,true); + for ( spl = new; spl->next!=NULL; spl = spl->next ); + spl->next = cv->layerheads[cv->drawmode]->splines; + cv->layerheads[cv->drawmode]->splines = new; + } + if ( paster->undotype==ut_state && paster->u.state.u.images!=NULL ) { +#ifdef FONTFORGE_CONFIG_TYPE3 + int dm = cvsc->parent->multilayer ? cv->drawmode : dm_back; +#else + const int dm = dm_back; + /* Images can only be pasted into background, so do that */ + /* even if we aren't in background mode */ +#endif + ImageList *new, *cimg; + for ( cimg = paster->u.state.u.images; cimg!=NULL; cimg=cimg->next ) { + new = galloc(sizeof(ImageList)); + *new = *cimg; + new->selected = true; + new->next = cv->layerheads[dm]->images; + cv->layerheads[dm]->images = new; + } + SCOutOfDateBackground(cvsc); + } else if ( paster->undotype==ut_statehint && cv->searcher==NULL ) + ExtractHints(cvsc,paster->u.state.u.hints,true); + if ( paster->u.state.anchor!=NULL && cv->drawmode==dm_fore && !cvsc->searcherdummy ) + APMerge(cvsc,paster->u.state.anchor); + if ( paster->u.state.refs!=NULL && cv->drawmode==dm_fore ) { + RefChar *new, *refs; + SplineChar *sc; + for ( refs = paster->u.state.refs; refs!=NULL; refs=refs->next ) { + if ( cv->searcher!=NULL ) + sc = FindCharacter(cv->searcher->fv->sf,refs); + else + sc = FindCharacter(cvsc->parent,refs); + if ( sc!=NULL && SCDependsOnSC(sc,cvsc)) + GWidgetErrorR(_STR_SelfRef,_STR_AttemptSelfRef); + else if ( sc!=NULL ) { + new = RefCharCreate(); + *new = *refs; + new->layers[0].splines = NULL; + new->sc = sc; + new->selected = true; + new->next = cvsc->layers[ly_fore].refs; + cvsc->layers[ly_fore].refs = new; + SCReinstanciateRefChar(cvsc,new); + SCMakeDependent(cvsc,sc); + } else { + PasteNonExistantRefCheck(cvsc,paster,refs,&refstate); + } + } + } else if ( paster->u.state.refs!=NULL && cv->drawmode==dm_back ) { + /* Paste the CONTENTS of the referred character into this one */ + /* (background contents I think) */ + RefChar *refs; + SplineChar *sc; + SplinePointList *new, *spl; + for ( refs = paster->u.state.refs; refs!=NULL; refs=refs->next ) { + if ( cv->searcher!=NULL ) + sc = FindCharacter(cv->searcher->fv->sf,refs); + else + sc = FindCharacter(cvsc->parent,refs); + if ( sc!=NULL ) { + new = SplinePointListTransform(SplinePointListCopy(sc->layers[ly_back].splines),refs->transform,true); + SplinePointListSelect(new,true); + if ( new!=NULL ) { + for ( spl = new; spl->next!=NULL; spl = spl->next ); + spl->next = cvsc->layers[ly_back].splines; + cvsc->layers[ly_back].splines = new; + } + } + } + } + if ( paster->undotype==ut_statename ) { + SCSetMetaData(cvsc,paster->u.state.charname, + paster->u.state.unicodeenc==0xffff?-1:paster->u.state.unicodeenc, + paster->u.state.comment); + PSTFree(cvsc->possub); + cvsc->possub = paster->u.state.possub; + } + break; + case ut_possub: + SCAppendPosSub(cvsc,paster->u.possub.pst,paster->u.possub.data); + break; + case ut_width: + SCSynchronizeWidth(cvsc,paster->u.width,cvsc->width,NULL); + break; + case ut_vwidth: + if ( !cvsc->parent->hasvmetrics ) + GWidgetErrorR(_STR_NoVerticalMetrics,_STR_FontNoVerticalMetrics); + else + cvsc->vwidth = paster->u.state.vwidth; + break; + case ut_rbearing: + SplineCharFindBounds(cvsc,&bb); + SCSynchronizeWidth(cvsc,bb.maxx + paster->u.rbearing,cvsc->width,cv->fv); + break; + case ut_lbearing: + SplineCharFindBounds(cvsc,&bb); + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0; + transform[4] = paster->u.lbearing-bb.minx; + if ( transform[4]!=0 ) + FVTrans(cv->fv,cvsc,transform,NULL,false); + /* FVTrans will preserve the state and update the chars */ + /* CVPaste depends on this behavior */ + break; + case ut_composit: + if ( paster->u.composit.state!=NULL ) + _PasteToCV(cv,cvsc,paster->u.composit.state); + break; + case ut_multiple: case ut_layers: + _PasteToCV(cv,cvsc,paster->u.multiple.mult); + break; + } +} + +void PasteToCV(CharView *cv) { + _PasteToCV(cv,cv->sc,©buffer); + if ( cv->sc->blended && cv->drawmode==dm_fore ) { + int j, enc = cv->sc->enc; + MMSet *mm = cv->sc->parent->mm; + for ( j=0; jinstance_count; ++j ) + _PasteToCV(cv,mm->instances[j]->chars[enc],©buffer); + } +} + + +SplineSet *ClipBoardToSplineSet(void) { + Undoes *paster = ©buffer; + + while ( paster!=NULL ) { + switch ( paster->undotype ) { + default: + case ut_noop: case ut_none: +return( NULL ); + break; + case ut_state: case ut_statehint: case ut_statename: + if ( paster->u.state.refs!=NULL ) +return( NULL ); + +return( paster->u.state.splines ); + break; + case ut_width: +return( NULL ); + case ut_vwidth: +return( NULL ); + case ut_rbearing: +return( NULL ); + case ut_lbearing: +return( NULL ); + case ut_composit: + paster = paster->u.composit.state; + break; + case ut_multiple: + paster = paster->u.multiple.mult; + break; + } + } +return( NULL ); +} + +void BCCopySelected(BDFChar *bc,int pixelsize,int depth) { + + CopyBufferFreeGrab(); + + memset(©buffer,'\0',sizeof(copybuffer)); + copybuffer.undotype = ut_bitmapsel; + if ( bc->selection!=NULL ) + copybuffer.u.bmpstate.selection = BDFFloatCopy(bc->selection); + else + copybuffer.u.bmpstate.selection = BDFFloatCreate(bc,bc->xmin,bc->xmax, + bc->ymin,bc->ymax, false); + copybuffer.u.bmpstate.pixelsize = pixelsize; + copybuffer.u.bmpstate.depth = depth; +} + +static Undoes *BCCopyAll(BDFChar *bc,int pixelsize, int depth) { + Undoes *cur; + + cur = chunkalloc(sizeof(Undoes)); + if ( bc==NULL ) + cur->undotype = ut_noop; + else { + cur->undotype = ut_bitmap; + cur->u.bmpstate.width = bc->width; + cur->u.bmpstate.xmin = bc->xmin; + cur->u.bmpstate.xmax = bc->xmax; + cur->u.bmpstate.ymin = bc->ymin; + cur->u.bmpstate.ymax = bc->ymax; + cur->u.bmpstate.bytes_per_line = bc->bytes_per_line; + cur->u.bmpstate.bitmap = bmpcopy(bc->bitmap,bc->bytes_per_line, + bc->ymax-bc->ymin+1); + cur->u.bmpstate.selection = BDFFloatCopy(bc->selection); + } + cur->u.bmpstate.pixelsize = pixelsize; + cur->u.bmpstate.depth = depth; +return( cur ); +} + +static void _PasteToBC(BDFChar *bc,int pixelsize, int depth, Undoes *paster, int clearfirst, FontView *fv) { + BDFFloat temp; + + switch ( paster->undotype ) { + case ut_noop: + break; + case ut_bitmapsel: + BCPreserveState(bc); + BCFlattenFloat(bc); + if ( clearfirst ) + memset(bc->bitmap,'\0',bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + bc->selection = BDFFloatConvert(paster->u.bmpstate.selection,depth,paster->u.bmpstate.depth); + BCCharChangedUpdate(bc); + break; + case ut_bitmap: + BCPreserveState(bc); + BCFlattenFloat(bc); + memset(bc->bitmap,0,bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + temp.xmin = paster->u.bmpstate.xmin; temp.xmax = paster->u.bmpstate.xmax; + temp.ymin = paster->u.bmpstate.ymin; temp.ymax = paster->u.bmpstate.ymax; + temp.bytes_per_line = paster->u.bmpstate.bytes_per_line; temp.byte_data = depth!=1; + temp.bitmap = paster->u.bmpstate.bitmap; + bc->selection = BDFFloatConvert(&temp,depth,paster->u.bmpstate.depth); + BCFlattenFloat(bc); + BCCompressBitmap(bc); + bc->selection = BDFFloatConvert(paster->u.bmpstate.selection,depth,paster->u.bmpstate.depth); + bc->width = paster->u.bmpstate.width; + BCCharChangedUpdate(bc); + break; + case ut_composit: + /* if there's only one bitmap and no outline state (so we only copied a bitmap) */ + /* then paste that thing with no questions. Otherwise search for a */ + /* bitmap with the right pixel size. If we find it, paste it, else */ + /* noop */ + if ( paster->u.composit.bitmaps==NULL ) + /* Nothing to be done */; + else if ( paster->u.composit.state==NULL && paster->u.composit.bitmaps->next==NULL ) + _PasteToBC(bc,pixelsize,depth,paster->u.composit.bitmaps,clearfirst,fv); + else { + Undoes *b; + for ( b = paster->u.composit.bitmaps; + b!=NULL && b->u.bmpstate.pixelsize!=pixelsize; + b = b->next ); + if ( b!=NULL ) + _PasteToBC(bc,pixelsize,depth,paster->u.composit.bitmaps,clearfirst,fv); + } + break; + case ut_multiple: + _PasteToBC(bc,pixelsize,depth,paster->u.multiple.mult,clearfirst,fv); + break; + } +} + +void PasteToBC(BDFChar *bc,int pixelsize,int depth,FontView *fv) { + _PasteToBC(bc,pixelsize,depth,©buffer,false,fv); +} + +void FVCopyWidth(FontView *fv,enum undotype ut) { + Undoes *head=NULL, *last=NULL, *cur; + int i, any=false; + SplineChar *sc; + DBounds bb; + + CopyBufferFreeGrab(); + + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) { + any = true; + cur = chunkalloc(sizeof(Undoes)); + cur->undotype = ut; + if ( (sc=fv->sf->chars[i])!=NULL ) { + switch ( ut ) { + case ut_width: + cur->u.width = sc->width; + break; + case ut_vwidth: + cur->u.width = sc->width; + break; + case ut_lbearing: + SplineCharFindBounds(sc,&bb); + cur->u.lbearing = bb.minx; + break; + case ut_rbearing: + SplineCharFindBounds(sc,&bb); + cur->u.rbearing = sc->width-bb.maxx; + break; + } + } else + cur->undotype = ut_noop; + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + copybuffer.undotype = ut_multiple; + copybuffer.u.multiple.mult = head; + if ( !any ) + fprintf( stderr, "No selection\n" ); +} + +void FVCopy(FontView *fv, int fullcopy) { + int i, any = false; + BDFFont *bdf; + Undoes *head=NULL, *last=NULL, *cur; + Undoes *bhead=NULL, *blast=NULL, *bcur; + Undoes *state; + extern int onlycopydisplayed; + + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) { + any = true; + if ( onlycopydisplayed && fv->filled==fv->show ) { + cur = SCCopyAll(fv->sf->chars[i],fullcopy); + } else if ( onlycopydisplayed ) { + cur = BCCopyAll(fv->show->chars[i],fv->show->pixelsize,BDFDepth(fv->show)); + } else { + state = SCCopyAll(fv->sf->chars[i],fullcopy); + bhead = NULL; + for ( bdf=fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + bcur = BCCopyAll(bdf->chars[i],bdf->pixelsize,BDFDepth(bdf)); + if ( bhead==NULL ) + bhead = bcur; + else + blast->next = bcur; + blast = bcur; + } + if ( bhead!=NULL || state!=NULL ) { + cur = chunkalloc(sizeof(Undoes)); + cur->undotype = ut_composit; + cur->u.composit.state = state; + cur->u.composit.bitmaps = bhead; + } else + cur = NULL; + } + if ( cur!=NULL ) { + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + } + + if ( !any ) + fprintf( stderr, "No selection\n" ); + + if ( head==NULL ) +return; + CopyBufferFreeGrab(); + copybuffer.undotype = ut_multiple; + copybuffer.u.multiple.mult = head; + + XClipCheckEps(); +} + +void MVCopyChar(MetricsView *mv, SplineChar *sc, int fullcopy) { + BDFFont *bdf; + Undoes *cur=NULL; + Undoes *bhead=NULL, *blast=NULL, *bcur; + Undoes *state; + extern int onlycopydisplayed; + + if ( onlycopydisplayed && mv->bdf==NULL ) { + cur = SCCopyAll(sc,fullcopy); + } else if ( onlycopydisplayed ) { + cur = BCCopyAll(mv->bdf->chars[sc->enc],mv->bdf->pixelsize,BDFDepth(mv->bdf)); + } else { + state = SCCopyAll(sc,fullcopy); + bhead = NULL; + for ( bdf=mv->fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + bcur = BCCopyAll(bdf->chars[sc->enc],bdf->pixelsize,BDFDepth(bdf)); + if ( bhead==NULL ) + bhead = bcur; + else + blast->next = bcur; + blast = bcur; + } + if ( bhead!=NULL || state!=NULL ) { + cur = chunkalloc(sizeof(Undoes)); + cur->undotype = ut_composit; + cur->u.composit.state = state; + cur->u.composit.bitmaps = bhead; + } else + cur = NULL; + } + + if ( cur==NULL ) +return; + CopyBufferFreeGrab(); + copybuffer.undotype = ut_multiple; + copybuffer.u.multiple.mult = cur; + + XClipCheckEps(); +} + +static BDFFont *BitmapCreateCheck(FontView *fv,int *yestoall, int first, int pixelsize, int depth) { + int yes = 0; + BDFFont *bdf = NULL; + + if ( *yestoall>0 && first ) { + static int buts[] = { _STR_Yes, _STR_YesToAll, _STR_NoToAll, _STR_No, 0 }; + char buf[20]; unichar_t ubuf[400]; + if ( depth!=1 ) + sprintf( buf, "%d@%d", pixelsize, depth ); + else + sprintf( buf, "%d", pixelsize ); + u_strcpy(ubuf,GStringGetResource(_STR_ClipContainsPre,NULL)); + uc_strcat(ubuf,buf); + u_strcat(ubuf,GStringGetResource(_STR_ClipContainsPost,NULL)); + yes = GWidgetAskCenteredR_(_STR_BitmapPaste,buts,0,3,ubuf); + if ( yes==1 ) + *yestoall = true; + else if ( yes==2 ) + *yestoall = -1; + else + yes= yes!=3; + } + if ( yes==1 || *yestoall ) { + void *freetypecontext = FreeTypeFontContext(fv->sf,NULL,NULL); + if ( freetypecontext ) + bdf = SplineFontFreeTypeRasterize(freetypecontext,pixelsize,depth); + else + bdf = SplineFontAntiAlias(fv->sf,pixelsize,1<<(depth/2)); + bdf->next = fv->sf->bitmaps; + fv->sf->bitmaps = bdf; + fv->sf->changed = true; + SFOrderBitmapList(fv->sf); + } +return( bdf ); +} + +void PasteIntoFV(FontView *fv,int doclear) { + Undoes *cur=NULL, *bmp; + BDFFont *bdf; + int i, j, cnt=0; + int yestoall=0, first=true; + uint8 *oldsel = fv->selected; + extern int onlycopydisplayed; + SplineFont *sf = fv->sf, *origsf = sf; + MMSet *mm = sf->mm; + + fv->refstate = 0; + + cur = ©buffer; + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] ) + ++cnt; + if ( cnt==0 ) { + fprintf( stderr, "No Selection\n" ); +return; + } + + if ( copybuffer.undotype == ut_none ) { + j = -1; + forever { + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] ) + SCCheckXClipboard(fv->gw,SFMakeChar(sf,i),dm_fore,doclear); + ++j; + if ( mm==NULL || mm->normal!=origsf || j>=mm->instance_count ) + break; + sf = mm->instances[j]; + } +return; + } + + /* If they select exactly one character but there are more things in the */ + /* copy buffer, then temporarily change the selection so that everything*/ + /* in the copy buffer gets pasted (into chars immediately following sele*/ + /* cted one (unless we run out of chars...)) */ + if ( cnt==1 && cur->undotype==ut_multiple && cur->u.multiple.mult->next!=NULL ) { + Undoes *tot; int j; + for ( cnt=0, tot=cur->u.multiple.mult; tot!=NULL; ++cnt, tot=tot->next ); + fv->selected = galloc(sf->charcnt); + memcpy(fv->selected,oldsel,sf->charcnt); + for ( i=0; icharcnt && !fv->selected[i]; ++i ); + for ( j=0; jcharcnt; ++j ) + fv->selected[i+j] = 1; + cnt = j; + } + + anchor_lost_warning = false; + GProgressStartIndicatorR(10,_STR_Pasting,_STR_Pasting,0,cnt,1); + + if ( cur->undotype==ut_multiple ) + cur = cur->u.multiple.mult; + /* This little gem of code is to keep us from throwing out forward */ + /* references. Say we are pasting into both "i" and dotlessi (and */ + /* dotlessi isn't defined yet) without this the paste to "i" will */ + /* search for dotlessi, not find it and ignore the reference */ + if ( cur->undotype==ut_state || cur->undotype==ut_statehint || cur->undotype==ut_statename || + (cur->undotype==ut_composit && cur->u.composit.state!=NULL)) { + for ( i=0; icharcnt; ++i ) + if ( fv->selected[i] && sf->chars[i]==NULL ) + SFMakeChar(sf,i); + } + cur = NULL; + + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] ) { + j=-1; + if ( cur==NULL ) { + cur = ©buffer; + if ( cur->undotype==ut_multiple ) + cur = cur->u.multiple.mult; + } + forever { + switch ( cur->undotype ) { + case ut_noop: + break; + case ut_state: case ut_width: case ut_vwidth: + case ut_lbearing: case ut_rbearing: case ut_possub: + case ut_statehint: case ut_statename: + case ut_layers: + if ( !sf->hasvmetrics && cur->undotype==ut_vwidth) { + GWidgetErrorR(_STR_NoVerticalMetrics,_STR_FontNoVerticalMetrics); + goto err; + } + PasteToSC(SFMakeChar(sf,i),cur,fv,doclear); + break; + case ut_bitmapsel: case ut_bitmap: + if ( onlycopydisplayed && fv->show!=fv->filled ) + _PasteToBC(BDFMakeChar(fv->show,i),fv->show->pixelsize,BDFDepth(fv->show),cur,doclear,fv); + else { + for ( bdf=sf->bitmaps; bdf!=NULL && (bdf->pixelsize!=cur->u.bmpstate.pixelsize || BDFDepth(bdf)!=cur->u.bmpstate.depth); bdf=bdf->next ); + if ( bdf==NULL ) { + bdf = BitmapCreateCheck(fv,&yestoall,first,cur->u.bmpstate.pixelsize,cur->u.bmpstate.depth); + first = false; + } + if ( bdf!=NULL ) + _PasteToBC(BDFMakeChar(bdf,i),bdf->pixelsize,BDFDepth(bdf),cur,doclear,fv); + } + break; + case ut_composit: + if ( cur->u.composit.state!=NULL ) + PasteToSC(SFMakeChar(sf,i),cur->u.composit.state,fv,doclear); + for ( bmp=cur->u.composit.bitmaps; bmp!=NULL; bmp = bmp->next ) { + for ( bdf=sf->bitmaps; bdf!=NULL && + (bdf->pixelsize!=bmp->u.bmpstate.pixelsize || BDFDepth(bdf)!=bmp->u.bmpstate.depth); + bdf=bdf->next ); + if ( bdf==NULL ) + bdf = BitmapCreateCheck(fv,&yestoall,first,bmp->u.bmpstate.pixelsize,bmp->u.bmpstate.depth); + if ( bdf!=NULL ) + _PasteToBC(BDFMakeChar(bdf,i),bdf->pixelsize,BDFDepth(bdf),bmp,doclear,fv); + } + first = false; + break; + } + ++j; + if ( mm==NULL || mm->normal!=origsf || j>=mm->instance_count ) + break; + sf = mm->instances[j]; + } + cur = cur->next; + if ( !GProgressNext()) + break; + } + err: + GProgressEndIndicator(); + if ( oldsel!=fv->selected ) + free(oldsel); +} + +void PasteIntoMV(MetricsView *mv,SplineChar *sc, int doclear) { + Undoes *cur=NULL, *bmp; + BDFFont *bdf; + int yestoall=0, first=true; + extern int onlycopydisplayed; + + cur = ©buffer; + + + if ( copybuffer.undotype == ut_none ) { + SCCheckXClipboard(mv->gw,sc,dm_fore,doclear); +return; + } + + if ( cur->undotype==ut_multiple ) + cur = cur->u.multiple.mult; + switch ( cur->undotype ) { + case ut_noop: + break; + case ut_state: case ut_width: case ut_vwidth: + case ut_lbearing: case ut_rbearing: + case ut_statehint: case ut_statename: + if ( !mv->fv->sf->hasvmetrics && cur->undotype==ut_vwidth) { + GWidgetErrorR(_STR_NoVerticalMetrics,_STR_FontNoVerticalMetrics); +return; + } + PasteToSC(sc,cur,mv->fv,doclear); + break; + case ut_bitmapsel: case ut_bitmap: + if ( onlycopydisplayed && mv->bdf!=NULL ) + _PasteToBC(BDFMakeChar(mv->bdf,sc->enc),mv->bdf->pixelsize,BDFDepth(mv->bdf),cur,doclear,mv->fv); + else { + for ( bdf=mv->fv->sf->bitmaps; bdf!=NULL && + (bdf->pixelsize!=cur->u.bmpstate.pixelsize || BDFDepth(bdf)!=cur->u.bmpstate.depth); + bdf=bdf->next ); + if ( bdf==NULL ) { + bdf = BitmapCreateCheck(mv->fv,&yestoall,first,cur->u.bmpstate.pixelsize,cur->u.bmpstate.depth); + first = false; + } + if ( bdf!=NULL ) + _PasteToBC(BDFMakeChar(bdf,sc->enc),bdf->pixelsize,BDFDepth(bdf),cur,doclear,mv->fv); + } + break; + case ut_composit: + if ( cur->u.composit.state!=NULL ) + PasteToSC(sc,cur->u.composit.state,mv->fv,doclear); + for ( bmp=cur->u.composit.bitmaps; bmp!=NULL; bmp = bmp->next ) { + for ( bdf=mv->fv->sf->bitmaps; bdf!=NULL && + (bdf->pixelsize!=bmp->u.bmpstate.pixelsize || BDFDepth(bdf)!=bmp->u.bmpstate.depth); + bdf=bdf->next ); + if ( bdf==NULL ) + bdf = BitmapCreateCheck(mv->fv,&yestoall,first,bmp->u.bmpstate.pixelsize,bmp->u.bmpstate.depth); + if ( bdf!=NULL ) + _PasteToBC(BDFMakeChar(bdf,sc->enc),bdf->pixelsize,BDFDepth(bdf),bmp,doclear,mv->fv); + } + first = false; + break; + } +} + +/* Look through the copy buffer. If it wasn't copied from the given font, then */ +/* we can stop. Otherwise: */ +/* If "from" is NULL, then remove all anchorpoints from the buffer */ +/* If "into" is NULL, then remove all anchorpoints with class "from" */ +/* Else replace the anchor class of all anchorpoints with class "from" with "info" */ +static void _PasteAnchorClassManip(SplineFont *sf,AnchorClass *into,AnchorClass *from) { + Undoes *cur = ©buffer, *temp; + + if ( cur->undotype==ut_multiple ) + cur = cur->u.multiple.mult; + while ( cur!=NULL ) { + temp = cur; + switch ( temp->undotype ) { + case ut_composit: + if ( temp->u.composit.state==NULL ) + break; + temp = temp->u.composit.state; + /* Fall through */; + case ut_state: case ut_statehint: case ut_statename: + if ( temp->u.state.copied_from!=sf ) +return; + if ( from==NULL ) { + AnchorPointsFree(temp->u.state.anchor); + temp->u.state.anchor = NULL; + } else + temp->u.state.anchor = APAnchorClassMerge(temp->u.state.anchor,into,from); + break; + } + cur=cur->next; + } +} + +void PasteRemoveSFAnchors(SplineFont *sf) { + _PasteAnchorClassManip(sf,NULL,NULL); +} + +void PasteAnchorClassMerge(SplineFont *sf,AnchorClass *into,AnchorClass *from) { + _PasteAnchorClassManip(sf,into,from); +} + +void PasteRemoveAnchorClass(SplineFont *sf,AnchorClass *dying) { + _PasteAnchorClassManip(sf,NULL,dying); +} + +void PosSubCopy(enum possub_type type, char **data) { + + CopyBufferFreeGrab(); + + copybuffer.undotype = ut_possub; + copybuffer.u.possub.pst = type; + copybuffer.u.possub.data = data; + XClipCheckEps(); +} diff --git a/fontforge/diffstubs.c b/fontforge/diffstubs.c new file mode 100644 index 00000000..2b38f669 --- /dev/null +++ b/fontforge/diffstubs.c @@ -0,0 +1,616 @@ +/* A set of routines used in pfaedit that I don't want/need to bother with for*/ +/* sfddiff, but which get called by it */ + +#include "pfaeditui.h" +#include +#include +#include +#include + +Encoding *enclist = NULL; +int local_encoding = e_iso8859_1; +char *iconv_local_encoding_name = NULL; + +void GProgressStartIndicator( + int delay, /* in tenths of seconds */ + const unichar_t *win_title, /* for the window decoration */ + const unichar_t *line1, /* First line of description */ + const unichar_t *line2, /* Second line */ + int tot, /* Number of sub-entities in the operation */ + int stages /* Number of stages, each processing tot sub-entities */ +) {} +void GProgressStartIndicatorR(int delay, int win_titler, int line1r, + int line2r, int tot, int stages) {} +void GProgressEnableStop(int enabled) {} +void GProgressEndIndicator(void) {} +int GProgressNextStage(void) { return(1); } +int GProgressNext(void) { return( 1 ); } +void GProgressChangeLine2R(int line2r) {} +void GProgressChangeTotal(int tot) { } +void GProgressChangeStages(int stages) { } +int GWidgetAskR(int title, int *answers, int def, int cancel,int question,...) { return cancel; } +SplineFont *LoadSplineFont(char *filename, enum openflags of) { return NULL; } +int SFReencodeFont(SplineFont *sf,enum charset new_map) { return 0 ; } +void RefCharFree(RefChar *ref) {} +void LinearApproxFree(LinearApprox *la) {} +SplineFont *SplineFontNew(void) {return NULL; } +void SplineFontFree(SplineFont *sf) { } +void BDFCharFree(BDFChar *bc) { } +void SplineCharFree(SplineChar *sc) { } +void SCMakeDependent(SplineChar *dependent,SplineChar *base) {} +void SCReinstanciateRefChar(SplineChar *sc,RefChar *rf) {} +void SCGuessHHintInstancesList(SplineChar *sc) { } +void SCGuessVHintInstancesList(SplineChar *sc) { } +int StemListAnyConflicts(StemInfo *stems) { return 0 ; } +int getAdobeEnc(char *name) { return -1; } +SplineChar *SFMakeChar(SplineFont *sf, int enc) { return NULL; } +GDisplay *screen_display=NULL; +int FVWinInfo(struct fontview *sf,int *cc,int *rc) { return 0 ; } + +/* ************************************************************************** */ +/* And some routines we actually do need */ + +void GDrawIError(const char *format, ... ) { + va_list ap; + va_start(ap,format); + vfprintf(stderr,format,ap); + va_end(ap); +} + +void GDrawError(const char *format,...) { + va_list ap; + va_start(ap,format); + vfprintf(stderr,format,ap); + va_end(ap); +} + +int RealNear(real a,real b) { + real d; + +#ifdef USE_DOUBLE + if ( a==0 ) +return( b>-1e-8 && b<1e-8 ); + if ( b==0 ) +return( a>-1e-8 && a<1e-8 ); + + d = a/(1024*1024.); + if ( d<0 ) d = -d; +return( b>a-d && b-1e-5 && b<1e-5 ); + if ( b==0 ) +return( a>-1e-5 && a<1e-5 ); + + d = a/(1024*64.); + if ( d<0 ) d = -d; +return( b>a-d && b-.0001 ) +return( true ); + } else if ( b==0 ) { + if ( a<.0001 && a>-.0001 ) +return( true ); + } else { + a /= b; + if ( a>=.95 && a<=1.05 ) +return( true ); + } +return( false ); +} + +int SplineIsLinear(Spline *spline) { + real t1,t2; + int ret; + + if ( spline->knownlinear ) +return( true ); + if ( spline->knowncurved ) +return( false ); + + if ( spline->splines[0].a==0 && spline->splines[0].b==0 && + spline->splines[1].a==0 && spline->splines[1].b==0 ) +return( true ); + + /* Something is linear if the control points lie on the line between the */ + /* two base points */ + + /* Vertical lines */ + if ( RealNear(spline->from->me.x,spline->to->me.x) ) { + ret = RealNear(spline->from->me.x,spline->from->nextcp.x) && + RealNear(spline->from->me.x,spline->to->prevcp.x) && + ((spline->from->nextcp.y >= spline->from->me.y && + spline->from->nextcp.y <= spline->to->prevcp.y && + spline->to->prevcp.y <= spline->to->me.y ) || + (spline->from->nextcp.y <= spline->from->me.y && + spline->from->nextcp.y >= spline->to->prevcp.y && + spline->to->prevcp.y >= spline->to->me.y )); + /* Horizontal lines */ + } else if ( RealNear(spline->from->me.y,spline->to->me.y) ) { + ret = RealNear(spline->from->me.y,spline->from->nextcp.y) && + RealNear(spline->from->me.y,spline->to->prevcp.y) && + ((spline->from->nextcp.x >= spline->from->me.x && + spline->from->nextcp.x <= spline->to->prevcp.x && + spline->to->prevcp.x <= spline->to->me.x) || + (spline->from->nextcp.x <= spline->from->me.x && + spline->from->nextcp.x >= spline->to->prevcp.x && + spline->to->prevcp.x >= spline->to->me.x)); + } else { + ret = true; + t1 = (spline->from->nextcp.y-spline->from->me.y)/(spline->to->me.y-spline->from->me.y); + if ( t1<0 || t1>1.0 ) + ret = false; + else { + t2 = (spline->from->nextcp.x-spline->from->me.x)/(spline->to->me.x-spline->from->me.x); + if ( t2<0 || t2>1.0 ) + ret = false; + ret = RealApprox(t1,t2); + } + if ( ret ) { + t1 = (spline->to->me.y-spline->to->prevcp.y)/(spline->to->me.y-spline->from->me.y); + if ( t1<0 || t1>1.0 ) + ret = false; + else { + t2 = (spline->to->me.x-spline->to->prevcp.x)/(spline->to->me.x-spline->from->me.x); + if ( t2<0 || t2>1.0 ) + ret = false; + else + ret = RealApprox(t1,t2); + } + } + } + spline->knowncurved = !ret; + spline->knownlinear = ret; +return( ret ); +} + +void SplineRefigure3(Spline *spline) { + SplinePoint *from = spline->from, *to = spline->to; + Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; + +#ifdef DEBUG + if ( RealNear(from->me.x,to->me.x) && RealNear(from->me.y,to->me.y)) + GDrawIError("Zero length spline created"); +#endif + xsp->d = from->me.x; ysp->d = from->me.y; + if ( from->nonextcp ) from->nextcp = from->me; + else if ( from->nextcp.x==from->me.x && from->nextcp.y == from->me.y ) from->nonextcp = true; + if ( to->noprevcp ) to->prevcp = to->me; + else if ( to->prevcp.x==to->me.x && to->prevcp.y == to->me.y ) to->noprevcp = true; + if ( from->nonextcp && to->noprevcp ) { + spline->islinear = true; + xsp->c = to->me.x-from->me.x; + ysp->c = to->me.y-from->me.y; + xsp->a = xsp->b = 0; + ysp->a = ysp->b = 0; + } else { + /* from p. 393 (Operator Details, curveto) Postscript Lang. Ref. Man. (Red book) */ + xsp->c = 3*(from->nextcp.x-from->me.x); + ysp->c = 3*(from->nextcp.y-from->me.y); + xsp->b = 3*(to->prevcp.x-from->nextcp.x)-xsp->c; + ysp->b = 3*(to->prevcp.y-from->nextcp.y)-ysp->c; + xsp->a = to->me.x-from->me.x-xsp->c-xsp->b; + ysp->a = to->me.y-from->me.y-ysp->c-ysp->b; + if ( RealNear(xsp->c,0)) xsp->c=0; + if ( RealNear(ysp->c,0)) ysp->c=0; + if ( RealNear(xsp->b,0)) xsp->b=0; + if ( RealNear(ysp->b,0)) ysp->b=0; + if ( RealNear(xsp->a,0)) xsp->a=0; + if ( RealNear(ysp->a,0)) ysp->a=0; + spline->islinear = false; + if ( ysp->a==0 && xsp->a==0 && ysp->b==0 && xsp->b==0 ) + spline->islinear = true; /* This seems extremely unlikely... */ + } + if ( isnan(ysp->a) || isnan(xsp->a) ) + GDrawIError("NaN value in spline creation"); + LinearApproxFree(spline->approx); + spline->approx = NULL; + spline->knowncurved = false; + spline->knownlinear = spline->islinear; + SplineIsLinear(spline); + spline->isquadratic = false; + if ( !spline->islinear && xsp->a==0 && ysp->a==0 ) + spline->isquadratic = true; /* Only likely if we read in a TTF */ +} + +void SplineRefigure2(Spline *spline) { + SplinePoint *from = spline->from, *to = spline->to; + Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; + +#ifdef DEBUG + if ( RealNear(from->me.x,to->me.x) && RealNear(from->me.y,to->me.y)) + GDrawIError("Zero length spline created"); +#endif + + if ( from->nonextcp ) from->nextcp = from->me; + else if ( from->nextcp.x==from->me.x && from->nextcp.y == from->me.y ) from->nonextcp = true; + if ( to->noprevcp ) to->prevcp = to->me; + else if ( to->prevcp.x==to->me.x && to->prevcp.y == to->me.y ) to->noprevcp = true; + + if ( from->nonextcp && to->noprevcp ) + /* Ok */; + else if ( from->nonextcp || to->noprevcp || from->nextcp.x!=to->prevcp.x || + from->nextcp.y!=to->prevcp.y ) + GDrawIError("Invalid 2nd order spline in SplineRefigure2" ); + + xsp->d = from->me.x; ysp->d = from->me.y; + if ( from->nonextcp && to->noprevcp ) { + spline->islinear = true; + xsp->c = to->me.x-from->me.x; + ysp->c = to->me.y-from->me.y; + xsp->a = xsp->b = 0; + ysp->a = ysp->b = 0; + } else { + /* from p. 393 (Operator Details, curveto) Postscript Lang. Ref. Man. (Red book) */ + xsp->c = 2*(from->nextcp.x-from->me.x); + ysp->c = 2*(from->nextcp.y-from->me.y); + xsp->b = to->me.x-from->me.x-xsp->c; + ysp->b = to->me.y-from->me.y-ysp->c; + xsp->a = 0; + ysp->a = 0; + if ( RealNear(xsp->c,0)) xsp->c=0; + if ( RealNear(ysp->c,0)) ysp->c=0; + if ( RealNear(xsp->b,0)) xsp->b=0; + if ( RealNear(ysp->b,0)) ysp->b=0; + spline->islinear = false; + if ( ysp->b==0 && xsp->b==0 ) + spline->islinear = true; /* This seems extremely unlikely... */ + } + if ( isnan(ysp->b) || isnan(xsp->b) ) + GDrawIError("NaN value in spline creation"); + LinearApproxFree(spline->approx); + spline->approx = NULL; + spline->knowncurved = false; + spline->knownlinear = spline->islinear; + SplineIsLinear(spline); + spline->isquadratic = !spline->knownlinear; + spline->order2 = true; +} + +Spline *SplineMake3(SplinePoint *from, SplinePoint *to) { + Spline *spline = chunkalloc(sizeof(Spline)); + + spline->from = from; spline->to = to; + from->next = to->prev = spline; + SplineRefigure3(spline); +return( spline ); +} + +Spline *SplineMake2(SplinePoint *from, SplinePoint *to) { + Spline *spline = chunkalloc(sizeof(Spline)); + + spline->from = from; spline->to = to; + from->next = to->prev = spline; + SplineRefigure2(spline); +return( spline ); +} + +Spline *SplineMake(SplinePoint *from, SplinePoint *to, int order2) { + if ( order2 ) +return( SplineMake2(from,to)); + else +return( SplineMake3(from,to)); +} + +int SCWorthOutputting(SplineChar *sc) { +return( sc!=NULL && + ( sc->layers[ly_fore].splines!=NULL || sc->layers[ly_fore].refs!=NULL || sc->widthset || +#if HANYANG + sc->compositionunit || +#endif + sc->dependents!=NULL || + sc->width!=sc->parent->ascent+sc->parent->descent ) && + ( strcmp(sc->name,".notdef")!=0 || sc->enc==0) ); +} + +SplineFont *SplineFontEmpty(void) { + SplineFont *sf; + sf = gcalloc(1,sizeof(SplineFont)); + sf->pfminfo.fstype = -1; + sf->encoding_name = em_none; +return( sf ); +} + +RefChar *RefCharCreate(void) { + RefChar *ref = chunkalloc(sizeof(RefChar)); + ref->layer_cnt = 1; +return( ref ); +} + +void *chunkalloc(int size) { +return( gcalloc(1,size)); +} + +void chunkfree(void *item,int size) { + free(item); +} + +SplineChar *SplineCharCreate(void) { + SplineChar *sc = gcalloc(1,sizeof(SplineChar)); + sc->color = COLOR_DEFAULT; +return( sc ); +} + +GImage *GImageCreate(enum image_type type, int32 width, int32 height) { + GImage *gi; + struct _GImage *base; + + if ( typeit_true ) +return( NULL ); + + gi = gcalloc(1,sizeof(GImage)); + base = galloc(sizeof(struct _GImage)); + if ( gi==NULL || base==NULL ) { + free(gi); free(base); +return( NULL ); + } + gi->u.image = base; + base->image_type = type; + base->width = width; + base->height = height; + base->bytes_per_line = type==it_true?4*width:type==it_index?width:(width+7)/8; + base->data = NULL; + base->clut = NULL; + base->trans = COLOR_UNKNOWN; + base->data = galloc(height*base->bytes_per_line); + if ( base->data==NULL ) { + free(base); + free(gi); +return( NULL ); + } + if ( type==it_index ) { + base->clut = gcalloc(1,sizeof(GClut)); + base->clut->trans_index = COLOR_UNKNOWN; + } +return( gi ); +} + +int GImageGetWidth(GImage *img) { + if ( img->list_len==0 ) { +return( img->u.image->width ); + } else { +return( img->u.images[0]->width ); + } +} + +int GImageGetHeight(GImage *img) { + if ( img->list_len==0 ) { +return( img->u.image->height ); + } else { +return( img->u.images[0]->height ); + } +} + +void BDFClut(BDFFont *bdf, int linear_scale) { + int scale = linear_scale*linear_scale, i; + Color bg = 0xffffff; + int bgr=COLOR_RED(bg), bgg=COLOR_GREEN(bg), bgb=COLOR_BLUE(bg); + GClut *clut; + + bdf->clut = clut = gcalloc(1,sizeof(GClut)); + clut->clut_len = scale; + clut->is_grey = (bgr==bgg && bgb==bgr); + clut->trans_index = -1; + for ( i=0; iclut[i] = + COLOR_CREATE( bgr- (i*(bgr))/(scale-1), + bgg- (i*(bgg))/(scale-1), + bgb- (i*(bgb))/(scale-1)); + } + clut->clut[scale-1] = 0; /* avoid rounding errors */ +} + +GImage *ImageAlterClut(GImage *image) { return NULL; } + +int BDFDepth(BDFFont *bdf) { + if ( bdf->clut==NULL ) +return( 1 ); + +return( bdf->clut->clut_len==256 ? 8 : + bdf->clut->clut_len==16 ? 4 : 2); +} + +/* scripts (for opentype) that I understand */ + +static uint32 scripts[][11] = { +/* Arabic */ { CHR('a','r','a','b'), 0x0600, 0x06ff, 0xfb50, 0xfdff, 0xfe70, 0xfeff }, +/* Armenian */ { CHR('a','r','m','n'), 0x0530, 0x058f, 0xfb13, 0xfb17 }, +/* Bengali */ { CHR('b','e','n','g'), 0x0980, 0x09ff }, +/* Bopomofo */ { CHR('b','o','p','o'), 0x3100, 0x312f }, +/* Braille */ { CHR('b','r','a','i'), 0x2800, 0x28ff }, +/* Byzantine M*/{ CHR('b','y','z','m'), 0x1d000, 0x1d0ff }, +/* Canadian Syl*/{CHR('c','a','n','s'), 0x1400, 0x167f }, +/* Cherokee */ { CHR('c','h','e','r'), 0x13a0, 0x13ff }, +/* Cyrillic */ { CHR('c','y','r','l'), 0x0500, 0x052f }, +/* Devanagari */{ CHR('d','e','v','a'), 0x0900, 0x097f }, +/* Ethiopic */ { CHR('e','t','h','i'), 0x1300, 0x139f }, +/* Georgian */ { CHR('g','e','o','r'), 0x1080, 0x10ff }, +/* Greek */ { CHR('g','r','e','k'), 0x0370, 0x03ff, 0x1f00, 0x1fff }, +/* Gujarati */ { CHR('g','u','j','r'), 0x0a80, 0x0aff }, +/* Gurmukhi */ { CHR('g','u','r','u'), 0x0a00, 0x0a7f }, +/* Hangul */ { CHR('h','a','n','g'), 0xac00, 0xd7af, 0x3130, 0x319f, 0xffa0, 0xff9f }, + /* I'm not sure what the difference is between the 'hang' tag and the 'jamo' */ + /* tag. 'Jamo' is said to be the precomposed forms, but what's 'hang'? */ +/* CJKIdeogra */{ CHR('h','a','n','i'), 0x3300, 0x9fff, 0xf900, 0xfaff, 0x020000, 0x02ffff }, +/* Hebrew */ { CHR('h','e','b','r'), 0x0590, 0x05ff, 0xfb1e, 0xfb4ff }, +#if 0 /* Hiragana used to have its own tag, but has since been merged with katakana */ +/* Hiragana */ { CHR('h','i','r','a'), 0x3040, 0x309f }, +#endif +/* Hangul Jamo*/{ CHR('j','a','m','o'), 0x1100, 0x11ff, 0x3130, 0x319f, 0xffa0, 0xffdf }, +/* Katakana */ { CHR('k','a','n','a'), 0x3040, 0x30ff, 0xff60, 0xff9f }, +/* Khmer */ { CHR('k','h','m','r'), 0x1780, 0x17ff }, +/* Kannada */ { CHR('k','n','d','a'), 0x0c80, 0x0cff }, +/* Latin */ { CHR('l','a','t','n'), 0x0000, 0x02af, 0x1d00, 0x1eff, 0xfb00, 0xfb0f, 0xff00, 0xff5f, 0, 0 }, +/* Lao */ { CHR('l','a','o',' '), 0x0e80, 0x0eff }, +/* Malayalam */ { CHR('m','l','y','m'), 0x0d00, 0x0d7f }, +/* Mongolian */ { CHR('m','o','n','g'), 0x1800, 0x18af }, +/* Myanmar */ { CHR('m','y','m','r'), 0x1000, 0x107f }, +/* Ogham */ { CHR('o','g','a','m'), 0x1680, 0x169f }, +/* Oriya */ { CHR('o','r','y','a'), 0x0b00, 0x0b7f }, +/* Runic */ { CHR('r','u','n','r'), 0x16a0, 0x16ff }, +/* Sinhala */ { CHR('s','i','n','h'), 0x0d80, 0x0dff }, +/* Syriac */ { CHR('s','y','r','c'), 0x0700, 0x074f }, +/* Tamil */ { CHR('t','a','m','l'), 0x0b80, 0x0bff }, +/* Telugu */ { CHR('t','e','l','u'), 0x0c00, 0x0c7f }, +/* Thaana */ { CHR('t','h','a','a'), 0x0780, 0x07bf }, +/* Thai */ { CHR('t','h','a','i'), 0x0e00, 0x0e7f }, +/* Tibetan */ { CHR('t','i','b','t'), 0x0f00, 0x0fff }, +/* Yi */ { CHR('y','i',' ',' '), 0xa000, 0xa73f }, + { 0 } +}; + +uint32 ScriptFromUnicode(int u,SplineFont *sf) { + int s, k; + int enc; + + if ( u!=-1 ) { + for ( s=0; scripts[s][0]!=0; ++s ) { + for ( k=1; scripts[s][k+1]!=0; k += 2 ) + if ( u>=scripts[s][k] && u<=scripts[s][k+1] ) + break; + if ( scripts[s][k+1]!=0 ) + break; + } + if ( scripts[s][0]!=0 ) +return( scripts[s][0] ); + } + + if ( sf==NULL ) +return( 0 ); + enc = sf->encoding_name; + if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) { + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( strmatch(sf->ordering,"Identity")==0 ) +return( 0 ); + else if ( strmatch(sf->ordering,"Korean")==0 ) +return( CHR('j','a','m','o')); + else +return( CHR('h','a','n','i') ); + } + + if ( enc==em_jis208 || enc==em_jis212 || enc==em_gb2312 || enc==em_big5 || + enc == em_big5hkscs || enc==em_sjis || enc==em_jisgb ) +return( CHR('h','a','n','i') ); + else if ( enc==em_ksc5601 || enc==em_johab || enc==em_wansung ) +return( CHR('j','a','m','o') ); + else if ( enc==em_iso8859_11 ) +return( CHR('t','h','a','i')); + else if ( enc==em_iso8859_8 ) +return( CHR('h','e','b','r')); + else if ( enc==em_iso8859_7 ) +return( CHR('g','r','e','k')); + else if ( enc==em_iso8859_6 ) +return( CHR('a','r','a','b')); + else if ( enc==em_iso8859_5 || enc==em_koi8_r ) +return( CHR('c','y','r','l')); + else if ( enc==em_jis201 ) +return( CHR('k','a','n','a')); + else if ( (enc>=em_iso8859_1 && enc<=em_iso8859_15 ) || enc==em_mac || + enc==em_win || enc==em_adobestandard ) +return( CHR('l','a','t','n')); + +return( 0 ); +} + +uint32 SCScriptFromUnicode(SplineChar *sc) { + PST *pst; + SplineFont *sf; + int i; + + if ( sc==NULL ) +return( 0 ); + + sf = sc->parent; + if ( sc->unicodeenc!=-1 ) +return( ScriptFromUnicode( sc->unicodeenc,sf )); + if ( sf==NULL ) +return( 0 ); + + if ( sf->cidmaster ) sf=sf->cidmaster; + for ( i=0; i<2; ++i ) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) if ( pst->script_lang_index!=0xffff ) { + if ( i==1 || sf->script_lang[pst->script_lang_index][1].script==0 ) +return( sf->script_lang[pst->script_lang_index]->script ); + } + } +return( ScriptFromUnicode( sc->unicodeenc,sf )); +} + +int SCRightToLeft(SplineChar *sc) { + uint32 script; + + if ( sc->unicodeenc>=0x10800 && sc->unicodeenc<=0x10fff ) +return( true ); /* Supplemental Multilingual Plane, RTL scripts */ + + script = SCScriptFromUnicode(sc); +return( script==CHR('a','r','a','b') || script==CHR('h','e','b','r') ); +} + +int SFAddScriptLangIndex(SplineFont *sf,uint32 script,uint32 lang) { + int i; + + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( script==0 ) script=DEFAULT_SCRIPT; + if ( lang==0 ) lang=DEFAULT_LANG; + if ( sf->script_lang==NULL ) + sf->script_lang = gcalloc(2,sizeof(struct script_record *)); + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + if ( sf->script_lang[i][0].script==script && sf->script_lang[i][1].script==0 && + sf->script_lang[i][0].langs[0]==lang && + sf->script_lang[i][0].langs[1]==0 ) +return( i ); + } + sf->script_lang = grealloc(sf->script_lang,(i+2)*sizeof(struct script_record *)); + sf->script_lang[i] = gcalloc(2,sizeof(struct script_record)); + sf->script_lang[i][0].script = script; + sf->script_lang[i][0].langs = galloc(2*sizeof(uint32)); + sf->script_lang[i][0].langs[0] = lang; + sf->script_lang[i][0].langs[1] = 0; + sf->script_lang[i+1] = NULL; +return( i ); +} + +#if HANYANG +void SFDDumpCompositionRules(FILE *sfd,struct compositionrules *rules) { +} + +struct compositionrules *SFDReadCompositionRules(FILE *sfd) { + char buffer[200]; + while ( fgets(buffer,sizeof(buffer),sfd)!=NULL ) + if ( strstr(buffer, "EndCompositionRules")!=NULL ) + break; +return( NULL ); +} +#endif + +void SFConvertToOrder2(SplineFont *_sf) {} +void SFConvertToOrder3(SplineFont *_sf) {} + +static int UnicodeContainsCombiners(int uni) { + + if ( uni<0 || uni>0xffff ) +return( -1 ); +return( false ); +} + +uint16 PSTDefaultFlags(enum possub_type type,SplineChar *sc ) { + uint16 flags = 0; + + if ( sc!=NULL ) { + if ( SCRightToLeft(sc)) + flags = pst_r2l; + if ( type==pst_ligature ) { + int script = SCScriptFromUnicode(sc); + if ( script==CHR('h','e','b','r') || script==CHR('a','r','a','b')) { + if ( !UnicodeContainsCombiners(sc->unicodeenc)) + flags |= pst_ignorecombiningmarks; + } + } + } +return( flags ); +} diff --git a/fontforge/displayfonts.c b/fontforge/displayfonts.c new file mode 100644 index 00000000..c74b5147 --- /dev/null +++ b/fontforge/displayfonts.c @@ -0,0 +1,672 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include + +typedef struct di { + int done; + GWindow gw; + GTimer *sizechanged; + + /* current setting */ + SplineFont *sf; + enum sftf_fonttype fonttype; + int pixelsize; + int antialias; +} DI; + +#define CID_Font 1001 +#define CID_AA 1002 +#define CID_SizeLab 1003 +#define CID_Size 1004 +#define CID_pfb 1005 +#define CID_ttf 1006 +#define CID_httf 1007 +#define CID_otf 1008 +#define CID_bitmap 1009 +#define CID_pfaedit 1010 +#define CID_SampleText 1011 +#define CID_Done 1021 +#define CID_Group 1022 + +static GTextInfo *FontNames(SplineFont *cur_sf) { + int cnt; + FontView *fv; + SplineFont *sf; + GTextInfo *ti; + + for ( fv=fv_list, cnt=0; fv!=NULL; fv=fv->next ) + if ( fv->nextsame==NULL ) + ++cnt; + ti = gcalloc(cnt+1,sizeof(GTextInfo)); + for ( fv=fv_list, cnt=0; fv!=NULL; fv=fv->next ) + if ( fv->nextsame==NULL ) { + sf = fv->sf; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + ti[cnt].text = uc_copy(sf->fontname); + ti[cnt].userdata = sf; + if ( sf==cur_sf ) + ti[cnt].selected = true; + ++cnt; + } +return( ti ); +} + +static BDFFont *DSP_BestMatch(SplineFont *sf,int aa,int size) { + BDFFont *bdf, *sizem=NULL; + int a; + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( bdf->clut==NULL && !aa ) + a = 4; + else if ( bdf->clut!=NULL && aa ) { + if ( bdf->clut->clut_len==256 ) + a = 4; + else if ( bdf->clut->clut_len==16 ) + a = 3; + else + a = 2; + } + if ( bdf->pixelsize==size && a==4 ) +return( bdf ); + if ( sizem==NULL ) + sizem = bdf; + else { + int sdnew = bdf->pixelsize-size, sdold = sizem->pixelsize-size; + if ( sdnew<0 ) sdnew = -sdnew; + if ( sdold<0 ) sdold = -sdold; + if ( sdnewclut==NULL && !aa ) + olda = 4; + else if ( sizem->clut!=NULL && aa ) { + if ( sizem->clut->clut_len==256 ) + olda = 4; + else if ( sizem->clut->clut_len==16 ) + olda = 3; + else + olda = 2; + } + if ( a>olda ) + sizem = bdf; + } + } + } +return( sizem ); +} + +static BDFFont *DSP_BestMatchDlg(DI *di) { + GTextInfo *sel = GGadgetGetListItemSelected(GWidgetGetControl(di->gw,CID_Font)); + SplineFont *sf; + int val; + unichar_t *end; + + if ( sel==NULL ) +return( NULL ); + sf = sel->userdata; + val = u_strtol(_GGadgetGetTitle(GWidgetGetControl(di->gw,CID_Size)),&end,10); + if ( *end!='\0' || val<4 ) +return( NULL ); + +return( DSP_BestMatch(sf,GGadgetIsChecked(GWidgetGetControl(di->gw,CID_AA)),val) ); +} + +static void DSP_SetFont(DI *di,int doall) { + unichar_t *end; + int size = u_strtol(_GGadgetGetTitle(GWidgetGetControl(di->gw,CID_Size)),&end,10); + GTextInfo *sel = GGadgetGetListItemSelected(GWidgetGetControl(di->gw,CID_Font)); + SplineFont *sf; + int aa = GGadgetIsChecked(GWidgetGetControl(di->gw,CID_AA)); + int type; + + if ( sel==NULL || *end ) +return; + sf = sel->userdata; + + type = GGadgetIsChecked(GWidgetGetControl(di->gw,CID_pfb))? sftf_pfb : + GGadgetIsChecked(GWidgetGetControl(di->gw,CID_ttf))? sftf_ttf : + GGadgetIsChecked(GWidgetGetControl(di->gw,CID_httf))? sftf_httf : + GGadgetIsChecked(GWidgetGetControl(di->gw,CID_otf))? sftf_otf : + GGadgetIsChecked(GWidgetGetControl(di->gw,CID_pfaedit))? sftf_pfaedit : + sftf_bitmap; + if ( di->sf==sf && di->fonttype==type && di->pixelsize==size && di->antialias==aa && !doall ) +return; + if ( !SFTFSetFont(GWidgetGetControl(di->gw,CID_SampleText),doall?0:-1,-1, + sf,type,size,aa)) + GWidgetErrorR(_STR_BadFont,_STR_BadFont); + di->sf = sf; + di->fonttype = type; + di->pixelsize = size; + di->antialias = aa; +} + +static void DSP_ChangeFontCallback(void *context,SplineFont *sf,enum sftf_fonttype type, + int size, int aa) { + DI *di = context; + char buf[12]; unichar_t ubuf[12]; + + if ( di->antialias!=aa ) { + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_AA),aa); + di->antialias = aa; + } + if ( di->pixelsize!=size ) { + sprintf(buf,"%d",size); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(di->gw,CID_Size),ubuf); + di->pixelsize = size; + } + if ( di->sf!=sf ) { + GTextInfo **ti; + int i,len,set; + ti = GGadgetGetList(GWidgetGetControl(di->gw,CID_Font),&len); + for ( i=0; iuserdata == sf ) + break; + if ( igw,CID_Font),i); + /*GGadgetSetTitle(GWidgetGetControl(di->gw,CID_Font),ti[i]->text);*/ + } + set = hasFreeType() && !sf->onlybitmaps && sf->subfontcnt==0; + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_pfb),set); + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_ttf),set); + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_httf),set); + set = hasFreeType() && !sf->onlybitmaps; + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_otf),set); + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_bitmap),sf->bitmaps!=NULL); + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_pfaedit),!sf->onlybitmaps); + di->sf = sf; + } + if ( di->fonttype!=type ) { + if ( type==sftf_pfb ) + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_pfb),true); + else if ( type==sftf_ttf ) + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_ttf),true); + else if ( type==sftf_httf ) + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_httf),true); + else if ( type==sftf_otf ) + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_otf),true); + else if ( type==sftf_pfaedit ) + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_pfaedit),true); + else + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_bitmap),true); + di->fonttype = type; + } +} + +static int DSP_AAState(SplineFont *sf,BDFFont *bestbdf) { + /* What should AntiAlias look like given the current set of bitmaps */ + int anyaa=0, anybit=0; + BDFFont *bdf; + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( bdf->clut==NULL ) + anybit = true; + else + anyaa = true; + if ( anybit && anyaa ) +return( gg_visible | gg_enabled | (bestbdf!=NULL && bestbdf->clut!=NULL ? gg_cb_on : 0) ); + else if ( anybit ) +return( gg_visible ); + else if ( anyaa ) +return( gg_visible | gg_cb_on ); + +return( gg_visible ); +} + +static int DSP_FontChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + DI *di = GDrawGetUserData(GGadgetGetWindow(g)); + GTextInfo *sel = GGadgetGetListItemSelected(g); + SplineFont *sf; + BDFFont *best; + int flags, pick = 0, i; + char size[12]; unichar_t usize[12]; + + if ( sel==NULL ) +return( true ); + sf = sel->userdata; + if ( GGadgetIsChecked(GWidgetGetControl(di->gw,CID_bitmap)) && sf->bitmaps==NULL ) + pick = true; + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_bitmap),sf->bitmaps!=NULL); + if ( !hasFreeType() || sf->onlybitmaps ) { + best = DSP_BestMatchDlg(di); + flags = DSP_AAState(sf,best); + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_AA),flags&gg_enabled); + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_AA),flags&gg_cb_on); + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_bitmap),true); + for ( i=CID_pfb; i<=CID_otf; ++i ) + GGadgetSetEnabled(GWidgetGetControl(di->gw,i),false); + if ( best!=NULL ) { + sprintf( size, "%d", best->pixelsize ); + uc_strcpy(usize,size); + GGadgetSetTitle(GWidgetGetControl(di->gw,CID_Size),usize); + } + } else if ( sf->subfontcnt!=0 ) { + for ( i=CID_pfb; igw,i),false); + if ( GGadgetIsChecked(GWidgetGetControl(di->gw,i)) ) + pick = true; + } + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_otf),true); + if ( pick ) + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_otf),true); + } else { + for ( i=CID_pfb; i<=CID_otf; ++i ) + GGadgetSetEnabled(GWidgetGetControl(di->gw,i),true); + if ( pick ) + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_pfb),true); + } + DSP_SetFont(di,false); + } +return( true ); +} + +static int DSP_AAChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + DI *di = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GGadgetIsChecked(GWidgetGetControl(di->gw,CID_bitmap)) ) { + int val = u_strtol(_GGadgetGetTitle(GWidgetGetControl(di->gw,CID_Size)),NULL,10); + int bestdiff = 8000, bdfdiff; + BDFFont *bdf, *best=NULL; + GTextInfo *sel = GGadgetGetListItemSelected(GWidgetGetControl(di->gw,CID_Font)); + SplineFont *sf; + int aa = GGadgetIsChecked(GWidgetGetControl(di->gw,CID_AA)); + if ( sel==NULL ) +return( true ); + sf = sel->userdata; + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( (aa && bdf->clut) || (!aa && bdf->clut==NULL)) { + if ((bdfdiff = bdf->pixelsize-val)<0 ) bdfdiff = -bdfdiff; + if ( bdfdiffpixelsize ); + uc_strcpy(usize,size); + GGadgetSetTitle(GWidgetGetControl(di->gw,CID_Size),usize); + } + } + DSP_SetFont(di,false); + } +return( true ); +} + +static int DSP_SizeChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textfocuschanged && + !e->u.control.u.tf_focus.gained_focus ) { + DI *di = GDrawGetUserData(GGadgetGetWindow(g)); + int err=false; + int size = GetIntR(di->gw,CID_Size,_STR_Size,&err); + if ( err || size<4 ) +return( true ); + if ( GGadgetIsChecked(GWidgetGetControl(di->gw,CID_bitmap)) ) { + GTextInfo *sel = GGadgetGetListItemSelected(GWidgetGetControl(di->gw,CID_Font)); + SplineFont *sf; + BDFFont *bdf, *best=NULL; + int aa = GGadgetIsChecked(GWidgetGetControl(di->gw,CID_AA)); + if ( sel==NULL ) +return( true ); + sf = sel->userdata; + for ( bdf = sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( bdf->pixelsize==size ) { + if (( bdf->clut && aa ) || ( bdf->clut==NULL && !aa )) { + best = bdf; + break; + } + best = bdf; + } + } + if ( best==NULL ) { + char buf[100], *pt=buf, *end=buf+sizeof(buf)-10; + unichar_t ubuf[12]; + int lastsize = 0; + for ( bdf=sf->bitmaps; bdf!=NULL && ptnext ) { + if ( bdf->pixelsize!=lastsize ) { + sprintf( pt, "%d,", bdf->pixelsize ); + lastsize = bdf->pixelsize; + pt += strlen(pt); + } + } + if ( pt!=buf ) + pt[-1] = '\0'; + GWidgetErrorR(_STR_BadSize,_STR_RequestedSizeNotAvail,buf); + best = DSP_BestMatchDlg(di); + if ( best!=NULL ) { + sprintf( buf, "%d", best->pixelsize); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(di->gw,CID_Size),ubuf); + } + } + if ( best==NULL ) +return(true); + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_AA),best->clut!=NULL ); + } + DSP_SetFont(di,false); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + /* Don't change the font on each change to the text field, that might */ + /* look rather odd. But wait until we think they may have finished */ + /* typing. Either when the change the focus (above) or when they */ + /* just don't do anything for a while */ + DI *di = GDrawGetUserData(GGadgetGetWindow(g)); + if ( di->sizechanged!=NULL ) + GDrawCancelTimer(di->sizechanged); + di->sizechanged = GDrawRequestTimer(di->gw,600,0,NULL); + } +return( true ); +} + +static void DSP_SizeChangedTimer(DI *di) { + GEvent e; + + di->sizechanged = NULL; + memset(&e,0,sizeof(e)); + e.type = et_controlevent; + e.u.control.g = GWidgetGetControl(di->gw,CID_Size); + e.u.control.subtype = et_textfocuschanged; + e.u.control.u.tf_focus.gained_focus = false; + DSP_SizeChanged(e.u.control.g,&e); +} + +static int DSP_RadioSet(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + DI *di = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GGadgetIsChecked(GWidgetGetControl(di->gw,CID_bitmap)) ) { + BDFFont *best = DSP_BestMatchDlg(di); + GTextInfo *sel = GGadgetGetListItemSelected(GWidgetGetControl(di->gw,CID_Font)); + SplineFont *sf; + int flags; + char size[12]; unichar_t usize[12]; + + if ( sel!=NULL ) { + sf = sel->userdata; + flags = DSP_AAState(sf,best); + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_AA),flags&gg_enabled); + GGadgetSetChecked(GWidgetGetControl(di->gw,CID_AA),flags&gg_cb_on); + if ( best!=NULL ) { + sprintf( size, "%d", best->pixelsize ); + uc_strcpy(usize,size); + GGadgetSetTitle(GWidgetGetControl(di->gw,CID_Size),usize); + } + } + } else { + GGadgetSetEnabled(GWidgetGetControl(di->gw,CID_AA),true); + } + DSP_SetFont(di,false); + } +return( true ); +} + +static int DSP_TextChanged(GGadget *g, GEvent *e) { +return( true ); +} + +static int DSP_Done(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + DI *di = GDrawGetUserData(gw); + di->done = true; + } +return( true ); +} + +static void dsp_resize(DI *di) { + GRect size, gpos; + + GDrawGetSize(di->gw,&size); + GGadgetResize(GWidgetGetControl(di->gw,CID_Group),size.width-4,size.height-4); + GGadgetMove(GWidgetGetControl(di->gw,CID_Done),(size.width-GIntGetResource(_NUM_Buttonsize))/2,size.height-48); + GGadgetGetSize(GWidgetGetControl(di->gw,CID_SampleText),&gpos); + GGadgetResize(GWidgetGetControl(di->gw,CID_SampleText),size.width-14,size.height-gpos.y-56); + GDrawRequestExpose(di->gw,NULL,false); +} + +static int dsp_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + DI *di = GDrawGetUserData(gw); + di->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("display.html"); +return( true ); + } +return( false ); + } else if ( event->type==et_resize && event->u.resize.sized ) { + dsp_resize(GDrawGetUserData(gw)); + } else if ( event->type==et_timer ) { + DI *di = GDrawGetUserData(gw); + if ( event->u.timer.timer==di->sizechanged ) + DSP_SizeChangedTimer(di); + } +return( true ); +} + +void DisplayDlg(SplineFont *sf) { + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[15]; + GTextInfo label[15]; + DI di; + char buf[10]; + int hasfreetype = hasFreeType(); + BDFFont *bestbdf=DSP_BestMatch(sf,true,12); + int twobyte; + + if ( sf->cidmaster ) + sf = sf->cidmaster; + + memset(&di,0,sizeof(di)); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<fontname; + label[0].text_is_1byte = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; + gcd[0].gd.pos.width = 150; + gcd[0].gd.flags = gg_visible | gg_enabled; + gcd[0].gd.cid = CID_Font; + gcd[0].gd.u.list = FontNames(sf); + gcd[0].gd.handle_controlevent = DSP_FontChanged; + /*gcd[0].gd.popup_msg = GStringGetResource(_STR_FullFontPopup,NULL);*/ + gcd[0].creator = GListButtonCreate; + + label[1].text = (unichar_t *) _STR_AA; + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.mnemonic = 'A'; + gcd[1].gd.pos.x = 170; gcd[1].gd.pos.y = gcd[0].gd.pos.y+3; + gcd[1].gd.flags = gg_visible | gg_enabled | gg_cb_on; + if ( sf->bitmaps!=NULL && ( !hasfreetype || sf->onlybitmaps )) + gcd[1].gd.flags = DSP_AAState(sf,bestbdf); + gcd[1].gd.popup_msg = GStringGetResource(_STR_AAPopup,NULL); + gcd[1].gd.handle_controlevent = DSP_AAChange; + gcd[1].gd.cid = CID_AA; + gcd[1].creator = GCheckBoxCreate; + + label[2].text = (unichar_t *) _STR_Size; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.mnemonic = 'S'; + gcd[2].gd.pos.x = 210; gcd[2].gd.pos.y = gcd[0].gd.pos.y+6; + gcd[2].gd.flags = gg_visible | gg_enabled; + gcd[2].gd.popup_msg = GStringGetResource(_STR_PixelSizePopup,NULL); + gcd[2].gd.cid = CID_SizeLab; + gcd[2].creator = GLabelCreate; + + if ( bestbdf !=NULL && ( !hasfreetype || sf->onlybitmaps )) + sprintf( buf, "%d", bestbdf->pixelsize ); + else + strcpy(buf,"17"); + label[3].text = (unichar_t *) buf; + label[3].text_is_1byte = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 240; gcd[3].gd.pos.y = gcd[0].gd.pos.y+3; + gcd[3].gd.pos.width = 40; + gcd[3].gd.flags = gg_visible | gg_enabled; + gcd[3].gd.cid = CID_Size; + gcd[3].gd.handle_controlevent = DSP_SizeChanged; + gcd[3].gd.popup_msg = GStringGetResource(_STR_PixelSizePopup,NULL); + gcd[3].creator = GTextFieldCreate; + + label[4].text = (unichar_t *) "pfb"; + label[4].text_is_1byte = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.mnemonic = 'p'; + gcd[4].gd.pos.x = gcd[0].gd.pos.x; gcd[4].gd.pos.y = 24+gcd[3].gd.pos.y; + gcd[4].gd.flags = gg_visible | gg_enabled | gg_cb_on; + gcd[4].gd.cid = CID_pfb; + gcd[4].gd.handle_controlevent = DSP_RadioSet; + gcd[4].gd.popup_msg = GStringGetResource(_STR_FormatPopup,NULL); + gcd[4].creator = GRadioCreate; + if ( sf->subfontcnt!=0 || !hasfreetype || sf->onlybitmaps ) gcd[4].gd.flags = gg_visible; + + label[5].text = (unichar_t *) "ttf"; + label[5].text_is_1byte = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.mnemonic = 't'; + gcd[5].gd.pos.x = 46; gcd[5].gd.pos.y = gcd[4].gd.pos.y; + gcd[5].gd.flags = gg_visible | gg_enabled; + gcd[5].gd.cid = CID_ttf; + gcd[5].gd.handle_controlevent = DSP_RadioSet; + gcd[5].gd.popup_msg = GStringGetResource(_STR_FormatPopup,NULL); + gcd[5].creator = GRadioCreate; + if ( sf->subfontcnt!=0 || !hasfreetype || sf->onlybitmaps ) gcd[5].gd.flags = gg_visible; + + label[6].text = (unichar_t *) "httf"; + label[6].text_is_1byte = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.mnemonic = 'h'; + gcd[6].gd.pos.x = 80; gcd[6].gd.pos.y = gcd[4].gd.pos.y; + gcd[6].gd.flags = gg_visible | gg_enabled; + gcd[6].gd.cid = CID_httf; + gcd[6].gd.handle_controlevent = DSP_RadioSet; + gcd[6].gd.popup_msg = GStringGetResource(_STR_FormatPopup,NULL); + gcd[6].creator = GRadioCreate; + if ( sf->subfontcnt!=0 || !hasfreetype || sf->onlybitmaps ) gcd[6].gd.flags = gg_visible; + + label[7].text = (unichar_t *) "otf"; + label[7].text_is_1byte = true; + gcd[7].gd.label = &label[7]; + gcd[7].gd.mnemonic = 'o'; + gcd[7].gd.pos.x = 114; gcd[7].gd.pos.y = gcd[4].gd.pos.y; + gcd[7].gd.flags = gg_visible | gg_enabled; + gcd[7].gd.cid = CID_otf; + gcd[7].gd.handle_controlevent = DSP_RadioSet; + gcd[7].gd.popup_msg = GStringGetResource(_STR_FormatPopup,NULL); + gcd[7].creator = GRadioCreate; + if ( !hasfreetype || sf->onlybitmaps ) gcd[7].gd.flags = gg_visible; + else if ( sf->subfontcnt!=0 ) gcd[7].gd.flags |= gg_cb_on; + + label[8].text = (unichar_t *) "bitmap"; + label[8].text_is_1byte = true; + gcd[8].gd.label = &label[8]; + gcd[8].gd.mnemonic = 'b'; + gcd[8].gd.pos.x = 148; gcd[8].gd.pos.y = gcd[4].gd.pos.y; + gcd[8].gd.flags = gg_visible | gg_enabled; + gcd[8].gd.cid = CID_bitmap; + gcd[8].gd.handle_controlevent = DSP_RadioSet; + gcd[8].gd.popup_msg = GStringGetResource(_STR_FormatPopup,NULL); + gcd[8].creator = GRadioCreate; + if ( sf->bitmaps==NULL ) gcd[8].gd.flags = gg_visible; + else if ( !hasfreetype || sf->onlybitmaps ) gcd[8].gd.flags |= gg_cb_on; + + label[9].text = (unichar_t *) "FontForge"; + label[9].text_is_1byte = true; + gcd[9].gd.label = &label[9]; + gcd[9].gd.mnemonic = 'p'; + gcd[9].gd.pos.x = 200; gcd[9].gd.pos.y = gcd[4].gd.pos.y; + gcd[9].gd.flags = gg_visible | gg_enabled; + gcd[9].gd.cid = CID_pfaedit; + gcd[9].gd.handle_controlevent = DSP_RadioSet; + gcd[9].gd.popup_msg = GStringGetResource(_STR_FormatPopup,NULL); + gcd[9].creator = GRadioCreate; + if ( !hasfreetype && sf->bitmaps==NULL ) gcd[9].gd.flags |= gg_cb_on; + else if ( sf->onlybitmaps ) gcd[9].gd.flags = gg_visible; + + + twobyte = (sf->encoding_name>=e_first2byte && sf->encoding_nameencoding_name>=em_unicodeplanes; + label[10].text = PrtBuildDef(sf,twobyte); + gcd[10].gd.label = &label[10]; + gcd[10].gd.mnemonic = 'T'; + gcd[10].gd.pos.x = 5; gcd[10].gd.pos.y = 20+gcd[9].gd.pos.y; + gcd[10].gd.pos.width = 400; gcd[10].gd.pos.height = 236; + gcd[10].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap | gg_text_xim; + gcd[10].gd.handle_controlevent = DSP_TextChanged; + gcd[10].gd.cid = CID_SampleText; + gcd[10].creator = SFTextAreaCreate; + + + gcd[11].gd.pos.x = (410-GIntGetResource(_NUM_Buttonsize))/2; gcd[11].gd.pos.y = gcd[10].gd.pos.y+gcd[10].gd.pos.height+6; + gcd[11].gd.pos.width = -1; gcd[11].gd.pos.height = 0; + gcd[11].gd.flags = gg_visible | gg_enabled | gg_but_default | gg_but_cancel; + label[11].text = (unichar_t *) _STR_Done; + label[11].text_in_resource = true; + gcd[11].gd.mnemonic = 'D'; + gcd[11].gd.label = &label[11]; + gcd[11].gd.cid = CID_Done; + gcd[11].gd.handle_controlevent = DSP_Done; + gcd[11].creator = GButtonCreate; + + gcd[12].gd.pos.x = 2; gcd[12].gd.pos.y = 2; + gcd[12].gd.pos.width = pos.width-4; gcd[12].gd.pos.height = pos.height-2; + gcd[12].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + gcd[12].gd.cid = CID_Group; + gcd[12].creator = GGroupCreate; + + GGadgetsCreate(di.gw,gcd); + GTextInfoListFree(gcd[0].gd.u.list); + free( label[10].text ); + DSP_SetFont(&di,true); + SFTFRegisterCallback(gcd[10].ret,&di,DSP_ChangeFontCallback); + GDrawSetVisible(di.gw,true); + while ( !di.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(di.gw); +} diff --git a/fontforge/dumpbdf.c b/fontforge/dumpbdf.c new file mode 100644 index 00000000..4543f59b --- /dev/null +++ b/fontforge/dumpbdf.c @@ -0,0 +1,514 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include "splinefont.h" +#include /* for the defn of GClut for greymaps */ +#include + +#define MAX_WIDTH 200 + +int IsntBDFChar(BDFChar *bdfc) { + if ( bdfc==NULL ) +return( true ); + + if ( bdfc->sc->parent->onlybitmaps ) +return( bdfc->enc!=0 && strcmp(bdfc->sc->name,".notdef")==0 ); + +return( !SCWorthOutputting(bdfc->sc)); +} + +static void decomposename(BDFFont *font, char *fontname, char *family_name, char *weight_name, + char *slant, char *stylename, char *squeeze, char *sffamily, char *sfweight ) { + char *ital, *bold, *style, *compress; + char ich='\0', bch='\0', sch='\0', cch='\0'; + char *pt; + + if ( *fontname=='-' ) { + sscanf(fontname,"-%*[^-]-%[^-]-%[^-]-%[^-]-%[^-]-%[^-]", + family_name,weight_name,slant,squeeze,stylename); + } else { + /* Assume it's a fontographer type name */ + strcpy(slant,"R"); + strcpy(squeeze,"Normal"); +/* Sigh. I don't use "Italic" and "Oblique" because urw truncates these to 4 */ +/* characters each. */ + if (( ital = strstrmatch(fontname,"Ital"))!=NULL ) + strcpy(slant,"I"); + else if (( ital = strstrmatch(fontname,"Kurs"))!=NULL ) + strcpy(slant,"I"); + else if (( ital = strstr(fontname,"Obli"))!=NULL ) + strcpy(slant,"O"); + else if (( ital = strstr(fontname,"Slanted"))!=NULL ) + strcpy(slant,"O"); + + if (( bold = strstr(fontname,"Bold"))==NULL && + ( bold = strstr(fontname,"Ligh"))==NULL && + ( bold = strstr(fontname,"Demi"))==NULL && + ( bold = strstr(fontname,"Blac"))==NULL && + ( bold = strstr(fontname,"Roma"))==NULL && + ( bold = strstr(fontname,"Book"))==NULL && + ( bold = strstr(fontname,"Regu"))==NULL && + ( bold = strstr(fontname,"Medi"))==NULL ); /* Again, URW */ + + if (( style = strstr(fontname,"Sans"))==NULL ); + if ((compress = strstr(fontname,"Extended"))==NULL && + (compress = strstr(fontname,"Condensed"))==NULL && + (compress = strstr(fontname,"SmallCaps"))==NULL ); + + strcpy(weight_name,"Medium"); + *stylename='\0'; + if ( bold!=NULL ) { bch = *bold; *bold = '\0'; } + if ( ital!=NULL ) { ich = *ital; *ital = '\0'; } + if ( style!=NULL ) { sch = *style; *style = '\0'; } + if ( compress!=NULL ) { cch = *compress; *compress = '\0'; } + strcpy(family_name,fontname); + if ( bold!=NULL ) { + *bold = bch; + strcpy(weight_name,bold); + *bold = '\0'; + } + if ( sfweight!=NULL && *sfweight!='\0' ) + strcpy(weight_name,sfweight); + if ( style!=NULL ) { + *style = sch; + strcpy(stylename,style); + *style = '\0'; + } + if ( compress!=NULL ) { + *compress = cch; + strcpy(squeeze,compress); + } + if ( style!=NULL ) *style = sch; + if ( bold!=NULL ) *bold = bch; + if ( ital!=NULL ) *ital = ich; + } + if ( sffamily!=NULL && *sffamily!='\0' ) + strcpy(family_name,sffamily); + while ( (pt=strchr(family_name,'-'))!=NULL ) + strcpy(pt,pt+1); +} + +static int AllSame(BDFFont *font,int *avg,int *cnt) { + int c=0, a=0, common= -1; + int i; + BDFChar *bdfc; + + for ( i=0; icharcnt; ++i ) { + if ( (bdfc = font->chars[i])!=NULL && !IsntBDFChar(bdfc)) { + ++c; + a += bdfc->width; + if ( common==-1 ) common = bdfc->width; else if ( common!=bdfc->width ) common = -2; + } + } + if ( c==0 ) *avg=0; else *avg = (10*a)/c; + *cnt = c; +return(common!=-2); +} + +static int GenerateGlyphRanges(BDFFont *font, FILE *file) { +#ifdef FONTFORGE_CONFIG_BDF_GLYPH_RANGES + char buffer[300], *pt, *end, add[30]; + int i, j, max, cnt=0; + + /* I gather that the _XFREE86_GLYPH_RANGES property has been dropped */ + /* because it was felt that the metrics data would allow users to */ + /* determine whether a character was in the font or not. I'm not in */ + /* complete agreement with that argument because there are several */ + /* zero-width spaces whose presence is not specified by the metrics */ + /* but it is almost irrelevant whether they are present or not (though */ + /* guessing wrong would present you with a "DEFAULT_CHAR" rather than */ + /* nothing) */ + + if ( font->encoding_name==em_unicode ) + max = 65536; + else if ( font->encoding_name==em_unicode4 ) + max = unicode4_size; + else +return( 0 ); + pt = buffer; end = pt+sizeof(buffer); + for ( i=0; icharcnt && ichars[i]) ) { + for ( j=i+1; jcharcnt && jchars[j]); ++j ); + --j; + if ( j==i ) + sprintf( add, "%d ", i ); + else + sprintf( add, "%d_%d ", i, j ); + i = j; + if ( pt+strlen(add) >= end ) { + pt[-1] = '\0'; /* was a space */ + if ( file!=NULL ) + fprintf(file, "_XFREE86_GLYPH_RANGES \"%s\"\n", buffer ); + pt = buffer; + ++cnt; + } + strcpy(pt,add); + pt += strlen(pt); + } + if ( pt!=buffer ) { + pt[-1] = '\0'; /* was a space */ + if ( file!=NULL ) + fprintf(file, "_XFREE86_GLYPH_RANGES \"%s\"\n", buffer ); + ++cnt; + } +return( cnt ); +#else +return( 0 ); +#endif /* FONTFORGE_CONFIG_BDF_GLYPH_RANGES */ +} + +static void calculate_bounding_box(BDFFont *font, + int *fbb_width,int *fbb_height,int *fbb_lbearing, int *fbb_descent) { + int height=0, width=0, descent=900, lbearing=900; + BDFChar *bdfc; + int i; + + for ( i=0; icharcnt; ++i ) { + if ( (bdfc = font->chars[i])!=NULL ) { + if ( bdfc->ymax-bdfc->ymin+1>height ) height = bdfc->ymax-bdfc->ymin+1; + if ( bdfc->xmax-bdfc->xmin+1>width ) width = bdfc->xmax-bdfc->xmin+1; + if ( bdfc->yminymin; + if ( bdfc->xminxmin; + } + } + *fbb_height = height; + *fbb_width = width; + *fbb_descent = descent; + *fbb_lbearing = lbearing; +} + +static void BDFDumpChar(FILE *file,BDFFont *font,BDFChar *bdfc,int enc) { + int r,c; + int bpl; + int em = ( font->sf->ascent+font->sf->descent ); /* Just in case em isn't 1000, be prepared to normalize */ + + BCCompressBitmap(bdfc); + if ( bdfc->enc==0xa0 && strcmp(bdfc->sc->name,"space")==0 ) + fprintf( file, "STARTCHAR %s\n", "nonbreakingspace" ); + else if ( bdfc->enc==0xad && strcmp(bdfc->sc->name,"hyphen")==0 ) + fprintf( file, "STARTCHAR %s\n", "softhyphen" ); + else + fprintf( file, "STARTCHAR %s\n", bdfc->sc->name ); + fprintf( file, "ENCODING %d\n", enc ); + if ( !font->sf->hasvmetrics || bdfc->sc->width!=em ) { + fprintf( file, "SWIDTH %d 0\n", bdfc->sc->width*1000/em ); + fprintf( file, "DWIDTH %d 0\n", bdfc->width ); + } + if ( font->sf->hasvmetrics && bdfc->sc->vwidth!=em ) { + fprintf( file, "SWIDTH1 %d 0\n", bdfc->sc->vwidth*1000/em ); + fprintf( file, "DWIDTH1 %d 0\n", (bdfc->sc->vwidth*font->pixelsize+em/2)/em ); + if ( font->sf->vertical_origin!=bdfc->sc->parent->vertical_origin ) /* For CID fonts */ + fprintf( file, "VVECTOR %d,%d\n", 500, 1000*bdfc->sc->parent->vertical_origin/ + (bdfc->sc->parent->ascent+bdfc->sc->parent->descent) ); + } + fprintf( file, "BBX %d %d %d %d\n", bdfc->xmax-bdfc->xmin+1, bdfc->ymax-bdfc->ymin+1, + bdfc->xmin, bdfc->ymin ); + fprintf( file, "BITMAP\n" ); + bpl = bdfc->bytes_per_line; + for ( r = 0; rymax-bdfc->ymin+1; ++r ) { + for ( c=0; cclut==NULL || font->clut->clut_len==256 ) { + int n1 = bdfc->bitmap[r*bdfc->bytes_per_line+c]>>4; + int n2 = bdfc->bitmap[r*bdfc->bytes_per_line+c]&0xf; + if ( n1>=10 ) + putc(n1-10+'A',file); + else + putc(n1+'0',file); + if ( n2>=10 ) + putc(n2-10+'A',file); + else + putc(n2+'0',file); + } else if ( font->clut->clut_len==16 ) { + int n1 = bdfc->bitmap[r*bdfc->bytes_per_line+c]; + if ( n1>=10 ) + putc(n1-10+'A',file); + else + putc(n1+'0',file); + } else { + int n1 = bdfc->bitmap[r*bdfc->bytes_per_line+c]<<2; + if ( cbitmap[r*bdfc->bytes_per_line+ ++c]; + if ( n1>=10 ) + putc(n1-10+'A',file); + else + putc(n1+'0',file); + } + } + if ( font->clut!=NULL ) + if ( ( font->clut->clut_len==16 && (bpl&1)) || + (font->clut->clut_len==4 && ((bpl&3)==1 || (bpl&3)==2)) ) + putc('0',file); + putc('\n',file); + } + fprintf( file, "ENDCHAR\n" ); + GProgressNext(); +} + +static void BDFDumpHeader(FILE *file,BDFFont *font,char *encoding, int res) { + int avg, cnt, pnt; + char *mono; + char family_name[80], weight_name[60], slant[10], stylename[40], squeeze[40]; + char buffer[400]; + int x_h= -1, cap_h= -1, def_ch=-1; + char fontname[300]; + int fbb_height, fbb_width, fbb_descent, fbb_lbearing; + char *pt; + uint32 codepages[2]; + int i; + char *sffn = *font->sf->fontname ? font->sf->fontname : "Untitled"; + + if ( AllSame(font,&avg,&cnt)) + mono="M"; + else + mono="P"; + if ( res!=-1 ) + /* Already set */; + else if ( font->pixelsize==33 || font->pixelsize==28 || font->pixelsize==17 || font->pixelsize==14 ) + res = 100; + else + res = 75; + + pnt = ((font->pixelsize*72+res/2)/res)*10; + if ( pnt==230 && res==75 ) + pnt = 240; + + if ( strcmp(encoding,"ISOLatin1Encoding")==0 ) + encoding = "ISO8859-1"; + + decomposename(font, sffn, family_name, weight_name, slant, + stylename, squeeze, font->sf->familyname, font->sf->weight); + if ( *font->sf->fontname=='-' ) { + strcpy(buffer,font->sf->fontname); + sprintf(fontname,"%s%s%s%s%s", family_name, stylename, + strcmp(weight_name,"Medium")==0?"":weight_name, + *slant=='I'?"Italic":*slant=='O'?"Oblique":"", + squeeze); + } else { + sprintf( buffer, "-%s-%s-%s-%s-%s-%s-%d-%d-%d-%d-%s-%d-%s", + font->foundry!=NULL?font->foundry:BDFFoundry==NULL?"FontForge":BDFFoundry, + family_name, weight_name, slant, squeeze, stylename, + font->pixelsize, pnt, res, res, mono, avg, encoding ); + if ( strchr(encoding,'-')==NULL ) + strcat(buffer,"-0"); + strcpy(fontname,font->sf->fontname); + } + + /* Vertical metrics & metrics specified at top level are 2.2 features */ + fprintf( file, font->clut!=NULL ? "STARTFONT 2.3\n" : + font->sf->hasvmetrics ? "STARTFONT 2.2\n" : + "STARTFONT 2.1\n" ); + fprintf( file, "FONT %s\n", buffer ); /* FONT ... */ +#if !OLD_GREYMAP_FORMAT + if ( font->clut==NULL ) + fprintf( file, "SIZE %d %d %d\n", pnt/10, res, res ); + else + fprintf( file, "SIZE %d %d %d %d\n", pnt/10, res, res, + font->clut->clut_len==256 ? 8 : + font->clut->clut_len==16 ? 4 : 2); +#else + fprintf( file, "SIZE %d %d %d\n", pnt/10, res, res ); +#endif + calculate_bounding_box(font,&fbb_width,&fbb_height,&fbb_lbearing,&fbb_descent); + fprintf( file, "FONTBOUNDINGBOX %d %d %d %d\n", fbb_width, fbb_height, fbb_lbearing, fbb_descent); + if ( font->sf->hasvmetrics ) { + fprintf( file, "METRICSSET 2\n" ); /* Both horizontal and vertical metrics */ + fprintf( file, "SWIDTH 1000\n" ); /* Default advance width value */ + fprintf( file, "DWIDTH %d\n", font->pixelsize ); /* Default advance width value */ + fprintf( file, "SWIDTH1 1000\n" ); /* Default advance width value */ + fprintf( file, "DWIDTH1 %d\n", font->pixelsize ); /* Default advance width value */ + fprintf( file, "VVECTOR %d,%d\n", 500, 1000*font->sf->vertical_origin/ + (font->sf->ascent+font->sf->descent) ); + /* Spec doesn't say if vvector is in scaled or unscaled units */ + /* offset from horizontal origin to vertical orig */ + } + /* the 2.2 spec says we can omit SWIDTH/DWIDTH from character metrics if we */ + /* specify it here. That would make monospaced fonts a lot smaller, but */ + /* that's not in the 2.1 and I worry that some parsers won't be able to */ + /* handle it (mine didn't until just now), so I shan't do that */ + + fprintf(file, "COMMENT \"Generated by fontforge, http://fontforge.sourceforge.net\"\n" ); + + if ( 'x'charcnt && font->chars['x']!=NULL ) { + x_h = font->chars['x']->ymax; + } + if ( 'X'charcnt && font->chars['X']!=NULL ) { + cap_h = font->chars['X']->ymax; + } + if ( (font->sf->chars[0]!=NULL && + (font->sf->chars[0]->layers[ly_fore].splines!=NULL || (font->sf->chars[0]->widthset && *mono!='M')) && + font->sf->chars[0]->layers[ly_fore].refs==NULL && strcmp(font->sf->chars[0]->name,".notdef")==0 ) ) + def_ch = 0; + + fprintf( file, "STARTPROPERTIES %d\n", 25+(x_h!=-1)+(cap_h!=-1)+ + GenerateGlyphRanges(font,NULL)+ + (def_ch!=-1)+(font->clut!=NULL)); + fprintf( file, "FONT_NAME \"%s\"\n", font->sf->fontname ); + fprintf( file, "FONT_ASCENT %d\n", font->ascent ); + fprintf( file, "FONT_DESCENT %d\n", font->descent ); + fprintf( file, "UNDERLINE_POSITION %d\n", (int) font->sf->upos ); + fprintf( file, "UNDERLINE_THICKNESS %d\n", (int) font->sf->uwidth ); + fprintf( file, "QUAD_WIDTH %d\n", font->pixelsize ); + if ( x_h!=-1 ) + fprintf( file, "X_HEIGHT %d\n", x_h ); + if ( cap_h!=-1 ) + fprintf( file, "CAP_HEIGHT %d\n", cap_h ); + if ( def_ch!=-1 ) + fprintf( file, "DEFAULT_CHAR %d\n", def_ch ); + fprintf( file, "FONTNAME_REGISTRY \"\"\n" ); + fprintf( file, "FAMILY_NAME \"%s\"\n", family_name ); + fprintf( file, "FOUNDRY \"%s\"\n", font->foundry!=NULL?font->foundry:BDFFoundry==NULL?"FontForge":BDFFoundry ); + fprintf( file, "WEIGHT_NAME \"%s\"\n", weight_name ); + fprintf( file, "SETWIDTH_NAME \"%s\"\n", squeeze ); + fprintf( file, "SLANT \"%s\"\n", slant ); + fprintf( file, "ADD_STYLE_NAME \"%s\"\n", stylename ); + fprintf( file, "PIXEL_SIZE %d\n", font->pixelsize ); + fprintf( file, "POINT_SIZE %d\n", pnt ); + fprintf( file, "RESOLUTION_X %d\n",res ); + fprintf( file, "RESOLUTION_Y %d\n",res ); + fprintf( file, "RESOLUTION %d\n",res ); + fprintf( file, "SPACING \"%s\"\n", mono ); + fprintf( file, "AVERAGE_WIDTH %d\n", avg ); + if ( font->clut!=NULL ) + fprintf( file, "BITS_PER_PIXEL %d\n", BDFDepth(font)); + if ( font->encoding_name==em_none ) + fprintf( file, "CHARSET_REGISTRY \"FontSpecific\"\n" ); + else if ( font->encoding_name<=em_iso8859_15 ) + fprintf( file, "CHARSET_REGISTRY \"ISO8859\"\n" ); + else if ( font->encoding_name==em_unicode || + font->encoding_name==em_unicode4 || + (font->encoding_name>=em_unicodeplanes && font->encoding_name<=em_unicodeplanesmax)) + fprintf( file, "CHARSET_REGISTRY \"ISO10646\"\n" ); + else + fprintf( file, "CHARSET_REGISTRY \"%s\"\n", encoding ); + if (( pt = strrchr(encoding,'-'))==NULL ) pt = "-0"; + fprintf( file, "CHARSET_ENCODING \"%s\"\n", pt+1 ); + + OS2FigureCodePages(font->sf,codepages); + fprintf( file, "CHARSET_COLLECTIONS \"" ); + if ( codepages[0]&0xff ) + fprintf( file, "ASCII " ); + else { + for ( i=32; i<127 && isf->charcnt; ++i ) + /* I'll accept a missing glyph, but not a badly encoded one */ + if ( font->sf->chars[i]!=NULL && font->sf->chars[i]->unicodeenc!=i ) + break; + if ( i==127 ) + fprintf( file, "ASCII "); + } + if ( (codepages[0]&1) && font->encoding_name!=em_iso8859_1 ) + fprintf( file, "ISOLatin1Encoding " ); + if ( (codepages[0]&2) && font->encoding_name!=em_iso8859_2 ) + fprintf( file, "ISO8859-2 " ); + if ( (codepages[0]&4) && font->encoding_name!=em_iso8859_5 ) + fprintf( file, "ISO8859-5 " ); + if ( (codepages[0]&8) && font->encoding_name!=em_iso8859_7 ) + fprintf( file, "ISO8859-7 " ); + if ( (codepages[0]&0x10) && font->encoding_name!=em_iso8859_9 ) + fprintf( file, "ISO8859-9 " ); + if ( (codepages[0]&0x20) && font->encoding_name!=em_iso8859_8 ) + fprintf( file, "ISO8859-8 " ); + if ( (codepages[0]&0x40) && font->encoding_name!=em_iso8859_6 ) + fprintf( file, "ISO8859-6 " ); + if ( (codepages[0]&0x80) && font->encoding_name!=em_iso8859_4 ) + fprintf( file, "ISO8859-4 " ); + if ( (codepages[0]&0x10000) && font->encoding_name!=em_iso8859_11 ) + fprintf( file, "ISO8859-11 " ); + if ( (codepages[0]&0x20000) && (font->encoding_name==em_unicode || font->encoding_name==em_unicode4 )) + fprintf( file, "JISX0208.1997 " ); + if ( (codepages[0]&0x40000) && (font->encoding_name==em_unicode || font->encoding_name==em_unicode4 ) ) + fprintf( file, "GB2312.1980 " ); + if ( (codepages[0]&0x80000) && (font->encoding_name==em_unicode || font->encoding_name==em_unicode4 )) + fprintf( file, "KSC5601.1992 " ); + if ( (codepages[0]&0x100000) && (font->encoding_name==em_unicode || font->encoding_name==em_unicode4 )) + fprintf( file, "BIG5 " ); + if ( (codepages[0]&0x80000000) && font->encoding_name!=em_symbol ) + fprintf( file, "Symbol " ); +#if 0 + if ( (codepages[0]&0x20000000) && font->encoding_name!=em_mac ) + fprintf( file, "MacRoman " ); +#endif + fprintf( file, "%s\"\n", encoding ); + + fprintf( file, "FULL_NAME \"%s\"\n", font->sf->fullname ); + + if ( font->sf->copyright==NULL ) + fprintf( file, "COPYRIGHT \"\"\n" ); + else { + char *pt = strchr(font->sf->copyright,'\n'), *end; + if ( pt==NULL ) + fprintf( file, "COPYRIGHT \"%s\"\n", font->sf->copyright ); + else { + fprintf( file, "COPYRIGHT \"%.*s\"\n", pt-font->sf->copyright, font->sf->copyright ); + forever { + ++pt; + end = strchr(pt,'\n'); + if ( end==NULL ) { + fprintf( file, "COMMENT %s\n", pt ); + break; + } else + fprintf( file, "COMMENT %.*s\n", end-pt, pt ); + pt = end; + } + } + } + /* Normally this does nothing, but fontforge may be configured to generate */ + /* the obsolete _XFREE86_GLYPH_RANGES property, and if so this will */ + /* generate them */ + GenerateGlyphRanges(font,file); + fprintf( file, "ENDPROPERTIES\n" ); + fprintf( file, "CHARS %d\n", cnt ); +} + +int BDFFontDump(char *filename,BDFFont *font, char *encodingname, int res) { + char buffer[300]; + FILE *file; + int i, enc; + int ret = 0; + + if ( filename==NULL ) { + sprintf(buffer,"%s-%s.%d.bdf", font->sf->fontname, encodingname, font->pixelsize ); + filename = buffer; + } + file = fopen(filename,"w" ); + if ( file==NULL ) + fprintf( stderr, "Can't open %s\n", filename ); + else { + BDFDumpHeader(file,font,encodingname,res); + for ( i=0; icharcnt; ++i ) if ( !IsntBDFChar(font->chars[i])) { + enc = i; + if ( i>=256 && font->sf->encoding_name<=em_first2byte ) + enc = -1; + BDFDumpChar(file,font,font->chars[i],enc); + } + fprintf( file, "ENDFONT\n" ); + if ( ferror(file)) + fprintf( stderr, "Failed to write %s\n", filename ); + else + ret = 1; + fclose(file); + } +return( ret ); +} diff --git a/fontforge/dumppfa.c b/fontforge/dumppfa.c new file mode 100644 index 00000000..09319796 --- /dev/null +++ b/fontforge/dumppfa.c @@ -0,0 +1,2039 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "psfont.h" +#include "splinefont.h" +#ifdef FONTFORGE_CONFIG_TYPE3 + #include /* For image defn */ +#endif + +#ifdef __CygWin + #include + #include + #include +#endif + +extern int autohint_before_generate; + +typedef void (*DumpChar)(int ch,void *data); +struct fileencryptdata { + DumpChar olddump; + void *olddata; + unsigned short r; + int hexline; +}; +#define c1 52845 +#define c2 22719 + +static void encodehex(int plain, void *d) { + struct fileencryptdata *fed = d; + unsigned char cypher = ( plain ^ (fed->r>>8)); + + fed->r = (cypher + fed->r) * c1 + c2; + { + int ch1, ch2; + + ch1 = cypher>>4; + if ( ch1<=9 ) + (fed->olddump)('0'+ch1,fed->olddata); + else + (fed->olddump)('A'-10+ch1,fed->olddata); + ch2 = cypher&0xf; + if ( ch2<=9 ) + (fed->olddump)('0'+ch2,fed->olddata); + else + (fed->olddump)('A'-10+ch2,fed->olddata); + fed->hexline += 2; + if ( fed->hexline>70 ) { + (fed->olddump)('\n',fed->olddata); + fed->hexline = 0; + } + } +} + +static void encodebin(int plain, void *d) { + struct fileencryptdata *fed = d; + unsigned char cypher = ( plain ^ (fed->r>>8)); + + fed->r = (cypher + fed->r) * c1 + c2; + (fed->olddump)(cypher,fed->olddata); +} + +static DumpChar startfileencoding(DumpChar dumpchar,void *data, + struct fileencryptdata *fed,int dobinary) { + static unsigned char randombytes[4] = { 0xaa, 0x55, 0x3e, 0x4d }; + DumpChar func; + + randombytes[0] += 3; + randombytes[1] += 5; + randombytes[2] += 7; + randombytes[3] += 11; + + fed->olddump = dumpchar; + fed->olddata = data; + fed->r = 55665; + fed->hexline = 0; + + if ( dobinary ) { unsigned short r; unsigned char cypher; + while ( 1 ) { + /* find some random bytes where at least one of them encrypts to */ + /* a non hex character */ + r = 55665; + cypher = ( randombytes[0] ^ (fed->r>>8)); + if ( cypher<'0' || (cypher>'9' && cypher<'A') || (cypher>'F' && cypher<'a') || cypher>'f' ) + break; + r = (cypher + r) * c1 + c2; + cypher = ( randombytes[1] ^ (fed->r>>8)); + if ( cypher<'0' || (cypher>'9' && cypher<'A') || (cypher>'F' && cypher<'a') || cypher>'f' ) + break; + r = (cypher + r) * c1 + c2; + cypher = ( randombytes[2] ^ (fed->r>>8)); + if ( cypher<'0' || (cypher>'9' && cypher<'A') || (cypher>'F' && cypher<'a') || cypher>'f' ) + break; + r = (cypher + r) * c1 + c2; + cypher = ( randombytes[3] ^ (fed->r>>8)); + if ( cypher<'0' || (cypher>'9' && cypher<'A') || (cypher>'F' && cypher<'a') || cypher>'f' ) + break; + r = (cypher + r) * c1 + c2; + randombytes[0] += 3; + randombytes[1] += 5; + randombytes[2] += 7; + randombytes[3] += 11; + } + } + + func = dobinary ? encodebin : encodehex; + func(randombytes[0],fed); + func(randombytes[1],fed); + func(randombytes[2],fed); + func(randombytes[3],fed); +return( func ); +} + +/* Encode a string in adobe's format. choose a different set of initial random*/ +/* bytes every time. (the expected value of leniv is 4. we have some support */ +/* for values bigger than 5 but not as much as for values <=4) */ +static void encodestrout(void (*dumpchar)(int ch,void *data), void *data, + unsigned char *value, int len, int leniv) { + unsigned short r = 4330; + unsigned char plain, cypher; + static unsigned char randombytes[10] = { 0xaa, 0x55, 0x3e, 0x4d, 0x89, 0x98, 'a', '4', 0, 0xff }; + + randombytes[0] += 3; + randombytes[1] += 5; + randombytes[2] += 7; + randombytes[3] += 11; + randombytes[4] += 13; + + while ( leniv>0 ) { + plain = randombytes[leniv--%10]; + cypher = ( plain ^ (r>>8)); + r = (cypher + r) * c1 + c2; + dumpchar(cypher,data); + } + while ( len-->0 ) { + plain = *value++; + cypher = ( plain ^ (r>>8)); + r = (cypher + r) * c1 + c2; + dumpchar(cypher,data); + } +} + +static void dumpstr(void (*dumpchar)(int ch,void *data), void *data, const char *buf) { + while ( *buf ) + dumpchar(*buf++,data); +} + +static void dumpcarefully(void (*dumpchar)(int ch,void *data), void *data, const char *buf) { + int ch; + + while ( (ch = *buf++)!='\0' ) { + if ( ch<' ' || ch>=0x7f || ch=='\\' || ch=='(' || ch==')' ) { + dumpchar('\\',data); + dumpchar('0'+(ch>>6),data); + dumpchar('0'+((ch>>3)&0x7),data); + dumpchar('0'+(ch&0x7),data); + } else + dumpchar(ch,data); + } +} + +static void dumpascomments(void (*dumpchar)(int ch,void *data), void *data, const char *buf) { + int ch; + + dumpchar('%',data); + dumpchar(' ',data); + while ( (ch = *buf++)!='\0' ) { + if ( ch=='\n' || ch=='\r' ) { + dumpchar('\n',data); + if ( ch=='\r' && *buf=='\n' ) ++buf; + if ( *buf=='\0' ) +return; + dumpchar('%',data); + dumpchar(' ',data); + } else + dumpchar(ch,data); + } + dumpchar('\n',data); +} + +static void dumpstrn(void (*dumpchar)(int ch,void *data), void *data, char *buf, int n) { + while ( n-->0 ) + dumpchar(*buf++,data); +} + +static void dumpf(void (*dumpchar)(int ch,void *data), void *data, char *format, ...) { + va_list args; + char buffer[300]; + + va_start(args,format); + vsprintf( buffer, format, args); + va_end(args); + dumpstr(dumpchar,data,buffer); +} + +static int isStdEncoding(char *encoding[256]) { + int i; + + for ( i=0; i<256; ++i ) + if ( strcmp(encoding[i],AdobeStandardEncoding[i])!=0 ) +return( 0 ); + +return( 1 ); +} + +#if 0 +static void dumpsubarray(void (*dumpchar)(int ch,void *data), void *data, char *name, + struct pschars *subarr,int leniv) { + int i; + + dumpf(dumpchar,data,"/%s %d array\n", name, subarr->cnt ); + for ( i=0; icnt; ++i ) { + if ( subarr->values[i]==NULL ) + break; + dumpf(dumpchar,data, "dup %d %d RD ", i, subarr->lens[i]+leniv ); + encodestrout(dumpchar,data,subarr->values[i],subarr->lens[i],leniv); + dumpstr(dumpchar,data," NP\n"); + } + dumpstr(dumpchar,data,"ND\n"); +} +#endif + +static void dumpblues(void (*dumpchar)(int ch,void *data), void *data, + char *name, real *arr, int len, char *ND) { + int i; + for ( --len; len>=0 && arr[len]==0.0; --len ); + ++len; + if ( len&1 ) ++len; + dumpf( dumpchar,data,"/%s [",name); + for ( i=0; i=0 && arr[len]==0.0; --len ); + ++len; + dumpf( dumpchar,data,"/%s [",name); + for ( i=0; i=0 && arr[len]==0.0; --len ); + ++len; + dumpf( dumpchar,data,"/%s [",name); + for ( i=0; iprivate,"lenIV"))!=NULL ) + leniv = strtol(pt,NULL,10); + dumpf(dumpchar,data,"/Subrs %d array\n",subrs->next); + for ( i=0; inext; ++i ) { + dumpf(dumpchar,data,"dup %d %d RD ", i, subrs->lens[i]+leniv ); + encodestrout(dumpchar,data,subrs->values[i],subrs->lens[i],leniv); + dumpstr(dumpchar,data," NP\n"); + } + dumpstr(dumpchar,data,"ND\n"); +} + +/* Dumped within the private dict to get access to ND and RD */ +static int dumpcharstrings(void (*dumpchar)(int ch,void *data), void *data, + SplineFont *sf, struct pschars *chars ) { + int leniv = 4; + int i; + char *pt; + + if ( (pt=PSDictHasEntry(sf->private,"lenIV"))!=NULL ) + leniv = strtol(pt,NULL,10); + dumpf(dumpchar,data,"2 index /CharStrings %d dict dup begin\n",chars->cnt); + for ( i=0; inext; ++i ) { + if ( chars->keys[i]==NULL ) + break; + dumpf(dumpchar,data,"/%s %d RD ", chars->keys[i], chars->lens[i]+leniv ); + encodestrout(dumpchar,data,chars->values[i],chars->lens[i],leniv); + dumpstr(dumpchar,data," ND\n"); + if ( !GProgressNext()) +return( false ); + } + dumpstr(dumpchar,data,"end end\nreadonly put\n"); +return( true ); +} + +static void dumpsplineset(void (*dumpchar)(int ch,void *data), void *data, + SplineSet *spl, int pdfopers, int forceclose ) { + SplinePoint *first, *sp; + + for ( ; spl!=NULL; spl=spl->next ) { + first = NULL; + for ( sp = spl->first; ; sp=sp->next->to ) { + if ( first==NULL ) + dumpf( dumpchar, data, "\t%g %g %s\n", sp->me.x, sp->me.y, + pdfopers ? "m" : "moveto" ); + else if ( sp->prev->knownlinear ) + dumpf( dumpchar, data, "\t %g %g %s\n", sp->me.x, sp->me.y, + pdfopers ? "l" : "lineto" ); + else + dumpf( dumpchar, data, "\t %g %g %g %g %g %g %s\n", + sp->prev->from->nextcp.x, sp->prev->from->nextcp.y, + sp->prevcp.x, sp->prevcp.y, + sp->me.x, sp->me.y, + pdfopers ? "c" : "curveto" ); + if ( sp==first ) + break; + if ( first==NULL ) first = sp; + if ( sp->next==NULL ) + break; + } + if ( forceclose || spl->first->prev!=NULL ) + dumpstr( dumpchar, data, pdfopers ? "\th\n" : "\tclosepath\n" ); + } +} + +static int InvertTransform(real inverse[6], real transform[6]) { + real temp[6], val; + int i; + + for ( i=0; i<6; ++i ) temp[i] = transform[i]; + + inverse[0] = inverse[3] = 1; + inverse[1] = inverse[2] = inverse[4] = inverse[5] = 0; + + if ( temp[0]==0 && temp[2]==0 ) +return( false ); /* Not invertable */ + if ( temp[0]==0 ) { + val = temp[0]; temp[0] = temp[2]; temp[2] = val; + val = temp[1]; temp[1] = temp[3]; temp[3] = val; + inverse[0] = inverse[3] = 0; + inverse[1] = inverse[2] = 1; + } + val = 1/temp[0]; + temp[1] *= val; inverse[0] *= val; inverse[1]*=val; + val = temp[2]; + temp[3] -= val*temp[1]; inverse[2] -= val*inverse[0]; inverse[3] -= val*inverse[1]; + val = temp[4]; + temp[5] -= val*temp[1]; inverse[4] -= val*inverse[0]; inverse[5] -= val*inverse[1]; + if ( temp[3]==0 ) +return( false ); + val = 1/temp[3]; + inverse[2] *= val; inverse[3]*=val; + val = temp[1]; + inverse[0] -= val*inverse[2]; inverse[1] -= val*inverse[3]; + val = temp[5]; + inverse[4] -= val*inverse[2]; inverse[5] -= val*inverse[3]; +return( true ); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static void dumpbrush(void (*dumpchar)(int ch,void *data), void *data, + struct brush *brush, int pdfopers ) { + if ( brush->col!=COLOR_INHERITED ) { + int r, g, b; + r = (brush->col>>16)&0xff; + g = (brush->col>>8 )&0xff; + b = (brush->col )&0xff; + if ( r==g && b==g ) + dumpf(dumpchar,data,(pdfopers ? "%g g\n" : "%g setgray\n"), r/255.0 ); + else + dumpf(dumpchar,data,(pdfopers ? "%g %g %g rg\n" : "%g %g %g setrgbcolor\n"), + r/255.0, g/255.0, b/255.0 ); + } +} + +/* Grumble. PDF uses different operators for colors for stroke and fill */ +static void dumppenbrush(void (*dumpchar)(int ch,void *data), void *data, + struct brush *brush, int pdfopers ) { + if ( brush->col!=COLOR_INHERITED ) { + int r, g, b; + r = (brush->col>>16)&0xff; + g = (brush->col>>8 )&0xff; + b = (brush->col )&0xff; + if ( r==g && b==g ) + dumpf(dumpchar,data,(pdfopers ? "%g G\n" : "%g setgray\n"), r/255.0 ); + else + dumpf(dumpchar,data,(pdfopers ? "%g %g %g RG\n" : "%g %g %g setrgbcolor\n"), + r/255.0, g/255.0, b/255.0 ); + } +} + +static void dumppen(void (*dumpchar)(int ch,void *data), void *data, + struct pen *pen, int pdfopers) { + dumppenbrush(dumpchar,data,&pen->brush,pdfopers); + + if ( pen->width!=WIDTH_INHERITED ) + dumpf(dumpchar,data,(pdfopers ? "%g w\n": "%g setlinewidth\n"), pen->width ); + if ( pen->linejoin!=lj_inherited ) + dumpf(dumpchar,data,(pdfopers ? "%d j\n": "%d setlinejoin\n"), pen->linejoin ); + if ( pen->linecap!=lc_inherited ) + dumpf(dumpchar,data,(pdfopers ? "%d J\n": "%d setlinecap\n"), pen->linecap ); + if ( pen->trans[0]!=1.0 || pen->trans[3]!=1.0 || pen->trans[1]!=0 || pen->trans[2]!=0 ) + dumpf(dumpchar,data,(pdfopers ? "[%g %g %g %g 0 0] cm\n" : "[%g %g %g %g 0 0] concat\n"), + pen->trans[0], pen->trans[1], pen->trans[2], pen->trans[3]); +} + +struct psfilter { + int ascii85encode, ascii85n, ascii85bytes_per_line; + void (*dumpchar)(int ch,void *data); + void *data; +}; + +static void InitFilter(struct psfilter *ps,void (*dumpchar)(int ch,void *data), void *data) { + ps->ascii85encode = 0; + ps->ascii85n = 0; + ps->ascii85bytes_per_line = 0; + ps->dumpchar = dumpchar; + ps->data = data; +} + +static void Filter(struct psfilter *ps,uint8 ch) { + ps->ascii85encode = (ps->ascii85encode<<8) | ch; + if ( ++ps->ascii85n == 4 ) { + int ch5, ch4, ch3, ch2, ch1; + uint32 val = ps->ascii85encode; + if ( val==0 ) { + (ps->dumpchar)('z',ps->data); + ps->ascii85n = 0; + if ( ++ps->ascii85bytes_per_line >= 76 ) { + (ps->dumpchar)('\n',ps->data); + ps->ascii85bytes_per_line = 0; + } + } else { + ch5 = val%85; val /= 85; + ch4 = val%85; val /= 85; + ch3 = val%85; val /= 85; + ch2 = val%85; + ch1 = val/85; + dumpf(ps->dumpchar, ps->data, "%c%c%c%c%c", + ch1+'!', ch2+'!', ch3+'!', ch4+'!', ch5+'!' ); + ps->ascii85encode = 0; + ps->ascii85n = 0; + if (( ps->ascii85bytes_per_line+=5) >= 80 ) { + (ps->dumpchar)('\n',ps->data); + ps->ascii85bytes_per_line = 0; + } + } + } +} + +static void FlushFilter(struct psfilter *ps) { + uint32 val = ps->ascii85encode; + int n = ps->ascii85n; + if ( n!=0 ) { + int ch5, ch4, ch3, ch2, ch1; + while ( n++<4 ) + val<<=8; + ch5 = val%85; val /= 85; + ch4 = val%85; val /= 85; + ch3 = val%85; val /= 85; + ch2 = val%85; + ch1 = val/85; + (ps->dumpchar)(ch1+'!',ps->data); + (ps->dumpchar)(ch2+'!',ps->data); + if ( ps->ascii85n>=2 ) + (ps->dumpchar)(ch3+'!',ps->data); + if ( ps->ascii85n>=3 ) + (ps->dumpchar)(ch4+'!',ps->data); + } + (ps->dumpchar)('~',ps->data); + (ps->dumpchar)('>',ps->data); + (ps->dumpchar)('\n',ps->data); +} + +static void RunLengthFilter(struct psfilter *ps,uint8 *pt, int len ) { + uint8 *end = pt+len, *test; + + while ( ptpt+1 ) { + int len = test-pt; + Filter(ps,257-len); + Filter(ps,*pt); + pt = test; + continue; + } + for ( test=pt; test64 && *test==test[1] ) + break; + } + if ( test!=pt ) { + Filter(ps,test-pt-1); + while ( ptbytes_per_line==(base->width+7)/8 ) + RunLengthFilter(&ps,(uint8 *) base->data, base->height*base->bytes_per_line); + else for ( i=0; iheight; ++i ) { + RunLengthFilter(&ps,(uint8 *) (base->data + i*base->bytes_per_line), + (base->width+7)/8); + } + Filter(&ps,0x80); /* EOD mark */ + FlushFilter(&ps); +} + +static void PSDrawMonoImg(void (*dumpchar)(int ch,void *data), void *data, + struct _GImage *base,int use_imagemask) { + + dumpf(dumpchar,data, "<<\n" ); + dumpf(dumpchar,data, " /ImageType 1\n" ); + dumpf(dumpchar,data, " /Width %d\n", base->width ); + dumpf(dumpchar,data, " /Height %d\n", base->height ); + dumpf(dumpchar,data, " /ImageMatrix [%d 0 0 %d 0 %d]\n", + base->width, -base->height, base->height); + dumpf(dumpchar,data, " /MultipleDataSources false\n" ); + dumpf(dumpchar,data, " /BitsPerComponent 1\n" ); + if ( base->trans != COLOR_UNKNOWN ) { + if ( base->trans==0 ) + dumpf(dumpchar,data, " /Decode [1 0]\n" ); + else + dumpf(dumpchar,data, " /Decode [0 1]\n" ); + } else { + dumpf(dumpchar,data, " /Decode [0 1]\n" ); + } + dumpf(dumpchar,data, " /Interpolate true\n" ); + dumpf(dumpchar,data, " /DataSource currentfile /ASCII85Decode filter /RunLengthDecode filter\n" ); + dumpf(dumpchar,data, ">> %s\n", + use_imagemask?"imagemask":"image" ); + PSBuildImageMonoString(dumpchar,data,base); +} + +static void PSSetIndexColors(void (*dumpchar)(int ch,void *data), void *data, + GClut *clut) { + int i; + + dumpf(dumpchar,data, "[/Indexed /DeviceRGB %d <\n", clut->clut_len-1 ); + for ( i=0; iclut_len; ++i ) + dumpf(dumpchar,data, "%02X%02X%02X%s", COLOR_RED(clut->clut[i]), + COLOR_GREEN(clut->clut[i]), COLOR_BLUE(clut->clut[i]), + i%11==10?"\n":" "); + dumpf(dumpchar,data,">\n] setcolorspace\n"); +} + +static void PSBuildImageIndexString(void (*dumpchar)(int ch,void *data), void *data, + struct _GImage *base) { + register int i; + register uint8 *pt, *end; + int clut_len = base->clut->clut_len; + struct psfilter ps; + + for ( pt=base->data, end = pt+base->height*base->bytes_per_line; pt=clut_len ) *pt = clut_len-1; + + InitFilter(&ps,dumpchar,data); + if ( base->bytes_per_line==base->width ) + RunLengthFilter(&ps,(uint8 *) base->data, base->height*base->bytes_per_line); + else for ( i=0; iheight; ++i ) { + RunLengthFilter(&ps,(uint8 *) (base->data + i*base->bytes_per_line), + base->width); + } + Filter(&ps,0x80); /* EOD mark */ + FlushFilter(&ps); +} + +static void PSBuildImageIndexDict(void (*dumpchar)(int ch,void *data), void *data, + struct _GImage *base) { + dumpf(dumpchar,data, "<<\n" ); + dumpf(dumpchar,data, " /ImageType 1\n" ); + dumpf(dumpchar,data, " /Width %d\n", base->width ); + dumpf(dumpchar,data, " /Height %d\n", base->height ); + dumpf(dumpchar,data, " /ImageMatrix [%d 0 0 %d 0 %d]\n", + base->width, -base->height, base->height); + dumpf(dumpchar,data, " /MultipleDataSources false\n" ); + dumpf(dumpchar,data, " /BitsPerComponent 8\n" ); + dumpf(dumpchar,data, " /Decode [0 255]\n" ); + dumpf(dumpchar,data, " /Interpolate false\n" ); + dumpf(dumpchar,data, " /DataSource currentfile /ASCII85Decode filter\n" ); + dumpf(dumpchar,data, ">> image\n" ); + PSBuildImageIndexString(dumpchar,data,base); +} + +static void PSBuildImage24String(void (*dumpchar)(int ch,void *data), void *data, + struct _GImage *base) { + int i; + register long val; + register uint32 *pt, *end; + struct psfilter ps; + + InitFilter(&ps,dumpchar,data); + for ( i=0; iheight; ++i ) { + pt = (uint32 *) (base->data + i*base->bytes_per_line); + end = pt + base->width; + while ( ptimage_type == it_index ) { + PSSetIndexColors(dumpchar,data,base->clut); + PSBuildImageIndexDict(dumpchar,data,base); + dumpf(dumpchar,data, "[/DeviceRGB] setcolorspace\n" ); + } else { + dumpf(dumpchar,data, "%d %d 8 [%d 0 0 %d 0 %d] ", + base->width, base->height, base->width, -base->height, base->height); + dumpf(dumpchar,data, "currentfile /ASCII85Decode filter " ); + dumpf(dumpchar,data, "false 3 colorimage\n" ); + PSBuildImage24String(dumpchar,data,base); + } +} + +static void dumpimage(void (*dumpchar)(int ch,void *data), void *data, + ImageList *imgl, int use_imagemask, int pdfopers ) { + GImage *image = imgl->image; + struct _GImage *base = image->list_len==0?image->u.image:image->u.images[0]; + if ( pdfopers ) /* I'm not supporting images yet */ +return; + + dumpf( dumpchar, data, " gsave %g %g translate %g %g scale\n", + imgl->xoff, imgl->yoff-imgl->yscale*base->height, + imgl->xscale*base->width, imgl->yscale*base->height ); + if ( base->image_type==it_mono ) { + PSDrawMonoImg(dumpchar,data,base,use_imagemask); + } else { + /* Just draw the image, ignore the complexity of transparent images */ + PSDrawImg(dumpchar,data,base); + } + dumpstr(dumpchar,data,"grestore\n"); +} +#endif + +void SC_PSDump(void (*dumpchar)(int ch,void *data), void *data, + SplineChar *sc, int refs_to_splines, int pdfopers ) { + RefChar *ref; + real inverse[6]; + int i,j; + SplineSet *temp; + + for ( i=ly_fore; ilayer_cnt; ++i ) { + if ( sc->layers[i].splines!=NULL ) { + temp = sc->layers[i].splines; + if ( sc->parent->order2 ) temp = SplineSetsPSApprox(temp); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer ) { + dumpstr(dumpchar,data,pdfopers ? "q" : "gsave " ); + dumpsplineset(dumpchar,data,temp,pdfopers,sc->layers[i].dofill); + if ( sc->layers[i].dofill && sc->layers[i].dostroke ) { + if ( pdfopers ) { + dumpbrush(dumpchar,data, &sc->layers[i].fill_brush,pdfopers); + dumppen(dumpchar,data, &sc->layers[i].stroke_pen,pdfopers); + dumpstr(dumpchar,data, "B " ); + } else if ( sc->layers[i].fillfirst ) { + dumpstr(dumpchar,data, "gsave " ); + dumpbrush(dumpchar,data, &sc->layers[i].fill_brush,pdfopers); + dumpstr(dumpchar,data,"fill grestore " ); + dumppen(dumpchar,data, &sc->layers[i].stroke_pen,pdfopers); + dumpstr(dumpchar,data,"stroke " ); + } else { + dumpstr(dumpchar,data, "gsave " ); + dumppen(dumpchar,data, &sc->layers[i].stroke_pen,pdfopers); + dumpstr(dumpchar,data,"stroke grestore " ); + dumpbrush(dumpchar,data, &sc->layers[i].fill_brush,pdfopers); + dumpstr(dumpchar,data,"fill " ); + } + } else if ( sc->layers[i].dofill ) { + dumpbrush(dumpchar,data, &sc->layers[i].fill_brush,pdfopers); + dumpstr(dumpchar,data,pdfopers ? "f ": "fill " ); + } else if ( sc->layers[i].dostroke ) { + dumppen(dumpchar,data, &sc->layers[i].stroke_pen,pdfopers); + dumpstr(dumpchar,data, pdfopers ? "S ": "stroke " ); + } + dumpstr(dumpchar,data,pdfopers ? "Q\n" : "grestore\n" ); + } else +#endif + dumpsplineset(dumpchar,data,temp,pdfopers,true); + if ( sc->parent->order2 ) SplinePointListFree(temp); + } + if ( sc->layers[i].refs!=NULL ) { +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer ) { + dumpstr(dumpchar,data,pdfopers ? "q" : "gsave " ); + if ( sc->layers[i].dofill ) + dumpbrush(dumpchar,data, &sc->layers[i].fill_brush, pdfopers); + } +#endif + if ( refs_to_splines ) { + for ( ref = sc->layers[i].refs; ref!=NULL; ref=ref->next ) { + for ( j=0; jlayer_cnt; ++j ) { + temp = ref->layers[j].splines; + if ( sc->parent->order2 ) temp = SplineSetsPSApprox(temp); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer ) { + dumpstr(dumpchar,data,pdfopers ? "q" : "gsave " ); + dumpsplineset(dumpchar,data,temp,pdfopers,ref->layers[j].dofill); + if ( ref->layers[j].dofill && ref->layers[j].dostroke ) { + if ( pdfopers ) { + dumpbrush(dumpchar,data, &ref->layers[j].fill_brush,pdfopers); + dumppen(dumpchar,data, &ref->layers[j].stroke_pen,pdfopers); + dumpstr(dumpchar,data, "B " ); + } else if ( ref->layers[j].fillfirst ) { + dumpstr(dumpchar,data, "gsave " ); + dumpbrush(dumpchar,data, &ref->layers[j].fill_brush,pdfopers); + dumpstr(dumpchar,data,"fill grestore " ); + dumppen(dumpchar,data, &ref->layers[j].stroke_pen,pdfopers); + dumpstr(dumpchar,data,"stroke " ); + } else { + dumpstr(dumpchar,data, "gsave " ); + dumppen(dumpchar,data, &ref->layers[j].stroke_pen,pdfopers); + dumpstr(dumpchar,data,"stroke grestore " ); + dumpbrush(dumpchar,data, &ref->layers[j].fill_brush,pdfopers); + dumpstr(dumpchar,data,"fill " ); + } + } else if ( ref->layers[j].dofill ) { + dumpbrush(dumpchar,data, &ref->layers[j].fill_brush,pdfopers); + dumpstr(dumpchar,data,pdfopers ? "f ": "fill " ); + } else if ( ref->layers[j].dostroke ) { + dumppen(dumpchar,data, &ref->layers[j].stroke_pen,pdfopers); + dumpstr(dumpchar,data, pdfopers ? "S ": "stroke " ); + } + dumpstr(dumpchar,data,pdfopers ? "Q\n" : "grestore\n" ); + } else +#endif + dumpsplineset(dumpchar,data,temp,pdfopers,true); + if ( sc->parent->order2 ) SplinePointListFree(temp); + } + } + } else { + dumpstr(dumpchar,data," pop -1\n" ); + for ( ref = sc->layers[i].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]!=1 || ref->transform[1]!=0 || ref->transform[2]!=0 || + ref->transform[3]!=1 || ref->transform[4]!=0 || ref->transform[5]!=0 ) { + if ( InvertTransform(inverse,ref->transform)) { + if ( ref->transform[0]!=1 || ref->transform[1]!=0 || + ref->transform[2]!=0 || ref->transform[3]!=1 ) + dumpf(dumpchar,data, " [ %g %g %g %g %g %g ] concat ", + ref->transform[0], ref->transform[1], ref->transform[2], + ref->transform[3], ref->transform[4], ref->transform[5]); + else + dumpf(dumpchar,data, " %g %g translate ", + ref->transform[4], ref->transform[5]); + dumpf(dumpchar,data, "1 index /CharProcs get /%s get exec ", + ref->sc->name ); + if ( inverse[0]!=1 || inverse[1]!=0 || + inverse[2]!=0 || inverse[3]!=1 ) + dumpf(dumpchar,data, "[ %g %g %g %g %g %g ] concat \n", + inverse[0], inverse[1], inverse[2], inverse[3], inverse[4], inverse[5] + ); + else + dumpf(dumpchar,data, "%g %g translate\n", + inverse[4], inverse[5] ); + } + } else + dumpf(dumpchar,data, " 1 index /CharProcs get /%s get exec\n", ref->sc->name ); + } + } +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer ) + dumpstr(dumpchar,data,pdfopers ? "Q\n" : "grestore\n" ); +#endif + } +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->layers[i].images!=NULL && !pdfopers ) { ImageList *img; + dumpstr(dumpchar,data,"gsave " ); + if ( sc->layers[i].dofill ) + dumpbrush(dumpchar,data, &sc->layers[i].fill_brush,pdfopers); + for ( img = sc->layers[i].images; img!=NULL; img=img->next ) + dumpimage(dumpchar,data,img,sc->layers[i].dofill,pdfopers); + dumpstr(dumpchar,data,"grestore\n" ); + } +#endif + } +} + +static void dumpproc(void (*dumpchar)(int ch,void *data), void *data, SplineChar *sc ) { + DBounds b; + + SplineCharFindBounds(sc,&b); + dumpf(dumpchar,data," /%s { ",sc->name); + if ( sc->dependents!=NULL ) + dumpstr(dumpchar,data,"dup -1 ne { "); + dumpf(dumpchar,data,"%d 0 %d %d %d %d setcachedevice", + (int) sc->width, (int) floor(b.minx), (int) floor(b.miny), + (int) ceil(b.maxx), (int) ceil(b.maxy) ); + if ( sc->dependents!=NULL ) + dumpstr(dumpchar,data," } if\n"); + else + dumpstr(dumpchar,data,"\n"); + SC_PSDump(dumpchar,data,sc,false,false); + dumpstr(dumpchar,data," } bind def\n" ); +} + +static int dumpcharprocs(void (*dumpchar)(int ch,void *data), void *data, SplineFont *sf ) { + /* for type 3 fonts */ + int cnt, i; + + cnt = 0; + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && strcmp(sf->chars[i]->name,".notdef")!=0 ) + ++cnt; + ++cnt; /* one notdef entry */ + + dumpf(dumpchar,data,"/CharProcs %d dict def\nCharProcs begin\n", cnt ); + i = 0; + if ( SCWorthOutputting(sf->chars[0]) && SCIsNotdef(sf->chars[0],-1 )) + dumpproc(dumpchar,data,sf->chars[i++]); + else + dumpf(dumpchar, data, " /.notdef { %d 0 0 0 0 0 setcachedevice } bind def\n", + sf->ascent+sf->descent ); + for ( ; icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) ) + dumpproc(dumpchar,data,sf->chars[i]); + if ( !GProgressNext()) +return( false ); + } + dumpstr(dumpchar,data,"end\ncurrentdict end\n" ); + dumpf(dumpchar, data, "/%s exch definefont\n", sf->fontname ); +return( true ); +} + +static struct pschars *initsubrs(int needsflex,MMSet *mm) { + extern const uint8 *const subrs[10]; + extern const int subrslens[10]; + int i; + struct pschars *sub; + + sub = gcalloc(1,sizeof(struct pschars)); + sub->cnt = 10; + sub->lens = galloc(10*sizeof(int)); + sub->values = galloc(10*sizeof(uint8 *)); + for ( i=0; i<5; ++i ) { + ++sub->next; + sub->values[i] = (uint8 *) copyn((const char *) subrs[i],subrslens[i]); + sub->lens[i] = subrslens[i]; + } + if ( mm!=NULL ) { + static int cnts[] = { 1,2,3,4,6 }; + for ( ; i<10 && cnts[i-5]*mm->instance_count<22; ++i ) { + ++sub->next; + sub->values[i] = (uint8 *) copyn((const char *) subrs[i],subrslens[i]); + sub->values[i][0] += cnts[i-5]*mm->instance_count; + sub->lens[i] = subrslens[i]; + } + } +return( sub ); +} + +static void dumpothersubrs(void (*dumpchar)(int ch,void *data), void *data, + int incid, int needsflex, int needscounters, MMSet *mm ) { + extern const char *othersubrs[]; + extern const char *othersubrsnoflex[]; + extern const char *othersubrscounters[]; + extern const char *othersubrsnocounters[]; + extern const char *othersubrsend[]; + extern const char *cid_othersubrs[]; + int i; + const char **subs; + + dumpstr(dumpchar,data,"/OtherSubrs \n" ); + subs = incid ? cid_othersubrs : needsflex ? othersubrs : othersubrsnoflex; + for ( i=0; subs[i]!=NULL; ++i ) { + dumpstr(dumpchar,data,subs[i]); + dumpchar('\n',data); + } + if (!incid) { + if ( needscounters ) { + for ( i=0; othersubrscounters[i]!=NULL; ++i ) { + dumpstr(dumpchar,data,othersubrscounters[i]); + dumpchar('\n',data); + } + } else if ( mm!=NULL ) { + for ( i=0; othersubrsnocounters[i]!=NULL; ++i ) { + dumpstr(dumpchar,data,othersubrsnocounters[i]); + dumpchar('\n',data); + } + } + if ( mm!=NULL ) { + /* the code for the multiple master subroutines depends on */ + /* the number of font instances, so we can't just blithely copy */ + /* an example from Adobe (and they don't provide one anyway) */ + dumpf(dumpchar, data, "{ %d 1 roll $Blend } bind\n", mm->instance_count ); + if ( 2*mm->instance_count<22 ) + dumpf(dumpchar, data, "{ exch %d %d roll $Blend exch %d 2 roll $Blend } bind\n", + 2*mm->instance_count, 1-mm->instance_count, + mm->instance_count+1); + if ( 3*mm->instance_count<22 ) + dumpf(dumpchar, data, "{ 3 -1 roll %d %d roll $Blend 3 -1 roll %d %d roll $Blend 3 -1 roll %d 2 roll $Blend } bind\n", + 3*mm->instance_count, 1-mm->instance_count, + 2*mm->instance_count+1, 1-mm->instance_count, + mm->instance_count+2); + if ( 4*mm->instance_count<22 ) + dumpf(dumpchar, data, "{ 4 -1 roll %d %d roll $Blend 4 -1 roll %d %d roll $Blend 4 -1 roll %d %d roll $Blend 4 -1 roll %d 3 roll $Blend } bind\n", + 4*mm->instance_count, 1-mm->instance_count, + 3*mm->instance_count+1, 1-mm->instance_count, + 2*mm->instance_count+2, 1-mm->instance_count, + mm->instance_count+3); + if ( 6*mm->instance_count<22 ) + dumpf(dumpchar, data, "{ 6 -1 roll %d %d roll $Blend 6 -1 roll %d %d roll $Blend 6 -1 roll %d %d roll $Blend 6 -1 roll %d %d roll $Blend 6 -1 roll %d %d roll $Blend 6 -1 roll %d 5 roll $Blend } bind\n", + 6*mm->instance_count, 1-mm->instance_count, + 5*mm->instance_count+1, 1-mm->instance_count, + 4*mm->instance_count+2, 1-mm->instance_count, + 3*mm->instance_count+3, 1-mm->instance_count, + 2*mm->instance_count+4, 1-mm->instance_count, + mm->instance_count+5); + } + for ( i=0; othersubrsend[i]!=NULL; ++i ) { + dumpstr(dumpchar,data,othersubrsend[i]); + dumpchar('\n',data); + } + } + dumpstr(dumpchar,data,incid?"def\n":"ND\n" ); +} + +static char *dumptospace(void (*dumpchar)(int ch,void *data), void *data, + char *str) { + + while ( *str!=' ' && *str!=']' && *str!='\0' ) + dumpchar(*str++,data); +return( str ); +} + +static void dumpmmprivatearr(void (*dumpchar)(int ch,void *data), void *data, + char *privates[16], int instance_count) { + int j; + + for ( j=0; jinstances[0]->private; + + if ( private==NULL ) +return; + + dumpstr(dumpchar,data,"3 index /Blend get /Private get begin\n"); + for ( k=0; knext; ++k ) { + privates[0] = private->values[k]; + missing = false; allsame = true; + for ( j=1; jinstance_count; ++j ) { + privates[j] = PSDictHasEntry(mm->instances[j]->private,private->keys[k]); + if ( privates[j]==NULL ) { + missing = true; + break; + } else if ( strcmp(privates[j],privates[0])!=0 ) + allsame = false; + } + if ( missing || allsame ) + continue; + dumpf(dumpchar,data," /%s ", private->keys[k]); + dumpmmprivatearr(dumpchar,data,privates,mm->instance_count); + dumpstr(dumpchar,data, " def\n" ); + } + dumpstr(dumpchar,data,"end\n"); +} + +static int dumpprivatestuff(void (*dumpchar)(int ch,void *data), void *data, + SplineFont *sf, struct fddata *incid, int flags, enum fontformat format ) { + int cnt, mi; + real bluevalues[14], otherblues[10]; + real snapcnt[12]; + real stemsnaph[12], stemsnapv[12]; + real stdhw[1], stdvw[1]; + int flex_max; + int i; + int hasblue=0, hash=0, hasv=0, hasshift, hasxuid, hasbold, haslg; + int isbold=false; + int iscjk; + struct pschars *subrs, *chars; + char *ND="def"; + MMSet *mm = (format==ff_mma || format==ff_mmb)? sf->mm : NULL; + + if ( incid==NULL ) { + flex_max = SplineFontIsFlexible(sf,flags); + if ( (subrs = initsubrs(flex_max>0,mm))==NULL ) +return( false ); + iscjk = SFIsCJK(sf); + } else { + flex_max = incid->flexmax; + iscjk = incid->iscjk; + } + + hasbold = PSDictHasEntry(sf->private,"ForceBold")!=NULL; + hasblue = PSDictHasEntry(sf->private,"BlueValues")!=NULL; + hash = PSDictHasEntry(sf->private,"StdHW")!=NULL; + hasv = PSDictHasEntry(sf->private,"StdVW")!=NULL; + hasshift = PSDictHasEntry(sf->private,"BlueShift")!=NULL; + hasxuid = PSDictHasEntry(sf->private,"XUID")!=NULL; + haslg = PSDictHasEntry(sf->private,"LanguageGroup")!=NULL; + if ( sf->weight!=NULL && + (strstrmatch(sf->weight,"Bold")!=NULL || + strstrmatch(sf->weight,"Black")!=NULL)) + isbold = true; + + GProgressChangeStages(2+2-hasblue); + if ( autohint_before_generate && SFNeedsAutoHint(sf) && + !(flags&ps_flag_nohints)) { + GProgressChangeLine1R(_STR_AutoHintingFont); + SplineFontAutoHint(sf); + } + if ( !GProgressNextStage()) +return( false ); + + if ( !hasblue ) { + FindBlues(sf,bluevalues,otherblues); + if ( !GProgressNextStage()) +return( false ); + } + + if ( !hash || !hasv ) + stdhw[0] = stdvw[0] = 0; + if ( !hash ) { + FindHStems(sf,stemsnaph,snapcnt); + mi = -1; + for ( i=0; stemsnaph[i]!=0 && i<12; ++i ) + if ( mi==-1 ) mi = i; + else if ( snapcnt[i]>snapcnt[mi] ) mi = i; + if ( mi!=-1 ) stdhw[0] = stemsnaph[mi]; + } + + if ( !hasv ) { + FindVStems(sf,stemsnapv,snapcnt); + mi = -1; + for ( i=0; stemsnapv[i]!=0 && i<12; ++i ) + if ( mi==-1 ) mi = i; + else if ( snapcnt[i]>snapcnt[mi] ) mi = i; + if ( mi!=-1 ) stdvw[0] = stemsnapv[mi]; + } + + if ( incid==NULL ) { + GProgressNextStage(); + GProgressChangeLine1R(_STR_CvtPS); + if ( (chars = SplineFont2Chrs(sf,iscjk,subrs,flags,format))==NULL ) +return( false ); + GProgressNextStage(); + GProgressChangeLine1R(_STR_SavingPSFont); + } + + if ( incid==NULL ) dumpstr(dumpchar,data,"dup\n"); + cnt = 0; + if ( !hasblue ) ++cnt; /* bluevalues is required, but might be in private */ + if ( !hasshift && flex_max>=7 ) ++cnt; /* BlueShift needs to be specified if flex wants something bigger than default */ + ++cnt; /* minfeature is required */ + if ( !hasblue && (otherblues[0]!=0 || otherblues[1]!=0) ) ++cnt; + ++cnt; /* password is required */ + if ( sf->tempuniqueid!=0 ) + ++cnt; /* UniqueID should be in both private and public areas */ + if ( incid==NULL ) { + ++cnt; /* nd is required */ + ++cnt; /* np is required */ + ++cnt; /* rd is required */ + } + if ( !haslg && iscjk ) ++cnt; + if ( !hash ) { + if ( stdhw[0]!=0 ) ++cnt; + if ( stemsnaph[0]!=0 ) ++cnt; + } + if ( !hasv ) { + if ( stdvw[0]!=0 ) ++cnt; + if ( stemsnapv[0]!=0 ) ++cnt; + } + cnt += sf->private!=NULL?sf->private->next:0; + if ( incid==NULL ) { + ++cnt; /* Subrs entry */ + ++cnt; /* Other Subrs */ + } else { + cnt += 3; /* subrmap, etc. */ + ++cnt; /* Other Subrs */ + } + if ( flex_max>0 ) ++cnt; + if ( hasbold || isbold ) ++cnt; + + dumpf(dumpchar,data,"/Private %d dict dup begin\n", cnt ); + /* These guys are required and fixed */ + if ( incid==NULL ) { + dumpstr(dumpchar,data,"/RD{string currentfile exch readstring pop}executeonly def\n" ); + dumpstr(dumpchar,data,"/ND{noaccess def}executeonly def\n" ); + dumpstr(dumpchar,data,"/NP{noaccess put}executeonly def\n" ); + ND = "ND"; + } + dumpf(dumpchar,data,"/MinFeature{16 16}%s\n", ND ); + dumpstr(dumpchar,data,"/password 5839 def\n" ); + if ( !hasblue ) { + dumpblues(dumpchar,data,"BlueValues",bluevalues,14,ND); + if ( otherblues[0]!=0 || otherblues[1]!=0 ) + dumpblues(dumpchar,data,"OtherBlues",otherblues,10,ND); + } + if ( !hash ) { + if ( stdhw[0]!=0 ) + dumpf(dumpchar,data,"/StdHW [%g] %s\n", stdhw[0], ND ); + if ( stemsnaph[0]!=0 ) + dumpdblmaxarray(dumpchar,data,"StemSnapH",stemsnaph,12,"", ND); + } + if ( !hasv ) { + if ( stdvw[0]!=0 ) + dumpf(dumpchar,data,"/StdVW [%g] %s\n", stdvw[0],ND ); + if ( stemsnapv[0]!=0 ) + dumpdblmaxarray(dumpchar,data,"StemSnapV",stemsnapv,12,"", ND); + } + if ( !hasshift && flex_max>=7 ) + dumpf(dumpchar,data,"/BlueShift %d def\n", flex_max+1 ); + if ( isbold && !hasbold ) + dumpf(dumpchar,data,"/ForceBold true def\n" ); + if ( !haslg && iscjk ) + dumpf(dumpchar,data,"/LanguageGroup 1 def\n" ); + if ( sf->tempuniqueid!=0 && sf->tempuniqueid!=-1 ) + dumpf(dumpchar,data,"/UniqueID %d def\n", sf->tempuniqueid ); + if ( sf->private!=NULL ) { + for ( i=0; iprivate->next; ++i ) { + dumpf(dumpchar,data,"/%s ", sf->private->keys[i]); + dumpstr(dumpchar,data,sf->private->values[i]); + if ( strcmp(sf->private->keys[i],"BlueValues")==0 || + strcmp(sf->private->keys[i],"OtherBlues")==0 || + strcmp(sf->private->keys[i],"StdHW")==0 || + strcmp(sf->private->keys[i],"StdVW")==0 || + strcmp(sf->private->keys[i],"StemSnapH")==0 || + strcmp(sf->private->keys[i],"StemSnapV")==0 ) + dumpf(dumpchar,data," %s\n", ND); + else + dumpstr(dumpchar,data," def\n"); + } + } + + if ( mm!=NULL ) + dumpmmprivate(dumpchar,data,mm); + + dumpothersubrs(dumpchar,data,incid!=NULL,flex_max>0,iscjk,mm); + if ( incid!=NULL ) { + dumpf(dumpchar,data," /SubrMapOffset %d def\n", incid->subrmapoff ); + dumpf(dumpchar,data," /SDBytes %d def\n", incid->sdbytes ); + dumpf(dumpchar,data," /SubrCount %d def\n", incid->subrcnt ); + dumpstr(dumpchar,data,"end def\n"); + } else { + dumpsubrs(dumpchar,data,sf,subrs); + dumpcharstrings(dumpchar,data,sf, chars ); + dumpstr(dumpchar,data,"put\n"); + + PSCharsFree(chars); + PSCharsFree(subrs); + } + + GProgressChangeStages(1); +return( true ); +} + +static void dumpfontinfo(void (*dumpchar)(int ch,void *data), void *data, SplineFont *sf, + enum fontformat format) { + int cnt; + + cnt = 0; + if ( sf->familyname!=NULL ) ++cnt; + if ( sf->fullname!=NULL ) ++cnt; + if ( sf->copyright!=NULL ) ++cnt; + if ( sf->weight!=NULL ) ++cnt; + if ( sf->pfminfo.fstype!=-1 ) ++cnt; + if ( sf->subfontcnt==0 ) { + if ( sf->version!=NULL ) ++cnt; + ++cnt; /* ItalicAngle */ + ++cnt; /* isfixedpitch */ + if ( sf->upos!=0 ) ++cnt; + if ( sf->uwidth!=0 ) ++cnt; + /* Fontographer also generates em, ascent and descent */ + /* em is redundant, we can get that from the fontmatrix */ + /* given em we only need one of ascent or descent */ + /* On the off chance that fontlab objects to them let's not generate them */ + if ( sf->ascent != 8*(sf->ascent+sf->descent)/10 ) + ++cnt; /* ascent */ +#if 0 + ++cnt; /* em */ + ++cnt; /* descent */ +#endif + } + if ( format==ff_mma || format==ff_mmb ) + cnt += 3; + + dumpf(dumpchar,data,"/FontInfo %d dict dup begin\n", cnt ); + if ( sf->subfontcnt==0 && sf->version ) + dumpf(dumpchar,data," /version (%s) readonly def\n", sf->version ); + if ( sf->copyright ) { + dumpf(dumpchar,data," /Notice ("); + dumpcarefully(dumpchar,data,sf->copyright); + dumpf(dumpchar,data,") readonly def\n" ); + if ( strchr(sf->copyright,'\n')!=NULL || strchr(sf->copyright,'\r')!=NULL ) + dumpascomments(dumpchar,data,sf->copyright); + } + if ( sf->fullname ) { + dumpf(dumpchar,data," /FullName (" ); + dumpcarefully(dumpchar,data,sf->fullname); + dumpf(dumpchar,data,") readonly def\n" ); + } + if ( sf->familyname ) { + dumpf(dumpchar,data," /FamilyName (" ); + dumpcarefully(dumpchar,data,sf->familyname); + dumpf(dumpchar,data,") readonly def\n" ); + } + if ( sf->weight ) + dumpf(dumpchar,data," /Weight (%s) readonly def\n", sf->weight ); + if ( sf->pfminfo.fstype!=-1 ) + dumpf(dumpchar,data," /FSType %d def\n", sf->pfminfo.fstype ); + if ( sf->subfontcnt==0 ) { + dumpf(dumpchar,data," /ItalicAngle %g def\n", sf->italicangle ); + dumpf(dumpchar,data," /isFixedPitch %s def\n", SFOneWidth(sf)!=-1?"true":"false" ); + if ( sf->upos ) + dumpf(dumpchar,data," /UnderlinePosition %g def\n", sf->upos ); + if ( sf->uwidth ) + dumpf(dumpchar,data," /UnderlineThickness %g def\n", sf->uwidth ); + if ( sf->ascent != 8*(sf->ascent+sf->descent)/10 ) + dumpf(dumpchar,data," /ascent %d def\n", sf->ascent ); +#if 0 + dumpf(dumpchar,data," /em %d def\n", sf->ascent+sf->descent ); + dumpf(dumpchar,data," /descent %d def\n", sf->descent ); +#endif + } + if ( format==ff_mma || format==ff_mmb ) { + MMSet *mm = sf->mm; + int j,k; + + dumpstr(dumpchar,data," /BlendDesignPositions [" ); + for ( j=0; jinstance_count; ++j ) { + dumpstr(dumpchar,data," [" ); + for ( k=0; kaxis_count; ++k ) + dumpf(dumpchar,data,"%g ", mm->positions[j*mm->axis_count+k]); + dumpstr(dumpchar,data,"]" ); + } + dumpstr(dumpchar,data," ] def\n" ); + + dumpstr(dumpchar,data," /BlendDesignMap [" ); + for ( k=0; kaxis_count; ++k ) { + dumpstr(dumpchar,data," [" ); + for ( j=0; jaxismaps[k].points; ++j ) + dumpf(dumpchar,data,"[%g %g] ", + mm->axismaps[k].designs[j], mm->axismaps[k].blends[j]); + dumpstr(dumpchar,data,"]" ); + } + dumpstr(dumpchar,data," ] def\n" ); + + dumpstr(dumpchar,data," /BlendAxisTypes [" ); + for ( k=0; kaxis_count; ++k ) + dumpf(dumpchar,data,"/%s ", mm->axes[k]); + dumpstr(dumpchar,data," ] def\n" ); + } + dumpstr(dumpchar,data,"end readonly def\n"); +} + +const char *GetAuthor(void) { + struct passwd *pwd; + static char author[200] = { '\0' }; + const char *ret = NULL, *pt; + + if ( author[0]!='\0' ) +return( author ); + +/* Can all be commented out if no pwd routines */ + pwd = getpwuid(getuid()); +#ifndef __VMS + if ( pwd!=NULL && pwd->pw_gecos!=NULL && *pwd->pw_gecos!='\0' ) { + strncpy(author,pwd->pw_gecos,sizeof(author)); + author[sizeof(author)-1] = '\0'; + ret = author; + } else if ( pwd!=NULL && pwd->pw_name!=NULL && *pwd->pw_name!='\0' ) { +#else + if ( pwd!=NULL && pwd->pw_name!=NULL && *pwd->pw_name!='\0' ) { +#endif + strncpy(author,pwd->pw_name,sizeof(author)); + author[sizeof(author)-1] = '\0'; + ret = author; + } else if ( (pt=getenv("USER"))!=NULL ) { + strncpy(author,pt,sizeof(author)); + author[sizeof(author)-1] = '\0'; + ret = author; + } + endpwent(); +/* End comment */ +return( ret ); +} + +static void dumprequiredfontinfo(void (*dumpchar)(int ch,void *data), void *data, + SplineFont *sf, int format ) { + int cnt, i; + time_t now; + double fm[6]; + char *encoding[256]; + DBounds b; + int uniqueid; + const char *author = GetAuthor(); + + dumpf(dumpchar,data,"%%!PS-AdobeFont-1.0: %s %s\n", sf->fontname, sf->version?sf->version:"" ); + time(&now); + dumpf(dumpchar,data,"%%%%Title: %s\n", sf->fontname); + dumpf(dumpchar,data,"%%%%CreationDate: %s", ctime(&now)); + if ( author!=NULL ) + dumpf(dumpchar,data,"%%%%Creator: %s\n", author); + if ( format==ff_ptype0 && (sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4)) + dumpf(dumpchar,data,"%%%%DocumentNeededResources: font ZapfDingbats\n" ); + dumpf(dumpchar,data, "%%%%DocumentSuppliedResources: font %s\n", sf->fontname ); + if ( sf->copyright!=NULL ) { + char *pt = strchr(sf->copyright,'\n'); + if ( pt==NULL ) pt = sf->copyright + strlen(sf->copyright); + if ( pt-sf->copyright>70 ) pt = sf->copyright+70; + dumpf(dumpchar,data,"%% %.*s\n", pt-sf->copyright, sf->copyright ); + } + if ( sf->comments!=NULL ) + dumpascomments(dumpchar,data,sf->comments); + dumpstr(dumpchar,data,"% Generated by FontForge 1.0 (http://fontforge.sf.net/)\n"); + dumpstr(dumpchar,data,"%%EndComments\n"); + + cnt = 0; + ++cnt; /* FID, added by definefont and not by us */ + ++cnt; /* fonttype */ + ++cnt; /* fontmatrix */ + if ( sf->fontname!=NULL ) ++cnt; + ++cnt; /* fontinfo */ + ++cnt; /* encoding */ + ++cnt; /* fontbb */ + if ( sf->uniqueid!=-1 ) ++cnt; + ++cnt; /* painttype */ + if ( format==ff_ptype3 ) { + ++cnt; /* charprocs */ + ++cnt; /* buildglyph */ + ++cnt; /* buildchar */ + } else { + ++cnt; /* private */ + ++cnt; /* chars */ + } + if ( sf->xuid!=NULL ) ++cnt; + if ( format==ff_mma || format==ff_mmb ) + cnt += 7; + + if ( sf->uniqueid==0 ) + uniqueid = 4000000 + (rand()&0x3ffff); + else + uniqueid = sf->uniqueid ; + sf->tempuniqueid = uniqueid; + + if ( format!=ff_ptype3 && uniqueid!=-1 ) { + dumpf(dumpchar,data,"FontDirectory/%s known{/%s findfont dup/UniqueID known{dup\n", sf->fontname, sf->fontname); + dumpf(dumpchar,data,"/UniqueID get %d eq exch/FontType get 1 eq and}{pop false}ifelse\n", uniqueid ); + dumpf(dumpchar,data,"{save true}{false}ifelse}{false}ifelse\n" ); + } + + dumpf(dumpchar,data,"%d dict begin\n", cnt ); + dumpf(dumpchar,data,"/FontType %d def\n", format==ff_ptype3?3:1 ); + fm[0] = fm[3] = 1.0/((sf->ascent+sf->descent)); + fm[1] = fm[2] = fm[4] = fm[5] = 0; + dumpdblarray(dumpchar,data,"FontMatrix",fm,6,"readonly ",false); + if ( sf->fontname!=NULL ) + dumpf(dumpchar,data,"/FontName /%s def\n", sf->fontname ); + SplineFontFindBounds(sf,&b); + fm[0] = floor( b.minx); + fm[1] = floor( b.miny); + fm[2] = ceil( b.maxx); + fm[3] = ceil( b.maxy); + dumpdblarray(dumpchar,data,"FontBBox",fm,4,"readonly ", true); + if ( uniqueid!=-1 ) + dumpf(dumpchar,data,"/UniqueID %d def\n", uniqueid ); + if ( sf->xuid!=NULL ) { + dumpf(dumpchar,data,"/XUID %s def\n", sf->xuid ); + if ( sf->changed_since_xuidchanged ) + SFIncrementXUID(sf); + } + dumpf(dumpchar,data,"/PaintType %d def\n", 0/*fd->painttype*/ ); + dumpfontinfo(dumpchar,data,sf,format); + if ( format==ff_mma || format==ff_mmb ) { + MMSet *mm = sf->mm; + int j,k; + DBounds mb[16]; + extern const char *mmfindfont[], *makeblendedfont[]; + + dumpstr(dumpchar,data," /WeightVector [" ); + for ( j=0; jinstance_count; ++j ) { + dumpf(dumpchar,data,"%g ", mm->defweights[j]); + } + dumpstr(dumpchar,data," ] def\n" ); + + dumpstr(dumpchar,data," /$Blend {" ); + if ( mm->instance_count==2 ) + dumpf(dumpchar,data,"%g mul add", mm->defweights[1]); + else { + dumpf(dumpchar,data,"%g mul exch", mm->defweights[1]); + for ( j=2; jinstance_count-1; ++j ) + dumpf(dumpchar,data,"%g mul add exch", mm->defweights[j]); + dumpf(dumpchar,data,"%g mul add add", mm->defweights[j]); + } + dumpstr(dumpchar,data," } bind def\n" ); + + dumpstr(dumpchar,data," /Blend 3 dict dup begin\n" ); + for ( j=0; jinstance_count; ++j ) + SplineFontFindBounds(mm->instances[j],&mb[j]); + dumpstr(dumpchar,data," /FontBBox{" ); + for ( k=0; k<4; ++k ) { + dumpstr(dumpchar,data,"{" ); + for ( j=0; jinstance_count; ++j ) + dumpf(dumpchar,data,"%g ", k==0 ? floor(mb[j].minx) : + k==1 ? floor(mb[j].miny) : + k==2 ? ceil(mb[j].maxx) : + ceil(mb[j].maxy)); + dumpstr(dumpchar,data,"}" ); + } + dumpstr(dumpchar,data,"} def\n" ); + + dumpf(dumpchar,data," /Private %d dict def\n", sf->private->next+10 ); + dumpstr(dumpchar,data," end def %End of Blend dict\n" ); + + for ( j=0; makeblendedfont[j]!=NULL; ++j ) { + dumpstr(dumpchar,data,makeblendedfont[j]); + (dumpchar)('\n',data); + } + + dumpstr(dumpchar,data,"\n /NormalizeDesignVector\n" ); + dumpstr(dumpchar,data, mm->ndv ); + dumpstr(dumpchar,data," bind def\n" ); + + dumpstr(dumpchar,data," /ConvertDesignVector\n" ); + dumpstr(dumpchar,data, mm->cdv ); + dumpstr(dumpchar,data," bind def\n\n" ); + + for ( j=0; mmfindfont[j]!=NULL; ++j ) { + dumpstr(dumpchar,data,mmfindfont[j]); + (dumpchar)('\n',data); + } + } + + for ( i=0; i<256 && icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i]) ) + encoding[i] = SCDuplicate(sf->chars[i])->name; + else + encoding[i] = ".notdef"; + for ( ; i<256; ++i ) + encoding[i] = ".notdef"; + if ( sf->encoding_name==em_adobestandard || isStdEncoding(encoding) ) + dumpstr(dumpchar,data,"/Encoding StandardEncoding def\n"); + else { + dumpstr(dumpchar,data,"/Encoding 256 array\n" ); + /* older versions of dvipdfm assume the following line is present.*/ + /* Perhaps others do too? */ + dumpstr(dumpchar,data," 0 1 255 { 1 index exch /.notdef put} for\n" ); + for ( i=0; i<256; ++i ) + if ( strcmp(encoding[i],".notdef")!=0 ) + dumpf(dumpchar,data,"dup %d/%s put\n", i, encoding[i] ); + dumpstr(dumpchar,data,"readonly def\n" ); + } + if ( format==ff_ptype3 ) { + dumpstr(dumpchar,data,"/BuildChar { 1 index /Encoding get exch get 1 index /BuildGlyph get exec } bind def\n" ); + dumpstr(dumpchar,data,"% I call all my CharProcs with two arguments, the top of the stack will be\n" ); + dumpstr(dumpchar,data,"% 0 and then next thing is the fontdict. If the tos is zero the char will\n" ); + dumpstr(dumpchar,data,"% do a setcachedevice, otherwise (for referenced chars) it will not. The\n" ); + dumpstr(dumpchar,data,"% fontdict argument is so a char can invoke a referenced char. BuildGlyph\n" ); + dumpstr(dumpchar,data,"% itself will remove the arguments from the stack, the CharProc will leave 'em\n" ); + dumpf(dumpchar,data,"/BuildGlyph { 2 copy exch /CharProcs get exch 2 copy known not { pop /.notdef} if get exch pop 0 exch exec 2 pop %s} bind def\n", + sf->multilayer ? "" : "fill " ); + } +} + +static void dumpinitialascii(void (*dumpchar)(int ch,void *data), void *data, + SplineFont *sf, int format ) { + dumprequiredfontinfo(dumpchar,data,sf,format); + dumpstr(dumpchar,data,"currentdict end\ncurrentfile eexec\n" ); +} + +static void dumpencodedstuff(void (*dumpchar)(int ch,void *data), void *data, + SplineFont *sf, int format, int flags ) { + struct fileencryptdata fed; + void (*func)(int ch,void *data); + + func = startfileencoding(dumpchar,data,&fed,format==ff_pfb || format==ff_mmb); + dumpprivatestuff(func,&fed,sf,NULL,flags,format); + if ( format==ff_ptype0 ) { + dumpstr(func,&fed, "/" ); + dumpstr(func,&fed, sf->fontname ); + dumpstr(func,&fed,"Base exch definefont pop\n mark currentfile closefile\n" ); + } else + dumpstr(func,&fed,"dup/FontName get exch definefont pop\n mark currentfile closefile\n" ); +} + +static void dumpfinalascii(void (*dumpchar)(int ch,void *data), void *data) { + int i; + + /* output 512 zeros */ + dumpchar('\n',data); + for ( i = 0; i<8; ++i ) + dumpstr(dumpchar,data,"0000000000000000000000000000000000000000000000000000000000000000\n"); + dumpstr(dumpchar,data,"cleartomark\n{restore}if"); +} + +static void mkheadercopyfile(FILE *temp,FILE *out,int headertype) { + char buffer[8*1024]; + int len; + + /* output the file header */ + putc('\200',out); + putc(headertype,out); + len = ftell(temp); /* output byte count */ + putc(len&0xff,out); + putc(((len>>8)&0xff),out); + putc(((len>>16)&0xff),out); + putc(((len>>24)&0xff),out); + + fseek(temp,0,SEEK_SET); + while ((len=fread(buffer,sizeof(char),sizeof(buffer),temp))>0 ) + fwrite(buffer,sizeof(char),len,out); + fclose(temp); /* deletes the temporary file */ +} + +static void dumpfontdict(FILE *out, SplineFont *sf, int format, int flags ) { + +/* a pfb header consists of 6 bytes, the first is 0200, the second is a */ +/* binary/ascii flag where 1=>ascii, 2=>binary, 3=>eof??, the next four */ +/* are a count of bytes between this header and the next one. First byte */ +/* is least significant */ + if ( format==ff_pfb || format==ff_mmb ) { + FILE *temp; + temp = tmpfile(); + dumpinitialascii((DumpChar) fputc,temp,sf,format ); + mkheadercopyfile(temp,out,1); + temp = tmpfile(); + dumpencodedstuff((DumpChar) fputc,temp,sf,format,flags); + mkheadercopyfile(temp,out,2); + temp = tmpfile(); + dumpfinalascii((DumpChar) fputc,temp); + mkheadercopyfile(temp,out,1); +/* final header, 3=>eof??? */ + dumpstrn((DumpChar) fputc,out,"\200\003",2); + } else if ( format==ff_ptype3 ) { + dumprequiredfontinfo((DumpChar) fputc,out,sf,ff_ptype3); + dumpcharprocs((DumpChar) fputc,out,sf); + } else { + dumpinitialascii((DumpChar) (fputc),out,sf,format ); + dumpencodedstuff((DumpChar) (fputc),out,sf,format,flags); + dumpfinalascii((DumpChar) (fputc),out); + } +} + +static void dumpreencodeproc(FILE *out) { + + fprintf( out, "\n/reencodedict 10 dict def\n" ); + fprintf( out, "/ReEncode\n" ); + fprintf( out, " { reencodedict begin\n" ); + fprintf( out, "\t/newencoding exch def\n" ); + fprintf( out, "\t/newfontname exch def\n" ); + fprintf( out, "\tfindfont /basefontdict exch def\n" ); + fprintf( out, "\t/newfont basefontdict maxlength dict def\n" ); + fprintf( out, "\tbasefontdict\n" ); + fprintf( out, "\t { exch dup dup /FID ne exch /Encoding ne and\n" ); + fprintf( out, "\t\t{ exch newfont 3 1 roll put }\n" ); + fprintf( out, "\t\t{ pop pop }\n" ); + fprintf( out, "\t\tifelse\n" ); + fprintf( out, "\t } forall\n" ); + fprintf( out, "\tnewfont /FontName newfontname put\n" ); + fprintf( out, "\tnewfont /Encoding newencoding put\n" ); + fprintf( out, "\tnewfontname newfont definefont pop\n" ); + fprintf( out, "\tend\n" ); + fprintf( out, " } def\n" ); + fprintf( out, "\n" ); +} + +static char *dumpnotdefenc(FILE *out,SplineFont *sf) { + char *notdefname; + int i; + + if ( 0xfffdcharcnt && sf->chars[0xfffd]!=NULL ) + notdefname = sf->chars[0xfffd]->name; + else + notdefname = ".notdef"; + fprintf( out, "/%sBase /%sNotDef [\n", sf->fontname, sf->fontname ); + for ( i=0; i<256; ++i ) + fprintf( out, " /%s\n", notdefname ); + fprintf( out, "] ReEncode\n\n" ); +return( notdefname ); +} + +static int somecharsused(SplineFont *sf, int bottom, int top) { + int i; + + for ( i=bottom; i<=top && icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) ) +return( true ); + } +return( false ); +} + +static void dumptype0stuff(FILE *out,SplineFont *sf) { + char *notdefname; + int i,j; + extern char *zapfnomen[]; + extern int8 zapfexists[]; + + dumpreencodeproc(out); + notdefname = dumpnotdefenc(out,sf); + for ( i=1; i<256; ++i ) { + if ( somecharsused(sf,i<<8, (i<<8)+0xff)) { + fprintf( out, "/%sBase /%s%d [\n", sf->fontname, sf->fontname, i ); + for ( j=0; j<256 && (i<<8)+jcharcnt; ++j ) + fprintf( out, " /%s\n", + sf->chars[(i<<8)+j]!=NULL?sf->chars[(i<<8)+j]->name: + notdefname ); + for ( ; j<256; ++j ) + fprintf( out, " /%s\n", notdefname ); + fprintf( out, "] ReEncode\n\n" ); + } else if ( i==0x27 && sf->encoding_name==em_unicode ) { + fprintf( out, "%% Add Zapf Dingbats to unicode font at 0x2700\n" ); + fprintf( out, "%% But only if on the printer, else use notdef\n" ); + fprintf( out, "%% gv, which has no Zapf, maps courier to the name\n" ); + fprintf( out, "%% so we must check a bit more than is it null or not...\n" ); +/* gv with no ZapfDingbats installed does weird stuff. */ +/* If I do "/ZapfDingbats findfont" then it returns "/Courier findfont" the */ +/* first time, but the second time it returns null */ +/* So even if the printer thinks it's got Zapf we must check to make sure it's*/ +/* the real Zapf. We do that by examining the name. If it's ZapfDingbats all*/ +/* should be well, if it's Courier, then that counts as non-existant */ + fprintf( out, "/ZapfDingbats findfont pop\n" ); + fprintf( out, "/ZapfDingbats findfont null eq\n" ); + fprintf( out, "{ true }\n" ); + fprintf( out, " { /ZapfDingbats findfont /FontName get (ZapfDingbats) ne }\n" ); + fprintf( out, " ifelse\n" ); + fprintf( out, "{ /%s%d /%sNotDef findfont definefont pop }\n", + sf->fontname, i, sf->fontname); + fprintf( out, " { /ZapfDingbats /%s%d [\n", sf->fontname, i ); + for ( j=0; j<0xc0; ++j ) + fprintf( out, " /%s\n", + zapfexists[j]?zapfnomen[j]:".notdef" ); + for ( ;j<256; ++j ) + fprintf( out, " /%s\n", ".notdef" ); + fprintf( out, "] ReEncode\n\n" ); + fprintf( out, " } ifelse\n\n" ); + } + } + + fprintf( out, "/%s 20 dict dup begin\n", sf->fontname ); + fprintf( out, "/FontInfo /%sBase findfont /FontInfo get def\n", sf->fontname ); + fprintf( out, "/FontName /%s def\n", sf->fontname ); + fprintf( out, "/PaintType 0 def\n" ); + fprintf( out, "/FontType 0 def\n" ); + fprintf( out, "/LanguageLevel 2 def\n" ); + fprintf( out, "/FontMatrix [1 0 0 1 0 0] readonly def\n" ); + fprintf( out, "/FMapType 2 def\n" ); + fprintf( out, "/Encoding [\n" ); + for ( i=0; i<256; ++i ) + fprintf( out, " %d\n", i ); + fprintf( out, "] readonly def\n" ); + fprintf( out, "/FDepVector [\n" ); + fprintf( out, " /%sBase findfont\n", sf->fontname ); + for ( i=1; i<256; ++i ) + if ( somecharsused(sf,i<<8, (i<<8)+0xff) || (i==0x27 && sf->encoding_name==em_unicode) ) + fprintf( out, " /%s%d findfont\n", sf->fontname, i ); + else + fprintf( out, " /%sNotDef findfont\n", sf->fontname ); + fprintf( out, " ] readonly def\n" ); + fprintf( out, "end definefont pop\n" ); + fprintf( out, "%%%%EOF\n" ); +} + +static void dumpt1str(FILE *binary,uint8 *data, int len, int leniv) { + if ( leniv==-1 ) + fwrite(data,sizeof(1),len,binary); + else + encodestrout((DumpChar) fputc,binary,data,len,leniv); +} + +static void dump_index(FILE *binary,int size,int val) { + + if ( size>=4 ) + putc((val>>24)&0xff,binary); + if ( size>=3 ) + putc((val>>16)&0xff,binary); + if ( size>=2 ) + putc((val>>8)&0xff,binary); + if ( size>=1 ) /* Yes, size may be 0 for the fd index */ + putc((val)&0xff,binary); +} + +static FILE *gencidbinarydata(SplineFont *cidmaster,struct cidbytes *cidbytes,int flags) { + int i,j, leniv, subrtot; + SplineFont *sf; + struct fddata *fd; + FILE *chrs, *subrs, *binary; + char *buffer; + long offset; + char *pt; + struct pschars *chars; + int len; + + memset(cidbytes,'\0',sizeof(struct cidbytes)); + cidbytes->fdcnt = cidmaster->subfontcnt; + cidbytes->fds = gcalloc(cidbytes->fdcnt,sizeof(struct fddata)); + for ( i=0; ifdcnt; ++i ) { + sf = cidmaster->subfonts[i]; + fd = &cidbytes->fds[i]; + fd->flexmax = SplineFontIsFlexible(sf,flags); + fd->subrs = initsubrs(fd->flexmax>0,NULL); + if ( fd->subrs==NULL ) { + int j; + for ( j=0; jfds[j].subrs); + free( cidbytes->fds ); +return( NULL ); + } + fd->iscjk = SFIsCJK(sf); + pt = PSDictHasEntry(sf->private,"lenIV"); + if ( pt!=NULL ) + fd->leniv = strtol(pt,NULL,10); + else + fd->leniv = 4; + } + GProgressChangeLine1R(_STR_CvtPS); + if ( (chars = CID2Chrs(cidmaster,cidbytes,flags))==NULL ) +return( NULL ); + GProgressNextStage(); + GProgressChangeLine1R(_STR_SavingPSFont); + + chrs = tmpfile(); + for ( i=0; inext; ++i ) { + if ( chars->lens[i]!=0 ) { + leniv = cidbytes->fds[cidbytes->fdind[i]].leniv; + dumpt1str(chrs,chars->values[i],chars->lens[i],leniv); + if ( !GProgressNext()) { + fclose(chrs); +return( NULL ); + } + if ( leniv>0 ) + chars->lens[i] += leniv; + } + } + subrs = tmpfile(); subrtot = 0; + for ( i=0; ifdcnt; ++i ) { + fd = &cidbytes->fds[i]; + leniv = fd->leniv; + for ( j=0; jsubrs->next; ++j ) { + dumpt1str(subrs,fd->subrs->values[j],fd->subrs->lens[j],leniv); + if ( leniv>0 ) + fd->subrs->lens[j] += leniv; + } + fd->subrcnt = j; + subrtot += j; + } + + cidbytes->fdbytes = ( cidbytes->fdcnt==1 )? 0 : + ( cidbytes->fdcnt<256 )? 1 : 2; + if ( (cidbytes->cidcnt+1)*(cidbytes->fdbytes+3) + /* size of the CID map region */ + (subrtot+1) * 3 + /* size of the Subr map region */ + ftell(subrs) + /* size of the subr region */ + ftell(chrs) < 0x1000000 ) /* size of the charstring region */ /* Are all our offsets less than 3 bytes? */ + cidbytes->gdbytes = 3; /* Adobe's convention is to use 3, so don't bother checking for anything less */ + else + cidbytes->gdbytes = 4; /* but I suppose we might need more... */ + + cidbytes->errors = ferror(chrs) || ferror(subrs); + + offset = (cidbytes->cidcnt+1)*(cidbytes->fdbytes+cidbytes->gdbytes) + + (subrtot+1) * cidbytes->gdbytes + ftell(subrs); + binary = tmpfile(); + for ( i=0; icidcnt; ++i ) { + dump_index(binary,cidbytes->fdbytes,cidbytes->fdind[i]); + dump_index(binary,cidbytes->gdbytes,offset); + offset += chars->lens[i]; + } + dump_index(binary,cidbytes->fdbytes,-1); /* Adobe says undefined */ + dump_index(binary,cidbytes->gdbytes,offset); + if ( ftell(binary) != (cidbytes->cidcnt+1)*(cidbytes->fdbytes+cidbytes->gdbytes)) + GDrawIError("CIDMap section the wrong length" ); + + offset = (cidbytes->cidcnt+1)*(cidbytes->fdbytes+cidbytes->gdbytes) + + (subrtot+1) * cidbytes->gdbytes; + for ( i=0; ifdcnt; ++i ) { + fd = &cidbytes->fds[i]; + fd->subrmapoff = ftell(binary); + fd->sdbytes = cidbytes->gdbytes; + fd->subrcnt = fd->subrs->next; + for ( j=0; jsubrcnt; ++j ) { + dump_index(binary,fd->sdbytes,offset); + offset += fd->subrs->lens[j]; + } + PSCharsFree(fd->subrs); + } + dump_index(binary,cidbytes->gdbytes,offset); + if ( ftell(binary) != (cidbytes->cidcnt+1)*(cidbytes->fdbytes+cidbytes->gdbytes) + + (subrtot+1) * cidbytes->gdbytes ) + GDrawIError("SubrMap section the wrong length" ); + + buffer = galloc(8192); + + rewind(subrs); + while ( (len=fread(buffer,1,8192,subrs))>0 ) + fwrite(buffer,1,len,binary); + fclose(subrs); + + rewind(chrs); + while ( (len=fread(buffer,1,8192,chrs))>0 ) + fwrite(buffer,1,len,binary); + fclose(chrs); + + PSCharsFree(chars); + free( cidbytes->fdind ); cidbytes->fdind = NULL; + free( buffer ); + + cidbytes->errors |= ferror(binary); +return( binary ); +} + +static int dumpcidstuff(FILE *out,SplineFont *cidmaster,int flags) { + int i; + DBounds res; + FILE *binary; + SplineFont *sf; + struct cidbytes cidbytes; + char buffer[4096]; + long len; + + fprintf( out, "%%!PS-Adobe-3.0 Resource-CIDFont\n" ); + fprintf( out, "%%%%DocumentNeededResources: ProcSet (CIDInit)\n" ); + fprintf( out, "%%%%DocumentSuppliedResources: CIDFont (%s)\n", cidmaster->fontname ); + fprintf( out, "%%%%IncludeResource: ProcSet (CIDInit)\n" ); + fprintf( out, "%%%%BeginResource: CIDFont (%s)\n", cidmaster->fontname ); + fprintf( out, "%%%%Title: (%s %s %s %d)\n", + cidmaster->fontname, + cidmaster->cidregistry, cidmaster->ordering, cidmaster->supplement ); + fprintf( out, "%%%%Version: %g\n\n", cidmaster->cidversion ); + if ( cidmaster->copyright!=NULL ) { + char *pt = strchr(cidmaster->copyright,'\n'); + if ( pt==NULL ) pt = cidmaster->copyright + strlen(cidmaster->copyright); + if ( pt-cidmaster->copyright>70 ) pt = cidmaster->copyright+70; + fprintf( out,"%% %.*s\n", pt-cidmaster->copyright, cidmaster->copyright ); + } + fprintf( out,"%% Generated by FontForge 1.0 (http://fontforge.sf.net/)\n"); + + fprintf( out, "/CIDInit /ProcSet findresource begin\n\n" ); + + fprintf( out, "20 dict begin\n\n" ); + + fprintf( out, "/CIDFontName /%s def\n", cidmaster->fontname ); + fprintf( out, "/CIDFontVersion %g def\n", cidmaster->cidversion ); + fprintf( out, "/CIDFontType 0 def\n\n" ); + + fprintf( out, "/CIDSystemInfo 3 dict dup begin\n" ); + fprintf( out, " /Registry (%s) def\n", cidmaster->cidregistry ); + fprintf( out, " /Ordering (%s) def\n", cidmaster->ordering ); + fprintf( out, " /Supplement %d def\n", cidmaster->supplement ); + fprintf( out, "end def\n\n" ); + + CIDFindBounds(cidmaster,&res); + fprintf( out, "/FontBBox [ %g %g %g %g ] def\n", + floor(res.minx), floor(res.miny), + ceil(res.maxx), ceil(res.maxy)); + + fprintf( out,"/UIDBase %d def\n", cidmaster->uniqueid?cidmaster->uniqueid: 4000000 + (rand()&0x3ffff) ); + if ( cidmaster->xuid!=NULL ) { + fprintf( out,"/XUID %s def\n", cidmaster->xuid ); + /* SFIncrementXUID(cidmaster); */ /* Unique ID managment in CID fonts is too complex for this simple trick to work */ + } + + dumpfontinfo((DumpChar) fputc,out,cidmaster,ff_cid); + + if ((binary = gencidbinarydata(cidmaster,&cidbytes,flags))==NULL ) +return( 0 ); + + fprintf( out, "\n/CIDMapOffset %d def\n", cidbytes.cidmapoffset ); + fprintf( out, "/FDBytes %d def\n", cidbytes.fdbytes ); + fprintf( out, "/GDBytes %d def\n", cidbytes.gdbytes ); + fprintf( out, "/CIDCount %d def\n\n", cidbytes.cidcnt ); + + fprintf( out, "/FDArray %d array\n", cidbytes.fdcnt ); + for ( i=0; isubfonts[i]; + /* According to the PSRef Man, v3. only FontName, FontMatrix & Private*/ + /* should be defined here. But adobe's example fonts have a few */ + /* extra entries, so I'll put them in */ + fprintf( out, "dup %d\n", i ); + fprintf( out, "\n%%ADOBeginFontDict\n" ); + fprintf( out, "14 dict\n begin\n" ); + fprintf( out, " /FontName /%s def\n", sf->fontname ); + fprintf( out, " /FontType 1 def\n" ); + factor = 1.0/(sf->ascent+sf->descent); + fprintf( out, " /FontMatrix [ %g 0 0 %g 0 0 ] def\n", + factor, factor ); + fprintf( out, " /PaintType 0 def\n" ); + fprintf( out, "\n %%ADOBeginPrivateDict\n" ); + dumpprivatestuff((DumpChar) fputc,out,sf,&cidbytes.fds[i],flags,ff_cid); + fprintf( out, "\n %%ADOEndPrivateDict\n" ); + fprintf( out, " currentdict end\n%%ADOEndFontDict\n put\n\n" ); + } + fprintf( out, "def\n\n" ); + + fseek(binary,0,SEEK_END); + len = ftell(binary); + sprintf( buffer, "(Binary) %ld StartData ", len ); + fprintf( out, "%%%%BeginData: %ld Binary Bytes\n", (long) (len+strlen(buffer))); + fprintf( out, buffer ); + + fseek(binary,0,SEEK_SET); + while ( (len=fread(buffer,1,sizeof(buffer),binary))>0 ) + fwrite(buffer,1,len,out); + cidbytes.errors |= ferror(binary); + fclose(binary); + free(cidbytes.fds); + + fprintf( out, "\n%%%%EndData\n%%%%EndResource\n%%%%EOF\n" ); +return( !cidbytes.errors ); +} + +int _WritePSFont(FILE *out,SplineFont *sf,enum fontformat format,int flags) { + char *oldloc; + int err = false; + + /* make sure that all reals get output with '.' for decimal points */ + oldloc = setlocale(LC_NUMERIC,"C"); + if ( (format==ff_mma || format==ff_mmb) && sf->mm!=NULL ) + sf = sf->mm->normal; + if ( format==ff_cid ) + err = !dumpcidstuff(out,sf->subfontcnt>0?sf:sf->cidmaster,flags); + else { + dumpfontdict(out,sf,format,flags); + if ( format==ff_ptype0 ) + dumptype0stuff(out,sf); + } + setlocale(LC_NUMERIC,oldloc); + if ( ferror(out) || err) +return( 0 ); + +#ifdef __CygWin + /* Modern versions of windows want the execute bit set on a ttf file */ + /* It might also be needed for a postscript font, but I haven't checked */ + /* I've no idea what this corresponds to in windows, nor any idea on */ + /* how to set it from the windows UI, but this seems to work */ + { + struct stat buf; + fstat(fileno(out),&buf); + fchmod(fileno(out),S_IXUSR | buf.st_mode ); + } +#endif + +return( true ); +} + +int WritePSFont(char *fontname,SplineFont *sf,enum fontformat format,int flags) { + FILE *out; + int ret; + + if (( out=fopen(fontname,"wb"))==NULL ) +return( 0 ); + ret = _WritePSFont(out,sf,format,flags); + if ( fclose(out)==-1 ) + ret = 0; +return( ret ); +} diff --git a/fontforge/edgelist.h b/fontforge/edgelist.h new file mode 100644 index 00000000..01d23285 --- /dev/null +++ b/fontforge/edgelist.h @@ -0,0 +1,146 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _EDGELIST_H +#define _EDGELIST_H +#include "splinefont.h" + +typedef struct hints { + real base, width; + real b1, b2, e1, e2; + real ab, ae; + unsigned int adjustb: 1; + unsigned int adjuste: 1; + struct hints *next; +} Hints; + +/* Instead of y and x coordinates these are based on major and other */ +/* major maybe either x or y depending on what we're interested in */ +/* at the moment, and other will be the other one. Of course it's */ +/* consistant accross the datastructure at any given time */ +typedef struct edge { + real mmin, mmax; /* relative to es->mmin */ + real t_mmin, t_mmax; + real tmin, tmax; + real o_mmin, o_mmax; + real t_cur, o_cur, m_cur; + unsigned int up: 1; /* line is directed up in the spline list */ + unsigned int max_adjusted: 1; /* by hstem hints */ + unsigned int min_adjusted: 1; + Spline *spline; /* spline which generated this segment */ + struct edge *esnext, *aenext; + struct edge *before, *after; + int last_opos, last_mpos; + real oldt; /* only used for FindIntersections of RemoveOverlap */ +} Edge; + +typedef struct edgelist { + Edge **edges; + int cnt; + real mmin, mmax; + real omin, omax; + real scale; + int bytes_per_line; + uint8 *bitmap; + Edge *last, *splinesetfirst; + SplineChar *sc; + char *interesting; + int major, other; + unsigned int genmajoredges: 1; /* generate a list of edges parrallel to the major axis */ + Edge *majors; /* ordered so that lowest edge is first */ + Edge *majorhold; /* to hold major edges as we pass them and they become useless */ + Hints *hhints, *vhints; + int is_overlap; +} EdgeList; + +extern void FreeEdges(EdgeList *es); +extern double TOfNextMajor(Edge *e, EdgeList *es, double sought_y ); +extern void FindEdgesSplineSet(SplinePointList *spl, EdgeList *es); +extern Edge *ActiveEdgesInsertNew(EdgeList *es, Edge *active,int i); +extern Edge *ActiveEdgesRefigure(EdgeList *es, Edge *active,real i); +extern Edge *ActiveEdgesFindStem(Edge *apt, Edge **prev, real i); + +/* Version which is better for everything other than rasterization */ +/* (I think) */ +typedef struct edgeinfo { + /* The spline is broken up at all points of inflection. So... */ + /* The spline between tmin and tmax is monotonic in both coordinates */ + /* If the spline becomes vert/horizontal that will be at one of the */ + /* end points too */ + Spline *spline; + real tmin, tmax; + real coordmin[2]; + real coordmax[2]; + unsigned int up: 1; + unsigned int hv: 1; + unsigned int hvbottom: 1; + unsigned int hvtop: 1; + unsigned int hor: 1; + unsigned int vert: 1; + unsigned int almosthor: 1; + unsigned int almostvert: 1; + unsigned int horattmin: 1; + unsigned int horattmax: 1; + unsigned int vertattmin: 1; + unsigned int vertattmax: 1; + unsigned hup: 1; + unsigned vup: 1; + real tcur; /* Value of t for current major coord */ + real ocur; /* Value of the other coord for current major coord */ + struct edgeinfo *next; + struct edgeinfo *ordered; + struct edgeinfo *aenext; + struct edgeinfo *splinenext; + SplineChar *sc; + int major; +} EI; + +typedef struct eilist { + EI *edges; + real coordmin[2]; + real coordmax[2]; + int low, high, cnt; + EI **ordered; + char *ends; /* flag to say an edge ends on this line */ + SplineChar *sc; + int major; + EI *splinelast, *splinefirst; + EI **bottoms, **tops; /* Used only be FindNeeded in RemoveOverlap */ + unsigned leavetiny: 1; + enum overlap_type ot; +} EIList; + +extern void ElFreeEI(EIList *el); +extern void ELFindEdges(SplineChar *sc, EIList *el); +extern void ELOrder(EIList *el, int major ); +extern real EITOfNextMajor(EI *e, EIList *el, real sought_m ); +extern int EISameLine(EI *e, EI *n, real i, int major); +extern int EISkipExtremum(EI *e, real i, int major); +extern EI *EIActiveEdgesFindStem(EI *apt, real i, int major); +extern EI *EIActiveListReorder(EI *active,int *change); +extern EI *EIActiveEdgesRefigure(EIList *el, EI *active,real i,int major, + int *_change); +#endif diff --git a/fontforge/effects.c b/fontforge/effects.c new file mode 100644 index 00000000..a294b863 --- /dev/null +++ b/fontforge/effects.c @@ -0,0 +1,1195 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include "edgelist.h" + +void FVOutline(FontView *fv, real width) { + StrokeInfo si; + SplineSet *temp, *spl; + int i, cnt=0, changed; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_fore].splines ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Outlining,_STR_Outlining,0,cnt,1); + + memset(&si,0,sizeof(si)); + si.removeexternal = true; + si.radius = width; + si.removeoverlapifneeded = true; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_fore].splines ) { + SplineChar *sc = fv->sf->chars[i]; + SCPreserveState(sc,false); + temp = SSStroke(sc->layers[ly_fore].splines,&si,sc); + for ( spl=sc->layers[ly_fore].splines; spl->next!=NULL; spl=spl->next ); + spl->next = temp; + SplineSetsCorrect(sc->layers[ly_fore].splines,&changed); + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void CVOutline(CharView *cv, real width) { + StrokeInfo si; + SplineSet *temp, *spl; + int changed; + + memset(&si,0,sizeof(si)); + si.removeexternal = true; + si.radius = width; + si.removeoverlapifneeded = true; + + CVPreserveState(cv); + temp = SSStroke(cv->layerheads[cv->drawmode]->splines,&si,cv->sc); + for ( spl=cv->layerheads[cv->drawmode]->splines; spl->next!=NULL; spl=spl->next ); + spl->next = temp; + SplineSetsCorrect(cv->layerheads[cv->drawmode]->splines,&changed); + CVCharChangedUpdate(cv); +} + +static void MVOutline(MetricsView *mv, real width) { + StrokeInfo si; + SplineSet *temp, *spl; + int i, changed; + + memset(&si,0,sizeof(si)); + si.removeexternal = true; + si.radius = width; + si.removeoverlapifneeded = true; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + SCPreserveState(sc,false); + temp = SSStroke(sc->layers[ly_fore].splines,&si,sc); + for ( spl=sc->layers[ly_fore].splines; spl->next!=NULL; spl=spl->next ); + spl->next = temp; + SplineSetsCorrect(sc->layers[ly_fore].splines,&changed); + SCCharChangedUpdate(sc); + } +} + +void FVInline(FontView *fv, real width, real inset) { + StrokeInfo si; + SplineSet *temp, *spl, *temp2; + int i, cnt=0, changed; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_fore].splines ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Inlining,_STR_Inlining,0,cnt,1); + + memset(&si,0,sizeof(si)); + si.removeexternal = true; + si.removeoverlapifneeded = true; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_fore].splines ) { + SplineChar *sc = fv->sf->chars[i]; + SCPreserveState(sc,false); + si.radius = width; + temp = SSStroke(sc->layers[ly_fore].splines,&si,sc); + si.radius = width+inset; + temp2 = SSStroke(sc->layers[ly_fore].splines,&si,sc); + for ( spl=sc->layers[ly_fore].splines; spl->next!=NULL; spl=spl->next ); + spl->next = temp; + for ( ; spl->next!=NULL; spl=spl->next ); + spl->next = temp2; + SplineSetsCorrect(sc->layers[ly_fore].splines,&changed); + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void CVInline(CharView *cv, real width, real inset) { + StrokeInfo si; + SplineSet *temp, *spl, *temp2; + int changed; + + memset(&si,0,sizeof(si)); + si.removeexternal = true; + si.removeoverlapifneeded = true; + + CVPreserveState(cv); + si.radius = width; + temp = SSStroke(cv->layerheads[cv->drawmode]->splines,&si,cv->sc); + si.radius = width+inset; + temp2 = SSStroke(cv->layerheads[cv->drawmode]->splines,&si,cv->sc); + for ( spl=cv->layerheads[cv->drawmode]->splines; spl->next!=NULL; spl=spl->next ); + spl->next = temp; + for ( ; spl->next!=NULL; spl=spl->next ); + spl->next = temp2; + SplineSetsCorrect(cv->layerheads[cv->drawmode]->splines,&changed); + CVCharChangedUpdate(cv); +} + +static void MVInline(MetricsView *mv, real width, real inset) { + StrokeInfo si; + SplineSet *temp, *spl, *temp2; + int i, changed; + + memset(&si,0,sizeof(si)); + si.removeexternal = true; + si.removeoverlapifneeded = true; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + SCPreserveState(sc,false); + si.radius = width; + temp = SSStroke(sc->layers[ly_fore].splines,&si,sc); + si.radius = width+inset; + temp2 = SSStroke(sc->layers[ly_fore].splines,&si,sc); + for ( spl=sc->layers[ly_fore].splines; spl->next!=NULL; spl=spl->next ); + spl->next = temp; + for ( ; spl->next!=NULL; spl=spl->next ); + spl->next = temp2; + SplineSetsCorrect(sc->layers[ly_fore].splines,&changed); + SCCharChangedUpdate(sc); + } +} + +static real def_outline_width = 10, def_gap_width = 20; + +#define CID_Width 1000 +#define CID_Gap 1001 + +typedef struct outlinedata { + unsigned int done: 1; + FontView *fv; + CharView *cv; + MetricsView *mv; + int isinline; + int wireframe; + GWindow gw; +} OutlineData; + +static int OD_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g)); + real width, gap; + int err = 0; + + width = GetRealR(od->gw,CID_Width,_STR_Width,&err); + if ( od->isinline ) + gap = GetRealR(od->gw,CID_Gap,_STR_Gap,&err); + if ( err ) +return(true); + def_outline_width = width; + if ( od->isinline ) { + def_gap_width = gap; + if ( od->fv!=NULL ) + FVInline(od->fv,width,gap); + else if ( od->cv!=NULL ) + CVInline(od->cv,width,gap); + else if ( od->mv!=NULL ) + MVInline(od->mv,width,gap); + } else { + if ( od->fv!=NULL ) + FVOutline(od->fv,width); + else if ( od->cv!=NULL ) + CVOutline(od->cv,width); + else if ( od->mv!=NULL ) + MVOutline(od->mv,width); + } + od->done = true; + } +return( true ); +} + +static int OD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g)); + od->done = true; + } +return( true ); +} + +static int od_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + OutlineData *od = GDrawGetUserData(gw); + od->done = true; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +void OutlineDlg(FontView *fv, CharView *cv,MetricsView *mv,int isinline) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + OutlineData od; + char buffer[20], buffer2[20]; + int i; + + od.done = false; + od.fv = fv; + od.cv = cv; + od.mv = mv; + od.isinline = isinline; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<hintmask = NULL; + new->me.x += offset; + new->nextcp.x += offset; + new->prevcp.x += offset; + new->prev = new->next = NULL; + + if ( cur->first==NULL ) + cur->first = new; + else + SplineMake(cur->last,new,sp->next->order2); + cur->last = new; + + /* Does the line segment we want to create immediately move inside of the */ + /* main contour? If so we aren't interested in it */ + test = sp->me; + ++test.x; + if ( !SSPointWithin(spl,&test)) { + line = chunkalloc(sizeof(SplineSet)); + line->first = SplinePointCreate(sp->me.x,sp->me.y); + line->last = SplinePointCreate(new->me.x,new->me.y); + SplineMake(line->first,line->last,sp->next->order2); + line->next = lines; + lines = line; + } + +return( lines ); +} + +static void OrientEdges(SplineSet *base,SplineChar *sc) { + SplineSet *spl; + Spline *s, *first; + EIList el; + EI *active=NULL, *apt, *e; + SplineChar dummy; + int i, waschange, winding, change; + + for ( spl=base; spl!=NULL; spl=spl->next ) { + first = NULL; + for ( s = spl->first->next; s!=NULL && s!=first; s=s->to->next ) { + s->leftedge = false; + s->rightedge = false; + if ( first==NULL ) first = s; + } + } + + memset(&el,'\0',sizeof(el)); + memset(&dummy,'\0',sizeof(dummy)); + dummy.layers[ly_fore].splines = base; + if ( sc!=NULL ) dummy.name = sc->name; + ELFindEdges(&dummy,&el); + el.major = 1; + ELOrder(&el,el.major); + + waschange = false; + for ( i=0; iaenext->aenext; + continue; + } + if ( winding==0 ) + apt->spline->leftedge = true; + winding += apt->up ? 1 : -1; + if ( winding==0 ) + apt->spline->rightedge = true; + e = apt->aenext; + } + } + free(el.ordered); + free(el.ends); + ElFreeEI(&el); +} + +static SplineSet *AddVerticalExtremaAndMove(SplineSet *base,real shadow_length, + int wireframe,SplineChar *sc,SplineSet **_lines) { + SplineSet *spl, *head=NULL, *last=NULL, *cur, *lines=NULL; + Spline *s, *first; + SplinePoint *sp, *found, *new; + real t[2]; + int p; + + if ( shadow_length==0 ) +return(NULL); + + t[0] = t[1] = 0; + for ( spl=base; spl!=NULL; spl=spl->next ) if ( spl->first->prev!=NULL && spl->first->prev->from!=spl->first ) { + /* Add any extrema which aren't already splinepoints */ + first = NULL; + for ( s=spl->first->next; s!=first; s=s->to->next ) { + if ( first==NULL ) first = s; + p=0; + if ( s->splines[1].a!=0 ) { + double d = 4*s->splines[1].b*s->splines[1].b-4*3*s->splines[1].a*s->splines[1].c; + if ( d>0 ) { + d = sqrt(d); + t[p++] = (-2*s->splines[1].b+d)/(2*3*s->splines[1].a); + t[p++] = (-2*s->splines[1].b-d)/(2*3*s->splines[1].a); + } + } else if ( s->splines[1].b!=0 ) + t[p++] = -s->splines[1].c/(2*s->splines[1].b); + if ( p==2 && (t[1]<=0.0001 || t[1]>=.9999 )) + --p; + if ( p>=1 && (t[0]<=0.0001 || t[0]>=.9999 )) { + t[0] = t[1]; + --p; + } + if ( p==2 && t[0]>t[1] ) + t[0] = t[1]; + if ( p>0 ) { + sp = SplineBisect(s,t[0]); + s = sp->prev; + /* If there were any other t values, ignore them here, we'll */ + /* find them when we process the next half of the spline */ + } + } + } + + OrientEdges(base,sc); + for ( spl=base; spl!=NULL; spl=spl->next ) if ( spl->first->prev!=NULL && spl->first->prev->from!=spl->first ) { + if ( !wireframe ) { + /* Make duplicates of any ticked points and move them over */ + found = spl->first; + for ( sp = found; ; ) { + if ( sp->next->rightedge && sp->prev->rightedge ) { + sp->me.x += shadow_length; + sp->nextcp.x += shadow_length; + sp->prevcp.x += shadow_length; + SplineRefigure(sp->prev); + } else if ( sp->next->rightedge || sp->prev->rightedge ) { + new = chunkalloc(sizeof(SplinePoint)); + *new = *sp; + new->hintmask = NULL; + new->ticked = false; sp->ticked = false; + if ( sp->next->rightedge ) { + sp->next->from = new; + sp->nonextcp = true; + sp->nextcp = sp->me; + new->me.x += shadow_length; + new->nextcp.x += shadow_length; + new->noprevcp = true; + new->prevcp = new->me; + SplineMake(sp,new,sp->prev->order2); + sp = new; + } else { + sp->prev->to = new; + sp->noprevcp = true; + sp->prevcp = sp->me; + new->me.x += shadow_length; + new->prevcp.x += shadow_length; + new->nonextcp = true; + new->nextcp = new->me; + SplineMake(new,sp,sp->next->order2); + SplineRefigure(new->prev); + if ( sp==found ) found = new; + } + } + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + SplineRefigure(spl->first->prev); /* Just in case... */ + } else { + cur = NULL; + /* Wire frame... do hidden line removal by only copying the */ + /* points which would be moved by the above code */ + for ( sp=spl->first; sp->prev->rightedge || !sp->next->rightedge ; sp = sp->next->to ); + for ( found = sp; ; ) { + if ( sp->next->rightedge && sp->prev->rightedge ) { + lines = SpMove(sp,shadow_length,cur,lines,base); + } else if ( sp->next->rightedge ) { + cur = chunkalloc(sizeof(SplineSet)); + if ( last==NULL ) + head = cur; + else + last->next = cur; + last = cur; + lines = SpMove(sp,shadow_length,cur,lines,base); + } else if ( sp->prev->rightedge ) { + lines = SpMove(sp,shadow_length,cur,lines,base); + cur = NULL; + } + sp = sp->next->to; + if ( sp==found ) + break; + } + *_lines = lines; + } + } +return( head ); +} + +static void SSCleanup(SplineSet *spl) { + SplinePoint *sp; + Spline *s, *first; + /* look for likely rounding errors (caused by the two rotations) and */ + /* get rid of them */ + + while ( spl!=NULL ) { + for ( sp=spl->first; ; ) { + sp->me.x = rint(sp->me.x*64)/64.; + sp->me.y = rint(sp->me.y*64)/64.; + sp->nextcp.x = rint(sp->nextcp.x*64)/64.; + sp->nextcp.y = rint(sp->nextcp.y*64)/64.; + sp->prevcp.x = rint(sp->prevcp.x*64)/64.; + sp->prevcp.y = rint(sp->prevcp.y*64)/64.; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + first = NULL; + /* look for things which should be horizontal or vertical lines and make them so */ + for ( s=spl->first->next; s!=NULL && s!=first; s=s->to->next ) { + real xdiff = s->to->me.x-s->from->me.x, ydiff = s->to->me.y-s->from->me.y; + real x,y; + if (( xdiff<.01 && xdiff>-.01 ) && (ydiff<-10 || ydiff>10)) { + xdiff /= 2; + s->to->me.x = (s->from->me.x += xdiff); + s->from->prevcp.x += xdiff; + s->from->nextcp.x += xdiff; + s->to->prevcp.x -= xdiff; + s->to->nextcp.x -= xdiff; + if ( s->to->nonextcp ) s->to->nextcp.x = s->to->me.x; + if ( s->to->noprevcp ) s->to->prevcp.x = s->to->me.x; + } else if (( ydiff<.01 && ydiff>-.01 ) && (xdiff<-10 || xdiff>10)) { + ydiff /= 2; + s->to->me.y = (s->from->me.y += ydiff); + s->from->prevcp.y += ydiff; + s->from->nextcp.y += ydiff; + s->to->prevcp.y -= ydiff; + s->to->nextcp.y -= ydiff; + if ( s->to->nonextcp ) s->to->nextcp.y = s->to->me.y; + if ( s->to->noprevcp ) s->to->prevcp.y = s->to->me.y; + } + xdiff = s->from->nextcp.x-s->from->me.x; ydiff = s->from->nextcp.y-s->from->me.y; + if (( xdiff<.01 && xdiff>-.01 ) && (ydiff<-10 || ydiff>10)) + s->from->nextcp.x = s->from->me.x; + if (( ydiff<.01 && ydiff>-.01 ) && (xdiff<-10 || xdiff>10)) + s->from->nextcp.y = s->from->me.y; + xdiff = s->to->prevcp.x-s->to->me.x; ydiff = s->to->prevcp.y-s->to->me.y; + if (( xdiff<.01 && xdiff>-.01 ) && (ydiff<-10 || ydiff>10)) + s->to->prevcp.x = s->to->me.x; + if (( ydiff<.01 && ydiff>-.01 ) && (xdiff<-10 || xdiff>10)) + s->to->prevcp.y = s->to->me.y; + x = s->from->me.x; y = s->from->me.y; + if ( x==s->from->nextcp.x && x==s->to->prevcp.x && x==s->to->me.x && + ((yto->me.y && s->from->nextcp.y>=y && s->from->nextcp.y<=s->to->prevcp.y && s->to->prevcp.y<=s->to->me.y) || + (y>=s->to->me.y && s->from->nextcp.y<=y && s->from->nextcp.y>=s->to->prevcp.y && s->to->prevcp.y>=s->to->me.y))) { + s->from->nonextcp = true; s->to->noprevcp = true; + s->from->nextcp = s->from->me; + s->to->prevcp = s->to->me; + } + if ( y==s->from->nextcp.y && y==s->to->prevcp.y && y==s->to->me.y && + ((xto->me.x && s->from->nextcp.x>=x && s->from->nextcp.x<=s->to->prevcp.x && s->to->prevcp.x<=s->to->me.x) || + (x>=s->to->me.x && s->from->nextcp.x<=x && s->from->nextcp.x>=s->to->prevcp.x && s->to->prevcp.x>=s->to->me.x))) { + s->from->nonextcp = true; s->to->noprevcp = true; + s->from->nextcp = s->from->me; + s->to->prevcp = s->to->me; + } + SplineRefigure(s); + if ( first==NULL ) first = s; + } + spl = spl->next; + } +} + +static double IntersectLine(Spline *spline1,Spline *spline2) { + double t1s[10], t2s[10]; + BasePoint pts[9]; + double mint=1; + int i; + + if ( !SplinesIntersect(spline1,spline2,pts,t1s,t2s)) +return( -1 ); + for ( i=0; i<10 && t1s[i]!=-1; ++i ) { + if ( t1s[i]<.001 && t1s[i]>.999 ) + /* Too close to end point, ignore it */; + else if ( t1s[i]first->next; s!=NULL && s!=first ; s = s->to->next ) { + cur = IntersectLine(line,s); + if ( cur>.001 && (t==-1 || curnext; + } + if ( t!=-1 ) { + SplinePoint *from = line->from; + SplineBisect(line,t); + line = from->next; + SplinePointFree(line->to->next->to); + SplineFree(line->to->next); + line->to->next = NULL; +return( true ); + } +return( false ); +} + +/* finds all intersections between this spline and all the other splines in the */ +/* character */ +static double *BottomFindIntersections(Spline *bottom,SplineSet *lines,SplineSet *spl) { + double *ts; + int tcnt, tmax; + double t1s[26], t2s[26]; + BasePoint pts[25]; + Spline *first, *s; + int i,j; + + tmax = 100; + ts = galloc(tmax*sizeof(double)); + tcnt = 0; + + while ( spl!=NULL ) { + first = NULL; + for ( s = spl->first->next; s!=NULL && s!=first ; s = s->to->next ) { + if ( SplinesIntersect(bottom,s,pts,t1s,t2s)) { + for ( i=0; i<25 && t1s[i]!=-1; ++i ) if ( t2s[i]>.001 && t2s[i]<.999 ) { + if ( tcnt>=tmax ) { + tmax += 100; + ts = grealloc(ts,tmax*sizeof(double)); + } + ts[tcnt++] = t1s[i]; + } + } + if ( first==NULL ) first = s; + } + spl = spl->next; + } + while ( lines!=NULL ) { + first = NULL; + for ( s = lines->first->next; s!=NULL && s!=first ; s = s->to->next ) { + if ( SplinesIntersect(bottom,s,pts,t1s,t2s)) { + for ( i=0; i<25 && t1s[i]!=-1; ++i ) if ( t2s[i]>.001 && t2s[i]<.999 ) { + if ( tcnt>=tmax ) { + tmax += 100; + ts = grealloc(ts,tmax*sizeof(double)); + } + ts[tcnt++] = t1s[i]; + } + } + if ( first==NULL ) first = s; + } + lines = lines->next; + } + if ( tcnt==0 ) { + free(ts); +return( NULL ); + } + for ( i=0; its[j] ) { + double temp = ts[i]; + ts[i] = ts[j]; + ts[j] = temp; + } + } + for ( i=j=1; ilast->me.x==pt->x && lines->last->me.y==pt->y ) +return( true ); + lines = lines->next; + } +return( false ); +} + +static SplinePoint *SplinePointMidCreate(Spline *s,double t) { +return( SplinePointCreate( + ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d, + ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d + )); +} + +static int MidLineCompetes(Spline *s,double t,double shadow_length,SplineSet *spl) { + SplinePoint *to = SplinePointMidCreate(s,t); + SplinePoint *from = SplinePointCreate(to->me.x-shadow_length,to->me.y); + Spline *line = SplineMake(from,to,s->order2); + int ret; + + ret = ClipLineTo3D(line,spl); + SplinePointFree(line->to); /* This might not be the same as to */ + SplinePointFree(line->from); /* This will be the same as from */ + SplineFree(line); +return( !ret ); +} + +static void SplineComplete(SplineSet *cur,Spline *s,double t_of_from,double t_of_to) { + SplinePoint *to; + double dt = t_of_to-t_of_from; + Spline1D x,y; + /* Very similar to SplineBisect */ + + to = SplinePointMidCreate(s,t_of_to); + + x.d = cur->last->me.x; + x.c = dt*(s->splines[0].c + t_of_from*(2*s->splines[0].b + 3*s->splines[0].a*t_of_from)); + x.b = dt*dt*(s->splines[0].b + 3*s->splines[0].a*t_of_from); + x.a = dt*dt*dt*s->splines[0].a; + cur->last->nextcp.x = x.c/3 + x.d; + to->prevcp.x = cur->last->nextcp.x + (x.b+x.c)/3; + + y.d = cur->last->me.y; + y.c = dt*(s->splines[1].c + t_of_from*(2*s->splines[1].b + 3*s->splines[1].a*t_of_from)); + y.b = dt*dt*(s->splines[1].b + 3*s->splines[1].a*t_of_from); + y.a = dt*dt*dt*s->splines[1].a; + cur->last->nextcp.y = y.c/3 + y.d; + to->prevcp.y = cur->last->nextcp.y + (y.b+y.c)/3; + to->noprevcp = cur->last->nonextcp = false; + + SplineMake(cur->last,to,s->order2); + cur->last = to; +} + +/* I wish I did not need this routine, but unfortunately my remove overlap */ +/* gets very confused by two splines which are parrallel, and without this */ +/* fixup we get a lot of those at the edges */ +static SplineSet *MergeLinesToBottoms(SplineSet *bottoms,SplineSet *lines) { + SplineSet *prev, *l; + + while ( bottoms!=NULL ) { + for ( prev=NULL, l=lines; + l!=NULL && (l->last->me.x!=bottoms->first->me.x || l->last->me.y!=bottoms->first->me.y); + prev=l, l=l->next ); + if ( l!=NULL ) { + if ( prev==NULL ) + lines = l->next; + else + prev->next = l->next; + SplineMake(l->first,bottoms->first,l->first->next->order2); + bottoms->first = l->first; + SplineFree(l->last->prev); + SplinePointFree(l->last); + chunkfree(l,sizeof(*l)); + } + for ( prev=NULL, l=lines; + l!=NULL && (l->last->me.x!=bottoms->last->me.x || l->last->me.y!=bottoms->last->me.y); + prev=l, l=l->next ); + if ( l!=NULL ) { + if ( prev==NULL ) + lines = l->next; + else + prev->next = l->next; + SplineMake(bottoms->last,l->first,l->first->next->order2); + bottoms->last = l->first; + l->first->next = NULL; + SplineFree(l->last->prev); + SplinePointFree(l->last); + chunkfree(l,sizeof(*l)); + } + bottoms = bottoms->next; + } +return( lines ); +} + +static SplineSet *ClipBottomTo3D(SplineSet *bottom,SplineSet *lines,SplineSet *spl, + double shadow_length) { + SplineSet *head=NULL, *last=NULL, *cur, *next; + Spline *s; + double *ts; + SplinePoint *sp; + int i; + + while ( bottom!=NULL ) { + next = bottom->next; + cur = NULL; + for ( s=bottom->first->next; s!=NULL ; s = s->to->next ) { + if ( LineAtPointCompletes(lines,&s->from->me) && cur==NULL ) { + cur = chunkalloc(sizeof(SplineSet)); + cur->first = cur->last = SplinePointCreate(s->from->me.x,s->from->me.y); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + ts = BottomFindIntersections(s,lines,spl); + if ( ts==NULL || ts[0]==-1 ) { + if ( cur!=NULL ) { + cur->last->nextcp = s->from->nextcp; + cur->last->nextcpdef = s->from->nextcpdef; + cur->last->nonextcp = s->from->nonextcp; + sp = SplinePointCreate(s->to->me.x,s->to->me.y); + sp->prevcp = s->to->prevcp; + sp->prevcpdef = s->to->prevcpdef; + sp->noprevcp = s->to->prevcpdef; + SplineMake(cur->last,sp,s->order2); + cur->last = sp; + } + } else { + i = 0; + if ( cur!=NULL ) { + SplineComplete(cur,s,0,ts[0]); + cur = NULL; + i=1; + } + while ( ts[i]!=-1 ) { + double tend = ts[i+1]==-1 ? 1 : ts[i+1]; + if ( MidLineCompetes(s,(ts[i]+tend)/2,shadow_length,spl)) { + cur = chunkalloc(sizeof(SplineSet)); + cur->first = cur->last = SplinePointMidCreate(s,ts[i]); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + SplineComplete(cur,s,ts[i],tend); + if ( ts[i+1]==-1 ) + break; + cur = NULL; + i += 2; + } else + ++i; + } + free(ts); + } + } + SplinePointListFree(bottom); + bottom = next; + } +return( head ); +} + +static SplineSet *ClipTo3D(SplineSet *bottoms,SplineSet *lines,SplineSet *spl, + double shadow_length) { + SplineSet *temp; + SplineSet *head; + + for ( temp=lines; temp!=NULL; temp=temp->next ) { + ClipLineTo3D(temp->first->next,spl); + temp->last = temp->first->next->to; + } + head = ClipBottomTo3D(bottoms,lines,spl,shadow_length); + lines = MergeLinesToBottoms(head,lines); + if ( lines!=NULL ) { + for ( temp=lines; temp->next!=NULL; temp=temp->next); + temp->next = head; +return( lines ); + } else +return( head ); +} + +static SplineSet *SSShadow(SplineSet *spl,real angle, real outline_width, + real shadow_length,SplineChar *sc, int wireframe) { + real trans[6]; + StrokeInfo si; + SplineSet *internal, *temp, *bottom, *fatframe, *lines; + int isfore = spl==sc->layers[ly_fore].splines; + + if ( spl==NULL ) +return( NULL ); + + trans[0] = trans[3] = cos(angle); + trans[2] = sin(angle); + trans[1] = -trans[2]; + trans[4] = trans[5] = 0; + spl = SplinePointListTransform(spl,trans,true); + SSCleanup(spl); + + internal = NULL; + if ( outline_width!=0 && !wireframe ) { + memset(&si,0,sizeof(si)); + si.removeexternal = true; + si.removeoverlapifneeded = true; + si.radius = outline_width; + temp = SplinePointListCopy(spl); /* SSStroke confuses the direction I think */ + internal = SSStroke(temp,&si,sc); + SplinePointListsFree(temp); + SplineSetsAntiCorrect(internal); + } + + lines = NULL; + bottom = AddVerticalExtremaAndMove(spl,shadow_length,wireframe,sc,&lines); + if ( !wireframe ) + spl = SplineSetRemoveOverlap(sc,spl,over_remove); /* yes, spl, NOT frame. frame is always NULL if !wireframe */ + else { + lines = ClipTo3D(bottom,lines,spl,shadow_length); + for ( temp=spl; temp->next!=NULL; temp=temp->next); + temp->next = lines; + if ( outline_width!=0 ) { + memset(&si,0,sizeof(si)); + si.radius = outline_width/2; + si.removeoverlapifneeded = true; + fatframe = SSStroke(spl,&si,sc); + SplinePointListsFree(spl); +#if 0 + spl = SplineSetRemoveOverlap(sc,fatframe,over_remove); /* Too likely to cause remove overlap problems */ +#else + spl = fatframe; +#endif + } + } + + if ( internal!=NULL ) { + for ( temp = spl; temp->next!=NULL; temp=temp->next ); + temp->next = internal; + } + + trans[1] = -trans[1]; trans[2] = -trans[2]; + spl = SplinePointListTransform(spl,trans,true); /* rotate back */ + SSCleanup(spl); + if ( isfore ) { + sc->width += fabs(trans[0]*shadow_length); + if ( trans[0]<0 ) { + trans[4] = -trans[0]*shadow_length; + trans[0] = trans[3] = 1; + trans[1] = trans[2] = 0; + spl = SplinePointListTransform(spl,trans,true); + } + } + +return( spl ); +} + +void FVShadow(FontView *fv,real angle, real outline_width, + real shadow_length, int wireframe) { + int i, cnt=0; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_fore].splines ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Shadowing,_STR_Shadowing,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) + if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[ly_fore].splines ) { + SplineChar *sc = fv->sf->chars[i]; + SCPreserveState(sc,false); + sc->layers[ly_fore].splines = SSShadow(sc->layers[ly_fore].splines,angle,outline_width,shadow_length,sc,wireframe); + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void CVShadow(CharView *cv,real angle, real outline_width, + real shadow_length,int wireframe) { + CVPreserveState(cv); + cv->layerheads[cv->drawmode]->splines = SSShadow(cv->layerheads[cv->drawmode]->splines,angle,outline_width,shadow_length,cv->sc,wireframe); + CVCharChangedUpdate(cv); +} + +static void MVShadow(MetricsView *mv,real angle, real outline_width, + real shadow_length,int wireframe) { + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + SCPreserveState(sc,false); + sc->layers[ly_fore].splines = SSShadow(sc->layers[ly_fore].splines,angle,outline_width,shadow_length,sc,wireframe); + SCCharChangedUpdate(sc); + } +} + +static real def_shadow_len=100, def_sun_angle= -45; + +#define CID_ShadowLen 1001 +#define CID_LightAngle 1002 + +static int SD_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + OutlineData *od = GDrawGetUserData(GGadgetGetWindow(g)); + real width, angle, len; + int err = 0; + + width = GetRealR(od->gw,CID_Width,_STR_Width,&err); + len = GetRealR(od->gw,CID_ShadowLen,_STR_ShadowLen,&err); + angle = GetRealR(od->gw,CID_LightAngle,_STR_LightAngle,&err); + if ( err ) +return(true); + def_outline_width = width; + def_shadow_len = len; + def_sun_angle = angle; + angle *= -3.1415926535897932/180; + angle -= 3.1415926535897932/2; + if ( od->fv!=NULL ) + FVShadow(od->fv,angle,width,len,od->wireframe); + else if ( od->cv!=NULL ) + CVShadow(od->cv,angle,width,len,od->wireframe); + else if ( od->mv!=NULL ) + MVShadow(od->mv,angle,width,len,od->wireframe); + od->done = true; + } +return( true ); +} + +void ShadowDlg(FontView *fv, CharView *cv,MetricsView *mv,int wireframe) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[10]; + GTextInfo label[10]; + OutlineData od; + char buffer[20], buffer2[20], buffer3[20]; + int i; + + od.done = false; + od.fv = fv; + od.cv = cv; + od.mv = mv; + od.wireframe = wireframe; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1< +#include +#include +#include +#include +#include +#include +#include + +static int enc_num = em_base; + +static int32 tex_base_encoding[] = { + 0x0000, 0x02d9, 0xfb01, 0xfb02, 0x2044, 0x02dd, 0x0141, 0x0142, + 0x02db, 0x02da, 0x000a, 0x02d8, 0x2212, 0x000d, 0x017d, 0x017e, + 0x02c7, 0x0131, 0xf6be, 0xfb00, 0xfb03, 0xfb04, 0x2260, 0x221e, + 0x2264, 0x2265, 0x2202, 0x2211, 0x220f, 0x03c0, 0x0060, 0x0027, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x2019, + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x2018, 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, + 0x20ac, 0x222b, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, + 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x2126, 0x221a, 0x2248, + 0x0090, 0x0091, 0x0092, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, + 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x2206, 0x25ca, 0x0178, + 0x0000, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, + 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x002d, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, + 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, + 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, + 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 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 Encoding texbase = { em_base, "TeX-Base-Encoding", 256, tex_base_encoding, NULL, NULL, 1 }; +Encoding *enclist = &texbase; + +static char *getPfaEditEncodings(void) { + static char *encfile=NULL; + char buffer[1025]; + + if ( encfile!=NULL ) +return( encfile ); + if ( getPfaEditDir(buffer)==NULL ) +return( NULL ); + sprintf(buffer,"%s/Encodings.ps", getPfaEditDir(buffer)); + encfile = copy(buffer); +return( encfile ); +} + +static void EncodingFree(Encoding *item) { + int i; + + free(item->enc_name); + if ( item->psnames!=NULL ) for ( i=0; ichar_cnt; ++i ) + free(item->psnames[i]); + free(item->psnames); + free(item->unicode); + free(item); +} + +/* Parse a TXT file from the unicode consortium */ + /* Unicode Consortium Format A */ + /* List of lines with several fields, */ + /* first is the encoding value (in hex), second the Unicode value (in hex) */ + /* # is a comment character (to eol) */ +static Encoding *ParseConsortiumEncodingFile(FILE *file) { + char buffer[200]; + int32 encs[1024]; + int enc, unienc, max, i; + Encoding *item; + + for ( i=0; i<1024; ++i ) + encs[i] = 0; + for ( i=0; i<32; ++i ) + encs[i] = i; + for ( i=127; i<0xa0; ++i ) + encs[i] = i; + max = -1; + + while ( fgets(buffer,sizeof(buffer),file)!=NULL ) { + if ( ishexdigit(buffer[0]) ) { + if ( sscanf(buffer, "%x %x", (unsigned *) &enc, (unsigned *) &unienc)==2 && + enc<1024 && enc>=0 ) { + encs[enc] = unienc; + if ( enc>max ) max = enc; + } + } + } + + if ( max==-1 ) +return( NULL ); + + ++max; + if ( max<256 ) max = 256; + item = gcalloc(1,sizeof(Encoding)); + item->char_cnt = max; + item->unicode = galloc(max*sizeof(int32)); + memcpy(item->unicode,encs,max*sizeof(int32)); +return( item ); +} + +static void DeleteEncoding(Encoding *me); + +static void RemoveMultiples(Encoding *item) { + Encoding *test; + + for ( test=enclist; test!=NULL; test = test->next ) { + if ( strcmp(test->enc_name,item->enc_name)==0 ) + break; + } + if ( test!=NULL ) + DeleteEncoding(test); +} + +void ParseEncodingFile(char *filename) { + FILE *file; + char *orig = filename; + Encoding *head, *item, *prev; + unichar_t *name; + char buffer[10]; unichar_t ubuf[100]; + int i,ch; + + if ( filename==NULL ) filename = getPfaEditEncodings(); + file = fopen(filename,"r"); + if ( file==NULL ) { + if ( orig!=NULL ) + GDrawError("Couldn't open encoding file: %s", orig); +return; + } + ch = getc(file); + ungetc(ch,file); + if ( ch=='#' || ch=='0' ) + head = ParseConsortiumEncodingFile(file); + else + head = PSSlurpEncodings(file); + fclose(file); + if ( head==NULL ) { + GWidgetErrorR(_STR_BadEncFormat,_STR_BadEncFormat ); +return; + } + + for ( i=0, prev=NULL, item=head; item!=NULL; prev = item, item=item->next, ++i ) { + item->enc_num = ++enc_num; + if ( item->enc_name==NULL ) { + if ( item==head && item->next==NULL ) + u_strcpy(ubuf,GStringGetResource(_STR_PleaseNameEnc,NULL) ); + else { + u_strcpy(ubuf,GStringGetResource(_STR_PleaseNameEncPre,NULL) ); + if ( i==1 ) + u_strcat(ubuf,GStringGetResource(_STR_First,NULL) ); + else if ( i==2 ) + u_strcat(ubuf,GStringGetResource(_STR_Second,NULL) ); + else if ( i==3 ) + u_strcat(ubuf,GStringGetResource(_STR_Third,NULL) ); + else { + sprintf(buffer,"%d", i ); + uc_strcat(ubuf,buffer); + u_strcat(ubuf,GStringGetResource(_STR_Th,NULL) ); + } + u_strcat(ubuf,GStringGetResource(_STR_PleaseNameEncPost,NULL) ); + } + name = GWidgetAskString(ubuf,NULL,ubuf); + if ( name!=NULL ) { + item->enc_name = cu_copy(name); + free(name); + } else { + if ( prev==NULL ) + head = item->next; + else + prev->next = item->next; + EncodingFree(item); + item = prev; + } + } + } + for ( item=head; item!=NULL; item=item->next ) + RemoveMultiples(item); + + if ( enclist == NULL ) + enclist = head; + else { + for ( item=enclist; item->next!=NULL; item=item->next ); + item->next = head; + } +} + +void LoadPfaEditEncodings(void) { + ParseEncodingFile(NULL); +} + +void DumpPfaEditEncodings(void) { + FILE *file; + Encoding *item; + int i; + + for ( item=enclist; item!=NULL && item->builtin; item=item->next ); + if ( item==NULL ) { + unlink(getPfaEditEncodings()); +return; + } + + file = fopen( getPfaEditEncodings(), "w"); + if ( file==NULL ) { + fprintf(stderr, "couldn't write encodings file\n" ); +return; + } + + for ( item=enclist; item!=NULL; item = item->next ) if ( !item->builtin ) { + fprintf( file, "/%s [\n", item->enc_name ); + for ( i=0; ichar_cnt; ++i ) { + if ( item->psnames!=NULL && item->psnames[i]!=NULL ) + fprintf( file, " /%s", item->psnames[i]); + else if ( item->unicode[i]<' ' || (item->unicode[i]>=0x7f && item->unicode[i]<0xa0)) + fprintf( file, " /.notdef" ); + else if ( item->unicode[i]unicode[i]]!=NULL ) + fprintf( file, " /%s", psunicodenames[item->unicode[i]]); + else if ( item->unicode[i]<0x10000 ) + fprintf( file, " /uni%04X", item->unicode[i]); + else + fprintf( file, " /u%04X", item->unicode[i]); + if ( (i&0xf)==0 ) + fprintf( file, "\t\t%% 0x%02x\n", i ); + else + putc('\n',file); + } + fprintf( file, "] def\n\n" ); + } + fclose(file); +} + +static void DeleteEncoding(Encoding *me) { + FontView *fv; + Encoding *prev; + BDFFont *bdf; + + if ( me->builtin ) +return; + + if ( default_encoding == me->enc_num ) + default_encoding = e_iso8859_1; + for ( fv = fv_list; fv!=NULL; fv = fv->next ) { + if ( fv->sf->encoding_name==me->enc_num ) { + fv->sf->encoding_name = em_none; + for ( bdf=fv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + bdf->encoding_name = em_none; + } + } + if ( me==enclist ) + enclist = me->next; + else { + for ( prev = enclist; prev!=NULL && prev->next!=me; prev=prev->next ); + if ( prev!=NULL ) prev->next = me->next; + } + EncodingFree(me); + DumpPfaEditEncodings(); +} + +static GTextInfo *EncodingList(void) { + GTextInfo *ti; + int i; + Encoding *item; + + i = 0; + for ( item=enclist; item!=NULL ; item=item->next ) + if ( !item->builtin ) + ++i; + ti = gcalloc(i+1,sizeof(GTextInfo)); + i = 0; + for ( item=enclist; item!=NULL ; item=item->next ) + if ( !item->builtin ) + ti[i++].text = uc_copy(item->enc_name); + if ( i!=0 ) + ti[0].selected = true; +return( ti ); +} + +#define CID_Encodings 1001 + +static int DE_Delete(GGadget *g, GEvent *e) { + GWindow gw; + int *done; + GGadget *list; + int sel,i; + Encoding *item; + + if ( e->type==et_controlevent && + (e->u.control.subtype == et_buttonactivate || + e->u.control.subtype == et_listdoubleclick )) { + gw = GGadgetGetWindow(g); + done = GDrawGetUserData(gw); + list = GWidgetGetControl(gw,CID_Encodings); + sel = GGadgetGetFirstListSelectedItem(list); + i=0; + for ( item=enclist; item!=NULL; item=item->next ) { + if ( item->builtin ) + /* Do Nothing */; + else if ( i==sel ) + break; + else + ++i; + } + if ( item!=NULL ) + DeleteEncoding(item); + *done = true; + } +return( true ); +} + +static int DE_Cancel(GGadget *g, GEvent *e) { + GWindow gw; + int *done; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + done = GDrawGetUserData(gw); + *done = true; + } +return( true ); +} + +static int de_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + int *done = GDrawGetUserData(gw); + *done = true; + } else if ( event->type == et_char ) { +return( false ); + } +return( true ); +} + +void RemoveEncoding(void) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[5]; + GTextInfo label[5]; + Encoding *item; + int done = 0; + + for ( item=enclist; item!=NULL && item->builtin; item=item->next ); + if ( item==NULL ) +return; + + memset(&gcd,0,sizeof(gcd)); + memset(&label,0,sizeof(label)); + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<encoding_name!=em_none || sf->charcnt>=1500 ) +return(NULL); + + name = GWidgetAskStringR(_STR_PleaseNameEnc,NULL,_STR_PleaseNameEnc); + if ( name==NULL ) +return(NULL); + item = gcalloc(1,sizeof(Encoding)); + item->enc_num = ++enc_num; + item->enc_name = cu_copy(name); + free(name); + item->char_cnt = sf->charcnt; + item->unicode = gcalloc(sf->charcnt,sizeof(int32)); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]->unicodeenc!=-1 ) + item->unicode[i] = sf->chars[i]->unicodeenc; + else if ( strcmp(sf->chars[i]->name,".notdef")!=0 ) { + if ( item->psnames==NULL ) + item->psnames = gcalloc(sf->charcnt,sizeof(unichar_t *)); + item->psnames[i] = copy(sf->chars[i]->name); + } + } + RemoveMultiples(item); + + if ( enclist == NULL ) + enclist = item; + else { + for ( temp=enclist; temp->next!=NULL; temp=temp->next ); + temp->next = item; + } + DumpPfaEditEncodings(); +return( item ); +} + +void LoadEncodingFile(void) { + static unichar_t filter[] = { '*','.','{','p','s',',','P','S',',','t','x','t',',','T','X','T',',','e','n','c',',','E','N','C','}', '\0' }; + unichar_t *fn; + char *filename; + + fn = GWidgetOpenFile(GStringGetResource(_STR_LoadEncoding,NULL), NULL, filter, NULL,NULL); + if ( fn==NULL ) +return; + filename = u2def_copy(fn); + ParseEncodingFile(filename); + free(fn); free(filename); + DumpPfaEditEncodings(); +} + +/* ************************************************************************** */ +/* ****************************** CID Encodings ***************************** */ +/* ************************************************************************** */ +struct cidmap { + char *registry, *ordering; + int supplement, maxsupple; + int cidmax; /* Max cid found in the charset */ + int namemax; /* Max cid with useful info */ + uint32 *unicode; + char **name; + struct cidmap *next; +}; + +static struct cidmap *cidmaps = NULL; + +int CID2NameEnc(struct cidmap *map,int cid, char *buffer, int len) { + int enc = -1; + +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + if ( map==NULL ) + sprintf(buffer,"cid-%d", cid); + else if ( cidnamemax && map->name[cid]!=NULL ) + strncpy(buffer,map->name[cid],len); + else if ( cid==0 || (cidnamemax && map->unicode[cid]!=0 )) { + enc = map->unicode[cid]; + if ( encordering, cid); +#else + if ( map==NULL ) + snprintf(buffer,len,"cid-%d", cid); + else if ( cidnamemax && map->name[cid]!=NULL ) + strncpy(buffer,map->name[cid],len); + else if ( cid==0 || (cidnamemax && map->unicode[cid]!=0 )) { + if ( map->unicode==NULL || map->namemax==0 ) + enc = 0; + else + enc = map->unicode[cid]; + if ( encordering, cid); +#endif +return( enc ); +} + +int NameEnc2CID(struct cidmap *map,int enc, char *name) { + int i; + + if ( map==NULL ) +return( -1 ); + if ( enc!=-1 ) { + for ( i=0; inamemax; ++i ) + if ( map->unicode[i]==enc ) +return( i ); + } else { + for ( i=0; inamemax; ++i ) + if ( map->name[i]!=NULL && strcmp(map->name[i],name)==0 ) +return( i ); + } +return( -1 ); +} + +int MaxCID(struct cidmap *map) { +return( map->cidmax ); +} + +static char *SearchDirForCidMap(char *dir,char *registry,char *ordering, + int supplement,char **maybefile) { + char maybe[FILENAME_MAX+1]; + struct dirent *ent; + DIR *d; + int len, rlen = strlen(registry), olen=strlen(ordering); + char *pt, *end, *ret; + int test, best = -1; + + if ( dir==NULL ) +return( NULL ); + + if ( *maybefile!=NULL ) { + char *pt = strrchr(*maybefile,'.'); + while ( pt>*maybefile && isdigit(pt[-1])) + --pt; + best = strtol(pt,NULL,10); + } + + d = opendir(dir); + if ( d==NULL ) +return( NULL ); + while ( (ent = readdir(d))!=NULL ) { + if ( (len = strlen(ent->d_name))<8 ) + continue; + if ( strcmp(ent->d_name+len-7,".cidmap")!=0 ) + continue; + if ( strncmp(ent->d_name,registry,rlen)!=0 || ent->d_name[rlen]!='-' ) + continue; + pt = ent->d_name+rlen+1; + if ( strncmp(pt,ordering,olen)!=0 || pt[olen]!='-' ) + continue; + pt += olen+1; + if ( !isdigit(*pt)) + continue; + test = strtol(pt,&end,10); + if ( *end!='.' ) + continue; + if ( test>=supplement ) { + ret = galloc(strlen(dir)+1+len+1); + strcpy(ret,dir); + strcat(ret,"/"); + strcat(ret,ent->d_name); + closedir(d); +return( ret ); + } else if ( test>best ) { + best = test; + strcpy(maybe,ent->d_name); + } + } + closedir(d); + if ( best>-1 ) { + ret = galloc(strlen(dir)+1+strlen(maybe)+1); + strcpy(ret,dir); + strcat(ret,"/"); + strcat(ret,maybe); + *maybefile = ret; + } +return( NULL ); +} + +static char *SearchNoLibsDirForCidMap(char *dir,char *registry,char *ordering, + int supplement,char **maybefile) { + char *ret; + + if ( dir==NULL || strstr(dir,"/.libs")==NULL ) +return( NULL ); + + dir = copy(dir); + *strstr(dir,"/.libs") = '\0'; + + ret = SearchDirForCidMap(dir,registry,ordering,supplement,maybefile); + free(dir); +return( ret ); +} + +static struct cidmap *MakeDummyMap(char *registry,char *ordering,int supplement) { + struct cidmap *ret = galloc(sizeof(struct cidmap)); + + ret->registry = copy(registry); + ret->ordering = copy(ordering); + ret->supplement = ret->maxsupple = supplement; + ret->cidmax = ret->namemax = 0; + ret->unicode = NULL; ret->name = NULL; + ret->next = cidmaps; + cidmaps = ret; +return( ret ); +} + +static struct cidmap *LoadMapFromFile(char *file,char *registry,char *ordering, + int supplement) { + struct cidmap *ret = galloc(sizeof(struct cidmap)); + char *pt = strrchr(file,'.'); + FILE *f; + int cid1, cid2, uni, cnt, i; + char name[100]; + + while ( pt>file && isdigit(pt[-1])) + --pt; + ret->supplement = ret->maxsupple = strtol(pt,NULL,10); + if ( supplement>ret->maxsupple ) + ret->maxsupple = supplement; + ret->registry = copy(registry); + ret->ordering = copy(ordering); + ret->next = cidmaps; + cidmaps = ret; + + f = fopen( file,"r" ); + if ( f==NULL ) { + GDrawError("Couldn't open %s", file ); + ret->cidmax = ret->namemax = 0; + ret->unicode = NULL; ret->name = NULL; + } else if ( fscanf( f, "%d %d", &ret->cidmax, &ret->namemax )!=2 ) { + GDrawError( "%s is not a cidmap file, please download\nhttp://fontforge.sourceforge.net/cidmaps.tgz", file ); + fprintf( stderr, "%s is not a cidmap file, please download\nhttp://fontforge.sourceforge.net/cidmaps.tgz", file ); + ret->cidmax = ret->namemax = 0; + ret->unicode = NULL; ret->name = NULL; + } else { + ret->unicode = gcalloc(ret->namemax+1,sizeof(uint32)); + ret->name = gcalloc(ret->namemax+1,sizeof(char *)); + while ( 1 ) { + cnt=fscanf( f, "%d..%d %x", &cid1, &cid2, (unsigned *) &uni ); + if ( cnt<=0 ) + break; + if ( cid1>ret->namemax ) + continue; + if ( cnt==3 ) { + if ( cid2>ret->namemax ) cid2 = ret->namemax; + for ( i=cid1; i<=cid2; ++i ) + ret->unicode[i] = uni++; + } else if ( cnt==1 ) { + if ( fscanf(f,"%x", (unsigned *) &uni )==1 ) + ret->unicode[cid1] = uni; + else if ( fscanf(f," /%s", name )==1 ) + ret->name[cid1] = copy(name); + } + } + fclose(f); + } + free(file); +return( ret ); +} + +struct cidmap *FindCidMap(char *registry,char *ordering,int supplement,SplineFont *sf) { + struct cidmap *map, *maybe=NULL; + char *file, *maybefile=NULL; + int maybe_sup = -1; + static int buts[] = { _STR_UseIt, _STR_Search, 0 }; + static int buts2[] = { _STR_UseIt, _STR_GiveUp, 0 }; + static int buts3[] = { _STR_Browse, _STR_GiveUp, 0 }; + unichar_t ubuf[100]; char buf[100]; + int ret; + + if ( sf!=NULL && sf->loading_cid_map ) +return( NULL ); + + for ( map = cidmaps; map!=NULL; map = map->next ) { + if ( strcmp(map->registry,registry)==0 && strcmp(map->ordering,ordering)==0 ) { + if ( supplement<=map->supplement ) +return( map ); + else if ( maybe==NULL || maybe->supplementsupplement ) + maybe = map; + } + } + if ( maybe!=NULL && supplement<=maybe->maxsupple ) +return( maybe ); /* User has said it's ok to use maybe at this supplement level */ + + file = SearchDirForCidMap(".",registry,ordering,supplement,&maybefile); + if ( file==NULL ) + file = SearchDirForCidMap(GResourceProgramDir,registry,ordering,supplement,&maybefile); + if ( file==NULL ) + file = SearchNoLibsDirForCidMap(GResourceProgramDir,registry,ordering,supplement,&maybefile); +#ifdef SHAREDIR + if ( file==NULL ) + file = SearchDirForCidMap(SHAREDIR,registry,ordering,supplement,&maybefile); +#endif + if ( file==NULL ) + file = SearchDirForCidMap(getPfaEditShareDir(),registry,ordering,supplement,&maybefile); + if ( file==NULL ) + file = SearchDirForCidMap("/usr/share/fontforge",registry,ordering,supplement,&maybefile); + + if ( file==NULL && (maybe!=NULL || maybefile!=NULL)) { + if ( maybefile!=NULL ) { + char *pt = strrchr(maybefile,'.'); + while ( pt>maybefile && isdigit(pt[-1])) + --pt; + maybe_sup = strtol(pt,NULL,10); + if ( maybe!=NULL && maybe->supplement >= maybe_sup ) { + free(maybefile); maybefile = NULL; + maybe_sup = maybe->supplement; + } else + maybe = NULL; + } + if ( maybe!=NULL ) + maybe_sup = maybe->supplement; + if ( sf!=NULL ) sf->loading_cid_map = true; + ret = GWidgetAskR(_STR_UseCidMap,buts,0,1,_STR_SearchForCIDMap, + registry,ordering,supplement,maybe_sup); + if ( sf!=NULL ) sf->loading_cid_map = false; + if ( ret==0 ) { + if ( maybe!=NULL ) { + maybe->maxsupple = supplement; +return( maybe ); + } else { + file = maybefile; + maybefile = NULL; + } + } + } + + if ( file==NULL ) { + unichar_t *uret; +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf(buf,"%s-%s-*.cidmap", registry, ordering ); +#else + snprintf(buf,sizeof(buf),"%s-%s-*.cidmap", registry, ordering ); +#endif + uc_strcpy(ubuf,buf); + if ( maybe==NULL && maybefile==NULL ) { + ret = GWidgetAskR(_STR_NoCidmap,buts3,0,1,_STR_LookForCidmap, +#ifdef SHAREDIR + SHAREDIR +#else + getPfaEditShareDir()==NULL?"/usr/share/fontforge":getPfaEditShareDir() +#endif + ); + if ( ret==1 || screen_display==NULL ) + ubuf[0] = '\0'; + } + if ( ubuf[0]=='\0' ) + uret = NULL; + else if ( screen_display!=NULL ) { + if ( sf!=NULL ) sf->loading_cid_map = true; + uret = GWidgetOpenFile(GStringGetResource(_STR_FindCharset,NULL),NULL,ubuf,NULL,NULL); + if ( sf!=NULL ) sf->loading_cid_map = false; + } + if ( uret==NULL ) { + if ( maybe==NULL && maybefile==NULL ) + /* No luck */; + else if ( screen_display==NULL && maybe!=NULL ) { + maybe->maxsupple = supplement; +return( maybe ); + } else if ( screen_display==NULL ) { + file = maybefile; + maybefile = NULL; + } else if ( GWidgetAskR(_STR_UseCidMap,buts2,0,1,_STR_AreYouSureCharset)==0 ) { + if ( maybe!=NULL ) { + maybe->maxsupple = supplement; +return( maybe ); + } else { + file = maybefile; + maybefile = NULL; + } + } + } else { + file = u2def_copy(uret); + free(uret); + } + } + + free(maybefile); + if ( file!=NULL ) +return( LoadMapFromFile(file,registry,ordering,supplement)); + +return( MakeDummyMap(registry,ordering,supplement)); +} + +static void SFApplyEnc(SplineFont *sf, int charcnt) { + SplineChar **chars, *sc; + int i; + RefChar *refs, *rnext, *rprev; + SplineSet *new, *spl; + + /* Remove references to characters which aren't in the new map (if any) */ + /* Don't need to fix up dependencies, because we throw the char away */ + for ( i=0; icharcnt; ++i ) if ( (sc = sf->chars[i])!=NULL ) { + for ( rprev = NULL, refs=sc->layers[ly_fore].refs; refs!=NULL; refs=rnext ) { + rnext = refs->next; + if ( refs->sc->enc==-1 ) { + new = refs->layers[0].splines; + if ( new!=NULL ) { + for ( spl = new; spl->next!=NULL; spl = spl->next ); + spl->next = sc->layers[ly_fore].splines; + sc->layers[ly_fore].splines = new; + } + refs->layers[0].splines=NULL; + RefCharFree(refs); + if ( rprev==NULL ) + sc->layers[ly_fore].refs = rnext; + else + rprev->next = rnext; + } else + rprev = refs; + } + } + + chars = gcalloc(charcnt+1,sizeof(SplineChar *)); + for ( i=0; icharcnt; ++i ) if ( (sc = sf->chars[i])!=NULL ) { + if ( sc->enc==-1 ) + SplineCharFree(sc); + else + chars[sc->enc] = sc; + } + + free(sf->chars); + sf->charcnt = charcnt; + sf->chars = chars; +} + +void SFEncodeToMap(SplineFont *sf,struct cidmap *map) { + SplineChar *sc; + int i,max=0, anyextras=0; + + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sc = sf->chars[i]) ) { + sc->enc = NameEnc2CID(map,sc->unicodeenc,sc->name); + if ( sc->enc>max ) max = sc->enc; + else if ( sc->enc==-1 ) ++anyextras; + } else if ( sc!=NULL ) + sc->enc = -1; + + if ( anyextras ) { + static int buttons[] = { _STR_Delete, _STR_Add, 0 }; + if ( GWidgetAskR(_STR_ExtraCharsTitle,buttons,0,1,_STR_ExtraChars)==1 ) { + if ( map!=NULL && maxcidmax ) max = map->cidmax; + anyextras = 0; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sc = sf->chars[i]) ) { + if ( sc->enc == -1 ) sc->enc = max + anyextras++; + } + max += anyextras; + } + } + SFApplyEnc(sf, max+1); +} + +struct block { + int cur, tot; + char **maps; + char **dirs; +}; + +static void AddToBlock(struct block *block,char *mapname, char *dir) { + int i, val, j; + int len = strlen(mapname); + + if ( mapname[len-7]=='.' ) len -= 7; + for ( i=0; icur; ++i ) { + if ( (val=strncmp(block->maps[i],mapname,len))==0 ) +return; /* Duplicate */ + else if ( val>0 ) + break; + } + if ( block->tot==0 ) { + block->tot = 10; + block->maps = galloc(10*sizeof(char *)); + block->dirs = galloc(10*sizeof(char *)); + } else if ( block->cur>=block->tot ) { + block->tot += 10; + block->maps = grealloc(block->maps,block->tot*sizeof(char *)); + block->dirs = grealloc(block->dirs,block->tot*sizeof(char *)); + } + for ( j=block->cur; j>=i; --j ) { + block->maps[j+1] = block->maps[j]; + block->dirs[j+1] = block->dirs[j]; + } + block->maps[i] = copyn(mapname,len); + block->dirs[i] = dir; + ++block->cur; +} + +static void FindMapsInDir(struct block *block,char *dir) { + struct dirent *ent; + DIR *d; + int len; + char *pt, *pt2; + + if ( dir==NULL ) +return; + /* format of cidmap filename "?*-?*-[0-9]*.cidmap" */ + d = opendir(dir); + if ( d==NULL ) +return; + while ( (ent = readdir(d))!=NULL ) { + if ( (len = strlen(ent->d_name))<8 ) + continue; + if ( strcmp(ent->d_name+len-7,".cidmap")!=0 ) + continue; + pt = strchr(ent->d_name, '-'); + if ( pt==NULL || pt==ent->d_name ) + continue; + pt2 = strchr(pt+1, '-' ); + if ( pt2==NULL || pt2==pt+1 || !isdigit(pt2[1])) + continue; + AddToBlock(block,ent->d_name,dir); + } +} + +static void FindMapsInNoLibsDir(struct block *block,char *dir) { + + if ( dir==NULL || strstr(dir,"/.libs")==NULL ) +return; + + dir = copy(dir); + *strstr(dir,"/.libs") = '\0'; + + FindMapsInDir(block,dir); + free(dir); +} + +struct cidmap *AskUserForCIDMap(SplineFont *sf) { + struct block block; + struct cidmap *map = NULL; + char buffer[200]; + const unichar_t **choices; + int i,ret; + static unichar_t cidwild[] = { '?','*','-','?','*','-','[','0','-','9',']','*','.','c','i','d','m','a','p', '\0' }; + char *filename=NULL; + char *reg, *ord, *pt; + int supplement; + + memset(&block,'\0',sizeof(block)); + for ( map = cidmaps; map!=NULL; map = map->next ) { + sprintf(buffer,"%s-%s-%d", map->registry, map->ordering, map->supplement); + AddToBlock(&block,buffer,NULL); + } + FindMapsInDir(&block,"."); + FindMapsInDir(&block,GResourceProgramDir); + FindMapsInNoLibsDir(&block,GResourceProgramDir); +#ifdef SHAREDIR + FindMapsInDir(&block,SHAREDIR); +#endif + FindMapsInDir(&block,getPfaEditShareDir()); + FindMapsInDir(&block,"/usr/share/fontforge"); + + choices = gcalloc(block.cur+2,sizeof(unichar_t *)); + choices[0] = u_copy(GStringGetResource(_STR_Browse,NULL)); + for ( i=0; icidregistry = copy(map->registry); + sf->ordering = copy(map->ordering); + sf->supplement = map->supplement; + } +return( map ); +} + +static enum fchooserret CMapFilter(GGadget *g,GDirEntry *ent, + const unichar_t *dir) { + enum fchooserret ret = GFileChooserDefFilter(g,ent,dir); + char buf2[256]; + FILE *file; + static char *cmapflag = "%!PS-Adobe-3.0 Resource-CMap"; + + if ( ret==fc_show && !ent->isdir ) { + int len = 3*(u_strlen(dir)+u_strlen(ent->name)+5); + char *filename = galloc(len); + u2def_strncpy(filename,dir,len); + strcat(filename,"/"); + u2def_strncpy(buf2,ent->name,sizeof(buf2)); + strcat(filename,buf2); + file = fopen(filename,"r"); + if ( file==NULL ) + ret = fc_hide; + else { + if ( fgets(buf2,sizeof(buf2),file)==NULL || + strncmp(buf2,cmapflag,strlen(cmapflag))!=0 ) + ret = fc_hide; + fclose(file); + } + free(filename); + } +return( ret ); +} + +enum cmaptype { cmt_out=-1, cmt_coderange, cmt_notdefs, cmt_cid, cmt_max }; +struct cmap { + struct { + int n; + struct coderange { uint32 first, last, cid; } *ranges; + } groups[cmt_max]; + char *registry; + char *ordering; + int supplement; + struct remap *remap; + int total; +}; + +static void cmapfree(struct cmap *cmap) { + free(cmap->registry); + free(cmap->ordering); + free(cmap->groups[cmt_coderange].ranges); + free(cmap->groups[cmt_notdefs].ranges); + free(cmap->groups[cmt_cid].ranges); + free(cmap->remap); + free(cmap); +} + +static struct coderange *ExtendArray(struct coderange *ranges,int *n, int val) { + if ( *n == 0 ) + ranges = gcalloc(val,sizeof(struct coderange)); + else { + ranges = grealloc(ranges,(*n+val)*sizeof(struct coderange)); + memset(ranges+*n,0,val*sizeof(struct coderange)); + } + *n += val; +return( ranges ); +} + +static char *readpsstr(char *str) { + char *eos; + + while ( isspace(*str)) ++str; + if ( *str=='(' ) ++str; + /* Postscript strings can be more complicated than this (hex, nested parens, Enc85...) */ + /* but none of those should show up here */ + for ( eos = str; *eos!=')' && *eos!='\0'; ++eos ); +return( copyn(str,eos-str)); +} + +static struct cmap *ParseCMap(char *filename) { + char buf2[200]; + FILE *file; + struct cmap *cmap; + char *end, *pt; + int val, pos; + enum cmaptype in; + static const char *bcsr = "begincodespacerange", *bndr = "beginnotdefrange", *bcr = "begincidrange"; + static const char *reg = "/Registry", *ord = "/Ordering", *sup="/Supplement"; + + file = fopen(filename,"r"); + if ( file==NULL ) +return( NULL ); + + cmap = gcalloc(1,sizeof(struct cmap)); + in = cmt_out; + while ( fgets(buf2,sizeof(buf2),file)!=NULL ) { + for ( pt=buf2; isspace(*pt); ++pt); + if ( in==cmt_out ) { + if ( *pt=='/' ) { + if ( strncmp(pt,reg,strlen(reg))==0 ) + cmap->registry = readpsstr(pt+strlen(reg)); + else if ( strncmp(pt,ord,strlen(ord))==0 ) + cmap->ordering = readpsstr(pt+strlen(ord)); + else if ( strncmp(pt,ord,strlen(ord))==0 ) { + for ( pt += strlen(sup); isspace(*pt); ++pt ); + cmap->supplement = strtol(pt,NULL,10); + } + continue; + } else if ( !isdigit(*pt) ) + continue; + val = strtol(pt,&end,10); + while ( isspace(*end)) ++end; + if ( strncmp(end,bcsr,strlen(bcsr))==0 ) + in = cmt_coderange; + else if ( strncmp(end,bndr,strlen(bndr))==0 ) + in = cmt_notdefs; + else if ( strncmp(end,bcr,strlen(bcr))==0 ) + in = cmt_cid; + if ( in!=cmt_out ) { + pos = cmap->groups[in].n; + cmap->groups[in].ranges = ExtendArray(cmap->groups[in].ranges,&cmap->groups[in].n,val); + } + } else if ( strncmp(pt,"end",3)== 0 ) + in = cmt_out; + else { + if ( *pt!='<' ) + continue; + cmap->groups[in].ranges[pos].first = strtoul(pt+1,&end,16); + if ( *end=='>' ) ++end; + while ( isspace(*end)) ++end; + if ( *end=='<' ) ++end; + cmap->groups[in].ranges[pos].last = strtoul(end,&end,16); + if ( in!=cmt_coderange ) { + if ( *end=='>' ) ++end; + while ( isspace(*end)) ++end; + cmap->groups[in].ranges[pos].cid = strtol(end,&end,10); + } + ++pos; + } + } + fclose(file); +return( cmap ); +} + +static void CompressCMap(struct cmap *cmap) { + int32 i,j,k, pos, base; + uint32 min, oldmax; + /* we can't really deal with three and four byte encodings */ + /* so if we get one arrange for the sf itself to do a remap */ + + cmap->total = 0x10000; + for ( i=0; igroups[cmt_coderange].n; ++i ) + if ( cmap->groups[cmt_coderange].ranges[i].last>0xfffff ) + break; + if ( i==cmap->groups[cmt_coderange].n ) /* No need to remap */ +return; + + cmap->remap = gcalloc(cmap->groups[cmt_coderange].n+1,sizeof(struct remap)); + base = 0; + for ( i=0; igroups[cmt_coderange].n; ++i ) + if ( cmap->groups[cmt_coderange].ranges[i].last<0xffff ) { + base = 0x10000; + break; + } + + pos=0; + oldmax = base==0?0:0xffff; + for ( i=0; igroups[cmt_coderange].n; ++i ) { + min = 0xffffffff; k=-1; + for ( j=0; jgroups[cmt_coderange].n; ++j ) + if ( cmap->groups[cmt_coderange].ranges[j].first>oldmax && + cmap->groups[cmt_coderange].ranges[j].firstgroups[cmt_coderange].ranges[j].first; + k = j; + } + if ( k==-1 ) + break; + cmap->remap[pos].firstenc = cmap->groups[cmt_coderange].ranges[k].first&~0xff; + cmap->remap[pos].lastenc = cmap->groups[cmt_coderange].ranges[k].last|0xff; + cmap->remap[pos].infont = base; + base += cmap->remap[pos].lastenc-cmap->remap[pos].firstenc+1; + oldmax = cmap->remap[pos].lastenc; + ++pos; + } + cmap->remap[pos].infont = -1; /* Marks end */ + cmap->total = base; + /* so cmap->remap will map sf indeces into the encoding in the cmap */ + + /* And now we want to change the groups[cmt_cid].ranges so that they will */ + /* map into sf indeces rather than into the encoding of the cmap */ + for ( i=0; igroups[cmt_cid].n; ++i ) { + for ( k=0; cmap->remap[k].infont!=-1; ++k ) + if ( cmap->groups[cmt_cid].ranges[i].first>=cmap->remap[k].firstenc && + cmap->groups[cmt_cid].ranges[i].first<=cmap->remap[k].lastenc ) + break; + if ( cmap->remap[k].infont==-1 ) + continue; + cmap->groups[cmt_cid].ranges[i].first += cmap->remap[k].infont-cmap->remap[k].firstenc; + cmap->groups[cmt_cid].ranges[i].last += cmap->remap[k].infont-cmap->remap[k].firstenc; + } +} + +SplineFont *CIDFlatten(SplineFont *cidmaster,SplineChar **chars,int charcnt) { + FontView *fvs; + SplineFont *new; + char buffer[20]; + BDFFont *bdf; + int j; + + if ( cidmaster==NULL ) +return(NULL); + new = SplineFontEmpty(); + new->fontname = copy(cidmaster->fontname); + new->fullname = copy(cidmaster->fullname); + new->familyname = copy(cidmaster->familyname); + new->weight = copy(cidmaster->weight); + new->copyright = copy(cidmaster->copyright); + sprintf(buffer,"%g", cidmaster->cidversion); + new->version = copy(buffer); + new->italicangle = cidmaster->italicangle; + new->upos = cidmaster->upos; + new->uwidth = cidmaster->uwidth; + new->ascent = cidmaster->ascent; + new->descent = cidmaster->descent; + new->changed = new->changed_since_autosave = true; + new->display_antialias = cidmaster->display_antialias; + new->fv = cidmaster->fv; + new->encoding_name = em_none; + /* Don't copy the grid splines, there won't be anything meaningfull at top level */ + /* and won't know which font to copy from below */ + new->bitmaps = cidmaster->bitmaps; /* should already be flattened */ + cidmaster->bitmaps = NULL; /* don't free 'em */ + for ( bdf=new->bitmaps; bdf!=NULL; bdf=bdf->next ) + bdf->sf = new; + new->origname = copy( cidmaster->origname ); + new->display_size = cidmaster->display_size; + /* Don't copy private */ + new->xuid = copy(cidmaster->xuid); + new->chars = chars; + new->charcnt = charcnt; + for ( j=0; jparent = new; + chars[j]->enc = j; + } + for ( fvs=new->fv; fvs!=NULL; fvs=fvs->nextsame ) { + fvs->cidmaster = NULL; + if ( fvs->sf->charcnt!=new->charcnt ) { + free(fvs->selected); + fvs->selected = gcalloc(new->charcnt,sizeof(char)); + } + fvs->sf = new; + FVSetTitle(fvs); + } + FontViewReformatAll(new); + SplineFontFree(cidmaster); +return( new ); +} + +void SFFlattenByCMap(SplineFont *sf,char *cmapname) { + struct cmap *cmap; + int i,j,k,l,m, extras, max, curmax, warned; + int found[4]; + SplineChar **chars = NULL, *sc; + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + if ( sf->subfontcnt==0 ) { + GWidgetErrorR(_STR_NotACIDFont,_STR_NotACIDFont); +return; + } + if ( cmapname==NULL ) { + unichar_t *uret = GWidgetOpenFile(GStringGetResource(_STR_FindCMap,NULL),NULL,NULL,NULL,CMapFilter); + cmapname = u2def_copy(uret); + free(uret); + } + if ( cmapname==NULL ) +return; + cmap = ParseCMap(cmapname); + if ( cmap==NULL ) +return; + CompressCMap(cmap); + max = 0; + for ( i=0; igroups[cmt_cid].n; ++i ) { + if ( maxgroups[cmt_cid].ranges[i].last ) + max = cmap->groups[cmt_cid].ranges[i].last; + if ( cmap->groups[cmt_cid].ranges[i].last>0x100000 ) { + GWidgetErrorR(_STR_EncodingTooLarge,_STR_EncodingTooLarge); + cmapfree(cmap); +return; + } + } + + SFFindNearTop(sf); + curmax = 0; + for ( k=0; ksubfontcnt; ++k ) + if ( curmax < sf->subfonts[k]->charcnt ) + curmax = sf->subfonts[k]->charcnt; + + chars = NULL; + warned = false; + for ( j=0; j<2; ++j ) { + extras = 0; + for ( i=0; isubfontcnt; ++k ) + if ( isubfonts[k]->charcnt && sf->subfonts[k]->chars[i]!=NULL ) { + sc = sf->subfonts[k]->chars[i]; + if ( chars!=NULL ) + sf->subfonts[k]->chars[i] = NULL; + break; + } + if ( sc!=NULL ) { + m = 0; + for ( l=0; lgroups[cmt_cid].n; ++l ) { + if ( i>=cmap->groups[cmt_cid].ranges[l].cid && + i<=cmap->groups[cmt_cid].ranges[l].cid + + cmap->groups[cmt_cid].ranges[l].last - + cmap->groups[cmt_cid].ranges[l].first ) { + if ( mgroups[cmt_cid].ranges[found[0]].first + + i-cmap->groups[cmt_cid].ranges[found[0]].cid; + chars[p] = sc; + sc->enc = p; + for ( l=1; lgroups[cmt_cid].ranges[found[l]].first + + i-cmap->groups[cmt_cid].ranges[found[l]].cid; + chars[pos] = MakeDupRef(sc,pos,-1); + } + } + } + } + } + if ( chars==NULL ) + chars = gcalloc(max+extras,sizeof(SplineChar *)); + warned = true; + } + sf = CIDFlatten(sf,chars,max+extras); + sf->remap = cmap->remap; cmap->remap = NULL; + cmapfree(cmap); + SFRestoreNearTop(sf); +} + +static int Enc2CMap(struct cmap *cmap,int enc) { + int i; + + for ( i=0; igroups[cmt_cid].n; ++i ) + if ( enc>=cmap->groups[cmt_cid].ranges[i].first && + enc<=cmap->groups[cmt_cid].ranges[i].last ) +return( enc-cmap->groups[cmt_cid].ranges[i].first+ + cmap->groups[cmt_cid].ranges[i].cid ); + +return( -1 ); +} + +static void SFEncodeToCMap(SplineFont *cidmaster,SplineFont *sf,struct cmap *cmap) { + SplineChar *sc; + int i,max=0, anyextras=0; + + cidmaster->cidregistry = cmap->registry; cmap->registry = NULL; + cidmaster->ordering = cmap->ordering; cmap->ordering = NULL; + cidmaster->supplement = cmap->supplement; + + for ( i=0; icharcnt; ++i ) if ( (sc = sf->chars[i])!=NULL ) { + sc->enc = Enc2CMap(cmap,sc->enc); + if ( sc->enc>max ) max = sc->enc; + else if ( sc->enc==-1 ) ++anyextras; + } + + if ( anyextras ) { + static int buttons[] = { _STR_Delete, _STR_Add, 0 }; + if ( GWidgetAskR(_STR_ExtraCharsTitle,buttons,0,1,_STR_ExtraChars)==1 ) { + if ( cmap!=NULL && maxtotal ) max = cmap->total; + anyextras = 0; + for ( i=0; icharcnt; ++i ) if ( (sc = sf->chars[i])!=NULL ) { + if ( sc->enc == -1 ) sc->enc = max + anyextras++; + } + max += anyextras; + } + } + SFApplyEnc(sf, max); +} + +SplineFont *MakeCIDMaster(SplineFont *sf,int bycmap,char *cmapfilename, struct cidmap *cidmap) { + SplineFont *cidmaster; + struct cidmap *map; + struct cmap *cmap; + FontView *fvs; + int freeme; + + cidmaster = SplineFontEmpty(); + SFFindNearTop(sf); + if ( bycmap ) { + freeme = false; + if ( cmapfilename==NULL ) { + unichar_t *uret = GWidgetOpenFile(GStringGetResource(_STR_FindCMap,NULL),NULL,NULL,NULL,CMapFilter); + cmapfilename = u2def_copy(uret); + freeme = true; + free(uret); + } + if ( cmapfilename==NULL ) { + SplineFontFree(cidmaster); +return(NULL); + } + cmap = ParseCMap(cmapfilename); + if ( freeme ) + free(cmapfilename); + if ( cmap==NULL ) { + SplineFontFree(cidmaster); +return(NULL); + } + CompressCMap(cmap); + SFEncodeToCMap(cidmaster,sf,cmap); + cmapfree(cmap); + } else { + map = cidmap; + if (map == NULL) { + map = AskUserForCIDMap(cidmaster); /* Sets the ROS fields */ + } else { + cidmaster->cidregistry = copy(map->registry); + cidmaster->ordering = copy(map->ordering); + cidmaster->supplement = map->supplement; + } + if ( map==NULL ) { + SplineFontFree(cidmaster); +return(NULL); + } + SFEncodeToMap(sf,map); + } + cidmaster->fontname = copy(sf->fontname); + cidmaster->fullname = copy(sf->fullname); + cidmaster->familyname = copy(sf->familyname); + cidmaster->weight = copy(sf->weight); + cidmaster->copyright = copy(sf->copyright); + cidmaster->cidversion = 1.0; + cidmaster->display_antialias = sf->display_antialias; + cidmaster->display_size = sf->display_size; + cidmaster->ascent = sf->ascent /*880*/; + cidmaster->descent = sf->descent /*120*/; + cidmaster->changed = cidmaster->changed_since_autosave = true; + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + fvs->cidmaster = cidmaster; + cidmaster->fv = sf->fv; + sf->cidmaster = cidmaster; + sf->compacted = false; + cidmaster->subfontcnt = 1; + cidmaster->subfonts = gcalloc(2,sizeof(SplineFont *)); + cidmaster->subfonts[0] = sf; + if ( sf->private==NULL ) + sf->private = gcalloc(1,sizeof(struct psdict)); + if ( !PSDictHasEntry(sf->private,"lenIV")) + PSDictChangeEntry(sf->private,"lenIV","1"); /* It's 4 by default, in CIDs the convention seems to be 1 */ + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + free(fvs->selected); + fvs->selected = gcalloc(fvs->sf->charcnt,sizeof(char)); + } + SFRestoreNearTop(sf); + FontViewReformatAll(sf); +return( cidmaster ); +} + +int CountOfEncoding(enum charset encoding_name) { + Encoding *item=NULL; + + if ( encoding_name == em_unicode4 ) +return( unicode4_size ); + if ( encoding_name == em_unicode || encoding_name == em_big5 || encoding_name==em_big5hkscs || + encoding_name == em_johab || encoding_name == em_wansung || + encoding_name == em_sjis || encoding_name == em_jisgb || + (encoding_name >= em_unicodeplanes && encoding_name <= em_unicodeplanesmax )) +return( 65536 ); + else if ( encoding_name < em_first2byte ) +return( 256 ); + else if ( encoding_name <= em_last94x94 ) +return( 65536 ); + else if ( encoding_name >= em_base ) { + for ( item=enclist; item!=NULL && item->enc_num!=encoding_name; + item=item->next ); + if ( item!=NULL ) +return( item->char_cnt ); + } +return( 0 ); +} + +static void BDFsToo(SplineFont *sf,int cnt) { + BDFFont *bdf; + BDFChar **newbc; + int i; + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + newbc = gcalloc(cnt,sizeof(BDFChar *)); + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + int pos = bdf->chars[i]->sc->enc; + newbc[pos] = bdf->chars[i]; + newbc[pos]->enc = pos; + } + free(bdf->chars); + bdf->chars = newbc; + bdf->charcnt = cnt; + bdf->encoding_name = sf->encoding_name; + } +} + +static void _SFCompactFont(SplineFont *sf) { + int i, cnt; + SplineChar **newchars; + + for ( i=cnt=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + sf->chars[i]->old_enc = i; + ++cnt; + } + newchars = galloc(cnt*sizeof(SplineChar *)); + for ( i=cnt=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + newchars[cnt] = sf->chars[i]; + newchars[cnt]->enc = cnt; + ++cnt; + } + free(sf->chars); + sf->chars = newchars; + sf->charcnt = cnt; + sf->old_encname = sf->encoding_name; + sf->encoding_name = em_none; + sf->compacted = true; + sf->encodingchanged = true; + BDFsToo(sf,cnt); +} + +int SFCompactFont(SplineFont *sf) { + MMSet *mm = sf->mm; + int i; + + if ( sf->compacted ) +return( false ); + + SFFindNearTop(sf); + + if ( mm==NULL ) + _SFCompactFont(sf); + else { + for ( i=0; iinstance_count; ++i ) + _SFCompactFont(mm->instances[i]); + _SFCompactFont(mm->normal); + } + + SFRestoreNearTop(sf); +return( true ); +} + +static void _SFUncompactFont(SplineFont *sf) { + int i,cnt; + SplineChar **newchars; + + cnt = 0; + for ( i=sf->charcnt-1; i>=0; --i ) if ( sf->chars[i]!=NULL ) { + cnt = sf->chars[i]->old_enc+1; + break; + } + if ( (i=CountOfEncoding(sf->old_encname))>cnt ) + cnt = i; + if ( cnt==0 ) +return; + + newchars = gcalloc(cnt,sizeof(SplineChar *)); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + int enc = sf->chars[i]->old_enc; + if ( enc>=cnt ) { + GDrawIError("Compacted font isn't" ); + free( newchars ); +return; + } + newchars[enc] = sf->chars[i]; + newchars[enc]->enc = enc; + } + free(sf->chars); + sf->chars = newchars; + sf->charcnt = cnt; + sf->encoding_name = sf->old_encname; + sf->compacted = false; + sf->encodingchanged = true; + + BDFsToo(sf,cnt); +} + +int SFUncompactFont(SplineFont *sf) { + int i, cnt; + MMSet *mm = sf->mm; + + if ( !sf->compacted ) +return( false ); + cnt = 0; + for ( i=sf->charcnt-1; i>=0; --i ) if ( sf->chars[i]!=NULL ) { + cnt = sf->chars[i]->old_enc+1; + break; + } + if ( cnt==0 ) +return( false ); + + SFFindNearTop(sf); + + if ( mm==NULL ) + _SFUncompactFont(sf); + else { + for ( i=0; iinstance_count; ++i ) + _SFUncompactFont(mm->instances[i]); + _SFUncompactFont(mm->normal); + } + + SFRestoreNearTop(sf); +return( true ); +} diff --git a/fontforge/fontforge.1 b/fontforge/fontforge.1 new file mode 100644 index 00000000..4454665e --- /dev/null +++ b/fontforge/fontforge.1 @@ -0,0 +1,262 @@ +.\" Manual page by Tom Harvey, subsequently modified by George Williams. +.\" Copyright © 2000-2002 by George Williams. +.\" Re-edited to use standard -man macros by RPC Rodgers, 23 October 2002. +.ds Ps P\s-2OST\s+2S\s-2CRIPT\s+2 +.TH FONTFORGE 1 "2 March 2004" +.SH NAME +.B fontforge - create and modify PostScript, TrueType and SVG fonts +.SH SYNOPSIS +.B fontforge +.RB [ \-cmap +.IR maptype ] +.RB [ \-depth +.IR pixeld ] +.RB [ \-display +.IR str ] +.RB [ \-last ] +.RB [ \-help ] +.RB [ \-keyboard +.IR ktype ] +.RB [ \-new ] +.RB [ \-nosplash +.RB [ \-recover +.IR mode ] +.RB [ \-script +.IR file ] +.RB [ \-sync +.RB [ \-usage ] +.RB [ \-vc +.IR vclass ] +.RB [ \-version ] +.I fontfile ... +.SH DESCRIPTION +The program +.I fontforge +allows you to create and modify font files, +accepting input in the following formats +(with associated file extensions appearing in parentheses): +.TP +Glyph Bitmap Distribution (.bdf) +.TP +Macintosh resource fonts (.dfont, .bin, .hqx) +.TP +OpenType (.otf) +.TP +.IR fontforge "spline font database (.sfd)" +.TP +\*(Ps, which includes: +.RS +.TP +ASCII format (.pfa) +.TP +Binary format (.pfb) +.TP +CID-keyed fonts, Adobe convention used primarily for Asian characters (.cid, .otf) +.TP +\*(Ps Type 0 (.ps) +.TP +\*(Ps Type 3 (.ps) +.RE +.TP +Scaleable vector graphics fonts (.svg) +.TP +TeX bitmap (.pk) +.TP +TrueType (.ttf, .ttc) +.TP +X11 bitmap (.pcf) +.LP +If the argument list contains a font file name (or several), +.I fontforge +opens a +.B fontview +window for each font displaying the characters of the that font. +In the absence of options or arguments, +the program opens a file-picker window, +allowing you to browse your disk to find a font file, +or create a new one. +.LP +This manual page is intended only as a rudimentary overview; +see the HTML Users Manual for more complete information. +.SH OPTIONS +.TP +.B \-cmap maptype +Employ the specified method to control 8-bit colormaps, +where +.I maptype +assumes one of these three values: +.RS +.TP +.B current +Attempt to allocate colors in the current (shared) colormap. +The program will likely not find everything it requires. +.TP +.B copy +Allocate what can be allocated, then copy the current colormap; +it can thus make use of cells other programs are using. +.TP +.B private +Create a new colormap and fill it with the required colors. +.RE +.TP +.BI \-depth " pixeld" +Attempt to employ a visual that matches the specified pixel depth, +.IR pixeld . +.TP +.BI \-display " str" +Employ the X display specified by the string +.I str +(for example: localhost:0). +.TP +.B \-help +Display the usage description +and start a web client displaying the online documentation. +.TP +.BI \-keyboard " ktype" +Alter the displayed menus to employ modifier keys appropriate +to the specified keyboard type, +where +.I ktype +assumes one of the following four values: +.RS +.TP +.B ibm +IBM PC type keyboard. +.TP +.B mac +Apple Macintosh keyboard. +.TP +.B sun +Sun workstation keyboard. +.TP +.B ppc +Macintosh keyboard, but on a system running SuSe linux +(the mappings differ from those used under MacOS X). +.RE +.TP +.B \-last +Opens whatever font you last edited with +.I fontforge. +If you specify +.I n +.B \-last +.I fontforge +will open the last +.I n +fonts. +.TP +.B \-new +Create a new font with the ISO 8859-1 encoding +(the international encoding standard for western Europe, +and the standard for most X fonts). +.TP +.B \-nosplash +Suppress display of the splash screen. +.TP +.BI \-recover " mode" +Control the crash recovery mechanism +(helpful if crash recovery causes problems), +where +.I mode +takes on one of three allowed settings: +.RS +.TP +.B auto +perform automatic recovery (default) if the program crashed before saving changes. +.TP +.B clean +Delete recovery information. +.TP +.B none +Suppress crash recovery. +.RE +.TP +.BI \-script " file" +Execute the script named +.IR file . +Does not open the X display. +This must be the first argument passed to fontforge. Any other arguments are +handled by the scriptfile itself. +Any other command line arguments will be passed to the script. +The program contains a command interpreter which allows access to +most but not all of its interactive features. +If a scriptfile is executable, and if its first line contains +the string "fontforge", then the argument +.BI \-script +may be omitted. This means that fontforge can be used as an interpreter. +.TP +.B \-sync +Make X synchronous. +Used primarily for debugging, this option slows X down. +.TP +.B \-usage +Display the usage description. +.TP +.B \-vc vclass +Attempt to use a visual that matches the class, +.IR vclass , +specified as either the name of a visual class +or an integer enumerating a visual class. +.TP +.B \-version +Display the current version +(a six digit string containing the date stamp of the source files). +.SH ENVIRONMENT +If any of the following environment variables exist, +they are used: +.TP +.B BROWSER +Specifies the name of a browser program for examining documentation. +.TP +.B AUTOTRACE +Specifies the location of the autotrace program (usually FontForge can figure +this out without help, but not always). +.TP +.B MF +Specifies the location of the metafont program. +.TP +.B FONTFORGE_VERBOSE +Turns on verbose mode in scripting. Each statement is printed as it is executed. +.SH FILES +.TP +.B ~/.PfaEdit/autosave/ +crash recovery directory +.TP +.B /usr/local/share/fontforge/*.ui +translations for the user interface +.TP +.B /usr/local/share/doc/fontforge/*.html +optional location for online documentation. +.TP +.B /usr/local/share/fontforge/*.cidmap +"encoding" files for Adobe's cid formats +from \fChttp://fontforge.sourceforge.net/cidmaps.tgz\fP +.\" +.SH "SEE ALSO" +.BR sfddiff (1) +.LP +The HTML version of the +.I fontforge +manual, +available online at: +.TP +\fChttp://fontforge.sourceforge.net/\fP +.\" .SH STANDARDS +.\" .SH HISTORY +.SH NOTE +.BR fontforge +used to be called +.BR pfaedit. +.SH AUTHOR +Copyright (C) 2000-2004 by George Williams (gww@silcom.com). +Original manual page by Tom Harvey, subsequently modified by George Williams. +Heavily rewritten and modified to use standard +.IR \-man (5)macros by R.P.C. Rodgers (rodgers@nlm.nih.gov), 23 October 2002. +.SH BUGS +Undoubtedly many, but unknown and ever changing. +See +.IP +\fChttp://fontforge.sourceforge.net/#known-bugs\fP +for a current list. +.\" end of file +.\" diff --git a/fontforge/fontinfo.c b/fontforge/fontinfo.c new file mode 100644 index 00000000..0c39d216 --- /dev/null +++ b/fontforge/fontinfo.c @@ -0,0 +1,5952 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include + +static int lastplane=1; /* SMP, Supplementary Multilingual Plane */ +static int last_aspect=0; + +struct gfi_data { + SplineFont *sf; + GWindow gw; + int private_aspect, ttfv_aspect, panose_aspect, tn_aspect, tx_aspect; + int old_sel, old_aspect, old_lang, old_strid; + int oldcnt; + int ttf_set, names_set, tex_set; + struct psdict *private; + struct ttflangname *names; + struct ttflangname def; + int uplane; + unsigned int family_untitled: 1; + unsigned int human_untitled: 1; + unsigned int done: 1; + unsigned int mpdone: 1; + struct anchor_shows { CharView *cv; SplineChar *sc; int restart; } anchor_shows[2]; + struct texdata texdata; + struct contextchaindlg *ccd; + struct statemachinedlg *smd; +}; + +GTextInfo emsizes[] = { + { (unichar_t *) "1000", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "1024", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "2048", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "4096", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { NULL } +}; +GTextInfo encodingtypes[] = { + { (unichar_t *) _STR_Custom, NULL, 0, 0, (void *) em_custom, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Compacted, NULL, 0, 0, (void *) em_compacted, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Original, NULL, 0, 0, (void *) em_original, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_Isolatin1, NULL, 0, 0, (void *) em_iso8859_1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin0, NULL, 0, 0, (void *) em_iso8859_15, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin2, NULL, 0, 0, (void *) em_iso8859_2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin3, NULL, 0, 0, (void *) em_iso8859_3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin4, NULL, 0, 0, (void *) em_iso8859_4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin5, NULL, 0, 0, (void *) em_iso8859_9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin6, NULL, 0, 0, (void *) em_iso8859_10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin7, NULL, 0, 0, (void *) em_iso8859_13, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin8, NULL, 0, 0, (void *) em_iso8859_14, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_Isocyrillic, NULL, 0, 0, (void *) em_iso8859_5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Koi8cyrillic, NULL, 0, 0, (void *) em_koi8_r, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isoarabic, NULL, 0, 0, (void *) em_iso8859_6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isogreek, NULL, 0, 0, (void *) em_iso8859_7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isohebrew, NULL, 0, 0, (void *) em_iso8859_8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isothai, NULL, 0, 0, (void *) em_iso8859_11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_MacLatin, NULL, 0, 0, (void *) em_mac, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Win, NULL, 0, 0, (void *) em_win, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Adobestd, NULL, 0, 0, (void *) em_adobestandard, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Symbol, NULL, 0, 0, (void *) em_symbol, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Texbase, NULL, 0, 0, (void *) em_base, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_Unicode, NULL, 0, 0, (void *) em_unicode, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Unicode4, NULL, 0, 0, (void *) em_unicode4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_UnicodePlanes, NULL, 0, 0, (void *) em_unicodeplanes, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_SJIS, NULL, 0, 0, (void *) em_sjis, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Jis208, NULL, 0, 0, (void *) em_jis208, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Jis212, NULL, 0, 0, (void *) em_jis212, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_KoreanWansung, NULL, 0, 0, (void *) em_wansung, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Korean, NULL, 0, 0, (void *) em_ksc5601, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_KoreanJohab, NULL, 0, 0, (void *) em_johab, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Chinese, NULL, 0, 0, (void *) em_gb2312, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ChinesePacked, NULL, 0, 0, (void *) em_jisgb, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ChineseTrad, NULL, 0, 0, (void *) em_big5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ChineseTradHKSCS, NULL, 0, 0, (void *) em_big5hkscs, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +GTextInfo interpretations[] = { + { (unichar_t *) _STR_None_fem, NULL, 0, 0, (void *) ui_none, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_AdobePUA, NULL, 0, 0, (void *) ui_adobe, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGreek, NULL, 0, 0, (void *) ui_greek, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacJapanese, NULL, 0, 0, (void *) ui_japanese, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTraditionalChinese, NULL, 0, 0, (void *) ui_trad_chinese, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSimplifiedChinese, NULL, 0, 0, (void *) ui_simp_chinese, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKorean, NULL, 0, 0, (void *) ui_korean, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +GTextInfo macstyles[] = { + { (unichar_t *) _STR_Bold, NULL, 0, 0, (void *) sf_bold, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Italic, NULL, 0, 0, (void *) sf_italic, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Condense, NULL, 0, 0, (void *) sf_condense, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Expand, NULL, 0, 0, (void *) sf_extend, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Underline, NULL, 0, 0, (void *) sf_underline, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Outline, NULL, 0, 0, (void *) sf_outline, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ShadowNoMn, NULL, 0, 0, (void *) sf_shadow, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo widthclass[] = { + { (unichar_t *) _STR_UltraCondensed, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ExtraCondensed, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Condensed75, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SemiCondensed, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Medium100, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SemiExpanded, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Expanded125, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ExtraExpanded, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_UltraExpanded, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo weightclass[] = { + { (unichar_t *) _STR_Thin100, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ExtraLight200, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Light300, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Book400, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Medium500, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_DemiBold600, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Bold700, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Heavy800, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Black900, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo fstype[] = { + { (unichar_t *) _STR_NeverEmbeddable, NULL, 0, 0, (void *) 0x02, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_OnlyPrint, NULL, 0, 0, (void *) 0x04, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_EditableDoc, NULL, 0, 0, (void *) 0x08, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Installable, NULL, 0, 0, (void *) 0x00, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo pfmfamily[] = { + { (unichar_t *) _STR_Serif, NULL, 0, 0, (void *) 0x11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SansSerif, NULL, 0, 0, (void *) 0x21, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Monospace, NULL, 0, 0, (void *) 0x31, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Script, NULL, 0, 0, (void *) 0x41, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Decorative, NULL, 0, 0, (void *) 0x51, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panfamily[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_TextDisplay, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Script, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Decorative, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Pictoral, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panserifs[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Cove, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObtuseCove, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SquareCove, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObtuseSquareCove, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Square, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Thin, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Bone, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Exaggerated, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Triangle, NULL, 0, 0, (void *) 10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalSans, NULL, 0, 0, (void *) 11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObtuseSans, NULL, 0, 0, (void *) 12, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_PerpSans, NULL, 0, 0, (void *) 13, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Flared, NULL, 0, 0, (void *) 14, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Rounded, NULL, 0, 0, (void *) 15, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panweight[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_VeryLight, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Light, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Thin, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Book, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Medium, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Demi, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Bold, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Heavy, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Black, NULL, 0, 0, (void *) 10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Nord, NULL, 0, 0, (void *) 11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panprop[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_OldStyle, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Modern, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_EvenWidth, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Expanded, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Condensed, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_VeryExpanded, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_VeryCondensed, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Monospaced, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo pancontrast[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_None, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_VeryLow, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Low, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MediumLow, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Medium, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MediumHigh, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_High, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_VeryHigh, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panstrokevar[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_GradDiag, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_GradTrans, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_GradVert, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_GradHor, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_RapidVert, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_RapidHor, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_InstantVert, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panarmstyle[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StraightArmsH, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StraightArmsW, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StraightArmsV, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StraightArmsSS, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StraightArmsDS, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NStraightArmsH, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NStraightArmsW, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NStraightArmsV, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NStraightArmsSS, NULL, 0, 0, (void *) 10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NStraightArmsDS, NULL, 0, 0, (void *) 11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panletterform[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalContact, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalWeighted, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalBoxed, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalFlattened, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalRounded, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalOffCenter, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NormalSquare, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObliqueContact, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObliqueWeighted, NULL, 0, 0, (void *) 10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObliqueBoxed, NULL, 0, 0, (void *) 11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObliqueRounded, NULL, 0, 0, (void *) 12, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObliqueOffCenter, NULL, 0, 0, (void *) 13, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ObliqueSquare, NULL, 0, 0, (void *) 14, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panmidline[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StandardTrimmed, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StandardPointed, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_StandardSerifed, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_HighTrimmed, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_HighPointed, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_HighSerifed, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ConstantTrimmed, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ConstantPointed, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ConstantSerifed, NULL, 0, 0, (void *) 10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LowTrimmed, NULL, 0, 0, (void *) 11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LowPointed, NULL, 0, 0, (void *) 12, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LowSerifed, NULL, 0, 0, (void *) 13, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo panxheight[] = { + { (unichar_t *) _STR_Any, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NoFit, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ConstantSmall, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ConstantStandard, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ConstantLarge, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_DuckingSmall, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_DuckingStandard, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_DuckingLarge, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo mslanguages[] = { + { (unichar_t *) _STR_Afrikaans, NULL, 0, 0, (void *) 0x436, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Albanian, NULL, 0, 0, (void *) 0x41c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Arabic, NULL, 0, 0, (void *) 0x401, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_IraqArabic, NULL, 0, 0, (void *) 0x801, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_EgyptArabic, NULL, 0, 0, (void *) 0xc01, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LibyaArabic, NULL, 0, 0, (void *) 0x1001, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_AlgeriaArabic, NULL, 0, 0, (void *) 0x1401, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MoroccoArabic, NULL, 0, 0, (void *) 0x1801, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_TunisiaArabic, NULL, 0, 0, (void *) 0x1C01, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_OmanArabic, NULL, 0, 0, (void *) 0x2001, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_YemenArabic, NULL, 0, 0, (void *) 0x2401, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SyriaArabic, NULL, 0, 0, (void *) 0x2801, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_JordanArabic, NULL, 0, 0, (void *) 0x2c01, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LebanonArabic, NULL, 0, 0, (void *) 0x3001, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_KuwaitArabic, NULL, 0, 0, (void *) 0x3401, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_UAEArabic, NULL, 0, 0, (void *) 0x3801, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_BahrainArabic, NULL, 0, 0, (void *) 0x3c01, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_QatarArabic, NULL, 0, 0, (void *) 0x4001, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Armenian, NULL, 0, 0, (void *) 0x42b, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Assamese, NULL, 0, 0, (void *) 0x44d, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LatinAzeri, NULL, 0, 0, (void *) 0x42c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CyrillicAzeri, NULL, 0, 0, (void *) 0x82c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Basque, NULL, 0, 0, (void *) 0x42d, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Byelorussian, NULL, 0, 0, (void *) 0x423, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Bengali, NULL, 0, 0, (void *) 0x445, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Bulgarian, NULL, 0, 0, (void *) 0x402, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Catalan, NULL, 0, 0, (void *) 0x403, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MSChinese, NULL, 0, 0, (void *) 0x404, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_PRCChinese, NULL, 0, 0, (void *) 0x804, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_HKChinese, NULL, 0, 0, (void *) 0xc04, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SingChinese, NULL, 0, 0, (void *) 0x1004, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacauChinese, NULL, 0, 0, (void *) 0x1404, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Croatian, NULL, 0, 0, (void *) 0x41a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Czech, NULL, 0, 0, (void *) 0x405, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Danish, NULL, 0, 0, (void *) 0x406, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Dutch, NULL, 0, 0, (void *) 0x413, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Flemish, NULL, 0, 0, (void *) 0x813, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_BrEnglish, NULL, 0, 0, (void *) 0x809, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_AmEnglish, NULL, 0, 0, (void *) 0x409, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CaEnglish, NULL, 0, 0, (void *) 0x1009, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_AuEnglish, NULL, 0, 0, (void *) 0xc09, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NZEnglish, NULL, 0, 0, (void *) 0x1409, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_IEEnglish, NULL, 0, 0, (void *) 0x1809, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SAEnglish, NULL, 0, 0, (void *) 0x1c09, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_JamEnglish, NULL, 0, 0, (void *) 0x2009, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CarEnglish, NULL, 0, 0, (void *) 0x2409, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_BelEnglish, NULL, 0, 0, (void *) 0x2809, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_TrinEnglish, NULL, 0, 0, (void *) 0x2c09, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ZimEnglish, NULL, 0, 0, (void *) 0x3009, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_PhilEnglish, NULL, 0, 0, (void *) 0x3409, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Estonia, NULL, 0, 0, (void *) 0x425, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Faeroese, NULL, 0, 0, (void *) 0x438, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Farsi, NULL, 0, 0, (void *) 0x429, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Finnish, NULL, 0, 0, (void *) 0x40b, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_FRFrench, NULL, 0, 0, (void *) 0x40c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_BEFrench, NULL, 0, 0, (void *) 0x80c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CAFrench, NULL, 0, 0, (void *) 0xc0c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CHFrench, NULL, 0, 0, (void *) 0x100c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LUFrench, NULL, 0, 0, (void *) 0x140c, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Georgian, NULL, 0, 0, (void *) 0x437, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_DEGerman, NULL, 0, 0, (void *) 0x407, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CHGerman, NULL, 0, 0, (void *) 0x807, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ATGerman, NULL, 0, 0, (void *) 0xc07, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LUGerman, NULL, 0, 0, (void *) 0x1007, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LIGerman, NULL, 0, 0, (void *) 0x1407, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Greek, NULL, 0, 0, (void *) 0x408, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Gujarati, NULL, 0, 0, (void *) 0x447, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Hebrew, NULL, 0, 0, (void *) 0x40d, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Hindi, NULL, 0, 0, (void *) 0x439, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Hungarian, NULL, 0, 0, (void *) 0x40e, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Icelandic, NULL, 0, 0, (void *) 0x40f, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Indonesian, NULL, 0, 0, (void *) 0x421, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Italian, NULL, 0, 0, (void *) 0x410, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CHItalian, NULL, 0, 0, (void *) 0x810, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Japanese, NULL, 0, 0, (void *) 0x411, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Kannada, NULL, 0, 0, (void *) 0x44b, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Kashmiri, NULL, 0, 0, (void *) 0x860, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Kazakh, NULL, 0, 0, (void *) 0x43f, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Konkani, NULL, 0, 0, (void *) 0x457, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LangKorean, NULL, 0, 0, (void *) 0x412, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LangKoreanJohab, NULL, 0, 0, (void *) 0x812, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Latvian, NULL, 0, 0, (void *) 0x426, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Lithuanian, NULL, 0, 0, (void *) 0x427, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ClassLithuanian, NULL, 0, 0, (void *) 0x827, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Macedonian, NULL, 0, 0, (void *) 0x42f, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Malay, NULL, 0, 0, (void *) 0x43e, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_BruMalay, NULL, 0, 0, (void *) 0x83e, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Nepali, NULL, 0, 0, (void *) 0x461, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_IndNepali, NULL, 0, 0, (void *) 0x861, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Norwegian, NULL, 0, 0, (void *) 0x414, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NorwegianN, NULL, 0, 0, (void *) 0x814, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Oriya, NULL, 0, 0, (void *) 0x448, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Polish, NULL, 0, 0, (void *) 0x415, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_PTPortuguese, NULL, 0, 0, (void *) 0x416, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_BRPortuguese, NULL, 0, 0, (void *) 0x816, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Punjabi, NULL, 0, 0, (void *) 0x446, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_RhaetoRomanic, NULL, 0, 0, (void *) 0x417, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Romanian, NULL, 0, 0, (void *) 0x418, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MolRomanian, NULL, 0, 0, (void *) 0x818, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Russian, NULL, 0, 0, (void *) 0x419, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MolRussian, NULL, 0, 0, (void *) 0x819, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Sami, NULL, 0, 0, (void *) 0x43b, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Sanskrit, NULL, 0, 0, (void *) 0x43b, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Serbian, NULL, 0, 0, (void *) 0xc1a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LatSerbian, NULL, 0, 0, (void *) 0x81a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Sindhi, NULL, 0, 0, (void *) 0x459, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Slovak, NULL, 0, 0, (void *) 0x41b, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Slovenian, NULL, 0, 0, (void *) 0x424, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Sorbian, NULL, 0, 0, (void *) 0x42e, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_TradSpanish, NULL, 0, 0, (void *) 0x40a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MXSpanish, NULL, 0, 0, (void *) 0x80a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ModSpanish, NULL, 0, 0, (void *) 0xc0a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_GuaSpanish, NULL, 0, 0, (void *) 0x100a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CRSpanish, NULL, 0, 0, (void *) 0x140a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_PanSpanish, NULL, 0, 0, (void *) 0x180a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_DRSpanish, NULL, 0, 0, (void *) 0x1c0a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_VenSpanish, NULL, 0, 0, (void *) 0x200a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ColSpanish, NULL, 0, 0, (void *) 0x240a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_PeruSpanish, NULL, 0, 0, (void *) 0x280a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ArgSpanish, NULL, 0, 0, (void *) 0x2c0a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_EcuSpanish, NULL, 0, 0, (void *) 0x300a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ChiSpanish, NULL, 0, 0, (void *) 0x340a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_UruSpanish, NULL, 0, 0, (void *) 0x380a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ParSpanish, NULL, 0, 0, (void *) 0x3c0a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_BolSpanish, NULL, 0, 0, (void *) 0x400a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ESSpanish, NULL, 0, 0, (void *) 0x440a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_HonSpanish, NULL, 0, 0, (void *) 0x480a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_NicSpanish, NULL, 0, 0, (void *) 0x4c0a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_PRSpanish, NULL, 0, 0, (void *) 0x500a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Sutu, NULL, 0, 0, (void *) 0x430, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Swahili, NULL, 0, 0, (void *) 0x441, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Swedish, NULL, 0, 0, (void *) 0x41d, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_FinSwedish, NULL, 0, 0, (void *) 0x81d, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Tamil, NULL, 0, 0, (void *) 0x449, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Tatar, NULL, 0, 0, (void *) 0x444, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Telugu, NULL, 0, 0, (void *) 0x44a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LangThai, NULL, 0, 0, (void *) 0x41e, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Tsonga, NULL, 0, 0, (void *) 0x431, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Tswana, NULL, 0, 0, (void *) 0x432, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Turkish, NULL, 0, 0, (void *) 0x41f, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Ukrainian, NULL, 0, 0, (void *) 0x422, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Urdu, NULL, 0, 0, (void *) 0x420, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_IndUrdu, NULL, 0, 0, (void *) 0x820, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Uzbek, NULL, 0, 0, (void *) 0x443, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CyrUzbek, NULL, 0, 0, (void *) 0x843, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Venda, NULL, 0, 0, (void *) 0x433, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Vietnamese, NULL, 0, 0, (void *) 0x42a, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Xhosa, NULL, 0, 0, (void *) 0x434, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Yiddish, NULL, 0, 0, (void *) 0x43d, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Zulu, NULL, 0, 0, (void *) 0x435, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; +static GTextInfo ttfnameids[] = { +/* Put styles (docs call it subfamily) first because it is most likely to change */ + { (unichar_t *) _STR_Styles, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 1, 0, 0, 1}, + { (unichar_t *) _STR_Copyright, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Family, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Fullname, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_UniqueID, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Version, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, +/* Don't bother with PostscriptName, we set that elsewhere */ + { (unichar_t *) _STR_Trademark, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Manufacturer, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Designer, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Descriptor, NULL, 0, 0, (void *) 10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_VenderURL, NULL, 0, 0, (void *) 11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_DesignerURL, NULL, 0, 0, (void *) 12, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_License, NULL, 0, 0, (void *) 13, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_LicenseURL, NULL, 0, 0, (void *) 14, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, +/* slot 15 is reserved */ + { (unichar_t *) _STR_OTFFamily, NULL, 0, 0, (void *) 16, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_OTFStyles, NULL, 0, 0, (void *) 17, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_CompatableFull, NULL, 0, 0, (void *) 18, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_SampleText, NULL, 0, 0, (void *) 19, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; + +struct langstyle { int lang; const unichar_t *str; }; +static const unichar_t regulareng[] = { 'R','e','g','u','l','a','r', '\0' }; +static const unichar_t demiboldeng[] = { 'D','e','m','i','B','o','l','d', '\0' }; +static const unichar_t demiboldeng3[] = { 'D','e','m','i', '\0' }; +static const unichar_t demiboldeng5[] = { 'S','e','m','i','B','o','l','d', '\0' }; +static const unichar_t boldeng[] = { 'B','o','l','d', '\0' }; +static const unichar_t thineng[] = { 'T','h','i','n', '\0' }; +static const unichar_t lighteng[] = { 'L','i','g','h','t', '\0' }; +static const unichar_t mediumeng[] = { 'M','e','d','i','u','m', '\0' }; +static const unichar_t bookeng[] = { 'B','o','o','k', '\0' }; +static const unichar_t heavyeng[] = { 'H','e','a','v','y', '\0' }; +static const unichar_t blackeng[] = { 'B','l','a','c','k', '\0' }; +static const unichar_t italiceng[] = { 'I','t','a','l','i','c', '\0' }; +static const unichar_t obliqueeng[] = { 'O','b','l','i','q','u','e', '\0' }; +static const unichar_t condensedeng[] = { 'C','o','n','d','e','n','s','e','d', '\0' }; +static const unichar_t expandedeng[] = { 'E','x','p','a','n','d','e','d', '\0' }; +static const unichar_t outlineeng[] = { 'O','u','t','l','i','n','e', '\0' }; + +static const unichar_t regularfren[] = { 'N','o','r','m','a','l', '\0' }; +static const unichar_t boldfren[] = { 'G','r','a','s', '\0' }; +static const unichar_t demiboldfren[] = { 'D','e','m','i','G','r','a','s', '\0' }; +static const unichar_t demiboldfren2[] = { 'D','e','m','i', '\0' }; +static const unichar_t mediumfren[] = { 'N','o','r','m','a','l', '\0' }; +static const unichar_t lightfren[] = { 'M','a','i','g','r','e', '\0' }; +static const unichar_t blackfren[] = { 'E','x','t','r','a','G','r','a','s', '\0' }; +static const unichar_t italicfren[] = { 'I','t','a','l','i','q','u','e', '\0' }; +static const unichar_t obliquefren[] = { 'O','b','l','i','q','u','e', '\0' }; +static const unichar_t condensedfren[] = { 'E','t','r','o','i','t','e', '\0' }; +static const unichar_t expandedfren[] = { 'E','l','a','r','g','i', '\0' }; +static const unichar_t outlinefren[] = { 'C','o','n','t','o','u','r', '\0' }; + +static const unichar_t regulargerm[] = { 'S','t','a','n','d','a','r','d', '\0' }; +static const unichar_t demiboldgerm[] = { 'H','a','l','b','f','e','t','t', '\0' }; +static const unichar_t demiboldgerm2[] = { 'S','c','h','m','a','l','l','f','e','t','t', '\0' }; +static const unichar_t boldgerm[] = { 'F','e','t','t', '\0' }; +static const unichar_t boldgerm2[] = { 'D','i','c','k', '\0' }; +static const unichar_t blackgerm[] = { 'S','c','h','w','a','r','z', '\0' }; +static const unichar_t lightgerm[] = { 'M','a','g','e','r', '\0' }; +static const unichar_t mediumgerm[] = { 'M','i','t','t','e','l', '\0' }; +static const unichar_t bookgerm[] = { 'B','u','c','h','s','c','h','r','i','f','t', '\0' }; +static const unichar_t italicgerm[] = { 'K','u','r','s','i','v', '\0' }; +static const unichar_t obliquegerm[] = { 'S','c','h','r',0xe4,'g', '\0' }; +static const unichar_t condensedgerm[] = { 'S','c','h','m','a','l', '\0' }; +static const unichar_t expandedgerm[] = { 'B','r','e','i','t', '\0' }; +static const unichar_t outlinegerm[] = { 'K','o','n','t','u','r','e','r','t', '\0' }; + +static const unichar_t regularspan[] = { 'N','o','r','m','a','l', '\0' }; +static const unichar_t boldspan[] = { 'N','i','g','r','i','t','a', '\0' }; +static const unichar_t italicspan[] = { 'C','u','r','s','i','v','a', '\0' }; + +static const unichar_t regularital[] = { 'N','o','r','m','a','l','e', '\0' }; +static const unichar_t demiboldital[] = { 'N','e','r','r','e','t','t','o', '\0' }; +static const unichar_t boldital[] = { 'N','e','r','o', '\0' }; +static const unichar_t thinital[] = { 'F','i','n','e', '\0' }; +static const unichar_t lightital[] = { 'C','h','i','a','r','o', '\0' }; +static const unichar_t mediumital[] = { 'M','e','d','i','o', '\0' }; +static const unichar_t bookital[] = { 'L','i','b','r','o', '\0' }; +static const unichar_t heavyital[] = { 'N','e','r','i','s','s','i','m','o', '\0' }; +static const unichar_t blackital[] = { 'E','x','t','r','a','N','e','r','o', '\0' }; +static const unichar_t italicital[] = { 'C','u','r','s','i','v','o', '\0' }; +static const unichar_t obliqueital[] = { 'O','b','l','i','q','u','o', '\0' }; +static const unichar_t condensedital[] = { 'C','o','n','d','e','n','s','a','t','o', '\0' }; +static const unichar_t expandedital[] = { 'A','l','l','a','r','g','a','t','o', '\0' }; + +static const unichar_t regularru[] = { 0x41e, 0x431, 0x44b, 0x447, 0x43d, 0x44b, 0x439, '\0' }; +static const unichar_t demiboldru[] = { 0x41f, 0x43e, 0x43b, 0x443, 0x436, 0x438, 0x440, 0x43d, 0x44b, 0x439, 0 }; +static const unichar_t boldru[] = { 0x41e, 0x431, 0x44b, 0x447, 0x43d, 0x44b, 0x439, 0 }; +static const unichar_t heavyru[] = { 0x421, 0x432, 0x435, 0x440, 0x445, 0x436, 0x438, 0x440, 0x43d, 0x44b, 0x439, 0 }; +static const unichar_t blackru[] = { 0x427, 0x451, 0x440, 0x43d, 0x44b, 0x439, 0 }; +static const unichar_t thinru[] = { 0x422, 0x43e, 0x43d, 0x43a, 0x438, 0x439, 0 }; +static const unichar_t lightru[] = { 0x421, 0x432, 0x435, 0x442, 0x43b, 0x44b, 0x439, 0 }; +static const unichar_t italicru[] = { 0x41a, 0x443, 0x440, 0x441, 0x438, 0x432/*, 0x43d, 0x44b, 0x439*/, 0 }; +static const unichar_t obliqueru[] = { 0x41d, 0x430, 0x43a, 0x43b, 0x43e, 0x43d/*, 0x43d, 0x44b, 0x439*/, 0 }; +static const unichar_t condensedru[] = { 0x423, 0x437, 0x43a, 0x438, 0x439, '\0' }; +static const unichar_t expandedru[] = { 0x428, 0x438, 0x440, 0x43e, 0x43a, 0x438, 0x439, '\0' }; + +static const unichar_t regularhu[] = { 'N','o','r','m',0xe1,'l', '\0' }; +static const unichar_t demiboldhu[] = { 'N','e','g','y','e','d','k',0xf6,'v',0xe9,'r', '\0' }; +static const unichar_t demiboldhu2[] = { 'F',0xe9,'l','k',0xf6,'v',0xe9,'r', '\0' }; +static const unichar_t boldhu[] = { 'F',0xe9,'l','k',0xf6,'v',0xe9,'r', '\0' }; +static const unichar_t boldhu2[] = { 'H',0xe1,'r','o','m','n','e','g','y','e','d','k',0xf6,'v',0xe9,'r', '\0' }; +static const unichar_t thinhu[] = { 'S','o','v',0xe1,'n','y', '\0' }; +static const unichar_t lighthu[] = { 'V','i','l',0xe1,'g','o','s', '\0' }; +static const unichar_t mediumhu[] = { 'K',0xf6,'z','e','p','e','s', '\0' }; +static const unichar_t bookhu[] = { 'H','a','l','v',0xe1,'n','y', '\0' }; +static const unichar_t bookhu2[] = { 'K',0xf6,'n','y','v', '\0' }; +static const unichar_t heavyhu[] = { 'K',0xf6,'v',0xe9,'r', '\0' }; +static const unichar_t heavyhu2[] = { 'E','x','t','r','a','k',0xf6,'v',0xe9,'r', '\0' }; +static const unichar_t blackhu[] = { 'F','e','k','e','t','e', '\0' }; +static const unichar_t blackhu2[] = { 'S',0xf6,'t',0xe9,'t', '\0' }; +static const unichar_t italichu[] = { 'D',0x151,'l','t', '\0' }; +static const unichar_t obliquehu[] = { 'D',0xf6,'n','t',0xf6,'t','t', '\0' }; +static const unichar_t obliquehu2[] = { 'F','e','r','d','e', '\0' }; +static const unichar_t condensedhu[] = { 'K','e','s','k','e','n','y', '\0' }; +static const unichar_t expandedhu[] = { 'S','z',0xe9,'l','e','s', '\0' }; +static const unichar_t outlinehu[] = { 'K','o','n','t',0xfa,'r','o','s', '\0' }; + +static struct langstyle regs[] = { {0x409, regulareng}, { 0x40c, regularfren }, { 0x410, regularital }, { 0x407, regulargerm }, { 0x40a, regularspan }, { 0x419, regularru }, { 0x40e, regularhu }, { 0 }}; +static struct langstyle meds[] = { {0x409, mediumeng}, { 0x410, mediumital }, { 0x40c, mediumfren }, { 0x407, mediumgerm }, { 0x40e, mediumhu }, { 0 }}; +static struct langstyle books[] = { {0x409, bookeng}, { 0x410, bookital }, { 0x407, bookgerm }, { 0x40e, bookhu }, { 0x40e, bookhu2 }, { 0 }}; +static struct langstyle bolds[] = { {0x409, boldeng}, { 0x410, boldital }, { 0x40c, boldfren }, { 0x407, boldgerm }, { 0x407, boldgerm2 }, { 0x40a, boldspan}, { 0x419, boldru }, { 0x40e, boldhu }, { 0x40e, boldhu2 }, { 0 }}; +static struct langstyle italics[] = { {0x409, italiceng}, { 0x410, italicital }, { 0x40c, italicfren }, { 0x407, italicgerm }, { 0x40a, italicspan}, { 0x419, italicru }, { 0x40e, italichu }, { 0 }}; +static struct langstyle obliques[] = { {0x409, obliqueeng}, { 0x410, obliqueital }, { 0x40c, obliquefren }, { 0x407, obliquegerm }, { 0x419, obliqueru }, { 0x40e, obliquehu }, { 0x40e, obliquehu2 }, { 0 }}; +static struct langstyle demibolds[] = { {0x409, demiboldeng}, {0x409, demiboldeng3}, {0x409, demiboldeng5}, + { 0x410, demiboldital }, { 0x40c, demiboldfren }, { 0x40c, demiboldfren2 }, { 0x407, demiboldgerm }, { 0x407, demiboldgerm2 }, + { 0x419, demiboldru }, { 0x40e, demiboldhu }, { 0x40e, demiboldhu2 },{ 0 }}; +static struct langstyle heavys[] = { {0x409, heavyeng}, { 0x410, heavyital }, { 0x419, heavyru }, { 0x40e, heavyhu }, { 0x40e, heavyhu2 }, { 0 }}; +static struct langstyle blacks[] = { {0x409, blackeng}, { 0x410, blackital }, { 0x40c, blackfren }, { 0x407, blackgerm }, { 0x419, blackru }, { 0x40e, blackhu }, { 0x40e, blackhu2 }, { 0 }}; +static struct langstyle thins[] = { {0x409, thineng}, { 0x410, thinital }, { 0x419, thinru }, { 0x40e, thinhu }, { 0 }}; +static struct langstyle lights[] = { {0x409, lighteng}, {0x410, lightital}, {0x40c, lightfren}, {0x407, lightgerm}, { 0x419, lightru }, { 0x40e, lighthu }, { 0 }}; +static struct langstyle condenseds[] = { {0x409, condensedeng}, {0x410, condensedital}, {0x40c, condensedfren}, {0x407, condensedgerm}, { 0x419, condensedru }, { 0x40e, condensedhu }, { 0 }}; +static struct langstyle expandeds[] = { {0x409, expandedeng}, {0x410, expandedital}, {0x40c, expandedfren}, {0x407, expandedgerm}, { 0x419, expandedru }, { 0x40e, expandedhu }, { 0 }}; +static struct langstyle outlines[] = { {0x409, outlineeng}, {0x40c, outlinefren}, {0x407, outlinegerm}, {0x40e, outlinehu}, { 0 }}; +static struct langstyle *stylelist[] = {regs, meds, books, demibolds, bolds, heavys, blacks, + lights, thins, italics, obliques, condenseds, expandeds, outlines, NULL }; + +#define CID_Features 101 /* Mac stuff */ +#define CID_FeatureDel 103 +#define CID_FeatureEdit 105 + +#define CID_Encoding 1001 +#define CID_Family 1002 +#define CID_Weight 1003 +#define CID_ItalicAngle 1004 +#define CID_UPos 1005 +#define CID_UWidth 1006 +#define CID_Ascent 1007 +#define CID_Descent 1008 +#define CID_NChars 1009 +#define CID_Notice 1010 +#define CID_Version 1011 +#define CID_UniqueID 1012 +#define CID_HasVerticalMetrics 1013 +#define CID_VOriginLab 1014 +#define CID_VOrigin 1015 +#define CID_Fontname 1016 +#define CID_Em 1017 +#define CID_Scale 1018 +#define CID_IsOrder2 1019 +#define CID_IsMultiLayer 1020 +#define CID_Interpretation 1021 + +#define CID_Make 1111 +#define CID_Delete 1112 +#define CID_XUID 1113 +#define CID_Human 1114 + +#define CID_ForceEncoding 1215 + +#define CID_PrivateEntries 2001 +#define CID_PrivateValues 2002 +#define CID_Add 2003 +#define CID_Guess 2004 +#define CID_Remove 2005 +#define CID_Hist 2006 + +#define CID_WeightClass 3001 +#define CID_WidthClass 3002 +#define CID_PFMFamily 3003 +#define CID_FSType 3004 +#define CID_NoSubsetting 3005 +#define CID_OnlyBitmaps 3006 +#define CID_LineGap 3007 +#define CID_VLineGap 3008 +#define CID_VLineGapLab 3009 + +#define CID_PanFamily 4001 +#define CID_PanSerifs 4002 +#define CID_PanWeight 4003 +#define CID_PanProp 4004 +#define CID_PanContrast 4005 +#define CID_PanStrokeVar 4006 +#define CID_PanArmStyle 4007 +#define CID_PanLetterform 4008 +#define CID_PanMidLine 4009 +#define CID_PanXHeight 4010 + +#define CID_Language 5001 +#define CID_StrID 5002 +#define CID_String 5003 +#define CID_TNDef 5004 + +#define CID_Comment 6001 + +#define CID_AnchorClasses 7001 +#define CID_AnchorNew 7002 +#define CID_AnchorDel 7003 +#define CID_AnchorRename 7004 +#define CID_ShowMark 7005 +#define CID_ShowBase 7006 + +#define CID_TeXText 8001 +#define CID_TeXMath 8002 +#define CID_TeXMathExt 8003 +#define CID_DesignSize 8004 +#define CID_MoreParams 8005 +#define CID_TeXExtraSpLabel 8006 +#define CID_TeX 8007 /* through 8014 */ + +#define CID_ContextClasses 9001 /* Variants at +n*100 */ +#define CID_ContextNew 9002 +#define CID_ContextDel 9003 +#define CID_ContextEdit 9004 +#define CID_ContextEditData 9005 + +#define CID_SMList 9011 /* Variants at +n*100 */ +#define CID_SMNew 9012 +#define CID_SMDel 9013 +#define CID_SMEdit 9014 + +#define CID_MacAutomatic 16000 +#define CID_MacStyles 16001 + +struct psdict *PSDictCopy(struct psdict *dict) { + struct psdict *ret; + int i; + + if ( dict==NULL ) +return( NULL ); + + ret = gcalloc(1,sizeof(struct psdict)); + ret->cnt = dict->cnt; ret->next = dict->next; + ret->keys = gcalloc(ret->cnt,sizeof(char *)); + ret->values = gcalloc(ret->cnt,sizeof(char *)); + for ( i=0; inext; ++i ) { + ret->keys[i] = copy(dict->keys[i]); + ret->values[i] = copy(dict->values[i]); + } + +return( ret ); +} + +int PSDictFindEntry(struct psdict *dict, char *key) { + int i; + + if ( dict==NULL ) +return( -1 ); + + for ( i=0; inext; ++i ) + if ( strcmp(dict->keys[i],key)==0 ) +return( i ); + +return( -1 ); +} + +char *PSDictHasEntry(struct psdict *dict, char *key) { + int i; + + if ( dict==NULL ) +return( NULL ); + + for ( i=0; inext; ++i ) + if ( strcmp(dict->keys[i],key)==0 ) +return( dict->values[i] ); + +return( NULL ); +} + +int PSDictRemoveEntry(struct psdict *dict, char *key) { + int i; + + if ( dict==NULL ) +return( false ); + + for ( i=0; inext; ++i ) + if ( strcmp(dict->keys[i],key)==0 ) + break; + if ( i==dict->next ) +return( false ); + free( dict->keys[i]); + free( dict->values[i] ); + --dict->next; + while ( inext ) { + dict->keys[i] = dict->keys[i+1]; + dict->values[i] = dict->values[i+1]; + ++i; + } + +return( true ); +} + +int PSDictChangeEntry(struct psdict *dict, char *key, char *newval) { + int i; + + if ( dict==NULL ) +return( -1 ); + + for ( i=0; inext; ++i ) + if ( strcmp(dict->keys[i],key)==0 ) + break; + if ( i==dict->next ) { + if ( dict->next>=dict->cnt ) { + dict->cnt += 10; + dict->keys = grealloc(dict->keys,dict->cnt*sizeof(char *)); + dict->values = grealloc(dict->values,dict->cnt*sizeof(char *)); + } + dict->keys[dict->next] = copy(key); + dict->values[dict->next] = NULL; + ++dict->next; + } + free(dict->values[i]); + dict->values[i] = copy(newval); +return( i ); +} + +/* These are Postscript names, and as such should not be translated */ +enum { pt_number, pt_boolean, pt_array, pt_code }; +static struct { const char *name; short type, arr_size, present; } KnownPrivates[] = { + { "BlueValues", pt_array, 14 }, + { "OtherBlues", pt_array, 10 }, + { "BlueFuzz", pt_number }, + { "FamilyBlues", pt_array, 14 }, + { "FamilyOtherBlues", pt_array, 10 }, + { "BlueScale", pt_number }, + { "BlueShift", pt_number }, + { "StdHW", pt_array, 1 }, + { "StdVW", pt_array, 1 }, + { "StemSnapH", pt_array, 12 }, + { "StemSnapV", pt_array, 12 }, + { "ForceBold", pt_boolean }, + { "LanguageGroup", pt_number }, + { "RndStemUp", pt_number }, + { "lenIV", pt_number }, + { "ExpansionFactor", pt_number }, + { "Erode", pt_code }, +/* I am deliberately not including Subrs and OtherSubrs */ +/* The first could not be entered (because it's a set of binary strings) */ +/* And the second has special meaning to us and must be handled with care */ + { NULL } +}; + +struct ask_data { + int ret; + int done; +}; + +static int Ask_Cancel(GGadget *g, GEvent *e) { + GWindow gw; + struct ask_data *d; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + d->done = true; + } +return( true ); +} + +static int Ask_OK(GGadget *g, GEvent *e) { + GWindow gw; + struct ask_data *d; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + d->done = d->ret = true; + } +return( true ); +} + +static int ask_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct ask_data *d = GDrawGetUserData(gw); + d->done = true; + } else if ( event->type == et_char ) { +return( false ); + } +return( true ); +} + +static char *AskKey(SplineFont *sf) { + int i,j, cnt=0; + GTextInfo *ti; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + struct ask_data d; + char *ret; + int ptwidth; + + if ( sf->private==NULL ) + for ( i=0; KnownPrivates[i].name!=NULL; ++i ) { + KnownPrivates[i].present = 0; + ++cnt; + } + else { + for ( i=0; KnownPrivates[i].name!=NULL; ++i ) { + for ( j=0; jprivate->next; ++j ) + if ( strcmp(KnownPrivates[i].name,sf->private->keys[j])==0 ) + break; + if ( !(KnownPrivates[i].present = (jprivate->next)) ) + ++cnt; + } + } + if ( cnt==0 ) + ti = NULL; + else { + ti = gcalloc(cnt+1,sizeof(GTextInfo)); + for ( i=cnt=0; KnownPrivates[i].name!=NULL; ++i ) + if ( !KnownPrivates[i].present ) + ti[cnt++].text = uc_copy(KnownPrivates[i].name); + } + + memset(&d,'\0',sizeof(d)); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<private==NULL?0:sf->private->next)+1,sizeof( GTextInfo )); + int i=0; + + if ( sf->private!=NULL ) { + for ( i=0; iprivate->next; ++i ) { + ti[i].text = uc_copy(sf->private->keys[i]); + } + } + if ( i!=0 ) + ti[0].selected = true; +return( ti ); +} + +static GTextInfo **PI_ListArray(struct psdict *private) { + GTextInfo **ti = gcalloc((private==NULL?0:private->next)+1,sizeof( GTextInfo *)); + int i=0; + + if ( private!=NULL ) { + for ( i=0; inext; ++i ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + ti[i]->fg = ti[i]->bg = COLOR_DEFAULT; + ti[i]->text = uc_copy(private->keys[i]); + } + } + ti[i] = gcalloc(1,sizeof(GTextInfo)); + if ( i!=0 ) + ti[0]->selected = true; +return( ti ); +} + +static void PIPrivateCheck(struct gfi_data *d) { + if ( d->private==NULL ) { + if ( d->sf->private==NULL ) { + d->private = gcalloc(1,sizeof(struct psdict)); + d->private->cnt = 10; + d->private->keys = gcalloc(10,sizeof(char *)); + d->private->values = gcalloc(10,sizeof(char *)); + } else + d->private = PSDictCopy(d->sf->private); + } +} + +static int PIFinishFormer(struct gfi_data *d) { + static int buts[] = { _STR_OK, _STR_Cancel, 0 }; + unichar_t *end; + + if ( d->old_sel < 0 ) +return( true ); + if ( d->private==NULL && d->sf->private!=NULL ) { + const unichar_t *val = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_PrivateValues)); + if ( uc_strcmp(val,d->sf->private->values[d->old_sel])==0 ) +return( true ); /* Didn't change */ + PIPrivateCheck(d); + } + if ( d->private!=NULL && d->old_sel>=0 && d->old_sel!=d->private->next ) { + const unichar_t *val = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_PrivateValues)); + const unichar_t *pt = val; + int i; + + /* does the type appear reasonable? */ + while ( isspace(*pt)) ++pt; + for ( i=0; KnownPrivates[i].name!=NULL; ++i ) + if ( strcmp(KnownPrivates[i].name,d->private->keys[d->old_sel])==0 ) + break; + if ( KnownPrivates[i].name!=NULL ) { + if ( KnownPrivates[i].type==pt_array ) { + if ( *pt!='[' && GWidgetAskR(_STR_Badtype,buts,0,1,_STR_Arrayquest)==1 ) +return( false ); + } else if ( KnownPrivates[i].type==pt_boolean ) { + if ( uc_strcmp(pt,"true")!=0 && uc_strcmp(pt,"false")!=0 && + GWidgetAskR(_STR_Badtype,buts,0,1,_STR_Boolquest)==1 ) +return( false ); + } else if ( KnownPrivates[i].type==pt_code ) { + if ( *pt!='{' && GWidgetAskR(_STR_Badtype,buts,0,1,_STR_Codequest)==1 ) +return( false ); + } else if ( KnownPrivates[i].type==pt_number ) { + u_strtod(pt,&end); + while ( isspace(*end)) ++end; + if ( *end!='\0' && GWidgetAskR(_STR_Badtype,buts,0,1,_STR_Numberquest)==1 ) +return( false ); + } + } + + /* Ok then set it */ + free(d->private->values[d->old_sel]); + d->private->values[d->old_sel] = cu_copy(val); + d->old_sel = -1; + } +return( true ); +} + +static void ProcessListSel(struct gfi_data *d) { + GGadget *list = GWidgetGetControl(d->gw,CID_PrivateEntries); + int sel = GGadgetGetFirstListSelectedItem(list); + unichar_t *temp; + static const unichar_t nullstr[] = { 0 }; + SplineFont *sf = d->sf; + struct psdict *private; + + if ( d->old_sel==sel ) +return; + + if ( !PIFinishFormer(d)) { + /*GGadgetSelectListItem(list,sel,false);*/ + GGadgetSelectListItem(list,d->old_sel,true); +return; + } + private = d->private ? d->private : sf->private; + if ( sel==-1 ) { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Remove),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Guess),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Hist),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_PrivateValues),false); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_PrivateValues),nullstr); + } else { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Remove),true); + if ( strcmp(private->keys[sel],"BlueValues")==0 || + strcmp(private->keys[sel],"OtherBlues")==0 || + strcmp(private->keys[sel],"StdHW")==0 || + strcmp(private->keys[sel],"StemSnapH")==0 || + strcmp(private->keys[sel],"StdVW")==0 || + strcmp(private->keys[sel],"StemSnapV")==0 ) { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Guess),true); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Hist),true); + } else { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Guess),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Hist),false); + } + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_PrivateValues),true); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_PrivateValues), + temp = uc_copy( private->values[sel])); + free( temp ); + GTextFieldShow(GWidgetGetControl(d->gw,CID_PrivateValues),0); + } + d->old_sel = sel; +} + +static int PI_Add(GGadget *g, GEvent *e) { + GWindow gw; + struct gfi_data *d; + GGadget *list; + int i; + char *newkey; + GTextInfo **ti; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + if ( !PIFinishFormer(d)) +return(true); + newkey = AskKey(d->sf); + if ( newkey==NULL ) +return( true ); + PIPrivateCheck(d); + if (( i = PSDictFindEntry(d->private,newkey))==-1 ) + i = PSDictChangeEntry(d->private,newkey,""); + list = GWidgetGetControl(d->gw,CID_PrivateEntries); + ti = PI_ListArray(d->private); + if ( i>0 ) { + ti[0]->selected = false; + ti[i]->selected = true; + } + GGadgetSetList(list,ti,false); + d->old_sel = -1; + ProcessListSel(d); + free(newkey); + } +return( true ); +} + +static void arraystring(char *buffer,real *array,int cnt) { + int i, ei; + + for ( ei=cnt; ei>1 && array[ei-1]==0; --ei ); + *buffer++ = '['; + for ( i=0; isnapcnt[mi] ) mi = i; + if ( mi==-1 ) +return; + sprintf( buffer, "[%d]", (int) stemsnap[mi]); + PSDictChangeEntry(private,name1,buffer); + arraystring(buffer,stemsnap,12); + PSDictChangeEntry(private,name2,buffer); +} + +static int PI_Guess(GGadget *g, GEvent *e) { + GWindow gw; + struct gfi_data *d; + GGadget *list; + int sel; + SplineFont *sf; + real bluevalues[14], otherblues[10]; + real snapcnt[12]; + real stemsnap[12]; + char buffer[211]; + unichar_t *temp; + static int buts[] = { _STR_OK, _STR_Cancel, 0 }; + struct psdict *private; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + sf = d->sf; + private = d->private ? d->private : sf->private; + list = GWidgetGetControl(d->gw,CID_PrivateEntries); + sel = GGadgetGetFirstListSelectedItem(list); + if ( strcmp(private->keys[sel],"BlueValues")==0 || + strcmp(private->keys[sel],"OtherBlues")==0 ) { + if ( GWidgetAskR(_STR_Guess,buts,0,1,_STR_Bluequest)==1 ) +return( true ); + PIPrivateCheck(d); + private = d->private; + FindBlues(sf,bluevalues,otherblues); + arraystring(buffer,bluevalues,14); + PSDictChangeEntry(private,"BlueValues",buffer); + arraystring(buffer,otherblues,10); + PSDictChangeEntry(sf->private,"OtherBlues",buffer); + } else if ( strcmp(private->keys[sel],"StdHW")==0 || + strcmp(private->keys[sel],"StemSnapH")==0 ) { + if ( GWidgetAskR(_STR_Guess,buts,0,1,_STR_Hstemquest)==1 ) +return( true ); + FindHStems(sf,stemsnap,snapcnt); + PIPrivateCheck(d); + SnapSet(d->private,stemsnap,snapcnt,"StdHW","StemSnapH"); + } else if ( strcmp(private->keys[sel],"StdVW")==0 || + strcmp(private->keys[sel],"StemSnapV")==0 ) { + if ( GWidgetAskR(_STR_Guess,buts,0,1,_STR_Vstemquest)==1 ) +return( true ); + FindVStems(sf,stemsnap,snapcnt); + PIPrivateCheck(d); + SnapSet(d->private,stemsnap,snapcnt,"StdVW","StemSnapV"); + } + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_PrivateValues), + temp = uc_copy( d->private->values[sel])); + free( temp ); + } +return( true ); +} + +static int PI_Hist(GGadget *g, GEvent *e) { + GWindow gw; + struct gfi_data *d; + GGadget *list; + int sel; + SplineFont *sf; + struct psdict *private; + enum hist_type h; + unichar_t *temp; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + sf = d->sf; + PIPrivateCheck(d); + private = d->private ? d->private : sf->private; + list = GWidgetGetControl(d->gw,CID_PrivateEntries); + sel = GGadgetGetFirstListSelectedItem(list); + if ( strcmp(private->keys[sel],"BlueValues")==0 || + strcmp(private->keys[sel],"OtherBlues")==0 ) + h = hist_blues; + else if ( strcmp(private->keys[sel],"StdHW")==0 || + strcmp(private->keys[sel],"StemSnapH")==0 ) + h = hist_hstem; + else if ( strcmp(private->keys[sel],"StdVW")==0 || + strcmp(private->keys[sel],"StemSnapV")==0 ) + h = hist_vstem; + else +return( true ); /* can't happen */ + SFHistogram(sf,private,NULL,h); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_PrivateValues), + temp = uc_copy( d->private->values[sel])); + free( temp ); + } +return( true ); +} + +static int PI_Delete(GGadget *g, GEvent *e) { + GWindow gw; + struct gfi_data *d; + GGadget *list; + int sel; + SplineFont *sf; + GTextInfo **ti; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + PIPrivateCheck(d); + sf = d->sf; + list = GWidgetGetControl(d->gw,CID_PrivateEntries); + sel = GGadgetGetFirstListSelectedItem(list); + PSDictRemoveEntry(d->private, d->private->keys[sel]); + sf->changed = true; + ti = PI_ListArray(d->private); + --sel; + if ( d->private!=NULL && sel>=d->private->next ) + sel = d->private->next-1; + if ( sel>0 ) { + ti[0]->selected = false; + ti[sel]->selected = true; + } + GGadgetSetList(list,ti,false); + d->old_sel = -2; + ProcessListSel(d); + } +return( true ); +} + +static int PI_ListSel(GGadget *g, GEvent *e) { + + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + ProcessListSel(GDrawGetUserData(GGadgetGetWindow(g))); + } +return( true ); +} + +static int infont(SplineChar *sc, const unsigned short *table, int tlen, + Encoding *item, uint8 *used, int new_map) { + int i; + int tlen2 = tlen; + /* for some reason, some encodings have multiple entries for the same */ + /* glyph. One obvious one is space: 0x20 and 0xA0. The used bit array */ + /* is designed to handle that unpleasantness */ + + if ( table==NULL && item==NULL ) { + if ( sc->unicodeenc==-1 ) { + if ( sc->enc!=0 || (used[0]&1) ) { + sc->enc = -1; +return( false ); + } + used[0] |= 1; +return( true ); + } + if ( new_map>=em_unicodeplanes && new_map<=em_unicodeplanesmax ) { + i = sc->unicodeenc - ((new_map-em_unicodeplanes)<<16); + if ( i<0 || i>=tlen || (used[i>>3] & (1<<(i&7))) ) { + sc->enc = -1; +return( false ); + } + sc->enc = i; + used[i>>3] |= 1<<(i&7); +return( true ); + } else { + if ( sc->unicodeenc>=tlen || + (used[sc->unicodeenc>>3] & (1<<(sc->unicodeenc&7))) ) { + sc->enc = -1; +return( false ); + } + used[sc->unicodeenc>>3] |= (1<<(sc->unicodeenc&7)); + sc->enc = sc->unicodeenc; +return( true ); + } + } + if ( sc->unicodeenc==-1 ) { + if ( SCIsNotdef(sc,-1) && !(used[0]&1) && + ((table!=NULL && table[0]==0) || (item!=NULL && item->unicode[0]==0) || + new_map==em_sjis || new_map==em_wansung || + new_map==em_johab || new_map==em_jisgb || + new_map==em_big5 || new_map==em_big5hkscs)) { + if ( (table!=NULL && table[0]==0) || (item!=NULL && item->unicode[0]==0) ) + used[0] |= 1; +return( true ); /* .notdef goes to encoding 0 */ + } else if ( item!=NULL && item->psnames!=NULL ) { + for ( i=0; ipsnames[i]!=NULL && strcmp(item->psnames[i],sc->name)==0 && + !(used[i>>3]&(1<<(i&7))) ) { + used[i>>3] |= (1<<(i&7)); + sc->enc = i; +return( true ); + } + } + } else { + sc->enc = -1; +return( false ); + } + } + + if ( item!=NULL ) { + const int32 *table32 = item->unicode; + for ( i=0; iunicodeenc!=table32[i] || (used[i>>3]&(1<<(i&7))) || + !(table32[i]!=0 || i==0 || + (item->psnames!=NULL && item->psnames[i]!=NULL && + strcmp(item->psnames[i],".notdef")==0))); ++i ); + } else { + if ( table==unicode_from_jis208 || + table == unicode_from_ksc5601 || + table == unicode_from_gb2312 ) + tlen = 94*94; + + for ( i=0; iunicodeenc!=table[i] || (used[i>>3]&(1<<(i&7))) || + !(table[i]!=0 || i==0 )); ++i ); + } + if ( i==tlen && sc->unicodeenc<0x80 && tlen2==65536 && table == unicode_from_jis208 ) { + /* sjis often comes with a single byte encoding of ASCII */ + sc->enc = sc->unicodeenc; +return( true ); + } else if ( i==tlen && sc->unicodeenc>=0xFF61 && sc->unicodeenc<=0xFF9F && + tlen2==65536 && table == unicode_from_jis208 ) { + /* and katakana */ + for ( i=0xa1; i<=0xdf && sc->unicodeenc!=unicode_from_jis201[i] ; ++i ); + /* Was checking used array above, but it is set up for jis not sjis */ + if ( i>0xdf ) { + sc->enc = -1; +return( false ); + } + sc->enc = i; +return( true ); + } else if ( i==tlen && sc->unicodeenc<160 && + (tlen==0x10000-0xa100 || tlen==0x10000-0x8400 || + (tlen2==65536 && table==unicode_from_gb2312 ) || + (tlen2==65536 && table==unicode_from_ksc5601 ))) { + /* Big 5 often comes with a single byte encoding of ASCII */ + /* As do Johab and Wansung */ + /* but sjis is more complex... */ + sc->enc = sc->unicodeenc; +return( true ); + } + if ( i==tlen ) { + sc->enc = -1; +return( false ); + } else { + used[i>>3] |= (1<<(i&7)); + if ( tlen2==94*94 ) { + sc->enc = 0x2121 + ((i/94)<<8) + (i%94); +return( true ); + } else if ( table==unicode_from_ksc5601 ) { + /* Wansung */ + sc->enc = 0xa1a1 + ((i/94)<<8) + (i%94); +return( true ); + } else if ( table==unicode_from_gb2312 ) { + /* Dunno what this variant of gb2312 is called: em_jisgb */ + sc->enc = 0xa1a1 + ((i/94)<<8) + (i%94); +return( true ); + } else if ( table==unicode_from_jis208 ) { + /* sjis */ + int ch1, ch2, ro, co; + ch1 = i/94 + 0x21; ch2 = i%94 + 0x21; + ro = ch1<95 ? 112 : 176; + co = (ch1&1) ? (ch2>95?32:31) : 126; + sc->enc = ((((ch1+1)>>1) + ro )<<8 ) | (ch2+co); +return( true ); + } else if ( tlen==0x10000-0xa100 ) { + sc->enc = i+0xa100; +return( true ); + } else if ( tlen==0x10000-0x8400 ) { + sc->enc = i+0x8400; +return( true ); + } else { + sc->enc = i; +return( true ); + } + } +} + +static int intarget(SplineChar *sc, SplineFont *target) { + sc->enc = SFFindChar(target,sc->unicodeenc,sc->name); +return( sc->enc!=-1 ); +} + +static void RemoveSplineChar(SplineFont *sf, int enc) { + CharView *cv, *next; + struct splinecharlist *dep, *dnext; + BDFFont *bdf; + BDFChar *bfc; + SplineChar *sc = sf->chars[enc]; + BitmapView *bv, *bvnext; + RefChar *refs, *rnext; + FontView *fvs; + KernPair *kp, *kprev; + int i; + + if ( sc!=NULL ) { + if ( sc->views ) { + for ( cv = sc->views; cv!=NULL; cv=next ) { + next = cv->next; + GDrawDestroyWindow(cv->gw); + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } + for ( dep=sc->dependents; dep!=NULL; dep=dnext ) { + SplineChar *dsc = dep->sc; + RefChar *rf, *rnext; + dnext = dep->next; + /* May be more than one reference to us, colon has two refs to period */ + /* but only one dlist entry */ + for ( rf = dsc->layers[ly_fore].refs; rf!=NULL; rf=rnext ) { + rnext = rf->next; + if ( rf->sc==sc ) + SCRefToSplines(dsc,rf); + } + } + for ( fvs=sc->parent->fv; fvs!=NULL; fvs=fvs->nextsame ) { + if ( fvs->sv!=NULL ) { + RefChar *rf, *rnext; + for ( rf = fvs->sv->sc_srch.layers[ly_fore].refs; rf!=NULL; rf=rnext ) { + rnext = rf->next; + if ( rf->sc==sc ) + SCRefToSplines(&fvs->sv->sc_srch,rf); + } + for ( rf = fvs->sv->sc_rpl.layers[ly_fore].refs; rf!=NULL; rf=rnext ) { + rnext = rf->next; + if ( rf->sc==sc ) + SCRefToSplines(&fvs->sv->sc_rpl,rf); + } + } + /* Are there any kerning pairs that look at this character? */ + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kprev=NULL, kp=sf->chars[i]->kerns; kp!=NULL; kprev = kp, kp=kp->next ) { + if ( kp->sc==sc ) { + if ( kprev==NULL ) + sf->chars[i]->kerns = kp->next; + else + kprev->next = kp->next; + kp->next = NULL; + KernPairsFree(kp); + break; + } + } + } + } + sf->chars[enc] = NULL; + + for ( refs=sc->layers[ly_fore].refs; refs!=NULL; refs = rnext ) { + rnext = refs->next; + SCRemoveDependent(sc,refs); + } + SplineCharFree(sc); + } + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + if ( (bfc = bdf->chars[enc])!= NULL ) { + bdf->chars[enc] = NULL; + if ( bfc->views!=NULL ) { + for ( bv= bfc->views; bv!=NULL; bv=bvnext ) { + bvnext = bv->next; + GDrawDestroyWindow(bv->gw); + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } + BDFCharFree(bfc); + } + } +} + +static int __SFReencodeFont(SplineFont *sf,enum charset new_map, SplineFont *target); + +static int _SFForceEncoding(SplineFont *sf,enum charset new_map) { + int enc_cnt=256,i; + BDFFont *bdf; + Encoding *item=NULL; + + if ( sf->encoding_name==new_map ) +return(false); + if ( new_map==em_custom || new_map==em_compacted ) { + sf->encoding_name=em_custom; /* Custom, it's whatever's there */ +return(false); + } + + if ( new_map==em_original ) { + for ( i=enc_cnt=0; icharcnt; ++i ) if ( sf->chars[i]!=0 ) + sf->chars[i]->orig_pos = enc_cnt++; + if ( sf->charcnt==enc_cnt ) +return( false ); +return( __SFReencodeFont(sf,em_original,NULL)); + } + + + if ( new_map>=em_base ) { + for ( item=enclist; item!=NULL && item->enc_num!=new_map; item=item->next ); + if ( item!=NULL ) { + enc_cnt = item->char_cnt; + } else { + GWidgetErrorR(_STR_InvalidEncoding,_STR_InvalidEncoding); +return( false ); + } + } else if ( new_map==em_unicode || new_map==em_big5 || new_map==em_big5hkscs || new_map==em_johab ) + enc_cnt = 65536; + else if ( new_map==em_unicode4 ) + enc_cnt = unicode4_size; + else if ( new_map>=em_first2byte ) + enc_cnt = 65536; + + if ( sf->charcntchars = grealloc(sf->chars,enc_cnt*sizeof(SplineChar *)); + for ( i=sf->charcnt; ichars[i] = NULL; + sf->charcnt = enc_cnt; + } + for ( bdf=sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + if ( bdf->charcntchars = grealloc(bdf->chars,enc_cnt*sizeof(BDFChar *)); + for ( i=bdf->charcnt; ichars[i] = NULL; + } + bdf->charcnt = enc_cnt; + } + sf->encoding_name = new_map; + for ( i=0; icharcnt && ichars[i]!=NULL ) { + SplineChar dummy; + SCBuildDummy(&dummy,sf,i); + sf->chars[i]->unicodeenc = dummy.unicodeenc; + free(sf->chars[i]->name); + sf->chars[i]->name = copy(dummy.name); + } + free(sf->remap); + sf->remap = NULL; +return( true ); +} + +int SFForceEncoding(SplineFont *sf,enum charset new_map) { + if ( sf->mm!=NULL ) { + MMSet *mm = sf->mm; + int i; + for ( i=0; iinstance_count; ++i ) + _SFForceEncoding(mm->instances[i],new_map); + _SFForceEncoding(mm->normal,new_map); + } else +return( _SFForceEncoding(sf,new_map)); + +return( true ); +} + +void SFFindNearTop(SplineFont *sf) { + FontView *fv; + int i,k; + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + if ( sf->subfontcnt==0 ) { + for ( fv=sf->fv; fv!=NULL; fv=fv->nextsame ) { + fv->sc_near_top = NULL; + for ( i=fv->rowoff*fv->colcnt; icharcnt && i<(fv->rowoff+fv->rowcnt)*fv->colcnt; ++i ) + if ( sf->chars[i]!=NULL ) { + fv->sc_near_top = sf->chars[i]; + break; + } + } + } else { + for ( fv=sf->fv; fv!=NULL; fv=fv->nextsame ) { + fv->sc_near_top = NULL; + for ( i=fv->rowoff*fv->colcnt; isf->charcnt && i<(fv->rowoff+fv->rowcnt)*fv->colcnt; ++i ) { + for ( k=0; ksubfontcnt; ++k ) + if ( isubfonts[k]->charcnt && + sf->subfonts[k]->chars[i]!=NULL ) + fv->sc_near_top = sf->subfonts[k]->chars[i]; + } + } + } +} + +void SFRestoreNearTop(SplineFont *sf) { + FontView *fv; + + for ( fv=sf->fv; fv!=NULL; fv=fv->nextsame ) if ( fv->sc_near_top!=NULL ) { + /* Note: For CID keyed fonts, we don't care if sc is in the currenly */ + /* displayed font, all we care about is the CID (->enc) */ + fv->rowoff = fv->sc_near_top->enc/fv->colcnt; + GScrollBarSetPos(fv->vsb,fv->rowoff); + /* Don't ask for an expose event yet. We'll get one soon enough */ + } +} + +/* see also SplineFontNew in splineutil2.c */ +static int __SFReencodeFont(SplineFont *sf,enum charset new_map, + SplineFont *target) { + const unsigned short *table=NULL; + int i, extras, epos; + SplineChar **chars; + int enc_cnt; + BDFFont *bdf; + int tlen = 256; + Encoding *item=NULL; + uint8 *used; + RefChar *refs; + CharView *cv; + + if ( target==NULL ) { + if ( sf->encoding_name==new_map ) +return(false); + if ( new_map==em_custom ) { + sf->encoding_name=em_custom; /* Custom, it's whatever's there */ +return(false); + } + if ( new_map==em_unicodeplanes ) + new_map = em_unicode; /* Plane 0 is just unicode bmp */ + if ( new_map==em_adobestandard ) { + table = unicode_from_adobestd; + } else if ( new_map==em_iso8859_1 ) + table = unicode_from_i8859_1; + else if ( new_map==em_unicode ) { + table = NULL; + tlen = 65536; + } else if ( new_map==em_unicode4 ) { + table = NULL; + tlen = unicode4_size; + } else if ( new_map>=em_unicodeplanes && new_map<=em_unicodeplanesmax ) { + table = NULL; + tlen = 65536; + } else if ( new_map>=em_base ) { + for ( item=enclist; item!=NULL && item->enc_num!=new_map; item=item->next ); + if ( item!=NULL ) { + tlen = item->char_cnt; + table = NULL; + } else { + GWidgetErrorR(_STR_InvalidEncoding,_STR_InvalidEncoding); +return( false ); + } + } else if ( new_map==em_jis208 ) { + table = unicode_from_jis208; + tlen = 94*94; + } else if ( new_map==em_sjis ) { + table = unicode_from_jis208; + tlen = 65536; + } else if ( new_map==em_jis212 ) { + table = unicode_from_jis212; + tlen = 94*94; + } else if ( new_map==em_wansung ) { + table = unicode_from_ksc5601; + tlen = 65536; + } else if ( new_map==em_ksc5601 ) { + table = unicode_from_ksc5601; + tlen = 94*94; + } else if ( new_map==em_jisgb ) { + table = unicode_from_gb2312; + tlen = 65536; + } else if ( new_map==em_gb2312 ) { + table = unicode_from_gb2312; + tlen = 94*94; + } else if ( new_map==em_big5 ) { + table = unicode_from_big5; + tlen = 0x10000-0xa100; /* the big5 table starts at 0xa100 to save space */ + } else if ( new_map==em_big5hkscs ) { + table = unicode_from_big5hkscs; + tlen = 0x10000-0x8100; /* the big5 table starts at 0x8100 to save space */ + } else if ( new_map==em_johab ) { + table = unicode_from_johab; + tlen = 0x10000-0x8400; /* the johab table starts at 0x8400 to save space */ + } else if ( new_map==em_original ) { + tlen = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->orig_pos!=0xffff ) + if ( sf->chars[i]->orig_pos>tlen ) tlen = sf->chars[i]->orig_pos; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) +/* This can happen in two ways: User added characters, or we have one char at */ +/* two encodings (space, nbspace) */ +/* We could just remove duplicate encoding here, but I think better to leave */ +/* that info in */ + if ( sf->chars[i]->orig_pos==0xffff ) + sf->chars[i]->orig_pos = ++tlen; + ++tlen; + table = NULL; + } else + table = unicode_from_alphabets[new_map+3]; + } else { + if ( target->encoding_name == sf->encoding_name ) +return( false ); + table = NULL; + tlen = target->charcnt; + } + + enc_cnt=tlen; + if ( target!=NULL ) + /* Done */; + else if ( table==NULL ) + /* Done */; + else if ( tlen == 94*94 ) + enc_cnt = 65536; + else if ( tlen == 0x10000-0xa100 || tlen==0x10000-0x8400 || tlen==0x10000-0x8100 ) + enc_cnt = 65536; + + extras = 0; + if ( target==NULL && new_map==em_original ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->enc = sf->chars[i]->orig_pos; + } else { + used = gcalloc((tlen+7)/8,sizeof(uint8)); + for ( i=0; icharcnt; ++i ) { + SplineChar *sc = sf->chars[i]; + if ( sc==NULL ) + /* skip */; + else if ( (target==NULL && !infont(sc,table,tlen,item,used,new_map)) || + (target!=NULL && !intarget(sc,target) ) ) { + if ( sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL && sc->dependents==NULL && + (!sc->widthset || strcmp(sc->name,".notdef")==0 ) ) { + /* glyphs mapped to .notdef in a type1 font will have widthset but its not meaningful */ + RemoveSplineChar(sf,i); + } else + ++extras; + } + if ( sc!=NULL ) { + for ( cv=sc->views; cv!=NULL; cv=cv->next ) + cv->template1 = cv->template2 = NULL; + } + } + free(used); + } + chars = gcalloc(enc_cnt+extras,sizeof(SplineChar *)); + for ( bdf=sf->bitmaps; bdf!=NULL; bdf = bdf->next ) + bdf->temp = gcalloc(enc_cnt+extras,sizeof(BDFChar *)); + for ( i=0, epos=enc_cnt; icharcnt; ++i ) { + if ( sf->chars[i]==NULL ) + /* skip */; + else { + if ( sf->chars[i]->enc==-1 ) + sf->chars[i]->enc = epos++; + if ( chars[sf->chars[i]->enc]!=NULL ) + fprintf( stderr, "Warning: Two chars (%s,%s) mapped to the same encoding %d\n", + chars[sf->chars[i]->enc]->name, sf->chars[i]->name, + sf->chars[i]->enc ); + chars[sf->chars[i]->enc] = sf->chars[i]; + for ( bdf=sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + if ( icharcnt && bdf->chars[i]!=NULL && sf->chars[i]!=NULL ) { + bdf->chars[i]->enc = sf->chars[i]->enc; + bdf->temp[sf->chars[i]->enc] = bdf->chars[i]; + } + } + } + } + if ( epos!=enc_cnt+extras ) GDrawIError( "Bad count in ReencodeFont"); + free(sf->chars); + sf->chars = chars; + sf->charcnt = enc_cnt+extras; + sf->encoding_name = new_map; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( refs=sf->chars[i]->layers[ly_fore].refs; refs!=NULL; refs = refs->next ) + refs->local_enc = refs->sc->enc; + } + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + free(bdf->chars); + bdf->chars = bdf->temp; + bdf->temp = NULL; + bdf->charcnt = enc_cnt+extras; + bdf->encoding_name = new_map; + } + free(sf->remap); + sf->remap = NULL; + sf->encodingchanged = true; + sf->compacted = false; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + SCRefreshTitles(sf->chars[i]); +return( true ); +} + +static int _SFReencodeFont(SplineFont *sf,enum charset new_map, SplineFont *target) { + MMSet *mm = sf->mm; + int i, ret; + + SFFindNearTop(sf); + + if ( mm==NULL ) + ret = __SFReencodeFont(sf,new_map,target); + else { + ret = false; + for ( i=0; iinstance_count; ++i ) + ret |= __SFReencodeFont(mm->instances[i],new_map,target); + ret |= __SFReencodeFont(mm->normal,new_map,target); + } + + SFRestoreNearTop(sf); +return( ret ); +} + +int SFReencodeFont(SplineFont *sf,enum charset new_map) { + if ( new_map==em_compacted ) +return( SFCompactFont(sf)); + else if ( sf->compacted && new_map==sf->old_encname ) +return( SFUncompactFont(sf)); + else +return( _SFReencodeFont(sf,new_map,NULL)); +} + +int SFMatchEncoding(SplineFont *sf,SplineFont *target) { +return( _SFReencodeFont(sf,em_none,target)); +} + +static void _SFAddDelChars(SplineFont *sf, int nchars) { + int i; + BDFFont *bdf; + MetricsView *mv, *mnext; + + if ( nchars==sf->charcnt ) +return; + if ( nchars>sf->charcnt ) { + sf->chars = grealloc(sf->chars,nchars*sizeof(SplineChar *)); + for ( i=sf->charcnt; ichars[i] = NULL; + sf->charcnt = nchars; + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + bdf->chars = grealloc(bdf->chars,nchars*sizeof(BDFChar *)); + for ( i=bdf->charcnt; ichars[i] = NULL; + bdf->charcnt = nchars; + } + } else { + if ( sf->fv->metrics!=NULL ) { + for ( mv=sf->fv->metrics; mv!=NULL; mv = mnext ) { + mnext = mv->next; + GDrawDestroyWindow(mv->gw); + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } + for ( i=nchars; icharcnt; ++i ) { + RemoveSplineChar(sf,i); + } + sf->charcnt = nchars; + if ( nchars<256 ) sf->encoding_name = em_custom; + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + bdf->charcnt = nchars; + bdf->encoding_name = sf->encoding_name; + } + } + GlyphHashFree(sf); +} + +int SFAddDelChars(SplineFont *sf, int nchars) { + int i; + MMSet *mm = sf->mm; + + if ( nchars==sf->charcnt ) +return( false ); + + if ( mm==NULL ) + _SFAddDelChars(sf,nchars); + else { + for ( i=0; iinstance_count; ++i ) + _SFAddDelChars(mm->instances[i],nchars); + _SFAddDelChars(mm->normal,nchars); + } +return( true ); +} + +static void RegenerateEncList(struct gfi_data *d) { + Encoding *item; + GTextInfo **ti; + int i, any; + unichar_t *title=NULL; + + i = 0; + for ( item=enclist; item!=NULL ; item=item->next ) + if ( !item->builtin ) + ++i; + any = i!=0; + i += sizeof(encodingtypes)/sizeof(encodingtypes[0]); + ti = gcalloc(i+1,sizeof(GTextInfo *)); + for ( i=0; itext = uc_copy((char *) ti[i]->text); + ti[i]->text_is_1byte = false; + } else if ( encodingtypes[i].text_in_resource ) { + ti[i]->text = u_copy(GStringGetResource((int) ti[i]->text,NULL)); + ti[i]->text_in_resource = false; + } else { + ti[i]->text = u_copy(ti[i]->text); + } + ti[i]->bg = ti[i]->fg = COLOR_DEFAULT; + ti[i]->selected = ( (int) (ti[i]->userdata)==d->sf->encoding_name) && + !ti[i]->line; + if ( ti[i]->selected ) + title = ti[i]->text; + } + if ( any ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + ti[i]->bg = ti[i]->fg = COLOR_DEFAULT; + ti[i++]->line = true; + for ( item=enclist; item!=NULL ; item=item->next ) + if ( !item->builtin ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + ti[i]->bg = ti[i]->fg = COLOR_DEFAULT; + ti[i]->text = uc_copy(item->enc_name); + ti[i]->userdata = (void *) item->enc_num; + ti[i]->selected = ( item->enc_num==d->sf->encoding_name); + if ( ti[i++]->selected ) + title = ti[i-1]->text; + } + } + ti[i] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(GWidgetGetControl(d->gw,CID_Encoding),ti,false); + if ( title!=NULL ) + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_Encoding),title); + + for ( item=enclist; item!=NULL && item->builtin; item=item->next ); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Delete),item!=NULL); +} + +static int GFI_Delete(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + RemoveEncoding(); + RegenerateEncList(d); + } +return( true ); +} + +static int GFI_SelectEncoding(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int enc = GGadgetGetFirstListSelectedItem(GWidgetGetControl(d->gw,CID_Encoding)); + if ( encodingtypes[enc].userdata==(void *) em_unicodeplanes ) { + unichar_t ubuf[10], *ret; + char buf[10]; + int val; + sprintf(buf,"%d", d->uplane ); + uc_strcpy(ubuf,buf); + ret = GWidgetAskStringR(_STR_Encoding,ubuf,_STR_WhichPlane); + if ( ret!=NULL && (val=u_strtol(ret,NULL,0))>=0 && val<65536 ) + d->uplane = lastplane = val; + } + } +return( true ); +} + +static int GFI_Load(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + LoadEncodingFile(); + RegenerateEncList(d); + } +return( true ); +} + +static int GFI_Make(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + Encoding *item = MakeEncoding(d->sf); + if ( item!=NULL ) { + d->sf->encoding_name = item->enc_num; + RegenerateEncList(d); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Make),false); + } + } +return( true ); +} + +/* Use URW 4 letter abrieviations */ +static char *knownweights[] = { "Demi", "Bold", "Regu", "Medi", "Book", "Thin", + "Ligh", "Heav", "Blac", "Ultr", "Nord", "Norm", "Gras", "Stan", "Halb", + "Fett", "Mage", "Mitt", "Buch", NULL }; +static char *realweights[] = { "Demi", "Bold", "Regular", "Medium", "Book", "Thin", + "Light", "Heavy", "Black", "Ultra", "Nord", "Normal", "Gras", "Standard", "Halbfett", + "Fett", "Mager", "Mittel", "Buchschrift", NULL}; + +static int GFI_NameChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GWindow gw = GGadgetGetWindow(g); + struct gfi_data *gfi = GDrawGetUserData(gw); + const unichar_t *uname = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Fontname)); + unichar_t ubuf[50]; + int i; + for ( i=0; knownweights[i]!=NULL; ++i ) { + if ( uc_strstrmatch(uname,knownweights[i])!=NULL ) { + uc_strcpy(ubuf, realweights[i]); + GGadgetSetTitle(GWidgetGetControl(gw,CID_Weight),ubuf); + break; + } + } + if ( gfi->human_untitled ) + GGadgetSetTitle(GWidgetGetControl(gw,CID_Human),uname); + if ( gfi->family_untitled ) { + const unichar_t *ept = uname+u_strlen(uname); unichar_t *temp; + for ( i=0; knownweights[i]!=NULL; ++i ) { + if (( temp = uc_strstrmatch(uname,knownweights[i]))!=NULL && temptype==et_controlevent && e->u.control.subtype == et_textchanged ) { + struct gfi_data *gfi = GDrawGetUserData(GGadgetGetWindow(g)); + gfi->family_untitled = false; + } +return( true ); +} + +static int GFI_HumanChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + struct gfi_data *gfi = GDrawGetUserData(GGadgetGetWindow(g)); + gfi->human_untitled = false; + } +return( true ); +} + +static int GFI_VMetricsCheck(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GWindow gw = GGadgetGetWindow(g); + const unichar_t *vo = _GGadgetGetTitle(GWidgetGetControl(gw,CID_VOrigin)); + int checked = GGadgetIsChecked(g); + if ( checked && *vo=='\0' ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + char space[10]; unichar_t uspace[10]; + sprintf( space, "%d", d->sf->ascent ); + uc_strcpy(uspace,space); + GGadgetSetTitle(GWidgetGetControl(gw,CID_VOrigin),uspace); + } + GGadgetSetEnabled(GWidgetGetControl(gw,CID_VOrigin),checked); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_VOriginLab),checked); + GGadgetSetEnabled(GWidgetGetControl(GDrawGetParentWindow(gw),CID_VLineGap),checked); + GGadgetSetEnabled(GWidgetGetControl(GDrawGetParentWindow(gw),CID_VLineGapLab),checked); + } +return( true ); +} + +static int GFI_EmChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + char buf[20]; unichar_t ubuf[20]; + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(g); unichar_t *end; + int val = u_strtol(ret,&end,10), ascent, descent; + if ( *end ) +return( true ); + switch ( GGadgetGetCid(g)) { + case CID_Em: + ascent = rint( ((double) val)*d->sf->ascent/(d->sf->ascent+d->sf->descent) ); + descent = val - ascent; + break; + case CID_Ascent: + ascent = val; + ret = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Descent)); + descent = u_strtol(ret,&end,10); + if ( *end ) +return( true ); + break; + case CID_Descent: + descent = val; + ret = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Ascent)); + ascent = u_strtol(ret,&end,10); + if ( *end ) +return( true ); + break; + } + sprintf( buf, "%d", ascent ); if ( ascent==0 ) buf[0]='\0'; uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_Ascent),ubuf); + sprintf( buf, "%d", descent ); if ( descent==0 ) buf[0]='\0'; uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_Descent),ubuf); + sprintf( buf, "%d", ascent+descent ); if ( ascent+descent==0 ) buf[0]='\0'; uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_Em),ubuf); + } +return( true ); +} + +static int GFI_GuessItalic(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + real val = SFGuessItalicAngle(d->sf); + char buf[30]; unichar_t ubuf[30]; + sprintf( buf, "%.1f", val); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_ItalicAngle),ubuf); + } +return( true ); +} + +static void GFI_CleanupContext(struct gfi_data *d) { + FPST *fpst; + ASM *sm; + int i, j; + + /* Free any context which were created but got [Cancelled] */ + for ( i=0; igw,CID_ContextClasses+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( fpst!=NULL ) fpst->ticked = false; + } + } + for ( fpst = d->sf->possub; fpst!=NULL; fpst=fpst->next ) + fpst->ticked = true; + for ( i=0; igw,CID_ContextClasses+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( fpst!=NULL && !fpst->ticked ) { + fpst->next = NULL; + FPSTFree(fpst); + } + } + } + + /* Do the same thing for apple state machines */ + for ( i=0; i<3; ++i ) { + GGadget *list = GWidgetGetControl(d->gw,CID_SMList+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( sm!=NULL ) sm->ticked = false; + } + } + for ( sm = d->sf->sm; sm!=NULL; sm=sm->next ) + sm->ticked = true; + for ( i=0; i<3; ++i ) { + GGadget *list = GWidgetGetControl(d->gw,CID_SMList+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( sm!=NULL && !sm->ticked ) { + sm->next = NULL; + ASMFree(sm); + } + } + } +} + +static void GFI_ProcessContexts(struct gfi_data *d) { + FPST *fpst, *next, *p, *last; + ASM *sm, *nextsm, *psm, *lastsm; + int i, j; + + /* Free any contexts which have been deleted */ + for ( fpst = d->sf->possub; fpst!=NULL; fpst=fpst->next ) + fpst->ticked = false; + for ( i=0; igw,CID_ContextClasses+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( fpst!=NULL ) fpst->ticked = true; + } + } + p = NULL; + for ( fpst = d->sf->possub; fpst!=NULL; fpst=next ) { + next = fpst->next; + if ( fpst->ticked ) + p = fpst; + else { + if ( p==NULL ) + d->sf->possub = next; + else + p->next = next; + fpst->next = NULL; + FPSTFree(fpst); + } + } + + /* Now build up a new list containing all fpst's */ + last = NULL; + for ( i=0; igw,CID_ContextClasses+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( fpst!=NULL ) { + if ( last==NULL ) + d->sf->possub = fpst; + else + last->next = fpst; + last = fpst; + } + old[j]->userdata = NULL; + } + } + if ( last==NULL ) + d->sf->possub = NULL; + else + last->next = NULL; + + /* And for apple state machines... */ + /* Free any state machines which have been deleted */ + for ( sm = d->sf->sm; sm!=NULL; sm=sm->next ) + sm->ticked = false; + for ( i=0; i<3; ++i ) { + GGadget *list = GWidgetGetControl(d->gw,CID_SMList+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( sm!=NULL ) sm->ticked = true; + } + } + psm = NULL; + for ( sm = d->sf->sm; sm!=NULL; sm=nextsm ) { + nextsm = sm->next; + if ( sm->ticked ) + psm = sm; + else { + if ( p==NULL ) + d->sf->sm = nextsm; + else + psm->next = nextsm; + sm->next = NULL; + ASMFree(sm); + } + } + + /* Now build up a new list containing all active state machines */ + lastsm = NULL; + for ( i=0; i<4; ++i ) { + GGadget *list = GWidgetGetControl(d->gw,CID_SMList+i*100); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + for ( j=0; juserdata); + if ( sm!=NULL ) { + if ( lastsm==NULL ) + d->sf->sm = sm; + else + lastsm->next = sm; + lastsm = sm; + } + old[j]->userdata = NULL; + } + } + if ( lastsm==NULL ) + d->sf->sm = NULL; + else + lastsm->next = NULL; +} + +static void GFI_Close(struct gfi_data *d) { + FontView *fvs; + SplineFont *sf = d->sf; + int i; + + if ( d->ccd ) + CCD_Close(d->ccd); + if ( d->smd ) + SMD_Close(d->smd); + GFI_CleanupContext(d); + PSDictFree(d->private); + for ( i=0; idef.names[i]); + TTFLangNamesFree(d->names); + + if ( d->oldcnt!=sf->charcnt && sf->fv!=NULL && sf->fv->sf==sf ) { + FontView *fvs; + for ( fvs=sf->fv; fvs!=NULL; fvs = fvs->nextsame ) { + free(fvs->selected); + fvs->selected = gcalloc(sf->charcnt,sizeof(char)); + } + } + + GDrawDestroyWindow(d->gw); + for ( fvs = d->sf->fv; fvs!=NULL; fvs = fvs->nextsame ) { + GDrawRequestExpose(sf->fv->v,NULL,false); + if ( fvs->fontinfo == d ) + fvs->fontinfo = NULL; + } + d->done = true; + /* d will be freed by destroy event */; +} + +static void GFI_CancelClose(struct gfi_data *d) { + MacFeatListFree(GGadgetGetUserData((GWidgetGetControl( + d->gw,CID_Features)))); + GFI_Close(d); +} + +GTextInfo *AnchorClassesList(SplineFont *sf) { + AnchorClass *an; + int cnt; + GTextInfo *ti; + + for ( cnt=0, an=sf->anchor; an!=NULL; ++cnt, an=an->next ); + ti = gcalloc(cnt+1,sizeof(GTextInfo)); + for ( cnt=0, an=sf->anchor; an!=NULL; ++cnt, an=an->next ) { + ti[cnt].text = ClassName(an->name,an->feature_tag,an->flags, + an->script_lang_index, an->merge_with, an->type,false); + ti[cnt].fg = ti[cnt].bg = COLOR_DEFAULT; + ti[cnt].userdata = an; + } +return( ti ); +} + +GTextInfo **AnchorClassesLList(SplineFont *sf) { + AnchorClass *an; + int cnt; + GTextInfo **ti; + + for ( cnt=0, an=sf->anchor; an!=NULL; ++cnt, an=an->next ); + ti = gcalloc(cnt+1,sizeof(GTextInfo*)); + for ( cnt=0, an=sf->anchor; an!=NULL; ++cnt, an=an->next ) { + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + ti[cnt]->text = ClassName(an->name,an->feature_tag,an->flags, + an->script_lang_index,an->merge_with, an->type,false); + ti[cnt]->fg = ti[cnt]->bg = COLOR_DEFAULT; + ti[cnt]->userdata = an; + } + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); +return( ti ); +} + +GTextInfo **AnchorClassesSimpleLList(SplineFont *sf) { + AnchorClass *an; + int cnt; + GTextInfo **ti; + + for ( cnt=0, an=sf->anchor; an!=NULL; ++cnt, an=an->next ); + ti = gcalloc(cnt+1,sizeof(GTextInfo*)); + for ( cnt=0, an=sf->anchor; an!=NULL; ++cnt, an=an->next ) { + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + ti[cnt]->text = u_copy(an->name); + ti[cnt]->fg = ti[cnt]->bg = COLOR_DEFAULT; + ti[cnt]->userdata = an; + } + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); +return( ti ); +} + +static void GFI_AnchorShow(GGadget *g, int index) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int i, start; + GGadget *list = GWidgetGetControl(GGadgetGetWindow(g),CID_AnchorClasses); + int sel = GGadgetGetFirstListSelectedItem(list), len; + GTextInfo **old = GGadgetGetList(list,&len); + AnchorClass *ac; + SplineChar *sc; + AnchorPoint *ap, *ap2; + CharView *cvs; + + if ( (ac = old[sel]->userdata)==NULL ) +return; + + if ( d->anchor_shows[index].restart || d->anchor_shows[index].sc==NULL ) + start = 0; + else + start = d->anchor_shows[index].sc->enc+1; + for ( i=start; isf->charcnt; ++i ) if ( d->sf->chars[i]!=NULL ) { + sc = d->sf->chars[i]; + for ( ap = sc->anchor; ap!=NULL ; ap=ap->next ) { + if ( ap->anchor==ac && + ((index==0 && (ap->type==at_mark || ap->type==at_centry)) || + (index==1 && (ap->type==at_basechar || ap->type==at_baselig || + ap->type==at_basemark || ap->type==at_cexit)))) + break; + } + if ( ap!=NULL ) + break; + } + if ( i==d->sf->charcnt ) { + if ( start==0 ) { + GGadgetSetEnabled(g,false); + GWidgetErrorR(_STR_NoMore,index==0?_STR_NoMarks:_STR_NoBases); + } else { + GGadgetSetTitle(g,GStringGetResource(index==0?_STR_ShowFirstMark:_STR_ShowFirstBase,NULL)); + GWidgetErrorR(_STR_NoMore,index==0?_STR_NoMoreMarks:_STR_NoMoreBases); + } + } else { + cvs = NULL; + if ( d->anchor_shows[index].sc!=NULL ) { + for ( cvs = d->anchor_shows[index].sc->views; + cvs!=NULL && cvs!=d->anchor_shows[index].cv; cvs=cvs->next ); + } + for ( ap2 = sc->anchor; ap2!=NULL ; ap2=ap2->next ) + ap2->selected = false; + ap->selected = true; + d->anchor_shows[index].sc = sc; + d->anchor_shows[index].restart = false; + if ( cvs!=NULL ) + CVChangeSC(cvs,sc); + else + d->anchor_shows[index].cv = CharViewCreate(sc,sc->parent->fv); + if ( start==0 ) + GGadgetSetTitle(g,GStringGetResource(index==0?_STR_ShowNextMark:_STR_ShowNextBase,NULL)); + } +} + +static int GFI_AnchorShowMark(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) + GFI_AnchorShow(g,0); +return( true ); +} + +static int GFI_AnchorShowBase(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) + GFI_AnchorShow(g,1); +return( true ); +} + +int AnchorClassesNextMerge(AnchorClass *ac) { + int max=0; + + while ( ac!=NULL ) { + if ( ac->merge_with>max ) max = ac->merge_with; + ac = ac->next; + } +return( max + 1 ); +} + +static void AnchorClassNameDecompose(AnchorClass *ac,const unichar_t *line) { + unichar_t *end; + + free(ac->name); + ac->feature_tag = (line[0]<<24) | (line[1]<<16) | (line[2]<<8) | line[3]; + line += 5; + if (( line[0]=='r' || line[0]==' ' ) && + ( line[1]=='b' || line[1]==' ' ) && + ( line[2]=='l' || line[2]==' ' ) && + ( line[3]=='m' || line[3]==' ' ) && + line[4]==' ' ) { + ac->flags = 0; + if ( line[0]=='r' ) ac->flags |= pst_r2l; + if ( line[1]=='b' ) ac->flags |= pst_ignorebaseglyphs; + if ( line[2]=='l' ) ac->flags |= pst_ignoreligatures; + if ( line[3]=='m' ) ac->flags |= pst_ignorecombiningmarks; + line += 5; + } + ac->script_lang_index = u_strtol(line,&end,10); + ac->type = u_strtol(end,&end,10); + ac->merge_with = u_strtol(end,&end,10); + while ( *end==' ' ) ++end; + ac->name = u_copy(end); +} + +static void GFI_GetAnchors(struct gfi_data *d) { + GGadget *list = GWidgetGetControl(d->gw,CID_AnchorClasses); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + AnchorClass *klast=NULL, *test; + int i; + SplineFont *sf = d->sf; + + for ( i=0; itext); + if ( sf->anchor==NULL ) + sf->anchor = test; + else + klast->next = test; + klast = test; + } +} + +static unichar_t *GFI_AskNameTag(int title,unichar_t *def,uint32 def_tag, uint16 flags, + int sli, enum possub_type type, struct gfi_data *d, + SplineChar *default_script, int merge_with, int act_type ) { + AnchorClass *oldancs; + unichar_t *newname; + + oldancs = d->sf->anchor; + d->sf->anchor = NULL; + GFI_GetAnchors(d); + + newname = AskNameTag(title,def,def_tag,flags,sli,type,d->sf, + default_script,merge_with,act_type); + AnchorClassesFree(d->sf->anchor); + d->sf->anchor = oldancs; +return( newname ); +} + +static int GFI_AnchorNew(GGadget *g, GEvent *e) { + int len, i; + GTextInfo **old, **new; + GGadget *list; + unichar_t *newname; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + + newname = GFI_AskNameTag(_STR_NewAnchorClass,NULL,CHR('m','a','r','k'),0, + -1, pst_anchors,d,NULL,AnchorClassesNextMerge(d->sf->anchor),act_mark); + + if ( newname!=NULL ) { + list = GWidgetGetControl(GGadgetGetWindow(g),CID_AnchorClasses); + old = GGadgetGetList(list,&len); + for ( i=0; itext+4,newname+4)==0 ) + break; + } + if ( itext,"curs",4)==0 ) + break; + } + if ( itext = u_copy(new[i]->text); + } + new[i] = gcalloc(1,sizeof(GTextInfo)); + new[i]->fg = new[i]->bg = COLOR_DEFAULT; + new[i]->userdata = NULL; + new[i]->text = newname; + new[i+1] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); + } + } +return( true ); +} + +void GListMoveSelected(GGadget *list,int offset) { + int len, i,j; + GTextInfo **old, **new; + + old = GGadgetGetList(list,&len); + new = gcalloc(len+1,sizeof(GTextInfo *)); + j = (offset<0 ) ? 0 : len-1; + for ( i=0; iselected ) { + if ( offset==0x80000000 || offset==0x7fffffff ) + /* Do Nothing */; + else if ( offset<0 ) { + if ( (j= i+offset)<0 ) j=0; + while ( new[j] ) ++j; + } else { + if ( (j= i+offset)>=len ) j=len-1; + while ( new[j] ) --j; + } + new[j] = galloc(sizeof(GTextInfo)); + *new[j] = *old[i]; + new[j]->text = u_copy(new[j]->text); + if ( offset<0 ) ++j; else --j; + } + for ( i=j=0; iselected ) { + while ( new[j] ) ++j; + new[j] = galloc(sizeof(GTextInfo)); + *new[j] = *old[i]; + new[j]->text = u_copy(new[j]->text); + ++j; + } + new[len] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); +} + +void GListDelSelected(GGadget *list) { + int len, i,j; + GTextInfo **old, **new; + + old = GGadgetGetList(list,&len); + new = gcalloc(len+1,sizeof(GTextInfo *)); + for ( i=j=0; iselected ) { + new[j] = galloc(sizeof(GTextInfo)); + *new[j] = *old[i]; + new[j]->text = u_copy(new[j]->text); + ++j; + } + new[j] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); +} + +void GListChangeLine(GGadget *list,int pos, const unichar_t *line) { + GTextInfo **old, **new; + int32 i,len; + + old = GGadgetGetList(list,&len); + new = gcalloc(len+1,sizeof(GTextInfo *)); + for ( i=0; itext = u_copy(new[i]->text); + else + new[i]->text = u_copy(line); + } + new[i] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); +} + +GTextInfo *GListAppendLine(GGadget *list,const unichar_t *line,int select) { + GTextInfo **old, **new; + int32 i,len; + + old = GGadgetGetList(list,&len); + new = gcalloc(len+2,sizeof(GTextInfo *)); + for ( i=0; itext = u_copy(new[i]->text); + if ( select ) new[i]->selected = false; + } + new[i] = gcalloc(1,sizeof(GTextInfo)); + new[i]->fg = new[i]->bg = COLOR_DEFAULT; + new[i]->userdata = NULL; + new[i]->text = u_copy(line); + new[i]->selected = select; + new[i+1] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); +return( new[i]); +} + +static int GFI_AnchorDel(GGadget *g, GEvent *e) { + GGadget *list; + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + list = GWidgetGetControl(GGadgetGetWindow(g),CID_AnchorClasses); + GListDelSelected(list); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_AnchorDel),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_AnchorRename),false); + } +return( true ); +} + +static int GFI_AnchorRename(GGadget *g, GEvent *e) { + int len, i; + GTextInfo **old, **new, *ti; + GGadget *list; + unichar_t *newname; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + list = GWidgetGetControl(GGadgetGetWindow(g),CID_AnchorClasses); + if ( (ti = GGadgetGetListItemSelected(list))==NULL ) +return( true ); + newname = GFI_AskNameTag(_STR_EditAnchorClass,ti->text,0,0,0,pst_anchors, + d,NULL,0,0); + if ( newname!=NULL ) { + old = GGadgetGetList(list,&len); + if (( uc_strncmp(newname,"curs",4)==0 && uc_strncmp(ti->text,"curs",4)!=0 ) || + ( uc_strncmp(newname,"curs",4)!=0 && uc_strncmp(ti->text,"curs",4)==0 )) { + GWidgetErrorR(_STR_CantChange,_STR_CantChangeCurs); + free(newname); +return( false ); + } + for ( i=0; itext,newname)==0 ) + break; + } + if ( i==len ) { + for ( i=0; itext+4,newname+4)==0 ) + break; + } + if ( iselected && newname!=NULL ) { + new[i]->text = newname; + newname = NULL; + } else + new[i]->text = u_copy(new[i]->text); + } + new[i] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); + } + } +return( true ); +} + +static int GFI_AnchorSelChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int sel = GGadgetGetFirstListSelectedItem(g), len; + GTextInfo **old = GGadgetGetList(g,&len); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_AnchorDel),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_AnchorRename),sel!=-1); + d->anchor_shows[0].restart = true; + d->anchor_shows[1].restart = true; + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_ShowMark), + GStringGetResource(_STR_ShowFirstMark,NULL)); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_ShowBase), + GStringGetResource(_STR_ShowFirstBase,NULL)); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ShowMark),sel!=-1 && old[sel]->userdata!=NULL); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ShowBase),sel!=-1 && old[sel]->userdata!=NULL); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + e->u.control.subtype = et_buttonactivate; + GFI_AnchorRename(g,e); + } +return( true ); +} + +static GTextInfo *FPSTList(SplineFont *sf,enum possub_type type) { + int len; + FPST *fpst; + GTextInfo *ti; + static const unichar_t nullstr[] = { 0 }; + + for ( len=0, fpst = sf->possub; fpst!=NULL; fpst=fpst->next ) + if ( fpst->type == type ) + ++len; + ti = gcalloc(len+1,sizeof(GTextInfo)); + for ( len=0, fpst = sf->possub; fpst!=NULL; fpst=fpst->next ) if ( fpst->type==type ) { + ti[len].text = ClassName(nullstr,fpst->tag,fpst->flags, + fpst->script_lang_index, -1, -1,false); + ti[len].fg = ti[len].bg = COLOR_DEFAULT; + ti[len++].userdata = fpst; + } +return( ti ); +} + +void GFI_CCDEnd(struct gfi_data *d) { + int i; + + d->ccd = NULL; + for ( i=0; igw,CID_ContextClasses+i*100); + int sel = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextDel+i*100),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEdit+i*100),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEditData+i*100),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextNew+i*100),true); + } +} + +void GFI_FinishContextNew(struct gfi_data *d,FPST *fpst, unichar_t *newname, + int success) { + int off; + GGadget *list; + + if ( success ) { + off = fpst->type == pst_contextpos ? 000 : + fpst->type == pst_contextsub ? 100 : + fpst->type == pst_chainpos ? 200 : + fpst->type == pst_chainsub ? 300 : 400; + list = GWidgetGetControl(d->gw,CID_ContextClasses+off); + GListAppendLine(list,newname,false)->userdata = fpst; + } else { + chunkfree(fpst,sizeof(FPST)); + } + free(newname); +} + +static int GFI_ContextNew(GGadget *g, GEvent *e) { + int i; + unichar_t *newname; + FPST *fpst; + static int titles[] = { _STR_NewContextPos, _STR_NewContextSub, + _STR_NewChainPos, _STR_NewChainSub, + _STR_NewReverseChainSub, + 0 }; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (GGadgetGetCid(g)-CID_ContextNew)/100; + + if ( d->ccd ) +return( true ); + + newname = GFI_AskNameTag(titles[which],NULL,0,0, + -1, pst_contextpos+which,d,NULL,-2,-1); + + if ( newname!=NULL ) { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = pst_contextpos + which; + fpst->format = fpst->type==pst_reversesub ? pst_reversecoverage : pst_coverage; + DecomposeClassName(newname,NULL,&fpst->tag,NULL,&fpst->flags, + &fpst->script_lang_index,NULL,NULL); + if ( (d->ccd = ContextChainEdit(d->sf,fpst,d,newname))!=NULL ) { + for ( i=0; igw,CID_ContextDel+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEdit+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEditData+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextNew+i*100),false); + } + } + } + } +return( true ); +} + +static int GFI_ContextDel(GGadget *g, GEvent *e) { + GGadget *list; + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + int off = GGadgetGetCid(g)-CID_ContextDel; + list = GWidgetGetControl(GGadgetGetWindow(g),CID_ContextClasses+off); + GListDelSelected(list); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_ContextDel+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_ContextEdit+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_ContextEditData+off),false); + } +return( true ); +} + +static int GFI_ContextEdit(GGadget *g, GEvent *e) { + int len, i; + GTextInfo **old, **new, *ti; + GGadget *list; + unichar_t *newname; + FPST *fpst; + static int titles[] = { _STR_EditContextPos, _STR_EditContextSub, + _STR_EditChainPos, _STR_EditChainSub, + _STR_EditReverseChainSub, + 0 }; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (GGadgetGetCid(g)-CID_ContextEdit)/100; + list = GWidgetGetControl(GGadgetGetWindow(g),CID_ContextClasses+which*100); + if ( (ti = GGadgetGetListItemSelected(list))==NULL ) +return( true ); + fpst = (FPST *) (ti->userdata); + newname = GFI_AskNameTag(titles[which],ti->text,0,0,0, + pst_contextpos+which, d,NULL,-2,-1); + if ( newname!=NULL ) { + DecomposeClassName(newname,NULL,&fpst->tag,NULL,&fpst->flags, + &fpst->script_lang_index,NULL,NULL); + new = gcalloc(len+1,sizeof(GTextInfo *)); + for ( i=0; iselected && newname!=NULL ) { + new[i]->text = newname; + newname = NULL; + } else + new[i]->text = u_copy(new[i]->text); + } + new[i] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); + } + } +return( true ); +} + +static int GFI_ContextEditData(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + GGadget *list = GWidgetGetControl(d->gw,GGadgetGetCid(g)-CID_ContextEditData+CID_ContextClasses); + int sel = GGadgetGetFirstListSelectedItem(list), len; + GTextInfo **old = GGadgetGetList(list,&len); + int i; + if ( d->ccd ) +return( true ); + if ( (d->ccd = ContextChainEdit(d->sf,(FPST *) (old[sel]->userdata),d,NULL))!=NULL ) { + for ( i=0; igw,CID_ContextDel+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEdit+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEditData+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextNew+i*100),false); + } + } + } +return( true ); +} + +static int GFI_ContextSelChanged(GGadget *g, GEvent *e) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int sel = GGadgetGetFirstListSelectedItem(g), len; + int off = GGadgetGetCid(g)-CID_ContextClasses; + GTextInfo **old = GGadgetGetList(g,&len); + + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextDel+off),sel!=-1 && d->ccd==NULL); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEdit+off),sel!=-1 && d->ccd==NULL); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_ContextEditData+off), + d->ccd==NULL && sel!=-1 && + old[sel]->userdata!=NULL && + (((FPST *) (old[sel]->userdata))->format==pst_glyphs || + ((FPST *) (old[sel]->userdata))->format==pst_coverage || + ((FPST *) (old[sel]->userdata))->format==pst_reversecoverage)); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + e->u.control.subtype = et_buttonactivate; + g = GWidgetGetControl(GGadgetGetWindow(g),GGadgetGetCid(g)-CID_ContextClasses+CID_ContextEditData); + GFI_ContextEditData(g,e); + } +return( true ); +} + +static unichar_t *FeatSetName(SplineFont *sf, int feat, int set) { + char buf[32]; + unichar_t *temp, *full; + + sprintf( buf, "<%d,%d> ", feat, set ); + temp = PickNameFromMacName(FindMacSettingName(sf,feat,set)); + if ( temp==NULL ) + full = uc_copy(buf); + else { + full = galloc((strlen(buf)+u_strlen(temp)+1)*sizeof(unichar_t)); + uc_strcpy(full,buf); + u_strcat(full,temp); + free(temp); + } +return( full ); +} + +static GTextInfo *SMList(SplineFont *sf,enum asm_type type) { + int len; + ASM *sm; + GTextInfo *ti; + + for ( len=0, sm = sf->sm; sm!=NULL; sm=sm->next ) + if ( sm->type == type ) + ++len; + ti = gcalloc(len+1,sizeof(GTextInfo)); + for ( len=0, sm = sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type==type ) { + if ( type==asm_kern ) + ti[len].text = u_copy(GStringGetResource(_STR_Kerning,NULL)); + else + ti[len].text = FeatSetName(sf,sm->feature,sm->setting); + ti[len].fg = ti[len].bg = COLOR_DEFAULT; + ti[len++].userdata = sm; + } +return( ti ); +} + +void GFI_SMDEnd(struct gfi_data *d) { + int i; + + d->smd = NULL; + for ( i=0; i<3; ++i ) { + GGadget *list = GWidgetGetControl(d->gw,CID_SMList+i*100); + int sel = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMDel+i*100),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMEdit+i*100),sel!=-1); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMNew+i*100),true); + } +} + +void GFI_FinishSMNew(struct gfi_data *d,ASM *sm, int success, int isnew) { + int off; + GGadget *list; + unichar_t *name; + + if ( success ) { + off = sm->type == asm_indic ? 000 : + sm->type == asm_context ? 100 : + sm->type == asm_insert ? 200 : 300; + list = GWidgetGetControl(d->gw,CID_SMList+off); + if ( sm->type!=asm_kern ) + name = FeatSetName(d->sf,sm->feature,sm->setting); + else + name = u_copy(GStringGetResource(_STR_Kerning,NULL)); + if ( isnew ) + GListAppendLine(list,name,false)->userdata = sm; + else + GListChangeLine(list,GGadgetGetFirstListSelectedItem(list),name); + } else if ( isnew ) { + chunkfree(sm,sizeof(ASM)); + } +} + +static int GFI_SMNew(GGadget *g, GEvent *e) { + int i; + ASM *sm; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (GGadgetGetCid(g)-CID_SMNew)/100; + + if ( d->smd ) +return( true ); + + sm = chunkalloc(sizeof(ASM)); + sm->type = which==0 ? asm_indic : which==1 ? asm_context : which==2 ? asm_insert : asm_kern; + if ( (d->smd = StateMachineEdit(d->sf,sm,d))!=NULL ) { + for ( i=0; i<3; ++i ) { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMDel+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMEdit+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMNew+i*100),false); + } + } + } +return( true ); +} + +static int GFI_SMDel(GGadget *g, GEvent *e) { + GGadget *list; + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + int off = GGadgetGetCid(g)-CID_SMDel; + list = GWidgetGetControl(GGadgetGetWindow(g),CID_SMList+off); + GListDelSelected(list); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_SMDel+off),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_SMEdit+off),false); + } +return( true ); +} + +static int GFI_SMEdit(GGadget *g, GEvent *e) { + int i; + GTextInfo *ti; + GGadget *list; + ASM *sm; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (GGadgetGetCid(g)-CID_SMEdit)/100; + list = GWidgetGetControl(GGadgetGetWindow(g),CID_SMList+which*100); + if ( (ti = GGadgetGetListItemSelected(list))==NULL ) +return( true ); + if ( d->smd!=NULL ) +return( true ); + sm = (ASM *) (ti->userdata); + if ( (d->smd = StateMachineEdit(d->sf,sm,d))!=NULL ) { + for ( i=0; i<3; ++i ) { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMDel+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMEdit+i*100),false); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMNew+i*100),false); + } + } + } +return( true ); +} + +static int GFI_SMSelChanged(GGadget *g, GEvent *e) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int sel = GGadgetGetFirstListSelectedItem(g); + int off = GGadgetGetCid(g)-CID_SMList; + + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMDel+off),sel!=-1 && d->ccd==NULL); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_SMEdit+off),sel!=-1 && d->ccd==NULL); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + e->u.control.subtype = et_buttonactivate; + g = GWidgetGetControl(GGadgetGetWindow(g),GGadgetGetCid(g)-CID_SMList+CID_SMEdit); + GFI_SMEdit(g,e); + } +return( true ); +} + +static int GFI_SMConvert(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + ASM *sm = SMConvertDlg(d->sf); + GGadget *list = GWidgetGetControl(d->gw,CID_SMList+100); + while ( sm!=NULL ) { + GListAppendLine(list,FeatSetName(d->sf,sm->feature,sm->setting),false)->userdata = sm; + sm = sm->next; + } + } +return( true ); +} + +static int GFI_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + GFI_CancelClose(d); + } +return( true ); +} + +static int AskTooFew() { + static int buts[] = { _STR_OK, _STR_Cancel, 0 }; +return( GWidgetAskR(_STR_Toofew,buts,0,1,_STR_Reducing) ); +} + +static int AskLoseUndoes() { + static int buts[] = { _STR_OK, _STR_Cancel, 0 }; +return( GWidgetAskR(_STR_LosingUndoes,buts,0,1,_STR_ChangingOrderLosesUndoes) ); +} + +static void BadFamily() { + GWidgetErrorR(_STR_Badfamily,_STR_Badfamilyn); +} + +static char *modifierlist[] = { "Ital", "Obli", "Kursive", "Cursive", "Slanted", + "Expa", "Cond", NULL }; +static char *modifierlistfull[] = { "Italic", "Oblique", "Kursive", "Cursive", "Slanted", + "Expanded", "Condensed", NULL }; +static char **mods[] = { knownweights, modifierlist, NULL }; +static char **fullmods[] = { realweights, modifierlistfull, NULL }; + +static char *_GetModifiers(char *fontname, char *familyname,char *weight) { + char *pt, *fpt; + int i, j; + + /* URW fontnames don't match the familyname */ + /* "NimbusSanL-Regu" vs "Nimbus Sans L" (note "San" vs "Sans") */ + /* so look for a '-' if there is one and use that as the break point... */ + + if ( (fpt=strchr(fontname,'-'))!=NULL ) { + ++fpt; + if ( *fpt=='\0' ) + fpt = NULL; + } else if ( familyname!=NULL ) { + for ( pt = fontname, fpt=familyname; *fpt!='\0' && *pt!='\0'; ) { + if ( *fpt == *pt ) { + ++fpt; ++pt; + } else if ( *fpt==' ' ) + ++fpt; + else if ( *pt==' ' ) + ++pt; + else if ( *fpt=='a' || *fpt=='e' || *fpt=='i' || *fpt=='o' || *fpt=='u' ) + ++fpt; /* allow vowels to be omitted from family when in fontname */ + else + break; + } + if ( *fpt=='\0' && *pt!='\0' ) + fpt = pt; + else + fpt = NULL; + } + + if ( fpt == NULL ) { + for ( i=0; mods[i]!=NULL; ++i ) for ( j=0; mods[i][j]!=NULL; ++j ) { + pt = strstr(fontname,mods[i][j]); + if ( pt!=NULL && (fpt==NULL || ptfontname,sf->familyname,sf->weight)); +} + +static unichar_t *uGetModifiers(unichar_t *fontname, unichar_t *familyname, + unichar_t *weight) { + unichar_t *ret; + + ret = u_copy( _uGetModifiers(fontname,familyname,weight)); + free( fontname ); +return( ret ); +} + +void SFSetFontName(SplineFont *sf, char *family, char *mods,char *full) { + char *n; + unichar_t *temp; char *pt, *tpt; + int i; + + n = galloc(strlen(family)+strlen(mods)+2); + strcpy(n,family); strcat(n," "); strcat(n,mods); + if ( full==NULL || *full == '\0' ) + full = copy(n); + for ( pt=tpt=n; *pt; ) { + if ( !isspace(*pt)) + *tpt++ = *pt++; + else + ++pt; + } + *tpt = '\0'; +#if 0 + for ( pt=tpt=family; *pt; ) { + if ( !isspace(*pt)) + *tpt++ = *pt++; + else + ++pt; + } + *tpt = '\0'; +#endif + + free(sf->fullname); sf->fullname = copy(full); + + /* In the URW world fontnames aren't just a simple concatenation of */ + /* family name and modifiers, so neither the family name nor the modifiers */ + /* changed, then don't change the font name */ + if ( strcmp(family,sf->familyname)==0 && strcmp(n,sf->fontname)==0 ) + /* Don't change the fontname */; + /* or anything else */ + else { + free(sf->fontname); sf->fontname = n; + free(sf->familyname); sf->familyname = copy(family); + free(sf->weight); sf->weight = NULL; + if ( strstrmatch(mods,"extralight")!=NULL || strstrmatch(mods,"extra-light")!=NULL ) + sf->weight = copy("ExtraLight"); + else if ( strstrmatch(mods,"demilight")!=NULL || strstrmatch(mods,"demi-light")!=NULL ) + sf->weight = copy("DemiLight"); + else if ( strstrmatch(mods,"demibold")!=NULL || strstrmatch(mods,"demi-bold")!=NULL ) + sf->weight = copy("DemiBold"); + else if ( strstrmatch(mods,"semibold")!=NULL || strstrmatch(mods,"semi-bold")!=NULL ) + sf->weight = copy("SemiBold"); + else if ( strstrmatch(mods,"demiblack")!=NULL || strstrmatch(mods,"demi-black")!=NULL ) + sf->weight = copy("DemiBlack"); + else if ( strstrmatch(mods,"extrabold")!=NULL || strstrmatch(mods,"extra-bold")!=NULL ) + sf->weight = copy("ExtraBold"); + else if ( strstrmatch(mods,"extrablack")!=NULL || strstrmatch(mods,"extra-black")!=NULL ) + sf->weight = copy("ExtraBlack"); + else if ( strstrmatch(mods,"book")!=NULL ) + sf->weight = copy("Book"); + else if ( strstrmatch(mods,"regular")!=NULL ) + sf->weight = copy("Regular"); + else if ( strstrmatch(mods,"roman")!=NULL ) + sf->weight = copy("Roman"); + else if ( strstrmatch(mods,"normal")!=NULL ) + sf->weight = copy("Normal"); + else if ( strstrmatch(mods,"demi")!=NULL ) + sf->weight = copy("Demi"); + else if ( strstrmatch(mods,"medium")!=NULL ) + sf->weight = copy("Medium"); + else if ( strstrmatch(mods,"bold")!=NULL ) + sf->weight = copy("Bold"); + else if ( strstrmatch(mods,"heavy")!=NULL ) + sf->weight = copy("Heavy"); + else if ( strstrmatch(mods,"black")!=NULL ) + sf->weight = copy("Black"); + else if ( strstrmatch(mods,"Nord")!=NULL ) + sf->weight = copy("Nord"); +/* Sigh. URW uses 4 letter abreviations... */ + else if ( strstrmatch(mods,"Regu")!=NULL ) + sf->weight = copy("Regular"); + else if ( strstrmatch(mods,"Medi")!=NULL ) + sf->weight = copy("Medium"); + else if ( strstrmatch(mods,"blac")!=NULL ) + sf->weight = copy("Black"); + else + sf->weight = copy("Medium"); + } + + if ( sf->fv!=NULL && sf->fv->gw!=NULL ) { + GDrawSetWindowTitles(sf->fv->gw,temp = uc_copy(sf->fontname),NULL); + free(temp); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->views!=NULL ) { + char buffer[300]; unichar_t ubuf[300]; CharView *cv; + sprintf( buffer, "%.90s from %.90s", sf->chars[i]->name, sf->fontname ); + uc_strcpy(ubuf,buffer); + for ( cv = sf->chars[i]->views; cv!=NULL; cv=cv->next ) + GDrawSetWindowTitles(cv->gw,ubuf,NULL); + } + } +} + +static int SetFontName(GWindow gw, SplineFont *sf) { + const unichar_t *ufamily = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Family)); + const unichar_t *ufont = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Fontname)); + const unichar_t *uweight = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Weight)); + const unichar_t *uhum = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Human)); + int diff = uc_strcmp(ufont,sf->fontname)!=0; + + free(sf->familyname); + free(sf->fontname); + free(sf->weight); + free(sf->fullname); + sf->familyname = cu_copy(ufamily); + sf->fontname = cu_copy(ufont); + sf->weight = cu_copy(uweight); + sf->fullname = cu_copy(uhum); +return( diff ); +} + +static int CheckNames(struct gfi_data *d) { + const unichar_t *ufamily = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Family)); + const unichar_t *ufont = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Fontname)); + unichar_t *end; + + if ( *ufamily=='\0' ) { + GWidgetErrorR(_STR_FamilyNameRequired,_STR_FamilyNameRequired); +return( false ); + } + /* A postscript name cannot be a number. There are two ways it can be a */ + /* number, it can be a real (which we can check for with strtod) or */ + /* it can be a "radix number" which is '#'. I'll only */ + /* do a cursory test for that */ + u_strtod(ufamily,&end); + if ( *end=='\0' || (isdigit(ufamily[0]) && u_strchr(ufamily,'#')!=NULL) ) { + GWidgetErrorR(_STR_BadFamilyName,_STR_PSNameNotNumber); +return( false ); + } + while ( *ufamily ) { + if ( *ufamily<' ' || *ufamily>=0x7f ) { + GWidgetErrorR(_STR_BadFamilyName,_STR_BadPSName); +return( false ); + } + ++ufamily; + } + + u_strtod(ufont,&end); + if ( (*end=='\0' || (isdigit(ufont[0]) && u_strchr(ufont,'#')!=NULL)) && + *ufont!='\0' ) { + GWidgetErrorR(_STR_BadFontName,_STR_PSNameNotNumber); +return( false ); + } + while ( *ufont ) { + if ( *ufont<=' ' || *ufont>=0x7f || + *ufont=='(' || *ufont=='[' || *ufont=='{' || *ufont=='<' || + *ufont==')' || *ufont==']' || *ufont=='}' || *ufont=='>' || + *ufont=='%' || *ufont=='/' ) { + GWidgetErrorR(_STR_BadFontName,_STR_BadPSName); +return( false ); + } + ++ufont; + } + if ( u_strlen(ufont)>63 ) { + GWidgetErrorR(_STR_BadFontName,_STR_BadPSName); +return( false ); + } +return( true ); +} + +static int stylematch(const unichar_t *pt, const unichar_t **end) { + int i; + struct langstyle *test; + + for ( i=0; stylelist[i]!=NULL; ++i ) { + for ( test = stylelist[i]; test->lang==0x409; ++test ) + if ( u_strnmatch(pt,test->str,u_strlen(test->str))==0 ) { + *end = pt + u_strlen(test->str); +return( i ); + } + } +return( -1 ); +} + +static void DoDefaultStyles(struct gfi_data *d) { + const unichar_t *styles = _GGadgetGetTitle(GWidgetGetControl(d->gw, CID_String)); + const unichar_t *pt, *end; + int trans[10], i=0, langs[30], j,k,l, match; + struct langstyle *test; + struct ttflangname *ln, *prev; + + if ( *styles=='\0' ) styles = regulareng; + for ( pt=styles; *pt!='\0' ; ) { + if ( (match=stylematch(pt,&end))==-1 ) + ++pt; + else { + if ( ilang!=0; ++test ) { + if ( test->lang!=0x409 && jlang; + } + for ( k=1; klang!=0; ++test ) { + if ( test->lang==langs[l] ) + break; + } + if ( test->lang==0 ) { + /* No translation for this style, so give up on this lang */ + --j; + for ( ; lnames; ln!=NULL && ln->lang!=langs[l]; prev = ln, ln = ln->next ); + if ( ln==NULL ) { + ln = gcalloc(1,sizeof(struct ttflangname)); + ln->lang = langs[l]; + if ( prev==NULL ) { ln->next = d->names; d->names = ln; } + else { ln->next = prev->next; prev->next = ln; } + } + if ( ln->names[ttf_subfamily]==NULL ) { + unichar_t *res = NULL; + int len; + while ( 1 ) { + len = 0; + for ( k=0; klang!=0 && test->lang!=langs[l]; ++test ); + if ( test->str!=NULL ) { + if ( res!=NULL ) + u_strcpy(res+len,test->str); + len += u_strlen(test->str); + } + } + if ( res!=NULL ) + break; + res = galloc((len+1)*sizeof(unichar_t)); + } + ln->names[ttf_subfamily] = res; + } + } +} + +static void TNNotePresence(struct gfi_data *d, int strid) { + GGadget *list = GWidgetGetControl(d->gw,CID_Language); + int i,len, lang; + GTextInfo **ti = GGadgetGetList(list,&len); + struct ttflangname *cur; + Color fore = GDrawGetDefaultForeground(NULL); + + for ( i=0; iuserdata; + for ( cur=d->names; cur!=NULL && cur->lang!=lang; cur=cur->next ); + if ( strid==-1 ) + ti[i]->fg = cur==NULL ? fore : COLOR_CREATE(0,0x80,0); + else { + ti[i]->fg = cur==NULL || cur->names[strid]==NULL ? fore : COLOR_CREATE(0,0x80,0); + if ( lang==0x409 && d->def.names[strid]!=NULL ) + ti[i]->fg = COLOR_CREATE(0,0x80,0); + } + } +} + +struct ttflangname *TTFLangNamesCopy(struct ttflangname *old) { + struct ttflangname *base=NULL, *last, *cur; + int i; + + while ( old!=NULL ) { + cur = gcalloc(1,sizeof(struct ttflangname)); + cur->lang = old->lang; + for ( i=0; inames[i] = u_copy(old->names[i]); + if ( base ) + last->next = cur; + else + base = cur; + last = cur; + old = old->next; + } +return( base ); +} + +void TTF_PSDupsDefault(SplineFont *sf) { + struct ttflangname *english; + char versionbuf[40]; + + /* Ok, if we've just loaded a ttf file then we've got a bunch of langnames*/ + /* we copied some of them (copyright, family, fullname, etc) into equiv */ + /* postscript entries in the sf. If we then use FontInfo and change the */ + /* obvious postscript entries we are left with the old ttf entries. If */ + /* we generate a ttf file and then load it the old values pop up. */ + /* Solution: Anything we can generate by default should be set to NULL */ + for ( english=sf->names; english!=NULL && english->lang!=0x409; english=english->next ); + if ( english==NULL ) +return; + if ( english->names[ttf_family]!=NULL && + uc_strcmp(english->names[ttf_family],sf->familyname)==0 ) { + free(english->names[ttf_family]); + english->names[ttf_family]=NULL; + } + if ( english->names[ttf_copyright]!=NULL && + uc_strcmp(english->names[ttf_copyright],sf->copyright)==0 ) { + free(english->names[ttf_copyright]); + english->names[ttf_copyright]=NULL; + } + if ( english->names[ttf_fullname]!=NULL && + uc_strcmp(english->names[ttf_fullname],sf->fullname)==0 ) { + free(english->names[ttf_fullname]); + english->names[ttf_fullname]=NULL; + } + if ( sf->subfontcnt!=0 || sf->version!=NULL ) { + if ( sf->subfontcnt!=0 ) + sprintf( versionbuf, "Version %f", sf->cidversion ); + else + sprintf(versionbuf,"Version %.20s ", sf->version); + if ( english->names[ttf_version]!=NULL && + uc_strcmp(english->names[ttf_version],versionbuf)==0 ) { + free(english->names[ttf_version]); + english->names[ttf_version]=NULL; + } + } + if ( english->names[ttf_subfamily]!=NULL && + uc_strcmp(english->names[ttf_subfamily],SFGetModifiers(sf))==0 ) { + free(english->names[ttf_subfamily]); + english->names[ttf_subfamily]=NULL; + } + + /* User should not be allowed any access to this one, not ever */ + free(english->names[ttf_postscriptname]); + english->names[ttf_postscriptname]=NULL; +} + +static unichar_t versionformatspec[] = { 'V','e','r','s','i','o','n',' ','%','.','2','0','s',' ', '\0' }; + +static void TTF_PSDupsChanged(GWindow gw,SplineFont *sf,struct ttflangname *newnames) { + struct ttflangname *english, *sfenglish; + const unichar_t *txt, *txt1; +#define offsetfrom(type,name) (((char *) &(((type *) NULL)->name)) - (char *) NULL) + static struct dupttfps { int ttf, cid, sid, off; } dups[] = + {{ ttf_copyright, CID_Notice, _STR_Copyright, offsetfrom(SplineFont,copyright) }, + { ttf_family, CID_Family, _STR_Family, offsetfrom(SplineFont,familyname) }, + { ttf_fullname, CID_Human, _STR_Fullname, offsetfrom(SplineFont,fullname) }, + { ttf_version, CID_Version, _STR_Version, offsetfrom(SplineFont,version) }, + { ttf_subfamily, CID_Fontname, _STR_Styles, offsetfrom(SplineFont,fontname) }, + { -1 }}; +#undef offsetfrom + int changeall = -1, i; + unichar_t versionbuf[40]; + + for ( english=newnames; english!=NULL && english->lang!=0x409; english=english->next ); + if ( english==NULL ) +return; + for ( sfenglish=sf->names; sfenglish!=NULL && sfenglish->lang!=0x409; sfenglish=sfenglish->next ); + for ( i=0; dups[i].ttf!=-1; ++i ) { + txt=txt1=_GGadgetGetTitle(GWidgetGetControl(gw,dups[i].cid)); + if ( dups[i].cid==CID_Fontname ) + txt1 = _uGetModifiers(txt,_GGadgetGetTitle(GWidgetGetControl(gw,CID_Family)), + _GGadgetGetTitle(GWidgetGetControl(gw,CID_Weight))); + else if ( dups[i].cid==CID_Version ) { + u_sprintf(versionbuf,versionformatspec,txt); + txt1 = versionbuf; + if ( english->names[dups[i].ttf]!=NULL && + u_strcmp(txt1,english->names[dups[i].ttf])!=0 ) + versionbuf[u_strlen(versionbuf)-1] = '\0'; /* Trailing space often omitted */ + } + if ( english->names[dups[i].ttf]!=NULL && + uc_strcmp(txt,*(char **) (((char *) sf) + dups[i].off))!=0 && + u_strcmp(txt1,english->names[dups[i].ttf])!=0 ) { + /* If we've got an entry for this guy, and the user changed the ps */ + /* version of the name, and the new ps version doesn't match what */ + /* we've got then.... */ + if ( sfenglish==NULL || sfenglish->names[dups[i].ttf]==NULL ) { + /* User has never set this value, let's set the new value to default */ + free(english->names[dups[i].ttf]); + english->names[dups[i].ttf] = NULL; + } else if ( u_strcmp(sfenglish->names[dups[i].ttf],english->names[dups[i].ttf])!=0 ) { + /* User has explicitly changed this from what it was, so presumably */ + /* s/he knows what s/he is doing */ + } else { + int ans=-1; + if ( changeall==-1 ) { + static int buts[] = { _STR_Change, _STR_ChangeAll, _STR_RetainAll, _STR_Retain, 0 }; + ans = GWidgetAskR(_STR_Mismatch,buts,0,3,_STR_MismatchLong, + GStringGetResource(dups[i].sid,NULL)); + if ( ans==1 ) changeall=1; + else if ( ans==2 ) changeall=0; + } + if ( changeall==1 || ans==0 ) { + free(english->names[dups[i].ttf]); + english->names[dups[i].ttf] = NULL; + } + } + } + } +} + +static int GFI_DefaultStyles(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + DoDefaultStyles(d); + TNNotePresence(d,ttf_subfamily); + } +return( true ); +} + +static void TNFinishFormer(struct gfi_data *d) { + GGadget *langlist = GWidgetGetControl(d->gw,CID_Language); + int cur_lang = GGadgetGetFirstListSelectedItem(langlist); + int cur_id = GGadgetGetFirstListSelectedItem(GWidgetGetControl(d->gw,CID_StrID)); + struct ttflangname *cur, *prev; + int nothing; + static unichar_t nullstr[1] = { 0 }; + int i; + int32 len; + GTextInfo **langs = GGadgetGetList(langlist,&len); + + if ( d->old_lang!=-1 ) { + int lang = (int) langs[d->old_lang]->userdata; + int id = (int) ttfnameids[d->old_strid].userdata; + const unichar_t *str = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_String)); + + for ( prev=NULL, cur = d->names; cur!=NULL && cur->lang!=lang; prev = cur, cur=cur->next ); + if ( lang==0x409 /* US English, default */ && d->def.names[id]!=NULL && + u_strcmp(str,d->def.names[id])==0 ) { + if ( cur != NULL ) { + free(cur->names[id]); + cur->names[id] = NULL; + } + goto finishup; /* If it's the default value then ignore it */ + } + + nothing = false; + if ( *str=='\0' && cur!=NULL ) { + nothing = true; + for ( i=0; inames[i]!=NULL && i!=id ) nothing = false; + } + if ( cur==NULL && *str=='\0' ) + goto finishup; + else if ( cur==NULL ) { + cur = gcalloc(1,sizeof(struct ttflangname)); + if ( prev==NULL ) + d->names = cur; + else + prev->next = cur; + cur->lang = lang; + } + + if ( nothing ) { + if ( prev==NULL ) + d->names = cur->next; + else + prev->next = cur->next; + cur->next = NULL; + TTFLangNamesFree(cur); + } else { + if ( *str=='\0' ) { + free(cur->names[id]); + cur->names[id] = NULL; + } else if ( cur->names[id]==NULL || u_strcmp(cur->names[id],str)!=0 ) { + free(cur->names[id]); + cur->names[id] = u_copy(str); + } + } + } + finishup: + d->old_lang = cur_lang; + d->old_strid = cur_id; + + cur_id =(int) ttfnameids[cur_id].userdata; + cur_lang = (int) langs[cur_lang]->userdata; + TNNotePresence(d,cur_id); + for ( prev=NULL, cur = d->names; cur!=NULL && cur->lang!=cur_lang; cur=cur->next ); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_String), + cur!=NULL && cur->names[cur_id]!=NULL?cur->names[cur_id]: + cur_lang == 0x409 && d->def.names[cur_id]!=NULL?d->def.names[cur_id]: + nullstr ); + GGadgetSetVisible(GWidgetGetControl(d->gw,CID_TNDef),cur_id==ttf_subfamily && cur_lang==0x409); +} + +static int GFI_LanguageChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + TNFinishFormer(d); + } +return( true ); +} + +static int LangSearch(GTextInfo **langs,const char *lang,int langlen) { + int i,reslen, found=-1, samelang=-1; + const unichar_t *res; + + for ( i=0; langs[i]->text!=NULL; ++i ) { + res = langs[i]->text; + if ( res==NULL ) + continue; + reslen = u_strlen(res); + if ( langlen==2 ) { + if ( uc_strcmp(res+reslen-2,lang)==0 || uc_strncmp(res+reslen-5,lang,2)==0 ) { + found = i; + break; + } + } else { + if ( uc_strncmp(res+reslen-5,lang,5)==0 ) { + found = i; + break; + /* Use the first locale of the language. It usually specifies the standard */ + } else if ( samelang==-1 && ( uc_strncmp(res+reslen-5,lang,2)==0 || uc_strncmp(res+reslen-2,lang,2)==0 )) + samelang = i; + } + } + if ( found==-1 ) found = samelang; +return( found ); +} + +static void DefaultLanguage(struct gfi_data *d) { + const char *lang=NULL; + int i, found=-1, langlen; + static char *envs[] = { "LC_ALL", "LC_MESSAGES", "LANG", NULL }; + GGadget *g = GWidgetGetControl(d->gw,CID_Language); + unichar_t versionbuf[40]; + int32 len; + GTextInfo **langs = GGadgetGetList(g,&len); + + for ( i=0; envs[i]!=NULL && lang==NULL; ++i ) + lang = getenv(envs[i]); + if ( lang==NULL ) lang = "en_US"; + langlen = strlen(lang); + found = LangSearch(langs,lang,langlen); + if ( langlen==2 ) { + char buffer[6]; + int test; + /* Guess that the default locale has the same two letter code as language */ + sprintf( buffer, "%s_%c%c", lang, toupper(lang[0]), toupper(lang[1])); + test = LangSearch(langs,buffer,5); + if ( test!=-1 ) + found = test; + } + if ( found==-1 ) found = 0; + GGadgetSelectOneListItem(g,found); + + d->old_lang = -1; + d->names_set = true; + d->names = TTFLangNamesCopy(d->sf->names); + d->def.names[ttf_copyright] = GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Notice)); + d->def.names[ttf_family] = GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Family)); + d->def.names[ttf_fullname] = GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Human)); + d->def.names[ttf_subfamily] = uGetModifiers( + GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Fontname)), + d->def.names[ttf_family], + GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Weight))); + u_sprintf(versionbuf,versionformatspec, + _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Version))); + d->def.names[ttf_version] = u_copy(versionbuf); + DefaultTTFEnglishNames(&d->def, d->sf); + TNFinishFormer(d); +} + +static void GFI_ProcessAnchor(struct gfi_data *d) { + GGadget *list = GWidgetGetControl(d->gw,CID_AnchorClasses); + int len; + GTextInfo **old = GGadgetGetList(list,&len); + AnchorClass *keep=NULL, *klast, *test, *prev, *next, *test2; + int i; + + for ( i=0; iuserdata==NULL ) { + test = chunkalloc(sizeof(AnchorClass)); + } else { + prev = NULL; + for ( test = d->sf->anchor; test!=old[i]->userdata; prev=test, test=test->next ); + if ( prev==NULL ) + d->sf->anchor = test->next; + else + prev->next = test->next; + test->next = NULL; + } + AnchorClassNameDecompose(test,old[i]->text); + if ( keep==NULL ) + keep = test; + else + klast->next = test; + klast = test; + } + for ( test = d->sf->anchor; test!=NULL; test = next ) { + next = test->next; + SFRemoveAnchorClass(d->sf,test); + } + d->sf->anchor = keep; + + for ( test=d->sf->anchor; test!=NULL; test=test->next ) { + prev = test; + for ( test2=test->next; test2!=NULL; test2 = next ) { + next = test2->next; + if ( u_strcmp(test->name,test2->name)==0 ) { + AnchorClassMerge(d->sf,test,test2); + prev->next = next; + chunkfree(test2,sizeof(*test2)); + } else + prev = test2; + } + } +} + +static void BDFsSetAsDs(SplineFont *sf) { + BDFFont *bdf; + real scale; + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + scale = bdf->pixelsize / (real) (sf->ascent+sf->descent); + bdf->ascent = rint(sf->ascent*scale); + bdf->descent = bdf->pixelsize-bdf->ascent; + } +} + +static int texparams[] = { _STR_Slant, _STR_Space, _STR_Stretch, _STR_Shrink, _STR_XHeightC, _STR_Quad, _STR_MathSp, 0 }; +static int texpopups[] = { _STR_SlantPopup, _STR_SpacePopup, _STR_StretchPopup, _STR_ShrinkPopup, _STR_XHeightCPopup, _STR_QuadPopup, _STR_ExtraPopup, 0 }; + +static int ParseTeX(struct gfi_data *d) { + int i, err=false; + double em = (d->sf->ascent+d->sf->descent), val; + + for ( i=0; texparams[i]!=0 ; ++i ) { + val = GetRealR(d->gw,CID_TeX+i,texparams[i],&err); + d->texdata.params[i] = rint( val/em * (1<<20) ); + } + d->texdata.designsize = rint( GetRealR(d->gw,CID_DesignSize,_STR_DesignSize,&err) * (1<<20) ); + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_TeXText)) ) + d->texdata.type = tex_text; + else if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_TeXMath)) ) + d->texdata.type = tex_math; + else + d->texdata.type = tex_mathext; +return( !err ); +} + +static int GFI_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct gfi_data *d = GDrawGetUserData(gw); + SplineFont *sf = d->sf, *_sf; + int enc, interp; + int reformat_fv=0, enc_changed; + int upos, uwid, as, des, nchar, oldcnt=sf->charcnt, err = false, weight=0; + int uniqueid, linegap=0, vlinegap; + int force_enc=0; + real ia, cidversion; + const unichar_t *txt; unichar_t *end; + int i,j, mcs; + int vmetrics, vorigin, namechange, order2; + int xuidchanged = false; + GTextInfo *pfmfam, *fstype; + int32 len; + GTextInfo **ti; +#ifdef FONTFORGE_CONFIG_TYPE3 + int multilayer = false; +#endif + + if ( !CheckNames(d)) +return( true ); + if ( !PIFinishFormer(d)) +return( true ); + if ( d->names_set ) + TNFinishFormer(d); + if ( d->ccd ) + CCD_Close(d->ccd); + if ( d->smd ) + SMD_Close(d->smd); + + txt = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Family)); + if ( !isalpha(*txt)) { + BadFamily(); +return( true ); + } + txt = _GGadgetGetTitle(GWidgetGetControl(gw,CID_ItalicAngle)); + ia = u_strtod(txt,&end); + if ( *end!='\0' ) { + ProtestR(_STR_Italicangle); +return(true); + } + order2 = GGadgetIsChecked(GWidgetGetControl(gw,CID_IsOrder2)); +#ifdef FONTFORGE_CONFIG_TYPE3 + multilayer = GGadgetIsChecked(GWidgetGetControl(gw,CID_IsMultiLayer)); +#endif + vmetrics = GGadgetIsChecked(GWidgetGetControl(gw,CID_HasVerticalMetrics)); + upos = GetIntR(gw,CID_UPos, _STR_Upos,&err); + uwid = GetIntR(gw,CID_UWidth,_STR_Uheight,&err); + GetIntR(gw,CID_Em,_STR_EmSize,&err); /* just check for errors. redundant info */ + as = GetIntR(gw,CID_Ascent,_STR_Ascent,&err); + des = GetIntR(gw,CID_Descent,_STR_Descent,&err); + nchar = GetIntR(gw,CID_NChars,_STR_Numchars,&err); + uniqueid = GetIntR(gw,CID_UniqueID,_STR_UniqueID,&err); + force_enc = GGadgetIsChecked(GWidgetGetControl(gw,CID_ForceEncoding)); + if ( sf->subfontcnt!=0 ) + cidversion = GetRealR(gw,CID_Version,_STR_Version,&err); + if ( vmetrics ) + vorigin = GetIntR(gw,CID_VOrigin,_STR_VOrigin,&err); + if ( d->ttf_set ) { + /* Only use the normal routine if we get no value, because */ + /* "400 Book" is a reasonable setting, but would cause GetInt */ + /* to complain */ + weight = u_strtol(_GGadgetGetTitle(GWidgetGetControl(gw,CID_WeightClass)),NULL,10); + if ( weight == 0 ) + weight = GetIntR(gw,CID_WeightClass,_STR_WeightClass,&err); + linegap = GetIntR(gw,CID_LineGap,_STR_LineGap,&err); + if ( vmetrics ) + vlinegap = GetIntR(gw,CID_VLineGap,_STR_VLineGap,&err); + } + if ( d->tex_set ) { + if ( !ParseTeX(d)) +return( true ); + } + if ( err ) +return(true); + if ( as+des>16384 || des<0 || as<0 ) { + GWidgetErrorR(_STR_Badascentdescent,_STR_Badascentdescentn); +return( true ); + } + mcs = -1; + if ( !GGadgetIsChecked(GWidgetGetControl(d->gw,CID_MacAutomatic)) ) { + mcs = 0; + ti = GGadgetGetList(GWidgetGetControl(d->gw,CID_MacStyles),&len); + for ( i=0; iselected ) + mcs |= (int) (intpt) ti[i]->userdata; + if ( (mcs&sf_condense) && (mcs&sf_extend)) { + GWidgetErrorR(_STR_BadStyle,_STR_NotBothCondenseExtend); +return( true ); + } + } + if ( ncharcharcnt && AskTooFew()) +return(true); + if ( order2!=sf->order2 && AskLoseUndoes()) +return( true ); + if ( order2!=sf->order2 && !SFCloseAllInstrs(sf)) +return( true ); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( multilayer!=sf->multilayer ) { + sf->multilayer = multilayer; + if ( !multilayer ) + SFSplinesFromLayers(sf); + else + SFReinstanciateRefs(sf); + SFLayerChange(sf); + } +#endif + TTF_PSDupsChanged(gw,sf,d->names_set ? d->names : sf->names); + GDrawSetCursor(gw,ct_watch); + namechange = SetFontName(gw,sf); + txt = _GGadgetGetTitle(GWidgetGetControl(gw,CID_XUID)); + xuidchanged = (sf->xuid==NULL && *txt!='\0') || + (sf->xuid!=NULL && uc_strcmp(txt,sf->xuid)==0); + if ( namechange && sf->filename!=NULL && + ((uniqueid!=0 && uniqueid==sf->uniqueid) || + (sf->xuid!=NULL && uc_strcmp(txt,sf->xuid)==0)) ) { + static int buts[] = { _STR_Change, _STR_Retain, _STR_Cancel, 0 }; + int ans = GWidgetAskR(_STR_UniqueIDTitle,buts,0,2,_STR_UniqueIDChange); + if ( ans==2 ) { + GDrawSetCursor(gw,ct_pointer); +return(true); + } + if ( ans==0 ) { + if ( uniqueid!=0 && uniqueid==sf->uniqueid ) + uniqueid = 4000000 + (rand()&0x3ffff); + if ( sf->xuid!=NULL && uc_strcmp(txt,sf->xuid)==0 ) { + SFRandomChangeXUID(sf); + xuidchanged = true; + } + } + } else { + free(sf->xuid); + sf->xuid = *txt=='\0'?NULL:cu_copy(txt); + } + + txt = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Notice)); + free(sf->copyright); sf->copyright = cu_copy(txt); + txt = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Comment)); + free(sf->comments); sf->comments = cu_copy(*txt?txt:NULL); + if ( sf->subfontcnt!=0 ) + sf->cidversion = cidversion; + else { + txt = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Version)); + free(sf->version); sf->version = cu_copy(txt); + } + if ( as+des != sf->ascent+sf->descent && GGadgetIsChecked(GWidgetGetControl(gw,CID_Scale)) ) { + SFScaleToEm(sf,as,des); + reformat_fv = true; + BDFsSetAsDs(sf); + } else if ( as!=sf->ascent || des!=sf->descent ) { + sf->ascent = as; + sf->descent = des; + BDFsSetAsDs(sf); + reformat_fv = true; + if ( sf->pfminfo.os2_typoascent!=0 ) { + double scale = (as+des)/(double) (sf->ascent+sf->descent); + sf->pfminfo.os2_typoascent = as; + sf->pfminfo.os2_typodescent = -des; + sf->pfminfo.os2_winascent *= scale; + sf->pfminfo.os2_windescent *= scale; + } + } + sf->macstyle = mcs; + sf->italicangle = ia; + sf->upos = upos; + sf->uwidth = uwid; + sf->uniqueid = uniqueid; + sf->texdata = d->texdata; + + GFI_ProcessAnchor(d); + GFI_ProcessContexts(d); + + interp = GGadgetGetFirstListSelectedItem(GWidgetGetControl(gw,CID_Interpretation)); + if ( interp==-1 ) sf->uni_interp = ui_none; + else sf->uni_interp = (intpt) interpretations[interp].userdata; + + enc = GGadgetGetFirstListSelectedItem(GWidgetGetControl(gw,CID_Encoding)); + if ( enc!=-1 ) { + enc = (int) (GGadgetGetListItem(GWidgetGetControl(gw,CID_Encoding),enc)->userdata); + if ( enc==em_unicodeplanes ) + enc += d->uplane; + GDrawSetCursor(gw,ct_watch); + GDrawSetCursor(GGadgetGetWindow(GWidgetGetControl(gw,CID_Encoding)),ct_watch); + GDrawSync(NULL); + if ( force_enc ) + enc_changed = SFForceEncoding(sf,enc); + else + enc_changed = SFReencodeFont(sf,enc); + if ( enc_changed && nchar==oldcnt ) + nchar = sf->charcnt; + if ( enc_changed ) reformat_fv = true; + } + if ( nchar!=sf->charcnt ) + reformat_fv |= SFAddDelChars(sf,nchar); + + if ( sf->hasvmetrics!=vmetrics ) + CVPaletteDeactivate(); /* Force a refresh later */ + _sf = sf->cidmaster?sf->cidmaster:sf; + _sf->hasvmetrics = vmetrics; + for ( j=0; j<_sf->subfontcnt; ++j ) + _sf->subfonts[j]->hasvmetrics = vmetrics; + if ( vmetrics ) { + _sf->vertical_origin = vorigin; + for ( j=0; j<_sf->subfontcnt; ++j ) + _sf->subfonts[j]->vertical_origin = vorigin; + } + + if ( d->private!=NULL ) { + PSDictFree(sf->private); + sf->private = d->private; + d->private = NULL; + } + if ( d->names_set ) { + TTFLangNamesFree(sf->names); + sf->names = d->names; + TTF_PSDupsDefault(sf); + d->names = NULL; + } + if ( d->ttf_set ) { + sf->pfminfo.weight = weight; + sf->pfminfo.width = GGadgetGetFirstListSelectedItem(GWidgetGetControl(gw,CID_WidthClass))+1; + pfmfam = GGadgetGetListItemSelected(GWidgetGetControl(gw,CID_PFMFamily)); + if ( pfmfam!=NULL ) + sf->pfminfo.pfmfamily = (int) (pfmfam->userdata); + else + sf->pfminfo.pfmfamily = 0x11; + fstype = GGadgetGetListItemSelected(GWidgetGetControl(gw,CID_FSType)); + if ( fstype!=NULL ) + sf->pfminfo.fstype = (int) (fstype->userdata); + else + sf->pfminfo.fstype = 0xc; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_NoSubsetting))) + sf->pfminfo.fstype |=0x100; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_OnlyBitmaps))) + sf->pfminfo.fstype |=0x200; + for ( i=0; i<10; ++i ) + sf->pfminfo.panose[i] = (int) (GGadgetGetListItemSelected(GWidgetGetControl(gw,CID_PanFamily+i))->userdata); + sf->pfminfo.linegap = linegap; + if ( vmetrics ) + sf->pfminfo.vlinegap = vlinegap; + sf->pfminfo.pfmset = true; + } + if ( order2!=sf->order2 ) { + if ( order2 ) + SFConvertToOrder2(sf); + else + SFConvertToOrder3(sf); + } + if ( reformat_fv ) + FontViewReformatAll(sf); + sf->changed = true; + sf->changed_since_autosave = true; + sf->changed_since_xuidchanged = !xuidchanged; + /* Just in case they changed the blue values and we are showing blues */ + /* in outline views... */ + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + CharView *cv; + for ( cv = sf->chars[i]->views; cv!=NULL; cv=cv->next ) { + cv->back_img_out_of_date = true; + GDrawRequestExpose(cv->v,NULL,false); + } + } + MacFeatListFree(sf->features); + sf->features = GGadgetGetUserData(GWidgetGetControl(d->gw,CID_Features)); + last_aspect = d->old_aspect; + GFI_Close(d); + } +return( true ); +} + +GTextInfo *EncodingTypesFindEnc(GTextInfo *encodingtypes, int enc) { + int i; + + for ( i=0; encodingtypes[i].text!=NULL || encodingtypes[i].line; ++i ) { + if ( encodingtypes[i].text==NULL ) + ; + else if ( encodingtypes[i].userdata == (void *) enc ) +return( &encodingtypes[i] ); + } +return( NULL ); +} + +GTextInfo *GetEncodingTypes(void) { + GTextInfo *ti; + int i; + Encoding *item; + + i = 0; + for ( item=enclist; item!=NULL ; item=item->next ) + if ( !item->builtin ) + ++i; + if ( i==0 ) +return( encodingtypes ); + i += sizeof(encodingtypes)/sizeof(encodingtypes[0]); + ti = gcalloc(i+1,sizeof(GTextInfo)); + memcpy(ti,encodingtypes,sizeof(encodingtypes)-sizeof(encodingtypes[0])); + for ( i=0; inext ) + if ( !item->builtin ) { + ti[i].text = uc_copy(item->enc_name); + ti[i++].userdata = (void *) item->enc_num; + } +return( ti ); +} + +static void TTFSetup(struct gfi_data *d) { + struct pfminfo info; + char buffer[10]; unichar_t ubuf[10]; + int i, lg, vlg; + + info = d->sf->pfminfo; + if ( !info.pfmset ) { + /* Base this stuff on the CURRENT name */ + /* if the user just created a font, and named it *Bold, then the sf */ + /* won't yet have Bold in its name, and basing the weight on it would*/ + /* give the wrong answer. That's why we don't do this init until we */ + /* get to one of the ttf aspects, it gives the user time to set the */ + /* name properly */ + /* And on CURRENT values of ascent and descent */ + char *n = cu_copy(_GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Fontname))); + const unichar_t *as = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Ascent)); + const unichar_t *ds = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Descent)); + unichar_t *aend, *dend; + double av=u_strtod(as,&aend),dv=u_strtod(ds,&dend); + if ( *aend=='\0' && *dend=='\0' ) { + if ( info.linegap==0 ) + info.linegap = rint(.09*(av+dv)); + if ( info.vlinegap==0 ) + info.vlinegap = info.linegap; + } + lg = info.linegap; vlg = info.vlinegap; + SFDefaultOS2Info(&info,d->sf,n); + if ( lg != 0 ) + info.linegap = lg; + if ( vlg!= 0 ) + info.vlinegap = vlg; + free(n); + } + + if ( info.weight>0 && info.weight<=900 && info.weight%100==0 ) + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_WeightClass), + GStringGetResource((int) (weightclass[info.weight/100-1].text),NULL)); + else { + sprintf( buffer, "%d", info.weight ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_WeightClass),ubuf); + } + GGadgetSelectOneListItem(GWidgetGetControl(d->gw,CID_WidthClass),info.width-1); + for ( i=0; pfmfamily[i].text!=NULL; ++i ) + if ( (int) (pfmfamily[i].userdata)==info.pfmfamily ) { + GGadgetSelectOneListItem(GWidgetGetControl(d->gw,CID_PFMFamily),i); + break; + } + for ( i=0; i<10; ++i ) + GGadgetSelectOneListItem(GWidgetGetControl(d->gw,CID_PanFamily+i),info.panose[i]); + d->ttf_set = true; + /* FSType is already set */ + sprintf( buffer, "%d", info.linegap ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_LineGap),ubuf); + sprintf( buffer, "%d", info.vlinegap ); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_VLineGap),ubuf); +} + +static int mathparams[] = { _STR_Num1, _STR_Num2, _STR_Num3, _STR_Denom1, + _STR_Denom2, _STR_Sup1, _STR_Sup2, _STR_Sup3, _STR_Sub1, _STR_Sub2, + _STR_SupDrop, _STR_SubDrop, _STR_Delim1, _STR_Delim2, _STR_AxisHt, + 0 }; +static int mathpopups[] = { _STR_Num1Popup, _STR_Num2Popup, _STR_Num3Popup, _STR_Denom1Popup, + _STR_Denom2Popup, _STR_Sup1Popup, _STR_Sup2Popup, _STR_Sup3Popup, _STR_Sub1Popup, _STR_Sub2Popup, + _STR_SupDropPopup, _STR_SubDropPopup, _STR_Delim1Popup, _STR_Delim2Popup, _STR_AxisHtPopup, + 0 }; +static int extparams[] = { _STR_DefRuleThick, _STR_BigOpSpace1, _STR_BigOpSpace2, _STR_BigOpSpace3, _STR_BigOpSpace4, _STR_BigOpSpace5, 0 }; +static int extpopups[] = { _STR_DefRuleThickPopup, _STR_BigOpSpace1Popup, _STR_BigOpSpace2Popup, _STR_BigOpSpace3Popup, _STR_BigOpSpace4Popup, _STR_BigOpSpace5Popup, 0 }; + +static int mp_e_h(GWindow gw, GEvent *event) { + int i; + + if ( event->type==et_close ) { + struct gfi_data *d = GDrawGetUserData(gw); + d->mpdone = true; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(gw); + if ( GGadgetGetCid(event->u.control.g)) { + int err=false; + double em = (d->sf->ascent+d->sf->descent), val; + int *params; + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_TeXMath)) ) + params = mathparams; + else + params = extparams; + for ( i=0; params[i]!=0 && !err; ++i ) { + val = GetRealR(gw,CID_TeX+i,params[i],&err); + if ( !err ) + d->texdata.params[i+7] = rint( val/em * (1<<20) ); + } + if ( !err ) + d->mpdone = true; + } else + d->mpdone = true; + } +return( true ); +} + +static int GFI_MoreParams(GGadget *g, GEvent *e) { + int tot; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData txgcd[35]; + GTextInfo txlabel[35]; + int i,y,k; + int *params, *popups; + char values[20][20]; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_TeXText)) ) +return( true ); + else if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_TeXMath)) ) { + tot = 22-7; + params = mathparams; + popups = mathpopups; + } else { + tot = 13-7; + params = extparams; + popups = extpopups; + } + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<texdata.params[i+7]*(double) (d->sf->ascent+d->sf->descent)/(double) (1<<20)); + txlabel[k].text = (unichar_t *) values[i]; + txlabel[k].text_is_1byte = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.pos.x = 85; txgcd[k].gd.pos.y = y; + txgcd[k].gd.pos.width = 75; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.cid = CID_TeX + i; + txgcd[k++].creator = GTextFieldCreate; + y += 26; + } + + txgcd[k].gd.pos.x = 30-3; txgcd[k].gd.pos.y = GDrawPixelsToPoints(NULL,pos.height)-35-3; + txgcd[k].gd.pos.width = -1; txgcd[k].gd.pos.height = 0; + txgcd[k].gd.flags = gg_visible | gg_enabled | gg_but_default; + txlabel[k].text = (unichar_t *) _STR_OK; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.cid = true; + txgcd[k++].creator = GButtonCreate; + + txgcd[k].gd.pos.x = -30; txgcd[k].gd.pos.y = txgcd[k-1].gd.pos.y+3; + txgcd[k].gd.pos.width = -1; txgcd[k].gd.pos.height = 0; + txgcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + txlabel[k].text = (unichar_t *) _STR_Cancel; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.cid = false; + txgcd[k++].creator = GButtonCreate; + + txgcd[k].gd.pos.x = 2; txgcd[k].gd.pos.y = 2; + txgcd[k].gd.pos.width = pos.width-4; txgcd[k].gd.pos.height = pos.height-4; + txgcd[k].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + txgcd[k].creator = GGroupCreate; + + GGadgetsCreate(gw,txgcd); + d->mpdone = false; + GDrawSetVisible(gw,true); + + while ( !d->mpdone ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + } +return( true ); +} + +static int GFI_TeXChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GGadgetGetCid(g)==CID_TeXText ) { + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_TeXExtraSpLabel), + GStringGetResource(_STR_ExtraSp,NULL)); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_MoreParams),false); + } else { + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_TeXExtraSpLabel), + GStringGetResource(_STR_MathSp,NULL)); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_MoreParams),true); + } + } +return( true ); +} + +static void DefaultTeX(struct gfi_data *d) { + char buffer[20]; + unichar_t ubuf[20]; + int i; + SplineFont *sf = d->sf; + + d->tex_set = true; + + if ( sf->texdata.type==tex_unset ) { + TeXDefaultParams(sf); + d->texdata = sf->texdata; + } + + sprintf( buffer,"%g", d->texdata.designsize/(double) (1<<20)); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_DesignSize),ubuf); + + for ( i=0; i<7; ++i ) { + sprintf( buffer,"%g", d->texdata.params[i]*(sf->ascent+sf->descent)/(double) (1<<20)); + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_TeX+i),ubuf); + } + if ( sf->texdata.type==tex_math ) + GGadgetSetChecked(GWidgetGetControl(d->gw,CID_TeXMath), true); + else if ( sf->texdata.type == tex_mathext ) + GGadgetSetChecked(GWidgetGetControl(d->gw,CID_TeXMathExt), true); + else { + GGadgetSetChecked(GWidgetGetControl(d->gw,CID_TeXText), true); + GGadgetSetTitle(GWidgetGetControl(d->gw,CID_TeXExtraSpLabel), + GStringGetResource(_STR_ExtraSp,NULL)); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_MoreParams),false); + } +} + +static int GFI_MacAutomatic(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int autom = GGadgetIsChecked(GWidgetGetControl(d->gw,CID_MacAutomatic)); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_MacStyles),!autom); + } +return( true ); +} + +static int GFI_AspectChange(GGadget *g, GEvent *e) { + if ( e==NULL || (e->type==et_controlevent && e->u.control.subtype == et_radiochanged )) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int new_aspect = GTabSetGetSel(g); + if ( !d->ttf_set && ( new_aspect == d->ttfv_aspect || new_aspect == d->panose_aspect )) + TTFSetup(d); + else if ( !d->names_set && new_aspect == d->tn_aspect ) + DefaultLanguage(d); + else if ( !d->tex_set && new_aspect == d->tx_aspect ) + DefaultTeX(d); + d->old_aspect = new_aspect; + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct gfi_data *d = GDrawGetUserData(gw); + GFI_CancelClose(d); + } else if ( event->type==et_destroy ) { + struct gfi_data *d = GDrawGetUserData(gw); + free(d); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("fontinfo.html"); +return( true ); + } else if ( event->u.chr.keysym=='s' && + (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) { + MenuSaveAll(NULL,NULL,NULL); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) { + GFI_CancelClose(GDrawGetUserData(gw)); + } else + MenuExit(NULL,NULL,NULL); +return( true ); + } +return( false ); + } +return( true ); +} + +static int OrderGSUB(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfi_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + OrderTable(d->sf,CHR('G','S','U','B')); + } +return( true ); +} + +void FontInfo(SplineFont *sf,int defaspect,int sync) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GTabInfo aspects[15], conaspects[7], smaspects[5]; + GGadgetCreateData mgcd[10], ngcd[13], egcd[14], psgcd[24], tngcd[7], + pgcd[8], vgcd[16], pangcd[22], comgcd[3], atgcd[7], txgcd[23], + congcd[3], csubgcd[fpst_max-pst_contextpos][6], smgcd[3], smsubgcd[4][6], + mfgcd[8], mcgcd[8]; + GTextInfo mlabel[10], nlabel[13], elabel[14], pslabel[24], tnlabel[7], + plabel[8], vlabel[16], panlabel[22], comlabel[3], atlabel[7], txlabel[23], + csublabel[fpst_max-pst_contextpos][6], smsublabel[4][6], + mflabel[8], mclabel[8], *list; + struct gfi_data *d; + char iabuf[20], upbuf[20], uwbuf[20], asbuf[20], dsbuf[20], ncbuf[20], + vbuf[20], uibuf[12], regbuf[100], vorig[20], embuf[20]; + int i,k; + int mcs; + Encoding *item; + FontView *fvs; + unichar_t title[130]; + static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + FontRequest rq; + GFont *font; + static int connames[] = { _STR_ContextPos, _STR_ContextSub, _STR_ChainPos, _STR_ChainSub, _STR_ReverseChainSub, 0 }; + static int contypes[] = { pst_contextpos, pst_contextsub, pst_chainpos, pst_chainsub, pst_reversesub, 0 }; + static int smnames[] = { _STR_Indic, _STR_ContextSub, _STR_ContextIns, _STR_Kerning, 0 }; + static int smtypes[] = { asm_indic, asm_context, asm_insert, asm_kern }; + + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + if ( fvs->fontinfo ) { + GDrawSetVisible(((struct gfi_data *) (fvs->fontinfo))->gw,true); + GDrawRaise( ((struct gfi_data *) (fvs->fontinfo))->gw ); +return; + } + } + if ( defaspect==-1 ) + defaspect = last_aspect; + + d = gcalloc(1,sizeof(struct gfi_data)); + if ( sf->fv!=NULL ) + sf->fv->fontinfo = d; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg; + wattrs.event_masks = ~(1<fontname); + wattrs.window_title = title; + pos.x = pos.y = 0; + pos.width =GDrawPointsToPixels(NULL,GGadgetScale(268)); + pos.height = GDrawPointsToPixels(NULL,375); + gw = GDrawCreateTopWindow(NULL,&pos,e_h,d,&wattrs); + + d->sf = sf; + d->gw = gw; + d->old_sel = -2; + d->uplane = lastplane; + d->oldcnt = sf->charcnt; + d->texdata = sf->texdata; + + memset(&nlabel,0,sizeof(nlabel)); + memset(&ngcd,0,sizeof(ngcd)); + + nlabel[0].text = (unichar_t *) _STR_Fontname; + nlabel[0].text_in_resource = true; + ngcd[0].gd.label = &nlabel[0]; + ngcd[0].gd.mnemonic = 'F'; + ngcd[0].gd.pos.x = 12; ngcd[0].gd.pos.y = 6+6; + ngcd[0].gd.flags = gg_visible | gg_enabled; + ngcd[0].creator = GLabelCreate; + + ngcd[1].gd.pos.x = 115; ngcd[1].gd.pos.y = ngcd[0].gd.pos.y-6; ngcd[1].gd.pos.width = 137; + ngcd[1].gd.flags = gg_visible | gg_enabled; + nlabel[1].text = (unichar_t *) sf->fontname; + nlabel[1].text_is_1byte = true; + ngcd[1].gd.label = &nlabel[1]; + ngcd[1].gd.cid = CID_Fontname; + ngcd[1].gd.handle_controlevent = GFI_NameChange; + ngcd[1].creator = GTextFieldCreate; + + nlabel[10].text = (unichar_t *) _STR_Familyname; + nlabel[10].text_in_resource = true; + ngcd[10].gd.label = &nlabel[10]; + ngcd[10].gd.mnemonic = 'F'; + ngcd[10].gd.pos.x = 12; ngcd[10].gd.pos.y = ngcd[0].gd.pos.y+26; + ngcd[10].gd.flags = gg_visible | gg_enabled; + ngcd[10].creator = GLabelCreate; + + ngcd[11].gd.pos.x = ngcd[1].gd.pos.x; ngcd[11].gd.pos.y = ngcd[10].gd.pos.y-6; ngcd[11].gd.pos.width = 137; + ngcd[11].gd.flags = gg_visible | gg_enabled; + nlabel[11].text = (unichar_t *) (sf->familyname?sf->familyname:sf->fontname); + nlabel[11].text_is_1byte = true; + ngcd[11].gd.label = &nlabel[11]; + ngcd[11].gd.cid = CID_Family; + ngcd[11].gd.handle_controlevent = GFI_FamilyChange; + ngcd[11].creator = GTextFieldCreate; + if ( sf->familyname==NULL || strstr(sf->familyname,"Untitled")==sf->familyname ) + d->family_untitled = true; + + ngcd[4].gd.pos.x = 12; ngcd[4].gd.pos.y = ngcd[11].gd.pos.y+26+6; + nlabel[4].text = (unichar_t *) _STR_Humanname; + nlabel[4].text_in_resource = true; + ngcd[4].gd.label = &nlabel[4]; + ngcd[4].gd.mnemonic = 'H'; + ngcd[4].gd.flags = gg_visible | gg_enabled; + ngcd[4].creator = GLabelCreate; + + ngcd[5].gd.pos.x = 115; ngcd[5].gd.pos.y = ngcd[4].gd.pos.y-6; ngcd[5].gd.pos.width = 137; + ngcd[5].gd.flags = gg_visible | gg_enabled; + nlabel[5].text = (unichar_t *) (sf->fullname?sf->fullname:sf->fontname); + nlabel[5].text_is_1byte = true; + ngcd[5].gd.label = &nlabel[5]; + ngcd[5].gd.cid = CID_Human; + ngcd[5].gd.handle_controlevent = GFI_HumanChange; + ngcd[5].creator = GTextFieldCreate; + if ( sf->fullname==NULL || strstr(sf->fullname,"Untitled")==sf->fullname ) + d->human_untitled = true; + + nlabel[2].text = (unichar_t *) _STR_Weight; + nlabel[2].text_in_resource = true; + ngcd[2].gd.label = &nlabel[2]; + ngcd[2].gd.mnemonic = 'W'; + ngcd[2].gd.pos.x = ngcd[10].gd.pos.x; ngcd[2].gd.pos.y = ngcd[4].gd.pos.y+26; + ngcd[2].gd.flags = gg_visible | gg_enabled; + ngcd[2].creator = GLabelCreate; + + ngcd[3].gd.pos.x = ngcd[1].gd.pos.x; ngcd[3].gd.pos.y = ngcd[2].gd.pos.y-6; ngcd[3].gd.pos.width = 137; + ngcd[3].gd.flags = gg_visible | gg_enabled; + nlabel[3].text = (unichar_t *) (sf->weight?sf->weight:"Regular"); + nlabel[3].text_is_1byte = true; + ngcd[3].gd.label = &nlabel[3]; + ngcd[3].gd.cid = CID_Weight; + ngcd[3].creator = GTextFieldCreate; + + ngcd[8].gd.pos.x = 12; ngcd[8].gd.pos.y = ngcd[3].gd.pos.y+30+6; + nlabel[8].text = (unichar_t *) _STR_VersionC; + nlabel[8].text_in_resource = true; + ngcd[8].gd.label = &nlabel[8]; + ngcd[8].gd.mnemonic = 'V'; + ngcd[8].gd.flags = gg_visible | gg_enabled; + ngcd[8].creator = GLabelCreate; + + ngcd[9].gd.pos.x = 115; ngcd[9].gd.pos.y = ngcd[8].gd.pos.y-6; ngcd[9].gd.pos.width = 137; + ngcd[9].gd.flags = gg_visible | gg_enabled; + nlabel[9].text = (unichar_t *) (sf->version?sf->version:""); + nlabel[9].text_is_1byte = true; + if ( sf->subfontcnt!=0 ) { + sprintf( vbuf,"%g", sf->cidversion ); + nlabel[9].text = (unichar_t *) vbuf; + } + ngcd[9].gd.label = &nlabel[9]; + ngcd[9].gd.cid = CID_Version; + ngcd[9].creator = GTextFieldCreate; + + ngcd[6].gd.pos.x = 12; ngcd[6].gd.pos.y = ngcd[8].gd.pos.y+22; + ngcd[6].gd.flags = gg_visible | gg_enabled; + ngcd[6].gd.mnemonic = 'r'; + nlabel[6].text = (unichar_t *) _STR_Copyright; + nlabel[6].text_in_resource = true; + ngcd[6].gd.label = &nlabel[6]; + ngcd[6].creator = GLabelCreate; + + ngcd[7].gd.pos.x = 12; ngcd[7].gd.pos.y = ngcd[6].gd.pos.y+14; + ngcd[7].gd.pos.width = ngcd[5].gd.pos.x+ngcd[5].gd.pos.width-26; + ngcd[7].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + if ( sf->copyright!=NULL ) { + nlabel[7].text = (unichar_t *) sf->copyright; + nlabel[7].text_is_1byte = true; + ngcd[7].gd.label = &nlabel[7]; + } + ngcd[7].gd.cid = CID_Notice; + ngcd[7].creator = GTextAreaCreate; +/******************************************************************************/ + memset(&elabel,0,sizeof(elabel)); + memset(&egcd,0,sizeof(egcd)); + + egcd[0].gd.pos.x = 12; egcd[0].gd.pos.y = 12; + egcd[0].gd.flags = gg_visible | gg_enabled; + egcd[0].gd.mnemonic = 'E'; + elabel[0].text = (unichar_t *) _STR_Encoding; + elabel[0].text_in_resource = true; + egcd[0].gd.label = &elabel[0]; + egcd[0].creator = GLabelCreate; + + egcd[1].gd.pos.x = 80; egcd[1].gd.pos.y = egcd[0].gd.pos.y-6; + egcd[1].gd.flags = gg_visible | gg_enabled; + egcd[1].gd.u.list = list = GetEncodingTypes(); + egcd[1].gd.label = EncodingTypesFindEnc(list,sf->compacted?em_compacted:sf->encoding_name); + if ( egcd[1].gd.label==NULL ) egcd[1].gd.label = &list[0]; + egcd[1].gd.cid = CID_Encoding; + egcd[1].gd.handle_controlevent = GFI_SelectEncoding; + egcd[1].creator = GListButtonCreate; + for ( i=0; list[i].text!=NULL || list[i].line; ++i ) { + if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax && + (void *) em_unicodeplanes==list[i].userdata ) { + list[i].selected = true; + d->uplane = sf->encoding_name-em_unicodeplanes; + } else if ( (void *) (sf->encoding_name)==list[i].userdata && + list[i].text!=NULL ) + list[i].selected = true; + else + list[i].selected = false; + } + + egcd[2].gd.pos.x = 8; egcd[2].gd.pos.y = GDrawPointsToPixels(NULL,egcd[0].gd.pos.y+6); + egcd[2].gd.pos.width = pos.width-32; egcd[2].gd.pos.height = GDrawPointsToPixels(NULL,43); + egcd[2].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + egcd[2].creator = GGroupCreate; + + egcd[3].gd.pos.x = 12; egcd[3].gd.pos.y = egcd[1].gd.pos.y+27; + egcd[3].gd.pos.width = -1; egcd[3].gd.pos.height = 0; + egcd[3].gd.flags = gg_visible | gg_enabled; + elabel[3].text = (unichar_t *) _STR_Load; + elabel[3].text_in_resource = true; + egcd[3].gd.mnemonic = 'L'; + egcd[3].gd.label = &elabel[3]; + egcd[3].gd.handle_controlevent = GFI_Load; + egcd[3].creator = GButtonCreate; + + egcd[4].gd.pos.x = (254-100)/2; egcd[4].gd.pos.y = egcd[3].gd.pos.y; + egcd[4].gd.pos.width = 100; egcd[4].gd.pos.height = 0; + egcd[4].gd.flags = gg_visible; + if ( sf->encoding_name==em_custom || sf->charcnt>1500 ) egcd[4].gd.flags |= gg_enabled; + elabel[4].text = (unichar_t *) _STR_Makefromfont; + elabel[4].text_in_resource = true; + egcd[4].gd.mnemonic = 'k'; + egcd[4].gd.label = &elabel[4]; + egcd[4].gd.handle_controlevent = GFI_Make; + egcd[4].gd.cid = CID_Make; + egcd[4].creator = GButtonCreate; + + egcd[5].gd.pos.x = -12; + egcd[5].gd.pos.y = egcd[4].gd.pos.y; + egcd[5].gd.pos.width = -1; egcd[5].gd.pos.height = 0; + egcd[5].gd.flags = gg_visible; + for ( item=enclist; item!=NULL && item->builtin; item=item->next ); + if ( item!=NULL ) egcd[5].gd.flags |= gg_enabled; + elabel[5].text = (unichar_t *) _STR_Remove; + elabel[5].text_in_resource = true; + egcd[5].gd.mnemonic = 'R'; + egcd[5].gd.label = &elabel[5]; + egcd[5].gd.handle_controlevent = GFI_Delete; + egcd[5].gd.cid = CID_Delete; + egcd[5].creator = GButtonCreate; + + egcd[6].gd.pos.x = 12; egcd[6].gd.pos.y = egcd[5].gd.pos.y+36+6; + egcd[6].gd.flags = gg_visible | gg_enabled; + egcd[6].gd.mnemonic = 'F'; + elabel[6].text = (unichar_t *) _STR_ForceEncoding; + elabel[6].text_in_resource = true; + egcd[6].gd.label = &elabel[6]; + egcd[6].gd.popup_msg = GStringGetResource(_STR_ForceEncodingPopup,NULL); + egcd[6].gd.cid = CID_ForceEncoding; + egcd[6].creator = GCheckBoxCreate; + + egcd[7].gd.pos.x = 12; egcd[7].gd.pos.y = egcd[6].gd.pos.y+24+6; + egcd[7].gd.flags = gg_visible | gg_enabled; + egcd[7].gd.mnemonic = 'N'; + elabel[7].text = (unichar_t *) _STR_Numchars; + elabel[7].text_in_resource = true; + egcd[7].gd.label = &elabel[7]; + egcd[7].creator = GLabelCreate; + + egcd[8].gd.pos.x = 123; egcd[8].gd.pos.y = egcd[7].gd.pos.y-6; egcd[8].gd.pos.width = 60; + egcd[8].gd.flags = gg_visible | gg_enabled; + sprintf( ncbuf, "%d", sf->charcnt ); + elabel[8].text = (unichar_t *) ncbuf; + elabel[8].text_is_1byte = true; + egcd[8].gd.label = &elabel[8]; + egcd[8].gd.cid = CID_NChars; + egcd[8].creator = GTextFieldCreate; + + egcd[9].gd.pos.x = 12; egcd[9].gd.pos.y = egcd[7].gd.pos.y+24; + egcd[9].gd.flags = gg_visible | gg_enabled; + elabel[9].text = (unichar_t *) _STR_Interpretation; + elabel[9].text_in_resource = true; + egcd[9].gd.label = &elabel[9]; + egcd[9].creator = GLabelCreate; + + egcd[10].gd.pos.x = egcd[1].gd.pos.x; egcd[10].gd.pos.y = egcd[9].gd.pos.y-6; + egcd[10].gd.flags = gg_visible | gg_enabled; + egcd[10].gd.u.list = interpretations; + egcd[10].gd.cid = CID_Interpretation; + egcd[10].gd.handle_controlevent = GFI_SelectEncoding; + egcd[10].creator = GListButtonCreate; + for ( i=0; interpretations[i].text!=NULL || interpretations[i].line; ++i ) { + if ( (void *) (sf->uni_interp)==interpretations[i].userdata && + interpretations[i].text!=NULL ) { + interpretations[i].selected = true; + egcd[10].gd.label = &interpretations[i]; + } else + interpretations[i].selected = false; + } + + if ( sf->cidmaster || sf->subfontcnt!=0 ) { + SplineFont *master = sf->cidmaster?sf->cidmaster:sf; + + egcd[11].gd.pos.x = 12; egcd[11].gd.pos.y = egcd[10].gd.pos.y+36+6; + egcd[11].gd.flags = gg_visible ; + egcd[11].gd.mnemonic = 'N'; + elabel[11].text = (unichar_t *) _STR_CIDRegistry; + elabel[11].text_in_resource = true; + egcd[11].gd.label = &elabel[11]; + egcd[11].creator = GLabelCreate; + + egcd[12].gd.pos.x = egcd[1].gd.pos.x; egcd[12].gd.pos.y = egcd[11].gd.pos.y-6; + egcd[12].gd.pos.width = 140; + egcd[12].gd.flags = gg_visible ; + sprintf( regbuf, "%.30s-%.30s-%d", master->cidregistry, master->ordering, master->supplement ); + elabel[12].text = (unichar_t *) regbuf; + elabel[12].text_is_1byte = true; + egcd[12].gd.label = &elabel[12]; + egcd[12].creator = GTextFieldCreate; + } + + if ( sf->subfontcnt!=0 || sf->cidmaster!=NULL ) { + for ( i=0; i<=5; ++i ) + egcd[i].gd.flags &= ~gg_enabled; + if ( sf->subfontcnt!=0 ) { + egcd[6].gd.flags &= ~gg_enabled; + egcd[7].gd.flags &= ~gg_enabled; + } + } +/******************************************************************************/ + memset(&pslabel,0,sizeof(pslabel)); + memset(&psgcd,0,sizeof(psgcd)); + + psgcd[0].gd.pos.x = 12; psgcd[0].gd.pos.y = 12; + psgcd[0].gd.flags = gg_visible | gg_enabled; + psgcd[0].gd.mnemonic = 'A'; + pslabel[0].text = (unichar_t *) _STR_Ascent; + pslabel[0].text_in_resource = true; + psgcd[0].gd.label = &pslabel[0]; + psgcd[0].creator = GLabelCreate; + + psgcd[1].gd.pos.x = 103; psgcd[1].gd.pos.y = psgcd[0].gd.pos.y-6; psgcd[1].gd.pos.width = 47; + psgcd[1].gd.flags = gg_visible | gg_enabled; + sprintf( asbuf, "%d", sf->ascent ); + pslabel[1].text = (unichar_t *) asbuf; + pslabel[1].text_is_1byte = true; + psgcd[1].gd.label = &pslabel[1]; + psgcd[1].gd.cid = CID_Ascent; + psgcd[1].gd.handle_controlevent = GFI_EmChanged; + psgcd[1].creator = GTextFieldCreate; + + psgcd[2].gd.pos.x = 155; psgcd[2].gd.pos.y = psgcd[0].gd.pos.y; + psgcd[2].gd.flags = gg_visible | gg_enabled; + psgcd[2].gd.mnemonic = 'D'; + pslabel[2].text = (unichar_t *) _STR_Descent; + pslabel[2].text_in_resource = true; + psgcd[2].gd.label = &pslabel[2]; + psgcd[2].creator = GLabelCreate; + + psgcd[3].gd.pos.x = 200; psgcd[3].gd.pos.y = psgcd[1].gd.pos.y; psgcd[3].gd.pos.width = 47; + psgcd[3].gd.flags = gg_visible | gg_enabled; + sprintf( dsbuf, "%d", sf->descent ); + pslabel[3].text = (unichar_t *) dsbuf; + pslabel[3].text_is_1byte = true; + psgcd[3].gd.label = &pslabel[3]; + psgcd[3].gd.cid = CID_Descent; + psgcd[3].gd.handle_controlevent = GFI_EmChanged; + psgcd[3].creator = GTextFieldCreate; + + psgcd[4].gd.pos.x = psgcd[0].gd.pos.x+5; psgcd[4].gd.pos.y = psgcd[0].gd.pos.y+24; + psgcd[4].gd.flags = gg_visible | gg_enabled; + psgcd[4].gd.mnemonic = 'E'; + pslabel[4].text = (unichar_t *) _STR_EmSize; + pslabel[4].text_in_resource = true; + psgcd[4].gd.label = &pslabel[4]; + psgcd[4].creator = GLabelCreate; + + psgcd[5].gd.pos.x = psgcd[1].gd.pos.x-20; psgcd[5].gd.pos.y = psgcd[1].gd.pos.y+24; psgcd[5].gd.pos.width = 67; + psgcd[5].gd.flags = gg_visible | gg_enabled; + sprintf( embuf, "%d", sf->descent+sf->ascent ); + pslabel[5].text = (unichar_t *) embuf; + pslabel[5].text_is_1byte = true; + psgcd[5].gd.label = &pslabel[5]; + psgcd[5].gd.cid = CID_Em; + psgcd[5].gd.u.list = emsizes; + psgcd[5].gd.handle_controlevent = GFI_EmChanged; + psgcd[5].creator = GListFieldCreate; + + psgcd[6].gd.pos.x = psgcd[2].gd.pos.x; psgcd[6].gd.pos.y = psgcd[4].gd.pos.y-4; + psgcd[6].gd.flags = gg_visible | gg_enabled | gg_cb_on; + pslabel[6].text = (unichar_t *) _STR_ScaleOutlines; + pslabel[6].text_in_resource = true; + psgcd[6].gd.label = &pslabel[6]; + psgcd[6].gd.cid = CID_Scale; + psgcd[6].creator = GCheckBoxCreate; + +/* I've reversed the label, text field order in the gcd here because */ +/* that way the text field will be displayed on top of the label rather */ +/* than the reverse, and in Russian that's important translation of */ +/* "Italic Angle" is too long. Oops, no it's the next one, might as well leave in here though */ + psgcd[8].gd.pos.x = 12; psgcd[8].gd.pos.y = psgcd[5].gd.pos.y+26+6; + psgcd[8].gd.flags = gg_visible | gg_enabled; + psgcd[8].gd.mnemonic = 'I'; + pslabel[8].text = (unichar_t *) _STR_Italicangle; + pslabel[8].text_in_resource = true; + psgcd[8].gd.label = &pslabel[8]; + psgcd[8].creator = GLabelCreate; + + psgcd[7].gd.pos.x = 103; psgcd[7].gd.pos.y = psgcd[8].gd.pos.y-6; + psgcd[7].gd.pos.width = 47; + psgcd[7].gd.flags = gg_visible | gg_enabled; + sprintf( iabuf, "%g", sf->italicangle ); + pslabel[7].text = (unichar_t *) iabuf; + pslabel[7].text_is_1byte = true; + psgcd[7].gd.label = &pslabel[7]; + psgcd[7].gd.cid = CID_ItalicAngle; + psgcd[7].creator = GTextFieldCreate; + + psgcd[9].gd.pos.y = psgcd[7].gd.pos.y; + psgcd[9].gd.pos.width = -1; psgcd[9].gd.pos.height = 0; + psgcd[9].gd.pos.x = psgcd[3].gd.pos.x+psgcd[3].gd.pos.width- + GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + /*if ( strstrmatch(sf->fontname,"Italic")!=NULL ||strstrmatch(sf->fontname,"Oblique")!=NULL )*/ + psgcd[9].gd.flags = gg_visible | gg_enabled; + pslabel[9].text = (unichar_t *) _STR_Guess; + pslabel[9].text_in_resource = true; + psgcd[9].gd.label = &pslabel[9]; + psgcd[9].gd.mnemonic = 'G'; + psgcd[9].gd.handle_controlevent = GFI_GuessItalic; + psgcd[9].creator = GButtonCreate; + +/* I've reversed the label, text field order in the gcd here because */ +/* that way the text field will be displayed on top of the label rather */ +/* than the reverse, and in Russian that's important translation of */ +/* "Underline position" is too long. */ + psgcd[11].gd.pos.x = 12; psgcd[11].gd.pos.y = psgcd[7].gd.pos.y+26+6; + psgcd[11].gd.flags = gg_visible | gg_enabled; + psgcd[11].gd.mnemonic = 'P'; + pslabel[11].text = (unichar_t *) _STR_Upos; + pslabel[11].text_in_resource = true; + psgcd[11].gd.label = &pslabel[11]; + psgcd[11].creator = GLabelCreate; + + psgcd[10].gd.pos.x = 103; psgcd[10].gd.pos.y = psgcd[11].gd.pos.y-6; psgcd[10].gd.pos.width = 47; + psgcd[10].gd.flags = gg_visible | gg_enabled; + sprintf( upbuf, "%g", sf->upos ); + pslabel[10].text = (unichar_t *) upbuf; + pslabel[10].text_is_1byte = true; + psgcd[10].gd.label = &pslabel[10]; + psgcd[10].gd.cid = CID_UPos; + psgcd[10].creator = GTextFieldCreate; + + psgcd[12].gd.pos.x = 155; psgcd[12].gd.pos.y = psgcd[11].gd.pos.y; + psgcd[12].gd.flags = gg_visible | gg_enabled; + psgcd[12].gd.mnemonic = 'H'; + pslabel[12].text = (unichar_t *) _STR_Uheight; + pslabel[12].text_in_resource = true; + psgcd[12].gd.label = &pslabel[12]; + psgcd[12].creator = GLabelCreate; + + psgcd[13].gd.pos.x = 200; psgcd[13].gd.pos.y = psgcd[10].gd.pos.y; psgcd[13].gd.pos.width = 47; + psgcd[13].gd.flags = gg_visible | gg_enabled; + sprintf( uwbuf, "%g", sf->uwidth ); + pslabel[13].text = (unichar_t *) uwbuf; + pslabel[13].text_is_1byte = true; + psgcd[13].gd.label = &pslabel[13]; + psgcd[13].gd.cid = CID_UWidth; + psgcd[13].creator = GTextFieldCreate; + + psgcd[14].gd.pos.x = 12; psgcd[14].gd.pos.y = psgcd[13].gd.pos.y+26+6; + psgcd[14].gd.flags = gg_visible | gg_enabled; + psgcd[14].gd.mnemonic = 'x'; + pslabel[14].text = (unichar_t *) _STR_Xuid; + pslabel[14].text_in_resource = true; + psgcd[14].gd.label = &pslabel[14]; + psgcd[14].creator = GLabelCreate; + + psgcd[15].gd.pos.x = 103; psgcd[15].gd.pos.y = psgcd[14].gd.pos.y-6; psgcd[15].gd.pos.width = 142; + psgcd[15].gd.flags = gg_visible | gg_enabled; + if ( sf->xuid!=NULL ) { + pslabel[15].text = (unichar_t *) sf->xuid; + pslabel[15].text_is_1byte = true; + psgcd[15].gd.label = &pslabel[15]; + } + psgcd[15].gd.cid = CID_XUID; + psgcd[15].creator = GTextFieldCreate; + + psgcd[16].gd.pos.x = 12; psgcd[16].gd.pos.y = psgcd[15].gd.pos.y+26+6; + pslabel[16].text = (unichar_t *) _STR_UniqueIDC; + pslabel[16].text_in_resource = true; + psgcd[16].gd.label = &pslabel[16]; + psgcd[16].gd.mnemonic = 'U'; + psgcd[16].gd.flags = gg_visible | gg_enabled; + psgcd[16].creator = GLabelCreate; + + psgcd[17].gd.pos.x = psgcd[12].gd.pos.x; psgcd[17].gd.pos.y = psgcd[16].gd.pos.y-6; psgcd[17].gd.pos.width = psgcd[12].gd.pos.width; + psgcd[17].gd.flags = gg_visible | gg_enabled; + pslabel[17].text = (unichar_t *) ""; + pslabel[17].text_is_1byte = true; + if ( sf->uniqueid!=0 ) { + sprintf( uibuf, "%d", sf->uniqueid ); + pslabel[17].text = (unichar_t *) uibuf; + } + psgcd[17].gd.label = &pslabel[17]; + psgcd[17].gd.cid = CID_UniqueID; + psgcd[17].creator = GTextFieldCreate; + + psgcd[18].gd.pos.x = 12; psgcd[18].gd.pos.y = psgcd[17].gd.pos.y+26+6; + pslabel[18].text = (unichar_t *) _STR_HasVerticalMetrics; + pslabel[18].text_in_resource = true; + psgcd[18].gd.label = &pslabel[18]; + psgcd[18].gd.mnemonic = 'V'; + psgcd[18].gd.cid = CID_HasVerticalMetrics; + psgcd[18].gd.flags = gg_visible | gg_enabled; + if ( sf->hasvmetrics ) + psgcd[18].gd.flags |= gg_cb_on; + psgcd[18].gd.handle_controlevent = GFI_VMetricsCheck; + psgcd[18].creator = GCheckBoxCreate; + + psgcd[19].gd.pos.x = 12; psgcd[19].gd.pos.y = psgcd[18].gd.pos.y+22+4; + pslabel[19].text = (unichar_t *) _STR_VOrigin; + pslabel[19].text_in_resource = true; + psgcd[19].gd.label = &pslabel[19]; + psgcd[19].gd.mnemonic = 'O'; + psgcd[19].gd.flags = sf->hasvmetrics ? (gg_visible | gg_enabled) : gg_visible; + psgcd[19].gd.cid = CID_VOriginLab; + psgcd[19].creator = GLabelCreate; + + psgcd[20].gd.pos.x = psgcd[15].gd.pos.x; psgcd[20].gd.pos.y = psgcd[19].gd.pos.y-4; psgcd[20].gd.pos.width = psgcd[15].gd.pos.width; + psgcd[20].gd.flags = sf->hasvmetrics ? (gg_visible | gg_enabled) : gg_visible; + pslabel[20].text = (unichar_t *) ""; + pslabel[20].text_is_1byte = true; + if ( sf->vertical_origin!=0 || sf->hasvmetrics ) { + sprintf( vorig, "%d", sf->vertical_origin ); + pslabel[20].text = (unichar_t *) vorig; + } + psgcd[20].gd.label = &pslabel[20]; + psgcd[20].gd.cid = CID_VOrigin; + psgcd[20].creator = GTextFieldCreate; + + psgcd[21].gd.pos.x = 12; psgcd[21].gd.pos.y = psgcd[20].gd.pos.y+26; + pslabel[21].text = (unichar_t *) _STR_Order2Splines; + pslabel[21].text_in_resource = true; + psgcd[21].gd.label = &pslabel[21]; + psgcd[21].gd.flags = sf->order2 ? (gg_visible | gg_enabled | gg_cb_on) : (gg_visible | gg_enabled); + psgcd[21].gd.cid = CID_IsOrder2; + psgcd[21].creator = GCheckBoxCreate; + psgcd[21].gd.popup_msg = GStringGetResource(_STR_PopupOrder2Splines,NULL); + +#ifdef FONTFORGE_CONFIG_TYPE3 + psgcd[22].gd.pos.x = 12; psgcd[22].gd.pos.y = psgcd[21].gd.pos.y+16; + pslabel[22].text = (unichar_t *) _STR_MultiLayer; + pslabel[22].text_in_resource = true; + psgcd[22].gd.label = &pslabel[22]; + psgcd[22].gd.flags = sf->multilayer ? (gg_visible | gg_enabled | gg_cb_on) : (gg_visible | gg_enabled); + psgcd[22].gd.cid = CID_IsMultiLayer; + psgcd[22].creator = GCheckBoxCreate; + psgcd[22].gd.popup_msg = GStringGetResource(_STR_PopupMultiLayer,NULL); +#endif + + if ( sf->subfontcnt!=0 ) { + for ( i=0; i<=13; ++i ) + psgcd[i].gd.flags &= ~gg_enabled; + } else if ( sf->cidmaster!=NULL ) { + for ( i=18; i<=20; ++i ) + psgcd[i].gd.flags &= ~gg_enabled; + } +/******************************************************************************/ + + memset(&plabel,0,sizeof(plabel)); + memset(&pgcd,0,sizeof(pgcd)); + + pgcd[0].gd.pos.x = 10; pgcd[0].gd.pos.y = 6; + pgcd[0].gd.pos.width = 240; pgcd[0].gd.pos.height = 8*12+10; + pgcd[0].gd.flags = gg_visible | gg_enabled; + pgcd[0].gd.cid = CID_PrivateEntries; + pgcd[0].gd.u.list = PI_ListSet(sf); + pgcd[0].gd.handle_controlevent = PI_ListSel; + pgcd[0].creator = GListCreate; + + pgcd[1].gd.pos.x = 10; pgcd[1].gd.pos.y = pgcd[0].gd.pos.y+pgcd[0].gd.pos.height+10; + pgcd[1].gd.pos.width = pgcd[0].gd.pos.width; pgcd[1].gd.pos.height = 8*12+10; + pgcd[1].gd.flags = gg_visible | gg_enabled; + pgcd[1].gd.cid = CID_PrivateValues; + pgcd[1].creator = GTextAreaCreate; + + pgcd[2].gd.pos.x = 10; pgcd[2].gd.pos.y = 300-35-30; + pgcd[2].gd.pos.width = -1; pgcd[2].gd.pos.height = 0; + pgcd[2].gd.flags = gg_visible | gg_enabled ; + plabel[2].text = (unichar_t *) _STR_Add; + plabel[2].text_in_resource = true; + pgcd[2].gd.mnemonic = 'A'; + pgcd[2].gd.label = &plabel[2]; + pgcd[2].gd.handle_controlevent = PI_Add; + pgcd[2].gd.cid = CID_Add; + pgcd[2].creator = GButtonCreate; + + pgcd[3].gd.pos.x = (260)/2-GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor)-5; + pgcd[3].gd.pos.y = pgcd[2].gd.pos.y; + pgcd[3].gd.pos.width = -1; pgcd[3].gd.pos.height = 0; + pgcd[3].gd.flags = gg_visible ; + plabel[3].text = (unichar_t *) _STR_Guess; + plabel[3].text_in_resource = true; + pgcd[3].gd.label = &plabel[3]; + pgcd[3].gd.mnemonic = 'G'; + pgcd[3].gd.handle_controlevent = PI_Guess; + pgcd[3].gd.cid = CID_Guess; + pgcd[3].creator = GButtonCreate; + + pgcd[4].gd.pos.x = -(260/2-GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor)-5); + pgcd[4].gd.pos.y = pgcd[2].gd.pos.y; + pgcd[4].gd.pos.width = -1; pgcd[4].gd.pos.height = 0; + pgcd[4].gd.flags = gg_visible ; + plabel[4].text = (unichar_t *) _STR_Hist; + plabel[4].text_in_resource = true; + pgcd[4].gd.label = &plabel[4]; + pgcd[4].gd.mnemonic = 'G'; + pgcd[4].gd.handle_controlevent = PI_Hist; + pgcd[4].gd.cid = CID_Hist; + pgcd[4].gd.popup_msg = GStringGetResource(_STR_HistPopup,NULL); + pgcd[4].creator = GButtonCreate; + + pgcd[5].gd.pos.x = -10; pgcd[5].gd.pos.y = pgcd[2].gd.pos.y; + pgcd[5].gd.pos.width = -1; pgcd[5].gd.pos.height = 0; + pgcd[5].gd.flags = gg_visible | gg_enabled ; + plabel[5].text = (unichar_t *) _STR_Remove; + plabel[5].text_in_resource = true; + pgcd[5].gd.label = &plabel[5]; + pgcd[5].gd.mnemonic = 'R'; + pgcd[5].gd.handle_controlevent = PI_Delete; + pgcd[5].gd.cid = CID_Remove; + pgcd[5].creator = GButtonCreate; +/******************************************************************************/ + memset(&vlabel,0,sizeof(vlabel)); + memset(&vgcd,0,sizeof(vgcd)); + + vgcd[0].gd.pos.x = 10; vgcd[0].gd.pos.y = 12; + vlabel[0].text = (unichar_t *) _STR_WeightClass; + vlabel[0].text_in_resource = true; + vgcd[0].gd.label = &vlabel[0]; + vgcd[0].gd.flags = gg_visible | gg_enabled; + vgcd[0].creator = GLabelCreate; + + vgcd[1].gd.pos.x = 100; vgcd[1].gd.pos.y = vgcd[0].gd.pos.y-6; vgcd[1].gd.pos.width = 140; + vgcd[1].gd.flags = gg_visible | gg_enabled; + vgcd[1].gd.cid = CID_WeightClass; + vgcd[1].gd.u.list = weightclass; + vgcd[1].creator = GListFieldCreate; + + vgcd[2].gd.pos.x = 10; vgcd[2].gd.pos.y = vgcd[1].gd.pos.y+26+6; + vlabel[2].text = (unichar_t *) _STR_WidthClass; + vlabel[2].text_in_resource = true; + vgcd[2].gd.label = &vlabel[2]; + vgcd[2].gd.flags = gg_visible | gg_enabled; + vgcd[2].creator = GLabelCreate; + + vgcd[3].gd.pos.x = 100; vgcd[3].gd.pos.y = vgcd[2].gd.pos.y-6; + vgcd[3].gd.flags = gg_visible | gg_enabled; + vgcd[3].gd.cid = CID_WidthClass; + vgcd[3].gd.u.list = widthclass; + vgcd[3].creator = GListButtonCreate; + + vgcd[4].gd.pos.x = 10; vgcd[4].gd.pos.y = vgcd[3].gd.pos.y+26+6; + vlabel[4].text = (unichar_t *) _STR_PFMFamily; + vlabel[4].text_in_resource = true; + vgcd[4].gd.label = &vlabel[4]; + vgcd[4].gd.flags = gg_visible | gg_enabled; + vgcd[4].creator = GLabelCreate; + + vgcd[5].gd.pos.x = 100; vgcd[5].gd.pos.y = vgcd[4].gd.pos.y-6; vgcd[5].gd.pos.width = 140; + vgcd[5].gd.flags = gg_visible | gg_enabled; + vgcd[5].gd.cid = CID_PFMFamily; + vgcd[5].gd.u.list = pfmfamily; + vgcd[5].creator = GListButtonCreate; + + vgcd[6].gd.pos.x = 10; vgcd[6].gd.pos.y = vgcd[5].gd.pos.y+26+6; + vlabel[6].text = (unichar_t *) _STR_Embeddable; + vlabel[6].text_in_resource = true; + vgcd[6].gd.label = &vlabel[6]; + vgcd[6].gd.flags = gg_visible | gg_enabled; + vgcd[6].gd.popup_msg = GStringGetResource(_STR_EmbeddablePopup,NULL); + vgcd[6].creator = GLabelCreate; + + vgcd[7].gd.pos.x = 100; vgcd[7].gd.pos.y = vgcd[6].gd.pos.y-6; vgcd[7].gd.pos.width = 140; + vgcd[7].gd.flags = gg_visible | gg_enabled; + vgcd[7].gd.cid = CID_FSType; + vgcd[7].gd.u.list = fstype; + vgcd[7].gd.popup_msg = vgcd[6].gd.popup_msg; + vgcd[7].creator = GListButtonCreate; + fstype[0].selected = fstype[1].selected = + fstype[2].selected = fstype[3].selected = false; + if ( sf->pfminfo.fstype&0x8 /* also catches the "not set" case == -1 */ ) + i = 2; + else if ( sf->pfminfo.fstype&0x4 ) + i = 1; + else if ( sf->pfminfo.fstype&0x2 ) + i = 0; + else + i = 3; + fstype[i].selected = true; + vgcd[7].gd.label = &fstype[i]; + + vgcd[8].gd.pos.x = 20; vgcd[8].gd.pos.y = vgcd[7].gd.pos.y+26; + vlabel[8].text = (unichar_t *) _STR_NoSubsetting; + vlabel[8].text_in_resource = true; + vgcd[8].gd.label = &vlabel[8]; + vgcd[8].gd.flags = gg_visible | gg_enabled; + if ( sf->pfminfo.fstype!=-1 && (sf->pfminfo.fstype&0x100) ) + vgcd[8].gd.flags |= gg_cb_on; + vgcd[8].gd.popup_msg = GStringGetResource(_STR_NoSubsettingPopup,NULL); + vgcd[8].gd.cid = CID_NoSubsetting; + vgcd[8].creator = GCheckBoxCreate; + + vgcd[9].gd.pos.x = 110; vgcd[9].gd.pos.y = vgcd[8].gd.pos.y; + vlabel[9].text = (unichar_t *) _STR_OnlyBitmaps; + vlabel[9].text_in_resource = true; + vgcd[9].gd.label = &vlabel[9]; + vgcd[9].gd.flags = gg_visible | gg_enabled; + if ( sf->pfminfo.fstype!=-1 && ( sf->pfminfo.fstype&0x200 )) + vgcd[9].gd.flags |= gg_cb_on; + vgcd[9].gd.popup_msg = GStringGetResource(_STR_OnlyBitmapsPopup,NULL); + vgcd[9].gd.cid = CID_OnlyBitmaps; + vgcd[9].creator = GCheckBoxCreate; + + vgcd[10].gd.pos.x = 10; vgcd[10].gd.pos.y = vgcd[9].gd.pos.y+26+6; + vlabel[10].text = (unichar_t *) _STR_LineGap; + vlabel[10].text_in_resource = true; + vgcd[10].gd.label = &vlabel[10]; + vgcd[10].gd.flags = gg_visible | gg_enabled; + vgcd[10].gd.popup_msg = GStringGetResource(_STR_LineGapPopup,NULL); + vgcd[10].creator = GLabelCreate; + + vgcd[11].gd.pos.x = 100; vgcd[11].gd.pos.y = vgcd[10].gd.pos.y-6; vgcd[11].gd.pos.width = 140; + vgcd[11].gd.flags = gg_visible | gg_enabled; + /* Line gap value set later */ + vgcd[11].gd.cid = CID_LineGap; + vgcd[11].gd.popup_msg = vgcd[10].gd.popup_msg; + vgcd[11].creator = GTextFieldCreate; + + vgcd[12].gd.pos.x = 10; vgcd[12].gd.pos.y = vgcd[11].gd.pos.y+26+6; + vlabel[12].text = (unichar_t *) _STR_VLineGap; + vlabel[12].text_in_resource = true; + vgcd[12].gd.label = &vlabel[12]; + vgcd[12].gd.flags = sf->hasvmetrics ? (gg_visible | gg_enabled) : gg_visible; + vgcd[12].gd.popup_msg = GStringGetResource(_STR_VLineGapPopup,NULL); + vgcd[12].gd.cid = CID_VLineGapLab; + vgcd[12].creator = GLabelCreate; + + vgcd[13].gd.pos.x = 100; vgcd[13].gd.pos.y = vgcd[12].gd.pos.y-6; vgcd[13].gd.pos.width = 140; + vgcd[13].gd.flags = sf->hasvmetrics ? (gg_visible | gg_enabled) : gg_visible; + /* V Line gap value set later */ + vgcd[13].gd.cid = CID_VLineGap; + vgcd[13].gd.popup_msg = vgcd[11].gd.popup_msg; + vgcd[13].creator = GTextFieldCreate; + + vgcd[14].gd.pos.x = 10; vgcd[14].gd.pos.y = vgcd[13].gd.pos.y+26; + vlabel[14].text = (unichar_t *) _STR_SetGSUBOrder; + vlabel[14].text_in_resource = true; + vgcd[14].gd.label = &vlabel[14]; + vgcd[14].gd.flags = gg_visible | gg_enabled; + vgcd[14].gd.handle_controlevent = OrderGSUB; + vgcd[14].creator = GButtonCreate; + +/******************************************************************************/ + memset(&tnlabel,0,sizeof(tnlabel)); + memset(&tngcd,0,sizeof(tngcd)); + + tngcd[0].gd.pos.x = 20; tngcd[0].gd.pos.y = 6; + tngcd[0].gd.flags = gg_visible | gg_enabled; + tngcd[0].gd.cid = CID_StrID; + tngcd[0].gd.u.list = ttfnameids; + tngcd[0].gd.handle_controlevent = GFI_LanguageChange; + tngcd[0].creator = GListButtonCreate; + + tngcd[1].gd.pos.x = 150; tngcd[1].gd.pos.y = tngcd[0].gd.pos.y; + tngcd[1].gd.flags = gg_enabled; + tngcd[1].gd.cid = CID_TNDef; + tnlabel[1].text = (unichar_t *) _STR_TranslateStyle; + tnlabel[1].text_in_resource = true; + tngcd[1].gd.label = &tnlabel[1]; + tngcd[1].creator = GButtonCreate; + tngcd[1].gd.handle_controlevent = GFI_DefaultStyles; + + tngcd[2].gd.pos.x = 30; tngcd[2].gd.pos.y = 36; + tngcd[2].gd.flags = gg_visible | gg_enabled | gg_list_alphabetic; + tngcd[2].gd.cid = CID_Language; + tngcd[2].gd.u.list = mslanguages; + tngcd[2].gd.handle_controlevent = GFI_LanguageChange; + tngcd[2].creator = GListButtonCreate; + + tngcd[3].gd.pos.x = 12; tngcd[3].gd.pos.y = GDrawPointsToPixels(NULL,tngcd[2].gd.pos.y+12); + tngcd[3].gd.pos.width = pos.width-40; tngcd[3].gd.pos.height = GDrawPointsToPixels(NULL,203); + tngcd[3].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + tngcd[3].creator = GGroupCreate; + + tngcd[4].gd.pos.x = 14; tngcd[4].gd.pos.y = tngcd[2].gd.pos.y+30; + tngcd[4].gd.pos.width = 220; tngcd[4].gd.pos.height = 180; + tngcd[4].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap | gg_text_xim; + tngcd[4].gd.cid = CID_String; + tngcd[4].creator = GTextAreaCreate; + + tngcd[5].gd.pos.x = 8; tngcd[5].gd.pos.y = GDrawPointsToPixels(NULL,tngcd[0].gd.pos.y+12); + tngcd[5].gd.pos.width = pos.width-32; tngcd[5].gd.pos.height = GDrawPointsToPixels(NULL,240); + tngcd[5].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + tngcd[5].creator = GGroupCreate; + +/******************************************************************************/ + memset(&panlabel,0,sizeof(panlabel)); + memset(&pangcd,0,sizeof(pangcd)); + + pangcd[0].gd.pos.x = 10; pangcd[0].gd.pos.y = 12; + panlabel[0].text = (unichar_t *) _STR_Family; + panlabel[0].text_in_resource = true; + pangcd[0].gd.label = &panlabel[0]; + pangcd[0].gd.flags = gg_visible | gg_enabled; + pangcd[0].creator = GLabelCreate; + + pangcd[1].gd.pos.x = 100; pangcd[1].gd.pos.y = pangcd[0].gd.pos.y-6; pangcd[1].gd.pos.width = 120; + pangcd[1].gd.flags = gg_visible | gg_enabled; + pangcd[1].gd.cid = CID_PanFamily; + pangcd[1].gd.u.list = panfamily; + pangcd[1].creator = GListButtonCreate; + + pangcd[2].gd.pos.x = 10; pangcd[2].gd.pos.y = pangcd[1].gd.pos.y+26+6; + panlabel[2].text = (unichar_t *) _STR_Serifs; + panlabel[2].text_in_resource = true; + pangcd[2].gd.label = &panlabel[2]; + pangcd[2].gd.flags = gg_visible | gg_enabled; + pangcd[2].creator = GLabelCreate; + + pangcd[3].gd.pos.x = 100; pangcd[3].gd.pos.y = pangcd[2].gd.pos.y-6; pangcd[3].gd.pos.width = 120; + pangcd[3].gd.flags = gg_visible | gg_enabled; + pangcd[3].gd.cid = CID_PanSerifs; + pangcd[3].gd.u.list = panserifs; + pangcd[3].creator = GListButtonCreate; + + pangcd[4].gd.pos.x = 10; pangcd[4].gd.pos.y = pangcd[3].gd.pos.y+26+6; + panlabel[4].text = (unichar_t *) _STR_Weight; + panlabel[4].text_in_resource = true; + pangcd[4].gd.label = &panlabel[4]; + pangcd[4].gd.flags = gg_visible | gg_enabled; + pangcd[4].creator = GLabelCreate; + + pangcd[5].gd.pos.x = 100; pangcd[5].gd.pos.y = pangcd[4].gd.pos.y-6; pangcd[5].gd.pos.width = 120; + pangcd[5].gd.flags = gg_visible | gg_enabled; + pangcd[5].gd.cid = CID_PanWeight; + pangcd[5].gd.u.list = panweight; + pangcd[5].creator = GListButtonCreate; + + pangcd[6].gd.pos.x = 10; pangcd[6].gd.pos.y = pangcd[5].gd.pos.y+26+6; + panlabel[6].text = (unichar_t *) _STR_Proportion; + panlabel[6].text_in_resource = true; + pangcd[6].gd.label = &panlabel[6]; + pangcd[6].gd.flags = gg_visible | gg_enabled; + pangcd[6].creator = GLabelCreate; + + pangcd[7].gd.pos.x = 100; pangcd[7].gd.pos.y = pangcd[6].gd.pos.y-6; pangcd[7].gd.pos.width = 120; + pangcd[7].gd.flags = gg_visible | gg_enabled; + pangcd[7].gd.cid = CID_PanProp; + pangcd[7].gd.u.list = panprop; + pangcd[7].creator = GListButtonCreate; + + pangcd[8].gd.pos.x = 10; pangcd[8].gd.pos.y = pangcd[7].gd.pos.y+26+6; + panlabel[8].text = (unichar_t *) _STR_Contrast; + panlabel[8].text_in_resource = true; + pangcd[8].gd.label = &panlabel[8]; + pangcd[8].gd.flags = gg_visible | gg_enabled; + pangcd[8].creator = GLabelCreate; + + pangcd[9].gd.pos.x = 100; pangcd[9].gd.pos.y = pangcd[8].gd.pos.y-6; pangcd[9].gd.pos.width = 120; + pangcd[9].gd.flags = gg_visible | gg_enabled; + pangcd[9].gd.cid = CID_PanContrast; + pangcd[9].gd.u.list = pancontrast; + pangcd[9].creator = GListButtonCreate; + + pangcd[10].gd.pos.x = 10; pangcd[10].gd.pos.y = pangcd[9].gd.pos.y+26+6; + panlabel[10].text = (unichar_t *) _STR_StrokeVar; + panlabel[10].text_in_resource = true; + pangcd[10].gd.label = &panlabel[10]; + pangcd[10].gd.flags = gg_visible | gg_enabled; + pangcd[10].creator = GLabelCreate; + + pangcd[11].gd.pos.x = 100; pangcd[11].gd.pos.y = pangcd[10].gd.pos.y-6; pangcd[11].gd.pos.width = 120; + pangcd[11].gd.flags = gg_visible | gg_enabled; + pangcd[11].gd.cid = CID_PanStrokeVar; + pangcd[11].gd.u.list = panstrokevar; + pangcd[11].creator = GListButtonCreate; + + pangcd[12].gd.pos.x = 10; pangcd[12].gd.pos.y = pangcd[11].gd.pos.y+26+6; + panlabel[12].text = (unichar_t *) _STR_ArmStyle; + panlabel[12].text_in_resource = true; + pangcd[12].gd.label = &panlabel[12]; + pangcd[12].gd.flags = gg_visible | gg_enabled; + pangcd[12].creator = GLabelCreate; + + pangcd[13].gd.pos.x = 100; pangcd[13].gd.pos.y = pangcd[12].gd.pos.y-6; pangcd[13].gd.pos.width = 120; + pangcd[13].gd.flags = gg_visible | gg_enabled; + pangcd[13].gd.cid = CID_PanArmStyle; + pangcd[13].gd.u.list = panarmstyle; + pangcd[13].creator = GListButtonCreate; + + pangcd[14].gd.pos.x = 10; pangcd[14].gd.pos.y = pangcd[13].gd.pos.y+26+6; + panlabel[14].text = (unichar_t *) _STR_Letterform; + panlabel[14].text_in_resource = true; + pangcd[14].gd.label = &panlabel[14]; + pangcd[14].gd.flags = gg_visible | gg_enabled; + pangcd[14].creator = GLabelCreate; + + pangcd[15].gd.pos.x = 100; pangcd[15].gd.pos.y = pangcd[14].gd.pos.y-6; pangcd[15].gd.pos.width = 120; + pangcd[15].gd.flags = gg_visible | gg_enabled; + pangcd[15].gd.cid = CID_PanLetterform; + pangcd[15].gd.u.list = panletterform; + pangcd[15].creator = GListButtonCreate; + + pangcd[16].gd.pos.x = 10; pangcd[16].gd.pos.y = pangcd[15].gd.pos.y+26+6; + panlabel[16].text = (unichar_t *) _STR_MidLine; + panlabel[16].text_in_resource = true; + pangcd[16].gd.label = &panlabel[16]; + pangcd[16].gd.flags = gg_visible | gg_enabled; + pangcd[16].creator = GLabelCreate; + + pangcd[17].gd.pos.x = 100; pangcd[17].gd.pos.y = pangcd[16].gd.pos.y-6; pangcd[17].gd.pos.width = 120; + pangcd[17].gd.flags = gg_visible | gg_enabled; + pangcd[17].gd.cid = CID_PanMidLine; + pangcd[17].gd.u.list = panmidline; + pangcd[17].creator = GListButtonCreate; + + pangcd[18].gd.pos.x = 10; pangcd[18].gd.pos.y = pangcd[17].gd.pos.y+26+6; + panlabel[18].text = (unichar_t *) _STR_XHeight; + panlabel[18].text_in_resource = true; + pangcd[18].gd.label = &panlabel[18]; + pangcd[18].gd.flags = gg_visible | gg_enabled; + pangcd[18].creator = GLabelCreate; + + pangcd[19].gd.pos.x = 100; pangcd[19].gd.pos.y = pangcd[18].gd.pos.y-6; pangcd[19].gd.pos.width = 120; + pangcd[19].gd.flags = gg_visible | gg_enabled; + pangcd[19].gd.cid = CID_PanXHeight; + pangcd[19].gd.u.list = panxheight; + pangcd[19].creator = GListButtonCreate; +/******************************************************************************/ + memset(&comlabel,0,sizeof(comlabel)); + memset(&comgcd,0,sizeof(comgcd)); + + comgcd[0].gd.pos.x = 10; comgcd[0].gd.pos.y = 10; + comgcd[0].gd.pos.width = ngcd[7].gd.pos.width; comgcd[0].gd.pos.height = 230; + comgcd[0].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + comgcd[0].gd.cid = CID_Comment; + comlabel[0].text = (unichar_t *) sf->comments; + comlabel[0].text_is_1byte = true; + if ( comlabel[0].text==NULL ) comlabel[0].text = (unichar_t *) ""; + comgcd[0].gd.label = &comlabel[0]; + comgcd[0].creator = GTextAreaCreate; +/******************************************************************************/ + memset(&atlabel,0,sizeof(atlabel)); + memset(&atgcd,0,sizeof(atgcd)); + + atgcd[0].gd.pos.x = 10; atgcd[0].gd.pos.y = 10; + atgcd[0].gd.pos.width = ngcd[7].gd.pos.width; atgcd[0].gd.pos.height = 200; + atgcd[0].gd.flags = gg_visible | gg_enabled | gg_list_alphabetic; + atgcd[0].gd.cid = CID_AnchorClasses; + atgcd[0].gd.u.list = AnchorClassesList(sf); + atgcd[0].gd.handle_controlevent = GFI_AnchorSelChanged; + atgcd[0].creator = GListCreate; + + atgcd[1].gd.pos.x = 10; atgcd[1].gd.pos.y = atgcd[0].gd.pos.y+atgcd[0].gd.pos.height+4; + atgcd[1].gd.pos.width = -1; + atgcd[1].gd.flags = gg_visible | gg_enabled; + atlabel[1].text = (unichar_t *) _STR_NewDDD_fem; + atlabel[1].text_in_resource = true; + atgcd[1].gd.label = &atlabel[1]; + atgcd[1].gd.cid = CID_AnchorNew; + atgcd[1].gd.handle_controlevent = GFI_AnchorNew; + atgcd[1].creator = GButtonCreate; + + atgcd[2].gd.pos.x = 20+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); atgcd[2].gd.pos.y = atgcd[1].gd.pos.y; + atgcd[2].gd.pos.width = -1; + atgcd[2].gd.flags = gg_visible; + atlabel[2].text = (unichar_t *) _STR_Delete; + atlabel[2].text_in_resource = true; + atgcd[2].gd.label = &atlabel[2]; + atgcd[2].gd.cid = CID_AnchorDel; + atgcd[2].gd.handle_controlevent = GFI_AnchorDel; + atgcd[2].creator = GButtonCreate; + + atgcd[3].gd.pos.x = -10; atgcd[3].gd.pos.y = atgcd[1].gd.pos.y; + atgcd[3].gd.pos.width = -1; + atgcd[3].gd.flags = gg_visible; + atlabel[3].text = (unichar_t *) _STR_EditDDD; + atlabel[3].text_in_resource = true; + atgcd[3].gd.label = &atlabel[3]; + atgcd[3].gd.cid = CID_AnchorRename; + atgcd[3].gd.handle_controlevent = GFI_AnchorRename; + atgcd[3].creator = GButtonCreate; + + atgcd[4].gd.pos.x = 10; atgcd[4].gd.pos.y = atgcd[1].gd.pos.y+30; + atgcd[4].gd.flags = gg_visible; + atlabel[4].text = (unichar_t *) _STR_ShowFirstMark; + atlabel[4].text_in_resource = true; + atgcd[4].gd.label = &atlabel[4]; + atgcd[4].gd.cid = CID_ShowMark; + atgcd[4].gd.handle_controlevent = GFI_AnchorShowMark; + atgcd[4].creator = GButtonCreate; + + atgcd[5].gd.pos.x = -10; atgcd[5].gd.pos.y = atgcd[4].gd.pos.y; + atgcd[5].gd.flags = gg_visible; + atlabel[5].text = (unichar_t *) _STR_ShowFirstBase; + atlabel[5].text_in_resource = true; + atgcd[5].gd.label = &atlabel[5]; + atgcd[5].gd.cid = CID_ShowBase; + atgcd[5].gd.handle_controlevent = GFI_AnchorShowBase; + atgcd[5].creator = GButtonCreate; + +/******************************************************************************/ + memset(&txlabel,0,sizeof(txlabel)); + memset(&txgcd,0,sizeof(txgcd)); + + k=0; + txlabel[k].text = (unichar_t *) _STR_TeXText; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.pos.x = 10; txgcd[k].gd.pos.y = 10; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.cid = CID_TeXText; + txgcd[k].gd.handle_controlevent = GFI_TeXChanged; + txgcd[k++].creator = GRadioCreate; + + txlabel[k].text = (unichar_t *) _STR_TeXMath; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.pos.x = 80; txgcd[k].gd.pos.y = txgcd[k-1].gd.pos.y; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.cid = CID_TeXMath; + txgcd[k].gd.handle_controlevent = GFI_TeXChanged; + txgcd[k++].creator = GRadioCreate; + + txlabel[k].text = (unichar_t *) _STR_TeXMathExt; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.pos.x = 150; txgcd[k].gd.pos.y = txgcd[k-1].gd.pos.y; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.cid = CID_TeXMathExt; + txgcd[k].gd.handle_controlevent = GFI_TeXChanged; + txgcd[k++].creator = GRadioCreate; + + txlabel[k].text = (unichar_t *) _STR_DesignSize; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.pos.x = 10; txgcd[k].gd.pos.y = txgcd[k-2].gd.pos.y+26; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.popup_msg = GStringGetResource(_STR_DesignSizePopup,NULL); + txgcd[k++].creator = GLabelCreate; + + txgcd[k].gd.pos.x = 70; txgcd[k].gd.pos.y = txgcd[k-1].gd.pos.y-4; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.cid = CID_DesignSize; + txgcd[k++].creator = GTextFieldCreate; + + for ( i=0; texparams[i]!=0; ++i ) { + txlabel[k].text = (unichar_t *) texparams[i]; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.pos.x = 10; txgcd[k].gd.pos.y = txgcd[k-2].gd.pos.y+26; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.popup_msg = GStringGetResource(texpopups[i],NULL); + txgcd[k++].creator = GLabelCreate; + + txgcd[k].gd.pos.x = 70; txgcd[k].gd.pos.y = txgcd[k-1].gd.pos.y-4; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.cid = CID_TeX + i; + txgcd[k++].creator = GTextFieldCreate; + } + txgcd[k-2].gd.cid = CID_TeXExtraSpLabel; + + txlabel[k].text = (unichar_t *) _STR_MoreParams; + txlabel[k].text_in_resource = true; + txgcd[k].gd.label = &txlabel[k]; + txgcd[k].gd.pos.x = 20; txgcd[k].gd.pos.y = txgcd[k-1].gd.pos.y+26; + txgcd[k].gd.flags = gg_visible | gg_enabled; + txgcd[k].gd.handle_controlevent = GFI_MoreParams; + txgcd[k].gd.cid = CID_MoreParams; + txgcd[k++].creator = GButtonCreate; + +/******************************************************************************/ + memset(&csublabel,0,sizeof(csublabel)); + memset(&csubgcd,0,sizeof(csubgcd)); + memset(&congcd,0,sizeof(congcd)); + memset(&conaspects,'\0',sizeof(conaspects)); + + for ( i=0; imacstyle==-1) ? (gg_visible | gg_enabled | gg_cb_on) : (gg_visible | gg_enabled); + mcgcd[k].gd.cid = CID_MacAutomatic; + mcgcd[k].gd.handle_controlevent = GFI_MacAutomatic; + mcgcd[k++].creator = GRadioCreate; + + mcgcd[k].gd.pos.x = 90; mcgcd[k].gd.pos.y = 20; + mcgcd[k].gd.flags = (sf->macstyle!=-1) ? (gg_visible | gg_enabled | gg_cb_on) : (gg_visible | gg_enabled); + mcgcd[k].gd.handle_controlevent = GFI_MacAutomatic; + mcgcd[k++].creator = GRadioCreate; + + mcgcd[k].gd.pos.x = 110; mcgcd[k].gd.pos.y = 20; + mcgcd[k].gd.pos.width = 120; mcgcd[k].gd.pos.height = 7*12+10; + mcgcd[k].gd.flags = (sf->macstyle==-1) ? (gg_visible | gg_list_multiplesel) : (gg_visible | gg_enabled | gg_list_multiplesel); + mcgcd[k].gd.cid = CID_MacStyles; + mcgcd[k].gd.u.list = macstyles; + mcgcd[k++].creator = GListCreate; + + mcs = MacStyleCode(sf,NULL); + for ( i=0; macstyles[i].text!=NULL; ++i ) + macstyles[i].selected = (mcs&(int) (intpt) macstyles[i].userdata)? 1 : 0; + +/******************************************************************************/ + memset(&smsublabel,0,sizeof(smsublabel)); + memset(&smsubgcd,0,sizeof(smsubgcd)); + memset(&smgcd,0,sizeof(smgcd)); + memset(&smaspects,'\0',sizeof(smaspects)); + + for ( i=0; i<4; ++i ) { + smaspects[i].text = (unichar_t *) smnames[i]; + smaspects[i].text_in_resource = true; + smaspects[i].gcd = smsubgcd[i]; + + smsubgcd[i][0].gd.pos.x = 10; smsubgcd[i][0].gd.pos.y = 10; + smsubgcd[i][0].gd.pos.width = ngcd[7].gd.pos.width; + smsubgcd[i][0].gd.pos.height = 150; + smsubgcd[i][0].gd.flags = gg_visible | gg_enabled; + smsubgcd[i][0].gd.cid = CID_SMList+i*100; + smsubgcd[i][0].gd.u.list = SMList(sf,smtypes[i]); + smsubgcd[i][0].gd.handle_controlevent = GFI_SMSelChanged; + smsubgcd[i][0].creator = GListCreate; + + smsubgcd[i][1].gd.pos.x = 10; smsubgcd[i][1].gd.pos.y = smsubgcd[i][0].gd.pos.y+smsubgcd[i][0].gd.pos.height+4; + smsubgcd[i][1].gd.pos.width = -1; + smsubgcd[i][1].gd.flags = gg_visible | gg_enabled; + smsublabel[i][1].text = (unichar_t *) _STR_NewDDD; + smsublabel[i][1].text_in_resource = true; + smsubgcd[i][1].gd.label = &smsublabel[i][1]; + smsubgcd[i][1].gd.cid = CID_SMNew+i*100; + smsubgcd[i][1].gd.handle_controlevent = GFI_SMNew; + smsubgcd[i][1].creator = GButtonCreate; + + smsubgcd[i][2].gd.pos.x = 10+(smsubgcd[i][0].gd.pos.width-GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor))/2; smsubgcd[i][2].gd.pos.y = smsubgcd[i][1].gd.pos.y; + smsubgcd[i][2].gd.pos.width = -1; + smsubgcd[i][2].gd.flags = gg_visible; + smsublabel[i][2].text = (unichar_t *) _STR_Delete; + smsublabel[i][2].text_in_resource = true; + smsubgcd[i][2].gd.label = &smsublabel[i][2]; + smsubgcd[i][2].gd.cid = CID_SMDel+i*100; + smsubgcd[i][2].gd.handle_controlevent = GFI_SMDel; + smsubgcd[i][2].creator = GButtonCreate; + + smsubgcd[i][3].gd.pos.x = 10+(smsubgcd[i][0].gd.pos.width-GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor)); smsubgcd[i][3].gd.pos.y = smsubgcd[i][1].gd.pos.y; + smsubgcd[i][3].gd.pos.width = -1; + smsubgcd[i][3].gd.flags = gg_visible; + smsublabel[i][3].text = (unichar_t *) _STR_EditDDD; + smsublabel[i][3].text_in_resource = true; + smsubgcd[i][3].gd.label = &smsublabel[i][3]; + smsubgcd[i][3].gd.cid = CID_SMEdit+i*100; + smsubgcd[i][3].gd.handle_controlevent = GFI_SMEdit; + smsubgcd[i][3].creator = GButtonCreate; + + if ( i==1 ) { + smsubgcd[i][4].gd.pos.x = 10; smsubgcd[i][4].gd.pos.y = smsubgcd[i][1].gd.pos.y+30; + smsubgcd[i][4].gd.flags = SFAnyConvertableSM(sf) ? gg_visible | gg_enabled : gg_visible; + smsublabel[i][4].text = (unichar_t *) _STR_ConvertFromOpenType; + smsublabel[i][4].text_in_resource = true; + smsubgcd[i][4].gd.label = &smsublabel[i][4]; + smsubgcd[i][4].gd.handle_controlevent = GFI_SMConvert; + smsubgcd[i][4].creator = GButtonCreate; + } + } + + smaspects[1].selected = true; /* Contextual glyph subs is most likely to be used, so select it by default */ + + smgcd[0].gd.pos.x = 4; smgcd[0].gd.pos.y = 10; + smgcd[0].gd.pos.width = 250; + smgcd[0].gd.pos.height = 260; + smgcd[0].gd.u.tabs = smaspects; + smgcd[0].gd.flags = gg_visible | gg_enabled; + /*smgcd[0].gd.handle_controlevent = GFI_AspectChange;*/ + smgcd[0].creator = GTabSetCreate; + +/******************************************************************************/ + memset(&mfgcd,0,sizeof(mfgcd)); + memset(&mflabel,'\0',sizeof(mflabel)); + + GCDFillMacFeat(mfgcd,mflabel,250,sf->features, false); + +/******************************************************************************/ + + memset(&mlabel,0,sizeof(mlabel)); + memset(&mgcd,0,sizeof(mgcd)); + memset(&aspects,'\0',sizeof(aspects)); + + i = 0; + + aspects[i].text = (unichar_t *) _STR_Names; + d->old_aspect = 0; + aspects[i].text_in_resource = true; + aspects[i++].gcd = ngcd; + + aspects[i].text = (unichar_t *) _STR_Encoding2; + aspects[i].text_in_resource = true; + aspects[i++].gcd = egcd; + + aspects[i].text = (unichar_t *) _STR_PSGeneral; + aspects[i].text_in_resource = true; + aspects[i++].gcd = psgcd; + + d->private_aspect = i; + aspects[i].text = (unichar_t *) _STR_PSPrivate; + aspects[i].text_in_resource = true; + aspects[i++].gcd = pgcd; + + d->ttfv_aspect = i; + aspects[i].text = (unichar_t *) _STR_TTFValues; + aspects[i].text_in_resource = true; + aspects[i++].gcd = vgcd; + + d->tn_aspect = i; + aspects[i].text = (unichar_t *) _STR_TTFNames; + aspects[i].text_in_resource = true; + aspects[i++].gcd = tngcd; + + d->panose_aspect = i; + aspects[i].text = (unichar_t *) _STR_Panose; + aspects[i].text_in_resource = true; + aspects[i++].gcd = pangcd; + + d->tx_aspect = i; + aspects[i].text = (unichar_t *) _STR_TeX; + aspects[i].text_in_resource = true; + aspects[i++].gcd = txgcd; + + aspects[i].text = (unichar_t *) _STR_Comment; + aspects[i].text_in_resource = true; + aspects[i++].gcd = comgcd; + + aspects[i].text = (unichar_t *) _STR_AnchorClass; + aspects[i].text_in_resource = true; + aspects[i++].gcd = atgcd; + + aspects[i].text = (unichar_t *) _STR_Contextual; + aspects[i].text_in_resource = true; + aspects[i++].gcd = congcd; + + aspects[i].text = (unichar_t *) _STR_Mac; + aspects[i].text_in_resource = true; + aspects[i++].gcd = mcgcd; + + aspects[i].text = (unichar_t *) _STR_MacFeatures; + aspects[i].text_in_resource = true; + aspects[i++].gcd = mfgcd; + + aspects[i].text = (unichar_t *) _STR_MacStateMachine; + aspects[i].text_in_resource = true; + aspects[i++].gcd = smgcd; + + aspects[defaspect].selected = true; + + mgcd[0].gd.pos.x = 4; mgcd[0].gd.pos.y = 6; + mgcd[0].gd.pos.width = 260; + mgcd[0].gd.pos.height = 325; + mgcd[0].gd.u.tabs = aspects; + mgcd[0].gd.flags = gg_visible | gg_enabled; + mgcd[0].gd.handle_controlevent = GFI_AspectChange; + mgcd[0].creator = GTabSetCreate; + + mgcd[1].gd.pos.x = 30-3; mgcd[1].gd.pos.y = GDrawPixelsToPoints(NULL,pos.height)-35-3; + mgcd[1].gd.pos.width = -1; mgcd[1].gd.pos.height = 0; + mgcd[1].gd.flags = gg_visible | gg_enabled | gg_but_default; + mlabel[1].text = (unichar_t *) _STR_OK; + mlabel[1].text_in_resource = true; + mgcd[1].gd.label = &mlabel[1]; + mgcd[1].gd.handle_controlevent = GFI_OK; + mgcd[1].creator = GButtonCreate; + + mgcd[2].gd.pos.x = -30; mgcd[2].gd.pos.y = mgcd[1].gd.pos.y+3; + mgcd[2].gd.pos.width = -1; mgcd[2].gd.pos.height = 0; + mgcd[2].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + mlabel[2].text = (unichar_t *) _STR_Cancel; + mlabel[2].text_in_resource = true; + mgcd[2].gd.label = &mlabel[2]; + mgcd[2].gd.handle_controlevent = GFI_Cancel; + mgcd[2].creator = GButtonCreate; + + mgcd[3].gd.pos.x = 2; mgcd[3].gd.pos.y = 2; + mgcd[3].gd.pos.width = pos.width-4; mgcd[3].gd.pos.height = pos.height-4; + mgcd[3].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + mgcd[3].creator = GGroupCreate; + + GGadgetsCreate(gw,mgcd); + memset(&rq,0,sizeof(rq)); + rq.family_name = monospace; + rq.point_size = 12; + rq.weight = 400; + font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GGadgetSetFont(atgcd[0].ret,font); + if ( list!=encodingtypes ) + GTextInfoListFree(list); + GTextInfoListFree(pgcd[0].gd.u.list); + GTextInfoListFree(atgcd[0].gd.u.list); + if ( GTabSetGetTabLines(mgcd[0].ret)>3 ) { + int offset = (GTabSetGetTabLines(mgcd[0].ret)-2)*GDrawPointsToPixels(NULL,20); + GRect temp; + GDrawResize(gw,pos.width,pos.height+offset); + GGadgetResize(mgcd[0].ret,GDrawPointsToPixels(NULL,mgcd[0].gd.pos.width), + GDrawPointsToPixels(NULL,mgcd[0].gd.pos.height)+offset); + GGadgetMove(mgcd[1].ret,GDrawPointsToPixels(NULL,mgcd[1].gd.pos.x), + GDrawPointsToPixels(NULL,mgcd[1].gd.pos.y)+offset); + GGadgetGetSize(mgcd[2].ret,&temp); + GGadgetMove(mgcd[2].ret,temp.x, temp.y+offset); + GGadgetResize(mgcd[3].ret,GDrawPointsToPixels(NULL,mgcd[3].gd.pos.width), + GDrawPointsToPixels(NULL,mgcd[3].gd.pos.height)+offset); + } + GWidgetIndicateFocusGadget(ngcd[1].ret); + ProcessListSel(d); + GFI_AspectChange(mgcd[0].ret,NULL); + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + + if ( sync ) { + while ( !d->done ) + GDrawProcessOneEvent(NULL); + } +} + +void FontMenuFontInfo(void *_fv) { + FontInfo( ((FontView *) _fv)->sf,-1,false); +} + +void FontInfoDestroy(FontView *fv) { + if ( fv->fontinfo ) + GFI_CancelClose( (struct gfi_data *) (fv->fontinfo) ); +} diff --git a/fontforge/fontview.c b/fontforge/fontview.c new file mode 100644 index 00000000..6148bdeb --- /dev/null +++ b/fontforge/fontview.c @@ -0,0 +1,6562 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "psfont.h" +#include +#include +#include +#include +#include +#include +#include +#include + +int onlycopydisplayed = 0; +int copymetadata = 0; + +#define XOR_COLOR 0x505050 +#define FV_LAB_HEIGHT 15 + +#ifdef BIGICONS +#define fontview_width 32 +#define fontview_height 32 +static unsigned char fontview_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x02, 0x20, 0x80, 0x00, + 0x82, 0x20, 0x86, 0x08, 0x42, 0x21, 0x8a, 0x14, 0xc2, 0x21, 0x86, 0x04, + 0x42, 0x21, 0x8a, 0x14, 0x42, 0x21, 0x86, 0x08, 0x02, 0x20, 0x80, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x20, 0x80, 0x00, 0x82, 0xa0, 0x8f, 0x18, + 0x82, 0x20, 0x91, 0x24, 0x42, 0x21, 0x91, 0x02, 0x42, 0x21, 0x91, 0x02, + 0x22, 0x21, 0x8f, 0x02, 0xe2, 0x23, 0x91, 0x02, 0x12, 0x22, 0x91, 0x02, + 0x3a, 0x27, 0x91, 0x24, 0x02, 0xa0, 0x8f, 0x18, 0x02, 0x20, 0x80, 0x00, + 0xfe, 0xff, 0xff, 0xff, 0x02, 0x20, 0x80, 0x00, 0x42, 0x20, 0x86, 0x18, + 0xa2, 0x20, 0x8a, 0x04, 0xa2, 0x20, 0x86, 0x08, 0xa2, 0x20, 0x8a, 0x10, + 0x42, 0x20, 0x8a, 0x0c, 0x82, 0x20, 0x80, 0x00, 0x02, 0x20, 0x80, 0x00, + 0xaa, 0xaa, 0xaa, 0xaa, 0x02, 0x20, 0x80, 0x00}; +#else +#define fontview2_width 16 +#define fontview2_height 16 +static unsigned char fontview2_bits[] = { + 0x00, 0x07, 0x80, 0x08, 0x40, 0x17, 0x40, 0x15, 0x60, 0x09, 0x10, 0x02, + 0xa0, 0x01, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x50, 0x00, 0x52, 0x00, + 0x55, 0x00, 0x5d, 0x00, 0x22, 0x00, 0x1c, 0x00}; +#endif + +extern int _GScrollBar_Width; + +int default_fv_font_size = 24, default_fv_antialias=true, + default_fv_bbsized=true, + default_fv_showhmetrics=false, default_fv_showvmetrics=false; +#define METRICS_BASELINE 0x0000c0 +#define METRICS_ORIGIN 0xc00000 +#define METRICS_ADVANCE 0x008000 +FontView *fv_list=NULL; + +void FVToggleCharChanged(SplineChar *sc) { + int i, j; + int pos; + FontView *fv; + + fv = sc->parent->fv; + if ( fv==NULL ) /* Can happen when loading bitmaps, we might not have an fv yet */ +return; + if ( fv->sf!=sc->parent ) /* Can happen in CID fonts if char's parent is not currently active */ +return; + if ( fv->v==NULL || fv->colcnt==0 ) /* Can happen in scripts */ +return; + for ( ; fv!=NULL ; fv = fv->nextsame ) { + pos = sc->enc; + if ( fv->mapping!=NULL ) { + for ( i=0; imapcnt; ++i ) + if ( fv->mapping[i]==pos ) + break; + if ( i==fv->mapcnt ) /* Not currently displayed */ + continue; + pos = i; + } + i = pos / fv->colcnt; + j = pos - i*fv->colcnt; + i -= fv->rowoff; + if ( i>=0 && irowcnt ) { + GRect r; + r.x = j*fv->cbw+1; r.width = fv->cbw-1; + r.y = i*fv->cbh+1; r.height = FV_LAB_HEIGHT-1; + GDrawSetXORBase(fv->v,GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(fv->v))); + GDrawSetXORMode(fv->v); + GDrawFillRect(fv->v,&r,0x000000); + GDrawSetCopyMode(fv->v); + } + } +} + +static void FVToggleCharSelected(FontView *fv,int enc) { + int i, j; + + if ( fv->v==NULL || fv->colcnt==0 ) /* Can happen in scripts */ +return; + + i = enc / fv->colcnt; + j = enc - i*fv->colcnt; + i -= fv->rowoff; + if ( i>=0 && irowcnt ) { + GRect r; + r.x = j*fv->cbw+1; r.width = fv->cbw-1; + r.y = i*fv->cbh+FV_LAB_HEIGHT+1; r.height = fv->cbw; + GDrawSetXORBase(fv->v,GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(fv->v))); + GDrawSetXORMode(fv->v); + GDrawFillRect(fv->v,&r,XOR_COLOR); + GDrawSetCopyMode(fv->v); + } +} + +void FVDeselectAll(FontView *fv) { + int i; + + for ( i=0; isf->charcnt; ++i ) { + if ( fv->selected[i] ) { + fv->selected[i] = false; + FVToggleCharSelected(fv,i); + } + } + fv->sel_index = 0; +} + +static void FVSelectAll(FontView *fv) { + int i; + + for ( i=0; isf->charcnt; ++i ) { + if ( !fv->selected[i] ) { + fv->selected[i] = true; + FVToggleCharSelected(fv,i); + } + } + fv->sel_index = 1; +} + +static void FVSelectColor(FontView *fv, uint32 col, int door) { + int i, any=0; + uint32 sccol; + SplineChar **chars = fv->sf->chars; + + for ( i=0; isf->charcnt; ++i ) { + sccol = ( chars[i]==NULL ) ? COLOR_DEFAULT : chars[i]->color; + if ( (door && !fv->selected[i] && sccol==col) || + (!door && fv->selected[i]!=(sccol==col)) ) { + fv->selected[i] = !fv->selected[i]; + if ( fv->selected[i] ) any = true; + FVToggleCharSelected(fv,i); + } + } + fv->sel_index = any; +} + +static void FVReselect(FontView *fv, int newpos) { + int i, start, end; + + start = fv->pressed_pos; end = fv->end_pos; + + if ( fv->pressed_posend_pos ) { + if ( newpos>fv->end_pos ) { + for ( i=fv->end_pos+1; i<=newpos; ++i ) if ( !fv->selected[i] ) { + fv->selected[i] = fv->sel_index; + FVToggleCharSelected(fv,i); + } + } else if ( newpospressed_pos ) { + for ( i=fv->end_pos; i>fv->pressed_pos; --i ) if ( fv->selected[i] ) { + fv->selected[i] = false; + FVToggleCharSelected(fv,i); + } + for ( i=fv->pressed_pos-1; i>=newpos; --i ) if ( !fv->selected[i] ) { + fv->selected[i] = fv->sel_index; + FVToggleCharSelected(fv,i); + } + } else { + for ( i=fv->end_pos; i>newpos; --i ) if ( fv->selected[i] ) { + fv->selected[i] = false; + FVToggleCharSelected(fv,i); + } + } + } else { + if ( newposend_pos ) { + for ( i=fv->end_pos-1; i>=newpos; --i ) if ( !fv->selected[i] ) { + fv->selected[i] = fv->sel_index; + FVToggleCharSelected(fv,i); + } + } else if ( newpos>fv->pressed_pos ) { + for ( i=fv->end_pos; ipressed_pos; ++i ) if ( fv->selected[i] ) { + fv->selected[i] = false; + FVToggleCharSelected(fv,i); + } + for ( i=fv->pressed_pos+1; i<=newpos; ++i ) if ( !fv->selected[i] ) { + fv->selected[i] = fv->sel_index; + FVToggleCharSelected(fv,i); + } + } else { + for ( i=fv->end_pos; iselected[i] ) { + fv->selected[i] = false; + FVToggleCharSelected(fv,i); + } + } + } + fv->end_pos = newpos; + if ( newpos>=0 && newpossf->charcnt && fv->sf->chars[newpos]!=NULL && + fv->sf->chars[newpos]->unicodeenc>=0 && fv->sf->chars[newpos]->unicodeenc<0x10000 ) + GInsCharSetChar(fv->sf->chars[newpos]->unicodeenc); +} + +static void _SplineFontSetUnChanged(SplineFont *sf) { + int i, was = sf->changed; + BDFFont *bdf; + + sf->changed = false; + SFClearAutoSave(sf); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->changed ) { + sf->chars[i]->changed = false; + SCRefreshTitles(sf->chars[i]); + } + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) + bdf->chars[i]->changed = false; + if ( was && sf->fv!=NULL && sf->fv->v!=NULL ) + GDrawRequestExpose(sf->fv->v,NULL,false); + for ( i=0; isubfontcnt; ++i ) + _SplineFontSetUnChanged(sf->subfonts[i]); +} + +void SplineFontSetUnChanged(SplineFont *sf) { + int i; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( sf->mm!=NULL ) sf = sf->mm->normal; + _SplineFontSetUnChanged(sf); + if ( sf->mm!=NULL ) + for ( i=0; imm->instance_count; ++i ) + _SplineFontSetUnChanged(sf->mm->instances[i]); +} + +static void FVFlattenAllBitmapSelections(FontView *fv) { + BDFFont *bdf; + int i; + + for ( bdf = fv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + for ( i=0; icharcnt; ++i ) + if ( bdf->chars[i]!=NULL && bdf->chars[i]->selection!=NULL ) + BCFlattenFloat(bdf->chars[i]); + } +} + +static int AskChanged(SplineFont *sf) { + unichar_t ubuf[300]; + int ret; + static int buts[] = { _STR_Save, _STR_Dontsave, _STR_Cancel, 0 }; + char *filename, *fontname; + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + + filename = sf->filename; + fontname = sf->fontname; + + if ( filename==NULL && sf->origname!=NULL && + sf->onlybitmaps && sf->bitmaps!=NULL && sf->bitmaps->next==NULL ) + filename = sf->origname; + if ( filename==NULL ) filename = "untitled.sfd"; + filename = GFileNameTail(filename); + u_strcpy(ubuf, GStringGetResource( _STR_Fontchangepre,NULL )); + uc_strncat(ubuf,fontname, 70); + u_strcat(ubuf, GStringGetResource( _STR_Fontchangemid,NULL )); + uc_strncat(ubuf,filename, 70); + u_strcat(ubuf, GStringGetResource( _STR_Fontchangepost,NULL )); + ret = GWidgetAskR_( _STR_Fontchange,buts,0,2,ubuf); +return( ret ); +} + +static int RevertAskChanged(char *fontname,char *filename) { + unichar_t ubuf[350]; + int ret; + static int buts[] = { _STR_Revert, _STR_Cancel, 0 }; + + if ( filename==NULL ) filename = "untitled.sfd"; + filename = GFileNameTail(filename); + u_strcpy(ubuf, GStringGetResource( _STR_Fontchangepre,NULL )); + uc_strncat(ubuf,fontname, 70); + u_strcat(ubuf, GStringGetResource( _STR_Fontchangemid,NULL )); + uc_strncat(ubuf,filename, 70); + u_strcat(ubuf, GStringGetResource( _STR_Fontchangerevertpost,NULL )); + ret = GWidgetAskR_( _STR_Fontchange,buts,0,1,ubuf); +return( ret==0 ); +} + +int _FVMenuGenerate(FontView *fv,int family) { + FVFlattenAllBitmapSelections(fv); +return( SFGenerateFont(fv->sf,family) ); +} + +static void FVMenuGenerate(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + _FVMenuGenerate(fv,false); +} + +static void FVMenuGenerateFamily(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + _FVMenuGenerate(fv,true); +} + +int _FVMenuSaveAs(FontView *fv) { + unichar_t *temp; + unichar_t *ret; + char *filename; + int ok; + + if ( fv->cidmaster!=NULL && fv->cidmaster->filename!=NULL ) + temp=def2u_copy(fv->cidmaster->filename); + else if ( fv->sf->mm!=NULL && fv->sf->mm->normal->filename!=NULL ) + temp=def2u_copy(fv->sf->mm->normal->filename); + else if ( fv->sf->filename!=NULL ) + temp=def2u_copy(fv->sf->filename); + else { + SplineFont *sf = fv->cidmaster?fv->cidmaster:fv->sf; + temp = galloc(sizeof(unichar_t)*(strlen(sf->fontname)+8)); + uc_strcpy(temp,sf->fontname); + uc_strcat(temp,".sfd"); + } + ret = GWidgetSaveAsFile(GStringGetResource(_STR_Saveas,NULL),temp,NULL,NULL,NULL); + free(temp); + if ( ret==NULL ) +return( 0 ); + filename = u2def_copy(ret); + free(ret); + FVFlattenAllBitmapSelections(fv); + ok = SFDWrite(filename,fv->sf); + if ( ok ) { + SplineFont *sf = fv->cidmaster?fv->cidmaster:fv->sf->mm!=NULL?fv->sf->mm->normal:fv->sf; + free(sf->filename); + sf->filename = filename; + free(sf->origname); + sf->origname = copy(filename); + sf->new = false; + if ( sf->mm!=NULL ) { + int i; + for ( i=0; imm->instance_count; ++i ) { + free(sf->mm->instances[i]->filename); + sf->mm->instances[i]->filename = filename; + free(sf->mm->instances[i]->origname); + sf->mm->instances[i]->origname = copy(filename); + sf->mm->instances[i]->new = false; + } + } + SplineFontSetUnChanged(sf); + FVSetTitle(fv); + } else + free(filename); +return( ok ); +} + +static void FVMenuSaveAs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + _FVMenuSaveAs(fv); +} + +int _FVMenuSave(FontView *fv) { + int ret = 0; + SplineFont *sf = fv->cidmaster?fv->cidmaster: + fv->sf->mm!=NULL?fv->sf->mm->normal: + fv->sf; + +#if 0 /* This seems inconsistant with normal behavior. Removed 6 Feb '04 */ + if ( sf->filename==NULL && sf->origname!=NULL && + sf->onlybitmaps && sf->bitmaps!=NULL && sf->bitmaps->next==NULL ) { + /* If it's a single bitmap font then just save back to the bdf file */ + FVFlattenAllBitmapSelections(fv); + ret = BDFFontDump(sf->origname,sf->bitmaps,EncodingName(sf->encoding_name),sf->bitmaps->res); + if ( ret ) + SplineFontSetUnChanged(sf); + } else +#endif + if ( sf->filename==NULL ) + ret = _FVMenuSaveAs(fv); + else { + FVFlattenAllBitmapSelections(fv); + if ( !SFDWriteBak(sf) ) + GWidgetErrorR(_STR_SaveFailed,_STR_SaveFailed); + else { + SplineFontSetUnChanged(sf); + ret = true; + } + } +return( ret ); +} + +static void FVMenuSave(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + _FVMenuSave(fv); +} + +void _FVCloseWindows(FontView *fv) { + int i, j; + BDFFont *bdf; + MetricsView *mv, *mnext; + SplineFont *sf = fv->cidmaster?fv->cidmaster:fv->sf->mm!=NULL?fv->sf->mm->normal : fv->sf; + + if ( fv->nextsame==NULL && fv->sf->fv==fv && fv->sf->kcld!=NULL ) + KCLD_End(fv->sf->kcld); + if ( fv->nextsame==NULL && fv->sf->fv==fv && fv->sf->vkcld!=NULL ) + KCLD_End(fv->sf->vkcld); + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + CharView *cv, *next; + for ( cv = sf->chars[i]->views; cv!=NULL; cv = next ) { + next = cv->next; + GDrawDestroyWindow(cv->gw); + } + if ( sf->chars[i]->charinfo ) + CharInfoDestroy(sf->chars[i]->charinfo); + } + if ( sf->mm!=NULL ) { + MMSet *mm = sf->mm; + for ( j=0; jinstance_count; ++j ) { + SplineFont *sf = mm->instances[j]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + CharView *cv, *next; + for ( cv = sf->chars[i]->views; cv!=NULL; cv = next ) { + next = cv->next; + GDrawDestroyWindow(cv->gw); + } + if ( sf->chars[i]->charinfo ) + CharInfoDestroy(sf->chars[i]->charinfo); + } + } + } else if ( sf->subfontcnt!=0 ) { + for ( j=0; jsubfontcnt; ++j ) { + for ( i=0; isubfonts[j]->charcnt; ++i ) if ( sf->subfonts[j]->chars[i]!=NULL ) { + CharView *cv, *next; + for ( cv = sf->subfonts[j]->chars[i]->views; cv!=NULL; cv = next ) { + next = cv->next; + GDrawDestroyWindow(cv->gw); + } + } + } + } + for ( bdf = sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + BitmapView *bv, *next; + for ( bv = bdf->chars[i]->views; bv!=NULL; bv = next ) { + next = bv->next; + GDrawDestroyWindow(bv->gw); + } + } + } + for ( mv=fv->metrics; mv!=NULL; mv = mnext ) { + mnext = mv->next; + GDrawDestroyWindow(mv->gw); + } + if ( fv->fontinfo!=NULL ) + FontInfoDestroy(fv); + SVDetachFV(fv); +} + +static int SFAnyChanged(SplineFont *sf) { + if ( sf->mm!=NULL ) { + MMSet *mm = sf->mm; + int i; + if ( mm->changed ) +return( true ); + for ( i=0; iinstance_count; ++i ) + if ( sf->mm->instances[i]->changed ) +return( true ); + /* Changes to the blended font aren't real */ +return( false ); + } else +return( sf->changed ); +} + +static int _FVMenuClose(FontView *fv) { + int i; + SplineFont *sf = fv->cidmaster?fv->cidmaster:fv->sf; + + if ( !SFCloseAllInstrs(fv->sf) ) +return( false ); + + if ( fv->nextsame!=NULL || fv->sf->fv!=fv ) { + /* There's another view, can close this one with no problems */ + } else if ( SFAnyChanged(sf) ) { + i = AskChanged(fv->sf); + if ( i==2 ) /* Cancel */ +return( false ); + if ( i==0 && !_FVMenuSave(fv)) /* Save */ +return(false); + else + SFClearAutoSave(sf); /* if they didn't save it, remove change record */ + } + _FVCloseWindows(fv); + if ( sf->filename!=NULL ) + RecentFilesRemember(sf->filename); + GDrawDestroyWindow(fv->gw); +return( true ); +} + +void MenuNew(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontNew(); +} + +static void FVMenuClose(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + DelayEvent((void (*)(void *)) _FVMenuClose, fv); +} + +static void FVReattachCVs(SplineFont *old,SplineFont *new) { + int i, j, enc; + CharView *cv, *cvnext; + SplineFont *sub; + + for ( i=0; icharcnt; ++i ) { + if ( old->chars[i]!=NULL && old->chars[i]->views!=NULL ) { + if ( new->subfontcnt==0 ) { + enc = SFFindExistingChar(new,old->chars[i]->unicodeenc,old->chars[i]->name); + sub = new; + } else { + enc = -1; + for ( j=0; jsubfontcnt && enc==-1 ; ++j ) { + sub = new->subfonts[j]; + enc = SFFindExistingChar(sub,old->chars[i]->unicodeenc,old->chars[i]->name); + } + } + if ( enc==-1 ) { + for ( cv=old->chars[i]->views; cv!=NULL; cv = cvnext ) { + cvnext = cv->next; + GDrawDestroyWindow(cv->gw); + } + } else { + for ( cv=old->chars[i]->views; cv!=NULL; cv = cvnext ) { + cvnext = cv->next; + CVChangeSC(cv,sub->chars[enc]); + cv->layerheads[dm_grid] = &new->grid; + } + } + GDrawProcessPendingEvents(NULL); + } + } +} + +void FVRevert(FontView *fv) { + SplineFont *temp, *old = fv->cidmaster?fv->cidmaster:fv->sf; + BDFFont *tbdf, *fbdf; + BDFChar *bc; + BitmapView *bv, *bvnext; + MetricsView *mv, *mvnext; + int i, enc; + FontView *fvs; + + if ( old->origname==NULL ) +return; + if ( old->changed ) + if ( !RevertAskChanged(old->fontname,old->origname)) +return; + temp = ReadSplineFont(old->origname,0); + if ( temp==NULL ) { +return; + } + FVReattachCVs(old,temp); + for ( i=0; isubfontcnt; ++i ) + FVReattachCVs(old->subfonts[i],temp); + for ( fbdf=old->bitmaps; fbdf!=NULL; fbdf=fbdf->next ) { + for ( tbdf=temp->bitmaps; tbdf!=NULL; tbdf=tbdf->next ) + if ( tbdf->pixelsize==fbdf->pixelsize ) + break; + for ( i=0; isf->charcnt; ++i ) { + if ( fbdf->chars[i]!=NULL && fbdf->chars[i]->views!=NULL ) { + enc = SFFindChar(temp,fv->sf->chars[i]->unicodeenc,fv->sf->chars[i]->name); + bc = enc==-1 || tbdf==NULL?NULL:tbdf->chars[enc]; + if ( bc==NULL ) { + for ( bv=fbdf->chars[i]->views; bv!=NULL; bv = bvnext ) { + bvnext = bv->next; + GDrawDestroyWindow(bv->gw); + } + } else { + for ( bv=fbdf->chars[i]->views; bv!=NULL; bv = bvnext ) { + bvnext = bv->next; + BVChangeBC(bv,bc,true); + } + } + GDrawProcessPendingEvents(NULL); + } + } + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + for ( mv=fvs->metrics; mv!=NULL; mv = mvnext ) { + /* Don't bother trying to fix up metrics views, just not worth it */ + mvnext = mv->next; + GDrawDestroyWindow(mv->gw); + } + if ( fvs->fontinfo ) + FontInfoDestroy(fvs); + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + if ( temp->charcnt>fv->sf->charcnt ) { + fv->selected = grealloc(fv->selected,temp->charcnt); + for ( i=fv->sf->charcnt; icharcnt; ++i ) + fv->selected[i] = false; + } + SFClearAutoSave(old); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + temp->fv = fv->sf->fv; + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + fvs->sf = temp; + FontViewReformatAll(fv->sf); + SplineFontFree(old); +} + +static void FVMenuRevert(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVRevert(fv); +} + +static void FVMenuRevertGlyph(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i; + int nc_state = -1, refs_state=-1, ret; + SplineFont *sf = fv->sf; + SplineChar *sc, *tsc; + SplineChar temp; + static int buts[] = { _STR_Yes, _STR_YesToAll, _STR_NoToAll, _STR_No, _STR_Cancel, 0 }; + + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] && sf->chars[i]!=NULL ) { + tsc = sf->chars[i]; + if ( tsc->namechanged ) { + if ( nc_state==-1 ) { + GWidgetErrorR(_STR_NameChanged,_STR_NameChangedGlyph,tsc->name); + nc_state = 0; + } + } else { + sc = SFDReadOneChar(sf->filename,tsc->name); + if ( sc==NULL ) { + GWidgetErrorR(_STR_CantFindGlyph,_STR_CantRevertGlyph,tsc->name); + tsc->namechanged = true; + } else { + if ( sc->layers[ly_fore].refs!=NULL && sf->encodingchanged ) { + if ( refs_state==-1 ) { + ret = GWidgetAskR(_STR_GlyphHasRefs,buts,0,1,_STR_GlyphHasRefsQuestion,tsc->name); + if ( ret == 1 || ret == 2 ) + refs_state = ret; + } else + ret = refs_state; + if ( ret >= 2 ) /* No, No to All, Cancel */ + SplineCharFree(sc); + if ( ret==4 ) /* Cancel */ +return; + } else + ret = 0; + if ( ret==0 || ret==1 ) { + SCPreserveState(tsc,true); + SCPreserveBackground(tsc); + temp = *tsc; + tsc->dependents = NULL; + tsc->layers[ly_back].undoes = tsc->layers[ly_fore].undoes = NULL; + SplineCharFreeContents(tsc); + *tsc = *sc; + chunkfree(sc,sizeof(SplineChar)); + tsc->parent = sf; + tsc->dependents = temp.dependents; + tsc->layers[ly_fore].undoes = temp.layers[ly_fore].undoes; + tsc->layers[ly_back].undoes = temp.layers[ly_back].undoes; + tsc->views = temp.views; + tsc->changed = temp.changed; + tsc->enc = temp.enc; + RevertedGlyphReferenceFixup(tsc, sf); + _SCCharChangedUpdate(tsc,false); + } + } + } + } +} + +void MenuPrefs(GWindow base,struct gmenuitem *mi,GEvent *e) { + DoPrefs(); +} + +void MenuSaveAll(GWindow base,struct gmenuitem *mi,GEvent *e) { + FontView *fv; + + for ( fv = fv_list; fv!=NULL; fv = fv->next ) { + if ( SFAnyChanged(fv->sf) && !_FVMenuSave(fv)) +return; + } +} + +static void _MenuExit(void *junk) { + FontView *fv, *next; + + for ( fv = fv_list; fv!=NULL; fv = next ) { + next = fv->next; + if ( !_FVMenuClose(fv)) +return; + if ( fv->nextsame!=NULL || fv->sf->fv!=fv ) { + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } + } + exit(0); +} + +static void FVMenuExit(GWindow base,struct gmenuitem *mi,GEvent *e) { + _MenuExit(NULL); +} + +void MenuExit(GWindow base,struct gmenuitem *mi,GEvent *e) { + if ( e==NULL ) /* Not from the menu directly, but a shortcut */ + _MenuExit(NULL); + else + DelayEvent(_MenuExit,NULL); +} + +char *GetPostscriptFontName(char *dir, int mult) { + /* Some people use pf3 as an extension for postscript type3 fonts */ + static unichar_t fontmacsuit[] = { 'a','p','p','l','i','c','a','t','i','o','n','/','x','-','m','a','c','-','s','u','i','t', '\0' }; + static unichar_t wild[] = { '*', '.', '{', 'p','f','a',',', + 'p','f','b',',', + 'p','t','3',',', + 's','f','d',',', + 't','t','f',',', + 'b','d','f',',', + 'o','t','f',',', + 'o','t','b',',', + 'c','f','f',',', + 'c','e','f',',', +#ifndef _NO_LIBXML + 's','v','g',',', +#endif + 'p','f','3',',', + 't','t','c',',', + 'g','s','f',',', + 'c','i','d',',', + 'b','i','n',',', + 'h','q','x',',', + 'd','f','o','n','t',',', + 'm','f',',', + 'i','k',',', + 'f','o','n',',', + 'f','n','t','}', + '{','.','g','z',',','.','Z',',','.','b','z','2',',','}', '\0' }; + static unichar_t *mimes[] = { fontmacsuit, NULL }; + unichar_t *ret, *u_dir; + char *temp; + + u_dir = uc_copy(dir); + ret = FVOpenFont(GStringGetResource(_STR_OpenPostscript,NULL), + u_dir,wild,mimes,mult,true); + temp = u2def_copy(ret); + + free(ret); +return( temp ); +} + +void MergeKernInfo(SplineFont *sf) { +#ifndef __Mac + static unichar_t wild[] = { '*', '.', '{','a','f','m',',','t','f','m',',','b','i','n',',','h','q','x','}', '\0' }; + static unichar_t wild2[] = { '*', '.', '{','a','f','m',',','a','m','f','m',',','t','f','m',',','b','i','n',',','h','q','x','}', '\0' }; +#else + static unichar_t wild[] = { '*', 0 }; /* Mac resource files generally don't have extensions */ + static unichar_t wild2[] = { '*', 0 }; +#endif + unichar_t *ret = GWidgetOpenFile(GStringGetResource(_STR_MergeKernInfo,NULL), + NULL,sf->mm!=NULL?wild2:wild,NULL,NULL); + char *temp = u2def_copy(ret); + int isamfm, isafm, istfm; + + if ( temp==NULL ) /* Cancelled */ +return; + + isamfm = strstrmatch(temp,".amfm")!=NULL; + isafm = strstrmatch(temp,".afm")!=NULL; + istfm = strstrmatch(temp,".tfm")!=NULL; + if ( (isafm && !LoadKerningDataFromAfm(sf,temp)) || + (isamfm && !LoadKerningDataFromAmfm(sf,temp)) || + (istfm && !LoadKerningDataFromTfm(sf,temp)) || + (!isafm && !istfm && !isamfm && !LoadKerningDataFromMacFOND(sf,temp)) ) + GDrawError( "Failed to load kern data from %s", temp); + free(ret); free(temp); +} + +static void FVMenuMergeKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + MergeKernInfo(fv->sf); +} + +void MenuOpen(GWindow base,struct gmenuitem *mi,GEvent *e) { + char *temp; + char *eod, *fpt, *file, *full; + FontView *test; int fvcnt, fvtest; + + for ( fvcnt=0, test=fv_list; test!=NULL; ++fvcnt, test=test->next ); + do { + temp = GetPostscriptFontName(NULL,true); + if ( temp==NULL ) +return; + eod = strrchr(temp,'/'); + *eod = '\0'; + file = eod+1; + do { + fpt = strstr(file,"; "); + if ( fpt!=NULL ) *fpt = '\0'; + full = galloc(strlen(temp)+1+strlen(file)+1); + strcpy(full,temp); strcat(full,"/"); strcat(full,file); + ViewPostscriptFont(full); + file = fpt+2; + free(full); + } while ( fpt!=NULL ); + free(temp); + for ( fvtest=0, test=fv_list; test!=NULL; ++fvtest, test=test->next ); + } while ( fvtest==fvcnt ); /* did the load fail for some reason? try again */ +} + +void MenuHelp(GWindow base,struct gmenuitem *mi,GEvent *e) { + help("overview.html"); +} + +void MenuIndex(GWindow base,struct gmenuitem *mi,GEvent *e) { + help("IndexFS.html"); +} + +void MenuLicense(GWindow base,struct gmenuitem *mi,GEvent *e) { + help("license.html"); +} + +void MenuAbout(GWindow base,struct gmenuitem *mi,GEvent *e) { + ShowAboutScreen(); +} + +static void FVMenuImport(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int empty = fv->sf->onlybitmaps && fv->sf->bitmaps==NULL; + BDFFont *bdf; + FVImport(fv); + if ( empty && fv->sf->bitmaps!=NULL ) { + for ( bdf= fv->sf->bitmaps; bdf->next!=NULL; bdf = bdf->next ); + FVChangeDisplayBitmap(fv,bdf); + } +} + +static int FVSelCount(FontView *fv) { + int i, cnt=0; + static int buts[] = { _STR_OK, _STR_Cancel, 0 }; + + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] ) ++cnt; + if ( cnt>10 ) { + if ( GWidgetAskR(_STR_Manywin,buts,0,1,_STR_Toomany)==1 ) +return( false ); + } +return( true ); +} + +static void FVMenuOpenOutline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i; + SplineChar *sc; + + if ( !FVSelCount(fv)) +return; + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] ) { + sc = SFMakeChar(fv->sf,i); + CharViewCreate(sc,fv); + } +} + +static void FVMenuOpenBitmap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i; + + if ( fv->cidmaster==NULL ? (fv->sf->bitmaps==NULL) : (fv->cidmaster->bitmaps==NULL) ) +return; + if ( !FVSelCount(fv)) +return; + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] ) { + if ( fv->sf->chars[i]==NULL ) + SFMakeChar(fv->cidmaster?fv->cidmaster:fv->sf,i); + BitmapViewCreatePick(i,fv); + } +} + +static void FVMenuOpenMetrics(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + MetricsViewCreate(fv,NULL,fv->filled==fv->show?NULL:fv->show); +} + +static void FVMenuFontInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FontMenuFontInfo(fv); +} + +static void FVMenuFindProblems(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FindProblems(fv,NULL,NULL); +} + +static void FVMenuMetaFont(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + MetaFont(fv,NULL,NULL); +} + +#define MID_24 2001 +#define MID_36 2002 +#define MID_48 2004 +#define MID_72 2014 +#define MID_96 2015 +#define MID_AntiAlias 2005 +#define MID_Next 2006 +#define MID_Prev 2007 +#define MID_NextDef 2012 +#define MID_PrevDef 2013 +#define MID_ShowHMetrics 2016 +#define MID_ShowVMetrics 2017 +#define MID_CompactedView 2018 +#define MID_EncodedView 2019 +#define MID_Ligatures 2020 +#define MID_KernPairs 2021 +#define MID_AnchorPairs 2022 +#define MID_FitToEm 2022 +#define MID_CharInfo 2201 +#define MID_FindProblems 2216 +#define MID_MetaFont 2217 +#define MID_Transform 2202 +#define MID_Stroke 2203 +#define MID_RmOverlap 2204 +#define MID_Simplify 2205 +#define MID_Correct 2206 +#define MID_BuildAccent 2208 +#define MID_AvailBitmaps 2210 +#define MID_RegenBitmaps 2211 +#define MID_Autotrace 2212 +#define MID_Round 2213 +#define MID_MergeFonts 2214 +#define MID_InterpolateFonts 2215 +#define MID_ShowDependents 2222 +#define MID_AddExtrema 2224 +#define MID_CleanupChar 2225 +#define MID_TilePath 2226 +#define MID_BuildComposite 2227 +#define MID_NLTransform 2228 +#define MID_Intersection 2229 +#define MID_FindInter 2230 +#define MID_Effects 2231 +#define MID_CopyFeatureToFont 2232 +#define MID_SimplifyMore 2233 +#define MID_Center 2600 +#define MID_Thirds 2601 +#define MID_SetWidth 2602 +#define MID_SetLBearing 2603 +#define MID_SetRBearing 2604 +#define MID_SetVWidth 2605 +#define MID_RmHKern 2606 +#define MID_RmVKern 2607 +#define MID_VKernByClass 2608 +#define MID_VKernFromH 2609 +#define MID_AutoHint 2501 +#define MID_ClearHints 2502 +#define MID_ClearWidthMD 2503 +#define MID_AutoInstr 2504 +#define MID_EditInstructions 2505 +#define MID_Editfpgm 2506 +#define MID_Editprep 2507 +#define MID_ClearInstrs 2508 +#define MID_HStemHist 2509 +#define MID_VStemHist 2510 +#define MID_BlueValuesHist 2511 +#define MID_Editcvt 2512 +#define MID_HintSubsPt 2513 +#define MID_AutoCounter 2514 +#define MID_DontAutoHint 2515 +#define MID_OpenBitmap 2700 +#define MID_OpenOutline 2701 +#define MID_Revert 2702 +#define MID_Recent 2703 +#define MID_Print 2704 +#define MID_ScriptMenu 2705 +#define MID_Display 2706 +#define MID_RevertGlyph 2707 +#define MID_Cut 2101 +#define MID_Copy 2102 +#define MID_Paste 2103 +#define MID_Clear 2104 +#define MID_SelAll 2106 +#define MID_CopyRef 2107 +#define MID_UnlinkRef 2108 +#define MID_Undo 2109 +#define MID_Redo 2110 +#define MID_CopyWidth 2111 +#define MID_AllFonts 2122 +#define MID_DisplayedFont 2123 +#define MID_CharName 2124 +#define MID_RemoveUndoes 2114 +#define MID_CopyFgToBg 2115 +#define MID_ClearBackground 2116 +#define MID_CopyLBearing 2125 +#define MID_CopyRBearing 2126 +#define MID_CopyVWidth 2127 +#define MID_Join 2128 +#define MID_PasteInto 2129 +#define MID_SameGlyphAs 2130 +#define MID_Convert2CID 2800 +#define MID_Flatten 2801 +#define MID_InsertFont 2802 +#define MID_InsertBlank 2803 +#define MID_CIDFontInfo 2804 +#define MID_RemoveFromCID 2805 +#define MID_ConvertByCMap 2806 +#define MID_FlattenByCMap 2807 +#define MID_CreateMM 2900 +#define MID_MMInfo 2901 +#define MID_MMValid 2902 +#define MID_ChangeMMBlend 2903 +#define MID_ModifyComposition 20902 +#define MID_BuildSyllables 20903 + +/* returns -1 if nothing selected, the char if exactly one, -2 if more than one */ +static int FVAnyCharSelected(FontView *fv) { + int i, val=-1; + + for ( i=0; isf->charcnt; ++i ) { + if ( fv->selected[i]) { + if ( val==-1 ) + val = i; + else +return( -2 ); + } + } +return( val ); +} + +static void FVMenuCopyFrom(GWindow gw,struct gmenuitem *mi,GEvent *e) { + /*FontView *fv = (FontView *) GDrawGetUserData(gw);*/ + + if ( mi->mid==MID_CharName ) + copymetadata = !copymetadata; + else + onlycopydisplayed = (mi->mid==MID_DisplayedFont); + SavePrefs(); +} + +static void FVMenuCopy(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( FVAnyCharSelected(fv)==-1 ) +return; + FVCopy(fv,true); +} + +static void FVMenuCopyRef(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( FVAnyCharSelected(fv)==-1 ) +return; + FVCopy(fv,false); +} + +static void FVMenuCopyWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( FVAnyCharSelected(fv)==-1 ) +return; + if ( mi->mid==MID_CopyVWidth && !fv->sf->hasvmetrics ) +return; + FVCopyWidth(fv,mi->mid==MID_CopyWidth?ut_width: + mi->mid==MID_CopyVWidth?ut_vwidth: + mi->mid==MID_CopyLBearing?ut_lbearing: + ut_rbearing); +} + +static void FVMenuPaste(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( FVAnyCharSelected(fv)==-1 ) +return; + PasteIntoFV(fv,true); +} + +static void FVMenuPasteInto(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( FVAnyCharSelected(fv)==-1 ) +return; + PasteIntoFV(fv,false); +} + +static void FVSameGlyphAs(FontView *fv) { + SplineFont *sf = fv->sf; + RefChar *base = CopyContainsRef(sf); + int i; + + if ( FVAnyCharSelected(fv)==-1 || base==NULL || fv->cidmaster!=NULL ) +return; + PasteIntoFV(fv,true); + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && fv->selected[i] && base->local_enc!=i) { + free(sf->chars[i]->name); + sf->chars[i]->name = copy(sf->chars[base->local_enc]->name); + } +} + +static void FVMenuSameGlyphAs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVSameGlyphAs(fv); +} + +static void FVCopyFgtoBg(FontView *fv) { + int i; + + for ( i=0; isf->charcnt; ++i ) + if ( fv->sf->chars[i]!=NULL && fv->selected[i] && fv->sf->chars[i]->layers[1].splines!=NULL ) + SCCopyFgToBg(fv->sf->chars[i],true); +} + +static void FVMenuCopyFgBg(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVCopyFgtoBg( (FontView *) GDrawGetUserData(gw)); +} + +void BCClearAll(BDFChar *bc) { + if ( bc==NULL ) +return; + BCPreserveState(bc); + BCFlattenFloat(bc); + memset(bc->bitmap,'\0',bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + BCCompressBitmap(bc); + BCCharChangedUpdate(bc); +} + +void SCClearContents(SplineChar *sc) { + RefChar *refs, *next; + int layer; + + if ( sc==NULL ) +return; + sc->widthset = false; + sc->width = sc->parent->ascent+sc->parent->descent; + for ( layer = ly_fore; layerlayer_cnt; ++layer ) { + SplinePointListsFree(sc->layers[layer].splines); + sc->layers[layer].splines = NULL; + for ( refs=sc->layers[layer].refs; refs!=NULL; refs = next ) { + next = refs->next; + SCRemoveDependent(sc,refs); + } + sc->layers[layer].refs = NULL; + } + AnchorPointsFree(sc->anchor); + sc->anchor = NULL; + StemInfosFree(sc->hstem); sc->hstem = NULL; + StemInfosFree(sc->vstem); sc->vstem = NULL; + DStemInfosFree(sc->dstem); sc->dstem = NULL; + MinimumDistancesFree(sc->md); sc->md = NULL; + free(sc->ttf_instrs); + sc->ttf_instrs = NULL; + sc->ttf_instrs_len = 0; + SCOutOfDateBackground(sc); +} + +void SCClearAll(SplineChar *sc) { + + if ( sc==NULL ) +return; + if ( sc->layers[1].splines==NULL && sc->layers[ly_fore].refs==NULL && !sc->widthset && + sc->hstem==NULL && sc->vstem==NULL && sc->anchor==NULL && + (!copymetadata || + (sc->unicodeenc==-1 && strcmp(sc->name,".notdef")==0))) +return; + SCPreserveState(sc,2); + if ( copymetadata ) { + sc->unicodeenc = -1; + free(sc->name); + sc->name = copy(".notdef"); + PSTFree(sc->possub); + sc->possub = NULL; + } + SCClearContents(sc); + SCCharChangedUpdate(sc); +} + +void SCClearBackground(SplineChar *sc) { + + if ( sc==NULL ) +return; + if ( sc->layers[0].splines==NULL && sc->layers[ly_back].images==NULL ) +return; + SCPreserveBackground(sc); + SplinePointListsFree(sc->layers[0].splines); + sc->layers[0].splines = NULL; + ImageListsFree(sc->layers[ly_back].images); + sc->layers[ly_back].images = NULL; + SCOutOfDateBackground(sc); + SCCharChangedUpdate(sc); +} + +static int UnselectedDependents(FontView *fv, SplineChar *sc) { + struct splinecharlist *dep; + + for ( dep=sc->dependents; dep!=NULL; dep=dep->next ) { + if ( !fv->selected[dep->sc->enc] ) +return( true ); + if ( UnselectedDependents(fv,dep->sc)) +return( true ); + } +return( false ); +} + +void UnlinkThisReference(FontView *fv,SplineChar *sc) { + /* We are about to clear out sc. But somebody refers to it and that we */ + /* aren't going to delete. So (if the user asked us to) instanciate sc */ + /* into all characters which refer to it and which aren't about to be */ + /* cleared out */ + struct splinecharlist *dep, *dnext; + + for ( dep=sc->dependents; dep!=NULL; dep=dnext ) { + dnext = dep->next; + if ( fv==NULL || !fv->selected[dep->sc->enc]) { + SplineChar *dsc = dep->sc; + RefChar *rf, *rnext; + /* May be more than one reference to us, colon has two refs to period */ + /* but only one dlist entry */ + for ( rf = dsc->layers[ly_fore].refs; rf!=NULL; rf=rnext ) { + rnext = rf->next; + if ( rf->sc == sc ) { + /* Even if we were to preserve the state there would be no */ + /* way to undo the operation until we undid the delete... */ + SCRefToSplines(dsc,rf); + SCUpdateAll(dsc); + } + } + } + } +} + +static void FVClear(FontView *fv) { + int i; + BDFFont *bdf; + int refstate = 0; + static int buts[] = { _STR_Yes, _STR_YesToAll, _STR_UnlinkAll, _STR_NoToAll, _STR_No, 0 }; + int yes, unsel; + /* refstate==0 => ask, refstate==1 => clearall, refstate==-1 => skip all */ + + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) { + if ( !onlycopydisplayed || fv->filled==fv->show ) { + /* If we are messing with the outline character, check for dependencies */ + if ( refstate<=0 && fv->sf->chars[i]!=NULL && + fv->sf->chars[i]->dependents!=NULL ) { + unsel = UnselectedDependents(fv,fv->sf->chars[i]); + if ( refstate==-2 && unsel ) { + UnlinkThisReference(fv,fv->sf->chars[i]); + } else if ( unsel ) { + if ( refstate<0 ) + continue; + yes = GWidgetAskCenteredR(_STR_BadReference,buts,2,4,_STR_ClearDependent,fv->sf->chars[i]->name); + if ( yes==1 ) + refstate = 1; + else if ( yes==2 ) { + UnlinkThisReference(fv,fv->sf->chars[i]); + refstate = -2; + } else if ( yes==3 ) + refstate = -1; + if ( yes>=3 ) + continue; + } + } + } + + if ( onlycopydisplayed && fv->filled==fv->show ) { + SCClearAll(fv->sf->chars[i]); + } else if ( onlycopydisplayed ) { + BCClearAll(fv->show->chars[i]); + } else { + SCClearAll(fv->sf->chars[i]); + for ( bdf=fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) + BCClearAll(bdf->chars[i]); + } + } +} + +static void FVMenuClear(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVClear((FontView *) GDrawGetUserData(gw)); +} + +static void FVClearBackground(FontView *fv) { + SplineFont *sf = fv->sf; + int i; + + if ( onlycopydisplayed && fv->filled!=fv->show ) +return; + + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] && sf->chars[i]!=NULL ) { + SCClearBackground(sf->chars[i]); + } +} + +static void FVMenuClearBackground(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVClearBackground( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVJoin(FontView *fv) { + SplineFont *sf = fv->sf; + int i,changed; + extern float joinsnap; + + if ( onlycopydisplayed && fv->filled!=fv->show ) +return; + + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] && sf->chars[i]!=NULL ) { + SCPreserveState(sf->chars[i],false); + sf->chars[i]->layers[ly_fore].splines = SplineSetJoin(sf->chars[i]->layers[ly_fore].splines,true,joinsnap,&changed); + if ( changed ) + SCCharChangedUpdate(sf->chars[i]); + } +} + +static void FVMenuJoin(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVJoin( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVUnlinkRef(FontView *fv) { + int i,layer; + SplineChar *sc; + RefChar *rf, *next; + + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && (sc=fv->sf->chars[i])!=NULL && sc->layers[ly_fore].refs!=NULL ) { + SCPreserveState(sc,false); + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + for ( rf=sc->layers[ly_fore].refs; rf!=NULL ; rf=next ) { + next = rf->next; + SCRefToSplines(sc,rf); + } + } + SCCharChangedUpdate(sc); + } +} + +static void FVMenuUnlinkRef(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVUnlinkRef( (FontView *) GDrawGetUserData(gw)); +} + +void SFRemoveUndoes(SplineFont *sf,uint8 *selected) { + SplineFont *main = sf->cidmaster? sf->cidmaster : sf, *ssf; + int i,k, max, layer; + SplineChar *sc; + BDFFont *bdf; + + if ( selected!=NULL || main->subfontcnt==0 ) + max = sf->charcnt; + else { + max = 0; + for ( k=0; ksubfontcnt; ++k ) + if ( main->subfonts[k]->charcnt>max ) max = main->subfonts[k]->charcnt; + } + for ( i=0; ibitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( bdf->chars[i]!=NULL ) { + UndoesFree(bdf->chars[i]->undoes); bdf->chars[i]->undoes = NULL; + UndoesFree(bdf->chars[i]->redoes); bdf->chars[i]->redoes = NULL; + } + } + k = 0; + do { + ssf = main->subfontcnt==0? main: main->subfonts[k]; + if ( icharcnt && ssf->chars[i]!=NULL ) { + sc = ssf->chars[i]; + for ( layer = 0; layerlayer_cnt; ++layer ) { + UndoesFree(sc->layers[layer].undoes); sc->layers[layer].undoes = NULL; + UndoesFree(sc->layers[layer].redoes); sc->layers[layer].redoes = NULL; + } + } + ++k; + } while ( ksubfontcnt ); + } +} + +static void FVMenuRemoveUndoes(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFRemoveUndoes(fv->sf,fv->selected); +} + +static void FVMenuUndo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i,j,layer; + MMSet *mm = fv->sf->mm; + int was_blended = mm!=NULL && mm->normal==fv->sf; + + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && fv->sf->chars[i]!=NULL ) { + SplineChar *sc = fv->sf->chars[i]; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + if ( sc->layers[layer].undoes!=NULL ) { + SCDoUndo(sc,layer); + if ( was_blended ) { + for ( j=0; jinstance_count; ++j ) + SCDoUndo(mm->instances[j]->chars[i],layer); + } + } + } + } +} + +static void FVMenuRedo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i,j,layer; + MMSet *mm = fv->sf->mm; + int was_blended = mm->normal==fv->sf; + + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && fv->sf->chars[i]!=NULL ) { + SplineChar *sc = fv->sf->chars[i]; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + if ( sc->layers[layer].redoes!=NULL ) { + SCDoRedo(sc,layer); + if ( was_blended ) { + for ( j=0; jinstance_count; ++j ) + SCDoRedo(mm->instances[j]->chars[i],layer); + } + } + } + } +} + +static void FVMenuCut(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVCopy(fv,true); + FVClear(fv); +} + +static void FVMenuSelectAll(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVSelectAll(fv); +} + +static void FVMenuDeselectAll(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVDeselectAll(fv); +} + +static void FVMenuSelectColor(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVSelectColor(fv,(uint32) (mi->ti.userdata),(e->u.chr.state&ksm_shift)?1:0); +} + +static void FVMenuSelectByPST(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVSelectByPST(fv); +} + +static void FVMenuFindRpl(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + SVCreate(fv); +} + +static void cflistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + /*FontView *fv = (FontView *) GDrawGetUserData(gw);*/ + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_AllFonts: + mi->ti.checked = !onlycopydisplayed; + break; + case MID_DisplayedFont: + mi->ti.checked = onlycopydisplayed; + break; + case MID_CharName: + mi->ti.checked = copymetadata; + break; + } + } +} + +static void sllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + fv = fv; +} + +static void edlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int pos = FVAnyCharSelected(fv); + int not_pasteable = pos==-1 || + (!CopyContainsSomething() && +#ifndef _NO_LIBPNG + !GDrawSelectionHasType(fv->gw,sn_clipboard,"image/png") && +#endif + !GDrawSelectionHasType(fv->gw,sn_clipboard,"image/bmp") && + !GDrawSelectionHasType(fv->gw,sn_clipboard,"image/eps")); + RefChar *base = CopyContainsRef(fv->sf); + + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Paste: case MID_PasteInto: + mi->ti.disabled = not_pasteable; + break; + case MID_SameGlyphAs: + mi->ti.disabled = not_pasteable || base==NULL || fv->cidmaster!=NULL || + fv->selected[base->local_enc]; /* Can't be self-referential */ + break; + case MID_Join: + case MID_Cut: case MID_Copy: case MID_Clear: + case MID_CopyWidth: case MID_CopyLBearing: case MID_CopyRBearing: + case MID_CopyRef: case MID_UnlinkRef: + case MID_RemoveUndoes: case MID_CopyFgToBg: + mi->ti.disabled = pos==-1; + break; + case MID_CopyVWidth: + mi->ti.disabled = pos==-1 || !fv->sf->hasvmetrics; + break; + case MID_ClearBackground: + mi->ti.disabled = true; + if ( pos!=-1 && !( onlycopydisplayed && fv->filled!=fv->show )) { + for ( pos=0; possf->charcnt; ++pos ) + if ( fv->selected[pos] && fv->sf->chars[pos]!=NULL ) + if ( fv->sf->chars[pos]->layers[ly_back].images!=NULL || + fv->sf->chars[pos]->layers[ly_back].splines!=NULL ) { + mi->ti.disabled = false; + break; + } + } + break; + case MID_Undo: + for ( pos=0; possf->charcnt; ++pos ) + if ( fv->selected[pos] && fv->sf->chars[pos]!=NULL ) + if ( fv->sf->chars[pos]->layers[ly_fore].undoes!=NULL ) + break; + mi->ti.disabled = pos==fv->sf->charcnt; + break; + case MID_Redo: + for ( pos=0; possf->charcnt; ++pos ) + if ( fv->selected[pos] && fv->sf->chars[pos]!=NULL ) + if ( fv->sf->chars[pos]->layers[ly_fore].redoes!=NULL ) + break; + mi->ti.disabled = pos==fv->sf->charcnt; + break; + } + } +} + +static void FVMenuCharInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int pos = FVAnyCharSelected(fv); + if ( pos<0 || fv->cidmaster!=NULL ) +return; + SFMakeChar(fv->sf,pos); + SCCharInfo(fv->sf->chars[pos]); +} + +static void FVMenuAAT(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + uint32 tag = (uint32) (mi->ti.userdata); + int i; + + for ( i=0; isf->charcnt; ++i ) + if ( fv->sf->chars[i]!=NULL && fv->selected[i]) + SCTagDefault(SCDuplicate(fv->sf->chars[i]),tag); +} + +static void FVMenuAATSuffix(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + uint32 tag; + char *suffix; + unichar_t *usuffix, *upt, *end; + int i; + uint16 flags, sli; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i]) + if ( SCScriptFromUnicode(fv->sf->chars[i])!=DEFAULT_SCRIPT ) + break; + usuffix = AskNameTag(_STR_SuffixToTag,NULL,0,0,-1,pst_substitution,fv->sf,fv->sf->chars[i],-1,-1); + if ( usuffix==NULL ) +return; + + upt = usuffix; + tag = (*upt++&0xff)<<24; + tag |= (*upt++&0xff)<<16; + tag |= (*upt++&0xff)<< 8; + tag |= (*upt++&0xff) ; + if ( *upt==' ' ) ++upt; + if (( upt[0]=='b' || upt[0]==' ' ) && + ( upt[1]=='l' || upt[1]==' ' ) && + ( upt[2]=='m' || upt[2]==' ' ) && + ( upt[3]=='m' || upt[3]==' ' ) && + upt[4]==' ' ) { + flags = 0; + if ( upt[0]=='r' ) flags |= pst_r2l; + if ( upt[1]=='b' ) flags |= pst_ignorebaseglyphs; + if ( upt[2]=='l' ) flags |= pst_ignoreligatures; + if ( upt[3]=='m' ) flags |= pst_ignorecombiningmarks; + upt += 5; + } + sli = u_strtol(upt,&end,10); + while ( *end==' ' ) ++end; + + suffix = cu_copy(end); + free(usuffix); + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i]) + SCSuffixDefault(SCDuplicate(fv->sf->chars[i]),tag,suffix,flags,sli); + free(suffix); +} + +static void FVMenuCopyFeatureToFont(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFCopyFeatureToFontDlg(fv->sf); +} + +static void FVMenuRemoveAllFeatures(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( !SFRemoveThisFeatureTag(fv->sf,0xffffffff,SLI_UNKNOWN,-1)) + GWidgetErrorR(_STR_NoFeaturesRemoved,_STR_NoFeaturesRemoved); +} + +static void FVMenuRemoveFeatures(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFRemoveFeatureDlg(fv->sf); +} + +static void FVMenuRemoveUnusedNested(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( !SFRemoveUnusedNestedFeatures(fv->sf)) + GWidgetErrorR(_STR_NoFeaturesRemoved,_STR_NoFeaturesRemoved); +} + +static void FVMenuRetagFeature(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFRetagFeatureDlg(fv->sf); +} + +static void FVMenuShowDependents(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int pos = FVAnyCharSelected(fv); + if ( pos<0 ) +return; + if ( fv->sf->chars[pos]==NULL || fv->sf->chars[pos]->dependents==NULL ) +return; + SCRefBy(fv->sf->chars[pos]); +} + +static int getorigin(void *d,BasePoint *base,int index) { + /*FontView *fv = (FontView *) d;*/ + + base->x = base->y = 0; + switch ( index ) { + case 0: /* Character origin */ + /* all done */ + break; + case 1: /* Center of selection */ + /*CVFindCenter(cv,base,!CVAnySel(cv,NULL,NULL,NULL,NULL));*/ + break; + default: +return( false ); + } +return( true ); +} + +void TransHints(StemInfo *stem,real mul1, real off1, real mul2, real off2, int round_to_int ) { + HintInstance *hi; + + for ( ; stem!=NULL; stem=stem->next ) { + stem->start = stem->start*mul1 + off1; + stem->width *= mul1; + if ( round_to_int ) { + stem->start = rint(stem->start); + stem->width = rint(stem->width); + } + for ( hi=stem->where; hi!=NULL; hi=hi->next ) { + hi->begin = hi->begin*mul2 + off2; + hi->end = hi->end*mul2 + off2; + if ( round_to_int ) { + hi->begin = rint(hi->begin); + hi->end = rint(hi->end); + } + } + } +} + +void FVTrans(FontView *fv,SplineChar *sc,real transform[6], uint8 *sel, + enum fvtrans_flags flags) { + RefChar *refs; + real t[6]; + AnchorPoint *ap; + int i,j; + + if ( sc->blended ) { + int j; + MMSet *mm = sc->parent->mm; + for ( j=0; jinstance_count; ++j ) + FVTrans(fv,mm->instances[j]->chars[sc->enc],transform,sel,flags); + } + + SCPreserveState(sc,true); + if ( !(flags&fvt_dontmovewidth) ) + if ( transform[0]>0 && transform[3]>0 && transform[1]==0 && transform[2]==0 ) { + int widthset = sc->widthset; + SCSynchronizeWidth(sc,sc->width*transform[0]+transform[4],sc->width,fv); + if ( !(flags&fvt_dontsetwidth) ) sc->widthset = widthset; + } + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) + ApTransform(ap,transform); + for ( i=ly_fore; ilayer_cnt; ++i ) { + SplinePointListTransform(sc->layers[i].splines,transform,true); + for ( refs = sc->layers[i].refs; refs!=NULL; refs=refs->next ) { + if ( sel!=NULL && sel[refs->sc->enc] ) { + /* if the character referred to is selected then it's going to */ + /* be scaled too (or will have been) so we don't want to scale */ + /* it twice */ + t[4] = refs->transform[4]*transform[0] + + refs->transform[5]*transform[2] + + /*transform[4]*/0; + t[5] = refs->transform[4]*transform[1] + + refs->transform[5]*transform[3] + + /*transform[5]*/0; + t[0] = refs->transform[4]; t[1] = refs->transform[5]; + refs->transform[4] = t[4]; + refs->transform[5] = t[5]; + /* Now update the splines to match */ + t[4] -= t[0]; t[5] -= t[1]; + if ( t[4]!=0 || t[5]!=0 ) { + t[0] = t[3] = 1; t[1] = t[2] = 0; + for ( j=0; jlayer_cnt; ++j ) + SplinePointListTransform(refs->layers[j].splines,t,true); + } + } else { + for ( j=0; jlayer_cnt; ++j ) + SplinePointListTransform(refs->layers[j].splines,transform,true); + t[0] = refs->transform[0]*transform[0] + + refs->transform[1]*transform[2]; + t[1] = refs->transform[0]*transform[1] + + refs->transform[1]*transform[3]; + t[2] = refs->transform[2]*transform[0] + + refs->transform[3]*transform[2]; + t[3] = refs->transform[2]*transform[1] + + refs->transform[3]*transform[3]; + t[4] = refs->transform[4]*transform[0] + + refs->transform[5]*transform[2] + + transform[4]; + t[5] = refs->transform[4]*transform[1] + + refs->transform[5]*transform[3] + + transform[5]; + memcpy(refs->transform,t,sizeof(t)); + } + RefCharFindBounds(refs); + } + } + if ( transform[1]==0 && transform[2]==0 ) { + TransHints(sc->hstem,transform[3],transform[5],transform[0],transform[4],flags&fvt_round_to_int); + TransHints(sc->vstem,transform[0],transform[4],transform[3],transform[5],flags&fvt_round_to_int); + } + if ( flags&fvt_round_to_int ) + SCRound2Int(sc); + if ( transform[0]==1 && transform[3]==1 && transform[1]==0 && + transform[2]==0 && transform[5]==0 && + transform[4]!=0 && + sc->unicodeenc!=-1 && isalpha(sc->unicodeenc)) { + SCUndoSetLBearingChange(sc,(int) rint(transform[4])); + SCSynchronizeLBearing(sc,NULL,transform[4]); + } + if ( flags&fvt_dobackground ) { + ImageList *img; + SCPreserveBackground(sc); + SplinePointListTransform(sc->layers[ly_back].splines,transform,true); + for ( img = sc->layers[ly_back].images; img!=NULL; img=img->next ) + BackgroundImageTransform(sc, img, transform); + } + SCCharChangedUpdate(sc); +} + +void FVTransFunc(void *_fv,real transform[6],int otype, BVTFunc *bvts, + enum fvtrans_flags flags ) { + FontView *fv = _fv; + real transx = transform[4], transy=transform[5]; + DBounds bb; + BasePoint base; + int i, cnt=0; + BDFFont *bdf; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Transforming,_STR_Transforming,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + + if ( onlycopydisplayed && fv->show!=fv->filled ) { + if ( fv->show->chars[i]!=NULL ) + BCTrans(bdf,fv->show->chars[i],bvts,fv); + } else { + if ( otype==1 ) { + SplineCharFindBounds(sc,&bb); + base.x = (bb.minx+bb.maxx)/2; + base.y = (bb.miny+bb.maxy)/2; + transform[4]=transx+base.x- + (transform[0]*base.x+transform[2]*base.y); + transform[5]=transy+base.y- + (transform[1]*base.x+transform[3]*base.y); + } + FVTrans(fv,sc,transform,fv->selected,flags); + if ( !onlycopydisplayed ) { + for ( bdf = fv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) if ( bdf->chars[i]!=NULL ) + BCTrans(bdf,bdf->chars[i],bvts,fv); + } + } + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +int SFScaleToEm(SplineFont *sf, int as, int des) { + double scale; + real transform[6]; + BVTFunc bvts; + uint8 *oldselected = sf->fv->selected; + int i; + KernPair *kp; + PST *pst; + + scale = (as+des)/(double) (sf->ascent+sf->descent); + if ( sf->pfminfo.os2_typoascent!=0 ) { + sf->pfminfo.os2_typoascent = as; + sf->pfminfo.os2_typodescent = -des; + sf->pfminfo.os2_winascent *= scale; + sf->pfminfo.os2_windescent *= scale; + } + if ( as+des == sf->ascent+sf->descent ) { + if ( as!=sf->ascent && des!=sf->descent ) { + sf->ascent = as; sf->descent = des; + sf->changed = true; + } +return( false ); + } + + transform[0] = transform[3] = scale; + transform[1] = transform[2] = transform[4] = transform[5] = 0; + bvts.func = bvt_none; + sf->fv->selected = galloc(sf->charcnt); + memset(sf->fv->selected,1,sf->charcnt); + + sf->ascent = as; sf->descent = des; + + FVTransFunc(sf->fv,transform,0,&bvts, + fvt_dobackground|fvt_round_to_int|fvt_dontsetwidth); + free(sf->fv->selected); + sf->fv->selected = oldselected; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kp=sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) + kp->off = rint(scale*kp->off); + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_position ) { + pst->u.pos.xoff = rint(scale*pst->u.pos.xoff); + pst->u.pos.yoff = rint(scale*pst->u.pos.yoff); + pst->u.pos.h_adv_off = rint(scale*pst->u.pos.h_adv_off); + pst->u.pos.v_adv_off = rint(scale*pst->u.pos.v_adv_off); + } else if ( pst->type==pst_pair ) { + pst->u.pair.vr[0].xoff = rint(scale*pst->u.pair.vr[0].xoff); + pst->u.pair.vr[0].yoff = rint(scale*pst->u.pair.vr[0].yoff); + pst->u.pair.vr[0].h_adv_off = rint(scale*pst->u.pair.vr[0].h_adv_off); + pst->u.pair.vr[0].v_adv_off = rint(scale*pst->u.pair.vr[0].v_adv_off); + pst->u.pair.vr[1].xoff = rint(scale*pst->u.pair.vr[1].xoff); + pst->u.pair.vr[1].yoff = rint(scale*pst->u.pair.vr[1].yoff); + pst->u.pair.vr[1].h_adv_off = rint(scale*pst->u.pair.vr[1].h_adv_off); + pst->u.pair.vr[1].v_adv_off = rint(scale*pst->u.pair.vr[1].v_adv_off); + } + } + } + + sf->changed = true; +return( true ); +} + +static void FVMenuBitmaps(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + BitmapDlg(fv,NULL,mi->mid==MID_AvailBitmaps ); +} + +static void FVMenuTransform(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( FVAnyCharSelected(fv)==-1 ) +return; + TransformDlgCreate(fv,FVTransFunc,getorigin,true); +} + +#ifdef FONTFORGE_CONFIG_NONLINEAR +static void FVMenuNLTransform(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( FVAnyCharSelected(fv)==-1 ) +return; + NonLinearDlg(fv,NULL); +} +#endif + +static void FVMenuStroke(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVStroke(fv); +} + +#ifdef FONTFORGE_CONFIG_TILEPATH +static void FVMenuTilePath(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVTile(fv); +} +#endif + +static void FVOverlap(FontView *fv,enum overlap_type ot) { + int i, cnt=0, layer; + + /* We know it's more likely that we'll find a problem in the overlap code */ + /* than anywhere else, so let's save the current state against a crash */ + DoAutoSaves(); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_RemovingOverlap,_STR_RemovingOverlap,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SCPreserveState(sc,false); + MinimumDistancesFree(sc->md); + sc->md = NULL; + for ( layer = ly_fore; layerlayer_cnt; ++layer ) + sc->layers[layer].splines = SplineSetRemoveOverlap(sc,sc->layers[layer].splines,ot); + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuOverlap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + /* We know it's more likely that we'll find a problem in the overlap code */ + /* than anywhere else, so let's save the current state against a crash */ + DoAutoSaves(); + + FVOverlap(fv,mi->mid==MID_RmOverlap ? over_remove : + mi->mid==MID_Intersection ? over_intersect : + over_findinter); +} + +static void FVMenuInline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + OutlineDlg(fv,NULL,NULL,true); +} + +static void FVMenuOutline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + OutlineDlg(fv,NULL,NULL,false); +} + +static void FVMenuShadow(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + ShadowDlg(fv,NULL,NULL,false); +} + +static void FVMenuWireframe(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + ShadowDlg(fv,NULL,NULL,true); +} + +void _FVSimplify(FontView *fv,struct simplifyinfo *smpl) { + int i, cnt=0, layer; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Simplifying,_STR_Simplifying,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SCPreserveState(sc,false); + for ( layer = ly_fore; layerlayer_cnt; ++layer ) + sc->layers[layer].splines = SplineCharSimplify(sc,sc->layers[layer].splines,smpl); + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVSimplify(FontView *fv,int type) { + static struct simplifyinfo smpl = { sf_normal,.75,.05,0 }; + + smpl.err = (fv->sf->ascent+fv->sf->descent)/1000.; + + if ( type==1 ) { + if ( !SimplifyDlg(fv->sf,&smpl)) +return; + } + _FVSimplify(fv,&smpl); +} + +static void FVMenuSimplify(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVSimplify( (FontView *) GDrawGetUserData(gw),false ); +} + +static void FVMenuSimplifyMore(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVSimplify( (FontView *) GDrawGetUserData(gw),true ); +} + +static void FVMenuCleanup(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVSimplify( (FontView *) GDrawGetUserData(gw),-1 ); +} + +static void FVAddExtrema(FontView *fv) { + int i, cnt=0, layer; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_AddingExtrema,_STR_AddingExtrema,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SCPreserveState(sc,false); + for ( layer = ly_fore; layerlayer_cnt; ++layer ) + SplineCharAddExtrema(sc->layers[layer].splines,false); + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuAddExtrema(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVAddExtrema( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVMenuCorrectDir(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i, cnt=0, changed, refchanged, preserved, layer; + int askedall=-1, asked; + static int buts[] = { _STR_UnlinkAll, _STR_Unlink, _STR_No, _STR_Cancel, 0 }; + RefChar *ref; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_CorrectingDirection,_STR_CorrectingDirection,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + + changed = refchanged = preserved = false; + asked = askedall; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]*ref->transform[3]<0 || + (ref->transform[0]==0 && ref->transform[1]*ref->transform[2]>0)) { + if ( asked==-1 ) { + asked = GWidgetAskR(_STR_FlippedRef,buts,0,2,_STR_FlippedRefUnlink, sc->name ); + if ( asked==3 ) +return; + else if ( asked==2 ) + break; + else if ( asked==0 ) + askedall = 0; + } + if ( asked==0 || asked==1 ) { + if ( !preserved ) { + preserved = refchanged = true; + SCPreserveState(sc,false); + } + SCRefToSplines(sc,ref); + } + } + } + + if ( !preserved && sc->layers[layer].splines!=NULL ) { + SCPreserveState(sc,false); + preserved = true; + } + sc->layers[layer].splines = SplineSetsCorrect(sc->layers[layer].splines,&changed); + } + if ( changed || refchanged ) + SCCharChangedUpdate(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVRound2Int(FontView *fv) { + int i, cnt=0; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Rounding,_STR_Rounding,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SCPreserveState(fv->sf->chars[i],false); + SCRound2Int( fv->sf->chars[i]); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuRound2Int(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVRound2Int( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVMenuAutotrace(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVAutoTrace(fv,e!=NULL && (e->u.mouse.state&ksm_shift)); +} + +void FVBuildAccent(FontView *fv,int onlyaccents) { + int i, cnt=0; + SplineChar dummy; + static int buts[] = { _STR_Yes, _STR_No, 0 }; + + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_Buildingaccented,_STR_Buildingaccented,_STR_NULL,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + if ( sc==NULL ) + sc = SCBuildDummy(&dummy,fv->sf,i); + else if ( screen_display==NULL && sc->unicodeenc == 0x00c5 /* Aring */ && + sc->layers[ly_fore].splines!=NULL ) { + if ( GWidgetAskR(_STR_Replacearing,buts,0,1,_STR_Areyousurearing)==1 ) + continue; + } + if ( SFIsSomethingBuildable(fv->sf,sc,onlyaccents) ) { + sc = SFMakeChar(fv->sf,i); + SCBuildComposit(fv->sf,sc,!onlycopydisplayed,fv); + } + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuBuildAccent(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVBuildAccent( (FontView *) GDrawGetUserData(gw), true ); +} + +static void FVMenuBuildComposite(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVBuildAccent( (FontView *) GDrawGetUserData(gw), false ); +} + +int ScriptLangMatch(struct script_record *sr,uint32 script,uint32 lang) { + int i, j; + + if ( script==CHR('*',' ',' ',' ') && lang==CHR('*',' ',' ',' ') ) +return(true); /* Wild card */ + + for ( i=0; sr[i].script!=0; ++i ) { + if ( sr[i].script==script || script==CHR('*',' ',' ',' ') ) { + for ( j=0; sr[i].langs[j]!=0 ; ++j ) + if ( sr[i].langs[j]==lang || lang==CHR('*',' ',' ',' ') ) +return( true ); + if ( sr[i].script==script ) +return( false ); + } + } +return( false ); +} + +static void SCReplaceWith(SplineChar *dest, SplineChar *src) { + int enc=dest->enc, uenc=dest->unicodeenc, oenc = dest->old_enc; + Undoes *u[2], *r1; + SplineSet *back = dest->layers[ly_back].splines; + ImageList *images = dest->layers[ly_back].images; + struct splinecharlist *scl = dest->dependents; + RefChar *refs; + + if ( src==dest ) +return; + + SCPreserveState(src,2); + SCPreserveState(dest,2); + u[0] = dest->layers[ly_fore].undoes; u[1] = dest->layers[ly_back].undoes; r1 = dest->layers[ly_back].redoes; + + free(dest->name); + SplinePointListsFree(dest->layers[ly_fore].splines); + RefCharsFree(dest->layers[ly_fore].refs); + StemInfosFree(dest->hstem); + StemInfosFree(dest->vstem); + DStemInfosFree(dest->dstem); + MinimumDistancesFree(dest->md); + KernPairsFree(dest->kerns); + AnchorPointsFree(dest->anchor); + PSTFree(dest->possub); + free(dest->ttf_instrs); + + *dest = *src; + dest->layers[ly_back].images = images; + dest->layers[ly_back].splines = back; + dest->layers[ly_fore].undoes = u[0]; dest->layers[ly_back].undoes = u[1]; dest->layers[ly_fore].redoes = NULL; dest->layers[ly_back].redoes = r1; + dest->enc = enc; dest->unicodeenc = uenc; dest->old_enc = oenc; + dest->dependents = scl; + dest->namechanged = true; + + src->name = copy(".notdef"); + src->layers[ly_fore].splines = NULL; + src->layers[ly_fore].refs = NULL; + src->hstem = NULL; + src->vstem = NULL; + src->dstem = NULL; + src->md = NULL; + src->kerns = NULL; + src->anchor = NULL; + src->possub = NULL; + src->ttf_instrs = NULL; + src->ttf_instrs_len = 0; + /* Retain the undoes/redoes */ + /* Retain the dependents */ + + /* Fix up dependant info */ + for ( refs = dest->layers[ly_fore].refs; refs!=NULL; refs=refs->next ) { + for ( scl=refs->sc->dependents; scl!=NULL; scl=scl->next ) + if ( scl->sc==src ) + scl->sc = dest; + } + SCCharChangedUpdate(src); + SCCharChangedUpdate(dest); +} + +void FVApplySubstitution(FontView *fv,uint32 script, uint32 lang, uint32 tag) { + SplineFont *sf = fv->sf; + SplineChar *sc, *replacement; + PST *pst; + int i; + + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] && (sc=sf->chars[i])!=NULL ) { + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_substitution && pst->tag==tag && + ScriptLangMatch(sf->script_lang[pst->script_lang_index],script,lang)) + break; + } + if ( pst!=NULL ) { + replacement = SFGetCharDup(sf,-1,pst->u.subs.variant); + if ( replacement!=NULL ) + SCReplaceWith(sc,replacement); + } + } +} + +#if HANYANG +static void FVMenuModifyComposition(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( fv->sf->rules!=NULL ) + SFModifyComposition(fv->sf); +} + +static void FVMenuBuildSyllables(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + if ( fv->sf->rules!=NULL ) + SFBuildSyllables(fv->sf); +} +#endif + +static void FVMenuMergeFonts(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVMergeFonts(fv); +} + +static void FVMenuInterpFonts(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVInterpolateFonts(fv); +} + +void FVScrollToChar(FontView *fv,int i) { + + if ( fv->v==NULL || fv->colcnt==0 ) /* Can happen in scripts */ +return; + + if ( i!=-1 ) { + if ( i/fv->colcntrowoff || i/fv->colcnt >= fv->rowoff+fv->rowcnt ) { + fv->rowoff = i/fv->colcnt; + if ( fv->rowcnt>= 3 ) + --fv->rowoff; + if ( fv->rowoff+fv->rowcnt>=fv->rowltot ) + fv->rowoff = fv->rowltot-fv->rowcnt; + if ( fv->rowoff<0 ) fv->rowoff = 0; + GScrollBarSetPos(fv->vsb,fv->rowoff); + GDrawRequestExpose(fv->v,NULL,false); + } + } +} + +static void FVShowInfo(FontView *fv); +void FVChangeChar(FontView *fv,int i) { + + if ( i!=-1 ) { + FVDeselectAll(fv); + fv->selected[i] = true; + fv->sel_index = 1; + fv->end_pos = fv->pressed_pos = i; + FVToggleCharSelected(fv,i); + FVScrollToChar(fv,i); + FVShowInfo(fv); + } +} + +static void FVMenuChangeChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *sf = fv->sf; + int pos = FVAnyCharSelected(fv); + if ( pos>=0 ) { + if ( mi->mid==MID_Next ) + ++pos; + else if ( mi->mid==MID_Prev ) + --pos; + else if ( mi->mid==MID_NextDef ) { + for ( ++pos; poscharcnt && sf->chars[pos]==NULL; ++pos ); + if ( pos>=sf->charcnt ) { + if ( sf->encoding_name==em_big5 && FVAnyCharSelected(fv)<0xa140 ) + pos = 0xa140; + else if ( sf->encoding_name==em_big5hkscs && FVAnyCharSelected(fv)<0x8140 ) + pos = 0x8140; + else if ( sf->encoding_name==em_johab && FVAnyCharSelected(fv)<0x8431 ) + pos = 0x8431; + else if ( sf->encoding_name==em_wansung && FVAnyCharSelected(fv)<0xa1a1 ) + pos = 0xa1a1; + else if ( sf->encoding_name==em_jisgb && FVAnyCharSelected(fv)<0xa1a1 ) + pos = 0xa1a1; + else if ( sf->encoding_name==em_sjis && FVAnyCharSelected(fv)<0x8100 ) + pos = 0x8100; + else if ( sf->encoding_name==em_sjis && FVAnyCharSelected(fv)<0xb000 ) + pos = 0xe000; + if ( pos>=sf->charcnt ) +return; + } + } else if ( mi->mid==MID_PrevDef ) { + for ( --pos; pos>=0 && sf->chars[pos]==NULL; --pos ); + if ( pos<0 ) +return; + } + } + if ( pos<0 ) pos = sf->charcnt-1; + else if ( pos>= sf->charcnt ) pos = 0; + if ( pos>=0 && poscharcnt ) + FVChangeChar(fv,pos); +} + +static void FVMenuGotoChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int pos = GotoChar(fv->sf); + FVChangeChar(fv,pos); +} + +static void FVMenuLigatures(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFShowLigatures(fv->sf,NULL); +} + +static void FVMenuKernPairs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFKernPrepare(fv->sf,false); + SFShowKernPairs(fv->sf,NULL,NULL); + SFKernCleanup(fv->sf,false); +} + +static void FVMenuAnchorPairs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFShowKernPairs(fv->sf,NULL,mi->ti.userdata); +} + +static void FVMenuShowAtt(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + ShowAtt(fv->sf); +} + +static void FVMenuCompact(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FontView *fvs; + int fv_reformat; + + for ( fvs=fv->sf->fv; fvs!=NULL; fvs = fvs->nextsame ) + if ( fvs->fontinfo ) + FontInfoDestroy(fvs); + + if ( mi->mid==MID_CompactedView ) + fv_reformat = SFCompactFont(fv->sf); + else + fv_reformat = SFUncompactFont(fv->sf); + if ( !fv_reformat ) +return; + for ( fvs=fv->sf->fv; fvs!=NULL; fvs = fvs->nextsame ) { + free(fvs->selected); + fvs->selected = gcalloc(fv->sf->charcnt,sizeof(char)); + } + FontViewReformatAll(fv->sf); +} + +static void FVChangeDisplayFont(FontView *fv,BDFFont *bdf) { + int samesize=0; + + if ( fv->v==NULL ) /* Can happen in scripts */ +return; + + if ( fv->show!=bdf ) { + if ( fv->show!=NULL && fv->cbw == bdf->pixelsize+1 ) + samesize = true; + fv->show = bdf; + if ( bdf->pixelsize<20 ) { + if ( bdf->pixelsize<=9 ) + fv->magnify = 3; + else + fv->magnify = 2; + samesize = ( fv->show && fv->cbw == (bdf->pixelsize*fv->magnify)+1 ); + } else + fv->magnify = 1; + fv->cbw = (bdf->pixelsize*fv->magnify)+1; + fv->cbh = (bdf->pixelsize*fv->magnify)+1+FV_LAB_HEIGHT+1; + if ( samesize ) { + GDrawRequestExpose(fv->v,NULL,false); + } else if ((( bdf->pixelsize<=fv->sf->display_size || bdf->pixelsize<=-fv->sf->display_size ) && + fv->sf->top_enc!=-1 /* Not defaulting */ ) || + bdf->pixelsize<=48 ) { + GDrawResize(fv->gw, + fv->sf->desired_col_cnt*fv->cbw+1+GDrawPointsToPixels(fv->gw,_GScrollBar_Width), + fv->sf->desired_row_cnt*fv->cbh+1+fv->mbh+fv->infoh); + } else if ( bdf->pixelsize<96 ) { + GDrawResize(fv->gw, + 8*fv->cbw+1+GDrawPointsToPixels(fv->gw,_GScrollBar_Width), + 2*fv->cbh+1+fv->mbh+fv->infoh); + } else { + GDrawResize(fv->gw, + 4*fv->cbw+1+GDrawPointsToPixels(fv->gw,_GScrollBar_Width), + fv->cbh+1+fv->mbh+fv->infoh); + } + /* colcnt, rowcnt, etc. will be set by the resize handler */ + } +} + +void FVChangeDisplayBitmap(FontView *fv,BDFFont *bdf) { + FVChangeDisplayFont(fv,bdf); + fv->sf->display_size = fv->show->pixelsize; +} + +struct md_data { + int done; + int ish; + FontView *fv; +}; + +static int md_e_h(GWindow gw, GEvent *e) { + if ( e->type==et_close ) { + struct md_data *d = GDrawGetUserData(gw); + d->done = true; + } else if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct md_data *d = GDrawGetUserData(gw); + static int masks[] = { fvm_baseline, fvm_origin, fvm_advanceat, fvm_advanceto, -1 }; + int i, metrics; + if ( GGadgetGetCid(e->u.control.g)==10 ) { + metrics = 0; + for ( i=0; masks[i]!=-1 ; ++i ) + if ( GGadgetIsChecked(GWidgetGetControl(gw,masks[i]))) + metrics |= masks[i]; + if ( d->ish ) + default_fv_showhmetrics = d->fv->showhmetrics = metrics; + else + default_fv_showvmetrics = d->fv->showvmetrics = metrics; + } + d->done = true; + } else if ( e->type==et_char ) { +#if 0 + if ( e->u.chr.keysym == GK_F1 || e->u.chr.keysym == GK_Help ) { + help("fontinfo.html"); +return( true ); + } +#endif +return( false ); + } +return( true ); +} + +static void FVMenuShowMetrics(GWindow fvgw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(fvgw); + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + struct md_data d; + GGadgetCreateData gcd[7]; + GTextInfo label[6]; + int metrics = mi->mid==MID_ShowHMetrics ? fv->showhmetrics : fv->showvmetrics; + + d.fv = fv; + d.done = 0; + d.ish = mi->mid==MID_ShowHMetrics; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<v,NULL,false); +} + +static void FVMenuSize(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw), *fvs, *fvss; + int dspsize = fv->filled->pixelsize; + int changedmodifier = false; + + fv->magnify = 1; + if ( mi->mid == MID_24 ) + default_fv_font_size = dspsize = 24; + else if ( mi->mid == MID_36 ) + default_fv_font_size = dspsize = 36; + else if ( mi->mid == MID_48 ) + default_fv_font_size = dspsize = 48; + else if ( mi->mid == MID_72 ) + default_fv_font_size = dspsize = 72; + else if ( mi->mid == MID_96 ) + default_fv_font_size = dspsize = 96; + else if ( mi->mid == MID_FitToEm ) { + default_fv_bbsized = fv->bbsized = !fv->bbsized; + fv->sf->display_bbsized = fv->bbsized; + changedmodifier = true; + } else { + default_fv_antialias = fv->antialias = !fv->antialias; + fv->sf->display_antialias = fv->antialias; + changedmodifier = true; + } + SavePrefs(); + if ( fv->filled!=fv->show || fv->filled->pixelsize != dspsize || changedmodifier ) { + BDFFont *new, *old; + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + fvs->touched = false; + while ( 1 ) { + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( !fvs->touched ) + break; + if ( fvs==NULL ) + break; + old = fvs->filled; + new = SplineFontPieceMeal(fvs->sf,dspsize, + (fvs->antialias?pf_antialias:0)|(fvs->bbsized?pf_bbsized:0), + NULL); + for ( fvss=fvs; fvss!=NULL; fvss = fvss->nextsame ) { + if ( fvss->filled==old ) { + fvss->filled = new; + fvss->antialias = fvs->antialias; + fvss->bbsized = fvs->bbsized; + if ( fvss->show==old || fvss==fv ) + FVChangeDisplayFont(fvss,new); + fvss->touched = true; + } + } + BDFFontFree(old); + } + fv->sf->display_size = -dspsize; + if ( fv->cidmaster!=NULL ) { + int i; + for ( i=0; icidmaster->subfontcnt; ++i ) + fv->cidmaster->subfonts[i]->display_size = -dspsize; + } + } +} + +static void FVMenuShowBitmap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + BDFFont *bdf = mi->ti.userdata; + + FVChangeDisplayBitmap(fv,bdf); /* Let's not change any of the others */ +} + +void FVShowFilled(FontView *fv) { + FontView *fvs; + + fv->magnify = 1; + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->show!=fvs->filled ) + FVChangeDisplayFont(fvs,fvs->filled); + fv->sf->display_size = -fv->filled->pixelsize; +} + +static void ellistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int anychars = FVAnyCharSelected(fv); + int anybuildable, anytraceable; + int order2 = fv->sf->order2; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_CharInfo: + mi->ti.disabled = anychars<0 /*|| fv->cidmaster!=NULL*/; + break; + case MID_ShowDependents: + mi->ti.disabled = anychars<0 || fv->sf->chars[anychars]==NULL || + fv->sf->chars[anychars]->dependents == NULL; + break; + case MID_FindProblems: + mi->ti.disabled = anychars==-1; + break; + case MID_Transform: case MID_NLTransform: + mi->ti.disabled = anychars==-1; + /* some Transformations make sense on bitmaps now */ + break; + case MID_AddExtrema: + mi->ti.disabled = anychars==-1 || fv->sf->onlybitmaps; + break; + case MID_Simplify: + mi->ti.disabled = anychars==-1 || fv->sf->onlybitmaps; + break; + case MID_MetaFont: case MID_Stroke: + case MID_RmOverlap: case MID_Effects: + mi->ti.disabled = anychars==-1 || fv->sf->onlybitmaps || order2; + break; + case MID_Round: case MID_Correct: + mi->ti.disabled = anychars==-1 || fv->sf->onlybitmaps; + break; +#ifdef FONTFORGE_CONFIG_TILEPATH + case MID_TilePath: + mi->ti.disabled = anychars==-1 || fv->sf->onlybitmaps || ClipBoardToSplineSet()==NULL || order2; + break; +#endif + case MID_AvailBitmaps: + mi->ti.disabled = fv->sf->mm!=NULL; + break; + case MID_RegenBitmaps: + mi->ti.disabled = fv->sf->bitmaps==NULL || fv->sf->onlybitmaps || + fv->sf->mm!=NULL; + break; + case MID_BuildAccent: + anybuildable = false; + if ( anychars!=-1 ) { + int i; + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) { + SplineChar *sc, dummy; + sc = fv->sf->chars[i]; + if ( sc==NULL ) + sc = SCBuildDummy(&dummy,fv->sf,i); + if ( SFIsSomethingBuildable(fv->sf,sc,false)) { + anybuildable = true; + break; + } + } + } + mi->ti.disabled = !anybuildable; + break; + case MID_Autotrace: + anytraceable = false; + if ( FindAutoTraceName()!=NULL && anychars!=-1 ) { + int i; + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && fv->sf->chars[i]!=NULL && + fv->sf->chars[i]->layers[ly_back].images!=NULL ) { + anytraceable = true; + break; + } + } + mi->ti.disabled = !anytraceable; + break; + case MID_MergeFonts: + mi->ti.disabled = fv->sf->bitmaps!=NULL && fv->sf->onlybitmaps; + break; + case MID_InterpolateFonts: + mi->ti.disabled = fv->sf->onlybitmaps; + break; + } + } +} + +void FVMetricsCenter(FontView *fv,int docenter) { + int i; + DBounds bb; + real transform[6]; + + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0.0; + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SplineCharFindBounds(sc,&bb); + if ( docenter ) + transform[4] = (sc->width-(bb.maxx-bb.minx))/2 - bb.minx; + else + transform[4] = (sc->width-(bb.maxx-bb.minx))/3 - bb.minx; + if ( transform[4]!=0 ) + FVTrans(fv,sc,transform,NULL,fvt_dontmovewidth); + } +} + +static void FVMenuCenter(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVMetricsCenter(fv,mi->mid==MID_Center); +} + +static void FVMenuSetWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + if ( FVAnyCharSelected(fv)==-1 ) +return; + if ( mi->mid == MID_SetVWidth && !fv->sf->hasvmetrics ) +return; + FVSetWidth(fv,mi->mid==MID_SetWidth?wt_width: + mi->mid==MID_SetLBearing?wt_lbearing: + mi->mid==MID_SetRBearing?wt_rbearing: + wt_vwidth); +} + +static void FVMenuAutoWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVAutoWidth(fv); +} + +static void FVMenuAutoKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVAutoKern(fv); +} + +static void FVMenuKernByClasses(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + ShowKernClasses(fv->sf,NULL,false); +} + +static void FVMenuVKernByClasses(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + ShowKernClasses(fv->sf,NULL,true); +} + +static void FVMenuRemoveKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVRemoveKerns(fv); +} + +static void FVMenuRemoveVKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVRemoveVKerns(fv); +} + +static void FVMenuVKernFromHKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + FVVKernFromHKern(fv); +} + +static void FVMenuPrint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + PrintDlg(fv,NULL,NULL); +} + +static void FVMenuDisplay(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + DisplayDlg(fv->sf); +} + +static void FVMenuExecute(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + ScriptDlg(fv); +} + +static void mtlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int anychars = FVAnyCharSelected(fv); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Center: case MID_Thirds: case MID_SetWidth: + case MID_SetLBearing: case MID_SetRBearing: + mi->ti.disabled = anychars==-1; + break; + case MID_SetVWidth: + mi->ti.disabled = anychars==-1 || !fv->sf->hasvmetrics; + break; + case MID_VKernByClass: + case MID_VKernFromH: + case MID_RmVKern: + mi->ti.disabled = !fv->sf->hasvmetrics; + break; + } + } +} + +static void FVAutoHint(FontView *fv,int removeOverlap) { + int i, cnt=0; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_AutoHintingFont,_STR_AutoHintingFont,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + sc->manualhints = false; + SplineCharAutoHint(sc,removeOverlap); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuAutoHint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + int removeOverlap = e==NULL || !(e->u.mouse.state&ksm_shift); + FVAutoHint( (FontView *) GDrawGetUserData(gw), removeOverlap ); +} + +static void FVAutoHintSubs(FontView *fv) { + int i, cnt=0; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_FindingSubstitutionPts,_STR_FindingSubstitutionPts,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SCFigureHintMasks(sc); + SCUpdateAll(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuAutoHintSubs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVAutoHintSubs( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVAutoCounter(FontView *fv) { + int i, cnt=0; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_FindingCounterMasks,_STR_FindingCounterMasks,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SCFigureCounterMasks(sc); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuAutoCounter(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVAutoCounter( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVDontAutoHint(FontView *fv) { + int i; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + sc->manualhints = true; + } +} + +static void FVMenuDontAutoHint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVDontAutoHint( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVAutoInstr(FontView *fv) { + BlueData bd; + int i, cnt=0; + + QuickBlues(fv->sf,&bd); + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_AutoInstructingFont,_STR_AutoInstructingFont,0,cnt,1); + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + SCAutoInstr(sc,&bd); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); +} + +static void FVMenuAutoInstr(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FVAutoInstr( (FontView *) GDrawGetUserData(gw) ); +} + +static void FVMenuEditInstrs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int index = FVAnyCharSelected(fv); + SplineChar *sc; + if ( index<0 ) +return; + sc = SFMakeChar(fv->sf,index); + SCEditInstructions(sc); +} + +static void FVMenuEditTable(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFEditTable(fv->sf, + mi->mid==MID_Editprep?CHR('p','r','e','p'): + mi->mid==MID_Editfpgm?CHR('f','p','g','m'): + CHR('c','v','t',' ')); +} + +static void FVMenuClearInstrs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineChar *sc; + int i; + + if ( !SFCloseAllInstrs(fv->sf)) +return; + + for ( i=0; isf->charcnt; ++i ) if ( (sc = fv->sf->chars[i])!=NULL ) { + if ( sc->ttf_instrs_len!=0 ) { + free(sc->ttf_instrs); + sc->ttf_instrs = NULL; + sc->ttf_instrs_len = 0; + SCCharChangedUpdate(sc); + } + } +} + +static void FVClearHints(FontView *fv) { + int i; + +#if 0 + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_AutoHintingFont,_STR_AutoHintingFont,0,cnt,1); +#endif + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + sc->manualhints = true; + SCClearHintMasks(sc,true); + StemInfosFree(sc->hstem); + StemInfosFree(sc->vstem); + sc->hstem = sc->vstem = NULL; + sc->hconflicts = sc->vconflicts = false; + DStemInfosFree(sc->dstem); + sc->dstem = NULL; + MinimumDistancesFree(sc->md); + sc->md = NULL; + SCClearRounds(sc); + SCOutOfDateBackground(sc); + SCUpdateAll(sc); +#if 0 + if ( !GProgressNext()) + break; +#endif + } +#if 0 + GProgressEndIndicator(); +#endif +} + +static void FVMenuClearHints(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FVClearHints(fv); +} + +static void FVMenuClearWidthMD(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i, changed; + MinimumDistance *md, *prev, *next; + + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL && fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + prev=NULL; changed = false; + for ( md=sc->md; md!=NULL; md=next ) { + next = md->next; + if ( md->sp2==NULL ) { + if ( prev==NULL ) + sc->md = next; + else + prev->next = next; + chunkfree(md,sizeof(MinimumDistance)); + changed = true; + } else + prev = md; + } + if ( changed ) { + sc->manualhints = true; + SCOutOfDateBackground(sc); + SCUpdateAll(sc); + } + } +} + +static void FVMenuHistograms(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SFHistogram(fv->sf, NULL, FVAnyCharSelected(fv)!=-1?fv->selected:NULL, + mi->mid==MID_HStemHist ? hist_hstem : + mi->mid==MID_VStemHist ? hist_vstem : + hist_blues); +} + +void FVSetTitle(FontView *fv) { + unichar_t *title, *ititle, *temp; + char *file=NULL; + int len; + + len = strlen(fv->sf->fontname); + if ( (file = fv->sf->filename)==NULL ) + file = fv->sf->origname; + if ( file!=NULL ) + len += 2+strlen(file); + title = galloc((len+1)*sizeof(unichar_t)); + uc_strcpy(title,fv->sf->fontname); + if ( file!=NULL ) { + uc_strcat(title," "); + temp = def2u_copy(GFileNameTail(file)); + u_strcat(title,temp); + free(temp); + } + ititle = uc_copy(fv->sf->fontname); + GDrawSetWindowTitles(fv->gw,title,ititle); + free(title); + free(ititle); +} + +static void FVMenuShowSubFont(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *new = mi->ti.userdata; + MetricsView *mv, *mvnext; + + for ( mv=fv->metrics; mv!=NULL; mv = mvnext ) { + /* Don't bother trying to fix up metrics views, just not worth it */ + mvnext = mv->next; + GDrawDestroyWindow(mv->gw); + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + if ( fv->sf->charcnt!=new->charcnt ) { + free(fv->selected); + fv->selected = gcalloc(new->charcnt,sizeof(char)); + } + fv->sf = new; + FVSetTitle(fv); + FontViewReformatOne(fv); +} + +static void FVMenuConvert2CID(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster; + + if ( cidmaster!=NULL ) +return; + MakeCIDMaster(fv->sf,false,NULL,NULL); +} + +static void FVMenuConvertByCMap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster; + + if ( cidmaster!=NULL ) +return; + MakeCIDMaster(fv->sf,true,NULL,NULL); +} + +static void FVMenuFlatten(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster; + SplineChar **chars; + int i,j,max; + + if ( cidmaster==NULL ) +return; + /* This doesn't change the ordering, so no need for special tricks to */ + /* preserve scrolling location. */ + for ( i=max=0; isubfontcnt; ++i ) + if ( maxsubfonts[i]->charcnt ) + max = cidmaster->subfonts[i]->charcnt; + chars = gcalloc(max,sizeof(SplineChar *)); + for ( j=0; jsubfontcnt; ++i ) { + if ( jsubfonts[i]->charcnt && cidmaster->subfonts[i]->chars[j]!=NULL ) { + chars[j] = cidmaster->subfonts[i]->chars[j]; + cidmaster->subfonts[i]->chars[j] = NULL; + break; + } + } + } + CIDFlatten(cidmaster,chars,max); +} + +static void FVMenuFlattenByCMap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster; + + if ( cidmaster==NULL ) +return; + SFFlattenByCMap(cidmaster,NULL); +} + +static void FVInsertInCID(FontView *fv,SplineFont *sf) { + SplineFont *cidmaster = fv->cidmaster; + SplineFont **subs; + int i; + + subs = galloc((cidmaster->subfontcnt+1)*sizeof(SplineFont *)); + for ( i=0; isubfontcnt && cidmaster->subfonts[i]!=fv->sf; ++i ) + subs[i] = cidmaster->subfonts[i]; + subs[i] = sf; + for ( ; isubfontcnt ; ++i ) + subs[i+1] = cidmaster->subfonts[i]; + ++cidmaster->subfontcnt; + free(cidmaster->subfonts); + cidmaster->subfonts = subs; + cidmaster->changed = true; + sf->cidmaster = cidmaster; + + if ( fv->sf->charcnt!=sf->charcnt ) { + free(fv->selected); + fv->selected = gcalloc(sf->charcnt,sizeof(char)); + } + fv->sf = sf; + sf->fv = fv; + FontViewReformatOne(fv); + FVSetTitle(fv); +} + +static void FVMenuInsertFont(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster; + SplineFont *new; + struct cidmap *map; + char *filename; + + if ( cidmaster==NULL || cidmaster->subfontcnt>=255 ) /* Open type allows 1 byte to specify the fdselect */ +return; + + filename = GetPostscriptFontName(NULL,false); + if ( filename==NULL ) +return; + new = LoadSplineFont(filename,0); + free(filename); + if ( new==NULL ) +return; + if ( new->fv == fv ) /* Already part of us */ +return; + if ( new->fv != NULL ) { + if ( new->fv->gw!=NULL ) + GDrawRaise(new->fv->gw); + GWidgetErrorR(_STR_CloseFont,_STR_CloseFontForCID,new->origname); +return; + } + + map = FindCidMap(cidmaster->cidregistry,cidmaster->ordering,cidmaster->supplement,cidmaster); + SFEncodeToMap(new,map); + if ( !PSDictHasEntry(new->private,"lenIV")) + PSDictChangeEntry(new->private,"lenIV","1"); /* It's 4 by default, in CIDs the convention seems to be 1 */ + new->display_antialias = fv->sf->display_antialias; + new->display_bbsized = fv->sf->display_bbsized; + new->display_size = fv->sf->display_size; + FVInsertInCID(fv,new); +} + +static void FVMenuInsertBlank(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster, *sf; + struct cidmap *map; + + if ( cidmaster==NULL || cidmaster->subfontcnt>=255 ) /* Open type allows 1 byte to specify the fdselect */ +return; + map = FindCidMap(cidmaster->cidregistry,cidmaster->ordering,cidmaster->supplement,cidmaster); + sf = SplineFontBlank(em_none,MaxCID(map)); + sf->cidmaster = cidmaster; + sf->display_antialias = fv->sf->display_antialias; + sf->display_bbsized = fv->sf->display_bbsized; + sf->display_size = fv->sf->display_size; + sf->private = gcalloc(1,sizeof(struct psdict)); + PSDictChangeEntry(sf->private,"lenIV","1"); /* It's 4 by default, in CIDs the convention seems to be 1 */ + FVInsertInCID(fv,sf); +} + +static void FVMenuRemoveFontFromCID(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster, *sf = fv->sf, *replace; + static int buts[] = { _STR_Remove, _STR_Cancel, 0 }; + int i; + MetricsView *mv, *mnext; + FontView *fvs; + + if ( cidmaster==NULL || cidmaster->subfontcnt<=1 ) /* Can't remove last font */ +return; + if ( GWidgetAskR(_STR_RemoveFont,buts,0,1,_STR_CIDRemoveFontCheck, + sf->fontname,cidmaster->fontname)==1 ) +return; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + CharView *cv, *next; + for ( cv = sf->chars[i]->views; cv!=NULL; cv = next ) { + next = cv->next; + GDrawDestroyWindow(cv->gw); + } + } + GDrawProcessPendingEvents(NULL); + for ( mv=fv->metrics; mv!=NULL; mv = mnext ) { + mnext = mv->next; + GDrawDestroyWindow(mv->gw); + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + /* Just in case... */ + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + + for ( i=0; isubfontcnt; ++i ) + if ( cidmaster->subfonts[i]==sf ) + break; + replace = i==0?cidmaster->subfonts[1]:cidmaster->subfonts[i-1]; + while ( isubfontcnt-1 ) { + cidmaster->subfonts[i] = cidmaster->subfonts[i+1]; + ++i; + } + --cidmaster->subfontcnt; + + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + if ( fvs->sf==sf ) { + fvs->sf = replace; + if ( replace->charcnt!=sf->charcnt ) { + free(fvs->selected); + fvs->selected = gcalloc(replace->charcnt,sizeof(char)); + } + FVSetTitle(fv); + } + } + FontViewReformatAll(fv->sf); + SplineFontFree(sf); +} + +static void FVMenuCIDFontInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *cidmaster = fv->cidmaster; + + if ( cidmaster==NULL ) +return; + FontInfo(cidmaster,-1,false); +} + +static void FVMenuMMValid(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + MMSet *mm = fv->sf->mm; + + if ( mm==NULL ) +return; + MMValid(mm,true); +} + +static void FVMenuCreateMM(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MMWizard(NULL); +} + +static void FVMenuMMInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + MMSet *mm = fv->sf->mm; + + if ( mm==NULL ) +return; + MMWizard(mm); +} + +static void FVMenuChangeMMBlend(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + MMSet *mm = fv->sf->mm; + + if ( mm==NULL ) +return; + MMChangeBlend(mm,fv); +} + +static void htlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int anychars = FVAnyCharSelected(fv); + int removeOverlap; + int multilayer = fv->sf->multilayer; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_AutoHint: + mi->ti.disabled = anychars==-1 || multilayer; + removeOverlap = e==NULL || !(e->u.mouse.state&ksm_shift); + free(mi->ti.text); + mi->ti.text = u_copy(GStringGetResource(removeOverlap?_STR_Autohint:_STR_FullAutohint,NULL)); + break; + case MID_HintSubsPt: case MID_AutoCounter: case MID_DontAutoHint: + mi->ti.disabled = fv->sf->order2 || anychars==-1 || multilayer; + break; + case MID_AutoInstr: case MID_EditInstructions: + mi->ti.disabled = !fv->sf->order2 || anychars==-1 || multilayer; + break; + case MID_Editfpgm: case MID_Editprep: case MID_Editcvt: + mi->ti.disabled = !fv->sf->order2 || multilayer; + break; + case MID_ClearHints: case MID_ClearWidthMD: case MID_ClearInstrs: + mi->ti.disabled = anychars==-1; + break; + } + } +} + +static void fllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int anychars = FVAnyCharSelected(fv); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_OpenOutline: + mi->ti.disabled = anychars==-1; + break; + case MID_OpenBitmap: + mi->ti.disabled = anychars==-1 || fv->sf->bitmaps==NULL; + break; + case MID_Revert: + mi->ti.disabled = fv->sf->origname==NULL; + break; + case MID_RevertGlyph: + mi->ti.disabled = fv->sf->filename==NULL || anychars==-1; + break; + case MID_Recent: + mi->ti.disabled = !RecentFilesAny(); + break; + case MID_ScriptMenu: + mi->ti.disabled = script_menu_names[0]==NULL; + break; + case MID_Print: + mi->ti.disabled = fv->sf->onlybitmaps; + break; + case MID_Display: + mi->ti.disabled = (fv->sf->onlybitmaps && fv->sf->bitmaps==NULL) || + fv->sf->multilayer; + break; + } + } +} + +#if HANYANG +static void hglistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + if ( mi->mid==MID_BuildSyllables || mi->mid==MID_ModifyComposition ) + mi->ti.disabled = fv->sf->rules==NULL; + } +} + +static GMenuItem hglist[] = { + { { (unichar_t *) _STR_NewComposition, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, 'N', ksm_shift|ksm_control, NULL, NULL, MenuNewComposition }, + { { (unichar_t *) _STR_ModifyComposition, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuModifyComposition, MID_ModifyComposition }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_BuildSyllables, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuBuildSyllables, MID_BuildSyllables }, + { NULL } +}; +#endif + +static void balistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + if ( mi->mid==MID_BuildAccent || mi->mid==MID_BuildComposite ) { + int anybuildable = false; + int onlyaccents = mi->mid==MID_BuildAccent; + int i; + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) { + SplineChar *sc, dummy; + sc = fv->sf->chars[i]; + if ( sc==NULL ) + sc = SCBuildDummy(&dummy,fv->sf,i); + if ( SFIsSomethingBuildable(fv->sf,sc,onlyaccents)) { + anybuildable = true; + break; + } + } + mi->ti.disabled = !anybuildable; + } + } +} + +static void aatlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + FontView *ofv; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_CopyFeatureToFont: + for ( ofv=fv_list; ofv!=NULL && ofv->sf==fv->sf; ofv = ofv->next ); + mi->ti.disabled = ofv==NULL; + break; + } + } +} + +static GMenuItem dummyitem[] = { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, NULL }; +static GMenuItem fllist[] = { + { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, 'N', ksm_control, NULL, NULL, MenuNew }, +#if HANYANG + { { (unichar_t *) _STR_Hangul, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', 0, hglist, hglistcheck, NULL, 0 }, +#endif + { { (unichar_t *) _STR_Open, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, 'O', ksm_control, NULL, NULL, MenuOpen }, + { { (unichar_t *) _STR_Recent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control, dummyitem, MenuRecentBuild, NULL, MID_Recent }, + { { (unichar_t *) _STR_Close, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'Q', ksm_control|ksm_shift, NULL, NULL, FVMenuClose }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Openoutline, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'u' }, 'H', ksm_control, NULL, NULL, FVMenuOpenOutline, MID_OpenOutline }, + { { (unichar_t *) _STR_Openbitmap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'J', ksm_control, NULL, NULL, FVMenuOpenBitmap, MID_OpenBitmap }, + { { (unichar_t *) _STR_Openmetrics, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'K', ksm_control, NULL, NULL, FVMenuOpenMetrics }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Save, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'S', ksm_control, NULL, NULL, FVMenuSave }, + { { (unichar_t *) _STR_Saveas, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, 'S', ksm_control|ksm_shift, NULL, NULL, FVMenuSaveAs }, + { { (unichar_t *) _STR_SaveAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 'S', ksm_control|ksm_meta, NULL, NULL, MenuSaveAll }, + { { (unichar_t *) _STR_Generate, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, 'G', ksm_control|ksm_shift, NULL, NULL, FVMenuGenerate }, + { { (unichar_t *) _STR_GenerateMac, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'G', ksm_control|ksm_meta, NULL, NULL, FVMenuGenerateFamily }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Import, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control|ksm_shift, NULL, NULL, FVMenuImport }, + { { (unichar_t *) _STR_Mergekern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'K', ksm_meta|ksm_control|ksm_shift, NULL, NULL, FVMenuMergeKern }, + { { (unichar_t *) _STR_Revertfile, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'R', ksm_control|ksm_shift, NULL, NULL, FVMenuRevert, MID_Revert }, + { { (unichar_t *) _STR_RevertGlyph, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'R', ksm_control|ksm_meta, NULL, NULL, FVMenuRevertGlyph, MID_RevertGlyph }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Print, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'P', ksm_control, NULL, NULL, FVMenuPrint, MID_Print }, + { { (unichar_t *) _STR_Display, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'P', ksm_control|ksm_meta, NULL, NULL, FVMenuDisplay, MID_Display }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_ExecuteScript, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, '.', ksm_control, NULL, NULL, FVMenuExecute }, + { { (unichar_t *) _STR_ScriptMenu, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, '\0', ksm_control, dummyitem, MenuScriptsBuild, NULL, MID_ScriptMenu }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Prefs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', ksm_control, NULL, NULL, MenuPrefs }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Quit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'Q' }, 'Q', ksm_control, NULL, NULL, FVMenuExit }, + { NULL } +}; + +static GMenuItem cflist[] = { + { { (unichar_t *) _STR_Allfonts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'A' }, '\0', ksm_control, NULL, NULL, FVMenuCopyFrom, MID_AllFonts }, + { { (unichar_t *) _STR_Displayedfont, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'D' }, '\0', ksm_control, NULL, NULL, FVMenuCopyFrom, MID_DisplayedFont }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_CharName, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'N' }, '\0', ksm_control, NULL, NULL, FVMenuCopyFrom, MID_CharName }, + { NULL } +}; + +static GMenuItem sclist[] = { + { { (unichar_t *) _STR_Default, &def_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) COLOR_DEFAULT, NULL, 0, 1, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { { NULL, &white_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0xffffff, NULL, 0, 1, 0, 0, 0, 0, 0, 0, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { { NULL, &red_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0xff0000, NULL, 0, 1, 0, 0, 0, 0, 0, 0, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { { NULL, &green_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0x00ff00, NULL, 0, 1, 0, 0, 0, 0, 0, 0, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { { NULL, &blue_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0x0000ff, NULL, 0, 1, 0, 0, 0, 0, 0, 0, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { { NULL, &yellow_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0xffff00, NULL, 0, 1, 0, 0, 0, 0, 0, 0, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { { NULL, &cyan_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0x00ffff, NULL, 0, 1, 0, 0, 0, 0, 0, 0, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { { NULL, &magenta_image, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0xff00ff, NULL, 0, 1, 0, 0, 0, 0, 0, 0, 0, '\0' }, '\0', ksm_control, NULL, NULL, FVMenuSelectColor }, + { NULL } +}; + +static GMenuItem sllist[] = { + { { (unichar_t *) _STR_SelectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'A', ksm_control, NULL, NULL, FVMenuSelectAll }, + { { (unichar_t *) _STR_DeselectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, GK_Escape, 0, NULL, NULL, FVMenuDeselectAll }, + { { (unichar_t *) _STR_SelectColor, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, sclist }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SelectByATT, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', 0, NULL, NULL, FVMenuSelectByPST }, + { NULL } +}; + +static GMenuItem edlist[] = { + { { (unichar_t *) _STR_Undo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'Z', ksm_control, NULL, NULL, FVMenuUndo, MID_Undo }, + { { (unichar_t *) _STR_Redo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'Y', ksm_control, NULL, NULL, FVMenuRedo, MID_Redo}, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Cut, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, 'X', ksm_control, NULL, NULL, FVMenuCut, MID_Cut }, + { { (unichar_t *) _STR_Copy, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'C', ksm_control, NULL, NULL, FVMenuCopy, MID_Copy }, + { { (unichar_t *) _STR_Copyref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'G', ksm_control, NULL, NULL, FVMenuCopyRef, MID_CopyRef }, + { { (unichar_t *) _STR_Copywidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 'W', ksm_control, NULL, NULL, FVMenuCopyWidth, MID_CopyWidth }, + { { (unichar_t *) _STR_CopyVWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control, NULL, NULL, FVMenuCopyWidth, MID_CopyVWidth }, + { { (unichar_t *) _STR_CopyLBearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'p' }, '\0', ksm_control, NULL, NULL, FVMenuCopyWidth, MID_CopyLBearing }, + { { (unichar_t *) _STR_CopyRBearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'g' }, '\0', ksm_control, NULL, NULL, FVMenuCopyWidth, MID_CopyRBearing }, + { { (unichar_t *) _STR_Paste, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'V', ksm_control, NULL, NULL, FVMenuPaste, MID_Paste }, + { { (unichar_t *) _STR_PasteInto, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, 'V', ksm_control|ksm_shift, NULL, NULL, FVMenuPasteInto, MID_PasteInto }, + { { (unichar_t *) _STR_SameGlyphAs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'm' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuSameGlyphAs, MID_SameGlyphAs }, + { { (unichar_t *) _STR_Clear, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, NULL, NULL, FVMenuClear, MID_Clear }, + { { (unichar_t *) _STR_ClearBackground, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 0, 0, NULL, NULL, FVMenuClearBackground, MID_ClearBackground }, + { { (unichar_t *) _STR_CopyFgToBg, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'C', ksm_control|ksm_shift, NULL, NULL, FVMenuCopyFgBg, MID_CopyFgToBg }, + { { (unichar_t *) _STR_Join, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'J' }, 'J', ksm_control|ksm_shift, NULL, NULL, FVMenuJoin, MID_Join }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Select, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 0, ksm_control, sllist, sllistcheck }, + { { (unichar_t *) _STR_FindReplace, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'i' }, 'F', ksm_control|ksm_meta, NULL, NULL, FVMenuFindRpl }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Unlinkref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'U', ksm_control, NULL, NULL, FVMenuUnlinkRef, MID_UnlinkRef }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Copyfrom, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '\0', 0, cflist, cflistcheck, NULL, 0 }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_RemoveUndoes, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', 0, NULL, NULL, FVMenuRemoveUndoes, MID_RemoveUndoes }, + { NULL } +}; + +static GMenuItem aat2list[] = { + { { (unichar_t *) _STR_All, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_Ligatures, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) 0xffffffff, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_StandardLig, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('l','i','g','a'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_RequiredLig, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('r','l','i','g'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_HistoricLig, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('h','l','i','g'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_DiscretionaryLig, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('d','l','i','g'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_FractionLig, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('f','r','a','c'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_MacUnicodeDecomposition, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('M','U','C','M'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_R2LAlt, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('r','t','l','a'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_VertRotAlt, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('v','r','t','2'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_SmallCaps, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('s','m','c','p'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_OldstyleFigures, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('o','n','u','m'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_Superscript, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('s','u','p','s'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_Subscript, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('s','u','b','s'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_Swash, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('s','w','s','h'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_PropWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('p','w','i','d'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_FullWidths, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('f','w','i','d'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_HalfWidths, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('h','w','i','d'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_InitialForms, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('i','n','i','t'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_MedialForms, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('m','e','d','i'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_TerminalForms, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('f','i','n','a'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_IsolatedForms, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('i','s','o','l'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_LeftBounds, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('l','f','b','d'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { (unichar_t *) _STR_RightBounds, NULL, COLOR_DEFAULT, COLOR_DEFAULT, (void *) CHR('r','t','b','d'), NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAAT }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SuffixToTag, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAATSuffix }, + { NULL } +}; + +static GMenuItem smlist[] = { + { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'M', ksm_control|ksm_shift, NULL, NULL, FVMenuSimplify, MID_Simplify }, + { { (unichar_t *) _STR_SimplifyMore, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'M', ksm_control|ksm_shift|ksm_meta, NULL, NULL, FVMenuSimplifyMore, MID_SimplifyMore }, + { { (unichar_t *) _STR_CleanupChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'n' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuCleanup, MID_CleanupChar }, + { NULL } +}; + +static GMenuItem rmlist[] = { + { { (unichar_t *) _STR_Rmoverlap, &GIcon_rmoverlap, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'O' }, 'O', ksm_control|ksm_shift, NULL, NULL, FVMenuOverlap, MID_RmOverlap }, + { { (unichar_t *) _STR_Intersect, &GIcon_intersection, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuOverlap, MID_Intersection }, + { { (unichar_t *) _STR_FindIntersections, &GIcon_findinter, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuOverlap, MID_FindInter }, + { NULL } +}; + +static GMenuItem eflist[] = { + { { (unichar_t *) _STR_Inline, &GIcon_inline, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuInline }, + { { (unichar_t *) _STR_OutlineMn, &GIcon_outline, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuOutline }, + { { (unichar_t *) _STR_Shadow, &GIcon_shadow, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuShadow }, + { { (unichar_t *) _STR_Wireframe, &GIcon_wireframe, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'W' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuWireframe }, + { NULL } +}; + +static GMenuItem balist[] = { + { { (unichar_t *) _STR_Buildaccent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'A', ksm_control|ksm_shift, NULL, NULL, FVMenuBuildAccent, MID_BuildAccent }, + { { (unichar_t *) _STR_Buildcomposit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuBuildComposite, MID_BuildComposite }, + { NULL } +}; + +static GMenuItem aatlist[] = { + { { (unichar_t *) _STR_CopyFeatureToFont, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuCopyFeatureToFont, MID_CopyFeatureToFont }, + { { (unichar_t *) _STR_DefaultATT, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'I', ksm_control|ksm_meta, aat2list }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_RemoveAllFeatures, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuRemoveAllFeatures }, + { { (unichar_t *) _STR_RemoveFeature, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuRemoveFeatures }, + { { (unichar_t *) _STR_RemoveUnusedNested, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuRemoveUnusedNested }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_RetagFeature, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuRetagFeature }, + { NULL } +}; + +static GMenuItem ellist[] = { + { { (unichar_t *) _STR_Fontinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control|ksm_shift, NULL, NULL, FVMenuFontInfo }, + { { (unichar_t *) _STR_Charinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control, NULL, NULL, FVMenuCharInfo, MID_CharInfo }, + { { (unichar_t *) _STR_TypoFeatures, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, '\0', ksm_control|ksm_meta, aatlist, aatlistcheck }, + { { (unichar_t *) _STR_ShowDependents, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'I', ksm_control|ksm_meta, NULL, NULL, FVMenuShowDependents, MID_ShowDependents }, + { { (unichar_t *) _STR_Findprobs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'E', ksm_control, NULL, NULL, FVMenuFindProblems, MID_FindProblems }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Bitmapsavail, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'B', ksm_control|ksm_shift, NULL, NULL, FVMenuBitmaps, MID_AvailBitmaps }, + { { (unichar_t *) _STR_Regenbitmaps, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'B', ksm_control, NULL, NULL, FVMenuBitmaps, MID_RegenBitmaps }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Transform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\\', ksm_control, NULL, NULL, FVMenuTransform, MID_Transform }, +#ifdef FONTFORGE_CONFIG_NONLINEAR + { { (unichar_t *) _STR_NonLinearTransform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '|', ksm_shift|ksm_control, NULL, NULL, FVMenuNLTransform, MID_NLTransform }, +#endif + { { (unichar_t *) _STR_Stroke, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 'E', ksm_control|ksm_shift, NULL, NULL, FVMenuStroke, MID_Stroke }, +#ifdef FONTFORGE_CONFIG_TILEPATH + { { (unichar_t *) _STR_TilePath, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuTilePath, MID_TilePath }, +#endif + { { (unichar_t *) _STR_Overlap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, rmlist, NULL, NULL, MID_RmOverlap }, + { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, smlist, NULL, NULL, MID_Simplify }, + { { (unichar_t *) _STR_AddExtrema, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, 'X', ksm_control|ksm_shift, NULL, NULL, FVMenuAddExtrema, MID_AddExtrema }, + { { (unichar_t *) _STR_Round2int, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '_', ksm_control|ksm_shift, NULL, NULL, FVMenuRound2Int, MID_Round }, + { { (unichar_t *) _STR_Effects, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, eflist, NULL, NULL, MID_Effects }, + { { (unichar_t *) _STR_MetaFont, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, '!', ksm_control|ksm_shift, NULL, NULL, FVMenuMetaFont, MID_MetaFont }, + { { (unichar_t *) _STR_Autotrace, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, 'T', ksm_control|ksm_shift, NULL, NULL, FVMenuAutotrace, MID_Autotrace }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Correct, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'D', ksm_control|ksm_shift, NULL, NULL, FVMenuCorrectDir, MID_Correct }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Build, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, balist, balistcheck, NULL, MID_BuildAccent }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Mergefonts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuMergeFonts, MID_MergeFonts }, + { { (unichar_t *) _STR_Interp, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'p' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuInterpFonts, MID_InterpolateFonts }, + { NULL } +}; + +static GMenuItem dummyall[] = { + { { (unichar_t *) _STR_All, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_shift|ksm_control, NULL, NULL, NULL }, + NULL +}; + +/* Builds up a menu containing all the anchor classes */ +static void aplistbuild(GWindow gw,struct gmenuitem *mi,GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + extern void GMenuItemArrayFree(GMenuItem *mi); + + if ( mi->sub!=dummyall ) { + GMenuItemArrayFree(mi->sub); + mi->sub = NULL; + } + + _aplistbuild(mi,fv->sf,FVMenuAnchorPairs); +} + +static GMenuItem cblist[] = { + { { (unichar_t *) _STR_KernPairs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuKernPairs, MID_KernPairs }, + { { (unichar_t *) _STR_AnchoredPairs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_shift|ksm_control, dummyall, aplistbuild, FVMenuAnchorPairs, MID_AnchorPairs }, + { { (unichar_t *) _STR_Ligatures, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'L' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuLigatures, MID_Ligatures }, + NULL +}; + +static void cblistcheck(GWindow gw,struct gmenuitem *mi, GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + SplineFont *sf = fv->sf; + int i, anyligs=0, anykerns=0; + PST *pst; + + if ( sf->kerns ) anykerns=true; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_ligature ) { + anyligs = true; + if ( anykerns ) + break; + } + } + if ( sf->chars[i]->kerns!=NULL ) { + anykerns = true; + if ( anyligs ) + break; + } + } + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Ligatures: + mi->ti.disabled = !anyligs; + break; + case MID_KernPairs: + mi->ti.disabled = !anykerns; + break; + case MID_AnchorPairs: + mi->ti.disabled = sf->anchor==NULL; + break; + } + } +} + +static GMenuItem vwlist[] = { + { { (unichar_t *) _STR_NextChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, ']', ksm_control, NULL, NULL, FVMenuChangeChar, MID_Next }, + { { (unichar_t *) _STR_PrevChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '[', ksm_control, NULL, NULL, FVMenuChangeChar, MID_Prev }, + { { (unichar_t *) _STR_NextDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, ']', ksm_control|ksm_meta, NULL, NULL, FVMenuChangeChar, MID_NextDef }, + { { (unichar_t *) _STR_PrevDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, '[', ksm_control|ksm_meta, NULL, NULL, FVMenuChangeChar, MID_PrevDef }, + { { (unichar_t *) _STR_Goto, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, '>', ksm_shift|ksm_control, NULL, NULL, FVMenuGotoChar }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_EncodedView, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'E' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuCompact, MID_EncodedView }, + { { (unichar_t *) _STR_CompactedView, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuCompact, MID_CompactedView }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_ShowAtt, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuShowAtt }, + { { (unichar_t *) _STR_Combinations, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'b' }, '\0', ksm_shift|ksm_control, cblist, cblistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_ShowHMetrics, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuShowMetrics, MID_ShowHMetrics }, + { { (unichar_t *) _STR_ShowVMetrics, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_shift|ksm_control, NULL, NULL, FVMenuShowMetrics, MID_ShowVMetrics }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_24, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '2' }, '2', ksm_control, NULL, NULL, FVMenuSize, MID_24 }, + { { (unichar_t *) _STR_36, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '3' }, '3', ksm_control, NULL, NULL, FVMenuSize, MID_36 }, + { { (unichar_t *) _STR_48, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '4' }, '4', ksm_control, NULL, NULL, FVMenuSize, MID_48 }, + { { (unichar_t *) _STR_72, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '4' }, '7', ksm_control, NULL, NULL, FVMenuSize, MID_72 }, + { { (unichar_t *) _STR_96, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '4' }, '9', ksm_control, NULL, NULL, FVMenuSize, MID_96 }, + { { (unichar_t *) _STR_Antialias, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'A' }, '5', ksm_control, NULL, NULL, FVMenuSize, MID_AntiAlias }, + { { (unichar_t *) _STR_FitToEm, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'F' }, '6', ksm_control, NULL, NULL, FVMenuSize, MID_FitToEm }, + { NULL }, /* Some extra room to show bitmaps */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL } +}; + +static void vwlistcheck(GWindow gw,struct gmenuitem *mi, GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int anychars = FVAnyCharSelected(fv); + int i, base; + BDFFont *bdf; + unichar_t buffer[50]; + extern void GMenuItemArrayFree(GMenuItem *mi); + extern GMenuItem *GMenuItemArrayCopy(GMenuItem *mi, uint16 *cnt); + int pos; + SplineFont *sf = fv->sf; + + for ( i=0; vwlist[i].ti.text!=(unichar_t *) _STR_FitToEm; ++i ); + base = i+2; + for ( i=base; vwlist[i].ti.text!=NULL; ++i ) { + free( vwlist[i].ti.text); + vwlist[i].ti.text = NULL; + } + + vwlist[base-1].ti.fg = vwlist[base-1].ti.bg = COLOR_DEFAULT; + if ( fv->sf->bitmaps==NULL ) { + vwlist[base-1].ti.line = false; + } else { + vwlist[base-1].ti.line = true; + for ( bdf = fv->sf->bitmaps, i=base; + inext ) { + if ( BDFDepth(bdf)==1 ) + u_sprintf( buffer, GStringGetResource(_STR_DPixelBitmap,NULL), bdf->pixelsize ); + else + u_sprintf( buffer, GStringGetResource(_STR_DdPixelBitmap,NULL), + bdf->pixelsize, BDFDepth(bdf) ); + vwlist[i].ti.text = u_copy(buffer); + vwlist[i].ti.checkable = true; + vwlist[i].ti.checked = bdf==fv->show; + vwlist[i].ti.userdata = bdf; + vwlist[i].invoke = FVMenuShowBitmap; + vwlist[i].ti.fg = vwlist[i].ti.bg = COLOR_DEFAULT; + } + } + GMenuItemArrayFree(mi->sub); + mi->sub = GMenuItemArrayCopy(vwlist,NULL); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Next: case MID_Prev: + mi->ti.disabled = anychars<0; + break; + case MID_NextDef: + if ( anychars<0 ) pos = sf->charcnt; + else for ( pos = anychars+1; poscharcnt && sf->chars[pos]==NULL; ++pos ); + mi->ti.disabled = pos==sf->charcnt; + break; + case MID_PrevDef: + for ( pos = anychars-1; pos>=0 && sf->chars[pos]==NULL; --pos ); + mi->ti.disabled = pos<0; + break; + case MID_EncodedView: + mi->ti.checked = !fv->sf->compacted; + break; + case MID_CompactedView: + mi->ti.checked = fv->sf->compacted; + break; + case MID_ShowHMetrics: + /*mi->ti.checked = fv->showhmetrics;*/ + break; + case MID_ShowVMetrics: + /*mi->ti.checked = fv->showvmetrics;*/ + mi->ti.disabled = !fv->sf->hasvmetrics; + break; + case MID_24: + mi->ti.checked = (fv->show!=NULL && fv->show==fv->filled && fv->show->pixelsize==24); + mi->ti.disabled = fv->sf->onlybitmaps && fv->show!=fv->filled; + break; + case MID_36: + mi->ti.checked = (fv->show!=NULL && fv->show==fv->filled && fv->show->pixelsize==36); + mi->ti.disabled = fv->sf->onlybitmaps && fv->show!=fv->filled; + break; + case MID_48: + mi->ti.checked = (fv->show!=NULL && fv->show==fv->filled && fv->show->pixelsize==48); + mi->ti.disabled = fv->sf->onlybitmaps && fv->show!=fv->filled; + break; + case MID_72: + mi->ti.checked = (fv->show!=NULL && fv->show==fv->filled && fv->show->pixelsize==72); + mi->ti.disabled = fv->sf->onlybitmaps && fv->show!=fv->filled; + break; + case MID_96: + mi->ti.checked = (fv->show!=NULL && fv->show==fv->filled && fv->show->pixelsize==96); + mi->ti.disabled = fv->sf->onlybitmaps && fv->show!=fv->filled; + break; + case MID_AntiAlias: + mi->ti.checked = (fv->show!=NULL && fv->show->clut!=NULL); + mi->ti.disabled = fv->sf->onlybitmaps && fv->show!=fv->filled; + break; + case MID_FitToEm: + mi->ti.checked = (fv->show!=NULL && !fv->show->bbsized); + mi->ti.disabled = fv->sf->onlybitmaps && fv->show!=fv->filled; + break; + } + } +} + +static GMenuItem histlist[] = { + { { (unichar_t *) _STR_HStem, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuHistograms, MID_HStemHist }, + { { (unichar_t *) _STR_VStem, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuHistograms, MID_VStemHist }, + { { (unichar_t *) "BlueValues", NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 1, 0, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuHistograms, MID_BlueValuesHist }, + { NULL } +}; + +static GMenuItem htlist[] = { + { { (unichar_t *) _STR_Autohint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 'H', ksm_control|ksm_shift, NULL, NULL, FVMenuAutoHint, MID_AutoHint }, + { { (unichar_t *) _STR_HintSubsPts, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAutoHintSubs, MID_HintSubsPt }, + { { (unichar_t *) _STR_AutoCounterHint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAutoCounter, MID_AutoCounter }, + { { (unichar_t *) _STR_DontAutoHint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuDontAutoHint, MID_DontAutoHint }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_AutoInstr, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'T', ksm_control, NULL, NULL, FVMenuAutoInstr, MID_AutoInstr }, + { { (unichar_t *) _STR_EditInstructions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, '\0', 0, NULL, NULL, FVMenuEditInstrs, MID_EditInstructions }, + { { (unichar_t *) _STR_Editfpgm, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, FVMenuEditTable, MID_Editfpgm }, + { { (unichar_t *) _STR_Editprep, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, FVMenuEditTable, MID_Editprep }, + { { (unichar_t *) _STR_Editcvt, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', 0, NULL, NULL, FVMenuEditTable, MID_Editcvt }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_ClearHints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuClearHints, MID_ClearHints }, + { { (unichar_t *) _STR_ClearWidthMD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuClearWidthMD, MID_ClearWidthMD }, + { { (unichar_t *) _STR_ClearInstructions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuClearInstrs, MID_ClearInstrs }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Histograms, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_shift|ksm_control, histlist }, + { NULL } +}; + +static GMenuItem mtlist[] = { + { { (unichar_t *) _STR_Center, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, FVMenuCenter, MID_Center }, + { { (unichar_t *) _STR_Thirds, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, FVMenuCenter, MID_Thirds }, + { { (unichar_t *) _STR_Setwidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 'L', ksm_control|ksm_shift, NULL, NULL, FVMenuSetWidth, MID_SetWidth }, + { { (unichar_t *) _STR_Setlbearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'L' }, 'L', ksm_control, NULL, NULL, FVMenuSetWidth, MID_SetLBearing }, + { { (unichar_t *) _STR_Setrbearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'R', ksm_control, NULL, NULL, FVMenuSetWidth, MID_SetRBearing }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SetVWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuSetWidth, MID_SetVWidth }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Autowidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'W', ksm_control|ksm_shift, NULL, NULL, FVMenuAutoWidth }, + { { (unichar_t *) _STR_Autokern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, 'K', ksm_control|ksm_shift, NULL, NULL, FVMenuAutoKern }, + { { (unichar_t *) _STR_KernByClasses, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuKernByClasses }, + { { (unichar_t *) _STR_Removeallkern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuRemoveKern, MID_RmHKern }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_VKernByClasses, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuVKernByClasses, MID_VKernByClass }, + { { (unichar_t *) _STR_VKernFromHKern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuVKernFromHKern, MID_VKernFromH }, + { { (unichar_t *) _STR_RemoveAllVKern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuRemoveVKern, MID_RmVKern }, + { NULL } +}; + +static GMenuItem cdlist[] = { + { { (unichar_t *) _STR_Convert2CID, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, FVMenuConvert2CID, MID_Convert2CID }, + { { (unichar_t *) _STR_ConvertByCMap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, FVMenuConvertByCMap, MID_ConvertByCMap }, + { { (unichar_t *) _STR_Flatten, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '\0', ksm_control, NULL, NULL, FVMenuFlatten, MID_Flatten }, + { { (unichar_t *) _STR_FlattenByCMap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '\0', ksm_control, NULL, NULL, FVMenuFlattenByCMap, MID_FlattenByCMap }, + { { (unichar_t *) _STR_InsertFont, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuInsertFont, MID_InsertFont }, + { { (unichar_t *) _STR_InsertBlank, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control, NULL, NULL, FVMenuInsertBlank, MID_InsertBlank }, + { { (unichar_t *) _STR_RemoveFont, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, '\0', ksm_control, NULL, NULL, FVMenuRemoveFontFromCID, MID_RemoveFromCID }, + { { (unichar_t *) _STR_CIDFontInfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control, NULL, NULL, FVMenuCIDFontInfo, MID_CIDFontInfo }, + { NULL }, /* Extra room to show sub-font names */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL } +}; + +static void cdlistcheck(GWindow gw,struct gmenuitem *mi, GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i, base, j; + extern void GMenuItemArrayFree(GMenuItem *mi); + extern GMenuItem *GMenuItemArrayCopy(GMenuItem *mi, uint16 *cnt); + SplineFont *sub, *cidmaster = fv->cidmaster; + + for ( i=0; cdlist[i].mid!=MID_CIDFontInfo; ++i ); + base = i+2; + for ( i=base; cdlist[i].ti.text!=NULL; ++i ) { + free( cdlist[i].ti.text); + cdlist[i].ti.text = NULL; + } + + cdlist[base-1].ti.fg = cdlist[base-1].ti.bg = COLOR_DEFAULT; + if ( cidmaster==NULL ) { + cdlist[base-1].ti.line = false; + } else { + cdlist[base-1].ti.line = true; + for ( j = 0, i=base; + isubfontcnt; + ++i, ++j ) { + sub = cidmaster->subfonts[j]; + cdlist[i].ti.text = uc_copy(sub->fontname); + cdlist[i].ti.checkable = true; + cdlist[i].ti.checked = sub==fv->sf; + cdlist[i].ti.userdata = sub; + cdlist[i].invoke = FVMenuShowSubFont; + cdlist[i].ti.fg = cdlist[i].ti.bg = COLOR_DEFAULT; + } + } + GMenuItemArrayFree(mi->sub); + mi->sub = GMenuItemArrayCopy(cdlist,NULL); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Convert2CID: case MID_ConvertByCMap: + mi->ti.disabled = cidmaster!=NULL || fv->sf->mm!=NULL; + break; + case MID_InsertFont: case MID_InsertBlank: + /* OpenType allows at most 255 subfonts (PS allows more, but why go to the effort to make safe font check that? */ + mi->ti.disabled = cidmaster==NULL || cidmaster->subfontcnt>=255; + break; + case MID_RemoveFromCID: + mi->ti.disabled = cidmaster==NULL || cidmaster->subfontcnt<=1; + break; + case MID_Flatten: case MID_FlattenByCMap: case MID_CIDFontInfo: + mi->ti.disabled = cidmaster==NULL; + break; + } + } +} + +static GMenuItem mmlist[] = { + { { (unichar_t *) _STR_CreateMM, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control, NULL, NULL, FVMenuCreateMM, MID_CreateMM }, + { { (unichar_t *) _STR_MMValid, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control, NULL, NULL, FVMenuMMValid, MID_MMValid }, + { { (unichar_t *) _STR_MMInfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control, NULL, NULL, FVMenuMMInfo, MID_MMInfo }, + { { (unichar_t *) _STR_ChangeMMBlend, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control, NULL, NULL, FVMenuChangeMMBlend, MID_ChangeMMBlend }, + { NULL }, /* Extra room to show sub-font names */ + /* 16 subfonts max */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, + { NULL } +}; + +static void mmlistcheck(GWindow gw,struct gmenuitem *mi, GEvent *e) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + int i, base, j; + extern void GMenuItemArrayFree(GMenuItem *mi); + extern GMenuItem *GMenuItemArrayCopy(GMenuItem *mi, uint16 *cnt); + MMSet *mm = fv->sf->mm; + SplineFont *sub; + + for ( i=0; mmlist[i].mid!=MID_ChangeMMBlend; ++i ); + base = i+2; + for ( i=base; mmlist[i].ti.text!=NULL; ++i ) { + free( mmlist[i].ti.text); + mmlist[i].ti.text = NULL; + } + + mmlist[base-1].ti.fg = mmlist[base-1].ti.bg = COLOR_DEFAULT; + if ( mm==NULL ) { + mmlist[base-1].ti.line = false; + } else { + mmlist[base-1].ti.line = true; + for ( j = 0, i=base; + iinstance_count+1; + ++i, ++j ) { + if ( j==0 ) + sub = mm->normal; + else + sub = mm->instances[j-1]; + mmlist[i].ti.text = uc_copy(sub->fontname); + mmlist[i].ti.checkable = true; + mmlist[i].ti.checked = sub==fv->sf; + mmlist[i].ti.userdata = sub; + mmlist[i].invoke = FVMenuShowSubFont; + mmlist[i].ti.fg = mmlist[i].ti.bg = COLOR_DEFAULT; + } + } + GMenuItemArrayFree(mi->sub); + mi->sub = GMenuItemArrayCopy(mmlist,NULL); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_CreateMM: + mi->ti.disabled = false; + break; + case MID_MMInfo: case MID_MMValid: case MID_ChangeMMBlend: + mi->ti.disabled = mm==NULL; + break; + } + } +} + +GMenuItem helplist[] = { + { { (unichar_t *) _STR_Help, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, GK_F1, 0, NULL, NULL, MenuHelp }, + { { (unichar_t *) _STR_Index, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, GK_F1, ksm_control, NULL, NULL, MenuIndex }, + { { (unichar_t *) _STR_About, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, '\0', 0, NULL, NULL, MenuAbout }, + { { (unichar_t *) _STR_LicenseDDD, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, '\0', 0, NULL, NULL, MenuLicense }, + { NULL } +}; + +GMenuItem fvpopupmenu[] = { + { { (unichar_t *) _STR_Cut, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control, NULL, NULL, FVMenuCut, MID_Cut }, + { { (unichar_t *) _STR_Copy, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, FVMenuCopy, MID_Copy }, + { { (unichar_t *) _STR_Copyref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, '\0', ksm_control, NULL, NULL, FVMenuCopyRef, MID_CopyRef }, + { { (unichar_t *) _STR_Copywidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, '\0', ksm_control, NULL, NULL, FVMenuCopyWidth, MID_CopyWidth }, + { { (unichar_t *) _STR_Paste, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control, NULL, NULL, FVMenuPaste, MID_Paste }, + { { (unichar_t *) _STR_Clear, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, NULL, NULL, FVMenuClear, MID_Clear }, + { { (unichar_t *) _STR_CopyFgToBg, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuCopyFgBg, MID_CopyFgToBg }, + { { (unichar_t *) _STR_Unlinkref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, '\0', ksm_control, NULL, NULL, FVMenuUnlinkRef, MID_UnlinkRef }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Charinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control, NULL, NULL, FVMenuCharInfo, MID_CharInfo }, + { { (unichar_t *) _STR_Transform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, FVMenuTransform, MID_Transform }, + { { (unichar_t *) _STR_Stroke, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuStroke, MID_Stroke }, +/* { { (unichar_t *) _STR_Rmoverlap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuOverlap, MID_RmOverlap },*/ +/* { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuSimplify, MID_Simplify },*/ +/* { { (unichar_t *) _STR_AddExtrema, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, 'X', ksm_control|ksm_shift, NULL, NULL, FVMenuAddExtrema, MID_AddExtrema },*/ + { { (unichar_t *) _STR_Round2int, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuRound2Int, MID_Round }, + { { (unichar_t *) _STR_Correct, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuCorrectDir, MID_Correct }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Autohint, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuAutoHint, MID_AutoHint }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Center, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, FVMenuCenter, MID_Center }, + { { (unichar_t *) _STR_Setwidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuSetWidth, MID_SetWidth }, + { { (unichar_t *) _STR_SetVWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control|ksm_shift, NULL, NULL, FVMenuSetWidth, MID_SetVWidth }, + { NULL } +}; + +static GMenuItem mblist[] = { + { { (unichar_t *) _STR_File, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 0, 0, fllist, fllistcheck }, + { { (unichar_t *) _STR_Edit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 0, 0, edlist, edlistcheck }, + { { (unichar_t *) _STR_Element, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, ellist, ellistcheck }, + { { (unichar_t *) _STR_Hints, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'i' }, 0, 0, htlist, htlistcheck }, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, 0, 0, vwlist, vwlistcheck }, + { { (unichar_t *) _STR_Metric, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 0, 0, mtlist, mtlistcheck }, + { { (unichar_t *) _STR_CID, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 0, 0, cdlist, cdlistcheck }, + { { (unichar_t *) _STR_MM, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, 0, 0, mmlist, mmlistcheck }, + { { (unichar_t *) _STR_Window, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 0, 0, NULL, WindowMenuBuild, NULL }, + { { (unichar_t *) _STR_Help, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, helplist, NULL }, + { NULL } +}; + +void FVRefreshChar(FontView *fv,BDFFont *bdf,int enc) { + BDFChar *bdfc = bdf->chars[enc]; + int i, j; + MetricsView *mv; + + if ( fv->v==NULL || fv->colcnt==0 ) /* Can happen in scripts */ +return; + + for ( fv=fv->sf->fv; fv!=NULL; fv = fv->nextsame ) { + for ( mv=fv->metrics; mv!=NULL; mv=mv->next ) + MVRefreshChar(mv,fv->sf->chars[enc]); + if ( fv->show != bdf ) + continue; + i = enc / fv->colcnt; + j = enc - i*fv->colcnt; + i -= fv->rowoff; + if ( i>=0 && irowcnt ) { + struct _GImage base; + GImage gi; + GClut clut; + GRect old, box; + + if ( bdfc==NULL ) + bdfc = BDFPieceMeal(bdf,enc); + + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + if ( bdfc->byte_data ) { + gi.u.image = &base; + base.image_type = it_index; + base.clut = bdf->clut; + GDrawSetDither(NULL, false); /* on 8 bit displays we don't want any dithering */ + base.trans = -1; + /*base.clut->trans_index = 0;*/ + } else { + memset(&clut,'\0',sizeof(clut)); + gi.u.image = &base; + base.image_type = it_mono; + base.clut = &clut; + clut.clut_len = 2; + clut.clut[0] = GDrawGetDefaultBackground(NULL); + } + + base.data = bdfc->bitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + box.x = j*fv->cbw+1; box.width = fv->cbw-1; + box.y = i*fv->cbh+FV_LAB_HEIGHT+1; box.height = fv->cbw; + GDrawPushClip(fv->v,&box,&old); + GDrawFillRect(fv->v,&box,GDrawGetDefaultBackground(NULL)); + if ( fv->magnify>1 ) { + GDrawDrawImageMagnified(fv->v,&gi,NULL, + j*fv->cbw+(fv->cbw-1-fv->magnify*base.width)/2, + i*fv->cbh+FV_LAB_HEIGHT+1+fv->magnify*(fv->show->ascent-bdfc->ymax), + fv->magnify*base.width,fv->magnify*base.height); + } else + GDrawDrawImage(fv->v,&gi,NULL, + j*fv->cbw+(fv->cbw-1-base.width)/2, + i*fv->cbh+FV_LAB_HEIGHT+1+fv->show->ascent-bdfc->ymax); + GDrawPopClip(fv->v,&old); + if ( fv->selected[enc] ) { + GDrawSetXORBase(fv->v,GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(fv->v))); + GDrawSetXORMode(fv->v); + GDrawFillRect(fv->v,&box,XOR_COLOR); + GDrawSetCopyMode(fv->v); + } + GDrawSetDither(NULL, true); + } + } +} + +void FVRegenChar(FontView *fv,SplineChar *sc) { + struct splinecharlist *dlist; + MetricsView *mv; + + if ( fv->v==NULL ) /* Can happen in scripts */ +return; + + sc->changedsincelasthinted = true; + if ( sc->enc>=fv->filled->charcnt ) + GDrawIError("Character out of bounds in bitmap font %d>=%d", sc->enc, fv->filled->charcnt ); + else + BDFCharFree(fv->filled->chars[sc->enc]); + fv->filled->chars[sc->enc] = NULL; + /* FVRefreshChar does NOT do this for us */ + for ( mv=fv->metrics; mv!=NULL; mv=mv->next ) + MVRegenChar(mv,sc); + + FVRefreshChar(fv,fv->filled,sc->enc); +#if HANYANG + if ( sc->compositionunit && fv->sf->rules!=NULL ) + Disp_RefreshChar(fv->sf,sc); +#endif + + for ( dlist=sc->dependents; dlist!=NULL; dlist=dlist->next ) + FVRegenChar(fv,dlist->sc); +} + +int32 UniFromEnc(int enc, enum charset encname) { + int32 uni = -1; + + if ( encname==em_custom ) +return( -1 ); + else if ( encname<=em_adobestandard ) { + if ( enc>=256 || enc<0 ) +return( -1 ); + switch (encname) { + case em_iso8859_1: uni = enc; break; + case em_iso8859_2: uni = unicode_from_i8859_2[enc]; break; + case em_iso8859_3: uni = unicode_from_i8859_3[enc]; break; + case em_iso8859_4: uni = unicode_from_i8859_4[enc]; break; + case em_iso8859_5: uni = unicode_from_i8859_5[enc]; break; + case em_iso8859_6: uni = unicode_from_i8859_6[enc]; break; + case em_iso8859_7: uni = unicode_from_i8859_7[enc]; break; + case em_iso8859_8: uni = unicode_from_i8859_8[enc]; break; + case em_iso8859_9: uni = unicode_from_i8859_9[enc]; break; + case em_iso8859_10: uni = unicode_from_i8859_10[enc]; break; + case em_iso8859_11: uni = unicode_from_i8859_11[enc]; break; + case em_iso8859_13: uni = unicode_from_i8859_13[enc]; break; + case em_iso8859_14: uni = unicode_from_i8859_14[enc]; break; + case em_iso8859_15: uni = unicode_from_i8859_15[enc]; break; + case em_koi8_r: uni = unicode_from_koi8_r[enc]; break; + case em_jis201: uni = unicode_from_jis201[enc]; break; + case em_win: uni = unicode_from_win[enc]; break; + case em_mac: uni = unicode_from_mac[enc]; break; + case em_symbol: uni = unicode_from_MacSymbol[enc]; break; + case em_zapfding: uni = unicode_from_ZapfDingbats[enc]; break; + case em_adobestandard: uni = unicode_from_adobestd[enc]; break; + default: uni = -1; /* Unreachable I hope */ + } + } else if ( encname==em_unicode4 ) { +return( enc ); + } else if ( encname>=em_unicodeplanes && encname=65536 || enc<0 ) +return( -1 ); + +return( enc + ((encname-em_unicodeplanes)<<16) ); + } else if ( encname>=em_base ) { + Encoding *item=NULL; + for ( item=enclist; item!=NULL && item->enc_num!=encname; item=item->next ); + if ( item!=NULL && enc>=item->char_cnt ) item = NULL; + if ( item==NULL ) +return( -1 ); +return( item->unicode[enc] ); + } else { + if ( enc>=65536 || enc<0 ) +return( -1 ); + switch (encname) { + case em_unicode: uni = enc; break; + case em_jis208: case em_jis212: case em_ksc5601: case em_gb2312: { + int ch1 = (enc>>8)-0x21, ch2 = (enc&0xff)-0x21; + int index = ch1*94+ch2; + if ( ch1<0 || ch1>0x7e - 0x21 || ch2<0 || ch2>0x7e - 0x21 ) + uni = -1; + else switch ( encname ) { + case em_jis208: uni = unicode_from_jis208[index]; break; + case em_jis212: uni = unicode_from_jis212[index]; break; + case em_ksc5601: uni = unicode_from_ksc5601[index]; break; + case em_gb2312: uni = unicode_from_gb2312[index]; break; + } + } break; + case em_big5: + if (enc<0x7f ) uni = enc; + else if ( enc<0xa100 ) uni = -1; + else if (enc-0xa100<24584) uni = unicode_from_big5[enc-0xa100]; + break; + case em_big5hkscs: + if (enc<0x7f ) uni = enc; + else if ( enc<0x8100 ) uni = -1; + else if (enc-0x8100<32776) uni = unicode_from_big5hkscs[enc-0x8100]; + break; + case em_johab: + if (enc<0x7f ) uni = enc; + else if ( enc<0x8400 ) uni = -1; + else if (enc-0x8400<31752) uni = unicode_from_big5hkscs[enc-0x8400]; + break; + case em_sjis: + if ( enc<0x80 ) + uni = enc; + else if ( enc>=0xa1 && enc<=0xdf ) + uni = unicode_from_jis201[enc]; + else if (( ((enc>>8)>=129 && (enc>>8)<=159) || ((enc>>8)>=224 && (enc>>8)<=0xef) ) && + ( (enc&0xff)>=64 && (enc&0xff)<=252 && (enc&0xff)!=127 )) { + int ch1 = enc>>8, ch2 = enc&0xff; + int temp; + if ( ch1 >= 129 && ch1<= 159 ) + ch1 -= 112; + else + ch1 -= 176; + ch1 <<= 1; + if ( ch2>=159 ) + ch2-= 126; + else if ( ch2>127 ) { + --ch1; + ch2 -= 32; + } else { + --ch1; + ch2 -= 31; + } + temp = (ch1-0x21)*94+(ch2-0x21); + if ( temp>=94*94 ) + temp = -1; + else + temp = unicode_from_jis208[(ch1-0x21)*94+(ch2-0x21)]; + uni = temp; + } + break; + case em_wansung: + case em_jisgb: + if ( enc<0x7f ) + uni = enc; + else if ( (enc&0xff00)>=0xa100 && (enc&0xff)>=0xa1 && + (enc&0xff00)<0xa100+(94<<8) && (enc&0xff)<0xa1+94 ) { + int temp = enc-0xa1a1; + temp = (temp>>8)*94 + (temp&0xff); + if ( encname == em_wansung ) + temp = unicode_from_ksc5601[temp]; + else + temp = unicode_from_gb2312[temp]; + uni = temp; + } else + uni = -1; + break; + default: uni = -1; break; + } + } + if ( uni==0 && enc!=0 ) uni = -1; +return( uni ); +} + +int32 EncFromUni(int32 uni, enum charset encname) { + int ch1 = uni>>8; + int i, ret; + struct charmap2 *cm2; + + if ( encname<=em_custom ) +return( -1 ); + else if ( encname==em_iso8859_1 || encname==em_unicode || encname==em_unicode4 ) { + if (( encname==em_iso8859_1 && uni>=256 ) || + ( encname==em_unicode && uni>=65536 )) +return( -1 ); + +return( uni ); + } else if ( encname>=em_unicodeplanes && encnamep+0xffff ) +return( -1 ); +return( uni-p ); + } else if ( encnamefirst || ch1>cm->last ) +return( -1 ); + ret = cm->table[ch1-cm->first]==NULL ? -1 : + cm->table[ch1-cm->first][uni&0xff]; + if ( ret==0 ) ret=-1; +return( ret ); + } else if ( encname>=em_base ) { + Encoding *item; + for ( item=enclist; item!=NULL && item->enc_num!=encname; item=item->next ); + if ( item==NULL ) +return( -1 ); + for ( i=item->char_cnt-1; i>=0 && item->unicode[i]!=uni; --i ); +return( i ); + } + + cm2 = NULL; + switch ( encname ) { + case em_sjis: case em_jis208: case em_jis212: + cm2 = &jis_from_unicode; + break; + case em_gb2312: case em_jisgb: + cm2 = &gb2312_from_unicode; + break; + case em_big5: + cm2 = &big5_from_unicode; + break; + case em_big5hkscs: + cm2 = &big5hkscs_from_unicode; + break; + case em_wansung: case em_ksc5601: + cm2 = &ksc5601_from_unicode; + break; + case em_johab: + cm2 = &johab_from_unicode; + break; + default: +return( -1 ); + } + + if ( uni<0x7f && + (encname==em_wansung || encname==em_big5hkscs || encname==em_big5 || + encname==em_sjis )) +return( uni ); + else if ( uni>=0xff61 && uni<=0xff9f && encname==em_sjis ) +return( EncFromUni(uni,em_jis201)); + + if ( ch1first || ch1>cm2->last ) +return( -1 ); + ret = cm2->table[ch1-cm2->first]==NULL ? -1 : + cm2->table[ch1-cm2->first][uni&0xff]; + if ( ret==0 ) ret=-1; + + if ( ret!=-1 ) { + if ( encname==em_jisgb || encname==em_wansung ) { + ret += 0x8080; + } else if ( encname==em_jis208 ) { + if ( ret&0x8000 ) + ret = -1; + } else if ( encname==em_jis212 ) { + if ( ret&0x8000 ) + ret &= ~0x8000; + else + ret = -1; + } else if ( encname==em_sjis ) { + if ( ret&0x8000 ) + ret = -1; + else { + int ch1 = ret>>8, ch2 = ret&0xff, ro, co; + ro = ch1<95 ? 112 : 176; + co = (ch1&1) ? (ch2>95?32:31) : 126; + ret = ((((ch1+1)>>1) + ro )<<8 ) | (ch2+co); + } + } + } +return( ret ); +} + +int32 EncFromSF(int32 uni, SplineFont *sf) { + int enc = EncFromUni(uni,sf->encoding_name); + int i; + + if ( enc!=-1 ) +return( enc ); + if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) { + struct cidmap *map; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + map=FindCidMap(sf->cidregistry,sf->ordering,sf->supplement,sf); +return( NameEnc2CID(map,uni,NULL)); + } else { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]->unicodeenc==uni ) +return( i ); + } + } +return( -1 ); +} + +SplineChar *SCBuildDummy(SplineChar *dummy,SplineFont *sf,int i) { + static char namebuf[100]; +#ifdef FONTFORGE_CONFIG_TYPE3 + static Layer layers[2]; +#endif + Encoding *item=NULL; + int j; + + memset(dummy,'\0',sizeof(*dummy)); + dummy->color = COLOR_DEFAULT; + dummy->layer_cnt = 2; +#ifdef FONTFORGE_CONFIG_TYPE3 + dummy->layers = layers; +#endif + dummy->enc = i; + if ( sf->compacted ) { + for ( j=i-1; j>=0; --j ) + if ( jcharcnt && sf->chars[j]!=NULL ) + break; + if ( j>0 ) + dummy->old_enc = sf->chars[j]->old_enc+(i-j); + else + dummy->old_enc = i; + } + if ( sf->cidmaster!=NULL ) { + /* CID fonts don't have encodings, instead we must look up the cid */ + if ( sf->cidmaster->loading_cid_map ) + dummy->unicodeenc = -1; + else + dummy->unicodeenc = CID2NameEnc(FindCidMap(sf->cidmaster->cidregistry,sf->cidmaster->ordering,sf->cidmaster->supplement,sf->cidmaster), + i,namebuf,sizeof(namebuf)); + } else + dummy->unicodeenc = UniFromEnc(i,sf->encoding_name); + + if ( sf->cidmaster!=NULL ) + dummy->name = namebuf; + else if ( (dummy->unicodeenc>=0 && dummy->unicodeenc<' ') || + (dummy->unicodeenc>=0x7f && dummy->unicodeenc<0xa0) ) + /* standard controls */; + else if ( dummy->unicodeenc!=-1 ) { + if ( dummy->unicodeencname = (char *) psunicodenames[dummy->unicodeenc]; + if ( dummy->name==NULL && sf->uni_interp==ui_adobe && + ((dummy->unicodeenc>=0xe000 && dummy->unicodeenc<=0xf7ff ) || + (dummy->unicodeenc>=0xfb00 && dummy->unicodeenc<=0xfb06 ))) { + /* If we are using Adobe's interpretation of the private use */ + /* area (which means small caps, etc. Then look for those */ + /* names (also include the names for ligatures) */ + for ( j=0; psaltuninames[j].name!=NULL; ++j ) { + if ( psaltuninames[j].unicode == dummy->unicodeenc && + strpbrk(psaltuninames[j].name,"._")!=NULL ) { + dummy->name = psaltuninames[j].name; + break; + } + } + } + if ( dummy->name==NULL ) { + if ( dummy->unicodeenc==0x2d ) + dummy->name = "hyphen-minus"; + else if ( dummy->unicodeenc==0xad ) + dummy->name = "softhyphen"; + else if ( dummy->unicodeenc==0x00 ) + dummy->name = ".notdef"; + else if ( dummy->unicodeenc==0xa0 ) + dummy->name = "nonbreakingspace"; + else if ( dummy->unicodeenc==0x03bc && sf->uni_interp==ui_greek ) + dummy->name = "mu.greek"; + else if ( dummy->unicodeenc==0x0394 && sf->uni_interp==ui_greek ) + dummy->name = "Delta.greek"; + else if ( dummy->unicodeenc==0x03a9 && sf->uni_interp==ui_greek ) + dummy->name = "Omega.greek"; + else { + if ( dummy->unicodeenc>=0x10000 ) + sprintf( namebuf, "u%04X", dummy->unicodeenc); + else + sprintf( namebuf, "uni%04X", dummy->unicodeenc); + dummy->name = namebuf; + } + } + } else if ( item!=NULL && item->psnames!=NULL ) + dummy->name = item->psnames[i]; + if ( dummy->name==NULL ) { + if ( dummy->unicodeenc!=-1 || i<256 ) + dummy->name = ".notdef"; + else { + int j; + sprintf( namebuf, "NameMe-%d", i); + j=0; + while ( SFGetChar(sf,-1,namebuf)!=NULL ) + sprintf( namebuf, "NameMe-%d.%d", i, ++j); + dummy->name = namebuf; + } + } + dummy->width = dummy->vwidth = sf->ascent+sf->descent; + if ( dummy->unicodeenc>0 && dummy->unicodeenc<0x10000 && + iscombining(dummy->unicodeenc)) + dummy->width = 0; /* Mark characters should be 0 width */ + dummy->parent = sf; + dummy->orig_pos = 0xffff; +return( dummy ); +} + +static SplineChar *_SFMakeChar(SplineFont *sf,int i) { + SplineChar dummy, *sc; + SplineFont *ssf; + int j; +#ifdef FONTFORGE_CONFIG_TYPE3 + Layer *l; +#endif + + if ( sf->subfontcnt!=0 ) { + ssf = NULL; + for ( j=0; jsubfontcnt; ++j ) + if ( isubfonts[j]->charcnt ) { + ssf = sf->subfonts[j]; + if ( ssf->chars[i]!=NULL ) { +return( ssf->chars[i] ); + } + } + sf = ssf; + } + + if ( (sc = sf->chars[i])==NULL ) { + SCBuildDummy(&dummy,sf,i); + sf->chars[i] = sc = SplineCharCreate(); +#ifdef FONTFORGE_CONFIG_TYPE3 + l = sc->layers; + *sc = dummy; + sc->layers = l; /* It's empty, no need to copy dummy's layers */ +#else + *sc = dummy; +#endif + sc->name = copy(sc->name); + SCLigDefault(sc); + sc->parent = sf; + } +return( sc ); +} + +SplineChar *SFMakeChar(SplineFont *sf,int i) { + if ( sf->mm!=NULL && sf->chars[i]==NULL ) { + int j; + _SFMakeChar(sf->mm->normal,i); + for ( j=0; jmm->instance_count; ++j ) + _SFMakeChar(sf->mm->instances[j],i); + } +return( _SFMakeChar(sf,i)); +} + +static GImage *GImageCropAndRotate(GImage *unrot) { + struct _GImage *unbase = unrot->u.image, *rbase; + int xmin = unbase->width, xmax = -1, ymin = unbase->height, ymax = -1; + int i,j, ii; + GImage *rot; + + for ( i=0; iheight; ++i ) { + for ( j=0; jwidth; ++j ) { + if ( !(unbase->data[i*unbase->bytes_per_line+(j>>3)]&(0x80>>(j&7))) ) { + if ( jxmax ) xmax = j; + if ( i>ymax ) ymax = i; + if ( iu.image; + memset(rbase->data,-1,rbase->height*rbase->bytes_per_line); + for ( i=ymin; i<=ymax; ++i ) { + for ( j=xmin; j<=xmax; ++j ) { + if ( !(unbase->data[i*unbase->bytes_per_line+(j>>3)]&(0x80>>(j&7)) )) { + ii = ymax-i; + rbase->data[(j-xmin)*rbase->bytes_per_line+(ii>>3)] &= ~(0x80>>(ii&7)); + } + } + } + rbase->trans = 1; +return( rot ); +} + +static GImage *UniGetRotatedGlyph(SplineFont *sf, SplineChar *sc,int uni) { + int cid=-1; + SplineChar *cidsc, dummy; + static GWindow pixmap=NULL; + GRect r; + unichar_t buf[2]; + GImage *unrot, *rot; + + if ( uni!=-1 ) + /* Do nothing */; + else if ( sscanf(sc->name,"vertuni%x", (unsigned *) &uni)!=1 && + (sscanf( sc->name, "cid-%d", &cid)==1 || + sscanf( sc->name, "vertcid_%d", &cid)==1 || /* Obsolete names */ + sscanf( sc->name, "cid_%d", &cid)==1 )) { + cidsc = NULL; + if ( !sf->compacted ) { + if ( sf->cidmaster==NULL ) { + if ( cid>=0 && cidcharcnt ) + cidsc = sf->chars[cid]; + } else { + cidsc = SCBuildDummy(&dummy,sf,cid); + } + } else { + int i; + for (i=0; icharcnt && sf->chars[i]->old_enc!=cid; i++); + cidsc = SCBuildDummy(&dummy,sf,i); + } + if ( cidsc==NULL || cidsc->unicodeenc==-1 ) +return( NULL ); + uni = cidsc->unicodeenc; + } + if ( uni&0x10000 ) uni -= 0x10000; /* Bug in some old cidmap files */ + if ( uni<0 || uni>0xffff ) +return( NULL ); + + if ( pixmap==NULL ) { + pixmap = GDrawCreateBitmap(NULL,2*FV_LAB_HEIGHT,2*FV_LAB_HEIGHT,NULL); + if ( pixmap==NULL ) +return( NULL ); + GDrawSetFont(pixmap,sf->fv->header); + } + r.x = r.y = 0; + r.width = r.height = 2*FV_LAB_HEIGHT; + GDrawFillRect(pixmap,&r,1); + buf[0] = uni; buf[1] = 0; + GDrawDrawText(pixmap,2,FV_LAB_HEIGHT,buf,1,NULL,0); + unrot = GDrawCopyScreenToImage(pixmap,&r); + if ( unrot==NULL ) +return( NULL ); + + rot = GImageCropAndRotate(unrot); + GImageDestroy(unrot); +return( rot ); +} + +static int Use2ByteEnc(FontView *fv,SplineChar *sc, unichar_t *buf,FontMods *mods) { + int ch1 = sc->enc>>8, ch2 = sc->enc&0xff, newch; + int enc = fv->sf->encoding_name; + unsigned short *subtable; + + retry: + switch ( enc ) { + case em_big5: case em_big5hkscs: + if ( !GDrawFontHasCharset(fv->header,em_big5)) +return( false); + if ( ch1<0xa1 || ch1>0xf9 || ch2<0x40 || ch2>0xfe || sc->enc> 0xf9fe ) +return( false ); + mods->has_charset = true; mods->charset = em_big5; + buf[0] = sc->enc; + buf[1] = 0; +return( true ); + break; + case em_sjis: + if ( !GDrawFontHasCharset(fv->header,em_jis208)) +return( false); + if ( ch1>=129 && ch1<=159 ) + ch1-=112; + else if ( ch1>=0xe0 && ch1<=0xef ) + ch1-=176; + else +return( false ); + ch1<<=1; + if ( ch2 == 127 ) +return( false ); + else if ( ch2>=159 ) + ch2-=126; + else if ( ch2>127 ) { + --ch1; + ch2 -= 32; + } else { + -- ch1; + ch2 -= 31; + } + mods->has_charset = true; mods->charset = em_jis208; + buf[0] = (ch1<<8) | ch2; + buf[1] = 0; +return( true ); + break; + case em_wansung: + if ( !GDrawFontHasCharset(fv->header,em_ksc5601)) +return( false); + if ( ch1<0xa1 || ch1>0xfd || ch2<0xa1 || ch2>0xfe || sc->enc > 0xfdfe ) +return( false ); + mods->has_charset = true; mods->charset = em_ksc5601; + buf[0] = sc->enc-0x8080; + buf[1] = 0; +return( true ); + break; + case em_jisgb: + if ( !GDrawFontHasCharset(fv->header,em_gb2312)) +return( false); + if ( ch1<0xa1 || ch1>0xfd || ch2<0xa1 || ch2>0xfe || sc->enc > 0xfdfe ) +return( false ); + mods->has_charset = true; mods->charset = em_gb2312; + buf[0] = sc->enc-0x8080; + buf[1] = 0; +return( true ); + break; + case em_ksc5601: case em_jis208: case em_jis212: case em_gb2312: + if ( !GDrawFontHasCharset(fv->header,enc)) +return( false); + if ( ch1<0x21 || ch1>0x7e || ch2<0x21 || ch2>0x7e ) +return( false ); + mods->has_charset = true; mods->charset = enc; + buf[0] = (ch1<<8)|ch2; + buf[1] = 0; +return( true ); + break; + default: + /* If possible, look at the unicode font using the appropriate glyphs */ + /* for the CJ language for which the font was designed */ + ch1 = sc->unicodeenc>>8, ch2 = sc->unicodeenc&0xff; + switch ( fv->sf->uni_interp ) { + case ui_japanese: + if ( ch1>=jis_from_unicode.first && ch1<=jis_from_unicode.last && + (subtable = jis_from_unicode.table[ch1-jis_from_unicode.first])!=NULL && + (newch = subtable[ch2])!=0 ) { + if ( newch&0x8000 ) { + if ( GDrawFontHasCharset(fv->header,em_jis212)) { + enc = em_jis212; + newch &= ~0x8000; + ch1 = newch>>8; ch2 = newch&0xff; + } else +return( false ); + } else { + if ( GDrawFontHasCharset(fv->header,em_jis208)) { + enc = em_jis208; + ch1 = newch>>8; ch2 = newch&0xff; + } else +return( false ); + } + } else +return( false ); + break; + case ui_korean: + /* Don't know what to do about korean hanga chars */ + /* No ambiguity for hangul */ +return( false ); + break; + case ui_trad_chinese: + if ( ch1>=big5hkscs_from_unicode.first && ch1<=big5hkscs_from_unicode.last && + (subtable = big5hkscs_from_unicode.table[ch1-big5hkscs_from_unicode.first])!=NULL && + (newch = subtable[ch2])!=0 && + GDrawFontHasCharset(fv->header,em_big5)) { + enc = em_big5hkscs; + ch1 = newch>>8; ch2 = newch&0xff; + } else +return( false ); + break; + case ui_simp_chinese: + if ( ch1>=gb2312_from_unicode.first && ch1<=gb2312_from_unicode.last && + (subtable = gb2312_from_unicode.table[ch1-gb2312_from_unicode.first])!=NULL && + (newch = subtable[ch2])!=0 && + GDrawFontHasCharset(fv->header,em_gb2312)) { + enc = em_gb2312; + ch1 = newch>>8; ch2 = newch&0xff; + } else +return( false ); + break; + default: +return( false ); + } + goto retry; + } +} + +static void FVExpose(FontView *fv,GWindow pixmap,GEvent *event) { + int i, j, width; + int changed; + GRect old, old2, box; + GClut clut; + struct _GImage base; + GImage gi; + SplineChar dummy; + int italic, wasitalic=0; + GImage *rotated=NULL; + int em = fv->sf->ascent+fv->sf->descent; + int yorg = fv->magnify*(fv->show->ascent-fv->sf->vertical_origin*fv->show->pixelsize/em); + + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + if ( fv->show->clut!=NULL ) { + gi.u.image = &base; + base.image_type = it_index; + base.clut = fv->show->clut; + GDrawSetDither(NULL, false); + base.trans = -1; + /*base.clut->trans_index = 0;*/ + } else { + memset(&clut,'\0',sizeof(clut)); + gi.u.image = &base; + base.image_type = it_mono; + base.clut = &clut; + clut.clut_len = 2; + clut.clut[0] = GDrawGetDefaultBackground(NULL); + } + + GDrawSetFont(pixmap,fv->header); + GDrawSetLineWidth(pixmap,0); + GDrawPushClip(pixmap,&event->u.expose.rect,&old); + GDrawFillRect(pixmap,NULL,GDrawGetDefaultBackground(NULL)); + for ( i=0; i<=fv->rowcnt; ++i ) { + GDrawDrawLine(pixmap,0,i*fv->cbh,fv->width,i*fv->cbh,0); + GDrawDrawLine(pixmap,0,i*fv->cbh+FV_LAB_HEIGHT,fv->width,i*fv->cbh+FV_LAB_HEIGHT,0x808080); + } + for ( i=0; i<=fv->colcnt; ++i ) + GDrawDrawLine(pixmap,i*fv->cbw,0,i*fv->cbw,fv->height,0); + for ( i=event->u.expose.rect.y/fv->cbh; i<=fv->rowcnt && + (event->u.expose.rect.y+event->u.expose.rect.height+fv->cbh-1)/fv->cbh; ++i ) for ( j=0; jcolcnt; ++j ) { + int index = (i+fv->rowoff)*fv->colcnt+j; + italic = false; + if ( fv->mapping!=NULL ) { + if ( index>=fv->mapcnt ) index = fv->sf->charcnt; + else + index = fv->mapping[index]; + } + if ( index < fv->sf->charcnt ) { + SplineChar *sc = fv->sf->chars[index]; + unichar_t buf[2]; + Color fg = 0; + BDFChar *bdfc; + FontMods *mods=NULL; + static FontMods for_charset; + if ( sc==NULL ) + sc = SCBuildDummy(&dummy,fv->sf,index); + if ( sc->unicodeenc==0xad ) + buf[0] = '-'; + else if ( Use2ByteEnc(fv,sc,buf,&for_charset)) + mods = &for_charset; + else if ( sc->unicodeenc!=-1 && sc->unicodeenc<65536 ) + buf[0] = sc->unicodeenc; +#if HANYANG + else if ( sc->compositionunit ) { + if ( sc->jamo<19 ) + buf[0] = 0x1100+sc->jamo; + else if ( sc->jamo<19+21 ) + buf[0] = 0x1161 + sc->jamo-19; + else /* Leave a hole for the blank char */ + buf[0] = 0x11a8 + sc->jamo-(19+21+1); + } +#endif + else { + char *pt = strchr(sc->name,'.'); + buf[0] = '?'; + fg = 0xff0000; + if ( pt!=NULL ) { + int i, n = pt-sc->name; + char *end; + if ( n==7 && sc->name[0]=='u' && sc->name[1]=='n' && sc->name[2]=='i' && + (i=strtol(sc->name+3,&end,16), end-sc->name==7)) + buf[0] = i; + else if ( n>=5 && n<=7 && sc->name[0]=='u' && + (i=strtol(sc->name+1,&end,16), end-sc->name==n)) + buf[0] = i; + else for ( i=0; iname,psunicodenames[i],n)==0 && + psunicodenames[i][n]=='\0' ) { + buf[0] = i; + break; + } + if ( strstr(pt,".vert")!=NULL ) + rotated = UniGetRotatedGlyph(fv->sf,sc,buf[0]!='?'?buf[0]:-1); + if ( buf[0]!='?' ) { + fg = 0; + if ( strstr(pt,".italic")!=NULL ) + italic = true; + } + } else if ( strncmp(sc->name,"hwuni",5)==0 ) { + int uni=-1; + sscanf(sc->name,"hwuni%x", (unsigned *) &uni ); + if ( uni!=-1 ) buf[0] = uni; + } else if ( strncmp(sc->name,"italicuni",9)==0 ) { + int uni=-1; + sscanf(sc->name,"italicuni%x", (unsigned *) &uni ); + if ( uni!=-1 ) { buf[0] = uni; italic=true; } + fg = 0x000000; + } else if ( strncmp(sc->name,"vertcid_",8)==0 || + strncmp(sc->name,"vertuni",7)==0 ) { + rotated = UniGetRotatedGlyph(fv->sf,sc,-1); + } + } + if ( sc->layers[ly_back].splines!=NULL || sc->layers[ly_back].images!=NULL || sc->color!=COLOR_DEFAULT ) { + GRect r; + r.x = j*fv->cbw+1; r.width = fv->cbw-1; + r.y = i*fv->cbh+1; r.height = FV_LAB_HEIGHT-1; + GDrawFillRect(pixmap,&r,sc->color!=COLOR_DEFAULT?sc->color:0x808080); + } + if ( rotated!=NULL ) { + GRect r; + r.x = j*fv->cbw+1; r.width = fv->cbw-1; + r.y = i*fv->cbh+1; r.height = FV_LAB_HEIGHT-1; + GDrawPushClip(pixmap,&r,&old2); + GDrawDrawImage(pixmap,rotated,NULL,j*fv->cbw+2,i*fv->cbh+2); + GDrawPopClip(pixmap,&old2); + GImageDestroy(rotated); + rotated = NULL; + } else { + if ( italic!=wasitalic ) GDrawSetFont(pixmap,italic?fv->iheader:fv->header); + width = GDrawGetTextWidth(pixmap,buf,1,mods); + if ( sc->unicodeenc<0x80 || sc->unicodeenc>=0xa0 ) + GDrawDrawText(pixmap,j*fv->cbw+(fv->cbw-1-width)/2,i*fv->cbh+FV_LAB_HEIGHT-2,buf,1,mods,fg); + wasitalic = italic; + } + changed = sc->changed; + if ( fv->sf->onlybitmaps ) + changed = fv->show->chars[index]==NULL? false : fv->show->chars[index]->changed; + if ( changed ) { + GRect r; + r.x = j*fv->cbw+1; r.width = fv->cbw-1; + r.y = i*fv->cbh+1; r.height = FV_LAB_HEIGHT-1; + GDrawSetXORBase(pixmap,GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(fv->v))); + GDrawSetXORMode(pixmap); + GDrawFillRect(pixmap,&r,0x000000); + GDrawSetCopyMode(pixmap); + } + + if ( fv->show!=NULL && fv->show->piecemeal && + fv->show->chars[index]==NULL && fv->sf->chars[index]!=NULL ) + BDFPieceMeal(fv->show,index); + + if ( !SCWorthOutputting(fv->sf->chars[index]) ) { + int x = j*fv->cbw+1, xend = x+fv->cbw-2; + int y = i*fv->cbh+14+2, yend = y+fv->cbw-1; + GDrawDrawLine(pixmap,x,y,xend,yend,0xd08080); + GDrawDrawLine(pixmap,x,yend,xend,y,0xd08080); + } + if ( fv->show!=NULL && fv->show->chars[index]==NULL && + SCWorthOutputting(fv->sf->chars[index]) ) { + /* If we have an outline but no bitmap for this slot */ + box.x = j*fv->cbw+1; box.width = fv->cbw-2; + box.y = i*fv->cbh+14+2; box.height = box.width+1; + GDrawDrawRect(pixmap,&box,0xff0000); + ++box.x; ++box.y; box.width -= 2; box.height -= 2; + GDrawDrawRect(pixmap,&box,0xff0000); +/* When reencoding a font we can find times where index>=show->charcnt */ + } else if ( fv->show!=NULL && indexshow->charcnt && + fv->show->chars[index]!=NULL ) { + bdfc = fv->show->chars[index]; + base.data = bdfc->bitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + box.x = j*fv->cbw; box.width = fv->cbw; + box.y = i*fv->cbh+14+1; box.height = box.width+1; + GDrawPushClip(pixmap,&box,&old2); + if ( !fv->sf->onlybitmaps && + sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL && + !sc->widthset && + !(bdfc->xmax<=0 && bdfc->xmin==0 && bdfc->ymax<=0 && bdfc->ymax==0) ) { + /* If we have a bitmap but no outline character... */ + GRect b; + b.x = box.x+1; b.y = box.y+1; b.width = box.width-2; b.height = box.height-2; + GDrawDrawRect(pixmap,&b,0x008000); + ++b.x; ++b.y; b.width -= 2; b.height -= 2; + GDrawDrawRect(pixmap,&b,0x008000); + } + /* I assume that the bitmap image matches the bounding*/ + /* box. In some bitmap fonts the bitmap has white space on the*/ + /* right. This can throw off the centering algorithem */ + if ( fv->magnify>1 ) { + GDrawDrawImageMagnified(pixmap,&gi,NULL, + j*fv->cbw+(fv->cbw-1-fv->magnify*base.width)/2, + i*fv->cbh+FV_LAB_HEIGHT+1+fv->magnify*(fv->show->ascent-bdfc->ymax), + fv->magnify*base.width,fv->magnify*base.height); + } else + GDrawDrawImage(pixmap,&gi,NULL, + j*fv->cbw+(fv->cbw-1-base.width)/2, + i*fv->cbh+FV_LAB_HEIGHT+1+fv->show->ascent-bdfc->ymax); + if ( fv->showhmetrics ) { + int x1, x0 = j*fv->cbw+(fv->cbw-1-fv->magnify*base.width)/2- bdfc->xmin*fv->magnify; + /* Draw advance width & horizontal origin */ + if ( fv->showhmetrics&fvm_origin ) + GDrawDrawLine(pixmap,x0,i*fv->cbh+FV_LAB_HEIGHT+yorg-3,x0, + i*fv->cbh+FV_LAB_HEIGHT+yorg+2,METRICS_ORIGIN); + x1 = x0 + bdfc->width; + if ( fv->showhmetrics&fvm_advanceat ) + GDrawDrawLine(pixmap,x1,i*fv->cbh+FV_LAB_HEIGHT+1,x1, + (i+1)*fv->cbh-1,METRICS_ADVANCE); + if ( fv->showhmetrics&fvm_advanceto ) + GDrawDrawLine(pixmap,x0,(i+1)*fv->cbh-2,x1, + (i+1)*fv->cbh-2,METRICS_ADVANCE); + } + if ( fv->showvmetrics ) { + int x0 = j*fv->cbw+(fv->cbw-1-fv->magnify*base.width)/2- bdfc->xmin*fv->magnify + + fv->magnify*fv->show->pixelsize/2; + int y0 = i*fv->cbh+FV_LAB_HEIGHT+yorg; + int yvw = y0 + fv->magnify*sc->vwidth*fv->show->pixelsize/em; + if ( fv->showvmetrics&fvm_baseline ) + GDrawDrawLine(pixmap,x0,i*fv->cbh+FV_LAB_HEIGHT+1,x0, + (i+1)*fv->cbh-1,METRICS_BASELINE); + if ( fv->showvmetrics&fvm_advanceat ) + GDrawDrawLine(pixmap,j*fv->cbw,yvw,(j+1)*fv->cbw, + yvw,METRICS_ADVANCE); + if ( fv->showvmetrics&fvm_advanceto ) + GDrawDrawLine(pixmap,j*fv->cbw+2,y0,j*fv->cbw+2, + yvw,METRICS_ADVANCE); + if ( fv->showvmetrics&fvm_origin ) + GDrawDrawLine(pixmap,x0-3,i*fv->cbh+FV_LAB_HEIGHT+yorg,x0+2,i*fv->cbh+FV_LAB_HEIGHT+yorg,METRICS_ORIGIN); + } + GDrawPopClip(pixmap,&old2); + } + if ( fv->selected[index] ) { + box.x = j*fv->cbw+1; box.width = fv->cbw-1; + box.y = i*fv->cbh+FV_LAB_HEIGHT+1; box.height = fv->cbw; + GDrawSetXORMode(pixmap); + GDrawSetXORBase(pixmap,GDrawGetDefaultBackground(NULL)); + GDrawFillRect(pixmap,&box,XOR_COLOR); + GDrawSetCopyMode(pixmap); + } + } + } + if ( fv->showhmetrics&fvm_baseline ) { + int baseline = (fv->sf->ascent*fv->magnify*fv->show->pixelsize)/em+1; + for ( i=0; i<=fv->rowcnt; ++i ) + GDrawDrawLine(pixmap,0,i*fv->cbh+FV_LAB_HEIGHT+baseline,fv->width,i*fv->cbh+FV_LAB_HEIGHT+baseline,METRICS_BASELINE); + } + GDrawPopClip(pixmap,&old); + GDrawSetDither(NULL, true); +} + +static char *chosung[] = { "G", "GG", "N", "D", "DD", "L", "M", "B", "BB", "S", "SS", "", "J", "JJ", "C", "K", "T", "P", "H", NULL }; +static char *jungsung[] = { "A", "AE", "YA", "YAE", "EO", "E", "YEO", "YE", "O", "WA", "WAE", "OE", "YO", "U", "WEO", "WE", "WI", "YU", "EU", "YI", "I", NULL }; +static char *jongsung[] = { "", "G", "GG", "GS", "N", "NJ", "NH", "D", "L", "LG", "LM", "LB", "LS", "LT", "LP", "LH", "M", "B", "BS", "S", "SS", "NG", "J", "C", "K", "T", "P", "H", NULL }; + +static void FVDrawInfo(FontView *fv,GWindow pixmap,GEvent *event) { + GRect old, r; + char buffer[250]; + unichar_t ubuffer[250]; + Color bg = GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(pixmap)); + SplineChar *sc, dummy; + SplineFont *sf = fv->sf; + + if ( event->u.expose.rect.y+event->u.expose.rect.height<=fv->mbh ) +return; + + GDrawSetFont(pixmap,fv->header); + GDrawPushClip(pixmap,&event->u.expose.rect,&old); + + r.x = 0; r.width = fv->width; r.y = fv->mbh; r.height = fv->infoh; + GDrawFillRect(pixmap,&r,bg); + if ( fv->end_pos>=sf->charcnt || fv->pressed_pos>=sf->charcnt ) + fv->end_pos = fv->pressed_pos = -1; /* Can happen after reencoding */ + if ( fv->end_pos == -1 ) +return; + + if ( sf->remap!=NULL ) { + int localenc = fv->end_pos; + struct remap *map = sf->remap; + while ( map->infont!=-1 ) { + if ( localenc>=map->infont && localenc<=map->infont+(map->lastenc-map->firstenc) ) { + localenc += map->firstenc-map->infont; + break; + } + ++map; + } + sprintf( buffer, "%-5u (0x%04x) ", localenc, localenc ); + } else if ( sf->encoding_nameencoding_name>=em_base ) + sprintf( buffer, "%-3d (0x%02x) ", fv->end_pos, fv->end_pos ); + else + sprintf( buffer, "%-5d (0x%04x) ", fv->end_pos, fv->end_pos ); + sc = sf->chars[fv->end_pos]; + if ( sc==NULL ) + sc = SCBuildDummy(&dummy,sf,fv->end_pos); + if ( sc->unicodeenc!=-1 ) + sprintf( buffer+strlen(buffer), "U+%04X", sc->unicodeenc ); + else + sprintf( buffer+strlen(buffer), "U+????" ); + sprintf( buffer+strlen(buffer), " %.*s", (int) sizeof(buffer)-strlen(buffer)-1, + sc->name ); + + strcat(buffer," "); + uc_strcpy(ubuffer,buffer); + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x110000 && _UnicodeNameAnnot!=NULL && + _UnicodeNameAnnot[sc->unicodeenc>>16][(sc->unicodeenc>>8)&0xff][sc->unicodeenc&0xff].name!=NULL ) { + uc_strncat(ubuffer, _UnicodeNameAnnot[sc->unicodeenc>>16][(sc->unicodeenc>>8)&0xff][sc->unicodeenc&0xff].name, 80); + } else if ( sc->unicodeenc>=0xAC00 && sc->unicodeenc<=0xD7A3 ) { + sprintf( buffer, "Hangul Syllable %s%s%s", + chosung[(sc->unicodeenc-0xAC00)/(21*28)], + jungsung[(sc->unicodeenc-0xAC00)/28%21], + jongsung[(sc->unicodeenc-0xAC00)%28] ); + uc_strncat(ubuffer,buffer,80); + } else if ( sc->unicodeenc!=-1 ) { + uc_strncat(ubuffer, UnicodeRange(sc->unicodeenc),80); + } + + GDrawDrawText(pixmap,10,fv->mbh+11,ubuffer,-1,NULL,0xff0000); + GDrawPopClip(pixmap,&old); +} + +static void FVShowInfo(FontView *fv) { + GRect r; + + if ( fv->v==NULL ) /* Can happen in scripts */ +return; + + r.x = 0; r.width = fv->width; r.y = fv->mbh; r.height = fv->infoh; + GDrawRequestExpose(fv->gw,&r,false); +} + +static void FVChar(FontView *fv,GEvent *event) { + int i,pos, cnt; + +#if MyMemory + if ( event->u.chr.keysym == GK_F2 ) { + fprintf( stderr, "Malloc debug on\n" ); + __malloc_debug(5); + } else if ( event->u.chr.keysym == GK_F3 ) { + fprintf( stderr, "Malloc debug off\n" ); + __malloc_debug(0); + } +#endif + + if ( event->u.chr.keysym=='s' && + (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) + MenuSaveAll(NULL,NULL,NULL); + else if ( event->u.chr.keysym=='q' && + (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) + MenuExit(NULL,NULL,NULL); + else if ( event->u.chr.keysym=='I' && + (event->u.chr.state&ksm_shift) && + (event->u.chr.state&ksm_meta) ) + FVMenuCharInfo(fv->gw,NULL,NULL); + else if (( event->u.chr.keysym=='M' ||event->u.chr.keysym=='m' ) && + (event->u.chr.state&ksm_control) ) { + if ( (event->u.chr.state&ksm_meta) && (event->u.chr.state&ksm_shift)) + FVSimplify(fv,1); + else if ( (event->u.chr.state&ksm_shift)) + FVSimplify(fv,0); + } else if ( (event->u.chr.keysym=='[' || event->u.chr.keysym==']') && + (event->u.chr.state&ksm_control) ) { + /* some people have remapped keyboards so that shift is needed to get [] */ + int pos = FVAnyCharSelected(fv); + if ( pos>=0 ) { + if ( event->u.chr.keysym=='[' ) + --pos; + else + ++pos; + if ( pos<0 ) pos = fv->sf->charcnt-1; + else if ( pos>= fv->sf->charcnt ) pos = 0; + if ( pos>=0 && possf->charcnt ) + FVChangeChar(fv,pos); + } + } else if ( isdigit(event->u.chr.keysym) && (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) { + /* The Script menu isn't always up to date, so we might get one of */ + /* the shortcuts here */ + int index = event->u.chr.keysym-'1'; + if ( index<0 ) index = 9; + if ( script_filenames[index]!=NULL ) + ExecuteScriptFile(fv,script_filenames[index]); + } else if ( event->u.chr.keysym == GK_Left || + event->u.chr.keysym == GK_Tab || + event->u.chr.keysym == GK_BackTab || + event->u.chr.keysym == GK_Up || + event->u.chr.keysym == GK_Right || + event->u.chr.keysym == GK_Down || + event->u.chr.keysym == GK_KP_Left || + event->u.chr.keysym == GK_KP_Up || + event->u.chr.keysym == GK_KP_Right || + event->u.chr.keysym == GK_KP_Down || + event->u.chr.keysym == GK_Home || + event->u.chr.keysym == GK_KP_Home || + event->u.chr.keysym == GK_End || + event->u.chr.keysym == GK_KP_End || + event->u.chr.keysym == GK_Page_Up || + event->u.chr.keysym == GK_KP_Page_Up || + event->u.chr.keysym == GK_Prior || + event->u.chr.keysym == GK_Page_Down || + event->u.chr.keysym == GK_KP_Page_Down || + event->u.chr.keysym == GK_Next ) { + int end_pos = fv->end_pos; + /* We move the currently selected char. If there is none, then pick */ + /* something on the screen */ + if ( end_pos==-1 ) + end_pos = (fv->rowoff+fv->rowcnt/2)*fv->colcnt; + switch ( event->u.chr.keysym ) { + case GK_Tab: + pos = end_pos; + do { + if ( event->u.chr.state&ksm_shift ) + --pos; + else + ++pos; + if ( pos>=fv->sf->charcnt ) pos = 0; + else if ( pos<0 ) pos = fv->sf->charcnt-1; + } while ( pos!=end_pos && !SCWorthOutputting(fv->sf->chars[pos])); + if ( pos==end_pos ) ++pos; + if ( pos>=fv->sf->charcnt ) pos = 0; + break; +#if GK_Tab!=GK_BackTab + case GK_BackTab: + pos = end_pos; + do { + --pos; + if ( pos<0 ) pos = fv->sf->charcnt-1; + } while ( pos!=end_pos && !SCWorthOutputting(fv->sf->chars[pos])); + if ( pos==end_pos ) --pos; + if ( pos<0 ) { + if ( SCWorthOutputting(fv->sf->chars[fv->sf->charcnt-1])) + pos = fv->sf->charcnt-1; + else + pos = 0; + } + break; +#endif + case GK_Left: case GK_KP_Left: + pos = end_pos-1; + break; + case GK_Right: case GK_KP_Right: + pos = end_pos+1; + break; + case GK_Up: case GK_KP_Up: + pos = end_pos-fv->colcnt; + break; + case GK_Down: case GK_KP_Down: + pos = end_pos+fv->colcnt; + break; + case GK_End: case GK_KP_End: + pos = fv->sf->charcnt; + break; + case GK_Home: case GK_KP_Home: + pos = 0; + if ( fv->sf->top_enc!=-1 && fv->sf->top_encsf->charcnt ) + pos = fv->sf->top_enc; + else { + pos = SFFindChar(fv->sf,'A',NULL); + if ( pos==-1 ) pos = 0; + } + break; + case GK_Page_Up: case GK_KP_Page_Up: +#if GK_Prior!=GK_Page_Up + case GK_Prior: +#endif + pos = (fv->rowoff-fv->rowcnt+1)*fv->colcnt; + break; + case GK_Page_Down: case GK_KP_Page_Down: +#if GK_Next!=GK_Page_Down + case GK_Next: +#endif + pos = (fv->rowoff+fv->rowcnt+1)*fv->colcnt; + break; + } + if ( pos<0 ) pos = 0; + if ( pos>=fv->sf->charcnt ) pos = fv->sf->charcnt-1; + if ( event->u.chr.state&ksm_shift && event->u.chr.keysym!=GK_Tab && event->u.chr.keysym!=GK_BackTab ) { + FVReselect(fv,pos); + } else { + FVDeselectAll(fv); + fv->selected[pos] = true; + FVToggleCharSelected(fv,pos); + fv->pressed_pos = pos; + fv->sel_index = 1; + } + fv->end_pos = pos; + FVShowInfo(fv); + FVScrollToChar(fv,pos); + } else if ( event->u.chr.keysym == GK_Help ) { + MenuHelp(NULL,NULL,NULL); /* Menu does F1 */ + } else if ( event->u.chr.keysym == GK_Escape ) { + FVDeselectAll(fv); + } else if ( event->u.chr.chars[0]=='\r' || event->u.chr.chars[0]=='\n' ) { + for ( i=cnt=0; isf->charcnt && cnt<10; ++i ) if ( fv->selected[i] ) { + SplineChar *sc = SFMakeChar(fv->sf,i); + if ( fv->show==fv->filled ) { + CharViewCreate(sc,fv); + } else { + BDFFont *bdf = fv->show; + if ( bdf->chars[i]==NULL ) + bdf->chars[i] = SplineCharRasterize(sc,bdf->pixelsize); + BitmapViewCreate(bdf->chars[i],bdf,fv); + } + ++cnt; + } + } else if ( event->u.chr.chars[0]<=' ' || event->u.chr.chars[1]!='\0' ) { + /* Do Nothing */; + } else { + SplineFont *sf = fv->sf; + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc==event->u.chr.chars[0] ) + break; + if ( i==sf->charcnt ) for ( i=0; icharcnt; ++i ) if ( sf->chars[i]==NULL ) { + SplineChar dummy; + SCBuildDummy(&dummy,sf,i); + if ( dummy.unicodeenc==event->u.chr.chars[0] ) + break; + } + if ( i!=sf->charcnt ) + FVChangeChar(fv,i); + } +} + +static void uc_annot_strncat(unichar_t *to, const char *from, int len) { + register unichar_t ch; + + to += u_strlen(to); + while ( (ch = *(unsigned char *) from++) != '\0' && --len>=0 ) { + if ( from[-2]=='\t' ) { + if ( ch=='*' ) ch = 0x2022; + else if ( ch=='x' ) ch = 0x2192; + else if ( ch==':' ) ch = 0x224d; + else if ( ch=='#' ) ch = 0x2245; + } else if ( ch=='\t' ) { + *(to++) = ' '; + ch = ' '; + } + *(to++) = ch; + } + *to = 0; +} + +void SCPreparePopup(GWindow gw,SplineChar *sc) { + static unichar_t space[810]; + char cspace[162]; + int upos=-1; + int enc = sc->parent->encoding_name; + int done = false; + int localenc = sc->enc; + struct remap *map = sc->parent->remap; + + if ( map!=NULL ) { + while ( map->infont!=-1 ) { + if ( localenc>=map->infont && localenc<=map->infont+(map->lastenc-map->firstenc) ) { + localenc += map->firstenc-map->infont; + break; + } + ++map; + } + } + + if ( sc->unicodeenc!=-1 ) + upos = sc->unicodeenc; +#if HANYANG + else if ( sc->compositionunit ) { + if ( sc->jamo<19 ) + upos = 0x1100+sc->jamo; + else if ( sc->jamo<19+21 ) + upos = 0x1161 + sc->jamo-19; + else /* Leave a hole for the blank char */ + upos = 0x11a8 + sc->jamo-(19+21+1); + } +#endif + else if (( sc->enc<32 || (sc->enc>=127 && sc->enc<160) ) && + (enc = sc->parent->encoding_name)!=em_none && + (enc<=em_zapfding || (enc>=em_big5 && enc<=em_unicode))) + upos = sc->enc; + else { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf( cspace, "%u 0x%x U+???? \"%.25s\" ", localenc, localenc, sc->name==NULL?"":sc->name ); +#else + snprintf( cspace, sizeof(cspace), "%u 0x%x U+???? \"%.25s\" ", localenc, localenc, sc->name==NULL?"":sc->name ); +#endif + uc_strcpy(space,cspace); + done = true; + } + if ( done ) + /* Do Nothing */; + else if ( upos<0x110000 && _UnicodeNameAnnot!=NULL && + _UnicodeNameAnnot[upos>>16][(upos>>8)&0xff][upos&0xff].name!=NULL ) { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf( cspace, "%u 0x%x U+%04x \"%.25s\" %.100s", localenc, localenc, upos, sc->name==NULL?"":sc->name, + _UnicodeNameAnnot[upos>>16][(upos>>8)&0xff][upos&0xff].name); +#else + snprintf( cspace, sizeof(cspace), "%u 0x%x U+%04x \"%.25s\" %.100s", localenc, localenc, upos, sc->name==NULL?"":sc->name, + _UnicodeNameAnnot[upos>>16][(upos>>8)&0xff][upos&0xff].name); +#endif + uc_strcpy(space,cspace); + } else if ( upos>=0xAC00 && upos<=0xD7A3 ) { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf( cspace, "%u 0x%x U+%04x \"%.25s\" Hangul Syllable %s%s%s", + localenc, localenc, upos, sc->name==NULL?"":sc->name, + chosung[(upos-0xAC00)/(21*28)], + jungsung[(upos-0xAC00)/28%21], + jongsung[(upos-0xAC00)%28] ); +#else + snprintf( cspace, sizeof(cspace), "%u 0x%x U+%04x \"%.25s\" Hangul Syllable %s%s%s", + localenc, localenc, upos, sc->name==NULL?"":sc->name, + chosung[(upos-0xAC00)/(21*28)], + jungsung[(upos-0xAC00)/28%21], + jongsung[(upos-0xAC00)%28] ); +#endif + uc_strcpy(space,cspace); + } else { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf( cspace, "%u 0x%x U+%04x \"%.25s\" %.50s", localenc, localenc, upos, sc->name==NULL?"":sc->name, + UnicodeRange(upos)); +#else + snprintf( cspace, sizeof(cspace), "%u 0x%x U+%04x \"%.25s\" %.50s", localenc, localenc, upos, sc->name==NULL?"":sc->name, + UnicodeRange(upos)); +#endif + uc_strcpy(space,cspace); + } + if ( upos>=0 && upos<0x110000 && _UnicodeNameAnnot!=NULL && + _UnicodeNameAnnot[upos>>16][(upos>>8)&0xff][upos&0xff].annot!=NULL ) { + int left = sizeof(space)/sizeof(space[0]) - u_strlen(space)-1; + if ( left>4 ) { + uc_strcat(space,"\n"); + uc_annot_strncat(space,_UnicodeNameAnnot[upos>>16][(upos>>8)&0xff][upos&0xff].annot,left-2); + } + } + if ( sc->comment!=NULL ) { + int left = sizeof(space)/sizeof(space[0]) - u_strlen(space)-1; + if ( left>4 ) { + uc_strcat(space,"\n\n"); + u_strncat(space,sc->comment,left-2); + } + } + GGadgetPreparePopup(gw,space); +} + +static void noop(void *_fv) { +} + +static void *ddgencharlist(void *_fv,int *len) { + int i,j,cnt; + FontView *fv = (FontView *) _fv; + SplineFont *sf = fv->sf; + char *data; + + for ( i=cnt=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && fv->selected[i]) + cnt += strlen(sf->chars[i]->name)+1; + data = galloc(cnt+1); data[0] = '\0'; + for ( cnt=0, j=1 ; j<=fv->sel_index; ++j ) { + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && fv->selected[i]==j ) { + strcpy(data+cnt,sf->chars[i]->name); + cnt += strlen(sf->chars[i]->name); + strcpy(data+cnt++," "); + } + } + if ( cnt>0 ) + data[--cnt] = '\0'; + *len = cnt; +return( data ); +} + +static void FVMouse(FontView *fv,GEvent *event) { + int pos = (event->u.mouse.y/fv->cbh + fv->rowoff)*fv->colcnt + event->u.mouse.x/fv->cbw; + SplineChar *sc, dummy; + int dopopup = true; + + GGadgetEndPopup(); + if ( event->type==et_mousedown ) + CVPaletteDeactivate(); + if ( pos<0 ) { + pos = 0; + dopopup = false; + } else if ( pos>=fv->sf->charcnt ) { + pos = fv->sf->charcnt-1; + dopopup = false; + } + + sc = fv->sf->chars[pos]; + if ( sc==NULL ) + sc = SCBuildDummy(&dummy,fv->sf,pos); + if ( event->type == et_mouseup && event->u.mouse.clicks==2 ) { + if ( sc==&dummy ) /* I got a crash here once. Stack was corrupted, no idea how */ + sc = SFMakeChar(fv->sf,pos); + if ( fv->show==fv->filled ) { + CharViewCreate(sc,fv); + } else { + BDFFont *bdf = fv->show; + if ( bdf->chars[pos]==NULL ) + bdf->chars[pos] = SplineCharRasterize(sc,bdf->pixelsize); + BitmapViewCreate(bdf->chars[pos],bdf,fv); + } + } else if ( event->type == et_mousemove ) { + if ( dopopup ) + SCPreparePopup(fv->v,sc); + } + if ( event->type == et_mousedown ) { + if ( fv->drag_and_drop ) { + GDrawSetCursor(fv->v,ct_mypointer); + fv->any_dd_events_sent = fv->drag_and_drop = false; + } + if ( !(event->u.mouse.state&ksm_shift) && event->u.mouse.clicks<=1 ) { + if ( !fv->selected[pos] ) + FVDeselectAll(fv); + else if ( event->u.mouse.button!=3 ) { + fv->drag_and_drop = fv->has_dd_no_cursor = true; + fv->any_dd_events_sent = false; + GDrawSetCursor(fv->v,ct_prohibition); + GDrawGrabSelection(fv->v,sn_drag_and_drop); + GDrawAddSelectionType(fv->v,sn_drag_and_drop,"STRING",fv,0,sizeof(char), + ddgencharlist,noop); + } + } + fv->pressed_pos = fv->end_pos = pos; + FVShowInfo(fv); + if ( !fv->drag_and_drop ) { + if ( !(event->u.mouse.state&ksm_shift)) + fv->sel_index = 1; + else if ( fv->sel_index<255 ) + ++fv->sel_index; + if ( fv->pressed!=NULL ) + GDrawCancelTimer(fv->pressed); + else if ( event->u.mouse.state&ksm_shift ) { + fv->selected[pos] = fv->selected[pos] ? 0 : fv->sel_index; + FVToggleCharSelected(fv,pos); + } else if ( !fv->selected[pos] ) { + fv->selected[pos] = fv->sel_index; + FVToggleCharSelected(fv,pos); + } + if ( event->u.mouse.button==3 ) + GMenuCreatePopupMenu(fv->v,event, fvpopupmenu); + else + fv->pressed = GDrawRequestTimer(fv->v,200,100,NULL); + } + } else if ( fv->drag_and_drop ) { + if ( event->u.mouse.x>=0 && event->u.mouse.y>=-fv->mbh-fv->infoh-4 && + event->u.mouse.x<=fv->width+20 && event->u.mouse.yheight ) { + if ( !fv->has_dd_no_cursor ) { + fv->has_dd_no_cursor = true; + GDrawSetCursor(fv->v,ct_prohibition); + } + } else { + if ( fv->has_dd_no_cursor ) { + fv->has_dd_no_cursor = false; + GDrawSetCursor(fv->v,ct_ddcursor); + } + GDrawPostDragEvent(fv->v,event,event->type==et_mouseup?et_drop:et_drag); + fv->any_dd_events_sent = true; + } + if ( event->type==et_mouseup ) { + fv->drag_and_drop = fv->has_dd_no_cursor = false; + GDrawSetCursor(fv->v,ct_mypointer); + if ( !fv->any_dd_events_sent ) + FVDeselectAll(fv); + fv->any_dd_events_sent = false; + } + } else if ( fv->pressed!=NULL ) { + int showit = pos!=fv->end_pos; + FVReselect(fv,pos); + if ( showit ) + FVShowInfo(fv); + if ( event->type==et_mouseup ) { + GDrawCancelTimer(fv->pressed); + fv->pressed = NULL; + } + } + if ( event->type==et_mouseup && dopopup ) + SCPreparePopup(fv->v,sc); + if ( event->type==et_mouseup ) + SVAttachFV(fv,2); +} + +static void FVResize(FontView *fv,GEvent *event) { + GRect pos,screensize; + int topchar; + + if ( fv->colcnt!=0 ) + topchar = fv->rowoff*fv->colcnt; + else if ( fv->sf->encoding_name>=em_jis208 && fv->sf->encoding_name<=em_gb2312 ) + topchar = 1; + else if ( fv->sf->top_enc!=-1 && fv->sf->top_encsf->charcnt ) + topchar = fv->sf->top_enc; + else { + /* Position on 'A' if it exists */ + topchar = SFFindChar(fv->sf,'A',NULL); + if ( topchar==-1 ) topchar = 0; + } + if ( (event->u.resize.size.width- + GDrawPointsToPixels(fv->gw,_GScrollBar_Width)-1)%fv->cbw!=0 || + (event->u.resize.size.height-fv->mbh-fv->infoh-1)%fv->cbh!=0 ) { + int cc = (event->u.resize.size.width+fv->cbw/2- + GDrawPointsToPixels(fv->gw,_GScrollBar_Width)-1)/fv->cbw; + int rc = (event->u.resize.size.height-fv->mbh-fv->infoh-1)/fv->cbh; + if ( cc<=0 ) cc = 1; + if ( rc<=0 ) rc = 1; + GDrawGetSize(GDrawGetRoot(NULL),&screensize); + if ( cc*fv->cbw+GDrawPointsToPixels(fv->gw,_GScrollBar_Width)+10>screensize.width ) + --cc; + if ( rc*fv->cbh+fv->mbh+fv->infoh+20>screensize.height ) + --rc; + GDrawResize(fv->gw, + cc*fv->cbw+1+GDrawPointsToPixels(fv->gw,_GScrollBar_Width), + rc*fv->cbh+1+fv->mbh+fv->infoh); + /* somehow KDE loses this event of mine so to get even the vague effect */ + /* we can't just return */ +/*return;*/ + } + + pos.width = GDrawPointsToPixels(fv->gw,_GScrollBar_Width); + pos.height = event->u.resize.size.height-fv->mbh-fv->infoh; + pos.x = event->u.resize.size.width-pos.width; pos.y = fv->mbh+fv->infoh; + GGadgetResize(fv->vsb,pos.width,pos.height); + GGadgetMove(fv->vsb,pos.x,pos.y); + pos.width = pos.x; pos.x = 0; + GDrawResize(fv->v,pos.width,pos.height); + + fv->width = pos.width; fv->height = pos.height; + fv->colcnt = (fv->width-1)/fv->cbw; + if ( fv->colcnt<1 ) fv->colcnt = 1; + fv->rowcnt = (fv->height-1)/fv->cbh; + if ( fv->rowcnt<1 ) fv->rowcnt = 1; + fv->rowltot = (fv->sf->charcnt+fv->colcnt-1)/fv->colcnt; + + GScrollBarSetBounds(fv->vsb,0,fv->rowltot,fv->rowcnt); + fv->rowoff = topchar/fv->colcnt; + if ( fv->rowoff>=fv->rowltot-fv->rowcnt ) + fv->rowoff = fv->rowltot-fv->rowcnt-1; + if ( fv->rowoff<0 ) fv->rowoff =0; + GScrollBarSetPos(fv->vsb,fv->rowoff); + GDrawRequestExpose(fv->gw,NULL,true); + GDrawRequestExpose(fv->v,NULL,true); +} + +static void FVTimer(FontView *fv,GEvent *event) { + + if ( event->u.timer.timer==fv->pressed ) { + GEvent e; + GDrawGetPointerPosition(fv->v,&e); + if ( e.u.mouse.y<0 || e.u.mouse.y >= fv->height ) { + real dy = 0; + if ( e.u.mouse.y<0 ) + dy = -1; + else if ( e.u.mouse.y>=fv->height ) + dy = 1; + if ( fv->rowoff+dy<0 ) + dy = 0; + else if ( fv->rowoff+dy+fv->rowcnt > fv->rowltot ) + dy = 0; + fv->rowoff += dy; + if ( dy!=0 ) { + GScrollBarSetPos(fv->vsb,fv->rowoff); + GDrawScroll(fv->v,NULL,0,dy*fv->cbh); + } + } + } else if ( event->u.timer.timer==fv->resize ) { + /* It's a delayed resize event (for kde which sends continuous resizes) */ + fv->resize = NULL; + FVResize(fv,(GEvent *) (event->u.timer.userdata)); + } else if ( event->u.timer.userdata!=NULL ) { + /* It's a delayed function call */ + void (*func)(FontView *) = (void (*)(FontView *)) (event->u.timer.userdata); + func(fv); + } +} + +void FVDelay(FontView *fv,void (*func)(FontView *)) { + GDrawRequestTimer(fv->v,100,0,(void *) func); +} + +static void FVScroll(FontView *fv,struct sbevent *sb) { + int newpos = fv->rowoff; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= fv->rowcnt; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += fv->rowcnt; + break; + case et_sb_bottom: + newpos = fv->rowltot-fv->rowcnt; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>fv->rowltot-fv->rowcnt ) + newpos = fv->rowltot-fv->rowcnt; + if ( newpos<0 ) newpos =0; + if ( newpos!=fv->rowoff ) { + int diff = newpos-fv->rowoff; + fv->rowoff = newpos; + GScrollBarSetPos(fv->vsb,fv->rowoff); + GDrawScroll(fv->v,NULL,0,diff*fv->cbh); + } +} + +static int v_e_h(GWindow gw, GEvent *event) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { +return( GGadgetDispatchEvent(fv->vsb,event)); + } + + switch ( event->type ) { + case et_expose: + GDrawSetLineWidth(gw,0); + FVExpose(fv,gw,event); + break; + case et_char: + FVChar(fv,event); + break; + case et_mousemove: case et_mousedown: case et_mouseup: + if ( event->type==et_mousedown ) + GDrawSetGIC(gw,fv->gic,0,20); + FVMouse(fv,event); + break; + case et_timer: + FVTimer(fv,event); + break; + case et_focus: + if ( event->u.focus.gained_focus ) { + GDrawSetGIC(gw,fv->gic,0,20); +#if 0 + CVPaletteDeactivate(); +#endif + } + break; + } +return( true ); +} + +void FontViewReformatOne(FontView *fv) { + BDFFont *new; + FontView *fvs; + + if ( fv->v==NULL || fv->colcnt==0 ) /* Can happen in scripts */ +return; + + GDrawSetCursor(fv->v,ct_watch); + fv->rowltot = (fv->sf->charcnt+fv->colcnt-1)/fv->colcnt; + GScrollBarSetBounds(fv->vsb,0,fv->rowltot,fv->rowcnt); + if ( fv->rowoff>fv->rowltot-fv->rowcnt ) { + fv->rowoff = fv->rowltot-fv->rowcnt; + if ( fv->rowoff<0 ) fv->rowoff =0; + GScrollBarSetPos(fv->vsb,fv->rowoff); + } + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs!=fv && fvs->sf==fv->sf ) + break; + if ( fvs!=NULL ) + new = fvs->filled; + else + new = SplineFontPieceMeal(fv->sf,fv->filled->pixelsize, + (fv->antialias?pf_antialias:0)|(fv->bbsized?pf_bbsized:0), + NULL); + BDFFontFree(fv->filled); + if ( fv->filled == fv->show ) + fv->show = new; + fv->filled = new; + GDrawRequestExpose(fv->v,NULL,false); + GDrawSetCursor(fv->v,ct_pointer); +} + +void FontViewReformatAll(SplineFont *sf) { + BDFFont *new, *old; + FontView *fvs, *fv; + + if ( sf->fv->v==NULL || sf->fv->colcnt==0 ) /* Can happen in scripts */ +return; + + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + fvs->touched = false; + while ( 1 ) { + for ( fv=sf->fv; fv!=NULL && fv->touched; fv=fv->nextsame ); + if ( fv==NULL ) + break; + old = fv->filled; + /* In CID fonts fv->sf may not be same as sf */ + new = SplineFontPieceMeal(fv->sf,fv->filled->pixelsize, + (fv->antialias?pf_antialias:0)|(fv->bbsized?pf_bbsized:0), + NULL); + for ( fvs=fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->filled == old ) { + fvs->filled = new; + if ( fvs->show == old ) + fvs->show = new; + fvs->touched = true; + } + BDFFontFree(old); + } + for ( fv=sf->fv; fv!=NULL; fv=fv->nextsame ) { + GDrawSetCursor(fv->v,ct_watch); + fv->rowltot = (fv->sf->charcnt+fv->colcnt-1)/fv->colcnt; + GScrollBarSetBounds(fv->vsb,0,fv->rowltot,fv->rowcnt); + if ( fv->rowoff>fv->rowltot-fv->rowcnt ) { + fv->rowoff = fv->rowltot-fv->rowcnt; + if ( fv->rowoff<0 ) fv->rowoff =0; + GScrollBarSetPos(fv->vsb,fv->rowoff); + } + GDrawRequestExpose(fv->v,NULL,false); + GDrawSetCursor(fv->v,ct_pointer); + } +} + +static int fv_e_h(GWindow gw, GEvent *event) { + FontView *fv = (FontView *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { +return( GGadgetDispatchEvent(fv->vsb,event)); + } + + switch ( event->type ) { + case et_selclear: + ClipboardClear(); + break; + case et_expose: + GDrawSetLineWidth(gw,0); + FVDrawInfo(fv,gw,event); + break; + case et_resize: + /* KDE sends a continuous stream of resize events, and gets very */ + /* confused if I start resizing the window myself, try to wait for */ + /* the user to finish before responding to resizes */ + if ( event->u.resize.sized ) { + static GEvent temp; + if ( fv->resize ) + GDrawCancelTimer(fv->resize); + temp = *event; + fv->resize = GDrawRequestTimer(fv->v,300,0,(void *) &temp); + } + break; + case et_char: + FVChar(fv,event); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + FVScroll(fv,&event->u.control.u.sb); + break; + } + break; + case et_close: + FVMenuClose(gw,NULL,NULL); + break; + case et_create: + fv->next = fv_list; + fv_list = fv; + break; + case et_destroy: + if ( fv_list==fv ) + fv_list = fv->next; + else { + FontView *n; + for ( n=fv_list; n->next!=fv; n=n->next ); + n->next = fv->next; + } + if ( fv_list!=NULL ) /* Freeing a large font can take forever, and if we're just going to exit there's no real reason to do so... */ + FontViewFree(fv); + break; + } +return( true ); +} + +static void FontViewOpenKids(FontView *fv) { + int k, i; + SplineFont *sf = fv->sf, *_sf; + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + + k=0; + do { + _sf = sf->subfontcnt==0 ? sf : sf->subfonts[k]; + for ( i=0; i<_sf->charcnt; ++i ) + if ( _sf->chars[i]!=NULL && _sf->chars[i]->wasopen ) { + _sf->chars[i]->wasopen = false; + CharViewCreate(_sf->chars[i],fv); + } + ++k; + } while ( ksubfontcnt ); +} + +FontView *_FontViewCreate(SplineFont *sf) { + FontView *fv = gcalloc(1,sizeof(FontView)); + int i; + int ps = sf->display_size<0 ? -sf->display_size : + sf->display_size==0 ? default_fv_font_size : sf->display_size; + + fv->nextsame = sf->fv; + sf->fv = fv; + if ( sf->mm!=NULL ) { + sf->mm->normal->fv = fv; + for ( i = 0; imm->instance_count; ++i ) + sf->mm->instances[i]->fv = fv; + } + if ( sf->subfontcnt==0 ) + fv->sf = sf; + else { + fv->cidmaster = sf; + for ( i=0; isubfontcnt; ++i ) + sf->subfonts[i]->fv = fv; + fv->sf = sf = sf->subfonts[0]; + } + fv->selected = gcalloc(sf->charcnt,sizeof(char)); + fv->magnify = (ps<=9)? 3 : (ps<20) ? 2 : 1; + fv->cbw = (ps*fv->magnify)+1; + fv->cbh = (ps*fv->magnify)+1+FV_LAB_HEIGHT+1; + fv->antialias = sf->display_antialias; + fv->bbsized = sf->display_bbsized; +return( fv ); +} + +FontView *FontViewCreate(SplineFont *sf) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetData gd; + GGadget *sb; + FontView *fv = _FontViewCreate(sf); + GRect gsize; + FontRequest rq; + /* sadly, clearlyu is too big for the space I've got */ + static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + static unichar_t *fontnames=NULL; + static GWindow icon = NULL; + BDFFont *bdf; + static int nexty=0; + GRect size; + + if ( icon==NULL ) +#ifdef BIGICONS + icon = GDrawCreateBitmap(NULL,fontview_width,fontview_height,fontview_bits); +#else + icon = GDrawCreateBitmap(NULL,fontview2_width,fontview2_height,fontview2_bits); +#endif + + GDrawGetSize(GDrawGetRoot(NULL),&size); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_icon; + wattrs.event_masks = ~(1<desired_col_cnt*fv->cbw+1; + pos.height = sf->desired_row_cnt*fv->cbh+1; + pos.x = size.width-pos.width-30; pos.y = nexty; + nexty += 2*fv->cbh+50; + if ( nexty+pos.height > size.height ) + nexty = 0; + fv->gw = gw = GDrawCreateTopWindow(NULL,&pos,fv_e_h,fv,&wattrs); + FVSetTitle(fv); + + memset(&gd,0,sizeof(gd)); + gd.flags = gg_visible | gg_enabled; + gd.u.menu = mblist; + fv->mb = GMenuBarCreate( gw, &gd, NULL); + GGadgetGetSize(fv->mb,&gsize); + fv->mbh = gsize.height; + fv->infoh = 14/*GDrawPointsToPixels(fv->gw,14)*/; + fv->end_pos = -1; + + gd.pos.y = fv->mbh+fv->infoh; gd.pos.height = pos.height; + gd.pos.width = GDrawPointsToPixels(gw,_GScrollBar_Width); + gd.pos.x = pos.width; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + fv->vsb = sb = GScrollBarCreate(gw,&gd,fv); + + wattrs.mask = wam_events|wam_cursor; + pos.x = 0; pos.y = fv->mbh+fv->infoh; + fv->v = GWidgetCreateSubWindow(gw,&pos,v_e_h,fv,&wattrs); + GDrawSetVisible(fv->v,true); + + fv->gic = GDrawCreateInputContext(fv->v,gic_root|gic_orlesser); + GDrawSetGIC(fv->v,fv->gic,0,20); + + if ( fontnames==NULL ) { + fontnames = uc_copy(GResourceFindString("FontView.FontFamily")); + if ( fontnames==NULL ) + fontnames = monospace; + } + memset(&rq,0,sizeof(rq)); + rq.family_name = fontnames; + rq.point_size = -13; + rq.weight = 400; + fv->header = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + rq.style = fs_italic; + fv->iheader = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawSetFont(fv->v,fv->header); + fv->showhmetrics = default_fv_showhmetrics; + fv->showvmetrics = default_fv_showvmetrics && sf->hasvmetrics; + if ( fv->nextsame!=NULL ) { + fv->filled = fv->nextsame->filled; + bdf = fv->nextsame->show; + } else { + bdf = SplineFontPieceMeal(fv->sf,sf->display_size<0?-sf->display_size:default_fv_font_size, + (fv->antialias?pf_antialias:0)|(fv->bbsized?pf_bbsized:0), + NULL); + fv->filled = bdf; + if ( sf->display_size>0 ) { + for ( bdf=sf->bitmaps; bdf!=NULL && bdf->pixelsize!=sf->display_size ; + bdf=bdf->next ); + if ( bdf==NULL ) + bdf = fv->filled; + } + if ( sf->onlybitmaps && bdf==fv->filled && sf->bitmaps!=NULL ) + bdf = sf->bitmaps; + } + fv->cbw = -1; + FVChangeDisplayFont(fv,bdf); + + /*GWidgetHidePalettes();*/ + GDrawSetVisible(gw,true); + FontViewOpenKids(fv); +return( fv ); +} + +static SplineFont *SFReadPostscript(char *filename) { + FontDict *fd; + SplineFont *sf=NULL; + + GProgressChangeStages(2); + fd = ReadPSFont(filename); + GProgressNextStage(); + GProgressChangeLine2R(_STR_InterpretingGlyphs); + if ( fd!=NULL ) { + sf = SplineFontFromPSFont(fd); + PSFontFree(fd); + if ( sf!=NULL ) + CheckAfmOfPostscript(sf,filename); + } +return( sf ); +} + +/* This does not check currently existing fontviews, and should only be used */ +/* by LoadSplineFont (which does) and by RevertFile (which knows what it's doing) */ +SplineFont *ReadSplineFont(char *filename,enum openflags openflags) { + SplineFont *sf; + unichar_t ubuf[150], *temp; + char buf[1500]; + int fromsfd = false; + static struct { char *ext, *decomp, *recomp; } compressors[] = { + { "gz", "gunzip", "gzip" }, + { "bz2", "bunzip2", "bzip2" }, + { "Z", "gunzip", "compress" }, + NULL + }; + int i; + char *pt, *strippedname, *tmpfile=NULL, *paren=NULL, *fullname=filename; + int len; + FILE *foo; + + if ( filename==NULL ) +return( NULL ); + + strippedname = filename; + pt = strrchr(filename,'/'); + if ( pt==NULL ) pt = filename; + if ( (paren=strchr(pt,'('))!=NULL && strchr(paren,')')!=NULL ) { + strippedname = copy(filename); + strippedname[paren-filename] = '\0'; + } + + pt = strrchr(strippedname,'.'); + i = -1; + if ( pt!=NULL ) for ( i=0; compressors[i].ext!=NULL; ++i ) + if ( strcmp(compressors[i].ext,pt+1)==0 ) + break; + if ( i==-1 || compressors[i].ext==NULL ) i=-1; + else { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf( buf, "%s %s", compressors[i].decomp, strippedname ); +#else + snprintf( buf, sizeof(buf), "%s %s", compressors[i].decomp, strippedname ); +#endif + if ( system(buf)==0 ) { + *pt='\0'; + } else { + /* Assume no write access to file */ + char *dir = getenv("TMPDIR"); + if ( dir==NULL ) dir = P_tmpdir; + tmpfile = galloc(strlen(dir)+strlen(GFileNameTail(strippedname))+2); + strcpy(tmpfile,dir); + strcat(tmpfile,"/"); + strcat(tmpfile,GFileNameTail(strippedname)); + *strrchr(tmpfile,'.') = '\0'; +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf( buf, "%s -c %s > %s", compressors[i].decomp, strippedname, tmpfile ); +#else + snprintf( buf, sizeof(buf), "%s -c %s > %s", compressors[i].decomp, strippedname, tmpfile ); +#endif + if ( system(buf)==0 ) { + if ( strippedname!=filename ) free(strippedname); + strippedname = tmpfile; + } else { + GDrawError("Decompress failed" ); + free(tmpfile); +return( NULL ); + } + } + if ( strippedname!=filename && paren!=NULL ) { + fullname = galloc(strlen(strippedname)+strlen(paren)+1); + strcpy(fullname,strippedname); + strcat(fullname,paren); + } else + fullname = strippedname; + } + + u_strcpy(ubuf,GStringGetResource(_STR_LoadingFontFrom,NULL)); + len = u_strlen(ubuf); + u_strncat(ubuf,temp = def2u_copy(GFileNameTail(fullname)),100); + free(temp); + ubuf[100+len] = '\0'; + /* If there are no pfaedit windows, give them something to look at */ + /* immediately. Otherwise delay a bit */ + GProgressStartIndicator(fv_list==NULL?0:10,GStringGetResource(_STR_Loading,NULL),ubuf,GStringGetResource(_STR_ReadingGlyphs,NULL),0,1); + GProgressEnableStop(0); + if ( fv_list==NULL && screen_display!=NULL ) { GDrawSync(NULL); GDrawProcessPendingEvents(NULL); } + + sf = NULL; + foo = fopen(strippedname,"rb"); + if ( foo!=NULL ) { + /* Try to guess the file type from the first few characters... */ + int ch1 = getc(foo); + int ch2 = getc(foo); + int ch3 = getc(foo); + int ch4 = getc(foo); + int ch5, ch6; + fseek(foo, 98, SEEK_SET); + ch5 = getc(foo); + ch6 = getc(foo); + fclose(foo); + if (( ch1==0 && ch2==1 && ch3==0 && ch4==0 ) || + (ch1=='O' && ch2=='T' && ch3=='T' && ch4=='O') || + (ch1=='t' && ch2=='r' && ch3=='u' && ch4=='e') || + (ch1=='t' && ch2=='t' && ch3=='c' && ch4=='f') ) { + sf = SFReadTTF(fullname,0); + } else if (( ch1=='%' && ch2=='!' ) || + ( ch1==0x80 && ch2=='\01' ) ) { /* PFB header */ + sf = SFReadPostscript(fullname); + } else if ( ch1==1 && ch2==0 && ch3==4 ) { + sf = CFFParse(fullname); + } else if ( ch1=='<' && ch2=='?' && (ch3=='x'||ch3=='X') && (ch4=='m'||ch4=='M') ) { + sf = SFReadSVG(fullname,0); +#if 0 /* I'm not sure if this is a good test for mf files... */ + } else if ( ch1=='%' && ch2==' ' ) { + sf = SFFromMF(fullname); +#endif + } else if ( ch1=='S' && ch2=='p' && ch3=='l' && ch4=='i' ) { + sf = SFDRead(fullname); + fromsfd = true; + } else if ( ch1=='S' && ch2=='T' && ch3=='A' && ch4=='R' ) { + sf = SFFromBDF(fullname,0,false); + } else if ( ch1=='\1' && ch2=='f' && ch3=='c' && ch4=='p' ) { + sf = SFFromBDF(fullname,2,false); + } else if ( ch5=='I' && ch6=='K' && ch3==0 && ch4==55 ) { + /* Ikarus font type appears at word 50 (byte offset 98) */ + /* Ikarus name section length (at word 2, byte offset 2) was 55 in the 80s at URW */ + sf = SFReadIkarus(fullname); + } /* Too hard to figure out a valid mark for a mac resource file */ + } + if ( sf!=NULL ) + /* good */; + else if ( strmatch(fullname+strlen(fullname)-4, ".sfd")==0 || + strmatch(fullname+strlen(fullname)-5, ".sfd~")==0 ) { + sf = SFDRead(fullname); + fromsfd = true; + } else if ( strmatch(fullname+strlen(fullname)-4, ".ttf")==0 || + strmatch(fullname+strlen(strippedname)-4, ".ttc")==0 || + strmatch(fullname+strlen(fullname)-4, ".otf")==0 || + strmatch(fullname+strlen(fullname)-4, ".otb")==0 ) { + sf = SFReadTTF(fullname,0); + } else if ( strmatch(fullname+strlen(fullname)-4, ".svg")==0 ) { + sf = SFReadSVG(fullname,0); + } else if ( strmatch(fullname+strlen(fullname)-4, ".bdf")==0 ) { + sf = SFFromBDF(fullname,0,false); + } else if ( strmatch(fullname+strlen(fullname)-2, "pk")==0 ) { + sf = SFFromBDF(fullname,1,true); + } else if ( strmatch(fullname+strlen(fullname)-2, "gf")==0 ) { + sf = SFFromBDF(fullname,3,true); + } else if ( strmatch(fullname+strlen(fullname)-4, ".pcf")==0 ) { + sf = SFFromBDF(fullname,2,false); + } else if ( strmatch(fullname+strlen(strippedname)-4, ".bin")==0 || + strmatch(fullname+strlen(strippedname)-4, ".hqx")==0 || + strmatch(fullname+strlen(strippedname)-6, ".dfont")==0 ) { + sf = SFReadMacBinary(fullname,0); + } else if ( strmatch(fullname+strlen(strippedname)-4, ".fon")==0 || + strmatch(fullname+strlen(strippedname)-4, ".fnt")==0 ) { + sf = SFReadWinFON(fullname,0); + } else if ( strmatch(fullname+strlen(fullname)-4, ".pfa")==0 || + strmatch(fullname+strlen(fullname)-4, ".pfb")==0 || + strmatch(fullname+strlen(fullname)-4, ".pf3")==0 || + strmatch(fullname+strlen(fullname)-4, ".cid")==0 || + strmatch(fullname+strlen(fullname)-4, ".gsf")==0 || + strmatch(fullname+strlen(fullname)-4, ".pt3")==0 || + strmatch(fullname+strlen(fullname)-3, ".ps")==0 ) { + sf = SFReadPostscript(fullname); + } else if ( strmatch(fullname+strlen(fullname)-4, ".cff")==0 ) { + sf = CFFParse(fullname); + } else if ( strmatch(fullname+strlen(fullname)-3, ".mf")==0 ) { + sf = SFFromMF(fullname); + } else if ( strmatch(fullname+strlen(fullname)-3, ".ik")==0 ) { + sf = SFReadIkarus(fullname); + } else { + sf = SFReadMacBinary(fullname,0); + } + if ( strippedname!=filename && strippedname!=tmpfile ) + free(strippedname); + if ( fullname!=filename && fullname!=strippedname ) + free(fullname); + GProgressEndIndicator(); + + if ( sf!=NULL ) { + SplineFont *norm = sf->mm!=NULL ? sf->mm->normal : sf; + if ( sf->chosenname!=NULL && strippedname==filename ) { + norm->origname = galloc(strlen(filename)+strlen(sf->chosenname)+8); + strcpy(norm->origname,filename); + strcat(norm->origname,"("); + strcat(norm->origname,sf->chosenname); + strcat(norm->origname,")"); + } else + norm->origname = copy(filename); + free( sf->chosenname ); sf->chosenname = NULL; + if ( sf->mm!=NULL ) { + int j; + for ( j=0; jmm->instance_count; ++j ) { + free(sf->mm->instances[j]->origname); + sf->mm->instances[j]->origname = copy(norm->origname); + } + } + } else if ( !GFileExists(filename) ) + GWidgetErrorR(_STR_CouldntOpenFontTitle,_STR_NoSuchFontFile,GFileNameTail(filename)); + else if ( !GFileReadable(filename) ) + GWidgetErrorR(_STR_CouldntOpenFontTitle,_STR_FontFileNotReadable,GFileNameTail(filename)); + else + GWidgetErrorR(_STR_CouldntOpenFontTitle,_STR_CouldntParseFont,GFileNameTail(filename)); + + if ( tmpfile!=NULL ) { + unlink(tmpfile); + free(tmpfile); + } else if ( i!=-1 ) { +#if defined( _NO_SNPRINTF ) || defined( __VMS ) + sprintf( buf, "%s %s", compressors[i].recomp, filename ); +#else + snprintf( buf, sizeof(buf), "%s %s", compressors[i].recomp, filename ); +#endif + system(buf); + } + if ( (openflags&of_fstypepermitted) && sf!=NULL && (sf->pfminfo.fstype&0xff)==0x0002 ) { + /* Ok, they have told us from a script they have access to the font */ + } else if ( !fromsfd && sf!=NULL && (sf->pfminfo.fstype&0xff)==0x0002 ) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; + if ( GWidgetAskR(_STR_RestrictedFont,buts,1,1,_STR_RestrictedRightsFont)==1 ) { + SplineFontFree(sf); +return( NULL ); + } + } +return( sf ); +} + +static SplineFont *AbsoluteNameCheck(char *filename) { + char buffer[1025]; + FontView *fv; + + GFileGetAbsoluteName(filename,buffer,sizeof(buffer)); + for ( fv=fv_list; fv!=NULL ; fv=fv->next ) { + if ( fv->sf->filename!=NULL && strcmp(fv->sf->filename,filename)==0 ) +return( fv->sf ); + else if ( fv->sf->origname!=NULL && strcmp(fv->sf->origname,filename)==0 ) +return( fv->sf ); + } +return( NULL ); +} + +static char *ToAbsolute(char *filename) { + char buffer[1025]; + + GFileGetAbsoluteName(filename,buffer,sizeof(buffer)); +return( copy(buffer)); +} + +SplineFont *LoadSplineFont(char *filename,enum openflags openflags) { + FontView *fv; + SplineFont *sf; + char *pt, *ept, *tobefreed1=NULL, *tobefreed2=NULL; + static char *extens[] = { ".sfd", ".pfa", ".pfb", ".ttf", ".otf", ".ps", ".cid", ".bin", ".dfont", ".PFA", ".PFB", ".TTF", ".OTF", ".PS", ".CID", ".BIN", ".DFONT", NULL }; + int i; + + if ( filename==NULL ) +return( NULL ); + + if (( pt = strrchr(filename,'/'))==NULL ) pt = filename; + if ( strchr(pt,'.')==NULL ) { + /* They didn't give an extension. If there's a file with no extension */ + /* see if it's a valid font file (and if so use the extensionless */ + /* filename), otherwise guess at an extension */ + /* For some reason Adobe distributes CID keyed fonts (both OTF and */ + /* postscript) as extensionless files */ + int ok = false; + FILE *test = fopen(filename,"rb"); + if ( test!=NULL ) { +#if 0 + int ch1 = getc(test); + int ch2 = getc(test); + int ch3 = getc(test); + int ch4 = getc(test); + if ( ch1=='%' ) ok = true; + else if (( ch1==0 && ch2==1 && ch3==0 && ch4==0 ) || + (ch1=='O' && ch2=='T' && ch3=='T' && ch4=='O') || + (ch1=='t' && ch2=='r' && ch3=='u' && ch4=='e') || + (ch1=='t' && ch2=='t' && ch3=='c' && ch4=='f') ) ok = true; + else if ( ch1=='S' && ch2=='p' && ch3=='l' && ch4=='i' ) ok = true; +#endif + ok = true; /* Mac resource files are too hard to check for */ + /* If file exists, assume good */ + fclose(test); + } + if ( !ok ) { + tobefreed1 = galloc(strlen(filename)+8); + strcpy(tobefreed1,filename); + ept = tobefreed1+strlen(tobefreed1); + for ( i=0; extens[i]!=NULL; ++i ) { + strcpy(ept,extens[i]); + if ( GFileExists(tobefreed1)) + break; + } + if ( extens[i]!=NULL ) + filename = tobefreed1; + else { + free(tobefreed1); + tobefreed1 = NULL; + } + } + } else + tobefreed1 = NULL; + + sf = NULL; + /* Only one view per font */ + for ( fv=fv_list; fv!=NULL && sf==NULL; fv=fv->next ) { + if ( fv->sf->filename!=NULL && strcmp(fv->sf->filename,filename)==0 ) + sf = fv->sf; + else if ( fv->sf->origname!=NULL && strcmp(fv->sf->origname,filename)==0 ) + sf = fv->sf; + } + if ( sf==NULL && *filename!='/' ) + sf = AbsoluteNameCheck(filename); + if ( sf==NULL && *filename!='/' ) + filename = tobefreed2 = ToAbsolute(filename); + + if ( sf==NULL ) + sf = ReadSplineFont(filename,openflags); + + free(tobefreed1); + free(tobefreed2); +return( sf ); +} + +FontView *ViewPostscriptFont(char *filename) { + SplineFont *sf = LoadSplineFont(filename,0); + if ( sf==NULL ) +return( NULL ); +#if 0 + if ( sf->fv!=NULL ) { + GDrawSetVisible(sf->fv->gw,true); + GDrawRaise(sf->fv->gw); +return( sf->fv ); + } +#endif +return( FontViewCreate(sf)); /* Always make a new view now */ +} + +FontView *FontNew(void) { +return( FontViewCreate(SplineFontNew())); +} + +void FontViewFree(FontView *fv) { + int i; + FontView *prev; + FontView *fvs; + + if ( fv->sf == NULL ) /* Happens when usurping a font to put it into an MM */ + BDFFontFree(fv->filled); + else if ( fv->nextsame==NULL && fv->sf->fv==fv ) { + SplineFontFree(fv->cidmaster?fv->cidmaster:fv->sf); + BDFFontFree(fv->filled); + } else { + for ( fvs=fv->sf->fv, i=0 ; fvs!=NULL; fvs = fvs->nextsame ) + if ( fvs->filled==fv->filled ) ++i; + if ( i==1 ) + BDFFontFree(fv->filled); + if ( fv->sf->fv==fv ) { + if ( fv->cidmaster==NULL ) + fv->sf->fv = fv->nextsame; + else { + fv->cidmaster->fv = fv->nextsame; + for ( i=0; icidmaster->subfontcnt; ++i ) + fv->cidmaster->subfonts[i]->fv = fv->nextsame; + } + } else { + for ( prev = fv->sf->fv; prev->nextsame!=fv; prev=prev->nextsame ); + prev->nextsame = fv->nextsame; + } + } + DictionaryFree(fv->fontvars); + free(fv->fontvars); + free(fv->selected); + free(fv); +} + +void FVFakeMenus(FontView *fv,int cmd) { + switch ( cmd ) { + case 0: /* Cut */ + FVCopy(fv,true); + FVClear(fv); + break; + case 1: + FVCopy(fv,true); + break; + case 2: /* Copy reference */ + FVCopy(fv,false); + break; + case 3: + FVCopyWidth(fv,ut_width); + break; + case 4: + PasteIntoFV(fv,true); + break; + case 5: + FVClear(fv); + break; + case 6: + FVClearBackground(fv); + break; + case 7: + FVCopyFgtoBg(fv); + break; + case 8: + FVUnlinkRef(fv); + break; + case 9: + PasteIntoFV(fv,false); + break; + case 10: + FVCopyWidth(fv,ut_vwidth); + break; + case 11: + FVCopyWidth(fv,ut_lbearing); + break; + case 12: + FVCopyWidth(fv,ut_rbearing); + break; + case 13: + FVJoin(fv); + break; + case 14: + FVSameGlyphAs(fv); + break; + + case 100: + FVOverlap(fv,over_remove); + break; + case 101: + FVSimplify(fv,false); + break; + case 102: + FVAddExtrema(fv); + break; + case 103: + FVRound2Int(fv); + break; + case 104: + FVOverlap(fv,over_intersect); + break; + case 105: + FVOverlap(fv,over_findinter); + break; + + case 200: + FVAutoHint(fv,true); + break; + case 201: + FVClearHints(fv); + break; + case 202: + FVAutoInstr(fv); + break; + case 203: + FVAutoHintSubs(fv); + break; + case 204: + FVAutoCounter(fv); + break; + case 205: + FVDontAutoHint(fv); + break; + } +} + +int FVWinInfo(FontView *fv, int *cc, int *rc) { + if ( fv==NULL || fv->colcnt==0 || fv->rowcnt==0 ) { + *cc = 16; *rc = 4; +return( -1 ); + } + + *cc = fv->colcnt; + *rc = fv->rowcnt; + +return( fv->rowoff*fv->colcnt ); +} diff --git a/fontforge/freetype.c b/fontforge/freetype.c new file mode 100644 index 00000000..9f57f0e7 --- /dev/null +++ b/fontforge/freetype.c @@ -0,0 +1,1090 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +#if _NO_FREETYPE || _NO_MMAP +int hasFreeType(void) { +return( false ); +} + +int hasFreeTypeDebugger(void) { +return( false ); +} + +int hasFreeTypeByteCode(void) { +return( false ); +} + +void *_FreeTypeFontContext(SplineFont *sf,SplineChar *sc,FontView *fv, + enum fontformat ff,int flags, void *share) { +return( NULL ); +} + +BDFFont *SplineFontFreeTypeRasterize(void *freetypecontext,int pixelsize,int depth) { +return( NULL ); +} + +BDFChar *SplineCharFreeTypeRasterize(void *freetypecontext,int enc,int pixelsize,int depth) { +return( NULL ); +} + +void FreeTypeFreeContext(void *freetypecontext) { +} + +struct freetype_raster *FreeType_GetRaster(void *single_glyph_context, + int enc, real ptsize, int dpi) { +return( NULL ); +} + +SplineSet *FreeType_GridFitChar(void *single_glyph_context, + int enc, real ptsize, int dpi, int16 *width, SplineSet *splines) { +return( NULL ); +} +#else +#include +#include FT_FREETYPE_H +#include +#include + +static FT_Library context; + +/* Ok, this complication is here because: */ +/* 1) I want to be able to deal with static libraries on some systems */ +/* 2) If I've got a dynamic library and I compile up an executable */ +/* I want it to run on systems without freetype */ +/* So one case boils down to linking against the standard names, while the */ +/* other does the link at run time if it's possible */ + +# if defined(_STATIC_LIBFREETYPE) || defined(NODYNAMIC) + +#define _FT_Init_FreeType FT_Init_FreeType +#define _FT_New_Memory_Face FT_New_Memory_Face +#define _FT_Set_Pixel_Sizes FT_Set_Pixel_Sizes +#define _FT_Set_Char_Size FT_Set_Char_Size +#define _FT_Done_Face FT_Done_Face +#define _FT_Load_Glyph FT_Load_Glyph +#define _FT_Render_Glyph FT_Render_Glyph +#define _FT_Outline_Decompose FT_Outline_Decompose + +# if FREETYPE_HAS_DEBUGGER +# include "ttobjs.h" +# include "ttdriver.h" +# include "ttinterp.h" + +# define _FT_Set_Debug_Hook FT_Set_Debug_Hook +# define _TT_RunIns TT_RunIns +# define _FT_Done_FreeType FT_Done_FreeType +# endif + +static int freetype_init_base() { +return( true ); +} +# else +# include +# include +# include + +static DL_CONST void *libfreetype; +static FT_Error (*_FT_Init_FreeType)( FT_Library * ); +static FT_Error (*_FT_New_Memory_Face)( FT_Library, const FT_Byte *, int, int, FT_Face * ); +static FT_Error (*_FT_Done_Face)( FT_Face ); +static FT_Error (*_FT_Set_Pixel_Sizes)( FT_Face, int, int); +static FT_Error (*_FT_Set_Char_Size)( FT_Face, int wid/*=0*/, int height/* =ptsize*64*/, int hdpi, int vdpi); +static FT_Error (*_FT_Load_Glyph)( FT_Face, int, int); +static FT_Error (*_FT_Render_Glyph)( FT_GlyphSlot, int); +static FT_Error (*_FT_Outline_Decompose)(FT_Outline *, const FT_Outline_Funcs *,void *); + +# if FREETYPE_HAS_DEBUGGER +# include "ttobjs.h" +# include "ttdriver.h" +# include "ttinterp.h" + +static void (*_FT_Set_Debug_Hook)(FT_Library, FT_UInt, FT_DebugHook_Func); +static FT_Error (*_TT_RunIns)( TT_ExecContext ); +static FT_Error (*_FT_Done_FreeType)( FT_Library ); +# endif + +static int freetype_init_base() { + libfreetype = dlopen("libfreetype" SO_EXT,RTLD_LAZY); + if ( libfreetype==NULL ) +return( false ); + + _FT_Init_FreeType = (FT_Error (*)(FT_Library *)) dlsym(libfreetype,"FT_Init_FreeType"); + _FT_New_Memory_Face = (FT_Error (*)(FT_Library, const FT_Byte *, int, int, FT_Face * )) dlsym(libfreetype,"FT_New_Memory_Face"); + _FT_Set_Pixel_Sizes = (FT_Error (*)(FT_Face, int, int)) dlsym(libfreetype,"FT_Set_Pixel_Sizes"); + _FT_Set_Char_Size = (FT_Error (*)(FT_Face, int, int, int, int)) dlsym(libfreetype,"FT_Set_Char_Size"); + _FT_Done_Face = (FT_Error (*)(FT_Face)) dlsym(libfreetype,"FT_Done_Face"); + _FT_Load_Glyph = (FT_Error (*)(FT_Face, int, int)) dlsym(libfreetype,"FT_Load_Glyph"); + _FT_Render_Glyph = (FT_Error (*)(FT_GlyphSlot, int)) dlsym(libfreetype,"FT_Render_Glyph"); + _FT_Outline_Decompose = (FT_Error (*)(FT_Outline *, const FT_Outline_Funcs *,void *)) dlsym(libfreetype,"FT_Outline_Decompose"); +#if FREETYPE_HAS_DEBUGGER + _FT_Set_Debug_Hook = (void (*)(FT_Library, FT_UInt, FT_DebugHook_Func)) dlsym(libfreetype,"FT_Set_Debug_Hook"); + _TT_RunIns = (FT_Error (*)(TT_ExecContext)) dlsym(libfreetype,"TT_RunIns"); + _FT_Done_FreeType = (FT_Error (*)(FT_Library )) dlsym(libfreetype,"FT_Done_FreeType"); +#endif +return( true ); +} +# endif + +int hasFreeType(void) { + int done=false; + int ok=false; + + if ( done ) +return(ok); + done = true; + + if ( !freetype_init_base()) +return( false ); + if ( _FT_Init_FreeType( &context )) +return( false ); + + ok = true; +return( true ); +} + +int hasFreeTypeDebugger(void) { + if ( !hasFreeType()) +return( false ); +#if FREETYPE_HAS_DEBUGGER + if ( _FT_Set_Debug_Hook!=NULL && _TT_RunIns!=NULL ) +return( true ); +#endif + +return( false ); +} + +int hasFreeTypeByteCode(void) { + if ( !hasFreeType()) +return( false ); +#if defined(_STATIC_LIBFREETYPE) || defined(NODYNAMIC) + /* In a static library, we can assume our headers are accurate */ +# ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +return( true ); +# else +return( false ); +# endif +#elif FREETYPE_HAS_DEBUGGER + /* Have we already checked for these data? */ + if ( _FT_Set_Debug_Hook!=NULL && _TT_RunIns!=NULL ) +return( true ); + else +return( false ); +#else + { + static int found = -1; + if ( found==-1 ) + found = dlsym(libfreetype,"TT_RunIns")!=NULL; +return( found ); + } +#endif +} + +typedef struct freetypecontext { + SplineFont *sf; + FILE *file; + void *mappedfile; + long len; + int *glyph_indeces; + FT_Face face; + struct freetypecontext *shared_ftc; /* file, mappedfile, glyph_indeces are shared with this ftc */ + /* We have a new face, but that's it. This is so we can */ + /* have multiple pointsizes without loading the font many */ + /* times */ + int isttf; + int em; +} FTC; + +static void TransitiveClosureAdd(SplineChar **new,SplineChar **old,SplineChar *sc) { + RefChar *ref; + + if ( new[sc->enc]!=NULL ) /* already done */ +return; + new[sc->enc] = sc; + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref = ref->next ) + TransitiveClosureAdd(new,old,ref->sc); +} + +static void AddIf(SplineFont *sf,SplineChar **new,SplineChar **old,int unienc) { + SplineChar *sc; + + sc = SFGetChar(sf,unienc,NULL); + if ( sc!=NULL && SCWorthOutputting(sc)) + TransitiveClosureAdd(new,old,sc); +} + +void FreeTypeFreeContext(void *freetypecontext) { + FTC *ftc = freetypecontext; + + if ( ftc==NULL ) +return; + + if ( ftc->face!=NULL ) + _FT_Done_Face(ftc->face); + if ( ftc->shared_ftc ) +return; + if ( ftc->mappedfile ) + munmap(ftc->mappedfile,ftc->len); + if ( ftc->file!=NULL ) + fclose(ftc->file); + free(ftc->glyph_indeces); + free(ftc); +} + +static void *__FreeTypeFontContext(FT_Library context, + SplineFont *sf,SplineChar *sc,FontView *fv, + enum fontformat ff,int flags,void *shared_ftc) { + /* build up a temporary font consisting of: + * sc!=NULL => Just that character (and its references) + * fv!=NULL => selected characters + * else => the entire font + */ + FTC *ftc; + SplineChar **old, **new; + uint8 *selected = fv!=NULL ? fv->selected : NULL; + int i,cnt; + + if ( !hasFreeType()) +return( NULL ); + + ftc = gcalloc(1,sizeof(FTC)); + if ( shared_ftc!=NULL ) { + *ftc = *(FTC *) shared_ftc; + ftc->face = NULL; + ftc->shared_ftc = shared_ftc; + ftc->em = ((FTC *) shared_ftc)->em; + } else { + ftc->sf = sf; + ftc->em = sf->ascent+sf->descent; + ftc->file = NULL; + + ftc->file = tmpfile(); + if ( ftc->file==NULL ) { + free(ftc); +return( NULL ); + } + + old = sf->chars; + if ( sc!=NULL || selected!=NULL ) { + /* Build up a font consisting of those characters we actually use */ + new = gcalloc(sf->charcnt,sizeof(SplineChar *)); + if ( sc!=NULL ) + TransitiveClosureAdd(new,old,sc); + else for ( i=0; icharcnt; ++i ) + if ( selected[i] && SCWorthOutputting(old[i])) + TransitiveClosureAdd(new,old,old[i]); + /* Add these guys so we'll get reasonable blue values */ + /* we won't rasterize them */ + if ( PSDictHasEntry(sf->private,"BlueValues")==NULL ) { + AddIf(sf,new,old,'I'); + AddIf(sf,new,old,'O'); + AddIf(sf,new,old,'x'); + AddIf(sf,new,old,'o'); + } + AddIf(sf,new,old,0); /* If there's a .notdef use it so that we don't generate our own .notdef (which can add cvt entries) */ + sf->chars = new; + } + switch ( ff ) { + case ff_pfb: case ff_pfa: + if ( !_WritePSFont(ftc->file,sf,ff,0)) + goto fail; + break; + case ff_ttf: case ff_ttfsym: + ftc->isttf = true; + /* Fall through.... */ + case ff_otf: case ff_otfcid: + if ( !_WriteTTFFont(ftc->file,sf,ff,NULL,bf_none,flags)) + goto fail; + break; + default: + goto fail; + } + + if ( sf->subfontcnt!=0 ) { + /* can only be an otfcid */ + int k, max=0; + for ( k=0; ksubfontcnt; ++k ) + if ( sf->subfonts[k]->charcnt>max ) + max = sf->subfonts[k]->charcnt; + ftc->glyph_indeces = galloc(max*sizeof(int)); + memset(ftc->glyph_indeces,-1,max*sizeof(int)); + for ( i=0; isubfontcnt; ++k ) { + if ( SCWorthOutputting(sf->subfonts[k]->chars[i]) ) { + ftc->glyph_indeces[i] = sf->subfonts[k]->chars[i]->ttf_glyph; + break; + } + } + } + } else { + ftc->glyph_indeces = galloc(sf->charcnt*sizeof(int)); + memset(ftc->glyph_indeces,-1,sf->charcnt*sizeof(int)); + cnt = 1; i = 0; + if ( SCIsNotdef(sf->chars[0], -1)) { + ftc->glyph_indeces[0] = 0; + i = 1; + } + for ( ; icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) && SCDuplicate(sf->chars[i])==sf->chars[i] ) { + if ( ff==ff_pfa || ff==ff_pfb ) + ftc->glyph_indeces[i] = cnt++; + else + ftc->glyph_indeces[i] = sf->chars[i]->ttf_glyph; + } + } + for ( i=1 ; icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) && SCDuplicate(sf->chars[i])!=sf->chars[i] ) { + SplineChar *sc = SCDuplicate(sf->chars[i]); + ftc->glyph_indeces[i] = ftc->glyph_indeces[sc->enc]; + } + } + } + + fseek(ftc->file,0,SEEK_END); + ftc->len = ftell(ftc->file); + ftc->mappedfile = mmap(NULL,ftc->len,PROT_READ,MAP_PRIVATE,fileno(ftc->file),0); + if ( ftc->mappedfile==MAP_FAILED ) + goto fail; + if ( sf->chars!=old ) { + free(sf->chars); + sf->chars = old; + } + } + + if ( _FT_New_Memory_Face(context,ftc->mappedfile,ftc->len,0,&ftc->face)) + goto fail; + +return( ftc ); + + fail: + FreeTypeFreeContext(ftc); + if ( sf->chars!=old ) { + free(sf->chars); + sf->chars = old; + } +return( NULL ); +} + +void *_FreeTypeFontContext(SplineFont *sf,SplineChar *sc,FontView *fv, + enum fontformat ff,int flags,void *shared_ftc) { +return( __FreeTypeFontContext(context,sf,sc,fv, + ff,flags,shared_ftc)); +} + +static void BCTruncateToDepth(BDFChar *bdfc,int depth) { + int div = 255/((1<ymax-bdfc->ymin; ++i ) { + for ( j=0; jbytes_per_line; ++j ) + bdfc->bitmap[i*bdfc->bytes_per_line+j] = + (bdfc->bitmap[i*bdfc->bytes_per_line+j]+div/2) / div; + } +} + +BDFChar *SplineCharFreeTypeRasterize(void *freetypecontext,int enc, + int pixelsize,int depth) { + FTC *ftc = freetypecontext; + BDFChar *bdfc; + SplineChar *sc; + FT_GlyphSlot slot; + + if ( ftc->glyph_indeces[enc]==-1 ) + goto fail; + if ( _FT_Set_Pixel_Sizes(ftc->face,0,pixelsize)) + goto fail; + if ( _FT_Load_Glyph(ftc->face,ftc->glyph_indeces[enc], + depth==1?(FT_LOAD_RENDER|FT_LOAD_MONOCHROME):FT_LOAD_RENDER)) + goto fail; + + slot = ftc->face->glyph; + sc = ftc->sf->chars[enc]; + bdfc = chunkalloc(sizeof(BDFChar)); + bdfc->sc = sc; + bdfc->ymax = slot->bitmap_top-1; + bdfc->ymin = slot->bitmap_top-slot->bitmap.rows; + if ( slot->bitmap.rows==0 ) + bdfc->ymax = bdfc->ymin; + bdfc->xmin = slot->bitmap_left; + bdfc->xmax = slot->bitmap_left+slot->bitmap.width-1; + if ( slot->bitmap.width==0 ) + bdfc->xmax = bdfc->xmin; + bdfc->byte_data = (depth!=1); + bdfc->depth = depth; + if ( sc!=NULL ) { + bdfc->width = rint(sc->width*pixelsize / (real) (sc->parent->ascent+sc->parent->descent)); + bdfc->enc = enc; + } + bdfc->bytes_per_line = slot->bitmap.pitch; + if ( bdfc->bytes_per_line==0 ) bdfc->bytes_per_line = 1; + bdfc->bitmap = galloc((bdfc->ymax-bdfc->ymin+1)*bdfc->bytes_per_line); + if ( slot->bitmap.rows==0 || slot->bitmap.width==0 ) + memset(bdfc->bitmap,0,(bdfc->ymax-bdfc->ymin+1)*bdfc->bytes_per_line); + else + memcpy(bdfc->bitmap,slot->bitmap.buffer,slot->bitmap.rows*bdfc->bytes_per_line); + BCCompressBitmap(bdfc); + if ( depth!=1 && depth!=8 ) + BCTruncateToDepth(bdfc,depth); +return( bdfc ); + + fail: +return( SplineCharRasterize(ftc->sf->chars[enc],pixelsize) ); +} + +BDFFont *SplineFontFreeTypeRasterize(void *freetypecontext,int pixelsize,int depth) { + FTC *ftc = freetypecontext, *subftc=NULL; + SplineFont *sf = ftc->sf, *subsf; + int i,k; + BDFFont *bdf = SplineFontToBDFHeader(sf,pixelsize,true); + + if ( depth!=1 ) + BDFClut(bdf, 1<<(depth/2) ); + + k=0; + do { + if ( sf->subfontcnt==0 ) { + subsf = sf; + subftc = ftc; + } else { + subsf = sf->subfonts[k]; + subftc = FreeTypeFontContext(subsf,NULL,NULL); + } + for ( i=0; icharcnt; ++i ) + if ( SCWorthOutputting(subsf->chars[i] ) ) { + /* If we could not allocate an ftc for this subfont, the revert to*/ + /* our own rasterizer */ + if ( subftc!=NULL ) + bdf->chars[i] = SplineCharFreeTypeRasterize(subftc,i,pixelsize,depth); + else if ( depth==1 ) + bdf->chars[i] = SplineCharRasterize(subsf->chars[i],pixelsize); + else + bdf->chars[i] = SplineCharAntiAlias(subsf->chars[i],pixelsize,(1<<(depth/2))); + GProgressNext(); + } else + bdf->chars[i] = NULL; + if ( subftc!=NULL && subftc!=ftc ) + FreeTypeFreeContext(subftc); + subftc = NULL; + ++k; + } while ( ksubfontcnt ); + GProgressEndIndicator(); +return( bdf ); +} + +/* ************************************************************************** */ +struct ft_context { + SplinePointList *hcpl, *lcpl, *cpl; + SplinePoint *last; + double scale; + SplinePointList *orig_cpl; + SplinePoint *orig_sp; + int order2; +}; + +static void FT_ClosePath(struct ft_context *context) { + if ( context->cpl!=NULL ) { + if ( context->cpl->first->me.x != context->last->me.x || + context->cpl->first->me.y != context->last->me.y ) + SplineMake(context->last,context->cpl->first,context->order2); + else { + context->cpl->first->prevcp = context->last->prevcp; + context->last->prev->to = context->cpl->first; + context->cpl->first->prev = context->last->prev; + SplinePointFree(context->last); + } + context->cpl->last = context->cpl->first; + context->last = NULL; + if ( context->orig_cpl!=NULL ) + context->orig_cpl = context->orig_cpl->next; + context->orig_sp = NULL; + } +} + +static int FT_MoveTo(FT_Vector *to,void *user) { + struct ft_context *context = user; + + FT_ClosePath(context); + + context->cpl = chunkalloc(sizeof(SplinePointList)); + if ( context->lcpl==NULL ) + context->hcpl = context->cpl; + else + context->lcpl->next = context->cpl; + context->lcpl = context->cpl; + + if ( context->orig_cpl!=NULL ) + context->orig_sp = context->orig_cpl->first; + + context->last = context->cpl->first = chunkalloc(sizeof(SplinePoint)); + context->last->me.x = to->x*context->scale; + context->last->me.y = to->y*context->scale; + context->last->ttfindex = context->orig_sp?context->orig_sp->ttfindex: -2; +return( 0 ); +} + +static int FT_LineTo(FT_Vector *to,void *user) { + struct ft_context *context = user; + SplinePoint *sp; + + sp = SplinePointCreate( to->x*context->scale, to->y*context->scale ); + sp->ttfindex = -1; + SplineMake(context->last,sp,context->order2); + context->last = sp; + + if ( context->orig_sp!=NULL && context->orig_sp->next!=NULL ) { + context->orig_sp = context->orig_sp->next->to; + if ( context->orig_sp!=NULL ) + sp->ttfindex = context->orig_sp->ttfindex; + } +return( 0 ); +} + +static int FT_ConicTo(FT_Vector *_cp, FT_Vector *to,void *user) { + struct ft_context *context = user; + SplinePoint *sp; + + sp = SplinePointCreate( to->x*context->scale, to->y*context->scale ); + sp->noprevcp = false; + sp->prevcp.x = _cp->x*context->scale; + sp->prevcp.y = _cp->y*context->scale; + context->last->nextcp = sp->prevcp; + SplineMake2(context->last,sp); + context->last = sp; + + if ( context->orig_sp!=NULL ) { + context->orig_sp = context->orig_sp->next->to; + if ( context->orig_sp!=NULL ) + sp->ttfindex = context->orig_sp->ttfindex; + } +return( 0 ); +} + +static int FT_CubicTo(FT_Vector *cp1, FT_Vector *cp2,FT_Vector *to,void *user) { + struct ft_context *context = user; + SplinePoint *sp; + + sp = SplinePointCreate( to->x*context->scale, to->y*context->scale ); + sp->noprevcp = false; + sp->prevcp.x = cp2->x*context->scale; + sp->prevcp.y = cp2->y*context->scale; + context->last->nextcp.x = cp1->x*context->scale; + context->last->nextcp.y = cp1->y*context->scale; + SplineMake3(context->last,sp); + context->last = sp; + + if ( context->orig_sp!=NULL ) { + context->orig_sp = context->orig_sp->next->to; + if ( context->orig_sp!=NULL ) + sp->ttfindex = context->orig_sp->ttfindex; + } +return( 0 ); +} + +static FT_Outline_Funcs outlinefuncs = { + FT_MoveTo, + FT_LineTo, + FT_ConicTo, + FT_CubicTo, + 0,0 /* I don't understand shift and delta */ +}; + +SplineSet *FreeType_GridFitChar(void *single_glyph_context, + int enc, real ptsize, int dpi, int16 *width, SplineSet *splines) { + FT_GlyphSlot slot; + FTC *ftc = (FTC *) single_glyph_context; + struct ft_context outline_context; + static int bc_checked = false; + + if ( ftc->face==(void *) -1 ) +return( NULL ); + + if ( !bc_checked && ftc->isttf ) { + bc_checked = true; + if ( !hasFreeTypeByteCode()) + GWidgetPostNoticeR(_STR_NoByteCode,_STR_NoByteCodeMsg); + } + + if ( _FT_Set_Char_Size(ftc->face,0,(int) (ptsize*64), dpi, dpi)) +return( NULL ); /* Error Return */ + + if ( _FT_Load_Glyph(ftc->face,ftc->glyph_indeces[enc],FT_LOAD_NO_BITMAP)) +return( NULL ); + + slot = ftc->face->glyph; + memset(&outline_context,'\0',sizeof(outline_context)); + /* The outline's position is expressed in 24.6 fixed numbers representing */ + /* pixels. I want to scale it back to the original coordinate system */ + outline_context.scale = ftc->em/(64.0*ptsize*dpi/72.0); + outline_context.orig_cpl = splines; + outline_context.orig_sp = NULL; + outline_context.order2 = ftc->isttf; + if ( !_FT_Outline_Decompose(&slot->outline,&outlinefuncs,&outline_context)) { + FT_ClosePath(&outline_context); + *width = outline_context.scale*slot->advance.x; +return( outline_context.hcpl ); + } +return( NULL ); +} + +struct freetype_raster *FreeType_GetRaster(void *single_glyph_context, + int enc, real ptsize, int dpi) { + FT_GlyphSlot slot; + struct freetype_raster *ret; + FTC *ftc = (FTC *) single_glyph_context; + + if ( ftc->face==(void *) -1 ) +return( NULL ); + + if ( _FT_Set_Char_Size(ftc->face,0,(int) (ptsize*64), dpi, dpi)) +return( NULL ); /* Error Return */ + + if ( _FT_Load_Glyph(ftc->face,ftc->glyph_indeces[enc],FT_LOAD_NO_BITMAP)) +return( NULL ); + + slot = ((FT_Face) (ftc->face))->glyph; + if ( _FT_Render_Glyph(slot,ft_render_mode_mono)) +return( NULL ); + + if ( slot->bitmap.pixel_mode!=ft_pixel_mode_mono && + slot->bitmap.pixel_mode!=ft_pixel_mode_grays ) +return( NULL ); + ret = galloc(sizeof(struct freetype_raster)); + + ret->rows = slot->bitmap.rows; + ret->cols = slot->bitmap.width; + ret->bytes_per_row = slot->bitmap.pitch; + ret->as = slot->bitmap_top; + ret->lb = slot->bitmap_left; + ret->num_greys = slot->bitmap.num_grays; + /* Can't find any description of freetype's bitendianness */ + /* But the obvious seems to work */ + ret->bitmap = galloc(ret->rows*ret->bytes_per_row); + memcpy(ret->bitmap,slot->bitmap.buffer,ret->rows*ret->bytes_per_row); +return( ret ); +} +#endif + +void *FreeTypeFontContext(SplineFont *sf,SplineChar *sc,FontView *fv) { +return( _FreeTypeFontContext(sf,sc,fv,sf->subfontcnt!=0?ff_otfcid:ff_pfb,0,NULL) ); +} + +void FreeType_FreeRaster(struct freetype_raster *raster) { + if ( raster==NULL || raster==(void *) -1 ) +return; + free(raster->bitmap); + free(raster); +} + +/******************************************************************************/ +/* ***************************** Debugger Stuff ***************************** */ +/******************************************************************************/ + +#if FREETYPE_HAS_DEBUGGER +#include +#include + +typedef struct bpdata { + int range; /* tt_coderange_glyph, tt_coderange_font, tt_coderange_cvt */ + int ip; +} BpData; + +struct debugger_context { + FT_Library context; + FTC *ftc; + /* I use a thread because freetype doesn't return, it just has a callback */ + /* on each instruction. In actuallity only one thread should be executable*/ + /* at a time (either main, or child) */ + pthread_t thread; + pthread_mutex_t parent_mutex, child_mutex; + pthread_cond_t parent_cond, child_cond; + unsigned int terminate: 1; /* The thread has been started simply to clean itself up and die */ + unsigned int has_mutexes: 1; + unsigned int has_thread: 1; + unsigned int has_finished: 1; + unsigned int debug_fpgm: 1; + unsigned int multi_step: 1; + unsigned int found_wp: 1; + unsigned int initted_pts: 1; + int wp_ptindex; + real ptsize; + int dpi; + TT_ExecContext exc; + SplineChar *sc; + BpData temp; + BpData breaks[32]; + int bcnt; + FT_Vector *oldpts; + int n_points; + uint8 *watch; +}; + +static int AtWp(struct debugger_context *dc, TT_ExecContext exc ) { + int i, hit=false; + + dc->found_wp = false; + if ( dc->watch==NULL ) +return( false ); + + for ( i=0; ipts.n_points; ++i ) { + if ( dc->oldpts[i].x!=exc->pts.cur[i].x || dc->oldpts[i].y!=exc->pts.cur[i].y ) { + dc->oldpts[i] = exc->pts.cur[i]; + if ( dc->watch[i] ) { + hit = true; + dc->wp_ptindex = i; + } + } + } + dc->found_wp = hit; +return( hit ); +} + +static int AtBp(struct debugger_context *dc, TT_ExecContext exc ) { + int i; + + if ( dc->temp.range==exc->curRange && dc->temp.ip==exc->IP ) { + dc->temp.range = tt_coderange_none; +return( true ); + } + + for ( i=0; ibcnt; ++i ) { + if ( dc->breaks[i].range==exc->curRange && dc->breaks[i].ip==exc->IP ) +return( true ); + } +return( false ); +} + +static struct debugger_context *massive_kludge; + +static FT_Error PauseIns( TT_ExecContext exc ) { + int ret; + struct debugger_context *dc = massive_kludge; + + if ( dc->terminate ) +return( TT_Err_Execution_Too_Long ); /* Some random error code, says we're probably in a infinite loop */ + dc->exc = exc; + + if ( !dc->debug_fpgm && exc->curRange!=tt_coderange_glyph ) { + exc->instruction_trap = 0; +return( _TT_RunIns(exc)); /* This should run to completion */ + } + + /* Set up for watch points */ + if ( dc->oldpts==NULL && exc->pts.n_points!=0 ) { + dc->oldpts = gcalloc(exc->pts.n_points,sizeof(FT_Vector)); + dc->n_points = exc->pts.n_points; + } + if ( exc->pts.n_points!=0 && !dc->initted_pts ) { + AtWp(dc,exc); + dc->found_wp = false; + dc->initted_pts = true; + } + + pthread_mutex_lock(&dc->parent_mutex); + pthread_cond_signal(&dc->parent_cond); + pthread_mutex_unlock(&dc->parent_mutex); + pthread_cond_wait(&dc->child_cond,&dc->child_mutex); + if ( dc->terminate ) +return( TT_Err_Execution_Too_Long ); + + do { + exc->instruction_trap = 1; + ret = _TT_RunIns(exc); + if ( ret ) + break; + /* Signal the parent if we are single stepping, or if we've reached a break-point */ + if ( AtWp(dc,exc) || !dc->multi_step || AtBp(dc,exc) || + (exc->curRange==tt_coderange_glyph && exc->IP==exc->codeSize)) { + if ( dc->found_wp ) { + GWidgetPostNoticeR(_STR_HitWatchPoint,_STR_HitWatchPointn,dc->wp_ptindex); + dc->found_wp = true; + } + pthread_mutex_lock(&dc->parent_mutex); + pthread_cond_signal(&dc->parent_cond); + pthread_mutex_unlock(&dc->parent_mutex); + pthread_cond_wait(&dc->child_cond,&dc->child_mutex); + } + } while ( !dc->terminate ); + + if ( ret==TT_Err_Code_Overflow ) + ret = 0; + + massive_kludge = dc; /* We set this again in case we are in a composite character where I think we get called several times (and some other thread might have set it) */ + if ( dc->terminate ) +return( TT_Err_Execution_Too_Long ); + +return( ret ); +} + +static void *StartChar(void *_dc) { + struct debugger_context *dc = _dc; + + pthread_mutex_lock(&dc->child_mutex); + + massive_kludge = dc; + if ( (dc->ftc = __FreeTypeFontContext(dc->context,dc->sc->parent,dc->sc,NULL, + ff_ttf, 0, NULL))==NULL ) + goto finish; + + massive_kludge = dc; + if ( _FT_Set_Char_Size(dc->ftc->face,0,(int) (dc->ptsize*64), dc->dpi, dc->dpi)) + goto finish; + + massive_kludge = dc; + _FT_Load_Glyph(dc->ftc->face,dc->ftc->glyph_indeces[dc->sc->enc],FT_LOAD_NO_BITMAP); + + finish: + dc->has_finished = true; + dc->exc = NULL; + pthread_mutex_lock(&dc->parent_mutex); + pthread_cond_signal(&dc->parent_cond); /* Wake up parent and get it to clean up after itself */ + pthread_mutex_unlock(&dc->parent_mutex); + pthread_mutex_unlock(&dc->child_mutex); +return( NULL ); +} + +void DebuggerTerminate(struct debugger_context *dc) { + if ( dc->has_thread ) { + if ( !dc->has_finished ) { + dc->terminate = true; + pthread_mutex_lock(&dc->child_mutex); + pthread_cond_signal(&dc->child_cond); /* Wake up child and get it to clean up after itself */ + pthread_mutex_unlock(&dc->child_mutex); + pthread_mutex_unlock(&dc->parent_mutex); + } + pthread_join(dc->thread,NULL); + dc->has_thread = false; + } + if ( dc->has_mutexes ) { + pthread_cond_destroy(&dc->child_cond); + pthread_cond_destroy(&dc->parent_cond); + pthread_mutex_destroy(&dc->child_mutex); + pthread_mutex_unlock(&dc->parent_mutex); + pthread_mutex_destroy(&dc->parent_mutex); + } + if ( dc->ftc!=NULL ) + FreeTypeFreeContext(dc->ftc); + if ( dc->context!=NULL ) + _FT_Done_FreeType( dc->context ); + free(dc->watch); + free(dc->oldpts); + free(dc); +} + +void DebuggerReset(struct debugger_context *dc,real ptsize,int dpi,int dbg_fpgm) { + /* Kill off the old thread, and start up a new one working on the given */ + /* pointsize and resolution */ /* I'm not prepared for errors here */ + /* Note that if we don't want to look at the fpgm/prep code (and we */ + /* usually don't) then we must turn off the debug hook when they get run */ + + if ( dc->has_thread ) { + dc->terminate = true; + pthread_cond_signal(&dc->child_cond); /* Wake up child and get it to clean up after itself */ + pthread_join(dc->thread,NULL); + dc->has_thread = false; + } + if ( dc->ftc!=NULL ) + FreeTypeFreeContext(dc->ftc); + + dc->debug_fpgm = dbg_fpgm; + dc->ptsize = ptsize; + dc->dpi = dpi; + dc->terminate = dc->has_finished = false; + dc->initted_pts = false; + + pthread_create(&dc->thread,NULL,StartChar,(void *) dc); + dc->has_thread = true; + pthread_cond_wait(&dc->parent_cond,&dc->parent_mutex); +} + +struct debugger_context *DebuggerCreate(SplineChar *sc,real ptsize,int dpi,int dbg_fpgm) { + struct debugger_context *dc; + + if ( !hasFreeTypeDebugger()) +return( NULL ); + + dc = gcalloc(1,sizeof(struct debugger_context)); + dc->sc = sc; + dc->debug_fpgm = dbg_fpgm; + dc->ptsize = ptsize; + dc->dpi = dpi; + if ( _FT_Init_FreeType( &dc->context )) { + free(dc); +return( NULL ); + } + + _FT_Set_Debug_Hook( dc->context, + FT_DEBUG_HOOK_TRUETYPE, + (FT_DebugHook_Func)PauseIns ); + + pthread_mutex_init(&dc->parent_mutex,NULL); pthread_mutex_init(&dc->child_mutex,NULL); + pthread_cond_init(&dc->parent_cond,NULL); pthread_cond_init(&dc->child_cond,NULL); + dc->has_mutexes = true; + + pthread_mutex_lock(&dc->parent_mutex); + if ( pthread_create(&dc->thread,NULL,StartChar,dc)!=0 ) { + DebuggerTerminate( dc ); +return( NULL ); + } + dc->has_thread = true; + pthread_cond_wait(&dc->parent_cond,&dc->parent_mutex); /* Wait for the child to initialize itself (and stop) then we can look at its status */ + +return( dc ); +} + +void DebuggerGo(struct debugger_context *dc,enum debug_gotype dgt) { + int opcode; + + if ( !dc->has_thread || dc->has_finished || dc->exc==NULL ) + DebuggerReset(dc,dc->ptsize,dc->dpi,dc->debug_fpgm); + else { + switch ( dgt ) { + case dgt_continue: + dc->multi_step = true; + break; + case dgt_stepout: + dc->multi_step = true; + if ( dc->exc->callTop>0 ) { + dc->temp.range = dc->exc->callStack[dc->exc->callTop-1].Caller_Range; + dc->temp.ip = dc->exc->callStack[dc->exc->callTop-1].Caller_IP; + } + break; + case dgt_next: + opcode = dc->exc->code[dc->exc->IP]; + /* I've decided that IDEFs will get stepped into */ + if ( opcode==0x2b /* call */ || opcode==0x2a /* loopcall */ ) { + dc->temp.range = dc->exc->curRange; + dc->temp.ip = dc->exc->IP+1; + dc->multi_step = true; + } else + dc->multi_step = false; + break; + default: + case dgt_step: + dc->multi_step = false; + break; + } + pthread_mutex_lock(&dc->child_mutex); + pthread_cond_signal(&dc->child_cond); /* Wake up child and get it to clean up after itself */ + pthread_mutex_unlock(&dc->child_mutex); + pthread_cond_wait(&dc->parent_cond,&dc->parent_mutex); /* Wait for the child to initialize itself (and stop) then we can look at its status */ + } +} + +struct TT_ExecContextRec_ *DebuggerGetEContext(struct debugger_context *dc) { +return( dc->exc ); +} + +int DebuggerBpCheck(struct debugger_context *dc,int range,int ip) { + int i; + + for ( i=0; ibcnt; ++i ) { + if ( dc->breaks[i].range==range && dc->breaks[i].ip==ip ) +return( true ); + } +return( false ); +} + +void DebuggerToggleBp(struct debugger_context *dc,int range,int ip) { + int i; + + /* If the address has a bp, then remove it */ + for ( i=0; ibcnt; ++i ) { + if ( dc->breaks[i].range==range && dc->breaks[i].ip==ip ) { + ++i; + while ( ibcnt ) { + dc->breaks[i-1].range = dc->breaks[i].range; + dc->breaks[i-1].ip = dc->breaks[i].ip; + ++i; + } + --dc->bcnt; +return; + } + } + /* Else add it */ + if ( dc->bcnt>=sizeof(dc->breaks)/sizeof(dc->breaks[0]) ) { + GWidgetErrorR(_STR_TooManyBreakpoints,_STR_TooManyBreakpoints); +return; + } + i = dc->bcnt++; + dc->breaks[i].range = range; + dc->breaks[i].ip = ip; +} + +void DebuggerSetWatches(struct debugger_context *dc,int n, uint8 *w) { + free(dc->watch); dc->watch=NULL; + if ( n!=dc->n_points ) GDrawIError("Bad watchpoint count"); + else { + dc->watch = w; + if ( dc->exc ) { + AtWp(dc,dc->exc); + dc->found_wp = false; + } + } +} + +uint8 *DebuggerGetWatches(struct debugger_context *dc, int *n) { + *n = dc->n_points; +return( dc->watch ); +} + +int DebuggingFpgm(struct debugger_context *dc) { +return( dc->debug_fpgm ); +} +#else + +void DebuggerTerminate(struct debugger_context *dc) { +} + +void DebuggerReset(struct debugger_context *dc,real ptsize,int dpi,int dbg_fpgm) { +} + +struct debugger_context *DebuggerCreate(SplineChar *sc,real pointsize,int dpi, int dbg_fpgm) { +return( NULL ); +} + +void DebuggerGo(struct debugger_context *dc,enum debug_gotype go) { +} + +struct TT_ExecContextRec_ *DebuggerGetEContext(struct debugger_context *dc) { +return( NULL ); +} + +void DebuggerSetWatches(struct debugger_context *dc,int n, uint8 *w) { +} + +uint8 *DebuggerGetWatches(struct debugger_context *dc, int *n) { + *n = 0; +return( NULL ); +} + +int DebuggingFpgm(struct debugger_context *dc) { +return( false ); +} +#endif diff --git a/fontforge/fvcomposit.c b/fontforge/fvcomposit.c new file mode 100644 index 00000000..857165a7 --- /dev/null +++ b/fontforge/fvcomposit.c @@ -0,0 +1,1937 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include + +extern int GraveAcuteCenterBottom, CharCenterHighest; +extern int accent_offset; /* in prefs.c */ + +#define BottomAccent 0x300 +#define TopAccent 0x345 + +/* for accents between 0x300 and 345 these are some synonyms */ +/* postscript wants accented chars built with accents in the 0x2c? range */ +/* except for grave and acute which live in iso8859-1 range */ +/* this table is ordered on a best try basis */ +static const unichar_t accents[][3] = { + { 0x60, 0x2cb }, /* grave */ + { 0xb4, 0x2ca }, /* acute */ + { 0x2c6, 0x5e }, /* circumflex */ + { 0x2dc, 0x7e }, /* tilde */ + { 0xaf, 0x2c9 }, /* macron */ + { 0x305, 0xaf }, /* overline, (macron is suggested as a syn, but it's not quite right) */ + { 0x2d8 }, /* breve */ + { 0x2d9, '.' }, /* dot above */ + { 0xa8 }, /* diaeresis */ + { 0x2c0 }, /* hook above */ + { 0x2da, 0xb0 }, /* ring above */ + { 0x2dd }, /* real acute */ + { 0x2c7 }, /* caron */ + { 0x2c8, 0x384, '\'' }, /* vertical line, tonos */ + { '"' }, /* real vertical line */ + { 0 }, /* real grave */ + { 0 }, /* cand... */ /* 310 */ + { 0 }, /* inverted breve */ + { 0x2bb }, /* turned comma */ + { 0x2bc, ',' }, /* comma above */ + { 0x2bd }, /* reversed comma */ + { 0x2bc, ',' }, /* comma above right */ + { 0x60, 0x2cb }, /* grave below */ + { 0xb4, 0x2ca }, /* acute below */ + { 0 }, /* left tack */ + { 0 }, /* right tack */ + { 0 }, /* left angle */ + { 0 }, /* horn, sometimes comma but only if nothing better */ + { 0 }, /* half ring */ + { 0x2d4 }, /* up tack */ + { 0x2d5 }, /* down tack */ + { 0x2d6, '+' }, /* plus below */ + { 0x2d7, '-' }, /* minus below */ /* 320 */ + { 0x2b2 }, /* hook */ + { 0 }, /* back hook */ + { 0x2d9, '.' }, /* dot below */ + { 0xa8 }, /* diaeresis below */ + { 0x2da, 0xb0 }, /* ring below */ + { 0x2bc, ',' }, /* comma below */ + { 0xb8 }, /* cedilla */ + { 0x2db }, /* ogonek */ /* 0x328 */ + { 0x2c8, 0x384, '\'' }, /* vertical line below */ + { 0 }, /* bridge below */ + { 0 }, /* real arch below */ + { 0x2c7 }, /* caron below */ + { 0x2c6, 0x52 }, /* circumflex below */ + { 0x2d8 }, /* breve below */ + { 0 }, /* inverted breve below */ + { 0x2dc, 0x7e }, /* tilde below */ /* 0x330 */ + { 0xaf, 0x2c9 }, /* macron below */ + { '_' }, /* low line */ + { 0 }, /* real low line */ + { 0x2dc, 0x7e }, /* tilde overstrike */ + { '-' }, /* line overstrike */ + { '_' }, /* long line overstrike */ + { '/' }, /* short solidus overstrike */ + { '/' }, /* long solidus overstrike */ /* 0x338 */ + { 0 }, + { 0 }, + { 0 }, + { 0 }, + { 0 }, + { 0 }, + { 0 }, + { 0x60, 0x2cb }, /* tone mark, left of circumflex */ /* 0x340 */ + { 0xb4, 0x2ca }, /* tone mark, right of circumflex */ + { 0x2dc, 0x7e }, /* perispomeni (tilde) */ + { 0x2bc, ',' }, /* koronis */ + { 0 }, /* dialytika tonos (two accents) */ + { 0x37a }, /* ypogegrammeni */ + { 0xffff } +}; + +/* greek accents */ +/* because of accent unification I can't use the same glyphs for greek and */ +/* latin accents. Annoying. So when unicode decomposes a greek letter to */ +/* use 0x0301 we actually want 0x1ffd and so on */ +static unichar_t unicode_greekalts[256][3] = { +/* 1F00 */ { 0x03B1, 0x1FBF, 0 }, +/* 1F01 */ { 0x03B1, 0x1FFE, 0 }, +/* 1F02 */ { 0x03B1, 0x1FCD, 0 }, +/* 1F03 */ { 0x03B1, 0x1FDD, 0 }, +/* 1F04 */ { 0x03B1, 0x1FCE, 0 }, +/* 1F05 */ { 0x03B1, 0x1FDE, 0 }, +/* 1F06 */ { 0x03B1, 0x1FCF, 0 }, +/* 1F07 */ { 0x03B1, 0x1FDF, 0 }, +/* 1F08 */ { 0x0391, 0x1FBF, 0 }, +/* 1F09 */ { 0x0391, 0x1FFE, 0 }, +/* 1F0A */ { 0x0391, 0x1FCD, 0 }, +/* 1F0B */ { 0x0391, 0x1FDD, 0 }, +/* 1F0C */ { 0x0391, 0x1FCE, 0 }, +/* 1F0D */ { 0x0391, 0x1FDE, 0 }, +/* 1F0E */ { 0x0391, 0x1FCF, 0 }, +/* 1F0F */ { 0x0391, 0x1FDF, 0 }, +/* 1F10 */ { 0x03B5, 0x1FBF, 0 }, +/* 1F11 */ { 0x03B5, 0x1FFE, 0 }, +/* 1F12 */ { 0x03B5, 0x1FCD, 0 }, +/* 1F13 */ { 0x03B5, 0x1FDD, 0 }, +/* 1F14 */ { 0x03B5, 0x1FCE, 0 }, +/* 1F15 */ { 0x03B5, 0x1FDE, 0 }, +/* 1F16 */ { 0 }, +/* 1F17 */ { 0 }, +/* 1F18 */ { 0x0395, 0x1FBF, 0 }, +/* 1F19 */ { 0x0395, 0x1FFE, 0 }, +/* 1F1A */ { 0x0395, 0x1FCD, 0 }, +/* 1F1B */ { 0x0395, 0x1FDD, 0 }, +/* 1F1C */ { 0x0395, 0x1FCE, 0 }, +/* 1F1D */ { 0x0395, 0x1FDE, 0 }, +/* 1F1E */ { 0 }, +/* 1F1F */ { 0 }, +/* 1F20 */ { 0x03B7, 0x1FBF, 0 }, +/* 1F21 */ { 0x03B7, 0x1FFE, 0 }, +/* 1F22 */ { 0x03B7, 0x1FCD, 0 }, +/* 1F23 */ { 0x03B7, 0x1FDD, 0 }, +/* 1F24 */ { 0x03B7, 0x1FCE, 0 }, +/* 1F25 */ { 0x03B7, 0x1FDE, 0 }, +/* 1F26 */ { 0x03B7, 0x1FCF, 0 }, +/* 1F27 */ { 0x03B7, 0x1FDF, 0 }, +/* 1F28 */ { 0x0397, 0x1FBF, 0 }, +/* 1F29 */ { 0x0397, 0x1FFE, 0 }, +/* 1F2A */ { 0x0397, 0x1FCD, 0 }, +/* 1F2B */ { 0x0397, 0x1FDD, 0 }, +/* 1F2C */ { 0x0397, 0x1FCE, 0 }, +/* 1F2D */ { 0x0397, 0x1FDE, 0 }, +/* 1F2E */ { 0x0397, 0x1FCF, 0 }, +/* 1F2F */ { 0x0397, 0x1FDF, 0 }, +/* 1F30 */ { 0x03B9, 0x1FBF, 0 }, +/* 1F31 */ { 0x03B9, 0x1FFE, 0 }, +/* 1F32 */ { 0x03B9, 0x1FCD, 0 }, +/* 1F33 */ { 0x03B9, 0x1FDD, 0 }, +/* 1F34 */ { 0x03B9, 0x1FCE, 0 }, +/* 1F35 */ { 0x03B9, 0x1FDE, 0 }, +/* 1F36 */ { 0x03B9, 0x1FCF, 0 }, +/* 1F37 */ { 0x03B9, 0x1FDF, 0 }, +/* 1F38 */ { 0x0399, 0x1FBF, 0 }, +/* 1F39 */ { 0x0399, 0x1FFE, 0 }, +/* 1F3A */ { 0x0399, 0x1FCD, 0 }, +/* 1F3B */ { 0x0399, 0x1FDD, 0 }, +/* 1F3C */ { 0x0399, 0x1FCE, 0 }, +/* 1F3D */ { 0x0399, 0x1FDE, 0 }, +/* 1F3E */ { 0x0399, 0x1FCF, 0 }, +/* 1F3F */ { 0x0399, 0x1FDF, 0 }, +/* 1F40 */ { 0x03BF, 0x1FBF, 0 }, +/* 1F41 */ { 0x03BF, 0x1FFE, 0 }, +/* 1F42 */ { 0x03BF, 0x1FCD, 0 }, +/* 1F43 */ { 0x03BF, 0x1FDD, 0 }, +/* 1F44 */ { 0x03BF, 0x1FCE, 0 }, +/* 1F45 */ { 0x03BF, 0x1FDE, 0 }, +/* 1F46 */ { 0 }, +/* 1F47 */ { 0 }, +/* 1F48 */ { 0x039F, 0x1FBF, 0 }, +/* 1F49 */ { 0x039F, 0x1FFE, 0 }, +/* 1F4A */ { 0x039F, 0x1FCD, 0 }, +/* 1F4B */ { 0x039F, 0x1FDD, 0 }, +/* 1F4C */ { 0x039F, 0x1FCE, 0 }, +/* 1F4D */ { 0x039F, 0x1FDE, 0 }, +/* 1F4E */ { 0 }, +/* 1F4F */ { 0 }, +/* 1F50 */ { 0x03C5, 0x1FBF, 0 }, +/* 1F51 */ { 0x03C5, 0x1FFE, 0 }, +/* 1F52 */ { 0x03C5, 0x1FCD, 0 }, +/* 1F53 */ { 0x03C5, 0x1FDD, 0 }, +/* 1F54 */ { 0x03C5, 0x1FCE, 0 }, +/* 1F55 */ { 0x03C5, 0x1FDE, 0 }, +/* 1F56 */ { 0x03C5, 0x1FCF, 0 }, +/* 1F57 */ { 0x03C5, 0x1FDF, 0 }, +/* 1F58 */ { 0 }, +/* 1F59 */ { 0x03a5, 0x1FFE, 0 }, +/* 1F5A */ { 0 }, +/* 1F5B */ { 0x03a5, 0x1FDD, 0 }, +/* 1F5C */ { 0 }, +/* 1F5D */ { 0x03a5, 0x1FDE, 0 }, +/* 1F5E */ { 0 }, +/* 1F5F */ { 0x03a5, 0x1FDF, 0 }, +/* 1F60 */ { 0x03C9, 0x1FBF, 0 }, +/* 1F61 */ { 0x03C9, 0x1FFE, 0 }, +/* 1F62 */ { 0x03C9, 0x1FCD, 0 }, +/* 1F63 */ { 0x03C9, 0x1FDD, 0 }, +/* 1F64 */ { 0x03C9, 0x1FCE, 0 }, +/* 1F65 */ { 0x03C9, 0x1FDE, 0 }, +/* 1F66 */ { 0x03C9, 0x1FCF, 0 }, +/* 1F67 */ { 0x03C9, 0x1FDF, 0 }, +/* 1F68 */ { 0x03A9, 0x1FBF, 0 }, +/* 1F69 */ { 0x03A9, 0x1FFE, 0 }, +/* 1F6A */ { 0x03A9, 0x1FCD, 0 }, +/* 1F6B */ { 0x03A9, 0x1FDD, 0 }, +/* 1F6C */ { 0x03A9, 0x1FCE, 0 }, +/* 1F6D */ { 0x03A9, 0x1FDE, 0 }, +/* 1F6E */ { 0x03A9, 0x1FCF, 0 }, +/* 1F6F */ { 0x03A9, 0x1FDF, 0 }, +/* 1F70 */ { 0x03B1, 0x1FEF, 0 }, +/* 1F71 */ { 0x03B1, 0x1FFD, 0 }, +/* 1F72 */ { 0x03B5, 0x1FEF, 0 }, +/* 1F73 */ { 0x03B5, 0x1FFD, 0 }, +/* 1F74 */ { 0x03B7, 0x1FEF, 0 }, +/* 1F75 */ { 0x03B7, 0x1FFD, 0 }, +/* 1F76 */ { 0x03B9, 0x1FEF, 0 }, +/* 1F77 */ { 0x03B9, 0x1FFD, 0 }, +/* 1F78 */ { 0x03BF, 0x1FEF, 0 }, +/* 1F79 */ { 0x03BF, 0x1FFD, 0 }, +/* 1F7A */ { 0x03C5, 0x1FEF, 0 }, +/* 1F7B */ { 0x03C5, 0x1FFD, 0 }, +/* 1F7C */ { 0x03C9, 0x1FEF, 0 }, +/* 1F7D */ { 0x03C9, 0x1FFD, 0 }, +/* 1F7E */ { 0 }, +/* 1F7F */ { 0 }, +/* 1F80 */ { 0x1F00, 0x0345, 0 }, +/* 1F81 */ { 0x1F01, 0x0345, 0 }, +/* 1F82 */ { 0x1F02, 0x0345, 0 }, +/* 1F83 */ { 0x1F03, 0x0345, 0 }, +/* 1F84 */ { 0x1F04, 0x0345, 0 }, +/* 1F85 */ { 0x1F05, 0x0345, 0 }, +/* 1F86 */ { 0x1F06, 0x0345, 0 }, +/* 1F87 */ { 0x1F07, 0x0345, 0 }, +/* 1F88 */ { 0x1F08, 0x1FBE, 0 }, +/* 1F89 */ { 0x1F09, 0x1FBE, 0 }, +/* 1F8A */ { 0x1F0A, 0x1FBE, 0 }, +/* 1F8B */ { 0x1F0B, 0x1FBE, 0 }, +/* 1F8C */ { 0x1F0C, 0x1FBE, 0 }, +/* 1F8D */ { 0x1F0D, 0x1FBE, 0 }, +/* 1F8E */ { 0x1F0E, 0x1FBE, 0 }, +/* 1F8F */ { 0x1F0F, 0x1FBE, 0 }, +/* 1F90 */ { 0x1F20, 0x0345, 0 }, +/* 1F91 */ { 0x1F21, 0x0345, 0 }, +/* 1F92 */ { 0x1F22, 0x0345, 0 }, +/* 1F93 */ { 0x1F23, 0x0345, 0 }, +/* 1F94 */ { 0x1F24, 0x0345, 0 }, +/* 1F95 */ { 0x1F25, 0x0345, 0 }, +/* 1F96 */ { 0x1F26, 0x0345, 0 }, +/* 1F97 */ { 0x1F27, 0x0345, 0 }, +/* 1F98 */ { 0x1F28, 0x1FBE, 0 }, +/* 1F99 */ { 0x1F29, 0x1FBE, 0 }, +/* 1F9A */ { 0x1F2A, 0x1FBE, 0 }, +/* 1F9B */ { 0x1F2B, 0x1FBE, 0 }, +/* 1F9C */ { 0x1F2C, 0x1FBE, 0 }, +/* 1F9D */ { 0x1F2D, 0x1FBE, 0 }, +/* 1F9E */ { 0x1F2E, 0x1FBE, 0 }, +/* 1F9F */ { 0x1F2F, 0x1FBE, 0 }, +/* 1FA0 */ { 0x1F60, 0x0345, 0 }, +/* 1FA1 */ { 0x1F61, 0x0345, 0 }, +/* 1FA2 */ { 0x1F62, 0x0345, 0 }, +/* 1FA3 */ { 0x1F63, 0x0345, 0 }, +/* 1FA4 */ { 0x1F64, 0x0345, 0 }, +/* 1FA5 */ { 0x1F65, 0x0345, 0 }, +/* 1FA6 */ { 0x1F66, 0x0345, 0 }, +/* 1FA7 */ { 0x1F67, 0x0345, 0 }, +/* 1FA8 */ { 0x1F68, 0x1FBE, 0 }, +/* 1FA9 */ { 0x1F69, 0x1FBE, 0 }, +/* 1FAA */ { 0x1F6A, 0x1FBE, 0 }, +/* 1FAB */ { 0x1F6B, 0x1FBE, 0 }, +/* 1FAC */ { 0x1F6C, 0x1FBE, 0 }, +/* 1FAD */ { 0x1F6D, 0x1FBE, 0 }, +/* 1FAE */ { 0x1F6E, 0x1FBE, 0 }, +/* 1FAF */ { 0x1F6F, 0x1FBE, 0 }, +/* 1FB0 */ { 0x03B1, 0x0306, 0 }, +/* 1FB1 */ { 0x03B1, 0x0304, 0 }, +/* 1FB2 */ { 0x1F70, 0x0345, 0 }, +/* 1FB3 */ { 0x03B1, 0x0345, 0 }, +/* 1FB4 */ { 0x1f71, 0x0345, 0 }, +/* 1FB5 */ { 0 }, +/* 1FB6 */ { 0x03B1, 0x1FC0, 0 }, +/* 1FB7 */ { 0x1FB6, 0x0345, 0 }, +/* 1FB8 */ { 0x0391, 0x0306, 0 }, +/* 1FB9 */ { 0x0391, 0x0304, 0 }, +/* 1FBA */ { 0x0391, 0x1FEF, 0 }, +/* 1FBB */ { 0x0391, 0x1FFD, 0 }, +/* 1FBC */ { 0x0391, 0x1FBE, 0 }, +/* 1FBD */ { 0x0020, 0x0313, 0 }, +/* 1FBE */ { 0x0020, 0x0345, 0 }, +/* 1FBF */ { 0x0020, 0x0313, 0 }, +/* 1FC0 */ { 0x0020, 0x0342, 0 }, +/* 1FC1 */ { 0x00A8, 0x1FC0, 0 }, +/* 1FC2 */ { 0x1F74, 0x0345, 0 }, +/* 1FC3 */ { 0x03B7, 0x0345, 0 }, +/* 1FC4 */ { 0x1f75, 0x0345, 0 }, +/* 1FC5 */ { 0 }, +/* 1FC6 */ { 0x03B7, 0x1FC0, 0 }, +/* 1FC7 */ { 0x1FC6, 0x0345, 0 }, +/* 1FC8 */ { 0x0395, 0x1FEF, 0 }, +/* 1FC9 */ { 0x0395, 0x1FFD, 0 }, +/* 1FCA */ { 0x0397, 0x1FEF, 0 }, +/* 1FCB */ { 0x0397, 0x1FFD, 0 }, +/* 1FCC */ { 0x0397, 0x1FBE, 0 }, +/* 1FCD */ { 0x1FBF, 0x1FEF, 0 }, +/* 1FCE */ { 0x1FBF, 0x1FFD, 0 }, +/* 1FCF */ { 0x1FBF, 0x1FC0, 0 }, +/* 1FD0 */ { 0x03B9, 0x0306, 0 }, +/* 1FD1 */ { 0x03B9, 0x0304, 0 }, +/* 1FD2 */ { 0x03B9, 0x1FED, 0 }, +/* 1FD3 */ { 0x03B9, 0x1FEE, 0 }, +/* 1FD4 */ { 0 }, +/* 1FD5 */ { 0 }, +/* 1FD6 */ { 0x03B9, 0x1FC0, 0 }, +/* 1FD7 */ { 0x03B9, 0x1FC1, 0 }, +/* 1FD8 */ { 0x0399, 0x0306, 0 }, +/* 1FD9 */ { 0x0399, 0x0304, 0 }, +/* 1FDA */ { 0x0399, 0x1FEF, 0 }, +/* 1FDB */ { 0x0399, 0x1FFD, 0 }, +/* 1FDC */ { 0 }, +/* 1FDD */ { 0x1FFE, 0x1FEF, 0 }, +/* 1FDE */ { 0x1FFE, 0x1FFD, 0 }, +/* 1FDF */ { 0x1FFE, 0x1FC0, 0 }, +/* 1FE0 */ { 0x03C5, 0x0306, 0 }, +/* 1FE1 */ { 0x03C5, 0x0304, 0 }, +/* 1FE2 */ { 0x03C5, 0x1FED, 0 }, +/* 1FE3 */ { 0x03C5, 0x1FEE, 0 }, +/* 1FE4 */ { 0x03C1, 0x1FBF, 0 }, +/* 1FE5 */ { 0x03C1, 0x1FFE, 0 }, +/* 1FE6 */ { 0x03C5, 0x1FC0, 0 }, +/* 1FE7 */ { 0x03C5, 0x1FC1, 0 }, +/* 1FE8 */ { 0x03A5, 0x0306, 0 }, +/* 1FE9 */ { 0x03A5, 0x0304, 0 }, +/* 1FEA */ { 0x03A5, 0x1FEF, 0 }, +/* 1FEB */ { 0x03A5, 0x1FFD, 0 }, +/* 1FEC */ { 0x03A1, 0x1FFE, 0 }, +/* 1FED */ { 0x00A8, 0x1FEF, 0 }, +/* 1FEE */ { 0x0385, 0 }, +/* 1FEF */ { 0x0060, 0 }, +/* 1FF0 */ { 0 }, +/* 1FF1 */ { 0 }, +/* 1FF2 */ { 0x1F7C, 0x0345, 0 }, +/* 1FF3 */ { 0x03C9, 0x0345, 0 }, +/* 1FF4 */ { 0x03CE, 0x0345, 0 }, +/* 1FF5 */ { 0 }, +/* 1FF6 */ { 0x03C9, 0x1FC0, 0 }, +/* 1FF7 */ { 0x1FF6, 0x0345, 0 }, +/* 1FF8 */ { 0x039F, 0x1FEF, 0 }, +/* 1FF9 */ { 0x039F, 0x1FFD, 0 }, +/* 1FFA */ { 0x03A9, 0x1FEF, 0 }, +/* 1FFB */ { 0x03A9, 0x1FFD, 0 }, +/* 1FFC */ { 0x03A9, 0x1FBE, 0 }, +/* 1FFD */ { 0x00B4, 0 }, +/* 1FFE */ { 0x0020, 0x0314, 0 }, +/* 1FFF */ { 0 }, +}; + +static real SplineSetQuickTop(SplineSet *ss) { + real max = -1e10; + SplinePoint *sp; + + for ( ; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->me.y > max ) max = sp->me.y; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + if ( max<-65536 ) max = 0; /* return a reasonable value for an empty glyph */ +return( max ); +} + +static real SplineCharQuickTop(SplineChar *sc) { + RefChar *ref; + real max, temp; + + max = SplineSetQuickTop(sc->layers[ly_fore].splines); + for ( ref = sc->layers[ly_fore].refs; ref!=NULL; ref = ref->next ) + if ( (temp =SplineSetQuickTop(ref->layers[0].splines))>max ) + max = temp; +return( max ); +} + +static int haschar(SplineFont *sf,int ch) { + int i; + + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4 || + (ch<0x100 && sf->encoding_name==em_iso8859_1)) +return( chcharcnt && sf->chars[ch]!=NULL && + (sf->chars[ch]->layers[ly_fore].splines!=NULL || sf->chars[ch]->layers[ly_fore].refs!=NULL || sf->chars[ch]->widthset) ); + else if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax ) { + i = ch - ((sf->encoding_name-em_unicodeplanes)<<16); +return( i>=0 && icharcnt && sf->chars[i]!=NULL && + (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL || sf->chars[i]->widthset) ); + } + + for ( i=sf->charcnt-1; i>=0; --i ) if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc == ch ) + break; +return( i!=-1 && (sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL || (ch==0x20 && sf->chars[i]->widthset)) ); +} + +static SplineChar *findchar(SplineFont *sf,int ch) { + int i; + + if ( ch==-1 ) /* should never happen */ +return( NULL ); + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4 || + (ch<0x100 && sf->encoding_name==em_iso8859_1)) +return( sf->chars[ch] ); + else if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax ) { + i = ch - ((sf->encoding_name-em_unicodeplanes)<<16); + if ( i>=0 && icharcnt ) +return( sf->chars[i] ); + +return( NULL ); + } + + for ( i=sf->charcnt-1; i>=0; --i ) if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc == ch ) + break; + if ( i<0 ) +return( NULL ); + +return( sf->chars[i] ); +} + +static const unichar_t *arabicfixup(SplineFont *sf, const unichar_t *upt, int ini, int final) { + static unichar_t arabicalts[20]; + unichar_t *apt; const unichar_t *pt; + + for ( apt=arabicalts, pt = upt; *pt!='\0'; ++pt, ++apt ) { + if ( *pt==' ' ) { + *apt = ' '; + ini = true; + } else if ( *pt<0x600 || *pt>0x6ff ) + *apt = *pt; + else if ( ini ) { + *apt = ArabicForms[*pt-0x600].initial; + ini = false; + } else if ( pt[1]==' ' || (pt[1]=='\0' && final)) + *apt = ArabicForms[*pt-0x600].final; + else + *apt = ArabicForms[*pt-0x600].medial; + if ( !haschar(sf,*apt)) + break; + } + if ( *pt=='\0' ) { + *apt = '\0'; +return(arabicalts); + } +return( upt ); +} + +static const unichar_t *SFAlternateFromLigature(SplineFont *sf, int base,SplineChar *sc) { + static unichar_t space[30]; + unichar_t *spt, *send = space+sizeof(space)/sizeof(space[0])-1; + char *ligstart, *semi, *pt, sch, ch, *dpt; + int j; + PST *pst; + + if ( sc==NULL && base>=0 ) { + int pos = SFFindExistingChar(sf,base,NULL); + if ( pos==-1 ) sc = NULL; else sc = sf->chars[pos]; + } + pst = NULL; + if ( sc!=NULL ) + for ( pst=sc->possub; pst!=NULL && pst->type!=pst_ligature; pst = pst->next ); + if ( sc==NULL || pst==NULL ) +return( NULL ); + + ligstart=pst->u.lig.components; + semi = strchr(ligstart,';'); + if ( semi==NULL ) semi = ligstart+strlen(ligstart); + sch = *semi; *semi = '\0'; + spt = space; + for ( pt = ligstart; *pt!='\0'; ) { + char *start = pt; dpt=NULL; + for ( ; *pt!='\0' && *pt!=' '; ++pt ); + ch = *pt; *pt = '\0'; + for ( j=0; jcharcnt; ++j ) + if ( sf->chars[j]!=NULL && strcmp(sf->chars[j]->name,start)==0 ) + break; + *pt = ch; + if ( j==sf->charcnt && (dpt=strchr(start,'.'))!=NULL && dptcharcnt; ++j ) + if ( sf->chars[j]!=NULL && strcmp(sf->chars[j]->name,start)==0 ) + break; + *dpt = dch; + } + if ( j>=sf->charcnt || sf->chars[j]->unicodeenc==-1 || spt>=send ) { + *semi = sch; +return( NULL ); + } + *spt++ = sf->chars[j]->unicodeenc; + if ( ch!='\0' ) ++pt; + } + *spt ='\0'; + *semi = sch; + + if ( *space>=0x0600 && *space<=0x6ff ) { + int ini=0, final=0; + if ( dpt==NULL || strncmp(dpt,".isolated",strlen(".isolated"))==0 ) + ini=final = true; + else if ( strncmp(dpt,".initial",strlen(".initial"))==0 ) + ini=true; + else if ( strncmp(dpt,".final",strlen(".final"))==0 ) + final=true; +return( arabicfixup(sf,space,ini,final)); + } + +return( space ); +} + +const unichar_t *SFGetAlternate(SplineFont *sf, int base,SplineChar *sc,int nocheck) { + static unichar_t greekalts[5]; + const unichar_t *upt, *pt; unichar_t *gpt; + + if ( base>=0xac00 && base<=0xd7a3 ) { /* Hangul syllables */ + greekalts[0] = (base-0xac00)/(21*28) + 0x1100; + greekalts[1] = ((base-0xac00)/28)%21 + 0x1161; + if ( (base-0xac00)%28==0 ) + greekalts[2] = 0; + else + greekalts[2] = (base-0xac00)%28 -1 + 0x11a8; + greekalts[3] = 0; +return( greekalts ); + } + if ( base=='i' || base=='j' ) { + if ( base=='i' ) + greekalts[0] = 0x131; + else if ( haschar(sf,0x237)) + greekalts[0] = 0x237; /* proposed dotlessj */ + else + greekalts[0] = 0xf6be; /* Dotlessj in Adobe's private use area */ + greekalts[1] = 0x307; + greekalts[2] = 0; +return( greekalts ); + } + + if ( base==-1 || base>=65536 || unicode_alternates[base>>8]==NULL || + (upt = unicode_alternates[base>>8][base&0xff])==NULL ) +return( SFAlternateFromLigature(sf,base,sc)); + + /* The definitions of some of the greek letters may make some */ + /* linguistic sense, but I can't use it to place the accents */ + /* properly. So I redefine them here */ + if ( base>=0x1f00 && base<0x2000 ) { + gpt = unicode_greekalts[base-0x1f00]; + if ( *gpt && (nocheck || + (haschar(sf,*gpt) && (gpt[1]=='\0' || haschar(sf,gpt[1]))) )) +return( gpt ); + /* Similarly for these (korean) jamo */ + } else if (( base>=0x1176 && base<=0x117e ) || (base>=0x119a && base<=0x119c)) { + greekalts[0] = upt[1]; greekalts[1] = upt[0]; greekalts[2] = 0; +return( greekalts ); + } else if ( base>=0x380 && base<=0x3ff && upt!=NULL ) { + /* Use precombined accents when possible */ + if ( base==0x390 || base==0x3b0 ) { + greekalts[0] = base==0x390?0x3b9:0x3c5; + greekalts[1] = 0x385; + greekalts[2] = '\0'; + if ( nocheck || haschar(sf,greekalts[1])) +return( greekalts ); + } + /* In version 3 of unicode tonos gets converted to acute, which it */ + /* doesn't look like. Convert it back */ + for ( pt=upt ; *pt && *pt!=0x301; ++pt ); + if ( *pt ) { + for ( gpt=greekalts ; *upt ; ++upt ) { + if ( *upt==0x301 ) + *gpt++ = 0x384 /* I used to use 0x30d, thinking that it was a combining tonos, but greek users tell me it is not */; + else + *gpt++ = *upt; + } +return( greekalts ); + } + } else if (( base>=0xfb50 && base<=0xfdff ) || ( base>=0xfe70 && base<0xfeff )) +return( arabicfixup(sf,upt,isarabisolated(base)||isarabinitial(base), + isarabisolated(base)||isarabfinal(base))); + +return( upt ); +} + +int SFIsCompositBuildable(SplineFont *sf,int unicodeenc,SplineChar *sc) { + const unichar_t *pt, *apt, *end; unichar_t ch; + SplineChar *one, *two; + + if ( unicodeenc==0x131 || unicodeenc==0x0237 || unicodeenc==0xf6be ) +return( SCMakeDotless(sf,SFGetOrMakeChar(sf,unicodeenc,NULL),false,false)); + + if (( pt = SFGetAlternate(sf,unicodeenc,sc,false))==NULL ) +return( false ); + + if ( sc!=NULL ) + one = sc; + else + one=SFGetOrMakeChar(sf,unicodeenc,NULL); + + for ( ; *pt; ++pt ) { + ch = *pt; + if ( !haschar(sf,ch)) { + if ( ch>=BottomAccent && ch<=TopAccent ) { + apt = accents[ch-BottomAccent]; end = apt+3; + while ( aptitalicangle!=0 || + !haschar(sf,0x2d8)) +return( false ); /* we can try inverting the breve for non-italic fonts... */ + else + ch = 0x2d8; + } else + ch = *apt; + } else +return( false ); + } + /* No recursive references */ + /* Cyrillic gamma could refer to Greek gamma, which the entry gives as an alternate */ + if ( one!=NULL && (two=findchar(sf,ch))!=NULL && SCDependsOnSC(two,one)) +return( false ); + } +return( true ); +} + +int SFIsRotatable(SplineFont *sf,SplineChar *sc) { + char *end; + + if ( sf->cidmaster!=NULL && strncmp(sc->name,"vertcid_",8)==0 ) { + int cid = strtol(sc->name+8,&end,10); + if ( *end=='\0' && SFHasCID(sf,cid)!=-1) +return( true ); + } else if ( sf->cidmaster!=NULL && + (strncmp(sc->name,"cid-",4)==0 && strstr(sc->name,".vert")!=NULL) ) { + int cid = strtol(sc->name+4,&end,10); + if ( *end=='.' && SFHasCID(sf,cid)!=-1) +return( true ); + } else if ( strncmp(sc->name,"vertuni",7)==0 && strlen(sc->name)==11 ) { + int uni = strtol(sc->name+7,&end,16); + if ( *end=='\0' && SFCIDFindExistingChar(sf,uni,NULL)!=-1 ) +return( true ); + } else if ( strncmp(sc->name,"uni",3)==0 && strstr(sc->name,".vert")!=NULL ) { + int uni = strtol(sc->name+3,&end,16); + if ( *end=='.' && SFCIDFindExistingChar(sf,uni,NULL)!=-1 ) +return( true ); + } else if ( sc->name[0]=='u' && strstr(sc->name,".vert")!=NULL ) { + int uni = strtol(sc->name+1,&end,16); + if ( *end=='.' && SFCIDFindExistingChar(sf,uni,NULL)!=-1 ) +return( true ); + } else if ( strstr(sc->name,".vert")!=NULL || strstr(sc->name,".vrt2")!=NULL) { + int ret; + char *temp; + end = strchr(sc->name,'.'); + temp = copyn(sc->name,end-sc->name); + ret = SFFindExistingChar(sf,-1,temp)!=-1; + free(temp); +return( ret ); + } +return( false ); +} + +int hascomposing(SplineFont *sf,int u,SplineChar *sc) { + const unichar_t *upt = SFGetAlternate(sf,u,sc,false); + + if ( upt!=NULL ) { + while ( *upt ) { + if ( iscombining(*upt) || *upt==0xb7 || /* b7, centered dot is used as a combining accent for Ldot */ + *upt==0x0385 || /* dieresis/tonos */ + *upt==0x1ffe || *upt==0x1fbf || *upt==0x1fcf || *upt==0x1fdf || + *upt==0x1fbd || *upt==0x1fef || *upt==0x1fc0 || *upt==0x1fc1 || + *upt==0x1fee || *upt==0x1ffd || *upt==0x1fbe || *upt==0x1fed || + *upt==0x1fcd || *upt==0x1fdd || *upt==0x1fce || *upt==0x1fde ) /* Special greek accents */ +return( true ); + /* Only build Jongsung out of chosung when doing a build composit */ + /* not when doing a build accented (that's what the upt[1]!='\0' */ + /* means */ + if ( *upt>=0x1100 && *upt<0x11c7 && upt[1]!='\0' ) +return( true ); + ++upt; + } + + if ( u>=0x1f70 && u<0x1f80 ) +return( true ); /* Yes. they do work, I don't care what it looks like */ + } +return( false ); +} + +int SFIsSomethingBuildable(SplineFont *sf,SplineChar *sc, int onlyaccents) { + int unicodeenc = sc->unicodeenc; + + if ( onlyaccents && /* Don't build greek accents out of latin ones */ + (unicodeenc==0x1fbd || unicodeenc==0x1fbe || unicodeenc==0x1fbf || + unicodeenc==0x1fef || unicodeenc==0x1ffd || unicodeenc==0x1ffe)) +return( false ); + if ( iszerowidth(unicodeenc) || + (unicodeenc>=0x2000 && unicodeenc<=0x2015 )) +return( !onlyaccents ); + + if ( SFIsCompositBuildable(sf,unicodeenc,sc)) +return( !onlyaccents || hascomposing(sf,sc->unicodeenc,sc) ); + + if ( !onlyaccents && SCMakeDotless(sf,sc,false,false)) +return( true ); + +return( SFIsRotatable(sf,sc)); +} + +static int SPInRange(SplinePoint *sp, real ymin, real ymax) { + if ( sp->me.y>=ymin && sp->me.y<=ymax ) +return( true ); +#if 0 + if ( sp->prev!=NULL ) + if ( sp->prev->from->me.y>=ymin && sp->prev->from->me.y<=ymax ) +return( true ); + if ( sp->next!=NULL ) + if ( sp->next->to->me.y>=ymin && sp->next->to->me.y<=ymax ) +return( true ); +#endif +return( false ); +} + +static void _SplineSetFindXRange(SplinePointList *spl, DBounds *bounds, + real ymin, real ymax, real ia) { + Spline *spline; + real xadjust, tia = tan(ia); + + for ( ; spl!=NULL; spl = spl->next ) { + if ( SPInRange(spl->first,ymin,ymax) ) { + xadjust = spl->first->me.x + tia*(spl->first->me.y-ymin); + if ( bounds->minx==0 && bounds->maxx==0 ) { + bounds->minx = bounds->maxx = xadjust; + } else { + if ( xadjustminx ) bounds->minx = xadjust; + if ( xadjust>bounds->maxx ) bounds->maxx = xadjust; + } + } + for ( spline = spl->first->next; spline!=NULL && spline->to!=spl->first; spline=spline->to->next ) { + if ( SPInRange(spline->to,ymin,ymax) ) { + xadjust = spline->to->me.x + tia*(spline->to->me.y-ymin); + if ( bounds->minx==0 && bounds->maxx==0 ) { + bounds->minx = bounds->maxx = xadjust; + } else { + if ( xadjustminx ) bounds->minx = xadjust; + if ( xadjust>bounds->maxx ) bounds->maxx = xadjust; + } + } + } + } +} + +static real _SplineSetFindXRangeAtYExtremum(SplinePointList *spl, DBounds *bounds, + int findymax, real yextreme, real ia) { + Spline *spline; + double t0, t1, t2, t3; + double y0, y1, y2, y3, x; + + for ( ; spl!=NULL; spl = spl->next ) { + for ( spline = spl->first->next; spline!=NULL; spline=spline->to->next ) { + if (( findymax && + !(yextreme>spline->from->me.y && yextreme>spline->from->nextcp.y && + yextreme>spline->to->me.y && yextreme>spline->to->prevcp.y )) || + (!findymax && + !(yextremefrom->me.y && yextremefrom->nextcp.y && + yextremeto->me.y && yextremeto->prevcp.y )) ) { + /* Ok this spline might be bigger(less) than our current */ + /* extreme value, so check it */ + SplineFindExtrema(&spline->splines[1],&t1,&t2); + y0 = spline->from->me.y; t0 = 0; + y3 = spline->to->me.y; t3 = 1; + if ( t1!=-1 ) { + y1 = ((spline->splines[1].a*t1+spline->splines[1].b)*t1+spline->splines[1].c)*t1+spline->splines[1].d; + if ( y1>y0 ) { y0 = y1; t0 = t1; } + } + if ( t2!=-1 ) { + y2 = ((spline->splines[1].a*t2+spline->splines[1].b)*t2+spline->splines[1].c)*t2+spline->splines[1].d; + if ( y2>y3 ) { y3 = y2; t3 = t2; } + } + if ( (findymax && y0>yextreme+.1) || (!findymax && y0miny = bounds->maxy = yextreme = y0; + bounds->minx = bounds->maxx = + ((spline->splines[0].a*t0+spline->splines[0].b)*t0+spline->splines[0].c)*t0+spline->splines[0].d; + } else if ( (findymax && y0>=yextreme-.1) || (!findymax && y0<=yextreme+1) ) { + x = ((spline->splines[0].a*t0+spline->splines[0].b)*t0+spline->splines[0].c)*t0+spline->splines[0].d; + if ( x>bounds->maxx ) bounds->maxx = x; + else if ( xminx ) bounds->minx = x; + } + if ( (findymax && y3>yextreme+.1) || (!findymax && y3miny = bounds->maxy = yextreme = y3; + bounds->minx = bounds->maxx = + ((spline->splines[0].a*t3+spline->splines[0].b)*t3+spline->splines[0].c)*t3+spline->splines[0].d; + } else if ( (findymax && y3>=yextreme-.1) || (!findymax && y3<=yextreme+1) ) { + x = ((spline->splines[0].a*t3+spline->splines[0].b)*t3+spline->splines[0].c)*t3+spline->splines[0].d; + if ( x>bounds->maxx ) bounds->maxx = x; + else if ( xminx ) bounds->minx = x; + } + } + if ( spline->to == spl->first ) + break; + } + } +return( yextreme ); +} + +/* this is called by the accented character routines with bounds set for the */ +/* entire character. Our job is to make a guess at what the top of the */ +/* character looks like so that we can do an optical accent placement */ +/* I currently think the best bet is to find the very highest point(s) and */ +/* center on that. I used to find the bounds of the top quarter of the char */ +static real SCFindTopXRange(SplineChar *sc,DBounds *bounds, real ia) { + RefChar *rf; + real yextreme = -0x80000; + + /* a char with no splines (ie. a space) must have an lbearing of 0 */ + bounds->minx = bounds->maxx = 0; + + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + yextreme = _SplineSetFindXRangeAtYExtremum(rf->layers[0].splines,bounds,true,yextreme,ia); + + yextreme = _SplineSetFindXRangeAtYExtremum(sc->layers[ly_fore].splines,bounds,true,yextreme,ia); + if ( yextreme == -0x80000 ) yextreme = 0; +return( yextreme ); +} + +static real SCFindBottomXRange(SplineChar *sc,DBounds *bounds, real ia) { + RefChar *rf; + real yextreme = 0x80000; + + /* a char with no splines (ie. a space) must have an lbearing of 0 */ + bounds->minx = bounds->maxx = 0; + + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + yextreme = _SplineSetFindXRangeAtYExtremum(rf->layers[0].splines,bounds,false,yextreme,ia); + + yextreme = _SplineSetFindXRangeAtYExtremum(sc->layers[ly_fore].splines,bounds,false,yextreme,ia); + if ( yextreme == 0x80000 ) yextreme = 0; +return( yextreme ); +} + +/* the cedilla and ogonec accents do not center on the accent itself but on */ +/* the small part of it that joins at the top */ +static real SCFindTopBounds(SplineChar *sc,DBounds *bounds, real ia) { + RefChar *rf; + int ymax = bounds->maxy+1, ymin = ymax-(bounds->maxy-bounds->miny)/20; + + /* a char with no splines (ie. a space) must have an lbearing of 0 */ + bounds->minx = bounds->maxx = 0; + + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + _SplineSetFindXRange(rf->layers[0].splines,bounds,ymin,ymax,ia); + + _SplineSetFindXRange(sc->layers[ly_fore].splines,bounds,ymin,ymax,ia); +return( ymin ); +} + +/* And similarly for the floating hook, and often for grave and acute */ +static real SCFindBottomBounds(SplineChar *sc,DBounds *bounds, real ia) { + RefChar *rf; + int ymin = bounds->miny-1, ymax = ymin+(bounds->maxy-bounds->miny)/20; + + /* a char with no splines (ie. a space) must have an lbearing of 0 */ + bounds->minx = bounds->maxx = 0; + + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + _SplineSetFindXRange(rf->layers[0].splines,bounds,ymin,ymax,ia); + + _SplineSetFindXRange(sc->layers[ly_fore].splines,bounds,ymin,ymax,ia); +return( ymin ); +} + +static real SplineCharFindSlantedBounds(SplineChar *sc,DBounds *bounds, real ia) { + int ymin, ymax; + RefChar *rf; + + SplineCharFindBounds(sc,bounds); + + ymin = bounds->miny-1, ymax = bounds->maxy+1; + + if ( ia!=0 ) { + bounds->minx = bounds->maxx = 0; + + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + _SplineSetFindXRange(rf->layers[0].splines,bounds,ymin,ymax,ia); + + _SplineSetFindXRange(sc->layers[ly_fore].splines,bounds,ymin,ymax,ia); + } +return( ymin ); +} + +static int SCStemCheck(SplineFont *sf,int basech,DBounds *bb, DBounds *rbb,int pos) { + /* cedilla (and ogonec on A) should be centered underneath the left */ + /* (or right) vertical (or diagonal) stem. Here we try to find that */ + /* stem */ + StemInfo *h, *best; + SplineChar *sc; + DStemInfo *d, *dbest; + + sc = findchar(sf,basech); + if ( sc==NULL ) +return( 0x70000000 ); + if ( autohint_before_generate && sc->changedsincelasthinted && !sc->manualhints ) + SplineCharAutoHint(sc,true); + if ( (best=sc->vstem)!=NULL ) { + if ( pos&____CENTERLEFT ) { + for ( h=best->next; h!=NULL && h->startstart+best->width; h=h->next ) + if ( h->start+h->widthstart+best->width ) + best = h; + if ( best->start+best->width/2>(bb->maxx+bb->minx)/2 ) + best = NULL; + } else if ( pos&____CENTERLEFT ) { + while ( best->next!=NULL ) + best = best->next; + if ( best->start+best->width/2<(bb->maxx+bb->minx)/2 ) + best = NULL; + } else { + for ( h=best->next; h!=NULL ; h=h->next ) + if ( HIlen(h)>HIlen(best)) + best = h; + } + if ( best!=NULL ) +return( best->start + best->width/2 - (rbb->maxx-rbb->minx)/2 - rbb->minx ); + } + if ( (dbest=sc->dstem)!=NULL ) { + if ( pos&____CENTERLEFT ) { + for ( d=dbest->next; d!=NULL ; d=d->next ) + if ( d->rightedgebottom.xrightedgebottom.x ) + dbest = d; + if ( (dbest->leftedgebottom.x+dbest->rightedgebottom.x)/2>(bb->maxx+bb->minx)/2 ) + dbest = NULL; + } else { + for ( d=dbest->next; d!=NULL ; d=d->next ) + if ( d->leftedgebottom.x>dbest->leftedgebottom.x ) + dbest = d; + if ( (dbest->leftedgebottom.x+dbest->rightedgebottom.x)/2<(bb->maxx+bb->minx)/2 ) + dbest = NULL; + } + if ( dbest!=NULL ) +return( (dbest->leftedgebottom.x+dbest->rightedgebottom.x)/2 - (rbb->maxx-rbb->minx)/2 - rbb->minx ); + } +return( 0x70000000 ); +} + +static void _SCAddRef(SplineChar *sc,SplineChar *rsc,real transform[6]) { + RefChar *ref = RefCharCreate(); + + ref->sc = rsc; + ref->unicode_enc = rsc->unicodeenc; + ref->local_enc = rsc->enc; + ref->adobe_enc = getAdobeEnc(rsc->name); + ref->next = sc->layers[ly_fore].refs; + sc->layers[ly_fore].refs = ref; + memcpy(ref->transform,transform,sizeof(real [6])); + SCReinstanciateRefChar(sc,ref); + SCMakeDependent(sc,rsc); +} + +static void SCAddRef(SplineChar *sc,SplineChar *rsc,real xoff, real yoff) { + real transform[6]; + transform[0] = transform[3] = 1; + transform[1] = transform[2] = 0; + transform[4] = xoff; transform[5] = yoff; + _SCAddRef(sc,rsc,transform); +} + +static void BCClearAndCopy(BDFFont *bdf,int toenc,int fromenc) { + BDFChar *bc, *rbc; + + bc = BDFMakeChar(bdf,toenc); + BCPreserveState(bc); + BCFlattenFloat(bc); + BCCompressBitmap(bc); + if ( bdf->chars[fromenc]!=NULL ) { + rbc = bdf->chars[fromenc]; + free(bc->bitmap); + bc->xmin = rbc->xmin; + bc->xmax = rbc->xmax; + bc->ymin = rbc->ymin; + bc->ymax = rbc->ymax; + bc->bytes_per_line = rbc->bytes_per_line; + bc->width = rbc->width; + bc->bitmap = galloc(bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + memcpy(bc->bitmap,rbc->bitmap,bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + } +} + +static void BCClearAndCopyBelow(BDFFont *bdf,int toenc,int fromenc, int ymax) { + BDFChar *bc, *rbc; + + bc = BDFMakeChar(bdf,toenc); + BCPreserveState(bc); + BCFlattenFloat(bc); + BCCompressBitmap(bc); + if ( bdf->chars[fromenc]!=NULL ) { + rbc = bdf->chars[fromenc]; + free(bc->bitmap); + bc->xmin = rbc->xmin; + bc->xmax = rbc->xmax; + bc->ymin = rbc->ymin; + bc->ymax = ymax; + bc->bytes_per_line = rbc->bytes_per_line; + bc->width = rbc->width; + bc->bitmap = galloc(bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + memcpy(bc->bitmap,rbc->bitmap+(rbc->ymax-ymax)*rbc->bytes_per_line, + bc->bytes_per_line*(bc->ymax-bc->ymin+1)); + } +} + +static int BCFindGap(BDFChar *bc) { + int i,y; + + BCFlattenFloat(bc); + BCCompressBitmap(bc); + for ( y=bc->ymax; y>=bc->ymin; --y ) { + for ( i=0; ibytes_per_line; ++i ) + if ( bc->bitmap[(bc->ymax-y)*bc->bytes_per_line+i]!=0 ) + break; + if ( i==bc->bytes_per_line ) +return( y ); + } +return( bc->ymax ); +} + +static int SCMakeBaseReference(SplineChar *sc,SplineFont *sf,int ch, int copybmp) { + SplineChar *rsc; + BDFFont *bdf; + + rsc = findchar(sf,ch); + if ( rsc==NULL ) { + if ( ch==0x131 || ch==0xf6be ) { + if ( ch==0x131 ) ch='i'; else ch = 'j'; + rsc = findchar(sf,ch); + if ( rsc!=NULL && !sf->dotlesswarn ) { + GWidgetErrorR( _STR_MissingChar,ch=='i'?_STR_Missingdotlessi:_STR_Missingdotlessj); + sf->dotlesswarn = true; + } + } + if ( rsc==NULL ) +return( 0 ); + } + sc->width = rsc->width; + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + BCClearAndCopy(bdf,sc->enc,rsc->enc); + } + } + if ( ch!=' ' ) /* Some accents are built by combining with space. Don't. The reference won't be displayed or selectable but will be there and might cause confusion... */ + SCAddRef(sc,rsc,0,0); /* should be after the call to MakeChar */ +return( 1 ); +} + +static void SCCenterAccent(SplineChar *sc,SplineFont *sf,int ch, int copybmp, + real ia, int basech ) { + const unichar_t *apt, *end = apt; + int ach= -1; + int invert = false; + SplineChar *rsc; + real transform[6]; + DBounds bb, rbb, bbb; + real xoff, yoff; + real spacing = (sf->ascent+sf->descent)*accent_offset/100; + BDFChar *bc, *rbc; + int ixoff, iyoff, ispacing, pos; + BDFFont *bdf; + real ybase, italicoff; + const unichar_t *temp; + SplineChar *basersc=NULL; + int baserch = basech; + int eta; + AnchorPoint *ap1, *ap2; + + /* When we center an accent on Uhorn, we don't really want it centered */ + /* on the combination, we want it centered on "U". So if basech is itself*/ + /* a combo, find what it is based on */ + if ( (temp = SFGetAlternate(sf,basech,NULL,false))!=NULL && haschar(sf,*temp)) + baserch = *temp; + /* Similarly in Ø or ø, we really want to base the accents on O or o */ + if ( baserch==0xf8 ) baserch = 'o'; + else if ( baserch==0xd8 ) baserch = 'O'; + + /* cedilla on lower "g" becomes a turned comma above it */ + if ( ch==0x327 && basech=='g' && haschar(sf,0x312)) + ch = 0x312; + apt = accents[ch-BottomAccent]; end = apt+3; + if ( ch>=BottomAccent && ch<=TopAccent ) { + while ( *apt && aptunicodeenc || ( basersc = findchar(sf,basech))==NULL ) + basersc = sc; + + transform[0] = transform[3] = 1; + transform[1] = transform[2] = transform[4] = transform[5] = 0; + + if ( sc->layers[ly_fore].refs!=NULL && sc->layers[ly_fore].refs->next!=NULL && + (AnchorClassMkMkMatch(sc->layers[ly_fore].refs->sc,rsc,&ap1,&ap2)!=NULL || + AnchorClassCursMatch(sc->layers[ly_fore].refs->sc,rsc,&ap1,&ap2)!=NULL) ) { + /* Do we have a mark to mark attachment to the last anchor we added? */ + /* (or a cursive exit to entry match?) */ + /* If so then figure offsets relative to it. */ + xoff = ap1->me.x-ap2->me.x + sc->layers[ly_fore].refs->transform[4]; + yoff = ap1->me.y-ap2->me.y + sc->layers[ly_fore].refs->transform[5]; + } else if ( AnchorClassMatch(basersc,rsc,(AnchorClass *) -1,&ap1,&ap2)!=NULL && ap2->type==at_mark ) { + xoff = ap1->me.x-ap2->me.x; + yoff = ap1->me.y-ap2->me.y; + } else { + /* try to establish a common line on which all accents lie. The problem being*/ + /* that an accent above a,e,o will usually be slightly higher than an accent */ + /* above i or u, similarly for upper case. Letters with ascenders shouldn't */ + /* have much of a problem because ascenders are (usually) all the same shape*/ + /* Obviously this test is only meaningful for latin,greek,cyrillic alphas */ + /* hence test for isupper,islower. And I'm assuming greek,cyrillic will */ + /* be consistant with latin */ + if ( islower(basech) || isupper(basech)) { + SplineChar *common = findchar(sf,islower(basech)?'o':'O'); + if ( common!=NULL ) { + real top = SplineCharQuickTop(common); + if ( bb.maxy=0x1f20 && basech<=0x1f27) || basech==0x1f74 || basech==0x1f75 || basech==0x3b7 || basech==0x3ae) && + ch==0x345 ) { + bb.miny = 0; /* ypogegrammeni rides below baseline, not below bottom stem */ + eta = true; + if ( basersc!=NULL && basersc->vstem!=NULL ) { + bb.minx = basersc->vstem->start; + bb.maxx = bb.minx + basersc->vstem->width; + } else + bb.maxx -= (bb.maxx-bb.minx)/3; /* Should also be centered on left stem of eta, but I don't know how to do that..., hence this hack */ + } + + if ( invert ) { + /* this transform does a vertical flip from the vertical midpoint of the breve */ + transform[3] = -1; + transform[5] = rbb.maxy+rbb.miny; + } + pos = ____utype2[1+ch]; + /* In greek, PSILI and friends are centered above lower case, and kern left*/ + /* for upper case */ + if (( basech>=0x390 && basech<=0x3ff) || (basech>=0x1f00 && basech<=0x1fff)) { + if ( ( basech==0x1fbf || basech==0x1fef || basech==0x1ffe ) && + (ch==0x1fbf || ch==0x1fef || ch==0x1ffe || ch==0x1fbd || ch==0x1ffd )) { + pos = ____ABOVE|____RIGHT; + } else if ( isupper(basech) && + (ch==0x313 || ch==0x314 || ch==0x301 || ch==0x300 || ch==0x30d || + ch==0x1ffe || ch==0x1fbf || ch==0x1fcf || ch==0x1fdf || + ch==0x1fbd || ch==0x1fef || ch==0x1ffd || + ch==0x1fcd || ch==0x1fdd || ch==0x1fce || ch==0x1fde ) ) + pos = ____ABOVE|____LEFT; + else if ( isupper(basech) && ch==0x1fbe ) + pos = ____RIGHT; + else if ( ch==0x1fcd || ch==0x1fdd || ch==0x1fce || ch==0x1fde || + ch==0x1ffe || ch==0x1fbf || ch==0x1fcf || ch==0x1fdf ) + pos = ____ABOVE; + } else if ( (basech==0x1ffe || basech==0x1fbf) && (ch==0x301 || ch==0x300)) + pos = ____RIGHT; + else if ( sc->unicodeenc==0x1fbe && ch==0x345 ) + pos = ____RIGHT; + else if ( basech=='l' && ch==0xb7 ) + pos = ____RIGHT|____OVERSTRIKE; + else if ( ch==0xb7 ) + pos = ____OVERSTRIKE; + else if ( basech=='A' && ch==0x30a ) /* Aring usually touches */ + pos = ____ABOVE|____TOUCHING; + else if (( basech=='A' || basech=='a' || basech=='E' || basech=='u' ) && + ch == 0x328 ) + pos = ____BELOW|____CENTERRIGHT|____TOUCHING; /* ogonek off to the right for these in polish (but not lc e) */ + else if (( basech=='N' || basech=='n' || basech=='K' || basech=='k' || basech=='R' || basech=='r' || basech=='H' || basech=='h' ) && + ch == 0x327 ) + pos = ____BELOW|____CENTERLEFT|____TOUCHING; /* cedilla off under left stem for these guys */ + if ( basech==0x391 && pos==(____ABOVE|____LEFT) ) { + bb.minx += (bb.maxx-bb.minx)/4; + } + if ( (sc->unicodeenc==0x1fbd || sc->unicodeenc==0x1fbf || + sc->unicodeenc==0x1ffe || sc->unicodeenc==0x1fc0 ) && + bb.maxy==0 && bb.miny==0 ) { + /* Building accents on top of space */ + bb.maxy = 7*sf->ascent/10; + } + + if ( (pos&____ABOVE) && (pos&(____LEFT|____RIGHT)) ) + yoff = bb.maxy - rbb.maxy; + else if ( pos&____ABOVE ) { + yoff = bb.maxy - rbb.miny; + if ( !( pos&____TOUCHING) ) + yoff += spacing; + } else if ( pos&____BELOW ) { + yoff = bb.miny - rbb.maxy; + if ( !( pos&____TOUCHING) ) + yoff -= spacing; + } else if ( pos&____OVERSTRIKE ) + yoff = bb.miny - rbb.miny + ((bb.maxy-bb.miny)-(rbb.maxy-rbb.miny))/2; + else /* If neither Above, Below, nor overstrike then should use the same baseline */ + yoff = bb.miny - rbb.miny; + + if ( pos&(____ABOVE|____BELOW) ) { + /* When we center an accent above an asymetric character like "C" we */ + /* should not pick the mid point of the char. Rather we should pick */ + /* the highest point (mostly anyway, there are exceptions) */ + if ( pos&____ABOVE ) { + static DBounds pointless; + if ( CharCenterHighest ) { + if ( basech!='b' && basech!='d' && basech!='h' && basech!='n' && basech!='r' && basech!=0xf8 && + basech!='B' && basech!='D' && basech!='L' && basech!=0xd8 ) + ybase = SCFindTopXRange(sc,&bb,ia); + if ( ((basech=='h' && ch==0x307) || /* dot over the stem in hdot */ + basech=='i' || basech=='j' || basech==0x131 || basech==0xf6be || + (basech=='k' && ch==0x301) || + (baserch=='L' && (ch==0x301 || ch==0x304)) || + basech=='l' || basech=='t' ) && + (xoff=SCStemCheck(sf,basech,&bb,&pointless,pos))!=0x70000000 ) + bb.minx = bb.maxx = xoff; /* While on "t" we should center over the stem */ + } + } else if ( ( pos&____BELOW ) && !eta ) + if ( CharCenterHighest ) + ybase = SCFindBottomXRange(sc,&bb,ia); + } + + if ( isupper(basech) && ch==0x342) /* While this guy rides above PSILI on left */ + xoff = bb.minx - rbb.minx; + else if ( pos&____LEFT ) + xoff = bb.minx - spacing - rbb.maxx; + else if ( pos&____RIGHT ) { + xoff = bb.maxx - rbb.minx+spacing/2; + if ( !( pos&____TOUCHING) ) + xoff += spacing; + } else { + if ( (pos&(____CENTERLEFT|____CENTERRIGHT)) && + (xoff=SCStemCheck(sf,basech,&bb,&rbb,pos))!=0x70000000 ) + /* Done */; + else if ( pos&____CENTERLEFT ) + xoff = bb.minx + (bb.maxx-bb.minx)/2 - rbb.maxx; + else if ( pos&____LEFTEDGE ) + xoff = bb.minx - rbb.minx; + else if ( pos&____CENTERRIGHT ) + xoff = bb.minx + (bb.maxx-bb.minx)/2 - rbb.minx; + else if ( pos&____RIGHTEDGE ) + xoff = bb.maxx - rbb.maxx; + else + xoff = bb.minx - rbb.minx + ((bb.maxx-bb.minx)-(rbb.maxx-rbb.minx))/2; + } + italicoff = 0; + if ( ia!=0 ) + xoff += (italicoff = tan(-ia)*(rbb.miny+yoff-ybase)); + } /* Anchor points */ + transform[4] = xoff; + /*if ( invert ) transform[5] -= yoff; else */transform[5] += yoff; + _SCAddRef(sc,rsc,transform); + if ( pos&____RIGHT ) + SCSynchronizeWidth(sc,sc->width + rbb.maxx-rbb.minx+spacing,sc->width,sf->fv); + + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( bdf->chars[rsc->enc]!=NULL && bdf->chars[sc->enc]!=NULL ) { + if ( (ispacing = (bdf->pixelsize*accent_offset+50)/100)<=1 ) ispacing = 2; + rbc = bdf->chars[rsc->enc]; + BCFlattenFloat(rbc); + BCCompressBitmap(rbc); + bc = bdf->chars[sc->enc]; + BCCompressBitmap(bc); + if ( (pos&____ABOVE) && (pos&(____LEFT|____RIGHT)) ) + iyoff = bc->ymax - rbc->ymax; + else if ( pos&____ABOVE ) + iyoff = bc->ymax + ispacing - rbc->ymin; + else if ( pos&____BELOW ) { + iyoff = bc->ymin - rbc->ymax; + if ( !( pos&____TOUCHING) ) + iyoff -= ispacing; + } else if ( pos&____OVERSTRIKE ) + iyoff = bc->ymin - rbc->ymin + ((bc->ymax-bc->ymin)-(rbc->ymax-rbc->ymin))/2; + else + iyoff = bc->ymin - rbc->ymin; + if ( isupper(basech) && ch==0x342) + ixoff = bc->xmin - rbc->xmin; + else if ( pos&____LEFT ) + ixoff = bc->xmin - ispacing - rbc->xmax; + else if ( pos&____RIGHT ) { + ixoff = bc->xmax - rbc->xmin + ispacing/2; + if ( !( pos&____TOUCHING) ) + ixoff += ispacing; + } else { + if ( pos&____CENTERLEFT ) + ixoff = bc->xmin + (bc->xmax-bc->xmin)/2 - rbc->xmax; + else if ( pos&____LEFTEDGE ) + ixoff = bc->xmin - rbc->xmin; + else if ( pos&____CENTERRIGHT ) + ixoff = bc->xmin + (bc->xmax-bc->xmin)/2 - rbc->xmin; + else if ( pos&____RIGHTEDGE ) + ixoff = bc->xmax - rbc->xmax; + else + ixoff = bc->xmin - rbc->xmin + ((bc->xmax-bc->xmin)-(rbc->xmax-rbc->xmin))/2; + } + ixoff += rint(italicoff*bdf->pixelsize/(real) (sf->ascent+sf->descent)); + BCPasteInto(bc,rbc,ixoff,iyoff, invert, false); + } + } + } +} + +static void SCPutRefAfter(SplineChar *sc,SplineFont *sf,int ch, int copybmp) { + SplineChar *rsc = findchar(sf,ch); + BDFFont *bdf; + BDFChar *bc, *rbc; + int full = sc->unicodeenc, normal = false, under = false/*, stationary=false*/; + DBounds bb, rbb; + real spacing = (sf->ascent+sf->descent)*accent_offset/100; + int ispacing; + + if ( full<0x1100 || full>0x11ff ) { + SCAddRef(sc,rsc,sc->width,0); + sc->width += rsc->width; + normal = true; + /* these two jamo (same consonant really) ride underneath (except sometimes) */ + /* So should the jungsong */ + } else if (( ch==0x110b && (full!=0x1135 && full!=0x1147 && full!=0x114d)) || + (ch==0x11bc && full!=0x11ee) || + full==0x1182 || full==0x1183 || full==0x1187 || (full==0x118b && ch==0x1173) || + full==0x118d || full==0x1193 || (full>=0x1195 && full<=0x1197) || + full==0x119d || full==0x11a0 ) { + SplineCharQuickBounds(sc,&bb); + SplineCharQuickBounds(rsc,&rbb); + SCAddRef(sc,rsc,(bb.maxx+bb.minx)/2-(rbb.maxx+rbb.minx)/2,bb.miny-spacing-rbb.maxy); + under = true; +#if 0 + /* And in these jungsung there is no movement at all (the jamo don't interact) */ + } else if (( full>=0x116a && full<=0x116c ) || (full>=0x116f && full<=0x1171) || + full==0x1174 || (full>=0x1176 && full<=0x1181) || (full>=0x1184 && full<=0x1186) || + (full>=0x1188 && full<=0x118c) || (full>=0x118e && full<=0x1192) || + full==0x1194 || (full>=0x119a && full<=0x119c) || full==0x119f || + full==0x11a1 ) { + SCAddRef(sc,rsc,0,0); + stationary = true; +#endif + } else { /* Jamo should snuggle right up to one another, and ignore the width */ + SplineCharQuickBounds(sc,&bb); + SplineCharQuickBounds(rsc,&rbb); + SCAddRef(sc,rsc,bb.maxx+spacing-rbb.minx,0); + } + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( bdf->chars[rsc->enc]!=NULL && bdf->chars[sc->enc]!=NULL ) { + rbc = bdf->chars[rsc->enc]; + bc = bdf->chars[sc->enc]; + BCFlattenFloat(rbc); + BCCompressBitmap(rbc); + BCCompressBitmap(bc); + if ( (ispacing = (bdf->pixelsize*accent_offset+50)/100)<=1 ) ispacing = 2; + if ( normal ) { + BCPasteInto(bc,rbc,bc->width,0,false, false); + bc->width += rbc->width; + } else if ( under ) { + BCPasteInto(bc,rbc,(bc->xmax+rbc->xmin-rbc->xmax-rbc->xmin)/2, + bc->ymin-ispacing-rbc->ymax,false, false); +#if 0 + } else if ( stationary ) { + BCPasteInto(bc,rbc,0,0,false, false); +#endif + } else { + BCPasteInto(bc,rbc,bc->xmax-ispacing-rbc->xmin,0,false, false); + } + } + } + } +} + +static void DoSpaces(SplineFont *sf,SplineChar *sc,int copybmp,FontView *fv) { + int width; + int enc = sc->unicodeenc; + int em = sf->ascent+sf->descent; + SplineChar *tempsc; + BDFChar *bc; + BDFFont *bdf; + + if ( iszerowidth(enc)) + width = 0; + else switch ( enc ) { + case 0x2000: case 0x2002: + width = em/2; + break; + case 0x2001: case 0x2003: + width = em; + break; + case 0x2004: + width = em/3; + break; + case 0x2005: + width = em/4; + break; + case 0x2006: + width = em/6; + break; + case 0x2009: + width = em/10; + break; + case 0x200a: + width = em/100; + break; + case 0x2007: + tempsc = findchar(sf,'0'); + if ( tempsc!=NULL && tempsc->layers[ly_fore].splines==NULL && tempsc->layers[ly_fore].refs==NULL ) tempsc = NULL; + if ( tempsc==NULL ) width = em/2; else width = tempsc->width; + break; + case 0x2008: + tempsc = findchar(sf,'.'); + if ( tempsc!=NULL && tempsc->layers[ly_fore].splines==NULL && tempsc->layers[ly_fore].refs==NULL ) tempsc = NULL; + if ( tempsc==NULL ) width = em/4; else width = tempsc->width; + break; + case ' ': + tempsc = findchar(sf,'I'); + if ( tempsc!=NULL && tempsc->layers[ly_fore].splines==NULL && tempsc->layers[ly_fore].refs==NULL ) tempsc = NULL; + if ( tempsc==NULL ) width = em/4; else width = tempsc->width; + break; + default: + width = em/3; + break; + } + + sc->width = width; + sc->widthset = true; + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( (bc = bdf->chars[sc->enc])==NULL ) { + BDFMakeChar(bdf,sc->enc); + } else { + BCPreserveState(bc); + BCFlattenFloat(bc); + BCCompressBitmap(bc); + free(bc->bitmap); + bc->xmin = 0; + bc->xmax = 1; + bc->ymin = 0; + bc->ymax = 1; + bc->bytes_per_line = 1; + bc->width = rint(width*bdf->pixelsize/(real) em); + bc->bitmap = gcalloc(bc->bytes_per_line*(bc->ymax-bc->ymin+1),sizeof(char)); + } + } + } + SCCharChangedUpdate(sc); + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( bdf->chars[sc->enc]!=NULL ) + BCCharChangedUpdate(bdf->chars[sc->enc]); + } +} + +static SplinePoint *MakeSP(real x, real y, SplinePoint *last,int order2) { + SplinePoint *new = chunkalloc(sizeof(SplinePoint)); + + new->me.x = x; new->me.y = y; + new->prevcp = new->nextcp = new->me; + new->noprevcp = new->nonextcp = true; + new->pointtype = pt_corner; + if ( last!=NULL ) + SplineMake(last,new,order2); +return( new ); +} + +static void DoRules(SplineFont *sf,SplineChar *sc,int copybmp,FontView *fv) { + int width; + int enc = sc->unicodeenc; + int em = sf->ascent+sf->descent; + SplineChar *tempsc; + BDFChar *bc, *tempbc; + BDFFont *bdf; + DBounds b; + real lbearing, rbearing, height, ypos; + SplinePoint *first, *sp; + + switch ( enc ) { + case '-': + width = em/3; + break; + case 0x2010: case 0x2011: + tempsc = findchar(sf,'-'); + if ( tempsc!=NULL && tempsc->layers[ly_fore].splines==NULL && tempsc->layers[ly_fore].refs==NULL ) tempsc = NULL; + if ( tempsc==NULL ) width = (4*em)/10; else width = tempsc->width; + break; + case 0x2012: + tempsc = findchar(sf,'0'); + if ( tempsc!=NULL && tempsc->layers[ly_fore].splines==NULL && tempsc->layers[ly_fore].refs==NULL ) tempsc = NULL; + if ( tempsc==NULL ) width = em/2; else width = tempsc->width; + break; + case 0x2013: + width = em/2; + break; + case 0x2014: case 0x30fc: + width = em; + break; + case 0x2015: /* French quotation dash */ + width = 2*em; + break; + default: + width = em/3; + break; + } + + tempsc = findchar(sf,'-'); + if ( tempsc==NULL || (tempsc->layers[ly_fore].splines==NULL && tempsc->layers[ly_fore].refs==NULL )) { + height = em/10; + lbearing = rbearing = em/10; + if ( lbearing+rbearing>2*width/3 ) + lbearing = rbearing = width/4; + ypos = em/4; + } else { + SplineCharFindBounds(tempsc,&b); + height = b.maxy-b.miny; + rbearing = tempsc->width - b.maxx; + lbearing = b.minx; + ypos = b.miny; + } + first = sp = MakeSP(lbearing,ypos,NULL,sf->order2); + sp = MakeSP(lbearing,ypos+height,sp,sf->order2); + sp = MakeSP(width-rbearing,ypos+height,sp,sf->order2); + sp = MakeSP(width-rbearing,ypos,sp,sf->order2); + SplineMake(sp,first,sf->order2); + sc->layers[ly_fore].splines = chunkalloc(sizeof(SplinePointList)); + sc->layers[ly_fore].splines->first = sc->layers[ly_fore].splines->last = first; + sc->width = width; + sc->widthset = true; + + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( (bc = bdf->chars[sc->enc])==NULL ) { + BDFMakeChar(bdf,sc->enc); + } else { + BCPreserveState(bc); + BCFlattenFloat(bc); + BCCompressBitmap(bc); + free(bc->bitmap); + tempbc = SplineCharRasterize(sc,bdf->pixelsize); + bc->xmin = tempbc->xmin; + bc->xmax = tempbc->xmax; + bc->ymin = tempbc->ymin; + bc->ymax = tempbc->ymax; + bc->bytes_per_line = tempbc->bytes_per_line; + bc->width = tempbc->width; + bc->bitmap = tempbc->bitmap; + free(tempbc); + } + } + } + SCCharChangedUpdate(sc); + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( bdf->chars[sc->enc]!=NULL ) + BCCharChangedUpdate(bdf->chars[sc->enc]); + } +} + +static void DoRotation(SplineFont *sf,SplineChar *sc,int copybmp,FontView *fv) { + /* In when laying CJK characters vertically and intermixed latin (greek,etc) */ + /* characters need to be rotated. Adobe's cid tables call for some */ + /* pre-rotated characters, so we might as well be prepared to deal with */ + /* them. Note the rotated and normal characters are often in different */ + /* subfonts so we can't use references */ + SplineChar *scbase; + real transform[6]; + SplineSet *last, *temp; + RefChar *ref; + BDFFont *bdf; + char *end; + int j,cid; + + if ( sf->cidmaster!=NULL && strncmp(sc->name,"vertcid_",8)==0 ) { + cid = strtol(sc->name+8,&end,10), j; + if ( *end!='\0' || (j=SFHasCID(sf,cid))==-1) +return; /* Can't happen */ + scbase = sf->cidmaster->subfonts[j]->chars[cid]; + } else if ( sf->cidmaster!=NULL && + (strncmp(sc->name,"cid-",4)==0 && strstr(sc->name,".vert")!=NULL) ) { + cid = strtol(sc->name+4,&end,10); + if ( *end!='.' || (j=SFHasCID(sf,cid))==-1) +return; /* Can't happen */ + scbase = sf->cidmaster->subfonts[j]->chars[cid]; + } else { + if ( strncmp(sc->name,"vertuni",7)==0 && strlen(sc->name)==11 ) { + char *end; + int uni = strtol(sc->name+7,&end,16), index; + if ( *end!='\0' || (index = SFCIDFindExistingChar(sf,uni,NULL))==-1 ) +return; /* Can't happen */ + } else if ( strncmp(sc->name,"uni",3)==0 && strstr(sc->name,".vert")!=NULL ) { + int uni = strtol(sc->name+3,&end,16); + if ( *end!='.' || (cid = SFCIDFindExistingChar(sf,uni,NULL))==-1 ) +return; + } else if ( sc->name[0]=='u' && strstr(sc->name,".vert")!=NULL ) { + int uni = strtol(sc->name+1,&end,16); + if ( *end!='.' || (cid = SFCIDFindExistingChar(sf,uni,NULL))==-1 ) +return; + } else if ( strstr(sc->name,".vert")!=NULL || strstr(sc->name,".vrt2")!=NULL) { + char *temp; + end = strchr(sc->name,'.'); + temp = copyn(sc->name,end-sc->name); + cid = SFFindExistingChar(sf,-1,temp); + free(temp); + if ( cid==-1 ) +return; + } + if ( sf->cidmaster==NULL ) + scbase = sf->chars[cid]; + else + scbase = sf->cidmaster->subfonts[SFHasCID(sf,cid)]->chars[cid]; + } + + if ( scbase->parent->vertical_origin==0 ) + scbase->parent->vertical_origin = scbase->parent->ascent; + transform[0] = transform[3] = 0; + transform[1] = -1; transform[2] = 1; + transform[4] = scbase->parent->descent; transform[5] = scbase->parent->vertical_origin; + + sc->layers[ly_fore].splines = SplinePointListTransform(SplinePointListCopy(scbase->layers[ly_fore].splines), + transform, true ); + if ( sc->layers[ly_fore].splines==NULL ) last = NULL; + else for ( last = sc->layers[ly_fore].splines; last->next!=NULL; last = last->next ); + + for ( ref = scbase->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + temp = SplinePointListTransform(SplinePointListCopy(ref->layers[0].splines), + transform, true ); + if ( last==NULL ) + sc->layers[ly_fore].splines = temp; + else + last->next = temp; + if ( temp!=NULL ) + for ( last=temp; last->next!=NULL; last=last->next ); + } + sc->width = sc->parent->ascent+sc->parent->descent; + SCCharChangedUpdate(sc); + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + BDFChar *from, *to; + if ( scbase->enc>=bdf->charcnt || sc->enc>=bdf->charcnt || + bdf->chars[scbase->enc]==NULL ) + continue; + from = bdf->chars[scbase->enc]; + to = BDFMakeChar(bdf,sc->enc); + BCRotateCharForVert(to,from,bdf); + BCCharChangedUpdate(to); + } + } +} + +static int SCMakeRightToLeftLig(SplineChar *sc,SplineFont *sf, + const unichar_t *start,int copybmp) { + int cnt = u_strlen(start); + GBiText bd; + int ret, ch; + unichar_t *pt, *end, *freeme=NULL; + static unichar_t final_lamalef[] = { 0xFE8E, 0xfee0, 0 }, isolated_lamalef[] = { 0xFE8E ,0xfedf, 0 }; + /* Bugs: Doesn't handle accents, and there are some in arabic ligs */ + + /* Deal with arabic ligatures which are not isolated */ + if ( isarabinitial(sc->unicodeenc) || isarabmedial(sc->unicodeenc) || + isarabfinal(sc->unicodeenc)) { + ++cnt; + if ( isarabmedial(sc->unicodeenc)) ++cnt; + freeme = galloc((cnt+1)*sizeof(unichar_t)); + if ( isarabinitial(sc->unicodeenc)) { + u_strcpy(freeme,start); + freeme[cnt-2] = 0x200d; freeme[cnt-1] = 0; + } else { + *freeme = 0x200d; + u_strcpy(freeme+1,start); + if ( isarabmedial(sc->unicodeenc)) { + freeme[cnt-2] = 0x200d; + freeme[cnt-1] = 0; + } + } + start = freeme; + } + + ++cnt; /* for EOS */ + bd.text = galloc(cnt*sizeof(unichar_t)); + bd.level = galloc(cnt*sizeof(uint8)); + bd.override = galloc(cnt*sizeof(uint8)); + bd.type = galloc(cnt*sizeof(uint16)); + bd.original = galloc(cnt*sizeof(unichar_t *)); + --cnt; + bd.len = cnt; + bd.base_right_to_left = true; + GDrawBiText1(&bd,start,cnt); + GDrawBiText2(&bd,0,cnt); + + ret = false; + pt = bd.text; end = pt+cnt; + if ( *pt==0x200d ) ++pt; + /* The arabic encoder knows about two ligs. So if we pass in either of*/ + /* those two we will get out itself. We want it decomposed so undo */ + /* the process */ + if ( sc->unicodeenc==0xfedf ) + pt = isolated_lamalef; + else if ( sc->unicodeenc==0xfee0 ) + pt = final_lamalef; + if ( SCMakeBaseReference(sc,sf,*pt,copybmp) ) { + for ( ++pt; ptwidth = 0; + while ( *pt ) { + rsc = findchar(sf,*pt++); + if ( rsc!=NULL ) { + SCAddRef(sc,rsc,0,0); + if ( rsc->width>sc->width ) sc->width = rsc->width; + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( first ) + BCClearAndCopy(bdf,sc->enc,rsc->enc); + else if ( bdf->chars[rsc->enc]!=NULL ) + BCPasteInto(BDFMakeChar(bdf,sc->enc),bdf->chars[rsc->enc], + 0,0, false, false); + } + } + first = false; + } + } +} + +int SCMakeDotless(SplineFont *sf, SplineChar *dotless, int copybmp, int doit) { + SplineChar *sc, *xsc; + BlueData bd; + SplineSet *head, *last=NULL, *test, *cur, *next; + DBounds b; + BDFFont *bdf; + BDFChar *bc; + + if ( dotless==NULL ) +return( 0 ); + if ( dotless->unicodeenc!=0x131 && dotless->unicodeenc!=0xf6be ) +return( 0 ); + sc = SFGetChar(sf,dotless->unicodeenc==0xf6be?'j':'i',NULL); + xsc = SFGetChar(sf,'x',NULL); + if ( sc==NULL || sc->layers[ly_fore].splines==NULL || sc->layers[ly_fore].refs!=NULL || xsc==NULL ) +return( 0 ); + QuickBlues(sf,&bd); + if ( bd.xheight==0 ) +return( 0 ); + for ( test=sc->layers[ly_fore].splines; test!=NULL; test=test->next ) { + next = test->next; test->next = NULL; + SplineSetQuickBounds(test,&b); + test->next = next; + if ( b.miny < bd.xheight ) { + if ( !doit ) +return( true ); + cur = SplinePointListCopy1(test); + if ( last==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + } + if ( head==NULL ) +return( 0 ); + + SCPreserveState(dotless,true); + SplinePointListsFree(dotless->layers[ly_fore].splines); + dotless->layers[ly_fore].splines = NULL; + SCRemoveDependents(dotless); + dotless->width = sc->width; + dotless->layers[ly_fore].splines = head; + SCCharChangedUpdate(dotless); + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if (( bc = bdf->chars[sc->enc])!=NULL ) { + BCClearAndCopyBelow(bdf,dotless->enc,sc->enc,BCFindGap(bc)); + } + } + +return( true ); +} + +void SCBuildComposit(SplineFont *sf, SplineChar *sc, int copybmp,FontView *fv) { + const unichar_t *pt, *apt; unichar_t ch; + BDFFont *bdf; + real ia; + /* This does not handle arabic ligatures at all. It would need to reverse */ + /* the string and deal with , , etc. info we don't have */ + + if ( !SFIsSomethingBuildable(sf,sc,false)) +return; + SCPreserveState(sc,true); + SplinePointListsFree(sc->layers[ly_fore].splines); + sc->layers[ly_fore].splines = NULL; + SCRemoveDependents(sc); + sc->width = 0; + + if ( iszerowidth(sc->unicodeenc) || (sc->unicodeenc>=0x2000 && sc->unicodeenc<=0x200f )) { + DoSpaces(sf,sc,copybmp,fv); +return; + } else if ( sc->unicodeenc>=0x2010 && sc->unicodeenc<=0x2015 ) { + DoRules(sf,sc,copybmp,fv); +return; + } else if ( SFIsRotatable(sf,sc) ) { + DoRotation(sf,sc,copybmp,fv); +return; + } else if ( sc->unicodeenc==0x131 || sc->unicodeenc==0xf6be ) { + SCMakeDotless(sf, sc, copybmp, true); +return; + } + + if (( ia = sf->italicangle )==0 ) + ia = SFGuessItalicAngle(sf); + ia *= 3.1415926535897932/180; + + pt= SFGetAlternate(sf,sc->unicodeenc,sc,false); + ch = *pt++; + if ( ch=='i' || ch=='j' || ch==0x456 ) { + /* if we're combining i (or j) with an accent that would interfere */ + /* with the dot, then get rid of the dot. (use dotlessi) */ + for ( apt = pt; *apt && combiningposmask(*apt)!=____ABOVE; ++apt); + if ( *apt!='\0' ) { + if ( ch=='i' || ch==0x456 ) ch = 0x0131; + else if ( ch=='j' ) { + if ( haschar(sf,0x237) ) ch = 0x237; /* Proposed dotlessj */ + else ch = 0xf6be; /* Adobe's private use dotless j */ + } + } + } + if ( sc->unicodeenc>=0xac00 && sc->unicodeenc<=0xd7a3 ) + SCBuildHangul(sf,sc,pt-1,copybmp); + else if ( isrighttoleft(ch) && !iscombining(*pt)) { + SCMakeRightToLeftLig(sc,sf,pt-1,copybmp); + } else { + if ( !SCMakeBaseReference(sc,sf,ch,copybmp) ) +return; + while ( iscombining(*pt) || (ch!='l' && *pt==0xb7) || /* b7, centered dot is used as a combining accent for Ldot but as a lig for ldot */ + *pt==0x385 || (*pt>=0x1fbd && *pt<=0x1fff )) /* Special greek accents */ + SCCenterAccent(sc,sf,*pt++,copybmp,ia, ch); + while ( *pt ) + SCPutRefAfter(sc,sf,*pt++,copybmp); + } + SCCharChangedUpdate(sc); + if ( copybmp ) { + for ( bdf=sf->cidmaster?sf->cidmaster->bitmaps:sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( bdf->chars[sc->enc]!=NULL ) + BCCharChangedUpdate(bdf->chars[sc->enc]); + } +return; +} diff --git a/fontforge/fvfonts.c b/fontforge/fvfonts.c new file mode 100644 index 00000000..884a68a4 --- /dev/null +++ b/fontforge/fvfonts.c @@ -0,0 +1,1480 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "ustring.h" +#include "utype.h" +#include "gfile.h" +#include "chardata.h" + +static RefChar *RefCharsCopy(RefChar *ref) { + RefChar *rhead=NULL, *last=NULL, *cur; + + while ( ref!=NULL ) { + cur = RefCharCreate(); +#ifdef FONTFORGE_CONFIG_TYPE3 + { struct reflayer *layers = cur->layers; int layer; + layers = grealloc(layers,ref->layer_cnt*sizeof(struct reflayer)); + memcpy(layers,ref->layers,ref->layer_cnt*sizeof(struct reflayer)); + *cur = *ref; + cur->layers = layers; + for ( layer=0; layerlayer_cnt; ++layer ) { + cur->layers[layer].splines = NULL; + cur->layers[layer].images = NULL; + } + } +#else + *cur = *ref; + cur->layers[0].splines = NULL; /* Leave the old sc, we'll fix it later */ +#endif + cur->next = NULL; + if ( rhead==NULL ) + rhead = cur; + else + last->next = cur; + last = cur; + ref = ref->next; + } +return( rhead ); +} + + +static int FixupSLI(int sli,SplineFont *from,SplineChar *sc) { + SplineFont *to = sc->parent; + int i,j,k; + + /* Find a script lang index in the new font which matches that of the old */ + /* font. There are some cases when we don't know what the old font was. */ + /* well, just make a reasonable guess */ + + if ( from==NULL ) +return( SFAddScriptLangIndex(to,SCScriptFromUnicode(sc),DEFAULT_LANG)); + if ( from->cidmaster ) from = from->cidmaster; + if ( to->cidmaster ) to = to->cidmaster; + if ( from==to ) +return( sli ); + + /* does the new font have exactly what we want? */ + i = 0; + if ( to->script_lang!=NULL ) { + for ( i=0; to->script_lang[i]!=NULL; ++i ) { + for ( j=0; to->script_lang[i][j].script!=0 && + to->script_lang[i][j].script==from->script_lang[sli][j].script; ++j ) { + for ( k=0; to->script_lang[i][j].langs[k]!=0 && + to->script_lang[i][j].langs[k]==from->script_lang[sli][j].langs[k]; ++k ); + if ( to->script_lang[i][j].langs[k]!=0 || from->script_lang[sli][j].langs[k]!=0 ) + break; + } + if ( to->script_lang[i][j].script==0 && from->script_lang[sli][j].script==0 ) +return( i ); + } + } + + /* Add it */ + if ( to->script_lang==NULL ) + to->script_lang = galloc(2*sizeof(struct script_record *)); + else + to->script_lang = grealloc(to->script_lang,(i+2)*sizeof(struct script_record *)); + to->script_lang[i+1] = NULL; + for ( j=0; from->script_lang[sli][j].script!=0; ++j ); + to->script_lang[i] = galloc((j+1)*sizeof(struct script_record)); + for ( j=0; from->script_lang[sli][j].script!=0; ++j ) { + to->script_lang[i][j].script = from->script_lang[sli][j].script; + for ( k=0; from->script_lang[sli][j].langs[k]!=0; ++k ); + to->script_lang[i][j].langs = galloc((k+1)*sizeof(uint32)); + for ( k=0; from->script_lang[sli][j].langs[k]!=0; ++k ) + to->script_lang[i][j].langs[k] = from->script_lang[sli][j].langs[k]; + to->script_lang[i][j].langs[k] = 0; + } + to->script_lang[i][j].script = 0; +return( i ); +} + +PST *PSTCopy(PST *base,SplineChar *sc,SplineFont *from) { + PST *head=NULL, *last=NULL, *cur; + + for ( ; base!=NULL; base = base->next ) { + cur = chunkalloc(sizeof(PST)); + *cur = *base; + if ( from!=sc->parent && base->script_lang_indexscript_lang_index = FixupSLI(cur->script_lang_index,from,sc); + if ( cur->type==pst_ligature ) { + cur->u.lig.components = copy(cur->u.lig.components); + cur->u.lig.lig = sc; + } else if ( cur->type==pst_lcaret ) { + cur->u.lcaret.carets = galloc(cur->u.lcaret.cnt*sizeof(uint16)); + memcpy(cur->u.lcaret.carets,base->u.lcaret.carets,cur->u.lcaret.cnt*sizeof(uint16)); + } else if ( cur->type==pst_substitution || cur->type==pst_multiple || cur->type==pst_alternate ) + cur->u.subs.variant = copy(cur->u.subs.variant); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } +return( head ); +} + +SplineChar *SplineCharCopy(SplineChar *sc,SplineFont *into) { + SplineChar *nsc = SplineCharCreate(); +#ifdef FONTFORGE_CONFIG_TYPE3 + Layer *layers = nsc->layers; + int layer; + + *nsc = *sc; + if ( sc->layer_cnt!=2 ) + layers = grealloc(layers,sc->layer_cnt*sizeof(Layer)); + memcpy(layers,sc->layers,sc->layer_cnt*sizeof(Layer)); + nsc->layers = layers; + for ( layer = ly_fore; layerlayer_cnt; ++layer ) { + layers[layer].splines = SplinePointListCopy(layers[layer].splines); + layers[layer].refs = RefCharsCopy(layers[layer].refs); + layers[layer].images = ImageListCopy(layers[layer].images); + layers[layer].undoes = NULL; + layers[layer].redoes = NULL; + } +#else + *nsc = *sc; + nsc->layers[ly_fore].splines = SplinePointListCopy(nsc->layers[ly_fore].splines); + nsc->layers[ly_fore].refs = RefCharsCopy(nsc->layers[ly_fore].refs); +#endif + nsc->parent = into; + nsc->enc = -2; + nsc->name = copy(sc->name); + nsc->hstem = StemInfoCopy(nsc->hstem); + nsc->vstem = StemInfoCopy(nsc->vstem); + nsc->dstem = DStemInfoCopy(nsc->dstem); + nsc->md = MinimumDistanceCopy(nsc->md); + nsc->views = NULL; + nsc->changed = true; + nsc->dependents = NULL; /* Fix up later when we know more */ + nsc->layers[ly_back].splines = NULL; + nsc->layers[ly_back].images = NULL; + nsc->layers[ly_fore].undoes = nsc->layers[ly_back].undoes = NULL; + nsc->layers[ly_fore].redoes = nsc->layers[ly_back].redoes = NULL; + nsc->kerns = NULL; + nsc->possub = PSTCopy(nsc->possub,nsc,sc->parent); + if ( sc->parent!=NULL && into->order2!=sc->parent->order2 ) + SCConvertOrder(nsc,into->order2); +return(nsc); +} + +static KernPair *KernsCopy(KernPair *kp,int *mapping,SplineFont *into,SplineFont *from) { + KernPair *head = NULL, *last=NULL, *new; + int index; + + while ( kp!=NULL ) { + if ( (index=mapping[kp->sc->enc])>=0 && indexcharcnt && + into->chars[index]!=NULL ) { + new = chunkalloc(sizeof(KernPair)); + new->off = kp->off; + new->sli = kp->sli; + new->sc = into->chars[index]; + if ( head==NULL ) + head = new; + else + last->next = new; + last = new; + } + kp = kp->next; + } +return( head ); +} + +BDFChar *BDFCharCopy(BDFChar *bc) { + BDFChar *nbc = galloc(sizeof( BDFChar )); + + *nbc = *bc; + nbc->views = NULL; + nbc->selection = NULL; + nbc->undoes = NULL; + nbc->redoes = NULL; + nbc->bitmap = galloc((nbc->ymax-nbc->ymin+1)*nbc->bytes_per_line); + memcpy(nbc->bitmap,bc->bitmap,(nbc->ymax-nbc->ymin+1)*nbc->bytes_per_line); +return( nbc ); +} + +void BitmapsCopy(SplineFont *to, SplineFont *from, int to_index, int from_index ) { + BDFFont *f_bdf, *t_bdf; + + /* We assume that the bitmaps are ordered. They should be */ + for ( t_bdf=to->bitmaps, f_bdf=from->bitmaps; t_bdf!=NULL && f_bdf!=NULL; ) { + if ( t_bdf->pixelsize == f_bdf->pixelsize ) { + if ( f_bdf->chars[from_index]!=NULL ) { + BDFCharFree(t_bdf->chars[to_index]); + t_bdf->chars[to_index] = BDFCharCopy(f_bdf->chars[from_index]); + t_bdf->chars[to_index]->sc = to->chars[to_index]; + t_bdf->chars[to_index]->enc = to_index; + } + t_bdf = t_bdf->next; + f_bdf = f_bdf->next; + } else if ( t_bdf->pixelsize < f_bdf->pixelsize ) + t_bdf = t_bdf->next; + + f_bdf = f_bdf->next; + } +} + +#define GN_HSIZE 257 + +struct glyphnamebucket { + SplineChar *sc; + struct glyphnamebucket *next; +}; + +struct glyphnamehash { + struct glyphnamebucket *table[GN_HSIZE]; +}; + +#ifndef __GNUC__ +# define __inline__ +#endif + +static __inline__ int hashname(const char *pt) { + int val = 0; + + while ( *pt ) + val += *pt++; + val %= GN_HSIZE; +return( val ); +} + +static void _GlyphHashFree(SplineFont *sf) { + struct glyphnamebucket *test, *next; + int i; + + if ( sf->glyphnames==NULL ) +return; + for ( i=0; iglyphnames->table[i]; test!=NULL; test = next ) { + next = test->next; + chunkfree(test,sizeof(struct glyphnamebucket)); + } + } + free(sf->glyphnames); + sf->glyphnames = NULL; +} + +void GlyphHashFree(SplineFont *sf) { + _GlyphHashFree(sf); + if ( sf->cidmaster ) + _GlyphHashFree(sf->cidmaster); +} + +static void GlyphHashCreate(SplineFont *sf) { + int i, k, hash; + SplineFont *_sf; + struct glyphnamehash *gnh; + struct glyphnamebucket *new; + + if ( sf->glyphnames!=NULL ) +return; + sf->glyphnames = gnh = gcalloc(1,sizeof(*gnh)); + k = 0; + do { + _sf = ksubfontcnt ? sf->subfonts[k] : sf; + /* I walk backwards because there are some ttf files where multiple */ + /* glyphs get the same name. In the cases I've seen only one of these */ + /* has an encoding. That's the one we want. It will be earlier in the */ + /* font than the others. If we build the list backwards then it will */ + /* be the top name in the bucket, and will be the one we return */ + for ( i=_sf->charcnt-1; i>=0; --i ) if ( _sf->chars[i]!=NULL ) { + new = chunkalloc(sizeof(struct glyphnamebucket)); + new->sc = _sf->chars[i]; + hash = hashname(new->sc->name); + new->next = gnh->table[hash]; + gnh->table[hash] = new; + } + ++k; + } while ( ksubfontcnt ); +} + +static SplineChar *SFHashName(SplineFont *sf,char *name) { + struct glyphnamebucket *test; + + if ( sf->glyphnames==NULL ) + GlyphHashCreate(sf); + + for ( test=sf->glyphnames->table[hashname(name)]; test!=NULL; test = test->next ) + if ( strcmp(test->sc->name,name)==0 ) +return( test->sc ); + +return( NULL ); +} + +static int _SFFindChar(SplineFont *sf, int unienc, char *name ) { + int index= -1; + + if ( (sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4) && + unienc!=-1 ) { + index = unienc; + if ( index>=sf->charcnt || sf->chars[index]==NULL ) + index = -1; + } else if ( (sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax) && + unienc!=-1 ) { + index = unienc-((sf->encoding_name-em_unicodeplanes)<<16); + if ( index<0 || index>=sf->charcnt || sf->chars[index]==NULL ) + index = -1; + } else if ( unienc!=-1 ) { + if ( unienccharcnt && sf->chars[unienc]!=NULL && + sf->chars[unienc]->unicodeenc==unienc ) + index = unienc; + else for ( index = sf->charcnt-1; index>=0; --index ) if ( sf->chars[index]!=NULL ) { + if ( sf->chars[index]->unicodeenc==unienc ) + break; + } + } else { + SplineChar *sc = SFHashName(sf,name); + if ( sc==NULL ) + /* Do nothing */; + else if ( sc->enc!=-2 ) + index = sc->enc; + else { + for ( index = sf->charcnt-1; index>=0; --index ) + if ( sf->chars[index]==sc ) + break; + } + } +return( index ); +} + +int SFFindChar(SplineFont *sf, int unienc, char *name ) { + int index=-1; + char *end; + + if ( (sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4) && + unienc!=-1 ) { + index = unienc; + if ( index>=sf->charcnt ) + index = -1; + } else if ( (sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax) && + unienc!=-1 ) { + index = unienc-((sf->encoding_name-em_unicodeplanes)<<16); + if ( index<0 || index>=sf->charcnt || sf->chars[index]==NULL ) + index = -1; + } else if ( unienc!=-1 ) { + if ( unienccharcnt && sf->chars[unienc]!=NULL && + sf->chars[unienc]->unicodeenc==unienc ) + index = unienc; + else for ( index = sf->charcnt-1; index>=0; --index ) if ( sf->chars[index]!=NULL ) { + if ( sf->chars[index]->unicodeenc==unienc ) + break; + } + } else if ( name!=NULL ) { + SplineChar *sc = SFHashName(sf,name); + if ( sc!=NULL ) index = sc->enc; + if ( index==-1 ) { + if ( name[0]=='u' && name[1]=='n' && name[2]=='i' && strlen(name)==7 ) { + if ( unienc=strtol(name+3,&end,16), *end!='\0' ) + unienc = -1; + } else if ( name[0]=='u' && strlen(name)<=7 ) { + if ( unienc=strtol(name+1,&end,16), *end!='\0' ) + unienc = -1; + } + if ( unienc!=-1 ) +return( SFFindChar(sf,unienc,NULL)); + for ( unienc=psunicodenames_cnt-1; unienc>=0; --unienc ) + if ( psunicodenames[unienc]!=NULL && + strcmp(psunicodenames[unienc],name)==0 ) +return( SFFindChar(sf,unienc,NULL)); + } + } + + /* Ok. The character is not in the font, but that might be because the font */ + /* has a hole. check to see if it is in the encoding */ + if ( index==-1 && unienc>=0 && unienc<=65535 && sf->encoding_name!=em_none ) { + if ( sf->encoding_name==em_none ) + index = -1; + else if ( sf->encoding_name>=em_base ) { + Encoding *item=NULL; + for ( item=enclist; item!=NULL && item->enc_num!=sf->encoding_name; item=item->next ); + if ( item!=NULL ) { + for ( index=item->char_cnt-1; index>=0; --index ) + if ( item->unicode[index]==unienc ) + break; + } + } else if ( sf->encoding_name==em_adobestandard ) { + for ( index=255; index>=0; --index ) + if ( unicode_from_adobestd[index]==unienc ) + break; + } else if ( sf->encoding_nameencoding_name+3]; + for ( index=255; index>=0; --index ) + if ( table[index]==unienc ) + break; + } else { + struct charmap2 *table2 = NULL; + unsigned short *plane2; + int highch, temp; + + if ( sf->encoding_name==em_jis208 || sf->encoding_name==em_jis212 || + sf->encoding_name==em_sjis ) + table2 = &jis_from_unicode; + else if ( sf->encoding_name==em_gb2312 || sf->encoding_name==em_jisgb ) + table2 = &gb2312_from_unicode; + else if ( sf->encoding_name==em_ksc5601 || sf->encoding_name==em_wansung ) + table2 = &ksc5601_from_unicode; + else if ( sf->encoding_name==em_big5 ) + table2 = &big5_from_unicode; + else if ( sf->encoding_name==em_big5hkscs ) + table2 = &big5hkscs_from_unicode; + else if ( sf->encoding_name==em_johab ) + table2 = &johab_from_unicode; + if ( table2!=NULL ) { + highch = unienc>>8; + if ( highch>=table2->first && highch<=table2->last && + (plane2 = table2->table[highch-table2->first])!=NULL && + (temp=plane2[unienc&0xff])!=0 ) { + index = temp; + if ( sf->encoding_name==em_jis212 ) { + if ( !(index&0x8000 ) ) + index=-1; + else + index &= 0x8000; + } else if ( (sf->encoding_name==em_jis208 || sf->encoding_name==em_sjis ) && + (index&0x8000) ) + index = -1; + } else if ( unienc<0x80 && + (sf->encoding_name==em_big5 || sf->encoding_name==em_big5hkscs || + sf->encoding_name==em_johab || sf->encoding_name==em_jisgb || + sf->encoding_name==em_sjis || sf->encoding_name==em_wansung )) + index = unienc; + else if ( sf->encoding_name==em_sjis && unienc>=0xFF61 && + unienc<=0xFF9F ) + index = unienc-0xFF61 + 0xa1; /* katakana */ + if ( index>0x100 && + (sf->encoding_name==em_jis208 || sf->encoding_name==em_jis212 || + sf->encoding_name==em_ksc5601 || sf->encoding_name==em_gb2312 )) { + index -= 0x2121; + index = (index>>8)*96 + (index&0xff)+1; + } else if ( index>0x100 && sf->encoding_name==em_sjis ) { + int j1 = index>>8, j2 = index&0xff; + int ro = j1<95 ? 112 : 176; + int co = (j1&1) ? (j2>95?32:31) : 126; + index = ( (((j1+1)>>1) + ro )<<8 ) | (j2+co); + } else if ( index>=0x100 && + (sf->encoding_name==em_wansung || sf->encoding_name==em_jisgb )) + index += 0x8080; + } + } + } +return( index ); +} + +int SFCIDFindChar(SplineFont *sf, int unienc, char *name ) { + int j,ret; + + if ( sf->cidmaster!=NULL ) + sf=sf->cidmaster; + + if ( unienc==-1 && name!=NULL ) { + SplineChar *sc = SFHashName(sf,name); + if ( sc!=NULL ) +return( sc->enc ); + } + + if ( sf->subfonts==NULL ) +return( _SFFindChar(sf,unienc,name)); + for ( j=0; jsubfontcnt; ++j ) + if (( ret = _SFFindChar(sf->subfonts[j],unienc,name))!=-1 ) +return( ret ); +return( -1 ); +} + +int SFHasCID(SplineFont *sf,int cid) { + int i; + /* What subfont (if any) contains this cid? */ + if ( sf->cidmaster!=NULL ) + sf=sf->cidmaster; + for ( i=0; isubfontcnt; ++i ) + if ( cidsubfonts[i]->charcnt && sf->subfonts[i]->chars[cid]!=NULL ) +return( i ); + +return( -1 ); +} + +SplineChar *SFGetChar(SplineFont *sf, int unienc, char *name ) { + int ind; + int j; + + if ( unienc==-1 && name!=NULL ) +return( SFHashName(sf,name)); + + ind = SFCIDFindChar(sf,unienc,name); + if ( ind==-1 ) +return( NULL ); + + if ( sf->subfonts==NULL && sf->cidmaster==NULL ) +return( sf->chars[ind]); + + if ( sf->cidmaster!=NULL ) + sf=sf->cidmaster; + for ( j=0; jsubfontcnt; ++j ) + if ( indsubfonts[j]->charcnt && sf->subfonts[j]->chars[ind]!=NULL ) +return( sf->subfonts[j]->chars[ind] ); + +return( NULL ); +} + +SplineChar *SFGetCharDup(SplineFont *sf, int unienc, char *name ) { +return( SCDuplicate(SFGetChar(sf,unienc,name)) ); +} + +SplineChar *SFGetOrMakeChar(SplineFont *sf, int unienc, char *name ) { + int ind = SFFindChar(sf,unienc,name); + + if ( ind==-1 ) +return( NULL ); + +return( SFMakeChar(sf,ind)); +} + +int SFFindExistingChar(SplineFont *sf, int unienc, char *name ) { + int i = _SFFindChar(sf,unienc,name); + + if ( i==-1 || sf->chars[i]==NULL ) +return( -1 ); + if ( sf->chars[i]->layers[ly_fore].splines!=NULL || sf->chars[i]->layers[ly_fore].refs!=NULL || + sf->chars[i]->widthset ) +return( i ); + +return( -1 ); +} + +int SFCIDFindExistingChar(SplineFont *sf, int unienc, char *name ) { + int j,ret; + + if ( sf->subfonts==NULL && sf->cidmaster==NULL ) +return( SFFindExistingChar(sf,unienc,name)); + if ( sf->cidmaster!=NULL ) + sf=sf->cidmaster; + for ( j=0; jsubfontcnt; ++j ) + if (( ret = _SFFindChar(sf->subfonts[j],unienc,name))!=-1 && + sf->subfonts[j]->chars[ret]!=NULL ) +return( ret ); +return( -1 ); +} + +static void MFixupSC(SplineFont *sf, SplineChar *sc,int i) { + RefChar *ref, *prev; + FontView *fvs; + + sc->enc = i; + sc->parent = sf; + retry: + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + /* The sc in the ref is from the old font. It's got to be in the */ + /* new font too (was either already there or just got copied) */ + ref->local_enc = _SFFindChar(sf,ref->sc->unicodeenc,ref->sc->name); + if ( ref->local_enc==-1 ) { + GDrawIError("Bad reference, can't fix it up"); + if ( ref==sc->layers[ly_fore].refs ) { + sc->layers[ly_fore].refs = ref->next; + goto retry; + } else { + for ( prev=sc->layers[ly_fore].refs; prev->next!=ref; prev=prev->next ); + prev->next = ref->next; + chunkfree(ref,sizeof(*ref)); + ref = prev; + } + } else { + ref->sc = sf->chars[ref->local_enc]; + if ( ref->sc->enc==-2 ) + MFixupSC(sf,ref->sc,ref->local_enc); + SCReinstanciateRefChar(sc,ref); + SCMakeDependent(sc,ref->sc); + } + } + /* I shan't automagically generate bitmaps for any bdf fonts */ + /* but I have copied over the ones which match */ + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) if ( fvs->filled!=NULL ) + fvs->filled->chars[i] = SplineCharRasterize(sc,fvs->filled->pixelsize); +} + +static void MergeFixupRefChars(SplineFont *sf) { + int i; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->enc==-2 ) { + MFixupSC(sf,sf->chars[i], i); + } +} + +static int SFHasChar(SplineFont *sf, int unienc, char *name ) { + int index; + + index = _SFFindChar(sf,unienc,name); + if ( index>=0 && indexcharcnt && sf->chars[index]!=NULL ) { + if ( sf->chars[index]->layers[ly_fore].refs!=NULL || + sf->chars[index]->layers[ly_fore].splines!=NULL || + sf->chars[index]->width!=sf->ascent+sf->descent || + sf->chars[index]->widthset || + sf->chars[index]->layers[ly_back].images != NULL || + sf->chars[index]->layers[ly_back].splines != NULL ) +return( true ); + } +return( false ); +} + +static int SFHasName(SplineFont *sf, char *name ) { + int index; + + for ( index = sf->charcnt-1; index>=0; --index ) if ( sf->chars[index]!=NULL ) { + if ( strcmp(sf->chars[index]->name,name)==0 ) + break; + } +return( index ); +} + +static int SFEncodingCnt(SplineFont *sf) { + int cnt = CountOfEncoding(sf->encoding_name); + if ( sf->encoding_name == em_none ) +return( sf->charcnt ); + if ( cnt==0 ) +return( sf->charcnt ); +return( cnt ); +} + +static void _MergeFont(SplineFont *into,SplineFont *other) { + int i,cnt, doit, emptypos, index, enc_cnt, k; + SplineFont *o_sf, *bitmap_into; + BDFFont *bdf; + FontView *fvs; + int *mapping; + + enc_cnt = SFEncodingCnt(into); + for ( i=into->charcnt-1; i>=enc_cnt && into->chars[i]==NULL; --i ); + emptypos = i+1; + mapping = galloc(other->charcnt*sizeof(int)); + memset(mapping,-1,other->charcnt*sizeof(int)); + + bitmap_into = into->cidmaster!=NULL? into->cidmaster : into; + + for ( doit=0; doit<2; ++doit ) { + cnt = 0; + k = 0; + do { + o_sf = ( other->subfonts==NULL ) ? other : other->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( o_sf->chars[i]!=NULL ) { + if ( doit && (index = mapping[i])!=-1 ) { + /* Bug here. Suppose someone has a reference to our empty */ + /* char */ + SplineCharFree(into->chars[index]); + into->chars[index] = SplineCharCopy(o_sf->chars[i],into); + if ( into->bitmaps!=NULL && other->bitmaps!=NULL ) + BitmapsCopy(bitmap_into,other,index,i); + } else if ( !doit ) { + if ( o_sf->chars[i]->layers[ly_fore].splines==NULL && o_sf->chars[i]->layers[ly_fore].refs==NULL && + !o_sf->chars[i]->widthset ) + /* Don't bother to copy it */; + else if ( SCDuplicate(o_sf->chars[i])!=o_sf->chars[i] ) + /* Don't bother to copy it */; + else if ( !SFHasChar(into,o_sf->chars[i]->unicodeenc,o_sf->chars[i]->name)) { + if ( o_sf->chars[i]->unicodeenc==-1 ) { + if ( (index=SFHasName(into,o_sf->chars[i]->name))== -1 ) + index = emptypos+cnt++; + } else if ( (index = SFFindChar(into,o_sf->chars[i]->unicodeenc,NULL))==-1 ) + index = emptypos+cnt++; + mapping[i] = index; + } + } + } + if ( !doit ) { + if ( emptypos+cnt >= into->charcnt ) { + into->chars = grealloc(into->chars,(emptypos+cnt)*sizeof(SplineChar *)); + for ( fvs = into->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->sf == into ) + fvs->selected = grealloc(fvs->selected,emptypos+cnt); + for ( bdf = bitmap_into->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( emptypos+cnt > bdf->charcnt ) + bdf->chars = grealloc(bdf->chars,(emptypos+cnt)*sizeof(SplineChar *)); + for ( fvs = into->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->filled!=NULL ) + fvs->filled->chars = grealloc(fvs->filled->chars,(emptypos+cnt)*sizeof(SplineChar *)); + for ( i=into->charcnt; ichars[i] = NULL; + for ( fvs = into->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->filled!=NULL ) + fvs->selected[i] = false; + for ( bdf = bitmap_into->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( emptypos+cnt > bdf->charcnt ) + bdf->chars[i] = NULL; + for ( fvs = into->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->filled!=NULL ) + fvs->filled->chars[i] = NULL; + } + into->charcnt = emptypos+cnt; + for ( fvs = into->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->filled!=NULL ) + fvs->filled->charcnt = emptypos+cnt; + for ( bdf = bitmap_into->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( emptypos+cnt > bdf->charcnt ) + bdf->charcnt = emptypos+cnt; + } + } + ++k; + } while ( ksubfontcnt ); + } + for ( i=0; icharcnt; ++i ) if ( (index=mapping[i])!=-1 ) + into->chars[index]->kerns = KernsCopy(other->chars[i]->kerns,mapping,into,other); + free(mapping); + GlyphHashFree(into); + MergeFixupRefChars(into); + if ( other->fv==NULL ) + SplineFontFree(other); + into->changed = true; + FontViewReformatAll(into); + GlyphHashFree(into); +} + +static void CIDMergeFont(SplineFont *into,SplineFont *other) { + int i,j,k; + SplineFont *i_sf, *o_sf; + FontView *fvs; + + k = 0; + do { + o_sf = other->subfonts[k]; + i_sf = into->subfonts[k]; + for ( i=o_sf->charcnt-1; i>=0 && o_sf->chars[i]==NULL; --i ); + if ( i>=i_sf->charcnt ) { + i_sf->chars = grealloc(i_sf->chars,(i+1)*sizeof(SplineChar *)); + for ( j=i_sf->charcnt; j<=i; ++j ) + i_sf->chars[j] = NULL; + for ( fvs = i_sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + if ( fvs->sf==i_sf ) { + fvs->selected = grealloc(fvs->selected,i+1); + for ( j=i_sf->charcnt; j<=i; ++j ) + fvs->selected[j] = false; + } + i_sf->charcnt = i+1; + } + for ( i=0; icharcnt; ++i ) if ( o_sf->chars[i]!=NULL ) { + if ( o_sf->chars[i]->layers[ly_fore].splines==NULL && o_sf->chars[i]->layers[ly_fore].refs==NULL && + !o_sf->chars[i]->widthset ) + /* Don't bother to copy it */; + else if ( SFHasCID(into,i)==-1 ) { + SplineCharFree(i_sf->chars[i]); + i_sf->chars[i] = SplineCharCopy(o_sf->chars[i],i_sf); + if ( into->bitmaps!=NULL && other->bitmaps!=NULL ) + BitmapsCopy(into,other,i,i); + } + } + MergeFixupRefChars(i_sf); + ++k; + } while ( ksubfontcnt ); + FontViewReformatAll(into); + into->changed = true; + GlyphHashFree(into); +} + +void MergeFont(FontView *fv,SplineFont *other) { + + if ( fv->sf==other ) { + GWidgetErrorR(_STR_MergingProb,_STR_MergingFontSelf); +return; + } + if ( fv->sf->cidmaster!=NULL && other->subfonts!=NULL && + (strcmp(fv->sf->cidmaster->cidregistry,other->cidregistry)!=0 || + strcmp(fv->sf->cidmaster->ordering,other->ordering)!=0 || + fv->sf->cidmaster->supplementsupplement || + fv->sf->cidmaster->subfontcntsubfontcnt )) { + GWidgetErrorR(_STR_MergingProb,_STR_MergingCIDMismatch); +return; + } + /* Ok. when merging CID fonts... */ + /* If fv is normal and other is CID then just flatten other and merge everything into fv */ + /* If fv is CID and other is normal then merge other into the currently active font */ + /* If both are CID then merge each subfont seperately */ + if ( fv->sf->cidmaster!=NULL && other->subfonts!=NULL ) + CIDMergeFont(fv->sf->cidmaster,other); + else + _MergeFont(fv->sf,other); +} + +static void MergeAskFilename(FontView *fv) { + char *filename = GetPostscriptFontName(NULL,true); + SplineFont *sf; + char *eod, *fpt, *file, *full; + + if ( filename==NULL ) +return; + eod = strrchr(filename,'/'); + *eod = '\0'; + file = eod+1; + do { + fpt = strstr(file,"; "); + if ( fpt!=NULL ) *fpt = '\0'; + full = galloc(strlen(filename)+1+strlen(file)+1); + strcpy(full,filename); strcat(full,"/"); strcat(full,file); + sf = LoadSplineFont(full,0); + free(full); + if ( sf==NULL ) + /* Do Nothing */; + else if ( sf->fv==fv ) + GWidgetErrorR(_STR_MergingProb,_STR_MergingFontSelf); + else + MergeFont(fv,sf); + file = fpt+2; + } while ( fpt!=NULL ); + free(filename); +} + +static GTextInfo *BuildFontList(FontView *except) { + FontView *fv; + int cnt=0; + GTextInfo *tf; + + for ( fv=fv_list; fv!=NULL; fv = fv->next ) + ++cnt; + tf = gcalloc(cnt+3,sizeof(GTextInfo)); + for ( fv=fv_list, cnt=0; fv!=NULL; fv = fv->next ) if ( fv!=except ) { + tf[cnt].fg = tf[cnt].bg = COLOR_DEFAULT; + tf[cnt].text = uc_copy(fv->sf->fontname); + ++cnt; + } + tf[cnt++].line = true; + tf[cnt].fg = tf[cnt].bg = COLOR_DEFAULT; + tf[cnt].text_in_resource = true; + tf[cnt++].text = (unichar_t *) _STR_Other; +return( tf ); +} + +static void TFFree(GTextInfo *tf) { + int i; + + for ( i=0; tf[i].text!=NULL || tf[i].line ; ++i ) + if ( !tf[i].text_in_resource ) + free( tf[i].text ); + free(tf); +} + +struct mf_data { + int done; + FontView *fv; + GGadget *other; + GGadget *amount; +}; + +static int MF_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct mf_data *d = GDrawGetUserData(gw); + int i, index = GGadgetGetFirstListSelectedItem(d->other); + FontView *fv; + for ( i=0, fv=fv_list; fv!=NULL; fv=fv->next ) { + if ( fv==d->fv ) + continue; + if ( i==index ) + break; + ++i; + } + if ( fv==NULL ) + MergeAskFilename(d->fv); + else + MergeFont(d->fv,fv->sf); + d->done = true; + } +return( true ); +} + +static int MF_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct mf_data *d = GDrawGetUserData(gw); + d->done = true; + } +return( true ); +} + +static int mv_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct mf_data *d = GDrawGetUserData(gw); + d->done = true; + } else if ( event->type == et_char ) { +return( false ); + } +return( true ); +} + +void FVMergeFonts(FontView *fv) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[6]; + GTextInfo label[6]; + struct mf_data d; + unichar_t buffer[80]; + + /* If there's only one font loaded, then it's the current one, and there's*/ + /* no point asking the user if s/he wants to merge any of the loaded */ + /* fonts, go directly to searching the disk */ + if ( fv_list==fv && fv_list->next==NULL ) + MergeAskFilename(fv); + else { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<sf->fontname ); + label[0].text = buffer; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; + gcd[0].gd.flags = gg_visible | gg_enabled; + gcd[0].creator = GLabelCreate; + + gcd[1].gd.pos.x = 20; gcd[1].gd.pos.y = 21; + gcd[1].gd.pos.width = 110; + gcd[1].gd.flags = gg_visible | gg_enabled; + gcd[1].gd.u.list = BuildFontList(fv); + gcd[1].gd.label = &gcd[1].gd.u.list[0]; + gcd[1].gd.u.list[0].selected = true; + gcd[1].creator = GListButtonCreate; + + gcd[2].gd.pos.x = 15-3; gcd[2].gd.pos.y = 55-3; + gcd[2].gd.pos.width = -1; gcd[2].gd.pos.height = 0; + gcd[2].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[2].text = (unichar_t *) _STR_OK; + label[2].text_in_resource = true; + gcd[2].gd.mnemonic = 'O'; + gcd[2].gd.label = &label[2]; + gcd[2].gd.handle_controlevent = MF_OK; + gcd[2].creator = GButtonCreate; + + gcd[3].gd.pos.x = -15; gcd[3].gd.pos.y = 55; + gcd[3].gd.pos.width = -1; gcd[3].gd.pos.height = 0; + gcd[3].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[3].text = (unichar_t *) _STR_Cancel; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.mnemonic = 'C'; + gcd[3].gd.handle_controlevent = MF_Cancel; + gcd[3].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + + memset(&d,'\0',sizeof(d)); + d.other = gcd[1].ret; + d.fv = fv; + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !d.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + TFFree(gcd[1].gd.u.list); + } +} + +static RefChar *InterpRefs(RefChar *base, RefChar *other, real amount, SplineChar *sc) { + RefChar *head=NULL, *last=NULL, *cur; + RefChar *test; + int i; + + for ( test = other; test!=NULL; test=test->next ) + test->checked = false; + + while ( base!=NULL ) { + for ( test = other; test!=NULL; test=test->next ) { + if ( test->checked ) + /* Do nothing */; + else if ( test->unicode_enc==base->unicode_enc && + (test->unicode_enc!=-1 || strcmp(test->sc->name,base->sc->name)==0 ) ) + break; + } + if ( test!=NULL ) { + test->checked = true; + cur = RefCharCreate(); + *cur = *base; + cur->local_enc = cur->sc->enc; + for ( i=0; i<6; ++i ) + cur->transform[i] = base->transform[i] + amount*(other->transform[i]-base->transform[i]); + cur->layers[0].splines = NULL; + cur->checked = false; + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } else + fprintf( stderr, "In character %s, could not find reference to %s\n", + sc->name, base->sc->name ); + base = base->next; + if ( test==other && other!=NULL ) + other = other->next; + } +return( head ); +} + +static void InterpPoint(SplineSet *cur, SplinePoint *base, SplinePoint *other, real amount ) { + SplinePoint *p = chunkalloc(sizeof(SplinePoint)); + + p->me.x = base->me.x + amount*(other->me.x-base->me.x); + p->me.y = base->me.y + amount*(other->me.y-base->me.y); + p->prevcp.x = base->prevcp.x + amount*(other->prevcp.x-base->prevcp.x); + p->prevcp.y = base->prevcp.y + amount*(other->prevcp.y-base->prevcp.y); + p->nextcp.x = base->nextcp.x + amount*(other->nextcp.x-base->nextcp.x); + p->nextcp.y = base->nextcp.y + amount*(other->nextcp.y-base->nextcp.y); + p->nonextcp = ( p->nextcp.x==p->me.x && p->nextcp.y==p->me.y ); + p->noprevcp = ( p->prevcp.x==p->me.x && p->prevcp.y==p->me.y ); + p->prevcpdef = base->prevcpdef && other->prevcpdef; + p->nextcpdef = base->nextcpdef && other->nextcpdef; + p->selected = false; + p->pointtype = (base->pointtype==other->pointtype)?base->pointtype:pt_corner; + /*p->flex = 0;*/ + if ( cur->first==NULL ) + cur->first = p; + else + SplineMake(cur->last,p,base->prev->order2); + cur->last = p; +} + +static SplineSet *InterpSplineSet(SplineSet *base, SplineSet *other, real amount, SplineChar *sc) { + SplineSet *cur = chunkalloc(sizeof(SplineSet)); + SplinePoint *bp, *op; + + for ( bp=base->first, op = other->first; ; ) { + InterpPoint(cur,bp,op,amount); + if ( bp->next == NULL && op->next == NULL ) +return( cur ); + if ( bp->next!=NULL && op->next!=NULL && + bp->next->to==base->first && op->next->to==other->first ) { + SplineMake(cur->last,cur->first,bp->next->order2); + cur->last = cur->first; +return( cur ); + } + if ( bp->next == NULL || bp->next->to==base->first ) { + fprintf( stderr, "In character %s, there are too few points on a path in the base\n", sc->name); + if ( bp->next!=NULL ) { + SplineMake(cur->last,cur->first,bp->next->order2); + cur->last = cur->first; + } +return( cur ); + } else if ( op->next==NULL || op->next->to==other->first ) { + fprintf( stderr, "In character %s, there are too many points on a path in the base\n", sc->name); + while ( bp->next!=NULL && bp->next->to!=base->first ) { + bp = bp->next->to; + InterpPoint(cur,bp,op,amount); + } + if ( bp->next!=NULL ) { + SplineMake(cur->last,cur->first,bp->next->order2); + cur->last = cur->first; + } +return( cur ); + } + bp = bp->next->to; + op = op->next->to; + } +} + +static SplineSet *InterpSplineSets(SplineSet *base, SplineSet *other, real amount, SplineChar *sc) { + SplineSet *head=NULL, *last=NULL, *cur; + + /* we could do something really complex to try and figure out which spline*/ + /* set goes with which, but I'm not sure that it would really accomplish */ + /* much, if things are off the computer probably won't figure it out */ + /* Could use path open/closed, direction, point count */ + while ( base!=NULL && other!=NULL ) { + cur = InterpSplineSet(base,other,amount,sc); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + base = base->next; + other = other->next; + } +return( head ); +} + +static KernPair *InterpKerns(KernPair *kp1, KernPair *kp2, real amount, SplineFont *new) { + KernPair *head=NULL, *last, *nkp, *k; + + if ( kp1==NULL || kp2==NULL ) +return( NULL ); + while ( kp1!=NULL ) { + for ( k=kp2; k!=NULL && k->sc->enc!=kp1->sc->enc; k=k->next ); + if ( k!=NULL ) { + if ( k==kp2 ) kp2 = kp2->next; + nkp = chunkalloc(sizeof(KernPair)); + nkp->sc = new->chars[k->sc->enc]; + nkp->off = kp1->off + amount*(k->off-kp1->off); + nkp->sli = kp1->sli; + if ( head==NULL ) + head = nkp; + else + last->next = nkp; + last = nkp; + } + kp1 = kp1->next; + } +return( head ); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static uint32 InterpColor( uint32 col1,uint32 col2, real amount ) { + int r1, g1, b1, r2, b2, g2; + + r1 = (col1>>16)&0xff; + r2 = (col2>>16)&0xff; + g1 = (col1>>8 )&0xff; + g2 = (col2>>8 )&0xff; + b1 = (col1 )&0xff; + b2 = (col2 )&0xff; + r1 += amount * (r2-r1); + g1 += amount * (g2-g1); + b1 += amount * (b2-b1); +return( (r1<<16) | (g1<<8) | b1 ); +} + +static void LayerInterpolate(Layer *to,Layer *base,Layer *other,real amount,SplineChar *sc, int lc) { + + /* to already has things set to default values, so when an error occurs */ + /* I just leave things as the default (and don't need to set it again) */ + if ( base->dostroke==other->dostroke ) + to->dostroke = base->dostroke; + else + fprintf( stderr, "Different settings on whether to stroke in layer %d of %s\n", lc, sc->name ); + if ( base->dofill==other->dofill ) + to->dofill = base->dofill; + else + fprintf( stderr, "Different settings on whether to fill in layer %d of %s\n", lc, sc->name ); + if ( base->fill_brush.col==COLOR_INHERITED && other->fill_brush.col==COLOR_INHERITED ) + to->fill_brush.col = COLOR_INHERITED; + else if ( base->fill_brush.col!=COLOR_INHERITED && other->fill_brush.col!=COLOR_INHERITED ) + to->fill_brush.col = InterpColor( base->fill_brush.col,other->fill_brush.col, amount ); + else + fprintf( stderr, "Different settings on whether to inherit fill color in layer %d of %s\n", lc, sc->name ); + if ( base->fill_brush.opacity<0 && other->fill_brush.opacity<0 ) + to->fill_brush.opacity = WIDTH_INHERITED; + else if ( base->fill_brush.opacity>=0 && other->fill_brush.opacity>=0 ) + to->fill_brush.opacity = base->fill_brush.opacity + amount*(other->fill_brush.opacity-base->fill_brush.opacity); + else + fprintf( stderr, "Different settings on whether to inherit fill opacity in layer %d of %s\n", lc, sc->name ); + if ( base->stroke_pen.brush.col==COLOR_INHERITED && other->stroke_pen.brush.col==COLOR_INHERITED ) + to->stroke_pen.brush.col = COLOR_INHERITED; + else if ( base->stroke_pen.brush.col!=COLOR_INHERITED && other->stroke_pen.brush.col!=COLOR_INHERITED ) + to->stroke_pen.brush.col = InterpColor( base->stroke_pen.brush.col,other->stroke_pen.brush.col, amount ); + else + fprintf( stderr, "Different settings on whether to inherit fill color in layer %d of %s\n", lc, sc->name ); + if ( base->stroke_pen.brush.opacity<0 && other->stroke_pen.brush.opacity<0 ) + to->stroke_pen.brush.opacity = WIDTH_INHERITED; + else if ( base->stroke_pen.brush.opacity>=0 && other->stroke_pen.brush.opacity>=0 ) + to->stroke_pen.brush.opacity = base->stroke_pen.brush.opacity + amount*(other->stroke_pen.brush.opacity-base->stroke_pen.brush.opacity); + else + fprintf( stderr, "Different settings on whether to inherit stroke opacity in layer %d of %s\n", lc, sc->name ); + if ( base->stroke_pen.width<0 && other->stroke_pen.width<0 ) + to->stroke_pen.width = WIDTH_INHERITED; + else if ( base->stroke_pen.width>=0 && other->stroke_pen.width>=0 ) + to->stroke_pen.width = base->stroke_pen.width + amount*(other->stroke_pen.width-base->stroke_pen.width); + else + fprintf( stderr, "Different settings on whether to inherit stroke width in layer %d of %s\n", lc, sc->name ); + if ( base->stroke_pen.linecap==other->stroke_pen.linecap ) + to->stroke_pen.linecap = base->stroke_pen.linecap; + else + fprintf( stderr, "Different settings on stroke linecap in layer %d of %s\n", lc, sc->name ); + if ( base->stroke_pen.linejoin==other->stroke_pen.linejoin ) + to->stroke_pen.linejoin = base->stroke_pen.linejoin; + else + fprintf( stderr, "Different settings on stroke linejoin in layer %d of %s\n", lc, sc->name ); + + to->splines = InterpSplineSets(base->splines,other->splines,amount,sc); + to->refs = InterpRefs(base->refs,other->refs,amount,sc); + if ( base->images!=NULL || other->images!=NULL ) + fprintf( stderr, "I can't even imagine how to attempt to interpolate images in layer %d of %s\n", lc, sc->name ); +} +#endif + +static void InterpolateChar(SplineFont *new, int enc, SplineChar *base, SplineChar *other, real amount) { + SplineChar *sc; + + if ( base==NULL || other==NULL ) +return; + sc = SplineCharCreate(); + sc->enc = enc; + sc->unicodeenc = base->unicodeenc; + sc->old_enc = base->old_enc; + sc->orig_pos = base->orig_pos; + new->chars[enc] = sc; + sc->parent = new; + sc->changed = true; + sc->views = NULL; + sc->dependents = NULL; + sc->layers[ly_back].splines = NULL; + sc->layers[ly_back].images = NULL; + sc->layers[ly_fore].undoes = sc->layers[ly_back].undoes = NULL; + sc->layers[ly_fore].redoes = sc->layers[ly_back].redoes = NULL; + sc->kerns = NULL; + sc->name = copy(base->name); + sc->width = base->width + amount*(other->width-base->width); + sc->vwidth = base->vwidth + amount*(other->vwidth-base->vwidth); + sc->lsidebearing = base->lsidebearing + amount*(other->lsidebearing-base->lsidebearing); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( base->parent->multilayer && other->parent->multilayer ) { + int lc = base->layer_cnt,i; + if ( lc!=other->layer_cnt ) { + fprintf( stderr, "Different numbers of layers in %s\n", base->name ); + if ( other->layer_cntlayer_cnt; + } + if ( lc>2 ) { + sc->layers = grealloc(sc->layers,lc*sizeof(Layer)); + for ( i=ly_fore+1; ilayers[i]); + } + for ( i=ly_fore; ilayers[i],&base->layers[i],&other->layers[i],amount,sc,i); + } else +#endif + { + sc->layers[ly_fore].splines = InterpSplineSets(base->layers[ly_fore].splines,other->layers[ly_fore].splines,amount,sc); + sc->layers[ly_fore].refs = InterpRefs(base->layers[ly_fore].refs,other->layers[ly_fore].refs,amount,sc); + } + sc->changedsincelasthinted = true; + sc->widthset = base->widthset; + sc->glyph_class = base->glyph_class; +} + +static void IFixupSC(SplineFont *sf, SplineChar *sc,int i) { + RefChar *ref; + + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) if ( !ref->checked ) { + /* The sc in the ref is from the base font. It's got to be in the */ + /* new font too (the ref only gets created if it's present in both fonts)*/ + ref->checked = true; + ref->local_enc = _SFFindChar(sf,ref->sc->unicodeenc,ref->sc->name); + ref->sc = sf->chars[ref->local_enc]; + IFixupSC(sf,ref->sc,ref->local_enc); + SCReinstanciateRefChar(sc,ref); + SCMakeDependent(sc,ref->sc); + } +} + +static void InterpFixupRefChars(SplineFont *sf) { + int i; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + IFixupSC(sf,sf->chars[i], i); + } +} + +static void InterpolateFont(SplineFont *base, SplineFont *other, real amount) { + SplineFont *new; + int i, index; + + if ( base==other ) { + GWidgetErrorR(_STR_InterpolatingProb,_STR_InterpolatingFontSelf); +return; + } else if ( base->order2!=other->order2 ) { + GWidgetErrorR(_STR_InterpolatingProb,_STR_InterpolatingFontsDiffOrder); +return; + } +#ifdef FONTFORGE_CONFIG_TYPE3 + else if ( base->multilayer && other->multilayer ) { + GWidgetErrorR(_STR_InterpolatingProb,_STR_InterpolatingFontsDiffLayers); +return; + } +#endif + new = SplineFontBlank(base->encoding_name,base->charcnt); + new->ascent = base->ascent + amount*(other->ascent-base->ascent); + new->descent = base->descent + amount*(other->descent-base->descent); + if ( base->encoding_name==other->encoding_name ) { + for ( i=0; icharcnt && icharcnt; ++i ) + InterpolateChar(new,i,base->chars[i],other->chars[i],amount); + } else { + for ( i=0; icharcnt; ++i ) if ( base->chars[i]!=NULL ) { + index = _SFFindChar(other,base->chars[i]->unicodeenc,base->chars[i]->name); + if ( other->chars[index]!=NULL ) + InterpolateChar(new,i,base->chars[i],other->chars[index],amount); + } + } + /* Only do kerns if the encodings match. Too hard otherwise */ + if ( base->encoding_name==other->encoding_name ) { + for ( i=0; icharcnt && icharcnt; ++i ) + if ( new->chars[i]!=NULL ) + new->chars[i]->kerns = InterpKerns(base->chars[i]->kerns,other->chars[i]->kerns,amount,new); + } + InterpFixupRefChars(new); + new->changed = true; + FontViewCreate(new); +} + +static void InterAskFilename(FontView *fv, real amount) { + char *filename = GetPostscriptFontName(NULL,false); + SplineFont *sf; + + if ( filename==NULL ) +return; + sf = LoadSplineFont(filename,0); + free(filename); + if ( sf==NULL ) +return; + InterpolateFont(fv->sf,sf,amount); +} + +#define CID_Amount 1000 +static real last_amount=50; + +static int IF_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct mf_data *d = GDrawGetUserData(gw); + int i, index = GGadgetGetFirstListSelectedItem(d->other); + FontView *fv; + int err=false; + real amount; + + amount = GetRealR(gw,CID_Amount, _STR_Amount,&err); + if ( err ) +return( true ); + last_amount = amount; + for ( i=0, fv=fv_list; fv!=NULL; fv=fv->next ) { + if ( fv==d->fv ) + continue; + if ( i==index ) + break; + ++i; + } + if ( fv==NULL ) + InterAskFilename(d->fv,last_amount/100.0); + else + InterpolateFont(d->fv->sf,fv->sf,last_amount/100.0); + d->done = true; + } +return( true ); +} + +void FVInterpolateFonts(FontView *fv) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + struct mf_data d; + unichar_t buffer[80]; char buf2[30]; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<sf->fontname ); + label[0].text = buffer; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; + gcd[0].gd.flags = gg_visible | gg_enabled; + gcd[0].creator = GLabelCreate; + + gcd[1].gd.pos.x = 20; gcd[1].gd.pos.y = 21; + gcd[1].gd.pos.width = 110; + gcd[1].gd.flags = gg_visible | gg_enabled; + gcd[1].gd.u.list = BuildFontList(fv); + if ( gcd[1].gd.u.list[0].text!=NULL ) { + gcd[1].gd.label = &gcd[1].gd.u.list[0]; + gcd[1].gd.u.list[0].selected = true; + } else { + gcd[1].gd.label = &gcd[1].gd.u.list[1]; + gcd[1].gd.u.list[1].selected = true; + gcd[1].gd.flags = gg_visible; + } + gcd[1].creator = GListButtonCreate; + + sprintf( buf2, "%g", last_amount ); + label[2].text = (unichar_t *) buf2; + label[2].text_is_1byte = true; + gcd[2].gd.pos.x = 20; gcd[2].gd.pos.y = 51; + gcd[2].gd.pos.width = 40; + gcd[2].gd.flags = gg_visible | gg_enabled; + gcd[2].gd.label = &label[2]; + gcd[2].gd.cid = CID_Amount; + gcd[2].creator = GTextFieldCreate; + + gcd[3].gd.pos.x = 5; gcd[3].gd.pos.y = 51+6; + gcd[3].gd.flags = gg_visible | gg_enabled; + label[3].text = (unichar_t *) _STR_By; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].creator = GLabelCreate; + + gcd[4].gd.pos.x = 20+40+3; gcd[4].gd.pos.y = 51+6; + gcd[4].gd.flags = gg_visible | gg_enabled; + label[4].text = (unichar_t *) "%"; + label[4].text_is_1byte = true; + gcd[4].gd.label = &label[4]; + gcd[4].creator = GLabelCreate; + + gcd[5].gd.pos.x = 15-3; gcd[5].gd.pos.y = 85-3; + gcd[5].gd.pos.width = -1; gcd[5].gd.pos.height = 0; + gcd[5].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[5].text = (unichar_t *) _STR_OK; + label[5].text_in_resource = true; + gcd[5].gd.mnemonic = 'O'; + gcd[5].gd.label = &label[5]; + gcd[5].gd.handle_controlevent = IF_OK; + gcd[5].creator = GButtonCreate; + + gcd[6].gd.pos.x = -15; gcd[6].gd.pos.y = 85; + gcd[6].gd.pos.width = -1; gcd[6].gd.pos.height = 0; + gcd[6].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[6].text = (unichar_t *) _STR_Cancel; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.mnemonic = 'C'; + gcd[6].gd.handle_controlevent = MF_Cancel; + gcd[6].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + + memset(&d,'\0',sizeof(d)); + d.other = gcd[1].ret; + d.fv = fv; + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !d.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + TFFree(gcd[1].gd.u.list); +} diff --git a/fontforge/fvimportbdf.c b/fontforge/fvimportbdf.c new file mode 100644 index 00000000..17a8d66c --- /dev/null +++ b/fontforge/fvimportbdf.c @@ -0,0 +1,2118 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include "utype.h" +#include "ustring.h" +#include +#include + +static char *cleancopy(char *name) { + char *fpt, *tpt; + char *temp = NULL; + + fpt=tpt=name; + if ( isdigit(*fpt)) { + tpt = temp = galloc(strlen(name)+2); + *tpt++ = '$'; + } + for ( ; *fpt; ++fpt ) { + if ( *fpt>' ' && *fpt<127 && + *fpt!='(' && + *fpt!=')' && + *fpt!='[' && + *fpt!=']' && + *fpt!='{' && + *fpt!='}' && + *fpt!='<' && + *fpt!='>' && + *fpt!='/' && + *fpt!='%' ) + *tpt++ = *fpt; + } + *tpt = '\0'; + + if ( temp!=NULL ) +return( temp ); + +return( copy(name)); +} + +/* The pcf code is adapted from... */ +/* + +Copyright 1991, 1998 The Open Group + +All Rights Reserved. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + +*/ + +/* + * Author: Keith Packard, MIT X Consortium + */ + +/* ******************************** BDF ************************************* */ + +static int gettoken(FILE *bdf, char *tokbuf, int size) { + char *pt=tokbuf, *end = tokbuf+size-2; int ch; + + while ( isspace(ch = getc(bdf))); + while ( ch!=EOF && !isspace(ch) && ch!='[' && ch!=']' && ch!='{' && ch!='}' && ch!='<' && ch!='%' ) { + if ( pt=sf->charcnt ) { + int i,n = enc; + if ( !set ) + n += 100; + sf->chars = grealloc(sf->chars,n*sizeof(SplineChar *)); + for ( i=sf->charcnt; ichars[i] = NULL; + sf->charcnt = n; + for ( b=sf->bitmaps; b!=NULL; b=b->next ) if ( b->charcntchars = grealloc(b->chars,n*sizeof(BDFChar *)); + for ( i=b->charcnt; ichars[i] = NULL; + b->charcnt = n; + } + if ( sf->fv!=NULL ) { + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + free(fvs->selected); + fvs->selected = gcalloc(sf->charcnt,1); + } + FontViewReformatAll(sf); + } + } +} + +static void MakeEncChar(SplineFont *sf,int enc,char *name) { + int uni; + + ExtendSF(sf,enc,false); + + if ( sf->chars[enc]==NULL ) + SFMakeChar(sf,enc); + free(sf->chars[enc]->name); + sf->chars[enc]->name = cleancopy(name); + + uni = UniFromName(name); + if ( uni!=-1 ) + sf->chars[enc]->unicodeenc = uni; + sf->chars[enc]->enc = enc; + /*sf->encoding_name = em_none;*/ +} + +static int figureProperEncoding(SplineFont *sf,BDFFont *b, int enc,char *name, + int swidth, int swidth1, enum charset encname) { + int i = -1; + + if ( strcmp(name,".notdef")==0 ) { + if ( enc<32 || (enc>=127 && enc<0xa0)) i=enc; + else if ( sf->encoding_name==em_none ) i = enc; + else if ( sf->onlybitmaps && ((sf->bitmaps==b && b->next==NULL) || sf->bitmaps==NULL) ) i = enc; + if ( i>=sf->charcnt ) i = -1; + if ( i!=-1 && (sf->chars[i]==NULL || strcmp(sf->chars[i]->name,name)!=0 )) { + SFMakeChar(sf,enc); + if ( sf->onlybitmaps ) { + sf->chars[enc]->width = swidth; + sf->chars[enc]->widthset = true; + if ( swidth1!=-1 ) + sf->chars[enc]->vwidth = swidth1; + } + } + } else if ( sf->encoding_name==encname || + (sf->encoding_name==em_custom && sf->onlybitmaps)) { + i = enc; + if ( i>sf->charcnt ) + MakeEncChar(sf,enc,name); + } else { + int32 uni = UniFromEnc(enc,encname); + if ( uni==-1 ) + uni = UniFromName(name); + i = EncFromSF(uni,sf); + if ( uni!=-1 && i>=sf->charcnt && + (sf->encoding_name==em_iso8859_1 || sf->encoding_name==em_unicode)) + SFReencodeFont(sf,uni>0xffff ? em_unicode4 : em_unicode); + if ( i==-1 ) { + for ( i=sf->charcnt-1; i>=0 ; --i ) if ( sf->chars[i]!=NULL ) { + if ( strcmp(name,sf->chars[i]->name)==0 ) + break; + } + if ( i==-1 && sf->onlybitmaps && enc!=-1 && + ((sf->bitmaps==b && b->next==NULL) || sf->bitmaps==NULL) ) { + MakeEncChar(sf,enc,name); + i = enc; + } + } + } + if ( i==-1 || i>=sf->charcnt ) { + /* try adding it to the end of the font */ + int j; + int encmax = CountOfEncoding(sf->encoding_name); + for ( j=sf->charcnt-1; j>=encmax && sf->chars[j]==NULL; --j ); + ++j; + if ( icharcnt && sf->chars[i]==NULL ) { + SFMakeChar(sf,i); + if ( sf->onlybitmaps && ((sf->bitmaps==b && b->next==NULL) || sf->bitmaps==NULL) ) { + free(sf->chars[i]->name); + sf->chars[i]->name = cleancopy(name); + } + } + if ( i!=-1 && swidth!=-1 && + ((sf->onlybitmaps && ((sf->bitmaps==b && b->next==NULL) || sf->bitmaps==NULL) ) || + (sf->chars[i]!=NULL && sf->chars[i]->layers[ly_fore].splines==NULL && sf->chars[i]->layers[ly_fore].refs==NULL && + !sf->chars[i]->widthset)) ) { + sf->chars[i]->width = swidth; + sf->chars[i]->widthset = true; + if ( swidth1!=-1 ) + sf->chars[i]->vwidth = swidth1; + } + if ( i!=enc && enc!=-1 && sf->onlybitmaps && sf->chars[enc]!=NULL && + ((sf->bitmaps==b && b->next==NULL) || sf->bitmaps==NULL) ) { + free(sf->chars[enc]->name); + sf->chars[enc]->name = copy( ".notdef" ); + sf->chars[enc]->unicodeenc = -1; + } +return( i ); +} + +struct metrics { + int swidth, dwidth, swidth1, dwidth1; /* Font wide width defaults */ + int metricsset, vertical_origin; + int res; +}; + +static void AddBDFChar(FILE *bdf, SplineFont *sf, BDFFont *b,int depth, + struct metrics *defs, enum charset encname) { + BDFChar *bc; + char name[40], tok[100]; + int enc=-1, width=defs->dwidth, xmin=0, xmax=0, ymin=0, ymax=0, hsz, vsz; + int swidth= defs->swidth, swidth1=defs->swidth1; + int i,ch; + BitmapView *bv; + uint8 *pt, *end, *eol; + + gettoken(bdf,name,sizeof(tok)); + while ( gettoken(bdf,tok,sizeof(tok))!=-1 ) { + if ( strcmp(tok,"ENCODING")==0 ) { + fscanf(bdf,"%d",&enc); + /* Adobe says that enc is value for Adobe Standard */ + /* But people don't use it that way. Adobe also says that if */ + /* there is no mapping in adobe standard the -1 may be followed */ + /* by another value, the local encoding. */ + if ( enc==-1 ) { + ch = getc(bdf); + if ( ch==' ' || ch=='\t' ) + fscanf(bdf,"%d",&enc); + else + ungetc(ch,bdf); + } + if ( enc<-1 ) enc = -1; + } else if ( strcmp(tok,"DWIDTH")==0 ) + fscanf(bdf,"%d %*d",&width); + else if ( strcmp(tok,"SWIDTH")==0 ) + fscanf(bdf,"%d %*d",&swidth); + else if ( strcmp(tok,"SWIDTH1")==0 ) + fscanf(bdf,"%d %*d",&swidth1); + else if ( strcmp(tok,"BBX")==0 ) { + fscanf(bdf,"%d %d %d %d",&hsz, &vsz, &xmin, &ymin ); + xmax = hsz+xmin-1; + ymax = vsz+ymin-1; + } else if ( strcmp(tok,"BITMAP")==0 ) + break; + } + i = figureProperEncoding(sf,b,enc,name,swidth,swidth1,encname); + if ( i!=-1 ) { + if ( (bc=b->chars[i])!=NULL ) { + free(bc->bitmap); + BDFFloatFree(bc->selection); + } else { + b->chars[i] = bc = chunkalloc(sizeof(BDFChar)); + bc->sc = sf->chars[i]; + bc->enc = i; + } + bc->xmin = xmin; + bc->ymin = ymin; + bc->xmax = xmax; + bc->ymax = ymax; + bc->width = width; + if ( depth==1 ) { + bc->bytes_per_line = ((xmax-xmin)>>3) + 1; + bc->byte_data = false; + } else { + bc->bytes_per_line = xmax-xmin + 1; + bc->byte_data = true; + } + bc->depth = depth; + bc->bitmap = galloc(bc->bytes_per_line*(ymax-ymin+1)); + + pt = bc->bitmap; end = pt + bc->bytes_per_line*(ymax-ymin+1); + eol = pt + bc->bytes_per_line; + while ( pt='0' && ch1<='9' ) val = (ch1-'0')<<4; + else if ( ch1>='a' && ch1<='f' ) val = (ch1-'a'+10)<<4; + else if ( ch1>='A' && ch1<='F' ) val = (ch1-'A'+10)<<4; + if ( ch2>='0' && ch2<='9' ) val |= (ch2-'0'); + else if ( ch2>='a' && ch2<='f' ) val |= (ch2-'a'+10); + else if ( ch2>='A' && ch2<='F' ) val |= (ch2-'A'+10); + if ( depth==1 || depth==8 ) + *pt++ = val; + else if ( depth==2 ) { /* Internal representation is unpacked, one byte per pixel */ + *pt++ = (val>>6); + if ( pt>4)&3; + if ( pt>2)&3; + if ( pt>4); + if ( pt=eol ) eol += bc->bytes_per_line; + if ( ch2==EOF ) + break; + } + + for ( bv=bc->views; bv!=NULL; bv=bv->next ) + GDrawRequestExpose(bv->v,NULL,false); + } else { + int cnt; + if ( depth==1 ) + cnt = 2*(((xmax-xmin)>>3) + 1) * (ymax-ymin+1); + else if ( depth==2 ) + cnt = 2*(((xmax-xmin)>>2) + 1) * (ymax-ymin+1); + else if ( depth==4 ) + cnt = (xmax-xmin + 1) * (ymax-ymin+1); + else if ( depth==8 ) + cnt = 2*(xmax-xmin + 1) * (ymax-ymin+1); + else if ( depth==16 ) + cnt = 4*(xmax-xmin + 1) * (ymax-ymin+1); + else + cnt = 8*(xmax-xmin + 1) * (ymax-ymin+1); + for ( i=0; iem_iso8859_15 ) enc = em_iso8859_15; + } else if ( strmatch(encname,"ISOLatin1Encoding")==0 ) { + enc = em_iso8859_1; + } else if ( strmatch(encname,"ISO10646")==0 || strmatch(encname,"ISO-10646")==0 || strmatch(encname,"ISO_10646")==0 || + strmatch(encname,"Unicode")==0 ) { + enc = em_unicode; + if ( encoff>1 ) + enc = em_unicodeplanes+encoff-1; + } else if ( strstrmatch(encname,"AdobeStandard")!=NULL ) { + enc = em_adobestandard; + } else if ( strstrmatch(encname,"Mac")!=NULL ) { + enc = em_mac; + } else if ( strstrmatch(encname,"Win")!=NULL || strstrmatch(encname,"ANSI")!=NULL ) { + enc = em_win; + } else if ( strstrmatch(encname,"koi8")!=NULL ) { + enc = em_koi8_r; + } else if ( strstrmatch(encname,"JISX0201")!=NULL ) { + enc = em_jis201; + } else if ( strstrmatch(encname,"JISX0208")!=NULL ) { + enc = em_jis208; + } else if ( strstrmatch(encname,"JISX0212")!=NULL ) { + enc = em_jis212; + } else if ( strstrmatch(encname,"KSC5601")!=NULL ) { + enc = em_ksc5601; + } else if ( strstrmatch(encname,"GB2312")!=NULL ) { + enc = em_gb2312; + } else if ( strstrmatch(encname,"BIG5HKSCS")!=NULL ) { + enc = em_big5hkscs; + } else if ( strstrmatch(encname,"BIG5")!=NULL ) { + enc = em_big5; + } else { + Encoding *item; + for ( item=enclist; item!=NULL && strstrmatch(encname,item->enc_name)==NULL; item=item->next ); + if ( item!=NULL ) + enc = item->enc_num; + } +return( enc ); +} + +static int slurp_header(FILE *bdf, int *_as, int *_ds, int *_enc, + char *family, char *mods, char *full, int *depth, char *foundry, + char *fontname, char *comments, struct metrics *defs, + int *upos, int *uwidth) { + int pixelsize = -1; + int ascent= -1, descent= -1, enc, cnt; + char tok[100], encname[100], weight[100], italic[100]; + int ch; + int found_copyright=0; + + *depth = 1; + encname[0]= '\0'; family[0] = '\0'; weight[0]='\0'; italic[0]='\0'; full[0]='\0'; + foundry[0]= '\0'; comments[0] = '\0'; + while ( gettoken(bdf,tok,sizeof(tok))!=-1 ) { + if ( strcmp(tok,"CHARS")==0 ) { + cnt=0; + fscanf(bdf,"%d",&cnt); + GProgressChangeTotal(cnt); + break; + } + if ( strcmp(tok,"FONT")==0 ) { + if ( fscanf(bdf," -%*[^-]-%[^-]-%[^-]-%[^-]-%*[^-]-", family, weight, italic )!=0 ) { + while ( (ch = getc(bdf))!='-' && ch!='\n' && ch!=EOF ); + if ( ch=='-' ) { + fscanf(bdf,"%d", &pixelsize ); + if ( pixelsize<0 ) pixelsize = -pixelsize; /* An extra - screwed things up once... */ + } + } else { + gettoken(bdf,tok,sizeof(tok)); + if ( *tok!='\0' && !isdigit(*tok)) + strcpy(family,tok); + } + } else if ( strcmp(tok,"SIZE")==0 ) { + int size, res; + fscanf(bdf, "%d %d %d", &size, &res, &res ); + if ( pixelsize==-1 ) + pixelsize = rint( size*res/72.0 ); + while ((ch = getc(bdf))==' ' || ch=='\t' ); + ungetc(ch,bdf); + if ( isdigit(ch)) + fscanf(bdf, "%d", depth); + } else if ( strcmp(tok,"BITSPERPIXEL")==0 || + strcmp(tok,"BITS_PER_PIXEL")==0 ) { + fscanf(bdf, "%d", depth); + } else if ( strcmp(tok,"QUAD_WIDTH")==0 && pixelsize==-1 ) + fscanf(bdf, "%d", &pixelsize ); + /* For Courier the quad is not an em */ + else if ( strcmp(tok,"RESOLUTION_X")==0 ) + fscanf(bdf, "%d", &defs->res ); + else if ( strcmp(tok,"FONT_ASCENT")==0 ) + fscanf(bdf, "%d", &ascent ); + else if ( strcmp(tok,"FONT_DESCENT")==0 ) + fscanf(bdf, "%d", &descent ); + else if ( strcmp(tok,"UNDERLINE_POSITION")==0 ) + fscanf(bdf, "%d", upos ); + else if ( strcmp(tok,"UNDERLINE_THICKNESS")==0 ) + fscanf(bdf, "%d", uwidth ); + else if ( strcmp(tok,"SWIDTH")==0 ) + fscanf(bdf, "%d", &defs->swidth ); + else if ( strcmp(tok,"SWIDTH1")==0 ) + fscanf(bdf, "%d", &defs->swidth1 ); + else if ( strcmp(tok,"DWIDTH")==0 ) + fscanf(bdf, "%d", &defs->dwidth ); + else if ( strcmp(tok,"DWIDTH1")==0 ) + fscanf(bdf, "%d", &defs->dwidth1 ); + else if ( strcmp(tok,"METRICSSET")==0 ) + fscanf(bdf, "%d", &defs->metricsset ); + else if ( strcmp(tok,"VVECTOR")==0 ) + fscanf(bdf, "%*d %d", &defs->vertical_origin ); + else if ( strcmp(tok,"FOUNDRY")==0 ) + fscanf(bdf, " \"%[^\"]", foundry ); + else if ( strcmp(tok,"FONT_NAME")==0 ) + fscanf(bdf, " \"%[^\"]", fontname ); + else if ( strcmp(tok,"CHARSET_REGISTRY")==0 ) + fscanf(bdf, " \"%[^\"]", encname ); + else if ( strcmp(tok,"CHARSET_ENCODING")==0 ) { + enc = 0; + if ( fscanf(bdf, " \"%d", &enc )!=1 ) + fscanf(bdf, "%d", &enc ); + } else if ( strcmp(tok,"FAMILY_NAME")==0 ) { + ch = getc(bdf); + ch = getc(bdf); ungetc(ch,bdf); + fscanf(bdf, " \"%[^\"]", family ); + } else if ( strcmp(tok,"FULL_NAME")==0 ) { + ch = getc(bdf); + ch = getc(bdf); ungetc(ch,bdf); + fscanf(bdf, " \"%[^\"]", full ); + } else if ( strcmp(tok,"WEIGHT_NAME")==0 ) + fscanf(bdf, " \"%[^\"]", weight ); + else if ( strcmp(tok,"SLANT")==0 ) + fscanf(bdf, " \"%[^\"]", italic ); + else if ( strcmp(tok,"COPYRIGHT")==0 ) { + char *pt = comments; + char *eoc = comments+1000-1; + while ((ch=getc(bdf))==' ' || ch=='\t' ); + if ( ch=='"' ) ch = getc(bdf); + while ( ch!='\n' && ch!='\r' && ch!=EOF ) { + if ( ptcomments && pt[-1]=='\"' ) --pt; + *pt = '\0'; + ungetc('\n',bdf); + found_copyright = true; + } else if ( strcmp(tok,"COMMENT")==0 && !found_copyright ) { + char *pt = comments+strlen(comments); + char *eoc = comments+1000-1; + while ((ch=getc(bdf))==' ' || ch=='\t' ); + while ( ch!='\n' && ch!='\r' && ch!=EOF ) { + if ( pt= sf->charcnt ) { + int new = ((sf->charcnt+255)>>8)<<8; + sf->chars = grealloc(sf->chars,new*sizeof(SplineChar *)); + b->chars = grealloc(b->chars,new*sizeof(BDFChar *)); + for ( i=sf->charcnt; ichars[i] = NULL; + b->chars[i] = NULL; + } + sf->charcnt = b->charcnt = new; + } + if ( sf->chars[cc]==NULL ) + SFMakeChar(sf,cc); + if ( sf->onlybitmaps && ((sf->bitmaps==b && b->next==NULL) || sf->bitmaps==NULL) ) { + free(sf->chars[cc]->name); + sprintf( buf, "enc-%d", cc); + sf->chars[cc]->name = cleancopy( buf ); + sf->chars[cc]->unicodeenc = -1; + } + if ( cc>=b->charcnt ) + bc = chunkalloc(sizeof(BDFChar)); + else if ( (bc=b->chars[cc])!=NULL ) { + free(bc->bitmap); + BDFFloatFree(bc->selection); + } else { + b->chars[cc] = bc = chunkalloc(sizeof(BDFChar)); + bc->sc = sf->chars[cc]; + bc->enc = cc; + } +return(bc); +} + +static void gf_skip_noops(FILE *gf,char *char_name) { + uint8 cmd; + int32 val; + int i; + char buffer[257]; + + if ( char_name ) *char_name = '\0'; + + while ( 1 ) { + cmd = getc(gf); + switch( cmd ) { + case gf_no_op: /* One byte no-op */ + break; + case gf_yyy: /* followed by a 4 byte value */ + getc(gf); getc(gf); getc(gf); getc(gf); + break; + case gf_xxx1: + val = getc(gf); + for ( i=0; i>16; + dy = getlong(gf)>>16; + aw = (getlong(gf)*(sf->ascent+sf->descent))>>20; + to = getlong(gf); + } else if ( ch==gf_char_loc0 ) { + enc = getc(gf); + dx = getc(gf); + aw = (getlong(gf)*(sf->ascent+sf->descent))>>20; + to = getlong(gf); + } else +return( false ); + pos = ftell(gf); + fseek(gf,to,SEEK_SET); + + gf_skip_noops(gf,charname); + ch = getc(gf); + if ( ch==gf_boc ) { + /* encoding = */ getlong(gf); + /* backpointer = */ getlong(gf); + min_c = getlong(gf); + max_c = getlong(gf); + min_r = getlong(gf); + max_r = getlong(gf); + } else if ( ch==gf_boc1 ) { + /* encoding = */ getc(gf); + w = getc(gf); + max_c = getc(gf); + min_c = max_c-w+1; + w = getc(gf); + max_r = getc(gf); + min_r = max_r-w+1; + } else +return( false ); + + bc = SFGrowTo(sf,b,enc); + if ( charname[0]!='\0' && sf->onlybitmaps && (sf->bitmaps==NULL || + (sf->bitmaps==b && b->next==NULL )) ) { + free(sf->chars[enc]->name); + sf->chars[enc]->name = cleancopy(charname); + sf->chars[enc]->unicodeenc = -1; + } + bc->xmin = min_c; + bc->xmax = max_c>min_c? max_c : min_c; + bc->ymin = min_r; + bc->ymax = max_r>min_r? max_r : min_r; + bc->width = dx; + bc->bytes_per_line = ((bc->xmax-bc->xmin+8)>>3); + bc->bitmap = gcalloc(bc->bytes_per_line*(bc->ymax-bc->ymin+1),1); + + if ( sf->chars[enc]->layers[ly_fore].splines==NULL && sf->chars[enc]->layers[ly_fore].refs==NULL && + !sf->chars[enc]->widthset ) { + sf->chars[enc]->width = aw; + sf->chars[enc]->widthset = true; + } + + for ( r=min_r, c=min_c, col=0; r<=max_r; ) { + gf_skip_noops(gf,NULL); + ch = getc(gf); + if ( ch==gf_eoc ) + break; + if ( ch>=gf_paint_0 && ch<=gf_paint3b ) { + if ( ch>=gf_paint_0 && ch<=gf_paint_63 ) + cnt = ch-gf_paint_0; + else if ( ch==gf_paint1b ) + cnt = getc(gf); + else if ( ch==gf_paint2b ) + cnt = getushort(gf); + else + cnt = get3byte(gf); + if ( col ) { + for ( i=0; ibitmap[(r-min_r)*bc->bytes_per_line+((c-min_c)>>3)] + |= (0x80>>((c-min_c)&7)); + ++c; + /*if ( c>max_c ) { c-=max_c-min_c; ++r; }*/ + } + } else { + c+=cnt; + /*while ( c>max_c ) { c-=max_c-min_c; ++r; }*/ + } + col = !col; + } else if ( ch>=gf_newrow_0 && ch<=gf_newrow_164 ) { + ++r; + c = min_c + ch-gf_newrow_0; + col = 1; + } else if ( ch>=gf_skip0 && ch<=gf_skip3 ) { + col = 0; + c = min_c; + if ( ch==gf_skip0 ) + ++r; + else if ( ch==gf_skip1 ) + r += getc(gf)+1; + else if ( ch==gf_skip2 ) + r += getushort(gf)+1; + else + r += get3byte(gf)+1; + } else if ( ch==EOF ) { + fprintf( stderr, "Unexpected EOF in gf\n" ); + break; + } else + fprintf( stderr, "Uninterpreted code in gf: %d\n", ch); + } + fseek(gf,pos,SEEK_SET); +return( true ); +} + +/* ******************************** PK (TeX) ******************************** */ + +enum pk_cmd { pk_rrr1=240, pk_rrr2, pk_rrr3, pk_rrr4, pk_yyy, pk_post, pk_no_op, + pk_pre, pk_version_number=89 }; +static void pk_skip_noops(FILE *pk) { + uint8 cmd; + int32 val; + int i; + + while ( 1 ) { + cmd = getc(pk); + switch( cmd ) { + case pk_no_op: /* One byte no-op */ + break; + case pk_post: /* Signals start of noop section */ + break; + case pk_yyy: /* followed by a 4 byte value */ + getc(pk); getc(pk); getc(pk); getc(pk); + break; + case pk_rrr1: + val = getc(pk); + for ( i=0; ihold==1?(st->hold=0,(st->byte&0xf)):(st->hold=1,(((st->byte=getc(pk))>>4))) ) + + while ( 1 ) { + i = getnibble(pk,st); + if ( i==0 ) { + j=0; + while ( i==0 ) { ++j; i=getnibble(pk,st); } + while ( j>0 ) { --j; i = (i<<4) + getnibble(pk,st); } +return( i-15 + (13-st->dyn_f)*16 + st->dyn_f ); + } else if ( i<=st->dyn_f ) { +return( i ); + } else if ( i<14 ) { +return( (i-st->dyn_f-1)*16 + getnibble(pk,st) + st->dyn_f + 1 ); + } else { + if ( st->rpt!=0 ) + fprintf( stderr, "Duplicate repeat row count in char %d of pk file\n", st->cc ); + if ( i==15 ) st->rpt = 1; + else st->rpt = pkgetcount(pk,st); + /*printf( "[%d]", st->rpt );*/ + } + } +} + +static int pk_char(FILE *pk, SplineFont *sf, BDFFont *b) { + int flag = getc(pk); + int black, size_is_2; + int pl, cc, tfm, w, h, hoff, voff, dm, dx, dy; + int i, ch, j,r,c,cnt; + BDFChar *bc; + struct pkstate st; + int32 char_end; + + memset(&st,'\0', sizeof(st)); + + /* flag byte */ + st.dyn_f = (flag>>4); + if ( st.dyn_f==15 ) { + ungetc(flag,pk); +return( 0 ); + } + black = flag&8 ? 1 : 0; + size_is_2 = flag&4 ? 1 : 0; + + if ( (flag&7)==7 ) { /* long preamble, 4 byte sizes */ + pl = getlong(pk); + cc = getlong(pk); + char_end = ftell(pk) + pl; + tfm = get3byte(pk); + dx = getlong(pk)>>16; + dy = getlong(pk)>>16; + w = getlong(pk); + h = getlong(pk); + hoff = getlong(pk); + voff = getlong(pk); + } else if ( flag & 4 ) { /* extended preamble, 2 byte sizes */ + pl = getushort(pk) + ((flag&3)<<16); + cc = getc(pk); + char_end = ftell(pk) + pl; + tfm = get3byte(pk); + dm = getushort(pk); + dx = dm; dy = 0; + w = getushort(pk); + h = getushort(pk); + hoff = (short) getushort(pk); + voff = (short) getushort(pk); + } else { /* short, 1 byte sizes */ + pl = getc(pk) + ((flag&3)<<8); + cc = getc(pk); + char_end = ftell(pk) + pl; + tfm = get3byte(pk); + dm = getc(pk); + dx = dm; dy = 0; + w = getc(pk); + h = getc(pk); + hoff = (signed char) getc(pk); + voff = (signed char) getc(pk); + } + st.cc = cc; /* We can give better errors with this in st */ + /* hoff is -xmin, voff is ymax */ + /* w,h is the width,height of the bounding box */ + /* dx is the advance width? */ + /* cc is the character code */ + /* tfm is the advance width as a fraction of an em/2^20 so multiply by 1000/2^20 to get postscript values */ + /* dy is the advance height for vertical text? */ + + bc = SFGrowTo(sf,b,cc); + + bc->xmin = -hoff; + bc->ymax = voff; + bc->xmax = w-1-hoff; + bc->ymin = voff-h+1; + bc->width = dx; + bc->bytes_per_line = ((w+7)>>3); + bc->bitmap = gcalloc(bc->bytes_per_line*h,1); + + if ( sf->chars[cc]->layers[ly_fore].splines==NULL && sf->chars[cc]->layers[ly_fore].refs==NULL && + !sf->chars[cc]->widthset ) { + sf->chars[cc]->width = (sf->ascent+sf->descent)*(double) tfm/(0x100000); + sf->chars[cc]->widthset = true; + } + + if ( w==0 && h==0 ) + /* Nothing */; + else if ( st.dyn_f==14 ) { + /* We've got raster data in the file */ + for ( i=0; i<((w*h+7)>>3); ++i ) { + ch = getc(pk); + for ( j=0; j<8; ++j ) { + r = ((i<<3)+j)/w; + c = ((i<<3)+j)%w; + if ( rbitmap[r*bc->bytes_per_line+(c>>3)] |= (1<<(7-(c&7))); + } + } + } else { + /* We've got run-length encoded data */ + r = c = 0; + while ( r=w && st.rpt!=0 ) { + if ( black ) { + while ( cbitmap[r*bc->bytes_per_line+(c>>3)] |= (1<<(7-(c&7))); + --cnt; + ++c; + } + } else + cnt -= (w-c); + for ( i=0; ibitmap+(r+i+1)*bc->bytes_per_line, + bc->bitmap+r*bc->bytes_per_line, + bc->bytes_per_line ); + r += st.rpt+1; + c = 0; + st.rpt = 0; + } + while ( cnt>0 && r0) { + if ( black ) + bc->bitmap[r*bc->bytes_per_line+(c>>3)] |= (1<<(7-(c&7))); + --cnt; + ++c; + } + if ( c==w ) { + c = 0; + ++r; + } + } + black = !black; + } + } + if ( cc>=b->charcnt ) + BDFCharFree(bc); + if ( ftell(pk)!=char_end ) { + fprintf( stderr, "The character, %d, was not read properly (or pk file is in bad format)\n At %ld should be %d, off by %ld\n", cc, ftell(pk), char_end, ftell(pk)-char_end ); + fseek(pk,char_end,SEEK_SET); + } + /* printf( "\n" ); */ +return( 1 ); +} + +/* ****************************** PCF *************************************** */ + +struct toc { + int type; + int format; + int size; /* in 32bit words */ + int offset; +}; + +#define PCF_FILE_VERSION (('p'<<24)|('c'<<16)|('f'<<8)|1) + + /* table types */ +#define PCF_PROPERTIES (1<<0) +#define PCF_ACCELERATORS (1<<1) +#define PCF_METRICS (1<<2) +#define PCF_BITMAPS (1<<3) +#define PCF_INK_METRICS (1<<4) +#define PCF_BDF_ENCODINGS (1<<5) +#define PCF_SWIDTHS (1<<6) +#define PCF_GLYPH_NAMES (1<<7) +#define PCF_BDF_ACCELERATORS (1<<8) + + /* formats */ +#define PCF_DEFAULT_FORMAT 0x00000000 +#define PCF_INKBOUNDS 0x00000200 +#define PCF_ACCEL_W_INKBOUNDS 0x00000100 +#define PCF_COMPRESSED_METRICS 0x00000100 + +#define PCF_GLYPH_PAD_MASK (3<<0) +#define PCF_BYTE_MASK (1<<2) +#define PCF_BIT_MASK (1<<3) +#define PCF_SCAN_UNIT_MASK (3<<4) + +#define PCF_FORMAT_MASK 0xffffff00 +#define PCF_FORMAT_MATCH(a,b) (((a)&PCF_FORMAT_MASK) == ((b)&PCF_FORMAT_MASK)) + +#define MSBFirst 1 +#define LSBFirst 0 + +#define PCF_BYTE_ORDER(f) (((f) & PCF_BYTE_MASK)?MSBFirst:LSBFirst) +#define PCF_BIT_ORDER(f) (((f) & PCF_BIT_MASK)?MSBFirst:LSBFirst) +#define PCF_GLYPH_PAD_INDEX(f) ((f) & PCF_GLYPH_PAD_MASK) +#define PCF_GLYPH_PAD(f) (1<> 4) +#define PCF_SCAN_UNIT(f) (1<lsb = getc(file)-0x80; + metric->rsb = getc(file)-0x80; + metric->width = getc(file)-0x80; + metric->ascent = getc(file)-0x80; + metric->descent = getc(file)-0x80; + metric->attrs = 0; + } else { + metric->lsb = getformint16(file,format); + metric->rsb = getformint16(file,format); + metric->width = getformint16(file,format); + metric->ascent = getformint16(file,format); + metric->descent = getformint16(file,format); + metric->attrs = getformint16(file,format); + } +} + +static int pcfGetAccel(FILE *file, struct toc *toc,int which, struct pcfaccel *accel) { + int format; + + if ( !pcfSeekToType(file,toc,which)) +return(false); + format = getint32(file); + if ( (format&PCF_FORMAT_MASK)!=PCF_DEFAULT_FORMAT && + (format&PCF_FORMAT_MASK)!=PCF_ACCEL_W_INKBOUNDS ) +return(false); + accel->noOverlap = getc(file); + accel->constantMetrics = getc(file); + accel->terminalFont = getc(file); + accel->constantWidth = getc(file); + accel->inkInside = getc(file); + accel->inkMetrics = getc(file); + accel->drawDirection = getc(file); + /* padding = */ getc(file); + accel->ascent = getformint32(file,format); + accel->descent = getformint32(file,format); + accel->maxOverlap = getformint32(file,format); + pcfGetMetrics(file,false,format,&accel->minbounds); + pcfGetMetrics(file,false,format,&accel->maxbounds); + if ( (format&PCF_FORMAT_MASK)==PCF_ACCEL_W_INKBOUNDS ) { + pcfGetMetrics(file,false,format,&accel->ink_minbounds); + pcfGetMetrics(file,false,format,&accel->ink_maxbounds); + } else { + accel->ink_minbounds = accel->minbounds; + accel->ink_maxbounds = accel->maxbounds; + } +return( true ); +} + +static int pcf_properties(FILE *file,struct toc *toc, int *_as, int *_ds, + int *_enc, char *family, char *mods, char *full) { + int pixelsize = -1; + int ascent= -1, descent= -1, enc; + char encname[100], weight[100], italic[100]; + int cnt, i, format, strl, dash_cnt; + struct props { int name_offset; int isStr; int val; char *name; char *value; } *props; + char *strs, *pt; + + family[0] = '\0'; full[0] = '\0'; + if ( !pcfSeekToType(file,toc,PCF_PROPERTIES)) +return(-2); + format = getint32(file); + if ( (format&PCF_FORMAT_MASK)!=PCF_DEFAULT_FORMAT ) +return(-2); + cnt = getformint32(file,format); + props = galloc(cnt*sizeof(struct props)); + for ( i=0; icharcnt ) +return( false ); + offsets = galloc(cnt*sizeof(int)); + for ( i=0; ichars[i]; + if ( ibytes_per_line * (bc->ymax-bc->ymin+1)) + GDrawIError("Bad PCF glyph bitmap size"); + memcpy(bc->bitmap,bitmap+offsets[i], + bc->bytes_per_line * (bc->ymax-bc->ymin+1)); + GProgressNext(); + } + } else { + int pad = PCF_GLYPH_PAD(format); + for ( i=0; ichars[i]; + int bpl = ((bc->bytes_per_line+pad-1)/pad)*pad; + for ( j=bc->ymin; j<=bc->ymax; ++j ) + memcpy(bc->bitmap+(j-bc->ymin)*bc->bytes_per_line, + bitmap+offsets[i]+(j-bc->ymin)*bpl, + bc->bytes_per_line); + GProgressNext(); + } + } + free(bitmap); + free(offsets); +return( true ); +} + +static void PcfReadEncodingsNames(FILE *file,struct toc *toc,SplineFont *sf, + BDFFont *b, enum charset encname) { + int format, cnt, i, stringsize; + int *offsets=NULL; + char *string=NULL; + + if ( pcfSeekToType(file,toc,PCF_GLYPH_NAMES) && + ((format = getint32(file))&PCF_FORMAT_MASK)==PCF_DEFAULT_FORMAT && + (cnt = getformint32(file,format))==b->charcnt ) { + offsets = galloc(cnt*sizeof(int)); + for ( i=0; icharcnt; ++i ) + b->chars[i]->enc = -1; + for ( i=0; icharcnt ) { + b->chars[glyph]->enc = (i/(max2-min2+1) + min2)*256 + + (i%(max2-min2+1) + min1); + } + } + if ( defcharcnt && def!=0xffff ) + b->chars[def]->enc = 0; /* my standard location for .notdef */ + } + cnt = b->charcnt; + for ( i=0; ichars[i]->enc = figureProperEncoding(sf,b,b->chars[i]->enc,name,-1,-1,encname); + if ( b->chars[i]->enc!=-1 ) + b->chars[i]->sc = sf->chars[b->chars[i]->enc]; + } + free(string); free(offsets); +} + +static int PcfReadSWidths(FILE *file,struct toc *toc,BDFFont *b) { + int format, cnt, i; + + if ( !pcfSeekToType(file,toc,PCF_SWIDTHS)) +return(false); + format = getint32(file); + if ( (format&PCF_FORMAT_MASK)!=PCF_DEFAULT_FORMAT ) +return(false); + + cnt = getformint32(file,format); + if ( cnt>b->charcnt ) +return( false ); + for ( i=0; ichars[i]->sc!=NULL ) + b->chars[i]->sc->width = swidth; + } +return( true ); +} + +static int PcfParse(FILE *file,struct toc *toc,SplineFont *sf,BDFFont *b, + enum charset encname) { + int metrics_cnt; + struct pcfmetrics *metrics = pcfGetMetricsTable(file,toc,PCF_METRICS,&metrics_cnt); + int mcnt = metrics_cnt; + BDFChar **new, **mult; + int i, multcnt; + + if ( metrics==NULL ) +return( false ); + b->charcnt = mcnt; + b->chars = gcalloc(mcnt,sizeof(BDFChar *)); + for ( i=0; ichars[i] = chunkalloc(sizeof(BDFChar)); + b->chars[i]->xmin = metrics[i].lsb; + b->chars[i]->xmax = metrics[i].rsb-1; + if ( metrics[i].rsb==0 ) b->chars[i]->xmax = 0; + b->chars[i]->ymin = -metrics[i].descent; + b->chars[i]->ymax = metrics[i].ascent-1; + /*if ( metrics[i].ascent==0 ) b->chars[i]->ymax = 0;*/ /*??*/ + b->chars[i]->width = metrics[i].width; + b->chars[i]->bytes_per_line = ((b->chars[i]->xmax-b->chars[i]->xmin)>>3) + 1; + b->chars[i]->bitmap = galloc(b->chars[i]->bytes_per_line*(b->chars[i]->ymax-b->chars[i]->ymin+1)); + b->chars[i]->enc = i; + } + free(metrics); + + if ( !PcfReadBitmaps(file,toc,b)) +return( false ); + PcfReadEncodingsNames(file,toc,sf,b,encname); + if ( sf->onlybitmaps ) + PcfReadSWidths(file,toc,b); + new = gcalloc(sf->charcnt,sizeof(BDFChar *)); + mult = gcalloc(mcnt+1,sizeof(BDFChar *)); multcnt=0; + for ( i=0; ichars[i]; + int j; if ( bc->enc!=-1 ) for ( j=i+1; jchars[j]!=NULL && b->chars[j]->enc==bc->enc ) + printf( "Duplicate encoding. Both %d and %d map to %d\n", i, j, bc->enc ); + if ( bc->enc==-1 || bc->enc>=sf->charcnt ) + BDFCharFree(bc); + else if ( new[bc->enc]==NULL ) + new[bc->enc] = bc; + else + mult[multcnt++] = bc; + } + if ( multcnt!=0 ) { + for ( multcnt=0; mult[multcnt]!=NULL; multcnt++ ) { + for ( i=0; icharcnt; ++i ) + if ( new[i]==NULL ) { + new[i] = mult[multcnt]; + break; + } + } + } + free( b->chars ); + free( mult ); + b->chars = new; + b->charcnt = sf->charcnt; +return( true ); +} + +/* ************************* End Bitmap Formats ***************************** */ + +static int askusersize(char *filename) { + char *pt; + int guess; + unichar_t *ret, *end; + char def[10]; + unichar_t udef[10]; + + for ( pt=filename; *pt && !isdigit(*pt); ++pt ); + guess = strtol(pt,NULL,10); + if ( guess!=0 ) + sprintf(def,"%d",guess); + else + *def = '\0'; + uc_strcpy(udef,def); + retry: + ret = GWidgetAskStringR(_STR_PixelSize,udef,_STR_PixelSizeFont); + if ( ret==NULL ) + guess = -1; + else { + guess = u_strtol(ret,&end,10); + free(ret); + if ( guess<=0 || *end!='\0' ) { + GWidgetErrorR(_STR_BadNumber,_STR_BadNumber); + goto retry; + } + } +return( guess ); +} + +static int alreadyexists(int pixelsize) { + char buffer[10]; + unichar_t ubuf[200]; + const unichar_t *buts[3]; unichar_t oc[2]; + int ret; + + buts[2]=NULL; + buts[0] = GStringGetResource( _STR_OK, &oc[0]); + buts[1] = GStringGetResource( _STR_Cancel, &oc[1]); + + sprintf(buffer,"%d",pixelsize); + u_strcpy(ubuf, GStringGetResource(_STR_Duppixelsizepre,NULL)); + uc_strcat(ubuf,buffer); + u_strcat(ubuf, GStringGetResource(_STR_Duppixelsizepost,NULL)); + + ret = GWidgetAsk(GStringGetResource(_STR_Duppixelsize,NULL),buts,oc,0,1,ubuf)==0; + +return( ret ); +} + +BDFFont *SFImportBDF(SplineFont *sf, char *filename,int ispk, int toback) { + FILE *bdf; + char tok[100]; + int pixelsize, ascent, descent, enc; + BDFFont *b; + char family[100], mods[200], full[300], foundry[100], comments[1000], fontname[300]; + struct toc *toc=NULL; + int depth=1; + struct metrics defs; + int upos= 0x80000000, uwidth = 0x80000000; + + defs.swidth = defs.swidth1 = -1; defs.dwidth=defs.dwidth1=0; + defs.metricsset = 0; defs.vertical_origin = 0; + defs.res = -1; + foundry[0] = '\0'; + fontname[0] = '\0'; + comments[0] = '\0'; + + if ( ispk==1 && strcmp(filename+strlen(filename)-2,"gf")==0 ) + ispk = 3; + bdf = fopen(filename,"rb"); + if ( bdf==NULL ) { + GWidgetErrorR(_STR_CouldNotOpenFile, _STR_CouldNotOpenFileName, filename ); +return( NULL ); + } + if ( ispk==1 ) { + pixelsize = pk_header(bdf,&ascent,&descent,&enc,family,mods,full, filename); + if ( pixelsize==-2 ) { + fclose(bdf); + GWidgetErrorR(_STR_NotPkFile, _STR_NotPkFileName, filename ); +return( NULL ); + } + } else if ( ispk==3 ) { /* gf */ + pixelsize = gf_postamble(bdf,&ascent,&descent,&enc,family,mods,full, filename); + if ( pixelsize==-2 ) { + fclose(bdf); + GWidgetErrorR(_STR_NotGfFile, _STR_NotGfFileName, filename ); +return( NULL ); + } + } else if ( ispk==2 ) { /* pcf */ + if (( toc = pcfReadTOC(bdf))== NULL ) { + fclose(bdf); + GWidgetErrorR(_STR_NotPcfFile, _STR_NotPcfFileName, filename ); +return( NULL ); + } + pixelsize = pcf_properties(bdf,toc,&ascent,&descent,&enc,family,mods,full); + if ( pixelsize==-2 ) { + fclose(bdf); free(toc); + GWidgetErrorR(_STR_NotPcfFile, _STR_NotPcfFileName, filename ); +return( NULL ); + } + } else { + if ( gettoken(bdf,tok,sizeof(tok))==-1 || strcmp(tok,"STARTFONT")!=0 ) { + fclose(bdf); + GWidgetErrorR(_STR_NotBdfFile, _STR_NotBdfFileName, filename ); +return( NULL ); + } + pixelsize = slurp_header(bdf,&ascent,&descent,&enc,family,mods,full, + &depth,foundry,fontname,comments,&defs,&upos,&uwidth); + } + if ( pixelsize==-1 ) + pixelsize = askusersize(filename); + if ( pixelsize==-1 ) { + fclose(bdf); free(toc); +return( NULL ); + } + if ( !toback && sf->bitmaps==NULL && sf->onlybitmaps ) { + /* Loading first bitmap into onlybitmap font sets the name and encoding */ + SFSetFontName(sf,family,mods,full); + if ( fontname[0]!='\0' ) { + free(sf->fontname); + sf->fontname = copy(fontname); + } + SFReencodeFont(sf,enc); + if ( defs.metricsset!=0 ) { + sf->hasvmetrics = true; + sf->vertical_origin = defs.vertical_origin==0?sf->ascent:defs.vertical_origin; + } + sf->display_size = pixelsize; + if ( comments[0]!='\0' ) + sf->copyright = copy(comments); + if ( upos!=0x80000000 ) + sf->upos = upos; + if ( uwidth!=0x80000000 ) + sf->upos = uwidth; + } + + b = NULL; + if ( !toback ) + for ( b=sf->bitmaps; b!=NULL && (b->pixelsize!=pixelsize || BDFDepth(b)!=depth); b=b->next ); + if ( b!=NULL ) { + if ( !alreadyexists(pixelsize)) { + fclose(bdf); free(toc); +return( NULL ); + } + } + if ( b==NULL ) { + if ( ascent==-1 && descent==-1 ) + ascent = rint(pixelsize*sf->ascent/(real) (sf->ascent+sf->descent)); + if ( ascent==-1 && descent!=-1 ) + ascent = pixelsize - descent; + else if ( ascent!=-1 ) + descent = pixelsize -ascent; + b = gcalloc(1,sizeof(BDFFont)); + b->sf = sf; + b->charcnt = sf->charcnt; + b->pixelsize = pixelsize; + b->chars = gcalloc(sf->charcnt,sizeof(BDFChar *)); + b->ascent = ascent; + b->descent = pixelsize-b->ascent; + b->encoding_name = sf->encoding_name; + b->res = defs.res; + if ( depth!=1 ) + BDFClut(b,(1<<(depth/2))); + if ( !toback ) { + b->next = sf->bitmaps; + sf->bitmaps = b; + SFOrderBitmapList(sf); + } + } + free(b->foundry); + b->foundry = ( foundry[0]=='\0' ) ? NULL : copy(foundry); + if ( ispk==1 ) { + while ( pk_char(bdf,sf,b)); + } else if ( ispk==3 ) { + while ( gf_char(bdf,sf,b)); + } else if ( ispk==2 ) { + if ( !PcfParse(bdf,toc,sf,b,enc) ) { + GWidgetErrorR(_STR_NotPcfFile, _STR_NotPcfFileName, filename ); + } + } else { + while ( gettoken(bdf,tok,sizeof(tok))!=-1 ) { + if ( strcmp(tok,"STARTCHAR")==0 ) { + AddBDFChar(bdf,sf,b,depth,&defs,enc); + GProgressNext(); + } + } + } + fclose(bdf); free(toc); + sf->changed = true; +return( b ); +} + +static BDFFont *_SFImportBDF(SplineFont *sf, char *filename,int ispk, int toback) { + static struct { char *ext, *decomp, *recomp; } compressors[] = { + { "gz", "gunzip", "gzip" }, + { "bz2", "bunzip2", "bzip2" }, + { "Z", "gunzip", "compress" }, + { NULL } + }; + int i; + char *pt, *temp=NULL; + char buf[1500]; + BDFFont *ret; + + pt = strrchr(filename,'.'); + i = -1; + if ( pt!=NULL ) for ( i=0; compressors[i].ext!=NULL; ++i ) + if ( strcmp(compressors[i].ext,pt+1)==0 ) + break; + if ( i==-1 || compressors[i].ext==NULL ) i=-1; + else { + sprintf( buf, "%s %s", compressors[i].decomp, filename ); + if ( system(buf)==0 ) + *pt='\0'; + else { + /* Assume no write access to file */ + char *dir = getenv("TMPDIR"); + if ( dir==NULL ) dir = P_tmpdir; + temp = galloc(strlen(dir)+strlen(GFileNameTail(filename))+2); + strcpy(temp,dir); + strcat(temp,"/"); + strcat(temp,GFileNameTail(filename)); + *strrchr(temp,'.') = '\0'; + sprintf( buf, "%s -c %s > %s", compressors[i].decomp, filename, temp ); + if ( system(buf)==0 ) + filename = temp; + else { + free(temp); + GDrawError("Decompress failed" ); +return( NULL ); + } + } + } + ret = SFImportBDF(sf, filename,ispk, toback); + if ( temp!=NULL ) { + unlink(temp); + free(temp); + } else if ( i!=-1 ) { + sprintf( buf, "%s %s", compressors[i].recomp, filename ); + system(buf); + } +return( ret ); +} + +static void SFSetupBitmap(SplineFont *sf,BDFFont *strike) { + int i; + + strike->sf = sf; + if ( strike->charcnt>sf->charcnt ) + ExtendSF(sf,strike->charcnt,true); + for ( i=0; icharcnt; ++i ) if ( strike->chars[i]!=NULL ) { + if ( sf->chars[i]==NULL ) + MakeEncChar(sf,i,strike->chars[i]->sc->name); + strike->chars[i]->sc = sf->chars[i]; + } +} + +static void SFMergeBitmaps(SplineFont *sf,BDFFont *strikes) { + BDFFont *b, *prev, *snext; + + while ( strikes ) { + snext = strikes->next; + strikes->next = NULL; + for ( prev=NULL,b=sf->bitmaps; b!=NULL && + (b->pixelsize!=strikes->pixelsize || BDFDepth(b)!=BDFDepth(strikes)); + b=b->next ); + if ( b==NULL ) { + strikes->next = sf->bitmaps; + sf->bitmaps = strikes; + SFSetupBitmap(sf,strikes); + } else if ( !alreadyexists(strikes->pixelsize)) { + BDFFontFree(strikes); + } else { + strikes->next = b->next; + if ( prev==NULL ) + sf->bitmaps = strikes; + else + prev->next = strikes; + BDFFontFree(b); + SFSetupBitmap(sf,strikes); + } + strikes = snext; + } + SFOrderBitmapList(sf); +} + +static void SFAddToBackground(SplineFont *sf,BDFFont *bdf); + +int FVImportBDF(FontView *fv, char *filename, int ispk, int toback) { + BDFFont *b, *anyb=NULL; + unichar_t ubuf[140]; + char *eod, *fpt, *file, *full; + int fcnt, any = 0; + int oldcharcnt = fv->sf->charcnt; + + eod = strrchr(filename,'/'); + *eod = '\0'; + fcnt = 1; + fpt = eod+1; + while (( fpt=strstr(fpt,"; "))!=NULL ) + { ++fcnt; fpt += 2; } + + u_sprintf(ubuf, GStringGetResource(_STR_LoadingFrom,NULL), filename); + GProgressStartIndicator(10,GStringGetResource(_STR_Loading,NULL),ubuf,GStringGetResource(_STR_ReadingGlyphs,NULL),0,fcnt); + GProgressEnableStop(false); + + file = eod+1; + do { + fpt = strstr(file,"; "); + if ( fpt!=NULL ) *fpt = '\0'; + full = galloc(strlen(filename)+1+strlen(file)+1); + strcpy(full,filename); strcat(full,"/"); strcat(full,file); + u_sprintf(ubuf, GStringGetResource(_STR_LoadingFrom,NULL), filename); + GProgressChangeLine1(ubuf); + b = _SFImportBDF(fv->sf,full,ispk,toback); + free(full); + if ( fpt!=NULL ) GProgressNextStage(); + if ( b!=NULL ) { + anyb = b; + any = true; + if ( b==fv->show && fv->v!=NULL ) + GDrawRequestExpose(fv->v,NULL,false); + } + file = fpt+2; + } while ( fpt!=NULL ); + GProgressEndIndicator(); + if ( oldcharcnt != fv->sf->charcnt ) { + FontView *fvs; + for ( fvs=fv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + free(fvs->selected); + fvs->selected = gcalloc(fvs->sf->charcnt,sizeof(char)); + } + FontViewReformatAll(fv->sf); + } + if ( anyb==NULL ) { + GWidgetErrorR( _STR_NoBitmapFont, _STR_NoBitmapFontIn, filename ); + } else if ( toback ) + SFAddToBackground(fv->sf,anyb); +return( any ); +} + +static void SFAddToBackground(SplineFont *sf,BDFFont *bdf) { + struct _GImage *base; + GClut *clut; + GImage *img; + int i; + SplineChar *sc; BDFChar *bdfc; + real scale = (sf->ascent+sf->descent)/(double) (bdf->ascent+bdf->descent); + real yoff = sf->ascent-bdf->ascent*scale; + + for ( i=0; icharcnt && icharcnt; ++i ) { + if ( bdf->chars[i]!=NULL ) { + if ( sf->chars[i]==NULL ) + SFMakeChar(sf,i); + sc = sf->chars[i]; + bdfc = bdf->chars[i]; + + base = gcalloc(1,sizeof(struct _GImage)); + base->image_type = it_mono; + base->data = bdfc->bitmap; + base->bytes_per_line = bdfc->bytes_per_line; + base->width = bdfc->xmax-bdfc->xmin+1; + base->height = bdfc->ymax-bdfc->ymin+1; + bdfc->bitmap = NULL; + + clut = gcalloc(1,sizeof(GClut)); + clut->clut_len = 2; + clut->clut[0] = screen_display==NULL? 0xffffff : GDrawGetDefaultBackground(NULL); + clut->clut[1] = 0x808080; + clut->trans_index = 0; + base->trans = 0; + base->clut = clut; + + img = gcalloc(1,sizeof(GImage)); + img->u.image = base; + + SCInsertImage(sc,img,scale,yoff+(bdfc->ymax+1)*scale,bdfc->xmin*scale,ly_back); + } + } + BDFFontFree(bdf); +} + +int FVImportMult(FontView *fv, char *filename, int toback, int bf) { + SplineFont *strikeholder, *sf = fv->sf; + BDFFont *strikes; + unichar_t ubuf[100]; + + u_snprintf(ubuf, sizeof(ubuf)/sizeof(ubuf[0]), GStringGetResource(_STR_LoadingFrom,NULL), filename); + GProgressStartIndicator(10,GStringGetResource(_STR_Loading,NULL),ubuf,GStringGetResource(_STR_ReadingGlyphs,NULL),0,2); + GProgressEnableStop(false); + + if ( bf == bf_ttf ) + strikeholder = SFReadTTF(filename,toback?ttf_onlyonestrike|ttf_onlystrikes:ttf_onlystrikes); + else if ( bf == bf_fon ) + strikeholder = SFReadWinFON(filename,toback); + else + strikeholder = SFReadMacBinary(filename,toback?ttf_onlyonestrike|ttf_onlystrikes:ttf_onlystrikes); + + if ( strikeholder==NULL || (strikes = strikeholder->bitmaps)==NULL ) { + SplineFontFree(strikeholder); + GProgressEndIndicator(); +return( false ); + } + SFMatchEncoding(strikeholder,sf); + if ( toback ) + SFAddToBackground(sf,strikes); + else + SFMergeBitmaps(sf,strikes); + + strikeholder->bitmaps =NULL; + SplineFontFree(strikeholder); + GProgressEndIndicator(); +return( true ); +} + +SplineFont *SFFromBDF(char *filename,int ispk,int toback) { + SplineFont *sf = SplineFontNew(); + BDFFont *bdf = SFImportBDF(sf,filename,ispk,toback); + + if ( toback ) + SFAddToBackground(sf,bdf); + else + sf->changed = false; +return( sf ); +} diff --git a/fontforge/fvmetrics.c b/fontforge/fvmetrics.c new file mode 100644 index 00000000..56324488 --- /dev/null +++ b/fontforge/fvmetrics.c @@ -0,0 +1,384 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include + +typedef struct createwidthdata { + unsigned int done: 1; + void *_fv; + void (*doit)(struct createwidthdata *); + GWindow gw; + real setto; + real scale; + real increment; + enum settype { st_set, st_scale, st_incr } type; + enum widthtype wtype; +} CreateWidthData; + +#define CID_Set 1001 +#define CID_Incr 1002 +#define CID_Scale 1003 +#define CID_SetVal 1011 +#define CID_IncrVal 1012 +#define CID_ScaleVal 1013 + +static int rb1[] = { _STR_SetWidthTo, _STR_SetLBearingTo, _STR_SetRBearingTo, _STR_SetVWidthTo }; +static int rb2[] = { _STR_IncrWidthBy, _STR_IncrLBearingBy, _STR_IncrRBearingBy, _STR_IncrVWidthBy }; +static int rb3[] = { _STR_ScaleWidthBy, _STR_ScaleLBearingBy, _STR_ScaleRBearingBy, _STR_ScaleVWidthBy }; + +static int CW_OK(GGadget *g, GEvent *e) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + int err; + CreateWidthData *wd = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GGadgetIsChecked(GWidgetGetControl(wd->gw,CID_Set)) ) { + wd->type = st_set; + wd->setto = GetRealR(wd->gw,CID_SetVal,rb1[wd->wtype],&err); + if ( wd->setto<0 ) { + if ( GWidgetAskR(_STR_NegativeWidth, buts, 0, 1, _STR_NegativeWidthCheck )==1 ) +return( true ); + } + } else if ( GGadgetIsChecked(GWidgetGetControl(wd->gw,CID_Incr)) ) { + wd->type = st_incr; + wd->increment = GetRealR(wd->gw,CID_IncrVal,rb2[wd->wtype],&err); + } else { + wd->type = st_scale; + wd->scale = GetRealR(wd->gw,CID_ScaleVal,rb2[wd->wtype],&err); + } + (wd->doit)(wd); + } +return( true ); +} + +static int CW_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + CreateWidthData *wd = GDrawGetUserData(GGadgetGetWindow(g)); + wd->done = true; + } +return( true ); +} + +static int CW_FocusChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textfocuschanged ) { + CreateWidthData *wd = GDrawGetUserData(GGadgetGetWindow(g)); + int cid = (int) GGadgetGetUserData(g); + GGadgetSetChecked(GWidgetGetControl(wd->gw,cid),true); + } +return( true ); +} + +static int CW_RadioChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + CreateWidthData *wd = GDrawGetUserData(GGadgetGetWindow(g)); + int cid = (int) GGadgetGetUserData(g); + GWidgetIndicateFocusGadget(GWidgetGetControl(wd->gw,cid)); + GTextFieldSelect(GWidgetGetControl(wd->gw,cid),0,-1); + } +return( true ); +} + +static int cwd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + CreateWidthData *wd = GDrawGetUserData(gw); + wd->done = true; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +static void FVCreateWidth(void *_fv,void (*doit)(CreateWidthData *), + enum widthtype wtype, char *def) { + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[11]; + GTextInfo label[11]; + static CreateWidthData cwd; + static GWindow winds[3]; + static int title[] = { _STR_Setwidth, _STR_Setlbearing, _STR_Setrbearing, _STR_SetVWidth }; + + cwd.done = false; + cwd._fv = _fv; + cwd.wtype = wtype; + cwd.doit = doit; + cwd.gw = winds[wtype]; + + if ( cwd.gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<wtype == wt_width ) { + if ( wd->type==st_set ) + width = wd->setto; + else if ( wd->type == st_incr ) + width = sc->width + wd->increment; + else + width = sc->width * wd->scale/100; + sc->widthset = true; + if ( width!=sc->width ) { + SCPreserveWidth(sc); + SCSynchronizeWidth(sc,width,sc->width,fv); + } + } else if ( wd->wtype == wt_lbearing ) { + SplineCharFindBounds(sc,&bb); + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0; + if ( wd->type==st_set ) + transform[4] = wd->setto-bb.minx; + else if ( wd->type == st_incr ) + transform[4] = wd->increment; + else + transform[4] = bb.minx*wd->scale/100 - bb.minx; + if ( transform[4]!=0 ) + FVTrans(fv,sc,transform,NULL,false); +return; + } else if ( wd->wtype == wt_rbearing ) { + SplineCharFindBounds(sc,&bb); + if ( wd->type==st_set ) + width = bb.maxx + wd->setto; + else if ( wd->type == st_incr ) + width = sc->width+wd->increment; + else + width = (sc->width-bb.maxx) * wd->scale/100 + bb.maxx; + if ( width!=sc->width ) { + SCPreserveWidth(sc); + SCSynchronizeWidth(sc,width,sc->width,fv); + } + } else { + if ( wd->type==st_set ) + width = wd->setto; + else if ( wd->type == st_incr ) + width = sc->vwidth + wd->increment; + else + width = sc->vwidth * wd->scale/100; + if ( width!=sc->vwidth ) { + SCPreserveVWidth(sc); + sc->vwidth = width; + } + } + SCCharChangedUpdate(sc); +} + +static void FVDoit(CreateWidthData *wd) { + FontView *fv = (FontView *) (wd->_fv); + int i; + + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] ) { + SplineChar *sc = fv->sf->chars[i]; + + if ( sc==NULL ) + sc = SFMakeChar(fv->sf,i); + DoChar(sc,wd,fv); + } + wd->done = true; +} + +static void CVDoit(CreateWidthData *wd) { + CharView *cv = (CharView *) (wd->_fv); + + DoChar(cv->sc,wd,cv->fv); + wd->done = true; +} + +static void SCDefWidthVal(char *buf,SplineChar *sc, enum widthtype wtype) { + DBounds bb; + + if ( wtype==wt_width ) + sprintf( buf, "%d", sc->width ); + else if ( wtype==wt_vwidth ) + sprintf( buf, "%d", sc->vwidth ); + else { + SplineCharFindBounds(sc,&bb); + if ( wtype==wt_lbearing ) + sprintf( buf, "%.4g", bb.minx ); + else + sprintf( buf, "%.4g", sc->width-bb.maxx ); + } +} + +void FVSetWidth(FontView *fv,enum widthtype wtype) { + char buffer[12]; + int i; + + strcpy(buffer,wtype==wt_width?"600":wtype==wt_vwidth?"1000": "100" ); + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] && fv->sf->chars[i]!=NULL ) { + SCDefWidthVal(buffer,fv->sf->chars[i],wtype); + break; + } + + FVCreateWidth(fv,FVDoit,wtype,buffer); +} + +void CVSetWidth(CharView *cv,enum widthtype wtype) { + char buf[10]; + + SCDefWidthVal(buf,cv->sc,wtype); + FVCreateWidth(cv,CVDoit,wtype,buf); +} + +void FVSetWidthScript(FontView *fv,enum widthtype wtype,int val,int incr) { + CreateWidthData wd; + + memset(&wd,0,sizeof(wd)); + wd._fv = fv; + wd.doit = FVDoit; + wd.setto = wd.increment = wd.scale = val; + wd.type = incr==0 ? st_set : incr==2 ? st_scale : st_incr; + wd.wtype = wtype; + FVDoit(&wd); +} diff --git a/fontforge/genttfinstrs.c b/fontforge/genttfinstrs.c new file mode 100644 index 00000000..4106150f --- /dev/null +++ b/fontforge/genttfinstrs.c @@ -0,0 +1,1724 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include + +#include "ttf.h" + +struct glyphinstrs { + SplineFont *sf; + BlueData *bd; + int fudge; +}; + +extern int autohint_before_generate; + +struct ttf_table *SFFindTable(SplineFont *sf,uint32 tag) { + struct ttf_table *tab; + + for ( tab=sf->ttf_tables; tab!=NULL && tab->tag!=tag; tab=tab->next ); +return( tab ); +} + +int TTF__getcvtval(SplineFont *sf,int val) { + int i; + struct ttf_table *cvt_tab = SFFindTable(sf,CHR('c','v','t',' ')); + + if ( cvt_tab==NULL ) { + cvt_tab = chunkalloc(sizeof(struct ttf_table)); + cvt_tab->tag = CHR('c','v','t',' '); + cvt_tab->maxlen = 200; + cvt_tab->data = galloc(100*sizeof(short)); + cvt_tab->next = sf->ttf_tables; + sf->ttf_tables = cvt_tab; + } + for ( i=0; sizeof(uint16)*ilen; ++i ) { + int tval = memushort(cvt_tab->data,sizeof(uint16)*i); + if ( val>=tval-1 && val<=tval+1 ) +return( i ); + } + if ( sizeof(uint16)*i>=cvt_tab->maxlen ) { + if ( cvt_tab->maxlen==0 ) cvt_tab->maxlen = cvt_tab->len; + cvt_tab->maxlen += 200; + cvt_tab->data = grealloc(cvt_tab->data,cvt_tab->maxlen); + } + memputshort(cvt_tab->data,sizeof(uint16)*i,val); + cvt_tab->len += sizeof(uint16); +return( i ); +} + +int TTF_getcvtval(SplineFont *sf,int val) { + + /* by default sign is unimportant in the cvt */ + /* For some instructions anyway, but not for MIAP so this routine has */ + /* been broken in two. */ + if ( val<0 ) val = -val; +return( TTF__getcvtval(sf,val)); +} + +static uint8 *pushheader(uint8 *instrs, int isword, int tot) { + if ( isword ) { + if ( tot>8 ) { + *instrs++ = 0x41; /* N(next byte) Push words */ + *instrs++ = tot; + } else + *instrs++ = 0xb8+(tot-1); /* Push Words */ + } else { + if ( tot>8 ) { + *instrs++ = 0x40; /* N(next byte) Push bytes */ + *instrs++ = tot; + } else + *instrs++ = 0xb0+(tot-1); /* Push bytes */ + } +return( instrs ); +} + +static uint8 *addpoint(uint8 *instrs,int isword,int pt) { + if ( !isword ) { + *instrs++ = pt; + } else { + *instrs++ = pt>>8; + *instrs++ = pt&0xff; + } +return( instrs ); +} + +static uint8 *pushpoint(uint8 *instrs,int pt) { + instrs = pushheader(instrs,pt>255,1); +return( addpoint(instrs,pt>255,pt)); +} + +static uint8 *pushpointstem(uint8 *instrs,int pt, int stem) { + int isword = pt>255 || stem>255; + instrs = pushheader(instrs,isword,2); + instrs = addpoint(instrs,isword,pt); +return( addpoint(instrs,isword,stem)); +} + + +static uint8 *SetRP0To(uint8 *instrs, real hbase, BasePoint *bp, int ptcnt, + int xdir, real fudge) { + int i; + + for ( i=0; i=hbase-fudge && bp[i].x<=hbase+fudge) || + (!xdir && bp[i].y>=hbase-fudge && bp[i].y<=hbase+fudge) ) { + instrs = pushpoint(instrs,i); + *instrs++ = 0x10; /* Set RP0, SRP0 */ +return( instrs ); + } + } +return( instrs ); +} + +static real BDFindValue(real base, BlueData *bd, int isbottom ) { + real replace = 0x80000000; + + if ( isbottom ) { + if ( base>= bd->basebelow && base<=bd->base ) + replace = 0; + } else { + if ( base>=bd->caph && base<=bd->caphtop ) + replace = bd->caph; + else if ( base>=bd->xheight && base<=bd->xheighttop ) + replace = bd->xheight; + } + /* I'm allowing ascent and descent's to wiggle */ +return( replace ); +} + +/* Run through all points. For any on this hint's start, position them */ +/* If the first point of this hint falls in a blue zone, do a cvt based */ +/* positioning, else +/* The first point on the first hint is positioned to where it is (dull) */ +/* (or if the last hint overlaps this hint) */ +/* The first point of this hint is positioned offset from the last hint */ +/* (unless the two overlap) */ +/* Any other points are moved by the same amount as the last move */ +/* Run through the points again, for any pts on this hint's end: */ +/* Position them offset from the hint's start */ +/* Complications: */ +/* If the hint start isn't in a blue zone, but the hint end is, then */ +/* treat the end as the start with a negative width */ +/* If we have overlapping hints then either the points on the start or end */ +/* may already have been positioned. We won't be called if both have been*/ +/* positioned. If the end points have been positioned then reverse the */ +/* hint again. If either edge has been done, then all we need to do is */ +/* establish a reference point on that edge, don't need to position all */ +/* the points again. */ +static uint8 *geninstrs(struct glyphinstrs *gi, uint8 *instrs,StemInfo *hint, + int *contourends, BasePoint *bp, int ptcnt, StemInfo *firsthint, int xdir, + uint8 *touched) { + int i; + int last= -1; + int stem, basecvt=-1; + real hbase, base, width, newbase; + StemInfo *h; + real fudge = gi->fudge; + int inrp; + StemInfo *lasthint=NULL, *testhint; + int first; + + for ( testhint = firsthint; testhint!=NULL && testhint!=hint; testhint = testhint->next ) { + if ( HIoverlap(testhint->where,hint->where)!=0 ) + lasthint = testhint; + } + first = lasthint==NULL; + if ( hint->hasconflicts ) + first = true; /* if this hint has conflicts don't try to establish a minimum distance between it and the last stem, there might not be one */ + + hbase = base = rint(hint->start); width = rint(hint->width); + if ( !xdir ) { + /* check the "bluevalues" for things like cap height, xheight and */ + /* baseline. But only check if the top of a stem is at capheight */ + /* or xheight, and only if the bottom is at baseline */ + if ( width<0 ) { + hbase = (base += width); + width = -width; + } + if ( (newbase = BDFindValue(base,gi->bd,true))!= 0x80000000 ) { + base = newbase; + basecvt = TTF__getcvtval(gi->sf,(int)base); + } + if ( basecvt == -1 && !hint->startdone ) { + hbase = (base += width); + if ( (newbase = BDFindValue(base,gi->bd,false))!= 0x80000000 ) { + base = newbase; + basecvt = TTF__getcvtval(gi->sf,(int)base); + } + if ( basecvt!=-1 ) + width = -width; + else + hbase = (base -= width); + } + } + if ( hbase==rint(hint->start) && hint->enddone ) { + base = (hbase += width); + width = -width; + basecvt = -1; + } + + /* Position all points on this hint's base */ + if (( width>0 && !hint->startdone) || (width<0 && !hint->enddone)) { + inrp = -1; + for ( i=0; i=hbase-fudge && bp[i].x<=hbase+fudge) || + (!xdir && bp[i].y>=hbase-fudge && bp[i].y<=hbase+fudge) ) { + if ( basecvt!=-1 && last==-1 ) { + instrs = pushpointstem(instrs,i,basecvt); + *instrs++ = 0x3f; /* MIAP, rounded, set rp0,rp1 */ + first = false; + inrp = 1; + } else { + instrs = pushpoint(instrs,i); + if ( first ) { + /* set rp0 */ + *instrs++ = 0x2f; /* MDAP, rounded, set rp0,rp1 */ + first = false; + inrp = 1; + } else if ( last==-1 ) { + /* set rp0 relative to last hint */ + instrs = SetRP0To(instrs,lasthint->width>0?lasthint->start+lasthint->width:lasthint->start, + bp,ptcnt,xdir,fudge); + *instrs++ = 0xc0+0x1e; /* MDRP, set rp0,rp2, minimum, rounded, white */ + inrp = 2; + } else { + *instrs++ = inrp==1?0x33:0x32; /* SHP, rp1 or rp2 */ + } + } + touched[i] |= (xdir?1:2); + last = i; + } + } + if ( last==-1 ) /* I'm confused. But if the hint doesn't start*/ +return(instrs); /* anywhere, can't give it a width */ + /* Some hints aren't associated with points */ + } else { + /* Need to find something to be a reference point, doesn't matter */ + /* what. Note that it should already have been positioned */ + instrs = SetRP0To(instrs,hbase, bp,ptcnt,xdir,fudge); + } + + /* Position all points on this hint's base+width */ + stem = TTF_getcvtval(gi->sf,width); + last = -1; + for ( i=0; i=hbase+width-fudge && bp[i].x<=hbase+width+fudge) || + (!xdir && bp[i].y>=hbase+width-fudge && bp[i].y<=hbase+width+fudge) ) { + instrs = pushpointstem(instrs,i,stem); + *instrs++ = 0xe0+0x0d; /* MIRP, minimum, rounded, black */ + touched[i] |= (xdir?1:2); + last = i; + } + } + + for ( h=hint->next; h!=NULL && h->start<=hint->start+hint->width; h=h->next ) { + if ( (h->start>=hint->start-gi->fudge && h->start<=hint->start+gi->fudge) || + (h->start>=hint->start+hint->width-gi->fudge && h->start<=hint->start+hint->width+gi->fudge) ) + h->startdone = true; + if ( (h->start+h->width>=hint->start-gi->fudge && h->start+h->width<=hint->start+gi->fudge) || + (h->start+h->width>=hint->start+hint->width-gi->fudge && h->start+h->width<=hint->start+hint->width+gi->fudge) ) + h->enddone = true; + } + +return( instrs ); +} + +/* diagonal stem hints */ +/* Several DStemInfo hints may actually be colinear. This structure contains all on the line */ +typedef struct dstem { + struct dstem *next; + BasePoint leftedgetop, leftedgebottom, rightedgetop, rightedgebottom; + int pnum[4]; + /*struct dsteminfolist { struct dsteminfolist *next; DStemInfo *d; int pnum[4];} *dl;*/ + uint8 *used; /* Points lying near this diagonal 1=>left edge, 2=> right, 0=> off */ + struct dstemlist { struct dstemlist *next; struct dstem *ds; BasePoint *is[4]; int pnum[4]; int done;} *intersects; + struct dstemlist *top, *bottom; + unsigned int done: 1; +} DStem; +enum intersect { in_ll, in_lr, in_rl, in_rr }; /* intersection of: two left edges, left/right, right/left, right/right */ + +static int CoLinear(BasePoint *top1, BasePoint *bottom1, + BasePoint *top2, BasePoint *bottom2 ) { + double scale, slope, y; + + if ( top1->y==bottom1->y ) +return( RealWithin(top1->y,top2->y,1) && RealWithin(top1->y,bottom2->y,1) ); + else if ( top2->y==bottom2->y ) +return( RealWithin(top2->y,top1->y,1) && RealWithin(top2->y,bottom1->y,1) ); + + scale = (top2->y-bottom2->y)/(top1->y-bottom1->y); + slope = (top1->y-bottom1->y)/(top1->x-bottom1->x); + if ( !RealWithin(top2->x,bottom2->x+(top1->x-bottom1->x)*scale,10) && + !RealWithin(top2->y,bottom2->y+slope*(top2->x-bottom2->x),12) ) +return( false ); + + y = bottom1->y + slope*(top2->x-bottom1->x); + if ( !RealWithin(y,top2->y,6) ) +return( false ); + +return( true ); +} + +static int BpIndex(BasePoint *search,BasePoint *bp,int ptcnt) { + int i; + + for ( i=0; ix) == bp[i].x && rint(search->y)==bp[i].y ) +return( i ); + +return( -1 ); +} + +static DStem *DStemMerge(DStemInfo *d, BasePoint *bp, int ptcnt, uint8 *touched) { + DStemInfo *di, *di2; + DStem *head=NULL, *cur; + int i, j, nexti; + BasePoint *top, *bottom; + DStem **map[2]; + + for ( di=d; di!=NULL; di=di->next ) di->used = false; + for ( di=d; di!=NULL; di=di->next ) if ( !di->used ) { + cur = chunkalloc(sizeof(DStem)); + memset(cur->pnum,-1,sizeof(cur->pnum)); + cur->used = gcalloc(ptcnt,sizeof(uint8)); + cur->leftedgetop = di->leftedgetop; + cur->pnum[0] = BpIndex(&di->leftedgetop,bp,ptcnt); + cur->leftedgebottom = di->leftedgebottom; + cur->pnum[1] = BpIndex(&di->leftedgebottom,bp,ptcnt); + cur->rightedgetop = di->rightedgetop; + cur->pnum[2] = BpIndex(&di->rightedgetop,bp,ptcnt); + cur->rightedgebottom = di->rightedgebottom; + cur->pnum[3] = BpIndex(&di->rightedgebottom,bp,ptcnt); + cur->used[cur->pnum[0]] = cur->used[cur->pnum[1]] = 1; + cur->used[cur->pnum[2]] = cur->used[cur->pnum[3]] = 2; + cur->next = head; + head = cur; + for ( di2 = di->next; di2!=NULL; di2 = di2->next ) if ( !di2->used ) { + if (( CoLinear(&di->leftedgetop, &di->leftedgebottom, + &di2->leftedgetop, &di2->leftedgebottom) && + CoLinear(&di->rightedgetop, &di->rightedgebottom, + &di2->rightedgetop, &di2->rightedgebottom) ) || + (di->leftedgetop.x==di2->leftedgetop.x && + di->leftedgetop.y==di2->leftedgetop.y && + di->leftedgebottom.x==di2->leftedgebottom.x && + di->leftedgebottom.y==di2->leftedgebottom.y ) || + (di->rightedgetop.x==di2->rightedgetop.x && + di->rightedgetop.y==di2->rightedgetop.y && + di->rightedgebottom.x==di2->rightedgebottom.x && + di->rightedgebottom.y==di2->rightedgebottom.y )) { + if ( di->leftedgetop.x!=di2->leftedgetop.x || + di->leftedgetop.y!=di2->leftedgetop.y ) { + i = BpIndex(&di2->leftedgetop,bp,ptcnt); + cur->used[i] = 1; + if ( cur->leftedgetop.yleftedgetop.y ) { + cur->leftedgetop = di2->leftedgetop; + cur->pnum[0] = i; + } + } + if ( di->leftedgebottom.x!=di2->leftedgebottom.x || + di->leftedgebottom.y!=di2->leftedgebottom.y ) { + i = BpIndex(&di2->leftedgebottom,bp,ptcnt); + cur->used[i] = 1; + if ( cur->leftedgebottom.y>di2->leftedgebottom.y ) { + cur->leftedgebottom = di2->leftedgebottom; + cur->pnum[1] = i; + } + } + if ( di->rightedgetop.x!=di2->rightedgetop.x || + di->rightedgetop.y!=di2->rightedgetop.y ) { + i = BpIndex(&di2->rightedgetop,bp,ptcnt); + cur->used[i] = 2; + if ( cur->rightedgetop.yrightedgetop.y ) { + cur->rightedgetop = di2->rightedgetop; + cur->pnum[2] = i; + } + } + if ( di->rightedgebottom.x!=di2->rightedgebottom.x || + di->rightedgebottom.y!=di2->rightedgebottom.y ) { + i = BpIndex(&di2->rightedgebottom,bp,ptcnt); + cur->used[i] = 2; + if ( cur->rightedgebottom.y>di2->rightedgebottom.y ) { + cur->rightedgebottom = di2->rightedgebottom; + cur->pnum[3] = i; + } + } + di2->used = true; + } + } + } + + map[0] = gcalloc(ptcnt,sizeof(DStem *)); + map[1] = gcalloc(ptcnt,sizeof(DStem *)); + for ( cur = head; cur!=NULL; cur=cur->next ) { + for ( i=0; iused[i]) { + if ( map[0][i]==NULL ) map[0][i] = cur; + else map[1][i] = cur; + } + } + } + + /* sometimes we don't find all the bits of a diagonal stem */ + /* "k" is an example, we don't notice the stub between the vertical stem and the lower diagonal stem */ + for ( cur = head; cur!=NULL; cur=cur->next ) { + for ( i=0; i0 && !(touched[j]&tf_startcontour); --j); + nexti = j; + } + if ( map[1][i]!=NULL || map[1][nexti]!=NULL || + (map[0][i]!=NULL && map[0][i]==map[0][nexti] )) + continue; /* These points are already on a diagonal, off just enough that we can't find a line... */ + if ( CoLinear(&cur->leftedgetop,&cur->leftedgebottom,&bp[i],&bp[nexti])) { + top = &bp[i]; bottom = &bp[nexti]; + if ( top->yy ) { top = bottom; bottom = &bp[i]; } + cur->used[i] = cur->used[nexti] = 1; + if ( cur->leftedgetop.y>top->y ) { + cur->leftedgetop = *top; + cur->pnum[0] = i; + } + if ( cur->leftedgebottom.y>bottom->y ) { + cur->leftedgebottom = *bottom; + cur->pnum[1] = i; + } + if ( map[0][i]==NULL ) map[0][i] = cur; + else map[1][i] = cur; + if ( map[0][nexti]==NULL ) map[0][nexti] = cur; + else map[1][nexti] = cur; + } else if ( CoLinear(&cur->rightedgetop,&cur->rightedgebottom,&bp[i],&bp[nexti])) { + top = &bp[i]; bottom = &bp[nexti]; + if ( top->yy ) { top = bottom; bottom = &bp[i]; } + cur->used[i] = cur->used[nexti] = 2; + if ( cur->rightedgetop.y>top->y ) { + cur->rightedgetop = *top; + cur->pnum[2] = i; + } + if ( cur->rightedgebottom.y>bottom->y ) { + cur->rightedgebottom = *bottom; + cur->pnum[3] = i; + } + if ( map[0][i]==NULL ) map[0][i] = cur; + else map[1][i] = cur; + if ( map[0][nexti]==NULL ) map[0][nexti] = cur; + else map[1][nexti] = cur; + } + } + } + + free(map[0]); + free(map[1]); + +return( head ); +} + +static void DStemFree(DStem *d) { + DStem *next; + struct dstemlist *dsl, *dslnext; + + while ( d!=NULL ) { + next = d->next; + for ( dsl=d->intersects; dsl!=NULL; dsl=dslnext ) { + dslnext = dsl->next; + chunkfree(dsl,sizeof(struct dstemlist)); + } + free(d->used); + chunkfree(d,sizeof(DStem)); + d = next; + } +} + +static struct dstemlist *BuildDStemIntersection(DStem *d,DStem *ds, + struct dstemlist *i1, struct dstemlist **_i2, + BasePoint *inter, enum intersect which, int pnum) { + struct dstemlist *i2 = *_i2; + + if ( i1==NULL ) { + i1 = chunkalloc(sizeof(struct dstemlist)); + memset(i1->pnum,-1,sizeof(i1->pnum)); + i1->ds = ds; + i1->next = d->intersects; + d->intersects = i1; + *_i2 = i2 = chunkalloc(sizeof(struct dstemlist)); + memset(i2->pnum,-1,sizeof(i2->pnum)); + i2->ds = d; + i2->next = ds->intersects; + ds->intersects = i2; + } + if ( i1->is[which]!=NULL ) + GDrawIError("BuildDStemIntersection: is[%d] set twice", which); + i1->is[which] = inter; + i1->pnum[which] = pnum; + if ( which==in_rl ) which = in_lr; + else if ( which==in_lr ) which = in_rl; + i2->is[which] = inter; + i2->pnum[which] = pnum; +return( i1 ); +} + +static void DStemIntersect(DStem *d,BasePoint *bp,int ptcnt) { + /* For each DStem, see if it intersects any other dstems */ + /* This is combinatorial hell. the only relief is that there are usually */ + /* not very many dstems */ + DStem *ds; + struct dstemlist *i1, *i2; + int i; + real maxy1, miny1, maxy2, miny2; + + while ( d!=NULL ) { + maxy1 = d->leftedgetop.y>d->rightedgetop.y?d->leftedgetop.y:d->rightedgetop.y; + miny1 = d->leftedgebottom.yrightedgebottom.y?d->leftedgebottom.y:d->rightedgebottom.y; + for ( ds=d->next; ds!=NULL; ds=ds->next ) { + maxy2 = ds->leftedgetop.y>ds->rightedgetop.y?ds->leftedgetop.y:ds->rightedgetop.y; + miny2 = ds->leftedgebottom.yrightedgebottom.y?ds->leftedgebottom.y:ds->rightedgebottom.y; + if ( maxy1used[i] && ds->used[i] ) { + i1 = BuildDStemIntersection(d,ds,i1,&i2, + &bp[i],(d->used[i]==1?0:1)+(ds->used[i]==1?0:2),i); + } + } + } + d = d->next; + } +} + +/* There is always the possibility that the top might intersect two different*/ +/* dstems (an example would be a misaligned X) */ +static struct dstemlist *DStemTopAtIntersection(DStem *ds) { + struct dstemlist *dl, *found=NULL; + + for ( dl=ds->intersects; dl!=NULL; dl=dl->next ) { + /* check left and right top points */ + if ( ds->pnum[0] == dl->pnum[in_ll] || ds->pnum[0]==dl->pnum[in_lr] || ds->pnum[0]==dl->pnum[in_rl] || + ds->pnum[2] == dl->pnum[in_rr] || ds->pnum[2]==dl->pnum[in_lr] || ds->pnum[2]==dl->pnum[in_rl] ) { + if ( found!=NULL ) +return( NULL ); + else + found = dl; + } + } +return( found ); +} + +static struct dstemlist *DStemBottomAtIntersection(DStem *ds) { + struct dstemlist *dl, *found=NULL; + + for ( dl=ds->intersects; dl!=NULL; dl=dl->next ) { + /* check left and right bottom points */ + if ( ds->pnum[1] == dl->pnum[in_ll] || ds->pnum[1]==dl->pnum[in_lr] || ds->pnum[1]==dl->pnum[in_rl] || + ds->pnum[3] == dl->pnum[in_rr] || ds->pnum[3]==dl->pnum[in_lr] || ds->pnum[3]==dl->pnum[in_rl] ) { + if ( found!=NULL ) +return( NULL ); + else + found = dl; + } + } +return( found ); +} + +static int IsVStemIntersection(struct dstemlist *dl) { + DStem *ds = dl->ds; + + /* We are passed an intersection at the end point of one stem. We want to */ + /* know if the intersection is also at an end-point of the other stem */ + /* if it is at the end-point then it is a "V" intersection, otherwise */ + /* it might be a "k". */ + if ( ds->pnum[0] == dl->pnum[in_ll] || ds->pnum[0]==dl->pnum[in_lr] || ds->pnum[0]==dl->pnum[in_rl] || + ds->pnum[1] == dl->pnum[in_ll] || ds->pnum[1]==dl->pnum[in_lr] || ds->pnum[1]==dl->pnum[in_rl] || + ds->pnum[2] == dl->pnum[in_rr] || ds->pnum[2]==dl->pnum[in_lr] || ds->pnum[2]==dl->pnum[in_rl] || + ds->pnum[3] == dl->pnum[in_rr] || ds->pnum[3]==dl->pnum[in_lr] || ds->pnum[3]==dl->pnum[in_rl] ) +return( true ); + +return( false ); +} + +static int DStemWidth(DStem *ds) { + /* find the orthogonal distance from the left stem to the right. Make it positive */ + /* (just a dot product with the unit vector orthog to the left edge) */ + double tempx, tempy, len, stemwidth; + + tempx = ds->leftedgetop.x-ds->leftedgebottom.x; + tempy = ds->leftedgetop.y-ds->leftedgebottom.y; + len = sqrt(tempx*tempx+tempy*tempy); + stemwidth = ((ds->rightedgetop.x-ds->leftedgetop.x)*tempy - + (ds->rightedgetop.y-ds->leftedgetop.y)*tempx)/len; + if ( stemwidth<0 ) stemwidth = -stemwidth; +return( rint(stemwidth)); +} + +static int ExamineFreedom(int index,BasePoint *bp,int ptcnt,int def) { + if ( index>0 && bp[index-1].x==bp[index].x ) + def = 1; + else if ( index>0 && bp[index-1].y==bp[index].y ) + def = 0; + else if ( index==0 && bp[ptcnt-1].x==bp[index].x ) + def = 1; + else if ( index==0 && bp[ptcnt-1].y==bp[index].y ) + def = 0; + else if ( indexds */ + int e1, e2, m1, m2; + real d1, d2; + BasePoint *bp = top ? &ds->leftedgetop : &ds->leftedgebottom; + int zerocvt = TTF_getcvtval(gi->sf,0); + int data[7]; + int isword, i; + + d1 = (dl->ds->leftedgetop.y-dl->ds->leftedgebottom.y)*(bp->x-dl->ds->leftedgebottom.x) - + (dl->ds->leftedgetop.x-dl->ds->leftedgebottom.x)*(bp->y-dl->ds->leftedgebottom.y); + d2 = (dl->ds->rightedgetop.y-dl->ds->rightedgebottom.y)*(bp->x-dl->ds->rightedgebottom.x) - + (dl->ds->rightedgetop.x-dl->ds->rightedgebottom.x)*(bp->y-dl->ds->rightedgebottom.y); + if ( d1<0 ) d1 = -d1; + if ( d2<0 ) d2 = -d2; + + if ( d1ds->pnum[0]; + e2 = dl->ds->pnum[1]; + } else { + e1 = dl->ds->pnum[2]; + e2 = dl->ds->pnum[3]; + } + m1 = ds->pnum[1-top]; + m2 = ds->pnum[3-top]; + + data[0] = e2; + data[1] = e1; + data[2] = e1; + data[3] = zerocvt; + data[4] = m1; + data[5] = zerocvt; + data[6] = m2; + isword = false; + for ( i=0; i<7 ; ++i ) + if ( data[i]<0 || data[i]>255 ) { + isword = true; + break; + } + pt = pushheader(pt,isword,7); + for ( i=6; i>=0; --i ) + pt = addpoint(pt,isword,data[i]); + + *pt++ = 0x07; /* SPVTL[orthog] */ + *pt++ = 0x0e; /* SFVTP */ + *pt++ = 0x10; /* SRP0 */ + *pt++ = 0xe0; /* MIRP[00000] */ + *pt++ = 0xe0; /* MIRP[00000] */ + /* If we set rnd then cvt cutin can screw us up */ + /* If we set min then... well we won't get a 0 distance */ + + dl->done = true; + + touched[m1] |= 7; + touched[m2] |= 7; +return( pt ); +} + +/* If the dot product of the freedom and projection vectors is negative */ +/* then I am unable to understand truetype's behavior. So insure it is */ +/* positive by flipping the stem used to compute it */ +static uint8 *fixProjectionDir(uint8 *pt,int **ppt,BasePoint *bp,int top, + int bottom, real freedomx, real freedomy, int *olddir) { + int dir; + + dir = ((bp[top].y-bp[bottom].y)*freedomx - (bp[top].x-bp[bottom].x)*freedomy>0); + if ( dir==*olddir ) +return(pt); + *olddir = dir; + if ( dir ) { + int temp = bottom; + bottom = top; + top = temp; + } + *(*ppt)++ = bottom; + *(*ppt)++ = top; + *pt++ = 7; /* SPVTL[orthog] */ +return( pt ); +} + +static uint8 *fixProjectionPtDir(uint8 *pt,int **ppt,BasePoint *bp,int top, + int bottom, int free1, int free2, int parallel, int *olddir) { + if ( parallel ) { +return( fixProjectionDir(pt,ppt,bp,top,bottom, + bp[free1].x-bp[free2].x,bp[free1].y-bp[free2].y,olddir)); + } else { +return( fixProjectionDir(pt,ppt,bp,top,bottom, + bp[free1].y-bp[free2].y,bp[free2].x-bp[free1].x,olddir)); + } +} + +/* This is a simple stem (like "/" or "N" or "X") where none of the end points*/ +/* are at intersections with other diagonal stems (there may be intersections*/ +/* in the middle of the stem, but we're only interested in the edges so that */ +/* is ok */ +/* I've extended it to handle the case of the lower stem in "k" where the stem*/ +/* does end at an interesection, but that intersection is NOT the endpoint */ +/* of the other stem */ +/* This routine has far too many cases. */ +/* If either the top or bottom (or both) ends in another diagonal stem (I */ +/* refer to this as a "kstem" because that's what the lower stem of k does) */ +/* then we fix the two points at top or bottom so that they are on the */ +/* other diagonal stem. */ +/* Then we fix one edge (we choose the edge which is already most touched) */ +/* we fix each point on that edge in both axes (assuming it hasn't already */ +/* been fixed in that axis) */ +/* The other edge is harder. */ +/* We pick one of the two points on that edge, we prefer a point which is on*/ +/* another edge (diagonal, horizontal, vertical) */ +/* If we find an edge we will move the current point parallel to that edge */ +/* until it is stemwidth from the other side of the diagonal we are fixing */ +/* If we don't find an edge then move it perpendicular to our own diagonal */ +/* Then do the same for the other point, except that if we don't have an */ +/* edge then move the other point so that it is zero distance from the point*/ +/* we fixed above */ +static uint8 *DStemFix(DStem *ds,struct glyphinstrs *gi,uint8 *pt,uint8 *touched, + BasePoint *bp, int ptcnt) { + int topvert, bottomvert; + int topclosed, bottomclosed; + int stemwidth = DStemWidth(ds); + int stemcvt = TTF_getcvtval(gi->sf,stemwidth); + int dx, dy, tdiff; + int movement_axis[4]; + int freedom; + int t1,t2, b1,b2, topfixed, rp0= -1, isword; + int pushes[40], *ppt = pushes; + uint8 tempinstrs[40], *ipt = tempinstrs; + int i; + int kstemtop, kstembottom; + int move, based; + int examined; + int projection_dir; + + if ( (dx = ds->rightedgetop.x - ds->leftedgetop.x )<0 ) dx = -dx; + if ( (dy = ds->rightedgetop.y - ds->leftedgetop.y )<0 ) dy = -dy; + topvert = dy>dx; + tdiff = dy+dx; + if ( (dx = ds->rightedgebottom.x - ds->leftedgebottom.x )<0 ) dx = -dx; + if ( (dy = ds->rightedgebottom.y - ds->leftedgebottom.y )<0 ) dy = -dy; + bottomvert = dy>dx; + topfixed = ( tdiff < dy+dx ); + + /* A stem which is closed (like that of / or x) where the two bottom(top) */ + /* end points are connected is much easier to deal with than an open one */ + /* like N where there is no connection */ + topclosed = (ds->pnum[0]==ds->pnum[2]+1) || (ds->pnum[0]==ds->pnum[2]-1); + bottomclosed = (ds->pnum[1]==ds->pnum[3]+1) || (ds->pnum[1]==ds->pnum[3]-1); + + movement_axis[0] = movement_axis[2] = topvert; + movement_axis[1] = movement_axis[3] = bottomvert; + if ( !topclosed ) { + movement_axis[0] = ExamineFreedom(ds->pnum[0],bp,ptcnt,topvert); + movement_axis[2] = ExamineFreedom(ds->pnum[2],bp,ptcnt,topvert); + } + if ( !bottomclosed ) { + movement_axis[1] = ExamineFreedom(ds->pnum[1],bp,ptcnt,bottomvert); + movement_axis[3] = ExamineFreedom(ds->pnum[3],bp,ptcnt,bottomvert); + } + + /* which of the two edges is most heavily positioned? */ + if ( (touched[ds->pnum[0]]&(1<pnum[1]]&(1<= + (touched[ds->pnum[2]]&(1<pnum[3]]&(1<top!=NULL && !IsVStemIntersection(ds->top)); + if ( kstemtop ) { + pt = KStemMoveToEdge(gi,pt,ds->top,ds,1,touched); + freedom = 2; + } + kstembottom = (ds->bottom!=NULL && !IsVStemIntersection(ds->bottom)); + if ( kstembottom ) { + pt = KStemMoveToEdge(gi,pt,ds->bottom,ds,0,touched); + freedom = 3; + } + for ( i=0; i<2; ++i ) { + if ( (touched[ds->pnum[t1]]&(1<pnum[t1]; + *ipt++ = 0x2e; /* MDAP [nornd] */ + } else if ( (touched[ds->pnum[t2]]&(1<pnum[t2]; + *ipt++ = 0x10; /* SRP0 */ + *ppt++ = ds->pnum[t1]; + *ipt++ = 0xcd; /* MDRP [rp0, min, rnd, black] */ + } else { + *ppt++ = ds->pnum[t1]; + *ipt++ = 0x2f; /* MDAP[1round] */ + } + rp0 = ds->pnum[t1]; + touched[ds->pnum[t1]] |= (1<pnum[b1]]&(1<pnum[b1]; + *ipt++ = 0x2e; /* MDAP [nornd] */ + } else if ( (touched[ds->pnum[b2]]&(1<pnum[b2]; + *ipt++ = 0x10; /* SRP0 */ + *ppt++ = ds->pnum[b1]; + *ipt++ = 0xdd; /* MDRP [rp0, min, rnd, black] */ + } else { + *ppt++ = ds->pnum[b1]; + *ipt++ = 0x2f; /* MDAP[1round] */ + } + rp0 = ds->pnum[b1]; + touched[ds->pnum[b1]] |= (1<rightedgetop.x == ds->leftedgetop.x || + ds->rightedgetop.y == ds->leftedgetop.y || + (topfixed && !(kstembottom || ds->rightedgebottom.x == ds->leftedgebottom.x || + ds->rightedgetop.y == ds->leftedgetop.y )) ) { + examined = ExamineFreedom(ds->pnum[t2],bp,ptcnt,-1); + if ( examined==-1 || topclosed ) { + if ( ds->rightedgetop.x == ds->leftedgetop.x ) + examined = 1; + else if ( ds->rightedgetop.y == ds->leftedgetop.y ) + examined = 0; + } + if ( kstemtop ) { + /* set the freedom vector along the edge of the other stem */ + *ppt++ = ds->top->ds->pnum[0]; + *ppt++ = ds->top->ds->pnum[1]; + *ipt++ = 8; /* SFVTL[parallel] */ + freedom = 3; + ipt = fixProjectionPtDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + ds->top->ds->pnum[0],ds->top->ds->pnum[1],1,&projection_dir); + } else if ( examined!=-1 ) { + if ( freedom!=examined ) { *ipt++ = 0x05-examined; freedom = examined; } + ipt = fixProjectionDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + !freedom,freedom,&projection_dir); + } else { + ipt = fixProjectionPtDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + ds->pnum[t1],ds->pnum[b1],0,&projection_dir); + *ipt++ = 0x0e; /* SFVTPV */ + freedom = 4; + } + if ( freedom<2 ) movement_axis[t2] = freedom; + move = ds->pnum[t2]; + based = ds->pnum[t1]; + } else { + examined = ExamineFreedom(ds->pnum[b2],bp,ptcnt,-1); + if ( examined==-1 || bottomclosed ) { + if ( ds->rightedgebottom.x == ds->leftedgebottom.x ) + examined = 1; + else if ( ds->rightedgebottom.y == ds->leftedgebottom.y ) + examined = 0; + } + if ( kstembottom ) { + /* set the freedom vector along the edge of the other stem */ + *ppt++ = ds->bottom->ds->pnum[0]; + *ppt++ = ds->bottom->ds->pnum[1]; + *ipt++ = 8; /* SFVTL[parallel] */ + freedom = 3; + ipt = fixProjectionPtDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + ds->bottom->ds->pnum[0],ds->bottom->ds->pnum[1],1, + &projection_dir); + } else if ( examined!=-1 ) { + if ( freedom!=examined ) { *ipt++ = 0x05-examined; freedom = examined; } + ipt = fixProjectionDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + !freedom,freedom,&projection_dir); + } else { + ipt = fixProjectionPtDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + ds->pnum[t1],ds->pnum[b1],0,&projection_dir); + *ipt++ = 0x0e; /* SFVTPV */ + freedom = 4; + } + if ( freedom<2 ) movement_axis[b2] = freedom; + move = ds->pnum[b2]; + based = ds->pnum[b1]; + } + if ( rp0!=based ) { + *ppt++ = based; + *ipt++ = 16; /* SRP0 */ + } + *ppt++ = stemcvt; + *ppt++ = move; + *ipt++ = 0xed; /* MIRP[01101] */ + if ( freedom==1 || freedom==0 ) + touched[move] |= (1<pnum[t2] ) { + move = ds->pnum[b2]; + based = ds->pnum[b1]; + examined = ExamineFreedom(ds->pnum[b2],bp,ptcnt,-1); + if ( examined==-1 || bottomclosed ) { + if ( ds->rightedgebottom.x == ds->leftedgebottom.x ) + examined = 1; + else if ( ds->rightedgebottom.y == ds->leftedgebottom.y ) + examined = 0; + } + if ( kstembottom ) { + /* set the freedom vector along the edge of the other stem */ + *ppt++ = ds->bottom->ds->pnum[0]; + *ppt++ = ds->bottom->ds->pnum[1]; + *ipt++ = 8; /* SFVTL[parallel] */ + freedom = 3; + ipt = fixProjectionPtDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + ds->bottom->ds->pnum[0],ds->bottom->ds->pnum[1],1,&projection_dir); + } else if ( examined!=-1 ) { + if ( freedom!=examined ) { *ipt++ = 0x05-examined; freedom = examined; } + ipt = fixProjectionDir(ipt,&ppt,bp,ds->pnum[t1],ds->pnum[b1], + !freedom,freedom,&projection_dir); + } else { + *ipt++ = 0x0e; /* SFVTPV */ + freedom = 4; + based = ds->pnum[t2]; + stemcvt = TTF_getcvtval(gi->sf,0); + } + if ( freedom<2 ) movement_axis[b2] = freedom; + } else { + /* If the top were a kstem, or if either of the coord were equal */ + /* then we would not have taken this branch. The only choice if */ + /* we get here is the final case above where the best we can do */ + /* is make the point be on the stem */ + *ipt++ = 0x0e; /* SFVTPV */ + freedom = 4; + based = ds->pnum[b2]; + stemcvt = TTF_getcvtval(gi->sf,0); + move = ds->pnum[t2]; + } + *ppt++ = based; + *ipt++ = 16; /* SRP0 */ + *ppt++ = stemcvt; + *ppt++ = move; + *ipt++ = stemcvt!=TTF_getcvtval(gi->sf,0)?0xed:0xe1; /* MIRP[0??01] */ + if ( freedom==1 || freedom==0 ) + touched[move] |= (1<pnum[t2]]&(1<<(1-movement_axis[t2])) ) { + if ( freedom!=1-movement_axis[t2] ) { *ipt++ = movement_axis[t2]; freedom = 1-movement_axis[t2]; } + *ppt++ = ds->pnum[t2]; + *ipt++ = 0x2e; /* MDAP[noround] */ + touched[ds->pnum[t2]] |= (1<<(1-movement_axis[t2])); + } + if ( touched[ds->pnum[b2]]&(1<<(1-movement_axis[b2])) ) { + if ( freedom!=1-movement_axis[b2] ) { *ipt++ = movement_axis[b2]; freedom = 1-movement_axis[b2]; } + *ppt++ = ds->pnum[b2]; + *ipt++ = 0x2e; /* MDAP[noround] */ + touched[ds->pnum[b2]] |= (1<<(1-movement_axis[b2])); + } + + if ( freedom!=0 ) + *ipt++ = 1; /* always leave both vectors in x */ + + /* Ok, now figure out the instructions for the push stack */ + isword = false; + for ( i=0; pushes+i < ppt ; ++i ) + if ( pushes[i]<0 || pushes[i]>255 ) { + isword = true; + break; + } + pt = pushheader(pt,isword,ppt-pushes); + while ( ppt>pushes ) + pt = addpoint(pt,isword,*--ppt); + for ( i=0; tempinstrs+idone = true; +return( pt ); +} + +static uint8 *DStemFixConnected(DStem *ds,int top_is_inter,struct glyphinstrs *gi, + uint8 *pt, uint8 *touched, BasePoint *bp, int ptcnt) { + struct dstemlist *dl = top_is_inter ? ds->top : ds->bottom; + DStem *nextds; + int next_top_is_inter; + int inner, outer1, outer2; + int t1, t2, b1, b2; + real sw1, sw2; + int pushes[8]; + int isword, i; + real dx, dy; + +return( pt ); + /* This method doesn't work, I can't project backwards, or at least */ + /* freetype won't let me. That may be a bug on their part, but even if */ + /* it is I need to work around it */ +#if 0 + SetupFPGM(gi); +#endif + + pt = DStemFix(ds,gi,pt,touched,bp,ptcnt); + dl = top_is_inter ? ds->top : ds->bottom; + sw1 = DStemWidth(ds); + do { + nextds = dl->ds; + sw2 = DStemWidth(nextds); + if ( top_is_inter ) { + if ( ds->pnum[0]==nextds->pnum[2] || ds->pnum[2]==nextds->pnum[0] ) { + next_top_is_inter = true; + if ( ds->pnum[0]!=nextds->pnum[2] ) { + inner = ds->pnum[2]; + outer1 = ds->pnum[0]; + outer2 = nextds->pnum[2]; + t1 = outer1; t2 = outer2; b1 = ds->pnum[1]; b2 = nextds->pnum[3]; + } else if ( ds->pnum[2]!=nextds->pnum[0] ) { + inner = ds->pnum[0]; + outer1 = ds->pnum[2]; + outer2 = nextds->pnum[0]; + t1 = outer1; t2 = outer2; b1 = ds->pnum[3]; b2 = nextds->pnum[1]; + } else if ( ds->leftedgetop.y>ds->rightedgetop.y ) { + inner = ds->pnum[2]; + outer1 = outer2 = ds->pnum[0]; + t1 = t2 = outer1; b1 = ds->pnum[1]; b2 = nextds->pnum[3]; + } else { + inner = ds->pnum[0]; + outer1 = outer2 = ds->pnum[2]; + t1 = outer1; t2 = outer2; b1 = ds->pnum[1]; b2 = nextds->pnum[3]; + } + } else if ( ds->pnum[0]==nextds->pnum[1] || ds->pnum[2] == nextds->pnum[3] ) { + next_top_is_inter = false; + if ( ds->pnum[0]!=nextds->pnum[3] ) { + inner = ds->pnum[2]; + outer1 = ds->pnum[0]; + outer2 = nextds->pnum[3]; + t1 = outer1; b2 = outer2; b1 = ds->pnum[1]; t2 = nextds->pnum[2]; + } else if ( ds->pnum[2]!=nextds->pnum[1] ) { + inner = ds->pnum[0]; + outer1 = ds->pnum[2]; + outer2 = nextds->pnum[1]; + t1 = outer1; b2 = outer2; b1 = ds->pnum[3]; t2 = nextds->pnum[0]; + } else { + /* This case doesn't matter much, so don't work hard to get it right */ + inner = ds->pnum[0]; + outer1 = outer2 = ds->pnum[2]; + t1 = outer1; b2 = outer2; b1 = ds->pnum[3]; t2 = nextds->pnum[0]; + } + } else { + GDrawIError( "Failed to find intersection in DStemFixConnected" ); +return( pt ); + } + if ( inner == ds->pnum[0] ) sw1 = -sw1; + else sw2 = -sw2; + } else { + if ( ds->pnum[1]==nextds->pnum[3] || ds->pnum[3]==nextds->pnum[1] ) { + next_top_is_inter = false; + if ( ds->pnum[1]!=nextds->pnum[3] ) { + inner = ds->pnum[3]; + outer1 = ds->pnum[1]; + outer2 = nextds->pnum[3]; + b1 = outer1; b2 = outer2; t1 = ds->pnum[0]; t2 = nextds->pnum[2]; + } else if ( ds->pnum[3]!=nextds->pnum[1] ) { + inner = ds->pnum[1]; + outer1 = ds->pnum[3]; + outer2 = nextds->pnum[1]; + b1 = outer1; b2 = outer2; t1 = ds->pnum[2]; t2 = nextds->pnum[0]; + } else if ( ds->leftedgetop.y>ds->rightedgetop.y ) { + inner = ds->pnum[3]; + outer1 = outer2 = ds->pnum[1]; + b1 = b2 = outer1; t1 = ds->pnum[0]; t2 = nextds->pnum[2]; + } else { + inner = ds->pnum[1]; + outer1 = outer2 = ds->pnum[3]; + b1 = b2 = outer1; t1 = ds->pnum[2]; t2 = nextds->pnum[0]; + } + } else if ( ds->pnum[1]==nextds->pnum[0] || ds->pnum[3] == nextds->pnum[2] ) { + next_top_is_inter = false; + if ( ds->pnum[1]!=nextds->pnum[2] ) { + inner = ds->pnum[3]; + outer1 = ds->pnum[1]; + outer2 = nextds->pnum[2]; + } else if ( ds->pnum[3]!=nextds->pnum[0] ) { + inner = ds->pnum[1]; + outer1 = ds->pnum[3]; + outer2 = nextds->pnum[0]; + } else { + /* This case doesn't matter much, so don't work hard to get it right */ + inner = ds->pnum[1]; + outer1 = outer2 = ds->pnum[3]; + } + } else { + GDrawIError( "Failed to find intersection in DStemFixConnected" ); +return( pt ); + } + if ( inner == ds->pnum[1] ) sw1 = -sw1; + else sw2 = -sw2; + } + if ( outer1!=outer2 ) { + /* if the outer edges don't come to a point, then make sure */ + /* there's a minimum distance between them */ + if ( (dx = bp[outer2].x - bp[outer1].x )<0 ) dx = -dx; + if ( (dy = bp[outer2].y - bp[outer1].y )<0 ) dy = -dy; + /* outer1 should have been fixed already */ + pt = pushpoint(pt,outer1); + *pt++ = 0x10; /* SRP0 */ + if ( dx>dy ) { + pt = pushpointstem(pt,outer2,TTF_getcvtval(gi->sf,bp[outer1].x-bp[outer2].x)); + *pt++ = 0xe0+0x0d; /* MIRP, minimum, rounded, black */ + touched[outer2] |= 1|4; + } else { + *pt++ = 0x00; /* SVTCA[y] */ + pt = pushpointstem(pt,outer2,TTF_getcvtval(gi->sf,bp[outer1].y-bp[outer2].y)); + *pt++ = 0xe0+0x0d; /* MIRP, minimum, rounded, black */ + *pt++ = 0x01; /* SVTCA[x] */ + touched[outer2] |= 2|4; + } + } + pt = DStemFix(nextds,gi,pt,touched,bp,ptcnt); + + /* I push the bottom then the top because that way the projection vector */ + /* dot the freedom vector is positive. It it is negative the bytecode */ + /* interpretters produce strange results */ + /* Do Intersect */ + pushes[0] = inner; + pushes[1] = TTF__getcvtval(gi->sf,-sw1); + pushes[3] = b1; + pushes[2] = t1; + pushes[4] = TTF__getcvtval(gi->sf,-sw2); + pushes[6] = b2; + pushes[5] = t2; + pushes[7] = 0; + isword = false; + for ( i=0; i<8 ; ++i ) + if ( pushes[i]<0 || pushes[i]>255 ) { + isword = true; + break; + } + pt = pushheader(pt,isword,8); + for ( i=0; i<8 ; ++i ) + pt = addpoint(pt,isword,pushes[i]); + *pt++ = 0x2b; /* CALL (Function 0) */ + + dl->done = true; + + ds = nextds; + sw1 = sw2; + if ( sw1<0 ) sw1 = -sw1; + top_is_inter = !next_top_is_inter; + dl = top_is_inter ? ds->top : ds->bottom; + } while ( dl!=NULL && IsVStemIntersection(dl)); + +return( pt ); +} + +static uint8 *DStemCheckKStems(DStem *ds,struct glyphinstrs *gi, + uint8 *pt, uint8 *touched, BasePoint *bp, int ptcnt) { + /* Find all dstems like the lower stem of "k" where the other stem */ + /* has already been set */ + DStem *ds2; + int any; + + do { + any = false; + for ( ds2 = ds; ds2!=NULL; ds2 = ds2->next ) if ( !ds2->done ) { + if ( (ds2->top==NULL || (ds2->top->done && !IsVStemIntersection(ds2->top))) && + (ds2->bottom==NULL || (ds2->bottom->done && !IsVStemIntersection(ds2->bottom))) ) { + pt = DStemFix(ds2,gi,pt,touched,bp,ptcnt); + any = true; + } + } + } while ( any ); +return( pt ); +} + +/* EndPoints have several different forms: + / easy, no complications + x easy, no (end point) complications + N mild difficulties in that some points are free to move in x and others + in y (the points in the armpits of the stems move in y, the points + outside move in x) + V have to go through machinations to figure out the bottom end point + W machinations for all the middle end points + M + k Special case for the vertical end point + Special case for diagonal end point + 25CA (diamond character) similar to V except all points are intersections +To establish a simple end point we pick one side of the stem and MDAP it (both top and bottom) + then we set the projection vector orthogonal to the stem + Usually we set the freedom vector to x (but for vertical k set to y) + And move the other end point the desired stem width from the picked one + +So... + Find all endpoints with no intersections (simple end points) and establish them + Find all intersection (V like) end points + Try to find one where at least one of the sides is fixed above + (if there are none then just pick one and fix it arbetrarily) + Does the V come to a point? (or is its base flattened) + MDAP the pointy end + else + MDAP one of the ends + Make the other end an minimum distance from it + Call our intersection routine to figure where the intersection of the + other sides goes + Find all diagonal (k like) end points + Make sure that the stem which does not end here has its endpoints fixed + (the upper stem of "k") + ISECT that stem with one of the edges of the other stem (lower k) and + fix one point there. + Set the projection vector orthog to the other stem (lower k) and move + the end points of its untouched edge to be the stem width away + from the fixed edge + ISECT that edge with the non-ending stem (upper k) +*/ +static uint8 *DStemEstablishEndPoints(struct glyphinstrs *gi,uint8 *pt,DStem *ds, + uint8 *touched, BasePoint *bp, int ptcnt) { + DStem *ds2; + + for ( ds2 = ds; ds2!=NULL; ds2 = ds2->next ) { + ds2->top = DStemTopAtIntersection(ds2); + ds2->bottom = DStemBottomAtIntersection(ds2); + } + + /* Find all dstems where neither end is an intersection and position them */ + /* handles things like "/", "x", and the upper stem of "k" */ + for ( ds2 = ds; ds2!=NULL; ds2 = ds2->next ) { + if ( ds2->top==NULL && ds2->bottom==NULL ) + pt = DStemFix(ds2,gi,pt,touched,bp,ptcnt); + } + + /* Find all dstems like the lower stem of "k" where the other stem */ + /* has already been set */ + pt = DStemCheckKStems(ds,gi,pt,touched,bp,ptcnt); + + /* Find all dstems where one end is not an intersection and position them */ + /* and position anything connected to them */ + /* handles things like "V", "W" */ + for ( ds2 = ds; ds2!=NULL; ds2 = ds2->next ) if ( !ds2->done ) { + if ( ds2->top!=NULL && IsVStemIntersection(ds2->top) && + (ds2->bottom==NULL || (ds2->bottom->done && !IsVStemIntersection(ds2->bottom)))) + pt = DStemFixConnected(ds2,1,gi,pt,touched,bp,ptcnt); + else if ( ds2->bottom!=NULL && IsVStemIntersection(ds2->bottom) && + (ds2->top==NULL || (ds2->top->done && !IsVStemIntersection(ds2->top)))) + pt = DStemFixConnected(ds2,0,gi,pt,touched,bp,ptcnt); + } + + pt = DStemCheckKStems(ds,gi,pt,touched,bp,ptcnt); + + /* Find all remaining dstems and arbetarily fix something and then */ + /* position anything connected */ + /* handles things like diamond */ + for ( ds2 = ds; ds2!=NULL; ds2 = ds2->next ) if ( !ds2->done ) { + if ( ds2->top && IsVStemIntersection(ds2->top)) + pt = DStemFixConnected(ds2,1,gi,pt,touched,bp,ptcnt); + else if ( ds2->bottom && IsVStemIntersection(ds2->bottom)) + pt = DStemFixConnected(ds2,0,gi,pt,touched,bp,ptcnt); + else + pt = DStemFix(ds2,gi,pt,touched,bp,ptcnt); + } +return( pt ); +} + +static uint8 *DStemISectStem(uint8 *pt,DStem *ds,struct dstemlist *dl, + uint8 *touched) { + int pushes[32], *ppt = pushes; + int cnt, isword, i; + struct dstemlist *dl2; + + + for ( dl2 = dl->ds->intersects; dl2!=NULL && dl2->ds!=ds; dl2=dl2->next ); + if ( dl2->done ) +return( pt ); + if ( dl2!=NULL ) dl2->done = true; + + /* I have to push things backwards */ + for ( i=cnt=0; i<4; ++i ) if ( dl->is[i]!=NULL && dl->pnum[i]!=-1 ) { + if ( i&1 ) { + *ppt++ = ds->pnum[2]; + *ppt++ = ds->pnum[3]; + } else { + *ppt++ = ds->pnum[0]; + *ppt++ = ds->pnum[1]; + } + if ( i&2 ) { + *ppt++ = dl->ds->pnum[2]; + *ppt++ = dl->ds->pnum[3]; + } else { + *ppt++ = dl->ds->pnum[0]; + *ppt++ = dl->ds->pnum[1]; + } + touched[dl->pnum[i]] |= 3|4; + *ppt++ = dl->pnum[i]; + ++cnt; + } + + /* Ok, now figure out the instructions for the push stack */ + isword = false; + for ( i=0; pushes+i < ppt ; ++i ) + if ( pushes[i]<0 || pushes[i]>255 ) { + isword = true; + break; + } + pt = pushheader(pt,isword,ppt-pushes); + while ( ppt>pushes ) + pt = addpoint(pt,isword,*--ppt); + + for ( i=0; iintersects; dl!=NULL; dl=dl->next ) if ( !dl->done ) + pt = DStemISectStem(pt,ds,dl,touched); + ds = ds->next; + } +return( pt ); +} + +static uint8 *SetPFVectorsToSlope(uint8 *pt,int e1, int e2) { + pt = pushpointstem(pt,e1,e2); + *pt++ = 0x07; /* SPVTL[orthog] */ + *pt++ = 0x0e; /* SFVTP */ +return( pt ); +} + +/* There may be other points on the diagonal stems which aren't at intersections */ +/* they still need to be moved so that they lie on the (new position of the) */ +/* stem */ +static uint8 *DStemMakeColinear(struct glyphinstrs *gi,uint8 *pt,DStem *ds, + uint8 *touched, BasePoint *bp, int ptcnt) { + int i, established, positioned, any=0; + int zerocvt = TTF_getcvtval(gi->sf,0); + + while ( ds!=NULL ) { + /* touched[]&4 indicates a diagonal touch, only interested in points */ + /* which have not been diagonally touched */ + established = positioned = 0; + for ( i=0; iused[i]==1 && + i!=ds->pnum[0] && i!=ds->pnum[1]) { + if ( !established ) { + pt = SetPFVectorsToSlope(pt,ds->pnum[0],ds->pnum[1]); + pt = pushpoint(pt,ds->pnum[0]); + *pt++ = 0x10; /* SRP0 */ + established = any = true; + } + pt = pushpointstem(pt,i,zerocvt); + *pt++ = 0xe0; /* MIRP[00000] */ + touched[i] |= 4; + } + for ( i=0; iused[i]==2 && + i!=ds->pnum[2] && i!=ds->pnum[3]) { + if ( !established ) { + pt = SetPFVectorsToSlope(pt,ds->pnum[0],ds->pnum[1]); + established = any = true; + } + if ( !positioned ) { + pt = pushpoint(pt,ds->pnum[2]); + *pt++ = 0x10; /* SRP0 */ + positioned = true; + } + pt = pushpointstem(pt,i,zerocvt); + *pt++ = 0xe0; /* MIRP[00000] */ + touched[i] |= 4; + } + ds = ds->next; + } + if ( any ) + *pt++ = 0x01; /* SVTCA[x] */ +return( pt ); +} + +static uint8 *DStemInfoGeninst(struct glyphinstrs *gi,uint8 *pt,DStemInfo *d, + uint8 *touched, BasePoint *bp, int ptcnt) { + DStem *ds; + +#if TEST_DIAGHINTS + if ( ds==NULL ) /* Comment out this line to turn off diagonal hinting !!!*/ +#endif +return( pt ); + ds = DStemMerge(d,bp,ptcnt,touched); + + *pt++ = 0x30; /* Interpolate Untouched Points y */ + *pt++ = 0x31; /* Interpolate Untouched Points x */ + + DStemIntersect(ds,bp,ptcnt); + pt = DStemEstablishEndPoints(gi,pt,ds,touched,bp,ptcnt); + pt = DStemISectMidPoints(pt,ds,touched); + pt = DStemMakeColinear(gi,pt,ds,touched,bp,ptcnt); + DStemFree(ds); +return( pt ); +} + +static int MapSP2Index(SplineSet *ttfss,SplinePoint *csp, int ptcnt) { + SplineSet *ss; + SplinePoint *sp; + + if ( csp==NULL ) +return( ptcnt+1 ); /* ptcnt+1 is the phantom point for the width */ + for ( ss=ttfss; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first;; ) { + if ( sp->me.x==csp->me.x && sp->me.y==csp->me.y ) +return( sp->ttfindex ); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +return( -1 ); +} + +/* Order of the md hints is important hence the double loop. */ +/* We only do a hint if one edge has been fixed (or if we have no choice) */ +static uint8 *gen_md_instrs(struct glyphinstrs *gi, uint8 *instrs,MinimumDistance *_md, + SplineSet *ttfss, BasePoint *bp, int ptcnt, int xdir, uint8 *touched) { + int mask = xdir ? 1 : 2; + int pt1, pt2; + int any, graspatstraws=false, undone; + MinimumDistance *md; + + do { + any = false; undone = false; + for ( md=_md; md!=NULL; md=md->next ) { + if ( md->x==xdir && !md->done ) { + pt1 = MapSP2Index(ttfss,md->sp1,ptcnt); + pt2 = MapSP2Index(ttfss,md->sp2,ptcnt); + if ( pt1==ptcnt+1 ) { + pt1 = pt2; + pt2 = ptcnt+1; + } + if ( pt1==0xffff || pt2==0xffff ) + fprintf(stderr, "Internal Error: Failed to find point in minimum distance check\n" ); + else if ( pt1!=ptcnt+1 && (touched[pt1]&mask) && + pt2!=ptcnt+1 && (touched[pt2]&mask) ) + md->done = true; /* somebody else did it, might not be right for us, but... */ + else if ( !graspatstraws && + !(touched[pt1]&mask) && + (pt2==ptcnt+1 || !(touched[pt2]&mask)) ) + /* If neither edge has been touched, then don't process */ + /* it now. hope that by filling in some other mds we will*/ + /* establish one edge or the other, and then come back to*/ + /* it */ + undone = true; + else if ( pt2==ptcnt+1 || !(touched[pt2]&mask)) { + md->done = true; + instrs = pushpointstem(instrs,pt2,pt1); /* Misnomer, I'm pushing two points */ + if ( !(touched[pt1]&mask)) + *instrs++ = 0x2f; /* MDAP[rnd] */ + else + *instrs++ = 0x10; /* SRP0 */ + *instrs++ = 0xcc; /* MDRP[01100] min, rnd, grey */ + touched[pt1] |= mask; + if ( pt2!=ptcnt+1 ) + touched[pt2]|= mask; + any = true; + } else { + md->done = true; + instrs = pushpointstem(instrs,pt1,pt2); /* Misnomer, I'm pushing two points */ + *instrs++ = 0x10; /* SRP0 */ + *instrs++ = 0xcc; /* MDRP[01100] min, rnd, grey */ + touched[pt1] |= mask; + any = true; + } + } + } + graspatstraws = undone && !any; + } while ( undone ); +return(instrs); +} + +static uint8 *gen_rnd_instrs(struct glyphinstrs *gi, uint8 *instrs,SplineSet *ttfss, + BasePoint *bp, int ptcnt, int xdir, uint8 *touched) { + int mask = xdir ? 1 : 2; + SplineSet *ss; + SplinePoint *sp; + + for ( ss=ttfss; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ((( sp->roundx && xdir ) || ( sp->roundy && !xdir )) && + !(touched[sp->ttfindex]&mask)) { + instrs = pushpoint(instrs,sp->ttfindex); + *instrs++ = 0x2f; /* MDAP[rnd] */ + touched[sp->ttfindex] |= mask; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp == ss->first ) + break; + } + } +return( instrs ); +} + +static uint8 *gen_extremum_instrs(struct glyphinstrs *gi, uint8 *instrs, + BasePoint *bp, int ptcnt, uint8 *touched) { + int i; + real min, max; + + max = (int) 0x80000000; min = 0x7fffffff; + for ( i=0; ibp[i].y ) min = bp[i].y; + else if ( maxlayers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sp->dontinterpolate = false; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp == ss->first ) + break; + } + } + + for ( md=sc->md; md!=NULL; md=md->next ) { + if ( md->sp1!=NULL ) md->sp1->dontinterpolate = true; + if ( md->sp2!=NULL ) md->sp2->dontinterpolate = true; + } +} + +static uint8 *dogeninstructions(SplineChar *sc, struct glyphinstrs *gi, + int *contourends, BasePoint *bp, int ptcnt, SplineSet *ttfss, + uint8 *touched) { + StemInfo *hint; + uint8 *instrs, *pt; + int max; + DStemInfo *dstem; + + /* Maximum instruction length is 6 bytes for each point in each dimension */ + /* 2 extra bytes to finish up. And one byte to switch from x to y axis */ + /* Diagonal take more space because we need to set the orientation on */ + /* each stem, and worry about intersections, etc. */ + /* That should be an over-estimate */ + max=2; + if ( sc->vstem!=NULL ) max += 6*ptcnt; + if ( sc->hstem!=NULL ) max += 6*ptcnt+1; + for ( dstem=sc->dstem; dstem!=NULL; max+=7+4*6+100, dstem=dstem->next ); + if ( sc->md!=NULL ) max += 12*ptcnt; + max += 6*ptcnt; /* in case there are any rounds */ + max += 6*ptcnt; /* paranoia */ + instrs = pt = galloc(max); + + for ( hint=sc->vstem; hint!=NULL; hint=hint->next ) + hint->enddone = hint->startdone = false; + for ( hint=sc->hstem; hint!=NULL; hint=hint->next ) + hint->enddone = hint->startdone = false; + + /* first instruct horizontal stems (=> movement in y) */ + /* do this first so that the diagonal hinter will have everything moved */ + /* properly when it sets the projection vector */ + if ( sc->hstem!=NULL ) { + *pt++ = 0x00; /* Set Vectors to y */ + for ( hint=sc->hstem; hint!=NULL; hint=hint->next ) { + if ( !hint->startdone || !hint->enddone ) + pt = geninstrs(gi,pt,hint,contourends,bp,ptcnt,sc->hstem,false,touched); + } + } + pt = gen_md_instrs(gi,pt,sc->md,ttfss,bp,ptcnt,false,touched); + pt = gen_rnd_instrs(gi,pt,ttfss,bp,ptcnt,false,touched); + pt = gen_extremum_instrs(gi,pt,bp,ptcnt,touched); + + /* next instruct vertical stems (=> movement in x) */ + if ( pt != instrs ) + *pt++ = 0x01; /* Set Vectors to x */ + for ( hint=sc->vstem; hint!=NULL; hint=hint->next ) { + if ( !hint->startdone || !hint->enddone ) + pt = geninstrs(gi,pt,hint,contourends,bp,ptcnt,sc->vstem,true,touched); + } + + /* finally instruct diagonal stems (=> movement in x) */ + pt = DStemInfoGeninst(gi,pt,sc->dstem,touched,bp,ptcnt); + + pt = gen_md_instrs(gi,pt,sc->md,ttfss,bp,ptcnt,true,touched); + pt = gen_rnd_instrs(gi,pt,ttfss,bp,ptcnt,true,touched); + + /* there seems some discention as to which of these does x and which does */ + /* y. So rather than try and be clever, let's always do both */ + *pt++ = 0x30; /* Interpolate Untouched Points y */ + *pt++ = 0x31; /* Interpolate Untouched Points x */ + if ( pt-instrs > max ) { + fprintf(stderr,"We're about to crash.\nWe miscalculated the glyph's instruction set length\n" ); + fprintf(stderr,"When processing TTF instructions (hinting) of %s\n", sc->name ); + } +return(instrs); +} + +void SCAutoInstr(SplineChar *sc, BlueData *bd) { + BlueData _bd; + struct glyphinstrs gi; + int cnt, contourcnt; + BasePoint *bp; + int *contourends; + uint8 *touched; + SplineSet *ss; + + if ( !sc->parent->order2 ) +return; + if ( sc->ttf_instrs ) { + free(sc->ttf_instrs); + sc->ttf_instrs = NULL; + sc->ttf_instrs_len = 0; + } + SCNumberPoints(sc); + if ( autohint_before_generate && sc->changedsincelasthinted && + !sc->manualhints ) + SplineCharAutoHint(sc,true); + + if ( sc->vstem==NULL && sc->hstem==NULL && sc->dstem==NULL && sc->md==NULL ) +return; + if ( sc->layers[ly_fore].splines==NULL ) +return; + + if ( bd==NULL ) { + QuickBlues(sc->parent,&_bd); + bd = &_bd; + } + gi.sf = sc->parent; + gi.bd = bd; + gi.fudge = (sc->parent->ascent+sc->parent->descent)/500; + + cnt = contourcnt = 0; + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next, ++contourcnt ) + cnt = SSPointCnt(ss,cnt,false); + + contourends = galloc((contourcnt+1)*sizeof(int)); + bp = galloc(cnt*sizeof(BasePoint)); + touched = gcalloc(cnt,1); + contourcnt = cnt = 0; + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + touched[cnt] |= tf_startcontour; + cnt = SSAddPoints(ss,cnt,bp,NULL,false); + touched[cnt-1] |= tf_endcontour; + contourends[contourcnt++] = cnt-1; + } + contourends[contourcnt] = 0; + + dogeninstructions(sc, &gi, contourends, bp, cnt, sc->layers[ly_fore].splines, touched); + + free(touched); + free(bp); + free(contourends); + + SCMarkInstrDlgAsChanged(sc); +} diff --git a/fontforge/gotodlg.c b/fontforge/gotodlg.c new file mode 100644 index 00000000..54158814 --- /dev/null +++ b/fontforge/gotodlg.c @@ -0,0 +1,619 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "pfaeditui.h" +#include +#include + +struct unicoderange { + char *name; /* The range's name */ + int32 first, last, defined; + /* The first codepoint, last codepoint in the range */ + /* and a codepoint which actually has a character */ + /* associated with it */ +} unicoderange[] = { + /* { "Unicode", 0, 0x10ffff, ' ' }, */ + { "Unicode Basic Multilingual Plane", 0, 0xffff, ' ' }, + { "Basic Multilingual Plane", 0, 0xffff, ' ' }, + { "Alphabetic", 0, 0x1fff, 'A' }, + { "C0 Control Character", 0, ' '-1, 0 }, + { "NUL, Default Character", 0, 0, 0 }, + { "Basic Latin", ' ', 0x7e, 'A' }, + { "Delete Character", 0x7f, 0x7f, 0x7f }, + { "C1 Control Character", 0x80, 0x9f, 0x80 }, + { "Latin-1 Supplement", 0xa0, 0xff, 0xc0 }, + { "Latin Extended-A", 0x100, 0x17f, 0x100 }, + { "Latin Extended-B", 0x180, 0x24f, 0x180 }, + { "IPA Extensions", 0x250, 0x2af, 0x250 }, + { "Spacing Modifier Letters", 0x2b0, 0x2ff, 0x2b0 }, + { "Combining Diacritical Marks", 0x300, 0x36f, 0x300 }, + { "Greek", 0x370, 0x3ff, 0x391 }, + { "Cyrillic", 0x400, 0x4ff, 0x410 }, + { "Cyrillic Supplement", 0x500, 0x52f, 0x500 }, + { "Armenian", 0x530, 0x58f, 0x531 }, + { "Hebrew", 0x590, 0x5ff, 0x5d0 }, + { "Arabic", 0x600, 0x6ff, 0x627 }, + { "Syriac", 0x700, 0x74f, 0x710 }, + { "N'ko", 0x750, 0x77f, -1 }, /* Don't know defined point */ + { "Thaana", 0x780, 0x7bf, -1 }, + { "Avestan", 0x7c0, 0x7ff, -1 }, + { "Phoenician", 0x800, 0x81f, -1 }, + { "Aramaic", 0x820, 0x83f, -1 }, + { "Pahlavi", 0x840, 0x87f, -1 }, + { "Tifinagh", 0x880, 0x8af, -1 }, + { "Samaritan", 0x8b0, 0x8cf, -1 }, + { "Mandaic", 0x8d0, 0x8ff, -1 }, + { "Devangari", 0x900, 0x97f, 0x905 }, + { "Bengali", 0x980, 0x9ff, 0x985 }, + { "Gurmukhi", 0xa00, 0xa7f, 0xa05 }, + { "Gujarati", 0xa80, 0xaff, 0xa85 }, + { "Oriya", 0xb00, 0xb7f, 0xb05 }, + { "Tamil", 0xb80, 0xbff, 0xb85 }, + { "Telugu", 0xc00, 0xc7f, 0xc05 }, + { "Kannada", 0xc80, 0xcff, 0xc85 }, + { "Malayalam", 0xd00, 0xd7f, 0xd05 }, + { "Sinhala", 0xd80, 0xdff, 0xd85 }, + { "Thai", 0xe00, 0xe7f, 0xe01 }, + { "Lao", 0xe80, 0xeff, 0xe81 }, + { "Tibetan", 0xf00, 0xfff, 0xf00 }, + { "Myanmar", 0x1000, 0x109f, 0x1000 }, + { "Georgian", 0x10a0, 0x10ff, 0x10d0 }, + { "Hangul Jamo, Choseong", 0x1100, 0x115f, 0x1100 }, + { "Hangul Jamo, Jungseong", 0x1160, 0x11a7, 0x1161 }, + { "Hangul Jamo, Jongseong", 0x11a8, 0x11ff, 0x11a8 }, + { "Ethiopic", 0x1200, 0x137f, -1 }, + { "Ethiopic Extended", 0x1380, 0x139f, -1 }, + { "Cherokee", 0x13a0, 0x13ff, 0x13a0 }, + { "Unified Canadian Aboriginal Syllabics", 0x1400, 0x167f, -1 }, + { "Ogham", 0x1680, 0x139f, 0x1680 }, + { "Runic", 0x16a0, 0x13ff, 0x16a0 }, + { "Tagalog", 0x1700, 0x171f, -1 }, + { "Hanunóo", 0x1720, 0x173f, -1 }, + { "Buhid", 0x1740, 0x175f, -1 }, + { "Tagbanwa", 0x1760, 0x177f, -1 }, + { "Khmer", 0x1780, 0x17af, -1 }, + { "Mongolian", 0x17b0, 0x17ff, -1 }, + { "Cham", 0x1800, 0x18ff, -1 }, + { "Limbu", 0x1900, 0x194f, -1 }, + { "Tai Le", 0x1950, 0x197f, -1 }, + { "Viêt Thái", 0x1980, 0x19cf, -1 }, + { "New Tai Lu", 0x1a00, 0x1a5f, -1 }, + { "Lanna", 0x1a80, 0x1adf, -1 }, + { "Batak", 0x1b00, 0x1b3f, -1 }, + { "Buginese", 0x1b40, 0x1b5f, -1 }, + { "Javanese", 0x1b80, 0x1bcf, -1 }, + { "Meithei/Manipuri", 0x1c00, 0x1c5f, -1 }, + { "Lepcha", 0x1c80, 0x1cbf, -1 }, + { "Kayah Li", 0x1cc0, 0x1cff, -1 }, + { "Phonetic Extensions", 0x1d00, 0x1dff, 0x1d02 }, + { "Latin Extended Additional", 0x1e00, 0x1eff, 0x1e00 }, + { "Greek Extended", 0x1f00, 0x1fff, 0x1f00 }, + { "Symbols", 0x2000, 0x2bff, 0x2000 }, + { "General Punctuation", 0x2000, 0x206f, 0x2000 }, + { "Super and Sub scripts", 0x2070, 0x209f, 0x2070 }, + { "Currency Symbols", 0x20a0, 0x20cf, 0x20ac }, + { "Combining marks for Symbols", 0x20d0, 0x20ff, 0x20d0 }, + { "Letterlike Symbols", 0x2100, 0x214f, 0x2100 }, + { "Number Forms", 0x2150, 0x218f, 0x2153 }, + { "Arrows", 0x2190, 0x21ff, 0x2190 }, + { "Mathematical Symbols", 0x2200, 0x22ff, 0x2200 }, + { "Technical Symbols", 0x2300, 0x23ff, 0x2300 }, + { "Control Pictures", 0x2400, 0x243f, 0x2400 }, + { "OCR", 0x2440, 0x245f, 0x2440 }, + { "Enclosed Alphanumerics", 0x2460, 0x24ff, 0x2460 }, + { "Box Drawing", 0x2500, 0x257f, 0x2500 }, + { "Block Elements", 0x2580, 0x259f, 0x2580 }, + { "Geometric Shapes", 0x25a0, 0x25ff, 0x25a0 }, + { "Miscellaneous Symbols", 0x2600, 0x267f, 0x2600 }, + { "Dingbats", 0x2700, 0x27bf, 0x2701 }, + { "Zapf Dingbats", 0x2700, 0x27bf, 0x2701 }, /* Synonym */ + { "Miscellaneous Math Symbols-A", 0x27c0, 0x27df, -1 }, + { "Math Miscellaneous Symbols-A", 0x27c0, 0x27df, -1 }, + { "Supplemental Arrows-A", 0x27e0, 0x27ff, -1 }, + { "Arrows Supplemental-A", 0x27e0, 0x27ff, -1 }, + { "Braille Patterns", 0x2800, 0x28ff, 0x2800 }, + { "Supplemental Arrows-B", 0x2900, 0x297f, -1 }, + { "Arrows Supplemental-B", 0x2900, 0x297f, -1 }, + { "Miscellaneous Math Symbols-B", 0x2980, 0x29ff, -1 }, + { "Math Miscellaneous Symbols-B", 0x2980, 0x29ff, -1 }, + { "Supplemental Math Operators", 0x2a00, 0x2aff, -1 }, + { "Math Supplemental Operators", 0x2a00, 0x2aff, -1 }, + { "Supplemental Symbols", 0x2b00, 0x2bff, -1 }, + { "Symbols Supplemental", 0x2b00, 0x2bff, -1 }, + { "Alphabetic Extended", 0x2c00, 0x2fff, -1 }, + { "Coptic", 0x2c00, 0x2c3f, -1 }, + { "Hungarian Runic", 0x2c40, 0x2c6f, -1 }, + { "Runic Hungarian", 0x2c40, 0x2c6f, -1 }, + { "Glagolitic", 0x2c80, 0x2cdf, -1 }, + { "Ethiopic Extended", 0x2d00, 0x2d5f, -1 }, + { "Ol Cemet'", 0x2d80, 0x2daf, -1 }, + { "Sorang Sng.", 0x2db0, 0x2ddf, -1 }, + { "Siloti Nagri", 0x2e00, 0x2e3f, -1 }, + { "Varang Kshiti", 0x2e40, 0x2e7f, -1 }, + { "CJK Radicals", 0x2e80, 0x2eff, -1 }, + { "Kanqxi Radicals", 0x2f00, 0x2fdf, -1 }, + { "IDC", 0x2fe0, 0x2fef, -1 }, + { "CJK Phonetics and Symbols", 0x3000, 0x33ff, 0x3000 }, + { "CJK Symbols and Punctuation", 0x3000, 0x303f, 0x3000 }, + { "Hiragana", 0x3040, 0x309f, 0x3041 }, + { "Katakana", 0x30a0, 0x30ff, 0x30a1 }, + { "Bopomofo", 0x3100, 0x312f, 0x3105 }, + { "Hangul Compatibility Jamo", 0x3130, 0x318f, 0x3131 }, + { "Kanbun", 0x3190, 0x319f, 0x3190 }, + { "Enclosed CJK Letters and Months", 0x3200, 0x32ff, 0x3200 }, + { "CJK Enclosed Letters and Months", 0x3200, 0x32ff, 0x3200 }, + { "CJK Compatibility", 0x3300, 0x33ff, 0x3300 }, + { "CJK Unified Ideographs Extension A", 0x3400, 0x4dff, -1 }, + { "Yijing Hexagram Symbols", 0x4db0, 0x4dff, -1 }, + { "CJK Unified Ideographs", 0x4e00, 0x9fff, 0x4e00 }, + { "Yi", 0xa000, 0xabff, -1 }, + { "Yi Radicals", 0xa490, 0xa4af, -1 }, + { "Yi Extensions", 0xa500, 0xa93f, -1 }, + { "Pahawh Hmong", 0xa900, 0xa93f, -1 }, + { "Chakma", 0xa980, 0xa9cf, -1 }, + { "Newari", 0xaa00, 0xaa5f, -1 }, + { "Siddham", 0xaa80, 0xaacf, -1 }, + { "Phags-pa", 0xab00, 0xab5f, -1 }, + { "Hangul Syllables", 0xac00, 0xd7a3, 0xac00 }, + { "High Surrogate", 0xd800, 0xdbff, -1 }, /* No characters defined */ + { "Surrogate High", 0xd800, 0xdbff, -1 }, + { "Surrogate High, Non Private Use", 0xd800, 0xdb7f, -1 }, + { "Surrogate High, Private Use", 0xdb80, 0xdbff, -1 }, + { "Low Surrogate", 0xdc00, 0xdfff, -1 }, + { "Private/Corporate Use", 0xe000, 0xf8ff, 0xe000 }, + { "Private Use", 0xe000, 0xe0ff, 0xe000 }, + /* Boundary between private and corporate use is not fixed */ + /* these should be safe... */ + { "Corporate Use", 0xf500, 0xf8ff, 0xf730 }, + { "CJK Compatibility Ideographs", 0xf900, 0xfaff, 0xf900 }, + { "Alphabetic Presentation Forms", 0xfb00, 0xfb4f, 0xfb00 }, + { "Latin Ligatures", 0xfb00, 0xfb05, 0xfb00 }, + { "Armenian Ligatures", 0xfb13, 0xfb17, 0xfb13 }, + { "Hebrew Ligatures/Pointed Letters", 0xfb1e, 0xfb4f, 0xfb2a }, + { "Arabic Presentation Forms A", 0xfb50, 0xfdff, 0xfb50 }, + { "Combining half marks", 0xfe20, 0xfe2f, 0xfe20 }, + { "CJK Compatibility Forms", 0xfe30, 0xfe4f, 0xfe30 }, + { "Small Form Variants", 0xfe50, 0xfe6f, 0xfe50 }, + { "Arabic Presentation Forms B", 0xfe70, 0xfefe, 0xfe70 }, + { "Byte Order Mark", 0xfeff, 0xfeff, 0xfeff }, + { "Half and Full Width Forms", 0xff00, 0xffef, 0xff01 }, + { "Latin Full Width Forms", 0xff01, 0xff5e, 0xff01 }, + { "KataKana Half Width Forms", 0xff61, 0xff9f, 0xff61 }, + { "Hangul Jamo Half Width Forms", 0xffa0, 0xffdc, 0xffa0 }, + { "Specials", 0xfff0, 0xfffd, 0xfffd }, + { "Not a Unicode Character", 0xfffe, 0xfffe, 0xfffe }, + { "Signature Mark", 0xffff, 0xffff, 0xffff }, +/* End of BMP, Start of SMP */ + { "Unicode Supplementary Multilingual Plane", 0x10000, 0x1ffff, -1 }, + { "Supplementary Multilingual Plane", 0x10000, 0x1ffff, -1 }, + { "Aegean scripts", 0x10000, 0x102ff, 0x10000 }, + { "Linear B Syllabary", 0x10000, 0x1007f, 0x10000 }, + { "Linear B Ideograms", 0x10080, 0x100df, 0x10080 }, + { "Aegean numbers", 0x10100, 0x1003f, 0x10100 }, + { "Linear A", 0x10180, 0x102cf, 0x10180 }, + { "Alphabetic and syllabic LTR scripts", 0x10300, 0x107ff, -1 }, + { "Old Italic", 0x10300, 0x1032f, 0x10300 }, + { "Gothic", 0x10330, 0x1034f, 0x10330 }, + { "Old Permic", 0x10350, 0x1037f, 0x10350 }, + { "Ugaritic", 0x10380, 0x1039f, -1 }, + { "Deseret", 0x10400, 0x1044f, -1 }, + { "Shavian", 0x10450, 0x1047f, -1 }, + { "Osmanya", 0x10480, 0x104a9, -1 }, + { "Pollard", 0x104b0, 0x104d9, -1 }, + { "Alphabetic and syllabic RTL scripts", 0x10800, 0x10fff, -1 }, + { "Cypriot", 0x10800, 0x1083f, 0x10800 }, + { "Meriotic", 0x10840, 0x1085f, 0x10840 }, + { "Balti", 0x10860, 0x1087f, -1 }, + { "Kharosthi", 0x10a00, 0x10a5f, -1 }, + { "Brahmic scripts", 0x11000, 0x117ff, -1 }, + { "African and other syllabic scripts", 0x11800, 0x11fff, -1 }, + { "Scripts for invented languages", 0x12000, 0x127ff, -1 }, + { "Tengwar (Tolkien Elvish)", 0x12000, 0x1207f, 0x12000 }, + { "Cirth (Tolkien Runic)", 0x12080, 0x120ff, 0x12080 }, + { "Blissymbols", 0x12200, 0x124ff, -1 }, + { "Cuneiform and other Near Eastern Scripts", 0x12800, 0x12fff, -1 }, + { "Undeciphered scripts", 0x13000, 0x137ff, -1 }, + { "North American ideographs and pictograms", 0x13800, 0x13fff, -1 }, + { "Egyptian and Mayan hieroglyphs", 0x14000, 0x16bff, -1 }, + { "Sumerian pictograms", 0x16c00, 0x16fff, -1 }, + { "Large Asian Scripts", 0x17000, 0x1b5ff, -1 }, + { "Notational systems", 0x1d000, 0x1ffd, -1 }, + { "Byzantine Musical Symbols", 0x1d000, 0x1d0ff }, + { "Musical Symbols", 0x1d100, 0x1d1ff }, + { "Mathematical Alphanumeric Symbols", 0x1d400, 0x1d7ff }, +/* End of SMP, Start of SIP */ + { "Unicode Supplementary Ideographic Plane", 0x20000, 0x2ffff, -1 }, + { "Supplementary Ideographic Plane", 0x20000, 0x2ffff, -1 }, + { "CJK Unified Ideographs Extension B", 0x20000, 0x2a6d6, -1 }, + { "CJK Compatibility Ideographs Supplement", 0x2f800, 0x2fa1f, -1 }, +/* End of SIP, Start of SSP */ + { "Unicode Supplementary Special-purpose Plane", 0xe0000, 0xeffff, -1 }, + { "Supplementary Special-purpose Plane", 0xe0000, 0xeffff, -1 }, + { "Tag characters", 0xe0000, 0xe007f, -1 }, + { "Variation Selectors", 0xe0110, 0xe01ff, -1 }, +/* End of SSP */ + { "Supplementary Private Use Area-A", 0xfff80, 0xfffff, -1 }, + { "Supplementary Private Use Area-B", 0x10ff80, 0x10ffff, -1 }, + { NULL } +}; + +struct unicoderange specialnames[] = { + { NULL } +}; + +const char *UnicodeRange(int unienc) { + char *ret; + struct unicoderange *best=NULL; + int i; + + ret = "Unencoded Unicode"; + if ( unienc<0 ) +return( ret ); + + for ( i=0; unicoderange[i].name!=NULL; ++i ) { + if ( unienc>=unicoderange[i].first && unienc<=unicoderange[i].last ) { + if ( best==NULL ) + best = &unicoderange[i]; + else if (( unicoderange[i].first>best->first && + unicoderange[i].last<=best->last ) || + ( unicoderange[i].first>=best->first && + unicoderange[i].lastlast )) + best = &unicoderange[i]; + } + } + if ( best!=NULL ) +return(best->name); + +return( ret ); +} + +static int alpha(const void *_t1, const void *_t2) { + const GTextInfo *t1 = _t1, *t2 = _t2; + +return( strcmp((char *) (t1->text),(char *) (t2->text))); +} + +static GTextInfo *AvailableRanges(SplineFont *sf) { + GTextInfo *ret = gcalloc(sizeof(unicoderange)/sizeof(unicoderange[0])+2,sizeof(GTextInfo)); + int i, cnt, ch, pos; + + for ( i=cnt=0; unicoderange[i].name!=NULL; ++i ) { + ch = unicoderange[i].defined==-1 ? unicoderange[i].first : unicoderange[i].defined; + pos = -1; + if ( sf->encoding_name==em_unicode ) { + if ( chcharcnt && ch<65536 ) + pos = ch; + } else if ( sf->encoding_name==em_unicode4 ) { + if ( chcharcnt ) + pos = ch; + } else if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name>=em_unicodeplanesmax ) { + pos = ch-((sf->encoding_name-em_unicodeplanes)<<16); + if ( pos>=sf->charcnt || pos<0 ) + pos = -1; + } else + pos = SFFindChar(sf,ch,NULL); + if ( pos!=-1 ) { + ret[cnt].text = (unichar_t *) unicoderange[i].name; + ret[cnt].text_is_1byte = true; + ret[cnt++].userdata = (void *) pos; + } + } + qsort(ret,cnt,sizeof(GTextInfo),alpha); +return( ret ); +} + +int NameToEncoding(SplineFont *sf,const unichar_t *uname) { + int enc, uni, i; + char *end, *dot=NULL, *freeme=NULL; + char *name; + + if ( uname[1]==0 && uname[0]>=256 ) +return( SFFindChar(sf,uname[0],NULL)); + + name = cu_copy(uname); + enc = uni = -1; + + while ( 1 ) { + enc = SFFindChar(sf,-1,name); + if ( enc!=-1 ) { + free(name); +return( enc ); + } + if ( (*name=='U' || *name=='u') && name[1]=='+' ) { + uni = strtol(name+2,&end,16); + if ( *end!='\0' ) + uni = -1; + } else if ( name[0]=='u' && name[1]=='n' && name[2]=='i' ) { + uni = strtol(name+3,&end,16); + if ( *end!='\0' ) + uni = -1; + } else if ( name[0]=='g' && name[1]=='l' && name[2]=='y' && name[3]=='p' && name[4]=='h' ) { + int orig = strtol(name+5,&end,10); + if ( *end!='\0' ) + orig = -1; + if ( orig!=-1 ) { + for ( enc=sf->charcnt-1; enc>=0; --enc ) + if ( sf->chars[enc]!=NULL && sf->chars[enc]->orig_pos==orig ) + break; + } + } else if ( isdigit(*name)) { + enc = strtoul(name,&end,0); + if ( *end==',' && ((sf->encoding_name>=em_jis208 && sf->encoding_name<=em_last94x94) || + sf->encoding_name == em_unicode )) { + int j = strtoul(end+1,&end,10); + /* kuten */ + if ( *end!='\0' ) + enc = -1; + else if ( sf->encoding_name==em_unicode ) { + if ( enc>=0 && enc<256 && j>=0 && j<256 ) + enc = (enc<<8) |j; + else + enc = -1; + } else { + if ( enc>=1 && enc<=94 && j>=1 && j<=94 ) + enc = ((enc+0x20)<<8) + j+0x20; + else + enc = -1; + } + } else if ( *end!='\0' ) + enc = -1; + if ( sf->remap!=NULL && enc!=-1 ) { + struct remap *map = sf->remap; + while ( map->infont!=-1 ) { + if ( enc>=map->firstenc && enc<=map->lastenc ) { + enc += map->infont-map->firstenc; + break; + } + ++map; + } + } + } else { + if ( enc==-1 ) { + uni = UniFromName(name); + if ( uni<0 ) { + for ( i=0; specialnames[i].name!=NULL; ++i ) + if ( strcmp(name,specialnames[i].name)==0 ) { + uni = specialnames[i].first; + break; + } + } + if ( uni<0 && name[1]=='\0' ) + uni = name[0]; + } + } + if ( enc>=sf->charcnt || enc<0 ) + enc = -1; + if ( enc==-1 && uni!=-1 ) + enc = SFFindChar(sf,uni,NULL); + if ( enc!=-1 && uni==-1 ) { + if ( sf->chars[enc]!=NULL ) + uni = sf->chars[enc]->unicodeenc; + else if ( sf->encoding_name == em_unicode || sf->encoding_name==em_unicode4 ) + uni = enc; + } + if ( dot!=NULL ) { + free(name); + if ( uni==-1 ) +return( -1 ); + if ( uni<0x600 || uni>0x6ff ) +return( -1 ); + if ( strmatch(dot,".begin")==0 || strmatch(dot,".initial")==0 ) + uni = ArabicForms[uni-0x600].initial; + else if ( strmatch(dot,".end")==0 || strmatch(dot,".final")==0 ) + uni = ArabicForms[uni-0x600].final; + else if ( strmatch(dot,".medial")==0 ) + uni = ArabicForms[uni-0x600].medial; + else if ( strmatch(dot,".isolated")==0 ) + uni = ArabicForms[uni-0x600].isolated; + else +return( -1 ); +return( SFFindChar(sf,uni,NULL) ); + } else if ( enc!=-1 ) { + free(name); +return( enc ); + } + dot = strrchr(name,'.'); + if ( dot==NULL ) +return( -1 ); + freeme = copyn(name,dot-name); + free(name); + name = freeme; + } +} + +typedef struct gotodata { + SplineFont *sf; + GWindow gw; + int ret, done; + GTextInfo *ranges; +} GotoData; + +#define CID_Name 1000 + +static int Goto_Cancel(GGadget *g, GEvent *e) { + GWindow gw; + GotoData *d; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + d->done = true; + } +return( true ); +} + +static int Goto_OK(GGadget *g, GEvent *e) { + GWindow gw; + GotoData *d; + const unichar_t *ret; + int i; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + d = GDrawGetUserData(gw); + ret = _GGadgetGetTitle(GWidgetGetControl(gw,CID_Name)); + for ( i=0; d->ranges[i].text!=NULL; ++i ) { + if ( uc_strcmp(ret,(char *) d->ranges[i].text)==0 ) { + d->ret = (int) d->ranges[i].userdata; + break; + } + } + if ( d->ret==-1 ) { + d->ret = NameToEncoding(d->sf,ret); + if ( d->ret<0 || d->ret>=d->sf->charcnt ) + d->ret = -1; + if ( d->ret==-1 ) { + char *temp=cu_copy(ret); + GWidgetPostNoticeR(_STR_Goto,_STR_Couldntfindchar,temp); + free(temp); + } else + d->done = true; + } else + d->done = true; + } +return( true ); +} + +static int goto_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + GotoData *d = GDrawGetUserData(gw); + d->done = true; + } else if ( event->type == et_char ) { +return( false ); + } +return( true ); +} + +int GotoChar(SplineFont *sf) { + int enc = -1; + unichar_t *ret; + + if ( sf->encoding_nameencoding_name>=em_base ) { + /* In one byte encodings don't bother with the range list. It won't */ + /* have enough entries to be useful */ + ret = GWidgetAskStringR(_STR_Goto,NULL,_STR_Enternameofchar); + if ( ret==NULL ) +return(-1); + enc = NameToEncoding(sf,ret); + if ( enc<0 || enc>=sf->charcnt ) + enc = -1; + if ( enc==-1 ) + GWidgetPostNoticeR(_STR_Goto,_STR_CouldntfindcharU,ret); + free(ret); +return( enc ); + } else { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + static GotoData gd; + GTextInfo *ranges = AvailableRanges(sf); + int i, wid, temp; + unichar_t ubuf[100]; + + memset(&gd,0,sizeof(gd)); + gd.sf = sf; + gd.ret = -1; + gd.ranges = ranges; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<wid ) + wid = temp; + } + if ( pos.width +#include +#include +#include +#include "psfont.h" + +/* This operations are designed to work on a single font. NOT a CID collection*/ +/* A CID collection must be treated one sub-font at a time */ + +typedef struct histdata { + int low, high; + struct hentry { + int cnt, sum; + int char_cnt, max; + SplineChar **chars; + } *hist; /* array of high-low+1 elements */ + int tot, max; +} HistData; + +static void HistDataFree(HistData *h) { + int i; + + for ( i=h->low; i<=h->high; ++i ) + free(h->hist[i-h->low].chars); + free(h->hist); + free(h); +} + +static HistData *HistFindBlues(SplineFont *sf,uint8 *selected) { + int i, low,high, top,bottom; + SplineChar *sc; + DBounds b; + HistData *hist; + struct hentry *h; + + hist = gcalloc(1,sizeof(HistData)); + hist->hist = gcalloc(sf->ascent+sf->descent+1,sizeof(struct hentry)); + hist->low = sf->ascent; hist->high = -sf->descent; + low = -sf->descent; high = sf->ascent; + + for ( i=0; icharcnt; ++i ) { + if ( (sc = sf->chars[i])!=NULL && sc->layers[ly_fore].splines!=NULL && sc->layers[ly_fore].refs==NULL && + (selected==NULL || selected[i])) { + SplineCharFindBounds(sc,&b); + bottom = rint(b.miny); + top = rint(b.maxy); + if ( top==bottom ) + continue; + if ( top>hist->high ) { + hist->high = top; + if ( top>high ) { + hist->hist = grealloc(hist->hist,(top+10-low)*sizeof(struct hentry)); + memset(hist->hist + high-low+1,0,(top+10-high-1)*sizeof(struct hentry)); + high = top+10 -1; + } + } + ++ hist->hist[top-low].cnt; + if ( hist->hist[top-low].char_cnt >= hist->hist[top-low].max ) { + if ( hist->hist[top-low].max==0 ) + hist->hist[top-low].chars = galloc(10*sizeof(SplineChar *)); + else + hist->hist[top-low].chars = grealloc(hist->hist[top-low].chars,(hist->hist[top-low].max+10)*sizeof(SplineChar *)); + hist->hist[top-low].max += 10; + } + hist->hist[top-low].chars[hist->hist[top-low].char_cnt++] = sc; + + if ( bottomlow ) { + hist->low = bottom; + if ( bottomhist,(high+1-low)*sizeof(struct hentry)); + low = bottom-10+1; + free( hist->hist ); + hist->hist = h; + } + } + ++ hist->hist[bottom-low].cnt; + if ( hist->hist[bottom-low].char_cnt >= hist->hist[bottom-low].max ) { + if ( hist->hist[bottom-low].max==0 ) + hist->hist[bottom-low].chars = galloc(10*sizeof(SplineChar *)); + else + hist->hist[bottom-low].chars = grealloc(hist->hist[bottom-low].chars,(hist->hist[bottom-low].max+10)*sizeof(SplineChar *)); + hist->hist[bottom-low].max += 10; + } + hist->hist[bottom-low].chars[hist->hist[bottom-low].char_cnt++] = sc; + } + hist->tot += 2; + } + if ( hist->low>hist->high ) { /* Found nothing */ + hist->low = hist->high = 0; + } + if ( low!=hist->low || high!=hist->high ) { + h = galloc((hist->high-hist->low+1)*sizeof(struct hentry)); + memcpy(h,hist->hist + hist->low-low,(hist->high-hist->low+1)*sizeof(struct hentry)); + free(hist->hist); + hist->hist = h; + } +return( hist ); +} + +static HistData *HistFindStemWidths(SplineFont *sf,uint8 *selected,int hor) { + int i, low,high, val; + SplineChar *sc; + HistData *hist; + struct hentry *h; + StemInfo *stem; + + hist = gcalloc(1,sizeof(HistData)); + hist->hist = gcalloc(sf->ascent+sf->descent+1,sizeof(struct hentry)); + hist->low = sf->ascent+sf->descent; + low = 0; high = sf->ascent+sf->descent; + + for ( i=0; icharcnt; ++i ) { + if ( (sc = sf->chars[i])!=NULL && sc->layers[ly_fore].splines!=NULL && sc->layers[ly_fore].refs==NULL && + (selected==NULL || selected[i])) { + if ( autohint_before_generate && sc->changedsincelasthinted && !sc->manualhints ) + SplineCharAutoHint(sc,true); + for ( stem = hor ? sc->hstem : sc->vstem ; stem!=NULL; stem = stem->next ) { + if ( stem->ghost ) + continue; + val = rint(stem->width); + if ( val<=0 ) + val = -val; + if ( val>hist->high ) { + hist->high = val; + if ( val>high ) { + hist->hist = grealloc(hist->hist,(val+10-low)*sizeof(struct hentry)); + memset(hist->hist + high-low+1,0,(val+10-high-1)*sizeof(struct hentry)); + high = val+10 -1; + } + } + if ( vallow ) + hist->low = val; + ++ hist->hist[val-low].cnt; + if ( hist->hist[val-low].char_cnt==0 || + hist->hist[val-low].chars[hist->hist[val-low].char_cnt-1]!=sc ) { + if ( hist->hist[val-low].char_cnt >= hist->hist[val-low].max ) { + if ( hist->hist[val-low].max==0 ) + hist->hist[val-low].chars = galloc(10*sizeof(SplineChar *)); + else + hist->hist[val-low].chars = grealloc(hist->hist[val-low].chars,(hist->hist[val-low].max+10)*sizeof(SplineChar *)); + hist->hist[val-low].max += 10; + } + hist->hist[val-low].chars[hist->hist[val-low].char_cnt++] = sc; + } + ++ hist->tot; + } + } + } + if ( hist->low>hist->high ) { /* Found nothing */ + hist->low = hist->high = 0; + } + if ( low!=hist->low || high!=hist->high ) { + h = galloc((hist->high-hist->low+1)*sizeof(struct hentry)); + memcpy(h,hist->hist + hist->low-low,(hist->high-hist->low+1)*sizeof(struct hentry)); + free(hist->hist); + hist->hist = h; + } +return( hist ); +} + +static HistData *HistFindHStemWidths(SplineFont *sf,uint8 *selected) { +return( HistFindStemWidths(sf,selected,true) ); +} + +static HistData *HistFindVStemWidths(SplineFont *sf,uint8 *selected) { +return( HistFindStemWidths(sf,selected,false) ); +} + +static void HistFindMax(HistData *h, int sum_around) { + int i, j, m=1; + int c; + + if ( sum_around<0 ) sum_around = 0; + for ( i = h->low; i<=h->high; ++i ) { + c = 0; + for ( j=i-sum_around; j<=i+sum_around; ++j ) + if ( j>=h->low && j<=h->high ) + c += h->hist[j-h->low].cnt; + h->hist[i-h->low].sum = c; + if ( c>m ) + m = c; + } + h->max = m; +} + +#define CID_ScrollBar 1000 +#define CID_MainVal 1001 +#define CID_SecondaryVal 1002 + +#define CID_SumAround 1003 +#define CID_BarWidth 1004 + +#define CID_MainValL 2001 +#define CID_SecondaryValL 2002 +#define CID_SumAroundL 2003 +#define CID_BarWidthL 2004 +#define CID_Group 2005 +#define CID_BlueMsg 2006 + +#define CID_OK 3001 +#define CID_Cancel 3002 + +struct hist_dlg { + enum hist_type which; + SplineFont *sf; + struct psdict *private; + uint8 *selected; + HistData *h; + + int pending_blue; + int is_pending; + + int sum_around, barwidth; + int hoff; + + int x,y; + int hwidth, hheight; + int yoff; + + GWindow gw; + GFont *font; + int fh, as; + int done; +}; + +static void HistPopup(struct hist_dlg *hist,GEvent *e) { + int x = e->u.mouse.x - (hist->x+1); + struct hentry *h; + static unichar_t buffer[300]; + unichar_t *end = buffer + sizeof(buffer)/sizeof(buffer[0]), *pt, *line; + int i; + + if ( e->u.mouse.yy || e->u.mouse.y>hist->y+hist->hheight ) +return; + if ( x<0 || x>hist->hwidth-2 ) +return; + + x /= hist->barwidth; + if ( x + hist->hoff > hist->h->high || x + hist->hoff - hist->h->low<0 ) +return; + + h = &hist->h->hist[x + hist->hoff - hist->h->low]; + if ( hist->sum_around==0 ) { + if ( hist->which == hist_blues ) + u_snprintf(buffer,end-buffer, + GStringGetResource(_STR_BlueHistPopup,NULL), + x + hist->hoff, + h->sum); + else + u_snprintf(buffer,end-buffer, + GStringGetResource(_STR_StemHistPopup,NULL), + x + hist->hoff, + h->sum, (int) rint(h->sum*100.0/hist->h->max)); + } else { + if ( hist->which == hist_blues ) + u_snprintf(buffer,end-buffer, + GStringGetResource(_STR_BlueHistSumPopup,NULL), + x+hist->hoff-hist->sum_around, x+hist->hoff+hist->sum_around, x + hist->hoff, + h->sum, h->cnt); + else + u_snprintf(buffer,end-buffer, + GStringGetResource(_STR_StemHistSumPopup,NULL), + x+hist->hoff-hist->sum_around, x+hist->hoff+hist->sum_around, x + hist->hoff, + h->sum, h->cnt, (int) rint(h->sum*100.0/hist->h->max)); + } + pt = buffer+u_strlen(buffer); + line = pt; + for ( i = 0; ichar_cnt; ++i ) { + if ( pt+strlen(h->chars[i]->name)+4>end ) { + uc_strcpy(pt,"..."); + break; + } + uc_strcpy(pt,h->chars[i]->name); + pt += u_strlen(pt); + if ( pt-line>70 ) { + *pt++ = '\n'; + line = pt; + } else + *pt++ = ' '; + *pt = '\0'; + } + GGadgetPreparePopup(hist->gw,buffer); +} + +static unichar_t *ArrayOrder(const unichar_t *old,int args,int val1,int val2) { + unichar_t *end; + double array[40]; + int i,j,k; + static unichar_t format[] = { '%', 'g', '\0' }; + unichar_t *new, *pt; + unichar_t ubuf[40]; + + if ( *old=='[' ) ++old; + + for ( i=0; i<40 && *old!=']' && *old!='\0'; ++i ) { + array[i] = u_strtod(old,&end); + if ( old==end ) + break; + old = end; + while ( *old==' ' ) ++old; + } + array[i++] = val1; + if ( args==2 ) + array[i++] = val2; + for ( j=0; jarray[k] ) { + double temp = array[j]; + array[j] = array[k]; + array[k] = temp; + } + + u_sprintf(ubuf,format,val1); + new = galloc(2*(u_strlen(ubuf)+u_strlen(old)+10)*sizeof(unichar_t)); + + pt = new; + *pt++ = '['; + for ( k=0; ku.mouse.x - (hist->x+1); + static unichar_t fullformat[] = { '[', '%', 'd', ']', '\0' }; + unichar_t ubuf[20]; + + if ( e->u.mouse.yy || e->u.mouse.y>hist->y+hist->hheight ) +return; + if ( x<0 || x>hist->hwidth-2 ) +return; + + x /= hist->barwidth; + x += hist->hoff; + if ( x > hist->h->high || xh->low ) +return; + + if ( hist->which==hist_blues ) { + if ( hist->is_pending ) { + if ( xpending_blue ) + GWidgetErrorR(_STR_BadValue,_STR_SmallerNumberFirstInBlues); + else if ( x<0 ) { /* OtherBlues */ + const unichar_t *old = _GGadgetGetTitle(GWidgetGetControl(hist->gw,CID_SecondaryVal)); + unichar_t *new = ArrayOrder(old,2,hist->pending_blue,x); + GGadgetSetTitle(GWidgetGetControl(hist->gw,CID_SecondaryVal),new); + free(new); + } else { + const unichar_t *old = _GGadgetGetTitle(GWidgetGetControl(hist->gw,CID_MainVal)); + unichar_t *new = ArrayOrder(old,2,hist->pending_blue,x); + GGadgetSetTitle(GWidgetGetControl(hist->gw,CID_MainVal),new); + free(new); + } + GDrawSetCursor(hist->gw,ct_pointer); + hist->is_pending = false; + } else { + hist->is_pending = true; + hist->pending_blue = x; + GDrawSetCursor(hist->gw,ct_eyedropper); + } + GGadgetSetVisible(GWidgetGetControl(hist->gw,CID_MainVal),!hist->is_pending); + GGadgetSetVisible(GWidgetGetControl(hist->gw,CID_MainValL),!hist->is_pending); + GGadgetSetVisible(GWidgetGetControl(hist->gw,CID_BlueMsg),hist->is_pending); + } else { + if ( !( e->u.mouse.state&ksm_shift )) { + u_sprintf(ubuf,fullformat,x); + GGadgetSetTitle(GWidgetGetControl(hist->gw,CID_MainVal),ubuf); + GGadgetSetTitle(GWidgetGetControl(hist->gw,CID_SecondaryVal),ubuf); + } else { + const unichar_t *old = _GGadgetGetTitle(GWidgetGetControl(hist->gw,CID_SecondaryVal)); + unichar_t *new = ArrayOrder(old,1,x,0); + GGadgetSetTitle(GWidgetGetControl(hist->gw,CID_SecondaryVal),new); + free(new); + } + } +} + +static void HistExpose(GWindow pixmap, struct hist_dlg *hist) { + GRect r,old; + int height = hist->hheight-hist->fh; + double yscale = (4*height/5.0)/(hist->h->max-0); + int i; + char buf[20]; + unichar_t ubuf[20]; + + GDrawSetLineWidth(pixmap,0); + r.x = hist->x; r.y = hist->y; + r.width = hist->hwidth; r.height = height; + GDrawDrawRect(pixmap,&r,0x000000); + + ++r.x; r.width--; + ++r.y; r.height--; + GDrawPushClip(pixmap,&r,&old); + + for ( i=hist->hoff; (i-hist->hoff)*hist->barwidthhwidth-2 && i<=hist->h->high; ++i ) { + r.x = (i-hist->hoff)*hist->barwidth+hist->x+1; r.width = hist->barwidth; + r.height = rint(hist->h->hist[i-hist->h->low].sum * yscale); + if ( r.height>=0 ) { + r.y = hist->y+height - r.height; + GDrawFillRect(pixmap,&r,0x2020ff); + } + } + + GDrawPopClip(pixmap,&old); + + GDrawSetFont(pixmap,hist->font); + r.x = 10; r.y = hist->y+height+1; r.width = hist->hwidth+2*(hist->x-10); r.height = hist->fh; + GDrawFillRect(pixmap,&r,GDrawGetDefaultBackground(NULL)); + sprintf(buf,"%d",hist->hoff); uc_strcpy(ubuf,buf); + GDrawDrawText(pixmap,hist->x-GDrawGetTextWidth(pixmap,ubuf,-1,NULL)/2,hist->y+height+hist->as, + ubuf,-1,NULL,0x000000); + sprintf(buf,"%d",hist->hoff+hist->hwidth/hist->barwidth); uc_strcpy(ubuf,buf); + GDrawDrawText(pixmap,hist->x+hist->hwidth-GDrawGetTextWidth(pixmap,ubuf,-1,NULL)/2,hist->y+height+hist->as, + ubuf,-1,NULL,0x000000); + + sprintf(buf,"%d",hist->h->max); uc_strcpy(ubuf,buf); + GDrawDrawText(pixmap,hist->x-GDrawGetTextWidth(pixmap,ubuf,-1,NULL)-2,hist->y+height-rint(hist->h->max*yscale), + ubuf,-1,NULL,0x000000); + GDrawDrawText(pixmap,hist->x+hist->hwidth+2,hist->y+height-rint(hist->h->max*yscale), + ubuf,-1,NULL,0x000000); +} + +static void HistScroll(struct hist_dlg *hist,struct sbevent *sb) { + int newpos = hist->hoff; + int cols = (hist->hwidth-2)/hist->barwidth; + GRect r; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= cols; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += cols; + break; + case et_sb_bottom: + newpos = (hist->h->high+1-hist->h->low)-cols; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>(hist->h->high+1-hist->h->low)-cols + hist->h->low ) + newpos = (hist->h->high+1-hist->h->low)-cols + hist->h->low; + if ( newposh->low ) newpos = hist->h->low; + if ( newpos!=hist->hoff ) { + int diff = newpos-hist->hoff; + hist->hoff = newpos; + GScrollBarSetPos(GWidgetGetControl(hist->gw,CID_ScrollBar),hist->hoff); + r.x = hist->x+1; r.y = hist->y+1; + r.width = hist->hwidth-1; r.height = hist->hheight-1; + GDrawScroll(hist->gw,&r,-diff*hist->barwidth,0); + r.x = 10; r.y = hist->y+hist->hheight-hist->fh+1; + r.width = hist->hwidth+2*(hist->x-10); r.height = hist->fh; + GDrawRequestExpose(hist->gw,&r,false); + } +} + +static void HistRefigureSB(struct hist_dlg *hist) { + GGadget *g = GWidgetGetControl(hist->gw,CID_ScrollBar); + int width = hist->hwidth, hoff; + + GScrollBarSetBounds(g,hist->h->low,hist->h->high+1,(width-2)/hist->barwidth); + if ( hist->hoff+width/hist->barwidth >hist->h->high ) { + hoff = hist->h->high-width/hist->barwidth; + if ( hoff<0 ) hoff = 0; + if ( hoff!=hist->hoff ) { + hist->hoff = hoff; + GScrollBarSetPos(g,hoff); + } + } +} + +static void HistResize(struct hist_dlg *hist) { + GRect size; + int width, height, changed=false; + GGadget *g; + + GDrawGetSize(hist->gw,&size); + width = size.width-2*hist->x; + height = size.height - hist->yoff - 20; + if ( width!=hist->hwidth || height!=hist->hheight ) { + changed = true; + g = GWidgetGetControl(hist->gw,CID_Group); + GGadgetGetSize(g,&size); + GGadgetResize(g,size.width+width-hist->hwidth,size.height+height-hist->hheight); + } + if ( width!=hist->hwidth ) { + g = GWidgetGetControl(hist->gw,CID_Cancel); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x+width-hist->hwidth,size.y); + g = GWidgetGetControl(hist->gw,CID_ScrollBar); + GGadgetGetSize(g,&size); + GGadgetResize(g,width+1,size.height); + hist->hwidth = width; + HistRefigureSB(hist); + } + if ( height!=hist->hheight ) { + int off = height-hist->hheight; + hist->hheight = height; + g = GWidgetGetControl(hist->gw,CID_ScrollBar); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_SumAroundL); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_SumAround); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_BarWidthL); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_BarWidth); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_MainValL); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_MainVal); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_SecondaryValL); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_SecondaryVal); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_BlueMsg); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_OK); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + g = GWidgetGetControl(hist->gw,CID_Cancel); + GGadgetGetSize(g,&size); + GGadgetMove(g,size.x,size.y+off); + } + if ( changed ) + GDrawRequestExpose(hist->gw,NULL,false); +} + +static void HistSet(struct hist_dlg *hist) { + char *primary, *secondary; + char *temp; + struct psdict *p = hist->private ? hist->private : hist->sf->private; + const unichar_t *ret1, *ret2; + + switch ( hist->which ) { + case hist_hstem: + primary = "StdHW"; secondary = "StemSnapH"; + break; + case hist_vstem: + primary = "StdVW"; secondary = "StemSnapV"; + break; + case hist_blues: + primary = "BlueValues"; secondary = "OtherBlues"; + break; + } + ret1 = GGadgetGetTitle(GWidgetGetControl(hist->gw,CID_MainVal)); + ret2 = GGadgetGetTitle(GWidgetGetControl(hist->gw,CID_SecondaryVal)); + hist->done = true; + if ( (*ret1=='\0' || uc_strcmp(ret1,"[]")==0 ) && + (*ret2=='\0' || uc_strcmp(ret2,"[]")==0 ) && p==NULL ) +return; + if ( p==NULL ) { + hist->sf->private = p = gcalloc(1,sizeof(struct psdict)); + p->cnt = 10; + p->keys = gcalloc(10,sizeof(char *)); + p->values = gcalloc(10,sizeof(char *)); + } + PSDictChangeEntry(p,primary,temp=cu_copy(ret1)); free(temp); + PSDictChangeEntry(p,secondary,temp=cu_copy(ret2)); free(temp); +} + +static int hist_e_h(GWindow gw, GEvent *event) { + struct hist_dlg *hist = GDrawGetUserData(gw); + int temp; + const unichar_t *ret; + unichar_t *end; + + if ( event->type==et_close ) { + hist->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("histogram.html"); +return( true ); + } +return( false ); + } else if ( event->type==et_resize ) { + HistResize(hist); + } else if ( event->type==et_expose ) { + HistExpose(gw,hist); + } else if ( event->type==et_mousemove ) { + GGadgetEndPopup(); + HistPopup(hist,event); + } else if ( event->type==et_mousedown ) { + GGadgetEndPopup(); + HistPress(hist,event); + } else if ( event->type==et_controlevent ) { + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + HistScroll(hist,&event->u.control.u.sb); + break; + case et_textchanged: + switch( GGadgetGetCid(event->u.control.g)) { + case CID_SumAround: case CID_BarWidth: + ret = _GGadgetGetTitle(event->u.control.g); + temp = u_strtol(ret,&end,10); + if ( temp<0 || *end ) + break; + if ( GGadgetGetCid(event->u.control.g)==CID_SumAround ) { + hist->sum_around = temp; + HistFindMax(hist->h,temp); + } else if ( temp==0 ) + break; + else { + hist->barwidth = temp; + HistRefigureSB(hist); + } + GDrawRequestExpose(gw,NULL,false); + break; + } + break; + case et_buttonactivate: + if ( GGadgetGetCid(event->u.control.g)==CID_OK ) { + HistSet(hist); + } else + hist->done = true; + break; + } + } +return( true ); +} + +static void CheckSmallSelection(uint8 *selected,SplineFont *sf) { + int i, cnt, tot; + + for ( i=cnt=tot=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL ) { + ++tot; + if ( selected[i] ) + ++cnt; + } + if ( (cnt==1 && tot>1) || (cnt<8 && tot>30) ) + GWidgetPostNoticeR(_STR_TinySelection,_STR_TinySelectionFull); +} + +void SFHistogram(SplineFont *sf,struct psdict *private, uint8 *selected, + enum hist_type which) { + struct hist_dlg hist; + GWindow gw; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[14]; + GTextInfo label[14]; + int i,j; + char binsize[20], barwidth[20], *primary, *secondary; + FontRequest rq; + int as, ds, ld; + static unichar_t helv[] = { 'h', 'e', 'l', 'v', 'e', 't', 'i', 'c', 'a',',','c','a','l','i','b','a','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + static unichar_t n9999[] = { '9', '9', '9', '9', 0 }; + + memset(&hist,0,sizeof(hist)); + hist.sf = sf; + hist.private = private; + if ( private==NULL ) private = sf->private; + hist.selected = selected; + hist.which = which; + hist.barwidth = 6; + hist.sum_around = 0; + switch ( which ) { + case hist_hstem: + hist.h = HistFindHStemWidths(sf,selected); + break; + case hist_vstem: + hist.h = HistFindVStemWidths(sf,selected); + break; + case hist_blues: + hist.h = HistFindBlues(sf,selected); + break; + } + HistFindMax(hist.h,hist.sum_around); + + if ( selected!=NULL ) + CheckSmallSelection(selected,sf); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<values[j]; + label[i].text_is_1byte = true; + gcd[i].gd.label = &label[i]; + } + gcd[i].gd.pos.x = 64; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-4; + gcd[i].gd.pos.width = 140; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.cid = CID_MainVal; + gcd[i++].creator = GTextFieldCreate; + + label[i].text_is_1byte = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+28; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.cid = CID_SecondaryValL; + gcd[i++].creator = GLabelCreate; + + if ( private!=NULL && (j=PSDictFindEntry(private,secondary))!=-1 ) { + label[i].text = (unichar_t *) private->values[j]; + label[i].text_is_1byte = true; + gcd[i].gd.label = &label[i]; + } + gcd[i].gd.pos.x = 64; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y-4; + gcd[i].gd.pos.width = 140; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.cid = CID_SecondaryVal; + gcd[i++].creator = GTextFieldCreate; + + gcd[i].gd.pos.x = 15-3; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+26; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_OK; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -15; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.mnemonic = 'C'; + gcd[i].gd.cid = CID_Cancel; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2; + gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[i].gd.cid = CID_Group; + gcd[i++].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + + hist.hoff = hist.h->low; + HistRefigureSB(&hist); + + GDrawSetVisible(gw,true); + while ( !hist.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + + HistDataFree(hist.h); +} diff --git a/fontforge/ikarus.c b/fontforge/ikarus.c new file mode 100644 index 00000000..0d537bff --- /dev/null +++ b/fontforge/ikarus.c @@ -0,0 +1,709 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +/* Ikarus formats defined in Peter Karow's book "Digital formats for typefaces" */ +/* URW Verlag, Hamburg, 1987. The IK format defined in Appendices G&I */ +/* Possibly available from URW++ http://www.urwpp.de/english/home.html */ + +static int urwtable[2000]; +static int urw_inited; + +static void InitURWTable(void) { + int i; + + if ( urw_inited ) +return; + memset(urwtable,-1,sizeof(urwtable)); + for ( i=0; i<26; ++i ) { + urwtable[i+101] = 'A'+i; + urwtable[i+301] = 'a'+i; + } + urwtable[127] = 0xc6; + urwtable[128] = 0x152; + urwtable[129] = 0xd8; + urwtable[200] = 0x132; + urwtable[201] = 0xc4; + urwtable[202] = 0xc1; + urwtable[203] = 0xc0; + urwtable[204] = 0xc2; + urwtable[205] = 0x1cd; + urwtable[206] = 0x102; + urwtable[207] = 0xc3; + urwtable[208] = 0xc5; + urwtable[209] = 0x104; + urwtable[210] = 0xc7; + urwtable[211] = 0x106; + urwtable[212] = 0x10c; + urwtable[213] = 0x10a; + urwtable[214] = 0x10e; + urwtable[215] = 0x110; + urwtable[216] = 0xcb; + urwtable[217] = 0xc9; + urwtable[218] = 0xc8; + urwtable[219] = 0xca; + urwtable[220] = 0x11a; + urwtable[221] = 0x116; + urwtable[222] = 0x118; + urwtable[223] = 0x1e6; + urwtable[224] = 0x11e; + urwtable[225] = 0x120; + urwtable[226] = 0xcf; + urwtable[227] = 0xcd; + urwtable[228] = 0xcc; + urwtable[229] = 0xce; + urwtable[230] = 0x130; + urwtable[231] = 0x139; + urwtable[233] = 0x141; + urwtable[234] = 0x143; + urwtable[235] = 0x147; + urwtable[236] = 0xd1; + urwtable[237] = 0xd6; + urwtable[238] = 0xd3; + urwtable[239] = 0xd2; + urwtable[240] = 0xd4; + urwtable[241] = 0xd5; + urwtable[242] = 0x150; + urwtable[243] = 0x154; + urwtable[244] = 0x15a; + urwtable[246] = 0x160; + urwtable[248] = 0x15e; + urwtable[249] = 0x164; + urwtable[251] = 0xdc; + urwtable[252] = 0xda; + urwtable[253] = 0xd9; + urwtable[254] = 0xdb; + urwtable[255] = 0xdc; + urwtable[256] = 0x170; + urwtable[257] = 0xdd; + urwtable[258] = 0x179; + urwtable[259] = 0x17d; + urwtable[260] = 0x17b; + urwtable[261] = 0xde; + urwtable[262] = 0x100; + urwtable[264] = 0x108; + urwtable[265] = 0x174; + urwtable[266] = 0x1e84; + urwtable[267] = 0x176; + urwtable[268] = 0x178; + urwtable[269] = 0x126; + urwtable[272] = 0x112; + urwtable[273] = 0x11c; + urwtable[274] = 0x124; + urwtable[276] = 0x12e; + urwtable[283] = 0x14c; + urwtable[286] = 0x15c; + urwtable[289] = 0x1d3; + urwtable[290] = 0x16a; + urwtable[291] = 0x172; + urwtable[296] = 0x114; + urwtable[297] = 0x1e1e; + urwtable[298] = 0x1f4; + urwtable[327] = 0xe6; + urwtable[328] = 0x153; + urwtable[329] = 0xf8; + urwtable[330] = 0xdf; + urwtable[331] = 0x131; + urwtable[332] = 0xf6be; + urwtable[333] = 0x133; + urwtable[336] = 0xfb00; + urwtable[337] = 0xfb01; + urwtable[338] = 0xfb02; + /* 339 is ft lig */ + /* 340 is fff lig */ + urwtable[341] = 0xfb03; + urwtable[342] = 0xfb04; + /* 343 is fft lig */ + urwtable[401] = 0xe4; + urwtable[402] = 0xe1; + urwtable[402] = 0xe0; + urwtable[404] = 0xe2; + urwtable[405] = 0x1ce; + urwtable[406] = 0x103; + urwtable[407] = 0xe3; + urwtable[408] = 0xe5; + urwtable[409] = 0x105; + urwtable[410] = 0x107; + urwtable[411] = 0x10d; + urwtable[412] = 0x10b; + urwtable[413] = 0xe7; + urwtable[415] = 0x111; + urwtable[416] = 0xeb; + urwtable[417] = 0xe9; + urwtable[418] = 0xe8; + urwtable[419] = 0xea; + urwtable[420] = 0x119; + urwtable[421] = 0x117; + urwtable[423] = 0x1e7; + urwtable[424] = 0x11f; + urwtable[425] = 0x121; + urwtable[426] = 0xef; + urwtable[427] = 0xed; + urwtable[428] = 0xec; + urwtable[429] = 0xee; + urwtable[432] = 0x142; + urwtable[433] = 0x144; + urwtable[434] = 0x148; + urwtable[435] = 0xf1; + urwtable[436] = 0xf6; + urwtable[437] = 0xf3; + urwtable[438] = 0xf2; + urwtable[439] = 0xf4; + urwtable[440] = 0xf5; + urwtable[441] = 0x151; + urwtable[444] = 0x15b; + urwtable[445] = 0x15d; + urwtable[446] = 0x161; + urwtable[449] = 0xfc; + urwtable[450] = 0xfa; + urwtable[451] = 0xf9; + urwtable[452] = 0xfb; + urwtable[453] = 0x16f; + urwtable[454] = 0x171; + urwtable[455] = 0xfd; + urwtable[456] = 0x17a; + urwtable[457] = 0x17e; + urwtable[458] = 0x17c; + urwtable[459] = 0xf0; + urwtable[460] = 0xfe; + urwtable[461] = 0xff; + urwtable[465] = 0x1e85; + urwtable[462] = 0x127; + urwtable[464] = 0x175; + urwtable[466] = 0x101; + urwtable[467] = 0x177; + urwtable[469] = 0x109; + urwtable[472] = 0x113; + urwtable[473] = 0x11d; + urwtable[480] = 0x1e3f; + urwtable[482] = 0x14d; + urwtable[486] = 0x16b; + urwtable[487] = 0x173; + urwtable[489] = 0x15f; + for ( i=1; i<=9; ++i ) + urwtable[500+i] = '0'+i; + urwtable[510] = '0'; + urwtable[511] = 0xa3; + urwtable[512] = '$'; + urwtable[513] = 0xa2; + urwtable[514] = 0x192; + urwtable[516] = 0xa5; + urwtable[519] = 0x20a4; + urwtable[523] = 0x20a7; + urwtable[524] = 0x20a3; + urwtable[575] = 0xb9; + urwtable[576] = 0xb2; + urwtable[577] = 0xb3; + for ( i=4; i<=9; ++i ) + urwtable[574+i] = 0x2070+i; + urwtable[584] = 0x2070; + for ( i=1; i<=9; ++i ) + urwtable[586+i] = 0x2080+i; + urwtable[596] = 0x2080; + + urwtable[601] = '.'; + urwtable[602] = ':'; + urwtable[606] = 0x2026; + urwtable[607] = ','; + urwtable[608] = ';'; + urwtable[609] = 0x2019; + urwtable[610] = 0x2018; + urwtable[611] = 0x201d; + urwtable[612] = 0x201c; + urwtable[613] = 0x201e; + urwtable[614] = '!'; + urwtable[615] = 0xa1; + urwtable[616] = '?'; + urwtable[617] = 0xbf; + urwtable[618] = 0xbb; + urwtable[619] = 0xab; + urwtable[620] = 0x203a; + urwtable[621] = 0x203a; + urwtable[622] = '/'; + urwtable[623] = 0x2010; + urwtable[624] = 0x2013; + urwtable[625] = 0x2014; + urwtable[626] = '('; + urwtable[627] = ')'; + urwtable[628] = '['; + urwtable[629] = ']'; + urwtable[630] = '&'; + urwtable[631] = 0xa7; + urwtable[632] = 0x2020; + urwtable[633] = 0x2021; + urwtable[634] = '*'; + urwtable[635] = '\''; + urwtable[636] = '"'; + urwtable[637] = '@'; + urwtable[638] = '#'; + urwtable[639] = 0xb0; + urwtable[640] = '+'; + urwtable[641] = '-'; + urwtable[642] = 0xd7; + urwtable[643] = 0xf7; + urwtable[644] = '='; + urwtable[647] = ':'; + urwtable[648] = 0xa9; + urwtable[649] = 0xae; + urwtable[650] = 0x2122; + urwtable[651] = 0xb6; + urwtable[652] = 0xa4; + urwtable[655] = '{'; + urwtable[656] = '}'; + urwtable[657] = 0xaa; + urwtable[658] = 0xba; + urwtable[659] = 0xb1; + urwtable[662] = 0xbd; + urwtable[663] = 0x2153; + urwtable[664] = 0x2154; + urwtable[665] = 0xbc; + urwtable[666] = 0xbe; + urwtable[667] = 0x2155; + for ( i=0; i<=0x215e -0x2155; ++i ) + urwtable[668+i] = 0x215e +i; + urwtable[677] = 0x2044; + urwtable[678] = '%'; + urwtable[679] = 0x2030; + /* 680 and 681 are some sort of varient on % and per mill */ + urwtable[700] = '\\'; + urwtable[701] = 0xa8; + urwtable[702] = 0x2d9; + urwtable[703] = 0x2da; + urwtable[704] = 0x2ca; + urwtable[705] = 0x2cb; + urwtable[706] = 0x2c6; + urwtable[707] = 0x2c7; + urwtable[708] = 0x2d8; + urwtable[709] = 0x2dc; + urwtable[710] = 0x2dd; + urwtable[711] = 0xb8; + urwtable[712] = 0x2db; + urwtable[713] = 0xaf; + urwtable[714] = 0xaf; + /* 751-764 seem to be varients on 701-714 */ + urwtable[765] = 0x323; + urwtable[766] = 0x320; + urwtable[768] = 0x326; + urwtable[769] = 0x313; + /* 795 is a big copyright */ + /* 796 is a big registered */ + urwtable[854] = 0x1ebd3; + urwtable[857] = 0x1f5; + urwtable[863] = 0x12f; + urwtable[866] = 0x140; + urwtable[870] = 0x1e45; + urwtable[873] = 0x1d2; + urwtable[886] = 0x16b; + urwtable[892] = 0x1e8f; + urwtable[897] = 0x1d4; + urwtable[903] = 0x13f; + urwtable[905] = 0x1e44; + urwtable[908] = 0x14e; + urwtable[916] = 0x16c; + urwtable[933] = 0x145; + urwtable[934] = 0x166; + urwtable[935] = 0x146; + urwtable[936] = 0x147; + urwtable[937] = 0x138; + urwtable[939] = 0x168; + urwtable[1003] = 0x2665; + urwtable[1004] = 0x2666; + urwtable[1005] = 0x2663; + urwtable[1006] = 0x2660; + urwtable[1011] = 0x2642; + urwtable[1012] = 0x2640; + urwtable[1016] = 0x2022; + urwtable[1036] = 0x2192; + urwtable[1037] = 0x2190; + urwtable[1038] = 0x2194; + urwtable[1039] = 0x2191; + urwtable[1040] = 0x2193; + urwtable[1041] = 0x2195; + urwtable[1049] = 0x25ca; + /* 1059 is an apple character (which has no unicode equiv) */ + urwtable[1085] = 0x2206; + urwtable[1101] = 0x2260; + urwtable[1103] = 0x2261; + urwtable[1104] = 0x221a; + urwtable[1105] = 0x222b; + urwtable[1108] = 0x223c; + urwtable[1109] = 0x2248; + urwtable[1111] = '<'; + urwtable[1112] = '>'; + urwtable[1113] = 0x2264; + urwtable[1114] = 0x2265; + urwtable[1117] = 0xac; + urwtable[1124] = 0x221e; + urwtable[1133] = 0x220f; + urwtable[1134] = 0x2211; + urwtable[1137] = 0x2202; + urwtable[1151] = '^'; + urwtable[1152] = '_'; + urwtable[1199] = 0x3c0; + urwtable[1337] = '~'; + urwtable[1342] = 0xb5; + urwtable[1376] = '|'; + /* 1405-1408 is another set of +,-,=,divide */ + urwtable[1412] = 0x2126; + + urw_inited = true; +} + +static void IkarusNameFromURWNumber(SplineChar *sc,int number) { + int val; + char buf[20]; + + if ( !urw_inited ) + InitURWTable(); + + free(sc->name); sc->name = NULL; + if ( numberunicodeenc = val = urwtable[number]; + if ( sc->unicodeenc!=-1 ) { + if ( valname = copy(psunicodenames[val]); + else { + sprintf(buf,"uni%04X",val); + sc->name = copy(buf); + } +return; + } + } + if ( number==1059 ) + sc->name = copy("apple"); + else if ( number==795 ) + sc->name = copy("copyright.big"); + else if ( number==796 ) + sc->name = copy("registered.big"); + else { + sprintf(buf, "urw%d", number ); + sc->name = copy(buf); + } +} + +static void IkarusAddContour(SplineChar *sc,int npts,BasePoint *bps, + uint8 *ptype, int nesting) { + SplinePointList *spl; + SplinePoint *last, *next; + int i, cw; + + spl = chunkalloc(sizeof(SplinePointList)); + spl->next = sc->layers[ly_fore].splines; + sc->layers[ly_fore].splines = spl; + spl->first = spl->last = last = SplinePointCreate(bps[0].x,bps[0].y); + last->pointtype = ptype[npts-1]; + last->nextcpdef = last->prevcpdef = true; + for ( i=1; inextcpdef = next->prevcpdef = true; + next->pointtype = ptype[i]; + SplineMake3(last,next); + last = next; + } + SplineMake3(last,spl->last); + last = spl->first; + for ( i=1; inext->to; + } + + cw = SplinePointListIsClockwise(spl); + if ( ((nesting&1) && cw) || (!(nesting&1) && !cw) ) + SplineSetReverse(spl); +} + +static void IkarusReadChar(SplineChar *sc,FILE *file) { + int n, i, j, number, following, units, ncontours, ptmax; + DBounds bb; + int32 base; + struct contour { + int32 offset; + int dir, nest, col, npts; + } *contours; + BasePoint *bps; + uint8 *ptype; + int x,y; + + /* record len of char = */ getushort(file); + /* word len of char = */ getushort(file); + + n = getushort(file); + number = getushort(file); +#if 0 + if ( enc!=sc->enc ) + fprintf( stderr, "The font header said this should be character %d, the character header says it is %d\n", sc->enc, enc ); +#endif + IkarusNameFromURWNumber(sc,number); + following = getushort(file); + if ( following!=0 ) + fprintf( stderr, "This character (%d) has a following part (%d). I'm not sure what that means, please send me (gww@silcom.com) a copy of this font so I can test with it.\n", + sc->enc, following ); + for ( i=3; iwidth = getushort(file); + /* lsb = */ getushort(file); + /* xmax-xmin = */ getushort(file); + /* rsb = */ getushort(file); + bb.minx = (short) getushort(file); + bb.maxx = (short) getushort(file); + bb.miny = (short) getushort(file); + bb.maxy = (short) getushort(file); + for ( i=12 ; iwidth *= units; + + n = getushort(file)*2048; + n += getushort(file); /* Length of contour section in words */ + ncontours = (n-2)/6; + contours = galloc(ncontours*sizeof(struct contour)); + ptmax = 0; + for ( i=0; i ptmax ) + ptmax = contours[i].npts; + } + bps = galloc(ptmax*sizeof(BasePoint)); + ptype = galloc(ptmax*sizeof(uint8)); + + base = ftell(file); + /* 2 words here giving length (in records/words) of image data */ + + for ( i=0; i0 ) + ptype[j] = -1; /* Start point */ + else if ( x<0 /* && y<0 */) + ptype[j] = pt_corner; + else if ( /* x>0 && */ y>0 ) + ptype[j] = pt_curve; + else /* if ( x>0 && y<0 ) */ + ptype[j] = pt_tangent; + if ( x<0 ) x=-x; + if ( y<0 ) y=-y; + x += bb.minx-1; + y += bb.miny-1; + bps[j].x = units*x; bps[j].y = units*y; + } + IkarusAddContour(sc,contours[i].npts,bps,ptype,contours[i].nest); + } + + free(contours); + free(bps); + free(ptype); +} + +static void IkarusFontname(SplineFont *sf,char *fullname,char *fnam) { + char *pt, *tpt; + + for ( pt=fullname; *pt==' '; ++pt ); + if ( *pt=='\0' ) { + /* Often the fontname is blank */ + pt = strchr(fnam,'.'); + if ( pt!=NULL ) *pt='\0'; + for ( pt=fnam; *pt==' '; ++pt ); + if ( *pt!='\0' ) + strcpy(fullname,fnam); + else { + pt = strrchr(sf->origname,'/'); + if ( pt==NULL ) pt = sf->origname-1; + strncpy(fullname,pt,80); + fullname[80] = '\0'; + pt = strchr(fullname,'.'); + if ( pt!=NULL ) *pt = '\0'; + } + } + + free(sf->fullname); + sf->fullname=copy(fullname); + + free(sf->fontname); + sf->fontname=copy(fullname); + for ( pt=tpt=sf->fontname; *pt; ++pt ) { + if ( isalnum(*pt) || *pt=='-' || *pt=='_' || *pt=='$' ) + *tpt++ = *pt; + } + *tpt = '\0'; + + if ( (pt=strstr(fullname,"Regu"))!=NULL || + (pt=strstr(fullname,"Medi"))!=NULL || + (pt=strstr(fullname,"Bold"))!=NULL || + (pt=strstr(fullname,"Demi"))!=NULL || + (pt=strstr(fullname,"Gras"))!=NULL || + (pt=strstr(fullname,"Fett"))!=NULL || + (pt=strstr(fullname,"Norm"))!=NULL || + (pt=strstr(fullname,"Nord"))!=NULL || + (pt=strstr(fullname,"Heav"))!=NULL || + (pt=strstr(fullname,"Blac"))!=NULL || + (pt=strstr(fullname,"Ligh"))!=NULL || + (pt=strstr(fullname,"Thin"))!=NULL ) { + free(sf->weight); + sf->weight = copyn(pt,4); + *pt='\0'; + } + while ( (pt=strstr(fullname,"Ital"))!=NULL || + (pt=strstr(fullname,"Slanted"))!=NULL || + (pt=strstr(fullname,"Obli"))!=NULL || + (pt=strstr(fullname,"Roma"))!=NULL || + (pt=strstr(fullname,"Cond"))!=NULL || + (pt=strstr(fullname,"Expa"))!=NULL ) { + *pt='\0'; + } + free(sf->familyname); + sf->familyname = copy(fullname); +} + +SplineFont *SFReadIkarus(char *fontname) { + SplineFont *sf; + FILE *file = fopen(fontname,"rb"); + int ch1, ch2, rpos, wpos, i; + int hlen, ilen, jlen, llen, mlen; + int numchars, maxnum, opt_pt_size; + double italic_angle; + char fnam[13], fullname[81]; + int32 *offsets, *numbers; + + if ( file==NULL ) +return( NULL ); + hlen = getushort(file); /* Length of font header */ + ilen = getushort(file); /* Length of name section */ + getushort(file); /* Number on URW list */ + fread(fnam,1,12,file); /* 6 words of filename */ + fread(fullname,1,80,file); /* 40 words of fontname (human readable) */ + fnam[12] = fullname[80] = '\0'; + ch1 = getc(file); + ch2 = getc(file); + if ( ch1=='i' || ch2=='k' ) + /* Docs don't mention this, but lower case is ok too */; + else if ( ch1!='I' || ch2!='K' ) { + if ( (ch1=='D' && ch2=='I') || (ch1=='V' && ch2=='C') || + (ch1=='V' && ch2=='S') || (ch1=='V' && ch2=='E') || + (ch1=='S' && ch2=='C') || (ch1=='S' && ch2=='N') || + (ch1=='B' && ch2=='I') || (ch1=='G' && isdigit(ch2)) || + (ch1=='d' && ch2=='i') || (ch1=='v' && ch2=='c') || + (ch1=='v' && ch2=='s') || (ch1=='v' && ch2=='e') || + (ch1=='s' && ch2=='c') || (ch1=='s' && ch2=='n') || + (ch1=='b' && ch2=='i') || (ch1=='g' && isdigit(ch2))) + fprintf( stderr, "This is probably a valid URW font, but it is in a format (%c%c) which FontForge\ndoes not support. FontForge only supports 'IK' format fonts.\n", ch1, ch2 ); + else if ( ch1==0 && ch2==0 && ilen==55 ) + fprintf( stderr, "This looks like an ikarus format which I have seen examples of, but for which\nI have no documentation. FontForge does not support it yet.\n" ); + fclose(file); +return( NULL ); + } else if ( ilen<55 || hlen<=ilen ) { + fclose(file); +return( NULL ); + } + if ( ilen!=55 ) + fprintf(stderr, "Unexpected size for name section of URW font (expected 55, got %d)\n", ilen ); + + fseek(file,2*ilen+2,SEEK_SET); + jlen = getushort(file); + if ( jlen<12 || hlen<=jlen+ilen ) { + fclose(file); +return( NULL ); + } + if ( jlen!=12 ) + fprintf(stderr, "Unexpected size for font info section of URW font (expected 12, got %d)\n", ilen ); + if ( getushort(file)!=1 ) { /* 1=> typeface */ + fclose(file); +return( NULL ); + } + numchars = getushort(file); + /* cap height = */ getushort(file); + /* body size = */ getushort(file); + /* x-height = */ getushort(file); + /* descender? = */ getushort(file); + /* line thickness = */ getushort(file); + /* stroke thickness = */ getushort(file); + italic_angle = getushort(file)/10.0 * 3.1415926535897932/180.0; + opt_pt_size = getushort(file); + /* average char width = */ getushort(file); + + fseek(file,2*ilen+2*jlen+2,SEEK_SET); + llen = getushort(file); /* the hierarchy section is unused in font files */ + if ( llen!=1 || hlen<=jlen+ilen+llen ) { + fclose(file); +return( NULL ); + } + + mlen = getushort(file); + /* Peter Karow's book documents that hlen==jlen+ilen+llen+mlen+1, but this*/ + /* does not appear to be the case. */ + if ( hlenmaxnum ) maxnum = numbers[i]; + rpos = getushort(file); /* record pos (1 record=2048 words) */ + wpos = getushort(file); /* word pos in record */ + offsets[i] = (rpos-1)*4096 + 2*(wpos-1); + } + + sf = SplineFontBlank(em_none,numchars/*maxnum+1*/); + IkarusFontname(sf,fullname,fnam); + sf->italicangle = italic_angle; + sf->ascent = 12000; sf->descent = 3000; /* Ikarus fonts live in a 15,000 em world */ + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->width = sf->chars[i]->vwidth = 15000; + + for ( i=0; i +#include +#include +#include +#include + +typedef struct kernclassdlg { + struct kernclasslistdlg *kcld; + KernClass *orig; + int first_cnt, second_cnt; + int16 *offsets; + GWindow gw, cw, kw; + GFont *font; + int fh, as; + int kernh, kernw; /* Width of the box containing the kerning val */ + int xstart, ystart; /* This is where the headers start */ + int xstart2, ystart2; /* This is where the data start */ + int width, height; + int canceldrop, sbdrop; + int offleft, offtop; + GGadget *hsb, *vsb; + int isedit, off; + int st_pos; + BDFChar *fsc, *ssc; + int pixelsize; + int top; + int downpos, down, within, orig_kern; +} KernClassDlg; + +typedef struct kernclasslistdlg { + SplineFont *sf; + KernClassDlg *kcd; + GWindow gw; + int isv; +} KernClassListDlg; + +#define KCL_Width 200 +#define KCL_Height 173 +#define KC_Width 400 +#define KC_Height 400 +#define KC_CANCELDROP 32 + + +#define CID_List 1040 +#define CID_New 1041 +#define CID_Delete 1042 +#define CID_Edit 1043 + +#define CID_SLI 1000 +#define CID_R2L 1001 +#define CID_IgnBase 1002 +#define CID_IgnLig 1003 +#define CID_IgnMark 1004 + +#define CID_ClassList 1007 /* And 1107 for second char */ +#define CID_ClassNew 1008 +#define CID_ClassDel 1009 +#define CID_ClassEdit 1010 +#define CID_ClassLabel 1011 + +#define CID_OK 1012 +#define CID_Cancel 1013 +#define CID_Group 1014 +#define CID_Line1 1015 +#define CID_Line2 1016 + +#define CID_Set 1020 +#define CID_Select 1021 +#define CID_GlyphList 1022 +#define CID_Prev 1023 +#define CID_Next 1024 +#define CID_Group2 1025 + +#define CID_First 1030 +#define CID_Second 1031 +#define CID_KernOffset 1032 +#define CID_Prev2 1033 +#define CID_Next2 1034 +#define CID_Group3 1035 + +extern int _GScrollBar_Width; + +static int KCD_SBReset(KernClassDlg *); +static void KCD_HShow(KernClassDlg *, int pos); +static void KCD_VShow(KernClassDlg *, int pos); + +static GTextInfo **KCSLIArray(SplineFont *sf,int isv) { + int cnt; + KernClass *kc, *head = isv ? sf->vkerns : sf->kerns; + GTextInfo **ti; + + for ( kc=head, cnt=0; kc!=NULL; kc=kc->next, ++cnt ); + ti = gcalloc(cnt+1,sizeof(GTextInfo*)); + for ( kc=head, cnt=0; kc!=NULL; kc=kc->next, ++cnt ) { + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + ti[cnt]->fg = ti[cnt]->bg = COLOR_DEFAULT; + ti[cnt]->text = ScriptLangLine(sf->script_lang[kc->sli]); + } + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); +return( ti ); +} + +static GTextInfo *KCSLIList(SplineFont *sf,int isv) { + int cnt; + KernClass *kc, *head = isv ? sf->vkerns : sf->kerns; + GTextInfo *ti; + + for ( kc=head, cnt=0; kc!=NULL; kc=kc->next, ++cnt ); + ti = gcalloc(cnt+1,sizeof(GTextInfo)); + for ( kc=head, cnt=0; kc!=NULL; kc=kc->next, ++cnt ) + ti[cnt].text = ScriptLangLine(sf->script_lang[kc->sli]); +return( ti ); +} + +/* ************************************************************************** */ +/* **************************** Edit/Add a Class **************************** */ +/* ************************************************************************** */ + +static int KCD_ToSelection(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(kcd->gw,CID_GlyphList)); + SplineFont *sf = kcd->kcld->sf; + FontView *fv = sf->fv; + const unichar_t *end; + int pos, found=-1; + char *nm; + + GDrawSetVisible(fv->gw,true); + GDrawRaise(fv->gw); + memset(fv->selected,0,sf->charcnt); + while ( *ret ) { + end = u_strchr(ret,' '); + if ( end==NULL ) end = ret+u_strlen(ret); + nm = cu_copybetween(ret,end); + for ( ret = end; isspace(*ret); ++ret); + if (( pos = SFFindChar(sf,-1,nm))!=-1 ) { + if ( found==-1 ) found = pos; + fv->selected[pos] = true; + } + free(nm); + } + + if ( found!=-1 ) + FVScrollToChar(fv,found); + GDrawRequestExpose(fv->v,NULL,false); + } +return( true ); +} + +static int KCD_FromSelection(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + SplineFont *sf = kcd->kcld->sf; + FontView *fv = sf->fv; + unichar_t *vals, *pt; + int i, len, max; + SplineChar *sc; + + for ( i=len=max=0; icharcnt; ++i ) if ( fv->selected[i]) { + sc = SFMakeChar(sf,i); + len += strlen(sc->name)+1; + if ( fv->selected[i]>max ) max = fv->selected[i]; + } + pt = vals = galloc((len+1)*sizeof(unichar_t)); + *pt = '\0'; + /* in a class the order of selection is irrelevant */ + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] ) { + uc_strcpy(pt,sf->chars[i]->name); + pt += u_strlen(pt); + *pt++ = ' '; + } + if ( pt>vals ) pt[-1]='\0'; + + GGadgetSetTitle(GWidgetGetControl(kcd->gw,CID_GlyphList),vals); + } +return( true ); +} + +static int KCD_Prev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + GDrawSetVisible(kcd->cw,false); + } +return( true ); +} + +static int KCD_Next(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(kcd->gw,CID_GlyphList)); + GGadget *list = GWidgetGetControl( kcd->gw, CID_ClassList+kcd->off ); + int i; + + if ( !CCD_NameListCheck(kcd->kcld->sf,ret,true,_STR_BadClass) || + CCD_InvalidClassList(ret,list,kcd->isedit)) +return( true ); + + if ( kcd->isedit ) { + GListChangeLine(list,GGadgetGetFirstListSelectedItem(list),ret); + } else { + GListAppendLine(list,ret,false); + if ( kcd->off==0 ) { + kcd->offsets = grealloc(kcd->offsets,(kcd->first_cnt+1)*kcd->second_cnt*sizeof(int16)); + memset(kcd->offsets+kcd->first_cnt*kcd->second_cnt, + 0, kcd->second_cnt*sizeof(int16)); + ++kcd->first_cnt; + } else { + int16 *new = galloc(kcd->first_cnt*(kcd->second_cnt+1)*sizeof(int16)); + for ( i=0; ifirst_cnt; ++i ) { + memcpy(new+i*(kcd->second_cnt+1),kcd->offsets+i*kcd->second_cnt, + kcd->second_cnt*sizeof(int16)); + new[i*(kcd->second_cnt+1)+kcd->second_cnt] = 0; + } + ++kcd->second_cnt; + free( kcd->offsets ); + kcd->offsets = new; + } + KCD_SBReset(kcd); + } + GDrawSetVisible(kcd->cw,false); /* This will give us an expose so we needed ask for one */ + } +return( true ); +} + +static void _KCD_DoEditNew(KernClassDlg *kcd,int isedit,int off) { + static unichar_t nullstr[] = { 0 }; + + kcd->isedit = isedit; + kcd->off = off; + if ( isedit ) { + GTextInfo *selected = GGadgetGetListItemSelected(GWidgetGetControl( + kcd->gw, CID_ClassList+off)); + if ( selected==NULL ) +return; + GGadgetSetTitle(GWidgetGetControl(kcd->cw,CID_GlyphList),selected->text); + } else { + GGadgetSetTitle(GWidgetGetControl(kcd->cw,CID_GlyphList),nullstr); + } + GDrawSetVisible(kcd->cw,true); +} + +/* ************************************************************************** */ +/* ************************** Kern Class Display **************************** */ +/* ************************************************************************** */ + +static int KCD_Prev2(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + BDFCharFree(kcd->fsc); BDFCharFree(kcd->ssc); + kcd->fsc = kcd->ssc = NULL; + GDrawSetVisible(kcd->kw,false); + } +return( true ); +} + +static int KCD_Next2(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(kcd->gw,CID_KernOffset)); + unichar_t *end; + int val = u_strtol(ret,&end,10); + + if ( val<-32768 || val>32767 || *end!='\0' ) { + GWidgetErrorR( _STR_BadNumber, _STR_BadNumber ); +return( true ); + } + kcd->offsets[kcd->st_pos] = val; + + BDFCharFree(kcd->fsc); BDFCharFree(kcd->ssc); + kcd->fsc = kcd->ssc = NULL; + GDrawSetVisible(kcd->kw,false); /* This will give us an expose so we needed ask for one */ + } +return( true ); +} + +static void KCD_DrawGlyph(GWindow pixmap,int x,int baseline,BDFChar *bdfc) { + struct _GImage base; + GImage gi; + GClut clut; + + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + memset(&clut,'\0',sizeof(clut)); + gi.u.image = &base; + base.clut = &clut; + if ( !bdfc->byte_data ) { + base.image_type = it_mono; + clut.clut_len = 2; + clut.clut[0] = GDrawGetDefaultBackground(NULL); + clut.clut[1] = 0x808080; + } else { + int scale = 4, l; + Color fg, bg; + base.image_type = it_index; + clut.clut_len = 1<bitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = bdfc->xmax-bdfc->xmin+1; + base.height = bdfc->ymax-bdfc->ymin+1; + GDrawDrawImage(pixmap,&gi,NULL,x,baseline-bdfc->ymax); +} + +static void KCD_KernMouse(KernClassDlg *kcd,GEvent *event) { + int x, y, width; + char buf[20]; + unichar_t ubuf[20]; + int kern, pkern; + double scale; + + scale = kcd->pixelsize/(double) (kcd->kcld->sf->ascent+kcd->kcld->sf->descent); + kern = u_strtol(_GGadgetGetTitle(GWidgetGetControl(kcd->kw,CID_KernOffset)),NULL,10); + pkern = rint( kern*scale ); + + if ( !kcd->kcld->isv ) { + /* Horizontal */ + width = (kcd->fsc!=NULL?kcd->fsc->width:0)+(kcd->ssc!=NULL?kcd->ssc->width:0)+pkern + 20; + x = (kcd->width - width)/2; + + if ( GGadgetIsChecked(GWidgetGetControl(kcd->gw,CID_R2L)) ) { + if ( kcd->ssc!=NULL ) + width -= kcd->ssc->width; + } else { + if ( kcd->fsc!=NULL ) { + x += kcd->fsc->width + pkern; + width -= kcd->fsc->width + pkern; + } + } + + if ( event->u.mouse.ytop || event->u.mouse.y>kcd->top+2*kcd->pixelsize || + event->u.mouse.xu.mouse.x>x+width ) { + if ( event->type == et_mousedown ) +return; + if ( kcd->within ) { + GDrawSetCursor(kcd->kw,ct_pointer); + if ( kcd->down && kcd->orig_kern!=kern ) { + sprintf(buf, "%d", kcd->orig_kern); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(kcd->kw,CID_KernOffset),ubuf); + GDrawRequestExpose(kcd->kw,NULL,false); + } + kcd->within = false; + } + if ( event->type==et_mouseup ) + kcd->down = false; +return; + } + + if ( !kcd->within ) { + GDrawSetCursor(kcd->kw,ct_leftright); + kcd->within = true; + } + if ( event->type == et_mousedown ) { + kcd->orig_kern = kern; + kcd->down = true; + kcd->downpos = event->u.mouse.x; + } else if ( kcd->down ) { + /* I multiply by 2 here because I center the glyphs, so the kerning */ + /* changes in both directions */ + int nkern = kcd->orig_kern + rint(2*(event->u.mouse.x-kcd->downpos)/scale); + if ( kern!=nkern ) { + sprintf(buf, "%d", nkern); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(kcd->kw,CID_KernOffset),ubuf); + GDrawRequestExpose(kcd->kw,NULL,false); + } + if ( event->type==et_mouseup ) + kcd->down = false; + } + } else { + /* Vertical */ + y = kcd->top + kcd->pixelsize/3; + width = (kcd->ssc!=NULL ? rint(kcd->ssc->sc->vwidth * scale) : 0); + if ( kcd->fsc!=NULL ) + y += rint(kcd->fsc->sc->vwidth * scale) + pkern; + x = kcd->width/2 - kcd->pixelsize/2; + + if ( event->u.mouse.yu.mouse.y>y+width || + event->u.mouse.xu.mouse.x>x+kcd->pixelsize ) { + if ( event->type == et_mousedown ) +return; + if ( kcd->within ) { + GDrawSetCursor(kcd->kw,ct_pointer); + if ( kcd->down && kcd->orig_kern!=kern ) { + sprintf(buf, "%d", kcd->orig_kern); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(kcd->kw,CID_KernOffset),ubuf); + GDrawRequestExpose(kcd->kw,NULL,false); + } + kcd->within = false; + } + if ( event->type==et_mouseup ) + kcd->down = false; +return; + } + + if ( !kcd->within ) { + GDrawSetCursor(kcd->kw,ct_updown); + kcd->within = true; + } + if ( event->type == et_mousedown ) { + kcd->orig_kern = kern; + kcd->down = true; + kcd->downpos = event->u.mouse.y; + } else if ( kcd->down ) { + int nkern = kcd->orig_kern + rint((event->u.mouse.y-kcd->downpos)/scale); + if ( kern!=nkern ) { + sprintf(buf, "%d", nkern); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(kcd->kw,CID_KernOffset),ubuf); + GDrawRequestExpose(kcd->kw,NULL,false); + } + if ( event->type==et_mouseup ) + kcd->down = false; + } + } +} + +static void KCD_KernExpose(KernClassDlg *kcd,GWindow pixmap,GEvent *event) { + GRect *area = &event->u.expose.rect; + GRect rect; + GRect old1; + int x, y; + SplineFont *sf = kcd->kcld->sf; + int em = sf->ascent+sf->descent; + int as = rint(sf->ascent*kcd->pixelsize/(double) em); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(kcd->gw,CID_KernOffset)); + int kern = u_strtol(ret,NULL,10); + int baseline, xbaseline; + + if ( area->y+area->heighttop ) +return; + if ( area->y>kcd->top+3*kcd->pixelsize || + (!kcd->kcld->isv && area->y>kcd->top+2*kcd->pixelsize )) +return; + + rect.x = 0; rect.y = kcd->top; + rect.width = kcd->width; /* close enough */ + rect.height = kcd->kcld->isv ? 3*kcd->pixelsize : 2*kcd->pixelsize; + GDrawPushClip(pixmap,&rect,&old1); + + kern = rint(kern*kcd->pixelsize/(double) em); + + if ( !kcd->kcld->isv ) { + x = (kcd->width-( (kcd->fsc!=NULL?kcd->fsc->width:0)+(kcd->ssc!=NULL?kcd->ssc->width:0)+kern))/2; + baseline = kcd->top + as + kcd->pixelsize/2; + if ( GGadgetIsChecked(GWidgetGetControl(kcd->gw,CID_R2L)) ) { + if ( kcd->ssc!=NULL ) { + KCD_DrawGlyph(pixmap,x,baseline,kcd->ssc); + x += kcd->ssc->width + kern; + } + if ( kcd->fsc!=NULL ) + KCD_DrawGlyph(pixmap,x,baseline,kcd->fsc); + } else { + if ( kcd->fsc!=NULL ) { + KCD_DrawGlyph(pixmap,x,baseline,kcd->fsc); + x += kcd->fsc->width + kern; + } + if ( kcd->ssc!=NULL ) + KCD_DrawGlyph(pixmap,x,baseline,kcd->ssc); + } + } else { + /* I don't support top to bottom vertical */ + y = kcd->top + kcd->pixelsize/3 + as; + xbaseline = kcd->width/2; + if ( kcd->fsc!=NULL ) { + KCD_DrawGlyph(pixmap,xbaseline-kcd->pixelsize/2,y,kcd->fsc); + y += rint(kcd->fsc->sc->vwidth * kcd->pixelsize/(double) em) + kern; + } + if ( kcd->ssc!=NULL ) + KCD_DrawGlyph(pixmap,xbaseline-kcd->pixelsize/2,y,kcd->ssc); + } + GDrawPopClip(pixmap,&old1); +} + +static int KCD_KernOffChanged(GGadget *g, GEvent *e) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) + GDrawRequestExpose(kcd->kw,NULL,false); +return( true ); +} + +static void KCD_UpdateGlyph(KernClassDlg *kcd,int which) { + GTextInfo *sel = GGadgetGetListItemSelected(GWidgetGetControl(kcd->kw, + which==0 ? CID_First : CID_Second )); + BDFChar **scpos = which==0 ? &kcd->fsc : &kcd->ssc; + SplineChar *sc; + char *temp; + + BDFCharFree(*scpos); + *scpos = NULL; + if ( sel==NULL ) +return; + temp = cu_copy(sel->text); + sc = SFGetCharDup(kcd->kcld->sf,-1,temp); + free(temp); + if ( sc==NULL ) +return; + *scpos = SplineCharAntiAlias(sc,kcd->pixelsize,4); +} + +static int KCD_GlyphSelected(GGadget *g, GEvent *e) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + int which = GGadgetGetCid(g)==CID_Second; + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + KCD_UpdateGlyph(kcd,which); + GDrawRequestExpose(kcd->kw,NULL,false); + } +return( true ); +} + +static GTextInfo **TiNamesFromClass(GGadget *list,int class_index) { + /* Return a list containing all the names in this class */ + unichar_t *upt, *end; + unichar_t *line; + GTextInfo **ti; + int i, k; + + if ( class_index==0 || GGadgetGetListItem(list,class_index)==NULL ) { + i=0; + ti = galloc((i+1)*sizeof(GTextInfo*)); + } else { + line = GGadgetGetListItem(list,class_index)->text; + for ( k=0 ; k<2; ++k ) { + for ( i=0, upt=line; *upt; ) { + while ( *upt==' ' ) ++upt; + if ( *upt=='\0' ) + break; + for ( end = upt; *end!='\0' && *end!=' '; ++end ); + if ( k==1 ) { + ti[i] = gcalloc(1,sizeof(GTextInfo)); + ti[i]->text = u_copyn(upt,end-upt); + ti[i]->bg = ti[i]->fg = COLOR_DEFAULT; + } + ++i; + upt = end; + } + if ( k==0 ) + ti = galloc((i+1)*sizeof(GTextInfo*)); + } + } + if ( i>0 ) + ti[0]->selected = true; + ti[i] = gcalloc(1,sizeof(GTextInfo)); +return( ti ); +} + +static void KCD_EditOffset(KernClassDlg *kcd) { + int first = kcd->st_pos/kcd->second_cnt, second = kcd->st_pos%kcd->second_cnt; + char buf[12]; + unichar_t ubuf[12]; + GTextInfo **ti; + static unichar_t nullstr[] = { 0 }; + + if ( first==0 || second==0 ) + GWidgetPostNoticeR(_STR_ClassZero,_STR_ClassZeroOffsets); + GGadgetSetList(GWidgetGetControl(kcd->kw,CID_First), + ti = TiNamesFromClass(GWidgetGetControl(kcd->gw,CID_ClassList),first),false); + GGadgetSetTitle(GWidgetGetControl(kcd->kw,CID_First), + ti==NULL || ti[0]->text==NULL ? nullstr: ti[0]->text); + GGadgetSetList(GWidgetGetControl(kcd->kw,CID_Second), + ti = TiNamesFromClass(GWidgetGetControl(kcd->gw,CID_ClassList+100),second),false); + GGadgetSetTitle(GWidgetGetControl(kcd->kw,CID_Second), + ti==NULL || ti[0]->text==NULL ? nullstr: ti[0]->text); + KCD_UpdateGlyph(kcd,0); + KCD_UpdateGlyph(kcd,1); + + sprintf( buf, "%d", kcd->offsets[kcd->st_pos]); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(GWidgetGetControl(kcd->gw,CID_KernOffset),ubuf); + + GDrawSetVisible(kcd->kw,true); +} + +/* ************************************************************************** */ +/* *************************** Kern Class Dialog **************************** */ +/* ************************************************************************** */ + +static int KC_Sli(GGadget *g, GEvent *e) { + KernClassDlg *kcd; + int sli; + + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + kcd = GDrawGetUserData(GGadgetGetWindow(g)); + sli = GGadgetGetFirstListSelectedItem(g); + if ( kcd->kcld->sf->script_lang==NULL || + kcd->kcld->sf->script_lang[sli]==NULL ) + ScriptLangList(kcd->kcld->sf,g,kcd->orig!=NULL?kcd->orig->sli:0); + } +return( true ); +} + +static int KC_OK(GGadget *g, GEvent *e) { + static int flag_cid[] = { CID_R2L, CID_IgnBase, CID_IgnLig, CID_IgnMark, 0 }; + static int flag_bits[] = { pst_r2l, pst_ignorebaseglyphs, pst_ignoreligatures, pst_ignorecombiningmarks }; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + KernClassListDlg *kcld = kcd->kcld; + KernClass *kc; + int i; + int sli = GGadgetGetFirstListSelectedItem(GWidgetGetControl(kcd->gw,CID_SLI)); + int32 len; + GTextInfo **ti; + + if ( GDrawIsVisible(kcd->cw)) +return( KCD_Next(g,e)); + else if ( GDrawIsVisible(kcd->kw)) +return( KCD_Next2(g,e)); + + if ( kcd->kcld->sf->script_lang==NULL || sli<0 || + kcd->kcld->sf->script_lang[sli]==NULL ) { + GWidgetErrorR(_STR_SelectAScript,_STR_SelectAScript); +return( true ); + } + if ( kcd->orig==NULL ) { + kc = chunkalloc(sizeof(KernClass)); + if ( kcld->isv ) { + kc->next = kcld->sf->vkerns; + kcld->sf->vkerns = kc; + } else { + kc->next = kcld->sf->kerns; + kcld->sf->kerns = kc; + } + } else { + kc = kcd->orig; + for ( i=1; ifirst_cnt; ++i ) + free( kc->firsts[i]); + for ( i=1; isecond_cnt; ++i ) + free( kc->seconds[i]); + free(kc->firsts); + free(kc->seconds); + free(kc->offsets); + } + kc->first_cnt = kcd->first_cnt; + kc->second_cnt = kcd->second_cnt; + kc->firsts = galloc(kc->first_cnt*sizeof(char *)); + kc->seconds = galloc(kc->second_cnt*sizeof(char *)); + kc->firsts[0] = kc->seconds[0] = NULL; + ti = GGadgetGetList(GWidgetGetControl(kcd->gw,CID_ClassList),&len); + for ( i=1; ifirst_cnt; ++i ) + kc->firsts[i] = cu_copy(ti[i]->text); + ti = GGadgetGetList(GWidgetGetControl(kcd->gw,CID_ClassList+100),&len); + for ( i=1; isecond_cnt; ++i ) + kc->seconds[i] = cu_copy(ti[i]->text); + kc->offsets = kcd->offsets; + kc->sli = sli; + kc->flags = 0; + for ( i=0; flag_cid[i]!=0; ++i ) + if ( GGadgetIsChecked(GWidgetGetControl(kcd->gw,flag_cid[i]))) + kc->flags |= flag_bits[i]; + kcd->kcld->sf->changed = true; + + GDrawDestroyWindow(kcd->gw); + } +return( true ); +} + +static void KC_DoCancel(KernClassDlg *kcd) { + free(kcd->offsets); + GDrawDestroyWindow(kcd->gw); +} + +static int KC_Cancel(GGadget *g, GEvent *e) { + KernClassDlg *kcd; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + kcd = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GDrawIsVisible(kcd->cw)) +return( KCD_Prev(g,e)); + else if ( GDrawIsVisible(kcd->kw)) +return( KCD_Prev2(g,e)); + + KC_DoCancel(kcd); + } +return( true ); +} + +static void _KCD_EnableButtons(KernClassDlg *kcd,int off) { + GGadget *list = GWidgetGetControl(kcd->gw,CID_ClassList+off); + int32 i, len, j; + GTextInfo **ti; + + ti = GGadgetGetList(list,&len); + i = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(kcd->gw,CID_ClassDel+off),i>=1); + for ( j=i+1; jselected ) + break; + GGadgetSetEnabled(GWidgetGetControl(kcd->gw,CID_ClassEdit+off),i>=1 && j==len); +} + +static void OffsetRemoveClasses(KernClassDlg *kcd, GTextInfo **removethese, int off ) { + int16 *new; + int i,j,k, remove_cnt; + int old_cnt = off==0 ? kcd->first_cnt : kcd->second_cnt; + + removethese[0]->selected = false; + for ( remove_cnt=i=0; iselected ) + ++remove_cnt; + if ( remove_cnt==0 ) +return; + + if ( off==0 ) { + new = galloc((kcd->first_cnt-remove_cnt)*kcd->second_cnt*sizeof(int16)); + for ( i=0; isecond_cnt; ++i ) { + for ( j=k=0; jfirst_cnt; ++j ) { + if ( !removethese[j]->selected ) + new[i*(kcd->first_cnt-remove_cnt)+k++] = kcd->offsets[i*kcd->first_cnt+j]; + } + } + kcd->first_cnt -= remove_cnt; + } else { + new = galloc(kcd->first_cnt*(kcd->second_cnt-remove_cnt)*sizeof(int16)); + for ( i=k=0; isecond_cnt; ++i ) { + if ( !removethese[i]->selected ) + memcpy(new+(k++)*kcd->first_cnt,kcd->offsets+i*kcd->first_cnt, + kcd->first_cnt*sizeof(int16)); + } + kcd->second_cnt -= remove_cnt; + } + + free(kcd->offsets); + kcd->offsets = new; +} + +static int KCD_Delete(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_ClassEdit; + GGadget *list = GWidgetGetControl(kcd->gw,CID_ClassList+off); + int32 len; + + OffsetRemoveClasses(kcd,GGadgetGetList(list,&len),off); + GListDelSelected(list); + _KCD_EnableButtons(kcd,off); + KCD_SBReset(kcd); + GDrawRequestExpose(kcd->gw,NULL,false); + } +return( true ); +} + +static int KCD_Edit(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_ClassEdit; + if ( GGadgetGetFirstListSelectedItem(GWidgetGetControl(kcd->gw,CID_ClassList+off))>0 ) + _KCD_DoEditNew(kcd,true,off); + } +return( true ); +} + +static int KCD_New(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_ClassNew; + _KCD_DoEditNew(kcd,false,off); + } +return( true ); +} + +static int KCD_ClassSelected(GGadget *g, GEvent *e) { + KernClassDlg *kcd = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_ClassList; + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + _KCD_EnableButtons(kcd,off); + if ( off==0 ) + KCD_VShow(kcd,GGadgetGetFirstListSelectedItem(g)); + else + KCD_HShow(kcd,GGadgetGetFirstListSelectedItem(g)); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + if ( GGadgetGetFirstListSelectedItem(g)>0 ) + _KCD_DoEditNew(kcd,true,off); + } +return( true ); +} + +static void KCD_Mouse(KernClassDlg *kcd,GEvent *event) { + static unichar_t space[200]; + char buf[30]; + int32 len; + GTextInfo **ti; + int pos = ((event->u.mouse.y-kcd->ystart2)/kcd->kernh + kcd->offtop) * kcd->second_cnt + + (event->u.mouse.x-kcd->xstart2)/kcd->kernw + kcd->offleft; + + GGadgetEndPopup(); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + GGadgetDispatchEvent(kcd->vsb,event); +return; + } + + if ( event->u.mouse.xxstart || event->u.mouse.x>kcd->xstart2+kcd->width || + event->u.mouse.yystart || event->u.mouse.y>kcd->ystart2+kcd->height ) +return; + + if ( event->type==et_mousemove ) { + int c = (event->u.mouse.x - kcd->xstart2)/kcd->kernw + kcd->offleft; + int s = (event->u.mouse.y - kcd->ystart2)/kcd->kernh + kcd->offtop; + space[0] = '\0'; + if ( event->u.mouse.y>=kcd->ystart2 && sfirst_cnt ) { + sprintf( buf, "First Class %d\n", s ); + uc_strcpy(space,buf); + ti = GGadgetGetList(GWidgetGetControl(kcd->gw,CID_ClassList),&len); + len = u_strlen(space); + u_strncpy(space+len,ti[s]->text,(sizeof(space)/sizeof(space[0]))/2-2 - len); + uc_strcat(space,"\n"); + } + if ( event->u.mouse.x>=kcd->xstart2 && csecond_cnt ) { + sprintf( buf, "Second Class %d\n", c ); + uc_strcat(space,buf); + ti = GGadgetGetList(GWidgetGetControl(kcd->gw,CID_ClassList+100),&len); + len = u_strlen(space); + u_strncpy(space+len,ti[c]->text,(sizeof(space)/sizeof(space[0]))-1 - len); + } + if ( space[0]=='\0' ) +return; + if ( space[u_strlen(space)-1]=='\n' ) + space[u_strlen(space)-1]='\0'; + GGadgetPreparePopup(kcd->gw,space); + } else if ( event->u.mouse.xxstart2 || event->u.mouse.yystart2 ) +return; + else if ( event->type==et_mousedown ) + kcd->st_pos = pos; + else if ( event->type==et_mouseup ) { + if ( pos==kcd->st_pos ) + KCD_EditOffset(kcd); + } +} + +static void KCD_Expose(KernClassDlg *kcd,GWindow pixmap,GEvent *event) { + GRect *area = &event->u.expose.rect; + GRect rect; + GRect clip,old1,old2; + int len, off, i, j, x, y; + unichar_t ubuf[8]; + char buf[100]; + + if ( area->y+area->heightystart ) +return; + if ( area->y>kcd->ystart2+kcd->height ) +return; + + GDrawPushClip(pixmap,area,&old1); + GDrawSetFont(pixmap,kcd->font); + GDrawSetLineWidth(pixmap,0); + rect.x = kcd->xstart; rect.y = kcd->ystart; + rect.width = kcd->width+(kcd->xstart2-kcd->xstart); + rect.height = kcd->height+(kcd->ystart2-kcd->ystart); + clip = rect; + GDrawPushClip(pixmap,&clip,&old2); + for ( i=0 ; kcd->offtop+i<=kcd->first_cnt && (i-1)*kcd->kernhheight; ++i ) { + GDrawDrawLine(pixmap,kcd->xstart,kcd->ystart2+i*kcd->kernh,kcd->xstart+rect.width,kcd->ystart2+i*kcd->kernh, + 0x808080); + if ( i+kcd->offtopfirst_cnt ) { + sprintf( buf, "%d", i+kcd->offtop ); + uc_strcpy(ubuf,buf); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + off = (kcd->kernh-len*kcd->fh)/2; + GDrawDrawText(pixmap,kcd->xstart+(kcd->kernw-len)/2,kcd->ystart2+i*kcd->kernh+kcd->as+1, + ubuf,-1,NULL,0xff0000); + } + } + for ( i=0 ; kcd->offleft+i<=kcd->second_cnt && (i-1)*kcd->kernwwidth; ++i ) { + GDrawDrawLine(pixmap,kcd->xstart2+i*kcd->kernw,kcd->ystart,kcd->xstart2+i*kcd->kernw,kcd->ystart+rect.height, + 0x808080); + if ( i+kcd->offleftsecond_cnt ) { + sprintf( buf, "%d", i+kcd->offleft ); + uc_strcpy(ubuf,buf); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,kcd->xstart2+i*kcd->kernw+(kcd->kernw-len)/2,kcd->ystart+kcd->as+1, + ubuf,-1,NULL,0xff0000); + } + } + + for ( i=0 ; kcd->offtop+ifirst_cnt && (i-1)*kcd->kernhheight; ++i ) { + y = kcd->ystart2+i*kcd->kernh; + if ( y>area->y+area->height ) + break; + if ( y+kcd->kernhy ) + continue; + for ( j=0 ; kcd->offleft+jsecond_cnt && (j-1)*kcd->kernwwidth; ++j ) { + x = kcd->xstart2+j*kcd->kernw; + if ( x>area->x+area->width ) + break; + if ( x+kcd->kernwx ) + continue; + + sprintf( buf, "%d", kcd->offsets[(i+kcd->offtop)*kcd->second_cnt+j+kcd->offleft] ); + uc_strcpy(ubuf,buf); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,x+kcd->kernw-3-len,y+kcd->as+1, + ubuf,-1,NULL,0x000000); + } + } + + GDrawDrawLine(pixmap,kcd->xstart,kcd->ystart2,kcd->xstart+rect.width,kcd->ystart2, + 0x000000); + GDrawDrawLine(pixmap,kcd->xstart2,kcd->ystart,kcd->xstart2,kcd->ystart+rect.height, + 0x000000); + GDrawPopClip(pixmap,&old2); + GDrawPopClip(pixmap,&old1); + GDrawDrawRect(pixmap,&rect,0x000000); + rect.y += rect.height; + rect.x += rect.width; + LogoExpose(pixmap,event,&rect,dm_fore); +} + +static int KCD_SBReset(KernClassDlg *kcd) { + int oldtop = kcd->offtop, oldleft = kcd->offleft; + + GScrollBarSetBounds(kcd->vsb,0,kcd->first_cnt, kcd->height/kcd->kernh); + GScrollBarSetBounds(kcd->hsb,0,kcd->second_cnt, kcd->width/kcd->kernw); + if ( kcd->offtop + (kcd->height/kcd->kernh) >= kcd->first_cnt ) + kcd->offtop = kcd->first_cnt - (kcd->height/kcd->kernh); + if ( kcd->offtop < 0 ) kcd->offtop = 0; + if ( kcd->offleft + (kcd->width/kcd->kernw) >= kcd->second_cnt ) + kcd->offleft = kcd->second_cnt - (kcd->width/kcd->kernw); + if ( kcd->offleft < 0 ) kcd->offleft = 0; + GScrollBarSetPos(kcd->vsb,kcd->offtop); + GScrollBarSetPos(kcd->hsb,kcd->offleft); + +return( oldtop!=kcd->offtop || oldleft!=kcd->offleft ); +} + +static void KCD_HShow(KernClassDlg *kcd, int pos) { + if ( pos<0 || pos>=kcd->second_cnt ) +return; +#if 0 + if ( pos>=kcd->offleft && posoffleft+(kcd->width/kcd->kernw) ) +return; /* Already visible */ +#endif + --pos; /* One line of context */ + if ( pos + (kcd->width/kcd->kernw) >= kcd->second_cnt ) + pos = kcd->second_cnt - (kcd->width/kcd->kernw); + if ( pos < 0 ) pos = 0; + kcd->offleft = pos; + GScrollBarSetPos(kcd->hsb,pos); + GDrawRequestExpose(kcd->gw,NULL,false); +} + +static void KCD_HScroll(KernClassDlg *kcd,struct sbevent *sb) { + int newpos = kcd->offleft; + GRect rect; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + if ( kcd->width/kcd->kernw == 1 ) + --newpos; + else + newpos -= kcd->width/kcd->kernw - 1; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + if ( kcd->width/kcd->kernw == 1 ) + ++newpos; + else + newpos += kcd->width/kcd->kernw - 1; + break; + case et_sb_bottom: + newpos = kcd->second_cnt - (kcd->width/kcd->kernw); + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos + (kcd->width/kcd->kernw) >= kcd->second_cnt ) + newpos = kcd->second_cnt - (kcd->width/kcd->kernw); + if ( newpos < 0 ) newpos = 0; + if ( newpos!=kcd->offleft ) { + int diff = newpos-kcd->offleft; + kcd->offleft = newpos; + GScrollBarSetPos(kcd->hsb,newpos); + rect.x = kcd->xstart2+1; rect.y = kcd->ystart; + rect.width = kcd->width-1; + rect.height = kcd->height+(kcd->ystart2-kcd->ystart); + GDrawScroll(kcd->gw,&rect,-diff*kcd->kernw,0); + } +} + +static void KCD_VShow(KernClassDlg *kcd, int pos) { + if ( pos<0 || pos>=kcd->first_cnt ) +return; +#if 0 + if ( pos>=kcd->offtop && posofftop+(kcd->height/kcd->kernh) ) +return; /* Already visible */ +#endif + --pos; /* One line of context */ + if ( pos + (kcd->height/kcd->kernh) >= kcd->first_cnt ) + pos = kcd->second_cnt - (kcd->height/kcd->kernh); + if ( pos < 0 ) pos = 0; + kcd->offtop = pos; + GScrollBarSetPos(kcd->vsb,pos); + GDrawRequestExpose(kcd->gw,NULL,false); +} + +static void KCD_VScroll(KernClassDlg *kcd,struct sbevent *sb) { + int newpos = kcd->offtop; + GRect rect; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + if ( kcd->height/kcd->kernh == 1 ) + --newpos; + else + newpos -= kcd->height/kcd->kernh - 1; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + if ( kcd->height/kcd->kernh == 1 ) + ++newpos; + else + newpos += kcd->height/kcd->kernh - 1; + break; + case et_sb_bottom: + newpos = kcd->first_cnt - (kcd->height/kcd->kernh); + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos + (kcd->height/kcd->kernh) >= kcd->first_cnt ) + newpos = kcd->first_cnt - (kcd->height/kcd->kernh); + if ( newpos < 0 ) newpos = 0; + if ( newpos!=kcd->offtop ) { + int diff = newpos-kcd->offtop; + kcd->offtop = newpos; + GScrollBarSetPos(kcd->vsb,newpos); + rect.x = kcd->xstart; rect.y = kcd->ystart2+1; + rect.width = kcd->width+(kcd->xstart2-kcd->xstart); + rect.height = kcd->height-1; + GDrawScroll(kcd->gw,&rect,0,diff*kcd->kernh); + } +} + +static int subkern_e_h(GWindow gw, GEvent *event) { + KernClassDlg *kcd = GDrawGetUserData(gw); + + switch ( event->type ) { + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("metricsview.html#kernclass"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + KC_DoCancel(kcd); + else + MenuExit(NULL,NULL,NULL); +return( true ); + } +return( false ); + case et_mouseup: case et_mousedown: case et_mousemove: + KCD_KernMouse(kcd,event); + break; + case et_expose: + KCD_KernExpose(kcd,gw,event); + break; + } +return( true ); +} + +static int subkcd_e_h(GWindow gw, GEvent *event) { + KernClassDlg *kcd = GDrawGetUserData(gw); + + switch ( event->type ) { + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("metricsview.html#kernclass"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + KC_DoCancel(kcd); + else + MenuExit(NULL,NULL,NULL); +return( true ); + } +return( false ); + } +return( true ); +} + +static int kcd_e_h(GWindow gw, GEvent *event) { + KernClassDlg *kcd = GDrawGetUserData(gw); + + switch ( event->type ) { + case et_close: + KC_DoCancel(kcd); + break; + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("metricsview.html#kernclass"); +return( true ); + } +return( false ); + break; + case et_destroy: + kcd->kcld->kcd = NULL; + GGadgetSetList(GWidgetGetControl(kcd->kcld->gw,CID_List), + KCSLIArray(kcd->kcld->sf,kcd->kcld->isv),false); + GGadgetSetEnabled(GWidgetGetControl(kcd->kcld->gw,CID_New),true); + free(kcd); + break; + case et_mouseup: case et_mousemove: case et_mousedown: + KCD_Mouse(kcd,event); + break; + case et_expose: + KCD_Expose(kcd,gw,event); + break; + case et_resize: { + GRect wsize, csize; + int subwidth, offset; + static int moveme[] = { CID_ClassList+100, CID_ClassNew+100, + CID_ClassDel+100, CID_ClassEdit+100, CID_ClassLabel+100, 0}; + int i; + + GDrawGetSize(kcd->gw,&wsize); + GDrawResize(kcd->cw,wsize.width,wsize.height); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_Group),wsize.width-4,wsize.height-4); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_Group2),wsize.width-4,wsize.height-4); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_Group3),wsize.width-4,wsize.height-4); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_Line2),wsize.width-20,3); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_Line1),wsize.width-20,3); + + GGadgetGetSize(GWidgetGetControl(kcd->gw,CID_OK),&csize); + GGadgetMove(GWidgetGetControl(kcd->gw,CID_OK),15,wsize.height-kcd->canceldrop-3); + GGadgetMove(GWidgetGetControl(kcd->gw,CID_Prev),15,wsize.height-kcd->canceldrop); + GGadgetMove(GWidgetGetControl(kcd->gw,CID_Prev2),15,wsize.height-kcd->canceldrop); + GGadgetGetSize(GWidgetGetControl(kcd->gw,CID_Cancel),&csize); + GGadgetMove(GWidgetGetControl(kcd->gw,CID_Cancel),wsize.width-csize.width-15,wsize.height-kcd->canceldrop); + GGadgetMove(GWidgetGetControl(kcd->gw,CID_Next),wsize.width-csize.width-15,wsize.height-kcd->canceldrop); + GGadgetMove(GWidgetGetControl(kcd->gw,CID_Next2),wsize.width-csize.width-15,wsize.height-kcd->canceldrop); + + subwidth = (wsize.width-GDrawPointsToPixels(NULL,20))/2; + GGadgetGetSize(GWidgetGetControl(kcd->gw,CID_ClassList),&csize); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_ClassList),subwidth,csize.height); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_ClassList+100),subwidth,csize.height); + offset = subwidth - csize.width; + for ( i=0; moveme[i]!=0; ++i ) { + GGadgetGetSize(GWidgetGetControl(kcd->gw,moveme[i]),&csize); + GGadgetMove(GWidgetGetControl(kcd->gw,moveme[i]),csize.x+offset,csize.y); + } + + GGadgetGetSize(kcd->hsb,&csize); + kcd->width = wsize.width-csize.height-kcd->xstart2-5; + GGadgetResize(kcd->hsb,kcd->width,csize.height); + GGadgetMove(kcd->hsb,kcd->xstart2,wsize.height-kcd->sbdrop-csize.height); + GGadgetGetSize(kcd->vsb,&csize); + kcd->height = wsize.height-kcd->sbdrop-kcd->ystart2-csize.width; + GGadgetResize(kcd->vsb,csize.width,wsize.height-kcd->sbdrop-kcd->ystart2-csize.width); + GGadgetMove(kcd->vsb,wsize.width-csize.width-5,kcd->ystart2); + KCD_SBReset(kcd); + GDrawRequestExpose(kcd->gw,NULL,false); + + GGadgetGetSize(GWidgetGetControl(kcd->cw,CID_GlyphList),&csize); + GGadgetResize(GWidgetGetControl(kcd->gw,CID_GlyphList),wsize.width-20,csize.height); + } break; + case et_controlevent: + switch( event->u.control.subtype ) { + case et_scrollbarchange: + if ( event->u.control.g == kcd->hsb ) + KCD_HScroll(kcd,&event->u.control.u.sb); + else + KCD_VScroll(kcd,&event->u.control.u.sb); + break; + } + break; + } +return( true ); +} + +static int AddClassList(GGadgetCreateData *gcd, GTextInfo *label, int k, int off, + int x, int y, int width ) { + int blen = GIntGetResource(_NUM_Buttonsize); + int space = 10; + + label[k].text = (unichar_t *) (x<20?_STR_FirstChar:_STR_SecondChar); + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = x+10; gcd[k].gd.pos.y = y; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.cid = CID_ClassLabel+off; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = x; gcd[k].gd.pos.y = y+13; + gcd[k].gd.pos.width = width; + gcd[k].gd.pos.height = 8*12+10; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_list_multiplesel; + gcd[k].gd.handle_controlevent = KCD_ClassSelected; + gcd[k].gd.cid = CID_ClassList+off; + gcd[k++].creator = GListCreate; + + label[k].text = (unichar_t *) _STR_NewDDD; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+gcd[k-1].gd.pos.height+10; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = KCD_New; + gcd[k].gd.cid = CID_ClassNew+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_EditDDD; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = KCD_Edit; + gcd[k].gd.cid = CID_ClassEdit+off; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Delete; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = KCD_Delete; + gcd[k].gd.cid = CID_ClassDel+off; + gcd[k++].creator = GButtonCreate; +return( k ); +} + +static void KernClassD(KernClassListDlg *kcld,KernClass *kc) { + GRect pos, subpos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[30]; + GTextInfo label[30]; + KernClassDlg *kcd; + int i,j, kc_width, vi, y, k; + static unichar_t courier[] = { 'c', 'o', 'u', 'r', 'i', 'e', 'r', ',', 'm','o','n','o','s','p','a','c','e',',','c','l','e','a','r','l','y','u',',', 'u','n','i','f','o','n','t', '\0' }; + int as, ds, ld, sbsize; + FontRequest rq; + static unichar_t kernw[] = { '-', '1', '2', '3', '4', '5', 0 }; + GWindow gw; + + if ( kcld->kcd!=NULL ) { + GDrawSetVisible(kcld->kcd->gw,true); + GDrawRaise(kcld->kcd->gw); +return; + } + kcd = gcalloc(1,sizeof(KernClassDlg)); + kcd->kcld = kcld; + kcld->kcd = kcd; + kcd->orig = kc; + kcd->pixelsize = 150; + if ( kc==NULL ) { + kcd->first_cnt = kcd->second_cnt = 1; + kcd->offsets = gcalloc(1,sizeof(int16)); + } else { + kcd->first_cnt = kc->first_cnt; + kcd->second_cnt = kc->second_cnt; + kcd->offsets = galloc(kc->first_cnt*kc->second_cnt*sizeof(int16)); + memcpy(kcd->offsets,kc->offsets,kc->first_cnt*kc->second_cnt*sizeof(int16)); + } + + memset(&wattrs,0,sizeof(wattrs)); + memset(&gcd,0,sizeof(gcd)); + memset(&label,0,sizeof(label)); + + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<gw = gw = GDrawCreateTopWindow(NULL,&pos,kcd_e_h,kcd,&wattrs); + + kc_width = GDrawPixelsToPoints(NULL,pos.width*100/GGadgetScale(100)); + + i = 0; + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = 5; + gcd[i].gd.pos.width = kc_width-20; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i].gd.u.list = SFLangList(kcld->sf,true,(SplineChar *) -1); + if ( kc!=NULL ) { + for ( j=0; gcd[i].gd.u.list[j].text!=NULL; ++j ) + gcd[i].gd.u.list[j].selected = false; + gcd[i].gd.u.list[kc->sli].selected = true; + } + gcd[i].gd.cid = CID_SLI; + gcd[i].gd.handle_controlevent = KC_Sli; + gcd[i++].creator = GListButtonCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+28; + gcd[i].gd.flags = gg_visible | gg_enabled | (kc!=NULL && (kc->flags&pst_r2l)?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_RightToLeft; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_R2L; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_visible | gg_enabled | (kc!=NULL && (kc->flags&pst_ignorebaseglyphs)?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_IgnoreBaseGlyphs; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_IgnBase; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_visible | gg_enabled | (kc!=NULL && (kc->flags&pst_ignoreligatures)?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_IgnoreLigatures; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_IgnLig; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+15; + gcd[i].gd.flags = gg_visible | gg_enabled | (kc!=NULL && (kc->flags&pst_ignorecombiningmarks)?gg_cb_on:0); + label[i].text = (unichar_t *) _STR_IgnoreCombiningMarks; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_IgnMark; + gcd[i++].creator = GCheckBoxCreate; + + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = GDrawPointsToPixels(gw,gcd[i-1].gd.pos.y+17); + gcd[i].gd.pos.width = pos.width-20; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[i].gd.cid = CID_Line1; + gcd[i++].creator = GLineCreate; + + y = gcd[i-2].gd.pos.y+23; + i = AddClassList(gcd,label,i,0,5,y,(kc_width-20)/2); + i = AddClassList(gcd,label,i,100,(kc_width-20)/2+10,y,(kc_width-20)/2); + + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = GDrawPointsToPixels(gw,gcd[i-3].gd.pos.y+27); + gcd[i].gd.pos.width = pos.width-20; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[i].gd.cid = CID_Line2; + gcd[i++].creator = GLineCreate; + + kcd->canceldrop = GDrawPointsToPixels(gw,KC_CANCELDROP); + kcd->sbdrop = kcd->canceldrop+GDrawPointsToPixels(gw,7); + + vi = i; + gcd[i].gd.pos.width = sbsize = GDrawPointsToPixels(gw,_GScrollBar_Width); + gcd[i].gd.pos.x = pos.width-sbsize; + gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+8; + gcd[i].gd.pos.height = pos.height-gcd[i].gd.pos.y-sbsize-kcd->sbdrop; + gcd[i].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + gcd[i++].creator = GScrollBarCreate; + kcd->height = gcd[i-1].gd.pos.height; + kcd->ystart = gcd[i-1].gd.pos.y; + + gcd[i].gd.pos.height = sbsize; + gcd[i].gd.pos.y = pos.height-sbsize-8; + gcd[i].gd.pos.x = 4; + gcd[i].gd.pos.width = pos.width-sbsize; + gcd[i].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gcd[i++].creator = GScrollBarCreate; + kcd->width = gcd[i-1].gd.pos.width; + kcd->xstart = 5; + + gcd[i].gd.pos.x = 10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+24+3; + gcd[i].gd.pos.width = -1; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.handle_controlevent = KC_OK; + gcd[i].gd.cid = CID_OK; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -10; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.handle_controlevent = KC_Cancel; + gcd[i].gd.cid = CID_Cancel; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2; + gcd[i].gd.pos.width = pos.width-4; + gcd[i].gd.pos.height = pos.height-4; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[i].gd.cid = CID_Group; + gcd[i++].creator = GGroupCreate; + + memset(&rq,'\0',sizeof(rq)); + rq.point_size = 12; + rq.weight = 400; + rq.family_name = courier; + kcd->font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawFontMetrics(kcd->font,&as,&ds,&ld); + kcd->fh = as+ds; kcd->as = as; + GDrawSetFont(gw,kcd->font); + + kcd->kernh = kcd->fh+3; + kcd->kernw = GDrawGetTextWidth(gw,kernw,-1,NULL)+3; + kcd->xstart2 = kcd->xstart+kcd->kernw; + kcd->ystart2 = kcd->ystart+kcd->fh+1; + + GGadgetsCreate(kcd->gw,gcd); + kcd->vsb = gcd[vi].ret; + kcd->hsb = gcd[vi+1].ret; + + for ( i=0; i<2; ++i ) { + GGadget *list = GWidgetGetControl(kcd->gw,CID_ClassList+i*100); + GListAppendLine(list,GStringGetResource(_STR_EverythingElse,NULL),false); + if ( kcd->orig!=NULL ) { + for ( k=1; k<(&kcd->first_cnt)[i]; ++k ) { + unichar_t *temp = uc_copy((&kcd->orig->firsts)[i][k]); + GListAppendLine(list,temp,false); + free(temp); + } + } + } + + wattrs.mask = wam_events; + subpos = pos; subpos.x = subpos.y = 0; + kcd->cw = GWidgetCreateSubWindow(kcd->gw,&subpos,subkcd_e_h,kcd,&wattrs); + + memset(gcd,0,sizeof(gcd)); + memset(label,0,sizeof(label)); + k = 0; + + label[k].text = (unichar_t *) _STR_Set; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 5; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SetGlyphsFromSelectionPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = KCD_FromSelection; + gcd[k].gd.cid = CID_Set; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Select_nom; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 70; gcd[k].gd.pos.y = 5; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SelectFromGlyphsPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = KCD_ToSelection; + gcd[k].gd.cid = CID_Select; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 30; + gcd[k].gd.pos.width = KC_Width-25; gcd[k].gd.pos.height = 8*13+4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + gcd[k].gd.cid = CID_GlyphList; + gcd[k++].creator = GTextAreaCreate; + + label[k].text = (unichar_t *) _STR_PrevArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 30; gcd[k].gd.pos.y = KC_Height-KC_CANCELDROP; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled /*| gg_but_cancel*/; + gcd[k].gd.handle_controlevent = KCD_Prev; + gcd[k].gd.cid = CID_Prev; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_NextArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = -30+3; gcd[k].gd.pos.y = KC_Height-KC_CANCELDROP; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled /*| gg_but_default*/; + gcd[k].gd.handle_controlevent = KCD_Next; + gcd[k].gd.cid = CID_Next; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 2; gcd[k].gd.pos.y = 2; + gcd[k].gd.pos.width = pos.width-4; + gcd[k].gd.pos.height = pos.height-4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k].gd.cid = CID_Group2; + gcd[k++].creator = GGroupCreate; + + GGadgetsCreate(kcd->cw,gcd); + + + kcd->kw = GWidgetCreateSubWindow(kcd->gw,&subpos,subkern_e_h,kcd,&wattrs); + + memset(gcd,0,sizeof(gcd)); + memset(label,0,sizeof(label)); + k = 0; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 5; + gcd[k].gd.pos.width = 120; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = KCD_GlyphSelected; + gcd[k].gd.cid = CID_First; + gcd[k++].creator = GListButtonCreate; + + gcd[k].gd.pos.x = 130; gcd[k].gd.pos.y = 5; + gcd[k].gd.pos.width = 120; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = KCD_GlyphSelected; + gcd[k].gd.cid = CID_Second; + gcd[k++].creator = GListButtonCreate; + + label[k].text = (unichar_t *) _STR_KernOffset; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 30; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+30; + gcd[k].gd.flags = gg_visible|gg_enabled ; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = 90; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-4; + gcd[k].gd.flags = gg_visible|gg_enabled ; + gcd[k].gd.cid = CID_KernOffset; + gcd[k].gd.handle_controlevent = KCD_KernOffChanged; + gcd[k++].creator = GTextFieldCreate; + + label[k].text = (unichar_t *) _STR_PrevArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 30; gcd[k].gd.pos.y = KC_Height-KC_CANCELDROP; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled /*| gg_but_cancel*/; + gcd[k].gd.handle_controlevent = KCD_Prev2; + gcd[k].gd.cid = CID_Prev2; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_NextArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = -30+3; gcd[k].gd.pos.y = KC_Height-KC_CANCELDROP; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled /*| gg_but_default*/; + gcd[k].gd.handle_controlevent = KCD_Next2; + gcd[k].gd.cid = CID_Next2; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 2; gcd[k].gd.pos.y = 2; + gcd[k].gd.pos.width = pos.width-4; + gcd[k].gd.pos.height = pos.height-4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k].gd.cid = CID_Group3; + gcd[k++].creator = GGroupCreate; + + GGadgetsCreate(kcd->kw,gcd); + kcd->top = GDrawPointsToPixels(kcd->gw,60); + + + GDrawSetVisible(kcd->gw,true); + + GGadgetSetEnabled(GWidgetGetControl(kcld->gw,CID_Delete),false); + GGadgetSetEnabled(GWidgetGetControl(kcld->gw,CID_Edit),false); + GGadgetSetEnabled(GWidgetGetControl(kcld->gw,CID_New),false); +} + +static int KCL_New(GGadget *g, GEvent *e) { + KernClassListDlg *kcld; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + kcld = GDrawGetUserData(GGadgetGetWindow(g)); + if ( kcld->kcd==NULL ) + KernClassD(kcld,NULL); + } +return( true ); +} + +static int KCL_Delete(GGadget *g, GEvent *e) { + int len, i,j; + GTextInfo **old, **new; + GGadget *list; + KernClassListDlg *kcld; + KernClass *p, *kc, *n; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + kcld = GDrawGetUserData(GGadgetGetWindow(g)); + if ( kcld->kcd==NULL ) { + list = GWidgetGetControl(kcld->gw,CID_List); + old = GGadgetGetList(list,&len); + new = gcalloc(len+1,sizeof(GTextInfo *)); + p = NULL; kc = kcld->isv ? kcld->sf->vkerns : kcld->sf->kerns; + for ( i=j=0; inext; + if ( !old[i]->selected ) { + new[j] = galloc(sizeof(GTextInfo)); + *new[j] = *old[i]; + new[j]->text = u_copy(new[j]->text); + ++j; + p = kc; + } else { + if ( p!=NULL ) + p->next = n; + else if ( kcld->isv ) + kcld->sf->vkerns = n; + else + kcld->sf->kerns = n; + kc->next = NULL; + KernClassListFree(kc); + } + } + new[j] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); + } + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Delete),false); + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Edit),false); + } +return( true ); +} + +static int KCL_Edit(GGadget *g, GEvent *e) { + int sel, i; + KernClassListDlg *kcld; + KernClass *kc; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + kcld = GDrawGetUserData(GGadgetGetWindow(g)); + sel = GGadgetGetFirstListSelectedItem(GWidgetGetControl(GGadgetGetWindow(g),CID_List)); + if ( sel==-1 || kcld->kcd!=NULL ) +return( true ); + for ( kc=kcld->isv?kcld->sf->vkerns:kcld->sf->kerns, i=0; inext, ++i ); + KernClassD(kcld,kc); + } +return( true ); +} + +static int KCL_Done(GGadget *g, GEvent *e) { + KernClassListDlg *kcld; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + kcld = GDrawGetUserData(GGadgetGetWindow(g)); + if ( kcld->kcd != NULL ) + KC_DoCancel(kcld->kcd); + GDrawDestroyWindow(kcld->gw); + } +return( true ); +} + +static int KCL_SelChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + KernClassListDlg *kcld = GDrawGetUserData(GGadgetGetWindow(g)); + int sel = GGadgetGetFirstListSelectedItem(g); + GGadgetSetEnabled(GWidgetGetControl(kcld->gw,CID_Delete),sel!=-1 && kcld->kcd==NULL); + GGadgetSetEnabled(GWidgetGetControl(kcld->gw,CID_Edit),sel!=-1 && kcld->kcd==NULL); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + KernClassListDlg *kcld = GDrawGetUserData(GGadgetGetWindow(g)); + if ( kcld->kcd==NULL ) { + e->u.control.subtype = et_buttonactivate; + e->u.control.g = GWidgetGetControl(kcld->gw,CID_Edit); + KCL_Edit(e->u.control.g,e); + } else { + GDrawSetVisible(kcld->kcd->gw,true); + GDrawRaise(kcld->kcd->gw); + } + } +return( true ); +} + +static int kcl_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + KernClassListDlg *kcld = GDrawGetUserData(gw); + if ( kcld->kcd != NULL ) + KC_DoCancel(kcld->kcd); + GDrawDestroyWindow(kcld->gw); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("metricsview.html#kernclass"); +return( true ); + } +return( false ); + } else if ( event->type == et_destroy ) { + KernClassListDlg *kcld = GDrawGetUserData(gw); + if ( kcld->isv ) + kcld->sf->vkcld = NULL; + else + kcld->sf->kcld = NULL; + free(kcld); + } +return( true ); +} + +void ShowKernClasses(SplineFont *sf,MetricsView *mv,int isv) { + KernClassListDlg *kcld; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[7]; + GTextInfo label[7]; + + if ( sf->kcld && !isv ) { + GDrawSetVisible(sf->kcld->gw,true); + GDrawRaise(sf->kcld->gw); +return; + } else if ( sf->vkcld && isv ) { + GDrawSetVisible(sf->vkcld->gw,true); + GDrawRaise(sf->vkcld->gw); +return; + } + + kcld = gcalloc(1,sizeof(KernClassListDlg)); + kcld->sf = sf; + kcld->isv = isv; + if ( isv ) + sf->vkcld = kcld; + else + sf->kcld = kcld; + + memset(&wattrs,0,sizeof(wattrs)); + memset(&gcd,0,sizeof(gcd)); + memset(&label,0,sizeof(label)); + + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<gw = GDrawCreateTopWindow(NULL,&pos,kcl_e_h,kcld,&wattrs); + + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 5; + gcd[0].gd.pos.width = KCL_Width-28; gcd[0].gd.pos.height = 7*12+10; + gcd[0].gd.flags = gg_visible | gg_enabled | gg_list_multiplesel; + gcd[0].gd.cid = CID_List; + gcd[0].gd.u.list = KCSLIList(sf,isv); + gcd[0].gd.handle_controlevent = KCL_SelChanged; + gcd[0].creator = GListCreate; + + gcd[1].gd.pos.x = 10; gcd[1].gd.pos.y = gcd[0].gd.pos.y+gcd[0].gd.pos.height+4; + gcd[1].gd.pos.width = -1; + gcd[1].gd.flags = gg_visible | gg_enabled; + label[1].text = (unichar_t *) _STR_NewDDD; + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.cid = CID_New; + gcd[1].gd.handle_controlevent = KCL_New; + gcd[1].creator = GButtonCreate; + + gcd[2].gd.pos.x = 20+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); gcd[2].gd.pos.y = gcd[1].gd.pos.y; + gcd[2].gd.pos.width = -1; + gcd[2].gd.flags = gg_visible; + label[2].text = (unichar_t *) _STR_Delete; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.cid = CID_Delete; + gcd[2].gd.handle_controlevent = KCL_Delete; + gcd[2].creator = GButtonCreate; + + gcd[3].gd.pos.x = -10; gcd[3].gd.pos.y = gcd[1].gd.pos.y; + gcd[3].gd.pos.width = -1; + gcd[3].gd.flags = gg_visible; + label[3].text = (unichar_t *) _STR_EditDDD; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.cid = CID_Edit; + gcd[3].gd.handle_controlevent = KCL_Edit; + gcd[3].creator = GButtonCreate; + + gcd[4].gd.pos.x = 10; gcd[4].gd.pos.y = gcd[1].gd.pos.y+28; + gcd[4].gd.pos.width = KCL_Width-20; + gcd[4].gd.flags = gg_visible; + gcd[4].creator = GLineCreate; + + gcd[5].gd.pos.x = (KCL_Width-GIntGetResource(_NUM_Buttonsize))/2; gcd[5].gd.pos.y = gcd[4].gd.pos.y+7; + gcd[5].gd.pos.width = -1; + gcd[5].gd.flags = gg_visible|gg_enabled|gg_but_default|gg_but_cancel; + label[5].text = (unichar_t *) _STR_Done; + label[5].text_in_resource = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.handle_controlevent = KCL_Done; + gcd[5].creator = GButtonCreate; + + GGadgetsCreate(kcld->gw,gcd); + GDrawSetVisible(kcld->gw,true); +} + +void KCLD_End(KernClassListDlg *kcld) { + if ( kcld==NULL ) +return; + if ( kcld->kcd != NULL ) + KC_DoCancel(kcld->kcd); + GDrawDestroyWindow(kcld->gw); +} + +void KCLD_MvDetach(KernClassListDlg *kcld,MetricsView *mv) { + if ( kcld==NULL ) +return; +} + +int KernClassContains(KernClass *kc, char *name1, char *name2, int ordered ) { + int infirst=0, insecond=0, scpos1, kwpos1, scpos2, kwpos2; + int i; + + for ( i=1; ifirst_cnt; ++i ) { + if ( PSTContains(kc->firsts[i],name1) ) { + scpos1 = i; + if ( ++infirst>=3 ) /* The name occurs twice??? */ + break; + } else if ( PSTContains(kc->firsts[i],name2) ) { + kwpos1 = i; + if ( (infirst+=2)>=3 ) + break; + } + } + if ( infirst==0 || infirst>3 ) +return( 0 ); + for ( i=1; isecond_cnt; ++i ) { + if ( PSTContains(kc->seconds[i],name1) ) { + scpos2 = i; + if ( ++insecond>=3 ) + break; + } else if ( PSTContains(kc->seconds[i],name2) ) { + kwpos2 = i; + if ( (insecond+=2)>=3 ) + break; + } + } + if ( insecond==0 || insecond>3 ) +return( 0 ); + if ( (infirst&1) && (insecond&2) ) { + if ( kc->offsets[scpos1*kc->second_cnt+kwpos2]!=0 ) +return( kc->offsets[scpos1*kc->second_cnt+kwpos2] ); + } + if ( !ordered ) { + if ( (infirst&2) && (insecond&1) ) { + if ( kc->offsets[kwpos1*kc->second_cnt+scpos2]!=0 ) +return( kc->offsets[kwpos1*kc->second_cnt+scpos2] ); + } + } +return( 0 ); +} diff --git a/fontforge/macbinary.c b/fontforge/macbinary.c new file mode 100644 index 00000000..20bdb84a --- /dev/null +++ b/fontforge/macbinary.c @@ -0,0 +1,2903 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "ustring.h" +#include "ttf.h" +#include "psfont.h" +#if __Mac +# include +#else +#undef __Mac +#define __Mac 0 +#endif + +const int mac_dpi = 72; +/* I had always assumed that the mac still believed in 72dpi screens, but I */ +/* see that in geneva under OS/9, the pointsize does not match the pixel */ +/* size of the font. But the dpi is not constant (and the differences */ +/* excede those supplied by rounding errors) varying between 96 and 84dpi */ + +/* A Mac Resource fork */ +/* http://developer.apple.com/techpubs/mac/MoreToolbox/MoreToolbox-9.html */ +/* begins with a 16 byte header containing: */ +/* resource start offset */ +/* map start offset */ +/* resource length */ +/* map length */ +/* then 256-16 bytes of zeros */ +/* the resource section consists of (many) */ +/* 4 byte length count */ +/* resource data +/* the map section contains */ +/* A copy of the 16 byte header */ +/* a 4 byte mac internal value (I hope) */ +/* another 4 bytes of mac internal values (I hope) */ +/* a 2 byte offset from the start of the map section to the list of resource types */ +/* a 2 byte offset from the start of the map section to the list of resource names */ +/* The resource type list consists of */ +/* a 2 byte count of the number of resource types (-1) */ +/* (many copies of) */ +/* a 4 byte resource type ('FOND' for example) */ +/* a 2 byte count of the number of resources of this type (-1) */ +/* a 2 byte offset from the type list start to the resource table */ +/* a resource table looks like */ +/* a 2 byte offset from the resource name table to a pascal */ +/* string containing this resource's name (or 0xffff for none) */ +/* 1 byte of resource flags */ +/* 3 bytes of offset from the resource section to the length & */ +/* data of this instance of the resource type */ +/* 4 bytes of 0 */ +/* The resource name section consists of */ +/* a bunch of pascal strings (ie. preceded by a length byte) */ + +/* The POST resource isn't noticeably documented, it's pretty much a */ +/* straight copy of the pfb file cut up into 0x800 byte chunks. */ +/* (each section of the pfb file has it's own set of chunks, the last may be smaller than 0x800) */ +/* The NFNT resource http://developer.apple.com/techpubs/mac/Text/Text-250.html */ +/* The FOND resource http://developer.apple.com/techpubs/mac/Text/Text-269.html */ +/* The sfnt resource is basically a copy of the ttf file */ + +/* A MacBinary file */ +/* http://www.lazerware.com/formats/macbinary.html */ +/* begins with a 128 byte header */ +/* (which specifies lengths for data/resource forks) */ +/* (and contains mac type/creator data) */ +/* (and other stuff) */ +/* (and finally a crc checksum) +/* is followed by the data section (padded to a mult of 128 bytes) */ +/* is followed by the resource section (padded to a mult of 128 bytes) */ + +/* Crc code taken from: */ +/* http://www.ctan.org/tex-archive/tools/macutils/crc/ */ +/* MacBinary files use the same CRC that binhex does (in the MacBinary header) */ +extern unsigned long binhex_crc(unsigned char *buffer,int size); + +/* ******************************** Creation ******************************** */ + +static uint16 HashToId(char *fontname,SplineFont *sf) { + int low = 128, high = 0x3fff; + /* A FOND ID should be between these two numbers for roman script (I think) */ + uint32 hash = 0; + int i; + SplineChar *sc; + + /* Figure out what language we've got */ + /* I'm not bothering with all of the apple scripts, and I don't know */ + /* what to do about cjk fonts */ + if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) { + if ( sf->cidmaster != NULL ) sf = sf->cidmaster; + if ( sf->ordering != NULL ) { + if ( strstrmatch(sf->ordering,"Japan")!=NULL ) { + low = 0x4000; high = 0x41ff; + } else if ( strstrmatch(sf->ordering,"Korea")!=NULL ) { + low = 0x4400; high = 0x45ff; + } else if ( strstrmatch(sf->ordering,"CNS")!=NULL ) { + low = 0x4200; high = 0x43ff; + } else if ( strstrmatch(sf->ordering,"GB")!=NULL ) { + low = 0x7200; high = 0x73ff; + } + } + } else if ( sf->encoding_name == em_big5 || sf->encoding_name == em_big5hkscs ) { + low = 0x4200; high = 0x43ff; + } else if ( sf->encoding_name == em_jis208 || + sf->encoding_name == em_jis212 || + sf->encoding_name == em_sjis ) { + low = 0x4000; high = 0x41ff; + } else if ( sf->encoding_name == em_johab || + sf->encoding_name == em_ksc5601 || + sf->encoding_name == em_wansung ) { + low = 0x4400; high = 0x45ff; + } else if ( sf->encoding_name == em_gb2312 || + sf->encoding_name==em_jisgb ) { + low = 0x7200; high = 0x73ff; + } else for ( i=0; icharcnt && i<256; ++i ) if ( (sc = sf->chars[i])!=NULL ) { + /* Japanese between 0x4000 and 0x41ff */ + /* Trad Chinese 0x4200 and 0x43ff */ + /* Simp Chinese 0x7200 and 0x73ff */ + /* Korean 0x4400 and 0x45ff */ + if (( sc->unicodeenc>=0x0600 && sc->unicodeenc<0x0700 ) || + ( sc->unicodeenc>=0xFB50 && sc->unicodeenc<0xfe00 )) { + /* arabic */ + low = 0x4600; high = 0x47ff; + break; + } else if (( sc->unicodeenc>=0x0590 && sc->unicodeenc<0x0600 ) || + ( sc->unicodeenc>=0xFB1d && sc->unicodeenc<0xFB50 )) { + /* hebrew */ + low = 0x4800; high = 0x49ff; + break; + } else if ((( sc->unicodeenc>=0x0370 && sc->unicodeenc<0x0400 ) || + ( sc->unicodeenc>=0x1f00 && sc->unicodeenc<0x2000 )) && + sc->unicodeenc!=0x3c0 ) { /* In mac encoding */ + /* greek */ + low = 0x4a00; high = 0x4bff; + break; + } else if ( sc->unicodeenc>=0x0400 && sc->unicodeenc<0x0530 ) { + /* cyrillic */ + low = 0x4c00; high = 0x4dff; + break; + /* hebrew/arabic symbols 4e00-4fff */ + } else if ( sc->unicodeenc>=0x0900 && sc->unicodeenc<0x0980 ) { + /* devanagari */ + low = 0x5000; high = 0x51ff; + break; + } else if ( sc->unicodeenc>=0x0980 && sc->unicodeenc<0x0a00 ) { + /* bengali: script=13 */ + low = 0x5800; high = 0x59ff; + break; + } + } + while ( *fontname ) { + int temp = (hash>>28)&0xf; + hash = (hash<<4) | temp; + hash ^= *fontname++-' '; + } + hash %= (high-low+1); + hash += low; +return( hash ); +} + +static int IsMacMonospaced(SplineFont *sf) { + /* Only look at first 256 */ + int i; + double width = 0x80000000; + + for ( i=0; i<256 && icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) ) { + if ( width == 0x80000000 ) + width = sf->chars[i]->width; + else if ( sf->chars[i]->width!=width ) +return( false ); + } +return( true ); +} + +SplineChar *SFFindExistingCharMac(SplineFont *sf,int unienc) { + int i; + + for ( i=0; icharcnt && i<256; ++i ) + if ( sf->chars[i]!=NULL && sf->chars[i]->unicodeenc==unienc ) +return( sf->chars[i] ); +return( NULL ); +} + +static double SFMacWidthMax(SplineFont *sf) { + /* Only look at first 256 */ + int i; + double width = -1; + + for ( i=0; i<256 && icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) ) { + if ( sf->chars[i]->width>width ) + width = sf->chars[i]->width; + } + if ( width<0 ) /* No chars, or widths the mac doesn't support */ +return( 0 ); + +return( width ); +} + +static int SFMacAnyKerns(SplineFont *sf) { + /* Only look at first 256 */ + int i, cnt=0; + KernPair *kp; + + for ( i=0; i<256 && icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kp=sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc->enc<256 ) + ++cnt; + } +return( cnt ); +} + +struct resource { + uint32 pos; + uint8 flags; + uint16 id; + char *name; + uint32 nameloc; + uint32 nameptloc; +}; + +struct resourcetype { + uint32 tag; + struct resource *res; + uint32 resloc; +}; + +struct macbinaryheader { + char *macfilename; + char *binfilename; /* if macfilename is null and this is set we will figure out macfilename by removing .bin */ + uint32 type; + uint32 creator; +}; + +static struct resource *PSToResources(FILE *res,FILE *pfbfile) { + /* split the font up into as many small resources as we need and return */ + /* an array pointing to the start of each */ + struct stat statb; + int cnt, type; + struct resource *resstarts; + int len,i; + + fstat(fileno(pfbfile),&statb); + cnt = 3*(statb.st_size+0x800)/(0x800-2)+1; /* should be (usually) a vast over estimate */ + resstarts = gcalloc(cnt+1,sizeof(struct resource)); + + cnt = 0; + forever { + if ( getc(pfbfile)!=0x80 ) { + GDrawIError("We made a pfb file, but didn't get one. Hunh?" ); +return( NULL ); + } + type = getc(pfbfile); + if ( type==3 ) { + /* 501 appears to be magic */ + /* postscript resources seem to have flags of 0 */ + resstarts[cnt].id = 501+cnt; + resstarts[cnt++].pos = ftell(res); + putlong(res,2); /* length */ + putc(5,res); /* eof mark */ + putc(0,res); + break; + } + len = getc(pfbfile); + len |= (getc(pfbfile))<<8; + len |= (getc(pfbfile))<<16; + len |= (getc(pfbfile))<<24; + while ( len>0 ) { + int ilen = len; + if ( ilen>0x800-2 ) + ilen = 0x800-2; + len -= ilen; + resstarts[cnt].id = 501+cnt; + resstarts[cnt++].pos = ftell(res); + putlong(res,ilen+2); /* length */ + putc(type,res); /* section type mark */ + putc(0,res); + for ( i=0; iascent-1; r = i = 0; + if ( bdfc->ymax > bdf->ascent-1 ) + i = bdfc->ymax-(bdf->ascent-1); + else if ( bdfc->ymaxascent-1 ) { + r = bdf->ascent-1-bdfc->ymax; + y = bdfc->ymax; + } + for ( ; y>=bdfc->ymin && y>=-bdf->descent; --y, ++i ) { + /* Mac characters may not extend above the ascent or below the descent */ + /* but bdf chars can, so if a bdf char does, just ignore that part */ + ipos = i*bdfc->bytes_per_line; + for ( j=0,c=offset; j<=bdfc->xmax-bdfc->xmin; ++j, ++c ) { + if ( bdfc->bitmap[ipos+(j>>3)] & (1<<(7-(j&7))) ) + rows[r][c>>3] |= (1<<(7-(c&7))); + } + ++r; + } +return( offset + bdfc->xmax-bdfc->xmin+1 ); +} + +static uint32 BDFToNFNT(FILE *res, BDFFont *bdf) { + short widths[258], lbearings[258], locs[258]/*, idealwidths[256]*/; + uint8 **rows = galloc(bdf->pixelsize*sizeof(uint8 *)); + int i, k, width, kernMax=1, descentMax=bdf->descent-1, rectMax=1, widMax=3; + uint32 rlenpos = ftell(res), end, owloc, owpos; + + for ( i=width=0; i<256 && icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + width += bdf->chars[i]->xmax+1-bdf->chars[i]->xmin; + if ( bdf->chars[i]->width>widMax ) + widMax = bdf->chars[i]->width; + if ( bdf->chars[i]->xmax+1-bdf->chars[i]->xmin>rectMax ) + rectMax = bdf->chars[i]->xmax+1-bdf->chars[i]->xmin; + if ( bdf->chars[i]->xminchars[i]->xmin; + if ( bdf->chars[i]->ymin<-descentMax ) + descentMax = -bdf->chars[i]->ymin; + } + if ( descentMax>bdf->descent ) descentMax = bdf->descent; + ++width; /* For the "undefined character */ + for ( k=0; kpixelsize; ++k ) + rows[k] = gcalloc((width+7)/8 + 4 , sizeof(uint8)); + for ( i=width=0; i<256 ; ++i ) { + locs[i] = width; + if ( i>=bdf->charcnt || bdf->chars[i]==NULL || !SCWorthOutputting(bdf->chars[i]->sc) ) { + lbearings[i] = 0xff; + widths[i] = 0xff; + /*idealwidths[i] = 1<<12; /* 1 em */ + } else { + lbearings[i] = bdf->chars[i]->xmin-kernMax; + widths[i] = bdf->chars[i]->width<0?0: + bdf->chars[i]->width>=256?255: + bdf->chars[i]->width; + /*idealwidths[i] = bdf->chars[i]->sc->width*(1<<12)/(bdf->sf->ascent+bdf->sf->descent);*/ + width = BDFCCopyBitmaps(rows,width,bdf->chars[i],bdf); + } + } + /* Now for the "undefined character", just a simple vertical bar */ + locs[i] = width; + lbearings[i] = 1; + widths[i] = 3; + /*idealwidths[i++] = (3<<12)/bdf->pixelsize;*/ + for ( k = 1; kpixelsize-1; ++k ) + rows[k][width>>3] |= (1<<(7-(width&7))); + /* And one more entry to give a size to the last character */ + locs[i] = ++width; + lbearings[i] = widths[i] = 0xff; + /*idealwidths[i] = 0;*/ + + /* Mac magic */ + lbearings[0] = widths[0] = 0; + lbearings['\r'] = widths['\r'] = 0; + lbearings['\t'] = 0; widths['\t'] = 6; + + /* We've finished the bitmap conversion, now save it... */ + putlong(res,0); /* Length, to be filled in later */ + putshort(res,IsMacMonospaced(bdf->sf)?0xb000:0x9000); /* fontType */ + putshort(res,0); + putshort(res,255); + putshort(res,widMax); + putshort(res,kernMax); + putshort(res,-descentMax); + putshort(res,rectMax); + putshort(res,bdf->pixelsize); + owpos = ftell(res); + putshort(res,0); + putshort(res,bdf->ascent); + putshort(res,bdf->descent); + putshort(res,(short) (bdf->sf->pfminfo.linegap*bdf->pixelsize/(bdf->sf->ascent+bdf->sf->descent)) ); + putshort(res,(width+15)>>4); + /* bitmaps */ + for ( k=0; kpixelsize; ++k ) { + for ( i=0; i<((width+15)>>4) ; ++i ) { + putc(rows[k][2*i],res); + putc(rows[k][2*i+1],res); + } + } + for ( i=0; i<258; ++i ) + putshort(res,locs[i]); + owloc = ftell(res); /* valgrind reports an error here (but not above). god knows why */ + for ( i=0; i<258; ++i ) { + putc(lbearings[i],res); + putc(widths[i],res); + } + end = ftell(res); + fseek(res,rlenpos,SEEK_SET); + putlong(res,end-rlenpos-4); + fseek(res,owpos,SEEK_SET); + putshort(res,(owloc-owpos)/2); + fseek(res,0,SEEK_END); + + for ( k=0; kpixelsize; ++k ) + free(rows[k]); + free(rows); + +return(rlenpos); +} + +static uint32 DummyNFNT(FILE *res, BDFFont *bdf) { + /* This produces a stub NFNT which appears when the real data lives inside */ + /* an sfnt (truetype) resource. We still need to produce an NFNT to tell */ + /* the system that the pointsize is available. This NFNT has almost nothing */ + /* in it, just the initial header, no metrics, no bitmaps */ + int i, width, kernMax=1, descentMax=bdf->descent-1, rectMax=1, widMax=3; + uint32 rlenpos = ftell(res); + + for ( i=width=0; i<256 && icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + width += bdf->chars[i]->xmax+1-bdf->chars[i]->xmin; + if ( bdf->chars[i]->width>widMax ) + widMax = bdf->chars[i]->width; + if ( bdf->chars[i]->xmax+1-bdf->chars[i]->xmin>rectMax ) + rectMax = bdf->chars[i]->xmax+1-bdf->chars[i]->xmin; + if ( bdf->chars[i]->xminchars[i]->xmin; + if ( bdf->chars[i]->ymin<-descentMax ) + descentMax = -bdf->chars[i]->ymin; + } + if ( descentMax>bdf->descent ) descentMax = bdf->descent; + + putlong(res,26); /* Length */ + putshort(res,SFOneWidth(bdf->sf)!=-1?0xf000:0xd000); /* fontType */ + putshort(res,0); + putshort(res,255); + putshort(res,widMax); + putshort(res,kernMax); + putshort(res,-descentMax); + putshort(res,rectMax); + putshort(res,bdf->pixelsize); + putshort(res,0); + putshort(res,bdf->ascent); + putshort(res,bdf->descent); + putshort(res,(short) (bdf->sf->pfminfo.linegap*bdf->pixelsize/(bdf->sf->ascent+bdf->sf->descent)) ); + putshort(res,0); + +return(rlenpos); +} + +static struct resource *SFToNFNTs(FILE *res, SplineFont *sf, int32 *sizes) { + int i, baseresid = HashToId(sf->fontname,sf); + struct resource *resstarts; + BDFFont *bdf; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + + for ( i=0; sizes[i]!=0; ++i ); + resstarts = gcalloc(i+1,sizeof(struct resource)); + + for ( i=0; sizes[i]!=0; ++i ) { + if ( (sizes[i]>>16)!=1 ) + continue; + if ( (sizes[i]&0xffff)>=256 ) + continue; + for ( bdf=sf->bitmaps; bdf!=NULL && (bdf->pixelsize!=(sizes[i]&0xffff) || BDFDepth(bdf)!=1); bdf=bdf->next ); + if ( bdf==NULL ) + continue; + resstarts[i].id = baseresid+bdf->pixelsize; + resstarts[i].pos = BDFToNFNT(res,bdf); + /* NFNTs seem to have resource flags of 0 */ + } +return(resstarts); +} + +static struct resource *SFsToNFNTs(FILE *res, struct sflist *sfs,int baseresid) { + int i, j, cnt; + struct resource *resstarts; + BDFFont *bdf; + struct sflist *sfi; + SplineFont *sf; + + cnt = 0; + for ( sfi=sfs; sfi!=NULL; sfi=sfi->next ) { + if ( sfi->sizes!=NULL ) { + for ( i=0; sfi->sizes[i]!=0; ++i ); + cnt += i; + sfi->ids = gcalloc(i+1,sizeof(int)); + sfi->bdfs = gcalloc(i+1,sizeof(BDFFont *)); + } + } + + resstarts = gcalloc(cnt+1,sizeof(struct resource)); + + cnt = 0; + for ( sfi=sfs; sfi!=NULL; sfi=sfi->next ) { + sf = sfi->sf; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + j=0; + if ( sfi->sizes ) for ( i=0; sfi->sizes[i]!=0; ++i ) { + if ( (sfi->sizes[i]>>16)!=1 ) + continue; + if ( (sfi->sizes[i]&0xffff)>=256 ) + continue; + for ( bdf=sf->bitmaps; bdf!=NULL && (bdf->pixelsize!=(sfi->sizes[i]&0xffff) || BDFDepth(bdf)!=1); bdf=bdf->next ); + if ( bdf==NULL ) + continue; + sfi->ids[j] = baseresid; + sfi->bdfs[j] = bdf; + resstarts[cnt+j].id = baseresid++; + resstarts[cnt+j++].pos = BDFToNFNT(res,bdf); + /* NFNTs seem to have resource flags of 0 */ + } + cnt += j; + } +return(resstarts); +} + +static struct resource *BuildDummyNFNTlist(FILE *res, SplineFont *sf, int32 *sizes, int baseresid) { + int i; + struct resource *resstarts; + BDFFont *bdf; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + + for ( i=0; sizes[i]!=0; ++i ); + resstarts = gcalloc(i+1,sizeof(struct resource)); + + for ( i=0; sizes[i]!=0; ++i ) { + if ( (sizes[i]>>16)!=1 ) + continue; + if ( (sizes[i]&0xffff)>=256 ) + continue; + for ( bdf=sf->bitmaps; bdf!=NULL && (bdf->pixelsize!=(sizes[i]&0xffff) || BDFDepth(bdf)!=1); bdf=bdf->next ); + if ( bdf==NULL ) + continue; + resstarts[i].id = baseresid++; + resstarts[i].pos = DummyNFNT(res,bdf); + /* NFNTs seem to have resource flags of 0 */ + } +return(resstarts); +} + +static struct resource *BuildDummyNFNTfamilyList(FILE *res, struct sflist *sfs, int baseresid) { + int i,j,cnt; + struct resource *resstarts; + BDFFont *bdf; + struct sflist *sfi; + SplineFont *sf; + + cnt = 0; + for ( sfi=sfs; sfi!=NULL; sfi=sfi->next ) { + if ( sfi->sizes!=NULL ) { + for ( i=0; sfi->sizes[i]!=0; ++i ); + cnt += i; + sfi->ids = gcalloc(i+1,sizeof(int)); + sfi->bdfs = gcalloc(i+1,sizeof(BDFFont *)); + } + } + + resstarts = gcalloc(cnt+1,sizeof(struct resource)); + + cnt = 0; + for ( sfi=sfs; sfi!=NULL; sfi=sfi->next ) { + sf = sfi->sf; + j = 0; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( sfi->sizes ) for ( i=0; sfi->sizes[i]!=0; ++i ) { + if ( (sfi->sizes[i]>>16)!=1 ) + continue; + for ( bdf=sf->bitmaps; bdf!=NULL && (bdf->pixelsize!=(sfi->sizes[i]&0xffff) || BDFDepth(bdf)!=1); bdf=bdf->next ); + if ( bdf==NULL ) + continue; + sfi->ids[j] = baseresid; + sfi->bdfs[j] = bdf; + resstarts[cnt+j].id = baseresid++; + resstarts[cnt+j++].pos = DummyNFNT(res,bdf); + /* NFNTs seem to have resource flags of 0 */ + } + cnt += j; + } +return(resstarts); +} + +enum psstyle_flags { psf_bold = 1, psf_italic = 2, psf_outline = 4, + psf_shadow = 0x8, psf_condense = 0x10, psf_extend = 0x20 }; + +uint16 _MacStyleCode( char *styles, SplineFont *sf, uint16 *psstylecode ) { + unsigned short stylecode= 0, psstyle=0; + + if ( strstrmatch( styles, "Bold" ) || strstrmatch(styles,"Demi") || + strstrmatch( styles,"Heav") || strstrmatch(styles,"Blac") || +/* A few fonts have German/French styles in their names */ + strstrmatch( styles,"Fett") || strstrmatch(styles,"Gras") ) { + stylecode = sf_bold; + psstyle = psf_bold; + } else if ( sf!=NULL && sf->weight!=NULL && + (strstrmatch( sf->weight, "Bold" ) || strstrmatch(sf->weight,"Demi") || + strstrmatch( sf->weight,"Heav") || strstrmatch(sf->weight,"Blac") || + strstrmatch( sf->weight,"Fett") || strstrmatch(sf->weight,"Gras")) ) { + stylecode = sf_bold; + psstyle = psf_bold; + } + /* URW uses four leter abbreviations of Italic and Oblique */ + /* Somebody else uses two letter abbrevs */ + if ( (sf!=NULL && sf->italicangle!=0) || + strstrmatch( styles, "Ital" ) || + strstrmatch( styles, "Obli" ) || + strstrmatch(styles, "Slanted") || + strstrmatch(styles, "Kurs") || + strstr( styles,"It" ) ) { + stylecode |= sf_italic; + psstyle |= psf_italic; + } + if ( strstrmatch( styles, "Underline" ) ) { + stylecode |= sf_underline; + } + if ( strstrmatch( styles, "Outl" ) ) { + stylecode |= sf_outline; + psstyle |= psf_outline; + } + if ( strstr(styles,"Shadow")!=NULL ) { + stylecode |= sf_shadow; + psstyle |= psf_shadow; + } + if ( strstrmatch( styles, "Cond" ) || strstr( styles,"Cn") || + strstrmatch( styles, "Narrow") ) { + stylecode |= sf_condense; + psstyle |= psf_condense; + } + if ( strstrmatch( styles, "Exte" ) || strstr( styles,"Ex") ) { + stylecode |= sf_extend; + psstyle |= psf_extend; + } + if ( (psstyle&psf_extend) && (psstyle&psf_condense) ) { + if ( sf!=NULL ) + fprintf( stderr, "Warning: %s(%s) is both extended and condensed. That's impossible.\n", + sf->fontname, sf->origname ); + else + fprintf( stderr, "Warning: Both extended and condensed. That's impossible.\n" ); + psstyle &= ~psf_extend; + stylecode &= ~sf_extend; + } + if ( psstylecode!=NULL ) + *psstylecode = psstyle; +return( stylecode ); +} + +uint16 MacStyleCode( SplineFont *sf, uint16 *psstylecode ) { + char *styles; + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + + if ( sf->macstyle!=-1 ) { + if ( psstylecode!=NULL ) + *psstylecode = (sf->macstyle&0xf)|((sf->macstyle&0x60)>>1); +return( sf->macstyle ); + } + + styles = SFGetModifiers(sf); +return( _MacStyleCode(styles,sf,psstylecode)); +} + +static uint32 SFToFOND(FILE *res,SplineFont *sf,uint32 id,int dottf,int32 *sizes) { + uint32 rlenpos = ftell(res), widoffpos, widoffloc, kernloc, styleloc, end; + int i,j,k,cnt, strcnt, fontclass, stylecode, glyphenc, geoffset, realstylecode; + KernPair *kp; + DBounds b; + char *pt; + /* Fonds are generally marked system heap and sometimes purgeable (resource flags) */ + + putlong(res,0); /* Fill in length later */ + putshort(res,IsMacMonospaced(sf)?0x9000:0x1000); + putshort(res,id); + putshort(res,0); /* First character */ + putshort(res,255); /* Last character */ + putshort(res,(short) ((sf->ascent*(1<<12))/(sf->ascent+sf->descent))); + putshort(res,-(short) ((sf->descent*(1<<12))/(sf->ascent+sf->descent))); + putshort(res,(short) ((sf->pfminfo.linegap*(1<<12))/(sf->ascent+sf->descent))); + putshort(res,(short) ((SFMacWidthMax(sf)*(1<<12))/(sf->ascent+sf->descent))); + widoffpos = ftell(res); + putlong(res,0); /* Fill in width offset later */ + putlong(res,0); /* Fill in kern offset later */ + putlong(res,0); /* Fill in style offset later */ + for ( i=0; i<9; ++i ) + putshort(res,0); /* Extra width values */ + putlong(res,0); /* Script for international */ + putshort(res,2); /* FOND version */ + + /* Font association table */ + stylecode = realstylecode = MacStyleCode( sf, NULL ); + stylecode = 0; /* Debug !!!! */ + for ( i=j=0; sizes!=NULL && sizes[i]!=0; ++i ) + if ( (sizes[i]>>16)==1 && (sizes[i]&0xffff)<256 ) + ++j; + if ( dottf ) { + putshort(res,j+1-1); /* Number of faces */ + putshort(res,0); /* it's scaleable */ + putshort(res,stylecode); + putshort(res,id); /* Give it the same ID as the fond */ + } else + putshort(res,j-1); /* Number of faces */ + if ( sizes!=NULL ) { + for ( i=0; sizes[i]!=0; ++i ) if (( sizes[i]>>16) == 1 ) { + putshort(res,sizes[i]&0xffff); + putshort(res,stylecode); + putshort(res,id+(sizes[i]&0xffff)); /* make up a unique ID */ + } + } + + /* offset table */ + putshort(res,1-1); /* One table */ + putlong(res,6); /* Offset from start of otab to next byte */ + + /* bounding box table */ + putshort(res,1-1); /* One bounding box */ + SplineFontFindBounds(sf,&b); + putshort(res,stylecode); + putshort(res,b.minx*(1<<12)/(sf->ascent+sf->descent)); + putshort(res,b.miny*(1<<12)/(sf->ascent+sf->descent)); + putshort(res,b.maxx*(1<<12)/(sf->ascent+sf->descent)); + putshort(res,b.maxy*(1<<12)/(sf->ascent+sf->descent)); + + widoffloc = ftell(res); + putshort(res,1-1); /* One style in the width table too */ + putshort(res,stylecode); + for ( k=0; k<=256; ++k ) { + if ( k>=sf->charcnt || k==256 || sf->chars[k]==NULL ) + putshort(res,1<<12); /* 1 em is default size */ + else + putshort(res,sf->chars[k]->width*(1<<12)/(sf->ascent+sf->descent)); + } + + kernloc = 0; + if (( cnt = SFMacAnyKerns(sf))>0 ) { + kernloc = ftell(res); + putshort(res,1-1); /* One style in the width table too */ + putshort(res,stylecode); /* style */ + putshort(res,cnt); /* Count of kerning pairs */ + for ( k=0; k<256 && kcharcnt; ++k ) if ( sf->chars[k]!=NULL ) { + for ( kp=sf->chars[k]->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc->enc<256 ) { + putc(k,res); + putc(kp->sc->enc,res); + putshort(res,kp->off*(1<<12)/(sf->ascent+sf->descent)); + } + } + } + + /* Fontographer referenced a postscript font even in truetype FONDs */ + styleloc = ftell(res); + fontclass = 0x1; /* font name needs coordinating? Font has its own encoding */ + if ( !(realstylecode&sf_outline) ) fontclass |= 4; + if ( realstylecode&sf_bold ) fontclass |= 0x18; + if ( realstylecode&psf_italic ) fontclass |= 0x40; + if ( realstylecode&psf_condense ) fontclass |= 0x80; + if ( realstylecode&psf_extend ) fontclass |= 0x100; + putshort(res,fontclass); /* fontClass */ + geoffset = ftell(res); + putlong(res,0); /* Offset to glyph encoding table */ /* Fill in later */ + putlong(res,0); /* Reserved, MBZ */ + if ( strnmatch(sf->familyname,sf->fontname,strlen(sf->familyname))!=0 ) + strcnt = 1; + else if ( strmatch(sf->familyname,sf->fontname)==0 ) + strcnt = 1; + else if ( sf->fontname[strlen(sf->familyname)]=='-' ) + strcnt = 4; + else + strcnt = 3; + for ( k=0; k<48; ++k ) + putc(strcnt==1?1:2,res); /* All indeces point to this font */ + putshort(res,strcnt); /* strcnt strings */ + pt = sf->fontname+strlen(sf->familyname); + if ( strcnt==1 ) { + putc(strlen(sf->fontname),res); /* basename is full name */ + /* Mac expects this to be upper case */ + if ( islower(*sf->fontname)) putc(toupper(*sf->fontname),res); + else putc(*sf->fontname,res); + fwrite(sf->fontname+1,1,strlen(sf->fontname+1),res); + } else { + putc(strlen(sf->familyname),res);/* basename */ + if ( islower(*sf->familyname)) putc(toupper(*sf->familyname),res); + else putc(*sf->familyname,res); + fwrite(sf->familyname+1,1,strlen(sf->familyname+1),res); + if ( strcnt==3 ) { + putc(1,res); /* index string is one byte long */ + putc(3,res); /* plain name is basename with string 2 */ + putc(strlen(pt),res); /* length of... */ + fwrite(pt,1,strlen(pt),res); /* everything else */ + } else { + putc(2,res); /* index string is two bytes long */ + putc(3,res); /* plain name is basename with hyphen */ + putc(4,res); /* and everything else */ + putc(1,res); /* Length of ... */ + putc('-',res); /* String containing hyphen */ + ++pt; /* skip over hyphen */ + putc(strlen(pt),res); /* length of ... */ + fwrite(pt,1,strlen(pt),res); /* everything else */ + } + } + /* Greg: record offset for glyph encoding table */ + /* We assume that the bitmap and postscript fonts are encoded similarly */ + /* and so a null vector will do. */ + /* GWW: Hmm. ATM refuses to use postscript fonts that have */ + /* glyph encoding tables. Printer drivers use them ok. ATM will only */ + /* work on fonts with mac roman encodings */ + if ( sf->encoding_name!=em_mac ) { + if ( !dottf ) GWidgetPostNoticeR(_STR_NoATM,_STR_BadEncodingForATM); + glyphenc = ftell( res ); + fseek(res,geoffset,SEEK_SET); + putlong(res,glyphenc-geoffset+2); + fseek(res,glyphenc,SEEK_SET); +#if 1 + putshort(res,0); +#else + putshort(res,sf->charcnt>256?128:sf->charcnt-128); + for ( i=0x80; icharcnt && i<256; ++i ) { + SplineChar *sc, dummy; + putc(i,res); + sc = SCBuildDummy(&dummy,sf,i); + putc(strlen(sc->name),res); + fwrite(sc->name,1,strlen(sc->name),res); + } +#endif + } + + end = ftell(res); + fseek(res,widoffpos,SEEK_SET); + putlong(res,widoffloc-rlenpos-4); /* Fill in width offset */ + putlong(res,kernloc!=0?kernloc-rlenpos-4:0); /* Fill in kern offset */ + putlong(res,styleloc!=0?styleloc-rlenpos-4:0); /* Fill in style offset */ + + fseek(res,rlenpos,SEEK_SET); + putlong(res,end-rlenpos-4); /* resource length */ + fseek(res,end,SEEK_SET); +return(rlenpos); +} + +static void putpnsstring(FILE *res,char *fontname,int len) { + putc(len,res); + if ( *fontname && len>0 ) { + if ( islower(*fontname)) + putc(toupper(*fontname),res); + else + putc(*fontname,res); + --len; + for ( ++fontname; *fontname && len>0; ++fontname, --len ) + putc(*fontname,res); + } +} + +static void putpsstring(FILE *res,char *fontname) { + putc(strlen(fontname),res); + if ( *fontname ) { + for ( ; *fontname; ++fontname ) + putc(*fontname,res); + } +} + +static uint32 SFsToFOND(FILE *res,struct sflist *sfs,uint32 id,int format,int bf) { + uint32 rlenpos = ftell(res), widoffpos, widoffloc, kernloc, styleloc, end; + int i,j,k,cnt, scnt, kcnt, pscnt, strcnt, fontclass, glyphenc, geoffset; + int size; + uint16 psstyle, stylecode; + int exact, famlen, has_hyphen; + char *familyname; + KernPair *kp; + DBounds b; + /* Fonds are generally marked system heap and sometimes purgeable (resource flags) */ + struct sflist *faces[96]; + struct sflist *psfaces[48]; + SplineFont *sf; + struct sflist *sfi; + char *pt; + + memset(faces,0,sizeof(faces)); + memset(psfaces,0,sizeof(psfaces)); + for ( sfi = sfs ; sfi!=NULL; sfi = sfi->next ) { + stylecode = MacStyleCode(sfi->sf,&psstyle); + if ( faces[stylecode]==NULL ) + faces[stylecode] = sfi; + if ( psfaces[psstyle]==NULL ) + psfaces[psstyle] = sfi; + } + sf = faces[0]->sf; + + putlong(res,0); /* Fill in length later */ + putshort(res,IsMacMonospaced(sf)?0x9000:0x1000); + putshort(res,id); + putshort(res,0); /* First character */ + putshort(res,255); /* Last character */ + putshort(res,(short) ((sf->ascent*(1<<12))/(sf->ascent+sf->descent))); + putshort(res,-(short) ((sf->descent*(1<<12))/(sf->ascent+sf->descent))); + putshort(res,(short) ((sf->pfminfo.linegap*(1<<12))/(sf->ascent+sf->descent))); + putshort(res,(short) ((SFMacWidthMax(sf)*(1<<12))/(sf->ascent+sf->descent))); + widoffpos = ftell(res); + putlong(res,0); /* Fill in width offset later */ + putlong(res,0); /* Fill in kern offset later */ + putlong(res,0); /* Fill in style offset later */ + for ( i=0; i<9; ++i ) + putshort(res,0); /* Extra width values */ + putlong(res,0); /* Script for international */ + putshort(res,2); /* FOND version */ + + /* Font association table */ + for ( i=cnt=scnt=kcnt=0; i<96; ++i ) if ( faces[i]!=NULL ) { + ++scnt; + if ( faces[i]->id!=0 ) ++cnt; + if ( faces[i]->ids!=NULL ) + for ( j=0; faces[i]->ids[j]!=0; ++j ) ++cnt; + if ( SFMacAnyKerns(faces[i]->sf)>0 ) + ++kcnt; + } + putshort(res,cnt-1); /* Number of faces */ + /* do ttf faces (if any) first */ + for ( i=cnt=0; i<96; ++i ) if ( faces[i]!=NULL && faces[i]->id!=0 ) { + putshort(res,0); /* it's scaleable */ + putshort(res,i); /* style */ + putshort(res,faces[i]->id); + } + /* then do bitmap faces (if any) */ /* Ordered by size damn it */ + for ( size=1; size<256; ++size ) { + for ( i=0; i<96; ++i ) if ( faces[i]!=NULL && faces[i]->ids!=NULL ) { + for ( j=0; faces[i]->ids[j]!=0 ; ++j ) { + int pointsize = rint( (faces[i]->bdfs[j]->pixelsize*72.0/mac_dpi) ); + if ( pointsize==size ) { + putshort(res,size); + putshort(res,i); /* style */ + putshort(res,faces[i]->ids[j]); + } + } + } + } + + /* offset table */ + putshort(res,1-1); /* One table */ + putlong(res,6); /* Offset from start of otab to next byte */ + + /* bounding box table */ + putshort(res,scnt-1); /* One bounding box per style */ + for ( i=0; i<96; ++i ) if ( faces[i]!=NULL ) { + SplineFontFindBounds(faces[i]->sf,&b); + putshort(res,i); /* style */ + putshort(res,b.minx*(1<<12)/(faces[i]->sf->ascent+faces[i]->sf->descent)); + putshort(res,b.miny*(1<<12)/(faces[i]->sf->ascent+faces[i]->sf->descent)); + putshort(res,b.maxx*(1<<12)/(faces[i]->sf->ascent+faces[i]->sf->descent)); + putshort(res,b.maxy*(1<<12)/(faces[i]->sf->ascent+faces[i]->sf->descent)); + } + + widoffloc = ftell(res); + putshort(res,scnt-1); /* One set of width metrics per style */ + for ( i=0; i<96; ++i ) if ( faces[i]!=NULL ) { + putshort(res,i); + for ( k=0; k<=257; ++k ) { + if ( k>=faces[i]->sf->charcnt || k>=256 || faces[i]->sf->chars[k]==NULL ) + putshort(res,1<<12); /* 1 em is default size */ + else + putshort(res,faces[i]->sf->chars[k]->width*(1<<12)/(faces[i]->sf->ascent+faces[i]->sf->descent)); + } + } + + kernloc = 0; + if ( kcnt>0 ) { + kernloc = ftell(res); + putshort(res,kcnt-1); /* Number of styles with kern pairs */ + for ( i=0; i<96; ++i ) if ( faces[i]!=NULL &&( cnt = SFMacAnyKerns(sf))>0 ) { + putshort(res,i); /* style */ + putshort(res,cnt); /* Count of kerning pairs */ + for ( k=0; k<256 && ksf->charcnt; ++k ) if ( faces[i]->sf->chars[k]!=NULL ) { + for ( kp=faces[i]->sf->chars[k]->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc->enc<256 ) { + putc(k,res); + putc(kp->sc->enc,res); + putshort(res,kp->off*(1<<12)/(sf->ascent+sf->descent)); + } + } + } + } + + /* Fontographer referenced a postscript font even in truetype FONDs */ + styleloc = ftell(res); + + exact = false; + familyname = psfaces[0]->sf->fontname; + famlen = strlen(familyname); + if ( (pt=strchr(familyname,'-'))!=NULL ) + famlen = pt-familyname; + else if ( strnmatch(psfaces[0]->sf->familyname,psfaces[0]->sf->fontname, + strlen(psfaces[0]->sf->familyname))==0 ) + famlen = strlen(psfaces[0]->sf->familyname); + has_hyphen = (familyname[famlen]=='-'); + for ( i=pscnt=0; i<48; ++i ) if ( psfaces[i]!=NULL ) { + ++pscnt; + if ( strncmp(psfaces[i]->sf->fontname,familyname,famlen)!=0 ) { + while ( famlen>0 ) { + --famlen; + if ( strncmp(psfaces[i]->sf->fontname,familyname,famlen)==0 ) + break; + } + } + } + if ( famlen!=0 ) for ( i=0; i<48; ++i ) if ( psfaces[i]!=NULL ) { + if ( psfaces[i]->sf->fontname[famlen]==0 ) + exact = true; + } + fontclass = 0x1; + if ( psfaces[psf_outline]==NULL ) fontclass |= 4; + if ( psfaces[psf_bold]!=NULL ) fontclass |= 0x18; + if ( psfaces[psf_italic]!=NULL ) fontclass |= 0x40; + if ( psfaces[psf_condense]!=NULL ) fontclass |= 0x80; + if ( psfaces[psf_extend]!=NULL ) fontclass |= 0x100; + putshort(res,fontclass); /* fontClass */ + geoffset = ftell(res); + putlong(res,0); /* Offset to glyph encoding table */ /* Fill in later */ + putlong(res,0); /* Reserved, MBZ */ + strcnt = 1/* Family Name */ + pscnt-exact /* count of format strings */ + + has_hyphen + + pscnt-exact /* count of additional strings */; + /* indeces to format strings */ + for ( i=0,pscnt=2; i<48; ++i ) + if ( psfaces[i]!=NULL && psfaces[i]->sf->fontname[famlen]!=0 ) + putc(pscnt++,res); + else if ( exact ) + putc(1,res); + else + putc(2,res); + putshort(res,strcnt); /* strcnt strings */ + putpnsstring(res,familyname,famlen); + if ( has_hyphen ) has_hyphen = pscnt++; /* Space for hyphen if present */ + /* Now the format strings */ + for ( i=0; i<48; ++i ) if ( psfaces[i]!=NULL ) { + if ( psfaces[i]->sf->fontname[famlen]!=0 ) { + if ( has_hyphen && psfaces[i]->sf->fontname[famlen]==' ' ) { + putc(2,res); + putc(has_hyphen,res); + putc(pscnt++,res); + } else { + putc(1,res); /* Familyname with the following */ + putc(pscnt++,res); + } + } + } + if ( has_hyphen ) { + putc(1,res); + putc('-',res); + } + /* Now the additional names */ + for ( i=0; i<48; ++i ) if ( psfaces[i]!=NULL ) { + if ( psfaces[i]->sf->fontname[famlen]!=0 ) + putpsstring(res,psfaces[i]->sf->fontname+famlen); + } + /* Greg: record offset for glyph encoding table */ + /* We assume that the bitmap and postscript fonts are encoded similarly */ + /* and so a null vector will do. */ + /* GWW: Hmm. ATM refuses to use postscript fonts that have */ + /* glyph encoding tables. Printer drivers use them ok. ATM will only */ + /* work on fonts with mac roman encodings */ + if ( psfaces[0]->sf->encoding_name!=em_mac ) { + if ( format==ff_pfbmacbin ) + GWidgetPostNoticeR(_STR_NoATM,_STR_BadEncodingForATM); + glyphenc = ftell( res ); + fseek(res,geoffset,SEEK_SET); + putlong(res,glyphenc-geoffset+2); + fseek(res,glyphenc,SEEK_SET); + putshort(res,0); /* Greg: an empty Glyph encoding table */ + } + + end = ftell(res); + fseek(res,widoffpos,SEEK_SET); + putlong(res,widoffloc-rlenpos-4); /* Fill in width offset */ + putlong(res,kernloc!=0?kernloc-rlenpos-4:0); /* Fill in kern offset */ + putlong(res,styleloc!=0?styleloc-rlenpos-4:0); /* Fill in style offset */ + + fseek(res,rlenpos,SEEK_SET); + putlong(res,end-rlenpos-4); /* resource length */ + fseek(res,end,SEEK_SET); +return(rlenpos); +} + +/* I presume this routine is called after all resources have been written */ +static void DumpResourceMap(FILE *res,struct resourcetype *rtypes,enum fontformat format) { + uint32 rfork_base = format>=ff_ttfdfont?0:128; /* space for mac binary header */ + uint32 resource_base = rfork_base+0x100; + uint32 rend, rtypesstart, mend, namestart; + int i,j; + + fseek(res,0,SEEK_END); + rend = ftell(res); + + if ( format>16)&0xff, res ); + putc( ((rtypes[i].res[j].pos-resource_base)>>8)&0xff, res ); + putc( ((rtypes[i].res[j].pos-resource_base)&0xff), res ); + putlong(res,0); + } + } + namestart = ftell(res); + /* Now the names, if any */ + for ( i=0; rtypes[i].tag!=0; ++i ) { + for ( j=0; rtypes[i].res[j].pos!=0; ++j ) { + if ( rtypes[i].res[j].name!=NULL ) { + rtypes[i].res[j].nameloc = ftell(res); + putc(strlen(rtypes[i].res[j].name),res); /* Length */ + fwrite(rtypes[i].res[j].name,1,strlen(rtypes[i].res[j].name),res); + } + } + } + mend = ftell(res); + + /* Repeat the rtypes list now we know where they go */ + fseek(res,rtypesstart+2,SEEK_SET); /* skip over the count */ + for ( i=0; rtypes[i].tag!=0; ++i ) { + putlong(res,rtypes[i].tag); /* Resource type */ + for ( j=0; rtypes[i].res[j].pos!=0; ++j ); + putshort(res,j-1); /* Number of resources of this type */ + putshort(res,rtypes[i].resloc-rtypesstart); + } + /* And go back and fixup any name pointers */ + for ( i=0; rtypes[i].tag!=0; ++i ) { + for ( j=0; rtypes[i].res[j].pos!=0; ++j ) { + if ( rtypes[i].res[j].name!=NULL ) { + fseek(res,rtypes[i].res[j].nameptloc,SEEK_SET); + putshort(res,rtypes[i].res[j].nameloc-namestart); + } + } + } + + fseek(res,rend,SEEK_SET); + /* Fixup duplicate header (and offset to the name list) */ + if ( formatmacfilename==NULL ) { + char *pt = strrchr(mb->binfilename,'/'); + if ( pt==NULL ) pt = mb->binfilename; + else ++pt; + strcpy(buffer,pt); + dpt = strrchr(buffer,'.'); + if ( dpt==NULL ) { + buffer[0] = '_'; + strcpy(buffer+1,pt); + } else + *dpt = '\0'; + mb->macfilename = buffer; + buffer[63] = '\0'; + } + + memset(header,'\0',sizeof(header)); + hpt = header; + *hpt++ = '\0'; /* version number */ + /* Mac Filename */ + pt = mb->macfilename; + *hpt++ = strlen( pt ); + while ( *pt ) + *hpt++ = *pt++; + while ( hpttype>>24; *hpt++ = mb->type>>16; *hpt++ = mb->type>>8; *hpt++ = mb->type; + /* Mac Creator */ + *hpt++ = mb->creator>>24; *hpt++ = mb->creator>>16; *hpt++ = mb->creator>>8; *hpt++ = mb->creator; + *hpt++ = '\0'; /* No finder flags set */ + *hpt++ = '\0'; /* (byte 74) MBZ */ + *hpt++ = '\0'; *hpt++ = '\0'; /* Vert Position in folder */ + *hpt++ = '\0'; *hpt++ = '\0'; /* Hor Position in folder */ + *hpt++ = '\0'; *hpt++ = '\0'; /* window or folder id??? */ + *hpt++ = '\0'; /* protected bit ??? */ + *hpt++ = '\0'; /* (byte 82) MBZ */ + /* Data fork length */ + *hpt++ = '\0'; *hpt++ = '\0'; *hpt++ = '\0'; *hpt++ = '\0'; + /* Resource fork length */ + fseek(res,0,SEEK_END); + len = ftell(res)-sizeof(header); + *hpt++ = len>>24; *hpt++ = len>>16; *hpt++ = len>>8; *hpt++ = len; + /* Pad resource fork to be a multiple of 128 bytes */ + while ( (len&127)!=0 ) + { putc('\0',res); ++len; } + + /* Creation time, (seconds from 1/1/1904) */ + time(&now); + /* convert from 1970 based time to 1904 based time */ + now += (1970-1904)*365L*24*60*60; + for ( i=1904; i<1970; i+=4 ) + now += 24*60*60; + /* Ignore any leap seconds */ + *hpt++ = now>>24; *hpt++ = now>>16; *hpt++ = now>>8; *hpt++ = now; + /* Modification time, (seconds from 1/1/1904) */ + *hpt++ = now>>24; *hpt++ = now>>16; *hpt++ = now>>8; *hpt++ = now; + + *hpt++ = '\0'; *hpt++ = '\0'; /* Get Info comment length */ + *hpt++ = 0; /* More finder flags */ + +/* MacBinary 3 */ + memcpy(header+102,"mBIN",4); + header[106] = 0; /* Script. I assume 0 is latin */ + header[107] = 0; /* extended finder flags */ +/* End of MacBinary 3 */ + header[122] = 130; /* MacBinary version 3, written in (129 is MB2) */ + header[123] = 129; /* MacBinary Version 2, needed to read */ + + crc = binhex_crc(header,124); + header[124] = crc>>8; + header[125] = crc; + + fseek(res,0,SEEK_SET); + fwrite(header,1,sizeof(header),res); +return( true ); +#else + int ret; + FSRef ref; + FSSpec spec; + short macfile; + char *buf, *dirname, *pt, *fname; + Str255 damnthemac; + FSCatalogInfo info; + long len; + /* When on the mac let's just create a real resource fork. We do this by */ + /* creating a mac file with a resource fork, opening that fork, and */ + /* dumping all the data in the temporary file after the macbinary header */ + + /* The mac file routines are really lovely. I can't convert a pathspec to */ + /* an FSRef unless the file exists. So I can't get an FSSpec to create */ + /* the file with. That is incredibly stupid and annoying of them */ + /* But the directory should exist... */ + fname = mb->macfilename?mb->macfilename:mb->binfilename; + dirname = copy(fname); + pt = strrchr(dirname,'/'); + if ( pt==NULL ) +return( false ); + pt[1] = '\0'; + ret=FSPathMakeRef( (uint8 *) dirname,&ref,NULL); + free(dirname); + if ( ret!=noErr ) +return( false ); + if ( FSGetCatalogInfo(&ref,kFSCatInfoNodeID,&info,NULL,&spec,NULL)!=noErr ) +return( false ); + pt = strrchr(fname,'/')+1; + damnthemac[0] = strlen(pt); + strncpy( (char *) damnthemac+1,pt,damnthemac[0]); + if ( (ret=FSMakeFSSpec(spec.vRefNum,info.nodeID,damnthemac,&spec))!=noErr && + ret!=fnfErr ) +return( false ); + FSpCreateResFile(&spec,mb->creator,mb->type,smSystemScript); + /* The header files say this returns void. I'd expect errors like dupFNErr, but appearently not */ + if ( FSpOpenRF(&spec,fsWrPerm,&macfile)!=noErr ) +return( false ); + SetEOF(macfile,0); /* Truncate it just in case it existed... */ + fseek(res,128,SEEK_SET); /* Everything after the mac binary header in */ + /* the temp file is resource fork */ + buf = galloc(8*1024); + while ( (len=fread(buf,1,8*1024,res))>0 ) + FSWrite(macfile,&len,buf); + FSClose(macfile); + free(buf); +return( true ); +#endif +} + +static void WriteDummyMacHeaders(FILE *res) { + /* Leave space for the mac binary header (128bytes) and the mac resource */ + /* file header (256 bytes) */ + int i; + for ( i=0; i<128; ++i ) + putc(0,res); + for ( i=0; i<256; ++i ) + putc(0,res); +} + +static void WriteDummyDFontHeaders(FILE *res) { + /* Leave space for the mac resource file header (256 bytes) */ + /* dfonts have the format of a data fork resource file (which I've never */ + /* seen documented, but appears to be just like a resource fork except */ + /* the first 16 bytes are not duplicated at the map */ + int i; + for ( i=0; i<256; ++i ) + putc(0,res); +} + + /* The mac has rules about what the filename should be for a postscript*/ + /* font. If you deviate from those rules the font will not be found */ + /* The font name must begin with a capital letter */ + /* The filename is designed by modifying the font name */ + /* After the initial capital there can be at most 4 lower case letters (or digits) */ + /* in the filename, any additional lc letters (or digits) in the fontname are ignored */ + /* Every subsequent capital will be followed by at most 2 lc letters */ + /* special characters ("-$", etc.) are removed entirely */ + /* So Times-Bold => TimesBol, HelveticaDemiBold => HelveDemBol */ + /* MacBinary limits the name to 63 characters, I dunno what happens if */ + /* we excede that */ +static void MakeMacPSName(char buffer[63],SplineFont *sf) { + char *pt, *spt, *lcpt; + + for ( pt = buffer, spt = sf->fontname; *spt && ptfontname ) { + *pt++ = *spt; + lcpt = (spt==sf->fontname?spt+5:spt+3); + } else if ( (islower(*spt) || isdigit(*spt)) && spt TimesBol, HelveticaDemiBold => HelveDemBol */ + /* MacBinary limits the name to 63 characters, I dunno what happens if */ + /* we excede that */ + if ( islower(*sf->fontname)) { *sf->fontname = toupper(*sf->fontname); lcfn = true; } + if ( islower(*sf->familyname)) { *sf->familyname = toupper(*sf->familyname); lcfam = true; } + MakeMacPSName(buffer,sf); + + ret = _WritePSFont(temppfb,sf,ff_pfb,flags); + if ( lcfn ) *sf->fontname = tolower(*sf->fontname); + if ( lcfam ) *sf->familyname = tolower(*sf->familyname); + if ( ret==0 || ferror(temppfb) ) { + fclose(temppfb); +return( 0 ); + } + + if ( __Mac && format==ff_pfbmacbin ) + res = tmpfile(); + else + res = fopen(filename,"wb+"); + if ( res==NULL ) { + fclose(temppfb); +return( 0 ); + } + + WriteDummyMacHeaders(res); + memset(resources,'\0',sizeof(resources)); + rewind(temppfb); + + resources[0].tag = CHR('P','O','S','T'); + resources[0].res = PSToResources(res,temppfb); + fclose(temppfb); + DumpResourceMap(res,resources,format); + free( resources[0].res ); + +#if __Mac + header.macfilename = galloc(strlen(filename)+strlen(buffer)+1); + strcpy(header.macfilename,filename); + pt = strrchr(header.macfilename,'/'); + if ( pt==NULL ) pt=header.macfilename-1; + strcpy(pt+1,buffer); +#else + header.macfilename = buffer; +#endif + /* Adobe uses a creator of ASPF (Adobe Systems Postscript Font I assume) */ + /* Fontographer uses ACp1 (Altsys Corp. Postscript type 1???) */ + /* Both include an FREF, BNDL, ICON* and comment */ + /* I shan't bother with that... It'll look ugly with no icon, but oh well */ + header.type = CHR('L','W','F','N'); + header.creator = CHR('G','W','p','1'); + ret = DumpMacBinaryHeader(res,&header); + if ( ferror(res) ) ret = 0; + if ( fclose(res)==-1 ) ret = 0; +#if __Mac + free(header.macfilename); +#endif +return( ret ); +} + +int WriteMacTTFFont(char *filename,SplineFont *sf,enum fontformat format, + int32 *bsizes, enum bitmapformat bf,int flags) { + FILE *res, *tempttf; + int ret = 1, r; + struct resourcetype resources[4]; + struct resource rlist[3][2], *dummynfnts=NULL; + struct macbinaryheader header; + + tempttf = tmpfile(); + if ( tempttf==NULL ) +return( 0 ); + + if ( _WriteTTFFont(tempttf,sf,format==ff_none?ff_none: + format==ff_ttfmacbin?ff_ttf: + format-1,bsizes,bf,flags)==0 || ferror(tempttf) ) { + fclose(tempttf); +return( 0 ); + } + if ( bf!=bf_ttf && bf!=bf_sfnt_dfont ) + bsizes = NULL; /* as far as the FOND for the truetype is concerned anyway */ + + if ( __Mac && format==ff_ttfmacbin ) + res = tmpfile(); + else + res = fopen(filename,"wb+"); + if ( res==NULL ) { + fclose(tempttf); +return( 0 ); + } + + if ( format!=ff_ttfmacbin ) + WriteDummyDFontHeaders(res); + else + WriteDummyMacHeaders(res); + memset(rlist,'\0',sizeof(rlist)); + memset(resources,'\0',sizeof(resources)); + rewind(tempttf); + + r = 0; + resources[r].tag = CHR('s','f','n','t'); + resources[r++].res = rlist[0]; + rlist[0][0].pos = TTFToResource(res,tempttf); + rlist[0][0].id = HashToId(sf->fontname,sf); + rlist[0][0].flags = 0x00; /* sfnts generally have resource flags 0x20 */ + if ( bsizes!=NULL ) { + resources[r].tag = CHR('N','F','N','T'); + resources[r++].res = dummynfnts = BuildDummyNFNTlist(res,sf,bsizes,rlist[0][0].id); + } + resources[r].tag = CHR('F','O','N','D'); + resources[r].res = rlist[1]; + rlist[1][0].pos = SFToFOND(res,sf,rlist[0][0].id,true,bsizes); + rlist[1][0].flags = 0x00; /* I've seen FONDs with resource flags 0, 0x20, 0x60 */ + rlist[1][0].id = rlist[0][0].id; + rlist[1][0].name = sf->familyname; + fclose(tempttf); + DumpResourceMap(res,resources,format); + free(dummynfnts); + + ret = true; + if ( format==ff_ttfmacbin ) { + header.macfilename = NULL; + header.binfilename = filename; + /* Fontographer uses the old suitcase format for both bitmaps and ttf */ + header.type = CHR('F','F','I','L'); + header.creator = CHR('D','M','O','V'); + ret = DumpMacBinaryHeader(res,&header); + } + if ( ferror(res) ) ret = false; + if ( fclose(res)==-1 ) ret = 0; +return( ret ); +} + +int WriteMacBitmaps(char *filename,SplineFont *sf, int32 *sizes, int is_dfont) { + FILE *res; + int ret = 1; + struct resourcetype resources[3]; + struct resource rlist[2][2]; + struct macbinaryheader header; + char *binfilename, *pt, *dpt; + + /* The filename we've been given is for the outline font, which might or */ + /* might not be stuffed inside a bin file */ + binfilename = galloc(strlen(filename)+strlen(".bmap.dfont")+1); + strcpy(binfilename,filename); + pt = strrchr(binfilename,'/'); + if ( pt==NULL ) pt = binfilename; else ++pt; + dpt = strrchr(pt,'.'); + if ( dpt==NULL ) + dpt = pt+strlen(pt); + else if ( strmatch(dpt,".bin")==0 || strmatch(dpt,".dfont")==0 ) { + *dpt = '\0'; + dpt = strrchr(pt,'.'); + if ( dpt==NULL ) + dpt = pt+strlen(pt); + } + strcpy(dpt,is_dfont?".bmap.dfont":__Mac?".bmap":".bmap.bin"); + + if ( __Mac && !is_dfont ) + res = tmpfile(); + else + res = fopen(binfilename,"wb+"); + if ( res==NULL ) { + free(binfilename); +return( 0 ); + } + + if ( is_dfont ) + WriteDummyDFontHeaders(res); + else + WriteDummyMacHeaders(res); + memset(rlist,'\0',sizeof(rlist)); + memset(resources,'\0',sizeof(resources)); + + resources[0].tag = CHR('N','F','N','T'); + resources[0].res = SFToNFNTs(res,sf,sizes); + resources[1].tag = CHR('F','O','N','D'); + resources[1].res = rlist[1]; + rlist[1][0].id = HashToId(sf->fontname,sf); + rlist[1][0].pos = SFToFOND(res,sf,rlist[1][0].id,false,sizes); + rlist[1][0].name = sf->familyname; + DumpResourceMap(res,resources,is_dfont?ff_ttfdfont:ff_ttfmacbin); + + ret = true; + if ( !is_dfont ) { + header.macfilename = NULL; + header.binfilename = binfilename; + /* Fontographer uses the old suitcase format for both bitmaps and ttf */ + header.type = CHR('F','F','I','L'); + header.creator = CHR('D','M','O','V'); + ret = DumpMacBinaryHeader(res,&header); + } + if ( ferror(res)) ret = false; + if ( fclose(res)==-1 ) ret = 0; + free(resources[0].res); + free(binfilename); +return( ret ); +} + +/* We have to worry about these font formats: + ff_pfbmacbin, ff_ttfmacbin, ff_ttfdfont, ff_otfdfont, ff_otfciddfont, ff_none + bf_ttf, bf_sfnt_dfont, bf_nfntmacbin, + bf_nfntdfont I no long support this. OS/X doesn't support NFNTs so there's no point +*/ + +int WriteMacFamily(char *filename,struct sflist *sfs,enum fontformat format, + enum bitmapformat bf,int flags) { + FILE *res; + int ret = 1, r, i; + struct resourcetype resources[4]; + struct resource rlist[3][2]; + struct macbinaryheader header; + struct sflist *sfi, *sfsub; + char buffer[80]; + int freefilename = 0; + char *pt; + int id; + + if ( format==ff_pfbmacbin ) { + for ( sfi=sfs; sfi!=NULL; sfi = sfi->next ) { + char *tempname; + MakeMacPSName(buffer,sfi->sf); +#if !__Mac + strcat(buffer,".bin"); +#endif + tempname = galloc(strlen(filename)+strlen(buffer)+1); + strcpy(tempname,filename); + pt = strrchr(tempname,'/'); + if ( pt==NULL ) pt=tempname-1; + strcpy(pt+1,buffer); + if ( strcmp(tempname,filename)==0 ) { + char *tf = galloc(strlen(filename)+20); + strcpy(tf,filename); + filename = tf; + freefilename = true; + pt = strrchr(filename,'.'); + if ( pt==NULL || ptsf,format,flags)==0 ) +return( 0 ); + free(tempname); + } + } else if ( format!=ff_none || bf==bf_sfnt_dfont ) { + for ( sfi=sfs; sfi!=NULL; sfi = sfi->next ) { + sfi->tempttf = tmpfile(); + if ( sfi->tempttf==NULL || + _WriteTTFFont(sfi->tempttf,sfi->sf,format==ff_none?ff_none: + format==ff_ttfmacbin?ff_ttf: + format-1,sfi->sizes,bf,flags)==0 || + ferror(sfi->tempttf) ) { + for ( sfsub=sfs; sfsub!=sfi; sfsub=sfsub->next ) + fclose( sfsub->tempttf ); +return( 0 ); + } + rewind(sfi->tempttf); + } + } + + if ( __Mac && (format==ff_ttfmacbin || format==ff_pfbmacbin || + (format==ff_none && bf==bf_nfntmacbin))) + res = tmpfile(); + else + res = fopen(filename,"wb+"); + if ( res==NULL ) { + for ( sfsub=sfs; sfsub!=NULL; sfsub=sfsub->next ) + fclose( sfsub->tempttf ); +return( 0 ); + } + + if ( format==ff_ttfdfont || format==ff_otfdfont || format==ff_otfciddfont || + bf==bf_sfnt_dfont /*|| (format==ff_none && bf==bf_nfntdfont)*/) + WriteDummyDFontHeaders(res); + else + WriteDummyMacHeaders(res); + memset(rlist,'\0',sizeof(rlist)); + memset(resources,'\0',sizeof(resources)); + + id = HashToId(sfs->sf->fontname,sfs->sf); + + r = 0; + if ( format==ff_ttfmacbin || format==ff_ttfdfont || format==ff_otfdfont || + format==ff_otfciddfont || (format==ff_none && bf==bf_sfnt_dfont )) { + resources[r].tag = CHR('s','f','n','t'); + for ( sfi=sfs, i=0; sfi!=NULL; sfi=sfi->next, ++i ); + resources[r].res = gcalloc(i+1,sizeof(struct resource)); + for ( sfi=sfs, i=0; sfi!=NULL; sfi=sfi->next, ++i ) { + resources[r].res[i].pos = TTFToResource(res,sfi->tempttf); + resources[r].res[i].id = sfi->id = id+i; + resources[r].res[i].flags = 0x00; /* sfnts generally have resource flags 0x20 */ + fclose(sfi->tempttf); + } + ++r; + if ( bf==bf_ttf || bf==bf_sfnt_dfont ) { + resources[r].tag = CHR('N','F','N','T'); + resources[r++].res = BuildDummyNFNTfamilyList(res,sfs,id); + } + } + if ( bf==bf_nfntmacbin /*|| bf==bf_nfntdfont */) { + resources[r].tag = CHR('N','F','N','T'); + resources[r++].res = SFsToNFNTs(res,sfs,id); + } + resources[r].tag = CHR('F','O','N','D'); + resources[r].res = rlist[1]; + rlist[1][0].pos = SFsToFOND(res,sfs,id,format,bf); + rlist[1][0].flags = 0x00; /* I've seen FONDs with resource flags 0, 0x20, 0x60 */ + rlist[1][0].id = id; + rlist[1][0].name = sfs->sf->familyname; + DumpResourceMap(res,resources,format!=ff_none?format: + bf==bf_nfntmacbin?ff_ttfmacbin:ff_ttfdfont); + for ( i=0; inext ) { + free( sfi->ids ); + free( sfi->bdfs ); + } +return( ret ); +} + +void SfListFree(struct sflist *sfs) { + struct sflist *sfi; + + while ( sfs!=NULL ) { + sfi = sfs->next; + free(sfs->sizes); + chunkfree(sfs,sizeof(struct sflist)); + sfs = sfi; + } +} + +/* ******************************** Reading ********************************* */ + +static SplineFont *SearchPostscriptResources(FILE *f,long rlistpos,int subcnt,long rdata_pos, + long name_list, int flags) { + long here = ftell(f); + long *offsets, lenpos; + int rname = -1, tmp; + int ch1, ch2; + int len, type, i, rlen; + /* I don't pretend to understand the rational behind the format of a */ + /* postscript font. It appears to be split up into chunks where the */ + /* maximum chunk size is 0x800, each section (ascii, binary, ascii, eof) */ + /* has its own set of chunks (ie chunks don't cross sections) */ + char *buffer=NULL; + int max = 0; + FILE *pfb; + FontDict *fd; + SplineFont *sf; + + fseek(f,rlistpos,SEEK_SET); + offsets = calloc(subcnt,sizeof(long)); + for ( i=0; i>24,pfb); + putc((len>>16)&0xff,pfb); + putc((len>>8)&0xff,pfb); + putc(len&0xff,pfb); + fseek(pfb,hold,SEEK_SET); + if ( ch1==5 ) /* end of font mark */ + break; + putc(0x80,pfb); + putc(ch1,pfb); + lenpos = ftell(pfb); + putc(0,pfb); + putc(0,pfb); + putc(0,pfb); + putc(0,pfb); + type = ch1; + len = rlen; + } + if ( rlen>max ) { + free(buffer); + max = rlen; + if ( max<0x800 ) max = 0x800; + buffer=galloc(max); + if ( buffer==NULL ) { + fprintf( stderr, "Out of memory\n" ); + exit( 1 ); + } + } + fread(buffer,1,rlen,f); + fwrite(buffer,1,rlen,pfb); + } + free(buffer); + free(offsets); + putc(0x80,pfb); + putc(3,pfb); + fseek(pfb,lenpos,SEEK_SET); + putc(len>>24,pfb); + putc((len>>16)&0xff,pfb); + putc((len>>8)&0xff,pfb); + putc(len&0xff,pfb); + fseek(f,here,SEEK_SET); + rewind(pfb); + if ( flags&ttf_onlynames ) +return( (SplineFont *) _NamesReadPostscript(pfb) ); /* This closes the font for us */ + + fd = _ReadPSFont(pfb); + sf = NULL; + if ( fd!=NULL ) { + sf = SplineFontFromPSFont(fd); + PSFontFree(fd); + /* There is no FOND in a postscript file, so we can't read any kerning*/ + } + fclose(pfb); +return( sf ); +} + +static SplineFont *SearchTtfResources(FILE *f,long rlistpos,int subcnt,long rdata_pos, + long name_list,char *filename,int flags) { + long here, start = ftell(f); + long roff; + int rname = -1; + int ch1, ch2; + int len, i, rlen, ilen; + /* The sfnt resource is just a copy of the ttf file */ + char *buffer=NULL; + int max = 0; + FILE *ttf; + SplineFont *sf; + int which = 0; + unichar_t **names; + char *pt,*lparen; + char *chosenname=NULL; + + fseek(f,rlistpos,SEEK_SET); + if ( subcnt>1 || (flags&ttf_onlynames) ) { + names = gcalloc(subcnt,sizeof(unichar_t *)); + for ( i=0; i=0; --which ) + if ( uc_strcmp(names[which],find)==0 ) + break; + if ( which==-1 ) { + char *fn = copy(filename); + fn[lparen-filename] = '\0'; + GWidgetErrorR(_STR_NotInCollection,_STR_FontNotInCollection,find,fn); + free(fn); + } + free(find); + } else if ( screen_display==NULL ) + which = 0; + else + which = GWidgetChoicesR(_STR_PickFont,(const unichar_t **) names,subcnt,0,_STR_MultipleFontsPick); + if ( lparen==NULL && which!=-1 ) + chosenname = cu_copy(names[which]); + for ( i=0; i16*1024 ) + ilen = 16*1024; + if ( ilen>max ) { + free(buffer); + max = ilen; + if ( max<0x800 ) max = 0x800; + buffer=malloc(max); + } + for ( len=0; lenchosenname==NULL ) sf->chosenname = chosenname; +return( sf ); + } + fseek(f,here,SEEK_SET); + } + free(chosenname); + free(buffer); + fseek(f,start,SEEK_SET); +return( NULL ); +} + +typedef struct fond { + char *fondname; + int first, last; + int assoc_cnt; + struct assoc { + short size, style, id; + } *assoc; + /* size==0 => scalable */ + /* style>>8 is the bit depth (0=>1, 1=>2, 2=>4, 3=>8) */ + /* search order for ID is sfnt, NFNT, FONT */ + int stylewidthcnt; + struct stylewidths { + short style; + short *widthtab; /* 4.12 fixed number with the width specified as a fraction of an em */ + } *stylewidths; + int stylekerncnt; + struct stylekerns { + short style; + int kernpairs; + struct kerns { + unsigned char ch1, ch2; + short offset; /* 4.12 */ + } *kerns; + } *stylekerns; + struct fond *next; +} FOND; + +struct MacFontRec { + short fontType; + short firstChar; + short lastChar; + short widthMax; + short kernMax; /* bb learing */ + short Descent; /* maximum negative distance below baseline*/ + short fRectWidth; /* bounding box width */ + short fRectHeight; /* bounding box height */ + unsigned short *offsetWidths;/* offset to start of offset/width table */ + /* 0xffff => undefined, else high byte is offset in locTable, */ + /* low byte is width */ + short ascent; + short descent; + short leading; + short rowWords; /* shorts per row */ + unsigned short *fontImage; /* rowWords*fRectHeight */ + /* Images for all characters plus one extra for undefined */ + unsigned short *locs; /* lastchar-firstchar+3 words */ + /* Horizontal offset to start of n'th character. Note: applies */ + /* to each row. Missing characters have same loc as following */ +}; + +static void FondListFree(FOND *list) { + FOND *next; + int i; + + while ( list!=NULL ) { + next = list->next; + free(list->assoc); + for ( i=0; istylewidthcnt; ++i ) + free(list->stylewidths[i].widthtab); + free(list->stylewidths); + for ( i=0; istylekerncnt; ++i ) + free(list->stylekerns[i].kerns); + free(list->stylekerns); + free(list); + list = next; + } +} + +/* There's probably only one fond in the file, but there could be more so be */ +/* prepared... */ +/* I want the fond: */ +/* to get the fractional widths for the SWIDTH entry on bdf */ +/* to get the font name */ +/* to get the font association tables */ +/* to get the style flags */ +/* http://developer.apple.com/techpubs/mac/Text/Text-269.html */ +static FOND *BuildFondList(FILE *f,long rlistpos,int subcnt,long rdata_pos, + long name_list,int flags) { + long here, start = ftell(f); + long offset; + int rname = -1; + char name[300]; + int ch1, ch2; + int i, j, k, cnt, isfixed; + FOND *head=NULL, *cur; + long widoff, kernoff, styleoff; + + fseek(f,rlistpos,SEEK_SET); + for ( i=0; inext = head; + head = cur; + + if ( rname!=-1 ) { + fseek(f,name_list+rname,SEEK_SET); + ch1 = getc(f); + fread(name,1,ch1,f); + name[ch1] = '\0'; + cur->fondname = strdup(name); + } + + offset += 4; + fseek(f,offset,SEEK_SET); + isfixed = getushort(f)&0x8000?1:0; + /* family id = */ getushort(f); + cur->first = getushort(f); + cur->last = getushort(f); +/* on a 1 point font... */ + /* ascent = */ getushort(f); + /* descent = */ (short) getushort(f); + /* leading = */ getushort(f); + /* widmax = */ getushort(f); + if ( (widoff = getlong(f))!=0 ) widoff += offset; + if ( (kernoff = getlong(f))!=0 ) kernoff += offset; + if ( (styleoff = getlong(f))!=0 ) styleoff += offset; + for ( j=0; j<9; ++j ) + getushort(f); + /* internal & undefined, for international scripts = */ getlong(f); + /* version = */ getushort(f); + cur->assoc_cnt = getushort(f)+1; + cur->assoc = calloc(cur->assoc_cnt,sizeof(struct assoc)); + for ( j=0; jassoc_cnt; ++j ) { + cur->assoc[j].size = getushort(f); + cur->assoc[j].style = getushort(f); + cur->assoc[j].id = getushort(f); + } + if ( widoff!=0 ) { + fseek(f,widoff,SEEK_SET); + cnt = getushort(f)+1; + cur->stylewidthcnt = cnt; + cur->stylewidths = calloc(cnt,sizeof(struct stylewidths)); + for ( j=0; jstylewidths[j].style = getushort(f); + cur->stylewidths[j].widthtab = malloc((cur->last-cur->first+3)*sizeof(short)); + for ( k=cur->first; k<=cur->last+2; ++k ) + cur->stylewidths[j].widthtab[k] = getushort(f); + } + } + if ( kernoff!=0 && (flags&ttf_onlykerns) ) { + fseek(f,kernoff,SEEK_SET); + cnt = getushort(f)+1; + cur->stylekerncnt = cnt; + cur->stylekerns = calloc(cnt,sizeof(struct stylekerns)); + for ( j=0; jstylekerns[j].style = getushort(f); + cur->stylekerns[j].kernpairs = getushort(f); + cur->stylekerns[j].kerns = malloc(cur->stylekerns[j].kernpairs*sizeof(struct kerns)); + for ( k=0; kstylekerns[j].kernpairs; ++k ) { + cur->stylekerns[j].kerns[k].ch1 = getc(f); + cur->stylekerns[j].kerns[k].ch2 = getc(f); + cur->stylekerns[j].kerns[k].offset = getushort(f); + } + } + } + fseek(f,here,SEEK_SET); + } + fseek(f,start,SEEK_SET); +return( head ); +} + +static BDFChar *NFNTCvtBitmap(struct MacFontRec *font,int index,SplineFont *sf) { + BDFChar *bdfc; + int i,j, bits, bite, bit; + + bdfc = chunkalloc(sizeof(BDFChar)); + bdfc->xmin = (font->offsetWidths[index]>>8)+font->kernMax; + bdfc->xmax = bdfc->xmin + font->locs[index+1]-font->locs[index]-1; + bdfc->ymin = -font->descent; + bdfc->ymax = font->ascent-1; + bdfc->width = font->offsetWidths[index]&0xff; + bdfc->bytes_per_line = ((bdfc->xmax-bdfc->xmin)>>3) + 1; + bdfc->bitmap = gcalloc(bdfc->bytes_per_line*font->fRectHeight,sizeof(uint8)); + bdfc->enc = index + font->firstChar; + bdfc->sc = sf->chars[bdfc->enc]; + + bits = font->locs[index]; bite = font->locs[index+1]; + for ( i=0; ifRectHeight; ++i ) { + uint16 *test = font->fontImage + i*font->rowWords; + uint8 *bpt = bdfc->bitmap + i*bdfc->bytes_per_line; + for ( bit=bits, j=0; bit>4]&(0x8000>>(bit&0xf)) ) + bpt[j>>3] |= (0x80>>(j&7)); + } + } + BCCompressBitmap(bdfc); +return( bdfc ); +} + +static void LoadNFNT(FILE *f,long offset, SplineFont *sf, int size) { + long here = ftell(f); + long baseow; + long ow; + int i; + struct MacFontRec font; + BDFFont *bdf; + + offset += 4; /* skip over the length */ + fseek(f,offset,SEEK_SET); + memset(&font,'\0',sizeof(struct MacFontRec)); + font.fontType = getushort(f); + font.firstChar = getushort(f); + font.lastChar = getushort(f); + font.widthMax = getushort(f); + font.kernMax = (short) getushort(f); + font.Descent = (short) getushort(f); + font.fRectWidth = getushort(f); + font.fRectHeight = getushort(f); + baseow = ftell(f); + ow = getushort(f); + font.ascent = getushort(f); + font.descent = getushort(f); + if ( font.Descent>=0 ) { + ow |= (font.Descent<<16); + font.Descent = -font.descent; /* Possibly overkill, but should be safe */ + } + font.leading = getushort(f); + font.rowWords = getushort(f); + if ( font.rowWords!=0 ) { + font.fontImage = calloc(font.rowWords*font.fRectHeight,sizeof(short)); + font.locs = calloc(font.lastChar-font.firstChar+3,sizeof(short)); + font.offsetWidths = calloc(font.lastChar-font.firstChar+3,sizeof(short)); + for ( i=0; isf = sf; + bdf->next = sf->bitmaps; + sf->bitmaps = bdf; + bdf->charcnt = sf->charcnt; + bdf->pixelsize = font.ascent+font.descent; + bdf->chars = gcalloc(sf->charcnt,sizeof(BDFChar *)); + bdf->ascent = font.ascent; + bdf->descent = font.descent; + bdf->encoding_name = sf->encoding_name; + bdf->res = 72; + for ( i=font.firstChar; i<=font.lastChar; ++i ) { + SFMakeChar(sf,i); + bdf->chars[i] = NFNTCvtBitmap(&font,i-font.firstChar,sf); + if ( sf->chars[i]!=NULL && !sf->chars[i]->widthset && bdf->chars[i]!=NULL ) { + sf->chars[i]->width = bdf->chars[i]->width*(sf->ascent+sf->descent)/bdf->pixelsize; + sf->chars[i]->widthset = true; + } + } + + free(font.fontImage); + free(font.locs); + free(font.offsetWidths); +} + +static unichar_t *BuildName(char *family,int style) { + char buffer[350]; + + strncpy(buffer,family,200); + if ( style&sf_bold ) + strcat(buffer,"Bold"); + if ( style&sf_italic ) + strcat(buffer,"Italic"); + if ( style&sf_underline ) + strcat(buffer,"Underline"); + if ( style&sf_outline ) + strcat(buffer,"Outline"); + if ( style&sf_shadow ) + strcat(buffer,"Shadow"); + if ( style&sf_condense ) + strcat(buffer,"Condensed"); + if ( style&sf_extend ) + strcat(buffer,"Extended"); +return( uc_copy(buffer)); +} + +static FOND *PickFOND(FOND *fondlist,char *filename,char **name, int *style) { + int i,j; + FOND *test; + uint8 stylesused[96]; + unichar_t **names; + FOND **fonds, *fond; + int *styles; + int cnt, which; + char *pt, *lparen; + + /* The file may contain multiple families, and each family may contain */ + /* multiple styles (and each style may contain multiple sizes, but that's */ + /* not an issue for us) */ + names = NULL; + for ( i=0; i<2; ++i ) { + cnt = 0; + for ( test=fondlist; test!=NULL; test=test->next ) if ( test->fondname!=NULL ) { + memset(stylesused,0,sizeof(stylesused)); + for ( j=0; jassoc_cnt; ++j ) { + if ( test->assoc[j].size!=0 && !stylesused[test->assoc[j].style]) { + stylesused[test->assoc[j].style]=true; + if ( names!=NULL ) { + names[cnt] = BuildName(test->fondname,test->assoc[j].style); + styles[cnt] = test->assoc[j].style; + fonds[cnt] = test; + } + ++cnt; + } + } + } + if ( names==NULL ) { + names = gcalloc(cnt+1,sizeof(char *)); + fonds = galloc(cnt*sizeof(FOND *)); + styles = galloc(cnt*sizeof(int)); + } + } + + if ((pt = strrchr(filename,'/'))!=NULL ) pt = filename; + if ( (lparen = strchr(filename,'('))!=NULL && strchr(lparen,')')!=NULL ) { + char *find = copy(lparen+1); + pt = strchr(find,')'); + if ( pt!=NULL ) *pt='\0'; + for ( which=cnt-1; which>=0; --which ) + if ( uc_strcmp(names[which],find)==0 ) + break; + if ( which==-1 ) { + char *fn = copy(filename); + fn[lparen-filename] = '\0'; + GWidgetErrorR(_STR_NotInCollection,_STR_FontNotInCollection,find,fn); + free(fn); + } + free(find); + } else if ( cnt==1 ) + which = 0; + else if ( screen_display==NULL ) + which = 0; + else + which = GWidgetChoicesR(_STR_PickFont,(const unichar_t **) names,cnt,0,_STR_MultipleFontsPick); + + if ( which!=-1 ) { + fond = fonds[which]; + *name = cu_copy(names[which]); + *style = styles[which]; + } + for ( i=0; iassoc_cnt; ++i ) { + if ( fond->assoc[j].style==style && fond->assoc[j].size>biggest ) { + biggest = fond->assoc[j].size; + find_id = fond->assoc[j].id; + } + } + } + + sf = SplineFontBlank(em_mac,256); + free(sf->fontname); sf->fontname = name; + free(sf->familyname); sf->familyname = copy(fond->fondname); + free(sf->fullname); sf->fullname = copy(name); + free(sf->origname); sf->origname = NULL; + if ( style & sf_bold ) { + free(sf->weight); sf->weight = copy("Bold"); + } + free(sf->copyright); sf->copyright = NULL; + free(sf->comments); sf->comments = NULL; + + for ( i=0; istylewidthcnt; ++i ) { + if ( fond->stylewidths[i].style == style ) { + short *widths = fond->stylewidths[i].widthtab; + for ( j=fond->first; j<=fond->last; ++j ) { + sf->chars[j] = SFMakeChar(sf,j); + sf->chars[j]->width = ((widths[j-fond->first]*1000L+(1<<11))>>12); + } + } + } + + fseek(f,rlistpos,SEEK_SET); + for ( i=0; iassoc_cnt-1; j>=0; --j ) + if ( (find_id!=-1 && res_id==find_id) || + ( fond->assoc[j].style==style && fond->assoc[j].id==res_id && + fond->assoc[j].size!=0 ) ) + LoadNFNT(f,roff,sf,fond->assoc[j].size); + } + fseek(f,start,SEEK_SET); + + sf->onlybitmaps = true; + SFOrderBitmapList(sf); +return( sf ); +} + +/* Look for kerning info and merge it into the currently existing font "into" */ +static SplineFont *FindFamilyStyleKerns(SplineFont *into,FOND *fondlist,char *filename) { + char *name; + int style; + FOND *fond; + int i,j; + int ch1, ch2, offset; + KernPair *kp; + SplineChar *sc1, *sc2; + + fond = PickFOND(fondlist,filename,&name,&style); + if ( fond==NULL || into==NULL ) +return( NULL ); + for ( i=0; istylekerncnt; ++i ) + if ( fond->stylekerns[i].style==style ) + break; + if ( i==fond->stylekerncnt ) { + fprintf(stderr,"No kerning table for %s\n", name ); + free(name); +return( NULL ); + } + for ( j=0; jstylekerns[i].kernpairs; ++j ) { + ch1 = fond->stylekerns[i].kerns[j].ch1; + ch2 = fond->stylekerns[i].kerns[j].ch2; + offset = (fond->stylekerns[i].kerns[j].offset*(into->ascent+into->descent)+(1<<11))>>12; + sc1 = SFMakeChar(into,ch1); + sc2 = SFMakeChar(into,ch2); + for ( kp=sc1->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc==sc2 ) + break; + if ( kp==NULL ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = sc2; + kp->next = sc1->kerns; + sc1->kerns = kp; + } + kp->off = offset; + } +return( into ); +} + +/* Look for a bare truetype font in a binhex/macbinary wrapper */ +static SplineFont *MightBeTrueType(FILE *binary,int32 pos,int32 dlen,int flags) { + FILE *temp = tmpfile(); + char *buffer = galloc(8192); + int len; + SplineFont *sf; + + if ( flags&ttf_onlynames ) { + char **ret; + unichar_t *utemp = TTFGetFontName(binary,pos,pos); + if ( utemp==NULL ) +return( NULL ); + ret = galloc(2*sizeof(char *)); + ret[0] = cu_copy(utemp); + ret[1] = NULL; +return( (SplineFont *) ret ); + } + + fseek(binary,pos,SEEK_SET); + while ( dlen>0 ) { + len = dlen > 8192 ? 8192 : dlen; + len = fread(buffer,1,dlen > 8192 ? 8192 : dlen,binary); + if ( len==0 ) + break; + fwrite(buffer,1,len,temp); + dlen -= len; + } + rewind(temp); + sf = _SFReadTTF(temp,flags,NULL); + fclose(temp); + free(buffer); +return( sf ); +} + +static SplineFont *IsResourceFork(FILE *f, long offset,char *filename,int flags, + SplineFont *into) { + /* If it is a good resource fork then the first 16 bytes are repeated */ + /* at the location specified in bytes 4-7 */ + /* We include an offset because if we are looking at a mac binary file */ + /* the resource fork will actually start somewhere in the middle of the */ + /* file, not at the beginning */ + unsigned char buffer[16], buffer2[16]; + long rdata_pos, map_pos, type_list, name_list, rpos; + int32 rdata_len, map_len; + uint32 nfnt_pos, font_pos, fond_pos; + unsigned long tag; + int i, cnt, subcnt, nfnt_subcnt=0, font_subcnt=0, fond_subcnt; + SplineFont *sf; + FOND *fondlist=NULL; + + fseek(f,offset,SEEK_SET); + if ( fread(buffer,1,16,f)!=16 ) +return( NULL ); + rdata_pos = offset + ((buffer[0]<<24)|(buffer[1]<<16)|(buffer[2]<<8)|buffer[3]); + map_pos = offset + ((buffer[4]<<24)|(buffer[5]<<16)|(buffer[6]<<8)|buffer[7]); + rdata_len = ((buffer[8]<<24)|(buffer[9]<<16)|(buffer[10]<<8)|buffer[11]); + map_len = ((buffer[12]<<24)|(buffer[13]<<16)|(buffer[14]<<8)|buffer[15]); + if ( rdata_pos+rdata_len!=map_pos || rdata_len==0 ) +return( NULL ); + fseek(f,map_pos,SEEK_SET); + buffer2[15] = buffer[15]+1; /* make it be different */ + if ( fread(buffer2,1,16,f)!=16 ) +return( NULL ); + +/* Apple's data fork resources appear to have a bunch of zeroes here instead */ +/* of a copy of the first 16 bytes */ + for ( i=0; i<16; ++i ) + if ( buffer2[i]!=0 ) + break; + if ( i!=16 ) { + for ( i=0; i<16; ++i ) + if ( buffer[i]!=buffer2[i] ) +return( NULL ); + } + getlong(f); /* skip the handle to the next resource map */ + getushort(f); /* skip the file resource number */ + getushort(f); /* skip the attributes */ + type_list = map_pos + getushort(f); + name_list = map_pos + getushort(f); + + fseek(f,type_list,SEEK_SET); + cnt = getushort(f)+1; + for ( i=0; i>24, (tag>>16)&0xff, (tag>>8)&0xff, tag&0xff );*/ + subcnt = getushort(f)+1; + rpos = type_list+getushort(f); + sf = NULL; + if ( tag==CHR('P','O','S','T') && !(flags&(ttf_onlystrikes|ttf_onlykerns))) /* No FOND */ + sf = SearchPostscriptResources(f,rpos,subcnt,rdata_pos,name_list,flags); + else if ( tag==CHR('s','f','n','t') && !(flags&ttf_onlykerns)) + sf = SearchTtfResources(f,rpos,subcnt,rdata_pos,name_list,filename,flags); + else if ( tag==CHR('N','F','N','T') ) { + nfnt_pos = rpos; + nfnt_subcnt = subcnt; + } else if ( tag==CHR('F','O','N','T') ) { + font_pos = rpos; + font_subcnt = subcnt; + } else if ( tag==CHR('F','O','N','D') ) { + fond_pos = rpos; + fond_subcnt = subcnt; + } + if ( sf!=NULL ) +return( sf ); + } + if ( flags&ttf_onlynames ) /* Not interested in bitmap resources here */ +return( NULL ); + + if ( flags&ttf_onlykerns ) { /* For kerns */ + if ( fond_subcnt!=0 ) + fondlist = BuildFondList(f,fond_pos,fond_subcnt,rdata_pos,name_list,flags); + into = FindFamilyStyleKerns(into,fondlist,filename); + FondListFree(fondlist); +return( into ); + } + /* Ok. If no outline font, try for a bitmap */ + if ( nfnt_subcnt==0 ) { + nfnt_pos = font_pos; + nfnt_subcnt = font_subcnt; + } + if ( nfnt_subcnt!=0 ) { + if ( fond_subcnt!=0 ) + fondlist = BuildFondList(f,fond_pos,fond_subcnt,rdata_pos,name_list,flags); + sf = SearchBitmapResources(f,nfnt_pos,nfnt_subcnt,rdata_pos,name_list, + filename,fondlist,flags); + FondListFree(fondlist); + if ( sf!=NULL ) +return( sf ); + } +return( (SplineFont *) -1 ); /* It's a valid resource file, but just has no fonts */ +} + +#if __Mac +static SplineFont *HasResourceFork(char *filename,int flags,SplineFont *into) { + /* If we're on a mac, we can try to see if we've got a real resource fork */ + /* (if we do, copy it into a temporary data file and then manipulate that)*/ + FSRef ref; + FSSpec spec; + short res, err; + int iret; + long cnt; + SplineFont *ret; + FILE *temp; + char *buf; + char *tempfn=filename, *pt, *lparen; + + if (( pt=strrchr(filename,'/'))==NULL ) pt = filename; + if ( (lparen = strchr(pt,'('))!=NULL && strchr(lparen,')')!=NULL ) { + tempfn = copy(filename); + tempfn[lparen-filename] = '\0'; + } + + iret = FSPathMakeRef( (uint8 *) tempfn,&ref,NULL); + if ( tempfn!=filename ) + free(tempfn); + if ( iret!=noErr ) +return( NULL ); + if ( FSGetCatalogInfo(&ref,0,NULL,NULL,&spec,NULL)!=noErr ) +return( NULL ); + if ( FSpOpenRF(&spec,fsRdPerm,&res)!=noErr ) +return( NULL ); + temp = tmpfile(); + buf = malloc(8192); + while ( 1 ) { + cnt = 8192; + err = FSRead(res,&cnt,buf); + if ( cnt!=0 ) + fwrite(buf,1,cnt,temp); + if ( err==eofErr ) + break; + if ( err!=noErr ) + break; + } + free(buf); + FSClose(res); + rewind(temp); + ret = IsResourceFork(temp,0,filename,flags,into); + fclose(temp); +return( ret ); +} +#endif + +static SplineFont *IsResourceInBinary(FILE *f,char *filename,int flags,SplineFont *into) { + unsigned char header[128]; + unsigned long offset, dlen, rlen; + + if ( fread(header,1,128,f)!=128 ) +return( NULL ); + if ( header[0]!=0 || header[74]!=0 || header[82]!=0 || header[1]<=0 || + header[1]>33 || header[63]!=0 || header[2+header[1]]!=0 ) +return( NULL ); + dlen = ((header[0x53]<<24)|(header[0x54]<<16)|(header[0x55]<<8)|header[0x56]); + rlen = ((header[0x57]<<24)|(header[0x58]<<16)|(header[0x59]<<8)|header[0x5a]); + /* 128 bytes for header, then the dlen is padded to a 128 byte boundary */ + offset = 128 + ((dlen+127)&~127); +/* Look for a bare truetype font in a binhex/macbinary wrapper */ + if ( dlen!=0 && rlen<=dlen) { + int pos = ftell(f); + fread(header,1,4,f); + header[5] = '\0'; + if ( strcmp((char *) header,"OTTO")==0 || strcmp((char *) header,"true")==0 || + strcmp((char *) header,"ttcf")==0 || + (header[0]==0 && header[1]==1 && header[2]==0 && header[3]==0)) +return( MightBeTrueType(f,pos,dlen,flags)); + } +return( IsResourceFork(f,offset,filename,flags,into)); +} + +static int lastch=0, repeat = 0; +static void outchr(FILE *binary, int ch) { + int i; + + if ( repeat ) { + if ( ch==0 ) { + /* no repeat, output a literal 0x90 (the repeat flag) */ + lastch=0x90; + putc(lastch,binary); + } else { + for ( i=1; i>16)&0xff); + outchr(binary,(val>>8)&0xff); + outchr(binary,val&0xff); + val = cnt = 0; + } + } + if ( cnt!=0 ) { + if ( cnt==1 ) + outchr(binary,val<<2); + else if ( cnt==2 ) { + val<<=4; + outchr(binary,(val>>8)&0xff); + outchr(binary,val&0xff); + } else if ( cnt==3 ) { + val<<=6; + outchr(binary,(val>>16)&0xff); + outchr(binary,(val>>8)&0xff); + outchr(binary,val&0xff); + } + } + + rewind(binary); + ch = getc(binary); /* Name length */ + /* skip name */ + for ( i=0; i8 || strlen(dpt)>4 ) { + char exten[8]; + strncpy(exten,dpt,7); + exten[4] = '\0'; /* it includes the dot */ + if ( dpt-spt>6 ) + dpt = spt+6; + *dpt++ = '~'; + *dpt++ = '1'; + strcpy(dpt,exten); + } +return( IsResourceInFile(buffer,flags,into)); +} + +SplineFont *SFReadMacBinary(char *filename,int flags) { + SplineFont *sf = FindResourceFile(filename,flags,NULL); + + if ( sf==NULL ) + fprintf( stderr, "Couldn't find a font file named %s\n", filename ); + else if ( sf==(SplineFont *) (-1) ) { + fprintf( stderr, "%s is a mac resource file but contains no postscript or truetype fonts\n", filename ); + sf = NULL; + } +return( sf ); +} + +int LoadKerningDataFromMacFOND(SplineFont *sf, char *filename) { + if ( FindResourceFile(filename,ttf_onlykerns,sf)==NULL ) +return ( false ); + +return( true ); +} + +char **NamesReadMacBinary(char *filename) { +return( (char **) FindResourceFile(filename,ttf_onlynames,NULL)); +} diff --git a/fontforge/macenc.c b/fontforge/macenc.c new file mode 100644 index 00000000..bb916d0f --- /dev/null +++ b/fontforge/macenc.c @@ -0,0 +1,3391 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include + +/* + The original data for these mappings may be found at + http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/ + unfortunately this site does not contain all the macintosh encodings + so we leave some blank +*/ +/* Response (indirectly) from charsets@apple.com when asked about the missing + encodings: + + > I don't believe any of those additional scripts are actually + > defined as character encodings. He can safely ignore anything + > that's not in the Apple folder on the Unicode site. + > + > I monitor charsets@apple.com and don't recall seeing any e-mail + > on this subject. It's possible it got lost in the voluminous + > spam the address receives. + > + > Deborah + I find this perplexing (unless the script is defined but unused, how can + it fail to have a defined encoding), but will accept it. +*/ + +/* Macintosh 1 byte encodings */ +static unichar_t arabic[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00a0, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x06ba, 0x00ab, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x2026, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00bb, 0x00f4, 0x00f6, 0x00f7, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x060c, 0x002d, 0x002e, 0x002f, + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, + 0x0668, 0x0669, 0x003a, 0x061b, 0x003c, 0x003d, 0x003e, 0x061f, + 0x274a, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + 0x0650, 0x0651, 0x0652, 0x067e, 0x0679, 0x0686, 0x06d5, 0x06a4, + 0x06af, 0x0688, 0x0691, 0x007b, 0x007c, 0x007d, 0x0698, 0x06d2 +}; + +static unichar_t centeuro[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x0100, 0x0101, 0x00c9, 0x0104, 0x00d6, 0x00dc, 0x00e1, + 0x0105, 0x010c, 0x00e4, 0x010d, 0x0106, 0x0107, 0x00e9, 0x0179, + 0x017a, 0x010e, 0x00ed, 0x010f, 0x0112, 0x0113, 0x0116, 0x00f3, + 0x0117, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x011a, 0x011b, 0x00fc, + 0x2020, 0x00b0, 0x0118, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x0119, 0x00a8, 0x2260, 0x0123, 0x012e, + 0x012f, 0x012a, 0x2264, 0x2265, 0x012b, 0x0136, 0x2202, 0x2211, + 0x0142, 0x013b, 0x013c, 0x013d, 0x013e, 0x0139, 0x013a, 0x0145, + 0x0146, 0x0143, 0x00ac, 0x221a, 0x0144, 0x0147, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x0148, 0x0150, 0x00d5, 0x0151, 0x014c, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x014d, 0x0154, 0x0155, 0x0158, 0x2039, 0x203a, 0x0159, 0x0156, + 0x0157, 0x0160, 0x201a, 0x201e, 0x0161, 0x015a, 0x015b, 0x00c1, + 0x0164, 0x0165, 0x00cd, 0x017d, 0x017e, 0x016a, 0x00d3, 0x00d4, + 0x016b, 0x016e, 0x00da, 0x016f, 0x0170, 0x0171, 0x0172, 0x0173, + 0x00dd, 0x00fd, 0x0137, 0x017b, 0x0141, 0x017c, 0x0122, 0x02c7 +}; + +static unichar_t croatian[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x0160, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x017d, 0x00d8, + 0x221e, 0x00b1, 0x2264, 0x2265, 0x2206, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x0161, 0x222b, 0x00aa, 0x00ba, 0x03a9, 0x017e, 0x00f8, + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x0106, 0x00ab, + 0x010c, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + 0x0110, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0xf8ff, 0x00a9, 0x2044, 0x20ac, 0x2039, 0x203a, 0x00c6, 0x00bb, + 0x2013, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x0107, 0x00c1, + 0x010d, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + 0x0111, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x03c0, 0x00cb, 0x02da, 0x00b8, 0x00ca, 0x00e6, 0x02c7 +}; + +static unichar_t cyrillic[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x2020, 0x00b0, 0x0490, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x0406, + 0x00ae, 0x00a9, 0x2122, 0x0402, 0x0452, 0x2260, 0x0403, 0x0453, + 0x221e, 0x00b1, 0x2264, 0x2265, 0x0456, 0x00b5, 0x0491, 0x0408, + 0x0404, 0x0454, 0x0407, 0x0457, 0x0409, 0x0459, 0x040a, 0x045a, + 0x0458, 0x0405, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x040b, 0x045b, 0x040c, 0x045c, 0x0455, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x201e, + 0x040e, 0x045e, 0x040f, 0x045f, 0x2116, 0x0401, 0x0451, 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, 0x20ac +}; + +static unichar_t devanagari[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00d7, 0x2212, 0x2013, 0x2014, 0x2018, 0x2019, 0x2026, 0x2022, + 0x00a9, 0x00ae, 0x2122, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0965, 0x0970, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0901, 0x0902, 0x0903, 0x0905, 0x0906, 0x0907, 0x0908, + 0x0909, 0x090a, 0x090b, 0x090e, 0x090f, 0x0910, 0x090d, 0x0912, + 0x0913, 0x0914, 0x0911, 0x0915, 0x0916, 0x0917, 0x0918, 0x0919, + 0x091a, 0x091b, 0x091c, 0x091d, 0x091e, 0x091f, 0x0920, 0x0921, + 0x0922, 0x0923, 0x0924, 0x0925, 0x0926, 0x0927, 0x0928, 0x0929, + 0x092a, 0x092b, 0x092c, 0x092d, 0x092e, 0x092f, 0x095f, 0x0930, + 0x0931, 0x0932, 0x0933, 0x0934, 0x0935, 0x0936, 0x0937, 0x0938, + 0x0939, 0x200e, 0x093e, 0x093f, 0x0940, 0x0941, 0x0942, 0x0943, + 0x0946, 0x0947, 0x0948, 0x0945, 0x094a, 0x094b, 0x094c, 0x0949, + 0x094d, 0x093c, 0x0964, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x0966, 0x0967, 0x0968, 0x0969, 0x096a, 0x096b, 0x096c, + 0x096d, 0x096e, 0x096f, +}; + +static unichar_t farsi[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00a0, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x06ba, 0x00ab, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x2026, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00bb, 0x00f4, 0x00f6, 0x00f7, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002a, 0x002b, 0x060c, 0x002d, 0x002e, 0x002f, + 0x06f0, 0x06f1, 0x06f2, 0x06f3, 0x06f4, 0x06f5, 0x06f6, 0x06f7, + 0x06f8, 0x06f9, 0x003a, 0x061b, 0x003c, 0x003d, 0x003e, 0x061f, + 0x274a, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, + 0x0638, 0x0639, 0x063a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, + 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + 0x0650, 0x0651, 0x0652, 0x067e, 0x0679, 0x0686, 0x06d5, 0x06a4, + 0x06af, 0x0688, 0x0691, 0x007b, 0x007c, 0x007d, 0x0698, 0x06d2 +}; + +static unichar_t greek[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00b9, 0x00b2, 0x00c9, 0x00b3, 0x00d6, 0x00dc, 0x0385, + 0x00e0, 0x00e2, 0x00e4, 0x0384, 0x00a8, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00a3, 0x2122, 0x00ee, 0x00ef, 0x2022, 0x00bd, + 0x2030, 0x00f4, 0x00f6, 0x00a6, 0x20ac, 0x00f9, 0x00fb, 0x00fc, + 0x2020, 0x0393, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x00df, + 0x00ae, 0x00a9, 0x03a3, 0x03aa, 0x00a7, 0x2260, 0x00b0, 0x00b7, + 0x0391, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x0392, 0x0395, 0x0396, + 0x0397, 0x0399, 0x039a, 0x039c, 0x03a6, 0x03ab, 0x03a8, 0x03a9, + 0x03ac, 0x039d, 0x00ac, 0x039f, 0x03a1, 0x2248, 0x03a4, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x03a5, 0x03a7, 0x0386, 0x0388, 0x0153, + 0x2013, 0x2015, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x0389, + 0x038a, 0x038c, 0x038e, 0x03ad, 0x03ae, 0x03af, 0x03cc, 0x038f, + 0x03cd, 0x03b1, 0x03b2, 0x03c8, 0x03b4, 0x03b5, 0x03c6, 0x03b3, + 0x03b7, 0x03b9, 0x03be, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03bf, + 0x03c0, 0x03ce, 0x03c1, 0x03c3, 0x03c4, 0x03b8, 0x03c9, 0x03c2, + 0x03c7, 0x03c5, 0x03b6, 0x03ca, 0x03cb, 0x0390, 0x03b0, 0x00ad +}; + +static unichar_t gujarati[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00d7, 0x2212, 0x2013, 0x2014, 0x2018, 0x2019, 0x2026, 0x2022, + 0x00a9, 0x00ae, 0x2122, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0965, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x0a81, 0x0a82, 0x0a83, 0x0a85, 0x0a86, 0x0a87, 0x0a88, + 0x0a89, 0x0a8a, 0x0a8b, 0x00ab, 0x0a8f, 0x0a90, 0x0a8d, 0x00af, + 0x0a93, 0x0a94, 0x0a91, 0x0a95, 0x0a96, 0x0a97, 0x0a98, 0x0a99, + 0x0a9a, 0x0a9b, 0x0a9c, 0x0a9d, 0x0a9e, 0x0a9f, 0x0aa0, 0x0aa1, + 0x0aa2, 0x0aa3, 0x0aa4, 0x0aa5, 0x0aa6, 0x0aa7, 0x0aa8, 0x00c7, + 0x0aaa, 0x0aab, 0x0aac, 0x0aad, 0x0aae, 0x0aaf, 0x00ce, 0x0ab0, + 0x00d0, 0x0ab2, 0x0ab3, 0x00d3, 0x0ab5, 0x0ab6, 0x0ab7, 0x0ab8, + 0x0ab9, 0x200e, 0x0abe, 0x0abf, 0x0ac0, 0x0ac1, 0x0ac2, 0x0ac3, + 0x00e0, 0x0ac7, 0x0ac8, 0x0ac5, 0x00e4, 0x0acb, 0x0acc, 0x0ac9, + 0x0acd, 0x0abc, 0x0964, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x0ae6, 0x0ae7, 0x0ae8, 0x0ae9, 0x0aea, 0x0aeb, 0x0aec, + 0x0aed, 0x0aee, 0x0aef, +}; + +static unichar_t gurmukhi[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00d7, 0x2212, 0x2013, 0x2014, 0x2018, 0x2019, 0x2026, 0x2022, + 0x00a9, 0x00ae, 0x2122, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f, + 0x0a71, 0x0a5c, 0x0a73, 0x0a72, 0x0a74, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f, + 0x00a0, 0x00a1, 0x0a02, 0x00a3, 0x0a05, 0x0a06, 0x0a07, 0x0a08, + 0x0a09, 0x0a0a, 0x00aa, 0x00ab, 0x0a0f, 0x0a10, 0x00ae, 0x00af, + 0x0a13, 0x0a14, 0x00b2, 0x0a15, 0x0a16, 0x0a17, 0x0a18, 0x0a19, + 0x0a1a, 0x0a1b, 0x0a1c, 0x0a1d, 0x0a1e, 0x0a1f, 0x0a20, 0x0a21, + 0x0a22, 0x0a23, 0x0a24, 0x0a25, 0x0a26, 0x0a27, 0x0a28, 0x00c7, + 0x0a2a, 0x0a2b, 0x0a2c, 0x0a2d, 0x0a2e, 0x0a2f, 0x00ce, 0x0a30, + 0x00d0, 0x0a32, 0x00d2, 0x00d3, 0x0a35, 0xf860, 0x00d6, 0x0a38, + 0x0a39, 0x200e, 0x0a3e, 0x0a3f, 0x0a40, 0x0a41, 0x0a42, 0x00df, + 0x00e0, 0x0a47, 0x0a48, 0x00e3, 0x00e4, 0x0a4b, 0x0a4c, 0x00e7, + 0x0a4d, 0x0a3c, 0x0964, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x0a66, 0x0a67, 0x0a68, 0x0a69, 0x0a6a, 0x0a6b, 0x0a6c, + 0x0a6d, 0x0a6e, 0x0a6f, +}; + +static unichar_t hebrew[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x05f2, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x20aa, 0x0027, + 0x0029, 0x0028, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, + 0xf86a, 0x201e, 0xf89b, 0xf89c, 0xf89d, 0xf89e, 0x05bc, 0xfb4b, + 0xfb35, 0x2026, 0x00a0, 0x05b8, 0x05b7, 0x05b5, 0x05b6, 0x05b4, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0xfb2a, 0xfb2b, + 0x05bf, 0x05b0, 0x05b2, 0x05b1, 0x05bb, 0x05b9, 0x05b8, 0x05b3, + 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, 0x007d, 0x005d, 0x007b, 0x005b, 0x007c +}; + +static unichar_t iceland[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x00dd, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x03a9, 0x00e6, 0x00f8, + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x2044, 0x20ac, 0x00d0, 0x00f0, 0x00de, 0x00fe, + 0x00fd, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + 0xf8ff, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7 +}; + +static unichar_t romanian[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x0102, 0x0218, + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x03a9, 0x0103, 0x0219, + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x2044, 0x20ac, 0x2039, 0x203a, 0x021a, 0x021b, + 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + 0xf8ff, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7 +}; + +static unichar_t roman[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x03a9, 0x00e6, 0x00f8, + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x2044, 0x20ac, 0x2039, 0x203a, 0xfb01, 0xfb02, + 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + 0xf8ff, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7 +}; + +static unichar_t thai[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00ab, 0x00bb, 0x2026, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x201c, 0x201d, 0x0e4d, + 0x0090, 0x2022, 0x0e31, 0x0e47, 0x0e34, 0x0e35, 0x0e36, 0x0e37, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x2018, 0x2019, 0x009f, + 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, + 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, + 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, + 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37, + 0x0e38, 0x0e39, 0x0e3a, 0x2060, 0x200b, 0x2013, 0x2014, 0x0e3f, + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, + 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x2122, 0x0e4f, + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, + 0x0e58, 0x0e59, 0x00ae, 0x00a9, +}; + +static unichar_t turkish[256] = { + 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, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, + 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, + 0x0058, 0x0059, 0x005a, 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, + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x03a9, 0x00e6, 0x00f8, + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x011e, 0x011f, 0x0130, 0x0131, 0x015e, 0x015f, + 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + 0xf8ff, 0x00d2, 0x00da, 0x00db, 0x00d9, 0xf8a0, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7 +}; + +enum script_codes { + sm_roman, sm_japanese, sm_tradchinese, sm_korean, + sm_arabic, sm_hebrew, sm_greek, sm_cyrillic, + sm_rsymbol, sm_devanagari, sm_gurmukhi, sm_gujarati, + sm_oriya, sm_bengali, sm_tamil, sm_telugu, + sm_kannada, sm_malayalam, sm_sinhalese, sm_burmese, + sm_khmer, sm_thai, sm_laotian, sm_georgian, + sm_armenian, sm_simpchinese, sm_tibetan, sm_mongolian, + sm_geez, sm_slavic, sm_vietnamese, sm_sindhi, + sm_max }; + +static unichar_t *macencodings[] = { + roman, + NULL/*Essentially SJIS*/, + NULL/*Essentially Big 5*/, + NULL/*Essentially Wansung*/, + arabic, + hebrew, + greek, + cyrillic, + NULL, /* rsymbol, whatever that is */ + devanagari, +/*10*/ gurmukhi, + gujarati, + NULL, /* oriya */ + NULL, /* bengali */ + NULL, /* Tamil */ + NULL, /* Telugu */ + NULL, /* Kannada */ + NULL, /* Malayalam */ + NULL, /* Sinhalese */ + NULL, /* Burmese */ +/*20*/ NULL, /* Khmer */ + thai, + NULL, /* Lao */ + NULL, /* Georgian */ + NULL, /* Armenian */ +/*25*/ NULL,/* SimpChinese, GB2312 offset by 0x8080 to 0xa1a1 */ + NULL, /* Tibetan */ + NULL, /* Mongolian */ + NULL, /* Geex/Ethiopic */ + centeuro, /* Baltic/Slavic */ +/*30*/ NULL, /* Vietnamese */ + NULL, /* Extended Arabic for Sindhi */ + NULL /* Uninterpretted */ +}; + +/* The icelandic encoding also uses 0 (mac roman) encoding even though it's not*/ +/* The turkish encoding also uses 0 (mac roman) encoding even though it's not*/ +/* The croatian encoding also uses 0 (mac roman) encoding even though it's not*/ +/* The romanian encoding also uses 0 (mac roman) encoding even though it's not*/ + +/* I've no idea what encoding code farsi uses, it isn't documented to be arabic 4, nor is it documented to have its own code */ + +static uint8 _MacScriptFromLanguage[] = { + sm_roman, /* English */ + sm_roman, /* French */ + sm_roman, /* German */ + sm_roman, /* Italian */ + sm_roman, /* Dutch */ + sm_roman, /* Swedish */ + sm_roman, /* Spanish */ + sm_roman, /* Danish */ + sm_roman, /* Portuguese */ + sm_roman, /* Norwegian */ +/*10*/ sm_hebrew, /* Hebrew */ + sm_japanese, /* Japanese */ + sm_arabic, /* Arabic */ + sm_roman, /* Finnish */ + sm_greek, /* Greek */ + sm_roman, /* Icelandic */ /* Modified roman */ + sm_roman, /* Maltese */ + sm_roman, /* Turkish */ /* Modified roman */ + sm_roman, /* Croatian */ /* Modified roman */ + sm_tradchinese, /* Traditional Chinese */ +/*20*/ sm_arabic, /* Urdu (I assume arabic) */ + sm_devanagari, /* Hindi (I assume) */ + sm_thai, /* Thai */ + sm_korean, /* Korean */ + sm_slavic, /* Lithuanian */ + sm_slavic, /* Polish */ + sm_slavic, /* Hungarian */ + sm_slavic, /* Estonian */ + sm_slavic, /* Latvian */ + sm_roman, /* Sami (Lappish) */ +/*30*/ sm_roman, /* Faroese (Icelandic) */ /* Modified roman */ + sm_arabic, /* Farsi/Persian */ /* Modified Arabic */ + sm_cyrillic, /* Russian */ + sm_simpchinese, /* Simplified Chinese */ + sm_roman, /* Flemish */ + sm_roman, /* Irish Gaelic */ + sm_roman, /* albanian (???) */ + sm_roman, /* Romanian */ /* Modified roman */ + sm_slavic, /* Czech */ + sm_slavic, /* Slovak */ +/*40*/ sm_slavic, /* Slovenian */ + sm_roman, /* Yiddish */ + sm_cyrillic, /* Serbian */ + sm_cyrillic, /* Macedonian */ + sm_cyrillic, /* Bulgarian */ + sm_cyrillic, /* Ukrainian */ + sm_cyrillic, /* Byelorussian */ + sm_cyrillic, /* Uzbek */ + sm_cyrillic, /* Kazakh */ + sm_cyrillic, /* Axerbaijani (Cyrillic) */ +/*50*/ sm_arabic, /* Axerbaijani (Arabic) */ + sm_armenian, /* Armenian */ + sm_georgian, /* Georgian */ + sm_cyrillic, /* Moldavian */ + sm_cyrillic, /* Kirghiz */ + sm_cyrillic, /* Tajiki */ + sm_cyrillic, /* Turkmen */ + sm_mongolian, /* Mongolian (Mongolian) */ + sm_cyrillic, /* Mongolian (cyrillic) */ + sm_arabic, /* Pashto */ +/*60*/ sm_arabic, /* Kurdish */ + sm_devanagari, /* Kashmiri (???) */ + sm_sindhi, /* Sindhi */ + sm_tibetan, /* Tibetan */ + sm_tibetan, /* Nepali (???) */ + sm_devanagari, /* Sanskrit */ + sm_devanagari, /* Marathi */ + sm_bengali, /* Bengali */ + sm_bengali, /* Assamese (???) */ + sm_gujarati, /* Gujarati */ +/*70*/ sm_gujarati, /* Punjabi (???) */ + sm_oriya, /* Oriya */ + sm_malayalam, /* Malayalam */ + sm_kannada, /* Kannada */ + sm_tamil, /* Tamil */ + sm_telugu, /* Telugu */ + sm_sinhalese, /* Sinhalese */ + sm_burmese, /* Burmese */ + sm_khmer, /* Khmer */ + sm_laotian, /* Lao */ +/*80*/ sm_vietnamese, /* Vietnamese */ + sm_arabic, /* Indonesian */ + sm_roman, /* Tagalog (???) */ + sm_roman, /* Malay (roman) */ + sm_arabic, /* Malay (arabic) */ + sm_roman, /* Amharic (???) */ + sm_roman, /* Tigrinya (???) */ + sm_roman, /* Galla (???) */ + sm_roman, /* Somali (???) */ + sm_roman, /* Swahili (???) */ +/*90*/ sm_roman, /* Kinyarwanda/Ruanda (???) */ + sm_roman, /* Rundi (???) */ + sm_roman, /* Nyanja/Chewa (???) */ + sm_roman, /* Malagasy */ +/*94*/ sm_roman, /* Esperanto */ + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, +/*100*/ 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, +/*110*/ 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, +/*120*/ 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, + 0xff, +/*128*/ sm_roman, /* Welsh */ + sm_roman, /* Basque */ +/*130*/ sm_roman, /* Catalan */ + sm_roman, /* Latin */ + sm_roman, /* Quechua (???) */ + sm_roman, /* Guarani (???) */ + sm_roman, /* Aymara (???) */ + sm_cyrillic, /* Tatar (???) */ + sm_cyrillic, /* Uighur (???) */ + sm_cyrillic, /* Dzongkha (???) */ + sm_roman, /* Javanese (roman) */ + sm_roman, /* Sundanese (roman) */ +/*140*/ sm_roman, /* Galician */ + sm_roman, /* Afrikaans */ + sm_roman, /* Breton */ + sm_roman, /* Inuktitut */ + sm_roman, /* Scottish Gaelic */ + sm_roman, /* Manx Gaelic */ + sm_roman, /* Irish Gaelic (with dot) */ + sm_roman, /* Tongan */ + sm_greek, /* Greek (polytonic) */ + sm_roman, /* Greenlandic */ /* Presumably icelandic? */ +/*150*/ sm_roman, /* Azebaijani (roman) */ + 0xff +}; + +static uint16 _WinLangFromMac[] = { + 0x409, /* English */ + 0x40c, /* French */ + 0x407, /* German */ + 0x410, /* Italian */ + 0x413, /* Dutch */ + 0x41d, /* Swedish */ + 0x40a, /* Spanish */ + 0x406, /* Danish */ + 0x416, /* Portuguese */ + 0x414, /* Norwegian */ +/*10*/ 0x40d, /* Hebrew */ + 0x411, /* Japanese */ + 0x401, /* Arabic */ + 0x40b, /* Finnish */ + 0x408, /* Greek */ + 0x40f, /* Icelandic */ + 0xffff, /* Maltese */ + 0x41f, /* Turkish */ + 0x41a, /* Croatian */ + 0x404, /* Traditional Chinese */ +/*20*/ 0x420, /* Urdu */ + 0x439, /* Hindi */ + 0x41e, /* Thai */ + 0x412, /* Korean */ + 0x427, /* Lithuanian */ + 0x415, /* Polish */ + 0x40e, /* Hungarian */ + 0x425, /* Estonian */ + 0x426, /* Latvian */ + 0x43b, /* Sami (Lappish) */ +/*30*/ 0x438, /* Faroese (Icelandic) */ + 0x429, /* Farsi/Persian */ + 0x419, /* Russian */ + 0x804, /* Simplified Chinese */ + 0x813, /* Flemish */ + 0xffff, /* Irish Gaelic */ + 0x41c, /* albanian */ + 0x418, /* Romanian */ + 0x405, /* Czech */ + 0x41b, /* Slovak */ +/*40*/ 0x424, /* Slovenian */ + 0x43d, /* Yiddish */ + 0xc1a, /* Serbian */ + 0x42f, /* Macedonian */ + 0x402, /* Bulgarian */ + 0x422, /* Ukrainian */ + 0x423, /* Byelorussian */ + 0x843, /* Uzbek */ + 0x43f, /* Kazakh */ + 0xffff, /* Axerbaijani (Cyrillic) */ +/*50*/ 0xffff, /* Axerbaijani (Arabic) */ + 0x42b, /* Armenian */ + 0x437, /* Georgian */ + 0x818, /* Moldavian */ + 0xffff, /* Kirghiz */ + 0xffff, /* Tajiki */ + 0xffff, /* Turkmen */ + 0xffff, /* Mongolian (Mongolian) */ + 0xffff, /* Mongolian (cyrillic) */ + 0xffff, /* Pashto */ +/*60*/ 0xffff, /* Kurdish */ + 0x860, /* Kashmiri */ + 0x459, /* Sindhi */ + 0xffff, /* Tibetan */ + 0x461, /* Nepali */ + 0x43b, /* Sanskrit */ + 0xffff, /* Marathi */ + 0x445, /* Bengali */ + 0x44d, /* Assamese */ + 0x447, /* Gujarati */ +/*70*/ 0x446, /* Punjabi */ + 0x448, /* Oriya */ + 0xffff, /* Malayalam */ + 0x44b, /* Kannada */ + 0x449, /* Tamil */ + 0x44a, /* Telugu */ + 0xffff, /* Sinhalese */ + 0xffff, /* Burmese */ + 0xffff, /* Khmer */ + 0xffff, /* Lao */ +/*80*/ 0x42a, /* Vietnamese */ + 0x421, /* Indonesian */ + 0xffff, /* Tagalog */ + 0x43e, /* Malay (roman) */ + 0xffff, /* Malay (arabic) */ + 0xffff, /* Amharic */ + 0xffff, /* Tigrinya */ + 0xffff, /* Galla */ + 0xffff, /* Somali */ + 0x441, /* Swahili */ +/*90*/ 0xffff, /* Kinyarwanda/Ruanda */ + 0xffff, /* Rundi */ + 0xffff, /* Nyanja/Chewa */ + 0xffff, /* Malagasy */ +/*94*/ 0xffff, /* Esperanto */ + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, +/*100*/ 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, +/*110*/ 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, +/*120*/ 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, + 0xffff, +/*128*/ 0xffff, /* Welsh */ + 0x42d, /* Basque */ +/*130*/ 0x403, /* Catalan */ + 0xffff, /* Latin */ + 0xffff, /* Quechua */ + 0xffff, /* Guarani */ + 0xffff, /* Aymara */ + 0x444, /* Tatar */ + 0xffff, /* Uighur */ + 0xffff, /* Dzongkha */ + 0xffff, /* Javanese (roman) */ + 0xffff, /* Sundanese (roman) */ +/*140*/ 0xffff, /* Galician */ + 0x436, /* Afrikaans */ + 0xffff, /* Breton */ + 0xffff, /* Inuktitut */ + 0xffff, /* Scottish Gaelic */ + 0xffff, /* Manx Gaelic */ + 0xffff, /* Irish Gaelic (with dot) */ + 0xffff, /* Tongan */ + 0xffff, /* Greek (polytonic) */ + 0xffff, /* Greenlandic */ /* Presumably icelandic? */ +/*150*/ 0x42c, /* Azebaijani (roman) */ + 0xffff +}; + +static char *LanguageCodesFromMacLang[] = { + "en", /* English */ + "fr", /* French */ + "de", /* German */ + "it", /* Italian */ + "nl", /* Dutch */ + "sv", /* Swedish */ + "es", /* Spanish */ + "da", /* Danish */ + "pt", /* Portuguese */ + "no", /* Norwegian */ +/*10*/ "he", /* Hebrew */ + "ja", /* Japanese */ + "ar", /* Arabic */ + "fi", /* Finnish */ + "el", /* Greek */ + "is", /* Icelandic */ + "ml", /* Maltese */ + "tr", /* Turkish */ + "hr", /* Croatian */ + "zh_TW", /* Traditional Chinese */ /* zh_HK */ +/*20*/ "ur", /* Urdu */ + "hi", /* Hindi */ + "th", /* Thai */ + "ko", /* Korean */ + "lt", /* Lithuanian */ + "pl", /* Polish */ + "hu", /* Hungarian */ + "et", /* Estonian */ + "lv", /* Latvian */ + "smi", /* Sami (Lappish) */ +/*30*/ "fo", /* Faroese (Icelandic) */ + "fa", /* Farsi/Persian */ + "ru", /* Russian */ + "zh_CN", /* Simplified Chinese */ + "nl_BE", /* Flemish */ /* Flemish doesn't rate a language code, use dutch */ + "ga", /* Irish Gaelic */ + "sq", /* albanian */ + "ro", /* Romanian */ + "cs", /* Czech */ + "sk", /* Slovak */ +/*40*/ "sl", /* Slovenian */ + "yi", /* Yiddish */ + "sr", /* Serbian */ + "mk", /* Macedonian */ + "bg", /* Bulgarian */ + "uk", /* Ukrainian */ + "be", /* Byelorussian */ + "uz", /* Uzbek */ + "kk", /* Kazakh */ + NULL, /* Axerbaijani (Cyrillic) */ +/*50*/ NULL, /* Axerbaijani (Arabic) */ + "hy", /* Armenian */ + "ka", /* Georgian */ + "mo", /* Moldavian */ + "ky", /* Kirghiz */ + "tg", /* Tajiki */ + "tk", /* Turkmen */ + "mn", /* Mongolian (Mongolian) */ + "mn", /* Mongolian (cyrillic) */ + "ps", /* Pashto */ +/*60*/ "ku", /* Kurdish */ + "ks", /* Kashmiri */ + "sd", /* Sindhi */ + "bo", /* Tibetan */ + "ne", /* Nepali */ + "sa", /* Sanskrit */ + "mr", /* Marathi */ + "bn", /* Bengali */ + "as", /* Assamese */ + "gu", /* Gujarati */ +/*70*/ NULL, /* Punjabi */ + "or", /* Oriya */ + "mal", /* Malayalam */ + "kn", /* Kannada */ + "ta", /* Tamil */ + "te", /* Telugu */ + "si", /* Sinhalese */ + "my", /* Burmese */ + "km", /* Khmer */ + "lo", /* Lao */ +/*80*/ "vi", /* Vietnamese */ + "id", /* Indonesian */ + "tl", /* Tagalog */ + "ms", /* Malay (roman) */ + "ms", /* Malay (arabic) */ + "am", /* Amharic */ + "ti", /* Tigrinya */ + "gl", /* Galla */ + "so", /* Somali */ + "sw", /* Swahili */ +/*90*/ "rw", /* Kinyarwanda/Ruanda */ + "rn", /* Rundi */ + "nya", /* Nyanja/Chewa */ + "mg", /* Malagasy */ +/*94*/ "eo", /* Esperanto */ + NULL, + NULL, + NULL, + NULL, + NULL, +/*100*/ NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +/*110*/ NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +/*120*/ NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +/*128*/ "cy", /* Welsh */ + "eu", /* Basque */ +/*130*/ "ca", /* Catalan */ + "la", /* Latin */ + "qu", /* Quechua */ + "gn", /* Guarani */ + "ay", /* Aymara */ + "tt", /* Tatar */ + "ug", /* Uighur */ + "dz", /* Dzongkha */ + "jv", /* Javanese (roman) */ + "su", /* Sundanese (roman) */ +/*140*/ NULL, /* Galician */ + "af", /* Afrikaans */ + "be", /* Breton */ + NULL, /* Inuktitut */ + "gae", /* Scottish Gaelic */ + "max", /* Manx Gaelic */ + NULL, /* Irish Gaelic (with dot) */ + "to", /* Tongan */ + "grc", /* Greek (polytonic) */ + "kl", /* Greenlandic */ /* Presumably icelandic? */ +/*150*/ "az", /* Azebaijani (roman) */ + NULL +}; + +unichar_t *MacStrToUnicode(const char *str,int macenc,int maclang) { + unichar_t *ret, *table, *rpt; + const uint8 *ustr = (uint8 *) str; + + if ( str==NULL ) +return( NULL ); + + if ( macenc==sm_japanese || macenc==sm_korean || macenc==sm_tradchinese || + macenc == sm_simpchinese ) { + ret = galloc((strlen(str)+1)*sizeof(unichar_t)); + encoding2u_strncpy(ret,str,strlen(str)+1, + macenc==sm_japanese ? e_sjis : + macenc==sm_korean ? e_wansung : + macenc==sm_tradchinese ? e_big5 : + e_jisgb ); +return( ret ); + } + + table = macencodings[macenc]; + + if ( maclang==15 /* Icelandic */ || + maclang==30 /* Faroese */ || + maclang==149 /* Greenlandic */ ) + table = iceland; + else if ( maclang == 17 /* turkish */ ) + table = turkish; + else if ( maclang == 18 /* croatian */ ) + table = croatian; + else if ( maclang == 37 /* romanian */ ) + table = romanian; + else if ( maclang == 31 /* Farsi/Persian */ ) + table = farsi; + + if ( table==NULL ) +return( NULL ); + + ret = galloc((strlen(str)+1)*sizeof(unichar_t)); + for ( rpt = ret; *ustr; ++ustr ) + *rpt++ = table[*ustr]; + *rpt = '\0'; +return( ret ); +} + +char *UnicodeToMacStr(const unichar_t *ustr,int macenc,int maclang) { + char *ret, *rpt; + const unichar_t *table; + int i; + + if ( ustr==NULL ) +return( NULL ); + + if ( macenc==sm_japanese || macenc==sm_korean || macenc==sm_tradchinese || + macenc == sm_simpchinese ) { + ret = galloc(2*(u_strlen(ustr)+1)); + u2encoding_strncpy(ret,ustr,2*u_strlen(ustr)+2, + macenc==sm_japanese ? e_sjis : + macenc==sm_korean ? e_wansung : + macenc==sm_tradchinese ? e_big5 : + e_jisgb ); +return( ret ); + } + + table = macencodings[macenc]; + + if ( maclang==15 /* Icelandic */ || + maclang==30 /* Faroese */ || + maclang==149 /* Greenlandic */ ) + table = iceland; + else if ( maclang == 17 /* turkish */ ) + table = turkish; + else if ( maclang == 18 /* croatian */ ) + table = croatian; + else if ( maclang == 37 /* romanian */ ) + table = romanian; + else if ( maclang == 31 /* Farsi/Persian */ ) + table = farsi; + + if ( table==NULL ) +return( NULL ); + + ret = galloc(u_strlen(ustr)+1); + for ( rpt = ret; *ustr; ++ustr ) { + for ( i=0; i<256; ++i ) + if ( table[i]==*ustr ) { + *rpt++ = i; + break; + } + } + *rpt = '\0'; +return( ret ); +} + +uint8 MacEncFromMacLang(int maclang) { + if ( maclang<0 || maclang>=sizeof(_MacScriptFromLanguage)/sizeof(_MacScriptFromLanguage[0])) +return( 0xff ); + +return( _MacScriptFromLanguage[maclang] ); +} + +uint16 WinLangFromMac(int maclang) { + + if ( maclang<0 || maclang>=sizeof(_WinLangFromMac)/sizeof(_WinLangFromMac[0])) +return( 0xffff ); + +return( _WinLangFromMac[maclang] ); +} + +uint16 WinLangToMac(int winlang) { + int i; + + for ( i=0; ilang==lang ) + break; + else if ( mn->lang==0 ) + english = mn; + mn = mn->next; + } + if ( mn==NULL ) + mn = english; + if ( mn==NULL ) + mn = first; + if ( mn==NULL ) +return( NULL ); + +return( MacStrToUnicode(mn->name,mn->enc,mn->lang)); +} + +MacFeat *FindMacFeature(SplineFont *sf, int feat, MacFeat **secondary) { + MacFeat *from_f, *from_p; + + for ( from_f = sf->features; from_f!=NULL && from_f->feature!=feat; from_f=from_f->next ); + for ( from_p = default_mac_feature_map; from_p!=NULL && from_p->feature!=feat; from_p=from_p->next ); + if ( from_f!=NULL ) { + if ( secondary!=NULL ) *secondary = from_p; +return( from_f ); + } + if ( secondary!=NULL ) *secondary = NULL; +return( from_p ); +} + +struct macsetting *FindMacSetting(SplineFont *sf, int feat, int set, + struct macsetting **secondary) { + MacFeat *from_f, *from_p; + struct macsetting *s_f, *s_p; + + for ( from_f = sf->features; from_f!=NULL && from_f->feature!=feat; from_f=from_f->next ); + for ( from_p = default_mac_feature_map; from_p!=NULL && from_p->feature!=feat; from_p=from_p->next ); + s_f = s_p = NULL; + if ( from_f!=NULL ) + for ( s_f = from_f->settings; s_f!=NULL && s_f->setting!=set; s_f=s_f->next ); + if ( from_p!=NULL ) + for ( s_p = from_p->settings; s_p!=NULL && s_p->setting!=set; s_p=s_p->next ); + if ( s_f!=NULL ) { + if ( secondary!=NULL ) *secondary = s_p; +return( s_f ); + } + if ( secondary!=NULL ) *secondary = NULL; +return( s_p ); +} + +struct macname *FindMacSettingName(SplineFont *sf, int feat, int set) { + MacFeat *from_f, *from_p; + struct macsetting *s; + + for ( from_f = sf->features; from_f!=NULL && from_f->feature!=feat; from_f=from_f->next ); + for ( from_p = default_mac_feature_map; from_p!=NULL && from_p->feature!=feat; from_p=from_p->next ); + if ( set==-1 ) { + if ( from_f!=NULL && from_f->featname!=NULL ) +return( from_f->featname ); + else if ( from_p!=NULL ) +return( from_p->featname ); +return( NULL ); + } + s = NULL; + if ( from_f!=NULL ) + for ( s = from_f->settings; s!=NULL && s->setting!=set; s=s->next ); + if ( (s==NULL || s->setname==NULL) && from_p!=NULL ) + for ( s = from_p->settings; s!=NULL && s->setting!=set; s=s->next ); + if ( s!=NULL ) +return( s->setname ); + +return( NULL ); +} + +static struct macname fs_names[] = { + { &fs_names[146], 0, 0, "All Typographic Features" }, + { &fs_names[147], 0, 0, "All Type Features" }, + { &fs_names[148], 0, 0, "Ligatures" }, + { &fs_names[149], 0, 0, "Required Ligatures" }, + { &fs_names[150], 0, 0, "Common Ligatures" }, + { &fs_names[151], 0, 0, "Rare Ligatures" }, + { &fs_names[152], 0, 0, "Logo Ligatures" }, + { &fs_names[153], 0, 0, "Rebus Ligatures" }, + { &fs_names[154], 0, 0, "Diphthong Ligatures" }, + { &fs_names[155], 0, 0, "Squared Ligatures" }, + { &fs_names[156], 0, 0, "Abbreviated Squared Ligatures" }, + { &fs_names[157], 0, 0, "Cursive connection" }, + { &fs_names[158], 0, 0, "Unconnected" }, + { &fs_names[159], 0, 0, "Partially connected" }, + { &fs_names[160], 0, 0, "Cursive" }, + { &fs_names[161], 0, 0, "Letter Case" }, + { &fs_names[162], 0, 0, "Upper & Lower Case" }, + { &fs_names[163], 0, 0, "All Capitals" }, + { &fs_names[164], 0, 0, "All Lower Case" }, + { &fs_names[165], 0, 0, "Small Caps" }, + { &fs_names[166], 0, 0, "Initial Caps" }, + { &fs_names[167], 0, 0, "Initial and Small Caps" }, + { &fs_names[168], 0, 0, "Vertical Substitution" }, + { &fs_names[169], 0, 0, "Vertical Substitution" }, + { &fs_names[170], 0, 0, "No Vertical Substitution" }, + { &fs_names[171], 0, 0, "Linguistic Rearrangement" }, + { &fs_names[172], 0, 0, "Linguistic Rearrangement" }, + { &fs_names[173], 0, 0, "No Linguistic Rearrangement" }, + { &fs_names[174], 0, 0, "Number Spacing" }, + { &fs_names[175], 0, 0, "Monospaced Numbers" }, + { &fs_names[176], 0, 0, "Proportional Numbers" }, + { &fs_names[177], 0, 0, "Smart Swashes" }, + { &fs_names[178], 0, 0, "Word Initial Swashes" }, + { &fs_names[179], 0, 0, "Word Final Swashes" }, + { &fs_names[180], 0, 0, "Line Initial Swashes" }, + { &fs_names[181], 0, 0, "Line Final Swashes" }, + { &fs_names[182], 0, 0, "Non-Final Swashes" }, + { &fs_names[183], 0, 0, "Diacritics" }, + { &fs_names[184], 0, 0, "Show Diacritics" }, + { &fs_names[185], 0, 0, "Hide Diacritics" }, + { &fs_names[186], 0, 0, "Decompose Diacritics" }, + { &fs_names[187], 0, 0, "Vertical Position" }, + { &fs_names[188], 0, 0, "Normal Vertical Position" }, + { &fs_names[189], 0, 0, "Superiors" }, + { &fs_names[190], 0, 0, "Inferiors" }, + { &fs_names[191], 0, 0, "Ordinals" }, + { &fs_names[192], 0, 0, "Fractions" }, + { &fs_names[193], 0, 0, "No Fractions" }, + { &fs_names[194], 0, 0, "Vertical Fractions" }, + { &fs_names[195], 0, 0, "Diagonal Fractions" }, + { &fs_names[196], 0, 0, "Overlapping Characters" }, + { &fs_names[197], 0, 0, "Prevent Overlap" }, + { &fs_names[198], 0, 0, "Allow Overlap" }, + { &fs_names[199], 0, 0, "Typographic Extras" }, + { &fs_names[200], 0, 0, "Hyphens to Em-dash" }, + { &fs_names[201], 0, 0, "Hyphen to En-dash" }, + { &fs_names[202], 0, 0, "Unslashed Zero" }, + { &fs_names[203], 0, 0, "Form Interrobang" }, + { &fs_names[204], 0, 0, "Smart Quotes" }, + { &fs_names[205], 0, 0, "Periods to Ellipsis" }, + { &fs_names[206], 0, 0, "Mathematical Extras" }, + { &fs_names[207], 0, 0, "Hyphen to Minus" }, + { &fs_names[208], 0, 0, "Asterisk to Multiply" }, + { &fs_names[209], 0, 0, "Slash to Divide" }, + { &fs_names[210], 0, 0, "Inequality Ligatures" }, + { &fs_names[211], 0, 0, "Exponents" }, + { &fs_names[212], 0, 0, "Ornament Sets" }, + { &fs_names[213], 0, 0, "No Ornaments" }, + { &fs_names[214], 0, 0, "Dingbats" }, + { &fs_names[215], 0, 0, "Pi Characters" }, + { &fs_names[216], 0, 0, "Fleurons" }, + { &fs_names[217], 0, 0, "Decorative Borders" }, + { &fs_names[218], 0, 0, "International Symbols" }, + { &fs_names[219], 0, 0, "Math Symbols" }, + { &fs_names[220], 0, 0, "Character Alternates" }, + { &fs_names[221], 0, 0, "No Alternates" }, + { &fs_names[222], 0, 0, "Alternate Characters" }, + { &fs_names[223], 0, 0, "Other Alternates" }, + { &fs_names[224], 0, 0, "Design Complexity" }, + { &fs_names[225], 0, 0, "Design Level 1" }, + { &fs_names[226], 0, 0, "Design Level 2" }, + { &fs_names[227], 0, 0, "Design Level 3" }, + { &fs_names[228], 0, 0, "Design Level 4" }, + { &fs_names[229], 0, 0, "Design Level 5" }, + { &fs_names[230], 0, 0, "Style Options" }, + { &fs_names[231], 0, 0, "No Style Options" }, + { &fs_names[232], 0, 0, "Display Text" }, + { &fs_names[233], 0, 0, "Engraved Text" }, + { &fs_names[234], 0, 0, "Illuminated Caps" }, + { &fs_names[235], 0, 0, "Titling Caps" }, + { &fs_names[236], 0, 0, "Tall Caps" }, + { &fs_names[237], 0, 0, "Character Shape" }, + { &fs_names[238], 0, 0, "Traditional" }, + { &fs_names[239], 0, 0, "Simplified" }, + { &fs_names[240], 0, 0, "jis 1978" }, + { &fs_names[241], 0, 0, "jis 1983" }, + { &fs_names[242], 0, 0, "jis 1990" }, + { &fs_names[243], 0, 0, "Traditional Alt 1" }, + { &fs_names[244], 0, 0, "Traditional Alt 2" }, + { &fs_names[245], 0, 0, "Traditional Alt 3" }, + { &fs_names[246], 0, 0, "Traditional Alt 4" }, + { &fs_names[247], 0, 0, "Traditional Alt 5" }, + { &fs_names[248], 0, 0, "Expert" }, + { &fs_names[249], 0, 0, "Number Case" }, + { &fs_names[250], 0, 0, "Lower Case Numbers" }, + { &fs_names[251], 0, 0, "Upper Case Numbers" }, + { &fs_names[252], 0, 0, "Text Spacing" }, + { &fs_names[253], 0, 0, "Proportional" }, + { &fs_names[254], 0, 0, "Monospace" }, + { &fs_names[255], 0, 0, "Transliteration" }, + { &fs_names[256], 0, 0, "No Transliteration" }, + { &fs_names[257], 0, 0, "Hanja To Hangul" }, + { &fs_names[258], 0, 0, "Hiragana to Katakana" }, + { &fs_names[259], 0, 0, "Katakana to Hiragana" }, + { &fs_names[260], 0, 0, "Katakana to Roman" }, + { &fs_names[261], 0, 0, "Roman to Hiragana" }, + { &fs_names[262], 0, 0, "Roman to Katakana" }, + { &fs_names[263], 0, 0, "Hanja To Hangul Alt 1" }, + { &fs_names[264], 0, 0, "Hanja To Hangul Alt 2" }, + { &fs_names[265], 0, 0, "Hanja To Hangul Alt 3" }, + { &fs_names[266], 0, 0, "Annotation" }, + { &fs_names[267], 0, 0, "No Annotation" }, + { &fs_names[268], 0, 0, "Box Annotation" }, + { &fs_names[269], 0, 0, "Rounded Box Annotation" }, + { &fs_names[270], 0, 0, "Circle Annotation" }, + { &fs_names[271], 0, 0, "Inverted Circle Annotation" }, + { &fs_names[272], 0, 0, "Parenthesized Annotation" }, + { &fs_names[273], 0, 0, "Period Annotation" }, + { &fs_names[274], 0, 0, "Roman Numeral Annotation" }, + { &fs_names[275], 0, 0, "Diamond Annotation" }, + { &fs_names[276], 0, 0, "Kana Spacing" }, + { &fs_names[277], 0, 0, "Full-Width" }, + { &fs_names[278], 0, 0, "Proportional" }, + { &fs_names[136], 0, 0, "Ideographic Spacing" }, + { &fs_names[137], 0, 0, "Full-Width" }, + { &fs_names[138], 0, 0, "Proportional" }, + { &fs_names[279], 0, 0, "Ideographic Spacing" }, + { &fs_names[280], 0, 0, "Full-Width" }, + { &fs_names[281], 0, 0, "Proportional" }, + { &fs_names[282], 0, 0, "CJK Roman Spacing" }, + { &fs_names[283], 0, 0, "Half-Width" }, + { &fs_names[284], 0, 0, "Proportional" }, + { &fs_names[285], 0, 0, "Default" }, + { &fs_names[286], 0, 0, "Full-Width" }, + { &fs_names[287], 0, 0, "Unicode Decomposition" }, + { &fs_names[288], 0, 0, "Canonical Decomposition" }, + { &fs_names[289], 0, 1, "Fonctions typographiques" }, + { &fs_names[290], 0, 1, "Toutes fonctions typographiques" }, + { &fs_names[291], 0, 1, "Ligatures" }, + { &fs_names[397], 0, 1, "Ligatures Requises" }, + { &fs_names[292], 0, 1, "Ligatures Usuelles" }, + { &fs_names[293], 0, 1, "Ligatures Rares" }, + { &fs_names[400], 0, 1, "Ligatures Logos" }, + { &fs_names[401], 0, 1, "Ligatures R\216bus" }, + { &fs_names[334], 0, 1, "Ligatures Diphtongues" }, + { &fs_names[403], 0, 1, "Ligatures Carr\216es" }, + { &fs_names[404], 0, 1, "Ligatures Carr\216es Abr\217g\216es" }, + { &fs_names[405], 0, 1, "Connection des Cursives" }, + { &fs_names[406], 0, 1, "Non connect\216es" }, + { &fs_names[407], 0, 1, "Partiellement connect\216es" }, + { &fs_names[408], 0, 1, "Pleinement connect\216es" }, + { &fs_names[409], 0, 1, "Casse" }, + { &fs_names[295], 0, 1, "Majuscules & Minuscules" }, + { &fs_names[296], 0, 1, "Tout Majuscule" }, + { &fs_names[412], 0, 1, "Tout Minuscule" }, + { &fs_names[297], 0, 1, "Petites Majuscules" }, + { &fs_names[414], 0, 1, "Initiales Majuscules" }, + { &fs_names[415], 0, 1, "Initiales + Petites Majuscules" }, + { &fs_names[416], 0, 1, "Substitution Verticale" }, + { &fs_names[417], 0, 1, "Substitution vertical" }, + { &fs_names[418], 0, 1, "Aucun Substitution vertical" }, + { &fs_names[419], 0, 1, "R\216arrangement Linguistique" }, + { &fs_names[420], 0, 1, "Avec R\216arrangement Linguistique" }, + { &fs_names[421], 0, 1, "Pas de R\216arrangement Linguistique" }, + { &fs_names[422], 0, 1, "Espacement des chiffres" }, + { &fs_names[299], 0, 1, "Chiffres de largeur fixe" }, + { &fs_names[300], 0, 1, "Chiffres Proportionnels" }, + { &fs_names[301], 0, 1, "Parafes" }, + { &fs_names[304], 0, 1, "Parafes en d\216but de mot" }, + { &fs_names[305], 0, 1, "Parafes en fin de mot" }, + { &fs_names[303], 0, 1, "Parafes en d\216but de ligne" }, + { &fs_names[302], 0, 1, "Parafes en fin de ligne" }, + { &fs_names[306], 0, 1, "Autres Parafes" }, + { &fs_names[431], 0, 1, "Signes Diacritiques" }, + { &fs_names[339], 0, 1, "Montrer les Signes Diacritiques" }, + { &fs_names[433], 0, 1, "Cacher les Signes Diacritiques" }, + { &fs_names[337], 0, 1, "D\216composer les Signes Diacritiques" }, + { &fs_names[435], 0, 1, "Position Verticale" }, + { &fs_names[309], 0, 1, "Position Verticale Normale" }, + { &fs_names[308], 0, 1, "Position Sup\216rieure" }, + { &fs_names[310], 0, 1, "Position Inf\216rieure" }, + { &fs_names[311], 0, 1, "Position Sup\216rieure Contextuelle (Num\216rique)" }, + { &fs_names[440], 0, 1, "Fractions" }, + { &fs_names[313], 0, 1, "Pas de Fractions" }, + { &fs_names[442], 0, 1, "Fractions Verticales" }, + { &fs_names[314], 0, 1, "Fractions en Diagonale" }, + { &fs_names[444], 0, 1, "Chevauchement des caract\217res" }, + { &fs_names[316], 0, 1, "\203viter le chevauchement" }, + { &fs_names[446], 0, 1, "Laisser le Chevauchement" }, + { &fs_names[317], 0, 1, "Extras Typographiques" }, + { &fs_names[448], 0, 1, "Tirets vers Tiret Large" }, + { &fs_names[449], 0, 1, "Tiret vers Tiret Moyen" }, + { &fs_names[450], 0, 1, "Z\216ro non Barr\216" }, + { &fs_names[451], 0, 1, "?! vers InterroExclam" }, + { &fs_names[336], 0, 1, "Apostrophes Intelligentes" }, + { &fs_names[453], 0, 1, "... vers Ellipse" }, + { &fs_names[318], 0, 1, "Extras Math\216matiques" }, + { &fs_names[319], 0, 1, "Tiret vers Moins" }, + { &fs_names[320], 0, 1, "\203toile vers Multipli\216" }, + { &fs_names[457], 0, 1, "Barre pench\216e vers Divis\216" }, + { &fs_names[458], 0, 1, "Ligatures pour In\216galit\216s" }, + { &fs_names[459], 0, 1, "Passage en Exposant" }, + { &fs_names[460], 0, 1, "Ensembles Ornementaux" }, + { &fs_names[322], 0, 1, "Pas d'Ornements" }, + { &fs_names[462], 0, 1, "Dingbats" }, + { &fs_names[463], 0, 1, "Symboles Sp\216cifiques \210 un Domaine" }, + { &fs_names[323], 0, 1, "Fleurons" }, + { &fs_names[465], 0, 1, "Bordures D\216coratives" }, + { &fs_names[466], 0, 1, "Symboles Internationaux" }, + { &fs_names[467], 0, 1, "Symboles Math\216matiques" }, + { &fs_names[468], 0, 1, "Caract\217res Alternatifs" }, + { &fs_names[325], 0, 1, "Sans Caract\217res Alternatifs" }, + { &fs_names[470], 0, 1, "Avec Caract\217res Alternatifs" }, + { &fs_names[471], 0, 1, "Autres Caract\217res Alternatifs" }, + { &fs_names[472], 0, 1, "Complexit\216 du Dessin" }, + { &fs_names[327], 0, 1, "Dessin Niveau 1" }, + { &fs_names[328], 0, 1, "Dessin Niveau 2" }, + { &fs_names[329], 0, 1, "Dessin Niveau 3" }, + { &fs_names[330], 0, 1, "Dessin Niveau 4" }, + { &fs_names[477], 0, 1, "Dessin Niveau 5" }, + { &fs_names[478], 0, 1, "Options de Style" }, + { &fs_names[479], 0, 1, "Texte Ordinaire" }, + { &fs_names[480], 0, 1, "Texte Majeur" }, + { &fs_names[481], 0, 1, "Texte en Relief" }, + { &fs_names[482], 0, 1, "Majuscules Enlumin\216es" }, + { &fs_names[483], 0, 1, "Majuscules de Titrage" }, + { &fs_names[484], 0, 1, "Majuscules avec Descendantes" }, + { &fs_names[485], 0, 1, "Forme des Caract\217res" }, + { &fs_names[486], 0, 1, "Traditionelle" }, + { &fs_names[487], 0, 1, "Simplifi\216e" }, + { &fs_names[488], 0, 1, "jis 1978" }, + { &fs_names[489], 0, 1, "jis 1983" }, + { &fs_names[490], 0, 1, "jis 1990" }, + { &fs_names[491], 0, 1, "Traditionelle Alt 1" }, + { &fs_names[492], 0, 1, "Traditionelle Alt 2" }, + { &fs_names[493], 0, 1, "Traditionelle Alt 3" }, + { &fs_names[494], 0, 1, "Traditionelle Alt 4" }, + { &fs_names[495], 0, 1, "Traditionelle Alt 5" }, + { &fs_names[496], 0, 1, "Expert" }, + { &fs_names[497], 0, 1, "Style des Chiffres" }, + { &fs_names[332], 0, 1, "Chiffres Anciens (bas de casse)" }, + { &fs_names[333], 0, 1, "Chiffres Conventionnels (alignants)" }, + { &fs_names[500], 0, 1, "Espacement du Texte" }, + { &fs_names[501], 0, 1, "Proportionel" }, + { &fs_names[502], 0, 1, "Fixe" }, + { &fs_names[503], 0, 1, "Translitt\216ration" }, + { &fs_names[504], 0, 1, "Sans Translitt\216ration" }, + { &fs_names[505], 0, 1, "Hanja vers Hangul" }, + { &fs_names[506], 0, 1, "Hiragana vers Katakana" }, + { &fs_names[507], 0, 1, "Katakana vers Hiragana" }, + { &fs_names[508], 0, 1, "Katakana vers Roman" }, + { &fs_names[509], 0, 1, "Roman vers Hiragana" }, + { &fs_names[510], 0, 1, "Roman vers Katakana" }, + { &fs_names[511], 0, 1, "Hanja vers Hangul Alt 1" }, + { &fs_names[512], 0, 1, "Hanja vers Hangul Alt 2" }, + { &fs_names[513], 0, 1, "Hanja vers Hangul Alt 3" }, + { &fs_names[514], 0, 1, "Annotations" }, + { &fs_names[515], 0, 1, "Sans Annotations" }, + { &fs_names[516], 0, 1, "Annotations Encadr\216es" }, + { &fs_names[517], 0, 1, "Annotations en Cadres arrondis" }, + { &fs_names[518], 0, 1, "Annotations dans des Cercles" }, + { &fs_names[519], 0, 1, "Annotations dans des Cercles inverses" }, + { &fs_names[520], 0, 1, "Annotations Parenth\217s\216es" }, + { &fs_names[521], 0, 1, "Annotations avec des ." }, + { &fs_names[522], 0, 1, "Annotations en Chiffres Romains" }, + { &fs_names[523], 0, 1, "Annotations Diamant" }, + { &fs_names[524], 0, 1, "Espacement Kana" }, + { &fs_names[525], 0, 1, "Pleine Taille" }, + { &fs_names[526], 0, 1, "Proportionnel" }, + { &fs_names[527], 0, 1, "Espacement des Id\216ogrammes" }, + { &fs_names[528], 0, 1, "Pleine Taille" }, + { &fs_names[529], 0, 1, "Proportionnel" }, + { &fs_names[533], 0, 1, "Espacement des CJK romains" }, + { &fs_names[534], 0, 1, "Pleine Taille" }, + { &fs_names[535], 0, 1, "Proportionnel" }, + { &fs_names[536], 0, 1, "Romains par D\216faut" }, + { &fs_names[537], 0, 1, "Romains Pleine Taille" }, + { &fs_names[340], 0, 1, "D\216composition Unicode" }, + { &fs_names[341], 0, 1, "D\216composition Canonique" }, + { &fs_names[342], 0, 2, "Alle typografischen M\232glichkeiten" }, + { &fs_names[343], 0, 2, "Alle Auszeichnungsarten" }, + { &fs_names[344], 0, 2, "Ligaturen" }, + { &fs_names[346], 0, 2, "Normale Ligaturen" }, + { &fs_names[345], 0, 2, "Seltene Ligaturen" }, + { &fs_names[347], 0, 2, "Schreibweise" }, + { &fs_names[348], 0, 2, "Gro\247/Klein" }, + { &fs_names[349], 0, 2, "Gro\247" }, + { &fs_names[350], 0, 2, "Kapit\212lchen" }, + { &fs_names[351], 0, 2, "Ziffernabst\212nde" }, + { &fs_names[352], 0, 2, "Tabellenziffern" }, + { &fs_names[353], 0, 2, "Proportionalziffern" }, + { &fs_names[354], 0, 2, "Zierbuchstabe" }, + { &fs_names[355], 0, 2, "Zierbuchstabe Zeilenende" }, + { &fs_names[356], 0, 2, "Zierbuchstabe Zeilenanfang" }, + { &fs_names[357], 0, 2, "Zierbuchstabe Wortanfang" }, + { &fs_names[358], 0, 2, "Zierbuchstabe Wortende" }, + { &fs_names[359], 0, 2, "Zierbuchstabe Beliebig" }, + { &fs_names[360], 0, 2, "Hoch-/Tiefstellen" }, + { &fs_names[361], 0, 2, "Hochgestellt" }, + { &fs_names[362], 0, 2, "Normal" }, + { &fs_names[363], 0, 2, "Tiefgestellt" }, + { &fs_names[364], 0, 2, "Ordnungszahlen" }, + { &fs_names[365], 0, 2, "Br\237che" }, + { &fs_names[367], 0, 2, "Kein Bruche" }, + { &fs_names[366], 0, 2, "Diagonaler Bruch" }, + { &fs_names[368], 0, 2, "\206berlappen" }, + { &fs_names[369], 0, 2, "\206berlappen vermeiden" }, + { &fs_names[335], 0, 2, "Typographische Extras" }, + { &fs_names[370], 0, 2, "Mathematische Sonderzeichen" }, + { &fs_names[371], 0, 2, "Minuszeichen" }, + { &fs_names[372], 0, 2, "Malzeichen" }, + { &fs_names[373], 0, 2, "Sonderzeichen" }, + { &fs_names[374], 0, 2, "Keine Sonderzeichen" }, + { &fs_names[375], 0, 2, "Pflanzenornamente" }, + { &fs_names[376], 0, 2, "Alternative Zeichen" }, + { &fs_names[377], 0, 2, "Keine Alternativ-Figuren" }, + { &fs_names[378], 0, 2, "Modifikationsgrad" }, + { &fs_names[379], 0, 2, "Design Stufe 1" }, + { &fs_names[380], 0, 2, "Design Stufe 2" }, + { &fs_names[381], 0, 2, "Design Stufe 3" }, + { &fs_names[382], 0, 2, "Design Stufe 4" }, + { &fs_names[383], 0, 2, "Zahlendarstellung" }, + { &fs_names[384], 0, 2, "Medi\276val-Ziffern" }, + { &fs_names[385], 0, 2, "Normale Ziffern" }, + { &fs_names[386], 0, 2, "Diphtong Ligaturen" }, + { &fs_names[387], 0, 2, "Typografische Extras" }, + { &fs_names[388], 0, 2, "Ersetzen mit geschwungenen Anf\237hrungszeichen" }, + { &fs_names[389], 0, 2, "Keine Ver\212nderung" }, + { &fs_names[390], 0, 2, "Diakritische Zeichen" }, + { &fs_names[391], 0, 2, "Diakritische Zeichen zeigen" }, + { &fs_names[392], 0, 2, "In Unicode zerlegen" }, + { &fs_names[393], 0, 2, "anerkannte Komposition" }, + { &fs_names[394], 0, 3, "Funzioni Tipografiche" }, + { &fs_names[395], 0, 3, "Tutte le Funzioni" }, + { &fs_names[396], 0, 3, "Legature" }, + { &fs_names[399], 0, 3, "Legature Rare" }, + { &fs_names[398], 0, 3, "Legature pi\235 Comuni" }, + { NULL, 0, 3, "Maiuscolo o Minuscolo" }, + { &fs_names[410], 0, 3, "Maiuscolo & minuscolo" }, + { &fs_names[411], 0, 3, "Tutto in Maiuscolo" }, + { &fs_names[413], 0, 3, "Maiuscoletto" }, + { NULL, 0, 3, "Spaziatura numeri" }, + { &fs_names[423], 0, 3, "Monospaziata" }, + { &fs_names[424], 0, 3, "Proporzionale" }, + { &fs_names[425], 0, 3, "Lettere Ornate" }, + { &fs_names[429], 0, 3, "Fine Riga" }, + { &fs_names[428], 0, 3, "Inizio Riga" }, + { &fs_names[426], 0, 3, "All'inizio" }, + { &fs_names[427], 0, 3, "Alla Fine" }, + { &fs_names[430], 0, 3, "All'interno" }, + { NULL, 0, 3, "Posizione Verticale" }, + { &fs_names[437], 0, 3, "Apice" }, + { &fs_names[436], 0, 3, "Posizione Normale" }, + { &fs_names[438], 0, 3, "Pedice" }, + { &fs_names[439], 0, 3, "Ordinali" }, + { NULL, 0, 3, "Frazioni" }, + { &fs_names[443], 0, 3, "Frazioni Diagonali" }, + { &fs_names[441], 0, 3, "Nessuna Frazione" }, + { NULL, 0, 3, "Caratteri Sovrapposti" }, + { &fs_names[445], 0, 3, "Nessuna Sovrapposizione" }, + { &fs_names[454], 0, 3, "Conversioni Matematiche" }, + { &fs_names[455], 0, 3, "Trattino per Sottrazione" }, + { &fs_names[456], 0, 3, "Asterisco per Moltiplicazione" }, + { NULL, 0, 3, "Impostazione Ornamenti" }, + { &fs_names[461], 0, 3, "Nessun Ornamento" }, + { &fs_names[464], 0, 3, "Fleurons" }, + { NULL, 0, 3, "Caratteri Alternativi" }, + { &fs_names[469], 0, 3, "Nessuna alternativa" }, + { NULL, 0, 3, "Design Complexity" }, + { &fs_names[473], 0, 3, "Livello 1" }, + { &fs_names[474], 0, 3, "Livello 2" }, + { &fs_names[475], 0, 3, "Livello 3" }, + { &fs_names[476], 0, 3, "Livello 4" }, + { NULL, 0, 3, "Posizione Numeri" }, + { &fs_names[498], 0, 3, "Sopra la Linea Base" }, + { &fs_names[499], 0, 3, "Tradizionale" }, + { &fs_names[402], 0, 3, "Legature dittonghi" }, + { &fs_names[447], 0, 3, "Extra tipografici" }, + { &fs_names[452], 0, 3, "Virgolette eleganti" }, + { &fs_names[434], 0, 3, "Nessuna modifica" }, + { NULL, 0, 3, "Diacritici" }, + { &fs_names[432], 0, 3, "Mostra diacritici" }, + { &fs_names[538], 0, 3, "Scomposizione unicode" }, + { &fs_names[539], 0, 3, "Composizione canonica" }, + { NULL, 0, 4, "Alle typografische kenmerken" }, + { NULL, 0, 4, "Alle typekenmerken" }, + { NULL, 0, 4, "Ligaturen" }, + { NULL, 0, 4, "Vereiste ligaturen" }, + { NULL, 0, 4, "Gemeenschappelijke Ligaturen" }, + { NULL, 0, 4, "Zeldzame ligaturen" }, + { NULL, 0, 4, "Logoligaturen" }, + { NULL, 0, 4, "Rebusligaturen" }, + { NULL, 0, 4, "Tweeklankligaturen" }, + { NULL, 0, 4, "Vierkante ligaturen" }, + { NULL, 0, 4, "Afgekorte vierkante ligatures" }, + { NULL, 0, 4, "Cursieve verbinding" }, + { NULL, 0, 4, "Niet verbonden" }, + { NULL, 0, 4, "Gedeeltelijk verbonden" }, + { NULL, 0, 4, "Cursief" }, + { NULL, 0, 4, "Hoofd/kleine letters" }, + { NULL, 0, 4, "Hoofd- en kleine letters" }, + { NULL, 0, 4, "Alles in hoofdletters" }, + { NULL, 0, 4, "Alles in kleine letters" }, + { NULL, 0, 4, "Kleine hoofdletters" }, + { NULL, 0, 4, "Eerste hoofdletters" }, + { NULL, 0, 4, "Eerste en kleine hoofdletters" }, + { NULL, 0, 4, "Verticale vervanging" }, + { NULL, 0, 4, "Verticale vervanging" }, + { NULL, 0, 4, "Geen verticale vervanging" }, + { NULL, 0, 4, "Taalkundige herschikking" }, + { NULL, 0, 4, "Taalkundige herschikking" }, + { NULL, 0, 4, "Geen taalkundige herschikking" }, + { NULL, 0, 4, "Nummerafstanden" }, + { NULL, 0, 4, "Vaste nummerafstanden" }, + { NULL, 0, 4, "Proportionele nummers" }, + { NULL, 0, 4, "Slimme versieringingen" }, + { NULL, 0, 4, "Woordbegin-versieringingen" }, + { NULL, 0, 4, "Woordeinde-versieringingen" }, + { NULL, 0, 4, "Regelbegin-versieringingen" }, + { NULL, 0, 4, "Regeleinde-versieringingen" }, + { NULL, 0, 4, "Niet-einde-versieringingen" }, + { NULL, 0, 4, "Accenten" }, + { NULL, 0, 4, "Accenten tonen" }, + { NULL, 0, 4, "Accenten verbergen" }, + { NULL, 0, 4, "Accenten ontleden" }, + { NULL, 0, 4, "Verticale positie" }, + { NULL, 0, 4, "Normale verticale positie" }, + { NULL, 0, 4, "Superieuren" }, + { NULL, 0, 4, "Inferieuren" }, + { NULL, 0, 4, "Ordinalen" }, + { NULL, 0, 4, "Breuken" }, + { NULL, 0, 4, "Geen breuken" }, + { NULL, 0, 4, "Verticale breuken" }, + { NULL, 0, 4, "Diagonale breuken" }, + { NULL, 0, 4, "Overlappende tekens" }, + { NULL, 0, 4, "Overlap voorkomen" }, + { NULL, 0, 4, "Overlap toestaan" }, + { NULL, 0, 4, "Typografische extras" }, + { NULL, 0, 4, "Koppelteken naar em-streep" }, + { NULL, 0, 4, "Koppelteken naar en-streepje" }, + { NULL, 0, 4, "Nul zonder schuine streep" }, + { NULL, 0, 4, "Vorm interrobang" }, + { NULL, 0, 4, "Slimme aanhalingstekens" }, + { NULL, 0, 4, "Punten naar ellipsen" }, + { NULL, 0, 4, "Wiskundige extras" }, + { NULL, 0, 4, "Koppelteken naar minteken" }, + { NULL, 0, 4, "Sterretje naar multiplicatieteken" }, + { NULL, 0, 4, "Schuine streep naar deelteken" }, + { NULL, 0, 4, "Ongelijkheidsligaturen" }, + { NULL, 0, 4, "Exponenten aan" }, + { NULL, 0, 4, "Ornamentenverzamelingen" }, + { NULL, 0, 4, "Geen ornamenten" }, + { NULL, 0, 4, "Dingbats" }, + { NULL, 0, 4, "Pi-tekens" }, + { NULL, 0, 4, "Fleurons" }, + { NULL, 0, 4, "Decoratieve randen" }, + { NULL, 0, 4, "Internationale symbolen" }, + { NULL, 0, 4, "Wiskundige Symbolen" }, + { NULL, 0, 4, "Tekenalternatieven" }, + { NULL, 0, 4, "Geen alternatieven" }, + { NULL, 0, 4, "Alternatieve tekens" }, + { NULL, 0, 4, "Andere alternatieven" }, + { NULL, 0, 4, "Ontwepcomplexiteit" }, + { NULL, 0, 4, "Ontwerpniveau 1" }, + { NULL, 0, 4, "Ontwerpniveau 2" }, + { NULL, 0, 4, "Ontwerpniveau 3" }, + { NULL, 0, 4, "Ontwerpniveau 4" }, + { NULL, 0, 4, "Ontwerpniveau 5" }, + { NULL, 0, 4, "Stijlopties" }, + { NULL, 0, 4, "Geen stijl ptions" }, + { NULL, 0, 4, "Tekst tonen" }, + { NULL, 0, 4, "Gegraveerde tekst" }, + { NULL, 0, 4, "Uitgelichte koppen" }, + { NULL, 0, 4, "Titelkoppen" }, + { NULL, 0, 4, "Eindkoppen" }, + { NULL, 0, 4, "Tekenvorm" }, + { NULL, 0, 4, "Traditioneel" }, + { NULL, 0, 4, "Vereenvoudigd" }, + { NULL, 0, 4, "jis 1978" }, + { NULL, 0, 4, "jis 1983" }, + { NULL, 0, 4, "jis 1990" }, + { NULL, 0, 4, "Traditioneel Alt 1" }, + { NULL, 0, 4, "Traditioneel Alt 2" }, + { NULL, 0, 4, "Traditioneel Alt 3" }, + { NULL, 0, 4, "Traditioneel Alt 4" }, + { NULL, 0, 4, "Traditioneel Alt 5" }, + { NULL, 0, 4, "Expert" }, + { NULL, 0, 4, "Nummerhoogte" }, + { NULL, 0, 4, "Kleine nummers" }, + { NULL, 0, 4, "Grote nummers" }, + { NULL, 0, 4, "TekstspatiQring" }, + { NULL, 0, 4, "Proportioneel" }, + { NULL, 0, 4, "Gelijk gespatieerd" }, + { NULL, 0, 4, "Transliteratie" }, + { NULL, 0, 4, "Geen transliteratie" }, + { NULL, 0, 4, "Hanja naar Hangul" }, + { NULL, 0, 4, "Hiragana naar Katakana" }, + { NULL, 0, 4, "Katakana naar Hiragana" }, + { NULL, 0, 4, "Katakana naar Romeins" }, + { NULL, 0, 4, "Romeins naar Hiragana" }, + { NULL, 0, 4, "Romeins naar Katakana" }, + { NULL, 0, 4, "Hanja naar Hangul Alt 1" }, + { NULL, 0, 4, "Hanja naar Hangul Alt 2" }, + { NULL, 0, 4, "Hanja naar Hangul Alt 3" }, + { NULL, 0, 4, "Annotatie" }, + { NULL, 0, 4, "Geen annotatie" }, + { NULL, 0, 4, "Vierkantannotatie" }, + { NULL, 0, 4, "Ronde-vierkantannotatie" }, + { NULL, 0, 4, "Cirkelannotatie" }, + { NULL, 0, 4, "Omgekeerde cirkelannotatie" }, + { NULL, 0, 4, "Aanhalingstekenannotatie" }, + { NULL, 0, 4, "Puntannotatie" }, + { NULL, 0, 4, "Romeinse-cijferannotatie" }, + { NULL, 0, 4, "Diamantannotatie" }, + { NULL, 0, 4, "Kana spatiQring" }, + { NULL, 0, 4, "Volledige breedte" }, + { NULL, 0, 4, "Proportioneel" }, + { &fs_names[530], 0, 4, "Ideographische spatiQring" }, + { &fs_names[531], 0, 4, "Volledige breedte" }, + { &fs_names[532], 0, 4, "Proportioneel" }, + { NULL, 0, 4, "IdeograafspatiQring" }, + { NULL, 0, 4, "Volledige breedte" }, + { NULL, 0, 4, "Proportioneel" }, + { NULL, 0, 4, "CJK Romeinse spatiQring" }, + { NULL, 0, 4, "Halve breedte" }, + { NULL, 0, 4, "Proportioneel" }, + { NULL, 0, 4, "Default" }, + { NULL, 0, 4, "Volledige breedte" }, + { NULL, 0, 4, "Unicodeontleding" }, + { NULL, 0, 4, "Canonieke ontleding" }, + { NULL } +}; + +static struct macsetting fs_settings[] = { + { NULL, 0, 0, &fs_names[1], 0 }, + { NULL, 14, 0, &fs_names[10], 0 }, + { &fs_settings[1], 12, 0, &fs_names[9], 0 }, + { &fs_settings[2], 10, 0, &fs_names[8], 0 }, + { &fs_settings[3], 8, 0, &fs_names[7], 0 }, + { &fs_settings[4], 6, 0, &fs_names[6], 0 }, + { &fs_settings[5], 4, 0, &fs_names[5], 0 }, + { &fs_settings[6], 2, 0, &fs_names[4], 1 }, + { &fs_settings[7], 0, 0, &fs_names[3], 1 }, + { NULL, 2, 0, &fs_names[14], 0 }, + { &fs_settings[9], 1, 0, &fs_names[13], 0 }, + { &fs_settings[10], 0, 0, &fs_names[12], 1 }, + { NULL, 5, 0, &fs_names[21], 0 }, + { &fs_settings[12], 4, 0, &fs_names[20], 0 }, + { &fs_settings[13], 3, 0, &fs_names[19], 0 }, + { &fs_settings[14], 2, 0, &fs_names[18], 0 }, + { &fs_settings[15], 1, 0, &fs_names[17], 0 }, + { &fs_settings[16], 0, 0, &fs_names[16], 1 }, + { NULL, 1, 0, &fs_names[24], 0 }, + { &fs_settings[18], 0, 0, &fs_names[23], 1 }, + { NULL, 1, 0, &fs_names[27], 0 }, + { &fs_settings[20], 0, 0, &fs_names[26], 1 }, + { NULL, 1, 0, &fs_names[30], 0 }, + { &fs_settings[22], 0, 0, &fs_names[29], 1 }, + { NULL, 8, 0, &fs_names[36], 0 }, + { &fs_settings[24], 6, 0, &fs_names[35], 0 }, + { &fs_settings[25], 4, 0, &fs_names[34], 0 }, + { &fs_settings[26], 2, 0, &fs_names[33], 0 }, + { &fs_settings[27], 0, 0, &fs_names[32], 0 }, + { NULL, 2, 0, &fs_names[40], 0 }, + { &fs_settings[29], 1, 0, &fs_names[39], 0 }, + { &fs_settings[30], 0, 0, &fs_names[38], 1 }, + { NULL, 3, 0, &fs_names[45], 0 }, + { &fs_settings[32], 2, 0, &fs_names[44], 0 }, + { &fs_settings[33], 1, 0, &fs_names[43], 0 }, + { &fs_settings[34], 0, 0, &fs_names[42], 1 }, + { NULL, 2, 0, &fs_names[49], 0 }, + { &fs_settings[36], 1, 0, &fs_names[48], 0 }, + { &fs_settings[37], 0, 0, &fs_names[47], 1 }, + { NULL, 1, 0, &fs_names[52], 0 }, + { &fs_settings[39], 0, 0, &fs_names[51], 1 }, + { NULL, 10, 0, &fs_names[59], 0 }, + { &fs_settings[41], 8, 0, &fs_names[58], 0 }, + { &fs_settings[42], 6, 0, &fs_names[57], 0 }, + { &fs_settings[43], 4, 0, &fs_names[56], 0 }, + { &fs_settings[44], 2, 0, &fs_names[55], 0 }, + { &fs_settings[45], 0, 0, &fs_names[54], 0 }, + { NULL, 8, 0, &fs_names[65], 0 }, + { &fs_settings[47], 6, 0, &fs_names[64], 0 }, + { &fs_settings[48], 4, 0, &fs_names[63], 0 }, + { &fs_settings[49], 2, 0, &fs_names[62], 0 }, + { &fs_settings[50], 0, 0, &fs_names[61], 0 }, + { NULL, 6, 0, &fs_names[73], 0 }, + { &fs_settings[52], 5, 0, &fs_names[72], 0 }, + { &fs_settings[53], 4, 0, &fs_names[71], 0 }, + { &fs_settings[54], 3, 0, &fs_names[70], 0 }, + { &fs_settings[55], 2, 0, &fs_names[69], 0 }, + { &fs_settings[56], 1, 0, &fs_names[68], 0 }, + { &fs_settings[57], 0, 0, &fs_names[67], 1 }, + { NULL, 2, 0, &fs_names[77], 0 }, + { &fs_settings[59], 1, 0, &fs_names[76], 0 }, + { &fs_settings[60], 0, 0, &fs_names[75], 1 }, + { NULL, 4, 0, &fs_names[83], 0 }, + { &fs_settings[62], 3, 0, &fs_names[82], 0 }, + { &fs_settings[63], 2, 0, &fs_names[81], 0 }, + { &fs_settings[64], 1, 0, &fs_names[80], 0 }, + { &fs_settings[65], 0, 0, &fs_names[79], 1 }, + { NULL, 5, 0, &fs_names[90], 0 }, + { &fs_settings[67], 4, 0, &fs_names[89], 0 }, + { &fs_settings[68], 3, 0, &fs_names[88], 0 }, + { &fs_settings[69], 2, 0, &fs_names[87], 0 }, + { &fs_settings[70], 1, 0, &fs_names[86], 0 }, + { &fs_settings[71], 0, 0, &fs_names[85], 1 }, + { NULL, 10, 0, &fs_names[102], 0 }, + { &fs_settings[73], 9, 0, &fs_names[101], 0 }, + { &fs_settings[74], 8, 0, &fs_names[100], 0 }, + { &fs_settings[75], 7, 0, &fs_names[99], 0 }, + { &fs_settings[76], 6, 0, &fs_names[98], 0 }, + { &fs_settings[77], 5, 0, &fs_names[97], 0 }, + { &fs_settings[78], 4, 0, &fs_names[96], 0 }, + { &fs_settings[79], 3, 0, &fs_names[95], 0 }, + { &fs_settings[80], 2, 0, &fs_names[94], 0 }, + { &fs_settings[81], 1, 0, &fs_names[93], 0 }, + { &fs_settings[82], 0, 0, &fs_names[92], 1 }, + { NULL, 1, 0, &fs_names[105], 1 }, + { &fs_settings[84], 0, 0, &fs_names[104], 0 }, + { NULL, 1, 0, &fs_names[108], 0 }, + { &fs_settings[86], 0, 0, &fs_names[107], 1 }, + { NULL, 9, 0, &fs_names[119], 0 }, + { &fs_settings[88], 8, 0, &fs_names[118], 0 }, + { &fs_settings[89], 7, 0, &fs_names[117], 0 }, + { &fs_settings[90], 6, 0, &fs_names[116], 0 }, + { &fs_settings[91], 5, 0, &fs_names[115], 0 }, + { &fs_settings[92], 4, 0, &fs_names[114], 0 }, + { &fs_settings[93], 3, 0, &fs_names[113], 0 }, + { &fs_settings[94], 2, 0, &fs_names[112], 0 }, + { &fs_settings[95], 1, 0, &fs_names[111], 0 }, + { &fs_settings[96], 0, 0, &fs_names[110], 1 }, + { NULL, 8, 0, &fs_names[129], 0 }, + { &fs_settings[98], 7, 0, &fs_names[128], 0 }, + { &fs_settings[99], 6, 0, &fs_names[127], 0 }, + { &fs_settings[100], 5, 0, &fs_names[126], 0 }, + { &fs_settings[101], 4, 0, &fs_names[125], 0 }, + { &fs_settings[102], 3, 0, &fs_names[124], 0 }, + { &fs_settings[103], 2, 0, &fs_names[123], 0 }, + { &fs_settings[104], 1, 0, &fs_names[122], 0 }, + { &fs_settings[105], 0, 0, &fs_names[121], 1 }, + { NULL, 1, 0, &fs_names[132], 0 }, + { &fs_settings[107], 0, 0, &fs_names[131], 1 }, + { NULL, 1, 0, &fs_names[135], 0 }, + { &fs_settings[109], 0, 0, &fs_names[134], 1 }, + { NULL, 0, 0, &fs_names[145], 0 }, + { NULL, 3, 0, &fs_names[143], 0 }, + { &fs_settings[112], 2, 0, &fs_names[142], 0 }, + { &fs_settings[113], 1, 0, &fs_names[141], 0 }, + { &fs_settings[114], 0, 0, &fs_names[140], 1 }, + { NULL } +}; + +static MacFeat fs_features[] = { + { NULL, 103, 1, 0, 0, &fs_names[139], &fs_settings[115] }, + { &fs_features[0], 27, 0, 0, 0, &fs_names[144], &fs_settings[111] }, + { &fs_features[1], 26, 1, 0, 0, &fs_names[133], &fs_settings[110] }, + { &fs_features[2], 25, 1, 0, 0, &fs_names[130], &fs_settings[108] }, + { &fs_features[3], 24, 1, 0, 0, &fs_names[120], &fs_settings[106] }, + { &fs_features[4], 23, 1, 0, 0, &fs_names[109], &fs_settings[97] }, + { &fs_features[5], 22, 1, 0, 0, &fs_names[106], &fs_settings[87] }, + { &fs_features[6], 21, 1, 1, 0, &fs_names[103], &fs_settings[85] }, + { &fs_features[7], 20, 1, 0, 0, &fs_names[91], &fs_settings[83] }, + { &fs_features[8], 19, 1, 0, 0, &fs_names[84], &fs_settings[72] }, + { &fs_features[9], 18, 1, 0, 0, &fs_names[78], &fs_settings[66] }, + { &fs_features[10], 17, 1, 0, 0, &fs_names[74], &fs_settings[61] }, + { &fs_features[11], 16, 1, 0, 0, &fs_names[66], &fs_settings[58] }, + { &fs_features[12], 15, 0, 0, 0, &fs_names[60], &fs_settings[51] }, + { &fs_features[13], 14, 0, 0, 0, &fs_names[53], &fs_settings[46] }, + { &fs_features[14], 13, 1, 0, 0, &fs_names[50], &fs_settings[40] }, + { &fs_features[15], 11, 1, 0, 0, &fs_names[46], &fs_settings[38] }, + { &fs_features[16], 10, 1, 0, 0, &fs_names[41], &fs_settings[35] }, + { &fs_features[17], 9, 1, 0, 0, &fs_names[37], &fs_settings[31] }, + { &fs_features[18], 8, 0, 0, 0, &fs_names[31], &fs_settings[28] }, + { &fs_features[19], 6, 1, 0, 0, &fs_names[28], &fs_settings[23] }, + { &fs_features[20], 5, 1, 0, 0, &fs_names[25], &fs_settings[21] }, + { &fs_features[21], 4, 1, 0, 0, &fs_names[22], &fs_settings[19] }, + { &fs_features[22], 3, 1, 0, 0, &fs_names[15], &fs_settings[17] }, + { &fs_features[23], 2, 1, 0, 0, &fs_names[11], &fs_settings[11] }, + { &fs_features[24], 1, 0, 0, 0, &fs_names[2], &fs_settings[8] }, + { &fs_features[25], 0, 0, 0, 0, &fs_names[0], &fs_settings[0] }, + { NULL } +}; + +MacFeat *default_mac_feature_map = &fs_features[26], + *builtin_mac_feature_map=&fs_features[26], + *user_mac_feature_map; + +static int MacNamesDiffer(struct macname *mn, struct macname *mn2) { + + for ( ; mn!=NULL && mn2!=NULL; mn=mn->next, mn2 = mn2->next ) { + if ( mn->lang != mn2->lang || mn->enc!=mn2->enc || + strcmp(mn->name,mn2->name)!=0 ) +return( true ); + } + if ( mn==mn2 ) /* Both NULL */ +return( false ); + +return( true ); +} + +static int MacSettingsDiffer(struct macsetting *ms, struct macsetting *ms2) { + + for ( ; ms!=NULL && ms2!=NULL; ms=ms->next, ms2 = ms2->next ) { + if ( ms->setting != ms2->setting || + ms->initially_enabled != ms2->initially_enabled || + MacNamesDiffer(ms->setname,ms2->setname) ) +return( true ); + } + if ( ms==ms2 ) /* Both NULL */ +return( false ); + +return( true ); +} + +int UserFeaturesDiffer(void) { + MacFeat *mf, *mf2; + if ( user_mac_feature_map==NULL ) +return( false ); + for ( mf=builtin_mac_feature_map, mf2=user_mac_feature_map; + mf!=NULL && mf2!=NULL; mf=mf->next, mf2 = mf2->next ) { + if ( mf->feature != mf2->feature || mf->ismutex != mf2->ismutex || + mf->default_setting != mf2->default_setting || + MacNamesDiffer(mf->featname,mf2->featname) || + MacSettingsDiffer(mf->settings,mf2->settings)) +return( true ); + } + if ( mf==mf2 ) /* Both NULL */ +return( false ); + +return( true ); +} + +static struct macname *MacNameCopy(struct macname *mn) { + struct macname *head=NULL, *last, *cur; + + while ( mn!=NULL ) { + cur = chunkalloc(sizeof(struct macname)); + cur->enc = mn->enc; + cur->lang = mn->lang; + cur->name = copy(mn->name); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + mn = mn->next; + } +return( head ); +} + +static struct macsetting *MacSettingCopy(struct macsetting *ms) { + struct macsetting *head=NULL, *last, *cur; + + while ( ms!=NULL ) { + cur = chunkalloc(sizeof(struct macsetting)); + cur->setting = ms->setting; + cur->setname = MacNameCopy(ms->setname); + cur->initially_enabled = ms->initially_enabled; + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + ms = ms->next; + } +return( head ); +} + +static MacFeat *MacFeatCopy(MacFeat *mf) { + MacFeat *head=NULL, *last, *cur; + + while ( mf!=NULL ) { + cur = chunkalloc(sizeof(MacFeat)); + cur->feature = mf->feature; + cur->featname = MacNameCopy(mf->featname); + cur->settings = MacSettingCopy(mf->settings); + cur->ismutex = mf->ismutex; + cur->default_setting = mf->default_setting; + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + mf = mf->next; + } +return( head ); +} + +/* ************************************************************************** */ +static GTextInfo maclanguages[] = { + { (unichar_t *) _STR_MacEnglish, NULL, 0, 0, (void *) 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacFrench, NULL, 0, 0, (void *) 1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGerman, NULL, 0, 0, (void *) 2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacItalian, NULL, 0, 0, (void *) 3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacDutch, NULL, 0, 0, (void *) 4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSwedish, NULL, 0, 0, (void *) 5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSpanish, NULL, 0, 0, (void *) 6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacDanish, NULL, 0, 0, (void *) 7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacPortuguese, NULL, 0, 0, (void *) 8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacNorwegian, NULL, 0, 0, (void *) 9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacHebrew, NULL, 0, 0, (void *) 10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacJapanese, NULL, 0, 0, (void *) 11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacArabic, NULL, 0, 0, (void *) 12, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacFinnish, NULL, 0, 0, (void *) 13, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGreek, NULL, 0, 0, (void *) 14, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacIcelandic, NULL, 0, 0, (void *) 15, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMaltese, NULL, 0, 0, (void *) 16, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTurkish, NULL, 0, 0, (void *) 17, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacCroatian, NULL, 0, 0, (void *) 18, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTraditionalChinese, NULL, 0, 0, (void *) 19, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacUrdu, NULL, 0, 0, (void *) 20, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacHindi, NULL, 0, 0, (void *) 21, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacThai, NULL, 0, 0, (void *) 22, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKorean, NULL, 0, 0, (void *) 23, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacLithuanian, NULL, 0, 0, (void *) 24, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacPolish, NULL, 0, 0, (void *) 25, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacHungarian, NULL, 0, 0, (void *) 26, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacEstonian, NULL, 0, 0, (void *) 27, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacLatvian, NULL, 0, 0, (void *) 28, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSami, NULL, 0, 0, (void *) 29, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacFaroese, NULL, 0, 0, (void *) 30, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacFarsi, NULL, 0, 0, (void *) 31, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacRussian, NULL, 0, 0, (void *) 32, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSimplifiedChinese, NULL, 0, 0, (void *) 33, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacFlemish, NULL, 0, 0, (void *) 34, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacIrish, NULL, 0, 0, (void *) 35, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAlbanian, NULL, 0, 0, (void *) 36, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacRomanian, NULL, 0, 0, (void *) 37, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacCzech, NULL, 0, 0, (void *) 38, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSlovak, NULL, 0, 0, (void *) 39, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSlovenian, NULL, 0, 0, (void *) 40, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacYiddish, NULL, 0, 0, (void *) 41, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSerbian, NULL, 0, 0, (void *) 42, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMacedonian, NULL, 0, 0, (void *) 43, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacBulgarian, NULL, 0, 0, (void *) 44, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacUkrainian, NULL, 0, 0, (void *) 45, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacByelorussian, NULL, 0, 0, (void *) 46, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacUzbek, NULL, 0, 0, (void *) 47, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKazakh, NULL, 0, 0, (void *) 48, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAxerbaijaniC, NULL, 0, 0, (void *) 49, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAxerbaijaniA, NULL, 0, 0, (void *) 50, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacArmenian, NULL, 0, 0, (void *) 51, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGeorgian, NULL, 0, 0, (void *) 52, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMoldavian, NULL, 0, 0, (void *) 53, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKirghiz, NULL, 0, 0, (void *) 54, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTajiki, NULL, 0, 0, (void *) 55, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTurkmen, NULL, 0, 0, (void *) 56, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMongolianM, NULL, 0, 0, (void *) 57, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMongolianC, NULL, 0, 0, (void *) 58, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacPashto, NULL, 0, 0, (void *) 59, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKurdish, NULL, 0, 0, (void *) 60, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKashmiri, NULL, 0, 0, (void *) 61, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSindhi, NULL, 0, 0, (void *) 62, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTibetan, NULL, 0, 0, (void *) 63, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacNepali, NULL, 0, 0, (void *) 64, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSanskrit, NULL, 0, 0, (void *) 65, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMarathi, NULL, 0, 0, (void *) 66, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacBengali, NULL, 0, 0, (void *) 67, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAssamese, NULL, 0, 0, (void *) 68, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGujarati, NULL, 0, 0, (void *) 69, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacPunjabi, NULL, 0, 0, (void *) 70, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacOriya, NULL, 0, 0, (void *) 71, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMalayalam, NULL, 0, 0, (void *) 72, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKannada, NULL, 0, 0, (void *) 73, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTamil, NULL, 0, 0, (void *) 74, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTelugu, NULL, 0, 0, (void *) 75, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSinhalese, NULL, 0, 0, (void *) 76, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacBurmese, NULL, 0, 0, (void *) 77, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKhmer, NULL, 0, 0, (void *) 78, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacLao, NULL, 0, 0, (void *) 79, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacVietnamese, NULL, 0, 0, (void *) 80, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacIndonesian, NULL, 0, 0, (void *) 81, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTagalog, NULL, 0, 0, (void *) 82, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMalayR, NULL, 0, 0, (void *) 83, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMalayA, NULL, 0, 0, (void *) 84, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAmharic, NULL, 0, 0, (void *) 85, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTigrinya, NULL, 0, 0, (void *) 86, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGalla, NULL, 0, 0, (void *) 87, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSomali, NULL, 0, 0, (void *) 88, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSwahili, NULL, 0, 0, (void *) 89, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacKinyarwanda, NULL, 0, 0, (void *) 90, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacRundi, NULL, 0, 0, (void *) 91, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacNyanja, NULL, 0, 0, (void *) 92, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacMalagasy, NULL, 0, 0, (void *) 93, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacEsperanto, NULL, 0, 0, (void *) 94, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacWelsh, NULL, 0, 0, (void *) 128, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacBasque, NULL, 0, 0, (void *) 129, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacCatalan, NULL, 0, 0, (void *) 130, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacLatinLang, NULL, 0, 0, (void *) 131, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacQuechua, NULL, 0, 0, (void *) 132, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGuarani, NULL, 0, 0, (void *) 133, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAymara, NULL, 0, 0, (void *) 134, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTatar, NULL, 0, 0, (void *) 135, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacUighur, NULL, 0, 0, (void *) 136, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacDzongkha, NULL, 0, 0, (void *) 137, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacJavanese, NULL, 0, 0, (void *) 138, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacSundanese, NULL, 0, 0, (void *) 139, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGalician, NULL, 0, 0, (void *) 140, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAfrikaans, NULL, 0, 0, (void *) 141, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacBreton, NULL, 0, 0, (void *) 142, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacInuktitut, NULL, 0, 0, (void *) 143, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacScottish, NULL, 0, 0, (void *) 144, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacManx, NULL, 0, 0, (void *) 145, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacIrishDot, NULL, 0, 0, (void *) 146, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacTongan, NULL, 0, 0, (void *) 147, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGreekPolytonic, NULL, 0, 0, (void *) 148, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacGreenlandic, NULL, 0, 0, (void *) 149, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_MacAzebaijani, NULL, 0, 0, (void *) 150, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; + +#define CID_Features 101 +#define CID_FeatureDel 103 +#define CID_FeatureEdit 105 + +#define CID_Settings 101 +#define CID_SettingDel 103 +#define CID_SettingEdit 105 + +#define CID_NameList 201 +#define CID_NameDel 203 +#define CID_NameEdit 205 + +#define CID_Cancel 300 +#define CID_OK 301 +#define CID_Id 302 +#define CID_Name 303 +#define CID_Language 304 +#define CID_On 305 +#define CID_Mutex 306 + +static unichar_t spacer[] = { 0x2003, 0x21d2, 0x2003, 0 }; + +static GTextInfo *Pref_MacNamesList(struct macname *all) { + GTextInfo *ti; + int i, j; + struct macname *mn; + unichar_t *temp, *full; + + for ( i=0, mn=all; mn!=NULL; mn=mn->next, ++i ); + ti = gcalloc(i+1,sizeof( GTextInfo )); + + for ( i=0, mn=all; mn!=NULL; mn=mn->next, ++i ) { + temp = MacStrToUnicode(mn->name,mn->enc,mn->lang); + for ( j=0 ; maclanguages[j].text!=0; ++j ) + if ( maclanguages[j].userdata == (void *) (intpt) (mn->lang )) + break; + if ( maclanguages[j].text!=0 ) { + const unichar_t *lang = GStringGetResource((int) maclanguages[j].text,NULL ); + full = galloc((u_strlen(lang)+u_strlen(temp)+6)*sizeof(unichar_t)); + u_strcpy(full,lang); + } else { + char *hunh = "???"; + full = galloc((strlen(hunh)+u_strlen(temp)+6)*sizeof(unichar_t)); + uc_strcpy(full,hunh); + } + u_strcat(full,spacer); + u_strcat(full,temp); + free(temp); + ti[i].text = full; + ti[i].userdata = (void *) mn; + } +return( ti ); +} + +static GTextInfo *Pref_SettingsList(struct macsetting *all) { + GTextInfo *ti; + int i; + struct macsetting *ms; + unichar_t *temp, *full; + char buf[20]; + + for ( i=0, ms=all; ms!=NULL; ms=ms->next, ++i ); + ti = gcalloc(i+1,sizeof( GTextInfo )); + + for ( i=0, ms=all; ms!=NULL; ms=ms->next, ++i ) { + temp = PickNameFromMacName(ms->setname); + sprintf(buf,"%3d ", ms->setting); + if ( temp==NULL ) + full = uc_copy(buf); + else { + full = galloc((strlen(buf)+u_strlen(temp)+1)*sizeof(unichar_t)); + uc_strcpy(full,buf); + u_strcat(full,temp); + free(temp); + } + ti[i].text = full; + ti[i].userdata = ms; + } +return( ti ); +} + +static GTextInfo *Pref_FeaturesList(MacFeat *all) { + GTextInfo *ti; + int i; + MacFeat *mf; + unichar_t *temp, *full; + char buf[20]; + + for ( i=0, mf=all; mf!=NULL; mf=mf->next, ++i ); + ti = gcalloc(i+1,sizeof( GTextInfo )); + + for ( i=0, mf=all; mf!=NULL; mf=mf->next, ++i ) { + temp = PickNameFromMacName(mf->featname); + sprintf(buf,"%3d ", mf->feature); + if ( temp==NULL ) + full = uc_copy(buf); + else { + full = galloc((strlen(buf)+u_strlen(temp)+1)*sizeof(unichar_t)); + uc_strcpy(full,buf); + u_strcat(full,temp); + free(temp); + } + ti[i].text = full; + ti[i].userdata = mf; + } +return( ti ); +} + +struct namedata { + GWindow gw; + int index; + int done; + struct macname *all, *changing; + GGadget *namelist; /* Not in this dlg, in the dlg which created us */ +}; + +static int name_e_h(GWindow gw, GEvent *event) { + struct namedata *nd = GDrawGetUserData(gw); + int i; + int32 len; + GTextInfo **ti, *sel; + const unichar_t *ret1; unichar_t *full, *temp; + int val1, val2; + struct macname *mn; + int language; + + if ( event->type==et_close ) { + nd->done = true; + if ( nd->index==-1 ) + MacNameListFree(nd->changing); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("prefs.html#Features"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + if ( GGadgetGetCid(event->u.control.g) == CID_Cancel ) { + nd->done = true; + if ( nd->index==-1 ) + MacNameListFree(nd->changing); + } else if ( GGadgetGetCid(event->u.control.g) == CID_OK ) { + sel = GGadgetGetListItemSelected(GWidgetGetControl(nd->gw,CID_Language)); + language = nd->changing->lang; + if ( sel!=NULL ) + language = (int) sel->userdata; + else if ( nd->index==-1 ) { + GWidgetErrorR(_STR_BadLanguage,_STR_BadLanguage); +return( true ); + } /* Otherwise use the original language, it might not be one we recognize */ + if ( language != nd->changing->lang ) + nd->changing->enc = MacEncFromMacLang(language); + nd->changing->lang = language; + val1 = (nd->changing->enc<<16) | nd->changing->lang; + ret1 = _GGadgetGetTitle(GWidgetGetControl(nd->gw,CID_Name)); + free(nd->changing->name); + nd->changing->name = UnicodeToMacStr(ret1,nd->changing->enc,nd->changing->lang); + + ti = GGadgetGetList(nd->namelist,&len); + for ( i=0; iindex ) { + val2 = (((struct macname *) (ti[i]->userdata))->enc<<16) | + (((struct macname *) (ti[i]->userdata))->lang); + if ( val2==val1 ) { + GWidgetErrorR(_STR_ThisFeatureCodeIsAlreadyUsed,_STR_ThisFeatureCodeIsAlreadyUsed); +return( true ); + } + } + + temp = MacStrToUnicode(nd->changing->name,nd->changing->enc,nd->changing->lang); + if ( sel!=NULL ) { + const unichar_t *lang = sel->text; + full = galloc((u_strlen(lang)+u_strlen(temp)+6)*sizeof(unichar_t)); + u_strcpy(full,lang); + } else { + char *hunh = "???"; + full = galloc((strlen(hunh)+u_strlen(temp)+6)*sizeof(unichar_t)); + uc_strcpy(full,hunh); + } + u_strcat(full,spacer); + u_strcat(full,temp); + + if ( nd->index==-1 ) + GListAddStr(nd->namelist,full,nd->changing); + else { + GListReplaceStr(nd->namelist,nd->index,full,nd->changing); + if ( nd->all==nd->changing ) + nd->all = nd->changing->next; + else { + for ( mn=nd->all ; mn!=NULL && mn->next!=nd->changing; mn=mn->next ); + if ( mn!=NULL ) mn->next = nd->changing->next; + } + } + nd->changing->next = NULL; + if ( nd->all==NULL || val1< ((nd->all->enc<<16)|nd->all->lang) ) { + nd->changing->next = nd->all; + nd->all = nd->changing; + } else { + for ( mn=nd->all; mn->next!=NULL && ((mn->next->enc<<16)|mn->next->lang)next ); + nd->changing->next = mn->next; + mn->next = nd->changing; + } + GGadgetSetUserData(nd->namelist,nd->all); + nd->done = true; + } + } +return( true ); +} + +static char *AskName(struct macname *changing,struct macname *all,GGadget *list, int index) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + struct namedata nd; + int i; + + memset(&nd,0,sizeof(nd)); + nd.namelist = list; + nd.index = index; + nd.changing = changing; + nd.all = all; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<lang) ) + maclanguages[i].selected = true; + else + maclanguages[i].selected = false; + } + + label[2].text = (unichar_t *) _STR_Name; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 5; gcd[2].gd.pos.y = gcd[0].gd.pos.y+28; + gcd[2].gd.flags = gg_enabled|gg_visible; + gcd[2].creator = GLabelCreate; + + label[3].text = MacStrToUnicode(changing->name,changing->enc,changing->lang); + gcd[3].gd.label = changing->name==NULL ? NULL : &label[3]; + gcd[3].gd.pos.x = gcd[1].gd.pos.x; gcd[3].gd.pos.y = gcd[2].gd.pos.y-4; + gcd[3].gd.pos.width = 200; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].gd.cid = CID_Name; + gcd[3].creator = GTextFieldCreate; + + i = 4; + + gcd[i].gd.pos.x = 13-3; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+30; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_OK; + /*gcd[i].gd.handle_controlevent = Prefs_Ok;*/ + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -13; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_Cancel; + gcd[i].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + GDrawSetVisible(gw,true); + GWidgetIndicateFocusGadget(gcd[1].ret); + while ( !nd.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); +return( false ); +} + +static void ChangeName(GGadget *list,int index) { + struct macname *mn = GGadgetGetListItemSelected(list)->userdata, + *all = GGadgetGetUserData(list); + + AskName(mn,all,list,index); +} + +static int Pref_NewName(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + GGadget *list = GWidgetGetControl(gw,CID_NameList); + struct macname *new, *all; + + all = GGadgetGetUserData(list); + new = chunkalloc(sizeof(struct macname)); + new->lang = -1; + AskName(new,all,list,-1); + } +return( true ); +} + +static int Pref_DelName(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct macname *mn, *p, *all, *next; + GWindow gw = GGadgetGetWindow(g); + GGadget *list = GWidgetGetControl(gw,CID_NameList); + int32 len; + GTextInfo **ti = GGadgetGetList(list,&len); + int i; + + all = GGadgetGetUserData(list); + for ( mn = all, p=NULL; mn!=NULL; mn = next ) { + next = mn->next; + for ( i=len-1; i>=0; --i ) { + if ( ti[i]->selected && ti[i]->userdata==mn ) + break; + } + if ( i>=0 ) { + if ( p==NULL ) + all = next; + else + p->next = next; + mn->next = NULL; + MacNameListFree(mn); + } else + p = mn; + } + GGadgetSetUserData(list,all); + GListDelSelected(list); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_NameDel),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_NameEdit),false); + } +return( true ); +} + +static int Pref_EditName(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GGadget *list = GWidgetGetControl(GGadgetGetWindow(g),CID_NameList); + ChangeName(list,GGadgetGetFirstListSelectedItem(list)); + } +return( true ); +} + +static int Pref_NameSel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + int32 len; + GTextInfo **ti = GGadgetGetList(g,&len); + GWindow gw = GGadgetGetWindow(g); + int i, sel_cnt=0; + for ( i=0; iselected ) ++sel_cnt; + GGadgetSetEnabled(GWidgetGetControl(gw,CID_NameDel),sel_cnt!=0); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_NameEdit),sel_cnt==1); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + ChangeName(g,e->u.control.u.list.changed_index!=-1?e->u.control.u.list.changed_index: + GGadgetGetFirstListSelectedItem(g)); + } +return( true ); +} + +static int GCDBuildNames(GGadgetCreateData *gcd,GTextInfo *label,int pos,struct macname *names) { + + gcd[pos].gd.pos.x = 6; gcd[pos].gd.pos.y = pos==0 ? 6 : gcd[pos-1].gd.pos.y+14; + gcd[pos].gd.pos.width = 250; gcd[pos].gd.pos.height = 5*12+10; + gcd[pos].gd.flags = gg_visible | gg_enabled | gg_list_alphabetic | gg_list_multiplesel; + gcd[pos].gd.cid = CID_NameList; + gcd[pos].data = names = MacNameCopy(names); + gcd[pos].gd.u.list = Pref_MacNamesList(names); + gcd[pos].gd.handle_controlevent = Pref_NameSel; + gcd[pos++].creator = GListCreate; + + gcd[pos].gd.pos.x = 6; gcd[pos].gd.pos.y = gcd[pos-1].gd.pos.y+gcd[pos-1].gd.pos.height+10; + gcd[pos].gd.flags = gg_visible | gg_enabled; + label[pos].text = (unichar_t *) _STR_NewDDD; + label[pos].text_in_resource = true; + gcd[pos].gd.label = &label[pos]; + gcd[pos].gd.handle_controlevent = Pref_NewName; + gcd[pos++].creator = GButtonCreate; + + gcd[pos].gd.pos.x = gcd[pos-1].gd.pos.x+20+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + gcd[pos].gd.pos.y = gcd[pos-1].gd.pos.y; + gcd[pos].gd.flags = gg_visible ; + label[pos].text = (unichar_t *) _STR_Delete; + label[pos].text_in_resource = true; + gcd[pos].gd.label = &label[pos]; + gcd[pos].gd.cid = CID_NameDel; + gcd[pos].gd.handle_controlevent = Pref_DelName; + gcd[pos++].creator = GButtonCreate; + + gcd[pos].gd.pos.x = gcd[pos-1].gd.pos.x+20+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + gcd[pos].gd.pos.y = gcd[pos-1].gd.pos.y; + gcd[pos].gd.flags = gg_visible ; + label[pos].text = (unichar_t *) _STR_EditDDD; + label[pos].text_in_resource = true; + gcd[pos].gd.label = &label[pos]; + gcd[pos].gd.cid = CID_NameEdit; + gcd[pos].gd.handle_controlevent = Pref_EditName; + gcd[pos++].creator = GButtonCreate; + +return( pos ); +} + +struct setdata { + GWindow gw; + int index; + int done; + struct macsetting *all, *changing; + GGadget *settinglist; /* Not in this dlg, in the dlg which created us */ +}; + +static int set_e_h(GWindow gw, GEvent *event) { + struct setdata *sd = GDrawGetUserData(gw); + int i; + int32 len; + GTextInfo **ti; + const unichar_t *ret1; unichar_t *end, *temp, *res; + int val1, val2; + char buf[20]; + struct macsetting *ms; + + if ( event->type==et_close ) { + sd->done = true; + MacNameListFree(GGadgetGetUserData(GWidgetGetControl(sd->gw,CID_NameList))); + if ( sd->index==-1 ) + MacSettingListFree(sd->changing); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("prefs.html#Settings"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + if ( GGadgetGetCid(event->u.control.g) == CID_Cancel ) { + sd->done = true; + MacNameListFree(GGadgetGetUserData(GWidgetGetControl(sd->gw,CID_NameList))); + if ( sd->index==-1 ) + MacSettingListFree(sd->changing); + } else if ( GGadgetGetCid(event->u.control.g) == CID_OK ) { + ret1 = _GGadgetGetTitle(GWidgetGetControl(sd->gw,CID_Id)); + val1 = u_strtol(ret1,&end,10); + if ( *end!='\0' ) { + GWidgetErrorR(_STR_BadNumber,_STR_BadNumber); +return( true ); + } + ti = GGadgetGetList(sd->settinglist,&len); + for ( i=0; iindex ) { + val2 = ((struct macsetting *) (ti[i]->userdata))->setting; + if ( val2==val1 ) { + GWidgetErrorR(_STR_ThisSettingIsAlreadyUsed,_STR_ThisSettingIsAlreadyUsed); +return( true ); + } + } + MacNameListFree(sd->changing->setname); + sd->changing->setname = GGadgetGetUserData(GWidgetGetControl(sd->gw,CID_NameList)); + sd->changing->setting = val1; + sd->changing->initially_enabled = GGadgetIsChecked(GWidgetGetControl(sd->gw,CID_On)); + + sprintf(buf,"%3d ", val1); + temp = PickNameFromMacName(sd->changing->setname); + len = u_strlen(temp); + res = galloc( (strlen(buf)+len+3)*sizeof(unichar_t) ); + uc_strcpy(res,buf); + u_strcat(res,temp); + free(temp); + + if ( sd->index==-1 ) + GListAddStr(sd->settinglist,res,sd->changing); + else { + GListReplaceStr(sd->settinglist,sd->index,res,sd->changing); + if ( sd->all==sd->changing ) + sd->all = sd->changing->next; + else { + for ( ms=sd->all ; ms!=NULL && ms->next!=sd->changing; ms=ms->next ); + if ( ms!=NULL ) ms->next = sd->changing->next; + } + } + sd->changing->next = NULL; + if ( sd->all==NULL || sd->changing->settingall->setting ) { + sd->changing->next = sd->all; + sd->all = sd->changing; + } else { + for ( ms=sd->all; ms->next!=NULL && ms->next->settingchanging->setting; ms=ms->next ); + sd->changing->next = ms->next; + ms->next = sd->changing; + } + GGadgetSetUserData(sd->settinglist,sd->all); + sd->done = true; + } + } +return( true ); +} + +static char *AskSetting(struct macsetting *changing,struct macsetting *all, + GGadget *list, int index) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[12]; + GTextInfo label[12]; + struct setdata sd; + char buf[20]; + int i; + + memset(&sd,0,sizeof(sd)); + sd.settinglist = list; + sd.index = index; + sd.changing = changing; + sd.all = all; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<setting ); + label[1].text = (unichar_t *) buf; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 60; gcd[1].gd.pos.y = 5; gcd[1].gd.pos.width = 40; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].gd.cid = CID_Id; + gcd[1].creator = GTextFieldCreate; + + label[2].text = (unichar_t *) _STR_Enabled; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 110; gcd[2].gd.pos.y = 5; + gcd[2].gd.flags = gg_enabled|gg_visible | (changing->initially_enabled?gg_cb_on:0); + gcd[2].gd.cid = CID_On; + gcd[2].creator = GCheckBoxCreate; + + label[3].text = (unichar_t *) _STR_Name; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 5; gcd[3].gd.pos.y = 5+24; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].creator = GLabelCreate; + + + i = GCDBuildNames(gcd,label,4,changing->setname); + + gcd[i].gd.pos.x = 13-3; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+35; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_OK; + /*gcd[i].gd.handle_controlevent = Prefs_Ok;*/ + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -13; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_Cancel; + gcd[i].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + GTextInfoListFree(gcd[4].gd.u.list); + + GDrawSetVisible(gw,true); + GWidgetIndicateFocusGadget(gcd[1].ret); + while ( !sd.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + +return( false ); +} + +static void ChangeSetting(GGadget *list,int index) { + struct macsetting *ms = GGadgetGetListItemSelected(list)->userdata, + *all = GGadgetGetUserData(list); + + AskSetting(ms,all,list,index); +} + +static int Pref_NewSetting(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + GGadget *list = GWidgetGetControl(gw,CID_Settings); + struct macsetting *new, *ms, *all; + int expected=0; + + all = GGadgetGetUserData(list); + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_Mutex)) ) { + for ( ms=all; ms!=NULL; ms=ms->next ) { + if ( ms->setting!=expected ) + break; + ++expected; + } + } else { + for ( ms=all; ms!=NULL; ms=ms->next ) { + if ( ms->setting&1 ) /* Shouldn't be any odd settings for non-mutex */ + continue; + if ( ms->setting!=expected ) + break; + expected += 2; + } + } + new = chunkalloc(sizeof(struct macsetting)); + new->setting = expected; + AskSetting(new,all,list,-1); + } +return( true ); +} + +static int Pref_DelSetting(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct macsetting *ms, *p, *all, *next; + GWindow gw = GGadgetGetWindow(g); + GGadget *list = GWidgetGetControl(gw,CID_Settings); + int32 len; + GTextInfo **ti = GGadgetGetList(list,&len); + int i; + + all = GGadgetGetUserData(list); + for ( ms = all, p=NULL; ms!=NULL; ms = next ) { + next = ms->next; + for ( i=len-1; i>=0; --i ) { + if ( ti[i]->selected && ti[i]->userdata==ms ) + break; + } + if ( i>=0 ) { + if ( p==NULL ) + all = next; + else + p->next = next; + ms->next = NULL; + MacSettingListFree(ms); + } else + p = ms; + } + GGadgetSetUserData(list,all); + GListDelSelected(list); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_SettingDel),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_SettingEdit),false); + } +return( true ); +} + +static int Pref_EditSetting(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GGadget *list = GWidgetGetControl(GGadgetGetWindow(g),CID_Settings); + ChangeSetting(list,GGadgetGetFirstListSelectedItem(list)); + } +return( true ); +} + +static int Pref_SettingSel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + int32 len; + GTextInfo **ti = GGadgetGetList(g,&len); + GWindow gw = GGadgetGetWindow(g); + int i, sel_cnt=0; + for ( i=0; iselected ) ++sel_cnt; + GGadgetSetEnabled(GWidgetGetControl(gw,CID_SettingDel),sel_cnt!=0); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_SettingEdit),sel_cnt==1); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + ChangeSetting(g,e->u.control.u.list.changed_index!=-1?e->u.control.u.list.changed_index: + GGadgetGetFirstListSelectedItem(g)); + } +return( true ); +} + +struct featdata { + GWindow gw; + int index; + int done; + MacFeat *all, *changing; + GGadget *featurelist; /* Not in this dlg, in the dlg which created us */ +}; + +static int feat_e_h(GWindow gw, GEvent *event) { + struct featdata *fd = GDrawGetUserData(gw); + int i; + int32 len; + GTextInfo **ti; + const unichar_t *ret1; unichar_t *end, *temp, *res; + int val1, val2; + char buf[20]; + MacFeat *mf; + + if ( event->type==et_close ) { + fd->done = true; + if ( fd->index==-1 ) + MacFeatListFree(fd->changing); + MacSettingListFree(GGadgetGetUserData(GWidgetGetControl(fd->gw,CID_Settings))); + MacNameListFree(GGadgetGetUserData(GWidgetGetControl(fd->gw,CID_NameList))); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("prefs.html#Features"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + if ( GGadgetGetCid(event->u.control.g) == CID_Cancel ) { + fd->done = true; + if ( fd->index==-1 ) + MacFeatListFree(fd->changing); + MacSettingListFree(GGadgetGetUserData(GWidgetGetControl(fd->gw,CID_Settings))); + MacNameListFree(GGadgetGetUserData(GWidgetGetControl(fd->gw,CID_NameList))); + } else if ( GGadgetGetCid(event->u.control.g) == CID_OK ) { + ret1 = _GGadgetGetTitle(GWidgetGetControl(fd->gw,CID_Id)); + val1 = u_strtol(ret1,&end,10); + if ( *end!='\0' ) { + GWidgetErrorR(_STR_BadNumber,_STR_BadNumber); +return( true ); + } + ti = GGadgetGetList(fd->featurelist,&len); + for ( i=0; iindex ) { + val2 = ((MacFeat *) (ti[i]->userdata))->feature; + if ( val2==val1 ) { + GWidgetErrorR(_STR_ThisFeatureCodeIsAlreadyUsed,_STR_ThisFeatureCodeIsAlreadyUsed); +return( true ); + } + } + MacSettingListFree(fd->changing->settings); + MacNameListFree(fd->changing->featname); + fd->changing->featname = GGadgetGetUserData(GWidgetGetControl(fd->gw,CID_NameList)); + fd->changing->settings = GGadgetGetUserData(GWidgetGetControl(fd->gw,CID_Settings)); + fd->changing->ismutex = GGadgetIsChecked(GWidgetGetControl(fd->gw,CID_Mutex)); + if ( fd->changing->ismutex ) { + struct macsetting *ms; + for ( i=0, ms = fd->changing->settings; ms!=NULL && !ms->initially_enabled; ms = ms->next, ++i ); + if ( ms==NULL ) i = 0; + fd->changing->default_setting = i; + if ( ms!=NULL ) { + for ( ms=ms->next ; ms!=NULL; ms = ms->next ) + ms->initially_enabled = false; + } + } + + sprintf(buf,"%3d ", val1); + temp = PickNameFromMacName(fd->changing->featname); + len = u_strlen(temp); + res = galloc( (strlen(buf)+len+3)*sizeof(unichar_t) ); + uc_strcpy(res,buf); + u_strcat(res,temp); + free(temp); + + if ( fd->index==-1 ) + GListAddStr(fd->featurelist,res,fd->changing); + else { + GListReplaceStr(fd->featurelist,fd->index,res,fd->changing); + if ( fd->all==fd->changing ) + fd->all = fd->changing->next; + else { + for ( mf=fd->all ; mf!=NULL && mf->next!=fd->changing; mf=mf->next ); + if ( mf!=NULL ) mf->next = fd->changing->next; + } + } + fd->changing->next = NULL; + if ( fd->all==NULL || fd->changing->featureall->feature ) { + fd->changing->next = fd->all; + fd->all = fd->changing; + } else { + for ( mf=fd->all; mf->next!=NULL && mf->next->featurechanging->feature; mf=mf->next ); + fd->changing->next = mf->next; + mf->next = fd->changing; + } + GGadgetSetUserData(fd->featurelist,fd->all); + fd->done = true; + } + } +return( true ); +} + +static char *AskFeature(MacFeat *changing,MacFeat *all,GGadget *list, int index) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[16]; + GTextInfo label[16], *freeme; + struct featdata fd; + char buf[20]; + int i; + + memset(&fd,0,sizeof(fd)); + fd.featurelist = list; + fd.index = index; + fd.changing = changing; + fd.all = all; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<feature ); + label[1].text = (unichar_t *) buf; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 60; gcd[1].gd.pos.y = 5; gcd[1].gd.pos.width = 40; + gcd[1].gd.flags = gg_enabled|gg_visible; + gcd[1].gd.cid = CID_Id; + gcd[1].creator = GTextFieldCreate; + + label[2].text = (unichar_t *) _STR_MutuallyExclusive; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 105; gcd[2].gd.pos.y = 5+4; + gcd[2].gd.flags = gg_enabled|gg_visible | (changing->ismutex?gg_cb_on:0); + gcd[2].gd.cid = CID_Mutex; + gcd[2].creator = GCheckBoxCreate; + + label[3].text = (unichar_t *) _STR_Name; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 5; gcd[3].gd.pos.y = 5+24; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].creator = GLabelCreate; + + i = GCDBuildNames(gcd,label,4,changing->featname); + + label[i].text = (unichar_t *) _STR_Settings; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.pos.x = 5; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+35; + gcd[i].gd.flags = gg_enabled|gg_visible; + gcd[i++].creator = GLabelCreate; + + gcd[i].gd.pos.x = 6; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+14; + gcd[i].gd.pos.width = 250; gcd[i].gd.pos.height = 8*12+10; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_list_alphabetic | gg_list_multiplesel; + gcd[i].gd.cid = CID_Settings; + gcd[i].data = MacSettingCopy(changing->settings); + gcd[i].gd.u.list = freeme = Pref_SettingsList(gcd[i].data); + gcd[i].gd.handle_controlevent = Pref_SettingSel; + gcd[i++].creator = GListCreate; + + gcd[i].gd.pos.x = 6; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+gcd[i-1].gd.pos.height+10; + gcd[i].gd.flags = gg_visible | gg_enabled; + label[i].text = (unichar_t *) _STR_NewDDD; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.handle_controlevent = Pref_NewSetting; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = gcd[i-1].gd.pos.x+20+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + gcd[i].gd.pos.y = gcd[i-1].gd.pos.y; + gcd[i].gd.flags = gg_visible ; + label[i].text = (unichar_t *) _STR_Delete; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_SettingDel; + gcd[i].gd.handle_controlevent = Pref_DelSetting; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = gcd[i-1].gd.pos.x+20+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + gcd[i].gd.pos.y = gcd[i-1].gd.pos.y; + gcd[i].gd.flags = gg_visible ; + label[i].text = (unichar_t *) _STR_EditDDD; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_SettingEdit; + gcd[i].gd.handle_controlevent = Pref_EditSetting; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = 13-3; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+30; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[i].text = (unichar_t *) _STR_OK; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_OK; + /*gcd[i].gd.handle_controlevent = Prefs_Ok;*/ + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -13; gcd[i].gd.pos.y = gcd[i-1].gd.pos.y+3; + gcd[i].gd.pos.width = -1; gcd[i].gd.pos.height = 0; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.cid = CID_Cancel; + gcd[i].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + GTextInfoListFree(gcd[4].gd.u.list); + GTextInfoListFree(freeme); + + GDrawSetVisible(gw,true); + GWidgetIndicateFocusGadget(gcd[1].ret); + while ( !fd.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + +return( false ); +} + +static void ChangeFeature(GGadget *list,int index) { + MacFeat *mf = GGadgetGetListItemSelected(list)->userdata, + *all = GGadgetGetUserData(list); + + AskFeature(mf,all,list,index); +} + +static int Pref_NewFeat(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + GGadget *list = GWidgetGetControl(gw,CID_Features); + MacFeat *new, *mf, *all; + int expected=0; + + all = GGadgetGetUserData(list); + for ( mf=all; mf!=NULL; mf=mf->next ) { + if ( mf->feature!=expected ) + break; + ++expected; + } + new = chunkalloc(sizeof(MacFeat)); + new->feature = expected; + AskFeature(new,all,list,-1); + } +return( true ); +} + +static int Pref_DelFeat(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + MacFeat *mf, *p, *all, *next; + GWindow gw = GGadgetGetWindow(g); + GGadget *list = GWidgetGetControl(gw,CID_Features); + int32 len; + GTextInfo **ti = GGadgetGetList(list,&len); + int i; + + all = GGadgetGetUserData(list); + for ( mf = all, p=NULL; mf!=NULL; mf = next ) { + next = mf->next; + for ( i=len-1; i>=0; --i ) { + if ( ti[i]->selected && ti[i]->userdata==mf ) + break; + } + if ( i>=0 ) { + if ( p==NULL ) + all = next; + else + p->next = next; + mf->next = NULL; + MacFeatListFree(mf); + } else + p = mf; + } + GGadgetSetUserData(list,all); + GListDelSelected(list); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_FeatureDel),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_FeatureEdit),false); + } +return( true ); +} + +static int Pref_EditFeat(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GGadget *list = GWidgetGetControl(GGadgetGetWindow(g),CID_Features); + ChangeFeature(list,GGadgetGetFirstListSelectedItem(list)); + } +return( true ); +} + +static int Pref_FeatureSel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + int32 len; + GTextInfo **ti = GGadgetGetList(g,&len); + GWindow gw = GGadgetGetWindow(g); + int i, sel_cnt=0; + for ( i=0; iselected ) ++sel_cnt; + GGadgetSetEnabled(GWidgetGetControl(gw,CID_FeatureDel),sel_cnt!=0); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_FeatureEdit),sel_cnt==1); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + ChangeFeature(g,e->u.control.u.list.changed_index!=-1?e->u.control.u.list.changed_index: + GGadgetGetFirstListSelectedItem(g)); + } +return( true ); +} + +static int Pref_DefaultFeat(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GGadget *list = GWidgetGetControl(GGadgetGetWindow(g),CID_Features); + int inprefs = (intpt) GGadgetGetUserData(g); + GTextInfo *ti, **arr; + uint16 cnt; + /* In preferences the default is the built in data. */ + /* in a font the default is the preference data (which might be built in or might not) */ + MacFeat *def = inprefs ? builtin_mac_feature_map : default_mac_feature_map; + + def = MacFeatCopy(def); + MacFeatListFree(GGadgetGetUserData(list)); + GGadgetSetUserData(list,def); + ti = Pref_FeaturesList(def); + arr = GTextInfoArrayFromList(ti,&cnt); + GGadgetSetList(list,arr,false); + GTextInfoListFree(ti); + } +return( true ); +} + +void GCDFillMacFeat(GGadgetCreateData *mfgcd,GTextInfo *mflabels, int width, + MacFeat *all, int fromprefs) { + int sgc; + + all = MacFeatCopy(all); + + sgc = 0; + + mfgcd[sgc].gd.pos.x = 6; mfgcd[sgc].gd.pos.y = 6; + mfgcd[sgc].gd.pos.width = 250; mfgcd[sgc].gd.pos.height = 16*12+10; + mfgcd[sgc].gd.flags = gg_visible | gg_enabled | gg_list_alphabetic | gg_list_multiplesel; + mfgcd[sgc].gd.cid = CID_Features; + mfgcd[sgc].gd.u.list = Pref_FeaturesList(all); + mfgcd[sgc].gd.handle_controlevent = Pref_FeatureSel; + mfgcd[sgc].data = all; + mfgcd[sgc++].creator = GListCreate; + + mfgcd[sgc].gd.pos.x = 6; mfgcd[sgc].gd.pos.y = mfgcd[sgc-1].gd.pos.y+mfgcd[sgc-1].gd.pos.height+10; + mfgcd[sgc].gd.flags = gg_visible | gg_enabled; + mflabels[sgc].text = (unichar_t *) _STR_NewDDD; + mflabels[sgc].text_in_resource = true; + mfgcd[sgc].gd.label = &mflabels[sgc]; + /*mfgcd[sgc].gd.cid = CID_AnchorRename;*/ + mfgcd[sgc].gd.handle_controlevent = Pref_NewFeat; + mfgcd[sgc++].creator = GButtonCreate; + + mfgcd[sgc].gd.pos.x = mfgcd[sgc-1].gd.pos.x+10+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + mfgcd[sgc].gd.pos.y = mfgcd[sgc-1].gd.pos.y; + mfgcd[sgc].gd.flags = gg_visible ; + mflabels[sgc].text = (unichar_t *) _STR_Delete; + mflabels[sgc].text_in_resource = true; + mfgcd[sgc].gd.label = &mflabels[sgc]; + mfgcd[sgc].gd.cid = CID_FeatureDel; + mfgcd[sgc].gd.handle_controlevent = Pref_DelFeat; + mfgcd[sgc++].creator = GButtonCreate; + + mfgcd[sgc].gd.pos.x = mfgcd[sgc-1].gd.pos.x+10+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + mfgcd[sgc].gd.pos.y = mfgcd[sgc-1].gd.pos.y; + mfgcd[sgc].gd.flags = gg_visible ; + mflabels[sgc].text = (unichar_t *) _STR_EditDDD; + mflabels[sgc].text_in_resource = true; + mfgcd[sgc].gd.label = &mflabels[sgc]; + mfgcd[sgc].gd.cid = CID_FeatureEdit; + mfgcd[sgc].gd.handle_controlevent = Pref_EditFeat; + mfgcd[sgc++].creator = GButtonCreate; + + mfgcd[sgc].gd.pos.x = mfgcd[sgc-1].gd.pos.x+10+GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor); + mfgcd[sgc].gd.pos.y = mfgcd[sgc-1].gd.pos.y; + mfgcd[sgc].gd.flags = gg_visible|gg_enabled ; + mflabels[sgc].text = (unichar_t *) _STR_Default; + mflabels[sgc].text_in_resource = true; + mfgcd[sgc].gd.label = &mflabels[sgc]; + mfgcd[sgc].gd.handle_controlevent = Pref_DefaultFeat; + mfgcd[sgc].data = (void *) (intpt) fromprefs; + mfgcd[sgc++].creator = GButtonCreate; +} + +void Prefs_ReplaceMacFeatures(GGadget *list) { + MacFeatListFree(user_mac_feature_map); + user_mac_feature_map = GGadgetGetUserData(list); + default_mac_feature_map = user_mac_feature_map; +} + diff --git a/fontforge/makenomenh.c b/fontforge/makenomenh.c new file mode 100644 index 00000000..57294595 --- /dev/null +++ b/fontforge/makenomenh.c @@ -0,0 +1,804 @@ +#include +#include +#include + +#include +#include + +#include +#include + +#include +#include +#include +#include + +#define e_hexjis 100 + +static char *istandard[] = { "buttonsize", "ScaleFactor", NULL }; + +static char *standard[] = { "Language", "OK", "Cancel", "Open", "Save", + "Filter", "New", "Replace", "Fileexists", "Fileexistspre", + "Fileexistspost", "Createdir", "Dirname", "Couldntcreatedir", + "SelectAll", "None", NULL }; + +static unichar_t **names, **inames; +static char *hadmn; +static int nlen=__STR_LastStd+1000, npos=__STR_LastStd+1; +static int ilen=__NUM_LastStd+1, ipos=__NUM_LastStd+1; +static int checksum; + +static int isstandard(char *name) { + int i; + + for ( i=0; standard[i]!=NULL; ++i ) + if ( strcasecmp(standard[i],name)==0 ) +return( 1 ); + +return( 0 ); +} + +static int isistandard(char *name) { + int i; + + for ( i=0; istandard[i]!=NULL; ++i ) + if ( strcasecmp(istandard[i],name)==0 ) +return( 1 ); + +return( 0 ); +} + +static int lookup(char *name) { + int i; + + for ( i=0; i=ilen ) { + ilen += 1000; + inames = grealloc(inames,ilen*sizeof(unichar_t*)); + } + inames[ipos++] = uc_copy(buffer+off); +} + +static int makenomenh() { + char buffer[1025]; + FILE *in, *out; + char *pt; + int off, i; + int ismn; +#ifdef __VMS + stat_t stat_buf; +#else + struct stat stat_buf; +#endif + + names = malloc(nlen*sizeof(unichar_t *)); + hadmn = calloc(nlen,sizeof(char)); + for ( i=0; standard[i]!=NULL; ++i ) + names[i] = uc_copy(standard[i]); + + inames = malloc(ilen*sizeof(unichar_t *)); + for ( i=0; istandard[i]!=NULL; ++i ) + inames[i] = uc_copy(istandard[i]); + + stat("nomen-en.c",&stat_buf); + in = fopen("nomen-en.c","r"); + if ( in==NULL ) { + fprintf(stderr, "Missing required input file: nomen-en.c\n" ); + exit( 1 ); + } + out = fopen("nomen.h","w"); + fprintf( out, "#ifndef _NOMEN_H\n" ); + fprintf( out, "#define _NOMEN_H\n" ); + fprintf( out, "#include \n" ); + fprintf( out, "#include \n" ); + fprintf( out, "#include \n\n" ); + + fprintf( out, "#define __NOMEN_CHECKSUM\t%d\n\n", (int) stat_buf.st_size ); + checksum = stat_buf.st_size; + + while( fgets(buffer,sizeof(buffer),in)!=NULL ) { + if ( (buffer[0]=='/' && buffer[1]=='*') || buffer[0]=='\n' ) { + fprintf( out, "%s", buffer ); + continue; + } + if ( strncmp(buffer,"static ",7)!=0 ) + continue; + off = 7; + if (strncmp(buffer+off,"const ",6)==0 ) + off += 6; + if ( strncmp(buffer+off,"int num_",8)==0 ) { + handleint(out,buffer,off+8); + continue; + } + if ( strncmp(buffer+off,"unichar_t ",10)==0 ) + off += 10; + else if ( strncmp(buffer+off,"char ",5)==0 ) + off += 5; + else + continue; + if ( buffer[off]=='*' ) ++off; + pt = buffer+off; + ismn = 0; + if ( strncmp(pt,"mnemonic_",9)==0 ) { + ismn = 1; + off += 9; + } else if ( strncmp(pt,"str_",4)==0 ) + off += 4; + if ( buffer[off]=='_' ) ++off; + for ( pt = buffer+off; isalnum(*pt) || *pt=='_'; ++pt ); + *pt ='\0'; + if ( buffer[off]=='\0' ) + continue; + if ( ismn ) { + int index = lookup(buffer+off); + if ( index==-1 ) + fprintf( stderr, "mnemonic for %s when there's no string for it. Possibly mnemonic comes first\n in file, should follow string.\n", buffer+off ); + else + hadmn[index] = 1; + continue; + } + if ( isstandard(buffer+off)) + continue; + if ( islower(buffer[off])) buffer[off] = toupper(buffer[off]); + fprintf( out, "#define _STR_%s\t%d\n", buffer+off, npos ); + if ( npos>=nlen ) { + nlen += 1000; + names = grealloc(names,nlen*sizeof(unichar_t*)); + hadmn = grealloc(hadmn,nlen); + for ( i=nlen-1000; i='a' && *bpt<='f') || (*bpt>='A' && *bpt<='F')) && + bpt-start<3 ) { + val <<= 4; + if ( isdigit(*bpt)) + val |= *bpt++-'0'; + else if ( *bpt>='a' && *bpt<='f' ) + val |= (*bpt++-'a'+10); + else + val |= (*bpt++-'A'+10); + } + --bpt; + } + } + *buffer = (char *) bpt+1; +return( val ); +} + +static int twocharval(char **buffer,int enc) { + /* Currently only support a few */ + int ch1, ch2; + + if ( enc==e_wansung ) { + ch1 = charval(buffer); + if ( ch1<0xa1 ) +return( ch1 ); + ch1 -= 0xa1; + ch2 = charval(buffer)-0xa1; + ch1 = ch1*94 + ch2; + ch1 = unicode_from_ksc5601[ch1]; +return( ch1 ); + } else if ( enc==e_big5 ) { + ch1 = charval(buffer); + if ( ch1<0xa1 ) +return( ch1 ); + ch2 = charval(buffer); + ch1 = (ch1<<8) + ch2; + ch1 = unicode_from_big5[ch1-0xa100]; +return( ch1 ); + } else if ( enc==e_johab ) { + ch1 = charval(buffer); + if ( ch1<0xa1 ) +return( ch1 ); + ch2 = charval(buffer); + ch1 = (ch1<<8) + ch2; + ch1 = unicode_from_johab[ch1-0x8400]; +return( ch1 ); + } else if ( enc==e_sjis ) { + ch1 = charval(buffer); + if ( ch1<0x80 ) +return( ch1 ); + else if ( ch1>=161 && ch1<=223 ) + /* Katakana */ +return( unicode_from_jis201[ch1]); + ch2 = charval(buffer); + if ( ch1 >= 129 && ch1<= 159 ) + ch1 -= 112; + else + ch1 -= 176; + ch1 <<= 1; + if ( ch2>=159 ) + ch2-= 126; + else if ( ch2>127 ) { + --ch1; + ch2 -= 32; + } else { + --ch1; + ch2 -= 31; + } +return( unicode_from_jis208[(ch1-0x21)*94+(ch2-0x21)]); + } else if ( enc == e_euc ) { + ch1 = charval(buffer); + if ( ch1 < 0x80 ) +return( ch1 ); + ch2 = charval(buffer); + if ( ch1 == 0x8e ) /* SS1: katakana */ +return( unicode_from_jis201[ch2] ); + else if ( ch1 != 0x8f ) +return( unicode_from_jis208[(ch1-0xa1)*94+(ch2-0xa1)]); + else { /* SS2: suppl. Kanji */ + ch1 = ch2; + ch2 = charval(buffer); +return( unicode_from_jis212[(ch1-0xa1)*94+(ch2-0xa1)]); + } + } else { + fprintf( stderr, "Don't support this encoding\n" ); + exit( 1 ); + } +return( -1 ); +} + +static unichar_t *slurpchars(char *filename, char *name,int enc,char *buffer) { + unichar_t space[1024], *pt; + const unichar_t *table = unicode_from_alphabets[enc==e_utf8?e_iso8859_1:enc]; + + while ( isspace( *buffer )) ++buffer; + if ( *buffer=='{' ) ++ buffer; + while ( isspace( *buffer )) ++buffer; + if ( *buffer=='\'' ) { + ++buffer; + space[0] = table[charval(&buffer)]; + space[1] = '\0'; + } else if ( *buffer=='"' ) { + ++buffer; + pt = space; + if ( enc==e_utf8 ) { + while ( *buffer!='"' && *buffer!= '\0' ) { + int ch1, ch2; + ch1 = charval(&buffer); + if ( ch1<=0x7f ) + *pt++ = ch1; + else if ( (ch1&0xf0)==0xc0 ) { + *pt++ = (ch1&0x1f)<<6 | (charval(&buffer)&0x3f); + } else { + ch2 = charval(&buffer); + *pt++ = (ch1&0xf)<<6 | ((ch2&0x3f)<<6) | (charval(&buffer)&0x3f); + } + } + } else { + while ( *buffer!='"' && *buffer!= '\0' ) { + *pt++ = table[charval(&buffer)]; + } + } + *pt = 0; + } else { + fprintf( stderr, "Could not parse initializer for %s in %s\n", name, filename ); + space[0] = 0; + } +return( u_copy(space)); +} + +static unichar_t *slurp2bytes(char *filename, char *name,int enc,char *buffer) { + unichar_t space[1024], *pt; + + while ( isspace( *buffer )) ++buffer; + if ( *buffer=='{' ) ++ buffer; + while ( isspace( *buffer )) ++buffer; + if ( *buffer=='\'' ) { + ++buffer; + space[0] = twocharval(&buffer,enc); + space[1] = '\0'; + } else if ( *buffer=='"' ) { + ++buffer; + pt = space; + while ( *buffer!='"' && *buffer!= '\0' ) { + *pt++ = twocharval(&buffer,enc); + } + *pt = 0; + } else { + fprintf( stderr, "Could not parse initializer for %s in %s\n", name, filename ); + space[0] = 0; + } +return( u_copy(space)); +} + +static unichar_t *slurpunichars(char *filename, char *name,char *buffer) { + unichar_t space[1024], *pt; + char *end; + + while ( isspace( *buffer )) ++buffer; + if ( *buffer=='{' ) ++ buffer; + pt = space; + while ( 1 ) { + while ( isspace( *buffer ) || *buffer==',' ) ++buffer; + if ( *buffer=='}' || *buffer==';' || *buffer=='\0' ) + break; + if ( *buffer=='\'' ) { + ++buffer; + while ( *buffer!='\'' && *buffer!='\0' ) + *pt++ = charval(&buffer); + if ( *buffer=='\'' ) ++buffer; + } else { + *pt++ = strtol(buffer,&end,0); + if ( buffer==end ) { + fprintf( stderr, "Could not parse initializer for %s in %s\n", name, filename ); +return( NULL ); + } + buffer = end; + } + } + *pt = '\0'; +return( u_copy(space)); +} + +static void handleint2(char *filename,int *ivalues,char *buffer,int off) { + char *pt, *end; + int ch, index; + + if ( buffer[off]=='_' ) ++off; + for ( pt = buffer+off; isalnum(*pt) || *pt=='_'; ++pt ); + ch = *pt; + *pt ='\0'; + if ( buffer[off]=='\0' ) +return; + index = ilookup(buffer+off); + if ( index==-1 ) { + fprintf( stderr, "Item num_%s does not exist in the base set of integers, but does in %s\n", + buffer+off, filename ); +return; + } + *pt = ch; + while ( isspace( *pt )) ++pt; + if ( *pt=='=' ) ++pt; + ivalues[index] = strtol(pt,&end,0); + if ( end==buffer ) + fprintf( stderr, "Bad numeric value for num_%s in %s\n", + buffer+off, filename ); +} + +static int getencoding(char *str) { + static struct encdata { + int val; + char *name; + } encdata[] = { + { e_iso8859_1, "e_iso8859_1" }, + { e_iso8859_1, "iso8859_1" }, + { e_iso8859_1, "isolatin1" }, + { e_iso8859_1, "latin1" }, + { e_iso8859_2, "e_iso8859_2" }, + { e_iso8859_2, "latin2" }, + { e_iso8859_3, "e_iso8859_3" }, + { e_iso8859_3, "latin3" }, + { e_iso8859_4, "e_iso8859_4" }, + { e_iso8859_4, "latin4" }, + { e_iso8859_5, "e_iso8859_5" }, + { e_iso8859_5, "isocyrillic" }, + { e_iso8859_6, "e_iso8859_6" }, + { e_iso8859_6, "isoarabic" }, + { e_iso8859_7, "e_iso8859_7" }, + { e_iso8859_7, "isogreek" }, + { e_iso8859_8, "e_iso8859_8" }, + { e_iso8859_8, "isohebrew" }, + { e_iso8859_9, "e_iso8859_9" }, + { e_iso8859_9, "latin5" }, + { e_iso8859_10, "e_iso8859_10" }, + { e_iso8859_10, "latin6" }, + { e_iso8859_13, "e_iso8859_13" }, + { e_iso8859_13, "latin7" }, + { e_iso8859_14, "e_iso8859_14" }, + { e_iso8859_14, "latin8" }, + { e_iso8859_15, "e_iso8859_15" }, + { e_iso8859_15, "latin0" }, + { e_iso8859_15, "latin9" }, + { e_koi8_r, "e_koi8_r" }, + { e_jis201, "e_jis201" }, + { e_win, "e_win" }, + { e_mac, "e_mac" }, + { e_utf8, "e_utf8" }, + { e_wansung, "e_wansung" }, + { e_big5, "e_big5" }, + { e_johab, "e_johab" }, + { e_sjis, "e_sjis" }, + { e_euc, "e_euc" }, + { e_hexjis, "e_hexjis" }, + { 0, NULL}}; + int i; + char *pt; + + while ( isspace(*str)) ++str; + for ( pt=str; isalnum(*pt) || *pt=='_'; ++pt ); + *pt = '\0'; + + for ( i=0; encdata[i].name!=NULL; ++i ) + if ( strmatch(encdata[i].name,str)==0 ) +return( encdata[i].val ); + +return( -1 ); +} + +static void putshort(FILE *file,int sh) { + putc((sh>>8)&0xff,file); + putc(sh&0xff,file); +} + +static void putint(FILE *file,int sh) { + putc((sh>>24)&0xff,file); + putc((sh>>16)&0xff,file); + putc((sh>>8)&0xff,file); + putc(sh&0xff,file); +} + +static void ProcessNames(char *filename,char *lc,char *uc) { + FILE *namef, *out; + unichar_t **values, *mn, *init; + int *ivalues; + char buffer[1025]; + char *pt, *bpt, *npt; + int off, i, j; + int isuni, ismn, index, ch; + int enc=0; + int missing; +#ifdef __VMS + stat_t stat_buf; +#else + struct stat stat_buf; +#endif + + values = calloc(npos+1,sizeof(unichar_t *)); + mn = calloc(npos,sizeof(unichar_t)); + ivalues = malloc((ipos+1)*sizeof(int)); + for ( i=0; i=e_first2byte ) + init = slurp2bytes(filename,buffer,enc,pt); + else + init = slurpchars(filename,buffer,enc,pt); + if ( init==NULL ) + continue; + if ( ismn ) { + mn[index] = init[0]; + if ( init[1]!='\0' ) fprintf( stderr, "Too many initializers for %s in %s\n", buffer+off, filename ); + free(init); + } else + values[index] = init; + } + fclose(namef); + + if ( values[0]==NULL ) + fprintf( stderr, "No language entry in %s\n", filename ); + + for ( i=0; i=32 && + values[i][j]!='\\' && values[i][j]!='\'' ) + fprintf( out, "'%c', ", values[i][j]); + else + fprintf( out, "0x%x, ", values[i][j]); + fprintf( out, " 0 };\n" ); + } + } + fprintf( out, "\nstatic const unichar_t *%s_ui_strings[] = {\n", lc ); + for ( i=0; i=32 && mn[i]!='\\' && mn[i]!='\'' ) + fprintf( out, "'%c', ", mn[i]); + else + fprintf( out, "0x%04x, ", mn[i]); + } + fprintf( out, "\n\t0};\n\n" ); + fprintf( out, "static const int %s_ui_num[] = {", lc ); + for ( i=0; i=32 && values[i][j]<127) || + (values[i][j]>=0xa0 && values[i][j]<256)) && + values[i][j]!='"' && values[i][j]!='\\' ) + putc(values[i][j],out); + else + fprintf(out,"\\%03o", values[i][j]); + } + fprintf( out, "\";\n" ); + } else { + fprintf( out, "static unichar_t str_%s[] = { ", cu_copy(names[i])); + for ( j=0; values[i][j]!=0; ++j ) { + if (( (values[i][j]>=32 && values[i][j]<127) || + (values[i][j]>=0xa0 && values[i][j]<256)) && + values[i][j]!='"' && values[i][j]!='\\' ) + fprintf(out, "'%c', ", values[i][j]); + else + fprintf(out,"0x%x, ", values[i][j]); + } + fprintf( out, " 0 };\n" ); + } + if ( mn[i]!=0 ) { + fprintf( out, "static unichar_t mnemonic_%s[] = ", cu_copy(names[i])); + if (( (mn[i]>=32 && mn[i]<127) || + (mn[i]>=0xa0 && mn[i]<256)) && + mn[i]!='"' && mn[i]!='\\' ) + fprintf(out, "'%c';\n", mn[i]); + else + fprintf(out,"0x%x;\n", mn[i]); + } + } + putc('\n',out); + for ( i=0; i1 ) lc = argv[1]; + if ( argc>2 ) uc = argv[2]; + + if ( makenomenh()) +return( 1 ); + + /* read all nomen-??*.c files in the current directory */ + here = opendir("."); + if ( here==NULL ) +return( 1 ); + while ( (file = readdir(here))!=NULL ) { + if ( strncmp(file->d_name,"nomen-",6)!=0 ) + continue; + len = strlen(file->d_name); + if ( lend_name+len-2,".c")!=0 ) + continue; + ProcessNames(file->d_name,lc,uc); + } + closedir(here); + +return( 0 ); +} diff --git a/fontforge/metafont.c b/fontforge/metafont.c new file mode 100644 index 00000000..1c5d5271 --- /dev/null +++ b/fontforge/metafont.c @@ -0,0 +1,2199 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "edgelist.h" +#include +#include +#include +#include + +/* This module is designed to detect certain features of a character (like stems + * and counters, and then modify them in a useful way. + * The most obvious examples are: + * To make all the stems thicker (thereby emboldening the font) + * To make all the counters narrower (thereby condensing the font) + * To change the xheight (thereby changing the feel of the font) + * + * So first we find all the stems (and I mean all, not just the horizontal/ + * vertical stems). From this list (or perhaps from the hints?, yes from + * hints. Figuring horizontal/vertical is non-trivial.) we then look + * at just the hv stems and find the hv counters, based on this we figure + * how to position the centers of all stems. + * (we build a map based on horizontal stems and counters. We figure + * how each stem and counter should expand, and based on that where + * each should end up. We then extrapolate intermediate values. + * We do the same for the vertical stems, except in most cases they + * won't move much. We may need to move the center of the xheight stem + * down slightly so that the top of the stem is still at the xheight, + * (and same for cap, while descent moves up) but that's about it.) + *=====>Well that sounds all simple and doable. And then we realize that "A" + * has no vertical stems, and no horizontal counters, while "B" has two + * overlapping horizontal counters. Oh. + * Ok, to handle "B" we just have two mapping regions, one for each + * counter. And the boundary between them is the half-way between + * the places the respective hints are valid. + * Now "A" ("K", "M", "N" "R" "V" "W" "X" "Y") is harder. Do we even + * want to expand the counters? Do we look at the diagonal stems + * and figure counters between their end-points (and establish + * seperate zones for top and bottom)? + * What do we do about Italic? Treat them as we did "A"? Include an + * auto-deskew/reskew feature to bracket our processing? + * Heaven help us if we have a complicated CJK character with overlapping + * counters. + * We figure out how wide each stem is at all the points, and we figure where + * the stem's center lies there. We figure where the stem's center should be + * placed (based on the above map), we figure how much to expand the stem + * by (this gives us a final position for the point. + * At least that works if the point is not a corner point. If it's a + * corner point (so there are two non-parallel stems that intersect + * here) we figure the lines which are tangent to the stem edges, and + * then intersect them. + * Since all points had better lie on stems, we should now have positioned + * every point. But we need to figure out the control points now. + * If a point has no control point, it continues not to. + * Otherwise find the x,y distance between this point and the next. + * Find what it used to be. + * Then interpolate new positions for the control points based on + * how much these distances have expanded/contracted. + * That should do it. + * + * Oh yes, it might be nice, before we start out, to make a copy of the old + * character's shape and place it in the background so the user can compare + * the two (and perhaps fix things more easily if we screwed up). + */ +/* Drat. Finding all diagonal stems is not possible with just horizontal and */ +/* vertical passes. Consider a rotated rectangle. The stem whose width is */ +/* the lesser will almost certainly show up, but the perp direction will not */ +/* be detected because no horizontal/vertical line will intersect both edges */ +/* So... We could rotate the coordinate system for each slanted edge and */ +/* run a detection pass for it. (Ug) */ +/* Or... we could just say that if we have to lose one of the stems, well we're*/ +/* losing the less important one (we lose the one that's wider), and this */ +/* algorithem only really works for hv stems anyway... */ + +/* ************ Data structures active during the entire command ************ */ +enum counterchoices { cc_same, /* counters have the same width until scaled */ + cc_centerfixed, /* stem centers remain fixed, stems expand around, then scale */ + cc_edgefixed, /* outer edges are fixed, outer stems only expand, then scale */ + /* inward, while inner stems have their centers */ + /* fixed */ + cc_zones /* specify a mapping directly */ +}; + +struct scale { + real factor; + real add; +}; + +struct zonemap { + real from; + real to; +}; + +struct stemcntl { + unsigned int onlyh: 1; /* this entry only controls hstems */ + unsigned int onlyv: 1; + real small, wide; /* Only controls stems whose width is between small and wide (inclusive) */ + real factor; + real add; +}; + +typedef struct metafont { + unsigned int done: 1; + unsigned int scalewidth: 1; /* If false then scale l/rbearing */ + struct scale width; /* if scalewidth scale width by this */ + struct scale lbearing, rbearing; /* if !scalewidth, do these */ + struct counters { + unsigned int counterchoices: 2; + struct scale counter; /* if counterchoices==cc_scale */ + int zonecnt; + struct zonemap *zones; + real widthmin; /* No counter may drop below this */ + /* Nor will a counter smaller than this be detected */ + } counters[2]; /* 0 is horizontal, 1 is vertical */ + int stemcnt; + struct stemcntl *stems; + real blues[6]; /* Contains the result of QuickBlues */ + int bcnt, bxh; /* number of entries and location of xh*/ + FontView *fv; + CharView *cv; + SplineChar *sc; + SplineFont *sf; + GWindow gw; +} MetaFontDlg; + +/* ************ Data structures active on a per character basis ************* */ + +typedef struct splineinfo { + Spline *spline1, *spline2; /* spline1 will be leftmost (bottommost) */ + SplinePoint *from, *to; /* Using the direction of spline1 */ + /* Does spline1 or spline2 end first? so from will be either */ + /* spline1->from, or spline2->to, and to either spline1->to */ + /* or spline2->from */ + real fromlen, tolen; /* The distance from spline1 to spline2*/ + /* (or spline2 to spline1 depending on whether from belongs */ + /* to spline1 or spline2), perpendicular to the point there */ + /* if the len is -1 the we've decided that this doesn't */ + /* qualify as a stem, probably because the two edges are */ + /* nothing like parallel */ + BasePoint fromvec, tovec; /* Vector to the point mid-way between the two splines */ + /* splines */ + unsigned int spline2backwards: 1; + unsigned int figured: 1; + unsigned int freepasscnt: 1; + unsigned int major: 1; /* Direction in which found */ +} SplineInfo; + +typedef struct splinelist { + SplineInfo *cur; + struct splinelist *next; +} SplineList; + +typedef struct pointinfo { + SplinePoint *cur; + BasePoint newme, newnext, newprev; + SplineList *next/*, *prev*/; + unsigned int mefigured: 1; + unsigned int cpfigured: 1; /* Probably don't need this bit */ +} PointInfo; + +struct countergroup { + real bottom, top; /* Range in the other coordinate over which this map is valid */ + int scnt, counternumber; + StemInfo **stems; + struct countergroup *next; +}; + +struct map { + real bottom, top; /* Range in the other coordinate over which this map is valid */ + int cnt; /* number of entries in map */ + struct zonemap *mapping; +}; + +struct mapd { + int mapcnt; /* Count of the number of counter groups (maps), not the number of counters within the groups (zonemaps) */ + struct map *maps; +}; + +typedef struct scinfo { + SplineChar *sc; + PointInfo *pts; + int ptcnt; + struct mapd mapd[2]; + MetaFontDlg *meta; + real rbearing; /* Only used if !meta->scalewidth */ + real width; +} SCI; + + +void SCCopyFgToBg(SplineChar *sc, int show) { + SplinePointList *fore, *end; + + SCPreserveBackground(sc); + fore = SplinePointListCopy(sc->layers[ly_fore].splines); + if ( fore!=NULL ) { + SplinePointListFree(sc->layers[ly_back].splines); + sc->layers[ly_back].splines = NULL; + for ( end = fore; end->next!=NULL; end = end->next ); + end->next = sc->layers[ly_back].splines; + sc->layers[ly_back].splines = fore; + if ( show ) + SCCharChangedUpdate(sc); + } +} + +static SCI *SCIinit(SplineChar *sc,MetaFontDlg *meta) { + /* Does five or six things: + Sets the undoes + Calculates hints (if we need to) + Copies the forground to the background + Closes any open paths (remove any single points) + numbers the points + creates the pointinfo list + */ + SplinePointList *ss, *ssnext, *prev; + SplinePoint *sp; + int cnt; + SCI *sci; + static struct simplifyinfo smpl = { sf_cleanup }; + + SCPreserveState(sc,true); + + SplinePointListSimplify(sc,sc->layers[ly_fore].splines,&smpl); /* Get rid of two points at the same location, they cause us problems */ + if ( sc->manualhints || sc->changedsincelasthinted ) + SplineCharAutoHint(sc,true); + + SCCopyFgToBg(sc,false); + + for ( prev=NULL, ss=sc->layers[ly_fore].splines; ss!=NULL; ss = ssnext ) { + ssnext = ss->next; + if ( ss->first->next==NULL ) { /* Single point */ + if ( prev==NULL ) + sc->layers[ly_fore].splines = ssnext; + else + prev->next = ssnext; + SplinePointListFree(ss); + } else + prev = ss; + } + for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + if ( ss->first->prev==NULL ) { + /* It's not a loop, Close it! */ + SplineMake3( ss->last,ss->first ); + ss->last = ss->first; + } + } + + for ( ss = sc->layers[ly_fore].splines, cnt=0; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sp->ptindex = cnt++; + sp = sp->next->to; /* only closed paths, so no NULL splines */ + if ( sp==ss->first ) + break; + } + } + + sci = gcalloc(1,sizeof(SCI)); + sci->sc = sc; + sci->meta = meta; + sci->ptcnt = cnt; + sci->pts = gcalloc(cnt,sizeof(PointInfo)); + for ( ss = sc->layers[ly_fore].splines, cnt=0; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sci->pts[cnt++].cur = sp; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +return( sci ); +} + +static void MapContentsFree(struct map *map) { + free(map->mapping); +} + +static void SCIFree(SCI *sci) { + int i,j; + SplineList *sl, *slnext; + + for ( i=0; iptcnt; ++i ) { + for ( sl = sci->pts[i].next; sl!=NULL; sl = slnext ) { + slnext = sl->next; + if ( sl->cur->freepasscnt ) { + /* We'll see every SplineInfo twice, once from spline1, and */ + /* once from spline2. We only free it on the second time. Can't */ + /* free it the first time because then on the second go we */ + /* have a dangling pointer and have no way to know that */ + free(sl->cur); + } else + ++sl->cur->freepasscnt; + free(sl); + } + } + free(sci->pts); + for ( j=0; j<2; ++j ) { + for ( i=0; imapd[j].mapcnt; ++i ) + MapContentsFree(&sci->mapd[j].maps[i]); + free(sci->mapd[j].maps); + } + free(sci); +} + +static SplineInfo *SCIAddStem(SCI *sci,Spline *spline1,Spline *spline2,int major) { + int i = spline1->from->ptindex; + SplineList *t; + SplineInfo *cur; + + for ( t=sci->pts[i].next; t!=NULL && + (t->cur->spline1!=spline1 || t->cur->spline2!=spline2) && + (t->cur->spline1!=spline2 || t->cur->spline2!=spline1); t=t->next ); + if ( t!=NULL ) +return(t->cur); + cur = gcalloc(1,sizeof(SplineInfo)); + cur->spline1 = spline1; + cur->spline2 = spline2; + cur->major = major; + t = gcalloc(1,sizeof(SplineList)); + t->cur = cur; + t->next = sci->pts[i].next; + sci->pts[i].next = t; + + i = spline2->from->ptindex; + t = gcalloc(1,sizeof(SplineList)); + t->cur = cur; + t->next = sci->pts[i].next; + sci->pts[i].next = t; +return(cur); +} + +static void _SCIFindStems(SCI *sci,EIList *el, int major) { + EI *active=NULL, *apt, *e, *p; + int i, change, waschange; + + waschange = false; + for ( i=0; icnt; ++i ) { + active = EIActiveEdgesRefigure(el,active,i,major,&change); + /* Change means something started, ended, crossed */ + /* I'd like to know when a crossing is going to happen the pixel before*/ + /* it does. but that's too hard to compute */ + /* We also check every 16 pixels, mostly for cosmetic reasons */ + /* (long almost horizontal/vert regions may appear to end to abruptly) */ + if ( !( waschange || change || el->ends[i] || el->ordered[i]!=NULL || + (i!=el->cnt-1 && (el->ends[i+1] || el->ordered[i+1]!=NULL)) || + (i&0xf)==0 )) + /* It's in the middle of everything. Nothing will have changed */ + continue; + waschange = change; + for ( apt=active; apt!=NULL; apt = e->aenext ) { + if ( EISkipExtremum(apt,i+el->low,major)) { + e = apt->aenext; + continue; + } + if ( !apt->hv && apt->aenext!=NULL && apt->aenext->hv && + EISameLine(apt,apt->aenext,i+el->low,major)) + apt = apt->aenext; + e = p = EIActiveEdgesFindStem(apt, i+el->low, major); + if ( e==NULL ) + break; + SCIAddStem(sci,apt->spline,e->spline,major); + if ( EISameLine(p,p->aenext,i+el->low,major)) /* There's one case where this doesn't happen in FindStem */ + e = p->aenext; /* If the e is horizontal and e->aenext is not */ + } + } +} + +static void SCIFindStems(SCI *sci) { + EIList el; + + memset(&el,'\0',sizeof(el)); + ELFindEdges(sci->sc, &el); + + el.major = 0; + ELOrder(&el,el.major); + _SCIFindStems(sci,&el,el.major); + free(el.ordered); + free(el.ends); + + el.major = 1; + ELOrder(&el,el.major); + _SCIFindStems(sci,&el,el.major); + free(el.ordered); + free(el.ends); + + ElFreeEI(&el); +} + +static int SCIReasonableConnections(SCI *sci) { + int i; + + for ( i=0; iptcnt; ++i ) + if ( sci->pts[i].next==NULL ) +return( false ); + +return( true ); +} + +/* Generate a line through spline1[t1] perpendicular to it at that point */ +/* Intersect the line with spline2. If the intersection is on the spline */ +/* segment, then fill in the len and vec values (vec is the vector from the spline to the midpoint between the two)*/ +static int FindPerpDistance(real t1,Spline *spline1, Spline *spline2, + BasePoint *vec, real *len) { + BasePoint pt, slope, pslope, end[3], ss2; + double x, y, slope1, slope2, ts[3], lens[3], angle; + Spline1D temp; + int i,j; + + pt.x = ((spline1->splines[0].a*t1+spline1->splines[0].b)*t1+spline1->splines[0].c)*t1 + spline1->splines[0].d; + pt.y = ((spline1->splines[1].a*t1+spline1->splines[1].b)*t1+spline1->splines[1].c)*t1 + spline1->splines[1].d; + slope.x = (3*spline1->splines[0].a*t1+2*spline1->splines[0].b)*t1+spline1->splines[0].c; + slope.y = (3*spline1->splines[1].a*t1+2*spline1->splines[1].b)*t1+spline1->splines[1].c; + pslope.x = -slope.y; pslope.y = slope.x; + + if ( spline2->knownlinear ) { + if ( pslope.x==0 ) { + if ( spline2->splines[0].c==0 ) +return( false ); /* parallel */ + ts[0] = (pt.x-spline2->splines[0].d)/spline2->splines[0].c; + } else if ( spline2->splines[0].c==0 ) { + y = pt.y + (pslope.y/pslope.x)*(spline2->splines[0].d-pt.x); + ts[0] = (y-spline2->splines[1].d)/spline2->splines[1].c; + } else { + /* pt.y + (slope.y/slope.x)*(x-pt.x) = spline2->splines[1].d + (spline2->splines[1].c/spline2->splines[0].c)*(x-spline2->splines[0].d) */ + /* x*(slope1-slope2) = spline2->splines[1].d-pt.y+slope1*pt.x-slope2*spline2->splines[0].d */ + slope1 = pslope.y/pslope.x; + slope2 = spline2->splines[1].c/spline2->splines[0].c; + if ( slope1==slope2 ) +return( false ); + x = (spline2->splines[1].d-pt.y+slope1*pt.x-slope2*spline2->splines[0].d)/(slope1-slope2); + ts[0] = (x-spline2->splines[0].d)/spline2->splines[0].c; + } + if ( ts[0]<-0.01 || ts[0]>1.01 ) /* Allow a little fudge for rounding */ +return( false ); + ts[1] = ts[2] = -1; + } else { + if ( pslope.x==0 ) + SplineSolveFull(&spline2->splines[0],pt.x,ts); + else if ( pslope.y==0 ) + SplineSolveFull(&spline2->splines[1],pt.y,ts); + else { + slope1 = pslope.y/pslope.x; + temp.a = slope1*spline2->splines[0].a - spline2->splines[1].a; + temp.b = slope1*spline2->splines[0].b - spline2->splines[1].b; + temp.c = slope1*spline2->splines[0].c - spline2->splines[1].c; + temp.d = pt.y + slope1*(spline2->splines[0].d-pt.x) - spline2->splines[1].d; + SplineSolveFull(&temp,0,ts); + } + } + + /* There may be multiple solutions for a given spline. Find the closest */ + /* one which is bigger than 0 (we exclude 0 in case spline1==spline2, */ + /* it is possible for a spline to loop back on itself, and we don't want */ + /* it finding the start point where the distance is zero) */ + for ( i=0; i<3 && ts[i]!=-1; ++i ) { + end[i].x = ((spline2->splines[0].a*ts[i]+spline2->splines[0].b)*ts[i]+spline2->splines[0].c)*ts[i] + spline2->splines[0].d; + end[i].y = ((spline2->splines[1].a*ts[i]+spline2->splines[1].b)*ts[i]+spline2->splines[1].c)*ts[i] + spline2->splines[1].d; + lens[i] = sqrt( (pt.x-end[i].x)*(pt.x-end[i].x) + (pt.y-end[i].y)*(pt.y-end[i].y) ); + } + if ( i==0 ) +return( false ); + if ( i==1 ) + j = 0; + else { + j = 1; + if ( (lens[0]>0 && lens[0]0 && lens[3]x = (pt.x+end[j].x)/2 - pt.x; + vec->y = (pt.y+end[j].y)/2 - pt.y; + if ( lens[j]<.001 ) lens[j]=0; + else { + real len = rint(lens[j]); + if ( lens[j]>len-.001 && lens[j]splines[0].a*ts[j]+2*spline2->splines[0].b)*ts[j]+spline2->splines[0].c; + ss2.y = (3*spline2->splines[1].a*ts[j]+2*spline2->splines[1].b)*ts[j]+spline2->splines[1].c; + if (!(( slope.y==0 && ss2.y==0 ) || (slope.x==0 && ss2.x==0)) ) { + angle = atan2(slope.y,slope.x)-atan2(ss2.y,ss2.x); + while ( angle<0 ) angle += 3.1415926535897932; + while ( angle>=3.1415926535897932 ) angle -= 3.1415926535897932; + if ( angle>.5 && angle < 3.1415926535897932-.5 ) { + *len = -lens[j]; + if ( *len==0 ) *len = -.01; /* mark as bad */ +return( -1 ); + } + } + *len = lens[j]; +return( true ); +} + +static void SIFigureWidth(SplineInfo *si) { + int foundfrom=false, foundto=false; + int up1, up2; + int v; + +#if 0 + printf( "\nspline1=(%g,%g) -> (%g,%g), spline2=(%g,%g) -> (%g,%g)\n", + si->spline1->from->me.x, si->spline1->from->me.y, si->spline1->to->me.x, si->spline1->to->me.y, + si->spline2->from->me.x, si->spline2->from->me.y, si->spline2->to->me.x, si->spline2->to->me.y ); +#endif + if ( si->spline1->from->me.x==410 && si->spline2->from->me.x==408 ) + si->spline2->from->me.x=408; + + si->fromlen = si->tolen = -1; + if (( foundfrom = (FindPerpDistance(0,si->spline1,si->spline2,&si->fromvec,&si->fromlen)>0) )) + si->from = si->spline1->from; + if (( foundto = (FindPerpDistance(1,si->spline1,si->spline2,&si->tovec,&si->tolen)>0) )) + si->to = si->spline1->to; + if ( !si->major ) { + up1 = si->spline1->from->me.xspline1->to->me.x; + up2 = si->spline2->from->me.xspline2->to->me.x; + } else { + up1 = si->spline1->from->me.yspline1->to->me.y; + up2 = si->spline2->from->me.yspline2->to->me.y; + } + si->spline2backwards = (up1!=up2); + if ( true || !foundfrom || !foundto ) { /* !!! Debug */ + if ( up1==up2 ) { + if ( !foundfrom ) { + if ( FindPerpDistance(0,si->spline2,si->spline1,&si->fromvec,&si->fromlen)>0 ) + si->from = si->spline2->from; + } + if ( !foundto ) { + if ( FindPerpDistance(1,si->spline2,si->spline1,&si->tovec,&si->tolen)>0 ) + si->to = si->spline2->to; + } +#if 0 + printf( "(%g,%g) <-> (%g,%g) mid=(%g,%g) len=%g\n", +si->spline1->from->me.x, si->spline1->from->me.y, +si->spline2->from->me.x, si->spline2->from->me.y, +si->fromvec.x, si->fromvec.y, si->fromlen); + printf( "(%g,%g) <-> (%g,%g) mid=(%g,%g) len=%g\n", +si->spline1->to->me.x, si->spline1->to->me.y, +si->spline2->to->me.x, si->spline2->to->me.y, +si->tovec.x, si->tovec.y, si->tolen); +#endif + } else { + if ( !foundfrom ) { + if ( FindPerpDistance(1,si->spline2,si->spline1,&si->fromvec,&si->fromlen) ) + si->from = si->spline2->to; + } + if ( !foundto ) { + if ( FindPerpDistance(0,si->spline2,si->spline1,&si->tovec,&si->tolen) ) + si->to = si->spline2->from; + } +#if 0 + printf( "(%g,%g) <-> (%g,%g) mid=(%g,%g) len=%g\n", +si->spline1->from->me.x, si->spline1->from->me.y, +si->spline2->to->me.x, si->spline2->to->me.y, +si->fromvec.x, si->fromvec.y, si->fromlen); + printf( "(%g,%g) <-> (%g,%g) mid=(%g,%g) len=%g\n", +si->spline1->to->me.x, si->spline1->to->me.y, +si->spline2->from->me.x, si->spline2->from->me.y, +si->tovec.x, si->tovec.y, si->tolen); +#endif + } + if ( si->from!=NULL && si->from != si->spline1->from ) { + si->fromvec.x = -si->fromvec.x; + si->fromvec.y = -si->fromvec.y; + } + if ( si->to!=NULL && si->to != si->spline1->to ) { + si->tovec.x = -si->tovec.x; + si->tovec.y = -si->tovec.y; + } + } + si->figured = true; + +/* If it's close to an integer, round it to the integer */ + v = rint(si->fromlen); if ( si->fromlen>v-.05 && si->fromlenfromlen = v; + v = rint(si->tolen); if ( si->tolen>v-.05 && si->tolentolen = v; + v = rint(si->fromvec.x); if ( si->fromvec.x>v-.05 && si->fromvec.xfromvec.x = v; + v = rint(si->fromvec.y); if ( si->fromvec.y>v-.05 && si->fromvec.yfromvec.y = v; + v = rint(si->tovec.x); if ( si->tovec.x>v-.05 && si->tovec.xtovec.x = v; + v = rint(si->tovec.y); if ( si->tovec.y>v-.05 && si->tovec.ytovec.y = v; + + if ( (si->fromlen>0 && si->tolen>=0 ) || (si->fromlen>=0 && si->tolen>0)) + si->spline1->touched = si->spline2->touched = true; + else + si->fromlen = si->tolen = -1; +} + +/* We weren't able to find a matching edge for this spline (to make a stem) */ +/* by doing a horizontal or vertical traverse of the glyph. Let's try to */ +/* traverse perpendicular to the spline itself */ +static void SplineFindOtherEdge(SCI *sci,Spline *spline) { + real angle, s, c, xval, yval; + BasePoint pt, mid; + Spline *right, *left, *test, *first; + SplineSet *ss; + real rlen, llen, len; + int bcnt; + int bad, lbad, rbad; + + angle = atan2( (3*spline->splines[1].a*.5+2*spline->splines[1].b)*.5+spline->splines[1].c, + (3*spline->splines[0].a*.5+2*spline->splines[0].b)*.5+spline->splines[0].c) + + 3.1415926535897932/2; + s = sin(angle); c = cos(angle); + pt.x = ((spline->splines[0].a*.5+spline->splines[0].b)*.5+spline->splines[0].c)*.5 + spline->splines[0].d; + pt.y = ((spline->splines[1].a*.5+spline->splines[1].b)*.5+spline->splines[1].c)*.5 + spline->splines[1].d; + xval = pt.x*c + pt.y*s; + yval = -pt.x*s + pt.y*c; + /* Now look through all splines, find any whose bb includes our xval */ + /* Need to count intersections left. If count even find closest inter */ + /* right, if odd find closest left */ + /* For any that do, find the intersection & length, select the one with */ + /* the shortest length, build up an SI for it, insert into list, test */ + /* it's end points, mark this guy as touched EVEN IF WE DIDN"T FIND ANYTHING */ + /* if we repeat this process we won't find anything better */ + + right = left = NULL; rlen = llen = 0x7fffffff; bcnt = 0; + for ( ss = sci->sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + first = NULL; + for ( test = ss->first->next; test!=first; test = test->to->next ) { + if ( first==NULL ) first = test; + if ( test!=spline ) { + real f,t,c1,c2; + f = -test->from->me.x*s + test->from->me.y*c; + c1 = -test->from->nextcp.x*s + test->from->nextcp.y*c; + t = -test->to->me.x*s + test->to->me.y*c; + c2 = -test->to->prevcp.x*s + test->to->prevcp.y*c; + if ( (fyval+.001 && t>yval+.001 && c1>yval+.001 && c2>yval+.001 ) ) + continue; /* Can't intersect us */ + if ( FindPerpDistance(.5,spline,test,&mid,&len)) { + if ( (bad = len<0) ) len = -len; + if ( mid.x*c + mid.y*s < xval ) { + /* If we intersect a spline right at its endpoint then */ + /* we can't add the full amount because we'll find another*/ + /* spline later (or earlier) that intersects at the */ + /* same place. So in that case we add half the normal */ + /* amount */ + if ( RealNear(-test->from->me.x*s - test->from->me.y*c,yval) || + RealNear(-test->to->me.x*s - test->to->me.y*c,yval) ) + ++bcnt; + else + bcnt += 2; + if ( left==NULL || lenfigured ) + SIFigureWidth(si); + } + spline->touched = true; /* Even if we didn't find anything */ +} + +static int NotParallelHere(SplineInfo *si,SplinePoint *sp) { + Spline *s1, *s2; + real t1, len; + BasePoint mid; + + if ( si->spline1->from==sp ) { + s1 = si->spline1; s2 = si->spline2; + t1 = 0; + } else if ( si->spline1->to==sp ) { + s1 = si->spline1; s2 = si->spline2; + t1 = 1; + } else if ( si->spline2->from==sp ) { + s1 = si->spline2; s2 = si->spline1; + t1 = 0; + } else if ( si->spline2->to==sp ) { + s1 = si->spline2; s2 = si->spline1; + t1 = 1; + } else +return( true ); /* It's not parallel. Actually we've no idea what's going on, this shouldn't happen */ +return( FindPerpDistance(t1,s1,s2,&mid,&len)<=0 ); +} + +static void SCIFigureWidths(SCI *sci) { + int i; + SplineList *sl; + + for ( i=0; iptcnt; ++i ) { + for ( sl = sci->pts[i].next; sl!=NULL; sl = sl->next ) { + sl->cur->spline1->touched = false; + sl->cur->spline2->touched = false; + } + } + + for ( i=0; iptcnt; ++i ) { + for ( sl = sci->pts[i].next; sl!=NULL; sl = sl->next ) { + if ( !sl->cur->figured ) + SIFigureWidth(sl->cur); + } + } + + for ( i=0; iptcnt; ++i ) { + for ( sl = sci->pts[i].next; sl!=NULL; sl = sl->next ) { + if ( !sl->cur->spline1->touched ) + SplineFindOtherEdge(sci,sl->cur->spline1); + if ( !sl->cur->spline2->touched ) + SplineFindOtherEdge(sci,sl->cur->spline2); + } + } +} + +static void CounterGroupsFree(struct countergroup *cg) { + struct countergroup *next; + + for ( ; cg!=NULL; cg = next ) { + next = cg->next; + free(cg->stems); + free(cg); + } +} + +static real MetaFontFindWidth(MetaFontDlg *meta,real width,int isvert) { + int i; + + /* First look for matches where isvert matches */ + if ( isvert==0 || isvert==1 ) { + for ( i=0; istemcnt; ++i ) { + struct stemcntl *c = &meta->stems[i]; + if ( ((isvert && c->onlyv) || (!isvert && c->onlyh)) && + width<=c->wide && width>=c->small ) +return( c->factor*width + c->add ); + } + } + + for ( i=0; istemcnt; ++i ) { + struct stemcntl *c = &meta->stems[i]; + if ( !c->onlyv && !c->onlyh && width<=c->wide && width>=c->small ) +return( c->factor*width + c->add ); + } + +return( width ); /* didn't match anything, return unchanged */ +} + +static int MetaRecognizedStemWidth(MetaFontDlg *meta,real width,int isvert) { + int i; + + /* First look for matches where isvert matches */ + if ( width==0 ) +return( false ); + + if ( isvert==0 || isvert==1 ) { + for ( i=0; istemcnt; ++i ) { + struct stemcntl *c = &meta->stems[i]; + if ( ((isvert && c->onlyv) || (!isvert && c->onlyh)) && + width<=c->wide && width>=c->small ) +return( true ); + } + } + + for ( i=0; istemcnt; ++i ) { + struct stemcntl *c = &meta->stems[i]; + if ( !c->onlyv && !c->onlyh && width<=c->wide && width>=c->small ) +return( true ); + } + +return( false ); +} + +static void MapFromCounterGroup(struct map *map,MetaFontDlg *meta, + struct countergroup *cg, struct zonemap *extra, int ecnt, int isvert ) { + real offset=0; + int i=0,j,k; + StemInfo *stem; + real newwidth, lastwidth, counterwidth, newcwidth; + + map->bottom = cg->bottom; + map->top = cg->top; + + map->cnt = ecnt+2*cg->scnt+ (meta->counters[isvert].counterchoices==cc_zones?meta->counters[isvert].zonecnt:0); + map->mapping = galloc(map->cnt*sizeof(struct zonemap)); + + if ( ecnt!=0 ) { + memcpy(map->mapping,extra,ecnt*sizeof(struct zonemap)); + i = ecnt; + offset = extra[ecnt-1].to - extra[ecnt-1].from; + } + + if ( meta->counters[isvert].counterchoices==cc_zones ) { + struct zonemap *zones = meta->counters[isvert].zones; + int cnt = meta->counters[isvert].zonecnt; + real mid, newmid; + + for ( j=k=0; kscnt ; ++j ) { + stem = cg->stems[j]; + if ( stem->start+stem->width>=zones[k].from ) + break; + mid = stem->start+stem->width/2; + if ( k==0 ) { + newmid = mid + (zones[0].to-zones[0].from); + } else { + newmid = zones[k-1].to + (mid-zones[k-1].from)* + (zones[k].to-zones[k-1].to)/(zones[k].from-zones[k-1].from); + } + newwidth = MetaFontFindWidth(meta,stem->width,isvert); + if ( newwidth==0 ) { + map->mapping[i].from = mid; + map->mapping[i++].to = newmid; + } else if ( stem->width==20 && stem->ghost ) { + map->mapping[i].from = stem->start+20; + map->mapping[i++].to = rint(newmid+10); + } else if ( stem->width==21 && stem->ghost ) { + map->mapping[i].from = stem->start; + map->mapping[i++].to = rint(newmid-10.5); + } else { + map->mapping[i].from = stem->start; + map->mapping[i++].to = rint(newmid-newwidth/2); + map->mapping[i].from = stem->start+stem->width; + map->mapping[i].to = map->mapping[i-1].to+newwidth; + ++i; + } + } + if ( jscnt && stem->start<=zones[k].from ) { + newwidth = MetaFontFindWidth(meta,stem->width,isvert); + if ( newwidth==0 || stem->ghost ) + map->mapping[i++] = zones[k]; + else if ( stem->start==zones[k].from ) { + map->mapping[i++] = zones[k]; + map->mapping[i].from = stem->start+stem->width; + map->mapping[i++].to = zones[k].to+newwidth; + } else if ( stem->start+stem->width==zones[k].from ) { + map->mapping[i].from = stem->start; + map->mapping[i++].to = zones[k].to-newwidth; + map->mapping[i++] = zones[k]; + } else if ( stem->startstart+stem->width>zones[k].from ) { + map->mapping[i].from = stem->start; + map->mapping[i++].to = zones[k].to-(newwidth*(zones[k].from-stem->start)/stem->width); + map->mapping[i++] = zones[k]; + map->mapping[i].from = stem->start+stem->width; + map->mapping[i].to = map->mapping[i-2].to+newwidth; + ++i; + } else + map->mapping[i++] = zones[k]; + ++j; + } else + map->mapping[i++] = zones[k]; + } + map->cnt = i; + } else { + newwidth = 0; /* Irrelevant, but it means compiler doesn't think newwidth uninitialized */ + for ( j=0; jscnt; ++j ) { + lastwidth = newwidth; + newwidth = MetaFontFindWidth(meta,cg->stems[j]->width,isvert); + if ( newwidth==0 ) + continue; + if ( j!=0 ) { + newcwidth = counterwidth = + cg->stems[j]->start - (cg->stems[j-1]->start+cg->stems[j-1]->width); + switch ( meta->counters[isvert].counterchoices ) { + case cc_same: + newcwidth = counterwidth; + break; + case cc_centerfixed: + newcwidth -= (lastwidth-cg->stems[j-1]->width)/2 + + (newwidth - cg->stems[j]->width)/2; + break; + case cc_edgefixed: + if ( j==1 ) + newcwidth -= (lastwidth-cg->stems[j-1]->width); + else + newcwidth -= (lastwidth-cg->stems[j-1]->width)/2; + if ( cg->scnt==j+1 ) + newcwidth -= (newwidth - cg->stems[j]->width); + else + newcwidth -= (newwidth - cg->stems[j]->width)/2; + break; + break; + case cc_zones: + default: + GDrawIError("Shouldn't get here in MapFromCounterGroup" ); + break; + } + newcwidth = meta->counters[isvert].counter.factor*newcwidth + + meta->counters[isvert].counter.add; + if ( newcwidthcounters[isvert].widthmin && counterwidth>=meta->counters[isvert].widthmin ) { + GWidgetErrorR(_STR_CounterTooSmallT,_STR_CounterTooSmall); + newcwidth = meta->counters[isvert].widthmin; + } else if ( newcwidth<0 ) { + GWidgetErrorR(_STR_CounterTooSmallT,_STR_CounterTooSmall); + newcwidth = 0; + } + offset += newcwidth-counterwidth; + } + if ( cg->stems[j]->width==20 && cg->stems[j]->ghost ) { + map->mapping[i].from = cg->stems[j]->start+20; + map->mapping[i++].to = rint(cg->stems[j]->start+20+offset); + } else if ( cg->stems[j]->width==21 && cg->stems[j]->ghost ) { + map->mapping[i].from = cg->stems[j]->start; + map->mapping[i++].to = rint(cg->stems[j]->start+offset); + } else { + map->mapping[i].from = cg->stems[j]->start; + map->mapping[i++].to = rint(cg->stems[j]->start+offset); + map->mapping[i].from = cg->stems[j]->start+cg->stems[j]->width; + map->mapping[i].to = map->mapping[i-1].to+newwidth; + ++i; + offset += newwidth-cg->stems[j]->width; + } + } + } +} + +static int CountIntersectingWheres(StemInfo *stems, HintInstance *match) { + int cnt=0; + HintInstance *hi; + + while ( stems!=NULL ) { + for ( hi=stems->where; hi!=NULL; hi=hi->next ) { + if ( hi->end>=match->begin && hi->begin<=match->end ) { + ++cnt; + break; + } + } + stems = stems->next; + } +return( cnt ); +} + +static void TouchIntersectingWheres(StemInfo *stems, HintInstance *match, + struct countergroup *cg, StemInfo **store) { + HintInstance *hi; + + while ( stems!=NULL ) { + for ( hi=stems->where; hi!=NULL; hi=hi->next ) { + if ( hi->end>=match->begin && hi->begin<=match->end ) { + hi->counternumber = match->counternumber; + if ( cg->bottom>hi->begin ) cg->bottom = hi->begin; + if ( cg->topend ) cg->top = hi->end; + if ( store!=NULL ) *store++ = stems; + break; + } + } + stems = stems->next; + } +} + +static int AllIntersectingWheresOnStemUsed(StemInfo *stems, HintInstance *match, + HintInstance *sameas) { + HintInstance *hi, *hi2; + + while ( stems!=NULL ) { + for ( hi=stems->where; hi!=NULL; hi=hi->next ) { + if ( hi->end>=match->begin && hi->begin<=match->end ) { + for ( hi2=stems->where; hi2!=NULL; hi2=hi2->next ) { + if ( hi2->counternumber==sameas->counternumber ) + break; + } + if ( hi2==NULL ) +return( false ); + } + } + stems = stems->next; + } +return( true ); +} + +static struct countergroup *SCIFindCounterGroups(StemInfo *stems) { + StemInfo *s; + HintInstance *hi, *best; + int cnt, allhi, ctest, anyconflicts, anynonconflicts, i; + struct countergroup *cg = NULL, *test, *cur, *prev, *next; + int cnum=0; + + anyconflicts=anynonconflicts = false; + for ( s=stems, cnt=0; s!=NULL; s=s->next, ++cnt ) { + for ( hi=s->where; hi!=NULL; hi=hi->next ) + hi->counternumber = -1; + if ( s->hasconflicts ) anyconflicts = true; + else anynonconflicts = true; + } + + /* if there are no conflicts, then one counter group should hold everything */ + /* If everything conflicts then pick a stem, there are no counters */ + if ( !anyconflicts ) { + cur = gcalloc(1,sizeof(struct countergroup)); + cur->scnt = cnt; + cur->stems = galloc(cnt*sizeof(StemInfo *)); + cur->bottom = -1e8; cur->top = 1e8; + cur->counternumber = 0; + for ( i=0, s=stems; inext ) + cur->stems[i] = s; +return( cur ); + } else if ( !anynonconflicts ) { + StemInfo *best = stems; + for ( s=stems->next; s!=NULL; s=s->next ) { + if ( s->widthwidth ) + best = s; + } + cur = gcalloc(1,sizeof(struct countergroup)); + cur->scnt = 1; + cur->stems = galloc(1*sizeof(StemInfo *)); + cur->bottom = -1e8; cur->top = 1e8; + cur->counternumber = 0; + cur->stems[0] = best; +return( cur ); + } else if ( cnt==3 && anynonconflicts ) { + StemInfo *non, *first=NULL, *second; + for ( s=stems; s!=NULL; s=s->next ) { + if ( !s->hasconflicts ) + non=s; + else if ( first==NULL ) + first = s; + else + second = s; + } + if ( first->where->begin>second->where->end ) { + StemInfo *temp = first; first = second; second = temp; + } + cg = cur = gcalloc(1,sizeof(struct countergroup)); + cur->scnt = 2; + cur->stems = galloc(2*sizeof(StemInfo *)); + cur->bottom = -1e8; cur->top = ceil(first->where->end); + cur->counternumber = 0; + if ( non->start< first->start ) { + cur->stems[0] = non; cur->stems[1] = first; + } else { + cur->stems[0] = first; cur->stems[1] = non; + } + cur = gcalloc(1,sizeof(struct countergroup)); + cur->scnt = 2; + cur->stems = galloc(2*sizeof(StemInfo *)); + cur->bottom = floor(second->where->begin); cur->top = 1e8; + cur->counternumber = 1; + if ( non->start< second->start ) { + cur->stems[0] = non; cur->stems[1] = second; + } else { + cur->stems[0] = second; cur->stems[1] = non; + } + cg->next = cur; +return( cg ); + } + + for ( s=stems; s!=NULL; ) { + cnt = 0; allhi = true; + for ( hi=s->where; hi!=NULL; hi=hi->next ) { + if ( hi->counternumber==-1 ) { + if ( ( ctest = CountIntersectingWheres(s->next,hi)+1)>cnt ) { + cnt = ctest; + best = hi; + } + } else + allhi = false; + } + if ( cnt==0 ) { + s = s->next; + continue; + } + cur = gcalloc(1,sizeof(struct countergroup)); + cur->scnt = cnt; + cur->stems = galloc(cnt*sizeof(StemInfo *)); + cur->bottom = floor(best->begin); cur->top = ceil(best->end); + cur->counternumber = cnum++; + if ( cg==NULL || cur->scnt>cg->scnt ) { + cur->next = cg; + cg = cur; + } else { + for ( test=cg; test->next!=NULL && test->next->scnt>cg->scnt ; + test = test->next ); + cur->next = test->next; + test->next = cur; + } + best->counternumber = cur->counternumber; + cur->stems[0] = s; + TouchIntersectingWheres(s->next,best,cur,cur->stems+1); + for ( hi=s->where; hi!=NULL; hi=hi->next ) { + if ( hi->counternumber==-1 ) { + if ( AllIntersectingWheresOnStemUsed(s->next,hi,best)) { + hi->counternumber = cur->counternumber; + TouchIntersectingWheres(s->next,hi,cur,NULL); + if ( cur->bottom>hi->begin ) cur->bottom = hi->begin; + if ( cur->topend ) cur->top = hi->end; + } + } + } + } + /* If we've got a stem, we should create one cg */ + if ( cg==NULL && stems!=NULL ) { + cur = gcalloc(1,sizeof(struct countergroup)); + cur->scnt = 1; + cur->stems = galloc(sizeof(StemInfo *)); + cur->stems[0] = stems; + cur->bottom = -1e8; cur->top = 1e8; + cur->counternumber = cnum++; + } + /* get rid of any overlapping groups, we keep the one with the most stems */ + /* in it (it comes first in the list) */ + for ( cur=cg; cur!=NULL; cur=cur->next ) { + for ( prev=cur, test=cur->next; test!=NULL; test = next ) { + next = test->next; + if ( test->top>=cur->bottom && test->bottom<=cur->top ) { + prev->next = next; + free(test->stems); + free(test); + } else + prev = test; + } + } +return(cg); +} + +static struct map *MapFromDiags(MetaFontDlg *meta,StemInfo *vstem, DStemInfo *dstem, + struct zonemap *extras, int ecnt) { + struct map *map = gcalloc(1,sizeof(struct map)); + real minx, maxx, minxw, maxxw, olen, orthwidth, width; + BasePoint orthvector; + StemInfo dummystems[2]; + StemInfo *stems[3]; + struct countergroup cg; + /* Create a counter group that has some bearing on the diagonal hints */ + /* (ie. that two dummy stems, one at the min location of all the hints */ + /* one at the max location of all) */ + /* That should handle A, V, X. Doesn't do W well, but better than nothing */ + /* If there's a vstem then toss it into the mixture. */ + /* That should handle K and cyrillic ZHE */ + + minx = 1e8; maxx = -1e8; + while ( dstem!=NULL ) { + orthvector.x = dstem->leftedgetop.y-dstem->leftedgebottom.y; + orthvector.y = -dstem->leftedgetop.x+dstem->leftedgebottom.x; + olen = sqrt( orthvector.x*orthvector.x + orthvector.y*orthvector.y ); + orthvector.x /= olen; orthvector.y /= olen; + orthwidth = orthvector.x*(dstem->rightedgetop.x-dstem->leftedgetop.x) + + orthvector.y*(dstem->rightedgetop.y-dstem->leftedgetop.y); + if ( minx>dstem->leftedgetop.x ) { + minx = dstem->leftedgetop.x; + minxw = width; + } + if ( minx>dstem->leftedgebottom.x ) { + minx = dstem->leftedgebottom.x; + minxw = width; + } + if ( maxxrightedgetop.x ) { + maxx = dstem->rightedgetop.x; + maxxw = width; + } + if ( maxxrightedgebottom.x ) { + maxx = dstem->rightedgebottom.x; + maxxw = width; + } + dstem = dstem->next; + } + if ( vstem!=NULL ) { /* At most one */ + if ( vstem->start+vstem->width >= minx && vstem->start < minx ) { + minx = vstem->start; + minxw = vstem->width; + vstem = NULL; + } else if ( vstem->start<=maxx && vstem->start+vstem->width > maxx ) { + maxx = vstem->start+vstem->width; + maxxw = vstem->width; + vstem = NULL; + } + } + memset(dummystems,'\0',sizeof(dummystems)); + memset(&cg,'\0',sizeof(cg)); + dummystems[0].start = minx; + dummystems[0].width = minxw; + dummystems[1].start = maxx-maxxw; + dummystems[1].width = maxxw; + cg.scnt = 3; + cg.stems = stems; + cg.bottom = -1e8; cg.top = 1e8; + stems[0] = dummystems; + stems[1] = dummystems+1; + stems[2] = dummystems+1; + if ( vstem==NULL ) { + cg.scnt = 2; + } else if ( vstem->startstartmapcnt; ++i ) { + map = &mapd->maps[i]; + for ( j=0; jcnt-1; ++j ) { + if ( map->mapping[j].from>=map->mapping[j+1].from ) { + --map->cnt; + for ( k=j ; kcnt; ++k ) + map->mapping[k] = map->mapping[k+1]; + } + } + } +} + +static void SCIBuildMaps(SCI *sci, int isvert) { + MetaFontDlg *meta = sci->meta; + struct zonemap extras[2]; + int ecnt = 0; + DBounds b; + struct countergroup *countergroups, *cg; + int i; + + if ( !isvert ) { + SplineCharFindBounds(sci->sc,&b); + extras[0].from = b.minx; + if ( meta->scalewidth ) { + extras[0].to = extras[0].from; + sci->width = meta->width.factor*sci->sc->width + meta->width.add; + } else { + extras[0].to = meta->lbearing.factor*b.minx + meta->lbearing.add; + sci->rbearing = meta->rbearing.factor*(sci->sc->width-b.maxx) + meta->rbearing.add; + } + ecnt = 1; + } + + if ( !isvert && + (sci->sc->vstem==NULL || sci->sc->vstem->next==NULL) && + sci->sc->dstem!=NULL ) { + /* If we're looking for horizontal counters, but we've got no (or at */ + /* most one) vertical stem, then see if we can generate any counters */ + /* from the diagonal stems */ + sci->mapd[0].mapcnt = 1; + sci->mapd[0].maps = MapFromDiags(meta,sci->sc->vstem, + sci->sc->dstem,extras,1); + } else { + /* Horizontal counters need vertical stems, and vice versa */ + countergroups = SCIFindCounterGroups(isvert ? sci->sc->hstem : sci->sc->vstem); + for ( i=0, cg=countergroups; cg!=NULL; ++i, cg=cg->next ); + if ( i==0 ) i=1; + sci->mapd[isvert].mapcnt = i; + sci->mapd[isvert].maps = gcalloc(i,sizeof(struct map)); + for ( i=0, cg=countergroups; cg!=NULL; ++i, cg=cg->next ) + MapFromCounterGroup(&sci->mapd[isvert].maps[i],meta,cg, + extras,ecnt,isvert); + CounterGroupsFree(countergroups); + } + MapCleanup(&sci->mapd[isvert]); +} + +static real _MapCoord(struct map *map, real coord) { + int i; + + if ( map==NULL || map->cnt==0 ) +return( coord ); + if ( coord<=map->mapping[0].from ) +return( coord+map->mapping[0].to-map->mapping[0].from ); + for ( i=1; icnt; ++i ) { + if ( coord<=map->mapping[i].from ) +return( map->mapping[i].to + (coord-map->mapping[i].from)* + (map->mapping[i].to-map->mapping[i-1].to)/ + (map->mapping[i].from-map->mapping[i-1].from) ); + } + --i; +return( coord+map->mapping[i].to-map->mapping[i].from ); +} + +static real MapCoord(struct mapd *map, real coord, real other) { + int i, top=-1, bottom=-1; + real topdiff = 1e8, bottomdiff = 1e8; + + if ( map->mapcnt==1 ) +return( _MapCoord(&map->maps[0],coord)); + for ( i=0; imapcnt; ++i ) { + if ( other>=map->maps[i].bottom && other<=map->maps[i].top ) +return( _MapCoord(&map->maps[i],coord)); + if ( other>map->maps[i].top && other-map->maps[i].topmaps[i].top; + } else if ( othermaps[i].bottom && map->maps[i].bottom-othermaps[i].bottom-other; + } + } + if ( bottom!=-1 && top!=-1 ) +return( (_MapCoord(&map->maps[bottom],coord)+_MapCoord(&map->maps[top],coord))/2 ); + else if ( bottom!=-1 ) +return( _MapCoord(&map->maps[bottom],coord)); + else if ( top!=-1 ) +return( _MapCoord(&map->maps[top],coord)); + else +return( _MapCoord(&map->maps[0],coord)); +} + +static void SCIMapPoint(SCI *sci,BasePoint *pt) { + pt->x = MapCoord(&sci->mapd[0],pt->x,pt->y); + pt->y = MapCoord(&sci->mapd[1],pt->y,pt->x); +} + +static int _IsOnKnownEdge(struct map *map, real coord) { + int i; + + for ( i=0; icnt; ++i ) { + if ( coordmapping[i].from-.1 ) +return( false ); + if ( coordmapping[i].from+.1 ) +return( true ); + } +return( false ); +} + +static int IsOnKnownEdge(struct mapd *map, real coord, real other) { + int i; + + if ( map->mapcnt==1 ) +return( _IsOnKnownEdge(&map->maps[0],coord)); + for ( i=0; imapcnt; ++i ) { + if ( other>=map->maps[i].bottom && other<=map->maps[i].top ) +return( _IsOnKnownEdge(&map->maps[i],coord)); + } +return( false ); +} + +static int SCIIsOnKnownEdge(SCI *sci,BasePoint *pt,int isvert) { + if ( isvert==0 ) +return( IsOnKnownEdge(&sci->mapd[0],pt->x,pt->y)); + else if ( isvert==1 ) +return( IsOnKnownEdge(&sci->mapd[1],pt->y,pt->x)); + +return( false ); +} + +static int IsHVSpline(Spline *spline, SplinePoint *sp) { + real rat; + + if ( !spline->knownlinear ) { + if ( sp==spline->from ) { + if ( spline->splines[0].c==0 ) +return( 1 ); + else if ( spline->splines[1].c==0 ) +return( 0 ); + else if ( ( rat = spline->splines[0].c/spline->splines[1].c) < .05 && + rat>-.05 ) +return( 1 ); + else if ( ( rat = spline->splines[1].c/spline->splines[0].c) < .05 && + rat>-.05 ) +return( 0 ); + } else if ( sp==spline->to ) { + real xs, ys; + xs = 3*spline->splines[0].a+2*spline->splines[0].b+spline->splines[0].c; + ys = 3*spline->splines[1].a+2*spline->splines[1].b+spline->splines[1].c; + if ( xs==0 ) +return( 1 ); + else if ( ys==0 ) +return( 0 ); + else if ( ( rat = xs/ys) < .05 && rat>-.05 ) +return( 1 ); + else if ( ( rat = ys/xs) < .05 && rat>-.05 ) +return( 0 ); + } +return( 2 ); + } else if ( spline->from->me.x==spline->to->me.x ) +return( 1 ); + else if ( spline->from->me.y==spline->to->me.y ) +return( 0 ); + +return( 2 ); +} + +static real SCIFindMidPoint(SCI *sci,int pt, SplineList *spl, BasePoint *mid) { + SplinePoint *sp = sci->pts[pt].cur; + SplineList *sl; + real len; + SplineInfo *only, *exact; + int isvert; + Spline *spline; + + if ( spl->cur->spline1==sp->next || spl->cur->spline2==sp->next ) + isvert = IsHVSpline( spline = sp->next, sp ); + else + isvert = IsHVSpline( spline = sp->prev, sp ); + + /* First check to see if there's a Stem in the splinelist that's valid */ + len = -1; only = exact = NULL; + for ( sl=spl; sl!=NULL; sl=sl->next ) { + /* A curved spline may form a stem with another spline/line at one */ + /* location, while at another location the two are not a good match */ + /* So not all the stems we figured will be good matches at all times */ + if (( !sl->cur->spline1->knownlinear || !sl->cur->spline2->knownlinear ) && + NotParallelHere(sl->cur,sp)) + continue; + if ( MetaRecognizedStemWidth(sci->meta,sl->cur->fromlen,isvert) || + MetaRecognizedStemWidth(sci->meta,sl->cur->tolen,isvert)) { + if ( len==-1 ) { + if ( sl->cur->from==sp && MetaRecognizedStemWidth(sci->meta,sl->cur->fromlen,isvert)) + len = sl->cur->fromlen; + else if ( sl->cur->to==sp && MetaRecognizedStemWidth(sci->meta,sl->cur->tolen,isvert)) + len = sl->cur->tolen; + else + len = MetaRecognizedStemWidth(sci->meta,sl->cur->fromlen,isvert)? + sl->cur->fromlen:sl->cur->tolen; + only = sl->cur; + } else if ( RealApprox(len,sl->cur->fromlen) || + RealApprox(len,sl->cur->tolen)) { + /* Same size as last, it's ok */ + } else + len = -2; + if ( sl->cur->from == sp || sl->cur->to == sp ) + exact = sl->cur; + } + } + if ( exact==NULL && len!=-2 ) exact = only; + if ( exact!=NULL ) { + if ( exact->spline1->from==sp ) { + mid->x = sp->me.x + exact->fromvec.x; + mid->y = sp->me.y + exact->fromvec.y; + len = exact->fromlen; + } else if ( exact->spline1->to==sp ) { + mid->x = sp->me.x + exact->tovec.x; + mid->y = sp->me.y + exact->tovec.y; + len = exact->tolen; + } else if (( exact->spline2->from==sp && !exact->spline2backwards) || + (exact->spline2->to==sp && exact->spline2backwards)) { + mid->x = sp->me.x - exact->fromvec.x; + mid->y = sp->me.y - exact->fromvec.y; + len = exact->fromlen; + } else { + mid->x = sp->me.x - exact->tovec.x; + mid->y = sp->me.y - exact->tovec.y; + len = exact->tolen; + } +return( len ); + } + +#if 0 /* I don't think this will gain us anything over MapPoint */ + /* check to see if it falls exactly on one of the hints */ + if ( s->knownlinear && s->from->me.x==s->to->me.x ) { /* Vertical spline */ + for ( h=sci->sc->hstem; h!=NULL; h=h->next ) { + if ( h->start==sp->me.x || h->start+h->width==sp->me.x ) { + mid->y = sp->me.y; + mid->x = h->start+h->width/2; +return( h->width); + } + } + } else if ( s->knownlinear && s->from->me.y==s->to->me.y ) {/* Horizontal spline */ + for ( h=sci->sc->hstem; h!=NULL; h=h->next ) { + if ( h->start==sp->me.y || h->start+h->width==sp->me.y ) { + mid->x = sp->me.x; + mid->y = h->start+h->width/2; +return( h->width); + } + } + } +#endif + +return( 0 ); /* Couldn't find a stem */ +} + +static void PositionFromMidLen(SCI *sci,BasePoint *new,BasePoint *mid,SplinePoint *sp, + real len, Spline *s) { + BasePoint v, other, temp; + int isvert = IsHVSpline(s,sp); + + v.x = mid->x-sp->me.x; v.y = mid->y-sp->me.y; + other.x = mid->x+v.x; other.y = mid->y+v.y; + len = MetaFontFindWidth(sci->meta,len,isvert)/2; /* Get half the stem width */ + len /= sqrt(v.x*v.x + v.y*v.y); /* Normalize vector which is half current width */ + v.x *= len; v.y *= len; + if ( isvert!=2 ) { + if ( SCIIsOnKnownEdge(sci,&sp->me,0) ) { + temp = sp->me; + SCIMapPoint(sci,&temp); + new->x = rint(temp.x); + } else if ( SCIIsOnKnownEdge(sci,&other,0)) { + temp = other; + SCIMapPoint(sci,&temp); + new->x = rint(temp.x)-2*v.x; + } else { + temp = *mid; + SCIMapPoint(sci,&temp); + if ( v.x>0 ) + new->x = rint(temp.x-v.x); + else + new->x = rint(temp.x+v.x)-2*v.x; + } + if ( SCIIsOnKnownEdge(sci,&sp->me,1) ) { + temp = sp->me; + SCIMapPoint(sci,&temp); + new->y = rint(temp.y); + } else if ( SCIIsOnKnownEdge(sci,&other,1)) { + temp = other; + SCIMapPoint(sci,&temp); + new->y = rint(temp.y)-2*v.y; + } else { + temp = *mid; + SCIMapPoint(sci,&temp); + if ( v.y>0 ) + new->y = rint(temp.y-v.y); + else + new->y = rint(temp.y+v.y)-2*v.y; + } + } else { + temp = *mid; + SCIMapPoint(sci,&temp); + if ( v.y>0 || (v.x>0 && v.y==0)) { + new->x = rint(temp.x-v.x); + new->y = rint(temp.y-v.y); + } else { + new->x = rint(temp.x+v.x)-2*v.x; + new->y = rint(temp.y+v.y)-2*v.y; + } + } +} + +static void SplineIntersectWithEdge(SCI *sci,SplinePoint *sp,Spline *s, + BasePoint *new,BasePoint *mid,BasePoint *v1) { + BasePoint new1 = *new, new2, other; + BasePoint v2; + real mapped; + + if ( s->knownlinear ) { + /* if the other spline is a line then we want the edge */ + /* between us and the previous point to be parallel to */ + /* that line. If the line is hor/vert we need to check it */ + /* against the zones */ + if ( s->from->me.y==s->to->me.y && SCIIsOnKnownEdge(sci,&sp->me,1)) { + mapped = MapCoord(&sci->mapd[1],sp->me.y,sp->me.x); + if ( RealApprox(new1.y,mapped)) + new->y = mapped; + else if ( v1->y==0 ) + GDrawIError("Two Parallel vertical lines" ); + else { + new->y = mapped; + new->x = new1.x + (mapped-new1.y)*v1->x/v1->y; + } + } else if ( s->from->me.x==s->to->me.x && SCIIsOnKnownEdge(sci,&sp->me,0)) { + mapped = MapCoord(&sci->mapd[0],sp->me.x,sp->me.y); + if ( RealApprox(new1.x,mapped)) + new->x = mapped; + else if ( v1->x==0 ) + GDrawIError("Two Parallel horizontal lines" ); + else { + new->x = mapped; + new->y = new1.y + (mapped-new1.x)*v1->y/v1->x; + } + } else { +#if 0 + v2.y = s->to->me.x-s->from->me.x; v2.x = -(s->to->me.y-s->from->me.y); + len = sqrt(v2.x*v2.x+v2.y*v2.y); + v2.y /= len; v2.x /= len; + off = (v2.x*( +#endif + } + } +} + +static void SCIPositionPts(SCI *sci) { + int i; + real len1, len2; + BasePoint mid1, mid2; + BasePoint v1,v2; + BasePoint new, new1, new2; + SplinePoint *sp; + + for ( i=0; iptcnt; ++i ) { + sp = sci->pts[i].cur; + if ( !SplinePointIsACorner(sp)) { + len1 = SCIFindMidPoint(sci,i,sci->pts[i].next,&mid1); + if ( len1==0 ) { + new = sp->me; + SCIMapPoint(sci,&new); + } else { + PositionFromMidLen(sci,&new,&mid1,sp,len1,sp->next); + } + } else { + len1 = SCIFindMidPoint(sci,i,sci->pts[i].next,&mid1); + len2 = SCIFindMidPoint(sci,i,sci->pts[sp->prev->from->ptindex].next,&mid2); + if ( len1!=0 && len2!=0 ) { + v1.y = mid1.x-sp->me.x; v1.x = -(mid1.y-sp->me.y); /* This vector should be tangent to the spline */ + v2.y = mid2.x-sp->me.x; v2.x = -(mid2.y-sp->me.y); /* (it's purp to something that's purp to the spline) */ + PositionFromMidLen(sci,&new1,&mid1,sp,len1,sp->next); + PositionFromMidLen(sci,&new2,&mid2,sp,len2,sp->prev); + new = new1; /* This is a fallback for when we get errors */ + if ( v1.x==0 ) { + if ( v2.x==0 ) { + if ( !RealApprox(new1.x,new2.x) || !RealApprox(new1.y,new2.y)) + GDrawIError("Two Parallel horizontal lines" ); + } else + /* Inherit x from new1 */ + new.y = new2.y + v2.y*(new.x-new2.x)/v2.x; + } else if ( v2.x==0 ) { + new.x = new2.x; + new.y = new1.y + v1.y*(new.x-new1.x)/v1.x; + } else if ( v2.y/v2.x == v1.y/v1.x ) { + if ( !RealApprox(new1.x,new2.x) || !RealApprox(new1.y,new2.y)) + GDrawIError("Two Parallel lines" ); + } else { +/* new1.y + v1.y*(X-new1.x)/v1.x = new2.y + v2.y*(X-new2.x)/v2.x */ +/* new1.y-new2.y - v1.y/v1.x*new1.x + v2.y/v2.x*new2.x = (v2.y/v2.x-v1.y/v1.x)*X */ + new.x = (new1.y-new2.y - v1.y/v1.x*new1.x + v2.y/v2.x*new2.x)/(v2.y/v2.x-v1.y/v1.x); + new.y = new1.y+ v1.y/v1.x*(new.x-new1.x); + } + } else if ( len1!=0 ) { + v1.y = mid1.x-sp->me.x; v1.x = -(mid1.y-sp->me.y); /* This vector should be tangent to the spline */ + PositionFromMidLen(sci,&new,&mid1,sp,len1,sp->next); + SplineIntersectWithEdge(sci,sp,sp->prev,&new,&mid1,&v1); + } else if ( len2!=0 ) { + v2.y = mid2.x-sp->me.x; v2.x = -(mid2.y-sp->me.y); /* (it's purp to something that's purp to the spline) */ + PositionFromMidLen(sci,&new,&mid2,sp,len2,sp->prev); + SplineIntersectWithEdge(sci,sp,sp->next,&new,&mid2,&v2); + } else { + new = sp->me; + SCIMapPoint(sci,&new); + } + } + sci->pts[i].newme = new; + } +} + +static void SCIPositionControls(SCI *sci) { + BasePoint scale; + SplinePoint *sp, *nsp; + int i,j; + + for ( i=0; iptcnt; ++i ) { + sp = sci->pts[i].cur; + nsp = sp->next->to; + j = nsp->ptindex; + scale.x = scale.y = 1.0; + if ( sp->me.x!=nsp->me.x ) + scale.x = ( sci->pts[i].newme.x - sci->pts[j].newme.x )/(sp->me.x-nsp->me.x); + if ( sp->me.y!=nsp->me.y ) + scale.y = ( sci->pts[i].newme.y - sci->pts[j].newme.y )/(sp->me.y-nsp->me.y); + sci->pts[i].newnext.x = sci->pts[i].newme.x + scale.x * (sp->nextcp.x-sp->me.x); + sci->pts[i].newnext.y = sci->pts[i].newme.y + scale.y * (sp->nextcp.y-sp->me.y); + sci->pts[j].newprev.x = sci->pts[j].newme.x + scale.x * (nsp->prevcp.x-nsp->me.x); + sci->pts[j].newprev.y = sci->pts[j].newme.y + scale.y * (nsp->prevcp.y-nsp->me.y); + } +} + +static void SCISet(SCI *sci) { + SplinePoint *sp; + int i; + + for ( i=0; iptcnt; ++i ) { + sp = sci->pts[i].cur; + sp->prevcp = sci->pts[i].newprev; + sp->nextcp = sci->pts[i].newnext; + sp->me = sci->pts[i].newme; + } + for ( i=0; iptcnt; ++i ) { + sp = sci->pts[i].cur; + SplineRefigure(sp->next); + } +} + +static void SCIFixupHV(SCI *sci) { + int i; + SplinePoint *sp, *nsp; + +return; /* Debug !!!! */ + for ( i=0; iptcnt; ++i ) { + sp = sci->pts[i].cur; + nsp = sp->next->to; + if ( sp->me.x==nsp->me.x && sci->pts[i].newme.x!=sci->pts[nsp->ptindex].newme.x ) { + fprintf(stderr, "Vertical line no longer vertical (%g,%g) <-> (%g,%g) becomes (%g,%g) <-> (%g,%g)\n", + sp->me.x, sp->me.y, nsp->me.x, nsp->me.y, + sci->pts[i].newme.x, sci->pts[i].newme.y, + sci->pts[nsp->ptindex].newme.x, sci->pts[nsp->ptindex].newme.y ); + sci->pts[i].newme.x = sci->pts[nsp->ptindex].newme.x = + rint((sci->pts[i].newme.x + sci->pts[nsp->ptindex].newme.x)/2); + } + if ( sp->me.y==nsp->me.y && sci->pts[i].newme.y!=sci->pts[nsp->ptindex].newme.y ) { + fprintf(stderr, "Horizontal line no longer horizontal (%g,%g) <-> (%g,%g) becomes (%g,%g) <-> (%g,%g)\n", + sp->me.x, sp->me.y, nsp->me.x, nsp->me.y, + sci->pts[i].newme.x, sci->pts[i].newme.y, + sci->pts[nsp->ptindex].newme.x, sci->pts[nsp->ptindex].newme.y ); + sci->pts[i].newme.y = sci->pts[nsp->ptindex].newme.y = + rint((sci->pts[i].newme.y + sci->pts[nsp->ptindex].newme.y)/2); + } + } +} + +static void MovePointToInter(SCI *sci,int i,int j, real val, int isvert) { + /* Move the new version of point i to the place where the spline between */ + /* it and point j intersects the horizontal/vertical line through val */ + SplinePoint pti, ptj, *midsp; + double ts[3], t; + int k; + Spline *spline; + + memset(&pti,'\0',sizeof(pti)); + memset(&ptj,'\0',sizeof(ptj)); + pti.me = sci->pts[i].newme; + ptj.me = sci->pts[j].newme; + if ( sci->pts[i].cur->prev->from->ptindex==j ) { + pti.nextcp = sci->pts[i].newprev; + ptj.prevcp = sci->pts[j].newnext; + } else { + pti.nextcp = sci->pts[i].newnext; + ptj.prevcp = sci->pts[j].newprev; + } + spline = SplineMake3(&pti,&ptj); + SplineSolveFull(&spline->splines[isvert],val,ts); + t = 2; + for ( k=0; k<3 ; ++k ) if ( ts[k]!=-1 ) + if ( t>ts[k] ) t=ts[k]; + if ( t==2 ) { + SplineFree(spline); +return; + } + midsp = SplineBisect(spline,t); + sci->pts[i].newme = midsp->me; + if ( sci->pts[i].cur->prev->from->ptindex==j ) { + sci->pts[i].newprev = midsp->nextcp; + sci->pts[j].newnext = ptj.prevcp; + } else { + sci->pts[i].newnext = midsp->nextcp; + sci->pts[j].newprev = ptj.prevcp; + } + SplineFree(midsp->prev); SplineFree(midsp->next); + SplinePointFree(midsp); +} + +static void SCICornerFixups(SCI *sci) { + int i,j; + SplinePoint *sp, *nsp; + BasePoint *me, *nme; + real mid, oldmid; +return; + for ( i=0; iptcnt; ++i ) { + sp = sci->pts[i].cur; + nsp = sp->next->to; + me = &sci->pts[i].newme; + nme = &sci->pts[nsp->ptindex].newme; + if ( sp->me.x==nsp->me.x && + ((sp->me.y>nsp->me.y && me->yy) || + (sp->me.yme.y && me->y>nme->y)) ) { + mid = (me->y+nme->y)/2, oldmid = (sp->me.y+nsp->me.y)/2; + j = nsp->ptindex; + MovePointToInter(sci,i,sp->prev->from->ptindex,mid+(sp->me.y-oldmid),1); + MovePointToInter(sci,j,nsp->next->to->ptindex,mid+(nsp->me.y-oldmid),1); + mid = rint((me->x+nme->x)/2); + sci->pts[i].newnext.x += mid-me->x; + sci->pts[i].newprev.x += mid-me->x; + sci->pts[j].newnext.x += mid-nme->x; + sci->pts[j].newprev.x += mid-nme->x; + me->x = nme->x = mid; + } + if ( sp->me.y==nsp->me.y && + ((sp->me.x>nsp->me.x && me->xx) || + (sp->me.xme.x && me->x>nme->x)) ) { + mid = (me->x+nme->x)/2, oldmid = (sp->me.x+nsp->me.x)/2; + MovePointToInter(sci,i,sp->prev->from->ptindex,mid+(sp->me.x-oldmid),0); + MovePointToInter(sci,nsp->ptindex,nsp->next->to->ptindex,mid+(nsp->me.x-oldmid),0); + mid = rint((me->y+nme->y)/2); + sci->pts[i].newnext.y += mid-me->y; + sci->pts[i].newprev.y += mid-me->y; + sci->pts[j].newnext.y += mid-nme->y; + sci->pts[j].newprev.y += mid-nme->y; + me->y = nme->y = mid; + } + } +} + +static void _MetaFont(MetaFontDlg *meta,SplineChar *sc) { + SCI *sci; + DBounds b; + + if ( sc->layers[ly_fore].refs!=NULL ) +return; + + sci = SCIinit(sc,meta); + SCIFindStems(sci); + if ( !SCIReasonableConnections(sci)) { + GDrawIError( "Could not deal with %s, missing stems", sc->name ); + SCIFree(sci); +return; + } + SCIFigureWidths(sci); + SCIBuildMaps(sci,0); /* Horizontal maps */ + SCIBuildMaps(sci,1); /* Vertical maps */ + SCIPositionPts(sci); + SCIFixupHV(sci); + SCIPositionControls(sci); + SCICornerFixups(sci); + SCISet(sci); + if ( !meta->scalewidth ) { + SplineCharFindBounds(sc,&b); + sci->width = sci->rbearing + b.maxx; + } + SCSynchronizeWidth(sc,sci->width,sc->width,meta->fv); + StemInfosFree(sc->hstem); sc->hstem = NULL; + StemInfosFree(sc->vstem); sc->vstem = NULL; + DStemInfosFree(sc->dstem); sc->dstem = NULL; + SCOutOfDateBackground(sc); + SCCharChangedUpdate(sc); + SCIFree(sci); +} + +static int lastdlgtype=0; + +static GTextInfo dlgtypes[] = { + { (unichar_t *) _STR_Simple, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Advanced, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; + +static GTextInfo simplefuncs[] = { + { (unichar_t *) _STR_Embolden, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 1, 0, 0, 1}, + { (unichar_t *) _STR_Thin, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Condense, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Expand, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; + +#define CID_DlgType 1001 +#define CID_SimpleFuncs 1002 +#define CID_AdvancedTabs 1003 +#define CID_StemScale 1004 +#define CID_CounterScale 1005 +#define CID_StemScaleTxt 1006 +#define CID_CounterScaleTxt 1007 +#define CID_StemScalePer 1008 +#define CID_CounterScalePer 1009 +#define CID_XH_From 1010 +#define CID_XH_OldVal 1011 +#define CID_XH_To 1012 +#define CID_XH_Val 1013 + + +static int MT_OK(GGadget *g, GEvent *e) { + int type, func; + MetaFontDlg *meta; + int i, cnt; + real stems, counters, xh=0; + int err; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + meta = GDrawGetUserData(GGadgetGetWindow(g)); + type = GGadgetGetFirstListSelectedItem(GWidgetGetControl(meta->gw,CID_DlgType)); + if ( type==0 ) { + func = GGadgetGetFirstListSelectedItem(GWidgetGetControl(meta->gw,CID_SimpleFuncs)); + err = false; + stems = GetRealR(meta->gw,CID_StemScale, _STR_StemScale,&err)/100; + counters = GetRealR(meta->gw,CID_CounterScale,_STR_CounterScale,&err)/100; + if ( meta->bxh!=-1 ) + xh = GetRealR(meta->gw,CID_XH_Val,_STR_XHeight,&err); + if ( err ) +return( true ); + meta->counters[0].counterchoices = cc_edgefixed; + if ( stems!=1 ) { + meta->stemcnt = 1; + meta->stems = gcalloc(1,sizeof(struct stemcntl)); + meta->stems->small = 0; + meta->stems->wide = (meta->sf->ascent+meta->sf->descent)/4; + meta->stems->factor = stems; + } + meta->counters[0].counter.factor = counters; + if ( func==2 || func==3 ) + meta->lbearing.factor = meta->rbearing.factor = meta->counters[0].counter.factor; + else + meta->lbearing.factor = meta->rbearing.factor = 1; + + meta->counters[1].counterchoices = cc_zones; + meta->counters[1].zonecnt = meta->bcnt; + meta->counters[1].zones = galloc(meta->bcnt*sizeof(struct zonemap)); + for ( i=0; ibcnt; ++i ) + meta->counters[1].zones[i].from = meta->counters[1].zones[i].to = meta->blues[i]; + if ( meta->bxh!=-1 ) + meta->counters[1].zones[meta->bxh].to = xh; + if ( meta->cv!=NULL ) + _MetaFont(meta,meta->cv->sc); + else if ( meta->sc!=NULL ) + _MetaFont(meta,meta->sc); + else { + for ( cnt=i=0; ifv->sf->charcnt; ++i ) + if ( meta->fv->sf->chars[i]!=NULL && meta->fv->selected[i] ) + ++cnt; + GProgressStartIndicatorR(10,_STR_MetamorphosingFont,_STR_MetamorphosingFont,0,cnt,1); + for ( i=0; ifv->sf->charcnt; ++i ) + if ( meta->fv->sf->chars[i]!=NULL && meta->fv->selected[i] ) { + _MetaFont(meta,meta->fv->sf->chars[i]); + if ( !GProgressNext()) + break; + } + GProgressEndIndicator(); + } + } + lastdlgtype = type; + meta->done = true; + } +return( true ); +} + +static int MT_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + MetaFontDlg *meta = GDrawGetUserData(GGadgetGetWindow(g)); + meta->done = true; + } +return( true ); +} + +static void FuncSet(MetaFontDlg *meta) { + int func = GGadgetGetFirstListSelectedItem(GWidgetGetControl(meta->gw,CID_SimpleFuncs)); + real stemval = func==0?170:func==1?70:100; + real counterval = func==0?110:func==1?95:func==2?75:125; + char buffer[10]; + unichar_t ustem[10], ucounter[10]; + + sprintf(buffer,"%g",stemval); + uc_strcpy(ustem,buffer); + sprintf(buffer,"%g",counterval); + uc_strcpy(ucounter,buffer); + GGadgetSetTitle(GWidgetGetControl(meta->gw,CID_StemScale),ustem); + GGadgetSetTitle(GWidgetGetControl(meta->gw,CID_CounterScale),ucounter); +} + +static int MT_FuncChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + MetaFontDlg *meta = GDrawGetUserData(GGadgetGetWindow(g)); + FuncSet(meta); + } +return( true ); +} + +static int MT_AspectChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + } +return( true ); +} + +static void DlgSetup(MetaFontDlg *meta) { + int type = GGadgetGetFirstListSelectedItem(GWidgetGetControl(meta->gw,CID_DlgType)); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_SimpleFuncs),type==0); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_StemScale),type==0); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_StemScaleTxt),type==0); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_StemScalePer),type==0); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_CounterScale),type==0); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_CounterScaleTxt),type==0); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_CounterScalePer),type==0); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_XH_From),type==0 && meta->bxh!=-1); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_XH_OldVal),type==0 && meta->bxh!=-1); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_XH_To),type==0 && meta->bxh!=-1); + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_XH_Val),type==0 && meta->bxh!=-1); + + GGadgetSetVisible(GWidgetGetControl(meta->gw,CID_AdvancedTabs),type==1); +} + +static int GFI_DlgTypeChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + MetaFontDlg *meta = GDrawGetUserData(GGadgetGetWindow(g)); + DlgSetup(meta); + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + MetaFontDlg *meta = GDrawGetUserData(gw); + meta->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("MetaFont.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +void MetaFont(FontView *fv,CharView *cv,SplineChar *sc) { + GRect pos; + GWindowAttrs wattrs; + GTabInfo aspects[8]; + GGadgetCreateData mgcd[18]; + GTextInfo mlabel[18]; + MetaFontDlg meta; + int i; + BlueData bd; + char buffer[20]; + + memset(&meta,'\0',sizeof(meta)); + meta.fv = fv; meta.cv = cv; meta.sc = sc; + if ( cv!=NULL ) + meta.sf = cv->sc->parent; + else + meta.sf = fv->sf; + QuickBlues(meta.sf,&bd); + meta.bcnt = 0; meta.bxh = -1; + if ( bd.descent<0 ) meta.blues[meta.bcnt++] = bd.descent; + meta.blues[meta.bcnt++] = 0; + if ( bd.xheight>0 ) { + meta.bxh = meta.bcnt; + meta.blues[meta.bcnt++] = bd.xheight; + } + if ( bd.ascent>bd.caph ) { + if ( bd.caph!=0 ) meta.blues[meta.bcnt++] = bd.caph; + if ( bd.ascent>bd.caph + bd.caph/50 ) meta.blues[meta.bcnt++] = bd.ascent; + } else { + if ( bd.caph>bd.ascent + bd.ascent/50 ) meta.blues[meta.bcnt++] = bd.ascent; + if ( bd.caph!=0 ) meta.blues[meta.bcnt++] = bd.caph; + } + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1< +#include +#include +#include +#include + +static int mv_antialias = true; +static double mv_scales[] = { 2.0, 1.5, 1.0, 2.0/3.0, .5, 1.0/3.0, .25, .2, 1.0/6.0, .125, .1 }; + +static int MVSetVSb(MetricsView *mv); + +static void MVDrawAnchorPoint(GWindow pixmap,MetricsView *mv,int i,struct aplist *apl) { + SplineFont *sf = mv->fv->sf; + int emsize = sf->ascent+sf->descent; + double scale = mv->pixelsize / (double) emsize; + double scaleas = mv->pixelsize / (double) (mv_scales[mv->scale_index]*emsize); + AnchorPoint *ap = apl->ap; + int x,y; + + if ( mv->bdf!=NULL ) +return; + + y = mv->topend + 2 + scaleas * sf->ascent - mv->perchar[i].yoff - ap->me.y*scale - mv->yoff; + x = mv->perchar[i].dx-mv->xoff+mv->perchar[i].xoff; + if ( mv->perchar[i].selected ) + x += mv->activeoff; + if ( mv->right_to_left ) + x = mv->dwidth - x - mv->perchar[i].dwidth - mv->perchar[i].kernafter; + x += ap->me.x*scale; + DrawAnchorPoint(pixmap,x,y,apl->selected); +} + +static void MVVExpose(MetricsView *mv, GWindow pixmap, GEvent *event) { + /* Expose routine for vertical metrics */ + GRect *clip, r, old2; + int xbase, y, si, i, x, width, height; + int as = rint(mv->pixelsize*mv->fv->sf->ascent/(double) (mv->fv->sf->ascent+mv->fv->sf->descent)); + BDFChar *bdfc; + struct _GImage base; + GImage gi; + GClut clut; + + clip = &event->u.expose.rect; + + xbase = mv->dwidth/2; + if ( mv->showgrid ) + GDrawDrawLine(pixmap,xbase,mv->topend,xbase,mv->displayend,0x808080); + + r.x = clip->x; r.width = clip->width; + r.y = mv->topend; r.height = mv->displayend-mv->topend; + GDrawPushClip(pixmap,&r,&old2); + if ( mv->bdf==NULL && mv->showgrid ) { + y = mv->perchar[0].dy-mv->yoff; + GDrawDrawLine(pixmap,0,y,mv->dwidth,y,0x808080); + } + + si = -1; + for ( i=0; icharcnt; ++i ) { + if ( mv->perchar[i].selected ) si = i; + y = mv->perchar[i].dy-mv->yoff; + if ( mv->bdf==NULL && mv->showgrid ) { + int yp = y+mv->perchar[i].dheight+mv->perchar[i].kernafter; + GDrawDrawLine(pixmap,0, yp,mv->dwidth,yp,0x808080); + } + y += mv->perchar[i].yoff; + bdfc = mv->bdf==NULL ? mv->perchar[i].show : + mv->bdf->chars[mv->perchar[i].sc->enc]; + if ( bdfc==NULL ) + continue; + y += as-bdfc->ymax; + if ( mv->perchar[i].selected ) + y += mv->activeoff; + x = xbase - mv->pixelsize/2 + bdfc->xmin - mv->perchar[i].xoff; + width = bdfc->xmax-bdfc->xmin+1; height = bdfc->ymax-bdfc->ymin+1; + if ( clip->y+clip->height=clip->y && xx+clip->width && x+width >= clip->x ) { + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + memset(&clut,'\0',sizeof(clut)); + gi.u.image = &base; + base.clut = &clut; + if ( !bdfc->byte_data ) { + base.image_type = it_mono; + clut.clut_len = 2; + clut.clut[0] = 0xffffff; + if ( mv->perchar[i].selected ) + clut.clut[1] = 0x808080; + } else { + int scale = 3000/mv->pixelsize, l; + Color fg, bg; + if ( scale>4 ) scale = 4; else if ( scale==3 ) scale= 2; + if ( mv->bdf!=NULL && mv->bdf->clut!=NULL ) + scale = BDFDepth(mv->bdf); + base.image_type = it_index; + clut.clut_len = 1<perchar[i].selected ) ? 0x808080 : 0x000000; + for ( l=0; l<(1<bitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = width; + base.height = height; + GDrawDrawImage(pixmap,&gi,NULL,x,y); + } + } + if ( si!=-1 && mv->bdf==NULL && mv->showgrid ) { + y = mv->perchar[si].dy-mv->yoff; + if ( si!=0 ) + GDrawDrawLine(pixmap,0,y,mv->dwidth,y,0x008000); + y += mv->perchar[si].dheight+mv->perchar[si].kernafter; + GDrawDrawLine(pixmap,0,y,mv->dwidth,y,0x000080); + } + GDrawPopClip(pixmap,&old2); +} + +static void MVExpose(MetricsView *mv, GWindow pixmap, GEvent *event) { + GRect old, *clip, r, old2; + int x,y,ybase, width,height, i; + SplineFont *sf = mv->fv->sf; + BDFChar *bdfc; + struct _GImage base; + GImage gi; + GClut clut; + int si; + int ke = mv->height-mv->sbh-(mv->fh+4); + struct aplist *apl; + double s = sin(-mv->fv->sf->italicangle*3.1415926535897932/180.); + int x_iaoffh = 0, x_iaoffl = 0; + + clip = &event->u.expose.rect; + if ( clip->y+clip->height < mv->topend ) +return; + GDrawPushClip(pixmap,clip,&old); + GDrawSetLineWidth(pixmap,0); + for ( x=mv->mwidth; xwidth; x+=mv->mwidth ) { + GDrawDrawLine(pixmap,x,mv->displayend,x,ke,0x000000); + GDrawDrawLine(pixmap,x+mv->mwidth/2,ke,x+mv->mwidth/2,mv->height-mv->sbh,0x000000); + } + GDrawDrawLine(pixmap,0,mv->topend,mv->width,mv->topend,0x000000); + GDrawDrawLine(pixmap,0,mv->displayend,mv->width,mv->displayend,0x000000); + GDrawDrawLine(pixmap,0,mv->displayend+mv->fh+4,mv->width,mv->displayend+mv->fh+4,0x000000); + GDrawDrawLine(pixmap,0,mv->displayend+2*(mv->fh+4),mv->width,mv->displayend+2*(mv->fh+4),0x000000); + GDrawDrawLine(pixmap,0,mv->displayend+3*(mv->fh+4),mv->width,mv->displayend+3*(mv->fh+4),0x000000); + GDrawDrawLine(pixmap,0,mv->displayend+4*(mv->fh+4),mv->width,mv->displayend+4*(mv->fh+4),0x000000); + GDrawDrawLine(pixmap,0,mv->displayend+5*(mv->fh+4),mv->width,mv->displayend+5*(mv->fh+4),0x000000); + if ( clip->y >= mv->displayend ) { + GDrawPopClip(pixmap,&old); +return; + } + + if ( mv->vertical ) { + MVVExpose(mv,pixmap,event); + GDrawPopClip(pixmap,&old); +return; + } + + ybase = mv->topend + 2 + (mv->pixelsize/mv_scales[mv->scale_index] * sf->ascent / (sf->ascent+sf->descent)) - mv->yoff; + if ( mv->showgrid ) + GDrawDrawLine(pixmap,0,ybase,mv->dwidth,ybase,0x808080); + + r.x = clip->x; r.width = clip->width; + r.y = mv->topend; r.height = mv->displayend-mv->topend; + GDrawPushClip(pixmap,&r,&old2); + if ( mv->bdf==NULL && mv->showgrid ) { + x = mv->perchar[0].dx-mv->xoff; + if ( mv->right_to_left ) + x = mv->dwidth - x - mv->perchar[0].dwidth - mv->perchar[0].kernafter; + GDrawDrawLine(pixmap,x,mv->topend,x,mv->displayend,0x808080); + x_iaoffh = rint((ybase-mv->topend)*s), x_iaoffl = rint((mv->displayend-ybase)*s); + if ( ItalicConstrained && x_iaoffh!=0 ) { + GDrawDrawLine(pixmap,x+x_iaoffh,mv->topend,x-x_iaoffl,mv->displayend,0x909090); + } + } + si = -1; + for ( i=0; icharcnt; ++i ) { + if ( mv->perchar[i].selected ) si = i; + x = mv->perchar[i].dx-mv->xoff; + if ( mv->right_to_left ) + x = mv->dwidth - x - mv->perchar[i].dwidth - mv->perchar[i].kernafter; + if ( mv->bdf==NULL && mv->showgrid ) { + int xp = x+mv->perchar[i].dwidth+mv->perchar[i].kernafter; + GDrawDrawLine(pixmap,xp, mv->topend,xp,mv->displayend,0x808080); + if ( ItalicConstrained && x_iaoffh!=0 ) { + GDrawDrawLine(pixmap,xp+x_iaoffh,mv->topend,xp-x_iaoffl,mv->displayend,0x909090); + } + } + if ( mv->right_to_left ) + x += mv->perchar[i].kernafter-mv->perchar[i].xoff; + else + x += mv->perchar[i].xoff; + bdfc = mv->bdf==NULL ? mv->perchar[i].show : + mv->bdf->chars[mv->perchar[i].sc->enc]; + if ( bdfc==NULL ) + continue; + x += bdfc->xmin; + if ( mv->perchar[i].selected ) + x += mv->activeoff; + y = ybase - bdfc->ymax - mv->perchar[i].yoff; + width = bdfc->xmax-bdfc->xmin+1; height = bdfc->ymax-bdfc->ymin+1; + if ( !mv->right_to_left && clip->x+clip->width=clip->x && yy+clip->height && y+height >= clip->y ) { + memset(&gi,'\0',sizeof(gi)); + memset(&base,'\0',sizeof(base)); + memset(&clut,'\0',sizeof(clut)); + gi.u.image = &base; + base.clut = &clut; + if ( !bdfc->byte_data ) { + base.image_type = it_mono; + clut.clut_len = 2; + clut.clut[0] = 0xffffff; + if ( mv->perchar[i].selected ) + clut.clut[1] = 0x808080; + } else { + int lscale = 3000/mv->pixelsize, l; + Color fg, bg; + int scale; + if ( lscale>4 ) lscale = 4; else if ( lscale==3 ) lscale= 2; + if ( mv->bdf!=NULL && mv->bdf->clut!=NULL ) + lscale = BDFDepth(mv->bdf); + base.image_type = it_index; + scale = lscale*lscale; + clut.clut_len = scale; + bg = GDrawGetDefaultBackground(NULL); + fg = ( mv->perchar[i].selected ) ? 0x808080 : 0x000000; + for ( l=0; lbitmap; + base.bytes_per_line = bdfc->bytes_per_line; + base.width = width; + base.height = height; + GDrawDrawImage(pixmap,&gi,NULL,x,y); + } + if ( mv->perchar[i].selected ) + for ( apl=mv->perchar[i].aps; apl!=NULL; apl=apl->next ) + MVDrawAnchorPoint(pixmap,mv,i,apl); + } + if ( si!=-1 && mv->bdf==NULL && mv->showgrid ) { + x = mv->perchar[si].dx-mv->xoff; + if ( mv->right_to_left ) + x = mv->dwidth - x; + if ( si!=0 ) + GDrawDrawLine(pixmap,x,mv->topend,x,mv->displayend,0x008000); + if ( mv->right_to_left ) + x -= mv->perchar[si].dwidth+mv->perchar[si].kernafter; + else + x += mv->perchar[si].dwidth+mv->perchar[si].kernafter; + GDrawDrawLine(pixmap,x, mv->topend,x,mv->displayend,0x000080); + } + GDrawPopClip(pixmap,&old2); + GDrawPopClip(pixmap,&old); +} + +static void MVRedrawI(MetricsView *mv,int i,int oldxmin,int oldxmax) { + GRect r; + BDFChar *bdfc; + int off = 0; + + if ( mv->right_to_left || mv->vertical ) { + /* right to left clipping is hard to think about, it doesn't happen */ + /* often enough (I think) for me to put the effort to make it efficient */ + GDrawRequestExpose(mv->gw,NULL,false); +return; + } + if ( mv->perchar[i].selected ) + off = mv->activeoff; + r.y = mv->topend; r.height = mv->displayend-mv->topend; + r.x = mv->perchar[i].dx-mv->xoff; r.width = mv->perchar[i].dwidth; + if ( mv->perchar[i].kernafter>0 ) + r.width += mv->perchar[i].kernafter; + if ( mv->perchar[i].hoff>0 ) + r.width += mv->perchar[i].hoff; + if ( mv->perchar[i].xoff<0 ) { + r.x += mv->perchar[i].xoff; + r.width -= mv->perchar[i].xoff; + } else + r.width += mv->perchar[i].xoff; + bdfc = mv->bdf==NULL ? mv->perchar[i].show : + mv->bdf->chars[mv->perchar[i].sc->enc]; + if ( bdfc==NULL ) +return; + if ( bdfc->xmax+off+1>r.width ) r.width = bdfc->xmax+off+1; + if ( oldxmax+1>r.width ) r.width = oldxmax+1; + if ( bdfc->xmin+off<0 ) { + r.x += bdfc->xmin+off; + r.width -= bdfc->xmin+off; + } + if ( oldxminxmin ) { + r.width += (bdfc->xmin+off-oldxmin); + r.x -= (bdfc->xmin+off-oldxmin); + } + if ( mv->right_to_left ) + r.x = mv->dwidth - r.x - r.width; + GDrawRequestExpose(mv->gw,&r,false); + if ( mv->perchar[i].selected && i!=0 ) { + KernPair *kp; KernClass *kc; int index; + for ( kp=mv->vertical ? mv->perchar[i-1].sc->vkerns: mv->perchar[i-1].sc->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc == mv->perchar[i].sc ) + break; + if ( kp!=NULL ) { + mv->cur_sli = kp->sli; + if ( mv->sli_list!=NULL ) + GGadgetSelectOneListItem(mv->sli_list,kp->sli); + } else if (( !mv->vertical && + (kc=SFFindKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false))!=NULL ) || + ( mv->vertical && + (kc=SFFindVKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false))!=NULL )) { + mv->cur_sli = kc->sli; + if ( mv->sli_list!=NULL ) + GGadgetSelectOneListItem(mv->sli_list,kc->sli); + } + } +} + +static void MVDeselectChar(MetricsView *mv, int i) { + + mv->perchar[i].selected = false; + if ( mv->perchar[i].name!=NULL ) + GGadgetSetEnabled(mv->perchar[i].name,mv->bdf==NULL); + MVRedrawI(mv,i,0,0); +#if 0 + if ( mv->bdf==NULL && mv->showgrid ) { + x = mv->perchar[i].dx; + if ( mv->right_to_left ) + x = mv->dwidth - x - mv->perchar[i].dwidth - mv->perchar[i].kernafter; + GDrawDrawLine(mv->gw,x,mv->topend,x,mv->displayend,0x808080); + x += mv->perchar[i].dwidth+mv->perchar[i].kernafter; + GDrawDrawLine(mv->gw,x,mv->topend,x,mv->displayend,0x808080); + } +#endif +} + +static void MVSelectChar(MetricsView *mv, int i) { + + mv->perchar[i].selected = true; + if ( mv->perchar[i].name!=NULL ) + GGadgetSetEnabled(mv->perchar[i].name,false); + if ( mv->sli_list!=NULL && SCScriptFromUnicode(mv->perchar[i].sc)!=DEFAULT_SCRIPT ) { + int sli_cnt = SLICount(mv->fv->sf); + int sli = SCDefaultSLI(mv->fv->sf,mv->perchar[i].sc); + mv->cur_sli = sli; + if ( SLICount(mv->fv->sf)!=sli_cnt ) + GGadgetSetList(mv->sli_list,SFLangArray(mv->fv->sf,true),false); + GGadgetSelectOneListItem(mv->sli_list,sli); + } + MVRedrawI(mv,i,0,0); +#if 0 + if ( mv->bdf==NULL && mv->showgrid ) { + x = mv->perchar[i].dx; + if ( x==0 ) /* Not set properly yet */ +return; + if ( mv->right_to_left ) + x = mv->dwidth - x; + if ( i!=0 ) + GDrawDrawLine(mv->gw,x,mv->topend,x,mv->displayend,0x008000); + if ( mv->right_to_left ) + x -= mv->perchar[i].dwidth+mv->perchar[i].kernafter; + else + x += mv->perchar[i].dwidth+mv->perchar[i].kernafter; + GDrawDrawLine(mv->gw,x,mv->topend,x,mv->displayend,0x000080); + } +#endif +} + +static void MVDoSelect(MetricsView *mv, int i) { + int j; + + for ( j=0; jcharcnt; ++j ) + if ( j!=i && mv->perchar[j].selected ) + MVDeselectChar(mv,j); + MVSelectChar(mv,i); +} + +void MVRefreshChar(MetricsView *mv, SplineChar *sc) { + int i; + for ( i=0; icharcnt; ++i ) if ( mv->perchar[i].sc == sc ) + MVRedrawI(mv,i,0,0); +} + +static void MVRefreshKern(MetricsView *mv, int i) { + /* We need to look through the kern pairs at sc[i-1] to see if the is a */ + /* match for sc[i] */ + KernPair *kp; + KernClass *kc=NULL; + int index, sli, off; + unichar_t ubuf[40]; + char buf[40]; + + if ( mv->perchar[i].kern==NULL ) /* Happens during init, we'll do it later */ +return; + for ( kp=mv->vertical ? mv->perchar[i-1].sc->vkerns:mv->perchar[i-1].sc->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc == mv->perchar[i].sc ) + break; + sli = -1; off = 0; + if ( kp!=NULL && kp->off != 0 ) { + off = kp->off; + sli = kp->sli; + } else if (( !mv->vertical && + (kc=SFFindKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false))!=NULL ) || + ( mv->vertical && + (kc=SFFindVKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false))!=NULL )) { + off = kc->offsets[index]; + sli = kc->sli; + } else if ( kp!=NULL ) + sli = kp->sli; + if ( off==0 ) + buf[0] = '\0'; + else + sprintf(buf,"%d",off); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(mv->perchar[i].kern,ubuf); + mv->perchar[i-1].kernafter = off * mv->pixelsize/ + (mv->fv->sf->ascent+mv->fv->sf->descent); + if ( sli!=-1 ) { + mv->cur_sli = sli; + GGadgetSelectOneListItem(mv->sli_list,sli); + } +} + +static void aplistfree(struct aplist *l) { + struct aplist *next; + + for ( ; l!=NULL; l=next ) { + next = l->next; + chunkfree(l,sizeof(*l)); + } +} + +static struct aplist *aplistcreate(struct aplist *n,AnchorPoint *ap, int connect) { + struct aplist *l = chunkalloc(sizeof(*n)); + + l->next = n; + l->ap = ap; + l->connected_to = connect; +return( l ); +} + +static int MVSetAnchor(MetricsView *mv) { + int i, j, changed=false; + AnchorPos *apos, *test; + int base, newx, newy; + int emsize = mv->fv->sf->ascent+mv->fv->sf->descent; + + for ( i=0; icharcnt; ++i ) { + mv->sstr[i] = mv->perchar[i].sc; + aplistfree(mv->perchar[i].aps); + mv->perchar[i].aps = NULL; + if ( mv->perchar[i].xoff!=0 || mv->perchar[i].yoff!=0 || + mv->perchar[i].hoff!=0 || mv->perchar[i].voff!=0 ) { + mv->perchar[i].xoff = mv->perchar[i].yoff = 0; + mv->perchar[i].hoff = mv->perchar[i].voff = 0; + changed = true; + } + } + if ( !mv->vertical ) { + mv->sstr[i] = NULL; + for ( i=0; icharcnt; ++i ) { + apos = AnchorPositioning(mv->sstr[i],NULL,mv->sstr+i+1); + base = i; + if ( apos!=NULL ) { + for ( test=apos; test->sc!=NULL ; ++test ) { + ++i; + j = base+1+apos->base_index; + newx = mv->perchar[j].xoff - (mv->perchar[i].dx-mv->perchar[j].dx) + + test->x * mv->pixelsize / emsize; + if ( mv->right_to_left ) + newx = -mv->perchar[j].sc->width * mv->pixelsize/emsize - newx; + newy = mv->perchar[j].yoff + test->y * mv->pixelsize / emsize; + if ( mv->perchar[i].xoff != newx || mv->perchar[i].yoff != newy ) { + mv->perchar[i].xoff = newx; mv->perchar[i].yoff = newy; + changed = true; + } + mv->perchar[i].aps = aplistcreate(mv->perchar[i].aps,test->apm,j); + mv->perchar[j].aps = aplistcreate(mv->perchar[j].aps,test->apb,i); + } + if ( icharcnt ) { + if ( mv->perchar[i+1].xoff!=0 || mv->perchar[i+1].yoff!=0 ) { + mv->perchar[i+1].xoff = mv->perchar[i+1].yoff = 0; + changed = true; + } + } + + if ( test[-1].apm->type==at_centry ) + --i; + AnchorPosFree(apos); + } + } + } + + for ( i=0; imax; ++i ) if ( mv->perchar[i].width!=NULL ) { + if ( mv->perchar[i].active_pos!=NULL ) { + mv->perchar[i].xoff += mv->perchar[i].active_pos->u.pos.xoff*mv->pixelsize/ emsize; + mv->perchar[i].yoff += mv->perchar[i].active_pos->u.pos.yoff*mv->pixelsize/ emsize; + mv->perchar[i].hoff += mv->perchar[i].active_pos->u.pos.h_adv_off*mv->pixelsize/ emsize; + mv->perchar[i].voff += mv->perchar[i].active_pos->u.pos.v_adv_off*mv->pixelsize/ emsize; + } + } +return( changed ); +} + +static void MVRefreshValues(MetricsView *mv, int i, SplineChar *sc) { + unichar_t ubuf[40]; + char buf[40]; + DBounds bb; + + SplineCharFindBounds(sc,&bb); + + uc_strcpy(ubuf,sc->name); + GGadgetSetTitle(mv->perchar[i].name,ubuf); + + sprintf(buf,"%d",mv->vertical ? sc->vwidth : sc->width); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(mv->perchar[i].width,ubuf); + + sprintf(buf,"%.2f",mv->vertical ? sc->parent->ascent-bb.maxy : bb.minx); + if ( buf[strlen(buf)-1]=='0' ) { + buf[strlen(buf)-1] = '\0'; + if ( buf[strlen(buf)-1]=='0' ) { + buf[strlen(buf)-1] = '\0'; + if ( buf[strlen(buf)-1]=='.' ) + buf[strlen(buf)-1] = '\0'; + } + } + uc_strcpy(ubuf,buf); + GGadgetSetTitle(mv->perchar[i].lbearing,ubuf); + + sprintf(buf,"%.2f",mv->vertical ? sc->vwidth-(sc->parent->ascent-bb.miny) : sc->width-bb.maxx); + if ( buf[strlen(buf)-1]=='0' ) { + buf[strlen(buf)-1] = '\0'; + if ( buf[strlen(buf)-1]=='0' ) { + buf[strlen(buf)-1] = '\0'; + if ( buf[strlen(buf)-1]=='.' ) + buf[strlen(buf)-1] = '\0'; + } + } + uc_strcpy(ubuf,buf); + GGadgetSetTitle(mv->perchar[i].rbearing,ubuf); + + if ( i!=0 ) + MVRefreshKern(mv,i); + if ( i!=mv->charcnt-1 ) + MVRefreshKern(mv,i+1); + else + mv->perchar[i].kernafter = 0; +} + +void MVReKern(MetricsView *mv) { + int i; + for ( i=1; icharcnt; ++i ) + MVRefreshKern(mv,i); + mv->perchar[mv->charcnt-1].kernafter = 0; + for ( i=1; icharcnt; ++i ) + mv->perchar[i].dx = mv->perchar[i-1].dx+mv->perchar[i-1].dwidth+ + mv->perchar[i-1].kernafter; + MVSetAnchor(mv); + GDrawRequestExpose(mv->gw,NULL,false); +} + +static BDFChar *MVRasterize(MetricsView *mv,SplineChar *sc) { + BDFChar *bdfc; + + if ( mv->antialias && mv->pixelsize<1000 ) { + int scale = 3000/mv->pixelsize; + if ( scale>4 ) scale=4; + if ( scale==3 ) scale = 2; + bdfc = SplineCharAntiAlias(sc,mv->pixelsize,scale); + } else + bdfc = SplineCharRasterize(sc,mv->pixelsize); +return( bdfc ); +} + +static void MVReRasterize(MetricsView *mv) { + int i; + double scale = mv->pixelsize/(double) (mv->fv->sf->ascent+mv->fv->sf->descent); + + if ( mv->bdf==NULL ) { + for ( i=0; icharcnt; ++i ) { + BDFChar *bc = MVRasterize(mv,mv->perchar[i].sc); + BDFCharFree(mv->perchar[i].show); + mv->perchar[i].show = bc; + mv->perchar[i].dwidth = bc->width; + if ( mv->vertical ) + mv->perchar[i].dheight = rint(bc->sc->vwidth*scale); + if ( i+1charcnt ) { + mv->perchar[i+1].dx = mv->perchar[i].dx + bc->width + mv->perchar[i].kernafter; + if ( mv->vertical ) + mv->perchar[i+1].dy = mv->perchar[i].dy + mv->perchar[i].dheight + + mv->perchar[i].kernafter; + } + } + } +} + +void MVRegenChar(MetricsView *mv, SplineChar *sc) { + int i; + BDFChar *bdfc; + int xoff = 0, yoff=0, vwidth; + int oldxmax,oldxmin; + + for ( i=0; icharcnt; ++i ) { + mv->perchar[i].dx += xoff; + if ( mv->perchar[i].sc == sc ) { + if ( mv->bdf==NULL ) { + bdfc = MVRasterize(mv,sc); + oldxmax = mv->perchar[i].show->xmax; + oldxmin = mv->perchar[i].show->xmin; + BDFCharFree(mv->perchar[i].show); + mv->perchar[i].show = bdfc; + xoff += (bdfc->width-mv->perchar[i].dwidth); + mv->perchar[i].dwidth = bdfc->width; + if ( !mv->vertical ) { + if ( xoff==0 ) + MVRedrawI(mv,i,oldxmin,oldxmax); + } else { + vwidth = rint( sc->vwidth * mv->pixelsize/(double) (sc->parent->ascent+sc->parent->descent)); + yoff += vwidth - mv->perchar[i].dheight; + mv->perchar[i].dheight = vwidth; + } + } + MVRefreshValues(mv,i,sc); + } + } + if ( MVSetAnchor(mv) || xoff!=0 || mv->vertical ) + GDrawRequestExpose(mv->gw,NULL,false); +} + +static void MVChangeDisplayFont(MetricsView *mv, BDFFont *bdf) { + int i; + BDFChar *bc; + double scale = mv->pixelsize/(double) (mv->fv->sf->ascent+mv->fv->sf->descent); + + if ( mv->bdf==bdf ) +return; + if ( (mv->bdf==NULL) != (bdf==NULL) ) { + for ( i=0; imax; ++i ) if ( mv->perchar[i].width!=NULL ) { + GGadgetSetEnabled(mv->perchar[i].width,bdf==NULL); + GGadgetSetEnabled(mv->perchar[i].lbearing,bdf==NULL); + GGadgetSetEnabled(mv->perchar[i].rbearing,bdf==NULL); + if ( i!=0 ) + GGadgetSetEnabled(mv->perchar[i].kern,bdf==NULL); + } + } + if ( mv->bdf==NULL ) { + for ( i=0; icharcnt; ++i ) { + BDFCharFree(mv->perchar[i].show); + mv->perchar[i].show = NULL; + } + } else if ( bdf==NULL ) { + for ( i=0; icharcnt; ++i ) { + mv->perchar[i].show = MVRasterize(mv,mv->perchar[i].sc); + } + } + mv->bdf = bdf; + for ( i=0; icharcnt; ++i ) { + bc = bdf==NULL?mv->perchar[i].show:bdf->chars[mv->perchar[i].sc->enc]; + mv->perchar[i].dwidth = bc->width; + if ( i+1charcnt ) + mv->perchar[i+1].dx = mv->perchar[i].dx+bc->width+mv->perchar[i].kernafter; + if ( mv->vertical ) { + mv->perchar[i].dheight = rint(bc->sc->vwidth*scale); + if ( i+1charcnt ) + mv->perchar[i+1].dy = mv->perchar[i].dy+mv->perchar[i].dheight+ + mv->perchar[i].kernafter; + } + } +} + +static void setlabel(GGadget *lab, char *text) { + unichar_t ubuf[30]; + + uc_strncpy(ubuf,text,sizeof(ubuf)/sizeof(ubuf[0])); + GGadgetSetTitle(lab,ubuf); +} + +static int MV_WidthChanged(GGadget *g, GEvent *e) { + MetricsView *mv = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (int) GGadgetGetUserData(g); + int i; + + if ( e->type!=et_controlevent ) +return( true ); + if ( e->u.control.subtype == et_textchanged ) { + unichar_t *end; + int val = u_strtol(_GGadgetGetTitle(g),&end,10); + SplineChar *sc = mv->perchar[which].sc; + if ( *end && !(*end=='-' && end[1]=='\0')) + GDrawBeep(NULL); + else if ( !mv->vertical && val!=sc->width ) { + SCPreserveWidth(sc); + sc->width = val; + SCCharChangedUpdate(sc); + } else if ( mv->vertical && val!=sc->vwidth ) { + SCPreserveVWidth(sc); + sc->vwidth = val; + SCCharChangedUpdate(sc); + } + } else if ( e->u.control.subtype == et_textfocuschanged && + e->u.control.u.tf_focus.gained_focus ) { + for ( i=0 ; icharcnt; ++i ) + if ( i!=which && mv->perchar[i].selected ) + MVDeselectChar(mv,i); + MVSelectChar(mv,which); + } +return( true ); +} + +static int MV_LBearingChanged(GGadget *g, GEvent *e) { + MetricsView *mv = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (int) GGadgetGetUserData(g); + int i; + + if ( e->type!=et_controlevent ) +return( true ); + if ( e->u.control.subtype == et_textchanged ) { + unichar_t *end; + int val = u_strtol(_GGadgetGetTitle(g),&end,10); + SplineChar *sc = mv->perchar[which].sc; + DBounds bb; + SplineCharFindBounds(sc,&bb); + if ( *end && !(*end=='-' && end[1]=='\0')) + GDrawBeep(NULL); + else if ( !mv->vertical && val!=bb.minx ) { + real transform[6]; + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0; + transform[4] = val-bb.minx; + FVTrans(mv->fv,sc,transform,NULL,false); + } else if ( mv->vertical && val!=sc->parent->ascent-bb.maxy ) { + real transform[6]; + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[4] = 0; + transform[5] = sc->parent->ascent-bb.maxy-val; + FVTrans(mv->fv,sc,transform,NULL,false); + } + } else if ( e->u.control.subtype == et_textfocuschanged && + e->u.control.u.tf_focus.gained_focus ) { + for ( i=0 ; icharcnt; ++i ) + if ( i!=which && mv->perchar[i].selected ) + MVDeselectChar(mv,i); + MVSelectChar(mv,which); + } +return( true ); +} + +static int MV_RBearingChanged(GGadget *g, GEvent *e) { + MetricsView *mv = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (int) GGadgetGetUserData(g); + int i; + + if ( e->type!=et_controlevent ) +return( true ); + if ( e->u.control.subtype == et_textchanged ) { + unichar_t *end; + int val = u_strtol(_GGadgetGetTitle(g),&end,10); + SplineChar *sc = mv->perchar[which].sc; + DBounds bb; + SplineCharFindBounds(sc,&bb); + if ( *end && !(*end=='-' && end[1]=='\0')) + GDrawBeep(NULL); + else if ( !mv->vertical && val!=sc->width-bb.maxx ) { + SCPreserveWidth(sc); + sc->width = rint(bb.maxx+val); + /* Width is an integer. Adjust the lbearing so that the rbearing */ + /* remains what was just typed in */ + if ( sc->width!=bb.maxx+val ) { + real transform[6]; + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0; + transform[4] = sc->width-val-bb.maxx; + FVTrans(mv->fv,sc,transform,NULL,false); + } + SCCharChangedUpdate(sc); + } else if ( mv->vertical && val!=sc->vwidth-(sc->parent->ascent-bb.miny) ) { + double vw = val+(sc->parent->ascent-bb.miny); + SCPreserveWidth(sc); + sc->vwidth = rint(vw); + /* Width is an integer. Adjust the lbearing so that the rbearing */ + /* remains what was just typed in */ + if ( sc->width!=vw ) { + real transform[6]; + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[4] = 0; + transform[5] = vw-sc->vwidth; + FVTrans(mv->fv,sc,transform,NULL,false); + } + SCCharChangedUpdate(sc); + } + } else if ( e->u.control.subtype == et_textfocuschanged && + e->u.control.u.tf_focus.gained_focus ) { + for ( i=0 ; icharcnt; ++i ) + if ( i!=which && mv->perchar[i].selected ) + MVDeselectChar(mv,i); + MVSelectChar(mv,which); + } +return( true ); +} + +static int AskNewKernClassEntry(SplineChar *fsc,SplineChar *lsc) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; +return( GWidgetAskR(_STR_NewKernClassEntTitle,buts,0,1,_STR_NewKernClassEntry, + fsc->name,lsc->name)==0 ); +} + +static int MV_KernChanged(GGadget *g, GEvent *e) { + MetricsView *mv = GDrawGetUserData(GGadgetGetWindow(g)); + int which = (int) GGadgetGetUserData(g); + int i; + + if ( e->type!=et_controlevent ) +return( true ); + if ( e->u.control.subtype == et_textchanged ) { + unichar_t *end; + int val = u_strtol(_GGadgetGetTitle(g),&end,10); + SplineChar *sc = mv->perchar[which].sc; + SplineChar *psc = mv->perchar[which-1].sc; + static unichar_t zerostr[] = { /*'0',*/ '\0' }; + KernPair *kp; + KernClass *kc; int index; + if ( *end && !(*end=='-' && end[1]=='\0')) + GDrawBeep(NULL); + else { + kc = NULL; + for ( kp = mv->vertical ? psc->vkerns : psc->kerns; kp!=NULL && kp->sc!=sc; kp = kp->next ); + if ( kp==NULL ) + kc= !mv->vertical + ? SFFindKernClass(mv->fv->sf,psc,sc,&index,true) + : SFFindVKernClass(mv->fv->sf,psc,sc,&index,true); + if ( kc!=NULL ) { + if ( kc->offsets[index]==0 && !AskNewKernClassEntry(psc,sc)) + kc=NULL; + else + kc->offsets[index] = val; + } + if ( kc==NULL ) { + if ( !mv->vertical ) + MMKern(sc->parent,psc,sc,kp==NULL?val:val-kp->off, + mv->cur_sli,kp); + if ( kp==NULL ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = sc; + if ( !mv->vertical ) { + kp->next = psc->kerns; + psc->kerns = kp; + } else { + kp->next = psc->vkerns; + psc->vkerns = kp; + } + } + kp->off = val; + kp->sli = mv->cur_sli; + } + mv->perchar[which-1].kernafter = (val*mv->pixelsize)/ + (mv->fv->sf->ascent+mv->fv->sf->descent); + for ( i=which; icharcnt; ++i ) { + mv->perchar[i].dx = mv->perchar[i-1].dx + mv->perchar[i-1].dwidth + mv->perchar[i-1].kernafter; + if ( mv->vertical ) + mv->perchar[i].dy = mv->perchar[i-1].dy + mv->perchar[i-1].dheight + mv->perchar[i-1].kernafter; + } + mv->fv->sf->changed = true; + /* I don't bother remove kernpairs that go to zero here, there's */ + /* little point, it's just easier not to save them out */ + if ( *_GGadgetGetTitle(g)=='\0' ) + GGadgetSetTitle(g,zerostr); + GDrawRequestExpose(mv->gw,NULL,false); + } + } else if ( e->u.control.subtype == et_textfocuschanged && + e->u.control.u.tf_focus.gained_focus ) { + for ( i=0 ; icharcnt; ++i ) + if ( i!=which && mv->perchar[i].selected ) + MVDeselectChar(mv,i); + MVSelectChar(mv,which); + } +return( true ); +} + +static void MVMakeLabels(MetricsView *mv) { + static GBox small = { 0 }; + GGadgetData gd; + GTextInfo label; + + small.main_background = small.main_foreground = COLOR_DEFAULT; + memset(&gd,'\0',sizeof(gd)); + memset(&label,'\0',sizeof(label)); + + mv->mwidth = 60; + mv->displayend = mv->height- mv->sbh - 5*(mv->fh+4); + mv->pixelsize = mv_scales[mv->scale_index]*(mv->displayend - mv->topend - 4); + + label.text = (unichar_t *) "Name:"; + label.text_is_1byte = true; + label.font = mv->font; + gd.pos.x = 2; gd.pos.width = mv->mwidth-4; + gd.pos.y = mv->displayend+2; + gd.pos.height = mv->fh; + gd.label = &label; + gd.box = &small; + gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels | gg_dontcopybox; + mv->namelab = GLabelCreate(mv->gw,&gd,NULL); + + label.text = (unichar_t *) (mv->vertical ? "Height:" : "Width:"); + gd.pos.y += mv->fh+4; + mv->widthlab = GLabelCreate(mv->gw,&gd,NULL); + + label.text = (unichar_t *) (mv->vertical ? "TBearing:" : "LBearing:"); + gd.pos.y += mv->fh+4; + mv->lbearinglab = GLabelCreate(mv->gw,&gd,NULL); + + label.text = (unichar_t *) (mv->vertical ? "BBearing:" : "RBearing:"); + gd.pos.y += mv->fh+4; + mv->rbearinglab = GLabelCreate(mv->gw,&gd,NULL); + + label.text = (unichar_t *) (mv->vertical ? "VKern:" : "Kern:"); + gd.pos.y += mv->fh+4; + mv->kernlab = GLabelCreate(mv->gw,&gd,NULL); +} + +static void MVCreateFields(MetricsView *mv,int i) { + static GBox small = { 0 }; + GGadgetData gd; + GTextInfo label; + static unichar_t nullstr[1] = { 0 }; + int j; + + small.main_background = small.main_foreground = COLOR_DEFAULT; + small.disabled_foreground = 0x808080; + small.disabled_background = COLOR_DEFAULT; + + memset(&gd,'\0',sizeof(gd)); + memset(&label,'\0',sizeof(label)); + label.text = nullstr; + label.font = mv->font; + mv->perchar[i].mx = gd.pos.x = mv->mbase+(i+1-mv->coff)*mv->mwidth+2; + mv->perchar[i].mwidth = gd.pos.width = mv->mwidth-4; + gd.pos.y = mv->displayend+2; + gd.pos.height = mv->fh; + gd.label = &label; + gd.box = &small; + gd.flags = gg_visible | gg_pos_in_pixels | gg_dontcopybox; + if ( mv->bdf==NULL ) + gd.flags |= gg_enabled; + mv->perchar[i].name = GLabelCreate(mv->gw,&gd,(void *) i); + if ( mv->perchar[i].selected ) + GGadgetSetEnabled(mv->perchar[i].name,false); + + gd.pos.y += mv->fh+4; + gd.handle_controlevent = MV_WidthChanged; + mv->perchar[i].width = GTextFieldCreate(mv->gw,&gd,(void *) i); + + gd.pos.y += mv->fh+4; + gd.handle_controlevent = MV_LBearingChanged; + mv->perchar[i].lbearing = GTextFieldCreate(mv->gw,&gd,(void *) i); + + gd.pos.y += mv->fh+4; + gd.handle_controlevent = MV_RBearingChanged; + mv->perchar[i].rbearing = GTextFieldCreate(mv->gw,&gd,(void *) i); + + if ( i!=0 ) { + gd.pos.y += mv->fh+4; + gd.pos.x -= mv->mwidth/2; + gd.handle_controlevent = MV_KernChanged; + mv->perchar[i].kern = GTextFieldCreate(mv->gw,&gd,(void *) i); + + if ( i>=mv->charcnt ) { + for ( j=mv->charcnt+1; j<=i ; ++ j ) + mv->perchar[j].dx = mv->perchar[j-1].dx; + mv->charcnt = i+1; + } + } + + GWidgetIndicateFocusGadget(mv->text); +} + +static void MVSetPos(MetricsView *mv,int i,SplineChar *sc) { + BDFChar *bdfc; + int j; + + if ( i>=mv->max ) { + int oldmax=mv->max; + mv->max = i+10; + mv->perchar = grealloc(mv->perchar,mv->max*sizeof(struct metricchar)); + mv->sstr = grealloc(mv->sstr,(mv->max+1)*sizeof(SplineChar *)); + memset(mv->perchar+oldmax,'\0',(mv->max-oldmax)*sizeof(struct metricchar)); + } + mv->perchar[i].sc = sc; + mv->perchar[i].basesc = NULL; + mv->perchar[i].active_pos = NULL; + if ( mv->bdf==NULL ) { + bdfc = MVRasterize(mv,sc); + BDFCharFree(mv->perchar[i].show); + mv->perchar[i].show = bdfc; + } else + bdfc = mv->bdf->chars[mv->perchar[i].sc->enc]; + mv->perchar[i].dwidth = bdfc->width; + if ( mv->vertical ) + mv->perchar[i].dheight = rint(bdfc->sc->vwidth*mv->pixelsize/(double) (mv->fv->sf->ascent+mv->fv->sf->descent)); + if ( mv->perchar[i].width==NULL ) { + mv->perchar[i].dx = 0; /* Flag => Don't draw when focus changes (focus changes as we create text fields) */ + MVCreateFields(mv,i); + } + if ( i>=mv->charcnt ) mv->charcnt = i+1; + MVRefreshValues(mv,i,sc); + if ( i==0 ) { + mv->perchar[i].dx = 10; + mv->perchar[i].dy = mv->topend + 10; + j=i+1; + } else { + mv->perchar[i].dx = mv->perchar[i-1].dx + mv->perchar[i-1].dwidth + mv->perchar[i-1].kernafter; + j = i; + } + for ( ; jcharcnt; ++j ) + mv->perchar[j].dx = mv->perchar[j-1].dx + mv->perchar[j-1].dwidth + mv->perchar[j-1].kernafter; + if ( mv->vertical ) { + if ( i==0 ) { + mv->perchar[i].dy = mv->topend + 10; + j=i+1; + } else { + mv->perchar[i].dy = mv->perchar[i-1].dy + mv->perchar[i-1].dheight + mv->perchar[i-1].kernafter; + j = i; + } + for ( ; jcharcnt; ++j ) + mv->perchar[j].dy = mv->perchar[j-1].dy + mv->perchar[j-1].dheight + mv->perchar[j-1].kernafter; + } + MVSetVSb(mv); +} + +static void MVToggleVertical(MetricsView *mv) { + int size,i; + + mv->vertical = !mv->vertical; + + setlabel( mv->widthlab, mv->vertical ? "Height:" : "Width:" ); + setlabel( mv->lbearinglab, mv->vertical ? "TBearing:" : "LBearing:" ); + setlabel( mv->rbearinglab, mv->vertical ? "BBearing:" : "RBearing:" ); + setlabel( mv->kernlab, mv->vertical ? "VKern:" : "Kern:" ); + + if ( mv->vertical ) + if ( mv->scale_index<4 ) mv->scale_index = 4; + + size = (mv->displayend - mv->topend - 4); + if ( mv->dwidth-20dwidth-20; + size *= mv_scales[mv->scale_index]; + if ( mv->pixelsize != size ) { + mv->pixelsize = size; + MVReRasterize(mv); + } + for ( i=0; icharcnt; ++i ) { + MVSetPos(mv,i,mv->perchar[i].sc); + MVRefreshValues(mv,i,mv->perchar[i].sc); + } + MVReKern(mv); + MVSetAnchor(mv); +} + +static SplineChar *SCFromUnicode(SplineFont *sf, int ch) { + int i; + + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4 ) { + if ( ch>=sf->charcnt ) +return( NULL ); + else +return( SFMakeChar(sf,ch) ); + } else if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax ) { + ch -= ((sf->encoding_name-em_unicodeplanes)<<16); + if ( ch>=sf->charcnt || ch<0 ) +return( NULL ); + else +return( SFMakeChar(sf,ch) ); + } + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc == ch ) +return( sf->chars[i] ); + +return( NULL ); +} + +static int SFContainsChar(SplineFont *sf, int ch) { + int i; + + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4 ) +return( chcharcnt ); + else if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax ) { + ch -= ((sf->encoding_name-em_unicodeplanes)<<16); +return( chcharcnt && ch>=0 ); + } + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + if ( sf->chars[i]->unicodeenc == ch ) +return( true ); + +return( false ); +} + +static void MVMoveFieldsBy(MetricsView *mv,int diff) { + int i; + int y,x; + + for ( i=0; imax && mv->perchar[i].width!=NULL; ++i ) { + y = mv->displayend+2; + x = mv->perchar[i].mx-diff; + if ( xmbase+mv->mwidth ) x = -2*mv->mwidth; + GGadgetMove(mv->perchar[i].name,x,y); + y += mv->fh+4; + GGadgetMove(mv->perchar[i].width,x,y); + y += mv->fh+4; + GGadgetMove(mv->perchar[i].lbearing,x,y); + y += mv->fh+4; + GGadgetMove(mv->perchar[i].rbearing,x,y); + y += mv->fh+4; + if ( i!=0 ) + GGadgetMove(mv->perchar[i].kern,x-mv->mwidth/2,y); + } +} + +static int MVDisplayedCnt(MetricsView *mv) { + int i, wid = mv->mbase; + + for ( i=mv->coff; icharcnt; ++i ) { + wid += mv->perchar[i].dwidth; + if ( wid>mv->dwidth ) +return( i-mv->coff ); + } +return( i-mv->coff ); /* There's extra room. don't know exactly how much but allow for some */ +} + +static void MVSetSb(MetricsView *mv) { + int cnt = (mv->dwidth-mv->mbase-mv->mwidth)/mv->mwidth; + int dcnt = MVDisplayedCnt(mv); + + if ( cnt>dcnt ) cnt = dcnt; + if ( cnt==0 ) cnt = 1; + + GScrollBarSetBounds(mv->hsb,0,mv->charcnt,cnt); + GScrollBarSetPos(mv->hsb,mv->coff); +#if 0 + /* No, the scroll bar will go the same way, just as the fields do. */ + /* the text will scroll reverse. Confusing as hell */ + if ( !mv->right_to_left ) { + } else { + GScrollBarSetBounds(mv->hsb,-mv->charcnt,0,cnt); + GScrollBarSetPos(mv->hsb,-mv->coff); + } +#endif +} + +static int MVSetVSb(MetricsView *mv) { + int max, min, i, ret, ybase, yoff; + + if ( mv->vertical ) { + min = max = 0; + if ( mv->charcnt!=0 ) + max = mv->perchar[mv->charcnt-1].dy + mv->perchar[mv->charcnt-1].dheight; + } else { + SplineFont *sf = mv->fv->sf; + ybase = 2 + (mv->pixelsize/mv_scales[mv->scale_index] * sf->ascent / (sf->ascent+sf->descent)); + min = -ybase; + max = mv->displayend-mv->topend-ybase; + for ( i=0; icharcnt; ++i ) { + BDFChar *bdfc = mv->bdf==NULL ? mv->perchar[i].show : mv->bdf->chars[mv->perchar[i].sc->enc]; + if ( bdfc!=NULL ) { + if ( min>-bdfc->ymax ) min = -bdfc->ymax; + if ( max<-bdfc->ymin ) max = -bdfc->ymin; + } + } + min += ybase; + max += ybase; + } + min -= 10; + max += 10; + GScrollBarSetBounds(mv->vsb,min,max,mv->displayend-mv->topend); + yoff = mv->yoff; + if ( yoff+mv->displayend-mv->topend > max ) + yoff = max - (mv->displayend-mv->topend); + if ( yoffyoff; + mv->yoff = yoff; + GScrollBarSetPos(mv->vsb,yoff); +return( ret ); +} + +static void MVHScroll(MetricsView *mv,struct sbevent *sb) { + int newpos = mv->coff; + int cnt = (mv->dwidth-mv->mbase-mv->mwidth)/mv->mwidth; + int dcnt = MVDisplayedCnt(mv); + + if ( cnt>dcnt ) cnt = dcnt; + if ( cnt==0 ) cnt = 1; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= cnt; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += cnt; + break; + case et_sb_bottom: + newpos = mv->charcnt-cnt; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>mv->charcnt-cnt ) + newpos = mv->charcnt-cnt; + if ( newpos<0 ) newpos =0; + if ( newpos!=mv->coff ) { + int old = mv->coff; + int diff = newpos-mv->coff; + int charsize = mv->perchar[newpos].dx-mv->perchar[old].dx; + GRect fieldrect, charrect; + + mv->coff = newpos; + charrect.x = 0; charrect.width = mv->dwidth; + charrect.y = mv->topend; charrect.height = mv->displayend-mv->topend; + fieldrect.x = mv->mbase+mv->mwidth; fieldrect.width = mv->width-mv->mbase; + fieldrect.y = mv->displayend; fieldrect.height = mv->height-mv->sbh-mv->displayend; + GScrollBarSetBounds(mv->hsb,0,mv->charcnt,cnt); + GScrollBarSetPos(mv->hsb,mv->coff); + MVMoveFieldsBy(mv,newpos*mv->mwidth); + GDrawScroll(mv->gw,&fieldrect,-diff*mv->mwidth,0); + mv->xoff = mv->perchar[newpos].dx-mv->perchar[0].dx; + if ( mv->right_to_left ) { + charsize = -charsize; + } + GDrawScroll(mv->gw,&charrect,-charsize,0); + } +} + +static void MVVScroll(MetricsView *mv,struct sbevent *sb) { + int newpos = mv->yoff; + int32 min, max, page; + + GScrollBarGetBounds(mv->vsb,&min,&max,&page); + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= page; + break; + case et_sb_up: + newpos -= (page)/15; + break; + case et_sb_down: + newpos += (page)/15; + break; + case et_sb_downpage: + newpos += page; + break; + case et_sb_bottom: + newpos = max-page; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>max-page ) + newpos = max-page; + if ( newposyoff ) { + int diff = newpos-mv->yoff; + GRect charrect; + + mv->yoff = newpos; + charrect.x = 0; charrect.width = mv->dwidth; + charrect.y = mv->topend+1; charrect.height = mv->displayend-mv->topend-1; + GScrollBarSetPos(mv->vsb,mv->yoff); + GDrawScroll(mv->gw,&charrect,0,diff); + } +} + +void MVSetSCs(MetricsView *mv, SplineChar **scs) { + /* set the list of characters being displayed to those in scs */ + int len; + unichar_t *ustr; + + for ( len=0; scs[len]!=NULL; ++len ); + + ustr = galloc((len+1)*sizeof(unichar_t)); + for ( len=0; scs[len]!=NULL; ++len ) + if ( scs[len]->unicodeenc>0 && scs[len]->unicodeenc<0x10000 ) + ustr[len] = scs[len]->unicodeenc; + else + ustr[len] = 0xfffd; + ustr[len] = 0; + GGadgetSetTitle(mv->text,ustr); + free(ustr); + + if ( len>=mv->max ) { + int oldmax=mv->max; + mv->max = len+10; + mv->perchar = grealloc(mv->perchar,mv->max*sizeof(struct metricchar)); + mv->sstr = grealloc(mv->sstr,(mv->max+1)*sizeof(SplineChar *)); + memset(mv->perchar+oldmax,'\0',(mv->max-oldmax)*sizeof(struct metricchar)); + } + for ( len=0; scs[len]!=NULL; ++len ) + MVSetPos(mv,len,scs[len]); + if ( len!=0 ) + MVDoSelect(mv,len-1); + + mv->charcnt = len; + GDrawRequestExpose(mv->gw,NULL,false); + MVSetSb(mv); +} + +static void MVTextChanged(MetricsView *mv) { + const unichar_t *ret, *pt, *ept, *tpt; + int i,ei, j,oldx, start=0, end=0; + static unichar_t nullstr[] = { 0 }; + GRect r; + int missing; + int direction_change = false; + SplineChar **hold = NULL; + + ret = _GGadgetGetTitle(mv->text); + if (( isrighttoleft(ret[0]) && !mv->right_to_left ) || + ( !isrighttoleft(ret[0]) && mv->right_to_left )) { + direction_change = true; + mv->right_to_left = !mv->right_to_left; + } + for ( pt=ret, i=0; icharcnt && *pt!='\0'; ++i, ++pt ) + if ( *pt!=mv->perchar[i].sc->unicodeenc && + (*pt!=0xfffd || mv->perchar[i].sc->unicodeenc!=-1 )) + break; + if ( i==mv->charcnt && *pt=='\0' ) +return; /* Nothing changed */ + for ( ept=ret+u_strlen(ret)-1, ei=mv->charcnt-1; ; --ei, --ept ) + if ( ei<0 || eptperchar[ei].sc->unicodeenc && + (*ept!=0xfffd || mv->perchar[ei].sc->unicodeenc!=-1 ))) { + ++ei; ++ept; + break; + } else if ( ei<=i || ept<=pt ) { + ++ei; ++ept; + break; + } + /* the change happened between i and ei, and between pt and ept */ + oldx = mv->perchar[i].dx; + if ( mv->perchar[i].show!=NULL && mv->perchar[i].show->xmin<0 ) + oldx += mv->perchar[i].show->xmin; /* Beware of negative lbearing */ + if ( i!=0 && oldx > mv->perchar[i-1].dx + mv->perchar[i-1].dwidth ) /* without kern */ + oldx = mv->perchar[i-1].dx + mv->perchar[i-1].dwidth; + if ( ei==i && ept==pt ) + GDrawIError("No change when there should have been one in MV_TextChanged"); + if ( u_strlen(ret)>=mv->max ) { + int oldmax=mv->max; + mv->max = u_strlen(ret)+10; + mv->perchar = grealloc(mv->perchar,mv->max*sizeof(struct metricchar)); + mv->sstr = grealloc(mv->sstr,(mv->max+1)*sizeof(SplineChar *)); + memset(mv->perchar+oldmax,'\0',(mv->max-oldmax)*sizeof(struct metricchar)); + } + + missing = 0; + for ( tpt=pt; tptfv->sf,*tpt)) + ++missing; + + if ( ept-pt-missing > ei-i ) { + if ( icharcnt ) { + int diff = (ept-pt-missing) - (ei-i); + hold = galloc((mv->charcnt+diff+6)*sizeof(SplineChar *)); + for ( j=mv->charcnt-1; j>=ei; --j ) + hold[j+diff] = mv->perchar[j].sc; + start = ei+diff; end = mv->charcnt+diff; + } + } else if ( ept-pt-missing != ei-i ) { + int diff = (ept-pt-missing) - (ei-i); + for ( j=ei; jcharcnt; ++j ) + if ( j+diff>=0 ) + MVSetPos(mv,j+diff,mv->perchar[j].sc); + for ( j+=diff; jcharcnt; ++j ) if ( j>=0 ) { + BDFCharFree( mv->perchar[j].show ); + mv->perchar[j].show = NULL; + GGadgetSetTitle(mv->perchar[j].name,nullstr); + GGadgetSetTitle(mv->perchar[j].width,nullstr); + GGadgetSetTitle(mv->perchar[j].lbearing,nullstr); + GGadgetSetTitle(mv->perchar[j].rbearing,nullstr); + if ( mv->perchar[j].kern!=NULL ) + GGadgetSetTitle(mv->perchar[j].kern,nullstr); + } + mv->charcnt += diff; + } + for ( j=i; ptfv->sf,*pt); + if ( sc!=NULL ) + MVSetPos(mv,j++,sc); + } + if ( hold!=NULL ) { + /* We had to figure out what sc's there were before we wrote over them*/ + /* but we couldn't put them where they belonged until everything before*/ + /* them was set properly */ + for ( j=start; jperchar[i].dx; + /* If i points to eol then mv->perchar[i].dx will be correct but .show will*/ + /* be NULL */ + if ( mv->perchar[i].show!=NULL && mv->perchar[i].show->xmin<0 ) + r.x += mv->perchar[i].show->xmin; /* Beware of negative lbearing */ + if ( i!=0 && r.x > mv->perchar[i-1].dx + mv->perchar[i-1].dwidth ) /* without kern */ + r.x = mv->perchar[i-1].dx + mv->perchar[i-1].dwidth; + if ( r.x>oldx ) r.x = oldx; + if ( i==0 ) r.x = 0; + r.width = mv->dwidth; + if ( MVSetAnchor(mv)) + r.x = 0; + if ( direction_change || mv->right_to_left ) + r.x = 0; + r.y = mv->topend; r.height = mv->displayend-r.y; + r.x -= mv->xoff; + mv->charcnt = u_strlen(ret)-missing; + GDrawRequestExpose(mv->gw,&r,false); + MVSetSb(mv); +} + +static int MV_TextChanged(GGadget *g, GEvent *e) { + + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + MVTextChanged(GGadgetGetUserData(g)); + } +return( true ); +} + + +static int MV_SLIChanged(GGadget *g, GEvent *e) { + + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + MetricsView *mv = GGadgetGetUserData(g); + int32 len; + GTextInfo **ti = GGadgetGetList(g,&len); + int i,index; + KernPair *kp; + KernClass *kc; + + if ( ti[len-1]->selected ) /* Edit script/lang list */ + ScriptLangList(mv->fv->sf,g,mv->cur_sli); + else { + mv->cur_sli = GGadgetGetFirstListSelectedItem(g); + for ( i=0; icharcnt; ++i ) { + if ( mv->perchar[i].selected ) + break; + } + if ( i!=0 ) { + for ( kp=kp=mv->vertical ? mv->perchar[i-1].sc->vkerns:mv->perchar[i-1].sc->kerns; kp!=NULL; kp=kp->next ) { + if ( kp->sc==mv->perchar[i].sc ) { + kp->sli = mv->cur_sli; + break; + } + } + if ( kp==NULL ) { + kc= !mv->vertical + ? SFFindKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false) + : SFFindVKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false); + if ( kc!=NULL ) + kc->sli = mv->cur_sli; + } + } + } + } +return( true ); +} + +#define MID_ZoomIn 2002 +#define MID_ZoomOut 2003 +#define MID_Next 2005 +#define MID_Prev 2006 +#define MID_Outline 2007 +#define MID_ShowGrid 2008 +#define MID_NextDef 2012 +#define MID_PrevDef 2013 +#define MID_AntiAlias 2014 +#define MID_FindInFontView 2015 +#define MID_Substitutions 2016 +#define MID_Ligatures 2020 +#define MID_KernPairs 2021 +#define MID_AnchorPairs 2022 +#define MID_Vertical 2023 +#define MID_ReplaceChar 2024 +#define MID_InsertCharB 2025 +#define MID_InsertCharA 2026 +#define MID_CharInfo 2201 +#define MID_FindProblems 2216 +#define MID_MetaFont 2217 +#define MID_Transform 2202 +#define MID_Stroke 2203 +#define MID_RmOverlap 2204 +#define MID_Simplify 2205 +#define MID_Correct 2206 +#define MID_BuildAccent 2208 +#define MID_AvailBitmaps 2210 +#define MID_RegenBitmaps 2211 +#define MID_Autotrace 2212 +#define MID_Round 2213 +#define MID_ShowDependents 2222 +#define MID_AddExtrema 2224 +#define MID_CleanupChar 2225 +#define MID_TilePath 2226 +#define MID_BuildComposite 2227 +#define MID_Intersection 2229 +#define MID_FindInter 2230 +#define MID_Effects 2231 +#define MID_SimplifyMore 2232 +#define MID_Center 2600 +#define MID_OpenBitmap 2700 +#define MID_OpenOutline 2701 +#define MID_Display 2706 +#define MID_Cut 2101 +#define MID_Copy 2102 +#define MID_Paste 2103 +#define MID_Clear 2104 +#define MID_SelAll 2106 +#define MID_UnlinkRef 2108 +#define MID_Undo 2109 +#define MID_Redo 2110 +#define MID_CopyRef 2107 +#define MID_CopyWidth 2111 +#define MID_CopyLBearing 2125 +#define MID_CopyRBearing 2126 +#define MID_CopyVWidth 2127 +#define MID_Join 2128 +#define MID_Center 2600 +#define MID_Thirds 2604 +#define MID_VKernClass 2605 +#define MID_VKernFromHKern 2606 +#define MID_Recent 2703 + +static void MVMenuClose(GWindow gw,struct gmenuitem *mi,GEvent *e) { + GDrawDestroyWindow(gw); +} + +static void MVMenuOpenBitmap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( mv->fv->sf->bitmaps==NULL ) +return; + for ( i=0; icharcnt; ++i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=mv->charcnt ) + BitmapViewCreatePick(mv->perchar[i].sc->enc,mv->fv); +} + +static void MVMenuMergeKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + MergeKernInfo(mv->fv->sf); +} + +static void MVMenuOpenOutline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=0; icharcnt; ++i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=mv->charcnt ) + CharViewCreate(mv->perchar[i].sc,mv->fv); +} + +static void MVMenuSave(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + _FVMenuSave(mv->fv); +} + +static void MVMenuSaveAs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + _FVMenuSaveAs(mv->fv); +} + +static void MVMenuGenerate(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + _FVMenuGenerate(mv->fv,false); +} + +static void MVMenuGenerateFamily(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + _FVMenuGenerate(mv->fv,true); +} + +static void MVMenuPrint(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + PrintDlg(NULL,NULL,mv); +} + +static void MVMenuDisplay(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + DisplayDlg(mv->fv->sf); +} + +static void MVUndo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GGadgetActiveGadgetEditCmd(mv->gw,ec_undo) ) + MVTextChanged(mv); + else { + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + if ( mv->perchar[i].sc->layers[ly_fore].undoes!=NULL ) + SCDoUndo(mv->perchar[i].sc,ly_fore); + } +} + +static void MVRedo(GWindow gw,struct gmenuitem *mi, GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GGadgetActiveGadgetEditCmd(mv->gw,ec_redo) ) + MVTextChanged(mv); + else { + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + if ( mv->perchar[i].sc->layers[ly_fore].redoes!=NULL ) + SCDoRedo(mv->perchar[i].sc,ly_fore); + } +} + +static void MVClear(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + SplineChar *sc; + static int buts[] = { _STR_Yes, _STR_Unlink, _STR_Cancel, 0 }; + BDFFont *bdf; + extern int onlycopydisplayed; + + if ( GGadgetActiveGadgetEditCmd(mv->gw,ec_clear) ) + MVTextChanged(mv); + else { + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + sc = mv->perchar[i].sc; + if ( sc->dependents!=NULL ) { + int yes = GWidgetAskCenteredR(_STR_BadReference,buts,1,2,_STR_ClearDependent,sc->name); + if ( yes==2 ) +return; + if ( yes==1 ) + UnlinkThisReference(NULL,sc); + } + + if ( onlycopydisplayed && mv->bdf==NULL ) { + SCClearAll(sc); + } else if ( onlycopydisplayed ) { + BCClearAll(mv->bdf->chars[i]); + } else { + SCClearAll(sc); + for ( bdf=mv->fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) + BCClearAll(bdf->chars[i]); + } + } +} + +static void MVCut(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GGadgetActiveGadgetEditCmd(mv->gw,ec_cut) ) + MVTextChanged(mv); + else { + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + MVCopyChar(mv,mv->perchar[i].sc,true); + MVClear(gw,mi,e); + } +} + +static void MVCopy(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GGadgetActiveGadgetEditCmd(mv->gw,ec_copy) ) + MVTextChanged(mv); + else { + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + MVCopyChar(mv,mv->perchar[i].sc,true); + } +} + +static void MVMenuCopyRef(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GWindowGetFocusGadgetOfWindow(gw)!=NULL ) +return; + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + MVCopyChar(mv,mv->perchar[i].sc,false); +} + +static void MVMenuCopyWidth(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GWindowGetFocusGadgetOfWindow(gw)!=NULL ) +return; + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + SCCopyWidth(mv->perchar[i].sc, + mi->mid==MID_CopyWidth?ut_width: + mi->mid==MID_CopyVWidth?ut_vwidth: + mi->mid==MID_CopyLBearing?ut_lbearing: + ut_rbearing); +} + +static void MVMenuJoin(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i, changed; + extern float joinsnap; + + if ( GWindowGetFocusGadgetOfWindow(gw)!=NULL ) +return; + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + SCPreserveState(mv->perchar[i].sc,false); + mv->perchar[i].sc->layers[ly_fore].splines = + SplineSetJoin(mv->perchar[i].sc->layers[ly_fore].splines,true,joinsnap,&changed); + if ( changed ) + SCCharChangedUpdate(mv->perchar[i].sc); +} + +static void MVPaste(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GGadgetActiveGadgetEditCmd(mv->gw,ec_paste) ) + MVTextChanged(mv); + else { + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + PasteIntoMV(mv,mv->perchar[i].sc,true); + } +} + +static void MVUnlinkRef(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + SplineChar *sc; + RefChar *rf, *next; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) +return; + sc = mv->perchar[i].sc; + SCPreserveState(sc,false); + for ( rf=sc->layers[ly_fore].refs; rf!=NULL ; rf=next ) { + next = rf->next; + SCRefToSplines(sc,rf); + } + SCCharChangedUpdate(sc); +} + +static void MVSelectAll(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + GGadgetActiveGadgetEditCmd(mv->gw,ec_selectall); +} + +static void MVMenuFontInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + DelayEvent(FontMenuFontInfo,mv->fv); +} + +static void MVMenuCharInfo(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) + SCCharInfo(mv->perchar[i].sc); +} + +static void MVMenuShowDependents(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) +return; + if ( mv->perchar[i].sc->dependents==NULL ) +return; + SCRefBy(mv->perchar[i].sc); +} + +static void MVMenuFindProblems(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) + FindProblems(mv->fv,NULL,mv->perchar[i].sc); +} + +static void MVMenuBitmaps(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=0; icharcnt; ++i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=mv->charcnt ) + BitmapDlg(mv->fv,mv->perchar[i].sc,mi->mid==MID_AvailBitmaps ); + else if ( mi->mid==MID_AvailBitmaps ) + BitmapDlg(mv->fv,NULL,true ); +} + +static int getorigin(void *d,BasePoint *base,int index) { + SplineChar *sc = (SplineChar *) d; + DBounds bb; + + base->x = base->y = 0; + switch ( index ) { + case 0: /* Character origin */ + /* all done */ + break; + case 1: /* Center of selection */ + SplineCharFindBounds(sc,&bb); + base->x = (bb.minx+bb.maxx)/2; + base->y = (bb.miny+bb.maxy)/2; + break; + default: +return( false ); + } +return( true ); +} + +static void MVTransFunc(void *_sc,real transform[6],int otype, BVTFunc *bvts, + enum fvtrans_flags flags ) { + SplineChar *sc = _sc; + + FVTrans(sc->parent->fv,sc,transform, NULL,flags); +} + +static void MVMenuTransform(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) + TransformDlgCreate( mv->perchar[i].sc,MVTransFunc,getorigin,true ); +} + +static void MVMenuStroke(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) + SCStroke(mv->perchar[i].sc); +} + +#ifdef FONTFORGE_CONFIG_TILEPATH +static void MVMenuTilePath(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) + SCTile(mv->perchar[i].sc); +} +#endif + +static void _MVMenuOverlap(MetricsView *mv,enum overlap_type ot) { + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + SCPreserveState(sc,false); + MinimumDistancesFree(sc->md); + sc->md = NULL; + sc->layers[ly_fore].splines = SplineSetRemoveOverlap(sc,sc->layers[ly_fore].splines,ot); + SCCharChangedUpdate(sc); + } +} + +static void MVMenuOverlap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + _MVMenuOverlap(mv,mi->mid==MID_RmOverlap ? over_remove : + mi->mid==MID_Intersection ? over_intersect : + over_findinter); +} + +static void MVMenuInline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + OutlineDlg(NULL,NULL,mv,true); +} + +static void MVMenuOutline(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + OutlineDlg(NULL,NULL,mv,false); +} + +static void MVMenuShadow(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + ShadowDlg(NULL,NULL,mv,false); +} + +static void MVMenuWireframe(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + ShadowDlg(NULL,NULL,mv,true); +} + +static void MVSimplify( MetricsView *mv,int type ) { + int i; + static struct simplifyinfo smpl = { sf_normal,.75,.05,0 }; + + smpl.err = (mv->fv->sf->ascent+mv->fv->sf->descent)/1000.; + + if ( type==1 ) { + if ( !SimplifyDlg(mv->fv->sf,&smpl)) +return; + } + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + SCPreserveState(sc,false); + sc->layers[ly_fore].splines = SplineCharSimplify(sc,sc->layers[ly_fore].splines,&smpl); + SCCharChangedUpdate(sc); + } +} + +static void MVMenuSimplify(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + MVSimplify(mv,false); +} + +static void MVMenuSimplifyMore(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + MVSimplify(mv,true); +} + +static void MVMenuCleanup(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + MVSimplify(mv,-1); +} + +static void MVMenuAddExtrema(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + SCPreserveState(sc,false); + SplineCharAddExtrema(sc->layers[ly_fore].splines,false); + SCCharChangedUpdate(sc); + } +} + +static void MVMenuRound2Int(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SCPreserveState(mv->perchar[i].sc,false); + SCRound2Int( mv->perchar[i].sc); + } +} + +static void MVMenuMetaFont(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) + MetaFont(NULL, NULL, mv->perchar[i].sc); +} + +static void MVMenuAutotrace(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) + SCAutoTrace(mv->perchar[i].sc,mv->gw,e!=NULL && (e->u.mouse.state&ksm_shift)); +} + +static void MVMenuCorrectDir(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + int changed = false, refchanged=false; + RefChar *ref; + int asked=-1; + static int buts[] = { _STR_Unlink, _STR_No, _STR_Cancel, 0 }; + + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]*ref->transform[3]<0 || + (ref->transform[0]==0 && ref->transform[1]*ref->transform[2]>0)) { + if ( asked==-1 ) { + asked = GWidgetAskR(_STR_FlippedRef,buts,0,2,_STR_FlippedRefUnlink, sc->name ); + if ( asked==2 ) +return; + else if ( asked==1 ) + break; + } + if ( asked==0 ) { + if ( !refchanged ) { + refchanged = true; + SCPreserveState(sc,false); + } + SCRefToSplines(sc,ref); + } + } + } + + if ( !refchanged ) + SCPreserveState(sc,false); + sc->layers[ly_fore].splines = SplineSetsCorrect(sc->layers[ly_fore].splines,&changed); + if ( changed || refchanged ) + SCCharChangedUpdate(sc); + } +} + +static void _MVMenuBuildAccent(MetricsView *mv,int onlyaccents) { + int i; + extern int onlycopydisplayed; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=-1 ) { + SplineChar *sc = mv->perchar[i].sc; + if ( SFIsSomethingBuildable(mv->fv->sf,sc,onlyaccents) ) + SCBuildComposit(mv->fv->sf,sc,!onlycopydisplayed,mv->fv); + } +} + +static void MVMenuBuildAccent(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + _MVMenuBuildAccent(mv,false); +} + +static void MVMenuBuildComposite(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + _MVMenuBuildAccent(mv,true); +} + +static void MVResetText(MetricsView *mv) { + unichar_t *new, *pt; + int i,si; + + new = galloc((mv->charcnt+1)*sizeof(unichar_t)); + si=-1; + for ( pt=new, i=0; icharcnt; ++i ) { + if ( mv->perchar[i].sc->unicodeenc==-1 || mv->perchar[i].sc->unicodeenc>=0x10000 ) + *pt++ = 0xfffd; + else + *pt++ = mv->perchar[i].sc->unicodeenc; + if ( mv->perchar[i].selected ) si=i; + } + *pt = '\0'; + GGadgetSetTitle(mv->text,new); + free(new ); +} + +static void MVMenuLigatures(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + SFShowLigatures(mv->fv->sf,NULL); +} + +static void MVMenuKernPairs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + SFShowKernPairs(mv->fv->sf,NULL,NULL); +} + +static void MVMenuAnchorPairs(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + SFShowKernPairs(mv->fv->sf,NULL,mi->ti.userdata); +} + +static void MVMenuScale(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + if ( mi->mid==MID_ZoomIn ) { + if ( --mv->scale_index<0 ) mv->scale_index = 0; + } else { + if ( ++mv->scale_index >= sizeof(mv_scales)/sizeof(mv_scales[0]) ) + mv->scale_index = sizeof(mv_scales)/sizeof(mv_scales[0])-1; + } + + mv->pixelsize = mv_scales[mv->scale_index]*(mv->displayend - mv->topend - 4); + MVReRasterize(mv); + MVReKern(mv); + MVSetVSb(mv); +} + +static void MVMenuInsertChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + SplineFont *sf = mv->fv->sf; + int i, j, pos = GotoChar(sf); + + if ( pos==-1 || pos>=sf->charcnt ) +return; + + for ( i=0; icharcnt; ++i ) + if ( mv->perchar[i].selected ) + break; + if ( mi->mid==MID_InsertCharA ) { + if ( i==mv->charcnt ) i = mv->charcnt-1; + ++i; + } else { + if ( i==mv->charcnt ) i = 0; + } + + if ( mv->charcnt+1>=mv->max ) { + int oldmax=mv->max; + mv->max = mv->charcnt+10; + mv->perchar = grealloc(mv->perchar,mv->max*sizeof(struct metricchar)); + mv->sstr = grealloc(mv->sstr,(mv->max+1)*sizeof(SplineChar *)); + memset(mv->perchar+oldmax,'\0',(mv->max-oldmax)*sizeof(struct metricchar)); + } + for ( j=mv->charcnt; j>i; --j ) + MVSetPos(mv,j,mv->perchar[j-1].sc); + MVSetPos(mv,i,SFMakeChar(sf,pos)); + MVDoSelect(mv,i); + for ( ; icharcnt; ++i ) + if ( i!=0 ) + mv->perchar[i].dx = mv->perchar[i-1].dx + mv->perchar[i-1].dwidth + mv->perchar[i-1].kernafter + mv->perchar[i-1].hoff; + MVSetAnchor(mv); + GDrawRequestExpose(mv->gw,NULL,false); + MVResetText(mv); +} + +static void MVMenuChangeChar(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + SplineFont *sf = mv->fv->sf; + int i, pos; + + for ( i=0; icharcnt; ++i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=mv->charcnt ) { + if ( mi->mid == MID_Next ) { + pos = mv->perchar[i].sc->enc+1; + } else if ( mi->mid==MID_Prev ) { + pos = mv->perchar[i].sc->enc-1; + } else if ( mi->mid==MID_NextDef ) { + for ( pos = mv->perchar[i].sc->enc+1; poscharcnt && sf->chars[pos]==NULL; ++pos ); + if ( pos>=sf->charcnt ) +return; + } else if ( mi->mid==MID_PrevDef ) { + for ( pos = mv->perchar[i].sc->enc-1; pos>=0 && sf->chars[pos]==NULL; --pos ); + if ( pos<0 ) +return; + } else if ( mi->mid==MID_ReplaceChar ) { + pos = GotoChar(sf); + if ( pos<0 ) +return; + } + if ( pos>=0 && posfv->sf->charcnt ) { + MVSetPos(mv,i,SFMakeChar(sf,pos)); + /* May need to adjust start of current char if kerning changed */ + for ( ; icharcnt; ++i ) + if ( i!=0 ) + mv->perchar[i].dx = mv->perchar[i-1].dx + mv->perchar[i-1].dwidth + mv->perchar[i-1].kernafter + mv->perchar[i-1].hoff; + MVSetAnchor(mv); + GDrawRequestExpose(mv->gw,NULL,false); + MVResetText(mv); + } + } +} + +static void MVMenuFindInFontView(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=0; icharcnt; ++i ) { + if ( mv->perchar[i].selected ) { + FVChangeChar(mv->fv,mv->perchar[i].sc->enc); + GDrawSetVisible(mv->fv->gw,true); + GDrawRaise(mv->fv->gw); + break; + } + } +} + +static void MVMenuShowGrid(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + mv->showgrid = !mv->showgrid; + GDrawRequestExpose(mv->gw,NULL,false); +} + +static void MVMenuAA(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + mv_antialias = mv->antialias = !mv->antialias; + MVReRasterize(mv); + GDrawRequestExpose(mv->gw,NULL,false); +} + +static void MVMenuVertical(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + if ( !mv->fv->sf->hasvmetrics ) { + if ( mv->vertical ) + MVToggleVertical(mv); + } else + MVToggleVertical(mv); + GDrawRequestExpose(mv->gw,NULL,false); +} + +static void MVMenuShowBitmap(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + BDFFont *bdf = mi->ti.userdata; + + if ( mv->bdf!=bdf ) { + MVChangeDisplayFont(mv,bdf); + GDrawRequestExpose(mv->gw,NULL,false); + } +} + +static void MVMenuCenter(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + DBounds bb; + real transform[6]; + SplineChar *sc; + + for ( i=0; icharcnt; ++i ) + if ( mv->perchar[i].selected ) + break; + if ( i!=mv->charcnt ) { + sc = mv->perchar[i].sc; + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0.0; + SplineCharFindBounds(sc,&bb); + if ( mi->mid==MID_Center ) + transform[4] = (sc->width-(bb.maxx-bb.minx))/2 - bb.minx; + else + transform[4] = (sc->width-(bb.maxx-bb.minx))/3 - bb.minx; + if ( transform[4]!=0 ) + FVTrans(mv->fv,sc,transform,NULL,fvt_dontmovewidth); + } +} + +static void MVMenuKernByClasses(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + ShowKernClasses(mv->fv->sf,mv,false); +} + +static void MVMenuVKernByClasses(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + ShowKernClasses(mv->fv->sf,mv,true); +} + +static void MVMenuVKernFromHKern(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + FVVKernFromHKern(mv->fv); +} + +static void PosSubsMenuFree(GMenuItem *mi) { + int i; + + if ( mi==NULL ) +return; + for ( i=0; mi[i].ti.text!=NULL || mi[i].ti.line; ++i ) { + if ( !mi[i].ti.text_in_resource ) + free( mi[i].ti.text ); + if ( mi[i].sub!=NULL ) + PosSubsMenuFree(mi[i].sub); + } + free(mi); +} + +static void MVRevertSubs(GWindow gw, GMenuItem *mi, GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=0; icharcnt; ++i ) if ( mv->perchar[i].selected ) { + SplineChar *basesc = mv->perchar[i].basesc; + if ( basesc==NULL ) +return; + MVSetPos(mv,i,basesc); + /* Should I update the text field??? */ + MVSetAnchor(mv); + GDrawRequestExpose(mv->gw,NULL,false); + break; + } +} + +static void MVSubsInvoked(GWindow gw, GMenuItem *mi, GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=0; icharcnt; ++i ) if ( mv->perchar[i].selected ) { + char *name = mi->ti.userdata, *pt; + SplineChar *sc; + SplineChar *basesc = mv->perchar[i].basesc; + if ( basesc==NULL ) basesc = mv->perchar[i].sc; + pt = strchr(name,' '); + if ( pt!=NULL ) *pt = '\0'; + sc = SFGetChar(mv->fv->sf,-1,name); + if ( pt!=NULL ) *pt = ' '; + + if ( sc==NULL ) + GWidgetErrorR(_STR_CouldntfindcharT, _STR_CouldntFindSubstitution, name); + else { + MVSetPos(mv,i,sc); + mv->perchar[i].basesc = basesc; + /* Should I update the text field??? */ + MVSetAnchor(mv); + GDrawRequestExpose(mv->gw,NULL,false); + } + break; + } +} + +static void GMenuFillWithTag(GMenuItem *mi,GTextInfo *tags,uint32 tag) { + int j; + unichar_t ubuf[8]; + + for ( j=0; tags[j].text!=NULL; ++j ) + if ( (uint32) (tags[j].userdata)==tag ) + break; + if ( tags[j].text==NULL ) { + ubuf[0] = tag>>24; + ubuf[1] = (tag>>16) & 0xff; + ubuf[2] = (tag>>8 ) & 0xff; + ubuf[3] = (tag ) & 0xff; + ubuf[4] = 0; + mi->ti.text = u_copy(ubuf); + } else { + mi->ti.text = tags[j].text; + mi->ti.text_in_resource = true; + } + mi->ti.fg = COLOR_DEFAULT; + mi->ti.bg = COLOR_DEFAULT; +} + +static void GMenuMakeSubSub(GMenuItem *mi,char *start,char *pt) { + mi->ti.text = uc_copyn(start,pt-start); + mi->ti.fg = COLOR_DEFAULT; + mi->ti.bg = COLOR_DEFAULT; + mi->ti.userdata = start; + mi->invoke = MVSubsInvoked; +} + +static GMenuItem *SubsMenuBuild(SplineChar *sc,SplineChar *basesc) { + PST *pst; + GMenuItem *mi; + int cnt, i, j; + char *pt, *start; + extern GTextInfo simplesubs_tags[]; + extern GTextInfo alternatesubs_tags[]; + + for ( cnt = 0, pst=sc->possub; pst!=NULL ; pst=pst->next ) + if ( pst->type==pst_substitution || pst->type==pst_alternate ) + ++cnt; + if ( basesc!=NULL ) { + if ( cnt>0 ) cnt+=2; + else cnt = 1; + } + if ( cnt==0 ) +return( NULL ); + mi = gcalloc(cnt+2,sizeof(GMenuItem)); + for ( i = 0, pst=sc->possub; pst!=NULL ; pst=pst->next ) { + if ( pst->type==pst_substitution ) { + GMenuFillWithTag(&mi[i],simplesubs_tags,pst->tag); + mi[i].ti.userdata = pst->u.subs.variant; + mi[i++].invoke = MVSubsInvoked; + } else if ( pst->type==pst_alternate ) { + GMenuFillWithTag(&mi[i],alternatesubs_tags,pst->tag); + if ( strchr(pst->u.alt.components,' ')==NULL ) { + mi[i].ti.userdata = pst->u.alt.components; + mi[i++].invoke = MVSubsInvoked; + } else { + for ( pt = pst->u.alt.components, j=0; *pt; ++pt ) + if ( *pt ==' ' ) ++j; + mi[i].sub = gcalloc(j+2,sizeof(GMenuItem)); + for ( pt = start = pst->u.alt.components, j=0; *pt; ++pt ) if ( *pt ==' ' ) { + GMenuMakeSubSub(&mi[i].sub[j],start,pt); + start = pt+1; + ++j; + } + GMenuMakeSubSub(&mi[i].sub[j],start,pt); + ++i; + } + } + } + if ( basesc!=NULL ) { + if ( i!=0 ) + mi[i++].ti.line = true; + mi[i].ti.text = u_copy((unichar_t *) GStringGetResource(_STR_RevertSubs,NULL)); + mi[i].ti.fg = COLOR_DEFAULT; + mi[i].ti.bg = COLOR_DEFAULT; + mi[i].ti.userdata = basesc; + mi[i].invoke = MVRevertSubs; + } +return( mi ); +} + +static void MVPopupInvoked(GWindow gw, GMenuItem *mi, GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + for ( i=0; icharcnt; ++i ) if ( mv->perchar[i].selected ) { + mv->perchar[i].active_pos = mi->ti.userdata; + MVSetAnchor(mv); + MVRedrawI(mv,i,0,0); + break; + } +} + +static void MVPopupMenu(MetricsView *mv,GEvent *event,int sel) { + PST *pst; + int cnt, i; + GMenuItem *mi; + extern GTextInfo simplepos_tags[]; + + for ( cnt=0, pst=mv->perchar[sel].sc->possub; pst!=NULL; pst=pst->next ) + if ( pst->type == pst_position ) + ++cnt; + mi = gcalloc(cnt+4,sizeof(GMenuItem)); + + mi[0].ti.text = (unichar_t *) _STR_Plain; + mi[0].ti.text_in_resource = true; + mi[0].ti.fg = COLOR_DEFAULT; + mi[0].ti.bg = COLOR_DEFAULT; + mi[0].invoke = MVPopupInvoked; + + if ( cnt!=0 ) { + mi[1].ti.fg = COLOR_DEFAULT; + mi[1].ti.bg = COLOR_DEFAULT; + mi[1].ti.line = true; + } + + i = 2; + for ( pst=mv->perchar[sel].sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_position ) { + GMenuFillWithTag(&mi[i],simplepos_tags,pst->tag); + mi[i].ti.userdata = pst; + mi[i++].invoke = MVPopupInvoked; + } + } + GMenuCreatePopupMenu(mv->gw,event, mi); + PosSubsMenuFree(mi); +} + +static GMenuItem dummyitem[] = { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, NULL }; +static GMenuItem fllist[] = { + { { (unichar_t *) _STR_New, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, 'N', ksm_control, NULL, NULL, MenuNew }, + { { (unichar_t *) _STR_Open, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, 'O', ksm_control, NULL, NULL, MenuOpen }, + { { (unichar_t *) _STR_Recent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, '\0', ksm_control, dummyitem, MenuRecentBuild, NULL, MID_Recent }, + { { (unichar_t *) _STR_Close, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'Q', ksm_control|ksm_shift, NULL, NULL, MVMenuClose }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Openoutline, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'u' }, 'H', ksm_control, NULL, NULL, MVMenuOpenOutline }, + { { (unichar_t *) _STR_Openbitmap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'J', ksm_control, NULL, NULL, MVMenuOpenBitmap, MID_OpenBitmap }, + { { (unichar_t *) _STR_Openmetrics, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'K', ksm_control, NULL, NULL, /* No function, never avail */NULL }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Save, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'S', ksm_control, NULL, NULL, MVMenuSave }, + { { (unichar_t *) _STR_Saveas, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, 'S', ksm_control|ksm_shift, NULL, NULL, MVMenuSaveAs }, + { { (unichar_t *) _STR_Generate, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, 'G', ksm_control|ksm_shift, NULL, NULL, MVMenuGenerate }, + { { (unichar_t *) _STR_GenerateMac, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'G', ksm_control|ksm_meta, NULL, NULL, MVMenuGenerateFamily }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Mergekern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 'K', ksm_control|ksm_shift, NULL, NULL, MVMenuMergeKern }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Print, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'P', ksm_control, NULL, NULL, MVMenuPrint }, + { { (unichar_t *) _STR_Display, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'P', ksm_control|ksm_meta, NULL, NULL, MVMenuDisplay, MID_Display }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Prefs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'e' }, '\0', ksm_control, NULL, NULL, MenuPrefs }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Quit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'Q' }, 'Q', ksm_control, NULL, NULL, MenuExit }, + { NULL } +}; + +static GMenuItem edlist[] = { + { { (unichar_t *) _STR_Undo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'Z', ksm_control, NULL, NULL, MVUndo, MID_Undo }, + { { (unichar_t *) _STR_Redo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'Y', ksm_control, NULL, NULL, MVRedo, MID_Redo }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Cut, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, 'X', ksm_control, NULL, NULL, MVCut, MID_Cut }, + { { (unichar_t *) _STR_Copy, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'C', ksm_control, NULL, NULL, MVCopy, MID_Copy }, + { { (unichar_t *) _STR_Copyref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'G', ksm_control, NULL, NULL, MVMenuCopyRef, MID_CopyRef }, + { { (unichar_t *) _STR_Copywidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 'W', ksm_control, NULL, NULL, MVMenuCopyWidth, MID_CopyWidth }, + { { (unichar_t *) _STR_CopyVWidth, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '\0', ksm_control, NULL, NULL, MVMenuCopyWidth, MID_CopyVWidth }, + { { (unichar_t *) _STR_CopyLBearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'p' }, '\0', ksm_control, NULL, NULL, MVMenuCopyWidth, MID_CopyLBearing }, + { { (unichar_t *) _STR_CopyRBearing, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'g' }, '\0', ksm_control, NULL, NULL, MVMenuCopyWidth, MID_CopyRBearing }, + { { (unichar_t *) _STR_Paste, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'V', ksm_control, NULL, NULL, MVPaste, MID_Paste }, + { { (unichar_t *) _STR_Clear, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, NULL, NULL, MVClear, MID_Clear }, + { { (unichar_t *) _STR_Join, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'J' }, 'J', ksm_control|ksm_shift, NULL, NULL, MVMenuJoin, MID_Join }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_SelectAll, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'A', ksm_control, NULL, NULL, MVSelectAll, MID_SelAll }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Unlinkref, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'U', ksm_control, NULL, NULL, MVUnlinkRef, MID_UnlinkRef }, + { NULL } +}; + +static GMenuItem smlist[] = { + { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'M', ksm_control|ksm_shift, NULL, NULL, MVMenuSimplify, MID_Simplify }, + { { (unichar_t *) _STR_SimplifyMore, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'M', ksm_control|ksm_shift|ksm_meta, NULL, NULL, MVMenuSimplifyMore, MID_SimplifyMore }, + { { (unichar_t *) _STR_CleanupChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'n' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuCleanup, MID_CleanupChar }, + { NULL } +}; + +static GMenuItem rmlist[] = { + { { (unichar_t *) _STR_Rmoverlap, &GIcon_rmoverlap, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'O' }, 'O', ksm_control|ksm_shift, NULL, NULL, MVMenuOverlap, MID_RmOverlap }, + { { (unichar_t *) _STR_Intersect, &GIcon_intersection, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuOverlap, MID_Intersection }, + { { (unichar_t *) _STR_FindIntersections, &GIcon_findinter, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuOverlap, MID_FindInter }, + { NULL } +}; + +static GMenuItem eflist[] = { + { { (unichar_t *) _STR_Inline, &GIcon_inline, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuInline }, + { { (unichar_t *) _STR_OutlineMn, &GIcon_outline, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'I' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuOutline }, + { { (unichar_t *) _STR_Shadow, &GIcon_shadow, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuShadow }, + { { (unichar_t *) _STR_Wireframe, &GIcon_wireframe, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, true, 0, 0, 0, 0, 0, 1, 0, 'W' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuWireframe }, + { NULL } +}; + +static GMenuItem balist[] = { + { { (unichar_t *) _STR_Buildaccent, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'A', ksm_control|ksm_shift, NULL, NULL, MVMenuBuildAccent, MID_BuildAccent }, + { { (unichar_t *) _STR_Buildcomposit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuBuildComposite, MID_BuildComposite }, + { NULL } +}; + +static void balistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + SplineChar *sc; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) sc = NULL; else sc = mv->perchar[i].sc; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_BuildAccent: + mi->ti.disabled = sc==NULL || !SFIsSomethingBuildable(sc->parent,sc,true); + break; + case MID_BuildComposite: + mi->ti.disabled = sc==NULL || !SFIsSomethingBuildable(sc->parent,sc,false); + break; + } + } +} + +static GMenuItem ellist[] = { + { { (unichar_t *) _STR_Fontinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 'F', ksm_control|ksm_shift, NULL, NULL, MVMenuFontInfo }, + { { (unichar_t *) _STR_Charinfo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control, NULL, NULL, MVMenuCharInfo, MID_CharInfo }, + { { (unichar_t *) _STR_ShowDependents, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'I', ksm_control|ksm_meta, NULL, NULL, MVMenuShowDependents, MID_ShowDependents }, + { { (unichar_t *) _STR_Findprobs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, 'E', ksm_control, NULL, NULL, MVMenuFindProblems, MID_FindProblems }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Bitmapsavail, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'A' }, 'B', ksm_control|ksm_shift, NULL, NULL, MVMenuBitmaps, MID_AvailBitmaps }, + { { (unichar_t *) _STR_Regenbitmaps, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'B', ksm_control, NULL, NULL, MVMenuBitmaps, MID_RegenBitmaps }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Transform, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\\', ksm_control, NULL, NULL, MVMenuTransform, MID_Transform }, + { { (unichar_t *) _STR_Stroke, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 'E', ksm_control|ksm_shift, NULL, NULL, MVMenuStroke, MID_Stroke }, +#ifdef FONTFORGE_CONFIG_TILEPATH + { { (unichar_t *) _STR_TilePath, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '\0', ksm_control|ksm_shift, NULL, NULL, MVMenuTilePath, MID_TilePath }, +#endif + { { (unichar_t *) _STR_Rmoverlap, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control|ksm_shift, rmlist, NULL, NULL, MID_RmOverlap }, + { { (unichar_t *) _STR_Simplify, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_control|ksm_shift, smlist, NULL, NULL, MID_Simplify }, + { { (unichar_t *) _STR_AddExtrema, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'x' }, 'X', ksm_control|ksm_shift, NULL, NULL, MVMenuAddExtrema, MID_AddExtrema }, + { { (unichar_t *) _STR_Round2int, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, '_', ksm_control|ksm_shift, NULL, NULL, MVMenuRound2Int, MID_Round }, + { { (unichar_t *) _STR_Effects, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control|ksm_shift, eflist, NULL, NULL, MID_Effects }, + { { (unichar_t *) _STR_MetaFont, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, '!', ksm_control|ksm_shift, NULL, NULL, MVMenuMetaFont, MID_MetaFont }, + { { (unichar_t *) _STR_Autotrace, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'r' }, 'T', ksm_control|ksm_shift, NULL, NULL, MVMenuAutotrace, MID_Autotrace }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Correct, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, 'D', ksm_control|ksm_shift, NULL, NULL, MVMenuCorrectDir, MID_Correct }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Build, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, 'A', ksm_control|ksm_shift, balist, balistcheck, NULL, MID_BuildAccent }, + { NULL } +}; + +static GMenuItem dummyall[] = { + { { (unichar_t *) _STR_All, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 1, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_shift|ksm_control, NULL, NULL, NULL }, + NULL +}; + +/* Builds up a menu containing all the anchor classes */ +static void aplistbuild(GWindow base,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(base); + extern void GMenuItemArrayFree(GMenuItem *mi); + + if ( mi->sub!=dummyall ) { + GMenuItemArrayFree(mi->sub); + mi->sub = NULL; + } + + _aplistbuild(mi,mv->fv->sf,MVMenuAnchorPairs); +} + +static GMenuItem cblist[] = { + { { (unichar_t *) _STR_KernPairs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_shift|ksm_control, NULL, NULL, MVMenuKernPairs, MID_KernPairs }, + { { (unichar_t *) _STR_AnchoredPairs, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'K' }, '\0', ksm_shift|ksm_control, dummyall, aplistbuild, MVMenuAnchorPairs, MID_AnchorPairs }, + { { (unichar_t *) _STR_Ligatures, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'L' }, '\0', ksm_shift|ksm_control, NULL, NULL, MVMenuLigatures, MID_Ligatures }, + NULL +}; + +static void cblistcheck(GWindow gw,struct gmenuitem *mi, GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + SplineFont *sf = mv->fv->sf; + int i, anyligs=0, anykerns=0; + PST *pst; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_ligature ) { + anyligs = true; + if ( anykerns ) + break; + } + } + if ( (mv->vertical ? sf->chars[i]->vkerns : sf->chars[i]->kerns)!=NULL ) { + anykerns = true; + if ( anyligs ) + break; + } + } + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Ligatures: + mi->ti.disabled = !anyligs; + break; + case MID_KernPairs: + mi->ti.disabled = !anykerns; + break; + case MID_AnchorPairs: + mi->ti.disabled = sf->anchor==NULL; + break; + } + } +} + +static GMenuItem vwlist[] = { + { { (unichar_t *) _STR_Zoomout, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'o' }, '-', ksm_control|ksm_meta, NULL, NULL, MVMenuScale, MID_ZoomOut }, + { { (unichar_t *) _STR_Zoomin, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'i' }, '+', ksm_shift|ksm_control|ksm_meta, NULL, NULL, MVMenuScale, MID_ZoomIn }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_InsertCharA, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, MVMenuInsertChar, MID_InsertCharA }, + { { (unichar_t *) _STR_InsertCharB, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'B' }, '\0', ksm_control, NULL, NULL, MVMenuInsertChar, MID_InsertCharB }, + { { (unichar_t *) _STR_ReplaceChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'R' }, 'G', ksm_control, NULL, NULL, MVMenuChangeChar, MID_ReplaceChar }, + { { (unichar_t *) _STR_NextChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'N' }, ']', ksm_control, NULL, NULL, MVMenuChangeChar, MID_Next }, + { { (unichar_t *) _STR_PrevChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, '[', ksm_control, NULL, NULL, MVMenuChangeChar, MID_Prev }, + { { (unichar_t *) _STR_NextDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'D' }, ']', ksm_control|ksm_meta, NULL, NULL, MVMenuChangeChar, MID_NextDef }, + { { (unichar_t *) _STR_PrevDefChar, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'a' }, '[', ksm_control|ksm_meta, NULL, NULL, MVMenuChangeChar, MID_PrevDef }, + { { (unichar_t *) _STR_FindInFontView, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, '<', ksm_shift|ksm_control, NULL, NULL, MVMenuFindInFontView, MID_FindInFontView }, + { { (unichar_t *) _STR_Substitutions, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, '\0', ksm_shift|ksm_control, NULL, NULL, NULL, MID_Substitutions }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Combinations, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'b' }, '\0', ksm_shift|ksm_control, cblist, cblistcheck }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Hidegrid, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'G' }, '\0', ksm_control, NULL, NULL, MVMenuShowGrid, MID_ShowGrid }, + { { (unichar_t *) _STR_Antialias, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'A' }, '5', ksm_control, NULL, NULL, MVMenuAA, MID_AntiAlias }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Vertical, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, '\0' }, '\0', ksm_control, NULL, NULL, MVMenuVertical, MID_Vertical }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_OutlineMn, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 1, 0, 0, 0, 0, 1, 0, 'O' }, '\0', ksm_control, NULL, NULL, MVMenuShowBitmap, MID_Outline }, + { NULL }, /* Some extra room to show bitmaps */ + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, { NULL }, + { NULL } +}; + +static GMenuItem mtlist[] = { + { { (unichar_t *) _STR_Center, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, '\0', ksm_control, NULL, NULL, MVMenuCenter, MID_Center }, + { { (unichar_t *) _STR_Thirds, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, MVMenuCenter, MID_Thirds }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_KernByClasses, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, MVMenuKernByClasses }, + { { (unichar_t *) _STR_VKernByClasses, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, MVMenuVKernByClasses, MID_VKernClass }, + { { (unichar_t *) _STR_VKernFromHKern, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'T' }, '\0', ksm_control, NULL, NULL, MVMenuVKernFromHKern, MID_VKernFromHKern }, + { NULL } +}; + +static void fllistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_OpenBitmap: + mi->ti.disabled = mv->fv->sf->bitmaps==NULL; + break; + case MID_Recent: + mi->ti.disabled = !RecentFilesAny(); + break; + case MID_Display: + mi->ti.disabled = (mv->fv->sf->onlybitmaps && mv->fv->sf->bitmaps==NULL) || + mv->fv->sf->multilayer; + break; + } + } +} + +static void edlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i; + + if ( GWindowGetFocusGadgetOfWindow(gw)!=NULL ) + i = -1; + else + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_Join: + case MID_Copy: case MID_CopyRef: case MID_CopyWidth: + case MID_CopyLBearing: case MID_CopyRBearing: + case MID_Cut: case MID_Clear: + mi->ti.disabled = i==-1; + break; + case MID_CopyVWidth: + mi->ti.disabled = i==-1 || !mv->fv->sf->hasvmetrics; + break; + case MID_Undo: + mi->ti.disabled = i==-1 || mv->perchar[i].sc->layers[ly_fore].undoes==NULL; + break; + case MID_Redo: + mi->ti.disabled = i==-1 || mv->perchar[i].sc->layers[ly_fore].redoes==NULL; + break; + case MID_UnlinkRef: + mi->ti.disabled = i==-1 || mv->perchar[i].sc->layers[ly_fore].refs==NULL; + break; + case MID_Paste: + mi->ti.disabled = i==-1 || + (!CopyContainsSomething() && +#ifndef _NO_LIBPNG + !GDrawSelectionHasType(mv->gw,sn_clipboard,"image/png") && +#endif + !GDrawSelectionHasType(mv->gw,sn_clipboard,"image/bmp") && + !GDrawSelectionHasType(mv->gw,sn_clipboard,"image/eps")); + break; + } + } +} + +static void ellistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i, anybuildable; + SplineChar *sc; + int order2 = mv->fv->sf->order2; + + for ( i=mv->charcnt-1; i>=0; --i ) + if ( mv->perchar[i].selected ) + break; + if ( i==-1 ) sc = NULL; else sc = mv->perchar[i].sc; + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_RegenBitmaps: + mi->ti.disabled = mv->fv->sf->bitmaps==NULL; + break; + case MID_CharInfo: + mi->ti.disabled = sc==NULL /*|| mv->fv->cidmaster!=NULL*/; + break; + case MID_ShowDependents: + mi->ti.disabled = sc==NULL || sc->dependents == NULL; + break; + case MID_MetaFont: + mi->ti.disabled = sc==NULL || order2; + break; + case MID_FindProblems: + case MID_Transform: + mi->ti.disabled = sc==NULL; + break; + case MID_RmOverlap: case MID_Effects: + mi->ti.disabled = sc==NULL || mv->fv->sf->onlybitmaps || order2; + break; + case MID_Stroke: + mi->ti.disabled = sc==NULL || mv->fv->sf->onlybitmaps || order2; + break; + case MID_AddExtrema: + case MID_Round: case MID_Correct: + mi->ti.disabled = sc==NULL || mv->fv->sf->onlybitmaps; + break; +#ifdef FONTFORGE_CONFIG_TILEPATH + case MID_TilePath: + mi->ti.disabled = sc==NULL || mv->fv->sf->onlybitmaps || ClipBoardToSplineSet()==NULL || order2; + break; +#endif + case MID_Simplify: + mi->ti.disabled = sc==NULL || mv->fv->sf->onlybitmaps; +#if 0 + free(mi->ti.text); + if ( e==NULL || !(e->u.mouse.state&ksm_shift) ) { + mi->ti.text = u_copy(GStringGetResource(_STR_Simplify,NULL)); + mi->short_mask = ksm_control|ksm_shift; + mi->invoke = MVMenuSimplify; + } else { + mi->ti.text = u_copy(GStringGetResource(_STR_SimplifyMore,NULL)); + mi->short_mask = (ksm_control|ksm_meta|ksm_shift); + mi->invoke = MVMenuSimplifyMore; + } +#endif + break; + case MID_BuildAccent: + anybuildable = false; + if ( sc!=NULL && SFIsSomethingBuildable(mv->fv->sf,sc,false) ) + anybuildable = true; + mi->ti.disabled = !anybuildable; + break; + case MID_Autotrace: + mi->ti.disabled = !(FindAutoTraceName()!=NULL && sc!=NULL && + sc->layers[ly_back].images!=NULL ); + break; + } + } +} + +static void vwlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + int i, j, base, aselection; + BDFFont *bdf; + unichar_t buffer[60]; + extern void GMenuItemArrayFree(GMenuItem *mi); + extern GMenuItem *GMenuItemArrayCopy(GMenuItem *mi, uint16 *cnt); + + aselection = false; + for ( j=0; jcharcnt; ++j ) + if ( mv->perchar[j].selected ) { + aselection = true; + break; + } + + for ( i=0; vwlist[i].mid!=MID_Outline; ++i ) + switch ( vwlist[i].mid ) { + case MID_ZoomIn: + vwlist[i].ti.disabled = mv->bdf!=NULL || mv->scale_index==0; + break; + case MID_ZoomOut: + vwlist[i].ti.disabled = mv->bdf!=NULL || mv->scale_index>=sizeof(mv_scales)/sizeof(mv_scales[0])-1; + break; + case MID_ShowGrid: + vwlist[i].ti.text = (unichar_t *) GStringGetResource(mv->showgrid?_STR_Hidegrid:_STR_Showgrid,NULL); + vwlist[i].ti.text_in_resource = false; + break; + case MID_AntiAlias: + vwlist[i].ti.checked = mv->antialias; + vwlist[i].ti.disabled = mv->bdf!=NULL; + break; + case MID_ReplaceChar: + case MID_FindInFontView: + case MID_Next: + case MID_Prev: + case MID_NextDef: + case MID_PrevDef: + vwlist[i].ti.disabled = !aselection; + break; + case MID_Substitutions: + PosSubsMenuFree(vwlist[i].sub); + vwlist[i].sub = NULL; + if ( !aselection || (mv->perchar[j].sc->possub==NULL && mv->perchar[j].basesc==NULL) ) + vwlist[i].ti.disabled = true; + else { + vwlist[i].sub = SubsMenuBuild(mv->perchar[j].sc,mv->perchar[j].basesc); + vwlist[i].ti.disabled = (vwlist[i].sub == NULL); + } + break; + case MID_Vertical: + vwlist[i].ti.checked = mv->vertical; + vwlist[i].ti.disabled = !mv->fv->sf->hasvmetrics; + break; + } + base = i+1; + for ( i=base; vwlist[i].ti.text!=NULL; ++i ) { + free( vwlist[i].ti.text); + vwlist[i].ti.text = NULL; + } + + vwlist[base-1].ti.checked = mv->bdf==NULL; + if ( mv->fv->sf->bitmaps!=NULL ) { + for ( bdf = mv->fv->sf->bitmaps, i=base; + inext ) { + if ( BDFDepth(bdf)==1 ) + u_sprintf( buffer, GStringGetResource(_STR_DPixelBitmap,NULL), bdf->pixelsize ); + else + u_sprintf( buffer, GStringGetResource(_STR_DdPixelBitmap,NULL), + bdf->pixelsize, BDFDepth(bdf) ); + vwlist[i].ti.text = u_copy(buffer); + vwlist[i].ti.checkable = true; + vwlist[i].ti.checked = bdf==mv->bdf; + vwlist[i].ti.userdata = bdf; + vwlist[i].invoke = MVMenuShowBitmap; + vwlist[i].ti.fg = vwlist[i].ti.bg = COLOR_DEFAULT; + } + } + GMenuItemArrayFree(mi->sub); + mi->sub = GMenuItemArrayCopy(vwlist,NULL); +} + +static void mtlistcheck(GWindow gw,struct gmenuitem *mi,GEvent *e) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + for ( mi = mi->sub; mi->ti.text!=NULL || mi->ti.line ; ++mi ) { + switch ( mi->mid ) { + case MID_VKernClass: + case MID_VKernFromHKern: + mi->ti.disabled = !mv->fv->sf->hasvmetrics; + break; + } + } +} + +static GMenuItem mblist[] = { + { { (unichar_t *) _STR_File, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'F' }, 0, 0, fllist, fllistcheck }, + { { (unichar_t *) _STR_Edit, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'E' }, 0, 0, edlist, edlistcheck }, + { { (unichar_t *) _STR_Element, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'l' }, 0, 0, ellist, ellistcheck }, + { { (unichar_t *) _STR_View, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'V' }, 0, 0, vwlist, vwlistcheck }, + { { (unichar_t *) _STR_Metric, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'M' }, 0, 0, mtlist, mtlistcheck }, + { { (unichar_t *) _STR_Window, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'W' }, 0, 0, NULL, WindowMenuBuild, NULL }, + { { (unichar_t *) _STR_Help, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'H' }, 0, 0, helplist, NULL }, + { NULL } +}; + +static void MVResize(MetricsView *mv,GEvent *event) { + GRect pos; + int i; + int size; + + if ( event->u.resize.size.height < mv->topend+20 + mv->height-mv->displayend || + event->u.resize.size.width < 30 ) { + int width= event->u.resize.size.width < 30 ? 30 : event->u.resize.size.width; + int height; + + if ( event->u.resize.size.height < mv->topend+20 + mv->height-mv->displayend ) + height = mv->topend+20 + mv->height-mv->displayend; + else + height = event->u.resize.size.height; + GDrawResize(mv->gw,width,height); +return; + } + + mv->width = event->u.resize.size.width; + mv->displayend = event->u.resize.size.height - (mv->height-mv->displayend); + mv->height = event->u.resize.size.height; + + pos.width = event->u.resize.size.width; + pos.height = mv->sbh; + pos.y = event->u.resize.size.height - pos.height; pos.x = 0; + GGadgetResize(mv->hsb,pos.width,pos.height); + GGadgetMove(mv->hsb,pos.x,pos.y); + + mv->dwidth = mv->width - mv->sbh; + GGadgetResize(mv->vsb,mv->sbh,mv->displayend-mv->topend); + GGadgetMove(mv->vsb,event->u.resize.size.width-mv->sbh,mv->topend); + + size = (mv->displayend - mv->topend - 4); + if ( mv->dwidth-20dwidth-20; + mv->pixelsize = mv_scales[mv->scale_index]*size; + + for ( i=0; imax; ++i ) if ( mv->perchar[i].width!=NULL ) { + GGadgetMove(mv->perchar[i].name,mv->perchar[i].mx,mv->displayend+2); + GGadgetMove(mv->perchar[i].width,mv->perchar[i].mx,mv->displayend+2+mv->fh+4); + GGadgetMove(mv->perchar[i].lbearing,mv->perchar[i].mx,mv->displayend+2+2*(mv->fh+4)); + GGadgetMove(mv->perchar[i].rbearing,mv->perchar[i].mx,mv->displayend+2+3*(mv->fh+4)); + if ( mv->perchar[i].kern!=NULL ) + GGadgetMove(mv->perchar[i].kern,mv->perchar[i].mx-mv->perchar[i].mwidth/2,mv->displayend+2+4*(mv->fh+4)); + if ( i!=0 ) + MVRefreshKern(mv,i); + } + MVSetAnchor(mv); + GGadgetMove(mv->namelab,2,mv->displayend+2); + GGadgetMove(mv->widthlab,2,mv->displayend+2+mv->fh+4); + GGadgetMove(mv->lbearinglab,2,mv->displayend+2+2*(mv->fh+4)); + GGadgetMove(mv->rbearinglab,2,mv->displayend+2+3*(mv->fh+4)); + GGadgetMove(mv->kernlab,2,mv->displayend+2+4*(mv->fh+4)); + + MVReRasterize(mv); + MVSetVSb(mv); + MVSetSb(mv); + + GDrawRequestExpose(mv->gw,NULL,true); +} + +static void MVChar(MetricsView *mv,GEvent *event) { + if ( event->u.chr.keysym=='s' && + (event->u.chr.state&ksm_control) && + (event->u.chr.state&ksm_meta) ) + MenuSaveAll(NULL,NULL,NULL); + else if ( event->u.chr.keysym=='I' && + (event->u.chr.state&ksm_shift) && + (event->u.chr.state&ksm_meta) ) + MVMenuCharInfo(mv->gw,NULL,NULL); + else if ( event->u.chr.keysym == GK_Help ) { + MenuHelp(NULL,NULL,NULL); /* Menu does F1 */ + } +} + +static int hitsbit(BDFChar *bc, int x, int y) { + if ( bc->byte_data ) +return( bc->bitmap[y*bc->bytes_per_line+x] ); + else +return( bc->bitmap[y*bc->bytes_per_line+(x>>3)]&(1<<(7-(x&7))) ); +} + +static struct aplist *hitsaps(MetricsView *mv,int i, int x,int y) { + SplineFont *sf = mv->fv->sf; + int emsize = sf->ascent+sf->descent; + double scale = mv->pixelsize / (double) emsize; + struct aplist *apl; + int ax, ay; + + for ( apl = mv->perchar[i].aps; apl!=NULL; apl=apl->next ) { + ax = apl->ap->me.x*scale; + ay = apl->ap->me.y*scale; + if ( x>ax-3 && xay-3 && yfv->sf; + int as = rint(mv->pixelsize*sf->ascent/(double) (sf->ascent+sf->descent)); + double scale = mv->pixelsize/(double) (sf->ascent+sf->descent); + + xbase = mv->dwidth/2; + within = -1; + for ( i=0; icharcnt; ++i ) { + y = mv->perchar[i].dy + mv->perchar[i].yoff; + x = xbase - mv->pixelsize/2 - mv->perchar[i].xoff; + if ( mv->bdf==NULL ) { + if ( event->u.mouse.x >= x+mv->perchar[i].show->xmin && + event->u.mouse.x <= x+mv->perchar[i].show->xmax && + event->u.mouse.y <= (y+as)-mv->perchar[i].show->ymin && + event->u.mouse.y >= (y+as)-mv->perchar[i].show->ymax && + hitsbit(mv->perchar[i].show,event->u.mouse.x-x-mv->perchar[i].show->xmin, + event->u.mouse.y-(y+as-mv->perchar[i].show->ymax)) ) + break; + } + y += -mv->perchar[i].yoff; + if ( event->u.mouse.y >= y && event->u.mouse.y < y+mv->perchar[i].dheight+ mv->perchar[i].kernafter+ mv->perchar[i].voff ) + within = i; + } + if ( i==mv->charcnt ) + sc = NULL; + else + sc = mv->perchar[i].sc; + + diff = event->u.mouse.y-mv->pressed_y; + sel = onwidth = onkern = false; + if ( sc==NULL ) { + if ( within>0 && mv->perchar[within-1].selected && + event->u.mouse.yperchar[within].dy+3 ) + onwidth = true; /* previous char */ + else if ( within!=-1 && within+1charcnt && + mv->perchar[within+1].selected && + event->u.mouse.y>mv->perchar[within+1].dy-3 ) + onkern = true; /* subsequent char */ + else if ( within>=0 && mv->perchar[within].selected && + event->u.mouse.yperchar[within].dy+3 ) + onkern = true; + else if ( within>=0 && + event->u.mouse.y>mv->perchar[within].dy+mv->perchar[within].dheight+mv->perchar[within].kernafter+mv->perchar[within].voff-3 ) { + onwidth = true; + sel = true; + } + } + + if ( event->type != et_mousemove || !mv->pressed ) { + int ct = -1; + if ( mv->bdf!=NULL ) { + if ( mv->cursor!=ct_mypointer ) + ct = ct_mypointer; + } else if ( sc!=NULL ) { + if ( mv->cursor!=ct_lbearing ) + ct = ct_lbearing; + } else if ( onwidth ) { + if ( mv->cursor!=ct_rbearing ) + ct = ct_rbearing; + } else if ( onkern ) { + if ( mv->cursor!=ct_kerning ) + ct = ct_kerning; + } else { + if ( mv->cursor!=ct_mypointer ) + ct = ct_mypointer; + } + if ( ct!=-1 ) { + GDrawSetCursor(mv->gw,ct); + mv->cursor = ct; + } + } + + if ( event->type == et_mousemove && !mv->pressed ) { + if ( sc==NULL && within!=-1 ) + sc = mv->perchar[within].sc; + if ( sc!=NULL ) + SCPreparePopup(mv->gw,sc); +/* Don't allow any editing when displaying a bitmap font */ + } else if ( event->type == et_mousedown && mv->bdf==NULL ) { + CVPaletteDeactivate(); + if ( sc!=NULL ) { + for ( j=0; jcharcnt; ++j ) + if ( j!=i && mv->perchar[j].selected ) + MVDeselectChar(mv,j); + MVSelectChar(mv,i); + GWindowClearFocusGadgetOfWindow(mv->gw); + if ( event->u.mouse.button==3 ) + MVPopupMenu(mv,event,i); + else + mv->pressed = true; + } else if ( within!=-1 ) { + mv->pressedwidth = onwidth; + mv->pressedkern = onkern; + if ( mv->pressedwidth || mv->pressedkern ) { + mv->pressed = true; + if ( sel && !mv->perchar[within].selected ) { + MVDoSelect(mv,within); + } + } + } else if ( event->u.mouse.yperchar[mv->charcnt-1].dy+ + mv->perchar[mv->charcnt-1].dheight+ + mv->perchar[mv->charcnt-1].kernafter+ + mv->perchar[mv->charcnt-1].voff+3 ) { + mv->pressed = mv->pressedwidth = true; + GDrawSetCursor(mv->gw,ct_rbearing); + mv->cursor = ct_rbearing; + if ( !mv->perchar[mv->charcnt-1].selected ) + MVDoSelect(mv,mv->charcnt-1); + } + mv->pressed_y = event->u.mouse.y; + } else if ( event->type == et_mousemove && mv->pressed ) { + for ( i=0; icharcnt && !mv->perchar[i].selected; ++i ); + if ( mv->pressedwidth ) { + int ow = mv->perchar[i].dwidth; + mv->perchar[i].dwidth = rint(mv->perchar[i].sc->vwidth*scale) + diff; + if ( ow!=mv->perchar[i].dwidth ) { + for ( j=i+1; jcharcnt; ++j ) + mv->perchar[j].dy = mv->perchar[j-1].dy+mv->perchar[j-1].dheight+ + mv->perchar[j-1].kernafter+ mv->perchar[j-1].voff; + GDrawRequestExpose(mv->gw,NULL,false); + } + } else if ( mv->pressedkern ) { + int ow = mv->perchar[i-1].kernafter; + KernPair *kp; + int kpoff; + KernClass *kc; + int index; + for ( kp = mv->perchar[i-1].sc->vkerns; kp!=NULL && kp->sc!=mv->perchar[i].sc; kp = kp->next ); + if ( kp!=NULL ) + kpoff = kp->off; + else if ((kc=SFFindVKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false))!=NULL ) + kpoff = kc->offsets[index]; + else + kpoff = 0; + kpoff = kpoff * mv->pixelsize / + (mv->fv->sf->descent+mv->fv->sf->ascent); + mv->perchar[i-1].kernafter = kpoff + diff; + if ( ow!=mv->perchar[i-1].kernafter ) { + for ( j=i; jcharcnt; ++j ) + mv->perchar[j].dy = mv->perchar[j-1].dy+mv->perchar[j-1].dheight+ + mv->perchar[j-1].kernafter+ mv->perchar[j-1].voff; + GDrawRequestExpose(mv->gw,NULL,false); + } + } else { + int olda = mv->activeoff; + mv->activeoff = diff; + MVRedrawI(mv,i,mv->perchar[i].show->xmin+olda,mv->perchar[i].show->xmax+olda); + } + } else if ( event->type == et_mouseup && event->u.mouse.clicks>1 && + (within!=-1 || sc!=NULL)) { + mv->pressed = false; mv->activeoff = 0; + mv->pressedwidth = mv->pressedkern = false; + if ( within==-1 ) within = i; + if ( mv->bdf==NULL ) + CharViewCreate(mv->perchar[within].sc,mv->fv); + else + BitmapViewCreate(mv->bdf->chars[mv->perchar[within].sc->enc],mv->bdf,mv->fv); + } else if ( event->type == et_mouseup && mv->pressed ) { + for ( i=0; icharcnt && !mv->perchar[i].selected; ++i ); + mv->pressed = false; + mv->activeoff = 0; + sc = mv->perchar[i].sc; + if ( mv->pressedwidth ) { + mv->pressedwidth = false; + diff = diff*(mv->fv->sf->ascent+mv->fv->sf->descent)/mv->pixelsize; + if ( diff!=0 ) { + SCPreserveWidth(sc); + sc->vwidth += diff; + SCCharChangedUpdate(sc); + for ( ; icharcnt; ++i ) + mv->perchar[i].dy = mv->perchar[i-1].dy+mv->perchar[i-1].dheight + + mv->perchar[i-1].kernafter + mv->perchar[i-1].voff; + GDrawRequestExpose(mv->gw,NULL,false); + } + } else if ( mv->pressedkern ) { + mv->pressedkern = false; + diff = diff/scale; + if ( diff!=0 ) { + KernPair *kp; + KernClass *kc=NULL; + int index; + for ( kp=mv->perchar[i-1].sc->vkerns; kp!=NULL && kp->sc!=mv->perchar[i].sc; kp = kp->next ); + if ( kp==NULL ) + kc=SFFindVKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,true); + if ( kc!=NULL ) { + if ( kc->offsets[index]==0 && !AskNewKernClassEntry(mv->perchar[i-1].sc,mv->perchar[i].sc)) + kc=NULL; + else + kc->offsets[index] += diff; + } + if ( kc==NULL ) { + if ( kp==NULL ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = mv->perchar[i].sc; + kp->next = mv->perchar[i-1].sc->vkerns; + mv->perchar[i-1].sc->vkerns = kp; + } + kp->off += diff; + kp->sli = mv->cur_sli; + } + mv->perchar[i-1].kernafter = (kp==NULL?kc->offsets[index]:kp->off)*scale; + MVRefreshValues(mv,i-1,mv->perchar[i-1].sc); + for ( ; icharcnt; ++i ) + mv->perchar[i].dy = mv->perchar[i-1].dy+mv->perchar[i-1].dheight + + mv->perchar[i-1].kernafter + mv->perchar[i-1].voff; + MVSetAnchor(mv); + GDrawRequestExpose(mv->gw,NULL,false); + mv->fv->sf->changed = true; + } + } else { + real transform[6]; + DBounds bb; + SplineCharFindBounds(sc,&bb); + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[4] = 0; + transform[5] = -diff/scale; + if ( transform[5]!=0 ) + FVTrans(mv->fv,sc,transform,NULL,false); + } + } else if ( event->type == et_mouseup && mv->bdf!=NULL && within!=-1 ) { + for ( j=0; jcharcnt; ++j ) + if ( j!=within && mv->perchar[j].selected ) + MVDeselectChar(mv,j); + MVSelectChar(mv,within); + } +} + +static void MVMouse(MetricsView *mv,GEvent *event) { + int i, x, y, j, within, sel, ybase; + SplineChar *sc; + struct aplist *apl=NULL; + int diff; + int onwidth, onkern; + + GGadgetEndPopup(); + if ( event->u.mouse.y< mv->topend || event->u.mouse.y >= mv->displayend ) { + if ( event->u.mouse.y >= mv->displayend && + event->u.mouse.yheight-mv->sbh ) { + event->u.mouse.x += (mv->coff*mv->mwidth); + for ( i=0; icharcnt; ++i ) { + if ( event->u.mouse.x >= mv->perchar[i].mx && + event->u.mouse.x < mv->perchar[i].mx+mv->perchar[i].mwidth ) + break; + } + if ( icharcnt ) + SCPreparePopup(mv->gw,mv->perchar[i].sc); + } + if ( mv->cursor!=ct_mypointer ) { + GDrawSetCursor(mv->gw,ct_mypointer); + mv->cursor = ct_mypointer; + } +return; + } + + if ( event->type==et_mouseup ) { + event->type = et_mousemove; + MVMouse(mv,event); + event->u.mouse.x -= mv->xoff; + event->u.mouse.y -= mv->yoff; + event->type = et_mouseup; + } + + event->u.mouse.x += mv->xoff; + event->u.mouse.y += mv->yoff; + if ( mv->vertical ) { + _MVVMouse(mv,event); +return; + } + + ybase = mv->topend + 2 + (mv->pixelsize/mv_scales[mv->scale_index] * mv->fv->sf->ascent / + (mv->fv->sf->ascent+mv->fv->sf->descent)); + within = -1; + for ( i=0; icharcnt; ++i ) { + x = mv->perchar[i].dx + mv->perchar[i].xoff; + if ( mv->right_to_left ) + x = mv->dwidth - x - mv->perchar[i].dwidth - mv->perchar[i].kernafter - mv->perchar[i].hoff; + y = ybase - mv->perchar[i].yoff; + if ( mv->bdf==NULL ) { + if ( mv->perchar[i].selected && mv->perchar[i].aps!=NULL && + (apl=hitsaps(mv,i,event->u.mouse.x-x,y-event->u.mouse.y))!=NULL ) + break; + if ( event->u.mouse.x >= x+mv->perchar[i].show->xmin && + event->u.mouse.x <= x+mv->perchar[i].show->xmax && + event->u.mouse.y <= y-mv->perchar[i].show->ymin && + event->u.mouse.y >= y-mv->perchar[i].show->ymax && + hitsbit(mv->perchar[i].show,event->u.mouse.x-x-mv->perchar[i].show->xmin, + mv->perchar[i].show->ymax-(y-event->u.mouse.y)) ) + break; + } + x += mv->right_to_left ? mv->perchar[i].xoff : -mv->perchar[i].xoff; + if ( event->u.mouse.x >= x && event->u.mouse.x < x+mv->perchar[i].dwidth+ mv->perchar[i].kernafter+ mv->perchar[i].hoff ) + within = i; + } + if ( i==mv->charcnt ) + sc = NULL; + else + sc = mv->perchar[i].sc; + + diff = event->u.mouse.x-mv->pressed_x; + /*if ( mv->right_to_left ) diff = -diff;*/ + sel = onwidth = onkern = false; + if ( sc==NULL && apl==NULL ) { + if ( !mv->right_to_left ) { + if ( within>0 && mv->perchar[within-1].selected && + event->u.mouse.xperchar[within].dx+3 ) + onwidth = true; /* previous char */ + else if ( within!=-1 && within+1charcnt && + mv->perchar[within+1].selected && + event->u.mouse.x>mv->perchar[within+1].dx-3 ) + onkern = true; /* subsequent char */ + else if ( within>=0 && mv->perchar[within].selected && + event->u.mouse.xperchar[within].dx+3 ) + onkern = true; + else if ( within>=0 && + event->u.mouse.x>mv->perchar[within].dx+mv->perchar[within].dwidth+mv->perchar[within].kernafter+mv->perchar[within].hoff-3 ) { + onwidth = true; + sel = true; + } + } else { + if ( within>0 && mv->perchar[within-1].selected && + event->u.mouse.x>mv->dwidth-(mv->perchar[within].dx+3) ) + onwidth = true; /* previous char */ + else if ( within!=-1 && within+1charcnt && + mv->perchar[within+1].selected && + event->u.mouse.xdwidth-(mv->perchar[within+1].dx-3) ) + onkern = true; /* subsequent char */ + else if ( within>=0 && mv->perchar[within].selected && + event->u.mouse.x>mv->dwidth-(mv->perchar[within].dx+3) ) + onkern = true; + else if ( within>=0 && + event->u.mouse.xdwidth-(mv->perchar[within].dx+mv->perchar[within].dwidth+mv->perchar[within].kernafter+mv->perchar[within].hoff-3) ) { + onwidth = true; + sel = true; + } + } + } + + if ( event->type != et_mousemove || !mv->pressed ) { + int ct = -1; + if ( mv->bdf!=NULL ) { + if ( mv->cursor!=ct_mypointer ) + ct = ct_mypointer; + } else if ( apl!=NULL ) { + if ( mv->cursor!=ct_4way ) + ct = ct_4way; + } else if ( sc!=NULL ) { + if ( mv->cursor!=ct_lbearing ) + ct = ct_lbearing; + } else if ( onwidth ) { + if ( mv->cursor!=ct_rbearing ) + ct = ct_rbearing; + } else if ( onkern ) { + if ( mv->cursor!=ct_kerning ) + ct = ct_kerning; + } else { + if ( mv->cursor!=ct_mypointer ) + ct = ct_mypointer; + } + if ( ct!=-1 ) { + GDrawSetCursor(mv->gw,ct); + mv->cursor = ct; + } + } + + if ( event->type == et_mousemove && !mv->pressed ) { + if ( sc==NULL && within!=-1 ) + sc = mv->perchar[within].sc; + if ( sc!=NULL ) + SCPreparePopup(mv->gw,sc); +/* Don't allow any editing when displaying a bitmap font */ + } else if ( event->type == et_mousedown && mv->bdf==NULL ) { + CVPaletteDeactivate(); + if ( apl!=NULL ) { + mv->pressed_apl = apl; + apl->selected = true; + mv->pressed = true; + mv->ap_owner = i; + mv->xp = event->u.mouse.x; mv->yp = event->u.mouse.y; + mv->ap_start = apl->ap->me; + MVRedrawI(mv,i,0,0); + SCPreserveState(mv->perchar[i].sc,false); + GWindowClearFocusGadgetOfWindow(mv->gw); + } else if ( sc!=NULL ) { + for ( j=0; jcharcnt; ++j ) + if ( j!=i && mv->perchar[j].selected ) + MVDeselectChar(mv,j); + MVSelectChar(mv,i); + GWindowClearFocusGadgetOfWindow(mv->gw); + if ( event->u.mouse.button==3 ) + MVPopupMenu(mv,event,i); + else + mv->pressed = true; + } else if ( within!=-1 ) { + mv->pressedwidth = onwidth; + mv->pressedkern = onkern; + if ( mv->pressedwidth || mv->pressedkern ) { + mv->pressed = true; + if ( sel && !mv->perchar[within].selected ) { + MVDoSelect(mv,within); + } + } + } else if ( !mv->right_to_left && + event->u.mouse.xperchar[mv->charcnt-1].dx+mv->perchar[mv->charcnt-1].dwidth+mv->perchar[mv->charcnt-1].kernafter+mv->perchar[mv->charcnt-1].hoff+3 ) { + mv->pressed = mv->pressedwidth = true; + GDrawSetCursor(mv->gw,ct_rbearing); + mv->cursor = ct_rbearing; + if ( !mv->perchar[mv->charcnt-1].selected ) + MVDoSelect(mv,mv->charcnt-1); + } else if ( mv->right_to_left && + event->u.mouse.x>mv->dwidth - (mv->perchar[mv->charcnt-1].dx+mv->perchar[mv->charcnt-1].dwidth+mv->perchar[mv->charcnt-1].kernafter+mv->perchar[mv->charcnt-1].hoff+3) ) { + mv->pressed = mv->pressedwidth = true; + GDrawSetCursor(mv->gw,ct_rbearing); + mv->cursor = ct_rbearing; + if ( !mv->perchar[mv->charcnt-1].selected ) + MVDoSelect(mv,mv->charcnt-1); + } + mv->pressed_x = event->u.mouse.x; + } else if ( event->type == et_mousemove && mv->pressed ) { + for ( i=0; icharcnt && !mv->perchar[i].selected; ++i ); + if ( mv->pressed_apl ) { + double scale = mv->pixelsize/(double) (mv->fv->sf->ascent+mv->fv->sf->descent); + mv->pressed_apl->ap->me.x = mv->ap_start.x + (event->u.mouse.x-mv->xp)/scale; + mv->pressed_apl->ap->me.y = mv->ap_start.y + (mv->yp-event->u.mouse.y)/scale; + MVSetAnchor(mv); + MVRedrawI(mv,mv->ap_owner,0,0); + } else if ( mv->pressedwidth ) { + int ow = mv->perchar[i].dwidth; + if ( mv->right_to_left ) diff = -diff; + mv->perchar[i].dwidth = mv->perchar[i].show->width + diff; + if ( ow!=mv->perchar[i].dwidth ) { + for ( j=i+1; jcharcnt; ++j ) + mv->perchar[j].dx = mv->perchar[j-1].dx+mv->perchar[j-1].dwidth+ mv->perchar[j-1].kernafter+ mv->perchar[j-1].hoff; + GDrawRequestExpose(mv->gw,NULL,false); + } + } else if ( mv->pressedkern ) { + int ow = mv->perchar[i-1].kernafter; + KernPair *kp; + int kpoff; + KernClass *kc; + int index; + for ( kp = mv->perchar[i-1].sc->kerns; kp!=NULL && kp->sc!=mv->perchar[i].sc; kp = kp->next ); + if ( kp!=NULL ) + kpoff = kp->off; + else if ((kc=SFFindKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,false))!=NULL ) + kpoff = kc->offsets[index]; + else + kpoff = 0; + kpoff = kpoff * mv->pixelsize / + (mv->fv->sf->descent+mv->fv->sf->ascent); + if ( mv->right_to_left ) diff = -diff; + mv->perchar[i-1].kernafter = kpoff + diff; + if ( ow!=mv->perchar[i-1].kernafter ) { + for ( j=i; jcharcnt; ++j ) + mv->perchar[j].dx = mv->perchar[j-1].dx+mv->perchar[j-1].dwidth+ mv->perchar[j-1].kernafter+ mv->perchar[j-1].hoff; + GDrawRequestExpose(mv->gw,NULL,false); + } + } else { + int olda = mv->activeoff; + mv->activeoff = diff; + MVRedrawI(mv,i,mv->perchar[i].show->xmin+olda,mv->perchar[i].show->xmax+olda); + } + } else if ( event->type == et_mouseup && event->u.mouse.clicks>1 && + (within!=-1 || sc!=NULL)) { + mv->pressed = false; mv->activeoff = 0; + mv->pressedwidth = mv->pressedkern = false; + if ( mv->pressed_apl!=NULL ) { + mv->pressed_apl->selected = false; + mv->pressed_apl = NULL; + } + if ( within==-1 ) within = i; + if ( mv->bdf==NULL ) + CharViewCreate(mv->perchar[within].sc,mv->fv); + else + BitmapViewCreate(mv->bdf->chars[mv->perchar[within].sc->enc],mv->bdf,mv->fv); + } else if ( event->type == et_mouseup && mv->pressed ) { + for ( i=0; icharcnt && !mv->perchar[i].selected; ++i ); + mv->pressed = false; + mv->activeoff = 0; + sc = mv->perchar[i].sc; + if ( mv->pressed_apl!=NULL ) { + mv->pressed_apl->selected = false; + mv->pressed_apl = NULL; + MVRedrawI(mv,mv->ap_owner,0,0); + SCCharChangedUpdate(mv->perchar[mv->ap_owner].sc); + } else if ( mv->pressedwidth ) { + mv->pressedwidth = false; + if ( mv->right_to_left ) diff = -diff; + diff = diff*(mv->fv->sf->ascent+mv->fv->sf->descent)/mv->pixelsize; + if ( diff!=0 ) { + SCPreserveWidth(sc); + sc->width += diff; + SCCharChangedUpdate(sc); + } + } else if ( mv->pressedkern ) { + mv->pressedkern = false; + diff = diff*(mv->fv->sf->ascent+mv->fv->sf->descent)/mv->pixelsize; + if ( diff!=0 ) { + KernPair *kp; + KernClass *kc=NULL; + int index; + for ( kp= mv->perchar[i-1].sc->kerns; kp!=NULL && kp->sc!=mv->perchar[i].sc; kp = kp->next ); + if ( kp==NULL ) + kc= SFFindKernClass(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc,&index,true); + if ( mv->right_to_left ) diff = -diff; + if ( kc!=NULL ) { + if ( kc->offsets[index]==0 && !AskNewKernClassEntry(mv->perchar[i-1].sc,mv->perchar[i].sc)) + kc=NULL; + else + kc->offsets[index] += diff; + } + if ( kc==NULL ) { + MMKern(mv->fv->sf,mv->perchar[i-1].sc,mv->perchar[i].sc, + diff,mv->cur_sli,kp); + if ( kp==NULL ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = mv->perchar[i].sc; + kp->next = mv->perchar[i-1].sc->kerns; + mv->perchar[i-1].sc->kerns = kp; + } + kp->off += diff; + kp->sli = mv->cur_sli; + } + mv->perchar[i-1].kernafter = (kp==NULL?kc->offsets[index]:kp->off)*mv->pixelsize/ + (mv->fv->sf->ascent+mv->fv->sf->descent); + MVRefreshValues(mv,i-1,mv->perchar[i-1].sc); + for ( ; icharcnt; ++i ) + mv->perchar[i].dx = mv->perchar[i-1].dx+mv->perchar[i-1].dwidth + + mv->perchar[i-1].kernafter + mv->perchar[i-1].hoff; + MVSetAnchor(mv); + GDrawRequestExpose(mv->gw,NULL,false); + mv->fv->sf->changed = true; + } + } else { + real transform[6]; + DBounds bb; + SplineCharFindBounds(sc,&bb); + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[5] = 0; + transform[4] = diff* + (mv->fv->sf->ascent+mv->fv->sf->descent)/mv->pixelsize; + if ( transform[4]!=0 ) + FVTrans(mv->fv,sc,transform,NULL,false); + } + } else if ( event->type == et_mouseup && mv->bdf!=NULL && within!=-1 ) { + if ( mv->pressed_apl!=NULL ) { + mv->pressed_apl->selected = false; + mv->pressed_apl = NULL; + } + for ( j=0; jcharcnt; ++j ) + if ( j!=within && mv->perchar[j].selected ) + MVDeselectChar(mv,j); + MVSelectChar(mv,within); + } +} + +static void MVDrop(MetricsView *mv,GEvent *event) { + int x,ex = event->u.drag_drop.x + mv->xoff; + int y,ey = event->u.drag_drop.y + mv->yoff; + int within, i, cnt, ch; + int32 len; + char *cnames, *start, *pt; + unichar_t *newtext; + const unichar_t *oldtext; + SplineChar **founds; + /* We should get a list of character names. Add them before the character */ + /* on which they are dropped */ + + if ( !GDrawSelectionHasType(mv->gw,sn_drag_and_drop,"STRING")) +return; + cnames = GDrawRequestSelection(mv->gw,sn_drag_and_drop,"STRING",&len); + if ( cnames==NULL ) +return; + + within = mv->charcnt; + if ( !mv->vertical ) { + for ( i=0; icharcnt; ++i ) { + x = mv->perchar[i].dx; + if ( mv->right_to_left ) + x = mv->dwidth - x - mv->perchar[i].dwidth - mv->perchar[i].kernafter - mv->perchar[i].hoff; + if ( ex >= x && ex < x+mv->perchar[i].dwidth+ mv->perchar[i].kernafter+ mv->perchar[i].hoff ) { + within = i; + break; + } + } + } else { + for ( i=0; icharcnt; ++i ) { + y = mv->perchar[i].dy; + if ( ey >= y && ey < y+mv->perchar[i].dheight+ + mv->perchar[i].kernafter+ mv->perchar[i].voff ) { + within = i; + break; + } + } + } + + founds = galloc(len*sizeof(SplineChar *)); /* Will be a vast over-estimate */ + start = cnames; + for ( i=0; *start; ) { + while ( *start==' ' ) ++start; + if ( *start=='\0' ) + break; + for ( pt=start; *pt && *pt!=' '; ++pt ); + ch = *pt; *pt = '\0'; + if ( (founds[i]=SFGetChar(mv->fv->sf,-1,start))!=NULL ) + ++i; + *pt = ch; + start = pt; + } + cnt = i; + free( cnames ); + if ( cnt==0 ) +return; + + if ( mv->charcnt+cnt>=mv->max ) { + int oldmax=mv->max; + mv->max = mv->charcnt+cnt+10; + mv->perchar = grealloc(mv->perchar,mv->max*sizeof(struct metricchar)); + mv->sstr = grealloc(mv->sstr,(mv->max+1)*sizeof(SplineChar *)); + memset(mv->perchar+oldmax,'\0',(mv->max-oldmax)*sizeof(struct metricchar)); + } + oldtext = _GGadgetGetTitle(mv->text); + newtext = galloc((mv->charcnt+cnt+1)*sizeof(unichar_t)); + u_strcpy(newtext,oldtext); + newtext[mv->charcnt+cnt]='\0'; + for ( i=mv->charcnt+cnt-1; i>=within+cnt; --i ) { + newtext[i] = newtext[i-cnt]; + mv->perchar[i].sc = mv->perchar[i-cnt].sc; + mv->perchar[i].active_pos = mv->perchar[i-cnt].active_pos; + mv->perchar[i].show = mv->perchar[i-cnt].show; + mv->perchar[i-cnt].show = NULL; + } + for ( i=within; iperchar[i].sc = founds[i-within]; + mv->perchar[i].active_pos = NULL; + newtext[i] = (founds[i-within]->unicodeenc>=0 && founds[i-within]->unicodeenc<0x10000)? + founds[i-within]->unicodeenc : 0xfffd; + } + mv->charcnt += cnt; + for ( i=within; icharcnt; ++i ) + MVSetPos(mv,i,mv->perchar[i].sc); + MVSetAnchor(mv); + free(founds); + + GGadgetSetTitle(mv->text,newtext); + free(newtext); + + GDrawRequestExpose(mv->gw,NULL,false); + MVSetSb(mv); +} + +static int mv_e_h(GWindow gw, GEvent *event) { + MetricsView *mv = (MetricsView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_selclear: + ClipboardClear(); + break; + case et_expose: + GDrawSetLineWidth(gw,0); + MVExpose(mv,gw,event); + break; + case et_resize: + if ( event->u.resize.sized ) + MVResize(mv,event); + break; + case et_char: + MVChar(mv,event); + break; + case et_mouseup: case et_mousemove: case et_mousedown: + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { +return( GGadgetDispatchEvent(mv->vsb,event)); + } + MVMouse(mv,event); + break; + case et_drop: + MVDrop(mv,event); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + if ( event->u.control.g==mv->hsb ) + MVHScroll(mv,&event->u.control.u.sb); + else + MVVScroll(mv,&event->u.control.u.sb); + break; + } + break; + case et_close: + MVMenuClose(gw,NULL,NULL); + break; + case et_destroy: + if ( mv->fv->metrics==mv ) + mv->fv->metrics = mv->next; + else { + MetricsView *n; + for ( n=mv->fv->metrics; n->next!=mv; n=n->next ); + n->next = mv->next; + } + KCLD_MvDetach(mv->fv->sf->kcld,mv); + MetricsViewFree(mv); + break; + case et_focus: +#if 0 + if ( event->u.focus.gained_focus ) + CVPaletteDeactivate(); +#endif + break; + } +return( true ); +} + +#define metricsicon_width 16 +#define metricsicon_height 16 +static unsigned char metricsicon_bits[] = { + 0x04, 0x10, 0xf0, 0x03, 0x24, 0x12, 0x20, 0x00, 0x24, 0x10, 0xe0, 0x00, + 0x24, 0x10, 0x20, 0x00, 0x24, 0x10, 0x20, 0x00, 0x74, 0x10, 0x00, 0x00, + 0x55, 0x55, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00}; + +MetricsView *MetricsViewCreate(FontView *fv,SplineChar *sc,BDFFont *bdf) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetData gd; + GRect gsize; + MetricsView *mv = gcalloc(1,sizeof(MetricsView)); + FontRequest rq; + static unichar_t helv[] = { 'h', 'e', 'l', 'v', 'e', 't', 'i', 'c', 'a', ',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + static GWindow icon = NULL; + extern int _GScrollBar_Width; + unichar_t ubuf[100]; + GTextInfo label; + int i,j,cnt; + int as,ds,ld; + SplineChar *anysc, *goodsc; + + if ( icon==NULL ) + icon = GDrawCreateBitmap(NULL,metricsicon_width,metricsicon_height,metricsicon_bits); + + mv->fv = fv; + mv->bdf = bdf; + mv->showgrid = true; + mv->antialias = mv_antialias; + mv->scale_index = 2; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_icon; + wattrs.event_masks = ~(1<sf->fontname); + wattrs.window_title = ubuf; + wattrs.icon = icon; + pos.x = pos.y = 0; + pos.width = 800; + pos.height = 300; + mv->gw = gw = GDrawCreateTopWindow(NULL,&pos,mv_e_h,mv,&wattrs); + mv->width = pos.width; mv->height = pos.height; + + memset(&gd,0,sizeof(gd)); + gd.flags = gg_visible | gg_enabled; + gd.u.menu = mblist; + mv->mb = GMenuBarCreate( gw, &gd, NULL); + GGadgetGetSize(mv->mb,&gsize); + mv->mbh = gsize.height; + + gd.pos.height = GDrawPointsToPixels(gw,_GScrollBar_Width); + gd.pos.y = pos.height-gd.pos.height; + gd.pos.x = 0; gd.pos.width = pos.width; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + mv->hsb = GScrollBarCreate(gw,&gd,mv); + GGadgetGetSize(mv->hsb,&gsize); + mv->sbh = gsize.height; + mv->dwidth = mv->width-mv->sbh; + + gd.pos.width = mv->sbh; + gd.pos.y = 0; gd.pos.height = pos.height; /* we'll fix these later */ + gd.pos.x = pos.width-gd.pos.width; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + mv->vsb = GScrollBarCreate(gw,&gd,mv); + + memset(&rq,0,sizeof(rq)); + rq.family_name = helv; + rq.point_size = -12; + rq.weight = 400; + mv->font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawFontMetrics(mv->font,&as,&ds,&ld); + mv->fh = as+ds; mv->as = as; + + mv->perchar = gcalloc(mv->max=20,sizeof(struct metricchar)); + mv->sstr = galloc(mv->max*sizeof(SplineChar *)); + if ( sc!=NULL ) { + ubuf[0] = sc->unicodeenc==-1 ||sc->unicodeenc>=0x10000 ? 0xfffd: sc->unicodeenc; + mv->perchar[0].sc = sc; + cnt = 1; + } else { + for ( cnt=0, j=1; (j<=fv->sel_index || j<1) && cnt<15; ++j ) { + for ( i=0; isf->charcnt && cnt<15; ++i ) { + if ( fv->selected[i]==j && fv->sf->chars[i]!=NULL ) { + mv->perchar[cnt].sc = fv->sf->chars[i]; + ubuf[cnt++] = fv->sf->chars[i]->unicodeenc==-1 || fv->sf->chars[i]->unicodeenc>=0x10000? + 0xfffd: fv->sf->chars[i]->unicodeenc; + } + } + } + } + if ( cnt!=0 ) { + MVSelectChar(mv,cnt-1); + mv->right_to_left = isrighttoleft(ubuf[0])?1:0; + } + ubuf[cnt] = 0; + mv->charcnt = cnt; + + memset(&gd,0,sizeof(gd)); + memset(&label,0,sizeof(label)); + gd.pos.y = mv->mbh+2; gd.pos.x = 10; + gd.pos.width = GDrawPointsToPixels(mv->gw,200); + gd.label = &label; + label.text = ubuf; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_text_xim; + gd.handle_controlevent = MV_TextChanged; + mv->text = GTextFieldCreate(gw,&gd,mv); + GGadgetGetSize(mv->text,&gsize); + mv->topend = gsize.y + gsize.height + 2; + + anysc = goodsc = NULL; + for ( i=0; iperchar[i].sc; + if ( SCScriptFromUnicode(mv->perchar[i].sc)!=DEFAULT_SCRIPT ) { + goodsc = mv->perchar[i].sc; + break; + } + } + if ( goodsc==NULL ) { + SplineFont *sf = mv->fv->sf; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( anysc==NULL ) anysc = sf->chars[i]; + if ( SCScriptFromUnicode(sf->chars[i])!=DEFAULT_SCRIPT ) { + goodsc = sf->chars[i]; + break; + } + } + } + if ( goodsc==NULL ) goodsc = anysc; + + gd.pos.x = gd.pos.x+gd.pos.width+10; --gd.pos.y; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gd.handle_controlevent = MV_SLIChanged; + gd.u.list = SFLangList(mv->fv->sf,true,goodsc); + gd.label = NULL; + mv->sli_list = GListButtonCreate(gw,&gd,mv); + + MVMakeLabels(mv); + + GGadgetMove(mv->vsb,mv->dwidth,mv->topend); + GGadgetResize(mv->vsb,mv->sbh,mv->displayend-mv->topend); + + if ( sc!=NULL ) { + MVSetPos(mv,0,sc); + } else { + for ( cnt=0, j=1; j<=fv->sel_index && cnt<15; ++j ) { + for ( i=0; isf->charcnt && cnt<15; ++i ) { + if ( fv->selected[i]==j && fv->sf->chars[i]!=NULL ) { + MVSetPos(mv,cnt++,fv->sf->chars[i]); + } + } + } + } + MVSetAnchor(mv); + MVSetSb(mv); + + GDrawSetVisible(gw,true); + /*GWidgetHidePalettes();*/ + mv->next = fv->metrics; + fv->metrics = mv; +return( mv ); +} + +void MetricsViewFree(MetricsView *mv) { + int i; + + for ( i=0; icharcnt; ++i ) + BDFCharFree(mv->perchar[i].show); + /* the fields will free themselves */ + free(mv->perchar); + free(mv); +} + +void MVRefreshAll(MetricsView *mv) { + int i; + + if ( mv!=NULL ) + for ( i=0; icharcnt; ++i ) + MVSetPos(mv,i,mv->perchar[i].sc); +} diff --git a/fontforge/mm.c b/fontforge/mm.c new file mode 100644 index 00000000..0c2a4de7 --- /dev/null +++ b/fontforge/mm.c @@ -0,0 +1,2942 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include + +/* As far as I can tell, the CDV in AdobeSansMM is half gibberish */ +/* This is disturbing */ +/* But at least the CDV in Type1_supp.pdf for Myriad appears correct */ +static char *standard_cdvs[5] = { +/* 0 axes? Impossible */ + "{}", +/* 1 axis */ + "{\n" + " 1 1 index sub 2 1 roll\n" + " 0 index 2 1 roll\n" + " pop\n" + "}", +/* 2 axes */ + "{\n" + " 1 2 index sub 1 2 index sub mul 3 1 roll\n" + " 1 index 1 2 index sub mul 3 1 roll\n" + " 1 2 index sub 1 index mul 3 1 roll\n" + " 1 index 1 index mul 3 1 roll\n" + " pop pop\n" + "}", +/* 3 axes */ + "{\n" + " 1 3 index sub 1 3 index sub mul 1 3 index sub mul 4 1 roll\n" + " 2 index 1 3 index sub mul 1 3 index sub mul 4 1 roll\n" + " 1 3 index sub 2 index mul 1 3 index sub mul 4 1 roll\n" + " 2 index 2 index mul 1 3 index sub mul 4 1 roll\n" + " 1 3 index sub 1 3 index sub mul 2 index mul 4 1 roll\n" + " 2 index 1 3 index sub mul 2 index mul 4 1 roll\n" + " 1 3 index sub 2 index mul 2 index mul 4 1 roll\n" + " 2 index 2 index mul 2 index mul 4 1 roll\n" + " pop pop pop\n" + "}", +/* 4 axes */ +/* This requires too big a string. We must build it at runtime */ + NULL +}; +static char *cdv_4axis[3] = { + "{\n" + " 1 4 index sub 1 4 index sub mul 1 4 index sub 1 4 index sub mul 5 1 roll\n" + " 3 index 1 4 index sub mul 1 4 index sub mul 1 4 index sub mul 5 1 roll\n" + " 1 4 index sub 3 index mul 1 4 index sub mul 1 4 index sub mul 5 1 roll\n" + " 3 index 3 index mul 1 4 index sub mul 1 4 index sub mul 5 1 roll\n" + " 1 4 index sub 1 4 index sub mul 3 index mul 1 4 index sub mul 5 1 roll\n" + " 3 index 1 4 index sub mul 3 index mul 1 4 index sub mul 5 1 roll\n", + " 1 4 index sub 3 index mul 3 index mul 1 4 index sub mul 5 1 roll\n" + " 3 index 3 index mul 3 index mul 1 4 index sub mul 5 1 roll\n" + " 1 4 index sub 1 4 index sub mul 1 4 index sub 3 index mul 5 1 roll\n" + " 3 index 1 4 index sub mul 1 4 index sub mul 3 index mul 5 1 roll\n" + " 1 4 index sub 3 index mul 1 4 index sub mul 3 index mul 5 1 roll\n", + " 3 index 3 index mul 1 4 index sub mul 3 index mul 5 1 roll\n" + " 1 4 index sub 1 4 index sub mul 3 index mul 3 index mul 5 1 roll\n" + " 3 index 1 4 index sub mul 3 index mul 3 index mul 5 1 roll\n" + " 1 4 index sub 3 index mul 3 index mul 3 index mul 5 1 roll\n" + " 3 index 3 index mul 3 index mul 3 index mul 5 1 roll\n" + " pop pop pop pop\n" + "}" +}; + +char *MMAxisAbrev(char *axis_name) { + if ( strcmp(axis_name,"Weight")==0 ) +return( "wt" ); + if ( strcmp(axis_name,"Width")==0 ) +return( "wd" ); + if ( strcmp(axis_name,"OpticalSize")==0 ) +return( "op" ); + if ( strcmp(axis_name,"Slant")==0 ) +return( "sl" ); + +return( axis_name ); +} + +static double MMAxisUnmap(MMSet *mm,int axis,double ncv) { + struct axismap *axismap = &mm->axismaps[axis]; + int j; + + if ( ncv<=axismap->blends[0] ) +return(axismap->designs[0]); + + for ( j=1; jpoints; ++j ) { + if ( ncv<=axismap->blends[j]) { + double t = (ncv-axismap->blends[j-1])/(axismap->blends[j]-axismap->blends[j-1]); +return( axismap->designs[j-1]+ t*(axismap->designs[j]-axismap->designs[j-1]) ); + } + } + +return(axismap->designs[axismap->points-1]); +} + +char *MMMakeMasterFontname(MMSet *mm,int ipos,char **fullname) { + char *pt, *pt2; + char *ret = galloc(strlen(mm->normal->familyname)+ mm->axis_count*15 + 1); + int i; + + pt = ret; + strcpy(pt,mm->normal->familyname); + pt += strlen(pt); + *pt++ = '_'; + for ( i=0; iaxis_count; ++i ) { + sprintf( pt, " %d%s", (int) rint(MMAxisUnmap(mm,i,mm->positions[ipos*mm->axis_count+i])), + MMAxisAbrev(mm->axes[i])); + pt += strlen(pt); + } + if ( pt>ret && pt[-1]==' ' ) + --pt; + *pt = '\0'; + *fullname = ret; + + ret = copy(ret); + for ( pt=pt2=ret; *pt!='\0'; ++pt ) + if ( *pt!=' ' ) + *pt2++ = *pt; + *pt2 = '\0'; +return( ret ); +} + +char *MMGuessWeight(MMSet *mm,int ipos,char *def) { + int i; + char *ret; + real design; + + for ( i=0; iaxis_count; ++i ) { + if ( strcmp(mm->axes[i],"Weight")==0 ) + break; + } + if ( i==mm->axis_count ) +return( def ); + design = mm->positions[ipos*mm->axis_count + i]; + if ( design<50 || design>1500 ) /* Er... Probably not the 0...1000 range I expect */ +return( def ); + ret = NULL; + if ( design<150 ) + ret = "Thin"; + else if ( design<350 ) + ret = "Light"; + else if ( design<550 ) + ret = "Medium"; + else if ( design<650 ) + ret = "DemiBold"; + else if ( design<750 ) + ret = "Bold"; + else if ( design<850 ) + ret = "Heavy"; + else + ret = "Black"; + free( def ); +return( copy(ret) ); +} + +/* Given a postscript array of scalars, what's the ipos'th element? */ +char *MMExtractNth(char *pt,int ipos) { + int i; + char *end; + + while ( *pt==' ' ) ++pt; + if ( *pt=='[' ) ++pt; + for ( i=0; *pt!=']' && *pt!='\0'; ++i ) { + while ( *pt==' ' ) ++pt; + if ( *pt==']' || *pt=='\0' ) +return( NULL ); + for ( end=pt; *end!=' ' && *end!=']' && *end!='\0'; ++end ); + if ( i==ipos ) +return( copyn(pt,end-pt)); + pt = end; + } +return( NULL ); +} + +/* Given a postscript array of arrays, such as those found in Blend Private BlueValues */ +/* return the array composed of the ipos'th element of each sub-array */ +char *MMExtractArrayNth(char *pt,int ipos) { + char *hold[40], *ret; + int i,j,len; + + while ( *pt==' ' ) ++pt; + if ( *pt=='[' ) ++pt; + i = 0; + while ( *pt!=']' && *pt!=' ' ) { + while ( *pt==' ' ) ++pt; + if ( *pt=='[' ) { + if ( imm; + KernPair *kp; + int i; + /* If the user creates a kern pair in one font of a multiple master set */ + /* then we should create the same kern pair in all the others. Similarly */ + /* if s/he modifies a kern pair in the weighted version then apply that */ + /* mod to all the others */ + + if ( mm==NULL ) +return; + if ( sf==mm->normal || kp==NULL ) { + for ( i= -1; iinstance_count; ++i ) { + SplineFont *cur = i==-1 ? mm->normal : mm->instances[i]; + SplineChar *psc, *ssc; + if ( cur==sf ) /* Done in caller */ + continue; + psc = SFMakeChar(cur,first->enc); + ssc = SFMakeChar(cur,second->enc); + for ( kp = psc->kerns; kp!=NULL && kp->sc!=ssc; kp = kp->next ); + /* No mm support for vertical kerns */ + if ( kp==NULL ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = ssc; + kp->next = psc->kerns; + psc->kerns = kp; + } + kp->off += diff; + if ( sli==-1 ) + sli = SFAddScriptLangIndex(cur, + SCScriptFromUnicode(psc),DEFAULT_LANG); + kp->sli = sli; + } + } +} + +static int ContourCount(SplineChar *sc) { + SplineSet *spl; + int i; + + for ( spl=sc->layers[ly_fore].splines, i=0; spl!=NULL; spl=spl->next, ++i ); +return( i ); +} + +static int ContourPtMatch(SplineChar *sc1, SplineChar *sc2) { + SplineSet *spl1, *spl2; + SplinePoint *sp1, *sp2; + + for ( spl1=sc1->layers[ly_fore].splines, spl2=sc2->layers[ly_fore].splines; spl1!=NULL && spl2!=NULL; spl1=spl1->next, spl2=spl2->next ) { + for ( sp1=spl1->first, sp2 = spl2->first; ; ) { + if ( sp1->nonextcp!=sp2->nonextcp || sp1->noprevcp!=sp2->noprevcp ) +return( false ); + if ( sp1->next==NULL || sp2->next==NULL ) { + if ( sp1->next==NULL && sp2->next==NULL ) + break; +return( false ); + } + sp1 = sp1->next->to; sp2 = sp2->next->to; + if ( sp1==spl1->first || sp2==spl2->first ) { + if ( sp1==spl1->first && sp2==spl2->first ) + break; +return( false ); + } + } + } +return( true ); +} + +static int ContourDirMatch(SplineChar *sc1, SplineChar *sc2) { + SplineSet *spl1, *spl2; + + for ( spl1=sc1->layers[ly_fore].splines, spl2=sc2->layers[ly_fore].splines; spl1!=NULL && spl2!=NULL; spl1=spl1->next, spl2=spl2->next ) { + if ( SplinePointListIsClockwise(spl1)!=SplinePointListIsClockwise(spl2) ) +return( false ); + } +return( true ); +} + +static int ContourHintMaskMatch(SplineChar *sc1, SplineChar *sc2) { + SplineSet *spl1, *spl2; + SplinePoint *sp1, *sp2; + + for ( spl1=sc1->layers[ly_fore].splines, spl2=sc2->layers[ly_fore].splines; spl1!=NULL && spl2!=NULL; spl1=spl1->next, spl2=spl2->next ) { + for ( sp1=spl1->first, sp2 = spl2->first; ; ) { + if ( (sp1->hintmask==NULL)!=(sp2->hintmask==NULL) ) +return( false ); + if ( sp1->hintmask!=NULL && memcmp(sp1->hintmask,sp2->hintmask,sizeof(HintMask))!=0 ) +return( false ); + if ( sp1->next==NULL || sp2->next==NULL ) { + if ( sp1->next==NULL && sp2->next==NULL ) + break; +return( false ); + } + sp1 = sp1->next->to; sp2 = sp2->next->to; + if ( sp1==spl1->first || sp2==spl2->first ) { + if ( sp1==spl1->first && sp2==spl2->first ) + break; +return( false ); + } + } + } +return( true ); +} + +static int RefMatch(SplineChar *sc1, SplineChar *sc2) { + RefChar *ref1, *ref2; + /* I don't require the reference list to be ordered */ + + for ( ref1=sc1->layers[ly_fore].refs, ref2=sc2->layers[ly_fore].refs; ref1!=NULL && ref2!=NULL; ref1=ref1->next, ref2=ref2->next ) + ref2->checked = false; + if ( ref1!=NULL || ref2!=NULL ) +return( false ); + + for ( ref1=sc1->layers[ly_fore].refs; ref1!=NULL ; ref1=ref1->next ) { + for ( ref2=sc2->layers[ly_fore].refs; ref2!=NULL ; ref2=ref2->next ) { + if ( ref2->local_enc==ref1->local_enc && !ref2->checked ) + break; + } + if ( ref2==NULL ) +return( false ); + ref2->checked = true; + } + +return( true ); +} + +static int HintsMatch(StemInfo *h1,StemInfo *h2) { + while ( h1!=NULL && h2!=NULL ) { +#if 0 /* Nope. May conflict in one instance and not in another */ + if ( h1->hasconflicts != h2->hasconflicts ) +return( false ); +#endif + h1 = h1->next; + h2 = h2->next; + } + if ( h1!=NULL || h2!=NULL ) +return( false ); + +return( true ); +} + +static int KernsMatch(SplineChar *sc1, SplineChar *sc2) { + /* I don't require the kern list to be ordered */ + /* Only interested in kerns that go into afm files (ie. no kernclasses) */ + KernPair *k1, *k2; + + for ( k1=sc1->kerns, k2=sc2->kerns; k1!=NULL && k2!=NULL; k1=k1->next, k2=k2->next ) + k2->kcid = false; + if ( k1!=NULL || k2!=NULL ) +return( false ); + + for ( k1=sc1->kerns; k1!=NULL ; k1=k1->next ) { + for ( k2=sc2->kerns; k2!=NULL ; k2=k2->next ) { + if ( k2->sc->enc==k1->sc->enc && !k2->kcid ) + break; + } + if ( k2==NULL ) +return( false ); + k2->kcid = true; + } + +return( true ); +} + +static int ArrayCount(char *val) { + char *end; + int cnt; + + if ( val==NULL ) +return( 0 ); + while ( *val==' ' ) ++val; + if ( *val=='[' ) ++val; + cnt=0; + while ( *val ) { + strtod(val,&end); + if ( val==end ) + break; + ++cnt; + val = end; + } +return( cnt ); +} + +int MMValid(MMSet *mm,int complain) { + int i, j; + SplineFont *sf; + static char *arrnames[] = { "BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW", "StemSnapH", "StemSnapV", NULL }; + + if ( mm==NULL ) +return( false ); + + for ( i=0; iinstance_count; ++i ) + if ( mm->instances[i]->order2 ) { + if ( complain ) + GWidgetErrorR(_STR_BadMM,_STR_MMOrder2, + sf->fontname); +return( false ); + } + + sf = mm->instances[0]; + + if ( PSDictHasEntry(sf->private,"ForceBold")!=NULL && + PSDictHasEntry(mm->normal->private,"ForceBoldThreshold")==NULL) { + if ( complain ) + GWidgetErrorR(_STR_BadMM,_STR_MMNeedsBoldThresh, + sf->fontname); +return( false ); + } + + for ( j=1; jinstance_count; ++j ) { + if ( sf->charcnt!=mm->instances[j]->charcnt || + sf->encoding_name!=mm->instances[j]->encoding_name ) { + if ( complain ) + GWidgetErrorR(_STR_BadMM,_STR_MMDifferentNumChars, + sf->fontname, mm->instances[j]->fontname); +return( false ); + } else if ( sf->order2!=mm->instances[j]->order2 ) { + if ( complain ) + GWidgetErrorR(_STR_BadMM,_STR_MMDifferentOrder, + sf->fontname, mm->instances[j]->fontname); +return( false ); + } + if ( PSDictHasEntry(mm->instances[j]->private,"ForceBold")!=NULL && + PSDictHasEntry(mm->normal->private,"ForceBoldThreshold")==NULL) { + if ( complain ) + GWidgetErrorR(_STR_BadMM,_STR_MMNeedsBoldThresh, + mm->instances[j]->fontname); +return( false ); + } + for ( i=0; arrnames[i]!=NULL; ++i ) { + if ( ArrayCount(PSDictHasEntry(mm->instances[j]->private,arrnames[i]))!= + ArrayCount(PSDictHasEntry(sf->private,arrnames[i])) ) { + if ( complain ) + GWidgetErrorR(_STR_BadMM,_STR_MMPrivateMismatch, + arrnames[i], sf->fontname, mm->instances[j]->fontname); +return( false ); + } + } + } + + for ( i=0; icharcnt; ++i ) { + for ( j=1; jinstance_count; ++j ) { + if ( SCWorthOutputting(sf->chars[i])!=SCWorthOutputting(mm->instances[j]->chars[i]) ) { + if ( complain ) { + FVChangeChar(sf->fv,i); + if ( SCWorthOutputting(sf->chars[i]) ) + GWidgetErrorR(_STR_BadMM,_STR_MMUndefChar, + sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + else + GWidgetErrorR(_STR_BadMM,_STR_MMUndefChar, + mm->instances[j]->chars[i]->name, mm->instances[j]->fontname,sf->fontname); + } +return( false ); + } + } + if ( SCWorthOutputting(sf->chars[i]) ) { + for ( j=1; jinstance_count; ++j ) { + if ( ContourCount(sf->chars[i])!=ContourCount(mm->instances[j]->chars[i])) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMWrongContourCount, + sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } else if ( !ContourPtMatch(sf->chars[i],mm->instances[j]->chars[i])) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMMismatchContoursPt, + sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } else if ( !ContourDirMatch(sf->chars[i],mm->instances[j]->chars[i])) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMMismatchContoursDir, + sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } else if ( !RefMatch(sf->chars[i],mm->instances[j]->chars[i])) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMMismatchRefs, + sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } else if ( !KernsMatch(sf->chars[i],mm->instances[j]->chars[i])) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMMismatchKerns, + "vertical", sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } + } + for ( j=1; jinstance_count; ++j ) { + if ( !HintsMatch(sf->chars[i]->hstem,mm->instances[j]->chars[i]->hstem)) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMMismatchHints, + "horizontal", sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } else if ( !HintsMatch(sf->chars[i]->vstem,mm->instances[j]->chars[i]->vstem)) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMMismatchHints, + "vertical", sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } + } + for ( j=1; jinstance_count; ++j ) { + if ( !ContourHintMaskMatch(sf->chars[i],mm->instances[j]->chars[i])) { + if ( complain ) { + FVChangeChar(sf->fv,i); + GWidgetErrorR(_STR_BadMM,_STR_MMMismatchHintMask, + sf->chars[i]->name,sf->fontname, mm->instances[j]->fontname); + } +return( false ); + } + } + } + } + if ( complain ) + GWidgetPostNoticeR(_STR_OK,_STR_NoProblems); +return( true ); +} + +static int _MMBlendChar(MMSet *mm, int enc) { + int i, j, worthit = -1; + int all, any, any2, all2, anyend, allend, diff; + SplineChar *sc; + SplinePointList *spls[MmMax], *spl, *spllast; + SplinePoint *tos[MmMax], *to; + RefChar *refs[MmMax], *ref, *reflast; + KernPair *kp0, *kptest, *kp, *kplast; + StemInfo *hs[MmMax], *h, *hlast; + real width; + + for ( i=0; iinstance_count; ++i ) { + if ( mm->instances[i]->order2 ) +return( _STR_MMOrder2NoName ); + if ( enc>=mm->instances[i]->charcnt ) +return( _STR_MMDifferentNumCharsNoName ); + if ( SCWorthOutputting(mm->instances[i]->chars[enc]) ) { + if ( worthit == -1 ) worthit = true; + else if ( worthit != true ) +return( _STR_MMUndefCharNoName ); + } else { + if ( worthit == -1 ) worthit = false; + else if ( worthit != false ) +return( _STR_MMUndefCharNoName ); + } + } + + sc = mm->normal->chars[enc]; + if ( sc!=NULL ) { + SCClearContents(sc); + KernPairsFree(sc->kerns); + sc->kerns = NULL; + KernPairsFree(sc->vkerns); + sc->vkerns = NULL; + } + + if ( !worthit ) +return( 0 ); + + if ( sc==NULL ) + sc = SFMakeChar(mm->normal,enc); + + /* Blend references => blend transformation matrices */ + diff = false; + any = false; all = true; + for ( i=0; iinstance_count; ++i ) { + refs[i] = mm->instances[i]->chars[enc]->layers[ly_fore].refs; + if ( refs[i]!=NULL ) any = true; + else all = false; + } + reflast = NULL; + while ( all ) { + ref = RefCharCreate(); + *ref = *refs[0]; + ref->layers[0].splines = NULL; + ref->next = NULL; + memset(ref->transform,0,sizeof(ref->transform)); + ref->sc = mm->normal->chars[refs[0]->sc->enc]; + for ( i=0; iinstance_count; ++i ) { + if ( ref->sc->enc!=refs[i]->sc->enc ) + diff = true; + for ( j=0; j<6; ++j ) + ref->transform[j] += refs[i]->transform[j]*mm->defweights[i]; + } + if ( reflast==NULL ) + sc->layers[ly_fore].refs = ref; + else + reflast->next = ref; + reflast = ref; + any = false; all = true; + for ( i=0; iinstance_count; ++i ) { + refs[i] = refs[i]->next; + if ( refs[i]!=NULL ) any = true; + else all = false; + } + } + if ( any ) +return( _STR_MMDiffNumRefs ); + if ( diff ) +return( _STR_MMDiffRefEncodings ); + + /* Blend Width */ + width = 0; + for ( i=0; iinstance_count; ++i ) + width += mm->instances[i]->chars[enc]->width*mm->defweights[i]; + sc->width = width; + width = 0; + for ( i=0; iinstance_count; ++i ) + width += mm->instances[i]->chars[enc]->vwidth*mm->defweights[i]; + sc->vwidth = width; + + /* Blend Splines */ + any = false; all = true; + for ( i=0; iinstance_count; ++i ) { + spls[i] = mm->instances[i]->chars[enc]->layers[ly_fore].splines; + if ( spls[i]!=NULL ) any = true; + else all = false; + } + spllast = NULL; + while ( all ) { + spl = chunkalloc(sizeof(SplinePointList)); + if ( spllast==NULL ) + sc->layers[ly_fore].splines = spl; + else + spllast->next = spl; + spllast = spl; + for ( i=0; iinstance_count; ++i ) + tos[i] = spls[i]->first; + all2 = true; + spl->last = NULL; + while ( all2 ) { + to = chunkalloc(sizeof(SplinePoint)); + to->nonextcp = tos[0]->nonextcp; + to->noprevcp = tos[0]->noprevcp; + to->nextcpdef = tos[0]->nextcpdef; + to->prevcpdef = tos[0]->prevcpdef; + to->pointtype = tos[0]->pointtype; + if ( tos[0]->hintmask!=NULL ) { + to->hintmask = chunkalloc(sizeof(HintMask)); + memcpy(to->hintmask,tos[0]->hintmask,sizeof(HintMask)); + } + for ( i=0; iinstance_count; ++i ) { + to->me.x += tos[i]->me.x*mm->defweights[i]; + to->me.y += tos[i]->me.y*mm->defweights[i]; + to->nextcp.x += tos[i]->nextcp.x*mm->defweights[i]; + to->nextcp.y += tos[i]->nextcp.y*mm->defweights[i]; + to->prevcp.x += tos[i]->prevcp.x*mm->defweights[i]; + to->prevcp.y += tos[i]->prevcp.y*mm->defweights[i]; + } + if ( spl->last==NULL ) + spl->first = to; + else + SplineMake3(spl->last,to); + spl->last = to; + any2 = false; all2 = true; + for ( i=0; iinstance_count; ++i ) { + if ( tos[i]->next==NULL ) tos[i] = NULL; + else tos[i] = tos[i]->next->to; + if ( tos[i]!=NULL ) any2 = true; + else all2 = false; + } + if ( !all2 && any2 ) +return( _STR_MMPointMismatch ); + anyend = false; allend = true; + for ( i=0; iinstance_count; ++i ) { + if ( tos[i]==spls[i]->first ) anyend = true; + else allend = false; + } + if ( allend ) { + SplineMake3(spl->last,spl->first); + spl->last = spl->first; + break; + } + if ( anyend ) +return( _STR_MMPointMismatch ); + } + any = false; all = true; + for ( i=0; iinstance_count; ++i ) { + spls[i] = spls[i]->next; + if ( spls[i]!=NULL ) any = true; + else all = false; + } + } + if ( any ) +return( _STR_MMContourMismatch ); + + /* Blend hints */ + for ( j=0; j<2; ++j ) { + any = false; all = true; + for ( i=0; iinstance_count; ++i ) { + hs[i] = j ? mm->instances[i]->chars[enc]->hstem : mm->instances[i]->chars[enc]->vstem; + if ( hs[i]!=NULL ) any = true; + else all = false; + } + hlast = NULL; + while ( all ) { + h = chunkalloc(sizeof(StemInfo)); + *h = *hs[0]; + h->where = NULL; + h->next = NULL; + h->start = h->width = 0; + for ( i=0; iinstance_count; ++i ) { + h->start += hs[i]->start*mm->defweights[i]; + h->width += hs[i]->width*mm->defweights[i]; + } + if ( hlast!=NULL ) + hlast->next = h; + else if ( j ) + sc->hstem = h; + else + sc->vstem = h; + hlast = h; + any = false; all = true; + for ( i=0; iinstance_count; ++i ) { + hs[i] = hs[i]->next; + if ( hs[i]!=NULL ) any = true; + else all = false; + } + } + if ( any ) +return( _STR_MMDiffNumHints ); + } + + /* Blend kernpairs */ + /* I'm not requiring ordered kerning pairs */ + /* I'm not bothering with vertical kerning */ + kp0 = mm->instances[0]->chars[enc]->kerns; + kplast = NULL; + while ( kp0!=NULL ) { + int off = kp0->off*mm->defweights[0]; + for ( i=1; iinstance_count; ++i ) { + for ( kptest=mm->instances[i]->chars[enc]->kerns; kptest!=NULL; kptest=kptest->next ) + if ( kptest->sc->enc==kp0->sc->enc ) + break; + if ( kptest==NULL ) +return( _STR_MMDiffKerns ); + off += kptest->off*mm->defweights[i]; + } + kp = chunkalloc(sizeof(KernPair)); + kp->sc = mm->normal->chars[kp0->sc->enc]; + kp->off = off; + kp->sli = kp0->sli; + kp->flags = kp0->flags; + if ( kplast!=NULL ) + kplast->next = kp; + else + sc->kerns = kp; + kplast = kp; + kp0 = kp0->next; + } +return( 0 ); +} + +int MMBlendChar(MMSet *mm, int enc) { + int ret; + RefChar *ref; + + if ( enc>=mm->normal->charcnt ) +return( _STR_MMDifferentNumCharsNoName ); + ret = _MMBlendChar(mm,enc); + if ( mm->normal->chars[enc]!=NULL ) { + SplineChar *sc = mm->normal->chars[enc]; + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + SCReinstanciateRefChar(sc,ref); + SCMakeDependent(sc,ref->sc); + } + } +return(ret); +} + +int MMReblend(FontView *fv, MMSet *mm) { + int olderr, err, i, first = -1; + SplineFont *sf = mm->instances[0]; + RefChar *ref; + + olderr = 0; + for ( i=0; icharcnt; ++i ) { + if ( i>=mm->normal->charcnt ) + break; + err = MMBlendChar(mm,i); + if ( mm->normal->chars[i]!=NULL ) + _SCCharChangedUpdate(mm->normal->chars[i],-1); + if ( err==0 ) + continue; + if ( olderr==0 ) { + if ( fv!=NULL ) + FVDeselectAll(fv); + first = i; + } + if ( olderr==0 || olderr == err ) + olderr = err; + else + olderr = -1; + if ( fv!=NULL ) + fv->selected[i] = true; + } + + sf = mm->normal; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( ref=sf->chars[i]->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + SCReinstanciateRefChar(sf->chars[i],ref); + SCMakeDependent(sf->chars[i],ref->sc); + } + } + + if ( olderr == 0 ) /* No Errors */ +return( true ); + + if ( fv!=NULL ) { + FVScrollToChar(fv,first); + if ( olderr==-1 ) + GWidgetErrorR(_STR_BadMM,_STR_MMVariousErrors); + else + GWidgetErrorR(_STR_BadMM,_STR_MMSelErr,GStringGetResource(olderr,NULL)); + } +return( false ); +} + +static int ExecConvertDesignVector(real *designs, int dcnt, char *ndv, char *cdv, + real *stack) { + char *temp, dv[101]; + int j, len, cnt; + char *oldloc; + + /* PostScript parses things in "C" locale too */ + oldloc = setlocale(LC_NUMERIC,"C"); + len = 0; + for ( j=0; j0 && (temp[len-1]==' '||temp[len-1]=='\n') ) --len; + if ( len>0 && temp[len-1]=='}' ) --len; + + while ( isspace(*cdv)) ++cdv; + if ( *cdv=='{' ) + ++cdv; + strcpy(temp+len,cdv); + len += strlen(temp+len); + while ( len>0 && (temp[len-1]==' '||temp[len-1]=='\n') ) --len; + if ( len>0 && temp[len-1]=='}' ) --len; + + cnt = EvaluatePS(temp,stack,MmMax); + free(temp); +return( cnt ); +} + +static int StandardPositions(MMSet *mm,int instance_count, int axis_count) { + int i,j; + for ( i=0; ipositions[i*mm->axis_count+j]!= ( (i&(1<positions[0]!=0 ) /* must start at 0 */ +return( false ); + if ( mm->positions[(instance_count-1)*4]!=1 ) /* and end at 1 */ +return( false ); + for ( i=1; iinstance_count; ++i ) + if ( mm->positions[i*mm->axis_count]<=mm->positions[(i-1)*mm->axis_count] ) +return( false ); + +return( true ); +} + +static void MMWeightsUnMap(real weights[MmMax], real axiscoords[4], + int axis_count) { + + if ( axis_count==1 ) + axiscoords[0] = weights[1]; + else if ( axis_count==2 ) { + axiscoords[0] = weights[3]+weights[1]; + axiscoords[1] = weights[3]+weights[2]; + } else if ( axis_count==3 ) { + axiscoords[0] = weights[7]+weights[5]+weights[3]+weights[1]; + axiscoords[1] = weights[7]+weights[6]+weights[3]+weights[2]; + axiscoords[2] = weights[7]+weights[6]+weights[5]+weights[4]; + } else { + axiscoords[0] = weights[15]+weights[13]+weights[11]+weights[9]+ + weights[7]+weights[5]+weights[3]+weights[1]; + axiscoords[1] = weights[15]+weights[14]+weights[11]+weights[10]+ + weights[7]+weights[6]+weights[3]+weights[2]; + axiscoords[2] = weights[15]+weights[14]+weights[13]+weights[12]+ + weights[7]+weights[6]+weights[5]+weights[4]; + axiscoords[3] = weights[15]+weights[14]+weights[13]+weights[12]+ + weights[11]+weights[10]+weights[9]+weights[8]; + } +} + +static unichar_t *MMDesignCoords(MMSet *mm) { + char buffer[80], *pt; + int i; + real axiscoords[4]; + + if ( mm->instance_count!=(1<axis_count) || + !StandardPositions(mm,mm->instance_count,mm->axis_count)) +return( uc_copy("")); + MMWeightsUnMap(mm->defweights,axiscoords,mm->axis_count); + pt = buffer; + for ( i=0; iaxis_count; ++i ) { + sprintf( pt,"%g ", MMAxisUnmap(mm,i,axiscoords[i])); + pt += strlen(pt); + } + pt[-1] = ' '; +return( uc_copy( buffer )); +} + +struct mmcb { + int done; + GWindow gw; + MMSet *mm; + FontView *fv; +}; + +#define CID_Explicit 6001 +#define CID_ByDesign 6002 +#define CID_NewBlends 6003 +#define CID_NewDesign 6004 + +static int MMCB_Changed(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GWindow gw = GGadgetGetWindow(g); + int explicitblends = GGadgetIsChecked(GWidgetGetControl(gw,CID_Explicit)); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_NewBlends),explicitblends); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_NewDesign),!explicitblends); + } +return( true ); +} + +static int GetWeights(GWindow gw, real blends[MmMax], MMSet *mm, + int instance_count, int axis_count) { + int explicitblends = GGadgetIsChecked(GWidgetGetControl(gw,CID_Explicit)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(gw, + explicitblends?CID_NewBlends:CID_NewDesign)), *upt; + unichar_t *uend; + int i; + real sum; + + sum = 0; + for ( i=0, upt = ret; i1.01 ) { + GWidgetErrorR(_STR_BadMMWeights,_STR_WeightsMustBe1); +return(false); + } + } else { + i = ExecConvertDesignVector(blends, i, mm->ndv, mm->cdv, + blends); + if ( i!=instance_count ) { + GWidgetErrorR(_STR_BadMMWeights,_STR_BadNDVCDV); +return(false); + } + } +return( true ); +} + +static int MMCB_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct mmcb *mmcb = GDrawGetUserData(GGadgetGetWindow(g)); + real blends[MmMax]; + int i; + + if ( !GetWeights(mmcb->gw, blends, mmcb->mm, mmcb->mm->instance_count, mmcb->mm->axis_count)) +return( true ); + + for ( i=0; imm->instance_count; ++i ) + mmcb->mm->defweights[i] = blends[i]; + mmcb->mm->changed = true; + MMReblend(mmcb->fv,mmcb->mm); + mmcb->done = true; + } +return( true ); +} + +static int MMCB_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct mmcb *mmcb = GDrawGetUserData(GGadgetGetWindow(g)); + mmcb->done = true; + } +return( true ); +} + +static int mmcb_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct mmcb *mmcb = GDrawGetUserData(gw); + mmcb->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("mmmenu.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +void MMChangeBlend(MMSet *mm,FontView *fv) { + char buffer[MmMax*20], *pt; + unichar_t ubuf[MmMax*20]; + int i, k; + struct mmcb mmcb; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[12]; + GTextInfo label[12]; + unichar_t *utemp; + + if ( mm==NULL ) +return; + pt = buffer; + for ( i=0; iinstance_count; ++i ) { + sprintf( pt, "%g, ", mm->defweights[i]); + pt += strlen(pt); + } + if ( pt>buffer ) + pt[-2] = '\0'; + uc_strcpy(ubuf,buffer); + + memset(&mmcb,0,sizeof(mmcb)); + mmcb.mm = mm; + mmcb.fv = fv; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<subwins[mmw_counts],CID_AxisCount)) + +1; + if ( cnt!=mmw->old_axis_count ) { + GGadget *list = GWidgetGetControl(mmw->subwins[mmw_counts],CID_MasterCount); + int32 len; + GTextInfo **ti = GGadgetGetList(list,&len); + for ( i=0; i<16; ++i ) + ti[i]->disabled = (i+1) < (1<old_axis_count = cnt; + } +} + +static int MMW_AxisCntChanged(GGadget *g, GEvent *e) { + + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + SetMasterToAxis(GDrawGetUserData(GGadgetGetWindow(g))); + } +return( true ); +} + +static void MMUsurpNew(SplineFont *sf) { + /* This is a font that wasn't in the original MMSet */ + /* We ARE going to use it in the final result */ + /* So if it is attached to a fontview, we must close that window and */ + /* claim the splinefont for ourselves */ + FontView *fv, *nextfv; + + if ( sf->fv!=NULL ) { + if ( sf->kcld!=NULL ) + KCLD_End(sf->kcld); + if ( sf->vkcld!=NULL ) + KCLD_End(sf->vkcld); + sf->kcld = sf->vkcld = NULL; + + for ( fv=sf->fv; fv!=NULL; fv=nextfv ) { + nextfv = fv->nextsame; + fv->nextsame = NULL; + _FVCloseWindows(fv); + fv->sf = NULL; + GDrawDestroyWindow(fv->gw); + } + sf->fv = NULL; + SFClearAutoSave(sf); + } +} + +static void MMDetachNew(SplineFont *sf) { + /* This is a font that wasn't in the original MMSet */ + /* We aren't going to use it in the final result */ + /* If it is attached to a fontview, then the fontview retains control */ + /* If not, then free it */ + if ( sf->fv==NULL ) + SplineFontFree(sf); +} + +static void MMDetachOld(SplineFont *sf) { + /* This is a font that was in the original MMSet */ + /* We aren't going to use it in the final result */ + /* So then free it */ + sf->mm = NULL; + SplineFontFree(sf); +} + +static void MMW_Close(MMW *mmw) { + int i; + for ( i=0; ilcnt; ++i ) + MMDetachNew(mmw->loaded[i]); + free(mmw->loaded); + MMSetFreeContents(mmw->mm); + chunkfree(mmw->mm,sizeof(MMSet)); + mmw->done = true; +} + +static int MMW_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + MMW *mmw = GDrawGetUserData(GGadgetGetWindow(g)); + MMW_Close(mmw); + } +return( true ); +} + +static void MMW_SetState(MMW *mmw) { + int i; + + GDrawSetVisible(mmw->subwins[mmw->state],true); + for ( i=mmw_counts; i<=mmw_others; ++i ) + if ( i!=mmw->state ) + GDrawSetVisible(mmw->subwins[i],false); + + GGadgetSetEnabled(GWidgetGetControl(mmw->gw,CID_Prev),mmw->state!=mmw_counts); + GGadgetSetEnabled(GWidgetGetControl(mmw->gw,CID_Next),mmw->state!=mmw_others); + GGadgetSetEnabled(GWidgetGetControl(mmw->gw,CID_OK),mmw->state==mmw_others); +} + +static int ParseWeights(GWindow gw,int cid, int str_r, + real *list, int expected, int tabset_cid, int aspect ) { + int cnt=0; + const unichar_t *ret, *pt; unichar_t *endpt; + + ret= _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + + for ( pt=ret; *pt==' '; ++pt ); + for ( ; *pt; ) { + list[cnt++] = u_strtod(pt,&endpt); + if ( pt==endpt || ( *endpt!='\0' && *endpt!=' ' )) { + if ( tabset_cid!=-1 ) + GTabSetSetSel(GWidgetGetControl(gw,tabset_cid),aspect); + GWidgetErrorR(_STR_BadAxis,_STR_BadNumberIn_s, + GStringGetResource(str_r,NULL)); +return( 0 ); + } + for ( pt = endpt; *pt==' '; ++pt ); + } + if ( cnt!=expected && expected!=-1 ) { + if ( tabset_cid!=-1 ) + GTabSetSetSel(GWidgetGetControl(gw,tabset_cid),aspect); + GWidgetErrorR(_STR_BadAxis,_STR_WrongNumberOfEntriesIn_s, + GStringGetResource(str_r,NULL)); +return( 0 ); + } + +return( cnt ); +} + +static int ParseList(GWindow gw,int cid, int str_r, int *err, real start, + real end, real **_list, int tabset_cid, int aspect ) { + int i, cnt; + const unichar_t *ret, *pt; unichar_t *endpt; + real *list; + + *_list = NULL; + + ret= _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + for ( pt=ret; *pt==' '; ++pt ); + cnt = *pt=='\0'?0:1 ; + for ( ; *pt; ++pt ) { + if ( *pt==' ' ) ++cnt; + while ( *pt==' ' ) ++pt; + } + if ( start!=end ) + cnt+=2; + list = galloc(cnt*sizeof(real)); + if ( start==end ) + cnt = 0; + else { + list[0] = start; + cnt = 1; + } + + for ( pt=ret; *pt==' '; ++pt ); + for ( ; *pt; ) { + list[cnt++] = u_strtod(pt,&endpt); + if ( pt==endpt || ( *endpt!='\0' && *endpt!=' ' )) { + GTabSetSetSel(GWidgetGetControl(gw,tabset_cid),aspect); + free(list); + GWidgetErrorR(_STR_BadAxis,_STR_BadNumberIn_s, + GStringGetResource(str_r,NULL)); + *err = true; +return( 0 ); + } + for ( pt = endpt; *pt==' '; ++pt ); + } + if ( start!=end ) + list[cnt++] = end; + for ( i=1; ilist[i] ) { + GTabSetSetSel(GWidgetGetControl(gw,tabset_cid),aspect); + GWidgetErrorR(_STR_BadAxis,_STR_ListOutOfOrder, + GStringGetResource(str_r,NULL)); + free(list); + *err = true; +return( 0 ); + } + + *_list = list; +return( cnt ); +} + +static char *_ChooseFonts(char *buffer, SplineFont **sfs, real *positions, + int i, int cnt) { + char *elsepart=NULL, *ret; + int pos; + int k; + + if ( iaxis_count!=1 ) +return( uc_copy("")); + if ( mmw->instance_count==2 ) +return( uc_copy( standard_cdvs[1])); + + for ( i=0; iinstance_count; ++i ) { + positions[i] = mmw->mm->positions[4*i]; + sfs[i] = mmw->mm->instances[i]; + if ( i>0 && positions[i-1]>=positions[i] ) +return( uc_copy("")); + } + temp = _ChooseFonts(buffer,sfs,positions,0,mmw->instance_count); + ret = uc_copy(temp); + free(temp); +return( ret ); +} + +static char *_NormalizeAxis(char *buffer, struct axismap *axis, int i) { + char *elsepart=NULL, *ret; + int pos; + + if ( ipoints-2 ) + elsepart = _NormalizeAxis(buffer,axis,i+1); + + pos = 0; + if ( axis->blends[i+1]==axis->blends[i] ) { + sprintf( buffer, "%g ", axis->blends[i] ); + pos = strlen(buffer); + } else { + if ( axis->designs[i]!=0 ) { + sprintf(buffer, "%g sub ", axis->designs[i]); + pos += strlen(buffer); + } + sprintf(buffer+pos, "%g div ", (axis->designs[i+1]-axis->designs[i])/ + (axis->blends[i+1]-axis->blends[i])); + pos += strlen( buffer+pos ); + if ( axis->blends[i]!=0 ) { + sprintf(buffer+pos, "%g add ", axis->blends[i]); + pos += strlen(buffer+pos); + } + } + + if ( elsepart==NULL ) +return( copy(buffer)); + + ret = galloc(strlen(buffer)+strlen(elsepart)+40); + sprintf(ret,"dup %g le {%s} {%s} ifelse", axis->designs[i+1], buffer, elsepart ); + free(elsepart); +return( ret ); +} + +static char *NormalizeAxis(char *header,struct axismap *axis) { + char *ret; + char buffer[200]; + + ret = _NormalizeAxis(buffer,axis,0); + if ( *header ) { + char *temp; + temp = galloc(strlen(header)+strlen(ret)+2); + strcpy(temp,header); + strcat(temp,ret); + strcat(temp,"\n"); + free(ret); + ret = temp; + } +return( ret ); +} + +static int SameAxes(int cnt1,int cnt2,struct axismap *axismaps1,struct axismap *axismaps2) { + int i,j; + + if ( cnt1!=cnt2 ) +return( false ); + for ( i=0; i=axismaps2[i].designs[j]+.01 || + axismaps1[i].designs[j]<=axismaps2[i].designs[j]-.01 ) +return( false ); + if ( axismaps1[i].blends[j]>=axismaps2[i].blends[j]+.001 || + axismaps1[i].blends[j]<=axismaps2[i].blends[j]-.001 ) +return( false ); + } + } +return( true ); +} + +static void AxisDataCopyFree(struct axismap *into,struct axismap *from,int count) { + int i; + + for ( i=0; i<4; ++i ) { + free(into->blends); free(into->designs); + into->blends = NULL; into->designs = NULL; + into->points = 0; + } + for ( i=0; iinstance_count; ++i ) { + for ( j=0; jaxis_count; ++j ) + if ( old->positions[i*old->axis_count+j] != mm->positions[i*mm->axis_count+j] ) +return( false ); + } +return( true ); +} + +static void MMW_FuncsValid(MMW *mmw) { + unichar_t *ut; + int pos, i; + + if ( !SameAxes(mmw->axis_count,mmw->last_axis_count,mmw->mm->axismaps,mmw->last_axismaps)) { + if ( mmw->old!=NULL && + SameAxes(mmw->axis_count,mmw->old->axis_count,mmw->mm->axismaps,mmw->old->axismaps)) { + ut = uc_copy(mmw->old->ndv); + } else { + char *header = mmw->axis_count==1 ? " " : + mmw->axis_count==2 ? " exch " : + mmw->axis_count==3 ? " 3 -1 roll " : + " 4 -1 roll "; + char *lines[4]; + for ( i=0; iaxis_count; ++i ) + lines[i] = NormalizeAxis(header,&mmw->mm->axismaps[i]); + pos = 0; + for ( i=0; iaxis_count; ++i ) + pos += strlen(lines[i]); + ut = galloc((pos+20)*sizeof(unichar_t)); + uc_strcpy(ut,"{\n" ); pos = 2; + for ( i=0; iaxis_count; ++i ) { + uc_strcpy(ut+pos,lines[i]); + pos += strlen(lines[i]); + } + uc_strcpy(ut+pos,"}" ); + } + GGadgetSetTitle(GWidgetGetControl(mmw->subwins[mmw_funcs],CID_NDV), + ut); + free(ut); + AxisDataCopyFree(mmw->last_axismaps,mmw->mm->axismaps,mmw->axis_count); + mmw->last_axis_count = mmw->axis_count; + } + if ( mmw->last_instance_count!=mmw->instance_count ) { + if ( standard_cdvs[4]==NULL ) { + standard_cdvs[4] = galloc(strlen(cdv_4axis[0])+strlen(cdv_4axis[1])+ + strlen(cdv_4axis[2])+2); + strcpy(standard_cdvs[4],cdv_4axis[0]); + strcat(standard_cdvs[4],cdv_4axis[1]); + strcat(standard_cdvs[4],cdv_4axis[2]); + } + if ( mmw->old!=NULL && + mmw->axis_count==mmw->old->axis_count && + mmw->instance_count==mmw->old->instance_count && + PositionsMatch(mmw->old,mmw->mm)) { + ut = uc_copy(mmw->old->cdv); + } else if ( mmw->instance_count==(1<axis_count) && + StandardPositions(mmw->mm,mmw->instance_count,mmw->axis_count)) { + ut = uc_copy(standard_cdvs[mmw->axis_count]); + } else if ( mmw->axis_count==1 && + OrderedPositions(mmw->mm,mmw->instance_count)) { + ut = Figure1AxisCDV(mmw); + } else { + ut = uc_copy(""); + } + GGadgetSetTitle(GWidgetGetControl(mmw->subwins[mmw_funcs],CID_CDV), + ut); + free(ut); + } + mmw->last_instance_count = mmw->instance_count; +} + +static void MMW_WeightsValid(MMW *mmw) { + char *temp; + unichar_t *ut, *utc; + int pos, i; + real axiscoords[4], weights[MmMax]; + + if ( mmw->lastw_instance_count!=mmw->instance_count ) { + temp = galloc(mmw->instance_count*20+1); + pos = 0; + if ( mmw->old!=NULL && mmw->instance_count==mmw->old->instance_count ) { + for ( i=0; iinstance_count; ++i ) { + sprintf(temp+pos,"%g ", mmw->old->defweights[i] ); + pos += strlen(temp+pos); + } + utc = MMDesignCoords(mmw->old); + } else { + for ( i=0; iaxis_count; ++i ) { + if ( strcmp(mmw->mm->axes[i],"Weight")==0 && + 400>=mmw->mm->axismaps[i].designs[0] && + 400<=mmw->mm->axismaps[i].designs[mmw->mm->axismaps[i].points-1]) + axiscoords[i] = 400; + else if ( strcmp(mmw->mm->axes[i],"OpticalSize")==0 && + 12>=mmw->mm->axismaps[i].designs[0] && + 12<=mmw->mm->axismaps[i].designs[mmw->mm->axismaps[i].points-1]) + axiscoords[i] = 12; + else + axiscoords[i] = (mmw->mm->axismaps[i].designs[0]+ + mmw->mm->axismaps[i].designs[mmw->mm->axismaps[i].points-1])/2; + } + i = ExecConvertDesignVector(axiscoords,mmw->axis_count,mmw->mm->ndv,mmw->mm->cdv, + weights); + if ( i!=mmw->instance_count ) { /* The functions don't work */ + for ( i=0; iinstance_count; ++i ) + weights[i] = 1.0/mmw->instance_count; + utc = uc_copy(""); + } else { + for ( i=0; iaxis_count; ++i ) { + sprintf(temp+pos,"%g ", axiscoords[i] ); + pos += strlen(temp+pos); + } + temp[pos-1] = '\0'; + utc = uc_copy(temp); + pos = 0; + } + for ( i=0; iinstance_count; ++i ) { + sprintf(temp+pos,"%g ", weights[i] ); + pos += strlen(temp+pos); + } + } + temp[pos-1] = '\0'; + ut = uc_copy(temp); + GGadgetSetTitle(GWidgetGetControl(mmw->subwins[mmw_others],CID_NewBlends), + ut); + free(temp); free(ut); + + GGadgetSetTitle(GWidgetGetControl(mmw->subwins[mmw_others],CID_NewDesign),utc); + free(utc); + mmw->lastw_instance_count = mmw->instance_count; + } +} + +static GTextInfo *TiFromFont(SplineFont *sf) { + GTextInfo *ti = gcalloc(1,sizeof(GTextInfo)); + ti->text = uc_copy(sf->fontname); + ti->fg = ti->bg = COLOR_DEFAULT; + ti->userdata = sf; +return( ti ); +} + +static GTextInfo **FontList(MMW *mmw, int instance, int *sel) { + FontView *fv; + int cnt, i, pos; + GTextInfo **ti; + + cnt = 0; + if ( mmw->old!=NULL ) { + cnt = mmw->old->instance_count; + } + for ( fv=fv_list; fv!=NULL; fv=fv->next ) { + if ( fv->cidmaster==NULL && fv->sf->mm==NULL ) + ++cnt; + } + cnt += mmw->lcnt; + + ++cnt; /* New */ + ++cnt; /* Browse... */ + + ti = galloc((cnt+1)*sizeof(GTextInfo *)); + pos = -1; + cnt = 0; + if ( mmw->old!=NULL ) { + for ( i=0; iold->instance_count; ++i ) { + if ( mmw->old->instances[i]==mmw->mm->instances[instance] ) pos = cnt; + ti[cnt++] = TiFromFont(mmw->old->instances[i]); + } + } + for ( fv=fv_list; fv!=NULL; fv=fv->next ) { + if ( fv->cidmaster==NULL && fv->sf->mm==NULL ) { + if ( fv->sf==mmw->mm->instances[instance] ) pos = cnt; + ti[cnt++] = TiFromFont(fv->sf); + } + } + for ( i=0; ilcnt; ++i ) { + if ( mmw->loaded[i]==mmw->mm->instances[instance] ) pos = cnt; + ti[cnt++] = TiFromFont( mmw->loaded[i]); + } + if ( pos==-1 ) pos=cnt; + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + ti[cnt]->text = u_copy(GStringGetResource(_STR_New,NULL)); + ti[cnt]->bg = ti[cnt]->fg = COLOR_DEFAULT; + ++cnt; + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + ti[cnt]->text = u_copy(GStringGetResource(_STR_Browse,NULL)); + ti[cnt]->bg = ti[cnt]->fg = COLOR_DEFAULT; + ti[cnt]->userdata = (void *) (-1); + ++cnt; + ti[cnt] = gcalloc(1,sizeof(GTextInfo)); + + ti[pos]->selected = true; + *sel = pos; + +return(ti); +} + +static void MMW_DesignsSetup(MMW *mmw) { + int i,j,sel; + char buffer[80], *pt; + unichar_t ubuf[80]; + GTextInfo **ti; + + for ( i=0; iinstance_count; ++i ) { + GGadget *list = GWidgetGetControl(mmw->subwins[mmw_designs],CID_DesignFonts+i*50); + ti = FontList(mmw,i,&sel); + GGadgetSetList(list, ti,false); + GGadgetSetTitle(list, ti[sel]->text); + pt = buffer; + for ( j=0; jaxis_count; ++j ) { + sprintf(pt,"%g ",mmw->mm->positions[i*4+j]); + pt += strlen(pt); + } + if ( pt>buffer ) pt[-1] = '\0'; + uc_strcpy(ubuf,buffer); + GGadgetSetTitle(GWidgetGetControl(mmw->subwins[mmw_designs],CID_AxisWeights+i*50), + ubuf); + } +} + +static SplineFont *MMNewFont(MMSet *mm,int index,char *familyname) { + SplineFont *sf, *base; + char *pt1, *pt2; + int i; + + sf = SplineFontNew(); + free(sf->fontname); free(sf->familyname); free(sf->fullname); free(sf->weight); + sf->familyname = copy(familyname); + if ( index==-1 ) { + sf->fontname = copy(familyname); + for ( pt1=pt2=sf->fontname; *pt1; ++pt1 ) + if ( *pt1!=' ' ) + *pt2++ = *pt1; + *pt2='\0'; + sf->fullname = copy(familyname); + } else + sf->fontname = MMMakeMasterFontname(mm,index,&sf->fullname); + sf->weight = copy( "All" ); + + base = NULL; + if ( mm->normal!=NULL ) + base = mm->normal; + else { + for ( i=0; iinstance_count; ++i ) + if ( mm->instances[i]!=NULL ) { + base = mm->instances[i]; + break; + } + } + + if ( base!=NULL ) { + free(sf->xuid); + sf->xuid = copy(base->xuid); + sf->encoding_name = base->encoding_name; + free(sf->chars); + sf->chars = gcalloc(base->charcnt,sizeof(SplineChar *)); + sf->charcnt = base->charcnt; + sf->new = base->new; + sf->ascent = base->ascent; + sf->descent = base->descent; + free(sf->origname); + sf->origname = copy(base->origname); + if ( index==-1 ) { + free(sf->copyright); + sf->copyright = copy(base->copyright); + } + /* Make sure we get the encoding exactly right */ + for ( i=0; icharcnt; ++i ) if ( base->chars[i]!=NULL ) { + SplineChar *sc = SFMakeChar(sf,i), *bsc = base->chars[i]; + sc->width = bsc->width; sc->widthset = true; + free(sc->name); sc->name = copy(bsc->name); + sc->unicodeenc = bsc->unicodeenc; + } + } + sf->onlybitmaps = false; + sf->order2 = false; + sf->mm = mm; +return( sf ); +} + +static void MMW_DoOK(MMW *mmw) { + real weights[MmMax]; + real fbt; + int err = false; + char *familyname, *fn, *origname=NULL; + int i,j; + MMSet *setto, *dlgmm; + FontView *fv = NULL; + + if ( !GetWeights(mmw->gw, weights, mmw->mm, mmw->instance_count, mmw->axis_count)) +return; + fbt = GetRealR(mmw->subwins[mmw_others],CID_ForceBoldThreshold, + _STR_ForceBoldThreshold,&err); + if ( err ) +return; + familyname = cu_copy(_GGadgetGetTitle(GWidgetGetControl(mmw->subwins[mmw_others],CID_FamilyName))); + /* They only need specify a family name if there are new fonts */ + if ( *familyname=='\0' ) { + free(familyname); + for ( i=0; iinstance_count; ++i ) + if ( mmw->mm->instances[i]==NULL ) + break; + else + fn = mmw->mm->instances[i]->familyname; + if ( i!=mmw->instance_count ) { + GWidgetErrorR(_STR_BadMM,_STR_FamilyNameRequired); +return; + } + familyname = copy(fn); + } + + /* Did we have a fontview open on this mm? */ + if ( mmw->old!=NULL ) { + for ( j=0; jold->instance_count; ++j ) + if ( mmw->old->instances[j]->fv!=NULL ) { + fv = mmw->old->instances[j]->fv; + origname = copy(mmw->old->instances[j]->origname); + break; + } + } + + /* Make sure we free all fonts that we have lying around and aren't going */ + /* to be using. (ones we opened, ones in the old version of the mm). Also */ + /* if any font we want to use is attached to a fontview, then close the */ + /* window */ + for ( i=0; iinstance_count; ++i ) if ( mmw->mm->instances[i]!=NULL ) { + if ( mmw->old!=NULL ) { + for ( j=0; jold->instance_count; ++j ) + if ( mmw->mm->instances[i]==mmw->old->instances[j] ) + break; + if ( j!=mmw->old->instance_count ) { + mmw->old->instances[j] = NULL; + continue; + } + } + for ( j=0; jlcnt; ++j ) + if ( mmw->mm->instances[i]==mmw->loaded[j] ) + break; + if ( j!=mmw->lcnt ) { + mmw->loaded[j] = NULL; +continue; + } + MMUsurpNew(mmw->mm->instances[i]); + } + if ( mmw->old!=NULL ) { + for ( j=0; jold->instance_count; ++j ) + if ( mmw->old->instances[j]!=NULL ) { + MMDetachOld(mmw->old->instances[j]); + mmw->old->instances[j] = NULL; + } + MMDetachOld(mmw->old->normal); + mmw->old->normal = NULL; + } + for ( j=0; jlcnt; ++j ) { + if ( mmw->loaded[j]!=NULL ) { + MMDetachNew(mmw->loaded[j]); + mmw->loaded[j] = NULL; + } + } + + dlgmm = mmw->mm; + setto = mmw->old; + if ( setto!=NULL ) { + MMSetFreeContents(setto); + memset(setto,0,sizeof(MMSet)); + } else + setto = chunkalloc(sizeof(MMSet)); + setto->axis_count = mmw->axis_count; + setto->instance_count = mmw->instance_count; + for ( i=0; iaxis_count; ++i ) + setto->axes[i] = dlgmm->axes[i]; + setto->axismaps = dlgmm->axismaps; + setto->defweights = galloc(setto->instance_count*sizeof(real)); + memcpy(setto->defweights,weights,setto->instance_count*sizeof(real)); + free(dlgmm->defweights); + setto->positions = galloc(setto->instance_count*setto->axis_count*sizeof(real)); + for ( i=0; iinstance_count; ++i ) + memcpy(setto->positions+i*setto->axis_count,dlgmm->positions+i*dlgmm->axis_count, + setto->axis_count*sizeof(real)); + free(dlgmm->positions); + setto->instances = gcalloc(setto->instance_count,sizeof(SplineFont *)); + for ( i=0; iinstance_count; ++i ) { + if ( dlgmm->instances[i]!=NULL ) { + setto->instances[i] = dlgmm->instances[i]; + setto->instances[i]->mm = setto; + } + } + setto->normal = MMNewFont(setto,-1,familyname); + if ( fbt>0 && fbt<=1 ) { + char buffer[20]; + sprintf(buffer,"%g", fbt ); + setto->normal->private = gcalloc(1,sizeof(struct psdict)); + PSDictChangeEntry(setto->normal->private,"ForceBoldThreshold",buffer); + } + for ( i=0; iinstance_count; ++i ) { + if ( dlgmm->instances[i]==NULL ) + setto->instances[i] = MMNewFont(setto,i,familyname); + setto->instances[i]->fv = fv; + } + free(dlgmm->instances); + setto->cdv = dlgmm->cdv; + setto->ndv = dlgmm->ndv; + chunkfree(dlgmm,sizeof(MMSet)); + if ( origname!=NULL ) { + for ( i=0; iinstance_count; ++i ) { + free(setto->instances[i]->origname); + setto->instances[i]->origname = copy(origname); + } + free(setto->normal->origname); + setto->normal->origname = origname; + } else { + for ( i=0; iinstance_count; ++i ) { + free(setto->instances[i]->origname); + setto->instances[i]->origname = copy(setto->normal->origname); + } + } + if ( fv!=NULL ) { + for ( i=0; iinstance_count; ++i ) + if ( fv->sf==setto->instances[i]) + break; + if ( i==setto->instance_count ) { + SplineFont *sf = setto->normal; + BDFFont *bdf; + int same = fv->filled == fv->show; + fv->sf = sf; + bdf = SplineFontPieceMeal(fv->sf,sf->display_size<0?-sf->display_size:default_fv_font_size, + (fv->antialias?pf_antialias:0)|(fv->bbsized?pf_bbsized:0), + NULL); + BDFFontFree(fv->filled); + fv->filled = bdf; + if ( same ) + fv->show = bdf; + } + } + free(familyname); + MMReblend(fv,setto); + + /* Multi-Mastered bitmaps don't make much sense */ + /* Well, maybe grey-scaled could be interpolated, but yuck */ + for ( i=0; iinstance_count; ++i ) { + BDFFont *bdf, *bnext; + for ( bdf = setto->instances[i]->bitmaps; bdf!=NULL; bdf = bnext ) { + bnext = bdf->next; + BDFFontFree(bdf); + } + setto->instances[i]->bitmaps = NULL; + } + + if ( fv==NULL ) + fv = FontViewCreate(setto->normal); + mmw->done = true; +} + +static void MMW_DoNext(MMW *mmw) { + int i, err; + real start, end, *designs, *norm; + int n, n2; + + if ( mmw->state==mmw_others ) +return; + + /* Parse stuff!!!!! */ + if ( mmw->state==mmw_counts ) { + mmw->axis_count = GGadgetGetFirstListSelectedItem(GWidgetGetControl(mmw->subwins[mmw_counts],CID_AxisCount))+1; + mmw->instance_count = GGadgetGetFirstListSelectedItem(GWidgetGetControl(mmw->subwins[mmw_counts],CID_MasterCount))+1; + /* Arrays are already allocated out to maximum, and we will just leave*/ + /* them there until user hits OK, then we make them the right size */ + for ( i=0; i<4; ++i ) + GTabSetSetEnabled(GWidgetGetControl(mmw->subwins[mmw_axes],CID_WhichAxis), + i,iaxis_count); + for ( i=0; isubwins[mmw_designs],CID_WhichDesign), + i,iinstance_count); + /* If we've changed the axis count, and the old selected axis isn't */ + /* available any more, choose another one */ + if ( GTabSetGetSel(GWidgetGetControl(mmw->subwins[mmw_axes],CID_WhichAxis))>= + mmw->axis_count ) + GTabSetSetSel(GWidgetGetControl(mmw->subwins[mmw_axes],CID_WhichAxis), + 0); + if ( mmw->instance_count==(1<axis_count) ) { + for ( i=(mmw->old==NULL)?0:mmw->old->instance_count; iinstance_count; ++i ) { + mmw->mm->positions[i*4 ] = (i&1) ? 1 : 0; + mmw->mm->positions[i*4+1] = (i&2) ? 1 : 0; + mmw->mm->positions[i*4+2] = (i&4) ? 1 : 0; + mmw->mm->positions[i*4+3] = (i&8) ? 1 : 0; + } + } + } else if ( mmw->state==mmw_axes ) { + for ( i=0; iaxis_count; ++i ) { + free(mmw->mm->axes[i]); + mmw->mm->axes[i] = cu_copy(_GGadgetGetTitle(GWidgetGetControl(mmw->subwins[mmw_axes],CID_AxisType+i*100))); + if ( *mmw->mm->axes[i]=='\0' ) { + GTabSetSetSel(GWidgetGetControl(mmw->subwins[mmw_axes],CID_WhichAxis), + i); + GWidgetErrorR(_STR_BadAxis,_STR_SetAxisType); +return; /* Failure */ + } + err = false; + start = GetRealR(mmw->subwins[mmw_axes],CID_AxisBegin+i*100, + _STR_Begin,&err); + end = GetRealR(mmw->subwins[mmw_axes],CID_AxisEnd+i*100, + _STR_End,&err); + if ( start>=end ) { + GTabSetSetSel(GWidgetGetControl(mmw->subwins[mmw_axes],CID_WhichAxis), + i); + GWidgetErrorR(_STR_BadAxis,_STR_AxisRangeNotValid); +return; /* Failure */ + } + n = ParseList(mmw->subwins[mmw_axes],CID_IntermediateDesign+i*100, + _STR_DesignSettings,&err,start,end,&designs,CID_WhichAxis,i); + n2 = ParseList(mmw->subwins[mmw_axes],CID_IntermediateNormalized+i*100, + _STR_NormalizedSettings,&err,0,1,&norm,CID_WhichAxis,i); + if ( n!=n2 || err ) { + GTabSetSetSel(GWidgetGetControl(mmw->subwins[mmw_axes],CID_WhichAxis), + i); + if ( !err ) + GWidgetErrorR(_STR_BadAxis,_STR_DesignNormMustCorrespond); + free(designs); free(norm); +return; /* Failure */ + } + mmw->mm->axismaps[i].points = n; + free(mmw->mm->axismaps[i].blends); free(mmw->mm->axismaps[i].designs); + mmw->mm->axismaps[i].blends = norm; mmw->mm->axismaps[i].designs=designs; + } + } else if ( mmw->state==mmw_designs ) { + real positions[MmMax][4]; + int used[MmMax]; + int j,k,mask; + SplineFont *sfs[MmMax]; + GTextInfo *ti; + + memset(used,0,sizeof(used)); + memset(positions,0,sizeof(positions)); + for ( i=0; iinstance_count; ++i ) { + if ( !ParseWeights(mmw->subwins[mmw_designs],CID_AxisWeights+i*50, + _STR_AxisWeights,positions[i],mmw->axis_count, + CID_WhichDesign,i)) +return; + mask = 0; + for ( j=0; jaxis_count; ++j ) { + if ( positions[i][j]==0 ) + /* Do Nothing */; + else if ( positions[i][j]==1.0 ) + mask |= (1<axis_count ) + used[mask] = true; + for ( j=0; jaxis_count; ++k ) + if ( positions[j][k] != positions[i][k] ) + break; + if ( k==mmw->axis_count ) { + GTabSetSetSel(GWidgetGetControl(mmw->subwins[mmw_designs],CID_WhichDesign),i); + GWidgetErrorR(_STR_BadMM,_STR_PositionUsedTwice, + _GGadgetGetTitle(GWidgetGetControl(mmw->subwins[mmw_designs],CID_AxisWeights+i*50))); +return; + } + } + ti = GGadgetGetListItemSelected(GWidgetGetControl(mmw->subwins[mmw_designs],CID_DesignFonts+i*50)); + sfs[i] = ti->userdata; + if ( sfs[i]!=NULL ) { + for ( j=0; jsubwins[mmw_designs],CID_WhichDesign),i); + GWidgetErrorR(_STR_BadMM,_STR_FontUsedTwice,sfs[i]->fontname); +return; + } + } + } + for ( i=0; i<(1<axis_count); ++i ) if ( !used[i] ) { + char buffer[20], *pt = buffer; + for ( j=0; jaxis_count; ++j ) { + sprintf( pt, "%d ", (i&(1<mm->positions,positions,sizeof(positions)); + for ( i=0; iinstance_count; ++i ) + mmw->mm->instances[i] = sfs[i]; + if ( mmw->old!=NULL && + mmw->axis_count==mmw->old->axis_count && + mmw->instance_count==mmw->old->instance_count && + PositionsMatch(mmw->old,mmw->mm)) + /* It's what the font started with, don't complain, already has a cdv */; + else if ( mmw->instance_count==(1<axis_count) && + StandardPositions(mmw->mm,mmw->instance_count,mmw->axis_count)) + /* It's arranged as we expect it to be */; + else if ( mmw->axis_count==1 && + OrderedPositions(mmw->mm,mmw->instance_count)) + /* It's arranged according to our secondary expectations */; + else if ( mmw->instance_count==(1<axis_count) || + mmw->axis_count==1 ) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; + if ( GWidgetAskR(_STR_DisorderedDesigns,buts,0,1,_STR_DisorderedDesignsOk)==1 ) +return; + } + } else if ( mmw->state==mmw_funcs ) { + if ( *_GGadgetGetTitle(GWidgetGetControl(mmw->subwins[mmw_funcs],CID_NDV))=='\0' || + *_GGadgetGetTitle(GWidgetGetControl(mmw->subwins[mmw_funcs],CID_CDV))=='\0' ) { + GWidgetErrorR(_STR_BadFunction,_STR_BadFunction); +return; + } + free(mmw->mm->ndv); free(mmw->mm->cdv); + mmw->mm->ndv = cu_copy( _GGadgetGetTitle(GWidgetGetControl(mmw->subwins[mmw_funcs],CID_NDV))); + mmw->mm->cdv = cu_copy( _GGadgetGetTitle(GWidgetGetControl(mmw->subwins[mmw_funcs],CID_CDV))); + } + + ++mmw->state; + if ( mmw->state==mmw_others ) + MMW_WeightsValid(mmw); + else if ( mmw->state==mmw_funcs ) + MMW_FuncsValid(mmw); + else if ( mmw->state==mmw_designs ) + MMW_DesignsSetup(mmw); + MMW_SetState(mmw); +} + +static void MMW_SimulateDefaultButton(MMW *mmw) { + if ( mmw->state==mmw_others ) + MMW_DoOK(mmw); + else + MMW_DoNext(mmw); +} + +static int MMW_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + MMW *mmw = GDrawGetUserData(GGadgetGetWindow(g)); + MMW_DoOK(mmw); + } +return( true ); +} + +static int MMW_Next(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + MMW *mmw = GDrawGetUserData(GGadgetGetWindow(g)); + MMW_DoNext(mmw); + } +return( true ); +} + +static int MMW_Prev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + MMW *mmw = GDrawGetUserData(GGadgetGetWindow(g)); + if ( mmw->state!=mmw_counts ) { + --mmw->state; + MMW_SetState(mmw); + } + } +return( true ); +} + +static int MMW_CheckOptical(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + MMW *mmw = GDrawGetUserData(GGadgetGetWindow(g)); + char *top, *bottom; + unichar_t *ut; + const unichar_t *ret = _GGadgetGetTitle(g); + int di = (GGadgetGetCid(g)-CID_AxisType)/100; + char buf1[20], buf2[20]; + + if ( mmw->old!=NULL && diold->axis_count && + uc_strcmp(ret,mmw->old->axes[di])==0 ) { + sprintf(buf1,"%g", mmw->old->axismaps[di].designs[0]); + sprintf(buf2,"%g", mmw->old->axismaps[di].designs[mmw->old->axismaps[di].points-1]); + top = buf2; + bottom = buf1; + } else if ( uc_strcmp(ret,"OpticalSize")==0 ) { + top = "72"; + bottom = "6"; + } else { + top = "999"; + bottom = "50"; + } + ut = uc_copy(top); + GGadgetSetTitle(GWidgetGetControl(GGadgetGetWindow(g), + GGadgetGetCid(g)-CID_AxisType + CID_AxisEnd), ut); + free(ut); + ut = uc_copy(bottom); + GGadgetSetTitle(GWidgetGetControl(GGadgetGetWindow(g), + GGadgetGetCid(g)-CID_AxisType + CID_AxisBegin), ut); + free(ut); + } +return( true ); +} + +static int MMW_CheckBrowse(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + MMW *mmw = GDrawGetUserData(GGadgetGetWindow(g)); + /*int di = (GGadgetGetCid(g)-CID_DesignFonts)/50;*/ + GTextInfo *ti = GGadgetGetListItemSelected(g); + char *temp; + SplineFont *sf; + GTextInfo **tis; + int i,sel,oldsel; + unichar_t *ut; + + if ( ti!=NULL && ti->userdata == (void *) -1 ) { + temp = GetPostscriptFontName(NULL,false); + if ( temp==NULL ) +return(true); + sf = LoadSplineFont(temp,0); + if ( sf==NULL ) +return(true); + if ( sf->cidmaster!=NULL || sf->subfonts!=0 ) { + GWidgetErrorR(_STR_BadMM,_STR_NoCIDinMM); +return(true); + } else if ( sf->mm!=NULL ) { + GWidgetErrorR(_STR_BadMM,_STR_NoCIDinMM); +return(true); + } + if ( sf->fv==NULL ) { + if ( mmw->lcnt>=mmw->lmax ) { + if ( mmw->lmax==0 ) + mmw->loaded = galloc((mmw->lmax=10)*sizeof(SplineFont *)); + else + mmw->loaded = grealloc(mmw->loaded,(mmw->lmax+=10)*sizeof(SplineFont *)); + } + mmw->loaded[mmw->lcnt++] = sf; + for ( i=0; iinstance_count; ++i ) { + GGadget *list = GWidgetGetControl(mmw->subwins[mmw_designs],CID_DesignFonts+i*50); + oldsel = GGadgetGetFirstListSelectedItem(list); + tis = FontList(mmw,i,&sel); + tis[sel]->selected = false; + tis[oldsel]->selected = true; + GGadgetSetList(list, tis, false); + } + } + GGadgetSetTitle(g,ut = uc_copy(sf->fontname)); + free(ut); + } + } +return( true ); +} + +static int mmwsub_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("multiplemaster.html"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + MMW_Close(GDrawGetUserData(gw)); +return( true ); + } else if ( event->u.chr.chars[0]=='\r' ) { + MMW_SimulateDefaultButton( (MMW *) GDrawGetUserData(gw)); +return( true ); + } +return( false ); + } +return( true ); +} + +static int mmw_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + MMW *mmw = GDrawGetUserData(gw); + MMW_Close(mmw); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("multiplemaster.html"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + MMW_Close(GDrawGetUserData(gw)); + else + MenuExit(NULL,NULL,NULL); +return( true ); + } else if ( event->u.chr.chars[0]=='\r' ) { + MMW_SimulateDefaultButton( (MMW *) GDrawGetUserData(gw)); +return( true ); + } +return( false ); + } +return( true ); +} + +static MMSet *MMCopy(MMSet *orig) { + MMSet *mm; + int i; + /* Allocate the arrays out to maximum, we'll fix them up later, and we */ + /* retain the proper counts in the mmw structure. This means we don't */ + /* lose data when they shrink and then restore a value */ + + mm = chunkalloc(sizeof(MMSet)); + mm->instance_count = MmMax; + mm->axis_count = 4; + for ( i=0; iaxis_count; ++i ) + mm->axes[i] = copy(orig->axes[i]); + mm->instances = gcalloc(MmMax,sizeof(SplineFont *)); + memcpy(mm->instances,orig->instances,orig->instance_count*sizeof(SplineFont *)); + mm->positions = gcalloc(MmMax*4,sizeof(real)); + for ( i=0; iinstance_count; ++i ) + memcpy(mm->positions+i*4,orig->positions+i*orig->axis_count,orig->axis_count*sizeof(real)); + mm->defweights = gcalloc(MmMax,sizeof(real)); + memcpy(mm->defweights,orig->defweights,orig->instance_count*sizeof(real)); + mm->axismaps = gcalloc(4,sizeof(struct axismap)); + for ( i=0; iaxis_count; ++i ) { + mm->axismaps[i].points = orig->axismaps[i].points; + mm->axismaps[i].blends = galloc(mm->axismaps[i].points*sizeof(real)); + memcpy(mm->axismaps[i].blends,orig->axismaps[i].blends,mm->axismaps[i].points*sizeof(real)); + mm->axismaps[i].designs = galloc(mm->axismaps[i].points*sizeof(real)); + memcpy(mm->axismaps[i].designs,orig->axismaps[i].designs,mm->axismaps[i].points*sizeof(real)); + } + mm->cdv = copy(orig->cdv); + mm->ndv = copy(orig->ndv); +return( mm ); +} + +void MMWizard(MMSet *mm) { + MMW mmw; + GRect pos, subpos; + GWindow gw; + GWindowAttrs wattrs; + GTabInfo axisaspects[5], designaspects[17]; + GGadgetCreateData bgcd[8], cntgcd[6], axisgcd[4][13], designgcd[16][5], + agcd[2], dgcd[3], ogcd[9]; + GTextInfo blabel[8], cntlabel[6], axislabel[4][13], designlabel[16][5], + dlabel, olabels[9]; + char axisbegins[4][20], axisends[4][20]; + char *normalized[4], *designs[4]; + char *pt, *freeme; + int i,k; + int space,blen= GIntGetResource(_NUM_Buttonsize)*100/GGadgetScale(100); + static int axistablab[] = { _STR_Axis1, _STR_Axis2, _STR_Axis3, _STR_Axis4 }; + static char *designtablab[] = { "1", "2", "3", "4", "5", "6", "7", "8", + "9", "10", "11", "12", "13", "14", "15", "16", NULL }; + + memset(&mmw,0,sizeof(mmw)); + mmw.old = mm; + if ( mm!=NULL ) { + mmw.mm = MMCopy(mm); + mmw.axis_count = mm->axis_count; + mmw.instance_count = mm->instance_count; + } else { + mmw.mm = chunkalloc(sizeof(MMSet)); + mmw.axis_count = 1; + mmw.instance_count = 2; + mmw.mm->axis_count = 4; mmw.mm->instance_count = MmMax; + mmw.mm->instances = gcalloc(MmMax,sizeof(SplineFont *)); + mmw.mm->positions = gcalloc(MmMax*4,sizeof(real)); + mmw.mm->defweights = gcalloc(MmMax,sizeof(real)); + mmw.mm->axismaps = gcalloc(4,sizeof(struct axismap)); + mmw.isnew = true; + } + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<axes[i]!=NULL ) { + axislabel[i][k].text = uc_copy(mmw.mm->axes[i]); + axisgcd[i][k].gd.label = &axislabel[i][k]; + } + axisgcd[i][k++].creator = GListFieldCreate; + + axislabel[i][k].text = (unichar_t *) _STR_AxisRange; + axislabel[i][k].text_in_resource = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 5; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y+30; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k++].creator = GLabelCreate; + + if ( mmw.mm->axismaps[i].points<2 ) { + strcpy(axisbegins[i],"50"); + strcpy(axisends[i],"999"); + } else { + sprintf(axisbegins[i],"%g", mmw.mm->axismaps[i].designs[0]); + sprintf(axisends[i],"%g", mmw.mm->axismaps[i].designs[mmw.mm->axismaps[i].points-1]); + } + + axislabel[i][k].text = (unichar_t *) _STR_Begin; + axislabel[i][k].text_in_resource = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 10; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y+16; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k++].creator = GLabelCreate; + + axislabel[i][k].text = (unichar_t *) axisbegins[i]; + axislabel[i][k].text_is_1byte = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 70; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y-4; + axisgcd[i][k].gd.pos.width=50; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k].gd.cid = CID_AxisBegin+i*100; + axisgcd[i][k++].creator = GTextFieldCreate; + + axislabel[i][k].text = (unichar_t *) _STR_End; + axislabel[i][k].text_in_resource = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 130; axisgcd[i][k].gd.pos.y = axisgcd[i][k-2].gd.pos.y; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k++].creator = GLabelCreate; + + axislabel[i][k].text = (unichar_t *) axisends[i]; + axislabel[i][k].text_is_1byte = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 170; axisgcd[i][k].gd.pos.y = axisgcd[i][k-2].gd.pos.y; + axisgcd[i][k].gd.pos.width=50; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k].gd.cid = CID_AxisEnd+i*100; + axisgcd[i][k++].creator = GTextFieldCreate; + + axislabel[i][k].text = (unichar_t *) _STR_IntermediatePoints; + axislabel[i][k].text_in_resource = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 5; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y+30; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k++].creator = GLabelCreate; + + normalized[i]=NULL; + designs[i]=NULL; + if ( mmw.mm->axismaps[i].points>2 ) { + int l,j,len1, len2; + char buffer[30]; + len1 = len2 = 0; + for ( l=0; l<2; ++l ) { + for ( j=1; jaxismaps[i].points-1; ++j ) { + /* I wanted to seperate things with commas, but that isn't*/ + /* a good idea in Europe (comma==decimal point) */ + sprintf(buffer,"%g ",mmw.mm->axismaps[i].designs[j]); + if ( designs[i]!=NULL ) + strcpy(designs[i]+len1, buffer ); + len1 += strlen(buffer); + sprintf(buffer,"%g ",mmw.mm->axismaps[i].blends[j]); + if ( normalized[i]!=NULL ) + strcpy(normalized[i]+len2, buffer ); + len2 += strlen(buffer); + } + if ( l==0 ) { + normalized[i] = galloc(len2+2); + designs[i] = galloc(len1+2); + } else { + normalized[i][len2-1] = '\0'; + designs[i][len1-1] = '\0'; + } + } + } + + axislabel[i][k].text = (unichar_t *) _STR_DesignSettings; + axislabel[i][k].text_in_resource = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 10; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y+16; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k++].creator = GLabelCreate; + + if ( designs[i]!=NULL ) { + axislabel[i][k].text = (unichar_t *) designs[i]; + axislabel[i][k].text_is_1byte = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + } + axisgcd[i][k].gd.pos.x = 120; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y-4; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k].gd.cid = CID_IntermediateDesign+i*100; + axisgcd[i][k++].creator = GTextFieldCreate; + + axislabel[i][k].text = (unichar_t *) _STR_NormalizedSettings; + axislabel[i][k].text_in_resource = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + axisgcd[i][k].gd.pos.x = 10; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y+34; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k++].creator = GLabelCreate; + + if ( normalized[i]!=NULL ) { + axislabel[i][k].text = (unichar_t *) normalized[i]; + axislabel[i][k].text_is_1byte = true; + axisgcd[i][k].gd.label = &axislabel[i][k]; + } + axisgcd[i][k].gd.pos.x = 120; axisgcd[i][k].gd.pos.y = axisgcd[i][k-1].gd.pos.y-4; + axisgcd[i][k].gd.flags = gg_visible | gg_enabled; + axisgcd[i][k].gd.cid = CID_IntermediateNormalized+i*100; + axisgcd[i][k++].creator = GTextFieldCreate; + + axisaspects[i].text = (unichar_t *) axistablab[i]; + axisaspects[i].text_in_resource = true; + axisaspects[i].gcd = axisgcd[i]; + } + axisaspects[0].selected = true; + + agcd[0].gd.pos.x = 3; agcd[0].gd.pos.y = 3; + agcd[0].gd.pos.width = MMW_Width-10; + agcd[0].gd.pos.height = MMW_Height-45; + agcd[0].gd.u.tabs = axisaspects; + agcd[0].gd.flags = gg_visible | gg_enabled; + agcd[0].gd.cid = CID_WhichAxis; + agcd[0].creator = GTabSetCreate; + + GGadgetsCreate(mmw.subwins[mmw_axes],agcd); + SetMasterToAxis(&mmw); + for ( i=0; i<4; ++i ) { + free(axislabel[i][1].text); + free(normalized[i]); + free(designs[i]); + } + + memset(&designgcd,0,sizeof(designgcd)); + memset(&designlabel,0,sizeof(designlabel)); + memset(&dgcd,0,sizeof(dgcd)); + memset(&dlabel,0,sizeof(dlabel)); + memset(&designaspects,0,sizeof(designaspects)); + + for ( i=0; inormal->private,"ForceBoldThreshold"))!=NULL ) + olabels[k].text = (unichar_t *) pt; + else + olabels[k].text = (unichar_t *) ".3"; + olabels[k].text_is_1byte = true; + ogcd[k].gd.label = &olabels[k]; + ogcd[k].gd.pos.x = 15; ogcd[k].gd.pos.y = ogcd[k-1].gd.pos.y+13; + ogcd[k].gd.flags = gg_visible | gg_enabled; + ogcd[k].gd.cid = CID_ForceBoldThreshold; + ogcd[k++].creator = GTextFieldCreate; + + olabels[k].text = (unichar_t *) _STR_Familyname; + olabels[k].text_in_resource = true; + ogcd[k].gd.label = &olabels[k]; + ogcd[k].gd.pos.x = 10; ogcd[k].gd.pos.y = ogcd[k-1].gd.pos.y+30; + ogcd[k].gd.flags = gg_visible | gg_enabled; + ogcd[k++].creator = GLabelCreate; + + freeme=NULL; + if ( mmw.old!=NULL && mmw.old->normal->familyname!=NULL ) + olabels[k].text = (unichar_t *) (mmw.old->normal->familyname); + else + olabels[k].text = (unichar_t *) (freeme= GetNextUntitledName()); + olabels[k].text_is_1byte = true; + ogcd[k].gd.label = &olabels[k]; + ogcd[k].gd.pos.x = 15; ogcd[k].gd.pos.y = ogcd[k-1].gd.pos.y+13; + ogcd[k].gd.pos.width = 150; + ogcd[k].gd.flags = gg_visible | gg_enabled; + ogcd[k].gd.cid = CID_FamilyName; + ogcd[k++].creator = GTextFieldCreate; + + GGadgetsCreate(mmw.subwins[mmw_others],ogcd); + free(freeme); + + mmw.state = mmw_counts; + MMW_SetState(&mmw); + GDrawSetVisible(mmw.subwins[mmw.state],true); + GDrawSetVisible(mmw.gw,true); + + while ( !mmw.done ) + GDrawProcessOneEvent(NULL); + + GDrawDestroyWindow(gw); +} diff --git a/fontforge/nomen-de.c b/fontforge/nomen-de.c new file mode 100644 index 00000000..02cba136 --- /dev/null +++ b/fontforge/nomen-de.c @@ -0,0 +1,63 @@ +#include "nomen.h" + +static enum encoding enc = e_iso8859_1; + +static char str_Language[] = "Deutsch"; +static char str_Cancel[] = "Abbrechen"; +static unichar_t mnemonic_Cancel[] = 'A'; +static char str_Open[] = "Öffnen"; +static unichar_t mnemonic_Open[] = 'f'; +static char str_Save[] = "Speichern"; +static unichar_t mnemonic_Save[] = 'S'; +static char str_New[] = "Neu"; +static unichar_t mnemonic_New[] = 'N'; +static char str_File[] = "Datei"; +static unichar_t mnemonic_File[] = 'D'; +static char str_Edit[] = "Bearbeiten"; +static unichar_t mnemonic_Edit[] = 'B'; +static char str_View[] = "Ansicht"; +static unichar_t mnemonic_View[] = 'A'; +static char str_Help[] = "Hilfe"; +static unichar_t mnemonic_Help[] = 'H'; +static char str_Print[] = "Drucken..."; +static unichar_t mnemonic_Print[] = 'D'; +static char str_Revertfile[] = "Neu laden"; +static unichar_t mnemonic_Revertfile[] = 'l'; +static char str_Saveas[] = "Speichern unter..."; +static unichar_t mnemonic_Saveas[] = 'u'; +static char str_Close[] = "Schließen"; +static unichar_t mnemonic_Close[] = 'c'; +static char str_Prefs[] = "Einstellungen..."; +static unichar_t mnemonic_Prefs[] = 'E'; +static char str_Quit[] = "Beenden"; +static unichar_t mnemonic_Quit[] = 'B'; + +static char str_Undo[] = "Rückgängig machen"; +static unichar_t mnemonic_Undo[] = 'R'; +static char str_Redo[] = "Wieder herstellen"; +static unichar_t mnemonic_Redo[] = 'W'; +static char str_Cut[] = "Ausschneiden"; +static unichar_t mnemonic_Cut[] = 'A'; +static char str_Copy[] = "Kopieren"; +static unichar_t mnemonic_Copy[] = 'K'; +static char str_Paste[] = "Einfügen"; +static unichar_t mnemonic_Paste[] = 'f'; +static char str_SelectAll[] = "Alles auswählen"; +static unichar_t mnemonic_SelectAll[] = 'n'; + +static char str_Allfonts[] = "Alle Schriften"; +static unichar_t mnemonic_Allfonts[] = 'A'; +static char *str_Styles = "Schriftschnitte"; + +static char str_Yes[] = "Ja"; +static unichar_t mnemonic_Yes[] = 'J'; +static char str_No[] = "Nein"; +static unichar_t mnemonic_No[] = 'N'; + +static char *str_Ligatures="Ligaturen"; +static char mnemonic_Ligatures = 'L'; +static char str_StandardLig = "Normale Ligaturen" + +static char *str_UntitledAnchor_n = "Anker-%d"; + +static int num_buttonsize = 60; diff --git a/fontforge/nomen-en.c b/fontforge/nomen-en.c new file mode 100644 index 00000000..88ab54ff --- /dev/null +++ b/fontforge/nomen-en.c @@ -0,0 +1,3444 @@ +#include "nomen.h" + +static enum encoding enc = e_iso8859_1; + +static char str_Language[] = "English"; +static char str_OK[] = "OK"; +static unichar_t mnemonic_OK[] = 'O'; +static char str_Cancel[] = "Cancel"; +static unichar_t mnemonic_Cancel[] = 'C'; +static char str_Open[] = "Open"; +static unichar_t mnemonic_Open[] = 'O'; +static char str_Save[] = "Save"; +static unichar_t mnemonic_Save[] = 'S'; +static char str_Filter[] = "Filter"; +static unichar_t mnemonic_Filter[] = 'F'; +static char str_New[] = "New"; +static unichar_t mnemonic_New[] = 'N'; +static char str_Replace[] = "Replace"; +static char str_Fileexists[] = "File Exists"; +/* "File, %s, exists. Replace it?" */ +static char str_Fileexistspre[] = "File, "; +static char str_Fileexistspost[] = ", exists. Replace it?"; +static char str_Createdir[] = "Create directory..."; +static char str_Dirname[] = "Directory name?"; +static char str_Couldntcreatedir[] = "Couldn't create directory"; +static char str_SelectAll[] = "Select All"; +static char mnemonic_SelectAll ='A'; +static char *str_None ="None"; +static char mnemonic_None ='N'; +/* Menus ... */ +static char str_File[] = "File"; +static unichar_t mnemonic_File[] = 'F'; +static char str_Edit[] = "Edit"; +static unichar_t mnemonic_Edit[] = 'E'; +static char str_Point[] = "Point"; +static unichar_t mnemonic_Point[] = 'P'; +static char str_Element[] = "Element"; +static unichar_t mnemonic_Element[] = 'l'; +static char str_Hints[] = "Hints"; +static unichar_t mnemonic_Hints[] = 'i'; +static char str_View[] = "View"; +static unichar_t mnemonic_View[] = 'V'; +static char str_Metric[] = "Metrics"; +static unichar_t mnemonic_Metric[] = 'M'; +static char str_Window[] = "Window"; +static unichar_t mnemonic_Window[] = 'W'; +static char str_Help[] = "Help"; +static unichar_t mnemonic_Help[] = 'H'; +static char str_Index[] = "Index"; +static unichar_t mnemonic_Index[] = 'I'; +static char str_About[] = "About..."; +static unichar_t mnemonic_About[] = 'A'; +static char str_LicenseDDD[] = "License..."; +static unichar_t mnemonic_LicenseDDD[] = 'L'; +static char str_Recent[] = "Recent"; +static unichar_t mnemonic_Recent[] = 't'; +static char str_Openoutline[] = "Open Outline Window"; +static unichar_t mnemonic_Openoutline[] = 'u'; +static char str_Openbitmap[] = "Open Bitmap Window"; +static unichar_t mnemonic_Openbitmap[] = 'B'; +static char str_Openmetrics[] = "Open Metrics Window"; +static unichar_t mnemonic_Openmetrics[] = 'M'; +static char str_Print[] = "Print..."; +static unichar_t mnemonic_Print[] = 'P'; +static char str_Display[] = "Display..."; +static unichar_t mnemonic_Display[] = 'D'; +static char str_ExecuteScript[] = "Execute Script..."; +static unichar_t mnemonic_ExecuteScript[] = 'x'; +static char str_Revertfile[] = "Revert File"; +static unichar_t mnemonic_Revertfile[] = 'R'; +static char str_RevertGlyph[] = "Revert Glyph"; +static unichar_t mnemonic_RevertGlyph[] = 'y'; +static char str_Saveas[] = "Save as..."; +static unichar_t mnemonic_Saveas[] = 'a'; +static char str_SaveAll[] = "Save All"; +static unichar_t mnemonic_SaveAll = 'l'; +static char str_Generate[] = "Generate Fonts..."; +static unichar_t mnemonic_Generate[] = 'G'; +static char str_GenerateMac[] = "Generate Mac Family..."; +static unichar_t mnemonic_GenerateMac[] = 'F'; +static char str_Import[] = "Import..."; +static unichar_t mnemonic_Import[] = 'I'; +static char str_Close[] = "Close"; +static unichar_t mnemonic_Close[] = 'c'; +static char str_Prefs[] = "Preferences..."; +static unichar_t mnemonic_Prefs[] = 'e'; +static char str_Quit[] = "Quit"; +static unichar_t mnemonic_Quit[] = 'Q'; +static char str_Fit[] = "Fit"; +static unichar_t mnemonic_Fit[] = 'F'; +static char str_Zoomin[] = "Zoom in"; +static unichar_t mnemonic_Zoomin[] = 'i'; +static char str_Zoomout[] = "Zoom out"; +static unichar_t mnemonic_Zoomout[] = 'o'; +static char str_NextChar[] = "Next Char"; +static unichar_t mnemonic_NextChar[] = 'N'; +static char str_PrevChar[] = "Prev Char"; +static unichar_t mnemonic_PrevChar[] = 'P'; +static char str_NextDefChar[] = "Next Defined Char"; +static unichar_t mnemonic_NextDefChar[] = 'D'; +static char str_PrevDefChar[] = "Prev Defined Char"; +static unichar_t mnemonic_PrevDefChar[] = 'a'; +static char str_Substitutions = "Substitutions"; +static char mnemonic_Substitutions = 'S'; +static char str_RevertSubs = "Revert Substitution"; +static char mnemonic_RevertSubs = 'R'; +static char str_Goto[] = "Goto"; +static unichar_t mnemonic_Goto[] = 'G'; +static char str_InsertCharB[] = "Insert Char Before..."; +static unichar_t mnemonic_InsertCharB[] = 'B'; +static char str_InsertCharA[] = "Insert Char After..."; +static unichar_t mnemonic_InsertCharA[] = 'C'; +static char str_ReplaceChar[] = "Replace Char..."; +static unichar_t mnemonic_ReplaceChar[] = 'R'; +static char str_Hidepoints[] = "Hide Points"; +static unichar_t mnemonic_Hidepoints[] = 't'; +static char str_Showpoints[] = "Show Points"; +static unichar_t mnemonic_Showpoints[] = 't'; +static char str_MarkExtrema[] = "Mark Extrema"; +static unichar_t mnemonic_MarkExtrema[] = 'M'; +static char str_Hiderulers[] = "Hide Rulers"; +static unichar_t mnemonic_Hiderulers[] = 'R'; +static char str_Showrulers[] = "Show Rulers"; +static unichar_t mnemonic_Showrulers[] = 'R'; +static char *str_ShowHMetrics="Show H. Metrics..."; +static char mnemonic_ShowHMetrics = 'H'; +static char *str_ShowVMetrics="Show V. Metrics..."; +static char mnemonic_ShowVMetrics = 'V'; +static char *str_EncodedView="Encoded View"; +static char mnemonic_EncodedView = 'E'; +static char *str_CompactedView="Compacted View"; +static char mnemonic_CompactedView = 'C'; +static char *str_ShowAtt = "Show ATT"; +static char mnemonic_ShowAtt = 'S'; +static char *str_Combinations="Combinations"; +static char mnemonic_Combinations = 'b'; +static char *str_KernPairs="Kern Pairs"; +static char mnemonic_KernPairs = 'K'; +static char *str_Ligatures="Ligatures"; +static char mnemonic_Ligatures = 'L'; +static char *str_AnchoredPairs="Anchored Pairs"; +static char mnemonic_AnchoredPairs = 'A'; +static char *str_FindInFontView="Find In Font View"; +static char mnemonic_FindInFontView = 'V'; +static char str_Fill = "Fill"; +static unichar_t mnemonic_Fill = 'l'; +static char str_ShowGridFitDDD = "Show Grid Fit..."; +static char mnemonic_ShowGridFitDDD = 'w'; +static char str_Select[] = "Select"; +static unichar_t mnemonic_Select[] = 'S'; +static char str_DeselectAll[] = "Deselect All"; +static unichar_t mnemonic_DeselectAll[] = 'D'; +static char str_SelectAllPoints = "Select All Points & Refs"; +static char mnemonic_SelectAllPoints = 'P'; +static char str_SelectAnchors = "Select Anchors"; +static char mnemonic_SelectAnchors = 'c'; +static char str_SelectHMAffected = "Select Points Affected by HM"; +static char str_SelectByATT[] = "Select By ATT..."; +static unichar_t mnemonic_SelectByATT[] = 'T'; +static char str_FirstPoint[] = "First Point"; +static unichar_t mnemonic_FirstPoint[] = 'F'; +static char str_FirstPointNextContour[] = "First Point, Next Contour"; +static unichar_t mnemonic_FirstPointNextContour[] = 'o'; +static char str_Contours[] = "Contours"; +static unichar_t mnemonic_Contours[] = 'C'; +static char str_Nextpoint[] = "Next Point"; +static unichar_t mnemonic_Nextpoint[] = 'N'; +static char str_Prevpoint[] = "Prev Point"; +static unichar_t mnemonic_Prevpoint[] = 'P'; +static char str_NextControlPoint[] = "Next Control Point"; +static unichar_t mnemonic_NextControlPoint[] = 'x'; +static char str_PrevControlPoint[] = "Prev Control Point"; +static unichar_t mnemonic_PrevControlPoint[] = 'r'; +static char str_SelectWidth[] = "Width"; +static unichar_t mnemonic_SelectWidth[] = 'W'; +static char str_SelectVWidth[] = "VWidth"; +static unichar_t mnemonic_SelectVWidth[] = 'V'; +static char str_DeselectWidth[] = "Deselect Width"; +static unichar_t mnemonic_DeselectWidth[] = 'W'; +static char str_DeselectVWidth[] = "Deselect VWidth"; +static unichar_t mnemonic_DeselectVWidth[] = 'V'; +static char str_Undo[] = "Undo"; +static unichar_t mnemonic_Undo[] = 'U'; +static char str_Redo[] = "Redo"; +static unichar_t mnemonic_Redo[] = 'R'; +static char str_Cut[] = "Cut"; +static unichar_t mnemonic_Cut[] = 't'; +static char str_Copy[] = "Copy"; +static unichar_t mnemonic_Copy[] = 'C'; +static char str_Copywidth[] = "Copy Width"; +static unichar_t mnemonic_Copywidth[] = 'W'; +static char str_CopyVWidth[] = "Copy VWidth"; +static unichar_t mnemonic_CopyVWidth[] = 'V'; +static char str_CopyLBearing[] = "Copy LBearing"; +static unichar_t mnemonic_CopyLBearing[] = 'p'; +static char str_CopyRBearing[] = "Copy RBearing"; +static unichar_t mnemonic_CopyRBearing[] = 'g'; +static char str_Copyref[] = "Copy Reference"; +static unichar_t mnemonic_Copyref[] = 'o'; +static char str_Paste[] = "Paste"; +static unichar_t mnemonic_Paste[] = 'P'; +static char str_PasteInto[] = "Paste Into"; +static char str_SameGlyphAs[] = "Same Glyph As"; +static unichar_t mnemonic_SameGlyphAs[] = 'm'; +static char str_Clear[] = "Clear"; +static unichar_t mnemonic_Clear[] = 'l'; +static char str_ClearBackground[] = "Clear Background"; +static unichar_t mnemonic_ClearBackground[] = 'B'; +static char str_CopyFgToBg[] = "Copy Fg To Bg"; +static unichar_t mnemonic_CopyFgToBg[] = 'F'; +static char str_CopyGridFit = "Copy Grid Fit"; +static unichar_t mnemonic_CopyGridFit = 'd'; +static char str_Merge[] = "Merge"; +static unichar_t mnemonic_Merge[] = 'M'; +static char str_Elide = "Elide"; +static unichar_t mnemonic_Elide = 'E'; +static char str_Join[] = "Join"; +static unichar_t mnemonic_Join[] = 'J'; +static char str_Unlinkref[] = "Unlink Reference"; +static unichar_t mnemonic_Unlinkref[] = 'n'; +static char str_SelectColor[] = "Select by Color"; +static unichar_t mnemonic_SelectColor[] = 'S'; +static char str_RemoveUndoes[] = "Remove Undoes"; +static unichar_t mnemonic_RemoveUndoes[] = 'v'; +static char str_Fontinfo[] = "Font Info..."; +static unichar_t mnemonic_Fontinfo[] = 'F'; +static char str_Findprobs[] = "Find Problems..."; +static unichar_t mnemonic_Findprobs[] = 'o'; +static char str_Getinfo[] = "Get Info..."; +static unichar_t mnemonic_Getinfo[] = 'I'; +static char str_OpenReference[] = "Open Reference"; +static char str_ShowDependents[] = "Show Dependents..."; +static unichar_t mnemonic_ShowDependents[] = 'h'; +static char str_Bitmapsavail[] = "Bitmaps Available..."; +static unichar_t mnemonic_Bitmapsavail[] = 'A'; +static char str_Regenbitmaps[] = "Regenerate Bitmaps..."; +static unichar_t mnemonic_Regenbitmaps[] = 'B'; +static char str_Autotrace[] = "Autotrace"; +static unichar_t mnemonic_Autotrace[] = 'r'; +static char str_Transform[] = "Transform..."; +static unichar_t mnemonic_Transform[] = 'T'; +static char str_NonLinearTransform[] = "Non Linear Transform..."; +static char str_Stroke[] = "Expand Stroke..."; +static unichar_t mnemonic_Stroke[] = 'E'; +static char str_TilePath[] = "Tile Path..."; +static unichar_t mnemonic_TilePath[] = 'P'; +static char str_Overlap[] = "Overlap"; +static unichar_t mnemonic_Overlap[] = 'v'; +static char str_Rmoverlap[] = "Remove Overlap"; +static unichar_t mnemonic_Rmoverlap[] = 'R'; +static char str_Intersect[] = "Intersect"; +static unichar_t mnemonic_Intersect[] = 'I'; +static char str_Exclude[] = "Exclude"; +static unichar_t mnemonic_Exclude[] = 'E'; +static char str_FindIntersections[] = "Find Intersections"; +static unichar_t mnemonic_FindIntersections[] = 'F'; +static char str_Simplify[] = "Simplify"; +static unichar_t mnemonic_Simplify[] = 'S'; +static char str_SimplifyMore[] = "Simplify More..."; +static char str_CleanupChar[] = "Cleanup Char"; +static unichar_t mnemonic_CleanupChar[] = 'n'; +static char str_AddExtrema[] = "Add Extrema"; +static unichar_t mnemonic_AddExtrema[] = 'x'; +static char str_Align[] = "Align"; +static unichar_t mnemonic_Align[] = 'l'; +static char str_AveragePts[] = "Average Points"; +static unichar_t mnemonic_AveragePts[] = 'A'; +static char str_SpacePts[] = "Space Points"; +static unichar_t mnemonic_SpacePts[] = 'S'; +static char str_SpaceRegions[] = "Space Regions..."; +static unichar_t mnemonic_SpaceRegions[] = 'R'; +static char str_MakeParallel[] = "Make Parallel..."; +static unichar_t mnemonic_MakeParallel[] = 'P'; +static char str_Round2int[] = "Round to int"; +static unichar_t mnemonic_Round2int[] = 'd'; +static char str_Order = "Order"; +static char str_First = "First"; +static char mnemonic_First = 'F'; +static char str_Last = "Last"; +static char mnemonic_Last = 'L'; +static char str_Earlier = "Earlier"; +static char mnemonic_Earlier = 'E'; +static char str_Later = "Later"; +static char mnemonic_Later = 'a'; +static char str_Effects = "Effects"; +static char str_Inline = "Inline"; +static char mnemonic_Inline = 'I'; +static char str_Shadow = "Shadow"; +static char mnemonic_Shadow = 'S'; +static char str_Wireframe = "Wireframe"; +static char mnemonic_Wireframe = 'W'; +static char str_Build[] = "Build"; +static unichar_t mnemonic_Build[] = 'u'; +static char str_Buildaccent[] = "Build Accented Char"; +static unichar_t mnemonic_Buildaccent[] = 'B'; +static char str_Buildcomposit[] = "Build Composite Char"; +static unichar_t mnemonic_Buildcomposit[] = 'C'; +static char str_Clockwise[] = "Clockwise"; +static unichar_t mnemonic_Clockwise[] = 'o'; +static char str_Cclockwise[] = "Counter Clockwise"; +static unichar_t mnemonic_Cclockwise[] = 'n'; +static char str_Correct[] = "Correct Direction"; +static unichar_t mnemonic_Correct[] = 'C'; +static char str_Corner[] = "Corner"; +static unichar_t mnemonic_Corner[] = 'o'; +static char str_Curve[] = "Curve"; +static unichar_t mnemonic_Curve[] = 'C'; +static char str_Tangent[] = "Tangent"; +static unichar_t mnemonic_Tangent[] = 'T'; +static char str_Autohint[] = "AutoHint"; +static unichar_t mnemonic_Autohint[] = 'H'; +static char str_FullAutohint[] = "Full AutoHint"; +static unichar_t mnemonic_FullAutohint[] = 'H'; +static char str_HintSubsPts[] = "Hint Substitution Pts"; +static unichar_t mnemonic_HintSubsPts[] = 'S'; +static char str_AutoCounterHint[] = "Auto Counter Hint"; +static unichar_t mnemonic_AutoCounterHint[] = 'C'; +static char str_DontAutoHint[] = "Don't AutoHint"; +static unichar_t mnemonic_DontAutoHint[] = 'D'; +static char str_AutoInstr[] = "AutoInstr"; +static unichar_t mnemonic_AutoInstr[] = 'I'; +static char str_EditInstructions[] = "Edit Instructions..."; +static unichar_t mnemonic_EditInstructions[] = 'E'; +static char str_DebugDDD = "Debug..."; +static char mnemonic_DebugDDD = 'D'; +static char str_Editfpgm[] = "Edit 'fpgm'..."; +static char str_Editprep[] = "Edit 'prep'..."; +static char str_Editcvt[] = "Edit 'cvt '..."; +static char str_ClearHints[] = "Clear Hints"; +static unichar_t mnemonic_ClearHints[] = 'C'; +static char str_ClearInstructions[] = "Clear Instructions"; +static char str_Clearhstem[] = "Clear HStem"; +static unichar_t mnemonic_Clearhstem[] = 'C'; +static char str_Clearvstem[] = "Clear VStem"; +static unichar_t mnemonic_Clearvstem[] = 'V'; +static char str_Cleardstem[] = "Clear DStem"; +static unichar_t mnemonic_Cleardstem[] = 'D'; +static char str_Histograms = "Histograms"; +static char str_Addhhint[] = "Add HHint"; +static unichar_t mnemonic_Addhhint[] = 'A'; +static char str_Addvhint[] = "Add VHint"; +static unichar_t mnemonic_Addvhint[] = 's'; +static char str_Adddhint[] = "Add DHint"; +static unichar_t mnemonic_Adddhint[] = 't'; +static char str_Createhhint[] = "Create HHint..."; +static unichar_t mnemonic_Createhhint[] = 'r'; +static char str_Createvhint[] = "Create VHint..."; +static unichar_t mnemonic_Createvhint[] = 'e'; +static char str_Reviewhints[] = "Review Hints..."; +static unichar_t mnemonic_Reviewhints[] = 'R'; +static char str_MinimumDistance[] = "MinimumDistance"; +static unichar_t mnemonic_MinimumDistance[] = 'M'; +static char str_ClearAllMD[] = "Clear All MD"; +static unichar_t mnemonic_ClearAllMD[] = 'C'; +static char str_ClearSelXMD[] = "Clear Selected x MD"; +static unichar_t mnemonic_ClearSelXMD[] = 's'; +static char str_ClearSelYMD[] = "Clear Selected y MD"; +static unichar_t mnemonic_ClearSelYMD[] = 'e'; +static char str_ClearWidthMD[] = "Clear Width MD"; +static unichar_t mnemonic_ClearWidthMD[] = 'W'; +static char str_AddxMD[] = "Add x MD"; +static unichar_t mnemonic_AddxMD[] = 'x'; +static char str_AddMD2Width[] = "Add MD Here to Width"; +static unichar_t mnemonic_AddMD2Width[] = 'W'; +static char str_AddyMD[] = "Add y MD"; +static unichar_t mnemonic_AddyMD[] = 'y'; +static char str_RoundX[] = "Round X"; +static unichar_t mnemonic_RoundX[] = 'R'; +static char str_NoRoundX[] = "No Round X"; +static unichar_t mnemonic_NoRoundX[] = 'N'; +static char str_RoundY[] = "Round Y"; +static unichar_t mnemonic_RoundY[] = 'u'; +static char str_NoRoundY[] = "No Round Y"; +static unichar_t mnemonic_NoRoundY[] = 'o'; +static char str_Export[] = "Export..."; +static unichar_t mnemonic_Export[] = 't'; +static char str_Palettes[] = "Palettes"; +static unichar_t mnemonic_Palettes[] = 'P'; +static char str_Tools[] = "Tools"; +static unichar_t mnemonic_Tools[] = 'T'; +static char str_Layers[] = "Layers"; +static unichar_t mnemonic_Layers[] = 'L'; +static char str_DockedPalettes[] = "Docked Palettes"; +static unichar_t mnemonic_DockedPalettes[] = 'D'; +static char str_Shades[] = "Shades"; +static unichar_t mnemonic_Shades[] = 'S'; +static char str_Center[] = "Center in Width"; +static unichar_t mnemonic_Center[] = 'C'; +static char str_Thirds[] = "Thirds in Width"; +static unichar_t mnemonic_Thirds[] = 'T'; +static char str_Setwidth[] = "Set Width..."; +static unichar_t mnemonic_Setwidth[] = 'W'; +static char str_SetVWidth[] = "Set Vertical Advance..."; +static unichar_t mnemonic_SetVWidth[] = 'V'; +static char str_Setlbearing[] = "Set LBearing..."; +static unichar_t mnemonic_Setlbearing[] = 'L'; +static char str_Setrbearing[] = "Set RBearing..."; +static unichar_t mnemonic_Setrbearing[] = 'R'; +static char str_Removekern[] = "Remove Kern Pairs"; +static unichar_t mnemonic_Removekern[] = 'P'; +static char str_RemoveVKern[] = "Remove VKern Pairs"; +static char str_Mergekern[] = "Merge Kern Info..."; +static unichar_t mnemonic_Mergekern[] = 'M'; +static char str_24[] = "24 pixel outline"; +static unichar_t mnemonic_24[] = '2'; +static char str_36[] = "36 pixel outline"; +static unichar_t mnemonic_36[] = '3'; +static char str_48[] = "48 pixel outline"; +static unichar_t mnemonic_48[] = '4'; +static char str_72[] = "72 pixel outline"; +static unichar_t mnemonic_72[] = '7'; +static char str_96[] = "96 pixel outline"; +static unichar_t mnemonic_96[] = '9'; +static char str_Antialias[] = "Anti Alias"; +static unichar_t mnemonic_Antialias[] = 'A'; +static char str_FitToEm[] = "Fit to em"; +static unichar_t mnemonic_FitToEm[] = 'F'; +static char str_Charinfo[] = "Char Info..."; +static unichar_t mnemonic_Charinfo[] = 'I'; +static char str_CharInfoFor[] = "Char Info for %.40hs"; +static char str_TypoFeatures = "Typo. Features"; +static char mnemonic_TypoFeatures = 'y'; +static char str_CopyFeatureToFont = "Copy Feature(s) To Font..."; +static char mnemonic_CopyFeatureToFont = 'C'; +static char str_DefaultATT = "Default ATT"; +static char mnemonic_DefaultATT = 'D'; +static char str_RemoveAllFeatures = "Remove All Features"; +static char mnemonic_RemoveAllFeatures = 'R'; +static char str_RemoveUnusedNested = "Remove Unused Nested"; +static char mnemonic_RemoveUnusedNested = 'N'; +static char str_RemoveFeature = "Remove Feature(s)..."; +static char mnemonic_RemoveFeature = 'e'; +static char str_RetagFeature = "Retag Feature(s)..."; +static char mnemonic_RetagFeature = 'T'; +static char str_Mergefonts[] = "Merge Fonts..."; +static unichar_t mnemonic_Mergefonts[] = 'M'; +static char str_Interp[] = "Interpolate Fonts..."; +static unichar_t mnemonic_Interp[] = 'l'; +static char str_Copyfrom[] = "Copy From"; +static unichar_t mnemonic_Copyfrom[] = 'F'; +static char str_Allfonts[] = "All Fonts"; +static unichar_t mnemonic_Allfonts[] = 'A'; +static char str_Displayedfont[] = "Displayed Font"; +static unichar_t mnemonic_Displayedfont[] = 'D'; +static char str_CharName[] = "Char Metadata"; +static unichar_t mnemonic_CharName[] = 'N'; +static char str_Autokern[] = "Auto Kern..."; +static unichar_t mnemonic_Autokern[] = 'K'; +static char str_KernByClasses[] = "Kern By Classes..."; +static unichar_t mnemonic_KernByClasses[] = 'n'; +static char str_VKernByClasses[] = "VKern By Classes..."; +static char str_Autowidth[] = "Auto Width..."; +static unichar_t mnemonic_Autowidth[] = 'A'; +static char str_Removeallkern[] = "Remove All Kern Pairs"; +static unichar_t mnemonic_Removeallkern[] = 'P'; +static char str_RemoveAllVKern[] = "Remove All VKern Pairs"; +static char str_VKernFromHKern = "VKern From HKern"; +static char str_Outline[] = "Outline"; +static char str_OutlineMn[] = "Outline"; +static unichar_t mnemonic_OutlineMn[] = 'O'; +static char str_Vertical = "Vertical"; +static unichar_t mnemonic_Vertical = 'V'; +static char str_Showgrid[] = "Show Grid"; +static unichar_t mnemonic_Showgrid[] = 'G'; +static char str_Hidegrid[] = "Hide Grid"; +static unichar_t mnemonic_Hidegrid[] = 'G'; +static char str_Bigger[] = "Bigger Pixel Size"; +static unichar_t mnemonic_Bigger[] = 'B'; +static char str_Smaller[] = "Smaller Pixel Size"; +static unichar_t mnemonic_Smaller[] = 'S'; +static char str_Fliph[] = "Flip Horizontally"; +static unichar_t mnemonic_Fliph[] = 'H'; +static char str_Flipv[] = "Flip Vertically"; +static unichar_t mnemonic_Flipv[] = 'V'; +static char str_Rotate90cw[] = "Rotate 90° CW"; +static unichar_t mnemonic_Rotate90cw[] = 'R'; +static char str_Rotate90ccw[] = "Rotate 90° CCW"; +static unichar_t mnemonic_Rotate90ccw[] = '9'; +static char str_Rotate180[] = "Rotate 180°"; +static unichar_t mnemonic_Rotate180[] = '1'; +static char str_Skew[] = "Skew..."; +static unichar_t mnemonic_Skew[] = 'S'; +static char str_MakeFirst = "Make First"; +static char mnemonic_MakeFirst = 'M'; +static char str_AddAnchor = "Add Anchor"; +static char mnemonic_AddAnchor = 'A'; +static char *str_CID = "CID"; +static char mnemonic_CID = 'C'; +static char *str_Convert2CID = "Convert to CID"; +static char mnemonic_Convert2CID = 'C'; +static char *str_ConvertByCMap = "Convert By CMap"; +static char mnemonic_ConvertByCMap = 'M'; +static char *str_Flatten = "Flatten"; +static char mnemonic_Flatten = 'F'; +static char *str_FlattenByCMap = "FlattenByCMap"; +static char mnemonic_FlattenByCMap = 'a'; +static char *str_InsertFont = "Insert Font..."; +static char mnemonic_InsertFont = 'o'; +static char *str_InsertBlank = "Insert Blank"; +static char mnemonic_InsertBlank = 'B'; +static char *str_RemoveFont = "Remove Font"; +static char mnemonic_RemoveFont = 'R'; +static char *str_CIDFontInfo = "CID Font Info..."; +static char mnemonic_CIDFontInfo = 'I'; +static char *str_MM = "MM"; +static char *str_MMInfo = "MM Info..."; +static char mnemonic_MMInfo = 'I'; +static char *str_CreateMM = "Create MM..."; +static char mnemonic_CreateMM = 'C'; +static char *str_MMValid = "MM Validity Check"; +static char mnemonic_MMValid = 'V'; +static char *str_ChangeMMBlend = "MM Change Def Weights..."; +static char mnemonic_MMValid = 'W'; +static char *str_MMReblend = "MM Reblend"; +static char mnemonic_MMReblend = 'R'; + + /* Font Info dlg */ +static char str_Custom[] = "Custom"; +static char str_Compacted[] = "Compacted"; +static char str_Isolatin1[] = "ISO 8859-1 (Latin1)"; +static char str_Isolatin0[] = "ISO 8859-15 (Latin0)"; +static char str_Isolatin2[] = "ISO 8859-2 (Latin2)"; +static char str_Isolatin3[] = "ISO 8859-3 (Latin3)"; +static char str_Isolatin4[] = "ISO 8859-4 (Latin4)"; +static char str_Isolatin5[] = "ISO 8859-9 (Latin5)"; +static char str_Isolatin6[] = "ISO 8859-10 (Latin6)"; +static char str_Isolatin7[] = "ISO 8859-13 (Latin7)"; +static char str_Isolatin8[] = "ISO 8859-14 (Latin8)"; +static char str_Isocyrillic[] = "ISO 8859-5 (Cyrillic)"; +static char str_Koi8cyrillic[] = "KOI8-R (Cyrillic)"; +static char str_Isoarabic[] = "ISO 8859-6 (Arabic)"; +static char str_Isogreek[] = "ISO 8859-7 (Greek)"; +static char str_Isohebrew[] = "ISO 8859-8 (Hebrew)"; +static char str_Isothai[] = "ISO 8859-11 (Thai)"; +static char str_MacLatin[] = "Macintosh Latin"; +static char str_Win[] = "Windows Latin (\042ANSI\042)"; +static char str_Adobestd[] = "Adobe Standard"; +static char str_Symbol[] = "Symbol"; +static unichar_t str_Texbase[] = { 0x3a4, 0x3b5, 0x3a7, ' Base (8r)', '\0' }; +static char str_Unicode[] = "ISO 10646-1 (Unicode, BMP)"; +static char str_Unicode4[] = "ISO 10646-1 (Unicode, Full)"; +static char str_UnicodePlanes[] = "ISO 10646-? (by plane) ..."; +static char str_Jis208[] = "JIS 208 (Kanji)"; +static char str_Jis212[] = "JIS 212 (Kanji)"; +static char str_SJIS[] = "SJIS (Kanji)"; +static char str_Korean[] = "KSC 5601-1987 (Korean)"; +static char str_KoreanJohab[] = "Johab (Korean)"; +static char str_KoreanWansung[] = "Wansung (Korean)"; +static char str_Chinese[] = "GB 2312 (Simp. Chinese)"; +static char str_ChinesePacked = "Packed GB 2312 (Chinese)"; +static char str_ChineseTrad[] = "Big5 (Trad. Chinese)"; +static char str_ChineseTradHKSCS[] = "Big5 HKSCS (Trad. Chinese)"; +static char str_Reducing[] = "You are reducing the number of characters below the\012current number. This will delete some characters.\012Is that what you wish to do?"; +static char str_Toofew[] = "Too Few Characters"; +static char str_LosingUndoes[] = "Losing Undoes"; +static char str_ChangingOrderLosesUndoes[] = "Changing the order of the splines in the font will lose all undoes.\nContinue anyway?"; +static char str_Badfamilyn[] = "Bad Family Name, must begin with an alphabetic character."; +static char str_Badfamily[] = "Bad Family Name"; +static char str_Badascentdescentn[] = "Ascent and Descent must be positive and their sum less than 16384"; +static char str_Badascentdescent[] = "Bad Ascent/Descent"; +static char str_Fontinformation[] = "Font Information for %.90hs"; +static char str_WhichPlane[] = "Which Unicode plane:"; +static char str_Familyname[] = "Family Name:"; +static unichar_t mnemonic_Familyname[] = 'F'; +static char str_Fontname[] = "Fontname:"; +static unichar_t mnemonic_Fontname[] = 'N'; +static char str_Humanname[] = "Name For Humans:"; +static unichar_t mnemonic_Humanname[] = 's'; +static char str_Encoding[] = "Encoding:"; +static unichar_t mnemonic_Encoding[] = 'E'; +static char str_Load[] = "Load"; +static unichar_t mnemonic_Load[] = 'L'; +static char str_Makefromfont[] = "Make From Font"; +static unichar_t mnemonic_Makefromfont[] = 'k'; +static char str_Remove[] = "Remove"; +static unichar_t mnemonic_Remove[] = 'M'; +static char str_ForceEncoding[] = "Force Encoding"; +static unichar_t mnemonic_ForceEncoding[] = 'F'; +static char str_ForceEncodingPopup[] = "Normally changing the encoding moves characters from their old location\nto their appriate location in the new encoding.\nBut if this box is checked, then FontForge assumes that\nthe glyphs are in the right place already, but\nhave got the wrong names and will rename everything\nto match the new encoding."; +static char str_Italicangle[] = "Italic Angle:"; +static unichar_t mnemonic_Italicangle[] = 'I'; +static char str_Upos[] = "Underline Position:"; +static unichar_t mnemonic_Upos[] = 'P'; +static char str_Uheight[] = "Height:"; +static unichar_t mnemonic_Uheight[] = 'H'; +static char str_Ascent[] = "Ascent:"; +static unichar_t mnemonic_Ascent[] = 'A'; +static char str_Descent[] = "Descent:"; +static unichar_t mnemonic_Descent[] = 'D'; +static char str_EmSize[] = "Em Size:"; +static unichar_t mnemonic_EmSize[] = 'E'; +static char str_ScaleOutlines[] = "Scale Outlines"; +static unichar_t mnemonic_ScaleOutlines[] = 'S'; +static char str_Copyright[] = "Copyright:"; +static unichar_t mnemonic_Copyright[] = 'r'; +static char str_Xuid[] = "XUID:"; +static unichar_t mnemonic_Xuid[] = 'X'; +static char str_Numchars[] = "Number of Characters:"; +static unichar_t mnemonic_Numchars[] = 'N'; +static char str_CIDRegistry[] = "CID Registry:"; +static char str_Guess[] = "Guess"; +static unichar_t mnemonic_Guess[] = 'G'; +static char str_Hist[] = "Hist"; +static unichar_t mnemonic_Hist[] = 'H'; +static char str_HistPopup[] = "Histogram Dialog"; +static char *str_FamilyNameRequired = "A Font Family name is required"; +static char *str_PSNameNotNumber = "A Postscript name may not be a number"; +static char *str_BadFamilyName = "Bad Font Family Name"; +static char *str_BadFontName = "Bad Font Name"; +static char *str_NameTooLong = "Name too long, at most 63 characters"; +static char *str_BadModifierName = "Bad Font Modifier Name"; +static char *str_BadPSName = "A Postscript name should be ASCII\nand must not contain (){}[]<>%%/ or space"; +static char *str_Names = "Names"; +static char *str_Encoding2 = "Encoding"; +static char *str_PSGeneral = "General"; +static char *str_PSPrivate = "PS Private"; +static char *str_TTFNames = "TTF Names"; +static char *str_TTFValues = "TTF Values"; +static char *str_Panose = "Panose"; +static char *str_Comment = "Comment"; +static unichar_t str_TeX = { 0x3a4, 0x3b5, 0x3a7, 0 }; +static char *str_InvalidEncoding = "Invalid Encoding"; +static char *str_UniqueIDC = "UniqueID:"; +static char mnemonic_UniqueIDC = 'U'; +static char *str_VersionC = "Version:"; +static char mnemonic_VersionC = 'V'; +static char *str_HasVerticalMetrics = "Has Vertical Metrics"; +static char mnemonic_HasVerticalMetrics = 'V'; +static char *str_VOrigin = "Vertical Origin:"; +static char mnemonic_VOrigin = 'O'; +static char *str_Order2Splines = "Quadratic Splines"; +static char mnemonic_Order2Splines = 'Q'; +static char *str_PopupOrder2Splines = "Use quadratic (that is truetype) splines to hold the outlines of this\nfont rather than cubic (postscript) splines. Set this option if you\nare editing truetype font. Unset it if you are editing an opentype\nor postscript font (FontForge will convert to the appropriate\nspline type when it generates fonts so this is not required)." +static char *str_MultiLayer = "Multi Layered Editing"; +static char mnemonic_MultiLayer = 'M'; +static char *str_PopupMultiLayer = "Allow editing of multiple colors and shades, fills and strokes.\nMulti layered fonts can only be output as type3 or svg fonts." +static char str_UniqueIDTitle = "Change UniqueID?" +static char str_UniqueIDChange = "You have changed this font's name without changing the UniqueID (or XUID).\nThis is probably not a good idea, would you like me to\ngenerate a random new value?"; +static char str_Change = "Change"; +static char mnemonic_Change = 'h'; +static char str_ChangeAll = "Change All"; +static char mnemonic_ChangeAll = 'A'; +static char str_RetainAll = "Retain All"; +static char mnemonic_RetainAll = 'l'; +static char str_Retain = "Retain"; +static char mnemonic_Retain = 'R'; +static char *str_Mismatch = "Mismatch"; +static char *str_MismatchLong = "You have changed one version of %s but not the one under TTF Names. Would you like to set the TTF version to the changed one?"; +static char *str_Rename = "Rename..."; +static char *mnemonic_Rename = 'R'; +static char *str_NewDDD = "New..."; +static char *mnemonic_NewDDD = 'N'; +static char *str_EditDDD = "Edit..."; +static char *mnemonic_EditDDD = 'E'; +static char *str_ShowFirstMark = "Show First Mark"; +static char *str_ShowNextMark = "Show Next Mark"; +static char *str_ShowFirstBase = "Show First Base"; +static char *str_ShowNextBase = "Show Next Base"; +static char *str_NoMore = "No More"; +static char *str_NoMoreMarks = "There are no more marks associated with this anchor class"; +static char *str_NoMoreBases = "There are no more base characters associated with this anchor class"; +static char *str_NoMarks = "There are no marks associated with this anchor class"; +static char *str_NoBases = "There are no base characters associated with this anchor class"; +static char *str_NewAnchorClass = "New anchor class"; +static char *str_EditAnchorClass = "Edit anchor class"; +static char *str_DupAnchorClass = "The name, %s, is already in use.\nIf you elect to continue these two anchor classes\nwill be merged when you press the OK button."; +static char *str_DupAnchorClassNotTag = "The name, %s, is already in use with a different tag."; +static char *str_Continue = "Continue"; +static char *mnemonic_Continue = 'o'; +static char *str_AnchorClass = "Anchor Classes"; +static char *str_AnchorClassName = "Anchor Class Name:"; +static char str_FeatureTagTooLong = "Feature tags must be exactly 4 ASCII characters"; +static char str_MissingTag = "Missing Feature Tag"; +static char str_TagReuse = "Tag Reuse"; +static char str_TagReuseLong = "You may not reuse a tag that has already been used for a nested feature" +static char str_OnlyOne = "Only One"; +static char str_OnlyOneCurs = "There may be only one anchor class tagged with 'curs'"; +static char str_CantChange = "Can't do this change" +static char str_CantChangeCurs = "You may not change the tag on an anchor class to or from 'curs'"; +static char str_Contextual = "Contextual"; +static char str_ContextPos = "Context Pos"; +static char str_ContextSub = "Context Sub"; +static char str_ChainPos = "Chain Pos"; +static char str_ChainSub = "Chain Sub"; +static char str_ReverseChainSub = "Reverse Chain Sub"; +static char str_EditDataDDD = "Edit Data..."; +static char str_NewContextPos = "New Contextual Position"; +static char str_NewContextSub = "New Contextual Substitution"; +static char str_NewChainPos = "New Chaining Position"; +static char str_NewChainSub = "New Chaining Substitution"; +static char str_NewReverseChainSub = "New Reverse Chaining Substitution"; +static char str_EditContextPos = "Edit Contextual Position"; +static char str_EditContextSub = "Edit Contextual Substitution"; +static char str_EditChainPos = "Edit Chaining Position"; +static char str_EditChainSub = "Edit Chaining Substitution"; +static char str_EditReverseChainSub = "Edit Reverse Chaining Substitution"; +static char str_MacFeatures = "Mac Features"; +static char str_MacStateMachine = "Mac SM"; +static char str_Indic = "Indic"; +static char str_ContextIns = "Context Ins"; +static char str_NewIndic = "New Indic Rearrangement"; +static char str_EditIndic = "Edit Indic Rearrangement"; +static char str_NewInsert = "New Contextual Glyph Insertion"; +static char str_EditInsert = "Edit Contextual Glyph Insertion"; +static char str_Underline = "Underline"; +static char str_Italic = "Italic"; +static char str_ShadowNoMn = "Shadow"; +static char str_MacStyleSet = "Mac Style Set:"; +static char str_BadStyle = "Bad Style"; +static char str_NotBothCondenseExtend = "A style may not have both condense and extend set (it makes no sense)"; + + /* Names of otf tags for GPOS features for anchor */ +static char *str_abvm = "Above Base Mark"; +static char *str_blwm = "Below Base Mark"; +static char *str_markT = "Mark Positioning"; +static char *str_mkmk = "Mark to Mark"; +static char *str_curs = "Cursive Attachment"; +static char *str_RQD = "Required feature" + /* Private info */ +static char *str_PrivateKey = "Private Key"; +static char *str_KeyInPrivate = "Key (in Private dictionary)"; +static char *str_Add = "Add"; +static char mnemonic_Add = 'A'; + /* TTF Values */ +static char *str_UltraCondensed = "Ultra-Condensed (50%)" +static char *str_ExtraCondensed = "Extra-Condensed (62.5%)" +static char *str_Condensed75 = "Condensed (75%)" +static char *str_SemiCondensed = "Semi-Condensed (87.5%)" +static char *str_Medium100 = "Medium (100%)" +static char *str_SemiExpanded = "Semi-Expanded (112.5%)" +static char *str_Expanded125 = "Expanded (125%)" +static char *str_ExtraExpanded = "Extra-Expanded (150%)" +static char *str_UltraExpanded = "Ultra-Expanded (200%)" +static char *str_Thin100 = "100 Thin"; +static char *str_ExtraLight200 = "200 Extra-Light"; +static char *str_Light300 = "300 Light"; +static char *str_Book400 = "400 Book"; +static char *str_Medium500 = "500 Medium"; +static char *str_DemiBold600 = "600 Demi-Bold"; +static char *str_Bold700 = "700 Bold"; +static char *str_Heavy800 = "800 Heavy"; +static char *str_Black900 = "900 Black"; +static char *str_EmbeddablePopup = "Can this font be embedded in a downloadable (pdf)\ndocument and if so what behaviors are permitted on\nboth the document and the font."; +static char *str_Embeddable = "Embeddable"; +static char mnemonic_Embeddable = 'E'; +static char *str_LineGapPopup = "Sets the linegap field in both the OS/2 and hhea tables"; +static char *str_LineGap = "Line Gap:"; +static char mnemonic_LineGap = 'L'; +static char *str_VLineGapPopup = "Sets the linegap field in the vhea table.\nThis is the horizontal spacing between rows\nof vertically set text."; +static char *str_VLineGap = "Column Spacing:"; +static char mnemonic_VLineGap = 'C'; +static char *str_SetGSUBOrder = "Set GSUB/morx Ordering"; +static char mnemonic_SetGSUBOrder = 'S'; +static char *str_Top = "Top"; +static char mnemonic_Top = 'T'; +static char *str_Bottom= "Bottom"; +static char mnemonic_Bottom= 'B'; +static char *str_Up = "Up"; +static char mnemonic_Up = 'U'; +static char *str_Down= "Down"; +static char mnemonic_Down= 'D'; +static char *str_NeverEmbeddable = "Never Embed/No Editing"; +static char *str_OnlyPrint = "Printable Document"; +static char *str_EditableDoc = "Editable Document"; +static char *str_Installable = "Installable Font"; +static char *str_NoSubsetting = "No Subsetting"; +static char *str_NoSubsettingPopup = "If set then the entire font must be\nembedded in a document when any character is.\nOtherwise the document creator need\nonly include the characters it uses."; +static char *str_OnlyBitmaps = "Only Embed Bitmaps"; +static char *str_OnlyBitmapsPopup = "Only Bitmaps may be embedded\nOutline descriptions may not be\n(if font file contains no bitmaps\nthen nothing may be embedded)"; +static char *str_Serif = "Serif"; +static char *str_SansSerif = "Sans-Serif"; +static char *str_Monospace = "Monospace"; +static char *str_Script = "Script"; +static char *str_Decorative = "Decorative"; +static char *str_Any = "Any"; +static char *str_NoFit = "No Fit"; +static char *str_TextDisplay = "Text & Display"; +static char *str_Pictoral = "Pictoral"; +static char *str_Cove = "Cove"; +static char *str_ObtuseCove = "Obtuse Cove"; +static char *str_SquareCove = "Square Cove"; +static char *str_ObtuseSquareCove = "Obtuse Square Cove"; +static char *str_Square = "Square"; +static char *str_Thin = "Thin"; +static char *str_Bone = "Bone"; +static char *str_Exaggerated = "Exaggerated"; +static char *str_Triangle = "Triangle"; +static char *str_NormalSans = "Normal Sans"; +static char *str_ObtuseSans = "Obtuse Sans"; +static char *str_PerpSans = "Perp Sans"; +static char *str_Flared = "Flared"; +static char *str_Rounded = "Rounded"; +static char *str_VeryLight = "Very Light"; +static char *str_Light = "Light"; +static char *str_Book = "Book"; +static char *str_Medium = "Medium"; +static char *str_Demi = "Demi"; +static char *str_Bold = "Bold"; +static char *str_Heavy = "Heavy"; +static char *str_Black = "Black"; +static char *str_Nord = "Nord"; +static char *str_OldStyle = "Old Style"; +static char *str_Modern = "Modern"; +static char *str_EvenWidth = "Even Width"; +static char *str_Expanded = "Expanded"; +static char *str_Condensed = "Condensed"; +static char *str_VeryExpanded = "Very Expanded"; +static char *str_VeryCondensed = "Very Condensed"; +static char *str_Monospaced ="Monospaced"; +static char *str_VeryLow ="Very Low"; +static char *str_Low ="Low"; +static char *str_MediumLow ="Medium Low"; +static char *str_MediumHigh ="Medium High"; +static char *str_High ="High"; +static char *str_VeryHigh ="Very High"; +static char *str_GradDiag ="Gradual/Diagonal"; +static char *str_GradTrans ="Gradual/Transitional"; +static char *str_GradVert ="Gradual/Vertical"; +static char *str_GradHor ="Gradual/Horizontal"; +static char *str_RapidVert ="Rapid/Vertical"; +static char *str_RapidHor ="Rapid/Horizontal"; +static char *str_InstantVert ="Instant/Vertical"; +static char *str_NormalContact ="Normal/Contact"; +static char *str_NormalWeighted ="Normal/Weighted"; +static char *str_NormalBoxed ="Normal/Boxed"; +static char *str_NormalFlattened ="Normal/Flattened"; +static char *str_NormalRounded ="Normal/Rounded"; +static char *str_NormalOffCenter ="Normal/Off-Center"; +static char *str_NormalSquare ="Normal/Square"; +static char *str_ObliqueContact ="Oblique/Contact"; +static char *str_ObliqueWeighted ="Oblique/Weighted"; +static char *str_ObliqueBoxed ="Oblique/Boxed"; +static char *str_ObliqueFlattened ="Oblique/Flattened"; +static char *str_ObliqueRounded ="Oblique/Rounded"; +static char *str_ObliqueOffCenter ="Oblique/Off-Center"; +static char *str_ObliqueSquare ="Oblique/Square"; +static char *str_StraightArmsH = "Straight Arms/Horizontal"; +static char *str_StraightArmsW = "Straight Arms/Wedge"; +static char *str_StraightArmsV = "Straight Arms/Vertical"; +static char *str_StraightArmsSS = "Straight Arms/Single Serif"; +static char *str_StraightArmsDS = "Straight Arms/Double Serif"; +static char *str_NStraightArmsH = "Non-Straight Arms/Horizontal"; +static char *str_NStraightArmsW = "Non-Straight Arms/Wedge"; +static char *str_NStraightArmsV = "Non-Straight Arms/Vertical"; +static char *str_NStraightArmsSS = "Non-Straight Arms/Single Serif"; +static char *str_NStraightArmsDS = "Non-Straight Arms/Double Serif"; +static char *str_StandardTrimmed = "Standard/Trimmed"; +static char *str_StandardPointed = "Standard/Pointed"; +static char *str_StandardSerifed = "Standard/Serifed"; +static char *str_HighTrimmed = "High/Trimmed"; +static char *str_HighPointed = "High/Pointed"; +static char *str_HighSerifed = "High/Serifed"; +static char *str_ConstantTrimmed = "Constant/Trimmed"; +static char *str_ConstantPointed = "Constant/Pointed"; +static char *str_ConstantSerifed = "Constant/Serifed"; +static char *str_LowTrimmed = "Low/Trimmed"; +static char *str_LowPointed = "Low/Pointed"; +static char *str_LowSerifed = "Low/Serifed"; +static char *str_ConstantSmall = "Constant/Small"; +static char *str_ConstantStandard = "Constant/Standard"; +static char *str_ConstantLarge = "Constant/Large"; +static char *str_DuckingSmall = "Ducking/Small"; +static char *str_DuckingStandard = "Ducking/Standard"; +static char *str_DuckingLarge = "Ducking/Large"; +static char *str_WidthClass ="Width Class"; +static char mnemonic_WidthClass ='C'; +static char *str_WeightClass ="Weight Class"; +static char mnemonic_WeightClass ='W'; +static char *str_PFMFamily ="PFM Family"; +static char mnemonic_PFMFamily ='F'; +static char *str_Family ="Family"; +static char mnemonic_Family ='F'; +static char *str_Serifs ="Serifs"; +static char mnemonic_Serifs ='S'; +static char *str_Weight ="Weight"; +static char mnemonic_Weight ='W'; +static char *str_Proportion ="Proportion"; +static char mnemonic_Proportion ='P'; +static char *str_Contrast ="Contrast"; +static char mnemonic_Contrast ='C'; +static char *str_StrokeVar ="Stroke Variation"; +static char mnemonic_StrokeVar ='V'; +static char *str_ArmStyle ="Arm Style"; +static char mnemonic_ArmStyle ='A'; +static char *str_Letterform ="Letterform"; +static char mnemonic_Letterform ='L'; +static char *str_MidLine ="Midline"; +static char mnemonic_MidLine ='M'; +static char *str_XHeight ="X-Height"; +static char mnemonic_XHeight ='X'; + /* TTF Names */ +static char *str_Styles = "Styles (SubFamily)"; +static char *str_UniqueID = "UniqueID"; +static char *str_Version = "Version"; +static char mnemonic_Version = 'V'; +static char *str_Fullname = "Fullname"; +static char *str_Trademark = "Trademark"; +static char *str_Manufacturer = "Manufacturer"; +static char *str_Designer = "Designer"; +static char *str_Descriptor = "Descriptor"; +static char *str_VenderURL = "Vender URL"; +static char *str_DesignerURL = "Designer URL"; +static char *str_License = "License"; +static char *str_LicenseURL = "License URL"; +static char *str_OTFFamily = "Preferred Family"; +static char *str_OTFStyles = "Preferred Styles"; +static char *str_CompatableFull = "Compatable Full"; +static char *str_SampleText = "Sample Text"; +static char *str_TranslateStyle = "Translate Style"; + /* MS Language list -- http://support.microsoft.com/default.aspx?scid=kb;EN-US;q224804 */ + /* MS Reviewed 12/17/2001 */ +static char *str_Afrikaans = "Afrikaans"; +static char *str_Albanian = "Albanian sq_AL"; +static char *str_Arabic = "Arabic Saudi Arabia"; +static char *str_IraqArabic = "Arabic Iraq"; +static char *str_EgyptArabic = "Arabic Egypt"; +static char *str_LibyaArabic = "Arabic Libya"; +static char *str_AlgeriaArabic = "Arabic Algeria"; +static char *str_MoroccoArabic = "Arabic Morocco"; +static char *str_TunisiaArabic = "Arabic Tunisia"; +static char *str_OmanArabic = "Arabic Oman"; +static char *str_YemenArabic = "Arabic Yemen"; +static char *str_SyriaArabic = "Arabic Syria"; +static char *str_JordanArabic = "Arabic Jordan"; +static char *str_LebanonArabic = "Arabic Lebanon"; +static char *str_KuwaitArabic = "Arabic Kuwait"; +static char *str_UAEArabic = "Arabic U.A.E."; +static char *str_BahrainArabic = "Arabic Bahrain"; +static char *str_QatarArabic = "Arabic Qatar"; +static char *str_Armenian = "Armenian"; +static char *str_Assamese = "Assamese"; +static char *str_LatinAzeri = "Azeri (Latin)"; +static char *str_CyrillicAzeri = "Azeri (Cyrillic)"; +static char *str_Basque = "Basque eu"; +static char *str_Byelorussian = "Byelorussian be_BY"; +static char *str_Bengali = "Bengali"; +static char *str_Bulgarian = "Bulgarian bg_BG"; +static char *str_Catalan = "Catalan ca"; +static char *str_MSChinese = "Chinese (Taiwan)"; +static char *str_PRCChinese = "Chinese (PRC) zh_CN"; +static char *str_HKChinese = "Chinese (Hong Kong) zh_CN"; +static char *str_SingChinese = "Chinese (Singapore)"; +static char *str_MacauChinese = "Chinese (Macau)"; +static char *str_Croatian = "Croatian hr"; +static char *str_Czech = "Czech cs_CZ"; +static char *str_Danish = "Danish da_DK"; +static char *str_Dutch = "Dutch nl_NL"; +static char *str_Flemish = "Dutch (Belgium) nl_BE"; +static char *str_BrEnglish = "English (British) en_UK"; +static char *str_AmEnglish = "English (US) en_US"; +static char *str_CaEnglish = "English (Canada) en_CA"; +static char *str_AuEnglish = "English (Australian) en_AU"; +static char *str_NZEnglish = "English (New Zeeland) en_NZ"; +static char *str_IEEnglish = "English (Irish) en_IE"; +static char *str_SAEnglish = "English (South Africa)"; +static char *str_JamEnglish = "English (Jamaica)"; +static char *str_CarEnglish = "English (Caribbean)"; +static char *str_BelEnglish = "English (Belize)"; +static char *str_TrinEnglish = "English (Trinidad)"; +static char *str_ZimEnglish = "English (Zimbabwe)"; +static char *str_PhilEnglish = "English (Philippines)"; +static char *str_Estonia = "Estonian et_EE"; +static char *str_Finnish = "Finish fi_FI"; +static char *str_Farsi = "Farsi"; +static char *str_Faeroese = "Faeroese"; +static char *str_FRFrench = "French French fr_FR"; +static char *str_BEFrench = "French Belgium fr_BE"; +static char *str_CAFrench = "French Canadian fr_CA"; +static char *str_CHFrench = "French Suiss fr_CH"; +static char *str_LUFrench = "French Luxembourg fr_LU"; +static char *str_MOFrench = "French Monaco"; +static char *str_ITFrench = "French Italian fr_IT"; +static char *str_Georgian = "Georgian"; +static char *str_DEGerman = "German German de_DE"; +static char *str_CHGerman = "German Swiss de_CH"; +static char *str_ATGerman = "German Austrian de_AT"; +static char *str_LUGerman = "German Luxembourg de_LU"; +static char *str_LIGerman = "German Liechtenstein de_LI"; +static char *str_ITGerman = "Tedesco altoatesino de_IT"; +static char *str_Greek = "Greek el_GR"; +static char *str_Gujarati = "Gujarati"; +static char *str_Hebrew = "Hebrew he_IL"; +static char *str_Hindi = "Hindi"; +static char *str_Hungarian = "Hungarian hu_HU"; +static char *str_Icelandic = "Icelandic is_IS"; +static char *str_Indonesian = "Indonesian"; +static char *str_Italian = "Italiano it_IT"; +static char *str_CHItalian = "Italiano Swiss it_CH"; +static char *str_Japanese = "Japanese jp_JP"; +static char *str_Kannada = "Kannada"; +static char *str_Kashmiri = "Kashmiri (India)"; +static char *str_Kazakh = "Kazakh"; +static char *str_Konkani = "Konkani"; +static char *str_LangKorean = "Korean"; +static char *str_LangKoreanJohab = "Korean (Johab)"; +static char *str_Latvian = "Latvian lv_LV"; +static char *str_Lithuanian = "Lithuanian lt_LT"; +static char *str_ClassLithuanian = "Lithuanian (Classic)"; +static char *str_Macedonian = "Macedonian"; +static char *str_Malay = "Malay"; +static char *str_BruMalay = "Malay (Brunei)"; +static char *str_Nepali = "Nepali"; +static char *str_IndNepali = "Nepali (India)"; +static char *str_Norwegian = "Norwegian (Bokmal) no_NO"; +static char *str_NorwegianN = "Norwegian (Nynorsk) no_NO"; +static char *str_Oriya = "Oriya"; +static char *str_Polish = "Polish pl_PL"; +static char *str_PTPortuguese = "Português Português pt_PT"; +static char *str_BRPortuguese = "Português Brasil pt_BR"; +static char *str_Punjabi = "Punjabi"; +static char *str_RhaetoRomanic = "Rhaeto-Romanic"; +static char *str_Romanian = "Romanian ro_RO"; +static char *str_MolRomanian = "Romanian (Moldova)"; +static char *str_Russian = "Russian ru_RU"; +static char *str_MolRussian = "Russian (Moldova)"; +static char *str_Sami = "Sami (Lappish)"; +static char *str_Sanskrit = "Sanskrit"; +static char *str_Serbian = "Serbian (Cyrillic)"; +static char *str_LatSerbian = "Serbian (Latin)"; +static char *str_Sindhi = "Sindhi"; +static char *str_Slovak = "Slovak sk_SK"; +static char *str_Slovenian = "Slovenian sl_SI"; +static char *str_Sorbian = "Sorbian"; +static char *str_TradSpanish = "Spanish (Traditional) es_ES"; +static char *str_MXSpanish = "Spanish Mexico es_MX"; +static char *str_ModSpanish = "Spanish (Modern) es_ES"; +static char *str_GuaSpanish = "Spanish (Guatemala) es"; +static char *str_CRSpanish = "Spanish (Costa Rica) es"; +static char *str_PanSpanish = "Spanish (Panama) es"; +static char *str_DRSpanish = "Spanish (Dominican Republic) es"; +static char *str_VenSpanish = "Spanish (Venezuela) es"; +static char *str_ColSpanish = "Spanish (Colombia) es"; +static char *str_PeruSpanish = "Spanish (Peru) es"; +static char *str_ArgSpanish = "Spanish (Argentina) es"; +static char *str_EcuSpanish = "Spanish (Ecquador) es"; +static char *str_ChiSpanish = "Spanish (Chile) es"; +static char *str_UruSpanish = "Spanish (Uruguay) es"; +static char *str_ParSpanish = "Spanish (Paraguay) es"; +static char *str_BolSpanish = "Spanish (Bolivia) es"; +static char *str_ESSpanish = "Spanish (El Salvador) es"; +static char *str_HonSpanish = "Spanish (Honduras) es"; +static char *str_NicSpanish = "Spanish (Nicaragua) es"; +static char *str_PRSpanish = "Spanish (Puerto Rico) es"; +static char *str_Sutu = "Sutu"; +static char *str_Swahili = "Swahili (Kenyan)"; +static char *str_Swedish = "Swedish (Sweden) sv_SE"; +static char *str_FinSwedish = "Swedish (Finland) sv_FI"; +static char *str_Tamil = "Tamil"; +static char *str_Tatar = "Tatar (Tatarstan)"; +static char *str_Telugu = "Telugu"; +static char *str_LangThai = "Thai"; +static char *str_Tsonga = "Tsonga"; +static char *str_Tswana = "Tswana"; +static char *str_Turkish = "Turkish tr_TR"; +static char *str_Ukrainian = "Ukrainian uk_UA"; +static char *str_Urdu = "Urdu (Pakistan)"; +static char *str_IndUrdu = "Urdu (India)"; +static char *str_Uzbek = "Uzbek (Latin)"; +static char *str_CyrUzbek = "Uzbek (Cyrillic)"; +static char *str_Venda = "Venda"; +static char *str_Vietnamese = "Vietnamese"; +static char *str_Xhosa = "Xhosa"; +static char *str_Yiddish = "Yiddish"; +static char *str_Zulu = "Zulu"; + /* TeX font params */ +static unichar_t str_TeXText = { 0x3a4, 0x3b5, 0x3a7, ' ','T','e','x','t', 0 }; +static unichar_t str_TeXMath = { 0x3a4, 0x3b5, 0x3a7, ' ','M','a','t','h', 0 }; +static unichar_t str_TeXMathExt = { 0x3a4, 0x3b5, 0x3a7, ' ','M','a','t','h',' ','E','x','t', 0 }; +static char *str_MoreParams = "More Params"; +static char *str_DesignSize = "Design Size:"; +static char *str_DesignSizePopup = "The size (in points) for which this face was designed" +static char *str_Slant = "Slant:"; +static char *str_SlantPopup = "In an italic font the horizontal change per unit vertical change" +static char *str_Space = "Space:"; +static char *str_SpacePopup = "The amount of space between words when using this font" +static char *str_Stretch = "Stretch:"; +static char *str_StretchPopup = "The amount of strechable space between words when using this font" +static char *str_Shrink = "Shrink:"; +static char *str_ShrinkPopup = "The amount the space between words may shrink when using this font" +static char *str_XHeightC = "XHeight:"; +static char *str_XHeightCPopup = "The height of the lower case letters with flat tops" +static char *str_Quad = "Quad:"; +static char *str_QuadPopup = "The width of one em" +static char *str_ExtraSp = "Extra Sp:"; +static char *str_ExtraPopup = "Either:\nThe amount of extra space to be added after a sentence\nOr the space to be used within math formulae" +static char *str_MathSp = "Math Sp:"; + /* TeX math font params */ +static char *str_Num1 = "Num1:" +static char *str_Num1Popup = "Amount to raise baseline for numerators in display styles"; +static char *str_Num2 = "Num2:" +static char *str_Num2Popup = "Amount to raise baseline for numerators in non-display styles"; +static char *str_Num3 = "Num3:" +static char *str_Num3Popup = "Amount to raise baseline for numerators in non-display \atop styles"; +static char *str_Denom1 = "Denom1:" +static char *str_Denom1Popup = "Amount to lower baseline for demoninators in display styles"; +static char *str_Denom2 = "Denom2:" +static char *str_Denom2Popup = "Amount to lower baseline for demoninators in non-display styles"; +static char *str_Sup1 = "Sup1:" +static char *str_Sup1Popup = "Amount to raise baseline for superscripts in display styles"; +static char *str_Sup2 = "Sup2:" +static char *str_Sup2Popup = "Amount to raise baseline for superscripts in non-display styles"; +static char *str_Sup3 = "Sup3:" +static char *str_Sup3Popup = "Amount to raise baseline for superscripts in modified styles"; +static char *str_Sub1 = "Sub1:" +static char *str_Sub1Popup = "Amount to lower baseline for subscripts in display styles"; +static char *str_Sub2 = "Sub2:" +static char *str_Sub2Popup = "Amount to lower baseline for subscripts in non-display styles"; +static char *str_SupDrop = "SupDrop:" +static char *str_SupDropPopup = "Amount to below top of large box to place baseline of superscripts" +static char *str_SubDrop = "SubDrop:" +static char *str_SubDropPopup = "Amount to below bottom of large box to place baseline of subscripts" +static char *str_Delim1 = "Delim1:" +static char *str_Delim1Popup = "Size of \comb delimiters in display styles"; +static char *str_Delim2 = "Delim2:" +static char *str_Delim2Popup = "Size of \comb delimiters in non-display styles"; +static char *str_AxisHt = "Axis Ht:" +static char *str_AxisHtPopup = "Height of fraction bar above base line"; + /* TeX math ext font params */ +static char *str_DefRuleThick = "Def Rule Thick:" +static char *str_DefRuleThickPopup = "Default thickness of \over and \overline bars"; +static char *str_BigOpSpace1 = "Big Op Space1:" +static char *str_BigOpSpace1Popup = "The minimum glue space above a large displayed operator"; +static char *str_BigOpSpace2 = "Big Op Space2:" +static char *str_BigOpSpace2Popup = "The minimum glue space below a large displayed operator"; +static char *str_BigOpSpace3 = "Big Op Space3:" +static char *str_BigOpSpace3Popup = "The minimum distance between a limit's baseline and a large displayed\noperator when the limit is above the operator" +static char *str_BigOpSpace4 = "Big Op Space4:" +static char *str_BigOpSpace4Popup = "The minimum distance between a limit's baseline and a large displayed\noperator when the limit is below the operator" +static char *str_BigOpSpace5 = "Big Op Space5:" +static char *str_BigOpSpace5Popup = "The extra glue place above and below displayed limits"; + /* Generate fonts */ /* savefontdlg */ +static char str_Format[] = "Format:"; +static char str_Savefailedtitle[] = "Save Failed"; +static char str_Options = "Options"; +static char str_OptionsPopup = "Allows you to select optional behavior when generating the font"; +static char str_Outputafm[] = "Output AFM"; +static char str_Outputpfm[] = "Output PFM"; +static char str_Outputtfm[] = "Output TFM & ENC"; +static char *str_OutputAfmPopup = "The AFM file contains metrics information that many word-processors will read when using a PostScript\256 font."; +static char *str_OutputPfmPopup = "The PFM file contains information Windows needs to install a PostScript\256 font."; +static char *str_OutputTfmPopup = "The tfm and enc files contain information TeX needs to install a PostScript\256 font."; +static char str_AppleMode[] = "Apple"; +static char *str_AppleModePopup = "Apple and MS/Adobe differ about the format of truetype and opentype files\nThis allows you to select which standard to follow for your font.\nThe main differences are:\n The requirements for the 'postscript' name in the name table conflict\n Bitmap data are stored in different tables\n Scaled composit characters are treated differently\n Use of GSUB rather than morx(t)/feat\n Use of GPOS rather than kern/opbd\n Use of GDEF rather than lcar/prop" +static char str_OpenTypeMode[] = "OpenType"; +static char *str_OpenTypeModePopup = "Apple and MS/Adobe differ about the format of truetype and opentype files\nThis allows you to select which standard to follow for your font.\nThe main differences are:\n The requirements for the 'postscript' name in the name table conflict\n Bitmap data are stored in different tables\n Scaled composit characters are treated differently\n Use of GSUB rather than morx(t)/feat\n Use of GPOS rather than kern/opbd\n Use of GDEF rather than lcar/prop" +static char str_Nooutlinefont[] = "No Outline Font"; +static char str_Nobitmapfonts[] = "No Bitmap Fonts"; +static char str_Afmfailedtitle[] = "Afm Save Failed"; +static char str_Pfmfailedtitle[] = "Pfm Save Failed"; +static char str_Tfmfailedtitle[] = "Tfm Save Failed"; +static char *str_SavingFont = "Saving font"; +static char *str_SavingPSFont = "Saving Postscript Font"; +static char *str_SavingMultiplePSFonts = "Saving Multiple Postscript Fonts"; +static char *str_SavingTTFont = "Saving TrueType Font"; +static char *str_SavingCIDFont = "Saving CID Font"; +static char *str_SavingAFM = "Saving AFM File"; +static char *str_SavingPFM = "Saving PFM File"; +static char *str_SavingTFM = "Saving TFM File"; +static char *str_SavingENC = "Saving ENC File"; +static char *str_SavingBitmapFonts = "Saving Bitmap Font(s)"; +static char *str_NotCID = "Not a CID format"; +static char *str_NotCIDOk = "You are attempting to save a CID font in a non-CID format. This is ok, but it means that only the current sub-font will be saved.\nIs that what you want?"; +static char *str_PixelList = "Pixel List"; +static char *str_EncodingTooLarge="Encoding Too Large"; +static char *str_TwoBEncIn1BFont = "Your font has a 2 byte encoding, but you are attempting to save it in a format that only supports one byte encodings. This means that you won't be able to access anything after the first 256 characters without reencoding the font.\n\nDo you want to procede anyway?"; +static char *str_GreymapDepth = "Bits per Pixel in the greymap" +static char *str_BDFResolution = "BDF Resolution" +static char *str_Other_ = "Other"; +static char *mnemonic_Other_ = "O"; +static char *str_GuessResPopup = "Guess each font's resolution based on its pixel size"; +static char *str_FindMultipleMap = "Find Sub Font Definition file"; +static char *str_NoSubFontDefinitionFile = "No Sub Font Definition file"; +static char *str_PSNames = "PS Names"; +static char *str_PSNamesPopup = "Do you want the font file to contain the names of each character in the font?"; +static char *str_TTFHintsPopup = "Do you want the font file to contain truetype hints? This will not\ngenerate new instructions, it will just make use of whatever is associated\nwith each character." +static char *str_WrongSFDFile = "Wrong type of SFD file"; +static char *str_BadSFDFile = "This looks like one of FontForge's SplineFont DataBase files.\nNot one of TeX's SubFont Definition files.\nAn unfortunate confusion of extensions."; +static char *str_BadFamilyForMac = "Bad Mac Family"; +static char *str_BadMacFamily = "To generate a Mac family file, the current font must have plain (Normal, Regular, etc.) style, and there must be other open fonts with the same family name."; +static char *str_TwoFontsSameStyle = "There are two open fonts with the current family name and the same style. %.30hs and %.30hs"; +static char *str_DifferentEncodings = "The font %1$.30hs has a different encoding than that of %2$.30hs"; +static char *str_BadDrawingOperation = "Bad Drawing Operation"; +static char *str_Type3NotTrans = "This font contains at least one translucent layer, but type3 does not support that (anything translucent or transparent is treated as opaque). Do you want to proceed anyway?" +static char *str_SvgNoImages = "This font contains at least one translucent layer, but type3 does not support that (anything translucent or transparent is treated as opaque). Do you want to proceed anyway?"; +static char *str_NotdefName = "Notdef name"; +static char *str_NotdefChar = "The character at encoding %d is named \".notdef\" but contains an outline. Because it is called \".notdef\" it will not be included in the generated font. You may give it a new name using Element->Char Info. Do you wish to continue font generation (and omit this character)?"; +static char *str_EmSizeBad = "Non-standard Em-Size"; +static char *str_PSEmSize1000 = "The convention is that PostScript fonts should have an Em-Size of 1000. But this font has a size of %d. This is not an error, but you might consider altering the Em-Size with the Element->Font Info->PS General dialog.\nDo you wish to continue to generate your font in spite of this?"; +static char *str_TTFEmSize2 = "The convention is that TrueType fonts should have an Em-Size which is a power of 2. But this font has a size of %d. This is not an error, but you might consider altering the Em-Size with the Element->Font Info->PS General dialog.\nDo you wish to continue to generate your font in spite of this?"; +static char *str_NotIntegral = "Not integral"; +static char *str_TryRoundToInt = "This font contains at least one non-integral coordinate.\nThis is perfectly legal, but it is unusual and does\nincrease the size of the generated font file. You might\nwant to try using\n Element->Round To Int\non the entire font."; +static char *str_PostScript = "PostScript®" +static char *str_TrueType = "TrueType" +static char *str_PSHintsPopup = "Do you want the font file to contain PostScript hints?" +static char *str_PSRoundPopup = "Do you want to round coordinates to integers (this saves space)?" +static char *str_HintSubs = "Hint Substitution"; +static char *str_FlexHints = "Flex Hints"; +static char *str_FlexHintsPopup = "Do you want the font file to contain PostScript flex hints?" +static char *str_HintSubsPopup = "Do you want the font file to do hint substitution?" +static char *str_First256 = "First 256"; +static char *str_First256Popup = "Limit the font so that only the first 256 (encoded) characters\nwill be included in the file"; +static char *str_PfaEditTable = "PfaEdit Table"; +static char *str_PfaEditTablePopup = "The PfaEdit table is an extension to the TrueType format\nand contains various data used by FontForge" +static char *str_PfEdComments = "Save Comments"; +static char *str_PfEdCommentsPopup = "Save glyph comments in the PfEd table" +static char *str_PfEdColors = "Save Colors"; +static char *str_PfEdColorsPopup = "Save glyph colors in the PfEd table" + /* Goto character ... */ +static char str_Badnumberin[] = "Bad Number in "; +static char str_Enternameofchar[] = "Enter the name of a character in the font"; +static char str_Couldntfindchar[] = "Could not find the character: %.70hs"; +static char str_CouldntfindcharU[] = "Could not find the character: %.70s"; +static char str_CouldntfindcharT[] = "Could not find the character"; +static char str_CouldntFindSubstitution = "Could not find substitution character: %.40hs"; + /* Font has changed dlg */ +static char str_Dontsave[] = "Don't Save"; +static unichar_t mnemonic_Dontsave[] = 'D'; +static char str_Fontchange[] = "Font changed"; +/* Font %.70s in file %.70s has been changed.\nDo you want to save it? */ +static char str_Fontchangepre[] = "Font "; +static char str_Fontchangemid[] = " in file "; +static char str_Fontchangepost[] = " has been changed.\012Do you want to save it?"; +static char str_Fontchangerevertpost[] = " has been changed.\012Reverting the file will lose those changes.\012Is that what you want?"; + /* General messages from fontview.c */ +static char str_Revert[] = "Revert"; +static unichar_t mnemonic_Revert[] = 'R'; +static char str_Manywin[] = "Many Windows"; +static char str_Toomany[] = "This involves opening more than 10 windows.\012Is that really what you want?"; +static char *str_MergeKernInfo = "Merge Kern Info"; +static char *str_OpenPostscript = "Open Postscript Font"; +static char *str_Loading = "Loading..."; +static char *str_LoadingFontFrom = "Loading font from "; +static char *str_ReadingGlyphs = "Reading Glyphs"; +static char *str_ReadingAFM = "Reading AFM file"; +static char *str_InterpretingGlyphs = "Interpreting Glyphs"; +static char *str_CouldntOpenFontTitle = "Couldn't open font"; +static char *str_NoSuchFontFile = "The requested file, %.100hs, does not exist"; +static char *str_FontFileNotReadable = "You do not have permission to read %.100hs"; +static char *str_CouldntParseFont = "%.100hs is not in a known format (or is so badly corrupted as to be unreadable)"; +static char *str_SaveFailed = "Save Failed"; +static char *str_Transforming = "Transforming..."; +static char *str_Simplifying = "Simplifying..."; +static char *str_AddingExtrema = "Adding points at Extrema..."; +static char *str_RemovingOverlap = "Removing overlaps..."; +static char *str_CorrectingDirection = "Correcting Direction..."; +static char *str_Stroking = "Stroking..."; +static char *str_Rounding = "Rounding to integer..."; +static char *str_Autotracing = "Autotracing..."; +static char *str_ClearDependent = "You are attempting to clear %.30hs which is refered to by\nanother character. Are you sure you want to clear it?"; +static char *str_UnlinkAll = "Unlink All"; +static char *str_Unlink = "Unlink"; +static char *str_dPixelBitmap = "%d pixel bitmap"; +static char *str_ddPixelBitmap = "%d@%d pixel bitmap"; +static char *str_RestrictedRightsFont = "This font is marked with an FSType of 2 (Restricted\nLicense). That means it is not editable without the\npermission of the legal owner.\n\nDo you have such permission?"; +static char *str_RestrictedFont = "Restricted Font"; +static char *str_CloseFont = "Please close font"; +static char *str_CloseFontForCID = "Please close %hs before inserting it into a CID font"; +static char *str_CIDRemoveFontCheck = "Are you sure you wish to remove sub-font %1$.40hs from the CID font %2$.40hs"; +static char *str_FlippedRef = "Flipped Reference"; +static char *str_FlippedRefUnlink = "%.50hs contains a flipped reference. This cannot be corrected as is. Would you like me to unlink it and then correct it?"; +static char *str_Baseline = "Baseline"; +static char *str_Origin = "Origin"; +static char *str_AdvanceWidthAsBar = "Advance Width as a Bar"; +static char *str_AdvanceWidthAsLine = "Advance Width as a Line"; +static char *str_AdvanceBarPopup = "Display the advance width as a bar under the character\nshowing the extent of the advance"; +static char *str_AdvanceLinePopup = "Display the advance width as a line\nperpendicular to the advance direction" +static char *str_Suffix = "Suffix:"; +static char *str_SuffixToTag = "Suffix to Tag..."; + /* Messages from accented characters */ +static char str_Buildingaccented[] = "Building accented letters"; +static char str_Replacearing[] = "Replace Å"; +static char str_Areyousurearing[] = "Are you sure you want to replace Å?\012The ring will not join to the A."; +static char str_Yes[] = "Yes"; +static unichar_t mnemonic_Yes[] = 'Y'; +static char str_No[] = "No"; +static unichar_t mnemonic_No[] = 'N'; + /* Choices from bitmap editing */ +static char str_Rectangle[] = "Rectangle"; +static char str_FilledRectangle[] = "Filled Rectangle"; +static char str_Elipse[] = "Ellipse"; +static char str_FilledElipse[] = "Filled Ellipse"; + /* Get Info ... */ +static char str_Multiple[] = "Multiple"; +static char str_GlyphNameTooLong = "Glyph names are limitted to 31 characters"; +static char str_GlyphNameNoDigits = "A glyph name may not start with a digit nor a full stop (period)" +static char str_GlyphNameBadChars = "A glyph name must be ASCII, without spaces and may not contain the characters \"([{<>}])/%%\", and should contain only alphanumerics, periods and underscores"; +static char str_GlyphNameQuestionableChars = "A glyph name should contain only alphanumerics, periods and underscores\nDo you want to use this name in spite of that?"; +static char str_AlreadyCharUnicode[] = "There is already a character with this Unicode encoding,\012(named %1$.40hs, at local encoding %2$d)\012Is that what you want?"; +static char str_Alreadycharnamed[] = "There is already a character with this name,\012do you want to swap names?"; +static char str_AlreadyLigature[] = "There is already a ligature made from these components,\012(named %1$.40hs, at local encoding %2$d)\012Is that what you want?"; +static char str_Badligature[] = "A ligature may not be made up of itself"; +/* "The component %.20s is not in this font,\nIs that what you want?" */ +static char str_MissingComponent[] = "The component \"%.20s\" is not in this font,\012Is that what you want?"; +static char str_SelfReferential = "This substitution is self-referential" +static char str_Done[] = "Done"; +static unichar_t mnemonic_Done[] = 'D'; +static char str_Ligpop[] = "If this character is a ligature,\012then enter the names of the characters\012into which it decomposes"; +static char *str_Show[] = "Show"; +static unichar_t mnemonic_Show[] = 'S'; +static char *str_PointInfo = "Point Info"; +static char *str_ImageInfo = "Image Info"; +static char *str_ReferenceInfo = "Reference Info"; +static char *str_AnchorPointInfo = "Anchor Point Info"; +static char *str_Dependents = "Dependents"; +static char *str_Offset = "Offset"; +static char *str_Dist = "Dist"; +static char *str_Degree = "\260"; +static char *str_BaseX = "Base X"; +static char *str_BaseY = "Base Y"; +static char *str_NextCP = "Next CP:"; +static char *str_NextCPX = "Next CP X"; +static char *str_NextCPY = "Next CP Y"; +static char *str_NextCPDist = "Next CP Dist"; +static char *str_NextCPAngle = "Next CP Angle"; +static char *str_PrevCP = "Prev CP:"; +static char *str_PrevCPX = "Prev CP X"; +static char *str_PrevCPY = "Prev CP Y"; +static char *str_PrevCPDist = "Prev CP Dist"; +static char *str_PrevCPAngle = "Prev CP Angle"; +static char *str_Type = "Type:"; +static char *str_Location = "Location"; +static char *str_HintMask = "Hint Mask"; +static char *str_ActiveHints = "Active Hints"; +static char *str_UnicodeL = "Unicode"; +static char *str_LigatureL = "Ligature"; +static char *str_Components = "Components"; +static char *str_Counters = "Counters"; +static char *str_AltPos = "Pos"; +static char *str_Pair = "Pair"; +static char *str_Subs = "Subs"; +static char *str_AltSubs = "Alt Subs"; +static char *str_MultSubs = "Mult Subs"; +static char *str_UnicodeName = "Unicode Name:"; +static char mnemonic_UnicodeName = 'N'; +static char *str_UnicodeValue = "Unicode Value:"; +static char mnemonic_UnicodeValue = 'V'; +static char *str_UnicodeChar = "Unicode Char:"; +static char mnemonic_UnicodeChar = 'h'; +static char *str_GlyphClass = "OT Glyph Class:"; +static char mnemonic_GlyphClass = 'G'; +static char *str_Automatic = "Automatic"; +static char *str_NoClass = "No Class"; +static char *str_BaseGlyph = "Base"; +static char *str_MarkGlyph = "Mark"; +static char *str_Component = "Component"; +static char *str_SetFromName = "Set From Name"; +static char mnemonic_SetFromName = 'a'; +static char *str_SetFromValue = "Set From Value"; +static char mnemonic_SetFromValue = 'u'; +static char *str_Ligature = "Ligature:"; +static char mnemonic_Ligature = 'L'; +static char *str_AccentedComponents = "Accented char composed of:"; +static char *str_CompositComponents = "Character composed of:"; +static char *str_NoComponents = "No components"; +static char *str_Color = "Color:"; +static char *str_TransformedBy = "Transformed by:"; +static char *str_NotUnicodeBMP = "Warning: This value is outside of the Unicode BMP.\nIs that really what you want?"; +static char *str_PossiblyTooBig = "Value possibly out of range"; +static char *str_OutOfRange = "Value out of range"; +static char *str_TransformationMatrix = "Transformation Matrix"; +static char *str_TransformChanged = "Transformation Matrix Changed"; +static char *str_TransformChangedApply = "You have changed the transformation matrix, do you wish to use the new version?"; +static char *str_TransformPopup = "The transformation matrix specifies how the points in\nthe source character should be transformed before\nthey are drawn in the current character.\n x(new) = tm[1,1]*x + tm[2,1]*y + tm[3,1]\n y(new) = tm[1,2]*x + tm[2,2]*y + tm[3,2]"; +static char *str_MakeNewClass = "Make a new anchor class"; +static char *str_MakeNewAnchorClass = "I cannot find an unused anchor class\nto assign a new point to. If you\nwish a new anchor point you must\ndefine a new anchor class with\nElement->Font Info"; +static char *str_Mark = "Mark"; +static char *str_BaseChar = "BaseChar"; +static char *str_BaseLig = "BaseLig"; +static char *str_BaseMark = "BaseMark"; +static char *str_CursiveEntry = "CursEntry"; +static char *str_CursiveExit = "CursExit"; +static char *str_LigIndex = "Lig Index:"; +static char *str_LastAnchor = "Last Anchor Point"; +static char *str_RemoveLastAnchor = "You are deleting the last anchor point in this character.\nDoing so will cause this dialog to close, is that what you want?" +static char *str_ClassUsed = "Class already used" +static char *str_AnchorClassUsed ="This anchor class already is associated with a point in this character"; +static char *str_BadClass = "Bad Class" +static char *str_AnchorClassCurs ="You may not change an anchor point to or from the 'curs' class"; +static char *str_XC = "X:"; +static char mnemonic_XC = 'X'; +static char *str_YC = "Y:"; +static char mnemonic_YC = 'Y'; +static char *str_IndexInUse = "Index in use"; +static char *str_LigIndexInUse = "This ligature index is already in use"; +static char *str_OutOfOrder = "Out Of Order"; +static char *str_IndexOutOfOrder = "Marks within a ligature should be ordered with the direction of writing.\nThis one and %d are out of order."; +static char *str_TooBig = "Too Big"; +static char *str_IndexTooBig = "This index is much larger than the closest neighbor" +static char *str_BadPOSSUB = "Bad GPOS/GSUB"; +static char *str_BadPOSSUBPaste = "The string must start with a 4 character type field, be followed by a space, and then contain the information"; +static char *str_ExpectedEquals = "Bad format for position data, expected four = characters with data"; +static char *str_SimpleSubsOneComponent = "A simple substitution must have exactly one component"; +static char *str_NewPosition = "New Position Variant"; +static char *str_NewPair = "New Pair Position"; +static char *str_NewSubstitution = "New Substitution Variant"; +static char *str_NewAlternate = "New Alternate List"; +static char *str_NewMultiple = "New Multiple List"; +static char *str_NewLigature = "New Ligature"; +static char *str_NewCounterMask = "New Counter Mask"; +static char *str_EditPosition = "Edit Position Variant"; +static char *str_EditPair = "Edit Pair Position"; +static char *str_EditSubstitution = "Edit Substitution Variant"; +static char *str_EditAlternate = "Edit Alternate List"; +static char *str_EditMultiple = "Edit Multiple List"; +static char *str_EditLigature = "Edit Ligature"; +static char *str_EditCounterMask = "Edit Counter Mask"; +static char *str_DuplicateTag = "Duplicate Tag"; +static unichar_t *str_Dx = { 0x2206, 'X', ':' }; +static unichar_t *str_Dy = { 0x2206, 'Y', ':' }; +static unichar_t *str_Dxa = { 0x2206, 'X','A','d','v','a','n','c','e', ':' }; +static unichar_t *str_Dya = { 0x2206, 'Y','A','d','v','a','n','c','e', ':' }; +static char *str_TooManyComponents = "Too Many Components"; +static char *str_SubsOnlyOne = "A simple substitution takes exactly one component, but you have provided several"; +static char *str_Itself = "Itself"; +static char *str_PairedChar = "Paired Character:"; +static char *str_MissingPaired = "Missing paired character"; +static char *str_NeedPaired = "You must specify a name by which to identify the paired character"; +static char *str_PairedNotInFont = "The paired character's name (%.50hs) does not match any character in font. Is that what you want?"; +static char *str_OverlappedHints = "Overlapped Hints"; +static char *str_OverlappedHintsLong = "The hint you have just selected overlaps with <%.2f,%.2f>. You should deselect one of the two."; + /* Ligature feature tags */ +static char str_RequiredLig = "Required Ligatures" +static char str_StandardLig = "Standard Ligatures" +static char str_DiscretionaryLig = "Discretionary Ligatures" +static char str_AncientLig = "Ancient Ligatures" +static char str_HistoricLig = "Historic Ligatures" +static char str_FractionLig = "Diagonal Fractions" +static char str_AboveBaseSubs = "Above Base Substitutions" +static char str_AltFrac = "Vertical Fractions" +static char str_Akhand = "Akhand" +static char str_BelowBaseForms = "Below Base Forms" +static char str_BelowBaseSubs = "Below Base Substitutions" +static char str_GlyphCompDecomp = "Glyph Composition/Decomposition" +static char str_HalfForm = "Half Forms" +static char str_HalantForm = "Halant Forms" +static char str_LeadingJamo = "Leading Jamo Forms" +static char str_TrailingJamo = "Trailing Jamo Forms" +static char str_VowelJamo = "Vowel Jamo Forms" +static char str_Nukta = "Nukta Forms" +static char str_PreBaseForms = "Pre Base Forms" +static char str_PreBaseSubs = "Pre Base Substitutions" +static char str_PostBaseForms = "Post Base Forms" +static char str_PostBaseSubs = "Post Base Substitutions" +static char str_Reph = "Reph Form" +static char str_VattuVariants = "Vattu Variants" +static char str_MacLogos = "Logos (Mac Only)" +static char str_MacRebus = "Rebuses (Mac Only)" +static char str_MacDiphthongLig = "Diphthong Ligatures (Mac Only)" +static char str_MacSquareLig = "Square Ligatures (Mac Only)" +static char str_MacAbbrevSquareLig = "Abbreviated Square Ligatures (Mac Only)" +static char str_MacUnicodeDecomposition = "Unicode Decomposition (Mac Only)" + /* simple positioning feature tags */ +static char str_CaseSensForms = "Case-Sensitive Forms"; +static char str_CapitalSpacing = "Capital Spacing"; +static char str_AltHalfWidths = "Alternative Half Widths"; +static char str_LeftBounds = "Left Bounds"; +static char str_OpticalBounds = "Optical Bounds"; +static char str_PropAltMet = "Proportional Alternate Metrics"; +static char str_QuartWidths = "Quarter Widths"; +static char str_RightBounds = "Right Bounds"; +static char str_ThirdWidths = "Third Widths"; +static char str_AltVertMet = "Alternate Vertical Metrics"; +static char str_AltVertHalfMet = "Alternate Vertical Half Metrics"; +static char str_AltVertPropMet = "Proportional Alternate Vertical Metrics"; +static char str_ItalicCorrection = "Italic Correction"; + /* pair positioning feature tags */ +static char str_Distance = "Distance"; +static char str_HorizontalKerning = "Horizontal Kerning"; +static char str_VerticalKerning = "Vertical Kerning"; + /* simple substitution feature tags */ +static char str_AllAlt = "Access All Alternates"; +static char str_AboveBaseForms = "Above Base Forms"; +static char str_Cap2PetiteCaps = "Capitals to Petite Capitals"; +static char str_Cap2SmallCaps = "Capitals to Small Capitals"; +static char str_Denominators = "Denominators"; +static char str_ExpertForms = "Expert Forms"; +static char str_TerminalForms = "Terminal Forms"; +static char str_FullWidths = "Full Widths"; +static char str_HistoricalForms = "Historical Forms"; +static char str_HorKanaAlt = "Horizontal Kana Alternatives"; +static char str_Hanja2Hangul = "Hanja to Hangul" +static char str_HalfWidths = "Half Widths"; +static char str_InitialForms = "Initial Forms"; +static char str_IsolatedForms = "Isolated Forms"; +static char str_Italics = "Italics"; +static char str_JIS78Forms = "JIS78 Forms"; +static char str_JIS83Forms = "JIS83 Forms"; +static char str_JIS90Forms = "JIS90 Forms"; +static char str_LiningFigures = "Lining Figures"; +static char str_LocalizedForms = "Localized Forms"; +static char str_MedialForms = "Medial Forms"; +static char str_MathematicalGreek = "Mathematical Greek"; +static char str_AltAnnotForms = "Alternate Annotation Forms"; +static char str_Numerators = "Numerators"; +static char str_OldstyleFigures = "Oldstyle Figures"; +static char str_Ornaments = "Ornaments"; +static char str_PetiteCaps = "Lowercase to Petite Capitals"; +static char str_PropNumbers = "Proportional Numbers"; +static char str_PropWidth = "Proportional Width"; +static char str_R2LAlt = "Right to Left Alternates"; +static char str_RubyNoteForms = "Ruby Notational Forms"; +static char str_StylisticAlt = "Stylistic Alternatives"; +static char str_ScientificInf = "Scientific Inferiors"; +static char str_SmallCaps = "Lowercase to Small Capitals"; +static char str_SimplifiedForms = "Simplified Forms"; +static char str_StyleSet1 = "Style Set 1"; +static char str_StyleSet2 = "Style Set 2"; +static char str_StyleSet3 = "Style Set 3"; +static char str_StyleSet4 = "Style Set 4"; +static char str_StyleSet5 = "Style Set 5"; +static char str_Subscript = "Subscript"; +static char str_Superscript = "Superscript"; +static char str_Swash = "Swash"; +static char str_Titling = "Titling"; +static char str_TraditionalNameForms = "Traditional Name Forms"; +static char str_TabNumb = "Tabular Numbers"; +static char str_TeXCharList = "TeX Charlist"; +static char str_TeXExtensionList = "TeX Extension List"; +static char str_TraditionalForms = "Traditional Forms"; +static char str_Unicase = "Unicase"; +static char str_VerticalRot = "Vertical Alternates (obs)"; +static char str_VertRotAlt = "Vertical Rotation & Alternates" +static char str_VertKana = "Vertical Kana Alternates" +static char str_SlashedZero = "Slashed Zero" +static char str_MacWordInitialSwash = "Word Initial Swash (Mac Only)" +static char str_MacWordFinalSwash = "Word Final Swash (Mac Only)" +static char str_MacLineInitialSwash = "Line Initial Swash (Mac Only)" +static char str_MacLineFinalSwash = "Line Final Swash (Mac Only)" +static char str_MacNonFinalSwash = "Non-Final Swash (Mac Only)" +static char str_MacMonospaceWidth = "Monospace Width (Mac Only)" + /* (multiple) alternate substitution feature tags */ +static char str_FinalGlyphLine = "Final Glyph On Line" +static char str_JustificationAlt = "Justification Alternatives" +static char str_Randomize = "Randomize" + /* contextual substitution feature tags */ +static char str_TerminalForms2 = "Terminal Forms #2"; +static char str_TerminalForms3 = "Terminal Forms #3"; +static char str_MedialForms2 = "Medial Forms 2"; +static char str_MarkPosViaSubs = "Mark Positioning via Substitution"; + /* contextual substitution chaining feature tags */ +static char str_ContextAltern = "Contextual Alternates"; +static char str_Ordinals = "Ordinals"; + /* reverse contextual substitution chaining feature tags */ +static char str_ContextLig = "Contextual Ligatures"; +static char str_ContextSwash = "Contextual Swash"; + /* Script tags */ +static char str_arab = "Arabic"; +static char str_Aramaic = "Aramaic"; +static char str_armn = "Armenian"; +static char str_Avestan = "Avestan"; +static char str_Batak = "Batak"; +static char str_beng = "Bengali"; +static char str_Bliss = "Bliss Symbolics"; +static char str_bopo = "Bopomofo"; +static unichar_t str_Brahmi = { 'B', 'r', 0x101, 'h', 'm', 0x12b, 0 }; +static char str_brai = "Braille"; +static char str_Buginese = "Buginese"; +static char str_Buhid = "Buhid"; +static char str_byzm = "Byzantine Music"; +static char str_cans = "Canadian Syllabics"; +static char str_Cham = "Cham"; +static char str_cher = "Cherokee"; +static char str_Cirth = "Cirth"; +static char str_CyproMinoan = "Cypro-Minoan"; +static char str_CypriotSyl = "Cypriot syllabary"; +static char str_hani = "CJK Ideographic"; +static char str_cyrl = "Cyrillic"; +static char str_DFLT = "Default"; +static char str_Deseret = "Deseret (Mormon)"; +static char str_deva = "Devanagari"; +static char str_EgyptianDemotic = "Egyptian demotic"; +static char str_EgyptianHieratic = "Egyptian hieratic"; +static char str_EgyptianHieroglyphs = "Egyptian hieroglyphs"; +static char str_ethi = "Ethiopic"; +static char str_geor = "Georgian"; +static char str_Glagolitic = "Glagolitic"; +static char str_Gothic = "Gothic"; +static char str_grek = "Greek"; +static char str_gujr = "Gujarati"; +static char str_guru = "Gurmukhi"; +static char str_jamo = "Hangul Jamo"; +static char str_hang = "Hangul"; +static char str_Hanunoo = "Hanunóo"; +static char str_hebr = "Hebrew"; +static char str_HmongPahawh = "Hmong Pahawh"; +static char str_Indus = "Indus (Harappan)"; +static char str_OldItalic = "Old Italic (Etruscan, Oscan, etc.)"; +static char str_Javanese = "Javanese"; +static char str_KayahLi = "Kayah Li"; +static unichar_t str_Kharosthi = { 'K','h','a','r','o',0x1e63,0x1e6d,'h',0x12b, 0 }; +tdot 0x1e6d, sdot 1e63 +static char str_kana = "Hiragana & Katakana"; +static char str_knda = "Kannada"; +static char str_khmr = "Khmer"; +static char str_lao = "Lao"; +static char str_latn = "Latin"; +static char str_Lepcha = "Lepcha (Róng)"; +static char str_Limbu = "Limbu"; +static char str_LinearA = "Linear A"; +static char str_LinearB = "Linear B"; +static char str_Mandaean = "Mandaean"; +static char str_Mayan = "Mayan hieroglyphs"; +static char str_Meroitic = "Meroitic"; +static unichar_t str_mlym = { 'M','a','l','a','y',0x101,'l','a','m', 0 }; +static char str_mong = "Mongolian"; +static char str_mymr = "Myanmar"; +static char str_ogam = "Ogham"; +static char str_orya = "Oriya"; +static char str_Osmanya = "Osmanya"; +static char str_Pahlavi = "Pahlavi"; +static char str_Permic = "Old Permic"; +static char str_Phoenician = "Phoenician"; +static char str_Phaistos = "Phaistos"; +static char str_Pollard = "Pollard Phonetic"; +static char str_Rongorongo = "Rongorongo"; +static char str_runr = "Runic"; +static char str_Shavian = "Shavian"; +static char str_sinh = "Sinhala"; +static char str_syrc = "Syriac"; +static char str_Tagbanwa = "Tagbanwa"; +static char str_TaiLe = "Tai Le"; +static char str_taml = "Tamil"; +static char str_telu = "Telugu"; +static char str_Tengwar = "Tengwar"; +static char str_Tifinagh = "Tifinagh (Berber)"; +static char str_Tagalog = "Tagalog"; +static char str_thaa = "Thaana"; +static char str_thai = "Thai"; +static char str_tibt = "Tibetan"; +static char str_Ugaritic = "Ugaritic"; +static char str_Vai = "Vai"; +static char str_VisibleSpeech = "Visible Speech"; +static char str_CuneiformOP = "Cuneiform, Old Persian"; +static char str_CuneiformSA = "Cuneiform, Sumero-Akkadian"; +static char str_CuneiformUg = "Cuneiform, Ugaritic"; +static char str_yi = "Yi"; +static char str_PrivateUseScript1 = "Private Use Script 1"; +static char str_PrivateUseScript2 = "Private Use Script 2"; +static char str_UndeterminedScript = "Undetermined Script"; +static char str_UncodedScript = "Uncoded Script"; + /* Language tags */ +static char str_OTFAbaza = "Abaza"; +static char str_OTFAbkhazian = "Abkhazian"; +static char str_OTFAdyghe = "Adyghe"; +static char str_OTFAfrikaans = "Afrikaans"; +static char str_OTFAfar = "Afar"; +static char str_OTFAgaw = "Agaw"; +static char str_OTFAltai = "Altai"; +static char str_OTFAmharic = "Amharic"; +static char str_OTFArabic = "Arabic"; +static char str_OTFAari = "Aari"; +static char str_OTFArakanese = "Arakanese"; +static char str_OTFAssamese = "Assamese"; +static char str_OTFAthapaskan = "Athapaskan"; +static char str_OTFAvar = "Avar"; +static char str_OTFAwadhi = "Awadhi"; +static char str_OTFAymara = "Aymara"; +static char str_OTFAzeri = "Azeri"; +static char str_OTFBadaga = "Badaga"; +static char str_OTFBaghelkhandi = "Baghelkhandi"; +static char str_OTFBalkar = "Balkar"; +static char str_OTFBaule = "Baule"; +static char str_OTFBerber = "Berber"; +static char str_OTFBench = "Bench"; +static char str_OTFBibleCree = "Bible Cree"; +static char str_OTFBelarussian = "Belarussian"; +static char str_OTFBemba = "Bemba"; +static char str_OTFBengali = "Bengali"; +static char str_OTFBulgarian = "Bulgarian"; +static char str_OTFBhili = "Bhili"; +static char str_OTFBhojpuri = "Bhojpuri"; +static char str_OTFBikol = "Bikol"; +static char str_OTFBilen = "Bilen"; +static char str_OTFBlackfoot = "Blackfoot"; +static char str_OTFBalochi = "Balochi"; +static char str_OTFBalante = "Balante"; +static char str_OTFBalti = "Balti"; +static char str_OTFBambara = "Bambara"; +static char str_OTFBamileke = "Bamileke"; +static char str_OTFBreton = "Breton"; +static char str_OTFBrahui = "Brahui"; +static char str_OTFBrajBhasha = "Braj Bhasha"; +static char str_OTFBurmese = "Burmese"; +static char str_OTFBashkir = "Bashkir"; +static char str_OTFBeti = "Beti"; +static char str_OTFCatalan = "Catalan"; +static char str_OTFCebuano = "Cebuano"; +static char str_OTFChechen = "Chechen"; +static char str_OTFChahaGurage = "Chaha Gurage"; +static char str_OTFChattisgarhi = "Chattisgarhi"; +static char str_OTFChichewa = "Chichewa"; +static char str_OTFChukchi = "Chukchi"; +static char str_OTFChipewyan = "Chipewyan"; +static char str_OTFCherokee = "Cherokee"; +static char str_OTFChuvash = "Chuvash"; +static char str_OTFComorian = "Comorian"; +static char str_OTFCoptic = "Coptic"; +static char str_OTFCree = "Cree"; +static char str_OTFCarrier = "Carrier"; +static char str_OTFCrimeanTatar = "Crimean Tatar"; +static char str_OTFChurchSlavonic = "Church Slavonic"; +static char str_OTFCzech = "Czech"; +static char str_OTFDanish = "Danish"; +static char str_OTFDargwa = "Dargwa"; +static char str_OTFWoodsCree = "Woods Cree"; +static char str_OTFGermanStandard = "German (Standard)"; +static char str_OTFDogri = "Dogri"; +static char str_OTFDhivehi = "Dhivehi"; +static char str_OTFDjerma = "Djerma"; +static char str_OTFDangme = "Dangme"; +static char str_OTFDinka = "Dinka"; +static char str_OTFDungan = "Dungan"; +static char str_OTFDzongkha = "Dzongkha"; +static char str_OTFEbira = "Ebira"; +static char str_OTFEasternCree = "Eastern Cree"; +static char str_OTFEdo = "Edo"; +static char str_OTFEfik = "Efik"; +static char str_OTFGreek = "Greek"; +static char str_OTFEnglish = "English"; +static char str_OTFErzya = "Erzya"; +static char str_OTFSpanish = "Spanish"; +static char str_OTFEstonian = "Estonian"; +static char str_OTFBasque = "Basque"; +static char str_OTFEvenki = "Evenki"; +static char str_OTFEven = "Even"; +static char str_OTFEwe = "Ewe"; +static char str_OTFFrenchAntillean = "French Antillean"; +static char str_OTFFarsi = "Farsi"; +static char str_OTFFinnish = "Finnish"; +static char str_OTFFijian = "Fijian"; +static char str_OTFFlemish = "Flemish"; +static char str_OTFForestNenets = "Forest Nenets"; +static char str_OTFFon = "Fon"; +static char str_OTFFaroese = "Faroese"; +static char str_OTFFrenchStandard = "French (Standard)"; +static char str_OTFFrisian = "Frisian"; +static char str_OTFFriulian = "Friulian"; +static char str_OTFFuta = "Futa"; +static char str_OTFFulani = "Fulani"; +static char str_OTFGa = "Ga"; +static char str_OTFGaelic = "Gaelic"; +static char str_OTFGagauz = "Gagauz"; +static char str_OTFGalician = "Galician"; +static char str_OTFGarshuni = "Garshuni"; +static char str_OTFGarhwali = "Garhwali"; +static char str_OTFGeez = "Ge'ez"; +static char str_OTFGilyak = "Gilyak"; +static char str_OTFGumuz = "Gumuz"; +static char str_OTFGondi = "Gondi"; +static char str_OTFGreenlandic = "Greenlandic"; +static char str_OTFGaro = "Garo"; +static char str_OTFGuarani = "Guarani"; +static char str_OTFGujarati = "Gujarati"; +static char str_OTFHaitian = "Haitian"; +static char str_OTFHalam = "Halam"; +static char str_OTFHarauti = "Harauti"; +static char str_OTFHausa = "Hausa"; +static char str_OTFHawaiin = "Hawaiin"; +static char str_OTFHammer_Banna = "Hammer-Banna"; +static char str_OTFHiligaynon = "Hiligaynon"; +static char str_OTFHindi = "Hindi"; +static char str_OTFHighMari = "High Mari"; +static char str_OTFHindko = "Hindko"; +static char str_OTFHo = "Ho"; +static char str_OTFHarari = "Harari"; +static char str_OTFCroatian = "Croatian"; +static char str_OTFHungarian = "Hungarian"; +static char str_OTFArmenian = "Armenian"; +static char str_OTFIgbo = "Igbo"; +static char str_OTFIjo = "Ijo"; +static char str_OTFIlokano = "Ilokano"; +static char str_OTFIndonesian = "Indonesian"; +static char str_OTFIngush = "Ingush"; +static char str_OTFInuktitut = "Inuktitut"; +static char str_OTFIrish = "Irish"; +static char str_OTFIrishTraditional = "Irish Traditional"; +static char str_OTFIcelandic = "Icelandic"; +static char str_OTFInariSami = "Inari Sami"; +static char str_OTFItalian = "Italian"; +static char str_OTFHebrew = "Hebrew"; +static char str_OTFJavanese = "Javanese"; +static char str_OTFYiddish = "Yiddish"; +static char str_OTFJapanese = "Japanese"; +static char str_OTFJudezmo = "Judezmo"; +static char str_OTFJula = "Jula"; +static char str_OTFKabardian = "Kabardian"; +static char str_OTFKachchi = "Kachchi"; +static char str_OTFKalenjin = "Kalenjin"; +static char str_OTFKannada = "Kannada"; +static char str_OTFKarachay = "Karachay"; +static char str_OTFGeorgian = "Georgian"; +static char str_OTFKazakh = "Kazakh"; +static char str_OTFKebena = "Kebena"; +static char str_OTFKhutsuriGeorgian = "Khutsuri Georgian"; +static char str_OTFKhakass = "Khakass"; +static char str_OTFKhanty_Kazim = "Khanty-Kazim"; +static char str_OTFKhmer = "Khmer"; +static char str_OTFKhanty_Shurishkar = "Khanty-Shurishkar"; +static char str_OTFKhanty_Vakhi = "Khanty-Vakhi"; +static char str_OTFKhowar = "Khowar"; +static char str_OTFKikuyu = "Kikuyu"; +static char str_OTFKirghiz = "Kirghiz"; +static char str_OTFKisii = "Kisii"; +static char str_OTFKokni = "Kokni"; +static char str_OTFKalmyk = "Kalmyk"; +static char str_OTFKamba = "Kamba"; +static char str_OTFKumaoni = "Kumaoni"; +static char str_OTFKomo = "Komo"; +static char str_OTFKomso = "Komso"; +static char str_OTFKanuri = "Kanuri"; +static char str_OTFKodagu = "Kodagu"; +static char str_OTFKonkani = "Konkani"; +static char str_OTFKikongo = "Kikongo"; +static char str_OTFKomi_Permyak = "Komi-Permyak"; +static char str_OTFKorean = "Korean"; +static char str_OTFKomi_Zyrian = "Komi-Zyrian"; +static char str_OTFKpelle = "Kpelle"; +static char str_OTFKrio = "Krio"; +static char str_OTFKarakalpak = "Karakalpak"; +static char str_OTFKarelian = "Karelian"; +static char str_OTFKaraim = "Karaim"; +static char str_OTFKaren = "Karen"; +static char str_OTFKoorete = "Koorete"; +static char str_OTFKashmiri = "Kashmiri"; +static char str_OTFKhasi = "Khasi"; +static char str_OTFKildinSami = "Kildin Sami"; +static char str_OTFKui = "Kui"; +static char str_OTFKulvi = "Kulvi"; +static char str_OTFKumyk = "Kumyk"; +static char str_OTFKurdish = "Kurdish"; +static char str_OTFKurukh = "Kurukh"; +static char str_OTFKuy = "Kuy"; +static char str_OTFKoryak = "Koryak"; +static char str_OTFLadin = "Ladin"; +static char str_OTFLahuli = "Lahuli"; +static char str_OTFLak = "Lak"; +static char str_OTFLambani = "Lambani"; +static char str_OTFLao = "Lao"; +static char str_OTFLatin = "Latin"; +static char str_OTFLaz = "Laz"; +static char str_OTFL_Cree = "L-Cree"; +static char str_OTFLadakhi = "Ladakhi"; +static char str_OTFLezgi = "Lezgi"; +static char str_OTFLingala = "Lingala"; +static char str_OTFLowMari = "Low Mari"; +static char str_OTFLimbu = "Limbu"; +static char str_OTFLomwe = "Lomwe"; +static char str_OTFLowerSorbian = "Lower Sorbian"; +static char str_OTFLuleSami = "Lule Sami"; +static char str_OTFLithuanian = "Lithuanian"; +static char str_OTFLuba = "Luba"; +static char str_OTFLuganda = "Luganda"; +static char str_OTFLuhya = "Luhya"; +static char str_OTFLuo = "Luo"; +static char str_OTFLatvian = "Latvian"; +static char str_OTFMajang = "Majang"; +static char str_OTFMakua = "Makua"; +static char str_OTFMalayalamTraditional = "Malayalam Traditional"; +static char str_OTFMansi = "Mansi"; +static char str_OTFMarathi = "Marathi"; +static char str_OTFMarwari = "Marwari"; +static char str_OTFMbundu = "Mbundu"; +static char str_OTFManchu = "Manchu"; +static char str_OTFMooseCree = "Moose Cree"; +static char str_OTFMende = "Mende"; +static char str_OTFMeen = "Me'en"; +static char str_OTFMizo = "Mizo"; +static char str_OTFMacedonian = "Macedonian"; +static char str_OTFMale = "Male"; +static char str_OTFMalagasy = "Malagasy"; +static char str_OTFMalinke = "Malinke"; +static char str_OTFMalayalamReformed = "Malayalam Reformed"; +static char str_OTFMalay = "Malay"; +static char str_OTFMandinka = "Mandinka"; +static char str_OTFMongolian = "Mongolian"; +static char str_OTFManipuri = "Manipuri"; +static char str_OTFManinka = "Maninka"; +static char str_OTFManxGaelic = "Manx Gaelic"; +static char str_OTFMoksha = "Moksha"; +static char str_OTFMoldavian = "Moldavian"; +static char str_OTFMon = "Mon"; +static char str_OTFMoroccan = "Moroccan"; +static char str_OTFMaori = "Maori"; +static char str_OTFMaithili = "Maithili"; +static char str_OTFMaltese = "Maltese"; +static char str_OTFMundari = "Mundari"; +static char str_OTFNaga_Assamese = "Naga-Assamese"; +static char str_OTFNanai = "Nanai"; +static char str_OTFNaskapi = "Naskapi"; +static char str_OTFN_Cree = "N-Cree"; +static char str_OTFNdebele = "Ndebele"; +static char str_OTFNdonga = "Ndonga"; +static char str_OTFNepali = "Nepali"; +static char str_OTFNewari = "Newari"; +static char str_OTFNorwayHouseCree = "Norway House Cree"; +static char str_OTFNisi = "Nisi"; +static char str_OTFNiuean = "Niuean"; +static char str_OTFNkole = "Nkole"; +static char str_OTFDutch = "Dutch"; +static char str_OTFNogai = "Nogai"; +static char str_OTFNorwegian = "Norwegian"; +static char str_OTFNorthernSami = "Northern Sami"; +static char str_OTFNorthernTai = "Northern Tai"; +static char str_OTFEsperanto = "Esperanto"; +static char str_OTFNynorsk = "Nynorsk"; +static char str_OTFOji_Cree = "Oji-Cree"; +static char str_OTFOjibway = "Ojibway"; +static char str_OTFOriya = "Oriya"; +static char str_OTFOromo = "Oromo"; +static char str_OTFOssetian = "Ossetian"; +static char str_OTFPalestinianAramaic = "Palestinian Aramaic"; +static char str_OTFPali = "Pali"; +static char str_OTFPunjabi = "Punjabi"; +static char str_OTFPalpa = "Palpa"; +static char str_OTFPashto = "Pashto"; +static char str_OTFPolytonicGreek = "Polytonic Greek"; +static char str_OTFPilipino = "Pilipino"; +static char str_OTFPalaung = "Palaung"; +static char str_OTFPolish = "Polish"; +static char str_OTFProvencal = "Provencal"; +static char str_OTFPortuguese = "Portuguese"; +static char str_OTFChin = "Chin"; +static char str_OTFRajasthani = "Rajasthani"; +static char str_OTFR_Cree = "R-Cree"; +static char str_OTFRussianBuriat = "Russian Buriat"; +static char str_OTFRiang = "Riang"; +static char str_OTFRhaeto_Romanic = "Rhaeto-Romanic"; +static char str_OTFRomanian = "Romanian"; +static char str_OTFRomany = "Romany"; +static char str_OTFRusyn = "Rusyn"; +static char str_OTFRuanda = "Ruanda"; +static char str_OTFRussian = "Russian"; +static char str_OTFSadri = "Sadri"; +static char str_OTFSanskrit = "Sanskrit"; +static char str_OTFSantali = "Santali"; +static char str_OTFSayisi = "Sayisi"; +static char str_OTFSekota = "Sekota"; +static char str_OTFSelkup = "Selkup"; +static char str_OTFSango = "Sango"; +static char str_OTFShan = "Shan"; +static char str_OTFSibe = "Sibe"; +static char str_OTFSidamo = "Sidamo"; +static char str_OTFSilteGurage = "Silte Gurage"; +static char str_OTFSkoltSami = "Skolt Sami"; +static char str_OTFSlovak = "Slovak"; +static char str_OTFSlavey = "Slavey"; +static char str_OTFSlovenian = "Slovenian"; +static char str_OTFSomali = "Somali"; +static char str_OTFSamoan = "Samoan"; +static char str_OTFSena = "Sena"; +static char str_OTFSindhi = "Sindhi"; +static char str_OTFSinhalese = "Sinhalese"; +static char str_OTFSoninke = "Soninke"; +static char str_OTFSodoGurage = "Sodo Gurage"; +static char str_OTFSotho = "Sotho"; +static char str_OTFAlbanian = "Albanian"; +static char str_OTFSerbian = "Serbian"; +static char str_OTFSaraiki = "Saraiki"; +static char str_OTFSerer = "Serer"; +static char str_OTFSouthSlavey = "South Slavey"; +static char str_OTFSouthernSami = "Southern Sami"; +static char str_OTFSuri = "Suri"; +static char str_OTFSvan = "Svan"; +static char str_OTFSwedish = "Swedish"; +static char str_OTFSwadayaAramaic = "Swadaya Aramaic"; +static char str_OTFSwahili = "Swahili"; +static char str_OTFSwazi = "Swazi"; +static char str_OTFSutu = "Sutu"; +static char str_OTFSyriac = "Syriac"; +static char str_OTFTabasaran = "Tabasaran"; +static char str_OTFTajiki = "Tajiki"; +static char str_OTFTamil = "Tamil"; +static char str_OTFTatar = "Tatar"; +static char str_OTFTH_Cree = "TH-Cree"; +static char str_OTFTelugu = "Telugu"; +static char str_OTFTongan = "Tongan"; +static char str_OTFTigre = "Tigre"; +static char str_OTFTigrinya = "Tigrinya"; +static char str_OTFThai = "Thai"; +static char str_OTFTahitian = "Tahitian"; +static char str_OTFTibetan = "Tibetan"; +static char str_OTFTurkmen = "Turkmen"; +static char str_OTFTemne = "Temne"; +static char str_OTFTswana = "Tswana"; +static char str_OTFTundraNenets = "Tundra Nenets"; +static char str_OTFTonga = "Tonga"; +static char str_OTFTodo = "Todo"; +static char str_OTFTurkish = "Turkish"; +static char str_OTFTsonga = "Tsonga"; +static char str_OTFTuroyoAramaic = "Turoyo Aramaic"; +static char str_OTFTulu = "Tulu"; +static char str_OTFTuvin = "Tuvin"; +static char str_OTFTwi = "Twi"; +static char str_OTFUdmurt = "Udmurt"; +static char str_OTFUkrainian = "Ukrainian"; +static char str_OTFUrdu = "Urdu"; +static char str_OTFUpperSorbian = "Upper Sorbian"; +static char str_OTFUyghur = "Uyghur"; +static char str_OTFUzbek = "Uzbek"; +static char str_OTFVenda = "Venda"; +static char str_OTFVietnamese = "Vietnamese"; +static char str_OTFWa = "Wa"; +static char str_OTFWagdi = "Wagdi"; +static char str_OTFWest_Cree = "West-Cree"; +static char str_OTFWelsh = "Welsh"; +static char str_OTFWolof = "Wolof"; +static char str_OTFXhosa = "Xhosa"; +static char str_OTFYakut = "Yakut"; +static char str_OTFYoruba = "Yoruba"; +static char str_OTFY_Cree = "Y-Cree"; +static char str_OTFYiClassic = "Yi Classic"; +static char str_OTFYiModern = "Yi Modern"; +static char str_OTFChinesePhonetic = "Chinese Phonetic"; +static char str_OTFChineseSimplified = "Chinese Simplified"; +static char str_OTFChineseTraditional = "Chinese Traditional"; +static char str_OTFZande = "Zande"; +static char str_OTFZulu = "Zulu"; + /* dlg */ +static char str_ScriptList = "Script List"; +static char str_LanguageList = "Language List"; +static char str_ScriptMissing = "Script Missing"; +static char str_ScriptMissingText = "Could not find a script to match '%c%c%c%c'.\nIt has been omitted from this list.\nIf that is not desirable press [Cancel]\nand then hold down the control key and press [Edit]"; +static char str_AtLeastOneScript = "You must select at least one script"; +static char str_LangMissing = "Language Missing"; +static char str_LangMissingText = "Could not find a language to match '%c%c%c%c'.\nIt has been omitted from this list.\nIf that is not desirable press [Cancel] twice\nand then hold down the control key and press [Edit]"; +static char str_AtLeastOneLang = "You must select at least one language\nUse the \"Default\" language if nothing else fits."; +static char str_ScriptLang = "Script & Language"; +static char str_ScriptLangEnter = "Enter a list of scripts each followed by a list of languages"; +static char str_ScriptLangList = "Script & Language List"; +static char str_SLError = "Cant Parse Scripts" +static char str_SLErrorText = "A script language list consists of a list of\n4 letter script tags each followed by a '{'\nand a list of 4 letter language tags seperated\nby commas. As:\nlatn{DEU ,dflt} cyrl{dflt}"; +static char str_ScriptC = "Script:"; +static char mnemonic_ScriptC = 'S'; +static char str_TagC = "Tag:"; +static char mnemonic_TagC = 'T'; +static char str_ScriptAndLangC = "Script & Languages:"; +static char mnemonic_ScriptAndLangC = 'S'; +static char str_HHDefaultHH = " -- Default --"; +static char str_Nested = " -- Nested --"; +static char str_EditLangList = " -- Edit Script & Lang List --"; +static char str_TagTooLong = "Tag too long"; +static char str_TagMustBe4 = "Tag must be 4 characters long"; +static char str_ScriptTagTooLong = "Script tags are limited to 4 ASCII characters"; +static char str_RightToLeft = "Right To Left"; +static char str_IgnoreBaseGlyphs = "Ignore Base Glyphs"; +static char str_IgnoreLigatures = "Ignore Ligatures"; +static char str_IgnoreCombiningMarks = "Ignore Combining Marks"; +static char str_NoScript = "No Script"; +static char str_NeedsScriptForSubs = "If you specify positioning or substitution information for a character, FontForge needs to know its script."; +static char str_NeedsScriptForSubsGuess = "If you specify positioning or substitution information for a character, FontForge needs to know its script.\nWould this one be correct: '%c%c%c%c'?"; +static char str_ReallyNoScript = "You did not specify a script for this glyph (or FontForge failed to guess it). This may cause problems if you use this glyph in a GPOS or GSUB table.\nContinue anyway?" +static char str_MergeWith = "Merge With:"; +static char str_MergeWithPopup = "FontForge will attempt to merge all anchor classes with the same value for \"Merge With\" into one GPOS lookup"; +static char str_MarkToBaseLig = "Mark To Base, or\nMark To Ligature"; +static char str_MarkToMark = "Mark To Mark"; +static char str_Cursive = "Cursive"; +static char str_CursiveAttach = "Cursive Attachment"; + /* Select by att (pst) */ +static char str_SimpSubstitution = "Simple Substitution" +static char str_AltSubstitutions = "Alternate Substitutions" +static char str_MultSubstitution = "Multiple Substitution" +static char str_SimpPos = "Simple Position" +static char str_PairPos = "Pairwise Position" +static char str_LigCaret = "Ligature Caret" +static char str_Kerning = "Kerning" +static char str_VKerning = "VKerning" +static char str_Containing = "Containing:" +static char str_SelectResults = "Select Results"; +static char str_SelectResultsPopup = "Set the selection of the font view to the characters\nfound by this search"; +static char str_MergeResults = "Merge Results"; +static char str_MergeResultsPopup = "Expand the selection of the font view to include\nall the characters found by this search"; +static char str_RestrictSelection = "Restrict Selection"; +static char str_RestrictSelectionPopup = "Only search the selected characters, and unselect\nany characters which do not match this search"; +static char str_UnknownAnchorClass = "Unknown Anchor Class: %.70s"; +static char str_TooManyTags = "Too many tags specified"; +static char str_NoMatch = "No characters matched"; + /* Import */ +static char str_Duppixelsize[] = "Duplicate pixelsize"; +/* "The font database already contains a bitmap\nfont with this pixelsize (%d)\nDo you want to overwrite it?" */ +static char str_Duppixelsizepre[] = "The font database already contains a bitmap\012font with this pixelsize ("; +static char str_Duppixelsizepost[] = ")\012Do you want to overwrite it?"; +static char str_NoBitmapFont = "No Bitmap Font"; +static char str_NoBitmapFontIn = "Could not find a bitmap font in %hs"; + /* Private Info */ +static char str_Bluequest[] = "This will change both BlueValues and OtherBlues.\012Do you want to continue?"; +static char str_Hstemquest[] = "This will change both StdHW and StemSnapH.\012Do you want to continue?"; +static char str_Vstemquest[] = "This will change both StdVW and StemSnapV.\012Do you want to continue?"; +static char str_Arrayquest[] = "Expected array\012Procede anyway?"; +static char str_Numberquest[] = "Expected number\012Procede anyway?"; +static char str_Boolquest[] = "Expected boolean\012Procede anyway?"; +static char str_Codequest[] = "Expected code\012Procede anyway?"; +static char str_Badtype[] = "Bad type"; +static char str_Delete[] = "Delete"; +static char mnemonic_Delete[] = 'D'; + /* Prefs */ +static char str_UTF_8[] = "UTF-8 (Unicode)"; +static char str_Default[] = "Default"; +static char *str_PrefsPopupAWS[] = "Changing the width of a character\nchanges the widths of all accented\ncharacters based on it."; +static char *str_PrefsPopupALS[] = "Changing the left side bearing\nof a character adjusts the lbearing\nof other references in all accented\ncharacters based on it."; +static char *str_PrefsPopupForNewFonts[] = "Default encoding for\nnew fonts"; +static char *str_PrefsPopupNES[] = "The default size of the Em-Square in a newly created font." +static char *str_PrefsPopupNOT[] = "Whether new fonts should contain splines of quadratic (truetype)\nor cubic (postscript & opentype)." +static char *str_PrefsPopupLFN[] = "Whether fonts loaded from the disk should retain their splines\nwith the original order (quadratic or cubic), or whether the\nsplines should be converted to the default order for new fonts\n(see NewFontsQuadratic)." +static char *str_PrefsPopupLoc[] = "Character set used by the local\nclipboard, filesystem, etc. (only\n8bit charsets currently supported\nhere)"; +static char *str_PrefsPopupAH[] = "AutoHint before rasterizing"; +static char *str_PrefsPopupAHG[] = "AutoHint changed characters before generating a font"; +static char *str_PrefsPopupFN[] = "Name used for foundry field in bdf\nfont generation"; +static char *str_PrefsPopupTFN[] = "Name used for Vendor ID field in\nttf (OS/2 table) font generation.\nMust be no more than 4 characters"; +static char *str_PrefsPopupXU[] = "If specified this should be a space separated list of integers each\nless than 16777216 which uniquely identify your organization\nFontForge will generate a random number for the final component."; +static char *str_PrefsPopupRulers[] = "Display rulers in the Outline Character View"; +static char *str_PrefsPopupSepHints[] = "Have seperate controls for display horizontal and vertical hints."; +static char *str_PrefsPopupIC[] = "In the Outline View, the Shift key constrains motion to be parallel to the ItalicAngle rather than the vertical."; +static char *str_PrefsPopupAO[] = "The percentage of an em by which an accent is offset from its base character in Build Accent"; +static char *str_PrefsPopupGA[] = "When placing grave and acute accents above letters, should\nFontForge center them based on their full width, or\nshould it just center based on the lowest point\nof the accent."; +static char *str_PrefsPopupCH[] = "When centering an accent over a character, should the accent\nbe centered on the highest point of the character,\nor the middle of the character?" +static char *str_PrefsPopupAA[] = "The number of em-units by which an arrow key will move a selected point"; +static char *str_PrefsPopupGN[] = "Adobe has assigned the names Delta, Omega and mu\nto Increment, Ohm and micro signs respectively\nThis seems very odd to Greek font designers who use\nthe names to refer to letters of the alphabet.\nSetting this flags means that the alphabetic characters will\nbe named Delta.greek, Omega.greek and mu.greek."; +static char *str_PrefsPopupSD[] = "When the mouse pointer is within this many pixels\nof one of the various interesting features (baseline,\nwidth, grid splines, etc.) the pointer will snap\nto that feature."; +static char *str_PrefsPopupJS[] = "The Edit->Join command will join points which are this close together\nA value of 0 means they must be coincident" +static char *str_PrefsPopupBR[] = "When generating a set of BDF fonts ask the user\nto specify the screen resolution of the fonts\notherwise FontForge will guess depending on the pixel size."; +static char *str_PrefsPopupPPT[] = "FontForge supports two different helper applications to do autotracing\n autotrace and potrace\nIf your system only has one it will use that one, if you have both\nuse this option to tell FontForge which to pick." +static char *str_PrefsPopupATA[] = "Extra arguments for configuring the autotrace program\n(either autotrace or potrace)"; +static char *str_PrefsPopupATK[] = "Ask the user for autotrace arguments each time autotrace is invoked" +static char *str_PrefsPopupMFA[] = "Commands to pass to mf (metafont) program, the filename will follow these"; +static char *str_PrefsPopupMFK[] = "Ask the user for mf commands each time mf is invoked" +static char *str_PrefsPopupMFB[] = "FontForge loads large images into the background of each character\nprior to autotracing them. You may retain those\nimages to look at after mf processing is complete, or\nremove them to save space" +static char *str_PrefsPopupMFE[] = "MetaFont (mf) generates lots of verbiage to stdout.\nMost of the time I find it an annoyance but it is\nimportant to see if something goes wrong." +static char *str_PrefsPopupG2N[] = "When generating a truetype or opentype font it is occasionally\nuseful to know the mapping between truetype glyph ids and\ncharacter names. Setting this option will cause FontForge to\nproduce a file (with extension .g2n) containing those data."; +static char *str_PrefsPopupPCE[] = "When loading a truetype or opentype font which has both a unicode\nand a CJK encoding table, use this flag to specify which\nshould be loaded for the font." +static char *str_PrefsPopupXRF[] = "When FontForge starts up it loads display related resources from a\nproperty on the screen. Sometimes it is useful to be able to store\nthese resources in a file. These resources are only read at start\nup, so changing this has no effect until the next time you start\nFontForge."; +static char *str_PrefsPopupCMD[] = "When copying characters from the font view, also copy the\ncharacters' metadata (name, encoding, comment, etc)." +static char *str_PrefsPopupAGA = "Apple and MS/Adobe differ about the format of truetype and opentype files\nThis controls the default setting of the Apple checkbox in the File->Generate Font dlg.\nThe main differences are:\n The requirements for the 'postscript' name in the name table conflict\n Bitmap data are stored in different tables\n Scaled composit characters are treated differently\n Use of GSUB rather than morx(t)/feat\n Use of GPOS rather than kern/opbd\n Use of GDEF rather than lcar/prop\nIf both this and OpenType are set, both formats are generated" +static char *str_PrefsPopupAGO = "Apple and MS/Adobe differ about the format of truetype and opentype files\nThis controls the default setting of the OpenType checkbox in the File->Generate Font dlg.\nThe main differences are:\n The requirements for the 'postscript' name in the name table conflict\n Bitmap data are stored in different tables\n Scaled composit characters are treated differently\n Use of GSUB rather than morx(t)/feat\n Use of GPOS rather than kern/opbd\n Use of GDEF rather than lcar/prop\nIf both this and Apple are set, both formats are generated" +static char *str_PrefsPopupUndo = "The maximum number of Undoes/Redoes stored in a character"; +static char *str_PrefsPopupHLP = "The directory on your local system in which FontForge will search for help\nfiles. If a file is not found there, then FontForge will look for it on the net."; +static char *str_PrefsPopupSAJ = "When dragging points in the outline view a join may occur\n(two open contours may connect at their endpoints). When\nthis is On a join will cause FontForge to stop moving the\nselection (as if the user had released the mouse button).\nThis is handy if your fingers are inclined to wiggle a bit." +static char *str_PrefsPopupUF = "Figure out flex hints after every change"; +static char *str_Generic[] = "Generic"; +static char *str_PrefsFontInfo[] = "Font Info"; +static char *str_PrefsApps[] = "Apps"; +static char *str_Editing[] = "Editing"; +static char *str_Accents[] = "Accents"; +static char *str_ScriptMenu[] = "Script Menu"; +static char *str_Mac[] = "Mac"; +static char *str_MenuName[] = "Menu Name"; +static char *str_ScriptMenuPopup[] = "You may create a script menu containing up to 10 frequently used scripts\nEach entry in the menu needs both a name to display in the menu and\na script file to execute. The menu name may contain any unicode characters.\nThe button labeled \"...\" will allow you to browse for a script file."; +static char *str_ScriptFile[] = "Script File"; +static char *str_BrowseForFile[] = "..."; +static char *str_MenuNameWithNoScript[] = "Menu name with no associated script"; +static char *str_ScriptWithNoMenuName[] = "Script with no associated menu name"; +static char *str_Features = "Features"; +static char *str_MappingB = "Mapping"; +static char *str_Feature = "Feature"; +static char *str_FeatureId = "Feature Id:"; +static char mnemonic_FeatureId = 'I'; +static char *str_Name = "Name:"; +static char mnemonic_Name = 'N'; +static char *str_ThisFeatureCodeIsAlreadyUsed = "This feature code is already used"; +static char *str_BadName = "Bad Name"; +static char *str_Settings = "Settings"; +static char *str_Setting = "Setting"; +static char *str_FeatureC = "Feature:"; +static char mnemonic_FeatureC = 'F'; +static char *str_Off = "Off:"; +static char mnemonic_Off = 'O'; +static char *str_Mutex = "Mutex"; +static char mnemonic_Mutex = 'M'; +static char *str_ThisSettingCodeIsAlreadyUsed = "This feature, setting combination is already used"; +static char *str_ThisSettingCodeIsAlreadyUsedReuse = "This feature, setting combination is already used\nDo you really wish to reuse it?"; +static char *str_OffNameNull = "If the Off-Name is blank, then the Off-Code must be -1"; +static char *str_PrefsAppNotice1 = "Normally FontForge will find applications by searching for" +static char *str_PrefsAppNotice2 = "them in your PATH environment variable, if you want" +static char *str_PrefsAppNotice3 = "to alter that behavior you may set an environment" +static char *str_PrefsAppNotice4 = "variable giving the full path spec of the application." +static char *str_PrefsAppNotice5 = "FontForge recognizes BROWSER, MF and AUTOTRACE." +static char *str_PrefsAppNotice6 = "" + /* Hints */ +static char *str_base = "Base:"; +static unichar_t mnemonic_base = 'B'; +static char *str_size = "Size:"; +static unichar_t mnemonic_size = 'S'; +static char *str_HStem = "HStem"; +static unichar_t mnemonic_HStem = 'H'; +static char *str_VStem = "VStem"; +static unichar_t mnemonic_VStem = 'V'; +static char *str_Create = "Create"; +static unichar_t mnemonic_Create = 'e'; +static char *str_PrevArrow = "< Prev"; +static unichar_t mnemonic_PrevArrow = 'P'; +static char *str_NextArrow = "Next >"; +static unichar_t mnemonic_NextArrow = 'N'; +static char *str_MovePoints = "Move Points"; +static unichar_t mnemonic_MovePoints = 'M'; +static char *str_MovePointsPopup = "When the hint's position is changed\nadjust the postion of any points\nwhich lie on that hint"; +static char *str_CreateHint = "Create Hint..."; +static char *str_CreateHorizontalHint = "Create Horizontal Stem Hint"; +static char *str_CreateVerticalHint = "Create Vertical Stem Hint"; + /* expand stroke */ +static char *str_LineCap = "Line Cap"; +static char *str_Butt = "Butt"; +static unichar_t mnemonic_Butt = 'B'; +static char *str_Round = "Round"; +static unichar_t mnemonic_Round = 'R'; +static char *str_Squareq = "Square"; +static unichar_t mnemonic_Squareq = 'q'; +static char *str_LineJoin = "Line Join"; +static char *str_Miter = "Miter"; +static unichar_t mnemonic_Miter = 'M'; +static char *str_Roundu = "Round"; +static unichar_t mnemonic_Roundu = 'u'; +static char *str_Bevel = "Bevel"; +static unichar_t mnemonic_Bevel = 'v'; +static char *str_StrokeWidth = "Stroke Width:"; +static unichar_t mnemonic_StrokeWidth = 'W'; +static char *str_TransformPen = "Transform Pen:"; +static unichar_t mnemonic_TransformPen = 'T'; +static char *str_Strok = "Stroke"; +static unichar_t mnemonic_Strok = 'S'; +static char *str_Opacity = "Opacity:"; +static char *str_Inherited = "Inherited"; +static char *str_BadColor = "Bad Color"; +static char *str_BadMatrix = "Bad Transformation Matrix"; +static char *str_Caligraphic = "Caligraphic"; +static unichar_t mnemonic_Caligraphic = 'C'; +static char *str_ElipseM = "Ellipse"; +static unichar_t mnemonic_ElipseM = 'E'; +static char *str_PenAngle = "Pen Angle:"; +static unichar_t mnemonic_PenAngle = 'A'; +static char *str_PenHeightRatio = "Height Ratio:"; +static unichar_t mnemonic_PenHeightRatio = 'H'; +static char *str_MinorAxis = "Minor Axis:"; +static unichar_t mnemonic_MinorAxis = 'x'; +static char *str_PenHeightRatioPopup = "A caligraphic pen's nib has two dimensions, the width\n(which may be set by Stroke Width below) and a thickness\nor height. I express the height as a ratio to the width."; +static char *str_BadStroke = "Bad Stroke"; +static char *str_StrokeWidthTooBig = "The stroke width is so big that the generated path\nmay intersect itself in %.100hs"; +static char *str_FreeHand = "Free Hand"; +static char *str_CenterLine = "Don't Expand"; +static char *mnemonic_CenterLine = 'D'; +static char *str_CenterLinePopup = "The splines drawn with the freehand tool will not be expanded,\nonly the line itself will be generated."; +static char *str_Pressure = "Pressure:"; +static char *mnemonic_Pressure = 'P'; +static char *str_PressurePopup = "Press in this square with a wacom pressure sensitive tool\nto set the pressure end-point"; +static char *str_RmInternalContour = "Remove Internal Contour"; +static char *str_RmExternalContour = "Remove External Contour"; +static char *str_NotInternalAndExternal = "Removing both the internal and the external contours makes no sense"; +static char *str_CleanupSelfIntersect = "Cleanup Self Intersect"; +static char *str_CleanupSelfIntersectPopup = "When FontForge detects that an expanded stroke will self-intersect,\nthen setting this option will cause it to try to make things nice\nby removing the intersections"; + /* Auto Width/Kern */ +static char *str_EnterTwoCharRange = "Enter two character ranges"; +static char *str_ToBeAdjusted = "to be adjusted."; +static char *str_CharsLeft = "Chars on Left"; +static char *str_CharsRight = "Chars on Right"; +static char *str_All = "All"; +static char *str_stdCharRange = "A-Za-z0-9"; +static unichar_t *str_stdCharRangeGreek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '\0' }; +static unichar_t *str_stdCharRangeCyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '\0' }; +static char *str_StdCharRangeKernL = "A-Za-z"; +static char *str_StdCharRangeKernR = "a-z.,:;-"; +static char *str_StdCharRangeKernR2 = "A-Za-z.,:;-"; +static unichar_t *str_StdCharRangeKernRCyr = { 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_StdCharRangeKernR2Cyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_stdCharRangeKernRGreek = { 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static unichar_t *str_stdCharRangeKernR2Greek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static char *str_Selected = "Selected"; +static char *str_Spacing = "Spacing"; +static char *str_TotalKerns = "Total Kerns:"; +static char *str_Threshold = "Threshold:"; +static char *str_NoCharsSelected = "No characters selected."; +static char *str_KernPairFilePopup = "Browse for a file containing a list of kerning pairs\ntwo characters per line. FontForge will only check\nthose pairs for kerning info."; +static char *str_LoadKernPairs = "Load Kern Pairs"; +static char *str_NoKernPairs = "No Kern Pairs"; +static char *str_NoKernPairsFile = "No kerning pairs found in %.200hs"; + /* Auto Trace */ +static char *str_NothingToTrace = "Nothing to trace"; +static char *str_NoAutotrace = "Can't find autotrace"; +static char *str_NoAutotraceProg = "Can't find autotrace program (set AUTOTRACE environment variable) or download from:\n http://sf.net/projects/autotrace/"; +static char *str_AdditionalAutotraceArgs = "Additional arguments for autotrace program:"; +static char *str_NoMF = "Can't find mf"; +static char *str_NoMFProg = "Can't find mf program -- metafont (set MF environment variable) or download from:\n http://www.tug.org/\n http://www.ctan.org/\nIt's part of the TeX distribution"; +static char *str_NoTempDir = "Can't create temporary directory"; +static char *str_CantRunMF = "Can't run mf"; +static char *str_MFHadError = "MetaFont exited with an error"; +static char *str_MFBadOutput = "Could not read (or perhaps find) mf output file"; + /* Bitmap dlg */ +static char *str_AllChars = "All Characters"; +static char *str_SelChars = "Selected Characters"; +static char *str_CurChar = "Current Character"; +static char *str_BadRegenSize = "Attempt to regenerate a pixel size that has not been created: "; +static char *str_PixelSizes = "Pixel Sizes:"; +static char *str_listPixelSizes = "The list of current pixel bitmap sizes"; +static char *str_RemovingSize = " Removing a size will delete it."; +static char *str_AddingSize = " Adding a size will create it."; +static char *str_AddingSizeScale = " Adding a size will create it by scaling."; +static char *str_SpecifyRegenSizes = "Specify bitmap sizes to be regenerated"; +static char *str_PointSizes75 = "Point sizes on a 75 dpi screen"; +static char *str_PointSizes100 = "Point sizes on a 100 dpi screen"; +static char *str_PointSizes96 = "Point sizes on a 96 dpi screen"; +static char *str_PointSizes120 = "Point sizes on a 120 dpi screen"; +static char *str_PointSizes72 = "Point sizes on a 72 dpi screen"; +static char *str_XSizes = "X"; +static char *str_WinSizes = "Win"; +static char *str_MacSizes = "Mac"; +static char *str_UseFreeType = "Use FreeType"; +static char *str_ScalingBitmaps = "Scaling Bitmaps"; +static char *str_CantScaleGreymap = "Can't scale a greymap font"; +static char *str_CantDeleteAllBitmaps = "Can't delete all bitmaps"; + /* Bitmap view */ +/* "%s at %d size %d from %s", charactername, encoding, pixelsize, fontname */ +static char *str_BvTitle = "%1$.80hs at %2$d size %3$d from %4$.80hs" +static char *str_RecalculateBitmaps = "Recalculate Bitmaps"; + /* BV Edit */ +static char *str_skewRatio = "Enter the ratio of x-skew to y rise"; +static char str_BadNumber[] = "Bad Number"; + /* Char View */ +/* "%s at %d from %s", charactername, encoding, fontname */ +static char *str_CvTitle = "%1$.80hs at %2$d from %3$.90hs" +static char *str_CantFindGlyph = "Can't Find Glyph"; +static char *str_CantRevertGlyph = "The glyph, %.80hs, can't be found in the sfd file"; +static char *str_GlyphHasRefs = "Problems With References"; +static char *str_GlyphHasRefsQuestion = "The character, %.40hs, contained references, but the font's encoding has changed. I will probably not be able to map those references to the correct locations. If I proceed some references may be lost and others may link to incorrect characters. Do you want to proceed anyway?" +static char *str_NameChanged = "Glyph Name Changed"; +static char *str_NameChangedGlyph = "The the name of character %.40hs has changed. This is what I use to find the glyph in the file, so I cannot revert this character.\n(You will not be warned for subsequent characters)" +static char *str_NotForeground = "Not Foreground" +static char *str_RefsOnlyFore = "References may be dragged only to the foreground layer" + /* CV Export */ +static char *str_PixelSizeQ = "Pixel size?"; +static char *str_PixelSize = "Pixel size:"; +static char *str_BitsPerPixel = "Bits/Pixel:"; +static char *str_InvalidBits = "The only valid values for bits/pixel are 1, 2, 4 or 8"; + /* CV Images */ +static char *str_RmOverlapBuggy1 = "FontForge has some bugs in its remove overlap" +static char *str_RmOverlapBuggy2 = "function which may cause you problems, so" +static char *str_RmOverlapBuggy3 = "I give you the option of turning it off." +static char *str_RmOverlapBuggy4 = "Leave it on if possible though, it is useful." +static char *str_RmOverlapBuggy5 = "" +static char *str_PSInterpretation = "PS Interpretion"; +static char *str_HandleErasers = "Handle Erasers"; +static char *str_HandleErasersPop = "Certain programs use pens with white ink as erasers\nIf you select (blacken) this checkbox, FontForge will\nattempt to simulate that."; +static char *str_CantFindFile = "Can't find the file"; +static char *str_BadXFigFile = "Bad xfig file"; +static char *str_BadImageFile = "Bad image file"; +static char *str_BadImageFileName = "Bad image file: %.100hs"; +static char *str_BadImageFileNotBitmap = "Bad image file, not a bitmap: %.100hs"; +static char *str_NothingLoaded = "Nothing Loaded"; +static char *str_NothingSelected = "Nothing Selected"; +static char *str_MoreImagesThanSelected = "More Images Than Selected Characters"; +static char *str_BadTemplate = "Bad Template"; +static char *str_BadTemplateNoExtension = "Bad template, no extension"; +static char *str_BadTemplateUnrecognized = "Bad template, unrecognized format"; +static char *str_UnicodeNotInFont = "Unicode value not in font"; +static char *str_UnicodeValueNotInFont = "Unicode value (%x) not in font, ignored"; +static char *str_EncodingNotInFont = "Encoding value not in font"; +static char *str_EncodingValueNotInFont = "Encoding value (%x) not in font, ignored"; +static char *str_Image = "Image"; +static char *str_TeXBitmap = "TeX Bitmap"; +static char *str_MacBitmap = "Mac Bitmap"; +static char *str_Template = "Image Template"; +static char *str_EPSTemplate = "EPS Template"; +static char *str_SVGTemplate = "SVG Template"; +static char *str_AsBackground = "As Background"; +static char *str_OnlyOneFont = "Only One Font"; +static char *str_OnlyOneFontBackground = "Only one font may be imported into the background"; + /* CV Palettes */ +static char *str_SizeOfPoints="Size of Points"; +static char *str_Regular="Regular"; +static char *str_Points="Points:"; +static char *str_RRRad="Round Rectangle Radius"; +static char *str_WithinBoundingBox="Bounding Box"; +static char *str_CenterOut="Center Out"; +static char *str_Polygon="Polygon"; +static char *str_Star="Star"; +static char *str_NumPSVert="Number of star points/Polygon verteces"; +/* V is an abbreviation for "Visible", and E for Editable */ +static char *str_V="V"; +static char *str_E="E"; +static char *str_Layer="Layer"; +static char *str_IsEdit="Is Layer Editable?"; +static char *str_IsVis="Is Layer Visible?"; +/* For Foreground. Should be short */ +static char *str_Fore="Fore"; +static char *mnemonic_Fore='o'; +static char *str_Back="Back"; +static char *mnemonic_Back='B'; +static char *str_Grid="Guide"; +static char *mnemonic_Grid='G'; +static char *str_LayerInfo = "Layer Info..."; +static char *str_NewLayer = "New Layer..."; +static char *str_DelLayer = "Del Layer"; +static char *str_CantBeUndone = "Cannot Be Undone"; +static char *str_CantBeUndoneDoItAnyway = "This operation cannot be undone, do it anyway?"; +static char *str_Fpgm = "'fpgm'"; +static char *str_Prep = "'prep'"; +static char *str_Glyph = "Glyph"; +static char *str_HHints="HHints"; +static char *str_VHints="VHints"; +static char *str_DHints="DHints"; +static char *str_HMetrics="HMetrics"; +static char *str_VMetrics="VMetrics"; +static char *str_Anchors="Anchors"; +static char *str_Blues="Blues"; +static char *str_Bitmap="Bitmap"; +static char *str_ShapeType = "Shape Type"; +/* Popups */ +static char *str_Pointer = "Pointer"; +static char *str_PopMag = "Magnify (Minify with alt)"; +static char *str_FreeCurve = "Draw a freehand curve"; +static char *str_ScrollByHand = "Scroll by hand"; +static char *str_AddCurvePoint = "Add a curve point"; +static char *str_AddCornerPoint = "Add a corner point"; +static char *str_AddTangentPoint = "Add a tangent point"; +static char *str_AddPenPoint = "Add a point, then drag out its control points"; +static char *str_popKnife = "Cut splines in two"; +static char *str_popRuler = "Measure distance, angle between points"; +static char *str_popScale = "Scale the selection"; +static char *str_popFlip = "Flip the selection"; +static char *str_popRotate = "Rotate the selection"; +static char *str_popSkew = "Skew the selection"; +static char *str_popRectElipse = "Rectangle or Ellipse"; +static char *str_popPolyStar = "Polygon or Star"; +static char *str_popPencil = "Set/Clear Pixels"; +static char *str_popPencilGrey = "Set/Clear Pixels\n(Eyedropper with alt)"; +static char *str_popLine = "Draw a Line"; +static char *str_popShift = "Shift Entire Bitmap"; +static char *str_popHand = "Scroll Bitmap"; + /* Undoes */ +static char *str_BitmapPaste = "Bitmap Paste"; +static char *str_YesToAll = "Yes to All"; +static char *mnemonic_YesToAll = 'A'; +static char *str_NoToAll = "No to All"; +static char *mnemonic_NoToAll = 'o'; +/* "The clipboard contains a bitmap character of size %d,\na size which is not in your database.\nWould you like to create a bitmap font of that size,\nor ignore this character?" */ +static char *str_ClipContainsPre = "The clipboard contains a bitmap character of size "; +static char *str_ClipContainsPost = ",\na size which is not in your database.\nWould you like to create a bitmap font of that size,\nor ignore this character?"; +static char *str_Pasting = "Pasting..."; +static char *str_SelfRef = "Self-referential character" +static char *str_AttemptSelfRef = "Attempt to make a character that refers to itself"; +static char *str_BadReference = "Bad Reference"; +static char *str_FontNoRef = "You are attempting to paste a reference to %1$hs into %2$hs.\nBut %1$hs does not exist in this font.\nWould you like to copy the original splines (or delete the reference)?"; +static char *str_FontNoRefNoOrig = "You are attempting to paste a reference to %1$hs into %2$hs.\nBut %1$hs does not exist in this font, nor can I find the original character refered to.\nIt will not be copied."; +static char *str_DontWarnAgain = "Don't Warn Again"; +static char *mnemonic_DontWarnAgain = 'W'; +static char *str_NoVerticalMetrics = "No Vertical Metrics"; +static char *str_FontNoVerticalMetrics = "This font does not have vertical metrics enabled\nUse Element->Font Info to enable them."; +static char *str_DupAnchor = "Duplicate Anchor"; +static char *str_DupAnchorIn = "There is already an anchor point named %1$.40s in %2$.40hs." +static char *str_AnchorLost = "Anchor Lost"; +static char *str_AnchorLostPaste = "At least one anchor point was lost when pasting from one font to another because no matching anchor class could be found in the new font." + /* dump pfa */ +static char *str_CvtPS = "Converting Postscript"; + /* encoding */ +static char *str_BadEncFormat = "Bad encoding file format"; +static char *str_PleaseNameEnc = "Please name this encoding"; +/* Either insert first, second or third, or the number followed by the "th" string (5th, 6th, etc.) */ +/* Please name the %d/first/second/third encoding in this file" */ +static char *str_PleaseNameEncPre = "Please name the "; +static char *str_PleaseNameEncPost = " encoding in this file"; +static char *str_Second = "Second"; +static char *str_Third = "Third"; +static char *str_th = "th"; +static char *str_RemoveEncoding = "Remove Encoding"; +static char *str_LoadEncoding = "Load Encoding"; +static char *str_AdobePUA = "Adobe Public Use Defs."; +static char *str_Interpretation = "Interpretation:"; +static char *str_UseCidMap = "Use CID Map"; +static char *str_SearchForCIDMap = "This font is based on the charset %1$.20hs-%2$.20hs-%3$d, but the best I've been able to find is %1$.20hs-%2$.20hs-%4$d.\nShall I use that or let you search?"; +static char *str_UseIt = "Use It"; +static char mnemonic_UseIt = 'U'; +static char *str_Search = "Search"; +static char mnemonic_Search = 'S'; +static char *str_GiveUp = "Give Up"; +static char mnemonic_GiveUp = 'G'; +static char *str_NoCidmap = "No cidmap file..." +static char *str_LookForCidmap = "FontForge was unable to find a cidmap file for this font. It is not essential to have one, but some things will work better if you do. If you have not done so you might want to download the cidmaps from:\n http://FontForge.sourceforge.net/cidmaps.tgz\nand then gunzip and untar them and move them to:\n %.80hs\n\nWould you like to search your local disk for an appropriate file?" +static char *str_AreYouSureCharset = "Are you sure you don't want to use the cidmap I found?"; +static char *str_FindCharset = "Find a cidmap file..." +static char *str_Browse = "Browse..."; +static char mnemonic_Browse = 'B'; +static char *str_SelectCIDOrdering = "Please select a CID ordering" +static char *str_ExtraCharsTitle = "Extraneous characters"; +static char *str_ExtraChars = "The current encoding contains characters which I cannot map to CIDs.\nShould I delete them or add them to the end (where they may conflict with future ros definitions)?"; +static char *str_FindCMap = "Find an adobe CMap file..."; +static char *str_NotACIDFont = "Not a CID-keyed font"; +static char *str_MultipleEncodingIgnored = "MultipleEncodingIgnored"; +static char *str_CIDGlyphMultEncoded = "The glyph at CID %d is mapped to more than %d encodings. Only the first %d are handled."; + + /* fv composit */ +static char *str_MissingChar = "Missing Character..."; +static char *str_Missingdotlessi="Your font is missing the dotlessi character,\nplease add it and remake your accented characters"; +static char *str_Missingdotlessj="Your font is missing the dotlessj character,\nplease add it and remake your accented characters"; + /* fv fonts */ +static char *str_MergingProb = "Merging Problem"; +static char *str_MergingFontSelf = "Merging a font with itself achieves nothing"; +static char *str_MergingCIDMismatch = "When merging two CID keyed fonts, they must have the same Registry and Ordering, and the font being merged into (the mergee) must have a supplement which is at least as recent as the other's. Furthermore the mergee must have at least as many subfonts as the merger." +static char *str_Other = "Other ..." +static char *str_FontToMergeInto = "Font to merge into %.20hs"; +static char *str_InterpolatingProb = "Interpolating Problem"; +static char *str_InterpolatingFontSelf = "Interpolating a font with itself achieves nothing"; +static char *str_InterpolatingFontsDiffOrder = "Interpolating between fonts with different spline orders (ie. between postscript and truetype)"; +static char *str_InterpolatingFontsDiffLayers = "Interpolating between fonts with different editing types (ie. between type3 and type1)"; +static char *str_Amount = "Amount"; +static char *str_InterpBetween = "Interpolating between %.20hs and:"; +static char *str_by = "by"; + /* fv metrics */ +static char *str_SetWidthTo = "Set Width To:"; +static char *str_SetLBearingTo = "Set LBearing To:"; +static char *str_SetRBearingTo = "Set RBearing To:"; +static char *str_SetVWidthTo = "Set Vert. Advance To:"; +static char *str_IncrWidthBy = "Increment Width By:"; +static char *str_IncrLBearingBy = "Increment LBearing By:"; +static char *str_IncrRBearingBy = "Increment RBearing By:"; +static char *str_IncrVWidthBy = "Increment V. Adv. By:"; +static char *str_ScaleWidthBy = "Scale Width By:"; +static char *str_ScaleLBearingBy = "Scale LBearing By:"; +static char *str_ScaleRBearingBy = "Scale RBearing By:"; +static char *str_ScaleVWidthBy = "Scale VAdvance By:"; +static char *str_Plain = "Plain"; + /* Import bdf */ +static char *str_PixelSizeFont = "What is the pixel size of the font in this file?"; +static char *str_CouldNotOpenFile = "Couldn't open file" +static char *str_CouldNotOpenFileName = "Couldn't open file %.200hs" +static char *str_NotBdfFile = "Not a bdf file" +static char *str_NotBdfFileName = "Not a bdf file %.200hs" +static char *str_NotPkFile = "Not a pk file" +static char *str_NotPkFileName = "Not a (metafont) pk file %.200hs" +static char *str_NotGfFile = "Not a gf file" +static char *str_NotGfFileName = "Not a (metafont) gf file %.200hs" +static char *str_NotPcfFile = "Not a pcf file" +static char *str_NotPcfFileName = "Not an X11 pcf file %.200hs" +static char *str_LoadingFrom = "Loading font from %.100hs"; +static char *str_DuplicateName = "Duplicate Name"; +static char *str_DuplicateCharName = "Duplicate character name (%hs) in font"; + /* problems */ +static char *str_ProbOpenPath = "The two selected points are the endpoints of an open path"; +static char *str_ProbPointsTooClose = "The selected points are too close to each other"; +static char *str_ProbMissingExtreme = "The selected spline does not have a point at its extremum(a)"; +static char *str_ProbXNear = "The x coord of the selected point is near the specified value"; +static char *str_ProbYNear = "The y coord of the selected point is near the specified value"; +static char *str_ProbYBase = "The y coord of the selected point is near the baseline"; +static char *str_ProbYXHeight = "The y coord of the selected point is near the xheight"; +static char *str_ProbYCapHeight = "The y coord of the selected point is near the cap height"; +static char *str_ProbYAs = "The y coord of the selected point is near the ascender height"; +static char *str_ProbYDs = "The y coord of the selected point is near the descender height"; +static char *str_ProbLineHor = "The selected line segment is nearly horizontal"; +static char *str_ProbLineVert = "The selected line segment is nearly vertical"; +static char *str_ProbLineItal = "The selected line segment is near the italic angle"; +static char *str_ProbAboveHor = "The control point above the selected point is nearly horizontal"; +static char *str_ProbAboveVert = "The control point above the selected point is nearly vertical"; +static char *str_ProbAboveItal = "The control point above the selected point is near the italic angle"; +static char *str_ProbBelowHor = "The control point below the selected point is nearly horizontal"; +static char *str_ProbBelowVert = "The control point below the selected point is nearly vertical"; +static char *str_ProbBelowItal = "The control point below the selected point is near the italic angle"; +static char *str_ProbLeftHor = "The control point left of the selected point is nearly horizontal"; +static char *str_ProbLeftVert = "The control point left of the selected point is nearly vertical"; +static char *str_ProbLeftItal = "The control point left of the selected point is near the italic angle"; +static char *str_ProbRightHor = "The control point right of the selected point is nearly horizontal"; +static char *str_ProbRightVert = "The control point right of the selected point is nearly vertical"; +static char *str_ProbRightItal = "The control point right of the selected point is near the italic angle"; +static char *str_ProbPtNearHHint = "The selected point is near a horizontal stem hint"; +static char *str_ProbPtNearVHint = "The selected point is near a vertical stem hint"; +static char *str_ProbHintHWidth = "This character contains a horizontal hint near the specified width"; +static char *str_ProbHintVWidth = "This character contains a vertical hint near the specified width"; +static char *str_ProbHintControl = "This hint does not control any points"; +static char *str_ProbHint3Width = "This hint has the wrong width for a stem3 hint"; +static char *str_ProbHint3Spacing = "The counters between these hints are not the same size, bad for a stem3 hint"; +static char *str_ProbHint3Four = "This character has four hints, but if this one were omitted it would fit a stem3 hint" +static char *str_NoProbHint3 = "This character can use a stem3 hint"; +static char *str_ProbExpectedCounter = "This path should have been drawn in a counter-clockwise direction"; +static char *str_ProbExpectedClockwise = "This path should have been drawn in a clockwise direction"; +static char *str_ProbFlippedRef = "This reference has been flipped, so the paths in it are drawn backwards" +static char *str_ProbTooManyPoints = "There are more points in this character than the maximum allowed"; +static char *str_ProbTooDeepRefs = "References are nested more deeply in this character than the maximum allowed"; +static char *str_ProbTooManyHints = "There are more hints in this character than the maximum allowed"; +static char *str_ProbMissingBitmap = "This outline character is missing a bitmap version" +static char *str_ProbMissingOutline = "This blank outline character has an unexpected bitmap version" +static char *str_ProbBadWidth = "This character's advance width is different from the standard width" +static char *str_ProbBadVWidth = "This character's vertical advance is different from the standard width" +static char *str_ProbAboveOdd = "The control point above the selected point is outside the spline segment"; +static char *str_ProbBelowOdd = "The control point below the selected point is outside the spline segment"; +static char *str_ProbRightOdd = "The control point right of the selected point is outside the spline segment"; +static char *str_ProbLeftOdd = "The control point left of the selected point is outside the spline segment"; +static char *str_ProbCIDMult = "This character is defined in more than one of the CID subfonts"; +static char *str_ProbCIDBlank = "This character is not defined in any of the CID subfonts"; +static char *str_ProbIrrelCP = "This character contains control points which are probably too close to the main points to alter the look of the spline */ +static char *str_ProbBadSubs = "This character contains a substitution or ligature entry which refers to an empty char" +static char *str_ProbBadSubs2 = "'%2$c%3$c%4$c%5$c' refers to an empty character \"%1$.20hs\""; +static char *str_ProbExplain = "Problem explanation"; +static char *str_GlyphPSTTag = "Glyph %1$.50hs with a %2$hs with tag '%3$c%4$c%5$c%6$c'"; +static char *str_GlyphMacPSTTag = "Glyph %1$.50hs with a %2$hs with feature <%3$d,%4$d>"; +static char *str_FPSTKernTag = "%1$hs with tag '%2$c%3$c%4$c%5$c'"; +static char *str_MacASMTag = "%1$hs with feature <%2$d,%3$d>"; +static char *str_RefersToMissingGlyph = " refers to a missing glyph" +static char *str_RefersToMissingLookup = " refers to a missing lookup tag" +static char *str_ProbDFLT = "This font refers to the script 'DFLT'\nwhich means FontForge couldn't guess\na good script.\nYou should probably provide a new\nlist of scripts (if you are unsure\nof which scripts to select, select all\nthat are used in your font).\nWould you like to do this?" +static char *str_ReplaceWith = "Replace With:" +static char *str_Always = "Always" +static char *str_AlwaysPopup = "Any future occurances of this glyph name should\nbe replaced or deleted as specified here" +static char *str_Skip = "Skip" +static char *str_Fix = "Fix"; +static char *str_Stop = "Stop"; +static char *mnemonic_Stop = 'S'; +static char *str_Next = "Next"; +static char *mnemonic_Next = 'N'; +static char *str_OpenPaths = "Open Paths"; +static char *mnemonic_OpenPaths = 'P'; +static char *str_OpenPathsPopup = "All paths should be closed loops, there should be no exposed endpoints"; +static char *str_Points2Close = "Points too close"; +static char *mnemonic_Points2Close = 't'; +static char *str_Points2ClosePopup = "If two adjacent points on the same path are less than a few\nemunits apart they will cause problems for some of FontForge's\ncommands. PostScript shouldn't care though."; +/*static char *str_MissingExtrema = "Missing Extrema";*/ +/*static char *mnemonic_MissingExtrema = 'E';*/ +/*static char *str_MissingExtremaPopup = "Ghostview (perhaps other interpreters) has a problem when a\nhint exists without any points that lie on it. Usually this is because\nthere are no points at the extrema";*/ +static char *str_XNear = "X near¹"; +static char *mnemonic_XNear = 'X'; +static char *str_XNearPopup = "Allows you to check that vertical stems in several\ncharacters start at the same location."; +static char *str_YNear = "Y near¹"; +static char *mnemonic_YNear = 'Y'; +static char *str_YNearPopup = "Allows you to check that horizontal stems in several\ncharacters start at the same location."; +static char *str_YNearStd = "Y near¹ standard heights"; +static char *mnemonic_YNearStd = 'S'; +static char *str_YNearStdPopup = "Allows you to find points which are slightly\noff from the baseline, xheight,cap height,\nascender, descender heights."; +static char *str_LineStd = "Edges near horizontal/vertical"; +static char *str_LineStd2 = "Edges near horizontal/vertical/italic"; +static char *mnemonic_LineStd = 'E'; +static char *str_LineStdPopup = "Allows you to find lines which are almost,\nbut not quite horizontal or vertical\n(or at the italic angle)."; +static char *str_CpStd = "Control Points near horizontal/vertical"; +static char *str_CpStd2 = "Control Points near horizontal/vertical/italic"; +static char *mnemonic_CpStd = 'C'; +static char *str_CpStdPopup = "Allows you to find control points which are almost,\nbut not quite horizontal or vertical\nfrom their base point\n(or at the italic angle)."; +static char *str_CpOdd = "Control Points beyond spline"; +static char *mnemonic_CpOdd = 'b'; +static char *str_CpOddPopup = "Allows you to find control points which when projected\nonto the line segment between the two end points lie\noutside of those end points"; +static char *str_HintNoPt = "Hints controlling no points"; +static char *mnemonic_HintNoPt = 'H'; +static char *str_HintNoPtPopup = "Ghostview (perhaps other interpreters) has a problem when a\nhint exists without any points that lie on it."; +static char *str_PtNearHint = "Points near¹ hint edges"; +static char *mnemonic_PtNearHint = 'P'; +static char *str_PtNearHintPopup = "Often if a point is slightly off from a hint\nit is because a stem is made up\nof several segments, and one of them\nhas the wrong width."; +static char *str_HintWidth = "Hint Width Near¹"; +static char *mnemonic_HintWidth = 'W'; +static char *str_HintWidthPopup = "Allows you to check that stems have consistant widths.."; +static char *str_Hint3 = "Almost stem3 hint"; +static char *mnemonic_Hint3 = '3'; +static char *str_Hint3Popup = "This checks if the character almost, but not exactly,\nconforms to the requirements for a stem3 hint.\nThat is, either vertically or horizontally, there must\nbe exactly three hints, and they must have the same\nwidth and they must be evenly spaced." +static char *str_ShowExactHint3 = "Show Exact *stem3"; +static char *mnemonic_ShowExactHint3 = 'S'; +static char *str_ShowExactHint3Popup = "Shows when this character is exactly a stem3 hint"; +static char *str_CheckDirection = "Check outermost paths clockwise"; +static char *mnemonic_CheckDirection = 'o'; +static char *str_CheckDirectionPopup = "Postscript and TrueType require that paths be drawn\nin a clockwise direction. This lets you check that they\nare."; +static char *str_CheckFlippedRefs = "Check flipped references"; +static char *mnemonic_CheckFlippedRefs = 'r'; +static char *str_CheckFlippedRefsPopup = "Postscript and TrueType require that paths be drawn\nin a clockwise direction. If you have a reference\nthat has been flipped then the paths in that reference will\nprobably be counter-clockwise. You should unlink it and do\nCorect direction on it."; +static char *str_MorePointsThan = "More points than:" +static char *mnemonic_MorePointsThan = 'm'; +static char *str_MorePointsThanPopup = "The PostScript Language Reference Manual (Appendix B) says that\nan interpreter need not support paths with more than 1500 points.\nI think this count includes control points. From PostScript's point\nof view, all the contours in a character make up one path. Modern\ninterpreters tend to support paths with more points than this limit.\n(Note a truetype font after conversion to PS will contain\ntwice as many control points)"; +static char *str_RefsDeeperThan = "Refs nested deeper than:" +static char *mnemonic_RefsDeeperThan = 'd'; +static char *str_RefsDeeperThanPopup = "The Type 2 Charstring Reference (Appendix B) says that\nsubroutines may not be nested more than 10 deep. Each\nnesting level for references requires one subroutine\nlevel, and hints may require another level."; +static char *str_MoreHintsThan = "More hints than:" +static char *mnemonic_MoreHintsThan = 'm'; +static char *str_MoreHintsThanPopup = "The Type 2 Charstring Reference (Appendix B) says that\nthere may be at most 96 horizontal and vertical stem hints\nin a character."; +static char *str_CheckBitmaps = "Check missing bitmaps"; +static char *mnemonic_CheckBitmaps = 'b'; +static char *str_CheckBitmapsPopup = "Are there any outline characters which don't have a bitmap version in one of the bitmap fonts?\nConversely are there any bitmap characters without a corresponding outline character?" +static char *str_CIDMultiple = "Check for CIDs defined twice"; +static char *mnemonic_CIDMultiple = 't'; +static char *str_CIDMultiplePopup = "Check whether a CID is defined in more than one sub-font"; +static char *str_CIDBlank = "Check for undefined CIDs"; +static char *mnemonic_CIDBlank = 'B'; +static char *str_CIDBlankPopup = "Check whether a CID is undefined in all sub-fonts"; +static char *str_MissingGlyph = "Check for missing glyph names"; +static char *mnemonic_MissingGlyph = 'm'; +static char *str_MissingGlyphPopup = "Check whether a substitution, kerning class, etc. uses a glyph name which does not match any glyph in the font" +static char *str_MissingLookupTag = "Check for missing lookup tags"; +static char *mnemonic_MissingLookupTag = 'l'; +static char *str_MissingLookupTagPopup = "Check whether a contextual subtitution/positioning item refers to a tag which is not defined in the font" +static char *str_UsedDFLTscript = "Check for use of 'DFLT' script"; +static char *mnemonic_UsedDFLTscript = 'D'; +static char *str_UsedDFLTscriptPopup = "Use of the 'DFLT' script is not very informative.\nFontForge will occasionally make create an entry with\nthis script if it doesn't know what better to use."; +static char *str_IrrelevantFactor = "Irrelevant Factor:"; +static char mnemonic_IrrelevantFactor = 'F'; +static char *str_IrrelevantFactorPopup = "A control point is deemed irrelevant if the distance between it and the main\n(end) point is less than this times the distance between the two end points"; +static char *str_IrrelevantCP = "Check for irrelevant control points"; +static char mnemonic_IrrelevantCP = 'I'; +static char *str_IrrelevantCPPopup = "Control points are irrelevant if they are too close to the main\npoint to make a significant difference in the shape of the curve." +static char *str_PointsNear = "¹ \"Near\" means within"; +static char mnemonic_PointsNear = 'N'; +static char *str_Near = "Near"; +static char *str_ExplainErr = "Stop after each error and explain"; +static char *mnemonic_ExplainErr = 'A'; +static char *str_IgnoreProblemFuture = "Ignore this problem in the future"; +/* "Found %g, expected %g" */ +static char *str_Found = "Found "; +static char *str_Expected = ", expected "; +static char *str_Paths = "Paths"; +static char *str_Random = "Random"; +static char *str_ATT = "ATT"; +static char *str_PointsNoC = "Points"; +static char *str_Refs = "Refs"; +static char *str_ClearAll = "Clear All"; +static char *str_SetAll = "Set All"; +static char *str_AdvanceWidth = "Check Advance: +static char *str_AdvanceWidthPopup = "Check for characters whose advance width is not the displayed value." +static char *str_AdvanceVWidth = "Check VAdvance: +static char *str_AdvanceVWidthPopup = "Check for characters whose vertical advance width is not the displayed value." +static char *str_SubsToEmptyChar = "Check subtitutions for empty chars"; +static char *str_SubsToEmptyCharPopup = "Check for characters which contain 'GSUB' entries which refer to empty characters" + + /* Meta font */ +static char *str_MetaFont = "Meta Font..."; +static char mnemonic_MetaFont = 'M'; +static char *str_CounterTooSmallT = "Counter Too Small"; +static char *str_CounterTooSmall = "A counter was requested to be too small, it has been pegged at its minimum value"; +static char *str_Simple = "Simple"; +static char *str_Advanced = "Advanced"; +static char *str_Embolden = "Embolden"; +static char *str_Condense = "Condense"; +static char *str_Expand = "Expand"; +static char *str_Stems = "Stems"; +static char *str_HCounters = "H Counters"; +static char *str_VCounters = "V Counters"; +static char *str_StemScale = "Scale Stems By:"; +static char *str_CounterScale = "Scale Counters By:"; +static char *str_XHeightFrom = "XHeight From:"; +static char *str_To = "To:"; +static char *str_MetamorphosingFont = "Metamorphosing Font..."; + /* to ttf */ +static char *str_PickFont = "Pick a font, any font..."; +static char *str_MultipleFontsPick = "There are multiple fonts in this file, pick one"; +static char *str_AutoHintingFont = "Auto Hinting Font..."; +static char *str_FindingSubstitutionPts = "Finding Substitution Points..."; +static char *str_FindingCounterMasks = "Finding Counter Masks..."; +static char *str_AutoInstructingFont = "Auto Instructing Font..."; +static char *str_SavingOpenTypeFont = "Saving OpenType Font"; +static char *str_LoadBitmapFonts = "Load bitmap fonts?"; +static char *str_LoadTTFBitmaps = "Do you want to load the bitmap fonts embedded in this true/open type file?\n(And if so, which)"; +static char *str_BadEncoding = "Bad Encoding"; +static char *str_ExtraneousSingleByte = "There is a single byte character (%d) using one of the slots needed for double byte characters"; +static char *str_OutOfEncoding = "There is a character (%d) which cannot be encoded"; +static char *str_NotNormallyEncoded = "There is a character (%d) which is not normally in the encoding"; +static char *str_NoEncodedChars = "No Encoded Characters"; +static char *str_NoUnicodeEncoding = "This font contains no characters with unicode encodings.\nYou will probably not be able to use the output."; +static char *str_NoUnicodeEncodingUseSymbol = "This font contains no characters with unicode encodings.\nWould you like to use a \"Symbol\" encoding instead of Unicode?"; + /* tottfgpos */ +static char *str_MultipleLookup = "Multiple Lookups"; +static char *str_MultipleLookupLong = "Multiple lookups were generated for nested anchor tag '%s', only one will be used"; +static char *str_MissingLookup = "Missing Lookup"; +static char *str_MissingLookupLong = "A nested lookup with tag '%s' could not be found. The generated font will not be useable. Try Element->Find Problems" + /* Spline Fill */ +static char *str_Rasterizing = "Rasterizing..."; +static char *str_GenBitmap = "Generating bitmap font"; +static char *str_GenAntiAlias = "Generating anti-alias font"; +/* "%d pixels" (for the size of the font being rasterized) */ +static char *str_Pixels = " pixels"; + /* print */ +static char *str_PrintingFont = "Printing Font"; +static char *str_GeneratingPostscriptFont = "Generating Postscript Font"; +static char *str_FailedGenPost = "Failed to generate postscript font"; +static char *str_PageSetup = "Page Setup"; +static char *str_Setup = "Setup"; +static char mnemonic_Setup = 'e'; +static char *str_Other2 = "Other"; +static char mnemonic_Other = 'o'; +static char *str_PrintOtherPopup = "Any other command with all its arguments.\nThe command must expect to deal with a postscript\nfile which it will find by reading its standard input."; +static char *str_ToFile = "To File"; +static char mnemonic_ToFile = 'F'; +static char *str_PageSize = "PageSize:"; +static char mnemonic_PageSize = 'S'; +static char *str_Copies = "Copies:"; +static char mnemonic_Copies = 'C'; +static char *str_Printer = "Printer:"; +static char mnemonic_Printer = 'P'; +static char *str_PrintToFile = "Print To File..."; +static char *str_Pointsize = "Pointsize:"; +static char mnemonic_Pointsize = 'P'; +static char *str_FullFont = "Full Font Display"; +static char mnemonic_FullFont = 'F'; +static char *str_FullFontPopup = "Displays all the glyphs in the font on a rectangular grid at the given point size"; +static char *str_FullPageChar = "Full Page Character"; +static char mnemonic_FullPageChar = 'C'; +static char *str_FullPageChars = "Full Page Characters"; +static char mnemonic_FullPageChars = 'C'; +static char *str_FullPageCharPopup = "Displays all the selected characters, each on its own page, at an extremely large point size"; +static char *str_MultiSizeChar = "Multi Size Character"; +static char mnemonic_MultiSizeChar = 'M'; +static char *str_MultiSizeChars = "Multi Size Characters"; +static char mnemonic_MultiSizeChars = 'M'; +static char *str_MultiSizeCharPopup = "Displays all the selected characters, at several different point sizes"; +static char *str_SampleTextPopup = "Prints the text below at the specified point size(s)" +static char mnemonic_SampleText = 'S'; +static char *str_SampleTextC = "Sample Text:"; +static char mnemonic_SampleTextC = 'T'; +static char *str_FailedOpenTemp = "Failed to open temporary output file"; +static char *str_NoCommandSpecified = "No Command Specified"; +static char *str_InvalidPointsize = "Invalid point size"; + /* alignment */ +static char *str_CoordinateAlongWhich = "Coordinate along which to space"; +static char *str_X = "X"; +static char mnemonic_X = 'X'; +static char *str_Y = "Y"; +static char mnemonic_Y = 'Y'; +static char *str_MaximumDistanceBetweenPts = "Maximum distance between points in a region"; +static char mnemonic_MaximumDistanceBetweenPts = 'M'; +static char *str_NotEnoughLines = "Not enough lines"; +static char *str_CantParallel = "Can't Parallel"; +static char *str_ShareCommonEndpoint = "These two lines share a common endpoint, I can't make them parallel"; + /* parsettf */ +static char *str_ReadingNames = "Reading Names"; +static char *str_FixingupReferences = "Fixing up References"; +static char *str_NoBitmaps = "No Bitmap Strikes"; +static char *str_NoBitmapsInTTF = "No (useable) bitmap strikes in this TTF font: %hs"; +static char *str_NotInCollection = "Not in Collection"; +static char *str_FontNotInCollection = "%hs is not in %.100hs"; +static char *str_UntitledAnchor_n = "Anchor-%d"; +static char *str_TTFGlyf = "TTF 'glyf'"; +static char *str_OTFCFF = "OTF 'CFF '"; +static char *str_GlyfAndCFF = "This font contains both a TrueType 'glyf' table and an OpenType 'CFF ' table. FontForge can only deal with one at a time, please pick which one you want to use"; + /* sfd */ +static char *str_Saving = "Saving..."; +static char *str_SavingDb = "Saving Spline Font Database"; +static char *str_SavingOutlines = "Saving Outlines"; +static char *str_SavingBitmaps = "Saving Bitmaps"; +static char *str_RecoveryFailed = "Recovery Failed"; +static char *str_RecoveryOfFailed = "Automagic recovery of changes to %.80hs failed.\nShould FontForge try again to recover next time you start it?"; +static char *str_TryAgain = "Try Again"; +static char *str_ForgetIt = "Forget It"; + /* start.c */ +static char *str_FontForge = "FontForge"; + /* cvpointer.c */ +static char *str_NegativeWidth = "Negative Width"; +static char *str_NegativeWidthCheck = "Negative character widths are not allowed in TrueType\nDo you really want a negative width?"; + /* hanyang.c */ +static char *str_Hangul = "Hangul"; +static char mnemonic_Hangul = 'H'; +static char *str_NewComposition = "New Composition..."; +static char mnemonic_NewComposition = 'N'; +static char *str_ModifyComposition = "Modify Composition..."; +static char mnemonic_ModifyComposition = 'M'; +static char *str_BuildSyllables = "Build Syllables"; +static char mnemonic_BuildSyllables = 'B'; +static char *str_ChoSung = "Cho-Sung"; +static char *str_JungSung = "Jung-Sung"; +static char *str_JongSung = "Jong-Sung"; +static char *str_ChoSungC = "Cho-Sung:"; +static char *str_JungSungC = "Jung-Sung:"; +static char *str_JongSungC = "Jong-Sung:"; +static char *str_Mapping = "Mapping..."; +static char mnemonic_Mapping = 'M'; +static char *str_Width = "Width"; +static char mnemonic_Width = 'W'; +static char *str_WidthC = "Width:"; +static char mnemonic_WidthC = 'W'; +static char *str_WidthDDD = "Width..."; +static char mnemonic_WidthDDD = 'W'; +static char *str_Reset = "Reset"; +static char *str_LoadFrom = "Load From..."; +static char mnemonic_LoadFrom = 'L'; +static char *str_BadWidth = "Bad Number for Width"; +static char *str_BadGroup = "Bad Number for Group"; +static char *str_JamoHoleTitle = "Unused glyph variant"; +static char *str_JamoHole = "For group %d of %s, glyph variant %d is not used but %d is used.\nProcede anyway?"; +static char *str_NoRules = "No Rules"; +static char *str_FileHasNoRules = "%.100hs contains no composition rules"; +static char *str_DeleteNo = "Delete"; /* With no mnemonic */ + /* Need a different mnemonic */ +static char *str_AddAll = "Add All"; +static char mnemonic_AddAll = 'd'; +static char *str_DisplayCompositions = "Display Compositions..."; +static char mnemonic_DisplayCompositions = 'D'; +static char *str_NoGroups = "This varient of this jamo is not actually used"; +static char *str_UniVarient = "Unicode %04X, Varient %d, %s"; +static char *str_BuildingKoreanFont = "Building Korean Font"; + /* Transform */ +static char *str_CharacterOrigin = "Character Origin"; +static char *str_CenterOfSelection = "Center of Selection"; +static char *str_LastPress = "Last Press"; +static char *str_DoNothing = "Do Nothing"; +static char *str_MoveDDD = "Move..."; +static char *str_RotateDDD = "Rotate..."; +static char *str_ScaleDDD = "Scale..."; +static char *str_ScaleUniformlyDDD = "Scale Uniformly..."; +static char *str_FlipDDD = "Flip..."; +static char *str_SkewDDD = "Skew..."; +static char *str_TransformBackground = "Transform Background Too"; +static char mnemonic_TransformBackground = 'B'; +static char *str_Warning = "Warning"; +static char *str_RotateSkewWarning = "After rotating or skewing a character you should probably apply Element->Add Extrema"; + /* scripting */ +static char *str_Call = "Call..."; +static char mnemonic_Call = 'a'; +static char *str_CallScript = "Call Script"; + /* start (about box) */ +static char *str_FreePress = "A free press discriminates\nagainst the illiterate."; +static char *str_GaudiamusLigature = "Gaudeamus Ligature!"; +static char *str_InTheBeginning = "In the beginning was the letter..."; +static char *str_LovelyFonts = " The sad fate of mine:\nA library of lovely fonts,\n but nothing to say."; + /* search */ +static char *str_SearchPattern = "Search Pattern:"; +static char *str_ReplacePattern = "Replace Pattern:"; +static char *str_Allow = "Allow:"; +static char *str_Flipping = "Flipping"; +static char *str_Scaling = "Scaling"; +static char *str_Rotating = "Rotating"; +static char *str_AllowTransPopup = "Allow a match even if the search pattern has\nto be transformed by a combination of the\nfollowing transformations."; +static char *str_SearchSelected = "Search Selected Chars"; +static char *str_SearchSelectedPopup = "Only search selected characters in the fontview\nNormally we search all characters in the font."; +static char *str_Find = "Find"; +static char *str_FindIn = "Find in %.100hs"; +static char *str_FindNext = "Find Next"; +static char *str_FindAll = "Find All"; +static char *str_ReplaceFind = "Replace/Find" +static char *str_ReplaceAll = "Replace All" +static char *str_BadRefInSearchRpl = "The %1$s contains a reference to %2$.20hs which does not exist in the new font.\nShould I remove the reference?"; +static char *str_NotFound = "Not Found" +static char *str_PatternNotFound = "The search pattern was not found in the font %.100hs"; +static char *str_PatternNotFoundAgain = "The search pattern was not found again in the font %.100hs"; +static char *str_FindReplace = "Find / Replace" +static char *mnemonic_FindReplace = "i"; + /* combinations */ +static char *str_SelectLigature = "Select a ligature to view" +static char *str_SortBy = "Sort By:" +static char *str_FirstChar = "First Char" +static char *str_SecondChar = "Second Char" +static char *str_KernSize = "Kern Size" + /* tilepath */ +static char *str_Center_ = "Center"; +static char mnemonic_Center_ = 'e'; +static char *str_CenterPopup = "The tile (in the clipboard) should be centered on the path" +static char *str_Left = "Left"; +static char mnemonic_Left = 'L'; +static char *str_LeftPopup = "The tile (in the clipboard) should be placed to the left of the path\nas the path is traced from its start point to its end" +static char *str_Right = "Right"; +static char mnemonic_Right = 'R'; +static char *str_RightPopup = "The tile (in the clipboard) should be placed to the right of the path\nas the path is traced from its start point to its end" +static char *str_Tile = "Tile"; +static char mnemonic_Tile = 'T'; +static char *str_TilePopup = "Multiple copies of the selection should be tiled onto the path" +static char *str_Scale = "Scale"; +static char mnemonic_Scale = 'S'; +static char *str_ScalePopup = "The selection should be scaled so that it will cover the path's length" +static char *str_TileScale = "Scale & Tile"; +static char mnemonic_TileScale = 'a'; +static char *str_TileScalePopup = "An integral number of the selection will be used to cover the path\nAnd if the path length is not evenly divisible by the selection's\nheight then the selection should be scaled slightly." + /* Display fonts */ +static char *str_AA = "AA"; +static char mnemonic_AA = 'A'; +static char *str_AAPopup = "AntiAlias (greymap) characters, or bitmap characters"; +static char *str_PixelSizePopup = "Specifies the pixel size of the characters on display"; +static char *str_FormatPopup = "Specifies file format used to pass the font to freetype\n pfb -- is the standard postscript type1\n ttf -- is truetype\n httf-- is hinted truetype\n otf -- is opentype\n bitmap -- not passed to freetype for rendering\n bitmap fonts must already be generated\n FontForge -- uses FontForge's own rasterizer, not\n freetype's. Only as last resort"; +static char *str_BadSize = "Bad Size"; +static char *str_RequestedSizeNotAvail = "Requested bitmap size not available in font. Font supports %hs"; +static char *str_BadFont = "Bad Font"; + /* Mac specific */ +static char *str_LeaveX = "Leave X"; +static char *str_LeaveXLong = "A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A"; +static char *str_NoATM = "The generated font won't work with ATM"; +static char *str_BadEncodingForATM = "ATM requires that fonts be encoded with the Macintosh Latin encoding. This postscript font will print fine, but only the bitmap versions will be displayed on the screen"; + /* Simplifydlg */ +static char *str_RemoveExtrema = "Allow removal of extrema"; +static char mnemonic_RemoveExtrema = 'r'; +static char *str_RemoveExtremaPopup = "Normally simplify will not remove points at the extrema of curves\n(both PostScript and TrueType suggest you retain these points)"; +static char *str_ChangeSlopes = "Allow slopes to change"; +static char mnemonic_ChangeSlopes = 's'; +static char *str_ChangeSlopesPopup = "Normally simplify will not change the slope of the contour at the points."; +static char *str_ErrorLimit = "Error Limit:"; +static char mnemonic_ErrorLimit = 'E'; +static char *str_EmUnits = "em-units"; +static char *str_CurveSmoothing = "Allow curve smoothing"; +static char mnemonic_CurveSmoothing = 'c'; +static char *str_CurveSmoothingPopup = "Simplify will examine corner points whose control points are almost\ncolinear and smooth them into curve points" +static char *str_IfTan = "if tan less than" +static char *str_SnapToHV = "Snap to horizontal/vertical"; +static char mnemonic_SnapToHV = 'n'; +static char *str_SnapToHVPopup = "If the slope of an adjusted point is near horizontal or vertical\nsnap to that" +static char *str_FlattenBumps = "Flatten bumps on lines" +static char mnemonic_FlattenBumps = 'f'; +static char *str_FlattenBumpsPopup = "If a line has a bump on it then flatten out that bump"; +static char *str_IfSmallerThan = "if smaller than"; +static char *str_BumpSize = "Bump Size"; + /* ttfinstrs */ +static char *str_TTFInstructionsFor = "TrueType Instructions for %.50hs" +static char *str_Parse = "Parse" +static char mnemonic_Parse = 'P'; +static char *str_ParseError = "Parse Error"; +static char *str_MissingLParenCvt = "Missing left paren in command to get a cvt index"; +static char *str_MissingRParenCvt = "Missing right paren in command to get a cvt index"; +static char *str_NeedPushCount = "Expected a number for a push count" +static char *str_InvalidPushCount = "The push count must be a number between 0 and 255" +static char *str_ExtraPushes = "More pushes specified than needed"; +static char *str_InvalidUnsignedByte = "A value to be pushed by a byte push must be between 0 and 255"; +static char *str_MissingPushes = "Missing pushes"; +static char *str_MissingRBracket = "Missing right bracket in command (or bad binary value in bracket)" +static char *str_BracketNumTooBig = "Bracketted value is too large" +static char *str_InvalidShort = "A value must be between [-32768,32767]" +static char *str_InstrChanged = "Instructions were changed"; +static char *str_AskInstrChanged = "The instructions for %.80hs have changed. Do you want to lose those changes?" +static char *str_ChangeLength = "Change Length" +static char *str_EnterNewLength = "How many entries should there be in the cvt table?" + /* cvgridfit.c */ +static char *str_DPI = "DPI:"; +static char mnemonic_DPI = 'P'; +static char *str_ShowGridFit = "Show Grid Fit"; +static char mnemonic_ShowGridFit = 'G'; +static char *str_FreeTypeParams = "Grid Fit Parameters"; +static char *str_NoByteCode = "No ByteCode Interpreter"; +static char *str_NoByteCodeMsg = "These results are those of the freetype autohinter. They do not reflect the truetype instructions." +static char *str_Debug = "Debug"; +static char mnemonic_Debug = 'D'; +static char *str_Debugfpgm = "Debug fpgm/prep"; +static char mnemonic_Debugfpgm = 'f'; +static char *str_StepPopup = "Step into"; +static char *str_NextPopup = "Step over (Next)"; +static char *str_StepOutOfPopup = "Step out of current function"; +static char *str_ContinuePopup = "Continue"; +static char *str_WatchPointPopup = "Watch all selected points\n(stop when a point moves)"; +static char *str_TooManyBreakpoints = "Too Many Breakpoints"; +static char *str_NoWatchPoints = "No Watch Points"; +static char *str_NoWatchPointsWithRefs = "Watch Points not supported in glyphs with references"; +static char *str_HitWatchPoint = "Hit Watch Point"; +static char *str_HitWatchPointn = "Point %d was moved by the previous instruction" +static char *str_TTRegisters = "Registers (TrueType)"; +static char *str_TTStack = "Stack (TrueType)"; +static char *str_TTStorage = "Storage (TrueType)"; +static char *str_TTPoints = "Points (TrueType)"; +static char *str_TTCvt = "Cvt (TrueType)"; +static char *str_Registers = "Registers"; +static char *str_Stack = "Stack"; +static char *str_Storage = "Storage"; +static char *str_Cvt = "Cvt"; +static char *str_Twilight = "Twilight"; +static char *str_Normal = "Normal"; +static char *str_Current = "Current"; +static char *str_Original = "Original"; +static char *str_GridUnit = "Grid"; +static char *str_EmUnit = "Em Units" +static char *str_ExitDebugger = "Exit Debugger" + /* showatt */ +static char *str_NoAdvancedTypography = "No Advanced Typography"; +static char *str_AppleAdvancedTypography = "Apple Advanced Typography"; +static char *str_Empty = "Empty"; +static char *str_Entry = "Entry (%d,%d)"; +static char *str_Exit = "Exit (%d,%d)"; +static char *str_MarkAnchorNamePos = "%.30s (%d,%d)" +static char *str_MarkLigComponentNamePos = "Component %d %.30s (%d,%d)" +static char *str_MarkCharNamePos = "%.30hs (%d,%d)" +static char *str_MarkClassS = "Mark Class %.20s" +static char *str_BaseCharacters = "Base Characters"; +static char *str_BaseLigatures = "Base Ligatures"; +static char *str_BaseMarks = "Base Marks"; +static char *str_OTFLanguage = "Language"; +static char *str_OTFScript = "Script"; +static char *str_RequiredFeature = "Required Feature"; + /* Metricsview */ +static char *str_NewKernClassEntry = "This kerning pair (%.20hs and %.20hs) is currently part of a kerning class with a 0 offset for this combination. Would you like to alter this kerning class entry (or create a kerning pair for just these two glyphs)?"; +static char *str_NewKernClassEntTitle = "Use Kerning Class?" +static char *str_MetricsTitle = "Metrics For %.50hs"; + /* Kernclass */ +static char *str_KernClass = "Kerning Class"; +static char *str_ClassCnt = "Class Count:"; +static char *str_ClassIndex = "Class Index:"; +static char *str_SelectClass = "Select Class"; +static char *str_FromSelection = "From Selection"; +static char *str_Set = "Set"; +static char *str_SetFromSelectionPopup = "Set this class to be the characters selected in the fontview"; +static char *str_Select_nom = "Select"; +static char *str_SelectFromClassPopup = "Set the fontview's selection to be the characters in this class"; +static char *str_KernOffset = "Kern Offset:"; +static char *str_AlreadyUsed = "Already in use"; +static char *str_AlreadyInClass = "The character %.30hs is already in a different class. Would you like to remove it from the old class, or remove it from this class?" +static char *str_FromOld = "From old"; +static char *str_FromThis = "From this"; +static char *str_SelectAScript="Please select a script"; +static char *str_ClassZero = "Class 0" +static char *str_ClassZeroOffsets = "The kerning values for class 0 (\"Everything Else\") should always be 0" + /* nonlineartrans */ +static char *str_BadToken = "Bad Token"; +static char *str_BadNameToken = "Bad token \"%.30hs\"\nnear ...%40hs"; +static char *str_BadTokenExpected = "Bad token. Expected \"%.10hs\" got \"%.10hs\"\nnear ...%40hs"; +static char *str_BadTokenExpectedChar = "Bad token. Expected \"%.10hs\"\nnear ...%40hs"; +static char *str_BadTokenChar = "Bad token. got \"%c\"\nnear ...%40hs"; +static char *str_UnexpectedToken = "Unexpected token.\nbefore ...%40hs"; +static char *str_UnexpectedTokenAtEnd = "Unexpected token after expression end.\nbefore ...%40hs"; +static char *str_BadValue = "Bad Value"; +static char *str_BadLogarithem = "Attempt to take logarithem of %g in %.30hs"; +static char *str_BadSqrt = "Attempt to take the square root of %g in %.30hs"; +static char *str_DivideByZero = "Attempt divide by 0 in %.30hs"; +static char *str_XExpr = "X Expr:"; +static char *str_YExpr = "Y Expr:"; +static char *str_ExprPopup = "These expressions may contain the operators +,-,*,/,%,^ (which means raise to the power of here), and ?: It may also contain a few standard functions. Basic terms are real numbers, x and y.\nExamples:\n x^3+2.5*x^2+5\n (x-300)*(y-200)/100\n y+sin(100*x)" + /* effects */ +static char *str_Gap = "Gap:"; +static char mnemonic_Gap = 'G'; +static char *str_Outlining = "Outlining characters"; +static char *str_Inlining = "Inlining characters"; +static char *str_Shadowing = "Shadowing characters"; +static char *str_ShadowLen = "Shadow Length:"; +static char *str_LightAngle = "Light Angle:"; +static char *str_OutlineWidth = "Outline Width:"; + /* histogram */ +static char *str_SumAround = "Sum Around:"; +static char *str_BarWidth = "Bar Width:"; +static char *str_StemHistPopup = "Width: %d\nCount: %d\nPercentage of Max: %d%%\n"; +static char *str_StemHistSumPopup = "Width: %d-%d (%d)\nCount: %d (%d)\nPercentage of Max: %d%%\n"; +static char *str_BlueHistPopup = "Position: %d\nCount: %d\n"; +static char *str_BlueHistSumPopup = "Position: %d-%d (%d)\nCount: %d (%d)\n"; +static char *str_BlueMsg = "BlueValues come in pairs. Select another."; +static char *str_SmallerNumberFirstInBlues = "The smaller number must be selected first in a pair of bluevalues"; +static char *str_TinySelection = "Tiny Selection"; +static char *str_TinySelectionFull = "There are so few characters selected that it seems unlikely to me that you will get a representative sample of this aspect of your font. If you deselect everything the command will apply to all characters in the font" + /* contextchain */ +static char *str_ByGlyphs = "By Glyphs"; +static char *str_ByClasses = "By Classes"; +static char *str_ByCoverage = "By Coverage"; +static char *str_Match = "Match"; +static char *str_Backtrack = "Backtrack"; +static char *str_Lookahead = "Lookahead"; +static char *str_RuleCnt = "Rule Cnt:"; +static char *str_CurrentRule = "Current Rule:"; +static char *str_SetGlyphsFromSelectionPopup = "Set this glyph list to be the characters selected in the fontview"; +static char *str_SelectFromGlyphsPopup = "Set the fontview's selection to be the characters named here"; +static char *str_MatchLen = "Match Len:" +static char *str_CurrentPos = "Current Position:" +static char *str_Replacements = "Replacements" +static char *str_OTCCSubFormat1 = "OpenType Contextual or Chaining subtables may be in one" +static char *str_OTCCSubFormat2 = " of three formats. The context may be specified either" +static char *str_OTCCSubFormat3 = " as a string of specific glyphs, a string of glyph classes," +static char *str_OTCCSubFormat4 = " or a string of coverage tables."; +static char *str_OTCCSubFormat5 = "FontForge only supports editing the first and third formats."; +static char *str_OTCCSubFormat6 = " In the first format you must specify a string of glyph-names." +static char *str_OTCCSubFormat7 = " In the third format you must specify a string each element" +static char *str_OTCCSubFormat8 = " of which may contain several glyph-names." +static char *str_OTCCSubFormat9 = "For chaining subtables you may also specify backtrack and" +static char *str_OTCCSubFormat10= " lookahead lists." +static char *str_BadCoverage = "Bad Coverage Table"; +static char *str_BadCoverageLong = "A coverage table must contain at least one glyph name, and glyph names must be valid postscript names"; +static char *str_BadGlyphList = "Bad Match Glyph List +static char *str_BadMatchGlyphLong = "A glyph list must contain at least one glyph name, and glyph names must be valid postscript names"; +static char *str_BadBackGlyphList = "Bad Backtrack Glyph List +static char *str_BadForeGlyphList = "Bad Lookahead Glyph List +static char *str_BadGlyphNameListLong = "Glyph names must be valid postscript names"; +static char *str_BadSeqLookup = "Bad Sequence/Lookup List" +static char *str_MissingSeqLookup = "There must be at least one entry in the Sequence/Lookup List" +static char *str_MissingRules = "Missing rules"; +static char *str_MustBeRule = " There must be at least one contextual rule"; +static char *str_MissingMatch = "There must be at least one match coverage table"; +static char *str_MatchCntWrong = "In a Reverse Chaining Substitution there must be exactly one coverage table to match"; +static char *str_ReplacementMismatch = "In a Reverse Chaining Substitution there must be exactly as many replacements as there are glyph names in the match coverage table"; +static char *str_RplMismatch = "Replacement mismatch"; +static char *str_Sequence = "Sequence Number:"; +static char *str_Classes = "Classes"; +static char *str_SeqLookup = "Sequence/Lookup"; +static char *str_SeqLookList= "An ordered list of sequence positions and lookup tags" +static char *str_AGlyphList = "A list of glyphs:"; +static char *str_GlyphLists = "A list of glyph lists:"; +static char *str_ACoverageTable = "A coverage table:"; +static char *str_CoverageList = "A list of coverage tables:" +static char *str_ClassListOfListsOfGlyphNames = "Classes (Lists of lists of glyph names)"; +static char *str_ListOfClassNumbers = "List of class numbers"; +static char *str_ListOfListsOfClassNumbers = "List of lists of class numbers"; +static char *str_BadClassLong = "A class must contain at least one glyph name, glyph names must be valid postscript names, and no glyphs may appear in any other class"; +static char *str_BadClassName = "No glyphs from another class may appear here, but %.30s does"; +static char *str_MatchClass = "Match Classes"; +static char *str_BacktrackClass = "Back Classes"; +static char *str_LookaheadClass = "Ahead Classes"; +static char *str_EndOfText = "Class 0: {End of Text}"; +static char *str_EverythingElse = "{Everything Else}"; +static char *str_MacEverythingElse = "Class 1: {Everything Else}"; +static char *str_DeletedGlyph = "Class 2: {Deleted Glyph}"; +static char *str_EndOfLine = "Class 3: {End of Line}"; +static char *str_SameAsMatchClasses = "Same as Match Classes"; +static char str_MissingClassMember = "The class member \"%.20hs\" is not in this font,\nIs that what you want?"; +static char str_NoGlyphNamed = "There is no glyph named \"%.20hs\" in this font,\nIs that what you want?"; +static char *str_BadClassNumber = "Bad Match Class Number"; +static char *str_BadBackClassNumber = "Bad Backtrack Class Number"; +static char *str_BadLookClassNumber = "Bad Lookahead Class Number"; +static char *str_InvalidCharInClassNumber = "The list of class numbers should only contain digits and spaces"; +static char *str_ClassNumberOutOfRange = "There are only %d classes in this class set, yet you are trying to use %d." +static char *str_NoMatchClassNumber = "The are no class number listed to be matched. There must be at least one." + /* Mac enc */ +/* Windows languages have locales attached, mac languages don't. Hence we use different strings for them */ +static char str_MacEnglish = "English"; +static char str_MacFrench = "French"; +static char str_MacGerman = "German"; +static char str_MacItalian = "Italian"; +static char str_MacDutch = "Dutch"; +static char str_MacSwedish = "Swedish"; +static char str_MacSpanish = "Spanish"; +static char str_MacDanish = "Danish"; +static char str_MacPortuguese = "Portuguese"; +static char str_MacNorwegian = "Norwegian"; +static char str_MacHebrew = "Hebrew"; +static char str_MacJapanese = "Japanese"; +static char str_MacArabic = "Arabic"; +static char str_MacFinnish = "Finnish"; +static char str_MacGreek = "Greek"; +static char str_MacIcelandic = "Icelandic"; +static char str_MacMaltese = "Maltese"; +static char str_MacTurkish = "Turkish"; +static char str_MacCroatian = "Croatian"; +static char str_MacTraditionalChinese = "Traditional Chinese"; +static char str_MacUrdu = "Urdu"; +static char str_MacHindi = "Hindi"; +static char str_MacThai = "Thai"; +static char str_MacKorean = "Korean"; +static char str_MacLithuanian = "Lithuanian"; +static char str_MacPolish = "Polish"; +static char str_MacHungarian = "Hungarian"; +static char str_MacEstonian = "Estonian"; +static char str_MacLatvian = "Latvian"; +static char str_MacSami = "Sami (Lappish)"; +static char str_MacFaroese = "Faroese (Icelandic)"; +static char str_MacFarsi = "Farsi/Persian"; +static char str_MacRussian = "Russian"; +static char str_MacSimplifiedChinese = "Simplified Chinese"; +static char str_MacFlemish = "Flemish"; +static char str_MacIrish = "Irish Gaelic"; +static char str_MacAlbanian = "Albanian"; +static char str_MacRomanian = "Romanian"; +static char str_MacCzech = "Czech"; +static char str_MacSlovak = "Slovak"; +static char str_MacSlovenian = "Slovenian"; +static char str_MacYiddish = "Yiddish"; +static char str_MacSerbian = "Serbian"; +static char str_MacMacedonian = "Macedonian"; +static char str_MacBulgarian = "Bulgarian"; +static char str_MacUkrainian = "Ukrainian"; +static char str_MacByelorussian = "Byelorussian"; +static char str_MacUzbek = "Uzbek"; +static char str_MacKazakh = "Kazakh"; +static char str_MacAxerbaijaniC = "Axerbaijani (Cyrillic)"; +static char str_MacAxerbaijaniA = "Axerbaijani (Arabic)"; +static char str_MacArmenian = "Armenian"; +static char str_MacGeorgian = "Georgian"; +static char str_MacMoldavian = "Moldavian"; +static char str_MacKirghiz = "Kirghiz"; +static char str_MacTajiki = "Tajiki"; +static char str_MacTurkmen = "Turkmen"; +static char str_MacMongolianM = "Mongolian (Mongolian)"; +static char str_MacMongolianC = "Mongolian (cyrillic)"; +static char str_MacPashto = "Pashto"; +static char str_MacKurdish = "Kurdish"; +static char str_MacKashmiri = "Kashmiri"; +static char str_MacSindhi = "Sindhi"; +static char str_MacTibetan = "Tibetan"; +static char str_MacNepali = "Nepali"; +static char str_MacSanskrit = "Sanskrit"; +static char str_MacMarathi = "Marathi"; +static char str_MacBengali = "Bengali"; +static char str_MacAssamese = "Assamese"; +static char str_MacGujarati = "Gujarati"; +static char str_MacPunjabi = "Punjabi"; +static char str_MacOriya = "Oriya"; +static char str_MacMalayalam = "Malayalam"; +static char str_MacKannada = "Kannada"; +static char str_MacTamil = "Tamil"; +static char str_MacTelugu = "Telugu"; +static char str_MacSinhalese = "Sinhalese"; +static char str_MacBurmese = "Burmese"; +static char str_MacKhmer = "Khmer"; +static char str_MacLao = "Lao"; +static char str_MacVietnamese = "Vietnamese"; +static char str_MacIndonesian = "Indonesian"; +static char str_MacTagalog = "Tagalog"; +static char str_MacMalayR = "Malay (roman)"; +static char str_MacMalayA = "Malay (arabic)"; +static char str_MacAmharic = "Amharic"; +static char str_MacTigrinya = "Tigrinya"; +static char str_MacGalla = "Galla"; +static char str_MacSomali = "Somali"; +static char str_MacSwahili = "Swahili"; +static char str_MacKinyarwanda = "Kinyarwanda/Ruanda"; +static char str_MacRundi = "Rundi"; +static char str_MacNyanja = "Nyanja/Chewa"; +static char str_MacMalagasy = "Malagasy"; +static char str_MacEsperanto = "Esperanto"; +static char str_MacWelsh = "Welsh"; +static char str_MacBasque = "Basque"; +static char str_MacCatalan = "Catalan"; +static char str_MacLatinLang = "Latin"; +static char str_MacQuechua = "Quechua"; +static char str_MacGuarani = "Guarani"; +static char str_MacAymara = "Aymara"; +static char str_MacTatar = "Tatar"; +static char str_MacUighur = "Uighur"; +static char str_MacDzongkha = "Dzongkha"; +static char str_MacJavanese = "Javanese (roman)"; +static char str_MacSundanese = "Sundanese (roman)"; +static char str_MacGalician = "Galician"; +static char str_MacAfrikaans = "Afrikaans"; +static char str_MacBreton = "Breton"; +static char str_MacInuktitut = "Inuktitut"; +static char str_MacScottish = "Scottish Gaelic"; +static char str_MacManx = "Manx Gaelic"; +static char str_MacIrishDot = "Irish Gaelic (with dot)"; +static char str_MacTongan = "Tongan"; +static char str_MacGreekPolytonic = "Greek (polytonic)"; +static char str_MacGreenlandic = "Greenlandic"; +static char str_MacAzebaijani = "Azebaijani (roman)"; + /* End of mac language list */ +static char *str_LanguageC = "Language:"; +static char mnemonic_LanguageC = 'L'; +static char *str_BadLanguage = "Bad Language"; +static char *str_SettingId = "Setting Id:"; +static char *str_MutuallyExclusive = "Mutually Exclusive"; +static char *str_Enabled = "Enabled"; +static char mnemonic_Enabled = 'E'; +static char *str_ThisSettingIsAlreadyUsed = "This setting is already used"; + /* apple statemachine */ +static char *str_FeatureSetting = "Feature, Setting:"; +static char *str_StartOfInput = "{Start of Input}"; +static char *str_StartOfLine = "{Start of Line}"; +static char *str_EditStateTransition = "Edit State Transition"; +static char *str_AdvanceToNextGlyph = "Advance To Next Glyph"; +static char *str_MarkCurrentGlyph = "Mark Current Glyph"; +static char *str_PushCurrentGlyph = "Push Current Glyph"; +static char *str_MarkCurrentGlyphAsFirst = "Mark Current Glyph As First"; +static char *str_MarkCurrentGlyphAsLast = "Mark Current Glyph As Last"; +static char *str_CurrentGlyphIsKashida = "Current Glyph Is Kashida Like"; +static char *str_MarkedGlyphIsKashida = "Marked Glyph Is Kashida Like"; +static char *str_InsertBeforeCurrentGlyph = "Insert Before Current Glyph"; +static char *str_InsertBeforeMarkedGlyph = "Insert Before Marked Glyph"; +static char *str_NoChange = "No Change"; +static char *str_CurrentInsert = "Current Insert:"; +static char *str_MarkInsert = "Mark Insert:"; +static char *str_CurrentSubs = "Current Subs:"; +static char *str_MarkSubs = "Mark Subs:"; +static char *str_KernValues = "Kern Values:"; +static char *str_StateClass = "State %d, %.40s"; +static char *str_NextState = "Next State:"; +static char *str_TooManyKerns = "Too Many Kerns"; +static char *str_AtMost8Kerns = "At most 8 kerning values may be specified here"; +static char *str_KernsMustBeEven = "Kerning values must be even"; +static char *str_TooManyGlyphs = "Too Many Glyphs"; +static char *str_AtMost31Glyphs = "At most 31 glyphs may be specified in an insert list"; +static char *str_BadFeatureSetting = "Bad Feature Setting"; +static char *str_FeatureSettingFor = "Feature/Setting for:"; +static char *str_VerticalOnly = "Vertical Only"; +static char *str_ConvertFromOpenType = "Convert from OpenType..."; +static char *str_Convert = "Convert..."; +static char *str_NothingToConvert = "Nothing to Convert"; +static char *str_Class_d = "Class %d"; +static unichar_t *str_RightArrow = { 'R', 'i', 'g','h','t', 0x2192, 0 }; +static unichar_t mnemonic_RightArrow = 'R'; +static unichar_t str_LeftArrow = { 0x2190, 'L','e','f','t', 0 } +static unichar_t mnemonic_LeftArrow = 'L'; +static unichar_t *str_UpArrow = { 'U', 'p', 0x2191, 0 }; +static unichar_t mnemonic_UpArrow = 'U'; +static unichar_t str_DownArrow = { 0x2193, 'D','o','w','n', 0 } +static unichar_t mnemonic_DownArrow = 'D'; +static char *str_MissingGlyphName = "Missing Glyph Name"; + /* typographic features dlgs */ +static char *str_NoFeaturesRemoved = "No Features Removed"; +static char *str_NoFeaturesCopied = "No Features Copied"; +static char *str_NoFeaturesRetagged = "No Features Retagged"; +static char *str_AnyFlags = "Any Flags"; +static char *str_TheseFlags = "These Flags"; +static char *str_AnyScript = "Any Script"; +static char *str_BadTag = "Bad Tag"; +static char *str_RetagWith = "Retag with..."; +static char *str_NoSelectedFont = "No Selected Font"; + /* spline util */ +static char *str_BadMM = "Bad Multiple Master Font"; +static char *str_MMTooFewMasters = "This multiple master font has %1$d instance fonts, but it needs at least %2$d master fonts for %3$d axes. FontForge will not be able to edit this correctly"; +static char *str_MMHasInstances = "This multiple master font has %1$d instance fonts, but FontForge can only handle %2$d master fonts for %3$d axes. FontForge will not be able to edit this correctly"; +static char *str_MMDifferentNumChars = "The fonts %1$.30hs and %2$.30hs have a different number of characters or different encodings" +static char *str_MMDifferentOrder = "The fonts %1$.30hs and %2$.30hs use different types of splines (one quadratic, one cubic)" +static char *str_MMUndefChar = "The character %1$.30hs is defined in font %2$.30hs but not in %3$.30hs" +static char *str_MMWrongContourCount = "The character %1$.30hs has a different number of contours in font %2$.30hs than in %3$.30hs" +static char *str_MMMismatchContoursPt = "The character %1$.30hs in font %2$.30hs has a different number of points (or control points) on its contours than in %3$.30hs" +static char *str_MMMismatchContoursDir = "The character %1$.30hs in font %2$.30hs has contours running in a different direction than in %3$.30hs" +static char *str_MMMismatchRefs = "The character %1$.30hs in font %2$.30hs has contours running in a different direction than in %3$.30hs" +static char *str_MMMismatchHints = "The %1$hs hints in character \"%2$.30hs\" in font %3$.30hs do not match those in %4$.30hs (different number or different overlap criteria)" +static char *str_MMMismatchKerns = "The character %1$.30hs in font %2$.30hs has a different set of kern pairs than in %3$.30hs" +static char *str_MMNeedsBoldThresh = "There is no ForceBoldThreshold entry in the weighted font, but there is a ForceBold entry in font %30hs" +static char *str_MMPrivateMismatch = "The entry \"%1$.20hs\" is not present in the private dictionary of both %2$.30hs and %3$.30hs" +static char *str_MMMismatchHintMask = "The character %1$.30hs in font %2$.30hs has a different hint mask on its contours than in %3$.30hs" +static char *str_MMOrder2 = "The font %.30hs contains quadratic splines. It must be converted to cubic splines before it can be used in a multiple master" +static char *str_NoProblems = "No problems detected" +static char *str_MMOrder2NoName = "One of the multiple master instances contains quadratic splines. It must be converted to cubic splines before it can be used in a multiple master" +static char *str_MMDifferentNumCharsNoName = "The different instances of this mm have a different number of characters" +static char *str_MMUndefCharNoName = "This glyph is defined in one instance font but not in another" +static char *str_MMDiffNumRefs = "This glyph contains a different number of references in different instances" +static char *str_MMDiffNumHints = "This glyph contains a different number of hints in different instances" +static char *str_MMDiffRefEncodings = "A references in this glyph refers to a different encoding in different instances" +static char *str_MMPointMismatch = "A contour in this glyph contains a different number of points in different instances" +static char *str_MMContourMismatch = "This glyph contains a different number of contours in different instances" +static char *str_MMNumHints = "This glyph contains a different number of hints in different instances" +static char *str_MMDiffKerns = "This glyph contains different kerning pairs in different instances" +static char *str_MMVariousErrors = "Various errors occurred at the selected glyphs"; +static char *str_MMSelErr = "The following error occurred on the selected glyphs: %.100s" +static char *str_ChangeBlend1 = "You may change the default instance of this font" +static char *str_ChangeBlend2 = "either by explicitly entering the contribution" +static char *str_ChangeBlend3 = "of each master design, or by entering the design" +static char *str_ChangeBlend4 = "values for each axis" +static char *str_ContribOfMaster = "Contribution of each master design" +static char *str_DesignAxisValues = "Design Axis Values" +static char *str_BadMMWeights = "Bad MM Weights"; +static char *str_BadNDVCDV = "The results produced by applying the NormalizeDesignVector and ConvertDesignVector functions were not the results expected. You may need to change these functions"; +static char *str_BadOrFewWeights = "Incorrect number of instances weights, or illegal numbers" +static char *str_WeightsMustBe1 = "The weights for the default version of the font must sum to 1.0" +static char *str_NumberOfAxes = "Number of Axes:" +static char *str_NumberOfMasterDesigns = "Number of Master Designs:" +static char *str_Axis1 = "Axis 1"; +static char *str_Axis2 = "Axis 2"; +static char *str_Axis3 = "Axis 3"; +static char *str_Axis4 = "Axis 4"; +static char *str_AxisType = "Axis Type:" +static char *str_BadAxis = "Bad Axis" +static char *str_SetAxisType = "Please set the Axis Type field" +static char *str_AxisRange = "Axis Range:" +static char *str_AxisRangeNotValid = "Axis range not valid" +static char *str_Begin = "Begin:" +static char *str_End = "End:" +static char *str_IntermediatePoints = "Intermediate Points:" +static char *str_DesignSettings = "Design Settings:" +static char *str_NormalizedSettings = "Normalized Settings:" +static char *str_ListOutOfOrder = "The %s list is not ordered" +static char str_BadNumberIn_s = "Bad Number in %s"; +static char str_WrongNumberOfEntriesIn_s = "Wrong number of entries in %s"; +static char str_DesignNormMustCorrespond = "The number of entries in the design settings must match the number in normalized settings"; +static char *str_MasterDesigns = "Master Designs" +static char *str_WeightsForDefaultInstance = "Weights for default instance:" +static char *str_NDV = "Normalize Design Vector Function:" +static char *str_CDV = "Convert Design Vector Function:" +static char *str_SourceOfDesign = "Source from which this design is to be taken" +static char *str_AxisWeights = "Position of this design along each axis" +static char *str_BadFunction = "Bad PostScript function" +static char *str_ForceBoldThreshold = "Force Bold Threshold: +static char *str_NoCIDinMM = "CID keyed fonts may not be a master design of a multiple master font" +static char *str_NoMMinMM = "Multiple master fonts may not be a master design of another multiple master font" +static char *str_PositionUsedTwice = "The set of positions, %.30s, is used more than once" +static char *str_PositionUnused = "The set of positions, %.30hs, is not specified in any design (and should be)" +static char *str_FontUsedTwice = "The font %.30hs is assigned to two master designs" +static char *str_DisorderedDesigns = "Disordered designs" +static char *str_DisorderedDesignsOk = "The master designs are not positioned in the expected order. FontForge will be unable to suggest a ConvertDesignVector for you. Is this what you want?" + + /* Adjectives, etc. that are sometimes masculine and sometimes feminine in french (perhaps other langs) */ +static char str_NewDDD_fem[] = "New..."; +static unichar_t mnemonic_NewDDD_fem[] = 'N'; +static char *str_None_fem ="None"; +static char mnemonic_None_fem ='N'; + +static int num_buttonsize = 55; +static int num_ScaleFactor = 100; diff --git a/fontforge/nomen-es.c b/fontforge/nomen-es.c new file mode 100644 index 00000000..57cb62e8 --- /dev/null +++ b/fontforge/nomen-es.c @@ -0,0 +1,55 @@ +#include "nomen.h" + +static enum encoding enc = e_iso8859_1; + +static char str_Language[] = "Espanole"; +static char str_OK[] = "OK"; +static unichar_t mnemonic_OK[] = 'O'; +static char str_Cancel[] = "Cancelar"; +static unichar_t mnemonic_Cancel[] = 'C'; +static char str_Open[] = "Abrir"; +static unichar_t mnemonic_Open[] = 'A'; +static char str_Save[] = "Guardar"; +static unichar_t mnemonic_Save[] = 'G'; +static char str_Filter[] = "Filtro"; +static unichar_t mnemonic_Filter[] = 'F'; +static char str_New[] = "Nuevo"; +static unichar_t mnemonic_New[] = 'N'; +/* Menus ... */ +static char str_File[] = "Archivo"; +static unichar_t mnemonic_File[] = 'A'; +static char str_Edit[] = "Modificar"; +static unichar_t mnemonic_Edit[] = 'M'; +static char str_Print[] = "Imprimir..."; +static unichar_t mnemonic_Print[] = 'I'; +static char str_Saveas[] = "Guardar como..."; +static unichar_t mnemonic_Saveas[] = 'c'; +static char str_SaveAll[] = "Guardar todos"; +static unichar_t mnemonic_SaveAll = 'T'; +static char str_Close[] = "Cerrar"; +static unichar_t mnemonic_Close[] = 'c'; +static char str_Prefs[] = "Preferencias..."; +static unichar_t mnemonic_Prefs[] = 'e'; +static char str_Quit[] = "Salir"; +static unichar_t mnemonic_Quit[] = 'S'; +static char str_Goto[] = "Ir a"; +static unichar_t mnemonic_Goto[] = 'I'; +static char str_Undo[] = "Deshacer"; +static unichar_t mnemonic_Undo[] = 'D'; +static char str_Redo[] = "Rehacer"; +static unichar_t mnemonic_Redo[] = 'R'; +static char str_Cut[] = "Cortar"; +static unichar_t mnemonic_Cut[] = 't'; +static char str_Copy[] = "Copiar"; +static unichar_t mnemonic_Copy[] = 'C'; +static char str_Paste[] = "Pegar"; +static unichar_t mnemonic_Paste[] = 'P'; +static char str_CopyFgToBg[] = "Copiar Fg a Bg"; +static unichar_t mnemonic_CopyFgToBg[] = 'F'; +static char str_SelectAll[] = "Seleccionar todos"; +static unichar_t mnemonic_SelectAll[] = 't'; +static char str_SelectColor[] = "Seleccionar color"; +static unichar_t mnemonic_SelectColor[] = 'S'; + +static int num_buttonsize = 70; +static int num_ScaleFactor = 130; diff --git a/fontforge/nomen-fr.c b/fontforge/nomen-fr.c new file mode 100644 index 00000000..d939b244 --- /dev/null +++ b/fontforge/nomen-fr.c @@ -0,0 +1,3362 @@ +/* +Modified by Yannis Haralambous +yannis.haralambous@enst-bretagne.fr +on: 14/01/04, 00h26 + +Translated terminology based on: + +@book{Haralambous:fec2004, + Author = {Yannis Haralambous}, + Publisher = {O'Reilly France}, + Title = {Fontes \& codages}, + Year = {2004}} +*/ +#include "nomen.h" + +static enum encoding enc = e_iso8859_1 ; + + /* open file dialog */ +static char str_Language[] = "Français" ; +static char str_OK[] = "OK" ; +static unichar_t mnemonic_OK[] = 'O' ; +static char str_Cancel[] = "Annuler" ; +static unichar_t mnemonic_Cancel[] = 'A' ; +static char str_Open[] = "Ouvrir" ; +static unichar_t mnemonic_Open[] = 'O' ; +static char str_Save[] = "Enregistrer" ; +static unichar_t mnemonic_Save[] = 'E' ; +static char str_Filter[] = "Filtrer" ; +static unichar_t mnemonic_Filter[] = 'F' ; +static char str_New[] = "Nouveau" ; +static unichar_t mnemonic_New[] = 'N' ; +static char str_Replace[] = "Remplacer" ; +static char str_Fileexists[] = "Le fichier existe" ; +static char *str_None ="Aucun" ; +static char mnemonic_None ='c' ; + /* "File, %s, exists. Replace it ?" */ +static char str_Fileexistspre[] = "Le fichier " ; +static char str_Fileexistspost[] = " existe. Le remplacer ?" ; +static char str_Createdir[] = "Créer répertoire..." ; +static char str_Dirname[] = "Nom du répertoire ?" ; +static char str_Couldntcreatedir[] = "Impossible de créer répertoire" ; +static char str_SelectAll[] = "Tout sélectionner" ; +static char mnemonic_SelectAll ='T' ; + /* Menu names */ +static char str_File[] = "Fichier" ; +static unichar_t mnemonic_File[] = 'F' ; +static char str_Edit[] = "Édition" ; +static unichar_t mnemonic_Edit[] = 'É' ; +static char str_Point[] = "Point" ; +static unichar_t mnemonic_Point[] = 'P' ; +static char str_Element[] = "Élément" ; +static unichar_t mnemonic_Element[] = 'l' ; +static char str_Hints[] = "Hints" ; +static unichar_t mnemonic_Hints[] = 'H' ; +static char str_View[] = "Vue" ; +static unichar_t mnemonic_View[] = 'V' ; +static char str_Metric[] = "Métriques" ; +static unichar_t mnemonic_Metric[] = 'M' ; +static char str_Window[] = "Fenêtre" ; +static unichar_t mnemonic_Window[] = 'F' ; +static char str_Help[] = "Aide" ; +static unichar_t mnemonic_Help[] = 'A' ; + /* File menu */ +static char str_Index[] = "Index" ; +static unichar_t mnemonic_Index[] = 'I' ; +static char str_Recent[] = "Récent" ; +static unichar_t mnemonic_Recent[] = 'R' ; +static char str_Openoutline[] = "Ouvrir fenêtre de glyphe" ; +static unichar_t mnemonic_Openoutline[] = 'g' ; +static char str_About[] = "À propos..." ; +static unichar_t mnemonic_About[] = 'À' ; +static char str_LicenseDDD[] = "Licence..." ; +static unichar_t mnemonic_LicenseDDD[] = 'L' ; +static char str_Openbitmap[] = "Ouvrir fenêtre de bitmap" ; +static unichar_t mnemonic_Openbitmap[] = 'b' ; +static char str_Openmetrics[] = "Ouvrir fenêtre de métriques" ; +static unichar_t mnemonic_Openmetrics[] = 'm' ; +static char str_Print[] = "Imprimer..." ; +static unichar_t mnemonic_Print[] = 'P' ; +static char str_Display[] = "Afficher..." ; +static unichar_t mnemonic_Display[] = 'f' ; +static char str_Revertfile[] = "Version précédente du fichier" ; +static unichar_t mnemonic_Revertfile[] = 'V' ; +static char str_RevertGlyph[] = "Version précédente du glyphe" ; +static unichar_t mnemonic_RevertGlyph[] = 'y' ; +static char str_Saveas[] = "Enregistrer sous..." ; +static unichar_t mnemonic_Saveas[] = 'S' ; +static char str_ExecuteScript[] = "Exécuter un script..." ; +static unichar_t mnemonic_ExecuteScript[] = 'x' ; +static char str_Generate[] = "Générer fonte(s)..." ; +static unichar_t mnemonic_Generate[] = 'G' ; +static char str_GenerateMac[] = "Générer famille pour Mac..." ; +static unichar_t mnemonic_GenerateMac[] = 'F' ; +static char str_Import[] = "Importer..." ; +static unichar_t mnemonic_Import[] = 'I' ; +static char str_SaveAll[] = "Tout enregistrer" ; +static unichar_t mnemonic_SaveAll = 'T' ; +static char str_Close[] = "Fermer" ; +static unichar_t mnemonic_Close[] = 'F' ; +static char str_Prefs[] = "Préférences..." ; +static unichar_t mnemonic_Prefs[] = 'e' ; +static char str_Quit[] = "Quitter" ; +static unichar_t mnemonic_Quit[] = 'Q' ; +static char str_Fit[] = "Adapter" ; +static unichar_t mnemonic_Fit[] = 'A' ; +static char str_Zoomin[] = "Agrandir" ; +static unichar_t mnemonic_Zoomin[] = 'i' ; +static char str_Zoomout[] = "Réduire" ; +static unichar_t mnemonic_Zoomout[] = 'o' ; +static char str_NextChar[] = "Glyphe suivant" ; +static unichar_t mnemonic_NextChar[] = 'S' ; +static char str_PrevChar[] = "Glyphe précédent" ; +static unichar_t mnemonic_PrevChar[] = 'P' ; +static char str_Substitutions = "Substitutions" ; +static char mnemonic_Substitutions = 'S' ; +static char str_Goto[] = "Aller au glyphe" ; +static unichar_t mnemonic_Goto[] = 'A' ; +static char str_Hidepoints[] = "Masquer les points" ; +static unichar_t mnemonic_Hidepoints[] = 'o' ; +static char str_Showpoints[] = "Montrer les points" ; +static unichar_t mnemonic_Showpoints[] = 'o' ; +static char str_NextDefChar[] = "Glyphe défini suivant" ; +static unichar_t mnemonic_NextDefChar[] = 'D' ; +static char str_PrevDefChar[] = "Glyphe défini précédent" ; +static unichar_t mnemonic_PrevDefChar[] = 'a' ; +static char str_Hiderulers[] = "Masquer règles" ; +static unichar_t mnemonic_Hiderulers[] = 'R' ; +static char str_Showrulers[] = "Montrer règles" ; +static unichar_t mnemonic_Showrulers[] = 'R' ; +static char str_MarkExtrema[] = "Marquer extréma" ; +static unichar_t mnemonic_MarkExtrema[] = 'M' ; +static char str_Nextpoint[] = "Point suivant" ; +static unichar_t mnemonic_Nextpoint[] = 'e' ; +static char str_Prevpoint[] = "Point précédent" ; +static unichar_t mnemonic_Prevpoint[] = 'v' ; +static char *str_ShowHMetrics="Montrer métriques horizontales" ; +static char mnemonic_ShowHMetrics = 'h' ; +static char *str_ShowVMetrics="Montrer métriques verticales" ; +static char mnemonic_ShowVMetrics = 'v' ; +static char *str_EncodedView="Vue selon le codage" ; +static char mnemonic_EncodedView = 'E' ; +static char *str_CompactedView="Vue compactifiée" ; +static char mnemonic_CompactedView = 'C' ; +static char *str_ShowAtt = "Montrer propriétés typo avancées" ; +static char mnemonic_ShowAtt = 'M' ; +static char *str_Combinations="Combinaisons" ; +static char mnemonic_Combinations = 'b' ; +static char *str_KernPairs="Paires de crénage" ; +static char mnemonic_KernPairs = 'c' ; +static char *str_Ligatures="Ligatures" ; +static char mnemonic_Ligatures = 'L' ; +static char *str_AnchoredPairs="Paires ancrées" ; +static char mnemonic_AnchoredPairs = 'A' ; +static char *str_FindInFontView="Trouver dans la fenêtre de fonte" ; +static char mnemonic_FindInFontView = 'V' ; +static char str_Fill[] = "Noircir" ; +static unichar_t mnemonic_Fill[] = 'l' ; +static char str_ShowGridFitDDD = "Montrer adaptation à la grille des pixels..." ; +static char mnemonic_ShowGridFitDDD = 'w' ; +static char str_Select[] = "Sélectionner" ; +static unichar_t mnemonic_Select[] = 'S' ; +static char str_DeselectAll[] = "Tout désélectionner" ; +static unichar_t mnemonic_DeselectAll[] = 'D' ; +static char str_SelectByATT[] = "Sélection par ATT..." ; +static unichar_t mnemonic_SelectByATT[] = 'T' ; +static char str_FirstPoint[] = "Premier point" ; +static unichar_t mnemonic_FirstPoint[] = 'r' ; +static char str_Undo[] = "Annuler" ; +static unichar_t mnemonic_Undo[] = 'A' ; +static char str_Redo[] = "Rétablir" ; +static unichar_t mnemonic_Redo[] = 'R' ; +static char str_NextControlPoint[] = "Point de contrôle suivant" ; +static unichar_t mnemonic_NextControlPoint[] = 'x' ; +static char str_PrevControlPoint[] = "Point de contrôle précédent" ; +static unichar_t mnemonic_PrevControlPoint[] = 'r' ; +static char str_SelectWidth[] = "Chasse" ; +static unichar_t mnemonic_SelectWidth[] = 'C' ; +static char str_SelectVWidth[] = "Chasse verticale" ; +static unichar_t mnemonic_SelectVWidth[] = 'V' ; +static char str_DeselectWidth[] = "Désélectionner chasse" ; +static unichar_t mnemonic_DeselectWidth[] = 'D' ; +static char str_DeselectVWidth[] = "Désélectionner chasse verticale" ; +static unichar_t mnemonic_DeselectVWidth[] = 'h' ; +static char str_Cut[] = "Couper" ; +static unichar_t mnemonic_Cut[] = 'p' ; +static char str_Copy[] = "Copier" ; +static unichar_t mnemonic_Copy[] = 'C' ; +static char str_Copywidth[] = "Copier chasse" ; +static unichar_t mnemonic_Copywidth[] = 'i' ; +static char str_Copyref[] = "Copier référence" ; +static unichar_t mnemonic_Copyref[] = 'f' ; +static char str_CopyVWidth[] = "Copier chasse verticale" ; +static unichar_t mnemonic_CopyVWidth[] = 'v' ; +static char str_CopyLBearing[] = "Copier approche gauche" ; +static unichar_t mnemonic_CopyLBearing[] = 'p' ; +static char str_CopyRBearing[] = "Copier approche droite" ; +static unichar_t mnemonic_CopyRBearing[] = 'g' ; +static char str_Paste[] = "Coller" ; +static unichar_t mnemonic_Paste[] = 'l' ; +static char str_PasteInto[] = "Coller dans" ; +static char str_SameGlyphAs[] = "Même glyphe que" ; +static unichar_t mnemonic_SameGlyphAs[] = 'm' ; +static char str_Clear[] = "Supprimer" ; +static unichar_t mnemonic_Clear[] = 'E' ; +static char str_Merge[] = "Fusionner" ; +static unichar_t mnemonic_Merge[] = 'M' ; +static char str_ClearBackground[] = "Effacer arrière-plan" ; +static unichar_t mnemonic_ClearBackground[] = 'B' ; +static char str_SelectAll[] = "Tout sélectionner" ; +static unichar_t mnemonic_SelectAll[] = 'T' ; +static char str_CopyFgToBg[] = "Avant-plan -> arrière-plan" ; +static unichar_t mnemonic_CopyFgToBg[] = 'F' ; +static char str_CopyGridFit = "Copier contour adapté" ; +static unichar_t mnemonic_CopyGridFit = 'd' ; +static char str_Unlinkref[] = "Remplacer référence" ; +static unichar_t mnemonic_Unlinkref[] = 'R' ; +static char str_Elide = "Amalgamer + modif pente" ; +static unichar_t mnemonic_Elide = 'E' ; +static char str_Join[] = "Joindre" ; +static unichar_t mnemonic_Join[] = 'J' ; +static char str_Fontinfo[] = "Infos fonte..." ; +static unichar_t mnemonic_Fontinfo[] = 'P' ; +static char str_SelectColor[] = "Choisir la couleur" ; +static unichar_t mnemonic_SelectColor[] = 'S' ; +static char str_RemoveUndoes[] = "Supprimer les annulations" ; +static unichar_t mnemonic_RemoveUndoes[] = 'e' ; +static char str_Findprobs[] = "Rechercher problèmes..." ; +static unichar_t mnemonic_Findprobs[] = 'o' ; +static char str_Getinfo[] = "Infos..." ; +static unichar_t mnemonic_Getinfo[] = 'I' ; +static char str_OpenReference[] = "Ouvrir référence" ; +static char str_Bitmapsavail[] = "Bitmaps disponibles..." ; +static unichar_t mnemonic_Bitmapsavail[] = 'A' ; +static char str_ShowDependents[] = "Montrer les dépendances..." ; +static unichar_t mnemonic_ShowDependents[] = 'h' ; +static char str_Regenbitmaps[] = "Régénérer bitmaps..." ; +static unichar_t mnemonic_Regenbitmaps[] = 'B' ; +static char str_Autotrace[] = "Autotrace" ; +static unichar_t mnemonic_Autotrace[] = 'r' ; +static char str_Transform[] = "Transformer..." ; +static unichar_t mnemonic_Transform[] = 'T' ; +static char str_NonLinearTransform[] = "Transformation non linéaire..." ; +static char str_Stroke[] = "Étendre ligne..." ; +static unichar_t mnemonic_Stroke[] = 'E' ; +static char str_TilePath[] = "Tuiler chemin..." ; +static unichar_t mnemonic_TilePath[] = 'P' ; +static char str_Overlap[] = "Recouvrements" ; +static unichar_t mnemonic_Overlap[] = 'v' ; +static char str_Rmoverlap[] = "Effacer recouvrements" ; +static unichar_t mnemonic_Rmoverlap[] = 'v' ; +static char str_Intersect[] = "Intersection" ; +static unichar_t mnemonic_Intersect[] = 'I' ; +static char str_Exclude[] = "Exclusion" ; +static unichar_t mnemonic_Exclude[] = 'E' ; +static char str_FindIntersections[] = "Trouver les intersections" ; +static unichar_t mnemonic_FindIntersections[] = 'T' ; +static char str_Simplify[] = "Simplifier" ; +static unichar_t mnemonic_Simplify[] = 'S' ; +static char str_Build[] = "Assembler" ; +static unichar_t mnemonic_Build[] = 'u' ; +static char str_SimplifyMore[] = "Simplifer davantage..." ; +static char str_CleanupChar[] = "Nettoyer le glyphe" ; +static unichar_t mnemonic_CleanupChar[] = 'n' ; +static char str_AddExtrema[] = "Ajouter des extréma" ; +static unichar_t mnemonic_AddExtrema[] = 'x' ; +static char str_Align[] = "Aligner" ; +static unichar_t mnemonic_Align[] = 'l' ; +static char str_AveragePts[] = "Moyenne des points" ; +static unichar_t mnemonic_AveragePts[] = 'A' ; +static char str_SpacePts[] = "Espacer les points" ; +static unichar_t mnemonic_SpacePts[] = 'S' ; +static char str_SpaceRegions[] = "Espacer régions..." ; +static unichar_t mnemonic_SpaceRegions[] = 'R' ; +static char str_MakeParallel[] = "Rendre parallèle..." ; +static unichar_t mnemonic_MakeParallel[] = 'P' ; +static char str_Round2int[] = "Arrondi entier" ; +static unichar_t mnemonic_Round2int[] = 'I' ; +static char str_Effects = "Effets" ; +static char str_Inline = "En ligne" ; +static char mnemonic_Inline = 'I' ; +static char str_Shadow = "Ombrage" ; +static char mnemonic_Shadow = 'S' ; +static char str_Wireframe = "Fil de fer" ; +static char mnemonic_Wireframe = 'W' ; +static char str_Buildaccent[] = "Créer glyphes accentués" ; +static unichar_t mnemonic_Buildaccent[] = 'u' ; +static char str_Clockwise[] = "Dans le sens de la montre" ; +static unichar_t mnemonic_Clockwise[] = 'o' ; +static char str_Buildcomposit[] = "Construire un glyphe composite" ; +static unichar_t mnemonic_Buildcomposit[] = 'u' ; +static char str_Cclockwise[] = "Contraire au sens de la montre" ; +static unichar_t mnemonic_Cclockwise[] = 'n' ; +static char str_Correct[] = "Corriger direction" ; +static unichar_t mnemonic_Correct[] = 'C' ; +static char str_Corner[] = "Convertir en point(s) angulaire(s)" ; +static unichar_t mnemonic_Corner[] = 'A' ; +static char str_Curve[] = "Convertir en point(s) curviligne(s)" ; +static unichar_t mnemonic_Curve[] = 'C' ; +static char str_Tangent[] = "Convertir en point(s) tangent(s)" ; +static unichar_t mnemonic_Tangent[] = 'T' ; +static char str_Autohint[] = "Génération automatique de hints" ; +static unichar_t mnemonic_Autohint[] = 'H' ; +static char str_FullAutohint[] = "Génération automatique de hints" ; +static unichar_t mnemonic_FullAutohint[] = 'H' ; +static char str_AutoInstr[] = "Génération automatique d'instructions" ; +static unichar_t mnemonic_AutoInstr[] = 'I' ; +static char str_EditInstructions[] = "Éditer les instructions..." ; +static unichar_t mnemonic_EditInstructions[] = 'E' ; +static char str_DebugDDD = "Débogage..." ; +static char mnemonic_DebugDDD = 'D' ; +static char str_Editfpgm[] = "Éditer 'fpgm'..." ; +static char str_Editprep[] = "Éditer 'prep'..." ; +static char str_ClearHints[] = "Supprimer les hints" ; +static unichar_t mnemonic_ClearHints[] = 'C' ; +static char str_ClearInstructions[] = "Supprimer les instructions" ; +static char str_Clearhstem[] = "Supprimer les épaisseurs pert. hor." ; +static unichar_t mnemonic_Clearhstem[] = 'E' ; +static char str_Clearvstem[] = "Supprimer les épaisseurs pert. vert." ; +static unichar_t mnemonic_Clearvstem[] = 'V' ; +static char str_Cleardstem[] = "Supprimer les épaisseurs pert. diag." ; +static unichar_t mnemonic_Cleardstem[] = 'D' ; +static char str_Histograms = "Histogrammes" ; +static char str_Addhhint[] = "Ajouter un hint horizontal" ; +static unichar_t mnemonic_Addhhint[] = 'A' ; +static char str_Addvhint[] = "Ajouter un hint vertical" ; +static unichar_t mnemonic_Addvhint[] = 's' ; +static char str_Adddhint[] = "Ajouter un hint diagonal" ; +static unichar_t mnemonic_Adddhint[] = 't' ; +static char str_Createhhint[] = "Créer un hont horizontal" ; +static unichar_t mnemonic_Createhhint[] = 'r' ; +static char str_Createvhint[] = "Créer un hint vertical" ; +static unichar_t mnemonic_Createvhint[] = 'e' ; +static char str_Reviewhints[] = "Revoir les hints" ; +static unichar_t mnemonic_Reviewhints[] = 'R' ; +static char str_Export[] = "Exporter..." ; +static unichar_t mnemonic_Export[] = 't' ; +static char str_MinimumDistance[] = "Distance minimale" ; +static unichar_t mnemonic_MinimumDistance[] = 'M' ; +static char str_ClearAllMD[] = "Supprimer toutes les DM" ; +static unichar_t mnemonic_ClearAllMD[] = 'C' ; +static char str_ClearSelXMD[] = "Supprimer la DM hor. sélectionnée" ; +static unichar_t mnemonic_ClearSelXMD[] = 's' ; +static char str_ClearSelYMD[] = "Supprimer la DM vert. sélectionnée" ; +static unichar_t mnemonic_ClearSelYMD[] = 'e' ; +static char str_ClearWidthMD[] = "Supprimer les DM sur la chasse" ; +static unichar_t mnemonic_ClearWidthMD[] = 'W' ; +static char str_AddxMD[] = "Ajouter DM horizontale" ; +static unichar_t mnemonic_AddxMD[] = 'X' ; +static char str_AddMD2Width[] = "Ajouter DM d'ici à la chasse" ; +static unichar_t mnemonic_AddMD2Width[] = 'W' ; +static char str_AddyMD[] = "Ajouter DM verticale" ; +static unichar_t mnemonic_AddyMD[] = 'y' ; +static char str_RoundX[] = "Arrondir horizontalement" ; +static unichar_t mnemonic_RoundX[] = 'R' ; +static char str_NoRoundX[] = "Ne pas arrondir horizontalement" ; +static unichar_t mnemonic_NoRoundX[] = 'N' ; +static char str_RoundY[] = "Arrondir verticalement" ; +static unichar_t mnemonic_RoundY[] = 'u' ; +static char str_NoRoundY[] = "Ne pas arrondir verticalement" ; +static unichar_t mnemonic_NoRoundY[] = 'o' ; +static char str_Palettes[] = "Palettes" ; +static unichar_t mnemonic_Palettes[] = 'P' ; +static char str_Tools[] = "Outils" ; +static unichar_t mnemonic_Tools[] = 'O' ; +static char str_Layers[] = "Couches" ; +static unichar_t mnemonic_Layers[] = 'C' ; +static char str_Center[] = "Centrer en largeur" ; +static unichar_t mnemonic_Center[] = 'C' ; +static char str_DockedPalettes[] = "Palettes vérouillées" ; +static unichar_t mnemonic_DockedPalettes[] = 'D' ; +static char str_Shades[] = "Ombrage" ; +static unichar_t mnemonic_Shades[] = 'O' ; +static char str_Thirds[] = "Centrer 1/3 avant, 2/3 après" ; +static unichar_t mnemonic_Thirds[] = 't' ; +static char str_Setwidth[] = "Définir chasse..." ; +static unichar_t mnemonic_Setwidth[] = 'L' ; +static char str_Setlbearing[] = "Définir approche gauche..." ; +static unichar_t mnemonic_Setlbearing[] = 'B' ; +static char str_SetVWidth[] = "Définir chasse verticale..." ; +static unichar_t mnemonic_SetVWidth[] = 'V' ; +static char str_Setrbearing[] = "Définir approche droite..." ; +static unichar_t mnemonic_Setrbearing[] = 'R' ; +static char str_Removekern[] = "Supprimer paires de crénage" ; +static unichar_t mnemonic_Removekern[] = 'v' ; +static char str_Mergekern[] = "Fusionner infos de crénage..." ; +static unichar_t mnemonic_Mergekern[] = 'M' ; +static char str_RemoveVKern[] = "Supprimer crénage vertical" ; +static char str_24[] = "Contour de 24 pixels" ; +static unichar_t mnemonic_24[] = '2' ; +static char str_36[] = "Contour de 36 pixels" ; +static unichar_t mnemonic_36[] = '3' ; +static char str_48[] = "Contour de 48 pixels" ; +static unichar_t mnemonic_48[] = '4' ; +static char str_Antialias[] = "Niveaux de gris" ; +static unichar_t mnemonic_Antialias[] = 'A' ; +static char str_FitToEm[] = "Ajuster au cadratin" ; +static unichar_t mnemonic_FitToEm[] = 'F' ; +static char str_72[] = "Contour de 72 pixels" ; +static unichar_t mnemonic_72[] = '7' ; +static char str_96[] = "Contour de 96 pixels" ; +static unichar_t mnemonic_96[] = '9' ; +static char str_Charinfo[] = "Infos glyphe..." ; +static unichar_t mnemonic_Charinfo[] = 'I' ; +static char str_CharInfoFor[] = "Infos glyphe de %.40hs" ; +static char str_TypoFeatures = "Propriétés typo avancées" ; +static char mnemonic_TypoFeatures = 'T' ; +static char str_CopyFeatureToFont = "Copier fonctionnalités dans fonte..." ; +static char mnemonic_CopyFeatureToFont = 'C' ; +static char str_DefaultATT = "ATT par défaut" ; +static char mnemonic_DefaultATT = 'D' ; +static char str_RemoveAllFeatures = "Supprimer toutes les fonctionnalités" ; +static char mnemonic_RemoveAllFeatures = 'R' ; +static char str_RemoveUnusedNested = "Supprimer imbrications inutilisées" ; +static char mnemonic_RemoveUnusedNested = 'I' ; +static char str_RemoveFeature = "Supprimer fonctionnalités..." ; +static char mnemonic_RemoveFeature = 'F' ; +static char str_RetagFeature = "Modifier le tag de la fonctionnalité..." ; +static char mnemonic_RetagFeature = 'T' ; +static char str_DefaultATT = "Tables avancées par défaut" ; +static char str_Mergefonts[] = "Fusionner fontes..." ; +static unichar_t mnemonic_Mergefonts[] = 'M' ; +static char str_Interp[] = "Interpoler fontes..." ; +static unichar_t mnemonic_Interp[] = 'I' ; +static char str_Copyfrom[] = "Copier de" ; +static unichar_t mnemonic_Copyfrom[] = 'F' ; +static char str_Allfonts[] = "Toutes les fontes" ; +static unichar_t mnemonic_Allfonts[] = 'A' ; +static char str_Displayedfont[] = "Fonte courante" ; +static unichar_t mnemonic_Displayedfont[] = 'V' ; +static char str_Autokern[] = "Crénage auto..." ; +static unichar_t mnemonic_Autokern[] = 'K' ; +static char str_KernByClasses[] = "Crénage par classes..." ; +static unichar_t mnemonic_KernByClasses[] = 'n' ; +static char str_VKernByClasses[] = "Crénage vertical par classes..." ; +static char str_CharName[] = "Nom du glyphe" ; +static unichar_t mnemonic_CharName[] = 'N' ; +static char str_Autowidth[] = "Chasse automatique..." ; +static unichar_t mnemonic_Autowidth[] = 'A' ; +static char str_Removeallkern[] = "Supprimer paires de crénage" ; +static unichar_t mnemonic_Removeallkern[] = 'E' ; +static char str_RemoveAllVKern[] = "Supprimer paires de crénage vertical" ; +static char str_VKernFromHKern = "Crénage vert. à partir du crénage hor." ; +static char str_Outline[] = "Contour" ; +static char str_OutlineMn[] = "Contour" ; +static unichar_t mnemonic_OutlineMn[] = 'O' ; +static char str_Vertical = "Vertical" ; +static unichar_t mnemonic_Vertical = 'V' ; +static char str_Showgrid[] = "Montrer grille" ; +static unichar_t mnemonic_Showgrid[] = 'G' ; +static char str_Hidegrid[] = "Masquer grille" ; +static unichar_t mnemonic_Hidegrid[] = 'G' ; +static char str_Bigger[] = "Plus grand" ; +static unichar_t mnemonic_Bigger[] = 'g' ; +static char str_Smaller[] = "Plus petit" ; +static unichar_t mnemonic_Smaller[] = 'p' ; + +static char str_Fliph[] = "Symétrie horizontale" ; +static unichar_t mnemonic_Fliph[] = 'H' ; +static char str_Flipv[] = "Symétrie verticale" ; +static unichar_t mnemonic_Flipv[] = 'V' ; +static char str_Rotate90cw[] = "Rotation 90° horaire" ; +static unichar_t mnemonic_Rotate90cw[] = 'R' ; +static char str_Rotate90ccw[] = "Rotation 90° anti-horaire" ; +static unichar_t mnemonic_Rotate90ccw[] = '9' ; +static char str_Rotate180[] = "Rotation 180°" ; +static unichar_t mnemonic_Rotate180[] = '1' ; +static char str_Skew[] = "Incliner..." ; +static unichar_t mnemonic_Skew[] = 'I' ; +static char str_MakeFirst = "En faire le premier point" ; +static char mnemonic_MakeFirst = 'k' ; +static char str_AddAnchor = "Ajouter ancre" ; +static char mnemonic_AddAnchor = 'A' ; +static char *str_CID = "CID" ; +static char mnemonic_CID = 'C' ; +static char *str_Convert2CID = "Conversion vers CID" ; +static char mnemonic_Convert2CID = 'C' ; +static char *str_ConvertByCMap = "Conversion via un CMap" ; +static char mnemonic_ConvertByCMap = 'M' ; +static char *str_Flatten = "Aplatir" ; +static char mnemonic_Flatten = 'F' ; +static char *str_FlattenByCMap = "Aplatir via un CMap" ; +static char mnemonic_FlattenByCMap = 'a' ; +static char *str_InsertFont = "Insérer fonte..." ; +static char mnemonic_InsertFont = 'o' ; +static char *str_InsertBlank = "Insérer fonte vierge" ; +static char mnemonic_InsertBlank = 'B' ; +static char *str_RemoveFont = "Supprimer fonte" ; +static char mnemonic_RemoveFont = 'R' ; +static char *str_CIDFontInfo = "Infos fonte CID..." ; +static char mnemonic_CIDFontInfo = 'I' ; + + /* Font Info dlg */ +static char str_Custom[] = "Personnalisé" ; +static char str_Compacted[] = "Compacté" ; +static char str_Isolatin1[] = "ISO 8859-1 (latin-1)" ; +static char str_Isolatin0[] = "ISO 8859-15 (latin-0)" ; +static char str_Isolatin2[] = "ISO 8859-2 (latin-2)" ; +static char str_Isolatin3[] = "ISO 8859-3 (latin-3)" ; +static char str_Isolatin4[] = "ISO 8859-4 (latin-4)" ; +static char str_Isolatin5[] = "ISO 8859-9 (latin-5)" ; +static char str_Isolatin6[] = "ISO 8859-10 (latin-6)" ; +static char str_Isolatin7[] = "ISO 8859-13 (latin-7)" ; +static char str_Isolatin8[] = "ISO 8859-14 (latin-8)" ; +static char str_Isocyrillic[] = "ISO 8859-5 (cyrillique)" ; +static char str_Koi8cyrillic[] = "KOI8-R (cyrillique)" ; +static char str_Isoarabic[] = "ISO 8859-6 (arabe)" ; +static char str_Isogreek[] = "ISO 8859-7 (grec)" ; +static char str_Isohebrew[] = "ISO 8859-8 (hébraïque)" ; +static char str_Isothai[] = "ISO 8859-11 (thaï)" ; +static char str_MacLatin[] = "MacRoman" ; +static char str_Win[] = "Windows Latin (\042ANSI\042)" ; +static char str_Adobestd[] = "Adobe Standard" ; +static char str_Symbol[] = "Symbol" ; +static unichar_t str_Texbase[] = { 0x3a4, 0x3b5, 0x3a7, ' de base (8r)', '\0' } ; +static char str_Unicode[] = "ISO 10646-1 (Unicode, BMP)" ; +static char str_Unicode4[] = "ISO 10646-1 (Unicode, tous les plans)" ; +static char str_UnicodePlanes[] = "ISO 10646- ? (par plan) ..." ; +static char str_Jis208[] = "JIS 208 (kanji)" ; +static char str_Jis212[] = "JIS 212 (kanji)" ; +static char str_SJIS[] = "SJIS (kanji)" ; +static char str_Korean[] = "KSC 5601-1987 (coréen)" ; +static char str_KoreanJohab[] = "Johab (coréen)" ; +static char str_KoreanWansung[] = "Wansung (coréen)" ; +static char str_Chinese[] = "GB 2312 (chinois simplifié)" ; +static char str_ChinesePacked = "Compact GB 2312 (chinois simplifié)" ; +static char str_ChineseTrad[] = "Big5 (chinois traditionnel)" ; +static char str_ChineseTradHKSCS[] = "Big5 HKSCS (chinois traditionnel)" ; +static char str_Reducing[] = "Vous réduisez le nombre de glyphes au-deçà du nombre actuel\012. Cela fera disparaître des glyphes.\012Est-ce vraiment ce que vous souhaitez ?" ; +static char str_Toofew[] = "Trop peu de glyphes" ; +static char str_LosingUndoes[] = "Perte des annulations" ; +static char str_ChangingOrderLosesUndoes[] = "Changer l'ordre des courbes dans la fonte perdra toutes les annulations.\nContinuer malgré tout ?" ; +static char str_Badfamilyn[] = "Nom de famille incorrect, il doit commencer par un caractère alphabétique" ; +static char str_Badfamily[] = "Nom de famille incorrect" ; +static char str_Badascentdescentn[] = "'Ascent' et 'Descent' doivent être positifs et leur somme ne doit pas dépasser 16384" ; +static char str_Badascentdescent[] = "Ascent/Descent incorrect" ; +static char str_Fontinformation[] = "Infos fonte pour %.90hs" ; +static char str_WhichPlane[] = "Plan Unicode :" ; +static char str_Familyname[] = "Nom de famille :" ; +static unichar_t mnemonic_Familyname[] = 'F' ; +static char str_Fontname[] = "Nom de fonte :" ; +static unichar_t mnemonic_Fontname[] = 'N' ; +static char str_Humanname[] = "Nom lisible par un humain :" ; +static unichar_t mnemonic_Humanname[] = 's' ; +static char str_Encoding[] = "Codage :" ; +static unichar_t mnemonic_Encoding[] = 'E' ; +static char str_Load[] = "Charger" ; +static unichar_t mnemonic_Load[] = 'L' ; +static char str_Makefromfont[] = "Faire à partir de" ; +static unichar_t mnemonic_Makefromfont[] = 'k' ; +static char str_Remove[] = "Ôter" ; +static unichar_t mnemonic_Remove[] = 'M' ; +static char str_ForceEncoding[] = "Forcer le codage" ; +static unichar_t mnemonic_ForceEncoding[] = 'F' ; +static char str_ForceEncodingPopup[] = "Normalement, changer le codage déplace les glyphes de leur position courante\nvers la position adéquate dans le nouveau codage.\nEn cochant cette case, FontForge considérera que les glyphes sont déjà à la bonne position,\nmais ont de mauvais noms. FontForge renommera tout, conformément au nouveau codage." ; +static char str_Italicangle[] = "Pente des italiques :" ; +static unichar_t mnemonic_Italicangle[] = 'I' ; +static char str_Upos[] = "Profondeur du souligné :" ; +static unichar_t mnemonic_Upos[] = 'P' ; +static char str_Uheight[] = "Épaisseur :" ; +static unichar_t mnemonic_Uheight[] = 'H' ; +static char str_Ascent[] = "Ascendantes :" ; +static unichar_t mnemonic_Ascent[] = 'A' ; +static char str_Descent[] = "Descendantes :" ; +static char str_EmSize[] = "Cadratin :" ; +static unichar_t mnemonic_EmSize[] = 'E' ; +static char str_ScaleOutlines[] = "Mise à l'échelle de contour " ; +static unichar_t mnemonic_ScaleOutlines[] = 'S' ; +static unichar_t mnemonic_Descent[] = 'D' ; +static char str_Copyright[] = "Copyright :" ; +static unichar_t mnemonic_Copyright[] = 'r' ; +static char str_Xuid[] = "Identifiant XUID :" ; +static unichar_t mnemonic_Xuid[] = 'X' ; +static char str_Numchars[] = "Nombre de glyphes :" ; +static unichar_t mnemonic_Numchars[] = 'N' ; +static char str_CIDRegistry[] = "Collection de glyphes CID :" ; +static char str_Guess[] = "Déviner " ; +static unichar_t mnemonic_Guess[] = 'G' ; +static char str_Hist[] = "Histogramme" ; +static unichar_t mnemonic_Hist[] = 'H' ; +static char str_HistPopup[] = "Fenêtre d'histogramme" ; +static char *str_FamilyNameRequired = "Un nom de famille est nécessaire" ; +static char *str_PSNameNotNumber = "Le nom PostScript ne peut être un nombre" ; +static char *str_BadFamilyName = "Nom de famille de fonte incorrect" ; +static char *str_BadFontName = "Nom de fonte incorrect" ; +static char *str_NameTooLong = "Nom trop long, pas plus de 63 caractères" ; +static char *str_BadModifierName = "Nom de modificateur de fonte incorrect" ; +static char *str_BadPSName = "Un nom PostScript doit être écrit en ASCII\net ne doit contenir ni (){}[]<>%%/ ni espace" ; +static char *str_Names = "Noms" ; +static char *str_Encoding2 = "Codage" ; +static char *str_PSGeneral = "Général" ; +static char *str_PSPrivate = "Dictionnaire PS privé" ; +static char *str_TTFNames = "Noms TTF" ; +static char *str_TTFValues = "Paramètres TTF" ; +static char *str_Panose = "Panose-1" ; +static char *str_Comment = "Commentaire" ; +static char *str_InvalidEncoding = "Codage incorrect" ; +static char *str_UniqueIDC = "Identifiant UniqueID :" ; +static char mnemonic_UniqueIDC = 'U' ; +static char *str_VersionC = "Version :" ; +static char mnemonic_VersionC = 'V' ; +static char *str_HasVerticalMetrics = "Possède des métriques verticales" ; +static char mnemonic_HasVerticalMetrics = 'V' ; +static char *str_VOrigin = "Origine verticale :" ; +static char mnemonic_VOrigin = 'O' ; +static char *str_Order2Splines = "Courbes quadratiques" ; +static char mnemonic_Order2Splines = 'Q' ; +static char *str_PopupOrder2Splines = "Utiliser des courbes quadratiques (TrueType) pour définir les contours de cette fonte\nplutôt que des courbes cubiques (PostScript). Utiliser cette option pour éditer des fontes\nTrueType. Désactiver cette option pour éditer une fonte OpenType/CFF\nou PostScript. FontForge fera automatiquement les conversions au moment de générer\nles fontes, l'utilisation de cette option est donc facultative." +static char str_UniqueIDTitle = "Changer UniqueID ?" +static char str_UniqueIDChange = "Vous avez changé le nom de cette fonte sans changer son identifiant UniqueID (ou XUID).\nCe n'est probablement pas une bonne idée. Souhaitez-vous que je génère\nune nouvelle valeur aléatoire ?" ; +static char str_Change = "Changer" ; +static char mnemonic_Change = 'h' ; +static char str_ChangeAll = "Tout changer" ; +static char mnemonic_ChangeAll = 'A' ; +static char str_RetainAll = "Tout conserver" ; +static char mnemonic_RetainAll = 'l' ; +static char str_Retain = "Conserver" ; +static char mnemonic_Retain = 'R' ; +static char *str_Mismatch = "Mélange" ; +static char *str_MismatchLong = "Vous avez changé une version de %s mais pas celle des noms TTF. Voulez-vous refléter le changement dans le nom TTF ?" ; +static char *str_Rename = "Renommer..." ; +static char *mnemonic_Rename = 'R' ; +static char *str_NewDDD = "Créer..." ; +static char *mnemonic_NewDDD = 'N' ; +static char *str_EditDDD = "Éditer..." ; +static char *mnemonic_EditDDD = 'E' ; +static char *str_ShowFirstMark = "Voir première marque" ; +static char *str_ShowNextMark = "Marque suivante" ; +static char *str_ShowFirstBase = "Voir première base" ; +static char *str_ShowNextBase = "Base suivante" ; +static char *str_NoMore = "Pas d'autre" ; +static char *str_NoMoreMarks = "Il n'y a plus de marque associée à cette classe d'ancre" ; +static char *str_NoMoreBases = "Il n'y a plus de glyphe de base associé à cette classe d'ancre" ; +static char *str_NoMarks = "Il n'y a pas de marque associée à cette classe d'ancre" ; +static char *str_NoBases = "Il n'y a pas de glyphe de base associé à cette classe d'ancre" ; +static char *str_NewAnchorClass = "Nouvelle classe d'ancre" ; +static char *str_EditAnchorClass = "Éditer la classe d'ancre" ; +static char *str_DupAnchorClass = "Le nom %s est déjà utilisé.\nSi vous poursuivez ainsi, les 2 classes d'ancre\nseront fusionnées quand vous cliquerez sur OK." ; +static char *str_DupAnchorClassNotTag = "Le nom %s est déjà utilisé pour un tag différent." ; +static char *str_Continue = "Continuer" ; +static char *mnemonic_Continue = 'o' ; +static char *str_AnchorClass = "Classes d'ancre" ; +static char *str_AnchorClassName = "Nom de la classe d'ancre :" ; +static char str_FeatureTagTooLong = "Les noms de tag de fonctionnalité sont limités à 4 caractères ASCII" ; +static char str_MissingTag = "Tag de fonctionnalité manquant" ; +static char str_TagReuse = "Tag utilisé" ; +static char str_TagReuseLong = "Vous ne pouvez pas utiliser un tag qui existe déjà dans une fonctionnalité imbriquée" +static char str_OnlyOne = "Un seul" ; +static char str_OnlyOneCurs = "Il ne peut y avoir qu'une classe d'ancre marquée avec 'curs'" ; +static char str_CantChange = "Changement impossible" +static char str_CantChangeCurs = "Vous ne pouvez pas changer la marque d'une classe d'ancre liée à 'curs'" ; +static char str_Contextual = "Contexte" ; +static char str_ContextPos = "Dépl. contextuel" ; +static char str_ContextSub = "Subst. contextuelle" ; +static char str_ChainPos = "Dépl. cont. étendu" ; +static char str_ChainSub = "Subst. cont. étendue" ; +static char str_ReverseChainSub = "Subst. cont. ét. à contresens" ; +static char str_EditDataDDD = "Éditer données..." ; +static char str_NewContextPos = "Nouveau dépl. cont." ; +static char str_NewContextSub = "Nouvelle subst. cont." ; +static char str_NewChainPos = "Nouveau dépl. étendu" ; +static char str_NewChainSub = "Nouvelle subst. étendue" ; +static char str_NewReverseChainSub = "Nouvelle subst. ét. à contr." ; +static char str_EditContextPos = "Éditer dépl. contextuel" ; +static char str_EditContextSub = "Éditer subst. contextuelle" ; +static char str_EditChainPos = "Éditer dépl. étendu" ; +static char str_EditChainSub = "Éditer subst. étendue" ; +static char str_EditReverseChainSub = "Éditer subst. ét. à contresens" ; +static char str_MacFeatures = "Fonctionnalités AAT" ; +static char str_Order = "Ordre" ; +static char str_MacStateMachine = "Automates finis" ; +static char str_Indic = "Changement d'ordre" ; +static char str_ContextIns = "Insertion" ; +static char str_NewIndic = "Nouveau changement d'ordre" ; +static char str_EditIndic = "Éditer changement d'ordre" ; +static char str_NewInsert = "Nouvelle insertion" ; +static char str_EditInsert = "Éditer insertion" ; + /* Names of otf tags for GPOS features for anchor */ +static char *str_abvm = "Forme supérieure de diacritique" ; +static char *str_blwm = "Forme inférieure de diacritique" ; +static char *str_markT = "Placement de signe diacritique" ; +static char *str_mkmk = "Placement de signe sur signe" ; +static char *str_curs = "Attachement cursif" ; +static char *str_RQD = "Fonctionnalité obligatoire" ; + + /* Private info */ +static char *str_PrivateKey = "Clé privée" ; +static char *str_KeyInPrivate = "Clé (du dictionnaire privé)" ; +static char *str_Add = "Ajouter" ; +static char mnemonic_Add = 'A' ; + /* TTF Values */ +static char *str_UltraCondensed = "Ultra-condensée (50%)" +static char *str_ExtraCondensed = "Extra-condensée (62.5%)" +static char *str_Condensed75 = "Condensée (75%)" +static char *str_SemiCondensed = "Semi-condensée (87.5%)" +static char *str_Medium100 = "Moyenne (100%)" +static char *str_SemiExpanded = "Semi-étendue (112.5%)" +static char *str_Expanded125 = "Élargie (125%)" +static char *str_ExtraExpanded = "Extra-élargie (150%)" +static char *str_UltraExpanded = "Ultra-élargie (200%)" +static char *str_Thin100 = "100 Fine" ; +static char *str_ExtraLight200 = "200 Extra-maigre" ; +static char *str_Light300 = "300 Maigre" ; +static char *str_Book400 = "400 Livre" ; +static char *str_Medium500 = "500 Moyenne" ; +static char *str_DemiBold600 = "600 Demi-grasse" ; +static char *str_Bold700 = "700 Grasse" ; +static char *str_Heavy800 = "800 Extra-grasse" ; +static char *str_Black900 = "900 Noire" ; +static char *str_EmbeddablePopup = "Cette fonte peut-elle être incluse dans un document (pdf) ?\nSi oui, qu'est-il permis quant au document et quant à la fonte ?" ; +static char *str_Embeddable = "Peut être incluse" ; +static char mnemonic_Embeddable = 'E' ; +static char *str_LineGapPopup = "Définit l'interligne à la fois dans les tables 'OS/2' et 'hhea'" ; +static char *str_LineGap = "Interligne :" ; +static char mnemonic_LineGap = 'L' ; +static char *str_VLineGapPopup = "Définit l'interligne dans la table 'vhea'.\nCela définit l'espace entre 2 colonnes de texte composé verticalement." ; +static char *str_VLineGap = "Intercolonnage :" ; +static char mnemonic_VLineGap = 'R' ; +static char *str_SetGSUBOrder = "Ordre des fonctionnalités GSUB/morx" ; +static char mnemonic_SetGSUBOrder = 'S' ; +static char *str_Top = "Au sommet" ; +static char mnemonic_Top = 's' ; +static char *str_Bottom= "Au fond" ; +static char mnemonic_Bottom= 'f' ; +static char *str_Up = "Plus haut" ; +static char mnemonic_Up = 'h' ; +static char *str_Down= "Plus bas" ; +static char mnemonic_Down= 'b' ; +static char *str_NeverEmbeddable = "Ni inclusion, ni édition" ; +static char *str_OnlyPrint = "Document imprimable" ; +static char *str_EditableDoc = "Document éditable" ; +static char *str_Installable = "Fonte installable" ; +static char *str_NoSubsetting = "Pas de fonte partielle" ; +static char *str_NoSubsettingPopup = "Si coché, la totalité de la fonte doit être incluse\ndans un document si l'un de ses glyphes est utilisé.\nSinon, l'inclusion peut se limiter au sous-ensemble utilisé." ; +static char *str_OnlyBitmaps = "Les bitmaps seuls" ; +static char *str_OnlyBitmapsPopup = "Les bitmaps seuls peuvent être inclus.\nLes contours vectoriels ne peuvent pas l'être.\n(Si la fonte ne contient pas de bitmap, rien ne peut être inclus)." ; +static char *str_Serif = "Avec empattements" ; +static char *str_SansSerif = "Sans empattements" ; +static char *str_Monospace = "Monochasse" ; +static char *str_Script = "Scripte" ; +static char *str_Decorative = "Décorative" ; +static char *str_Any = "Toutes" ; +static char *str_NoFit = "Aucune" ; +static char *str_TextDisplay = "Texte & titrage" ; +static char *str_Pictoral = "Pictoral" ; /* VVV */ +static char *str_Cove = "Cove" ; +static char *str_ObtuseCove = "Obtuse Cove" ; +static char *str_SquareCove = "Square Cove" ; +static char *str_ObtuseSquareCove = "Obtuse Square Cove" ; +static char *str_Square = "Square" ; +static char *str_Thin = "Thin" ; +static char *str_Bone = "Bone" ; +static char *str_Exaggerated = "Exaggerated" ; +static char *str_Triangle = "Triangle" ; +static char *str_NormalSans = "Normal Sans" ; +static char *str_ObtuseSans = "Obtuse Sans" ; +static char *str_PerpSans = "Perp Sans" ; +static char *str_Flared = "Flared" ; +static char *str_Rounded = "Rounded" ; +static char *str_VeryLight = "Very Light" ; +static char *str_Light = "Light" ; +static char *str_Book = "Book" ; +static char *str_Medium = "Medium" ; +static char *str_Demi = "Demi" ; +static char *str_Bold = "Bold" ; +static char *str_Heavy = "Heavy" ; +static char *str_Black = "Black" ; +static char *str_Nord = "Nord" ; +static char *str_OldStyle = "Old Style" ; +static char *str_Modern = "Modern" ; +static char *str_EvenWidth = "Even Width" ; +static char *str_Expanded = "Expanded" ; +static char *str_Condensed = "Condensed" ; +static char *str_VeryExpanded = "Very Expanded" ; +static char *str_VeryCondensed = "Very Condensed" ; +static char *str_Monospaced ="Monospaced" ; +static char *str_VeryLow ="Very Low" ; +static char *str_Low ="Low" ; +static char *str_MediumLow ="Medium Low" ; +static char *str_MediumHigh ="Medium High" ; +static char *str_High ="High" ; +static char *str_VeryHigh ="Very High" ; +static char *str_GradDiag ="Gradual/Diagonal" ; +static char *str_GradTrans ="Gradual/Transitional" ; +static char *str_GradVert ="Gradual/Vertical" ; +static char *str_GradHor ="Gradual/Horizontal" ; +static char *str_RapidVert ="Rapid/Vertical" ; +static char *str_RapidHor ="Rapid/Horizontal" ; +static char *str_InstantVert ="Instant/Vertical" ; +static char *str_NormalContact ="Normal/Contact" ; +static char *str_NormalWeighted ="Normal/Weighted" ; +static char *str_NormalBoxed ="Normal/Boxed" ; +static char *str_NormalFlattened ="Normal/Flattened" ; +static char *str_NormalRounded ="Normal/Rounded" ; +static char *str_NormalOffCenter ="Normal/Off-Center" ; +static char *str_NormalSquare ="Normal/Square" ; +static char *str_ObliqueContact ="Oblique/Contact" ; +static char *str_ObliqueWeighted ="Oblique/Weighted" ; +static char *str_ObliqueBoxed ="Oblique/Boxed" ; +static char *str_ObliqueFlattened ="Oblique/Flattened" ; +static char *str_ObliqueRounded ="Oblique/Rounded" ; +static char *str_ObliqueOffCenter ="Oblique/Off-Center" ; +static char *str_ObliqueSquare ="Oblique/Square" ; +static char *str_StraightArmsH = "Straight Arms/Horizontal" ; +static char *str_StraightArmsW = "Straight Arms/Wedge" ; +static char *str_StraightArmsV = "Straight Arms/Vertical" ; +static char *str_StraightArmsSS = "Straight Arms/Single Serif" ; +static char *str_StraightArmsDS = "Straight Arms/Double Serif" ; +static char *str_NStraightArmsH = "Non-Straight Arms/Horizontal" ; +static char *str_NStraightArmsW = "Non-Straight Arms/Wedge" ; +static char *str_NStraightArmsV = "Non-Straight Arms/Vertical" ; +static char *str_NStraightArmsSS = "Non-Straight Arms/Single Serif" ; +static char *str_NStraightArmsDS = "Non-Straight Arms/Double Serif" ; +static char *str_StandardTrimmed = "Standard/Trimmed" ; +static char *str_StandardPointed = "Standard/Pointed" ; +static char *str_StandardSerifed = "Standard/Serifed" ; +static char *str_HighTrimmed = "High/Trimmed" ; +static char *str_HighPointed = "High/Pointed" ; +static char *str_HighSerifed = "High/Serifed" ; +static char *str_ConstantTrimmed = "Constant/Trimmed" ; +static char *str_ConstantPointed = "Constant/Pointed" ; +static char *str_ConstantSerifed = "Constant/Serifed" ; +static char *str_LowTrimmed = "Low/Trimmed" ; +static char *str_LowPointed = "Low/Pointed" ; +static char *str_LowSerifed = "Low/Serifed" ; +static char *str_ConstantSmall = "Constant/Small" ; +static char *str_ConstantStandard = "Constant/Standard" ; +static char *str_ConstantLarge = "Constant/Large" ; +static char *str_DuckingSmall = "Ducking/Small" ; +static char *str_DuckingStandard = "Ducking/Standard" ; +static char *str_DuckingLarge = "Ducking/Large" ; /* AAA */ +static char *str_WidthClass ="Classe de chasse" ; +static char mnemonic_WidthClass ='C' ; +static char *str_WeightClass ="Classe de graisse" ; +static char mnemonic_WeightClass ='g' ; +static char *str_PFMFamily ="Famille PFM" ; +static char mnemonic_PFMFamily ='F' ; +static char *str_Family ="Famille" ; +static char mnemonic_Family ='F' ; +static char *str_Serifs ="Empattements" ; +static char mnemonic_Serifs ='S' ; +static char *str_Weight ="Graisse" ; +static char mnemonic_Weight ='W' ; +static char *str_Proportion ="Proportion" ; +static char mnemonic_Proportion ='P' ; +static char *str_Contrast ="Contraste" ; +static char mnemonic_Contrast ='C' ; +static char *str_StrokeVar ="Variation de trait" ; +static char mnemonic_StrokeVar ='V' ; +static char *str_ArmStyle ="Arm Style" ; /* VVV */ +static char mnemonic_ArmStyle ='A' ; +static char *str_Letterform ="Letterform" ; +static char mnemonic_Letterform ='L' ; +static char *str_MidLine ="Midline" ; /* AAA */ +static char mnemonic_MidLine ='M' ; +static char *str_XHeight ="Hauteur des bas-de-casse" ; +static char mnemonic_XHeight ='b' ; + /* TTF Names */ +static char *str_Styles = "Styles ('SubFamily')" ; +static char *str_UniqueID = "Identifiant UniqueID" ; +static char *str_Version = "Version" ; +static char mnemonic_Version = 'V' ; +static char *str_Fullname = "Nom complet" ; +static char *str_Trademark = "Marque commerciale" ; +static char *str_Manufacturer = "Fabriquant" ; +static char *str_Designer = "Dessinateur" ; +static char *str_Descriptor = "Descripteur" ; +static char *str_VenderURL = "URL du vendeur" ; +static char *str_DesignerURL = "URL du dessinateur" ; +static char *str_License = "Licence" ; +static char *str_LicenseURL = "URL de la licence" ; +static char *str_OTFFamily = "Famille OTF préférée" ; +static char *str_OTFStyles = "Styles OTF préférés" ; +static char *str_CompatableFull = "Compatibilité totale" ; +static char *str_SampleText = "Échantillon" ; +static char *str_TranslateStyle = "Traduire le style" ; + /* MS Language list */ + /* Language & Country (where applicable) in the native language if I can find */ + /* it, in english if I can't. Followed by the 2char language _ 2char country */ + /* (again country isn't always applicable. Should basque be ES, FR ? */ +static char *str_Afrikaans = "Afrikaans" ; +static char *str_Albanian = "Albanais sq_AL" ; +static char *str_Arabic = "Arabe d'Arabie saoudite" ; +static char *str_IraqArabic = "Arabe irakien" ; +static char *str_EgyptArabic = "Arabe égyptien" ; +static char *str_LibyaArabic = "Arabe libyen" ; +static char *str_AlgeriaArabic = "Arabe algérien" ; +static char *str_MoroccoArabic = "Arabe marocain" ; +static char *str_TunisiaArabic = "Arabe tunisien" ; +static char *str_OmanArabic = "Arabe omanais" ; +static char *str_YemenArabic = "Arabe yéménite" ; +static char *str_SyriaArabic = "Arabe syrien" ; +static char *str_JordanArabic = "Arabe jordanien" ; +static char *str_LebanonArabic = "Arabe libanais" ; +static char *str_KuwaitArabic = "Arabe koweïtien" ; +static char *str_UAEArabic = "Arabe des Émirats" ; +static char *str_BahrainArabic = "Arabe du Bahreïn" ; +static char *str_QatarArabic = "Arabe du Qatar" ; +static char *str_Armenian = "Arménien" ; +static char *str_Assamese = "Assamais" ; +static char *str_LatinAzeri = "Azéri (latin)" ; +static char *str_CyrillicAzeri = "Azéri (cyrillique)" ; +static char *str_Basque = "Basque eu" ; +static char *str_Byelorussian = "Biélorusse be_BY" ; +static char *str_Bengali = "Bengali" ; +static char *str_Bulgarian = "Bulgare bg_BG" ; +static char *str_Catalan = "Catalan ca" ; +static char *str_MSChinese = "Chinois de Taïwan" ; +static char *str_PRCChinese = "Chinois de RPC zh_CN" ; +static char *str_HKChinese = "Chinois de Hong-Kong zh_CN" ; +static char *str_SingChinese = "Chinois de Singapour" ; +static char *str_MacauChinese = "Chinois de Macao" ; +static char *str_Croatian = "Croate hr" ; +static char *str_Czech = "Tchèque cs_CZ" ; +static char *str_Danish = "Danois da_DK" ; +static char *str_Dutch = "Néerlandais nl_NL" ; +static char *str_Flemish = "Flamand nl_BE" ; +static char *str_BrEnglish = "Anglais britannique en_UK" ; +static char *str_AmEnglish = "Anglais américain en_US" ; +static char *str_CaEnglish = "Anglais canadien en_CA" ; +static char *str_AuEnglish = "Anglais australien en_AU" ; +static char *str_NZEnglish = "Anglais de Nouvelle-Zélande en_NZ" ; +static char *str_IEEnglish = "Anglais d'Irlande en_IE" ; +static char *str_SAEnglish = "Anglais d'Afrique du Sud" ; +static char *str_JamEnglish = "Anglais de Jamaïque" ; +static char *str_CarEnglish = "Anglais des Caraïbes" ; +static char *str_BelEnglish = "Anglais de Belizé" ; +static char *str_TrinEnglish = "Anglais de Trinidad" ; +static char *str_ZimEnglish = "Anglais du Zimbabwe" ; +static char *str_PhilEnglish = "Anglais des Philippines" ; +static char *str_Estonia = "Estonien et_EE" ; +static char *str_Finnish = "Finnois fi_FI" ; +static char *str_Farsi = "Persan" ; +static char *str_Faeroese = "Féroïen" ; +static char *str_FRFrench = "Français de France fr_FR" ; +static char *str_BEFrench = "Français belge fr_BE" ; +static char *str_CAFrench = "Français canadien fr_CA" ; +static char *str_CHFrench = "Français suisse fr_CH" ; +static char *str_LUFrench = "Français luxembourgeois fr_LU" ; +static char *str_MOFrench = "Français de Monaco" ; +static char *str_ITFrench = "Français italien fr_IT" ; +static char *str_Georgian = "Géorgien" ; +static char *str_DEGerman = "Allemand d'Allemagne de_DE" ; +static char *str_CHGerman = "Allemand suisse de_CH" ; +static char *str_ATGerman = "Allemand autrichien de_AT" ; +static char *str_LUGerman = "Allemand luxembourgeois de_LU" ; +static char *str_LIGerman = "Allemand du Lichtenstein de_LI" ; +static char *str_ITGerman = "Allemand italien de_IT" ; +static char *str_Greek = "Grec el_GR" ; +static char *str_Gujarati = "Goudjrati" ; +static char *str_Hebrew = "Hébreu he_IL" ; +static char *str_Hindi = "Hindi" ; +static char *str_Hungarian = "Hongrois hu_HU" ; +static char *str_Icelandic = "Islandais is_IS" ; +static char *str_Indonesian = "Indonésien" ; +static char *str_Italian = "Italien it_IT" ; +static char *str_CHItalian = "Italien suisse it_CH" ; +static char *str_Japanese = "Japonais jp_JP" ; +static char *str_Kannada = "Kannada" ; +static char *str_Kashmiri = "Kashmiri" ; +static char *str_Kazakh = "Kazakh" ; +static char *str_Konkani = "Konkani" ; +static char *str_LangKorean = "Coréen" ; +static char *str_LangKoreanJohab = "Coréen (johab)" ; +static char *str_Latvian = "Letton lv_LV" ; +static char *str_Lithuanian = "Lituanien lt_LT" ; +static char *str_ClassLithuanian = "Lituanien (classique)" ; +static char *str_Macedonian = "Macédonien" ; +static char *str_Malay = "Malais" ; +static char *str_BruMalay = "Malais de Bruneï" ; +static char *str_Nepali = "Népalais" ; +static char *str_IndNepali = "Népalais d'Inde" ; +static char *str_Norwegian = "Norvégien bokmål no_NO" ; +static char *str_NorwegianN = "Norvégien nynorsk no_NO" ; +static char *str_Oriya = "Oriya" ; +static char *str_Polish = "Polonais pl_PL" ; +static char *str_PTPortuguese = "Portugais portugais pt_PT" ; +static char *str_BRPortuguese = "Portugais brésilien pt_BR" ; +static char *str_Punjabi = "Pendjabi" ; +static char *str_RhaetoRomanic = "Rhéto-roman" ; +static char *str_Romanian = "Roumain ro_RO" ; +static char *str_MolRomanian = "Roumain de Moldavie" ; +static unichar_t str_Russian = { 0x420, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, ' ', 'r','u','_','R','U', '\0' } ; +static char *str_MolRussian = "Russe de Moldavie" ; +static char *str_Sami = "Sami" ; +static char *str_Sanskrit = "Sanskrit" ; +static char *str_Serbian = "Serbe (cyrillique)" ; +static char *str_LatSerbian = "Serbe (latin)" ; +static char *str_Sindhi = "Sindhi" ; +static char *str_Slovak = "Slovaque sk_SK" ; +static char *str_Slovenian = "Slovène sl_SI" ; +static char *str_Sorbian = "Sorabe" ; +static char *str_TradSpanish = "Espagnol traditionnel es_ES" ; +static char *str_MXSpanish = "Espagnol mexicain es_MX" ; +static char *str_ModSpanish = "Espagnol moderne es_ES" ; +static char *str_GuaSpanish = "Espagnol guatémalien es" ; +static char *str_CRSpanish = "Espagnol du Costa-Rica es" ; +static char *str_PanSpanish = "Espagnol panaméen es" ; +static char *str_DRSpanish = "Espagnol de République Dominicaine es" ; +static char *str_VenSpanish = "Espagnol vénézuélien es" ; +static char *str_ColSpanish = "Espagnol colombien es" ; +static char *str_PeruSpanish = "Espagnol pérouvien es" ; +static char *str_ArgSpanish = "Espagnol argentin es" ; +static char *str_EcuSpanish = "Espagnol d'Équateur es" ; +static char *str_ChiSpanish = "Espagnol chilien es" ; +static char *str_UruSpanish = "Espagnol d'Uruguay es" ; +static char *str_ParSpanish = "Espagnol de Paraguay es" ; +static char *str_BolSpanish = "Espagnol bolivien es" ; +static char *str_ESSpanish = "Espagnol d'El Salvador es" ; +static char *str_HonSpanish = "Espagnol d'Honduras es" ; +static char *str_NicSpanish = "Espagnol du Nicaragua es" ; +static char *str_PRSpanish = "Espagnol de Puerto-Rico es" ; +static char *str_Sutu = "Sutu" ; +static char *str_Swahili = "Swahili (Kenya)" ; +static char *str_Swedish = "Suédois sv_SE" ; +static char *str_FinSwedish = "Suédois de Finlande sv_FI" ; +static char *str_Tamil = "Tamoul" ; +static char *str_Tatar = "Tatar du Tatarstan" ; +static char *str_Telugu = "Télougou" ; +static char *str_LangThai = "Thaï" ; +static char *str_Tsonga = "Tsonga" ; +static char *str_Tswana = "Tswana" ; +static char *str_Turkish = "Turc tr_TR" ; +static char *str_Ukrainian = "Ukrainien uk_UA" ; +static char *str_Urdu = "Ourdou du Pakistan" ; +static char *str_IndUrdu = "Ourdou d'Inde" ; +static char *str_Uzbek = "Ouszbek (latin)" ; +static char *str_CyrUzbek = "Ouszbek (cyrillique)" ; +static char *str_Venda = "Venda" ; +static char *str_Vietnamese = "Viêtnamien" ; +static char *str_Xhosa = "Xhosa" ; +static char *str_Yiddish = "Yiddish" ; +static char *str_Zulu = "Zoulou" ; + /* TeX font params */ +static unichar_t str_TeX = { 0x3a4, 0x3b5, 0x3a7, 0 } ; +static unichar_t str_TeXText = { 0x3a4, 0x3b5, 0x3a7, ' ','T','e','x','t', 0 } ; +static unichar_t str_TeXMath = { 0x3a4, 0x3b5, 0x3a7, ' ','M','a','t','h', 0 } ; +static unichar_t str_TeXMathExt = { 0x3a4, 0x3b5, 0x3a7, ' ','M','a','t','h',' ','E','x','t', 0 } ; +static char *str_MoreParams = "Autres paramètres" ; +static char *str_DesignSize = "Corps optique :" ; +static char *str_DesignSizePopup = "Le corps (en points) pour lequel cette fonte a été dessinée" ; +static char *str_Slant = "Pente :" ; +static char *str_SlantPopup = "Dans une fonte italique, déplacement horizontal correspondant à un déplacement vertical de 1" +static char *str_Space = "Espace mots :" ; +static char *str_SpacePopup = "Espacement des mots lors de l'utilisation de cette fonte" +static char *str_Stretch = "Extension :" ; +static char *str_StretchPopup = "Étirement maximal de l'espace mots" +static char *str_Shrink = "Rétrécissement :" ; +static char *str_ShrinkPopup = "Contraction maximale de l'espace mots" +static char *str_XHeightC = "Hauteur des bas-de-casse :" ; +static char *str_XHeightCPopup = "Hauteur des bas-de-casse" +static char *str_Quad = "Cadratin :" ; +static char *str_QuadPopup = "Chasse d'un cadratin" +static char *str_ExtraSp = "Extension d'espace :" ; +static char *str_ExtraPopup = "Espace supplémentaire à ajouter après un point\nde fin d'une phrase en typographie anglo-saxonne" +static char *str_MathSp = "Espace mathématique :" ; /* VVV */ + /* TeX math font params */ +static char *str_Num1 = "Num1 :" +static char *str_Num1Popup = "Amount to raise baseline for numerators in display styles" ; +static char *str_Num2 = "Num2 :" +static char *str_Num2Popup = "Amount to raise baseline for numerators in non-display styles" ; +static char *str_Num3 = "Num3 :" +static char *str_Num3Popup = "Amount to raise baseline for numerators in non-display \atop styles" ; +static char *str_Denom1 = "Dénom1 :" +static char *str_Denom1Popup = "Amount to lower baseline for demoninators in display styles" ; +static char *str_Denom2 = "Dénom2 :" +static char *str_Denom2Popup = "Amount to lower baseline for demoninators in non-display styles" ; +static char *str_Sup1 = "Sup1 :" +static char *str_Sup1Popup = "Amount to raise baseline for superscripts in display styles" ; +static char *str_Sup2 = "Sup2 :" +static char *str_Sup2Popup = "Amount to raise baseline for superscripts in non-display styles" ; +static char *str_Sup3 = "Sup3 :" +static char *str_Sup3Popup = "Amount to raise baseline for superscripts in modified styles" ; +static char *str_Sub1 = "Sub1 :" +static char *str_Sub1Popup = "Amount to lower baseline for subscripts in display styles" ; +static char *str_Sub2 = "Sub2 :" +static char *str_Sub2Popup = "Amount to lower baseline for subscripts in non-display styles" ; +static char *str_SupDrop = "SupDrop :" +static char *str_SupDropPopup = "Amount to below top of large box to place baseline of superscripts" +static char *str_SubDrop = "SubDrop :" +static char *str_SubDropPopup = "Amount to below bottom of large box to place baseline of subscripts" +static char *str_Delim1 = "Délim1 :" +static char *str_Delim1Popup = "Size of \comb delimiters in display styles" ; +static char *str_Delim2 = "Délim2 :" +static char *str_Delim2Popup = "Size of \comb delimiters in non-display styles" ; +static char *str_AxisHt = "Hauteur d'axe :" +static char *str_AxisHtPopup = "Height of fraction bar above base line" ; + /* TeX math ext font params */ +static char *str_DefRuleThick = "Ép. trait par défaut :" +static char *str_DefRuleThickPopup = "Default thickness of \over and \overline bars" ; +static char *str_BigOpSpace1 = "Big Op Space1 :" +static char *str_BigOpSpace1Popup = "The minimum glue space above a large displayed operator" ; +static char *str_BigOpSpace2 = "Big Op Space2 :" +static char *str_BigOpSpace2Popup = "The minimum glue space below a large displayed operator" ; +static char *str_BigOpSpace3 = "Big Op Space3 :" +static char *str_BigOpSpace3Popup = "The minimum distance between a limit's baseline and a large displayed\noperator when the limit is above the operator" +static char *str_BigOpSpace4 = "Big Op Space4 :" +static char *str_BigOpSpace4Popup = "The minimum distance between a limit's baseline and a large displayed\noperator when the limit is below the operator" +static char *str_BigOpSpace5 = "Big Op Space5 :" +static char *str_BigOpSpace5Popup = "The extra glue place above and below displayed limits" ; + /* Generate fonts */ /* savefontdlg *//* AAA */ +static char str_Format[] = "Format :" ; +static char str_Savefailedtitle[] = "Échec de l'enregistrement" ; +static char str_Options = "Options" ; +static char str_OptionsPopup = "Pour optimiser les paramètres utilisés pour générer la fonte" ; +static char str_Outputafm[] = "Générer AFM" ; +static char str_Outputpfm[] = "Générer PFM" ; +static char str_Outputtfm[] = "Générer TFM & ENC" ; +static char *str_OutputAfmPopup = "Le fichier AFM contient les métriques de fonte PostScript\256,\nen particulier les paires de crénage." ; +static char *str_OutputPfmPopup = "Le fichier PFM contient les informations dont Windows\na besoin pour installer une fonte PostScript\256." ; +static char *str_OutputTfmPopup = "Les fichiers TFM et ENC contiennent les informations utilisées par TeX pour installer une fonte PostScript\256." ; +static char str_AppleMode[] = "Tables AAT (Apple)" ; +static char *str_AppleModePopup = "Apple et MS/Adobe divergent quand au format des fichiers TrueType et OpenType.\nCet item vous permet de choisir entre les deux parfums pour votre fonte." +static char str_OpenTypeMode[] = "Tables OpenType" ; +static char *str_OpenTypeModePopup = "Apple et MS/Adobe divergent quand au format des fichiers TrueType et OpenType.\nIci vous choisissez quel le parfum de votre fonte.\nLes principales différences sont :\n spécifications contradictoires pour les noms PostScript dans la table 'name' ;\n bitmaps stockés dans des tables différentes ;\n glyphes composites et mis à l'échelle traités différemment ;\n utilisation de 'GSUB' à la place de 'morx'/'feat' ;\n utilisation de 'GPOS' à la place de 'kern'/'opbd' ;\n utilisation de 'GDEF' à la place de 'lcar'/'prop'." +static char str_Nooutlinefont[] = "Aucune fonte de contour" ; +static char str_Nobitmapfonts[] = "Aucune fonte bitmap" ; +static char str_Afmfailedtitle[] = "Échec enregistrement de l'AFM" ; +static char str_Pfmfailedtitle[] = "Échec enregistrement du PFM" ; +static char str_Tfmfailedtitle[] = "Échec enregistrement du TFM" ; +static char *str_SavingFont = "Enregistrement de la fonte" ; +static char *str_SavingPSFont = "Enregistrement fonte PostScript" ; +static char *str_SavingMultiplePSFonts = "Enregistrement en plusieurs fontes PostScript" ; +static char *str_SavingTTFont = "Enregistrement fonte TrueType" ; +static char *str_SavingCIDFont = "Enregistrement fonte CID" ; +static char *str_SavingAFM = "Enregistrement du fichier AFM" ; +static char *str_SavingPFM = "Enregistrement du fichier PFM" ; +static char *str_SavingTFM = "Enregistrement du fichier TFM" ; +static char *str_SavingENC = "Enregistrement du fichier ENC" ; +static char *str_SavingBitmapFonts = "Enregistrement fonte(s) bitmap" ; +static char *str_NotCID = "Ceci n'est pas une CID" ; +static char *str_NotCIDOk = "Vous essayez d'enregistrer une fonte CID dans un format\nnon-CID. C'est possible, mais seule la sous-fonte courante\nsera enregistrée. Est-ce vraiment ce que vous souhaitez ?" ; +static char *str_PixelList = "Liste pixel" ; +static char *str_EncodingTooLarge="Codage trop grand" ; +static char *str_TwoBEncIn1BFont = "Votre fonte a un codage sur deux octets, mais vous essayez de l'enregistrer\ndans un format dont le codage est sur un octet. De ce fait vous ne pourrez\npas accèder aux glyphes supérieurs à 256 sans transcoder la fonte.\n\nVoulez vous le faire malgré tout ?" ; +static char *str_GreymapDepth = "Bits par pixel en niveaux de gris" +static char *str_BDFResolution = "Résolution BDF" +static char *str_Other_ = "Autres" ; +static char *mnemonic_Other_ = "A" ; +static char *str_GuessResPopup = "Déviner la résolution de chaque fonte selon la taille des pixels" ; +static char *str_FindMultipleMap = "Recherche du fichier de définition des sous-fontes" ; +static char *str_NoSubFontDefinitionFile = "Pas de fichier de définition des sous-fontes" ; +static char *str_PSNames = "Noms de glyphe PostScript" ; +static char *str_PSNamesPopup = "Voulez vous que le fichier contienne les noms de tous les glyphes de la fonte ?" ; +static char *str_TTFHintsPopup = "Voulez vous enregistrer dans la fonte les instructions TrueType ?\nFontForge ne va pas en créer des nouvelles, mais il peut conserver l'existant." +static char *str_WrongSFDFile = "Type de fichier SFD incorrect" ; +static char *str_BadSFDFile = "Cela ressemble à un fichier FontForge\net non pas à un fichier TeX de sous-fonte.\nUne confusion d'extension regrettable." ; +static char *str_BadFamilyForMac = "Famille Mac incorrecte" ; +static char *str_BadMacFamily = "Pour obtenir un fichier de famille Macintosh, la fonte courante doit avoir un style du type 'Normal', 'Regular', etc. et il doit y avoir d'autres fontes ouvertes sous le même nom de famille." ; +static char *str_TwoFontsSameStyle = "Il y a 2 fontes ouvertes avec le même nom de famille et le même style. %.30hs et %.30hs" ; +static char *str_DifferentEncodings = "La fonte %1$.30hs a le codage de celui de %2$.30hs" ; +static char *str_NotdefName = "Nom de glyphe '.notdef'" ; +static char *str_NotdefChar = "Le glyphe en position %d s'appelle '.notdef' mais contient un contour. De par son nom \".notdef\" il ne sera pas inclus dans la fonte en cours de création. Vous pouvez le renommer en utilisant 'Élément->Infos glyphe'. Voulez vous continuer à créer la fonte (sans ce glyphe) ?" ; +static char *str_EmSizeBad = "Grille (unités par cadratin) non standard" ; +static char *str_PSEmSize1000 = "La convention veut que les fontes PostScript soient décrites sur une grille de 1000 unités par cadratin. Or cette fonte en a %d. Ce n'est pas incorrect, mais vous pourriez néanmoins modifier ce nombre par le biais de 'Élément->Infos fonte->PS Général'.\nVoulez vous continuer la génération de la fonte malgré cela ?" ; +static char *str_TTFEmSize2 = "La convention veut que les fontes TrueType aient une grille qui soit une puissance de 2. Or cette fonte en a une de %d unités par cadratin. Ce n'est pas incorrect, mais vous pourriez néanmoins modifier la taille du Em avec 'Élément->Infos fonte->PS Général'.\nVoulez vous continuer la génération de la fonte malgré cela ?" ; +static char *str_NotIntegral = "Non entier" ; +static char *str_TryRoundToInt = "Cette fonte contient au moins une coordonnée non entière.\nCeci est parfaitement autorisé, quoiqu'inhabituel.\nCependant cela augmente la taille de la fonte.\nVous pouvez utiliser 'Element->Arrondi entier' sur l'ensemble de la fonte." ; +static char *str_PostScript = "PostScript®" +static char *str_TrueType = "TrueType" +static char *str_PSHintsPopup = "Voulez vous que le fichier contienne des hints PostScript ?" +static char *str_HintSubs = "Remplacement de hint" ; +static char *str_FlexHints = "Hints flex" ; +static char *str_FlexHintsPopup = "Souhaitez-vous que le fichier contienne des hints de type flex ?" +static char *str_HintSubsPopup = "Souhaitez-vous que des remplacements de hint aient lieu dans la fonte ?" +static char *str_First256 = "Les 256 premiers" ; +static char *str_First256Popup = "Réduire la fonte afin que seuls les 256 premiers glyphes\nsoient inclus dans le fichier" ; +static char *str_PfaEditTable = "Table 'PfEd'" ; +static char *str_PfaEditTablePopup = "'PfEd' est une table TrueType\ncontenant diverses données utilisées par FontForge" +static char *str_PfEdComments = "Enregistrer les commentaires" ; +static char *str_PfEdCommentsPopup = "Enregistrer les commentaires des glyphes dans la table 'PfEd'" +static char *str_PfEdColors = "Enregistrer les couleurs" ; +static char *str_PfEdColorsPopup = "Enregistrer les couleurs des glyphes dans la table 'PfEd'" + /* Goto character ... */ +static char str_Badnumberin[] = "Numéro incorrect dans " ; +static char str_Enternameofchar[] = "Nom de glyphe dans la fonte" ; +static char str_Couldntfindchar[] = "Glyphe introuvable : %.70hs" ; +static char str_CouldntfindcharU[] = "Glyphe introuvable : %.70s" ; +static char str_CouldntfindcharT[] = "Glyphe introuvable" ; +static char str_CouldntFindSubstitution = "Glyphe de substitution introuvable : %.40hs" ; + /* Font has changed dlg */ +static char str_Dontsave[] = "Ne pas enregistrer" ; +static unichar_t mnemonic_Dontsave[] = 'N' ; +static char str_Fontchange[] = "Fonte modifiée" ; + /* Font %.70s in file %.70s has been changed.\nDo you want to save it ? */ +static char str_Fontchangepre[] = "La fonte " ; +static char str_Fontchangemid[] = " dans le fichier " ; +static char str_Fontchangepost[] = " a été modifiée.\012Voulez vous l'enregistrer ?" ; +static char str_Fontchangerevertpost[] = " a été modifiée.\012Revenir vous fera perdre toutes les modifications.\012Voulez vous vraiment revenir ?" ; + /* General messages from fontview.c */ +static char str_Revert[] = "Revenir" ; +static unichar_t mnemonic_Revert[] = 'R' ; +static char str_Manywin[] = "Beaucoup de fenêtres !" ; +static char str_Toomany[] = "Cela va ouvrir plus de 10 fenêtres.\012Est-ce vraiment ce que vous souhaitez ?" ; +static char *str_MergeKernInfo = "Fusionner les infos de crénage" ; +static char *str_OpenPostScript = "Ouvrir une fonte PostScript" ; +static char *str_Loading = "Chargement..." ; +static char *str_LoadingFontFrom = "Chargement d'une fonte depuis " ; +static char *str_ReadingGlyphs = "Lecture des glyphes" ; +static char *str_ReadingAFM = "Lecture du fichier AFM" ; +static char *str_InterpretingGlyphs = "Interprétation des glyphes" ; +static char *str_CouldntOpenFontTitle = "Lecture de la fonte impossible" ; +static char *str_NoSuchFontFile = "Le fichier %.100hs n'existe pas" ; +static char *str_FontFileNotReadable = "Vous n'avez pas le droit de lire le fichier %.100hs" ; +static char *str_CouldntParseFont = "Le fichier %.100hs a un format incorrect" ; +static char *str_SaveFailed = "Échec de l'enregistrement" ; +static char *str_Transforming = "Transformation..." ; +static char *str_Simplifying = "Simplification..." ; +static char *str_AddingExtrema = "Ajout de points aux extrémités..." ; +static char *str_RemovingOverlap = "Suppression des recouvrements..." ; +static char *str_CorrectingDirection = "Correction de la direction..." ; +static char *str_Stroking = "Traçage..." ; +static char *str_Rounding = "Arrondi entier..." ; +static char *str_Autotracing = "Autotraçage..." ; +static char *str_ClearDependent = "Vous voulez effacer %.30hs qui est référencé par un\nautre glyphe. Êtes-vous sûr(e) de vouloir poursuivre ?" ; +static char *str_UnlinkAll = "Tout délier" ; +static char *str_Unlink = "Délier" ; +static char *str_dPixelBitmap = "%d pixel bitmap" ; +static char *str_ddPixelBitmap = "%d@%d pixel bitmap" ; +static char *str_RestrictedRightsFont = "Cette fonte possède un FSType de 2 (licence\nrestreinte). Cela signifie qu'elle n'est pas éditable sans\nla permission du propriétaire des droits.\n\nAvez vous cette permission ?" ; +static char *str_RestrictedFont = "Licence restreinte" ; +static char *str_CloseFont = "SVP fermez cette fonte" ; +static char *str_CloseFontForCID = "SVP, fermez %hs avant de l'insérer dans une fonte CID" ; +static char *str_CIDRemoveFontCheck = "Êtes-vous sûr(e) de vouloir supprimer la sous-fonte %1$.40hs de la fonte CID %2$.40hs" ; +static char *str_FlippedRef = "Référence inversée" ; +static char *str_FlippedRefUnlink = "%.50hs contient une référence inversée (dont le sens de rotation n'est pas\ncompatible). Cela ne peut pas être corrigé en l'état.\nVoulez vous que FontForge la délie et la corrige ensuite ?" ; +static char *str_Baseline = "Ligne de base" ; +static char *str_Origin = "Origine" ; +static char *str_AdvanceWidthAsBar = "Chasse représentée par une barre" ; +static char *str_AdvanceWidthAsLine = "Chasse représentée par une ligne" ; +static char *str_AdvanceBarPopup = "Montrer la chasse par une barre sous le glyphe\nreprésentant le vecteur d'avancement" ; +static char *str_AdvanceLinePopup = "Montrer la chasse par une ligne\nperpendiculaire au vecteur d'avancement" ; +static char *str_Suffix = "Suffixe :" ; +static char *str_SuffixToTag = "Suffixe vers tag..." ; + /* Messages from accented characters */ +static char str_Buildingaccented[] = "Créer les glyphes accentués" ; +static char str_Replacearing[] = "Remplacer Å" ; +static char str_Areyousurearing[] = "Ètes vous sur de vouloir remplacer le Å ?\012L'anneau ne sera pas lié au glyphe A." ; +static char str_Yes[] = "Oui" ; +static unichar_t mnemonic_Yes[] = 'O' ; +static char str_No[] = "Non" ; +static unichar_t mnemonic_No[] = 'N' ; + /* Choices from bitmap editing */ +static char str_Rectangle[] = "Rectangle" ; +static char str_FilledRectangle[] = "Rectangle plein" ; +static char str_Elipse[] = "Ellipse" ; +static char str_FilledElipse[] = "Ellipse pleine" ; + /* Get Info ... */ +static char str_Multiple[] = "Plusieurs" ; +static char str_AlreadyCharUnicode[] = "Il y a déjà un glyphe attaché au même caractère Unicode,\012(nommé %$1.40hs, dans le codage actuel %$2d).\012Est-ce vraiment ce que vous souhaitez ?" ; +static char str_Alreadycharnamed[] = "Il y a déjà un glyphe portant ce nom,\012voulez vous permuter les noms ?" ; + /* There is already a ligature made from these components,\n(named %.10s at local encoding %d)\nIs that what you want ? */ +static char str_AlreadyLigature[] = "Il y a déjà une ligature ayant les mêmes composantes,\012(appelée %1$.40hs dans le codage courant %2$d).\012Est-ce vraiment ce que vous souhaitez ?" ; +static char str_Badligature[] = "Une ligature ne peut pas se composer d'elle même" ; + /* "The component %.20s is not in this font,\nIs that what you want ?" */ +static char str_MissingComponent[] = "La composante \"%.40s\" n'est pas dans cette fonte,\012est-ce vraiment ce que vous souhaitez ?" ; +static char str_SelfReferential = "Cette substitution s'auto-référence" +static char str_Done[] = "Fini" ; +static unichar_t mnemonic_Done[] = 'F' ; +static char str_Ligpop[] = "Si ce glyphe doit être une ligature, indiquez\nle nom des glyphes dont il se compose" ; +static char *str_Show[] = "Montrer" ; +static unichar_t mnemonic_Show[] = 'S' ; +static char *str_PointInfo = "Infos points" ; +static char *str_ImageInfo = "Infos images" ; +static char *str_AnchorPointInfo = "Infos ancres" ; +static char *str_ReferenceInfo = "Infos références" ; +static char *str_Dependents = "Dépendances" ; +static char *str_Offset = "Décalage" ; +static char *str_BaseX = "Base hor." ; +static char *str_BaseY = "Base vert." ; +static char *str_NextCP = "PdeC suiv. :" ; +static char *str_NextCPX = "PdeC hor. suiv." ; +static char *str_NextCPY = "PdeC suiv." ; +static char *str_PrevCP = "PdeC préc. :" ; +static char *str_PrevCPX = "PdeC hor. préc." ; +static char *str_PrevCPY = "PdeC vert. préc." ; +static char *str_UnicodeL = "Unicode" ; +static char *str_LigatureL = "Ligature" ; +static char *str_Components = "Composantes" ; +static char *str_AltPos = "Dépl. simple" ; +static char *str_Pair = "Dépl. de paire" ; +static char *str_Subs = "Subst. simple" ; +static char *str_AltSubs = "Choix de variante" ; +static char *str_MultSubs = "Subst. multiple" ; +static char *str_UnicodeName = "Nom Unicode :" ; +static char mnemonic_UnicodeName = 'N' ; +static char *str_UnicodeValue = "Valeur Unicode :" ; +static char mnemonic_UnicodeValue = 'V' ; +static char *str_UnicodeChar = "Car. Unicode :" ; +static char mnemonic_UnicodeChar = 'h' ; +static char *str_SetFromName = "À partir du nom" ; +static char mnemonic_SetFromName = 'a' ; +static char *str_SetFromValue = "À partir de la valeur" ; +static char mnemonic_SetFromValue = 'u' ; +static char *str_Ligature = "Ligature :" ; +static char mnemonic_Ligature = 'L' ; +static char *str_AccentedComponents = "Glyphe accentué composé de :" ; +static char *str_CompositComponents = "Glyphe composé de :" ; +static char *str_NoComponents = "Pas de composantes" ; +static char *str_Color = "Couleur :" ; +static char *str_TransformedBy = "Transformé avec :" ; +static char *str_NotUnicodeBMP = "Attention : cette valeur n'est pas dans le plan de base Unicode.\nEst-ce vraiment ce que vous souhaitez ?" ; +static char *str_PossiblyTooBig = "Valeur peut-être hors limites" ; +static char *str_OutOfRange = "Valeur hors limites" ; +static char *str_TransformationMatrix = "Matrice de transformation" ; +static char *str_TransformChanged = "Matrice de transformation modifiée" ; +static char *str_TransformChangedApply = "Vous avez modifié la matrice de transformation, souhaitez vous utiliser sa nouvelle définition ?" ; +static char *str_TransformPopup = "La matrice de transformation spécifie comment les points\n du glyphe original doivent être transformés\n x(nouveau) = tm[1,1]*x + tm[2,1]*y + tm[3,1]\n y(nouveau) = tm[1,2]*x + tm[2,2]*y + tm[3,2]" ; +static char *str_MakeNewClass = "Créer une classe d'ancres" ; +static char *str_MakeNewAnchorClass = "Il n'y a plus de classe d'ancre libre\nà laquelle vous pourriez assigner un nouveau point. Si vous\nsouhaitez une nouvelle ancre, vous\ndevez définir une nouvelle classe d'ancre par le biais de\n'Élément->Infos fonte'" ; +static char *str_Mark = "Marque" ; +static char *str_BaseChar = "Glyphe de base" ; +static char *str_BaseLig = "Ligature" ; +static char *str_BaseMark = "Marque de base" ; +static char *str_CursiveEntry = "Entrée cursive" ; +static char *str_CursiveExit = "Sortie cursive" ; +static char *str_LigIndex = "Indice composante :" ; +static char *str_LastAnchor = "Dernière ancre" ; +static char *str_RemoveLastAnchor = "Vous êtes en train de supprimer la dernière ancre de ce glyphe.\nCela va fermer cette boîte de dialogue. Est-ce vraiment ce que vous souhaitez ?" +static char *str_ClassUsed = "Classe déjà utilisée" +static char *str_AnchorClassUsed ="Cette classe d'ancre est déjà associée à un point dans ce glyphe" ; +static char *str_BadClass = "Classe non autorisée" +static char *str_AnchorClassCurs ="Vous ne pouvez pas modifier une ancre associée à la fonctionnalité 'curs'" ; +static char *str_XC = "X :" ; +static char mnemonic_XC = 'X' ; +static char *str_YC = "Y :" ; +static char mnemonic_YC = 'Y' ; +static char *str_IndexInUse = "Indice déjà utilisé" ; +static char *str_LigIndexInUse = "Cet indice de composante est déjà utilisé" ; +static char *str_OutOfOrder = "Dans le désordre" ; +static char *str_IndexOutOfOrder = "Les marques dans les ligatures doivent être ordonnées dans le sens de l'écriture.\nCelle-ci et %d ne le sont pas." ; +static char *str_TooBig = "Trop grand" ; +static char *str_IndexTooBig = "Cet indice est bien plus grand que son voisin immédiat" +static char *str_BadPOSSUB = "GPOS/GSUB incorrecte" ; +static char *str_BadPOSSUBPaste = "La chaîne doit commencer par les 4 caractères du tag de fonctionnalité, suivis par un espace, puis par les informations" ; +static char *str_ExpectedEquals = "Format des données de position incorrect : je m'attendais à quatres caractères, puis aux données" ; +static char *str_SimpleSubsOneComponent = "Une substitution simple doit utiliser un et un seul glyphe" ; +static char *str_NewPosition = "Nouveau déplacement simple" ; +static char *str_NewPair = "Nouveau déplacement de paire" ; +static char *str_NewSubstitution = "Nouvelle substitution simple" ; +static char *str_NewAlternate = "Nouveau choix de variante" ; +static char *str_NewMultiple = "Nouvelle substitution multiple" ; +static char *str_NewLigature = "Nouvelle ligature" ; +static char *str_EditPosition = "Éditer déplacement simple" ; +static char *str_EditPair = "Éditer déplacement de paire" ; +static char *str_EditSubstitution = "Éditer substitution simple" ; +static char *str_EditAlternate = "Éditer choix de variante" ; +static char *str_EditMultiple = "Éditer substitution multiple" ; +static char *str_EditLigature = "Éditer ligature" ; +static char *str_DuplicateTag = "Tag déjà existant" ; +static unichar_t *str_Dx = { 0x2206, 'X', ' :' } ; +static unichar_t *str_Dy = { 0x2206, 'Y', ' :' } ; +static unichar_t *str_Dxa = { 0x2206, 'X','A','d','v','a','n','c','e', ' :' } ; +static unichar_t *str_Dya = { 0x2206, 'Y','A','d','v','a','n','c','e', ' :' } ; +static char *str_TooManyComponents = "Trop de composants" ; +static char *str_SubsOnlyOne = "Une substitution simple utilise seulement un composant, vous en avez fourni plusieurs" ; +static char *str_Itself = "Lui-même" ; + /* Import */ +static char str_Duppixelsize[] = "Taille de pixel déjà existante" ; + /* "The font database already contains a bitmap\nfont with this pixelsize (%d)\nDo you want to overwrite it ?" */ +static char str_Duppixelsizepre[] = "La fonte contient déja des bitmaps de cette\ntaille (" ; +static char str_Duppixelsizepost[] = ")\012Voulez vous l'écraser ?" ; +static char str_NoBitmapFont = "Pas de fonte bitmap" ; +static char str_NoBitmapFontIn = "Pas de fonte bitmap dans %hs" ; +static char *str_PairedChar = "Second glyphe" ; +static char *str_MissingPaired = "Second glyphe manquant" ; +static char *str_NeedPaired = "Vous devez donner le nom du second glyphe de la paire, ne laissez pas votre premier glyphe sombrer dans la solitude" ; +static char *str_PairedNotInFont = "Votre second glyphe (%.50hs) est un 'outsider', son nom ne se trouve pas dans la fonte. Maintenez-vous ce choix ?" ; + /* Ligature feature tags */ +static char str_RequiredLig = "Ligatures requises " +static char str_StandardLig = "Ligatures standard" +static char str_DiscretionaryLig = "Ligatures facultatives " +static char str_AncientLig = "Ligatures anciennes" +static char str_HistoricLig = "Ligatures historiques" +static char str_FractionLig = "Fractions" +static char str_AboveBaseSubs = "Substitutions supérieures (IND)" +static char str_AltFrac = "Fractions alternatives" +static char str_Akhand = "Akhand (IND)" +static char str_BelowBaseForms = "Formes inférieures (IND)" +static char str_BelowBaseSubs = "Substitutions inférieures (IND)" +static char str_GlyphCompDecomp = "Composition et décomposition de glyphe (CJK)" +static char str_HalfForm = "Demi-chasses (IND)" +static char str_HalantForm = "Formes sans voyelle (IND)" +static char str_LeadingJamo = "Forme coréenne basique initiale (CJK)" +static char str_TrailingJamo = "Forme coréenne basique finale (CJK)" +static char str_VowelJamo = "Forme coréenne basique voyelle (CJK)" +static char str_Nukta = "Nukta (IND)" +static char str_PreBaseForms = "Formes antéposées (IND)" +static char str_PreBaseSubs = "Substitution antéposées (IND)" +static char str_PostBaseForms = "Formes postposées (IND)" +static char str_PostBaseSubs = "Substitutions postposées (IND)" +static char str_Reph = "Forme du reph" +static char str_VattuVariants = "Variantes vattu" +static char str_MacLogos = "Logos (Mac)" +static char str_MacRebus = "Rébus (Mac)" +static char str_MacDiphthongLig = "Ligatures diphtongues (Mac)" +static char str_MacSquareLig = "Ligatures carrées (Mac)" +static char str_MacAbbrevSquareLig = "Ligatures carrées abrégées (Mac)" +static char str_MacUnicodeDecomposition = "Décomposition Unicode (Mac)" + /* simple positioning feature tags */ +static char str_CaseSensForms = "Formes sensibles à la casse" ; +static char str_CapitalSpacing = "Chasses pour composition en capitales" ; +static char str_AltHalfWidths = "Demi-chasses alternatives (CJK)" ; +static char str_LeftBounds = "Alignement optique à gauche" ; +static char str_OpticalBounds = "Alignement optique des deux côtés" ; +static char str_PropAltMet = "Chasses proportionnelles alternatives (CJK)" ; +static char str_QuartWidths = "Quart de chasse (CJK)" ; +static char str_RightBounds = "Alignement optique à droite" ; +static char str_ThirdWidths = "Tiers de chasse (CJK)" ; +static char str_AltVertMet = "Chasses verticales alternatives (CJK)" ; +static char str_AltVertHalfMet = "Demi-chasse verticales alternatives (CJK)" ; +static char str_AltVertPropMet = "Chasses prop. vert. alternatives (CJK)" ; +static char str_ItalicCorrection = "Correction italique" ; + /* pair positioning feature tags */ +static char str_Distance = "Distance" ; +static char str_HorizontalKerning = "Crénage horizontal" ; +static char str_VerticalKerning = "Crénage vertical" ; + /* simple substitution feature tags */ +static char str_AllAlt = "Activer toutes les variantes" ; +static char str_AboveBaseForms = "Formes supérieures (IND)" ; +static char str_Cap2PetiteCaps = "Capitales vers très petites capitales" ; +static char str_Cap2SmallCaps = "Capitales vers petites capitales" ; +static char str_Denominators = "Dénominateurs" ; +static char str_ExpertForms = "Formes expertes (CJK)" ; +static char str_TerminalForms = "Formes finales (ARA)" ; +static char str_FullWidths = "Pleines chasses (CJK)" ; +static char str_HistoricalForms = "Formes historiques" ; +static char str_HorKanaAlt = "Kana horizontaux alternatifs (CJK)" ; +static char str_Hanja2Hangul = "Convertir hancha en hangoul (CJK)" +static char str_HalfWidths = "Demi-chasses (CJK)" ; +static char str_InitialForms = "Formes initiales (ARA)" ; +static char str_IsolatedForms = "Formes isolées (ARA)" ; +static char str_Italics = "Italiques" ; +static char str_JIS78Forms = "Formes JIS78 (CJK)" ; +static char str_JIS83Forms = "Formes JIS83 (CJK)" ; +static char str_JIS90Forms = "Formes JIS90 (CJK)" ; +static char str_LiningFigures = "Chiffres modernes" ; +static char str_LocalizedForms = "Formes localisées géographiquement" ; +static char str_MedialForms = "Formes médianes (ARA)" ; +static char str_MathematicalGreek = "Grec mathématique" ; +static char str_AltAnnotForms = "Formes d'annotation alternatives" ; +static char str_Numerators = "Numérateurs" ; +static char str_OldstyleFigures = "Chiffres à l'ancienne" ; +static char str_Ornaments = "Ornements" ; +static char str_PetiteCaps = "Bas-de-casse vers très petites capitales" ; +static char str_PropNumbers = "Chiffres proportionnels" ; +static char str_PropWidth = "Chasses proportionnelles (CJK)" ; +static char str_R2LAlt = "Formes alternatives droite-à-gauche (ARA)" ; +static char str_RubyNoteForms = "Glyphes adaptés aux ruby (CJK)" ; +static char str_StylisticAlt = "Alternatives stylistiques" ; +static char str_ScientificInf = "Indices scientifiques" ; +static char str_SmallCaps = "Bas-de-casse vers petites capitales" ; +static char str_SimplifiedForms = "Idéogrammes simplifiés (CJK)" ; +static char str_StyleSet1 = "Style 1" ; +static char str_StyleSet2 = "Style 2" ; +static char str_StyleSet3 = "Style 3" ; +static char str_StyleSet4 = "Style 4" ; +static char str_StyleSet5 = "Style 5" ; +static char str_Subscript = "Indice" ; +static char str_Superscript = "Exposant" ; +static char str_Swash = "Forme calligraphique" ; +static char str_Titling = "Titrage" ; +static char str_TraditionalNameForms = "Formes traditionnelles pour noms propres (CJK)" ; +static char str_TabNumb = "Chiffres monochasse" ; +static char str_TeXCharList = "Glyphes pour TeX" ; +static char str_TeXExtensionList = "Extensions pour TeX" ; +static char str_TraditionalForms = "Idéogrammes traditionnels (CJK)" ; +static char str_Unicase = "Unicase" ; +static char str_VerticalRot = "Formes verticales alternatives (CJK)" ; +static char str_VertRotAlt = "Formes verticales par rotation (CJK)" +static char str_VertKana = "Kana verticaux alternatifs (CJK)" +static char str_SlashedZero = "Zéro barré" +static char str_MacWordInitialSwash = "Forme call. début de mot (Mac)" +static char str_MacWordFinalSwash = "Forme call. fin de mot (Mac)" +static char str_MacLineInitialSwash = "Forme call. début de ligne (Mac)" +static char str_MacLineFinalSwash = "Forme call. fin de ligne (Mac)" +static char str_MacNonFinalSwash = "Forme call. non finale (Mac)" +static char str_MacMonospaceWidth = "Monochasse (Mac)" + /* (multiple) alternate substitution feature tags */ +static char str_FinalGlyphLine = "Dernier glyphe de la ligne" +static char str_JustificationAlt = "Formes alternatives adaptées à la justif." +static char str_Randomize = "Au hasard" + /* contextual substitution feature tags */ +static char str_TerminalForms2 = "Formes finales 2 (ARA)" ; +static char str_TerminalForms3 = "Formes finales 3 (ARA)" ; +static char str_MedialForms2 = "Formes médianes 2 (ARA)" ; +static char str_MarkPosViaSubs = "Placement de diacritique par substitution" ; + /* contextual substitution chaining feature tags */ +static char str_ContextAltern = "Alternatives contextuelle" ; +static char str_Ordinals = "Ordinaux" ; + /* reverse contextual substitution chaining feature tags */ +static char str_ContextLig = "Ligatures contextuelles" ; +static char str_ContextSwash = "Formes calligraphiques contextuelles" ; + /* Script tags */ +static char str_arab = "Arabe" ; +static char str_Aramaic = "Araméen" ; +static char str_armn = "Arménien" ; +static char str_Avestan = "Avestique" ; +static char str_Batak = "Batak" ; +static char str_beng = "Bengali" ; +static char str_Bliss = "Bliss" ; +static char str_bopo = "Bopomofo" ; +static unichar_t str_Brahmi = { 'B', 'r', 0x101, 'h', 'm', 0x12b, 0 } ; +static char str_brai = "Braille" ; +static char str_Buginese = "Bugi" ; +static char str_Buhid = "Buhide" ; +static char str_byzm = "Musique byzantine" ; +static char str_cans = "Canadien syllabique" ; +static char str_Cham = "Cham" ; +static char str_cher = "Cherokee" ; +static char str_Cirth = "Cirth" ; +static char str_CyproMinoan = "Chyprio-minoen" ; +static char str_CypriotSyl = "Syllabaire chypriote" ; +static char str_hani = "Idéogrammes CJK" ; +static char str_cyrl = "Cyrillique" ; +static char str_DFLT = "Par défaut" ; +static char str_Deseret = "Déséret (mormon)" ; +static char str_deva = "Dévanagari" ; +static char str_EgyptianDemotic = "Égyptien démotique" ; +static char str_EgyptianHieratic = "Égyptien hiératique" ; +static char str_EgyptianHieroglyphs = "Hiéroglyphes égyptiens" ; +static char str_ethi = "Éthiopien" ; +static char str_geor = "Géorgien" ; +static char str_Glagolitic = "Glagolitique" ; +static char str_Gothic = "Gothique" ; +static char str_grek = "Grec" ; +static char str_gujr = "Goudjrati" ; +static char str_guru = "Gourmoukhi" ; +static char str_jamo = "Hangoul jamo" ; +static char str_hang = "Hangoul" ; +static char str_Hanunoo = "Hanounóo" ; +static char str_hebr = "Hébreu" ; +static char str_HmongPahawh = "Hmong pahawh" ; +static char str_Indus = "Vallée de l'Indus (harappan)" ; +static char str_OldItalic = "Italie ancienne (étrusque, osque, etc.)" ; +static char str_Javanese = "Javanais" ; +static char str_KayahLi = "Kayah li" ; +static unichar_t str_Kharosthi = { 'K','h','a','r','o',0x1e63,0x1e6d,'h',0x12b, 0 } ; +static char str_kana = "Hiragana & katakana" ; +static char str_knda = "Kannada" ; +static char str_khmr = "Khmer" ; +static char str_lao = "Lao" ; +static char str_latn = "Latin" ; +static char str_Lepcha = "Lepcha (róng)" ; +static char str_Limbu = "Limbourgeois" ; +static char str_LinearA = "Linéaire A" ; +static char str_LinearB = "Linéaire B" ; +static char str_Mandaean = "Mandéen" ; +static char str_Mayan = "Hiéroglyphes maya" ; +static char str_Meroitic = "Méroïtique" ; +static char str_mlym = "Malayalam" ; +static char str_mong = "Mongol" ; +static char str_mymr = "Birman" ; +static char str_ogam = "Ogam" ; +static char str_orya = "Oriya" ; +static char str_Osmanya = "Osmanya" ; +static char str_Pahlavi = "Pahlavi" ; +static char str_Permic = "Permien ancien" ; +static char str_Phoenician = "Phénicien" ; +static char str_Phaistos = "Disque de Phaistos" ; +static char str_Pollard = "Phonétique de Pollard" ; +static char str_Rongorongo = "Rongo-rongo" ; +static char str_runr = "Runique" ; +static char str_Shavian = "Shavien" ; +static char str_sinh = "Singhalais" ; +static char str_syrc = "Syriaque" ; +static char str_taml = "Tamoul" ; +static char str_Tagalog = "Tagal" ; +static char str_Tagbanwa = "Tagbanoua" ; +static char str_TaiLe = "Taï le" ; +static char str_telu = "Télougou" ; +static char str_Tengwar = "Tengwar" ; +static char str_Tifinagh = "Tifinagh (berbère)" ; +static char str_thaa = "Thaana" ; +static char str_thai = "Thaï" ; +static char str_tibt = "Tibétain" ; +static char str_Ugaritic = "Ougaritique" ; +static char str_Vai = "Vaï" ; +static char str_VisibleSpeech = "Parole visible" ; +static char str_CuneiformOP = "Cunéiforme persépolitain" ; +static char str_CuneiformSA = "Cunéiforme, suméro-akkadien" ; +static char str_CuneiformUg = "Cunéiforme, ougaritique" ; +static char str_yi = "Yi" ; +static char str_PrivateUseScript1 = "Zone privée 1" ; +static char str_PrivateUseScript2 = "Zone privée 2" ; +static char str_UndeterminedScript = "Écriture indéterminée" ; +static char str_UncodedScript = "Écriture non codée" ; + /* Language tags */ +static char str_OTFAbaza = "Abaza" ; +static char str_OTFAbkhazian = "Abkhaze" ; +static char str_OTFAdyghe = "Adygh" ; +static char str_OTFAfrikaans = "Afrikaans" ; +static char str_OTFAfar = "Afar" ; +static char str_OTFAgaw = "Agaw" ; +static char str_OTFAltai = "Altaïque" ; +static char str_OTFAmharic = "Amharique" ; +static char str_OTFArabic = "Arabe" ; +static char str_OTFAari = "Aari" ; +static char str_OTFArakanese = "Arakanais" ; +static char str_OTFAssamese = "Assamais" ; +static char str_OTFAthapaskan = "Athapascan" ; +static char str_OTFAvar = "Avar" ; +static char str_OTFAwadhi = "Awadhi" ; +static char str_OTFAymara = "Aymara" ; +static char str_OTFAzeri = "Azéri" ; +static char str_OTFBadaga = "Badaga" ; +static char str_OTFBaghelkhandi = "Baghelkhandi" ; +static char str_OTFBalkar = "Balkar" ; +static char str_OTFBaule = "Baule" ; +static char str_OTFBerber = "Berbère" ; +static char str_OTFBench = "Bench" ; +static char str_OTFBibleCree = "Cree de la Bible" ; +static char str_OTFBelarussian = "Biélorusse" ; +static char str_OTFBemba = "Bemba" ; +static char str_OTFBengali = "Bengali" ; +static char str_OTFBulgarian = "Bulgare" ; +static char str_OTFBhili = "Bhili" ; +static char str_OTFBhojpuri = "Bhojpuri" ; +static char str_OTFBikol = "Bikol" ; +static char str_OTFBilen = "Bilen" ; +static char str_OTFBlackfoot = "Blackfoot" ; +static char str_OTFBalochi = "Baloutchi" ; +static char str_OTFBalante = "Balanté" ; +static char str_OTFBalti = "Balti" ; +static char str_OTFBambara = "Bambara" ; +static char str_OTFBamileke = "Bamiléké" ; +static char str_OTFBreton = "Breton" ; +static char str_OTFBrahui = "Brahui" ; +static char str_OTFBrajBhasha = "Braj bhasha" ; +static char str_OTFBurmese = "Birman" ; +static char str_OTFBashkir = "Bachkir" ; +static char str_OTFBeti = "Beti" ; +static char str_OTFCatalan = "Catalan" ; +static char str_OTFCebuano = "Cebuano" ; +static char str_OTFChechen = "Tchéchène" ; +static char str_OTFChahaGurage = "Chaha gurage" ; +static char str_OTFChattisgarhi = "Chattisgarhi" ; +static char str_OTFChichewa = "Chichewa" ; +static char str_OTFChukchi = "Chukchi" ; +static char str_OTFChipewyan = "Chipewyan" ; +static char str_OTFCherokee = "Cherokee" ; +static char str_OTFChuvash = "Chuvash" ; +static char str_OTFComorian = "Comorien" ; +static char str_OTFCoptic = "Copte" ; +static char str_OTFCree = "Cree" ; +static char str_OTFCarrier = "Carrier" ; +static char str_OTFCrimeanTatar = "Tatar de Crimée" ; +static char str_OTFChurchSlavonic = "Slavon d'église" ; +static char str_OTFCzech = "Tchèque" ; +static char str_OTFDanish = "Danois" ; +static char str_OTFDargwa = "Dargwa" ; +static char str_OTFWoodsCree = "Cree des fôrets" ; +static char str_OTFGermanStandard = "Allemand (standard)" ; +static char str_OTFDogri = "Dogri" ; +static char str_OTFDhivehi = "Maldivien" ; +static char str_OTFDjerma = "Djerma" ; +static char str_OTFDangme = "Dangme" ; +static char str_OTFDinka = "Dinka" ; +static char str_OTFDungan = "Dungan" ; +static char str_OTFDzongkha = "Dzongkha" ; +static char str_OTFEbira = "Ebira" ; +static char str_OTFEasternCree = "Cree oriental" ; +static char str_OTFEdo = "Edo" ; +static char str_OTFEfik = "Efik" ; +static char str_OTFGreek = "Grec" ; +static char str_OTFEnglish = "Anglais" ; +static char str_OTFErzya = "Erzya" ; +static char str_OTFSpanish = "Espagnol" ; +static char str_OTFEstonian = "Estonien" ; +static char str_OTFBasque = "Basque" ; +static char str_OTFEvenki = "Evenki" ; +static char str_OTFEven = "Even" ; +static char str_OTFEwe = "Éwé" ; +static char str_OTFFrenchAntillean = "Français des Antilles" ; +static char str_OTFFarsi = "Persan" ; +static char str_OTFFinnish = "Finnois" ; +static char str_OTFFijian = "Fidjien" ; +static char str_OTFFlemish = "Flamand" ; +static char str_OTFForestNenets = "Nenets des fôrets" ; +static char str_OTFFon = "Fon" ; +static char str_OTFFaroese = "Féroïen" ; +static char str_OTFFrenchStandard = "Français (standard)" ; +static char str_OTFFrisian = "Frison" ; +static char str_OTFFriulian = "Frioulan" ; +static char str_OTFFuta = "Futa" ; +static char str_OTFFulani = "Peul" ; +static char str_OTFGa = "Ga" ; +static char str_OTFGaelic = "Gaélique" ; +static char str_OTFGagauz = "Gagauz" ; +static char str_OTFGalician = "Galicien" ; +static char str_OTFGarshuni = "Garchouni" ; +static char str_OTFGarhwali = "Garhwali" ; +static char str_OTFGeez = "Guèze" ; +static char str_OTFGilyak = "Gilyak" ; +static char str_OTFGumuz = "Gumuz" ; +static char str_OTFGondi = "Gondi" ; +static char str_OTFGreenlandic = "Groenlandais" ; +static char str_OTFGaro = "Garo" ; +static char str_OTFGuarani = "Guarani" ; +static char str_OTFGujarati = "Goudjrati" ; +static char str_OTFHaitian = "Haïtien" ; +static char str_OTFHalam = "Halam" ; +static char str_OTFHarauti = "Harauti" ; +static char str_OTFHausa = "Haoussa" ; +static char str_OTFHawaiin = "Hawaïen" ; +static char str_OTFHammer_Banna = "Hammer-Banna" ; +static char str_OTFHiligaynon = "Hiligaynon" ; +static char str_OTFHindi = "Hindi" ; +static char str_OTFHighMari = "Haut-mari" ; +static char str_OTFHindko = "Hindko" ; +static char str_OTFHo = "Ho" ; +static char str_OTFHarari = "Harari" ; +static char str_OTFCroatian = "Croate" ; +static char str_OTFHungarian = "Hongrois" ; +static char str_OTFArmenian = "Arménien" ; +static char str_OTFIgbo = "Igbo" ; +static char str_OTFIjo = "Ijo" ; +static char str_OTFIlokano = "Ilokano" ; +static char str_OTFIndonesian = "Indonésien" ; +static char str_OTFIngush = "Ingush" ; +static char str_OTFInuktitut = "Inuktitut" ; +static char str_OTFIrish = "Irlandais" ; +static char str_OTFIrishTraditional = "Irlandais traditionnel" ; +static char str_OTFIcelandic = "Islandais" ; +static char str_OTFInariSami = "Sami d'Inari" ; +static char str_OTFItalian = "Italien" ; +static char str_OTFHebrew = "Hébreu" ; +static char str_OTFJavanese = "Javanais" ; +static char str_OTFYiddish = "Yiddish" ; +static char str_OTFJapanese = "Japonais" ; +static char str_OTFJudezmo = "Judéo-espagnol (judezmo)" ; +static char str_OTFJula = "Jula" ; +static char str_OTFKabardian = "Kabardian" ; +static char str_OTFKachchi = "Kachin" ; +static char str_OTFKalenjin = "Kalenjin" ; +static char str_OTFKannada = "Kannada" ; +static char str_OTFKarachay = "Karachay" ; +static char str_OTFGeorgian = "Géorgien" ; +static char str_OTFKazakh = "Kazakh" ; +static char str_OTFKebena = "Kebena" ; +static char str_OTFKhutsuriGeorgian = "Géorgien (khoutsouri)" ; +static char str_OTFKhakass = "Khakass" ; +static char str_OTFKhanty_Kazim = "Khanty-kazim" ; +static char str_OTFKhmer = "Khmer" ; +static char str_OTFKhanty_Shurishkar = "Khanty-shurishkar" ; +static char str_OTFKhanty_Vakhi = "Khanty-vakhi" ; +static char str_OTFKhowar = "Khowar" ; +static char str_OTFKikuyu = "Kikuyu" ; +static char str_OTFKirghiz = "Kirghiz" ; +static char str_OTFKisii = "Kisii" ; +static char str_OTFKokni = "Kokni" ; +static char str_OTFKalmyk = "Kalmyk" ; +static char str_OTFKamba = "Kamba" ; +static char str_OTFKumaoni = "Kumaoni" ; +static char str_OTFKomo = "Komo" ; +static char str_OTFKomso = "Komso" ; +static char str_OTFKanuri = "Kanuri" ; +static char str_OTFKodagu = "Kodagu" ; +static char str_OTFKonkani = "Konkani" ; +static char str_OTFKikongo = "Kikongo" ; +static char str_OTFKomi_Permyak = "Komi-permyak" ; +static char str_OTFKorean = "Coréen" ; +static char str_OTFKomi_Zyrian = "Komi-zyrien" ; +static char str_OTFKpelle = "Kpellé" ; +static char str_OTFKrio = "Krio" ; +static char str_OTFKarakalpak = "Karakalpak" ; +static char str_OTFKarelian = "Carélien" ; +static char str_OTFKaraim = "Karaim" ; +static char str_OTFKaren = "Karen" ; +static char str_OTFKoorete = "Kooreté" ; +static char str_OTFKashmiri = "Kashmiri" ; +static char str_OTFKhasi = "Khasi" ; +static char str_OTFKildinSami = "Sami de Kildin" ; +static char str_OTFKui = "Kui" ; +static char str_OTFKulvi = "Kulvi" ; +static char str_OTFKumyk = "Koumyk" ; +static char str_OTFKurdish = "Kurde" ; +static char str_OTFKurukh = "Kurukh" ; +static char str_OTFKuy = "Kuy" ; +static char str_OTFKoryak = "Koryak" ; +static char str_OTFLadin = "Judéo-espagnol (ladino)" ; +static char str_OTFLahuli = "Lahuli" ; +static char str_OTFLak = "Lak" ; +static char str_OTFLambani = "Lamba" ; +static char str_OTFLao = "Lao" ; +static char str_OTFLatin = "Latin" ; +static char str_OTFLaz = "Laz" ; +static char str_OTFL_Cree = "L-Cree" ; +static char str_OTFLadakhi = "Ladakhi" ; +static char str_OTFLezgi = "Lezghien" ; +static char str_OTFLingala = "Lingala" ; +static char str_OTFLowMari = "Bas-mari" ; +static char str_OTFLimbu = "Limbourgeois" ; +static char str_OTFLomwe = "Lomwé" ; +static char str_OTFLowerSorbian = "Bas-sorabe" ; +static char str_OTFLuleSami = "Sami de Lule" ; +static char str_OTFLithuanian = "Lituanien" ; +static char str_OTFLuba = "Luba" ; +static char str_OTFLuganda = "Luganda" ; +static char str_OTFLuhya = "Luhya" ; +static char str_OTFLuo = "Luo" ; +static char str_OTFLatvian = "Letton" ; +static char str_OTFMajang = "Majang" ; +static char str_OTFMakua = "Makua" ; +static char str_OTFMalayalamTraditional = "Malais traditionnel" ; +static char str_OTFMansi = "Mansi" ; +static char str_OTFMarathi = "Marathe" ; +static char str_OTFMarwari = "Marwari" ; +static char str_OTFMbundu = "Mbundu" ; +static char str_OTFManchu = "Manchu" ; +static char str_OTFMooseCree = "Moose cree" ; +static char str_OTFMende = "Mendé" ; +static char str_OTFMeen = "Me'en" ; +static char str_OTFMizo = "Mizo" ; +static char str_OTFMacedonian = "Macédonien" ; +static char str_OTFMale = "Malé" ; +static char str_OTFMalagasy = "Malgache" ; +static char str_OTFMalinke = "Malinké" ; +static char str_OTFMalayalamReformed = "Malais réformé" ; +static char str_OTFMalay = "Malais" ; +static char str_OTFMandinka = "Mandinka" ; +static char str_OTFMongolian = "Mongol" ; +static char str_OTFManipuri = "Manipuri" ; +static char str_OTFManinka = "Maninka" ; +static char str_OTFManxGaelic = "Mannois" ; +static char str_OTFMoksha = "Moksha" ; +static char str_OTFMoldavian = "Moldave" ; +static char str_OTFMon = "Mon" ; +static char str_OTFMoroccan = "Marocain" ; +static char str_OTFMaori = "Maori" ; +static char str_OTFMaithili = "Maithili" ; +static char str_OTFMaltese = "Maltais" ; +static char str_OTFMundari = "Mounda" ; +static char str_OTFNaga_Assamese = "Assamais naga" ; +static char str_OTFNanai = "Nanai" ; +static char str_OTFNaskapi = "Naskapi" ; +static char str_OTFN_Cree = "N-Cree" ; +static char str_OTFNdebele = "Ndébélé" ; +static char str_OTFNdonga = "Ndonga" ; +static char str_OTFNepali = "Népalais" ; +static char str_OTFNewari = "Newari" ; +static char str_OTFNorwayHouseCree = "Cree de la maison de Norvège" ; +static char str_OTFNisi = "Nisi" ; +static char str_OTFNiuean = "Niué" ; +static char str_OTFNkole = "Nkolé" ; +static char str_OTFDutch = "Néerlandais" ; +static char str_OTFNogai = "Nogaï" ; +static char str_OTFNorwegian = "Norvégien" ; +static char str_OTFNorthernSami = "Sami du Nord" ; +static char str_OTFNorthernTai = "Taï du Nord" ; +static char str_OTFEsperanto = "Espéranto" ; +static char str_OTFNynorsk = "Nynorsk" ; +static char str_OTFOji_Cree = "Oji-Cree" ; +static char str_OTFOjibway = "Ojibway" ; +static char str_OTFOriya = "Oriya" ; +static char str_OTFOromo = "Oromo" ; +static char str_OTFOssetian = "Ossète" ; +static char str_OTFPalestinianAramaic = "Araméen de Palestine" ; +static char str_OTFPali = "Pali" ; +static char str_OTFPunjabi = "Pendjabi" ; +static char str_OTFPalpa = "Palpa" ; +static char str_OTFPashto = "Pachto" ; +static char str_OTFPolytonicGreek = "Grec régulier" ; +static char str_OTFPilipino = "Philippin" ; +static char str_OTFPalaung = "Palaung" ; +static char str_OTFPolish = "Polonais" ; +static char str_OTFProvencal = "Provençal" ; +static char str_OTFPortuguese = "Portugais" ; +static char str_OTFChin = "Chin" ; +static char str_OTFRajasthani = "Rajasthani" ; +static char str_OTFR_Cree = "R-Cree" ; +static char str_OTFRussianBuriat = "Buriat russe" ; +static char str_OTFRiang = "Riang" ; +static char str_OTFRhaeto_Romanic = "Rhéro-roman" ; +static char str_OTFRomanian = "Roumain" ; +static char str_OTFRomany = "Tsigane" ; +static char str_OTFRusyn = "Rusyn" ; +static char str_OTFRuanda = "Ruanda" ; +static char str_OTFRussian = "Russe" ; +static char str_OTFSadri = "Sadri" ; +static char str_OTFSanskrit = "Sanskrit" ; +static char str_OTFSantali = "Santal" ; +static char str_OTFSayisi = "Sayisi" ; +static char str_OTFSekota = "Sekota" ; +static char str_OTFSelkup = "Selkoupe" ; +static char str_OTFSango = "Sango" ; +static char str_OTFShan = "Chan" ; +static char str_OTFSibe = "Sibe" ; +static char str_OTFSidamo = "Sidamo" ; +static char str_OTFSilteGurage = "Silte gurage" ; +static char str_OTFSkoltSami = "Sami skolt" ; +static char str_OTFSlovak = "Slovaque" ; +static char str_OTFSlavey = "Slavey" ; +static char str_OTFSlovenian = "Slovène" ; +static char str_OTFSomali = "Somali" ; +static char str_OTFSamoan = "Samoan" ; +static char str_OTFSena = "Sena" ; +static char str_OTFSindhi = "Sindhi" ; +static char str_OTFSinhalese = "Singhalais" ; +static char str_OTFSoninke = "Soninké" ; +static char str_OTFSodoGurage = "Sodo gurage" ; +static char str_OTFSotho = "Sotho" ; +static char str_OTFAlbanian = "Albanais" ; +static char str_OTFSerbian = "Serbe" ; +static char str_OTFSaraiki = "Saraïki" ; +static char str_OTFSerer = "Sérère" ; +static char str_OTFSouthSlavey = "Slavey du Sud" ; +static char str_OTFSouthernSami = "Sami du Sud" ; +static char str_OTFSuri = "Suri" ; +static char str_OTFSvan = "Svan" ; +static char str_OTFSwedish = "Suédois" ; +static char str_OTFSwadayaAramaic = "Araméen swadaya" ; +static char str_OTFSwahili = "Swahili" ; +static char str_OTFSwazi = "Swazi" ; +static char str_OTFSutu = "Sutu" ; +static char str_OTFSyriac = "Syrien" ; +static char str_OTFTabasaran = "Tabasaran" ; +static char str_OTFTajiki = "Tadjik" ; +static char str_OTFTamil = "Tamoul" ; +static char str_OTFTatar = "Tatar" ; +static char str_OTFTH_Cree = "TH-Cree" ; +static char str_OTFTelugu = "Télougou" ; +static char str_OTFTongan = "Tongan" ; +static char str_OTFTigre = "Tigré" ; +static char str_OTFTigrinya = "Tigrigna" ; +static char str_OTFThai = "Thaï" ; +static char str_OTFTahitian = "Tahitien" ; +static char str_OTFTibetan = "Tibétain" ; +static char str_OTFTurkmen = "Turkmène" ; +static char str_OTFTemne = "Temné" ; +static char str_OTFTswana = "Tswana" ; +static char str_OTFTundraNenets = "Tundra nenets" ; +static char str_OTFTonga = "Tonga" ; +static char str_OTFTodo = "Todo" ; +static char str_OTFTurkish = "Turc" ; +static char str_OTFTsonga = "Tsonga" ; +static char str_OTFTuroyoAramaic = "Araméen turoyo" ; +static char str_OTFTulu = "Tulu" ; +static char str_OTFTuvin = "Touva" ; +static char str_OTFTwi = "Twi" ; +static char str_OTFUdmurt = "Oudmourte" ; +static char str_OTFUkrainian = "Ukrainien" ; +static char str_OTFUrdu = "Ourdou" ; +static char str_OTFUpperSorbian = "Haut-sorabe" ; +static char str_OTFUyghur = "Ouïgour" ; +static char str_OTFUzbek = "Ouszbek" ; +static char str_OTFVenda = "Venda" ; +static char str_OTFVietnamese = "Viêtnamien" ; +static char str_OTFWa = "Wa" ; +static char str_OTFWagdi = "Wagdi" ; +static char str_OTFWest_Cree = "Cree occidental" ; +static char str_OTFWelsh = "Gallois" ; +static char str_OTFWolof = "Wolof" ; +static char str_OTFXhosa = "Xhosa" ; +static char str_OTFYakut = "Iakoute" ; +static char str_OTFYoruba = "Yoruba" ; +static char str_OTFY_Cree = "Y-Cree" ; +static char str_OTFYiClassic = "Yi classique" ; +static char str_OTFYiModern = "Yi moderne" ; +static char str_OTFChinesePhonetic = "Chinois phonétique" ; +static char str_OTFChineseSimplified = "Chinois simplifié" ; +static char str_OTFChineseTraditional = "Chinois sraditionnel" ; +static char str_OTFZande = "Zandé" ; +static char str_OTFZulu = "Zoulou" ; + /* dlg */ +static char str_ScriptList = "Liste des systèmes d'écriture" ; +static char str_LanguageList = "Liste des langues" ; +static char str_ScriptMissing = "Système d'écriture manquant" ; +static char str_ScriptMissingText = "Impossible de trouver un système d'écriture qui corresponde à '%c%c%c%c'.\nIl n'est pas dans la liste.\nSi ce n'est pas ce que vous souhaitez, faites un clic sur [Annuler]\net ensuite un CTRL-clic sur [Éditer]" ; +static char str_AtLeastOneScript = "Vous devez sélectionner au moins un système d'écriture" ; +static char str_LangMissing = "Langue manquante" ; +static char str_LangMissingText = "Je ne trouve aucune langue qui corresponde à '%c%c%c%c'.\nElle a été omise de la liste.\nSi ce n'est pas ce que vous souhaitez, faites un double-clic sur [Annuler]\net ensuite un CTRL-clic sur [Éditer]" ; +static char str_AtLeastOneLang = "Vous devez sélectionner au moins une langue.\nUtilisez la langue \"Par défaut\" si rien ne convient." ; +static char str_ScriptLang = "Système d'écriture & langue" ; +static char str_ScriptLangEnter = "Entrer une liste de systèmes d'écriture, chacun suivi d'une liste de langues" ; +static char str_ScriptLangList = "Liste de systèmes d'écriture et de langues" ; +static char str_SLError = "Je ne peux analyser la liste de systèmes d'écriture" +static char str_SLErrorText = "Une telle liste consiste en une liste de tags de systèmes d'écriture, chacun suivi d'un '{' et d'une liste de tags de langue séparés par des virgules. Exemple : latn{DEU ,dflt} cyrl{dflt}" ; +static char str_ScriptC = "Système d'écriture :" ; +static char mnemonic_ScriptC = 'S' ; +static char str_TagC = "Tag :" ; +static char mnemonic_TagC = 'T' ; +static char str_ScriptAndLangC = "Systèmes d'écriture et langues :" ; +static char mnemonic_ScriptAndLangC = 'S' ; +static char str_HHDefaultHH = " -- par défaut --" ; +static char str_Nested = " -- imbriqués --" ; +static char str_EditLangList = " -- éditer liste --" ; +static char str_TagTooLong = "Tag trop long" ; +static char str_TagMustBe4 = "Le tag doit comporter 4 caractères" ; +static char str_ScriptTagTooLong = "Les tags de système d'écriture sont limités à 4 caractères ASCII" ; +static char str_RightToLeft = "Droite à gauche" ; +static char str_IgnoreBaseGlyphs = "Ignorer les glyphes de base" ; +static char str_IgnoreLigatures = "Ignorer les ligatures" ; +static char str_IgnoreCombiningMarks = "Ignorer les marques" ; +static char str_NoScript = "Sans système d'écriture" ; +static char str_NeedsScriptForSubs = "Si vous spécifiez un déplacement ou une substitution pour ce glyphe, FontForge doit connaître le système d'écriture associé." ; +static char str_NeedsScriptForSubsGuess = "Si vous spécifiez un déplacement ou une substitution pour ce glyphe, FontForge doit connaître le système d'écriture associé.\nCeci serait il correct : '%c%c%c%c' ?" ; +static char str_ReallyNoScript = "Vous n'avez pas indiqué de système d'écriture pour ce glyphe (ou FontForge n'a pas su le deviner). Cela pourrait poser des problèmes si vous utilisez ce glyphe dans les tables GPOS ou GSUB.\nContinuer malgré tout ?" +static char str_MergeWith = "Fusionner avec :" ; +static char str_MergeWithPopup = "FontForge va essayer de fusionner toutes les classes d'ancre ayant la même valeur pour \"Fusionner avec\", dans un seul lookup GPOS" ; +static char str_MarkToBaseLig = "Marque sur base, ou\nMarque sur ligature" ; +static char str_MarkToMark = "Marque sur marque" ; +static char str_Cursive = "Cursif" ; +static char str_CursiveAttach = "Attachement cursif" ; + /* Select by att (pst) */ +static char str_SimpSubstitution = "Substitution simple" +static char str_AltSubstitutions = "Substitution alternative" +static char str_MultSubstitution = "Substitution multiple" +static char str_SimpPos = "Déplacement simple" +static char str_PairPos = "Déplacement de paire" +static char str_LigCaret = "Curseur de ligature" +static char str_Kerning = "Crénage" +static char str_VKerning = "Crénage vertical" +static char str_Containing = "Contenu :" +static char str_SelectResults = "Sélection des résultats" ; +static char str_SelectResultsPopup = "Sélectionner dans la fenêtre de fonte les glyphes\ntrouvés par cette recherche" ; +static char str_MergeResults = "Sélection augmentée" ; +static char str_MergeResultsPopup = "Étendre la sélection dans la fenêtre de fonte avec tous les glyphes\ntrouvés par cette recherche" ; +static char str_RestrictSelection = "Sélection restreinte" ; +static char str_RestrictSelectionPopup = "Chercher seulement parmi les glyphes sélectionnés, et déselectionner\nceux qui ne figurent pas dans le résultat de la recherche" ; +static char str_UnknownAnchorClass = "Classe d'ancre inconnue : %.70s" ; +static char str_TooManyTags = "Trop de tags spécifiés" ; +static char str_NoMatch = "Aucun glyphe correspondant" ; + /* Private Info */ +static char str_Bluequest[] = "Cela va changer à la fois BlueValues et OtherBlues.\012Voulez vous continuer ?" ; +static char str_Hstemquest[] = "Cela va changer à la fois StdHW et StemSnapH.\012Voulez vous continuer ?" ; +static char str_Vstemquest[] = "Cela va changer à la fois StdVW et StemSnapV.\012Voulez vous continuer ?" ; +static char str_Arrayquest[] = "Tableau attendu.\012Continuer malgré tout ?" ; +static char str_Numberquest[] = "Nombre attendu.\012Continuer malgré tout ?" ; +static char str_Boolquest[] = "Booléen attendu.\012Continuer malgré tout ?" ; +static char str_Codequest[] = "Code attendu.\012Continuer malgré tout ?" ; +static char str_Badtype[] = "Type incorrect" ; +static char str_Delete[] = "Supprimer" ; +static char mnemonic_Delete[] = 'S' ; + /* Prefs */ +static char str_UTF_8[] = "UTF-8 (Unicode)" ; +static char str_Default[] = "Par défaut" ; +static char *str_PrefsPopupAWS[] = "Changer la chasse d'un glyphe changera\ncelle de tous les glyphes composés à partir de celui-ci." ; +static char *str_PrefsPopupALS[] = "Changer l'approche gauche d'un glyphe modifiera\nl'approche gauche de tous les glyphes composés à partir de celui-ci" ; +static char *str_PrefsPopupForNewFonts[] = "Codage par défaut pour les nouvelles fontes" ; +static char *str_PrefsPopupNES[] = "Taille par défaut du cadratin dans une nouvelle fonte." +static char *str_PrefsPopupNOT[] = "Les nouvelles fontes doivent elles utiliser des courbes\nquadratiques (TrueType) ou cubiques (PostScript & OpenType/CFF) ?" +static char *str_PrefsPopupLFN[] = "Les fontes lues sur le disque doivent-elles conserver leur type de courbes\n(quadratique ou cubique), ou faut-il convertir l'ordre des courbes à la valeur\nchoisie pour les nouvelles fontes ? (cf. NewFontsQuadratic)." +static char *str_PrefsPopupLoc[] = "Jeu de caractères utilisé par le presse-papier,\nle système de fichiers, etc. (seuls les jeux à\n8 bits sont supportés ici)" ; +static char *str_PrefsPopupAH[] = "Calcul de hints avant optimisation de rendu" ; +static char *str_PrefsPopupAHG[] = "Calcul de hints des glyphes modifiés avant de créer la fonte" ; +static char *str_PrefsPopupFN[] = "Nom utilisé pour le champ 'Fondeur'\nlors de la génération des fontes BDF" ; +static char *str_PrefsPopupTFN[] = "Nom utilisé comme 'Identifiant de vendeur', pour\nla génération de fonte TTF (table OS/2).\nQuatre caractères maximum" ; +static char *str_PrefsPopupXU[] = "Si spécifiée, doit être une liste d'entiers séparés par des espaces, tous\ninférieurs à 16777216, qui identifie votre organisation de manière unique.\nFontForge génèrera un nombre aléatoire pour la dernière valeur." ; +static char *str_PrefsPopupRulers[] = "Montre les règles dans la fenêtre de glyphe" ; +static char *str_PrefsPopupSepHints[] = "Contrôles séparés pour les hints horizontaux et verticaux." ; +static char *str_PrefsPopupIC[] = "Dans la fenêtre de glyphe, la touche Majuscules force un déplacement à\nêtre parallèle à l'inclinaison des italiques plutôt qu'à la verticale." ; +static char *str_PrefsPopupAO[] = "Pourcentage de cadratin pour séparer un accent de son glyphe\nde base avec la commande 'Créer glyphes accentués'" ; +static char *str_PrefsPopupGA[] = "Lorsqu'il met un accent grave ou aigu sur une lettre, FontForge\ndoit-il le centrer en tenant compte du point le plus bas\nde l'accent (on), ou en tenant compte de sa largeur (off) ?" ; +static char *str_PrefsPopupCH[] = "Lors du centrage d'un accent sur un glyphe, l'accent doit-il être\ncentré par rapport au point le plus haut du glyphe, ou par rapport\nau milieu du glyphe ?" +static char *str_PrefsPopupAA[] = "Pourcentage de cadratin dont les touches de flèche de déplacement\nvont bouger le point sélectionné" ; +static char *str_PrefsPopupGN[] = "Adobe a affecté les noms 'Delta', 'Omega' et 'Mu'\nrespectivement à 'Increment', 'Ohm' et 'Micro'.\nCeci paraît étrange aux à nos amis Grecs qui\nutilisent ces noms pour désigner des lettres de l'alphabet.\nActiver ce drapeau fait que les lettres de l'alphabet seront\nappelées 'Delta.greek', 'Omega.greek' et 'mu.greek'." ; + /*static char *str_PrefsPopupGF[] = "Adobe a affecté les noms Delta, Omega et Mu aux signes\nIncrément, Ohm et Micro respectivement.\nCela semble très étrange aux dessinateurs de fontes grecques\nqui utilisent ces noms pour les lettres de l'alphabet.\nCes noms sont donc ambigus. FontForge contourne l'ambiguïté\nen créant des fontes avec des glyphes supplémentaires." ;*/ + /* Now called PrefsPopupGN with slightly different text */ +static char *str_PrefsPopupSD[] = "Spécifie la distance de magnétisme\nauprès d'une ligne pertinente (ligne de base, chasse,\ngrille, splines, etc...)." ; +static char *str_PrefsPopupJS[] = "La commande 'Édition->Joindre' joindra les points proches d'au moins\ncette distance. Une valeur de 0 impose que les points coïncident" +static char *str_PrefsPopupBR[] = "Lors de la création d'un ensemble de fontes BDF,\nFontForge doit-il demander la résolution écran, ou\nla deviner en fonction de la taille du pixel ?" ; +static char *str_PrefsPopupPPT[] = "FontForge peut utiliser deux applications externes de véctorisation :\nautotrace et potrace.\nSi votre système n'en a qu'une, FontForge l'utilisera, mais si vous\navez les deux, 'On' privilégiera potrace (et 'Off' autotrace)." +static char *str_PrefsPopupATA[] = "Paramètres supplémentaires à passer à 'autotrace'" ; +static char *str_PrefsPopupATK[] = "Demander à l'utilisateur les paramètres pour 'autotrace' à chaque utilisation" +static char *str_PrefsPopupMFA[] = "Paramètres à passer au programme 'mf' (METAFONT). Le nom de fichier sera donné après." ; +static char *str_PrefsPopupMFK[] = "Demander à l'utilisateur les paramètres pour 'mf' à chaque utilisation" +static char *str_PrefsPopupMFB[] = "FontForge charge de grandes images en arrière-plan des glyphes\navant de les autotracer. Vous pouvez conserver ces images pour\nexaminer le résultat produit par 'mf' (off), ou les enlever (on) pour\néconomiser de la place" +static char *str_PrefsPopupMFE[] = "METAFONT (mf) produit envoie beaucoup de données sur stdout. La plupart du temps,\nc'est sans importance, sauf lorsque quelque chose se passe mal." +static char *str_PrefsPopupG2N[] = "Lors de la création d'une fonte TrueType ou OpenType, il est parfois utile\nde connaître la correspondance entre les indices de glyphes TrueType et\nles noms de glyphe. Cette option fait produire à FontForge un fichier\n(d'extension .g2n) contenant ces informations." ; +static char *str_PrefsPopupPCE[] = "Lors du chargement d'une fonte TrueType ou OpenType contenant à la fois\nun codage Unicode et un codage CJK, cette option permet de spécifier\nquel codage charger." +static char *str_PrefsPopupXRF[] = "Au démarrage, FontForge charge diverses ressources liées à l'écran.\nParfois il est intéressant de lire ces ressources dans un fichier.\nMais elles ne sont lues qu'au démarrage, aussi toute modification\nne prendra effet qu'au prochain redémarrage de FontForge." ; +static char *str_PrefsPopupCMD[] = "Lors d'une copie de glyphe depuis la vue de fonte, copier aussi les\nméta-données du glyphe (nom, codage, commentaire, etc)." +static char *str_PrefsPopupAGA = "Apple et MS/Adobe diffèrent quand au format des fichiers TrueType et OpenType.\nCeci détermine la valeur par défaut de la case à cocher 'Apple' dans le dialogue 'Fichier->Générer fonte(s)'.\nLes principales différences sont :\n une spécification différente pour l'entrée 'PostScript' dans la table 'name' ;\n les données bitmap sont rangées dans des tables différentes ;\n les glyphes composés mis à l'échelle sont traités différemment ;\n utilisation de GSUB à la place de morx(t)/feat ;\n utilisation de GPOS à la place de kern/opbd ;\n utilisation de GDEF à la place de lcar/prop" +static char *str_PrefsPopupAGO = "Apple et MS/Adobe diffèrent quand au format des fichiers TrueType et OpenType.\nCeci détermine la valeur par défaut de la case à cocher 'OpenType' dans le menu 'Fichier->Générer fonte(s)'.\nLes principales différences sont :\n une spécification différente pour l'entrée 'PostScript' dans la table 'name' ;\n les données bitmap sont rangées dans des tables différentes ;\n les glyphes composés mis à l'échelle sont traités différemment ;\n utilisation de GSUB à la place de morx(t)/feat ;\n utilisation de GPOS à la place de kern/opbd ;\n utilisation de GDEF à la place de lcar/prop.\nSi cette case _et_ la case Apple sont cochées, les deux formats sont créés." +static char *str_PrefsPopupUndo = "Nombre max d'annulations stockées pour un glyphe" ; +static char *str_PrefsPopupHLP = "Le répertoire dans lequel FontForge va rechercher ses fichiers d'aide.\nSi ce répertoire ne contient pas les fichiers attendus, FontForge cherchera sur Internet." ; +static char *str_PrefsPopupSAJ = "Lorsque vous glissez des points dans la fenêtre de glyphe, une jonction\npeut se produire : deux contours ouverts se touchent à leurs extrémités.\nSi cette case est cochée, FontForge arrètera alors la sélection\n (comme si vous aviez relâché le bouton de la souris).\nC'est pratique si vos doigts ont un peu tendance à trembler..." +static char *str_PrefsPopupUF = "Recalculer les hints flex après chaque modification" ; +static char *str_Generic[] = "Généralités" ; +static char *str_PrefsFontInfo[] = "Infos fonte" ; +static char *str_PrefsApps[] = "Arguments" ; +static char *str_Editing[] = "Édition" ; +static char *str_Accents[] = "Accents" ; +static char *str_ScriptMenu[] = "Scripts" ; +static char *str_Mac[] = "Mac" ; +static char *str_MenuName[] = "Nom du menu" ; +static char *str_ScriptMenuPopup[] = "Vous pouvez créer un menu de scripts contenant jusqu'à 10 entrées.\nChaque entrée doit comporter un nom à afficher et un nom de script\nà exécuter. Le nom du menu peut contenir des caractères Unicode quelconques.\nLe bouton marqué \"...\" permet de rechercher un fichier de script à exécuter." ; +static char *str_ScriptFile[] = "Fichier de script" ; +static char *str_BrowseForFile[] = "..." ; +static char *str_MenuNameWithNoScript[] = "Item du menu sans script associé" ; +static char *str_ScriptWithNoMenuName[] = "Script sans entrée dans le menu" ; +static char *str_Features = "Fonctionnalités AAT" ; +static char *str_MappingB = "Correspondance AAT <-> OT" ; +static char *str_Feature = "Fonctionnalité" ; +static char *str_FeatureId = "Identifiant :" ; +static char mnemonic_FeatureId = 'o' ; +static char *str_Name = "Nom :" ; +static char mnemonic_Name = 'N' ; +static char *str_ThisFeatureCodeIsAlreadyUsed = "Cet identifiant de fonctionnalité est déjà utilisé" ; +static char *str_BadName = "Nom incorrect" ; +static char *str_Settings = "Sélecteurs" ; +static char *str_Setting = "Sélecteur" ; +static char *str_FeatureC = "Fonctionnalité :" ; +static char mnemonic_FeatureC = 'F' ; +static char *str_Off = "Off :" ; +static char mnemonic_Off = 'O' ; +static char *str_Mutex = "Mutex" ; +static char mnemonic_Mutex = 'M' ; +static char *str_ThisSettingCodeIsAlreadyUsed = "Cet identifiant de sélecteur est déjà utilisé" ; +static char *str_ThisSettingCodeIsAlreadyUsedReuse = "Cet identifiant de sélecteur est déjà utilisé.\nVoulez vous vraiment vous en resservir ?" ; +static char *str_OffNameNull = "Si 'Off-Name' est vide, alors 'Off-Code' doit valoir -1" ; +static char *str_PrefsAppNotice1 = "Normalement FontForge lance les applications en utilisant" +static char *str_PrefsAppNotice2 = "votre variable d'environnement PATH. Si vous souhaitez" +static char *str_PrefsAppNotice3 = "modifier ce comportement, vous pouvez positionner" +static char *str_PrefsAppNotice4 = "des variables avec le chemin complet de l'application." +static char *str_PrefsAppNotice5 = "FontForge reconnaît : BROWSER, MF et AUTOTRACE." +static char *str_PrefsAppNotice6 = "" + /* Hints */ +static char *str_base = "Base :" ; +static unichar_t mnemonic_base = 'B' ; +static char *str_size = "Taille :" ; +static unichar_t mnemonic_size = 'S' ; +static char *str_HStem = "HStem" ; +static unichar_t mnemonic_HStem = 'H' ; +static char *str_VStem = "VStem" ; +static unichar_t mnemonic_VStem = 'V' ; +static char *str_Create = "Créer" ; +static unichar_t mnemonic_Create = 'e' ; +static char *str_PrevArrow = "< Précédent" ; +static unichar_t mnemonic_PrevArrow = 'P' ; +static char *str_NextArrow = "Suivant >" ; +static unichar_t mnemonic_NextArrow = 'N' ; +static char *str_MovePoints = "Déplacer les points" ; +static unichar_t mnemonic_MovePoints = 'M' ; +static char *str_MovePointsPopup = "Quand un hint est déplacé\ndéplacer également tous les points\nqui s'y trouvent" ; +static char *str_CreateHint = "Créer hint..." ; +static char *str_CreateHorizontalHint = "Créer un hint horizontal" ; +static char *str_CreateVerticalHint = "Créer un hint vertical" ; + /* expand stroke */ +static char *str_LineCap = "Extrémité" ; +static char *str_Butt = "Coupé" ; +static unichar_t mnemonic_Butt = 'C' ; +static char *str_Round = "Arrondi" ; +static unichar_t mnemonic_Round = 'A' ; +static char *str_Squareq = "Carré" ; +static unichar_t mnemonic_Squareq = 'R' ; +static char *str_LineJoin = "Raccord" ; +static char *str_Miter = "Carré" ; +static unichar_t mnemonic_Miter = 'c' ; +static char *str_Roundu = "Arrondi" ; +static unichar_t mnemonic_Roundu = 'a' ; +static char *str_Bevel = "Pan coupé" ; +static unichar_t mnemonic_Bevel = 'p' ; +static char *str_StrokeWidth = "Largeur de trait :" ; +static unichar_t mnemonic_StrokeWidth = 'L' ; +static char *str_Strok = "Trait" ; +static unichar_t mnemonic_Strok = 'T' ; +static char *str_Caligraphic = "Calligraphie" ; +static unichar_t mnemonic_Caligraphic = 'C' ; +static char *str_ElipseM = "Ellipse" ; +static unichar_t mnemonic_ElipseM = 'E' ; +static char *str_PenAngle = "Angle de plume :" ; +static unichar_t mnemonic_PenAngle = 'A' ; +static char *str_PenHeightRatio = "Hauteur en %% :" ; +static unichar_t mnemonic_PenHeightRatio = 'H' ; +static char *str_PenHeightRatioPopup = "Une plume à calligraphier a deux dimensions, la largeur\n(réglable avec 'largeur' plus bas) et l'épaisseur\nou hauteur. J'exprime la hauteur en pourcentage de la largeur." ; +static char *str_MinorAxis = "Axe mineur :" ; +static unichar_t mnemonic_MinorAxis = 'x' ; +static char *str_BadStroke = "Mauvais trait" ; +static char *str_StrokeWidthTooBig = "La largeur du trait est si grande que le chemin créé va\nse couper lui même dans %.100hs" ; +static char *str_FreeHand = "À main levée" ; +static char *str_CenterLine = "Ne pas élargir" ; +static char *mnemonic_CenterLine = 'D' ; +static char *str_CenterLinePopup = "La courbe dessinée à main-levée ne sera pas étendue,\nla ligne seule sera conservée." ; +static char *str_Pressure = "Pression :" ; +static char *mnemonic_Pressure = 'P' ; +static char *str_PressurePopup = "Appuyez dans ce carré avec un outil Wacom sensible à la pression\npour régler le seuil de début de pression" ; +static char *str_RmInternalContour = "Ôter le contour intérieur" ; +static char *str_RmExternalContour = "Ôter le contour extérieur" ; +static char *str_NotInternalAndExternal = "Supprimer à la fois les contours intérieur et extérieur n'a pas de sens" ; +static char *str_CleanupSelfIntersect = "Nettoyage des intersections internes" ; +static char *str_CleanupSelfIntersectPopup = "Quand FontForge détecte qu'une courbe va se recouper avec elle même,\nalors activer cette option lui fait essayer d'améliorer les choses\nen supprimant les intersections" ; + /* Auto Width/Kern */ +static char *str_EnterTwoCharRange = "Entrez deux groupes de glyphes" ; +static char *str_ToBeAdjusted = "À ajuster." ; +static char *str_CharsLeft = "Glyphes à gauche" ; +static char *str_CharsRight = "Glyphes à droite" ; +static char *str_All = "Toutes" ; +static char *str_stdCharRange = "A-Za-z0-9" ; +static unichar_t *str_stdCharRangeGreek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '\0' } ; +static unichar_t *str_stdCharRangeCyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '\0' } ; +static char *str_StdCharRangeKernL = "A-Za-z" ; +static char *str_StdCharRangeKernR = "a-z., : ;-" ; +static char *str_StdCharRangeKernR2 = "A-Za-z., : ;-" ; +static unichar_t *str_StdCharRangeKernRCyr = { 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ' :', ' ;', '-', '\0' } ; +static unichar_t *str_StdCharRangeKernR2Cyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ' :', ' ;', '-', '\0' } ; +static unichar_t *str_stdCharRangeKernRGreek = { 0x3b1, '-', 0x3c9, '.', ',', ' :', ' ;', '-', '\0' ' } ; +static unichar_t *str_stdCharRangeKernR2Greek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '.', ',', ' :', ' ;', '-', '\0' ' } ; +static char *str_Selected = "Sélectionnés" ; +static char *str_Spacing = "Espacement" ; +static char *str_TotalKerns = "Crénage total :" ; +static char *str_Threshold = "Seuil :" ; +static char *str_NoCharsSelected = "Aucun glyphe sélectionné." ; +static char *str_KernPairFilePopup = "Rechercher un fichier contenant une liste de paires de crénage.\nDeux caractères par ligne. FontForge considèrera seulement ces paires\npour les infos de crénage." ; +static char *str_LoadKernPairs = "Chargement des paires de crénage" ; +static char *str_NoKernPairs = "Aucune paire de crénage" ; +static char *str_NoKernPairsFile = "Aucune paire de crénage trouvée dans %.200hs" ; + /* Auto Trace */ +static char *str_NothingToTrace = "Rien à tracer" ; +static char *str_NoAutotrace = "Impossible de lancer autotrace" ; +static char *str_NoAutotraceProg = "Impossible de trouver le programme 'autotrace'.\nVous pouvez peut-être donner une valeur à la variable\n d'environnement AUTOTRACE." ; +static char *str_AdditionalAutotraceArgs = "Arguments additionnels pour le programme 'autotrace' :" ; +static char *str_NoMF = "METAFONT n'a pas été trouvé" ; +static char *str_NoMFProg = "Impossible de trouver mf => variable d'environnement METAFONT, ou télécharger depuis :\n http://www.tug.org/\n http://www.ctan.org/\nIl est inclus dans toute distribution TeX/Omega" ; +static char *str_NoTempDir = "Impossible de créer le répertoire temporaire" ; +static char *str_CantRunMF = "Impossible de lancer mf" ; +static char *str_MFHadError = "METAFONT a abandonné la compilation" ; +static char *str_MFBadOutput = "Impossible de lire (ou de trouver) le fichier de sortie de mf" ; + /* Bitmap dlg */ +static char *str_AllChars = "Tous les glyphes" ; +static char *str_SelChars = "Les glyphes sélectionnés" ; +static char *str_CurChar = "Le glyphe courant" ; +static char *str_BadRegenSize = "Essai de génération d'une taille de pixel qui n'a pas été créée : " ; +static char *str_PixelSizes = "Taille en pixels :" ; +static char *str_listPixelSizes = "Liste des tailles actuelles des bitmaps :" ; +static char *str_RemovingSize = " - Effacer une taille la supprimera." ; +static char *str_AddingSize = " - Ajouter une taille la créera." ; +static char *str_AddingSizeScale = " Ajouter une taille la créera par mise à l'échelle." ; +static char *str_SpecifyRegenSizes = "Spécifez les tailles à générer de nouveau" ; +static char *str_PointSizes75 = "Taille en points sur un écran à 75 dpi" ; +static char *str_PointSizes100 = "Taille en points sur un écran à 100 dpi" ; +static char *str_PointSizes96 = "Taille en points sur un écran à 96 dpi" ; +static char *str_PointSizes120 = "Taille en points sur un écran à 120 dpi" ; +static char *str_PointSizes72 = "Taille en points sur un écran à 72 dpi" ; +static char *str_XSizes = "X" ; +static char *str_WinSizes = "Win" ; +static char *str_MacSizes = "Mac" ; +static char *str_UseFreeType = "Utiliser freetype" ; +static char *str_ScalingBitmaps = "Mise à l'échelle des bitmaps" ; +static char *str_CantScaleGreymap = "Impossible de mettre à l'échelle une fonte avec des niveaux de gris" ; +static char *str_CantDeleteAllBitmaps = "Impossible de supprimer tous les bitmaps" ; + /* Bitmap view */ + /* "%s at %d size %d from %s", charactername, encoding, pixelsize, fontname */ +static char *str_BvTitle = "%1$.75hs (%2$d) taille %3$d venant de %4$.75hs" +static char *str_RecalculateBitmaps = "Recalculer bitmaps" ; + /* BV Edit */ +static char *str_skewRatio = "Entrer le rapport largeur/hauteur de l'inclinaison" ; +static char str_BadNumber[] = "Valeur incorrecte" ; + /* Char View */ + /* "%s at %d from %s", charactername, encoding, fontname */ +static char *str_CvTitle = "%1$.80hs (%2$d) venant de %3$.80hs" +static char *str_CantFindGlyph = "Impossible de trouver le glyphe" ; +static char *str_CantRevertGlyph = "Le glyphe %.80hs ne peut être trouvé dans le fichier SFD" ; +static char *str_GlyphHasRefs = "Problèmes avec les références" ; +static char *str_GlyphHasRefsQuestion = "Le glyphe %.40hs contenait des références, mais le codage de fonte a changé. Je ne pourrai probablement pas résoudre ces références correctement. Si je continue, certaines références peuvent être perdues et d'autres pointer vers des glyphes incorrects. Voulez vous continuer malgré tout ?" +static char *str_NameChanged = "Le nom du glyphe a changé" ; +static char *str_NameChangedGlyph = "Le nom du glyphe %.40hs a changé. Voici ce que j'utilise pour trouver le glyphe dans le fichier, aussi je ne peux pas retrouver le glyphe.\n(Vous ne serez plus averti pour les glyphes suivants.)" +static char *str_NotForeground = "Pas l'avant-plan" +static char *str_RefsOnlyFore = "Les références ne peuvent être tirées que vers le avant-plan" + /* CV Export */ +static char *str_PixelSizeQ = "Taille en pixels ?" ; +static char *str_PixelSize = "Taille en pixels :" ; +static char *str_BitsPerPixel = "Bits/pixel :" ; +static char *str_InvalidBits = "Les seules valeurs autorisées pour les bits/pixel sont 1, 2, 4 et 8" ; + /* CV Images */ +static char *str_CantFindFile = "Impossible de trouver le fichier" ; +static char *str_BadXFigFile = "Fichier XFIG incorrect" ; +static char *str_BadImageFile = "Fichier image incorrect" ; +static char *str_BadImageFileName = "Fichier image incorrect : %.100hs" ; +static char *str_BadImageFileNotBitmap = "Fichier image incorrect, pas un bitmap reconnu : %.100hs" ; +static char *str_NothingLoaded = "Rien n'a été chargé" ; +static char *str_NothingSelected = "Rien n'est sélectionné" ; +static char *str_MoreImagesThanSelected = "Plus d'images que de glyphes sélectionnés" ; +static char *str_BadTemplate = "Motif incorrect" ; +static char *str_BadTemplateNoExtension = "Motif incorrect, pas d'extension" ; +static char *str_BadTemplateUnrecognized = "Motif incorrect, format non reconnu" ; +static char *str_UnicodeNotInFont = "Valeur Unicode absente de la fonte" ; +static char *str_UnicodeValueNotInFont = "Valeur Unicode (%x) absente de la fonte, ignorée" ; +static char *str_EncodingNotInFont = "Valeur de codage absente de la fonte" ; +static char *str_EncodingValueNotInFont = "Valeur de codage (%x) absente de la fonte, ignorée" ; +static char *str_Image = "Image" ; +static char *str_TeXBitmap = "Bitmap TeX" ; +static char *str_MacBitmap = "Bitmap Mac" ; +static char *str_Template = "Motif image" ; +static char *str_EPSTemplate = "Motif EPS" ; +static char *str_SVGTemplate = "Motif SVG" ; +static char *str_AsBackground = "En arrière-plan" ; +static char *str_OnlyOneFont = "Seulement une fonte" ; +static char *str_OnlyOneFontBackground = "Une seule fonte peut être importée en arrière-plan" ; + /* CV Palettes */ +static char *str_SizeOfPoints="Taille des points" ; +static char *str_Regular="Régulier" ; +static char *str_Points="Points" ; +static char *str_RRRad="Rayon d'arrondi du rectangle" ; +static char *str_WithinBoundingBox="Tracé selon enveloppe" ; +static char *str_CenterOut="Autour d'un centre" ; +static char *str_Polygon="Polygone" ; +static char *str_Star="Étoile" ; +static char *str_NumPSVert="Nb. sommets (étoile) ou côtés (polygone)" ; + /* V is an abbreviation for "Visible", and E for Editable */ +static char *str_V="V" ; +static char *str_E="É" ; +static char *str_Layer="Calque" ; +static char *str_IsEdit="Ce calque est-il éditable ?" ; +static char *str_IsVis="Ce calque est-il visible ?" ; + /* For Foreground. Should be short */ +static char *str_Fore="Avant-plan" ; +static char *mnemonic_Fore='a' ; +static char *str_Back="Arrière-plan" ; +static char *mnemonic_Back='r' ; +static char *str_Grid="Guide" ; +static char *mnemonic_Grid='G' ; +static char *str_HHints="Hints hor." ; +static char *str_VHints="Hints vert." ; +static char *str_DHints="Hints diag." ; +static char *str_HMetrics="Métriques hor." ; +static char *str_VMetrics="Métriques vert." ; +static char *str_Anchors="Ancres" ; +static char *str_Blues="Blues" ; +static char *str_Bitmap="Bitmap" ; +static char *str_ShapeType = "Définition de forme" ; + /* Popups */ +static char *str_Pointer = "Pointer" ; +static char *str_PopMag = "Agrandir (rétrécir avec alt)" ; +static char *str_FreeCurve = "Dessiner à main-levée" ; +static char *str_ScrollByHand = "Faire défiler à la main" ; +static char *str_AddCurvePoint = "Ajouter un point curviligne" ; +static char *str_AddCornerPoint = "Ajouter un coin" ; +static char *str_AddTangentPoint = "Ajouter un point tangent" ; +static char *str_AddPenPoint = "Ajouter un point, puis glisser pour obtenir ses points de contôle" ; +static char *str_popKnife = "Scinder la courbe" ; +static char *str_popRuler = "Mesurer la distance ou l'angle entre deux points" ; +static char *str_popScale = "Mettre la sélection à l'échelle" ; +static char *str_popFlip = "Appliquer une symétrie à la selection" ; +static char *str_popRotate = "Pivoter la sélection" ; +static char *str_popSkew = "Pencher la sélection" ; +static char *str_popRectElipse = "Rectangle ou ellipse" ; +static char *str_popPolyStar = "Polygone ou étoile" ; +static char *str_popPencil = "Activer/désactiver des pixels" ; +static char *str_popLine = "Tracer une ligne" ; +static char *str_popShift = "Déplacer tout le bitmap" ; +static char *str_popHand = "Faire défiler bitmap" ; + /* Undoes */ +static char *str_BitmapPaste = "Coller bitmap" ; +static char *str_YesToAll = "Oui à tout" ; +static char *mnemonic_YesToAll = 'O' ; +static char *str_NoToAll = "Non à tout" ; +static char *mnemonic_NoToAll = 'N' ; + /* "The clipboard contains a bitmap character of size %d,\na size which is not in your database.\nWould you like to create a bitmap font of that size,\nor ignore this character ?" */ +static char *str_ClipContainsPre = "Le presse-papier contient un glyphe bitmap de taille " ; +static char *str_ClipContainsPost = ",\ntaille qui n'est pas parmi les valeurs actuelles.\nVoulez vous générer une fonte bitmap de cette taille,\nou ignorer ce glyphe" ; +static char *str_Pasting = "Coller..." ; +static char *str_SelfRef = "Glyphe avec auto-référence" +static char *str_AttemptSelfRef = "Vous essayez de créer un glyphe qui se référence lui même" ; +static char *str_BadReference = "Référence incorrecte" ; +static char *str_FontNoRef = "Vous essayer de coller une référence vers %1$hs dans %2$hs.\nMais %1$hs n'existe pas dans cette fonte.\nVoulez vous copier le contour d'origine, ou supprimer la référence ?" ; +static char *str_FontNoRefNoOrig = "Vous essayer de coller une référence vers %1$hs dans %2$hs.\nMais %1$hs n'existe pas dans cette fonte, et FontForge ne trouve pas le glyphe auquel il se référait.\nLe glyphe ne sera pas copié." ; +static char *str_DontWarnAgain = "Ne pas avertir à nouveau" ; +static char *mnemonic_DontWarnAgain = 'W' ; +static char *str_NoVerticalMetrics = "Pas de métriques verticales" ; +static char *str_FontNoVerticalMetrics = "Les métriques verticales ne sont pas activées dans cette fonte" ; +static char *str_DupAnchor = "Ancre en double" ; +static char *str_DupAnchorIn = "Il y a déjà une ancre appelée %$1s dans %$2hs." +static char *str_AnchorLost = "Ancre perdue" ; +static char *str_AnchorLostPaste = "Au moins une ancre s'est perdue lors du collage, car il n'y avait pas de classe d'ancre ad hoc dans la fonte d'arrivée." + /* dump pfa */ +static char *str_CvtPS = "Conversion PostScript" ; + /* encoding */ +static char *str_BadEncFormat = "Format du fichier de codage incorrect" ; +static char *str_PleaseNameEnc = "SVP, nommer ce codage" ; + /* Either insert first, second or third, or the number followed by the "th" string (5th, 6th, etc.) */ + /* Please name the %d/first/second/third encoding in this file" */ +static char *str_PleaseNameEncPre = "SVP, donnez un nom au " ; +static char *str_PleaseNameEncPost = " codage dans ce fichier" ; +static char *str_First = "Premier" ; +static char *str_Second = "Deuxième" ; +static char *str_Third = "Troisième" ; +static char *str_th = "e" ; +static char *str_RemoveEncoding = "Suppression du codage" ; +static char *str_LoadEncoding = "Chargement du codage" ; +static char *str_AdobePUA = "Définitions Adobe pour Usage Public (PUA)." ; +static char *str_Interpretation = "Interprétation :" ; +static char *str_UseCidMap = "Utiliser CMap" ; +static char *str_SearchForCIDMap = "Cette fonte est basée sur le jeu de caractères %1$.20hs-%2$.20hs-%3$d, mais ce que j'ai trouvé de mieux c'est %1$.20hs-%2$.20hs-%4$d.\nUtiliserai-je cette valeur ou préférez vous chercher ?" ; +static char *str_UseIt = "Utilisez la" ; +static char mnemonic_UseIt = 'U' ; +static char *str_Search = "Chercher" ; +static char mnemonic_Search = 'S' ; +static char *str_GiveUp = "Abandonner" ; +static char mnemonic_GiveUp = 'G' ; +static char *str_NoCidmap = "Pas de fichier CMap..." +static char *str_LookForCidmap = "FontForge n'a pas réussi à trouver un fichier CMap pour cette fonte. Ce n'est pas indispensable, mais certaines choses marchent mieux avec. Si vous n'en avez pas, vous pourriez télécharger des CMap depuis :\n http://FontForge.sourceforge.net/cidmaps.tgz\net les installer, décompressées et détarrées dans :\n %.80hs\n\nVoudriez vous rechercher un fichier approprié sur votre disque local ?" +static char *str_AreYouSureCharset = "Êtes vous sûr(e) de ne pas vouloir utiliser le CMap que j'ai trouvé ?" ; +static char *str_FindCharset = "Recherche d'un fichier de table CID..." +static char *str_Browse = "Recherche..." ; +static char mnemonic_Browse = 'B' ; +static char *str_SelectCIDOrdering = "SVP, sélectionnez une table CID" +static char *str_ExtraCharsTitle = "Caractères non interprétés" ; +static char *str_ExtraChars = "Le codage actuel contient des glyphes que FontForge ne sait pas interpréter en tant qu'indices CID.\nFaut-il les supprimer ou les ajouter à la fin (ce qui pourra poser problème avec de futures définitions) ?" ; +static char *str_FindCMap = "Recherche d'un fichier Adobe CMap..." ; +static char *str_NotACIDFont = "Cette fonte n'est pas codée en CID" ; +static char *str_MultipleEncodingIgnored = "Codages multiples ignorés" ; +static char *str_CIDGlyphMultEncoded = "Le glyphe d'indice CID %d est associé à plus de %d codages. Seuls les %d premiers seront pris en compte." ; + + /* fv composit */ +static char *str_MissingChar = "Glyphe manquant..." ; +static char *str_Missingdotlessi="Votre fonte ne contient pas de glyphe 'i non pointé'.\nSVP, ajoutez en un et re-assemblez vos glyphes accentués" ; +static char *str_Missingdotlessj="Votre fonte ne contient pas de glyphe 'j non pointé'.\nSVP, ajoutez en un et re-assemblez vos glyphes accentués" ; + /* fv fonts */ +static char *str_MergingProb = "Problème de fusion" ; +static char *str_MergingFontSelf = "Fusionner une fonte avec elle même ne conduit à rien" ; +static char *str_MergingCIDMismatch = "Lors de la fusion de deux fontes CID, celles-ci doivent avoir les mêmes 'Registry' et 'Ordering', et la fonte d'arrivée doit avoir un 'Supplement' au moins aussi récent que les autres. De plus, cette dernière doit avoir au moins autant de sous-fontes que les autres." +static char *str_Other = "Autre ..." +static char *str_FontToMergeInto = "Fonte à fusionner avec %.20hs" ; +static char *str_InterpolatingProb = "Problème d'interpolation" ; +static char *str_InterpolatingFontSelf = "Interpoler une fonte avec elle même ne conduit à rien" ; +static char *str_InterpolatingFontsDiffOrder = "Interpolation entre fontes avec des courbes de Bézier d'ordres différents (ie. entre PostScript et TrueType)" ; +static char *str_Amount = "Quantité" ; +static char *str_InterpBetween = "Interpolation entre %.20hs et :" ; +static char *str_by = "de" ; + /* fv metrics */ +static char *str_SetWidthTo = "Fixer largeur :" ; +static char *str_SetLBearingTo = "Fixer approche gauche :" ; +static char *str_SetRBearingTo = "Fixer approche droite :" ; +static char *str_SetVWidthTo = "Fixer chasse verticale :" ; +static char *str_IncrWidthBy = "Augmenter chasse :" ; +static char *str_IncrLBearingBy = "Augmenter approche gauche :" ; +static char *str_IncrRBearingBy = "Augmenter approche droite :" ; +static char *str_IncrVWidthBy = "Augmenter chasse verticale :" ; +static char *str_ScaleWidthBy = "Coéfficient chasse :" ; +static char *str_ScaleLBearingBy = "Coéfficient approche gauche :" ; +static char *str_ScaleRBearingBy = "Coéfficient approche droite :" ; +static char *str_ScaleVWidthBy = "Coéfficient chasse verticale :" ; +static char *str_Plain = "Régulier" ; + /* Import bdf */ +static char *str_PixelSizeFont = "Quelle est la taille en pixel de la fonte contenue dans ce fichier ?" ; +static char *str_CouldNotOpenFile = "Lecture du fichier impossible" +static char *str_CouldNotOpenFileName = "Impossible de lire le fichier %.200hs" +static char *str_NotBdfFile = "Pas un fichier BDF" +static char *str_NotBdfFileName = "Pas un fichier BDF %.200hs" +static char *str_NotPkFile = "Pas un fichier PK" +static char *str_NotPkFileName = "Pas un fichier PK (METAFONT) %.200hs" +static char *str_NotGfFile = "Pas un fichier GF" +static char *str_NotGfFileName = "Pas un fichier GF (METAFONT) %.200hs" +static char *str_NotPcfFile = "Pas un fichier PCF" +static char *str_NotPcfFileName = "Pas un fichier PCF X11 %.200hs" +static char *str_LoadingFrom = "Chargement depuis %.100hs" ; +static char *str_DuplicateName = "Nom déjà existant" ; +static char *str_DuplicateCharName = "Nom de glyphe (%hs) déjà existant dans la fonte" ; + /* problems */ +static char *str_ProbOpenPath = "Les deux points sélectionnés sont les extrémités d'un chemin ouvert" ; +static char *str_ProbPointsTooClose = "Les deux points sélectionnés sont trop proches" ; +static char *str_ProbMissingExtreme = "La courbe sélectionnée n'a pas de point à au moins l'une de ses extrémités" ; +static char *str_ProbXNear = "La'abscisse du point sélectionné est proche de la valeur de consigne" ; +static char *str_ProbYNear = "L'ordonnée du point sélectionné est proche de la valeur de consigne" ; +static char *str_ProbYBase = "L'ordonnée du point sélectionné est proche de la ligne de base" ; +static char *str_ProbYXHeight = "L'ordonnée du point sélectionné est proche de la hauteur des bas-de-casse" ; +static char *str_ProbYCapHeight = "L'ordonnée du point sélectionné est proche de la hauteur des majuscules" ; +static char *str_ProbYAs = "L'ordonnée du point sélectionné est proche de la hauteur des ascendantes" ; +static char *str_ProbYDs = "L'ordonnée du point sélectionné est proche de la profondeur des descendantes" ; +static char *str_ProbLineHor = "Le segment sélectionné est presque horizontal" ; +static char *str_ProbLineVert = "Le segment sélectionné est presque vertical" ; +static char *str_ProbLineItal = "Le segment sélectionné est proche de la pente des italiques" ; +static char *str_ProbAboveHor = "Le point de contrôle au-dessus du point sélectionné est presque horizontal" ; +static char *str_ProbAboveVert = "Le point de contrôle au-dessus du point sélectionné est presque vertical" ; +static char *str_ProbAboveItal = "Le point de contrôle au-dessus du point sélectionné est proche de l'inclinaison des italiques" ; +static char *str_ProbBelowHor = "Le point de contrôle au-dessous du point sélectionné est presque horizontal" ; +static char *str_ProbBelowVert = "Le point de contrôle au-dessous du point sélectionné est presque vertical" ; +static char *str_ProbBelowItal = "Le point de contrôle au-dessous du point sélectionné est proche de la pente des italiques" ; +static char *str_ProbLeftHor = "Le point de contrôle à gauche du point sélectionné est presque horizontal" ; +static char *str_ProbLeftVert = "Le point de contrôle à gauche du point sélectionné est presque vertical" ; +static char *str_ProbLeftItal = "Le point de contrôle à gauche du point sélectionné est proche de la pente des italiques" ; +static char *str_ProbRightHor = "Le point de contrôle à droite du point sélectionné est presque horizontal" ; +static char *str_ProbRightVert = "Le point de contrôle à droite du point sélectionné est presque vertical" ; +static char *str_ProbRightItal = "Le point de contrôle à droite du point sélectionné est proche de la pente des italiques" ; +static char *str_ProbPtNearHHint = "Le point sélectionné est proche d'un hint de montant" ; +static char *str_ProbPtNearVHint = "Le point sélectionné est proche d'un hint de transverse" ; +static char *str_ProbHintHWidth = "Ce glyphe contient un hint horizontal proche de la largeur du glyphe" ; +static char *str_ProbHintVWidth = "Ce glyphe contient un hint vertical proche de la chasse verticale du glyphe" ; +static char *str_ProbHintControl = "Ce hint n'est utilisé par aucun point" ; +static char *str_ProbHint3Width = "Ce hint a une largeur incorrecte pour un triple hint" ; +static char *str_ProbHint3Spacing = "Les blancs intérieurs entre ces hints n'ont pas exactement la même largeur, ce qui ne convient pas pour un triple hint" ; +static char *str_ProbHint3Four = "Ce glyphe a quatre hints, mais en enlevant celui-ci, cela conviendrait pour un triple hint" +static char *str_NoProbHint3 = "Ce glyphe peut utiliser un triple hint" ; +static char *str_ProbExpectedCounter = "Ce chemin devrait aller en sens inverse des aiguilles d'une montre" ; +static char *str_ProbExpectedClockwise = "Ce chemin devrait aller dans le sens des aiguilles d'une montre" ; +static char *str_ProbFlippedRef = "Cette référence a été miroitée, aussi les contours qu'elle contient sont tracés à contre sens" +static char *str_ProbTooManyPoints = "Il y a plus de points dans ce glyphe que le maximum autorisé" ; +static char *str_ProbTooDeepRefs = "Il y a des références imbriquées dans ce glyphe, plus profondes qu'il n'est autorisé" ; +static char *str_ProbTooManyHints = "Il y a plus de hints dans ce glyphe que le maximum autorisé" ; +static char *str_ProbMissingBitmap = "Ce glyphe en contour n'a pas de pendant bitmap" +static char *str_ProbMissingOutline = "Ce glyphe en contour vide a bizarrement un pendant bitmap" +static char *str_ProbBadWidth = "La chasse de ce glyphe est différente de la chasse standard" +static char *str_ProbBadVWidth = "La chasse verticale de ce glyphe est différente de la chasse verticale standard" +static char *str_ProbAboveOdd = "Le point de contrôle au-dessus du point sélectionné est en dehors du chemin" ; +static char *str_ProbBelowOdd = "Le point de contrôle au-dessous du point sélectionné est en dehors du chemin" ; +static char *str_ProbRightOdd = "Le point de contrôle à droite du point sélectionné est en dehors du chemin" ; +static char *str_ProbLeftOdd = "Le point de contrôle à gauche du point sélectionné est en dehors du chemin" ; +static char *str_ProbCIDMult = "Ce glyphe est défini dans plus d'une des sous-fontes CID" ; +static char *str_ProbCIDBlank = "Ce glyphe n'est défini dans aucune des sous-fontes CID" ; +static char *str_ProbIrrelCP = "Ce glyphe contient des points de contrôle trop proches des points du tracé pour permettre de modifier la courbe" ; +static char *str_ProbBadSubs = "Ce glyphe contient une substitution ou une ligature qui référence un glyphe vide" +static char *str_ProbBadSubs2 = "'%2$c%3$c%4$c%5$c' fait référence à un glyphe vide \"%1$.20hs\"" ; +static char *str_ProbExplain = "Explication des problèmes" ; +static char *str_GlyphPSTTag = "Le glyphe %1$.50hs avec %2$hs et tag '%3$c%4$c%5$c%6$c'" ; +static char *str_GlyphMacPSTTag = "Glyphe %1$.50hs avec %2$hs et fonctionnalité <%3$d,%4$d>" ; +static char *str_FPSTKernTag = "%1$hs avec tag '%2$c%3$c%4$c%5$c'" ; +static char *str_MacASMTag = "%1$hs avec fonctionnalité <%2$d,%3$d>" ; +static char *str_RefersToMissingGlyph = " référence un glyphe manquant" +static char *str_RefersToMissingLookup = " référence un tag de lookup manquant" +static char *str_ReplaceWith = "Remplacer par :" +static char *str_Always = "Toujours" +static char *str_AlwaysPopup = "Toutes les occurences de ce nom de glyphe\ndoivent être remplacées comme indiqué ici" +static char *str_Skip = "Sauter" +static char *str_Fix = "Corriger" ; +static char *str_Stop = "Stop" ; +static char *mnemonic_Stop = 'S' ; +static char *str_Next = "Suivant" ; +static char *mnemonic_Next = 'N' ; +static char *str_OpenPaths = "Chemins ouverts" ; +static char *mnemonic_OpenPaths = 'P' ; +static char *str_OpenPathsPopup = "Tous les chemins devraient être fermés,\nil ne devrait pas y avoir d'extrémité isolée" ; +static char *str_Points2Close = "Points trop proches" ; +static char *mnemonic_Points2Close = 't' ; +static char *str_Points2ClosePopup = "Si deux points adjacents sur le même chemin sont trop proches,\ncertaines commandes de FontForge pourraient poser des problèmes.\nCependant, le problème ne se retrouve pas en PostScript." ; + /*static char *str_MissingExtrema = "Missing Extrema" ; + /*static char *mnemonic_MissingExtrema = 'E' ; + /*static char *str_MissingExtremaPopup = "Ghostview (perhaps other interpreters) has a problem when a\nhint exists without any points that lie on it. Usually this is because\nthere are no points at the extrema" ;*/ +static char *str_XNear = "X environ" ; +static char *mnemonic_XNear = 'X' ; +static char *str_XNearPopup = "Permet de vérifier que les montants de plusieurs\nglyphes commencent au même endroit." ; +static char *str_YNear = "Y environ" ; +static char *mnemonic_YNear = 'Y' ; +static char *str_YNearPopup = "Permet de vérifier que les traverses de plusieurs\nglyphes commencent au même endroit" ; +static char *str_YNearStd = "Y proche de la hauteur standard" ; +static char *mnemonic_YNearStd = 'S' ; +static char *str_YNearStdPopup = "Permet de trouver les points légèrement à coté\nde la ligne de base, de la hauteur des bas-de-casse, de celle des capitales,\ndes ascendantes ou des descendantes." ; +static char *str_LineStd = "Bords presque horizontaux ou verticaux" ; +static char *str_LineStd2 = "Bords presque horizontaux/verticaux/italiques" ; +static char *mnemonic_LineStd = 'E' ; +static char *str_LineStdPopup = "Pour trouver les lignes qui sont presque,\nmais pas tout à fait, horizontales ou verticales\n(ou qui sont inclinées comme les italiques)." ; +static char *str_CpStd = "Points de contrôle quasiment horiz./vert." ; +static char *str_CpStd2 = "Points de contrôle quasiment horiz./vert./ital." ; +static char *mnemonic_CpStd = 'C' ; +static char *str_CpStdPopup = "Permet de trouver les points de contrôle qui forment presque,\nmais pas tout à fait une horizontale ou une verticale avec leur\npoint de base (ou de même pente que les italiques)." ; +static char *str_CpOdd = "Points de contrôle en dehors de la courbe" ; +static char *mnemonic_CpOdd = 'b' ; +static char *str_CpOddPopup = "Permet de trouver les points de contrôle qui après projection\nsur la courbe sont à l'extérieur des points adjacents" ; +static char *str_HintNoPt = "Hints ne contrôlant aucun point" ; +static char *mnemonic_HintNoPt = 'H' ; +static char *str_HintNoPtPopup = "Ghostview (et peut-être d'autres logiciels) a un problème quand\nun hint existe mais ne s'applique à aucun point." ; +static char *str_PtNearHint = "Points proches d'un hint" ; +static char *mnemonic_PtNearHint = 'P' ; +static char *str_PtNearHintPopup = "Souvent quand un point est voisin d'un hint, c'est parce qu'un\nmontant est composé de plusieurs segments, et que la largeur\nde l'un d'entre eux est incorrecte." ; +static char *str_HintWidth = "Largeur de hints : environ" ; +static char *mnemonic_HintWidth = 'W' ; +static char *str_HintWidthPopup = "Permet de vérifier que les montants ont des largeurs homogènes..." ; +static char *str_Hint3 = "Presque un triple hint" ; +static char *mnemonic_Hint3 = '3' ; +static char *str_Hint3Popup = "Regarde si ce glyphe est presque, mais pas exactement,\nconforme aux spécifications d'un triple hint.\nC'est-à-dire, que soit verticalement soit horizontalement, il doit y avoir\nexactement 3 hints, de même largeur, et espacés régulièrement." +static char *str_ShowExactHint3 = "Montrer les triples hints exacts" ; +static char *mnemonic_ShowExactHint3 = 'S' ; +static char *str_ShowExactHint3Popup = "Montrer si ce glyphe est exactement un triple hint" ; +static char *str_CheckDirection = "Chemins extérieurs dans le sens horaire" ; +static char *mnemonic_CheckDirection = 'o' ; +static char *str_CheckDirectionPopup = "PostScript et TrueType demandent que les chemins soient traçés\ndans le sens horaire. Ceci vous permet de faire cette vérification." ; +static char *str_CheckFlippedRefs = "Vérifier les références miroitées" ; +static char *mnemonic_CheckFlippedRefs = 'r' ; +static char *str_CheckFlippedRefsPopup = "PostScript et TrueType demandent que les chemins soient traçés\ndans le sens horaire. Si vous avez une référence qui a été miroitéée,\nles chemins de cette référence sont probablement dans le mauvais sens.\nVous devez défaire le lien et appliquer 'Corriger la direction' dessus." ; +static char *str_MorePointsThan = "Nombre max de points :" +static char *mnemonic_MorePointsThan = 'p' ; +static char *str_MorePointsThanPopup = "Le manuel de référence du PostScript (Annexe B) dit qu'un\ninterpréteur n'est pas obligé de traiter des chemins avec plus de 1500 points.\nJe pense que cela inclut les points de contrôle. Du point de vue de PostScript,\ntous les contours d'un glyphe constituent un seul chemin. Les interpréteurs\nmodernes ont tendance à dépasser cette limite.\n(Attention, le nombre de points d'une fonte TrueType après conversion en PostScript\nsera doublé)" ; +static char *str_RefsDeeperThan = "Imbrication max :" +static char *mnemonic_RefsDeeperThan = 'd' ; +static char *str_RefsDeeperThanPopup = "La spécification des charstring de type 2 (Annexe B) stipule que\nles sous-procédures ne doivent pas avoir plus de 10 niveaux d'imbrication.\nChaque niveau d'imbrication des réferences utilise un niveau de sous-procédure,\net les hints peuvent encore utiliser un autre niveau." ; +static char *str_MoreHintsThan = "Nombre max hints :" +static char *mnemonic_MoreHintsThan = 'h' ; +static char *str_MoreHintsThanPopup = "La spécification des charstring de type 2 (Annexe B) stipule qu'il\nne peut y avoir plus de 96 hints horizontaux ou verticaux dans un\nglyphe." ; +static char *str_CheckBitmaps = "Vérifier les bitmaps manquants" ; +static char *mnemonic_CheckBitmaps = 'b' ; +static char *str_CheckBitmapsPopup = "Y a-t-il des glyphes n'ayant pas de bitmap dans l'une des fontes bitmap ?\nInversement, y a-t-il des glyphes bitmaps n'ayant pas leurs pendants vectoriels ?" +static char *str_CIDMultiple = "Recherche des CID définis 2 fois." ; +static char *mnemonic_CIDMultiple = 'O' ; +static char *str_CIDMultiplePopup = "Verifier si un CID est défini dans plus d'une sous-fonte" ; +static char *str_CIDBlank = "Rechercher les CID non définis" ; +static char *mnemonic_CIDBlank = 'O' ; +static char *str_CIDBlankPopup = "Vérifier si un CID n'est défini dans aucune sous-fonte" ; +static char *str_MissingGlyph = "Vérifier les noms de glyphes manquants" ; +static char *mnemonic_MissingGlyph = 'n' ; +static char *str_MissingGlyphPopup = "Vérifie si une substitution, une classe de crénage, etc.,\nutilise un nom de glyphe qui n'existe pas dans la fonte" +static char *str_MissingLookupTag = "Vérifier les tags de lookup manquants" ; +static char *mnemonic_MissingLookupTag = 't' ; +static char *str_MissingLookupTagPopup = "Vérifie si un élément dans une substitution ou dans un déplacement contextuels référence un élément manquant dans la fonte" +static char *str_IrrelevantFactor = "Facteur de non-pertinence :" ; +static char mnemonic_IrrelevantFactor = 'F' ; +static char *str_IrrelevantFactorPopup = "Un point de contrôle est non pertinent si la distance entre lui et son point extême\nest moins que la distance entre les 2 points extrêmes divisée par ce facteur" ; +static char *str_IrrelevantCP = "Vérifier les points de contrôle non pertinents" ; +static char mnemonic_IrrelevantCP = 'P' ; +static char *str_IrrelevantCPPopup = "Un point de contrôle n'est pas pertinent s'il est trop proche de son point principal\npour faire une différence significative sur le tracé de la courbe" ; +static char *str_PointsNear = "Points 'proches' si à moins de " ; +static char *mnemonic_PointsNear = 'N' ; +static char *str_Near = "Near" ; +static char *str_ExplainErr = "S'arrête après chaque erreur et explique" ; +static char *mnemonic_ExplainErr = 'A' ; +static char *str_IgnoreProblemFuture = "Ignorer ce problème à l'avenir" ; + /* "Found %g, expected %g" */ +static char *str_Found = "Trouvé " ; +static char *str_Expected = ", attendu " ; +static char *str_Paths = "Chemins" ; +static char *str_Random = "Divers" ; +static char *str_ATT = "ATT" ; +static char *str_PointsNoC = "Points" ; +static char *str_Refs = "Références" ; +static char *str_ClearAll = "Effacer tout" ; +static char *str_SetAll = "Sélectionner tout" ; +static char *str_AdvanceWidth = "Vérifier la chasse :" ; +static char *str_AdvanceWidthPopup = "Vérifier les glyphes dont la chasse n'est pas la valeur indiquée." +static char *str_AdvanceVWidth = "Vérifier la chasse verticale : +static char *str_AdvanceVWidthPopup = "Vérifier les glyphes dont la chasse verticale n'est pas la valeur indiquée." +static char *str_SubsToEmptyChar = "Vérifier les substitutions par des glyphes vides" ; +static char *str_SubsToEmptyCharPopup = "Chercher les glyphes contenant des entrées 'GSUB' pointant vers des glyphes vides" + /* Meta font */ +static char *str_MetaFont = "Metafonte..." ; +static char mnemonic_MetaFont = 'M' ; +static char *str_CounterTooSmallT = "Contre-poinçon trop petit" ; +static char *str_CounterTooSmall = "Le contre-poinçon demandé était trop petit, il a été augmenté à sa valeur minimum" ; +static char *str_Simple = "Simple" ; +static char *str_Advanced = "Avancée" ; +static char *str_Embolden = "Graisser" ; +static char *str_Condense = "Condenser" ; +static char *str_Expand = "Élargir" ; +static char *str_Stems = "Stems" ; +static char *str_HCounters = "Contrepoinçons hor." ; +static char *str_VCounters = "Contrepoinçons vert." ; +static char *str_StemScale = "Mettre montants à l'échelle :" ; +static char *str_CounterScale = "Mettre contre-poinçons à l'échelle :" ; +static char *str_XHeightFrom = "Hauteur des bas-de-casse depuis :" ; +static char *str_To = "Jusqu'à :" ; +static char *str_MetamorphosingFont = "Métamorphose ..." ; + /* to ttf */ +static char *str_PickFont = "Choisissez une fonte, n'importe laquelle..." ; +static char *str_MultipleFontsPick = "Il y a plusieurs fontes dans ce fichier, choisissez-en une" ; +static char *str_AutoHintingFont = "Optimisation de rendu font, par hints..." ; +static char *str_AutoInstructingFont = "Auto-instruction de fonte..." ; +static char *str_SavingOpenTypeFont = "Enregistrer la fonte OpenType" ; +static char *str_LoadBitmapFonts = "Charger fonte bitmap ?" ; +static char *str_LoadTTFBitmaps = "Voulez vous chargez la fonte bitmap contenue dans ce fichier (True/Open)Type ?\n(Si oui, laquelle.)" ; +static char *str_BadEncoding = "Codage défectueux" ; +static char *str_ExtraneousSingleByte = "Il y a un caractère sur un octet (%d) utilisant un emplacement pour caractères à deux octets" ; +static char *str_OutOfEncoding = "Il y a un caractère (%d) qui ne peut être codé" ; +static char *str_NotNormallyEncoded = "Il y a un caractère (%d) qui n'est normalement pas dans le codage" ; +static char *str_NoEncodedChars = "Aucun caractère codé" ; +static char *str_NoUnicodeEncoding = "Cette fonte ne contient aucun caractère codé Unicode.\nLe résultat ne sera probablement pas utilisable." ; +static char *str_NoUnicodeEncodingUseSymbol = "Cette fonte ne contient aucun caractère codé Unicode.\nVoulez vous utiliser un codage \"Symbol\" à la place d'Unicode ?" ; + /* tottfgpos */ +static char *str_MultipleLookup = "Lookups multiples" ; +static char *str_MultipleLookupLong = "Des lookups multiples ont été produits pour l'ancre '%s', un seul sera utilisé" ; +static char *str_MissingLookup = "Lookup manquant" ; +static char *str_MissingLookupLong = "Un lookup imbriqué pour le tag '%s' n'a pas été trouvé. La fonte ainsi créée ne sera pas utilisable. Essayez 'Élément->Rechercher problèmes'" + /* Spline Fill */ +static char *str_Rasterizing = "Création des bitmaps en cours..." ; +static char *str_GenBitmap = "Génération d'une fonte bitmap" ; +static char *str_GenAntiAlias = "Génération d'une fonte en niveaux de gris" ; + /* "%d pixels" (for the size of the font being rasterized) */ +static char *str_Pixels = " pixels" ; + /* print */ +static char *str_PrintingFont = "Impression de la fonte" ; +static char *str_GeneratingPostScriptFont = "Génération d'une fonte PostScript" ; +static char *str_FailedGenPost = "Échec de génération de fonte PostScript" ; +static char *str_PageSetup = "Configuration de mise en page" ; +static char *str_Setup = "Configuration" ; +static char mnemonic_Setup = 'e' ; +static char *str_Other2 = "Autre" ; +static char mnemonic_Other = 'o' ; +static char *str_PrintOtherPopup = "N'importe quelle commande avec tous ses arguments.\nLa commande doit être prévue pour traiter une fonte PostScript\nqu'elle trouvera en lisant son entrée standard." ; +static char *str_ToFile = "Vers un fichier" ; +static char mnemonic_ToFile = 'F' ; +static char *str_PageSize = "Page :" ; +static char mnemonic_PageSize = 'S' ; +static char *str_Copies = "Copies :" ; +static char mnemonic_Copies = 'C' ; +static char *str_Printer = "Imprimante :" ; +static char mnemonic_Printer = 'P' ; +static char *str_PrintToFile = "Impression dans un fichier..." ; +static char *str_Pointsize = "Taille :" ; +static char mnemonic_Pointsize = 'P' ; +static char *str_FullFont = "Fonte complète" ; +static char mnemonic_FullFont = 'F' ; +static char *str_FullFontPopup = "Affiche tous les glyphes de la fonte dans une grille à une taille donnée" ; +static char *str_FullPageChar = "Glyphe pleine page" ; +static char mnemonic_FullPageChar = 'C' ; +static char *str_FullPageChars = "Glyphes pleine page" ; +static char mnemonic_FullPageChars = 'C' ; +static char *str_FullPageCharPopup = "Affiche tous les glyphes de la fonte, à raison d'un par page,\ndans une taille extrêmement grande" ; +static char mnemonic_SampleText = 'S' ; +static char *str_SampleTextC = "Échantillon de texte :" ; +static char mnemonic_SampleTextC = 'T' ; +static char *str_MultiSizeChar = "Glyphe, tailles multiples" ; +static char mnemonic_MultiSizeChar = 'M' ; +static char *str_MultiSizeChars = "Glyphes, tailles multiples" ; +static char mnemonic_MultiSizeChars = 'M' ; +static char *str_MultiSizeCharPopup = "Afficher tous les glyphes sélectionnés, en plusieurs tailles" ; +static char *str_SampleTextPopup = "Imprimer le texte ci dessous dans la(les) taille(s) spécifiée(s)" +static char *str_FailedOpenTemp = "Échec d'ouverture d'un fichier de sortie temporaire" ; +static char *str_NoCommandSpecified = "Aucune commande specifiée" ; +static char *str_InvalidPointsize = "Taille de point invalide" ; + /* alignment */ +static char *str_CoordinateAlongWhich = "Espacement dans quelle direction" ; +static char *str_X = "H" ; +static char mnemonic_X = 'H' ; +static char *str_Y = "V" ; +static char mnemonic_Y = 'V' ; +static char *str_MaximumDistanceBetweenPts = "Distance maximum entre points dans une région" ; +static char mnemonic_MaximumDistanceBetweenPts = 'M' ; +static char *str_NotEnoughLines = "Pas assez de lignes" ; +static char *str_CantParallel = "Parallélisation impossible" ; +static char *str_ShareCommonEndpoint = "Ces 2 lignes partagent une extrémité, je ne peux pas les rendre parallèles." ; + /* parsettf */ +static char *str_ReadingNames = "Lecture des noms" ; +static char *str_FixingupReferences = "Traitement des références" ; +static char *str_NoBitmaps = "Pas de bitmap" ; +static char *str_NoBitmapsInTTF = "Pas de bitmap (utilisable) dans cette fonte TTF : %hs" ; +static char *str_NotInCollection = "Pas dans la collection" ; +static char *str_FontNotInCollection = "%hs n'est pas dans %.100hs" ; +static char *str_UntitledAnchor_n = "Ancre-%d" ; +static char *str_TTFGlyf = "TTF 'glyf'" ; +static char *str_OTFCFF = "OTF 'CFF '" ; +static char *str_GlyfAndCFF = "Cette fonte contient à la fois une table TrueType 'glyf' et une table OpenType 'CFF '. FontForge ne peut en utiliser qu'une à la fois, aussi il faut choisir :" ; + /* sfd */ +static char *str_Saving = "Enregistrement..." ; +static char *str_SavingDb = "Enregistrement du fichier de courbes de Bézier" ; +static char *str_SavingOutlines = "Enregistrement des contours" ; +static char *str_SavingBitmaps = "Enregistrement des images" ; +static char *str_RecoveryFailed = "Échec de la récupération" ; +static char *str_RecoveryOfFailed = "Échec de la récupération automatique des changements dans %.80hs.\nFontForge doit-il essayer à nouveau à son prochain lancement ?" ; +static char *str_TryAgain = "Essayer à nouveau" ; +static char *str_ForgetIt = "Oublier" ; + /* start.c */ +static char *str_FontForge = "FontForge" ; + /* cvpointer.c */ +static char *str_NegativeWidth = "Largeur négative" ; +static char *str_NegativeWidthCheck = "Les glyphes de chasse négative ne sont pas autorisés dans les fontes TrueType.\nVoulez vous vraiment une chasse négative ?" ; + /* hanyang.c */ +static char *str_Hangul = "Hangoul" ; +static char mnemonic_Hangul = 'H' ; +static char *str_NewComposition = "Nouvelle composition..." ; +static char mnemonic_NewComposition = 'N' ; +static char *str_ModifyComposition = "Modifier la composition..." ; +static char mnemonic_ModifyComposition = 'M' ; +static char *str_BuildSyllables = "Construction de syllabes" ; +static char mnemonic_BuildSyllables = 'B' ; +static char *str_ChoSung = "Cho-sung" ; +static char *str_JungSung = "Jung-sung" ; +static char *str_JongSung = "Jong-sung" ; +static char *str_ChoSungC = "Cho-sung :" ; +static char *str_JungSungC = "Jung-sung :" ; +static char *str_JongSungC = "Jong-sung :" ; +static char *str_Mapping = "Correspondance..." ; +static char mnemonic_Mapping = 'M' ; +static char *str_Width = "Chasse" ; +static char mnemonic_Width = 'L' ; +static char *str_WidthC = "Chasse :" ; +static char mnemonic_WidthC = 'L' ; +static char *str_WidthDDD = "Chasse..." ; +static char mnemonic_WidthDDD = 'L' ; +static char *str_Reset = "Rétablir" ; +static char *str_LoadFrom = "Chargement depuis..." ; +static char mnemonic_LoadFrom = 'C' ; +static char *str_BadWidth = "Chasse incorrecte" ; +static char *str_BadGroup = "Groupe incorrect" ; +static char *str_JamoHoleTitle = "Variante de glyphe inusitée" ; +static char *str_JamoHole = "Pour le groupe %d dans %s, la variante de glyphe %d est remplacée par %d.\nContinuer vraiment ?" ; +static char *str_NoRules = "Pas de règle" ; +static char *str_FileHasNoRules = "%.100hs ne contient pas de règle de composition" ; +static char *str_DeleteNo = "Supprimer" ; /* With no mnemonic */ + /* Need a different mnemonic */ +static char *str_AddAll = "Ajouter tout" ; +static char mnemonic_AddAll = 'd' ; +static char *str_DisplayCompositions = "Afficher les compositions..." ; +static char mnemonic_DisplayCompositions = 'D' ; +static char *str_NoGroups = "Cette variante de jamo n'est jamais utilisée" ; +static char *str_UniVarient = "Position Unicode %04X, variante %d, %s" ; +static char *str_BuildingKoreanFont = "Construction d'une fonte coréenne" ; + /* Transform */ +static char *str_CharacterOrigin = "Origine du glyphe" ; +static char *str_CenterOfSelection = "Centre de la sélection" ; +static char *str_LastPress = "Dernier appui" ; +static char *str_DoNothing = "Ne rien faire" ; +static char *str_MoveDDD = "Déplacer..." ; +static char *str_RotateDDD = "Pivoter..." ; +static char *str_ScaleDDD = "Mise à l'échelle..." ; +static char *str_ScaleUniformlyDDD = "Mise à l'échelle uniforme..." ; +static char *str_FlipDDD = "Symétrie..." ; +static char *str_SkewDDD = "Inclinaison..." ; +static char *str_TransformBackground = "Transformation de l'arrière-plan aussi" ; +static char mnemonic_TransformBackground = 'B' ; +static char *str_Warning = "Attention" ; +static char *str_RotateSkewWarning = "Après une rotation ou une transformation de glyphe, vous devriez probablement refaire 'Élément->Ajouter extremum'" ; + /* scripting */ +static char *str_Call = "Appel..." ; +static char mnemonic_Call = 'a' ; +static char *str_CallScript = "Appel d'un script" ; + /* start (about box) */ +static char *str_FreePress = "Une presse libre défavorise les illettrés." ; +static char *str_GaudiamusLigature = "Gaudeamus ligatur !" ; +static char *str_InTheBeginning = "Au commencement était la Lettre..." ; +static char *str_LovelyFonts = "Mon triste destin :\n une collection de jolies fontes,\n mais rien à dire." ; + /* search */ +static char *str_SearchPattern = "Motif de recherche :" ; +static char *str_ReplacePattern = "Motif de remplacement :" ; +static char *str_Allow = "Autorise :" ; +static char *str_Flipping = "Symétrie" ; +static char *str_Scaling = "Mise à l'échelle" ; +static char *str_Rotating = "Rotation" ; +static char *str_AllowTransPopup = "Trouve une concordance même si le motif sélectionné doit\nêtre transformé à l'aide d'une combinaison des\ntransformations suivantes." ; +static char *str_SearchSelected = "Recherche des glyphes sélectionnés" ; +static char *str_SearchSelectedPopup = "Recherche seulement parmi les glyphes sélectionnés dans la vue.\nNormalement, la recherche se fait sur tous les glyphes de la fonte." ; +static char *str_Find = "Trouver" ; +static char *str_FindIn = "Trouver dans %.100hs" ; +static char *str_FindNext = "Trouver le suivant" ; +static char *str_FindAll = "Tout trouver" ; +static char *str_ReplaceFind = "Remplacer/trouver" +static char *str_ReplaceAll = "Tout remplacer" +static char *str_BadRefInSearchRpl = "Dans %1$s, il y a une référence vers %2$.20hs qui n'existe pas dans la nouvelle fonte.\nFaut-il supprimer la référence ?" ; +static char *str_NotFound = "Non trouvé" +static char *str_PatternNotFound = "Le motif cherché n'a pas été trouvé dans la fonte %.100hs" ; +static char *str_PatternNotFoundAgain = "Le motif cherché n'a pas été trouvé à nouveau dans la fonte %.100hs" ; +static char *str_FindReplace = "Trouver/remplacer" +static char *mnemonic_FindReplace = "i" ; + + /* combinaisons */ +static char *str_SelectLigature = "Sélectionner une ligature à visionner" +static char *str_SortBy = "Trier par :" +static char *str_FirstChar = "Glyphe à gauche" +static char *str_SecondChar = "Glyphe à droite" +static char *str_KernSize = "Valeur du crénage" + + /* tilepath */ +static char *str_Center_ = "Centrer" ; +static char mnemonic_Center_ = 'e' ; +static char *str_CenterPopup = "La tuile (venant du presse papier) doit être centrée sur le chemin" +static char *str_Left = "Gauche" ; +static char mnemonic_Left = 'G' ; +static char *str_LeftPopup = "La tuile (venant du presse papier) doit être placée à gauche du chemin\ncomme le chemin est tracé depuis son point de début vers son point final" +static char *str_Right = "Right" ; +static char mnemonic_Right = 'R' ; +static char *str_RightPopup = "La tuile (venant du presse papier) doit être placée à droite du chemin\ncomme le chemin est tracé depuis son point de début vers son point final" +static char *str_Tile = "Tuile" ; +static char mnemonic_Tile = 'T' ; +static char *str_TilePopup = "Plusieurs copies de la sélection doivent être empilées sur le chemin" +static char *str_Scale = "Mise à l'échelle" ; +static char mnemonic_Scale = 'S' ; +static char *str_ScalePopup = "La sélection doit être mise à l'échelle, de façon à\ncorrespondre à la longueur du chemin" +static char *str_TileScale = "Mise à l'échelle & tuile" ; +static char mnemonic_TileScale = 'a' ; +static char *str_TileScalePopup = "Un nombre entier de sélections seront utilisées pour recouvrir le chemin.\nSi la taille du chemin n'est pas un multiple exact de la hauteur\nde la sélection, celle-ci sera légèrement mise à l'échelle" + /* Display fonts */ +static char *str_AA = "AA" ; +static char mnemonic_AA = 'A' ; +static char *str_AAPopup = "Glyphes en niveaux de gris, ou bitmap" ; +static char *str_PixelSizePopup = "Indique la taille en pixel du glyphe à l'affichage" ; +static char *str_FormatPopup = "Spécifie le format de fichier à passer à freetype\n PFB -- format PostScript de type 1 standard\n TTF -- format TrueType\n HTTF-- TrueType instruit\n OTF -- format OpenType\n bitmap -- freetype n'est pas utilisé\n Les bitmaps doivent déjà exister\n FontForge -- utiliser le moteur de rendu de FontForge, et non celui de\n freetype. En dernier recours uniquement" ; +static char *str_BadSize = "Taille incorrecte" ; +static char *str_RequestedSizeNotAvail = "La taille demandée pour les bitmaps n'est pas dans la fonte. Sont disponibles : %hs" ; +static char *str_BadFont = "Fonte incorrecte" ; + /* Mac specific */ +static char *str_LeaveX = "Quitter X" ; +static char *str_LeaveXLong = "Un navigateur est probablement déjà en train de tourner dans une fenêtre native du Mac. Vous devez quitter X pour le voir. Essayez Cmd-Opt-A" ; +static char *str_NoATM = "La fonte créée ne fontionnera pas avec ATM" ; +static char *str_BadEncodingForATM = "ATM nécessite que la fonte soit codée sous codage MacRoman. Cette fonte PostScript s'imprimera bien, mais à l'écran on ne verra que des bitmaps" ; + /* Simplifydlg */ +static char *str_RemoveExtrema = "Autorise suppression des extrémités" ; +static char mnemonic_RemoveExtrema = 'r' ; +static char *str_RemoveExtremaPopup = "Normalement, la simplification n'entraîne pas la suppression des points aux extrémités des\ncourbes (PostScript comme TrueType suggèrent de conserver ces points)" ; +static char *str_ChangeSlopes = "Autorise la modification des pentes" ; +static char mnemonic_ChangeSlopes = 's' ; +static char *str_ChangeSlopesPopup = "Normalement, la simplification ne change pas la pente du tracé." ; +static char *str_ErrorLimit = "Erreur max :" ; +static char mnemonic_ErrorLimit = 'E' ; +static char *str_EmUnits = "unités par cadratin" ; +static char *str_CurveSmoothing = "Autorise le lissage des courbes" ; +static char mnemonic_CurveSmoothing = 'c' ; +static char *str_CurveSmoothingPopup = "La simplification examine les coins dont les points de contrôle\nsont presque colinéaires, et les lisse en points curvilignes" +static char *str_IfTan = "Si tangente inf. à" +static char *str_SnapToHV = "Arrondi horizontal/vertical" ; +static char mnemonic_SnapToHV = 'n' ; +static char *str_SnapToHVPopup = "Si la pente d'un point adapté est quasiment horizontale ou verticale\narrondir à la droite" +static char *str_FlattenBumps = "Lisser les bosses sur les lignes" +static char mnemonic_FlattenBumps = 'b' ; +static char *str_FlattenBumpsPopup = "Si une ligne a une bosse, effacer cette bosse" ; +static char *str_IfSmallerThan = "Si inférieures à" ; +static char *str_BumpSize = "Taille de bosse" ; + /* ttfinstrs */ +static char *str_TTFInstructionsFor = "Instructions TrueType pour %.50hs" +static char *str_Parse = "Analyser" +static char mnemonic_Parse = 'P' ; +static char *str_ParseError = "Erreur dans l'analyse" ; +static char *str_MissingLParenCvt = "Manque '(' dans la commande pour obtenir un index CVT" ; +static char *str_MissingRParenCvt = "Manque ')' dans la commande pour obtenir un index CVT" ; +static char *str_NeedPushCount = "Nombre attendu pour un compteur d'empilage" +static char *str_InvalidPushCount = "Le compteur d'empilage doit être compris entre 0 et 255" +static char *str_ExtraPushes = "Plus de push indiqués que nécessaire" ; +static char *str_InvalidUnsignedByte = "La valeur dans un empilage d'octet doit être comprise entre 0 et 255" ; +static char *str_MissingPushes = "Empilages manquants" ; +static char *str_MissingRBracket = "Parenthèse fermante absente dans la commande (ou valeur binaire incorrecte dans la parenthèse)" +static char *str_BracketNumTooBig = "La valeur entre parenthèses est trop grande" +static char *str_InvalidShort = "Une valeur de 'short' doit être comprise dans [-32768,32767]" +static char *str_InstrChanged = "Les instructions ont changé" ; +static char *str_AskInstrChanged = "Les instructions pour %.80hs ont changé. Voulez vous perdre ces modifications ?" + /* cvgridfit.c */ +static char *str_DPI = "DPI :" ; +static char mnemonic_DPI = 'P' ; +static char *str_ShowGridFit = "Montrer adaptation à la grille des pixels" ; +static char mnemonic_ShowGridFit = 'G' ; +static char *str_FreeTypeParams = "Paramètres d'adaptation à la grille des pixels" ; +static char *str_NoByteCode = "Interpréteur de bytecode manquant" ; +static char *str_NoByteCodeMsg = "Ces résultats sont ceux de l'optimisateur de rendu de freetype. Ils ne reflètent pas l'action des instructions TrueType." +static char *str_Debug = "Débogage" ; +static char mnemonic_Debug = 'D' ; +static char *str_Debugfpgm = "Débogage de tables 'fpgm'/'prep'" ; +static char mnemonic_Debugfpgm = 'f' ; +static char *str_StepPopup = "Un pas dédans" ; +static char *str_NextPopup = "Un pas par dessus (suivant)" ; +static char *str_StepOutOfPopup = "Sortie de la fonction courante" ; +static char *str_ContinuePopup = "Continuer" ; +static char *str_WatchPointPopup = "Voir tous les points sélectionnés\n(s'arrêter si un point bouge)" ; +static char *str_TooManyBreakpoints = "Trop de points d'arrêt" ; +static char *str_NoWatchPoints = "Pas de points d'observation" ; +static char *str_NoWatchPointsWithRefs = "Les points d'observation ne sont pas supportés dans les glyphes ayant des références" ; +static char *str_HitWatchPoint = "Point d'observation atteint" ; +static char *str_HitWatchPointn = "Le point %d a été déplacé par l'instruction précédente" +static char *str_TTRegisters = "Registres (TrueType)" ; +static char *str_TTStack = "Pile (TrueType)" ; +static char *str_TTStorage = "Aire de stockage (TrueType)" ; +static char *str_TTPoints = "Coordonnées de points (TrueType)" ; +static char *str_TTCvt = "CVT (TrueType)" ; +static char *str_Registers = "Registres" ; +static char *str_Stack = "Pile" ; +static char *str_Storage = "Aire de stockage" ; +static char *str_Cvt = "CVT" ; +static char *str_Twilight = "Zone de pénombre" ; +static char *str_Normal = "Normal" ; +static char *str_Current = "Courant" ; +static char *str_Original = "Original" ; +static char *str_GridUnit = "Grille" ; +static char *str_EmUnit = "Unités par cadratin" +static char *str_ExitDebugger = "Sortir du débogueur" + /* showatt */ +static char *str_NoAdvancedTypography = "Pas de table de typographie avancée" ; +static char *str_AppleAdvancedTypography = "Typographie avancée Apple" ; +static char *str_Empty = "Vide" ; +static char *str_Entry = "Entrée (%d,%d)" ; +static char *str_Exit = "Sortie (%d,%d)" ; +static char *str_MarkAnchorNamePos = "%.30s (%d,%d)" +static char *str_MarkLigComponentNamePos = "Composant %d %.30s (%d,%d)" +static char *str_MarkCharNamePos = "%.30hs (%d,%d)" +static char *str_MarkClassS = "Classe de marque %.20s" +static char *str_BaseCharacters = "Glyphes de base" ; +static char *str_BaseLigatures = "Ligatures de base" ; +static char *str_BaseMarks = "Marques de base" ; +static char *str_OTFLanguage = "Langue" ; +static char *str_OTFScript = "Système d'écriture" ; +static char *str_RequiredFeature = "Fonctionnalité nécessaire" ; + /* Metricsview */ +static char *str_NewKernClassEntry = "Cette paire de crénage (%.20hs et %.20hs) est dans une classe de crénage\navec un déplacement de 0 pour cette combinaison. Voulez-vous modifier cette partie\nde la classe de crénage (ou créer une nouvelle paire rien que pour ces 2 glyphes) ?" ; +static char *str_NewKernClassEntTitle = "Utiliser la classe de crénage ?" +static char *str_MetricsTitle = "Métriques pour %.50hs" ; + /* Kernclass */ +static char *str_KernClass = "Classe de crénage" ; +static char *str_ClassCnt = "Nombre de classes :" ; +static char *str_ClassIndex = "Indice de classe :" ; +static char *str_SelectClass = "Choisir la classe" ; +static char *str_FromSelection = "Depuis la sélection" ; +static char *str_Set = "Définir" ; +static char *str_SetFromSelectionPopup = "Utiliser cette classe pour sélectionner les glyphes dans la fenêtre de fonte" ; +static char *str_Select_nom = "Sélectionner" ; +static char *str_SelectFromClassPopup = "Les glyphes sélectionnés dans la fenêtre de fonte deviennent les glyphes de cette classe" ; +static char *str_KernOffset = "Valeur du crénage :" ; +static char *str_AlreadyUsed = "Déjà utilisé" ; +static char *str_AlreadyInClass = "Ce glyphe %.30hs est déjà dans une autre classe. Voulez vous le supprimer de l'autre classe, ou de celle-ci ?" +static char *str_FromOld = "De l'autre" ; +static char *str_FromThis = "De celle-ci" ; +static char *str_SelectAScript="Sélectionner un script SVP" ; +static char *str_ClassZero = "Classe 0" +static char *str_ClassZeroOffsets = "Les paires de crénage pour la classe 0 (\"tout le reste\") devraient toujours être à 0" + /* nonlineartrans */ +static char *str_BadToken = "Mot-clé incorrect" ; +static char *str_BadNameToken = "Mot-clé \"%.30hs\" incorrect\naprès ...%40hs" ; +static char *str_BadTokenExpected = "Mot-clé incorrect. J'attendais \"%.10hs\" trouvé \"%.10hs\"\nprès de ...%40hs" ; +static char *str_BadTokenExpectedChar = "Mot-clé incorrect. J'attendais \"%.10hs\"\nprès de ...%40hs" ; +static char *str_BadTokenChar = "Mot-clé incorrect. J'ai trouvé \"%c\"\nprès de ...%40hs" ; +static char *str_UnexpectedToken = "Mot-clé inattendu\ndevant ...%40hs" ; +static char *str_UnexpectedTokenAtEnd = "Mot-clé inattendu en fin d'expression\ndevant ...%40hs" ; +static char *str_BadValue = "Valeur incorrecte" ; +static char *str_BadLogarithem = "Essai de calcul du log de %g dans %.30hs" ; +static char *str_BadSqrt = "Essai de calcul de la racine carrée de %g dans %.30hs" ; +static char *str_DivideByZero = "Essai de division par 0 dans %.30hs" ; +static char *str_XExpr = "X expr :" ; +static char *str_YExpr = "Y expr :" ; +static char *str_ExprPopup = "Ces expressions peuvent contenir les opérateurs +,-,*,/,%,^ (élévation à la puissance), et ? : Elles peuvent aussi contenir certaines fonctions simples. Les nombre x et y sont des réels.\nExemples :\n x^3+2.5*x^2+5\n (x-300)*(y-200)/100\n y+sin(100*x)" + /* effects */ +static char *str_Gap = "Intervalle :" ; +static char mnemonic_Gap = 'I' ; +static char *str_Outlining = "'Contour extérieur' des glyphes" ; +static char *str_Inlining = "'Contour intérieur' des glyphes" ; +static char *str_Shadowing = "Ombrage des glyphes" ; +static char *str_ShadowLen = "Taille de l'ombre :" ; +static char *str_LightAngle = "Angle d'éclairage :" ; +static char *str_OutlineWidth = "Largeur du contour :" ; + /* histogram */ +static char *str_SumAround = "Somme autour :" ; +static char *str_BarWidth = "Épaisseur de barre :" ; +static char *str_StemHistPopup = "Épaisseur : %d\nNombre : %d\nPourcentage du max : %d%%\n" ; +static char *str_StemHistSumPopup = "Épaisseur : %d-%d (%d)\nNombre : %d (%d)\nPourcentage du max : %d%%\n" ; +static char *str_BlueHistPopup = "Position : %d\nNombre : %d\n" ; +static char *str_BlueHistSumPopup = "Position : %d-%d (%d)\nNombre : %d (%d)\n" ; +static char *str_BlueMsg = "Les valeurs de blues vont par paires. Sélectionnez en une autre." ; +static char *str_SmallerNumberFirstInBlues = "Le nombre le plus petit doit être sélectionné en premier dans une paire de valeurs de blues" ; +static char *str_TinySelection = "Petite sélection" ; +static char *str_TinySelectionFull = "Il y a trop peu de glyphes sélectionnés, à mon avis,\npour calculer l'aspect de la fonte de manière significative. Si vous\ndéselectionnez tout, cette commande sera appliquée à tous les glyphes" ; + /* contextchain */ +static char *str_ByGlyphs = "Par glyphes" ; +static char *str_ByClasses = "Par classes" ; +static char *str_ByCoverage = "Par tables de couverture" ; +static char *str_Match = "Motif" ; +static char *str_Backtrack = "Pré-chaîne" ; +static char *str_Lookahead = "Post-chaîne" ; +static char *str_RuleCnt = "Nb de règles :" ; +static char *str_CurrentRule = "Règle courante :" ; +static char *str_SetGlyphsFromSelectionPopup = "Sélectionne dans la fenêtre de fonte les glyphes de cette liste" ; +static char *str_SelectFromGlyphsPopup = "Prendre les glyphes sélectionnés dans la fenêtre de fonte pour contenu de cette liste" ; +static char *str_MatchLen = "Même longueur :" +static char *str_CurrentPos = "Position actuelle :" +static char *str_Replacements = "Remplacements" +static char *str_OTCCSubFormat1 = "Dans OpenType, les lookups contextuels peuvent prendre 3 formes" +static char *str_OTCCSubFormat2 = " Le contexte peut être spécifié soit comme" +static char *str_OTCCSubFormat3 = " une chaîne de glyphes spécifiques, une liste de classes de glyphes," +static char *str_OTCCSubFormat4 = " ou une liste de tables de couverture." ; +static char *str_OTCCSubFormat5 = "FontForge supporte seulement l'édition des formes 1 et 3." ; +static char *str_OTCCSubFormat6 = " Pour la forme 1, vous devez spécifier un ensemble de noms de glyphes." +static char *str_OTCCSubFormat7 = " Pour la forme 3, vous devez spécifier un ensemble" +static char *str_OTCCSubFormat8 = " dont chaque élément peut contenir plusieurs noms de glyphes." +static char *str_OTCCSubFormat9 = "Pour étendre les lookups contextuels vous devez spécifier des pré-chaînes et des post-chaînes" +static char *str_OTCCSubFormat10= "" ; +static char *str_BadCoverage = "Table de couverture incorrecte" ; +static char *str_BadCoverageLong = "Une table de couverture doit contenir au moins un nom de glyphe,\net les noms de glyphes doivent être des noms PostScript valides" ; +static char *str_BadGlyphList = "Motif de glyphes incorrect" ; +static char *str_BadMatchGlyphLong = "Un motif de glyphes doit contenir au moins un nom de glyphe,\net les noms de glyphes doivent être des noms PostScript valides" ; +static char *str_BadBackGlyphList = "Pré-chaîne incorrecte" ; +static char *str_BadForeGlyphList = "Post-chaîne incorrecte" ; +static char *str_BadGlyphNameListLong = "Les noms de glyphes doivent être des noms PostScript valides" ; +static char *str_BadSeqLookup = "Mauvaise liste de lookups" ; +static char *str_MissingSeqLookup = "Il doit y avoir au moins une entrée dans la liste de lookups" ; +static char *str_MissingRules = "Règles manquantes" ; +static char *str_MustBeRule = " Il doit y avoir au moins une règle contextuelle" ; +static char *str_MissingMatch = "Il doit y avoir au moins une table de couverture" ; +static char *str_MatchCntWrong = "Dans une substitution contextuelle à contresens, il doit y avoir exactement une table de couverture" ; +static char *str_ReplacementMismatch = "Dans une substitution contextuelle à contresens, il doit y avoir exactement autant de règles qu'il y a de noms dans la table de couverture correspondante" ; +static char *str_RplMismatch = "Erreur de règle" ; +static char *str_Sequence = "Indice dans la chaîne du motif :" ; +static char *str_Classes = "Classes" ; +static char *str_SeqLookup = "Lookup" ; +static char *str_SeqLookList= "Une liste ordonnée d'indices de glyphe et de tags de fonctionnalité"; +static char *str_AGlyphList = "Une liste de glyphes :" ; +static char *str_GlyphLists = "Liste de listes de glyphes :" ; +static char *str_ACoverageTable = "Une table de couverture :" ; +static char *str_CoverageList = "Une liste de tables de couverture :"; +static char *str_ClassListOfListsOfGlyphNames = "Classes (listes des listes de noms de glyphe)" ; +static char *str_ListOfClassNumbers = "Liste des numéros de classes" ; +static char *str_ListOfListsOfClassNumbers = "Liste des listes de numéros de classe" ; +static char *str_BadClassLong = "Une classe doit contenir au moins un nom de glyphe, qui doit être un nom PostScript valide, et aucun glyphe ne doit apparaître dans une autre classe" ; +static char *str_BadClassName = "Aucun glyphe ne doit apparaître dans une autre classe, contrairement à : %.30s" ; +static char *str_MatchClass = "Classes de motif" ; +static char *str_BacktrackClass = "Classes de pré-chaîne" ; +static char *str_LookaheadClass = " Classes de post-chaîne" ; +static char *str_EndOfText = "Classe 0 : {Fin de texte}" ; +static char *str_EverythingElse = "Classe 1 : {N'importe quoi d'autre}" ; +static char *str_DeletedGlyph = "Classe 2 : {Glyphe supprimé}" ; +static char *str_EndOfLine = "Classe 3 : {Fin de ligne}" ; +static char *str_SameAsMatchClasses = "Classes d'identité avec motif" ; +static char str_MissingClassMember = "Le membre de classe \"%.20hs\" ne se trouve pas dans cette fonte,\nest-ce bien ce que vous souhaitez ?" ; +static char str_NoGlyphNamed = "Il n'y a pas de glyphe \"%.20hs\" dans cette fonte,\nest-ce exprès ?" ; +static char *str_BadClassNumber = "Numéro de classe de motif incorrect" ; +static char *str_BadBackClassNumber = "Numéro de classe de pré-chaîne incorrect" ; +static char *str_BadLookClassNumber = "Numéro de classe de post-chaîne incorrect" ; +static char *str_InvalidCharInClassNumber = "La liste des numéros de classe ne doit contenir que des chiffres et des espaces" ; +static char *str_ClassNumberOutOfRange = "Il n'y a que %d classes dans cet ensemble de classes, et vous +essayez d'utiliser la %d."; +static char *str_NoMatchClassNumber = "Il n'y a pas de numéro de classe à utiliser. Il doit y en avoir au +moins un."; + + /* Mac enc */ + /* Windows languages have locales attached, mac languages don't. Hence we use different strings for them */ +static char str_MacEnglish = "Anglais" ; +static char str_MacFrench = "Français" ; +static char str_MacGerman = "Allemand" ; +static char str_MacItalian = "Italien" ; +static char str_MacDutch = "Néerlandais" ; +static char str_MacSwedish = "Suédois" ; +static char str_MacSpanish = "Espagnol" ; +static char str_MacDanish = "Danois" ; +static char str_MacPortuguese = "Portugais" ; +static char str_MacNorwegian = "Norvégien" ; +static char str_MacHebrew = "Hébraïque" ; +static char str_MacJapanese = "Japonais" ; +static char str_MacArabic = "Arabe" ; +static char str_MacFinnish = "Finnois" ; +static char str_MacGreek = "Grec (monotonique)" ; +static char str_MacIcelandic = "Islandais" ; +static char str_MacMaltese = "Maltais" ; +static char str_MacTurkish = "Turc" ; +static char str_MacCroatian = "Croate" ; +static char str_MacTraditionalChinese = "Chinois traditionnel" ; +static char str_MacUrdu = "Ourdou" ; +static char str_MacHindi = "Hindi" ; +static char str_MacThai = "Thaï" ; +static char str_MacKorean = "Coréen" ; +static char str_MacLithuanian = "Lituanien" ; +static char str_MacPolish = "Polonais" ; +static char str_MacHungarian = "Hongrois" ; +static char str_MacEstonian = "Estonien" ; +static char str_MacLatvian = "Letton" ; +static char str_MacSami = "Sami (lappon)" ; +static char str_MacFaroese = "Féroïen (islandais)" ; +static char str_MacFarsi = "Persan" ; +static char str_MacRussian = "Russe" ; +static char str_MacSimplifiedChinese = "Chinois simplifié" ; +static char str_MacFlemish = "Flamand" ; +static char str_MacIrish = "Gaélique d'Irlande" ; +static char str_MacAlbanian = "Albanais" ; +static char str_MacRomanian = "Roumain" ; +static char str_MacCzech = "Tchèque" ; +static char str_MacSlovak = "Slovaque" ; +static char str_MacSlovenian = "Slovène" ; +static char str_MacYiddish = "Yiddish" ; +static char str_MacSerbian = "Serbe" ; +static char str_MacMacedonian = "Macédonien" ; +static char str_MacBulgarian = "Bulgare" ; +static char str_MacUkrainian = "Ukrainien" ; +static char str_MacByelorussian = "Biélorusse" ; +static char str_MacUzbek = "Ouszbek" ; +static char str_MacKazakh = "Kazakh" ; +static char str_MacAxerbaijaniC = "Axéri (cyrillique)" ; +static char str_MacAxerbaijaniA = "Axéri (arabe)" ; +static char str_MacArmenian = "Arménien" ; +static char str_MacGeorgian = "Géorgien" ; +static char str_MacMoldavian = "Moldave" ; +static char str_MacKirghiz = "Kirghiz" ; +static char str_MacTajiki = "Tadjik" ; +static char str_MacTurkmen = "Turkmène" ; +static char str_MacMongolianM = "Mongol (mongol)" ; +static char str_MacMongolianC = "Mongol (cyrillique)" ; +static char str_MacPashto = "Pachto" ; +static char str_MacKurdish = "Kurde" ; +static char str_MacKashmiri = "Kashmiri" ; +static char str_MacSindhi = "Sindhi" ; +static char str_MacTibetan = "Tibétain" ; +static char str_MacNepali = "Népalais" ; +static char str_MacSanskrit = "Sanskrit" ; +static char str_MacMarathi = "Marathe" ; +static char str_MacBengali = "Bengali" ; +static char str_MacAssamese = "Assamais" ; +static char str_MacGujarati = "Goudjrati" ; +static char str_MacPunjabi = "Pendjabi" ; +static char str_MacOriya = "Oriya" ; +static char str_MacMalayalam = "Malais" ; +static char str_MacKannada = "Kannada" ; +static char str_MacTamil = "Tamoul" ; +static char str_MacTelugu = "Télougou" ; +static char str_MacSinhalese = "Singhalais" ; +static char str_MacBurmese = "Birman" ; +static char str_MacKhmer = "Khmer" ; +static char str_MacLao = "Lao" ; +static char str_MacVietnamese = "Viêtnamien" ; +static char str_MacIndonesian = "Indonésien" ; +static char str_MacTagalog = "Tagalog" ; +static char str_MacMalayR = "Malais (latin)" ; +static char str_MacMalayA = "Malas (arabe)" ; +static char str_MacAmharic = "Amharique" ; +static char str_MacTigrinya = "Tigrinya" ; +static char str_MacGalla = "Galla" ; +static char str_MacSomali = "Somali" ; +static char str_MacSwahili = "Swahili" ; +static char str_MacKinyarwanda = "Kinyarwanda/Rouandais" ; +static char str_MacRundi = "Rundi" ; +static char str_MacNyanja = "Nyanja/Chewa" ; +static char str_MacMalagasy = "Malgache" ; +static char str_MacEsperanto = "Espéranto" ; +static char str_MacWelsh = "Gallois" ; +static char str_MacBasque = "Basque" ; +static char str_MacCatalan = "Catalan" ; +static char str_MacLatinLang = "Latin" ; +static char str_MacQuechua = "Quéchua" ; +static char str_MacGuarani = "Guarani" ; +static char str_MacAymara = "Aymara" ; +static char str_MacTatar = "Tatar" ; +static char str_MacUighur = "Ouïgour" ; +static char str_MacDzongkha = "Dzongkha" ; +static char str_MacJavanese = "Javanais (latin)" ; +static char str_MacSundanese = "Sondanais (latin)" ; +static char str_MacGalician = "Galicien" ; +static char str_MacAfrikaans = "Afrikaans" ; +static char str_MacBreton = "Breton" ; +static char str_MacInuktitut = "Inuktitut" ; +static char str_MacScottish = "Gaélique écossais" ; +static char str_MacManx = "Gaélique mannois" ; +static char str_MacIrishDot = "Gaélique irlandais (pointé)" ; +static char str_MacTongan = "Tongan" ; +static char str_MacGreekPolytonic = "Grec (régulier)" ; +static char str_MacGreenlandic = "Groenlandais" ; +static char str_MacAzebaijani = "Azéri (latin)" ; + /* End of mac language list */ +static char *str_LanguageC = "Langue :" ; +static char mnemonic_LanguageC = 'L' ; +static char *str_BadLanguage = "Langue incorrecte" ; +static char *str_SettingId = "Id. de sélecteur :" ; +static char *str_MutuallyExclusive = "S'excluant mutuellement" ; +static char *str_Enabled = "Activé par défaut" ; +static char mnemonic_Enabled = 'A' ; +static char *str_ThisSettingIsAlreadyUsed = "Ce sélecteur est déjà utilisé" ; + /* apple statemachine */ +static char *str_FeatureSetting = "Fonctionnalité, sélecteur :" ; +static char *str_StartOfInput = "{Début}" ; +static char *str_StartOfLine = "{Début de ligne}" ; +static char *str_EditStateTransition = "Éditer les transitions d'état" ; +static char *str_AdvanceToNextGlyph = "Aller au glyphe suivant" ; +static char *str_MarkCurrentGlyph = "Marquer le glyphe courant" ; +static char *str_MarkCurrentGlyphAsFirst = "Marquer glyphe courant comme premier" ; +static char *str_MarkCurrentGlyphAsLast = "Marquer glyphe courant comme dernier" ; +static char *str_CurrentGlyphIsKashida = "Le glyphe courant se comporte comme une keshideh" ; +static char *str_MarkedGlyphIsKashida = "Le glyphe marqué se comporte comme une keshideh" ; +static char *str_InsertBeforeCurrentGlyph = "Insérer avant le glyphe courant" ; +static char *str_InsertBeforeMarkedGlyph = "Insérer avant le glyphe marqué" ; +static char *str_NoChange = "Pas de changement" ; +static char *str_CurrentInsert = "Insertion courante :" ; +static char *str_MarkInsert = "Insertion à la marque :" ; +static char *str_CurrentSubs = "Substitution courante :" ; +static char *str_MarkSubs = "Substitution à la marque :" ; +static char *str_NextState = "Prochain état :" ; +static char *str_TooManyGlyphs = "Trop de glyphes" ; +static char *str_AtMost31Glyphs = "31 glyphes max dans une liste d'insertion" ; +static char *str_BadFeatureSetting = "Fonctionnalité et sélecteur mauvais" ; +static char *str_FeatureSettingFor = "Fonctionnalité/sélecteur pour :" ; +static char *str_VerticalOnly = "Vertical uniquement" ; +static char *str_ConvertFromOpenType = "Convertir depuis OpenType..." ; +static char *str_Convert = "Convertir..." ; +static char *str_NothingToConvert = "Rien à convertir" ; + /* typographic features dlgs */ +static char *str_NoFeaturesRemoved = "Aucune fonctionnalité ôtée" ; +static char *str_NoFeaturesCopied = "Aucune fonctionnalité copiée" ; +static char *str_NoFeaturesRetagged = "Aucune fonctionnalité n'a changé de tag" ; +static char *str_AnyFlags = "N'importe quels drapeaux" ; +static char *str_TheseFlags = "Ces drapeaux" ; +static char *str_AnyScript = "N'importe quel système d'écriture" ; +static char *str_BadTag = "Tag incorrect" ; +static char *str_RetagWith = "Remplacer tag par..." ; +static char *str_NoSelectedFont = "Pas de fonte sélectionnée" ; + +static char *str_AtMost8Kerns = "Maximum 8 paires de crénage peuvent être spécifiées ici"; +static char *str_Degree = "\260"; +static char *str_Dist = "Dist"; +static char *str_GeneratingPostscriptFont = "Génération de fonte PostScript"; +static char *str_KernValues = "Valeurs de crénage :"; +static char *str_KernsMustBeEven = "Les valeurs de crénage doivent être paires"; +static char *str_NextCPAngle = "PdeC ang. suiv."; +static char *str_NextCPDist = "PdeC dist. suiv."; +static char *str_OpenPostscript = "Ouvrir fonte"; +static char *str_PrevCPAngle = "PdeC ang. préc."; +static char *str_PrevCPDist = "PdeC dist. préc."; +static char *str_PushCurrentGlyph = "Pousser glyphe courant sur la pile"; +static char *str_Russian = "Russe ru_RU"; +static char *str_TooManyKerns = "Trop de crénages"; +static char *str_Type = "Type :"; +static unichar_t mnemonic_InsertCharA[] = 'C'; +static unichar_t mnemonic_InsertCharB[] = 'B'; +static char mnemonic_PointsNear = 'N'; +static unichar_t mnemonic_ReplaceChar[] = 'R'; +static char mnemonic_RevertSubs = 'R'; +static char str_InsertCharA[] = "Insérer glyphe après..."; +static char str_InsertCharB[] = "Insérer glyphe avant..."; +static char str_ReplaceChar[] = "Remplacer glyphe..."; +static char str_RevertSubs = "Inverser substitution"; + +static char *str_ChangeLength = "Changer longueur"; +static char *str_EnterNewLength = "De combien d'entrées la table CVT doit-elle disposer ?"; +static char *str_Fpgm = "'fpgm'"; +static char *str_Glyph = "Glyphe"; +static char *str_Prep = "'prep'"; +static char str_Editcvt[] = "Éditer 'cvt '..."; + +static char str_NewDDD_fem[] = "Nouvelle..."; +static unichar_t mnemonic_NewDDD_fem[] = 'N'; +static char *str_None_fem ="Aucune"; +static char mnemonic_None_fem ='A'; + +static char *mnemonic_UsedDFLTscript = 'D'; +static char *str_Automatic = "Automatique"; +static char *str_BaseGlyph = "Glyphe de base"; +static char *str_Component = "Composante"; +static char *str_GlyphClass = "Classe OT de glyphe :"; +static char mnemonic_GlyphClass = 'G'; +static char *str_HandleErasers = "Gestion des effaceurs"; +static char *str_HandleErasersPop = "Certains logiciels utilisent des plumes à encre blanche, qui fonctionnent comme des effaceurs\nSi vous cochez cette case, FontForge va essayer de simuler ce comportement."; +static char *str_MarkGlyph = "Marque"; +static char *str_NoClass = "Pas de classe"; +static char *str_PSInterpretation = "Interprétation PS"; +static char *str_ProbDFLT = "Cette fonte se réfère au système d'écriture 'DFLT'\nun usage qui est déconseillé.\nIl serait mieux que vous définissiez une nouvelle liste\nde systèmes d'écriture (si vous avez des doutes, sélectionnez\ntous les systèmes d'écriture utilisés dans votre fonte).\nSouhaitez-vous faire cela ?"; +static char *str_RmOverlapBuggy1 = "La fonction de suppression de recouvrements"; +static char *str_RmOverlapBuggy2 = "de FontForge est un tantinet boguée, alors je"; +static char *str_RmOverlapBuggy3 = "vous donne la possibilité de la désactiver."; +static char *str_RmOverlapBuggy4 = "Mais je vous conseille tout de même de la garder"; +static char *str_RmOverlapBuggy5 = "activée, elle peut être utile."; +static char *str_UsedDFLTscript = "Vérifier si le système d'écriture 'DFLT' est utilisé"; +static char *str_UsedDFLTscriptPopup = "L'utilisation du système d'écriture 'DFLT' est déconseillée.\nFontForge va néanmoins utiliser ce systèmed 'écriture\nde temps en temps, faute de mieux..."; +static char *str_popPencilGrey = "Activer/désactiver des pixels\n(pipette avec alt)"; +static char str_GlyphNameBadChars = "Un nom de glyphe doit être écrit en ASCII, plus précisement en utilisant des alphanumériques, des points et des soulignés, sans blancs, ni aucun caractère parmi \"([{<>}])/%%\""; +static char str_GlyphNameNoDigits = "Un nom de glyphe ne doit pas commencer par un chiffre ou un point"; +static char str_GlyphNameQuestionableChars = "Un nom de glyphe doit contenir uniquement des alphanumériques ASCII, des points et des soulignés.\nSouhaitez vous utiliser ce nom malgré tout ?"; +static char str_GlyphNameTooLong = "Les noms de glyphe sont limités à 31 caractères"; + +static char *str_BadMM = "Mauvaise fonte Multiple Master"; +static char *str_Class_d = "Classe %d"; +static char *str_CreateMM = "Créer une MM..."; +static char *str_MM = "MM"; +static char *str_MMDifferentNumChars = "Les fontes %1$.30hs et %2$.30hs n'ont pas le même nombre de glyphes"; +static char *str_MMDifferentOrder = "Les fontes %1$.30hs et %2$.30hs utilisent des courbes de Bézier d'ordres différents (quadratique et cubique)"; +static char *str_MMHasInstances = "Cette fonte Multiple Master a %1$d instances de fonte, mais FontForge ne peut gérer que %2$d archétypes pour %3$d axes. FontForge ne pourra pas l'éditer correctement"; +static char *str_MMInfo = "Infos MM..."; +static char *str_MMMismatchContoursDir = "Le glyphe %1$.30hs de la fonte %2$.30hs possède des contours orientés de manière différente que ceux de %3$.30hs"; +static char *str_MMMismatchContoursPt = "Le glyphe %1$.30hs de la fonte %2$.30hs possède un nombre de points (ou de points contrôle) différent que dans %3$.30hs"; +static char *str_MMMismatchHints = "Les %1$hs hints du glyphe \"%2$.30hs\" de la fonte %3$.30hs ne correspondent pas à ceux de %4$.30hs (le nombre est différent ou alors les critères de recouvrement)"; +static char *str_MMMismatchKerns = "Le glyphe %1$.30hs de la fonte %2$.30hs possède un nombre différent de paires de crénage que dans %3$.30hs"; +static char *str_MMMismatchRefs = "Le glyphe %1$.30hs de la fonte %2$.30hs possède des contours orientés de manière différente que dans %3$.30hs"; +static char *str_MMNeedsBoldThresh = "Il n'y a pas d'entrée ForceBoldThreshold dans la fonte grasse, mais il y a une entrée ForceBold dans la fonte %30hs"; +static char *str_MMPrivateMismatch = "L'entrée \"%1$.20hs\" manque à l'appel dans les dictionnaires privés de %2$.30hs et de %3$.30hs"; +static char *str_MMTooFewMasters = "Cette fonte Multiple Master possède %1$d instances de fontes, mais en fait elle nécessite au moins %2$d archétypes pour %3$d axes. FontForge ne pourra pas l'éditer correctement"; +static char *str_MMUndefChar = "Le glyphe %1$.30hs est défini dans la fonte %2$.30hs mais pas dans %3$.30hs"; +static char *str_MMValid = "Vérifiaction de validité MM"; +static char *str_MMWrongContourCount = "Le glyphe %1$.30hs n'a pas le même nombre de contours dans la fonte %2$.30hs que dans %3$.30hs"; +static char *str_MacEverythingElse = "Classe 1 : {Tout les glyphes restant}"; +static char *str_NoProblems = "Aucun problème détecté"; +static unichar_t *str_RightArrow = { 'D', 'r', 'o','i','t','e', 0x2192, 0 }; +static char *str_StateClass = "État %d, %.40s"; +static unichar_t *str_UpArrow = { 'H', 'a', 'u', 't', 0x2191, 0 }; +static char mnemonic_CreateMM = 'C'; +static unichar_t mnemonic_DownArrow = 'D'; +static unichar_t mnemonic_LeftArrow = 'L'; +static char mnemonic_MMInfo = 'I'; +static char mnemonic_MMValid = 'V'; +static unichar_t mnemonic_RightArrow = 'R'; +static unichar_t mnemonic_UpArrow = 'U'; +static unichar_t str_DownArrow = { 0x2193, 'B','a','s', 0 }; +static unichar_t str_LeftArrow = { 0x2190, 'G','a','u','c', 'h', 'e', 0 }; + +static char *str_MissingGlyphName = "Nom de glyphe manquant"; +static char mnemonic_SelectAllPoints = 't'; +static char mnemonic_SelectAnchors = 'c'; +static char str_SelectAllPoints = "Sélectionner tous points et références"; +static char str_SelectAnchors = "Sélectionner ancres"; + +static int num_buttonsize = 70 ; +static int num_ScaleFactor = 140 ; diff --git a/fontforge/nomen-it.c b/fontforge/nomen-it.c new file mode 100644 index 00000000..b2e1ddc5 --- /dev/null +++ b/fontforge/nomen-it.c @@ -0,0 +1,1918 @@ +#include "nomen.h" + +static enum encoding enc = e_iso8859_1; + +static char str_Language[] = "Italiano"; +static char str_OK[] = "OK"; +static unichar_t mnemonic_OK[] = 'O'; +static char str_Cancel[] = "Cancella"; +static unichar_t mnemonic_Cancel[] = 'C'; +static char str_Open[] = "Apri"; +static unichar_t mnemonic_Open[] = 'O'; +static char str_Save[] = "Salva"; +static unichar_t mnemonic_Save[] = 'E'; +static char str_Filter[] = "Filtra"; +static unichar_t mnemonic_Filter[] = 'F'; +static char str_New[] = "Nuovo"; +static unichar_t mnemonic_New[] = 'N'; +static char str_Replace[] = "Sostituisci"; +static char str_Fileexists[] = "Il file esiste"; +static char *str_None ="None"; +static char mnemonic_None ='N'; +/* "File, %s, exists. Replace it?" */ +static char str_Fileexistspre[] = "Il file, "; +static char str_Fileexistspost[] = ", esiste. Sostituirlo?"; +static char str_Createdir[] = "Crea cartella..."; +static char str_Dirname[] = "Nome della cartella?"; +static char str_Couldntcreatedir[] = "Non posso creare la cartella"; +static char str_File[] = "File"; +static unichar_t mnemonic_File[] = 'F'; +static char str_Edit[] = "Modifica"; +static unichar_t mnemonic_Edit[] = 'E'; +static char str_Point[] = "Punto"; +static unichar_t mnemonic_Point[] = 'P'; +static char str_Element[] = "Elemento"; +static unichar_t mnemonic_Element[] = 'l'; +static char str_Hints[] = "Hints"; +static unichar_t mnemonic_Hints[] = 'H'; +static char str_View[] = "Vista"; +static unichar_t mnemonic_View[] = 'V'; +static char str_Metric[] = "Metriche"; +static unichar_t mnemonic_Metric[] = 'M'; +static char str_Window[] = "Finestra"; +static unichar_t mnemonic_Window[] = 'F'; +static char str_Help[] = "Aiuto"; +static unichar_t mnemonic_Help[] = 'A'; +static char str_Recent[] = "Recenti"; +static unichar_t mnemonic_Recent[] = 'R'; +static char str_Openoutline[] = "Apri la finestra dei contorni"; +static unichar_t mnemonic_Openoutline[] = 'C'; +static char str_About[] = "A proposito..."; +static unichar_t mnemonic_About[] = 'A'; +static char str_Openbitmap[] = "Apri la finestra delle bitmap"; +static unichar_t mnemonic_Openbitmap[] = 'B'; +static char str_Openmetrics[] = "Apri la finestra delle metriche"; +static unichar_t mnemonic_Openmetrics[] = 'M'; +static char str_Print[] = "Stampa..."; +static unichar_t mnemonic_Print[] = 'P'; +static char str_Display[] = "Mostra..."; +static unichar_t mnemonic_Display[] = 'D'; +static char str_Revertfile[] = "Getta il file"; +static unichar_t mnemonic_Revertfile[] = 'f'; +static char str_RevertGlyph[] = "Getta il glifo"; +static unichar_t mnemonic_RevertGlyph[] = 'y'; +static char str_Saveas[] = "Salva con nome..."; +static unichar_t mnemonic_Saveas[] = 'S'; +static char str_ExecuteScript[] = "Esegui uno Script..."; +static unichar_t mnemonic_ExecuteScript[] = 'x'; +static char str_Generate[] = "Crea i font..."; +static unichar_t mnemonic_Generate[] = 'C'; +static char str_GenerateMac[] = "Crea una famiglia per Mac..."; +static unichar_t mnemonic_GenerateMac[] = 'F'; +static char str_Import[] = "Importa..."; +static unichar_t mnemonic_Import[] = 'I'; +static char str_SaveAll[] = "Salva tutto"; +static unichar_t mnemonic_SaveAll = 'T'; +static char str_Close[] = "Chiudi"; +static unichar_t mnemonic_Close[] = 'F'; +static char str_Prefs[] = "Preferenze..."; +static unichar_t mnemonic_Prefs[] = 'e'; +static char str_Quit[] = "Esci"; +static unichar_t mnemonic_Quit[] = 'Q'; +static char str_Fit[] = "Adatta"; +static unichar_t mnemonic_Fit[] = 'A'; +static char str_Zoomin[] = "Ingrandisci"; +static unichar_t mnemonic_Zoomin[] = 'i'; +static char str_Zoomout[] = "Rimpicciolisci"; +static unichar_t mnemonic_Zoomout[] = 'o'; +static char str_NextChar[] = "Carattere successivo"; +static unichar_t mnemonic_NextChar[] = 'P'; +static char str_PrevChar[] = "Carattere precedente"; +static unichar_t mnemonic_PrevChar[] = 'n'; +static char str_Goto[] = "Vai a"; +static unichar_t mnemonic_Goto[] = 'A'; +static char str_Hidepoints[] = "Nascondi i punti"; +static unichar_t mnemonic_Hidepoints[] = 'o'; +static char str_NextDefChar[] = "Carattere definito successivo"; +static unichar_t mnemonic_NextDefChar[] = 'D'; +static char str_PrevDefChar[] = "Carattere definito precedente"; +static unichar_t mnemonic_PrevDefChar[] = 'a'; +static char str_Showpoints[] = "Mostra i punti"; +static unichar_t mnemonic_Showpoints[] = 'o'; +static char str_Hiderulers[] = "Nascondi le scale"; +static unichar_t mnemonic_Hiderulers[] = 'R'; +static char str_Showrulers[] = "Mostra le scale"; +static unichar_t mnemonic_Showrulers[] = 'R'; +static char str_MarkExtrema[] = "Marca gli estremi"; +static unichar_t mnemonic_MarkExtrema[] = 'M'; +static char str_Nextpoint[] = "Punto successivo"; +static unichar_t mnemonic_Nextpoint[] = 'e'; +static char str_Prevpoint[] = "Punto precedente"; +static unichar_t mnemonic_Prevpoint[] = 'v'; +static char *str_ShowHMetrics="Mostra le metriche H."; +static char mnemonic_ShowHMetrics = 'H'; +static char *str_ShowVMetrics="Mostra le metriche V."; +static char mnemonic_ShowVMetrics = 'V'; +static char *str_EncodedView="Vista codificata"; +static char mnemonic_EncodedView = 'E'; +static char *str_CompactedView="Vista compatta"; +static char mnemonic_CompactedView = 'C'; +static char *str_Combinations="Combinazioni"; +static char mnemonic_Combinations = 'b'; +static char *str_KernPairs="Coppie di crenatura; +static char mnemonic_KernPairs = 'K'; +static char *str_Ligatures="Ligature"; +static char mnemonic_Ligatures = 'L'; +static char *str_AnchoredPairs="Coppie con ancore"; +static char mnemonic_AnchoredPairs = 'A'; +static char *str_FindInFontView="Cerca nella finestra del font"; +static char mnemonic_FindInFontView = 'V'; +static char str_Fill[] = "Riempi"; +static unichar_t mnemonic_Fill[] = 'l'; +static char str_Select[] = "Seleziona"; +static unichar_t mnemonic_Select[] = 'S'; +static char str_DeselectAll[] = "Deseleziona tutto"; +static unichar_t mnemonic_DeselectAll[] = 'D'; +static char str_FirstPoint[] = "Primo punto"; +static unichar_t mnemonic_FirstPoint[] = 'F'; +static char str_Undo[] = "Disfa"; +static unichar_t mnemonic_Undo[] = 'D'; +static char str_Redo[] = "Rifà"; +static unichar_t mnemonic_Redo[] = 'R'; +static char str_NextControlPoint[] = "Punto di controllo successivo"; +static unichar_t mnemonic_NextControlPoint[] = 'x'; +static char str_PrevControlPoint[] = "Punto di controllo precedente"; +static unichar_t mnemonic_PrevControlPoint[] = 'r'; +static char str_SelectWidth[] = "Larghezza"; +static unichar_t mnemonic_SelectWidth[] = 'W'; +static char str_SelectVWidth[] = "Avanzamento verticale"; +static unichar_t mnemonic_SelectVWidth[] = 'V'; +static char str_DeselectWidth[] = "Deseleziona la larghezza"; +static unichar_t mnemonic_DeselectWidth[] = 'W'; +static char str_DeselectVWidth[] = "Deseleziona l'avanzamento verticale"; +static unichar_t mnemonic_DeselectVWidth[] = 'V'; +static char str_Cut[] = "Taglia"; +static unichar_t mnemonic_Cut[] = 'p'; +static char str_Copy[] = "Copia"; +static unichar_t mnemonic_Copy[] = 'C'; +static char str_Copywidth[] = "Copia la larghezza"; +static unichar_t mnemonic_Copywidth[] = 'g'; +static char str_Copyref[] = "Copia il riferimento"; +static unichar_t mnemonic_Copyref[] = 'o'; +static char str_CopyVWidth[] = "Copia l'avanzamento verticale"; +static unichar_t mnemonic_CopyVWidth[] = 'V'; +static char str_CopyLBearing[] = "Copia la spalla sinistra"; +static unichar_t mnemonic_CopyLBearing[] = 'p'; +static char str_CopyRBearing[] = "Copia la spalla destra"; +static unichar_t mnemonic_CopyRBearing[] = 'g'; +static char str_Paste[] = "Incolla"; +static unichar_t mnemonic_Paste[] = 'l'; +static char str_Clear[] = "Pulisci"; +static unichar_t mnemonic_Clear[] = 'E'; +static char str_Merge[] = "Unisci"; +static unichar_t mnemonic_Merge[] = 'M'; +static char str_ClearBackground[] = "Cancella lo sfondo"; +static unichar_t mnemonic_ClearBackground[] = 'B'; +static char str_SelectAll[] = "Seleziona tutto"; +static unichar_t mnemonic_SelectAll[] = 'A'; +static char str_CopyFgToBg[] = "Primo piano -> sfondo"; +static unichar_t mnemonic_CopyFgToBg[] = 'F'; +static char str_Unlinkref[] = "Sostituire il riferimento"; +static unichar_t mnemonic_Unlinkref[] = 'R'; +static char str_Elide = "Elidi"; +static char str_Join[] = "Congiungi"; +static unichar_t mnemonic_Join[] = 'J'; +static char str_Fontinfo[] = "Informazioni sul font..."; +static unichar_t mnemonic_Fontinfo[] = 'P'; +static char str_SelectColor[] = "Scegli il colore"; +static unichar_t mnemonic_SelectColor[] = 'S'; +static char str_RemoveUndoes[] = "Cancella gli 'undo'"; +static unichar_t mnemonic_RemoveUndoes[] = 'e'; +static char str_Findprobs[] = "Cerca i problemi..."; +static unichar_t mnemonic_Findprobs[] = 'o'; +static char str_Getinfo[] = "Mostra informazioni..."; +static unichar_t mnemonic_Getinfo[] = 'I'; +static char str_Bitmapsavail[] = "Bitmap disponibili..."; +static unichar_t mnemonic_Bitmapsavail[] = 'A'; +static char str_ShowDependents[] = "Mostra le dipendenze..."; +static unichar_t mnemonic_ShowDependents[] = 'h'; +static char str_Regenbitmaps[] = "Rigenera le bitmap..."; +static unichar_t mnemonic_Regenbitmaps[] = 'B'; +static char str_Autotrace[] = "Autotrace"; +static unichar_t mnemonic_Autotrace[] = 'r'; +static char str_Transform[] = "Transforma..."; +static unichar_t mnemonic_Transform[] = 'T'; +static char str_Stroke[] = "Espandi il tratto..."; +static unichar_t mnemonic_Stroke[] = 'E'; +static char str_TilePath[] = "Sovrapponi i percorsi..."; +static unichar_t mnemonic_TilePath[] = 'P'; +static char str_Overlap[] = "Ricoperture"; +static unichar_t mnemonic_Overlap[] = 'v'; +static char str_Rmoverlap[] = "Cancella le ricoperture"; +static unichar_t mnemonic_Rmoverlap[] = 'v'; +static char str_FindIntersections[] = "Trova le intersezioni"; +static char str_Simplify[] = "Semplifica"; +static unichar_t mnemonic_Simplify[] = 'S'; +static char str_Round2int[] = "Arrotonda a intero"; +static unichar_t mnemonic_Round2int[] = 'I'; +static char str_SimplifyMore[] = "Semplifica ancora..."; +static char str_CleanupChar[] = "Pulisci il carattere"; +static unichar_t mnemonic_CleanupChar[] = 'n'; +static char str_AddExtrema[] = "Aggiungi gli estremi"; +static unichar_t mnemonic_AddExtrema[] = 'x'; +static char str_Align[] = "Allinea"; +static unichar_t mnemonic_Align[] = 'l'; +static char str_AveragePts[] = "Media i punti"; +static unichar_t mnemonic_AveragePts[] = 'A'; +static char str_SpacePts[] = "Spazia i punti"; +static unichar_t mnemonic_SpacePts[] = 'S'; +static char str_SpaceRegions[] = "Spazia le regioni..."; +static unichar_t mnemonic_SpaceRegions[] = 'R'; +static char str_MakeParallel[] = "Rendi parallelo..."; +static unichar_t mnemonic_MakeParallel[] = 'P'; +static char str_Buildaccent[] = "Crea caratteri accentati"; +static unichar_t mnemonic_Buildaccent[] = 'u'; +static char str_Clockwise[] = "Senso orario"; +static unichar_t mnemonic_Clockwise[] = 'o'; +static char str_Buildcomposit[] = "Costruisci un carattere composto"; +static unichar_t mnemonic_Buildcomposit[] = 'u'; +static char str_Cclockwise[] = "Senso antiorario"; +static unichar_t mnemonic_Cclockwise[] = 'n'; +static char str_Correct[] = "Correggi le direzioni"; +static unichar_t mnemonic_Correct[] = 'C'; +static char str_Corner[] = "Spigolo"; +static unichar_t mnemonic_Corner[] = 'o'; +static char str_Curve[] = "Curva"; +static unichar_t mnemonic_Curve[] = 'C'; +static char str_Tangent[] = "Tangente"; +static unichar_t mnemonic_Tangent[] = 'T'; +static char str_Autohint[] = "AutoHint"; +static unichar_t mnemonic_Autohint[] = 'H'; +static char str_Clearhstem[] = "Cancella HStem"; +static unichar_t mnemonic_Clearhstem[] = 'E'; +static char str_FullAutohint[] = "AutoHint completo"; +static unichar_t mnemonic_FullAutohint[] = 'H'; +static char str_ClearHints[] = "Cancella gli hint"; +static unichar_t mnemonic_ClearHints[] = 'C'; +static char str_Clearvstem[] = "Cancella VStem"; +static unichar_t mnemonic_Clearvstem[] = 'V'; +static char str_Cleardstem[] = "Cancella DStem"; +static unichar_t mnemonic_Cleardstem[] = 'D'; +static char str_Addhhint[] = "Aggiungi HHint"; +static unichar_t mnemonic_Addhhint[] = 'A'; +static char str_Addvhint[] = "Aggiungi VHint"; +static unichar_t mnemonic_Addvhint[] = 's'; +static char str_Adddhint[] = "Aggiungi DHint"; +static unichar_t mnemonic_Adddhint[] = 't'; +static char str_Createhhint[] = "Crea HHint"; +static unichar_t mnemonic_Createhhint[] = 'r'; +static char str_Createvhint[] = "Crea VHint"; +static unichar_t mnemonic_Createvhint[] = 'e'; +static char str_Reviewhints[] = "Rivedi gli hint"; +static unichar_t mnemonic_Reviewhints[] = 'R'; +static char str_Export[] = "Esporta..."; +static unichar_t mnemonic_Export[] = 't'; +static char str_MinimumDistance[] = "Distanza Minima"; +static unichar_t mnemonic_MinimumDistance[] = 'M'; +static char str_ClearAllMD[] = "Cancella tutte le DM"; +static unichar_t mnemonic_ClearAllMD[] = 'C'; +static char str_ClearSelXMD[] = "Cancella la DM x selezionata"; +static unichar_t mnemonic_ClearSelXMD[] = 's'; +static char str_ClearSelYMD[] = "Cancella la DM y selezionata"; +static unichar_t mnemonic_ClearSelYMD[] = 'e'; +static char str_ClearWidthMD[] = "Cancella le DM sulla larghezza"; +static unichar_t mnemonic_ClearWidthMD[] = 'W'; +static char str_AddxMD[] = "Aggiungi DM x"; +static unichar_t mnemonic_AddxMD[] = 'x'; +static char str_AddMD2Width[] = "Aggiungi DM fino alla larghezza"; +static unichar_t mnemonic_AddxMD[] = 'x'; +static char str_AddyMD[] = "Aggiungi DM y"; +static unichar_t mnemonic_AddyMD[] = 'y'; +static char str_RoundX[] = "Arrotonda X"; +static unichar_t mnemonic_RoundX[] = 'R'; +static char str_NoRoundX[] = "Non arrotondare X"; +static unichar_t mnemonic_NoRoundX[] = 'N'; +static char str_RoundY[] = "Arrotonda Y"; +static unichar_t mnemonic_RoundY[] = 'u'; +static char str_NoRoundY[] = "Non Arrotondare Y"; +static unichar_t mnemonic_NoRoundY[] = 'o'; +static char str_Palettes[] = "Tavolozze"; +static unichar_t mnemonic_Palettes[] = 'P'; +static char str_Tools[] = "Strumenti"; +static unichar_t mnemonic_Tools[] = 'O'; +static char str_Layers[] = "Strati"; +static unichar_t mnemonic_Layers[] = 'C'; +static char str_Center[] = "Centra in larghezza"; +static unichar_t mnemonic_Center[] = 'C'; +static char str_DockedPalettes[] = "Tavolozze bloccate"; +static unichar_t mnemonic_DockedPalettes[] = 'D'; +static char str_Shades[] = "Sfumature"; +static unichar_t mnemonic_Shades[] = 'S'; +static char str_Thirds[] = "Centra 1/3--2/3"; +static unichar_t mnemonic_Thirds[] = 'T'; +static char str_Setwidth[] = "Fissa la larghezza..."; +static unichar_t mnemonic_Setwidth[] = 'L'; +static char str_Setlbearing[] = "Fissa la spalla sinistra..."; +static unichar_t mnemonic_Setlbearing[] = 'B'; +static char str_SetVWidth[] = "Fissa l'avanzamento verticale..."; +static unichar_t mnemonic_SetVWidth[] = 'V'; +static char str_Setrbearing[] = "Fissa la spalla destra..."; +static unichar_t mnemonic_Setrbearing[] = 'R'; +static char str_Removekern[] = "Cancella le coppie di crenatura"; +static unichar_t mnemonic_Removekern[] = 'v'; +static char str_Mergekern[] = "Riunisci le crenature..."; +static unichar_t mnemonic_Mergekern[] = 'M'; +static char str_24[] = "24 pixel outline"; +static unichar_t mnemonic_24[] = '2'; +static char str_36[] = "36 pixel outline"; +static unichar_t mnemonic_36[] = '3'; +static char str_48[] = "48 pixel outline"; +static unichar_t mnemonic_48[] = '4'; +static char str_Antialias[] = "Anti Alias"; +static unichar_t mnemonic_Antialias[] = 'A'; +static char str_FitToEm[] = "Aggiusta all'em"; +static unichar_t mnemonic_FitToEm[] = 'F'; +static char str_72[] = "72 pixel outline"; +static unichar_t mnemonic_72[] = '7'; +static char str_96[] = "96 pixel outline"; +static unichar_t mnemonic_96[] = '9'; +static char str_Charinfo[] = "Informazioni sul carattere..."; +static unichar_t mnemonic_Charinfo[] = 'I'; +static char str_CharInfoFor[] = "Informazioni sul carattere di %.40hs"; +static char str_Mergefonts[] = "Riunisci i font..."; +static unichar_t mnemonic_Mergefonts[] = 'M'; +static char str_Interp[] = "Interpola i font..."; +static unichar_t mnemonic_Interp[] = 'I'; +static char str_Copyfrom[] = "Copia da"; +static unichar_t mnemonic_Copyfrom[] = 'F'; +static char str_Allfonts[] = "Tutti i font"; +static unichar_t mnemonic_Allfonts[] = 'A'; +static char str_Displayedfont[] = "Font mostrato"; +static unichar_t mnemonic_Displayedfont[] = 'V'; +static char str_Autokern[] = "Crenatura Auto..."; +static unichar_t mnemonic_Autokern[] = 'K'; +static char str_CharName[] = "Nome del carattere"; +static unichar_t mnemonic_CharName[] = 'N'; +static char str_Autowidth[] = "Auto larghezza..."; +static unichar_t mnemonic_Autowidth[] = 'A'; +static char str_Removeallkern[] = "Cancellare tutte le crenature"; +static unichar_t mnemonic_Removeallkern[] = 'P'; +static char str_Outline[] = "Contorno"; +static char str_OutlineMn[] = "Contorno"; +static unichar_t mnemonic_OutlineMn[] = 'O'; +static char str_Showgrid[] = "Mostra la griglia"; +static unichar_t mnemonic_Showgrid[] = 'G'; +static char str_Hidegrid[] = "Nascondi la griglia"; +static unichar_t mnemonic_Hidegrid[] = 'G'; +static char str_Bigger[] = "Più grande"; +static unichar_t mnemonic_Bigger[] = 'G'; +static char str_Smaller[] = "Più piccolo"; +static unichar_t mnemonic_Smaller[] = 'P'; +static char str_Dontsave[] = "Non salvare"; + +static char str_Fliph[] = "Simmetria orizzontale"; +static unichar_t mnemonic_Fliph[] = 'H'; +static char str_Flipv[] = "Simmetria verticale"; +static unichar_t mnemonic_Flipv[] = 'V'; +static char str_Rotate90cw[] = "Rotazione oraria di 90°"; +static unichar_t mnemonic_Rotate90cw[] = 'R'; +static char str_Rotate90ccw[] = "Rotazione antioraria di 90°"; +static unichar_t mnemonic_Rotate90ccw[] = '9'; +static char str_Rotate180[] = "Rotazione di 180°"; +static unichar_t mnemonic_Rotate180[] = '1'; +static char str_Skew[] = "Inclina..."; +static unichar_t mnemonic_Skew[] = 'S'; +static char str_MakeFirst = "Punto iniziale"; +static char mnemonic_MakeFirst = 'k'; +static char str_AddAnchor = "Aggiungi un'ancora"; +static char mnemonic_AddAnchor = 'A'; +static char *str_CID = "CID"; +static char mnemonic_CID = 'C'; +static char *str_Convert2CID = "Conversione verso CID"; +static char mnemonic_Convert2CID = 'C'; +static char *str_ConvertByCMap = "Conversione con CMap"; +static char mnemonic_ConvertByCMap = 'M'; +static char *str_Flatten = "Flatten"; +static char mnemonic_Flatten = 'F'; +static char *str_FlattenByCMap = "Flatten con CMap"; +static char mnemonic_FlattenByCMap = 'a'; +static char *str_InsertFont = "Inserisci font..."; +static char mnemonic_InsertFont = 'o'; +static char *str_InsertBlank = "Inserisci uno spazio"; +static char mnemonic_InsertBlank = 'B'; +static char *str_RemoveFont = "Elimina il font"; +static char mnemonic_RemoveFont = 'R'; +static char *str_CIDFontInfo = "Informazioni sul font CID..."; +static char mnemonic_CIDFontInfo = 'I'; + +static char *str_Loading = "Chargement..."; +static char *str_LoadingFontFrom = "Chargement de la police depuis "; + + /* Font Info dlg */ +static char str_Custom[] = "Custom"; +static char str_Compacted[] = "Compatto"; +static char str_Isolatin1[] = "ISO 8859-1 (Latin1)"; +static char str_Isolatin0[] = "ISO 8859-15 (Latin0)"; +static char str_Isolatin2[] = "ISO 8859-2 (Latin2)"; +static char str_Isolatin3[] = "ISO 8859-3 (Latin3)"; +static char str_Isolatin4[] = "ISO 8859-4 (Latin4)"; +static char str_Isolatin5[] = "ISO 8859-9 (Latin5)"; +static char str_Isolatin6[] = "ISO 8859-10 (Latin6)"; +static char str_Isolatin7[] = "ISO 8859-13 (Latin7)"; +static char str_Isolatin8[] = "ISO 8859-14 (Latin8)"; +static char str_Isocyrillic[] = "ISO 8859-5 (Cirillico)"; +static char str_Koi8cyrillic[] = "KOI8-R (Cirillico)"; +static char str_Isoarabic[] = "ISO 8859-6 (Arabo)"; +static char str_Isogreek[] = "ISO 8859-7 (Greco)"; +static char str_Isohebrew[] = "ISO 8859-8 (Ebraico)"; +static char str_Isothai[] = "ISO 8859-11 (Thai)"; +static char str_Mac[] = "Macintosh Latin"; +static char str_Win[] = "Windows Latin (\042ANSI\042)"; +static char str_Adobestd[] = "Adobe Standard"; +static char str_Symbol[] = "Symbol"; +static unichar_t str_Texbase[] = { 0x3a4, 0x3b5, 0x3a7, ' Base (8r)', '\0' }; +static char str_Unicode[] = "ISO 10646-1 (Unicode, BMP)"; +static char str_Unicode4[] = "ISO 10646-1 (Unicode, Full)"; +static char str_UnicodePlanes[] = "ISO 10646-? (a pagine) ..."; +static char str_Jis208[] = "JIS 208 (Kanji)"; +static char str_Jis212[] = "JIS 212 (Kanji)"; +static char str_SJIS[] = "SJIS (Kanji)"; +static char str_Korean[] = "KSC 5601-1987 (Coreano)"; +static char str_KoreanJohab[] = "Johab (Coreano)"; +static char str_KoreanWansung[] = "Wansung (Coreano)"; +static char str_Chinese[] = "GB 2312 (Simp. Cinese)"; +static char str_ChineseTrad[] = "Big5 (Cinese tradiz.)"; +static char str_ChineseTradHKSCS[] = "Big5 HKSCS (Cinese tradiz.)"; +static char str_Reducing[] = "Stai per ridurre il numero di caratteri sotto a quello attuale. \nCiò farà scomparire alcuni caratteri.\nÈ proprio quello che vuoi fare?"; +static char str_Toofew[] = "Troppo pochi caratteri"; +static char str_Badfamilyn[] = "Nome di Famiglia errato; il nome deve cominciare con un carattere alfabetico."; +static char str_Badfamily[] = "Nome di Famiglia errato"; +static char str_Badascentdescentn[] = "L'ascendente e il discendente devono essere positivi e la loro somma non deve superare 16384"; +static char str_Badascentdescent[] = "Ascendente/discendente errato"; +static char str_Fontinformation[] = "Font Information per %.90hs"; +static char str_WhichPlane[] = "Quale pagina Unicode:"; +static char str_Familyname[] = "Nome della Famiglia:"; +static unichar_t mnemonic_Familyname[] = 'F'; +static char str_Fontname[] = "Fontname:"; +static unichar_t mnemonic_Fontname[] = 'N'; +static char str_Humanname[] = "Nome umano:"; +static unichar_t mnemonic_Humanname[] = 's'; +static char str_Encoding[] = "Encoding:"; +static unichar_t mnemonic_Encoding[] = 'E'; +static char str_Load[] = "Carica"; +static unichar_t mnemonic_Load[] = 'L'; +static char str_Makefromfont[] = "Esegui a partire da"; +static unichar_t mnemonic_Makefromfont[] = 'k'; +static char str_Remove[] = "Togli"; +static unichar_t mnemonic_Remove[] = 'M'; +static char str_ForceEncoding[] = "Imponi l'encoding"; +static unichar_t mnemonic_ForceEncoding[] = 'F'; +static char str_ForceEncodingPopup[] = "Normalmente, cambiare l'encoding sposta i caratteri dal loro posto attuale \nvers nel posto corrispondente al nuovo encoding.\nBarrando la casella, FontForge riterrà che i caratteri sono al posto giusto,\nma Hanno nomi errati. FontForge assegnerà i nomi secondo il nuovo encoding."; +static char str_Italicangle[] = "Inclinazione del corsivo:"; +static unichar_t mnemonic_Italicangle[] = 'I'; +static char str_Upos[] = "Posizione della sottolineatura:"; +static unichar_t mnemonic_Upos[] = 'P'; +static char str_Uheight[] = "Altezza:"; +static unichar_t mnemonic_Uheight[] = 'H'; +static char str_Ascent[] = "Ascendente:"; +static unichar_t mnemonic_Ascent[] = 'A'; +static char str_Descent[] = "Discendente:"; +static char str_EmSize[] = "Misura dell'em:"; +static unichar_t mnemonic_EmSize[] = 'E'; +static char str_ScaleOutlines[] = "Messa in scala dei contorni"; +static unichar_t mnemonic_ScaleOutlines[] = 'S'; +static unichar_t mnemonic_Descent[] = 'D'; +static char str_Copyright[] = "Copyright:"; +static unichar_t mnemonic_Copyright[] = 'r'; +static char str_Xuid[] = "XUID:"; +static unichar_t mnemonic_Xuid[] = 'X'; +static char str_Numchars[] = "Numero di caratteri:"; +static unichar_t mnemonic_Numchars[] = 'N'; +static char str_CIDRegistry[] = "CID Registry:"; +static char str_Guess[] = "Deviner"; +static unichar_t mnemonic_Guess[] = 'G'; +static char *str_FamilyNameRequired = "È necessario un nome di famiglia "; +static char *str_PSNameNotNumber = "Il nome Postscript non può essere un numero"; +static char *str_BadFamilyName = "Nome della famiglia del font errato"; +static char *str_BadFontName = "Nome del font errato"; +static char *str_NameTooLong = "Nome troppo lungo, max. 63 caratteri"; +static char *str_BadModifierName = "Font Modifier Name errato"; +static char *str_BadPSName = "Un nome Postscript deve essere ASCII\ne non può contenere né (){}[]<>%%/ né spazi"; +static char *str_Names = "Nomi"; +static char *str_Encoding2 = "Encoding"; +static char *str_PSGeneral = "Generale"; +static char *str_PSPrivate = "PS privato"; +static char *str_TTFNames = "Nomi TTF"; +static char *str_TTFValues = "Costanti TTF"; +static char *str_Panose = "Panose"; +static char *str_Comment = "Commento"; +static char *str_InvalidEncoding = "Encoding errato"; +static char *str_UniqueIDC = "UniqueID:"; +static char mnemonic_UniqueIDC = 'U'; +static char *str_VersionC = "Versione:"; +static char mnemonic_VersionC = 'V'; +static char *str_HasVerticalMetrics = "Con metrica verticale"; +static char mnemonic_HasVerticalMetrics = 'V'; +static char *str_VOrigin = "Origine verticale:"; +static char mnemonic_VOrigin = 'O'; +static char str_UniqueIDTitle = "Cambia l'UniqueID?" +static char str_UniqueIDChange = "Hai cambiato il nome di questo font, senza cambiare il suo UniqueID (o XUID).\nNon è probabilmente una buona idea. Desideri che io generi\nun nuovo valore casuale?"; +static char str_Change = "Cambia"; +static char mnemonic_Change = 'h'; +static char str_ChangeAll = "Cambia tutto "; +static char mnemonic_ChangeAll = 'A'; +static char str_RetainAll = "Mantieni tutto"; +static char mnemonic_RetainAll = 'l'; +static char str_Retain = "Mantieni"; +static char mnemonic_Retain = 'R'; +static char *str_Mismatch = "Mescola"; +static char *str_MismatchLong = "Hai cambiato una versione di %s ma non quella dei nomi TTF. Vuoi che le modifiche siano trasferite nei nomi TTF?"; +static char *str_Rename = "Rinomina..."; +static char *mnemonic_Rename = 'R'; +static char *str_NewDDD = "Nuovo..."; +static char *mnemonic_NewDDD = 'N'; +static char *str_EditDDD = "Modifica..."; +static char *mnemonic_EditDDD = 'E'; +static char *str_ShowFirstMark = "Cerca la prima marca"; +static char *str_ShowNextMark = "Marca successiva"; +static char *str_ShowFirstBase = "Cerca la prima base"; +static char *str_ShowNextBase = "Base successiva"; +static char *str_NoMore = "Non ce ne sono più"; +static char *str_NoMoreMarks = "Non ci sono più marche associate a questa classe di ancore"; +static char *str_NoMoreBases = "Non ci sono più caratteri di base associati a questa classe di ancore"; +static char *str_NoMarks = "Non ci sono marche associate a questa classe di ancore"; +static char *str_NoBases = "Non ci sono caratteri di base associati a questa classe di ancore"; +static char *str_NewAnchorClass = "Nuova classe d'ancore"; +static char *str_EditAnchorClass = "Modificare la classe d'ancore"; +static char *str_DupAnchorClass = "Il nome, %s, è già usato.\nSe continui così, le 2 classi d'ancore\nsaranno riunite in una sola quando clicchi su OK."; +static char *str_DupAnchorClassNotTag = "Il nome, %s, è già usato per una targhetta diversa."; +static char *str_Continue = "Continua"; +static char *mnemonic_Continue = 'o'; +static char *str_AnchorClass = "Classi d'ancore"; +static char *str_AnchorClassName = "Nome della classe d'ancore:"; +static char str_FeatureTagTooLong = "i nomi delle targhette di funzionalità sono limitati a 4 caratteri ASCII"; +static char str_OnlyOne = "Uno solo"; +static char str_OnlyOneCurs = "Ci può essere solo una classe d'ancore marcata con 'curs'"; +static char str_CantChange = "Modifica impossibile" +static char str_CantChangeCurs = "La marca di una classe d'ancore connessa a 'curs' non può essere modificata"; + /* Names of otf tags for GPOS features for anchor */ +static char *str_abvm = "Sulla marca di base"; +static char *str_blwm = "Sotto la marca di base"; +static char *str_markT = "Posizione della marca"; +static char *str_mkmk = "Marca verso marca"; +static char *str_curs = "Attacco del corsivo"; + + /* Private info */ +static char *str_PrivateKey = "Chiave privata"; +static char *str_KeyInPrivate = "Chiave (del dizionario privato)"; +static char *str_Add = "Aggiungere"; +static char mnemonic_Add = 'A'; + /* TTF Values */ +static char *str_UltraCondensed = "Ultra-condensato (50%)" +static char *str_ExtraCondensed = "Extra-condensato (62.5%)" +static char *str_Condensed75 = "Condensato (75%)" +static char *str_SemiCondensed = "Semi-condensato (87.5%)" +static char *str_Medium100 = "Medio (100%)" +static char *str_SemiExpanded = "Semi-allargato (112.5%)" +static char *str_Expanded125 = "Allargato (125%)" +static char *str_ExtraExpanded = "Extra-allargato (150%)" +static char *str_UltraExpanded = "Ultra-allargato (200%)" +static char *str_Thin100 = "100 Fine"; +static char *str_ExtraLight200 = "200 Extra-chiaro"; +static char *str_Light300 = "300 Chiaro"; +static char *str_Book400 = "400 Libro"; +static char *str_Medium500 = "500 Medio"; +static char *str_DemiBold600 = "600 Neretto"; +static char *str_Bold700 = "700 Nero"; +static char *str_Heavy800 = "800 Nerissimo"; +static char *str_Black900 = "900 Extra-nero"; +static char *str_EmbeddablePopup = "Questo font può venire incluso in un documento (pdf)?\nSe sì, quali sono i permessi relativi al documento e al font?"; +static char *str_Embeddable = "Può venire incluso"; +static char mnemonic_Embeddable = 'E'; +static char *str_LineGapPopup = "Imposta l'interlinea sia nelle tavole OS/2 sia in hhea"; +static char *str_LineGap = "Interlinea:"; +static char mnemonic_LineGap = 'L'; +static char *str_VLineGapPopup = "Imposta l'interlinea nella tavola vhea.\nCiò imposta lo spazio fra due colonne di testo con scrittura verticale."; +static char *str_VLineGap = "Intercolonna:"; +static char mnemonic_LineGap = 'R'; +static char *str_NeverEmbeddable = "Né inclusione/Né modifica"; +static char *str_OnlyPrint = "Documento stampabile"; +static char *str_EditableDoc = "Document modificabile"; +static char *str_Installable = "Font installabile"; +static char *str_NoSubsetting = "Il font non può essere parziale"; +static char *str_NoSubsettingPopup = "Se selezionato, il font deve essere incluso totalmente\nnel documento se almeno uno dei caratteri vine usato.\nAltrimenti l'inclusione può essere limitata al sottoinsieme utilizzato."; +static char *str_OnlyBitmaps = "Solo le bitmaps"; +static char *str_OnlyBitmapsPopup = "Solo le bitmaps possono venire incluse.\nI contorni vettoriali non lo possono.\n(Se il font non contiene nessuna bitmap, non si può includere nulla)"; +static char *str_Serif = "Con grazie"; +static char *str_SansSerif = "Senza grazie"; +static char *str_Monospace = "Spaziatura fissa"; +static char *str_Script = "Calligrafico"; +static char *str_Decorative = "Decorativo"; +static char *str_Any = "Qualunque"; +static char *str_NoFit = "Non adatto"; +static char *str_TextDisplay = "Testo & Display"; +static char *str_Pictoral = "Ornato"; +static char *str_Cove = "Cavo"; +static char *str_ObtuseCove = "Cavo ottuso"; +static char *str_SquareCove = "Cavo quadrato"; +static char *str_ObtuseSquareCove = "Cavo ottuso-quadrato"; +static char *str_Square = "Quadrato"; +static char *str_Thin = "Sottile"; +static char *str_Bone = "Ossatura"; +static char *str_Exaggerated = "Esagerato"; +static char *str_Triangle = "Triangolo"; +static char *str_NormalSans = "Grazia normale"; +static char *str_ObtuseSans = "Grazia ottusa"; +static char *str_PerpSans = "Grazia perpendicolare"; +static char *str_Flared = "Svasato"; +static char *str_Rounded = "Arrotondato"; +static char *str_VeryLight = "Molto chiaro"; +static char *str_Light = "Chiaro"; +static char *str_Book = "Libro"; +static char *str_Medium = "Medio"; +static char *str_Demi = "Semi"; +static char *str_Bold = "Nero"; +static char *str_Heavy = "Nerissimo"; +static char *str_Black = "Nero"; +static char *str_Nord = "Nord"; +static char *str_OldStyle = "Stile antico"; +static char *str_Modern = "Moderno"; +static char *str_EvenWidth = "Larghezza uniforme"; +static char *str_Expanded = "Largo"; +static char *str_Condensed = "Stretto"; +static char *str_VeryExpanded = "Molto largo"; +static char *str_VeryCondensed = "Molto stretto"; +static char *str_Monospaced ="A spaziatura uniforme"; +static char *str_VeryLow ="Molto basso"; +static char *str_Low ="Basso"; +static char *str_MediumLow ="Medio basso"; +static char *str_MediumHigh ="Medio alto"; +static char *str_High ="Alto"; +static char *str_VeryHigh ="Molto alto"; +static char *str_GradDiag ="Graduale/Diagonale"; +static char *str_GradTrans ="Graduale/Transizionale"; +static char *str_GradVert ="Graduale/Verticale"; +static char *str_GradHor ="Graduale/Orizzontale"; +static char *str_RapidVert ="Rapido/Verticale"; +static char *str_RapidHor ="Rapido/Orizzontale"; +static char *str_InstantVert ="Istantaneo/Verticale"; +static char *str_NormalContact ="Normale/Contatto"; +static char *str_NormalWeighted ="Normale/Pesato"; +static char *str_NormalBoxed ="Normale/Inscatolato"; +static char *str_NormalFlattened ="Normale/Schiacciato"; +static char *str_NormalRounded ="Normale/Arrotondato"; +static char *str_NormalOffCenter ="Normale/Fuori centro"; +static char *str_NormalSquare ="Normale/Quadrato"; +static char *str_ObliqueContact ="Obliquo/Contatto"; +static char *str_ObliqueWeighted ="Obliquo/Pesato"; +static char *str_ObliqueBoxed ="Obliquo/Inscatolato"; +static char *str_ObliqueFlattened ="Obliquo/Schiacciato"; +static char *str_ObliqueRounded ="Obliquo/Arrotondato"; +static char *str_ObliqueOffCenter ="Obliquo/Fuori centro"; +static char *str_ObliqueSquare ="Obliquo/Quadrato"; +static char *str_StraightArmsH = "Aste dritte/Orizzontale"; +static char *str_StraightArmsW = "Aste dritte/Cuneo"; +static char *str_StraightArmsV = "Aste dritte/Verticale"; +static char *str_StraightArmsSS = "Aste dritte/Grazia unica"; +static char *str_StraightArmsDS = "Aste dritte/Doppia grazia"; +static char *str_NStraightArmsH = "Aste curve/Orizzontale"; +static char *str_NStraightArmsW = "Aste curve/Cuneo"; +static char *str_NStraightArmsV = "Aste curve/Verticale"; +static char *str_NStraightArmsSS = "Aste curve/Grazia singola"; +static char *str_NStraightArmsDS = "Aste curve/Doppia grazia"; +static char *str_StandardTrimmed = "Standard/Ritagliato"; +static char *str_StandardPointed = "Standard/Appuntito"; +static char *str_StandardSerifed = "Standard/Con grazie"; +static char *str_HighTrimmed = "Alto/Ritagliato"; +static char *str_HighPointed = "Alto/Appuntito"; +static char *str_HighSerifed = "Alto/Con grazie"; +static char *str_ConstantTrimmed = "Costante/Ritagliato"; +static char *str_ConstantPointed = "Costante/Appuntito"; +static char *str_ConstantSerifed = "Costante/Con grazie"; +static char *str_LowTrimmed = "Basso/Ritagliato"; +static char *str_LowPointed = "Basso/Appuntito"; +static char *str_LowSerifed = "Basso/Con grazie"; +static char *str_ConstantSmall = "Costante/Piccolo"; +static char *str_ConstantStandard = "Costante/Standard"; +static char *str_ConstantLarge = "Costante/Grande"; +static char *str_DuckingSmall = "Abbassato/Piccolo"; +static char *str_DuckingStandard = "Abbassato/Standard"; +static char *str_DuckingLarge = "Abbassato/Grande"; +static char *str_WidthClass ="Classe di larghezza"; +static char mnemonic_WidthClass ='C'; +static char *str_WeightClass ="Classe di peso"; +static char mnemonic_WeightClass ='W'; +static char *str_PFMFamily ="Famiglia PFM"; +static char mnemonic_PFMFamily ='F'; +static char *str_Family ="Famiglia"; +static char mnemonic_Family ='F'; +static char *str_Serifs ="Grazie"; +static char mnemonic_Serifs ='S'; +static char *str_Weight ="Peso"; +static char mnemonic_Weight ='W'; +static char *str_Proportion ="Proporzione"; +static char mnemonic_Proportion ='P'; +static char *str_Contrast ="Contrasto"; +static char mnemonic_Contrast ='C'; +static char *str_StrokeVar ="Variazione del tratto"; +static char mnemonic_StrokeVar ='V'; +static char *str_ArmStyle ="Stile del braccio"; +static char mnemonic_ArmStyle ='A'; +static char *str_Letterform ="Forma della lettera"; +static char mnemonic_Letterform ='L'; +static char *str_MidLine ="Linea mediana"; +static char mnemonic_MidLine ='M'; +static char *str_XHeight ="X-Height"; +static char mnemonic_XHeight ='X'; + /* TTF Names */ +static char *str_Styles = "Stili (Sotto famiglia)"; +static char *str_UniqueID = "UniqueID"; +static char *str_Version = "Versione"; +static char mnemonic_Version = 'V'; +static char *str_Fullname = "Nome completo"; +static char *str_Trademark = "Marca commerciale"; +static char *str_Manufacturer = "Fabbricante"; +static char *str_Designer = "Disegnatore"; +static char *str_Descriptor = "Descrittore"; +static char *str_VenderURL = "URL del venditore"; +static char *str_DesignerURL = "URL del disegnatore"; +static char *str_License = "Licenza"; +static char *str_LicenseURL = "URL della licenza"; +static char *str_OTFFamily = "Famiglia preferita"; +static char *str_OTFStyles = "Stili preferiti"; +static char *str_CompatableFull = "Compatibilità totale"; +static char *str_SampleText = "Testo 'demo'"; +static char *str_TranslateStyle = "Tradurre lo stile"; + /* MS Language list */ +/* Language & Country (where applicable) in the native language if I can find */ +/* it, in English if I can't. Followed by the 2char language _ 2char country */ +/* (again country isn't always applicable. Should basque be ES, FR? */ +static char *str_Albanian = "Albanese sq_AL"; +static char *str_Arabic = "Arabo ar"; +static char *str_Basque = "Basque eu"; +static char *str_Byelorussian = "Bielorussia be_BY"; +static char *str_Bulgarian = "Bulgaro bg_BG"; +static char *str_Catalan = "Catalano ca"; +static char *str_MSChinese = "Cinese zh_CN"; +static char *str_Croatian = "Croato hr"; +static char *str_Czech = "Ceco cs_CZ"; +static char *str_Danish = "Danese da_DK"; +static char *str_Dutch = "Olandese nl_NL"; +static char *str_Flemish = "Fiammingo nl_BE"; +static char *str_BrEnglish = "Inglese britannico en_UK"; +static char *str_AmEnglish = "Inglese americano en_US"; +static char *str_CaEnglish = "Inglese canadese en_CA"; +static char *str_AuEnglish = "Inglese australiano en_AU"; +static char *str_NZEnglish = "Inglese neozelandese en_NZ"; +static char *str_IEEnglish = "Inglese d'Irlanda en_IE"; +static char *str_Estonia = "Estone et_EE"; +static char *str_Finnish = "Finlandese fi_FI"; +static char *str_FRFrench = "Francese di Francia fr_FR"; +static char *str_BEFrench = "Francese belga fr_BE"; +static char *str_CAFrench = "Francese canadese fr_CA"; +static char *str_CHFrench = "Francese svizzero fr_CH"; +static char *str_LUFrench = "Francese lussemburghese fr_LU"; +static char *str_ITFrench = "Francese valdostano fr_IT"; +static char *str_DEGerman = "Tedesco di Germania de_DE"; +static char *str_CHGerman = "Tedesco svizzero de_CH"; +static char *str_ATGerman = "Tedesco austriaco de_AT"; +static char *str_LUGerman = "Tedesco lussemburghese de_LU"; +static char *str_LIGerman = "Tedesco del Liechtenstein de_LI"; +static char *str_ITGerman = "Tedesco altoatesino de_IT"; +static char *str_Greek = "Greco el_GR"; +static char *str_Hebrew = "Israeliano he_IL"; +static char *str_Hungarian = "Ungherese hu_HU"; +static char *str_Icelandic = "Islandese is_IS"; +static char *str_Italian = "Italiano it_IT"; +static char *str_CHItalian = "Italiano svizzero it_CH"; +static char *str_Japanese = "Giapponese jp_JP"; +static char *str_Latvian = "Lettone lv_LV"; +static char *str_Lithuanian = "Lituano lt_LT"; +static char *str_Norwegian = "Norvegese Bokmal no_NO"; +static char *str_NorwegianN = "Norvegese Nynorsk no_NO"; +static char *str_Polish = "Polacco pl_PL"; +static char *str_PTPortuguese = "Portoghese di Portogallo pt_PT"; +static char *str_BRPortuguese = "Portoghese brasiliano pt_BR"; +static char *str_Romanian = "Rumenoro_RO"; +static unichar_t str_Russian = { 0x420, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, ' ', 'r','u','_','R','U', '\0' }; +static char *str_Slovak = "Slovacco sk_SK"; +static char *str_Slovenian = "Sloveno sl_SI"; +static char *str_TradSpanish = "Spagnolo di Spagna tradizionale es_ES"; +static char *str_MXSpanish = "Spagnolo messicano es_MX"; +static char *str_ModSpanish = "Spagnolo di Spagna moderno es_ES"; +static char *str_Swedish = "Svedese sv_SE"; +static char *str_Turkish = "Turco tr_TR"; +static char *str_Ukrainian = "Ukraino uk_UA"; + /* Generate fonts */ /* savefontdlg */ +static char str_Format[] = "Format:"; +static char str_Savefailedtitle[] = "Errore di salvataggio"; +static char str_Outputafm[] = "Crea AFM"; +static char str_Outputpfm[] = "Crea PFM"; +static char *str_OutputAfmPopup = "Il file AFM contiene le metriche usate da molti programmi\ndi elaborazione di testo se usano font PostScript\256."; +static char *str_OutputPfmPopup = "Il file PFM contiene le informazioni necessarie a Windows\nper installare un font PostScript\256."; +static char str_AppleMode[] = "Apple"; +static char *str_AppleModePopup = "Apple e MS/Adobe divergono per quanto riguarda il formato dei file truetype e opentype\nQuesta scelta ti permette di scegliere fra i 2 standard per il tuo font." +static char str_Nooutlinefont[] = "Nessun vettore"; +static char str_Nobitmapfonts[] = "Nessuna bitmap"; + static char str_Afmfailedtitle[] = "Errore di scrittura del file AFM"; +static char str_Pfmfailedtitle[] = "Errore di scrittura del file PFM"; +static char *str_SavingFont = "Salvataggio del font"; +static char *str_SavingPSFont = "Salvataggio del font Postscript"; +static char *str_SavingMultiplePSFonts = "Salvataggio del font Multiple Postscript"; +static char *str_SavingTTFont = "Salvataggio del font TrueType"; +static char *str_SavingCIDFont = "Salvataggio del font CID"; +static char *str_SavingAFM = "Salvataggio del file AFM"; +static char *str_SavingPFM = "Salvataggio del file PFM"; +static char *str_SavingBitmapFonts = "salvataggio della/e bitmap"; +static char *str_NotCID = "Non è un formato CID"; +static char *str_NotCIDOk = "Stai cercando di salvare un font CID in un formato\nnon-CID. È possible, ma solo il subset del font corrente\nsarà salvato. È proprio quello che vuoi fare?"; +static char *str_PixelList = "Mostra i pixel"; +static char *str_EncodingTooLarge="Codifica troppo grande"; +static char *str_TwoBEncIn1BFont = "Il tuo font ha una codifica su due byte, ma cerchi di salvarlo\nin un formato con codifica a 1 byte. Questo significa che non potrai\naccedere ai caratteri superiori a 256 senza ricodificare il font.n\nVuoi farlo lo stesso?"; +static char *str_GreymapDepth = "Bits per pixel nella lista dei grigi" +static char *str_BDFResolution = "Risoluzione BDF" +static char *str_Other_ = "Altre"; +static char *mnemonic_Other_ = "O"; +static char *str_GuessResPopup = "Indovina la dimensione di ogni font secondo la dimensione dei pixel."; +static char *str_FindMultipleMap = "Cerca il file di definizione dei sotto-font"; +static char *str_NoSubFontDefinitionFile = "Non esiste il file di definizione dei sotto-font"; +static char *str_PSNames = "Nomi PS"; +static char *str_PSNamesPopup = "Vuoi che il file contegna i nomi di tutti i caratteri del font?"; +static char *str_TTFHintsPopup = "Vuoi che il file contenga gli hint TrueType?\nFontForge non genererà nuove istruzioni, ma semplicemente userà quanto\nè associato con ciascun carattere." +static char *str_WrongSFDFile = "Errato file SFD?"; +static char *str_BadSFDFile = "Questo sembra un file FontForge.\nNon un file TeX di sotto-font.\nUNa confusione nei nomi d'estensione piuttosto dannosa."; +static char *str_BadFamilyForMac = "Famiglia Mac errata"; +static char *str_BadMacFamily = "Per ottenere un file con una famiglia Mac , il font corrente deve avere uno stile di tipo Normal, Regular, etc. e devono essere aperti altri font con lo stesso nome di famiglia."; +static char *str_TwoFontsSameStyle = "Ci sono 2 font aperti con lo strsso nome di famiglia e lo stesso stile. %.30hs et %.30hs"; +static char *str_DifferentEncodings = "Il font %1$.30hs ha un encoding uguale a quello di %2$.30hs"; +static char *str_NotdefName = "Nome Notdef"; +static char *str_NotdefChar = "Il carattere con codice %d si chiama\".notdef\" ma contiene un contorno. Con questo nome \".notdef\" non sarà incluso nel font in corso di creazione. Lo puoi rinominare usando Elemento->Informazioni carattere. Vuoi continuare a creare questo font (senza questo carattere)?"; +static char *str_EmSizeBad = "Dimensioni di Em non-standard"; +static char *str_PSEmSize1000 = "La convenzione è che i font PostScript abbiano una dimensione dell'Em di 1000. Questo font ha un Em di %d. Non è sbagliato ma potresti cambiare la misura dell'Em con Elemento->Informazioni sul font->PS Generale.\nVuoi continuare a creare il font nonostante ciò?"; +static char *str_TTFEmSize2 = "La convenzione è che i font TrueType abbiano una dimensione dell'Em pari a una potenza di 2. Questo font ha un Em di %d. Non è sbagliato, ma potresti modificare la dimensione dell'Em con Elemento->Informazioni sul font->PS General.\nVuoi continuare a creare il font nonostante ciò?"; + /* Goto character ... */ +static char str_Badnumberin[] = "Numero errato in "; +static char str_Enternameofchar[] = "Nome di un carattere nel font"; +static char str_Couldntfindchar[] = "Carattere introvabile: %.70hs"; +static char str_CouldntfindcharU[] = "Carattere introvabile: %.70s"; +static char str_CouldntfindcharT[] = "Carattere introvabile"; + /* Font has changed dlg */ +static char str_Dontsave[] = "Non salvare"; +static unichar_t mnemonic_Dontsave[] = 'D'; +static char str_Fontchange[] = "Font modificato"; +/* Font %.70s in file %.70s has been changed.\nDo you want to save it? */ +static char str_Fontchangepre[] = "Il font "; +static char str_Fontchangemid[] = " nel file "; +static char str_Fontchangepost[] = " è stato modificato.\012Lo vuoi salvare?"; +static char str_Fontchangerevertpost[] = " è stato modificato.\012Ritornado perderai tutte le modifiche.\012Vuoi veramente ritornare?"; + /* General messages from fontview.c */ +static char str_Revert[] = "Ritornare"; +static unichar_t mnemonic_Revert[] = 'R'; +static char str_Manywin[] = "Molte finestre!"; +static char str_Toomany[] = "Questo ti porta ad aprire più di 10 finestre.\nÈ proprio quello che vuoi fare?"; +static char *str_MergeKernInfo = "Riunisci le informazioni di crenatura"; +static char *str_OpenPostscript = "Apri un font Postscript"; +static char *str_Loading = "Sto caricando..."; +static char *str_LoadingFontFrom = "Carico di un font da "; +static char *str_ReadingGlyphs = "Lettura dei glifi"; +static char *str_ReadingAFM = "Lettura del file AFM"; +static char *str_InterpretingGlyphs = "Interpretazione dei glifi"; +static char *str_CouldntOpenFontTitle = "Impossibile leggere il font"; +static char *str_NoSuchFontFile = "%.100hs non esiste"; +static char *str_FontFileNotReadable = "Non puoi leggere il file %.100hs"; +static char *str_CouldntParseFont = "%.100hs ha un formato errato"; +static char *str_SaveFailed = "Errore di registrazione"; +static char *str_Transforming = "Trasformazione..."; +static char *str_Simplifying = "Semplificazione..."; +static char *str_AddingExtrema = "Aggiungi punti alle estremità..."; +static char *str_RemovingOverlap = "Soppressione dei ricoprimenti..."; +static char *str_CorrectingDirection = "Correzione della direzione..."; +static char *str_Rounding = "Arrotonda ll'intero..."; +static char *str_Autotracing = "Autotrace..."; +static char *str_ClearDependent = "Vuoi cancellare %.30hs che è richiamato da un altro\nacarattere. Sei sicuro di voler continuare?"; +static char *str_UnlinkAll = "Sconcatenare tutto"; +static char *str_Unlink = "Sconcatenare"; +static char *str_dPixelBitmap = "Bitmap con %d pixel"; +static char *str_ddPixelBitmap = "itmap con %d@%d pixel"; +static char *str_RestrictedRightsFont = "Questo font indica un FSType di 2\n(Licenza ristretta). Questo significa che non è modificabile senza\n il permesso del titolare dei diritti.\n\nHai questi diritti?"; +static char *str_RestrictedFont = "Licenza ristretta"; +static char *str_CloseFont = "Prego, chiudi questo font"; +static char *str_CloseFontForCID = "Prego, chiudi %hs prima di inserirlo in un font CID"; +static char *str_CIDRemoveFontCheck = "Sei sicuro di voler cancellare il sotto-font %1$.40hs dal font CID %2$.40hs?"; +static char *str_FlippedRef = "Riferimento invertito"; +static char *str_FlippedRefUnlink = "%.50hs contiene un riferimento invertito (di cui il senso di rotazione non è \ncompatibile). Allo stato attuale ciò non può essere corretto.\nVuoi che FontForge la cancelli e la corregga in seguito?"; +static char *str_Baseline = "Linea di base"; +static char *str_Origin = "Origine"; +static char *str_AdvanceWidthAsBar = "Avanzamento mostrato da una barra"; +static char *str_AdvanceWidthAsLine = "Avanzamento mostrato da una linea"; +static char *str_AdvanceBarPopup = "Mostra l'avanzamento mediante una barra sotto il carattere\nche rappresenti il valore dell'avanzamento"; +static char *str_AdvanceLinePopup = "Mostra l'avanzamento mediante una linea perpendicolare \nalla direzione dell'avanzamento"; + /* Messages from accented characters */ +static char str_Buildingaccented[] = "Crea i caratteri accentati"; +static char str_Replacearing[] = "Sostituisci Å"; +static char str_Areyousurearing[] = "Sei sicuro di volere sostituire Å?\nIl circoletto non sarà più legato ad A."; +static char str_Yes[] = "Sì"; +static unichar_t mnemonic_Yes[] = 'O'; +static char str_No[] = "No"; +static unichar_t mnemonic_No[] = 'N'; + /* Choices from bitmap editing */ +static char str_Rectangle[] = "Rettangolo"; +static char str_FilledRectangle[] = "Rettangolo pieno"; +static char str_Elipse[] = "Ellissi"; +static char str_FilledElipse[] = "Ellissi piena"; + /* Get Info ... */ +static char str_Multiple[] = "Diversi"; +static char str_AlreadyCharUnicode[] = "Esiste già un carattere di codice,\n(nominato %$1.40hs, nell'encoding attuale %$2d)\nÈ proprio quello che vuoi fare?"; +static char str_Alreadycharnamed[] = "C'è già un carattere con questo nome,\nVuopi scambiare i nomi?"; +/* There is already a ligature made from these components,\n(named %.10s at local encoding %d)\nIs that what you want? */ +static char str_AlreadyLigature[] = "C'è già una legatura con questi componenti,\012(chiamata %1$.40hs nell'encoding corrente%2$d")\012È proprio quello che vuoi fare?"; +static char str_Badligature[] = "Una legatura non può contenere se stessa"; +/* "The component %.20s is not in this font,\nIs that what you want?" */ +static char str_MissingComponent[] = "Il componente \"%.40s\" non è in questo font,\012È proprio quello che vuoi fare?"; +static char str_SelfReferential = "Questa sostituzione si auto-referenzia" +static char str_Done[] = "Terminato"; +static unichar_t mnemonic_Done[] = 'F'; +static char str_Ligpop[] = "Se questo carattere deve essere una legatura, indica\ni nomi dei caratteri di cui si compone."; +static char *str_Show[] = "Mostra"; +static unichar_t mnemonic_Show[] = 'S'; +static char *str_PointInfo = "Informazione sui punti"; +static char *str_ImageInfo = "Informazione sull'immagine"; +static char *str_AnchorPointInfo = "Informazione sulle ancore"; +static char *str_ReferenceInfo = "Informazione sui riferimenti"; +static char *str_Dependents = "Dipendenze"; +static char *str_Offset = "Offset"; +static char *str_BaseX = "Base X"; +static char *str_BaseY = "Base Y"; +static char *str_NextCP = "CP successivo:"; +static char *str_NextCPX = "CP X successivo"; +static char *str_NextCPY = "CP Y successivo"; +static char *str_PrevCP = "CP precedente:"; +static char *str_PrevCPX = "CP X precedente"; +static char *str_PrevCPY = "CP Y precedente"; +static char *str_UnicodeL = "Unicode"; +static char *str_LigatureL = "Legatura"; +static char *str_Components = "Componenti"; +static char *str_AltPos = "Posizione alternativa"; +static char *str_Subs = "Subs"; +static char *str_AltSubs = "Alt Subs"; +static char *str_MultSubs = "Mult Subs"; +static char *str_UnicodeName = "Nome Unicode:"; +static char mnemonic_UnicodeName = 'N'; +static char *str_UnicodeValue = "Valore Unicode:"; +static char mnemonic_UnicodeValue = 'V'; +static char *str_UnicodeChar = "Car. Unicode:"; +static char mnemonic_UnicodeChar = 'h'; +static char *str_SetFromName = "Fatto con i nomi"; +static char mnemonic_SetFromName = 'a'; +static char *str_SetFromValue = "Fatto con i valori"; +static char mnemonic_SetFromValue = 'u'; +static char *str_Ligature = "Legatura:"; +static char mnemonic_Ligature = 'L'; +static char *str_AccentedComponents = "Carattere accentato fatto da:"; +static char *str_CompositComponents = "Carattere composto da:"; +static char *str_NoComponents = "Non ci sono i componenti"; +static char *str_Color = "Colore:"; +static char *str_TransformedBy = "Trasformato con:"; +static char *str_NotUnicodeBMP = "Attenzione: questo valore non è nella BMP Unicode.\nÈ davvero quello che desideri?"; +static char *str_PossiblyTooBig = "Valore fuori limiti?"; +static char *str_OutOfRange = "Valore fuori limiti"; +static char *str_TransformationMatrix = "Matrice di trasformazione"; +static char *str_TransformChanged = "Matrice di trasformazione modificata"; +static char *str_TransformChangedApply = "Hai modificato la matrice di trasformazione, vuoi usare la sua nuova definizione?"; +static char *str_TransformPopup = "La matrice di trasformazione specifica come i punti\n nel carattere devono essere trasformati prima di essere\ninclusi nel nuovo carattere.\n x(nuovo) = tm[1,1]*x + tm[2,1]*y + tm[3,1]\n y(nuovo) = tm[1,2]*x + tm[2,2]*y + tm[3,2]"; +static char *str_MakeNewClass = "Crea una nuova classe di ancore"; +static char *str_MakeNewAnchorClass = "Non cino più classi d'ancore inutilizzate\n alle quali assegnare un nuovo punto. Se vuoi\nuna nuova ancora, devi\ndefinire una nuova classe d'ancore\nmediante Elemento->Informazioni sul font"; +static char *str_Mark = "Marca"; +static char *str_BaseChar = "BaseChar"; +static char *str_BaseLig = "BaseLig"; +static char *str_BaseMark = "BaseMark"; +static char *str_CursiveEntry = "CursEntry"; +static char *str_CursiveExit = "CursExit"; +static char *str_LigIndex = "Lig Index:"; +static char *str_LastAnchor = "Ultimo punto di ancoraggio"; +static char *str_RemoveLastAnchor = "stai per cancellare l'ultima ancora di questo carattere.\nQuesto provoca la chiusura della finestra di dialogo. È davvero quello che vuoi?" +static char *str_ClassUsed = "Classi già utilizzate" +static char *str_AnchorClassUsed ="Questa classe di ancore è già associata a un punto di questo carattere"; +static char *str_BadClass = "Classe non autorizzata" +static char *str_AnchorClassCurs ="Non puoi modificare un ancora collegata con la classe 'curs'"; +static char *str_XC = "X:"; +static char mnemonic_XC = 'X'; +static char *str_YC = "Y:"; +static char mnemonic_YC = 'Y'; +static char *str_IndexInUse = "Indice già usato"; +static char *str_LigIndexInUse = "Questo indice di legatura è già usato"; +static char *str_OutOfOrder = "Non in ordine"; +static char *str_IndexOutOfOrder = "Le marche nelle legature devono essere ordinate nel senso della scrittura.\nQuesta e %d non lo sono."; +static char *str_TooBig = "Troppo grande"; +static char *str_IndexTooBig = "Questo indice è molto più grande del suo vicino più prossimo" +static char *str_BadPOSSUB = "GPOS/GSUB errato"; +static char *str_BadPOSSUBPaste = "La stringa deve cominciare con i 4 caratteri del tipo di campo, seguiti da uno spazio, e poi dalle informazioni"; +static char *str_ExpectedEquals = "Formato dei dati di posizione errato: sono previsti 4 caratteri = poi i dati"; +static char *str_SimpleSubsOneComponent = "Una sostituzione semplice deve contenere esattamente un componente"; +static char *str_NewPosition = "Nuova variante di posizione"; +static char *str_NewSubstitution = "Nuova variante di sostituzione"; +static char *str_NewAlternate = "Nuova lista di alternative"; +static char *str_NewMultiple = "Nuova lista multipla"; +static char *str_NewLigature = "Nuova legatura"; +static char *str_EditPosition = "Modifica la variante di posizione"; +static char *str_EditSubstitution = "Modifica la variante di sostituzione"; +static char *str_EditAlternate = "Modifica la lista di alternative"; +static char *str_EditMultiple = "Modifica la lista multipla"; +static char *str_EditLigature = "Modifica la legatura"; +static char *str_DuplicateTag = "Targhetta ripetuta"; +static unichar_t *str_Dx = { 0x2206, 'X', ':' }; +static unichar_t *str_Dy = { 0x2206, 'Y', ':' }; +static unichar_t *str_Dxa = { 0x2206, 'X','A','d','v','a','n','c','e', ':' }; +static unichar_t *str_Dya = { 0x2206, 'Y','A','d','v','a','n','c','e', ':' }; + /* Import */ +static char str_Duppixelsize[] = "Dimensione di pixel ripetuta"; +/* "The font database already contains a bitmap\nfont with this pixelsize (%d)\nDo you want to overwrite it?" */ +static char str_Duppixelsizepre[] = "Il font contiene già delle bitmap di questa grandezza"; +static char str_Duppixelsizepost[] = "\nLa vuoi cancellare?"; +static char str_NoBitmapFont = "Manca il font bitmap"; +static char str_NoBitmapFontIn = "Manca il font bitmap in %hs"; + /* Ligature feature tags */ +static char str_RequiredLig = "Ligature richiesta" +static char str_StandardLig = "Ligature standard" +static char str_DiscretionaryLig = "Ligature facoltativa" +static char str_HistoricLig = "Ligature storica" +static char str_FractionLig = "Frazione" +static char str_AboveBaseSubs = "Sostituzioni sopra la base" +static char str_AltFrac = "Altre frazioni" +static char str_Akhand = "Akhand" +static char str_BelowBaseForms = "Forme sotto la base" +static char str_BelowBaseSubs = "Sostituzioni sotto la base" +static char str_GlyphCompDecomp = "Composizione/Decomposizione del glifo" +static char str_HalfForm = "Mezze forme" +static char str_HalantForm = "Forme Halant" +static char str_LeadingJamo = "Forme Jamo anteriori" +static char str_TrailingJamo = "Forme Jamo posteriori" +static char str_VowelJamo = "Forme Jamo vocaliche" +static char str_Nukta = "Forme Nukta" +static char str_PreBaseForms = "Forme prima della base" +static char str_PreBaseSubs = "Sostituzioni prima della base" +static char str_PostBaseForms = "Forme dopo la base" +static char str_PostBaseSubs = "Sostituzioni dopo la base" +static char str_Reph = "Forma Reph" +static char str_VattuVariants = "Varianti Vattu" + /* simple positioning feature tags */ +static char str_CaseSensForms = "Forme dipendenti da Maiu./Minusc."; +static char str_CapitalSpacing = "Spaziatura della maiuscola"; +static char str_AltHalfWidths = "Mezza larghezza alternativa"; +static char str_LeftBounds = "Limiti di sinistra"; +static char str_OpticalBounds = "Limiti ottici"; +static char str_PropAltMet = "Metriche alternative proporzionali"; +static char str_QuartWidths = "Quarti di larghezza"; +static char str_RightBounds = "Limiti di destra"; +static char str_ThirdWidths = "Terzi di larghezza"; +static char str_AltVertMet = "Metriche verticali alternative"; +static char str_AltVertHalfMet = "Mezze metriche alternative verticali"; +static char str_AltVertPropMet = "Metriche proporzionali alternative verticali"; + /* simple substitution feature tags */ +static char str_AllAlt = "Accedi a tutte le alternative"; +static char str_AboveBaseForms = "Sopra le forme di base"; +static char str_Cap2PetiteCaps = "Da maiuscolo a maiuscoletto"; +static char str_Cap2SmallCaps = "Da maiuscolo a maiuscoletto"; +static char str_Denominators = "Denominatori"; +static char str_ExpertForms = "Forme esperte"; +static char str_TerminalForms = "Forme terminali"; +static char str_FullWidths = "Larghezze intere"; +static char str_HistoricalForms = "Forme storiche"; +static char str_HorKanaAlt = "Alternative Kana orizzontali"; +static char str_Hanja2Hangul = "Da Hanja a Hangul" +static char str_HalfWidths = "Mezze larghezze"; +static char str_IsolatedForms = "Forme isolate"; +static char str_Italics = "Corsivo"; +static char str_JIS78Forms = "Forme JIS78"; +static char str_JIS83Forms = "Forme JIS83"; +static char str_JIS90Forms = "Forme JIS90"; +static char str_LiningFigures = "Cifre di allineamento"; +static char str_LocalizedForms = "Forme localizzate"; +static char str_MedialForms = "Forme mediali"; +static char str_MathematicalGreek = " Greco matematico"; +static char str_AltAnnotForms = "Forme di annotazione alternative"; +static char str_Numerators = "Numeratori"; +static char str_OldstyleFigures = "Cifre Oldstyle "; +static char str_Ornaments = "Ornamenti"; +static char str_PetiteCaps = "Da minuscolo a maiuscoletto"; +static char str_PropWidth = "Larghezza proporzionale"; +static char str_R2LAlt = "Alternative da destra a sinistra"; +static char str_RubyNoteForms = "Forme di notazione di Ruby "; +static char str_StylisticAlt = "Alternative stilistiche"; +static char str_ScientificInf = "Pedici scientifici"; +static char str_SmallCaps = "Da minuscolo a maiuscoletto"; +static char str_SimplifiedForms = "Forme semplificate"; +static char str_StyleSet1 = "Style Set 1"; +static char str_StyleSet2 = "Style Set 2"; +static char str_StyleSet3 = "Style Set 3"; +static char str_StyleSet4 = "Style Set 4"; +static char str_StyleSet5 = "Style Set 5"; +static char str_Subscript = "Pedice"; +static char str_Superscript = "Apice"; +static char str_Swash = "Swash"; +static char str_Titling = "Titolazione"; +static char str_TraditionalNameForms = "Forme con nomi tradizionali"; +static char str_TabNumb = "Numeri per tavole"; +static char str_TraditionalForms = "Forme tradizionali"; +static char str_Unicase = "Unicase"; +static char str_VerticalRot = "Alternative verticali (obsolete)"; +static char str_VertRotAlt = "Rotazioni & Alternative verticali"; +static char str_VertKana = "Alternative verticali Kana"; +static char str_SlashedZero = "Zero barrato"; + /* (multiple) alternate substitution feature tags */ +static char str_FinalGlyphLine = "Glifo finale allineato"; +static char str_JustificationAlt = "Alternative di justificazione"; +static char str_Randomize = "Randomizza" + /* Script tags */ +static char str_arab = "Arabo"; +static char str_armn = "Armeno"; +static char str_beng = "Bengalese"; +static char str_bopo = "Bopomofo"; +static char str_brai = "Braille"; +static char str_byzm = "Musica bizantina"; +static char str_cans = "Canadese sillabico"; +static char str_cher = "Cherokee"; +static char str_hani = "Ideogrammi CJK"; +static char str_cyrl = "Cirillico"; +static char str_DFLT = "Default"; +static char str_deva = "Devanagari"; +static char str_ethi = "Etiopico"; +static char str_geor = "Georgiano"; +static char str_grek = "Greco"; +static char str_gujr = "Gujarati"; +static char str_guru = "Gurmukhi"; +static char str_jamo = "Hangul Jamo"; +static char str_hang = "Hangul"; +static char str_hebr = "Israeliano"; +static char str_kana = "Hiragana & Katakana"; +static char str_knda = "Kannada"; +static char str_khmr = "Khmer"; +static char str_lao = "Laotiano"; +static char str_latn = "Latino"; +static char str_mlym = "Malayalam"; +static char str_mong = "Mongolo"; +static char str_mymr = "Birmano"; +static char str_ogam = "Ogham"; +static char str_orya = "Oriya"; +static char str_runr = "Runico"; +static char str_sinh = "Singalese"; +static char str_syrc = "Siriano"; +static char str_taml = "Tamil"; +static char str_telu = "Telugu"; +static char str_thaa = "Thaana"; +static char str_thai = "Tailandese"; +static char str_tibt = "Tibetano"; +static char str_yi = "Yi"; +static char str_ScriptC = "Script:"; +static char mnemonic_ScriptC = 'S'; +static char str_TagC = "Marca:"; +static char mnemonic_TagC = 'M'; +static char str_TagTooLong = "Marca troppo lunga"; +static char str_ScriptTagTooLong = "Le marche di Script sono limitate a 4 caratteri ASCII"; + /* Private Info */ +static char str_Bluequest[] = "Questo cambierà sia BlueValues sia OtherBlues.\nVuoi continuare?"; +static char str_Hstemquest[] = "Questo cambierà sia StdHW sia StemSnapH.\nVuoi continuare?"; +static char str_Vstemquest[] = "Questo cambierà sia StdVW sia StemSnapV.\nVuoi continuare?"; +static char str_Arrayquest[] = "Tabella attesa\nContinui lo stesso?"; +static char str_Numberquest[] = "Numero atteso\nContinui lo stesso?"; +static char str_Boolquest[] = "Booleano atteso\nContinui lo stesso?"; +static char str_Codequest[] = "Codice atteso\nContinui lo stesso?"; +static char str_Badtype[] = "Tipo errato"; +static char str_Delete[] = "Cancellare"; +static char mnemonic_Delete[] = 'D'; + /* Prefs */ +static char str_UTF_8[] = "UTF-8 (Unicode)"; +static char str_Default[] = "Default"; +static char *str_PrefsPopupAWS[] = "La modifica della larghezza di un carattere cambierà\nla larghezza di tutti i caratteri accentati\ncomposti a partire da questo qui."; +static char *str_PrefsPopupALS[] = "La modifica della spalla sinistra di un carattere cambierà\nla spalla sinistra di tutti i caratteri accentati\ncomposti a partire da questo qui"; +static char *str_PrefsPopupForNewFonts[] = "Encoding di default per tutti i nuovi font"; +static char *str_PrefsPopupLoc[] = "Insieme di caratteri usati dal clipboard locale,\ndal sistema dei file, ecc. (qui possono essere usati solo insiemi a 8 bit)"; +static char *str_PrefsPopupAH[] = "AutoHint prima della rasterizzazione"; +static char *str_PrefsPopupFN[] = "Nome usato per il campo 'Foundry'\nper la creazione di font BDF"; +static char *str_PrefsPopupTFN[] = "Nome usato dall'Identificatore del Venditore\nper la creazione di font ttf (tabella OS/2).\nMassimo quattro caratteri"; +static char *str_PrefsPopupXU[] = "Se viene specificata, deve essere una lista di numeri interi separati da spazi, tutti\ninferiori a 16777216, che identificano la tua organizzazione in modo univoco\nFontForge genererà un numero casuale per l'ultimo valore."; +static char *str_PrefsPopupRulers[] = "Mostra le scale nella finestra 'carattere'"; +static char *str_PrefsPopupSepHints[] = "Controlli distinti per gli hint orizzontali e verticali."; +static char *str_PrefsPopupIC[] = "Nella finestra 'Contorno' il tasto Shift impone lo spostamento\nparallelo all'inclinazione del corsivo piuttosto che alla verticale."; +static char *str_PrefsPopupAO[] = "Percentuale di un Em per separare un accento dal suo carattere di base\ncon il comando 'Crea caratteri accentati'"; +static char *str_PrefsPopupGA[] = "Quando mette un accento acuto o grave su una lettera, FontForge\ndeve centrarlo tendo conto della sua larghezza oppure lo deve centrare\ntendo conto del punto più basso dell'accento?"; +static char *str_PrefsPopupAA[] = "Numero di Em col quale le frecce di spostamento\nmuovono i punti selezionati"; +/*static char *str_PrefsPopupGF[] = "Adobe ha legato i nomi Delta, Omega et mu ai segni\nIncremento, Ohm e micro rispettivamente.\nQuesto appare molto strano ai disegnatori di font greci\nche usano quei nomi per le lettere dell'alfabeto.\nI nomi sono perciò ambigui. FontForge aggira l'ambiguità\ncreando i font con glifi supplementari.";*/ +/* Now called PrefsPopupGN with slightly different text */ +static char *str_PrefsPopupSD[] = "Specifica la distanza alla quale il puntatore del mouse deve\nessere vicino a una linea notevole (linea di base, larghezza,\ngriglia, spline, ecc...), per agganciarsi ad essa."; +static char *str_PrefsPopupBR[] = "Quando si crea un insieme di font BDF,\nFontForge deve chiedere la risoluzione dello schermo, o\nla deve indovinare in funzione della dimensione dei pixel?"; +static char *str_PrefsPopupATA[] = "Parametri supplementari da passare ad 'autotrace'"; +static char *str_PrefsPopupATK[] = "Chiede all'utente i paramenti per 'autotrace' ad ogni utilizzazione" +static char *str_PrefsPopupMFA[] = "Comandi da passare a 'mf' (METAFONT), il nome del file sarà inserito subito dopo"; +static char *str_PrefsPopupMFK[] = "Chiede all'utente i parametri per 'mf' ad ogni utilizzazione" +static char *str_PrefsPopupMFB[] = "FontForge carica delle grandi immagini nello sfondo dei caratteri\nprima di autotracciarli. Puoi conservare queste immagini per esaminare\nil risultato prodotto da 'mf', oppure le puoi cancellare per\nconservare spazio"; +static char *str_PrefsPopupMFE[] = "MetaFont (mf) produce molti messaggi su stdout.\nLa maggior parte delle volte non sono importanti, salvo quando qualcosa va storto." +static char *str_PrefsPopupG2N[] = "Quando si crea un font truetype o opentype, è talvolta utile\nconoscere la corrispondenza fra gli ids dei glifi truetype e\ni nomi dei caratteri. Questa opzione fa sì che FontForge produca un file\n(con estensione .g2n) contenente queste informazioni."; +static char *str_PrefsPopupPCE[] = "Quando si carica un font truetype o opentype che contiene contemporaneamente\nun encoding unicode et un encoding CJK, questa opzione permette di specificare\nquale encoding caricare." +static char *str_PrefsPopupXRF[] = "All'inizio FontForge carica diverse risorse legate allo schermol'écran.\nTalvolta è interessante esaminare queste risorse in un file.\nMa esse non sono lette che all'inizio, così che ogni modifica non potrà avere effetto che alla successiva\nesecuzione di FontForge."; +static char *str_Generic[] = "Informazioni generali"; +static char *str_PrefsFontInfo[] = "Informazioni sul font"; +static char *str_PrefsApps[] = "Argomenti"; +static char *str_Editing[] = "Modifica"; +static char *str_ScriptMenu[] = "Script per menu"; +static char *str_MenuName[] = "Nome del Menu"; +static char *str_ScriptMenuPopup[] = "Puoi creare un menu di script che contiene fino a 10 elementi.\nOgni elemento implica un nome da esporre e un nome di script da eseguire.\nIl nome del menu può contenere qualunque carattere Unicode.\nIl bottone indicato con \"...\" permette di cercare un file di script da eseguire."; +static char *str_ScriptFile[] = "File di script"; +static char *str_BrowseForFile[] = "..."; +static char *str_MenuNameWithNoScript[] = "Elemento del menu a cui non è associato nessuno script"; +static char *str_ScriptWithNoMenuName[] = "Script senza elemento nel menu"; +static char *str_PrefsAppNotice1 = "Normalmente FontForge lancia le applicazioni utilizzando" +static char *str_PrefsAppNotice2 = "la tua variabile di environnement PATH. Se desideri" +static char *str_PrefsAppNotice3 = "cambiare questo comportamento, puoi assegnare" +static char *str_PrefsAppNotice4 = "delle variabili con il percorso completo dell'eseguibile." +static char *str_PrefsAppNotice5 = "FontForge riconosce: BROWSER, MF e AUTOTRACE." +static char *str_PrefsAppNotice6 = "" + /* Hints */ +static char *str_base = "Base:"; +static unichar_t mnemonic_base = 'B'; +/*static char *str_size = "Grandezza:";*/ +static char *str_size = "Dimen.:"; +static unichar_t mnemonic_size = 'D'; +static char *str_HStem = "HStem"; +static unichar_t mnemonic_HStem = 'H'; +static char *str_VStem = "VStem"; +static unichar_t mnemonic_VStem = 'V'; +static char *str_Create = "Crea"; +static unichar_t mnemonic_Create = 'e'; +static char *str_PrevArrow = "< Precedente"; +static unichar_t mnemonic_PrevArrow = 'P'; +static char *str_NextArrow = "Successivo >"; +static unichar_t mnemonic_NextArrow = 'N'; +static char *str_MovePoints = "Sposta i punti"; +static unichar_t mnemonic_MovePoints = 'M'; +static char *str_MovePointsPopup = "Qunado si cambia la posizione dell'hint\nbisogna correggere la posizione di tutti i punti\nche cadono in quell'hint"; +static char *str_CreateHint = "Crea hint..."; +static char *str_CreateHorizontalHint = "Crea un hint per un'asta orizzontale"; +static char *str_CreateVerticalHint = "Crea un hint per un'asta verticale"; + /* expand stroke */ +static char *str_LineCap = "Estremità"; +static char *str_Butt = "Estremità tagliata"; +static unichar_t mnemonic_Butt = 'C'; +static char *str_Round = "Estremità arrotondata"; +static unichar_t mnemonic_Round = 'A'; +static char *str_Squareq = "Estremità squadrata"; +static unichar_t mnemonic_Squareq = 'R'; +static char *str_LineJoin = "Raccordo"; +static char *str_Miter = "Miter"; +static unichar_t mnemonic_Miter = 'c'; +static char *str_Roundu = "Arrotondato"; +static unichar_t mnemonic_Roundu = 'a'; +static char *str_Bevel = "Tagliato"; +static unichar_t mnemonic_Bevel = 'p'; +static char *str_StrokeWidth = "Larghezza del tratto:"; +static unichar_t mnemonic_StrokeWidth = 'L'; +static char *str_Strok = "Tratto"; +static unichar_t mnemonic_Strok = 'T'; +static char *str_Caligraphic = "Calligrafia"; +static unichar_t mnemonic_Caligraphic = 'C'; +static char *str_PenAngle = "Angolo della penna:"; +static unichar_t mnemonic_PenAngle = 'A'; +static char *str_PenHeightRatio = "Percentuale di altezza:"; +static unichar_t mnemonic_PenHeightRatio = 'H'; +static char *str_PenHeightRatioPopup = "Una penna da calligrafia ha due dimensioni, la larghezza\n(regolabile con 'Larghezza del tratto' più sotto) e lo spessore\no altezza. Io esprimo l'altezza come percentuale della larghezza."; +static char *str_BadStroke = "Tratto errato"; +static char *str_StrokeWidthTooBig = "La larghezza del tratto è così grande che il suo percorso\npuò intersecare se stesso in %.100hs"; +static char *str_FreeHand = "A mano libera"; +static char *str_CenterLine = "Non ingrandire"; +static char *mnemonic_CenterLine = 'D'; +static char *str_CenterLinePopup = "La linea tracciata a mano libera non sarà ingrandita.\nVerrà conservata solo la linea."; +static char *str_Pressure = "Pressione:"; +static char *mnemonic_Pressure = 'P'; +static char *str_PressurePopup = "Premete in questo quadrato con uno strumento wacom sensibile alla pressione\nper impostare la fine della pressione"; + /* Auto Width/Kern */ +static char *str_EnterTwoCharRange = "Immetti 2 gruppi di caratteri"; +static char *str_ToBeAdjusted = "da regolare."; +static char *str_CharsLeft = "Caratteri a sinistra"; +static char *str_CharsRight = "Caratteri a destra"; +static char *str_All = "Tutti"; +static char *str_stdCharRange = "A-Za-z0-9"; +static unichar_t *str_stdCharRangeGreek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '\0' }; +static unichar_t *str_stdCharRangeCyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '\0' }; +static char *str_StdCharRangeKernL = "A-Za-z"; +static char *str_StdCharRangeKernR = "a-z.,:;-"; +static char *str_StdCharRangeKernR2 = "A-Za-z.,:;-"; +static unichar_t *str_StdCharRangeKernRCyr = { 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_StdCharRangeKernR2Cyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_stdCharRangeKernRGreek = { 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static unichar_t *str_stdCharRangeKernR2Greek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static char *str_Selected = "Selezionati"; +static char *str_Spacing = "Spaziatura"; +static char *str_TotalKerns = "Crenatura totale:"; +static char *str_Threshold = "Soglia:"; +static char *str_NoCharsSelected = "Nessun carattere selezionato."; +static char *str_KernPairFilePopup = "Cercare un file contente la lista delle coppie da crenare\ncontenente due caratteri per riga. FontForge considererà solamente queste coppie\nper le informazioni di crenatura."; +static char *str_LoadKernPairs = "Caricamento delle coppie da crenare"; +static char *str_NoKernPairs = "Nessuna coppia da crenare"; +static char *str_NoKernPairsFile = "No ho trovato nessuna coppia da crenare in %.200hs"; + /* Auto Trace */ +static char *str_NothingToTrace = "Non c'è nulla da tracciare"; +static char *str_NoAutotrace = "Non è possibile lanciare autotrace"; +static char *str_NoAutotraceProg = "Impossibile trovare il programma 'autotrace'.\nPotresti definire la variabile di environment AUTOTRACE."; +static char *str_AdditionalAutotraceArgs = "Ulteriori argomenti per il programma autotrace:"; +static char *str_NoMF = "Non ho trovato mf--metafont"; +static char *str_NoMFProg = "Impossibile trovare mf-- metafont => variabile di environnement MF, o scaricare da:\n http://www.tug.org/\n http://www.ctan.org/\nPotrebbe non essere incluso nella distribuzione di TeX"; +static char *str_NoTempDir = "Impossibile creare la cartella temporanea"; +static char *str_CantRunMF = "Impossibile lanciare mf"; +static char *str_MFHadError = "MetaFont è terminato per un errore"; +static char *str_MFBadOutput = "Impossibile leggere (o trovare) il file di uscita di mf"; + /* Bitmap dlg */ +static char *str_AllChars = "Tutti i caratteri"; +static char *str_SelChars = "I caratteri selezionati"; +static char *str_CurChar = "Il carattere corrente"; +static char *str_BadRegenSize = "Tentativo di rigenerazione di una dimensione di pixel che non è stata già creata: "; +static char *str_PixelSizes = "Grandezza dei pixel:"; +static char *str_listPixelSizes = "Lista dei valori correnti delle dimensioni dei pixel nella bitmap"; +static char *str_RemovingSize = "Togliere una grandezza vuol dire sopprimerla."; +static char *str_AddingSize = "Aggiungere una grandezza vuol dire crearla."; +static char *str_AddingSizeScale = "Aggiungere una grandezza vuol dire crearla in scala."; +static char *str_SpecifyRegenSizes = "Specifica le grandezze da rigenerare"; +static char *str_PointSizes75 = "Grandezza di un punto su uno schermo a 75 dpi"; +static char *str_PointSizes100 = "Grandezza di un punto su uno schermo a 100 dpi"; +static char *str_PointSizes96 = "Grandezza di un punto su uno schermo a 96 dpi"; +static char *str_PointSizes120 = "Grandezza di un punto su uno schermo a 120 dpi"; +static char *str_PointSizes72 = "Grandezza di un punto su uno schermo a 72 dpi"; +static char *str_XSizes = "X"; +static char *str_WinSizes = "Win"; +static char *str_MacSizes = "Mac"; +static char *str_UseFreeType = "Utilizza FreeType"; +static char *str_ScalingBitmaps = "Scalamento delle bitmap"; +static char *str_CantScaleGreymap = "Impossibile mettere in scal un font con diversi livelli di grigio"; +static char *str_CantDeleteAllBitmaps = "Impossibile sopprimere tutte le bitmap"; + /* Bitmap view */ +/* "%s at %d size %d from %s", charactername, encoding, pixelsize, fontname */ +static char *str_BvTitle = "%1$.75hs (%2$d) corpo %3$d derivante da %4$.75hs" +static char *str_RecalculateBitmaps = "Ricalcola le bitmap"; + /* bv Edit */ +static char *str_skewRatio = "Immetti il rapporto x:y dell'inclinazione"; +static char str_BadNumber[] = "Valore errato"; + /* Char View */ +/* "%s at %d from %s", charactername, encoding, fontname */ +static char *str_CvTitle = "%1$.80hs (%2$d) derivante da %3$.80hs" +static char *str_CantFindGlyph = "Impossibile trovare il glifo"; +static char *str_CantRevertGlyph = "Il glifo, %.80hs, non è reperibile nel file sfd"; +static char *str_GlyphHasRefs = "Problemi con i riferimenti"; +static char *str_GlyphHasRefsQuestion = "Il carattere, %.40hs, conteneva dei riferimenti, ma l'encoding del font è cambiato. Probabilmente non potrò risolvere correttamente questi riferimenti. Se continuo, certi riferimenti potranno perdersi, come altri potranno riferirsi a caratteri errati. Vuoi continuare nonostante tutto?" +static char *str_NameChanged = "Il nome del carattere è cambiato"; +static char *str_NameChangedGlyph = "Il nome del carattere %.40hs è cambiato. Ecco quello che io utilizzo per trovare il glifo nel file, così che non posso ritornare sul carattere.\n(Non sarai più avvertito per i successivi caratteri)" + /* CV Export */ +static char *str_PixelSizeQ = "Grandezza in pixel?"; +static char *str_PixelSize = "Grandezza in pixel:"; +static char *str_BitsPerPixel = "Rapporto bit/pixel:"; +static char *str_InvalidBits = "I soli valori leciti per il rapporto bit/pixel sono 1, 2, 4 e 8"; + /* CV Images */ +static char *str_CantFindFile = "Impossibile trovare il file"; +static char *str_BadXFigFile = "File XFIG errato"; +static char *str_BadImageFile = "File immagine errato"; +static char *str_BadImageFileName = "File immagine errato: %.100hs"; +static char *str_BadImageFileNotBitmap = "File immagine errato, non è una bitmap: %.100hs"; +static char *str_NothingLoaded = "Non è stato caricato nulla"; +static char *str_NothingSelected = "Non è stato selezionato nulla"; +static char *str_MoreImagesThanSelected = "Ci sono più immagini che caratteri selezionati"; +static char *str_BadTemplate = "Template errato"; +static char *str_BadTemplateNoExtension = "Template errato, manca l'estensione"; +static char *str_BadTemplateUnrecognized = "Template errato, formato sconosciuto"; +static char *str_UnicodeNotInFont = "Valore Unicode assente dal font"; +static char *str_UnicodeValueNotInFont = "Valore Unicode (%x) assente dal font; ignorato"; +static char *str_EncodingNotInFont = "Valore dell'encoding assente dal font"; +static char *str_EncodingValueNotInFont = "Valore dell'encoding (%x) assente dal font; ignorato"; +static char *str_Image = "Immagine"; +static char *str_TeXBitmap = "Bitmap TeX"; +static char *str_MacBitmap = "Bitmap Mac"; +static char *str_Template = "Image Template"; +static char *str_EPSTemplate = "Template EPS"; +static char *str_AsBackground = "Sfondo"; +static char *str_OnlyOneFont = "Solo un font"; +static char *str_OnlyOneFontBackground = "Solo un font può essere importato come sfondo"; + /* CV Palettes */ +static char *str_SizeOfPoints="Dimensione dei punti"; +static char *str_Regular="Regolare"; +static char *str_Points="Punti:"; +static char *str_RRRad="Raggio degli spigoli arrotondati"; +static char *str_Polygon="Poligono"; +static char *str_Star="Stella"; +static char *str_NumPSVert="Numero dei vertici della stella o di quelli del poligono +/* V is an abbreviation for "Visible", and E for Editable */ +static char *str_V="V"; +static char *str_E="E"; +static char *str_Layer="Strato"; +static char *str_IsEdit="Questo strato è modificabile?"; +static char *str_IsVis="Questo strato è visibile?"; +/* For Foreground. Should be short */ +static char *str_Fore="Primo piano"; +static char *mnemonic_Fore='o'; +static char *str_Back="Sfondo"; +static char *mnemonic_Back='B'; +static char *str_Grid="Guida"; +static char *mnemonic_Grid='G'; +static char *str_HHints="HHints"; +static char *str_VHints="VHints"; +static char *str_DHints="DHints"; +static char *str_HMetrics="HMetrics"; +static char *str_VMetrics="VMetrics"; +static char *str_Anchors="Ancore"; +static char *str_Blues="Bleu"; +static char *str_Bitmap="Bitmap"; +static char *str_ShapeType = "Tipo della forma"; +/* Popups */ +static char *str_Pointer = "Puntatore"; +static char *str_PopMag = "Ingrandisci (Rimpicciolisci con ALT)"; +static char *str_FreeCurve = "Disegna a mano libera"; +static char *str_ScrollByHand = "Fai scorrere a mano"; +static char *str_AddCurvePoint = "Aggiungi un punto 'curva'"; +static char *str_AddCornerPoint = "Aggiungi un punto 'spigolo'"; +static char *str_AddTangentPoint = "Aggiungi un punto 'tangente'"; +static char *str_AddPenPoint = "Aggiungi un punto e poi sposta i suoi punti di controllo"; +static char *str_popKnife = "Dividi la curva"; +static char *str_popRuler = "Misura la distanza o l'angolo fra due punti"; +static char *str_popScale = "Scala la selezione"; +static char *str_popFlip = "Inverti per simmetria la selezione"; +static char *str_popRotate = "Ruota la selezione"; +static char *str_popSkew = "Inclina la selezione"; +static char *str_popRectElipse = "Rettangolo o ellissi"; +static char *str_popPolyStar = "Poligono o stella"; +static char *str_popPencil = "Inserisci/cancella dei pixel"; +static char *str_popLine = "Traccia una linea"; +static char *str_popShift = "Sposta l'intera bitmap"; +static char *str_popHand = "Fai scorrere la bitmap"; + /* Undoes */ +static char *str_BitmapPaste = "Incolla la bitmap"; +static char *str_YesToAll = "Sì a tutto"; +static char *mnemonic_YesToAll = 'A'; +static char *str_NoToAll = "No a tutto"; +static char *mnemonic_NoToAll = 'o'; +/* "The clipboard contains a bitmap character of size %d,\na size which is not in your database.\nWould you like to create a bitmap font of that size,\nor ignore this character?" */ +static char *str_ClipContainsPre = "Il clipboard contiene un carattere bitmap di grandezza "; +static char *str_ClipContainsPost = ",\ngrandezza che non è fra i valori attuali.\nVuoi creare un font bitmap di questa grandezza,\no vuoi ignorare questo carattere"; +static char *str_Pasting = "Incolla..."; +static char *str_SelfRef = "Carattere con auto-riferimento" +static char *str_AttemptSelfRef = "Stai cercando di creare un carattere con un riferimento a lui stesso"; +static char *str_BadReference = "Riferimento errato"; +static char *str_FontNoRef = "Stai cercando di inserire un riferimento verso %1$hs in %2$hs.\nMa %1$hs non essite in questo font.\nVuoi copiare la curva originale, o sopprimere il riferimento?"; +static char *str_FontNoRefNoOrig = "Stai cercando di inserire un riferimento verso %1$hs in %2$hs.\nMa %1$hs non esiste in questo font, e FontForge non trova il carattere al quale esso si riferisce.\nIl riferimento non sarà inserito."; +static char *str_DontWarnAgain = "Non avvisarmi più"; +static char *mnemonic_DontWarnAgain = 'W'; +static char *str_NoVerticalMetrics = "Non ci sono metriche verticali"; +static char *str_FontNoVerticalMetrics = "Le metriche verticali non sono state attivate in questo font"; +static char *str_DupAnchor = "Ancora doppia"; +static char *str_DupAnchorIn = "C'è già un'ancora chiamata %$1s in %$2hs." +static char *str_AnchorLost = "Ancora persa"; +static char *str_AnchorLostPaste = "Almeno un'ancora si è persa durante l'inserimento, perché non c'era una classe d'ancore idonea nel font di destiazione." + /* dump pfa */ +static char *str_CvtPS = "Conversione Postscript"; + /* encoding */ +static char *str_BadEncFormat = "Formato del file di encoding errato"; +static char *str_PleaseNameEnc = "Per favore, dai un nome a questo encoding"; +/* Either insert first, second or third, or the number followed by the "th" string (5th, 6th, etc.) */ +/* Please name the %d/first/second/third encoding in this file" */ +static char *str_PleaseNameEncPre = "Per favore, dai un nome al "; +static char *str_PleaseNameEncPost = " encoding in questo file"; +static char *str_First = "primo"; +static char *str_Second = "secondo"; +static char *str_Third = "terzo"; +static char *str_th = "-esimo"; +static char *str_RemoveEncoding = "Soppressione dell'encoding"; +static char *str_LoadEncoding = "Caricamanto dell'encoding"; +static char *str_UseCidMap = "Utilizzazione della mappa CID"; +static char *str_SearchForCIDMap = "Questo font è basato sull'insieme di caratteri %1$.20hs-%2$.20hs-%3$d, ma il migliore che io abbia trovato è %1$.20hs-%2$.20hs-%4$d.\nDevo usare questo valore o preferisci cercare tu stesso?"; +static char *str_UseIt = "Utilizza la"; +static char mnemonic_UseIt = 'U'; +static char *str_Search = "Cerca"; +static char mnemonic_Search = 'S'; +static char *str_GiveUp = "Abbandona"; +static char mnemonic_GiveUp = 'G'; +static char *str_NoCidmap = "Non c'è il file cidmap..." +static char *str_LookForCidmap = "FontForge non è riuscito a trovare un file di mappa cid per questo font. Non è indispensabile, ma certe cose andrebbero meglio se ci fosse. Se non disponi, potresti scaricarne da:\n http://FontForge.sourceforge.net/cidmaps.tgz\net le potresti installare, decomprimerle ed estrarre dai file .tarmettendole in:\n %.80hs\n\nVuoi cercare un file adatto nel tuo hard disk?" +static char *str_AreYouSureCharset = "Sei sicuro di non voler utilizzare la mappa cid che ho trovato?"; +static char *str_FindCharset = "Cerca di un file di tabella CID..." +static char *str_Browse = "Cerca..."; +static char mnemonic_Browse = 'B'; +static char *str_SelectCIDOrdering = "Per favore, seleziona una tabella CID" +static char *str_ExtraCharsTitle = "Caratteri soprannumerari"; +static char *str_ExtraChars = "L'encoding attuale contiene dei caratteri che FontForge non sa mappare verso CID.\nBisogna distruggerli oppure aggiungerli alla fine (e ciò potrebbe portare a dei problemi con future definizioni)?"; +static char *str_FindCMap = "Cerca un file Adobe CMap..."; +static char *str_NotACIDFont = "Questo font non ha un encoding CID"; +static char *str_MultipleEncodingIgnored = "MultipleEncodingIgnored"; +static char *str_CIDGlyphMultEncoded = "Il glifo in CID %d è mappato verso più di %d encoding. Solo i primi %d verranno presi in considerazione."; + + /* fv composit */ +static char *str_MissingChar = "Caratteri mancanti..."; +static char *str_Missingdotlessi="Il tuo font non contiene il carattere dotlessi.\nPer favore, aggiungine uno e rifai i caratteri accentati"; +static char *str_Missingdotlessj="Il tuo font non contiene il carattere dotlessj.\nPer favore, aggiungine uno e rifai i caratteri accentati"; + /* fv fonts */ +static char *str_MergingProb = "Problema di unione"; +static char *str_MergingFontSelf = "Unire un font a se stesso non porta a nulla"; +static char *str_MergingCIDMismatch = "Quando si uniscono due font CID, essi devono avere gli stessi Registry e Ordering, et il font di destinazione deve avere un supplemento altrettanto recente quanto gli altri. Inoltre questo deve avere tanti sotto-font quanti gli altri." +static char *str_Other = "Altro ..." +static char *str_FontToMergeInto = "Font da unire a %.20hs"; +static char *str_InterpolatingProb = "Problema di interpolazione"; +static char *str_InterpolatingFontSelf = "Interpolare un font con se stesso non porta a nulla"; +static char *str_Amount = "Quantità"; +static char *str_InterpBetween = "Interpolazione fra %.20hs e:"; +static char *str_by = "di"; + /* fv metrics */ +static char *str_SetWidthTo = "Imposta la larghezza:"; +static char *str_SetLBearingTo = "Imposta la spalla sinistra:"; +static char *str_SetRBearingTo = "Imposta la spalla destra:"; +static char *str_SetVWidthTo = "Imposta l'avanzamento verticale:"; +static char *str_IncrWidthBy = "Aumenta la larghezza:"; +static char *str_IncrLBearingBy = "Aumenta la spalla sinistra:"; +static char *str_IncrRBearingBy = "Aumenta la spalla destra:"; +static char *str_IncrVWidthBy = "Aumenta l'avanzamento verticale:"; +static char *str_ScaleWidthBy = "Scala la larghezza:"; +static char *str_ScaleLBearingBy = "Scala la spalla sinistra:"; +static char *str_ScaleRBearingBy = "Scala la spalla destra:"; +static char *str_ScaleVWidthBy = "Scala l'avanzamento verticale:"; + /* Import bdf */ +static char *str_PixelSizeFont = "Qual è il corpo in pixel del font contenuto in questo file?"; +static char *str_CouldNotOpenFile = "Impossibile leggere il file" +static char *str_CouldNotOpenFileName = "Impossibile leggere il file %.200hs" +static char *str_NotBdfFile = "Non ci sono file BDF" +static char *str_NotBdfFileName = "Non ci sono file BDF %.200hs" +static char *str_NotPkFile = "Non ci sono file PK" +static char *str_NotPkFileName = "Non ci sono file PK (metafont) %.200hs" +static char *str_NotGfFile = "Non ci sono file GF" +static char *str_NotGfFileName = "Non ci sono file GF (metafont) %.200hs" +static char *str_NotPcfFile = "Non ci sono file PCF" +static char *str_NotPcfFileName = "Non ci sono file PCF X11 %.200hs" +static char *str_LoadingFrom = "Sto caricando un font da %.100hs"; +static char *str_DuplicateName = "Nome ripetuto"; +static char *str_DuplicateCharName = "Nome di carattere (hs) ripetuto nel font"; + /* problems */ +static char *str_ProbOpenPath = "I due punti scelti sono gli estremi di una curva aperta"; +static char *str_ProbPointsTooClose = "I due punti scelti sono troppo vicini"; +static char *str_ProbMissingExtreme = "La curva scelta non ha punti almeno ad una sua estremità"; +static char *str_ProbXNear = "L'ascissa del punto scelto è vicina al valore specificato"; +static char *str_ProbYNear = "L'ordinata del punto scelto è vicina al valore specificato"; +static char *str_ProbYBase = "L'ordinata del punto scelto è vicina alla linea di base"; +static char *str_ProbYXHeight = "L'ordinata del punto scelto è vicina all'x-height"; +static char *str_ProbYCapHeight = "L'ordinata del punto scelto è vicina all'altezza delle maiuscole"; +static char *str_ProbYAs = "L'ordinata del punto scelto è vicina all'altezza degli ascendenti"; +static char *str_ProbYDs = "L'ordinata del punto scelto è vicina all'altezza dei discendenti"; +static char *str_ProbLineHor = "Il segmento scelto è quasi orizzontale"; +static char *str_ProbLineVert = "Il segmento scelto è quasi verticale"; +static char *str_ProbLineItal = "Il segmento scelto ha una inclinazione vicina a quella del corsivo"; +static char *str_ProbAboveHor = "Il punto di controllo sopra al punto scelto è quasi orizzontale"; +static char *str_ProbAboveVert = "Il punto di controllo sopra al punto scelto è quasi verticale"; +static char *str_ProbAboveItal = "Il punto di controllo sopra al punto scelto è inclinato quasi quanto il corsivo"; +static char *str_ProbBelowHor = "Il punto di controllo sotto al punto scelto è quasi orizzontale"; +static char *str_ProbBelowVert = "Il punto di controllo sotto al punto scelto è quasi verticale"; +static char *str_ProbBelowItal = "Il punto di controllo sotto al punto scelto è inclinato quasi quanto il corsivo"; +static char *str_ProbLeftHor = "Il punto di controllo a sinistra del punto scelto è quasi orizzontale"; +static char *str_ProbLeftVert = "Il punto di controllo a sinistra del punto scelto è quasi verticale"; +static char *str_ProbLeftItal = "Il punto di controllo a sinistra del punto scelto è inclinato quasi quanto il corsivo"; +static char *str_ProbRightHor = "Il punto di controllo a destra del punto scelto è quasi orizzontale"; +static char *str_ProbRightVert = "Il punto di controllo a destra del punto scelto è quasi verticale"; +static char *str_ProbRightItal = "Il punto di controllo a destra del punto scelto è inclinato quasi quanto il corsivo"; +static char *str_ProbPtNearHHint = "Il punto scelto è vicino a un hint di tratto orizzontale"; +static char *str_ProbPtNearVHint = "Il punto scelto è vicino a un hint di tratto verticale"; +static char *str_ProbHintHWidth = "Questo carattere contiene un hint orizzontale di valore simile al valore specificato"; +static char *str_ProbHintVWidth = "Questo carattere contiene un hint verticale di valore simile al valore specificato"; +static char *str_ProbHintControl = "Questo hint non è usato da nessun punto"; +static char *str_ProbHint3Width = "Questo hint ha una larghezza errata per un tratto di tipo 3"; +static char *str_ProbHint3Spacing = "Le spalle fra questi hint non sono dello stesso valore, e ciò è sbagliato per un tratto di tipo 3"; +static char *str_ProbHint3Four = "Questo carattere ha quattro hint, ma togliendo questo potrebbe andar bene per un tratto di tipo 3" +static char *str_NoProbHint3 = "Questo carattere può utilizzare un hint per tratti di tipo 3"; +static char *str_ProbExpectedCounter = "Questo percorso dovrebbe essere in senso antiorario"; +static char *str_ProbExpectedClockwise = "Questo percorso dovrebbe essere in senso orario"; +static char *str_ProbFlippedRef = "Questo riferimento è stato rovesciato, perciò i contorni che essa contiene sono tracciati nel senso sbagliato" +static char *str_ProbMissingBitmap = "Questo carattere vettoriale manca della versione bitmap" +static char *str_ProbMissingOutline = "Questo carattere vettoriale è vuoto, ma stranamente ha una versione bitmap" +static char *str_ProbBadWidth = "L'avanzamento di questo carattere è diverso dall'avanzamento standard" +static char *str_ProbBadVWidth = "L'avanzamento verticale di questo carattere è diverso dall'avanzamento verticale standard" +static char *str_ProbAboveOdd = "Il punto di controllo sopra al punto scelto è esterno al segmento di spline "; +static char *str_ProbBelowOdd = "Il punto di controllo sotto al punto scelto è esterno al segmento di spline"; +static char *str_ProbRightOdd = "Il punto di controllo a destra del punto scelto è esterno al segmento di spline"; +static char *str_ProbLeftOdd = "Il punto di controllo a sinistra del punto scelto è esterno al segmento di spline"; +static char *str_ProbCIDMult = "Questo carattere è definito in più di un sotto-font CID"; +static char *str_ProbCIDBlank = "Questo carattere non è definito in nessuno dei sotto-font CID"; +static char *str_ProbExplain = "Spiegazione dei problemi"; +static char *str_Fix = "Correggi"; +static char *str_Stop = "Stop"; +static char *mnemonic_Stop = 'S'; +static char *str_Next = "Successivo"; +static char *mnemonic_Next = 'N'; +static char *str_OpenPaths = "Percorsi aperti"; +static char *mnemonic_OpenPaths = 'P'; +static char *str_OpenPathsPopup = "Tutti i percorsi devono essere chiusi,\nnon deve esserci nessuna estremità isolata"; +static char *str_Points2Close = "Puniti troppo vicini"; +static char *mnemonic_Points2Close = 't'; +static char *str_Points2ClosePopup = "Sse due punti su un percorso sono troppo vicini,\nalcuni comandi di FontForge potrebbero avere problemi.\nMa questi problemi non influenzano PostScript."; +/*static char *str_MissingExtrema = "Missing Extrema"; +/*static char *mnemonic_MissingExtrema = 'E'; +/*static char *str_MissingExtremaPopup = "Ghostview (perhaps other interpreters) has a problem when a\nhint exists without any points that lie on it. Usually this is because\nthere are no points at the extrema";*/ +static char *str_XNear = "X vicino"; +static char *mnemonic_XNear = 'X'; +static char *str_XNearPopup = "Permette di verificare che i tratti verticali di diversi caratteri\ncomincino nel medesimo punto."; +static char *str_YNear = "Y vicino"; +static char *mnemonic_YNear = 'Y'; +static char *str_YNearPopup = "Permette di verificare che i tratti orizzontali di diversi caratteri\n.comincino nel medesimo punto"; +static char *str_YNearStd = "Y vicino all'altezza standard"; +static char *mnemonic_YNearStd = 'S'; +static char *str_YNearStdPopup = "Permette di trovare i punti accostati alla linea di base,\nall'x-height, all'altezza delle maiuscole,\ndegli ascendenti o dei discendenti."; +static char *str_LineStd = "Bordi quasi orizzontali o verticali"; +static char *str_LineStd2 = "Bordi quasi orizzontali o verticali o con l'inclinazione del corsivo"; +static char *mnemonic_LineStd = 'E'; +static char *str_LineStdPopup = "Per trovare le linee che sono quasi,\nma non del tutto orizzontali o verticali\n(o che abbiano l'inclinazione del corsivo)."; +static char *str_CpStd = "Punti di controllo quasi orizzontali o verticali."; +static char *str_CpStd2 = "Punti di controllo quasi orizzontali o verticali o con l'inclinazione del corsivo"; +static char *mnemonic_CpStd = 'C'; +static char *str_CpStdPopup = "Permette di trovare i punti di controllo che sono quasi,\nma non esattamente orizzontali o verticali rispetto al loro punto di base \n(o con la stessa inclinazione del corsivo)."; +static char *str_CpOdd = "Punti di controllo oltre la spline"; +static char *mnemonic_CpOdd = 'b'; +static char *str_CpOddPopup = "Permette di trovare i punti di controllo che dopo essere stati proiettati \nsulla congiungente i due estremi cadono fuori dei due estremi"; +static char *str_HintNoPt = "Hint che non controllano nessun punto"; +static char *mnemonic_HintNoPt = 'H'; +static char *str_HintNoPtPopup = "Ghostview (e forse altri interpreti) ha un problema quando\nessite un hint che non agisce su nessun punto."; +static char *str_PtNearHint = "Punti vicino ai bordi di un hint"; +static char *mnemonic_PtNearHint = 'P'; +static char *str_PtNearHintPopup = "Spesso quando un punto è vicino a un hint,\nè perché un'asta è composta da diversi tratti, e la larghezza\ndi uno di essi è sbagliata."; +static char *str_HintWidth = "Larghezza degli hint circa"; +static char *mnemonic_HintWidth = 'W'; +static char *str_HintWidthPopup = "Permette di verificare che le aste abbiano larghezze omogenee..."; +static char *str_Hint3 = "Quasi un hint per asta di tipo 3"; +static char *mnemonic_Hint3 = '3'; +static char *str_Hint3Popup = "Controlla se questo carattere è quasi, ma non proprio,\nconforme alle specifiche per un hint per aste di tipo 3.\nCioè, sia verticalmente sia orizzontalmente, ci deno essere\nesattamante 3 hint, con la stessa larghezza e spaziati in modo regolare." +static char *str_ShowExactHint3 = "Mostra esattamente le aste di tipo 3"; +static char *mnemonic_ShowExactHint3 = 'S'; +static char *str_ShowExactHint3Popup = "Mostra se questo carattere ha esattement un hint per aste di tipo 3"; +static char *str_CheckDirection = "Controlla che i contorni esterni siano in verso orario"; +static char *mnemonic_CheckDirection = 'o'; +static char *str_CheckDirectionPopup = "Postscript e TrueType richiedono che i contorni siano percorsi\nin senso orario. Questo vi permette di verificarlo."; +static char *str_CheckFlippedRefs = "Controlla i riferimenti ribaltati"; +static char *mnemonic_CheckFlippedRefs = 'r'; +static char *str_CheckFlippedRefsPopup = "Postscript e TrueType richiedono che i contorni siano percorsi\nin senso orario. Se hai un riferimento ribaltato,\ni contorni di questo riferimento sono probabilmente nel senso sbagliato.\nDevi cancellare il legame e applicargli 'Correggi la direzione'."; +static char *str_CheckBitmaps = "Controlla le bitmap mancanti"; +static char *mnemonic_CheckBitmaps = 'b'; +static char *str_CheckBitmapsPopup = "Ci sono dei caratteri che non hanno la corrispondente bitmap nel font?\nAl contrario, ci sono dei caratteri bitmap che non hanno il corrispondente contorno vettoriale?" +static char *str_CIDMultiple = "Cerca dei CID definit due volte."; +static char *mnemonic_CIDMultiple = 'O'; +static char *str_CIDMultiplePopup = "Controlla se un CID è definito in più di un sotto-font"; +static char *str_CIDBlank = "Cerca i CID non definiti"; +static char *mnemonic_CIDBlank = 'O'; +static char *str_CIDBlankPopup = "Controlla se un CID non è definito in nessun sotto-font"; +static char *str_PointsNear = "Punti \"Vicino\" se sono a meno di "; +static char *mnemonic_PointsNear = 'N'; +static char *str_Near = "Vicino"; +static char *str_ExplainErr = "Stop dopo la spiegazione di ciascun errore"; +static char *mnemonic_ExplainErr = 'A'; +static char *str_IgnoreProblemFuture = "Ignora questo problema nel seguito"; +/* "Found %g, expected %g" */ +static char *str_Found = "Trovato "; +static char *str_Expected = ", atteso "; +static char *str_Paths = "Percorso"; +static char *str_Random = "Diversi"; +static char *str_PointsNoC = "Punti"; +static char *str_ClearAll = "Cancella tutto"; +static char *str_SetAll = "Seleziona tutto"; +static char *str_AdvanceWidth = "Controlla l'avanzamento:"; +static char *str_AdvanceWidthPopup = "Controlla i caratteri il cui avanzamento non ha il valore indicato." +static char *str_AdvanceVWidth = "Controlla l'avanzamento verticale: "; +static char *str_AdvanceVWidthPopup = "Controlla i caratteri il cui avanzamento verticale non ha il valore indicato." + /* Meta font */ +static char *str_MetaFont = "MetaFont..."; +static char mnemonic_MetaFont = 'M'; +static char *str_CounterTooSmallT = "Spalla troppo piccola"; +static char *str_CounterTooSmall = "La spalla richiesta era troppo piccola, è stata aumentata al suo valore minimo"; +static char *str_Simple = "Semplice"; +static char *str_Advanced = "Avanzato"; +static char *str_Embolden = "Annerisci"; +static char *str_Condense = "Restringi"; +static char *str_Expand = "Allarga"; +static char *str_Stems = "Aste"; +static char *str_HCounters = "Spalle H"; +static char *str_VCounters = "Spalle V"; +static char *str_StemScale = "Scala le aste di:"; +static char *str_CounterScale = "Scala le spalle di:"; +static char *str_XHeightFrom = "X-height da:"; +static char *str_To = "Fino a:"; +static char *str_MetamorphosingFont = "Metamorfosa..."; + /* to ttf */ +static char *str_PickFont = "Scegli un font qualunque..."; +static char *str_MultipleFontsPick = "Ci sono diversi font in questo file; scegline uno"; +static char *str_AutoHintingFont = "Auto Hinting Font..."; +static char *str_SavingOpenTypeFont = "Sto salvando un font OpenType"; +static char *str_LoadBitmapFonts = "Carico font bitmap?"; +static char *str_LoadTTFBitmaps = "Vuoi caricare il font bitmap contenuto in questo file di tipo true/open type?\n(Se sì, quale)"; +static char *str_BadEncoding = "Encoding difettoso"; +static char *str_ExtraneousSingleByte = "C'è un carattere da un byte (%d) che utilizza il posto di un carattere a due byte"; +static char *str_OutOfEncoding = "C'è un carattere (%d) che non può venire codificato"; +static char *str_NotNormallyEncoded = "C'è un carattere (%d) che normalmente non appare nell'encoding"; + /* Spline Fill */ +static char *str_Rasterizing = "Sto creando delle bitmap..."; +static char *str_GenBitmap = "Sto generando un font bitmap"; +static char *str_GenAntiAlias = "Sto creando un font anti-alias"; +/* "%d pixels" (for the size of the font being rasterized) */ +static char *str_Pixels = " pixel"; + /* print */ +static char *str_PrintingFont = "Sto stampando il font"; +static char *str_GeneratingPostscriptFont = "Sto generando un font Postscript"; +static char *str_FailedGenPost = "Errore nella generazione di un font Postscript"; +static char *str_PageSetup = "Impostazione della pagina"; +static char *str_Setup = "Impostazione"; +static char mnemonic_Setup = 'e'; +static char *str_Other2 = "Altro"; +static char mnemonic_Other = 'o'; +static char *str_PrintOtherPopup = "Un comando qualunque con tutti i suoi argomenti.\nIl comando deve elaborare un file PostScript\nche troverà leggendo il suo stream d'ingresso standard."; +static char *str_ToFile = "Verso un file"; +static char mnemonic_ToFile = 'F'; +static char *str_PageSize = "Dimensioni della pagina:"; +static char mnemonic_PageSize = 'S'; +static char *str_Copies = "Copie:"; +static char mnemonic_Copies = 'C'; +static char *str_Printer = "Stampante:"; +static char mnemonic_Printer = 'P'; +static char *str_PrintToFile = "Stampa in un file..."; +static char *str_Pointsize = "Corpo:"; +static char mnemonic_Pointsize = 'P'; +static char *str_FullFont = "Font completo"; +static char mnemonic_FullFont = 'F'; +static char *str_FullFontPopup = "Mostra tutti i glifi del font su un reticolo rettangolare di corpo assegnato"; +static char *str_FullPageChar = "Carattere a piena pagina"; +static char mnemonic_FullPageChar = 'C'; +static char *str_FullPageChars = "Caratteri a piena pagina"; +static char mnemonic_FullPageChars = 'C'; +static char *str_FullPageCharPopup = "Mostra tutti i caratteri del font, uno per pagina,\nnel corpo più grande possibile"; +static char mnemonic_SampleText = 'S'; +static char *str_SampleTextC = "Esempio di testo:"; +static char mnemonic_SampleTextC = 'T'; +static char *str_MultiSizeChar = "Carattere a corpi multipli"; +static char mnemonic_MultiSizeChar = 'M'; +static char *str_MultiSizeChars = "Caratteri a corpi multipli"; +static char mnemonic_MultiSizeChars = 'M'; +static char *str_MultiSizeCharPopup = "Mostra tutti i caratteri selezionati in diversi corpi"; +static char *str_SampleTextPopup = "Stampa il testo seguente nei corpi specificati +static char *str_FailedOpenTemp = "Errore nell'apertura di un file temporaneo"; +static char *str_NoCommandSpecified = "Non è stato specificato nessun comando"; +static char *str_InvalidPointsize = "Corpo errato"; + /* alignment */ +static char *str_CoordinateAlongWhich = "Direzione lungo la quale spaziare"; +static char *str_X = "X"; +static char mnemonic_X = 'X'; +static char *str_Y = "Y"; +static char mnemonic_Y = 'Y'; +static char *str_MaximumDistanceBetweenPts = "Distanza massima fra i punti in una regione"; +static char mnemonic_MaximumDistanceBetweenPts = 'M'; +static char *str_NotEnoughLines = "Non ci sono abbastanza linee"; +static char *str_CantParallel = "Impossible rendere parallelo"; +static char *str_ShareCommonEndpoint = "Queste due linee hanno un punto in comune e non posso renderle parallele."; + /* parsettf */ +static char *str_ReadingNames = "Lettura dei nomi"; +static char *str_FixingupReferences = "Aggiustamento dei riferimenti"; +static char *str_NoBitmaps = "Non ci sono bitmap"; +static char *str_NoBitmapsInTTF = "Non c'è nessuna bitmap (utilizzabile) in questo font ttf: %hs"; +static char *str_NotInCollection = "Non è nella collezione"; +static char *str_FontNotInCollection = "%hs non è in %.100hs"; +static char *str_UntitledAnchor_n = "Ancora-%d"; + /* sfd */ +static char *str_Saving = "Sto salvando..."; +static char *str_SavingDb = "Sto salvando un file di spline"; +static char *str_SavingOutlines = "Sto salvando i contorni"; +static char *str_SavingBitmaps = "Sto salvando le immagini bitmap"; +static char *str_RecoveryFailed = "errore di recupero"; +static char *str_RecoveryOfFailed = "Errore nel recupero automatico delle modifiche in%.80hs.\nRichiedi che ci provi di nuovo alla prossima esecuzione?"; +static char *str_TryAgain = "Provaci di nuovo"; +static char *str_ForgetIt = "Lascia perdere"; + /* start.c */ +static char *str_FontForge = "FontForge"; + /* cvpointer.c */ +static char *str_NegativeWidth = "Larghezza negativa"; +static char *str_NegativeWidthCheck = "I caratteri di larghezza negativa non sono ammessi nei font TrueType\nVuoi davvero una larghezza negativa?"; + /* hanyang.c */ +static char *str_Hangul = "Hangul"; +static char mnemonic_Hangul = 'H'; +static char *str_NewComposition = "Nuova composizione..."; +static char mnemonic_NewComposition = 'N'; +static char *str_ModifyComposition = "Modifica la composizione..."; +static char mnemonic_ModifyComposition = 'M'; +static char *str_BuildSyllables = "Costruzione delle sillabe"; +static char mnemonic_BuildSyllables = 'B'; +static char *str_ChoSung = "Cho-Sung"; +static char *str_JungSung = "Jung-Sung"; +static char *str_JongSung = "Jong-Sung"; +static char *str_ChoSungC = "Cho-Sung:"; +static char *str_JungSungC = "Jung-Sung:"; +static char *str_JongSungC = "Jong-Sung:"; +static char *str_Mapping = "Mapping..."; +static char mnemonic_Mapping = 'M'; +static char *str_Width = "Larghezza..."; +static char mnemonic_Width = 'W'; +static char *str_WidthDDD = "Larghezza..."; +static char mnemonic_WidthDDD = 'W'; +static char *str_Reset = "Reset"; +static char *str_LoadFrom = "Carica da..."; +static char mnemonic_LoadFrom = 'L'; +static char *str_BadWidth = "Larghezza errata"; +static char *str_BadGroup = "Gruppo errato"; +static char *str_JamoHoleTitle = "Glifo alternativo inutilizzato"; +static char *str_JamoHole = "Per il gruppo %d in %s, il glifo alternativo %d viene rimpiazzato da %d.\nVuoi davvero continuare?"; +static char *str_NoRules = "Pas de règle"; +static char *str_FileHasNoRules = "%.100hs non contiene le scale di composizione"; +static char *str_DeleteNo = "Elimina"; /* With no mnemonic */ + /* Need a different mnemonic */ +static char *str_AddAll = "Aggiungi tutto"; +static char mnemonic_AddAll = 'd'; +static char *str_DisplayCompositions = "Mostra le composizioni..."; +static char mnemonic_DisplayCompositions = 'D'; +static char *str_NoGroups = "Questo jamo alternativo non viene mai usato"; +static char *str_UniVarient = "Unicode %04X, Variante %d, %s"; +static char *str_BuildingKoreanFont = "Costruzione di un font coreano"; + /* Transform */ +static char *str_CharacterOrigin = "Origine del carattere"; +static char *str_CenterOfSelection = "Centro della selezione"; +static char *str_LastPress = "Premuto per ultimo"; +static char *str_DoNothing = "Non fare nulla"; +static char *str_MoveDDD = "Sposta..."; +static char *str_RotateDDD = "Ruota..."; +static char *str_ScaleDDD = "Metti in scala..."; +static char *str_ScaleUniformlyDDD = "Metti in scala uniformemente..."; +static char *str_FlipDDD = "Ribalta..."; +static char *str_SkewDDD = "Inclina..."; +static char *str_TransformBackground = "Transforma anche lo sfondo"; +static char mnemonic_TransformBackground = 'B'; +static char *str_Warning = "Attenzione"; +static char *str_RotateSkewWarning = "Dopo una rotazione o una trasformazione del carattere, dovresti probabilmente rifare Element->Aggiungi gli estremi"; + /* scripting */ +static char *str_Call = "Chiama..."; +static char mnemonic_Call = 'a'; +static char *str_CallScript = "Richiama uno script"; + /* start (about box) */ +static char *str_FreePress = "Una stampa libera\ndiscrimina fra gli illetterati."; +static char *str_GaudiamusLigature = "Gaudeamus Ligature!"; +static char *str_InTheBeginning = "In principio c'era la Lettera..."; + /* search */ +static char *str_SearchPattern = "Cerca il pattern:"; +static char *str_ReplacePattern = "Sostituisci il pattern:"; +static char *str_Allow = "Consenti:"; +static char *str_Flipping = "Ribaltamento"; +static char *str_Scaling = "Scalamento"; +static char *str_Rotating = "Rotazione"; +static char *str_AllowTransPopup = "Trova una concordanza anche se il pattern scelto deve\nessere trasformato per mezzo di una combinazione \ndelle seguenti trasformazioni."; +static char *str_SearchSelected = "Sto cercando i caratteri selezionati"; +static char *str_SearchSelectedPopup = "Cerca solo fra i caratteri selezionati nel display dei caratteri\nNormalmente la ricerca viene eseguita su tutti i caratteri di un font."; +static char *str_Find = "Cerca"; +static char *str_FindIn = "Cerca in %.100hs"; +static char *str_FindNext = "Cerca il successivo"; +static char *str_FindAll = "Cerca tutto"; +static char *str_ReplaceFind = "Sostituisci/cerca" +static char *str_ReplaceAll = "Sostituisci tutto" +static char *str_BadRefInSearchRpl = "In %1$s, c'è un riferimento verso %2$.20hs che non esiste nella nuovo font.\nDevo sopprimere il riferimento?"; +static char *str_NotFound = "non l'ho trovato" +static char *str_PatternNotFound = "Il pattern cercato non è stato trovato nel font %.100hs"; +static char *str_PatternNotFoundAgain = "Di nuovo il pattern cercato non è stato trovato nel font %.100hs"; +static char *str_FindReplace = "Cerca/Sostituisci" +static char *mnemonic_FindReplace = "i"; + /* combinaisons */ +static char *str_SelectLigature = "Scegli una legatura da esaminare" +static char *str_SortBy = "Ordina secondo:" +static char *str_FirstChar = "Carattere di sinistra" +static char *str_SecondChar = "Carattere di destra" +static char *str_KernSize = "Ammontare della crenatura" + /* tilepath */ +static char *str_Center_ = "Centra"; +static char mnemonic_Center_ = 'e'; +static char *str_CenterPopup = "L'elemento (recuperato dal clipboard) deve essere centrato sul percorso" +static char *str_Left = "Sinistra"; +static char mnemonic_Left = 'L'; +static char *str_LeftPopup = "L'elemento (recuperato dal clipboard) deve essere collocato a sinistra del percorso\ntenendo conto del suo punto di partenza e di quello d'arrivo" +static char *str_Right = "Right"; +static char mnemonic_Right = 'R'; +static char *str_RightPopup = "L'elemento (recuperato dal clipboard) deve essere collocato a destra del percorso\ntenendo conto del suo punto di partenza e di quello d'arrivo" +static char *str_Tile = "Elemento"; +static char mnemonic_Tile = 'T'; +static char *str_TilePopup = "Diverse copie della selezione devono essere impilate sul percorso" +static char *str_Scale = "Scalamento"; +static char mnemonic_Scale = 'S'; +static char *str_ScalePopup = "La selezione deve essere scalata in modo che\ncorrisponda alla lunghezza del percorso" +static char *str_TileScale = "Scala & Impila"; +static char mnemonic_TileScale = 'a'; +static char *str_TileScalePopup = "Per ricoprire il percorso la selezione viene usata un numero intero di volte\nSe la lunghezza del percorso non è un multiplo intero dell'altezza\ndella selezione, questa verrà leggermente scalata" + /* Display fonts */ +static char *str_AA = "AA"; +static char mnemonic_AA = 'A'; +static char *str_AAPopup = "Caratteri AntiAlias (greymap), o caratteri bitmap"; +static char *str_PixelSizePopup = "Espone il corpo del carattere mostrato"; +static char *str_FormatPopup = "Specifica il formato del file usato per trasformare il font in freetype\n pfb -- formato standard per postscript type1\n ttf -- formato truetype\n httf-- truetype con hints\n otf -- formato opentype\n bitmap -- freetype non è usato\n Le bitmap devono già esister\n FontForge -- utilizza il motore di FontForge, non quello di \n freetype. Solamente come ultima risorsa"; +static char *str_BadSize = "Dimensione errata"; +static char *str_RequestedSizeNotAvail = "La dimensione richiesta per le bitmaps non è nel font. Il font offre: %hs"; +static char *str_BadFont = "Font errato"; + /* Mac specific */ +static char *str_LeaveX = "Lascia X"; +static char *str_LeaveXLong = "Un browser sta probabilmente già girando nel sistema di finestre nativo di Mac. Devi lasciare X per vederlo. Prova Cmd-Opt-A"; + /* Simplifydlg */ +static char *str_RemoveExtrema = "Accetta l'eliminazione degli estremi"; +static char mnemonic_RemoveExtrema = 'r'; +static char *str_RemoveExtremaPopup = "Normalmente semplificare non sopprime i punti alle estremità delle\ncurve(sia PostScript sia TrueType suggeriscono di conservare questi punti)"; +static char *str_ChangeSlopes = "Accetta il cambiamento delle pendenze"; +static char mnemonic_ChangeSlopes = 's'; +static char *str_ChangeSlopesPopup = "Normalmente semplificare non cambia la pendenza delle corve nei nodi."; +static char *str_ErrorLimit = "Errore Max:"; +static char mnemonic_ErrorLimit = 'E'; +static char *str_EmUnits = "Unità em"; + +static int num_buttonsize = 70; +static int num_ScaleFactor = 120; diff --git a/fontforge/nomen-ja.c b/fontforge/nomen-ja.c new file mode 100644 index 00000000..ea0737e1 --- /dev/null +++ b/fontforge/nomen-ja.c @@ -0,0 +1,3229 @@ +#include "nomen.h" + +static enum encoding enc = e_euc; + +static char str_Language[] = "ÆüËܸì"; +static char str_OK[] = "OK"; +static unichar_t mnemonic_OK[] = 'O'; +static char str_Cancel[] = "¥­¥ã¥ó¥»¥ë(C)"; +static unichar_t mnemonic_Cancel[] = 'C'; +static char str_Open[] = "³«¤¯(O)"; +static unichar_t mnemonic_Open[] = 'O'; +static char str_Save[] = "Êݸ(S)"; +static unichar_t mnemonic_Save[] = 'S'; +static char str_Filter[] = "¥Õ¥£¥ë¥¿(F)"; +static unichar_t mnemonic_Filter[] = 'F'; +static char str_New[] = "¿·µ¬(N)"; +static unichar_t mnemonic_New[] = 'N'; +static char str_Replace[] = "¾å½ñ¤­"; +static char str_Fileexists[] = "¥Õ¥¡¥¤¥ë¤¬´û¤Ë¤¢¤ê¤Þ¤¹"; +/* "File, %s, exists. Replace it?" */ +static char str_Fileexistspre[] = "¥Õ¥¡¥¤¥ë '"; +static char str_Fileexistspost[] = "' ¤Ï´û¤Ë¸ºß¤·¤Þ¤¹. ¾å½ñ¤­¤·¤Þ¤¹¤«?"; +static char str_Createdir[] = "¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®..."; +static char str_Dirname[] = "¥Ç¥£¥ì¥¯¥È¥ê̾¤Ï?"; +static char str_Couldntcreatedir[] = "¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤Ç¤­¤Þ¤»¤ó"; +static char str_SelectAll[] = "¤¹¤Ù¤ÆÁªÂò(A)"; +static char mnemonic_SelectAll ='A'; +static char *str_None ="¤Ê¤·(N)"; +static char mnemonic_None ='N'; +/* Menus ... */ +static char str_File[] = "¥Õ¥¡¥¤¥ë(F)"; +static unichar_t mnemonic_File[] = 'F'; +static char str_Edit[] = "ÊÔ½¸(E)"; +static unichar_t mnemonic_Edit[] = 'E'; +static char str_Point[] = "À©¸æÅÀ(P)"; +static unichar_t mnemonic_Point[] = 'P'; +static char str_Element[] = "¥¨¥ì¥á¥ó¥È(l)"; +static unichar_t mnemonic_Element[] = 'l'; +static char str_Hints[] = "¥Ò¥ó¥È(i)"; +static unichar_t mnemonic_Hints[] = 'i'; +static char str_View[] = "ɽ¼¨(V)"; +static unichar_t mnemonic_View[] = 'V'; +static char str_Metric[] = "¥á¥È¥ê¥Ã¥¯(M)"; +static unichar_t mnemonic_Metric[] = 'M'; +static char str_Window[] = "¥¦¥£¥ó¥É¥¦(W)"; +static unichar_t mnemonic_Window[] = 'W'; +static char str_Help[] = "¥Ø¥ë¥×(H)"; +static unichar_t mnemonic_Help[] = 'H'; +static char str_Index[] = "Ìܼ¡(I)"; +static unichar_t mnemonic_Index[] = 'I'; +static char str_About[] = "¡Ä¤Ë¤Ä¤¤¤Æ(A)..."; +static unichar_t mnemonic_About[] = 'A'; +static char str_LicenseDDD[] = "¥é¥¤¥»¥ó¥¹(L)..."; +static unichar_t mnemonic_LicenseDDD[] = 'L'; +static char str_Recent[] = "ºÇ¶á³«¤¤¤¿¥Õ¥©¥ó¥È(t)"; +static unichar_t mnemonic_Recent[] = 't'; +static char str_Openoutline[] = "¥¢¥¦¥È¥é¥¤¥ó¥¦¥£¥ó¥É¥¦¤ò³«¤¯(u)"; +static unichar_t mnemonic_Openoutline[] = 'u'; +static char str_Openbitmap[] = "¥Ó¥Ã¥È¥Þ¥Ã¥×¥¦¥£¥ó¥É¥¦¤ò³«¤¯(B)"; +static unichar_t mnemonic_Openbitmap[] = 'B'; +static char str_Openmetrics[] = "¥á¥È¥ê¥Ã¥¯¥¦¥£¥ó¥É¥¦¤ò³«¤¯(M)"; +static unichar_t mnemonic_Openmetrics[] = 'M'; +static char str_Print[] = "°õºþ(P)..."; +static unichar_t mnemonic_Print[] = 'P'; +static char str_Display[] = "Áȸ«Ëܤòɽ¼¨(D)..."; +static unichar_t mnemonic_Display[] = 'D'; +static char str_ExecuteScript[] = "¥¹¥¯¥ê¥×¥È¤ò¼Â¹Ô(x)..."; +static unichar_t mnemonic_ExecuteScript[] = 'x'; +static char str_Revertfile[] = "¥Õ¥¡¥¤¥ë¤òºÆÆɹþ(R)"; +static unichar_t mnemonic_Revertfile[] = 'R'; +static char str_RevertGlyph[] = "¥°¥ê¥Õ¤òÌ᤹(y)"; +static unichar_t mnemonic_RevertGlyph[] = 'y'; +static char str_Saveas[] = "¥Õ¥¡¥¤¥ë̾¤ò»ØÄꤷ¤ÆÊݸ(a)"; +static unichar_t mnemonic_Saveas[] = 'a'; +static char str_SaveAll[] = "¤¹¤Ù¤ÆÊݸ(l)"; +static unichar_t mnemonic_SaveAll = 'l'; +static char str_Generate[] = "¥Õ¥©¥ó¥È¤ò½ÐÎÏ(G)..."; +static unichar_t mnemonic_Generate[] = 'G'; +static char str_GenerateMac[] = "Mac¥Õ¥¡¥ß¥ê¡¼¤ò½ÐÎÏ(G)..."; +static unichar_t mnemonic_GenerateMac[] = 'F'; +static char str_Import[] = "¼è¤ê¹þ¤ß(I)..."; +static unichar_t mnemonic_Import[] = 'I'; +static char str_Close[] = "ÊĤ¸¤ë(c)"; +static unichar_t mnemonic_Close[] = 'c'; +static char str_Prefs[] = "´Ä¶­ÀßÄê(e)..."; +static unichar_t mnemonic_Prefs[] = 'e'; +static char str_Quit[] = "½ªÎ»(Q)"; +static unichar_t mnemonic_Quit[] = 'Q'; +static char str_Fit[] = "ÏȤË·¤¨¤ë(F)"; +static unichar_t mnemonic_Fit[] = 'F'; +static char str_Zoomin[] = "³ÈÂç(i)"; +static unichar_t mnemonic_Zoomin[] = 'i'; +static char str_Zoomout[] = "½Ì¾®(o)"; +static unichar_t mnemonic_Zoomout[] = 'o'; +static char str_NextChar[] = "¼¡¤Îʸ»ú(N)"; +static unichar_t mnemonic_NextChar[] = 'N'; +static char str_PrevChar[] = "Á°¤Îʸ»ú(P)"; +static unichar_t mnemonic_PrevChar[] = 'P'; +static char str_NextDefChar[] = "¼¡¤ÎÄêµÁºÑ¤ßʸ»ú(D)"; +static unichar_t mnemonic_NextDefChar[] = 'D'; +static char str_PrevDefChar[] = "Á°¤ÎÄêµÁºÑ¤ßʸ»ú(a)"; +static unichar_t mnemonic_PrevDefChar[] = 'a'; +static char str_Substitutions = "ÃÖ´¹°ìÍ÷(S)"; +static char mnemonic_Substitutions = "S"; +static char str_Goto[] = "°ÜÆ°(G)"; +static unichar_t mnemonic_Goto[] = 'G'; +static char str_Hidepoints[] = "ÅÀ¤ò±£¤¹(t)"; +static unichar_t mnemonic_Hidepoints[] = 't'; +static char str_Showpoints[] = "ÅÀ¤òɽ¼¨(t)"; +static unichar_t mnemonic_Showpoints[] = 't'; +static char str_MarkExtrema[] = "¶ËÂçÅÀ¤òɽ¼¨(M)"; +static unichar_t mnemonic_MarkExtrema[] = 'M'; +static char str_Hiderulers[] = "¥ë¡¼¥é¡¼¤ò±£¤¹(R)"; +static unichar_t mnemonic_Hiderulers[] = 'R'; +static char str_Showrulers[] = "¥ë¡¼¥é¡¼¤òɽ¼¨(R)"; +static unichar_t mnemonic_Showrulers[] = 'R'; +static char *str_ShowHMetrics="²£½ñ¤­¥á¥È¥ê¥Ã¥¯¤Îɽ¼¨Ë¡(H)..."; +static char mnemonic_ShowHMetrics = 'H'; +static char *str_ShowVMetrics="½Ä½ñ¤­¥á¥È¥ê¥Ã¥¯¤Îɽ¼¨Ë¡(V)..."; +static char mnemonic_ShowVMetrics = 'V'; +static char *str_EncodedView="¥³¡¼¥É½çɽ¼¨(E)"; +static char mnemonic_EncodedView = 'E'; +static char *str_CompactedView="ÄêµÁºÑ¤Îʸ»ú¤Î¤ßɽ¼¨(C)"; +static char mnemonic_CompactedView = 'C'; +static char *str_ShowAtt = "ATT¤òɽ¼¨(S)"; +static char mnemonic_ShowAtt = 'S'; +static char *str_Combinations="Áȹ礻ʸ»ú(b)"; +static char mnemonic_Combinations = 'b'; +static char *str_KernPairs="¥«¡¼¥Ë¥ó¥°¥Ú¥¢(K)"; +static char mnemonic_KernPairs = 'K'; +static char *str_Ligatures="¹ç»ú(L)"; +static char mnemonic_Ligatures = 'L'; +static char *str_AnchoredPairs="¥¢¥ó¥«¡¼¤Ä¤­¥Ú¥¢(A)"; +static char mnemonic_AnchoredPairs = 'A'; +static char *str_FindInFontView="¥Õ¥©¥ó¥Èɽ¼¨¤«¤éõ¤¹(V)"; +static char mnemonic_FindInFontView = 'V'; +static char str_Fill[] = "Åɤê¤Ä¤Ö¤·(l)"; +static unichar_t mnemonic_Fill[] = 'l'; +static char str_ShowGridFitDDD = "¥°¥ê¥Ã¥É¹ç¤ï¤»¤òɽ¼¨(w)..."; +static char mnemonic_ShowGridFitDDD = 'w'; +static char str_Select[] = "ÁªÂò(S)"; +static unichar_t mnemonic_Select[] = 'S'; +static char str_DeselectAll[] = "Á´¤ÆÁªÂò²ò½ü(D)"; +static unichar_t mnemonic_DeselectAll[] = 'D'; +static char str_SelectByATT[] = "ATT¤Ë¤è¤ëÁªÂò..."; +static unichar_t mnemonic_SelectByATT[] = 'T'; +static char str_FirstPoint[] = "ºÇ½é¤ÎüÅÀ(F)"; +static unichar_t mnemonic_FirstPoint[] = 'F'; +static char str_Nextpoint[] = "¼¡¤ÎüÅÀ(N)"; +static unichar_t mnemonic_Nextpoint[] = 'N'; +static char str_Prevpoint[] = "Á°¤ÎüÅÀ(P)"; +static unichar_t mnemonic_Prevpoint[] = 'P'; +static char str_NextControlPoint[] = "¼¡¤ÎÀ©¸æÅÀ(x)"; +static unichar_t mnemonic_NextControlPoint[] = 'x'; +static char str_PrevControlPoint[] = "Á°¤ÎÀ©¸æÅÀ(r)"; +static unichar_t mnemonic_NextControlPoint[] = 'r'; +static char str_SelectWidth[] = "Éý(W)"; +static unichar_t mnemonic_SelectWidth[] = 'W'; +static char str_SelectVWidth[] = "¹â¤µ(V)"; +static unichar_t mnemonic_SelectVWidth[] = 'V'; +static char str_DeselectWidth[] = "Éý¤òÁªÂò²ò½ü(W)"; +static unichar_t mnemonic_DeselectWidth[] = 'W'; +static char str_DeselectVWidth[] = "¹â¤µ¤òÁªÂò²ò½ü(V)"; +static unichar_t mnemonic_DeselectVWidth[] = 'V'; +static char str_Undo[] = "¸µ¤ËÌ᤹(U)"; +static unichar_t mnemonic_Undo[] = 'U'; +static char str_Redo[] = "¤ä¤êľ¤·(R)"; +static unichar_t mnemonic_Redo[] = 'R'; +static char str_Cut[] = "ÀÚ¤ê¼è¤ê(t)"; +static unichar_t mnemonic_Cut[] = 't'; +static char str_Copy[] = "¥³¥Ô¡¼(C)"; +static unichar_t mnemonic_Copy[] = 'C'; +static char str_Copywidth[] = "Éý¤ò¥³¥Ô¡¼(W)"; +static unichar_t mnemonic_Copywidth[] = 'W'; +static char str_CopyVWidth[] = "¹â¤µ¤ò¥³¥Ô¡¼(V)"; +static unichar_t mnemonic_CopyVWidth[] = 'V'; +static char str_CopyLBearing[] = "º¸¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤ò¥³¥Ô¡¼(p)"; +static unichar_t mnemonic_CopyLBearing[] = 'p'; +static char str_CopyRBearing[] = "±¦¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤ò¥³¥Ô¡¼(g)"; +static unichar_t mnemonic_CopyRBearing[] = 'g'; +static char str_Copyref[] = "»²¾È¤ò¥³¥Ô¡¼(o)"; +static unichar_t mnemonic_Copyref[] = 'o'; +static char str_Paste[] = "Ž¤êÉÕ¤±(P)"; +static unichar_t mnemonic_Paste[] = 'P'; +static char str_PasteInto[] = "ÄɲÃŽ¤êÉÕ¤±"; +static char str_SameGlyphAs[] = "Ʊ¤¸Ê¸»ú¤È¤·¤ÆÀßÄê(m)"; +static unichar_t mnemonic_SameGlyphAs[] = 'm'; +static char str_Clear[] = "¥¯¥ê¥¢(l)"; +static unichar_t mnemonic_Clear[] = 'l'; +static char str_ClearBackground[] = "Çطʤò¥¯¥ê¥¢(B)"; +static unichar_t mnemonic_ClearBackground[] = 'B'; +static char str_CopyFgToBg[] = "Çطʤ˥³¥Ô¡¼(F)"; +static unichar_t mnemonic_CopyFgToBg[] = 'F'; +static char str_CopyGridFit = "¥°¥ê¥Ã¥É¹ç¤ï¤»¤ò¥³¥Ô¡¼(d)"; +static unichar mnemonic_CopyGridFit = 'd'; +static char str_Merge[] = "¹çÊ»(M)"; +static unichar_t mnemonic_Merge[] = 'M'; +static char str_Elide = "ºï½ü(E)"; +static unichar_t mnemonic_Elide = 'E'; +static char str_Join[] = "½ÅÊ£¤¹¤ëÀþ¤òÅý¹ç(J)"; +static unichar_t mnemonic_Join[] = 'J'; +static char str_Unlinkref[] = "»²¾È¤ò²ò½ü(n)"; +static unichar_t mnemonic_Unlinkref[] = 'n'; +static char str_SelectColor[] = "¿§¤ÇÁªÂò(S)"; +static unichar_t mnemonic_SelectColor[] = 'S'; +static char str_RemoveUndoes[] = "¥¢¥ó¥É¥¥ÍúÎò¤Î¥¯¥ê¥¢(v)"; +static unichar_t mnemonic_RemoveUndoes[] = 'v'; +static char str_Fontinfo[] = "¥Õ¥©¥ó¥È¾ðÊó(F)..."; +static unichar_t mnemonic_Fontinfo[] = 'F'; +static char str_Findprobs[] = "ÌäÂêÅÀ¤òȯ¸«(o)..."; +static unichar_t mnemonic_Findprobs[] = 'o'; +static char str_Getinfo[] = "¾ðÊó¤ò¸«¤ë(I)..."; +static unichar_t mnemonic_Getinfo[] = 'I'; +static char str_OpenReference[] = "»²¾È¾ðÊó¤ò³«¤¯"; +static char str_ShowDependents[] = "°Í¸¤¹¤ëʸ»ú¤òɽ¼¨(h)..."; +static unichar_t mnemonic_ShowDependents[] = 'h'; +static char str_Bitmapsavail[] = "»ÈÍѤ¹¤ë¥Ó¥Ã¥È¥Þ¥Ã¥×(A)..."; +static unichar_t mnemonic_Bitmapsavail[] = 'A'; +static char str_Regenbitmaps[] = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤ÎºÆÀ¸À®(B)..."; +static unichar_t mnemonic_Regenbitmaps[] = 'B'; +static char str_Autotrace[] = "Autotrace"; +static unichar_t mnemonic_Autotrace[] = 'r'; +static char str_Transform[] = "ÊÑ·Á(T)..."; +static unichar_t mnemonic_Transform[] = 'T'; +static char str_NonLinearTransform[] = "ÈóÀþ·Á¤ÎÊÑ·Á..."; +static char str_Stroke[] = "ÎسԤòÂÀ¤é¤»¤ë(E)..."; +static unichar_t mnemonic_Stroke[] = 'E'; +static char str_TilePath[] = "¥Ñ¥¹¤òÉߤ­¤Ä¤á¤ë(P)..."; +static unichar_t mnemonic_TilePath[] = 'P'; +static char str_Overlap[] = "½ÅÊ£½èÍý(v)"; +static unichar_t mnemonic_Overlap[] = 'v'; +static char str_Rmoverlap[] = "½Å¤Ê¤ê¹ç¤¦¿Þ·Á¤ò·ë¹ç(R)"; +static unichar_t mnemonic_Rmoverlap[] = 'R'; +static char str_Intersect[] = "½ÅÊ£Éôʬ¤òÃê½Ð(I)"; +static unichar_t mnemonic_Intersect[] = 'I'; +static char str_Exclude[] = "½ÅÊ£Éôʬ¤ò½üµî(E)"; +static unichar_t mnemonic_Exclude[] = 'E'; +static char str_FindIntersections[] = "¸òÅÀ¤ò¸«¤Ä¤±¤ë(F)"; +static unichar_t mnemonic_FindIntersections[] = 'F'; +static char str_Simplify[] = "ñ½ã²½(S)"; +static unichar_t mnemonic_Simplify[] = 'S'; +static char str_SimplifyMore[] = "¹¹¤Ëñ½ã²½"; +static char str_CleanupChar[] = "ÉÔÍפʶÊÀþ¤ò½üµî(n)"; +static unichar_t mnemonic_CleanupChar[] = 'n'; +static char str_AddExtrema[] = "¶ËÂçÅÀ¤ÎÄɲÃ(x)"; +static unichar_t mnemonic_AddExtrema[] = 'x'; +static char str_Align[] = "ľ³Ñ¤Ë·¤¨¤ë(l)"; +static unichar_t mnemonic_Align[] = 'l'; +static char str_AveragePts[] = "ºÂɸ¤ÎÊ¿¶ÑÃÍ(A)"; +static unichar_t mnemonic_AveragePts[] = 'A'; +static char str_SpacePts[] = "ÅÀ¤Î´Ö³Ö¤ò¶ÑÅù¤Ë(S)"; +static unichar_t mnemonic_SpacePts[] = 'S'; +static char str_SpaceRegions[] = "¥«¥¦¥ó¥¿Éý¤ò¶ÑÅù¤Ë(R)..."; +static unichar_t mnemonic_SpaceRegions[] = 'R'; +static char str_MakeParallel[] = "Ê¿¹Ô¤Ë(P)..."; +static unichar_t mnemonic_MakeParallel[] = 'P'; +static char str_Round2int[] = "À°¿ôÃͤËÊÑ´¹(d)"; +static unichar_t mnemonic_Round2int[] = 'd'; +static char str_Effects = "¸ú²Ì"; +static char str_Inline = "¥¤¥ó¥é¥¤¥ó(I)"; +static char mnemonic_Inline = 'I'; +static char str_Shadow = "±¢¤Ä¤­(S)"; +static char mnemonic_Shadow = 'S'; +static char str_Wireframe = "±ï¤É¤êΩÂβ½(W)"; +static char mnemonic_Wireframe = 'W'; +static char str_Build[] = "ÁȤßΩ¤Æ(u)"; +static unichar_t mnemonic_Build[] = 'u'; +static char str_Buildaccent[] = "¥¢¥¯¥»¥ó¥Èʸ»ú¤òÁȤßΩ¤Æ¤ë(B)"; +static unichar_t mnemonic_Buildaccent[] = 'B'; +static char str_Buildcomposit[] = "ÁȤ߹ç¤ï¤»Ê¸»ú¤òÁȤßΩ¤Æ¤ë(C)"; +static unichar_t mnemonic_Buildcomposit[] = 'C'; +static char str_Clockwise[] = "±¦²ó¤ê(o)"; +static unichar_t mnemonic_Clockwise[] = 'o'; +static char str_Cclockwise[] = "º¸²ó¤ê(n)"; +static unichar_t mnemonic_Cclockwise[] = 'n'; +static char str_Correct[] = "¥¢¥¦¥È¥é¥¤¥ó¤Î¸þ¤­¤ò½¤Àµ(C)"; +static unichar_t mnemonic_Correct[] = 'C'; +static char str_Corner[] = "³Ñ¤ÎÅÀ(o)"; +static unichar_t mnemonic_Corner[] = 'o'; +static char str_Curve[] = "¶ÊÀþ¾å¤ÎÅÀ(C)"; +static unichar_t mnemonic_Curve[] = 'C'; +static char str_Tangent[] = "¶ÊÀþ¤Î³«»ÏÅÀ(T)"; +static unichar_t mnemonic_Tangent[] = 'T'; +static char str_Autohint[] = "¼«Æ°¥Ò¥ó¥È(H)"; +static unichar_t mnemonic_Autohint[] = 'H'; +static char str_FullAutohint[] = "´°Á´¼«Æ°¥Ò¥ó¥È(H)"; +static unichar_t mnemonic_FullAutohint[] = 'H'; +static char str_AutoInstr[] = "¥Ò¥ó¥ÈÌ¿Îá¤Î¼«Æ°À¸À®(I)"; +static unichar_t mnemonic_AutoInstr[] = 'I'; +static char str_EditInstructions[] = "¥Ò¥ó¥ÈÌ¿Îá¤ÎÊÔ½¸(E)..."; +static unichar_t mnemonic_EditInstructions[] = 'E'; +static char str_DebugDDD = "¥Ç¥Ð¥Ã¥°(D)..."; +static char mnemonic_DebugDDD = 'D'; +static char str_Editfpgm[] = "'fpgm' ¤òÊÔ½¸..."; +static char str_Editprep[] = "'prep' ¤òÊÔ½¸..."; +static char str_ClearHints[] = "¥Ò¥ó¥È¤òºï½ü(C)"; +static unichar_t mnemonic_ClearHints[] = 'C'; +static char str_ClearInstructions[] = "¥Ò¥ó¥ÈÌ¿Îá¤Îºï½ü"; +static char str_Clearhstem[] = "¿åÊ¿¥¹¥Æ¥à¥Ò¥ó¥È¤òºï½ü(C)"; +static unichar_t mnemonic_Clearhstem[] = 'C'; +static char str_Clearvstem[] = "¿âľ¥¹¥Æ¥à¥Ò¥ó¥È¤òºï½ü(V)"; +static unichar_t mnemonic_Clearvstem[] = 'V'; +static char str_Cleardstem[] = "ľ¸ò¥¹¥Æ¥à¥Ò¥ó¥È¤òºï½ü(D)"; +static unichar_t mnemonic_Cleardstem[] = 'D'; +static char str_Histograms = "Ãì¾õ¥°¥é¥Õ"; +static char str_Addhhint[] = "¿åÊ¿¥Ò¥ó¥È¤òÄɲÃ(A)"; +static unichar_t mnemonic_Addhhint[] = 'A'; +static char str_Addvhint[] = "¿âľ¥Ò¥ó¥È¤òÄɲÃ(s)"; +static unichar_t mnemonic_Addvhint[] = 's'; +static char str_Adddhint[] = "ľ¸ò¥Ò¥ó¥È¤òÄɲÃ(t)"; +static unichar_t mnemonic_Adddhint[] = 't'; +static char str_Createhhint[] = "¿åÊ¿¥Ò¥ó¥È¤òºîÀ®(r)..."; +static unichar_t mnemonic_Createhhint[] = 'r'; +static char str_Createvhint[] = "¿âľ¥Ò¥ó¥È¤òºîÀ®(e)..."; +static unichar_t mnemonic_Createvhint[] = 'e'; +static char str_Reviewhints[] = "¥Ò¥ó¥È¤ò³Îǧ(R)..."; +static unichar_t mnemonic_Reviewhints[] = 'R'; +static char str_MinimumDistance[] = "ºÇ¾®µ÷Î¥"; +static unichar_t mnemonic_MinimumDistance[] = 'M'; +static char str_ClearAllMD[] = "ºÇ¾®µ÷Î¥¤òÁ´ºï½ü"; +static unichar_t mnemonic_ClearAllMD[] = 'C'; +static char str_ClearSelXMD[] = "ÁªÂò¤·¤¿¿åÊ¿ºÇ¾®µ÷Î¥¤òºï½ü(s)"; +static unichar_t mnemonic_ClearSelXMD[] = 's'; +static char str_ClearSelYMD[] = "ÁªÂò¤·¤¿¿âľºÇ¾®µ÷Î¥¤òºï½ü(e)"; +static unichar_t mnemonic_ClearSelYMD[] = 'e'; +static char str_ClearWidthMD[] = "²£Éý¤ÎºÇ¾®µ÷Î¥¤òºï½ü(W)"; +static unichar_t mnemonic_ClearWidthMD[] = 'W'; +static char str_AddxMD[] = "¿åÊ¿ºÇ¾®µ÷Î¥¤òÄɲÃ(x)"; +static unichar_t mnemonic_AddxMD[] = 'x'; +static char str_AddMD2Width[] = "²£Éý¤Þ¤Ç¤Î¿åÊ¿ºÇ¾®µ÷Î¥¤òÄɲÃ(W)"; +static unichar_t mnemonic_AddMD2Width[] = 'W'; +static char str_AddyMD[] = "¿âľºÇ¾®µ÷Î¥¤òÄɲÃ(y)"; +static unichar_t mnemonic_AddyMD[] = 'y'; +static char str_RoundX[] = "XºÂɸ¤òÀ°¿ô¤Ë´Ý¤á¤ë(R)"; +static unichar_t mnemonic_RoundX[] = 'R'; +static char str_NoRoundX[] = "XºÂɸ¤ò´Ý¤á¤Ê¤¤(N)"; +static unichar_t mnemonic_NoRoundX[] = 'N'; +static char str_RoundY[] = "YºÂɸ¤òÀ°¿ô¤Ë´Ý¤á¤ë(u)"; +static unichar_t mnemonic_RoundY[] = 'u'; +static char str_NoRoundY[] = "YºÂɸ¤ò´Ý¤á¤Ê¤¤(o)"; +static unichar_t mnemonic_NoRoundY[] = 'o'; +static char str_Export[] = "½ñ¤­½Ð¤·(t)..."; +static unichar_t mnemonic_Export[] = 't'; +static char str_Palettes[] = "¥Ñ¥ì¥Ã¥È(P)"; +static unichar_t mnemonic_Palettes[] = 'P'; +static char str_Tools[] = "¥Ä¡¼¥ë(T)"; +static unichar_t mnemonic_Tools[] = 'T'; +static char str_Layers[] = "¥ì¥¤¥ä¡¼(L)"; +static unichar_t mnemonic_Layers[] = 'L'; +static char str_DockedPalettes[] = "¥Ñ¥ì¥Ã¥È¤òÏ¢·ëɽ¼¨(D)"; +static unichar_t mnemonic_DockedPalettes[] = 'D'; +static char str_Shades[] = "±Æ¤Ä¤­(S)"; +static unichar_t mnemonic_Shades[] = 'S'; +static char str_Center[] = "Éý¤ÎÃæ±û¤Ë(C)"; +static unichar_t mnemonic_Center[] = 'C'; +static char str_Thirds[] = "ξÉý¤Î¶õ¤­¤ò1:2¤Ë(T)"; +static unichar_t mnemonic_Thirds[] = 'T'; +static char str_Setwidth[] = "Éý¤òÀßÄê(W)..."; +static unichar_t mnemonic_Setwidth[] = 'W'; +static char str_SetVWidth[] = "½Ä¤Î»úÁ÷¤ê¤òÀßÄê(V)..."; +static unichar_t mnemonic_SetVWidth[] = 'V'; +static char str_Setlbearing[] = "º¸¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤òÀßÄê(L)..."; +static unichar_t mnemonic_Setlbearing[] = 'L'; +static char str_Setrbearing[] = "±¦¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤òÀßÄê(R)..."; +static unichar_t mnemonic_Setrbearing[] = 'R'; +static char str_Removekern[] = "¥«¡¼¥Ë¥ó¥°¥Ú¥¢¤òºï½ü(P)"; +static unichar_t mnemonic_Removekern[] = 'P'; +static char str_RemoveVKern[] = "½Ä½ñ¤­¥«¡¼¥Ë¥ó¥°¥Ú¥¢¤òºï½ü"; +static char str_Mergekern[] = "¥«¡¼¥Ë¥ó¥°¾ðÊó¤ÎÅý¹ç(M)..."; +static unichar_t mnemonic_Mergekern[] = 'M'; +static char str_24[] = "24 pixel outline"; +static unichar_t mnemonic_24[] = '2'; +static char str_36[] = "36 pixel outline"; +static unichar_t mnemonic_36[] = '3'; +static char str_48[] = "48 pixel outline"; +static unichar_t mnemonic_48[] = '4'; +static char str_72[] = "72 pixel outline"; +static unichar_t mnemonic_72[] = '7'; +static char str_96[] = "96 pixel outline"; +static unichar_t mnemonic_96[] = '9'; +static char str_Antialias[] = "¥¢¥ó¥Á¥¨¥¤¥ê¥¢¥¹(A)"; +static unichar_t mnemonic_Antialias[] = 'A'; +static char str_FitToEm[] = "ɽ¼¨¤òÁ´³Ñ¤Ë¸ÇÄê(F)"; +static unichar_t mnemonic_FitToEm[] = 'F'; +static char str_Charinfo[] = "ʸ»ú¾ðÊó(I)..."; +static unichar_t mnemonic_Charinfo[] = 'I'; +static char str_CharInfoFor[] = "ʸ»ú %.40hs ¤Ë´Ø¤¹¤ë¾ðÊó"; +static char str_TypoFeatures = "ÁÈÈǵ¡Ç½(y)"; +static char mnemonic_TypoFeatures = 'y'; +static char str_CopyFeatureToFont = "µ¡Ç½¤ò¥Õ¥©¥ó¥È¤Ë¥³¥Ô¡¼(C)..."; +static char mnemonic_CopyFeatureToFont = 'C'; +static char str_DefaultATT = "¥Ç¥Õ¥©¥ë¥È¤ÎATT(D)"; +static char mnemonic_DefaultATT = 'D'; +static char str_RemoveAllFeatures = "Á´¤Æ¤Îµ¡Ç½¤òºï½ü(R)"; +static char mnemonic_RemoveAllFeatures = 'R'; +static char str_RemoveUnusedNested = "̤»ÈÍѤÎÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿µ¡Ç½¤òºï½ü(N)"; +static char mnemonic_RemoveUnusedNested = 'N'; +static char str_RemoveFeature = "µ¡Ç½¤òºï½ü(e)..."; +static char mnemonic_RemoveFeature = 'e'; +static char str_RetagFeature = "µ¡Ç½¥¿¥°¤ò¤Ä¤±Ä¾¤¹(T)..."; +static char mnemonic_RetagFeature = 'T'; +static char str_Mergefonts[] = "¥Õ¥©¥ó¥È¤ÎÅý¹ç(M)..."; +static unichar_t mnemonic_Mergefonts[] = 'M'; +static char str_Interp[] = "¥Õ¥©¥ó¥È¤ÎÊä´Ö(l)..."; +static unichar_t mnemonic_Interp[] = 'l'; +static char str_Copyfrom[] = "¥³¥Ô¡¼¸µ¤Î»ØÄê(F)"; +static unichar_t mnemonic_Copyfrom[] = 'F'; +static char str_Allfonts[] = "Á´¤Æ¤Î¥Õ¥©¥ó¥È(A)"; +static unichar_t mnemonic_Allfonts[] = 'A'; +static char str_Displayedfont[] = "ɽ¼¨¤µ¤ì¤Æ¤¤¤ë¥Õ¥©¥ó¥È(D)"; +static unichar_t mnemonic_Displayedfont[] = 'D'; +static char str_CharName[] = "ʸ»ú¤Î¥á¥¿¥Ç¡¼¥¿(N)"; +static unichar_t mnemonic_CharName[] = 'N'; +static char str_Autokern[] = "¼«Æ°¥«¡¼¥Ë¥ó¥°(K)..."; +static unichar_t mnemonic_Autokern[] = 'K'; +static char str_KernByClasses[] = "¥¯¥é¥¹Ëè¤Î¥«¡¼¥Ë¥ó¥°(n)..."; +static unichar_t mnemonic_KernByClasses[] = 'n'; +static char str_VKernByClasses[] = "¥¯¥é¥¹Ëè¤Î½Ä½ñ¤­¥«¡¼¥Ë¥ó¥°..."; +static char str_Autowidth[] = "Éý¤Î¼«Æ°ÀßÄê(A)..."; +static unichar_t mnemonic_Autowidth[] = 'A'; +static char str_Removeallkern[] = "¥«¡¼¥Ë¥ó¥°¤òÁ´¤Æºï½ü(P)"; +static unichar_t mnemonic_Removeallkern[] = 'P'; +static char str_RemoveAllVKern[] = "½Ä½ñ¤­¥«¡¼¥Ë¥ó¥°¤òÁ´¤Æºï½ü"; +static char str_VKernFromHKern = "²£½ñ¤­¥«¡¼¥Ë¥ó¥°¤ò½Ä½ñ¤­¤Ë"; +static char str_Outline[] = "¥¢¥¦¥È¥é¥¤¥ó(O)"; +static char str_OutlineMn[] = "¥¢¥¦¥È¥é¥¤¥ó(O)"; +static char str_Vertical = "½Ä½ñ¤­(V)"; +static unichar_t mnemonic_Vertical = 'V'; +static unichar_t mnemonic_Outline[] = 'O'; +static char str_Showgrid[] = "¥°¥ê¥Ã¥É¤òɽ¼¨(G)"; +static unichar_t mnemonic_Showgrid[] = 'G'; +static char str_Hidegrid[] = "¥°¥ê¥Ã¥É¤ò±£¤¹(G)"; +static unichar_t mnemonic_Hidegrid[] = 'G'; +static char str_Bigger[] = "¥Ô¥¯¥»¥ë¥µ¥¤¥º³ÈÂç(B)"; +static unichar_t mnemonic_Bigger[] = 'B'; +static char str_Smaller[] = "¥Ô¥¯¥»¥ë¥µ¥¤¥º½Ì¾®(S)"; +static unichar_t mnemonic_Smaller[] = 'S'; +static char str_Fliph[] = "¿åÊ¿Êý¸þ¤Ëȿž(H)"; +static unichar_t mnemonic_Fliph[] = 'H'; +static char str_Flipv[] = "¿âľÊý¸þ¤Ëȿž(V)"; +static unichar_t mnemonic_Flipv[] = 'V'; +static char str_Rotate90cw[] = "±¦²ó¤ê¤Ë90¡ë²óž"; +static unichar_t mnemonic_Rotate90cw[] = 'R'; +static char str_Rotate90ccw[] = "º¸²ó¤ê¤Ë90¡ë²óž"; +static unichar_t mnemonic_Rotate90ccw[] = '9'; +static char str_Rotate180[] = "180¡ë²óž"; +static unichar_t mnemonic_Rotate180[] = '1'; +static char str_Skew[] = "·¹¤­(S)..."; +static unichar_t mnemonic_Skew[] = 'S'; +static char str_MakeFirst = "³«»ÏÅÀ¤ËÀßÄê(M)"; +static char mnemonic_MakeFirst = 'M'; +static char str_AddAnchor = "¥¢¥ó¥«¡¼¤òÄɲÃ(A)"; +static char mnemonic_AddAnchor = 'A'; +static char *str_CID = "CID"; +static char mnemonic_CID = 'C'; +static char *str_Convert2CID = "CID¤ËÊÑ´¹"; +static char mnemonic_Convert2CID = 'C'; +static char *str_ConvertByCMap = "CMap¤ò»ØÄꤷ¤ÆÊÑ´¹"; +static char mnemonic_ConvertByCMap = 'M'; +static char *str_Flatten = "ñ°ì²½(F)"; +static char mnemonic_Flatten = 'F'; +static char *str_FlattenByCMap = "»ØÄꤷ¤¿CMap¤Çñ°ì²½"; +static char mnemonic_FlattenByCMap = 'a'; +static char *str_InsertFont = "¥Õ¥©¥ó¥È¤òÁÞÆþ(o)..."; +static char mnemonic_InsertFont = 'o'; +static char *str_InsertBlank = "¶õ¤Î¥Õ¥©¥ó¥È¤òÁÞÆþ(B)"; +static char mnemonic_InsertBlank = 'B'; +static char *str_RemoveFont = "¥Õ¥©¥ó¥È¤òºï½ü(R)"; +static char mnemonic_RemoveFont = 'R'; +static char *str_CIDFontInfo = "CID¥Õ¥©¥ó¥È¾ðÊó(I)..."; +static char mnemonic_CIDFontInfo = 'I'; + + /* Font Info dlg */ +static char str_Custom[] = "¥«¥¹¥¿¥à"; +static char str_Compacted[] = "ÄêµÁºÑ¤Îʸ»ú¤Î¤ßɽ¼¨"; +static char str_Isolatin1[] = "ISO 8859-1 (Latin1)"; +static char str_Isolatin0[] = "ISO 8859-15 (Latin0)"; +static char str_Isolatin2[] = "ISO 8859-2 (Latin2)"; +static char str_Isolatin3[] = "ISO 8859-3 (Latin3)"; +static char str_Isolatin4[] = "ISO 8859-4 (Latin4)"; +static char str_Isolatin5[] = "ISO 8859-9 (Latin5)"; +static char str_Isolatin6[] = "ISO 8859-10 (Latin6)"; +static char str_Isolatin7[] = "ISO 8859-13 (Latin7)"; +static char str_Isolatin8[] = "ISO 8859-14 (Latin8)"; +static char str_Isocyrillic[] = "ISO 8859-5 (Cyrillic)"; +static char str_Koi8cyrillic[] = "KOI8-R (Cyrillic)"; +static char str_Isoarabic[] = "ISO 8859-6 (Arabic)"; +static char str_Isogreek[] = "ISO 8859-7 (Greek)"; +static char str_Isohebrew[] = "ISO 8859-8 (Hebrew)"; +static char str_Isothai[] = "ISO 8859-11 (Thai)"; +static char str_MacLatin[] = "Macintosh Latin"; +static char str_Win[] = "Windows Latin (\042ANSI\042)"; +static char str_Adobestd[] = "Adobeɸ½à"; +static char str_Symbol[] = "¥·¥ó¥Ü¥ë"; +static unichar_t str_Texbase[] = { 0x3a4, 0x3b5, 0x3a7, ' Base (8r)', '\0' }; +static char str_Unicode[] = "ISO 10646-1 (Unicode, BMP)"; +static char str_Unicode4[] = "ISO 10646-1 (Unicode, Full)"; +static char str_UnicodePlanes[] = "ISO 10646-? (Ì̤ò»ØÄê)..."; +static char str_Jis208[] = "JIS X0208 (´Á»ú)"; +static char str_Jis212[] = "JIS X0212 (Êä½õ´Á»ú)"; +static char str_SJIS[] = "¥·¥Õ¥ÈJIS (´Á»ú)"; +static char str_Korean[] = "KSC 5601-1987 (´Ú¹ñ¸ì)"; +static char str_KoreanJohab[] = "Johab (´Ú¹ñ¸ì)"; +static char str_KoreanWansung[] = "Wansung (´Ú¹ñ¸ì)"; +static char str_Chinese[] = "GB 2312 (´ÊÂλúÃæ¹ñ¸ì)"; +static char str_ChinesePacked = "¥Ñ¥Ã¥¯·Á¼° GB 2312 (´ÊÂλúÃæ¹ñ¸ì)"; +static char str_ChineseTrad[] = "Big5 (ÈËÂλúÃæ¹ñ¸ì)"; +static char str_ChineseTradHKSCS[] = "Big5 HKSCS (ÈËÂλúÃæ¹ñ¸ì)"; +static char str_Reducing[] = "ʸ»ú¿ô¤ò¸½ºß¤ÎÃͤè¤ê¾¯¤Ê¤¯ÀßÄꤷ¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹.\012°ìÉô¤Îʸ»ú¤Ï¾Ã¤¨¤Æ̵¤¯¤Ê¤ê¤Þ¤¹.\012¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char str_Toofew[] = "ʸ»ú¿ô¤¬¾¯¤Ê¤¹¤®¤Þ¤¹."; +static char str_LosingUndoes[] = "¥¢¥ó¥É¥¥¾ðÊ󤬾䨤ޤ¹"; +static char str_ChangingOrderLosesUndoes[] = "¥¹¥×¥é¥¤¥ó¤Î¼¡¿ô¤òÊѹ¹¤¹¤ë¤È, ¤¹¤Ù¤Æ¤Î\n¥¢¥ó¥É¥¥¾ðÊ󤬼º¤ï¤ì¤Þ¤¹.\n¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char str_Badfamilyn[] = "¥Õ¥¡¥ß¥ê¡¼Ì¾¤¬ÉÔÀµ¤Ç¤¹. ±Ñ»ú¤Ç»Ï¤á¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó."; +static char str_Badfamily[] = "¥Õ¥¡¥ß¥ê¡¼Ì¾¤¬ÉÔÀµ¤Ç¤¹"; +static char str_Badascentdescentn[] = "¹â¤µ¤È¿¼¤µ¤Ï¤È¤â¤ËÀµ¤ÎÃͤǤ¢¤ê, ¤½¤Î¹ç·×¤Ï16384¤è¤ê¾®¤µ¤¯¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó."; +static char str_Badascentdescent[] = "ÉÔÀµ¤Ê¹â¤µ/¿¼¤µ"; +static char str_Fontinformation[] = "¥Õ¥©¥ó¥È¾ðÊó %.90hs"; +static char str_WhichPlane[] = "»ÈÍѤ¹¤ëUnicode¤ÎÌÌ:"; +static char str_Familyname[] = "¥Õ¥¡¥ß¥ê¡¼Ì¾(F):"; +static unichar_t mnemonic_Familyname[] = 'F'; +static char str_Fontname[] = "¥Õ¥©¥ó¥È̾(N):"; +static unichar_t mnemonic_Fontname[] = 'N'; +static char str_Humanname[] = "ɽ¼¨ÍѤÎ̾Á°(s):"; +static unichar_t mnemonic_Humanname[] = 's'; +static char str_Encoding[] = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°(E):"; +static unichar_t mnemonic_Encoding[] = 'E'; +static char str_Load[] = "Load"; +static unichar_t mnemonic_Load[] = 'L'; +static char str_Makefromfont[] = "¥Õ¥©¥ó¥È¤«¤éºîÀ®(k)"; +static unichar_t mnemonic_Makefromfont[] = 'k'; +static char str_Remove[] = "ºï½ü(M)"; +static unichar_t mnemonic_Remove[] = 'M'; +static char str_ForceEncoding[] = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ò¶¯À©(F)"; +static unichar_t mnemonic_ForceEncoding[] = 'F'; +static char str_ForceEncodingPopup[] = "Ä̾ï, ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÊѹ¹¤¹¤ë¤Èʸ»ú¤Ï\n¸µ¤Î½ç½ø¤«¤é¿·¤·¤¤¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç¤Î½ç½ø¤ËʤÙÂؤ¨¤é¤ì¤Þ¤¹.\n¤·¤«¤·¤³¤Î¥Á¥§¥Ã¥¯¥Ü¥Ã¥¯¥¹¤¬¥ª¥ó¤Î¤È¤­¤Ï,\nFontForge¤Ïʸ»ú¤¬´û¤ËÀµ¤·¤¤°ÌÃ֤ˤ¢¤Ã¤Æ, ̾Á°¤¬\n´Ö°ã¤Ã¤ÆÉÕ¤±¤é¤ì¤Æ¤¤¤ë¤â¤Î¤È¸«¤Ê¤·, ¿·¤·¤¤¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ë\n½¾¤Ã¤ÆÁ´¤Æ¤Îʸ»ú̾¤òÊѹ¹¤·¤Þ¤¹."; +static char str_Italicangle[] = "¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­(I):"; +static unichar_t mnemonic_Italicangle[] = 'I'; +static char str_Upos[] = "²¼Àþ¤Î°ÌÃÖ(P):"; +static unichar_t mnemonic_Upos[] = 'P'; +static char str_Uheight[] = "Á´¹â(H):"; +static unichar_t mnemonic_Uheight[] = 'H'; +static char str_Ascent[] = "¹â¤µ(A):"; +static unichar_t mnemonic_Ascent[] = 'A'; +static char str_Descent[] = "¿¼¤µ(D):"; +static unichar_t mnemonic_Descent[] = 'D'; +static char str_EmSize[] = "Á´³Ñ¤Î¥°¥ê¥Ã¥É¿ô(E):"; +static unichar_t mnemonic_EmSize[] = 'E'; +static char str_ScaleOutlines[] = "¥¢¥¦¥È¥é¥¤¥ó¤ò³ÈÂç/½Ì¾®¤¹¤ë(S)"; +static unichar_t mnemonic_ScaleOutlines[] = 'S'; +static char str_Copyright[] = "Ãøºî¸¢(r):"; +static unichar_t mnemonic_Copyright[] = 'r'; +static char str_Xuid[] = "XUID:"; +static unichar_t mnemonic_Xuid[] = 'X'; +static char str_Numchars[] = "ʸ»ú¿ô(N):"; +static unichar_t mnemonic_Numchars[] = 'N'; +static char str_CIDRegistry[] = "CID¥ì¥¸¥¹¥È¥ê:"; +static char str_Guess[] = "¿ä¬(G)"; +static unichar_t mnemonic_Guess[] = 'G'; +static char str_Hist[] = "Ãì¾õ¿Þ(H)"; +static unichar_t mnemonic_Hist[] = 'H'; +static char str_HistPopup[] = "Ãì¾õ¥°¥é¥Õ¤Ë´Ø¤¹¤ë¥À¥¤¥¢¥í¥°"; +static char *str_FamilyNameRequired = "¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼Ì¾¤¬É¬ÍפǤ¹."; +static char *str_PSNameNotNumber = "¿ô»ú¤òPostScript̾¤È¤·¤Æ»È¤¦¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó."; +static char *str_BadFamilyName = "¥Õ¥©¥ó¥È¥Õ¥¡¥ß¥ê¡¼Ì¾¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_BadFontName = "¥Õ¥©¥ó¥È̾¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_NameTooLong = "̾Á°¤¬Ä¹¤¹¤®¤Þ¤¹(ºÇÂç¤Ç63ʸ»ú)"; +static char *str_BadModifierName = "¥Õ¥©¥ó¥È½¤¾þ»Ò¤Î̾Á°¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_BadPSName = "PostScript ̾¤Ï¶õÇò¤ä (){}[]<>%%/ ¤ò´Þ¤Þ¤Ê¤¤ ASCII ʸ»úÎó¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó."; +static char *str_Names = "̾Á°"; +static char *str_Encoding2 = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°"; +static char *str_PSGeneral = "°ìÈ̾ðÊó"; +static char *str_PSPrivate = "PS Private¼­½ñ"; +static char *str_TTFNames = "TTF̾"; +static char *str_TTFValues = "TTF¤ÎÀßÄêÃÍ"; +static char *str_Panose = "Panose"; +static char *str_Comment = "¥³¥á¥ó¥È"; +static char str_TeX = "¦³¦Å¦¶"; +static char *str_InvalidEncoding = "ÉÔÀµ¤Ê¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°"; +static char *str_UniqueIDC = "UniqueID:"; +static char mnemonic_UniqueIDC = 'U'; +static char *str_VersionC = "¥Ð¡¼¥¸¥ç¥ó:"; +static char mnemonic_VersionC = 'V'; +static char *str_HasVerticalMetrics = "½Ä½ñ¤­¥á¥È¥ê¥Ã¥¯¤¬Â¸ºß"; +static char mnemonic_HasVerticalMetrics = 'V'; +static char *str_VOrigin = "½Ä½ñ¤­¤Î´ð½àÅÀ:"; +static char mnemonic_VOrigin = 'O'; +static char *str_Order2Splines = "2¼¡¥¹¥×¥é¥¤¥ó(Q)"; +static char mnemonic_Order2Splines = 'Q'; +static char *str_PopupOrder2Splines = "¤³¤Î¥Õ¥©¥ó¥È¤ò³ÊǼ¤¹¤ë¤Î¤Ë3¼¡(PostScript)¤Î\n¥¹¥×¥é¥¤¥ó¤Ç¤Ï¤Ê¤¯,2¼¡¤Î(¤Ä¤Þ¤êTrueType¤Î)¥¹¥×¥é¥¤¥ó¤ò»ÈÍѤ·¤Þ¤¹.\nOpenType¥Õ¥©¥ó¥È¤äPostScript¥Õ¥©¥ó¥È¤òÊÔ½¸¤¹¤ë»þ¤Ë¤Ï,\n¤³¤ÎÀßÄê¤ò²ò½ü¤·¤Æ¤¯¤À¤µ¤¤(FontForge¤Ï\n¥Õ¥©¥ó¥È¤ÎÀ¸À®»þ¤ËŬÀڤʷ¿¤Î¥¹¥×¥é¥¤¥ó¤Ø¤ÎÊÑ´¹¤ò¹Ô¤¦¤Î¤Ç,¤³¤ì¤Ï\nɬ¿Ü¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó)."; +static char str_UniqueIDTitle = "UniqueID¤òÊѹ¹¤·¤Þ¤¹¤«?"; +static char str_UniqueIDChange = "UniqueID (¤Þ¤¿¤Ï XUID) ¤òÊѹ¹¤»¤º¤Ë¥Õ¥©¥ó¥È̾¤òÊѹ¹¤·¤Þ¤·¤¿.\n¤³¤ì¤Ï¤¿¤¤¤¬¤¤¤Î¾ì¹ç¤ÏÆÀºö¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó.\n¥é¥ó¥À¥à¤Ê¿·¤·¤¤ÃͤòÀ¸À®¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char str_Change = "Êѹ¹(h)"; +static char mnemonic_Change = 'h'; +static char str_ChangeAll = "¤¹¤Ù¤ÆÊѹ¹(A)"; +static char mnemonic_ChangeAll = 'A'; +static char str_RetainAll = "Á´Éô¤½¤Î¤Þ¤Þ(l)"; +static char mnemonic_RetainAll = 'l'; +static char str_Retain = "¤½¤Î¤Þ¤Þ(R)"; +static char mnemonic_Retain = 'R'; +static char *str_Mismatch = "ÉÔ°ìÃ×"; +static char *str_MismatchLong = "¤¢¤ë %s ¤Î¥Ð¡¼¥¸¥ç¥ó¤òÊѹ¹¤·¤Þ¤·¤¿¤¬,\nTTF¤ÎNames¥Æ¡¼¥Ö¥ë¤Ë¤Ï\nƱ¤¸Êª¤¬¤¢¤ê¤Þ¤»¤ó.\nTTF¥Ð¡¼¥¸¥ç¥ó¤ò¿·¤·¤¤ÃͤËÊѹ¹¤·¤Þ¤¹¤«?"; +static char *str_Rename = "̾Á°Êѹ¹(R)..."; +static char *mnemonic_Rename = 'R'; +static char *str_NewDDD = "¿·µ¬(N)..."; +static char *mnemonic_NewDDD = 'N'; +static char *str_EditDDD = "ÊÔ½¸(E)..."; +static char *mnemonic_EditDDD = 'E'; +static char *str_ShowFirstMark = "ºÇ½é¤Î¥Þ¡¼¥¯¤òɽ¼¨"; +static char *str_ShowNextMark = "¼¡¤Î¥Þ¡¼¥¯¤òɽ¼¨"; +static char *str_ShowFirstBase = "ºÇ½é¤Î´ðÄìʸ»ú¤òɽ¼¨"; +static char *str_ShowNextBase = "¼¡¤Î´ðÄìʸ»ú¤òɽ¼¨"; +static char *str_NoMore = "¤³¤ì°Ê¾å¤¢¤ê¤Þ¤»¤ó"; +static char *str_NoMoreMarks = "¤³¤Î¥¢¥ó¥«¡¼¥¯¥é¥¹¤ËÂбþ¤Å¤±¤é¤ì¤¿¥Þ¡¼¥¯¤Ï¤³¤ì°Ê¾å¤¢¤ê¤Þ¤»¤ó"; +static char *str_NoMoreBases = "¤³¤Î¥¢¥ó¥«¡¼¥¯¥é¥¹¤ËÂбþ¤Å¤±¤é¤ì¤¿´ðÄìʸ»ú¤Ï¤³¤ì°Ê¾å¤¢¤ê¤Þ¤»¤ó"; +static char *str_NoMarks = "¤³¤Î¥¢¥ó¥«¡¼¥¯¥é¥¹¤ËÂбþ¤Å¤±¤é¤ì¤¿¥Þ¡¼¥¯¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char *str_NoBases = "¤³¤Î¥¢¥ó¥«¡¼¥¯¥é¥¹¤ËÂбþ¤Å¤±¤é¤ì¤¿´ðÄìʸ»ú¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char *str_NewAnchorClass = "¿·µ¬¥¢¥ó¥«¡¼¥¯¥é¥¹"; +static char *str_EditAnchorClass = "¥¢¥ó¥«¡¼¥¯¥é¥¹¤òÊÔ½¸"; +static char *str_DupAnchorClass = "̾Á°%s¤Ï´û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹.\n¤³¤ì¤é2¤Ä¤Î¥¢¥ó¥«¡¼¥¯¥é¥¹¤òÊ»¹ç¤¹¤ë¤Î¤Ç¤¢¤ì¤Ð,\n[OK]¥Ü¥¿¥ó¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤."; +static char *str_DupAnchorClassNotTag = "̾Á°%s¤ÏÊ̤Υ¿¥°ÍѤ˴û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹."; +static char *str_Continue = "³¤±¤ë(o)"; +static char *mnemonic_Continue = 'o'; +static char *str_AnchorClass = "¥¢¥ó¥«¡¼¥¯¥é¥¹"; +static char *str_AnchorClassName = "¥¢¥ó¥«¡¼¥¯¥é¥¹Ì¾:"; +static char str_FeatureTagTooLong = "µ¡Ç½¥¿¥°¤ÏASCII¤Ç¤Á¤ç¤¦¤É4ʸ»ú¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó."; +static char str_MissingTag = "µ¡Ç½¥¿¥°¤¬¤¢¤ê¤Þ¤»¤ó"; +static char str_TagReuse = "¥¿¥°¤¬ºÆ»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹"; +static char str_TagReuseLong = "´û¤ËÍѤ¤¤¿¥¿¥°¤ò,Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿µ¡Ç½¤ÇºÆ»ÈÍѤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó"; +static char str_OnlyOne = "1¸Ä¸Â¤ê¤Ç¤¹"; +static char str_OnlyOneCurs = "'curs'¥¿¥°¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤­¤ë¥¢¥ó¥«¡¼¥¯¥é¥¹¤Ï1¸Ä¤Ë¸Â¤é¤ì¤Þ¤¹."; +static char str_CantChange = "Êѹ¹¤Ç¤­¤Þ¤»¤ó"; +static char str_CantChangeCurs = "¥¢¥ó¥«¡¼¥¯¥é¥¹¤Î¥¿¥°¤ò'curs'¤Ë¤·¤¿¤ê,'curs'¤«¤éÊ̤Îʪ¤ËÊѹ¹¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó."; +static char str_Contextual = "ʸ̮°Í¸"; +static char str_ContextPos = "ʸ̮°Í¸¤Î°ÌÃÖ»ØÄê"; +static char str_ContextSub = "ʸ̮°Í¸¤ÎÃÖ´¹"; +static char str_ChainPos = "ʸ̮Ϣº¿°Í¸¤Î°ÌÃÖ»ØÄê"; +static char str_ChainSub = "ʸ̮Ϣº¿°Í¸¤ÎÃÖ´¹"; +static char str_ReverseChainSub = "Á°Êýʸ̮Ϣº¿°Í¸¤ÎÃÖ´¹"; +static char str_EditDataDDD = "¥Ç¡¼¥¿¤òÊÔ½¸..."; +static char str_NewContextPos = "ʸ̮°Í¸¤Î°ÌÃÖ»ØÄê¤ò¿·µ¬ÄêµÁ"; +static char str_NewContextSub = "ʸ̮°Í¸¤ÎÃÖ´¹¤ò¿·µ¬ÄêµÁ"; +static char str_NewChainPos = "ʸ̮Ϣº¿°Í¸¤Î°ÌÃÖ»ØÄê¤ò¿·µ¬ÄêµÁ"; +static char str_NewChainSub = "ʸ̮Ϣº¿°Í¸¤ÎÃÖ´¹¤ò¿·µ¬ÄêµÁ"; +static char str_NewReverseChainSub = "¸åÊýʸ̮Ϣº¿°Í¸¤ÎÃÖ´¹¤ò¿·µ¬ÄêµÁ"; +static char str_EditContextPos = "ʸ̮°Í¸¤Î°ÌÃÖ»ØÄê¤òÊÔ½¸"; +static char str_EditContextSub = "ʸ̮°Í¸¤ÎÃÖ´¹¤òÊÔ½¸"; +static char str_EditChainPos = "ʸ̮Ϣº¿°Í¸¤Î°ÌÃÖ»ØÄê¤òÊÔ½¸"; +static char str_EditChainSub = "ʸ̮Ϣº¿°Í¸¤ÎÃÖ´¹¤òÊÔ½¸"; +static char str_EditReverseChainSub = "Á°Êýʸ̮Ϣº¿°Í¸¤ÎÃÖ´¹¤òÊÔ½¸"; +static char str_MacFeatures = "Mac¤Îµ¡Ç½"; +static char str_Order = "½ç½ø¤Å¤±"; +static char str_MacStateMachine = "Mac¤Î¾õÂÖµ¡³£"; +static char str_Indic = "¥¤¥ó¥É·Ï"; +static char str_ContextIns = "ʸ̮°Í¸¤ÎÁÞÆþ"; +static char str_NewIndic = "¥¤¥ó¥É·Ïʸ»ú¤ÎºÆÇÛÃÖ¤ò¿·µ¬ÄêµÁ"; +static char str_EditIndic = "¥¤¥ó¥É·Ïʸ»ú¤ÎºÆÇÛÃÖ¤òÊÔ½¸"; +static char str_NewInsert = "ʸ̮°Í¸¤Î¥°¥ê¥ÕÁÞÆþ¤ò¿·µ¬ÄêµÁ"; +static char str_EditInsert = "ʸ̮°Í¸¤Î¥°¥ê¥ÕÁÞÆþ¤òÊÔ½¸"; + + /* Names of otf tags for GPOS features for anchor */ +static char *str_abvm = "¥Ù¡¼¥¹¥é¥¤¥ó¾åÊý¤Î¥Þ¡¼¥¯"; +static char *str_blwm = "¥Ù¡¼¥¹¥é¥¤¥ó²¼Êý¤Î¥Þ¡¼¥¯"; +static char *str_markT = "¥Þ¡¼¥¯¤Î°ÌÃÖ»ØÄê"; +static char *str_mkmk = "¥Þ¡¼¥¯ÁêÂФΥޡ¼¥¯"; +static char *str_curs = "É®µ­ÂΤÎÀܳ"; +static char *str_RQD = "ɬ¿Ü¤Îµ¡Ç½"; + /* Private info */ +static char *str_PrivateKey = "Private¤Î¥­¡¼"; +static char *str_KeyInPrivate = "(Private¼­½ñÆâ¤Î)¥­¡¼"; +static char *str_Add = "ÄɲÃ(A)"; +static char mnemonic_Add = 'A'; + /* TTF Values */ +static char *str_UltraCondensed = "Ultra-Condensed (50%)"; +static char *str_ExtraCondensed = "Extra-Condensed (62.5%)"; +static char *str_Condensed75 = "Condensed (75%)"; +static char *str_SemiCondensed = "Semi-Condensed (87.5%)"; +static char *str_Medium100 = "Medium (100%)"; +static char *str_SemiExpanded = "Semi-Expanded (112.5%)"; +static char *str_Expanded125 = "Expanded (125%)"; +static char *str_ExtraExpanded = "Extra-Expanded (150%)"; +static char *str_UltraExpanded = "Ultra-Expanded (200%)"; +static char *str_Thin100 = "100 Thin"; +static char *str_ExtraLight200 = "200 Extra-Light"; +static char *str_Light300 = "300 Light"; +static char *str_Book400 = "400 Book"; +static char *str_Medium500 = "500 Medium"; +static char *str_DemiBold600 = "600 Demi-Bold"; +static char *str_Bold700 = "700 Bold"; +static char *str_Heavy800 = "800 Heavy"; +static char *str_Black900 = "900 Black"; +static char *str_EmbeddablePopup = "¤³¤Î¥Õ¥©¥ó¥È¤¬¥À¥¦¥ó¥í¡¼¥É²Äǽ¤Ê(PDF)ʸ½ñ¤ËËä¤á¹þ¤á¤ë¤«,\nËä¤á¹þ¤á¤ë¤Ê¤éʸ½ñ¤È¥É¥­¥å¥á¥ó¥È¤Î¤½¤ì¤¾¤ì¤ËÂФ·¤Æ\n¤É¤Î¤è¤¦¤Ê½èÍý¤¬²Äǽ¤«"; +static char *str_Embeddable = "Ëä¤á¹þ¤ß²Äǽ(E)"; +static char mnemonic_Embeddable = 'E'; +static char *str_LineGapPopup = "linegap¥Õ¥£¡¼¥ë¥É¤òOS/2¤Èhhea¤Îξ¥Æ¡¼¥Ö¥ë¤Ë¥»¥Ã¥È¤·¤Þ¤¹."; +static char *str_LineGap = "¹Ô´Ö(L):"; +static char mnemonic_LineGap = 'L'; +static char *str_VLineGapPopup = "¹Ô´Ö¥Õ¥£¡¼¥ë¥É¤òvhea¥Æ¡¼¥Ö¥ë¤Ë¥»¥Ã¥È¤·¤Þ¤¹.\n¤³¤ì¤Ï½Ä½ñ¤­¥Æ¥­¥¹¥È¤Î¹Ô´Ö¤Î, ¿åÊ¿Êý¸þ¤Î³«¤­¤Î¤³¤È¤Ç¤¹."; +static char *str_VLineGap = "½Ä½ñ¤­¤Î¹Ô´Ö(C):"; +static char mnemonic_VLineGap = 'C'; +static char *str_SetGSUBOrder = "GSUB/morx¤Î½ç½ø¤òÀßÄê"; +static char mnemonic_SetGSUBOrder = 'S'; +static char *str_Top = "ºÇ½é(T)"; +static char mnemonic_Top = 'T'; +static char *str_Bottom= "ºÇ¸å(B)"; +static char mnemonic_Bottom= 'B'; +static char *str_Up = "¾å¤Ø(U)"; +static char mnemonic_Up = 'U'; +static char *str_Down= "²¼¤Ø(D)"; +static char mnemonic_Down= 'D'; +static char *str_NeverEmbeddable = "Ëä¤á¹þ¤ß¶Ø»ß/ÊÔ½¸ÉÔ²Ä"; +static char *str_OnlyPrint = "°õºþ²Äǽ¤Êʸ½ñ"; +static char *str_EditableDoc = "ÊÔ½¸²Äǽ¤Êʸ½ñ"; +static char *str_Installable = "¥¤¥ó¥¹¥È¡¼¥ë²Äǽ¤Ê¥Õ¥©¥ó¥È"; +static char *str_NoSubsetting = "¥µ¥Ö¥»¥Ã¥È²½¤·¤Ê¤¤"; +static char *str_NoSubsettingPopup = "¤³¤ì¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤ë¾ì¹ç, ¥Õ¥©¥ó¥È¤òËä¤á¹þ¤à¤È¤­¤Ï\nÁ´Ê¸»ú¤òʸ½ñÆâ¤ËËä¤á¹þ¤Þ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó.\n¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç, ʸ½ñ¤Î¥¯¥ê¥¨¡¼¥¿¤Ï, ʸÃæ¤Ë´Þ¤Þ¤ì¤ëʸ»ú¤Î¤ß¤òËä¤á¹þ¤àɬÍפ¬¤¢¤ê¤Þ¤¹."; +static char *str_OnlyBitmaps = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤Î¤ßËä¤á¹þ¤ß²Ä"; +static char *str_OnlyBitmapsPopup = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤Î¤ßËä¤á¹þ¤ß²Äǽ¤Ç¤¹. ¥¢¥¦¥È¥é¥¤¥óµ­½Ò¤Ï\nËä¤á¹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó (¥Õ¥©¥ó¥È¤Ë¥Ó¥Ã¥È¥Þ¥Ã¥×¤¬\n´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï²¿¤âËä¤á¹þ¤à¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó)"; +static char *str_Serif = "Serif"; +static char *str_SansSerif = "Sans-Serif"; +static char *str_Monospace = "Monospace"; +static char *str_Script = "Script"; +static char *str_Decorative = "Decorative"; +static char *str_Any = "Any"; +static char *str_NoFit = "No Fit"; +static char *str_TextDisplay = "Text & Display"; +static char *str_Pictoral = "Pictoral"; +static char *str_Cove = "Cove"; +static char *str_ObtuseCove = "Obtuse Cove"; +static char *str_SquareCove = "Square Cove"; +static char *str_ObtuseSquareCove = "Obtuse Square Cove"; +static char *str_Square = "Square"; +static char *str_Thin = "Thin"; +static char *str_Bone = "Bone"; +static char *str_Exaggerated = "Exaggerated"; +static char *str_Triangle = "Triangle"; +static char *str_NormalSans = "Normal Sans"; +static char *str_ObtuseSans = "Obtuse Sans"; +static char *str_PerpSans = "Perp Sans"; +static char *str_Flared = "Flared"; +static char *str_Rounded = "Rounded"; +static char *str_VeryLight = "Very Light"; +static char *str_Light = "Light"; +static char *str_Book = "Book"; +static char *str_Medium = "Medium"; +static char *str_Demi = "Demi"; +static char *str_Bold = "Bold"; +static char *str_Heavy = "Heavy"; +static char *str_Black = "Black"; +static char *str_Nord = "Nord"; +static char *str_OldStyle = "Old Style"; +static char *str_Modern = "Modern"; +static char *str_EvenWidth = "Even Width"; +static char *str_Expanded = "Expanded"; +static char *str_Condensed = "Condensed"; +static char *str_VeryExpanded = "Very Expanded"; +static char *str_VeryCondensed = "Very Condensed"; +static char *str_Monospaced ="Monospaced"; +static char *str_VeryLow ="Very Low"; +static char *str_Low ="Low"; +static char *str_MediumLow ="Medium Low"; +static char *str_MediumHigh ="Medium High"; +static char *str_High ="High"; +static char *str_VeryHigh ="Very High"; +static char *str_GradDiag ="Gradual/Diagonal"; +static char *str_GradTrans ="Gradual/Transitional"; +static char *str_GradVert ="Gradual/Vertical"; +static char *str_GradHor ="Gradual/Horizontal"; +static char *str_RapidVert ="Rapid/Vertical"; +static char *str_RapidHor ="Rapid/Horizontal"; +static char *str_InstantVert ="Instant/Vertical"; +static char *str_NormalContact ="Normal/Contact"; +static char *str_NormalWeighted ="Normal/Weighted"; +static char *str_NormalBoxed ="Normal/Boxed"; +static char *str_NormalFlattened ="Normal/Flattened"; +static char *str_NormalRounded ="Normal/Rounded"; +static char *str_NormalOffCenter ="Normal/Off-Center"; +static char *str_NormalSquare ="Normal/Square"; +static char *str_ObliqueContact ="Oblique/Contact"; +static char *str_ObliqueWeighted ="Oblique/Weighted"; +static char *str_ObliqueBoxed ="Oblique/Boxed"; +static char *str_ObliqueFlattened ="Oblique/Flattened"; +static char *str_ObliqueRounded ="Oblique/Rounded"; +static char *str_ObliqueOffCenter ="Oblique/Off-Center"; +static char *str_ObliqueSquare ="Oblique/Square"; +static char *str_StraightArmsH = "Straight Arms/Horizontal"; +static char *str_StraightArmsW = "Straight Arms/Wedge"; +static char *str_StraightArmsV = "Straight Arms/Vertical"; +static char *str_StraightArmsSS = "Straight Arms/Single Serif"; +static char *str_StraightArmsDS = "Straight Arms/Double Serif"; +static char *str_NStraightArmsH = "Non-Straight Arms/Horizontal"; +static char *str_NStraightArmsW = "Non-Straight Arms/Wedge"; +static char *str_NStraightArmsV = "Non-Straight Arms/Vertical"; +static char *str_NStraightArmsSS = "Non-Straight Arms/Single Serif"; +static char *str_NStraightArmsDS = "Non-Straight Arms/Double Serif"; +static char *str_StandardTrimmed = "Standard/Trimmed"; +static char *str_StandardPointed = "Standard/Pointed"; +static char *str_StandardSerifed = "Standard/Serifed"; +static char *str_HighTrimmed = "High/Trimmed"; +static char *str_HighPointed = "High/Pointed"; +static char *str_HighSerifed = "High/Serifed"; +static char *str_ConstantTrimmed = "Constant/Trimmed"; +static char *str_ConstantPointed = "Constant/Pointed"; +static char *str_ConstantSerifed = "Constant/Serifed"; +static char *str_LowTrimmed = "Low/Trimmed"; +static char *str_LowPointed = "Low/Pointed"; +static char *str_LowSerifed = "Low/Serifed"; +static char *str_ConstantSmall = "Constant/Small"; +static char *str_ConstantStandard = "Constant/Standard"; +static char *str_ConstantLarge = "Constant/Large"; +static char *str_DuckingSmall = "Ducking/Small"; +static char *str_DuckingStandard = "Ducking/Standard"; +static char *str_DuckingLarge = "Ducking/Large"; +static char *str_WidthClass ="Width Class"; +static char mnemonic_WidthClass ='C'; +static char *str_WeightClass ="Weight Class"; +static char mnemonic_WeightClass ='W'; +static char *str_PFMFamily ="PFM Family"; +static char mnemonic_PFMFamily ='F'; +static char *str_Family ="Family"; +static char mnemonic_Family ='F'; +static char *str_Serifs ="Serifs"; +static char mnemonic_Serifs ='S'; +static char *str_Weight ="Weight"; +static char mnemonic_Weight ='W'; +static char *str_Proportion ="Proportion"; +static char mnemonic_Proportion ='P'; +static char *str_Contrast ="Contrast"; +static char mnemonic_Contrast ='C'; +static char *str_StrokeVar ="Stroke Variation"; +static char mnemonic_StrokeVar ='V'; +static char *str_ArmStyle ="Arm Style"; +static char mnemonic_ArmStyle ='A'; +static char *str_Letterform ="Letterform"; +static char mnemonic_Letterform ='L'; +static char *str_MidLine ="Midline"; +static char mnemonic_MidLine ='M'; +static char *str_XHeight ="X-Height"; +static char mnemonic_XHeight ='X'; + /* TTF Names */ +static char *str_Styles = "¥¹¥¿¥¤¥ë(¥µ¥Ö¥Õ¥¡¥ß¥ê¡¼)"; +static char *str_UniqueID = "UniqueID"; +static char *str_Version = "¥Ð¡¼¥¸¥ç¥ó(V)"; +static char mnemonic_Version = 'V'; +static char *str_Fullname = "¥Õ¥ë¥Í¡¼¥à"; +static char *str_Trademark = "¾¦É¸"; +static char *str_Manufacturer = "À½Â¤¸µ"; +static char *str_Designer = "¥Ç¥¶¥¤¥Ê¡¼"; +static char *str_Descriptor = "ÀâÌÀ"; +static char *str_VenderURL = "¥Ù¥ó¥À¤ÎURL"; +static char *str_DesignerURL = "¥Ç¥¶¥¤¥Ê¡¼¤ÎURL"; +static char *str_License = "¥é¥¤¥»¥ó¥¹"; +static char *str_LicenseURL = "¥é¥¤¥»¥ó¥¹¤ÎURL"; +static char *str_OTFFamily = "¥Õ¥¡¥ß¥ê¡¼¤ÎÁª¹¥"; +static char *str_OTFStyles = "¥¹¥¿¥¤¥ë¤ÎÁª¹¥"; +static char *str_CompatableFull = "Mac¸ß´¹¥Õ¥ë¥Í¡¼¥à"; +static char *str_SampleText = "¥µ¥ó¥×¥ë¥Æ¥­¥¹¥È"; +static char *str_TranslateStyle = "¥¹¥¿¥¤¥ë¤òËÝÌõ"; + /* MS Language list -- http://support.microsoft.com/default.aspx?scid=kb;EN-US;q224804 */ + /* MS Reviewed 12/17/2001 */ +static char *str_Afrikaans = "¥¢¥Õ¥ê¥«¡¼¥ó¥¹¸ì"; +static char *str_Albanian = "¥¢¥ë¥Ð¥Ë¥¢¸ì sq_AL"; +static char *str_Arabic = "¥¢¥é¥Ó¥¢¸ì(¥µ¥¦¥¸¥¢¥é¥Ó¥¢)"; +static char *str_IraqArabic = "¥¢¥é¥Ó¥¢¸ì(¥¤¥é¥¯)"; +static char *str_EgyptArabic = "¥¢¥é¥Ó¥¢¸ì(¥¨¥¸¥×¥È)"; +static char *str_LibyaArabic = "¥¢¥é¥Ó¥¢¸ì(¥ê¥Ó¥¢)"; +static char *str_AlgeriaArabic = "¥¢¥é¥Ó¥¢¸ì(¥¢¥ë¥¸¥§¥ê¥¢)"; +static char *str_MoroccoArabic = "¥¢¥é¥Ó¥¢¸ì(¥â¥í¥Ã¥³)"; +static char *str_TunisiaArabic = "¥¢¥é¥Ó¥¢¸ì(¥Á¥å¥Ë¥¸¥¢)"; +static char *str_OmanArabic = "¥¢¥é¥Ó¥¢¸ì(¥ª¥Þ¡¼¥ó)"; +static char *str_YemenArabic = "¥¢¥é¥Ó¥¢¸ì(¥¤¥¨¥á¥ó)"; +static char *str_SyriaArabic = "¥¢¥é¥Ó¥¢¸ì(¥·¥ê¥¢)"; +static char *str_JordanArabic = "¥¢¥é¥Ó¥¢¸ì(¥è¥ë¥À¥ó)"; +static char *str_LebanonArabic = "¥¢¥é¥Ó¥¢¸ì(¥ì¥Ð¥Î¥ó)"; +static char *str_KuwaitArabic = "¥¢¥é¥Ó¥¢¸ì(¥¯¥¦¥§¡¼¥È)"; +static char *str_UAEArabic = "¥¢¥é¥Ó¥¢¸ì(¥¢¥é¥Ö¼óĹ¹ñϢˮ)"; +static char *str_BahrainArabic = "¥¢¥é¥Ó¥¢¸ì(¥Ð¡¼¥ì¡¼¥ó)"; +static char *str_QatarArabic = "¥¢¥é¥Ó¥¢¸ì(¥«¥¿¡¼¥ë)"; +static char *str_Armenian = "¥¢¥ë¥á¥Ë¥¢¸ì"; +static char *str_Assamese = "¥¢¥Ã¥µ¥à¸ì"; +static char *str_LatinAzeri = "¥¢¥¼¥ë¥Ð¥¤¥¸¥ã¥ó¸ì(¥é¥Æ¥óʸ»ú)"; +static char *str_CyrillicAzeri = "¥¢¥¼¥ë¥Ð¥¤¥¸¥ã¥ó¸ì(¥­¥ê¥ëʸ»ú)"; +static char *str_Basque = "¥Ð¥¹¥¯¸ì eu"; +static char *str_Byelorussian = "¥Ù¥é¥ë¡¼¥·¸ì be_BY"; +static char *str_Bengali = "¥Ù¥ó¥¬¥ë¸ì"; +static char *str_Bulgarian = "¥Ö¥ë¥¬¥ê¥¢¸ì bg_BG"; +static char *str_Catalan = "¥«¥¿¥ë¡¼¥Ë¥ã¸ì ca"; +static char *str_MSChinese = "Ãæ¹ñ¸ì(ÂæÏÑ)"; +static char *str_PRCChinese = "Ãæ¹ñ¸ì(Ãæ²Ú¿Í̱¶¦Ï¹ñ) zh_CN"; +static char *str_HKChinese = "Ãæ¹ñ¸ì(¹á¹Á) zh_CN"; +static char *str_SingChinese = "Ãæ¹ñ¸ì(¥·¥ó¥¬¥Ý¡¼¥ë)"; +static char *str_MacauChinese = "Ãæ¹ñ¸ì(¥Þ¥«¥ª)"; +static char *str_Croatian = "¥¯¥í¥¢¥Á¥¢¸ì hr"; +static char *str_Czech = "¥Á¥§¥³¸ì cs_CZ"; +static char *str_Danish = "¥Ç¥ó¥Þ¡¼¥¯¸ì da_DK"; +static char *str_Dutch = "¥ª¥é¥ó¥À¸ì(¥ª¥é¥ó¥À) nl_NL"; +static char *str_Flemish = "¥ª¥é¥ó¥À¸ì(¥Ù¥ë¥®¡¼) nl_BE"; +static char *str_BrEnglish = "±Ñ¸ì(¥¤¥®¥ê¥¹) en_UK"; +static char *str_AmEnglish = "±Ñ¸ì(¥¢¥á¥ê¥«) en_US"; +static char *str_CaEnglish = "±Ñ¸ì(¥«¥Ê¥À) en_CA"; +static char *str_AuEnglish = "±Ñ¸ì(¥ª¡¼¥¹¥È¥é¥ê¥¢) en_AU"; +static char *str_NZEnglish = "±Ñ¸ì(¥Ë¥å¡¼¥¸¡¼¥é¥ó¥É) en_NZ"; +static char *str_IEEnglish = "±Ñ¸ì(¥¢¥¤¥ë¥é¥ó¥É) en_IE"; +static char *str_SAEnglish = "±Ñ¸ì(Æ¥Õ¥ê¥«)"; +static char *str_JamEnglish = "±Ñ¸ì(¥¸¥ã¥Þ¥¤¥«)"; +static char *str_CarEnglish = "±Ñ¸ì(¥«¥ê¥Ö½ô¹ñ)"; +static char *str_BelEnglish = "±Ñ¸ì(¥Ù¥ê¡¼¥º)"; +static char *str_TrinEnglish = "±Ñ¸ì(¥È¥ê¥Ë¥À¡¼¥É¡¦¥È¥Ð¥´)"; +static char *str_ZimEnglish = "±Ñ¸ì(¥¸¥ó¥Ð¥Ö¥¨)"; +static char *str_PhilEnglish = "±Ñ¸ì(¥Õ¥£¥ê¥Ô¥ó)"; +static char *str_Estonia = "¥¨¥¹¥È¥Ë¥¢¸ì et_EE"; +static char *str_Finnish = "¥Õ¥£¥ó¥é¥ó¥É¸ì fi_FI"; +static char *str_Farsi = "¥Ú¥ë¥·¥ã¸ì"; +static char *str_Faeroese = "¥Õ¥§¥í¡¼¸ì"; +static char *str_FRFrench = "¥Õ¥é¥ó¥¹¸ì(¥Õ¥é¥ó¥¹) fr_FR"; +static char *str_BEFrench = "¥Õ¥é¥ó¥¹¸ì(¥Ù¥ë¥®¡¼) fr_BE"; +static char *str_CAFrench = "¥Õ¥é¥ó¥¹¸ì(¥«¥Ê¥À) fr_CA"; +static char *str_CHFrench = "¥Õ¥é¥ó¥¹¸ì(¥¹¥¤¥¹) fr_CH"; +static char *str_LUFrench = "¥Õ¥é¥ó¥¹¸ì(¥ë¥¯¥»¥ó¥Ö¥ë¥°) fr_LU"; +static char *str_MOFrench = "¥Õ¥é¥ó¥¹¸ì(¥â¥Ê¥³)"; +static char *str_ITFrench = "¥Õ¥é¥ó¥¹¸ì(¥¤¥¿¥ê¥¢) fr_IT"; +static char *str_Georgian = "¥°¥ë¥¸¥¢¸ì"; +static char *str_DEGerman = "¥É¥¤¥Ä¸ì(¥É¥¤¥Ä) de_DE"; +static char *str_CHGerman = "¥É¥¤¥Ä¸ì(¥¹¥¤¥¹) de_CH"; +static char *str_ATGerman = "¥É¥¤¥Ä¸ì(¥ª¡¼¥¹¥È¥ê¥¢) de_AT"; +static char *str_LUGerman = "¥É¥¤¥Ä¸ì(¥ë¥¯¥»¥ó¥Ö¥ë¥°) de_LU"; +static char *str_LIGerman = "¥É¥¤¥Ä¸ì(¥ê¥Ò¥Æ¥ó¥·¥å¥¿¥¤¥ó) de_LI"; +static char *str_ITGerman = "¥É¥¤¥Ä¸ì(¥¤¥¿¥ê¥¢) de_IT"; +static char *str_Greek = "¥®¥ê¥·¥ã¸ì el_GR"; +static char *str_Gujarati = "¥°¥¸¥ã¥é¡¼¥Æ¥£¸ì"; +static char *str_Hebrew = "¥Ø¥Ö¥é¥¤¸ì he_IL"; +static char *str_Hindi = "¥Ò¥ó¥Ç¥£¡¼¸ì"; +static char *str_Hungarian = "¥Ï¥ó¥¬¥ê¡¼¸ì hu_HU"; +static char *str_Icelandic = "¥¢¥¤¥¹¥é¥ó¥É¸ì is_IS"; +static char *str_Indonesian = "¥¤¥ó¥É¥Í¥·¥¢¸ì"; +static char *str_Italian = "¥¤¥¿¥ê¥¢¸ì(¥¤¥¿¥ê¥¢) it_IT"; +static char *str_CHItalian = "¥¤¥¿¥ê¥¢¸ì(¥¹¥¤¥¹) it_CH"; +static char *str_Japanese = "ÆüËܸì ja_JP"; +static char *str_Kannada = "¥«¥ó¥Ê¥À¸ì"; +static char *str_Kashmiri = "¥«¥·¥ß¡¼¥ë¸ì(¥¤¥ó¥É)"; +static char *str_Kazakh = "¥«¥¶¥Õ¸ì"; +static char *str_Konkani = "¥³¥ó¥«¥Ë¸ì"; +static char *str_LangKorean = "´Ú¹ñ¸ì"; +static char *str_LangKoreanJohab = "´Ú¹ñ¸ì(Johab)"; +static char *str_Latvian = "¥é¥È¥Ó¥¢¸ì lv_LV"; +static char *str_Lithuanian = "¥ê¥È¥¢¥Ë¥¢¸ì lt_LT"; +static char *str_ClassLithuanian = "¥ê¥È¥¢¥Ë¥¢¸ì(Îò»ËŪ)"; +static char *str_Macedonian = "¥Þ¥±¥É¥Ë¥¢¸ì"; +static char *str_Malay = "¥Þ¥ì¡¼¸ì(¥Þ¥ì¡¼¥·¥¢)"; +static char *str_BruMalay = "¥Þ¥ì¡¼¸ì(¥Ö¥ë¥Í¥¤)"; +static char *str_Nepali = "¥Í¥Ñ¡¼¥ë¸ì(¥Í¥Ñ¡¼¥ë)"; +static char *str_IndNepali = "¥Í¥Ñ¡¼¥ë¸ì(¥¤¥ó¥É)"; +static char *str_Norwegian = "¥Î¥ë¥¦¥§¡¼¸ì(¥Ü¥¯¥â¡¼¥ë) no_NO"; +static char *str_NorwegianN = "¥Î¥ë¥¦¥§¡¼¸ì(¥Ë¥å¡¼¥Î¥·¥å¥¯) no_NO"; +static char *str_Oriya = "¥ª¥ê¥ä¸ì"; +static char *str_Polish = "¥Ý¡¼¥é¥ó¥É¸ì pl_PL"; +static char *str_PTPortuguese = "¥Ý¥ë¥È¥¬¥ë¸ì(¥Ý¥ë¥È¥¬¥ë) pt_PT"; +static char *str_BRPortuguese = "¥Ý¥ë¥È¥¬¥ë¸ì(¥Ö¥é¥¸¥ë) pt_BR"; +static char *str_Punjabi = "¥Ñ¥ó¥¸¥ã¡¼¥Ö¸ì"; +static char *str_RhaetoRomanic = "¥ì¥È¡¦¥í¥Þ¥ó¥¹¸ì"; +static char *str_Romanian = "¥ë¡¼¥Þ¥Ë¥¢¸ì ro_RO"; +static char *str_MolRomanian = "¥ë¡¼¥Þ¥Ë¥¢¸ì(¥â¥ë¥É¥Ð)"; +static char *str_Russian = "¥í¥·¥¢¸ì(¥í¥·¥¢) ru_RU"; +static char *str_MolRussian = "¥í¥·¥¢¸ì(¥â¥ë¥É¥Ð)"; +static char *str_Sami = "¥µ¡¼¥ß¸ì(¥é¥Ã¥×¸ì)"; +static char *str_Sanskrit = "¥µ¥ó¥¹¥¯¥ê¥Ã¥È"; +static char *str_Serbian = "¥»¥ë¥Ó¥¢¸ì(¥­¥ê¥ëʸ»ú)"; +static char *str_LatSerbian = "¥»¥ë¥Ó¥¢¸ì(¥é¥Æ¥óʸ»ú)"; +static char *str_Sindhi = "¥·¥ó¥É¸ì"; +static char *str_Slovak = "¥¹¥í¥Ð¥­¥¢¸ì sk_SK"; +static char *str_Slovenian = "¥¹¥í¥Ù¥Ë¥¢¸ì sl_SI"; +static char *str_Sorbian = "¥½¥ë¥Ö¸ì"; +static char *str_TradSpanish = "¥¹¥Ú¥¤¥ó¸ì(Îò»ËŪ) es_ES"; +static char *str_MXSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥á¥­¥·¥³) es_MX"; +static char *str_ModSpanish = "¥¹¥Ú¥¤¥ó¸ì(¸½Âå) es_ES"; +static char *str_GuaSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥°¥¡¥Æ¥Þ¥é) es"; +static char *str_CRSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥³¥¹¥¿¥ê¥«) es"; +static char *str_PanSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Ñ¥Ê¥Þ) es"; +static char *str_DRSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥É¥ß¥Ë¥«¶¦Ï¹ñ) es"; +static char *str_VenSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Ù¥Í¥º¥¨¥é) es"; +static char *str_ColSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥³¥í¥ó¥Ó¥¢) es"; +static char *str_PeruSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Ú¥ë¡¼) es"; +static char *str_ArgSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥¢¥ë¥¼¥ó¥Á¥ó) es"; +static char *str_EcuSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥¨¥¯¥¢¥É¥ë) es"; +static char *str_ChiSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Á¥ê) es"; +static char *str_UruSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥¦¥ë¥°¥¢¥¤) es"; +static char *str_ParSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Ñ¥é¥°¥¢¥¤) es"; +static char *str_BolSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Ü¥ê¥Ó¥¢) es"; +static char *str_ESSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥¨¥ë¥µ¥ë¥Ð¥É¥ë) es"; +static char *str_HonSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Û¥ó¥¸¥å¥é¥¹) es"; +static char *str_NicSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥Ë¥«¥é¥°¥¢) es"; +static char *str_PRSpanish = "¥¹¥Ú¥¤¥ó¸ì(¥×¥¨¥ë¥È¥ê¥³) es"; +static char *str_Sutu = "¥¹¥Ä¸ì"; +static char *str_Swahili = "¥¹¥ï¥Ò¥ê¸ì(¥±¥Ë¥¢)"; +static char *str_Swedish = "¥¹¥¦¥§¡¼¥Ç¥ó¸ì(¥¹¥¦¥§¡¼¥Ç¥ó) sv_SE"; +static char *str_FinSwedish = "¥¹¥¦¥§¡¼¥Ç¥ó¸ì(¥Õ¥£¥ó¥é¥ó¥É) sv_FI"; +static char *str_Tamil = "¥¿¥ß¥ë¸ì"; +static char *str_Tatar = "¥¿¥¿¡¼¥ë¸ì(¥¿¥¿¡¼¥ë¥¹¥¿¥ó)"; +static char *str_Telugu = "¥Æ¥ë¥°¸ì"; +static char *str_LangThai = "¥¿¥¤¸ì"; +static char *str_Tsonga = "¥Ä¥©¥ó¥¬¸ì"; +static char *str_Tswana = "¥Ä¥ï¥Ê¸ì"; +static char *str_Turkish = "¥È¥ë¥³¸ì tr_TR"; +static char *str_Ukrainian = "¥¦¥¯¥é¥¤¥Ê¸ì uk_UA"; +static char *str_Urdu = "¥¦¥ë¥É¥¥¡¼¸ì(¥Ñ¥­¥¹¥¿¥ó)"; +static char *str_IndUrdu = "¥¦¥ë¥É¥¥¡¼¸ì(¥¤¥ó¥É)"; +static char *str_Uzbek = "¥¦¥º¥Ù¥¯¸ì(¥é¥Æ¥óʸ»ú)"; +static char *str_CyrUzbek = "¥¦¥º¥Ù¥¯¸ì(¥­¥ê¥ëʸ»ú)"; +static char *str_Venda = "¥Ù¥ó¥À¸ì"; +static char *str_Vietnamese = "¥Ù¥È¥Ê¥à¸ì"; +static char *str_Xhosa = "¥³¥µ¸ì"; +static char *str_Yiddish = "¥¤¥Ç¥£¥Ã¥·¥å¸ì"; +static char *str_Zulu = "¥º¡¼¥ë¡¼¸ì"; + /* TeX font params */ +static unichar_t str_TeXText = { 0x3a4, 0x3b5, 0x3a7, ' ','T','e','x','t', 0 }; +static unichar_t str_TeXMath = { 0x3a4, 0x3b5, 0x3a7, ' ','M','a','t','h', 0 }; +static unichar_t str_TeXMathExt = { 0x3a4, 0x3b5, 0x3a7, ' ','M','a','t','h',' ','E','x','t', 0 }; +static char *str_MoreParams = "Äɲåѥé¥á¡¼¥¿"; +static char *str_DesignSize = "¥Ç¥¶¥¤¥ó¥µ¥¤¥º:"; +static char *str_DesignSizePopup = "¤³¤Î½ñÂΤ¬¥Ç¥¶¥¤¥ó¤µ¤ì¤¿¥µ¥¤¥º(¥Ý¥¤¥ó¥È¿ô)"; +static char *str_Slant = "·¹¼ÐÃÍ:"; +static char *str_SlantPopup = "¥¤¥¿¥ê¥Ã¥¯¥Õ¥©¥ó¥È¤Ë¤ª¤±¤ë, 1ñ°Ì¤Î¿âľÊѲ½¤ËÂФ¹¤ë¿åÊ¿ÊѲ½¤ÎÎÌ"; +static char *str_Space = "ñ¸ì´Ö¤Î¶õÇò:"; +static char *str_SpacePopup = "¤³¤Î¥Õ¥©¥ó¥È¤ò»ÈÍѤ·¤¿¤È¤­¤Îñ¸ì´Ö¥¹¥Ú¡¼¥¹¤ÎÎÌ"; +static char *str_Stretch = "¸ì´Ö¤Î¿­Ä¹ÅÙ:"; +static char *str_StretchPopup = "¤³¤Î¥Õ¥©¥ó¥È¤ò»ÈÍѤ·¤¿¤È¤­¤Î, ñ¸ì´Ö¥¹¥Ú¡¼¥¹¤Î³ÈÂç²Äǽ¤ÊÎÌ"; +static char *str_Shrink = "¸ì´Ö¤Î¼ý½ÌÅÙ:"; +static char *str_ShrinkPopup = "¤³¤Î¥Õ¥©¥ó¥È¤ò»ÈÍѤ·¤¿¤È¤­¤Î, ñ¸ì´Ö¥¹¥Ú¡¼¥¹¤Î½Ì¾®²Äǽ¤ÊÎÌ"; +static char *str_XHeightC = "x¥Ï¥¤¥È:"; +static char *str_XHeightCPopup = "¾åü¤¬Ê¿¤é¤Ê¾®Ê¸»ú¤Î¹â¤µ"; +static char *str_Quad = "¥¯¥ï¥¿:"; +static char *str_QuadPopup = "1em¤Î²£Éý" +static char *str_ExtraSp = ";ʬ¤Ê¥¹¥Ú¡¼¥¹:"; +static char *str_ExtraPopup = "°Ê²¼¤Î¤É¤Á¤é¤«:\nʸËö¤ËÉÕ¤±²Ã¤¨¤é¤ì¤ë¥¹¥Ú¡¼¥¹¤ÎÄɲÃÎÌ\n¿ô¼°Æâ¤ÇÍѤ¤¤é¤ì¤ë¥¹¥Ú¡¼¥¹" +static char *str_MathSp = "¿ô¼°¥¹¥Ú¡¼¥¹:"; + /* TeX math font params */ +static char *str_Num1 = "ʬ»Ò1:" +static char *str_Num1Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ëʬ»Ò¤Î¥Ù¡¼¥¹¥é¥¤¥ó»ý¤Á¾å¤²ÎÌ"; +static char *str_Num2 = "ʬ»Ò2:" +static char *str_Num2Popup = "Èó¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ëʬ»Ò¤Î¥Ù¡¼¥¹¥é¥¤¥ó»ý¤Á¾å¤²ÎÌ"; +static char *str_Num3 = "ʬ»Ò3:" +static char *str_Num3Popup = "Èó¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Î\atop¥¹¥¿¥¤¥ë¤Ë¤ª¤±¤ëʬ»Ò¤Î¥Ù¡¼¥¹¥é¥¤¥ó»ý¤Á¾å¤²ÎÌ"; +static char *str_Denom1 = "ʬÊì:" +static char *str_Denom1Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ëʬÊì¤Î¥Ù¡¼¥¹¥é¥¤¥ó°ú¤­²¼¤²ÎÌ"; +static char *str_Denom2 = "ʬÊì2:" +static char *str_Denom2Popup = "Èó¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ëʬÊì¤Î¥Ù¡¼¥¹¥é¥¤¥ó°ú¤­²¼¤²ÎÌ"; +static char *str_Sup1 = "¾åÉÕ¤­1:" +static char *str_Sup1Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ë¾åÉÕ¤­Ê¸»ú¤Î¥Ù¡¼¥¹¥é¥¤¥ó»ý¤Á¾å¤²ÎÌ"; +static char *str_Sup2 = "¾åÉÕ¤­2:" +static char *str_Sup2Popup = "Èó¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ë¾åÉÕ¤­Ê¸»ú¤Î¥Ù¡¼¥¹¥é¥¤¥ó»ý¤Á¾å¤²ÎÌ"; +static char *str_Sup3 = "¾åÉÕ¤­3:" +static char *str_Sup3Popup = "ÊÑ·Á¥¹¥¿¥¤¥ë¤Ë¤ª¤±¤ë¾åÉÕ¤­Ê¸»ú¤Î¥Ù¡¼¥¹¥é¥¤¥ó»ý¤Á¾å¤²ÎÌ"; +static char *str_Sub1 = "²¼ÉÕ¤­1:" +static char *str_Sub1Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ë²¼ÉÕ¤­Ê¸»ú¤Î¥Ù¡¼¥¹¥é¥¤¥ó°ú¤­²¼¤²ÎÌ"; +static char *str_Sub2 = "²¼ÉÕ¤­2:" +static char *str_Sub2Popup = "Èó¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Ë¤ª¤±¤ë²¼ÉÕ¤­Ê¸»ú¤Î¥Ù¡¼¥¹¥é¥¤¥ó°ú¤­²¼¤²ÎÌ"; +static char *str_SupDrop = "SupDrop:" +static char *str_SupDropPopup = "¾å¤Ä¤­Ê¸»ú¤Î¥Ù¡¼¥¹¥é¥¤¥ó¤òÇÛÃÖ¤¹¤ë¤¿¤á¤ËÂ礭¤Ê¥Ü¥Ã¥¯¥¹¤Î¾åü¤ò°ú¤­²¼¤²¤ëÎÌ"; +static char *str_SubDrop = "SubDrop:" +static char *str_SubDropPopup = "²¼¤Ä¤­Ê¸»ú¤Î¥Ù¡¼¥¹¥é¥¤¥ó¤òÇÛÃÖ¤¹¤ë¤¿¤á¤ËÂ礭¤Ê¥Ü¥Ã¥¯¥¹¤Î¾åü¤ò°ú¤­²¼¤²¤ëÎÌ"; +static char *str_Delim1 = "¶èÀÚ¤ê1:" +static char *str_Delim1Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Î \comb ¤Î¶èÀÚ¤êʸ»ú"; +static char *str_Delim2 = "¶èÀÚ¤ê2:" +static char *str_Delim2Popup = "Èó¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Î \comb ¤Î¶èÀÚ¤êʸ»ú"; +static char *str_AxisHt = "¼´¤Î¹â¤µ:" +static char *str_AxisHtPopup = "ʬ¿ô¤Î²£Àþ¤Î,¥Ù¡¼¥¹¥é¥¤¥ó¤«¤é¤ß¤¿¹â¤µ"; + /* TeX math ext font params */ +static char *str_DefRuleThick = "·Ó¤Îɸ½àÂÀ¤µ:" +static char *str_DefRuleThickPopup = "\over ¤È \overline ¤Î²£ËÀ¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÂÀ¤µ"; +static char *str_BigOpSpace1 = "Âç·¿±é»»»Ò¤Î¥¹¥Ú¡¼¥¹1:"; +static char *str_BigOpSpace1Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤ÎÂç·¿±é»»»Ò¤Î¾å¤ËÃÖ¤«¤ì¤ëºÇ¾®¥°¥ë¡¼¥¹¥Ú¡¼¥¹"; +static char *str_BigOpSpace2 = "Âç·¿±é»»»Ò¤Î¥¹¥Ú¡¼¥¹2:"; +static char *str_BigOpSpace2Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤ÎÂç·¿±é»»»Ò¤Î²¼¤ËÃÖ¤«¤ì¤ëºÇ¾®¥°¥ë¡¼¥¹¥Ú¡¼¥¹"; +static char *str_BigOpSpace3 = "Âç·¿±é»»»Ò¤Î¥¹¥Ú¡¼¥¹3:"; +static char *str_BigOpSpace3Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤ÎÂç·¿±é»»»Ò¤Î¾å¤Ë(ÀÑʬÈϰϤʤɤÎ)\n¾å¸ÂÃͤ¬Í褿¤È¤­,¤½¤Î¥Ù¡¼¥¹¥é¥¤¥ó¤È±é»»»Ò¤Î´Ö¤ËÃÖ¤«¤ì¤ë\n¶õ¤­¤ÎºÇ¾®ÎÌ"; +static char *str_BigOpSpace4 = "Âç·¿±é»»»Ò¤Î¥¹¥Ú¡¼¥¹4:"; +static char *str_BigOpSpace4Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤ÎÂç·¿±é»»»Ò¤Î²¼¤Ë(ÀÑʬÈϰϤʤɤÎ)\n²¼¸ÂÃͤ¬Í褿¤È¤­,¤½¤Î¥Ù¡¼¥¹¥é¥¤¥ó¤È±é»»»Ò¤Î´Ö¤ËÃÖ¤«¤ì¤ë\n¶õ¤­¤ÎºÇ¾®ÎÌ"; +static char *str_BigOpSpace5 = "Âç·¿±é»»»Ò¤Î¥¹¥Ú¡¼¥¹5:"; +static char *str_BigOpSpace5Popup = "¥Ç¥£¥¹¥×¥ì¥¤¿ô¼°¤Î¾å¸Â¡¦²¼¸Â¤Î¾å²¼¤ËÄɲ䵤ì¤ë¥°¥ë¡¼¥¹¥Ú¡¼¥¹"; + /* Generate fonts */ /* savefontdlg */ +static char str_Format[] = "¥Õ¥©¡¼¥Þ¥Ã¥È:"; +static char str_Savefailedtitle[] = "Êݸ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char str_Options = "¥ª¥×¥·¥ç¥ó"; +static char str_OptionsPopup = "¥Õ¥©¥ó¥ÈÀ¸À®»þ¤Î¿¶Éñ¤¤¤Ë´Ø¤¹¤ë¥ª¥×¥·¥ç¥ó¤òÁªÂò¤Ç¤­¤Þ¤¹"; +static char str_Outputafm[] = "AFM¤ò½ÐÎÏ"; +static char str_Outputpfm[] = "PFM¤ò½ÐÎÏ"; +static char str_Outputtfm[] = "TFM¤ÈENC¤ò½ÐÎÏ"; +static char *str_OutputAfmPopup = "AFM¥Õ¥¡¥¤¥ë¤Ë¤Ï, ¿¤¯¤Î¥ï¡¼¥×¥í¤¬PostScript¥Õ¥©¥ó¥È\n»ÈÍÑ»þ¤ËÆɤ߹þ¤à¥á¥È¥ê¥Ã¥¯¾ðÊ󤬴ޤޤì¤Æ¤¤¤Þ¤¹."; +static char *str_OutputPfmPopup = "PFM¥Õ¥¡¥¤¥ë¤Ë¤Ï, PostScript¥Õ¥©¥ó¥È¤ò¥¤¥ó¥¹¥È¡¼¥ë\n¤¹¤ë¤È¤­¤ËWindows¤¬É¬ÍפȤ¹¤ë¾ðÊ󤬴ޤޤì¤Æ¤¤¤Þ¤¹."; +static char *str_OutputTfmPopup = "TFM,ENC¤Îξ¥Õ¥¡¥¤¥ë¤Ë¤Ï, PostScript¥Õ¥©¥ó¥È¤ò¥¤¥ó¥¹¥È¡¼¥ë\n¤¹¤ë¤È¤­¤ËTeX¤¬É¬ÍפȤ¹¤ë¾ðÊ󤬴ޤޤì¤Æ¤¤¤Þ¤¹."; +static char str_AppleMode[] = "Apple¤Î»ÅÍÍ"; +static char *str_AppleModePopup = "Apple¤ÈMS/Adobe¤È¤Ç, TrueType¤äOpenType¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ë°Û¤Ê¤ëÅÀ¤¬¤¢¤ê¤Þ¤¹.\n¤É¤Á¤é¤Îɸ½à¤Ë½¾¤Ã¤Æ¥Õ¥©¥ó¥È¤òºî¤ë¤«¤ò¤³¤³¤ÇÁª¤Ö¤³¤È¤¬¤Ç¤­¤Þ¤¹.\nξ¼Ô¤Î¼ç¤Ê°ã¤¤¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹:\n 'PostScript'̾¤ËÂФ¹¤ëÍ×µá»ö¹à¤¬Ì·½â¤·¤Æ¤¤¤ë\n ¥Ó¥Ã¥È¥Þ¥Ã¥×¥Ç¡¼¥¿¤¬°Û¤Ê¤ë¥Æ¡¼¥Ö¥ë¤Ë³ÊǼ¤µ¤ì¤ë\n ³ÈÂç/½Ì¾®¤µ¤ì¤¿ÁȤ߹ç¤ï¤»Ê¸»ú¤Î°·¤¤¤¬°Û¤Ê¤ë\n morx(t)/feat¤Ç¤Ï¤Ê¤¯GSUB¤ò»È¤¦\n kern/opbd¤Ç¤Ï¤Ê¤¯GPOS¤ò»È¤¦\n lcar/prop¤Ç¤Ï¤Ê¤¯GDEF¤ò»È¤¦"; +static char str_OpenTypeMode[] = "OpenType¤Î»ÅÍÍ"; +static char *str_OpenTypeModePopup = "Apple¤ÈMS/Adobe¤È¤Ç, TrueType¤äOpenType¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ë°Û¤Ê¤ëÅÀ¤¬¤¢¤ê¤Þ¤¹.\n¤É¤Á¤é¤Îɸ½à¤Ë½¾¤Ã¤Æ¥Õ¥©¥ó¥È¤òºî¤ë¤«¤ò¤³¤³¤ÇÁª¤Ö¤³¤È¤¬¤Ç¤­¤Þ¤¹.\nξ¼Ô¤Î¼ç¤Ê°ã¤¤¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹:\n 'PostScript'̾¤ËÂФ¹¤ëÍ×µá»ö¹à¤¬Ì·½â¤·¤Æ¤¤¤ë\n ¥Ó¥Ã¥È¥Þ¥Ã¥×¥Ç¡¼¥¿¤¬°Û¤Ê¤ë¥Æ¡¼¥Ö¥ë¤Ë³ÊǼ¤µ¤ì¤ë\n ³ÈÂç/½Ì¾®¤µ¤ì¤¿ÁȤ߹ç¤ï¤»Ê¸»ú¤Î°·¤¤¤¬°Û¤Ê¤ë\n morx(t)/feat¤Ç¤Ï¤Ê¤¯GSUB¤ò»È¤¦\n kern/opbd¤Ç¤Ï¤Ê¤¯GPOS¤ò»È¤¦\n lcar/prop¤Ç¤Ï¤Ê¤¯GDEF¤ò»È¤¦"; +static char str_Nooutlinefont[] = "¥¢¥¦¥È¥é¥¤¥ó¥Õ¥©¥ó¥È̵¤·"; +static char str_Nobitmapfonts[] = "¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È̵¤·"; +static char str_Afmfailedtitle[] = "AFM¤ÎÊݸ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char str_Pfmfailedtitle[] = "PFM¤ÎÊݸ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char str_Tfmfailedtitle[] = "TFM¤ÎÊݸ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char *str_SavingFont = "¥Õ¥©¥ó¥È¤òÊݸÃæ"; +static char *str_SavingPSFont = "PostScript¥Õ¥©¥ó¥È¤òÊݸÃæ"; +static char *str_SavingMultiplePSFonts = "Ê£¿ô¤ÎPostScript¥Õ¥©¥ó¥È¤òÊݸÃæ"; +static char *str_SavingTTFont = "TrueType¥Õ¥©¥ó¥È¤òÊݸÃæ"; +static char *str_SavingCIDFont = "CID¥Õ¥©¥ó¥È¤òÊݸÃæ"; +static char *str_SavingAFM = "AFM¥Õ¥¡¥¤¥ë¤òÊݸÃæ"; +static char *str_SavingPFM = "PFM¥Õ¥¡¥¤¥ë¤òÊݸÃæ"; +static char *str_SavingTFM = "TFM¥Õ¥¡¥¤¥ë¤òÊݸÃæ"; +static char *str_SavingENC = "ENC¥Õ¥¡¥¤¥ë¤òÊݸÃæ"; +static char *str_SavingBitmapFonts = "¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤òÊݸÃæ"; +static char *str_NotCID = "CID¥Õ¥©¥ó¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NotCIDOk = "CID¥Õ¥©¥ó¥È¤òCID¤ËÂбþ¤·¤Æ¤¤¤Ê¤¤¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç\nÊݸ¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹. Êݸ¤Ï²Äǽ¤Ç¤¹¤¬,\nÁªÂòÃæ¤Î¥µ¥Ö¥Õ¥©¥ó¥È¤·¤«Êݸ¤µ¤ì¤Þ¤»¤ó.\n¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char *str_PixelList = "¥Ô¥¯¥»¥ë°ìÍ÷"; +static char *str_EncodingTooLarge="¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤¬Â礭¤¹¤®¤Þ¤¹."; +static char *str_TwoBEncIn1BFont = "¤³¤Î¥Õ¥©¥ó¥È¤Ï2¥Ð¥¤¥È¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç¤¹¤¬,\n1¥Ð¥¤¥È¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤·¤«¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Ê¤¤¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç\nÊݸ¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹. ¤³¤Î¾ì¹ç,\n¥Õ¥©¥ó¥È¤òºÆ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤·¤Ê¤¤¤«¤®¤ê, ºÇ½é¤Î\n256ʸ»ú¤Ë¤·¤«¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤»¤ó.\n\n¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char *str_GreymapDepth = "greymap¤Î³¬Ä´¥Ó¥Ã¥È¿ô" +static char *str_BDFResolution = "BDF¤Î²òÁüÅÙ" +static char *str_Other_ = "¤½¤Î¾(O)"; +static char *mnemonic_Other_ = "O"; +static char *str_GuessResPopup = "³Æ¥Õ¥©¥ó¥È¤Î²òÁüÅÙ¤ò¥Ô¥¯¥»¥ë¥µ¥¤¥º¤«¤é¿ä¬¤·¤Þ¤¹."; +static char *str_FindMultipleMap = "¥µ¥Ö¥Õ¥©¥ó¥ÈÄêµÁ¥Õ¥¡¥¤¥ë¤òõ¤¹"; +static char *str_NoSubFontDefinitionFile = "¥µ¥Ö¥Õ¥©¥ó¥ÈÄêµÁ¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_PSNames = "PostScript̾"; +static char *str_PSNamesPopup = "¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë³Æʸ»ú¤Î̾¾Î¤ò´Þ¤á¤ë¤«¤É¤¦¤«"; +static char *str_TTFHintsPopup = "¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤ËTrueType¤Î¥Ò¥ó¥ÈÌ¿Îá¤ò´Þ¤á¤Þ¤¹¤«?\n¤³¤ì¤Ë¤è¤Ã¤Æ¿·¤·¤¯¥Ò¥ó¥ÈÌ¿Î᤬´Þ¤Þ¤ì¤ë¤è¤¦¤Ë¤Ï¤Ê¤ê¤Þ¤»¤ó.\n³Æʸ»ú¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¤â¤Î¤ò½ñ¤­½Ð¤¹¤À¤±¤Ç¤¹." +static char *str_WrongSFDFile = "SFD¥Õ¥¡¥¤¥ë¤Î¥¿¥¤¥×¤¬°ã¤¤¤Þ¤¹."; +static char *str_BadSFDFile = "¤³¤ì¤ÏFontForge¤ÎSplineFont DataBase¥Õ¥¡¥¤¥ë¤Î¤è¤¦¤Ç¤¹.\nTeX¤ÎSubFont Definition¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó.\n³ÈÄ¥»Ò¤¬º®Í𤷤Ƥ¤¤ë¤Î¤Ï»ÄÇ°¤Ç¤¹¤Í."; +static char *str_BadFamilyForMac = "Mac¥Õ¥¡¥ß¥ê¡¼¤¬ÉÔÀµ¤Ç¤¹"; +static char *str_BadMacFamily = "Mac¤Î¥Õ¥¡¥ß¥ê¡¼¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤Ë¤Ï,¥«¥ì¥ó¥È¥Õ¥©¥ó¥È¤¬É¸½à(Normal,RegularÅù)¤Ç,Ʊ¤¸¥Õ¥¡¥ß¥ê¡¼Ì¾¤ò»ý¤Ä¥Õ¥©¥ó¥È¤ò³«¤¤¤Æ¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"; +static char *str_TwoFontsSameStyle = "¥«¥ì¥ó¥È¥Õ¥©¥ó¥È¤ÈƱ°ì¤Î¥Õ¥¡¥ß¥ê¡¼Ì¾¤ò¤â¤Á,Ʊ¤¸¥¹¥¿¥¤¥ë¤ò¤â¤Ä,%.30hs¤È%0.30hs¤Î2¤Ä¤Î¥Õ¥©¥ó¥È¤¬³«¤«¤ì¤Æ¤¤¤Þ¤¹." +static char *str_DifferentEncodings = "¥Õ¥©¥ó¥È %1$.30hs ¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ï%2$.30hs¤È°Û¤Ê¤ê¤Þ¤¹"; +static char *str_NotdefName = "̾Á°¤¬.notdef¤Ç¤¹"; +static char *str_NotdefChar = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°%d ¤Îʸ»ú¤Ï\".notdef\"¤È¤¤¤¦Ì¾Á°¤¬¤Ä¤¤¤Æ¤¤¤Þ¤¹. ̾Á°¤¬\".notdef\"¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¿¤á¤Ë,À¸À®¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ë¤Ï¤³¤Îʸ»ú¤Ï´Þ¤Þ¤ì¤Þ¤»¤ó. ¡Ö¥¨¥ì¥á¥ó¥È(E)¡×¢ª¡Öʸ»ú¾ðÊó(I)¡×¤Ç¿·¤·¤¤Ì¾Á°¤ò¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹. ¥Õ¥©¥ó¥È¤ÎÀ¸À®¤ò³¤±¤Þ¤¹¤«(¤³¤Îʸ»ú¤ÏÈ´¤±Íî¤Á¤Þ¤¹)?"; +static char *str_EmSizeBad = "Èóɸ½à¤ÎÁ´³Ñ¥°¥ê¥Ã¥É"; +static char *str_PSEmSize1000 = "ÄÌÎã,PostScript¥Õ¥©¥ó¥È¤ÏÁ´³ÑÉý¤ò1000¥°¥ê¥Ã¥É¤ËÀßÄꤹ¤ë¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤¬,¤³¤Î¥Õ¥©¥ó¥È¤Ï%d¥°¥ê¥Ã¥É¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ï¥¨¥é¡¼¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬,Á´³Ñ¥°¥ê¥Ã¥É¤ò¡Ö¥¨¥ì¥á¥ó¥È(E)¡×¢ª¡Ö¥Õ¥©¥ó¥È¾ðÊó(I)¡×¢ª[PS°ìÈÌ]¥À¥¤¥¢¥í¥°¤ÇÊѹ¹¤¹¤ë¤³¤È¤ò¸¡Æ¤¤¹¤Ù¤­¤Ç¤·¤ç¤¦.\n¤½¤ì¤Ç¤â¥Õ¥©¥ó¥È¤ò¤³¤Î¤Þ¤Þ½ÐÎϤ·¤Þ¤¹¤«?"; +static char *str_TTFEmSize2 = "ÄÌÎã,PostScript¥Õ¥©¥ó¥È¤ÏÁ´³ÑÉý¤ò2¤ÎÀßÄê¤ËÀßÃÖ¤¹¤ë¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¤¬,¤³¤Î¥Õ¥©¥ó¥È¤Ï%d¥°¥ê¥Ã¥É¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ï¥¨¥é¡¼¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬,Á´³Ñ¥°¥ê¥Ã¥É¤ò¡Ö¥¨¥ì¥á¥ó¥È(E)¡×¢ª¡Ö¥Õ¥©¥ó¥È¾ðÊó(I)¡×¢ª[PS°ìÈÌ]¥À¥¤¥¢¥í¥°¤ÇÊѹ¹¤¹¤ë¤³¤È¤ò¸¡Æ¤¤¹¤Ù¤­¤Ç¤·¤ç¤¦.\n¤½¤ì¤Ç¤â¥Õ¥©¥ó¥È¤ò¤³¤Î¤Þ¤Þ½ÐÎϤ·¤Þ¤¹¤«?"; +static char *str_NotIntegral = "À°¿ô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char *str_TryRoundToInt = "¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ï¾¯¤Ê¤¯¤È¤â1¤ÄÈóÀ°¿ô¤ÎºÂɸ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹.\n¤³¤ì¤Ï»ÅÍ;åÁ´¤¯ÌäÂꤢ¤ê¤Þ¤»¤ó¤¬,ÉáÄ̤ǤϤ¢¤ê¤Þ¤»¤ó¤·\nÀ¸À®¤µ¤ì¤ë¥Õ¥©¥ó¥È¤Î¥µ¥¤¥º¤òÁý²Ã¤µ¤»¤Þ¤¹.\n¥Õ¥©¥ó¥ÈÁ´ÂΤËÂФ·¤Æ ¥¨¥ì¥á¥ó¥È(l)¢ªÀ°¿ôÃͤËÊÑ´¹(d) ¤ò\nŬÍѤ¹¤ë¤³¤È¤ò»î¤·¤Æ¤ß¤Æ¤Ï¤É¤¦¤Ç¤·¤ç¤¦¤«."; +static char *str_PostScript = "PostScript¡ï" +static char *str_TrueType = "TrueType" +static char *str_PSHintsPopup = "PostScript¤Î¥Ò¥ó¥È¾ðÊó¤ò´Þ¤à¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤«¤É¤¦¤«" +static char *str_HintSubs = "¥Ò¥ó¥ÈÃÖ´¹"; +static char *str_FlexHints = "Flex¥Ò¥ó¥È"; +static char *str_FlexHintsPopup = "PostScript¤Îflex¥Ò¥ó¥È¤ò´Þ¤à¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤«¤É¤¦¤«"; +static char *str_HintSubsPopup = "¥Ò¥ó¥ÈÃÖ´¹¤ò´Þ¤à¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë¤òºîÀ®¤¹¤ë¤«¤É¤¦¤«"; +static char *str_First256 = "ÀèƬ256»ú"; +static char *str_First256Popup = "ºÇ½é¤Î(ʸ»ú¥³¡¼¥É¤ò»ý¤Ä)256ʸ»ú¤Î¤ß¤¬\n¥Õ¥¡¥¤¥ë¤Ë´Þ¤Þ¤ì¤ë¤è¤¦¤ËÀ©¸Â¤·¤Þ¤¹"; +static char *str_PfaEditTable = "PfaEdit¥Æ¡¼¥Ö¥ë"; +static char *str_PfaEditTablePopup = "PfaEdit¥Æ¡¼¥Ö¥ë¤ÏTrueType¥Õ¥©¡¼¥Þ¥Ã¥È¤Î³ÈÄ¥¤Ç,\nFontForge¤¬ÍѤ¤¤ë¤µ¤Þ¤¶¤Þ¤Ê¥Ç¡¼¥¿¤ò´Þ¤ß¤Þ¤¹"; +static char *str_PfEdComments = "¥³¥á¥ó¥È¤òÊݸ"; +static char *str_PfEdCommentsPopup = "¥°¥ê¥Õ¤´¤È¤Î¥³¥á¥ó¥È¤ò PfEd ¥Æ¡¼¥Ö¥ë¤Ë³ÊǼ¤·¤Þ¤¹"; +static char *str_PfEdColors = "¿§¤òÊݸ"; +static char *str_PfEdColorsPopup = "¥°¥ê¥Õ¤Î¿§Ê¬¤±¤òPfEd¥Æ¡¼¥Ö¥ë¤Ë³ÊǼ¤·¤Þ¤¹" + /* Goto character ... */ +static char str_Badnumberin[] = "Bad Number in "; +static char str_Enternameofchar[] = "¥Õ¥©¥ó¥ÈÆâ¤Ç¤Îʸ»ú¤Î̾Á°¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"; +static char str_Couldntfindchar[] = "ʸ»ú¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %.70hs"; +static char str_CouldntfindcharU[] = "ʸ»ú¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó: %.70s"; +static char str_CouldntfindcharT[] = "ʸ»ú¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó"; +static char str_CouldntFindSubstitution = "ÃÖ¤­´¹¤¨Ê¸»ú%.40hs¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó." + /* Font has changed dlg */ +static char str_Dontsave[] = "Êݸ¤·¤Ê¤¤(D)"; +static unichar_t mnemonic_Dontsave[] = 'D'; +static char str_Fontchange[] = "¥Õ¥©¥ó¥È¤¬Êѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹."; +/* Font %.70s in file %.70s has been changed.\nDo you want to save it? */ +static char str_Fontchangepre[] = "¥Õ¥©¥ó¥È '"; +static char str_Fontchangemid[] = "' (¥Õ¥¡¥¤¥ë̾ '"; +static char str_Fontchangepost[] = "') ¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹.\012Êݸ¤·¤Þ¤¹¤«?"; +static char str_Fontchangerevertpost[] = " ¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹.\n¥Õ¥¡¥¤¥ë¤ò¸µ¤ËÌ᤹¤È¤¤¤¯¤Ä¤«¤ÎÊÔ½¸Áàºî¤Î·ë²Ì¤¬¼º¤ï¤ì¤Þ¤¹.\n¸µ¤ËÌᤷ¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; + /* General messages from fontview.c */ +static char str_Revert[] = "¸µ¤ËÌ᤹(R)"; +static unichar_t mnemonic_Revert[] = 'R'; +static char str_Manywin[] = "¥¦¥£¥ó¥É¥¦¤¬Â¿¤¹¤®¤Þ¤¹."; +static char str_Toomany[] = "¤³¤ì¤ò¹Ô¤¦¤È10¸Ä¤è¤ê¿¤¯¤Î¥¦¥£¥ó¥É¥¦¤¬³«¤«¤ì¤Þ¤¹.\nËÜÅö¤Ë¹Ô¤Ã¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char *str_MergeKernInfo = "¥«¡¼¥Ë¥ó¥°¾ðÊó¤ÎÊ»¹ç"; +static char *str_OpenPostscript = "PostScript¥Õ¥©¥ó¥È¤ò³«¤¯"; +static char *str_Loading = "Æɤ߹þ¤ßÃæ..."; +static char *str_LoadingFontFrom = "Æɤ߹þ¤ßÃæ¤Î¥Õ¥©¥ó¥È: "; +static char *str_ReadingGlyphs = "¥°¥ê¥Õ¤òÆɤ߹þ¤ßÃæ"; +static char *str_ReadingAFM = "AFM¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤ßÃæ"; +static char *str_InterpretingGlyphs = "»ú·Áµ­½Ò¤ò²òÀÏÃæ"; +static char *str_CouldntOpenFontTitle = "¥Õ¥©¥ó¥È¤ò³«¤¯¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó."; +static char *str_NoSuchFontFile = "»ØÄꤵ¤ì¤¿¥Õ¥¡¥¤¥ë %.100hs ¤Ï¸ºß¤·¤Þ¤»¤ó."; +static char *str_FontFileNotReadable = "%.100hs ¤ÎÆɤ߼è¤ê¸¢¸Â¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_CouldntParseFont = "%.100hs ¤Ï̤ÃΤΥե©¡¼¥Þ¥Ã¥È¤Ç¤¹(¤Þ¤¿¤ÏÆɤ߹þ¤á¤Ê¤¤¤Û¤É²õ¤ì¤Æ¤¤¤Þ¤¹)"; +static char *str_SaveFailed = "Êݸ¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char *str_Transforming = "ÊÑ·ÁÃæ..."; +static char *str_Simplifying = "ñ½ã²½¤Î½èÍýÃæ..."; +static char *str_AddingExtrema = "¶ËÃͤˤ¢¤ëÅÀ¤òÄɲÃÃæ..."; +static char *str_RemovingOverlap = "½Å¤Ê¤ê¤Î½üµîÃæ..."; +static char *str_CorrectingDirection = "¥Ñ¥¹¤Î¸þ¤­¤ò½¤ÀµÃæ..."; +static char *str_Stroking = "Àþ¤ÎÂÀ¤µ¤òÊѹ¹Ãæ..."; +static char *str_Rounding = "ºÂɸÃͤòÀ°¿ô¤ËÊÑ´¹Ãæ..."; +static char *str_Autotracing = "¼«Æ°¥È¥ì¡¼¥¹Ãæ..."; +static char *str_ClearDependent = "¾¤Îʸ»ú¤«¤é»²¾È¤µ¤ì¤Æ¤¤¤ëʸ»ú %.30hs ¤ò¾Ãµî¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹.\nËÜÅö¤Ë¾Ãµî¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char *str_UnlinkAll = "¥ê¥ó¥¯¤òÁ´¤Æ²ò½ü"; +static char *str_Unlink = "¥ê¥ó¥¯¤ò²ò½ü"; +static char *str_dPixelBitmap = "%d pixel bitmap"; +static char *str_ddPixelBitmap = "%d@%d pixel bitmap"; +static char *str_RestrictedRightsFont = "¤³¤Î¥Õ¥©¥ó¥È¤ÎFSType¤Ï2 (À©¸ÂÉÕ¤­\n¥é¥¤¥»¥ó¥¹)¤ËÀßÄꤵ¤ì¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ï, ¥Õ¥©¥ó¥È¤òÊÔ½¸¤¹¤ë¤Ë¤ÏˡŪ¤Ê¸¢Íø¤ò»ý¤Ä\n½êÍ­¼Ô¤ÎµöÂú¤òÆÀ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦°ÕÌ£¤Ç¤¹. ¤¢¤Ê¤¿¤ÏµöÂú¤ò¼õ¤±¤Æ¤¤¤Þ¤¹¤«?"; +static char *str_RestrictedFont = "ÊÔ½¸À©¸ÂÉÕ¤­¥Õ¥©¥ó¥È"; +static char *str_CloseFont = "¥Õ¥©¥ó¥È¤òÊĤ¸¤Æ¤¯¤À¤µ¤¤."; +static char *str_CloseFontForCID = "CID¥Õ¥©¥ó¥È¤Ë %hs ¤òÁÞÆþ¤¹¤ëÁ°¤Ë, ¤½¤ì¤òÊĤ¸¤Æ¤¯¤À¤µ¤¤."; +static char *str_CIDRemoveFontCheck = "ËÜÅö¤Ë, CID¥Õ¥©¥ó¥È%2$.40hs¤«¤é%1$.40hs¤ò\nºï½ü¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char *str_FlippedRef = "»²¾È¤¬Î¢ÊÖ¤·¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹."; +static char *str_FlippedRefUnlink = "%.50hs ¤Ë¤Ï΢ÊÖ¤·¤Ë¤Ê¤Ã¤¿»²¾È¤¬\n´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹.¤³¤ì¤Ï¤½¤Î¤Þ¤Þ¤Ç¤Ï\nÀµ¤·¤¯Ä¾¤»¤Þ¤»¤ó. ¤Þ¤º¥ê¥ó¥¯¤ò²ò½ü¤·¤Æ¤«¤é\n¸þ¤­¤òÊäÀµ¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char *str_Baseline = "¥Ù¡¼¥¹¥é¥¤¥ó"; +static char *str_Origin = "¸¶ÅÀ"; +static char *str_AdvanceWidthAsBar = "¥¢¥É¥Ð¥ó¥¹Éý¤ò¥Ð¡¼¤Çɽ¼¨"; +static char *str_AdvanceWidthAsLine = "¥¢¥É¥Ð¥ó¥¹Éý¤ò¶­³¦Àþ¤Çɽ¼¨"; +static char *str_AdvanceBarPopup = "¥¢¥É¥Ð¥ó¥¹Éý¤ò, »úÁ÷¤ê¤ÎÂ礭¤µ¤òɽ¤¹¥Ð¡¼¤Ç,\nʸ»ú¤Î²¼¤Ëɽ¼¨¤·¤Þ¤¹."; +static char *str_AdvanceLinePopup = "¥¢¥É¥Ð¥ó¥¹Éý¤ò, »úÁ÷¤êÊý¸þ¤Ëľ¸ò¤¹¤ë\nÀþ¤È¤·¤Æɽ¼¨¤·¤Þ¤¹." +static char *str_Suffix = "ÀÜÈø»Ò:"; +static char *str_SuffixToTag = "¥¿¥°¤Ø¤ÎÀÜÈø»Ò..."; + /* Messages from accented characters */ +static char str_Buildingaccented[] = "¥¢¥¯¥»¥ó¥Èʸ»ú¤Î¹½ÃÛÃæ"; +static char str_Replacearing[] = "ª©¤òÃÖ¤­´¹¤¨¤ë"; +static char str_Areyousurearing[] = "ª©¤òÃÖ¤­´¹¤¨¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?\n¥ê¥ó¥°¤ÏA¤ÈÀܳ¤·¤Ê¤¯¤Ê¤ê¤Þ¤¹."; +static char str_Yes[] = "¤Ï¤¤(Y)"; +static unichar_t mnemonic_Yes[] = 'Y'; +static char str_No[] = "¤¤¤¤¤¨(N)"; +static unichar_t mnemonic_No[] = 'N'; + /* Choices from bitmap editing */ +static char str_Rectangle[] = "ĹÊý·Á"; +static char str_FilledRectangle[] = "ĹÊý·Á(Åɤê¤Ä¤Ö¤·)"; +static char str_Elipse[] = "Âʱß"; +static char str_FilledElipse[] = "Âʱß(Åɤê¤Ä¤Ö¤·)"; + /* Get Info ... */ +static char str_Multiple[] = "Multiple"; +static char str_AlreadyCharUnicode[] = "´û¤Ë, Unicode¤ËÊÑ´¹¤·¤¿»þ¤Îʸ»ú¥³¡¼¥É¤¬¤³¤ÎÃÍ\n(ʸ»ú̾:%1$40hs,¸ÇÍ­¤Îʸ»ú¥³¡¼¥É:%2$d)\n¤Ë¤Ê¤ëʸ»ú¤¬¤¢¤ê¤Þ¤¹. ¤³¤Î¤Þ¤Þ³¤±¤Þ¤¹¤«?"; +static char str_Alreadycharnamed[] = "¤³¤Î̾Á°¤ò»ý¤Äʸ»ú¤¬´û¤Ë¤¢¤ê¤Þ¤¹.\n̾Á°¤ò¸ò´¹¤·¤Þ¤¹¤«?"; +static char str_AlreadyLigature[] = "¤³¤Î¹½À®Í×ÁǤ«¤é¤Ê¤ë¹ç»ú\n(̾Á°:%1$.40hs,¸ÇÍ­¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°:$2$.40hs)¤Ï,\n´û¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹. ¤³¤Î¤Þ¤Þ³¤±¤Þ¤¹¤«?"; +static char str_Badligature[] = "¹ç»ú¤ò¹½À®¤¹¤ëʸ»ú¤Ë¤½¤Îʸ»ú¼«¿È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Æ¤Ï¤¤¤±¤Þ¤»¤ó."; +/* "The component %.20s is not in this font,\nIs that what you want?" */ +static char str_MissingComponent[] = "¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ï\"%.20s\"¤È¤¤¤¦Ì¾Á°¤ÎÉôÉʤϤ¢¤ê¤Þ¤»¤ó.\n¤³¤Î̾Á°¤ÇËÜÅö¤Ë¤¤¤¤¤Ç¤¹¤«?"; +static char str_SelfReferential = "¤³¤ÎÃÖ´¹¤Ï¼«¸Ê»²¾È¤·¤Æ¤¤¤Þ¤¹"; +static char str_Done[] = "´°Î»(D)"; +static unichar_t mnemonic_Done[] = 'D'; +static char str_Ligpop[] = "¤â¤·¤³¤Îʸ»ú¤¬¹ç»ú¤Ç¤·¤¿¤é,\n¤³¤ì¤òʬ²ò¤·¤¿»þ¤Î³Æʸ»ú¤Î̾Á°¤ò\nÆþÎϤ·¤Æ¤¯¤À¤µ¤¤."; +static char *str_Show[] = "ɽ¼¨(S)"; +static unichar_t mnemonic_Show[] = 'S'; +static char *str_PointInfo = "ÅÀ¤Î¾ðÊó"; +static char *str_ImageInfo = "²èÁü¤Î¾ðÊó"; +static char *str_ReferenceInfo = "»²¾È¤Î¾ðÊó"; +static char *str_AnchorPointInfo = "¥¢¥ó¥«¡¼ÅÀ¤Î¾ðÊó"; +static char *str_Dependents = "°Í¸¸µ"; +static char *str_Offset = "¥ª¥Õ¥»¥Ã¥È"; +static char *str_BaseX = "´ð½à¤ÎX"; +static char *str_BaseY = "´ð½à¤ÎY"; +static char *str_NextCP = "¼¡¤ÎÀ©¸æÅÀ:"; +static char *str_NextCPX = "¼¡¤ÎÅÀ¤ÎX"; +static char *str_NextCPY = "¼¡¤ÎÅÀ¤ÎY"; +static char *str_PrevCP = "Á°¤ÎÀ©¸æÅÀ:"; +static char *str_PrevCPX = "Á°¤ÎÅÀ¤ÎX"; +static char *str_PrevCPY = "Á°¤ÎÅÀ¤ÎY"; +static char *str_UnicodeL = "Unicode"; +static char *str_LigatureL = "¹ç»ú"; +static char *str_Components = "¹½À®Í×ÁÇ"; +static char *str_AltPos = "Ê̤ΰÌÃÖ"; +static char *str_Pair = "¥Ú¥¢"; +static char *str_Subs = "ÃÖ´¹"; +static char *str_AltSubs = "Ê̤ÎÃÖ´¹"; +static char *str_MultSubs = "Ê£¿ô¤ÎÃÖ´¹Àè"; +static char *str_UnicodeName = "Unicode̾(N):"; +static char mnemonic_UnicodeName = 'N'; +static char *str_UnicodeValue = "UnicodeÃÍ(V):"; +static char mnemonic_UnicodeValue = 'V'; +static char *str_UnicodeChar = "Unicodeʸ»ú(h):"; +static char mnemonic_UnicodeChar = 'h'; +static char *str_SetFromName = "̾Á°¤Ç»ØÄê(a)"; +static char mnemonic_SetFromName = 'a'; +static char *str_SetFromValue = "ÃͤǻØÄê(u)"; +static char mnemonic_SetFromValue = 'u'; +static char *str_Ligature = "¹ç»ú(L):"; +static char mnemonic_Ligature = 'L'; +static char *str_AccentedComponents = "¥¢¥¯¥»¥ó¥Èʸ»ú¤Î¹½À®Í×ÁÇ:"; +static char *str_CompositComponents = "ʸ»ú¤Î¹½À®Í×ÁÇ:"; +static char *str_NoComponents = "¹½À®Í×ÁǤ¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_Color = "¿§:"; +static char *str_TransformedBy = "ŬÍѤ¹¤ëÊÑ·Á:"; +static char *str_NotUnicodeBMP = "·Ù¹ð: ¤³¤ÎÃͤÏUnicode¤ÎBMP¤ÎÈϰϳ°¤Ç¤¹.\n¤³¤ì¤Ç´Ö°ã¤¤¤¢¤ê¤Þ¤»¤ó¤«?"; +static char *str_PossiblyTooBig = "¤³¤ÎÃͤϤª¤½¤é¤¯Èϰϳ°¤Ç¤¹."; +static char *str_OutOfRange = "Èϰϳ°¤ÎÃͤǤ¹."; +static char *str_TransformationMatrix = "ÊÑ´¹¹ÔÎó"; +static char *str_TransformChanged = "ÊÑ´¹¹ÔÎó¤¬Êѹ¹¤µ¤ì¤Þ¤·¤¿."; +static char *str_TransformChangedApply = "ÊÑ´¹¹ÔÎó¤¬Êѹ¹¤µ¤ì¤Þ¤·¤¿. ¿·¤·¤¤¥Ð¡¼¥¸¥ç¥ó¤ò»È¤¤¤Þ¤¹¤«?"; +static char *str_TransformPopup = "¤³¤ÎÊÑ´¹¹ÔÎó¤Ï, ¸µ¤Îʸ»ú¤Ë´Þ¤Þ¤ì¤ëÀ©¸æÅÀ¤ò,\n¸½ºß¤Îʸ»ú¤ÎÃæ¤ÇÉÁ²è¤¹¤ëÁ°¤Ë¤É¤¦ÊÑ·Á¤¹¤ë¤«¤ò»ØÄꤷ¤Þ¤¹.\n x(new) = tm[1,1]*x + tm[2,1]*y + tm[3,1]\n y(new) = tm[1,2]*x + tm[2,2]*y + tm[3,2]"; +static char *str_MakeNewClass = "¥¢¥ó¥«¡¼¥¯¥é¥¹¤ò¿·¤·¤¯ºî¤Ã¤Æ¤¯¤À¤µ¤¤."; +static char *str_MakeNewAnchorClass = "¿·¤·¤¤ÅÀ¤ò³ä¤êÅö¤Æ¤ë¤¿¤á¤Î̤»ÈÍѤÎ\n¥¢¥ó¥«¡¼¥¯¥é¥¹¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿.\n¿·¤·¤¤¥¢¥ó¥«¡¼ÅÀ¤òºî¤ë¾ì¹ç,¡Ö¥¨¥ì¥á¥ó¥È(E)¡×¢ª\n¡Ö¥Õ¥©¥ó¥È¾ðÊó(I)¡×¤ÇÄêµÁ¤·¤Æ¤¯¤À¤µ¤¤."; +static char *str_Mark = "Mark"; +static char *str_BaseChar = "BaseChar"; +static char *str_BaseLig = "BaseLig"; +static char *str_BaseMark = "BaseMark"; +static char *str_CursiveEntry = "CursEntry"; +static char *str_CursiveExit = "CursExit"; +static char *str_LigIndex = "¹ç»ú¥¤¥ó¥Ç¥Ã¥¯¥¹:"; +static char *str_LastAnchor = "ºÇ¸å¤Î¥¢¥ó¥«¡¼ÅÀ"; +static char *str_RemoveLastAnchor = "¤³¤Îʸ»ú¤ÎºÇ¸å¤Î¥¢¥ó¥«¡¼ÅÀ¤òºï½ü¤·¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹.\nºï½ü¤¹¤ë¤È¤³¤Î¥À¥¤¥¢¥í¥°¤òÊĤ¸¤Þ¤¹¤¬, ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char *str_ClassUsed = "¥¯¥é¥¹¤¬´û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹." +static char *str_AnchorClassUsed ="¤³¤Î¥¢¥ó¥«¡¼¥¯¥é¥¹¤Ï,´û¤Ë¤³¤Îʸ»úÆâ¤ÎÅÀ¤Ë³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Þ¤¹."; +static char *str_BadClass = "ÉÔÀµ¤Ê¥¯¥é¥¹" +static char *str_AnchorClassCurs ="¥¢¥ó¥«¡¼ÅÀ¤ò'curs'¥¯¥é¥¹¤Ë̾¾ÎÊѹ¹¤·¤¿¤ê,'curs'¥¯¥é¥¹¤ÎÅÀ¤ò̾¾ÎÊѹ¹¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó."; +static char *str_XC = "X:"; +static char mnemonic_XC = 'X'; +static char *str_YC = "Y:"; +static char mnemonic_YC = 'Y'; +static char *str_IndexInUse = "¥¤¥ó¥Ç¥Ã¥¯¥¹¤¬»ÈÍÑÃæ¤Ç¤¹."; +static char *str_LigIndexInUse = "¤³¤Î¹ç»ú¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ï´û¤Ë»ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹."; +static char *str_OutOfOrder = "½ç½ø¤¬°ã¤¤¤Þ¤¹."; +static char *str_IndexOutOfOrder = "¹ç»ú¤Ë´Þ¤Þ¤ì¤ëÊ£¿ô¤Î¥Þ¡¼¥¯¤ÏÉ®µ­Êý¸þ¤Ëʤó¤Ç¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó. ¤³¤ì¤È%d¤Ï½ç½ø¤¬µÕ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹."; +static char *str_TooBig = "Â礭¤¹¤®¤Þ¤¹."; +static char *str_IndexTooBig = "¤³¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ï,Î٤κǤâ¶á¤¤ÃͤÈÈæ¤Ù¤ÆÂ礭¤¹¤®¤Þ¤¹."; +static char *str_BadPOSSUB = "ÉÔÀµ¤ÊGPOS/GSUB"; +static char *str_BadPOSSUBPaste = "ʸ»úÎó¤Ï4ʸ»ú¤Î·¿¥Õ¥£¡¼¥ë¥É¤Ç»Ï¤Þ¤ê,1¸Ä¤Î¥¹¥Ú¡¼¥¹¤¬Â³¤­,¤½¤Î¸å¤í¤Ë¾ðÊ󤬴ޤޤì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char *str_ExpectedEquals = "°ÌÃ֥ǡ¼¥¿¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤¬ÉÔÀµ¤Ç¤¹. ¥Ç¡¼¥¿¤Ë¤Ï4¸Ä¤Î'='ʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤Ï¤º¤Ç¤¹"; +static char *str_SimpleSubsOneComponent = "ñ½ãÃÖ´¹¤Ï¤Á¤ç¤¦¤É1¸Ä¤Î¹½À®Í×ÁǤò´Þ¤ó¤Ç¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char *str_NewPosition = "¿·¤·¤¤°ÌÃÖ¤ÎÊѼï"; +static char *str_NewPair = "¿·¤·¤¤¥Ú¥¢¤Î°ÌÃÖ»ØÄê"; +static char *str_NewSubstitution = "¿·¤·¤¤ÃÖ´¹¤ÎÊѼï"; +static char *str_NewAlternate = "¿·¤·¤¤ÂåÂإꥹ¥È"; +static char *str_NewMultiple = "¿·¤·¤¤Ê£¿ô¥ê¥¹¥È"; +static char *str_NewLigature = "¿·¤·¤¤¹ç»ú"; +static char *str_EditPosition = "°ÌÃÖ¤ÎÊѼï¤òÊÔ½¸"; +static char *str_EditPair = "¥Ú¥¢¤Î°ÌÃÖ»ØÄê¤òÊÔ½¸"; +static char *str_EditSubstitution = "ÃÖ´¹¤ÎÊѼï¤òÊÔ½¸"; +static char *str_EditAlternate = "ÂåÂإꥹ¥È¤òÊÔ½¸"; +static char *str_EditMultiple = "Ê£¿ô¥ê¥¹¥È¤òÊÔ½¸"; +static char *str_EditLigature = "¹ç»ú¤òÊÔ½¸"; +static char *str_DuplicateTag = "¥¿¥°¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹."; +static unichar_t *str_Dx = { 0x2206, 'X', ':' }; +static unichar_t *str_Dy = { 0x2206, 'Y', ':' }; +static unichar_t *str_Dxa = { 0x2206, 'X','A','d','v','a','n','c','e', ':' }; +static unichar_t *str_Dya = { 0x2206, 'Y','A','d','v','a','n','c','e', ':' }; +static char *str_TooManyComponents = "Í×ÁǤ¬Â¿¤¹¤®¤Þ¤¹"; +static char *str_SubsOnlyOne = "ñ½ãÃÖ´¹¤ÏÍ×ÁǤò1¸Ä¤·¤«¤È¤ì¤Þ¤»¤ó¤¬,Ê£¿ô»ØÄꤵ¤ì¤Æ¤¤¤Þ¤¹"; +static char *str_Itself = "¤½¤ì¼«¿È"; +static char *str_PairedChar = "¥Ú¥¢¤Ë¤Ê¤ëʸ»ú:"; +static char *str_MissingPaired = "¥Ú¥¢¤Ë¤Ê¤ëʸ»ú¤¬¤¢¤ê¤Þ¤»¤ó"; +static char *str_NeedPaired = "¥Ú¥¢¤Ë¤Ê¤ëʸ»ú¤ò¼±Ê̤¹¤ë̾Á°¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char *str_PairedNotInFont = "¥Ú¥¢¤Ë¤Ê¤ëʸ»ú¤Î̾Á° (%.50hs) ¤Ï,¥Õ¥©¥ó¥ÈÆâ¤Îʸ»ú¤È°ìÃפ·¤Þ¤»¤ó. ËÜÅö¤Ë¤³¤ì¤Ç¤¤¤¤¤Ç¤¹¤«?"; + /* Ligature feature tags */ +static char str_RequiredLig = "ɬ¿Ü¤Î¹ç»ú"; +static char str_StandardLig = "ɸ½à¤Î¹ç»ú"; +static char str_DiscretionaryLig = "Ǥ°Õ»ÈÍѤιç»ú"; +static char str_AncientLig = "¸ÅÂå¤Î¹ç»ú" +static char str_HistoricLig = "Îò»ËŪ¹ç»ú"; +static char str_FractionLig = "¼Ð¤á¤Îʬ¿ô"; +static char str_AboveBaseSubs = "¥Ù¡¼¥¹¥é¥¤¥ó¾åÊý¤ÎÃÖ´¹"; +static char str_AltFrac = "½Ä·¿¤Îʬ¿ô"; +static char str_Akhand = "Akhand"; +static char str_BelowBaseForms = "¥Ù¡¼¥¹¥é¥¤¥ó²¼Êý¤Î»ú·Á"; +static char str_BelowBaseSubs = "¥Ù¡¼¥¹¥é¥¤¥ó²¼Êý¤ÎÃÖ´¹"; +static char str_GlyphCompDecomp = "¥°¥ê¥Õ¹çÀ®/ʬ²ò"; +static char str_HalfForm = "Half Forms" +static char str_HalantForm = "Halant Forms" +static char str_LeadingJamo = "¥Ï¥ó¥°¥ë»úÊì½éÀ¼·Á" +static char str_TrailingJamo = "¥Ï¥ó¥°¥ë»úÊ콪À¼·Á" +static char str_VowelJamo = "¥Ï¥ó¥°¥ë»úÊìÊì²»·Á" +static char str_Nukta = "Nukta Forms" +static char str_PreBaseForms = "´ðÄìʸ»ú¤ËÁ°ÃÖ¤¹¤ë»ú·Á" +static char str_PreBaseSubs = "Á°ÃÖ·Á¤Ø¤ÎÃÖ´¹" +static char str_PostBaseForms = "´ðÄìʸ»ú¤Ë¸åÃÖ¤¹¤ë»ú·Á" +static char str_PostBaseSubs = "¸åÃÖ·Á¤Ø¤ÎÃÖ´¹" +static char str_Reph = "Reph Form" +static char str_VattuVariants = "Vattu Variants" +static char str_MacLogos = "¥í¥´(Mac¤Î¤ß)" +static char str_MacRebus = "Ƚ¤¸³¨(Mac¤Î¤ß)" +static char str_MacDiphthongLig = "Æó½ÅÊì²»¹ç»ú(Mac¤Î¤ß)" +static char str_MacSquareLig = "Square Ligature (Mac¤Î¤ß)" +static char str_MacAbbrevSquareLig = "Abbreviated Square Ligatures (Mac Only)" +static char str_MacUnicodeDecomposition = "Unicodeʬ²ò(Mac¤Î¤ß)" + /* simple positioning feature tags */ +static char str_CaseSensForms = "Âçʸ»úÁȤßÍѤËÄ´À°¤·¤¿»ú·Á"; +static char str_CapitalSpacing = "Âçʸ»úÁȤßÍÑ¥¹¥Ú¡¼¥·¥ó¥°"; +static char str_AltHalfWidths = "Ê̤ÎȾ³Ñ·Á"; +static char str_LeftBounds = "º¸¤Î¶­³¦"; +static char str_OpticalBounds = "»ë³ÑŪ¶­³¦"; +static char str_PropAltMet = "¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ëÂåÂØ¥á¥È¥ê¥Ã¥¯"; +static char str_QuartWidths = "»Íʬ³Ñ"; +static char str_RightBounds = "±¦¤Î¶­³¦"; +static char str_ThirdWidths = "Éý¤Î1/3¤Î°ÌÃÖ"; +static char str_AltVertMet = "Ê̤νĽñ¤­ÍÑ¥á¥È¥ê¥Ã¥¯"; +static char str_AltVertHalfMet = "Ê̤νĽñ¤­ÍÑȾ³Ñ¥á¥È¥ê¥Ã¥¯"; +static char str_AltVertPropMet = "¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ë¤ÊÊ̤νĽñ¤­¥á¥È¥ê¥Ã¥¯"; +static char str_ItalicCorrection = "¥¤¥¿¥ê¥Ã¥¯ÊäÀµ"; + /* pair positioning feature tags */ +static char str_Distance = "µ÷Î¥"; +static char str_HorizontalKerning = "²£½ñ¤­¥«¡¼¥Ë¥ó¥°"; +static char str_VerticalKerning = "½Ä½ñ¤­¥«¡¼¥Ë¥ó¥°"; + /* simple substitution feature tags */ +static char str_AllAlt = "Á´¤Æ¤Î°ÛÂλú¤Ø¤Î¥¢¥¯¥»¥¹"; +static char str_AboveBaseForms = "¥Ù¡¼¥¹¥é¥¤¥ó¾åÊý·Á"; +static char str_Cap2PetiteCaps = "Âçʸ»ú¤«¤éĶ¾®·¿Âçʸ»ú¤Ø"; +static char str_Cap2SmallCaps = "Âçʸ»ú¤«¤é¾®·¿Âçʸ»ú¤Ø"; +static char str_Denominators = "ʬÊì"; +static char str_ExpertForms = "¥¨¥­¥¹¥Ñ¡¼¥È»ú·Á"; +static char str_TerminalForms = "¸ìÈø·Á"; +static char str_FullWidths = "Á´³Ñ"; +static char str_HistoricalForms = "Îò»ËŪ»úÂÎ"; +static char str_HorKanaAlt = "²£½ñ¤­ÍѲ¾Ì¾"; +static char str_Hanja2Hangul = "´Á»ú¤«¤é¥Ï¥ó¥°¥ë¤Ø" +static char str_HalfWidths = "Ⱦ³ÑÉý"; +static char str_InitialForms = "¸ìƬ·Á"; +static char str_IsolatedForms = "ÆÈΩ·Á"; +static char str_Italics = "¥¤¥¿¥ê¥Ã¥¯"; +static char str_JIS78Forms = "78JIS»úÂÎ"; +static char str_JIS83Forms = "83JIS»úÂÎ"; +static char str_JIS90Forms = "90JIS»úÂÎ"; +static char str_LiningFigures = "¥é¥¤¥Ë¥ó¥°¿ô»ú"; +static char str_LocalizedForms = "¹ñ¡¦ÃÏ°è¸ÇÍ­¤Î»ú·Á"; +static char str_MedialForms = "¸ìÃæ·Á"; +static char str_MathematicalGreek = "¿ô¼°¥®¥ê¥·¥ãʸ»ú"; +static char str_AltAnnotForms = "Ãí¼áÍÑÊÌ»ú·Á"; +static char str_Numerators = "ʬ»Ò"; +static char str_OldstyleFigures = "¥ª¡¼¥ë¥É¥¹¥¿¥¤¥ë¿ô»ú"; +static char str_Ornaments = "²Ö·Á"; +static char str_PetiteCaps = "¾®Ê¸»ú¤«¤éĶ¾®·¿Âçʸ»ú¤Ø"; +static char str_PropNumbers = "¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ë¿ô»ú"; +static char str_PropWidth = "¥×¥í¥Ý¡¼¥·¥ç¥Ê¥ëÉý"; +static char str_R2LAlt = "±¦½ñ¤­ÍÑ°ÛÂÎ"; +static char str_RubyNoteForms = "¥ë¥ÓÍѲ¾Ì¾Îà"; +static char str_StylisticAlt = "¿³ÈþŪÊÌ»ú·Á"; +static char str_ScientificInf = "²Ê³Øʸ¸¥ÍѲ¼¤Ä¤­Ê¸»ú"; +static char str_SmallCaps = "¾®Ê¸»ú¤«¤é¾®·¿Âçʸ»ú¤Ø"; +static char str_SimplifiedForms = "ά»úÂÎ"; +static char str_StyleSet1 = "¥¹¥¿¥¤¥ë¥»¥Ã¥È1"; +static char str_StyleSet2 = "¥¹¥¿¥¤¥ë¥»¥Ã¥È2"; +static char str_StyleSet3 = "¥¹¥¿¥¤¥ë¥»¥Ã¥È3"; +static char str_StyleSet4 = "¥¹¥¿¥¤¥ë¥»¥Ã¥È4"; +static char str_StyleSet5 = "¥¹¥¿¥¤¥ë¥»¥Ã¥È5"; +static char str_Subscript = "²¼¤Ä¤­Ê¸»ú"; +static char str_Superscript = "¾å¤Ä¤­Ê¸»ú"; +static char str_Swash = "¥¹¥ï¥Ã¥·¥å»ú·Á"; +static char str_Titling = "¥¿¥¤¥È¥ëÍÑ»ú·Á"; +static char str_TraditionalNameForms = "¿Í̾´Á»úɽµöÍÆ»úÂÎ"; +static char str_TabNumb = "ɽÍÑ¿ô»ú"; +static char str_TeXCharList = "TeXʸ»ú¥ê¥¹¥È"; +static char str_TeXExtensionList = "TeX³ÈÄ¥¥ê¥¹¥È"; +static char str_TraditionalForms = "µì»úÂÎ"; +static char str_Unicase = "Â羮ʸ»úº®ºß·Á"; +static char str_VerticalRot = "½Ä½ñ¤­»ú·Á¡ÚÇѻߡÛ"; +static char str_VertRotAlt = "½Ä½ñ¤­»ú·Á¤È²óžºÑ¤ßʸ»ú"; +static char str_VertKana = "½Ä½ñ¤­ÍѲ¾Ì¾"; +static char str_SlashedZero = "¥¹¥é¥Ã¥·¥å¤Ä¤­¥¼¥í"; +static char str_MacWordInitialSwash = "¸ìƬ¥¹¥ï¥Ã¥·¥å»ú·Á(Mac¤Î¤ß)"; +static char str_MacWordFinalSwash = "¸ìÈø¥¹¥ï¥Ã¥·¥å»ú·Á(Mac¤Î¤ß)"; +static char str_MacLineInitialSwash = "¹ÔƬ¥¹¥ï¥Ã¥·¥å»ú·Á(Mac¤Î¤ß)"; +static char str_MacLineFinalSwash = "¹ÔËö¥¹¥ï¥Ã¥·¥å»ú·Á(Mac¤Î¤ß)"; +static char str_MacNonFinalSwash = "¹ÔËö°Ê³°¤Î¥¹¥ï¥Ã¥·¥å»ú·Á(Mac¤Î¤ß)" +static char str_MacMonospaceWidth = "¸ÇÄêÉý(Mac¤Î¤ß)" + /* (multiple) alternate substitution feature tags */ +static char str_FinalGlyphLine = "¹ÔËö»ú·Á"; +static char str_JustificationAlt = "¹Ô·¤¨ÍÑ°ÛÂÎ"; +static char str_Randomize = "¥é¥ó¥À¥à²½"; + /* contextual substitution feature tags */ +static char str_TerminalForms2 = "¸ìÈø·Á2"; +static char str_TerminalForms3 = "¸ìÈø·Á3"; +static char str_MedialForms2 = "¸ìÃæ·Á2"; +static char str_MarkPosViaSubs = "ÃÖ´¹¤Ë¤è¤ë¥Þ¡¼¥¯°ÌÃÖ»ØÄê"; + /* contextual substitution chaining feature tags */ +static char str_ContextAltern = "ʸ̮°Í¸¤Î°ÛÂλú"; +static char str_Ordinals = "½ø¿ô"; + /* reverse contextual substitution chaining feature tags */ +static char str_ContextLig = "ʸ̮°Í¸¤Î¹ç»ú"; +static char str_ContextSwash = "ʸ̮°Í¸¤Î¥¹¥ï¥Ã¥·¥å"; + /* Script tags */ +static char str_arab = "¥¢¥é¥Ó¥¢Ê¸»ú"; +static char str_Aramaic = "¥¢¥é¥àʸ»ú"; +static char str_armn = "¥¢¥ë¥á¥Ë¥¢Ê¸»ú"; +static char str_Avestan = "¥¢¥ô¥§¥¹¥¿Ê¸»ú"; +static char str_Batak = "¥Ð¥¿¥¯Ê¸»ú"; +static char str_beng = "¥Ù¥ó¥¬¥ëʸ»ú"; +static char str_Bliss = "¥Ö¥ê¥¹É½°Õµ­¹æ"; +static char str_bopo = "Ãí²»»úÊì"; +static char str_Brahmi = "¥Ö¥é¡¼¥Õ¥ß¡¼Ê¸»ú"; +static char str_brai = "ÅÀ»ú¿Þ·Á"; +static char str_Buginese = "¥Ö¥®Ê¸»ú"; +static char str_Buhid = "¥Ö¥Ò¥Ã¥Éʸ»ú"; +static char str_byzm = "¥Ó¥¶¥ó¥Á¥ó²»³Úµ­¹æ"; +static char str_cans = "Åý¹ç¥«¥Ê¥ÀÀ轻̱²»Àá"; +static char str_Cham = "¥Á¥ã¥àʸ»ú"; +static char str_cher = "¥Á¥§¥í¥­¡¼Ê¸»ú"; +static char str_Cirth = "¥­¥¢¥¹'ʸ»ú'"; +static char str_CyproMinoan = "¥­¥å¥×¥í¡¦¥ß¥Î¥¢Ê¸»ú"; +static char str_CypriotSyl = "¥­¥å¥×¥í¥¹²»Àáʸ»ú"; +static char str_hani = "CJKÅý¹ç´Á»ú"; +static char str_cyrl = "¥­¥ê¥ëʸ»ú"; +static char str_DFLT = "¥Ç¥Õ¥©¥ë¥È"; +static char str_Deseret = "¥Ç¥¼¥ì¥È(¥â¥ë¥â¥ó)ʸ»ú"; +static char str_deva = "¥Ç¡¼¥ô¥¡¥Ê¡¼¥¬¥ê¡¼Ê¸»ú"; +static char str_EgyptianDemotic = "¥¨¥¸¥×¥È̱½°Ê¸»ú"; +static char str_EgyptianHieratic = "¥¨¥¸¥×¥È¿À´±Ê¸»ú"; +static char str_EgyptianHieroglyphs = "¥Ò¥¨¥í¥°¥ê¥Õ"; +static char str_ethi = "¥¨¥Á¥ª¥Ô¥¢Ê¸»ú"; +static char str_geor = "¥°¥ë¥¸¥¢Ê¸»ú"; +static char str_Glagolitic = "¥°¥é¥´¥ëʸ»ú"; +static char str_Gothic = "¥´¡¼¥Èʸ»ú"; +static char str_grek = "¥®¥ê¥·¥¢Ê¸»ú"; +static char str_gujr = "¥°¥¸¥ã¥é¡¼¥Æ¥£Ê¸»ú"; +static char str_guru = "¥°¥ë¥à¥­¡¼Ê¸»ú"; +static char str_jamo = "¥Ï¥ó¥°¥ë»úÊì"; +static char str_hang = "¥Ï¥ó¥°¥ë²»Àáʸ»ú"; +static char str_Hanunoo = "¥Ï¥Ì¥Î¡¼Ê¸»ú"; +static char str_hebr = "¥Ø¥Ö¥é¥¤Ê¸»ú"; +static char str_HmongPahawh = "Hmong Pahawhʸ»ú"; +static char str_Indus = "(¥Ï¥é¥Ã¥Ñ¡¼)¥¤¥ó¥À¥¹Ê¸»ú"; +static char str_OldItalic = "¥¤¥¿¥ê¥¢¸ÅÂå(¥¨¥È¥ë¥ê¥¢,¥ª¥¹¥¯Åù)ʸ»ú"; +static char str_Javanese = "¥¸¥ã¥ïʸ»ú"; +static char str_KayahLi = "Kayah Liʸ»ú"; +static char str_Kharosthi = "¥«¥í¡¼¥·¥å¥Æ¥£¡¼Ê¸»ú"; +static char str_kana = "Ê¿²¾Ì¾¤ÈÊÒ²¾Ì¾"; +static char str_knda = "¥«¥ó¥Ê¥Àʸ»ú"; +static char str_khmr = "¥¯¥á¡¼¥ëʸ»ú"; +static char str_lao = "¥é¥ªÊ¸»ú"; +static char str_latn = "¥é¥Æ¥óʸ»ú"; +static char str_mlym = "¥Þ¥é¥ä¡¼¥é¥àʸ»ú"; +static char str_Lepcha = "¥ì¥×¥Á¥ãʸ»ú"; +static char str_Limbu = "¥ê¥ó¥Öʸ»ú"; +static char str_LinearA = "Àþʸ»úA"; +static char str_LinearB = "Àþʸ»úB"; +static char str_Mandaean = "¥Þ¥ó¥Àʸ»ú"; +static char str_Mayan = "¥Þ¥ä¿ÀÀ»Ê¸»ú"; +static char str_Meroitic = "¥á¥í¥¨Ê¸»ú"; +static char str_mong = "¥â¥ó¥´¥ëʸ»ú"; +static char str_mymr = "¥ß¥ã¥ó¥Þ¡¼Ê¸»ú"; +static char str_ogam = "¥ª¥¬¥àʸ»ú"; +static char str_orya = "¥ª¥ê¥äʸ»ú"; +static char str_Osmanya = "¥ª¥¹¥Þ¥Ë¥ãʸ»ú"; +static char str_Pahlavi = "¥Ñ¥Õ¥é¥ô¥£Ê¸»ú"; +static char str_Permic = "¸ÅÂå¥Ú¥ë¥àʸ»ú"; +static char str_Phoenician = "¥Õ¥§¥Ë¥­¥¢Ê¸»ú"; +static char str_Phaistos = "¥Õ¥¡¥¤¥¹¥È¥¹(±ßÈ×)ʸ»ú"; +static char str_Pollard = "¥Ý¥é¡¼¥É²»Àáʸ»ú"; +static char str_Rongorongo = "¥í¥ó¥´¥í¥ó¥´Ê¸»ú"; +static char str_runr = "¥ë¡¼¥óʸ»ú"; +static char str_Shavian = "¥·¥ã¥Ðʸ»ú"; +static char str_sinh = "¥·¥ó¥Ï¥éʸ»ú"; +static char str_syrc = "¥·¥ê¥¢Ê¸»ú"; +static char str_Tagbanwa = "¥¿¥°¥Ð¥ó¥ïʸ»ú"; +static char str_TaiLe = "¥¿¥¤¡¦¥íʸ»ú"; +static char str_taml = "¥¿¥ß¥ëʸ»ú"; +static char str_telu = "¥Æ¥ë¥°Ê¸»ú"; +static char str_Tengwar = "¥Æ¥ó¥°¥ï¡¼¥ë'ʸ»ú'"; +static char str_Tifinagh = "¥Æ¥£¥Õ¥£¥Ê¥°(¥Ù¥ë¥Ù¥ë)ʸ»ú"; +static char str_Tagalog = "¥¿¥¬¥í¥°Ê¸»ú"; +static char str_thaa = "¥¿¡¼¥Êʸ»ú"; +static char str_thai = "¥¿¥¤Ê¸»ú"; +static char str_tibt = "¥Á¥Ù¥Ã¥Èʸ»ú"; +static char str_Ugaritic = "¥¦¥¬¥ê¥Èʸ»ú"; +static char str_Vai = "¥ô¥¡¥¤Ê¸»ú"; +static char str_VisibleSpeech = "»ëÏÃË¡"; +static char str_CuneiformOP = "¸ÅÂå¥Ú¥ë¥·¥ãܸ·Áʸ»ú"; +static char str_CuneiformSA = "¥·¥å¥á¡¼¥ë¡¦¥¢¥Ã¥«¥Éܸ·Áʸ»ú"; +static char str_CuneiformUg = "¥¦¥¬¥ê¥Èܸ·Áʸ»ú"; +static char str_yi = "׳ʸ»ú"; +static char str_PrivateUseScript1 = "»äÍѤÎÍÑ»ú·Ï1"; +static char str_PrivateUseScript2 = "»äÍѤÎÍÑ»ú·Ï2"; +static char str_UndeterminedScript = "ÉÔÌÀ¤ÊÍÑ»ú·Ï"; +static char str_UncodedScript = "¥³¡¼¥É¤Î¤Ê¤¤ÍÑ»ú·Ï"; + /* Language tags */ +static char str_OTFAbaza = "¥¢¥Ð¥¶¸ì"; +static char str_OTFAbkhazian = "¥¢¥Ö¥Ï¥º¸ì"; +static char str_OTFAdyghe = "¥¢¥Ç¥£¥²¸ì"; +static char str_OTFAfrikaans = "¥¢¥Õ¥ê¥«¡¼¥ó¥¹¸ì"; +static char str_OTFAfar = "¥¢¥Õ¥¡¥ë¸ì"; +static char str_OTFAgaw = "¥¢¥¬¥¦½ï¸ì"; +static char str_OTFAltai = "¥¢¥ë¥¿¥¤¸ì"; +static char str_OTFAmharic = "¥¢¥à¥Ï¥é¸ì"; +static char str_OTFArabic = "¥¢¥é¥Ó¥¢¸ì"; +static char str_OTFAari = "¥¢¥ê¸ì"; +static char str_OTFArakanese = "(¥Ó¥ë¥Þ¸ì)¥¢¥é¥«¥óÊý¸À"; +static char str_OTFAssamese = "¥¢¥Ã¥µ¥à¸ì"; +static char str_OTFAthapaskan = "¥¢¥µ¥Ñ¥¹¥«¸ì²"; +static char str_OTFAvar = "¥¢¥Ð¡¼¥ë¸ì"; +static char str_OTFAwadhi = "¥¢¥ï¥Ç¥£¡¼¸ì"; +static char str_OTFAymara = "¥¢¥¤¥Þ¥é¸ì"; +static char str_OTFAzeri = "¥¢¥¼¥ë¥Ð¥¤¥¸¥ã¥ó¸ì"; +static char str_OTFBadaga = "¥Ð¥À¥¬¸ì"; +static char str_OTFBaghelkhandi = "¥Ð¥²¡¼¥ê¡¼¸ì"; +static char str_OTFBalkar = "¥Ð¥ë¥«¥ë¸ì"; +static char str_OTFBaule = "¥Ð¥¦¥ì¸ì"; +static char str_OTFBerber = "¥Ù¥ë¥Ù¥ë¸ìÇÉ"; +static char str_OTFBench = "¥Ù¥ó¥Á¥å¸ì"; +static char str_OTFBibleCree = "À»½ñ¥¯¥ê¡¼¸ì"; +static char str_OTFBelarussian = "¥Ù¥é¥ë¡¼¥·¸ì"; +static char str_OTFBemba = "¥Ù¥ó¥Ð¸ì"; +static char str_OTFBengali = "¥Ù¥ó¥¬¥ë¸ì"; +static char str_OTFBulgarian = "¥Ö¥ë¥¬¥ê¥¢¸ì"; +static char str_OTFBhili = "¥Ó¡¼¥ê¡¼¸ì"; +static char str_OTFBhojpuri = "¥Ü¡¼¥¸¥å¥×¥ê¡¼¸ì"; +static char str_OTFBikol = "¥Ó¥³¥ë¸ì"; +static char str_OTFBilen = "¥Ó¥ê¥ó¸ì"; +static char str_OTFBlackfoot = "¥Ö¥é¥Ã¥¯¥Õ¥Ã¥È¸ì"; +static char str_OTFBalochi = "¥Ð¥ë¡¼¥Á¡¼¸ì"; +static char str_OTFBalante = "¥Ð¥é¥ó¥¿¸ì"; +static char str_OTFBalti = "¥Ð¥ë¥Æ¥£¸ì"; +static char str_OTFBambara = "¥Ð¥ó¥Ð¥é¸ì"; +static char str_OTFBamileke = "¥Ð¥ß¥ì¥±¸ì"; +static char str_OTFBreton = "¥Ö¥ë¥È¥ó¸ì"; +static char str_OTFBrahui = "¥Ö¥é¡¼¥Õ¡¼¥¤¡¼¸ì"; +static char str_OTFBrajBhasha = "¥Ö¥é¥¸¥å¡¦¥Ð¡¼¥·¥ã¡¼¸ì"; +static char str_OTFBurmese = "¥Ó¥ë¥Þ¸ì"; +static char str_OTFBashkir = "¥Ð¥·¥å¥­¡¼¥ë¸ì"; +static char str_OTFBeti = "¥Ù¥Æ¸ì"; +static char str_OTFCatalan = "¥«¥¿¥ë¡¼¥Ë¥ã¸ì"; +static char str_OTFCebuano = "¥»¥Ö¥¢¥Î¸ì"; +static char str_OTFChechen = "¥Á¥§¥Á¥§¥ó¸ì"; +static char str_OTFChahaGurage = "¥Á¥ã¥Ï¡¦¥°¥é¥²¸ì"; +static char str_OTFChattisgarhi = "¥Á¥ã¥Ã¥Æ¥£¡¼¥¹¥¬¥ê¡¼¸ì"; +static char str_OTFChichewa = "¥Á¥§¥ï¸ì"; +static char str_OTFChukchi = "¥Á¥å¥¯¥Á¸ì"; +static char str_OTFChipewyan = "¥Á¥Ú¥ï¥¤¥¢¥ó¸ì"; +static char str_OTFCherokee = "¥Á¥§¥í¥­¡¼¸ì"; +static char str_OTFChuvash = "¥Á¥å¥Ð¥·¥å¸ì"; +static char str_OTFComorian = "¥³¥â¥í¸ì"; +static char str_OTFCoptic = "¥³¥×¥È¸ì"; +static char str_OTFCree = "¥¯¥ê¡¼¸ì"; +static char str_OTFCarrier = "¥«¥ê¥¢¡¼¸ì"; +static char str_OTFCrimeanTatar = "¥¯¥ê¥ß¥¢¡¦¥¿¥¿¡¼¥ë¸ì"; +static char str_OTFChurchSlavonic = "¸ÅÂ嶵²ñ¥¹¥é¥Ö¸ì"; +static char str_OTFCzech = "¥Á¥§¥³¸ì"; +static char str_OTFDanish = "¥Ç¥ó¥Þ¡¼¥¯¸ì"; +static char str_OTFDargwa = "¥À¥ë¥¬¥ó¸ì"; +static char str_OTFWoodsCree = "¿¹¥¯¥ê¡¼¸ì"; +static char str_OTFGermanStandard = "(ɸ½à)¥É¥¤¥Ä¸ì"; +static char str_OTFDogri = "¥É¥°¥é¸ì"; +static char str_OTFDhivehi = "¥Ç¥£¥Ù¥Ò¸ì"; +static char str_OTFDjerma = "¥¶¥ë¥Þ¸ì"; +static char str_OTFDangme = "¥À¥ó¥°¥á¸ì"; +static char str_OTFDinka = "¥Ç¥£¥ó¥«¸ì"; +static char str_OTFDungan = "¥É¥¥¥ó¥®¸ì"; +static char str_OTFDzongkha = "¥¾¥ó¥«¸ì"; +static char str_OTFEbira = "¥¨¥Ó¥é¸ì"; +static char str_OTFEasternCree = "Å쥯¥ê¡¼¸ì"; +static char str_OTFEdo = "¥¨¥É¸ì"; +static char str_OTFEfik = "¥¨¥Õ¥£¥Ã¥¯¸ì"; +static char str_OTFGreek = "¥®¥ê¥·¥ã¸ì"; +static char str_OTFEnglish = "±Ñ¸ì"; +static char str_OTFErzya = "¥¨¥ë¥¸¥ã¸ì"; +static char str_OTFSpanish = "¥¹¥Ú¥¤¥ó¸ì"; +static char str_OTFEstonian = "¥¨¥¹¥È¥Ë¥¢¸ì"; +static char str_OTFBasque = "¥Ð¥¹¥¯¸ì"; +static char str_OTFEvenki = "¥¨¥Ù¥ó¥­¸ì"; +static char str_OTFEven = "¥¨¥Ù¸ì"; +static char str_OTFEwe = "¥¨¥¦¥§¸ì"; +static char str_OTFFrenchAntillean = "Ê©ÎÎ¥¢¥ó¥Á¥ë½ôÅç¸ì"; +static char str_OTFFarsi = "¥Ú¥ë¥·¥ã¸ì"; +static char str_OTFFinnish = "¥Õ¥£¥ó¥é¥ó¥É¸ì"; +static char str_OTFFijian = "¥Õ¥£¥¸¡¼¸ì"; +static char str_OTFFlemish = "¥Õ¥é¥Þ¥ó¸ì"; +static char str_OTFForestNenets = "¿¹Îӥͥͥĸì"; +static char str_OTFFon = "¥Õ¥©¥ó¸ì"; +static char str_OTFFaroese = "¥Õ¥§¥í¡¼¸ì"; +static char str_OTFFrenchStandard = "(ɸ½à)¥Õ¥é¥ó¥¹¸ì"; +static char str_OTFFrisian = "¥Õ¥ê¥¸¥¢¸ì"; +static char str_OTFFriulian = "¥Õ¥ê¥¦¥ê¸ì"; +static char str_OTFFuta = "¥Õ¡¼¥¿¸ì"; +static char str_OTFFulani = "¥Õ¥é¥Ë¸ì"; +static char str_OTFGa = "¥¬¡¼¸ì"; +static char str_OTFGaelic = "¥²¡¼¥ë¸ì"; +static char str_OTFGagauz = "¥¬¥¬¥¦¥º¸ì"; +static char str_OTFGalician = "¥¬¥ê¥·¥¢¸ì"; +static char str_OTFGarshuni = "¥¬¥ë¥·¥å¥Ë¸ì"; +static char str_OTFGarhwali = "¥¬¥ë¥ï¡¼¥ê¡¼¸ì"; +static char str_OTFGeez = "¥²¡¼¥º¸ì"; +static char str_OTFGilyak = "¥®¥ê¥ä¡¼¥¯¸ì"; +static char str_OTFGumuz = "¥°¥à¥º¸ì"; +static char str_OTFGondi = "¥´¡¼¥ó¥Ç¥£¡¼¸ì"; +static char str_OTFGreenlandic = "¥°¥ê¡¼¥ó¥é¥ó¥É¸ì"; +static char str_OTFGaro = "¥¬¥í¸ì"; +static char str_OTFGuarani = "¥°¥ï¥é¥Ë¸ì"; +static char str_OTFGujarati = "¥°¥¸¥ã¥é¡¼¥Æ¥£¸ì"; +static char str_OTFHaitian = "¥Ï¥¤¥Á¸ì"; +static char str_OTFHalam = "¥Ï¥é¥à¸ì"; +static char str_OTFHarauti = "¥Ï¥é¥ó¥Á¥å¡¼¸ì"; +static char str_OTFHausa = "¥Ï¥¦¥µ¸ì"; +static char str_OTFHawaiin = "¥Ï¥ï¥¤¸ì"; +static char str_OTFHammer_Banna = "¥Ï¥á¥ë-¥Ð¥Ê¸ì"; +static char str_OTFHiligaynon = "¥Ò¥ê¥¬¥¤¥Î¥ó¸ì"; +static char str_OTFHindi = "¥Ò¥ó¥Ç¥£¡¼¸ì"; +static char str_OTFHighMari = "»³ÃÏ¥Þ¥ê¸ì"; +static char str_OTFHindko = "¥Ò¥ó¥É¥¥¥³¸ì"; +static char str_OTFHo = "¥Û¡¼¸ì"; +static char str_OTFHarari = "¥Ï¥é¥ë¸ì"; +static char str_OTFCroatian = "¥¯¥í¥¢¥Á¥¢¸ì"; +static char str_OTFHungarian = "¥Ï¥ó¥¬¥ê¡¼¸ì"; +static char str_OTFArmenian = "¥¢¥ë¥á¥Ë¥¢¸ì"; +static char str_OTFIgbo = "¥¤¥°¥Ü¸ì"; +static char str_OTFIjo = "¥¤¥¸¥ç¡¼¸ì"; +static char str_OTFIlokano = "¥¤¥í¥«¥Î¸ì"; +static char str_OTFIndonesian = "¥¤¥ó¥É¥Í¥·¥¢¸ì"; +static char str_OTFIngush = "¥¤¥ó¥°¡¼¥·¸ì"; +static char str_OTFInuktitut = "¥¤¥Ì¥¤¥Ã¥È¸ì"; +static char str_OTFIrish = "¥¢¥¤¥ë¥é¥ó¥É¸ì"; +static char str_OTFIrishTraditional = "¸Å¥¢¥¤¥ë¥é¥ó¥É¸ì"; +static char str_OTFIcelandic = "¥¢¥¤¥¹¥é¥ó¥É¸ì"; +static char str_OTFInariSami = "¥¤¥Ê¥ê¡¦¥µ¡¼¥ß¸ì"; +static char str_OTFItalian = "¥¤¥¿¥ê¥¢¸ì"; +static char str_OTFHebrew = "¥Ø¥Ö¥é¥¤¸ì"; +static char str_OTFJavanese = "¥¸¥ã¥ï¸ì"; +static char str_OTFYiddish = "¥¤¥Ç¥£¥Ã¥·¥å¸ì"; +static char str_OTFJapanese = "ÆüËܸì"; +static char str_OTFJudezmo = "¥¸¥å¥Ç¥º¥â¸ì"; +static char str_OTFJula = "¥¸¥å¥é¸ì"; +static char str_OTFKabardian = "¥«¥Ð¥ë¥À¸ì"; +static char str_OTFKachchi = "¥«¥Ã¥Á¸ì"; +static char str_OTFKalenjin = "¥«¥ì¥ó¥¸¥ó¸ì"; +static char str_OTFKannada = "¥«¥ó¥Ê¥À¸ì"; +static char str_OTFKarachay = "¥«¥é¥Á¥ã¥¤¸ì"; +static char str_OTFGeorgian = "¥°¥ë¥¸¥¢¸ì"; +static char str_OTFKazakh = "¥«¥¶¥Õ¸ì"; +static char str_OTFKebena = "¥±¥Ù¥Ê¸ì"; +static char str_OTFKhutsuriGeorgian = "¶µ²ñ¥°¥ë¥¸¥¢¸ì"; +static char str_OTFKhakass = "¥Ï¥«¥¹¸ì"; +static char str_OTFKhanty_Kazim = "¥Ï¥ó¥Æ¥£¡¦¥«¥¸¥à¸ì"; +static char str_OTFKhmer = "¥¯¥á¡¼¥ë¸ì"; +static char str_OTFKhanty_Shurishkar = "¥Ï¥ó¥Æ¥£¡¦¥·¥å¥ê¥·¥å¥«¥ë¸ì"; +static char str_OTFKhanty_Vakhi = "¥Ï¥ó¥Æ¥£¡¦¥Ð¥Ò¸ì"; +static char str_OTFKhowar = "¥³¥ï¡¼¥ë¸ì"; +static char str_OTFKikuyu = "¥­¥¯¥æ¸ì"; +static char str_OTFKirghiz = "¥­¥ë¥®¥¹¸ì"; +static char str_OTFKisii = "¥­¥¹¥£¸ì"; +static char str_OTFKokni = "¥³¥¯¥Ë¸ì"; +static char str_OTFKalmyk = "¥«¥ë¥à¥¤¥¯¸ì"; +static char str_OTFKamba = "¥«¥ó¥Ð¸ì"; +static char str_OTFKumaoni = "¥¯¥Þ¥ª¥Ë¸ì"; +static char str_OTFKomo = "¥³¥â¸ì"; +static char str_OTFKomso = "¥³¥ó¥¾¸ì"; +static char str_OTFKanuri = "¥«¥Ì¥ê¸ì"; +static char str_OTFKodagu = "¥³¥À¥°¸ì"; +static char str_OTFKonkani = "¥³¥ó¥«¥Ë¸ì"; +static char str_OTFKikongo = "¥³¥ó¥´¸ì"; +static char str_OTFKomi_Permyak = "¥³¥ß¡¦¥Ú¥ë¥Ë¥ã¥¯¸ì"; +static char str_OTFKorean = "´Ú¹ñ¸ì"; +static char str_OTFKomi_Zyrian = "¥³¥ß¡¦¥¸¥ê¥¨¡¼¥ó¸ì"; +static char str_OTFKpelle = "¥¯¥Ú¥ì¸ì"; +static char str_OTFKrio = "¥¯¥ê¥ª¸ì"; +static char str_OTFKarakalpak = "¥«¥é¥«¥ë¥Ñ¥¯¸ì"; +static char str_OTFKarelian = "¥«¥ì¥ê¥¢¸ì"; +static char str_OTFKaraim = "¥«¥é¥¤¥à¸ì"; +static char str_OTFKaren = "¥«¥ì¥ó¸ì"; +static char str_OTFKoorete = "¥³¡¼¥ì¥Æ¸ì"; +static char str_OTFKashmiri = "¥«¥·¥ß¡¼¥ë¸ì"; +static char str_OTFKhasi = "¥«¥·¸ì"; +static char str_OTFKildinSami = "¥­¥ë¥Ç¥£¥ó¡¦¥µ¡¼¥ß¸ì"; +static char str_OTFKui = "¥¯¥¤(Kui)¸ì"; +static char str_OTFKulvi = "¥«¥ë¥Ó¸ì"; +static char str_OTFKumyk = "¥¯¥Þ¡¼¥¯¸ì"; +static char str_OTFKurdish = "¥¯¥ë¥É¸ì"; +static char str_OTFKurukh = "¥¯¥ë¥¯¸ì"; +static char str_OTFKuy = "¥¯¥¤(Kuy)¸ì"; +static char str_OTFKoryak = "¥³¥ê¥ã¡¼¥¯¸ì"; +static char str_OTFLadin = "¥é¥Ç¥£¥ó¸ì"; +static char str_OTFLahuli = "¥é¥Û¡¼¥ë¸ì"; +static char str_OTFLak = "¥é¥Ã¥¯¸ì"; +static char str_OTFLambani = "¥é¥ó¥Ð¡¼¥Ë¡¼¸ì"; +static char str_OTFLao = "¥é¥ª¸ì"; +static char str_OTFLatin = "¥é¥Æ¥ó¸ì"; +static char str_OTFLaz = "¥é¥º¸ì"; +static char str_OTFL_Cree = "L-¥¯¥ê¡¼¸ì"; +static char str_OTFLadakhi = "¥é¥À¥­¸ì"; +static char str_OTFLezgi = "¥ì¥º¥®¸ì"; +static char str_OTFLingala = "¥ê¥ó¥¬¥é¸ì"; +static char str_OTFLowMari = "ËÒÃÏ¥Þ¥ê¸ì"; +static char str_OTFLimbu = "¥ê¥ó¥Ö¥à¸ì"; +static char str_OTFLomwe = "¥í¥à¥¨¸ì"; +static char str_OTFLowerSorbian = "²¼¥½¥ë¥Ö¸ì"; +static char str_OTFLuleSami = "¥ë¥ì¡¦¥µ¡¼¥ß¸ì"; +static char str_OTFLithuanian = "¥ê¥È¥¢¥Ë¥¢¸ì"; +static char str_OTFLuba = "¥ë¥Ð¸ì"; +static char str_OTFLuganda = "¥ë¥¬¥ó¥À¸ì"; +static char str_OTFLuhya = "¥ë¥Ò¥ã¸ì"; +static char str_OTFLuo = "¥ë¥ª¸ì"; +static char str_OTFLatvian = "¥é¥È¥Ó¥¢¸ì"; +static char str_OTFMajang = "¥Þ¥¸¥ã¥ó¸ì"; +static char str_OTFMakua = "¥Þ¥¯¥¢¸ì"; +static char str_OTFMalayalamTraditional = "¥Þ¥é¥ä¥é¥à¸ì(ÅÁÅýŪ)"; +static char str_OTFMansi = "¥Þ¥ó¥·¸ì"; +static char str_OTFMarathi = "¥Þ¥é¡¼¥Æ¥£¡¼¸ì"; +static char str_OTFMarwari = "¥Þ¥ë¥ï¥ê¸ì"; +static char str_OTFMbundu = "¥ó¥Ö¥ó¥À¸ì"; +static char str_OTFManchu = "Ëþ½£¸ì"; +static char str_OTFMooseCree = "¥à¡¼¥¹¡¦¥¯¥ê¡¼¸ì"; +static char str_OTFMende = "¥á¥ó¥Ç¸ì"; +static char str_OTFMeen = "¥á¡¦¥¨¥ó¸ì"; +static char str_OTFMizo = "¥ß¥¾¸ì"; +static char str_OTFMacedonian = "¥Þ¥±¥É¥Ë¥¢¸ì"; +static char str_OTFMale = "¥Þ¥ì¸ì(¥ª¥â½ô¸ì¤Î¤«¥Ñ¥×¥¢½ô¸ì¤Î¤«¤ÏÉÔÌÀ)"; +static char str_OTFMalagasy = "¥Þ¥é¥¬¥·¸ì"; +static char str_OTFMalinke = "¥Þ¥ê¥ó¥±¸ì"; +static char str_OTFMalayalamReformed = "²þÎÉ¥Þ¥é¥ä¥é¥à¸ì"; +static char str_OTFMalay = "¥Þ¥ì¡¼¸ì"; +static char str_OTFMandinka = "¥Þ¥ó¥Ç¥£¥ó¥«¸ì"; +static char str_OTFMongolian = "¥â¥ó¥´¥ë¸ì"; +static char str_OTFManipuri = "¥Þ¥Ë¥×¥ê¸ì"; +static char str_OTFManinka = "¥Þ¥Ë¥ó¥«¸ì"; +static char str_OTFManxGaelic = "¥Þ¥óÅ祲¡¼¥ë¸ì"; +static char str_OTFMoksha = "¥â¥¯¥·¥ã¸ì"; +static char str_OTFMoldavian = "¥â¥ë¥À¥Ó¥¢¸ì"; +static char str_OTFMon = "¥â¥ó¸ì"; +static char str_OTFMoroccan = "¥â¥í¥Ã¥³¸ì"; +static char str_OTFMaori = "¥Þ¥ª¥ê¸ì"; +static char str_OTFMaithili = "¥Þ¥¤¥Æ¥£¥ê¡¼¸ì"; +static char str_OTFMaltese = "¥Þ¥ë¥¿¸ì"; +static char str_OTFMundari = "¥à¥ó¥À¡¼¥ê¡¼¸ì"; +static char str_OTFNaga_Assamese = "¥Ê¥¬¡¦¥¢¥Ã¥µ¥à¸ì"; +static char str_OTFNanai = "¥Ê¡¼¥Ê¥¤¸ì"; +static char str_OTFNaskapi = "¥Ê¥¹¥«¥Ô¸ì"; +static char str_OTFN_Cree = "N-¥¯¥ê¡¼¸ì"; +static char str_OTFNdebele = "¥ó¥Ç¥Ù¥ì¸ì"; +static char str_OTFNdonga = "¥ó¥É¥¥¥ó¥¬¸ì"; +static char str_OTFNepali = "¥Í¥Ñ¡¼¥ë¸ì"; +static char str_OTFNewari = "¥Í¥ï¡¼¥ê¡¼¸ì"; +static char str_OTFNorwayHouseCree = "¥Î¥ë¥¦¥§¡¼¥Ï¥¦¥¹¡¦¥¯¥ê¡¼¸ì"; +static char str_OTFNisi = "¥Ë¥·¸ì"; +static char str_OTFNiuean = "¥Ë¥¦¥¨¡¼¸ì"; +static char str_OTFNkole = "¥ó¥³¥ì¸ì"; +static char str_OTFDutch = "¥ª¥é¥ó¥À¸ì"; +static char str_OTFNogai = "¥Î¥¬¥¤¸ì"; +static char str_OTFNorwegian = "¥Î¥ë¥¦¥§¡¼¸ì(¥Ö¡¼¥¯¥â¡¼¥ë)"; +static char str_OTFNorthernSami = "ËÌ¥µ¡¼¥ß¸ì"; +static char str_OTFNorthernTai = "ËÌ¥À¥¤¸ì"; +static char str_OTFEsperanto = "¥¨¥¹¥Ú¥é¥ó¥È"; +static char str_OTFNynorsk = "¥Î¥ë¥¦¥§¡¼¸ì(¥Ë¡¼¥Î¥·¥å¥¯)"; +static char str_OTFOji_Cree = "¥ª¥¸¡¦¥¯¥ê¡¼¸ì"; +static char str_OTFOjibway = "¥ª¥¸¥Ö¥¨¸ì"; +static char str_OTFOriya = "¥ª¥ê¥ä¸ì"; +static char str_OTFOromo = "¥ª¥í¥â¸ì"; +static char str_OTFOssetian = "¥ª¥»¥Ã¥È¸ì"; +static char str_OTFPalestinianAramaic = "¥Ñ¥ì¥¹¥Á¥Ê¡¦¥¢¥é¥à¸ì"; +static char str_OTFPali = "¥Ñ¡¼¥ê¸ì"; +static char str_OTFPunjabi = "¥Ñ¥ó¥¸¥ã¡¼¥Ö¸ì"; +static char str_OTFPalpa = "¥Ñ¥ë¥Ñ¸ì"; +static char str_OTFPashto = "¥Ñ¥·¥å¥È¡¼¸ì"; +static char str_OTFPolytonicGreek = "¸Åŵ¥®¥ê¥·¥ã¸ì"; +static char str_OTFPilipino = "¥Ô¥ê¥Ô¥Î¸ì"; +static char str_OTFPalaung = "¥Ñ¥é¥¦¥ó¸ì"; +static char str_OTFPolish = "¥Ý¡¼¥é¥ó¥É¸ì"; +static char str_OTFProvencal = "¥×¥í¥Ð¥ó¥¹¸ì"; +static char str_OTFPortuguese = "¥Ý¥ë¥È¥¬¥ë¸ì"; +static char str_OTFChin = "¥Á¥ó¸ì"; +static char str_OTFRajasthani = "¥é¡¼¥¸¥ã¥¹¥¿¡¼¥Ë¡¼¸ì"; +static char str_OTFR_Cree = "R-¥¯¥ê¡¼¸ì"; +static char str_OTFRussianBuriat = "¥Ö¥ê¥ä¡¼¥È¸ì"; +static char str_OTFRiang = "¥ê¥¢¥ó¸ì"; +static char str_OTFRhaeto_Romanic = "¥ì¥È¡¦¥í¥Þ¥ó¥¹¸ì"; +static char str_OTFRomanian = "¥ë¡¼¥Þ¥Ë¥¢¸ì"; +static char str_OTFRomany = "¥í¥Þ¡¼¥Ë¡¼¸ì"; +static char str_OTFRusyn = "¥ë¥·¡¼¥ó¸ì"; +static char str_OTFRuanda = "¥ë¥ï¥ó¥À¸ì"; +static char str_OTFRussian = "¥í¥·¥¢¸ì"; +static char str_OTFSadri = "¥µ¥É¥ê¸ì"; +static char str_OTFSanskrit = "¥µ¥ó¥¹¥¯¥ê¥Ã¥È"; +static char str_OTFSantali = "¥µ¥ó¥¿¥ë¸ì"; +static char str_OTFSayisi = "¥¶¥¤¥»¸ì"; +static char str_OTFSekota = "¥»¥³¥¿¸ì"; +static char str_OTFSelkup = "¥»¥ê¥¯¥×¸ì"; +static char str_OTFSango = "¥µ¥ó¥´¸ì "; +static char str_OTFShan = "¥·¥ã¥ó¸ì"; +static char str_OTFSibe = "¥·¥Ù¸ì"; +static char str_OTFSidamo = "¥·¥À¥â¸ì"; +static char str_OTFSilteGurage = "¥·¥ë¥Æ¡¦¥°¥é¥²¸ì"; +static char str_OTFSkoltSami = "¥¹¥³¥ë¥È¡¦¥µ¡¼¥ß¸ì"; +static char str_OTFSlovak = "¥¹¥í¥Ð¥­¥¢¸ì"; +static char str_OTFSlavey = "¥¹¥é¥Ó¸ì"; +static char str_OTFSlovenian = "¥¹¥í¥Ù¥Ë¥¢¸ì"; +static char str_OTFSomali = "¥½¥Þ¥ê¸ì"; +static char str_OTFSamoan = "¥µ¥â¥¢¸ì"; +static char str_OTFSena = "¥·¥Ê¡¼¸ì"; +static char str_OTFSindhi = "¥·¥ó¥É¸ì"; +static char str_OTFSinhalese = "¥·¥ó¥Ï¥é¸ì"; +static char str_OTFSoninke = "¥½¥Ë¥ó¥±¸ì"; +static char str_OTFSodoGurage = "¥½¥É¡¦¥°¥é¥²¸ì"; +static char str_OTFSotho = "¥½¥È¸ì"; +static char str_OTFAlbanian = "¥¢¥ë¥Ð¥Ë¥¢¸ì"; +static char str_OTFSerbian = "¥»¥ë¥Ó¥¢¸ì"; +static char str_OTFSaraiki = "¥µ¥é¡¼¥¤¥­¡¼¸ì"; +static char str_OTFSerer = "¥»¥ì¥ë¸ì"; +static char str_OTFSouthSlavey = "Æ¥é¥Ó¸ì"; +static char str_OTFSouthernSami = "Æ¡¼¥ß¸ì"; +static char str_OTFSuri = "¥¹¥ê¸ì"; +static char str_OTFSvan = "¥¹¥Ð¥ó¸ì"; +static char str_OTFSwedish = "¥¹¥¦¥§¡¼¥Ç¥ó¸ì"; +static char str_OTFSwadayaAramaic = "¸½Â奢¥é¥à¸ì"; +static char str_OTFSwahili = "¥¹¥ï¥Ò¥ê¸ì"; +static char str_OTFSwazi = "¥¹¥ï¥¸¸ì"; +static char str_OTFSutu = "¥¹¥Ä¸ì"; +static char str_OTFSyriac = "¥·¥ê¥¢¸ì"; +static char str_OTFTabasaran = "¥¿¥Ð¥µ¥é¥ó¸ì"; +static char str_OTFTajiki = "¥¿¥¸¥¯¸ì"; +static char str_OTFTamil = "¥¿¥ß¥ë¸ì"; +static char str_OTFTatar = "¥¿¥¿¡¼¥ë¸ì"; +static char str_OTFTH_Cree = "TH-¥¯¥ê¡¼¸ì"; +static char str_OTFTelugu = "¥Æ¥ë¥°¸ì"; +static char str_OTFTongan = "¥È¥ó¥¬(Tongan)¸ì"; +static char str_OTFTigre = "¥Æ¥£¥°¥ì¸ì"; +static char str_OTFTigrinya = "¥Æ¥£¥°¥ê¥Ë¥¢¸ì"; +static char str_OTFThai = "¥¿¥¤¸ì"; +static char str_OTFTahitian = "¥¿¥Ò¥Á¸ì"; +static char str_OTFTibetan = "¥Á¥Ù¥Ã¥È¸ì"; +static char str_OTFTurkmen = "¥È¥ë¥¯¥á¥ó¸ì"; +static char str_OTFTemne = "¥Æ¥à¥Í¸ì"; +static char str_OTFTswana = "¥Ä¥ï¥Ê¸ì"; +static char str_OTFTundraNenets = "¥Ä¥ó¥É¥é¡¦¥Í¥Í¥Ä¸ì"; +static char str_OTFTonga = "¥È¥ó¥¬(Tonga)¸ì"; +static char str_OTFTodo = "¥È¥É¸ì"; +static char str_OTFTurkish = "¥È¥ë¥³¸ì"; +static char str_OTFTsonga = "¥Ä¥©¥ó¥¬¸ì"; +static char str_OTFTuroyoAramaic = "¥È¥¥¥í¥è¡¦¥¢¥é¥à¸ì"; +static char str_OTFTulu = "¥È¥¥¥ë¸ì"; +static char str_OTFTuvin = "¥È¥¥¥Ð¸ì"; +static char str_OTFTwi = "¥È¥¥¥¤¸ì"; +static char str_OTFUdmurt = "¥¦¥É¥à¥ë¥È¸ì"; +static char str_OTFUkrainian = "¥¦¥¯¥é¥¤¥Ê¸ì"; +static char str_OTFUrdu = "¥¦¥ë¥É¥¥¡¼¸ì"; +static char str_OTFUpperSorbian = "¾å¥½¥ë¥Ö¸ì"; +static char str_OTFUyghur = "¥¦¥¤¥°¥ë¸ì"; +static char str_OTFUzbek = "¥¦¥º¥Ù¥¯¸ì"; +static char str_OTFVenda = "¥ô¥§¥ó¥À¸ì"; +static char str_OTFVietnamese = "¥Ù¥È¥Ê¥à¸ì"; +static char str_OTFWa = "¥ï¸ì"; +static char str_OTFWagdi = "¥ï¡¼¥°¥ê¡¼¸ì"; +static char str_OTFWest_Cree = "À¾¥¯¥ê¡¼¸ì"; +static char str_OTFWelsh = "¥¦¥§¡¼¥ë¥º¸ì"; +static char str_OTFWolof = "¥¦¥©¥í¥Õ¸ì"; +static char str_OTFXhosa = "¥³¥µ¸ì"; +static char str_OTFYakut = "¥ä¥¯¡¼¥È¸ì"; +static char str_OTFYoruba = "¥è¥ë¥Ð¸ì"; +static char str_OTFY_Cree = "Y-¥¯¥ê¡¼¸ì"; +static char str_OTFYiClassic = "׳¸ì (¸Åʸ)"; +static char str_OTFYiModern = "µ¬ÈÏ׳ʸ"; +static char str_OTFChinesePhonetic = "Ãæ¹ñ¸ì(Ãí²»»úÊì)"; +static char str_OTFChineseSimplified = "Ãæ¹ñ¸ì(´ÊÂλú)"; +static char str_OTFChineseTraditional = "Ãæ¹ñ¸ì(ÈËÂλú)"; +static char str_OTFZande = "¥¶¥ó¥Ç¸ì"; +static char str_OTFZulu = "¥º¡¼¥ë¡¼¸ì"; + /* dlg */ +static char str_ScriptList = "ÍÑ»ú·Ï¥ê¥¹¥È"; +static char str_LanguageList = "¸À¸ì¥ê¥¹¥È"; +static char str_ScriptMissing = "¤½¤ÎÍÑ»ú·Ï¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char str_ScriptMissingText = "'%c%c%c%c'¤Ë°ìÃפ¹¤ëÍÑ»ú·Ï¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿.\n¤³¤Î¥ê¥¹¥È¤«¤é¤Ï±Ì¤ì¤Æ¤¤¤Þ¤¹.\n¤³¤ì¤òÀßÄꤹ¤ë¤Ä¤â¤ê¤¬Ìµ¤¤¤Ê¤é, [¥­¥ã¥ó¥»¥ë]\n¤ò²¡¤·¤¿¸å, Ctrl¥­¡¼¤ò²¡¤·¤¿¤Þ¤Þ[ÊÔ½¸]¤ò²¡¤·¤Æ²¼¤µ¤¤"; +static char str_AtLeastOneScript = "ºÇÄã1¸Ä¤ÎÍÑ»ú·Ï¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"; +static char str_LangMissing = "¸À¸ì¤¬¤¢¤ê¤Þ¤»¤ó"; +static char str_LangMissingText = "'%c%c%c%c'¤Ë°ìÃפ¹¤ë¸À¸ì¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿.\n¤³¤Î¥ê¥¹¥È¤«¤é¤Ï±Ì¤ì¤Æ¤¤¤Þ¤¹.\n¤³¤ì¤òÀßÄꤹ¤ë¤Ä¤â¤ê¤¬Ìµ¤¤¤Ê¤é, [¥­¥ã¥ó¥»¥ë]\n¤ò²¡¤·¤¿¸å, Ctrl¥­¡¼¤ò²¡¤·¤¿¤Þ¤Þ[ÊÔ½¸]¤ò²¡¤·¤Æ²¼¤µ¤¤"; +static char str_AtLeastOneLang = "¾¯¤Ê¤¯¤È¤â1¸Ä¤Î¸À¸ì¤ò\nUse the \"Default\" language if nothing else fits."; +static char str_ScriptLang = "ÍÑ»ú·Ï¤È¸À¸ì"; +static char str_ScriptLangEnter = "ÍÑ»ú·Ï¤Î¥ê¥¹¥È¤È¸À¸ì¤Î¥ê¥¹¥È¤òÆþÎϤ·¤Æ¤¯¤À¤µ¤¤"; +static char str_ScriptLangList = "ÍÑ»ú·Ï¡¦¸À¸ì¥ê¥¹¥È"; +static char str_SLError = "ÍÑ»ú·Ï¤ò¥Ñ¡¼¥¹¤Ç¤­¤Þ¤»¤ó" +static char str_SLErrorText = "1¸Ä¤ÎÍÑ»ú·Ï¡¦¸À¸ì¥ê¥¹¥È¤Ï,\n4ʸ»ú¤ÎÍÑ»ú·Ï¥¿¥°¤Î¸å¤í¤Ë\n4ʸ»ú¤Î¸À¸ì¥¿¥°¤ò¥«¥ó¥Þ¤Ç¶èÀڤäÆ'{ }'¤Ç°Ï¤Ã¤¿·Á\n¤òʤ٤¿¤â¤Î¤Ç¤¹. Îã:\nlatn{DEU ,dflt} cyrl{dflt}"; +static char str_ScriptC = "ÍÑ»ú·Ï(S):"; +static char mnemonic_ScriptC = 'S'; +static char str_TagC = "¥¿¥°(T):"; +static char mnemonic_TagC = 'T'; +static char str_ScriptAndLangC = "ÍÑ»ú·Ï¡¦¸À¸ì(S):"; +static char mnemonic_ScriptAndLangC = 'S'; +static char str_HHDefaultHH = "¡½ ¥Ç¥Õ¥©¥ë¥È ¡½"; +static char str_Nested = "¡½ Æþ¤ì»Ò ¡½"; +static char str_EditLangList = "¡½ ÍÑ»ú·Ï¡¦¸À¸ì¥ê¥¹¥È¤òÊÔ½¸ ¡½"; +static char str_TagTooLong = "¥¿¥°¤¬Ä¹¤¹¤®¤Þ¤¹."; +static char str_ScriptTagTooLong = "ÍÑ»ú·Ï¥¿¥°¤ÏASCII¤Ç4ʸ»ú¤Ë¸Â¤é¤ì¤Æ¤¤¤Þ¤¹"; +static char str_TagMustBe4 = "¥¿¥°¤ÎŤµ¤Ï4ʸ»ú¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char str_RightToLeft = "±¦¤«¤éº¸¤Ø"; +static char str_IgnoreBaseGlyphs = "´ðÄìʸ»ú¤ò̵»ë¤¹¤ë"; +static char str_IgnoreLigatures = "¹ç»ú¤ò̵»ë¤¹¤ë"; +static char str_IgnoreCombiningMarks = "·ë¹ç·¿¥Þ¡¼¥¯¤ò̵»ë¤¹¤ë"; +static char str_NoScript = "¥¹¥¯¥ê¥×¥È¤¬¤¢¤ê¤Þ¤»¤ó."; +static char str_NeedsScriptForSubs = "ʸ»ú¤Î°ÌÃÖ»ØÄê¤äÃÖ´¹¤Ë´Ø¤¹¤ë¾ðÊó¤òÄɲ乤ë»þ¤Ë¤Ï, FontForge¤Ï¥¹¥¯¥ê¥×¥È¤òÃΤäƤ¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"; +static char str_NeedsScriptForSubsGuess = "ʸ»ú¤Î°ÌÃÖ»ØÄê¤äÃÖ´¹¤Ë´Ø¤¹¤ë¾ðÊó¤òÄɲ乤ë»þ¤Ë¤Ï, FontForge¤Ï¥¹¥¯¥ê¥×¥È¤òÃΤäƤ¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹\n'%c%c%c%c'¤Ç¹ç¤Ã¤Æ¤¤¤Þ¤¹¤«?"; +static char str_ReallyNoScript = "¤³¤Î¥°¥ê¥Õ¤Ë¥¹¥¯¥ê¥×¥È»ØÄ꤬¤¢¤ê¤Þ¤»¤ó(¤Þ¤¿¤ÏFontForge¤¬¿ä¬¤Ë¼ºÇÔ¤·¤Þ¤·¤¿). ¤³¤ì¤Ë¤è¤ê,¥°¥ê¥Õ¤òGPOS¤ÈGSUB¤Îξ¥Æ¡¼¥Ö¥ë¤Ç»ÈÍѤ¹¤ë»þ¤ËÌäÂ꤬ȯÀ¸¤¹¤ë¤Ç¤·¤ç¤¦.\n¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?" +static char str_MergeWith = "¤Þ¤È¤áÀè:"; +static char str_MergeWithPopup = "FontForge¤Ï,\"¤Þ¤È¤áÀè\"¤ÈƱ¤¸Ãͤò¤â¤ÄÁ´¤Æ¤Î\n¥¢¥ó¥«¡¼¥¯¥é¥¹¤ò1¸Ä¤ÎGPOS¥ë¥Ã¥¯¥¢¥Ã¥×¤Ë\nÅý¹ç¤·¤è¤¦¤È»î¤ß¤Þ¤¹"; +static char str_MarkToBaseLig = "¥Þ¡¼¥¯¢ª´ðÄìʸ»ú,¤Þ¤¿¤Ï\n¥Þ¡¼¥¯¢ª¹ç»ú"; +static char str_MarkToMark = "¥Þ¡¼¥¯¢ª¥Þ¡¼¥¯"; +static char str_Cursive = "É®µ­ÂÎ"; +static char str_CursiveAttach = "É®µ­ÂΤÎÀܳ"; + /* Select by att (pst) */ +static char str_SimpSubstitution = "ñ½ãÃÖ´¹"; +static char str_AltSubstitutions = "ÁªÂò»è¤ò¤â¤ÄÃÖ´¹"; +static char str_MultSubstitution = "Ê£¿ôʸ»ú¤Ø¤ÎÃÖ´¹"; +static char str_SimpPos = "ñ½ã°ÌÃÖ»ØÄê"; +static char str_PairPos = "¥Ú¥¢°ÌÃÖ»ØÄê"; +static char str_LigCaret = "¹ç»ú¥­¥ã¥ì¥Ã¥È"; +static char str_Kerning = "¥«¡¼¥Ë¥ó¥°"; +static char str_Containing = "´Þ¤àʸ»ú:"; +static char str_SelectResults = "·ë²Ì¤òÁªÂò"; +static char str_SelectResultsPopup = "¤³¤Î¸¡º÷¤Ç¸«¤Ä¤«¤Ã¤¿Ê¸»ú¤ò\n¥Õ¥©¥ó¥È¥Ó¥å¡¼¤ÇÁªÂò¤·¤Þ¤¹."; +static char str_MergeResults = "·ë²Ì¤òÅý¹ç"; +static char str_MergeResultsPopup = "¥Õ¥©¥ó¥È¥Ó¥å¡¼Æâ¤ÎÁªÂòÈϰϤË,¤³¤Î\n¸¡º÷¤Ç¸«¤Ä¤«¤Ã¤¿Ê¸»ú¤òÅý¹ç¤·¤Þ¤¹."; +static char str_RestrictSelection = "ÁªÂòÈϰϤ˸ÂÄê"; +static char str_RestrictSelectionPopup = "ÁªÂò¤µ¤ì¤¿Ê¸»úÈϰϤΤߤò¸¡º÷¤·,\n¤³¤Î¸¡º÷¤Ç°ìÃפ·¤Ê¤«¤Ã¤¿Ê¸»ú¤òÁªÂò²ò½ü¤·¤Þ¤¹."; +static char str_UnknownAnchorClass = "%.70s ¤È¤¤¤¦¥¢¥ó¥«¡¼¥¯¥é¥¹¤Ï̤ÄêµÁ¤Ç¤¹"; +static char str_TooManyTags = "»ØÄꤵ¤ì¤¿¥¿¥°¤¬Â¿¤¹¤®¤Þ¤¹"; +static char str_NoMatch = "°ìÃפ¹¤ëʸ»ú¤¬¤¢¤ê¤Þ¤»¤ó"; + /* Import */ +static char str_Duppixelsize[] = "¥Ô¥¯¥»¥ë¥µ¥¤¥º¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹."; +/* "The font database already contains a bitmap\nfont with this pixelsize (%d)\nDo you want to overwrite it?" */ +static char str_Duppixelsizepre[] = "¥Õ¥©¥ó¥È¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¤Ï, ´û¤Ë¤³¤Î¥Ô¥¯¥»¥ë¥µ¥¤¥º\n("; +static char str_Duppixelsizepost[] = " ¥É¥Ã¥È)¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹.\n¾å½ñ¤­¤·¤Þ¤¹¤«?"; +static char str_NoBitmapFont = "¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤¬¤¢¤ê¤Þ¤»¤ó."; +static char str_NoBitmapFontIn = "¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤¬ %hs ¤«¤é¸«¤Ä¤«¤ê¤Þ¤»¤ó¤Ç¤·¤¿."; + /* Private Info */ +static char str_Bluequest[] = "BlueValues¤ÈOtherBlues¤ÎξÊý¤¬Êѹ¹¤µ¤ì¤Þ¤¹.\012³¤±¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char str_Hstemquest[] = "StdHW¤ÈStemSnapH¤ÎξÊý¤¬Êѹ¹¤µ¤ì¤Þ¤¹.\012³¤±¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char str_Vstemquest[] = "StdVW¤ÈStemSnapV¤ÎÆó¤Ä¤¬ºîÀ®¤µ¤ì¤Þ¤¹.\012³¤±¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char str_Arrayquest[] = "¤³¤³¤ÏÇÛÎó¤¬É¬ÍפǤ¹.\012¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char str_Numberquest[] = "¤³¤³¤Ï¿ôÃͤ¬É¬ÍפǤ¹.\012¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char str_Boolquest[] = "¤³¤³¤ÏÏÀÍýÃͤ¬É¬ÍפǤ¹.\012¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char str_Codequest[] = "¤³¤³¤Ï¥³¡¼¥É¤¬É¬ÍפǤ¹.\012¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char str_Badtype[] = "·¿¤¬´Ö°ã¤¤¤Ç¤¹"; +static char str_Delete[] = "ºï½ü(D)"; +static char mnemonic_Delete[] = 'D'; + /* Prefs */ +static char str_UTF_8[] = "UTF-8 (Unicode)"; +static char str_Default[] = "¥Ç¥Õ¥©¥ë¥È"; +static char *str_PrefsPopupAWS[] = "ʸ»ú¤ÎÉý¤òÊѹ¹¤¹¤ë¤È, ¤³¤Îʸ»ú¤ò´Þ¤àÁ´¤Æ¤Î\n¥¢¥¯¥»¥ó¥Èʸ»ú¤ÎÉý¤¬Êѹ¹¤µ¤ì¤Þ¤¹"; +static char *str_PrefsPopupALS[] = "ʸ»ú¤Îº¸¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°(LSB)¤òÊѹ¹¤¹¤ë¤È\n¤³¤Îʸ»ú¤ò¥Ù¡¼¥¹¤È¤·¤¿Â¾¤Î¥¢¥¯¥»¥ó¥È¤Ä¤­Ê¸»ú¤Ë\n´Þ¤Þ¤ì¤ë»²¾È¤ÎLSB¤âÄ´À°¤µ¤ì¤Þ¤¹"; +static char *str_PrefsPopupForNewFonts[] = "¿·µ¬ºîÀ®¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°"; +static char *str_PrefsPopupNES[] = "¿·µ¬ºîÀ®¥Õ¥©¥ó¥È¤ÎÁ´³Ñ¥°¥ê¥Ã¥É¤Î½é´üÃÍ"; +static char *str_PrefsPopupNOT[] = "¥Õ¥©¥ó¥È¤Ë´Þ¤Þ¤ì¤ë¶ÊÀþ¤ò2¼¡(TrueType)¤Ç°·¤¦¤«\n3¼¡(PostScript¤ÈOpenType)¤Ç°·¤¦¤«."; +static char *str_PrefsPopupLFN[] = "¥Õ¥©¥ó¥È¤¬¥Ç¥£¥¹¥¯¤«¤éÆɤ߹þ¤Þ¤ì¤¿»þ¤Ë¥¹¥×¥é¥¤¥ó¤ò\n¥ª¥ê¥¸¥Ê¥ë¤Î¼¡¿ô(2¼¡¤«3¼¡)¤Î¤Þ¤Þ¤ÇÊÝ»ý¤¹¤ë¤«,¤½¤ì¤È¤â\n¿·µ¬ºîÀ®¥Õ¥©¥ó¥È¤Î¥Ç¥Õ¥©¥ë¥È¤Î¼¡¿ô¤ËÊÑ´¹¤¹¤ë¤«¤É¤¦¤«\n(NewFontQuadratic »²¾È)"; +static char *str_PrefsPopupLoc[] = "¥í¡¼¥«¥ë´Ä¶­¤Î¥¯¥ê¥Ã¥×¥Ü¡¼¥É, ¥Õ¥¡¥¤¥ë¥·¥¹¥Æ¥àÅù¤Ç»È¤ï¤ì¤ëʸ»ú½¸¹ç\n(¸½ºß¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤Î¤Ï8¥Ó¥Ã¥Èʸ»ú½¸¹ç¤Î¤ß)"; +static char *str_PrefsPopupAH[] = "¥é¥¹¥¿²½Á°¤Ë¼«Æ°¥Ò¥ó¥ÈºîÀ®"; +static char *str_PrefsPopupAHG[] = "¥Õ¥©¥ó¥ÈÀ¸À®»þ¤ËÊѹ¹¤µ¤ì¤¿Ê¸»ú¤ò¼«Æ°¥Ò¥ó¥È¤Å¤±"; +static char *str_PrefsPopupFN[] = "BDF¥Õ¥©¥ó¥È¤ÎÀ¸À®»þ¤Ë, foundry\n¥Õ¥£¡¼¥ë¥É¤ËÍѤ¤¤é¤ì¤ë̾Á°"; +static char *str_PrefsPopupTFN[] = "TrueType¥Õ¥©¥ó¥ÈÀ¸À®»þ¤ËOS/2¥Æ¡¼¥Ö¥ë¤Î\nVendorID ¥Õ¥£¡¼¥ë¥É¤ËÍѤ¤¤é¤ì¤ë̾Á°\n(ºÇÂç4ʸ»ú)"; +static char *str_PrefsPopupXU[] = "¤¢¤Ê¤¿¤ÎÁÈ¿¥¤ò°ì°Õ¤Ë¼±Ê̤¹¤ëÃÍ. »ØÄꤹ¤ë¾ì¹ç,\n¶õÇò¤Ç¶èÀڤä¿16777216̤Ëþ¤ÎÀ°¿ô¤Î¥ê¥¹¥È¤Ç\n¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó. ̵»ØÄê»þ¤Ï\nFontForge¤¬ºÇ¸å¤Î¹½À®Í×ÁǤò¥é¥ó¥À¥à¤ËÀ¸À®¤·¤Þ¤¹."; +static char *str_PrefsPopupRulers[] = "¥¢¥¦¥È¥é¥¤¥óÊÔ½¸²èÌ̤ǥ롼¥é¤òɽ¼¨¤·¤Þ¤¹"; +static char *str_PrefsPopupSepHints[] = "¿åÊ¿Êý¸þ¤È¿âľÊý¸þ¤Î¥Ò¥ó¥Èɽ¼¨¤òÊÌ¡¹¤ËÀ©¸æ¤¹¤ë"; +static char *str_PrefsPopupIC[] = "¥¢¥¦¥È¥é¥¤¥óɽ¼¨¤Ç, ¥·¥Õ¥È¥­¡¼¤ò²¡¤·¤¿»þ¤ÎÆ°¤­¤ò¿âľÊý¸þ¤Ë¤Ç¤Ï¤Ê¤¯ItalicAngle¤ËÀ©¸Â¤¹¤ë"; +static char *str_PrefsPopupAO[] = "[¥¢¥¯¥»¥ó¥Èʸ»ú¤Î¹½ÃÛ]¤Ç, ¥¢¥¯¥»¥ó¥È¤ò²¼¤Îʸ»ú¤«¤éÎ¥¤¹¥ª¥Õ¥»¥Ã¥È¤ÎÂ礭¤µ (em ¤ËÂФ¹¤ëɴʬΨ¤Ç)" +static char *str_PrefsPopupGA[] = "¥¢¥¯¥µ¥ó¥°¥é¡¼¥Ö¤È¥¢¥¯¥µ¥ó¥Æ¥®¥å¤òʸ»ú¤Î¾å¤ËÃÖ¤¯¤È¤­,\nξÉý¤Î¶õ¤­¤¬Æ±¤¸¤Ë¤Ê¤ë¤è¤¦¤ËÃÖ¤¯¤«, ¥¢¥¯¥»¥ó¥Èʸ»ú¤ÎÄ줬\nÃæ±û¤Ë¤Ê¤ë¤è¤¦¤Ë¤¹¤ë¤«"; +static char *str_PrefsPopupCH[] = "ʸ»ú¤Î¾å¤Ë¤¢¤ë¥¢¥¯¥»¥ó¥È¤òÃ濴·¤¨¤¹¤ë¤È¤­,\nʸ»ú¤Î¤â¤Ã¤È¤â¹â¤¤ÅÀ¤Ë¹ç¤ï¤»¤ë¤«,\nʸ»úÉý¤ÎÃæ±û¤Ë¹ç¤ï¤»¤ë¤«"; +static char *str_PrefsPopupAA[] = "Ìð°õ¥­¡¼¤ò²¡¤·¤¿»þ¤Ë, ÁªÂò¤·¤¿ÅÀ¤¬²¿em-unit¤À¤±°ÜÆ°¤¹¤ë¤«"; +static char *str_PrefsPopupGN[] = "Adobe¤ÏDelta, Omega, mu¤Î3¤Ä¤Î̾Á°¤ò¤½¤ì¤¾¤ìº¹Ê¬, ¥ª¡¼¥à, ¥Þ¥¤¥¯¥í¤ò\nɽ¤¹µ­¹æ¤Ë³ä¤êÅö¤Æ¤Æ¤¤¤Þ¤¹. ¤³¤ì¤Ï¥®¥ê¥·¥ãʸ»ú¥Õ¥©¥ó¥È¤ò¥Ç¥¶¥¤¥ó¤·,\n¥®¥ê¥·¥ãʸ»ú¤Î̾Á°¤òɽ¤¹¤Î¤Ë¤³¤ì¤é¤Î̾Á°¤ò»È¤¦¿Í¤Ë¤È¤Ã¤Æ¤Ï\nÈó¾ï¤Ë´ñ̯¤Ë´¶¤¸¤Þ¤¹. ¤³¤Î¥Õ¥é¥°¤ò\n¥»¥Ã¥È¤¹¤ë¤È,¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¤Îʸ»ú¤Ï Delta.greek, Omega.greek, mu.greek ¤È̾¤Å¤±¤é¤ì¤Þ¤¹"; +static char *str_PrefsPopupSD[] = "¥Þ¥¦¥¹¥Ý¥¤¥ó¥¿¤¬, ¶½Ì£¤ò°ú¤¯ÂÐ¾Ý (¥Ù¡¼¥¹¥é¥¤¥ó, Éý,\n¥°¥ê¥Ã¥É¥¹¥×¥é¥¤¥ó¤Ê¤É) ¤Ë, ²¿¥Ô¥¯¥»¥ë°ÊÆâ¤Ë¶áÉÕ¤¤¤¿»þ¤Ë\n¥¹¥Ê¥Ã¥×¤¹¤ë¤«¤ò»ØÄꤷ¤Þ¤¹"; +static char *str_PrefsPopupJS[] = "The Edit->Join command will join points which are this close together\nA value of 0 means they must be coincident" +static char *str_PrefsPopupBR[] = "»ØÄê»þ¤Ë¤Ï, °ìÁȤÎBDF¥Õ¥©¥ó¥È¤òÀ¸À®¤¹¤ë»þ¤Ë, ¥æ¡¼¥¶¤Ë²èÌ̲òÁüÅÙ¤ò»ØÄꤹ¤ë¤è¤¦¤Ëµá¤á¤Þ¤¹. ̵»ØÄê»þ¤Ë¤ÏFontForge¤Ï¥Ô¥¯¥»¥ë¥µ¥¤¥º¤«¤é²òÁüÅÙ¤ò¿ä¬¤·¤Þ¤¹."; +static char *str_PrefsPopupPPT[] = "FontForge¤Ï¡¢¼«Æ°¥È¥ì¡¼¥¹¤ËÍѤ¤¤ë2¼ïÎà¤Î°Û¤Ê¤ë¥Ø¥ë¥Ñ¡¼\n¥¢¥×¥ê¥±¡¼¥·¥ç¥ó (autotrace¤Èpotrace)¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹.\n¥·¥¹¥Æ¥à¤ËÊÒÊý¤·¤«¤Ê¤±¤ì¤Ð¤½¤Á¤é¤ò»ÈÍѤ·,ξÊý¤¢¤ë¾ì¹ç¤Ï¤É¤Á¤é¤ò»ÈÍѤ¹¤ë¤«¤ò¤³¤Î¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤Þ¤¹"; +static char *str_PrefsPopupATA[] = "¼«Æ°¥È¥ì¡¼¥¹¥×¥í¥°¥é¥à(autotrace¤Þ¤¿¤Ïpotrace)¤Î´Ä¶­ÀßÄêÍѤËÄɲ乤ë°ú¿ô"; +static char *str_PrefsPopupATK[] = "autotrace¤òµ¯Æ°¤¹¤ëÅÙ¤Ë,¥æ¡¼¥¶¤Ë°ú¿ô¤ò³Îǧ¤¹¤ë"; +static char *str_PrefsPopupMFA[] = "mf (metafont)¥×¥í¥°¥é¥à¤ËÅϤ¹¥³¥Þ¥ó¥É. ¥Õ¥¡¥¤¥ë̾¤¬¤½¤Î¸å¤ËÉÕ¤±²Ã¤¨¤é¤ì¤Þ¤¹"; +static char *str_PrefsPopupMFK[] = "mf¤¬µ¯Æ°¤µ¤ì¤ëÅ٤˥桼¥¶¤Ëmf¤Ë¤Ä¤¤¤Æ¿Ò¤Í¤Þ¤¹"; +static char *str_PrefsPopupMFB[] = "FontForge¤Ï,autotrace¤ò¼Â¹Ô¤¹¤ëÁ°¤Ë²èÁü¤ò\n³Æʸ»ú¤ÎÇطʤËŽ¤ê¤Ä¤±¤Þ¤¹.\n¤³¤ì¤é¤Î²èÁü¤òmf½èÍý¤¬´°Î»¤·¤¿¸å¤â¸«¤ë¤³¤È¤¬\n¤Ç¤­¤ë¤è¤¦¤ËÊÝ»ý¤¹¤ë¤«,¥¹¥Ú¡¼¥¹¤ÎÀáÌó¤Î¤¿¤á¤Ëºï½ü¤¹¤ë¤«¤òÁª¤Ù¤Þ¤¹."; +static char *str_PrefsPopupMFE[] = "MetaFont (mf)¤Ïɸ½à½ÐÎϤËÂçÎ̤ξܺپðÊó¤òÀ¸À®¤·¤Þ¤¹.\n¤Û¤È¤ó¤É¤Î¾ì¹ç¤Ïñ¤Ê¤ë¼ÙËâʪ¤À¤È»×¤ï¤ì¤Þ¤¹¤¬,\n¤É¤³¤«°­¤¤½ê¤¬¤¢¤ë¾ì¹ç¤Ï½ÅÍפʰÕÌ£¤ò»ý¤Á¤Þ¤¹."; +static char *str_PrefsPopupG2N[] = "TrueType¤Þ¤¿¤ÏOpenType¥Õ¥©¥ó¥È¤òÀ¸À®¤¹¤ë»þ,TrueType¤Î¥°¥ê¥ÕID¤È\nʸ»ú̾¤Î´Ö¤ÎÂбþ¤¬Ê¬¤«¤ë¤ÈÊØÍø¤Ê¤³¤È¤¬¤è¤¯¤¢¤ê¤Þ¤¹. ¤³¤Î¥ª¥×¥·¥ç¥ó¤ò\n¥»¥Ã¥È¤¹¤ë¤È,FontForge¤Ï¤½¤Î¾ðÊó¤ò´Þ¤à(³ÈÄ¥»Ò.g2n¤Î¤Ä¤¤¤¿)¥Õ¥¡¥¤¥ë\n¤òºîÀ®¤·¤Þ¤¹"; +static char *str_PrefsPopupPCE[] = "Unicode¤ÈCJK¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¥Æ¡¼¥Ö¥ë¤ÎξÊý¤ò\n´Þ¤à¥Õ¥©¥ó¥È¤òÆɤ߹þ¤à»þ,¤É¤Á¤é¤òÆɤ߹þ¤ß¤Ë»ÈÍѤ¹¤ë¤«,¤³¤Î¥Õ¥é¥°¤Ç\n»ØÄꤷ¤Þ¤¹."; +static char *str_PrefsPopupXRF[] = "FontForge¤Ïµ¯Æ°»þ¤Ëɽ¼¨¤Ë´Ø¤¹¤ë°À­¤ò¥¹¥¯¥ê¡¼¥ó¤«¤é³ÍÆÀ¤·¤Þ¤¹.\n¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¤³¤ì¤é¤Î¥ê¥½¡¼¥¹¤ò¥Õ¥¡¥¤¥ë¤Ë³ÊǼ¤Ç¤­¤¿Êý¤¬ÊØÍø¤Ç¤¹.\n¤³¤ì¤é¤Î¥ê¥½¡¼¥¹¤Ïµ¯Æ°»þ¤Ë¤Î¤ßÆɤ߹þ¤Þ¤ì¤ë¤Î¤Ç,¤³¤ÎÃͤòÊѹ¹¤·¤Æ¤â\n¼¡²ó¤ÎFontForge¤Îµ¯Æ°»þ¤Þ¤Ç¸ú²Ì¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char *str_PrefsPopupCMD[] = "¥Õ¥©¥ó¥È¥Ó¥å¡¼¤«¤éʸ»ú¤ò¥³¥Ô¡¼¤¹¤ë»þ¤Ë,ʸ»ú¤Î¥á¥¿¥Ç¡¼¥¿(̾Á°¡¦¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¡¦¥³¥á¥ó¥ÈÅù)¤â¥³¥Ô¡¼¤¹¤ë"; +static char *str_PrefsPopupAGA = "Apple¤ÈMS/Adobe¤È¤Ç¤Ï,TrueType¤ÈOpenType¤Î¥Õ¥¡¥¤¥ë\n¥Õ¥©¡¼¥Þ¥Ã¥È¤¬°Û¤Ê¤ê¤Þ¤¹.\n¤³¤ÎÊÑ¿ô¤Ï,[¥Õ¥¡¥¤¥ë(F)¢ª¥Õ¥©¥ó¥È¤ò½ÐÎÏ(G)]¥À¥¤¥¢¥í¥°¤ÎApple¥Á¥§¥Ã¥¯¥Ü¥Ã¥¯¥¹¤ò\n¥Ç¥Õ¥©¥ë¥È¤Ç¥Á¥§¥Ã¥¯¤¹¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹.\n¼ç¤ÊÁê°ãÅÀ¤Ï: name¥Æ¡¼¥Ö¥ë¤Î'PostScript'̾¤Î°·¤¤¤¬°Û¤Ê¤ë\n ¥Ó¥Ã¥È¥Þ¥Ã¥×¥Ç¡¼¥¿¤¬³ÊǼ¤µ¤ì¤ë¥Æ¡¼¥Ö¥ë¤¬°Û¤Ê¤ë\n ³ÈÂç/½Ì¾®¤µ¤ì¤¿Ê£¹çʸ»ú¤Î°·¤¤¤¬°Û¤Ê¤ë\n morx(t)¥Æ¡¼¥Ö¥ë¤Ç¤Ê¤¯GSUB¤ò»È¤¦\n kern/opbd¥Æ¡¼¥Ö¥ë¤Ç¤Ê¤¯GPOS¤ò»È¤¦\nlcar/prep¤Ç¤Ï¤Ê¤¯GDEF¤ò»È¤¦\n ¤³¤Î¥Õ¥é¥°¤È¡ÖOpenType¡×¤ÎξÊý¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¤È,ξÊý¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹"; +static char *str_PrefsPopupAGO = "Apple¤ÈMS/Adobe¤È¤Ç¤Ï,TrueType¤ÈOpenType¤Î¥Õ¥¡¥¤¥ë\n¥Õ¥©¡¼¥Þ¥Ã¥È¤¬°Û¤Ê¤ê¤Þ¤¹.\n¤³¤ÎÊÑ¿ô¤Ï,[¥Õ¥¡¥¤¥ë(F)¢ª¥Õ¥©¥ó¥È¤ò½ÐÎÏ(G)]¥À¥¤¥¢¥í¥°¤ÎApple¥Á¥§¥Ã¥¯¥Ü¥Ã¥¯¥¹¤ò\n¥Ç¥Õ¥©¥ë¥È¤Ç¥Á¥§¥Ã¥¯¤¹¤ë¤«¤òÀ©¸æ¤·¤Þ¤¹.\n¼ç¤ÊÁê°ãÅÀ¤Ï: name¥Æ¡¼¥Ö¥ë¤Î'PostScript'̾¤Î°·¤¤¤¬°Û¤Ê¤ë\n ¥Ó¥Ã¥È¥Þ¥Ã¥×¥Ç¡¼¥¿¤¬³ÊǼ¤µ¤ì¤ë¥Æ¡¼¥Ö¥ë¤¬°Û¤Ê¤ë\n ³ÈÂç/½Ì¾®¤µ¤ì¤¿Ê£¹çʸ»ú¤Î°·¤¤¤¬°Û¤Ê¤ë\n morx(t)¥Æ¡¼¥Ö¥ë¤Ç¤Ê¤¯GSUB¤ò»È¤¦\n kern/opbd¥Æ¡¼¥Ö¥ë¤Ç¤Ê¤¯GPOS¤ò»È¤¦\nlcar/prep¤Ç¤Ï¤Ê¤¯GDEF¤ò»È¤¦\n ¤³¤Î¥Õ¥é¥°¤È¡ÖApple¡×¤ÎξÊý¤¬ÀßÄꤵ¤ì¤Æ¤¤¤ë¤È,ξÊý¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹"; +static char *str_PrefsPopupUndo = "1ʸ»ú¤Ë³ÊǼ¤µ¤ì¤ë¥¢¥ó¥É¥¥/¥ê¥É¥¥¤ÎºÇÂç²ó¿ô"; +static char *str_PrefsPopupHLP = "¥Ø¥ë¥×¥Õ¥¡¥¤¥ë¤Î¸¡º÷ÂоݤȤʤë¥í¡¼¥«¥ë\n¥·¥¹¥Æ¥à¾å¤Î¥Ç¥£¥ì¥¯¥È¥ê. ¥Õ¥¡¥¤¥ë¤¬\n¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç,FontForge¤Ï¥Í¥Ã¥È¤ò¸¡º÷¤·¤Þ¤¹"; +static char *str_PrefsPopupSAJ = "¥¢¥¦¥È¥é¥¤¥ó¥Ó¥å¡¼¾å¤ÇÅÀ¤ò¥É¥é¥Ã¥°¤·¤¹¤ë¤È,\nÀþ¤ò°ìÂ⽤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹(2ËܤÎ\n³«¤¤¤¿ÎسÔÀþ¤Ï,üÅÀƱ»Î¤Ç·ë¹ç²Äǽ¤Ç¤¹).\n¤³¤Î¥Õ¥é¥°¤¬¥ª¥ó¤Î¤È¤­¤Ï,·ë¹ç¤¬\n¹Ô¤ï¤ì¤ë¤È,FontForge¤ÏÁªÂòÉôʬ¤Î°ÜÆ°¤òÄä»ß¤·¤Þ¤¹\n(¥æ¡¼¥¶¤¬¥Þ¥¦¥¹¥Ü¥¿¥ó¤òÎ¥¤·¤¿»þ¤ÈƱÍͤǤ¹).\n¤³¤ì¤Ï»ØÀ褬¿Ì¤¨¤ä¤¹¤¤¿Í¤Ë¤ÏÊØÍø¤Ç¤¹"; +static char *str_PrefsPopupUF = "Êѹ¹¤ò¹Ô¤¦¤´¤È¤Ëflex¥Ò¥ó¥È¤òɽ¼¨¤¹¤ë"; +static char *str_Generic[] = "°ìÈÌ"; +static char *str_PrefsFontInfo[] = "¥Õ¥©¥ó¥È¾ðÊó"; +static char *str_PrefsApps[] = "¥¢¥×¥ê¥±¡¼¥·¥ç¥ó"; +static char *str_Editing[] = "ÊÔ½¸"; +static char *str_Accents[] = "¥¢¥¯¥»¥ó¥È"; +static char *str_ScriptMenu[] = "¥¹¥¯¥ê¥×¥È¥á¥Ë¥å¡¼"; +static char *str_Mac[] = "Mac"; +static char *str_MenuName[] = "¥á¥Ë¥å¡¼Ì¾"; +static char *str_ScriptMenuPopup[] = "¤è¤¯»È¤¦¥¹¥¯¥ê¥×¥È¤ò10¸Ä¤Þ¤ÇÅÐÏ¿¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹.\n¥á¥Ë¥å¡¼¤Î³Æ¹àÌܤˤÏ, ¥á¥Ë¥å¡¼¤Ëɽ¼¨¤¹¤ë̾Á°¤È, ¼Â¹Ô¤¹¤ë¥¹¥¯¥ê¥×¥È¤ò\n»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹. ¥á¥Ë¥å¡¼Ì¾¤Ë¤ÏǤ°Õ¤ÎUnicodeʸ»ú¤ò»ÈÍѤ¹¤ë¤³¤È¤¬\n¤Ç¤­¤Þ¤¹. \"...\"¤È¤¤¤¦¥é¥Ù¥ë¤¬¤Ä¤¤¤¿¥Ü¥¿¥ó¤ò²¡¤¹¤È, ¥¹¥¯¥ê¥×¥È¥Õ¥¡¥¤¥ë¤ò\n¸«¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹."; +static char *str_ScriptFile[] = "¥¹¥¯¥ê¥×¥È¥Õ¥¡¥¤¥ë"; +static char *str_BrowseForFile[] = "..."; +static char *str_MenuNameWithNoScript[] = "Âбþ¤¹¤ë¥¹¥¯¥ê¥×¥È¤Î¤Ê¤¤¥á¥Ë¥å¡¼Ì¾"; +static char *str_ScriptWithNoMenuName[] = "Âбþ¤¹¤ë¥á¥Ë¥å¡¼Ì¾¤Î¤Ê¤¤¥¹¥¯¥ê¥×¥È"; +static char *str_Features = "µ¡Ç½"; +static char *str_MappingB = "Âбþ"; +static char *str_Feature = "µ¡Ç½"; +static char *str_FeatureId = "µ¡Ç½ID:"; +static char mnemonic_FeatureId = 'I'; +static char *str_Name = "̾Á°(N):"; +static char mnemonic_Name = 'N'; +static char *str_ThisFeatureCodeIsAlreadyUsed = "¤³¤Îµ¡Ç½¥³¡¼¥É¤Ï´û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹"; +static char *str_BadName = "ÉÔÀµ¤Ê̾Á°"; +static char *str_Settings = "ÀßÄê"; +static char *str_Setting = "ÀßÄê"; +static char *str_FeatureC = "µ¡Ç½(F):"; +static char mnemonic_FeatureC = 'F'; +static char *str_Off = "¥ª¥Õ(O):"; +static char mnemonic_Off = 'O'; +static char *str_Mutex = "Áê¸ßÇÓ½ü(M)"; +static char mnemonic_Mutex = 'M'; +static char *str_ThisSettingCodeIsAlreadyUsed = "¤³¤Îµ¡Ç½¤ÈÀßÄê¤ÎÁȤ߹ç¤ï¤»¤Ï´û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹"; +static char *str_ThisSettingCodeIsAlreadyUsedReuse = "¤³¤Îµ¡Ç½¤ÈÀßÄê¤ÎÁȤ߹ç¤ï¤»¤Ï´û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹.\nËÜÅö¤ËºÆ»ÈÍѤ·¤Þ¤¹¤«?"; +static char *str_OffNameNull = "¥ª¥Õ»þ¤Î̾Á°¤¬¶õÇò¤Î¾ì¹ç,¥ª¥Õ¤Î¥³¡¼¥É¤Ï-1¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char *str_PrefsAppNotice1 = "Ä̾ï¤Ï, FontForge ¤Ï PATH ´Ä¶­ÊÑ¿ô¤òõº÷¤¹¤ë¤³¤È¤Ë" +static char *str_PrefsAppNotice2 = "¤è¤Ã¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¸«¤Ä¤±¤Þ¤¹.¤³¤Î¤Õ¤ë¤Þ¤¤¤ò"; +static char *str_PrefsAppNotice3 = "Êѹ¹¤·¤¿¤¤¾ì¹ç¤Ï,´Ä¶­ÊÑ¿ô¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó̾¤ò" +static char *str_PrefsAppNotice4 = "¥Õ¥ë¥Ñ¥¹¤Ç»ØÄꤷ¤Þ¤¹."; +static char *str_PrefsAppNotice5 = "FontForge¤Ï´Ä¶­ÊÑ¿ô BROWSER, MF ¤È AUTOTRACE ¤òǧ¼±¤·¤Þ¤¹"; +static char *str_PrefsAppNotice6 = "" + /* Hints */ +static char *str_base = "´ð½à(B):"; +static unichar_t mnemonic_base = 'B'; +static char *str_size = "¥µ¥¤¥º(S):"; +static unichar_t mnemonic_size = 'S'; +static char *str_HStem = "¿åÊ¿¥¹¥Æ¥à(H)"; +static unichar_t mnemonic_HStem = 'H'; +static char *str_VStem = "¿âľ¥¹¥Æ¥à(V)"; +static unichar_t mnemonic_VStem = 'V'; +static char *str_Create = "ºîÀ®(e)"; +static unichar_t mnemonic_Create = 'e'; +static char *str_PrevArrow = "< Á°(P)"; +static unichar_t mnemonic_PrevArrow = 'P'; +static char *str_NextArrow = "¼¡(N) >"; +static unichar_t mnemonic_NextArrow = 'N'; +static char *str_MovePoints = "ÅÀ¤ò°ÜÆ°¤¹¤ë(M)"; +static unichar_t mnemonic_MovePoints = 'M'; +static char *str_MovePointsPopup = "¥Ò¥ó¥È¤Î°ÌÃÖ¤¬Êѹ¹¤µ¤ì¤¿»þ,\n¤½¤Î¥Ò¥ó¥È¾å¤Ë°ÌÃÖ¤¹¤ëÁ´¤Æ¤ÎÅÀ¤Î°ÌÃÖ¤ò°ÜÆ°¤¹¤ë"; +static char *str_CreateHint = "¥Ò¥ó¥È¤òºîÀ®..."; +static char *str_CreateHorizontalHint = "¿åÊ¿¥¹¥Æ¥à¥Ò¥ó¥È¤òºîÀ®¤·¤Þ¤¹."; +static char *str_CreateVerticalHint = "¿âľ¥¹¥Æ¥à¥Ò¥ó¥È¤òºîÀ®¤·¤Þ¤¹."; + /* expand stroke */ +static char *str_LineCap = "Àþü"; +static char *str_Butt = "Butt"; +static unichar_t mnemonic_Butt = 'B'; +static char *str_Round = "Round"; +static unichar_t mnemonic_Round = 'R'; +static char *str_Squareq = "Square"; +static unichar_t mnemonic_Squareq = 'q'; +static char *str_LineJoin = "Àþ¤Î·ë¤Ó"; +static char *str_Miter = "Miter"; +static unichar_t mnemonic_Miter = 'M'; +static char *str_Roundu = "Round"; +static unichar_t mnemonic_Roundu = 'u'; +static char *str_Bevel = "Bevel"; +static unichar_t mnemonic_Bevel = 'v'; +static char *str_StrokeWidth = "¥¹¥È¥í¡¼¥¯Éý(W):"; +static unichar_t mnemonic_StrokeWidth = 'W'; +static char *str_Strok = "¥¹¥È¥í¡¼¥¯(S)"; +static unichar_t mnemonic_Stroke = 'S'; +static char *str_Caligraphic = "¥Ú¥ó½ñ¤­(C)"; +static unichar_t mnemonic_Caligraphic = 'C'; +static char *str_ElipseM = "Âʱß(E)"; +static unichar_t mnemonic_ElipseM = 'E'; +static char *str_PenAngle = "¥Ú¥ó¤Î³ÑÅÙ:"; +static unichar_t mnemonic_PenAngle = 'A'; +static char *str_PenHeightRatio = "¹â¤µ¤ÎÈæΨ(H):"; +static unichar_t mnemonic_PenHeightRatio = 'H'; +static char *str_MinorAxis = "û¼´(x):"; +static unichar_t mnemonic_MinorAxis = 'x'; +static char *str_PenHeightRatioPopup = "¥Ú¥ó½ñ¤­¸ú²Ì¤ÇÍѤ¤¤é¤ì¤ë¥Ú¥ó¤ÎÀèü¤Ï2¼¡¸µ¤ÎÃͤò\n¤â¤Ã¤Æ¤¤¤Þ¤¹. Éý(²¼¤Î¡Ö¥¹¥È¥í¡¼¥¯Éý(W)¡×¤ÇÀßÄê¤Ç¤­¤Þ¤¹)¤È,\nÂÀ¤µ¤Þ¤¿¤Ï¹â¤µ¤Ç¤¹. ¹â¤µ¤Ï,Éý¤È¤ÎÈæΨ¤Çɽ¤·¤¿ÃͤǤ¹."; +static char *str_BadStroke = "ÉÔÀµ¤Ê¥¹¥È¥í¡¼¥¯¤Ç¤¹"; +static char *str_StrokeWidthTooBig = "¥¹¥È¥í¡¼¥¯¤¬ÂÀ¤¹¤®¤ë¤Î¤Ç, %.100hs¤Ë´Þ¤Þ¤ì¤ëÀ¸À®¤µ¤ì¤¿¥Ñ¥¹¤¬¼«Ê¬¼«¿È¤È¸òº¹¤·¤Æ¤¤¤ë²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹"; +static char *str_FreeHand = "¥Õ¥ê¡¼¥Ï¥ó¥É"; +static char *str_CenterLine = "Éý¤ò¤Ä¤±¤Ê¤¤(D)"; +static char *mnemonic_CenterLine = 'D'; +static char *str_CenterLinePopup = "¥Õ¥ê¡¼¥Ï¥ó¥É¥Ä¡¼¥ë¤ÇÉÁ¤¤¤¿¥¹¥×¥é¥¤¥ó¤Ï³ÈÄ¥¤µ¤ì¤º, ÉÁ¤¤¤¿Àþ¤¬¤½¤Î¤Þ¤ÞÀ¸À®¤µ¤ì¤Þ¤¹"; +static char *str_Pressure = "É®°µ(P):"; +static char *mnemonic_Pressure = 'P'; +static char *str_PressurePopup = "É®°µ¤Î½ªÅÀ¤òÀßÄꤹ¤ë¤Ë¤Ï,wacom¤ÎÉ®°µ´¶ÃΥġ¼¥ë¤Ç¤³¤ÎÀµÊý·Á¤ò²¡¤·¤Æ¤¯¤À¤µ¤¤"; +static char *str_RmInternalContour = "Æ⦤ÎÎسÔÀþ¤òºï½ü¤¹¤ë"; +static char *str_RmExternalContour = "³°Â¦¤ÎÎسÔÀþ¤òºï½ü¤¹¤ë"; +static char *str_NotInternalAndExternal = "³°Â¦¤ÈÆ⦤ÎÎسԤòξÊýºï¤ë¤Î¤Ï̵°ÕÌ£¤Ç¤¹"; +static char *str_CleanupSelfIntersect = "¼«¸Ê¸òº¹¤ò½üµî¤¹¤ë"; +static char *str_CleanupSelfIntersectPopup = "³ÈÄ¥¤·¤¿ÎسÔÀþ¤¬¼«¸Ê¸òº¹¤·¤Æ¤¤¤ë¤³¤È¤ò\nFontForge¤¬¸¡½Ð¤·¤¿¤È¤­,¤³¤Î¥ª¥×¥·¥ç¥ó¤¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤ë¤È,\nÀþ¤Î¸òº¹¤ò¼è¤ê½ü¤¤¤Æ·ë²Ì¤ò²þÁ±¤·¤è¤¦¤È»î¤ß¤Þ¤¹"; + /* Auto Width/Kern */ +static char *str_EnterTwoCharRange = "º¸±¦¤ËÍè¤ëʸ»ú¤ÎÈϰϤò"; +static char *str_ToBeAdjusted = "»ØÄꤷ¤Æ¤¯¤À¤µ¤¤."; +static char *str_CharsLeft = "º¸Â¦¤Îʸ»ú"; +static char *str_CharsRight = "±¦Â¦¤Îʸ»ú"; +static char *str_All = "Á´Éô"; +static char *str_stdCharRange = "A-Za-z0-9"; +static unichar_t *str_stdCharRangeGreek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '\0' }; +static unichar_t *str_stdCharRangeCyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '\0' }; +static char *str_StdCharRangeKernL = "A-Za-z"; +static char *str_StdCharRangeKernR = "a-z.,:;-"; +static char *str_StdCharRangeKernR2 = "A-Za-z.,:;-"; +static unichar_t *str_StdCharRangeKernRCyr = { 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_StdCharRangeKernR2Cyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_stdCharRangeKernRGreek = { 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static unichar_t *str_stdCharRangeKernR2Greek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static char *str_Selected = "ÁªÂòÃæ¤Îʸ»ú"; +static char *str_Spacing = "¥¹¥Ú¡¼¥·¥ó¥°"; +static char *str_TotalKerns = "¥«¡¼¥Ë¥ó¥°¤ÎÁí¿ô:"; +static char *str_Threshold = "¤·¤­¤¤ÃÍ:"; +static char *str_NoCharsSelected = "ÁªÂò¤µ¤ì¤¿Ê¸»ú¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_KernPairFilePopup = "³Æ¹Ô¤Ë2¤Ä¤Îʸ»ú¤¬´Þ¤Þ¤ì¤ë, ¥«¡¼¥Ë¥ó¥°¥Ú¥¢¤Î\n¥ê¥¹¥È¤ò´Þ¤à¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤ß¤Þ¤¹. FontForge¤Ï\n¥«¡¼¥Ë¥ó¥°¾ðÊó¤ò¤³¤ì¤é¤Îʸ»ú¤ÎÁȤˤĤ¤¤Æ¤·¤«¸¡Æ¤¤·¤Þ¤»¤ó."; +static char *str_LoadKernPairs = "¥«¡¼¥Ë¥ó¥°¥Ú¥¢¤òÆɤ߹þ¤à"; +static char *str_NoKernPairs = "¥«¡¼¥Ë¥ó¥°¥Ú¥¢¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_NoKernPairsFile = "%.200hs ¤Ë¤Ï¥«¡¼¥Ë¥ó¥°¥Ú¥¢¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó."; + /* Auto Trace */ +static char *str_NothingToTrace = "¥È¥ì¡¼¥¹¤¹¤ëʪ¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_NoAutotrace = "autotrace¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó."; +static char *str_NoAutotraceProg = "¥×¥í¥°¥é¥à\"autotrace\"¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó.(´Ä¶­ÊÑ¿ôAUTOTRACE¤ò¥»¥Ã¥È¤·¤Æ¤¯¤À¤µ¤¤)"; +static char *str_AdditionalAutotraceArgs = "autotrace¥×¥í¥°¥é¥à¤Ø¤ÎÄɲäΰú¿ô:"; +static char *str_NoMF = "mf¤ò¼Â¹Ô¤Ç¤­¤Þ¤»¤ó"; +static char *str_NoMFProg = "¥×¥í¥°¥é¥àmf¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡½ metafont(´Ä¶­ÊÑ¿ôMF¤ËÀßÄꤷ¤Þ¤¹)¤È¤·¤Æ¼Â¹Ô¤¹¤ë¤«,\n¤½¤ì¤ò´Þ¤àTeX ¤Î¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥·¥ç¥ó¤ò\n http://www.tug.org/\n http://www.ctan.org/\n¤«¤é¥À¥¦¥ó¥í¡¼¥É¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"; +static char *str_NoTempDir = "°ì»þ¥Ç¥£¥ì¥¯¥È¥ê¤òºîÀ®¤Ç¤­¤Þ¤»¤ó."; +static char *str_CantRunMF = "mf¤ò¼Â¹Ô¤Ç¤­¤Þ¤»¤ó."; +static char *str_MFHadError = "MetaFont¤¬°Û¾ï½ªÎ»¤·¤Þ¤·¤¿."; +static char *str_MFBadOutput = "mf¤Î½ÐÎÏ¥Õ¥¡¥¤¥ë¤òÆɤ߹þ¤á¤Þ¤»¤ó(¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤È»×¤ï¤ì¤Þ¤¹)."; + /* Bitmap dlg */ +static char *str_AllChars = "¤¹¤Ù¤Æ¤Îʸ»ú"; +static char *str_SelChars = "ÁªÂò¤µ¤ì¤¿Ê¸»ú"; +static char *str_CurChar = "¸½ºß¤Îʸ»ú"; +static char *str_BadRegenSize = "»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¥Ô¥¯¥»¥ë¿ô¤Îʸ»ú¤ÎºÆÀ¸À®¤ò»î¤ß¤ë: "; +static char *str_PixelSizes = "Pixel Sizes:"; +static char *str_listPixelSizes = "¸½ºß´Þ¤Þ¤ì¤ë¥Ó¥Ã¥È¥Þ¥Ã¥×¤Î¥Ô¥¯¥»¥ë¿ô¤Î¥ê¥¹¥È"; +static char *str_RemovingSize = " ¥µ¥¤¥º¤ò¾Ãµî¤¹¤ë¤Èºï½ü¤µ¤ì¤Þ¤¹."; +static char *str_AddingSize = " ¥µ¥¤¥º¤òÄɲ乤ë¤ÈºîÀ®¤µ¤ì¤Þ¤¹."; +static char *str_AddingSizeScale = " ¥µ¥¤¥º¤òÄɲ乤ë¤È, ³ÈÂç/½Ì¾®¤ò¹Ô¤Ã¤ÆºîÀ®¤·¤Þ¤¹."; +static char *str_SpecifyRegenSizes = "ºÆÀ¸À®¤¹¤ë¥Ó¥Ã¥È¥Þ¥Ã¥×¤Î¥µ¥¤¥º¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤"; +static char *str_PointSizes75 = "75 dpi ²èÌ̤ǤΥݥ¤¥ó¥È¿ô"; +static char *str_PointSizes100 = "100 dpi ²èÌ̤ǤΥݥ¤¥ó¥È¿ô"; +static char *str_PointSizes96 = "96 dpi ²èÌ̤ǤΥݥ¤¥ó¥È¿ô"; +static char *str_PointSizes120 = "120 dpi ²èÌ̤ǤΥݥ¤¥ó¥È¿ô"; +static char *str_PointSizes72 = "72 dpi ²èÌ̤ǤΥݥ¤¥ó¥È¿ô"; +static char *str_XSizes = "X"; +static char *str_WinSizes = "Win"; +static char *str_MacSizes = "Mac"; +static char *str_UseFreeType = "FreeType¤ò»È¤¦"; +static char *str_ScalingBitmaps = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤ò³ÈÂç/½Ì¾®Ãæ"; +static char *str_CantScaleGreymap = "greymap¥Õ¥©¥ó¥È¤ò³ÈÂç/½Ì¾®¤Ç¤­¤Þ¤»¤ó."; +static char *str_CantDeleteAllBitmaps = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤òÁ´ºï½ü¤Ç¤­¤Þ¤»¤ó."; + /* Bitmap view */ +/* "%s at %d size %d from %s", charactername, encoding, pixelsize, fontname */ +static char *str_BvTitle = "%1$.80hs at %2$d size %3$d from %4$.80hs"; +static char *str_RecalculateBitmaps = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤òºÆ·×»»"; + /* BV Edit */ +static char *str_skewRatio = "Y¼´¤Î¹â¤µ¤ËÂФ¹¤ëX¼´¤ÎÏĤߤÎÈæΨ¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤."; +static char str_BadNumber[] = "¿ôÃͤ¬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹."; + /* Char View */ +/* "%s at %d from %s", charactername, encoding, fontname */ +static char *str_CvTitle = "%1$.80hs at %2$d from %3$.90hs" +static char *str_CantFindGlyph = "¥°¥ê¥Õ¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó"; +static char *str_CantRevertGlyph = "¥°¥ê¥Õ%.80hs¤Ïsfd¥Õ¥¡¥¤¥ë¤ÎÃæ¤Ë¸«¤Ä¤«¤ê¤Þ¤»¤ó."; +static char *str_GlyphHasRefs = "ÌäÂê¤Î¤¢¤ë»²¾È¤Ç¤¹"; +static char *str_GlyphHasRefsQuestion = "ʸ»ú%.40hs¤Ë¤Ï»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¤¬,¥Õ¥©¥ó¥È¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹. ¤³¤ì¤é¤Î»²¾È¤òÀµ¤·¤¤¾ì½ê¤ËÂбþ¤Å¤±¤ë¤Î¤Ï¤ª¤½¤é¤¯ÉÔ²Äǽ¤À¤È»×¤ï¤ì¤Þ¤¹. ¤³¤Î¤Þ¤Þ½èÍý¤ò³¤±¤ì¤Ð¤¤¤¯¤Ä¤«¤Î»²¾È¤Ï¼º¤ï¤ì, »Ä¤ê¤Ï´Ö°ã¤Ã¤¿Ê¸»ú¤Ë¥ê¥ó¥¯¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦. ¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char *str_NameChanged = "¥°¥ê¥Õ̾¤¬Êѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹"; +static char *str_NameChangedGlyph = "ʸ»ú̾%.40¤ÏÊѹ¹¤µ¤ì¤Æ¤¤¤Þ¤¹. ¥Õ¥¡¥¤¥ë¤Î¥°¥ê¥Õ¤ò¸¡º÷¤¹¤ë¤Î¤Ë¤Ï¤³¤Î̾Á°¤ò»È¤Ã¤Æ¤­¤¿¤Î¤Ç,¤³¤Îʸ»ú¤òÉü¸µ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó\n(¤³¤ì°Ê¹ß¤Îʸ»ú¤Ç¤Ï·Ù¹ð¤Ï¾Êά¤µ¤ì¤Þ¤¹)"; +static char *str_NotForeground = "Á°Ì̤ǤϤ¢¤ê¤Þ¤»¤ó"; +static char *str_RefsOnlyFore = "»²¾È¤ò¥É¥é¥Ã¥°¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤ÏÁ°Ì̥쥤¥ä¤À¤±¤Ç¤¹"; + /* CV Export */ +static char *str_PixelSizeQ = "¥Ô¥¯¥»¥ë¿ô¤Ï¤¤¤¯¤Ä¤Ç¤¹¤«?"; +static char *str_PixelSize = "¥Ô¥¯¥»¥ë¿ô:"; +static char *str_BitsPerPixel = "¥Ô¥¯¥»¥ë³¬Ä´¤Î¥Ó¥Ã¥È¿ô:"; +static char *str_InvalidBits = "¥Ô¥¯¥»¥ë³¬Ä´¤Î¥Ó¥Ã¥È¿ô¤È¤·¤Æ»È¤¨¤ëÃÍ¤Ï 1, 2, 4, 8 ¤À¤±¤Ç¤¹."; + /* CV Images */ +static char *str_CantFindFile = "¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó."; +static char *str_BadXFigFile = "xfig¥Õ¥¡¥¤¥ë¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_BadImageFile = "²èÁü¥Õ¥¡¥¤¥ë¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_BadImageFileName = "²èÁü¥Õ¥¡¥¤¥ë %.100hs ¤ÏÉÔÀµ¤Ç¤¹."; +static char *str_BadImageFileNotBitmap = "¥Õ¥¡¥¤¥ë %.100hs ¤Ï²èÁü¥Õ¥¡¥¤¥ë¤È¤·¤ÆÉÔÀµ¤Ç¤¹. ¥Ó¥Ã¥È¥Þ¥Ã¥×¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NothingLoaded = "²¿¤âÆɤ߹þ¤ó¤Ç¤¤¤Þ¤»¤ó."; +static char *str_NothingSelected = "²¿¤âÁªÂò¤µ¤ì¤Æ¤¤¤Þ¤»¤ó."; +static char *str_MoreImagesThanSelected = "ÁªÂò¤µ¤ì¤¿Ê¸»ú¿ô¤è¤ê¤â¿¤¯¤Î²èÁü¤¬¤¢¤ê¤Þ¤¹."; +static char *str_BadTemplate = "¥Æ¥ó¥×¥ì¡¼¥È¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_BadTemplateNoExtension = "¥Æ¥ó¥×¥ì¡¼¥È¤¬ÉÔÀµ¤Ç¤¹. ³ÈÄ¥»Ò¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_BadTemplateUnrecognized = "¥Æ¥ó¥×¥ì¡¼¥È¤¬ÉÔÀµ¤Ç¤¹. ǧ¼±²Äǽ¤Ê¥Õ¥©¡¼¥Þ¥Ã¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_UnicodeNotInFont = "¤½¤ÎUnicodeÃͤϥե©¥ó¥ÈÆâ¤Ë¤¢¤ê¤Þ¤»¤ó."; +static char *str_UnicodeValueNotInFont = "¥Õ¥©¥ó¥È¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤UnicodeÃÍ (%x) ¤ò̵»ë¤·¤Þ¤·¤¿."; +static char *str_EncodingNotInFont = "ʸ»ú¥³¡¼¥É¤¬¥Õ¥©¥ó¥ÈÆâ¤Ë¤¢¤ê¤Þ¤»¤ó."; +static char *str_EncodingValueNotInFont = "¥Õ¥©¥ó¥ÈÆâ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤Ê¸»ú¥³¡¼¥É (%x) ¤ò̵»ë¤·¤Þ¤·¤¿."; +static char *str_Image = "²èÁü"; +static char *str_TeXBitmap = "TeX¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×"; +static char *str_MacBitmap = "Mac¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×"; +static char *str_Template = "²èÁü¥Æ¥ó¥×¥ì¡¼¥È"; +static char *str_EPSTemplate = "EPS¥Æ¥ó¥×¥ì¡¼¥È"; +static char *str_SVGTemplate = "SVG¥Æ¥ó¥×¥ì¡¼¥È"; +static char *str_AsBackground = "ÇطʤȤ·¤Æ»ÈÍÑ"; +static char *str_OnlyOneFont = "¥Õ¥©¥ó¥È¤Ï1¸Ä¤·¤«»ØÄê¤Ç¤­¤Þ¤»¤ó."; +static char *str_OnlyOneFontBackground = "Çطʤ˼è¤ê¹þ¤ß²Äǽ¤Ê¥Õ¥©¥ó¥È¤Ï1¸Ä¤À¤±¤Ç¤¹."; + /* CV Palettes */ +static char *str_SizeOfPoints="¥Ý¥¤¥ó¥È¿ô"; +static char *str_Regular="Regular"; +static char *str_Points="¥Ý¥¤¥ó¥È¿ô:"; +static char *str_RRRad="³Ñ´ÝĹÊý·Á¤ÎȾ·Â"; +static char *str_WithinBoundingBox="¥Ð¥¦¥ó¥Ç¥£¥ó¥°¥Ü¥Ã¥¯¥¹"; +static char *str_CenterOut="Center Out"; +static char *str_Polygon="¿³Ñ·Á"; +static char *str_Star="À±·Á"; +static char *str_NumPSVert="À±¤Î¥Ä¥Î¤Î¿ô/¿³Ñ·Á¤ÎĺÅÀ¤Î¿ô"; +/* V is an abbreviation for "Visible", and E for Editable */ +static char *str_V="V"; +static char *str_E="E"; +static char *str_Layer="¥ì¥¤¥ä¡¼"; +static char *str_IsEdit="¥ì¥¤¥ä¡¼¤ÏÊÔ½¸²Äǽ¤«"; +static char *str_IsVis="¥ì¥¤¥ä¡¼¤¬¸«¤¨¤ë¤«"; +/* For Foreground. Should be short */ +static char *str_Fore="Á°ÌÌ"; +static char *mnemonic_Fore="o"; +static char *str_Back="ÇØÌÌ"; +static char *mnemonic_Back="B"; +static char *str_Grid="¥¬¥¤¥É"; +static char *mnemonic_Grid="G"; +static char *str_HHints="¿åÊ¿¥Ò¥ó¥È"; +static char *str_VHints="¿âľ¥Ò¥ó¥È"; +static char *str_DHints="ľ¸ò¥Ò¥ó¥È"; +static char *str_HMetrics="²£½ñ¤­¥á¥È¥ê¥Ã¥¯"; +static char *str_VMetrics="½Ä½ñ¤­¥á¥È¥ê¥Ã¥¯"; +static char *str_Anchors="¥¢¥ó¥«¡¼"; +static char *str_Blues="BlueÃÍ"; +static char *str_Bitmap="¥Ó¥Ã¥È¥Þ¥Ã¥×"; +static char *str_ShapeType = "¿Þ·Á¤Î¥¿¥¤¥×"; +/* Popups */ +static char *str_Pointer = "¥Ý¥¤¥ó¥¿"; +static char *str_PopMag = "³ÈÂç (alt¥­¡¼¤ÈÊ»ÍѤ¹¤ë¤È½Ì¾®)"; +static char *str_FreeCurve = "¥Õ¥ê¡¼¥Ï¥ó¥É¶ÊÀþ¤òÉÁ²è"; +static char *str_ScrollByHand = "¼êÆ°¥¹¥¯¥í¡¼¥ë"; +static char *str_AddCurvePoint = "¶ÊÀþ¾å¤ÎÅÀ¤òÄɲÃ"; +static char *str_AddCornerPoint = "ĺÅÀ¤òÄɲÃ"; +static char *str_AddTangentPoint = "¶ÊÀþ¤ÈľÀþ¤ÎÀÜÅÀ¤òÄɲÃ"; +static char *str_AddPenPoint = "ÅÀ¤òÄɲä·¤¿¸å¤ËÀ©¸æÅÀ¤ò°ú¤­½Ð¤¹"; +static char *str_popKnife = "¶ÊÀþ¤ò2¤Ä¤Ëʬ³ä"; +static char *str_popRuler = "ÅÀ¤ÈÅÀ¤Î´Ö¤Îµ÷Î¥¡¦³ÑÅÙ¤ò·×¤ë"; +static char *str_popScale = "ÁªÂòÈϰϤò³ÈÂç/½Ì¾®"; +static char *str_popFlip = "ÁªÂòÈϰϤòȿž"; +static char *str_popRotate = "ÁªÂòÈϰϤò²óž"; +static char *str_popSkew = "ÁªÂòÈϰϤòÏĤޤ»¤ë"; +static char *str_popRectElipse = "ĹÊý·Á¡¦Âʱß"; +static char *str_popPolyStar = "¿³Ñ·Á¡¦À±·Á"; +static char *str_popPencil = "¥Ô¥¯¥»¥ë¤ò¥»¥Ã¥È/¥¯¥ê¥¢"; +static char *str_popLine = "Àþ¤ò°ú¤¯"; +static char *str_popShift = "¥Ó¥Ã¥È¥Þ¥Ã¥×Á´ÂΤò¥·¥Õ¥È"; +static char *str_popHand = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤ò¥¹¥¯¥í¡¼¥ë"; + /* Undoes */ +static char *str_BitmapPaste = "¥Ó¥Ã¥È¥Þ¥Ã¥×Ž¤ê¤Ä¤±"; +static char *str_YesToAll = "Á´¤Æ¤Ï¤¤(A)"; +static char *mnemonic_YesToAll = 'A'; +static char *str_NoToAll = "Á´¤Æ¤¤¤¤¤¨(o)"; +static char *mnemonic_NoToAll = 'o'; +/* "The clipboard contains a bitmap character of size %d,\na size which is not in your database.\nWould you like to create a bitmap font of that size,\nor ignore this character?" */ +static char *str_ClipContainsPre = "¥¯¥ê¥Ã¥¯¥Ü¡¼¥É¤Ë¤Ï°Ê²¼¤Î¥µ¥¤¥º "; +static char *str_ClipContainsPost = " ¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×ʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹,\n¤³¤ì¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¤Ï¤¢¤ê¤Þ¤»¤ó.\n¤³¤Î¥µ¥¤¥º¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×¤òºîÀ®¤·¤Þ¤¹¤«, ¤½¤ì¤È¤â¤³¤Îʸ»ú¤ò̵»ë¤·¤Þ¤¹¤«?"; +static char *str_Pasting = "¥Ú¡¼¥¹¥ÈÃæ..."; +static char *str_SelfRef = "ʸ»ú¤¬¼«¸Ê»²¾È¤·¤Æ¤¤¤Þ¤¹." +static char *str_AttemptSelfRef = "¼«Ê¬¼«¿È¤ò»²¾È¤¹¤ëʸ»ú¤òºî¤í¤¦¤È¤·¤Þ¤·¤¿."; +static char *str_BadReference = "»²¾È¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_FontNoRef = "%1$hs ¤Ø¤Î»²¾È¤ò %2$hs ¤ËŽ¤ê¤Ä¤±¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹¤¬,\n¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ï %1$hs ¤Ï¸ºß¤·¤Þ¤»¤ó.\n¸µ¤Î¶ÊÀþ¤ò¥³¥Ô¡¼¤·¤Þ¤¹¤«? (¤½¤ì¤È¤â¤³¤Î»²¾È¤ò\nºï½ü¤·¤Þ¤¹¤«?)"; +static char *str_FontNoRefNoOrig = "%1$hs ¤Ø¤Î»²¾È¤ò %2$hs ¤ËŽ¤ê¤Ä¤±¤è¤¦¤È¤·¤Æ¤¤¤Þ¤¹¤¬,\n¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ï %1$hs ¤Ï¸ºß¤»¤º, »²¾È¤µ¤ì¤¿¸µ¤Îʸ»ú¤â¸«¤Ä¤«¤ê¤Þ¤»¤ó.\n¥³¥Ô¡¼¤Ï¹Ô¤ï¤ì¤Þ¤»¤ó."; +static char *str_DontWarnAgain = "º£¸å¤Ï·Ù¹ð¤·¤Ê¤¤(W)"; +static char *mnemonic_DontWarnAgain = 'W'; +static char *str_NoVerticalMetrics = "½Ä½ñ¤­¥á¥È¥ê¥Ã¥¯¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_FontNoVerticalMetrics = "¤³¤Î¥Õ¥©¥ó¥È¤Ç¤Ï, ½Ä½ñ¤­¥á¥È¥ê¥Ã¥¯¤¬ÍøÍѲÄǽ¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤»¤ó."; +static char *str_DupAnchor = "¥¢¥ó¥«¡¼¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹."; +static char *str_DupAnchorIn = "%1$.40s¤È¤¤¤¦Ì¾Á°¤Î¥¢¥ó¥«¡¼¥Ý¥¤¥ó¥È¤Ï´û¤Ë%2$.40hs¤Ë¤¢¤ê¤Þ¤¹." +static char *str_AnchorLost = "¥¢¥ó¥«¡¼¤¬¼º¤ï¤ì¤Þ¤·¤¿"; +static char *str_AnchorLostPaste = "¿·¤·¤¤¥Õ¥©¥ó¥È¤ËÂбþ¤¹¤ë¥¢¥ó¥«¡¼¥¯¥é¥¹¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤¿¤á,¥Õ¥©¥ó¥È¤ò¥Ú¡¼¥¹¥È¤·¤¿»þ¤Ë¤¤¤¯¤Ä¤«¤Î¥¢¥ó¥«¡¼ÅÀ¤¬¼º¤ï¤ì¤Þ¤·¤¿."; + /* dump pfa */ +static char *str_CvtPS = "PostScript¤ËÊÑ´¹Ãæ"; + /* encoding */ +static char *str_BadEncFormat = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¥Õ¥¡¥¤¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_PleaseNameEnc = "¤³¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ë̾Á°¤ò¤Ä¤±¤Æ¤¯¤À¤µ¤¤."; +/* Either insert first, second or third, or the number followed by the "th" string (5th, 6th, etc.) */ +/* Please name the %d/first/second/third encoding in this file" */ +static char *str_PleaseNameEncPre = "¤³¤Î¥Õ¥¡¥¤¥ëÆâ¤Î"; +static char *str_PleaseNameEncPost = "¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ë̾Á°¤ò¤Ä¤±¤Æ¤¯¤À¤µ¤¤."; +static char *str_First = "ºÇ½é"; +static char *str_Second = "2ÈÖÌÜ"; +static char *str_Third = "3ÈÖÌÜ"; +static char *str_th = "ÈÖÌÜ"; +static char *str_RemoveEncoding = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òºï½ü"; +static char *str_LoadEncoding = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÆɤ߹þ¤à"; +static char *str_AdobePUA = "Adobe¸ø³«¤Î³°»úÄêµÁ"; +static char *str_Interpretation = "²ò¼á:"; +static char *str_UseCidMap = "CID Map¤ò»ÈÍÑ"; +static char *str_SearchForCIDMap = "¤³¤Î¥Õ¥©¥ó¥È¤Ï %1$.20hs-%2$.20hs-%3$d ¤Ë´ð¤Å¤¤¤Æ¤¤¤Þ¤¹¤¬,\n¸«¤Ä¤«¤Ã¤¿¤¦¤Á¤ÇºÇ¤â¶á¤¤¤Î¤Ï %1$.20hs-%2$.20hs-%4$d¤Ç¤¹.\n¤³¤ì¤ò»È¤¤¤Þ¤¹¤«, ¾ì½ê¤ò»ØÄꤷ¤Þ¤¹¤«?"; +static char *str_UseIt = "¤³¤ì¤ò»È¤¦(U)"; +static char mnemonic_UseIt = 'U'; +static char *str_Search = "¸¡º÷(S)"; +static char mnemonic_Search = 'S'; +static char *str_GiveUp = "¤¢¤­¤é¤á¤ë(G)"; +static char mnemonic_GiveUp = 'G'; +static char *str_NoCidmap = "cidmap¥Õ¥¡¥¤¥ë¤¬¤¢¤ê¤Þ¤»¤ó..." +static char *str_LookForCidmap = "FontForge ¤Ï¤³¤Î¥Õ¥©¥ó¥È¤ËÂбþ¤¹¤ëcidmap¤ò¸«¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¤Ç¤·¤¿.\n¤³¤ì¤Ïɬ¿Ü¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¤¬, ¤³¤Î¥Õ¥¡¥¤¥ë¤¬¤¢¤Ã¤¿¤Û¤¦¤¬¤¦¤Þ¤¯Æ¯¤¯½èÍý¤¬\n¤¤¤¯¤Ä¤«¤¢¤ê¤Þ¤¹.\n¤Þ¤Àcidmap¤ò¥À¥¦¥ó¥í¡¼¥É¤·¤Æ¤¤¤Ê¤¤¤Ê¤é¤Ð, \nhttp://FontForge.sourceforge.net/cidmaps.tgz\n¤«¤é¥À¥¦¥ó¥í¡¼¥É¤·, gunzip ¤Î¸å tar ¤ÇŸ³«¤·¤Æ\n %.80hs\n¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤·¤Æ¤¯¤À¤µ¤¤.\n\nŬÀڤʥե¡¥¤¥ë¤ò¥í¡¼¥«¥ë¥Ç¥£¥¹¥¯Æâ¤Çõ¤·¤Þ¤¹¤«?"; +static char *str_AreYouSureCharset = "¸«¤Ä¤«¤Ã¤¿cidmap¥Õ¥¡¥¤¥ë¤ò»È¤ï¤Ê¤¤¤ÇËÜÅö¤Ë¤¤¤¤¤Ç¤¹¤«?"; +static char *str_FindCharset = "cidmap¥Õ¥¡¥¤¥ë¤òȯ¸«¤·¤Þ¤·¤¿..." +static char *str_Browse = "Browse..."; +static char mnemonic_Browse = 'B'; +static char *str_SelectCIDOrdering = "CID¥Õ¥©¥ó¥È¤Îʸ»ú½¸¹ç̾ (ordering) ¤ò»ØÄꤷ¤Æ¤¯¤À¤µ¤¤." +static char *str_ExtraCharsTitle = ";ʬ¤Êʸ»ú"; +static char *str_ExtraChars = "¸½ºß¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ë¤Ï, Âбþ¤¹¤ëCID¤¬¸«¤Ä¤«¤é¤Ê¤¤Ê¸»ú¤¬¤¢¤ê¤Þ¤¹.\nºï½ü¤·¤Þ¤¹¤«, ¤½¤ì¤È¤âËöÈø¤ËÄɲä·¤Þ¤¹¤« (¾­Íè, Êä°ä½¸¹ç¤¬Äɲ䵤줿\n»þ¤Ë¸ß´¹À­¤¬¤¢¤ê¤Þ¤»¤ó)?"; +static char *str_FindCMap = "Adobe CMap¥Õ¥¡¥¤¥ë¤òõ¤¹..."; +static char *str_NotACIDFont = "CID¥Õ¥©¥ó¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_MultipleEncodingIgnored = "¾¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ï̵»ë¤µ¤ì¤Þ¤¹."; +static char *str_CIDGlyphMultEncoded = "CID %d ¤Î¥°¥ê¥Õ¤Ë¤Ï, %d ¸Ä¤è¤ê¿¤¯¤Î¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤¬\n³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤Þ¤¹. ºÇ½é¤Î %d ¸Ä¤Î¤ß¤¬½èÍý¤µ¤ì¤Þ¤¹."; + + /* fv composit */ +static char *str_MissingChar = "ÉÔ­¤Îʸ»ú..."; +static char *str_Missingdotlessi="¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ïʸ»údotlessi¤¬¤¢¤ê¤Þ¤»¤ó.\nʸ»ú¤òÄɲä·¤Æ, ¥¢¥¯¥»¥ó¥Èʸ»ú¤òºÆºîÀ®¤·¤Æ¤¯¤À¤µ¤¤."; +static char *str_Missingdotlessj="¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ïʸ»údotlessj¤¬¤¢¤ê¤Þ¤»¤ó.\nʸ»ú¤òÄɲä·¤Æ, ¥¢¥¯¥»¥ó¥Èʸ»ú¤òºÆºîÀ®¤·¤Æ¤¯¤À¤µ¤¤."; + /* fv fonts */ +static char *str_MergingProb = "¹çÊ»½èÍýÃæ¤ËÌäÂ꤬ȯÀ¸¤·¤Þ¤·¤¿."; +static char *str_MergingFontSelf = "¥Õ¥©¥ó¥È¤ò¼«Ê¬¼«¿È¤È¹çÊ»¤·¤Æ¤â²¿¤âµ¯¤³¤ê¤Þ¤»¤ó."; +static char *str_MergingCIDMismatch = "CID¥Õ¥©¥ó¥È¤ò¹çÊ»¤¹¤ë¤È¤­¤Ë¤Ï,¥ì¥¸¥¹¥È¥ê¤Èʸ»ú½¸¹ç̾¤¬Åù¤·¤¯,ʸ»ú¤¬Äɲ䵤ì¤ëÊý¤ÎÊä°äÈֹ椬¤â¤¦ÊÒÊý¤ÈƱ¤¸¤«Â礭¤¤É¬Íפ¬¤¢¤ê¤Þ¤¹. ¤½¤ì¤Ë²Ã¤¨,Äɲ䵤ì¤ë¦¤ÏÄɲÃʬ¤ÈƱ¤¸¤«¤è¤ê¿¤¤¸Ä¿ô¤Î¥µ¥Ö¥Õ¥©¥ó¥È¤ò´Þ¤ó¤Ç¤¤¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"; +static char *str_Other = "¤½¤Î¾ ..." +static char *str_FontToMergeInto = "%.20hs ¤È¹çÊ»¤¹¤ë¥Õ¥©¥ó¥È."; +static char *str_InterpolatingProb = "Êä´Ö½èÍýÃæ¤ËÌäÂ꤬ȯÀ¸¤·¤Þ¤·¤¿."; +static char *str_InterpolatingFontSelf = "¥Õ¥©¥ó¥È¤ò¼«Ê¬¼«¿È¤ÈÊä´Ö¤·¤Æ¤â²¿¤âµ¯¤³¤ê¤Þ¤»¤ó."; +static char *str_InterpolatingFontsDiffOrder = "¥¹¥×¥é¥¤¥ó¤Î¼¡¿ô¤¬°Û¤Ê¤ë¥Õ¥©¥ó¥È¤ÎÊä´Ö¤ò¹Ô¤ª¤¦¤È¤·¤Æ¤¤¤Þ¤¹(Î㤨¤Ð,PostScript¤ÈTrueType) +static char *str_Amount = "ÎÌ"; +static char *str_InterpBetween = "%.20hs ¤È¤Î´Ö¤ÇÊä´ÖÃæ:"; +static char *str_by = "by"; + /* fv metrics */ +static char *str_SetWidthTo = "ʸ»úÉý¤ÎÀßÄêÃÍ:"; +static char *str_SetLBearingTo = "º¸¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤ÎÀßÄêÃÍ:"; +static char *str_SetRBearingTo = "±¦¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤ÎÀßÄêÃÍ:"; +static char *str_SetVWidthTo = "½Ä½ñ¤­»úÁ÷¤ê¤ÎÀßÄêÃÍ:"; +static char *str_IncrWidthBy = "ʸ»úÉý¤ÎÁý²ÃÎÌ:"; +static char *str_IncrLBearingBy = "º¸¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤ÎÁý²ÃÎÌ:"; +static char *str_IncrRBearingBy = "±¦¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤ÎÁý²ÃÎÌ:"; +static char *str_IncrVWidthBy = "½Ä½ñ¤­»úÁ÷¤ê¤ÎÁý²ÃÎÌ:"; +static char *str_ScaleWidthBy = "ʸ»úÉý¤Î³ÈÂçΨ:"; +static char *str_ScaleLBearingBy = "º¸¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤Î³ÈÂçΨ:"; +static char *str_ScaleRBearingBy = "±¦¥µ¥¤¥É¥Ù¥¢¥ê¥ó¥°¤Î³ÈÂçΨ:"; +static char *str_ScaleVWidthBy = "½Ä½ñ¤­»úÁ÷¤ê¤Î³ÈÂçΨ:"; +static char *str_Plain = "¤½¤Î¤Þ¤Þ"; + /* Import bdf */ +static char *str_PixelSizeFont = "¤³¤Î¥Õ¥¡¥¤¥ëÆâ¤Î¥Õ¥©¥ó¥È¤Î¥Ô¥¯¥»¥ë¿ô¤Ï´ö¤Ä¤Ç¤¹¤«?"; +static char *str_CouldNotOpenFile = "¥Õ¥¡¥¤¥ë¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿."; +static char *str_CouldNotOpenFileName = "¥Õ¥¡¥¤¥ë %.200hs ¤ò³«¤±¤Þ¤»¤ó¤Ç¤·¤¿."; +static char *str_NotBdfFile = "BDF¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NotBdfFileName = "%.200hs ¤ÏBDF¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NotPkFile = "PK¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NotPkFileName = "%.200hs¤Ï(metafont¤«¤éºî¤é¤ì¤ë)PK¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NotGfFile = "GF¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char *str_NotGfFileName = "%.200hs¤Ï(metafont¤«¤éºî¤é¤ì¤ë)GF¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NotPcfFile = "PCF¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_NotPcfFileName = "%.200hs ¤ÏX11¤ÎPCF¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_LoadingFrom = "¥Õ¥©¥ó¥È¤ò %.100hs ¤«¤éÆɤ߹þ¤ó¤Ç¤¤¤Þ¤¹."; +static char *str_DuplicateName = "̾Á°¤Î½ÅÊ£"; +static char *str_DuplicateCharName = "¥Õ¥©¥ó¥ÈÆâ¤ËƱ¤¸Ì¾Á° (%hs) ¤ò»ý¤Äʸ»ú¤¬½ÅÊ£¤·¤Æ¤¤¤Þ¤¹."; + /* problems */ +static char *str_ProbOpenPath = "ÁªÂò¤µ¤ì¤¿2¤Ä¤ÎÀ©¸æÅÀ¤Ï³«¤¤¤¿¥Ñ¥¹¤ÎξüÅÀ¤Ç¤¹."; +static char *str_ProbPointsTooClose = "ÁªÂò¤µ¤ì¤¿2¤Ä¤ÎÀ©¸æÅÀ¤Ï¸ß¤¤¤Ë¶á¤¹¤®¤Þ¤¹."; +static char *str_ProbMissingExtreme = "ÁªÂò¤µ¤ì¤¿¶ÊÀþ¤Ï¶ËÃͤËÀ©¸æÅÀ¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_ProbXNear = "ÁªÂò¤µ¤ì¤¿ÅÀ¤ÎXºÂɸ¤Ï»ØÄꤵ¤ì¤¿Ãͤζ᤯¤Ç¤¹."; +static char *str_ProbYNear = "ÁªÂò¤µ¤ì¤¿ÅÀ¤ÎYºÂɸ¤Ï»ØÄꤵ¤ì¤¿Ãͤζ᤯¤Ç¤¹."; +static char *str_ProbYBase = "ÁªÂò¤µ¤ì¤¿ÅÀ¤ÎYºÂɸ¤Ï¥Ù¡¼¥¹¥é¥¤¥ó¤Î¶á¤¯¤Ç¤¹."; +static char *str_ProbYXHeight = "ÁªÂò¤µ¤ì¤¿ÅÀ¤ÎYºÂɸ¤Ïx¥Ï¥¤¥È¤Î¶á¤¯¤Ç¤¹."; +static char *str_ProbYCapHeight = "ÁªÂò¤µ¤ì¤¿ÅÀ¤ÎYºÂɸ¤Ï¥­¥ã¥Ã¥×¥Ï¥¤¥È¤Î¶á¤¯¤Ç¤¹."; +static char *str_ProbYAs = "ÁªÂò¤µ¤ì¤¿ÅÀ¤ÎYºÂɸ¤Ï¥¢¥»¥ó¥À¤Î¹â¤µ¤Î¶á¤¯¤Ç¤¹."; +static char *str_ProbYDs = "ÁªÂò¤µ¤ì¤¿ÅÀ¤ÎYºÂɸ¤Ï¥Ç¥£¥»¥ó¥À¤Î¹â¤µ¤Î¶á¤¯¤Ç¤¹."; +static char *str_ProbLineHor = "ÁªÂò¤µ¤ì¤¿Àþʬ¤Ï¤Û¤Ü¿åÊ¿¤Ç¤¹."; +static char *str_ProbLineVert = "ÁªÂò¤µ¤ì¤¿Àþʬ¤Ï¤Û¤Ü¿âľ¤Ç¤¹."; +static char *str_ProbLineItal = "ÁªÂò¤µ¤ì¤¿Àþʬ¤Î·¹¤­¤Ï¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­¤È¤Û¤ÜƱ¤¸¤Ç¤¹."; +static char *str_ProbAboveHor = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î¾å¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿åÊ¿¤Ç¤¹."; +static char *str_ProbAboveVert = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î¾å¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿âľ¤Ç¤¹."; +static char *str_ProbAboveItal = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î¾å¤ÎÀ©¸æÅÀ¤Ï¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­¤È¤Û¤ÜƱ¤¸¤Ç¤¹."; +static char *str_ProbBelowHor = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î²¼¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿åÊ¿¤Ç¤¹."; +static char *str_ProbBelowVert = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î²¼¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿âľ¤Ç¤¹."; +static char *str_ProbBelowItal = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î²¼¤ÎÀ©¸æÅÀ¤Ï¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­¤È¤Û¤ÜƱ¤¸¤Ç¤¹."; +static char *str_ProbLeftHor = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Îº¸¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿åÊ¿¤Ç¤¹."; +static char *str_ProbLeftVert = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Îº¸¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿âľ¤Ç¤¹."; +static char *str_ProbLeftItal = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Îº¸¤ÎÀ©¸æÅÀ¤Ï¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­¤È¤Û¤ÜƱ¤¸¤Ç¤¹."; +static char *str_ProbRightHor = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î±¦¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿åÊ¿¤Ç¤¹."; +static char *str_ProbRightVert = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î±¦¤ÎÀ©¸æÅÀ¤Ï¤Û¤Ü¿âľ¤Ç¤¹."; +static char *str_ProbRightItal = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î±¦¤ÎÀ©¸æÅÀ¤Ï¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­¤È¤Û¤ÜƱ¤¸¤Ç¤¹."; +static char *str_ProbPtNearHHint = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Ï¿åÊ¿¥¹¥Æ¥à¥Ò¥ó¥È¤Î¶á¤¯¤Ç¤¹."; +static char *str_ProbPtNearVHint = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Ï¿âľ¥¹¥Æ¥à¥Ò¥ó¥È¤Î¶á¤¯¤Ç¤¹."; +static char *str_ProbHintHWidth = "¤³¤Îʸ»ú¤Ï»ØÄꤵ¤ì¤¿Éý¤Ë¶á¤¤¿åÊ¿¥Ò¥ó¥È¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹."; +static char *str_ProbHintVWidth = "¤³¤Îʸ»ú¤Ï»ØÄꤵ¤ì¤¿Éý¤Ë¶á¤¤¿âľ¥Ò¥ó¥È¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹."; +static char *str_ProbHintControl = "¤³¤Î¥Ò¥ó¥È¤Ï¤É¤ÎÅÀ¤âÀ©¸æ¤·¤Æ¤¤¤Þ¤»¤ó."; +static char *str_ProbHint3Width = "¤³¤Î¥Ò¥ó¥È¤Ïstem3¥Ò¥ó¥È¤Ë¹çÃפ·¤Ê¤¤Éý¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹"; +static char *str_ProbHint3Spacing = "¤³¤ì¤é¤Î¥Ò¥ó¥È¤Î´Ö¤Î¥«¥¦¥ó¥¿¡¼¤ÏƱ¤¸Éý¤Ç¤Ï¤Ê¤¤¤Î¤Ç, stem3 ¥Ò¥ó¥È¤È¤·¤Æ¤ÏÉÔŬÀڤǤ¹"; +static char *str_ProbHint3Four = "¤³¤Îʸ»ú¤Ë¤Ï4¤Ä¤Î¥Ò¥ó¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¤¬,¤³¤Î1¤Ä¤ò¾Êά¤¹¤ì¤Ðstem3¥Ò¥ó¥È¤ËŬ¹ç¤·¤Þ¤¹"; +static char *str_NoProbHint3 = "¤³¤Îʸ»ú¤Ïstem3¥Ò¥ó¥È¤ò»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹"; +static char *str_ProbExpectedCounter = "¤³¤Î¥Ñ¥¹¤ÏÈ¿»þ·×²ó¤ê¤Ë½ñ¤«¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Ï¤º¤Ç¤¹."; +static char *str_ProbExpectedClockwise = "¤Î¥Ñ¥¹¤ÏÈ¿»þ·×²ó¤ê¤Ë½ñ¤«¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Ï¤º¤Ç¤¹."; +static char *str_ProbFlippedRef = "¤³¤Î»²¾È¤Ï΢ÊÖ¤·¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç,¤³¤ÎÃæ¤ÇÉÁ²è¤µ¤ì¤ë¥Ñ¥¹¤ÏµÕ¤Ë½ñ¤«¤ì¤Þ¤¹."; +static char *str_ProbTooManyPoints = "¤³¤Îʸ»ú¤Ë¤ÏºÇÂçµöÍÆÃͤè¤ê¤â¿¤¯¤ÎÅÀ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹"; +static char *str_ProbTooDeepRefs = "¤³¤Îʸ»ú¤Ç¤Ï¡¢»²¾È¤ÎÆþ¤ì»Ò¥ì¥Ù¥ë¤¬ºÇÂçµöÍÆÃͤòĶ¤¨¤Æ¤¤¤Þ¤¹"; +static char *str_ProbTooManyHints = "¤³¤Îʸ»ú¤Ë¤ÏºÇÂçµöÍÆÃͤè¤ê¤â¿¤¯¤Î¥Ò¥ó¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹"; +static char *str_ProbMissingBitmap = "¤³¤Î¥¢¥¦¥È¥é¥¤¥óʸ»ú¤Ë¤Ï¥Ó¥Ã¥È¥Þ¥Ã¥×ÈǤ¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_ProbMissingOutline = "¤³¤Îʸ»ú¤Ï¥¢¥¦¥È¥é¥¤¥ó¤¬¶õÇò¤Ç¤¹¤¬,¥Ó¥Ã¥È¥Þ¥Ã¥×ÈǤ¬Â¸ºß¤·¤Þ¤¹."; +static char *str_ProbBadWidth = "¤³¤Îʸ»ú¤Î¥¢¥É¥Ð¥ó¥¹Éý¤Ïɸ½à¤ÎÉý¤È°Û¤Ê¤ê¤Þ¤¹" +static char *str_ProbBadVWidth = "¤³¤Îʸ»ú¤Î½Ä½ñ¤­¥¢¥É¥Ð¥ó¥¹Éý¤Ïɸ½à¤ÎÉý¤È°Û¤Ê¤ê¤Þ¤¹" +static char *str_ProbAboveOdd = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î¾å¤ÎÀ©¸æÅÀ¤Ï¶ÊÀþ¤Î°ìÉô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_ProbBelowOdd = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î²¼¤ÎÀ©¸æÅÀ¤Ï¶ÊÀþ¤Î°ìÉô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_ProbRightOdd = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Î±¦¤ÎÀ©¸æÅÀ¤Ï¶ÊÀþ¤Î°ìÉô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_ProbLeftOdd = "ÁªÂò¤µ¤ì¤¿ÅÀ¤Îº¸¤ÎÀ©¸æÅÀ¤Ï¶ÊÀþ¤Î°ìÉô¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó."; +static char *str_ProbCIDMult = "¤³¤Îʸ»ú¤ÏÊ£¿ô¤ÎCID¥µ¥Ö¥Õ¥©¥ó¥È¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹."; +static char *str_ProbCIDBlank = "¤³¤Îʸ»ú¤Ï¤É¤ÎCID¥µ¥Ö¥Õ¥©¥ó¥È¤Ç¤âÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó."; +static char *str_ProbIrrelCP = "¤³¤Îʸ»ú¤Ë¤Ï,¤¢¤Þ¤ê¤ËüÅÀ¤Ë¶á¤¹¤®¤Æ¶ÊÀþ¤Î·Á¾õ¤òÊѤ¨¤ëÌò¤ËΩ¤¿¤Ê¤¤À©¸æÅÀ¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹."; +static char *str_ProbBadSubs = "¤³¤Îʸ»ú¤Ë¤Ï,¶õ¤Îʸ»ú¤ò»²¾È¤¹¤ëÃÖ´¹¤¨¤Þ¤¿¤Ï¹ç»ú¤Î¥¨¥ó¥È¥ê¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹."; +static char *str_ProbBadSubs2 = "'%2$c%3$c%4$c%5$c' ¤Ï¶õ¤Îʸ»ú \"%1$.20hs\" ¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹."; +static char *str_ProbExplain = "ÌäÂê¤ÎÀâÌÀ"; +static char *str_GlyphPSTTag = "¥¿¥°'%3$c%4$c%5$c%6$c'¤ò¤â¤Ä%2$hs¤ò´Þ¤à¥°¥ê¥Õ%1$.50hs"; +static char *str_GlyphMacPSTTag = "µ¡Ç½'%3$c%4$c%5$c%6$c'¤ò¤â¤Ä%2$hs¤ò´Þ¤à¥°¥ê¥Õ%1$.50hs"; +static char *str_FPSTKernTag = "¥¿¥°'%2$c%3$c%4$c%5$c'¤ò¤â¤Ä%1$hs"; +static char *str_MacASMTag = "µ¡Ç½<%2$d,%3$d>¤ò¤â¤Ä%1$hs"; +static char *str_RefersToMissingGlyph = "¤Ï¸ºß¤·¤Ê¤¤¥°¥ê¥Õ¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹"; +static char *str_RefersToMissingLookup = "¤Ï¸ºß¤·¤Ê¤¤É½°ú¤­¥¿¥°¤ò»²¾È¤·¤Æ¤¤¤Þ¤¹"; +static char *str_ReplaceWith = "ÃÖ¤­´¹¤¨Àè:" +static char *str_Always = "¾ï¤Ë" +static char *str_AlwaysPopup = "¤³¤Î̾Á°¤ò¤â¤Ä¥°¥ê¥Õ¤ËǤ°Õ¤Îµ¡Ç½¤¬¸½¤ì¤¿¤È¤­¤Ï,\n°Ê²¼¤ÎÊýË¡¤ÇÃÖ´¹¤Þ¤¿¤Ïºï½ü¤·¤Þ¤¹."; +static char *str_Skip = "¥¹¥­¥Ã¥×" +static char *str_Fix = "½¤Àµ"; +static char *str_Stop = "Ãæ»ß(S)"; +static char *mnemonic_Stop = 'S'; +static char *str_Next = "¼¡(N)"; +static char *mnemonic_Next = 'N'; +static char *str_OpenPaths = "³«¤¤¤¿¥Ñ¥¹(P)"; +static char *mnemonic_OpenPaths = 'P'; +static char *str_OpenPathsPopup = "Á´¤Æ¤Î¥Ñ¥¹¤ÏÊĤ¸¤¿¥ë¡¼¥×¤Ç¤¢¤ëɬÍפ¬¤¢¤ë¤Î¤Ç,Íç¤ÎüÅÀ¤¬Â¸ºß¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó."; +static char *str_Points2Close = "¶á¤¹¤®¤ëÅÀ(t)"; +static char *mnemonic_Points2Close = 't'; +static char *str_Points2ClosePopup = "Ʊ¤¸¥Ñ¥¹¾å¤Î2¤Ä¤ÎÎÙ¤ê¹ç¤¦ÅÀ¤¬2,3¥æ¥Ë¥Ã¥È¤è¤ê\n¶á¤¯¤Ë¤¢¤ë¾ì¹ç,FontForge¤Î°ìÉô¤Î¥³¥Þ¥ó¥É¤ÇÌäÂ꤬À¸¤º¤ë\n¤ª¤½¤ì¤¬¤¢¤ê¤Þ¤¹.\n¤¿¤À¤·, PostScript¥¤¥ó¥¿¥×¥ê¥¿¤Ë¤Ï±Æ¶Á¤¢¤ê¤Þ¤»¤ó."; +/*static char *str_MissingExtrema = "¶ËÃͤηçÍî(E)"; +/*static char *mnemonic_MissingExtrema = 'E'; +/*static char *str_MissingExtremaPopup = "Ghostview (¤ª¤½¤é¤¯¤½¤Î¾¤Î¥¤¥ó¥¿¥×¥ê¥¿¤â) ¤Ë¤Ï,\nÆâÉô¤ËÅÀ¤¬´Þ¤Þ¤ì¤Ê¤¤¥Ò¥ó¥È¤¬Â¸ºß¤¹¤ë¤ÈÌäÂê¤ò°ú¤­¤ª¤³¤·¤Þ¤¹. °ìÈ̤ˤÏ,\n¤³¤ì¤Ï¶ËÃͤËÅÀ¤¬ÃÖ¤«¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤Ë¤è¤êµ¯¤³¤ê¤Þ¤¹.";*/ +static char *str_XNear = "¶áÀܤ¹¤ëX"; +static char *mnemonic_XNear = 'X'; +static char *str_XNearPopup = "¤¤¤¯¤Ä¤«¤Îʸ»ú¤ÎÃæ¤Ë, Ʊ¤¸°ÌÃÖ¤«¤é»Ï¤Þ¤ë¿âľ¥¹¥Æ¥à¤¬¤¢¤ë¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_YNear = "¶áÀܤ¹¤ëY"; +static char *mnemonic_YNear = 'Y'; +static char *str_YNearPopup = "¤¤¤¯¤Ä¤«¤Îʸ»ú¤ÎÃæ¤Ë, Ʊ¤¸°ÌÃÖ¤«¤é»Ï¤Þ¤ë¿åÊ¿¥¹¥Æ¥à¤¬¤¢¤ë¤«¤É¤¦¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_YNearStd = "ɸ½à¤Î¹â¤µ¤Î¶á¤¯¤ÎYºÂɸ(S)"; +static char *mnemonic_YNearStd = 'S'; +static char *str_YNearStdPopup = "¥Ù¡¼¥¹¥é¥¤¥ó, ¥Ï¥¤¥È, ¥¢¥»¥ó¥À, ¥Ç¥£¥»¥ó¥À¤Î\n¹â¤µ¤«¤é¶Ï¤«¤Ë³°¤ì¤¿ÅÀ¤òõ¤·¤Þ¤¹." +static char *str_LineStd = "¿åÊ¿/¿âľ¤Ë¶á¤¤ÊÕ(E)"; +static char *str_LineStd2 = "¿åÊ¿/¿âľ/¥¤¥¿¥ê¥Ã¥¯³Ñ¤Ë¶á¤¤ÊÕ"; +static char *mnemonic_LineStd = 'E'; +static char *str_LineStdPopup = "¿åÊ¿¤Þ¤¿¤Ï¿âľÊý¸þ (¤«, ¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­) ¤ËÈó¾ï¤Ë¶á¤¤¤¬\n´°Á´¤Ë°ìÃפ·¤Ê¤¤Àþ¤òõ¤·¤Þ¤¹."; +static char *str_CpStd = "¿åÊ¿/¿âľ¤Ë¶á¤¤À©¸æÅÀ(C)"; +static char *str_CpStd2 = "¿åÊ¿/¿âľ/¥¤¥¿¥ê¥Ã¥¯³Ñ¤Ë¶á¤¤À©¸æÅÀ"; +static char *mnemonic_CpStd = 'C'; +static char *str_CpStdPopup = "¸µ¤È¤Ê¤ëüÅÀ¤«¤é,¿åÊ¿¤Þ¤¿¤Ï¿âľÊý¸þ (¤«, ¥¤¥¿¥ê¥Ã¥¯¤Î·¹¤­) ¤Ë\nÈó¾ï¤Ë¶á¤¤¤¬, ´°Á´¤Ë°ìÃפ·¤Ê¤¤Àþ¤òõ¤·¤Þ¤¹."; +static char *str_CpOdd = "üÅÀ¤Î³°¤Ë¤Ï¤ß½Ð¤¹À©¸æÅÀ(b)"; +static char *mnemonic_CpOdd = 'b'; +static char *str_CpOddPopup = "¶ÊÀþ¤ÎξüÅÀ¤ò·ë¤ÖľÀþ¾å¤ËÀ©¸æÅÀ¤òÅê±Æ¤·¤¿»þ¤Ë,\n¤½¤ÎÅÀ¤Î³°Â¦¤Ë¼Í±Æ¤µ¤ì¤ë¤è¤¦¤ÊÀ©¸æÅÀ¤òõ¤·¤Þ¤¹." +static char *str_HintNoPt = "ÅÀ¤òÀ©¸æ¤·¤Ê¤¤¥Ò¥ó¥È(H)"; +static char *mnemonic_HintNoPt = 'H'; +static char *str_HintNoPtPopup = "Ghostview¤Ï (¤ª¤½¤é¤¯¤½¤Î¾¤Î¥¤¥ó¥¿¥×¥ê¥¿¤â)\nÅÀ¤¬1¸Ä¤â¾å¤ËºÜ¤Ã¤Æ¤¤¤Ê¤¤¥Ò¥ó¥È¤¬Â¸ºß¤¹¤ë¤È\nÌäÂê¤òÀ¸¤¸¤Þ¤¹."; +static char *str_PtNearHint = "¥Ò¥ó¥Èü¤Ë¶á¤¤ÅÀ(P)"; +static char *mnemonic_PtNearHint = 'P'; +static char *str_PtNearHintPopup = "ÅÀ¤¬¤¢¤ë¥Ò¥ó¥È¤«¤é¶Ï¤«¤ËÎ¥¤ì¤Æ¤¤¤ë¾ì¹ç, ¤½¤Î¿¤¯¤Ï\n1ËܤΥ¹¥Æ¥à¤¬Ê£¿ô¤ÎÉôʬ¤«¤é¤Ê¤ê, °ìÉô¤¬´Ö°ã¤Ã¤¿Éý¤ò»ý¤Ã¤Æ¤¤¤ë¤Î¤¬\n¸¶°ø¤Ç¤¹."; +static char *str_HintWidth = "¥Ò¥ó¥ÈÉý¤Ø¤Î¶áÀÜ(W)"; +static char *mnemonic_HintWidth = 'W'; +astatic char *str_HintWidthPopup = "¥¹¥Æ¥à¤ÎÉý¤¬°ì´Ó¤·¤Æ¤¤¤ë¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_Hint3 = "ÏĤó¤Àstem3¥Ò¥ó¥È"; +static char *mnemonic_Hint3 = '3'; +static char *str_Hint3Popup = "stem3¥Ò¥ó¥È¤ÎɬÍ×¾ò·ï¤ËÈó¾ï¤Ë¶á¤¯(¤¿¤À¤·Àµ³Î¤Ë¤Ç¤Ï¤Ê¤¯)\n°ìÃפ¹¤ë¥Ò¥ó¥È¤¬Ê¸»ú¤Ë´Þ¤Þ¤ì¤Æ¤¤¤ë¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹. \n¤³¤Î¾ò·ï¤Ï,¿åÊ¿Êý¸þ¤È¿âľÊý¸þ¤òÌä¤ï¤º,¤Á¤ç¤¦¤É3¸Ä¤Î¥Ò¥ó¥È¤¬\n¸ºß¤·,Ʊ¤¸Éý¤ò»ý¤Ã¤Æ¤¤¤ÆÅù´Ö³Ö¤Ëʤó¤Ç\n¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤â¤Î¤Ç¤¹." +static char *str_ShowExactHint3 = "Àº³Î¤Ê*stem3¤«¤òɽ¼¨"; +static char *mnemonic_ShowExactHint3 = 'S'; +static char *str_ShowExactHint3Popup = "¤³¤Îʸ»ú¤¬Àº³Î¤Êstem3¥Ò¥ó¥È¤ò´Þ¤ó¤Ç¤¤¤ë¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_CheckDirection = "°ìÈÖ³°¤Î¥Ñ¥¹¤¬»þ·×²ó¤ê¤«¤ò¥Á¥§¥Ã¥¯(o)"; +static char *mnemonic_CheckDirection = 'o'; +static char *str_CheckDirectionPopup = "PostScript¥Õ¥©¥ó¥È¤äTrueType¤Ï, ¥Ñ¥¹¤ò»þ·×²ó¤ê¤ËÉÁ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹.\n¤½¤ì¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_CheckFlippedRefs = "ȿž¤·¤¿¥Ñ¥¹¤ò¥Á¥§¥Ã¥¯(r)"; +static char *mnemonic_CheckFlippedRefs = 'r'; +static char *str_CheckFlippedRefsPopup = "PostScript¥Õ¥©¥ó¥È¤äTrueType¤Ï, ¥Ñ¥¹¤ò»þ·×²ó¤ê¤ËÉÁ¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹.\nȿž¤·¤¿»²¾È¤¬¤¢¤ë¾ì¹ç¤Ï, Ä̾︵¤Î¥Ñ¥¹¤ÏÈ¿»þ·×²ó¤ê¤Ç\n¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó. ¥ê¥ó¥¯¤ò²ò½ü¤·¤Æ¤½¤ÎÉôʬ¤Î¸þ¤­¤òÊäÀµ¤¹¤ëɬÍפ¬¤¢¤ë¤Ç¤·¤ç¤¦."; +static char *str_MorePointsThan = "ÅÀ¤Î¸Ä¿ô¤Î¾å¸Â(m):" +static char *mnemonic_MorePointsThan = 'm'; +static char *str_MorePointsThanPopup = "The PostScript Language Reference Manual (Appendix B) ¤Ï,\n¥¤¥ó¥¿¥×¥ê¥¿¤Ï1500¸Ä¤òĶ¤¨¤ëÅÀ¤ò´Þ¤à¥Ñ¥¹¤ò¥µ¥Ý¡¼¥È¤¹¤ë\nɬÍפ¬Ìµ¤¤¤ÈÄê¤á¤Æ¤¤¤Þ¤¹. PostScript¤Î\n»ëÅÀ¤«¤é¤Ï, 1ʸ»úÆâ¤ÎÁ´¤Æ¤ÎÎسԤ¬1¸Ä¤Î¥Ñ¥¹¤ò¹½À®¤·¤Þ¤¹.\n¸½ÂåŪ¤Ê¥¤¥ó¥¿¥×¥ê¥¿¤Ï¤³¤Î¾å¸Â¤è¤ê¤â¿¤¯¤ÎÅÀ¤ò»ý¤Ä¥Ñ¥¹¤ò\n¥µ¥Ý¡¼¥È¤¹¤ë·¹¸þ¤Ë¤¢¤ê¤Þ¤¹.\n(TrueType¥Õ¥©¥ó¥È¤òPS¤ËÊÑ´¹¤¹¤ë¤È,À©¸æÅÀ¤Î¸Ä¿ô¤Ï¸µ¤Î2ÇܤË\n¤Ê¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤)"; +static char *str_RefsDeeperThan = "»²¾È¤Î¿¼¤µ¤Î¾å¸Â(d):" +static char *mnemonic_RefsDeeperThan = 'd'; +static char *str_RefsDeeperThanPopup = "The Type 2 Charstring Reference (Appendix B) ¤Ï,\n¥µ¥Ö¥ë¡¼¥Á¥ó¤Ï10½Å¤òĶ¤¨¤ëÆþ¤ì»Ò¤Ë¤Ê¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¤ÈÄê¤á¤Æ¤¤¤Þ¤¹.\n»²¾È¤ÎÆþ¤ì»Ò¥ì¥Ù¥ë1¸Ä¤Ë¤Ä¤­¥µ¥Ö¥ë¡¼¥Á¥ó\n¥ì¥Ù¥ë1¸Ä¤¬É¬ÍפÇ,¤½¤ì¤Ë²Ã¤¨,¥Ò¥ó¥È¤Ë¤è¤ê¤â¤¦1¥ì¥Ù¥ë¤¬É¬ÍפȤʤë¤Ç¤·¤ç¤¦."; +static char *str_MoreHintsThan = "¥Ò¥ó¥È¤Î¸Ä¿ô¤Î¾å¸Â(m):" +static char *mnemonic_MoreHintsThan = 'm'; +static char *str_MoreHintsThanPopup = "The Type 2 Charstring Reference (Appendix B) ¤Ï,\n1ʸ»ú¤Ë¤ÏºÇÂç96¸Ä¤Î¿åÊ¿¤ª¤è¤Ó¿âľ¤Î¥¹¥Æ¥à¥Ò¥ó¥È¤ò´Þ¤ó¤Ç\n¤è¤¤¤ÈÄê¤á¤Æ¤¤¤Þ¤¹."; +static char *str_CheckBitmaps = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤Î·çÍî¤ò¥Á¥§¥Ã¥¯(b)"; +static char *mnemonic_CheckBitmaps = 'b'; +static char *str_CheckBitmapsPopup = "¥Ó¥Ã¥È¥Þ¥Ã¥×ÈǤ¬¥Õ¥©¥ó¥ÈÆâ¤Ë´Þ¤Þ¤ì¤Ê¤¤¥¢¥¦¥È¥é¥¤¥ó¤¬¤¢¤ë¤«?\nµÕ¤Ë, Âбþ¤¹¤ë¥¢¥¦¥È¥é¥¤¥óʸ»ú¤¬Ìµ¤¤¥Ó¥Ã¥È¥Þ¥Ã¥×ʸ»ú¤¬¤¢¤ë¤«?"; +static char *str_CIDMultiple = "½ÅÊ£ÄêµÁ¤µ¤ì¤¿CID¤ò¥Á¥§¥Ã¥¯(t)"; +static char *mnemonic_CIDMultiple = 't'; +static char *str_CIDMultiplePopup = "Ê£¿ô¤Î¥µ¥Ö¥Õ¥©¥ó¥È¤ÇÄêµÁ¤µ¤ì¤¿CID¤¬\n¤Ê¤¤¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_CIDBlank = "̤ÄêµÁ¤ÎCID¤ò¥Á¥§¥Ã¥¯(B)"; +static char *mnemonic_CIDBlank = 'B'; +static char *str_CIDBlankPopup = "¤É¤Î¥µ¥Ö¥Õ¥©¥ó¥È¤Ç¤âÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤CID¤¬\n¤Ê¤¤¤«¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_MissingGlyph = "¸ºß¤·¤Ê¤¤¥°¥ê¥Õ̾¤ò¥Á¥§¥Ã¥¯(m)"; +static char *mnemonic_MissingGlyph = 'm'; +static char *str_MissingGlyphPopup = "ÃÖ´¹¡¦¥«¡¼¥Ë¥ó¥°¥¯¥é¥¹Åù¤¬,¥Õ¥©¥ó¥ÈÆâ¤Î\n¤É¤Î¥°¥ê¥Õ¤Ë¤â°ìÃפ·¤Ê¤¤Ê¸»ú¤ò»È¤Ã¤Æ¤¤¤Ê¤¤¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹"; +static char *str_MissingLookupTag = "¸ºß¤·¤Ê¤¤É½°ú¤­¥¿¥°¤ò¥Á¥§¥Ã¥¯(l)"; +static char *mnemonic_MissingLookupTag = 'l'; +static char *str_MissingLookupTagPopup = "ʸ̮°Í¸¤ÎÃÖ´¹/°ÌÃÖ»ØÄê¤Î¹àÌܤ¬¥Õ¥©¥ó¥ÈÆâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤¤¥¿¥°¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¤«¥Á¥§¥Ã¥¯¤·¤Þ¤¹"; +static char *str_IrrelevantFactor = "̵°ÕÌ£¤ÊÀ©¸æÅÀ¤ÎÁêÂе÷Î¥(F):"; +static char mnemonic_IrrelevantFactor = 'F'; +static char *str_IrrelevantFactorPopup = "À©¸æÅÀ¤Ï,ÎÙÀܤ¹¤ëüÅÀ¤È¤Îµ÷Î¥¤¬\nξüÅÀ¤Î´Ö¤Îµ÷Î¥¤ËÈæ¤Ù¤³¤ÎÈæΨ¤ËËþ¤¿¤Ê¤¤¾ì¹ç,\n̵°ÕÌ£¤Ç¤¢¤ë¤È¹Í¤¨¤é¤ì¤Þ¤¹"; +static char *str_IrrelevantCP = "̵°ÕÌ£¤ÊÀ©¸æÅÀ¤ò¥Á¥§¥Ã¥¯(I)"; +static char mnemonic_IrrelevantCP = 'I'; +static char *str_IrrelevantCPPopup = "À©¸æÅÀ¤Ï,¼ç¤¿¤ëÅÀ¤È¤Îµ÷Î¥¤¬¶á¤¹¤®¤Æ¶ÊÀþ¤Î·Á¤òÊѤ¨¤ë\nÌò¤ËΩ¤¿¤Ê¤¤¾ì¹ç,̵°ÕÌ£¤Ê¤â¤Î¤È¤µ¤ì¤Þ¤¹"; +static char *str_PointsNear = "ÅÀ¤ò \"¶á¤¯\" ¤ÈȽÃǤ¹¤ëµ÷Î¥(N)"; +static char mnemonic_PointsNear = 'N'; +static char *str_Near = "¶á¤¯"; +static char *str_ExplainErr = "³Æ¥¨¥é¡¼¤ÇÄä»ß¤·¤ÆÀâÌÀ¤òɽ¼¨¤¹¤ë(A)"; +static char *mnemonic_ExplainErr = 'A'; +static char *str_IgnoreProblemFuture = "¤³¤ÎÌäÂê¤Ïº£¸å̵»ë¤¹¤ë"; +/* "Found %g, expected %g" */ +static char *str_Found = "¼Â¬ÃÍ: "; +static char *str_Expected = ", ͽÁÛÃÍ: "; +static char *str_Paths = "¥Ñ¥¹"; +static char *str_Random = "¥é¥ó¥À¥à"; +static char *str_ATT = "ATT"; +static char *str_PointsNoC = "ÅÀ"; +static char *str_Refs = "»²¾È"; +static char *str_ClearAll = "Á´¤Æ¥¯¥ê¥¢"; +static char *str_SetAll = "Á´¤Æ¥»¥Ã¥È"; +static char *str_AdvanceWidth = "¥¢¥É¥Ð¥ó¥¹Éý¤ò¥Á¥§¥Ã¥¯:"; +static char *str_AdvanceWidthPopup = "ʸ»ú¤Î¥¢¥É¥Ð¥ó¥¹Éý¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ëÃͤȰۤʤëʸ»ú¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_AdvanceVWidth = "½Ä¤Î¥¢¥É¥Ð¥ó¥¹Éý¤ò¥Á¥§¥Ã¥¯:"; +static char *str_AdvanceVWidthPopup = "½Ä½ñ¤­»þ¤Î¥¢¥É¥Ð¥ó¥¹Éý¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ëÃͤȰۤʤëʸ»ú¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; +static char *str_SubsToEmptyChar = "¶õʸ»ú¤Ø¤ÎÃÖ´¹¤ò¥Á¥§¥Ã¥¯"; +static char *str_SubsToEmptyCharPopup = "¶õ¤Îʸ»ú¤Ø¤Î»²¾È¤·¤Æ¤¤¤ëGSUB¥¨¥ó¥È¥ê¤ò´Þ¤àʸ»ú¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹."; + + /* Meta font */ +static char *str_MetaFont = "Meta Font..."; +static char mnemonic_MetaFont = 'M'; +static char *str_CounterTooSmallT = "¥«¥¦¥ó¥¿Éý¤¬¾®¤µ¤¹¤®¤Þ¤¹"; +static char *str_CounterTooSmall = "»ØÄꤵ¤ì¤¿¥«¥¦¥ó¥¿Éý¤¬¾®¤µ¤¹¤®¤ë¤¿¤á,\n¸½ºß¤ÎºÇ¾®Ãͤ˸ÇÄꤷ¤Þ¤¹."; +static char *str_Simple = "¥·¥ó¥×¥ë"; +static char *str_Advanced = "¹âÅ٤ʵ¡Ç½"; +static char *str_Embolden = "ÂÀ»ú²½"; +static char *str_Condense = "»úÉý¤Î½Ì¾®"; +static char *str_Expand = "»úÉý¤Î³ÈÂç"; +static char *str_Stems = "¥¹¥Æ¥à"; +static char *str_HCounters = "¿åÊ¿¥«¥¦¥ó¥¿"; +static char *str_VCounters = "¿âľ¥«¥¦¥ó¥¿"; +static char *str_StemScale = "¥¹¥Æ¥à¤Î³ÈÂçΨ:"; +static char *str_CounterScale = "¥«¥¦¥ó¥¿¤Î³ÈÂçΨ:"; +static char *str_XHeightFrom = "x¥Ï¥¤¥È¤Î¸½ºßÃÍ:"; +static char *str_To = "»ØÄêÃÍ:"; +static char *str_MetamorphosingFont = "¥Õ¥©¥ó¥È¤òÊÑ·Á¤·¤Þ¤¹..."; + /* to ttf */ +static char *str_PickFont = "Ǥ°Õ¤Î¥Õ¥©¥ó¥È¤òÈ´¤­½Ð¤·¤Þ¤¹..."; +static char *str_MultipleFontsPick = "¤³¤Î¥Õ¥©¥ó¥È¤Ë¤ÏÊ£¿ô¤Î¥Õ¥©¥ó¥È¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë¤Î¤Ç, 1¸Ä¤òÁªÂò¤·¤Þ¤¹."; +static char *str_AutoHintingFont = "¥Õ¥©¥ó¥È¤ò¼«Æ°¥Ò¥ó¥È½èÍýÃæ..."; +static char *str_AutoInstructingFont = "¥Õ¥©¥ó¥È¤Î¥Ò¥ó¥ÈÌ¿Îá¤ò¼«Æ°À¸À®Ãæ..."; +static char *str_SavingOpenTypeFont = "OpenType¥Õ¥©¥ó¥È¤òÊݸÃæ"; +static char *str_LoadBitmapFonts = "¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤ò¥í¡¼¥É¤·¤Þ¤¹¤«?"; +static char *str_LoadTTFBitmaps = "¤³¤ÎTrueType/OpenType¥Õ¥¡¥¤¥ë¤ËËä¤á¹þ¤Þ¤ì¤¿\n¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤òÆɤ߹þ¤ß¤Þ¤¹¤«?\n(¤½¤Î¾ì¹ç,¤É¤ì¤ò)"; +static char *str_BadEncoding = "ÉÔÀµ¤Ê¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°"; +static char *str_ExtraneousSingleByte = "2¥Ð¥¤¥Èʸ»ú¤Î1¥Ð¥¤¥ÈÌܤȽŤʤë1¥Ð¥¤¥Èʸ»ú (%d) ¤¬¤¢¤ê¤Þ¤¹."; +static char *str_OutOfEncoding = "Éä¹æ²½¤Ç¤­¤Ê¤¤Ê¸»ú (%d) ¤¬¤¢¤ê¤Þ¤¹."; +static char *str_NotNormallyEncoded = "¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤ËÄ̾ï´Þ¤Þ¤ì¤Ê¤¤Ê¸»ú (%d) ¤¬¤¢¤ê¤Þ¤¹."; + /* tottfgpos */ +static char *str_MultipleLookup = "ɽ°ú¤­¤¬Ê£¿ô¤¢¤ê¤Þ¤¹"; +static char *str_MultipleLookupLong = "Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥¢¥ó¥«¡¼¥¿¥°'%s'¤ËÂФ·¤ÆÊ£¿ô¤Îɽ°ú¤­¤¬À¸À®¤µ¤ì¤Þ¤·¤¿.¤³¤Î¤¦¤Á¤ÎÊÒÊý¤À¤±¤¬»ÈÍѤµ¤ì¤Þ¤¹"; +static char *str_MissingLookup = "ɽ°ú¤­¤¬Â¸ºß¤·¤Þ¤»¤ó"; +static char *str_MissingLookupLong = "¥¿¥°'%s'¤ò¤â¤Ä,Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿É½°ú¤­¤Ï¸ºß¤·¤Þ¤»¤ó. À¸À®¤µ¤ì¤¿¥Õ¥©¥ó¥È¤Ï»ÈÍѤǤ­¤Þ¤»¤ó. ¡Ö¥¨¥ì¥á¥ó¥È¡×¢ª¡ÖÌäÂê¤òȯ¸«¡×¤ÇÄ´¤Ù¤Æ¤ß¤Æ¤¯¤À¤µ¤¤"; + /* Spline Fill */ +static char *str_Rasterizing = "¥é¥¹¥¿¥é¥¤¥ºÃæ..."; +static char *str_GenBitmap = "¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤òÀ¸À®Ãæ"; +static char *str_GenAntiAlias = "¥¢¥ó¥Á¥¨¥¤¥ê¥¢¥¹¥Õ¥©¥ó¥È¤òÀ¸À®Ãæ"; +/* "%d pixels" (for the size of the font being rasterized) */ +static char *str_Pixels = " ¥Ô¥¯¥»¥ë"; + /* print */ +static char *str_PrintingFont = "¥Õ¥©¥ó¥È¤ò°õºþÃæ"; +static char *str_GeneratingPostscriptFont = "Postscript¥Õ¥©¥ó¥È¤òÀ¸À®Ãæ"; +static char *str_FailedGenPost = "PostScript¥Õ¥©¥ó¥È¤ÎÀ¸À®¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char *str_PageSetup = "¥Ú¡¼¥¸ÀßÄê"; +static char *str_Setup = "ÀßÄê(e)"; +static char mnemonic_Setup = 'e'; +static char *str_Other2 = "¤½¤Î¾(o)"; +static char mnemonic_Other = 'o'; +static char *str_PrintOtherPopup = "¾åµ­°Ê³°¤ÎǤ°Õ¤Î¥³¥Þ¥ó¥É(¤¹¤Ù¤Æ¤Î°ú¿ô¤ò´Þ¤à).\n¤³¤Î¥³¥Þ¥ó¥É¤Ï, 1¸Ä¤ÎPostScript¥Õ¥¡¥¤¥ë¤òɸ½àÆþÎϤ«¤éÆɤ߹þ¤à\n¤â¤Î¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó."; +static char *str_ToFile = "½ÐÎÏ¥Õ¥¡¥¤¥ë(F)"; +static char mnemonic_ToFile = 'F'; +static char *str_PageSize = "Íѻ極¥¤¥º(S):"; +static char mnemonic_PageSize = 'S'; +static char *str_Copies = "Éô¿ô(C):"; +static char mnemonic_Copies = 'C'; +static char *str_Printer = "¥×¥ê¥ó¥¿(P):"; +static char mnemonic_Printer = 'P'; +static char *str_PrintToFile = "¥Õ¥¡¥¤¥ë¤Ø½ÐÎÏ..."; +static char *str_Pointsize = "¥Ý¥¤¥ó¥È¥µ¥¤¥º(P):"; +static char mnemonic_Pointsize = 'P'; +static char *str_FullFont = "¥Õ¥©¥ó¥ÈÆâ¤ÎÁ´Ê¸»ú¤ò°õºþ(F)"; +static char mnemonic_FullFont = 'F'; +static char *str_FullFontPopup = "¥Õ¥©¥ó¥ÈÆâ¤ÎÁ´¤Æ¤Îʸ»ú¤ò,»ØÄꤷ¤¿¥µ¥¤¥º¤ÇĹÊý·Á¤Î¥°¥ê¥Ã¥É¤Ëʤ٤Æɽ¼¨¤·¤Þ¤¹"; +static char *str_FullPageChar = "Á´¥Ú¡¼¥¸¤Ëʸ»ú¤ò°õºþ(C)"; +static char mnemonic_FullPageChar = 'C'; +static char *str_FullPageChars = "Á´¥Ú¡¼¥¸¤Ëʸ»ú¤ò°õºþ(C)"; +static char mnemonic_FullPageChars = 'C'; +static char *str_FullPageCharPopup = "ÁªÂò¤µ¤ì¤¿Á´¤Æ¤Îʸ»ú¤ò,¤½¤ì¤¾¤ì¤Î1¥Ú¡¼¥¸¤ò»È¤¤,Èó¾ï¤ËÂ礭¤Ê¥Ý¥¤¥ó¥È¥µ¥¤¥º¤Ç°õºþ¤·¤Þ¤¹"; +static char *str_MultiSizeChar = "¥µ¥¤¥º¤òÊѤ¨¤Æʸ»ú¤ò°õºþ(M)"; +static char mnemonic_MultiSizeChar = 'M'; +static char *str_MultiSizeChars = "¥µ¥¤¥º¤òÊѤ¨¤Æʸ»úÎó¤ò°õºþ(M)"; +static char mnemonic_MultiSizeChars = 'M'; +static char *str_MultiSizeCharPopup = "ÁªÂò¤µ¤ì¤¿Á´¤Æ¤Îʸ»ú¤ò,¤¤¤¯¤Ä¤«¤Î°Û¤Ê¤ë¥Ý¥¤¥ó¥È¿ô¤Ç°õºþ¤·¤Þ¤¹"; +static char *str_SampleTextPopup = "°Ê²¼¤Î¥Æ¥­¥¹¥È¤ò»ØÄꤵ¤ì¤¿¥Ý¥¤¥ó¥È¥µ¥¤¥º¤Ç°õºþ¤·¤Þ¤¹." +static char mnemonic_SampleText = 'S'; +static char *str_SampleTextC = "¥µ¥ó¥×¥ë¥Æ¥­¥¹¥È¤ò»ÈÍÑ(T)"; +static char mnemonic_SampleTextC = 'T'; +static char *str_FailedOpenTemp = "°ì»þ¥Õ¥¡¥¤¥ë¤ò³«¤¯¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char *str_NoCommandSpecified = "¥³¥Þ¥ó¥É¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó."; +static char *str_InvalidPointsize = "¥Ý¥¤¥ó¥È¿ô¤¬ÉÔÀµ¤Ç¤¹"; + /* alignment */ +static char *str_CoordinateAlongWhich = ";Çò¤ò³«¤±¤ëºÂɸÊý¸þ"; +static char *str_X = "X"; +static char mnemonic_X = 'X'; +static char *str_Y = "Y"; +static char mnemonic_Y = 'Y'; +static char *str_MaximumDistanceBetweenPts = "ÎΰèÆâ¤ÎÅÀƱ»Î¤ÎºÇÂçµ÷Î¥(M)"; +static char mnemonic_MaximumDistanceBetweenPts = 'M'; +static char *str_NotEnoughLines = "½½Ê¬¤Ê¹Ô¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_CantParallel = "Ê¿¹Ô¤Ë¤Ç¤­¤Þ¤»¤ó."; +static char *str_ShareCommonEndpoint = "2ËܤÎľÀþ¤ÏüÅÀ¤ò¶¦Í­¤·¤Æ¤¤¤ë¤Î¤Ç, Ê¿¹Ô¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó."; + /* parsettf */ +static char *str_ReadingNames = "̾Á°¤òÆɤ߹þ¤ßÃæ"; +static char *str_FixingupReferences = "¥ê¥½¡¼¥¹¤Î½¤ÉüÃæ"; +static char *str_NoBitmaps = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_NoBitmapsInTTF = "¤³¤ÎTTF¥Õ¥©¥ó¥È¤Ë¤Ï(ÍøÍѲÄǽ¤Ê)¥Ó¥Ã¥È¥Þ¥Ã¥×¤¬¤¢¤ê¤Þ¤»¤ó: %hs"; +static char *str_NotInCollection = "TTC¤Ë´Þ¤Þ¤ì¤Þ¤»¤ó."; +static char *str_FontNotInCollection = "%hs ¤Ï %.100hs ¤Ë´Þ¤Þ¤ì¤Þ¤»¤ó."; +static char *str_UntitledAnchor_n = "Untitled-%d"; +static char *str_TTFGlyf = "TTF 'glyf'"; +static char *str_OTFCFF = "OTF 'CFF '"; +static char *str_GlyfAndCFF = "¤³¤Î¥Õ¥©¥ó¥È¤ÏTrueType¤Î'glyf'¥Æ¡¼¥Ö¥ë¤ÈOpenType¤Î'CFF '¥Æ¡¼¥Ö¥ë¤ÎξÊý¤ò´Þ¤ó¤Ç¤¤¤Þ¤¹. FontForge ¤Ï°ìÅ٤ˤɤÁ¤é¤«ÊÒÊý¤·¤«°·¤¨¤Ê¤¤¤Î¤Ç,¤É¤Á¤é¤ò»È¤¦¤«Áª¤ó¤Ç¤¯¤À¤µ¤¤."; + /* sfd */ +static char *str_Saving = "ÊݸÃæ..."; +static char *str_SavingDb = "Spline Font Database·Á¼°¤ÇÊݸÃæ"; +static char *str_SavingOutlines = "¥¢¥¦¥È¥é¥¤¥ó¤òÊݸÃæ"; +static char *str_SavingBitmaps = "¥Ó¥Ã¥È¥Þ¥Ã¥×¤òÊݸÃæ"; +static char *str_RecoveryFailed = "½¤Éü¤Ë¼ºÇÔ¤·¤Þ¤·¤¿."; +static char *str_RecoveryOfFailed = "¥Õ¥¡¥¤¥ë %.80hs ¤Ë¹Ô¤Ã¤¿Êѹ¹¤ò¼«Æ°Éü¸µ¤¹¤ë¤Î¤Ë¼ºÇÔ¤·¤Þ¤·¤¿.\nFontForge¤ò¼¡¤Ëµ¯Æ°¤·¤¿¤È¤­¤Ë¤Þ¤¿Éü¸µ¤ò»î¤·¤Æ¤ß¤Þ¤¹¤«?"; +static char *str_TryAgain = "¤Þ¤¿»î¤¹"; +static char *str_ForgetIt = "¤â¤¦¤·¤Ê¤¤"; + /* start.c */ +static char *str_FontForge = "FontForge"; + /* cvpointer.c */ +static char *str_NegativeWidth = "¥Þ¥¤¥Ê¥¹¤Îʸ»úÉý"; +static char *str_NegativeWidthCheck = "TrueType¤Ç¤Ïʸ»úÉý¤òÉé¤ÎÃͤˤ¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó.\nËÜÅö¤Ë¥Þ¥¤¥Ê¥¹¤Îʸ»úÉý¤ò¥»¥Ã¥È¤·¤¿¤¤¤Î¤Ç¤¹¤«?"; + /* hanyang.c */ +static char *str_Hangul = "¥Ï¥ó¥°¥ë(H)"; +static char mnemonic_Hangul = 'H'; +static char *str_NewComposition = "¿·¤·¤¤Áȹ礻¤òÄêµÁ(N)..."; +static char mnemonic_NewComposition = 'N'; +static char *str_ModifyComposition = "Áȹ礻¤ò½¤Àµ(M)..."; +static char mnemonic_ModifyComposition = 'M'; +static char *str_BuildSyllables = "²»Àá¤ò¹½ÃÛ¤¹¤ë(B)"; +static char mnemonic_BuildSyllables = 'B'; +static char *str_ChoSung = "½éÀ¼"; +static char *str_JungSung = "ÃæÀ¼"; +static char *str_JongSung = "½ªÀ¼"; +static char *str_ChoSungC = "½éÀ¼:"; +static char *str_JungSungC = "ÃæÀ¼:"; +static char *str_JongSungC = "½ªÀ¼:"; +static char *str_Mapping = "Mapping..."; +fastatic char mnemonic_Mapping = 'M'; +static char *str_Width = "Éý(W)"; +static char mnemonic_Width = 'W'; +static char *str_WidthC = "Éý(W):"; +static char mnemonic_WidthC = 'W'; +static char *str_WidthDDD = "Éý(W)..."; +static char mnemonic_WidthDDD = 'W'; +static char *str_Reset = "¥ê¥»¥Ã¥È"; +static char *str_LoadFrom = "¥Õ¥¡¥¤¥ë¤«¤é¥í¡¼¥É(L)..."; +static char mnemonic_LoadFrom = 'L'; +static char *str_BadWidth = "Éý¤Î¿ôÃͤ¬¸í¤ê¤Ç¤¹."; +static char *str_BadGroup = "¥°¥ë¡¼¥×¤Î¿ôÃͤ¬¸í¤ê¤Ç¤¹."; +static char *str_JamoHoleTitle = "»ÈÍѤµ¤ì¤Æ¤¤¤Ê¤¤°ÛÂλú"; +static char *str_JamoHole = "¥°¥ë¡¼¥×%d(%s¤Î)¤ËÂФ·¤Æ¤Ï, °ÛÂλú%d¤Ç¤Ï¤Ê¤¯%d¤¬ÍѤ¤¤é¤ì¤Þ¤¹.\n¤½¤ì¤Ç¤â³¤±¤Þ¤¹¤«?"; +static char *str_NoRules = "¥ë¡¼¥ë¤¬¤¢¤ê¤Þ¤»¤ó"; +static char *str_FileHasNoRules = "%.100hs ¤Ë¤Ï·ë¹ç¥ë¡¼¥ë¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó."; +static char *str_DeleteNo = "ºï½ü"; /* With no mnemonic */ + /* Need a different mnemonic */ +static char *str_AddAll = "¤¹¤Ù¤ÆÄɲÃ(d)"; +static char mnemonic_AddAll = 'd'; +static char *str_DisplayCompositions = "Áȹ礻¤òɽ¼¨(D)..."; +static char mnemonic_DisplayCompositions = 'D'; +static char *str_NoGroups = "¤³¤Î»úÊì¤Î°ÛÂλú¤Ï¼ÂºÝ¤Ë¤ÏÍѤ¤¤é¤ì¤Þ¤»¤ó."; +static char *str_UniVarient = "Unicode %04X, °ÛÂλú %d, %s"; +static char *str_BuildingKoreanFont = "´Ú¹ñ¸ì¥Õ¥©¥ó¥È¤ò¹½ÃÛÃæ"; + /* Transform */ +static char *str_CharacterOrigin = "ʸ»ú¤Î¸¶ÅÀ"; +static char *str_CenterOfSelection = "ÁªÂòÎΰè¤ÎÃæ¿´ÅÀ"; +static char *str_LastPress = "ºÇ¸å¤ËÁª¤ó¤ÀÅÀ"; +static char *str_DoNothing = "²¿¤â¤·¤Ê¤¤"; +static char *str_MoveDDD = "°ÜÆ°..."; +static char *str_RotateDDD = "²óž..."; +static char *str_ScaleDDD = "³ÈÂ硦½Ì¾®..."; +static char *str_ScaleUniformlyDDD = "°ìÍͤ˳ÈÂ硦½Ì¾®..."; +static char *str_FlipDDD = "ȿž..."; +static char *str_SkewDDD = "·¹¤­..."; +static char *str_TransformBackground = "Çطʤâ°ì½ï¤ËÊÑ´¹¤¹¤ë(B)"; +static char mnemonic_TransformBackground = 'B'; +static char *str_Warning = "·Ù¹ð¤¹¤ë"; +static char *str_RotateSkewWarning = "ʸ»ú¤ò²óž¤µ¤»¤¿¤êÏĤޤ»¤¿¸å, [¥¨¥ì¥á¥ó¥È]¢ª[¶ËÂçÅÀ¤ÎÄɲÃ]¤ò¹Ô¤¦É¬Íפ¬¤¢¤ë¤Ï¤º¤Ç¤¹."; + /* scripting */ +static char *str_Call = "¸Æ¤Ó½Ð¤¹(a)..."; +static char mnemonic_Call = 'a'; +static char *str_CallScript = "¥¹¥¯¥ê¥×¥È¤ò¸Æ¤Ó½Ð¤¹"; + /* start (about box) */ +static char *str_FreePress = "A free press discriminates\nagainst the illiterate."; +static char *str_GaudiamusLigature = "´¿³Ú¤Ë¹ç»ú¤è¤¦!"; +static char *str_InTheBeginning = "ÂÀ½é¤Ëʸ»úÍ­¤ê¤­¡Ä"; +static char *str_LovelyFonts = " ²æ¤¬ÉÔ±¿:\nÈþ¤·¤­³è»ú¤òÂϤ¯ÀѤá¤É,\n ²¿¤â¸À¤¤¤¿¤¤»ö¤Ï̵¤·."; + /* search */ + /* search */ +static char *str_SearchPattern = "¸¡º÷¥Ñ¥¿¡¼¥ó:"; +static char *str_ReplacePattern = "ÃÖ´¹¥Ñ¥¿¡¼¥ó:"; +static char *str_Allow = "µöÍƤ¹¤ëÊÑ´¹:"; +static char *str_Flipping = "ȿž"; +static char *str_Scaling = "³ÈÂç/½Ì¾®"; +static char *str_Rotating = "²óž"; +static char *str_AllowTransPopup = "¸¡º÷¥Ñ¥¿¡¼¥ó¤Ë°Ê²¼¤ÎÊÑ´¹¤ò²Ã¤¨¤¿Êª¤â\n°ìÃפÎÂоݤȤ·¤Þ¤¹."; +static char *str_SearchSelected = "ÁªÂòʸ»ú¤Î¤ß¸¡º÷"; +static char *str_SearchSelectedPopup = "¥Õ¥©¥ó¥Èɽ¼¨²èÌ̤ÇÁªÂò¤µ¤ì¤¿Ê¸»ú¤Î¤ß¤ò¸¡º÷ÂоݤȤ·¤Þ¤¹.\nÄ̾ï¤Ï¥Õ¥©¥ó¥ÈÆâ¤ÎÁ´Ê¸»ú¤«¤é¸¡º÷¤·¤Þ¤¹."; +static char *str_Find = "¸¡º÷"; +static char *str_FindIn = "%.100hs ¤«¤é¸¡º÷"; +static char *str_FindNext = "¼¡¤ò¸¡º÷"; +static char *str_FindAll = "Á´¤Æ¸¡º÷"; +static char *str_ReplaceFind = "ÃÖ´¹¤·¤Æ¸¡º÷"; +static char *str_ReplaceAll = "¤¹¤Ù¤ÆÃÖ´¹"; +static char *str_BadRefInSearchRpl = "%1$s ¤Ë¤Ï, ¿·¤·¤¤¥Õ¥©¥ó¥È¤Ë¤Ï´Þ¤Þ¤ì¤Ê¤¤Ê¸»ú %2$.20hs ¤Ø¤Î»²¾È¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹.\n»²¾È¤òºï½ü¤·¤Þ¤¹¤«?"; +static char *str_NotFound = "¸«¤Ä¤«¤ê¤Þ¤»¤ó" +static char *str_PatternNotFound = "¸¡º÷¥Ñ¥¿¡¼¥ó¤Ï¥Õ¥©¥ó¥È %.100hs ¤ÎÃæ¤Ë¤Ï¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿."; +static char *str_PatternNotFoundAgain = "¸¡º÷¥Ñ¥¿¡¼¥ó¤Ï¥Õ¥©¥ó¥È %.100hs ¤ÎÃæ¤Ë¤Ï¤³¤ì°Ê¾å¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿."; +static char *str_FindReplace = "¸¡º÷ / ÃÖ´¹(i)"; +static char *mnemonic_FindReplace = "i"; + /* combinations */ +static char *str_SelectLigature = "ɽ¼¨¤¹¤ë¹ç»ú¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤."; +static char *str_SortBy = "ʤӽç:"; +static char *str_FirstChar = "ºÇ½é¤Îʸ»ú"; +static char *str_SecondChar = "2ÈÖÌܤÎʸ»ú"; +static char *str_KernSize = "¥«¡¼¥Ë¥ó¥°¤Î¥µ¥¤¥º"; + /* tilepath */ +static char *str_Center_ = "Ãæ±û(e)"; +static char mnemonic_Center_ = 'e'; +static char *str_CenterPopup = "(¥¯¥ê¥Ã¥×¥Ü¡¼¥ÉÆâ¤Î)¥¿¥¤¥ë¤ò¥Ñ¥¹¤ÎÃæ±û¤Ë½Å¤Í¤ÆÉߤ­µÍ¤á¤Þ¤¹." +static char *str_Left = "º¸(L)"; +static char mnemonic_Left = 'L'; +static char *str_LeftPopup = "(¥¯¥ê¥Ã¥×¥Ü¡¼¥ÉÆâ¤Î)¥¿¥¤¥ë¤ò, ¥Ñ¥¹¤Î»ÏÅÀ¤«¤é½ªÅÀ¤Ø¤Î\n¸þ¤­¤«¤é¸«¤Æº¸Â¦¤Ë½Å¤Í¤ÆÉߤ­µÍ¤á¤Þ¤¹." +static char *str_Right = "±¦(R)"; +static char mnemonic_Right = 'R'; +static char *str_RightPopup = "(¥¯¥ê¥Ã¥×¥Ü¡¼¥ÉÆâ¤Î)¥¿¥¤¥ë¤ò, ¥Ñ¥¹¤Î»ÏÅÀ¤«¤é½ªÅÀ¤Ø¤Î\n¸þ¤­¤«¤é¸«¤Æ±¦Â¦¤Ë½Å¤Í¤ÆÉߤ­µÍ¤á¤Þ¤¹." +static char *str_Tile = "·«¤êÊÖ¤·(T)"; +static char mnemonic_Tile = 'T'; +static char *str_TilePopup = "ÁªÂò¤·¤¿¥¢¥¦¥È¥é¥¤¥ó¤ò¥¿¥¤¥ë¤È¤·¤Æ°·¤¤, ¥Ñ¥¹¾å¤Ë·«¤êÊÖ¤·Éߤ­µÍ¤á¤Þ¤¹."; +static char *str_Scale = "³ÈÂç/½Ì¾®(S)"; +static char mnemonic_Scale = 'S'; +static char *str_ScalePopup = "ÁªÂò¤·¤¿¥¢¥¦¥È¥é¥¤¥ó¤ò, ¥Ñ¥¹¤ÎŤµ¤ò¤Á¤ç¤¦¤Éʤ¤¦¤è¤¦¤Ë³ÈÂç/½Ì¾®¤·¤Þ¤¹." +static char *str_TileScale = "³ÈÂç/½Ì¾®&·«¤êÊÖ¤·(a)"; +static char mnemonic_TileScale = 'a'; +static char *str_TileScalePopup = "ÁªÂò¤·¤¿¥¢¥¦¥È¥é¥¤¥ó¤Î¥³¥Ô¡¼¤òÀ°¿ô¸Ä»ÈÍѤ·¤Æ\n¥Ñ¥¹¤òʤ¤¤¤Þ¤¹. ¥Ñ¥¹¤ÎŤµ¤¬ÁªÂòÉôʬ¤Î¹â¤µ¤Ç\n¤Á¤ç¤¦¤É³ä¤êÀÚ¤ì¤Ê¤¤¾ì¹ç, ¥¢¥¦¥È¥é¥¤¥ó¤ò\n¤ï¤º¤«¤Ë³ÈÂç/½Ì¾®¤·¤Þ¤¹."; + /* Display fonts */ +static char *str_AA = "³¬Ä´É½¼¨(A)"; +static char mnemonic_AA = 'A'; +static char *str_AAPopup = "ʸ»ú¤ò³¬Ä´É½¼¨(¥°¥ì¥¤¥Þ¥Ã¥×¤Ç)¤¹¤ë¤«, ¥Ó¥Ã¥È¥Þ¥Ã¥×ɽ¼¨¤«¤ò»ØÄꤷ¤Þ¤¹."; +static char *str_PixelSizePopup = "²èÌ̾å¤Îʸ»ú¤Î¥Ô¥¯¥»¥ë¥µ¥¤¥º¤ò»ØÄꤷ¤Þ¤¹"; +static char *str_FormatPopup = "¥Õ¥©¥ó¥È¤òfreetype¤ËÅϤ¹¤È¤­¤Î¥Õ¥¡¥¤¥ë¥Õ¥©¡¼¥Þ¥Ã¥È¤ò»ØÄꤷ¤Þ¤¹\n pfb ¡½ ɸ½à¤ÎPostScript Type1¥Õ¥©¥ó¥È\n ttf ¡½ TrueType¥Õ¥©¥ó¥È\n httf ¡½ ¥Ò¥ó¥È¤Ä¤­TrueType\n otf ¡½ OpenType\n bitmap ¡½ ¥ì¥ó¥À¥ê¥ó¥°¤Ëfreetype¤ò»ÈÍѤ·¤Ê¤¤.\n ¤¢¤é¤«¤¸¤á¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤òÀ¸À®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹.\n FontForge ¡½ freetype¤Î¥é¥¹¥¿¥é¥¤¥¶¤Ç¤Ê¤¯,FontForge¤ÎÆ⢥饹¥¿¥é¥¤¥¶¤ò»ÈÍѤ·¤Þ¤¹.\n ºÇ¸å¤Î¼êÃʤȤ·¤Æ¤Î¤ßÄ󶡤·¤Æ¤¤¤Þ¤¹."; +static char *str_BadSize = "¥µ¥¤¥º¤¬ÉÔÀµ¤Ç¤¹."; +static char *str_RequestedSizeNotAvail = "»ØÄꤷ¤¿¥µ¥¤¥º¤Î¥Ó¥Ã¥È¥Þ¥Ã¥×¤Ï¥Õ¥©¥ó¥È¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó.\n¥Õ¥©¥ó¥È¤¬¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¤Î¤Ï %hs ¤Î³Æ¥µ¥¤¥º¤Ç¤¹."; +static char *str_BadFont = "¥Õ¥©¥ó¥È¤¬²õ¤ì¤Æ¤¤¤Þ¤¹."; + /* Mac specific */ +static char *str_LeaveX = "X¤òÈ´¤±¤Æ¤¯¤À¤µ¤¤"; +static char *str_LeaveXLong = "¤ª¤½¤é¤¯,¥Ö¥é¥¦¥¶¤ÏMac¸ÇÍ­¤Î¥¦¥£¥ó¥É¥¦¥·¥¹¥Æ¥à¤Î²¼¤Ç¼Â¹ÔÃæ¤Ç¤¹. ±ÜÍ÷¤¹¤ë¤Ë¤ÏX´Ä¶­¤òÈ´¤±¤ëɬÍפ¬¤¢¤ê¤Þ¤¹. Cmd-Opt-A ¤ò»î¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤."; +static char *str_NoATM = "À¸À®¤µ¤ì¤¿¥Õ¥©¥ó¥È¤ÏATM¤ÇÆ°¤­¤Þ¤»¤ó"; +static char *str_BadEncodingForATM = "ATM¤Ï,¥Õ¥©¥ó¥È¤¬Macintosh¥é¥Æ¥ó¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤Ç¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó. ¤³¤ÎPostScript¥Õ¥©¥ó¥È¤Ï°õºþ¤Ï¾å¼ê¤¯¤¤¤­¤Þ¤¹¤¬,²èÌÌɽ¼¨¾å¤Ç¤Ï¥Ó¥Ã¥È¥Þ¥Ã¥×¤·¤«É½¼¨¤µ¤ì¤Þ¤»¤ó"; + /* Simplifydlg */ +static char *str_RemoveExtrema = "¶ËÃͤÎÅÀ¤ò¼è¤ê½ü¤¯¤³¤È¤òµö¤¹"; +static char mnemonic_RemoveExtrema = 'r'; +static char *str_RemoveExtremaPopup = "Ä̾ï¤Îñ½ã²½½èÍý¤Ç¤ÏºÂɸ¤¬¶ËÃͤˤ¢¤ë¶ÊÀþ¾å¤ÎÅÀ¤ò½üµî¤·¤Þ¤»¤ó\n(PostScript¤âTrueType¤â¤³¤ì¤é¤ÎÅÀ¤òÊÝ»ý¤¹¤ë¤³¤È¤ò¼¨º¶¤·¤Æ¤¤¤Þ¤¹)."; +static char *str_ChangeSlopes = "·¹¤­¤ÎÊѹ¹¤òµö¤¹"; +static char mnemonic_ChangeSlopes = 's'; +static char *str_ChangeSlopesPopup = "Ä̾ï¤Îñ½ã²½½èÍý¤Ç¤ÏüÅÀ¤Ë¤ª¤±¤ë·¹¤­¤òÊѹ¹¤·¤Þ¤»¤ó."; +static char *str_ErrorLimit = "¸íº¹¤Î¸Â³¦:"; +static char mnemonic_ErrorLimit = 'E'; +static char *str_EmUnits = "¥°¥ê¥Ã¥É"; +static char *str_CurveSmoothing = "¶ÊÀþ¤ÎÊ¿³ê²½¤òµö¤¹(c)"; +static char mnemonic_CurveSmoothing = 'c'; +static char *str_CurveSmoothingPopup = "¡Öñ½ã²½¡×¤ÎºÝ¤ËÎÀ©¸æÅÀ¤¬¤Û¤È¤ó¤ÉÊ¿¹Ô¤ÊĺÅÀ¤òõ¤·,¶ÊÀþ¾å¤ÎÅÀ¤ËÃÖ¤­´¹¤¨¤Þ¤¹."; +static char *str_IfTan = "¤è¤ê¤â·¹¤­¤¬¾®¤µ¤¤¾ì¹ç" +static char *str_SnapToHV = "ľ³Ñ¤Ë·¤¨¤ë(n)"; +static char mnemonic_SnapToHV = 'n'; +static char *str_SnapToHVPopup = "Ä´À°¸å¤ÎÅÀ¤Ë¤ª¤±¤ë·¹¤­¤¬¤Û¤È¤ó¤É¿åÊ¿/¿âľ¤Ç\n¤¢¤ë¾ì¹ç,¿åÊ¿/¿âľ¤Ë·¤¨¤Þ¤¹"; +static char *str_FlattenBumps = "Àþ¾å¤Î±úÆ̤òÊ¿¤é¤Ë¤¹¤ë" +static char mnemonic_FlattenBumps = 'f'; +static char *str_FlattenBumpsPopup = "ÎسÔÀþ¤Ë±úÆ̤¬¤¢¤ë¾ì¹ç,¤½¤ì¤òÊ¿³ê²½¤·¤Þ¤¹"; +static char *str_IfSmallerThan = "¤³¤ì¤è¤ê¾®¤µ¤¤¾ì¹ç"; +static char *str_BumpSize = "±úÆ̤Υµ¥¤¥º"; + /* ttfinstrs */ +static char *str_TTFInstructionsFor = "%.50hs ¤ÎTrueTypeÌ¿Îá"; +static char *str_Parse = "²òÀÏ(P)"; +static char mnemonic_Parse = 'P'; +static char *str_ParseError = "²òÀÏ¥¨¥é¡¼"; +static char *str_MissingLParenCvt = "cvt¥¤¥ó¥Ç¥Ã¥¯¥¹¤òÆÀ¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¤Ëº¸³ç¸Ì¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_MissingRParenCvt = "cvt¥¤¥ó¥Ç¥Ã¥¯¥¹¤òÆÀ¤ë¤¿¤á¤Î¥³¥Þ¥ó¥É¤Ë±¦³ç¸Ì¤¬¤¢¤ê¤Þ¤»¤ó."; +static char *str_NeedPushCount = "pushÈÖ¹æ¤È¤Ê¤ë¿ô»ú¤¬¤³¤³¤Ë¤¢¤ë¤Ï¤º¤Ç¤¹"; +static char *str_InvalidPushCount = "pushÈÖ¹æ¤Ï0¤«¤é255¤Î´Ö¤Î¿ô¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó"; +static char *str_ExtraPushes = "ɬÍפʲó¿ô¤è¤ê;·×¤Ëpush¤¬¤¢¤ê¤Þ¤¹"; +static char *str_InvalidUnsignedByte = "1¥Ð¥¤¥Èpush¤Ë¤è¤Ã¤Æpush¤µ¤ì¤ëÃͤÏ0¤«¤é255¤Î´Ö¤Î¿ô¤Ç¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó"; +static char *str_MissingPushes = "push¤¬¤¢¤ê¤Þ¤»¤ó"; +static char *str_MissingRBracket = "¥³¥Þ¥ó¥É¤Ë±¦³ç¸Ì¤¬¤¢¤ê¤Þ¤»¤ó(¤Þ¤¿¤Ï³ç¸ÌÆâ¤Ë´Ö°ã¤Ã¤¿Ãͤ¬¤¢¤ê¤Þ¤¹)"; +static char *str_BracketNumTooBig = "³ç¸ÌÆâ¤ÎÃͤ¬Â礭¤¹¤®¤Þ¤¹" +static char *str_InvalidShort = "ÃͤÏ[-32768,32767]¤ÎÈÏ°ÏÆâ¤Ë¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char *str_InstrChanged = "Ì¿Î᤬Êѹ¹¤µ¤ì¤Þ¤·¤¿"; +static char *str_AskInstrChanged = "%.80hs ¤ÎÌ¿Î᤬Êѹ¹¤µ¤ì¤Þ¤·¤¿. ¤³¤ì¤é¤ÎÊѹ¹¤ò¼º¤Ã¤Æ¤â¹½¤¤¤Þ¤»¤ó¤«?"; + /* cvgridfit.c */ +static char *str_DPI = "DPI:"; +static char mnemonic_DPI = 'P'; +static char *str_ShowGridFit = "¥°¥ê¥Ã¥É¹ç¤ï¤»¤òɽ¼¨(G)"; +static char mnemonic_ShowGridFit = 'G'; +static char *str_FreeTypeParams = "¥°¥ê¥Ã¥É¹ç¤ï¤»¤Î¥Ñ¥é¥á¡¼¥¿"; +static char *str_NoByteCode = "¥Ð¥¤¥È¥³¡¼¥É¥¤¥ó¥¿¥×¥ê¥¿¤¬¤¢¤ê¤Þ¤»¤ó"; +static char *str_NoByteCodeMsg = "¤³¤ì¤é¤Î·ë²Ì¤ÏFreeType¤Î¼«Æ°¥Ò¥ó¥È¤Å¤±µ¡Ç½¤Ë¤è¤ë¤â¤Î¤Ç¤¹. ¤³¤ì¤ÏTrueType¤Î¥Ò¥ó¥ÈÌ¿Îá¤òÈ¿±Ç¤·¤Æ¤¤¤Þ¤»¤ó"; +static char *str_Debug = "¥Ç¥Ð¥Ã¥°(D)"; +static char mnemonic_Debug = 'D'; +static char *str_Debugfpgm = "fpgm/prep¤ò¥Ç¥Ð¥Ã¥°"; +static char mnemonic_Debugfpgm = 'f'; +static char *str_StepPopup = "¥¹¥Æ¥Ã¥×¼Â¹Ô"; +static char *str_NextPopup = "¼¡¤Î¹Ô¤Þ¤Ç¼Â¹Ô"; +static char *str_StepOutOfPopup = "´Ø¿ô¤ÎºÇ¸å¤Þ¤Ç¼Â¹Ô"; +static char *str_ContinuePopup = "³¤±¤ë"; +static char *str_WatchPointPopup = "ÁªÂò¤·¤¿ÅÀ¤ò´Æ»ë\n(ÅÀ¤¬Æ°¤¤¤¿»þ¤ËÃæÃÇ)"; +static char *str_TooManyBreakpoints = "¥Ö¥ì¡¼¥¯¥Ý¥¤¥ó¥È¤¬Â¿¤¹¤®¤Þ¤¹"; +static char *str_NoWatchPoints = "´Æ»ëÅÀ¤¬¤¢¤ê¤Þ¤»¤ó"; +static char *str_NoWatchPointsWithRefs = "»²¾È¤ò´Þ¤à¥°¥ê¥Õ¤Ç¤Ï´Æ»ëÅÀ¤Ï¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤»¤ó"; +static char *str_HitWatchPoint = "´Æ»ëÅÀ¤ËÅþã"; +static char *str_HitWatchPointn = "ÅÀ %d ¤¬Ä¾Á°¤ÎÌ¿Îá¤Ë¤è¤Ã¤Æ°ÜÆ°¤·¤Þ¤·¤¿"; +static char *str_TTRegisters = "¥ì¥¸¥¹¥¿(TrueType)"; +static char *str_TTStack = "¥¹¥¿¥Ã¥¯(TrueType)"; +static char *str_TTStorage = "¥¹¥È¥ì¡¼¥¸(TrueType)"; +static char *str_TTPoints = "ÅÀ(TrueType)"; +static char *str_TTCvt = "Cvt (TrueType)"; +static char *str_Registers = "¥ì¥¸¥¹¥¿"; +static char *str_Stack = "¥¹¥¿¥Ã¥¯"; +static char *str_Storage = "¥¹¥È¥ì¡¼¥¸"; +static char *str_Cvt = "Cvt"; +static char *str_Twilight = "Twilight"; +static char *str_Normal = "Ä̾ï"; +static char *str_Current = "¸½ºß"; +static char *str_Original = "Åö½é"; +static char *str_GridUnit = "¥°¥ê¥Ã¥É"; +static char *str_EmUnit = "Em¤¢¤¿¤ê¥æ¥Ë¥Ã¥È¿ô" +static char *str_ExitDebugger = "¥Ç¥Ð¥Ã¥¬¤ò½ªÎ»" + /* showatt */ +static char *str_NoAdvancedTypography = "Advanced Typography̵¤·"; +static char *str_AppleAdvancedTypography = "Apple Advanced Typography"; +static char *str_Empty = "¶õ"; +static char *str_Entry = "¥¨¥ó¥È¥ê (%d,%d)"; +static char *str_Exit = "½ªÎ» (%d,%d)"; +static char *str_MarkAnchorNamePos = "%.30s (%d,%d)" +static char *str_MarkLigComponentNamePos = "ÉôÉÊ %d %.30s (%d,%d)" +static char *str_MarkCharNamePos = "%.30hs (%d,%d)" +static char *str_MarkClassS = "¥Þ¡¼¥¯¥¯¥é¥¹ %.20s" +static char *str_BaseCharacters = "´ðÄìʸ»ú"; +static char *str_BaseLigatures = "´ðÄì¹ç»ú"; +static char *str_BaseMarks = "´ðÄì¥Þ¡¼¥¯"; +static char *str_OTFLanguage = "¸À¸ì"; +static char *str_OTFScript = "ÍÑ»ú·Ï"; +static char *str_RequiredFeature = "ɬ¿Ü¤Îµ¡Ç½"; + /* Metricsview */ +static char *str_NewKernClassEntry = "¤³¤Î¥«¡¼¥Ë¥ó¥°¥Ú¥¢(%.20hs¤È%.20hs)¤Ï¸½ºß,\n¤³¤ÎÁȤ߹ç¤ï¤»¤ËÂФ¹¤ë¥ª¥Õ¥»¥Ã¥È¤¬0¤È¤Ê¤Ã¤Æ¤¤¤ë\n¥«¡¼¥Ë¥ó¥°¥¯¥é¥¹¤Î°ìÉô¤Ç¤¹.\n¥«¡¼¥Ë¥ó¥°¥¯¥é¥¹¤Î¤³¤Î¹àÌܤòÊѹ¹¤·¤Æ¤è¤í¤·¤¤¤Ç¤¹¤«\n(¤½¤ì¤È¤â,¤³¤Î2ʸ»ú¤À¤±¤ò´Þ¤à¿·¤·¤¤\n¥«¡¼¥Ë¥ó¥°¥Ú¥¢¤òºîÀ®¤·¤Þ¤¹¤«)?"; +static char *str_NewKernClassEntTitle = "¥«¡¼¥Ë¥ó¥°¥¯¥é¥¹¤ò»ÈÍѤ·¤Þ¤¹¤«?" +static char *str_MetricsTitle = "%.50hs¤Î¥á¥È¥ê¥Ã¥¯"; + /* Kernclass */ +static char *str_KernClass = "¥«¡¼¥Ë¥ó¥°¥¯¥é¥¹"; +static char *str_ClassCnt = "¥¯¥é¥¹¤Î¸Ä¿ô:"; +static char *str_ClassIndex = "¥¯¥é¥¹¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹:"; +static char *str_SelectClass = "¥¯¥é¥¹¤òÁª¤Ö"; +static char *str_FromSelection = "ÁªÂòÃæ¤Îʸ»ú¤«¤é"; +static char *str_Set = "¥»¥Ã¥È"; +static char *str_SetFromSelectionPopup = "¤³¤Î¥¯¥é¥¹¤Îʸ»ú¤ò¥Õ¥©¥ó¥È¥Ó¥å¡¼¤Ç¤ÎÁªÂòÈϰϤ˴ޤá¤ë"; +static char *str_Select_nom = "ÁªÂò"; +static char *str_SelectFromClassPopup = "¥Õ¥©¥ó¥È¥Ó¥å¡¼¤Ç¤ÎÁªÂòÈϰϤò¤³¤Î¥¯¥é¥¹¤Îʸ»ú¤Ë´Þ¤á¤ë"; +Set the fontview's selection to be the characters in this class"; +static char *str_KernOffset = "¥«¡¼¥Ë¥ó¥°¥ª¥Õ¥»¥Ã¥È:"; +static char *str_AlreadyUsed = "´û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹"; +static char *str_AlreadyInClass = "%.30hs¤È¤¤¤¦Ê¸»ú¤ÏÊ̤Υ¯¥é¥¹¤Ç´û¤Ë\n»È¤ï¤ì¤Æ¤¤¤Þ¤¹. ¸µ¤Î¥¯¥é¥¹¤«¤éºï½ü¤·¤Þ¤¹¤«,¤½¤ì¤È¤â¤³¤Î¥¯¥é¥¹¤«¤éºï½ü¤·¤Þ¤¹¤«?" +static char *str_FromOld = "¸µ¤Î¥¯¥é¥¹¤«¤é"; +static char *str_FromThis = "¤³¤Î¥¯¥é¥¹¤«¤é"; +static char *str_SelectAScript="¥¹¥¯¥ê¥×¥È¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤"; +static char *str_ClassZero = "¥¯¥é¥¹0"; +static char *str_ClassZeroOffsets = "¥¯¥é¥¹0(\"¤½¤Î¾Á´¤Æ\")¤Î¥«¡¼¥Ë¥ó¥°ÃͤÏ,ɬ¤º0¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; + /* nonlineartrans */ +static char *str_BadToken = "ÉÔÀµ¤Ê¥È¡¼¥¯¥ó¤Ç¤¹"; +static char *str_BadNameToken = "ÉÔÀµ¤Ê¥È¡¼¥¯¥ó \"%.30hs\" ¤¬\n...%40hs ¤Î¶áÊդˤ¢¤ê¤Þ¤¹"; +static char *str_BadTokenExpected = "ÉÔÀµ¤Ê¥È¡¼¥¯¥ó¤¬¤¢¤ê¤Þ¤¹. ËÜÍè \"%.10hs\" ¤¬¤¢¤ë¤Ï¤º¤Ê¤Î¤¬,¼ÂºÝ¤Ë¤Ï \"%.10hs\" ¤¬\n...%40hs ¤Î¶áÊդˤ¢¤ê¤Þ¤¹"; +static char *str_BadTokenExpectedChar = "ÉÔÀµ¤Ê¥È¡¼¥¯¥ó¤¬¤¢¤ê¤Þ¤¹. ËÜÍè \"%.10hs\" ¤¬\n...%40hs ¤Î¶áÊդˤ¢¤ë¤Ï¤º¤Ç¤¹."; +static char *str_BadTokenChar = "ÉÔÀµ¤Ê¥È¡¼¥¯¥ó¤¬¤¢¤ê¤Þ¤¹. \"%c\" ¤¬\n...%40hs¤Î¶áÊդ˽и½¤·¤Þ¤·¤¿."; +static char *str_UnexpectedToken = "¸½¤ì¤Ê¤¤¤Ï¤º¤Î¥È¡¼¥¯¥ó¤¬\n...%40hs ¤ÎÁ°¤Ë½Ð¤ÆÍè¤Þ¤·¤¿."; +static char *str_UnexpectedTokenAtEnd = "¸½¤ì¤Ê¤¤¤Ï¤º¤Î¥È¡¼¥¯¥ó¤¬¼°¤Î½ª¤ï¤Ã¤¿¸å¤í,\n...%40hs ¤ÎÁ°¤Ë½Ð¤ÆÍè¤Þ¤·¤¿."; +static char *str_BadValue = "ÉÔÀµ¤ÊÃͤǤ¹"; +static char *str_BadLogarithem = "ÃÍ %g ¤ÎÂпô¤ò %.30hs ¤Çµá¤á¤è¤¦¤È¤·¤Þ¤·¤¿."; +static char *str_BadSqrt = "ÃÍ %g ¤ÎÊ¿Êýº¬¤ò %.30hs ¤Çµá¤á¤è¤¦¤È¤·¤Þ¤·¤¿."; +static char *str_DivideByZero = "0¤Ë¤è¤ë½ü»»¤ò %.30hs ¤Ç¹Ô¤ª¤¦¤È¤·¤Þ¤·¤¿."; +static char *str_XExpr = "X¤Î¼°:"; +static char *str_YExpr = "Y¤Î¼°:"; +static char *str_ExprPopup = "¤³¤ì¤é¤Î¿ô¼°¤Ç¤Ï +,-,*,/,%,^(ÑѾè±é»»»Ò)¤È ?: ¤ò»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹. ¤Þ¤¿,¤¤¤¯¤Ä¤«¤Îɸ½àŪ¤Ê´Ø¿ô¤ò»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹. ´ðËܤȤʤë¹à¤Ï¼Â¿ô¤È x,y ¤Ç¤¹.\nÎã:\n x^3+2.5*x^2+5\n (x-300)*(y-200)/100\n y+sin(100*x)"; + /* effects */ +static char *str_Gap = "´Ö³Ö(G):"; +static char mnemonic_Gap = 'G'; +static char *str_Outlining = "±ï¤É¤êʸ»ú"; +static char *str_Inlining = "¥¤¥ó¥é¥¤¥óʸ»ú"; +static char *str_Shadowing = "±Æʸ»ú"; +static char *str_ShadowLen = "±Æ¤ÎŤµ:"; +static char *str_LightAngle = "¸÷¤Î³ÑÅÙ:"; +static char *str_OutlineWidth = "±ï¤É¤ê¤ÎÉý:"; + /* histogram */ +static char *str_SumAround = "µöÍÆ¸íº¹:"; +static char *str_BarWidth = "¥Ð¡¼¤ÎÉý:"; +static char *str_StemHistPopup = "Éý: %d\n¸Ä¿ô: %d\nºÇÂç¤ÎɴʬΨ: %d%%\n"; +static char *str_StemHistSumPopup = "Éý: %d-%d (%d)\n¸Ä¿ô: %d (%d)\nºÇÂç¤ÎɴʬΨ: %d%%\n"; +static char *str_BlueHistPopup = "°ÌÃÖ: %d\n¸Ä¿ô: %d\n"; +static char *str_BlueHistSumPopup = "°ÌÃÖ: %d-%d (%d)\n¸Ä¿ô: %d (%d)\n"; +static char *str_BlueMsg = "BlueValues¤ÏÂФǻØÄꤷ¤Þ¤¹. ¤â¤¦°ì¤ÄÁª¤ó¤Ç¤¯¤À¤µ¤¤."; +static char *str_SmallerNumberFirstInBlues = "BlueValueÃͤÎÂФǤϾ®¤µ¤¤ÃͤòÀè¤ËÁª¤Ð¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; + /* contextchain */ +static char *str_ByGlyphs = "¥°¥ê¥Õ¤Ç»ØÄê"; +static char *str_ByClasses = "¥¯¥é¥¹¤Ç»ØÄê"; +static char *str_ByCoverage = "ÈϰϤǻØÄê"; +static char *str_Match = "°ìÃ×"; +static char *str_Backtrack = "¥Ð¥Ã¥¯¥È¥é¥Ã¥¯"; +static char *str_Lookahead = "Á°Êý»²¾È"; +static char *str_RuleCnt = "¥ë¡¼¥ë¤Î¸Ä¿ô:"; +static char *str_CurrentRule = "¸½ºß¤Î¥ë¡¼¥ë:"; +static char *str_SetGlyphsFromSelectionPopup = "¤³¤Î¥°¥ê¥Õ¥ê¥¹¥È¤ò,¥Õ¥©¥ó¥È¥Ó¥å¡¼¤ÇÁªÂò¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë"; +static char *str_SelectFromGlyphsPopup = "¤³¤³¤Ç̿̾¤µ¤ì¤¿Ê¸»ú̾¤ò¥Õ¥©¥ó¥È¥Ó¥å¡¼¤ÎÁªÂòÈϰϤËÀßÄꤹ¤ë"; +static char *str_MatchLen = "°ìÃפ·¤¿Ä¹¤µ:" +static char *str_CurrentPos = "¸½ºß¤Î°ÌÃÖ:" +static char *str_Replacements = "ÃÖ´¹Ê¸»ú" +static char *str_OTCCSubFormat1 = "OpenType¤Îʸ̮°Í¸/ʸ̮Ϣº¿°Í¸¥µ¥Ö¥Æ¡¼¥Ö¥ë¤Ï3¼ïÎà¤Î"; +static char *str_OTCCSubFormat2 = "¥Õ¥©¡¼¥Þ¥Ã¥È¤Î¤¦¤Á¤Î¤É¤ì¤«1¤Ä¤ò¤È¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹."; +static char *str_OTCCSubFormat3 = "ʸ̮¤Ïʸ»úÎó¤Þ¤¿¤ÏÆÃÄê¤Î¥°¥ê¥Õ,¥°¥ê¥Õ¥¯¥é¥¹¤«¤é¤Ê¤ë"; +static char *str_OTCCSubFormat4 = "ʸ»úÎó,¤Þ¤¿¤ÏÈϰϥơ¼¥Ö¥ë¤ò¼¨¤¹Ê¸»úÎó¤È¤·¤Æ»ØÄꤹ¤ë"; +static char *str_OTCCSubFormat5 = "¤³¤È¤¬¤Ç¤­¤Þ¤¹, FontForge¤Ï¥Õ¥©¡¼¥Þ¥Ã¥È1¤È3¤ÎÊÔ½¸¤Î¤ß¤ò"; +static char *str_OTCCSubFormat6 = "¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹. ¥Õ¥©¡¼¥Þ¥Ã¥È1¤Ç¤Ï,¥°¥ê¥Õ̾¤Îʸ»úÎó¤ò"; +static char *str_OTCCSubFormat7 = "»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó. ¥Õ¥©¡¼¥Þ¥Ã¥È3¤Ç¤Ï,³ÆÍ×ÁǤ¬"; +static char *str_OTCCSubFormat8 = "¤¤¤¯¤Ä¤«¤Î¥°¥ê¥Õ̾¤ò´Þ¤à¤³¤È¤Î¤Ç¤­¤ëʸ»úÎó¤ò»ØÄꤷ¤Ê¤±¤ì¤Ð"; +static char *str_OTCCSubFormat9 = "¤Ê¤ê¤Þ¤»¤ó.Ï¢º¿·¿¥µ¥Ö¥Æ¡¼¥Ö¥ë¤Ç¤Ï¥Ð¥Ã¥¯¥È¥é¥Ã¥¯¤ÈÁ°Êý"; +static char *str_OTCCSubFormat10= "»²¾È¤ò»ØÄꤹ¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹."; +static char *str_BadCoverage = "Èϰϥơ¼¥Ö¥ë¤¬ÉÔÀµ¤Ç¤¹"; +static char *str_BadCoverageLong = "Èϰϥơ¼¥Ö¥ë¤ÏºÇÄã1¸Ä¤Î¥°¥ê¥Õ̾¤ò´Þ¤ß,¥°¥ê¥Õ̾¤ÏÀµ¤·¤¤PostScript̾¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char *str_BadGlyphList = "°ìÃ×¥°¥ê¥Õ¥ê¥¹¥È¤¬ÉÔÀµ¤Ç¤¹"; +static char *str_BadMatchGlyphLong = "¥°¥ê¥Õ¥ê¥¹¥È¤ÏºÇÄã1¸Ä¤Î¥°¥ê¥Õ̾¤ò´Þ¤ß,¥°¥ê¥Õ̾¤ÏÀµ¤·¤¤PostScript̾¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó"; +static char *str_BadBackGlyphList = "¥Ð¥Ã¥¯¥È¥é¥Ã¥¯¥°¥ê¥Õ¥ê¥¹¥È¤¬ÉÔÀµ¤Ç¤¹"; +static char *str_BadForeGlyphList = "Á°Êý»²¾È¥°¥ê¥Õ¥ê¥¹¥È¤¬ÉÔÀµ¤Ç¤¹"; +static char *str_BadGlyphNameListLong = "¥°¥ê¥Õ̾¤ÏPostScript̾¤È¤·¤ÆÀµ¤·¤¤É¬Íפ¬¤¢¤ê¤Þ¤¹"; +static char *str_BadSeqLookup = "¥·¡¼¥±¥ó¥¹/¥ë¥Ã¥¯¥¢¥Ã¥×¥ê¥¹¥È¤¬ÉÔÀµ¤Ç¤¹" +static char *str_MissingSeqLookup = "¥·¡¼¥±¥ó¥¹/¥ë¥Ã¥¯¥¢¥Ã¥×¥ê¥¹¥È¤Ë¤ÏºÇÄã1¸Ä¤Î¹àÌܤ¬É¬ÍפǤ¹"; +static char *str_MissingRules = "¥ë¡¼¥ë¤¬¤¢¤ê¤Þ¤»¤ó"; +static char *str_MustBeRule = "ºÇÄã1¸Ä¤Îʸ̮¥ë¡¼¥ë¤¬É¬ÍפǤ¹"; +static char *str_MissingMatch = "ºÇÄã1¸Ä¤Î°ìÃ×Èϰϥơ¼¥Ö¥ë¤¬É¬ÍפǤ¹"; +static char *str_MatchCntWrong = "Á°Êýʸ̮Ϣº¿ÃÖ´¹¤Ç¤Ï,°ìÃפ¹¤ë¥Æ¡¼¥Ö¥ë¤¬¤Á¤ç¤¦¤É1¸Ä¤À¤±Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"; +static char *str_ReplacementMismatch = "Á°Êýʸ̮Ϣº¿ÃÖ´¹¤Ç¤Ï,°ìÃפ·¤¿Èϰϥơ¼¥Ö¥ëÆâ¤Ë¸ºß¤¹¤ë¥°¥ê¥Õ̾¤È¤Á¤ç¤¦¤ÉƱ¤¸¸Ä¿ô¤ÎÃÖ´¹Ê¸»ú¤¬Â¸ºß¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹"; +static char *str_RplMismatch = "ÃÖ´¹Ê¸»ú¤¬°ìÃפ·¤Þ¤»¤ó"; +static char *str_Sequence = "¥·¡¼¥±¥ó¥¹ÈÖ¹æ:"; +static char *str_Classes = "¥¯¥é¥¹"; +static char *str_SeqLookup = "¥·¡¼¥±¥ó¥¹/ɽ°ú¤­"; +static char *str_SeqLookList= "¥·¡¼¥±¥ó¥¹°ÌÃÖ¤ÎÀ°Îó¥ê¥¹¥È¤Èɽ°ú¤­¥¿¥°"; +static char *str_AGlyphList = "¥°¥ê¥Õ¤Î¥ê¥¹¥È:"; +static char *str_GlyphLists = "¥°¥ê¥Õ¥ê¥¹¥È¤Î¥ê¥¹¥È:"; +static char *str_ACoverageTable = "Èϰϥơ¼¥Ö¥ë:"; +static char *str_CoverageList = "Èϰϥơ¼¥Ö¥ë¤Î¥ê¥¹¥È:" +static char *str_ClassListOfListsOfGlyphNames = "¥¯¥é¥¹ (¥°¥ê¥Õ̾¤Î¥ê¥¹¥È¤Î¥ê¥¹¥È)"; +static char *str_ListOfClassNumbers = "¥¯¥é¥¹¥á¥ó¥Ð¡¼¤Î¥ê¥¹¥È"; +static char *str_ListOfListsOfClassNumbers = "¥¯¥é¥¹¥á¥ó¥Ð¡¼¤Î¥ê¥¹¥È¤Î¥ê¥¹¥È"; +static char *str_BadClassLong = "¥¯¥é¥¹¤ÏºÇÄã1¸Ä¤Î¥°¥ê¥Õ̾¤ò´Þ¤ó¤Ç¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤º,¥°¥ê¥Õ̾¤ÏÀµ¤·¤¤PostScript̾¤Ç¤¢¤ê,¤É¤Î¥°¥ê¥Õ¤â¾¤Î¥¯¥é¥¹¤Ë¸½¤ì¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó"; +static char *str_BadClassName = "¤³¤³¤Ë¤Ï¾¤Î¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤ëʸ»ú¤¬½Ð¸½¤·¤Æ¤Ï¤¤¤±¤Ê¤¤¤Î¤Ç¤¹¤¬, %.30s ¤¬¤¢¤ê¤Þ¤¹"; +static char *str_MatchClass = "°ìÃ×¥¯¥é¥¹"; +static char *str_BacktrackClass = "»î¹Ô¥¯¥é¥¹"; +static char *str_LookaheadClass = "Á°Êý¥¯¥é¥¹"; +static char *str_EndOfText = "{¥Æ¥­¥¹¥È¤Î½ª¤ê}"; +static char *str_EverythingElse = "{¤½¤Î¾Á´¤Æ}"; +static char *str_DeletedGlyph = "{ºï½ü¤µ¤ì¤¿¥°¥ê¥Õ}"; +static char *str_EndOfLine = "{¹ÔËö}"; +static char *str_SameAsMatchClasses = "°ìÃ×¥¯¥é¥¹¤ÈƱ¤¸"; +static char str_MissingClassMember = "¥¯¥é¥¹¥á¥ó¥Ð¡¼ \"%.20hs\" ¤Ï¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ï¸ºß¤·¤Þ¤»¤ó.\n¤³¤ì¤Ç¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char str_NoGlyphNamed = "¤³¤Î¥Õ¥©¥ó¥È¤Ë¤Ï \"%.20hs\" ¤È¤¤¤¦¥°¥ê¥Õ¤Ï¤¢¤ê¤Þ¤»¤ó.\n¤³¤ì¤Ç¤è¤í¤·¤¤¤Ç¤¹¤«?"; +static char *str_BadClassNumber = "°ìÃ×¥¯¥é¥¹Èֹ椬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹"; +static char *str_BadBackClassNumber = "¥Ð¥Ã¥¯¥È¥é¥Ã¥¯¥¯¥é¥¹Èֹ椬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹"; +static char *str_BadLookClassNumber = "Á°Êý»²¾È¥¯¥é¥¹Èֹ椬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹"; +static char *str_InvalidCharInClassNumber = "¥¯¥é¥¹ÈÖ¹æ¤Î¥ê¥¹¥È¤Ï¿ô»ú¤È¥¹¥Ú¡¼¥¹¤Î¾¤Îʸ»ú¤ò´Þ¤à¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó"; +static char *str_ClassNumberOutOfRange = "¤³¤Î¥¯¥é¥¹¥»¥Ã¥È¤Ë¤Ï %d ¸Ä¤Î¥¯¥é¥¹¤·¤«Â¸ºß¤·¤Þ¤»¤ó¤¬, %d ÈÖÌܤΥ¯¥é¥¹¤ò»È¤ª¤¦¤È¤·¤Æ¤¤¤Þ¤¹"; +static char *str_NoMatchClassNumber = "¥ê¥¹¥È¤Ëµó¤²¤é¤ì¤¿°ìÃפ¹¤ë¥¯¥é¥¹Èֹ椬¤¢¤ê¤Þ¤»¤ó. ºÇÄã1¸Ä¤ÏɬÍפǤ¹"; + /* Mac enc */ +/* Windows languages have locales attached, mac languages don't. Hence we use different strings for them */ +static char str_MacEnglish = "±Ñ¸ì"; +static char str_MacFrench = "¥Õ¥é¥ó¥¹¸ì"; +static char str_MacGerman = "¥É¥¤¥Ä¸ì"; +static char str_MacItalian = "¥¤¥¿¥ê¥¢¸ì"; +static char str_MacDutch = "¥ª¥é¥ó¥À¸ì"; +static char str_MacSwedish = "¥¹¥¦¥§¡¼¥Ç¥ó¸ì"; +static char str_MacSpanish = "¥¹¥Ú¥¤¥ó¸ì"; +static char str_MacDanish = "¥Ç¥ó¥Þ¡¼¥¯¸ì"; +static char str_MacPortuguese = "¥Ý¥ë¥È¥¬¥ë¸ì"; +static char str_MacNorwegian = "¥Î¥ë¥¦¥§¡¼¸ì"; +static char str_MacHebrew = "¥Ø¥Ö¥é¥¤¸ì"; +static char str_MacJapanese = "ÆüËܸì"; +static char str_MacArabic = "¥¢¥é¥Ó¥¢¸ì"; +static char str_MacFinnish = "¥Õ¥£¥ó¥é¥ó¥É¸ì"; +static char str_MacGreek = "¥®¥ê¥·¥ã¸ì"; +static char str_MacIcelandic = "¥¢¥¤¥¹¥é¥ó¥É¸ì"; +static char str_MacMaltese = "¥Þ¥ë¥¿¸ì"; +static char str_MacTurkish = "¥È¥ë¥³¸ì"; +static char str_MacCroatian = "¥¯¥í¥¢¥Á¥¢¸ì"; +static char str_MacTraditionalChinese = "ÈËÂλúÃæ¹ñ¸ì"; +static char str_MacUrdu = "¥¦¥ë¥É¥¥¡¼¸ì"; +static char str_MacHindi = "¥Ò¥ó¥Ç¥£¡¼¸ì"; +static char str_MacThai = "¥¿¥¤¸ì"; +static char str_MacKorean = "´Ú¹ñ¸ì"; +static char str_MacLithuanian = "¥ê¥È¥¢¥Ë¥¢¸ì"; +static char str_MacPolish = "¥Ý¡¼¥é¥ó¥É¸ì"; +static char str_MacHungarian = "¥Ï¥ó¥¬¥ê¡¼¸ì"; +static char str_MacEstonian = "¥¨¥¹¥È¥Ë¥¢¸ì"; +static char str_MacLatvian = "¥é¥È¥Ó¥¢¸ì"; +static char str_MacSami = "¥µ¡¼¥ß¸ì(¥é¥Ã¥×¸ì)"; +static char str_MacFaroese = "¥Õ¥§¥í¡¼¸ì"; +static char str_MacFarsi = "¥Ú¥ë¥·¥ã¸ì"; +static char str_MacRussian = "¥í¥·¥¢¸ì"; +static char str_MacSimplifiedChinese = "´ÊÂλúÃæ¹ñ¸ì"; +static char str_MacFlemish = "¥Õ¥é¥Þ¥ó¸ì"; +static char str_MacIrish = "¥¢¥¤¥ë¥é¥ó¥É¡¦¥²¡¼¥ë¸ì"; +static char str_MacAlbanian = "¥¢¥ë¥Ð¥Ë¥¢¸ì"; +static char str_MacRomanian = "¥ë¡¼¥Þ¥Ë¥¢¸ì"; +static char str_MacCzech = "¥Á¥§¥³¸ì"; +static char str_MacSlovak = "¥¹¥í¥Ð¥­¥¢¸ì"; +static char str_MacSlovenian = "¥¹¥í¥Ù¥Ë¥¢¸ì"; +static char str_MacYiddish = "¥¤¥Ç¥£¥Ã¥·¥å¸ì"; +static char str_MacSerbian = "¥»¥ë¥Ó¥¢¸ì"; +static char str_MacMacedonian = "¥Þ¥±¥É¥Ë¥¢¸ì"; +static char str_MacBulgarian = "¥Ö¥ë¥¬¥ê¥¢¸ì"; +static char str_MacUkrainian = "¥¦¥¯¥é¥¤¥Ê¸ì"; +static char str_MacByelorussian = "¥Ù¥é¥ë¡¼¥·¸ì"; +static char str_MacUzbek = "¥¦¥º¥Ù¥¯¸ì"; +static char str_MacKazakh = "¥«¥¶¥Õ¸ì"; +static char str_MacAxerbaijaniC = "¥¢¥¼¥ë¥Ð¥¤¥¸¥ã¥ó¸ì(¥­¥ê¥ëʸ»ú)"; +static char str_MacAxerbaijaniA = "¥¢¥¼¥ë¥Ð¥¤¥¸¥ã¥ó¸ì(¥¢¥é¥Ó¥¢Ê¸»ú)"; +static char str_MacArmenian = "¥¢¥ë¥á¥Ë¥¢¸ì"; +static char str_MacGeorgian = "¥°¥ë¥¸¥¢¸ì"; +static char str_MacMoldavian = "¥â¥ë¥É¥Ð¸ì"; +static char str_MacKirghiz = "¥­¥ë¥®¥¹¸ì"; +static char str_MacTajiki = "¥¿¥¸¥¯¸ì"; +static char str_MacTurkmen = "¥È¥ë¥¯¥á¥ó¸ì"; +static char str_MacMongolianM = "¥â¥ó¥´¥ë¸ì(¥â¥ó¥´¥ëʸ»ú)"; +static char str_MacMongolianC = "¥â¥ó¥´¥ë¸ì(¥­¥ê¥ëʸ»ú)"; +static char str_MacPashto = "¥Ñ¥·¥å¥È¡¼¸ì"; +static char str_MacKurdish = "¥¯¥ë¥É¸ì"; +static char str_MacKashmiri = "¥«¥·¥ß¡¼¥ë¸ì"; +static char str_MacSindhi = "¥·¥ó¥É¸ì"; +static char str_MacTibetan = "¥Á¥Ù¥Ã¥È¸ì"; +static char str_MacNepali = "¥Í¥Ñ¡¼¥ë¸ì"; +static char str_MacSanskrit = "¥µ¥ó¥¹¥¯¥ê¥Ã¥È"; +static char str_MacMarathi = "¥Þ¥é¡¼¥Æ¥£¡¼¸ì"; +static char str_MacBengali = "¥Ù¥ó¥¬¥ë¸ì"; +static char str_MacAssamese = "¥¢¥Ã¥µ¥à¸ì"; +static char str_MacGujarati = "¥°¥¸¥ã¥é¡¼¥Æ¥£¸ì"; +static char str_MacPunjabi = "¥Ñ¥ó¥¸¥ã¡¼¥Ö¸ì"; +static char str_MacOriya = "¥ª¥ê¥ä¸ì"; +static char str_MacMalayalam = "¥Þ¥é¥ä¥é¥à¸ì"; +static char str_MacKannada = "¥«¥ó¥Ê¥À¸ì"; +static char str_MacTamil = "¥¿¥ß¥ë¸ì"; +static char str_MacTelugu = "¥Æ¥ë¥°¸ì"; +static char str_MacSinhalese = "¥·¥ó¥Ï¥é¸ì"; +static char str_MacBurmese = "¥Ó¥ë¥Þ¸ì"; +static char str_MacKhmer = "¥¯¥á¡¼¥ë¸ì"; +static char str_MacLao = "¥é¥ª¸ì"; +static char str_MacVietnamese = "¥Ù¥È¥Ê¥à¸ì"; +static char str_MacIndonesian = "¥¤¥ó¥É¥Í¥·¥¢¸ì"; +static char str_MacTagalog = "¥¿¥¬¥í¥°¸ì"; +static char str_MacMalayR = "¥Þ¥ì¡¼¸ì(¥í¡¼¥Þ»ú)"; +static char str_MacMalayA = "¥Þ¥ì¡¼¸ì(¥¢¥é¥Ó¥¢Ê¸»ú)"; +static char str_MacAmharic = "¥¢¥à¥Ï¥é¸ì"; +static char str_MacTigrinya = "¥Æ¥£¥°¥ê¥Ë¥¢¸ì"; +static char str_MacGalla = "¥¬¥é¸ì/¥ª¥í¥â¸ì"; +static char str_MacSomali = "¥½¥Þ¥ê¸ì"; +static char str_MacSwahili = "¥¹¥ï¥Ò¥ê¸ì"; +static char str_MacKinyarwanda = "¥­¥ó¥ä¥ë¥ï¥ó¥À¸ì/¥ë¥ï¥ó¥À¸ì"; +static char str_MacRundi = "¥ë¥ó¥¸¸ì"; +static char str_MacNyanja = "¥Ë¥ã¥ó¥¸¥ã¸ì/¥Á¥§¥ï¸ì"; +static char str_MacMalagasy = "¥Þ¥é¥¬¥·¸ì"; +static char str_MacEsperanto = "¥¨¥¹¥Ú¥é¥ó¥È"; +static char str_MacWelsh = "¥¦¥§¡¼¥ë¥º¸ì"; +static char str_MacBasque = "¥Ð¥¹¥¯¸ì"; +static char str_MacCatalan = "¥«¥¿¥ë¡¼¥Ë¥ã¸ì"; +static char str_MacLatinLang = "¥é¥Æ¥ó¸ì"; +static char str_MacQuechua = "¥±¥Á¥å¥¢¸ì"; +static char str_MacGuarani = "¥°¥¢¥é¥Ë¸ì"; +static char str_MacAymara = "¥¢¥¤¥Þ¥é¸ì"; +static char str_MacTatar = "¥¿¥¿¡¼¥ë¸ì"; +static char str_MacUighur = "¥¦¥¤¥°¥ë¸ì"; +static char str_MacDzongkha = "¥¾¥ó¥«¸ì"; +static char str_MacJavanese = "¥¸¥ã¥ï¸ì(¥í¡¼¥Þ»ú)"; +static char str_MacSundanese = "¥¹¥ó¥À¸ì(¥í¡¼¥Þ»ú)"; +static char str_MacGalician = "¥¬¥ê¥·¥¢¸ì"; +static char str_MacAfrikaans = "¥¢¥Õ¥ê¥«¡¼¥ó¥¹¸ì"; +static char str_MacBreton = "¥Ö¥ë¥È¥ó¸ì"; +static char str_MacInuktitut = "¥¤¥Ì¥¤¥Ã¥È¸ì"; +static char str_MacScottish = "¥¹¥³¥Ã¥È¥é¥ó¥É¡¦¥²¡¼¥ë¸ì"; +static char str_MacManx = "¥Þ¥óÅ祲¡¼¥ë¸ì"; +static char str_MacIrishDot = "¥¢¥¤¥ë¥é¥ó¥É¡¦¥²¡¼¥ë¸ì(ÅÀ¤Ä¤­)"; +static char str_MacTongan = "¥È¥ó¥¬(Tongan)¸ì"; +static char str_MacGreekPolytonic = "¥®¥ê¥·¥ã¸ì(¸Åŵ)"; +static char str_MacGreenlandic = "¥°¥ê¡¼¥ó¥é¥ó¥É¸ì"; +static char str_MacAzebaijani = "¥¢¥¼¥ë¥Ð¥¤¥¸¥ã¥ó¸ì(¥í¡¼¥Þ»ú)"; + /* End of mac language list */ +static char *str_LanguageC = "¸À¸ì(L):"; +static char mnemonic_LanguageC = 'L'; +static char *str_BadLanguage = "¸À¸ì̾¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó"; +static char *str_SettingId = "ÀßÄêID:"; +static char *str_MutuallyExclusive = "Áê¸ß¤ËÇÓ¾Ū"; +static char *str_Enabled = "Í­¸ú(E)"; +static char mnemonic_Enabled = 'E'; +static char *str_ThisSettingIsAlreadyUsed = "¤³¤ÎÀßÄê¤Ï´û¤Ë»È¤ï¤ì¤Æ¤¤¤Þ¤¹"; + /* apple statemachine */ +static char *str_FeatureSetting = "µ¡Ç½, ÀßÄê:"; +static char *str_StartOfInput = "{ÆþÎϤÎÀèƬ}"; +static char *str_StartOfLine = "{¹Ô¤ÎÀèƬ}"; +static char *str_EditStateTransition = "¾õÂÖÁ«°Ü¤òÊÔ½¸"; +static char *str_AdvanceToNextGlyph = "¼¡¤Î¥°¥ê¥Õ¤Ø¿Ê¤à"; +static char *str_MarkCurrentGlyph = "¸½ºß¤Î¥°¥ê¥Õ¤Ë°õ¤ò¤Ä¤±¤ë"; +static char *str_MarkCurrentGlyphAsFirst = "¸½¥°¥ê¥Õ¤ò¡ÖºÇ½é¡×¤Ë°õ¤Å¤±"; +static char *str_MarkCurrentGlyphAsLast = "¸½¥°¥ê¥Õ¤ò¡ÖºÇ¸å¡×¤Ë°õ¤Å¤±"; +static char *str_CurrentGlyphIsKashida = "¸½¥°¥ê¥Õ¤ò¥«¥·¥À(»ú²è±äĹ)¤ËÀßÄê"; +static char *str_MarkedGlyphIsKashida = "°õ¤Î¤Ä¤¤¤¿¥°¥ê¥Õ¤ò¥«¥·¥À¤ËÀßÄê"; +static char *str_InsertBeforeCurrentGlyph = "¸½¥°¥ê¥Õ¤ÎÁ°¤ËÀßÄê"; +static char *str_InsertBeforeMarkedGlyph = "°õ¤ÎÉÕ¤¤¤¿¥°¥ê¥Õ¤ÎÁ°¤ËÁÞÆþ"; +static char *str_NoChange = "Êѹ¹Ìµ¤·"; +static char *str_CurrentInsert = "¸½ºß¤ÎÁÞÆþ°ÌÃÖ:"; +static char *str_MarkInsert = "ÁÞÆþ°ÌÃ֤˰õ¤Å¤±:"; +static char *str_CurrentSubs = "¸½ºß¤ÎÃÖ´¹:"; +static char *str_MarkSubs = "°õ¤òÃÖ´¹:"; +static char *str_NextState = "¼¡¤Î¾õÂÖ:"; +static char *str_TooManyGlyphs = "¥°¥ê¥Õ¤¬Â¿¤¹¤®¤Þ¤¹"; +static char *str_AtMost31Glyphs = "1¸Ä¤ÎÁÞÆþ¥ê¥¹¥È¤Ë¤ÏºÇÂç31ʸ»ú¤Þ¤Ç¤·¤«»ØÄê¤Ç¤­¤Þ¤»¤ó"; +static char *str_BadFeatureSetting = "µ¡Ç½ÀßÄ꤬´Ö°ã¤Ã¤Æ¤¤¤Þ¤¹"; +static char *str_FeatureSettingFor = "µ¡Ç½/ÀßÄê:"; +static char *str_VerticalOnly = "½Ä½ñ¤­ÀìÍÑ"; +static char *str_ConvertFromOpenType = "OpenType¤«¤éÊÑ´¹..."; +static char *str_Convert = "ÊÑ´¹..."; +static char *str_NothingToConvert = "ÊÑ´¹¤¹¤ëʪ¤¬¤¢¤ê¤Þ¤»¤ó"; + /* typographic features dlgs */ +static char *str_NoFeaturesRemoved = "ºï½ü¤µ¤ì¤¿µ¡Ç½¤Ï¤¢¤ê¤Þ¤»¤ó; +static char *str_NoFeaturesCopied = "¥³¥Ô¡¼¤µ¤ì¤¿µ¡Ç½¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char *str_NoFeaturesRetagged = "ºÆ¥¿¥°¤Å¤±¤µ¤ì¤¿µ¡Ç½¤Ï¤¢¤ê¤Þ¤»¤ó"; +static char *str_AnyFlags = "Ǥ°Õ¤Î¥Õ¥é¥°"; +static char *str_TheseFlags = "°Ê²¼¤Î¥Õ¥é¥°¤òÍ­¸ú¤Ë¤¹¤ë"; +static char *str_AnyScript = "Ǥ°Õ¤Î¥¹¥¯¥ê¥×¥È"; +static char *str_BadTag = "¥¿¥°¤¬Àµ¤·¤¯¤¢¤ê¤Þ¤»¤ó"; +static char *str_RetagWith = "¥¿¥°¤Î¤Ä¤±Âؤ¨..."; +static char *str_NoSelectedFont = "¥Õ¥©¥ó¥È¤¬ÁªÂò¤µ¤ì¤Æ¤¤¤Þ¤»¤ó"; + +static int num_buttonsize = 80; +static int num_ScaleFactor = 115; +/* based on nomen-en.c:1.172 */ diff --git a/fontforge/nomen-ru.c b/fontforge/nomen-ru.c new file mode 100644 index 00000000..794b7e5c --- /dev/null +++ b/fontforge/nomen-ru.c @@ -0,0 +1,1925 @@ +#include "nomen.h" + +static enum encoding enc = e_koi8_r; + +static char str_Language[] = "òÕÓÓËÉÊ"; +static char str_OK[] = "OK"; +static unichar_t mnemonic_OK[] = 'O'; +static char str_Cancel[] = "ïÔÍÅÎÁ"; +static unichar_t mnemonic_Cancel[] = 'C'; +static char str_Open[] = "ïÔËÒÙÔØ"; +static unichar_t mnemonic_Open[] = 'O'; +static char str_Save[] = "óÏÈÒÁÎÉÔØ"; +static unichar_t mnemonic_Save[] = 'S'; +static char str_Filter[] = "æÉÌØÔÒ"; +static unichar_t mnemonic_Filter[] = 'F'; +static char str_New[] = "óÏÚÄÁÔØ"; +static unichar_t mnemonic_New[] = 'N'; +static char str_Replace[] = "úÁÍÅÎÉÔØ"; +static char str_Fileexists[] = "æÁÊÌ ÓÕÝÅÓÔ×ÕÅÔ"; +/* "File, %s, exists. Replace it?" */ +static char str_Fileexistspre[] = "æÁÊÌ "; +static char str_Fileexistspost[] = " ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ. úÁÍÅÎÉÔØ ÅÇÏ?"; +static char str_Createdir[] = "óÏÚÄÁÔØ ËÁÔÁÌÏÇ..."; +static char str_Dirname[] = "îÁÚ×ÁÎÉÅ ËÁÔÁÌÏÇÁ?"; +static char str_Couldntcreatedir[] = "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ"; +static char str_SelectAll[] = "÷ÙÂÒÁÔØ ×ÓÅ"; +static char mnemonic_SelectAll = 'A'; +static char *str_None ="îÅÔ"; +static char mnemonic_None = 'N'; +/* Menus ... */ +static char str_File[] = "æÁÊÌ"; +static unichar_t mnemonic_File[] = 'F'; +static char str_Edit[] = "ðÒÁ×ËÁ"; +static unichar_t mnemonic_Edit[] = 'E'; +static char str_Point[] = "ôÏÞËÁ"; +static unichar_t mnemonic_Point[] = 'P'; +static char str_Element[] = "üÌÅÍÅÎÔ"; +static unichar_t mnemonic_Element[] = 'l'; +static char str_Hints[] = "éÎÓÔÒÕËÃÉÉ"; +static unichar_t mnemonic_Hints[] = 'i'; +static char str_View[] = "÷ÉÄ"; +static unichar_t mnemonic_View[] = 'V'; +static char str_Metric[] = "íÅÔÒÉËÉ"; +static unichar_t mnemonic_Metric[] = 'M'; +static char str_Window[] = "ïËÎÏ"; +static unichar_t mnemonic_Window[] = 'W'; +static char str_Help[] = "óÐÒÁ×ËÁ"; +static unichar_t mnemonic_Help[] = 'H'; +static char str_About[] = "ï ÐÒÏÇÒÁÍÍÅ..."; +static unichar_t mnemonic_About[] = 'A'; +static char str_Recent[] = "éÓÔÏÒÉÑ"; +static unichar_t mnemonic_Recent[] = 't'; +static char str_Openoutline[] = "ïÔËÒÙÔØ ËÏÎÔÕÒ"; +static unichar_t mnemonic_Openoutline[] = 'u'; +static char str_Openbitmap[] = "ïÔËÒÙÔØ ÒÁÓÔÒ"; +static unichar_t mnemonic_Openbitmap[] = 'B'; +static char str_Openmetrics[] = "ïÔËÒÙÔØ ÍÅÔÒÉËÉ"; +static unichar_t mnemonic_Openmetrics[] = 'M'; +static char str_Print[] = "ðÅÞÁÔØ..."; +static unichar_t mnemonic_Print[] = 'P'; +static char str_Display[] = "ðÏËÁÚÁÔØ..."; +static unichar_t mnemonic_Display[] = 'D'; +static char str_ExecuteScript[] = "÷ÙÐÏÌÎÉÔØ ÓËÒÉÐÔ..."; +static unichar_t mnemonic_ExecuteScript[] = 'x'; +static char str_Revertfile[] = "÷ÏÓÓÔ. ÆÁÊÌ"; +static unichar_t mnemonic_Revertfile[] = 'R'; +static char str_RevertGlyph[] = "Revert Glyph"; /*new*/ +static unichar_t mnemonic_RevertGlyph[] = 'y'; +static char str_Saveas[] = "óÏÈÒÁÎÉÔØ ËÁË..."; +static unichar_t mnemonic_Saveas[] = 'a'; +static char str_SaveAll[] = "óÏÈÒÁÎÉÔØ ×ÓÅ"; +static unichar_t mnemonic_SaveAll = 'l'; +static char str_Generate[] = "óÏÚÄÁÔØ ÛÒÉÆÔÙ..."; +static unichar_t mnemonic_Generate[] = 'G'; +static char str_GenerateMac[] = "óÏÚÄÁÔØ Mac Family..."; +static unichar_t mnemonic_GenerateMac[] = 'F'; +static char str_Import[] = "éÍÐÏÒÔÉÒÏ×ÁÔØ..."; +static unichar_t mnemonic_Import[] = 'I'; +static char str_Close[] = "úÁËÒÙÔØ"; +static unichar_t mnemonic_Close[] = 'c'; +static char str_Prefs[] = "îÁÓÔÒÏÊËÉ..."; +static unichar_t mnemonic_Prefs[] = 'e'; +static char str_Quit[] = "÷ÙÊÔÉ"; +static unichar_t mnemonic_Quit[] = 'Q'; +static char str_Fit[] = "úÁÐÏÌÎÉÔØ"; +static unichar_t mnemonic_Fit[] = 'F'; +static char str_Zoomin[] = "íÁÓÛÔÁ +"; +static unichar_t mnemonic_Zoomin[] = 'i'; +static char str_Zoomout[] = "íÁÓÛÔÁ -"; +static unichar_t mnemonic_Zoomout[] = 'o'; +static char str_NextChar[] = "óÌÅÄ. ÓÉÍ×ÏÌ"; +static unichar_t mnemonic_NextChar[] = 'N'; +static char str_PrevChar[] = "ðÒÅÄ. ÓÉÍ×ÏÌ"; +static unichar_t mnemonic_PrevChar[] = 'P'; +static char str_NextDefChar[] = "óÌÅÄ. ÏÐÒÅÄÅÌ£ÎÎÙÊ ÓÉÍ×ÏÌ"; +static unichar_t mnemonic_NextDefChar[] = 'D'; +static char str_PrevDefChar[] = "ðÒÅÄ. ÏÐÒÅÄÅÌ£ÎÎÙÊ ÓÉÍ×ÏÌ"; +static unichar_t mnemonic_PrevDefChar[] = 'a'; +static char str_Substitutions = "ðÏÄÓÔÁÎÏ×ËÉ"; +static char mnemonic_Substitutions = 'S'; +static char str_Goto[] = "ðÅÒÅÊÔÉ"; +static unichar_t mnemonic_Goto[] = 'G'; +static char str_Hidepoints[] = "óËÒÙÔØ ÔÏÞËÉ"; +static unichar_t mnemonic_Hidepoints[] = 't'; +static char str_Showpoints[] = "ðÏËÁÚ. ÔÏÞËÉ"; +static unichar_t mnemonic_Showpoints[] = 't'; +static char str_MarkExtrema[] = "ïÔÍÅÔÉÔØ ÜËÓÔÒÍ."; +static unichar_t mnemonic_MarkExtrema[] = 'M'; +static char str_Hiderulers[] = "óËÒÙÔØ ÐÒÏËÒÕÔËÕ"; +static unichar_t mnemonic_Hiderulers[] = 'R'; +static char str_Showrulers[] = "ðÏËÁÚ. ÐÒÏËÒÕÔËÕ"; +static unichar_t mnemonic_Showrulers[] = 'R'; +static char *str_ShowHMetrics="ðÏËÁÚ. çÏÒ.ÍÅÔÒÉËÉ..."; +static char mnemonic_ShowHMetrics = 'H'; +static char *str_ShowVMetrics="ðÏËÁÚ. ÷ÅÒÔ.ÍÅÔÒÉËÉ..."; +static char mnemonic_ShowVMetrics = 'V'; +static char *str_EncodedView="÷ÉÄ ËÏÄÉÒÏ×ËÉ"; +static char mnemonic_EncodedView = 'E'; +static char *str_CompactedView="óÖÁÔÙÊ ×ÉÄ"; +static char mnemonic_CompactedView = 'C'; +static char *str_Combinations="ëÏÍÂÉÎÁÃÉÉ"; +static char mnemonic_Combinations = 'b'; +static char *str_KernPairs="ëÅÒÎ. ÐÁÒÙ"; +static char mnemonic_KernPairs = 'K'; +static char *str_Ligatures="ìÉÇÁÔÕÒÙ"; +static char mnemonic_Ligatures = 'L'; +static char *str_AnchoredPairs="óÃÅÐÌÅÎÎÙÅ ÐÁÒÙ"; +static char mnemonic_AnchoredPairs = 'A'; +static char *str_FindInFontView="îÁÊÔÉ × ÏËÎÅ ÛÒÉÆÔÁ"; +static char mnemonic_FindInFontView = 'V'; +static char str_Fill[] = "úÁÌÉÔØ"; +static unichar_t mnemonic_Fill[] = 'l'; +static char str_Select[] = "÷ÙÄÅÌÉÔØ"; +static unichar_t mnemonic_Select[] = 'S'; +static char str_DeselectAll[] = "õÂÒÁÔØ ×ÙÄÅÌÅÎÉÅ"; +static unichar_t mnemonic_DeselectAll[] = 'D'; +static char str_FirstPoint[] = "ðÅÒ×ÁÑ ÔÏÞËÁ"; +static unichar_t mnemonic_FirstPoint[] = 'F'; +static char str_Nextpoint[] = "óÌÅÄ. ÔÏÞËÁ"; +static unichar_t mnemonic_Nextpoint[] = 'N'; +static char str_Prevpoint[] = "ðÒÅÄ. ÔÏÞËÁ"; +static unichar_t mnemonic_Prevpoint[] = 'P'; +static char str_NextControlPoint[] = "óÌÅÄ. ÕÐÒ. ÔÏÞËÁ"; +static unichar_t mnemonic_NextControlPoint[] = 'r'; +static char str_PrevControlPoint[] = "ðÒÅÄ. ÕÐÒ. ÔÏÞËÁ"; +static unichar_t mnemonic_NextControlPoint[] = 'r'; +static char str_SelectWidth[] = "ûÉÒÉÎÁ"; +static unichar_t mnemonic_SelectWidth[] = 'W'; +static char str_SelectVWidth[] = "÷.ÛÉÒÉÎÁ"; +static unichar_t mnemonic_SelectVWidth[] = 'V'; +static char str_DeselectWidth[] = "óÎÑÔØ ×ÙÄÅÌÅÎÉÅ ÛÉÒÉÎÙ"; +static unichar_t mnemonic_DeselectWidth[] = 'W'; +static char str_DeselectVWidth[] = "Deselect VWidth"; +static unichar_t mnemonic_DeselectVWidth[] = 'V'; +static char str_Undo[] = "ïÔËÁÔ"; +static unichar_t mnemonic_Undo[] = 'U'; +static char str_Redo[] = "÷ÏÚ×ÒÁÔ"; +static unichar_t mnemonic_Redo[] = 'R'; +static char str_Cut[] = "÷ÙÒÅÚÁÔØ"; +static unichar_t mnemonic_Cut[] = 't'; +static char str_Copy[] = "óËÏÐÉÒÏ×ÁÔØ"; +static unichar_t mnemonic_Copy[] = 'C'; +static char str_Copywidth[] = "óËÏÐÉÒ. ÛÉÒÉÎÕ"; +static unichar_t mnemonic_Copywidth[] = 'W'; +static char str_CopyVWidth[] = "óËÏÐÉÒ. ÷.ÛÉÒÉÎÕ"; +static unichar_t mnemonic_CopyVWidth[] = 'V'; +static char str_CopyLBearing[] = "óËÏÐÉÒ. ÌÅ×.ÇÒÁÎÉÃÕ"; +static unichar_t mnemonic_CopyLBearing[] = 'p'; +static char str_CopyRBearing[] = "óËÏÐÉÒ. ÐÒÁ×.ÇÒÁÎÉÃÕ"; +static unichar_t mnemonic_CopyRBearing[] = 'g'; +static char str_Copyref[] = "óËÏÐÉÒ. ÓÓÙÌËÕ"; +static unichar_t mnemonic_Copyref[] = 'o'; +static char str_Paste[] = "÷ÓÔÁ×ÉÔØ"; +static unichar_t mnemonic_Paste[] = 'P'; +static char str_Clear[] = "ïÞÉÓÔÉÔØ"; +static unichar_t mnemonic_Clear[] = 'l'; +static char str_ClearBackground[] = "ïÞÉÓÔÉÔØ ÆÏÎ"; +static unichar_t mnemonic_ClearBackground[] = 'B'; +static char str_CopyFgToBg[] = "óËÏÐÉÒÏ×ÁÔØ ÐÅÒ.ÐÌÁÎ × ÆÏÎ"; +static unichar_t mnemonic_CopyFgToBg[] = 'F'; +static char str_Merge[] = "ïÂßÅÄÉÎÉÔØ"; +static unichar_t mnemonic_Merge[] = 'M'; +static char str_Elide = "Elide"; +static char str_Join[] = "óÏÅÄÉÎÉÔØ"; +static unichar_t mnemonic_Join[] = 'J'; +static char str_Unlinkref[] = "òÁÚÙÍÅÎ. ÓÓÙÌËÕ"; +static unichar_t mnemonic_Unlinkref[] = 'n'; +static char str_SelectColor[] = "÷ÙÂÒÁÔØ Ã×ÅÔ"; +static unichar_t mnemonic_SelectColor[] = 'S'; +static char str_RemoveUndoes[] = "õÄÁÌÉÔØ ÏÔËÁÔÙ"; +static unichar_t mnemonic_RemoveUndoes[] = 'e'; +static char str_Fontinfo[] = "éÎÆÏÒÍ. Ï ÛÒÉÆÔÅ..."; +static unichar_t mnemonic_Fontinfo[] = 'F'; +static char str_Findprobs[] = "îÁÊÔÉ ÐÒÏÂÌÅÍÙ..."; +static unichar_t mnemonic_Findprobs[] = 'o'; +static char str_Getinfo[] = "ó×ÅÄÅÎÉÑ..."; +static unichar_t mnemonic_Getinfo[] = 'I'; +static char str_ShowDependents[] = "ðÏËÁÚÁÔØ ÚÁ×ÉÓÉÍÙÅ..."; +static unichar_t mnemonic_ShowDependents[] = 'h'; +static char str_Bitmapsavail[] = "äÏÓÔÕÐÎÙÅ ÒÁÓÔÒÙ..."; +static unichar_t mnemonic_Bitmapsavail[] = 'A'; +static char str_Regenbitmaps[] = "ðÅÒÅÇÅÎÅÒÉÒ. ÒÁÓÔÒÙ..."; +static unichar_t mnemonic_Regenbitmaps[] = 'B'; +static char str_Autotrace[] = "á×ÔÏÔÒÁÓÓÉÒÏ×ËÁ"; +static unichar_t mnemonic_Autotrace[] = 'r'; +static char str_Transform[] = "ðÒÅÏÂÒÁÚÏ×ÁÔØ..."; +static unichar_t mnemonic_Transform[] = 'T'; +static char str_Stroke[] = "òÁÓÛÉÒÉÔØ ÛÔÒÉÈ..."; +static unichar_t mnemonic_Stroke[] = 'E'; +static char str_TilePath[] = "Tile Path...";/*new*/ +static unichar_t mnemonic_TilePath[] = 'P'; +static char str_Rmoverlap[] = "õÄÁÌÉÔØ ÐÅÒÅÓÅÞÅÎÉÑ"; +static unichar_t mnemonic_Rmoverlap[] = 'v'; +static char str_FindIntersections[] = "îÁÊÔÉ ÐÅÒÅÓÅÞÅÎÉÑ"; +static char str_Simplify[] = "õÐÒÏÓÔÉÔØ"; +static unichar_t mnemonic_Simplify[] = 'S'; +static char str_SimplifyMore[] = "õÐÒÏÓÔÉÔØ ÅÝ£"; +static char str_CleanupChar[] = "ïÞÉÓÔÉÔØ ÓÉÍ×ÏÌÙ"; +static unichar_t mnemonic_CleanupChar[] = 'S'; +static char str_AddExtrema[] = "äÏÂÁ×ÉÔØ ÜËÓÔÒÅÍÕÍÙ"; +static unichar_t mnemonic_AddExtrema[] = 'x'; +static char str_Align[] = "÷ÙÒÏ×ÎÑÔØ"; +static unichar_t mnemonic_Align[] = 'l'; +static char str_AveragePts[] = "óÒÅÄÎÉÅ ÔÏÞËÉ"; +static unichar_t mnemonic_AveragePts[] = 'A'; +static char str_SpacePts[] = "Space Points"; +static unichar_t mnemonic_SpacePts[] = 'S'; +static char str_SpaceRegions[] = "Space Regions..."; +static unichar_t mnemonic_SpaceRegions[] = 'R'; +static char str_MakeParallel[] = "óÄÅÌÁÔØ ÐÁÒÁÌÌÅÌØÎÏÊ..."; +static unichar_t mnemonic_MakeParallel[] = 'P'; +static char str_Round2int[] = "ïËÒÕÇÌÉÔØ"; +static unichar_t mnemonic_Round2int[] = 'd'; +static char str_Buildaccent[] = "óÄÅÌÁÔØ ÁËÃÅÎÔÉÒ. ÓÉÍ×ÏÌ"; +static unichar_t mnemonic_Buildaccent[] = 'u'; +static char str_Buildcomposit[] = "óÏÚÄÁÔØ ÁËÃÅÎÔÉÒ. ÓÉÍ×ÏÌ"; +static unichar_t mnemonic_Buildcomposit[] = 'u'; +static char str_Clockwise[] = "ðÏ ÞÁÓÏ×ÏÊ"; +static unichar_t mnemonic_Clockwise[] = 'o'; +static char str_Cclockwise[] = "ðÒÏÔÉ× ÞÁÓÏ×ÏÊ"; +static unichar_t mnemonic_Cclockwise[] = 'n'; +static char str_Correct[] = "éÓÐÒÁ×ÉÔØ ÎÁÐÒÁ×ÌÅÎÉÅ"; +static unichar_t mnemonic_Correct[] = 'C'; +static char str_Corner[] = "õÇÌÏ×ÁÑ"; +static unichar_t mnemonic_Corner[] = 'o'; +static char str_Curve[] = "ëÒÉ×ÁÑ"; +static unichar_t mnemonic_Curve[] = 'C'; +static char str_Tangent[] = "ëÁÓÁÔÅÌØÎÁÑ"; +static unichar_t mnemonic_Tangent[] = 'T'; +static char str_Autohint[] = "á×ÔÏÉÎÓÔÒÕËÃÉÉ"; +static unichar_t mnemonic_Autohint[] = 'H'; +static char str_FullAutohint[] = "ðÏÌÎÙÅ Á×ÔÏÉÎÓÔÒÕËÃÉÉ"; +static unichar_t mnemonic_FullAutohint[] = 'H'; +static char str_ClearHints[] = "ïÞÉÓÔÉÔØ ÉÎÓÔÒÕËÃÉÉ"; +static unichar_t mnemonic_ClearHints[] = 'C'; +static char str_Clearhstem[] = "ïÞÉÓÔÉÔØ ÇÏÒÉÚ.ÉÎÓÔÒ."; +static unichar_t mnemonic_Clearhstem[] = 'C'; +static char str_Clearvstem[] = "ïÞÉÓÔÉÔØ ×ÅÒÔ.ÉÎÓÔÒ."; +static unichar_t mnemonic_Clearvstem[] = 'V'; +static char str_Cleardstem[] = "ïÞÉÓÔÉÔØ ÄÉÁÇ.ÉÎÓÔÒ."; +static unichar_t mnemonic_Cleardstem[] = 'D'; +static char str_Addhhint[] = "äÏÂÁ×ÉÔØ ÇÏÒÉÚ.ÉÎÓÔÒ."; +static unichar_t mnemonic_Addhhint[] = 'A'; +static char str_Addvhint[] = "äÏÂÁ×ÉÔØ ×ÅÒÔ.ÉÎÓÔÒ."; +static unichar_t mnemonic_Addvhint[] = 's'; +static char str_Adddhint[] = "äÏÂÁ×ÉÔØ ÄÉÁÇ.ÉÎÓÔÒ."; +static unichar_t mnemonic_Adddhint[] = 't'; +static char str_Createhhint[] = "óÏÚÄÁÔØ ÇÏÒÉÚ.ÉÎÓÔÒ. ..."; +static unichar_t mnemonic_Createhhint[] = 'r'; +static char str_Createvhint[] = "óÏÚÄÁÔØ ×ÅÒÔ.ÉÎÓÔÒ. ..."; +static unichar_t mnemonic_Createvhint[] = 'e'; +static char str_Reviewhints[] = "ïÂÚÏÒ ÉÎÓÔÒÕËÃÉÊ..."; +static unichar_t mnemonic_Reviewhints[] = 'R'; +static char str_MinimumDistance[] = "íÉÎ. ÄÉÓÔÁÎÃÉÑ"; +static unichar_t mnemonic_MinimumDistance[] = 'M'; +static char str_ClearAllMD[] = "ïÞÉÓÔÉÔØ ×ÓÅ ÍÉÎ.ÄÉÓÔ."; +static unichar_t mnemonic_ClearAllMD[] = 'C'; +static char str_ClearSelXMD[] = "ïÞÉÓÔÉÔØ ×ÙÄÅÌÅÎÎÙÅ ÍÉÎ.ÄÉÓÔ. ÐÏ X"; +static unichar_t mnemonic_ClearSelXMD[] = 's'; +static char str_ClearSelYMD[] = "ïÞÉÓÔÉÔØ ×ÙÄÅÌÅÎÎÙÅ ÍÉÎ.ÄÉÓÔ. ÐÏ Y"; +static unichar_t mnemonic_ClearSelYMD[] = 'e'; +static char str_ClearWidthMD[] = "ïÞÉÓÔÉÔØ ÍÉÎ.ÄÉÓÔ. ÐÏ ÛÉÒÉÎÅ"; +static unichar_t mnemonic_ClearWidthMD[] = 'W'; +static char str_AddxMD[] = "äÏÂÁ×ÉÔØ ÍÉÎ.ÄÉÓÔ. ÐÏ X"; +static unichar_t mnemonic_AddxMD[] = 'x'; +static char str_AddMD2Width[] = "äÏÂÁ×ÉÔØ ÍÉÎ.ÄÉÓÔ. Ë ÛÉÒÉÎÅ"; +static unichar_t mnemonic_AddxMD[] = 'x'; +static char str_AddyMD[] = "äÏÂÁ×ÉÔØ ÍÉÎ.ÄÉÓÔ. ÐÏ Y"; +static unichar_t mnemonic_AddyMD[] = 'y'; +static char str_RoundX[] = "ïËÒÕÇÌÉÔØ X"; +static unichar_t mnemonic_RoundX[] = 'R'; +static char str_NoRoundX[] = "îÅ ÏËÒÕÇÌÑÔØ X"; +static unichar_t mnemonic_NoRoundX[] = 'N'; +static char str_RoundY[] = "ïËÒÕÇÌÉÔØ Y"; +static unichar_t mnemonic_RoundY[] = 'u'; +static char str_NoRoundY[] = "îÅ ÏËÒÕÇÌÑÔØ Y"; +static unichar_t mnemonic_NoRoundY[] = 'o'; +static char str_Export[] = "üËÓÐÏÒÔ..."; +static unichar_t mnemonic_Export[] = 't'; +static char str_Palettes[] = "ðÁÌÉÔÒÙ"; +static unichar_t mnemonic_Palettes[] = 'P'; +static char str_Tools[] = "éÎÓÔÒÕÍÅÎÔÙ"; +static unichar_t mnemonic_Tools[] = 'T'; +static char str_Layers[] = "óÌÏÉ"; +static unichar_t mnemonic_Layers[] = 'L'; +static char str_DockedPalettes[] = "Docked Palettes"; /*new*/ +static unichar_t mnemonic_DockedPalettes[] = 'D'; +static char str_Shades[] = "ôÅÎÉ"; +static unichar_t mnemonic_Shades[] = 'S'; +static char str_Center[] = "ãÅÎÔÒÉÒ. ÐÏ ÛÉÒÉÎÅ"; +static unichar_t mnemonic_Center[] = 'C'; +static char str_Thirds[] = "ôÒÅÔÉ ÐÏ ÛÉÒÉÎÅ"; +static unichar_t mnemonic_Thirds[] = 'T'; +static char str_Setwidth[] = "õÓÔÁÎÏ×ÉÔØ ÛÉÒÉÎÕ..."; +static unichar_t mnemonic_Setwidth[] = 'W'; +static char str_SetVWidth[] = "Set Vertical Advance..."; +static unichar_t mnemonic_SetVWidth[] = 'V'; +static char str_Setlbearing[] = "õÓÔÁÎÏ×ÉÔØ ÌÅ×.ÇÒÁÎÉÃÕ..."; +static unichar_t mnemonic_Setlbearing[] = 'L'; +static char str_Setrbearing[] = "õÓÔÁÎÏ×ÉÔØ ÐÒÁ×.ÇÒÁÎÉÃÕ..."; +static unichar_t mnemonic_Setrbearing[] = 'R'; +static char str_Removekern[] = "õÄÁÌÉÔØ ÐÁÒÙ ÐÏÄÓÔÒÏÊËÉ ÁÐÒÏÛÁ"; +static unichar_t mnemonic_Removekern[] = 'P'; +static char str_Mergekern[] = "äÏÂÁ×ÉÔØ ÐÁÒÙ ÐÏÄÓÔÒÏÊËÉ ÁÐÒÏÛÁ..."; +static unichar_t mnemonic_Mergekern[] = 'M'; +static char str_24[] = "ëÏÎÔÕÒ 24 ÔÏÞËÉ"; +static unichar_t mnemonic_24[] = '2'; +static char str_36[] = "ëÏÎÔÕÒ 36 ÔÏÞÅË"; +static unichar_t mnemonic_36[] = '3'; +static char str_48[] = "ëÏÎÔÕÒ 48 ÔÏÞÅË"; +static unichar_t mnemonic_48[] = '4'; +static char str_72[] = "ëÏÎÔÕÒ 72 ÔÏÞËÉ"; +static unichar_t mnemonic_72[] = '7'; +static char str_96[] = "ëÏÎÔÕÒ 96 ÔÏÞÅË"; +static unichar_t mnemonic_96[] = '9'; +static char str_Antialias[] = "óÇÌÁÖÉ×ÁÎÉÅ"; +static unichar_t mnemonic_Antialias[] = 'A'; +static char str_FitToEm[] = "úÁÐÏÌÎÉÔØ ÄÏ \"Em\""; +static unichar_t mnemonic_FitToEm[] = 'F'; +static char str_Charinfo[] = "éÎÆÏÒÍ. Ï ÓÉÍ×ÏÌÅ..."; +static unichar_t mnemonic_Charinfo[] = 'I'; +static char str_CharInfoFor[] = "éÎÆÏÒÍ. Ï ÓÉÍ×ÏÌÅ ÄÌÑ %.40hs"; +static char str_DefaultATT = "Default ATT"; /*new*/ +static char str_Mergefonts[] = "ïÂßÅÄÉÎÉÔØ ÛÒÉÆÔÙ..."; +static unichar_t mnemonic_Mergefonts[] = 'M'; +static char str_Interp[] = "éÎÔÅÒÐÏÌÉÒÏ×ÁÔØ ÛÒÉÆÔÙ..."; +static unichar_t mnemonic_Interp[] = 'l'; +static char str_Copyfrom[] = "óËÏÐÉÒÏ×ÁÔØ ÉÚ"; +static unichar_t mnemonic_Copyfrom[] = 'F'; +static char str_Allfonts[] = "÷ÓÅÈ ÛÒÉÆÔÏ×"; +static unichar_t mnemonic_Allfonts[] = 'A'; +static char str_Displayedfont[] = "ïÔÏÂÒÁÖÁÅÍÏÇÏ ÛÒÉÆÔÁ"; +static unichar_t mnemonic_Displayedfont[] = 'D'; +static char str_CharName[] = "îÁÚ×ÁÎÉÅ ÓÉÍ×ÏÌÁ"; +static unichar_t mnemonic_CharName[] = 'N'; +static char str_Autokern[] = "á×ÔÏÐÏÄÓÔÒÏÊËÁ ÁÐÒÏÛÅÊ..."; +static unichar_t mnemonic_Autokern[] = 'K'; +static char str_Autowidth[] = "á×ÔÏÛÉÒÉÎÁ..."; +static unichar_t mnemonic_Autowidth[] = 'A'; +static char str_Removeallkern[] = "õÄÁÌÉÔØ ×ÓÅ ÐÁÒÙ ÐÏÄÓÔÒ. ÁÐÒÏÛÅÊ"; +static unichar_t mnemonic_Removeallkern[] = 'P'; +static char str_Outline[] = "ëÏÎÔÕÒ"; +static char str_OutlineMn[] = "ëÏÎÔÕÒ"; +static unichar_t mnemonic_OutlineMn[] = 'O'; +static char str_Showgrid[] = "ðÏËÁÚÁÔØ ÓÅÔËÕ"; +static unichar_t mnemonic_Showgrid[] = 'G'; +static char str_Hidegrid[] = "óËÒÙÔØ ÓÅÔËÕ"; +static unichar_t mnemonic_Hidegrid[] = 'G'; +static char str_Bigger[] = "Bigger Pixel Size"; +static unichar_t mnemonic_Bigger[] = 'B'; +static char str_Smaller[] = "Smaller Pixel Size"; +static unichar_t mnemonic_Smaller[] = 'S'; +static char str_Fliph[] = "ïÔÒÁÚÉÔØ ÇÏÒÉÚÏÎÔÁÌØÎÏ"; +static unichar_t mnemonic_Fliph[] = 'H'; +static char str_Flipv[] = "ïÔÒÁÚÉÔØ ×ÅÒÔÉËÁÌØÎÏ"; +static unichar_t mnemonic_Flipv[] = 'V'; +static char str_Rotate90cw[] = "ðÏ×ÅÒÎÕÔØ ÎÁ 90° ÐÏ ÞÁÓ."; +static unichar_t mnemonic_Rotate90cw[] = 'R'; +static char str_Rotate90ccw[] = "ðÏ×ÅÒÎÕÔØ ÎÁ 90° ÐÒÏÔÉ× ÞÁÓ."; +static unichar_t mnemonic_Rotate90ccw[] = '9'; +static char str_Rotate180[] = "ðÏ×ÅÒÎÕÔØ ÎÁ 180°"; +static unichar_t mnemonic_Rotate180[] = '1'; +static char str_Skew[] = "îÁËÌÏÎÉÔØ..."; +static unichar_t mnemonic_Skew[] = 'S'; +static char str_MakeFirst = "óÄÅÌÁÔØ ÐÅÒ×ÏÊ"; +static char mnemonic_MakeFirst = 'k'; +static char str_AddAnchor = "äÏÂÁ×ÉÔØ ÑËÏÒØ"; +static char mnemonic_AddAnchor = 'A'; +static char *str_CID = "CID"; +static char mnemonic_CID = 'C'; +static char *str_Convert2CID = "ðÒÅÏÂÒÁÚÏ×ÁÔØ × CID"; +static char mnemonic_Convert2CID = 'C'; +static char *str_ConvertByCMap = "Convert By CMap"; /*new*/ +static char mnemonic_ConvertByCMap = 'M'; +static char *str_Flatten = "Flatten"; +static char mnemonic_Flatten = 'F'; +static char *str_FlattenByCMap = "FlattenByCMap"; /*new*/ +static char mnemonic_FlattenByCMap = 'a'; +static char *str_InsertFont = "÷ÓÔÁ×ÉÔØ ÛÒÉÆÔ..."; +static char mnemonic_InsertFont = 'o'; +static char *str_InsertBlank = "÷ÓÔÁ×ÉÔØ ÐÕÓÔÏÊ"; +static char mnemonic_InsertBlank = 'B'; +static char *str_RemoveFont = "õÄÁÌÉÔØ ÛÒÉÆÔ"; +static char mnemonic_RemoveFont = 'R'; +static char *str_CIDFontInfo = "éÎÆÏÒÍ. Ï ÛÒÉÆÔÅ CID..."; +static char mnemonic_CIDFontInfo = 'I'; + + /* Font Info dlg */ +static char str_Custom[] = "äÒÕÇÁÑ"; +static char str_Compacted[] = "óÖÁÔÙÊ"; +static char str_Isolatin1[] = "ISO 8859-1 (Latin1)"; +static char str_Isolatin0[] = "ISO 8859-15 (Latin0)"; +static char str_Isolatin2[] = "ISO 8859-2 (Latin2)"; +static char str_Isolatin3[] = "ISO 8859-3 (Latin3)"; +static char str_Isolatin4[] = "ISO 8859-4 (Latin4)"; +static char str_Isolatin5[] = "ISO 8859-9 (Latin5)"; +static char str_Isolatin6[] = "ISO 8859-10 (Latin6)"; +static char str_Isolatin7[] = "ISO 8859-13 (Latin7)"; +static char str_Isolatin8[] = "ISO 8859-14 (Latin8)"; +static char str_Isocyrillic[] = "ISO 8859-5 (ëÉÒÉÌÌÉÃÁ)"; +static char str_Koi8cyrillic[] = "KOI8-R (ëÉÒÉÌÌÉÃÁ)"; +static char str_Isoarabic[] = "ISO 8859-6 (áÒÁÂÓËÉÊ)"; +static char str_Isogreek[] = "ISO 8859-7 (çÒÅÞÅÓËÉÊ)"; +static char str_Isohebrew[] = "ISO 8859-8 (é×ÒÉÔ)"; +static char str_Isothai[] = "ISO 8859-11 (ôÁÊÓËÉÊ)"; +static char str_MacLatin[] = "Macintosh Latin"; +static char str_Win[] = "Windows Latin (\042ANSI\042)"; +static char str_Adobestd[] = "Adobe Standard"; +static char str_Symbol[] = "Symbol"; +static unichar_t str_Texbase[] = { 0x3a4, 0x3b5, 0x3a7, ' Base (8r)', '\0' }; +static char str_Unicode[] = "ISO 10646-1 (Unicode, BMP)"; +static char str_Unicode4[] = "ISO 10646-1 (Unicode, Full)"; +static char str_UnicodePlanes[] = "ISO 10646-? (by plane) ..."; +static char str_Jis208[] = "JIS 208 (Kanji)"; +static char str_Jis212[] = "JIS 212 (Kanji)"; +static char str_SJIS[] = "SJIS (Kanji)"; +static char str_Korean[] = "KSC 5601-1987 (ëÏÒÅÊÓËÉÊ)"; +static char str_KoreanJohab[] = "Johab (ëÏÒÅÊÓËÉÊ)"; +static char str_KoreanWansung[] = "Wansung (ëÏÒÅÊÓËÉÊ)"; +static char str_Chinese[] = "GB 2312 (õÐÒÏÝ. ËÉÔÁÊÓËÉÊ)"; +static char str_ChineseTrad[] = "Big5 (ëÉÔÁÊÓËÉÊ)"; +static char str_ChineseTradHKSCS[] = "Big5 HKSCS (ôÒÁÄ. ËÉÔÁÊÓËÉÊ)"; +static char str_Reducing[] = "÷Ù ÕÍÅÎØÛÉÌÉ ÞÉÓÌÏ ÓÉÍ×ÏÌÏ× ÄÏ ÚÎÁÞÅÎÉÑ ÍÅÎØÛÅÇÏ ÞÅÍ\012ÔÅËÕÝÅÅ. ðÒÉ ÜÔÏÍ ÂÕÄÕÔ ÕÄÁÌÅÎÙ ÎÅËÏÔÏÒÙÅ ÓÉÍ×ÏÌÙ.\012÷Ù ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÜÔÏÇÏ ÈÏÔÉÔÅ?"; +static char str_Toofew[] = "óÌÉÛËÏÍ ÍÁÌÏ ÓÉÍ×ÏÌÏ×"; +static char str_Badfamilyn[] = "îÅÐÏÄÈÏÄÑÝÅÅ ÎÁÚ×ÁÎÉÅ ÓÅÍÅÊÓÔ×Á, ÄÏÌÖÎÏ ÎÁÞÉÎÁÔØÓÑ Ó ÂÕË×Ù."; +static char str_Badfamily[] = "îÅÐÏÄÈÏÄÑÝÅÅ ÎÁÚ×ÁÎÉÅ ÓÅÍÅÊÓÔ×Á"; +static char str_Badascentdescentn[] = "Ascent and Descent must be positive and their sum less than 16384"; +static char str_Badascentdescent[] = "Bad Ascent/Descent"; +static char str_Fontinformation[] = "éÎÆÏÒÍÁÃÉÑ Ï ÛÒÉÆÔÅ %.90hs"; +static char str_WhichPlane[] = "Which Unicode plane:"; +static char str_Familyname[] = "çÁÒÎÉÔÕÒÁ:"; +static unichar_t mnemonic_Familyname[] = 'F'; +static char str_Fontname[] = "îÁÚ×ÁÎÉÅ ÛÒÉÆÔÁ:"; +static unichar_t mnemonic_Fontname[] = 'N'; +static char str_Humanname[] = "þÉÔÁÅÍÏÅ ÎÁÚ×ÁÎÉÅ:"; +static unichar_t mnemonic_Humanname[] = 's'; +static char str_Encoding[] = "ëÏÄÉÒÏ×ËÁ:"; +static unichar_t mnemonic_Encoding[] = 'E'; +static char str_Load[] = "úÁÇÒÕÚÉÔØ"; +static unichar_t mnemonic_Load[] = 'L'; +static char str_Makefromfont[] = "óÏÚÄÁÔØ ÉÚ ÛÒÉÆÔÁ"; +static unichar_t mnemonic_Makefromfont[] = 'k'; +static char str_Remove[] = "õÄÁÌÉÔØ"; +static unichar_t mnemonic_Remove[] = 'M'; +static char str_ForceEncoding[] = "ðÅÒÅÉÍÅÎÏ×ÁÎÉÅ"; +static unichar_t mnemonic_ForceEncoding[] = 'F'; +static char str_ForceEncodingPopup[] = "ïÂÙÞÎÏ ÉÚÍÅÎÅÎÉÅ ËÏÄÉÒÏ×ËÉ ÐÅÒÅÍÅÝÁÅÔ ÓÉÍ×ÏÌÙ Ó ÉÈ ÓÔÁÒÙÈ ÐÏÚÉÃÉÊ\nÎÁ ÉÈ ÐÏÚÉÃÉÉ × ÎÏ×ÏÊ ËÏÄÉÒÏ×ËÅ.\nîÏ ÅÓÌÉ ÜÔÁ ÇÒÁÆÁ ÓÏÄÅÒÖÉÔ ÏÔÍÅÔËÕ, ÔÏ FontForge ÐÒÅÄÐÏÌÁÇÁÅÔ, ÞÔÏ\nÓÉÍ×ÏÌÙ ÕÖÅ ÎÁ ÐÒÁ×ÉÌØÎÙÈ ÍÅÓÔÁÈ, ÎÏ\nÉÍÅÀÔ ÎÅÐÒÁ×ÉÌØÎÙÅ ÎÁÚ×ÁÎÉÑ É ÐÅÒÅÉÍÅÎÏ×Ù×ÁÅÔ ×Ó£\nÄÌÑ ÓÏ×ÐÁÄÅÎÉÑ Ó ÎÏ×ÏÊ ËÏÄÉÒÏ×ËÏÊ."; +static char str_Italicangle[] = "õÇÏÌ ÎÁËÌÏÎÁ:"; +static unichar_t mnemonic_Italicangle[] = 'I'; +static char str_Upos[] = "Underline Position:"; +static unichar_t mnemonic_Upos[] = 'P'; +static char str_Uheight[] = "÷ÙÓÏÔÁ:"; +static unichar_t mnemonic_Uheight[] = 'H'; +static char str_Ascent[] = "Ascent:"; +static unichar_t mnemonic_Ascent[] = 'A'; +static char str_Descent[] = "Descent:"; +static unichar_t mnemonic_Descent[] = 'D'; +static char str_EmSize[] = "òÁÚÍÅÒ \"Em\":"; +static unichar_t mnemonic_EmSize[] = 'E'; +static char str_ScaleOutlines[] = "íÁÓÛÔÁÂÉÒÏ×ÁÔØ ËÏÎÔÕÒÙ"; +static unichar_t mnemonic_ScaleOutlines[] = 'S'; +static char str_Copyright[] = "á×ÔÏÒÓËÏÅ ÐÒÁ×Ï:"; +static unichar_t mnemonic_Copyright[] = 'r'; +static char str_Xuid[] = "XUID:"; +static unichar_t mnemonic_Xuid[] = 'X'; +static char str_Numchars[] = "þÉÓÌÏ ÓÉÍ×ÏÌÏ×:"; +static unichar_t mnemonic_Numchars[] = 'N'; +static char str_CIDRegistry[] = "òÅÅÓÔÒ CID:"; +static char str_Guess[] = "õÇÁÄÁÔØ"; +static unichar_t mnemonic_Guess[] = 'G'; +static char *str_FamilyNameRequired = "îÅÏÂÈÏÄÉÍÏ ÎÁÚ×ÁÎÉÅ ÇÁÒÎÉÔÕÒÙ"; +static char *str_PSNameNotNumber = "îÁÚ×ÁÎÉÅ Postscript ÎÅ ÄÏÌÖÎÏ ÂÙÔØ ÞÉÓÌÏÍ"; +static char *str_BadFamilyName = "Bad Font Family Name"; +static char *str_BadFontName = "îÅÄÏÐÕÓÔÉÍÏÅ ÎÁÚ×ÁÎÉÅ ÛÒÉÆÔÁ"; +static char *str_NameTooLong = "óÌÉÛËÏÍ ÄÌÉÎÎÏÅ ÎÁÚ×ÁÎÉÅ; ÎÅ ÂÏÌØÛÅ 63 ÚÎÁËÏ×"; +static char *str_BadModifierName = "Bad Font Modifier Name"; +static char *str_BadPSName = "A Postscript name should be ASCII\nand must not contain (){}[]<>%%/"; +static char *str_Names = "îÁÚ×ÁÎÉÑ"; +static char *str_Encoding2 = "ëÏÄÉÒÏ×ËÁ"; +static char *str_PSGeneral = "ïÂÝÅÅ"; +static char *str_PSPrivate = "PS ðÒÉ×ÁÔÎÏÅ"; +static char *str_TTFNames = "îÁÚ×ÁÎÉÑ TTF"; +static char *str_TTFValues = "úÎÁÞÅÎÉÑ TTF"; +static char *str_Panose = "Panose"; +static char *str_Comment = "ëÏÍÍÅÎÔÁÒÉÊ"; +static char *str_InvalidEncoding = "îÅÐÒÁ×ÉÌØÎÁÑ ËÏÄÉÒÏ×ËÁ"; +static char *str_UniqueIDC = "UniqueID:"; +static char mnemonic_UniqueIDC = 'U'; +static char *str_VersionC = "÷ÅÒÓÉÑ:"; +static char mnemonic_VersionC = 'V'; +static char *str_HasVerticalMetrics = "óÏÄÅÒÖÉÔ ×ÅÒÔÉËÁÌØÎÙÅ ÍÅÔÒÉËÉ"; +static char mnemonic_HasVerticalMetrics = 'V'; +static char *str_VOrigin = "îÁÞ. ËÏÏÒÄ. ÐÏ ×ÅÒÔÉËÁÌÉ:"; +static char mnemonic_VOrigin = 'O'; +static char str_UniqueIDTitle = "éÚÍÅÎÉÔØ UniqueID?" +static char str_UniqueIDChange = "÷Ù ÉÚÍÅÎÉÌÉ ÎÁÚ×ÁÎÉÅ ÜÔÏÇÏ ÛÒÉÆÔÁ ÎÅ ÉÚÍÅÎÑÑ ÅÇÏ UniqueID (ÉÌÉ XUID).\n÷ÏÚÍÏÖÎÏ ÜÔÏ ÏÛÉÂËÁ. èÏÔÉÔÅ, ÞÔÏÂÙ FontForge\nÓÇÅÎÅÒÉÒÏ×ÁÌ ÓÌÕÞÁÊÎÏÅ ÎÏ×ÏÅ ÚÎÁÞÅÎÉÅ?"; +static char str_Change = "éÚÍÅÎÉÔØ"; +static char mnemonic_Change = 'h'; +static char str_ChangeAll = "éÚÍÅÎÉÔØ ×ÓÅ"; +static char mnemonic_ChangeAll = 'A'; +static char str_RetainAll = "óÏÈÒÁÎÉÔØ ×ÓÅ"; +static char mnemonic_RetainAll = 'l'; +static char str_Retain = "óÏÈÒÁÎÉÔØ"; +static char mnemonic_Retain = 'R'; +static char *str_Mismatch = "òÁÓÈÏÖÄÅÎÉÅ"; +static char *str_MismatchLong = "You have changed one version of %s but not the one under TTF Names. Would you like to set the TTF version to the changed one?"; /*new*/ +static char *str_Rename = "ðÅÒÅÉÍÅÎÏ×ÁÔØ..."; +static char *mnemonic_Rename = 'R'; +static char *str_NewDDD = "óÏÚÄÁÔØ..."; +static char *mnemonic_NewDDD = 'N'; +static char *str_EditDDD = "ðÒÁ×ËÁ..."; +static char *mnemonic_EditDDD = 'E'; +static char *str_ShowFirstMark = "ðÏËÁÚÁÔØ ÐÅÒ×ÕÀ ÏÔÍÅÔËÕ"; +static char *str_ShowNextMark = "ðÏËÁÚÁÔØ ÓÌÅÄ. ÏÔÍÅÔËÕ"; +static char *str_ShowFirstBase = "ðÏËÁÚÁÔØ ÐÅÒ×ÏÅ ÏÓÎÏ×ÁÎÉÅ"; +static char *str_ShowNextBase = "ðÏËÁÚÁÔØ ÓÌÅÄ. ÏÓÎÏ×ÁÎÉÅ"; +static char *str_NoMore = "âÏÌØÛÅ ÎÅÔ"; +static char *str_NoMoreMarks = "There are no more marks associated with this anchor class"; /*new*/ +static char *str_NoMoreBases = "There are no more base characters associated with this anchor class"; /*new*/ +static char *str_NoMarks = "There are no marks associated with this anchor class"; /*new*/ +static char *str_NoBases = "There are no base characters associated with this anchor class"; /*new*/ +static char *str_NewAnchorClass = "New anchor class"; /*new*/ +static char *str_EditAnchorClass = "Edit anchor class"; /*new*/ +static char *str_DupAnchorClass = "The name, %s, is already in use.\nIf you elect to continue these two anchor classes\nwill be merged when you press the OK button."; /*new*/ +static char *str_DupAnchorClassNotTag = "The name, %s, is already in use with a different tag."; /*new*/ +static char *str_Continue = "ðÒÏÄÏÌÖÉÔØ"; +static char *mnemonic_Continue = 'o'; +static char *str_AnchorClass = "Anchor Classes"; /*new*/ +static char *str_AnchorClassName = "Anchor Class Name:"; /*new*/ +static char str_FeatureTagTooLong = "Feature tags are limited to 4 ASCII characters"; /*new*/ +static char str_OnlyOne = "ôÏÌØËÏ ÏÄÉÎ"; +static char str_OnlyOneCurs = "There may be only one anchor class tagged with 'curs'"; /*new*/ +static char str_CantChange = "îÅ×ÏÚÍÏÖÎÏ ÓÄÅÌÁÔØ ÔÁËÏÅ ÉÚÍÅÎÅÎÉÅ" +static char str_CantChangeCurs = "You may not change the tag on an anchor class to or from 'curs'"; /*new*/ + /* Names of otf tags for GPOS features for anchor */ +static char *str_abvm = "îÁÄ ÏÔÍÅÔËÏÊ ÏÓÎÏ×Ù"; +static char *str_blwm = "ðÏÄ ÏÔÍÅÔËÏÊ ÏÓÎÏ×Ù"; +static char *str_markT = "òÁÚÍÅÝÅÎÉÅ ÏÔÍÅÔËÉ"; +static char *str_mkmk = "Mark to Mark"; /*new*/ +static char *str_curs = "Cursive Attachment"; /*new*/ + /* Private info */ +static char *str_PrivateKey = "ðÒÉ×ÁÔÎÙÊ ËÌÀÞ"; +static char *str_KeyInPrivate = "ëÌÀÞ (× ÐÒÉ×ÁÔÎÏÍ ÓÌÏ×ÁÒÅ)"; +static char *str_Add = "äÏÂÁ×ÉÔØ"; +static char mnemonic_Add = 'A'; + /* TTF Values */ +static char *str_UltraCondensed = "ó×ÅÒÈÕÚËÉÊ (50%)"; +static char *str_ExtraCondensed = "Extra-Condensed (62.5%)"; +static char *str_Condensed75 = "õÚËÉÊ (75%)"; +static char *str_SemiCondensed = "Semi-Condensed (87.5%)"; +static char *str_Medium100 = "ïÂÙÞÎÙÊ (100%)"; +static char *str_SemiExpanded = "Semi-Expanded (112.5%)"; +static char *str_Expanded125 = "Expanded (125%)"; +static char *str_ExtraExpanded = "Extra-Expanded (150%)"; +static char *str_UltraExpanded = "Ultra-Expanded (200%)"; +static char *str_Thin100 = "100 Thin"; +static char *str_ExtraLight200 = "200 Extra-Light"; +static char *str_Light300 = "300 Light"; +static char *str_Book400 = "400 Book"; +static char *str_Medium500 = "500 Medium"; +static char *str_DemiBold600 = "600 Demi-Bold"; +static char *str_Bold700 = "700 Bold"; +static char *str_Heavy800 = "800 Heavy"; +static char *str_Black900 = "900 Black"; +static char *str_EmbeddablePopup = "íÏÖÅÔ ÌÉ ÜÔÏÔ ÛÒÉÆÔ ÂÙÔØ ×ËÌÀÞ£Î × ÓËÁÞÉ×ÁÅÍÙÊ (pdf)\nÄÏËÕÍÅÎÔ É ÅÓÌÉ ÔÁË, ËÁËÉÅ ÄÅÊÓÔ×ÉÑ ÒÁÚÒÅÛÅÎÙ × ÏÔÎÏÛÅÎÉÉ\nÄÏËÕÍÅÎÔÁ É ÛÒÉÆÔÁ."; +static char *str_Embeddable = "÷ÓÔÒÁÉ×ÁÅÍÙÊ"; +static char mnemonic_Embeddable = 'E'; +static char *str_LineGapPopup = "Sets the linegap field in both the OS/2 and hhea tables"; +static char *str_LineGap = "Line Gap:"; +static char mnemonic_LineGap = 'R'; +static char *str_VLineGapPopup = "Sets the linegap field in the vhea table.\nThis is the horizontal spacing between rows\nof vertically set text."; +static char *str_VLineGap = "Column Spacing:"; +static char mnemonic_LineGap = 'R'; +static char *str_NeverEmbeddable = "îÅ ×ÓÔÒÁÉ×ÁÅÍÙÊ É ÎÅ ÒÅÄÁËÔÉÒÕÅÍÙÊ"; +static char *str_OnlyPrint = "äÏËÕÍÅÎÔ ÍÏÖÎÏ ÒÁÓÐÅÞÁÔÙ×ÁÔØ"; +static char *str_EditableDoc = "äÏËÕÍÅÎÔ ÍÏÖÎÏ ÒÅÄÁËÔÉÒÏ×ÁÔØ"; +static char *str_Installable = "õÓÔÁÎÁ×ÌÉ×ÁÅÍÙÊ ÛÒÉÆÔ"; +static char *str_NoSubsetting = "No Subsetting"; +static char *str_NoSubsettingPopup = "If set then the entire font must be\nembedded in a document when any character is.\nOtherwise the document creator need\nonly include the characters it uses."; +static char *str_OnlyBitmaps = "ôÏÌØËÏ ÒÁÓÔÒÙ"; +static char *str_OnlyBitmapsPopup = "ôÏÌØËÏ ÒÁÓÔÒÏ×ÙÅ ÛÒÉÆÔÙ ÍÏÇÕÔ ÂÙÔØ ×ÓÔÒÏÅÎÙ,\nÁ ÏÐÉÓÁÎÉÑ ËÏÎÔÕÒÏ× -- ÎÅÔ.\n(åÓÌÉ ÆÁÊÌ ÛÒÉÆÔÁ ÎÅ ÓÏÄÅÒÖÉÔ ÒÁÓÔÒÏ×ÙÈ ×ÁÒÉÁÎÔÏ×\nÔÏ ÎÉÞÅÇÏ ÎÅ ÍÏÖÅÔ ÂÙÔØ ×ÓÔÒÏÅÎÏ)"; +static char *str_Serif = "ó ÚÁÓÅÞËÁÍÉ"; +static char *str_SansSerif = "âÅÚ ÚÁÓÅÞÅË"; +static char *str_Monospace = "íÏÎÏÛÉÒÉÎÎÙÊ"; +static char *str_Script = "òÕËÏÐÉÓÎÙÊ"; +static char *str_Decorative = "äÅËÏÒÁÔÉ×ÎÙÊ"; +static char *str_Any = "ìÀÂÏÊ"; +static char *str_NoFit = "No Fit"; +static char *str_TextDisplay = "Text & Display"; +static char *str_Pictoral = "Pictoral"; +static char *str_Cove = "Cove"; +static char *str_ObtuseCove = "Obtuse Cove"; +static char *str_SquareCove = "Square Cove"; +static char *str_ObtuseSquareCove = "Obtuse Square Cove"; +static char *str_Square = "Square"; +static char *str_Thin = "Thin"; +static char *str_Bone = "Bone"; +static char *str_Exaggerated = "Exaggerated"; +static char *str_Triangle = "Triangle"; +static char *str_NormalSans = "Normal Sans"; +static char *str_ObtuseSans = "Obtuse Sans"; +static char *str_PerpSans = "Perp Sans"; +static char *str_Flared = "Flared"; +static char *str_Rounded = "Rounded"; +static char *str_VeryLight = "Very Light"; +static char *str_Light = "Light"; +static char *str_Book = "Book"; +static char *str_Medium = "Medium"; +static char *str_Demi = "Demi"; +static char *str_Bold = "Bold"; +static char *str_Heavy = "Heavy"; +static char *str_Black = "Black"; +static char *str_Nord = "Nord"; +static char *str_OldStyle = "Old Style"; +static char *str_Modern = "Modern"; +static char *str_EvenWidth = "Even Width"; +static char *str_Expanded = "Expanded"; +static char *str_Condensed = "Condensed"; +static char *str_VeryExpanded = "Very Expanded"; +static char *str_VeryCondensed = "Very Condensed"; +static char *str_Monospaced ="Monospaced"; +static char *str_VeryLow ="Very Low"; +static char *str_Low ="Low"; +static char *str_MediumLow ="Medium Low"; +static char *str_MediumHigh ="Medium High"; +static char *str_High ="High"; +static char *str_VeryHigh ="Very High"; +static char *str_GradDiag ="Gradual/Diagonal"; /*new*/ +static char *str_GradTrans ="Gradual/Transitional"; /*new*/ +static char *str_GradVert ="Gradual/Vertical"; /*new*/ +static char *str_GradHor ="Gradual/Horizontal"; /*new*/ +static char *str_RapidVert ="Rapid/Vertical"; /*new*/ +static char *str_RapidHor ="Rapid/Horizontal"; /*new*/ +static char *str_InstantVert ="Instant/Vertical"; /*new*/ +static char *str_NormalContact ="Normal/Contact"; /*new*/ +static char *str_NormalWeighted ="Normal/Weighted"; /*new*/ +static char *str_NormalBoxed ="Normal/Boxed"; /*new*/ +static char *str_NormalFlattened ="Normal/Flattened"; /*new*/ +static char *str_NormalRounded ="Normal/Rounded"; /*new*/ +static char *str_NormalOffCenter ="Normal/Off-Center"; /*new*/ +static char *str_NormalSquare ="Normal/Square"; /*new*/ +static char *str_ObliqueContact ="Oblique/Contact"; /*new*/ +static char *str_ObliqueWeighted ="Oblique/Weighted"; /*new*/ +static char *str_ObliqueBoxed ="Oblique/Boxed"; /*new*/ +static char *str_ObliqueFlattened ="Oblique/Flattened"; /*new*/ +static char *str_ObliqueRounded ="Oblique/Rounded"; /*new*/ +static char *str_ObliqueOffCenter ="Oblique/Off-Center"; /*new*/ +static char *str_ObliqueSquare ="Oblique/Square"; /*new*/ +static char *str_StraightArmsH = "Straight Arms/Horizontal"; /*new*/ +static char *str_StraightArmsW = "Straight Arms/Wedge"; /*new*/ +static char *str_StraightArmsV = "Straight Arms/Vertical"; /*new*/ +static char *str_StraightArmsSS = "Straight Arms/Single Serif"; /*new*/ +static char *str_StraightArmsDS = "Straight Arms/Double Serif"; /*new*/ +static char *str_NStraightArmsH = "Non-Straight Arms/Horizontal"; /*new*/ +static char *str_NStraightArmsW = "Non-Straight Arms/Wedge"; /*new*/ +static char *str_NStraightArmsV = "Non-Straight Arms/Vertical"; /*new*/ +static char *str_NStraightArmsSS = "Non-Straight Arms/Single Serif"; /*new*/ +static char *str_NStraightArmsDS = "Non-Straight Arms/Double Serif"; /*new*/ +static char *str_StandardTrimmed = "Standard/Trimmed"; /*new*/ +static char *str_StandardPointed = "Standard/Pointed"; /*new*/ +static char *str_StandardSerifed = "Standard/Serifed"; /*new*/ +static char *str_HighTrimmed = "High/Trimmed"; /*new*/ +static char *str_HighPointed = "High/Pointed"; /*new*/ +static char *str_HighSerifed = "High/Serifed"; /*new*/ +static char *str_ConstantTrimmed = "Constant/Trimmed"; /*new*/ +static char *str_ConstantPointed = "Constant/Pointed"; /*new*/ +static char *str_ConstantSerifed = "Constant/Serifed"; /*new*/ +static char *str_LowTrimmed = "Low/Trimmed"; /*new*/ +static char *str_LowPointed = "Low/Pointed"; /*new*/ +static char *str_LowSerifed = "Low/Serifed"; /*new*/ +static char *str_ConstantSmall = "Constant/Small"; /*new*/ +static char *str_ConstantStandard = "Constant/Standard"; /*new*/ +static char *str_ConstantLarge = "Constant/Large"; /*new*/ +static char *str_DuckingSmall = "Ducking/Small"; /*new*/ +static char *str_DuckingStandard = "Ducking/Standard"; /*new*/ +static char *str_DuckingLarge = "Ducking/Large"; /*new*/ +static char *str_WidthClass ="Width Class"; /*new*/ +static char mnemonic_WidthClass ='C'; +static char *str_WeightClass ="Weight Class"; /*new*/ +static char mnemonic_WeightClass ='W'; /*new*/ +static char *str_PFMFamily ="PFM óÅÍÅÊÓÔ×Ï"; +static char mnemonic_PFMFamily ='F'; +static char *str_Family ="çÁÒÎÉÔÕÒÁ"; +static char mnemonic_Family ='F'; +static char *str_Serifs ="úÁÓÅÞËÉ"; +static char mnemonic_Serifs ='S'; +static char *str_Weight ="îÁÓÙÝÅÎÎÏÓÔØ"; +static char mnemonic_Weight ='W'; +static char *str_Proportion ="ðÒÏÐÏÒÃÉÉ"; +static char mnemonic_Proportion ='P'; +static char *str_Contrast ="ëÏÎÔÒÁÓÔÎÏÓÔØ"; +static char mnemonic_Contrast ='C'; +static char *str_StrokeVar ="÷ÁÒÉÁÃÉÉ ÛÔÒÉÈÁ"; +static char mnemonic_StrokeVar ='V'; +static char *str_ArmStyle ="Arm Style"; /*new*/ +static char mnemonic_ArmStyle ='A'; +static char *str_Letterform ="Letterform"; /*new*/ +static char mnemonic_Letterform ='L'; +static char *str_MidLine ="Midline"; /*new*/ +static char mnemonic_MidLine ='M'; +static char *str_XHeight ="X-Height"; /*new*/ +static char mnemonic_XHeight ='X'; + /* TTF Names */ +static char *str_Styles = "óÔÉÌÉ (ðÏÄÓÅÍÅÊÓÔ×Ï)"; +static char *str_UniqueID = "UniqueID"; +static char *str_Version = "÷ÅÒÓÉÑ"; +static char mnemonic_Version = 'V'; +static char *str_Fullname = "ðÏÌÎÏÅ ÎÁÚ×ÁÎÉÅ"; +static char *str_Trademark = "ôÏÒÇÏ×ÁÑ ÍÁÒËÁ"; +static char *str_Manufacturer = "ðÒÏÉÚ×ÏÄÉÔÅÌØ"; +static char *str_Designer = "äÉÚÁÊÎÅÒ"; +static char *str_Descriptor = "Descriptor"; +static char *str_VenderURL = "URL ÐÒÏÉÚ×ÏÄÉÔÅÌÑ"; +static char *str_DesignerURL = "URL ÄÉÚÁÊÎÅÒÁ"; +static char *str_License = "ìÉÃÅÎÚÉÑ"; +static char *str_LicenseURL = "URL ÌÉÃÅÎÚÉÉ"; +static char *str_OTFFamily = "ðÒÅÄÐÏÞÔÉÔÅÌØÎÏÅ ÓÅÍÅÊÓÔ×Ï"; +static char *str_OTFStyles = "ðÒÅÄÐÏÞÔÉÔÅÌØÎÙÅ ÓÔÉÌÉ"; +static char *str_CompatableFull = "Compatable Full"; /*new*/ +static char *str_SampleText = "ïÂÒÁÚÅà ÔÅËÓÔÁ"; +static char *str_TranslateStyle = "ðÅÒÅ×ÅÓÔÉ ÓÔÉÌØ"; + /* MS Language list */ +/* Language & Country (where applicable) in the native language if I can find */ +/* it, in english if I can't. Followed by the 2char language _ 2char country */ +/* (again country isn't always applicable. Should basque be ES, FR? */ +static char *str_Albanian = "áÌÂÁÎÓËÉÊ sq_AL"; +static char *str_Arabic = "áÒÁÂÓËÉÊ ar"; +static char *str_Basque = "âÁÓËÓËÉÊ eu"; +static char *str_Byelorussian = "âÅÌÁÒÕÓËÉÊ be_BY"; +static char *str_Bulgarian = "âÏÌÇÁÒÓËÉÊ bg_BG"; +static char *str_Catalan = "ëÁÔÁÌÏÎÓËÉÊ ca"; +static char *str_MSChinese = "ëÉÔÁÊÓËÉÊ zh_CN"; +static char *str_Croatian = "èÏÒ×ÁÔÓËÉÊ hr"; +static char *str_Czech = "þÅÛÓËÉÊ cs_CZ"; +static char *str_Danish = "äÁÔÓËÉÊ da_DK"; +static char *str_Dutch = "çÏÌÁÎÄÓËÉÊ nl_NL"; +static char *str_Flemish = "çÏÌÁÎÄÓËÉÊ nl_BE"; +static char *str_BrEnglish = "âÒÉÔÁÎÓËÉÊ ÁÎÇÌÉÊÓËÉÊ en_UK"; +static char *str_AmEnglish = "áÍÅÒÉËÁÎÓËÉÊ ÁÎÇÌÉÊÓËÉÊ en_US"; +static char *str_CaEnglish = "ëÁÎÁÄÓËÉÊ ÁÎÇÌÉÊÓËÉÊ en_CA"; +static char *str_AuEnglish = "á×ÓÔÒÁÌÉÊÓËÉÊ ÁÎÇÌÉÊÓËÉÊ en_AU"; +static char *str_NZEnglish = "îÏ×ÏÚÅÌÁÎÄÓËÉÊ ÁÎÇÌÉÊÓËÉÊ en_NZ"; +static char *str_IEEnglish = "éÒÌÁÎÄÓËÉÊ ÁÎÇÌÉÊÓËÉÊ en_IE"; +static char *str_Estonia = "üÓÔÏÎÓËÉÊ et_EE"; +static char *str_Finnish = "æÉÎÓËÉÊ fi_FI"; +static char *str_FRFrench = "æÒÁÎÃÕÚÓËÉÊ fr_FR"; +static char *str_BEFrench = "âÅÌØÇÉÊÓËÉÊ ÆÒÁÎÃÕÚÓËÉÊ fr_BE"; +static char *str_CAFrench = "ëÁÎÁÄÓËÉÊ ÆÒÁÎÃÕÚÓËÉÊ fr_CA"; +static char *str_CHFrench = "û×ÅÊÃÁÒÓËÉÊ ÆÒÁÎÃÕÚÓËÉÊ fr_CH"; +static char *str_LUFrench = "ìÀËÓÅÍÂÕÒÇÓËÉÊ ÆÒÁÎÃÕÚÓËÉÊ fr_LU"; +static char *str_DEGerman = "îÅÍÅÃËÉÊ de_DE"; +static char *str_CHGerman = "û×ÅÊÃÁÒÓËÉÊ ÎÅÍÅÃËÉÊ de_CH"; +static char *str_ATGerman = "á×ÓÔÒÉÊÓËÉÊ ÎÅÍÅÃËÉÊ de_AT"; +static char *str_LUGerman = "ìÀËÓÅÍÂÕÒÇÓËÉÊ ÎÅÍÅÃËÉÊ de_LU"; +static char *str_LIGerman = "ìÉÈÔÅÎÛÔÅÊÎÓËÉÊ ÎÅÍÅÃËÉÊ de_LI"; +static char *str_Greek = "çÒÅÞÅÓËÉÊ el_GR"; +static char *str_Hebrew = "é×ÒÉÔ he_IL"; +static char *str_Hungarian = "÷ÅÎÇÅÒÓËÉÊ hu_HU"; +static char *str_Icelandic = "éÓÌÁÎÄÓËÉÊ is_IS"; +static char *str_Italian = "éÔÁÌØÑÎÓËÉÊ it_IT"; +static char *str_CHItalian = "û×ÅÊÃÁÒÓËÉÊ ÉÔÁÌØÑÎÓËÉÊ it_CH"; +static char *str_Japanese = "ñÐÏÎÓËÉÊ jp_JP"; +static char *str_Latvian = "ìÁÔÙÛÓËÉÊ lv_LV"; +static char *str_Lithuanian = "ìÉÔÏ×ÓËÉÊ lt_LT"; +static char *str_Norwegian = "îÏÒ×ÅÖÓËÉÊ Bokmal no_NO"; +static char *str_NorwegianN = "îÏÒ×ÅÖÓËÉÊ Nynorsk no_NO"; +static char *str_Polish = "ðÏÌØÓËÉÊ pl_PL"; +static char *str_PTPortuguese = "ðÏÒÔÕÇÁÌØÓËÉÊ pt_PT"; +static char *str_BRPortuguese = "âÒÁÚÉÌØÓËÉÊ ÐÏÒÔÕÇÁÌØÓËÉÊ pt_BR"; +static char *str_Romanian = "òÕÍÙÎÓËÉÊ ro_RO"; +static unichar_t str_Russian = { 0x420, 0x443, 0x441, 0x441, 0x43a, 0x438, 0x439, ' ', 'r','u','_','R','U', '\0' }; +static char *str_Slovak = "óÌÏ×ÁÃËÉÊ sk_SK"; +static char *str_Slovenian = "Slovenian sl_SI"; +static char *str_TradSpanish = "éÓÐÁÎÓËÉÊ es_ES"; +static char *str_MXSpanish = "íÅËÓÉËÁÎÓËÉÊ ÉÓÐÁÎÓËÉÊ es_MX"; +static char *str_ModSpanish = "Español Español es_ES"; +static char *str_Swedish = "û×ÅÄÓËÉÊ sv_SE"; +static char *str_Turkish = "ôÕÒÅÃËÉÊ tr_TR"; +static char *str_Ukrainian = "õËÒÁÉÎÓËÉÊ uk_UA"; + /* Generate fonts */ /* savefontdlg */ +static char str_Format[] = "æÏÒÍÁÔ:"; +static char str_Savefailedtitle[] = "îÅ ÕÄÁÌÏÓØ ÓÏÈÒÁÎÉÔØ"; +static char str_Outputafm[] = "óÏÚÄÁ×ÁÔØ AFM"; +static char str_Outputpfm[] = "óÏÚÄÁ×ÁÔØ PFM"; +static char *str_OutputAfmPopup = "æÁÊÌ AFM ÓÏÄÅÒÖÉÔ ÉÎÆÏÒÍÁÃÉÀ Ï ÍÅÔÒÉËÁÈ, ËÏÔÏÒÕÀ ÂÕÄÕÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÂÏÌØÛÉÎÓÔ×Ï ÔÅËÓÔÏ×ÙÈ ÐÒÏÃÅÓÓÏÒÏ× ÐÒÉ ÒÁÂÏÔÅ Ó PostScript\256 ÛÒÉÆÔÏÍ."; +static char *str_OutputPfmPopup = "æÁÊÌ PFM ÓÏÄÅÒÖÉÔ ÉÎÆÏÒÍÁÃÉÀ ÎÅÏÂÈÏÄÉÍÕÀ Windows ÄÌÑ ÕÓÔÁÎÏ×ËÉ ÛÒÉÆÔÁ PostScript."; +static char str_AppleMode[] = "Apple"; +static char *str_AppleModePopup = "Apple É MS/Adobe ÉÓÐÏÌØÚÕÀÔ ÒÁÚÎÙÅ ÆÏÒÍÁÔÙ ÆÁÊÌÏ× truetype É opentype\n÷Ù ÍÏÖÅÔÅ ×ÙÂÒÁÔØ ËÁËÏÍÕ ÓÔÁÎÄÁÒÔÕ ÓÌÅÄÏ×ÁÔØ ÄÌÑ ×ÁÛÅÇÏ ÛÒÉÆÔÁ."; +static char str_Nooutlinefont[] = "âÅÚ ËÏÎÔÕÒÎÏÇÏ"; +static char str_Nobitmapfonts[] = "âÅÚ ÒÁÓÔÒÏ×ÏÇÏ"; +static char str_Afmfailedtitle[] = "óÂÏÊ ÓÏÈÒÁÎÅÎÉÑ AFM"; +static char str_Pfmfailedtitle[] = "óÂÏÊ ÓÏÈÒÁÎÅÎÉÑ PFM"; +static char *str_SavingFont = "óÏÈÒÁÎÅÎÉÅ ÛÒÉÆÔÁ"; +static char *str_SavingPSFont = "óÏÈÒÁÎÅÎÉÅ ÛÒÉÆÔÁ Postscript"; +static char *str_SavingMultiplePSFonts = "óÏÈÒÁÎÅÎÉÅ ÍÎÏÖÅÓÔ×Á ÛÒÉÆÔÏ× Postscript"; +static char *str_SavingTTFont = "óÏÈÒÁÎÅÎÉÅ ÛÒÉÆÔÁ TrueType"; +static char *str_SavingCIDFont = "óÏÈÒÁÎÅÎÉÅ ÛÒÉÆÔÁ CID"; +static char *str_SavingAFM = "óÏÈÒÁÎÅÎÉÅ ÆÁÊÌÁ AFM"; +static char *str_SavingPFM = "óÏÈÒÁÎÅÎÉÅ ÆÁÊÌÁ PFM"; +static char *str_SavingBitmapFonts = "óÏÈÒÁÎÅÎÉÅ ÒÁÓÔÒÏ×ÙÈ ÛÒÉÆÔÏ×"; +static char *str_NotCID = "îÅ × ÆÏÒÍÁÔÅ CID"; +static char *str_NotCIDOk = "÷Ù ÐÙÔÁÅÔÅÓØ ÓÏÈÒÁÎÉÔØ ÛÒÉÆÔ CID ÎÅ × ÆÏÒÍÁÔÅ CID. üÔÏ ÄÏÐÕÓÔÉÍÏ, ÎÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÂÕÄÅÔ ÓÏÈÒÁΣΠÔÏÌØËÏ ÔÅËÕÝÉÊ ×ÌÏÖÅÎÎÙÊ ÛÒÉÆÔ.\n÷Ù ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÈÏÔÉÔÅ ÜÔÏÇÏ?"; +static char *str_PixelList = "Pixel List"; +static char *str_EncodingTooLarge="óÌÉÛËÏÍ ÂÏÌØÛÁÑ ËÏÄÉÒÏ×ËÁ"; +static char *str_TwoBEncIn1BFont = "õ ×ÁÛÅÇÏ ÛÒÉÆÔÁ 2-È ÂÁÊÔÎÁÑ ËÏÄÉÒÏ×ËÁ, Á ×Ù ÐÙÔÁÅÔÅÓØ ÓÏÈÒÁÎÉÔØ ÅÇÏ × ÆÏÒÍÁÔÅ, ËÏÔÏÒÙÊ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÔÏÌØËÏ ÏÄÎÏÂÁÊÔÎÙÅ ËÏÄÉÒÏ×ËÉ. üÔÏ ÚÎÁÞÉÔ, ÞÔÏ ×Ù ÎÅ ÓÍÏÖÅÔÅ ÐÏÌÕÞÉÔØ ÄÏÓÔÕÐ ÎÉ Ë ÞÅÍÕ ÐÏÓÌÅ ÐÅÒ×ÙÈ 256 ÓÉÍ×ÏÌÏ× ÂÅÚ ÐÅÒÅËÏÄÉÒÏ×ÁÎÉÑ ÛÒÉÆÔÁ.\n\nèÏÔÉÔÅ ÐÒÏÄÏÌÖÉÔØ?"; +static char *str_GreymapDepth = "âÉÔ ÎÁ ÔÏÞËÕ ÒÁÓÔÒÁ × greymap"; +static char *str_BDFResolution = "òÁÚÒÅÛÅÎÉÅ BDF" +static char *str_Other_ = "äÒÕÇÏÅ"; +static char *mnemonic_Other_ = "O"; +static char *str_GuessResPopup = "ïÐÒÅÄÅÌÑÔØ ÒÁÚÒÅÛÅÎÉÅ ËÁÖÄÏÇÏ ÛÒÉÆÔÁ ÎÁ ÏÓÎÏ×Å ÅÇÏ ÒÁÚÍÅÒÏ×"; +static char *str_FindMultipleMap = "Find Sub Font Definition file"; /*new*/ +static char *str_NoSubFontDefinitionFile = "No Sub Font Definition file"; /*new*/ +static char *str_PSNames = "PS îÁÚ×ÁÎÉÑ"; +static char *str_PSNamesPopup = "èÏÔÉÔÅ, ÞÔÏÂÙ ÆÁÊÌ ÛÒÉÆÔÁ ÓÏÄÅÒÖÁÌ ÎÁÚ×ÁÎÉÑ ËÁÖÄÏÇÏ ÓÉÍ×ÏÌÁ × ÛÒÉÆÔÅ?"; +static char *str_TTFHintsPopup = "Do you want the font file to contain truetype hints? Currently FontForge's\nhinting mechanism is very poor and you are probably better off without them."; /*new*/ +static char *str_WrongSFDFile = "îÅÐÒÁ×ÉÌØÎÙÊ ÔÉÐ ÆÁÊÌÁ SFD"; +static char *str_BadSFDFile = "This looks like one of FontForge's SplineFont DataBase files.\nNot one of TeX's SubFont Definition files.\nAn unfortunate confusion of extensions."; /*new*/ +static char *str_BadFamilyForMac = "Bad Mac Family"; /*new*/ +static char *str_BadMacFamily = "To generate a Mac family file, the current font must have plain (Normal, Regular, etc.) style, and there must be other open fonts with the same family name."; /*new*/ +static char *str_TwoFontsSameStyle = "There are two open fonts with the current family name and the same style. %.30hs and %.30hs"; /*new*/ +static char *str_DifferentEncodings = "The font %1$.30hs has a different encoding than that of %2$.30hs"; /*new*/ +static char *str_NotdefName = "Notdef name"; /*new*/ +static char *str_NotdefChar = "The character at encoding %d is named \".notdef\" but contains an outline. Because it is called \".notdef\" it will not be included in the generated font. You may give it a new name using Element->Char Info. Do you wish to continue font generation (and omit this character)?"; /*new*/ +static char *str_EmSizeBad = "Non-standard Em-Size"; /*new*/ +static char *str_PSEmSize1000 = "The convention is that PostScript fonts should have an Em-Size of 1000. But this font has a size of %d. This is not an error, but you might consider altering the Em-Size with the Element->Font Info->PS General dialog.\nDo you wish to continue to generate your font in spite of this?"; /*new*/ +static char *str_TTFEmSize2 = "The convention is that TrueType fonts should have an Em-Size which is a power of 2. But this font has a size of %d. This is not an error, but you might consider altering the Em-Size with the Element->Font Info->PS General dialog.\nDo you wish to continue to generate your font in spite of this?"; /*new*/ + /* Goto character ... */ +static char str_Badnumberin[] = "îÅÐÒÁ×ÉÌØÎÙÊ ÎÏÍÅÒ × "; +static char str_Enternameofchar[] = "÷×ÅÄÉÔÅ ÎÁÚ×ÁÎÉÅ ÓÉÍ×ÏÌÁ × ÛÒÉÆÔÅ"; +static char str_Couldntfindchar[] = "îÅ ÕÄÁÌÏÓØ ÎÁÊÔÉ ÓÉÍ×ÏÌ: %.70hs"; +static char str_CouldntfindcharU[] = "îÅ ÕÄÁÌÏÓØ ÎÁÊÔÉ ÓÉÍ×ÏÌ: %.70s"; +static char str_CouldntfindcharT[] = "îÅ ÕÄÁÌÏÓØ ÎÁÊÔÉ ÓÉÍ×ÏÌ"; +static char str_CouldntFindSubstitution = "Could not find substitution character: %.40hs"; /*new*/ + /* Font has changed dlg */ +static char str_Dontsave[] = "îÅ ÓÏÈÒÁÎÑÔØ"; +static unichar_t mnemonic_Dontsave[] = 'D'; +static char str_Fontchange[] = "ûÒÉÆÔ ÉÚÍÅΣÎ"; +/* Font %.70s in file %.70s has been changed.\nDo you want to save it? */ +static char str_Fontchangepre[] = "ûÒÉÆÔ "; +static char str_Fontchangemid[] = " × ÆÁÊÌÅ "; +static char str_Fontchangepost[] = " ÂÙÌ ÉÚÍÅΣÎ.\012èÏÔÉÔÅ ÓÏÈÒÁÎÉÔØ ÅÇÏ?"; +static char str_Fontchangerevertpost[] = " ÂÙÌ ÉÚÍÅΣÎ.\012÷ÏÓÓÔÁÎÏ×ÌÅÎÉÅ ÆÁÊÌÁ ÕÎÉÞÔÏÖÉÔ ×ÓÅ ÉÚÍÅÎÅÎÉÑ.\012üÔÏ ÔÏ ÞÅÇÏ ×Ù ÈÏÔÉÔÅ?"; + /* General messages from fontview.c */ +static char str_Revert[] = "÷ÏÓÓÔÁÎÏ×ÉÔØ"; +static unichar_t mnemonic_Revert[] = 'R'; +static char str_Manywin[] = "íÎÏÇÏ ÏËÏÎ"; +static char str_Toomany[] = "ðÏÚ×ÏÌÉÔØ ÏÔËÒÙÔØ ÂÏÌØÛÅ 10 ÏËÏÎ.\012÷Ù ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÜÔÏÇÏ ÈÏÔÉÔÅ?"; +static char *str_MergeKernInfo = "ïÂßÅÄÉÎÉÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ËÅÒÎÉÎÇÅ"; +static char *str_OpenPostscript = "ïÔËÒÙÔØ ÛÒÉÆÔ Postscript"; +static char *str_Loading = "úÁÇÒÕÚËÁ..."; +static char *str_LoadingFontFrom = "úÁÇÒÕÖÁÅÔÓÑ ÛÒÉÆÔ ÉÚ "; +static char *str_ReadingGlyphs = "þÔÅÎÉÅ ÇÌÉÆÏ×"; +static char *str_ReadingAFM = "þÔÅÎÉÅ ÆÁÊÌÁ AFM"; +static char *str_InterpretingGlyphs = "éÎÔÅÒÐÒÅÔÁÃÉÑ ÇÌÉÆÏ×"; +static char *str_CouldntOpenFontTitle = "îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ÛÒÉÆÔ"; +static char *str_CouldntParseFont = "îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ÛÒÉÆÔ (ÉÌÉ ÏÎ × ÎÅÐÏÄÈÏÄÑÝÅÍ ÆÏÒÍÁÔÅ): %hs"; +static char *str_SaveFailed = "óÂÏÊ ÓÏÈÒÁÎÅÎÉÑ"; +static char *str_Transforming = "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ..."; +static char *str_Simplifying = "õÐÒÏÝÅÎÉÅ..."; +static char *str_AddingExtrema = "äÏÂÁ×ÌÅÎÉÅ ÔÏÞÅË × ÜËÓÔÒÅÍÕÍÁÈ..."; +static char *str_RemovingOverlap = "õÄÁÌÅÎÉÅ ÐÅÒÅÓÅÞÅÎÉÊ..."; +static char *str_CorrectingDirection = "éÓÐÒÁ×ÌÅÎÉÅ ÎÁÐÒÁ×ÌÅÎÉÑ..."; +static char *str_Rounding = "ïËÒÕÇÌÅÎÉÅ ÄÏ ÃÅÌÏÇÏ..."; +static char *str_Autotracing = "á×ÔÏÔÒÁÓÓÉÒÏ×ËÁ..."; +static char *str_ClearDependent = "÷Ù ÐÙÔÁÅÔÅÓØ ÏÞÉÓÔÉÔØ %.30hs, ËÏÔÏÒÙÊ ÓÓÙÌÁÅÔÓÑ ÎÁ\nÄÒÕÇÏÊ ÓÉÍ×ÏÌ. ÷Ù Õ×ÅÒÅÎÙ × ÔÏÍ ÞÔÏ ÈÏÔÉÔÅ ÏÞÉÓÔÉÔØ ÅÇÏ?"; +static char *str_UnlinkAll = "òÁÚÙÍÅÎÏ×ÁÔØ ×ÓÅ"; +static char *str_Unlink = "òÁÚÙÍÅÎÏ×ÁÔØ"; +static char *str_dPixelBitmap = "òÁÓÔÒ %d ÔÏÞÅË"; +static char *str_ddPixelBitmap = "%d@%d pixel bitmap"; /*new*/ +static char *str_RestrictedRightsFont = "üÔÏÔ ÛÒÉÆÔ ÐÏÍÅÞÅÎ ËÁË FSType 2 (ïÇÒÁÎÉÞÅÎÎÁÑ\nìÉÃÅÎÚÉÑ). üÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÅÇÏ ÎÅÌØÚÑ ÒÅÄÁËÔÉÒÏ×ÁÔØ ÂÅÚ\nÒÁÚÒÅÛÅÎÉÑ ÚÁËÏÎÎÏÇÏ ×ÌÁÄÅÌØÃÁ.\n\nõ ×ÁÓ ÅÓÔØ ÔÁËÏÅ ÒÁÚÒÅÛÅÎÉÅ?"; +static char *str_RestrictedFont = "ûÒÉÆÔ Ó ÏÇÒÁÎÉÞÅÎÉÑÍÉ"; +static char *str_CloseFont = "ðÏÖÁÌÕÊÓÔÁ, ÚÁËÒÏÊÔÅ ÛÒÉÆÔ"; +static char *str_CloseFontForCID = "Please close %hs before inserting it into a CID font"; /*new*/ +static char *str_CIDRemoveFontCheck = "Are you sure you wish to remove sub-font %1$.40hs from the CID font %2$.40hs"; /*new*/ +static char *str_FlippedRef = "úÅÒËÁÌØÎÁÑ ÓÓÙÌËÁ"; +static char *str_FlippedRefUnlink = "%.50hs contains a flipped reference. This cannot be corrected as is. Would you like me to unlink it and then correct it?"; /*new*/ +static char *str_Baseline = "âÁÚÏ×ÁÑ ÌÉÎÉÑ"; +static char *str_Origin = "îÁÞ.ËÏÏÒÄÉÎÁÔ"; +static char *str_AdvanceWidthAsBar = "Advance Width as a Bar"; /*new*/ +static char *str_AdvanceWidthAsLine = "Advance Width as a Line"; /*new*/ +static char *str_AdvanceBarPopup = "Display the advance width as a bar under the character\nshowing the extent of the advance"; /*new*/ +static char *str_AdvanceLinePopup = "Display the advance width as a line\nperpendicular to the advance direction"; /*new*/ +static char *str_Suffix = "óÕÆÆÉËÓ:"; +static char *str_SuffixToTag = "Suffix to Tag..."; /*new*/ + /* Messages from accented characters */ +static char str_Buildingaccented[] = "óÏÚÄÁÎÉÅ ÁËÃÅÎÔÉÒÏ×ÁÎÎÙÈ ÓÉÍ×ÏÌÏ×"; +static char str_Replacearing[] = "úÁÍÅÎÉÔØ Å"; +static char str_Areyousurearing[] = "÷Ù Õ×ÅÒÅÎÙ × ÔÏÍ, ÞÔÏ ÈÏÔÉÔÅ ÚÁÍÅÎÉÔØ Å?\012ëÏÌØÃÏ ÎÅ ÂÕÄÅÔ ÓÏÅÄÉÎÅÎÏ Ó A."; +static char str_Yes[] = "äÁ"; +static unichar_t mnemonic_Yes[] = 'Y'; +static char str_No[] = "îÅÔ"; +static unichar_t mnemonic_No[] = 'N'; + /* Choices from bitmap editing */ +static char str_Rectangle[] = "ðÒÑÍÏÕÇÌÎË"; +static char str_FilledRectangle[] = "úÁÐÏÌÎÅÎÎÙÊ ÐÒÑÍÏÕÇÏÌØÎÉË"; +static char str_Elipse[] = "üÌÌÉÐÓ"; +static char str_FilledElipse[] = "úÁÐÏÌÎÅÎÎÙÊ ÜÌÌÉÐÓ"; + /* Get Info ... */ +static char str_Multiple[] = "Multiple"; /*new*/ +static char str_AlreadyCharUnicode[] = "There is already a character with this Unicode encoding,\012(named %1$.40hs, at local encoding %2$d)\012Is that what you want?"; /*new*/ +static char str_Alreadycharnamed[] = "There is already a character with this name,\012do you want to swap names?"; /*new*/ +static char str_AlreadyLigature[] = "There is already a ligature made from these components,\012(named %1$.40hs at local encoding %2$d)\012Is that what you want?"; /*new*/ +static char str_Badligature[] = "A ligature may not be made up of itself"; /*new*/ +/* "The component %.20s is not in this font,\nIs that what you want?" */ +static char str_MissingComponent[] = "The componant %.40s is not in this font,\012Is that what you want?"; /*new*/ +static char str_SelfReferential = "This substitution is self-referential" /*new*/ +static char str_Done[] = "úÁËÒÙÔØ"; +static unichar_t mnemonic_Done[] = 'D'; +static char str_Ligpop[] = "åÓÌÉ ÜÔÏ ÌÉÇÁÔÕÒÁ,\012××ÅÄÉÔÅ ÎÁÚ×ÁÎÉÑ ÓÉÍ×ÏÌÏ×\012ÉÚ ËÏÔÏÒÙÈ ÏÎÁ ÓÏÓÔÏÉÔ"; +static char *str_Show[] = "ðÏËÁÚÁÔØ"; +static unichar_t mnemonic_Show[] = 'S'; +static char *str_PointInfo = "éÎÆÏÒÍÁÃÉÑ Ï ÔÏÞËÁÈ"; +static char *str_ImageInfo = "éÎÆÏÒÍÁÃÉÑ Ï ÉÚÏÂÒÁÖÅÎÉÉ"; +static char *str_ReferenceInfo = "éÎÆÏÒÍÁÃÉÑ Ï ÓÓÙÌËÅ"; +static char *str_AnchorPointInfo = "éÎÆÏÒÍÁÃÉÑ Ï ÑËÏÒÅ"; +static char *str_Dependents = "úÁ×ÉÓÉÍÏÓÔÉ"; +static char *str_Offset = "óÍÅÝÅÎÉÅ"; +static char *str_BaseX = "ïÓÎÏ×ÁÎÉÅ X"; +static char *str_BaseY = "ïÓÎÏ×ÁÎÉÅ Y"; +static char *str_NextCP = "óÌÅÄ. ëô:"; +static char *str_NextCPX = "óÌÅÄ. ëô X"; +static char *str_NextCPY = "óÌÅÄ. ëô Y"; +static char *str_PrevCP = "ðÒÅÄ. ëô:"; +static char *str_PrevCPX = "ðÒÅÄ. ëô X"; +static char *str_PrevCPY = "ðÒÅÄ. ëô Y"; +static char *str_UnicodeL = "Unicode"; +static char *str_LigatureL = "ìÉÇÁÔÕÒÁ"; +static char *str_Components = "ëÏÍÐÏÎÅÎÔÙ"; +static char *str_AltPos = "Alt Pos"; /*new*/ +static char *str_Subs = "Subs"; /*new*/ +static char *str_AltSubs = "Alt Subs"; /*new*/ +static char *str_MultSubs = "Mult Subs"; /*new*/ +static char *str_UnicodeName = "îÁÚ×. Unicode:"; +static char mnemonic_UnicodeName = 'N'; +static char *str_UnicodeValue = "úÎÁÞ. Unicode:"; +static char mnemonic_UnicodeValue = 'V'; +static char *str_UnicodeChar = "óÉÍ×. Unicode:"; +static char mnemonic_UnicodeChar = 'h'; +static char *str_SetFromName = "ðÏ ÎÁÚ×ÁÎÉÀ"; +static char mnemonic_SetFromName = 'a'; +static char *str_SetFromValue = "ðÏ ÚÎÁÞÅÎÉÀ"; +static char mnemonic_SetFromValue = 'u'; +static char *str_Ligature = "ìÉÇÁÔÕÒÁ:"; +static char mnemonic_Ligature = 'L'; +static char *str_AccentedComponents = "áËÃ. ÓÉÍ×ÏÌ ÓÏÓÔÏÉÔ ÉÚ:"; +static char *str_CompositComponents = "óÉÍ×ÏÌ ÓÏÓÔÏÉÔ ÉÚ:"; +static char *str_NoComponents = "îÅÔ ËÏÍÐÏÎÅÎÔÏ×"; +static char *str_Color = "ã×ÅÔ:"; +static char *str_TransformedBy = "éÚÍÅΣÎ:"; +static char *str_NotUnicodeBMP = "÷ÎÉÍÁÎÉÅ: üÔÏ ÚÎÁÞÅÎÉÅ ×ÎÅ ÄÉÁÐÁÚÏÎÁ Unicode BMP.\n÷Ù ÄÅÊÓÔ×ÉÔÅÌØÎÏ ÜÔÏÇÏ ÈÏÔÉÔÅ?"; +static char *str_PossiblyTooBig = "÷ÏÚÍÏÖÎÏ ÜÔÏ ÚÎÁÞÅÎÉÅ ×ÎÅ ÄÉÁÐÁÚÏÎÁ"; +static char *str_OutOfRange = "úÎÁÞÅÎÉÅ ×ÎÅ ÄÉÁÐÁÚÏÎÁ"; +static char *str_TransformationMatrix = "íÁÔÒÉÃÁ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ"; +static char *str_TransformChanged = "íÁÔÒÉÃÁ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ ÉÚÍÅÎÅÎÁ"; +static char *str_TransformChangedApply = "You have changed the transformation matrix, do you wish to use the new version?"; /*new*/ +static char *str_TransformPopup = "The transformation matrix specifies how the points in\nthe source character should be transformed before\nthey are drawn in the current character.\n x(new) = tm[1,1]*x + tm[2,1]*y + tm[3,1]\n y(new) = tm[1,2]*x + tm[2,2]*y + tm[3,2]"; /*new*/ +static char *str_MakeNewClass = "Make a new anchor class"; /*new*/ +static char *str_MakeNewAnchorClass = "I cannot find an unused anchor class\nto assign a new point to. If you\nwish a new anchor point you must\ndefine a new anchor class with\nElement->Font Info"; /*new*/ +static char *str_Mark = "ïÔÍÅÔËÁ"; +static char *str_BaseChar = "BaseChar"; /*new*/ +static char *str_BaseLig = "BaseLig"; /*new*/ +static char *str_BaseMark = "BaseMark"; /*new*/ +static char *str_CursiveEntry = "CursEntry"; /*new*/ +static char *str_CursiveExit = "CursExit"; /*new*/ +static char *str_LigIndex = "Lig Index:"; /*new*/ +static char *str_LastAnchor = "Last Anchor Point"; /*new*/ +static char *str_RemoveLastAnchor = "You are deleting the last anchor point in this character.\nDoing so will cause this dialog to close, is that what you want?" /*new*/ +static char *str_ClassUsed = "ëÌÁÓÓ ÕÖÅ ÉÓÐÏÌØÚÕÅÔÓÑ"; +static char *str_AnchorClassUsed ="This anchor class already is associated with a point in this character"; /*new*/ +static char *str_BadClass = "Bad Class" /*new*/ +static char *str_AnchorClassCurs ="You may not change an anchor point to or from the 'curs' class"; /*new*/ +static char *str_XC = "X:"; +static char mnemonic_XC = 'X'; +static char *str_YC = "Y:"; +static char mnemonic_YC = 'Y'; +static char *str_IndexInUse = "éÎÄÅËÓ ÉÓÐÏÌØÚÕÅÔÓÑ"; +static char *str_LigIndexInUse = "This ligature index is already in use"; /*new*/ +static char *str_OutOfOrder = "Out Of Order"; /*new*/ +static char *str_IndexOutOfOrder = "Marks within a ligature should be ordered with the direction of writing.\nThis one and %d are out of order."; /*new*/ +static char *str_TooBig = "óÌÉÛËÏÍ ÂÏÌØÛÏÅ"; +static char *str_IndexTooBig = "This index is much larger than the closest neighbor" /*new*/ +static char *str_BadPOSSUB = "Bad GPOS/GSUB"; /*new*/ +static char *str_BadPOSSUBPaste = "The string must start with a 4 character type field, be followed by a space, and then contain the information"; /*new*/ +static char *str_ExpectedEquals = "Bad format for position data, expected four = characters with data"; /*new*/ +static char *str_SimpleSubsOneComponent = "A simple substitution must have exactly one component"; /*new*/ +static char *str_NewPosition = "New Position Variant"; /*new*/ +static char *str_NewSubstitution = "New Substitution Variant"; /*new*/ +static char *str_NewAlternate = "New Alternate List"; /*new*/ +static char *str_NewMultiple = "New Multiple List"; /*new*/ +static char *str_NewLigature = "New Ligature"; /*new*/ +static char *str_EditPosition = "Edit Position Variant"; /*new*/ +static char *str_EditSubstitution = "Edit Substitution Variant"; /*new*/ +static char *str_EditAlternate = "Edit Alternate List"; /*new*/ +static char *str_EditMultiple = "Edit Multiple List"; /*new*/ +static char *str_EditLigature = "Edit Ligature"; /*new*/ +static char *str_DuplicateTag = "Duplicate Tag"; /*new*/ +static unichar_t *str_Dx = { 0x2206, 'X', ':' }; +static unichar_t *str_Dy = { 0x2206, 'Y', ':' }; +static unichar_t *str_Dxa = { 0x2206, 'X','A','d','v','a','n','c','e', ':' }; /*new*/ +static unichar_t *str_Dya = { 0x2206, 'Y','A','d','v','a','n','c','e', ':' }; /*new*/ +static char *str_TooManyComponents = "óÌÉÛËÏÍ ÍÎÏÇÏ ËÏÍÐÏÎÅÎÔ"; +static char *str_SubsOnlyOne = "A simple substitution takes exactly one component, but you have provided several"; /*new*/ + /* Ligature feature tags */ +static char str_RequiredLig = "ôÒÅÂÕÅÍÙÅ ÌÉÇÁÔÕÒÙ"; +static char str_StandardLig = "óÔÁÎÄÁÒÔÎÙÅ ÌÉÇÁÔÕÒÙ"; +static char str_DiscretionaryLig = "Discretionary Ligatures"; /*new*/ +static char str_HistoricLig = "éÓÔÏÒÉÞÅÓËÉÅ ÌÉÇÁÔÕÒÙ"; +static char str_FractionLig = "Fraction Ligatures"; /*new*/ +static char str_AboveBaseSubs = "Above Base Substitutions"; /*new*/ +static char str_AltFrac = "Alternate Fractions"; /*new*/ +static char str_Akhand = "Akhand"; /*new*/ +static char str_BelowBaseForms = "Below Base Forms" /*new*/ +static char str_BelowBaseSubs = "Below Base Substitutions" /*new*/ +static char str_GlyphCompDecomp = "Glyph Composition/Decomposition" /*new*/ +static char str_HalfForm = "Half Forms" /*new*/ +static char str_HalantForm = "Halant Forms" /*new*/ +static char str_LeadingJamo = "Leading Jamo Forms" /*new*/ +static char str_TrailingJamo = "Trailing Jamo Forms" /*new*/ +static char str_VowelJamo = "Vowel Jamo Forms" /*new*/ +static char str_Nukta = "Nukta Forms" /*new*/ +static char str_PreBaseForms = "Pre Base Forms" /*new*/ +static char str_PreBaseSubs = "Pre Base Substitutions" /*new*/ +static char str_PostBaseForms = "Post Base Forms" /*new*/ +static char str_PostBaseSubs = "Post Base Substitutions" /*new*/ +static char str_Reph = "Reph Form" /*new*/ +static char str_VattuVariants = "Vattu Variants" /*new*/ + /* simple positioning feature tags */ +static char str_CaseSensForms = "Case-Sensitive Forms"; /*new*/ +static char str_CapitalSpacing = "Capital Spacing"; /*new*/ +static char str_AltHalfWidths = "Alternative Half Widths"; /*new*/ +static char str_LeftBounds = "ìÅ×ÙÅ ÇÒÁÎÉÃÙ"; /*new*/ +static char str_OpticalBounds = "ïÐÔÉÞÅÓËÉÅ ÇÒÁÎÉÃÙ"; +static char str_PropAltMet = "Proportional Alternate Metrics"; /*new*/ +static char str_QuartWidths = "Quarter Widths"; /*new*/ +static char str_RightBounds = "ðÒÁ×ÙÅ ÇÒÁÎÉÃÙ"; +static char str_ThirdWidths = "ôÒÅÔÉ ÛÉÒÉÎ"; +static char str_AltVertMet = "Alternate Vertical Metrics"; /*new*/ +static char str_AltVertHalfMet = "Alternate Vertical Half Metrics"; /*new*/ +static char str_AltVertPropMet = "Proportional Alternate Vertical Metrics"; /*new*/ + /* simple substitution feature tags */ +static char str_AllAlt = "Access All Alternates"; /*new*/ +static char str_AboveBaseForms = "Above Base Forms"; /*new*/ +static char str_Cap2PetiteCaps = "Capitals to Petite Capitals"; /*new*/ +static char str_Cap2SmallCaps = "Capitals to Small Capitals"; /*new*/ +static char str_Denominators = "Denominators"; /*new*/ +static char str_ExpertForms = "Expert Forms"; /*new*/ +static char str_TerminalForms = "Terminal Forms"; /*new*/ +static char str_FullWidths = "Full Widths"; /*new*/ +static char str_HistoricalForms = "Historical Forms"; /*new*/ +static char str_HorKanaAlt = "Horizontal Kana Alternatives"; /*new*/ +static char str_Hanja2Hangul = "Hanja to Hangul" /*new*/ +static char str_HalfWidths = "Half Widths"; /*new*/ +static char str_InitialForms = "Initial Forms"; /*new*/ +static char str_IsolatedForms = "Isolated Forms"; /*new*/ +static char str_Italics = "Italics"; /*new*/ +static char str_JIS78Forms = "JIS78 Forms"; /*new*/ +static char str_JIS83Forms = "JIS83 Forms"; /*new*/ +static char str_JIS90Forms = "JIS90 Forms"; /*new*/ +static char str_LiningFigures = "Lining Figures"; /*new*/ +static char str_LocalizedForms = "Localized Forms"; /*new*/ +static char str_MedialForms = "Medial Forms"; /*new*/ +static char str_MathematicalGreek = "Mathematical Greek"; /*new*/ +static char str_AltAnnotForms = "Alternate Annotation Forms"; /*new*/ +static char str_Numerators = "Numerators"; /*new*/ +static char str_OldstyleFigures = "Oldstyle Figures"; /*new*/ +static char str_Ornaments = "ïÒÎÁÍÅÎÔÙ"; +static char str_PetiteCaps = "Lowercase to Petite Capitals"; /*new*/ +static char str_PropWidth = "Proportional Width"; /*new*/ +static char str_R2LAlt = "Right to Left Alternates"; /*new*/ +static char str_RubyNoteForms = "Ruby Notational Forms"; /*new*/ +static char str_StylisticAlt = "Stylistic Alternatives"; /*new*/ +static char str_ScientificInf = "Scientific Inferiors"; /*new*/ +static char str_SmallCaps = "Lowercase to Small Capitals"; /*new*/ +static char str_SimplifiedForms = "õÐÒÏÝ£ÎÎÙÅ ÆÏÒÍÙ"; +static char str_StyleSet1 = "Style Set 1"; /*new*/ +static char str_StyleSet2 = "Style Set 2"; /*new*/ +static char str_StyleSet3 = "Style Set 3"; /*new*/ +static char str_StyleSet4 = "Style Set 4"; /*new*/ +static char str_StyleSet5 = "Style Set 5"; /*new*/ +static char str_Subscript = "Subscript"; /*new*/ +static char str_Superscript = "Superscript"; /*new*/ +static char str_Swash = "Swash"; /*new*/ +static char str_Titling = "Titling"; /*new*/ +static char str_TraditionalNameForms = "Traditional Name Forms"; /*new*/ +static char str_TabNumb = "Tabular Numbers"; /*new*/ +static char str_TraditionalForms = "Traditional Forms"; /*new*/ +static char str_Unicase = "Unicase"; /*new*/ +static char str_VerticalRot = "Vertical Alternates (obs)"; /*new*/ +static char str_VertRotAlt = "Vertical Rotation & Alternates" /*new*/ +static char str_VertKana = "Vertical Kana Alternates" /*new*/ +static char str_SlashedZero = "Slashed Zero" /*new*/ + /* (multiple) alternate substitution feature tags */ +static char str_FinalGlyphLine = "Final Glyph On Line" /*new*/ +static char str_JustificationAlt = "Justification Alternatives" /*new*/ +static char str_Randomize = "Randomize" /*new*/ + /* Script tags */ +static char str_arab = "áÒÁÂÓËÉÊ"; +static char str_armn = "áÒÍÑÎÓËÉÊ"; +static char str_beng = "âÅÎÇÁÌÉ"; +static char str_bopo = "Bopomofo"; /*new*/ +static char str_brai = "âÒÁÊÌØ"; +static char str_byzm = "Byzantine Music"; /*new*/ +static char str_cans = "Canadian Syllabics"; /*new*/ +static char str_cher = "Cherokee"; /*new*/ +static char str_hani = "CJK Ideographic"; /*new*/ +static char str_cyrl = "ëÉÒÉÌÌÉÃÁ"; +static char str_DFLT = "Default"; /*new*/ +static char str_deva = "äÅ×ÁÎÁÇÁÒÉ"; +static char str_ethi = "üÆÉÏÐÓËÉÊ"; +static char str_geor = "çÒÕÚÉÎÓËÉÊ"; +static char str_grek = "çÒÅÞÅÓËÉÊ"; +static char str_gujr = "Gujarati"; /*new*/ +static char str_guru = "Gurmukhi"; /*new*/ +static char str_jamo = "Hangul Jamo"; /*new*/ +static char str_hang = "Hangul"; /*new*/ +static char str_hebr = "é×ÒÉÔ"; +static char str_kana = "èÉÒÁÇÁÎÁ & ëÁÔÁËÁÎÁ"; +static char str_knda = "Kannada"; /*new*/ +static char str_khmr = "Khmer"; /*new*/ +static char str_lao = "Lao"; /*new*/ +static char str_latn = "ìÁÔÉÎÉÃÁ"; /*new*/ +static char str_mlym = "Malayalam"; /*new*/ +static char str_mong = "Mongolian"; /*new*/ +static char str_mymr = "Myanmar"; /*new*/ +static char str_ogam = "Ogham"; /*new*/ +static char str_orya = "Oriya"; /*new*/ +static char str_runr = "Runic"; /*new*/ +static char str_sinh = "Sinhala"; /*new*/ +static char str_syrc = "óÉÒÉÊÓËÉÊ"; +static char str_taml = "Tamil"; /*new*/ +static char str_telu = "Telugu"; /*new*/ +static char str_thaa = "Thaana"; /*new*/ +static char str_thai = "ôÁÊÓËÉÊ"; +static char str_tibt = "ôÉÂÅÔÓËÉÊ"; +static char str_yi = "Yi"; /*new*/ +static char str_ScriptC = "Script:"; /*new*/ +static char mnemonic_ScriptC = 'S'; +static char str_TagC = "Tag:"; /*new*/ +static char mnemonic_TagC = 'T'; /*new*/ +static char str_TagTooLong = "Tag too long"; /*new*/ +static char str_ScriptTagTooLong = "Script tags are limited to 4 ASCII characters"; /*new*/ +static char str_IgnoreBaseGlyphs = "Ignore Base Glyphs"; /*new*/ +static char str_IgnoreLigatures = "éÇÎÏÒÉÒÏ×ÁÔØ ÌÉÇÁÔÕÒÙ"; +static char str_IgnoreCombiningMarks = "Ignore Combining Marks"; /*new*/ + /* Import */ +static char str_Duppixelsize[] = "Duplicate pixelsize"; /*new*/ +/* "The font database already contains a bitmap\nfont with this pixelsize (%d)\nDo you want to overwrite it?" */ +static char str_Duppixelsizepre[] = "The font database already contains a bitmap\012font with this pixelsize ("; /*new*/ +static char str_Duppixelsizepost[] = ")\012Do you want to overwrite it?"; /*new*/ +static char str_NoBitmapFont = "No Bitmap Font"; /*new*/ +static char str_NoBitmapFontIn = "Could not find a bitmap font in %hs"; /*new*/ + /* Private Info */ +static char str_Bluequest[] = "This will change both BlueValues and OtherBlues.\012Do you want to continue?"; /*new*/ +static char str_Hstemquest[] = "This will change both StdHW and StemSnapH.\012Do you want to continue?"; /*new*/ +static char str_Vstemquest[] = "This will change both StdVW and StemSnapV.\012Do you want to continue?"; /*new*/ +static char str_Arrayquest[] = "Expected array\012Procede anyway?"; /*new*/ +static char str_Numberquest[] = "Expected number\012Procede anyway?"; /*new*/ +static char str_Boolquest[] = "Expected boolean\012Procede anyway?"; /*new*/ +static char str_Codequest[] = "Expected code\012Procede anyway?"; /*new*/ +static char str_Badtype[] = "Bad type"; /*new*/ +static char str_Delete[] = "õÄÁÌÉÔØ"; +static char mnemonic_Delete[] = 'D'; + /* Prefs */ +static char str_UTF_8[] = "UTF-8 (Unicode)"; +static char str_Default[] = "éÓÈÏÄÎÙÊ"; +static char *str_PrefsPopupAWS[] = "Changing the width of a character\nchanges the widths of all accented\ncharacters based on it."; /*new*/ +static char *str_PrefsPopupALS[] = "Changing the left side bearing\nof a character adjusts the lbearing\nof other references in all accented\ncharacters based on it.'"; /*new*/ +static char *str_PrefsPopupForNewFonts[] = "éÓÈÏÄÎÁÑ ËÏÄÉÒÏ×ËÁ ÄÌÑ ÎÏ×ÙÈ ÛÒÉÆÔÏ×"; +static char *str_PrefsPopupLoc[] = "Character set used by the local\nclipboard, filesystem, etc. (only\n8bit charsets currently supported\nhere)"; /*new*/ +static char *str_PrefsPopupAH[] = "á×ÔÏÉÎÓÔÒÕËÔÉÒÏ×ÁÎÉÅ ÐÅÒÅÄ ÒÁÓÔÒÉÒÏ×ÁÎÉÅÍ"; +static char *str_PrefsPopupFN[] = "Name used for foundry field in bdf\nfont generation"; /*new*/ +static char *str_PrefsPopupTFN[] = "Name used for Vendor ID field in\nttf (OS/2 table) font generation.\nMust be no more than 4 characters"; /*new*/ +static char *str_PrefsPopupXU[] = "If specified this should be a space seperated list of integers each\nless than 16777216 which uniquely identify your organization\nFontForge will generate a random number for the final componant."; /*new*/ +static char *str_PrefsPopupRulers[] = "Display rulers in the Outline Character View"; /*new*/ +static char *str_PrefsPopupSepHints[] = "Have seperate controls for display horizontal and vertical hints."; /*new*/ +static char *str_PrefsPopupIC[] = "In the Outline View, the Shift key constrains motion to be parallel to the ItalicAngle rather than the vertical."; /*new*/ +static char *str_PrefsPopupAO[] = "The percentage of an em by which an accent is offset from its base character in Build Accent"; /*new*/ +static char *str_PrefsPopupGA[] = "When placing grave and acute accents above letters, should\nFontForge center them based on their full width, or\nshould it just center based on the lowest point\nof the accent."; /*new*/ +static char *str_PrefsPopupAA[] = "The number of em-units by which an arrow key will move a selected point"; /*new*/ +static char *str_PrefsPopupGN[] = "Adobe has assigned the names Delta, Omega and mu\nto Increment, Ohm and micro signs respectively\nThis seems very odd to Greek font designers who use\nthe names to refer to letters of the alphabet.\nSetting this flags means that the alphabetic characters will\nbe named Delta.greek, Omega.greek and mu.greek."; +static char *str_PrefsPopupSD[] = "When the mouse pointer is within this many pixels\nof one of the various interesting features (baseline,\nwidth, grid splines, etc.) the pointer will snap\nto that feature."; /*new*/ +static char *str_PrefsPopupJS[] = "The Edit->Join command will join points which are this close together\nA value of 0 means they must be coincident" /*new*/ +static char *str_PrefsPopupBR[] = "When generating a set of BDF fonts ask the user\nto specify the screen resolution of the fonts\notherwise FontForge will guess depending on the pixel size."; /*new*/ +static char *str_PrefsPopupATA[] = "Extra arguments for configuring the autotrace program"; /*new*/ +static char *str_PrefsPopupATK[] = "Ask the user for autotrace arguments each time autotrace is invoked"; /*new*/ +static char *str_PrefsPopupMFA[] = "Commands to pass to mf (metafont) program, the filename will follow these"; /*new*/ +static char *str_PrefsPopupMFK[] = "Ask the user for mf commands each time mf is invoked"; /*new*/ +static char *str_PrefsPopupMFB[] = "FontForge loads large images into the background of each character\nprior to autotracing them. You may retain those\nimages to look at after mf processing is complete, or\nremove them to save space"; /*new*/ +static char *str_PrefsPopupMFE[] = "MetaFont (mf) generates lots of verbiage to stdout.\nMost of the time I find it an annoyance but it is\nimportant to see if something goes wrong."; /*new*/ +static char *str_PrefsPopupG2N[] = "When generating a truetype or opentype font it is occasionally\nuseful to know the mapping between truetype glyph ids and\ncharacter names. Setting this option will cause FontForge to\nproduce a file (with extension .g2n) containing those data."; /*new*/ +static char *str_PrefsPopupPCE[] = "When loading a truetype or opentype font which has both a unicode\nand a CJK encoding table, use this flag to specify which\nshould be loaded for the font." /*new*/ +static char *str_PrefsPopupXRF[] = "When FontForge starts up it loads display related resources from a\nproperty on the screen. Sometimes it is useful to be able to store\nthese resources in a file. These resources are only read at start\nup, so changing this has no effect until the next time you start\nFontForge."; /*new*/ +static char *str_PrefsPopupCMD[] = "When copying characters from the font view, also copy the\ncharacters' metadata (name, encoding, comment, etc)." /*new*/ +static char *str_Generic[] = "ïÂÝÅÅ"; +static char *str_PrefsFontInfo[] = "éÎÆ. Ï ÛÒÉÆÔÅ"; +static char *str_PrefsApps[] = "ðÒÏÇÒÁÍÍÙ"; +static char *str_Editing[] = "òÅÄÁËÔÉÒÏ×ÁÎÉÅ"; +static char *str_ScriptMenu[] = "íÅÎÀ ÓËÒÉÐÔÁ"; +static char *str_MenuName[] = "îÁÚ×ÁÎÉÅ ÍÅÎÀ"; +static char *str_ScriptMenuPopup[] = "÷Ù ÍÏÖÅÔÅ ÓÏÚÄÁÔØ ÍÅÎÀ ÓÏÄÅÒÖÁÝÅÅ ÄÏ 10 ÞÁÓÔÏ ÉÓÐÏÌØÚÕÅÍÙÈ ÓËÒÉÐÔÏ×\nëÁÖÄÁÑ ÚÁÐÉÓØ ÄÏÌÖÎÁ ÓÏÄÅÒÖÁÔØ ËÏÍÁÎÄÕ ÏÔÏÂÒÁÖÁÅÍÕÀ × ÍÅÎÀ\nÉ ÎÁÚ×ÁÎÉÅ ÆÁÊÌÁ ÓËÒÉÐÔÁ. ëÏÍÁÎÄÁ ÍÅÎÀ ÍÏÖÅ ÓÏÄÅÒÖÁÔØ ÌÀÂÙÅ ÓÉÍ×ÏÌÙ unicode.\nëÎÏÐËÁ \"...\" ÐÏÚ×ÏÌÑÅÔ ×ÙÂÒÁÔØ ÆÁÊÌ ÓËÒÉÐÔÁ."; +static char *str_ScriptFile[] = "æÁÊÌ ÓËÒÉÐÔÁ"; +static char *str_BrowseForFile[] = "..."; +static char *str_MenuNameWithNoScript[] = "Menu name with no associated script"; /*new*/ +static char *str_ScriptWithNoMenuName[] = "Script with no associated menu name"; /*new*/ +static char *str_PrefsAppNotice1 = "ïÂÙÞÎÏ FontForge ÉÝÅÔ ÐÒÉÌÏÖÅÎÉÑ ÐÒÏÓÍÁÔÒÉ×ÁÑ ÓÏÄÅÒÖÉÍÏÅ ËÁÔÁÌÏÇÏ× ÐÅÒÅÞÉÓÌÅÎÎÙÈ"; +static char *str_PrefsAppNotice2 = "× ÐÅÒÅÍÅÎÎÏÊ PATH."; +static char *str_PrefsAppNotice3 = "÷Ù ÍÏÖÅÔÅ ÕËÁÚÁÔØ ÐÏÌÎÙÊ ÐÕÔØ Ë ÐÒÉÌÏÖÅÎÉÑÍ ÉÓÐÏÌØÚÕÀÝÉÍÓÑ × FontForge."; +static char *str_PrefsAppNotice4 = "FontForge ÒÁÓÐÏÚÎÁ£Ô BROWSER, MF É AUTOTRACE."; +static char *str_PrefsAppNotice5 = ""; +static char *str_PrefsAppNotice6 = "" + /* Hints */ +static char *str_base = "îÁÞÁÌÏ:"; +static unichar_t mnemonic_base = 'B'; +static char *str_size = "òÁÚÍÅÒ:"; +static unichar_t mnemonic_size = 'S'; +static char *str_HStem = "HStem"; +static unichar_t mnemonic_HStem = 'H'; +static char *str_VStem = "VStem"; +static unichar_t mnemonic_VStem = 'V'; +static char *str_Create = "óÏÚÄÁÔØ"; +static unichar_t mnemonic_Create = 'e'; +static char *str_PrevArrow = "< ðÒÅÄ."; +static unichar_t mnemonic_PrevArrow = 'P'; +static char *str_NextArrow = "óÌÅÄ. >"; +static unichar_t mnemonic_NextArrow = 'N'; +static char *str_MovePoints = "ðÅÒÅÍÅÓÔÉÔØ ÔÏÞËÉ"; +static unichar_t mnemonic_MovePoints = 'M'; +static char *str_MovePointsPopup = "When the hint's position is changed\nadjust the postion of any points\nwhich lie on that hint"; /*new*/ +static char *str_CreateHint = "óÏÚÄÁÔØ ÉÎÓÔÒÕËÃÉÀ..."; +static char *str_CreateHorizontalHint = "óÏÚÄÁÔØ ÉÎÓÔÒÕËÃÉÀ ÄÌÑ ÇÏÒ.ÛÔÒÉÈÁ"; +static char *str_CreateVerticalHint = "óÏÚÄÁÔØ ÉÎÓÔÒÕËÃÉÀ ÄÌÑ ×ÅÒÔ.ÛÔÒÉÈÁ"; + /* expand stroke */ +static char *str_LineCap = "ëÏÎÅà ÌÉÎÉÉ"; +static char *str_Butt = "Butt"; /*new*/ +static unichar_t mnemonic_Butt = 'B'; +static char *str_Round = "ëÒÕÇÌÙÊ"; +static unichar_t mnemonic_Round = 'R'; +static char *str_Squareq = "ë×ÁÄÒÁÔÎÙÊ"; +static unichar_t mnemonic_Squareq = 'q'; +static char *str_LineJoin = "óÏÅÄÉÎÅÎÉÅ"; +static char *str_Miter = "õÇÌÏ×ÏÅ"; +static unichar_t mnemonic_Miter = 'M'; +static char *str_Roundu = "ëÒÕÇÌÏÅ"; +static unichar_t mnemonic_Roundu = 'u'; +static char *str_Bevel = "óËÏÛÅÎÎÏÅ"; +static unichar_t mnemonic_Bevel = 'v'; +static char *str_StrokeWidth = "ûÉÒÉÎÁ ÛÔÒÉÈÁ:"; +static unichar_t mnemonic_StrokeWidth = 'W'; +static char *str_Strok = "ûÔÒÉÈ"; +static unichar_t mnemonic_Strok = 'S'; +static char *str_Caligraphic = "ëÁÌÉÇÒÁÆÉÞÅÓËÉÊ"; +static unichar_t mnemonic_Caligraphic = 'C'; +static char *str_PenAngle = "Pen Angle:"; /*new*/ +static unichar_t mnemonic_PenAngle = 'A'; +static char *str_PenHeightRatio = "Height Ratio:"; /*new*/ +static unichar_t mnemonic_PenHeightRatio = 'H'; /*new*/ +static char *str_PenHeightRatioPopup = "A caligraphic pen's nib has two dimensions, the width\n(which may be set by Stroke Width below) and a thickness\nor height. I express the height as a ratio to the width."; /*new*/ +static char *str_BadStroke = "Bad Stroke"; /*new*/ +static char *str_StrokeWidthTooBig = "The stroke width is so big that the generated path\nmay intersect itself in %.100hs"; /*new*/ +static char *str_FreeHand = "Free Hand"; /*new*/ +static char *str_CenterLine = "îÅ ÒÁÓÛÉÒÑÔØ"; +static char *mnemonic_CenterLine = 'D'; /*new*/ +static char *str_CenterLinePopup = "The splines drawn with the freehand tool will not be expanded,\nonly the line itself will be generated."; /*new*/ +static char *str_Pressure = "îÁÖÉÍ:"; +static char *mnemonic_Pressure = 'P'; +static char *str_PressurePopup = "Press in this square with a wacom pressure sensitive tool\nto set the pressure end-point"; /*new*/ + /* Auto Width/Kern */ +static char *str_EnterTwoCharRange = "÷×ÅÄÉÔÅ Ä×Á ÄÉÁÐÁÚÏÎÁ ÓÉÍ×ÏÌÏ×"; +static char *str_ToBeAdjusted = "ÄÌÑ ÏÂÒÁÂÏÔËÉ."; +static char *str_CharsLeft = "óÉÍ×ÏÌÙ ÓÌÅ×Á"; +static char *str_CharsRight = "óÉÍ×ÏÌÙ ÓÐÒÁ×Á"; +static char *str_All = "÷ÓÅ"; +static char *str_stdCharRange = "A-Za-z0-9"; +static unichar_t *str_stdCharRangeGreek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '\0' }; +static unichar_t *str_stdCharRangeCyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '\0' }; +static char *str_StdCharRangeKernL = "A-Za-z"; +static char *str_StdCharRangeKernR = "a-z.,:;-"; +static char *str_StdCharRangeKernR2 = "A-Za-z.,:;-"; +static unichar_t *str_StdCharRangeKernRCyr = { 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_StdCharRangeKernR2Cyr = { 0x402, 0x404, '-', 0x406, 0x408, '-', 0x40b, 0x40f, '-', 0x418, 0x41a, '-', 0x42f, 0x430, '-', 0x438, 0x43a, '-', 0x44f, 0x452, 0x454, '-', 0x456, 0x458, '-', 0x45b, 0x45f, '.', ',', ':', ';', '-', '\0' }; +static unichar_t *str_stdCharRangeKernRGreek = { 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static unichar_t *str_stdCharRangeKernR2Greek = { 0x391, '-', 0x3a1, 0x3a3, '-', 0x3a9, 0x3b1, '-', 0x3c9, '.', ',', ':', ';', '-', '\0' ' }; +static char *str_Selected = "÷ÙÂÒÁÎÎÙÅ"; +static char *str_Spacing = "éÎÔÅÒ×ÁÌ"; +static char *str_TotalKerns = "÷ÓÅÇÏ ÐÁÒ:"; +static char *str_Threshold = "ðÒÅÄÅÌ:"; +static char *str_NoCharsSelected = "óÉÍ×ÏÌÙ ÎÅ ×ÙÂÒÁÎÙ."; +static char *str_KernPairFilePopup = "÷ÙÂÏÒ ÆÁÊÌÁ ÓÏÄÅÒÖÁÝÅÇÏ ÓÐÉÓÏË ËÅÒÎ.ÐÁÒ\nÐÏ Ä×Á ÓÉÍ×ÏÌÁ × ÓÔÒÏËÅ. FontForge ÂÕÄÅÔ ÐÒÏ×ÅÒÑÔØ\nÔÏÌØËÏ ÜÔÉ ÐÁÒÙ."; +static char *str_LoadKernPairs = "úÁÇÒÕÚÉÔØ ËÅÒÎ. ÐÁÒÙ"; +static char *str_NoKernPairs = "îÅÔ ÐÁÒ"; +static char *str_NoKernPairsFile = "÷ %.200hs ËÅÒÎ. ÐÁÒÙ ÎÅ ÎÁÊÄÅÎÙ"; + /* Auto Trace */ +static char *str_NothingToTrace = "îÅÞÅÇÏ ÔÒÁÓÓÉÒÏ×ÁÔØ"; +static char *str_NoAutotrace = "îÅ ÕÄÁÌÏÓØ ÎÁÊÔÉ autotrace"; +static char *str_NoAutotraceProg = "îÅ ÕÄÁÌÏÓØ ÎÁÊÔÉ ÐÒÏÇÒÁÍÍÕ autotrace (ÕÓÔÁÎÏ×ÉÔÅ ÐÅÒÅÍÅÎÎÕÀ ÏËÒÕÖÅÎÉÑ AUTOTRACE)"; +static char *str_AdditionalAutotraceArgs = "äÏÐÏÌÎÉÔÅÌØÎÙÅ ÁÒÇÕÍÅÎÔÙ ÄÌÑ ÐÒÏÇÒÁÍÍÙ autotrace:"; +static char *str_NoMF = "îÅ ÎÁÊÄÅÎ mf"; +static char *str_NoMFProg = "Can't find mf program -- metafont (set MF environment variable) or download from:\n http://www.tug.org/\n http://www.ctan.org/\nIt's part of the TeX distribution"; /*new*/ +static char *str_NoTempDir = "îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ×ÒÅÍÅÎÎÙÊ ËÁÔÁÌÏÇ"; +static char *str_CantRunMF = "îÅ ÕÄÁÌÏÓØ ÚÁÐÕÓÔÉÔØ mf"; +static char *str_MFHadError = "÷ÙÐÏÌÎÅÎÉÅ MetaFont ÚÁ×ÅÒÛÉÌÏÓØ Ó ÏÛÉÂËÏÊ"; +static char *str_MFBadOutput = "îÅ ÕÄÁÌÏÓØ ÐÒÏÞÅÓÔØ (ÉÌÉ ÎÁÊÔÉ) ÆÁÊÌ ×Ù×ÏÄÁ mf"; + /* Bitmap dlg */ +static char *str_AllChars = "÷ÓÅ ÓÉÍ×ÏÌÙ"; +static char *str_SelChars = "÷ÙÂÒÁÎÎÙÅ ÓÉÍ×ÏÌÙ"; +static char *str_CurChar = "ôÅËÕÝÉÊ ÓÉÍ×ÏÌ"; +static char *str_BadRegenSize = "Attempt to regenerate a pixel size that has not been created: "; /*new*/ +static char *str_PixelSizes = "Pixel Sizes:"; /*new*/ +static char *str_listPixelSizes = "The list of current pixel bitmap sizes"; /*new*/ +static char *str_RemovingSize = " õÄÁÌÅÎÉÅ ÒÁÚÍÅÒÁ ÕÄÁÌÑÅÔ ÒÁÓÔÒ."; +static char *str_AddingSize = " äÏÂÁ×ÌÅÎÉÅ ÒÁÚÍÅÒÁ ÓÏÚÄÁ£Ô ÒÁÓÔÒ."; +static char *str_AddingSizeScale = " Adding a size will create it by scaling."; /*new*/ +static char *str_SpecifyRegenSizes = "Specify bitmap sizes to be regenerated"; /*new*/ +static char *str_PointSizes75 = "òÁÚÍÅÒ × ÔÏÞËÁÈ ÎÁ ÜËÒÁÎÅ 75 dpi"; +static char *str_PointSizes100 = "òÁÚÍÅÒ × ÔÏÞËÁÈ ÎÁ ÜËÒÁÎÅ 100 dpi"; +static char *str_PointSizes96 = "òÁÚÍÅÒ × ÔÏÞËÁÈ ÎÁ ÜËÒÁÎÅ 96 dpi"; +static char *str_PointSizes120 = "òÁÚÍÅÒ × ÔÏÞËÁÈ ÎÁ ÜËÒÁÎÅ 120 dpi"; +static char *str_PointSizes72 = "òÁÚÍÅÒ × ÔÏÞËÁÈ ÎÁ ÜËÒÁÎÅ 72 dpi"; +static char *str_XSizes = "X"; +static char *str_WinSizes = "Win"; +static char *str_MacSizes = "Mac"; +static char *str_UseFreeType = "éÓÐÏÌØÚÏ×ÁÔØ FreeType"; +static char *str_ScalingBitmaps = "íÁÓÛÔÁÂÉÒÏ×ÁÔØ ÒÁÓÔÒÙ"; +static char *str_CantScaleGreymap = "Can't scale a greymap font"; /*new*/ +static char *str_CantDeleteAllBitmaps = "îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ×ÓÅ ÒÁÓÔÒÙ"; + /* Bitmap view */ +/* "%s at %d size %d from %s", charactername, encoding, pixelsize, fontname */ +static char *str_BvTitle = "%1$.80hs at %2$d size %3$d from %4$.80hs" /*new*/ +static char *str_RecalculateBitmaps = "ðÅÒÅÓÞÉÔÁÔØ ÒÁÓÔÒÙ"; + /* BV Edit */ +static char *str_skewRatio = "Enter the ratio of x-skew to y rise"; /*new*/ +static char str_BadNumber[] = "Bad Number"; /*new*/ + /* Char View */ +/* "%s at %d from %s", charactername, encoding, fontname */ +static char *str_CvTitle = "%1$.80hs at %2$d from %3$.90hs" /*new*/ +static char *str_CantFindGlyph = "îÅ×ÏÚÍÏÖÎÏ ÎÁÊÔÉ ÇÌÉÆ"; +static char *str_CantRevertGlyph = "The glyph, %.80hs, can't be found in the sfd file"; /*new*/ +static char *str_GlyphHasRefs = "ðÒÏÂÌÅÍÙ ÓÏ ÓÓÙÌËÁÍÉ"; +static char *str_GlyphHasRefsQuestion = "The character, %.40hs, contained references, but the font's encoding has changed. I will probably not be able to map those references to the correct locations. If I proceed some references may be lost and others may link to incorrect characters. Do you want to proceed anyway?" /*new*/ +static char *str_NameChanged = "éÚÍÅÎÅÎÏ ÎÁÚ×ÁÎÉÅ ÇÌÉÆÁ"; +static char *str_NameChangedGlyph = "The the name of character %.40hs has changed. This is what I use to find the glyph in the file, so I cannot revert this character.\n(You will not be warned for subsequent characters)" /*new*/ +static char *str_NotForeground = "Not Foreground" /*new*/ +static char *str_RefsOnlyFore = "References may be dragged only to the foreground layer" /*new*/ + /* CV Export */ +static char *str_PixelSizeQ = "Pixel size?"; /*new*/ +static char *str_PixelSize = "Pixel size:"; /*new*/ +static char *str_BitsPerPixel = "Bits/Pixel:"; /*new*/ +static char *str_InvalidBits = "The only valid values for bits/pixel are 1, 2, 4 or 8"; /*new*/ + /* CV Images */ +static char *str_CantFindFile = "îÅ ÕÄÁÌÏÓØ ÎÁÊÔÉ ÆÁÊÌ"; +static char *str_BadXFigFile = "îÅÐÒÁ×ÉÌØÎÙÊ ÆÁÊÌ xfig"; +static char *str_BadImageFile = "îÅÐÒÁ×ÉÌØÎÙÊ ÆÁÊÌ ÉÚÏÂÒÁÖÅÎÉÑ"; +static char *str_BadImageFileName = "îÅÐÒÁ×ÉÌØÎÙÊ ÆÁÊÌ ÉÚÏÂÒÁÖÅÎÉÑ: %.100hs"; +static char *str_BadImageFileNotBitmap = "Bad image file, not a bitmap: %.100hs"; /*new*/ +static char *str_NothingLoaded = "îÉÞÅÇÏ ÎÅ ÚÁÇÒÕÖÅÎÏ"; +static char *str_NothingSelected = "îÉÞÅÇÏ ÎÅ ×ÙÂÒÁÎÏ"; +static char *str_MoreImagesThanSelected = "âÏÌØÛÅ ÉÚÏÂÒÁÖÅÎÉÊ ÞÅÍ ×ÙÂÒÁÎÎÙÈ ÓÉÍ×ÏÌÏ×"; +static char *str_BadTemplate = "Bad Template"; /*new*/ +static char *str_BadTemplateNoExtension = "Bad template, no extension"; /*new*/ +static char *str_BadTemplateUnrecognized = "Bad template, unrecognized format"; /*new*/ +static char *str_UnicodeNotInFont = "Unicode value not in font"; /*new*/ +static char *str_UnicodeValueNotInFont = "Unicode value (%x) not in font, ignored"; /*new*/ +static char *str_EncodingNotInFont = "Encoding value not in font"; /*new*/ +static char *str_EncodingValueNotInFont = "Encoding value (%x) not in font, ignored"; /*new*/ +static char *str_Image = "éÚÏÂÒÁÖÅÎÉÅ"; +static char *str_TeXBitmap = "òÁÓÔÒ TeX"; +static char *str_MacBitmap = "Mac Bitmap"; /*new*/ +static char *str_Template = "Image Template"; /*new*/ +static char *str_EPSTemplate = "EPS Template"; /*new*/ +static char *str_AsBackground = "ëÁË ÆÏÎ"; +static char *str_OnlyOneFont = "ôÏÌØËÏ ÏÄÉÎ ÛÒÉÆÔ"; +static char *str_OnlyOneFontBackground = "ôÏÌØËÏ ÏÄÉÎ ÛÒÉÆÔ ÍÏÖÅÔ ÂÙÔØ ÉÍÐÏÒÔÉÒÏ×ÁÎ × ÆÏÎ"; + /* CV Palettes */ +static char *str_SizeOfPoints="Size of Points"; /*new*/ +static char *str_Regular="Regular"; /*new*/ +static char *str_Points="Points:"; +static char *str_RRRad="òÁÄÉÕÓ ÚÁËÒÕÇÌÅÎÉÊ"; +static char *str_Polygon="íÎÏÇÏÕÇÏÌØÎÉË"; +static char *str_Star="ú×ÅÚÄÁ"; +static char *str_NumPSVert="þÉÓÌÏ ÌÕÞÅÊ Ú×ÅÚÄÙ/ÇÒÁÎÅÊ ÍÎÏÇÏÕÇÏÌØÎÉËÁ"; +/* V is an abbreviation for "Visible", and E for Editable */ +static char *str_V="V"; +static char *str_E="E"; +static char *str_Layer="óÌÏÊ"; +static char *str_IsEdit="òÅÄÁËÔÉÒÕÅÍÙÊ?"; +static char *str_IsVis="÷ÉÄÉÍÙÊ?"; +/* For Foreground. Should be short */ +static char *str_Fore="ðÅÒÅÄ"; +static char *mnemonic_Fore='o'; +static char *str_Back="æÏÎ"; +static char *mnemonic_Back='B'; +static char *str_Grid="óÅÔËÁ"; +static char *mnemonic_Grid='G'; +static char *str_HHints="ç.ÉÎÓÔÒ."; +static char *str_VHints="÷.ÉÎÓÔÒ."; +static char *str_DHints="ä.ÉÎÓÔÒ."; +static char *str_HMetrics="ç.ÍÅÔÒÉËÉ"; +static char *str_VMetrics="÷.ÍÅÔÒÉËÉ"; +static char *str_Anchors="ñËÏÒÑ"; +static char *str_Blues="Blues"; /*new*/ +static char *str_Bitmap="òÁÓÔÒ"; +static char *str_ShapeType = "ôÉÐ ÆÏÒÍÙ"; +/* Popups */ +static char *str_Pointer = "õËÁÚÁÔÅÌØ"; +static char *str_PopMag = "õ×ÅÌÉÞÉÔØ (Ó Alt - õÍÅÎØÛÉÔØ)"; +static char *str_FreeCurve = "ó×ÏÂÏÄÎÏÅ ÒÉÓÏ×ÁÎÉÅ"; +static char *str_ScrollByHand = "ðÒÏËÒÕÞÉ×ÁÎÉÅ"; +static char *str_AddCurvePoint = "äÏÂÁ×ÉÔØ ÔÏÞËÕ ËÒÉ×ÏÊ"; +static char *str_AddCornerPoint = "äÏÂÁ×ÉÔØ ÕÇÌÏ×ÕÀ ÔÏÞËÕ"; +static char *str_AddTangentPoint = "äÏÂÁ×ÉÔØ ÔÏÞËÕ ËÁÓÁÔÅÌØÎÏÊ"; +static char *str_AddPenPoint = "äÏÂÁ×ÉÔØ ÔÏÞËÕ, Ó ËÏÎÔÒÏÌØÎÙÍÉ ÔÏÞËÁÍÉ"; +static char *str_popKnife = "òÁÚÒÅÚÁÔØ"; +static char *str_popRuler = "éÚÍÅÒÉÔØ ÒÁÓÓÔÏÑÎÉÅ, ÕÇÏÌ ÍÅÖÄÕ ÔÏÞËÁÍÉ"; +static char *str_popScale = "íÁÓÛÔÁÂÉÒÏ×ÁÔØ ×ÙÄÅÌÅÎÉÅ"; +static char *str_popFlip = "ïÔÒÁÚÉÔØ ×ÙÄÅÌÅÎÉÅ"; +static char *str_popRotate = "ðÏ×ÅÒÎÕÔØ ×ÙÄÅÌÅÎÉÅ"; +static char *str_popSkew = "îÁËÌÏÎÉÔØ ×ÙÄÅÌÅÎÉÅ"; +static char *str_popRectElipse = "ðÒÑÍÏÕÇÏÌØÎÉË ÉÌÉ ÜÌÌÉÐÓ"; +static char *str_popPolyStar = "íÎÏÇÏÕÇÏÌØÎ. ÉÌÉ Ú×ÅÚÄÁ"; +static char *str_popPencil = "îÁÒÉÓÏ×ÁÔØ/ïÞÉÓÔÉÔØ ÔÏÞËÉ"; +static char *str_popLine = "îÁÒÉÓÏ×ÁÔØ ÌÉÎÉÀ"; +static char *str_popShift = "óÄ×ÉÎÕÔØ ×ÅÓØ ÒÁÓÔÒ"; +static char *str_popHand = "ðÒÏËÒÕÔÉÔØ ÒÁÓÔÒ"; + /* Undoes */ +static char *str_BitmapPaste = "÷ÓÔÁ×ÉÔØ ÒÁÓÔÒ"; +static char *str_YesToAll = "äÁ ÄÌÑ ×ÓÅÈ"; +static char *mnemonic_YesToAll = 'A'; +static char *str_NoToAll = "îÅÔ ÄÌÑ ×ÓÅÈ"; +static char *mnemonic_NoToAll = 'o'; +/* "The clipboard contains a bitmap character of size %d,\na size which is not in your database.\nWould you like to create a bitmap font of that size,\nor ignore this character?" */ +static char *str_ClipContainsPre = "The clipboard contains a bitmap character of size "; /*new*/ +static char *str_ClipContainsPost = ",\na size which is not in your database.\nWould you like to create a bitmap font of that size,\nor ignore this character?"; /*new*/ +static char *str_Pasting = "÷ÓÔÁ×ËÁ..."; +static char *str_SelfRef = "óÉÍ×ÏÌ ÓÏ ÓÓÙÌËÏÊ ÎÁ ÓÅÂÑ"; +static char *str_AttemptSelfRef = "ðÏÐÙÔËÁ ÓÄÅÌÁÔØ ÓÉÍ×ÏÌ, ËÏÔÏÒÙÊ ÓÓÙÌÁÅÔÓÑ ÓÁÍ ÎÁ ÓÅÂÑ"; +static char *str_BadReference = "îÅÐÒÁ×ÉÌØÎÁÑ ÓÓÙÌËÁ"; +static char *str_FontNoRef = "You are attempting to paste a reference to %1$hs into %2$hs.\nBut %1$hs does not exist in this font.\nWould you like to copy the original splines (or delete the reference)?"; /*new*/ +static char *str_FontNoRefNoOrig = "You are attempting to paste a reference to %1$hs into %2$hs.\nBut %1$hs does not exist in this font, nor can I find the original character refered to.\nIt will not be copied."; /*new*/ +static char *str_DontWarnAgain = "îÅ ÐÒÅÄÕÐÒÅÖÄÁÔØ ÂÏÌØÛÅ"; +static char *mnemonic_DontWarnAgain = 'W'; +static char *str_NoVerticalMetrics = "îÅÔ ×ÅÒÔÉËÁÌØÎÙÈ ÍÅÔÒÉË"; +static char *str_FontNoVerticalMetrics = "This font does not have vertical metrics enabled"; /*new*/ +static char *str_DupAnchor = "óÏÚÄÁÔØ ËÏÐÉÀ ÑËÏÒÑ"; +static char *str_DupAnchorIn = "There is already an anchor point named %1$.40s in %2$.40hs." /*new*/ +static char *str_AnchorLost = "ñËÏÒØ ÐÏÔÅÒÑÎ"; +static char *str_AnchorLostPaste = "At least one anchor point was lost when pasting from one font to another because no matching anchor class could be found in the new font." /*new*/ + /* dump pfa */ +static char *str_CvtPS = "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ Postscript"; + /* encoding */ +static char *str_BadEncFormat = "Bad encoding file format"; /*new*/ +static char *str_PleaseNameEnc = "îÁÚÏ×ÉÔÅ ÜÔÕ ËÏÄÉÒÏ×ËÕ"; +/* Either insert first, second or third, or the number followed by the "th" string (5th, 6th, etc.) */ +/* Please name the %d/first/second/third encoding in this file" */ +static char *str_PleaseNameEncPre = "îÁÚÏ×ÉÔÅ "; +static char *str_PleaseNameEncPost = " ËÏÄÉÒÏ×ËÕ ÜÔÏÇÏ ÆÁÊÌÁ"; +static char *str_First = "ðÅÒ×ÙÊ"; +static char *str_Second = "÷ÔÏÒÏÊ"; +static char *str_Third = "ôÒÅÔÉÊ"; +static char *str_th = "ÙÊ"; +static char *str_RemoveEncoding = "õÄÁÌÉÔØ ËÏÄÉÒÏ×ËÕ"; +static char *str_LoadEncoding = "úÁÇÒÕÚÉÔØ ËÏÄÉÒÏ×ËÕ"; +static char *str_UseCidMap = "Use CID Map"; /*new*/ +static char *str_SearchForCIDMap = "This font is based on the charset %1$.20hs-%2$.20hs-%3$d, but the best I've been able to find is %1$.20hs-%2$.20hs-%4$d.\nShall I use that or let you search?"; /*new*/ +static char *str_UseIt = "Use It"; /*new*/ +static char mnemonic_UseIt = 'U'; +static char *str_Search = "ðÏÉÓË"; +static char mnemonic_Search = 'S'; +static char *str_GiveUp = "Give Up"; /*new*/ +static char mnemonic_GiveUp = 'G'; +static char *str_NoCidmap = "No cidmap file..."; /*new*/ +static char *str_LookForCidmap = "FontForge was unable to find a cidmap file for this font. It is not essential to have one, but some things will work better if you do. If you have not done so you might want to download the cidmaps from:\n http://FontForge.sourceforge.net/cidmaps.tgz\nand then gunzip and untar them and move them to:\n %.80hs\n\nWould you like to search your local disk for an appropriate file?"; /*new*/ +static char *str_AreYouSureCharset = "Are you sure you don't want to use the character set I found?"; /*new*/ +static char *str_FindCharset = "Find a charset file..."; /*new*/ +static char *str_Browse = "ðÒÏÓÍÏÔÒ..."; +static char mnemonic_Browse = 'B'; +static char *str_SelectCIDOrdering = "Please select a CID ordering"; /*new*/ +static char *str_ExtraCharsTitle = "Extraneous characters"; /*new*/ +static char *str_ExtraChars = "The current encoding contains characters which I cannot map to CIDs.\nShould I delete them or add them to the end (where they may conflict with future ros definitions)?"; /*new*/ +static char *str_FindCMap = "Find an adobe CMap file..."; /*new*/ +static char *str_NotACIDFont = "Not a CID-keyed font"; /*new*/ +static char *str_MultipleEncodingIgnored = "MultipleEncodingIgnored"; /*new*/ +static char *str_CIDGlyphMultEncoded = "The glyph at CID %d is mapped to more than %d encodings. Only the first %d are handled."; /*new*/ + + /* fv composit */ +static char *str_MissingChar = "Missing Character..."; /*new*/ +static char *str_Missingdotlessi="Your font is missing the dotlessi character,\nplease add it and remake your accented characters"; /*new*/ +static char *str_Missingdotlessj="Your font is missing the dotlessj character,\nplease add it and remake your accented characters"; /*new*/ + /* fv fonts */ +static char *str_MergingProb = "Merging Problem"; /*new*/ +static char *str_MergingFontSelf = "Merging a font with itself achieves nothing"; /*new*/ +static char *str_MergingCIDMismatch = "When merging two CID keyed fonts, they must have the same Registry and Ordering, and the font being merged into (the mergee) must have a supplement which is at least as recent as the other's. Furthermore the mergee must have at least as many subfonts as the merger." /*new*/ +static char *str_Other = "äÒÕÇÏÅ ..." +static char *str_FontToMergeInto = "Font to merge into %.20hs"; /*new*/ +static char *str_InterpolatingProb = "Interpolating Problem"; /*new*/ +static char *str_InterpolatingFontSelf = "Interpolating a font with itself achieves nothing"; /*new*/ +static char *str_Amount = "÷ÅÌÉÞÉÎÁ"; +static char *str_InterpBetween = "Interpolating between %.20hs and:"; /*new*/ +static char *str_by = "by"; /*new*/ + /* fv metrics */ +static char *str_SetWidthTo = "õÓÔÁÎÏ×ÉÔØ ÛÉÒÉÎÕ:"; +static char *str_SetLBearingTo = "õÓÔÁÎÏ×ÉÔØ ÌÅ×.ÇÒÁÎÉÃÕ:"; +static char *str_SetRBearingTo = "õÓÔÁÎÏ×ÉÔØ ÐÒÁ×.ÇÒÁÎÉÃÕ:"; +static char *str_SetVWidthTo = "Set Vert. Advance To:"; /*new*/ +static char *str_IncrWidthBy = "Increment Width By:"; /*new*/ +static char *str_IncrLBearingBy = "Increment LBearing By:"; /*new*/ +static char *str_IncrRBearingBy = "Increment RBearing By:"; /*new*/ +static char *str_IncrVWidthBy = "Increment V. Adv. By:"; /*new*/ +static char *str_ScaleWidthBy = "Scale Width By:"; /*new*/ +static char *str_ScaleLBearingBy = "Scale LBearing By:"; /*new*/ +static char *str_ScaleRBearingBy = "Scale RBearing By:"; /*new*/ +static char *str_ScaleVWidthBy = "Scale VAdvance By:"; /*new*/ +static char *str_Plain = "Plain"; /*new*/ + /* Import bdf */ +static char *str_PixelSizeFont = "What is the pixel size of the font in this file?"; /*new*/ +static char *str_CouldNotOpenFile = "îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ÆÁÊÌ" +static char *str_CouldNotOpenFileName = "îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ÆÁÊÌ %.200hs"; +static char *str_NotBdfFile = "îÅ bdf ÆÁÊÌ"; +static char *str_NotBdfFileName = "Not a bdf file %.200hs"; /*new*/ +static char *str_NotPkFile = "îÅ pk ÆÁÊÌ"; +static char *str_NotPkFileName = "Not a (metafont) pk file %.200hs"; /*new*/ +static char *str_NotGfFile = "Not a pk file"; +static char *str_NotGfFileName = "Not a (metafont) gf file %.200hs"; /*new*/ +static char *str_NotPcfFile = "îÅ pcf ÆÁÊÌ"; +static char *str_NotPcfFileName = "Not an X11 pcf file %.200hs"; /*new*/ +static char *str_LoadingFrom = "úÁÇÒÕÚËÁ ÛÒÉÆÔÁ ÉÚ %.100hs"; +static char *str_DuplicateName = "ðÏ×ÔÏÒÅÎÉÅ ÎÁÚ×ÁÎÉÑ"; +static char *str_DuplicateCharName = "Duplicate character name (%hs) in font"; /*new*/ + /* problems */ +static char *str_ProbOpenPath = "ä×Å ×ÙÄÅÌÅÎÎÙÅ ÔÏÞËÉ -- ËÏÎÃÙ ÏÔËÒÙÔÏÇÏ ËÏÎÔÕÒÁ"; +static char *str_ProbPointsTooClose = "÷ÙÄÅÌÅÎÎÙÅ ÔÏÞËÉ ÒÁÓÐÏÌÏÖÅÎÙ ÓÌÉÛËÏÍ ÂÌÉÚËÏ ÄÒÕÇ Ë ÄÒÕÇÕ"; +static char *str_ProbMissingExtreme = "õ ×ÙÄÅÌÅÎÎÏÊ ËÒÉ×ÏÊ ÎÅÔ ÔÏÞËÉ × ÜËÓÔÒÅÍÕÍÅ"; +static char *str_ProbXNear = "ëÏÏÒÄÉÎÁÔÁ X ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÂÌÉÚËÁ Ë ÕËÁÚÁÎÎÏÊ ×ÅÌÉÞÉÎÅ"; +static char *str_ProbYNear = "ëÏÏÒÄÉÎÁÔÁ õ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÂÌÉÚËÁ Ë ÕËÁÚÁÎÎÏÊ ×ÅÌÉÞÉÎÅ"; +static char *str_ProbYBase = "ëÏÏÒÄÉÎÁÔÁ õ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÂÌÉÚËÁ Ë ÂÁÚÏ×ÏÊ ÌÉÎÉÉ ÛÒÉÆÔÁ"; +static char *str_ProbYXHeight = "ëÏÏÒÄÉÎÁÔÁ õ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÂÌÉÚËÁ Ë xheight"; +static char *str_ProbYCapHeight = "ëÏÏÒÄÉÎÁÔÁ õ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÂÌÉÚËÁ Ë cap height"; +static char *str_ProbYAs = "ëÏÏÒÄÉÎÁÔÁ õ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÂÌÉÚËÁ Ë ascender height"; +static char *str_ProbYDs = "ëÏÏÒÄÉÎÁÔÁ õ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÂÌÉÚËÁ Ë descender height"; +static char *str_ProbLineHor = "÷ÙÄÅÌÅÎÎÙÊ ÏÔÒÅÚÏË ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌÅÎ"; +static char *str_ProbLineVert = "÷ÙÄÅÌÅÎÎÙÊ ÏÔÒÅÚÏË ÐÏÞÔÉ ×ÅÒÔÉËÁÌÅÎ"; +static char *str_ProbLineItal = "÷ÙÄÅÌÅÎÎÙÊ ÏÔÒÅÚÏË ÒÁÓÐÏÌÏÖÅÎ ÐÏÞÔÉ ÐÏÄ ÕÇÌÏÍ ÎÁËÌÏÎÁ ÛÒÉÆÔÁ"; +static char *str_ProbAboveHor = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÎÁÄ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÏÊ ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌØÎÁ"; +static char *str_ProbAboveVert = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÎÁÄ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÏÊ ÐÏÞÔÉ ×ÅÒÔÉËÁÌØÎÁ"; +static char *str_ProbAboveItal = "The control point above the selected point is near the italic angle"; /*new*/ +static char *str_ProbBelowHor = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÐÏÄ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÏÊ ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌØÎÁ"; +static char *str_ProbBelowVert = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÐÏÄ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÏÊ ÐÏÞÔÉ ×ÅÒÔÉËÁÌØÎÁ"; +static char *str_ProbBelowItal = "The control point below the selected point is near the italic angle"; /*new*/ +static char *str_ProbLeftHor = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÓÌÅ×Á ÏÔ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌØÎÁ"; +static char *str_ProbLeftVert = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÓÌÅ×Á ÏÔ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÐÏÞÔÉ ×ÅÒÔÉËÁÌØÎÁ"; +static char *str_ProbLeftItal = "The control point left of the selected point is near the italic angle"; /*new*/ +static char *str_ProbRightHor = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÓÐÒÁ×Á ÏÔ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌØÎÁ"; +static char *str_ProbRightVert = "ëÏÎÔÒÏÌØÎÁÑ ÔÏÞËÁ ÓÐÒÁ×Á ÏÔ ×ÙÄÅÌÅÎÎÏÊ ÔÏÞËÉ ÐÏÞÔÉ ×ÅÒÔÉËÁÌØÎÁ"; +static char *str_ProbRightItal = "The control point right of the selected point is near the italic angle"; /*new*/ +static char *str_ProbPtNearHHint = "The selected point is near a horizontal stem hint"; /*new*/ +static char *str_ProbPtNearVHint = "The selected point is near a vertical stem hint"; /*new*/ +static char *str_ProbHintHWidth = "This character contains a horizontal hint near the specified width"; /*new*/ +static char *str_ProbHintVWidth = "This character contains a vertical hint near the specified width"; /*new*/ +static char *str_ProbHintControl = "üÔÁ ÉÎÓÔÒÕËÃÉÑ ÎÅ ÕÐÒÁ×ÌÑÅÔ ÎÉ ÏÄÎÏÊ ÔÏÞËÏÊ"; +static char *str_ProbHint3Width = "This hint has the wrong width for a stem3 hint"; /*new*/ +static char *str_ProbHint3Spacing = "The counters between these hints are not the same size, bad for a stem3 hint"; /*new*/ +static char *str_ProbHint3Four = "This character has four hints, but if this one were omitted it would fit a stem3 hint"; /*new*/ +static char *str_NoProbHint3 = "This character can use a stem3 hint"; /*new*/ +static char *str_ProbExpectedCounter = "This path should have been drawn in a counter-clockwise direction"; /*new*/ +static char *str_ProbExpectedClockwise = "This path should have been drawn in a clockwise direction"; /*new*/ +static char *str_ProbFlippedRef = "This reference has been flipped, so the paths in it are drawn backwards"; /*new*/ +static char *str_ProbMissingBitmap = "This outline character is missing a bitmap version"; /*new*/ +static char *str_ProbMissingOutline = "This blank outline character has an unexpected bitmap version"; /*new*/ +static char *str_ProbBadWidth = "This character's advance width is different from the standard width"; /*new*/ +static char *str_ProbBadVWidth = "This character's vertical advance is different from the standard width"; /*new*/ +static char *str_ProbAboveOdd = "The control point above the selected point is outside the spline segment"; /*new*/ +static char *str_ProbBelowOdd = "The control point below the selected point is outside the spline segment"; /*new*/ +static char *str_ProbRightOdd = "The control point right of the selected point is outside the spline segment"; /*new*/ +static char *str_ProbLeftOdd = "The control point left of the selected point is outside the spline segment"; /*new*/ +static char *str_ProbCIDMult = "This character is defined in more than one of the CID subfonts"; /*new*/ +static char *str_ProbCIDBlank = "This character is not defined in any of the CID subfonts"; /*new*/ +static char *str_ProbExplain = "ïÂßÑÓÎÅÎÉÅ ÐÒÏÂÌÅÍÙ"; +static char *str_Fix = "éÓÐÒÁ×."; +static char *str_Stop = "óÔÏÐ"; +static char *mnemonic_Stop = 'S'; +static char *str_Next = "óÌÅÄ."; +static char *mnemonic_Next = 'N'; +static char *str_OpenPaths = "ïÔËÒÙÔÙÅ ËÏÎÔÕÒÙ"; +static char *mnemonic_OpenPaths = 'P'; +static char *str_OpenPathsPopup = "All paths should be closed loops, there should be no exposed endpoints"; /*new*/ +static char *str_Points2Close = "ôÏÞËÉ ÒÁÓÐÏÌÏÖÅÎÙ ÓÌÉÛËÏÍ ÂÌÉÚËÏ"; +static char *mnemonic_Points2Close = 't'; +static char *str_Points2ClosePopup = "If two adjacent points on the same path are less than a few\nemunits apart they will cause problems for some of FontForge's\ncommands. PostScript shouldn't care though."; /*new*/ +/*static char *str_MissingExtrema = "Missing Extrema"; +/*static char *mnemonic_MissingExtrema = 'E'; +/*static char *str_MissingExtremaPopup = "Ghostview (perhaps other interpreters) has a problem when a\nhint exists without any points that lie on it. Usually this is because\nthere are no points at the extrema";*/ +static char *str_XNear = "X ×ÏÚÌÅ"; +static char *mnemonic_XNear = 'X'; +static char *str_XNearPopup = "Allows you to check that vertical stems in several\ncharacters start at the same location."; /*new*/ +static char *str_YNear = "Y ×ÏÚÌÅ"; +static char *mnemonic_YNear = 'Y'; +static char *str_YNearPopup = "Allows you to check that horizontal stems in several\ncharacters start at the same location."; /*new*/ +static char *str_YNearStd = "Y near standard heights"; /*new*/ +static char *mnemonic_YNearStd = 'S'; +static char *str_YNearStdPopup = "Allows you to find points which are slightly\noff from the baseline, xheight,cap height,\nascender, descender heights."; /*new*/ +static char *str_LineStd = "ëÒÁÑ ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌØÎÙ/×ÅÒÔÉËÁÌØÎÙ"; +static char *str_LineStd2 = "Edges near horizontal/vertical/italic"; /*new*/ +static char *mnemonic_LineStd = 'E'; +static char *str_LineStdPopup = "Allows you to find lines which are almost,\nbut not quite horizontal or vertical\n(or at the italic angle)."; /*new*/ +static char *str_CpStd = "õÐÒÁ×ÌÑÀÝÉÅ ÔÏÞËÉ ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌØÎÙ/×ÅÒÔÉËÁÌØÎÙ"; +static char *str_CpStd2 = "õÐÒÁ×ÌÑÀÝÉÅ ÔÏÞËÉ ÐÏÞÔÉ ÇÏÒÉÚÏÎÔÁÌØÎÙ/×ÅÒÔÉËÁÌØÎÙ/ÐÏÄ ÕÇÌÏÍ ÎÁËÌÏÎÁ ÛÒÉÆÔÁ"; +static char *mnemonic_CpStd = 'C'; +static char *str_CpStdPopup = "Allows you to find control points which are almost,\nbut not quite horizontal or vertical\nfrom their base point\n(or at the italic angle)."; /*new*/ +static char *str_CpOdd = "Control Points beyond spline"; /*new*/ +static char *mnemonic_CpOdd = 'b'; +static char *str_CpOddPopup = "Allows you to find control points which when projected\nonto the line segment between the two end points lie\noutside of those end points"; /*new*/ +static char *str_HintNoPt = "Hints controlling no points"; /*new*/ +static char *mnemonic_HintNoPt = 'H'; +static char *str_HintNoPtPopup = "Ghostview (perhaps other interpreters) has a problem when a\nhint exists without any points that lie on it."; /*new*/ +static char *str_PtNearHint = "ôÏÞËÉ ×ÏÚÌÅ ËÒÁ£× ÉÎÓÔÒÕËÃÉÉ"; +static char *mnemonic_PtNearHint = 'P'; +static char *str_PtNearHintPopup = "Often if a point is slightly off from a hint\nit is because a stem is made up\nof several segments, and one of them\nhas the wrong width."; /*new*/ +static char *str_HintWidth = "Hint Width Near"; /*new*/ +static char *mnemonic_HintWidth = 'W'; +static char *str_HintWidthPopup = "Allows you to check that stems have consistant widths.."; /*new*/ +static char *str_Hint3 = "Almost stem3 hint"; /*new*/ +static char *mnemonic_Hint3 = '3'; +static char *str_Hint3Popup = "This checks if the character almost, but not exactly,\nconforms to the requirements for a stem3 hint.\nThat is, either vertically or horizontally, there must\nbe exactly three hints, and they must have the same\nwidth and they must be evenly spaced."; /*new*/ +static char *str_ShowExactHint3 = "Show Exact *stem3"; /*new*/ +static char *mnemonic_ShowExactHint3 = 'S'; +static char *str_ShowExactHint3Popup = "Shows when this character is exactly a stem3 hint"; /*new*/ +static char *str_CheckDirection = "Check outermost paths clockwise"; /*new*/ +static char *mnemonic_CheckDirection = 'o'; +static char *str_CheckDirectionPopup = "Postscript and TrueType require that paths be drawn\nin a clockwise direction. This lets you check that they\nare."; /*new*/ +static char *str_CheckFlippedRefs = "Check flipped references"; /*new*/ +static char *mnemonic_CheckFlippedRefs = 'r'; +static char *str_CheckFlippedRefsPopup = "Postscript and TrueType require that paths be drawn\nin a clockwise direction. If you have a reference\nthat has been flipped then the paths in that reference will\nprobably be counter-clockwise. You should unlink it and do\nCorect direction on it."; /*new*/ +static char *str_CheckBitmaps = "Check missing bitmaps"; /*new*/ +static char *mnemonic_CheckBitmaps = 'b'; +static char *str_CheckBitmapsPopup = "Are there any outline characters which don't have a bitmap version in one of the bitmap fonts?\nConversely are there any bitmap characters without a corresponding outline character?"; /*new*/ +static char *str_CIDMultiple = "Check for CIDs defined twice"; /*new*/ +static char *mnemonic_CIDMultiple = 'O'; +static char *str_CIDMultiplePopup = "Check whether a CID is defined in more than one sub-font"; /*new*/ +static char *str_CIDBlank = "Check for undefined CIDs"; /*new*/ +static char *mnemonic_CIDBlank = 'O'; +static char *str_CIDBlankPopup = "Check whether a CID is undefined in all sub-fonts"; /*new*/ +static char *str_PointsNear = "Points are \"Near\" if within"; /*new*/ +static char *mnemonic_PointsNear = 'N'; +static char *str_Near = "÷ÏÚÌÅ"; +static char *str_ExplainErr = "ïÓÔÁÎÏ×ËÁ É ÏÂßÑÓÎÅÎÉÅ ÄÌÑ ËÁÖÄÏÊ ÏÛÉÂËÉ"; +static char *mnemonic_ExplainErr = 'A'; +static char *str_IgnoreProblemFuture = "éÇÎÏÒÉÒÏ×ÁÔØ × ÄÁÌØÎÅÊÛÅÍ"; +/* "Found %g, expected %g" */ +static char *str_Found = "ïÂÎÁÒÕÖÅÎÏ "; +static char *str_Expected = ", ÏÖÉÄÁÌÏÓØ "; +static char *str_Paths = "ëÏÎÔÕÒÙ"; +static char *str_Random = "Random"; /*new*/ +static char *str_PointsNoC = "ôÏÞËÉ"; +static char *str_ClearAll = "ïÞÉÓÔÉÔØ ×ÓÅ"; +static char *str_SetAll = "õÓÔÁÎÏ×ÉÔØ ×ÓÅ"; +static char *str_AdvanceWidth = "Check Advance:"; /*new*/ +static char *str_AdvanceWidthPopup = "Check for characters whose advance width is not the displayed value."; /*new*/ +static char *str_AdvanceVWidth = "Check VAdvance:"; /*new*/ +static char *str_AdvanceVWidthPopup = "Check for characters whose vertical advance width is not the displayed value."; /*new*/ + + /* Meta font */ +static char *str_MetaFont = "íÅÔÁÛÒÉÆÔ..."; +static char mnemonic_MetaFont = 'M'; +static char *str_CounterTooSmallT = "Counter Too Small"; /*new*/ +static char *str_CounterTooSmall = "A counter was requested to be too small, it has been pegged at its minimum value"; /*new*/ +static char *str_Simple = "Simple"; /*new*/ +static char *str_Advanced = "Advanced"; /*new*/ +static char *str_Embolden = "õÔÏÌÝ£ÎÎÙÊ"; +static char *str_Condense = "óÖÁÔÙÊ"; +static char *str_Expand = "òÁÓÔÑÎÕÔÙÊ"; +static char *str_Stems = "Stems"; /*new*/ +static char *str_HCounters = "H Counters"; /*new*/ +static char *str_VCounters = "V Counters"; /*new*/ +static char *str_StemScale = "Scale Stems By:"; /*new*/ +static char *str_CounterScale = "Scale Counters By:"; /*new*/ +static char *str_XHeightFrom = "XHeight From:"; /*new*/ +static char *str_To = "To:"; /*new*/ +static char *str_MetamorphosingFont = "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÛÒÉÆÔÁ..."; + /* to ttf */ +static char *str_PickFont = "÷ÙÂÒÁÔØ ÛÒÉÆÔ, ÌÀÂÏÊ ÛÒÉÆÔ..."; +static char *str_MultipleFontsPick = "There are multiple fonts in this file, pick one"; /*new*/ +static char *str_AutoHintingFont = "á×ÔÏÉÎÓÔÒÕËÔÉÒÏ×ÁÎÉÅ ÛÒÉÆÔÁ..."; +static char *str_SavingOpenTypeFont = "óÏÈÒÁÎÅÎÉÅ ÛÒÉÆÔÁ OpenType"; +static char *str_LoadBitmapFonts = "Load bitmap fonts?"; /*new*/ +static char *str_LoadTTFBitmaps = "Do you want to load the bitmap fonts embedded in this true/open type file?\n(And if so, which)"; /*new*/ +static char *str_BadEncoding = "Bad Encoding"; /*new*/ +static char *str_ExtraneousSingleByte = "There is a single byte character (%d) using one of the slots needed for double byte characters"; /*new*/ +static char *str_OutOfEncoding = "There is a character (%d) which cannot be encoded"; /*new*/ +static char *str_NotNormallyEncoded = "There is a character (%d) which is not normally in the encoding"; /*new*/ + /* Spline Fill */ +static char *str_Rasterizing = "òÁÓÔÅÒÉÚÁÃÉÑ..."; +static char *str_GenBitmap = "óÏÚÄÁÎÉÅ ÒÁÓÔÒÏ×ÏÇÏ ÛÒÉÆÔÁ"; +static char *str_GenAntiAlias = "óÏÚÄÁÎÉÅ ÓÇÌÁÖÅÎÎÏÇÏ ÛÒÉÆÔÁ"; +/* "%d pixels" (for the size of the font being rasterized) */ +static char *str_Pixels = " pixels"; /*new*/ + /* print */ +static char *str_PrintingFont = "ðÅÞÁÔØ ÛÒÉÆÔÁ"; +static char *str_GeneratingPostscriptFont = "óÏÚÄÁÎÉÅ ÛÒÉÆÔÁ Postscript"; +static char *str_FailedGenPost = "îÅ ÕÄÁÌÏÓØ ÓÏÚÄÁÔØ ÛÒÉÆÔ postscript"; +static char *str_PageSetup = "îÁÓÔÒÏÊËÉ ÓÔÒÁÎÉÃÙ"; +static char *str_Setup = "õÓÔÁÎÏ×ÉÔØ"; +static char mnemonic_Setup = 'e'; +static char *str_Other2 = "äÒÕÇÏÅ"; +static char mnemonic_Other = 'o'; +static char *str_PrintOtherPopup = "Any other command with all its arguments.\nThe command must expect to deal with a postscript\nfile which it will find by reading its standard input."; /*new*/ +static char *str_ToFile = "÷ ÆÁÊÌ"; +static char mnemonic_ToFile = 'F'; +static char *str_PageSize = "òÁÚÍÅÒ ÓÔÒÁÎÉÃÙ:"; +static char mnemonic_PageSize = 'S'; +static char *str_Copies = "ëÏÐÉÉ:"; +static char mnemonic_Copies = 'C'; +static char *str_Printer = "ðÒÉÎÔÅÒ:"; +static char mnemonic_Printer = 'P'; +static char *str_PrintToFile = "ðÅÞÁÔÁÔØ × ÆÁÊÌ..."; +static char *str_Pointsize = "òÁÚÍÅÒ × ÐÕÎËÔÁÈ:"; +static char mnemonic_Pointsize = 'P'; +static char *str_FullFont = "ïÔÏÂÒÁÚÉÔØ ×ÅÓØ ÛÒÉÆÔ"; +static char mnemonic_FullFont = 'F'; +static char *str_FullFontPopup = "Displays all the glyphs in the font on a rectangular grid at the given point size"; /*new*/ +static char *str_FullPageChar = "óÉÍ×ÏÌ ×Ï ×ÓÀ ÓÔÒÁÎÉÃÕ"; +static char mnemonic_FullPageChar = 'C'; +static char *str_FullPageChars = "óÉÍ×ÏÌÙ ×Ï ×ÓÀ ÓÔÒÁÎÉÃÕ"; +static char mnemonic_FullPageChars = 'C'; +static char *str_FullPageCharPopup = "Displays all the selected characters, each on its own page, at an extremely large point size"; /*new*/ +static char *str_MultiSizeChar = "Multi Size Character"; /*new*/ +static char mnemonic_MultiSizeChar = 'M'; +static char *str_MultiSizeChars = "Multi Size Characters"; /*new*/ +static char mnemonic_MultiSizeChars = 'M'; +static char *str_MultiSizeCharPopup = "Displays all the selected characters, at several different point sizes"; /*new*/ +static char *str_SampleTextPopup = "Prints the text below at the specified point size(s)"; /*new*/ +static char mnemonic_SampleText = 'S'; +static char *str_SampleTextC = "ïÂÒÁÚÅà ÔÅËÓÔÁ:"; +static char mnemonic_SampleTextC = 'T'; +static char *str_FailedOpenTemp = "îÅ ÕÄÁÌÏÓØ ÏÔËÒÙÔØ ×ÒÅÍÅÎÎÙÊ ÆÁÊÌ"; +static char *str_NoCommandSpecified = "îÅ ÕËÁÚÁÎÁ ËÏÍÁÎÄÁ"; +static char *str_InvalidPointsize = "Invalid point size"; /*new*/ + /* alignment */ +static char *str_CoordinateAlongWhich = "Coordinate along which to space"; /*new*/ +static char *str_X = "X"; +static char mnemonic_X = 'X'; +static char *str_Y = "Y"; +static char mnemonic_Y = 'Y'; +static char *str_MaximumDistanceBetweenPts = "Maximum distance between points in a region"; /*new*/ +static char mnemonic_MaximumDistanceBetweenPts = 'M'; +static char *str_NotEnoughLines = "Not enough lines"; /*new*/ +static char *str_CantParallel = "Can't Parallel"; /*new*/ +static char *str_ShareCommonEndpoint = "These two lines share a common endpoint, I can't make them parallel"; /*new*/ + /* parsettf */ +static char *str_ReadingNames = "þÔÅÎÉÅ ÎÁÚ×ÁÎÉÊ"; +static char *str_FixingupReferences = "Fixing up References"; /*new*/ +static char *str_NoBitmaps = "No Bitmap Strikes"; /*new*/ +static char *str_NoBitmapsInTTF = "No (useable) bitmap strikes in this TTF font: %hs"; /*new*/ +static char *str_NotInCollection = "Not in Collection"; /*new*/ +static char *str_FontNotInCollection = "%hs is not in %.100hs"; /*new*/ +static char *str_UntitledAnchor_n = "âÅÚÙÍÑÎÎÏÅ-%d"; + /* sfd */ +static char *str_Saving = "óÏÈÒÁÎÅÎÉÅ..."; +static char *str_SavingDb = "óÏÈÒÁÎÅÎÉÅ SFD (Spline Font Database)"; +static char *str_SavingOutlines = "óÏÈÒÁÎÅÎÉÅ ËÏÎÔÕÒÏ×"; +static char *str_SavingBitmaps = "óÏÈÒÁÎÅÎÉÅ ÒÁÓÔÒÏ×"; +static char *str_RecoveryFailed = "óÂÏÊ ÐÒÉ ×ÏÓÓÔÁÎÏ×ÌÅÎÉÉ"; +static char *str_RecoveryOfFailed = "îÅ ÕÄÁÌÏÓØ Á×ÔÏÍÁÇÉÞÅÓËÏÅ ×ÏÓÓÔÁÎÏ×ÌÅÎÉÅ ÉÚÍÅÎÅÎÉÊ × %.80hs.\nðÙÔÁÔØÓÑ ×ÏÓÓÔÁÎÏ×ÉÔØ ÐÒÉ ÓÌÅÄÕÀÝÅÍ ÚÁÐÕÓËÅ?"; +static char *str_TryAgain = "ðÏÐÒÏÂÏ×ÁÔØ ÅÝ£"; +static char *str_ForgetIt = "úÁÂÙÔØ Ï ÜÔÏÍ"; + /* start.c */ +static char *str_FontForge = "FontForge"; + /* cvpointer.c */ +static char *str_NegativeWidth = "ïÔÒÉÃÁÔÅÌØÎÁÑ ÛÉÒÉÎÁ"; +static char *str_NegativeWidthCheck = "Negative character widths are not allowed in TrueType\nDo you really want a negative width?"; /*new*/ + /* hanyang.c */ +static char *str_Hangul = "Hangul"; /*new*/ +static char mnemonic_Hangul = 'H'; +static char *str_NewComposition = "New Composition..."; /*new*/ +static char mnemonic_NewComposition = 'N'; +static char *str_ModifyComposition = "Modify Composition..."; /*new*/ +static char mnemonic_ModifyComposition = 'M'; +static char *str_BuildSyllables = "Build Syllables"; /*new*/ +static char mnemonic_BuildSyllables = 'B'; +static char *str_ChoSung = "Cho-Sung"; +static char *str_JungSung = "Jung-Sung"; +static char *str_JongSung = "Jong-Sung"; +static char *str_ChoSungC = "Cho-Sung:"; +static char *str_JungSungC = "Jung-Sung:"; +static char *str_JongSungC = "Jong-Sung:"; +static char *str_Mapping = "Mapping..."; +static char mnemonic_Mapping = 'M'; +static char *str_Width = "ûÉÒÉÎÁ..."; +static char mnemonic_Width = 'W'; +static char *str_WidthDDD = "ûÉÒÉÎÁ..."; +static char mnemonic_WidthDDD = 'W'; +static char *str_Reset = "óÂÒÏÓÉÔØ"; +static char *str_LoadFrom = "úÁÇÒÕÚÉÔØ ÉÚ..."; +static char mnemonic_LoadFrom = 'L'; +static char *str_BadWidth = "Bad Number for Width"; /*new*/ +static char *str_BadGroup = "Bad Number for Group"; /*new*/ +static char *str_JamoHoleTitle = "Unused glyph variant"; /*new*/ +static char *str_JamoHole = "For group %d of %s, glyph variant %d is not used but %d is used.\nProcede anyway?"; /*new*/ +static char *str_NoRules = "No Rules"; /*new*/ +static char *str_FileHasNoRules = "%.100hs contains no composition rules"; /*new*/ +static char *str_DeleteNo = "õÄÁÌÉÔØ"; /* With no mnemonic */ + /* Need a different mnemonic */ +static char *str_AddAll = "äÏÂÁ×ÉÔØ ×ÓÅ"; +static char mnemonic_AddAll = 'd'; +static char *str_DisplayCompositions = "Display Compositions..."; /*new*/ +static char mnemonic_DisplayCompositions = 'D'; +static char *str_NoGroups = "This varient of this jamo is not actually used"; /*new*/ +static char *str_UniVarient = "Unicode %04X, Varient %d, %s"; /*new*/ +static char *str_BuildingKoreanFont = "óÏÚÄÁÎÉÅ ËÏÒÅÊÓËÏÇÏ ÛÒÉÆÔÁ"; + /* Transform */ +static char *str_CharacterOrigin = "îÁÞ.ËÏÏÒÄÉÎÁÔ ÓÉÍ×ÏÌÁ"; +static char *str_CenterOfSelection = "ãÅÎÔÒ ×ÙÄÅÌÅÎÉÑ"; +static char *str_LastPress = "ðÏÓÌÅÄÎÅÅ ÎÁÖÁÔÉÅ"; +static char *str_DoNothing = "îÉÞÅÇÏ ÎÅ ÄÅÌÁÔØ"; +static char *str_MoveDDD = "ðÅÒÅÍÅÓÔÉÔØ..."; +static char *str_RotateDDD = "ðÏ×ÅÒÎÕÔØ..."; +static char *str_ScaleDDD = "íÁÓÛÔÁÂÉÒÏ×ÁÔØ..."; +static char *str_ScaleUniformlyDDD = "ðÒÏÐÏÒÃ. ÍÁÓÛÔÁÂÉÒÏ×ÁÎÉÅ..."; +static char *str_FlipDDD = "ïÔÒÁÚÉÔØ..."; +static char *str_SkewDDD = "îÁËÌÏÎÉÔØ..."; +static char *str_TransformBackground = "ðÒÅÏÂÒÁÚÏ×Ù×ÁÔØ ÆÏÎ ÔÏÖÅ"; +static char mnemonic_TransformBackground = 'B'; +static char *str_Warning = "÷ÎÉÍÁÎÉÅ"; +static char *str_RotateSkewWarning = "ðÏÓÌÅ ÐÏ×ÏÒÏÔÁ ÉÌÉ ÎÁËÌÏÎÁ ÓÉÍ×ÏÌÁ ×ÏÚÍÏÖÎÏ ÎÁÄÏ ÉÓÐÏÌØÚÏ×ÁÔØ \"üÌÅÍÅÎÔ->äÏÂÁ×ÉÔØ ÜËÓÔÒÅÍÕÍ\""; + /* scripting */ +static char *str_Call = "úÁÐÕÓÔÉÔØ..."; +static char mnemonic_Call = 'a'; +static char *str_CallScript = "úÁÐÕÓÔÉÔØ ÓËÒÉÐÔ"; + /* start (about box) */ +static char *str_FreePress = "A free press discriminates\nagainst the illiterate."; /*new*/ +static char *str_GaudiamusLigature = "Gaudiamus Ligature!"; /*new*/ +static char *str_InTheBeginning = "÷ ÎÁÞÁÌÅ ÂÙÌÏ óÌÏ×Ï..."; + /* search */ +static char *str_SearchPattern = "ûÁÂÌÏÎ ÐÏÉÓËÁ:"; +static char *str_ReplacePattern = "ûÁÂÌÏÎ ÚÁÍÅÎÙ:"; +static char *str_Allow = "òÁÚÒÅÛÉÔØ:"; +static char *str_Flipping = "ïÔÒÁÖÅÎÉÑ"; +static char *str_Scaling = "íÁÓÛÔÁÂÉÒ."; +static char *str_Rotating = "÷ÒÁÝÅÎÉÅ"; +static char *str_AllowTransPopup = "Allow a match even if the search pattern has\nto be transformed by a combination of the\nfollowing transformations."; /*new*/ +static char *str_SearchSelected = "ðÏÉÓË ×ÙÄÅÌÅÎÎÙÈ ÓÉÍ×ÏÌÏ×"; +static char *str_SearchSelectedPopup = "Only search selected characters in the fontview\nNormally we search all characters in the font."; /*new*/ +static char *str_Find = "îÁÊÔÉ"; +static char *str_FindIn = "îÁÊÔÉ × %.100hs"; +static char *str_FindNext = "îÁÊÔÉ ÓÌÅÄ."; +static char *str_FindAll = "îÁÊÔÉ ×ÓÅ"; +static char *str_ReplaceFind = "ðÏÉÓË/úÁÍÅÎÁ"; +static char *str_ReplaceAll = "úÁÍÅÎÉÔØ ×ÓÅ"; +static char *str_BadRefInSearchRpl = "The %1$s contains a reference to %2$.20hs which does not exist in the new font.\nShould I remove the reference?"; /*new*/ +static char *str_NotFound = "îÅ ÎÁÊÄÅÎÏ"; +static char *str_PatternNotFound = "The search pattern was not found in the font %.100hs"; /*new*/ +static char *str_PatternNotFoundAgain = "The search pattern was not found again in the font %.100hs"; /*new*/ +static char *str_FindReplace = "ðÏÉÓË / úÁÍÅÎÁ"; +static char *mnemonic_FindReplace = "i"; + /* combinations */ +static char *str_SelectLigature = "÷ÙÂÒÁÔØ ÌÉÇÁÔÕÒÕ ÄÌÑ ÐÒÏÓÍÏÔÒÁ"; +static char *str_SortBy = "óÏÒÔÉÒÏ×ÁÔØ ÐÏ:"; +static char *str_FirstChar = "ìÅ×ÙÊ ÓÉÍ×ÏÌ"; +static char *str_SecondChar = "ðÒÁ×ÙÊ ÓÉÍ×ÏÌ"; +static char *str_KernSize = "òÁÚÍÅÒ ËÅÒÎÁ"; + /* tilepath */ +static char *str_Center_ = "ðÏ ÃÅÎÔÒÕ"; +static char mnemonic_Center_ = 'e'; +static char *str_CenterPopup = "The tile (in the clipboard) should be centered on the path"; /*new*/ +static char *str_Left = "óÌÅ×Á"; +static char mnemonic_Left = 'L'; +static char *str_LeftPopup = "The tile (in the clipboard) should be placed to the left of the path\nas the path is traced from its start point to its end"; /*new*/ +static char *str_Right = "óÐÒÁ×Á"; +static char mnemonic_Right = 'R'; +static char *str_RightPopup = "The tile (in the clipboard) should be placed to the right of the path\nas the path is traced from its start point to its end"; /*new*/ +static char *str_Tile = "Tile"; /*new*/ +static char mnemonic_Tile = 'T'; +static char *str_TilePopup = "Multiple copies of the selection should be tiled onto the path"; /*new*/ +static char *str_Scale = "Scale"; /*new*/ +static char mnemonic_Scale = 'S'; +static char *str_ScalePopup = "The selection should be scaled so that it will cover the path's length"; /*new*/ +static char *str_TileScale = "Scale & Tile"; /*new*/ +static char mnemonic_TileScale = 'a'; +static char *str_TileScalePopup = "An integral number of the selection will be used to cover the path\nAnd if the path length is not evenly divisible by the selection's\nheight then the selection should be scaled slightly."; /*new*/ + /* Display fonts */ +static char *str_AA = "AA"; +static char mnemonic_AA = 'A'; +static char *str_AAPopup = "AntiAlias (greymap) characters, or bitmap characters"; /*new*/ +static char *str_PixelSizePopup = "Specifies the pixel size of the characters on display"; /*new*/ +static char *str_FormatPopup = "Specifies file format used to pass the font to freetype\n pfb -- is the standard postscript type1\n ttf -- is truetype\n httf-- is hinted truetype\n otf -- is opentype\n bitmap -- not passed to freetype for rendering\n bitmap fonts must already be generated\n FontForge -- uses FontForge's own rasterizer, not\n freetype's. Only as last resort"; /*new*/ +static char *str_BadSize = "Bad Size"; /*new*/ +static char *str_RequestedSizeNotAvail = "Requested bitmap size not available in font. Font supports %hs"; /*new*/ +static char *str_BadFont = "Bad Font"; /*new*/ + /* Mac specific */ +static char *str_LeaveX = "Leave X"; /*new*/ +static char *str_LeaveXLong = "A browser is probably running in the native Mac windowing system. You must leave the X environment to view it. Try Cmd-Opt-A"; /*new*/ +static char *str_NoATM = "The generated font won't work with ATM"; /*new*/ +static char *str_BadEncodingForATM = "ATM requires that fonts be encoded with the Macintosh Latin encoding. This postscript font will print fine, but only the bitmap versions will be displayed on the screen"; /*new*/ + /* Simplifydlg */ +static char *str_RemoveExtrema = "òÁÚÒÅÛÉÔØ ÕÄÁÌÅÎÉÅ ÜËÓÔÒÅÍÕÍÏ×"; +static char mnemonic_RemoveExtrema = 'r'; +static char *str_RemoveExtremaPopup = "Normally simplify will not remove points at the extrema of curves\n(both PostScript and TrueType suggest you retain these points)"; /*new*/ +static char *str_ChangeSlopes = "Allow slopes to change"; /*new*/ +static char mnemonic_ChangeSlopes = 's'; +static char *str_ChangeSlopesPopup = "Normally simplify will not change the slope of the contour at the points."; /*new*/ +static char *str_ErrorLimit = "ðÒÅÄÅÌØÎÁÑ ÏÛÉÂËÁ:"; +static char mnemonic_ErrorLimit = 'E'; +static char *str_EmUnits = "em-units"; /*new*/ + + +static int num_buttonsize = 70; +static int num_ScaleFactor = 140; diff --git a/fontforge/nonlineartrans.c b/fontforge/nonlineartrans.c new file mode 100644 index 00000000..fcd69a3d --- /dev/null +++ b/fontforge/nonlineartrans.c @@ -0,0 +1,847 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +#ifdef FONTFORGE_CONFIG_NONLINEAR +enum operator { + op_base = 0x100, /* Bigger than any character */ + + op_x, op_y, /* Returns current x & y values, no operands */ + op_value, /* Returns a constant value */ + op_negate, op_not, /* Unary operators: op1 */ + op_log, op_exp, op_sqrt, op_sin, op_cos, op_tan, op_abs, op_rint, op_floor, op_ceil, + op_pow, /* Binary operators: op1, op2 */ + op_times, op_div, op_mod, + op_add, op_sub, + op_eq, op_ne, op_le, op_lt, op_gt, op_ge, + op_and, op_or, + op_if /* Trinary operator: op1 ? op2 : op3 */ +}; + +struct expr { + enum operator operator; + struct expr *op1, *op2, *op3; + real value; +}; + +struct context { + char *start, *cur; + unsigned int had_error: 1; + enum operator backed_token; + real backed_val; + + real x, y; + struct expr *x_expr, *y_expr; + SplineChar *sc; +}; + +static struct builtins { char *name; enum operator op; } builtins[] = { + { "x", op_x }, + { "y", op_y }, + { "log", op_log }, + { "exp", op_exp }, + { "sqrt", op_sqrt }, + { "sin", op_sin }, + { "cos", op_cos }, + { "tan", op_tan }, + { "abs", op_abs }, + { "rint", op_rint }, + { "floor", op_floor }, + { "ceil", op_ceil }, + { NULL } +}; + +static void exprfree(struct expr *e) { + if ( e==NULL ) +return; + exprfree(e->op1); + exprfree(e->op2); + exprfree(e->op3); + chunkfree(e,sizeof(*e)); +} + +static int gettoken(struct context *c, real *val) { + int ch, i; + char *end, *pt; + char buffer[40]; + + if ( c->backed_token!=op_base ) { + ch = c->backed_token; + if ( ch==op_value ) + *val = c->backed_val; + c->backed_token = op_base; +return( ch ); + } + + while (( ch = *(c->cur++))==' ' ); + + if ( isdigit(ch) || ch=='.' ) { + --(c->cur); + *val = strtod(c->cur,&end); + c->cur = end; +return( op_value ); + } else if ( isalpha(ch)) { + pt = buffer; *pt++=ch; + while ( isalpha(c->cur[0])) { + if ( ptcur[0]; + ++c->cur; + } + *pt = '\0'; + for ( i=0; builtins[i].name!=NULL; ++i ) { + if ( strcmp(buffer,builtins[i].name)==0 ) +return( builtins[i].op ); + } + GWidgetErrorR(_STR_BadToken, _STR_BadNameToken, buffer, c->cur ); + c->had_error = true; + while (( ch = *(c->cur++))==' ' ); + if ( ch=='(' ) +return( op_abs ); + *val = 0; +return( op_value ); + } else switch ( ch ) { + case '\0': + --(c->cur); +return( 0 ); + case '!': + if ( *c->cur=='=' ) { + ++c->cur; +return( op_ne ); + } +return( op_not ); + case '-': +return( op_sub ); + case '+': +return( op_add ); + case '*': +return( op_times ); + case '/': +return( op_div ); + case '%': +return( op_mod ); + case '^': +return( op_pow ); + case '>': + if ( *c->cur=='=' ) { + ++c->cur; +return( op_ge ); + } +return( op_gt ); + case '<': + if ( *c->cur=='=' ) { + ++c->cur; +return( op_le ); + } +return( op_lt ); + case '=': + if ( *c->cur=='=' ) { + ++c->cur; +return( op_eq ); + } + GWidgetErrorR(_STR_BadToken, _STR_BadTokenExpected, "==", "=" , c->cur ); + c->had_error = true; +return( op_eq ); + case '|': + if ( *c->cur=='|' ) { + ++c->cur; +return( op_or ); + } + GWidgetErrorR(_STR_BadToken, _STR_BadTokenExpected, "||", "|" , c->cur ); + c->had_error = true; +return( op_or ); + case '&': + if ( *c->cur=='&' ) { + ++c->cur; +return( op_and ); + } + GWidgetErrorR(_STR_BadToken, _STR_BadTokenExpected, "&&", "&" , c->cur ); + c->had_error = true; +return( op_and ); + case '?': +return( op_if ); + case '(': case ')': case ':': +return( ch ); + default: + GWidgetErrorR(_STR_BadToken, _STR_BadTokenChar, ch , c->cur ); + c->had_error = true; + *val = 0; +return( op_value ); + } +} + +static void backup(struct context *c,enum operator op, real val ) { + if ( c->backed_token!=op_base ) { + GDrawIError( "Attempt to back up twice.\nnear ...%s\n", c->cur ); + c->had_error = true; + } + c->backed_token = op; + if ( op==op_value ) + c->backed_val = val; +} + +static struct expr *getexpr(struct context *c); + +static struct expr *gete0(struct context *c) { + real val = 0; + enum operator op = gettoken(c,&val); + struct expr *ret; + + switch ( op ) { + case op_value: case op_x: case op_y: + ret = gcalloc(1,sizeof(struct expr)); + ret->operator = op; + ret->value = val; +return( ret ); + case '(': + ret = getexpr(c); + op = gettoken(c,&val); + if ( op!=')' ) { + GWidgetErrorR(_STR_BadToken, _STR_BadTokenExpectedChar, ")" , c->cur ); + c->had_error = true; + } +return(ret ); + case op_log: case op_exp: case op_sqrt: + case op_sin: case op_cos: case op_tan: + case op_abs: + case op_rint: case op_floor: case op_ceil: + ret = gcalloc(1,sizeof(struct expr)); + ret->operator = op; + op = gettoken(c,&val); + if ( op!='(' ) { + GWidgetErrorR(_STR_BadToken, _STR_BadTokenExpectedChar, "(" , c->cur ); + c->had_error = true; + } + ret->op1 = getexpr(c); + op = gettoken(c,&val); + if ( op!=')' ) { + GWidgetErrorR(_STR_BadToken, _STR_BadTokenExpectedChar, ")" , c->cur ); + c->had_error = true; + } +return( ret ); + case op_add: + /* Just ignore a unary plus */; +return( gete0(c)); + case op_sub: case op_not: + ret->operator = op; + ret->op1 = gete0(c); +return( ret ); + default: + GWidgetErrorR(_STR_BadToken, _STR_UnexpectedToken , c->cur ); + c->had_error = true; + ret = gcalloc(1,sizeof(struct expr)); + ret->operator = op_value; + ret->value = val; +return( ret ); + } +} + +static struct expr *gete1(struct context *c) { + real val = 0; + enum operator op; + struct expr *ret, *op1; + + op1 = gete0(c); + op = gettoken(c,&val); + while ( op==op_pow ) { + ret = gcalloc(1,sizeof(struct expr)); + ret->op1 = op1; + ret->operator = op; + ret->op2 = gete0(c); + op1 = ret; + op = gettoken(c,&val); + } + backup(c,op,val); +return( op1 ); +} + +static struct expr *gete2(struct context *c) { + real val = 0; + enum operator op; + struct expr *ret, *op1; + + op1 = gete1(c); + op = gettoken(c,&val); + while ( op==op_times || op==op_div || op==op_mod ) { + ret = gcalloc(1,sizeof(struct expr)); + ret->op1 = op1; + ret->operator = op; + ret->op2 = gete1(c); + op1 = ret; + op = gettoken(c,&val); + } + backup(c,op,val); +return( op1 ); +} + +static struct expr *gete3(struct context *c) { + real val = 0; + enum operator op; + struct expr *ret, *op1; + + op1 = gete2(c); + op = gettoken(c,&val); + while ( op==op_add || op==op_sub ) { + ret = gcalloc(1,sizeof(struct expr)); + ret->op1 = op1; + ret->operator = op; + ret->op2 = gete2(c); + op1 = ret; + op = gettoken(c,&val); + } + backup(c,op,val); +return( op1 ); +} + +static struct expr *gete4(struct context *c) { + real val = 0; + enum operator op; + struct expr *ret, *op1; + + op1 = gete3(c); + op = gettoken(c,&val); + while ( op==op_eq || op==op_ne || op==op_lt || op==op_le || op==op_gt || op==op_ge ) { + ret = gcalloc(1,sizeof(struct expr)); + ret->op1 = op1; + ret->operator = op; + ret->op2 = gete3(c); + op1 = ret; + op = gettoken(c,&val); + } + backup(c,op,val); +return( op1 ); +} + +static struct expr *gete5(struct context *c) { + real val = 0; + enum operator op; + struct expr *ret, *op1; + + op1 = gete4(c); + op = gettoken(c,&val); + while ( op==op_and || op==op_or ) { + ret = gcalloc(1,sizeof(struct expr)); + ret->op1 = op1; + ret->operator = op; + ret->op2 = gete4(c); + op1 = ret; + op = gettoken(c,&val); + } + backup(c,op,val); +return( op1 ); +} + +static struct expr *getexpr(struct context *c) { + real val = 0; + enum operator op; + struct expr *ret, *op1; + + op1 = gete5(c); + op = gettoken(c,&val); + if ( op==op_if ) { + ret = gcalloc(1,sizeof(struct expr)); + ret->op1 = op1; + ret->operator = op; + ret->op2 = getexpr(c); + op = gettoken(c,&val); + if ( op!=':' ) { + GWidgetErrorR(_STR_BadToken, _STR_BadTokenExpectedChar, ":" , c->cur ); + c->had_error = true; + } + ret->op3 = getexpr(c); +return( ret ); + } else { + backup(c,op,val); +return( op1 ); + } +} + +static struct expr *parseexpr(struct context *c,char *str) { + struct expr *ret; + + c->backed_token = op_base; + c->start = c->cur = str; + ret = getexpr(c); + if ( *c->cur!='\0' ) { + c->had_error = true; + GWidgetErrorR(_STR_BadToken, _STR_UnexpectedTokenAtEnd , c->cur ); + } + if ( c->had_error ) { + exprfree(ret); +return( NULL ); + } +return( ret ); +} + +static real evaluate_expr(struct context *c,struct expr *e) { + real val1, val2; + + switch ( e->operator ) { + case op_value: +return( e->value ); + case op_x: +return( c->x ); + case op_y: +return( c->y ); + case op_negate: +return( -evaluate_expr(c,e->op1) ); + case op_not: +return( !evaluate_expr(c,e->op1) ); + case op_log: case op_exp: case op_sqrt: + case op_sin: case op_cos: case op_tan: + case op_abs: + case op_rint: case op_floor: case op_ceil: + val1 = evaluate_expr(c,e->op1); + switch ( e->operator ) { + case op_log: + if ( val1<=0 ) { + GWidgetErrorR(_STR_BadValue,_STR_BadLogarithem, val1, c->sc->name ); + c->had_error = true; +return( 0 ); + } +return( log(val1)); + case op_sqrt: + if ( val1<0 ) { + GWidgetErrorR(_STR_BadValue,_STR_BadSqrt, val1, c->sc->name ); + c->had_error = true; +return( 0 ); + } +return( sqrt(val1)); + case op_exp: +return( exp(val1)); + case op_sin: +return( sin(val1)); + case op_cos: +return( cos(val1)); + case op_tan: +return( tan(val1)); + case op_abs: +return( val1<0?-val1:val1 ); + case op_rint: +return( rint(val1)); + case op_floor: +return( floor(val1)); + case op_ceil: +return( ceil(val1)); + } + case op_pow: +return( pow(evaluate_expr(c,e->op1),evaluate_expr(c,e->op2)) ); + case op_times: +return( evaluate_expr(c,e->op1) * evaluate_expr(c,e->op2) ); + case op_div: case op_mod: + val2 = evaluate_expr(c,e->op2); + if ( val2==0 ) { + GWidgetErrorR(_STR_BadValue,_STR_DivideByZero, c->sc->name ); + c->had_error = true; +return( 0 ); + } + if ( e->operator==op_div ) +return( evaluate_expr(c,e->op1)/val2 ); +return( fmod(evaluate_expr(c,e->op1),val2) ); + case op_add: +return( evaluate_expr(c,e->op1) + evaluate_expr(c,e->op2) ); + case op_sub: +return( evaluate_expr(c,e->op1) - evaluate_expr(c,e->op2) ); + case op_eq: +return( evaluate_expr(c,e->op1) == evaluate_expr(c,e->op2) ); + case op_ne: +return( evaluate_expr(c,e->op1) != evaluate_expr(c,e->op2) ); + case op_le: +return( evaluate_expr(c,e->op1) <= evaluate_expr(c,e->op2) ); + case op_lt: +return( evaluate_expr(c,e->op1) < evaluate_expr(c,e->op2) ); + case op_ge: +return( evaluate_expr(c,e->op1) >= evaluate_expr(c,e->op2) ); + case op_gt: +return( evaluate_expr(c,e->op1) > evaluate_expr(c,e->op2) ); + case op_and: + val1 = evaluate_expr(c,e->op1); + if ( val1==0 ) +return( 0 ); +return( evaluate_expr(c,e->op1)!=0 ); + case op_or: + val1 = evaluate_expr(c,e->op1); + if ( val1!=0 ) +return( 1 ); +return( evaluate_expr(c,e->op1)!=0 ); + case op_if: + val1 = evaluate_expr(c,e->op1); + if ( val1!=0 ) +return( evaluate_expr(c,e->op2) ); + else +return( evaluate_expr(c,e->op3) ); + default: + GDrawIError( "Bad operator %d in %s\n", e->operator, c->sc->name ); + c->had_error = true; +return( 0 ); + } +} + +static real NL_expr(struct context *c,struct expr *e) { + real val = evaluate_expr(c,e); + if ( isnan(val)) +return( 0 ); + if ( val>=32768 ) +return( 32767 ); + else if ( val<-32768 ) +return( -32768 ); + +return( val ); +} + +static void NLTransPoint(SplinePoint *sp,struct context *c) { + + c->x = sp->me.x; c->y = sp->me.y; + sp->me.x = NL_expr(c,c->x_expr); + sp->me.y = NL_expr(c,c->y_expr); + c->x = sp->prevcp.x; c->y = sp->prevcp.y; + sp->prevcp.x = NL_expr(c,c->x_expr); + sp->prevcp.y = NL_expr(c,c->y_expr); + c->x = sp->nextcp.x; c->y = sp->nextcp.y; + sp->nextcp.x = NL_expr(c,c->x_expr); + sp->nextcp.y = NL_expr(c,c->y_expr); +} + +static void SplineSetNLTrans(SplineSet *ss,struct context *c, + int everything) { + SplinePoint *first, *last, *next; + SplinePoint *sp; + TPoint mids[20]; + double t; + int i; + Spline1D *xsp, *ysp; + /* When doing a linear transform, all we need to do is transform the */ + /* end and control points and figure the new spline and it works. A */ + /* non-linear transform is harder, we must transform each point along */ + /* the spline and then approximate a new spline to match. There is no */ + /* guarantee that we'll get a good match. Straight lines may become */ + /* curves, curves may become higher order curves (which we still approx */ + /* imate with cubics) */ + + first = last = chunkalloc(sizeof(SplinePoint)); + *first = *ss->first; + first->hintmask = NULL; + first->next = first->prev = NULL; + if ( everything || first->selected ) + NLTransPoint(first,c); + + if ( ss->first->next!=NULL ) { + for ( sp=ss->first->next->to; sp!=NULL; ) { + next = chunkalloc(sizeof(SplinePoint)); + *next = *sp; + next->hintmask = NULL; + next->next = next->prev = NULL; + if ( everything || next->selected ) + NLTransPoint(next,c); + if ( everything || (next->selected && last->selected) ) { + xsp = &sp->prev->splines[0]; ysp = &sp->prev->splines[1]; + for ( i=0; i<20; ++i ) { + t = (i+1)/21.0; + c->x = ((xsp->a*t+xsp->b)*t+xsp->c)*t + xsp->d; + c->y = ((ysp->a*t+ysp->b)*t+ysp->c)*t + ysp->d; + mids[i].t = t; + mids[i].x = NL_expr(c,c->x_expr); + mids[i].y = NL_expr(c,c->y_expr); + } + ApproximateSplineFromPoints(last,next,mids,20,false); + } else + SplineMake3(last,next); + last = next; + if ( sp==ss->first ) + break; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } + if ( ss->first->prev ) { + first->prev = last->prev; + first->prevcp = last->prevcp; + first->noprevcp = last->noprevcp; + first->prevcpdef = false; + first->prev->to = first; + SplinePointFree(last); + last = first; + } + for ( next=first ; ; ) { + if ( next->next==NULL ) + break; + if ( everything || next->selected ) + SPSmoothJoint(next); + next = next->next->to; + if ( next==first ) + break; + } + } + SplinePointsFree(ss); + ss->first = first; + ss->last = last; +} + +static void SCNLTrans(SplineChar *sc,struct context *c) { + SplineSet *ss; + RefChar *ref; +#ifdef FONTFORGE_CONFIG_TYPE3 + int i; + + if ( sc->layer_cnt==ly_fore+1 && + sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL ) +return; + + SCPreserveState(sc,false); + c->sc = sc; + for ( i=ly_fore; ilayer_cnt; ++i ) { + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) + SplineSetNLTrans(ss,c,true); + for ( ref=sc->layers[i].refs; ref!=NULL; ref=ref->next ) { + c->x = ref->transform[4]; c->y = ref->transform[5]; + ref->transform[4] = NL_expr(c,c->x_expr); + ref->transform[5] = NL_expr(c,c->y_expr); + /* we'll fix up the splines after all characters have been transformed*/ + } + } +#else + + if ( sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL ) +return; + + SCPreserveState(sc,false); + c->sc = sc; + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) + SplineSetNLTrans(ss,c,true); + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + c->x = ref->transform[4]; c->y = ref->transform[5]; + ref->transform[4] = NL_expr(c,c->x_expr); + ref->transform[5] = NL_expr(c,c->y_expr); + /* we'll fix up the splines after all characters have been transformed*/ + } +#endif +} + +static void CVNLTrans(CharView *cv,struct context *c) { + SplineSet *ss; + RefChar *ref; + + if ( cv->layerheads[cv->drawmode]->splines==NULL && (cv->drawmode!=dm_fore || cv->sc->layers[ly_fore].refs==NULL )) +return; + + CVPreserveState(cv); + c->sc = cv->sc; + for ( ss=cv->layerheads[cv->drawmode]->splines; ss!=NULL; ss=ss->next ) + SplineSetNLTrans(ss,c,false); + if ( cv->drawmode==dm_fore ) { + for ( ref=cv->layerheads[cv->drawmode]->refs; ref!=NULL; ref=ref->next ) { + c->x = ref->transform[4]; c->y = ref->transform[5]; + ref->transform[4] = NL_expr(c,c->x_expr); + ref->transform[5] = NL_expr(c,c->y_expr); + SCReinstanciateRefChar(cv->sc,ref); + } + } + CVCharChangedUpdate(cv); +} + +static void _SFNLTrans(FontView *fv,struct context *c) { + SplineChar *sc; + RefChar *ref; + int i; + + for ( i=0; isf->charcnt; ++i ) if ( fv->selected[i] && fv->sf->chars[i]!=NULL ) + SCNLTrans(fv->sf->chars[i],c); + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && (sc=fv->sf->chars[i])!=NULL && + (sc->layers[ly_fore].splines!=NULL || sc->layers[ly_fore].refs!=NULL)) { + /* A reference doesn't really work after a non-linear transform */ + /* but let's do the obvious thing */ + for ( ref = sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + SCReinstanciateRefChar(sc,ref); + SCCharChangedUpdate(sc); + } +} + +int SFNLTrans(FontView *fv,char *x_expr,char *y_expr) { + struct context c; + + memset(&c,0,sizeof(c)); + if ( (c.x_expr = parseexpr(&c,x_expr))==NULL ) +return( false ); + if ( (c.y_expr = parseexpr(&c,y_expr))==NULL ) { + exprfree(c.x_expr); +return( false ); + } + + _SFNLTrans(fv,&c); + + exprfree(c.x_expr); + exprfree(c.y_expr); +return( true ); +} + +struct nldlg { + GWindow gw; + int done, ok; +}; + +static int nld_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct nldlg *d = GDrawGetUserData(gw); + d->done = true; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype==et_buttonactivate ) { + struct nldlg *d = GDrawGetUserData(gw); + d->done = true; + d->ok = GGadgetGetCid(event->u.control.g); + } +return( true ); +} + +void NonLinearDlg(FontView *fv,CharView *cv) { + static unichar_t *lastx, *lasty; + struct nldlg d; + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + struct context c; + char *expstr; + + memset(&d,'\0',sizeof(d)); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1< +#include +#include "gdraw.h" +#include "gwidget.h" +#include "ggadget.h" +#include "pfaeditui.h" + +struct gfc_data { + int done; + unichar_t *ret; + GGadget *gfc; +}; + +static int GFD_Ok(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + d->ret = GGadgetGetTitle(d->gfc); + } +return( true ); +} + +static int GFD_New(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + GDrawSetVisible(GGadgetGetWindow(g),false); + FontNew(); + } +return( true ); +} + +static int GFD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct gfc_data *d = GDrawGetUserData(gw); + d->done = true; + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_mousemove || + (event->type==et_mousedown && event->u.mouse.button==3 )) { + struct gfc_data *d = GDrawGetUserData(gw); + GFileChooserPopupCheck(d->gfc,event); + } else if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + struct gfc_data *d = GDrawGetUserData(gw); +return( GGadgetDispatchEvent((GGadget *) (d->gfc),event)); + } +return( event->type!=et_char ); +} + +unichar_t *FVOpenFont(const unichar_t *title, const unichar_t *defaultfile, + const unichar_t *initial_filter, unichar_t **mimetypes,int mult, + int newok) { + GRect pos; + int i, filter; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[7]; + GTextInfo label[5]; + struct gfc_data d; + int bs = GIntGetResource(_NUM_Buttonsize), bsbigger, totwid, spacing; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<totwid; totwid = bsbigger?4*bs+4*12:totwid; + spacing = (totwid-4*bs-2*12)/3; + } else { + totwid = GGadgetScale(230); + bsbigger = 3*bs+3*14>totwid; totwid = bsbigger?3*bs+3*12:totwid; + spacing = (totwid-3*bs-2*12)/2; + } + pos.width = GDrawPointsToPixels(NULL,totwid); + pos.height = GDrawPointsToPixels(NULL,223); + gw = GDrawCreateTopWindow(NULL,&pos,e_h,&d,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; gcd[0].gd.pos.width = totwid*100/GIntGetResource(_NUM_ScaleFactor)-24; gcd[0].gd.pos.height = 180; + gcd[0].gd.flags = gg_visible | gg_enabled; + if ( RecentFiles[0]!=NULL ) + gcd[0].gd.flags = gg_visible | gg_enabled | gg_file_pulldown; + if ( mult ) + gcd[0].gd.flags |= gg_file_multiple; + gcd[0].creator = GFileChooserCreate; + + gcd[1].gd.pos.x = 12; gcd[1].gd.pos.y = 192-3; + gcd[1].gd.pos.width = -1; + gcd[1].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[1].text = (unichar_t *) _STR_OK; + label[1].text_in_resource = true; + gcd[1].gd.mnemonic = 'O'; + gcd[1].gd.label = &label[1]; + gcd[1].gd.handle_controlevent = GFD_Ok; + gcd[1].creator = GButtonCreate; + + i=2; + if ( newok ) { + gcd[2].gd.pos.x = -(spacing+bs)*100/GIntGetResource(_NUM_ScaleFactor)-12; gcd[2].gd.pos.y = 192; + gcd[2].gd.pos.width = -1; + gcd[2].gd.flags = gg_visible | gg_enabled; + label[2].text = (unichar_t *) _STR_New; + label[2].text_in_resource = true; + gcd[2].gd.mnemonic = 'N'; + gcd[2].gd.label = &label[2]; + gcd[2].gd.handle_controlevent = GFD_New; + gcd[2].creator = GButtonCreate; + i=3; + } + + filter = i; + gcd[i].gd.pos.x = (spacing+bs)*100/GIntGetResource(_NUM_ScaleFactor)+12; gcd[i].gd.pos.y = 192; + gcd[i].gd.pos.width = -1; + gcd[i].gd.flags = gg_visible | gg_enabled; + label[i].text = (unichar_t *) _STR_Filter; + label[i].text_in_resource = true; + gcd[i].gd.mnemonic = 'F'; + gcd[i].gd.label = &label[i]; + gcd[i].gd.handle_controlevent = GFileChooserFilterEh; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = -12; gcd[i].gd.pos.y = 192; + gcd[i].gd.pos.width = -1; + gcd[i].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[i].text = (unichar_t *) _STR_Cancel; + label[i].text_in_resource = true; + gcd[i].gd.label = &label[i]; + gcd[i].gd.mnemonic = 'C'; + gcd[i].gd.handle_controlevent = GFD_Cancel; + gcd[i++].creator = GButtonCreate; + + gcd[i].gd.pos.x = 2; gcd[i].gd.pos.y = 2; + gcd[i].gd.pos.width = pos.width-4; gcd[i].gd.pos.height = pos.height-4; + gcd[i].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + gcd[i++].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + GGadgetSetUserData(gcd[filter].ret,gcd[0].ret); + + GFileChooserConnectButtons(gcd[0].ret,gcd[1].ret,gcd[filter].ret); + GFileChooserSetFilterText(gcd[0].ret,initial_filter); + GFileChooserSetMimetypes(gcd[0].ret,mimetypes); + if ( RecentFiles[0]!=NULL ) { + GGadget *tf; + GFileChooserGetChildren(gcd[0].ret,NULL, NULL, &tf); + GGadgetSetList(tf,GTextInfoFromChars(RecentFiles,RECENT_MAX),false); + } + GGadgetSetTitle(gcd[0].ret,defaultfile); + + memset(&d,'\0',sizeof(d)); + d.gfc = gcd[0].ret; + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !d.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + GDrawProcessPendingEvents(NULL); /* Give the window a chance to vanish... */ + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); /* Give the window a chance to vanish... */ +return(d.ret); +} diff --git a/fontforge/othersubrs.c b/fontforge/othersubrs.c new file mode 100644 index 00000000..c284b6e4 --- /dev/null +++ b/fontforge/othersubrs.c @@ -0,0 +1,463 @@ +#include "basics.h" + +/* These subroutines are code by Adobe for this exact use (from T1_Spec.pdf) */ + + /* 3 0 callothersubr pop pop setcurrentpoint return */ +static const uint8 subrs0[] = { 3+139, 0+139, 12, 16, 12, 17, 12, 17, 12, 33, 11 }; + /* 0 1 callothersubr return */ +static const uint8 subrs1[] = { 0+139, 1+139, 12, 16, 11 }; + /* 0 2 callothersubr return */ +static const uint8 subrs2[] = { 0+139, 2+139, 12, 16, 11 }; + /* return */ +static const uint8 subrs3[] = { 11 }; + /* This one I created myself to do hint substitution */ + /* 1 3 callother pop callsubr */ +static const uint8 subrs4[] = { 1+139, 3+139, 12, 16, 12, 17, 10, 11 }; + + /* These others from adobe for multiple master */ + /* They need some fix up before they are used (the stack count depends on the # instances). */ + /* 14 callothersubr pop return */ +static const uint8 subrs5[] = { 139, 14+139, 12, 16, 12, 17, 11 }; + /* 2* 15 callothersubr pop pop return */ +static const uint8 subrs6[] = { 139, 15+139, 12, 16, 12, 17, 12, 17, 11 }; + /* 3* 16 callothersubr pop pop pop return */ +static const uint8 subrs7[] = { 139, 16+139, 12, 16, 12, 17, 12, 17, 12, 17, 11 }; + /* 4* 17 callothersubr pop pop pop pop return */ +static const uint8 subrs8[] = { 139, 17+139, 12, 16, 12, 17, 12, 17, 12, 17, 12, 17, 11 }; + /* 6* 18 callothersubr pop pop pop pop pop pop return */ +static const uint8 subrs9[] = { 139, 18+139, 12, 16, 12, 17, 12, 17, 12, 17, 12, 17, 12, 17, 12, 17, 11 }; + + +const uint8 *const subrs[] = { subrs0, subrs1, subrs2, subrs3, subrs4, + subrs5, subrs6, subrs7, subrs8, subrs9 }; +const int subrslens[] = { sizeof(subrs0), sizeof(subrs1), sizeof(subrs2), + sizeof(subrs3), sizeof(subrs4), sizeof(subrs5), sizeof(subrs6), + sizeof(subrs7), sizeof(subrs8), sizeof(subrs9) }; + +/* Assumption: We always want to do hint substitution (anyway, it's small) */ +/* If we also want flex output use the "othersubrs" array. If no flex the "othersubrsnoflex" */ +/* If we want to do counters, output "othersubrscounters" too */ +/* Finish up with othersubrsend */ +const char *othersubrs[] = { + "% Copyright (c) 1987-1990 Adobe Systems Incorporated.", + "% All Rights Reserved.", + "% This code to be used for Flex and hint replacement.", + "% Version 1.1", + "[systemdict /internaldict known", + "{1183615869 systemdict /internaldict get exec", + "/FlxProc known {save true} {false} ifelse}", + "{userdict /internaldict known not {", + "userdict /internaldict", + "{count 0 eq", + "{/internaldict errordict /invalidaccess get exec} if", + "dup type /integertype ne", + "{/internaldict errordict /invalidaccess get exec} if", + "dup 1183615869 eq", + "{pop 0}", + "{/internaldict errordict /invalidaccess get exec}", + "ifelse", + "}", + "dup 14 get 1 25 dict put", + "bind executeonly put", + "} if", + "1183615869 userdict /internaldict get exec", + "/FlxProc known {save true} {false} ifelse}", + "ifelse", + "[", + "systemdict /internaldict known not", + "{100 dict /begin cvx /mtx matrix /def cvx} if", + "systemdict /currentpacking known {currentpacking true setpacking} if", + "{", + "systemdict /internaldict known {", + "1183615869 systemdict /internaldict get exec", + "dup /$FlxDict known not {", + "dup dup length exch maxlength eq", + "{pop userdict dup /$FlxDict known not", + "{100 dict begin /mtx matrix def", + "dup /$FlxDict currentdict put end} if}", + "{100 dict begin /mtx matrix def", + "dup /$FlxDict currentdict put end}", + "ifelse", + "} if", + "/$FlxDict get begin", + "} if", + "grestore", + "/exdef {exch def} def", + "/dmin exch abs 100 div def", + "/epX exdef /epY exdef", + "/c4y2 exdef /c4x2 exdef /c4y1 exdef /c4x1 exdef /c4y0 exdef /c4x0 exdef", + "/c3y2 exdef /c3x2 exdef /c3y1 exdef /c3x1 exdef /c3y0 exdef /c3x0 exdef", + "/c1y2 exdef /c1x2 exdef /c2x2 c4x2 def /c2y2 c4y2 def", + "/yflag c1y2 c3y2 sub abs c1x2 c3x2 sub abs gt def", + "/PickCoords {", + "{c1x0 c1y0 c1x1 c1y1 c1x2 c1y2 c2x0 c2y0 c2x1 c2y1 c2x2 c2y2}", + "{c3x0 c3y0 c3x1 c3y1 c3x2 c3y2 c4x0 c4y0 c4x1 c4y1 c4x2 c4y2}", + "ifelse", + "/y5 exdef /x5 exdef /y4 exdef /x4 exdef /y3 exdef /x3 exdef", + "/y2 exdef /x2 exdef /y1 exdef /x1 exdef /y0 exdef /x0 exdef", + "} def", + "mtx currentmatrix pop", + "mtx 0 get abs .00001 lt mtx 3 get abs .00001 lt or", + "{/flipXY -1 def}", + "{mtx 1 get abs .00001 lt mtx 2 get abs .00001 lt or", + "{/flipXY 1 def}", + "{/flipXY 0 def}", + "ifelse}", + "ifelse", + "/erosion 1 def", + "systemdict /internaldict known {", + "1183615869 systemdict /internaldict get exec dup", + "/erosion known", + "{/erosion get /erosion exch def}", + "{pop}", + "ifelse", + "} if", + "yflag", + "{flipXY 0 eq c3y2 c4y2 eq or", + "{false PickCoords}", + "{/shrink c3y2 c4y2 eq", + "{0}{c1y2 c4y2 sub c3y2 c4y2 sub div abs} ifelse def", + "/yshrink {c4y2 sub shrink mul c4y2 add} def", + "/c1y0 c3y0 yshrink def /c1y1 c3y1 yshrink def", + "/c2y0 c4y0 yshrink def /c2y1 c4y1 yshrink def", + "/c1x0 c3x0 def /c1x1 c3x1 def /c2x0 c4x0 def /c2x1 c4x1 def", + "/dY 0 c3y2 c1y2 sub round", + "dtransform flipXY 1 eq {exch} if pop abs def", + "dY dmin lt PickCoords", + "y2 c1y2 sub abs 0.001 gt {", + "c1x2 c1y2 transform flipXY 1 eq {exch} if", + "/cx exch def /cy exch def", + "/dY 0 y2 c1y2 sub round dtransform flipXY 1 eq {exch}", + "if pop def", + "dY round dup 0 ne", + "{/dY exdef}", + "{pop dY 0 lt {-1}{1} ifelse /dY exdef}", + "ifelse", + "/erode PaintType 2 ne erosion 0.5 ge and def", + "erode {/cy cy 0.5 sub def} if", + "/ey cy dY add def", + "/ey ey ceiling ey sub ey floor add def", + "erode {/ey ey 0.5 add def} if", + "ey cx flipXY 1 eq {exch} if itransform exch pop", + "y2 sub /eShift exch def", + "/y1 y1 eShift add def /y2 y2 eShift add def /y3 y3", + "eShift add def", + "} if", + "} ifelse", + "}", + "{flipXY 0 eq c3x2 c4x2 eq or", + "{false PickCoords}", + "{/shrink c3x2 c4x2 eq", + "{0}{c1x2 c4x2 sub c3x2 c4x2 sub div abs} ifelse def", + "/xshrink {c4x2 sub shrink mul c4x2 add} def", + "/c1x0 c3x0 xshrink def /c1x1 c3x1 xshrink def", + "/c2x0 c4x0 xshrink def /c2x1 c4x1 xshrink def", + "/c1y0 c3y0 def /c1y1 c3y1 def /c2y0 c4y0 def /c2y1 c4y1 def", + "/dX c3x2 c1x2 sub round 0 dtransform", + "flipXY -1 eq {exch} if pop abs def", + "dX dmin lt PickCoords", + "x2 c1x2 sub abs 0.001 gt {", + "c1x2 c1y2 transform flipXY -1 eq {exch} if", + "/cy exch def /cx exch def", + "/dX x2 c1x2 sub round 0 dtransform flipXY -1 eq {exch} if pop def", + "dX round dup 0 ne", + "{/dX exdef}", + "{pop dX 0 lt {-1}{1} ifelse /dX exdef}", + "ifelse", + "/erode PaintType 2 ne erosion .5 ge and def", + "erode {/cx cx .5 sub def} if", + "/ex cx dX add def", + "/ex ex ceiling ex sub ex floor add def", + "erode {/ex ex .5 add def} if", + "ex cy flipXY -1 eq {exch} if itransform pop", + "x2 sub /eShift exch def", + "/x1 x1 eShift add def /x2 x2 eShift add def /x3 x3 eShift add def", + "} if", + "} ifelse", + "} ifelse", + "x2 x5 eq y2 y5 eq or", + "{x5 y5 lineto}", + "{x0 y0 x1 y1 x2 y2 curveto", + "x3 y3 x4 y4 x5 y5 curveto}", + "ifelse", + "epY epX", + "}", + "systemdict /currentpacking known {exch setpacking} if", + "/exec cvx /end cvx ] cvx", + "executeonly", + "exch", + "{pop true exch restore}", + "{", + "systemdict /internaldict known not", + "{1183615869 userdict /internaldict get exec", + "exch /FlxProc exch put true}", + "{1183615869 systemdict /internaldict get exec", + "dup length exch maxlength eq", + "{false}", + "{1183615869 systemdict /internaldict get exec", + "exch /FlxProc exch put true}", + "ifelse}", + "ifelse}", + "ifelse", + "{systemdict /internaldict known", + "{{1183615869 systemdict /internaldict get exec /FlxProc get exec}}", + "{{1183615869 userdict /internaldict get exec /FlxProc get exec}}", + "ifelse executeonly", + "} if", + "{gsave currentpoint newpath moveto} executeonly", + "{currentpoint grestore gsave currentpoint newpath moveto} executeonly", + "{systemdict /internaldict known not", + "{pop 3}", + "{1183615869 systemdict /internaldict get exec", + "dup /startlock known", + "{/startlock get exec}", + "{dup /strtlck known", + "{/strtlck get exec}", + "{pop 3}", + "ifelse}", + "ifelse}", + "ifelse", + "} executeonly", + NULL +}; + +const char *othersubrsnoflex[] = { + "% Copyright (c) 1987-1990 Adobe Systems Incorporated.", + "% All Rights Reserved.", + "% This code to be used for Hint replacement only.", + "% Version 1.1", + "[ {} {} {}", + "{systemdict /internaldict known not", + "{pop 3}", + "{1183615869 systemdict /internaldict get exec", + "dup /startlock known", + "{/startlock get exec}", + "{dup /strtlck known", + "{/strtlck get exec}", + "{pop 3}", + "ifelse}", + "ifelse}", + "ifelse", + "} executeonly", + NULL +}; + +const char *othersubrscounters[] = { + "{}", /* Other subr 4 */ + "{}", /* Other subr 5 */ + "{}", /* Other subr 6 */ + "{}", /* Other subr 7 */ + "{}", /* Other subr 8 */ + "{}", /* Other subr 9 */ + "{}", /* Other subr 10 */ + "{}", /* Other subr 11 */ + "{}", /* Other Subr 12, for counter hints */ + "{2 {cvi {{pop 0 lt {exit} if} loop} repeat} repeat}", /* Other Subr 13 for counter hints */ + NULL +}; + +const char *othersubrsnocounters[] = { + "{}", /* Other subr 4 */ + "{}", /* Other subr 5 */ + "{}", /* Other subr 6 */ + "{}", /* Other subr 7 */ + "{}", /* Other subr 8 */ + "{}", /* Other subr 9 */ + "{}", /* Other subr 10 */ + "{}", /* Other subr 11 */ + "{}", /* Other Subr 12 */ + "{}", /* Other Subr 13 */ + NULL +}; + +/* code for other subrs 14-18 must be done at run time as it depends on */ +/* the number of font instances in the mm set */ + +const char *othersubrsend[] = { + "] ", + NULL +}; + +/* Lives in private dictionary. Commonly used. I have no docs on it */ +/* The first numbers (9.5,72) change in different uses (4.5,34), (4.5,38), (5.5,41), (6.5,50) are other combo */ +/* James Cloos notes that the second number is /StdVW, and the first number is */ +/* StdVW 8 idiv .5 add */ +/* +const char *erode[] = { + "/Erode", + "{ 9.5 dup 3 -1 roll 0.1 mul exch 0.5 sub mul cvi sub dup mul", + " 72 0 dtransform dup mul exch dup mul add le", + " { pop pop 1.0 1.0 }", + " { pop pop 0.0 1.5 }", + " ifelse", + "} bind def", + NULL +}; + +/* from Adobe Technical Specification #5014, Adobe CMap and CIDFont Files */ +/* Specification, Version 1.0. */ +const char *cid_othersubrs[] = { + "[ {} {} {}", + " { systemdict /internaldict known not", + " { pop 3 }", + " { 1183615869 systemdict /internaldict get exec dup", + " /startlock known", + " { /startlock get exec }", + " { dup /strlck known", + " { /strlck get exec }", + " { pop 3 }", + " ifelse", + " }", + " ifelse", + " }", + " ifelse", + " } bind", + " {} {} {} {} {} {} {} {} {}", + " { 2 { cvi { { pop 0 lt { exit } if } loop } repeat }", + " repeat } bind", + "]", + NULL +}; + + +const char *makeblendedfont[] = { + "% Copyright (c) 1990-1994 Adobe Systems Incorporated.", + "% All Rights Reserved.", +/* Adobe has posted a copyright notice in 5015.Type1_Supp.pdf with the */ +/* wrong comment here. I've changed it */ + "% This code to be used for multiple master fonts.", + "% Version 11", + "/shareddict where", + "{ pop currentshared { setshared } true setshared shareddict }", + "{ {} userdict } ifelse dup", + "/makeblendedfont where {/makeblendedfont get dup type /operatortype eq {", + "pop false} { 0 get dup type /integertype ne", + "{pop false} {11 lt} ifelse} ifelse } {true}ifelse", + "{/makeblendedfont {", + "11 pop", + "2 copy length exch /WeightVector get length eq", + "{ dup 0 exch {add} forall 1 sub abs .001 gt }", + "{ true } ifelse", + "{ /makeblendedfont cvx errordict /rangecheck get exec } if", + "exch dup dup maxlength dict begin {", + "false {/FID /UniqueID /XUID } { 3 index eq or } forall", + " { pop pop } { def } ifelse", + "} forall", + "/XUID 2 copy known{", + "get dup length 2 index length sub dup 0 gt{", + "exch dup length array copy", + "exch 2 index{65536 mul cvi 3 copy put pop 1 add}forall pop/XUID exch def", + "}{pop pop}ifelse", + "}{pop pop}ifelse", + "{ /Private /FontInfo } {", + "dup load dup maxlength dict begin {", + "false { /UniqueID /XUID } { 3 index eq or } forall", + "{ pop pop }{ def } ifelse } forall currentdict end def", + "} forall", + "dup /WeightVector exch def", + "dup /$Blend exch [", + "exch false exch", + "dup length 1 sub -1 1 {", + "1 index dup length 3 -1 roll sub get", + "dup 0 eq {", + "pop 1 index {/exch load 3 1 roll} if", + "/pop load 3 1 roll", + "} {dup 1 eq {pop}", + "{2 index {/exch load 4 1 roll} if", + "3 1 roll /mul load 3 1 roll } ifelse", + "1 index {/add load 3 1 roll} if", + "exch pop true exch} ifelse", + "} for", + "pop { /add load } if", + "] cvx def", + "{2 copy length exch length ne {/makeblendedfont cvx errordict /typecheck get exec}if", + "0 0 1 3 index length 1 sub {", + "dup 4 index exch get exch 3 index exch get mul add", + "} for", + "exch pop exch pop}", + "{{dup type dup dup /arraytype eq exch /packedarraytype eq or {", + " pop 1 index /ForceBold eq {", + " 5 index 0 0 1 3 index length 1 sub {", + " dup 4 index exch get {2 index exch get add } {pop} ifelse", + " } for exch pop exch pop", + " 2 index /ForceBoldThreshold get gt 3 copy} {", + "{length 1 index length ne { pop false } {", + "true exch { type dup /integertype eq exch /realtype eq exch or and } forall", + "} ifelse }", + "2 copy 8 index exch exec {pop 5 index 5 index exec}", + "{exch dup length array 1 index xcheck { cvx } if", + "dup length 1 sub 0 exch 1 exch {", + "dup 3 index exch get dup type dup /arraytype eq exch /packedarraytype eq or {", + "dup 10 index 6 index exec {", + "9 index exch 9 index exec} if } if 2 index 3 1 roll put", + "} for exch pop exch pop", + "} ifelse 3 copy", + "1 index dup /StemSnapH eq exch /StemSnapV eq or {", + "dup length 1 sub {dup 0 le { exit } if", + "dup dup 1 sub 3 index exch get exch 3 index exch get 2 copy eq {", + "pop 2 index 2 index 0 put 0 } if le {1 sub}", + "{dup dup 1 sub 3 index exch get exch 3 index exch get", + "3 index exch 3 index 1 sub exch put", + "3 copy put pop", + "2 copy exch length 1 sub lt {1 add} if} ifelse} loop pop", + "dup 0 get 0 le {", + "dup 0 exch {0 gt { exit } if 1 add} forall", + "dup 2 index length exch sub getinterval} if } if } ifelse put }", + "{/dicttype eq {6 copy 3 1 roll get exch 2 index exec}", + "{/makeblendedfont cvx errordict /typecheck get exec} ifelse", + "} ifelse pop pop } forall pop pop pop pop }", + "currentdict Blend 2 index exec", + "currentdict end", + "} bind put", + "/$fbf {FontDirectory counttomark 3 add -1 roll known {", + "cleartomark pop findfont}{", + "] exch findfont exch makeblendedfont", + "dup /Encoding currentfont /Encoding get put definefont", + "} ifelse currentfont /ScaleMatrix get makefont setfont", + "} bind put } { pop pop } ifelse exec", + NULL +}; + +const char *mmfindfont[] = { + "/$mmff_origfindfont where {", + " pop save { restore } { pop pop }", + "} { {} { def } } ifelse", + "/setshared where { pop true } { false } ifelse", + "/findfont where pop dup systemdict eq {", + "pop { currentshared {{}} { true setshared { false setshared } } ifelse shareddict", + "} {{} userdict } ifelse begin", + "} { begin { currentdict scheck } { false } ifelse {", + "currentshared {{}} { true setshared { false setshared } } ifelse", + "} { {} } ifelse } ifelse", + "/$mmff_origfindfont /findfont load 3 index exec", + "/findfont {", + "dup FontDirectory exch known", + "{ dup FontDirectory exch get /FontType get 3 ne}", + "{ dup SharedFontDirectory exch known", + "{ dup SharedFontDirectory exch get /FontType get 3 ne}", + "{ false} ifelse} ifelse", + "{$mmff_origfindfont} { dup dup length string cvs (_) search {", + "cvn dup dup FontDirectory exch known exch SharedFontDirectory exch known or {", + "true} {dup length 7 add string dup 0 (%font%) putinterval", + "dup 2 index 6 exch dup length string cvs putinterval", + "{ status } stopped { pop false } if {", + "pop pop pop pop true} {false} ifelse} ifelse {", + "$mmff_origfindfont begin pop", + "[ exch { (_) search { { cvr } stopped { pop pop } {", + "exch pop exch } ifelse", + "} { pop exit } ifelse } loop false /FontInfo where {", + "pop FontInfo /BlendAxisTypes 2 copy known {", + "get length counttomark 2 sub eq exch pop", + "} { pop pop } ifelse } if {", + "NormalizeDesignVector", + "ConvertDesignVector", + "] currentdict exch makeblendedfont", + "2 copy exch /FontName exch put", + "definefont} { cleartomark $mmff_origfindfont } ifelse end", + "} { pop pop pop $mmff_origfindfont } ifelse", + "} { pop $mmff_origfindfont } ifelse } ifelse", + "} bind 3 index exec", + "/SharedFontDirectory dup where { pop pop } { 0 dict 3 index exec } ifelse", + "end exec pop exec", +NULL +}; diff --git a/fontforge/parsepfa.c b/fontforge/parsepfa.c new file mode 100644 index 00000000..5ccd4092 --- /dev/null +++ b/fontforge/parsepfa.c @@ -0,0 +1,2475 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include +#include +#include "psfont.h" +#include + +struct fontparse { + FontDict *fd, *mainfd; + /* always in font data */ + unsigned int infi:1; + unsigned int inchars:1; + unsigned int inprivate:1; + unsigned int insubs:1; + unsigned int inmetrics: 1; + unsigned int inmetrics2: 1; + unsigned int inbb: 1; + unsigned int inencoding: 1; + unsigned int multiline: 1; + unsigned int incidsysteminfo: 1; + unsigned int inblendfi:1; + unsigned int inblendprivate:1; + unsigned int skipping_mbf: 1; + unsigned int inblend: 1; + unsigned int iscid: 1; + unsigned int iscff: 1; + unsigned int useshexstrings: 1; + unsigned int doneencoding: 1; + unsigned int ignore: 1; + int instring; + int fdindex; + char **pending_parse; + + unsigned int alreadycomplained: 1; + + char *vbuf, *vmax, *vpt; + int depth; +}; + +static void copyenc(char *encoding[256],char *std[256]) { + int i; + for ( i=0; i<256; ++i ) + encoding[i] = copy(std[i]); +} + +char *AdobeStandardEncoding[] = { +/* 0000 */ ".notdef", +/* 0001 */ ".notdef", +/* 0002 */ ".notdef", +/* 0003 */ ".notdef", +/* 0004 */ ".notdef", +/* 0005 */ ".notdef", +/* 0006 */ ".notdef", +/* 0007 */ ".notdef", +/* 0008 */ ".notdef", +/* 0009 */ ".notdef", +/* 000a */ ".notdef", +/* 000b */ ".notdef", +/* 000c */ ".notdef", +/* 000d */ ".notdef", +/* 000e */ ".notdef", +/* 000f */ ".notdef", +/* 0010 */ ".notdef", +/* 0011 */ ".notdef", +/* 0012 */ ".notdef", +/* 0013 */ ".notdef", +/* 0014 */ ".notdef", +/* 0015 */ ".notdef", +/* 0016 */ ".notdef", +/* 0017 */ ".notdef", +/* 0018 */ ".notdef", +/* 0019 */ ".notdef", +/* 001a */ ".notdef", +/* 001b */ ".notdef", +/* 001c */ ".notdef", +/* 001d */ ".notdef", +/* 001e */ ".notdef", +/* 001f */ ".notdef", +/* 0020 */ "space", +/* 0021 */ "exclam", +/* 0022 */ "quotedbl", +/* 0023 */ "numbersign", +/* 0024 */ "dollar", +/* 0025 */ "percent", +/* 0026 */ "ampersand", +/* 0027 */ "quoteright", +/* 0028 */ "parenleft", +/* 0029 */ "parenright", +/* 002a */ "asterisk", +/* 002b */ "plus", +/* 002c */ "comma", +/* 002d */ "hyphen", +/* 002e */ "period", +/* 002f */ "slash", +/* 0030 */ "zero", +/* 0031 */ "one", +/* 0032 */ "two", +/* 0033 */ "three", +/* 0034 */ "four", +/* 0035 */ "five", +/* 0036 */ "six", +/* 0037 */ "seven", +/* 0038 */ "eight", +/* 0039 */ "nine", +/* 003a */ "colon", +/* 003b */ "semicolon", +/* 003c */ "less", +/* 003d */ "equal", +/* 003e */ "greater", +/* 003f */ "question", +/* 0040 */ "at", +/* 0041 */ "A", +/* 0042 */ "B", +/* 0043 */ "C", +/* 0044 */ "D", +/* 0045 */ "E", +/* 0046 */ "F", +/* 0047 */ "G", +/* 0048 */ "H", +/* 0049 */ "I", +/* 004a */ "J", +/* 004b */ "K", +/* 004c */ "L", +/* 004d */ "M", +/* 004e */ "N", +/* 004f */ "O", +/* 0050 */ "P", +/* 0051 */ "Q", +/* 0052 */ "R", +/* 0053 */ "S", +/* 0054 */ "T", +/* 0055 */ "U", +/* 0056 */ "V", +/* 0057 */ "W", +/* 0058 */ "X", +/* 0059 */ "Y", +/* 005a */ "Z", +/* 005b */ "bracketleft", +/* 005c */ "backslash", +/* 005d */ "bracketright", +/* 005e */ "asciicircum", +/* 005f */ "underscore", +/* 0060 */ "quoteleft", +/* 0061 */ "a", +/* 0062 */ "b", +/* 0063 */ "c", +/* 0064 */ "d", +/* 0065 */ "e", +/* 0066 */ "f", +/* 0067 */ "g", +/* 0068 */ "h", +/* 0069 */ "i", +/* 006a */ "j", +/* 006b */ "k", +/* 006c */ "l", +/* 006d */ "m", +/* 006e */ "n", +/* 006f */ "o", +/* 0070 */ "p", +/* 0071 */ "q", +/* 0072 */ "r", +/* 0073 */ "s", +/* 0074 */ "t", +/* 0075 */ "u", +/* 0076 */ "v", +/* 0077 */ "w", +/* 0078 */ "x", +/* 0079 */ "y", +/* 007a */ "z", +/* 007b */ "braceleft", +/* 007c */ "bar", +/* 007d */ "braceright", +/* 007e */ "asciitilde", +/* 007f */ ".notdef", +/* 0080 */ ".notdef", +/* 0081 */ ".notdef", +/* 0082 */ ".notdef", +/* 0083 */ ".notdef", +/* 0084 */ ".notdef", +/* 0085 */ ".notdef", +/* 0086 */ ".notdef", +/* 0087 */ ".notdef", +/* 0088 */ ".notdef", +/* 0089 */ ".notdef", +/* 008a */ ".notdef", +/* 008b */ ".notdef", +/* 008c */ ".notdef", +/* 008d */ ".notdef", +/* 008e */ ".notdef", +/* 008f */ ".notdef", +/* 0090 */ ".notdef", +/* 0091 */ ".notdef", +/* 0092 */ ".notdef", +/* 0093 */ ".notdef", +/* 0094 */ ".notdef", +/* 0095 */ ".notdef", +/* 0096 */ ".notdef", +/* 0097 */ ".notdef", +/* 0098 */ ".notdef", +/* 0099 */ ".notdef", +/* 009a */ ".notdef", +/* 009b */ ".notdef", +/* 009c */ ".notdef", +/* 009d */ ".notdef", +/* 009e */ ".notdef", +/* 009f */ ".notdef", +/* 00a0 */ ".notdef", +/* 00a1 */ "exclamdown", +/* 00a2 */ "cent", +/* 00a3 */ "sterling", +/* 00a4 */ "fraction", +/* 00a5 */ "yen", +/* 00a6 */ "florin", +/* 00a7 */ "section", +/* 00a8 */ "currency", +/* 00a9 */ "quotesingle", +/* 00aa */ "quotedblleft", +/* 00ab */ "guillemotleft", +/* 00ac */ "guilsinglleft", +/* 00ad */ "guilsinglright", +/* 00ae */ "fi", +/* 00af */ "fl", +/* 00b0 */ ".notdef", +/* 00b1 */ "endash", +/* 00b2 */ "dagger", +/* 00b3 */ "daggerdbl", +/* 00b4 */ "periodcentered", +/* 00b5 */ ".notdef", +/* 00b6 */ "paragraph", +/* 00b7 */ "bullet", +/* 00b8 */ "quotesinglbase", +/* 00b9 */ "quotedblbase", +/* 00ba */ "quotedblright", +/* 00bb */ "guillemotright", +/* 00bc */ "ellipsis", +/* 00bd */ "perthousand", +/* 00be */ ".notdef", +/* 00bf */ "questiondown", +/* 00c0 */ ".notdef", +/* 00c1 */ "grave", +/* 00c2 */ "acute", +/* 00c3 */ "circumflex", +/* 00c4 */ "tilde", +/* 00c5 */ "macron", +/* 00c6 */ "breve", +/* 00c7 */ "dotaccent", +/* 00c8 */ "dieresis", +/* 00c9 */ ".notdef", +/* 00ca */ "ring", +/* 00cb */ "cedilla", +/* 00cc */ ".notdef", +/* 00cd */ "hungarumlaut", +/* 00ce */ "ogonek", +/* 00cf */ "caron", +/* 00d0 */ "emdash", +/* 00d1 */ ".notdef", +/* 00d2 */ ".notdef", +/* 00d3 */ ".notdef", +/* 00d4 */ ".notdef", +/* 00d5 */ ".notdef", +/* 00d6 */ ".notdef", +/* 00d7 */ ".notdef", +/* 00d8 */ ".notdef", +/* 00d9 */ ".notdef", +/* 00da */ ".notdef", +/* 00db */ ".notdef", +/* 00dc */ ".notdef", +/* 00dd */ ".notdef", +/* 00de */ ".notdef", +/* 00df */ ".notdef", +/* 00e0 */ ".notdef", +/* 00e1 */ "AE", +/* 00e2 */ ".notdef", +/* 00e3 */ "ordfeminine", +/* 00e4 */ ".notdef", +/* 00e5 */ ".notdef", +/* 00e6 */ ".notdef", +/* 00e7 */ ".notdef", +/* 00e8 */ "Lslash", +/* 00e9 */ "Oslash", +/* 00ea */ "OE", +/* 00eb */ "ordmasculine", +/* 00ec */ ".notdef", +/* 00ed */ ".notdef", +/* 00ee */ ".notdef", +/* 00ef */ ".notdef", +/* 00f0 */ ".notdef", +/* 00f1 */ "ae", +/* 00f2 */ ".notdef", +/* 00f3 */ ".notdef", +/* 00f4 */ ".notdef", +/* 00f5 */ "dotlessi", +/* 00f6 */ ".notdef", +/* 00f7 */ ".notdef", +/* 00f8 */ "lslash", +/* 00f9 */ "oslash", +/* 00fa */ "oe", +/* 00fb */ "germandbls", +/* 00fc */ ".notdef", +/* 00fd */ ".notdef", +/* 00fe */ ".notdef", +/* 00ff */ ".notdef" +}; +static void setStdEnc(char *encoding[256]) { + copyenc(encoding,AdobeStandardEncoding); +} + +static void setLatin1Enc(char *encoding[256]) { + static char *latin1enc[] = { +/* 0000 */ ".notdef", +/* 0001 */ ".notdef", +/* 0002 */ ".notdef", +/* 0003 */ ".notdef", +/* 0004 */ ".notdef", +/* 0005 */ ".notdef", +/* 0006 */ ".notdef", +/* 0007 */ ".notdef", +/* 0008 */ ".notdef", +/* 0009 */ ".notdef", +/* 000a */ ".notdef", +/* 000b */ ".notdef", +/* 000c */ ".notdef", +/* 000d */ ".notdef", +/* 000e */ ".notdef", +/* 000f */ ".notdef", +/* 0010 */ ".notdef", +/* 0011 */ ".notdef", +/* 0012 */ ".notdef", +/* 0013 */ ".notdef", +/* 0014 */ ".notdef", +/* 0015 */ ".notdef", +/* 0016 */ ".notdef", +/* 0017 */ ".notdef", +/* 0018 */ ".notdef", +/* 0019 */ ".notdef", +/* 001a */ ".notdef", +/* 001b */ ".notdef", +/* 001c */ ".notdef", +/* 001d */ ".notdef", +/* 001e */ ".notdef", +/* 001f */ ".notdef", +/* 0020 */ "space", +/* 0021 */ "exclam", +/* 0022 */ "quotedbl", +/* 0023 */ "numbersign", +/* 0024 */ "dollar", +/* 0025 */ "percent", +/* 0026 */ "ampersand", +/* 0027 */ "quoteright", +/* 0028 */ "parenleft", +/* 0029 */ "parenright", +/* 002a */ "asterisk", +/* 002b */ "plus", +/* 002c */ "comma", +/* 002d */ "hyphen", +/* 002e */ "period", +/* 002f */ "slash", +/* 0030 */ "zero", +/* 0031 */ "one", +/* 0032 */ "two", +/* 0033 */ "three", +/* 0034 */ "four", +/* 0035 */ "five", +/* 0036 */ "six", +/* 0037 */ "seven", +/* 0038 */ "eight", +/* 0039 */ "nine", +/* 003a */ "colon", +/* 003b */ "semicolon", +/* 003c */ "less", +/* 003d */ "equal", +/* 003e */ "greater", +/* 003f */ "question", +/* 0040 */ "at", +/* 0041 */ "A", +/* 0042 */ "B", +/* 0043 */ "C", +/* 0044 */ "D", +/* 0045 */ "E", +/* 0046 */ "F", +/* 0047 */ "G", +/* 0048 */ "H", +/* 0049 */ "I", +/* 004a */ "J", +/* 004b */ "K", +/* 004c */ "L", +/* 004d */ "M", +/* 004e */ "N", +/* 004f */ "O", +/* 0050 */ "P", +/* 0051 */ "Q", +/* 0052 */ "R", +/* 0053 */ "S", +/* 0054 */ "T", +/* 0055 */ "U", +/* 0056 */ "V", +/* 0057 */ "W", +/* 0058 */ "X", +/* 0059 */ "Y", +/* 005a */ "Z", +/* 005b */ "bracketleft", +/* 005c */ "backslash", +/* 005d */ "bracketright", +/* 005e */ "asciicircum", +/* 005f */ "underscore", +/* 0060 */ "grave", +/* 0061 */ "a", +/* 0062 */ "b", +/* 0063 */ "c", +/* 0064 */ "d", +/* 0065 */ "e", +/* 0066 */ "f", +/* 0067 */ "g", +/* 0068 */ "h", +/* 0069 */ "i", +/* 006a */ "j", +/* 006b */ "k", +/* 006c */ "l", +/* 006d */ "m", +/* 006e */ "n", +/* 006f */ "o", +/* 0070 */ "p", +/* 0071 */ "q", +/* 0072 */ "r", +/* 0073 */ "s", +/* 0074 */ "t", +/* 0075 */ "u", +/* 0076 */ "v", +/* 0077 */ "w", +/* 0078 */ "x", +/* 0079 */ "y", +/* 007a */ "z", +/* 007b */ "braceleft", +/* 007c */ "bar", +/* 007d */ "braceright", +/* 007e */ "asciitilde", +/* 007f */ ".notdef", +/* 0080 */ ".notdef", +/* 0081 */ ".notdef", +/* 0082 */ ".notdef", +/* 0083 */ ".notdef", +/* 0084 */ ".notdef", +/* 0085 */ ".notdef", +/* 0086 */ ".notdef", +/* 0087 */ ".notdef", +/* 0088 */ ".notdef", +/* 0089 */ ".notdef", +/* 008a */ ".notdef", +/* 008b */ ".notdef", +/* 008c */ ".notdef", +/* 008d */ ".notdef", +/* 008e */ ".notdef", +/* 008f */ ".notdef", +/* 0090 */ "dotlessi", /* Um, Adobe's Latin1 has some extra chars */ +/* 0091 */ "grave", +/* 0092 */ "accute", /* This is a duplicate... */ +/* 0093 */ "circumflex", +/* 0094 */ "tilde", +/* 0095 */ "macron", +/* 0096 */ "breve", +/* 0097 */ "dotaccent", +/* 0098 */ "dieresis", +/* 0099 */ ".notdef", +/* 009a */ "ring", +/* 009b */ "cedilla", +/* 009c */ ".notdef", +/* 009d */ "hungarumlaut", +/* 009e */ "ogonek", +/* 009f */ "caron", +/* 00a0 */ "space", +/* 00a1 */ "exclamdown", +/* 00a2 */ "cent", +/* 00a3 */ "sterling", +/* 00a4 */ "currency", +/* 00a5 */ "yen", +/* 00a6 */ "brokenbar", +/* 00a7 */ "section", +/* 00a8 */ "dieresis", +/* 00a9 */ "copyright", +/* 00aa */ "ordfeminine", +/* 00ab */ "guillemotleft", +/* 00ac */ "logicalnot", +/* 00ad */ "hyphen", +/* 00ae */ "registered", +/* 00af */ "macron", +/* 00b0 */ "degree", +/* 00b1 */ "plusminus", +/* 00b2 */ "twosuperior", +/* 00b3 */ "threesuperior", +/* 00b4 */ "acute", +/* 00b5 */ "mu", +/* 00b6 */ "paragraph", +/* 00b7 */ "periodcentered", +/* 00b8 */ "cedilla", +/* 00b9 */ "onesuperior", +/* 00ba */ "ordmasculine", +/* 00bb */ "guillemotright", +/* 00bc */ "onequarter", +/* 00bd */ "onehalf", +/* 00be */ "threequarters", +/* 00bf */ "questiondown", +/* 00c0 */ "Agrave", +/* 00c1 */ "Aacute", +/* 00c2 */ "Acircumflex", +/* 00c3 */ "Atilde", +/* 00c4 */ "Adieresis", +/* 00c5 */ "Aring", +/* 00c6 */ "AE", +/* 00c7 */ "Ccedilla", +/* 00c8 */ "Egrave", +/* 00c9 */ "Eacute", +/* 00ca */ "Ecircumflex", +/* 00cb */ "Edieresis", +/* 00cc */ "Igrave", +/* 00cd */ "Iacute", +/* 00ce */ "Icircumflex", +/* 00cf */ "Idieresis", +/* 00d0 */ "Eth", +/* 00d1 */ "Ntilde", +/* 00d2 */ "Ograve", +/* 00d3 */ "Oacute", +/* 00d4 */ "Ocircumflex", +/* 00d5 */ "Otilde", +/* 00d6 */ "Odieresis", +/* 00d7 */ "multiply", +/* 00d8 */ "Oslash", +/* 00d9 */ "Ugrave", +/* 00da */ "Uacute", +/* 00db */ "Ucircumflex", +/* 00dc */ "Udieresis", +/* 00dd */ "Yacute", +/* 00de */ "Thorn", +/* 00df */ "germandbls", +/* 00e0 */ "agrave", +/* 00e1 */ "aacute", +/* 00e2 */ "acircumflex", +/* 00e3 */ "atilde", +/* 00e4 */ "adieresis", +/* 00e5 */ "aring", +/* 00e6 */ "ae", +/* 00e7 */ "ccedilla", +/* 00e8 */ "egrave", +/* 00e9 */ "eacute", +/* 00ea */ "ecircumflex", +/* 00eb */ "edieresis", +/* 00ec */ "igrave", +/* 00ed */ "iacute", +/* 00ee */ "icircumflex", +/* 00ef */ "idieresis", +/* 00f0 */ "eth", +/* 00f1 */ "ntilde", +/* 00f2 */ "ograve", +/* 00f3 */ "oacute", +/* 00f4 */ "ocircumflex", +/* 00f5 */ "otilde", +/* 00f6 */ "odieresis", +/* 00f7 */ "divide", +/* 00f8 */ "oslash", +/* 00f9 */ "ugrave", +/* 00fa */ "uacute", +/* 00fb */ "ucircumflex", +/* 00fc */ "udieresis", +/* 00fd */ "yacute", +/* 00fe */ "thorn", +/* 00ff */ "ydieresis" + }; + copyenc(encoding,latin1enc); +} + +char *AdobeExpertEncoding[] = { +/* 0000 */ ".notdef", +/* 0001 */ ".notdef", +/* 0002 */ ".notdef", +/* 0003 */ ".notdef", +/* 0004 */ ".notdef", +/* 0005 */ ".notdef", +/* 0006 */ ".notdef", +/* 0007 */ ".notdef", +/* 0008 */ ".notdef", +/* 0009 */ ".notdef", +/* 000a */ ".notdef", +/* 000b */ ".notdef", +/* 000c */ ".notdef", +/* 000d */ ".notdef", +/* 000e */ ".notdef", +/* 000f */ ".notdef", +/* 0010 */ ".notdef", +/* 0011 */ ".notdef", +/* 0012 */ ".notdef", +/* 0013 */ ".notdef", +/* 0014 */ ".notdef", +/* 0015 */ ".notdef", +/* 0016 */ ".notdef", +/* 0017 */ ".notdef", +/* 0018 */ ".notdef", +/* 0019 */ ".notdef", +/* 001a */ ".notdef", +/* 001b */ ".notdef", +/* 001c */ ".notdef", +/* 001d */ ".notdef", +/* 001e */ ".notdef", +/* 001f */ ".notdef", +/* 0020 */ "space", +/* 0021 */ "exclamsmall", +/* 0022 */ "Hungarumlautsmal", +/* 0023 */ ".notdef", +/* 0024 */ "dollaroldstyle", +/* 0025 */ "dollarsuperior", +/* 0026 */ "ampersandsmall", +/* 0027 */ "Acutesmall", +/* 0028 */ "parenleftsuperior", +/* 0029 */ "parenrightsuperior", +/* 002a */ "twodotenleader", +/* 002b */ "onedotenleader", +/* 002c */ "comma", +/* 002d */ "hyphen", +/* 002e */ "period", +/* 002f */ "fraction", +/* 0030 */ "zerooldstyle", +/* 0031 */ "oneoldstyle", +/* 0032 */ "twooldstyle", +/* 0033 */ "threeoldstyle", +/* 0034 */ "fouroldstyle", +/* 0035 */ "fiveoldstyle", +/* 0036 */ "sixoldstyle", +/* 0037 */ "sevenoldstyle", +/* 0038 */ "eightoldstyle", +/* 0039 */ "nineoldstyle", +/* 003a */ "colon", +/* 003b */ "semicolon", +/* 003c */ "commasuperior", +/* 003d */ "threequartersemdash", +/* 003e */ "periodsuperior", +/* 003f */ "questionsmall", +/* 0040 */ ".notdef", +/* 0041 */ "asuperior", +/* 0042 */ "bsuperior", +/* 0043 */ "centsuperior", +/* 0044 */ "dsuperior", +/* 0045 */ "esuperior", +/* 0046 */ ".notdef", +/* 0047 */ ".notdef", +/* 0048 */ ".notdef", +/* 0049 */ "isuperior", +/* 004a */ ".notdef", +/* 004b */ ".notdef", +/* 004c */ "lsuperior", +/* 004d */ "msuperior", +/* 004e */ "nsuperior", +/* 004f */ "osuperior", +/* 0050 */ ".notdef", +/* 0051 */ ".notdef", +/* 0052 */ "rsuperior", +/* 0053 */ "ssuperior", +/* 0054 */ "tsuperior", +/* 0055 */ ".notdef", +/* 0056 */ "ff", +/* 0057 */ "fi", +/* 0058 */ "fl", +/* 0059 */ "ffi", +/* 005a */ "ffl", +/* 005b */ "parenleftinferior", +/* 005c */ ".notdef", +/* 005d */ "parenrightinferior", +/* 005e */ "Circumflexsmall", +/* 005f */ "hyphensuperior", +/* 0060 */ "Gravesmall", +/* 0061 */ "Asmall", +/* 0062 */ "Bsmall", +/* 0063 */ "Csmall", +/* 0064 */ "Dsmall", +/* 0065 */ "Esmall", +/* 0066 */ "Fsmall", +/* 0067 */ "Gsmall", +/* 0068 */ "Hsmall", +/* 0069 */ "Ismall", +/* 006a */ "Jsmall", +/* 006b */ "Ksmall", +/* 006c */ "Lsmall", +/* 006d */ "Msmall", +/* 006e */ "Nsmall", +/* 006f */ "Osmall", +/* 0070 */ "Psmall", +/* 0071 */ "Qsmall", +/* 0072 */ "Rsmall", +/* 0073 */ "Ssmall", +/* 0074 */ "Tsmall", +/* 0075 */ "Usmall", +/* 0076 */ "Vsmall", +/* 0077 */ "Wsmall", +/* 0078 */ "Xsmall", +/* 0079 */ "Ysmall", +/* 007a */ "Zsmall", +/* 007b */ "colonmonetary", +/* 007c */ "onefitted", +/* 007d */ "rupiah", +/* 007e */ "Tildesmall", +/* 007f */ ".notdef", +/* 0080 */ ".notdef", +/* 0081 */ ".notdef", +/* 0082 */ ".notdef", +/* 0083 */ ".notdef", +/* 0084 */ ".notdef", +/* 0085 */ ".notdef", +/* 0086 */ ".notdef", +/* 0087 */ ".notdef", +/* 0088 */ ".notdef", +/* 0089 */ ".notdef", +/* 008a */ ".notdef", +/* 008b */ ".notdef", +/* 008c */ ".notdef", +/* 008d */ ".notdef", +/* 008e */ ".notdef", +/* 008f */ ".notdef", +/* 0090 */ ".notdef", +/* 0091 */ ".notdef", +/* 0092 */ ".notdef", +/* 0093 */ ".notdef", +/* 0094 */ ".notdef", +/* 0095 */ ".notdef", +/* 0096 */ ".notdef", +/* 0097 */ ".notdef", +/* 0098 */ ".notdef", +/* 0099 */ ".notdef", +/* 009a */ ".notdef", +/* 009b */ ".notdef", +/* 009c */ ".notdef", +/* 009d */ ".notdef", +/* 009e */ ".notdef", +/* 009f */ ".notdef", +/* 00a0 */ ".notdef", +/* 00a1 */ "exclamdownsmall", +/* 00a2 */ "centoldstyle", +/* 00a3 */ "Lslashsmall", +/* 00a4 */ ".notdef", +/* 00a5 */ ".notdef", +/* 00a6 */ "Scaronsmall", +/* 00a7 */ "Zcaronsmall", +/* 00a8 */ "Dieresissmall", +/* 00a9 */ "Brevesmall", +/* 00aa */ "Caronsmall", +/* 00ab */ ".notdef", +/* 00ac */ "Dotaccentsmall", +/* 00ad */ ".notdef", +/* 00ae */ ".notdef", +/* 00af */ "Macronsmall", +/* 00b0 */ ".notdef", +/* 00b1 */ ".notdef", +/* 00b2 */ "figuredash", +/* 00b3 */ "hypheninferior", +/* 00b4 */ ".notdef", +/* 00b5 */ ".notdef", +/* 00b6 */ "Ogoneksmall", +/* 00b7 */ "Ringsmall", +/* 00b8 */ "Cedillasmall", +/* 00b9 */ ".notdef", +/* 00ba */ ".notdef", +/* 00bb */ ".notdef", +/* 00bc */ "onequarter", +/* 00bd */ "onehalf", +/* 00be */ "threequarters", +/* 00bf */ "questiondownsmall", +/* 00c0 */ "oneeighth", +/* 00c1 */ "threeeighths", +/* 00c2 */ "fiveeighths", +/* 00c3 */ "seveneighths", +/* 00c4 */ "onethird", +/* 00c5 */ "twothirds", +/* 00c6 */ ".notdef", +/* 00c7 */ ".notdef", +/* 00c8 */ "zerosuperior", +/* 00c9 */ "onesuperior", +/* 00ca */ "twosuperior", +/* 00cb */ "threesuperior", +/* 00cc */ "foursuperior", +/* 00cd */ "fivesuperior", +/* 00ce */ "sixsuperior", +/* 00cf */ "sevensuperior", +/* 00d0 */ "eightsuperior", +/* 00d1 */ "ninesuperior", +/* 00d2 */ "zeroinferior", +/* 00d3 */ "oneinferior", +/* 00d4 */ "twoinferior", +/* 00d5 */ "threeinferior", +/* 00d6 */ "fourinferior", +/* 00d7 */ "fiveinferior", +/* 00d8 */ "sixinferior", +/* 00d9 */ "seveninferior", +/* 00da */ "eightinferior", +/* 00db */ "nineinferior", +/* 00dc */ "centinferior", +/* 00dd */ "dollarinferior", +/* 00de */ "periodinferior", +/* 00df */ "commainferior", +/* 00e0 */ "Agravesmall", +/* 00e1 */ "Aacutesmall", +/* 00e2 */ "Acircumflexsmall", +/* 00e3 */ "Atildesmall", +/* 00e4 */ "Adieresissmall", +/* 00e5 */ "Aringsmall", +/* 00e6 */ "AEsmall", +/* 00e7 */ "Ccedillasmall", +/* 00e8 */ "Egravesmall", +/* 00e9 */ "Eacutesmall", +/* 00ea */ "Ecircumflexsmall", +/* 00eb */ "Edieresissmall", +/* 00ec */ "Igravesmall", +/* 00ed */ "Iacutesmall", +/* 00ee */ "Icircumflexsmall", +/* 00ef */ "Idieresissmall", +/* 00f0 */ "Ethsmall", +/* 00f1 */ "Ntildesmall", +/* 00f2 */ "Ogravesmall", +/* 00f3 */ "Oacutesmall", +/* 00f4 */ "Ocircumflexsmall", +/* 00f5 */ "Otildesmall", +/* 00f6 */ "Odieresissmall", +/* 00f7 */ "OEsmall", +/* 00f8 */ "Oslashsmall", +/* 00f9 */ "Ugravesmall", +/* 00fa */ "Uacutesmall", +/* 00fb */ "Ucircumflexsmall", +/* 00fc */ "Udieresissmall", +/* 00fd */ "Yacutesmall", +/* 00fe */ "Thornsmall", +/* 00ff */ "Ydieresissmall" +}; + +static struct fontdict *MakeEmptyFont(void) { + struct fontdict *ret; + + ret = gcalloc(1,sizeof(struct fontdict)); + ret->fontinfo = gcalloc(1,sizeof(struct fontinfo)); + ret->chars = gcalloc(1,sizeof(struct pschars)); + ret->private = gcalloc(1,sizeof(struct private)); + ret->private->subrs = gcalloc(1,sizeof(struct pschars)); + ret->private->private = gcalloc(1,sizeof(struct psdict)); + ret->private->leniv = 4; + ret->encoding_name = em_none; + ret->fontinfo->fstype = -1; +return( ret ); +} + +static struct fontdict *PSMakeEmptyFont(void) { + struct fontdict *ret; + + ret = gcalloc(1,sizeof(struct fontdict)); + ret->fontinfo = gcalloc(1,sizeof(struct fontinfo)); + ret->chars = gcalloc(1,sizeof(struct pschars)); + ret->private = gcalloc(1,sizeof(struct private)); + ret->private->subrs = gcalloc(1,sizeof(struct pschars)); + ret->private->private = gcalloc(1,sizeof(struct psdict)); + ret->private->leniv = 4; + ret->charprocs = gcalloc(1,sizeof(struct charprocs)); + ret->encoding_name = em_none; + ret->fontinfo->fstype = -1; +return( ret ); +} + +static char *myfgets(char *str, int len, FILE *file) { + char *pt, *end; + int ch=0; + + for ( pt = str, end = str+len-1; pt0); ++end ) { + if ( *end=='\\' && (end[1]=='(' || end[1]==')')) + ++end; + else if ( *end=='(' ) ++parencnt; + else if ( *end==')' ) --parencnt; + } + if ( end>start ) { + if ( ret==NULL ) + ret = galloc(end-start+1); + else + ret = grealloc(ret,len+end-start); + strncpy(ret+len-1,start,end-start); + len += end-start; + ret[len-1] = '\0'; + } + if ( *end!='\0' ) + break; + if ( myfgets(buffer,sizeof(buffer),in)==NULL ) +return( ret ); + start = buffer; + } +return( ret ); +} + +static char *gettoken(char *start) { + char *end, *ret; + + while ( *start!='\0' && *start!='/' ) ++start; + if ( *start=='/' ) ++start; + for ( end = start; *end!='\0' && !isspace(*end) && *end!='[' && *end!='/' && *end!='{' && *end!='(' ; ++end ); + ret = galloc(end-start+1); + if ( end>start ) + strncpy(ret,start,end-start); + ret[end-start] = '\0'; +return( ret ); +} + +static int getbool(char *start) { + + while ( isspace(*start) ) ++start; + if ( *start=='T' || *start=='t' ) +return( 1 ); + +return( 0 ); +} + +static void fillintarray(int *array,char *start,int maxentries) { + int i; + char *end; + + while ( *start!='\0' && *start!='[' && *start!='{' ) ++start; + if ( *start=='[' || *start=='{' ) ++start; + for ( i=0; i=2 ) { + /* Some of Luc Devroye's fonts have a "div" in the FontMatrix */ + array[i-2] /= array[i-1]; + i -= 2; + end = start+3; + } else +return; + if ( start==end ) +return; + start = end; + while ( isspace(*start) ) ++start; + } +} + +static void InitDict(struct psdict *dict,char *line) { + while ( *line!='/' && *line!='\0' ) ++line; + while ( !isspace(*line) && *line!='\0' ) ++line; + dict->cnt += strtol(line,NULL,10); + if ( dict->next>0 ) { int i; /* Shouldn't happen, but did in a bad file */ + dict->keys = grealloc(dict->keys,dict->cnt*sizeof(char *)); + dict->values = grealloc(dict->values,dict->cnt*sizeof(char *)); + for ( i=dict->next; icnt; ++i ) { + dict->keys[i] = NULL; dict->values[i] = NULL; + } + } else { + dict->keys = gcalloc(dict->cnt,sizeof(char *)); + dict->values = gcalloc(dict->cnt,sizeof(char *)); + } +} + +static void InitChars(struct pschars *chars,char *line) { + while ( *line!='/' && *line!='\0' ) ++line; + while ( !isspace(*line) && *line!='\0' ) ++line; + chars->cnt = strtol(line,NULL,10); + if ( chars->cnt>0 ) { + chars->keys = gcalloc(chars->cnt,sizeof(char *)); + chars->values = gcalloc(chars->cnt,sizeof(char *)); + chars->lens = gcalloc(chars->cnt,sizeof(int)); + GProgressChangeTotal(chars->cnt); + } +} + +static void InitCharProcs(struct charprocs *cp, char *line) { + while ( *line!='/' && *line!='\0' ) ++line; + while ( !isspace(*line) && *line!='\0' ) ++line; + cp->cnt = strtol(line,NULL,10); + if ( cp->cnt>0 ) { + cp->keys = gcalloc(cp->cnt,sizeof(char *)); + cp->values = gcalloc(cp->cnt,sizeof(SplineChar *)); + GProgressChangeTotal(cp->cnt); + } +} + +static int mycmp(char *str,char *within, char *end ) { + while ( withininstring && fp->depth==0 && + (strncmp(line,"def",3)==0 || + strncmp(line,"|-",2)==0 || strncmp(line,"ND",2)==0)) { + while ( 1 ) { + while ( fp->vpt>fp->vbuf+1 && isspace(fp->vpt[-1]) ) + --fp->vpt; + if ( fp->vpt>fp->vbuf+8 && strncmp(fp->vpt-8,"noaccess",8)==0 ) + fp->vpt -= 8; + else if ( fp->vpt>fp->vbuf+8 && strncmp(fp->vpt-8,"readonly",8)==0 ) + fp->vpt -= 8; + else if ( fp->vpt>fp->vbuf+4 && strncmp(fp->vpt-4,"bind",4)==0 ) + fp->vpt -= 4; + else + break; + } + /* In some URW fonts (Nimbus Sans L, n019003l) we get a complex */ + /* expression rather than just an array. This is ok. The expression */ + /* converts itself into an array. We could just truncate to the */ + /* default array, but I don't see any reason to do so */ + if ( fp->pending_parse!=NULL ) { + *fp->pending_parse = copyn(fp->vbuf,fp->vpt-fp->vbuf); + fp->pending_parse = NULL; + } else { + dict->values[dict->next] = copyn(fp->vbuf,fp->vpt-fp->vbuf); + ++dict->next; + } + fp->vpt = fp->vbuf; + fp->multiline = false; +return; + } + if ( fp->vpt>=fp->vmax ) { + int len = fp->vmax-fp->vbuf+1000, off=fp->vpt-fp->vbuf; + fp->vbuf = grealloc(fp->vbuf,len); + fp->vpt = fp->vbuf+off; + fp->vmax = fp->vbuf+len; + } + if ( fp->instring ) { + if ( *line==')' ) --fp->instring; + } else if ( incomment ) { + /* Do Nothing */; + } else if ( *line=='(' ) + ++fp->instring; + else if ( *line=='%' ) + incomment = true; + else if ( *line=='[' || *line=='{' ) + ++fp->depth; + else if ( *line=='}' || *line==']' ) + --fp->depth; + *fp->vpt++ = *line++; + } +} + +static void AddValue(struct fontparse *fp, struct psdict *dict, char *line, char *endtok) { + char *pt; + + if ( dict!=NULL ) { + if ( dict->next>=dict->cnt ) { + dict->cnt += 10; + dict->keys = grealloc(dict->keys,dict->cnt*sizeof(char *)); + dict->values = grealloc(dict->values,dict->cnt*sizeof(char *)); + } + dict->keys[dict->next] = copyn(line+1,endtok-(line+1)); + } + pt = line+strlen(line)-1; + while ( isspace(*endtok)) ++endtok; + while ( pt>endtok && isspace(*pt)) --pt; + ++pt; + if ( strncmp(pt-3,"def",3)==0 ) + pt -= 3; + else if ( strncmp(pt-2,"|-",2)==0 || strncmp(pt-2,"ND",2)==0 ) + pt -= 2; + else { + fp->multiline = true; + ContinueValue(fp,dict,endtok); +return; + } + forever { + while ( pt-1>endtok && isspace(pt[-1])) --pt; + if ( pt-8>endtok && strncmp(pt-8,"noaccess",8)==0 ) + pt -= 8; + else if ( pt-8>endtok && strncmp(pt-8,"readonly",8)==0 ) + pt -= 8; + else if ( pt-4>endtok && strncmp(pt-4,"bind",4)==0 ) + pt -= 4; + else + break; + } + if ( dict!=NULL ) { + dict->values[dict->next] = copyn(endtok,pt-endtok); + ++dict->next; + } else { + *fp->pending_parse = copyn(endtok,pt-endtok); + fp->pending_parse = NULL; + } +} + +static int hex(int ch1, int ch2) { + if ( ch1>='0' && ch1<='9' ) + ch1 -= '0'; + else if ( ch1>='a' ) + ch1 -= 'a'-10; + else + ch1 -= 'A'-10; + if ( ch2>='0' && ch2<='9' ) + ch2 -= '0'; + else if ( ch2>='a' ) + ch2 -= 'a'-10; + else + ch2 -= 'A'-10; +return( (ch1<<4)|ch2 ); +} + +unsigned short r; +#define c1 52845 +#define c2 22719 + +static void initcode(void) { + r = 55665; +} + +static int decode(unsigned char cypher) { + unsigned char plain = ( cypher ^ (r>>8)); + r = (cypher + r) * c1 + c2; +return( plain ); +} + +static void dumpzeros(FILE *out, unsigned char *zeros, int zcnt) { + while ( --zcnt >= 0 ) + fputc(*zeros++,out); +} + +static void decodestr(unsigned char *str, int len) { + unsigned short r = 4330; + unsigned char plain, cypher; + + while ( len-->0 ) { + cypher = *str; + plain = ( cypher ^ (r>>8)); + r = (cypher + r) * c1 + c2; + *str++ = plain; + } +} + +static void findstring(struct fontparse *fp,struct pschars *subrs,int index,char *nametok,char *str) { + char buffer[1024], *bpt, *bs, *end = buffer+sizeof(buffer)-1; + int val; + + while ( isspace(*str)) ++str; + if ( *str=='(' ) { + ++str; + bpt = buffer; + while ( *str!=')' ) { + if ( *str!='\\' ) + val = *str++; + else { + if ( isdigit( *++str )) { + val = *str++-'0'; + if ( isdigit( *str )) { + val = (val<<3) | (*str++-'0'); + if ( isdigit( *str )) + val = (val<<3) | (*str++-'0'); + } + } else + val = *str++; + } + if ( bptfd->private->leniv; + subrs->lens[index] = bpt-bs; + subrs->keys[index] = copy(nametok); + subrs->values[index] = galloc(bpt-bs); + memcpy(subrs->values[index],bs,bpt-bs); + if ( index>=subrs->next ) subrs->next = index+1; + } +} + +static char *rmbinary(char *line) { + char *pt; + + for ( pt=line; *pt; ++pt ) { + if (( *pt<' ' || *pt>=0x7f ) && *pt!='\n' ) { + if ( strlen(pt)>5 ) { + pt[0] = '.'; + pt[1] = '.'; + pt[2] = '.'; + pt[3] = '\n'; + pt[4] = '\0'; + } else { + pt[0] = '\n'; + pt[1] = '\0'; + } + break; + } + } +return( line ); +} + +static void parseline(struct fontparse *fp,char *line,FILE *in) { + char buffer[200], *pt, *endtok; + + while ( *line==' ' || *line=='\t' ) ++line; + if ( line[0]=='%' && !fp->multiline ) +return; + + if ( fp->inencoding && strncmp(line,"dup",3)==0 ) { + /* Metamorphasis has multiple entries on a line */ + while ( strncmp(line,"dup",3)==0 ) { + char *end; + int pos = strtol(line+3,&end,10); + line = end; + while ( isspace( *line )) ++line; + if ( *line=='/' ) ++line; + for ( pt = buffer; !isspace(*line); *pt++ = *line++ ); + *pt = '\0'; + if ( pos>=0 && pos<256 ) + fp->fd->encoding[pos] = copy(buffer); + while ( isspace(*line)) ++line; + if ( strncmp(line,"put",3)==0 ) line+=3; + while ( isspace(*line)) ++line; + } +return; + } else if ( fp->inencoding && strstr(line,"for")!=NULL && strstr(line,"/.notdef")!=NULL ) { + /* the T1 spec I've got doesn't allow for this, but I've seen it anyway*/ + /* 0 1 255 {1 index exch /.notdef put} for */ + /* 0 1 31 { 1 index exch /.notdef put } bind for */ + int i; + for ( i=0; i<256; ++i ) + if ( fp->fd->encoding[i]==NULL ) + fp->fd->encoding[i] = copy(".notdef"); +return; + } else if ( fp->inencoding && strstr(line,"Encoding")!=NULL && strstr(line,"put")!=NULL ) { + /* Saw a type 3 font with lines like "Encoding 1 /_a0 put" */ + char *end; + int pos; + while ( isspace(*line)) ++line; + if ( strncmp(line,"Encoding ",9)==0 ) { + line+=9; + pos = strtol(line,&end,10); + line = end; + while ( isspace(*line)) ++line; + if ( *line=='/' ) { + ++line; + for ( pt = buffer; !isspace(*line); *pt++ = *line++ ); + *pt = '\0'; + if ( pos>=0 && pos<256 ) + fp->fd->encoding[pos] = copy(buffer); + } + } +return; + } else if ( fp->insubs ) { + struct pschars *subrs = fp->fd->private->subrs; + while ( isspace(*line)) ++line; + if ( strncmp(line,"dup ",4)==0 ) { + int i; + char *ept; + for ( line += 4; *line==' '; ++line ); + i = strtol(line,&ept,10); + if ( fp->ignore ) + /* Do Nothing */; + else if ( icnt ) { + findstring(fp,subrs,i,NULL,ept); + } else if ( !fp->alreadycomplained ) { + fprintf( stderr, "Index too big (must be <%d) |%s", subrs->cnt, rmbinary(line)); + fp->alreadycomplained = true; + } + } else if ( strncmp(line, "readonly put", 12)==0 || strncmp(line, "ND", 2)==0 || strncmp(line, "|-", 2)==0 ) { + fp->insubs = false; + fp->ignore = false; + } else if ( *line=='\n' || *line=='\0' ) { + /* Ignore blank lines */; + } else if ( !fp->alreadycomplained ) { + fprintf( stderr, "Didn't understand |%s", rmbinary(line) ); + fp->alreadycomplained = true; + } + } else if ( fp->inchars ) { + struct pschars *chars = fp->fd->chars; + while ( isspace(*line)) ++line; + if ( strncmp(line,"end",3)==0 ) + fp->ignore = fp->inchars = false; + else if ( *line!='\n' || *line=='\0' ) + /* Ignore it */; + else if ( *line!='/' || !(isalpha(line[1]) || line[1]=='.')) { + fprintf( stderr, "No name for CharStrings dictionary |%s", rmbinary(line) ); + fp->alreadycomplained = true; + } else if ( fp->ignore ) { + /* Do Nothing */; + } else if ( chars->next>=chars->cnt ) + fprintf( stderr, "Too many entries in CharStrings dictionary |%s", rmbinary(line) ); + else { + int i = chars->next; + char *namestrt = ++line; + while ( isalnum(*line) || *line=='.' ) ++line; + *line = '\0'; + findstring(fp,chars,i,namestrt,line+1); + GProgressNext(); + } + } + fp->inencoding = 0; + + while ( isspace(*line)) ++line; + endtok = NULL; + if ( *line=='/' ) + for ( endtok=line+1; !isspace(*endtok) && *endtok!='(' && + *endtok!='{' && *endtok!='[' && *endtok!='\0'; ++endtok ); + + if ( strstr(line,"/shareddict")!=NULL && strstr(line,"where")!=NULL ) { + fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->inprivate = fp->inblendprivate = fp->inblendfi = false; + fp->skipping_mbf = true; +return; + } + + if ( mycmp("Encoding",line+1,endtok)==0 && !fp->doneencoding ) { + if ( strstr(endtok,"StandardEncoding")!=NULL ) { + fp->fd->encoding_name = em_adobestandard; + setStdEnc(fp->fd->encoding); + } else if ( strstr(endtok,"ISOLatin1Encoding")!=NULL ) { + fp->fd->encoding_name = em_iso8859_1; + setLatin1Enc(fp->fd->encoding); + } else { + fp->fd->encoding_name = em_none; + fp->inencoding = 1; + } + fp->infi = fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->doneencoding = true; + } else if ( mycmp("BoundingBoxes",line+1,endtok)==0 ) { + fp->infi = fp->inprivate = fp->inencoding = fp->inmetrics = fp->inmetrics2 = false; + fp->inbb = true; + } else if ( mycmp("Metrics",line+1,endtok)==0 ) { + fp->infi = fp->inprivate = fp->inbb = fp->inencoding = fp->inmetrics2 = false; + fp->inmetrics = true; + fp->fd->metrics = gcalloc(1,sizeof(struct psdict)); + fp->fd->metrics->cnt = strtol(endtok,NULL,10); + fp->fd->metrics->keys = galloc(fp->fd->metrics->cnt*sizeof(char *)); + fp->fd->metrics->values = galloc(fp->fd->metrics->cnt*sizeof(char *)); + } else if ( strstr(line,"/Private")!=NULL && strstr(line,"/Blend")!=NULL ) { + fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->inprivate = fp->inblendprivate = fp->inblendfi = false; + fp->inblendprivate = 1; + fp->fd->blendprivate = gcalloc(1,sizeof(struct psdict)); + InitDict(fp->fd->blendprivate,line); +return; + } else if ( strstr(line,"/FontInfo")!=NULL && strstr(line,"/Blend")!=NULL ) { + fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->inprivate = fp->inblendprivate = fp->inblendfi = false; + fp->inblendfi = 1; + fp->fd->blendfontinfo = gcalloc(1,sizeof(struct psdict)); + InitDict(fp->fd->blendfontinfo,line); +return; + } else if ( fp->infi ) { + if ( fp->multiline ) { + ContinueValue(fp,NULL,line); +return; + } + if ( endtok==NULL && strncmp(line,"end", 3)==0 ) { + fp->infi=0; +return; + } else if ( endtok==NULL ) +return; + if ( mycmp("version",line+1,endtok)==0 ) + fp->fd->fontinfo->version = getstring(endtok,in); + else if ( mycmp("Notice",line+1,endtok)==0 ) { + if ( fp->fd->fontinfo->notice!=NULL ) + free(fp->fd->fontinfo->notice); + fp->fd->fontinfo->notice = getstring(endtok,in); + } else if ( mycmp("Copyright",line+1,endtok)==0 ) { /* cff spec allows for copyright and notice */ + if ( fp->fd->fontinfo->notice!=NULL ) + free(fp->fd->fontinfo->notice); + fp->fd->fontinfo->notice = getstring(endtok,in); + } else if ( mycmp("FullName",line+1,endtok)==0 ) { + if ( fp->fd->fontinfo->fullname==NULL ) + fp->fd->fontinfo->fullname = getstring(endtok,in); + else + getstring(endtok,in); + } else if ( mycmp("FamilyName",line+1,endtok)==0 ) + fp->fd->fontinfo->familyname = getstring(endtok,in); + else if ( mycmp("Weight",line+1,endtok)==0 ) + fp->fd->fontinfo->weight = getstring(endtok,in); + else if ( mycmp("ItalicAngle",line+1,endtok)==0 ) + fp->fd->fontinfo->italicangle = strtod(endtok,NULL); + else if ( mycmp("UnderlinePosition",line+1,endtok)==0 ) + fp->fd->fontinfo->underlineposition = strtod(endtok,NULL); + else if ( mycmp("UnderlineThickness",line+1,endtok)==0 ) + fp->fd->fontinfo->underlinethickness = strtod(endtok,NULL); + else if ( mycmp("isFixedPitch",line+1,endtok)==0 ) + fp->fd->fontinfo->isfixedpitch = getbool(endtok); + else if ( mycmp("em",line+1,endtok)==0 ) + fp->fd->fontinfo->em = strtol(endtok,NULL,10); + else if ( mycmp("ascent",line+1,endtok)==0 ) + fp->fd->fontinfo->ascent = strtol(endtok,NULL,10); + else if ( mycmp("descent",line+1,endtok)==0 ) + fp->fd->fontinfo->descent = strtol(endtok,NULL,10); + else if ( mycmp("FSType",line+1,endtok)==0 ) + fp->fd->fontinfo->fstype = strtol(endtok,NULL,10); + else if ( mycmp("BlendDesignPositions",line+1,endtok)==0 ) { + fp->pending_parse = &fp->fd->fontinfo->blenddesignpositions; + AddValue(fp,NULL,line,endtok); + } else if ( mycmp("BlendDesignMap",line+1,endtok)==0 ) { + fp->pending_parse = &fp->fd->fontinfo->blenddesignmap; + AddValue(fp,NULL,line,endtok); + } else if ( mycmp("BlendAxisTypes",line+1,endtok)==0 ) { + fp->pending_parse = &fp->fd->fontinfo->blendaxistypes; + AddValue(fp,NULL,line,endtok); + } else if ( !fp->alreadycomplained ) { + fprintf( stderr, "Didn't understand |%s", rmbinary(line) ); + fp->alreadycomplained = true; + } + } else if ( fp->inblend ) { + if ( endtok==NULL ) { + if ( *line!='/' && strstr(line,"end")!=NULL ) + fp->inblend = false; +return; + } + /* Ignore anything in the blend dict defn */ + } else if ( fp->inblendprivate || fp->inblendfi ) { + struct psdict *subdict = fp->inblendfi ? fp->fd->blendfontinfo : fp->fd->blendprivate; + if ( fp->multiline ) { + ContinueValue(fp,subdict,line); +return; + } else if ( endtok==NULL ) { + if ( *line!='/' && strstr(line,"end")!=NULL ) { + fp->inblendprivate = fp->inblendfi = false; + fp->inprivate = true; + } +return; + } else + AddValue(fp,subdict,line,endtok); + } else if ( fp->inprivate ) { + if ( strstr(line,"/CharStrings")!=NULL && strstr(line,"dict")!=NULL ) { + if ( fp->fd->chars->next==0 ) { + InitChars(fp->fd->chars,line); + fp->ignore = false; + } else { + fp->ignore = true; + fprintf( stderr, "Ignoring duplicate /CharStrings entry\n" ); + } + fp->inchars = 1; + fp->insubs = 0; +return; + } else if ( strstr(line,"/Subrs")!=NULL ) { + if ( fp->fd->private->subrs->next>0 ) { + fp->ignore = true; + fprintf( stderr, "Ignoring duplicate /Subrs entry\n" ); + } else { + InitChars(fp->fd->private->subrs,line); + fp->ignore = false; + } + fp->insubs = 1; + fp->inchars = 0; +return; + } else if ( fp->multiline ) { + ContinueValue(fp,fp->fd->private->private,line); +return; + } + if ( endtok==NULL ) { + char *pt = line; + if ( *pt!='/' ) while ( (pt=strstr(pt,"end"))!=NULL ) { + if ( fp->inchars ) fp->inchars = false; + else fp->inprivate = false; + pt += 3; + } +return; + } + if ( mycmp("ND",line+1,endtok)==0 || mycmp("|-",line+1,endtok)==0 || + mycmp("NP",line+1,endtok)==0 || mycmp("|",line+1,endtok)==0 || + mycmp("RD",line+1,endtok)==0 || mycmp("-|",line+1,endtok)==0 || + mycmp("password",line+1,endtok)==0 || + mycmp("MinFeature",line+1,endtok)==0 ) + /* These conveigh no information, but are required */; + else if ( mycmp("UniqueID",line+1,endtok)==0 ) { + if ( fp->fd->uniqueid==0 ) + fp->fd->uniqueid = strtol(endtok,NULL,10); + } else { + if ( mycmp("lenIV",line+1,endtok)==0 ) + fp->fd->private->leniv = strtol(endtok,NULL,10); /* We need this value */ + AddValue(fp,fp->fd->private->private,line,endtok); + } + } else if ( fp->incidsysteminfo ) { + if ( endtok==NULL && strncmp(line,"end", 3)==0 ) { + fp->incidsysteminfo=0; +return; + } else if ( endtok==NULL ) +return; + if ( mycmp("Registry",line+1,endtok)==0 ) + fp->fd->registry = getstring(endtok,in); + else if ( mycmp("Ordering",line+1,endtok)==0 ) + fp->fd->ordering = getstring(endtok,in); + else if ( mycmp("Supplement",line+1,endtok)==0 ) /* cff spec allows for copyright and notice */ + fp->fd->supplement = strtol(endtok,NULL,0); + } else { + if ( strstr(line,"/Private")!=NULL && strstr(line,"dict")!=NULL ) { + fp->infi = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->inprivate = fp->inblendprivate = fp->inblendfi = false; + if ( strstr(line,"/Blend")!=NULL ) { + fp->inblendprivate = 1; + fp->fd->blendprivate = gcalloc(1,sizeof(struct psdict)); + InitDict(fp->fd->blendprivate,line); + } else { + fp->inprivate = 1; + InitDict(fp->fd->private->private,line); + } +return; + } else if ( strstr(line,"/FontInfo")!=NULL && strstr(line,"dict")!=NULL ) { + fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->infi = fp->inblendprivate = fp->inblendfi = false; + if ( strstr(line,"/Blend")!=NULL ) { + fp->inblendfi = 1; + fp->fd->blendfontinfo = gcalloc(1,sizeof(struct psdict)); + InitDict(fp->fd->blendfontinfo,line); + } else { + fp->infi = 1; + } +return; + } else if ( strstr(line,"/Blend")!=NULL && strstr(line,"dict")!=NULL ) { + fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->infi = fp->inblendprivate = fp->inblendfi = false; + fp->inblend = true; +return; + } else if ( strstr(line,"/CharStrings")!=NULL && strstr(line,"dict")!=NULL ) { + if ( fp->fd->chars->next==0 ) { + InitChars(fp->fd->chars,line); + fp->ignore = false; + } else { + fp->ignore = true; + fprintf( stderr, "Ignoring duplicate /CharStrings entry\n" ); + } + fp->inchars = 1; + fp->insubs = 0; + fp->infi = fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->inblendprivate = fp->inblendfi = false; +return; + } else if ( mycmp("/CharProcs",line,endtok)==0 ) { + InitCharProcs(fp->fd->charprocs,line); + fp->infi = fp->inprivate = fp->inbb = fp->inmetrics = fp->inmetrics2 = false; + fp->insubs = 0; +return; + } else if ( strstr(line,"/CIDSystemInfo")!=NULL ) { + fp->incidsysteminfo = 1; +return; + } else if ( fp->inmetrics ) { + if ( endtok!=NULL ) + AddValue(fp,fp->fd->metrics,line,endtok); +return; + } else if ( fp->inbb ) { + /* Ignore it */; +return; + } + + if ( fp->multiline ) { + ContinueValue(fp,NULL,line); +return; + } + + if ( endtok==NULL ) { + if ( fp->skipping_mbf ) + ; + else if ( fp->fdindex!=-1 && strstr(line,"end")!=NULL ) { + if ( ++fp->fdindex>=fp->mainfd->fdcnt ) + fp->fd = fp->mainfd; + else + fp->fd = fp->mainfd->fds[fp->fdindex]; + } +return; + } + if ( mycmp("FontName",line+1,endtok)==0 ) { + if ( fp->fd->fontname==NULL ) + fp->fd->fontname = gettoken(endtok); + else + gettoken(endtok); /* skip it */ + } else if ( mycmp("PaintType",line+1,endtok)==0 ) + fp->fd->painttype = strtol(endtok,NULL,10); + else if ( mycmp("FontType",line+1,endtok)==0 ) + fp->fd->fonttype = strtol(endtok,NULL,10); + else if ( mycmp("FontMatrix",line+1,endtok)==0 ) { + if ( fp->fd->fontmatrix[0]==0 ) + fillrealarray(fp->fd->fontmatrix,endtok,6); + else { + real temp[6]; + fillrealarray(temp,endtok,6); + } + } else if ( mycmp("LanguageLevel",line+1,endtok)==0 ) + fp->fd->languagelevel = strtol(endtok,NULL,10); + else if ( mycmp("WMode",line+1,endtok)==0 ) + fp->fd->wmode = strtol(endtok,NULL,10); + else if ( mycmp("FontBBox",line+1,endtok)==0 ) + fillrealarray(fp->fd->fontbb,endtok,4); + else if ( mycmp("UniqueID",line+1,endtok)==0 ) { + if ( fp->fd->uniqueid==0 ) + fp->fd->uniqueid = strtol(endtok,NULL,10); + } else if ( mycmp("UniqueId",line+1,endtok)==0 ) { + fprintf(stderr,"This font contains a \"UniqueId\" variable, but the correct name for it is\n\t\"UniqueID\" (postscript is case concious)\n" ); + if ( fp->fd->uniqueid==0 ) + fp->fd->uniqueid = strtol(endtok,NULL,10); + } else if ( mycmp("XUID",line+1,endtok)==0 ) { + if ( fp->fd->xuid[0]==0 ) + fillintarray(fp->fd->xuid,endtok,20); + } else if ( mycmp("StrokeWidth",line+1,endtok)==0 ) + fp->fd->strokewidth = strtod(endtok,NULL); + else if ( mycmp("WeightVector",line+1,endtok)==0 ) { + fp->pending_parse = &fp->fd->weightvector; + AddValue(fp,NULL,line,endtok); + } else if ( mycmp("$Blend",line+1,endtok)==0 ) { + fp->pending_parse = &fp->fd->blendfunc; + AddValue(fp,NULL,line,endtok); + } else if ( strstr( line,"/NormalizeDesignVector" )!=NULL ) { + fp->pending_parse = &fp->fd->ndv; + AddValue(fp,NULL,line,endtok); + } else if ( strstr( line,"/ConvertDesignVector" )!=NULL ) { + fp->pending_parse = &fp->fd->cdv; + AddValue(fp,NULL,line,endtok); + } else if ( mycmp("BuildChar",line+1,endtok)==0 ) + /* Do Nothing */; + else if ( mycmp("BuildGlyph",line+1,endtok)==0 ) + /* Do Nothing */; + else if ( mycmp("CIDFontName",line+1,endtok)==0 ) + fp->fd->cidfontname = gettoken(endtok); + else if ( mycmp("CIDFontVersion",line+1,endtok)==0 ) { + fp->fd->cidversion = strtod(endtok,NULL); +#if 0 + if ( fp->fd->fontinfo->version==NULL ) { + char temp[40]; + sprintf(temp,"%f", fp->fd->cidversion); + fp->fd->fontinfo->version = copy(temp); + } +#endif + } else if ( mycmp("CIDFontType",line+1,endtok)==0 ) + fp->fd->cidfonttype = strtol(endtok,NULL,10); + else if ( mycmp("UIDBase",line+1,endtok)==0 ) + fp->fd->uniqueid = strtol(endtok,NULL,10); + else if ( mycmp("CIDMapOffset",line+1,endtok)==0 ) + fp->fd->mapoffset = strtol(endtok,NULL,10); + else if ( mycmp("FDBytes",line+1,endtok)==0 ) + fp->fd->fdbytes = strtol(endtok,NULL,10); + else if ( mycmp("GDBytes",line+1,endtok)==0 ) + fp->fd->gdbytes = strtol(endtok,NULL,10); + else if ( mycmp("CIDCount",line+1,endtok)==0 ) + fp->fd->cidcnt = strtol(endtok,NULL,10); + else if ( mycmp("FDArray",line+1,endtok)==0 ) { int i; + fp->mainfd = fp->fd; + fp->fd->fdcnt = strtol(endtok,NULL,10); + fp->fd->fds = gcalloc(fp->fd->fdcnt,sizeof(struct fontdict *)); + for ( i=0; ifd->fdcnt; ++i ) + fp->fd->fds[i] = MakeEmptyFont(); + fp->fdindex = 0; + fp->fd = fp->fd->fds[0]; + } else if ( mycmp("FontSetInit",line+1,endtok)==0 ) { + fp->iscff = true; + fp->iscid = false; + } else if ( mycmp("CIDInit",line+1,endtok)==0 ) { + fp->iscid = true; + fp->iscff = false; + } else if ( fp->skipping_mbf ) { /* Skip over the makeblendedfont defn in a multimaster font */ + /* Do Nothing */ + } else if ( !fp->alreadycomplained ) { + fprintf( stderr, "Didn't understand |%s", rmbinary(line) ); + fp->alreadycomplained = true; + } + } +} + +static void addinfo(struct fontparse *fp,char *line,char *tok,char *binstart,int binlen,FILE *in) { + char *pt; + + decodestr((unsigned char *) binstart,binlen); + binstart += fp->fd->private->leniv; + binlen -= fp->fd->private->leniv; + + retry: + if ( fp->insubs ) { + struct pschars *chars = /*fp->insubs ?*/ fp->fd->private->subrs /*: fp->fd->private->othersubrs*/; + while ( isspace(*line)) ++line; + if ( strncmp(line,"dup ",4)==0 ) { + int i = strtol(line+4,NULL,10); + if ( fp->ignore ) + /* Do Nothing */; + else if ( icnt ) { + if ( chars->values[i]!=NULL ) + fprintf( stderr, "Duplicate definition of subroutine %d\n", i ); + chars->lens[i] = binlen; + chars->values[i] = galloc(binlen); + memcpy(chars->values[i],binstart,binlen); + if ( i>=chars->next ) chars->next = i+1; + } else if ( !fp->alreadycomplained ) { + fprintf( stderr, "Index too big (must be <%d) |%s", chars->cnt, rmbinary(line)); + fp->alreadycomplained = true; + } + } else if ( !fp->alreadycomplained ) { + fprintf( stderr, "Didn't understand |%s", rmbinary(line) ); + fp->alreadycomplained = true; + } + } else if ( fp->inchars ) { + struct pschars *chars = fp->fd->chars; + if ( *tok=='\0' ) + fprintf( stderr, "No name for CharStrings dictionary |%s", rmbinary(line) ); + else if ( fp->ignore ) + /* Do Nothing */; + else if ( chars->next>=chars->cnt ) + fprintf( stderr, "Too many entries in CharStrings dictionary |%s", rmbinary(line) ); + else { + int i = chars->next; + chars->lens[i] = binlen; + chars->keys[i] = copy(tok); + chars->values[i] = galloc(binlen); + memcpy(chars->values[i],binstart,binlen); + ++chars->next; + GProgressNext(); + } + } else if ( !fp->alreadycomplained ) { + /* Special hacks for known badly formatted fonts */ + if ( strstr(line,"/CharStrings")!=NULL ) { + for ( pt=line; *pt!='/'; ++pt ); + pt = strchr(pt+1,'/'); + if ( pt!=NULL ) + *pt = '\0'; + parseline(fp,line,in); + if ( pt!=NULL ) { + *pt = '/'; + line = pt; + goto retry; + } +return; + } else if ( strstr(line,"/Subrs")!=NULL ) { + pt = strstr(line,"dup"); + if ( pt!=NULL ) + *pt = '\0'; + parseline(fp,line,in); + if ( pt!=NULL ) { + *pt = 'd'; + line = pt; + goto retry; + } +return; + } + fprintf( stderr, "Shouldn't be in addinfo |%s", rmbinary(line) ); + fp->alreadycomplained = true; + } +} + +/* In the book the token which starts a character description is always RD but*/ +/* it's just the name of a subroutine which is defined in the private diction*/ +/* and it could be anything. in one case it was "-|" (hyphen bar) so we can't*/ +/* just look for RD we must be a bit smarter and figure out what the token is*/ +/* (oh. I see now. it's allowed to be either one "RD" or "-|", but nothing else*/ +/* right) */ +/* It's defined as {string currentfile exch readstring pop} so look for that */ +/* Except that in gsf files we've also got "/-!{string currentfile exch readhexstring pop} readonly def" */ +/* NOTE: readhexstring!!! */ +/* And in files generated by GNU fontutils */ +static int glorpline(struct fontparse *fp, FILE *temp, char *rdtok) { + static char *buffer=NULL, *end; + char *pt, *binstart; + int binlen; + int ch; + int innum, val=0, inbinary, cnt=0, inr, wasspace, nownum, nowr, nowspace, sptok; + char *rdline = "{string currentfile exch readstring pop}", *rpt; + char *rdline2 = "{string currentfile exch readhexstring pop}"; + char *tokpt = NULL, *rdpt; + char temptok[255]; + int intok, first; + int wasminus=false, isminus, nibble, firstnibble, inhex; + int willbehex = false; + + ch = getc(temp); + if ( ch==EOF ) +return( 0 ); + ungetc(ch,temp); + + if ( buffer==NULL ) { + buffer = galloc(3000); + end = buffer+3000; + } + innum = inr = 0; wasspace = 0; inbinary = 0; rpt = NULL; rdpt = NULL; + inhex = 0; + pt = buffer; binstart=NULL; binlen = 0; intok=0; sptok=0; first=1; + temptok[0] = '\0'; + while ( (ch=getc(temp))!=EOF ) { + if ( pt>=end ) { + char *old = buffer; + int len = (end-buffer)+2000; + buffer = grealloc(buffer,len); + end = buffer+len; + pt = buffer+(pt-old); + if ( binstart!=NULL ) + binstart = buffer+(binstart-old); + } + *pt++ = ch; + isminus = ch=='-' && wasspace; + nownum = nowspace = nowr = 0; + if ( rpt!=NULL && ch!=*rpt && ch=='h' && rpt-rdline>25 && rpt-rdline<30 && + rdline2[rpt-rdline]=='h' ) { + rpt = rdline2 + (rpt-rdline); + willbehex = true; + } + if ( inbinary ) { + if ( --cnt==0 ) + inbinary = 0; + } else if ( inhex ) { + if ( ishexdigit(ch)) { + int h; + if ( isdigit(ch)) h = ch-'0'; + else if ( ch>='a' && ch<='f' ) h = ch-'a'+10; + else h = ch-'A'+10; + if ( firstnibble ) { + nibble = h; + --pt; + } else { + pt[-1] = (nibble<<4)|h; + if ( --cnt==0 ) + inbinary = inhex = 0; + } + firstnibble = !firstnibble; + } else { + --pt; + /* skip everything not hex */ + } + } else if ( ch=='/' ) { + intok = 1; + tokpt = temptok; + } else if ( intok && !isspace(ch) && ch!='{' && ch!='[' ) { + *tokpt++ = ch; + } else if ( (intok||sptok) && (ch=='{' || ch=='[')) { + *tokpt = '\0'; + rpt = rdline+1; + intok = sptok = 0; + } else if ( intok ) { + *tokpt = '\0'; + intok = 0; + sptok = 1; + } else if ( sptok && isspace(ch)) { + nowspace = 1; + if ( ch=='\n' || ch=='\r' ) + break; + } else if ( sptok && !isdigit(ch)) + sptok = 0; + else if ( rpt!=NULL && ch==*rpt ) { + if ( *++rpt=='\0' ) { + /* it matched the character definition string so this is the */ + /* token we want to search for */ + strcpy(rdtok,temptok); + fp->useshexstrings = willbehex; + rpt = NULL; + } + } else if ( rpt!=NULL && ch==' ' ) { + /* Extra spaces are ok */ + } else if ( rpt!=NULL ) { + rpt = NULL; + willbehex = false; + } else if ( isdigit(ch)) { + sptok = 0; + nownum = 1; + if ( innum ) + val = 10*val + ch-'0'; + else + val = ch-'0'; + } else if ( isspace(ch)) { + nowspace = 1; + if ( ch=='\n' || ch=='\r' ) + break; + } else if ( wasspace && ch==*rdtok ) { + nowr = 1; + fp->useshexstrings = willbehex; + rdpt = rdtok+1; + } else if ( wasspace && ch=='-' ) { /* fonts produced by type1fix seem to define both "RD" and "-|" which confused me. so just respond to either */ + nowr = 1; + fp->useshexstrings = false; + rdpt = "|"; + } else if ( wasspace && ch=='R' ) { /* fonts produced by type1fix seem to define both "RD" and "-|" which confused me. so just respond to either */ + nowr = 1; + fp->useshexstrings = false; + rdpt = "D"; + } else if ( inr && ch==*rdpt ) { + if ( *++rdpt =='\0' ) { + ch = getc(temp); + *pt++ = ch; + if ( isspace(ch) && val!=0 ) { + inhex = fp->useshexstrings; + inbinary = !fp->useshexstrings; + firstnibble = true; + cnt = val; + binstart = pt; + binlen = val; + } + } else + nowr = 1; + } else if ( wasminus && ch=='!' ) { + ch = getc(temp); + *pt++ = ch; + if ( isspace(ch) && val!=0 ) { + inhex = 1; + cnt = val; + binstart = pt; + binlen = val; + firstnibble = true; + } + } + innum = nownum; wasspace = nowspace; inr = nowr; + wasminus = isminus; + first = 0; + } + *pt = '\0'; + if ( binstart==NULL ) { + parseline(fp,buffer,temp); + } else { + addinfo(fp,buffer,temptok,binstart,binlen,temp); + } +return( 1 ); +} + +static int nrandombytes[4]; +#define EODMARKLEN 16 + +#define bgetc(extra,in) (*(extra)=='\0' ? getc(in) : (unsigned char ) *(extra)++ ) + +static void decrypteexec(FILE *in,FILE *temp, int hassectionheads,char *extra) { + int ch1, ch2, ch3, ch4, binary; + int zcnt; + unsigned char zeros[EODMARKLEN+6+1]; + int sect_len; + + if ( extra==(void *) 5 ) extra = ""; + + while ( (ch1=bgetc(extra,in))!=EOF && isspace(ch1)); + if ( ch1==0200 && hassectionheads ) { + /* skip the 6 byte section header in pfb files that follows eexec */ + ch1 = bgetc(extra,in); + sect_len = bgetc(extra,in); + sect_len |= bgetc(extra,in)<<8; + sect_len |= bgetc(extra,in)<<16; + sect_len |= bgetc(extra,in)<<24; + sect_len -= 3; + ch1 = bgetc(extra,in); + } + ch2 = bgetc(extra,in); ch3 = bgetc(extra,in); ch4 = bgetc(extra,in); + binary = 0; + if ( ch1<'0' || (ch1>'9' && ch1<'A') || ( ch1>'F' && ch1<'a') || (ch1>'f') || + ch2<'0' || (ch2>'9' && ch2<'A') || (ch2>'F' && ch2<'a') || (ch2>'f') || + ch3<'0' || (ch3>'9' && ch3<'A') || (ch3>'F' && ch3<'a') || (ch3>'f') || + ch4<'0' || (ch4>'9' && ch4<'A') || (ch4>'F' && ch4<'a') || (ch4>'f') ) + binary = 1; + if ( ch1==EOF || ch2==EOF || ch3==EOF || ch4==EOF ) { +return; + } + + initcode(); + if ( binary ) { + nrandombytes[0] = decode(ch1); + nrandombytes[1] = decode(ch2); + nrandombytes[2] = decode(ch3); + nrandombytes[3] = decode(ch4); + zcnt = 0; + while (( ch1=bgetc(extra,in))!=EOF ) { + --sect_len; + if ( hassectionheads ) { + if ( sect_len==0 && ch1==0200 ) { + ch1 = bgetc(extra,in); + sect_len = bgetc(extra,in); + sect_len |= bgetc(extra,in)<<8; + sect_len |= bgetc(extra,in)<<16; + sect_len |= bgetc(extra,in)<<24; + sect_len += 1; + if ( ch1=='\1' ) + break; + } else { + dumpzeros(temp,zeros,zcnt); + zcnt = 0; + putc(decode(ch1),temp); + } + } else { + if ( ch1=='0' ) ++zcnt; else {dumpzeros(temp,zeros,zcnt); zcnt = 0; } + if ( zcnt>EODMARKLEN ) + break; + if ( zcnt==0 ) + putc(decode(ch1),temp); + else + zeros[zcnt-1] = decode(ch1); + } + } + } else { + nrandombytes[0] = decode(hex(ch1,ch2)); + nrandombytes[1] = decode(hex(ch3,ch4)); + ch1 = bgetc(extra,in); ch2 = bgetc(extra,in); ch3 = bgetc(extra,in); ch4 = bgetc(extra,in); + nrandombytes[2] = decode(hex(ch1,ch2)); + nrandombytes[3] = decode(hex(ch3,ch4)); + zcnt = 0; + while (( ch1=bgetc(extra,in))!=EOF ) { + while ( ch1!=EOF && isspace(ch1)) ch1 = bgetc(extra,in); + while ( (ch2=bgetc(extra,in))!=EOF && isspace(ch2)); + if ( ch1=='0' && ch2=='0' ) ++zcnt; else { dumpzeros(temp,zeros,zcnt); zcnt = 0;} + if ( zcnt>EODMARKLEN ) + break; + if ( zcnt==0 ) + putc(decode(hex(ch1,ch2)),temp); + else + zeros[zcnt-1] = decode(hex(ch1,ch2)); + } + } + while (( ch1=bgetc(extra,in))=='0' || isspace(ch1) ); + if ( ch1!=EOF ) ungetc(ch1,in); +} + +static void decryptagain(struct fontparse *fp,FILE *temp,char *rdtok) { + while ( glorpline(fp,temp,rdtok)); +} + +static void parsetype3(struct fontparse *fp,FILE *in) { + PSFontInterpretPS(in,fp->fd->charprocs); +} + +static unsigned char *readt1str(FILE *temp,int offset,int len,int leniv) { + int i; + unsigned char *str, *pt; + unsigned short r = 4330; + unsigned char plain, cypher; + /* The CID spec doesn't mention this, but the type 1 strings are all */ + /* eexec encrupted (with the nested encryption). Remember leniv varies */ + /* from fd to fd (potentially) */ + /* I'm told (by Ian Kemmish) that leniv==-1 => no eexec encryption */ + + fseek(temp,offset,SEEK_SET); + if ( leniv<0 ) { + str = pt = galloc(len+1); + for (; i>8)); + r = (cypher + r) * c1 + c2; + } + str = pt = galloc(len-leniv+1); + for (; i>8)); + r = (cypher + r) * c1 + c2; + *pt++ = plain; + } + } + *pt = '\0'; +return( str ); +} + +static void figurecids(struct fontparse *fp,FILE *temp) { + struct fontdict *fd = fp->mainfd; + int i,j,k,val; + int *offsets; + int cidcnt = fd->cidcnt; + int leniv; + /* Some cid formats don't have any of these */ + + fd->cidstrs = galloc(cidcnt*sizeof(uint8 *)); + fd->cidlens = galloc(cidcnt*sizeof(int16)); + fd->cidfds = galloc((cidcnt+1)*sizeof(int16)); + offsets = galloc((cidcnt+1)*sizeof(int)); + GProgressChangeTotal(cidcnt); + + fseek(temp,fd->mapoffset,SEEK_SET); + for ( i=0; i<=fd->cidcnt; ++i ) { + for ( j=val=0; jfdbytes; ++j ) + val = (val<<8) + getc(temp); + fd->cidfds[i] = val; + for ( j=val=0; jgdbytes; ++j ) + val = (val<<8) + getc(temp); + offsets[i] = val; + if ( i!=0 ) + fd->cidlens[i-1] = offsets[i]-offsets[i-1]; + } + + for ( i=0; icidcnt; ++i ) { + if ( fd->cidlens[i]== 0 ) + fd->cidstrs[i] = NULL; + else { + fd->cidstrs[i] = readt1str(temp,offsets[i],fd->cidlens[i], + fd->fds[fd->cidfds[i]]->private->leniv); + fd->cidlens[i] -= fd->fds[fd->cidfds[i]]->private->leniv; + } + GProgressNext(); + } + free(offsets); + + for ( k=0; kfdcnt; ++k ) { + struct private *private = fd->fds[k]->private; + char *ssubroff = PSDictHasEntry(private->private,"SubrMapOffset"); + char *ssdbytes = PSDictHasEntry(private->private,"SDBytes"); + char *ssubrcnt = PSDictHasEntry(private->private,"SubrCount"); + int subroff, sdbytes, subrcnt; + + if ( ssubroff!=NULL && ssdbytes!=NULL && ssubrcnt!=NULL && + (subroff=strtol(ssubroff,NULL,10))>=0 && + (sdbytes=strtol(ssdbytes,NULL,10))>0 && + (subrcnt=strtol(ssubrcnt,NULL,10))>0 ) { + private->subrs->cnt = subrcnt; + private->subrs->values = gcalloc(subrcnt,sizeof(char *)); + private->subrs->lens = gcalloc(subrcnt,sizeof(int)); + leniv = private->leniv; + offsets = galloc((subrcnt+1)*sizeof(int)); + fseek(temp,subroff,SEEK_SET); + for ( i=0; i<=subrcnt; ++i ) { + for ( j=val=0; jsubrs->lens[i-1] = offsets[i]-offsets[i-1]; + } + for ( i=0; isubrs->values[i] = readt1str(temp,offsets[i], + private->subrs->lens[i],leniv); + } + private->subrs->next = i; + free(offsets); + } + PSDictRemoveEntry(private->private,"SubrMapOffset"); + PSDictRemoveEntry(private->private,"SDBytes"); + PSDictRemoveEntry(private->private,"SubrCount"); + } +} + +static void dodata( struct fontparse *fp, FILE *in, FILE *temp) { + int binary, cnt, len; + int ch, ch2; + char *pt; + char fontsetname[256]; + + while ( (ch=getc(in))!='(' && ch!='/' && ch!=EOF ); + if ( ch=='/' ) { + /* There appears to be no provision for a hex encoding here */ + /* Why can't they use the same format for routines with the same name? */ + binary = true; + for ( pt=fontsetname; (ch=getc(in))!=' ' && ch!=EOF; ) + if ( pt0 ) { + ch = getc(in); + putc(ch,temp); + --cnt; + } + } else { + while ( cnt>0 ) { + /* Hex data are allowed to contain whitespace */ + while ( isspace(ch=getc(in)) ); + while ( isspace(ch2=getc(in)) ); + ch = hex(ch,ch2); + putc(ch,temp); + --cnt; + } + if ( (ch=getc(in))!='>' ) ungetc(ch,in); + } + rewind(temp); + if ( fp->iscid ) + figurecids(fp,temp); + else { + fp->fd->sf = _CFFParse(temp,len,fontsetname); + fp->fd->wascff = true; + } +} + +static void realdecrypt(struct fontparse *fp,FILE *in, FILE *temp) { + char buffer[256]; + int first, hassectionheads; + char rdtok[20]; + int saw_blend = false; + + strcpy(rdtok,"RD"); + + first = 1; hassectionheads = 0; + while ( myfgets(buffer,sizeof(buffer),in)!=NULL ) { + if ( strstr(buffer, "Blend")!=NULL ) + saw_blend = true; + if ( first && buffer[0]=='\200' ) { + hassectionheads = 1; + fp->fd->wasbinary = true; + parseline(fp,buffer+6,in); + } else if ( strstr(buffer,"CharProcs")!=NULL && strstr(buffer,"begin")!=NULL ) { + parsetype3(fp,in); +return; + } else if ( !fp->iscid ) { + if ( saw_blend ) + parseline(fp,buffer,in); + /* But if it's a multi master font, don't do the special private hack */ + else if ( strstr(buffer,"/CharStrings")!=NULL && strstr(buffer,"begin")!=NULL ) { + /* gsf files are not eexec encoded, but the charstrings are encoded*/ + InitChars(fp->fd->chars,buffer); + fp->inchars = 1; + decryptagain(fp,in,rdtok); +return; + } else if ( strstr(buffer,"/Subrs")!=NULL && strstr(buffer,"array")!=NULL ) { + /* Same case as above */ + InitChars(fp->fd->private->subrs,buffer); + fp->insubs = 1; + decryptagain(fp,in,rdtok); +return; + } else if ( strstr(buffer,"/Private")!=NULL && strstr(buffer,"dict")!=NULL ) { + /* files produced by GNU fontutils have some of the same issues */ + fp->inprivate = 1; + fp->infi = false; + decryptagain(fp,in,rdtok); +return; + } else + parseline(fp,buffer,in); + } else + parseline(fp,buffer,in); + first = 0; + if ( strstr(buffer,"%%BeginData: ")!=NULL ) + break; + if ( strstr(buffer,"currentfile")!=NULL && strstr(buffer, "eexec")!=NULL ) { + fp->skipping_mbf = false; + break; + } + } + + if ( strstr(buffer,"%%BeginData: ")!=NULL ) { + /* used by both CID fonts and CFF fonts (and chameleons, whatever they are) */ + dodata(fp,in,temp); + } else { + decrypteexec(in,temp,hassectionheads,strstr(buffer, "eexec")+5); + rewind(temp); + decryptagain(fp,temp,rdtok); + while ( myfgets(buffer,sizeof(buffer),in)!=NULL ) { + if ( buffer[0]!='\200' || !hassectionheads ) + parseline(fp,buffer,in); + } + } +} + +FontDict *_ReadPSFont(FILE *in) { + FILE *temp; + struct fontparse fp; + char *oldloc; + + temp = tmpfile(); + if ( temp==NULL ) { + fprintf( stderr, "Cannot open a temporary file\n" ); + fclose(in); +return(NULL); + } + + oldloc = setlocale(LC_NUMERIC,"C"); + memset(&fp,'\0',sizeof(fp)); + fp.fd = fp.mainfd = PSMakeEmptyFont(); + fp.fdindex = -1; + realdecrypt(&fp,in,temp); + free(fp.vbuf); + setlocale(LC_NUMERIC,oldloc); + + fclose(temp); +return( fp.fd ); +} + +FontDict *ReadPSFont(char *fontname) { + FILE *in; + FontDict *fd; + + in = fopen(fontname,"rb"); + if ( in==NULL ) { + fprintf( stderr, "Cannot open %s\n", fontname ); +return(NULL); + } + fd = _ReadPSFont(in); + fclose(in); +return( fd ); +} + +void PSCharsFree(struct pschars *chrs) { + int i; + + if ( chrs==NULL ) +return; + for ( i=0; inext; ++i ) { + if ( chrs->keys!=NULL ) free(chrs->keys[i]); + free(chrs->values[i]); + } + free(chrs->lens); + free(chrs->keys); + free(chrs->values); + free(chrs); +} + +void PSDictFree(struct psdict *dict) { + int i; + + if ( dict==NULL ) +return; + for ( i=0; inext; ++i ) { + if ( dict->keys!=NULL ) free(dict->keys[i]); + free(dict->values[i]); + } + free(dict->keys); + free(dict->values); + free(dict); +} + +static void PrivateFree(struct private *prv) { + PSCharsFree(prv->subrs); +#if 1 + PSDictFree(prv->private); +#else + PSCharsFree(prv->othersubrs); + free(prv->minfeature); + free(prv->nd); + free(prv->np); + free(prv->rd); +#endif + free(prv); +} + +static void FontInfoFree(struct fontinfo *fi) { + free(fi->familyname); + free(fi->fullname); + free(fi->notice); + free(fi->weight); + free(fi->version); + free(fi->blenddesignpositions); + free(fi->blenddesignmap); + free(fi->blendaxistypes); + free(fi); +} + +void PSFontFree(FontDict *fd) { + int i; + + if ( fd->encoding!=NULL ) + for ( i=0; i<256; ++i ) + free( fd->encoding[i]); + free(fd->fontname); + free(fd->cidfontname); + free(fd->registry); + free(fd->ordering); + FontInfoFree(fd->fontinfo); + PSCharsFree(fd->chars); + PrivateFree(fd->private); + if ( fd->charprocs!=NULL ) { + for ( i=0; icharprocs->cnt; ++i ) + free(fd->charprocs->keys[i]); + free(fd->charprocs->keys); + free(fd->charprocs->values); + free(fd->charprocs); + } + if ( fd->cidstrs!=NULL ) { + for ( i=0; icidcnt; ++i ) + free( fd->cidstrs[i]); + free(fd->cidstrs); + } + free(fd->cidlens); + free(fd->cidfds); + if ( fd->fds!=NULL ) { + for ( i=0; ifdcnt; ++i ) + PSFontFree(fd->fds[i]); + free(fd->fds); + } + free(fd->blendfunc); + free(fd->weightvector); + free(fd->cdv); + free(fd->ndv); + + PSDictFree(fd->blendprivate); + PSDictFree(fd->blendfontinfo); + + free(fd); +} + +char **_NamesReadPostscript(FILE *ps) { + char **ret = NULL; + char buffer[2000], *pt, *end; + + if ( ps!=NULL ) { + while ( fgets(buffer,sizeof(buffer),ps)!=NULL ) { + if ( strstr(buffer,"/FontName")!=NULL || + strstr(buffer,"/CIDFontName")!=NULL ) { + pt = strstr(buffer,"FontName"); + pt += strlen("FontName"); + while ( isspace(*pt)) ++pt; + if ( *pt=='/' ) ++pt; + for ( end = pt; *end!='\0' && !isspace(*end); ++end ); + ret = galloc(2*sizeof(char *)); + ret[0] = copyn(pt,end-pt); + ret[1] = NULL; + break; + } else if ( strstr(buffer,"currentfile")!=NULL && strstr(buffer,"eexec")!=NULL ) + break; + else if ( strstr(buffer,"%%BeginData")!=NULL ) + break; + } + fclose(ps); + } +return( ret ); +} + +char **NamesReadPostscript(char *filename) { +return( _NamesReadPostscript( fopen(filename,"rb"))); +} diff --git a/fontforge/parsettf.c b/fontforge/parsettf.c new file mode 100644 index 00000000..a3efe160 --- /dev/null +++ b/fontforge/parsettf.c @@ -0,0 +1,4395 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include +#include +#include "ttf.h" + +/* True Type is a really icky format. Nothing is together. It's badly described */ +/* much of the description is misleading */ +/* Apple's version: */ +/* http://fonts.apple.com/TTRefMan/index.html */ +/* MS's version: */ +/* http://www.microsoft.com/typography/tt/tt.htm */ +/* An helpful but incomplete description is given at */ +/* http://www.truetype.demon.co.uk/ttoutln.htm */ +/* For some things I looked at freetype's code to see how they did it */ +/* (I think only for what happens if !ARGS_ARE_XY) */ +/* http://freetype.sourceforge.net/ */ +/* It grows on you though... now that I understand it better it seems better designed */ +/* but the docs remain in conflict. Sometimes badly so */ + +/* !!!I don't currently parse instructions to get hints, but I do save them */ + +int prefer_cjk_encodings=false; + +int getushort(FILE *ttf) { + int ch1 = getc(ttf); + int ch2 = getc(ttf); + if ( ch2==EOF ) +return( EOF ); +return( (ch1<<8)|ch2 ); +} + +int get3byte(FILE *ttf) { + int ch1 = getc(ttf); + int ch2 = getc(ttf); + int ch3 = getc(ttf); + if ( ch3==EOF ) +return( EOF ); +return( (ch1<<16)|(ch2<<8)|ch3 ); +} + +int32 getlong(FILE *ttf) { + int ch1 = getc(ttf); + int ch2 = getc(ttf); + int ch3 = getc(ttf); + int ch4 = getc(ttf); + if ( ch4==EOF ) +return( EOF ); +return( (ch1<<24)|(ch2<<16)|(ch3<<8)|ch4 ); +} + +static int32 getoffset(FILE *ttf, int offsize) { + if ( offsize==1 ) +return( getc(ttf)); + else if ( offsize==2 ) +return( getushort(ttf)); + else if ( offsize==3 ) +return( get3byte(ttf)); + else +return( getlong(ttf)); +} + +real getfixed(FILE *ttf) { + int32 val = getlong(ttf); + int mant = val&0xffff; + /* This oddity may be needed to deal with the first 16 bits being signed */ + /* and the low-order bits unsigned */ +return( (real) (val>>16) + (mant/65536.0) ); +} + +real get2dot14(FILE *ttf) { + int32 val = getushort(ttf); + int mant = val&0x3fff; + /* This oddity may be needed to deal with the first 2 bits being signed */ + /* and the low-order bits unsigned */ +return( (real) ((val<<16)>>(16+14)) + (mant/16384.0) ); +} + +static int enc_from_platspec(int platform,int specific) { + int enc; + + enc = em_none; + if ( platform==0 ) + enc = em_unicode; + else if ( platform==1 ) { + if ( specific==0 ) + enc = em_mac; + else if ( specific==1 ) + enc = em_sjis; + else if ( specific==2 ) + enc = em_big5hkscs; /* Or should we just guess big5? Both are wrong sometimes */ + else if ( specific==3 ) + enc = em_wansung; + else if ( specific==25 ) + enc = em_jisgb; + } else if ( platform==2 ) { /* obselete */ + if ( specific==0 ) + enc = em_iso8859_1; /* Actually just ASCII */ + else if ( specific==1 ) + enc = em_unicode; + else if ( specific==2 ) + enc = em_iso8859_1; + } else if ( platform==3 ) { + if ( specific==1 || specific==0 ) /* symbol (sp=0) is just unicode */ + enc = em_unicode; + else if ( specific==2 ) + enc = em_sjis; + else if ( specific==3 ) + enc = em_jisgb; + else if ( specific==4 ) + enc = em_big5hkscs; + else if ( specific==5 ) + enc = em_wansung; + else if ( specific==6 ) + enc = em_johab; + } else if ( platform==7 ) { /* Used internally in freetype, but */ + if ( specific==0 ) /* there's no harm in looking for it */ + enc = em_adobestandard; /* even if it never happens */ + else if ( specific==1 ) + /* adobe_expert */; + else if ( specific==2 ) + /* adobe_custom */; + } +return( enc ); +} + +static unichar_t *_readencstring(FILE *ttf,int offset,int len, + int platform,int specific,int language) { + long pos = ftell(ttf); + unichar_t *str, *pt, empty[1]; + int i, ch, enc; + + fseek(ttf,offset,SEEK_SET); + + enc = enc_from_platspec(platform,specific); + if ( platform==1 ) { + char *cstr, *cpt; + cstr = cpt = galloc(len+1); + for ( i=0; i>8)*94 + (ch&0xff); + *pt++ = unicode_from_ksc5601[ch]; + ++i; + } + } + } else if ( enc==em_jisgb ) { + str = pt = galloc(2*len+2); /* Probably more space than we need, but it should be enough */ + for ( i=0; i>8)*94 + (ch&0xff); + *pt++ = unicode_from_gb2312[ch]; + ++i; + } + } + } else if ( enc==em_sjis ) { + str = pt = galloc(2*len+2); /* Probably more space than we need, but it should be enough */ + for ( i=0; i=161 && ch<=223 ) { + *pt++ = unicode_from_jis201[ch]; /* Katakana */ + } else { + int ch2 = getc(ttf); + if ( ch >= 129 && ch<= 159 ) + ch -= 112; + else + ch -= 176; + ch <<= 1; + if ( ch2>=159 ) + ch2-= 126; + else if ( ch2>127 ) { + --ch; + ch2 -= 32; + } else { + --ch; + ch2 -= 31; + } + *pt++ = unicode_from_jis208[(ch-0x21)*94+(ch2-0x21)]; + ++i; + } + } + } else { + str = NULL; pt = empty; + } + *pt = '\0'; + fseek(ttf,pos,SEEK_SET); +return( str ); +} + +unichar_t *TTFGetFontName(FILE *ttf,int32 offset,int32 off2) { + int i,num; + int32 tag, nameoffset, length, stringoffset; + int plat, spec, lang, name, len, off, val; + int fullval, fullstr, fulllen, famval, famstr, famlen; + int enc; + int fullplat, fullspec, fulllang, famplat, famspec, famlang; + + fseek(ttf,offset,SEEK_SET); + /* version = */ getlong(ttf); + num = getushort(ttf); + /* srange = */ getushort(ttf); + /* esel = */ getushort(ttf); + /* rshift = */ getushort(ttf); + for ( i=0; ifullval ) { + fullval = val; + fullstr = off; + fulllen = len; + fullplat = plat; + fullspec = spec; + fulllang = lang; + if ( val==12 ) + break; + } else if ( name==1 && val>famval ) { + famval = val; + famstr = off; + famlen = len; + famplat = plat; + famspec = spec; + famlang = lang; + } + } + if ( fullval==0 ) { + if ( famval==0 ) +return( NULL ); + fullstr = famstr; + fulllen = famlen; + fullplat = famplat; + fullspec = famspec; + fulllang = famlang; + } +return( _readencstring(ttf,stringoffset+fullstr,fulllen,fullplat,fullspec,fulllang)); +} + +static int PickTTFFont(FILE *ttf,char *filename,char **chosenname) { + int32 *offsets, cnt, i, choice, j; + unichar_t **names; + char *pt, *lparen; + + /* TTCF version = */ getlong(ttf); + cnt = getlong(ttf); + if ( cnt==1 ) { + /* This is easy, don't bother to ask the user, there's no choice */ + int32 offset = getlong(ttf); + fseek(ttf,offset,SEEK_SET); +return( true ); + } + offsets = galloc(cnt*sizeof(int32)); + for ( i=0; i=0; --choice ) + if ( uc_strcmp(names[choice],find)==0 ) + break; + if ( choice==-1 ) { + char *fn = copy(filename); + fn[lparen-filename] = '\0'; + GWidgetErrorR(_STR_NotInCollection,_STR_FontNotInCollection,find,fn); + free(fn); + } + free(find); + } else if ( screen_display==NULL ) + choice = 0; + else + choice = GWidgetChoicesR(_STR_PickFont,(const unichar_t **) names,j,0,_STR_MultipleFontsPick); + if ( choice!=-1 ) { + fseek(ttf,offsets[choice],SEEK_SET); + *chosenname = cu_copy(names[choice]); + } + for ( i=0; iis_ttc = true; + if ( !PickTTFFont(ttf,filename,choosenname)) +return( 0 ); + /* If they picked a font, then we should be left pointing at the */ + /* start of the Table Directory for that font */ + info->one_of_many = true; + version = getlong(ttf); + } + + /* Apple says that 'typ1' is a valid code for a type1 font wrapped up in */ + /* a truetype table structure, but gives no docs on what tables get used */ + /* or how */ + if ( version==CHR('t','y','p','1')) { + if ( filename==NULL ) filename = "it"; + fprintf( stderr, "Interesting, I've never seen an example of this type of font, could you\nsend me a copy of %s?\nThanks\n gww@silcom.com\n", filename ); + } + if ( version!=0x00010000 && version!=CHR('t','r','u','e') && + version!=CHR('O','T','T','O')) +return( 0 ); /* Not version 1 of true type, nor Open Type */ + info->numtables = getushort(ttf); + /* searchRange = */ getushort(ttf); + /* entrySelector = */ getushort(ttf); + /* rangeshift = */ getushort(ttf); + + for ( i=0; inumtables; ++i ) { + tag = getlong(ttf); + checksum = getlong(ttf); + offset = getlong(ttf); + length = getlong(ttf); +#ifdef DEBUG + printf( "%c%c%c%c\n", tag>>24, (tag>>16)&0xff, (tag>>8)&0xff, tag&0xff ); +#endif + switch ( tag ) { + case CHR('C','F','F',' '): + info->cff_start = offset; + info->cff_length = length; + break; + case CHR('c','m','a','p'): + info->encoding_start = offset; + break; + case CHR('g','l','y','f'): + info->glyph_start = offset; + info->glyph_length = length; + break; + case CHR('G','D','E','F'): + info->gdef_start = offset; + break; + case CHR('G','P','O','S'): + info->gpos_start = offset; + break; + case CHR('G','S','U','B'): + info->gsub_start = offset; + break; + case CHR('b','d','a','t'): /* Apple/MS use a different tag, but the same format. Great. */ + case CHR('E','B','D','T'): + info->bitmapdata_start = offset; + break; + case CHR('b','l','o','c'): /* Apple/MS use a different tag. Great. */ + case CHR('E','B','L','C'): + info->bitmaploc_start = offset; + break; + case CHR('b','h','e','d'): /* Apple uses bhed for fonts with only bitmaps */ + case CHR('h','e','a','d'): + info->head_start = offset; + break; + case CHR('h','h','e','a'): + info->hhea_start = offset; + break; + case CHR('h','m','t','x'): + info->hmetrics_start = offset; + break; + case CHR('k','e','r','n'): + info->kern_start = offset; + break; + case CHR('l','o','c','a'): + info->glyphlocations_start = offset; + info->loca_length = length; + info->glyph_cnt = length/2-1; /* the minus one is because there is one extra entry to give the length of the last glyph */ + break; + case CHR('m','a','x','p'): + info->maxp_start = offset; + info->maxp_len = length; + break; + case CHR('n','a','m','e'): + info->copyright_start = offset; + break; + case CHR('p','o','s','t'): + info->postscript_start = offset; + break; + case CHR('O','S','/','2'): + info->os2_start = offset; + break; + case CHR('v','h','e','a'): + info->vhea_start = offset; + break; + case CHR('v','m','t','x'): + info->vmetrics_start = offset; + break; + case CHR('V','O','R','G'): + info->vorg_start = offset; + break; + /* Apple stuff */ + case CHR('a','c','n','t'): + info->acnt_start = offset; + break; + case CHR('f','e','a','t'): + info->feat_start = offset; + break; + case CHR('l','c','a','r'): + info->lcar_start = offset; + break; + case CHR('m','o','r','t'): + info->mort_start = offset; + break; + case CHR('m','o','r','x'): + info->morx_start = offset; + break; + case CHR('o','p','b','d'): + info->opbd_start = offset; + break; + case CHR('p','r','o','p'): + info->prop_start = offset; + break; + /* to make sense of instrs */ + case CHR('c','v','t',' '): + info->cvt_start = offset; + info->cvt_len = length; + break; + case CHR('p','r','e','p'): + info->prep_start = offset; + info->prep_len = length; + break; + case CHR('f','p','g','m'): + info->fpgm_start = offset; + info->fpgm_len = length; + break; + case CHR('P','f','E','d'): + info->pfed_start = offset; + break; + } + } +return( true ); +} + +static void readttfhead(FILE *ttf,struct ttfinfo *info) { + /* Here I want units per em, and size of loca entries */ + int i; + fseek(ttf,info->head_start+4*4+2,SEEK_SET); /* skip over the version number and a bunch of junk */ + info->emsize = getushort(ttf); + for ( i=0; i<12; ++i ) + getushort(ttf); + info->macstyle = getushort(ttf); + for ( i=0; i<2; ++i ) + getushort(ttf); + info->index_to_loc_is_long = getushort(ttf); + if ( info->index_to_loc_is_long ) + info->glyph_cnt = info->loca_length/4-1; +} + +static void readttfhhea(FILE *ttf,struct ttfinfo *info) { + /* Here I want ascent, descent and the number of horizontal metrics */ + int i; + + fseek(ttf,info->hhea_start+4,SEEK_SET); /* skip over the version number */ + /*info->pfminfo.hhead_ascent = */getushort(ttf); + /*info->pfminfo.hhead_descent = */(short) getushort(ttf); + info->pfminfo.linegap = getushort(ttf); + /*info->ascent = info->pfminfo.hhead_ascent;*/ + + info->ascent = .8*info->emsize; + info->descent = info->emsize-info->ascent; + + for ( i=0; i<12; ++i ) + getushort(ttf); + info->width_cnt = getushort(ttf); +} + +static void readttfmaxp(FILE *ttf,struct ttfinfo *info) { + /* All I want here is the number of glyphs */ + int cnt; + fseek(ttf,info->maxp_start+4,SEEK_SET); /* skip over the version number */ + cnt = getushort(ttf); + if ( info->glyph_cnt==0 && info->glyph_length==0 && info->loca_length<=4 && + info->cff_length==0 ) { + /* X11 OpenType bitmap format */; + info->onlystrikes = true; + } else if ( cnt!=info->glyph_cnt && info->loca_length!=0 ) { + GDrawError("TTF file has bad glyph count field. maxp says: %d sizeof(loca)=>%d", cnt, info->glyph_cnt); + if ( cnt>info->glyph_cnt ) + cnt = info->glyph_cnt; /* Use the smaller of the two values */ + } + /* Open Type fonts have no loca table, so we can't calculate the glyph */ + /* count from it */ + info->glyph_cnt = cnt; +} + +static char *stripspaces(char *str) { + char *str2 = str, *base = str; + + if ( str==NULL ) +return( NULL ); + + while ( *str ) { + if ( *str==' ' ) + ++str; + else + *str2++ = *str++; + } + *str2 = '\0'; +return( base ); +} + +static struct macname *AddMacName(FILE *ttf, + int strlen, int stroff,int spec,int language, struct macname *last) { + struct macname *new = chunkalloc(sizeof(struct macname)); + long pos = ftell(ttf); + char *pt; + int i; + + new->next = last; + new->enc = spec; + new->lang = language; + new->name = pt = galloc(strlen+1); + + fseek(ttf,stroff,SEEK_SET); + + for ( i=0; ifeatures; f!=NULL; f=f->next ) { + if ( f->strid==id ) { + f->featname = AddMacName(ttf,strlen,stroff,spec,language,f->featname); +return; + } else { + for ( s=f->settings; s!=NULL; s=s->next ) { + if ( s->strid==id ) { + s->setname = AddMacName(ttf,strlen,stroff,spec,language,s->setname); +return; + } + } + } + } + /* Well, there are some things in the name table other than feature/setting*/ + /* names. I'm not interested in them yet though */ +} + +static void TTFAddLangStr(FILE *ttf, struct ttfinfo *info, int id, + int strlen, int stroff,int plat,int spec,int language) { + struct ttflangname *cur, *prev; + unichar_t *str; + + if ( plat==1 && id>=256 && info->features!=NULL ) { + MacFeatureAdd(ttf,info,id,strlen,stroff,spec,language); +return; + } else if ( id<0 || id>=ttf_namemax ) +return; + + str = _readencstring(ttf,stroff,strlen,plat,spec,language); + if ( str==NULL ) /* we didn't understand the encoding */ +return; + + if ( plat==1 ) + language = WinLangFromMac(language); + if ( (language&0xff00)==0 ) language |= 0x400; + + for ( prev=NULL, cur=info->names; cur!=NULL && cur->lang!=language; prev = cur, cur=cur->next ); + if ( cur==NULL ) { + cur=gcalloc(1,sizeof(struct ttflangname)); + cur->lang = language; + if ( prev==NULL ) + info->names = cur; + else + prev->next = cur; + } + if ( cur->names[id]!=NULL ) free(cur->names[id]); + cur->names[id] = str; +} + +static int is_ascii(unichar_t *str) { /* isascii is in ctype */ + if ( str==NULL ) +return( false ); + while ( *str && *str<127 && *str>=' ' ) + ++str; +return( *str=='\0' ); +} + +static int is_latin1(unichar_t *str) { + if ( str==NULL ) +return( false ); + while ( *str && *str<256 && *str>=' ' ) + ++str; +return( *str=='\0' ); +} + +static char *removeaccents(char *_str) { + /* Postscript really wants ASCII, so if we can make it ascii without too */ + /* much loss, let's do so */ + unsigned char *str = (unsigned char *) _str, *pt = str; + while ( *pt ) { + if ( *pt>=0xc0 && *pt<=0xc5 ) + *pt = 'A'; + else if ( *pt>=0xe0 && *pt<=0xe5 ) + *pt = 'a'; + else if ( *pt==0xc6 || *pt==0xe6 || *pt==0xdf ) { + unsigned char *temp = galloc(strlen((char *) str)+2); + strcpy((char *) temp,(char *) str); + if ( *pt==0xc6 ) { + temp[pt-str] = 'A'; + temp[pt-str+1] = 'E'; + } else if ( *pt==0e6 ) { + temp[pt-str] = 'a'; + temp[pt-str+1] = 'e'; + } else { + temp[pt-str] = 's'; + temp[pt-str+1] = 's'; + } + strcpy((char *) temp+(pt-str)+2,(char *) pt+1); + pt = temp+(pt-str)+1; + free(str); + str = temp; + } else if ( *pt==0xc7 ) + *pt = 'C'; + else if ( *pt==0xe7 ) + *pt = 'c'; + else if ( *pt>=0xc8 && *pt<=0xcb ) + *pt = 'E'; + else if ( *pt>=0xe8 && *pt<=0xeb ) + *pt = 'e'; + else if ( *pt>=0xcc && *pt<=0xcf ) + *pt = 'I'; + else if ( *pt>=0xec && *pt<=0xef ) + *pt = 'i'; + else if ( *pt==0xd1 ) + *pt = 'N'; + else if ( *pt==0xf1 ) + *pt = 'n'; + else if ( (*pt>=0xd2 && *pt<=0xd6 ) || *pt==0xd8 ) + *pt = 'O'; + else if ( (*pt>=0xf2 && *pt<=0xf6 ) || *pt==0xf8 ) + *pt = 'o'; + else if ( *pt>=0xd9 && *pt<=0xdc ) + *pt = 'U'; + else if ( *pt>=0xf9 && *pt<=0xfc ) + *pt = 'u'; + else if ( *pt>=0xdd ) + *pt = 'Y'; + else if ( *pt==0xfd || *pt==0xff ) + *pt = 'y'; + ++pt; + } +return( (char *) str ); +} + +static char *FindLangEntry(struct ttfinfo *info, int id ) { + /* Look for an entry with string id */ + /* we prefer english, if we can't find english look for something in ascii */ + /* if not english let's try for latin1, if that fails we are doomed */ + struct ttflangname *cur; + char *ret; + + for ( cur=info->names; cur!=NULL && cur->lang!=0x409; cur=cur->next ); + if ( cur!=NULL && cur->names[id]==NULL ) cur = NULL; + if ( cur==NULL ) + for ( cur=info->names; cur!=NULL && (cur->lang&0xf)!=0x09; cur=cur->next ); + if ( cur!=NULL && cur->names[id]==NULL ) cur = NULL; + if ( cur==NULL ) + for ( cur=info->names; cur!=NULL && !is_ascii(cur->names[id]); cur=cur->next ); + if ( cur==NULL ) + for ( cur=info->names; cur!=NULL && !is_latin1(cur->names[id]); cur=cur->next ); + if ( cur==NULL ) +return( NULL ); + ret = cu_copy(cur->names[id]); + ret = removeaccents(ret); +return( ret ); +} + +static struct macname *reversemacnames(struct macname *mn) { + struct macname *next, *prev=NULL; + + if ( mn==NULL ) +return( NULL ); + + next = mn->next; + while ( next!=NULL ) { + mn->next = prev; + prev = mn; + mn = next; + next = mn->next; + } + mn->next = prev; +return( mn ); +} + +static void readttfcopyrights(FILE *ttf,struct ttfinfo *info) { + int i, cnt, tableoff; + int platform, specific, language, name, str_len, stroff; + + if ( info->feat_start!=0 ) + readmacfeaturemap(ttf,info); + if ( info->copyright_start!=0 ) { + fseek(ttf,info->copyright_start,SEEK_SET); + /* format selector = */ getushort(ttf); + cnt = getushort(ttf); + tableoff = info->copyright_start+getushort(ttf); + for ( i=0; icopyright==NULL ) + info->copyright = FindLangEntry(info,ttf_copyright); + if ( info->familyname==NULL ) + info->familyname = FindLangEntry(info,ttf_family); + if ( info->fullname==NULL ) + info->fullname = FindLangEntry(info,ttf_fullname); + if ( info->version==NULL ) + info->version = FindLangEntry(info,ttf_version); + if ( info->fontname==NULL ) + info->fontname = FindLangEntry(info,ttf_postscriptname); + + /* OpenType spec says the version string should begin with "Version " and */ + /* end with a space and have a number in between */ + if ( info->version==NULL ) info->version = copy("1.0"); + else if ( strnmatch(info->version,"Version ",8)==0 ) { + char *temp = copy(info->version+8); + if ( temp[strlen(temp)-1]==' ' ) + temp[strlen(temp)-1] = '\0'; + free(info->version); + info->version = temp; + } + if ( info->fontname==NULL && info->fullname!=NULL ) + info->fontname = stripspaces(copy(info->fullname)); + + if ( info->features ) { + MacFeat *mf; + struct macsetting *ms; + for ( mf=info->features; mf!=NULL; mf = mf->next ) { + mf->featname = reversemacnames(mf->featname); + for ( ms=mf->settings; ms!=NULL; ms=ms->next ) + ms->setname = reversemacnames(ms->setname); + } + } +} + +static void readttfpreglyph(FILE *ttf,struct ttfinfo *info) { + readttfhead(ttf,info); + readttfhhea(ttf,info); + readttfmaxp(ttf,info); + readttfcopyrights(ttf,info); +} + +#define _On_Curve 1 +#define _X_Short 2 +#define _Y_Short 4 +#define _Repeat 8 +#define _X_Same 0x10 +#define _Y_Same 0x20 + +static void FigureControls(SplinePoint *from, SplinePoint *to, BasePoint *cp, + int is_order2) { + /* What are the control points for 2 cp bezier which will provide the same*/ + /* curve as that for the 1 cp bezier specified above */ + real b, c, d; + + if ( is_order2 ) { + from->nextcp = to->prevcp = *cp; + if ( cp->x==to->me.x && cp->y==to->me.y ) { + /* I would lose track of the proper location of this cp if I left */ + /* it here (would end up with from->nonextcp, which would mean I'd*/ + /* use from->me rather than to->me in tottf.c:SSAddPoints. So we */ + /* distort it a little */ + BasePoint off; + double len; + off.x = from->me.x-to->me.x; off.y = from->me.y-to->me.y; + len = sqrt(off.x*off.x+off.y*off.y); + if ( len>3 ) { + /* move the cp slightly toward from, but on the line between the two */ + from->nextcp.x = (to->prevcp.x += rint(off.x/len)); + from->nextcp.y = (to->prevcp.y += rint(off.y/len)); + } + } + } else { + d = from->me.x; + c = 2*cp->x - 2*from->me.x; + b = to->me.x+from->me.x-2*cp->x; + from->nextcp.x = d+c/3; + to->prevcp.x = from->nextcp.x + (c+b)/3; + + d = from->me.y; + c = 2*cp->y - 2*from->me.y; + b = to->me.y+from->me.y-2*cp->y; + from->nextcp.y = d+c/3; + to->prevcp.y = from->nextcp.y + (c+b)/3; + } + + if ( from->me.x!=from->nextcp.x || from->me.y!=from->nextcp.y ) + from->nonextcp = false; + if ( to->me.x!=to->prevcp.x || to->me.y!=to->prevcp.y ) + to->noprevcp = false; + if ( is_order2 && (to->noprevcp || from->nonextcp)) { + to->noprevcp = from->nonextcp = true; + from->nextcp = from->me; + to->prevcp = to->me; + } +} + +static SplineSet *ttfbuildcontours(int path_cnt,uint16 *endpt, char *flags, + BasePoint *pts, int is_order2) { + SplineSet *head=NULL, *last=NULL, *cur; + int i, path, start, last_off; + SplinePoint *sp; + + for ( path=i=0; pathnext = cur; + last = cur; + last_off = false; + start = i; + while ( i<=endpt[path] ) { + if ( flags[i]&_On_Curve ) { + sp = chunkalloc(sizeof(SplinePoint)); + sp->me = sp->nextcp = sp->prevcp = pts[i]; + sp->nonextcp = sp->noprevcp = true; + sp->ttfindex = i; + sp->nextcpindex = 0xffff; + if ( last_off && cur->last!=NULL ) + FigureControls(cur->last,sp,&pts[i-1],is_order2); + last_off = false; + } else if ( last_off ) { + /* two off curve points get a third on curve point created */ + /* half-way between them. Now isn't that special */ + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = (pts[i].x+pts[i-1].x)/2; + sp->me.y = (pts[i].y+pts[i-1].y)/2; + sp->nextcp = sp->prevcp = sp->me; + sp->nonextcp = true; + sp->ttfindex = 0xffff; + sp->nextcpindex = i; + if ( last_off && cur->last!=NULL ) + FigureControls(cur->last,sp,&pts[i-1],is_order2); + /* last_off continues to be true */ + } else { + if ( cur->first!=NULL ) + cur->last->nextcpindex = i; + last_off = true; + sp = NULL; + } + if ( sp!=NULL ) { + if ( cur->first==NULL ) + cur->first = sp; + else + SplineMake(cur->last,sp,is_order2); + cur->last = sp; + } + ++i; + } + if ( start==i-1 ) { + /* MS chinese fonts have contours consisting of a single off curve*/ + /* point. What on earth do they think that means? */ + /* Oh. I see. It's used to possition marks and such */ + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = pts[start].x; + sp->me.y = pts[start].y; + sp->nextcp = sp->prevcp = sp->me; + sp->nonextcp = sp->noprevcp = true; + sp->ttfindex = i-1; + sp->nextcpindex = 0xffff; + cur->first = cur->last = sp; + } else if ( !(flags[start]&_On_Curve) && !(flags[i-1]&_On_Curve) ) { + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = (pts[start].x+pts[i-1].x)/2; + sp->me.y = (pts[start].y+pts[i-1].y)/2; + sp->nextcp = sp->prevcp = sp->me; + sp->nonextcp = true; + sp->ttfindex = 0xffff; + sp->nextcpindex = start; + FigureControls(cur->last,sp,&pts[i-1],is_order2); + SplineMake(cur->last,sp,is_order2); + cur->last = sp; + FigureControls(sp,cur->first,&pts[start],is_order2); + } else if ( !(flags[i-1]&_On_Curve)) { + FigureControls(cur->last,cur->first,&pts[i-1],is_order2); + cur->last->nextcpindex = i-1; + } else if ( !(flags[start]&_On_Curve) ) { + FigureControls(cur->last,cur->first,&pts[start],is_order2); + sp->nextcpindex = start; + } + if ( cur->last!=cur->first ) { + SplineMake(cur->last,cur->first,is_order2); + cur->last = cur->first; + } + } +return( head ); +} + +static void readttfsimpleglyph(FILE *ttf,struct ttfinfo *info,SplineChar *sc, int path_cnt) { + uint16 *endpt = galloc((path_cnt+1)*sizeof(uint16)); + uint8 *instructions; + char *flags; + BasePoint *pts; + int i, j, tot, len; + int last_pos; + + for ( i=0; i=tot ) { + GDrawIError("Flag count is wrong (or total is): %d %d", i+cnt, tot ); + cnt = tot-i-1; + } + for ( j=0; jlayers[ly_fore].splines = ttfbuildcontours(path_cnt,endpt,flags,pts,info->to_order2); + if ( info->to_order2 && len!=0 ) { + sc->ttf_instrs_len = len; + sc->ttf_instrs = instructions; + } else + free(instructions); + SCCatagorizePoints(sc); + free(endpt); + free(flags); + free(pts); + if ( feof(ttf)) + fprintf( stderr, "Reached end of file when reading simple glyph\n" ); +} + +#define _ARGS_ARE_WORDS 1 +#define _ARGS_ARE_XY 2 +#define _ROUND 4 /* round offsets so componant is on grid */ +#define _SCALE 8 +/* 0x10 is reserved */ +#define _MORE 0x20 +#define _XY_SCALE 0x40 +#define _MATRIX 0x80 +#define _INSTR 0x100 +#define _MY_METRICS 0x200 +#define _OVERLAP_COMPOUND 0x400 /* Used in Apple GX fonts */ + /* Means the components overlap (which? this one and what other?) */ +/* Described in OpenType specs, not by Apple */ +/* amusingly, Apple supports but MS does not */ +/* MS says they support this after Win 2000 */ +#define _SCALED_OFFSETS 0x800 /* Use Apple definition of offset interpretation */ +#define _UNSCALED_OFFSETS 0x1000 /* Use MS definition */ + +static void readttfcompositglyph(FILE *ttf,struct ttfinfo *info,SplineChar *sc, int32 end) { + RefChar *head=NULL, *last=NULL, *cur; + int flags, arg1, arg2; + + do { + if ( ftell(ttf)>=end ) { + fprintf( stderr, "Bad flags value, implied MORE components at end of glyph %d\n", sc->enc ); + break; + } + cur = RefCharCreate(); + flags = getushort(ttf); + cur->local_enc = getushort(ttf); + if ( info->inuse!=NULL ) + info->inuse[cur->local_enc] = true; + if ( flags&_ARGS_ARE_WORDS ) { + arg1 = (short) getushort(ttf); + arg2 = (short) getushort(ttf); + } else { + arg1 = (signed char) getc(ttf); + arg2 = (signed char) getc(ttf); + } + cur->transform[4] = arg1; + cur->transform[5] = arg2; + if ( flags & _ARGS_ARE_XY ) { + /* There is some very strange stuff (half-)documented on the apple*/ + /* site about how these should be interpretted when there are */ + /* scale factors, or rotations */ + /* It isn't well enough described to be comprehensible */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* Microsoft says nothing about this */ + /* Adobe implies this is a difference between MS and Apple */ + /* MS doesn't do this, Apple does (GRRRGH!!!!) */ + /* Adobe says that setting bit 12 means that this will not happen */ + /* Adobe says that setting bit 11 means that this will happen */ + /* So if either bit is set we know when this happens, if neither */ + /* we guess... But I still don't know how to interpret the */ + /* apple mode under rotation... */ + /* I notice that FreeType does nothing about rotation nor does it */ + /* interpret bits 11&12 */ + /* Ah. It turns out that even Apple does not do what Apple's docs */ + /* claim it does. I think I've worked it out (see below), but... */ + /* Bleah! */ + } else { + /* Somehow we can get offsets by looking at the points in the */ + /* points so far generated and comparing them to the points in */ + /* the current componant */ + /* How exactly is not described on any of the Apple, MS, Adobe */ + /* freetype looks up arg1 in the set of points we've got so far */ + /* looks up arg2 in the new component (before renumbering) */ + /* offset.x = arg1.x - arg2.x; offset.y = arg1.y - arg2.y; */ + /* This fixup needs to be done later though (after all glyphs */ + /* have been loaded) */ + cur->point_match = true; + } + cur->transform[0] = cur->transform[3] = 1.0; + if ( flags & _SCALE ) + cur->transform[0] = cur->transform[3] = get2dot14(ttf); + else if ( flags & _XY_SCALE ) { + cur->transform[0] = get2dot14(ttf); + cur->transform[3] = get2dot14(ttf); + } else if ( flags & _MATRIX ) { + cur->transform[0] = get2dot14(ttf); + cur->transform[1] = get2dot14(ttf); + cur->transform[2] = get2dot14(ttf); + cur->transform[3] = get2dot14(ttf); + } + if ( flags & _ARGS_ARE_XY ) { /* Only muck with these guys if they are real offsets and not point matching */ +#ifdef __Mac + /* On mac assume scaled offsets unless told unscaled explicitly */ + if ( !(flags&_UNSCALED_OFFSETS) && +#else + /* everywhere else assume unscaled offsets unless told scaled explicitly */ + if ( (flags & _SCALED_OFFSETS) && +#endif + (flags & _ARGS_ARE_XY) && (flags&(_SCALE|_XY_SCALE|_MATRIX))) { + /*static int asked = 0;*/ + /* This is not what Apple documents on their website. But it is */ + /* what appears to match the behavior of their rasterizer */ + /* Apple has changed their documentation (without updating their */ + /* changelog), but I believe they are still incorrect */ + cur->transform[4] *= sqrt(cur->transform[0]*cur->transform[0]+ + cur->transform[1]*cur->transform[1]); + cur->transform[5] *= sqrt(cur->transform[2]*cur->transform[2]+ + cur->transform[3]*cur->transform[3]); +#if 0 + /* Apple's Chicago is an example */ + if ( info->fontname!=NULL && strcmp(info->fontname,"CompositeMac")!=0 && !asked ) { + /* Not interested in the test font I generated myself */ + asked = true; + fprintf( stderr, "Neat! You've got a font that actually uses Apple's scaled composite offsets.\n" ); + fprintf( stderr, " I've never seen one, could you send me a copy of %s?\n", info->fontname ); + fprintf( stderr, " Thanks. gww@silcom.com\n" ); + } +#endif + } + } + if ( cur->local_enc>=info->glyph_cnt ) { + fprintf(stderr, "Glyph %d attempts to reference glyph %d which is outside the font\n", sc->enc, cur->local_enc ); + chunkfree(cur,sizeof(*cur)); + } else { + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + if ( feof(ttf)) { + fprintf(stderr, "Reached end of file when reading composit glyph\n" ); + break; + } + } while ( flags&_MORE ); + if ( (flags & _INSTR ) && info->to_order2 ) { + sc->ttf_instrs_len = getushort(ttf); + if ( sc->ttf_instrs_len != 0 ) { + uint8 *instructions = galloc(sc->ttf_instrs_len); + int i; + for ( i=0; ittf_instrs_len; ++i ) + instructions[i] = getc(ttf); + sc->ttf_instrs = instructions; + } + } + /* I'm ignoring many things that I don't understand here */ + /* USE_MY_METRICS, what happens if ARGS AREN'T XY */ + /* ROUND means that offsets should rounded to the grid before being added */ + /* (it's irrelevant for my purposes) */ + sc->layers[ly_fore].refs = head; +} + +static SplineChar *readttfglyph(FILE *ttf,struct ttfinfo *info,int start, int end,int enc) { + int path_cnt; + SplineChar *sc = SplineCharCreate(); + + sc->unicodeenc = -1; + sc->vwidth = info->emsize; + /* sc->manualhints = 1; */ /* But only when I know how to read them in!!!! */ + + if ( end>info->glyph_length ) { + if ( !info->complainedbeyondglyfend ) + fprintf(stderr, "Bad glyph (%d), its definition extends beyond the end of the glyf table\n", enc ); + info->complainedbeyondglyfend = true; + SplineCharFree(sc); +return( NULL ); + } + if ( start==end ) { + /* This isn't mentioned, but we seem to get some glyphs with no size,*/ + /* not even a path cnt. They appear to be empty glyphs */ +return( sc ); + } + fseek(ttf,info->glyph_start+start,SEEK_SET); + path_cnt = (short) getushort(ttf); + /* xmin = */ getushort(ttf); + /* ymin = */ getushort(ttf); + /* xmax = */ getushort(ttf); + /* ymax = */ sc->lsidebearing = getushort(ttf); + sc->enc = enc; + if ( path_cnt>=0 ) + readttfsimpleglyph(ttf,info,sc,path_cnt); + else + readttfcompositglyph(ttf,info,sc,info->glyph_start+end); + if ( ftell(ttf)>info->glyph_start+end ) + fprintf(stderr, "Bad glyph (%d), its definition extends beyond the space allowed for it\n", enc ); + sc->enc = 0; +return( sc ); +} + +static void readttfencodings(FILE *ttf,struct ttfinfo *info, int justinuse); + +static void readttfglyphs(FILE *ttf,struct ttfinfo *info) { + int i, anyread; + uint32 *goffsets = galloc((info->glyph_cnt+1)*sizeof(uint32)); + + /* First we read all the locations. This might not be needed, they may */ + /* just follow one another, but nothing I've noticed says that so let's */ + /* be careful */ + fseek(ttf,info->glyphlocations_start,SEEK_SET); + if ( info->index_to_loc_is_long ) { + for ( i=0; i<=info->glyph_cnt ; ++i ) + goffsets[i] = getlong(ttf); + } else { + for ( i=0; i<=info->glyph_cnt ; ++i ) + goffsets[i] = 2*getushort(ttf); + } + + info->chars = gcalloc(info->glyph_cnt,sizeof(SplineChar *)); + if ( !info->is_ttc ) { + /* read all the glyphs */ + for ( i=0; iglyph_cnt ; ++i ) { + info->chars[i] = readttfglyph(ttf,info,goffsets[i],goffsets[i+1],i); + GProgressNext(); + } + } else { + /* only read the glyphs we actually use in this font */ + /* this is complicated by references (and substitutions), */ + /* we can't just rely on the encoding to tell us what is used */ + info->inuse = gcalloc(info->glyph_cnt,sizeof(char)); + readttfencodings(ttf,info,true); + if ( info->gsub_start!=0 ) /* Some glyphs may appear in substitutions and not in the encoding... */ + readttfgsubUsed(ttf,info); + /* I don't bother to read the morx table because mac doesn't */ + /* support ttc files */ + anyread = true; + while ( anyread ) { + anyread = false; + for ( i=0; iglyph_cnt ; ++i ) { + if ( info->inuse[i] && info->chars[i]==NULL ) { + info->chars[i] = readttfglyph(ttf,info,goffsets[i],goffsets[i+1],i); + GProgressNext(); + anyread = info->chars[i]!=NULL; + } + } + } + free(info->inuse); info->inuse = NULL; + } + free(goffsets); + for ( i=0; iglyph_cnt ; ++i ) + if ( info->chars[i]!=NULL ) + info->chars[i]->orig_pos = i; + GProgressNextStage(); +} + +/* Standard names for cff */ +const char *cffnames[] = { + ".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", + NULL +}; +const int nStdStrings = sizeof(cffnames)/sizeof(cffnames[0])-1; + +static char **readcfffontnames(FILE *ttf) { + uint16 count = getushort(ttf); + int offsize; + uint32 *offsets; + char **names; + int i,j; + + if ( count==0 ) +return( NULL ); + offsets = galloc((count+1)*sizeof(uint32)); + offsize = getc(ttf); + for ( i=0; i<=count; ++i ) + offsets[i] = getoffset(ttf,offsize); + names = galloc((count+1)*sizeof(char *)); + for ( i=0; i>4); + pt = addnibble(pt,ch&0xf); + } + } while ( pt[-1]!='\0' ); + *dval = strtod(buffer,NULL); +return( 2 ); + } else if ( ch>=32 && ch<=246 ) { + *_ival = ch-139; +return( 1 ); + } else if ( ch>=247 && ch<=250 ) { + *_ival = ((ch-247)<<8) + getc(ttf)+108; +return( 1 ); + } else if ( ch>=251 && ch<=254 ) { + *_ival = -((ch-251)<<8) - getc(ttf)-108; +return( 1 ); + } else if ( ch==28 ) { + ival = getc(ttf)<<8; + *_ival = (short) (ival | getc(ttf)); +return( 1 ); + } else if ( ch==29 ) { + /* 4 byte integers exist in dict data but not in type2 strings */ + ival = getc(ttf)<<24; + ival = ival | getc(ttf)<<16; + ival = ival | getc(ttf)<<8; + *_ival = (int) (ival | getc(ttf)); +return( 1 ); + } + fprintf(stderr, "Unexpected value in dictionary %d\n", ch ); + *_ival = 0; +return( 0 ); +} + +static void skipcfft2thing(FILE *ttf) { + /* The old CFF spec allows little type2 programs to live in the CFF dict */ + /* indeces. These are designed to allow interpolation of values for mm */ + /* fonts. */ + /* The Type2 program is terminated by an "endchar" operator */ + /* I don't support this, but I shall try to skip over them properly */ + /* There's no discussion about how values move from the t2 stack to the */ + /* cff stack, as there are no examples of this, it's hard to guess */ + int ch; + + fprintf( stderr, "FontForge does not support type2 programs embedded in CFF dict indeces.\n" ); + forever { + ch = getc(ttf); + if ( ch>=247 && ch<=254 ) + getc(ttf); /* Two byte number */ + else if ( ch==255 ) { + getc(ttf); getc(ttf); getc(ttf); getc(ttf); + /* 16.16 number */ + } else if ( ch==28 ) { + getc(ttf); + getc(ttf); + } else if ( ch==12 ) { + getc(ttf); /* Two byte operator */ + } else if ( ch==14 ) { +return; + } + } +} + +struct topdicts { + int32 cff_start; + + char *fontname; /* From Name Index */ + + int version; /* SID */ + int notice; /* SID */ + int copyright; /* SID */ + int fullname; /* SID */ + int familyname; /* SID */ + int weight; /* SID */ + int isfixedpitch; + real italicangle; + real underlinepos; + real underlinewidth; + int painttype; + int charstringtype; + real fontmatrix[6]; + int uniqueid; + real fontbb[4]; + real strokewidth; + int xuid[20]; + int charsetoff; /* from start of file */ + int encodingoff; /* from start of file */ + int charstringsoff; /* from start of file */ + int private_size; + int private_offset; /* from start of file */ + int synthetic_base; /* font index */ + int postscript_code; /* SID */ + /* synthetic fonts only (whatever they are) */ + int basefontname; /* SID */ + /* Multiple master/synthetic fonts */ + real basefontblend[16]; /* delta */ /* No description of why this is relevant for mm fonts */ + /* Multiple master fonts only */ + int blendaxistypes[17]; /* SID */ + int nMasters; + int nAxes; + real weightvector[17]; + int lenBuildCharArray; /* No description of what this means */ + int NormalizeDesignVector; /* SID */ /* No description of what this does */ + int ConvertDesignVector; /* SID */ /* No description of what this does */ + /* CID fonts only */ + int ros_registry; /* SID */ + int ros_ordering; /* SID */ + int ros_supplement; + real cidfontversion; + int cidfontrevision; + int cidfonttype; + int cidcount; + int uidbase; + int fdarrayoff; /* from start of file */ + int fdselectoff; /* from start of file */ + int sid_fontname; /* SID */ +/* Private stuff */ + real bluevalues[14]; + real otherblues[10]; + real familyblues[14]; + real familyotherblues[10]; + real bluescale; + real blueshift; + real bluefuzz; + int stdhw; + int stdvw; + real stemsnaph[10]; + real stemsnapv[10]; + int forcebold; + real forceboldthreshold; + int languagegroup; + real expansionfactor; + int initialRandomSeed; + int subrsoff; /* from start of this private table */ + int defaultwidthx; + int nominalwidthx; + + struct pschars glyphs; + struct pschars local_subrs; + uint16 *charset; +}; + +static void TopDictFree(struct topdicts *dict) { + int i; + + free(dict->charset); + for ( i=0; iglyphs.cnt; ++i ) + free(dict->glyphs.values[i]); + free(dict->glyphs.values); + free(dict->glyphs.lens); + for ( i=0; ilocal_subrs.cnt; ++i ) + free(dict->local_subrs.values[i]); + free(dict->local_subrs.values); + free(dict->local_subrs.lens); + free(dict); +} + +static void readcffsubrs(FILE *ttf, struct pschars *subs) { + uint16 count = getushort(ttf); + int offsize; + uint32 *offsets; + int i,j; + + memset(subs,'\0',sizeof(struct pschars)); + if ( count==0 ) +return; + subs->cnt = count; + subs->lens = galloc(count*sizeof(int)); + subs->values = galloc(count*sizeof(uint8 *)); + offsets = galloc((count+1)*sizeof(uint32)); + offsize = getc(ttf); + for ( i=0; i<=count; ++i ) + offsets[i] = getoffset(ttf,offsize); + for ( i=0; ilens[i] = offsets[i+1]-offsets[i]; + subs->values[i] = galloc(offsets[i+1]-offsets[i]+1); + for ( j=0; jvalues[i][j] = getc(ttf); + subs->values[i][j] = '\0'; + } + free(offsets); +} + +static struct topdicts *readcfftopdict(FILE *ttf, char *fontname, int len) { + struct topdicts *td = gcalloc(1,sizeof(struct topdicts)); + long base = ftell(ttf); + int ival, oval, sp, ret, i; + real stack[50]; + + td->fontname = fontname; + td->underlinepos = -100; + td->underlinewidth = 50; + td->charstringtype = 2; + td->fontmatrix[0] = td->fontmatrix[3] = .001; + + td->notice = td->copyright = td->fullname = td->familyname = td->weight = td->version = -1; + td->postscript_code = td->basefontname = -1; + td->synthetic_base = td->ros_registry = -1; + td->fdarrayoff = td->fdselectoff = td->sid_fontname = -1; + td->blendaxistypes[0] = -1; + + /* Multiple master fonts can have Type2 operators here, particularly */ + /* blend operators. We're ignoring that */ + while ( ftell(ttf)version = stack[sp-1]; + break; + case 1: + td->notice = stack[sp-1]; + break; + case (12<<8)+0: + td->copyright = stack[sp-1]; + break; + case 2: + td->fullname = stack[sp-1]; + break; + case 3: + td->familyname = stack[sp-1]; + break; + case 4: + td->weight = stack[sp-1]; + break; + case (12<<8)+1: + td->isfixedpitch = stack[sp-1]; + break; + case (12<<8)+2: + td->italicangle = stack[sp-1]; + break; + case (12<<8)+3: + td->underlinepos = stack[sp-1]; + break; + case (12<<8)+4: + td->underlinewidth = stack[sp-1]; + break; + case (12<<8)+5: + td->painttype = stack[sp-1]; + break; + case (12<<8)+6: + td->charstringtype = stack[sp-1]; + break; + case (12<<8)+7: + memcpy(td->fontmatrix,stack,(sp>=6?6:sp)*sizeof(real)); + break; + case 13: + td->uniqueid = stack[sp-1]; + break; + case 5: + memcpy(td->fontbb,stack,(sp>=4?4:sp)*sizeof(real)); + break; + case (12<<8)+8: + td->strokewidth = stack[sp-1]; + break; + case 14: + for ( i=0; ixuid[i] = stack[i]; + break; + case 15: + td->charsetoff = stack[sp-1]; + break; + case 16: + td->encodingoff = stack[sp-1]; + break; + case 17: + td->charstringsoff = stack[sp-1]; + break; + case 18: + td->private_size = stack[0]; + td->private_offset = stack[1]; + break; + case (12<<8)+20: + fprintf( stderr, "FontForge does not support synthetic fonts\n" ); + td->synthetic_base = stack[sp-1]; + break; + case (12<<8)+21: + td->postscript_code = stack[sp-1]; + break; + case (12<<8)+22: + td->basefontname = stack[sp-1]; + break; + case (12<<8)+23: + for ( i=0; ibasefontblend[i] = stack[i]; + break; + case (12<<8)+24: + fprintf( stderr, "FontForge does not support type2 multiple master fonts\n" ); + td->nMasters = stack[0]; + td->nAxes = sp-4; + memcpy(td->weightvector,stack+1,(sp-4)*sizeof(real)); + td->lenBuildCharArray = stack[sp-3]; + td->NormalizeDesignVector = stack[sp-2]; /* These are type2 charstrings, even in type1 fonts */ + td->ConvertDesignVector = stack[sp-1]; + break; + case (12<<8)+26: + for ( i=0; iblendaxistypes[i] = stack[i]; + td->blendaxistypes[i] = -1; + break; + case (12<<8)+30: + td->ros_registry = stack[0]; + td->ros_ordering = stack[1]; + td->ros_supplement = stack[2]; + break; + case (12<<8)+31: + td->cidfontversion = stack[sp-1]; + break; + case (12<<8)+32: + td->cidfontrevision = stack[sp-1]; + break; + case (12<<8)+33: + td->cidfonttype = stack[sp-1]; + break; + case (12<<8)+34: + td->cidcount = stack[sp-1]; + break; + case (12<<8)+35: + td->uidbase = stack[sp-1]; + break; + case (12<<8)+36: + td->fdarrayoff = stack[sp-1]; + break; + case (12<<8)+37: + td->fdselectoff = stack[sp-1]; + break; + case (12<<8)+38: + td->sid_fontname = stack[sp-1]; + break; + case (12<<8)+39: + fprintf(stderr, "FontForge does not support Chameleon fonts\n");; + break; + default: + fprintf(stderr,"Unknown operator in %s: %x\n", fontname, oval ); + break; + } + } +return( td ); +} + +static void readcffprivate(FILE *ttf, struct topdicts *td) { + int ival, oval, sp, ret, i; + real stack[50]; + int32 end = td->cff_start+td->private_offset+td->private_size; + + fseek(ttf,td->cff_start+td->private_offset,SEEK_SET); + + td->subrsoff = -1; + td->expansionfactor = .06; + td->bluefuzz = 1; + td->blueshift = 7; + td->bluescale = .039625; + + while ( ftell(ttf)bluevalues[i] = stack[i]; + if ( i!=0 ) + td->bluevalues[i] += td->bluevalues[i-1]; + } + break; + case 7: + for ( i=0; iotherblues[i] = stack[i]; + if ( i!=0 ) + td->otherblues[i] += td->otherblues[i-1]; + } + break; + case 8: + for ( i=0; ifamilyblues[i] = stack[i]; + if ( i!=0 ) + td->familyblues[i] += td->familyblues[i-1]; + } + break; + case 9: + for ( i=0; ifamilyotherblues[i] = stack[i]; + if ( i!=0 ) + td->familyotherblues[i] += td->familyotherblues[i-1]; + } + break; + case (12<<8)+9: + td->bluescale = stack[sp-1]; + break; + case (12<<8)+10: + td->blueshift = stack[sp-1]; + break; + case (12<<8)+11: + td->bluefuzz = stack[sp-1]; + break; + case 10: + td->stdhw = stack[sp-1]; + break; + case 11: + td->stdvw = stack[sp-1]; + break; + case (12<<8)+12: + for ( i=0; istemsnaph[i] = stack[i]; + if ( i!=0 ) + td->stemsnaph[i] += td->stemsnaph[i-1]; + } + break; + case (12<<8)+13: + for ( i=0; istemsnapv[i] = stack[i]; + if ( i!=0 ) + td->stemsnapv[i] += td->stemsnapv[i-1]; + } + break; + case (12<<8)+14: + td->forcebold = stack[sp-1]; + break; + case (12<<8)+15: + td->forceboldthreshold = stack[sp-1]; + break; + case (12<<8)+16: + /* lenIV. -1 => unencrypted charstrings */ + /* obsolete */ + break; + case (12<<8)+17: + td->languagegroup = stack[sp-1]; + break; + case (12<<8)+18: + td->expansionfactor = stack[sp-1]; + break; + case (12<<8)+19: + td->initialRandomSeed = stack[sp-1]; + break; + case 19: + td->subrsoff = stack[sp-1]; + break; + case 20: + td->defaultwidthx = stack[sp-1]; + break; + case 21: + td->nominalwidthx = stack[sp-1]; + break; + default: + fprintf(stderr,"Unknown operator in %s: %x\n", td->fontname, oval ); + break; + } + } + + if ( td->subrsoff!=-1 ) { + fseek(ttf,td->cff_start+td->private_offset+td->subrsoff,SEEK_SET); + readcffsubrs(ttf,&td->local_subrs); + } +} + +static struct topdicts **readcfftopdicts(FILE *ttf, char **fontnames, int32 cff_start) { + uint16 count = getushort(ttf); + int offsize; + uint32 *offsets; + struct topdicts **dicts; + int i; + + if ( count==0 ) +return( NULL ); + offsets = galloc((count+1)*sizeof(uint32)); + offsize = getc(ttf); + for ( i=0; i<=count; ++i ) + offsets[i] = getoffset(ttf,offsize); + dicts = galloc((count+1)*sizeof(struct topdicts *)); + for ( i=0; icff_start = cff_start; + } + dicts[i] = NULL; + free(offsets); +return( dicts ); +} + +static const char *getsid(int sid,char **strings) { + if ( sid==-1 ) +return( NULL ); + else if ( sidsc = sc; + d->uni = uni; + d->enc = enc; + d->prev = prev; +return( d ); +} + +/* I really expect to deal with encodings in ttf cmap, but ocasionally we */ +/* get a bare cff */ +static void readcffenc(FILE *ttf,struct topdicts *dict,struct ttfinfo *info, + char **strings) { + int format, cnt, i, j, pos, first, last, dupenc, sid, next; + extern char *AdobeStandardEncoding[], *AdobeExpertEncoding[]; + const char *name; + + if ( info->encoding_start!=0 ) /* Use the cmap instead */ +return; + + for ( i=0; iglyph_cnt; ++i ) { + if ( info->chars[i]->unicodeenc==-1 ) + info->chars[i]->unicodeenc = UniFromName(info->chars[i]->name); + } + + if ( dict->encodingoff==0 || dict->encodingoff==1 ) { + /* Standard Encodings */ + char **enc = dict->encodingoff==0 ? AdobeStandardEncoding : AdobeExpertEncoding; + info->encoding_name = dict->encodingoff==0 ? em_adobestandard : em_custom; + next = 256; + for ( i=0; iglyph_cnt; ++i ) { + for ( pos=0; pos<256; ++pos ) + if ( strcmp(info->chars[i]->name,enc[pos])==0 ) + break; + if ( pos<256 ) + info->chars[i]->enc = pos; + else + info->chars[i]->enc = next++; + } + } else { + info->encoding_name = em_custom; + fseek(ttf,dict->cff_start+dict->encodingoff,SEEK_SET); + format = getc(ttf); + if ( (format&0x7f)==0 ) { + cnt = getc(ttf); + for ( i=0; iglyph_cnt; ++i ) + info->chars[i]->enc = getc(ttf); + next = 256; + for ( ; iglyph_cnt; ++i ) + info->chars[i]->enc = next++; + } else if ( (format&0x7f)==1 ) { + cnt = getc(ttf); + pos = 0; + for ( i=1; iglyph_cnt; ++i ) + info->chars[i]->enc = -1; + for ( i=0; iglyph_cnt ) + info->chars[pos]->enc = first; + ++pos; + ++first; + } + } + next = 256; + for ( i=0; iglyph_cnt; ++i ) + if ( info->chars[i]->enc==-1 ) + info->chars[i]->enc = next++; + } else + fprintf( stderr, "Unexpected encoding format in cff: %d\n", format ); + if ( format&0x80 ) { + cnt = getc(ttf); + for ( i=0; iglyph_cnt; ++j ) + if ( strcmp(name,info->chars[j]->name)==0 ) + break; + if ( j!=info->glyph_cnt ) + info->dups = makedup(info->chars[j],-1,dupenc,info->dups); + } + } + } +} + +static void readcffset(FILE *ttf,struct topdicts *dict) { + int len = dict->glyphs.cnt; + int i; + int format, cnt, j, first; + + if ( dict->charsetoff==0 ) { + /* ISO Adobe charset */ + dict->charset = galloc(len*sizeof(uint16)); + for ( i=0; icharset[i] = i; + } else if ( dict->charsetoff==1 ) { + /* Expert charset */ + dict->charset = galloc((len<162?162:len)*sizeof(uint16)); + dict->charset[0] = 0; /* .notdef */ + dict->charset[1] = 1; + for ( i=2; icharset[i] = i+227; + dict->charset[12] = 13; + dict->charset[13] = 14; + dict->charset[14] = 15; + dict->charset[15] = 99; + for ( i=16; icharset[i] = i+223; + dict->charset[25] = 27; + dict->charset[26] = 28; + for ( i=27; icharset[i] = i+222; + dict->charset[44] = 109; + dict->charset[45] = 110; + for ( i=46; icharset[i] = i+221; + dict->charset[96] = 158; + dict->charset[97] = 155; + dict->charset[98] = 163; + for ( i=99; icharset[i] = i+220; + dict->charset[107] = 150; + dict->charset[108] = 164; + dict->charset[109] = 169; + for ( i=110; icharset[i] = i+217; + } else if ( dict->charsetoff==2 ) { + /* Expert subset charset */ + dict->charset = galloc((len<130?130:len)*sizeof(uint16)); + dict->charset[0] = 0; /* .notdef */ + dict->charset[1] = 1; + for ( i=2; icharset[i] = i+227; + dict->charset[12] = 13; + dict->charset[13] = 14; + dict->charset[14] = 15; + dict->charset[15] = 99; + for ( i=16; icharset[i] = i+223; + dict->charset[25] = 27; + dict->charset[26] = 28; + for ( i=27; icharset[i] = i+222; + dict->charset[44] = 109; + dict->charset[45] = 110; + for ( i=46; icharset[i] = i+221; + dict->charset[51] = 300; + dict->charset[52] = 301; + dict->charset[53] = 302; + dict->charset[54] = 305; + dict->charset[55] = 314; + dict->charset[56] = 315; + dict->charset[57] = 158; + dict->charset[58] = 155; + dict->charset[59] = 163; + for ( i=60; icharset[i] = i+260; + dict->charset[67] = 150; + dict->charset[68] = 164; + dict->charset[69] = 169; + for ( i=110; icharset[i] = i+217; + } else { + dict->charset = galloc(len*sizeof(uint16)); + dict->charset[0] = 0; /* .notdef */ + fseek(ttf,dict->cff_start+dict->charsetoff,SEEK_SET); + format = getc(ttf); + if ( format==0 ) { + for ( i=1; icharset[i] = getushort(ttf); + } else if ( format==1 ) { + for ( i = 1; icharset[i++] = getushort(ttf); + cnt = getc(ttf); + for ( j=0; jcharset[i++] = ++first; + } + } else if ( format==2 ) { + for ( i = 1; icharset[i++] = getushort(ttf); + cnt = getushort(ttf); + for ( j=0; jcharset[i++] = ++first; + } + } else + fprintf( stderr, "Unexpected charset format in cff: %d\n", format ); + } + while ( icharset[i++] = 0; +} + +static uint8 *readfdselect(FILE *ttf,int numglyphs) { + uint8 *fdselect = gcalloc(numglyphs,sizeof(uint8)); + int i, j, format, nr, first, end, fd; + + format = getc(ttf); + if ( format==0 ) { + for ( i=0; i=numglyphs ) + fprintf( stderr, "Bad fdselect\n" ); + else + fdselect[j] = fd; + } + first = end; + } + } else { + fprintf( stderr, "Didn't understand format for fdselect %d\n", format ); + } +return( fdselect ); +} + + +static char *intarray2str(int *array, int size) { + int i,j; + char *pt, *ret; + + for ( i=size-1; i>=0 && array[i]==0; --i ); + if ( i==-1 ) +return( NULL ); + ret = pt = galloc((i+1)*12+12); + *pt++ = '['; + for ( j=0; j<=i; ++j ) { + sprintf( pt, "%d ", array[j]); + pt += strlen(pt); + } + pt[-1]=']'; +return( ret ); +} + +static char *realarray2str(real *array, int size) { + int i,j; + char *pt, *ret; + + for ( i=size-1; i>=0 && array[i]==0; --i ); + if ( i==-1 ) +return( NULL ); + ret = pt = galloc((i+1)*20+12); + *pt++ = '['; + for ( j=0; j<=i; ++j ) { + sprintf( pt, "%g ", array[j]); + pt += strlen(pt); + } + pt[-1]=']'; +return( ret ); +} + +static void privateadd(struct psdict *private,char *key,char *value) { + if ( value==NULL ) +return; + private->keys[private->next] = copy(key); + private->values[private->next++] = value; +} + +static void privateaddint(struct psdict *private,char *key,int val) { + char buf[10]; + if ( val==0 ) +return; + sprintf( buf,"%d", val ); + privateadd(private,key,copy(buf)); +} + +static void privateaddintarray(struct psdict *private,char *key,int val) { + char buf[10]; + if ( val==0 ) +return; + sprintf( buf,"[%d]", val ); + privateadd(private,key,copy(buf)); +} + +static void privateaddreal(struct psdict *private,char *key,real val) { + char buf[10]; + if ( val==0 ) +return; + sprintf( buf,"%g", val ); + privateadd(private,key,copy(buf)); +} + +static void cffprivatefillup(struct psdict *private, struct topdicts *dict) { + private->cnt = 14; + private->keys = galloc(14*sizeof(char *)); + private->values = galloc(14*sizeof(char *)); + privateadd(private,"BlueValues", + realarray2str(dict->bluevalues,sizeof(dict->bluevalues)/sizeof(dict->bluevalues[0]))); + privateadd(private,"OtherBlues", + realarray2str(dict->otherblues,sizeof(dict->otherblues)/sizeof(dict->otherblues[0]))); + privateadd(private,"FamilyBlues", + realarray2str(dict->familyblues,sizeof(dict->familyblues)/sizeof(dict->familyblues[0]))); + privateadd(private,"FamilyOtherBlues", + realarray2str(dict->familyotherblues,sizeof(dict->familyotherblues)/sizeof(dict->familyotherblues[0]))); + privateaddreal(private,"BlueScale",dict->bluescale); + privateaddreal(private,"BlueShift",dict->blueshift); + privateaddreal(private,"BlueFuzz",dict->bluefuzz); + privateaddintarray(private,"StdHW",dict->stdhw); + privateaddintarray(private,"StdVW",dict->stdvw); + privateadd(private,"SnapStemH", + realarray2str(dict->stemsnaph,sizeof(dict->stemsnaph)/sizeof(dict->stemsnaph[0]))); + privateadd(private,"SnapStemV", + realarray2str(dict->stemsnapv,sizeof(dict->stemsnapv)/sizeof(dict->stemsnapv[0]))); + if ( dict->forcebold ) + privateadd(private,"ForceBold",copy("true")); + if ( dict->forceboldthreshold!=0 ) + privateaddreal(private,"ForceBoldThreshold",dict->forceboldthreshold); + privateaddint(private,"LanguageGroup",dict->languagegroup); + privateaddreal(private,"ExpansionFactor",dict->expansionfactor); +} + +static SplineFont *cffsffillup(struct topdicts *subdict, char **strings ) { + SplineFont *sf = SplineFontEmpty(); + int emsize; + static int nameless; + + sf->fontname = copy(getsid(subdict->sid_fontname,strings)); + if ( sf->fontname==NULL ) { + char buffer[40]; + sprintf(buffer,"UntitledSubFont_%d", ++nameless ); + sf->fontname = copy(buffer); + } + sf->encoding_name = em_none; + + if ( subdict->fontmatrix[0]==0 ) + emsize = 1000; + else + emsize = rint( 1/subdict->fontmatrix[0] ); + sf->ascent = .8*emsize; + sf->descent = emsize - sf->ascent; + if ( subdict->copyright!=-1 ) + sf->copyright = copy(getsid(subdict->copyright,strings)); + else + sf->copyright = copy(getsid(subdict->notice,strings)); + sf->familyname = copy(getsid(subdict->familyname,strings)); + sf->fullname = copy(getsid(subdict->fullname,strings)); + sf->weight = copy(getsid(subdict->weight,strings)); + sf->version = copy(getsid(subdict->version,strings)); + sf->italicangle = subdict->italicangle; + sf->upos = subdict->underlinepos; + sf->uwidth = subdict->underlinewidth; + sf->xuid = intarray2str(subdict->xuid,sizeof(subdict->xuid)/sizeof(subdict->xuid[0])); + sf->uniqueid = subdict->uniqueid; + + if ( subdict->private_size>0 ) { + sf->private = gcalloc(1,sizeof(struct psdict)); + cffprivatefillup(sf->private,subdict); + } +return( sf ); +} + +static void cffinfofillup(struct ttfinfo *info, struct topdicts *dict, + char **strings ) { + + info->glyph_cnt = dict->glyphs.cnt; + + if ( dict->fontmatrix[0]==0 ) + info->emsize = 1000; + else + info->emsize = rint( 1/dict->fontmatrix[0] ); +#if 1 + info->ascent = .8*info->emsize; +#else + info->ascent = dict->fontbb[3]*info->emsize/(dict->fontbb[3]-dict->fontbb[1]); +#endif + info->descent = info->emsize - info->ascent; + if ( dict->copyright!=-1 || dict->notice!=-1 ) + free( info->copyright ); + if ( dict->copyright!=-1 ) + info->copyright = copy(getsid(dict->copyright,strings)); + else if ( dict->notice!=-1 ) + info->copyright = copy(getsid(dict->notice,strings)); + if ( dict->familyname!=-1 ) { + free(info->familyname); + info->familyname = copy(getsid(dict->familyname,strings)); + } + if ( dict->fullname!=-1 ) { + free(info->fullname); + info->fullname = copy(getsid(dict->fullname,strings)); + } + if ( dict->weight!=-1 ) { + free(info->weight); + info->weight = copy(getsid(dict->weight,strings)); + } + if ( dict->version!=-1 ) { + free(info->version); + info->version = copy(getsid(dict->version,strings)); + } + if ( dict->fontname!=NULL ) { + free(info->fontname); + info->fontname = copy(dict->fontname); + } + info->italicAngle = dict->italicangle; + info->upos = dict->underlinepos; + info->uwidth = dict->underlinewidth; + info->xuid = intarray2str(dict->xuid,sizeof(dict->xuid)/sizeof(dict->xuid[0])); + info->uniqueid = dict->uniqueid; + + if ( dict->private_size>0 ) { + info->private = gcalloc(1,sizeof(struct psdict)); + cffprivatefillup(info->private,dict); + } + if ( dict->ros_registry!=-1 ) { + info->cidregistry = copy(getsid(dict->ros_registry,strings)); + info->ordering = copy(getsid(dict->ros_ordering,strings)); + info->supplement = dict->ros_supplement; + info->cidfontversion = dict->cidfontversion; + } +} + +static void cfffigure(struct ttfinfo *info, struct topdicts *dict, + char **strings, struct pschars *gsubrs) { + int i, cstype; + struct pschars *subrs; + struct pscontext pscontext; + + memset(&pscontext,0,sizeof(pscontext)); + + cffinfofillup(info, dict, strings ); + +/* The format allows for some dicts that are type1 strings and others that */ +/* are type2s. Which means that the global subrs will have a different bias */ +/* as we flip from font to font. So we can't set the bias when we read in */ +/* the subrs but must wait until we know which font we're working on. */ + cstype = dict->charstringtype; + pscontext.is_type2 = cstype-1; + gsubrs->bias = cstype==1 ? 0 : + gsubrs->cnt < 1240 ? 107 : + gsubrs->cnt <33900 ? 1131 : 32768; + subrs = &dict->local_subrs; + subrs->bias = cstype==1 ? 0 : + subrs->cnt < 1240 ? 107 : + subrs->cnt <33900 ? 1131 : 32768; + + info->chars = gcalloc(info->glyph_cnt,sizeof(SplineChar *)); + for ( i=0; iglyph_cnt; ++i ) { + info->chars[i] = PSCharStringToSplines( + dict->glyphs.values[i], dict->glyphs.lens[i],&pscontext, + subrs,gsubrs,getsid(dict->charset[i],strings)); + info->chars[i]->vwidth = info->emsize; + if ( cstype==2 ) { + if ( info->chars[i]->width == (int16) 0x8000 ) + info->chars[i]->width = dict->defaultwidthx; + else + info->chars[i]->width += dict->nominalwidthx; + } + } + /* Need to do a reference fixup here !!!!! just in case some idiot */ + /* used type1 char strings */ +} + +static void cidfigure(struct ttfinfo *info, struct topdicts *dict, + char **strings, struct pschars *gsubrs, struct topdicts **subdicts, + uint8 *fdselect) { + int i, j, cstype, uni, cid; + struct pschars *subrs; + SplineFont *sf; + struct cidmap *map; + char buffer[100]; + struct pscontext pscontext; + + memset(&pscontext,0,sizeof(pscontext)); + + cffinfofillup(info, dict, strings ); + + for ( j=0; subdicts[j]!=NULL; ++j ); + info->subfontcnt = j; + info->subfonts = gcalloc(j+1,sizeof(SplineFont *)); + for ( j=0; subdicts[j]!=NULL; ++j ) + info->subfonts[j] = cffsffillup(subdicts[j],strings); + for ( i=0; iglyph_cnt; ++i ) { + sf = info->subfonts[ fdselect[i] ]; + cid = dict->charset[i]; + if ( cid>=sf->charcnt ) sf->charcnt = cid+1; + } + for ( j=0; subdicts[j]!=NULL; ++j ) + info->subfonts[j]->chars = gcalloc(info->subfonts[j]->charcnt,sizeof(SplineChar *)); + + info->chars = gcalloc(info->glyph_cnt,sizeof(SplineChar *)); + + /* info->chars provides access to the chars ordered by glyph, which the */ + /* ttf routines care about */ + /* sf->chars provides access to the chars ordered by CID. Not sure what */ + /* would happen to a kern from one font to another... */ + + map = FindCidMap(info->cidregistry,info->ordering,info->supplement,NULL); + + for ( i=0; iglyph_cnt; ++i ) { + j = fdselect[i]; + sf = info->subfonts[ j ]; +/* The format allows for some dicts that are type1 strings and others that */ +/* are type2s. Which means that the global subrs will have a different bias */ +/* as we flip from font to font. So we can't set the bias when we read in */ +/* the subrs but must wait until we know which font we're working on. */ + cstype = subdicts[j]->charstringtype; + pscontext.is_type2 = cstype-1; + gsubrs->bias = cstype==1 ? 0 : + gsubrs->cnt < 1240 ? 107 : + gsubrs->cnt <33900 ? 1131 : 32768; + subrs = &subdicts[j]->local_subrs; + subrs->bias = cstype==1 ? 0 : + subrs->cnt < 1240 ? 107 : + subrs->cnt <33900 ? 1131 : 32768; + + cid = dict->charset[i]; + uni = CID2NameEnc(map,cid,buffer,sizeof(buffer)); + info->chars[i] = PSCharStringToSplines( + dict->glyphs.values[i], dict->glyphs.lens[i],&pscontext, + subrs,gsubrs,buffer); + info->chars[i]->vwidth = sf->ascent+sf->descent; + info->chars[i]->unicodeenc = uni; + sf->chars[cid] = info->chars[i]; + sf->chars[cid]->parent = sf; + sf->chars[cid]->enc = cid; + if ( sf->chars[cid]->layers[ly_fore].refs!=NULL ) + GDrawIError( "Reference found in CID font. Can't fix it up"); + if ( cstype==2 ) { + if ( sf->chars[cid]->width == (int16) 0x8000 ) + sf->chars[cid]->width = dict->defaultwidthx; + else + sf->chars[cid]->width += dict->nominalwidthx; + } + GProgressNext(); + } + /* No need to do a reference fixup here-- the chars aren't associated */ + /* with any encoding as is required for seac */ +} + +static int readcffglyphs(FILE *ttf,struct ttfinfo *info) { + int offsize; + int hdrsize; + char **fontnames, **strings; + struct topdicts **dicts, **subdicts; + int i, j, which; + struct pschars gsubs; + uint8 *fdselect; + + fseek(ttf,info->cff_start,SEEK_SET); + if ( getc(ttf)!='\1' ) { /* Major version */ + fprintf( stderr, "CFF version mismatch\n" ); +return( 0 ); + } + getc(ttf); /* Minor version */ + hdrsize = getc(ttf); + offsize = getc(ttf); + if ( hdrsize!=4 ) + fseek(ttf,info->cff_start+hdrsize,SEEK_SET); + fontnames = readcfffontnames(ttf); + which = 0; + if ( fontnames[1]!=NULL ) { /* More than one? Can that even happen in OpenType? */ + which = PickCFFFont(fontnames); + if ( which==-1 ) { + for ( i=0; fontnames[i]!=NULL; ++i ) + free(fontnames[i]); + free(fontnames); +return( 0 ); + } + } + dicts = readcfftopdicts(ttf,fontnames,info->cff_start); + /* String index is just the same as fontname index */ + strings = readcfffontnames(ttf); + readcffsubrs(ttf,&gsubs ); + /* Can be many fonts here. Only decompose the one */ + if ( dicts[which]->charstringsoff!=-1 ) { + fseek(ttf,info->cff_start+dicts[which]->charstringsoff,SEEK_SET); + readcffsubrs(ttf,&dicts[which]->glyphs); + } + if ( dicts[which]->private_offset!=-1 ) + readcffprivate(ttf,dicts[which]); + if ( dicts[which]->charsetoff!=-1 ) + readcffset(ttf,dicts[which]); + if ( dicts[which]->fdarrayoff==-1 ) + cfffigure(info,dicts[which],strings,&gsubs); + else { + fseek(ttf,info->cff_start+dicts[which]->fdarrayoff,SEEK_SET); + subdicts = readcfftopdicts(ttf,NULL,info->cff_start); + fseek(ttf,info->cff_start+dicts[which]->fdselectoff,SEEK_SET); + fdselect = readfdselect(ttf,dicts[which]->glyphs.cnt); + for ( j=0; subdicts[j]!=NULL; ++j ) { + if ( subdicts[j]->private_offset!=-1 ) + readcffprivate(ttf,subdicts[j]); + if ( subdicts[j]->charsetoff!=-1 ) + readcffset(ttf,subdicts[j]); + } + cidfigure(info,dicts[which],strings,&gsubs,subdicts,fdselect); + for ( j=0; subdicts[j]!=NULL; ++j ) + TopDictFree(subdicts[j]); + free(subdicts); free(fdselect); + } + if ( dicts[which]->encodingoff!=-1 ) + readcffenc(ttf,dicts[which],info,strings); + + if ( info->to_order2 ) { + for ( i=0; iglyph_cnt; ++i ) + SCConvertToOrder2(info->chars[i]); + } + + for ( i=0; fontnames[i]!=NULL && i<1; ++i ) { + free(fontnames[i]); + TopDictFree(dicts[i]); + } + free(fontnames); free(dicts); + if ( strings!=NULL ) { + for ( i=0; strings[i]!=NULL; ++i ) + free(strings[i]); + free(strings); + } + for ( i=0; iglyph_cnt ; ++i ) + if ( info->chars[i]!=NULL ) + info->chars[i]->orig_pos = i; + +return( 1 ); +} + +static void readttfwidths(FILE *ttf,struct ttfinfo *info) { + int i,j; + int lastwidth = info->emsize; + /* I'm not interested in the lsb, I'm not sure what it means if it differs*/ + /* from that is specified in the outline. Do we move the outline? */ + + fseek(ttf,info->hmetrics_start,SEEK_SET); + for ( i=0; iwidth_cnt && iglyph_cnt; ++i ) { + if ( info->chars[i]!=NULL ) { /* can happen in ttc files */ + info->chars[i]->width = lastwidth = getushort(ttf); + info->chars[i]->widthset = true; + } else + /* unused width = */ lastwidth = getushort(ttf); + /* lsb = */ getushort(ttf); + } + if ( i==0 ) + fprintf( stderr, "Invalid ttf hmtx table (or hhea), numOfLongMetrics is 0\n" ); + + for ( j=i; jglyph_cnt; ++j ) { + if ( info->chars[j]!=NULL ) { /* In a ttc file we may skip some */ + info->chars[j]->width = lastwidth; + info->chars[j]->widthset = true; + } + } +} + +static void readttfvwidths(FILE *ttf,struct ttfinfo *info) { + int i,j; + int lastvwidth = info->emsize, vwidth_cnt, tsb, cnt=0; + int32 voff=0; + + fseek(ttf,info->vhea_start+4+4,SEEK_SET); /* skip over the version number & typo right/left */ + info->pfminfo.vlinegap = getushort(ttf); + + for ( i=0; i<12; ++i ) + getushort(ttf); + vwidth_cnt = getushort(ttf); + + fseek(ttf,info->vmetrics_start,SEEK_SET); + for ( i=0; iglyph_cnt; ++i ) { + lastvwidth = getushort(ttf); + tsb = getushort(ttf); + if ( info->chars[i]!=NULL ) { /* can happen in ttc files */ + info->chars[i]->vwidth = lastvwidth; + if ( info->cff_start==0 ) { + voff += tsb + info->chars[i]->lsidebearing /* actually maxy */; + ++cnt; + } + } + } + if ( i==0 ) + fprintf( stderr, "Invalid ttf vmtx table (or vhea), numOfLongVerMetrics is 0\n" ); + + for ( j=i; jglyph_cnt; ++j ) { + if ( info->chars[j]!=NULL ) /* In a ttc file we may skip some */ + info->chars[j]->vwidth = lastvwidth; + } + + /* for truetype fonts the vertical offset is found by adding the ymax of a */ + /* character to the top side bearing. I set the font wide value to the */ + /* average of them all */ + /* But opentype doesn't give us the ymax easily, and rather than compute */ + /* the bounding box I'll just punt and pick a reasonable value */ + /* Of course I hope it will be over riden by the VORG table */ + if ( cnt!=0 ) + info->vertical_origin = (voff+cnt/2)/cnt; + if ( info->vertical_origin==0 ) + info->vertical_origin = info->ascent; + if ( info->vorg_start!=0 ) { + fseek(ttf,info->vorg_start+4,SEEK_SET); + info->vertical_origin = (short) getushort(ttf); + } +} + +static void dupfree(struct dup *dups) { + struct dup *next; + + while ( dups!=NULL ) { + next = dups->prev; + free(dups); + dups = next; + } +} + +static int modenc(int enc,int modtype) { +return( enc ); +} + +static int umodenc(int enc,int modtype) { + if ( modtype==-1 ) +return( -1 ); + if ( modtype<=1 /* Unicode */ ) { + /* No conversion */; + } else if ( modtype==2 /* SJIS */ ) { + if ( enc<=127 ) { + /* Latin */ + if ( enc=='\\' ) enc = 0xa5; /* Yen */ + } else if ( enc>=161 && enc<=223 ) { + /* Katakana */ + enc = unicode_from_jis201[enc]; + } else { + int ch1 = enc>>8, ch2 = enc&0xff; + if ( ch1 >= 129 && ch1<= 159 ) + ch1 -= 112; + else + ch1 -= 176; + ch1 <<= 1; + if ( ch2>=159 ) + ch2-= 126; + else if ( ch2>127 ) { + --ch1; + ch2 -= 32; + } else { + --ch1; + ch2 -= 31; + } + enc = unicode_from_jis208[(ch1-0x21)*94+(ch2-0x21)]; + } + } else if ( modtype==3 /* GB2312 offset by 0x8080, parse just like wansung */ ) { + if ( enc>0xa1a1 ) { + enc -= 0xa1a1; + enc = (enc>>8)*94 + (enc&0xff); + enc = unicode_from_gb2312[enc]; + if ( enc==0 ) enc = -1; + } else if ( enc>0x100 ) + enc = -1; + } else if ( modtype==4 /* BIG5 */ ) { /* old ms docs say big5 is modtype==3, but new ones say 4 */ + if ( enc>0x8100 ) + enc = unicode_from_big5hkscs[enc-0x8100]; + else if ( enc>0x100 ) + enc = -1; + } else if ( modtype==5 /* Wansung == KSC 5601-1987, I hope */ ) { + if ( enc>0xa1a1 ) { + enc -= 0xa1a1; + enc = (enc>>8)*94 + (enc&0xff); + enc = unicode_from_ksc5601[enc]; + if ( enc==0 ) enc = -1; + } else if ( enc>0x100 ) + enc = -1; + } else if ( modtype==6 /* Johab */ ) { + if ( enc>0x8400 ) + enc = unicode_from_johab[enc-0x8400]; + else if ( enc>0x100 ) + enc = -1; + } + if ( enc==0 ) + enc = -1; +return( enc ); +} + +static int SubtableIsntSupported(FILE *ttf,uint32 offset,int platform,int specific) { + uint32 here = ftell(ttf); + int format, len, ret=false; + + fseek(ttf,offset,SEEK_SET); + + format = getushort(ttf); + if ( format<0 || (format&1) || format>12 ) { + fprintf( stderr, "Encoding subtable for platform=%d, specific=%d has an unsupported format %d.\n", + platform, specific, format ); + ret = true; + } + + if ( format!=12 && format!=10 && format!=8 ) { + len = getushort(ttf); + } else { + /* padding */ getushort(ttf); + len = getlong(ttf); + } + if ( len==0 ) { + fprintf( stderr, "Encoding subtable for platform=%d, specific=%d has a 0 length subtable.\n", + platform, specific ); + ret = true; + } + fseek(ttf,here,SEEK_SET); +return( ret ); +} + +static void readttfencodings(FILE *ttf,struct ttfinfo *info, int justinuse) { + int i,j; + int nencs, version; + enum charset enc = em_none; + enum uni_interp interp = ui_none; + int platform, specific; + int offset, encoff=0; + int format, len; + uint16 table[256]; + int segCount; + uint16 *endchars, *startchars, *delta, *rangeOffset, *glyphs; + int index, last; + int mod = 0; + const unichar_t *trans=NULL; + SplineChar *sc; + uint8 *used; + int badencwarned=false; + int glyph_tot; + + fseek(ttf,info->encoding_start,SEEK_SET); + version = getushort(ttf); + nencs = getushort(ttf); + if ( version!=0 && nencs==0 ) + nencs = version; /* Sometimes they are backwards */ + for ( i=0; iencoding_start+offset,platform,specific)) + continue; + interp = interp_from_encoding(enc_from_platspec(platform,specific),interp); + if ( platform==3 && specific==10 ) { /* MS Unicode 4 byte */ + enc = em_unicode4; + encoff = offset; + mod = 0; + info->platform = platform; info->specific = specific; + } else if ( (enc!=em_unicode4 || (!prefer_cjk_encodings || + (enc!=em_sjis && enc!=em_wansung && enc!=em_big5 && + enc!=em_jisgb && + enc!=em_big5hkscs && enc!=em_johab))) && + (( platform==3 && specific==1 ) || /* MS Unicode */ +/* Well I should only deal with apple unicode specific==0 (default) and 3 (U2.0 semantics) */ +/* but apple ships dfonts with specific==1 (Unicode 1.1 semantics) */ +/* which is stupid of them */ + ( platform==0 /*&& (specific==0 || specific==3)*/ && enc!=em_symbol ))) { /* Apple Unicode */ + enc = em_unicode; + encoff = offset; + info->platform = platform; info->specific = specific; + mod = 0; + /* choose ms symbol over apple unicode. If there's an ms uncode it will */ + /* come after ms symbol in the list and we'll get that */ + } else if ( platform==3 && specific==0 && (enc==em_none||enc==-2||enc==em_mac||enc==em_unicode) ) { + /* Only select symbol if we don't have something better */ + enc = em_symbol; + encoff = offset; + info->platform = platform; info->specific = specific; + /* Now I had assumed this would be a 1 byte encoding, but it turns*/ + /* out to map into the unicode private use area at U+f000-U+F0FF */ + /* so it's a 2 byte enc */ +/* Mac platform specific encodings are script numbers. 0=>roman, 1=>jap, 2=>big5, 3=>korean, 4=>arab, 5=>hebrew, 6=>greek, 7=>cyrillic, ... 25=>simplified chinese */ + } else if ( platform==1 && specific==0 && (enc==em_none||enc==-2) ) { + info->platform = platform; info->specific = specific; + enc = em_mac; + encoff = offset; + trans = unicode_from_mac; + } else if ( platform==1 && (specific==2 ||specific==1||specific==3||specific==25) && + (prefer_cjk_encodings || enc!=em_unicode) ) { + enc = specific==1?em_sjis:specific==2?em_big5hkscs:specific==3?em_wansung:em_jisgb; + mod = specific==1?2:specific==2?4:specific==3?5:3; /* convert to ms specific */ + info->platform = platform; info->specific = specific; + encoff = offset; + } else if ( platform==3 && (specific>=2 && specific<=6 ) && + (prefer_cjk_encodings || enc!=em_unicode) ) { + /* Old ms docs say that specific==3 => big 5, new docs say specific==4 => big5 */ + /* Ain't that jus' great? */ + enc = specific==2? em_sjis : + specific==3? em_jisgb : + specific==4? em_big5hkscs : + specific==5? em_wansung : + em_johab; + info->platform = platform; info->specific = specific; + mod = specific; + encoff = offset; + } else if ( enc==em_none ) { + enc = -2; + mod = -1; + encoff = offset; + info->platform = platform; info->specific = specific; + } + } + if ( enc!=em_none ) { + fseek(ttf,info->encoding_start+encoff,SEEK_SET); + format = getushort(ttf); + if ( format!=12 && format!=10 && format!=8 ) { + len = getushort(ttf); + /* version/language = */ getushort(ttf); + } else { + /* padding */ getushort(ttf); + len = getlong(ttf); + /* language = */ getlong(ttf); + } + if ( format==0 ) { + for ( i=0; iglyph_cnt && ichars[table[i]]->enc = i; + if ( trans!=NULL ) + info->chars[table[i]]->unicodeenc = trans[i]; + } else + info->inuse[table[i]] = 1; + } else if ( format==4 ) { + if ( enc==em_symbol ) { enc=em_unicode; info->twobytesymbol=true;} + segCount = getushort(ttf)/2; + /* searchRange = */ getushort(ttf); + /* entrySelector = */ getushort(ttf); + /* rangeShift = */ getushort(ttf); + endchars = galloc(segCount*sizeof(uint16)); + used = gcalloc(65536,sizeof(uint8)); + for ( i=0; iglyph_cnt ) + info->inuse[(uint16) (j+delta[i])] = true; + else if ( (uint16) (j+delta[i])>=info->glyph_cnt || info->chars[(uint16) (j+delta[i])]==NULL ) + fprintf( stderr, "Attempt to encode missing glyph %d to %d (0x%x)\n", + (uint16) (j+delta[i]), modenc(j,mod), modenc(j,mod)); + else if ( info->chars[(uint16) (j+delta[i])]->unicodeenc==-1 ) { + int uenc = umodenc(j,mod); + if ( uenc!=-1 && used[uenc] ) { + if ( !badencwarned ) { + fprintf( stderr, "Multiple glyphs map to the same unicode encoding U+%04X, only one will be used\n", uenc ); + badencwarned = true; + } + } else { + if ( uenc!=-1 ) used[uenc] = true; + info->chars[(uint16) (j+delta[i])]->unicodeenc = uenc; + info->chars[(uint16) (j+delta[i])]->enc = modenc(j,mod); + } + } else + info->dups = makedup(info->chars[(uint16) (j+delta[i])],umodenc(j,mod),modenc(j,mod),info->dups); + } + } else if ( rangeOffset[i]!=0xffff ) { + /* It isn't explicitly mentioned by a rangeOffset of 0xffff*/ + /* means no glyph */ + for ( j=startchars[i]; j<=endchars[i]; ++j ) { + int temp = (i-segCount+rangeOffset[i]/2) + j-startchars[i]; + if ( tempplatform, info->specific ); + index = 0; + } + if ( index!=0 ) { + index = (unsigned short) (index+delta[i]); + if ( index>=info->glyph_cnt ) + /* This isn't mentioned either, but in some */ + /* MS Chinese fonts (kaiu.ttf) the index */ + /* goes out of bounds. and MS's ttf dump */ + /* program says it is treated as 0 */ + fprintf( stderr, "Attempt to encode missing glyph %d to %d (0x%x)\n", + index, modenc(j,mod), modenc(j,mod)); + else if ( justinuse ) + info->inuse[index] = 1; + else if ( info->chars[index]==NULL ) + fprintf( stderr, "Attempt to encode missing glyph %d to %d (0x%x)\n", + index, modenc(j,mod), modenc(j,mod)); + else if ( info->chars[index]->unicodeenc==-1 ) { + int uenc = umodenc(j,mod); + if ( uenc!=-1 && used[uenc] ) { + if ( !badencwarned ) { + fprintf( stderr, "Multiple glyphs map to the same unicode encoding U+%04X, only one will be used\n", uenc ); + badencwarned = true; + } + } else { + if ( uenc!=-1 ) used[uenc] = true; + info->chars[index]->unicodeenc = uenc; + info->chars[index]->enc = modenc(j,mod); + } + } else + info->dups = makedup(info->chars[index],umodenc(j,mod),modenc(j,mod),info->dups); + } + } + } else + fprintf( stderr, "Use of a range offset of 0xffff to mean a missing glyph in cmap table\n" ); + } + free(glyphs); + free(rangeOffset); + free(delta); + free(startchars); + free(endchars); + free(used); + } else if ( format==6 ) { + /* array unicode format */ + /* Well, the docs say it's for 2byte encodings, but Apple actually*/ + /* uses it for 1 byte encodings which don't fit into the require-*/ + /* ments for a format 0 sub-table. See Zapfino.dfont */ + int first, count; + if ( enc!=em_unicode && enc!=em_unicode4 ) + GDrawIError("I don't support truncated array encoding (format=6) except for unicode" ); + first = getushort(ttf); + count = getushort(ttf); + if ( justinuse ) + for ( i=0; iinuse[getushort(ttf)]= 1; + else + for ( i=0; ichars[getushort(ttf)]->unicodeenc = first+i; + } else if ( format==2 ) { + int max_sub_head_key = 0, cnt, max_pos= -1; + struct subhead *subheads; + + for ( i=0; i<256; ++i ) { + table[i] = getushort(ttf)/8; /* Sub-header keys */ + if ( table[i]>max_sub_head_key ) { + max_sub_head_key = table[i]; /* The entry is a byte pointer, I want a pointer in units of struct subheader */ + max_pos = i; + } + } + subheads = galloc((max_sub_head_key+1)*sizeof(struct subhead)); + for ( i=0; i<=max_sub_head_key; ++i ) { + subheads[i].first = getushort(ttf); + subheads[i].cnt = getushort(ttf); + subheads[i].delta = getushort(ttf); + subheads[i].rangeoff = (getushort(ttf)- + (max_sub_head_key-i)*sizeof(struct subhead)- + sizeof(short))/sizeof(short); + } + cnt = (len-(ftell(ttf)-(info->encoding_start+encoff)))/sizeof(short); + /* The count is the number of glyph indexes to read. it is the */ + /* length of the entire subtable minus that bit we've read so far */ + glyphs = galloc(cnt*sizeof(short)); + for ( i=0; i=max_pos ) + index = 0; /* the subhead says there are 256 entries, but in fact there are only 193, so attempting to find these guys should give an error */ + else if ( i=subheads[0].first+subheads[0].cnt || + subheads[0].rangeoff+(i-subheads[0].first)>=cnt ) + index = 0; + else if ( (index = glyphs[subheads[0].rangeoff+(i-subheads[0].first)])!= 0 ) + index = (uint32) (index+subheads[0].delta); + /* I assume the single byte codes are just ascii or latin1*/ + if ( index!=0 && indexglyph_cnt ) { + if ( justinuse ) + info->inuse[index] = 1; + else if ( info->chars[index]==NULL ) + /* Do Nothing */; + else if ( info->chars[index]->unicodeenc==-1 ) { + info->chars[index]->unicodeenc = i; + info->chars[index]->enc = modenc(i,mod); + } else + info->dups = makedup(info->chars[index],i,i,info->dups); + } + } else { + int k = table[i]; + for ( j=0; j=cnt ) + index = 0; + else if ( (index = glyphs[subheads[k].rangeoff+j])!= 0 ) + index = (uint16) (index+subheads[k].delta); + if ( index!=0 && indexglyph_cnt ) { + enc = (i<<8)|(j+subheads[k].first); + if ( justinuse ) + info->inuse[index] = 1; + else if ( info->chars[index]==NULL ) + /* Do Nothing */; + else if ( info->chars[index]->unicodeenc==-1 ) { + info->chars[index]->unicodeenc = umodenc(enc,mod); + info->chars[index]->enc = modenc(enc,mod); + } else + info->dups = makedup(info->chars[index],umodenc(enc,mod),modenc(enc,mod),info->dups); + } + } + /*if ( last==-1 ) last = i;*/ + } + } + free(subheads); + free(glyphs); + } else if ( format==8 ) { + uint32 ngroups, start, end, startglyph; + if ( enc!=em_unicode4 ) + GDrawIError("I don't support 32 bit characters except for the UCS-4 (MS platform, specific=10)" ); + /* I'm now assuming unicode surrogate encoding, so I just ignore */ + /* the is32 table (it will be set for the surrogates and not for */ + /* anything else */ + fseek(ttf,8192,SEEK_CUR); + ngroups = getlong(ttf); + for ( j=0; jinuse[startglyph+i-start]= 1; + else + for ( i=start; i<=end; ++i ) { + (sc = info->chars[startglyph+i-start])->unicodeenc = + ((i>>16)-0xd800)*0x400 + (i&0xffff)-0xdc00 + 0x10000; + sc->enc = sc->unicodeenc; + } + } + } else if ( format==10 ) { + /* same as format 6, except for 4byte chars */ + int first, count; + if ( enc!=em_unicode4 ) + GDrawIError("I don't support 32 bit characters except for the UCS-4 (MS platform, specific=10)" ); + first = getlong(ttf); + count = getlong(ttf); + if ( justinuse ) + for ( i=0; iinuse[getushort(ttf)]= 1; + else + for ( i=0; ichars[getushort(ttf)])->unicodeenc = first+i; + sc->enc = first+i; + } + } else if ( format==12 ) { + uint32 ngroups, start, end, startglyph; + if ( enc!=em_unicode4 ) + GDrawIError("I don't support 32 bit characters except for the UCS-4 (MS platform, specific=10)" ); + ngroups = getlong(ttf); + for ( j=0; jinuse[startglyph+i-start]= 1; + else + for ( i=start; i<=end; ++i ) { + (sc = info->chars[startglyph+i-start])->unicodeenc = i; + sc->enc = i; + } + } + } + } + if ( info->chars!=NULL && info->chars[0]!=NULL && info->chars[0]->unicodeenc==0xffff && + info->chars[0]->name!=NULL && strcmp(info->chars[0]->name,".notdef")==0 ) + info->chars[0]->unicodeenc = -1; + info->encoding_name = enc; + info->uni_interp = interp; +} + +static int EncFromName(const char *name) { + int i; + i = UniFromName(name); + if ( i==-1 && strlen(name)==4 ) { + /* MS says use this kind of name, Adobe says use the one above */ + char *end; + i = strtol(name,&end,16); + if ( i>=0 && i<=0xffff && *end=='\0' ) +return( i ); + } +return( i ); +} + +static void readttfos2metrics(FILE *ttf,struct ttfinfo *info) { + int i; + + fseek(ttf,info->os2_start,SEEK_SET); + /* version */ getushort(ttf); + /* avgWidth */ getushort(ttf); + info->pfminfo.weight = getushort(ttf); + info->pfminfo.width = getushort(ttf); + info->pfminfo.fstype = getushort(ttf); + /* sub xsize */ getushort(ttf); + /* sub ysize */ getushort(ttf); + /* sub xoff */ getushort(ttf); + /* sub yoff */ getushort(ttf); + /* sup xsize */ getushort(ttf); + /* sup ysize */ getushort(ttf); + /* sup xoff */ getushort(ttf); + /* sup yoff */ getushort(ttf); + /* strike ysize */ getushort(ttf); + /* strike ypos */ getushort(ttf); + /* Family Class */ getushort(ttf); + for ( i=0; i<10; ++i ) + info->pfminfo.panose[i] = getc(ttf); + info->pfminfo.pfmfamily = info->pfminfo.panose[0]==2 ? 0x11 : /* might be 0x21 */ /* Text & Display maps to either serif 0x11 or sans 0x21 or monospace 0x31 */ + info->pfminfo.panose[0]==3 ? 0x41 : /* Script */ + info->pfminfo.panose[0]==4 ? 0x51 : /* Decorative */ + 0x51; /* And pictorial doesn't fit into pfm */ + /* unicoderange[] */ getlong(ttf); + /* unicoderange[] */ getlong(ttf); + /* unicoderange[] */ getlong(ttf); + /* unicoderange[] */ getlong(ttf); + /* vendor */ getlong(ttf); + /* fsselection */ getushort(ttf); + /* firstchar */ getushort(ttf); + /* lastchar */ getushort(ttf); + info->pfminfo.os2_typoascent = getushort(ttf); + info->pfminfo.os2_typodescent = (short) getushort(ttf); + if ( info->pfminfo.os2_typoascent-info->pfminfo.os2_typodescent == info->emsize ) { + info->ascent = info->pfminfo.os2_typoascent; + info->descent = -info->pfminfo.os2_typodescent; + } + if ( info->pfminfo.linegap==0 ) { + info->pfminfo.linegap = getushort(ttf); + } else + /* typographic linegap = */ getushort(ttf); + info->pfminfo.os2_winascent = getushort(ttf); + info->pfminfo.os2_windescent = getushort(ttf); + info->pfminfo.pfmset = true; +} + +static int cmapEncFromName(struct ttfinfo *info,const char *nm, int glyphid) { + int uni = EncFromName(nm); + int i; + + if ( uni==-1 ) +return( -1 ); + + for ( i=0; iglyph_cnt; ++i ) if ( info->chars[i]!=NULL ) { + if ( info->chars[i]->unicodeenc==uni ) { + if ( info->complainedmultname ) + /* Don't do it again */; + else if ( info->chars[i]->name!=NULL && strcmp(info->chars[i]->name,nm)==0 ) + fprintf( stderr, "Warning: Glyph %d has the same name (%s) as Glyph %d\n", + i, nm, glyphid ); + else + fprintf( stderr, "Warning: Glyph %d is named %s which should mean it is mapped to\n Unicode U+%04X, but Glyph %d already has that encoding.\n", + glyphid, nm, uni, i); + info->complainedmultname = true; +return( -1 ); + } + } +return( uni ); +} + +static void readttfpostnames(FILE *ttf,struct ttfinfo *info) { + int i,j; + int format, len, gc, gcbig, val; + const char *name; + char buffer[30]; + uint16 *indexes; + extern const char *ttfstandardnames[]; + int notdefwarned = false; + + GProgressChangeLine2R(_STR_ReadingNames); + if ( info->postscript_start!=0 ) { + fseek(ttf,info->postscript_start,SEEK_SET); + format = getlong(ttf); + info->italicAngle = getfixed(ttf); + info->upos = (short) getushort(ttf); + info->uwidth = (short) getushort(ttf); + /* fixedpitch = */ getlong(ttf); + /* mem1 = */ getlong(ttf); + /* mem2 = */ getlong(ttf); + /* mem3 = */ getlong(ttf); + /* mem4 = */ getlong(ttf); + if ( format==0x00020000 ) { + gc = getushort(ttf); + indexes = gcalloc(65536,sizeof(uint16)); + /* the index table is backwards from the way I want to use it */ + gcbig = 0; + for ( i=0; i=258 ) ++gcbig; + } + + /* if we are only loading bitmaps, we can get holes in our data */ + for ( i=0; i<258; ++i ) if ( indexes[i]!=0 || i==0 ) if ( info->chars[indexes[i]]!=NULL ) { + info->chars[indexes[i]]->name = copy(ttfstandardnames[i]); + if ( info->chars[indexes[i]]->unicodeenc==-1 ) + info->chars[indexes[i]]->unicodeenc = cmapEncFromName(info,ttfstandardnames[i],indexes[i]); + } + gcbig += 258; + for ( i=258; ichars[indexes[i]]!=NULL ) { + info->chars[indexes[i]]->name = nm; + if ( info->chars[indexes[i]]->unicodeenc==-1 ) + info->chars[indexes[i]]->unicodeenc = cmapEncFromName(info,nm,indexes[i]); + } + } + free(indexes); + } + } + + /* where no names are given, but we've got a unicode encoding use */ + /* that to guess at them */ + for ( i=0; iglyph_cnt; ++i ) if ( info->chars[i]!=NULL ) { + /* info->chars[i] can be null in some TTC files */ + if ( i!=0 && info->chars[i]->name!=NULL && + strcmp(info->chars[i]->name,".notdef")==0 ) { + /* for some reason MS puts out fonts where several characters */ + /* are called .notdef (and only one is a real notdef). So if we */ + /* find a glyph other than 0 called ".notdef" then pretend it had */ + /* no name */ + if ( !notdefwarned ) { + notdefwarned = true; + fprintf( stderr, "Glyph %d is called \".notdef\", a singularly inept choice of name (only glyph 0\n may be called .notdef)\nFontForge will rename it.\n", i ); + } + free(info->chars[i]->name); + info->chars[i]->name = NULL; + } + /* And some volt files actually assign nul strings to the name */ + if ( (info->chars[i]->name!=NULL && *info->chars[i]->name!='\0' )) + continue; + free(info->chars[i]->name); /* If it's a null string get rid of it */ + if ( i==0 ) + name = ".notdef"; + else if ( info->chars[i]->unicodeenc==-1 ) { + /* Do this later */; + name = NULL; + } else if ( info->chars[i]->unicodeencchars[i]->unicodeenc]!=NULL ) + name = psunicodenames[info->chars[i]->unicodeenc]; + else { + if ( info->chars[i]->unicodeenc<0x10000 ) + sprintf( buffer, "uni%04X", info->chars[i]->unicodeenc ); + else + sprintf( buffer, "u%04X", info->chars[i]->unicodeenc ); + name = buffer; + } + GProgressNext(); + info->chars[i]->name = copy(name); + } + + /* If we have a GSUB table we can give some unencoded glyphs name */ + /* for example if we have a vrt2 substitution of A to */ + /* we could name the unencoded "A.vrt2" (though in this case we might */ + /* try A.vert instead */ /* Werner suggested this */ + /* We could try this from morx too, except that apple features don't */ + /* meaningful ids. That is A.15,3 isn't very readable */ + for ( i=info->glyph_cnt-1; i>=0 ; --i ) + if ( info->chars[i]!=NULL && info->chars[i]->name==NULL ) + break; + if ( i>=0 && info->gsub_start!=0 ) + GuessNamesFromGSUB(ttf,info); + + for ( i=0; iglyph_cnt; ++i ) { + /* info->chars[i] can be null in some TTC files */ + if ( info->chars[i]==NULL ) + continue; + if ( info->chars[i]->name!=NULL ) + continue; + if ( info->ordering!=NULL ) + sprintf(buffer, "%.20s-%d", info->ordering, i ); + else if ( info->chars[i]->enc!=0 ) + sprintf(buffer, "nounicode-%d-%d-%x", info->platform, info->specific, + info->chars[i]->enc ); + else + sprintf( buffer, "glyph%d", i ); + info->chars[i]->name = copy(buffer); + GProgressNext(); + } + GProgressNextStage(); +} + +static void UnfigureControls(Spline *spline,BasePoint *pos) { + pos->x = rint( (spline->splines[0].c+2*spline->splines[0].d)/2 ); + pos->y = rint( (spline->splines[1].c+2*spline->splines[1].d)/2 ); +} + +static int ttfFindPointInSC(SplineChar *sc,int pnum,BasePoint *pos) { + SplineSet *ss; + SplinePoint *sp; + int last=0, ret; + RefChar *refs; + + for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->ttfindex==pnum ) { + *pos = sp->me; +return(-1); + } else if ( !sp->nonextcp && last+1==pnum ) { + /* fix this up to be 2 degree bezier control point */ + UnfigureControls(sp->next,pos); +return( -1 ); + } + if ( sp->ttfindex==0xffff ) + ++last; + else if ( sp->nonextcp ) + last = sp->ttfindex; + else + last = sp->ttfindex+1; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + for ( refs=sc->layers[ly_fore].refs; refs!=NULL; refs=refs->next ) { + ret = ttfFindPointInSC(refs->sc,pnum-last,pos); + if ( ret==-1 ) +return( -1 ); + last += ret; + } +return( last ); /* Count of number of points in the character */ +} + +static void ttfPointMatch(SplineChar *sc,RefChar *rf) { + BasePoint sofar, inref; + + if ( ttfFindPointInSC(sc,rf->transform[4],&sofar)!=-1 || + ttfFindPointInSC(rf->sc,rf->transform[5],&inref)!=-1 ) { + fprintf( stderr, "Could not match points in composite glyph (%g to %g) when adding %s to %s\n", + rf->transform[4], rf->transform[5], rf->sc->name, sc->name); +return; + } + rf->transform[4] = sofar.x-inref.x; + rf->transform[5] = sofar.y-inref.y; +} + +static int ttfFixupRef(struct ttfinfo *info,int i) { + RefChar *ref, *prev, *next; + + if ( info->chars[i]==NULL ) /* Can happen in ttc files */ +return( false ); + if ( info->chars[i]->ticked ) +return( false ); + info->chars[i]->ticked = true; + prev = NULL; + for ( ref=info->chars[i]->layers[ly_fore].refs; ref!=NULL; ref=next ) { + if ( ref->sc!=NULL ) + break; /* Already done */ + next = ref->next; + if ( !ttfFixupRef(info,ref->local_enc)) { + if ( prev==NULL ) + info->chars[i]->layers[ly_fore].refs = next; + else + prev->next = next; + free(ref); + } else { + ref->sc = info->chars[ref->local_enc]; + ref->adobe_enc = getAdobeEnc(ref->sc->name); + if ( ref->point_match ) + ttfPointMatch(info->chars[i],ref); + SCReinstanciateRefChar(info->chars[i],ref); + SCMakeDependent(info->chars[i],ref->sc); + prev = ref; + } + } + info->chars[i]->ticked = false; +return( true ); +} + +static void ttfFixupReferences(struct ttfinfo *info) { + int i; + + GProgressChangeLine2R(_STR_FixingupReferences); + for ( i=0; iglyph_cnt; ++i ) { + ttfFixupRef(info,i); + GProgressNext(); + } + GProgressNextStage(); +} + +static void TtfCopyTableBlindly(struct ttfinfo *info,FILE *ttf, + uint32 start,uint32 len,uint32 tag) { + struct ttf_table *tab; + + if ( start==0 || len==0 ) +return; + tab = chunkalloc(sizeof(struct ttf_table)); + tab->tag = tag; + tab->len = len; + tab->data = galloc(len); + fseek(ttf,start,SEEK_SET); + fread(tab->data,1,len,ttf); + tab->next = info->tabs; + info->tabs = tab; +} + +static int readttf(FILE *ttf, struct ttfinfo *info, char *filename) { + char *oldloc; + + GProgressChangeStages(3); + if ( !readttfheader(ttf,info,filename,&info->chosenname)) { +return( 0 ); + } + oldloc = setlocale(LC_NUMERIC,"C"); /* TrueType doesn't need this but opentype dictionaries do */ + readttfpreglyph(ttf,info); + GProgressChangeTotal(info->glyph_cnt); + + /* If font only contains bitmaps, then only read bitmaps */ + if ( (info->glyphlocations_start==0 || info->glyph_length==0) && + info->cff_start==0 && + info->bitmapdata_start!=0 && info->bitmaploc_start!=0 ) + info->onlystrikes = true; + + if ( !info->onlystrikes && + info->glyphlocations_start!=0 && info->glyph_start!=0 && + info->cff_start!=0 ) { + static int buts[] = { _STR_TTFGlyf, _STR_OTFCFF, _STR_Cancel, 0 }; + int choice = GWidgetAskR(_STR_PickFont,buts,0,2,_STR_GlyfAndCFF); + if ( choice==2 ) +return( 0 ); + else if ( choice==0 ) + info->cff_start=0; + else + info->glyph_start = info->glyphlocations_start = 0; + } + + if ( info->onlystrikes ) { + info->chars = gcalloc(info->glyph_cnt+1,sizeof(SplineChar *)); + info->to_order2 = new_fonts_are_order2; + } else if ( info->glyphlocations_start!=0 && info->glyph_start!=0 ) { + info->to_order2 = (!loaded_fonts_same_as_new || + (loaded_fonts_same_as_new && new_fonts_are_order2)); + readttfglyphs(ttf,info); + } else if ( info->cff_start!=0 ) { + info->to_order2 = (loaded_fonts_same_as_new && new_fonts_are_order2); + if ( !readcffglyphs(ttf,info) ) { +return( 0 ); + } + } else { +return( 0 ); + } + if ( info->bitmapdata_start!=0 && info->bitmaploc_start!=0 ) + TTFLoadBitmaps(ttf,info,info->onlyonestrike); + else if ( info->onlystrikes ) + GWidgetErrorR( _STR_NoBitmaps, _STR_NoBitmapsInTTF, filename==NULL ? "" : filename ); + if ( info->onlystrikes && info->bitmaps==NULL ) { + free(info->chars); +return( 0 ); + } + if ( info->hmetrics_start!=0 ) + readttfwidths(ttf,info); + if ( info->vmetrics_start!=0 && info->vhea_start!=0 ) + readttfvwidths(ttf,info); + if ( info->cidregistry==NULL ) + readttfencodings(ttf,info,false); + if ( info->os2_start!=0 ) + readttfos2metrics(ttf,info); + readttfpostnames(ttf,info); /* If no postscript table we'll guess at names */ + if ( info->gdef_start!=0 ) /* ligature caret positioning info */ + readttfgdef(ttf,info); + else { + if ( info->prop_start!=0 ) + readttfprop(ttf,info); + if ( info->lcar_start!=0 ) + readttflcar(ttf,info); + } + if ( info->gpos_start!=0 ) /* kerning info may live in the gpos table too */ + readttfgpossub(ttf,info,true); + else { + if ( info->kern_start!=0 ) + readttfkerns(ttf,info); + if ( info->opbd_start!=0 ) + readttfopbd(ttf,info); + } + if ( info->gsub_start!=0 ) + readttfgpossub(ttf,info,false); + else { + /* We will default the gsub table later... */; + if ( info->morx_start!=0 || info->mort_start!=0 ) + readttfmort(ttf,info); + } + if ( info->to_order2 ) { + /* Yes, even though we've looked at maxp already, let's make a blind */ + /* copy too for those fields we can't compute on our own */ + /* Like number of instructions, etc. */ + TtfCopyTableBlindly(info,ttf,info->maxp_start,info->maxp_len,CHR('m','a','x','p')); + TtfCopyTableBlindly(info,ttf,info->cvt_start,info->cvt_len,CHR('c','v','t',' ')); + TtfCopyTableBlindly(info,ttf,info->fpgm_start,info->fpgm_len,CHR('f','p','g','m')); + TtfCopyTableBlindly(info,ttf,info->prep_start,info->prep_len,CHR('p','r','e','p')); + } + if ( info->pfed_start!=0 ) + pfed_read(ttf,info); + setlocale(LC_NUMERIC,oldloc); + ttfFixupReferences(info); +return( true ); +} + +static SplineChar *SFMakeDupRef(SplineFont *sf, int local_enc, struct dup *dup) { + SplineChar *sc; + + sc = MakeDupRef(dup->sc,local_enc,dup->uni); + sc->parent = sf; +return( sc ); +} + +static void SymbolFixup(struct ttfinfo *info) { + SplineChar *lo[256], *hi[256], *sc, **chars; + int extras=0, i, uenc; + struct dup *dup; + + memset(lo,0,sizeof(lo)); + memset(hi,0,sizeof(hi)); + if ( info->chars[0]!=NULL && info->chars[0]->enc==0 ) + lo[0] = info->chars[0]; + for ( i=0; iglyph_cnt; ++i ) if ( (sc = info->chars[i])!=NULL ) { + if ( sc->enc>0 && sc->enc<=0xff ) + lo[sc->enc] = sc; + else if ( sc->enc>=0xf000 && sc->enc<=0xf0ff ) + hi[sc->enc-0xf000] = sc; + else if ( sc->enc!=0 ) +return; /* Leave it as it is, it isn't a real symbol encoding */ + } + for ( dup=info->dups; dup!=NULL; dup=dup->prev ) { + if ( !((dup->enc>0 && dup->enc<=0xff ) || ( dup->enc>=0xf000 && dup->enc<=0xf0ff )) ) +return; + } + extras = 0; + for ( i=1; iglyph_cnt; ++i ) if ( (sc = info->chars[i])!=NULL ) { + if ( sc->enc==0 ) + sc->enc = 256 + extras++; + } + for ( dup=info->dups; dup!=NULL; dup=dup->prev ) { + if ( dup->enc>0 && dup->enc<=0xff ) + lo[dup->enc] = MakeDupRef(dup->sc,dup->enc,dup->uni); + else + hi[dup->enc-0xf000] = MakeDupRef(dup->sc,dup->enc,dup->uni); + } + for ( i=0; i<256; ++i ) { + if ( hi[i]!=NULL && lo[i]!=NULL ) { + lo[i]->enc = 256+extras++; + hi[i]->enc -= 0xf000; + } else if ( hi[i]!=NULL ) + hi[i]->enc -= 0xf000; + } + chars = gcalloc(256+extras,sizeof(SplineChar *)); + for ( i=0; iglyph_cnt; ++i ) if ( (sc = info->chars[i])!=NULL ) + chars[sc->enc] = sc; + for ( i=0; i<256; ++i ) if ( (sc = lo[i])!=NULL ) + chars[sc->enc] = sc; + for ( i=0; i<256; ++i ) if ( (sc = hi[i])!=NULL ) + chars[sc->enc] = sc; + for ( i=0; i<256+extras; ++i ) if ( (sc=chars[i])!=NULL ) { + uenc = UniFromName(sc->name); + if ( uenc!=-1 ) + sc->unicodeenc = uenc; + } + if ( chars[0x41]!=NULL && chars[0x41]->name!=NULL && strcmp(chars[0x41]->name,"Alpha")==0 ) + info->encoding_name = em_symbol; + else + info->encoding_name = em_none; + free(info->chars); + info->chars = chars; + info->glyph_cnt = 256+extras; + info->is_onebyte = true; + + dupfree(info->dups); + info->dups = NULL; +} + +static void CheckEncoding(struct ttfinfo *info) { + const uint16 *table; + static const uint16 *choices[] = { unicode_from_MacSymbol, unicode_from_mac, + unicode_from_win, unicode_from_i8859_1, unicode_from_adobestd, + unicode_from_ZapfDingbats, NULL }; + static int encs[] = { em_symbol, em_mac, em_win, em_iso8859_1, + em_adobestandard, em_zapfding }; + int i,j, extras, errs; + SplineChar **chars; + + extras = 0; + for ( j=0; jglyph_cnt; ++j ) + if ( info->chars[j]->enc==0 && j!=0 ) + ++extras; + chars = gcalloc(256+extras,sizeof(SplineChar *)); + extras = 0; + for ( j=0; jglyph_cnt; ++j ) { + if ( info->chars[j]->enc==0 && j!=0 ) { + chars[256+extras] = info->chars[j]; + info->chars[j]->enc = 256+extras++; + } else + chars[info->chars[j]->enc] = info->chars[j]; + } + + info->encoding_name = em_none; + for ( i=0; choices[i]!=NULL; ++i ) { + table = choices[i]; + errs = 0; + for ( j=0; j<256 ; ++j ) if ( chars[j]!=NULL ) { + if ( table[j]!=chars[j]->unicodeenc && table[j]!=0 ) + ++errs; + } + if ( j==256 && errs<11 ) { + info->encoding_name = encs[i]; + break; + } + } + free(info->chars); + info->chars = chars; + info->glyph_cnt = 256+extras; + info->is_onebyte = true; +} + +static void UseGivenEncoding(SplineFont *sf,struct ttfinfo *info) { + int istwobyte = false, i, oldcnt = info->glyph_cnt, extras=0, epos, max=96*94; + SplineChar **oldchars = info->chars, **newchars; + struct dup *dup; + BDFFont *bdf; + BDFChar **obc; + RefChar *rf; + int newcharcnt; + + if ( info->barecff ) { + max = 256; + for ( i=0; ienc>=256 ) + ++extras; + oldchars[i]->parent = sf; + } + } else if ( info->is_onebyte ) { + /* We did most of this in CheckEncoding */ + max = 256; + for ( i=0; ienc>=256 ) + ++extras; + oldchars[i]->parent = sf; + } + } else { + istwobyte = true; + for ( i=0; ienc>=256 ) { + istwobyte = true; + if ( oldchars[i]->enc>max ) max = oldchars[i]->enc; + } else if ( oldchars[i]->enc==0 && i!=0 ) + ++extras; + oldchars[i]->parent = sf; + } + } + for ( dup=info->dups; dup!=NULL && !istwobyte; dup=dup->prev ) + if ( dup->enc>=256 ) { + istwobyte = true; + if ( dup->enc>max ) max = dup->enc; + } + + if ( info->encoding_name>=em_first2byte && info->encoding_name<=em_last94x94 ) + epos = 65536; + else if ( info->encoding_name==em_unicode4 ) + epos = (max>=unicode4_size) ? max+1 : unicode4_size; + else + epos = istwobyte?65536:256; + newcharcnt = epos+extras; + newchars = gcalloc(newcharcnt,sizeof(SplineChar *)); + for ( i=0; ienc!=0 || i==0 ) + newchars[oldchars[i]->enc] = oldchars[i]; + else { + oldchars[i]->enc = epos; + newchars[epos++] = oldchars[i]; + } + } + + for ( i=0; ilayers[ly_fore].refs; rf!=NULL; rf = rf->next ) { + rf->local_enc = rf->sc->enc; + rf->unicode_enc = rf->sc->unicodeenc; + } + } + + sf->chars = oldchars; + for ( dup=info->dups; dup!=NULL; dup=dup->prev ) + if ( newchars[dup->enc]==NULL ) + newchars[dup->enc] = SFMakeDupRef(sf,dup->enc,dup); + sf->chars = newchars; sf->charcnt = newcharcnt; + free(oldchars); + + sf->encoding_name = info->encoding_name==-2? em_none : info->encoding_name; + sf->uni_interp = info->uni_interp; + + for ( bdf=sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + bdf->encoding_name = sf->encoding_name; + obc = bdf->chars; + bdf->chars = gcalloc(sf->charcnt,sizeof(BDFChar *)); + for ( i=0; icharcnt; ++i ) if ( obc[i]!=NULL ) { + bdf->chars[obc[i]->sc->enc] = obc[i]; + obc[i]->enc = obc[i]->sc->enc; + } + bdf->charcnt = sf->charcnt; + free(obc); + } + + dupfree(info->dups); + info->dups = NULL; +} + +static SplineFont *SFFillFromTTF(struct ttfinfo *info) { + SplineFont *sf, *_sf; + int i,k; + BDFFont *bdf; + struct table_ordering *ord; + + sf = SplineFontEmpty(); + sf->display_size = -default_fv_font_size; + sf->display_antialias = default_fv_antialias; + sf->fontname = info->fontname; + sf->fullname = info->fullname; + sf->familyname = info->familyname; + sf->chosenname = info->chosenname; + sf->onlybitmaps = info->onlystrikes; + sf->order2 = info->to_order2; + sf->comments = info->fontcomments; + if ( sf->fontname==NULL ) { + sf->fontname = copy(sf->fullname); + if ( sf->fontname==NULL ) + sf->fontname = copy(sf->familyname); + if ( sf->fontname==NULL ) sf->fontname = copy("UntitledTTF"); + } + if ( sf->fullname==NULL ) sf->fullname = copy( sf->fontname ); + if ( sf->familyname==NULL ) sf->familyname = copy( sf->fontname ); + sf->weight = info->weight ? info->weight : + copy( info->pfminfo.weight <= 100 ? "Thin" : + info->pfminfo.weight <= 200 ? "Extra-Light" : + info->pfminfo.weight <= 300 ? "Light" : + info->pfminfo.weight <= 400 ? "Book" : + info->pfminfo.weight <= 500 ? "Medium" : + info->pfminfo.weight <= 600 ? "Demi" : + info->pfminfo.weight <= 700 ? "Bold" : + info->pfminfo.weight <= 800 ? "Heavy" : + "Black" ); + sf->copyright = info->copyright; + sf->version = info->version; + sf->italicangle = info->italicAngle; + sf->upos = info->upos; + sf->uwidth = info->uwidth; + sf->ascent = info->ascent; + sf->vertical_origin = info->vertical_origin; + if ( info->vhea_start!=0 && info->vmetrics_start!=0 ) + sf->hasvmetrics = true; + sf->descent = info->descent; + sf->private = info->private; + sf->xuid = info->xuid; + sf->uniqueid = info->uniqueid; + sf->pfminfo = info->pfminfo; + sf->names = info->names; + sf->anchor = info->ahead; + sf->kerns = info->khead; + sf->vkerns = info->vkhead; + sf->possub = info->possub; + sf->sm = info->sm; + sf->features = info->features; + sf->gentags = info->gentags; + sf->script_lang = info->script_lang; + sf->sli_cnt = info->sli_cnt; + sf->ttf_tables = info->tabs; + if ( info->encoding_name == em_symbol || info->encoding_name == em_mac ) + /* Don't trust those encodings */ + CheckEncoding(info); + if ( info->twobytesymbol ) + /* rework ms symbol encodings */ + SymbolFixup(info); + sf->encoding_name = em_none; + sf->cidregistry = info->cidregistry; + sf->ordering = info->ordering; + sf->supplement = info->supplement; + sf->cidversion = info->cidfontversion; + sf->bitmaps = info->bitmaps; + for ( bdf = info->bitmaps; bdf!=NULL; bdf = bdf->next ) { + bdf->encoding_name = info->encoding_name; + bdf->sf = sf; + } + + for ( i=0; iglyph_cnt; ++i ) if ( info->chars[i]!=NULL ) { + SCOrderAP(info->chars[i]); + } + + if ( info->subfontcnt == 0 ) { + UseGivenEncoding(sf,info); + } else { + sf->subfontcnt = info->subfontcnt; + sf->subfonts = info->subfonts; + free(info->chars); /* This is the GID->char index, don't need it now */ + for ( i=0; isubfontcnt; ++i ) { + sf->subfonts[i]->cidmaster = sf; + sf->subfonts[i]->vertical_origin = sf->vertical_origin; + sf->subfonts[i]->hasvmetrics = sf->hasvmetrics; + } + } + TTF_PSDupsDefault(sf); + if ( info->gsub_start==0 && info->mort_start==0 && info->morx_start==0 ) { + /* Get default ligature values, etc. */ + k=0; + do { + _sf = ksubfontcnt?sf->subfonts[k]:sf; + for ( i=0; icharcnt; ++i ) { + if ( _sf->chars[i]!=NULL ) /* Might be null in ttc files */ + SCLigDefault(_sf->chars[i]); + } + ++k; + } while ( ksubfontcnt ); + } + + if ( info->feats[0]!=NULL ) { + ord = chunkalloc(sizeof(struct table_ordering)); + ord->table_tag = CHR('G','S','U','B'); /* or mort/morx */ + ord->ordered_features = info->feats[0]; + sf->orders = ord; + } + if ( info->feats[1]!=NULL ) { + ord = chunkalloc(sizeof(struct table_ordering)); + ord->table_tag = CHR('G','P','O','S'); + ord->ordered_features = info->feats[1]; + ord->next = sf->orders; + sf->orders = ord; + } + + otf_orderlangs(sf); /* I thought these had to be ordered, but it seems I was wrong. But I depend on the order, so I enforce it here */ + +return( sf ); +} + +SplineFont *_SFReadTTF(FILE *ttf, int flags,char *filename) { + struct ttfinfo info; + int ret; + + memset(&info,'\0',sizeof(struct ttfinfo)); + info.onlystrikes = (flags&ttf_onlystrikes)?1:0; + info.onlyonestrike = (flags&ttf_onlyonestrike)?1:0; + ret = readttf(ttf,&info,filename); + if ( !ret ) +return( NULL ); +return( SFFillFromTTF(&info)); +} + +SplineFont *SFReadTTF(char *filename, int flags) { + FILE *ttf; + SplineFont *sf; + char *temp=filename, *pt, *lparen; + + pt = strrchr(filename,'/'); + if ( pt==NULL ) pt = filename; + if ( (lparen=strchr(pt,'('))!=NULL && strchr(lparen,')')!=NULL ) { + temp = copy(filename); + pt = temp + (lparen-filename); + *pt = '\0'; + } + ttf = fopen(temp,"rb"); + if ( temp!=filename ) free(temp); + if ( ttf==NULL ) +return( NULL ); + + sf = _SFReadTTF(ttf,flags,filename); + fclose(ttf); +return( sf ); +} + +SplineFont *_CFFParse(FILE *temp,int len, char *fontsetname) { + struct ttfinfo info; + + memset(&info,'\0',sizeof(info)); + info.cff_start = 0; + info.cff_length = len; + info.barecff = true; + if ( !readcffglyphs(temp,&info) ) +return( NULL ); +return( SFFillFromTTF(&info)); +} + +SplineFont *CFFParse(char *filename) { + FILE *cff = fopen(filename,"r"); + SplineFont *sf; + long len; + + if ( cff == NULL ) +return( NULL ); + fseek(cff,0,SEEK_END); + len = ftell(cff); + fseek(cff,0,SEEK_SET); + sf = _CFFParse(cff,len,NULL); + fclose(cff); +return( sf ); +} + +char **NamesReadCFF(char *filename) { + FILE *cff = fopen(filename,"rb"); + int32 hdrsize, offsize; + char **fontnames; + + if ( cff==NULL ) +return( NULL ); + if ( getc(cff)!='\1' ) { /* Major version */ + fprintf( stderr, "CFF version mismatch\n" ); + fclose(cff); +return( NULL ); + } + getc(cff); /* Minor version */ + hdrsize = getc(cff); + offsize = getc(cff); + if ( hdrsize!=4 ) + fseek(cff,hdrsize,SEEK_SET); + fontnames = readcfffontnames(cff); + fclose(cff); +return( fontnames ); +} + +char **NamesReadTTF(char *filename) { + FILE *ttf = fopen(filename,"rb"); + int32 version, cnt, *offsets; + int i,j; + char **ret; + unichar_t *utemp; + + if ( ttf==NULL ) +return( NULL ); + version=getlong(ttf); + if ( version==CHR('t','t','c','f')) { + /* TTCF version = */ getlong(ttf); + cnt = getlong(ttf); + offsets = galloc(cnt*sizeof(int32)); + for ( i=0; i +#include +#include +#include +#include +#include "ttf.h" + +static int SLIFromInfo(struct ttfinfo *info,SplineChar *sc,uint32 lang) { + uint32 script = SCScriptFromUnicode(sc); + int j; + + if ( script==0 ) script = CHR('l','a','t','n'); + if ( info->script_lang==NULL ) { + info->script_lang = galloc(2*sizeof(struct script_record *)); + j = 0; + } else { + for ( j=0; info->script_lang[j]!=NULL; ++j ) { + if ( info->script_lang[j][0].script==script && + info->script_lang[j][1].script == 0 && + info->script_lang[j][0].langs[0] == lang && + info->script_lang[j][0].langs[1] == 0 ) +return( j ); + } + } + info->script_lang = grealloc(info->script_lang,(j+2)*sizeof(struct script_record *)); + info->script_lang[j+1] = NULL; + info->script_lang[j]= gcalloc(2,sizeof(struct script_record)); + info->script_lang[j][0].script = script; + info->script_lang[j][0].langs = gcalloc(2,sizeof(uint32)); + info->script_lang[j][0].langs[0] = lang; + info->sli_cnt = j+1; +return( j ); +} + +static uint16 *getAppleClassTable(FILE *ttf, int classdef_offset, int cnt, int sub, int div) { + uint16 *class = gcalloc(cnt,sizeof(uint16)); + int first, i, n; + /* Apple stores its class tables as containing offsets. I find it hard to */ + /* think that way and convert them to indeces (by subtracting off a base */ + /* offset and dividing by the item's size) before doing anything else */ + + fseek(ttf,classdef_offset,SEEK_SET); + first = getushort(ttf); + n = getushort(ttf); + if ( first+n+1>=cnt ) + fprintf( stderr, "Bad Apple Kern Class\n" ); + for ( i=0; i<=n && i+firstchars[i]!=NULL && class[i]chars[i]->name)+1; + for ( i=1; ichars[i]!=NULL ) { + if ( class[i]chars[i]->name ); + lens[class[i]] += strlen(info->chars[i]->name)+1; + ret[class[i]][lens[class[i]]-1] = ' '; + } else + fprintf( stderr, "Class index out of range %d (must be <%d)\n",class[i], class_cnt ); + } + for ( i=1; imax ) max = class[i]; +return( max+1 ); +} + +static char *GlyphsToNames(struct ttfinfo *info,uint16 *glyphs) { + int i, len; + char *ret, *pt; + + if ( glyphs==NULL ) +return( copy("")); + for ( i=len=0 ; glyphs[i]!=0xffff; ++i ) + len += strlen(info->chars[glyphs[i]]->name)+1; + ret = pt = galloc(len+1); *pt = '\0'; + for ( i=0 ; glyphs[i]!=0xffff; ++i ) { + strcpy(pt,info->chars[glyphs[i]]->name); + pt += strlen(pt); + *pt++ = ' '; + } + if ( pt>ret ) pt[-1] = '\0'; +return( ret ); +} + +#define MAX_LANG 20 /* Don't support more than 20 languages per feature (only remember first 20) */ +struct scriptlist { + uint32 script; + uint32 langs[MAX_LANG]; + int lang_cnt; + struct scriptlist *next; +}; + +struct feature { + uint32 offset; + uint32 tag; + struct scriptlist *sl, *reqsl; + /*int script_lang_index;*/ + int lcnt; + uint16 *lookups; +}; + +struct lookup { + uint32 tag, subtag; + struct scriptlist *sl; + int script_lang_index; + uint16 flags; + uint16 lookup; + uint32 offset; + struct lookup *alttags; + int make_subtag; +}; + +enum gsub_inusetype { git_normal, git_justinuse, git_findnames }; + +static uint16 *getCoverageTable(FILE *ttf, int coverage_offset, struct ttfinfo *info) { + int format, cnt, i,j, rcnt; + uint16 *glyphs=NULL; + int start, end, ind, max; + + fseek(ttf,coverage_offset,SEEK_SET); + format = getushort(ttf); + if ( format==1 ) { + cnt = getushort(ttf); + glyphs = galloc((cnt+1)*sizeof(uint16)); + for ( i=0; i=info->glyph_cnt ) { + fprintf( stderr, "Bad coverage table. Glyph %d out of range [0,%d)\n", glyphs[i], info->glyph_cnt ); + glyphs[i] = 0; + } + } + } else if ( format==2 ) { + glyphs = gcalloc((max=256),sizeof(uint16)); + rcnt = getushort(ttf); cnt = 0; + for ( i=0; iend || end>=info->glyph_cnt ) { + fprintf( stderr, "Bad coverage table. Glyph range %d-%d out of range [0,%d)\n", start, end, info->glyph_cnt ); + start = end = 0; + } + if ( ind+end-start+2 >= max ) { + int oldmax = max; + max = ind+end-start+2; + glyphs = grealloc(glyphs,max*sizeof(uint16)); + memset(glyphs+oldmax,0,(max-oldmax)*sizeof(uint16)); + } + for ( j=start; j<=end; ++j ) { + glyphs[j-start+ind] = j; + if ( j>=info->glyph_cnt ) + glyphs[j-start+ind] = 0; + } + if ( ind+end-start+1>cnt ) + cnt = ind+end-start+1; + } + } else { + fprintf( stderr, "Bad format for coverage table %d\n", format ); +return( NULL ); + } + glyphs[cnt] = 0xffff; +return( glyphs ); +} + +struct valuerecord { + int16 xplacement, yplacement; + int16 xadvance, yadvance; + uint16 offXplaceDev, offYplaceDev; + uint16 offXadvanceDev, offYadvanceDev; +}; + +static uint16 *getClassDefTable(FILE *ttf, int classdef_offset, int cnt) { + int format, i, j; + uint16 start, glyphcnt, rangecnt, end, class; + uint16 *glist=NULL; + + fseek(ttf, classdef_offset, SEEK_SET); + glist = gcalloc(cnt,sizeof(uint16)); /* Class 0 is default */ + format = getushort(ttf); + if ( format==1 ) { + start = getushort(ttf); + glyphcnt = getushort(ttf); + if ( start+(int) glyphcnt>cnt ) { + fprintf( stderr, "Bad class def table. start=%d cnt=%d, max glyph=%d\n", start, glyphcnt, cnt ); + glyphcnt = cnt-start; + } + for ( i=0; iend || end>=cnt ) + fprintf( stderr, "Bad class def table. Glyph range %d-%d out of range [0,%d)\n", start, end, cnt ); + class = getushort(ttf); + for ( j=start; j<=end; ++j ) + glist[j] = class; + } + } else + fprintf( stderr, "Unknown class table format: %d\n", format ); +return glist; +} + +static void readvaluerecord(struct valuerecord *vr,int vf,FILE *ttf) { + memset(vr,'\0',sizeof(struct valuerecord)); + if ( vf&1 ) + vr->xplacement = getushort(ttf); + if ( vf&2 ) + vr->yplacement = getushort(ttf); + if ( vf&4 ) + vr->xadvance = getushort(ttf); + if ( vf&8 ) + vr->yadvance = getushort(ttf); + if ( vf&0x10 ) + vr->offXplaceDev = getushort(ttf); + if ( vf&0x20 ) + vr->offYplaceDev = getushort(ttf); + if ( vf&0x40 ) + vr->offXadvanceDev = getushort(ttf); + if ( vf&0x80 ) + vr->offYadvanceDev = getushort(ttf); +} + +static void addPairPos(struct ttfinfo *info, int glyph1, int glyph2, + struct lookup *lookup,struct valuerecord *vr1,struct valuerecord *vr2) { + + if ( glyph1glyph_cnt && glyph2glyph_cnt ) { + PST *pos = chunkalloc(sizeof(PST)); + pos->type = pst_pair; + pos->tag = lookup->tag; + pos->script_lang_index = lookup->script_lang_index; + pos->flags = lookup->flags; + pos->next = info->chars[glyph1]->possub; + info->chars[glyph1]->possub = pos; + pos->u.pair.vr = chunkalloc(sizeof(struct vr [2])); + pos->u.pair.paired = copy(info->chars[glyph2]->name); + pos->u.pair.vr[0].xoff = vr1->xplacement; + pos->u.pair.vr[0].yoff = vr1->yplacement; + pos->u.pair.vr[0].h_adv_off = vr1->xadvance; + pos->u.pair.vr[0].v_adv_off = vr1->yadvance; + pos->u.pair.vr[1].xoff = vr2->xplacement; + pos->u.pair.vr[1].yoff = vr2->yplacement; + pos->u.pair.vr[1].h_adv_off = vr2->xadvance; + pos->u.pair.vr[1].v_adv_off = vr2->yadvance; + } else + fprintf( stderr, "Bad pair position: glyphs %d & %d should have been < %d\n", + glyph1, glyph2, info->glyph_cnt ); +} + +static int addKernPair(struct ttfinfo *info, int glyph1, int glyph2, + int16 offset, uint16 sli, uint16 flags,int isv) { + KernPair *kp; + if ( glyph1glyph_cnt && glyph2glyph_cnt ) { + for ( kp=isv ? info->chars[glyph1]->vkerns : info->chars[glyph1]->kerns; + kp!=NULL; kp=kp->next ) { + if ( kp->sc == info->chars[glyph2] ) + break; + } + if ( kp==NULL ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = info->chars[glyph2]; + kp->off = offset; + kp->sli = sli; + kp->flags = flags; + if ( isv ) { + kp->next = info->chars[glyph1]->vkerns; + info->chars[glyph1]->vkerns = kp; + } else { + kp->next = info->chars[glyph1]->kerns; + info->chars[glyph1]->kerns = kp; + } + } else if ( kp->sli!=sli || kp->flags!=flags ) +return( true ); + } else + fprintf( stderr, "Bad kern pair: glyphs %d & %d should have been < %d\n", + glyph1, glyph2, info->glyph_cnt ); +return( false ); +} + +static void gposKernSubTable(FILE *ttf, int stoffset, struct ttfinfo *info, struct lookup *lookup,int isv) { + int coverage, cnt, i, j, pair_cnt, vf1, vf2, glyph2; + int cd1, cd2, c1_cnt, c2_cnt; + uint16 format; + uint16 *ps_offsets; + uint16 *glyphs, *class1, *class2; + struct valuerecord vr1, vr2; + long foffset; + KernClass *kc; + + format=getushort(ttf); + if ( format!=1 && format!=2 ) /* Unknown subtable format */ +return; + coverage = getushort(ttf); + vf1 = getushort(ttf); + vf2 = getushort(ttf); + if ( isv==1 ) { + if ( vf1&0xff77 ) + isv = 2; + if ( vf2&0xff77 ) + isv = 2; + } else if ( isv==0 ) { + if ( vf1&0xffbb) /* can't represent things that deal with y advance/placement nor with x placement as kerning */ + isv = 2; + if ( vf2&0xffaa ) + isv = 2; + } + if ( format==1 ) { + cnt = getushort(ttf); + ps_offsets = galloc(cnt*sizeof(uint16)); + for ( i=0; iglyph_cnt ) { + fseek(ttf,stoffset+ps_offsets[i],SEEK_SET); + pair_cnt = getushort(ttf); + for ( j=0; jscript_lang_index,lookup->flags,isv)) + addPairPos(info, glyphs[i], glyph2,lookup,&vr1,&vr2); + /* If we've already got kern data for this pair of */ + /* glyphs, then we can't make it be a true KernPair */ + /* but we can save the info as a pst_pair */ + } else if ( lookup->flags&1 ) { /* R2L */ + if ( addKernPair(info, glyphs[i], glyph2, vr2.xadvance,lookup->script_lang_index,lookup->flags,isv)) + addPairPos(info, glyphs[i], glyph2,lookup,&vr1,&vr2); + } else { + if ( addKernPair(info, glyphs[i], glyph2, vr1.xadvance,lookup->script_lang_index,lookup->flags,isv)) + addPairPos(info, glyphs[i], glyph2,lookup,&vr1,&vr2); + } + } + } + free(ps_offsets); free(glyphs); + } else if ( format==2 ) { /* Class-based kerning */ + cd1 = getushort(ttf); + cd2 = getushort(ttf); + foffset = ftell(ttf); + class1 = getClassDefTable(ttf, stoffset+cd1, info->glyph_cnt); + class2 = getClassDefTable(ttf, stoffset+cd2, info->glyph_cnt); + fseek(ttf, foffset, SEEK_SET); /* come back */ + c1_cnt = getushort(ttf); + c2_cnt = getushort(ttf); + if ( isv!=2 ) { + if ( isv ) { + if ( info->vkhead==NULL ) + info->vkhead = kc = chunkalloc(sizeof(KernClass)); + else + kc = info->vklast->next = chunkalloc(sizeof(KernClass)); + info->vklast = kc; + } else { + if ( info->khead==NULL ) + info->khead = kc = chunkalloc(sizeof(KernClass)); + else + kc = info->klast->next = chunkalloc(sizeof(KernClass)); + info->klast = kc; + } + kc->first_cnt = c1_cnt; kc->second_cnt = c2_cnt; + kc->sli = lookup->script_lang_index; + kc->flags = lookup->flags; + kc->offsets = galloc(c1_cnt*c2_cnt*sizeof(int16)); + kc->firsts = ClassToNames(info,c1_cnt,class1,info->glyph_cnt); + kc->seconds = ClassToNames(info,c2_cnt,class2,info->glyph_cnt); + for ( i=0; ioffsets[i*c2_cnt+j] = vr1.yadvance; + else if ( lookup->flags&1 ) /* R2L */ + kc->offsets[i*c2_cnt+j] = vr2.xadvance; + else + kc->offsets[i*c2_cnt+j] = vr1.xadvance; + } + } + } else { + int k,l; + for ( i=0; iglyph_cnt; ++k ) + if ( class1[k]==i ) + for ( l=0; lglyph_cnt; ++l ) + if ( class2[l]==j ) + addPairPos(info, k,l,lookup,&vr1,&vr2); + } + } + } + free(class1); free(class2); + } +} + +static void gposCursiveSubTable(FILE *ttf, int stoffset, struct ttfinfo *info,struct lookup *lookup) { + int coverage, cnt, format, i; + struct ee_offsets { int entry, exit; } *offsets; + uint16 *glyphs; + AnchorClass *class; + AnchorPoint *ap; + SplineChar *sc; + + format=getushort(ttf); + if ( format!=1 ) /* Unknown subtable format */ +return; + coverage = getushort(ttf); + cnt = getushort(ttf); + if ( cnt==0 ) +return; + offsets = galloc(cnt*sizeof(struct ee_offsets)); + for ( i=0; iname = uc_copy("Cursive"); + class->feature_tag = lookup->tag; + class->script_lang_index = lookup->script_lang_index; + class->type = act_curs; + if ( info->ahead==NULL ) + info->ahead = class; + else + info->alast->next = class; + info->alast = class; + + for ( i=0; ichars[glyphs[i]]; + if ( offsets[i].entry!=0 ) { + ap = chunkalloc(sizeof(AnchorPoint)); + ap->anchor = class; + fseek(ttf,stoffset+offsets[i].entry,SEEK_SET); + /* All anchor types have the same initial 3 entries, and I only care */ + /* about two of them, so I can ignore all the complexities of the */ + /* format type */ + /* format = */ getushort(ttf); + ap->me.x = (int16) getushort(ttf); + ap->me.y = (int16) getushort(ttf); + ap->type = at_centry; + ap->next = sc->anchor; + sc->anchor = ap; + } + if ( offsets[i].exit!=0 ) { + ap = chunkalloc(sizeof(AnchorPoint)); + ap->anchor = class; + fseek(ttf,stoffset+offsets[i].exit,SEEK_SET); + /* format = */ getushort(ttf); + ap->me.x = (int16) getushort(ttf); + ap->me.y = (int16) getushort(ttf); + ap->type = at_cexit; + ap->next = sc->anchor; + sc->anchor = ap; + } + } + free(offsets); + free(glyphs); +} + +static AnchorClass **MarkGlyphsProcessMarks(FILE *ttf,int markoffset, + struct ttfinfo *info,struct lookup *lookup,uint16 *markglyphs, + int classcnt,int lu_type) { + AnchorClass **classes = gcalloc(classcnt,sizeof(AnchorClass *)), *ac; + unichar_t ubuf[50]; + int i, cnt; + struct mr { uint16 class, offset; } *at_offsets; + AnchorPoint *ap; + SplineChar *sc; + + for ( i=0; ianchor_class_cnt+i ); + classes[i] = ac = chunkalloc(sizeof(AnchorClass)); + ac->name = u_copy(ubuf); + ac->feature_tag = lookup->tag; + ac->script_lang_index = lookup->script_lang_index; + ac->flags = lookup->flags; + ac->merge_with = info->anchor_merge_cnt+1; + ac->type = lu_type==6 ? act_mkmk : act_mark; + /* I don't distinguish between mark to base and mark to lig */ + if ( info->ahead==NULL ) + info->ahead = ac; + else + info->alast->next = ac; + info->alast = ac; + } + + fseek(ttf,markoffset,SEEK_SET); + cnt = getushort(ttf); + at_offsets = galloc(cnt*sizeof(struct mr)); + for ( i=0; i=classcnt ) { + at_offsets[i].class = 0; + fprintf( stderr, "Class out of bounds in GPOS mark sub-table\n" ); + } + } + for ( i=0; i=info->glyph_cnt ) + continue; + sc = info->chars[markglyphs[i]]; + if ( sc==NULL || at_offsets[i].offset==0 ) + continue; + ap = chunkalloc(sizeof(AnchorPoint)); + ap->anchor = classes[at_offsets[i].class]; + fseek(ttf,markoffset+at_offsets[i].offset,SEEK_SET); + /* All anchor types have the same initial 3 entries, and I only care */ + /* about two of them, so I can ignore all the complexities of the */ + /* format type */ + /* format = */ getushort(ttf); + ap->me.x = (int16) getushort(ttf); + ap->me.y = (int16) getushort(ttf); + ap->type = at_mark; + ap->next = sc->anchor; + sc->anchor = ap; + } + free(at_offsets); +return( classes ); +} + +static void MarkGlyphsProcessBases(FILE *ttf,int baseoffset, + struct ttfinfo *info,struct lookup *lookup,uint16 *baseglyphs,int classcnt, + AnchorClass **classes,enum anchor_type at) { + int basecnt,i, j, ibase; + uint16 *offsets; + SplineChar *sc; + AnchorPoint *ap; + + fseek(ttf,baseoffset,SEEK_SET); + basecnt = getushort(ttf); + offsets = galloc(basecnt*classcnt*sizeof(uint16)); + for ( i=0; i=info->glyph_cnt ) + continue; + sc = info->chars[baseglyphs[i]]; + if ( sc==NULL ) + continue; + for ( j=0; janchor = classes[j]; + /* All anchor types have the same initial 3 entries, and I only care */ + /* about two of them, so I can ignore all the complexities of the */ + /* format type */ + /* format = */ getushort(ttf); + ap->me.x = (int16) getushort(ttf); + ap->me.y = (int16) getushort(ttf); + ap->type = at; + ap->next = sc->anchor; + sc->anchor = ap; + } + } +} + +static void MarkGlyphsProcessLigs(FILE *ttf,int baseoffset, + struct ttfinfo *info,struct lookup *lookup,uint16 *baseglyphs,int classcnt, + AnchorClass **classes) { + int basecnt,compcnt, i, j, k, kbase; + uint16 *loffsets, *aoffsets; + SplineChar *sc; + AnchorPoint *ap; + + fseek(ttf,baseoffset,SEEK_SET); + basecnt = getushort(ttf); + loffsets = galloc(basecnt*sizeof(uint16)); + for ( i=0; ichars[baseglyphs[i]]; + if ( baseglyphs[i]>=info->glyph_cnt || sc==NULL ) + continue; + fseek(ttf,baseoffset+loffsets[i],SEEK_SET); + compcnt = getushort(ttf); + aoffsets = galloc(compcnt*classcnt*sizeof(uint16)); + for ( k=0; kanchor = classes[j]; + /* All anchor types have the same initial 3 entries, and I only care */ + /* about two of them, so I can ignore all the complexities of the */ + /* format type */ + /* format = */ getushort(ttf); + ap->me.x = (int16) getushort(ttf); + ap->me.y = (int16) getushort(ttf); + ap->type = at_baselig; + ap->lig_index = k; + ap->next = sc->anchor; + sc->anchor = ap; + } + } + } +} + +static void gposMarkSubTable(FILE *ttf, uint32 stoffset, + struct ttfinfo *info, struct lookup *lookup,int lu_type) { + int markcoverage, basecoverage, classcnt, markoffset, baseoffset; + uint16 *markglyphs, *baseglyphs; + AnchorClass **classes; + + /* The header for the three different mark tables is the same */ + /* Type = */ getushort(ttf); + markcoverage = getushort(ttf); + basecoverage = getushort(ttf); + classcnt = getushort(ttf); + markoffset = getushort(ttf); + baseoffset = getushort(ttf); + markglyphs = getCoverageTable(ttf,stoffset+markcoverage,info); + baseglyphs = getCoverageTable(ttf,stoffset+basecoverage,info); + if ( baseglyphs==NULL || markglyphs==NULL ) { + free(baseglyphs); free(markglyphs); +return; + } + /* as is the (first) mark table */ + classes = MarkGlyphsProcessMarks(ttf,stoffset+markoffset, + info,lookup,markglyphs,classcnt,lu_type); + switch ( lu_type ) { + case 4: /* Mark to Base */ + case 6: /* Mark to Mark */ + MarkGlyphsProcessBases(ttf,stoffset+baseoffset, + info,lookup,baseglyphs,classcnt,classes, + lu_type==4?at_basechar:at_basemark); + break; + case 5: /* Mark to Ligature */ + MarkGlyphsProcessLigs(ttf,stoffset+baseoffset, + info,lookup,baseglyphs,classcnt,classes); + break; + } + info->anchor_class_cnt += classcnt; + ++ info->anchor_merge_cnt; + free(markglyphs); free(baseglyphs); + free(classes); +} + +static void gposSimplePos(FILE *ttf, int stoffset, struct ttfinfo *info, struct lookup *lookup) { + int coverage, cnt, i, vf; + uint16 format; + uint16 *glyphs; + struct valuerecord *vr=NULL, _vr, *which; + + format=getushort(ttf); + if ( format!=1 && format!=2 ) /* Unknown subtable format */ +return; + coverage = getushort(ttf); + vf = getushort(ttf); + if ( (vf&0xf)==0 ) /* Not interested in things whose data lives in device tables */ +return; + if ( format==1 ) { + memset(&_vr,0,sizeof(_vr)); + readvaluerecord(&_vr,vf,ttf); + } else { + cnt = getushort(ttf); + vr = gcalloc(cnt,sizeof(struct valuerecord)); + for ( i=0; iglyph_cnt ) { + PST *pos = chunkalloc(sizeof(PST)); + pos->type = pst_position; + pos->tag = lookup->tag; + pos->script_lang_index = lookup->script_lang_index; + pos->flags = lookup->flags; + pos->next = info->chars[glyphs[i]]->possub; + info->chars[glyphs[i]]->possub = pos; + which = format==1 ? &_vr : &vr[i]; + pos->u.pos.xoff = which->xplacement; + pos->u.pos.yoff = which->yplacement; + pos->u.pos.h_adv_off = which->xadvance; + pos->u.pos.v_adv_off = which->yadvance; + } + free(vr); + free(glyphs); +} + +static void ProcessGPOSGSUBlookup(FILE *ttf,struct ttfinfo *info,int gpos, + struct lookup *lookup, int inusetype, struct lookup *alllooks); + +static void ProcessSubLookups(FILE *ttf,struct ttfinfo *info,int gpos, + struct lookup *alllooks,struct seqlookup *sl) { + int i; + + i = sl->lookup_tag; + if ( i>=info->lookup_cnt ) { + fprintf( stderr, "Attempt to reference lookup %d (within a contextual lookup), but there are\n only %d lookups in %s\n", + i, info->lookup_cnt, gpos ? "'GPOS'" : "'GSUB'" ); + sl->lookup_tag = CHR('!','!','!','!'); +return; + } + if ( alllooks[i].subtag==0 ) { + alllooks[i].make_subtag = true; + ProcessGPOSGSUBlookup(ttf,info,gpos,&alllooks[i],git_normal,alllooks); + alllooks[i].make_subtag = false; + } + sl->lookup_tag = alllooks[i].subtag; +} + +static void g___ContextSubTable1(FILE *ttf, int stoffset, + struct ttfinfo *info, struct lookup *lookup, int justinuse, + struct lookup *alllooks, int gpos) { + int i, j, k, rcnt, cnt; + uint16 coverage; + uint16 *glyphs; + struct subrule { + uint32 offset; + int gcnt; + int scnt; + uint16 *glyphs; + struct seqlookup *sl; + }; + struct rule { + uint32 offsets; + int scnt; + struct subrule *subrules; + } *rules; + FPST *fpst; + struct fpst_rule *rule; + int warned = false, warned2 = false; + + coverage = getushort(ttf); + rcnt = getushort(ttf); /* glyph count in coverage table */ + rules = galloc(rcnt*sizeof(struct rule)); + for ( i=0; i=info->glyph_cnt ) { + if ( !warned ) + fprintf( stderr, "Bad contextual or chaining sub table. Glyph %d out of range [0,%d)\n", + rules[i].subrules[j].glyphs[k], info->glyph_cnt ); + warned = true; + rules[i].subrules[j].glyphs[k] = 0; + } + } + rules[i].subrules[j].glyphs[k] = 0xffff; + rules[i].subrules[j].scnt = getushort(ttf); + rules[i].subrules[j].sl = galloc(rules[i].subrules[j].scnt*sizeof(struct seqlookup)); + for ( k=0; k= rules[i].subrules[j].gcnt+1 ) + if ( !warned2 ) { + fprintf( stderr, "Attempt to apply a lookup to a location out of the range of this contextual\n lookup seq=%d max=%d\n", + rules[i].subrules[j].sl[k].seq, rules[i].subrules[j].gcnt ); + warned2 = true; + } + rules[i].subrules[j].sl[k].lookup_tag = getushort(ttf); + } + } + } + + if ( justinuse==git_justinuse ) { + for ( i=0; ilookup_cnt ) + ProcessGPOSGSUBlookup(ttf,info,gpos, + &alllooks[rules[i].subrules[j].sl[k].lookup_tag], + justinuse,alllooks); + } + } + } else { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = gpos ? pst_contextpos : pst_contextsub; + fpst->format = pst_glyphs; + fpst->tag = lookup->tag; + fpst->script_lang_index = lookup->script_lang_index; + fpst->flags = lookup->flags; + fpst->next = info->possub; + info->possub = fpst; + + fpst->rules = rule = gcalloc(cnt,sizeof(struct fpst_rule)); + fpst->rule_cnt = cnt; + + cnt = 0; + for ( i=0; i=info->glyph_cnt ) { + if ( !warned ) + fprintf( stderr, "Bad contextual or chaining sub table. Glyph %d out of range [0,%d)\n", + (&rules[i].subrules[j].glyphs)[which][k], info->glyph_cnt ); + warned = true; + (&rules[i].subrules[j].glyphs)[which][k] = 0; + } + } + } + + rules[i].subrules[j].scnt = getushort(ttf); + rules[i].subrules[j].sl = galloc(rules[i].subrules[j].scnt*sizeof(struct seqlookup)); + for ( k=0; k= rules[i].subrules[j].gcnt+1 ) + if ( !warned2 ) { + fprintf( stderr, "Attempt to apply a lookup to a location out of the range of this contextual\n lookup seq=%d max=%d\n", + rules[i].subrules[j].sl[k].seq, rules[i].subrules[j].gcnt ); + warned2 = true; + } + rules[i].subrules[j].sl[k].lookup_tag = getushort(ttf); + } + } + } + + if ( justinuse==git_justinuse ) { + for ( i=0; ilookup_cnt ) + ProcessGPOSGSUBlookup(ttf,info,gpos, + &alllooks[rules[i].subrules[j].sl[k].lookup_tag], + justinuse,alllooks); + } + } + } else { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = gpos ? pst_chainpos : pst_chainsub; + fpst->format = pst_glyphs; + fpst->tag = lookup->tag; + fpst->script_lang_index = lookup->script_lang_index; + fpst->flags = lookup->flags; + fpst->next = info->possub; + info->possub = fpst; + + fpst->rules = rule = gcalloc(cnt,sizeof(struct fpst_rule)); + fpst->rule_cnt = cnt; + + cnt = 0; + for ( i=0; i= rules[i].subrules[j].ccnt ) + if ( !warned2 ) { + fprintf( stderr, "Attempt to apply a lookup to a location out of the range of this contextual\n lookup seq=%d max=%d\n", + rules[i].subrules[j].sl[k].seq, rules[i].subrules[j].ccnt-1); + warned2 = true; + } + rules[i].subrules[j].sl[k].lookup_tag = getushort(ttf); + } + } + } + + if ( justinuse==git_justinuse ) { + for ( i=0; ilookup_cnt ) + ProcessGPOSGSUBlookup(ttf,info,gpos, + &alllooks[rules[i].subrules[j].sl[k].lookup_tag], + justinuse,alllooks); + } + } + } else { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = gpos ? pst_contextpos : pst_contextsub; + fpst->format = pst_class; + fpst->tag = lookup->tag; + fpst->script_lang_index = lookup->script_lang_index; + fpst->flags = lookup->flags; + fpst->next = info->possub; + info->possub = fpst; + + fpst->rules = rule = gcalloc(cnt,sizeof(struct fpst_rule)); + fpst->rule_cnt = cnt; + class = getClassDefTable(ttf, stoffset+classoff, info->glyph_cnt); + fpst->nccnt = ClassFindCnt(class,info->glyph_cnt); + fpst->nclass = ClassToNames(info,fpst->nccnt,class,info->glyph_cnt); + + cnt = 0; + for ( i=0; i= rules[i].subrules[j].ccnt ) + if ( !warned2 ) { + fprintf( stderr, "Attempt to apply a lookup to a location out of the range of this contextual\n lookup seq=%d max=%d\n", + rules[i].subrules[j].sl[k].seq, rules[i].subrules[j].ccnt-1); + warned2 = true; + } + rules[i].subrules[j].sl[k].lookup_tag = getushort(ttf); + } + } + } + + if ( justinuse==git_justinuse ) { + for ( i=0; ilookup_cnt ) + ProcessGPOSGSUBlookup(ttf,info,gpos, + &alllooks[rules[i].subrules[j].sl[k].lookup_tag], + justinuse,alllooks); + } + } + } else { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = gpos ? pst_chainpos : pst_chainsub; + fpst->format = pst_class; + fpst->tag = lookup->tag; + fpst->script_lang_index = lookup->script_lang_index; + fpst->flags = lookup->flags; + fpst->next = info->possub; + info->possub = fpst; + + fpst->rules = rule = gcalloc(cnt,sizeof(struct fpst_rule)); + fpst->rule_cnt = cnt; + + class = getClassDefTable(ttf, stoffset+classoff, info->glyph_cnt); + fpst->nccnt = ClassFindCnt(class,info->glyph_cnt); + fpst->nclass = ClassToNames(info,fpst->nccnt,class,info->glyph_cnt); + free(class); + class = getClassDefTable(ttf, stoffset+bclassoff, info->glyph_cnt); + fpst->bccnt = ClassFindCnt(class,info->glyph_cnt); + fpst->bclass = ClassToNames(info,fpst->bccnt,class,info->glyph_cnt); + free(class); + class = getClassDefTable(ttf, stoffset+fclassoff, info->glyph_cnt); + fpst->fccnt = ClassFindCnt(class,info->glyph_cnt); + fpst->fclass = ClassToNames(info,fpst->fccnt,class,info->glyph_cnt); + free(class); + + cnt = 0; + for ( i=0; i= gcnt && !warned2 ) { + fprintf( stderr, "Attempt to apply a lookup to a location out of the range of this contextual\n lookup seq=%d, max=%d\n", + sl[k].seq, gcnt-1 ); + warned2 = true; + } + sl[k].lookup_tag = getushort(ttf); + } + + if ( justinuse==git_justinuse ) { + for ( k=0; klookup_cnt ) + ProcessGPOSGSUBlookup(ttf,info,gpos, + &alllooks[sl[k].lookup_tag], + justinuse,alllooks); + } else { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = gpos ? pst_contextpos : pst_contextsub; + fpst->format = pst_coverage; + fpst->tag = lookup->tag; + fpst->script_lang_index = lookup->script_lang_index; + fpst->flags = lookup->flags; + fpst->next = info->possub; + info->possub = fpst; + + fpst->rules = rule = gcalloc(1,sizeof(struct fpst_rule)); + fpst->rule_cnt = 1; + rule->u.coverage.ncnt = gcnt; + rule->u.coverage.ncovers = galloc(gcnt*sizeof(char **)); + for ( i=0; iu.coverage.ncovers[i] = GlyphsToNames(info,glyphs); + free(glyphs); + } + rule->lookup_cnt = scnt; + rule->lookups = sl; + for ( k=0; k= gcnt && !warned2 ) { + fprintf( stderr, "Attempt to apply a lookup to a location out of the range of this contextual\n lookup seq=%d, max=%d\n", + sl[k].seq, gcnt-1 ); + warned2 = true; + } + sl[k].lookup_tag = getushort(ttf); + } + + if ( justinuse==git_justinuse ) { + for ( k=0; klookup_cnt ) + ProcessGPOSGSUBlookup(ttf,info,gpos, + &alllooks[sl[k].lookup_tag], + justinuse,alllooks); + } else { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = gpos ? pst_chainpos : pst_chainsub; + fpst->format = pst_coverage; + fpst->tag = lookup->tag; + fpst->script_lang_index = lookup->script_lang_index; + fpst->flags = lookup->flags; + fpst->next = info->possub; + info->possub = fpst; + + fpst->rules = rule = gcalloc(1,sizeof(struct fpst_rule)); + fpst->rule_cnt = 1; + + rule->u.coverage.bcnt = bcnt; + rule->u.coverage.bcovers = galloc(bcnt*sizeof(char **)); + for ( i=0; iu.coverage.bcovers[i] = GlyphsToNames(info,glyphs); + free(glyphs); + } + + rule->u.coverage.ncnt = gcnt; + rule->u.coverage.ncovers = galloc(gcnt*sizeof(char **)); + for ( i=0; iu.coverage.ncovers[i] = GlyphsToNames(info,glyphs); + free(glyphs); + } + + rule->u.coverage.fcnt = fcnt; + rule->u.coverage.fcovers = galloc(fcnt*sizeof(char **)); + for ( i=0; iu.coverage.fcovers[i] = GlyphsToNames(info,glyphs); + free(glyphs); + } + + rule->lookup_cnt = scnt; + rule->lookups = sl; + for ( k=0; kglyph_cnt ) { + if ( info->chars[glyphs[i]]->name!=NULL ) { + which = format==1 ? (uint16) (glyphs[i]+delta) : glyph2s[i]; + if ( info->chars[which]->name==NULL ) { + char *basename = info->chars[glyphs[i]]->name; + char *str; + char tag[5], *pt=tag; + for ( j=0; tagstr[j].tag!=0 && tagstr[j].tag!=lookup->tag; ++j ); + if ( tagstr[j].tag!=0 ) + pt = tagstr[j].str; + else { + tag[0] = lookup->tag>>24; + if ( (tag[1] = (lookup->tag>>16)&0xff)==' ' ) tag[1] = '\0'; + if ( (tag[2] = (lookup->tag>>8)&0xff)==' ' ) tag[2] = '\0'; + if ( (tag[3] = (lookup->tag)&0xff)==' ' ) tag[3] = '\0'; + tag[4] = '\0'; + pt = tag; + } + str = galloc(strlen(basename)+strlen(pt)+2); + sprintf(str,"%s.%s", basename, pt ); + info->chars[which]->name = str; + } + } + } + } else if ( justinuse==git_justinuse ) { + for ( i=0; glyphs[i]!=0xffff; ++i ) if ( glyphs[i]glyph_cnt ) { + info->inuse[glyphs[i]]= true; + which = format==1 ? (uint16) (glyphs[i]+delta) : glyph2s[i]; + info->inuse[which]= true; + } + } else if ( justinuse==git_normal ) { + for ( i=0; glyphs[i]!=0xffff; ++i ) if ( glyphs[i]glyph_cnt && info->chars[glyphs[i]]!=NULL ) { + which = format==1 ? (uint16) (glyphs[i]+delta) : glyph2s[i]; + if ( which>=info->glyph_cnt ) { + fprintf( stderr, "Bad substitution glyph: %d not less than %d\n", + which, info->glyph_cnt); + which = 0; + } + if ( info->chars[which]!=NULL ) { /* Might be in a ttc file */ + PST *pos = chunkalloc(sizeof(PST)); + pos->type = pst_substitution; + pos->tag = lookup->tag; + pos->script_lang_index = lookup->script_lang_index; + pos->flags = lookup->flags; + pos->next = info->chars[glyphs[i]]->possub; + info->chars[glyphs[i]]->possub = pos; + pos->u.subs.variant = copy(info->chars[which]->name); + } + } + } + free(glyph2s); + free(glyphs); +} + +/* Multiple and alternate substitution lookups have the same format */ +static void gsubMultipleSubTable(FILE *ttf, int stoffset, struct ttfinfo *info, + struct lookup *lookup, int lu_type, int justinuse) { + int coverage, cnt, i, j, len, max; + uint16 format; + uint16 *offsets; + uint16 *glyphs, *glyph2s; + char *pt; + int bad; + + if ( justinuse==git_findnames ) +return; + + format=getushort(ttf); + if ( format!=1 ) /* Unknown subtable format */ +return; + coverage = getushort(ttf); + cnt = getushort(ttf); + offsets = galloc(cnt*sizeof(uint16)); + for ( i=0; imax ) { + max = cnt+30; + glyph2s = grealloc(glyph2s,max*sizeof(uint16)); + } + len = 0; bad = false; + for ( j=0; j=info->glyph_cnt ) { + if ( !justinuse ) + fprintf( stderr, "Bad Multiple/Alternate substitution glyph %d not less than %d\n", + glyph2s[j], info->glyph_cnt ); + glyph2s[j] = 0; + } + if ( justinuse==git_justinuse ) + /* Do Nothing */; + else if ( info->chars[glyph2s[j]]==NULL ) + bad = true; + else + len += strlen( info->chars[glyph2s[j]]->name) +1; + } + if ( justinuse==git_justinuse ) { + info->inuse[glyphs[i]] = 1; + for ( j=0; jinuse[glyph2s[j]] = 1; + } else if ( info->chars[glyphs[i]]!=NULL && !bad ) { + sub = chunkalloc(sizeof(PST)); + sub->type = lu_type==2?pst_multiple:pst_alternate; + sub->tag = lookup->tag; + sub->script_lang_index = lookup->script_lang_index; + sub->flags = lookup->flags; + sub->next = info->chars[glyphs[i]]->possub; + info->chars[glyphs[i]]->possub = sub; + pt = sub->u.subs.variant = galloc(len+1); + *pt = '\0'; + for ( j=0; jchars[glyph2s[j]]->name); + strcat(pt," "); + } + } + } + free(glyphs); + free(glyph2s); + free(offsets); +} + +static void gsubLigatureSubTable(FILE *ttf, int stoffset, + struct ttfinfo *info, struct lookup *lookup, int justinuse) { + int coverage, cnt, i, j, k, lig_cnt, cc, len; + uint16 *ls_offsets, *lig_offsets; + uint16 *glyphs, *lig_glyphs, lig; + char *pt; + PST *liga; + + /* Format = */ getushort(ttf); + coverage = getushort(ttf); + cnt = getushort(ttf); + ls_offsets = galloc(cnt*sizeof(uint16)); + for ( i=0; i=info->glyph_cnt ) { + fprintf( stderr, "Bad ligature glyph %d not less than %d\n", + lig, info->glyph_cnt ); + lig = 0; + } + cc = getushort(ttf); + if ( cc>100 ) { + fprintf( stderr, "Unlikely count of ligature components (%d), I suspect this ligature sub-\n table is garbage, I'm giving up on it.\n", cc ); + free(glyphs); free(lig_offsets); +return; + } + lig_glyphs = galloc(cc*sizeof(uint16)); + lig_glyphs[0] = glyphs[i]; + for ( k=1; k=info->glyph_cnt ) { + if ( justinuse==git_normal ) + fprintf( stderr, "Bad ligature component glyph %d not less than %d (in ligature %d)\n", + lig_glyphs[k], info->glyph_cnt, lig ); + lig_glyphs[k] = 0; + } + } + if ( justinuse==git_justinuse ) { + info->inuse[lig] = 1; + for ( k=0; kinuse[lig_glyphs[k]] = 1; + } else if ( justinuse==git_findnames ) { + /* If our ligature glyph has no name (and its components do) */ + /* give it a name by concatenating components with underscores */ + /* between them, and appending the tag */ + if ( info->chars[lig]!=NULL && info->chars[lig]->name==NULL ) { + int len=0; + for ( k=0; kchars[lig_glyphs[k]]==NULL || info->chars[lig_glyphs[k]]->name==NULL ) + break; + len += strlen(info->chars[lig_glyphs[k]]->name)+1; + } + if ( k==cc ) { + char *str = galloc(len+6), *pt; + char tag[5]; + tag[0] = lookup->tag>>24; + if ( (tag[1] = (lookup->tag>>16)&0xff)==' ' ) tag[1] = '\0'; + if ( (tag[2] = (lookup->tag>>8)&0xff)==' ' ) tag[2] = '\0'; + if ( (tag[3] = (lookup->tag)&0xff)==' ' ) tag[3] = '\0'; + tag[4] = '\0'; + *str='\0'; + for ( k=0; kchars[lig_glyphs[k]]->name); + strcat(str,"_"); + } + pt = str+strlen(str); + pt[-1] = '.'; + strcpy(pt,tag); + info->chars[lig]->name = str; + } + } + } else if ( info->chars[lig]!=NULL ) { + for ( k=len=0; kchars[lig_glyphs[k]]->name)+1; + liga = chunkalloc(sizeof(PST)); + liga->type = pst_ligature; + liga->tag = lookup->tag; + liga->script_lang_index = lookup->script_lang_index; + liga->flags = lookup->flags; + liga->next = info->chars[lig]->possub; + info->chars[lig]->possub = liga; + liga->u.lig.lig = info->chars[lig]; + liga->u.lig.components = pt = galloc(len); + for ( k=0; kchars[lig_glyphs[k]]->name); + pt += strlen(pt); + *pt++ = ' '; + } + pt[-1] = '\0'; + free(lig_glyphs); + } + } + free(lig_offsets); + } + free(ls_offsets); free(glyphs); +} + +static void gsubContextSubTable(FILE *ttf, int stoffset, + struct ttfinfo *info, struct lookup *lookup, int justinuse, + struct lookup *alllooks) { + if ( justinuse==git_findnames ) +return; /* Don't give names to these guys, they might not be unique */ + /* ie. because these are context based there is not a one to one */ + /* mapping between input glyphs and output glyphs. One input glyph */ + /* may go to several output glyphs (depending on context) and so */ + /* "." would be used for several glyphs */ + switch( getushort(ttf)) { + case 1: + g___ContextSubTable1(ttf,stoffset,info,lookup,justinuse,alllooks,false); + break; + case 2: + g___ContextSubTable2(ttf,stoffset,info,lookup,justinuse,alllooks,false); + break; + case 3: + g___ContextSubTable3(ttf,stoffset,info,lookup,justinuse,alllooks,false); + break; + } +} + +static void gsubChainingSubTable(FILE *ttf, int stoffset, + struct ttfinfo *info, struct lookup *lookup, int justinuse, + struct lookup *alllooks) { + if ( justinuse==git_findnames ) +return; /* Don't give names to these guys, the names might not be unique */ + switch( getushort(ttf)) { + case 1: + g___ChainingSubTable1(ttf,stoffset,info,lookup,justinuse,alllooks,false); + break; + case 2: + g___ChainingSubTable2(ttf,stoffset,info,lookup,justinuse,alllooks,false); + break; + case 3: + g___ChainingSubTable3(ttf,stoffset,info,lookup,justinuse,alllooks,false); + break; + } +} + +static void gsubReverseChainSubTable(FILE *ttf, int stoffset, + struct ttfinfo *info, struct lookup *lookup, int justinuse) { + int scnt, bcnt, fcnt, i; + uint16 coverage, *bcoverage, *fcoverage, *sglyphs, *glyphs; + FPST *fpst; + struct fpst_rule *rule; + + if ( justinuse==git_findnames ) +return; /* Don't give names to these guys, they might not be unique */ + if ( getushort(ttf)!=1 ) +return; /* Don't understand this format type */ + + coverage = getushort(ttf); + bcnt = getushort(ttf); + bcoverage = galloc(bcnt*sizeof(uint16)); + for ( i = 0 ; i=info->glyph_cnt ) { + fprintf( stderr, "Bad reverse contextual chaining substitution glyph: %d is not less than %d\n", + sglyphs[i], info->glyph_cnt ); + sglyphs[i] = 0; + } + sglyphs[i] = 0xffff; + + if ( justinuse==git_justinuse ) { + for ( i = 0 ; iinuse[sglyphs[i]] = 1; + } else { + fpst = chunkalloc(sizeof(FPST)); + fpst->type = pst_reversesub; + fpst->format = pst_reversecoverage; + fpst->tag = lookup->tag; + fpst->script_lang_index = lookup->script_lang_index; + fpst->flags = lookup->flags; + fpst->next = info->possub; + info->possub = fpst; + + fpst->rules = rule = gcalloc(1,sizeof(struct fpst_rule)); + fpst->rule_cnt = 1; + + rule->u.rcoverage.always1 = 1; + rule->u.rcoverage.bcnt = bcnt; + rule->u.rcoverage.fcnt = fcnt; + rule->u.rcoverage.ncovers = galloc(sizeof(char *)); + rule->u.rcoverage.bcovers = galloc(bcnt*sizeof(char *)); + rule->u.rcoverage.fcovers = galloc(fcnt*sizeof(char *)); + rule->u.rcoverage.replacements = GlyphsToNames(info,sglyphs); + glyphs = getCoverageTable(ttf,stoffset+coverage,info); + rule->u.rcoverage.ncovers[0] = GlyphsToNames(info,glyphs); + free(glyphs); + for ( i=0; iu.rcoverage.bcovers[i] = GlyphsToNames(info,glyphs); + free(glyphs); + } + for ( i=0; iu.rcoverage.fcovers[i] = GlyphsToNames(info,glyphs); + free(glyphs); + } + rule->lookup_cnt = 0; /* substitution lookups needed for reverse chaining */ + } + free(sglyphs); + free(fcoverage); + free(bcoverage); +} + +static struct feature *readttffeatures(FILE *ttf,int32 pos,int isgpos, struct ttfinfo *info) { + /* read the features table returning an array containing all interesting */ + /* features */ + int cnt; + uint32 tag; + int i,j; + struct feature *features; + + fseek(ttf,pos,SEEK_SET); + cnt = getushort(ttf); + if ( cnt<=0 ) +return( NULL ); + features = gcalloc(cnt+1,sizeof(struct feature)); + info->feats[isgpos] = galloc((3*cnt+1)*sizeof(uint32)); + info->feats[isgpos][0] = 0; + for ( i=0; inext = new; + last = new; + sl = sl->next; + } +return( head ); +} + +static struct scriptlist *ScriptListMerge(struct scriptlist *into,const struct scriptlist *from) { + struct scriptlist *sl, *new; + int i,j; + + while ( from ) { + for ( sl=into; sl!=NULL && sl->script!=from->script; sl=sl->next ); + if ( sl==NULL ) { + new = galloc(sizeof(struct scriptlist)); + *new = *from; + new->next = into; + into = new; + } else { + for ( i=0; ilang_cnt; ++i ) { + if ( sl->lang_cntlang_cnt && sl->langs[j]!=from->langs[i]; ++j ); + if ( j>=sl->lang_cnt ) + sl->langs[sl->lang_cnt++] = from->langs[i]; + } + } + } + from = from->next; + } +return( into ); +} + +static struct lookup *compactttflookups(struct feature *features,uint32 *feats, int lu_cnt) { + /* go through the feature table we read, and return an array containing */ + /* all lookup indeces which match the feature tags */ + int cnt, extras=0; + int i,j,k,l; + struct lookup *lookups, *cur, *alt; + + lookups = gcalloc(lu_cnt+1,sizeof(struct lookup)); + for ( i=0; ilu_cnt ) { + fprintf( stderr, "Feature '%c%c%c%c' refers to lookup %d which is not within the lookup array[%d]\n", + features[i].tag>>24, (features[i].tag>>16)&0xff, + (features[i].tag>>8)&0xff, features[i].tag&0xff, + j, lu_cnt ); + continue; + } + cur = &lookups[j]; + while ( cur!=NULL && cur->tag!=0 && cur->tag!=features[i].tag ) + cur = cur->alttags; + if ( cur==NULL ) { + cur = gcalloc(1,sizeof(struct lookup)); + cur->alttags = lookups[j].alttags; + lookups[j].alttags = cur; + ++extras; +#if 0 + printf( "Extra tag for %c%c%c%c is %c%c%c%c\n", + lookups[j].tag>>24, (lookups[j].tag>>16)&0xff, (lookups[j].tag>>8)&0xff, (lookups[j].tag)&0xff, + features[i].tag>>24, (features[i].tag>>16)&0xff, (features[i].tag>>8)&0xff, (features[i].tag)&0xff ); +#endif + } + if ( cur->tag==0 ) { + cur->tag = features[i].tag; + cur->sl = ScriptListCopy(features[i].sl); + cur->lookup = j; + } else { + cur->sl = ScriptListMerge(cur->sl,features[i].sl); + } + } + free( features[i].lookups ); + } +#if 0 /* Now that we work with contextual pos/sub we need to keep these around */ + /* Some lookups may not be "interesting" so remove holes */ + for ( i=j=0; ialttags; + lookups[cnt] = *cur; + lookups[cnt++].alttags = NULL; + free(cur); + } + } + } + + free( features ); + for ( i=0; ireqsl : feature->sl; sl!=NULL && sl->script!=script; sl=sl->next ); + if ( sl==NULL ) { + sl = gcalloc(1,sizeof(struct scriptlist)); + if ( is_required ) { + sl->next = feature->reqsl; + feature->reqsl = sl; + } else { + sl->next = feature->sl; + feature->sl = sl; + } + sl->script = script; + } + if ( sl->lang_cntlang_cnt-1; j>=0 ; --j ) + if ( sl->langs[j]==lang ) + break; + if ( j<0 ) + sl->langs[sl->lang_cnt++] = lang; + } +} + +static void ProcessLangSys(FILE *ttf,uint32 langsysoff, + struct feature *features, uint32 script, uint32 lang) { + int cnt, feature, i; + + fseek(ttf,langsysoff,SEEK_SET); + /* lookuporder = */ getushort(ttf); /* not meaningful yet */ + feature = getushort(ttf); /* required feature */ + if ( feature==0xffff ) + /* No required feature */; + else { + LSysAddToFeature(&features[feature],script,lang,true); + } + cnt = getushort(ttf); + for ( i=0; i=stab.maxcnt ) { + stab.maxcnt = stab.langcnt+30; + stab.langsys = grealloc(stab.langsys,stab.maxcnt*sizeof(uint16)); + stab.lang = grealloc(stab.langsys,stab.maxcnt*sizeof(uint32)); + } + for ( j=0; jnext, ++j ); + for ( i=0; sr[i].script!=0; ++i ); + if ( i!=j ) +return( false ); + + for ( slt=sl; slt!=NULL; slt=slt->next ) { + for ( i=0; sr[i].script!=0 && sr[i].script!=slt->script; ++i ); + if ( sr[i].script==0 ) +return( false ); + for ( j=0 ; sr[i].langs[j]!=0; ++j ); + if ( j!=slt->lang_cnt ) +return( false ); + for ( j=0 ; sr[i].langs[j]!=0; ++j ) + if ( sr[i].langs[j]!=slt->langs[j] ) +return( false ); + } +return( true ); +} + +static void FigureScriptIndeces(struct ttfinfo *info,struct lookup *lookups) { + int i,j,k; + struct scriptlist *sl, *snext; + + for ( i=0; lookups[i].script_lang_index!=0xffff; ++i ); + if ( info->script_lang==NULL ) { + info->script_lang = gcalloc(i+1,sizeof(struct script_record *)); + } else { + for ( j=0; info->script_lang[j]!=NULL; ++j ); + info->script_lang = grealloc(info->script_lang,(i+j+1)*sizeof(struct script_record *)); + } + for ( i=0; lookups[i].script_lang_index!=0xffff; ++i ) { + for ( j=0; info->script_lang[j]!=NULL; ++j ) + if ( SLMatch(info->script_lang[j],lookups[i].sl)) + break; + lookups[i].script_lang_index = j; + if ( info->script_lang[j]==NULL ) { + for ( k=0, sl=lookups[i].sl; sl!=NULL; sl=sl->next, ++k ); + info->script_lang[j] = galloc((k+1)*sizeof(struct script_record)); + for ( k=0, sl=lookups[i].sl; sl!=NULL; sl=sl->next, ++k ) { + info->script_lang[j][k].script = sl->script; + info->script_lang[j][k].langs = galloc((sl->lang_cnt+1)*sizeof(uint32)); + memcpy(info->script_lang[j][k].langs,sl->langs,sl->lang_cnt*sizeof(uint32)); + info->script_lang[j][k].langs[sl->lang_cnt]=0; + } + info->script_lang[j][k].script = 0; + info->script_lang[j+1] = NULL; + info->sli_cnt = j+1; + } + for ( sl=lookups[i].sl; sl!=NULL; sl=snext ) { + snext = sl->next; + free( sl ); + } + } +} + +static void gposExtensionSubTable(FILE *ttf, int stoffset, + struct ttfinfo *info, struct lookup *lookup, + struct lookup *alllooks) { + uint32 base = ftell(ttf), st, offset; + int lu_type; + + /* Format = */ getushort(ttf); + lu_type = getushort(ttf); + offset = getlong(ttf); + + fseek(ttf,st = base+offset,SEEK_SET); + switch ( lu_type ) { + case 1: + gposSimplePos(ttf,st,info,lookup); + break; + case 2: + if ( lookup->tag==CHR('k','e','r','n') ) + gposKernSubTable(ttf,st,info,lookup,false); + else if ( lookup->tag==CHR('v','k','r','n') ) + gposKernSubTable(ttf,st,info,lookup,true); + else + gposKernSubTable(ttf,st,info,lookup,2); + break; + case 3: + gposCursiveSubTable(ttf,st,info,lookup); + break; + case 4: case 5: case 6: + gposMarkSubTable(ttf,st,info,lookup,lu_type); + break; + case 7: + gposContextSubTable(ttf,st,info,lookup,alllooks); + break; + case 8: + gposChainingSubTable(ttf,st,info,lookup,alllooks); + break; +/* Any cases added here also need to go in the gposLookupSwitch */ + case 9: + fprintf( stderr, "This font is erroneous it has a GPOS extension subtable that points to\nanother extension sub-table.\n" ); + break; + } +} + +static void gsubExtensionSubTable(FILE *ttf, int stoffset, + struct ttfinfo *info, struct lookup *lookup, int justinuse, + struct lookup *alllooks) { + uint32 base = ftell(ttf), st, offset; + int lu_type; + + /* Format = */ getushort(ttf); + lu_type = getushort(ttf); + offset = getlong(ttf); + + fseek(ttf,st = base+offset,SEEK_SET); + switch ( lu_type ) { + case 1: + gsubSimpleSubTable(ttf,st,info,lookup,justinuse); + break; + case 2: case 3: /* Multiple and alternate have same format, different semantics */ + gsubMultipleSubTable(ttf,st,info,lookup,lu_type,justinuse); + break; + case 4: + gsubLigatureSubTable(ttf,st,info,lookup,justinuse); + break; + case 5: + gsubContextSubTable(ttf,st,info,lookup,justinuse,alllooks); + break; + case 6: + gsubChainingSubTable(ttf,st,info,lookup,justinuse,alllooks); + break; + case 7: + fprintf( stderr, "This font is erroneous it has a GSUB extension subtable that points to\nanother extension sub-table.\n" ); + break; + case 8: + gsubReverseChainSubTable(ttf,st,info,lookup,justinuse); + break; +/* Any cases added here also need to go in the gsubLookupSwitch */ + } +} + +static void gposLookupSwitch(FILE *ttf, int st, + struct ttfinfo *info, struct lookup *lookup, + struct lookup *alllooks, int lu_type) { + + switch ( lu_type ) { + case 1: + gposSimplePos(ttf,st,info,lookup); + break; + case 2: + if ( lookup->tag==CHR('k','e','r','n') ) + gposKernSubTable(ttf,st,info,lookup,false); + else if ( lookup->tag==CHR('v','k','r','n') ) + gposKernSubTable(ttf,st,info,lookup,true); + else + gposKernSubTable(ttf,st,info,lookup,2); + break; + case 3: + gposCursiveSubTable(ttf,st,info,lookup); + break; + case 4: case 5: case 6: + gposMarkSubTable(ttf,st,info,lookup,lu_type); + break; + case 7: + gposContextSubTable(ttf,st,info,lookup,alllooks); + break; + case 8: + gposChainingSubTable(ttf,st,info,lookup,alllooks); + break; + case 9: + gposExtensionSubTable(ttf,st,info,lookup,alllooks); + break; +/* Any cases added here also need to go in the gposExtensionSubTable */ + } +} + +static void gsubLookupSwitch(FILE *ttf, int st, + struct ttfinfo *info, struct lookup *lookup, int justinuse, + struct lookup *alllooks, int lu_type) { + + switch ( lu_type ) { + case 1: + gsubSimpleSubTable(ttf,st,info,lookup,justinuse); + break; + case 2: case 3: /* Multiple and alternate have same format, different semantics */ + gsubMultipleSubTable(ttf,st,info,lookup,lu_type,justinuse); + break; + case 4: + gsubLigatureSubTable(ttf,st,info,lookup,justinuse); + break; + case 5: + gsubContextSubTable(ttf,st,info,lookup,justinuse,alllooks); + break; + case 6: + gsubChainingSubTable(ttf,st,info,lookup,justinuse,alllooks); + break; + case 7: + gsubExtensionSubTable(ttf,st,info,lookup,justinuse,alllooks); + break; + case 8: + gsubReverseChainSubTable(ttf,st,info,lookup,justinuse); + break; +/* Any cases added here also need to go in the gsubExtensionSubTable */ + } +} + +static uint32 InfoGenerateNewFeatureTag(struct gentagtype *gentags,int lu_type, + int gpos, uint32 suggested_tag, int lookup_index) { + int type = pst_null; + char buf[8]; + + switch ( gpos ) { + case 0: + switch ( lu_type ) { + case 1: + type = pst_substitution; + break; + case 2: + type = pst_multiple; + break; + case 3: + type = pst_alternate; + break; + case 4: + type = pst_ligature; + break; + case 5: + type = pst_contextsub; + break; + case 6: + type = pst_chainsub; + break; + case 8: + type = pst_reversesub; + break; + } + break; + case 1: + switch ( lu_type ) { + case 1: + type=pst_position; + break; + case 2: + type = pst_pair; + break; + case 3: + case 4: + case 5: + case 6: + type = pst_anchors; + break; + case 7: + type = pst_contextpos; + break; + case 8: + type = pst_chainpos; + break; + } + break; + } + if ( suggested_tag==0 && lookup_index<1000 ) { + sprintf( buf, "L%03d", lookup_index ); + suggested_tag = CHR(buf[0],buf[1],buf[2],buf[3]); + } +return( SFGenerateNewFeatureTag(gentags,type,suggested_tag)); +} + +static void ProcessGPOSGSUBlookup(FILE *ttf,struct ttfinfo *info,int gpos, + struct lookup *lookup, int inusetype, struct lookup *alllooks) { + int j, lu_type, cnt, st; + uint16 *st_offsets; + uint32 oldtag; int oldsli; + + if ( lookup->offset==0 ) +return; + if ( fseek(ttf,lookup->offset,SEEK_SET)==-1 ) { + fprintf( stderr, "Bad seek when processing lookup\n" ); +return; + } + lu_type = getushort(ttf); + lookup->flags = getushort(ttf); + cnt = getushort(ttf); + st_offsets = galloc(cnt*sizeof(uint16)); + for ( j=0; jtag; oldsli = lookup->script_lang_index; + if ( lookup->make_subtag ) { + lookup->tag = lookup->subtag = InfoGenerateNewFeatureTag(&info->gentags, + lu_type,gpos,oldtag,lookup->lookup); + lookup->script_lang_index = SLI_NESTED; + } + + for ( j=0; joffset+st_offsets[j],SEEK_SET); + if ( gpos ) { + gposLookupSwitch(ttf,st,info,lookup,alllooks,lu_type); + } else { + gsubLookupSwitch(ttf,st,info,lookup,inusetype,alllooks,lu_type); + } + } + free(st_offsets); + + lookup->tag = oldtag; + lookup->script_lang_index = oldsli; +} + +static void ProcessGPOSGSUB(FILE *ttf,struct ttfinfo *info,int gpos,int inusetype) { + int i, k, lu_cnt; + uint16 offset; + int32 base, lookup_start; + int32 script_off, feature_off; + struct feature *features; + struct lookup *lookups; + + base = gpos?info->gpos_start:info->gsub_start; + fseek(ttf,base,SEEK_SET); + /* version = */ getlong(ttf); + script_off = getushort(ttf); + feature_off = getushort(ttf); + lookup_start = base+getushort(ttf); + fseek(ttf,lookup_start,SEEK_SET); + lu_cnt = getushort(ttf); + + features = readttffeatures(ttf,base+feature_off,gpos,info); + if ( features==NULL ) /* None of the data we care about */ +return; + features = tagTtfFeaturesWithScript(ttf,base+script_off,features); + lookups = compactttflookups( features,info->feats[gpos],lu_cnt ); + if ( lookups==NULL ) +return; + FigureScriptIndeces(info,lookups); + + fseek(ttf,lookup_start,SEEK_SET); + + info->lookup_cnt = lu_cnt = getushort(ttf); + for ( i=0; igdef_start,SEEK_SET); + if ( getlong(ttf)!=0x00010000 ) +return; + gclass = getushort(ttf); + /* attach list = */ getushort(ttf); + lclo = getushort(ttf); /* ligature caret list */ + /* mark attach class = */ getushort(ttf); + + if ( gclass!=0 ) { + uint16 *gclasses = getClassDefTable(ttf,info->gdef_start+gclass,info->glyph_cnt); + for ( i=0; iglyph_cnt; ++i ) + if ( info->chars[i]!=NULL && gclasses[i]!=0 ) + info->chars[i]->glyph_class = gclasses[i]+1; + free(gclasses); + } + + if ( lclo==0 ) +return; + + lclo += info->gdef_start; + fseek(ttf,lclo,SEEK_SET); + coverage = getushort(ttf); + cnt = getushort(ttf); + if ( cnt==0 ) +return; + lc_offsets = galloc(cnt*sizeof(uint16)); + for ( i=0; iglyph_cnt ) { + fseek(ttf,lclo+lc_offsets[i],SEEK_SET); + sc = info->chars[glyphs[i]]; + for ( pst=sc->possub; pst!=NULL && pst->type!=pst_lcaret; pst=pst->next ); + if ( pst==NULL ) { + pst = chunkalloc(sizeof(PST)); + pst->next = sc->possub; + sc->possub = pst; + pst->type = pst_lcaret; + } + caret_base = ftell(ttf); + pst->u.lcaret.cnt = getushort(ttf); + if ( pst->u.lcaret.carets!=NULL ) free(pst->u.lcaret.carets); + offsets = galloc(pst->u.lcaret.cnt*sizeof(uint16)); + for ( j=0; ju.lcaret.cnt; ++j ) + offsets[j] = getushort(ttf); + pst->u.lcaret.carets = galloc(pst->u.lcaret.cnt*sizeof(int16)); + for ( j=0; ju.lcaret.cnt; ++j ) { + fseek(ttf,caret_base+offsets[j],SEEK_SET); + format=getushort(ttf); + if ( format==1 ) { + pst->u.lcaret.carets[j] = getushort(ttf); + } else if ( format==2 ) { + pst->u.lcaret.carets[j] = 0; + /* point = */ getushort(ttf); + } else if ( format==3 ) { + pst->u.lcaret.carets[j] = getushort(ttf); + /* in device table = */ getushort(ttf); + } else { + fprintf( stderr, "!!!! Unknown caret format %d !!!!\n", format ); + } + } + free(offsets); + } + free(lc_offsets); + free(glyphs); +} + +static void readttf_applelookup(FILE *ttf,struct ttfinfo *info, + void (*apply_values)(struct ttfinfo *info, int gfirst, int glast,FILE *ttf), + void (*apply_value)(struct ttfinfo *info, int gfirst, int glast,FILE *ttf), + void (*apply_default)(struct ttfinfo *info, int gfirst, int glast,void *def), + void *def) { + int format, i, first, last, data_off, cnt, prev; + uint32 here; + uint32 base = ftell(ttf); + + format = getushort(ttf); + switch ( format ) { + case 0: /* Simple array */ + apply_values(info,0,info->glyph_cnt-1,ttf); + break; + case 2: /* Segment Single */ + /* Entry size */ getushort(ttf); + cnt = getushort(ttf); + /* search range */ getushort(ttf); + /* log2(cnt) */ getushort(ttf); + /* range shift */ getushort(ttf); + prev = 0; + for ( i=0; i=info->glyph_cnt ) { + fprintf( stderr, "Bad lookup table format=2 (%d/%d), first=%d last=%d total glyphs in font=%d\n", + i,cnt,first,last,info->glyph_cnt ); + } else { + if ( apply_default!=NULL ) + apply_default(info,prev,first-1,def); + apply_value(info,first,last,ttf); + prev = last+1; + } + } + break; + case 4: /* Segment multiple */ + /* Entry size */ getushort(ttf); + cnt = getushort(ttf); + /* search range */ getushort(ttf); + /* log2(cnt) */ getushort(ttf); + /* range shift */ getushort(ttf); + prev = 0; + for ( i=0; i=info->glyph_cnt ) { + fprintf( stderr, "Bad lookup table format=4 (%d/%d), first=%d last=%d total glyphs in font=%d\n", + i,cnt,first,last,info->glyph_cnt ); + } else { + here = ftell(ttf); + if ( apply_default!=NULL ) + apply_default(info,prev,first-1,def); + fseek(ttf,base+data_off,SEEK_SET); + apply_values(info,first,last,ttf); + fseek(ttf,here,SEEK_SET); + prev = last+1; + } + } + break; + case 6: /* Single table */ + /* Entry size */ getushort(ttf); + cnt = getushort(ttf); + /* search range */ getushort(ttf); + /* log2(cnt) */ getushort(ttf); + /* range shift */ getushort(ttf); + prev = 0; + for ( i=0; i=info->glyph_cnt ) { + fprintf( stderr, "Bad lookup table format=6, first=%d total glyphs in font=%d\n", + first,info->glyph_cnt ); + } else { + if ( apply_default!=NULL ) + apply_default(info,prev,first-1,def); + apply_value(info,first,first,ttf); + prev = first+1; + } + } + break; + case 8: /* Simple array */ + first = getushort(ttf); + cnt = getushort(ttf); + if ( first+cnt>=info->glyph_cnt ) { + fprintf( stderr, "Bad lookup table format=8, first=%d cnt=%d total glyphs in font=%d\n", + first,cnt,info->glyph_cnt ); + } else { + if ( apply_default!=NULL ) { + apply_default(info,0,first-1,def); + apply_default(info,first+cnt,info->glyph_cnt-1,def); + } + apply_values(info,first,first+cnt-1,ttf); + } + break; + default: + fprintf( stderr, "Invalid lookup table format. %d\n", format ); + break; + } +} + +static void TTF_SetProp(struct ttfinfo *info,int gnum, int prop) { + int offset; + PST *pst; + + if ( gnum<0 || gnum>=info->glyph_cnt ) { + fprintf( stderr, "Glyph out of bounds in 'prop' table %d\n", gnum ); +return; + } + + if ( prop&0x1000 ) { /* Mirror */ + offset = (prop<<20)>>28; + if ( gnum+offset>=0 && gnum+offsetglyph_cnt && + info->chars[gnum+offset]->name!=NULL ) { + pst = chunkalloc(sizeof(PST)); + pst->type = pst_substitution; + pst->tag = CHR('r','t','l','a'); + pst->script_lang_index = SLIFromInfo(info,info->chars[gnum],DEFAULT_LANG); + pst->next = info->chars[gnum]->possub; + info->chars[gnum]->possub = pst; + pst->u.subs.variant = copy(info->chars[gnum+offset]->name); + } + } +} + +static void prop_apply_values(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + int i; + + for ( i=gfirst; i<=glast; ++i ) + TTF_SetProp(info,i, getushort(ttf)); +} + +static void prop_apply_value(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + int i; + int prop; + + prop = getushort(ttf); + for ( i=gfirst; i<=glast; ++i ) + TTF_SetProp(info,i, prop); +} + +static void prop_apply_default(struct ttfinfo *info, int gfirst, int glast,void *def) { + int def_prop, i; + + def_prop = (int) def; + for ( i=gfirst; i<=glast; ++i ) + TTF_SetProp(info,i, def_prop); +} + +void readttfprop(FILE *ttf,struct ttfinfo *info) { + int def; + + fseek(ttf,info->prop_start,SEEK_SET); + /* The one example that I've got has a wierd version, so I don't check it */ + /* the three versions that I know about are all pretty much the same, just a few extra flags */ + /* version = */ getlong(ttf); + /* format = */ getushort(ttf); + def = getushort(ttf); + readttf_applelookup(ttf,info, + prop_apply_values,prop_apply_value, + prop_apply_default,(void *) def); +} + +static void TTF_SetLcaret(struct ttfinfo *info, int gnum, int offset, FILE *ttf) { + uint32 here = ftell(ttf); + PST *pst; + SplineChar *sc; + int cnt, i; + + if ( gnum<0 || gnum>=info->glyph_cnt ) { + fprintf( stderr, "Glyph out of bounds in 'lcar' table %d\n", gnum ); +return; + } else if ( (sc=info->chars[gnum])==NULL ) +return; + + fseek(ttf,info->lcar_start+offset,SEEK_SET); + cnt = getushort(ttf); + pst = chunkalloc(sizeof(PST)); + pst->type = pst_lcaret; + pst->tag = CHR(' ',' ',' ',' '); + pst->next = sc->possub; + sc->possub = pst; + pst->u.lcaret.cnt = cnt; + pst->u.lcaret.carets = galloc(cnt*sizeof(uint16)); + for ( i=0; iu.lcaret.carets[i] = getushort(ttf); + fseek(ttf,here,SEEK_SET); +} + +static void lcar_apply_values(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + int i; + + for ( i=gfirst; i<=glast; ++i ) + TTF_SetLcaret(info,i, getushort(ttf), ttf); +} + +static void lcar_apply_value(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + int i; + int offset; + + offset = getushort(ttf); + for ( i=gfirst; i<=glast; ++i ) + TTF_SetLcaret(info,i, offset, ttf); +} + +void readttflcar(FILE *ttf,struct ttfinfo *info) { + + fseek(ttf,info->lcar_start,SEEK_SET); + /* version = */ getlong(ttf); + if ( getushort(ttf)!=0 ) /* A format type of 1 has the caret locations */ +return; /* indicated by points */ + readttf_applelookup(ttf,info, + lcar_apply_values,lcar_apply_value,NULL,NULL); +} + +static void TTF_SetOpticalBounds(struct ttfinfo *info, int gnum, int left, int right) { + PST *pst; + SplineChar *sc; + + if ( left==0 && right==0 ) +return; + + if ( gnum<0 || gnum>=info->glyph_cnt ) { + fprintf( stderr, "Glyph out of bounds in 'opbd' table %d\n", gnum ); +return; + } else if ( (sc=info->chars[gnum])==NULL ) +return; + + if ( left!=0 ) { + pst = chunkalloc(sizeof(PST)); + pst->type = pst_position; + pst->tag = CHR('l','f','b','d'); + pst->script_lang_index = SLIFromInfo(info,sc,DEFAULT_LANG); + pst->next = sc->possub; + sc->possub = pst; + pst->u.pos.xoff = left; + pst->u.pos.h_adv_off = left; + } + if ( right!=0 ) { + pst = chunkalloc(sizeof(PST)); + pst->type = pst_position; + pst->tag = CHR('r','t','b','d'); + pst->script_lang_index = SLIFromInfo(info,sc,DEFAULT_LANG); + pst->next = sc->possub; + sc->possub = pst; + pst->u.pos.h_adv_off = -right; + } +} + +static void opbd_apply_values(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + int i, left, right, offset; + uint32 here; + + for ( i=gfirst; i<=glast; ++i ) { + offset = getushort(ttf); + here = ftell(ttf); + fseek(ttf,info->opbd_start+offset,SEEK_SET); + left = (int16) getushort(ttf); + /* top = (int16) */ getushort(ttf); + right = (int16) getushort(ttf); + /* bottom = (int16) */ getushort(ttf); + fseek(ttf,here,SEEK_SET); + TTF_SetOpticalBounds(info,i, left, right); + } +} + +static void opbd_apply_value(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + int i, left, right, offset; + uint32 here; + + offset = getushort(ttf); + here = ftell(ttf); + fseek(ttf,info->opbd_start+offset,SEEK_SET); + left = (int16) getushort(ttf); + /* top = (int16) */ getushort(ttf); + right = (int16) getushort(ttf); + /* bottom = (int16) */ getushort(ttf); + fseek(ttf,here,SEEK_SET); + + for ( i=gfirst; i<=glast; ++i ) + TTF_SetOpticalBounds(info,i, left, right); +} + +void readttfopbd(FILE *ttf,struct ttfinfo *info) { + + fseek(ttf,info->opbd_start,SEEK_SET); + /* version = */ getlong(ttf); + if ( getushort(ttf)!=0 ) /* A format type of 1 has the bounds */ +return; /* indicated by points */ + readttf_applelookup(ttf,info, + opbd_apply_values,opbd_apply_value,NULL,NULL); +} + +static void TTF_SetMortSubs(struct ttfinfo *info, int gnum, int gsubs) { + PST *pst; + SplineChar *sc, *ssc; + + if ( gsubs==0 ) +return; + + if ( gnum<0 || gnum>=info->glyph_cnt ) { + fprintf( stderr, "Glyph out of bounds in 'mort'/'morx' table %d\n", gnum ); +return; + } else if ( gsubs<0 || (gsubs>=info->glyph_cnt && gsubs!=0xffff)) { + fprintf( stderr, "Substitute glyph out of bounds in 'mort'/'morx' table %d\n", gsubs ); +return; + } else if ( (sc=info->chars[gnum])==NULL || + (gsubs!=0xffff && (ssc=info->chars[gsubs])==NULL) ) +return; + + pst = chunkalloc(sizeof(PST)); + pst->type = pst_substitution; + pst->tag = info->mort_subs_tag; + pst->macfeature = info->mort_tag_mac; + pst->flags = info->mort_r2l ? pst_r2l : 0; + pst->script_lang_index = info->mort_is_nested ? SLI_NESTED : + SLIFromInfo(info,sc,DEFAULT_LANG); + pst->next = sc->possub; + sc->possub = pst; + pst->u.subs.variant = gsubs!=0xffff ? copy(ssc->name) : copy(MAC_DELETED_GLYPH_NAME); +} + +static void mort_apply_values(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + uint16 gnum; + int i; + + for ( i=gfirst; i<=glast; ++i ) { + gnum = getushort(ttf); + TTF_SetMortSubs(info,i, gnum); + } +} + +static void mort_apply_value(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + uint16 gnum; + int i; + + gnum = getushort(ttf); + + for ( i=gfirst; i<=glast; ++i ) + TTF_SetMortSubs(info,i, gnum ); +} + +static void mortclass_apply_values(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + int i; + + for ( i=gfirst; i<=glast; ++i ) + info->morx_classes[i] = getushort(ttf); +} + +static void mortclass_apply_value(struct ttfinfo *info, int gfirst, int glast,FILE *ttf) { + uint16 class; + int i; + + class = getushort(ttf); + + for ( i=gfirst; i<=glast; ++i ) + info->morx_classes[i] = class; +} + +int32 memlong(uint8 *data,int offset) { + int ch1 = data[offset], ch2 = data[offset+1], ch3 = data[offset+2], ch4 = data[offset+3]; +return( (ch1<<24)|(ch2<<16)|(ch3<<8)|ch4 ); +} + +int memushort(uint8 *data,int offset) { + int ch1 = data[offset], ch2 = data[offset+1]; + if ( offset<0 ) + fprintf( stderr, "Internal error\n" ); +return( (ch1<<8)|ch2 ); +} + +void memputshort(uint8 *data,int offset,uint16 val) { + data[offset] = (val>>8); + data[offset+1] = val&0xff; +} + +#define MAX_LIG_COMP 16 +struct statemachine { + uint8 *data; + int length; + uint32 nClasses; + uint32 classOffset, stateOffset, entryOffset, ligActOff, compOff, ligOff; + uint16 *classes; + uint16 lig_comp_classes[MAX_LIG_COMP]; + uint16 lig_comp_glyphs[MAX_LIG_COMP]; + int lcp; + uint8 *states_in_use; + int smax; + struct ttfinfo *info; + int cnt; +}; + +static void mort_figure_ligatures(struct statemachine *sm, int lcp, int off, int32 lig_offset) { + uint32 lig; + int i, j, lig_glyph; + PST *pst; + int len; + + if ( lcp<0 || off+3>sm->length ) +return; + + lig = memlong(sm->data,off); + off += sizeof(long); + + for ( i=0; iinfo->glyph_cnt; ++i ) if ( sm->classes[i]==sm->lig_comp_classes[lcp] ) { + sm->lig_comp_glyphs[lcp] = i; + lig_offset += memushort(sm->data,2*( ((((int32) lig)<<2)>>2) + i ) ); + if ( lig&0xc0000000 ) { + if ( lig_offset+1 > sm->length ) { + fprintf( stderr, "Invalid ligature offset\n" ); + break; + } + lig_glyph = memushort(sm->data,lig_offset); + if ( lig_glyph>=sm->info->glyph_cnt ) { + fprintf(stderr, "Attempt to make a ligature for glyph %d out of ", + lig_glyph ); + for ( j=lcp; jlcp; ++j ) + fprintf(stderr,"%d ",sm->lig_comp_glyphs[j]); + fprintf(stderr,"\n"); + } else { + char *comp; + for ( len=0, j=lcp; jlcp; ++j ) + len += strlen(sm->info->chars[sm->lig_comp_glyphs[j]]->name)+1; + comp = galloc(len); + *comp = '\0'; + for ( j=lcp; jlcp; ++j ) { + strcat(comp,sm->info->chars[sm->lig_comp_glyphs[j]]->name); + if ( j!=sm->lcp-1 ) + strcat(comp," "); + } + for ( pst=sm->info->chars[lig_glyph]->possub; pst!=NULL; pst=pst->next ) + if ( pst->type==pst_ligature && pst->tag==sm->info->mort_subs_tag && + strcmp(comp,pst->u.lig.components)==0 ) + break; + /* There are cases where there will be multiple entries for */ + /* the same lig. ie. if we have "ff" and "ffl" then there */ + /* will be multiple entries for "ff" */ + if ( pst == NULL ) { + pst = chunkalloc(sizeof(PST)); + pst->type = pst_ligature; + pst->tag = sm->info->mort_subs_tag; + pst->macfeature = sm->info->mort_tag_mac; + pst->flags = sm->info->mort_r2l ? (pst_r2l|pst_ignorecombiningmarks) : pst_ignorecombiningmarks; + pst->script_lang_index = SLIFromInfo(sm->info,sm->info->chars[lig_glyph],DEFAULT_LANG); + pst->u.lig.components = comp; + pst->u.lig.lig = sm->info->chars[lig_glyph]; + pst->next = sm->info->chars[lig_glyph]->possub; + sm->info->chars[lig_glyph]->possub = pst; + } else + free(comp); + } + } else + mort_figure_ligatures(sm,lcp-1,off,lig_offset); + lig_offset -= memushort(sm->data,2*( ((((int32) lig)<<2)>>2) + i ) ); + } +} + +static void follow_mort_state(struct statemachine *sm,int offset,int class) { + int state = (offset-sm->stateOffset)/sm->nClasses; + int class_top, class_bottom; + + if ( state<0 || state>=sm->smax || sm->states_in_use[state] || sm->lcp>=MAX_LIG_COMP ) +return; + ++ sm->cnt; + if ( sm->cnt>=10000 ) { + if ( sm->cnt==10000 ) + fprintf(stderr,"In an attempt to process the ligatures of this font, I've concluded\nthat the state machine in Apple's mort/morx table is\n(like the learned constable) too cunning to be understood.\nI shall give up on it. Your ligatures may be incomplete.\n" ); +return; + } + sm->states_in_use[state] = true; + + if ( class==-1 ) { class_bottom = 0; class_top = sm->nClasses; } + else { class_bottom = class; class_top = class+1; } + for ( class=class_bottom; classdata[offset+class]; + int newState = memushort(sm->data,sm->entryOffset+4*ent); + int flags = memushort(sm->data,sm->entryOffset+4*ent+2); + /* If we have the same entry as state 0, then presumably we are */ + /* ignoring the components read so far and starting over with a new */ + /* lig (similarly for state 1) */ + if (( state!=0 && sm->data[sm->stateOffset+class] == ent ) || + (state>1 && sm->data[sm->stateOffset+sm->nClasses+class]==ent )) + continue; + if ( flags&0x8000 ) /* Set component */ + sm->lig_comp_classes[sm->lcp++] = class; + if ( flags&0x3fff ) { + mort_figure_ligatures(sm, sm->lcp-1, flags & 0x3fff, 0); + } else if ( flags&0x8000 ) + follow_mort_state(sm,newState,(flags&0x4000)?class:-1); + if ( flags&0x8000 ) + --sm->lcp; + } + sm->states_in_use[state] = false; +} + +static void morx_figure_ligatures(struct statemachine *sm, int lcp, int ligindex, int32 lig_offset) { + uint32 lig; + int i, j, lig_glyph; + PST *pst; + int len; + + if ( lcp<0 || sm->ligActOff+4*ligindex+3>sm->length ) +return; + + lig = memlong(sm->data,sm->ligActOff+4*ligindex); + ++ligindex; + + for ( i=0; iinfo->glyph_cnt; ++i ) if ( sm->classes[i]==sm->lig_comp_classes[lcp] ) { + sm->lig_comp_glyphs[lcp] = i; + lig_offset += memushort(sm->data,sm->compOff + 2*( ((((int32) lig)<<2)>>2) + i ) ); + if ( lig&0xc0000000 ) { + if ( sm->ligOff+2*lig_offset+1 > sm->length ) { + fprintf( stderr, "Invalid ligature offset\n" ); + break; + } + lig_glyph = memushort(sm->data,sm->ligOff+2*lig_offset); + if ( lig_glyph>=sm->info->glyph_cnt ) { + fprintf(stderr, "Attempt to make a ligature for glyph %d out of ", + lig_glyph ); + for ( j=lcp; jlcp; ++j ) + fprintf(stderr,"%d ",sm->lig_comp_glyphs[j]); + fprintf(stderr,"\n"); + } else { + char *comp; + for ( len=0, j=lcp; jlcp; ++j ) + len += strlen(sm->info->chars[sm->lig_comp_glyphs[j]]->name)+1; + comp = galloc(len); + *comp = '\0'; + for ( j=lcp; jlcp; ++j ) { + strcat(comp,sm->info->chars[sm->lig_comp_glyphs[j]]->name); + if ( j!=sm->lcp-1 ) + strcat(comp," "); + } + for ( pst=sm->info->chars[lig_glyph]->possub; pst!=NULL; pst=pst->next ) + if ( pst->type==pst_ligature && pst->tag==sm->info->mort_subs_tag && + strcmp(comp,pst->u.lig.components)==0 ) + break; + /* There are cases where there will be multiple entries for */ + /* the same lig. ie. if we have "ff" and "ffl" then there */ + /* will be multiple entries for "ff" */ + if ( pst == NULL ) { + pst = chunkalloc(sizeof(PST)); + pst->type = pst_ligature; + pst->flags = sm->info->mort_r2l ? (pst_r2l|pst_ignorecombiningmarks) : pst_ignorecombiningmarks; + pst->tag = sm->info->mort_subs_tag; + pst->macfeature = sm->info->mort_tag_mac; + pst->script_lang_index = SLIFromInfo(sm->info,sm->info->chars[lig_glyph],DEFAULT_LANG); + pst->u.lig.components = comp; + pst->u.lig.lig = sm->info->chars[lig_glyph]; + pst->next = sm->info->chars[lig_glyph]->possub; + sm->info->chars[lig_glyph]->possub = pst; + } + } + } else + morx_figure_ligatures(sm,lcp-1,ligindex,lig_offset); + lig_offset -= memushort(sm->data,sm->compOff + 2*( ((((int32) lig)<<2)>>2) + i ) ); + } +} + +static void follow_morx_state(struct statemachine *sm,int state,int class) { + int class_top, class_bottom; + + if ( state<0 || state>=sm->smax || sm->states_in_use[state] || sm->lcp>=MAX_LIG_COMP ) +return; + ++ sm->cnt; + if ( sm->cnt>=10000 ) { + if ( sm->cnt==10000 ) + fprintf(stderr,"In an attempt to process the ligatures of this font, I've concluded\nthat the state machine in Apple's mort/morx table is\n(like the learned constable) too cunning to be understood.\nI shall give up on it. Your ligatures may be incomplete.\n" ); +return; + } + sm->states_in_use[state] = true; + + if ( class==-1 ) { class_bottom = 0; class_top = sm->nClasses; } + else { class_bottom = class; class_top = class+1; } + for ( class=class_bottom; classdata, sm->stateOffset + 2*(state*sm->nClasses+class) ); + int newState = memushort(sm->data,sm->entryOffset+6*ent); + int flags = memushort(sm->data,sm->entryOffset+6*ent+2); + int ligindex = memushort(sm->data,sm->entryOffset+6*ent+4); + /* If we have the same entry as state 0, then presumably we are */ + /* ignoring the components read so far and starting over with a new */ + /* lig (similarly for state 1) */ + if (( state!=0 && memushort(sm->data, sm->stateOffset + 2*class) == ent ) || + (state>1 && memushort(sm->data, sm->stateOffset + 2*(sm->nClasses+class))==ent )) + continue; + if ( flags&0x8000 ) /* Set component */ + sm->lig_comp_classes[sm->lcp++] = class; + if ( flags&0x2000 ) { + morx_figure_ligatures(sm, sm->lcp-1, ligindex, 0); + } else if ( flags&0x8000 ) + follow_morx_state(sm,newState,(flags&0x4000)?class:-1); + if ( flags&0x8000 ) + --sm->lcp; + } + sm->states_in_use[state] = false; +} + +static void readttf_mortx_lig(FILE *ttf,struct ttfinfo *info,int ismorx,uint32 base,uint32 length) { + uint32 here; + struct statemachine sm; + int first, cnt, i; + + memset(&sm,0,sizeof(sm)); + sm.info = info; + here = ftell(ttf); + length -= here-base; + sm.data = galloc(length); + sm.length = length; + if ( fread(sm.data,1,length,ttf)!=length ) { + free(sm.data); + fprintf( stderr, "Bad mort ligature table. Not long enough\n"); +return; + } + fseek(ttf,here,SEEK_SET); + if ( ismorx ) { + sm.nClasses = memlong(sm.data,0); + sm.classOffset = memlong(sm.data,sizeof(long)); + sm.stateOffset = memlong(sm.data,2*sizeof(long)); + sm.entryOffset = memlong(sm.data,3*sizeof(long)); + sm.ligActOff = memlong(sm.data,4*sizeof(long)); + sm.compOff = memlong(sm.data,5*sizeof(long)); + sm.ligOff = memlong(sm.data,6*sizeof(long)); + fseek(ttf,here+sm.classOffset,SEEK_SET); + sm.classes = info->morx_classes = galloc(info->glyph_cnt*sizeof(uint16)); + for ( i=0; iglyph_cnt; ++i ) + sm.classes[i] = 1; /* Out of bounds */ + readttf_applelookup(ttf,info, + mortclass_apply_values,mortclass_apply_value,NULL,NULL); + sm.smax = length/(2*sm.nClasses); + sm.states_in_use = gcalloc(sm.smax,sizeof(uint8)); + follow_morx_state(&sm,0,-1); + } else { + sm.nClasses = memushort(sm.data,0); + sm.classOffset = memushort(sm.data,sizeof(uint16)); + sm.stateOffset = memushort(sm.data,2*sizeof(uint16)); + sm.entryOffset = memushort(sm.data,3*sizeof(uint16)); + sm.ligActOff = memushort(sm.data,4*sizeof(uint16)); + sm.compOff = memushort(sm.data,5*sizeof(uint16)); + sm.ligOff = memushort(sm.data,6*sizeof(uint16)); + sm.classes = galloc(info->glyph_cnt*sizeof(uint16)); + for ( i=0; iglyph_cnt; ++i ) + sm.classes[i] = 1; /* Out of bounds */ + first = memushort(sm.data,sm.classOffset); + cnt = memushort(sm.data,sm.classOffset+sizeof(uint16)); + for ( i=0; istate_start = here; + + if ( ismorx ) { + nclasses = getlong(ttf); + class_off = getlong(ttf); + state_off = getlong(ttf); + entry_off = getlong(ttf); + st->extra_offsets[0] = getlong(ttf); + st->extra_offsets[1] = getlong(ttf); + st->extra_offsets[2] = getlong(ttf); + } else { + nclasses = getushort(ttf); /* Number of bytes per state in state subtable, equal to number of classes */ + class_off = getushort(ttf); + state_off = getushort(ttf); + entry_off = getushort(ttf); + st->extra_offsets[0] = getushort(ttf); + st->extra_offsets[1] = getushort(ttf); + st->extra_offsets[2] = getushort(ttf); + } + st->nclasses = nclasses; + st->state_offset = state_off; + + /* parse class subtable */ + fseek(ttf,here+class_off,SEEK_SET); + if ( ismorx ) { + st->classes2 = info->morx_classes = galloc(info->glyph_cnt*sizeof(uint16)); + for ( i=0; iglyph_cnt; ++i ) + st->classes2[i] = 1; /* Out of bounds */ + readttf_applelookup(ttf,info, + mortclass_apply_values,mortclass_apply_value,NULL,NULL); + } else { + st->first_glyph = getushort(ttf); + st->nglyphs = getushort(ttf); + st->classes = galloc(st->nglyphs); + fread(st->classes,1,st->nglyphs,ttf); + } + + /* The size of an entry is variable. There are 2 uint16 fields at the begin-*/ + /* ning of all entries. There may be some number of shorts following these*/ + /* used for indexing special tables. */ + ent_size = 4 + 2*ent_extras; + st->entry_size = ent_size; + st->entry_extras = ent_extras; + + /* Apple does not provide a way of figuring out the size of either of the */ + /* state or entry tables, so we must parse both as we go and try to work */ + /* out the maximum values... */ + /* There are always at least 2 states defined. Parse them and find what */ + /* is the biggest entry they use, then parse those entries and find what */ + /* is the biggest state they use, and then repeat until we don't find any*/ + /* more states or entries */ + old_state_max = 0; old_ent_max = 0; + state_max = 2; ent_max = 0; + while ( old_state_max!=state_max ) { + i = old_state_max*nclasses; + fseek(ttf,here+state_off+(ismorx?i*sizeof(uint16):i),SEEK_SET); + old_state_max = state_max; + for ( ; i ent_max ) + ent_max = ent+1; + } + if ( ent_max==old_ent_max ) /* Nothing more */ + break; + if ( ent_max>1000 ) { + fprintf( stderr, "It looks to me as though there's a morx sub-table with more than 1000\n transitions. Which makes me think there's probably an error\n" ); + free(st); +return( NULL ); + } + fseek(ttf,here+entry_off+old_ent_max*ent_size,SEEK_SET); + i = old_ent_max; + old_ent_max = ent_max; + for ( ; istate_max ) + state_max = new_state+1; + } + if ( state_max>1000 ) { + fprintf( stderr, "It looks to me as though there's a morx sub-table with more than 1000\n states. Which makes me think there's probably an error\n" ); + free(st); +return( NULL ); + } + } + + st->nstates = state_max; + st->nentries = ent_max; + + fseek(ttf,here+state_off,SEEK_SET); + /* an array of arrays of state transitions, each represented by one byte */ + /* which is an index into the Entry subtable, which comes next. */ + /* One dimension is the number of states, and the other the */ + /* number of classes (classes vary faster than states) */ + /* The first two states are predefined, 0 is start of text, 1 start of line*/ + if ( ismorx ) { + st->state_table2 = galloc(st->nstates*st->nclasses*sizeof(uint16)); + for ( i=0; instates*st->nclasses; ++i ) + st->state_table2[i] = getushort(ttf); + } else { + st->state_table = galloc(st->nstates*st->nclasses); + fread(st->state_table,1,st->nstates*st->nclasses,ttf); + } + + /* parse the entry subtable */ + fseek(ttf,here+entry_off,SEEK_SET); + st->transitions = galloc(st->nentries*st->entry_size); + fread(st->transitions,1,st->nentries*st->entry_size,ttf); +return( st ); +} + +static void statetablefree(struct statetable *st) { + free( st->classes ); + free( st->state_table ); + free( st->classes2 ); + free( st->state_table2 ); + free( st->transitions ); + free( st ); +} + +static char **ClassesFromStateTable(struct statetable *st,int ismorx,struct ttfinfo *info) { + /* On the mac the first four classes should be left blank. only class 1 */ + /* (out of bounds) is supposed to be used in the class array anyway */ + char **classes = galloc(st->nclasses*sizeof(char *)); + int *lens = gcalloc(st->nclasses,sizeof(int)); + int i; + + if ( ismorx ) { + for ( i=0; iglyph_cnt; ++i ) + lens[st->classes2[i]] += strlen( info->chars[i]->name )+1; + } else { + for ( i=st->first_glyph; ifirst_glyph+st->nglyphs && iglyph_cnt; ++i ) + lens[st->classes[i-st->first_glyph]] += strlen( info->chars[i]->name )+1; + } + classes[0] = classes[1] = classes[2] = classes[3] = NULL; + for ( i=4; inclasses; ++i ) { + classes[i] = galloc(lens[i]+1); + *classes[i] = '\0'; + } + if ( ismorx ) { + for ( i=0; iglyph_cnt; ++i ) if ( st->classes2[i]>=4 ) { + strcat(classes[st->classes2[i]],info->chars[i]->name ); + strcat(classes[st->classes2[i]]," "); + } + } else { + for ( i=st->first_glyph; ifirst_glyph+st->nglyphs && iglyph_cnt; ++i ) if ( st->classes[i-st->first_glyph]>=4 ) { + strcat(classes[st->classes[i-st->first_glyph]],info->chars[i]->name ); + strcat(classes[st->classes[i-st->first_glyph]]," " ); + } + } + for ( i=4; inclasses; ++i ) { + int len = strlen(classes[i]); + if ( len!=0 ) + classes[i][len-1] = '\0'; /* Remove trailing space */ + } + free(lens); +return( classes ); +} + +static char *NamesOfList(uint32 pos,int cnt, FILE *ttf, struct ttfinfo *info) { + int i, len, glyph; + char *str; + + if ( cnt==0 ) +return(NULL); + + fseek(ttf,pos,SEEK_SET); + for ( i=len=0; iglyph_cnt ) + len += strlen(info->chars[glyph]->name)+1; + } + if ( len==0 ) +return( NULL ); + str = galloc(len+1); + fseek(ttf,pos,SEEK_SET); + for ( i=len=0; iglyph_cnt ) { + strcpy(str+len,info->chars[glyph]->name); + len += strlen(info->chars[glyph]->name); + str[len++] = ' '; + } + } + str[len-1] = '\0'; +return( str ); +} + +#if 0 +static void RunStateFindKernDepth_(ASM *as,int state,int kdepth,uint8 *used) { + int j, kd; + + if ( used[state] ) +return; + used[state] = true; + + for ( j=0; jclass_cnt; ++j ) { + kd = kdepth; + flags = as->state[state*as->class_cnt+j]; + if ( flags&0x8000 ) + ++kd; + if ( (flags&0x3fff)!=0 ) { + as->state[state*as->class_cnt+j].u.kern.kcnt = kd; + kd = 0; + } + RunStateFindKernDepth_(as,as->state[state*as->class_cnt+j].next_state,kd,used); + } +} + +static void RunStateFindKernDepth(ASM *as) { + uint8 *used = gcalloc(as->class_cnt); + int i; + + for ( i=0; iclass_cnt*as->state_cnt; ++i ) { + as->state[i].u.kern.kerns = NULL; + as->state[i].u.kern.kcnt = (as->state[i].flags&0x3fff)==0 ? 0 : -1; + } + RunStateFindKernDepth_(as,0,0,used); + RunStateFindKernDepth_(as,1,0,used); +} +#endif + +static void KernReadKernList(FILE *ttf,uint32 pos, struct asm_state *trans) { +/* Apple does not document how to detect the end of the list */ +/* They say "an odd value that depends on coverage" */ +/* They should say "an odd value". Any odd value terminates the list. */ +/* coverage is irrelevant */ +/* Note: List is backwards (glyphs are popped of LIFO so last glyph on */ +/* in stack gets first kern value) */ +/* There are at most 8 glyphs */ + int i,j,k; + int16 buffer[8]; /* At most 8 kerns are supported */ + + fseek(ttf,pos,SEEK_SET); + for ( i=0; i<8; ++i ) { + buffer[i]=(int16) getushort(ttf); + if ( buffer[i]&1 ) { + buffer[i] &= ~1; + ++i; + break; + } + } + if ( i==0 ) { + trans->u.kern.kerns = NULL; + } else { + trans->u.kern.kerns = galloc(i*sizeof(int16)); + for ( j=i-1, k=0; ku.kern.kerns[k] = buffer[j]; + } + trans->u.kern.kcnt = i; +} + +static void read_perglyph_subs(FILE *ttf,struct ttfinfo *info, + int subs_base,int subs_end,struct statetable *st, uint8 *classes_subbed) { + /* The file is positioned at the start of a per-glyph substitution table */ + /* Sadly great chunks of this table have been omitted. We are where glyph */ + /* 0 would be if it were present. We've no idea what has been omitted */ + /* Simple checks: if the file pointer is outside of the area devoted to */ + /* substitutions then we know it is ignorable. */ + /* If the current glyph is not in the list of glyphs which could ever */ + /* be substituted then we know it is ignorable. */ + /* If the putative substitution glyph is not a valid glyph then we know */ + /* it is ignorable */ + int i, subs, was = info->mort_tag_mac; + uint32 here; + + info->mort_tag_mac = false; + for ( i=0; iglyph_cnt; ++i ) { + here = ftell(ttf); + subs = getushort(ttf); + if ( subs>=info->glyph_cnt && subs!=0xffff ) /* 0xffff means delete the substituted glyph */ + continue; + if ( here=subs_end ) + break; + if ( ifirst_glyph || i>=st->first_glyph+st->nglyphs ) { + if ( !classes_subbed[1]) { /* Out of bounds class */ + if ( i>=st->first_glyph+st->nglyphs ) + break; + continue; + } + } else { + if ( !classes_subbed[st->classes[i-st->first_glyph]] ) + continue; + } + + TTF_SetMortSubs(info, i, subs); + } + info->mort_tag_mac = was; +} + +static int sm_lookupfind(int32 *lookups,int *_lm,int off) { + int lm = *_lm, i; + for ( i=0; i<=lm; ++i ) + if ( lookups[i]==off ) +return( i ); + (*_lm)++; + lookups[i] = off; +return( i ); +} + +static uint32 TagFromInfo(struct ttfinfo *info,int i) { + char buf[8]; + uint32 tag; + + sprintf( buf, "M%03d", info->gentags.tt_cur + i ); + if ( info->gentags.tt_cur + i >= info->gentags.tt_max ) { + if ( info->gentags.tt_max==0 ) + info->gentags.tagtype = galloc((info->gentags.tt_max=30)*sizeof(struct tagtype)); + else + info->gentags.tagtype = grealloc(info->gentags.tagtype,(info->gentags.tt_max+=30)*sizeof(struct tagtype)); + } + info->gentags.tagtype[info->gentags.tt_cur+i].type = pst_substitution; + tag = CHR(buf[0], buf[1], buf[2], buf[3] ); + info->gentags.tagtype[info->gentags.tt_cur+i].tag = tag; +return( tag ); +} + +static ASM *readttf_mortx_asm(FILE *ttf,struct ttfinfo *info,int ismorx, + uint32 subtab_len,enum asm_type type,int extras, + uint32 coverage) { + struct statetable *st; + ASM *as; + int i,j; + uint32 here = ftell(ttf); + + st = read_statetable(ttf,extras,ismorx,info); + if ( st==NULL ) +return(NULL); + + as = chunkalloc(sizeof(ASM)); + as->type = type; + as->feature = info->mort_feat; as->setting = info->mort_setting; + as->flags = coverage>>16; + as->class_cnt = st->nclasses; + as->state_cnt = st->nstates; + as->classes = ClassesFromStateTable(st,ismorx,info); + as->state = galloc(st->nclasses*st->nstates*sizeof(struct asm_state)); + for ( i=0; inclasses*st->nstates; ++i ) { + int trans; + if ( ismorx ) { + trans = st->state_table2[i]; + as->state[i].next_state = memushort(st->transitions,trans*st->entry_size); + } else { + trans = st->state_table[i]; + as->state[i].next_state = (memushort(st->transitions,trans*st->entry_size)-st->state_offset)/st->nclasses; + } + as->state[i].flags = memushort(st->transitions,trans*st->entry_size+2); + if ( extras>0 ) + as->state[i].u.context.mark_tag = memushort(st->transitions,trans*st->entry_size+2+2); + if ( extras>1 ) + as->state[i].u.context.cur_tag = memushort(st->transitions,trans*st->entry_size+2+2+2); + } + /* Indic tables have no attached subtables, just a verb in the flag field */ + /* so for them we are done. For the others... */ + if ( !ismorx && type==asm_insert ) { + for ( i=0; inclasses*st->nstates; ++i ) { + char *cur=NULL, *mark=NULL; + if ( (as->state[i].flags&0x3e0)!=0 && as->state[i].u.context.mark_tag!=0 ) { + cur = NamesOfList(here+as->state[i].u.context.mark_tag, + (as->state[i].flags&0x3e0)>>5,ttf,info); + } + if ( (as->state[i].flags&0x01f)!=0 && as->state[i].u.context.cur_tag!=0 ) { + mark = NamesOfList(here+as->state[i].u.context.cur_tag, + as->state[i].flags&0x01f,ttf,info); + } + as->state[i].u.insert.cur_ins=cur; + as->state[i].u.insert.mark_ins=mark; + } + } else if ( ismorx && type == asm_insert ) { + for ( i=0; inclasses*st->nstates; ++i ) { + char *cur=NULL, *mark=NULL; + if ( (as->state[i].flags&0x3e0)!=0 && as->state[i].u.context.mark_tag!=0xffff ) { + cur = NamesOfList(here+st->extra_offsets[0]+as->state[i].u.context.mark_tag*2, + (as->state[i].flags&0x3e0)>>5,ttf,info); + } + if ( (as->state[i].flags&0x01f)!=0 && as->state[i].u.context.cur_tag!=0xffff ) { + mark = NamesOfList(here+st->extra_offsets[0]+as->state[i].u.context.cur_tag*2, + as->state[i].flags&0x01f,ttf,info); + } + as->state[i].u.insert.cur_ins=cur; + as->state[i].u.insert.mark_ins=mark; + } + } else if ( !ismorx && type == asm_context ) { + /* I don't see any good way to parse a per-glyph substitution table */ + /* the problem being that most of the per-glyph table is missing */ + /* but I don't know which bits. The offsets I'm given point to */ + /* where glyph 0 would be if it were present in the table, but */ + /* mostly only the bit used is present... */ + /* I could walk though the state machine and find all classes that */ + /* go to a specific substitution (which would tell me what glyphs */ + /* were active). That's not hard for substitutions of the current */ + /* glyph, but it is intractibable for marked glyphs. And I can't */ + /* do one without the other. So I do neither. */ + /* One thing I could test fairly easily would be to see whether */ + /* class 1 (out of bounds) is ever available for a substitution */ + /* (if it ever has a mark set on it or has a current substitution)*/ + /* if not, then I can ignore any putative substitutions for class */ + /* 1 glyphs (actually I should do this for all classes)*/ + /* Apple's docs say the substitutions are offset from the "state */ + /* subtable", but it seems much more likely that they are offset */ + /* from the substitution table (given that Apple's docs are often */ + /* wrong */ /* Apple's docs are right. not clear why that offset */ + /* is there */ + uint8 *classes_subbed = gcalloc(st->nclasses,1); + int lookup_max = -1, index; + int32 *lookups = galloc(st->nclasses*st->nstates*sizeof(int32)); + + for ( i=0; instates; ++i ) for ( j=0; jnclasses; ++j ) { + if ( (as->state[i*st->nclasses+j].flags&0x8000) || /* Set Mark */ + as->state[i*st->nclasses+j].u.context.cur_tag!= 0 ) + classes_subbed[j] = true; + } + for ( i=0; inclasses*st->nstates; ++i ) { + if ( as->state[i].u.context.mark_tag!=0 ) { + index = sm_lookupfind(lookups,&lookup_max,(int16) as->state[i].u.context.mark_tag); + as->state[i].u.context.mark_tag = TagFromInfo(info,index); + } + if ( as->state[i].u.context.cur_tag!=0 ) { + index = sm_lookupfind(lookups,&lookup_max,(int16) as->state[i].u.context.cur_tag); + as->state[i].u.context.cur_tag = TagFromInfo(info,index); + } + } + for ( i=0; i<=lookup_max; ++i ) { + info->mort_subs_tag = TagFromInfo(info,i); + info->mort_is_nested = true; + fseek(ttf,here/*+st->extra_offsets[0]*/+lookups[i]*2,SEEK_SET); + read_perglyph_subs(ttf,info,here+st->extra_offsets[0],here+subtab_len, + st,classes_subbed); + } + info->mort_is_nested = false; + free(classes_subbed); + free(lookups); + info->gentags.tt_cur += lookup_max+1; + } else if ( ismorx && type == asm_context ) { + int lookup_max= -1; + uint32 *lookups; + for ( i=0; inclasses*st->nstates; ++i ) { + if ( as->state[i].u.context.mark_tag!=0xffff ) { + if ( ((int) as->state[i].u.context.mark_tag)>lookup_max ) + lookup_max = as->state[i].u.context.mark_tag; + as->state[i].u.context.mark_tag = TagFromInfo(info,as->state[i].u.context.mark_tag); + } else + as->state[i].u.context.mark_tag=0; + if ( as->state[i].u.context.cur_tag!=0xffff ) { + if ( ((int) as->state[i].u.context.cur_tag)>lookup_max ) + lookup_max = as->state[i].u.context.cur_tag; + as->state[i].u.context.cur_tag = TagFromInfo(info,as->state[i].u.context.cur_tag); + } else + as->state[i].u.context.cur_tag = 0; + } + ++lookup_max; + lookups = galloc(lookup_max*sizeof(uint32)); + fseek(ttf,here+st->extra_offsets[0],SEEK_SET); + for ( i=0; iextra_offsets[0]; + for ( i=0; imort_subs_tag = TagFromInfo(info,i); + info->mort_is_nested = true; + readttf_applelookup(ttf,info, + mort_apply_values,mort_apply_value,NULL,NULL); + } + info->mort_is_nested = false; + free(lookups); + info->gentags.tt_cur += lookup_max; + } else if ( type == asm_kern ) { + for ( i=0; inclasses*st->nstates; ++i ) { + if ( (as->state[i].flags&0x3fff)!=0 ) { + KernReadKernList(ttf,here+(as->state[i].flags&0x3fff), + &as->state[i]); + as->state[i].flags &= ~0x3fff; + } else { + as->state[i].u.kern.kcnt = 0; + as->state[i].u.kern.kerns = NULL; + } + } + } + as->next = info->sm; + info->sm = as; + statetablefree(st); +return( as ); +} + +static void FeatMarkAsEnabled(struct ttfinfo *info,int featureType, + int featureSetting); + +static uint32 readmortchain(FILE *ttf,struct ttfinfo *info, uint32 base, int ismorx) { + uint32 chain_len, nfeatures, nsubtables, default_flags; + uint32 enable_flags, disable_flags, flags; + int featureType, featureSetting; + int i,j,k,l; + uint32 length, coverage; + uint32 here; + uint32 tag; + struct tagmaskfeature { uint32 tag, enable_flags; uint16 ismac, feat, set; } tmf[32]; + int r2l; + + default_flags = getlong(ttf); + chain_len = getlong(ttf); + if ( ismorx ) { + nfeatures = getlong(ttf); + nsubtables = getlong(ttf); + } else { + nfeatures = getushort(ttf); + nsubtables = getushort(ttf); + } + + k = 0; + for ( i=0; i=0 && (!(flags&tmf[j].enable_flags) || (tmf[j].enable_flags&~flags)!=0); --j ); + if ( j==-1 ) + for ( j=k-1; j>=0 && (!(flags&tmf[j].enable_flags) || tmf[j].feat==0); --j ); + if ( j>=0 ) { + if ( !tmf[j].ismac && + ((coverage&0xff)==0 || + (coverage&0xff)==1 || + (coverage&0xff)==5 )) { + /* Only do the opentype tag conversion if we've got a format */ + /* we can convert to opentype. Otherwise it is useless and */ + /* confusing */ + tmf[j].ismac = true; + tmf[j].tag = (tmf[j].feat<<16) | tmf[j].set; + } + info->mort_subs_tag = tmf[j].tag; + info->mort_r2l = r2l; + info->mort_tag_mac = tmf[j].ismac; + info->mort_feat = tmf[j].feat; info->mort_setting = tmf[j].set; + for ( l=0; info->feats[0][l]!=0; ++l ) + if ( info->feats[0][l]==tmf[j].tag ) + break; + if ( info->feats[0][l]==0 && lmort_max ) { + info->feats[0][l] = tmf[j].tag; + info->feats[0][l+1] = 0; + } + switch( coverage&0xff ) { + case 0: /* Indic rearangement */ + readttf_mortx_asm(ttf,info,ismorx,length,asm_indic,0, + coverage); + break; + case 1: /* contextual glyph substitution */ + readttf_mortx_asm(ttf,info,ismorx,length,asm_context,2, + coverage); + break; + case 2: /* ligature substitution */ + /* Apple's ligature state machines are too weird to be */ + /* represented easily, but I can parse them into a set */ + /* of ligatures -- assuming they are unconditional */ + readttf_mortx_lig(ttf,info,ismorx,here,length); + break; + case 4: /* non-contextual glyph substitutions */ + readttf_applelookup(ttf,info, + mort_apply_values,mort_apply_value,NULL,NULL); + break; + case 5: /* contextual glyph insertion */ + readttf_mortx_asm(ttf,info,ismorx,length,asm_insert,2, + coverage); + break; + } + } + fseek(ttf, here+length, SEEK_SET ); + } + +return( chain_len ); +} + +void readttfmort(FILE *ttf,struct ttfinfo *info) { + uint32 base = info->morx_start!=0 ? info->morx_start : info->mort_start; + uint32 here, len; + int ismorx; + int32 version; + int i, nchains; + + fseek(ttf,base,SEEK_SET); + version = getlong(ttf); + ismorx = version == 0x00020000; + if ( version!=0x00010000 && version != 0x00020000 ) +return; + nchains = getlong(ttf); + info->mort_max = nchains*33; /* Maximum of one feature per bit ? */ + info->feats[0] = galloc((info->mort_max+1)*sizeof(uint32)); + info->feats[0][0] = 0; + for ( i=0; ikern_start,SEEK_SET); + version = getushort(ttf); + tabcnt = getushort(ttf); + if ( version!=0 ) { + fseek(ttf,info->kern_start,SEEK_SET); + version = getlong(ttf); + tabcnt = getlong(ttf); + } + for ( i=0; i>8; + flags_good = ((coverage&7)<=1); + isv = !(coverage&1); + header_size = 6; + } else { + len = getlong(ttf); + coverage = getushort(ttf); + /* Apple has reordered the bits */ + format = (coverage&0xff); + flags_good = ((coverage&0xff00)==0 || (coverage&0xff00)==0x8000); + isv = coverage&0x8000? 1 : 0; + /* tupleIndex = */ getushort(ttf); + header_size = 8; + } + if ( flags_good && format==0 ) { + /* format 0, horizontal kerning data (as pairs) not perpendicular */ + npairs = getushort(ttf); + /* searchRange = */ getushort(ttf); + /* entrySelector = */ getushort(ttf); + /* rangeShift = */ getushort(ttf); + for ( j=0; jglyph_cnt && rightglyph_cnt ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = info->chars[right]; + kp->off = offset; + kp->sli = SLIFromInfo(info,info->chars[left],DEFAULT_LANG); + if ( isv ) { + kp->next = info->chars[left]->vkerns; + info->chars[left]->vkerns = kp; + } else { + kp->next = info->chars[left]->kerns; + info->chars[left]->kerns = kp; + } + } else + fprintf( stderr, "Bad kern pair glyphs %d & %d must be less than %d\n", + left, right, info->glyph_cnt ); + } + } else if ( flags_good && format==1 ) { + /* format 1 is an apple state machine which can handle weird cases */ + /* OpenType's spec doesn't document this */ + /* Apple's docs are wrong about this table, they claim */ + /* there is a special value which marks the end of the kerning */ + /* lists. In fact there is no such value, the list is as long */ + /* as there are things on the kern stack */ +#if 1 + readttf_mortx_asm(ttf,info,false,len-header_size,asm_kern,0, + isv ? 0x80000000 : 0 /* coverage doesn't really apply */); + fseek(ttf,begin_table+len,SEEK_SET); +#else + fseek(ttf,len-header_size,SEEK_CUR); + fprintf( stderr, "This font has a format 1 kerning table (a state machine).\nPfaEdit doesn't parse these\nCould you send a copy of %s to gww@silcom.com? Thanks.\n", + info->fontname ); +#endif + } else if ( flags_good && (format==2 || format==3 )) { + /* two class based formats */ + if ( isv ) { + if ( info->khead==NULL ) + info->vkhead = kc = chunkalloc(sizeof(KernClass)); + else + kc = info->vklast->next = chunkalloc(sizeof(KernClass)); + info->vklast = kc; + } else { + if ( info->khead==NULL ) + info->khead = kc = chunkalloc(sizeof(KernClass)); + else + kc = info->klast->next = chunkalloc(sizeof(KernClass)); + info->klast = kc; + } + if ( format==2 ) { + rowWidth = getushort(ttf); + left = getushort(ttf); + right = getushort(ttf); + array = getushort(ttf); + kc->second_cnt = rowWidth/sizeof(uint16); + class1 = getAppleClassTable(ttf, begin_table+left, info->glyph_cnt, array, rowWidth ); + class2 = getAppleClassTable(ttf, begin_table+right, info->glyph_cnt, 0, sizeof(uint16) ); + for ( i=0; iglyph_cnt; ++i ) + if ( class1[i]>kc->first_cnt ) + kc->first_cnt = class1[i]; + ++ kc->first_cnt; + kc->offsets = galloc(kc->first_cnt*kc->second_cnt*sizeof(int16)); + fseek(ttf,begin_table+array,SEEK_SET); + for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) + kc->offsets[i] = getushort(ttf); + } else { + /* format 3, horizontal kerning data (as classes limited to 256 entries) */ + /* OpenType's spec doesn't document this */ + int gc, kv, flags; + int16 *kvs; + gc = getushort(ttf); + kv = getc(ttf); + kc->first_cnt = getc(ttf); + kc->second_cnt = getc(ttf); + flags = getc(ttf); + if ( gc>info->glyph_cnt ) + fprintf( stderr, "Kerning subtable 3 says the glyph count is %d, but maxp says %d\n", + gc, info->glyph_cnt ); + class1 = gcalloc(gc>info->glyph_cnt?gc:info->glyph_cnt,sizeof(uint16)); + class2 = gcalloc(gc>info->glyph_cnt?gc:info->glyph_cnt,sizeof(uint16)); + kvs = galloc(kv*sizeof(int16)); + kc->offsets = galloc(kc->first_cnt*kc->second_cnt*sizeof(int16)); + for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) + kc->offsets[i] = kvs[getc(ttf)]; + free(kvs); + } + kc->firsts = ClassToNames(info,kc->first_cnt,class1,info->glyph_cnt); + kc->seconds = ClassToNames(info,kc->second_cnt,class2,info->glyph_cnt); + for ( i=0; iglyph_cnt; ++i ) { + if ( class1[i]!=0 ) { + kc->sli = SLIFromInfo(info,info->chars[i],DEFAULT_LANG); + break; + } + } + free(class1); free(class2); + fseek(ttf,begin_table+len,SEEK_SET); + } else if ( flags_good && format==3 ) { + fseek(ttf,len-header_size,SEEK_CUR); + } else { + fseek(ttf,len-header_size,SEEK_CUR); + } + } +} + +void readmacfeaturemap(FILE *ttf,struct ttfinfo *info) { + MacFeat *last=NULL, *cur; + struct macsetting *slast, *scur; + struct fs { int n; int off; } *fs; + int featcnt, i, j, flags; + + fseek(ttf,info->feat_start,SEEK_SET); + /* version =*/ getfixed(ttf); + featcnt = getushort(ttf); + /* reserved */ getushort(ttf); + /* reserved */ getlong(ttf); + + fs = galloc(featcnt*sizeof(struct fs)); + for ( i=0; ifeatures = cur; + else + last->next = cur; + last = cur; + + cur->feature = getushort(ttf); + fs[i].n = getushort(ttf); + fs[i].off = getlong(ttf); + flags = getushort(ttf); + cur->strid = getushort(ttf); + if ( flags&0x8000 ) cur->ismutex = true; + if ( flags&0x4000 ) + cur->default_setting = flags&0xff; + } + + for ( i=0, cur=info->features; inext ) { + fseek(ttf,info->feat_start+fs[i].off,SEEK_SET); + slast = NULL; + for ( j=0; jsettings = scur; + else + slast->next = scur; + slast = scur; + + scur->setting = getushort(ttf); + scur->strid = getushort(ttf); + } + } + free(fs); +} + +static void FeatMarkAsEnabled(struct ttfinfo *info,int featureType, + int featureSetting) { + MacFeat *f; + struct macsetting *s; + + for ( f = info->features; f!=NULL && f->feature!=featureType; f=f->next ); + if ( f==NULL ) +return; + if ( f->ismutex ) { + for ( s=f->settings ; s!=NULL; s=s->next ) + s->initially_enabled = ( s->setting==featureSetting ); + f->default_setting = featureSetting; + } else { + for ( s=f->settings ; s!=NULL && s->setting!=featureSetting; s=s->next ); + if ( s!=NULL ) + s->initially_enabled = true; + } +return; +} diff --git a/fontforge/parsettfbmf.c b/fontforge/parsettfbmf.c new file mode 100644 index 00000000..7111c7cd --- /dev/null +++ b/fontforge/parsettfbmf.c @@ -0,0 +1,1156 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include "chardata.h" +#include "utype.h" +#include "ustring.h" +#include +#include +#include +#include "ttf.h" + +struct ttfsizehead { + int ppem; + int depth; + int firstglyph, endglyph; + int indexSubTableArrayOffset; + int numIndexSubTables; +}; + +struct bigmetrics { + int height, width; + int hbearingX, hbearingY, hadvance; + int vbearingX, vbearingY, vadvance; /* Small metrics doesn't use this row */ +}; + +struct bdfcharlist { + BDFChar *bc; + struct bdfcharlist *next; +}; + +static void ttfreadbmfglyph(FILE *ttf,struct ttfinfo *info, + int32 offset, int32 len, struct bigmetrics *metrics, int imageformat, + int enc, BDFFont *bdf) { + BDFChar *bdfc; + struct bigmetrics big; + int i,j,ch,l,p, num; + + if ( enc>=bdf->charcnt ) +return; + if ( len==0 ) /* Missing, but encoded, glyph */ +return; + + if ( offset!=-1 ) + fseek(ttf,info->bitmapdata_start+offset,SEEK_SET); + + if ( imageformat==1 || imageformat==2 || imageformat==8 ) { + /* I ignore vertical strikes, so all short metrics are horizontal for me*/ + big.height = getc(ttf); + big.width = getc(ttf); + big.hbearingX = (signed char) getc(ttf); + big.hbearingY = (signed char) getc(ttf); + big.hadvance = getc(ttf); + big.vbearingX = 0; + big.vbearingY = 0; + big.vadvance = 0; + metrics = &big; + if ( imageformat==8 ) + /* pad = */ getc(ttf); + } else if ( imageformat==6 || imageformat==7 || imageformat==9 ) { + big.height = getc(ttf); + big.width = getc(ttf); + big.hbearingX = (signed char) getc(ttf); + big.hbearingY = (signed char) getc(ttf); + big.hadvance = getc(ttf); + big.vbearingX = (signed char) getc(ttf); + big.vbearingY = (signed char) getc(ttf); + big.vadvance = getc(ttf); + metrics = &big; + } else if ( imageformat==5 ) { + /* metrics from EBLC */ + /* Do nothing here */ + if ( metrics==NULL ) { + fprintf( stderr, "Unexpected use of bitmap format 5, no metrics are appearant\n" ); + /*fseek(ttf,len,SEEK_CUR);*/ +return; + } + } else { + /* format 3 is obsolete */ + /* format 4 is compressed apple and I'm not supporting it (Nor is MS) */ + if ( imageformat==3 && !info->obscomplain ) { + fprintf( stderr, "This font contains bitmaps in the obsolete format 3 (And I can't read them)\n" ); + info->obscomplain = true; + } else if ( imageformat==4 ) { + /* Apple doesn't describe it (fully) in their spec. */ + /* MS doesn't support it (and doesn't describe) */ + /* Adobe doesn't describe it (and says MS doesn't support it) */ + fprintf( stderr, "This font contains bitmaps in Apple's compressed format 4 (And I don't support that)\n" ); + info->cmpcomplain = true; + } else if ( !info->unkcomplain ) { + fprintf( stderr, "This font contains bitmaps in a format %d that I've never heard of\n", imageformat ); + info->unkcomplain = true; + } +return; + } + bdfc = chunkalloc(sizeof(BDFChar)); + if ( info->chars!=NULL ) { + if ( info->chars[enc]==NULL ) { + info->chars[enc] = SplineCharCreate(); + info->chars[enc]->enc = enc; + info->chars[enc]->unicodeenc = -1; + info->chars[enc]->width = info->chars[enc]->vwidth = info->emsize; + } + bdfc->sc = info->chars[enc]; + } + bdfc->enc = enc; + if ( bdf->chars[enc]!=NULL ) /* Shouldn't happen of course */ + BDFCharFree(bdf->chars[enc]); + bdf->chars[enc] = bdfc; + + bdfc->width = metrics->hadvance; + bdfc->xmin = metrics->hbearingX; + bdfc->xmax = bdfc->xmin+metrics->width-1; + bdfc->ymax = metrics->hbearingY-1; + bdfc->ymin = bdfc->ymax-metrics->height+1; + if ( bdf->clut==NULL ) { + bdfc->bytes_per_line = (metrics->width+7)/8; + bdfc->depth = 1; + } else { + bdfc->bytes_per_line = metrics->width; + bdfc->byte_data = true; + bdfc->depth = bdf->clut->clut_len==4 ? 2 : bdf->clut->clut_len==16 ? 4 : 8; + } + bdfc->bitmap = gcalloc(metrics->height*bdfc->bytes_per_line,sizeof(uint8)); + + if ( imageformat==8 || imageformat==9 ) { + /* composite, we don't support (but we will parse enough to skip over) */ + num = getushort(ttf); + for ( i=0; iclut==NULL || bdf->clut->clut_len==256 ) { + for ( i=0; iheight; ++i ) + fread(bdfc->bitmap+i*bdfc->bytes_per_line,1,bdfc->bytes_per_line,ttf); + } else if ( bdf->clut->clut_len==4 ) { + for ( i=0; iheight; ++i ) { + for ( j=0; jwidth; j+=4 ) { + ch = getc(ttf); + bdfc->bitmap[i*bdfc->bytes_per_line+j] = (ch>>6); + if ( j+1 < metrics->width ) + bdfc->bitmap[i*bdfc->bytes_per_line+j+1] = (ch>>4)&3; + if ( j+2 < metrics->width ) + bdfc->bitmap[i*bdfc->bytes_per_line+j+2] = (ch>>2)&3; + if ( j+3 < metrics->width ) + bdfc->bitmap[i*bdfc->bytes_per_line+j+3] = ch&3; + } + } + } else if ( bdf->clut->clut_len==16 ) { + for ( i=0; iheight; ++i ) { + for ( j=0; jwidth; j+=2 ) { + ch = getc(ttf); + bdfc->bitmap[i*bdfc->bytes_per_line+j] = (ch>>4); + if ( j+1 < metrics->width ) + bdfc->bitmap[i*bdfc->bytes_per_line+j+1] = ch&0xf; + } + } + } + } else if ( imageformat==2 || imageformat==5 || imageformat==7 ) { + /* each row is bit aligned, but each glyph is byte aligned */ + if ( bdf->clut==NULL ) { + for ( i=0; i<(metrics->height*metrics->width+7)/8; ++i ) { + ch = getc(ttf); + for ( j=0; j<8; ++j ) { + l = (i*8+j)/metrics->width; + p = (i*8+j)%metrics->width; + if ( lheight && (ch&(1<<(7-j))) ) + bdfc->bitmap[l*bdfc->bytes_per_line+(p>>3)] |= (1<<(7-(p&7))); + } + } + } else if ( bdf->clut->clut_len==256 ) { + /* well, yeah, it's bit aligned, but since pixels are bytes, it's byte aligned */ + for ( i=0; iheight; ++i ) + fread(bdfc->bitmap+i*bdfc->bytes_per_line,1,bdfc->bytes_per_line,ttf); + } else if ( bdf->clut->clut_len==4 ) { + for ( i=0; iheight*metrics->width; i+=4 ) { + ch = getc(ttf); + bdfc->bitmap[(i/metrics->width)*bdfc->bytes_per_line+i%metrics->width] = (ch>>6); + if ( i+1 < metrics->width*metrics->height ) + bdfc->bitmap[((i+1)/metrics->width)*bdfc->bytes_per_line+(i+1)%metrics->width] = (ch>>4)&3; + if ( i+2 < metrics->width*metrics->height ) + bdfc->bitmap[((i+2)/metrics->width)*bdfc->bytes_per_line+(i+2)%metrics->width] = (ch>>2)&3; + if ( i+3 < metrics->width*metrics->height ) + bdfc->bitmap[((i+3)/metrics->width)*bdfc->bytes_per_line+(i+3)%metrics->width] = ch&3; + } + } else if ( bdf->clut->clut_len==16 ) { + for ( i=0; iheight*metrics->width; i+=2 ) { + ch = getc(ttf); + bdfc->bitmap[(i/metrics->width)*bdfc->bytes_per_line+i%metrics->width] = (ch>>4); + if ( i+1 < metrics->width*metrics->height ) + bdfc->bitmap[((i+1)/metrics->width)*bdfc->bytes_per_line+(i+1)%metrics->width] = ch&0xf; + } + } + } + GProgressNext(); +} + +static void readttfbitmapfont(FILE *ttf,struct ttfinfo *info, + struct ttfsizehead *head, BDFFont *bdf) { + int i, j, g; + int indexformat, imageformat, size, num, moreoff; + int32 offset, *glyphoffsets, *glyphs, loc; + int first, last; + struct bigmetrics big; + + fseek(ttf,info->bitmaploc_start+head->indexSubTableArrayOffset,SEEK_SET); + for ( j=0; jnumIndexSubTables; ++j ) { + first = getushort(ttf); + last = getushort(ttf); + moreoff = getlong(ttf); + loc = ftell(ttf); + fseek(ttf,info->bitmaploc_start+head->indexSubTableArrayOffset+moreoff,SEEK_SET); + + indexformat=getushort(ttf); + imageformat=getushort(ttf); + offset = getlong(ttf); + switch ( indexformat ) { + case 1: case 3: + glyphoffsets = galloc((last-first+2)*sizeof(int32)); + for ( i=0; i<(last-first+2); ++i ) + glyphoffsets[i] = indexformat==3?getushort(ttf):getlong(ttf); + if ( indexformat==3 && ((last-first)&1) ) + getushort(ttf); + for ( i=0; i<=last-first; ++i ) { + if ( info->inuse==NULL || info->inuse[i+first] ) + ttfreadbmfglyph(ttf,info,offset+glyphoffsets[i], + glyphoffsets[i+1]-glyphoffsets[i],NULL, + imageformat,i+first,bdf); + } + free(glyphoffsets); + break; + case 2: + size = getlong(ttf); + big.height = getc(ttf); + big.width = getc(ttf); + big.hbearingX = (signed char) getc(ttf); + big.hbearingY = (signed char) getc(ttf); + big.hadvance = getc(ttf); + big.vbearingX = (signed char) getc(ttf); + big.vbearingY = (signed char) getc(ttf); + big.vadvance = getc(ttf); + for ( i=first; i<=last; ++i ) { + if ( info->inuse==NULL || info->inuse[i] ) + ttfreadbmfglyph(ttf,info,offset, + size,&big, + imageformat,i,bdf); + else + fseek(ttf,size,SEEK_CUR); + offset = -1; + } + break; + case 4: + num = getlong(ttf); + glyphoffsets = galloc((num+1)*sizeof(int32)); + glyphs = galloc((num+1)*sizeof(int32)); + for ( g=0; ginuse==NULL || info->inuse[i+first]) && ginuse==NULL || info->inuse[i+first]) && gbitmaploc_start,SEEK_SET); + /* version = */ getlong(ttf); /* Had better be 0x00020000, or 2.0 */ + cnt = getlong(ttf); + sizes = galloc(cnt*sizeof(struct ttfsizehead)); + /* we may not like all the possible bitmaps. Some might be designed for */ + /* non-square pixels, others might be color, others might be */ + /* vertical data. So only pick out the ones we can use */ + bigval = biggest = -1; + for ( i = j = 0; i bigval ) { + biggest = j; + bigval = sizes[j].ppem; + } + } + j += good; + } + cnt = j; + if ( cnt==0 ) +return; + + /* Ask user which (if any) s/he is interested in */ + choices = gcalloc(cnt+1,sizeof(unichar_t *)); + sel = gcalloc(cnt,sizeof(char)); + for ( i=0; iglyphlocations_start==0 && info->cff_start==0 && cnt==1 ) + sel[0] = true; + else if ( screen_display==NULL ) { + if ( onlyone ) { + biggest=0; + for ( i=1; isizes[biggest].ppem && sizes[i].depth==1 ) + biggest = i; + sel[biggest] = true; + } else { + for ( i=0; ibitmaps = last = NULL; + for ( i=0; icharcnt = info->glyph_cnt; + bdf->chars = gcalloc(bdf->charcnt,sizeof(BDFChar *)); + bdf->pixelsize = sizes[i].ppem; + bdf->ascent = (info->ascent*bdf->pixelsize + info->emsize/2)/info->emsize; + bdf->descent = bdf->pixelsize - bdf->ascent; + bdf->res = -1; + if ( sizes[i].depth!=1 ) + BDFClut(bdf,1<<(sizes[i].depth/2)); + if ( last==NULL ) + info->bitmaps = bdf; + else + last->next = bdf; + last = bdf; + u_snprintf(ubuf,sizeof(ubuf)/sizeof(ubuf[0]),GStringGetResource(_STR_DPixelBitmap,NULL), + sizes[i].ppem ); + GProgressChangeLine2(ubuf); + readttfbitmapfont(ttf,info,&sizes[i],bdf); + GProgressNextStage(); + } + free(sizes); free(sel); +} + +/* ************************************************************************** */ + +static BDFChar glyph0, glyph1, glyph2; +static SplineChar sc0, sc1, sc2; +static struct bdfcharlist bl[3]; + +static struct bdfcharlist *BDFAddDefaultGlyphs(BDFFont *bdf) { + /* when I dump out the glyf table I add 3 glyphs at the start. One is glyph*/ + /* 0, the one used when there is no match, and the other two are varients*/ + /* on space. There will never be glyphs 1 and 2 in the font. There might */ + /* be a glyph 0. Add the ones that don't exist */ + int width, w, i, j, bit, blpos=0; + SplineFont *sf = bdf->sf; + + width = 0x7ffff; + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + if ( width == 0x7ffff ) + width = bdf->chars[i]->width; + else if ( width!=bdf->chars[i]->width ) { + width = 0x7fffe; + break; + } + } + if ( width>0x70000 ) + /* Proportional */ + width = bdf->pixelsize/3; + + memset(bl,0,sizeof(bl)); + if ( IsntBDFChar(bdf->chars[0])) { + sc0.name = ".notdef"; + /* sc0.ttf_glyph = 0; /* already done */ + sc0.parent = sf; + if ( width<4 ) w=4; else w=width; + sc0.width = w*(sf->ascent+sf->descent)/bdf->pixelsize; + sc0.widthset = true; + glyph0.sc = &sc0; + glyph0.width = w; + if ( BDFDepth(bdf)!=1 ) { + glyph0.bytes_per_line = 1; /* Needs to be 1 or BCRegularizeBitmap gets upset */ + glyph0.ymax = 1; + glyph0.bitmap = gcalloc(8,1); + } else { + glyph0.xmin = (w==4)?0:1; + glyph0.xmax = w-1; + glyph0.ymin = 0; + glyph0.ymax = 8*bdf->ascent/10; + glyph0.bytes_per_line = (glyph0.xmax-glyph0.xmin+8)/8; + glyph0.bitmap = gcalloc((glyph0.ymax-glyph0.ymin+1)*glyph0.bytes_per_line,1); + j = (glyph0.xmax-glyph0.xmin)>>3; + bit = 0x80>>((glyph0.xmax-glyph0.xmin)&7); + for ( i=0; i<=glyph0.ymax; ++i ) { + glyph0.bitmap[i*glyph0.bytes_per_line] |= 0x80; + glyph0.bitmap[i*glyph0.bytes_per_line+j] |= bit; + } + for ( i=0; i>3] |= (0x80>>(i&7)); + glyph0.bitmap[glyph0.ymax*glyph0.bytes_per_line+(i>>3)] |= (0x80>>(i&7)); + } + } + if ( bdf->chars[0]==NULL ) + bdf->chars[0] = &glyph0; + else + bl[blpos++].bc = &glyph0; + } + + sc1.ttf_glyph = 1; + sc2.ttf_glyph = 2; + sc1.name = ".null"; sc2.name = "nonmarkingreturn"; + sc1.parent = sc2.parent = sf; + sc1.width = sc2.width = width*(sf->ascent+sf->descent)/bdf->pixelsize; + sc1.widthset = sc2.widthset = 1; + glyph1.sc = &sc1; glyph2.sc = &sc2; + /* xmin and so forth are zero, and are already clear */ + glyph1.width = glyph2.width = width; + glyph1.bytes_per_line = glyph2.bytes_per_line = 1; /* Needs to be 1 or BCRegularizeBitmap gets upset */ + glyph1.bitmap = glyph2.bitmap = (uint8 *) ""; + glyph1.enc = 1; glyph2.enc = 2; + if ( bdf->chars[1]==NULL ) + bdf->chars[1] = &glyph1; + else if ( (bdf->chars[0]!=NULL && bdf->chars[0]->sc->ttf_glyph==1) || bdf->chars[1]->sc->ttf_glyph==1 ) + /* Do nothing, ignore this dummy glyph */; + else { + if ( blpos!=0 ) + bl[blpos-1].next = &bl[blpos]; + bl[blpos++].bc = &glyph1; + } + if ( bdf->chars[2]==NULL ) + bdf->chars[2] = &glyph2; + else if ( (bdf->chars[1]!=NULL && bdf->chars[1]->sc->ttf_glyph==2) || bdf->chars[2]->sc->ttf_glyph==2 ) + /* Do nothing, ignore this dummy glyph */; + else { + if ( blpos!=0 ) + bl[blpos-1].next = &bl[blpos]; + bl[blpos++].bc = &glyph2; + } +return( blpos==0 ? NULL : &bl[0] ); +} + +static void BDFCleanupDefaultGlyphs(BDFFont *bdf) { + if ( bdf->chars[0] == &glyph0 ) + bdf->chars[0] = NULL; + if ( bdf->chars[1] == &glyph1 ) + bdf->chars[1] = NULL; + if ( bdf->chars[2] == &glyph2 ) + bdf->chars[2] = NULL; + free(glyph0.bitmap); + glyph0.bitmap = NULL; +} + +static void ttfdumpsmallmetrics(FILE *bdat, BDFChar *bc) { + + /* dump small metrics */ + putc(bc->ymax-bc->ymin+1,bdat); /* height */ + putc(bc->xmax-bc->xmin+1,bdat); /* width */ + putc(bc->xmin,bdat); /* horiBearingX */ + putc(bc->ymax+1,bdat); /* horiBearingY */ + putc(bc->width,bdat); /* advance width */ +} + +static int32 ttfdumpf1bchar(FILE *bdat, BDFChar *bc,BDFFont *bdf) { + /* format 1 character dump. small metrics, byte aligned data */ + int32 pos = ftell(bdat); + int r,c,val; + + ttfdumpsmallmetrics(bdat,bc); + + /* dump image */ + for ( r=0; r<=bc->ymax-bc->ymin; ++r ) { + if ( bdf->clut==NULL || bdf->clut->clut_len==256 ) { + for ( c=0; cbytes_per_line; ++c ) + putc(bc->bitmap[r*bc->bytes_per_line+c],bdat); + } else if ( bdf->clut->clut_len==4 ) { + for ( c=0; cbytes_per_line; c+=2 ) { + val = bc->bitmap[r*bc->bytes_per_line+c]<<4; + if ( c+1bytes_per_line ) + val += bc->bitmap[r*bc->bytes_per_line+c+1]; + putc(val,bdat); + } + } else { + for ( c=0; cbytes_per_line; c+=4 ) { + val = bc->bitmap[r*bc->bytes_per_line+c]<<6; + if ( c+1bytes_per_line ) + val += bc->bitmap[r*bc->bytes_per_line+c+1]<<4; + if ( c+2bytes_per_line ) + val += bc->bitmap[r*bc->bytes_per_line+c+2]<<2; + if ( c+3bytes_per_line ) + val += bc->bitmap[r*bc->bytes_per_line+c+3]; + putc(val,bdat); + } + } + } +return( pos ); +} + +static int32 ttfdumpf2bchar(FILE *bdat, BDFChar *bc,BDFFont *bdf) { + /* format 2 character dump. small metrics, bit aligned data */ + int32 pos = ftell(bdat); + int r,c,ch,bit,sh; + + ttfdumpsmallmetrics(bdat,bc); + + /* dump image */ + ch = 0; bit = 0x80; sh=7; + for ( r=0; r<=bc->ymax-bc->ymin; ++r ) { + for ( c = 0; c<=bc->xmax-bc->xmin; ++c ) { + if ( bdf->clut==NULL ) { + if ( bc->bitmap[r*bc->bytes_per_line+(c>>3)] & (1<<(7-(c&7))) ) + ch |= bit; + bit >>= 1; + } else if ( bdf->clut->clut_len==4 ) { + ch |= (bc->bitmap[r*bc->bytes_per_line+c]<<(sh-1)); + sh-=2; + bit >>= 2; + } else { + ch |= (bc->bitmap[r*bc->bytes_per_line+c]<<(sh-3)); + sh-=4; + bit >>= 4; + } + if ( bit==0 ) { + putc(ch,bdat); + ch = 0; + sh = 7; + bit = 0x80; + } + } + } + if ( bit!=0x80 ) + putc(ch,bdat); +return( pos ); +} + +struct mymets { + int ymin, ymax; + int xmin, xmax; + int width; /* xmax-xmin+1 */ +}; + +static int32 ttfdumpf5bchar(FILE *bdat, BDFChar *bc, struct mymets *mets,BDFFont *bdf) { + /* format 5 character dump. no metrics, bit aligned data */ + /* now it may be that some of the character we are dumping have bitmaps */ + /* that are a little smaller than the size specified in mymets. But that's*/ + /* ok, we just pad them out with null bits */ + int32 pos = ftell(bdat); + int r,c,ch,bit, sh; + int depth = BDFDepth(bdf); + + /* dump image */ + ch = 0; bit = 0x80; sh = 7; + for ( r=bc->ymax+1; r<=mets->ymax; ++r ) { + for ( c=0; cwidth; ++c ) { + bit >>= depth; + sh -= depth; + if ( bit==0 ) { + putc(ch,bdat); + ch = 0; + sh = 7; bit = 0x80; + } + } + } + for ( r=0; r<=bc->ymax-bc->ymin; ++r ) { + for ( c = mets->xmin; cxmin; ++c ) { + bit >>= depth; + sh -= depth; + if ( bit==0 ) { + putc(ch,bdat); + ch = 0; + sh = 7; bit = 0x80; + } + } + for ( c = 0; c<=bc->xmax-bc->xmin; ++c ) { + if ( depth==1 ) { + if ( bc->bitmap[r*bc->bytes_per_line+(c>>3)] & (1<<(7-(c&7))) ) + ch |= bit; + } else if ( depth==8 ) + ch = bc->bitmap[r*bc->bytes_per_line+c]; + else if ( depth==2 ) + ch |= (bc->bitmap[r*bc->bytes_per_line+c]<<(sh-1)); + else if ( depth==4 ) + ch |= (bc->bitmap[r*bc->bytes_per_line+c]<<(sh-3)); + bit >>= depth; + sh -= depth; + if ( bit==0 ) { + putc(ch,bdat); + ch = 0; + sh = 7; bit = 0x80; + } + } + for ( c = bc->xmax+1; c<=mets->xmax; ++c ) { + bit >>= depth; + sh -= depth; + if ( bit==0 ) { + putc(ch,bdat); + ch = 0; + sh = 7; bit = 0x80; + } + } + } + for ( r=bc->ymin-1; r>=mets->ymin; --r ) { + for ( c=0; cwidth; ++c ) { + bit >>= depth; + if ( bit==0 ) { + putc(ch,bdat); + ch = 0; + bit = 0x80; + } + } + } + if ( bit!=0x80 ) + putc(ch,bdat); +return( pos ); +} + +struct bitmapSizeTable { + int32 subtableoffset; + int32 tablesize; + int32 numsubtables; + int32 colorRef; + struct sbitLineMetrics { + int8 ascender; + int8 descender; + uint8 widthMax; + int8 caretRise; + int8 caretRun; + int8 caretOff; + int8 minoriginsb; + int8 minAdvancesb; + int8 maxbeforebl; + int8 minafterbl; + int8 pad1, pad2; + } hori, vert; + uint16 startGlyph; + uint16 endGlyph; + uint8 ppemX; + uint8 ppemY; + uint8 bitdepth; + int8 flags; + struct bitmapSizeTable *next; + unsigned int error: 1; +}; +struct indexarray { + uint16 first; + uint16 last; + uint32 additionalOffset; + struct indexarray *next; +}; + +static void FillLineMetrics(struct bitmapSizeTable *size,BDFFont *bdf) { + int i, first; + BDFChar *bc; + + memset(&size->hori,0,sizeof(struct sbitLineMetrics)); + memset(&size->vert,0,sizeof(struct sbitLineMetrics)); + + /* I shall ignore vertical metrics */ + size->hori.caretRise = 1; /* other caret fields may be 0 */ + size->vert.caretRise = 1; /* other caret fields may be 0 */ + first = true; + for ( i=0; icharcnt ; ++i ) if ( (bc=bdf->chars[i])!=NULL ) { + if ( first ) { + size->hori.ascender = bc->ymax; + size->hori.descender = bc->ymin; + size->hori.widthMax = bc->xmax-bc->xmin+1; + size->hori.minoriginsb = bc->xmin; + size->hori.minAdvancesb = bc->width-bc->xmax; + size->hori.minafterbl = bc->ymin; + size->hori.maxbeforebl = bc->ymax; + first = false; + } else { + if ( bc->ymax > size->hori.ascender ) size->hori.ascender = bc->ymax; + if ( bc->ymin < size->hori.descender ) size->hori.descender = bc->ymin; + if ( bc->xmax-bc->xmin+1 > size->hori.widthMax ) size->hori.widthMax = bc->xmax-bc->xmin+1; + if ( bc->xmin < size->hori.minoriginsb ) size->hori.minoriginsb = bc->xmin; + if ( bc->width-bc->xmax < size->hori.minAdvancesb ) size->hori.minAdvancesb = bc->width-bc->xmax; + if ( bc->ymin < size->hori.minafterbl ) size->hori.minafterbl = bc->ymin; + if ( bc->ymax > size->hori.maxbeforebl ) size->hori.maxbeforebl = bc->ymax; + } + } + + /* There are some very cryptic pictures supposed to document the meaning */ + /* of the metrics fields. MS and Apple use the same picture. The data */ + /* present in font files do not match my understanding of those pictures */ + /* But that's ok because different font files contain wildly different */ + /* values for the same data, so they don't match each other either */ + /* GRRRRR */ +#if 0 + size->vert.minoriginsb = size->hori.maxbeforebl; + size->vert.minAdvancesb = size->hori.minafterbl; + /* Apple seems to say that the vertical ascender/descender are half the */ + /* pixel size (which makes sense), but MS does something else */ + size->vert.ascender = bdf->pixelsize/2; + size->vert.descender = bdf->pixelsize/2; + size->vert.widthMax = bdf->pixelsize; +#endif +} + +static struct bitmapSizeTable *ttfdumpstrikelocs(FILE *bloc,FILE *bdat, + BDFFont *bdf, struct bdfcharlist *defs) { + struct bitmapSizeTable *size = gcalloc(1,sizeof(struct bitmapSizeTable)); + struct indexarray *cur, *last=NULL, *head=NULL; + int i,j, final,cnt; + FILE *subtables = tmpfile(); + struct mymets met; + int32 pos = ftell(bloc), startofsubtables, base; + BDFChar *bc, *bc2; + + for ( i=0; icharcnt && (bdf->chars[i]==NULL || bdf->chars[i]->sc->ttf_glyph==-1); ++i ); + for ( j=bdf->charcnt-1; j>=0 && (bdf->chars[j]==NULL || bdf->chars[j]->sc->ttf_glyph==-1); --j ); + if ( j==-1 ) { + GDrawIError("No characters to output in strikes"); +return(NULL); + } + size->flags = 0x01; /* horizontal */ + size->bitdepth = BDFDepth(bdf); + size->ppemX = size->ppemY = bdf->ascent+bdf->descent; + size->endGlyph = bdf->chars[j]->sc->ttf_glyph; + size->startGlyph = bdf->chars[i]->sc->ttf_glyph; + size->subtableoffset = pos; + FillLineMetrics(size,bdf); + + /* First figure out sequences of characters which all have about the same metrics */ + /* then we dump out the subtables (to temp file) */ + /* then we dump out the indexsubtablearray (to bloc) */ + /* then we copy the subtables from the temp file to bloc */ + + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + bdf->chars[i]->widthgroup = false; + BCCompressBitmap(bdf->chars[i]); + } + for ( i=0; icharcnt; ++i ) { + if ( (bc=bdf->chars[i])!=NULL && bc->sc->ttf_glyph!=1 && + bc->xmin>=0 && bc->xmax<=bc->width && + bc->ymaxascent && bc->ymin>=-bdf->descent ) { + cnt = 1; + for ( j=i+1; jcharcnt; ++j ) + if ( (bc2=bdf->chars[i])!=NULL && bc2->sc->ttf_glyph!=-1 ) { + if ( bc2->xmin<0 || bc2->xmax>bc->width || bc2->ymin<-bdf->descent || + bc2->ymax>=bdf->ascent || bc2->width!=bc->width || + bc2->sc->ttf_glyph!=bc->sc->ttf_glyph+cnt ) + break; + ++cnt; + } + if ( cnt>20 ) { /* We must have at least, oh, 20 chars with the same metrics */ + bc->widthgroup = true; + cnt = 1; + for ( j=i+1; jcharcnt; ++j ) + if ( (bc2=bdf->chars[i])!=NULL && bc2->sc->ttf_glyph!=-1 ) { + if ( bc2->xmin<0 || bc2->xmax>bc->width || bc2->ymin<-bdf->descent || + bc2->ymax>=bdf->ascent || bc2->width!=bc->width || + bc2->sc->ttf_glyph!=bc->sc->ttf_glyph+cnt ) + break; + ++cnt; + bc2->widthgroup = true; + } + } + } + } + + /* Now the pointers */ + for ( i=0; icharcnt; ++i ) + if ( (bc=bdf->chars[i])!=NULL && bc->sc->ttf_glyph!=-1) { + if ( defs!=NULL && defs->bc->sc->ttf_glyphsc->ttf_glyph ) { + --i; + bc = defs->bc; + defs = defs->next; + } + cur = galloc(sizeof(struct indexarray)); + cur->next = NULL; + if ( last==NULL ) head = cur; + else last->next = cur; + last = cur; + cur->first = bc->sc->ttf_glyph; + cur->additionalOffset = ftell(subtables); + + cnt = 1; + final = i; + if ( bc!=bdf->chars[i] ) + cur->last = bc->sc->ttf_glyph; + else { + for ( j=i+1; jcharcnt ; ++j ) { + if ( (bc2=bdf->chars[j])==NULL ) + /* Ignore it */; + else if ( bc2->sc->ttf_glyph!=bc->sc->ttf_glyph+cnt ) + break; + else if ( bc2->widthgroup!=bc->widthgroup || + (bc->widthgroup && bc->width!=bc2->width) ) + break; + else { + ++cnt; + final = j; + } + } + cur->last = bdf->chars[final]->sc->ttf_glyph; + } + + if ( !bc->widthgroup ) { + putshort(subtables,1); /* index format, 4byte offset, no metrics here */ + if ( BDFDepth(bdf)!=8 ) + putshort(subtables,2); /* data format, short metrics, bit aligned */ + else + putshort(subtables,1); /* data format, short metrics, byte aligned */ + base = ftell(bdat); + putlong(subtables,base); /* start of glyphs in bdat */ + if ( BDFDepth(bdf)!=8 ) + putlong(subtables,ttfdumpf2bchar(bdat,bc,bdf)-base); + else + putlong(subtables,ttfdumpf1bchar(bdat,bc,bdf)-base); + for ( j=i+1; j<=final ; ++j ) if ( (bc2=bdf->chars[j])!=NULL ) { + if ( BDFDepth(bdf)!=8 ) + putlong(subtables,ttfdumpf2bchar(bdat,bc2,bdf)-base); + else + putlong(subtables,ttfdumpf1bchar(bdat,bc2,bdf)-base); + } + putlong(subtables,ftell(bdat)-base); /* Length of last entry */ + } else { + met.xmin = bc->xmin; met.xmax = bc->xmax; met.ymin = bc->ymin; met.ymax = bc->ymax; + for ( j=i+1; j<=final ; ++j ) if ( (bc2=bdf->chars[j])!=NULL ) { + if ( bc2->xmax>met.xmax ) met.xmax = bc2->xmax; + if ( bc2->xminxmin; + if ( bc2->ymax>met.ymax ) met.ymax = bc2->ymax; + if ( bc2->yminymin; + } + met.width = (met.xmax-met.xmin+1); + + putshort(subtables,2); /* index format, big metrics, all glyphs same size */ + putshort(subtables,5); /* data format, bit aligned no metrics */ + putlong(subtables,ftell(bdat)); /* start of glyphs in bdat */ + putlong(subtables,met.width*(met.ymax-met.ymin+1)); /* glyph size */ + /* big metrics */ + putc(met.ymax-met.ymin+1,subtables); /* image height */ + putc(met.width,subtables); /* image width */ + putc(met.xmin,subtables); /* horiBearingX */ + putc(met.ymax,subtables); /* horiBearingY */ + putc(bc->width,subtables); /* advance width */ + putc(-bc->width/2,subtables); /* vertBearingX */ + putc(0,subtables); /* vertBearingY */ + putc(bdf->ascent+bdf->descent,subtables); /* advance height */ + ttfdumpf5bchar(bdat,bc,&met,bdf); + for ( j=i+1; j<=final ; ++j ) if ( (bc2=bdf->chars[j])!=NULL ) { + ttfdumpf5bchar(bdat,bc2,&met,bdf); + } + } + i = final; + } + + /* now output the pointers */ + for ( cur=head, cnt=0; cur!=NULL; cur=cur->next ) ++cnt; + startofsubtables = cnt*(2*sizeof(short)+sizeof(int32)); + size->numsubtables = cnt; + for ( cur=head; cur!=NULL; cur = cur->next ) { + putshort(bloc,cur->first); + putshort(bloc,cur->last); + putlong(bloc,startofsubtables+cur->additionalOffset); + } + + /* copy the index file and close it (and delete it) */ + if ( !ttfcopyfile(bloc,subtables,pos+startofsubtables)) + size->error = true; + + size->tablesize = ftell(bloc)-pos; + + for ( cur=head; cur!=NULL; cur = last ) { + last = cur->next; + free(cur); + } +return( size ); +} + +static void dumpbitmapSizeTable(FILE *bloc,struct bitmapSizeTable *size) { + putlong(bloc,size->subtableoffset); + putlong(bloc,size->tablesize); + putlong(bloc,size->numsubtables); + putlong(bloc,size->colorRef); + fwrite(&size->hori,1,sizeof(struct sbitLineMetrics),bloc); + fwrite(&size->vert,1,sizeof(struct sbitLineMetrics),bloc); + putshort(bloc,size->startGlyph); + putshort(bloc,size->endGlyph); + putc(size->ppemX,bloc); + putc(size->ppemY,bloc); + putc(size->bitdepth,bloc); + putc(size->flags,bloc); +} + +void ttfdumpbitmap(SplineFont *sf,struct alltabs *at,int32 *sizes) { + int i; + static struct bitmapSizeTable space; + struct bitmapSizeTable *head=NULL, *cur, *last; + BDFFont *bdf; + struct bdfcharlist *bl; + + at->bdat = tmpfile(); + at->bloc = tmpfile(); + /* aside from the names the version number is about the only difference */ + /* I'm aware of. Oh MS adds a couple new sub-tables, but I haven't seen */ + /* them used, and Apple also has a subtable MS doesn't support, but so what? */ + /* Oh, of course. Apple documents version 0x10000, but it actually uses */ + /* version 0x20000. How silly of me to think the docs might be right */ + /* (Apple now documents version 0x20000) */ + /*if ( at->msbitmaps ) {*/ + putlong(at->bdat,0x20000); + putlong(at->bloc,0x20000); +#if 0 + } else { + putlong(at->bdat,0x10000); + putlong(at->bloc,0x10000); + } +#endif + putlong(at->bloc,at->gi.strikecnt); + + /* leave space for the strike array at start of file */ + for ( i=0; sizes[i]!=0; ++i ) + dumpbitmapSizeTable(at->bloc,&space); + + /* Dump out the strikes... */ + GProgressChangeLine1R(_STR_SavingBitmapFonts); + for ( i=0; sizes[i]!=0; ++i ) { + GProgressNextStage(); + for ( bdf=sf->bitmaps; bdf!=NULL && (bdf->pixelsize!=(sizes[i]&0xffff) || BDFDepth(bdf)!=(sizes[i]>>16)); bdf=bdf->next ); + if ( bdf==NULL ) + continue; + bl = BDFAddDefaultGlyphs(bdf); + cur = ttfdumpstrikelocs(at->bloc,at->bdat,bdf,bl); + BDFCleanupDefaultGlyphs(bdf); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + if ( cur->error ) at->error = true; + } + + fseek(at->bloc,2*sizeof(int32),SEEK_SET); + for ( cur=head; cur!=NULL; cur=cur->next ) + dumpbitmapSizeTable(at->bloc,cur); + + for ( cur=head; cur!=NULL; cur=last ) { + last = cur->next; + free(cur); + } + + at->bdatlen = ftell(at->bdat); + if ( (at->bdatlen&1)!=0 ) + putc(0,at->bdat); + if ( ftell(at->bdat)&2 ) + putshort(at->bdat,0); + + fseek(at->bloc,0,SEEK_END); + at->bloclen = ftell(at->bloc); + if ( (at->bloclen&1)!=0 ) + putc(0,at->bloc); + if ( ftell(at->bloc)&2 ) + putshort(at->bloc,0); + + GProgressChangeLine1R(_STR_SavingTTFont); +} + +static BDFFont *BDFSelect(SplineFont *sf,int32 *sizes,int wanted ) { + int i; + int best = -1; + BDFFont *bdf; + + if ( wanted<=(sizes[0]&0xffff) ) { + best = sizes[0]&0xffff; + if ( best==wanted ) +return(NULL ); + } else { + for ( i=1; sizes[i]!=0 && wanted>(sizes[i]&0xffff); ++i ); + best = sizes[i-1]&0xffff; + if ( best==wanted ) /* Exact match, no scaling needed */ +return( NULL ); + } + + for ( bdf=sf->bitmaps; bdf!=NULL && bdf->pixelsize!=best; bdf = bdf->next ); +return( bdf ); +} + +void ttfdumpbitmapscaling(SplineFont *sf,struct alltabs *at,int32 *sizes) { + int i, cnt; + BDFFont *bdf; + static int expected_sizes[] = { 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 23, 24, 25, 30, 32, 33, 40, 0 }; + struct bitmapSizeTable size; + +/* I only generate this table if I'm trying to generate an ms bitmap-only */ +/* ttf file. Now MS doesn't really support bitmap-only fonts, so we kludge */ +/* we make the loca table point to a bunch of space glyphs. But to keep */ +/* the rasterizer from generating spaces, we put in a bunch of scaling */ +/* instructions so that for all expected bitmap sizes we might meet */ +/* we either get a bitmap strike or a scaled strike */ +/* The sizes above were chosen to get the pixel sizes for */ +/* 8,9,10,11,12,14,16,18,24 are present at 72,75,96,100,120 dpi */ +/* (standard pointsizes) (Mac, X & Win standard screen dpis) */ + + /* first count the number of scaled strikes */ + cnt = 0; + for ( i=0; expected_sizes[i]!=0; ++i ) { + if ( BDFSelect(sf,sizes,expected_sizes[i])!=NULL ) + ++cnt; + } + + at->ebsc = tmpfile(); + putlong( at->ebsc, 0x20000 ); + putlong( at->ebsc, cnt ); + for ( i=0; expected_sizes[i]!=0; ++i ) { + if ( (bdf=BDFSelect(sf,sizes,expected_sizes[i]))!=NULL ) { + FillLineMetrics(&size,bdf); + /* Horizontal line metrics */ + putc((int) rint(size.hori.ascender*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.hori.descender*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.hori.widthMax*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc(size.hori.caretRise,at->ebsc); + putc(size.hori.caretRun,at->ebsc); + putc(size.hori.caretOff,at->ebsc); + putc((int) rint(size.hori.minoriginsb*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.hori.minAdvancesb*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.hori.maxbeforebl*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.hori.minafterbl*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc(0,at->ebsc); + putc(0,at->ebsc); + /* Vertical line metrics */ +#if 1 + putc((int) rint(size.hori.ascender*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.hori.descender*expected_sizes[i]/bdf->pixelsize),at->ebsc); +#else + putc((int) rint(size.vert.ascender*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.vert.descender*expected_sizes[i]/bdf->pixelsize),at->ebsc); +#endif + putc((int) rint(size.vert.widthMax*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc(size.vert.caretRise,at->ebsc); + putc(size.vert.caretRun,at->ebsc); + putc(size.vert.caretOff,at->ebsc); + putc((int) rint(size.vert.minoriginsb*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.vert.minAdvancesb*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.vert.maxbeforebl*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc((int) rint(size.vert.minafterbl*expected_sizes[i]/bdf->pixelsize),at->ebsc); + putc(0,at->ebsc); + putc(0,at->ebsc); + /* Actual scaling info */ + putc( expected_sizes[i], at->ebsc); + putc( expected_sizes[i], at->ebsc); + putc( bdf->pixelsize, at->ebsc); + putc( bdf->pixelsize, at->ebsc); + } + } + + at->ebsclen = ftell(at->ebsc); + if ( (at->ebsclen&1)!=0 ) + putc(0,at->ebsc); + if ( ftell(at->ebsc)&2 ) + putshort(at->ebsc,0); +} diff --git a/fontforge/pfaedit.h b/fontforge/pfaedit.h new file mode 100644 index 00000000..f39d8c1a --- /dev/null +++ b/fontforge/pfaedit.h @@ -0,0 +1,117 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _PFAEDIT_H_ +#define _PFAEDIT_H_ + +#include "basics.h" +#include +#include +#include +#include "splinefont.h" +#include "nomen.h" +#include "configure-pfaedit.h" + +typedef struct enc { + int enc_num; + char *enc_name; + int char_cnt; + int32 *unicode; + char **psnames; + struct enc *next; + unsigned int builtin: 1; +} Encoding; + +static const int unicode4_size = 17*65536; + /* Unicode goes up to 0x10ffff */ + +enum { em_base = 0x100, /* an addition to enum charset, used as the base value for the encoding list above */ + em_sjis = em_max, + em_wansung, + em_jisgb, + em_max2, +/* Any changes above should be duplicated in sfd.c:36-45 */ + em_unicodeplanes = 0x10000, /* One encoding for each plane of unicode */ + em_unicodeplanesmax = 0x10017, + em_custom = em_none, + em_compacted = (em_none-1), + em_original = (em_compacted-1) + }; + +extern void GDrawIError(const char *fmt,...); +extern void GDrawError(const char *fmt,...); + +extern void CheckIsScript(int argc, char *argv[]); + +extern char *AdobeStandardEncoding[256]; +extern int psunicodenames_cnt; +extern const char *psunicodenames[]; +extern unsigned short unicode_from_adobestd[256]; +extern struct psaltnames { + char *name; + int unicode; +} psaltuninames[]; +extern int psaltuninames_cnt; + +struct unicode_nameannot { + const char *name, *annot; +}; +extern const struct unicode_nameannot * const *const *_UnicodeNameAnnot; + +extern int default_fv_font_size; +extern int default_fv_antialias; +extern int default_fv_bbsized; +extern int default_encoding; +extern int adjustwidth; +extern int adjustlbearing; +extern int autohint_before_rasterize; +extern int autohint_before_generate; +extern int seperate_hint_controls; +extern int ItalicConstrained; + +extern int new_em_size; +extern int new_fonts_are_order2; +extern int loaded_fonts_same_as_new; + +extern char *BDFFoundry, *TTFFoundry; +extern char *xuid; + +extern int pagewidth, pageheight, printtype; /* Printer defaults */ +extern char *printcommand, *printlazyprinter; + +extern Encoding *enclist; + +#define RECENT_MAX 4 +extern char *RecentFiles[RECENT_MAX]; + +#define SCRIPT_MENU_MAX 10 +extern unichar_t *script_menu_names[SCRIPT_MENU_MAX]; +extern char *script_filenames[SCRIPT_MENU_MAX]; + +extern MacFeat *default_mac_feature_map; + + +#endif diff --git a/fontforge/pfaeditui.h b/fontforge/pfaeditui.h new file mode 100644 index 00000000..4432a485 --- /dev/null +++ b/fontforge/pfaeditui.h @@ -0,0 +1,89 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _PFAEDITUI_H_ +#define _PFAEDITUI_H_ + +#include "pfaedit.h" +#include "gdraw.h" +#include "gwidget.h" +#include "ggadget.h" +#include "views.h" + +extern FontView *fv_list; +extern GCursor ct_magplus, ct_magminus, ct_mypointer, + ct_circle, ct_square, ct_triangle, ct_pen, + ct_ruler, ct_knife, ct_rotate, ct_skew, ct_scale, ct_flip, + ct_updown, ct_leftright, ct_nesw, ct_nwse, + ct_rect, ct_elipse, ct_poly, ct_star, ct_filledrect, ct_filledelipse, + ct_pencil, ct_shift, ct_line, ct_myhand, ct_setwidth, + ct_kerning, ct_rbearing, ct_lbearing, ct_eyedropper, + ct_prohibition, ct_ddcursor; +extern GImage GIcon_midtangent, GIcon_midcurve, GIcon_midcorner; +extern GImage GIcon_tangent, GIcon_curve, GIcon_corner, GIcon_ruler, + GIcon_pointer, GIcon_magnify, GIcon_pen, GIcon_knife, GIcon_scale, + GIcon_flip, GIcon_rotate, GIcon_skew, + GIcon_squarecap, GIcon_roundcap, GIcon_buttcap, + GIcon_miterjoin, GIcon_roundjoin, GIcon_beveljoin, + GIcon_rect, GIcon_elipse, GIcon_rrect, GIcon_poly, GIcon_star, + GIcon_pencil, GIcon_shift, GIcon_line, GIcon_hand, + GIcon_press2ptr, GIcon_freehand, GIcon_greyfree; +extern GImage GIcon_smallskew, GIcon_smallscale, GIcon_smallrotate, + GIcon_smallflip, GIcon_smalltangent, GIcon_smallcorner, + GIcon_smallcurve, GIcon_smallmag, GIcon_smallknife, GIcon_smallpen, + GIcon_smallpointer, GIcon_smallruler, GIcon_smallelipse, + GIcon_smallrect, GIcon_smallpoly, GIcon_smallstar, + GIcon_smallpencil, GIcon_smallhand, + GIcon_PfaEditLogo, GIcon_PfaEditBack, GIcon_PfaEditGuide; +extern GImage GIcon_menumark; +extern GImage GIcon_rmoverlap, GIcon_exclude, GIcon_intersection, GIcon_findinter; +extern GImage GIcon_outline, GIcon_inline, GIcon_shadow, GIcon_wireframe; +extern GImage def_image, red_image, blue_image, green_image, magenta_image, + yellow_image, cyan_image, white_image; +extern GImage GIcon_continue, GIcon_stepout, GIcon_stepover, GIcon_stepinto, + GIcon_watchpnt, GIcon_menudelta, GIcon_exit; +extern GImage GIcon_Stopped, GIcon_Stop; +extern GWindow logo_icon; + +extern GTextInfo encodingtypes[]; +extern GTextInfo *EncodingTypesFindEnc(GTextInfo *encodingtypes, int enc); +extern GTextInfo *GetEncodingTypes(void); + +extern void InitCursors(void); + +extern real GetReal(GWindow gw,int cid,char *name,int *err); +extern int GetInt(GWindow gw,int cid,char *name,int *err); +extern void Protest(char *label); +extern real GetCalmRealR(GWindow gw,int cid,int namer,int *err); +extern real GetRealR(GWindow gw,int cid,int namer,int *err); +extern int GetIntR(GWindow gw,int cid,int namer,int *err); +extern void ProtestR(int labelr); +extern void help(char *filename); + +/* I would like these to be const ints, but gcc doesn't treat them as consts */ +#define et_sb_halfup et_sb_thumbrelease+1 +#define et_sb_halfdown et_sb_thumbrelease+2 +#endif diff --git a/fontforge/prefs.c b/fontforge/prefs.c new file mode 100644 index 00000000..604879fd --- /dev/null +++ b/fontforge/prefs.c @@ -0,0 +1,1935 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "ttf.h" + +int adjustwidth = true; +int adjustlbearing = true; +int default_encoding = em_iso8859_1; +int autohint_before_rasterize = 1; +int autohint_before_generate = 1; +int ItalicConstrained=true; +int accent_offset = 6; +int GraveAcuteCenterBottom = 1; +int CharCenterHighest = 1; +int ask_user_for_resolution = true; +int stop_at_join = false; +float arrowAmount=1; +float snapdistance=3.5; +float joinsnap=0; +char *BDFFoundry=NULL; +char *TTFFoundry=NULL; +char *xuid=NULL; +char *RecentFiles[RECENT_MAX] = { NULL }; +/*struct cvshows CVShows = { 1, 1, 1, 1, 1, 0, 1 };*/ /* in charview */ +/* int default_fv_font_size = 24; */ /* in fontview */ +/* int default_fv_antialias = false */ /* in fontview */ +/* int default_fv_bbsized = false */ /* in fontview */ +extern int default_fv_showhmetrics; /* in fontview */ +extern int default_fv_showvmetrics; /* in fontview */ +extern int palettes_docked; /* in cvpalettes */ +extern int maxundoes; /* in cvundoes */ +extern int prefer_cjk_encodings; /* in parsettf */ +/* int local_encoding; */ /* in gresource.c *//* not a charset */ +static int prefs_encoding = e_unknown; +int greeknames = false; +extern int onlycopydisplayed, copymetadata; +extern struct cvshows CVShows; +extern int oldformatstate; /* in savefontdlg.c */ +extern int oldbitmapstate; /* in savefontdlg.c */ +extern int old_ttf_flags; /* in savefontdlg.c */ +extern int old_ps_flags; /* in savefontdlg.c */ +extern int old_otf_flags; /* in savefontdlg.c */ +extern int oldsystem; /* in bitmapdlg.c */ +extern int preferpotrace; /* in autotrace.c */ +extern int autotrace_ask; /* in autotrace.c */ +extern int mf_ask; /* in autotrace.c */ +extern int mf_clearbackgrounds; /* in autotrace.c */ +extern int mf_showerrors; /* in autotrace.c */ +extern char *mf_args; /* in autotrace.c */ +extern int glyph_2_name_map; /* in tottf.c */ +extern int coverageformatsallowed; /* in tottfgpos.c */ +unichar_t *script_menu_names[SCRIPT_MENU_MAX]; +char *script_filenames[SCRIPT_MENU_MAX]; +static char *xdefs_filename; +int new_em_size = 1000; +int new_fonts_are_order2 = false; +int loaded_fonts_same_as_new = false; +#if __Mac +int alwaysgenapple = true; +int alwaysgenopentype = false; +#else +int alwaysgenapple = false; +int alwaysgenopentype = true; +#endif +char *helpdir; +extern MacFeat *default_mac_feature_map, /* from macenc.c */ + *user_mac_feature_map; +int updateflex = false; + +extern int rectelipse, polystar, regular_star; /* from cvpalettes.c */ +extern int center_out; /* from cvpalettes.c */ +extern float rr_radius; /* from cvpalettes.c */ +extern int ps_pointcnt; /* from cvpalettes.c */ +extern float star_percent; /* from cvpalettes.c */ + +static int pointless; + +#define CID_Features 101 +#define CID_FeatureDel 103 +#define CID_FeatureEdit 105 + +#define CID_Mapping 102 +#define CID_MappingDel 104 +#define CID_MappingEdit 106 + +/* ************************************************************************** */ +/* ***************************** mac data ***************************** */ +/* ************************************************************************** */ + +struct macsettingname macfeat_otftag[] = { + { 1, 0, CHR('r','l','i','g') }, /* Required ligatures */ + { 1, 2, CHR('l','i','g','a') }, /* Common ligatures */ + { 1, 4, CHR('d','l','i','g') }, /* rare ligatures => discretionary */ +#if 0 + { 1, 4, CHR('h','l','i','g') }, /* rare ligatures => historic */ + { 1, 4, CHR('a','l','i','g') }, /* rare ligatures => ?ancient? */ +#endif + /* 2, 1, partially connected cursive */ + { 2, 2, CHR('i','s','o','l') }, /* Arabic forms */ + { 2, 2, CHR('c','a','l','t') }, /* ??? */ + /* 3, 2, all caps */ + /* 3, 3, all lower */ + { 3, 4, CHR('s','m','c','p') }, /* small caps */ + /* 3, 4, initial caps */ + /* 3, 5, initial caps, small caps */ + { 4, 0, CHR('v','r','t','2') }, /* vertical forms => vertical rotation */ +#if 0 + { 4, 0, CHR('v','k','n','a') }, /* vertical forms => vertical kana */ +#endif + { 6, 0, CHR('t','n','u','m') }, /* monospace numbers => Tabular numbers */ + { 10, 1, CHR('s','u','p','s') }, /* superior vertical position => superscript */ + { 10, 2, CHR('s','u','b','s') }, /* inferior vertical position => subscript */ +#if 0 + { 10, 3, CHR('s','u','p','s') }, /* ordinal vertical position => superscript */ +#endif + { 11, 1, CHR('a','f','r','c') }, /* vertical fraction => fraction ligature */ + { 11, 2, CHR('f','r','a','c') }, /* diagonal fraction => fraction ligature */ + { 16, 1, CHR('o','r','n','m') }, /* vertical fraction => fraction ligature */ + { 20, 0, CHR('t','r','a','d') }, /* traditional characters => traditional forms */ +#if 0 + { 20, 0, CHR('t','n','a','m') }, /* traditional characters => traditional names */ +#endif + { 20, 1, CHR('s','m','p','l') }, /* simplified characters */ + { 20, 2, CHR('j','p','7','8') }, /* jis 1978 */ + { 20, 3, CHR('j','p','8','3') }, /* jis 1983 */ + { 20, 4, CHR('j','p','9','0') }, /* jis 1990 */ + { 21, 0, CHR('o','n','u','m') }, /* lower case number => old style numbers */ + { 22, 0, CHR('p','w','i','d') }, /* proportional text => proportional widths */ + { 22, 2, CHR('h','w','i','d') }, /* half width text => half widths */ + { 22, 3, CHR('f','w','i','d') }, /* full width text => full widths */ + { 25, 0, CHR('f','w','i','d') }, /* full width kana => full widths */ + { 25, 1, CHR('p','w','i','d') }, /* proportional kana => proportional widths */ + { 26, 0, CHR('f','w','i','d') }, /* full width ideograph => full widths */ + { 26, 1, CHR('p','w','i','d') }, /* proportional ideograph => proportional widths */ + { 103, 0, CHR('h','w','i','d') }, /* half width cjk roman => half widths */ + { 103, 1, CHR('p','w','i','d') }, /* proportional cjk roman => proportional widths */ + { 103, 3, CHR('f','w','i','d') }, /* full width cjk roman => full widths */ + { 0, 0, 0 } +}, *user_macfeat_otftag; + +static void UserSettingsFree(void) { + + free( user_macfeat_otftag ); + user_macfeat_otftag = NULL; +} + +static int UserSettingsDiffer(void) { + int i,j; + + if ( user_macfeat_otftag==NULL ) +return( false ); + + for ( i=0; user_macfeat_otftag[i].otf_tag!=0; ++i ); + for ( j=0; macfeat_otftag[j].otf_tag!=0; ++j ); + if ( i!=j ) +return( true ); + for ( i=0; user_macfeat_otftag[i].otf_tag!=0; ++i ) { + for ( j=0; macfeat_otftag[j].otf_tag!=0; ++j ) { + if ( macfeat_otftag[j].mac_feature_type == + user_macfeat_otftag[i].mac_feature_type && + macfeat_otftag[j].mac_feature_setting == + user_macfeat_otftag[i].mac_feature_setting && + macfeat_otftag[j].otf_tag == + user_macfeat_otftag[i].otf_tag ) + break; + } + if ( macfeat_otftag[j].otf_tag==0 ) +return( true ); + } +return( false ); +} + +/**************************************************************************** */ + + +static GTextInfo localencodingtypes[] = { + { (unichar_t *) _STR_Default, NULL, 0, 0, (void *) e_unknown, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_Isolatin1, NULL, 0, 0, (void *) e_iso8859_1, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin0, NULL, 0, 0, (void *) e_iso8859_15, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin2, NULL, 0, 0, (void *) e_iso8859_2, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin3, NULL, 0, 0, (void *) e_iso8859_3, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin4, NULL, 0, 0, (void *) e_iso8859_4, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin5, NULL, 0, 0, (void *) e_iso8859_9, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin6, NULL, 0, 0, (void *) e_iso8859_10, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin7, NULL, 0, 0, (void *) e_iso8859_13, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isolatin8, NULL, 0, 0, (void *) e_iso8859_14, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_Isocyrillic, NULL, 0, 0, (void *) e_iso8859_5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Koi8cyrillic, NULL, 0, 0, (void *) e_koi8_r, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isoarabic, NULL, 0, 0, (void *) e_iso8859_6, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isogreek, NULL, 0, 0, (void *) e_iso8859_7, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isohebrew, NULL, 0, 0, (void *) e_iso8859_8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Isothai, NULL, 0, 0, (void *) e_iso8859_11, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_MacLatin, NULL, 0, 0, (void *) e_mac, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_Win, NULL, 0, 0, (void *) e_win, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_Unicode, NULL, 0, 0, (void *) e_unicode, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_UTF_8, NULL, 0, 0, (void *) e_utf8, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL, NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 1, 0 }, + { (unichar_t *) _STR_SJIS, NULL, 0, 0, (void *) e_sjis, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_KoreanWansung, NULL, 0, 0, (void *) e_wansung, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_KoreanJohab, NULL, 0, 0, (void *) e_johab, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ChineseTrad, NULL, 0, 0, (void *) e_big5, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) _STR_ChineseTradHKSCS, NULL, 0, 0, (void *) e_big5hkscs, NULL, 0, 0, 0, 0, 0, 0, 0, 1}, + { NULL }}; + +/* don't use mnemonics 'C' or 'O' (Cancel & OK) */ +enum pref_types { pr_int, pr_real, pr_bool, pr_enum, pr_encoding, pr_string, pr_file }; +struct enums { char *name; int value; }; + +struct enums fvsize_enums[] = { {NULL} }; + +static struct prefs_list { + char *name; + enum pref_types type; + void *val; + void *(*get)(void); + void (*set)(void *); + char mn; + struct enums *enums; + unsigned int dontdisplay: 1; + int popup; +} general_list[] = { + { "AutoHint", pr_bool, &autohint_before_rasterize, NULL, NULL, 'A', NULL, 0, _STR_PrefsPopupAH }, + { "LocalEncoding", pr_encoding, &prefs_encoding, NULL, NULL, 'L', NULL, 0, _STR_PrefsPopupLoc }, + { "NewCharset", pr_encoding, &default_encoding, NULL, NULL, 'N', NULL, 0, _STR_PrefsPopupForNewFonts }, + { "NewEmSize", pr_int, &new_em_size, NULL, NULL, 'S', NULL, 0, _STR_PrefsPopupNES }, + { "NewFontsQuadratic", pr_bool, &new_fonts_are_order2, NULL, NULL, 'Q', NULL, 0, _STR_PrefsPopupNOT }, + { "LoadedFontsAsNew", pr_bool, &loaded_fonts_same_as_new, NULL, NULL, 'L', NULL, 0, _STR_PrefsPopupLFN }, + { "GreekNames", pr_bool, &greeknames, NULL, NULL, 'G', NULL, 0, _STR_PrefsPopupGN }, + { "ResourceFile", pr_file, &xdefs_filename, NULL, NULL, 'R', NULL, 0, _STR_PrefsPopupXRF }, + { "HelpDir", pr_file, &helpdir, NULL, NULL, 'R', NULL, 0, _STR_PrefsPopupHLP }, + { NULL } +}, + editing_list[] = { + { "AutoWidthSync", pr_bool, &adjustwidth, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupAWS }, + { "AutoLBearingSync", pr_bool, &adjustlbearing, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupALS }, + { "ItalicConstrained", pr_bool, &ItalicConstrained, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupIC }, + { "ArrowMoveSize", pr_real, &arrowAmount, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupAA }, + { "SnapDistance", pr_real, &snapdistance, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupSD }, + { "JoinSnap", pr_real, &joinsnap, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupJS }, + { "CopyMetaData", pr_bool, ©metadata, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupCMD }, + { "UndoDepth", pr_int, &maxundoes, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupUndo }, + { "StopAtJoin", pr_bool, &stop_at_join, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupSAJ }, + { "UpdateFlex", pr_bool, &updateflex, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupUF }, + { NULL } +}, + accent_list[] = { + { "AccentOffsetPercent", pr_int, &accent_offset, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupAO }, + { "AccentCenterLowest", pr_bool, &GraveAcuteCenterBottom, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupGA }, + { "CharCenterHighest", pr_bool, &CharCenterHighest, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupCH }, + { NULL } +}, + args_list[] = { + { "PreferPotrace", pr_bool, &preferpotrace, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupPPT }, + { "AutotraceArgs", pr_string, NULL, GetAutoTraceArgs, SetAutoTraceArgs, '\0', NULL, 0, _STR_PrefsPopupATA }, + { "AutotraceAsk", pr_bool, &autotrace_ask, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupATK }, + { "MfArgs", pr_string, &mf_args, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupMFA }, + { "MfAsk", pr_bool, &mf_ask, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupMFK }, + { "MfClearBg", pr_bool, &mf_clearbackgrounds, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupMFB }, + { "MfShowErr", pr_bool, &mf_showerrors, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupMFE }, + { NULL } +}, + generate_list[] = { + { "FoundryName", pr_string, &BDFFoundry, NULL, NULL, 'F', NULL, 0, _STR_PrefsPopupFN }, + { "TTFFoundry", pr_string, &TTFFoundry, NULL, NULL, 'T', NULL, 0, _STR_PrefsPopupTFN }, + { "XUID-Base", pr_string, &xuid, NULL, NULL, 'X', NULL, 0, _STR_PrefsPopupXU }, + { "AskBDFResolution", pr_bool, &ask_user_for_resolution, NULL, NULL, 'B', NULL, 0, _STR_PrefsPopupBR }, + { "DumpGlyphMap", pr_bool, &glyph_2_name_map, NULL, NULL, '\0', NULL, 0, _STR_PrefsPopupG2N }, + { "PreferCJKEncodings", pr_bool, &prefer_cjk_encodings, NULL, NULL, 'C', NULL, 0, _STR_PrefsPopupPCE }, + { "HintForGen", pr_bool, &autohint_before_generate, NULL, NULL, 'H', NULL, 0, _STR_PrefsPopupAHG }, + { "AlwaysGenApple", pr_bool, &alwaysgenapple, NULL, NULL, 'A', NULL, 0, _STR_PrefsPopupAGA }, + { "AlwaysGenOpenType", pr_bool, &alwaysgenopentype, NULL, NULL, 'O', NULL, 0, _STR_PrefsPopupAGO }, + { NULL } +}, + hidden_list[] = { + { "AntiAlias", pr_bool, &default_fv_antialias, NULL, NULL, '\0', NULL, 1 }, + { "DefaultFVShowHmetrics", pr_int, &default_fv_showhmetrics, NULL, NULL, '\0', NULL, 1 }, + { "DefaultFVShowVmetrics", pr_int, &default_fv_showvmetrics, NULL, NULL, '\0', NULL, 1 }, + { "DefaultFVSize", pr_enum, &default_fv_font_size, NULL, NULL, 'S', fvsize_enums, 1 }, + { "OnlyCopyDisplayed", pr_bool, &onlycopydisplayed, NULL, NULL, '\0', NULL, 1 }, + { "PalettesDocked", pr_bool, &palettes_docked, NULL, NULL, '\0', NULL, 1 }, + { "MarkExtrema", pr_int, &CVShows.markextrema, NULL, NULL, '\0', NULL, 1 }, + { "DefaultScreenDpiSystem", pr_int, &oldsystem, NULL, NULL, '\0', NULL, 1 }, + { "DefaultOutputFormat", pr_int, &oldformatstate, NULL, NULL, '\0', NULL, 1 }, + { "DefaultBitmapFormat", pr_int, &oldbitmapstate, NULL, NULL, '\0', NULL, 1 }, + { "DefaultTTFflags", pr_int, &old_ttf_flags, NULL, NULL, '\0', NULL, 1 }, + { "DefaultPSflags", pr_int, &old_ps_flags, NULL, NULL, '\0', NULL, 1 }, + { "DefaultOTFflags", pr_int, &old_otf_flags, NULL, NULL, '\0', NULL, 1 }, + { "PageWidth", pr_int, &pagewidth, NULL, NULL, '\0', NULL, 1 }, + { "PageHeight", pr_int, &pageheight, NULL, NULL, '\0', NULL, 1 }, + { "PrintType", pr_int, &printtype, NULL, NULL, '\0', NULL, 1 }, + { "PrintCommand", pr_string, &printcommand, NULL, NULL, '\0', NULL, 1 }, + { "PageLazyPrinter", pr_string, &printlazyprinter, NULL, NULL, '\0', NULL, 1 }, + { "ShowRulers", pr_bool, &CVShows.showrulers, NULL, NULL, '\0', NULL, 1, _STR_PrefsPopupRulers }, + { "RegularStar", pr_bool, ®ular_star, NULL, NULL, '\0', NULL, 1 }, + { "PolyStar", pr_bool, &polystar, NULL, NULL, '\0', NULL, 1 }, + { "RectEllipse", pr_bool, &rectelipse, NULL, NULL, '\0', NULL, 1 }, + { "RectEllipseCenterOut", pr_bool, ¢er_out, NULL, NULL, '\0', NULL, 1 }, + { "PolyStartPointCnt", pr_int, &ps_pointcnt, NULL, NULL, '\0', NULL, 1 }, + { "RoundRectRadius", pr_real, &rr_radius, NULL, NULL, '\0', NULL, 1 }, + { "StarPercent", pr_real, &star_percent, NULL, NULL, '\0', NULL, 1 }, + { "CoverageFormatsAllowed", pr_int, &coverageformatsallowed, NULL, NULL, '\0', NULL, 1 }, + { NULL } +}, + oldnames[] = { + { "LocalCharset", pr_encoding, &prefs_encoding, NULL, NULL, 'L', NULL, 0, _STR_PrefsPopupLoc }, + { "DefaultTTFApple", pr_int, &pointless, NULL, NULL, '\0', NULL, 1 }, + { "AcuteCenterBottom", pr_bool, &GraveAcuteCenterBottom, NULL, NULL, '\0', NULL, 1, _STR_PrefsPopupGA }, + { NULL } +}, + *prefs_list[] = { general_list, editing_list, args_list, generate_list, hidden_list, NULL }, + *load_prefs_list[] = { general_list, editing_list, args_list, generate_list, hidden_list, oldnames, NULL }; + +struct visible_prefs_list { int tab_name; struct prefs_list *pl; } visible_prefs_list[] = { + { _STR_Generic, general_list}, + { _STR_Editing, editing_list}, + { _STR_Accents, accent_list}, + { _STR_PrefsApps, args_list}, + { _STR_PrefsFontInfo, generate_list}, + { 0 } + }; + +int GetPrefs(char *name,Val *val) { + int i,j; + + for ( i=0; prefs_list[i]!=NULL; ++i ) for ( j=0; prefs_list[i][j].name!=NULL; ++j ) { + if ( strcmp(prefs_list[i][j].name,name)==0 ) { + struct prefs_list *pf = &prefs_list[i][j]; + if ( pf->type == pr_bool || pf->type == pr_int ) { + val->type = v_int; + val->u.ival = *((int *) (pf->val)); + } else if ( pf->type == pr_real ) { + val->type = v_int; + val->u.ival = *((float *) (pf->val)); + } else if ( pf->type == pr_string || pf->type == pr_file ) { + val->type = v_str; + val->u.sval = copy( *((char **) (pf->val))); + } else +return( false ); + +return( true ); + } + } +return( false ); +} + +int SetPrefs(char *name,Val *val1, Val *val2) { + int i,j; + + for ( i=0; prefs_list[i]!=NULL; ++i ) for ( j=0; prefs_list[i][j].name!=NULL; ++j ) { + if ( strcmp(prefs_list[i][j].name,name)==0 ) { + struct prefs_list *pf = &prefs_list[i][j]; + if ( pf->type == pr_bool || pf->type == pr_int ) { + if ( (val1->type!=v_int && val1->type!=v_unicode) || val2!=NULL ) +return( -1 ); + *((int *) (pf->val)) = val1->u.ival; + } else if ( pf->type == pr_real ) { + if ( val1->type!=v_int || (val2!=NULL && val2->type!=v_int )) +return( -1 ); + *((float *) (pf->val)) = (val2==NULL ? val1->u.ival : val1->u.ival / (double) val2->u.ival); + } else if ( pf->type == pr_string || pf->type == pr_file ) { + if ( val1->type!=v_str || val2!=NULL ) +return( -1 ); + free( *((char **) (pf->val))); + *((char **) (pf->val)) = copy( val1->u.sval ); + } else +return( false ); + + SavePrefs(); +return( true ); + } + } +return( false ); +} + +static char *getPfaEditPrefs(void) { + static char *prefs=NULL; + char buffer[1025]; + + if ( prefs!=NULL ) +return( prefs ); + if ( getPfaEditDir(buffer)==NULL ) +return( NULL ); + sprintf(buffer,"%s/prefs", getPfaEditDir(buffer)); + prefs = copy(buffer); +return( prefs ); +} + +char *getPfaEditShareDir(void) { + static char *sharedir=NULL; + static int set=false; + char *pt; + int len; + + if ( set ) +return( sharedir ); + + set = true; + pt = strstr(GResourceProgramDir,"/bin"); + if ( pt==NULL ) +return( NULL ); + len = (pt-GResourceProgramDir)+strlen("/share/fontforge")+1; + sharedir = galloc(len); + strncpy(sharedir,GResourceProgramDir,pt-GResourceProgramDir); + strcpy(sharedir+(pt-GResourceProgramDir),"/share/fontforge"); +return( sharedir ); +} + +static int CheckLangDir(char *full,int sizefull,char *dir, const char *loc) { + char buffer[100]; + + if ( loc==NULL || dir==NULL ) +return(false); + + strcpy(buffer,"pfaedit-"); + strcat(buffer,loc); + strcat(buffer,".ui"); + + /*first look for full locale string (pfaedit-en_us.iso8859-1.ui) */ + GFileBuildName(dir,buffer,full,sizefull); + /* Look for language_territory */ + if ( GFileExists(full)) +return( true ); + if ( strlen(loc)>5 ) { + strcpy(buffer+13,".ui"); + GFileBuildName(dir,buffer,full,sizefull); + if ( GFileExists(full)) +return( true ); + } + /* Look for language */ + if ( strlen(loc)>2 ) { + strcpy(buffer+10,".ui"); + GFileBuildName(dir,buffer,full,sizefull); + if ( GFileExists(full)) +return( true ); + } +return( false ); +} + +static int CheckLangNoLibsDir(char *full,int sizefull,char *dir, const char *loc) { + int ret; + + if ( loc==NULL || dir==NULL || strstr(dir,"/.libs")==NULL ) +return(false); + + dir = copy(dir); + *strstr(dir,"/.libs") = '\0'; + + ret = CheckLangDir(full,sizefull,dir,loc); + free(dir); +return( ret ); +} + +static void CheckLang(void) { + /*const char *loc = setlocale(LC_MESSAGES,NULL);*/ /* This always returns "C" for me, even when it shouldn't be */ + const char *loc = getenv("LC_ALL"); + char buffer[100], full[1024]; + extern int PfaEditNomenChecksum; /* In pfaedit-ui.c */ + + if ( loc==NULL ) loc = getenv("LC_MESSAGES"); + if ( loc==NULL ) loc = getenv("LANG"); + + if ( loc==NULL ) +return; + + strcpy(buffer,"pfaedit."); + strcat(buffer,loc); + strcat(buffer,".ui"); + if ( !CheckLangDir(full,sizeof(full),GResourceProgramDir,loc) && + !CheckLangNoLibsDir(full,sizeof(full),GResourceProgramDir,loc) && +#ifdef SHAREDIR + !CheckLangDir(full,sizeof(full),SHAREDIR,loc) && +#endif + !CheckLangDir(full,sizeof(full),getPfaEditShareDir(),loc) && + !CheckLangDir(full,sizeof(full),"/usr/share/fontforge",loc) ) +return; + + GStringSetResourceFileV(full,PfaEditNomenChecksum); +} + +static int encmatch(const char *enc,int subok) { + static struct { char *name; int enc; } encs[] = { + { "US-ASCII", e_usascii }, + { "ASCII", e_usascii }, + { "ISO646-NO", e_iso646_no }, + { "ISO646-SE", e_iso646_se }, + { "LATIN1", e_iso8859_1 }, + { "ISO-8859-1", e_iso8859_1 }, + { "ISO-8859-2", e_iso8859_2 }, + { "ISO-8859-3", e_iso8859_3 }, + { "ISO-8859-4", e_iso8859_4 }, + { "ISO-8859-5", e_iso8859_4 }, + { "ISO-8859-6", e_iso8859_4 }, + { "ISO-8859-7", e_iso8859_4 }, + { "ISO-8859-8", e_iso8859_4 }, + { "ISO-8859-9", e_iso8859_4 }, + { "ISO-8859-10", e_iso8859_10 }, + { "ISO-8859-11", e_iso8859_11 }, + { "ISO-8859-13", e_iso8859_13 }, + { "ISO-8859-14", e_iso8859_14 }, + { "ISO-8859-15", e_iso8859_15 }, + { "ISO_8859-1", e_iso8859_1 }, + { "ISO_8859-2", e_iso8859_2 }, + { "ISO_8859-3", e_iso8859_3 }, + { "ISO_8859-4", e_iso8859_4 }, + { "ISO_8859-5", e_iso8859_4 }, + { "ISO_8859-6", e_iso8859_4 }, + { "ISO_8859-7", e_iso8859_4 }, + { "ISO_8859-8", e_iso8859_4 }, + { "ISO_8859-9", e_iso8859_4 }, + { "ISO_8859-10", e_iso8859_10 }, + { "ISO_8859-11", e_iso8859_11 }, + { "ISO_8859-13", e_iso8859_13 }, + { "ISO_8859-14", e_iso8859_14 }, + { "ISO_8859-15", e_iso8859_15 }, + { "ISO8859-1", e_iso8859_1 }, + { "ISO8859-2", e_iso8859_2 }, + { "ISO8859-3", e_iso8859_3 }, + { "ISO8859-4", e_iso8859_4 }, + { "ISO8859-5", e_iso8859_4 }, + { "ISO8859-6", e_iso8859_4 }, + { "ISO8859-7", e_iso8859_4 }, + { "ISO8859-8", e_iso8859_4 }, + { "ISO8859-9", e_iso8859_4 }, + { "ISO8859-10", e_iso8859_10 }, + { "ISO8859-11", e_iso8859_11 }, + { "ISO8859-13", e_iso8859_13 }, + { "ISO8859-14", e_iso8859_14 }, + { "ISO8859-15", e_iso8859_15 }, + { "ISO88591", e_iso8859_1 }, + { "ISO88592", e_iso8859_2 }, + { "ISO88593", e_iso8859_3 }, + { "ISO88594", e_iso8859_4 }, + { "ISO88595", e_iso8859_4 }, + { "ISO88596", e_iso8859_4 }, + { "ISO88597", e_iso8859_4 }, + { "ISO88598", e_iso8859_4 }, + { "ISO88599", e_iso8859_4 }, + { "ISO885910", e_iso8859_10 }, + { "ISO885911", e_iso8859_11 }, + { "ISO885913", e_iso8859_13 }, + { "ISO885914", e_iso8859_14 }, + { "ISO885915", e_iso8859_15 }, + { "8859_1", e_iso8859_1 }, + { "8859_2", e_iso8859_2 }, + { "8859_3", e_iso8859_3 }, + { "8859_4", e_iso8859_4 }, + { "8859_5", e_iso8859_4 }, + { "8859_6", e_iso8859_4 }, + { "8859_7", e_iso8859_4 }, + { "8859_8", e_iso8859_4 }, + { "8859_9", e_iso8859_4 }, + { "8859_10", e_iso8859_10 }, + { "8859_11", e_iso8859_11 }, + { "8859_13", e_iso8859_13 }, + { "8859_14", e_iso8859_14 }, + { "8859_15", e_iso8859_15 }, + { "KOI8-R", e_koi8_r }, + { "KOI8R", e_koi8_r }, + { "WINDOWS-1252", e_win }, + { "CP1252", e_win }, + { "Big5", e_big5 }, + { "Big-5", e_big5 }, + { "BigFive", e_big5 }, + { "Big-Five", e_big5 }, + { "Big5HKSCS", e_big5hkscs }, + { "Big5-HKSCS", e_big5hkscs }, + { "UTF-8", e_utf8 }, + { "ISO-10646/UTF-8", e_utf8 }, + { "ISO_10646/UTF-8", e_utf8 }, + { "UCS2", e_unicode }, + { "UCS-2", e_unicode }, + { "ISO-10646", e_unicode }, + { "ISO_10646", e_unicode }, +#if 0 + { "eucJP", e_euc }, + { "EUC-JP", e_euc }, + { "ujis", ??? }, + { "EUC-KR", e_euckorean }, +#endif + { NULL }}; + int i; + +#if HAVE_ICONV_H + iconv_t test; + free(iconv_local_encoding_name); + iconv_local_encoding_name= NULL; +#endif + + for ( i=0; encs[i].name!=NULL; ++i ) + if ( strmatch(enc,encs[i].name)==0 ) +return( encs[i].enc ); + + if ( subok ) { + for ( i=0; encs[i].name!=NULL; ++i ) + if ( strstrmatch(enc,encs[i].name)!=NULL ) +return( encs[i].enc ); + +#if HAVE_ICONV_H + /* I only try to use iconv if the encoding doesn't match one I support*/ + /* loading iconv unicode data takes a while */ + test = iconv_open(enc,"UCS2"); + if ( test==(iconv_t) (-1)) + fprintf( stderr, "Neither FontForge nor iconv() supports your encoding (%s) we will pretend\n you asked for latin1 instead.\n", enc ); + else { + fprintf( stderr, "FontForge does not support your encoding (%s), it will try to use iconv()\n or it will pretend the local encoding is latin1\n", enc ); + iconv_local_encoding_name= copy(enc); + iconv_close(test); + } +#else + fprintf( stderr, "FontForge does not support your encoding (%s), it will pretend the local encoding is latin1\n", enc ); +#endif + +return( e_iso8859_1 ); + } +return( e_unknown ); +} + +static int DefaultEncoding(void) { + const char *loc = getenv("LC_ALL"); + int enc; + + if ( loc==NULL ) loc = getenv("LC_CTYPE"); + /*if ( loc==NULL ) loc = getenv("LC_MESSAGES");*/ + if ( loc==NULL ) loc = getenv("LANG"); + + if ( loc==NULL ) +return( e_iso8859_1 ); + + enc = encmatch(loc,false); + if ( enc==e_unknown ) { + loc = strrchr(loc,'.'); + if ( loc==NULL ) +return( e_iso8859_1 ); + enc = encmatch(loc+1,true); + } + if ( enc==e_unknown ) +return( e_iso8859_1 ); + +return( enc ); +} + +static unichar_t *utf8_copy(char *src) { + unichar_t *ret = galloc((strlen(src)+1)*sizeof(unichar_t)), *pt=ret; + + while ( *src!='\0' ) { + int ch1, ch2; + ch1 = *src++; + if ( ch1<=0x7f ) + *pt++ = ch1; + else if ( (ch1&0xf0)==0xc0 ) { + *pt++ = (ch1&0x1f)<<6 | (*src++&0x3f); + } else { + ch2 = *src++; + *pt++ = (ch1&0xf)<<6 | ((ch2&0x3f)<<6) | (*src++&0x3f); + } + } + *pt = '\0'; +return( ret ); +} + +static char *cutf8_copy(unichar_t *src) { + char *ret = galloc(3*u_strlen(src)+1), *pt=ret; + + while ( *src!='\0' ) { + int ch; + ch = *src++; + if ( ch<=0x7f ) + *pt++ = ch; + else if ( ch<0x03ff ) { + *pt++ = 0xc0|(ch>>6); + *pt++ = 0x80|(ch&0x3f); + } else { + *pt++ = 0xe0|(ch>>12); + *pt++ = 0x80|((ch>>6)&0x3f); + *pt++ = 0x80|(ch&0x3f); + } + } + *pt = '\0'; +return( ret ); +} + +static void ParseMacMapping(char *pt,struct macsettingname *ms) { + char *end; + + ms->mac_feature_type = strtol(pt,&end,10); + if ( *end==',' ) ++end; + ms->mac_feature_setting = strtol(end,&end,10); + if ( *end==' ' ) ++end; + ms->otf_tag = + ((end[0]&0xff)<<24) | + ((end[1]&0xff)<<16) | + ((end[2]&0xff)<<8) | + (end[3]&0xff); +} + +static void ParseNewMacFeature(FILE *p,char *line) { + fseek(p,-(strlen(line)-strlen("MacFeat:")),SEEK_CUR); + line[strlen("MacFeat:")] ='\0'; + default_mac_feature_map = SFDParseMacFeatures(p,line); + fseek(p,-strlen(line),SEEK_CUR); + if ( user_mac_feature_map!=NULL ) + MacFeatListFree(user_mac_feature_map); + user_mac_feature_map = default_mac_feature_map; +} + +static void DefaultXUID(void) { + /* Adobe has assigned PfaEdit a base XUID of 1021. Each new user is going */ + /* to get a couple of random numbers appended to that, hoping that will */ + /* make for a fairly safe system. */ + /* FontForge will use the same scheme */ + int r1, r2; + char buffer[50]; + struct timeval tv; + + gettimeofday(&tv,NULL); + srand(tv.tv_usec); + do { + r1 = rand()&0x3ff; + } while ( r1==0 ); /* I reserve "0" for me! */ + gettimeofday(&tv,NULL); + srandom(tv.tv_usec+1); + r2 = random(); + sprintf( buffer, "1021 %d %d", r1, r2 ); + xuid = copy(buffer); +} + +static void DefaultHelp(void) { + if ( helpdir==NULL ) { +#ifdef DOCDIR + helpdir = copy(DOCDIR "/"); +#elif defined(SHAREDIR) + helpdir = copy(SHAREDIR "/../doc/fontforge/"); +#else + helpdir = copy("/usr/local/share/doc/fontforge/"); +#endif + } +} + +static void DoDefaults(void) { + DefaultXUID(); + DefaultHelp(); +} + +void LoadPrefs(void) { + char *prefs = getPfaEditPrefs(); + FILE *p; + char line[1100]; + int i, j, ri=0, mn=0, ms=0; + int msp=0, msc=0; + char *pt; + struct prefs_list *pl; + + PfaEditSetFallback(); + LoadPfaEditEncodings(); + CheckLang(); + + if ( prefs==NULL || (p=fopen(prefs,"r"))==NULL ) { + DoDefaults(); +return; + } + while ( fgets(line,sizeof(line),p)!=NULL ) { + if ( *line=='#' ) + continue; + pt = strchr(line,':'); + if ( pt==NULL ) + continue; + for ( j=0; load_prefs_list[j]!=NULL; ++j ) { + for ( i=0; load_prefs_list[j][i].name!=NULL; ++i ) + if ( strncmp(line,load_prefs_list[j][i].name,pt-line)==0 ) + break; + if ( load_prefs_list[j][i].name!=NULL ) + break; + } + pl = NULL; + if ( load_prefs_list[j]!=NULL ) + pl = &load_prefs_list[j][i]; + for ( ++pt; *pt=='\t'; ++pt ); + if ( line[strlen(line)-1]=='\n' ) + line[strlen(line)-1] = '\0'; + if ( line[strlen(line)-1]=='\r' ) + line[strlen(line)-1] = '\0'; + if ( pl==NULL ) { + if ( strncmp(line,"Recent:",strlen("Recent:"))==0 && ritype ) { + case pr_encoding: + if ( sscanf( pt, "%d", (int *) pl->val )!=1 ) { + Encoding *item; + for ( item = enclist; item!=NULL && strcmp(item->enc_name,pt)!=0; item = item->next ); + if ( item==NULL ) + *((int *) (pl->val)) = e_iso8859_1; + else + *((int *) (pl->val)) = item->enc_num; + } + break; + case pr_bool: case pr_int: + sscanf( pt, "%d", (int *) pl->val ); + break; + case pr_real: + sscanf( pt, "%f", (float *) pl->val ); + break; + case pr_string: case pr_file: + if ( *pt=='\0' ) pt=NULL; + if ( pl->val!=NULL ) + *((char **) (pl->val)) = copy(pt); + else + (pl->set)(copy(pt)); + break; + } + } + fclose(p); + DefaultHelp(); + if ( prefs_encoding==e_unknown ) + local_encoding = DefaultEncoding(); + else + local_encoding = prefs_encoding; + if ( xdefs_filename!=NULL ) + GResourceAddResourceFile(xdefs_filename,GResourceProgramName); +} + +void SavePrefs(void) { + char *prefs = getPfaEditPrefs(); + FILE *p; + int i, j, val; + char *temp; + struct prefs_list *pl; + + if ( prefs==NULL ) +return; + if ( (p=fopen(prefs,"w"))==NULL ) +return; + + for ( j=0; prefs_list[j]!=NULL; ++j ) for ( i=0; prefs_list[j][i].name!=NULL; ++i ) { + pl = &prefs_list[j][i]; + switch ( pl->type ) { + case pr_encoding: + val = *(int *) (pl->val); + if ( val=em_unicodeplanes ) + fprintf( p, "%s:\t%d\n", pl->name, val ); + else { + Encoding *item; + for ( item = enclist; item!=NULL && item->enc_num!=val; item=item->next ); + fprintf( p, "%s:\t%s\n", pl->name, item==NULL?"-1":item->enc_name ); + } + break; + case pr_bool: case pr_int: + fprintf( p, "%s:\t%d\n", pl->name, *(int *) (pl->val) ); + break; + case pr_real: + fprintf( p, "%s:\t%g\n", pl->name, (double) *(float *) (pl->val) ); + break; + case pr_string: case pr_file: + if ( (pl->val)!=NULL ) + temp = *(char **) (pl->val); + else + temp = (char *) (pl->get()); + if ( temp!=NULL ) + fprintf( p, "%s:\t%s\n", pl->name, temp ); + if ( (pl->val)==NULL ) + free(temp); + break; + } + } + + for ( i=0; i>24, + (user_macfeat_otftag[i].otf_tag>>16)&0xff, + (user_macfeat_otftag[i].otf_tag>>8)&0xff, + user_macfeat_otftag[i].otf_tag&0xff ); + } + } + + if ( UserFeaturesDiffer()) + SFDDumpMacFeat(p,default_mac_feature_map); + + fclose(p); +} + +struct pref_data { + int done; +}; + +static int Prefs_ScriptBrowse(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + GGadget *tf = GWidgetGetControl(gw,GGadgetGetCid(g)-100); + const unichar_t *cur = _GGadgetGetTitle(tf); unichar_t *ret; + static unichar_t filter[] = { '*','.','p','e', 0 }; + + if ( *cur=='\0' ) cur=NULL; + ret = GWidgetOpenFile(GStringGetResource(_STR_CallScript,NULL), cur, filter, NULL,NULL); + if ( ret==NULL ) +return(true); + GGadgetSetTitle(tf,ret); + free(ret); + } +return( true ); +} + +static int Prefs_BrowseFile(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + GGadget *tf = GWidgetGetControl(gw,GGadgetGetCid(g)-20000); + const unichar_t *cur = _GGadgetGetTitle(tf); unichar_t *ret; + + if ( *cur=='\0' ) cur=NULL; + ret = GWidgetOpenFile(GStringGetResource(_STR_CallScript,NULL), cur, NULL, NULL,NULL); + if ( ret==NULL ) +return(true); + GGadgetSetTitle(tf,ret); + free(ret); + } +return( true ); +} + +static GTextInfo *Pref_MappingList(int use_user) { + struct macsettingname *msn = use_user && user_macfeat_otftag!=NULL ? + user_macfeat_otftag : + macfeat_otftag; + GTextInfo *ti; + int i; + char buf[60]; + + for ( i=0; msn[i].otf_tag!=0; ++i ); + ti = gcalloc(i+1,sizeof( GTextInfo )); + + for ( i=0; msn[i].otf_tag!=0; ++i ) { + sprintf(buf,"%3d,%2d %c%c%c%c", + msn[i].mac_feature_type, msn[i].mac_feature_setting, + msn[i].otf_tag>>24, (msn[i].otf_tag>>16)&0xff, (msn[i].otf_tag>>8)&0xff, msn[i].otf_tag&0xff ); + ti[i].text = uc_copy(buf); + } +return( ti ); +} + +void GListAddStr(GGadget *list,unichar_t *str, void *ud) { + int32 i,len; + GTextInfo **ti = GGadgetGetList(list,&len); + GTextInfo **replace = galloc((len+2)*sizeof(GTextInfo *)); + + replace[len+1] = gcalloc(1,sizeof(GTextInfo)); + for ( i=0; itext = u_copy(ti[i]->text); + } + replace[i] = gcalloc(1,sizeof(GTextInfo)); + replace[i]->fg = replace[i]->bg = COLOR_DEFAULT; + replace[i]->text = str; + replace[i]->userdata = ud; + GGadgetSetList(list,replace,false); +} + +void GListReplaceStr(GGadget *list,int index, unichar_t *str, void *ud) { + int32 i,len; + GTextInfo **ti = GGadgetGetList(list,&len); + GTextInfo **replace = galloc((len+2)*sizeof(GTextInfo *)); + + for ( i=0; itext = u_copy(ti[i]->text); + } + replace[i] = gcalloc(1,sizeof(GTextInfo)); + replace[index]->text = str; + replace[index]->userdata = ud; + GGadgetSetList(list,replace,false); +} + +struct setdata { + GWindow gw; + GGadget *list; + GGadget *flist; + GGadget *feature; + GGadget *set_code; + GGadget *otf; + GGadget *ok; + GGadget *cancel; + int index; + int done; + unichar_t *ret; +}; + +static int set_e_h(GWindow gw, GEvent *event) { + struct setdata *sd = GDrawGetUserData(gw); + int i; + int32 len; + GTextInfo **ti; + const unichar_t *ret1; unichar_t *end; + int on, feat, val1, val2; + unichar_t ubuf[4]; + char buf[40]; + + if ( event->type==et_close ) { + sd->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("prefs.html#Features"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + if ( event->u.control.g == sd->cancel ) { + sd->done = true; + } else if ( event->u.control.g == sd->ok ) { + ret1 = _GGadgetGetTitle(sd->set_code); + on = u_strtol(ret1,&end,10); + if ( *end!='\0' ) { + GWidgetErrorR(_STR_BadNumber,_STR_BadNumber); +return( true ); + } + ret1 = _GGadgetGetTitle(sd->feature); + feat = u_strtol(ret1,&end,10); + if ( *end!='\0' && *end!=' ' ) { + GWidgetErrorR(_STR_BadNumber,_STR_BadNumber); +return( true ); + } + ti = GGadgetGetList(sd->list,&len); + for ( i=0; iindex ) { + val1 = u_strtol(ti[i]->text,&end,10); + val2 = u_strtol(end+1,NULL,10); + if ( val1==feat && val2==on ) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; + if ( GWidgetAskR(_STR_ThisSettingCodeIsAlreadyUsed,buts,0,1,_STR_ThisSettingCodeIsAlreadyUsedReuse)==1 ) +return( true ); + } + } + + ret1 = _GGadgetGetTitle(sd->otf); + if ( (ubuf[0] = ret1[0])==0 ) + ubuf[0] = ubuf[1] = ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[1] = ret1[1])==0 ) + ubuf[1] = ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[2] = ret1[2])==0 ) + ubuf[2] = ubuf[3] = ' '; + else if ( (ubuf[3] = ret1[3])==0 ) + ubuf[3] = ' '; + len = u_strlen(ret1); + if ( len<2 || len>4 || ubuf[0]>=0x7f || ubuf[1]>=0x7f || ubuf[2]>=0x7f || ubuf[3]>=0x7f ) { + GWidgetErrorR(_STR_TagTooLong,_STR_FeatureTagTooLong); +return( true ); + } + sprintf(buf,"%3d,%2d %c%c%c%c", + feat, on, + ubuf[0], ubuf[1], ubuf[2], ubuf[3]); + sd->done = true; + sd->ret = uc_copy(buf); + } + } +return( true ); +} + +static unichar_t *AskSetting(struct macsettingname *temp,GGadget *list, int index,GGadget *flist) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[17]; + GTextInfo label[17]; + struct setdata sd; + char buf[20]; + unichar_t ubuf3[6]; + int32 len, i; + GTextInfo **ti; + + memset(&sd,0,sizeof(sd)); + sd.list = list; + sd.flist = flist; + sd.index = index; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<mac_feature_setting ); + label[3].text = (unichar_t *) buf; + label[3].text_is_1byte = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = gcd[1].gd.pos.x; gcd[3].gd.pos.y = gcd[2].gd.pos.y-4; gcd[3].gd.pos.width = 50; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].creator = GTextFieldCreate; + + label[4].text = (unichar_t *) _STR_TagC; + label[4].text_in_resource = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.pos.x = 5; gcd[4].gd.pos.y = gcd[3].gd.pos.y+26; + gcd[4].gd.flags = gg_enabled|gg_visible; + gcd[4].creator = GLabelCreate; + + ubuf3[0] = temp->otf_tag>>24; ubuf3[1] = (temp->otf_tag>>16)&0xff; ubuf3[2] = (temp->otf_tag>>8)&0xff; ubuf3[3] = temp->otf_tag&0xff; ubuf3[4] = 0; + label[5].text = ubuf3; + gcd[5].gd.label = &label[5]; + gcd[5].gd.pos.x = gcd[3].gd.pos.x; gcd[5].gd.pos.y = gcd[4].gd.pos.y-4; gcd[5].gd.pos.width = 50; + gcd[5].gd.flags = gg_enabled|gg_visible; + /*gcd[5].gd.u.list = tags;*/ + gcd[5].creator = GTextFieldCreate; + + gcd[6].gd.pos.x = 13-3; gcd[6].gd.pos.y = gcd[5].gd.pos.y+30; + gcd[6].gd.pos.width = -1; gcd[6].gd.pos.height = 0; + gcd[6].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[6].text = (unichar_t *) _STR_OK; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + /*gcd[6].gd.handle_controlevent = Prefs_Ok;*/ + gcd[6].creator = GButtonCreate; + + gcd[7].gd.pos.x = -13; gcd[7].gd.pos.y = gcd[7-1].gd.pos.y+3; + gcd[7].gd.pos.width = -1; gcd[7].gd.pos.height = 0; + gcd[7].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[7].text = (unichar_t *) _STR_Cancel; + label[7].text_in_resource = true; + gcd[7].gd.label = &label[7]; + gcd[7].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + sd.feature = gcd[1].ret; + sd.set_code = gcd[3].ret; + sd.otf = gcd[13].ret; + sd.ok = gcd[14].ret; + sd.cancel = gcd[15].ret; + + ti = GGadgetGetList(flist,&len); + GGadgetSetList(sd.feature,ti,true); + for ( i=0; itext,NULL,10); + if ( val==temp->mac_feature_type ) { + GGadgetSetTitle(sd.feature,ti[i]->text); + break; + } + } + + GDrawSetVisible(gw,true); + GWidgetIndicateFocusGadget(gcd[1].ret); + while ( !sd.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + +return( sd.ret ); +} + +static void ChangeSetting(GGadget *list,int index,GGadget *flist) { + struct macsettingname temp; + int32 len; + GTextInfo **ti = GGadgetGetList(list,&len); + char *str; + unichar_t *ustr; + + str = cu_copy(ti[index]->text); + ParseMacMapping(str,&temp); + free(str); + if ( (ustr=AskSetting(&temp,list,index,flist))==NULL ) +return; + GListReplaceStr(list,index,ustr,NULL); +} + +static int Pref_NewMapping(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + GGadget *list = GWidgetGetControl(gw,CID_Mapping); + GGadget *flist = GWidgetGetControl(GDrawGetParentWindow(gw),CID_Features); + struct macsettingname temp; + unichar_t *str; + + memset(&temp,0,sizeof(temp)); + temp.mac_feature_type = -1; + if ( (str=AskSetting(&temp,list,-1,flist))==NULL ) +return( true ); + GListAddStr(list,str,NULL); + free(str); + } +return( true ); +} + +static int Pref_DelMapping(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + GListDelSelected(GWidgetGetControl(gw,CID_Mapping)); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_MappingDel),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_MappingEdit),false); + } +return( true ); +} + +static int Pref_EditMapping(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GDrawGetParentWindow(GGadgetGetWindow(g)); + GGadget *list = GWidgetGetControl(gw,CID_Mapping); + GGadget *flist = GWidgetGetControl(gw,CID_Features); + ChangeSetting(list,GGadgetGetFirstListSelectedItem(list),flist); + } +return( true ); +} + +static int Pref_MappingSel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + int32 len; + GTextInfo **ti = GGadgetGetList(g,&len); + GWindow gw = GGadgetGetWindow(g); + int i, sel_cnt=0; + for ( i=0; iselected ) ++sel_cnt; + GGadgetSetEnabled(GWidgetGetControl(gw,CID_MappingDel),sel_cnt!=0); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_MappingEdit),sel_cnt==1); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + GGadget *flist = GWidgetGetControl( GDrawGetParentWindow(GGadgetGetWindow(g)),CID_Features); + ChangeSetting(g,e->u.control.u.list.changed_index!=-1?e->u.control.u.list.changed_index: + GGadgetGetFirstListSelectedItem(g),flist); + } +return( true ); +} + +static int Pref_DefaultMapping(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GGadget *list = GWidgetGetControl(GGadgetGetWindow(g),CID_Mapping); + GTextInfo *ti, **arr; + uint16 cnt; + + ti = Pref_MappingList(false); + arr = GTextInfoArrayFromList(ti,&cnt); + GGadgetSetList(list,arr,false); + GTextInfoListFree(ti); + } +return( true ); +} + +static int Prefs_Ok(GGadget *g, GEvent *e) { + int i, j, mi; + int err=0, enc; + struct pref_data *p; + GWindow gw; + const unichar_t *ret; + int lc=-1; + GTextInfo *ti; + const unichar_t *names[SCRIPT_MENU_MAX], *scripts[SCRIPT_MENU_MAX]; + struct prefs_list *pl; + GTextInfo **list; + int len, maxl, t; + char *str; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + gw = GGadgetGetWindow(g); + p = GDrawGetUserData(gw); + for ( i=0; idontdisplay ) + continue; + if ( pl->type==pr_int ) { + GetInt(gw,j*1000+1000+i,pl->name,&err); + } else if ( pl->type==pr_int ) { + GetReal(gw,j*1000+1000+i,pl->name,&err); + } else if ( pl->val == &prefs_encoding ) { + enc = GGadgetGetFirstListSelectedItem(GWidgetGetControl(gw,j*1000+1000+i)); + lc = (int) (localencodingtypes[enc].userdata); + if ( lc!=e_unknown ) + prefs_encoding = lc; + else if ( prefs_encoding!=e_unknown ) { + lc = DefaultEncoding(); + prefs_encoding = e_unknown; + } else + lc = local_encoding; + } + } + if ( err ) +return( true ); + + if ( lc!=-1 ) { + local_encoding = lc; /* must be done early, else strings don't convert */ + } + + for ( j=0; visible_prefs_list[j].tab_name!=0; ++j ) for ( i=0; visible_prefs_list[j].pl[i].name!=NULL; ++i ) { + pl = &visible_prefs_list[j].pl[i]; + if ( pl->dontdisplay ) + continue; + switch( pl->type ) { + case pr_int: + *((int *) (pl->val)) = GetInt(gw,j*1000+1000+i,pl->name,&err); + break; + case pr_bool: + *((int *) (pl->val)) = GGadgetIsChecked(GWidgetGetControl(gw,j*1000+1000+i)); + break; + case pr_real: + *((float *) (pl->val)) = GetReal(gw,j*1000+1000+i,pl->name,&err); + break; + case pr_encoding: + if ( pl->val==&prefs_encoding ) + continue; + enc = GGadgetGetFirstListSelectedItem(GWidgetGetControl(gw,j*1000+1000+i)); + ti = GGadgetGetListItem(GWidgetGetControl(gw,j*1000+1000+i),enc); + *((int *) (pl->val)) = (int) (ti->userdata); + break; + case pr_string: case pr_file: + ret = _GGadgetGetTitle(GWidgetGetControl(gw,j*1000+1000+i)); + if ( pl->val!=NULL ) { + free( *((char **) (pl->val)) ); + *((char **) (pl->val)) = NULL; + if ( ret!=NULL && *ret!='\0' ) + *((char **) (pl->val)) = /* u2def_*/ cu_copy(ret); + } else { + char *cret = cu_copy(ret); + (pl->set)(cret); + free(cret); + } + break; + } + } + for ( i=0; itext); + if ( t>maxl ) maxl = t; + } + str = galloc(maxl+3); + for ( i=0; itext,maxl+1,e_mac); + ParseMacMapping(str,&user_macfeat_otftag[i]); + } + free(str); + + Prefs_ReplaceMacFeatures(GWidgetGetControl(gw,CID_Features)); + + if ( xuid!=NULL ) { + char *pt; + for ( pt=xuid; *pt==' ' ; ++pt ); + if ( *pt=='[' ) { /* People who know PS well, might want to put brackets arround the xuid base array, but I don't want them */ + pt = copy(pt+1); + free( xuid ); + xuid = pt; + } + for ( pt=xuid+strlen(xuid)-1; pt>xuid && *pt==' '; --pt ); + if ( pt >= xuid && *pt==']' ) *pt = '\0'; + } + + p->done = true; + SavePrefs(); + if ( maxundoes==0 ) { FontView *fv; + for ( fv=fv_list ; fv!=NULL; fv=fv->next ) + SFRemoveUndoes(fv->sf,NULL); + } + } +return( true ); +} + +static int Prefs_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct pref_data *p = GDrawGetUserData(GGadgetGetWindow(g)); + MacFeatListFree(GGadgetGetUserData((GWidgetGetControl( + GGadgetGetWindow(g),CID_Features)))); + p->done = true; + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct pref_data *p = GDrawGetUserData(gw); + p->done = true; + MacFeatListFree(GGadgetGetUserData((GWidgetGetControl(gw,CID_Features)))); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("prefs.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +void DoPrefs(void) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData *pgcd, gcd[5], sgcd[45], mgcd[3], mfgcd[9], msgcd[9]; + GTextInfo *plabel, **list, label[5], slabel[45], *plabels[10], mflabels[9], mslabels[9]; + GTabInfo aspects[9], subaspects[3]; + struct pref_data p; + int i, gc, sgc, j, k, line, line_max, llen, y, y2, ii; + char buf[20]; + int gcnt[20]; + static unichar_t nullstr[] = { 0 }; + struct prefs_list *pl; + char *tempstr; + static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + FontRequest rq; + GFont *font; + + MfArgsInit(); + for ( k=line_max=0; visible_prefs_list[k].tab_name!=0; ++k ) { + for ( i=line=gcnt[k]=0; visible_prefs_list[k].pl[i].name!=NULL; ++i ) { + if ( visible_prefs_list[k].pl[i].dontdisplay ) + continue; + gcnt[k] += 2; + if ( visible_prefs_list[k].pl[i].type==pr_bool ) ++gcnt[k]; + else if ( visible_prefs_list[k].pl[i].type==pr_file ) ++gcnt[k]; + ++line; + } + if ( visible_prefs_list[k].pl == args_list ) { + gcnt[k] += 6; + line += 6; + } + if ( line>line_max ) line_max = line; + } + + memset(&p,'\0',sizeof(p)); + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<dontdisplay ) + continue; + plabel[gc].text = (unichar_t *) pl->name; + plabel[gc].text_is_1byte = true; + pgcd[gc].gd.label = &plabel[gc]; + pgcd[gc].gd.mnemonic = pl->mn; + pgcd[gc].gd.popup_msg = GStringGetResource(pl->popup,NULL); + pgcd[gc].gd.pos.x = 8; + pgcd[gc].gd.pos.y = y + 6; + pgcd[gc].gd.flags = gg_visible | gg_enabled; + pgcd[gc++].creator = GLabelCreate; + + plabel[gc].text_is_1byte = true; + pgcd[gc].gd.label = &plabel[gc]; + pgcd[gc].gd.mnemonic = pl->mn; + pgcd[gc].gd.popup_msg = GStringGetResource(pl->popup,NULL); + pgcd[gc].gd.pos.x = 110; + pgcd[gc].gd.pos.y = y; + pgcd[gc].gd.flags = gg_visible | gg_enabled; + pgcd[gc].gd.cid = k*1000+1000+i; + switch ( pl->type ) { + case pr_bool: + plabel[gc].text = (unichar_t *) "On"; + pgcd[gc].gd.pos.y += 3; + pgcd[gc++].creator = GRadioCreate; + pgcd[gc] = pgcd[gc-1]; + pgcd[gc].gd.pos.x += 50; + pgcd[gc].gd.cid = 0; + pgcd[gc].gd.label = &plabel[gc]; + plabel[gc].text = (unichar_t *) "Off"; + plabel[gc].text_is_1byte = true; + if ( *((int *) pl->val)) + pgcd[gc-1].gd.flags |= gg_cb_on; + else + pgcd[gc].gd.flags |= gg_cb_on; + ++gc; + y += 22; + break; + case pr_int: + sprintf(buf,"%d", *((int *) pl->val)); + plabel[gc].text = (unichar_t *) copy( buf ); + pgcd[gc++].creator = GTextFieldCreate; + y += 26; + break; + case pr_real: + sprintf(buf,"%g", *((float *) pl->val)); + plabel[gc].text = (unichar_t *) copy( buf ); + pgcd[gc++].creator = GTextFieldCreate; + y += 26; + break; + case pr_encoding: + if ( pl->val==&prefs_encoding ) { + pgcd[gc].gd.u.list = localencodingtypes; + pgcd[gc].gd.label = EncodingTypesFindEnc(localencodingtypes, + *(int *) pl->val); + } else { + pgcd[gc].gd.u.list = GetEncodingTypes(); + pgcd[gc].gd.label = EncodingTypesFindEnc(pgcd[gc].gd.u.list, + *(int *) pl->val); + } + for ( ii=0; pgcd[gc].gd.u.list[ii].text!=NULL ||pgcd[gc].gd.u.list[ii].line; ++ii ) + if ( pgcd[gc].gd.u.list[ii].userdata==(void *) em_unicodeplanes ) + pgcd[gc].gd.u.list[ii].disabled = true; + pgcd[gc].gd.pos.width = 160; + if ( pgcd[gc].gd.label==NULL ) pgcd[gc].gd.label = &encodingtypes[0]; + pgcd[gc++].creator = GListButtonCreate; + y += 28; + break; + case pr_string: case pr_file: + if ( pl->set==SetAutoTraceArgs || ((char **) pl->val)==&mf_args ) + pgcd[gc].gd.pos.width = 160; + if ( pl->val!=NULL ) + tempstr = *((char **) (pl->val)); + else + tempstr = (char *) ((pl->get)()); + if ( tempstr!=NULL ) + plabel[gc].text = /* def2u_*/ uc_copy( tempstr ); + else if ( ((char **) pl->val)==&BDFFoundry ) + plabel[gc].text = /* def2u_*/ uc_copy( "FontForge" ); + else + plabel[gc].text = /* def2u_*/ uc_copy( "" ); + plabel[gc].text_is_1byte = false; + pgcd[gc++].creator = GTextFieldCreate; + if ( pl->type==pr_file ) { + pgcd[gc] = pgcd[gc-1]; + pgcd[gc-1].gd.pos.width = 140; + pgcd[gc].gd.pos.x += 145; + pgcd[gc].gd.cid += 20000; + pgcd[gc].gd.label = &plabel[gc]; + plabel[gc].text = (unichar_t *) "..."; + plabel[gc].text_is_1byte = true; + pgcd[gc].gd.handle_controlevent = Prefs_BrowseFile; + pgcd[gc++].creator = GButtonCreate; + } + y += 26; + if ( pl->val==NULL ) + free(tempstr); + break; + } + ++line; + } + if ( visible_prefs_list[k].pl == args_list ) { + static int text[] = { _STR_PrefsAppNotice1, _STR_PrefsAppNotice2, + _STR_PrefsAppNotice3, _STR_PrefsAppNotice4, + _STR_PrefsAppNotice5, _STR_PrefsAppNotice6, 0 }; + y += 8; + for ( i=0; text[i]!=0; ++i ) { + plabel[gc].text = (unichar_t *) text[i]; + plabel[gc].text_in_resource = true; + pgcd[gc].gd.label = &plabel[gc]; + pgcd[gc].gd.pos.x = 8; + pgcd[gc].gd.pos.y = y; + pgcd[gc].gd.flags = gg_visible | gg_enabled; + pgcd[gc++].creator = GLabelCreate; + y += 12; + } + } + if ( y>y2 ) y2 = y; + } + + aspects[k].text = (unichar_t *) _STR_ScriptMenu; + aspects[k].text_in_resource = true; + aspects[k++].gcd = sgcd; + + subaspects[0].text = (unichar_t *) _STR_Features; + subaspects[0].text_in_resource = true; + subaspects[0].gcd = mfgcd; + + subaspects[1].text = (unichar_t *) _STR_MappingB; + subaspects[1].text_in_resource = true; + subaspects[1].gcd = msgcd; + + mgcd[0].gd.pos.x = 4; gcd[0].gd.pos.y = 6; + mgcd[0].gd.pos.width = GDrawPixelsToPoints(NULL,pos.width)-20; + mgcd[0].gd.pos.height = y2; + mgcd[0].gd.u.tabs = subaspects; + mgcd[0].gd.flags = gg_visible | gg_enabled; + mgcd[0].creator = GTabSetCreate; + + aspects[k].text = (unichar_t *) _STR_Mac; + aspects[k].text_in_resource = true; + aspects[k++].gcd = mgcd; + + gc = 0; + + gcd[gc].gd.pos.x = gcd[gc].gd.pos.y = 2; + gcd[gc].gd.pos.width = pos.width-4; gcd[gc].gd.pos.height = pos.height-2; + gcd[gc].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + gcd[gc++].creator = GGroupCreate; + + gcd[gc].gd.pos.x = 4; gcd[gc].gd.pos.y = 6; + gcd[gc].gd.pos.width = GDrawPixelsToPoints(NULL,pos.width)-8; + gcd[gc].gd.pos.height = y2+20+18+4; + gcd[gc].gd.u.tabs = aspects; + gcd[gc].gd.flags = gg_visible | gg_enabled; + gcd[gc++].creator = GTabSetCreate; + + y = gcd[gc-1].gd.pos.y+gcd[gc-1].gd.pos.height; + + gcd[gc].gd.pos.x = 30-3; gcd[gc].gd.pos.y = y+5-3; + gcd[gc].gd.pos.width = -1; gcd[gc].gd.pos.height = 0; + gcd[gc].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[gc].text = (unichar_t *) _STR_OK; + label[gc].text_in_resource = true; + gcd[gc].gd.mnemonic = 'O'; + gcd[gc].gd.label = &label[gc]; + gcd[gc].gd.handle_controlevent = Prefs_Ok; + gcd[gc++].creator = GButtonCreate; + + gcd[gc].gd.pos.x = -30; gcd[gc].gd.pos.y = gcd[gc-1].gd.pos.y+3; + gcd[gc].gd.pos.width = -1; gcd[gc].gd.pos.height = 0; + gcd[gc].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[gc].text = (unichar_t *) _STR_Cancel; + label[gc].text_in_resource = true; + gcd[gc].gd.label = &label[gc]; + gcd[gc].gd.mnemonic = 'C'; + gcd[gc].gd.handle_controlevent = Prefs_Cancel; + gcd[gc++].creator = GButtonCreate; + + y = GDrawPointsToPixels(NULL,y+37); + gcd[0].gd.pos.height = y-4; + + GGadgetsCreate(gw,gcd); + GTextInfoListFree(mfgcd[0].gd.u.list); + GTextInfoListFree(msgcd[0].gd.u.list); + + memset(&rq,0,sizeof(rq)); + rq.family_name = monospace; + rq.point_size = 12; + rq.weight = 400; + font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GGadgetSetFont(mfgcd[0].ret,font); + GGadgetSetFont(msgcd[0].ret,font); + if ( y!=pos.height ) + GDrawResize(gw,pos.width,y ); + + for ( k=0; visible_prefs_list[k].tab_name!=0; ++k ) for ( gc=0,i=0; visible_prefs_list[k].pl[i].name!=NULL; ++i ) { + pl = &visible_prefs_list[k].pl[i]; + if ( pl->dontdisplay ) + continue; + switch ( pl->type ) { + case pr_bool: + ++gc; + break; + case pr_encoding: { + GGadget *g = aspects[k].gcd[gc+1].ret; + list = GGadgetGetList(g,&llen); + for ( j=0; jtext!=NULL && + (void *) ( *((int *) pl->val)) == list[j]->userdata ) + list[j]->selected = true; + else + list[j]->selected = false; + } + if ( aspects[k].gcd[gc+1].gd.u.list!=encodingtypes && aspects[k].gcd[gc+1].gd.u.list!=localencodingtypes ) + GTextInfoListFree(aspects[k].gcd[gc+1].gd.u.list); + } break; + case pr_string: case pr_file: case pr_int: case pr_real: + free(plabels[k][gc+1].text); + if ( pl->type==pr_file ) + ++gc; + break; + } + gc += 2; + } + + for ( k=0; visible_prefs_list[k].tab_name!=0; ++k ) { + free(aspects[k].gcd); + free(plabels[k]); + } + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !p.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); +} + +void RecentFilesRemember(char *filename) { + int i; + + for ( i=0; i0; --i ) + RecentFiles[i] = RecentFiles[i-1]; + RecentFiles[0] = copy(filename); + } + SavePrefs(); +} diff --git a/fontforge/print.c b/fontforge/print.c new file mode 100644 index 00000000..cf9e9e0a --- /dev/null +++ b/fontforge/print.c @@ -0,0 +1,3083 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include +#include "utype.h" +#include +#include +#include + +enum { pt_lp, pt_lpr, pt_ghostview, pt_file, pt_other, pt_unknown=-1 }; +int pagewidth = 595, pageheight=792; /* Minimum size for US Letter, A4 paper, should work for either */ +char *printlazyprinter=NULL; +char *printcommand=NULL; +int printtype = pt_unknown; +static int use_gv; + +typedef struct printinfo { + FontView *fv; + MetricsView *mv; + SplineFont *sf; + SplineChar *sc; + enum printtype { pt_fontdisplay, pt_chars, pt_multisize, pt_fontsample } pt; + int pointsize; + int32 *pointsizes; + int extrahspace, extravspace; + FILE *out; + FILE *fontfile; + int cidcnt; + char psfontname[300]; + unsigned int showvm: 1; + unsigned int twobyte: 1; + unsigned int iscjk: 1; + unsigned int iscid: 1; + unsigned int overflow: 1; + unsigned int done: 1; + int ypos; + int max; /* max chars per line */ + int chline; /* High order bits of characters we're outputting */ + int page; + int lastbase; + real xoff, yoff, scale; + GWindow gw; + GWindow setup; + char *printer; + int copies; + int pagewidth, pageheight, printtype; +} PI; + +static struct printdefaults { + enum charset last_cs; + enum printtype pt; + int pointsize; + unichar_t *text; +} pdefs[] = { { em_none, pt_fontdisplay }, { em_none, pt_chars }, { em_none, pt_fontsample }}; +/* defaults for print from fontview, charview, metricsview */ + +static void DumpIdentCMap(PI *pi) { + SplineFont *sf = pi->sf; + int i, j, k, max; + + max = 0; + for ( i=0; isubfontcnt; ++i ) + if ( sf->subfonts[i]->charcnt>max ) max = sf->subfonts[i]->charcnt; + pi->cidcnt = max; + + fprintf( pi->out, "%%%%BeginResource: CMap (Noop)\n" ); + fprintf( pi->out, "%%!PS-Adobe-3.0 Resource-CMap\n" ); + fprintf( pi->out, "%%%%BeginResource: CMap (Noop)\n" ); + fprintf( pi->out, "%%%%DocumentNeededResources: ProcSet (CIDInit)\n" ); + fprintf( pi->out, "%%%%IncludeResource: ProcSet (CIDInit)\n" ); + fprintf( pi->out, "%%%%BeginResource: CMap (Noop)\n" ); + fprintf( pi->out, "%%%%Title: (Noop %s %s %d)\n", sf->cidregistry, sf->ordering, sf->supplement ); + fprintf( pi->out, "%%%%EndComments\n" ); + + fprintf( pi->out, "/CIDInit /ProcSet findresource begin\n" ); + + fprintf( pi->out, "12 dict begin\n" ); + + fprintf( pi->out, "begincmap\n" ); + + fprintf( pi->out, "/CIDSystemInfo 3 dict dup begin\n" ); + fprintf( pi->out, " /Registry (%s) def\n", sf->cidregistry ); + fprintf( pi->out, " /Ordering (%s) def\n", sf->ordering ); + fprintf( pi->out, " /Supplement %d def\n", sf->supplement ); + fprintf( pi->out, "end def\n" ); + + fprintf( pi->out, "/CMapName /Noop def\n" ); + fprintf( pi->out, "/CMapVersion 1.0 def\n" ); + fprintf( pi->out, "/CMapType 1 def\n" ); + + fprintf( pi->out, "1 begincodespacerange\n" ); + fprintf( pi->out, " <0000> <%04x>\n", ((max+255)&0xffff00)-1 ); + fprintf( pi->out, "endcodespacerange\n" ); + + for ( j=0; j<=max/256; j += 100 ) { + k = ( max/256-j > 100 )? 100 : max/256-j; + fprintf(pi->out, "%d begincidrange\n", k ); + for ( i=0; iout, " <%04x> <%04x> %d\n", (j+i)<<8, ((j+i)<<8)|0xff, (j+i)<<8 ); + fprintf( pi->out, "endcidrange\n\n" ); + } + + fprintf( pi->out, "endcmap\n" ); + fprintf( pi->out, "CMapName currentdict /CMap defineresource pop\n" ); + fprintf( pi->out, "end\nend\n" ); + + fprintf( pi->out, "%%%%EndResource\n" ); + fprintf( pi->out, "%%%%EOF\n" ); + fprintf( pi->out, "%%%%EndResource\n" ); +} + +static void dump_prologue(PI *pi) { + time_t now; + int ch, i, j, base; + const char *author = GetAuthor(); + + fprintf( pi->out, "%%!PS-Adobe-3.0\n" ); + fprintf( pi->out, "%%%%BoundingBox: 40 20 %d %d\n", pi->pagewidth-30, pi->pageheight-20 ); + fprintf( pi->out, "%%%%Creator: FontForge\n" ); + time(&now); + fprintf( pi->out, "%%%%CreationDate: %s", ctime(&now) ); + fprintf( pi->out, "%%%%DocumentData: %s\n", !pi->iscid ||pi->fontfile==NULL? + "Clean7Bit":"Binary" ); + if ( author!=NULL ) + fprintf( pi->out, "%%%%For: %s\n", author); + fprintf( pi->out, "%%%%LanguageLevel: %d\n", pi->fontfile==NULL?1: + pi->iscid?3: pi->twobyte?2: 1 ); + fprintf( pi->out, "%%%%Orientation: Portrait\n" ); + fprintf( pi->out, "%%%%Pages: atend\n" ); + if ( pi->pt==pt_fontdisplay ) { + fprintf( pi->out, "%%%%Title: Font Display for %s\n", pi->sf->fullname ); + fprintf( pi->out, "%%%%DocumentSuppliedResources: font %s\n", pi->sf->fontname ); + } else if ( pi->pt==pt_fontdisplay ) { + fprintf( pi->out, "%%%%Title: Text Sample of %s\n", pi->sf->fullname ); + fprintf( pi->out, "%%%%DocumentSuppliedResources: font %s\n", pi->sf->fontname ); + } else if ( pi->sc!=NULL ) + fprintf( pi->out, "%%%%Title: Character Display for %s from %s\n", pi->sc->name, pi->sf->fullname ); + else + fprintf( pi->out, "%%%%Title: Character Displays from %s\n", pi->sf->fullname ); + fprintf( pi->out, "%%%%DocumentNeededResources: font Times-Bold\n" ); + if ( pi->sf->encoding_name == em_unicode || pi->sf->encoding_name==em_unicode4 ) + fprintf( pi->out, "%%%%DocumentNeededResources: font ZapfDingbats\n" ); + if ( pi->iscid && pi->fontfile!=NULL ) + fprintf( pi->out, "%%%%DocumentNeededResources: ProcSet (CIDInit)\n" ); + fprintf( pi->out, "%%%%EndComments\n\n" ); + + fprintf( pi->out, "%%%%BeginSetup\n" ); + fprintf( pi->out, "<< /PageSize [%d %d] >> setpagedevice\n", pi->pagewidth, pi->pageheight ); + + fprintf( pi->out, "%% font_remap ; from the cookbook\n" ); + fprintf( pi->out, "/reencodedict 5 dict def\n" ); + fprintf( pi->out, "/font_remap { reencodedict begin\n" ); + fprintf( pi->out, " /newencoding exch def\n" ); + fprintf( pi->out, " /basefont exch def\n" ); + fprintf( pi->out, " /newfont basefont maxlength dict def\n" ); + fprintf( pi->out, " basefont {\n" ); + fprintf( pi->out, " exch dup dup /FID ne exch /Encoding ne and\n" ); + fprintf( pi->out, " { exch newfont 3 1 roll put }\n" ); + fprintf( pi->out, " { pop pop }\n" ); + fprintf( pi->out, " ifelse\n" ); + fprintf( pi->out, " } forall\n" ); + fprintf( pi->out, " newfont /Encoding newencoding put\n" ); + fprintf( pi->out, " /foo newfont definefont %%Leave on stack\n" ); + fprintf( pi->out, " end } def\n" ); + fprintf( pi->out, "/n_show { moveto show } bind def\n" ); + + fprintf( pi->out, "%%%%IncludeResource: font Times-Bold\n" ); + fprintf( pi->out, "/MyFontDict 100 dict def\n" ); +#if 1 + fprintf( pi->out, "/Times-Bold-ISO-8859-1 /Times-Bold findfont ISOLatin1Encoding font_remap definefont\n" ); +#else + /* And sometimes findfont executes "invalidfont" and dies, so there's no point to this */ + fprintf( pi->out, "%%A Hack. gv sometimes doesn't have Times-Bold, but the first call to\n" ); + fprintf( pi->out, "%% findfont returns Courier rather than null. Second returns null. Weird.\n" ); + fprintf( pi->out, "/Times-Bold findfont pop\n" ); + fprintf( pi->out, "/Times-Bold findfont null eq\n" ); + fprintf( pi->out, " { /Times-Bold-ISO-8859-1 /Times-Bold findfont ISOLatin1Encoding font_remap definefont}\n" ); + fprintf( pi->out, " { /Times-Bold-ISO-8859-1 /Courier findfont ISOLatin1Encoding font_remap definefont}\n" ); + fprintf( pi->out, "ifelse\n" ); +#endif + fprintf( pi->out, "MyFontDict /Times-Bold__12 /Times-Bold-ISO-8859-1 findfont 12 scalefont put\n" ); + + if ( pi->fontfile!=NULL ) { + fprintf( pi->out, "%%%%BeginResource: font %s\n", pi->sf->fontname ); + if ( pi->showvm ) + fprintf( pi->out, " vmstatus pop /VM1 exch def pop\n" ); + while ( (ch=getc(pi->fontfile))!=EOF ) + putc(ch,pi->out); + fprintf( pi->out, "%%%%EndResource\n" ); + if ( pi->iscid ) + DumpIdentCMap(pi); + sprintf(pi->psfontname,"%s__%d", pi->sf->fontname, pi->pointsize ); + if ( !pi->iscid ) + fprintf(pi->out,"MyFontDict /%s /%s findfont %d scalefont put\n", + pi->psfontname, pi->sf->fontname, pi->pointsize ); + else + fprintf(pi->out,"MyFontDict /%s /%s--Noop /Noop [ /%s ] composefont %d scalefont put\n", + pi->psfontname, pi->sf->fontname, pi->sf->fontname, pi->pointsize ); + if ( pi->showvm ) + fprintf( pi->out, "vmstatus pop dup VM1 sub (Max VMusage: ) print == flush\n" ); + + if ( !pi->iscid ) { + /* Now see if there are any unencoded characters in the font, and if so */ + /* reencode enough fonts to display them all. These will all be 256 char fonts */ + if ( pi->iscjk ) + i = 65536; + else if ( pi->twobyte ) + i = 65536; + else + i = 256; + for ( ; isf->charcnt; ++i ) { + if ( SCWorthOutputting(pi->sf->chars[i]) ) { + base = i&~0xff; + fprintf( pi->out, "MyFontDict /%s-%x__%d /%s-%x /%s%s findfont [\n", + pi->sf->fontname, base>>8, pi->pointsize, + pi->sf->fontname, base>>8, + pi->sf->fontname, pi->twobyte?"Base":"" ); + for ( j=0; j<0x100 && base+jsf->charcnt; ++j ) + if ( SCWorthOutputting(pi->sf->chars[base+j])) + fprintf( pi->out, "\t/%s\n", pi->sf->chars[base+j]->name ); + else + fprintf( pi->out, "\t/.notdef\n" ); + for ( ;j<0x100; ++j ) + fprintf( pi->out, "\t/.notdef\n" ); + fprintf( pi->out, " ] font_remap definefont %d scalefont put\n", + pi->pointsize ); + i = base+0xff; + } + } + } + } + + fprintf( pi->out, "%%%%EndSetup\n\n" ); +} + +static int PIDownloadFont(PI *pi) { + int is_mm = pi->sf->mm!=NULL && MMValid(pi->sf->mm,false); + + pi->fontfile = tmpfile(); + if ( pi->fontfile==NULL ) { + GWidgetErrorR(_STR_FailedOpenTemp,_STR_FailedOpenTemp); +return(false); + } + GProgressStartIndicatorR(10,_STR_PrintingFont,_STR_PrintingFont, + _STR_GeneratingPostscriptFont,pi->sf->charcnt,1); + GProgressEnableStop(false); + if ( !_WritePSFont(pi->fontfile,pi->sf, + is_mm?ff_mma: + pi->iscid?ff_cid: + pi->sf->multilayer?ff_ptype3: + pi->twobyte?ff_ptype0: + ff_pfa,0)) { + GProgressEndIndicator(); + GWidgetErrorR(_STR_FailedGenPost,_STR_FailedGenPost ); + fclose(pi->fontfile); +return(false); + } + GProgressEndIndicator(); + rewind(pi->fontfile); + dump_prologue(pi); + fclose(pi->fontfile); pi->fontfile = NULL; +return( true ); +} + +static void endpage(PI *pi ) { + fprintf(pi->out,"showpage cleartomark restore\t\t%%End of Page\n" ); +} + +static void dump_trailer(PI *pi) { + if ( pi->page!=0 ) + endpage(pi); + fprintf( pi->out, "%%%%Trailer\n" ); + fprintf( pi->out, "%%%%Pages: %d\n", pi->page ); + fprintf( pi->out, "%%%%EOF\n" ); +} + +/* ************************************************************************** */ +/* ************************* Code for full font dump ************************ */ +/* ************************************************************************** */ + +static void startpage(PI *pi ) { + int i; + /* I used to have a progress indicator here showing pages. But they went */ + /* by so fast that even for CaslonRoman it was pointless */ + + if ( pi->page!=0 ) + endpage(pi); + ++pi->page; + fprintf(pi->out,"%%%%Page: %d %d\n", pi->page, pi->page ); + fprintf(pi->out,"%%%%PageResources: font Times-Bold font %s\n", pi->sf->fontname ); + fprintf(pi->out,"save mark\n" ); + fprintf(pi->out,"40 %d translate\n", pi->pageheight-54 ); + fprintf(pi->out,"MyFontDict /Times-Bold__12 get setfont\n" ); + fprintf(pi->out,"(Font Display for %s) 193.2 -10.92 n_show\n", pi->sf->fontname); + + if ( pi->iscjk || pi->iscid ) + for ( i=0; imax; ++i ) + fprintf(pi->out,"(%d) %d -54.84 n_show\n", i, 60+(pi->pointsize+pi->extrahspace)*i ); + else + for ( i=0; imax; ++i ) + fprintf(pi->out,"(%X) %d -54.84 n_show\n", i, 60+(pi->pointsize+pi->extrahspace)*i ); + pi->ypos = -60-.9*pi->pointsize; +} + +static int DumpLine(PI *pi) { + int i=0, line; + + /* First find the next line with stuff on it */ + if ( !pi->iscid ) { + for ( line = pi->chline ; linesf->charcnt; line += pi->max ) { + for ( i=0; imax && line+isf->charcnt; ++i ) + if ( SCWorthOutputting(pi->sf->chars[line+i]) ) + break; + if ( i!=pi->max ) + break; + } + } else { + for ( line = pi->chline ; linecidcnt; line += pi->max ) { + for ( i=0; imax && line+icidcnt; ++i ) + if ( CIDWorthOutputting(pi->sf,line+i)!= -1 ) + break; + if ( i!=pi->max ) + break; + } + } + if ( line+i>=pi->cidcnt ) /* Nothing more */ +return(0); + + if ( pi->iscid ) + /* No encoding worries */; + else if ( (pi->twobyte && line>=65536) || ( !pi->twobyte && line>=256 ) ) { + /* Nothing more encoded. Can't use the normal font, must use one of */ + /* the funky reencodings we built up at the beginning */ + if ( pi->lastbase!=(line>>8) ) { + if ( !pi->overflow ) { + fprintf( pi->out, "%d %d moveto %d %d rlineto stroke\n", + 100, pi->ypos+8*pi->pointsize/10-1, 300, 0 ); + pi->ypos -= 4; + } + pi->overflow = true; + pi->lastbase = (line>>8); + sprintf(pi->psfontname,"%s-%x__%d", pi->sf->fontname, pi->lastbase, + pi->pointsize ); + } + } + + if ( pi->chline==0 ) { + /* start the first page */ + startpage(pi); + } else { + /* start subsequent pages by displaying the one before */ + if ( pi->ypos - pi->pointsize < -(pi->pageheight-90) ) { + startpage(pi); + } + } + pi->chline = line; + + if ( !pi->overflow ) { + fprintf(pi->out,"MyFontDict /Times-Bold__12 get setfont\n" ); + if ( pi->iscjk ) + fprintf(pi->out,"(%d,%d) 26.88 %d n_show\n", + pi->chline/96 + 1, pi->chline%96, pi->ypos ); + else if ( pi->iscid ) + fprintf(pi->out,"(%d) 26.88 %d n_show\n", pi->chline, pi->ypos ); + else + fprintf(pi->out,"(%04X) 26.88 %d n_show\n", pi->chline, pi->ypos ); + } + fprintf(pi->out,"MyFontDict /%s get setfont\n", pi->psfontname ); + for ( i=0; imax ; ++i ) { + if ( i+pi->chlinecidcnt && + CIDWorthOutputting(pi->sf,i+pi->chline)!=-1) { + int x = 58 + i*(pi->pointsize+pi->extrahspace); + if ( pi->overflow ) { + fprintf( pi->out, "<%02x> %d %d n_show\n", pi->chline +i-(pi->lastbase<<8), + x, pi->ypos ); + } else if ( pi->iscid ) { + fprintf( pi->out, "<%04x> %d %d n_show\n", pi->chline +i, + x, pi->ypos ); + } else if ( pi->iscjk ) { + fprintf( pi->out, "<%02x%02X> %d %d n_show\n", + (pi->chline+i)/96 + '!', (pi->chline+i)%96 + ' ', + x, pi->ypos ); + } else if ( pi->twobyte ) { + fprintf( pi->out, "<%04x> %d %d n_show\n", pi->chline +i, + x, pi->ypos ); + } else { + fprintf( pi->out, "<%02x> %d %d n_show\n", pi->chline +i, + x, pi->ypos ); + } + } + } + pi->ypos -= pi->pointsize+pi->extravspace; + pi->chline += pi->max; +return(true); +} + +static void PIFontDisplay(PI *pi) { + int wascompacted = pi->sf->compacted; + + pi->extravspace = pi->pointsize/6; + pi->extrahspace = pi->pointsize/3; + pi->max = (pi->pagewidth-100)/(pi->extrahspace+pi->pointsize); + pi->cidcnt = pi->sf->charcnt; + if ( pi->iscid ) { + if ( pi->max>=20 ) pi->max = 20; + else if ( pi->max>=10 ) pi->max = 10; + else pi->max = 5; + } else { + if ( pi->max>=16 ) pi->max = 16; + else if ( pi->max>=8 ) pi->max = 8; + else pi->max = 4; + } + + if ( wascompacted ) + SFUncompactFont(pi->sf); + + if ( PIDownloadFont(pi)) { + while ( DumpLine(pi)) + ; + + if ( pi->chline==0 ) + GDrawError( "Warning: Font contained no characters" ); + else + dump_trailer(pi); + } + + if ( wascompacted ) { + FontView *fvs; + SFCompactFont(pi->sf); + for ( fvs=pi->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + GDrawRequestExpose(fvs->v,NULL,false); + } +} + +/* ************************************************************************** */ +/* ********************* Code for single character dump ********************* */ +/* ************************************************************************** */ + +static void PIDumpSPL(PI *pi,SplinePointList *spl) { + SplinePoint *first, *sp; + + for ( ; spl!=NULL; spl=spl->next ) { + first = NULL; + for ( sp = spl->first; ; sp=sp->next->to ) { + if ( first==NULL ) + fprintf( pi->out, "%g %g moveto\n", sp->me.x*pi->scale+pi->xoff, sp->me.y*pi->scale+pi->yoff ); + else if ( sp->prev->knownlinear ) + fprintf( pi->out, " %g %g lineto\n", sp->me.x*pi->scale+pi->xoff, sp->me.y*pi->scale+pi->yoff ); + else + fprintf( pi->out, " %g %g %g %g %g %g curveto\n", + sp->prev->from->nextcp.x*pi->scale+pi->xoff, sp->prev->from->nextcp.y*pi->scale+pi->yoff, + sp->prevcp.x*pi->scale+pi->xoff, sp->prevcp.y*pi->scale+pi->yoff, + sp->me.x*pi->scale+pi->xoff, sp->me.y*pi->scale+pi->yoff ); + if ( sp==first ) + break; + if ( first==NULL ) first = sp; + if ( sp->next==NULL ) + break; + } + fprintf( pi->out, "closepath\n" ); + } + fprintf( pi->out, "fill\n" ); +} + +static void SCPrintPage(PI *pi,SplineChar *sc) { + DBounds b, page; + real scalex, scaley; + RefChar *r; + + if ( pi->page!=0 ) + endpage(pi); + ++pi->page; + fprintf(pi->out,"%%%%Page: %d %d\n", pi->page, pi->page ); + fprintf(pi->out,"%%%%PageResources: font Times-Bold\n" ); + fprintf(pi->out,"save mark\n" ); + + SplineCharFindBounds(sc,&b); + if ( b.maxyparent->ascent+5 ) b.maxy = sc->parent->ascent + 5; + if ( b.miny>-sc->parent->descent ) b.miny =-sc->parent->descent - 5; + if ( b.minx>00 ) b.minx = -5; + if ( b.maxx<=0 ) b.maxx = 5; + if ( b.maxx<=sc->width+5 ) b.maxx = sc->width+5; + + /* From the default bounding box */ + page.minx = 40; page.maxx = 580; + page.miny = 20; page.maxy = 770; + + fprintf(pi->out,"MyFontDict /Times-Bold__12 get setfont\n" ); + fprintf(pi->out,"(%s from %s) 80 758 n_show\n", sc->name, sc->parent->fullname ); + page.maxy = 750; + + scalex = (page.maxx-page.minx)/(b.maxx-b.minx); + scaley = (page.maxy-page.miny)/(b.maxy-b.miny); + pi->scale = (scalexxoff = page.minx - b.minx*pi->scale; + pi->yoff = page.miny - b.miny*pi->scale; + + fprintf(pi->out,".2 setlinewidth\n" ); + fprintf(pi->out,"%g %g moveto %g %g lineto stroke\n", page.minx, pi->yoff, page.maxx, pi->yoff ); + fprintf(pi->out,"%g %g moveto %g %g lineto stroke\n", pi->xoff, page.miny, pi->xoff, page.maxy ); + fprintf(pi->out,"%g %g moveto %g %g lineto stroke\n", page.minx, sc->parent->ascent*pi->scale+pi->yoff, page.maxx, sc->parent->ascent*pi->scale+pi->yoff ); + fprintf(pi->out,"%g %g moveto %g %g lineto stroke\n", page.minx, -sc->parent->descent*pi->scale+pi->yoff, page.maxx, -sc->parent->descent*pi->scale+pi->yoff ); + fprintf(pi->out,"%g %g moveto %g %g lineto stroke\n", pi->xoff+sc->width*pi->scale, page.miny, pi->xoff+sc->width*pi->scale, page.maxy ); + + PIDumpSPL(pi,sc->layers[ly_fore].splines); + for ( r=sc->layers[ly_fore].refs; r!=NULL; r=r->next ) + PIDumpSPL(pi,r->layers[0].splines); + +} + +static void PIChars(PI *pi) { + int i; + + dump_prologue(pi); + if ( pi->fv!=NULL ) { + for ( i=0; isf->charcnt; ++i ) + if ( pi->fv->selected[i] && SCWorthOutputting(pi->sf->chars[i]) ) + SCPrintPage(pi,pi->sf->chars[i]); + } else if ( pi->sc!=NULL ) + SCPrintPage(pi,pi->sc); + else { + for ( i=0; imv->charcnt; ++i ) + if ( SCWorthOutputting(pi->mv->perchar[i].sc)) + SCPrintPage(pi,pi->mv->perchar[i].sc); + } + dump_trailer(pi); +} + +/* ************************************************************************** */ +/* ************************** Code for sample text ************************** */ +/* ************************************************************************** */ + +static void samplestartpage(PI *pi ) { + + if ( pi->page!=0 ) + endpage(pi); + ++pi->page; + fprintf(pi->out,"%%%%Page: %d %d\n", pi->page, pi->page ); + fprintf(pi->out,"%%%%PageResources: font %s\n", pi->sf->fontname ); + fprintf(pi->out,"save mark\n" ); + fprintf(pi->out,"MyFontDict /Times-Bold__12 get setfont\n" ); + if ( pi->pt==pt_fontsample ) + fprintf(pi->out,"(Sample Text from %s) 80 758 n_show\n", pi->sf->fullname ); + else + fprintf(pi->out,"(Sample Sizes of %s) 80 758 n_show\n", pi->sf->fullname ); + fprintf(pi->out,"40 %d translate\n", pi->pageheight-34- + pi->pointsize*pi->sf->ascent/(pi->sf->ascent+pi->sf->descent) ); + if ( pi->iscid ) + fprintf(pi->out,"MyFontDict /%s get setfont\n", pi->psfontname ); + else + fprintf(pi->out,"/%s findfont %d scalefont setfont\n", pi->sf->fontname, + pi->pointsize); + + pi->ypos = -30; +} + +static SplineChar *findchar(PI *pi, int ch) { + SplineFont *sf = pi->sf; + int i, max; + + if ( ch<0 ) +return(NULL); + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4) { + if ( SCWorthOutputting(sf->chars[ch])) +return( sf->chars[ch]); + } else if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax ) { + i = ch-((sf->encoding_name-em_unicodeplanes)<<16); + if ( SCWorthOutputting(sf->chars[i])) +return( sf->chars[i]); + } else if ( ch>=65536 ) { +return( NULL ); + } else if ( !pi->iscid ) { + max = 256; + if ( pi->iscjk ) max = 0x7e7e; + for ( i=0 ; icharcnt && ichars[i]!=NULL && sf->chars[i]->unicodeenc==ch ) { + if ( SCWorthOutputting(sf->chars[i])) +return( sf->chars[i]); + else +return( NULL ); + } + } else { + int j; + for ( i=max=0; isubfontcnt; ++i ) + if ( sf->subfonts[i]->charcnt>max ) max = sf->subfonts[i]->charcnt; + for ( i=0; isubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) + break; + if ( j!=sf->subfontcnt ) + if ( sf->subfonts[j]->chars[i]->unicodeenc == ch ) + break; + } + if ( i!=max && SCWorthOutputting(sf->subfonts[j]->chars[i])) +return( sf->subfonts[j]->chars[i] ); + } + +return( NULL ); +} + +static void outputchar(PI *pi, SplineChar *sc) { + + if ( sc==NULL ) +return; + if ( pi->iscid ) { + fprintf( pi->out, "%04X", sc->enc ); + } else if ( pi->iscjk ) { + fprintf( pi->out, "%02x%02X", (sc->enc)/96 + '!', (sc->enc)%96 + ' ' ); + } else if ( pi->twobyte ) { + fprintf( pi->out, "%04X", sc->unicodeenc ); + } else { + fprintf( pi->out, "%02X", sc->enc ); + } +} + +static int AnyKerns(SplineChar *first, SplineChar *second) { + KernPair *kp; + + if ( first==NULL || second==NULL ) +return( 0 ); + for ( kp = first->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc==second ) +return( kp->off ); + +return( 0 ); +} + +static unichar_t *PIFindEnd(PI *pi, unichar_t *pt, unichar_t *ept) { + real len = 0, max = pi->pagewidth-100, chlen; + SplineChar *sc, *nsc; + unichar_t *npt; + + nsc = findchar(pi,*pt); + while ( ptwidth*pi->scale; + chlen += AnyKerns(sc,nsc)*pi->scale; + if ( chlen+len>max ) +return( pt ); + len += chlen; + } + pt = npt; + } +return( ept ); +} + +static int PIFindLen(PI *pi, unichar_t *pt, unichar_t *ept) { + real len = 0, chlen; + SplineChar *sc, *nsc; + unichar_t *npt; + + nsc = findchar(pi,*pt); + while ( ptwidth*pi->scale; + chlen += AnyKerns(sc,nsc)*pi->scale; + len += chlen; + } + pt = npt; + } +return( len ); +} + +/* Nothing fancy here. No special cases, no italic fixups */ +static void PIDoCombiners(PI *pi, SplineChar *sc, unichar_t *accents) { + DBounds bb, rbb; + SplineChar *asc; + real xmove=sc->width*pi->scale, ymove=0; + extern int accent_offset; /* in prefs.c */ + real spacing = (pi->sf->ascent+pi->sf->descent)*accent_offset/100; + real xoff, yoff; + int first=true, pos; + + SplineCharFindBounds(sc,&bb); + while ( iscombining(*accents)) { + if ((asc=findchar(pi,*accents))!=NULL ) { + if ( first ) { fprintf( pi->out, "> show " ); first=false;} + SplineCharFindBounds(asc,&rbb); + pos = ____utype2[1+*accents]; + if ( (pos&____ABOVE) && (pos&(____LEFT|____RIGHT)) ) + yoff = bb.maxy - rbb.maxy; + else if ( pos&____ABOVE ) + yoff = bb.maxy + spacing - rbb.miny; + else if ( pos&____BELOW ) { + if ( (sc->unicodeenc==0x5d9 || sc->unicodeenc==0xfb39 ) && + asc->unicodeenc==0x5b8 ) bb.miny = 0; + yoff = bb.miny - rbb.maxy; + if ( !( pos&____TOUCHING) ) + yoff -= spacing; + } else if ( pos&____OVERSTRIKE ) + yoff = bb.miny - rbb.miny + ((bb.maxy-bb.miny)-(rbb.maxy-rbb.miny))/2; + else /* If neither Above, Below, nor overstrike then should use the same baseline */ + yoff = bb.miny - rbb.miny; + if ( pos&____LEFT ) + xoff = bb.minx - spacing - rbb.maxx; + else if ( pos&____RIGHT ) { + xoff = bb.maxx - rbb.minx; + if ( !( pos&____TOUCHING) ) + xoff += spacing; + } else { + if ( pos&____CENTERLEFT ) + xoff = bb.minx + (bb.maxx-bb.minx)/2 - rbb.maxx; + else if ( pos&____LEFTEDGE ) + xoff = bb.minx - rbb.minx; + else if ( pos&____CENTERRIGHT ) + xoff = bb.minx + (bb.maxx-bb.minx)/2 - rbb.minx; + else if ( pos&____RIGHTEDGE ) + xoff = bb.maxx - rbb.maxx; + else + xoff = bb.minx - rbb.minx + ((bb.maxx-bb.minx)-(rbb.maxx-rbb.minx))/2; + } + fprintf( pi->out, "%g %g rmoveto <", + xoff*pi->scale-xmove, yoff*pi->scale-ymove); + outputchar(pi,asc); + fprintf( pi->out, "> show " ); + xmove = (xoff+asc->width)*pi->scale; + ymove = yoff*pi->scale; + if ( bb.maxxrbb.minx+xoff ) bb.minx = rbb.minx+xoff; + if ( bb.maxyrbb.miny+yoff ) bb.miny = rbb.miny+yoff; + } + ++accents; + } + if ( !first ) + fprintf( pi->out, "%g %g rmoveto <", sc->width*pi->scale-xmove, -ymove ); +} + +AnchorPos *AnchorPositioning(SplineChar *sc,unichar_t *ustr,SplineChar **sstr ) { + AnchorPos *apos, *apt, *aend, *atest; + AnchorPoint *ap, *map; + SplineChar *mark; + + /* Must have at least one non-mark anchor */ + for ( ap=sc->anchor; ap!=NULL && (ap->type==at_mark || ap->type==at_centry); ap=ap->next ); + if ( ap==NULL ) +return( NULL ); + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) + ap->ticked = (ap->type==at_mark || ap->type==at_centry); + + apt = apos = aend = NULL; + while ( 1 ) { + if ( ustr ) { + mark = NULL; + while ( *ustr && mark==NULL ) + mark = SFGetChar(sc->parent,*ustr++,NULL); + } else + mark = *sstr++; + if ( mark==NULL ) + break; + map = NULL; + /* We don't handle the case of a mark having two different basemark anchors */ + /* which are both in use */ + if ( apt!=NULL ) for ( atest=apt-1; atest>=apos; --atest ) if ( !atest->ticked ) { + for ( ap=atest->sc->anchor; ap!=NULL; ap=ap->next ) if ( ap->type==at_basemark || ap->type==at_cexit ) { + for ( map=mark->anchor; map!=NULL; map=map->next ) + if (( map->type==at_mark || map->type==at_centry) && + map->anchor==ap->anchor ) + break; + if ( map!=NULL ) + break; + } + if ( map!=NULL ) + break; + } + if ( map==NULL ) { + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) if ( !ap->ticked ) { + for ( map=mark->anchor; map!=NULL; map=map->next ) + if ( ap->type==at_cexit ) { + if ( map->type==at_centry ) + break; + } else if ( map->type==at_mark && map->anchor==ap->anchor ) + break; + if ( map!=NULL ) + break; + } + if ( map==NULL ) + break; + atest = NULL; + ap->ticked = true; + } else + atest->ticked = true; + if ( apt>=aend ) { + if ( apt==NULL ) { + apt = apos = galloc(10*sizeof(AnchorPos)); + aend = apos+10-1; + } else { + AnchorPos *new = grealloc(apos,(aend-apos+31)*sizeof(AnchorPos) ); + apt = new + (apt-apos); + aend = new + (aend-apos)+30; + apos = new; + } + } + apt->sc = mark; + apt->apm = map; + apt->apb = ap; + if ( atest==NULL ) { + apt->base_index = -1; + apt->x = ap->me.x-map->me.x; + apt->y = ap->me.y-map->me.y; + } else { + apt->base_index = atest-apos; + apt->x = ap->me.x-map->me.x + atest->x; + apt->y = ap->me.y-map->me.y + atest->y; + } + apt->ticked = false; + ++apt; + } + if ( apt==apos ) { + free( apos ); +return( NULL ); + } + apt->sc = NULL; +return( apos ); +} + +void AnchorPosFree(AnchorPos *apos) { + free( apos ); +} + +static void PIDrawAnchors(PI *pi,SplineChar *sc, AnchorPos *apos) { + /* Draw a set of marks, positioned by anchors */ + int xoff = -sc->width, yoff = 0; /* Motion needed to reach the origin of the base character */ + + while ( apos->sc != NULL ) { + fprintf(pi->out,"> show %g %g rmoveto <", (xoff+apos->x)*pi->scale, (yoff+apos->y)*pi->scale ); + outputchar(pi,apos->sc); + yoff = -apos->y; + xoff = -apos->x-apos->sc->width; + ++apos; + } + xoff += sc->width; + if ( xoff!=0 || yoff!=0 ) + fprintf(pi->out,"> show %g %g rmoveto <", xoff*pi->scale, yoff*pi->scale ); +} + +static void PIDumpChars(PI *pi, unichar_t *pt, unichar_t *ept, int xstart) { + SplineChar *sc, *nsc; + unichar_t *npt; + int off; + AnchorPos *apos, *atest; + + if ( pi->ypos - pi->pointsize < -(pi->pageheight-90) && pi->ypos!=-30 ) { + samplestartpage(pi); + } + fprintf(pi->out,"%d %d moveto ", xstart, pi->ypos ); /* 20 for left->right */ + putc('<',pi->out); + + nsc = findchar(pi,*pt); + while ( ptanchor!=NULL && (apos = AnchorPositioning(sc,pt+1,NULL))!=NULL ) { + npt = pt+1; + for ( atest = apos; atest->sc!=NULL; ++atest ) + ++npt; + } else + for ( npt=pt+1; nptpt+1 ) + PIDoCombiners(pi,sc,pt+1); + off = AnyKerns(sc,nsc); + if ( off!=0 ) + fprintf(pi->out,"> show %g 0 rmoveto <", off*pi->scale ); + } + pt = npt; + } + fprintf(pi->out, "> show\n" ); + pi->ypos -= pi->pointsize+pi->extravspace; +} + +static int SetupBiText(GBiText *bi,unichar_t *pt, unichar_t *ept,int bilen) { + int cnt = ept-pt; + + if ( cnt>= bilen ) { + bilen = cnt + 50; + free(bi->text); free(bi->level); + free(bi->override); free(bi->type); + free(bi->original); + ++bilen; + bi->text = galloc(bilen*sizeof(unichar_t)); + bi->level = galloc(bilen*sizeof(uint8)); + bi->override = galloc(bilen*sizeof(uint8)); + bi->type = galloc(bilen*sizeof(uint16)); + bi->original = galloc(bilen*sizeof(unichar_t *)); + --bilen; + } + bi->base_right_to_left = GDrawIsAllLeftToRight(pt,cnt)==-1; + GDrawBiText1(bi,pt,cnt); +return( bilen ); +} + +static int iscombineormark(SplineFont *sf,unichar_t uni) { + SplineChar *sc; + + if ( iscombining(uni) ) +return( true ); + + sc = SFGetChar(sf,uni,NULL); + if ( sc==NULL || sc->anchor==NULL ) +return( false ); + if ( sc->anchor->type==at_mark || sc->anchor->type==at_basemark ) +return( true ); + +return( false ); +} + +static void PI_BiText2(SplineFont *sf, GBiText *bd,int start, int end) { + int pos, epos, i,j; + + if ( end==-1 || end>bd->len ) end = bd->len; + + _GDrawBiText2(bd,start,end); + + /* do combiners */ + /* combiners must always follow (in string order) the character they modify*/ + /* but now combiners in r2l text will precede it */ + for ( pos = start; postext[pos]) && (bd->level[pos]&1) /*&& pos!=start*/ ) { + for ( epos = pos; epostext[epos]) ; ++epos ); + if ( epostext[i], *tpt = bd->original[i]; + bd->text[i] = bd->text[j]; + bd->text[j] = temp; + bd->original[i] = bd->original[j]; + bd->original[j] = tpt; + } + } + pos = epos; + } + } + + if ( bd->interpret_arabic ) + GDrawArabicForms(bd,start,end); +} + +/* We handle kerning, composits, and bidirectional text */ +static void PIFontSample(PI *pi,unichar_t *sample) { + unichar_t *pt, *base, *ept, *end, *temp; + GBiText bi; + int bilen, i; + int xstart; + +#if 0 + unichar_t *upt; + + for ( upt=sample; *upt; ++upt ) { + if ( *upt=='\n' ) + fprintf( pi->out," '\\0'}\n"); + else if ( *upt<256 && *upt!='\\' && *upt!='\'' ) + fprintf( pi->out,"'%c',", *upt ); + else + fprintf( pi->out, "0x%04x,", *upt ); + } +return; +#endif + + memset(&bi,'\0',sizeof(bi)); bilen = 0; + + if ( !PIDownloadFont(pi)) +return; + for ( i=0; pi->pointsizes[i]!=0; ++i ) { + pi->pointsize = pi->pointsizes[i]; + pi->extravspace = pi->pointsize/6; + pi->scale = pi->pointsize/(real) (pi->sf->ascent+pi->sf->descent); + if ( i==0 || pi->ypos - pi->pointsize-36 < -(pi->pageheight-90) ) + samplestartpage(pi); + else { + fprintf(pi->out,"/%s findfont %d scalefont setfont\n", pi->sf->fontname, + pi->pointsize); + pi->ypos -= 36; + } + + pt = sample; + do { + if ( ( ept = u_strchr(pt,'\n'))==NULL ) + ept = pt+u_strlen(pt); + bilen = SetupBiText(&bi,pt,ept,bilen); + base = pt; + while ( pt<=ept ) { + end = PIFindEnd(pi,pt,ept); + if ( end!=ept && !isbreakbetweenok(*end,end[1]) ) { + for ( temp=end; temp>pt && !isbreakbetweenok(*temp,temp[1]); --temp ); + if ( temp==pt ) + for ( temp=end; tempsf,&bi,pt-base,end-base); + if ( !bi.base_right_to_left ) + xstart = 20; + else + xstart = 20+pi->pagewidth-100-PIFindLen(pi,pt,end); + PIDumpChars(pi,bi.text+(pt-base),bi.text+(end-base),xstart); + if ( *end=='\0' ) + goto break_2_loops; + pt = end+1; + } + } while ( *ept!='\0' ); + break_2_loops:; + } + + dump_trailer(pi); +} + +/* ************************************************************************** */ +/* ************************** Code for multi size *************************** */ +/* ************************************************************************** */ +static double pointsizes[] = { 36, 24, 20, 18, 16, 13, 14, 13, 12, 11, 10, 9, 8, 7.5, 7, 6.5, 6, 5.5, 5, 4.5, 4.2, 4, 0 }; + +static void SCPrintSizes(PI *pi,SplineChar *sc) { + int xstart = 10, i; + + if ( !SCWorthOutputting(sc)) +return; + if ( pi->ypos - pi->pointsize < -(pi->pageheight-90) && pi->ypos!=-30 ) { + samplestartpage(pi); + } + fprintf(pi->out,"%d %d moveto ", xstart, pi->ypos ); + for ( i=0; pointsizes[i]!=0; ++i ) { + fprintf(pi->out,"/%s findfont %g scalefont setfont\n <", pi->sf->fontname, + pointsizes[i]); + outputchar(pi,sc); + fprintf( pi->out, "> show\n" ); + } + pi->ypos -= pi->pointsize+pi->extravspace; +} + +static void PIMultiSize(PI *pi) { + int i; + + pi->pointsize = pointsizes[0]; + pi->extravspace = pi->pointsize/6; + if ( !PIDownloadFont(pi)) +return; + + samplestartpage(pi); + + if ( pi->fv!=NULL ) { + for ( i=0; isf->charcnt; ++i ) + if ( pi->fv->selected[i] && SCWorthOutputting(pi->sf->chars[i]) ) + SCPrintSizes(pi,pi->sf->chars[i]); + } else if ( pi->sc!=NULL ) + SCPrintSizes(pi,pi->sc); + else { + for ( i=0; imv->charcnt; ++i ) + if ( SCWorthOutputting(pi->mv->perchar[i].sc)) + SCPrintSizes(pi,pi->mv->perchar[i].sc); + } + + dump_trailer(pi); +} + +/* ************************************************************************** */ +/* *********************** Code for Page Setup dialog *********************** */ +/* ************************************************************************** */ +static void PIGetPrinterDefs(PI *pi) { + pi->pagewidth = pagewidth; + pi->pageheight = pageheight; + pi->printtype = printtype; + pi->printer = copy(printlazyprinter); + pi->copies = 1; +} + +#define CID_lp 1001 +#define CID_lpr 1002 +#define CID_ghostview 1003 +#define CID_File 1004 +#define CID_Other 1005 +#define CID_OtherCmd 1006 +#define CID_Pagesize 1007 +#define CID_CopiesLab 1008 +#define CID_Copies 1009 +#define CID_PrinterLab 1010 +#define CID_Printer 1011 + +static void PG_SetEnabled(PI *pi) { + int enable; + + enable = GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_lp)) || + GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_lpr)); + + GGadgetSetEnabled(GWidgetGetControl(pi->setup,CID_CopiesLab),enable); + GGadgetSetEnabled(GWidgetGetControl(pi->setup,CID_Copies),enable); + GGadgetSetEnabled(GWidgetGetControl(pi->setup,CID_PrinterLab),enable); + GGadgetSetEnabled(GWidgetGetControl(pi->setup,CID_Printer),enable); + + GGadgetSetEnabled(GWidgetGetControl(pi->setup,CID_OtherCmd), + GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_Other))); +} + +static int PG_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + PI *pi = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret; + int err=false; + int copies, pgwidth, pgheight; + + copies = GetIntR(pi->setup,CID_Copies,_STR_Copies,&err); + if ( err ) +return(true); + + if ( GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_Other)) && + *_GGadgetGetTitle(GWidgetGetControl(pi->setup,CID_OtherCmd))=='\0' ) { + GWidgetErrorR(_STR_NoCommandSpecified,_STR_NoCommandSpecified); +return(true); + } + + ret = _GGadgetGetTitle(GWidgetGetControl(pi->setup,CID_Pagesize)); + if ( uc_strstr(ret,"Letter")!=NULL ) { + pgwidth = 612; pgheight = 792; + } else if ( uc_strstr(ret,"Legal")!=NULL ) { + pgwidth = 612; pgheight = 1008; + } else if ( uc_strstr(ret,"A4")!=NULL ) { + pgwidth = 595; pgheight = 842; + } else if ( uc_strstr(ret,"A3")!=NULL ) { + pgwidth = 842; pgheight = 1191; + } else if ( uc_strstr(ret,"B4")!=NULL ) { + pgwidth = 708; pgheight = 1000; + } else if ( uc_strstr(ret,"B5")!=NULL ) { + pgwidth = 516; pgheight = 728; + } else { + char *cret = cu_copy(ret), *pt; + real pw,ph, scale; + if ( sscanf(cret,"%gx%g",&pw,&ph)!=2 ) { + GDrawIError("Bad Pagesize must be a known name or x\nWhere is one of pt (points), mm, cm, in" ); +return( true ); + } + pt = cret+strlen(cret)-1; + while ( isspace(*pt) ) --pt; + if ( strncmp(pt-2,"in",2)==0) + scale = 72; + else if ( strncmp(pt-2,"cm",2)==0 ) + scale = 72/2.54; + else if ( strncmp(pt-2,"mm",2)==0 ) + scale = 72/25.4; + else if ( strncmp(pt-2,"pt",2)==0 ) + scale = 1; + else { + GDrawIError("Bad Pagesize units are unknown\nMust be one of pt (points), mm, cm, in" ); +return( true ); + } + pgwidth = pw*scale; pgheight = ph*scale; + free(cret); + } + + ret = _GGadgetGetTitle(GWidgetGetControl(pi->setup,CID_Printer)); + if ( uc_strcmp(ret,"")==0 || *ret=='\0' ) + ret = NULL; + pi->printer = cu_copy(ret); + pi->pagewidth = pgwidth; pi->pageheight = pgheight; + pi->copies = copies; + + if ( GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_lp))) + pi->printtype = pt_lp; + else if ( GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_lpr))) + pi->printtype = pt_lpr; + else if ( GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_ghostview))) + pi->printtype = pt_ghostview; + else if ( GGadgetIsChecked(GWidgetGetControl(pi->setup,CID_Other))) { + pi->printtype = pt_other; + printcommand = cu_copy(_GGadgetGetTitle(GWidgetGetControl(pi->setup,CID_OtherCmd))); + } else + pi->printtype = pt_file; + + printtype = pi->printtype; + free(printlazyprinter); printlazyprinter = copy(pi->printer); + pagewidth = pgwidth; pageheight = pgheight; + + pi->done = true; + SavePrefs(); + } +return( true ); +} + +static int PG_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + PI *pi = GDrawGetUserData(GGadgetGetWindow(g)); + pi->done = true; + } +return( true ); +} + +static int PG_RadioSet(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + PI *pi = GDrawGetUserData(GGadgetGetWindow(g)); + PG_SetEnabled(pi); + } +return( true ); +} + +static int pg_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + PI *pi = GDrawGetUserData(gw); + pi->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("print.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +static GTextInfo *PrinterList() { + char line[400]; + FILE *printcap; + GTextInfo *tis=NULL; + int cnt; + char *bpt, *cpt; + + printcap = fopen("/etc/printcap","r"); + if ( printcap==NULL ) { + tis = gcalloc(2,sizeof(GTextInfo)); + tis[0].text = uc_copy(""); +return( tis ); + } + + while ( 1 ) { + cnt=1; /* leave room for default printer */ + while ( fgets(line,sizeof(line),printcap)!=NULL ) { + if ( !isspace(*line) && *line!='#' ) { + if ( tis!=NULL ) { + bpt = strchr(line,'|'); + cpt = strchr(line,':'); + if ( cpt==NULL && bpt==NULL ) + cpt = line+strlen(line)-1; + else if ( cpt!=NULL && bpt!=NULL && bpt"); + rewind(printcap); + } +} + +static int progexists(char *prog) { + char buffer[1025]; + +return( ProgramExists(prog,buffer)!=NULL ); +} + +static int PageSetup(PI *pi) { + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[16]; + GTextInfo label[16]; + char buf[10], pb[30]; + int pt; + /* Don't translate these. we compare against the text */ + static GTextInfo pagesizes[] = { + { (unichar_t *) "US Letter", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "US Legal", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "A3", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "A4", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "B4", NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { NULL } + }; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<setup = GDrawCreateTopWindow(NULL,&pos,pg_e_h,pi,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + +/* program names also don't get translated */ + label[0].text = (unichar_t *) "lp"; + label[0].text_is_1byte = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.mnemonic = 'l'; + gcd[0].gd.pos.x = 40; gcd[0].gd.pos.y = 6; + gcd[0].gd.flags = progexists("lp")? (gg_visible | gg_enabled):gg_visible; + gcd[0].gd.cid = CID_lp; + gcd[0].gd.handle_controlevent = PG_RadioSet; + gcd[0].creator = GRadioCreate; + + label[1].text = (unichar_t *) "lpr"; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.mnemonic = 'r'; + gcd[1].gd.pos.x = gcd[0].gd.pos.x; gcd[1].gd.pos.y = 18+gcd[0].gd.pos.y; + gcd[1].gd.flags = progexists("lpr")? (gg_visible | gg_enabled):gg_visible; + gcd[1].gd.cid = CID_lpr; + gcd[1].gd.handle_controlevent = PG_RadioSet; + gcd[1].creator = GRadioCreate; + + use_gv = false; + label[2].text = (unichar_t *) "ghostview"; + label[2].text_is_1byte = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.mnemonic = 'g'; + gcd[2].gd.pos.x = gcd[0].gd.pos.x+50; gcd[2].gd.pos.y = gcd[0].gd.pos.y; + gcd[2].gd.flags = gg_visible | gg_enabled; + if ( !progexists("ghostview") ) { + if ( progexists("gv") ) { + label[2].text = (unichar_t *) "gv"; + use_gv = true; + } else + gcd[2].gd.flags = gg_visible; + } + gcd[2].gd.cid = CID_ghostview; + gcd[2].gd.handle_controlevent = PG_RadioSet; + gcd[2].creator = GRadioCreate; + + label[3].text = (unichar_t *) _STR_ToFile; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.mnemonic = 'F'; + gcd[3].gd.pos.x = gcd[2].gd.pos.x; gcd[3].gd.pos.y = gcd[1].gd.pos.y; + gcd[3].gd.flags = gg_visible | gg_enabled; + gcd[3].gd.cid = CID_File; + gcd[3].gd.handle_controlevent = PG_RadioSet; + gcd[3].creator = GRadioCreate; + + label[4].text = (unichar_t *) _STR_Other2; + label[4].text_in_resource = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.mnemonic = 'O'; + gcd[4].gd.pos.x = gcd[1].gd.pos.x; gcd[4].gd.pos.y = 22+gcd[1].gd.pos.y; + gcd[4].gd.flags = gg_visible | gg_enabled; + gcd[4].gd.cid = CID_Other; + gcd[4].gd.handle_controlevent = PG_RadioSet; + gcd[4].gd.popup_msg = GStringGetResource(_STR_PrintOtherPopup,NULL); + gcd[4].creator = GRadioCreate; + + if ( (pt=pi->printtype)==pt_unknown ) pt = pt_lp; + if ( !(gcd[pt].gd.flags&gg_enabled) ) pt = pt_file; /* always enabled */ + gcd[pt].gd.flags |= gg_cb_on; + + label[5].text = (unichar_t *) (printcommand?printcommand:""); + label[5].text_is_1byte = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.mnemonic = 'O'; + gcd[5].gd.pos.x = gcd[2].gd.pos.x; gcd[5].gd.pos.y = gcd[4].gd.pos.y-4; + gcd[5].gd.pos.width = 120; + gcd[5].gd.flags = gg_visible | gg_enabled; + gcd[5].gd.cid = CID_OtherCmd; + gcd[5].creator = GTextFieldCreate; + + label[6].text = (unichar_t *) _STR_PageSize; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.mnemonic = 'S'; + gcd[6].gd.pos.x = 5; gcd[6].gd.pos.y = 24+gcd[4].gd.pos.y+6; + gcd[6].gd.flags = gg_visible | gg_enabled; + gcd[6].creator = GLabelCreate; + + if ( pi->pagewidth==595 && pi->pageheight==792 ) + strcpy(pb,"US Letter"); /* Pick a name, this is the default case */ + else if ( pi->pagewidth==612 && pi->pageheight==792 ) + strcpy(pb,"US Letter"); + else if ( pi->pagewidth==612 && pi->pageheight==1008 ) + strcpy(pb,"US Legal"); + else if ( pi->pagewidth==595 && pi->pageheight==842 ) + strcpy(pb,"A4"); + else if ( pi->pagewidth==842 && pi->pageheight==1191 ) + strcpy(pb,"A3"); + else if ( pi->pagewidth==708 && pi->pageheight==1000 ) + strcpy(pb,"B4"); + else + sprintf(pb,"%dx%d mm", (int) (pi->pagewidth*25.4/72),(int) (pi->pageheight*25.4/72)); + label[7].text = (unichar_t *) pb; + label[7].text_is_1byte = true; + gcd[7].gd.label = &label[7]; + gcd[7].gd.mnemonic = 'S'; + gcd[7].gd.pos.x = 60; gcd[7].gd.pos.y = gcd[6].gd.pos.y-6; + gcd[7].gd.pos.width = 90; + gcd[7].gd.flags = gg_visible | gg_enabled; + gcd[7].gd.cid = CID_Pagesize; + gcd[7].gd.u.list = pagesizes; + gcd[7].creator = GListFieldCreate; + + + label[8].text = (unichar_t *) _STR_Copies; + label[8].text_in_resource = true; + gcd[8].gd.label = &label[8]; + gcd[8].gd.mnemonic = 'C'; + gcd[8].gd.pos.x = 160; gcd[8].gd.pos.y = gcd[6].gd.pos.y; + gcd[8].gd.flags = gg_visible | gg_enabled; + gcd[8].gd.cid = CID_CopiesLab; + gcd[8].creator = GLabelCreate; + + sprintf(buf,"%d",pi->copies); + label[9].text = (unichar_t *) buf; + label[9].text_is_1byte = true; + gcd[9].gd.label = &label[9]; + gcd[9].gd.mnemonic = 'C'; + gcd[9].gd.pos.x = 200; gcd[9].gd.pos.y = gcd[7].gd.pos.y; + gcd[9].gd.pos.width = 40; + gcd[9].gd.flags = gg_visible | gg_enabled; + gcd[9].gd.cid = CID_Copies; + gcd[9].creator = GTextFieldCreate; + + + label[10].text = (unichar_t *) _STR_Printer; + label[10].text_in_resource = true; + gcd[10].gd.label = &label[10]; + gcd[10].gd.mnemonic = 'P'; + gcd[10].gd.pos.x = 5; gcd[10].gd.pos.y = 30+gcd[7].gd.pos.y+6; + gcd[10].gd.flags = gg_visible | gg_enabled; + gcd[10].gd.cid = CID_PrinterLab; + gcd[10].creator = GLabelCreate; + + label[11].text = (unichar_t *) pi->printer; + label[11].text_is_1byte = true; + if ( pi->printer!=NULL ) + gcd[11].gd.label = &label[11]; + gcd[11].gd.mnemonic = 'P'; + gcd[11].gd.pos.x = 60; gcd[11].gd.pos.y = gcd[10].gd.pos.y-6; + gcd[11].gd.pos.width = 90; + gcd[11].gd.flags = gg_visible | gg_enabled; + gcd[11].gd.cid = CID_Printer; + gcd[11].gd.u.list = PrinterList(); + gcd[11].creator = GListFieldCreate; + + + gcd[12].gd.pos.x = 30-3; gcd[12].gd.pos.y = gcd[11].gd.pos.y+36; + gcd[12].gd.pos.width = -1; gcd[12].gd.pos.height = 0; + gcd[12].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[12].text = (unichar_t *) _STR_OK; + label[12].text_in_resource = true; + gcd[12].gd.mnemonic = 'O'; + gcd[12].gd.label = &label[12]; + gcd[12].gd.handle_controlevent = PG_OK; + gcd[12].creator = GButtonCreate; + + gcd[13].gd.pos.x = -30; gcd[13].gd.pos.y = gcd[12].gd.pos.y+3; + gcd[13].gd.pos.width = -1; gcd[13].gd.pos.height = 0; + gcd[13].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[13].text = (unichar_t *) _STR_Cancel; + label[13].text_in_resource = true; + gcd[13].gd.label = &label[13]; + gcd[13].gd.mnemonic = 'C'; + gcd[13].gd.handle_controlevent = PG_Cancel; + gcd[13].creator = GButtonCreate; + + gcd[14].gd.pos.x = 2; gcd[14].gd.pos.y = 2; + gcd[14].gd.pos.width = pos.width-4; gcd[14].gd.pos.height = pos.height-2; + gcd[14].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + gcd[14].creator = GGroupCreate; + + GGadgetsCreate(pi->setup,gcd); + GTextInfoListFree(gcd[11].gd.u.list); + PG_SetEnabled(pi); + GDrawSetVisible(pi->setup,true); + while ( !pi->done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(pi->setup); + pi->done = false; +return( pi->printtype!=pt_unknown ); +} + +/* ************************************************************************** */ +/* ************************* Code for Print dialog ************************** */ +/* ************************************************************************** */ + +/* Slightly different from one in fontview */ +static int FVSelCount(FontView *fv) { + int i, cnt=0; + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && SCWorthOutputting(fv->sf->chars[i])) ++cnt; +return( cnt); +} + +static void QueueIt(PI *pi) { + int pid; + int stdinno, i, status; + char *argv[40], buf[10]; + + if ( (pid=fork())==0 ) { + stdinno = fileno(stdin); + close(stdinno); + dup2(fileno(pi->out),stdinno); + i = 0; + if ( pi->printtype == pt_ghostview ) { + if ( !use_gv ) + argv[i++] = "ghostview"; + else { + argv[i++] = "gv"; + argv[i++] = "-antialias"; + } + argv[i++] = "-"; /* read from stdin */ + } else if ( pi->printtype == pt_lp ) { + argv[i++] = "lp"; + if ( pi->printer!=NULL ) { + argv[i++] = "-d"; + argv[i++] = pi->printer; + } + if ( pi->copies>1 ) { + argv[i++] = "-n"; + sprintf(buf,"%d", pi->copies ); + argv[i++] = buf; + } + } else if ( pi->printtype == pt_lpr ) { + argv[i++] = "lpr"; + if ( pi->printer!=NULL ) { + argv[i++] = "-P"; + argv[i++] = pi->printer; + } + if ( pi->copies>1 ) { + sprintf(buf,"-#%d", pi->copies ); + argv[i++] = buf; + } + } else { + char *temp, *pt, *start; + int quoted=0; + /* This is in the child. We're going to do an exec soon */ + /* We don't need to free things here */ + temp = copy(printcommand); + for ( pt=start=temp; *pt ; ++pt ) { + if ( *pt==quoted ) { + quoted = 0; + *pt = '\0'; + } else if ( quoted ) + /* Do nothing */; + else if ( *pt=='"' || *pt=='\'' ) { + start = pt+1; + quoted = *pt; + } else if ( *pt==' ' ) + *pt = '\0'; + if ( *pt=='\0' ) { + if ( istart && iprinttype == pt_ghostview ) { + argv[0] = "gv"; + execvp(argv[0],argv); + } + fprintf( stderr, "Failed to exec print job\n" ); + /*GDrawIError("Failed to exec print job");*/ /* X Server gets confused by talking to the child */ + _exit(1); + } else if ( pid==-1 ) + GDrawIError("Failed to fork print job"); + else if ( pi->printtype != pt_ghostview ) { + waitpid(pid,&status,0); + if ( !WIFEXITED(status) ) + GDrawIError("Failed to queue print job"); + } else { + sleep(1); + if ( waitpid(pid,&status,WNOHANG)>0 ) { + if ( !WIFEXITED(status) ) + GDrawIError("Failed to run ghostview"); + } + } + waitpid(-1,&status,WNOHANG); /* Clean up any zombie ghostviews */ +} + +#define CID_Display 1001 +#define CID_Chars 1002 +#define CID_MultiSize 1003 +#define CID_Sample 1004 +#define CID_PSLab 1005 +#define CID_PointSize 1006 +#define CID_SmpLab 1007 +#define CID_SampleText 1008 +#define CID_OK 1009 +#define CID_Cancel 1010 +#define CID_Group 1011 + +static void PRT_SetEnabled(PI *pi) { + int enable_ps, enable_sample; + + enable_ps = !GGadgetIsChecked(GWidgetGetControl(pi->gw,CID_Chars)); + enable_sample = GGadgetIsChecked(GWidgetGetControl(pi->gw,CID_Sample)); + + GGadgetSetEnabled(GWidgetGetControl(pi->gw,CID_PSLab),enable_ps); + GGadgetSetEnabled(GWidgetGetControl(pi->gw,CID_PointSize),enable_ps); + GGadgetSetEnabled(GWidgetGetControl(pi->gw,CID_SmpLab),enable_sample); + GGadgetSetEnabled(GWidgetGetControl(pi->gw,CID_SampleText),enable_sample); +} + +static void DoPrinting(PI *pi,char *filename,unichar_t *sample) { + if ( pi->pt==pt_fontdisplay ) + PIFontDisplay(pi); + else if ( pi->pt==pt_fontsample ) + PIFontSample(pi,sample); + else if ( pi->pt==pt_multisize ) + PIMultiSize(pi); + else + PIChars(pi); + rewind(pi->out); + if ( ferror(pi->out) ) + GDrawError("Failed to generate postscript in file %s", filename==NULL?"temporary":filename ); + if ( pi->printtype!=pt_file ) + QueueIt(pi); + if ( fclose(pi->out)!=0 ) + GDrawError("Failed to generate postscript in file %s", filename==NULL?"temporary":filename ); +} + +static int PRT_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + PI *pi = GDrawGetUserData(GGadgetGetWindow(g)); + int err = false; + unichar_t *sample; + int di = pi->fv!=NULL?0:pi->mv!=NULL?2:1; + unichar_t *ret; + char *file; + static unichar_t filter[] = { '*','.','p','s', '\0' }; + char buf[100]; + unichar_t ubuf[100]; + + pi->pt = GGadgetIsChecked(GWidgetGetControl(pi->gw,CID_Chars))? pt_chars: + GGadgetIsChecked(GWidgetGetControl(pi->gw,CID_Sample))? pt_fontsample: + GGadgetIsChecked(GWidgetGetControl(pi->gw,CID_MultiSize))? pt_multisize: + pt_fontdisplay; + if ( pi->pt==pt_fontdisplay || pi->pt==pt_fontsample ) { + if ( pi->pt==pt_fontdisplay ) + pi->pointsize = GetIntR(pi->gw,CID_PointSize,_STR_Pointsize,&err); + else { + pi->pointsizes = ParseBitmapSizes(GWidgetGetControl(pi->gw,CID_PointSize), + _STR_Pointsize,&err); + if ( pi->pointsizes!=NULL ) + pi->pointsize = pi->pointsizes[0]; + } + if ( err ) +return(true); + if ( pi->pointsize<1 || pi->pointsize>200 ) { + GWidgetErrorR(_STR_InvalidPointsize,_STR_InvalidPointsize); +return(true); + } + } + if ( pi->printtype==pt_unknown ) + if ( !PageSetup(pi)) +return(true); + + if ( pi->printtype==pt_file ) { + sprintf(buf,"pr-%.90s.ps", pi->sf->fontname ); + uc_strcpy(ubuf,buf); + ret = GWidgetSaveAsFile(GStringGetResource(_STR_PrintToFile,NULL),ubuf,filter,NULL,NULL); + if ( ret==NULL ) +return(true); + file = u2def_copy(ret); + free(ret); + pi->out = fopen(file,"wb"); + if ( pi->out==NULL ) { + GDrawError("Failed to open file %s for output", file ); + free(file); +return(true); + } + } else { + file = NULL; + pi->out = tmpfile(); + if ( pi->out==NULL ) { + GWidgetErrorR(_STR_FailedOpenTemp,_STR_FailedOpenTemp); +return(true); + } + } + + sample = NULL; + if ( pi->pt==pt_fontsample ) + sample = GGadgetGetTitle(GWidgetGetControl(pi->gw,CID_SampleText)); + pdefs[di].last_cs = pi->sf->encoding_name; + pdefs[di].pt = pi->pt; + pdefs[di].pointsize = pi->pointsize; + free( pdefs[di].text ); + pdefs[di].text = sample; + + DoPrinting(pi,file,sample); + free(file); + + pi->done = true; + } +return( true ); +} + +static int PRT_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + PI *pi = GDrawGetUserData(GGadgetGetWindow(g)); + pi->done = true; + } +return( true ); +} + +static int PRT_Setup(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + PI *pi = GDrawGetUserData(GGadgetGetWindow(g)); + PageSetup(pi); + } +return( true ); +} + +static int PRT_RadioSet(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + PI *pi = GDrawGetUserData(GGadgetGetWindow(g)); + PRT_SetEnabled(pi); + } +return( true ); +} + +static void prt_resize(PI *pi) { + GRect size, gpos; + + GDrawGetSize(pi->gw,&size); + GGadgetResize(GWidgetGetControl(pi->gw,CID_Group),size.width-4,size.height-4); + GGadgetMove(GWidgetGetControl(pi->gw,CID_OK),40,size.height-48); + GGadgetMove(GWidgetGetControl(pi->gw,CID_Cancel),size.width-GDrawPointsToPixels(pi->gw,GIntGetResource(_NUM_Buttonsize))-40,size.height-48); + GGadgetGetSize(GWidgetGetControl(pi->gw,CID_SampleText),&gpos); + GGadgetResize(GWidgetGetControl(pi->gw,CID_SampleText),size.width-14,size.height-gpos.y-56); + GDrawRequestExpose(pi->gw,NULL,false); +} + +static int prt_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + PI *pi = GDrawGetUserData(gw); + pi->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("print.html"); +return( true ); + } +return( false ); + } else if ( event->type==et_resize && event->u.resize.sized ) { + prt_resize(GDrawGetUserData(gw)); + } +return( true ); +} + +/* English */ +static unichar_t _simple1[] = { ' ','A',' ','q','u','i','c','k',' ','b', + 'r','o','w','n',' ','f','o','x',' ','j','u','m','p','s',' ','o','v','e', + 'r',' ','t','h','e',' ','l','a','z','y',' ','d','o','g','.', '\0' }; +static unichar_t _simple2[] = { 'F','e','w',' ','z','e','b','r','a','s',' ','v', + 'a','l','i','d','a','t','e',' ','m','y',' ','p','a','r','a','d','o','x', + ',',' ','q','u','o','t','h',' ','J','a','c','k',' ','X','e','n','o', 0 }; +/* Swedish */ +static unichar_t _simple3[] = { 'f','l','y','g','a','n','d','e',' ','b',(uint8)(uint8)'ä','c', + 'k','a','s','i','n','e','r',' ','s',(uint8)(uint8)'ö','k','a',' ','h','w','i','l','a', + ' ','p',(uint8)'å',' ','m','j','u','k','a',' ','t','u','v','o','r', '\0' }; +static unichar_t _simple4[] = { ' ','A',' ','q','u','i','c','k',' ','b', + 'r','o','w','n',' ','v','i','x','e','n',' ','j','u','m','p','s',' ','f','o', + 'r',' ','t','h','e',' ','l','a','z','y',' ','d','o','g','.', '\0' }; +static unichar_t _simple5[] = { ' ','T','h','e',' ','q','u','i','c','k',' ','b', + 'l','o','n','d','e',' ','d','o','x','y',' ','j','u','m','p','s',' ','o','v', + 'e','r',' ','a','n',' ','u','n','f','a','z','e','d',' ','w','a','g','.', '\0' }; +/* German (from http://shiar.net/misc/txt/pangram.en) */ +/* Twelve boxing fighters hunted Eva across the great dike of Sylt */ +static unichar_t _simple6[] = { 'z','w',(uint8)'ö','l','f',' ','B','o','x','k',(uint8)'ä','m','p','f','e','r', + ' ','j','a','g','t','e','n',' ','E','v','a',' ','q','u','e','r', + ' ',(uint8)'ü','b','e','r',' ','d','e','n',' ','g','r','o',(uint8)'ß','e','n', + ' ','S','y','l','t','e','r',' ','D','e','i','c','h', 0 }; +/* French (from http://shiar.net/misc/txt/pangram.en) */ +/* Carry this old wisky to the blond smoking judge */ +static unichar_t _simple7[] = { 'p','o','r','t','e','z',' ','c','e', + ' ','v','i','e','u','x',' ','w','h','i','s','k','y',' ','a','u', + ' ','j','u','g','e',' ','b','l','o','n','d',' ','q','u','i', + ' ','f','u','m','e', 0 }; +static unichar_t _simple8[] = { 'L','e','s',' ','n','a',(uint8)'ï','f','s',' ', + (uint8)'æ','g','i','t','h','a','l','e','s',' ','h',(uint8)'â','t','i','f','s', + ' ','p','o','n','d','a','n','t',' ',(uint8)'à',' ','N','o',(uint8)'ë','l', + ' ','o',(uint8)'ù',' ','i','l',' ','g',(uint8)'è','l','e',' ', + 's','o','n','t',' ','s',(uint8)'û','r','s',' ','d','\'', + (uint8)'ê','t','r','e',' ','d',(uint8)'é',(uint8)'ç','u','s',' ', + 'e','t',' ','d','e',' ','v','o','i','r',' ','l','e','u','r','s',' ', + 'd','r',(uint8)'ô','l','e','s',' ','d','\'',0x153,'u','f','s',' ', + 'a','b',(uint8)'î','m',(uint8)'é','s','.', 0 }; +/* Dutch (from http://shiar.net/misc/txt/pangram.en) */ +/* Sexy by body, though scared by the swimsuit */ +static unichar_t _simple9[] = { ' ', 's','e','x','y',' ','q','u','a',' ', + 'l','i','j','f',',',' ','d','o','c','h',' ','b','a','n','g',' ', + 'v','o','o','r',' ','\'','t',' ','z','w','e','m','p','a','k', 0 }; +/* Polish (from http://shiar.net/misc/txt/pangram.en) */ +/* to push a hedgehog or eight bins of figs in this boat */ +static unichar_t _simple10[] = { ' ', 'p', 'c', 'h', 'n', 0x105, 0x107, ' ', + 'w', ' ', 't', 0x119, ' ', 0x142, (uint8)'ó', 'd', 0x17a, ' ', + 'j', 'e', 0x17c, 'a', ' ', 'l', 'u', 'b', ' ', 'o', 0x15b, 'm', ' ', + 's', 'k', 'r', 'z', 'y', 0x144, ' ', 'f', 'i', 'g', ' ', 0 }; +/* Slovaka (from http://shiar.net/misc/txt/pangram.en) */ +static unichar_t _simple11[] = { ' ', 's', 't', 'a', 'r', (uint8)'ý', ' ', + 'k', (uint8)'ô', 0x148, ' ', 'n', 'a', ' ', 'h', 0x155, 'b', 'e', ' ', + 'k', 'n', (uint8)'í', 'h', ' ', 0x17e, 'u', 'j', 'e', ' ', + 't', (uint8)'í', 0x161, 'k', 'o', ' ', + 'p', 'o', 'v', (uint8)'ä', 'd', 'n', 'u', 't', (uint8)'é', ' ', + 'r', 'u', 0x17e, 'e', ',', ' ', 'n', 'a', ' ', 's', 't', 0x13a, 'p', 'e', ' ', + 's', 'a', ' ', 0x10f, 'a', 't', 'e', 0x13e, ' ', + 'u', 0x10d, (uint8)'í', ' ', 'k', 'v', (uint8)'á', 'k', 'a', 0x165, ' ', + 'n', 'o', 'v', (uint8)'ú', ' ', (uint8)'ó', 'd', 'u', ' ', 'o', ' ', + 0x17e, 'i', 'v', 'o', 't', 'e', ' ', 0 }; +/* Czech (from http://shiar.net/misc/txt/pangram.en) */ +static unichar_t _simple12[] = { ' ', 'p', 0x159, (uint8)'í', 'l', 'i', 0x161, + ' ', 0x17e, 'l', 'u', 0x165, 'o', 'u', 0x10d, 'k', (uint8)'ý', ' ', + 'k', 0x16f, 0x148, ' ', (uint8)'ú', 'p', 0x11b, 'l', ' ', 0x10f, + (uint8)'á', 'b', 'e', 'l', 's', 'k', (uint8)'é', ' ', 'k', (uint8)'ó', + 'd', 'y', ' ', 0 }; + +static unichar_t *simplechoices[] = { _simple1, _simple2, _simple3, _simple4, + _simple5, _simple6, _simple7, _simple8, _simple9, _simple10, _simple11, + _simple12, NULL }; +static unichar_t *simple[] = { _simple1, NULL }; +/* Hebrew (from http://shiar.net/misc/txt/pangram.en) */ +static unichar_t _simplehebrew1[] = { ' ', '?', 0x5d3, 0x5d2, ' ', 0x5e1, + 0x5e7, 0x5e8, 0x5df, ' ', 0x5e9, 0x5d8, ' ', 0x5d1, 0x5d9, 0x5dd, ' ', + 0x5de, 0x5d0, 0x5d5, 0x5db, 0x5d6, 0x5d1, ' ', 0x5d5, 0x5dc, 0x5e4, + 0x5ea, 0x5e2, ' ', 0x5de, 0x5e6, 0x5d0, ' ', 0x5dc, 0x5d5, ' ', 0x5d7, 0x5d1, 0x5e8, 0x5d4, ' ', 0x5d0, 0x5d9, 0x5da, ' ', 0x5d4, 0x5e7, 0x5dc, 0x5d9, 0x5d8, 0x5d4, ' ', 0 }; +static unichar_t *simplehebrew[] = { _simplehebrew1, NULL }; +/* Katakana (from http://shiar.net/misc/txt/pangram.en) */ +static unichar_t _simplekata1[] = { ' ', 0x30a4, 0x30ed, 0x30cf, 0x30cb, 0x30db, + 0x30d8, 0x30c8, ' ', 0x30c1, 0x30ea, 0x30cc, 0x30eb, 0x30f2, ' ', + 0x30ef, 0x30ab, 0x30e8, 0x30bf, 0x30ec, 0x30bd, ' ', 0x30c4, 0x30cd, + 0x30ca, 0x30e9, 0x30e0, '/', + ' ', 0x30a6, 0x30f0, 0x30ce, 0x30aa, 0x30af, 0x30e4, 0x30de, ' ', + 0x30b1, 0x30d5, 0x30b3, 0x30a8, 0x30c6, ' ', 0x30a2, 0x30b5, 0x30ad, + 0x30e6, 0x30e1, 0x30df, 0x30b7, ' ', 0x30f1, 0x30d2, 0x30e2, 0x30bb, + 0x30b9, 0x30f3, ' ', '\0' }; +static unichar_t *simplekata[] = { _simplekata1, NULL }; +/* Hiragana (from http://shiar.net/misc/txt/pangram.en) */ +static unichar_t _simplehira1[] = { ' ', 0x3044, 0x308d, 0x306f, 0x306b, 0x307b, + 0x3078, 0x3068, 0x3061, 0x308a, 0x306c, 0x308b, 0x3092, '/', + ' ', 0x308f, 0x304b, 0x3088, 0x305f, 0x308c, 0x305d, 0x3064, 0x306d, + 0x306a, 0x3089, 0x3080, '/', + ' ', 0x3046, 0x3090, 0x306e, 0x304a, 0x304f, 0x3084, 0x307e, 0x3051, + 0x3075, 0x3053, 0x3048, 0x3066, '/', + ' ', 0x3042, 0x3055, 0x304d, 0x3086, 0x3081, 0x307f, 0x3057, 0x3091, + 0x3072, 0x3082, 0x305b, 0x3059, ' ', 0 }; +static unichar_t *simplehira[] = { _simplehira1, NULL }; +/* Russian */ +static unichar_t _simplecyrill1[] = {' ', 0x421, 0x44a, 0x435, 0x448, 0x44c, ' ', + 0x435, 0x449, 0x451, ' ', 0x44d, 0x442, 0x438, 0x445, ' ', 0x43c, + 0x44f, 0x433, 0x43a, 0x438, 0x445, ' ', 0x444, 0x440, 0x430, 0x43d, + 0x446, 0x443, 0x437, 0x441, 0x43a, 0x438, 0x445, ' ', 0x431, 0x443, + 0x43b, 0x43e, 0x43a, ',', ' ', 0x434, 0x430, ' ', 0x432, 0x44b, 0x43f, + 0x435, 0x439, ' ', 0x447, 0x430, 0x44e, '!', 0 }; +/* Eat more those soft french 'little-sweet-breads' and drink tea */ +static unichar_t _simplecyrill2[] = { ' ', 0x412, ' ', 0x447, 0x430, 0x449, 0x430, + 0x445, ' ', 0x44e, 0x433, 0x430, ' ', 0x436, 0x438, 0x43b, '-', 0x431, + 0x44b, 0x43b, ' ', 0x446, 0x438, 0x442, 0x440, 0x443, 0x441, ' ', '-', + '-', ' ', 0x434, 0x430, ',', ' ', 0x43d, 0x43e, ' ', 0x444, 0x430, + 0x43b, 0x44c, 0x448, 0x438, 0x432, 0x44b, 0x439, ' ', 0x44d, 0x43a, + 0x437, 0x435, 0x43c, 0x43f, 0x43b, 0x44f, 0x440, 0x44a, '!', 0 }; +/* "In the deep forests of South citrus lived... /answer/Yeah but falsificated one!" */ +static unichar_t *simplecyrillchoices[] = { _simplecyrill1, _simplecyrill2, NULL }; +static unichar_t *simplecyrill[] = { _simplecyrill1, NULL }; +/* Russian */ +static unichar_t _annakarenena1[] = { ' ',0x412,0x441,0x463,' ',0x441,0x447,0x430,0x441, + 0x442,0x43b,0x438,0x432,0x44b,0x44f,' ',0x441,0x435,0x43c,0x44c,0x438, + ' ',0x43f,0x43e,0x445,0x43e,0x436,0x438,' ',0x434,0x440,0x443,0x433, + 0x44a,' ',0x43d,0x430,' ',0x434,0x440,0x443,0x433,0x430,',',' ',0x43a, + 0x430,0x436,0x434,0x430,0x44f,' ',0x43d,0x435,0x441,0x447,0x430,0x441, + 0x442,0x43b,0x438,0x432,0x430,0x44f,' ',0x441,0x435,0x43c,0x44c,0x44f, + ' ',0x43d,0x435,0x441,0x447,0x430,0x441,0x442,0x43b,0x438,0x432,0x430, + ' ',0x43f,0x43e,'-',0x441,0x432,0x43e,0x435,0x43c,0x443,'.', '\0' }; +static unichar_t _annakarenena2[] = { ' ',0x0412,0x0441,0x0435,' ',0x0441,0x043c, + 0x0463,0x0448,0x0430,0x043b,0x043e,0x0441,0x044c,' ',0x0432,0x044a,' ', + 0x0434,0x043e,0x043c,0x0463,' ',0x041e,0x0431,0x043b,0x043e,0x043d, + 0x0441,0x043a,0x0438,0x0445,0x044a,'.',' ',0x0416,0x0435,0x043d,0x0430, + ' ',0x0443,0x0437,0x043d,0x0430,0x043b,0x0430,',',' ',0x0447,0x0442, + 0x043e,' ',0x043c,0x0443,0x0436,0x044a,' ',0x0431,0x044b,0x043b,0x044a, + ' ',0x0441,0x0432,0x044f,0x0437,0x0438,' ',0x0441,0x044a,' ',0x0431, + 0x044b,0x0432,0x0448,0x0435,0x044e,' ',0x0432,0x044a,' ',0x0438,0x0445, + 0x044a,' ',0x0434,0x043e,0x043c,0x0463,' ',0x0444,0x0440,0x0430,0x043d, + 0x0446,0x0443,0x0436,0x0435,0x043d,0x043a,0x043e,0x044e,'-',0x0433, + 0x0443,0x0432,0x0435,0x0440,0x043d,0x0430,0x043d,0x0442,0x043a,0x043e, + 0x0439,',',' ',0x0438,' ',0x043e,0x0431,0x044a,0x044f,0x0432,0x0438, + 0x043b,0x0430,' ',0x043c,0x0443,0x0436,0x0443,',',' ',0x0447,0x0442, + 0x043e,' ',0x043d,0x0435,' ',0x043c,0x043e,0x0436,0x0435,0x0442,0x044a, + ' ',0x0436,0x0438,0x0442,0x044c,' ',0x0441,0x044a,' ',0x043d,0x0438, + 0x043c,0x044a,' ',0x0432,0x044a,' ',0x043e,0x0434,0x043d,0x043e,0x043c, + 0x044a,' ',0x0434,0x043e,0x043c,0x0463,'.', '\0' }; +static unichar_t *annakarenena[] = { _annakarenena1, _annakarenena2, NULL }; +/* Spanish */ +static unichar_t _donquixote[] = { ' ','E','n',' ','u','n',' ','l','u','g','a','r', + ' ','d','e',' ','l','a',' ','M','a','n','c','h','a',',',' ','d','e', + ' ','c','u','y','o',' ','n','o','m','b','r','e',' ','n','o',' ','q', + 'u','i','e','r','o',' ','a','c','o','r','d','a','r','m','e',',',' ', + 'n','o',' ','h','a',' ','m','u','c','h','o',' ','t','i','e','m','p', + 'o',' ','q','u','e',' ','v','i','v',(uint8)'í','a',' ','u','n',' ','h','i', + 'd','a','l','g','o',' ','d','e',' ','l','o','s',' ','d','e',' ','l', + 'a','n','z','a',' ','e','n',' ','a','s','t','i','l','l','e','r','o', + ',',' ','a','d','a','r','g','a',' ','a','n','t','i','g','u','a',',', + ' ','r','o','c',(uint8)'í','n',' ','f','l','a','c','o',' ','y',' ','g','a', + 'l','g','o',' ','c','o','r','r','e','d','o','r','.', '\0' }; +static unichar_t *donquixote[] = { _donquixote, NULL }; +/* German */ +static unichar_t _faust1[] = { 'I','h','r',' ','n','a','h','t',' ','e','u','c', + 'h',' ','w','i','e','d','e','r',',',' ','s','c','h','w','a','n','k', + 'e','n','d','e',' ','G','e','s','t','a','l','t','e','n',',', '\0'}; +static unichar_t _faust2[] = { 'D','i','e',' ','f','r',(uint8)'ü','h',' ','s','i','c', + 'h',' ','e','i','n','s','t',' ','d','e','m',' ','t','r',(uint8)'ü','b','e', + 'n',' ','B','l','i','c','k',' ','g','e','z','e','i','g','t','.', '\0' }; +static unichar_t _faust3[] = { 'V','e','r','s','u','c','h',' ','i','c','h',' ', + 'w','o','h','l',',',' ','e','u','c','h',' ','d','i','e','s','m','a', + 'l',' ','f','e','s','t','z','u','h','a','l','t','e','n','?', '\0'}; +static unichar_t _faust4[] = { 'F',(uint8)'ü','h','l',' ','i','c','h',' ','m','e','i', + 'n',' ','H','e','r','z',' ','n','o','c','h',' ','j','e','n','e','m', + ' ','W','a','h','n',' ','g','e','n','e','i','g','t','?', '\0' }; +static unichar_t _faust5[] = { 'I','h','r',' ','d','r',(uint8)'ä','n','g','t',' ','e', + 'u','c','h',' ','z','u','!',' ','N','u','n',' ','g','u','t',',',' ','s' + ,'o',' ','m',(uint8)'ö','g','t',' ','i','h','r',' ','w','a','l','t','e','n', + ',', '\0'}; +static unichar_t _faust6[] = { 'W','i','e',' ','i','h','r',' ','a','u','s',' ', + 'D','u','n','s','t',' ','u','n','d',' ','N','e','b','e','l',' ','u', + 'm',' ','m','i','c','h',' ','s','t','e','i','g','t',';', '\0'}; +static unichar_t _faust7[] = { 'M','e','i','n',' ','B','u','s','e','n',' ','f', + (uint8)'ü','h','l','t',' ','s','i','c','h',' ','j','u','g','e','n','d','l', + 'i','c','h',' ','e','r','s','c','h',(uint8)'ü','t','t','e','r','t', '\0' }; +static unichar_t _faust8[] = { 'V','o','m',' ','Z','a','u','b','e','r','h','a', + 'u','c','h',',',' ','d','e','r',' ','e','u','r','e','n',' ','Z','u', + 'g',' ','u','m','w','i','t','t','e','r','t','.', '\0' }; +static unichar_t *faust[] = { _faust1, _faust2, _faust3, _faust4, _faust5, + _faust6, _faust7, _faust8, NULL }; +/* Anglo Saxon */ +static unichar_t _beorwulf1[] = { 'H','w',(uint8)'æ','t',',',' ','w','e',' ','G','a', + 'r','-','D','e','n','a',' ',' ','i','n',' ','g','e','a','r','d','a', + 'g','u','m', '\0' }; +static unichar_t _beorwulf1_5[] = {(uint8)'þ','e','o','d','c','y','n','i','n','g','a',' ',' ', + (uint8)'þ','r','y','m',' ','g','e','f','r','u','n','o','n',',', '\0' }; +static unichar_t _beorwulf2[] = { 'h','u',' ',(uint8)'ð','a',' ',(uint8)'æ',(uint8)'þ','e','l','i', + 'n','g','a','s',' ',' ','e','l','l','e','n',' ','f','r','e','m','e', + 'd','o','n','.', '\0' }; +static unichar_t _beorwulf3[] = { ' ','O','f','t',' ','S','c','y','l','d',' ', + 'S','c','e','f','i','n','g',' ',' ','s','c','e','a',(uint8)'þ','e','n','a', + ' ',(uint8)'þ','r','e','a','t','u','m',',', '\0' }; +static unichar_t _beorwulf4[] = { 'm','o','n','e','g','u','m',' ','m',(uint8)'æ','g', + (uint8)'þ','u','m',' ',' ','m','e','o','d','o','s','e','t','l','a',' ','o', + 'f','t','e','a','h',';', '\0' }; +static unichar_t _beorwulf5[] = { 'e','g','s','o','d','e',' ','E','o','r','l', + 'e','.',' ',' ','S','y',(uint8)'ð',(uint8)'ð','a','n',' ',(uint8)'æ','r','e','s','t',' ', + 'w','e','a','r',(uint8)'ð', '\0' }; +static unichar_t _beorwulf6[] = { 'f','e','a','s','c','e','a','f','t',' ','f', + 'u','n','d','e','n',',',' ',' ','(','h','e',' ',(uint8)'þ',(uint8)'æ','s',' ','f', + 'r','o','f','r','e',' ','g','e','b','a','d',')', '\0' }; +static unichar_t _beorwulf7[] = { 'w','e','o','x',' ','u','n','d','e','r',' ', + 'w','o','l','c','n','u','m',',',' ',' ','w','e','o','r',(uint8)'ð','m','y', + 'n','d','u','m',' ',(uint8)'þ','a','h',',', '\0' }; +static unichar_t _beorwulf8[] = { 'o',(uint8)'ð',(uint8)'þ',(uint8)'æ','t',' ','h','i','m',' ',(uint8)'æ', + 'g','h','w','y','l','e',' ',' ',(uint8)'þ','a','r','a',' ','y','m','b','s', + 'i','t','t','e','n','d','r','a', '\0' }; +static unichar_t _beorwulf9[] = { 'o','f','e','r',' ','h','r','o','n','r','a', + 'd','e',' ',' ','h','y','a','n',' ','s','c','o','l','d','e',',', '\0'}; +static unichar_t _beorwulf10[] = { 'g','o','m','b','a','n',' ','g','y','l','d', + 'a','n',':',' ',(uint8)'þ',(uint8)'æ','t',' ','w',(uint8)'æ','s',' ','g','o','d',' ','c', + 'y','n','i','n','g','!', '\0' }; +static unichar_t *beorwulf[] = { _beorwulf1, _beorwulf1_5, _beorwulf2, _beorwulf3, + _beorwulf4, _beorwulf5, _beorwulf6, _beorwulf7, _beorwulf8, + _beorwulf9, _beorwulf10, NULL }; +/* Italian */ +static unichar_t _inferno1[] = { ' ','N','e','l',' ','m','e','z','z','o',' ', + 'd','e','l',' ','c','a','m','m','i','n',' ','d','i',' ', + 'n','o','s','t','r','a',' ','v','i','t','a', '\0' }; +static unichar_t _inferno2[] = { 'm','i',' ','r','i','t','r','o','v','a','i', + ' ','p','e','r',' ','u','n','a',' ','s','e','l','v','a',' ', + 'o','b','s','c','u','r','a',',', '\0' }; +static unichar_t _inferno3[] = { 'c','h',(uint8)'é',' ','l','a',' ','d','i','r','i', + 't','t','a',' ','v','i','a',' ','e','r','a',' ','s','m','a','r','r', + 'i','t','a','.', '\0' }; +static unichar_t _inferno4[] = { ' ','A','h','i',' ','q','u','a','n','t','o', + ' ','a',' ','d','i','r',' ','q','u','a','l',' ','e','r','a',' ',(uint8)'è', + ' ','c','o','s','a',' ','d','u','r','a', '\0' }; +static unichar_t _inferno5[] = { 'e','s','t','a',' ','s','e','l','v','a',' ', + 's','e','l','v','a','g','g','i','a',' ','e',' ','a','s','p','r','a',' ', + 'e',' ','f','o','r','t','e', '\0' }; +static unichar_t _inferno6[] = { 'c','h','e',' ','n','e','l',' ','p','e','n', + 's','i','e','r',' ','r','i','n','o','v','a',' ','l','a',' ','p','a','u', + 'r','a','!', '\0' }; +static unichar_t *inferno[] = { _inferno1, _inferno2, _inferno3, _inferno4, + _inferno5, _inferno6, NULL }; +/* Latin */ +static unichar_t _debello1[] = { ' ','G','a','l','l','i','a',' ','e','s','t', + ' ','o','m','n','i','s',' ','d',0x012b,'v',0x012b,'s','a',' ','i','n', + ' ','p','a','r','t',0x0113,'s',' ','t','r',0x0113,'s',',',' ','q','u', + 0x0101,'r','u','m',' ',0x016b,'n','u','m',' ','i','n','c','o','l','u', + 'n','t',' ','B','e','l','g','a','e',',',' ','a','l','i','a','m',' ', + 'A','q','u',0x012b,'t',0x0101,'n',0x012b,',',' ','t','e','r','t','i', + 'a','m',',',' ','q','u',0x012b,' ','i','p','s',0x014d,'r','u','m',' ', + 'l','i','n','g','u',0x0101,' ','C','e','l','t','a','e',',',' ','n', + 'o','s','t','r',0x0101,' ','G','a','l','l',0x012b,' ','a','p','p','e', + 'l','a','n','t','u','r','.',' ','H',0x012b,' ','o','m','n',0x0113,'s', + ' ','l','i','n','g','u',0x0101,',',' ',0x012b,'n','s','t','i','t', + 0x016b,'t',0x012b,'s',',',' ','l',0x0113,'g','i','b','u','s',' ','i', + 'n','t','e','r',' ','s',0x0113,' ','d','i','f','f','e','r','u','n', + 't','.',' ','G','a','l','l',0x014d,'s',' ','a','b',' ','A','q','u', + 0x012b,'t',0x0101,'n',0x012b,'s',' ','G','a','r','u','m','n','a',' ', + 'f','l',0x016b,'m','e','n',',',' ',0x0101,' ','B','e','l','g',0x012b, + 's',' ','M','a','t','r','o','n','a',' ','e','t',' ','S',0x0113,'q', + 'u','a','n','a',' ','d',0x012b,'v','i','d','i','t','.', '\0' }; +static unichar_t *debello[] = { _debello1, NULL }; +/* French */ +static unichar_t _pheadra1[] = { 'L','e',' ','d','e','s','s','e','i','n',' ', + 'e','n',' ','e','s','t',' ','p','r','i','s',':',' ','j','e',' ','p', + 'a','r','s',',',' ','c','h','e','r',' ','T','h',(uint8)'é','r','a','m',(uint8)'è','n' + ,'e',',', '\0' }; +static unichar_t _pheadra2[] = { 'E','t',' ','q','u','i','t','t','e',' ','l', + 'e',' ','s',(uint8)'é','j','o','u','r',' ','d','e',' ','l',0x0027,'a','i','m', + 'a','b','l','e',' ','T','r',(uint8)'é','z',(uint8)'è','n','e','.', '\0' }; +static unichar_t _pheadra3[] = { 'D','a','n','s',' ','l','e',' ','d','o','u', + 't','e',' ','m','o','r','t','e','l',' ','d','o','n','t',' ','j','e', + ' ','s','u','i','s',' ','a','g','i','t',(uint8)'é',',', '\0' }; +static unichar_t _pheadra4[] = { 'J','e',' ','c','o','m','m','e','n','c','e', + ' ',(uint8)'à',' ','r','o','u','g','i','r',' ','d','e',' ','m','o','n',' ', + 'o','i','s','i','v','e','t',(uint8)'é','.', '\0' }; +static unichar_t _pheadra5[] = { 'D','e','p','u','i','s',' ','p','l','u','s', + ' ','d','e',' ','s','i','x',' ','m','o','i','s',' ',(uint8)'é','l','o','i', + 'g','n',(uint8)'é',' ','d','e',' ','m','o','n',' ','p',(uint8)'è','r','e',',', '\0' }; +static unichar_t _pheadra6[] = { 'J',0x0027,'i','g','n','o','r','e',' ','l', + 'e',' ','d','e','s','t','i','n',' ','d',0x0027,'u','n','e',' ','t', + (uint8)'ê','t','e',' ','s','i',' ','c','h',(uint8)'è','r','e',';', '\0' }; +static unichar_t _pheadra7[] = { 'J',0x0027,'i','g','n','o','r','e',' ','j', + 'u','s','q','u',0x0027,'a','u','x',' ','l','i','e','u','x',' ','q', + 'u','i',' ','l','e',' ','p','e','u','v','e','n','t',' ','c','a','c', + 'h','e','r','.', '\0' }; +static unichar_t *pheadra[] = { _pheadra1, _pheadra2, _pheadra3, _pheadra4, + _pheadra5, _pheadra6, _pheadra7, NULL }; +/* Classical Greek */ +static unichar_t _antigone1[] = { 0x1f6e,' ',0x03ba,0x03bf,0x03b9,0x03bd,0x1f78, + 0x03bd,' ',0x03b1,0x1f50,0x03c4,0x1f71,0x03b4,0x03b5,0x03bb,0x03c6,0x03bf, + 0x03bd,' ',0x1f38,0x03c3,0x03bc,0x1f75,0x03bd,0x03b7,0x03c2,' ',0x03ba, + 0x1f71,0x03c1,0x03b1,',', '\0'}; +static unichar_t _antigone2[] = { 0x1f06,0x1fe4,' ',0x03bf,0x1f36,0x03c3,0x03b8, + 0x1fbd,' ',0x1f45,0x03c4,0x03b9,' ',0x0396,0x03b5,0x1f7a,0x03c2,' ', + 0x03c4,0x1ff6,0x03bd,' ',0x1f00,0x03c0,0x1fbd,' ',0x039f,0x1f30,0x03b4, + 0x1f77,0x03c0,0x03bf,0x03c5,' ',0x03ba,0x03b1,0x03ba,0x1ff6,0x03bd, '\0'}; +static unichar_t _antigone3[] = { 0x1f41,0x03c0,0x03bf,0x1fd6,0x03bf,0x03bd,' ', + 0x03bf,0x1f50,0x03c7,0x1f76,' ',0x03bd,0x1ff7,0x03bd,' ',0x1f14,0x03c4, + 0x03b9,' ',0x03b6,0x03c3,0x03b1,0x03b9,0x03bd,' ',0x03c4,0x03b5,0x03bb, + 0x03b5,0x1fd6,';', '\0' }; +static unichar_t *antigone[] = { _antigone1, _antigone2, _antigone3, NULL }; +static unichar_t _seder1[] = { 0x5d5, 0x5b0, 0x5d0, 0x5b8, 0x5ea, 0x5b8, 0x5d0, ' ', + 0x5de, 0x5b7, 0x5dc, 0x5b0, 0x5d0, 0x5b7, 0x5da, 0x5b0, ' ', + 0x5d4, 0x5b7, 0xfb3e, 0x5b8, 0x5d5, 0x5b6, 0x5ea, ',', ' ', + 0x5d5, 0x5b0, 0xfb2a, 0x5b8, 0x5d7, 0x5b7, 0x5d8, ' ', + 0x5dc, 0x5b0, 0xfb2c, 0x5d5, 0x5c2, 0x5d7, 0x5b5, 0x5d8, ',', ' ', + 0xfb48, 0x5b0, 0xfb2a, 0x5b8, 0x5d7, 0x5b7, 0x5d8, ' ', + 0x5dc, 0x5b0, 0x5ea, 0x5d5, 0x5c2, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb48, 0x5b0, 0xfb2a, 0x5b8, 0x5ea, 0x5b7, 0x5d4, ' ', + 0x5dc, 0x5b0, 0xfb3e, 0x5b7, 0xfb39, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0x5db, 0x5b8, 0x5db, 0x5b8, 0x5d4, ' ', + 0x5dc, 0x5b0, 0x5e0, 0xfb35, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0xfb2b, 0x5b8, 0x5e8, 0x5b7, 0x5e3, ' ', + 0x5dc, 0x5b0, 0x5d7, 0xfb35, 0x5d8, 0x5b0, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0x5d4, 0x5b4, 0xfb3b, 0x5b8, 0x5d4, ' ', + 0x5dc, 0x5b0, 0x5db, 0x5b7, 0x5dc, 0x5b0, 0xfb3b, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0x5e0, 0x5b8, 0xfb2a, 0x5b7, 0x5da, 0x5b0, ' ', + 0x5dc, 0x5b0, 0xfb2a, 0xfb35, 0x5e0, 0x5b0, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0xfb2f, 0x5db, 0x5b0, 0x5dc, 0x5b8, 0x5d4, ' ', + 0x5dc, 0x5b0, 0x5d2, 0x5b7, 0x5d3, 0x5b0, 0x5d9, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b4, 0x5d6, 0x5b0, 0x5d1, 0x5b7, 0x5df, ' ', + 0xfb2e, 0xfb31, 0x5b8, 0x5d0, ' ', + 0xfb31, 0x5b4, 0x5ea, 0x5b0, 0x5e8, 0x5b5, 0x5d9, ' ', + 0x5d6, 0xfb35, 0x5d6, 0x5b5, 0x5d9, '.', ' ', + 0x5d7, 0x5b7, 0x5d3, ' ', + 0xfb32, 0x5b7, 0x5d3, 0x5b0, 0x5d9, 0x5b8, 0x5d0, ',', ' ', + 0x5d7, 0x5b7, 0x5d3, ' ', + 0xfb32, 0x5b7, 0x5d3, 0x5b0, 0x5d9, 0x5b8, 0x5d0, '.', + '\0' }; +static unichar_t _seder2[] = { 0x5d5, 0x5b0, 0x5d0, 0x5b8, 0x5ea, 0x5b8, 0x5d0, ' ', + 0x5d4, 0x5b7, 0xfb47, 0x5b8, 0x5d3, 0xfb4b, 0xfb2a, ' ', + 0xfb3b, 0x5b8, 0x5d3, 0xfb35, 0x5da, 0x5b0, ' ', + 0x5d4, 0xfb35, 0x5d0, ',', ' ', + 0x5d5, 0x5b0, 0xfb2a, 0x5b8, 0x5d7, 0x5b7, 0x5d8, ' ', + 0x5dc, 0x5b0, 0x5de, 0x5b7, 0x5dc, 0x5b0, 0x5d0, 0x5b7, 0x5da, 0x5b0, ' ', + 0x5d4, 0x5b7, 0xfb3e, 0x5b8, 0x5d5, 0x5b6, 0x5ea, ',', ' ', + 0xfb48, 0x5b0, 0xfb2a, 0x5b8, 0x5d7, 0x5b7, 0x5d8, ' ', + 0x5dc, 0x5b0, 0xfb2c, 0x5d5, 0x5c2, 0x5d7, 0x5b5, 0x5d8, ',', ' ', + 0xfb48, 0x5b0, 0xfb2a, 0x5b8, 0x5d7, 0x5b7, 0x5d8, ' ', + 0x5dc, 0x5b0, 0x5ea, 0x5d5, 0x5c2, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb48, 0x5b0, 0xfb2a, 0x5b8, 0x5ea, 0x5b7, 0x5d4, ' ', + 0x5dc, 0x5b0, 0xfb3e, 0x5b7, 0xfb39, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0x5db, 0x5b8, 0x5db, 0x5b8, 0x5d4, ' ', + 0x5dc, 0x5b0, 0x5e0, 0xfb35, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0xfb2b, 0x5b8, 0x5e8, 0x5b7, 0x5e3, ' ', + 0x5dc, 0x5b0, 0x5d7, 0xfb35, 0x5d8, 0x5b0, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0x5d4, 0x5b4, 0xfb3b, 0x5b8, 0x5d4, ' ', + 0x5dc, 0x5b0, 0x5db, 0x5b7, 0x5dc, 0x5b0, 0xfb3b, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0x5e0, 0x5b8, 0xfb2a, 0x5b7, 0x5da, 0x5b0, ' ', + 0x5dc, 0x5b0, 0xfb2a, 0xfb35, 0x5e0, 0x5b0, 0x5e8, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b0, 0xfb2f, 0x5db, 0x5b0, 0x5dc, 0x5b8, 0x5d4, ' ', + 0x5dc, 0x5b0, 0x5d2, 0x5b7, 0x5d3, 0x5b0, 0x5d9, 0x5b8, 0x5d0, ',', ' ', + 0xfb33, 0x5b4, 0x5d6, 0x5b0, 0x5d1, 0x5b7, 0x5df, ' ', + 0xfb2e, 0xfb31, 0x5b8, 0x5d0, ' ', + 0xfb31, 0x5b4, 0x5ea, 0x5b0, 0x5e8, 0x5b5, 0x5d9, ' ', + 0x5d6, 0xfb35, 0x5d6, 0x5b5, 0x5d9, '.', ' ', + 0x5d7, 0x5b7, 0x5d3, ' ', + 0xfb32, 0x5b7, 0x5d3, 0x5b0, 0x5d9, 0x5b8, 0x5d0, ',', ' ', + 0x5d7, 0x5b7, 0x5d3, ' ', + 0xfb32, 0x5b7, 0x5d3, 0x5b0, 0x5d9, 0x5b8, 0x5d0, '.', + '\0' }; +static unichar_t *hebrew[] = { _seder1, _seder2, NULL }; +/* Arabic with no dots or vowel marks */ +static unichar_t _arabic[] = { 0x644, 0x642, 0x64a, 0x62a, 0x20, 0x627, 0x644, + 0x62d, 0x643, 0x645, 0x629, 0x20, 0x627, 0x644, 0x639, 0x627, 0x62f, + 0x644, 0x629, 0x20, 0x62d, 0x628, 0x627, 0x20, 0x639, 0x638, 0x64a, + 0x645, 0x627, 0x20, 0x645, 0x646, 0x20, 0x627, 0x644, 0x634, 0x639, + 0x628, 0x2e, 0x20, 0x627, 0x646, 0x633, 0x62d, 0x628, 0x62a, 0x20, + 0x645, 0x646, 0x20, 0x627, 0x644, 0x646, 0x627, 0x62f, 0x6cc, 0x20, + 0x641, 0x6cc, 0x20, 0x627, 0x644, 0x633, 0x646, 0x629, 0x20, 0x627, + 0x644, 0x645, 0x627, 0x636, 0x64a, 0x629, 0x2e, 0x20, 0x648, 0x642, + 0x639, 0x62a, 0x20, 0x641, 0x6cc, 0x20, 0x627, 0x644, 0x648, 0x627, + 0x62f, 0x6cc, 0x20, 0x641, 0x627, 0x646, 0x643, 0x633, 0x631, 0x62a, + 0x20, 0x64a, 0x62f, 0x6cc, 0x2e, 0x20, 0x642, 0x627, 0x628, 0x644, + 0x62a, 0x20, 0x635, 0x62f, 0x64a, 0x642, 0x6cc, 0x20, 0x639, 0x645, + 0x631, 0x627, 0x20, 0x627, 0x644, 0x643, 0x627, 0x62a, 0x628, 0x20, + 0x627, 0x644, 0x642, 0x62f, 0x64a, 0x631, 0x20, 0x641, 0x6cc, 0x20, + 0x627, 0x644, 0x633, 0x648, 0x642, 0x20, 0x641, 0x642, 0x627, 0x644, + 0x20, 0x644, 0x6cc, 0x20, 0x627, 0x646, 0x647, 0x20, 0x627, 0x631, + 0x633, 0x644, 0x20, 0x627, 0x644, 0x649, 0x20, 0x627, 0x644, 0x62c, + 0x627, 0x645, 0x639, 0x629, 0x20, 0x639, 0x62f, 0x62f, 0x627, 0x20, + 0x645, 0x646, 0x20, 0x645, 0x62c, 0x644, 0x62a, 0x647, 0x20, 0x627, + 0x644, 0x62c, 0x62f, 0x64a, 0x62f, 0x629, 0x2e, 0x20, 0x627, 0x62d, + 0x62a, 0x644, 0x20, 0x627, 0x644, 0x627, 0x645, 0x64a, 0x631, 0x20, + 0x641, 0x64a, 0x635, 0x644, 0x20, 0x645, 0x62f, 0x64a, 0x646, 0x629, + 0x20, 0x62f, 0x645, 0x633, 0x642, 0x20, 0x641, 0x6cc, 0x20, 0x627, + 0x644, 0x62d, 0x631, 0x628, 0x20, 0x627, 0x644, 0x639, 0x627, 0x644, + 0x645, 0x64a, 0x629, 0x20, 0x648, 0x62f, 0x62e, 0x644, 0x647, 0x627, + 0x20, 0x631, 0x627, 0x643, 0x628, 0x627, 0x20, 0x639, 0x644, 0x649, + 0x20, 0x641, 0x631, 0x633, 0x647, 0x20, 0x627, 0x644, 0x645, 0x62d, + 0x628, 0x648, 0x628, 0x629, 0x2e, 0x20, 0x627, 0x631, 0x633, 0x644, + 0x20, 0x639, 0x645, 0x631, 0x20, 0x62e, 0x627, 0x644, 0x62f, 0x627, + 0x20, 0x627, 0x644, 0x649, 0x20, 0x627, 0x644, 0x639, 0x631, 0x627, + 0x642, 0x20, 0x648, 0x644, 0x627, 0x643, 0x646, 0x20, 0x628, 0x639, + 0x62f, 0x20, 0x645, 0x62f, 0x629, 0x20, 0x642, 0x635, 0x64a, 0x631, + 0x629, 0x20, 0x648, 0x62c, 0x647, 0x20, 0x62e, 0x627, 0x644, 0x62f, + 0x20, 0x62c, 0x64a, 0x634, 0x647, 0x20, 0x627, 0x644, 0x649, 0x20, + 0x633, 0x648, 0x631, 0x64a, 0x629, 0x2e, 0x20, 0x642, 0x62f, 0x645, + 0x20, 0x639, 0x644, 0x649, 0x20, 0x62f, 0x645, 0x634, 0x642, 0x20, + 0x648, 0x627, 0x633, 0x62a, 0x637, 0x627, 0x639, 0x20, 0x641, 0x62a, + 0x62d, 0x647, 0x627, 0x2e, 0x20, 0x642, 0x628, 0x644, 0x20, 0x627, + 0x62d, 0x62a, 0x644, 0x20, 0x639, 0x645, 0x631, 0x20, 0x627, 0x644, + 0x642, 0x62f, 0x633, 0x20, 0x648, 0x639, 0x642, 0x62f, 0x20, 0x62c, + 0x644, 0x633, 0x62a, 0x629, 0x20, 0x645, 0x639, 0x20, 0x62d, 0x627, + 0x643, 0x645, 0x20, 0x627, 0x644, 0x642, 0x62f, 0x633, 0x20, 0x648, + 0x642, 0x62f, 0x20, 0x62a, 0x643, 0x644, 0x645, 0x20, 0x645, 0x639, + 0x647, 0x20, 0x639, 0x646, 0x20, 0x641, 0x62a, 0x62d, 0x20, 0x627, + 0x644, 0x645, 0x62f, 0x64a, 0x646, 0x629, 0x2e, 0x20, 0x62b, 0x645, + 0x20, 0x631, 0x62c, 0x639, 0x20, 0x639, 0x645, 0x631, 0x20, 0x627, + 0x644, 0x649, 0x20, 0x627, 0x644, 0x645, 0x62f, 0x646, 0x629, 0x20, + 0x627, 0x644, 0x645, 0x646, 0x648, 0x631, 0x629, 0x2e, '\0' }; +static unichar_t *arabic[] = { _arabic, NULL }; +/* Renaisance English with period ligatures */ +static unichar_t _muchado[] = {' ','B','u','t',' ','t','i','l','l',' ','a','l', + 'l',' ','g','r','a','c','e','s',' ','b','e',' ','i','n',' ','o','n','e' + ,' ','w','o','m','a','n',',',' ','o','n','e',' ','w','o','m',(uint8)'ã',' ', + 0x017f,'h','a','l',' ','n','o','t',' ','c','o','m',' ','i','n',' ','m', + 'y',' ','g','r','a','c','e',':',' ','r','i','c','h',' ',0x017f,'h', + 'e',' ',0x017f,'h','a','l','l',' ','b','e',' ','t','h','a','t','s', + ' ','c','e','r','t','a','i','n',',',' ','w','i',0x017f,'e',',',' ', + 'o','r',' ','i','l','e',' ','n','o','n','e',',',' ','v','e','r','t', + 'u','o','u','s',',',' ','o','r',' ','i','l','e',' ','n','e','u','e', + 'r',' ','c','h','e','a','p','e','n',' ','h','e','r','.', '\0' }; +/* contains long-s, u used as v, tilde over vowel used as nasal, and misspellings */ +static unichar_t *muchado[] = { _muchado, NULL }; +/* Middle Welsh */ +static unichar_t _mabinogion[] = {' ','G','a','n',' ','f','o','d',' ','A','r', + 'g','r','a','f','f','i','a','d',' ','R','h','y','d','y','c','h','e','n', + ' ','o',0x0027,'r',' ','M','a','b','i','n','o','g','i','o','n',' ','y', + 'n',' ','r','h','o','i',0x0027,'r',' ','t','e','s','t','u','n',' ','y', + 'n',' ','u','n','i','o','n',' ','f','e','l',' ','y',' ','d','i','g','w', + 'y','d','d',' ','y','n',' ','y',' ','l','l','a','w','y','s','g','r','i', + 'f','a','u',',',' ','a','c',' ','f','e','l','l','y',' ','y','n',' ','c', + 'y','f','a','r','f','o','d',' ',(uint8)'â',' ','g','o','f','y','n',' ','y','r', + ' ','y','s','g','o','l','h','a','i','g',',',' ','b','e','r','n','a','i', + 's',' ','m','a','i',' ','g','w','e','l','l',' ','m','e','w','n',' ','l', + 'l','a','w','l','y','f','r',' ','f','e','l',' ','h','w','n',' ','o','e', + 'd','d',' ','g','o','l','y','g','u',' ','p','e','t','h',' ','a','r','n', + 'o',' ','e','r',' ','m','w','y','n',' ','h','e','l','p','u',0x0027,'r', + ' ','i','e','u','a','i','n','c',' ','a',0x0027,'r',' ','d','i','b','r', + 'o','f','i','a','d',' ','y','n',' ','y','r',' ','h','e','n',' ','o','r', + 'g','r','a','f','f','.', '\0'}; +static unichar_t *mabinogion[] = { _mabinogion, NULL }; +/* Swedish */ +static unichar_t _Pippi[] = { 'O','m',' ','n', 0xe5, 'g','o','n',' ','m', 0xe5, + 'n','n','i','s','k','a',' ','s','k','u','l','l','e',' ','k','o','m','m','a', + ' ','r','e','s','a','n','d','e',' ','t','i','l','l',' ','d','e','n',' ','l', + 'i','l','l','a',',',' ','l','i','l','l','a',' ','s','t','a','d','e','n',' ', + 'o','c','h',' ','s', 0xe5, ' ','k','a','n','s','k','e',' ','e','t','t',' ','t', + 'u',' ','t','r','e',' ','r', 0xe5, 'k','a',' ','f', 0xf6, 'r','i','r','r', + 'a',' ','s','i','g',' ','l','i','t','e',' ','f', 0xf6, 'r',' ','l', 0xe5, + 'n','g','t',' ','b','o','r','t',' ', 0xe5, 't',' ','e','n','a',' ','u','t', + 'k','a','n','t','e','n',',',' ','d', 0xe5, 's','k','u','l','l','e',' ','d', + 'e','n',' ','m', 0xe5, 'n','n','i','s','k','a','n',' ','f', 0xe5, ' ','s', + 'e',' ','V','i','l','l','a',' ','V','i','l','l','e','k','u','l','l','a','.', + ' ','I','n','t','e',' ','f', 0xf6, 'r',' ','a','t','t',' ','h','u','s','e', + 't',' ','v','a','r',' ','s', 0xe5, 'm','y','c','k','e','t',' ','a','t','t', + ' ','t','i','t','t','a',' ','p', 0xe5, 'j','u','s','t',',',' ','e','n',' ', + 'r', 0xe4, 't','t',' ','f','a','l','l','f', 0xe5, 'r','d','i','g',' ','g', + 'a','m','m','a','l',' ','v','i','l','l','a',' ','o','c','h',' ','e','n',' ', + 'r', 0xa4, 't','t',' ','v','a','n','s','k', 0xf6, 't','t',' ','g','a','m', + 'm','a','l',' ','t','r', 0xe4, 'd','g', 0xe5, 'r','d',' ','r','u','n','t', + ' ','o','m','k','r','i','n','g',',', ' ','m','e','n',' ','f','r', 0xe5, + 'm','l','i','n','g','e','n',' ','s','k','u','l','l','e',' ','k','a','n', + 's','k','e',' ','i',' ','a','l','l','a',' ','f','a','l','l',' ','s','t', + 'a','n','n','a',' ','o','c','h',' ','u','n','d','r','a',' ','v','e','m', + ' ','s','o','m',' ','b','o','d','d','e',' ','d', 0xe5, 'r', '.', 0 }; +static unichar_t *PippiGarOmBord[] = { _Pippi, NULL }; +/* Czech */ +static unichar_t _goodsoldier1[] = {' ',0x201e,'T','a','k',' ','n',(uint8)'á','m', + ' ','z','a','b','i','l','i',' ','F','e','r','d','i','n','a','n','d','a', + ',',0x201c,' ',0x0159,'e','k','l','a',' ','p','o','s','l','u','h','o','v', + 'a',0x010d,'k','a',' ','p','a','n','u',' ',0x0160,'v','e','j','k','o','v', + 'i',',',' ','k','t','e','r',(uint8)'ý',' ','o','p','u','s','t','i','v',' ','p', + 0x0159,'e','d',' ','l',(uint8)'é','t','y',' ','v','o','j','e','n','s','k','o', + 'u',' ','s','l','u',0x017e,'b','u',',',' ','k','d','y',0x017e,' ','b','y', + 'l',' ','d','e','f','i','n','i','t','i','v','n',0x011b,' ','p','r','o', + 'h','l',(uint8)'á',0x0161,'e','n',' ','v','o','j','e','n','s','k','o','u',' ', + 'l',(uint8)'é','k','a',0x0159,'s','k','o','u',' ','k','o','m','i','s',(uint8)'í',' ', + 'z','a',' ','b','l','b','a',',',' ',0x017e,'i','v','i','l',' ','s','e', + ' ','p','r','o','d','e','j','e','m',' ','p','s',0x016f,',',' ','o',0x0161, + 'k','l','i','v',(uint8)'ý','c','h',' ','n','e',0x010d,'i','s','t','o','k','r', + 'e','v','n',(uint8)'ý','c','h',' ','o','b','l','u','d',',',' ','k','t','e','r', + (uint8)'ý','m',' ','p','a','d',0x011b,'l','a','l',' ','r','o','d','o','k','m', + 'e','n','y','.', '\0'}; +static unichar_t _goodsoldier2[] = {' ','K','r','o','m',0x011b,' ','t','o','h', + 'o','t','o',' ','z','a','m',0x011b,'s','t','n',(uint8)'á','n',(uint8)'í',' ','b','y','l', + ' ','s','t','i',0x017e,'e','n',' ','r','e','v','m','a','t','i','s','m','e', + 'm',' ','a',' ','m','a','z','a','l',' ','s','i',' ','p','r',(uint8)'á','v',0x011b, + ' ','k','o','l','e','n','a',' ','o','p','o','d','e','l','d','o','k','e', + 'm','.', '\0'}; +static unichar_t *goodsoldier[] = { _goodsoldier1, _goodsoldier2, NULL }; +/* Lithuanian */ +static unichar_t _lithuanian[] = {' ','K','i','e','k','v','i','e','n','a',' ', + 0x0161,'v','e','n','t',0x0117,' ','y','r','a',' ','s','u','r','i',0x0161, + 't','a',' ','s','u',' ','p','r','a','e','i','t','i','m','i','.',' ','N', + 'e',0x0161,'v','e','n',0x010d,'i','a','m','a','s',' ','g','i','m','t','a', + 'd','i','e','n','i','s',',',' ','k','a','i',',',' ','k',0x016b,'d','i', + 'k','i','s',' ','g','i','m','s','t','a','.',' ','I','r',' ','p','o',' ', + 'k','e','l','i','o','l','i','k','o','s',' ','m','e','t',0x0173,' ','g', + 'i','m','t','i','n',0x0117,'s',' ','a','r','b','a',' ','v','a','r','d', + 'i','n',0x0117,'s',' ','n',0x0117,'r','a',' ','t','i','e','k',' ','r','e', + 'i','k',0x0161,'m','i','n','g','o','s',',',' ','k','a','i','p',' ','s', + 'u','l','a','u','k','u','s',' ','5','0',' ','a','r',' ','7','5',' ','m', + 'e','t',0x0173,'.',' ','J','u','o',' ','t','o','l','i','m','e','s','n', + 'i','s',' ',0x012f,'v','y','k','i','s',',',' ','t','u','o',' ',0x0161, + 'v','e','n','t',0x0117,' ','d','a','r','o','s','i',' ','s','v','a','r', + 'b','e','s','n',0x0117,' ','i','r',' ','i',0x0161,'k','i','l','m','i','n', + 'g','e','s','n',0x0117,'.', '\0'}; +static unichar_t *lithuanian[] = { _lithuanian, NULL }; +/* Polish */ +static unichar_t _polish[] = {' ','J',0x0119,'z','y','k',' ','p','r','a','s', + 0x0142,'o','w','i','a',0x0144,'s','k','i',' ','m','i','a',0x0142,' ','w', + ' ','z','a','k','r','e','s','i','e',' ','d','e','k','l','i','n','a','c', + 'j','i',' ','(','f','l','e','k','s','j','i',' ','i','m','i','e','n','n', + 'e','j',')',' ','n','a','s','t',0x0119,'p','u','j',0x0105,'c','e',' ','k', + 'a','t','e','g','o','r','i','e',' ','g','r','a','m','a','t','y','c','z', + 'n','e',':',' ','l','i','c','z','b','y',',',' ','r','o','d','z','a','j', + 'u',' ','i',' ','p','r','z','y','p','a','d','k','u','.',' ','P','o','z', + 'a',' ','t','y','m',' ','i','s','t','n','i','a',0x0142,'y',' ','w',' ', + 'n','i','m',' ','(','w',' ','z','a','k','r','e','s','i','e',' ','f','l', + 'e','k','s','j','i',' ','r','z','e','c','z','o','w','n','i','k','a',')', + ' ','r',(uint8)'ó',0x017c,'n','e',' ',(uint8)'«','o','d','m','i','a','n','y',(uint8)'»',',', + ' ','c','z','y','l','i',' ','t','y','p','y',' ','d','e','k','l','i','n', + 'a','c','y','j','n','e','.',' ','I','m',' ','d','a','w','n','i','e','j', + ' ','w',' ','c','z','a','s','i','e',',',' ','t','y','m',' ','o','w','e', + ' ','r',(uint8)'ó',0x017c,'n','i','c','e',' ','d','e','k','l','i','n','a','c', + 'y','j','n','e',' ','m','i','a',0x0142,'y',' ','m','n','i','e','j','s', + 'z','y',' ','z','w','i',0x0105,'z','e','k',' ','z',' ','s','e','m','a', + 'n','t','y','k',0x0105,' ','r','z','e','c','z','o','w','n','i','k','a', + '.', '\0'}; +static unichar_t *polish[] = { _polish, NULL }; +/* Slovene */ +static unichar_t _slovene1[] = {' ','R','a','z','v','o','j',' ','g','l','a', + 's','o','s','l','o','v','j','a',' ','j','e',' ','d','i','a','m','e','t', + 'r','a','l','n','o',' ','d','r','u','g','a',0x010d,'e','n',' ','o','d', + ' ','r','a','z','v','o','j','a',' ','m','o','r','f','o','l','o','g','i', + 'j','e','.', '\0'}; +static unichar_t _slovene2[] = {' ','V',' ','g','o','v','o','r','u',' ','s', + 'i',' ','b','e','s','e','d','e',' ','s','l','e','d','e','.',' ','V',' ', + 'v','s','a','k','i',' ','s','i','n','t','a','g','m','i',' ','d','o','b', + 'i',' ','b','e','s','e','d','a',' ','s','v','o','j','o',' ','v','r','e', + 'd','n','o','s','t',',',' ',0x010d,'e',' ','j','e',' ','z','v','e','z', + 'a','n','a',' ','z',' ','b','e','s','e','d','o',',',' ','k','i',' ','j', + 'e',' ','p','r','e','d',' ','n','j','o',',',' ','i','n',' ','z',' ','b', + 'e','s','e','d','o',',',' ','k','i',' ','j','i',' ','s','l','e','d','i', + '.', '\0' }; +static unichar_t *slovene[] = { _slovene1, _slovene2, NULL }; +/* Macedonian */ +static unichar_t _macedonian[] = {' ',0x041c,0x0430,0x043a,0x0435,0x0434, + 0x043e,0x043d,0x0441,0x043a,0x0438,0x043e,0x0442,' ',0x0458,0x0430,0x0437, + 0x0438,0x043a,' ',0x0432,0x043e,' ',0x0431,0x0430,0x043b,0x043a,0x0430, + 0x043d,0x0441,0x043a,0x0430,0x0442,0x0430,' ',0x0458,0x0430,0x0437,0x0438, + 0x0447,0x043d,0x0430,' ',0x0441,0x0440,0x0435,0x0434,0x0438,0x043d,0x0430, + ' ',0x0438,' ',0x043d,0x0430,0x0441,0x043f,0x0440,0x0435,0x043c,0x0430,' ', + 0x0441,0x043e,0x0441,0x0435,0x0434,0x043d,0x0438,0x0442,0x0435,' ',0x0441, + 0x043b,0x043e,0x0432,0x0435,0x043d,0x0441,0x043a,0x0438,' ',0x0458,0x0430, + 0x0435,0x0438,0x0446,0x0438,'.',' ','1','.',' ',0x041c,0x0430,0x043a, + 0x0435,0x0434,0x043e,0x043d,0x0441,0x043a,0x0438,0x043e,0x0442,' ',0x0458, + 0x0430,0x0437,0x0438,0x043a,' ',0x0441,0x0435,' ',0x0433,0x043e,0x0432, + 0x043e,0x0440,0x0438,' ',0x0432,0x043e,' ',0x0421,0x0420,' ',0x041c,0x0430, + 0x043a,0x0435,0x0434,0x043e,0x043d,0x0438,0x0458,0x0430,',',' ',0x0438,' ', + 0x043d,0x0430,0x0434,0x0432,0x043e,0x0440,' ',0x043e,0x0434,' ',0x043d, + 0x0435,0x0458,0x0437,0x0438,0x043d,0x0438,0x0442,0x0435,' ',0x0433,0x0440, + 0x0430,0x043d,0x0438,0x0446,0x0438,',',' ',0x0432,0x043e,' ',0x043e,0x043d, + 0x0438,0x0435,' ',0x0434,0x0435,0x043b,0x043e,0x0432,0x0438,' ',0x043d, + 0x0430,' ',0x041c,0x0430,0x043a,0x0435,0x0434,0x043e,0x043d,0x0438,0x0458, + 0x0430,' ',0x0448,0x0442,0x043e,' ',0x043f,0x043e,' ',0x0431,0x0430,0x043b, + 0x043a,0x0430,0x043d,0x0441,0x043a,0x0438,0x0442,0x0435,' ',0x0432,0x043e, + 0x0458,0x043d,0x0438,' ',0x0432,0x043b,0x0435,0x0433,0x043e,0x0430,' ', + 0x0432,0x043e,' ',0x0441,0x043e,0x0441,0x0442,0x0430,0x0432,0x043e,0x0442, + ' ',0x043d,0x0430,' ',0x0413,0x0440,0x0446,0x0438,0x0458,0x0430,' ',0x0438, + ' ',0x0411,0x0443,0x0433,0x0430,0x0440,0x0438,0x0458,0x0430,'.', '\0'}; +static unichar_t *macedonian[] = { _macedonian, NULL }; +/* Bulgarian */ +static unichar_t _bulgarian[] = {' ',0x041f,0x0420,0x0415,0x0414,0x041c,0x0415, + 0x0422,' ',0x0418,' ',0x0417,0x0410,0x0414,0x0410,0x0427,0x0418,' ',0x041d, + 0x0410,' ',0x0424,0x041e,0x041d,0x0415,0x0422,0x0418,0x041a,0x0410,0x0422, + 0x0410,' ',0x0414,0x0443,0x043c,0x0430,0x0442,0x0430,' ',0x0444,0x043e, + 0x043d,0x0435,0x0442,0x0438,0x043a,0x0430,' ',0x043f,0x0440,0x043e,0x0438, + 0x0437,0x043b,0x0438,0x0437,0x0430,' ',0x043e,0x0442,' ',0x0433,0x0440, + 0x044a,0x0446,0x043a,0x0430,0x0442,0x0430,' ',0x0434,0x0443,0x043c,0x0430, + ' ',0x0440,0x043d,0x043e,0x043f,0x0435,',',' ',0x043a,0x043e,0x044f,0x0442, + 0x043e,' ',0x043e,0x0437,0x043d,0x0430,0x0447,0x0430,0x0432,0x0430,' ', + 0x201e,0x0437,0x0432,0x0443,0x043a,0x201c,',',' ',0x201e,0x0433,0x043b, + 0x0430,0x0441,0x201c,',',' ',0x201e,0x0442,0x043e,0x043d,0x201c,'.', '\0'}; +static unichar_t *bulgarian[] = { _bulgarian, NULL }; +/* Korean Hangul */ +static unichar_t _hangulsijo1[] = { 0xc5b4, 0xbc84, 0xc774, ' ', 0xc0b4, 0xc544, 0xc2e0, ' ', 0xc81c, ' ', 0xc12c, 0xae38, ' ', 0xc77c, 0xb780, ' ', 0xb2e4, ' ', 0xd558, 0xc5ec, 0xb77c, 0 }; +static unichar_t _hangulsijo2[] = { 0xc9c0, 0xb098, 0xac04, ' ', 0xd6c4, 0xba74, ' ', 0xc560, 0xb2ef, 0xb2e4, ' ', 0xc5b4, 0xc774, ' ', 0xd558, 0xb9ac, 0 }; +static unichar_t _hangulsijo3[] = { 0xd3c9, 0xc0dd, 0xc5d0, ' ', 0xace0, 0xccd0, ' ', 0xbabb, 0xd560, ' ', 0xc77c, 0xc774, ' ', 0xc774, 0xbfd0, 0xc778, 0xac00, ' ', 0xd558, 0xb178, 0xb77c, 0 }; +static unichar_t _hangulsijo4[] = { '-', ' ', 0xc815, 0xcca0, 0 }; +static unichar_t _hangulsijo5[] = { 0 }; +static unichar_t _hangulsijo6[] = { 0xc774, 0xace0, ' ', 0xc9c4, ' ', 0xc800, ' ', 0xb299, 0xc740, 0xc774, ' ', 0xc9d0, ' ', 0xbc97, 0xc5b4, ' ', 0xb098, 0xb97c, ' ', 0xc8fc, 0xc624, 0 }; +static unichar_t _hangulsijo7[] = { 0xb098, 0xb294, ' ', 0xc80a, 0xc5c8, 0xac70, 0xb2c8, ' ', 0xb3cc, 0xc774, 0xb77c, ' ', 0xbb34, 0xac70, 0xc6b8, 0xae4c, 0 }; +static unichar_t _hangulsijo8[] = { 0xb299, 0xae30, 0xb3c4, ' ', 0xc124, 0xc6cc, 0xb77c, 0xcee4, 0xb4e0, ' ', 0xc9d0, 0xc744, ' ', 0xc870, 0xcc28, ' ', 0xc9c0, 0xc2e4, 0xae4c, 0 }; +static unichar_t _hangulsijo9[] = { '-', ' ', 0xc815, 0xcca0, 0 }; +static unichar_t *hangulsijo[] = { _hangulsijo1, _hangulsijo2, _hangulsijo3, + _hangulsijo4, _hangulsijo5, _hangulsijo6, _hangulsijo7, _hangulsijo8, + _hangulsijo9, NULL }; +/* Chinese traditional */ +/* Laautzyy */ +static unichar_t _YihKing1[] = { 0x9053, 0x53ef, 0x9053, 0x975e, 0x5e38, 0x9053, 0xff0c, 0 }; +static unichar_t _YihKing2[] = { 0x540d, 0x53ef, 0x540d, 0x975e, 0x5e38, 0x540d, 0x3002, 0 }; +static unichar_t *YihKing[] = { _YihKing1, _YihKing2, NULL }; + +static unichar_t _LiiBair1[] = { 0x5c07, 0x9032, 0x9152, 0 }; +static unichar_t _LiiBair2[] = { 0 }; +static unichar_t _LiiBair3[] = { 0x541b, 0x4e0d, 0x898b, ' ', 0x9ec3, 0x6cb3, 0x4e4b, 0x6c34, 0x5929, 0x4e0a, 0x4f86, ' ', 0x5954, 0x6d41, 0x5230, 0x6d77, 0x4e0d, 0x5fa9, 0x56de, 0 }; +static unichar_t _LiiBair4[] = { 0x541b, 0x4e0d, 0x898b, ' ', 0x9ad8, 0x5802, 0x660e, 0x93e1, 0x60b2, 0x767d, 0x9aee, ' ', 0x671d, 0x5982, 0x9752, 0x7d72, 0x66ae, 0x6210, 0x96ea, 0 }; +static unichar_t _LiiBair5[] = { 0x4eba, 0x751f, 0x5f97, 0x610f, 0x9808, 0x76e1, 0x6b61, ' ', 0x83ab, 0x4f7f, 0x91d1, 0x6a3d, 0x7a7a, 0x5c0d, 0x2e9d, 0 }; +static unichar_t _LiiBair6[] = { 0x5929, 0x751f, 0x6211, 0x6750, 0x5fc5, 0x6709, 0x7528, ' ', 0x5343, 0x91d1, 0x6563, 0x76e1, 0x9084, 0x5fa9, 0x4f86, 0 }; +static unichar_t _LiiBair7[] = { 0x70f9, 0x7f8a, 0x5bb0, 0x725b, 0x4e14, 0x70ba, 0x6a02, ' ', 0x6703, 0x9808, 0x4e00, 0x98f2, 0x4e09, 0x767e, 0x676f, 0 }; +static unichar_t _LiiBair8[] = { 0x5c91, 0x592b, 0x5b50, ' ', 0x4e39, 0x4e18, 0x751f, ' ', 0x5c07, 0x9032, 0x9152, ' ', 0x541b, 0x83ab, 0x505c, 0 }; +static unichar_t _LiiBair9[] = { 0x8207, 0x541b, 0x6b4c, 0x4e00, 0x66f2, ' ', 0x8acb, 0x541b, 0x70ba, 0x6211, 0x5074, 0x8033, 0x807d, 0 }; +static unichar_t _LiiBair10[] = { 0 }; +static unichar_t _LiiBair11[] = { 0x9418, 0x9f13, 0x994c, 0x7389, 0x4e0d, 0x8db3, 0x8cb4, ' ', 0x4f46, 0x9858, 0x9577, 0x9189, 0x4e0d, 0x9858, 0x9192, 0 }; +static unichar_t _LiiBair12[] = { 0x53e4, 0x4f86, 0x8056, 0x8ce2, 0x7686, 0x5bc2, 0x5bde, ' ', 0x60df, 0x6709, 0x98f2, 0x8005, 0x7559, 0x5176, 0x540d, 0 }; +static unichar_t _LiiBair13[] = {0x9673, 0x738b, 0x6614, 0x6642, 0x5bb4, 0x5e73, 0x6a02, ' ', 0x6597, 0x9152, 0x5341, 0x5343, 0x6063, 0x8b99, 0x8b14, 0 }; +static unichar_t _LiiBair14[] = { 0x4e3b, 0x4eba, 0x4f55, 0x70ba, 0x8a00, 0x5c11, 0x9322, ' ', 0x5f91, 0x9808, 0x6cbd, 0x53d6, 0x5c0d, 0x541b, 0x914c, 0 }; +static unichar_t _LiiBair15[] = { 0x4e94, 0x82b1, 0x99ac, ' ', 0x5343, 0x91d1, 0x88d8, ' ', 0x547c, 0x5152, 0x5c07, 0x51fa, 0x63db, 0x7f8e, 0x9152, 0 }; +static unichar_t _LiiBair16[] = { 0x8207, 0x723e, 0x540c, 0x6d88, 0x842c, 0x53e4, 0x6101, 0 }; +static unichar_t *LiiBair[] = { _LiiBair1, _LiiBair2, _LiiBair3, _LiiBair4, + _LiiBair5, _LiiBair6, _LiiBair7, _LiiBair8, _LiiBair9, _LiiBair10, + _LiiBair11, _LiiBair12, _LiiBair13, _LiiBair14, _LiiBair15, _LiiBair16, + NULL }; +static unichar_t *LiiBairShort[] = { _LiiBair1, _LiiBair2, _LiiBair3, _LiiBair4, + NULL }; + +/* Japanese */ +static unichar_t _Genji[] = {0x6e90, 0x2f52, 0x7269, 0x8a9e, 0xff08, 0x7d2b, 0x5f0f, 0x90e8, 0xff09, 0xff1a, 0x3044, 0x3065, 0x308c, 0x306e, 0x5fa1, 0x6642, 0x306b, 0x304b, 0x3001, 0x2f25, 0x5fa1, 0x66f4, 0x2f90, 0x2202, 0x307e, 0x305f, 0x3055, 0x3076, 0x3089, 0x3072, 0x305f, 0x307e, 0x3072, 0x3051, 0x308b, 0x4e2d, 0x306b, 0x3001, 0x3044, 0x3068, 0x3084, 0x3080, 0x3054, 0x3068, 0x306a, 0x304d, 0x969b, 0x306b, 0x306f, 0x2202, 0x3089, 0x306c, 0x304c, 0x3001, 0x3059, 0x3050, 0x308c, 0x3066, 0x6642, 0x3081, 0x304d, 0x305f, 0x307e, 0x3075, 0x2202, 0x308a, 0x3051, 0x308a, 0 }; +static unichar_t *Genji[] = { _Genji, NULL }; +static unichar_t _IAmACat[] = {0x543e, 0x8f29, 0x306f, 0x732b, 0x3067, 0x2202, 0x308b, 0xff08, 0x590f, 0xff6d, 0xff9a, 0x6f31, 0x2f6f, 0xff09, 0xff1a, 0x543e, 0x8f29, 0x306f, 0x732b, 0x3067, 0x2202, 0x308b, 0 }; +static unichar_t *IAmACat[] = { _IAmACat, NULL }; + +/* The following translations of the gospel according to John are all from */ +/* Compendium of the world's languages. 1991 Routledge. by George L. Campbell*/ + +/* Belorussian */ +static unichar_t _belojohn1[] = { 0x0412,0x043d,0x0430,0x0447,0x0430,0x043b, + 0x0435,' ',0x0431,0x044b,0x043b,0x043e,' ',0x0421,0x043b,0x043e,0x0432, + 0x043e,',',' ',0x0438,' ',0x0421,0x043b,0x043e,0x0432,0x043e,' ',0x0431, + 0x044b,0x043b,0x043e,' ',0x0443,' ',0x0411,0x043e,0x0433,0x0430,',',' ', + 0x0438,' ',0x0421,0x043b,0x043e,0x0432,0x043e,' ',0x0431,0x044b,0x043b, + 0x043e,' ',0x0411,0x043e,0x0433,'.', '\0'}; +static unichar_t _belojohn2[] = { 0x041e,0x043d,0x043e,' ',0x0431,0x044b, + 0x043b,0x043e,' ',0x0432,' ',0x043d,0x0430,0x0447,0x0430,0x043b,0x0435,' ', + 0x0443,' ',0x0411,0x043e,0x0433,0x0430,'.', '\0' }; +static unichar_t *belorussianjohn[] = { _belojohn1, _belojohn2, NULL }; +/* basque */ +static unichar_t _basquejohn1[] = { 'A','s','i','e','r','a','n',' ','I','t','z','a',' ','b','a','-','z','a','n',',',' ','t','a',' ','I','t','z','a',' ','Y','a','i','n','k','o','a','g','a','n',' ','z','a','n',',',' ','t','a',' ','I','t','z','a',' ','Y','a','i','n','k','o',' ','z','a','n','.', '\0' }; +static unichar_t _basquejohn2[] = { 'A','s','i','e','r','a','n',' ','B','e','r','a',' ','Y','a','i','n','k','o','a','g','a','n',' ','z','a','n','.', '\0' }; +static unichar_t *basquejohn[] = { _basquejohn1, _basquejohn2, NULL }; +#if 0 +/* cornish */ +static unichar_t _cornishjohn1[] = { 'Y','\'','n',' ','d','e','l','l','e','t','h','o','s',' ','y','t','h',' ','e','s','a',' ','a','n',' ','G','e','r',',',' ','h','a','\'','n',' ','G','e','r',' ','e','s','a',' ','g','a','n','s',' ','D','e','w',',',' ','h','a','\'','n',' ','G','e','r',' ','o',' ','D','e','w', '\0' }; +static unichar_t _cornishjohn2[] = { 'A','n',' ','k','e','t','h',' ','e','s','a',' ','y','\'','n',' ','d','a','l','l','e','t','h','v','o','s',' ','g','a','n','s',' ','D','e','w','.', '\0' }; +static unichar_t *cornishjohn[] = { _cornishjohn1, _cornishjohn2, NULL }; +#endif +/* danish */ +static unichar_t _danishjohn1[] = { 'B','e','g','y','n','d','e','l','s','e','n',' ','v','a','r',' ','O','r','d','e','t',',',' ','o','g',' ','O','r','d','e','t',' ','v','a','r',' ','h','o','s',' ','G','u','d',',',' ','o','g',' ','O','r','d','e','t',' ','v','a','r',' ','G','u','d','.', '\0' }; +static unichar_t _danishjohn2[] = { 'D','e','t','t','e',' ','v','a','r',' ','i',' ','B','e','g','y','n','d','e','l','s','e','n',' ','h','o','s',' ','G','u','d','.', '\0' }; +static unichar_t *danishjohn[] = { _danishjohn1, _danishjohn2, NULL }; +/* dutch */ +static unichar_t _dutchjohn1[] = { 'I','n',' ','d','e','n',' ','b','e','g','i','n','n','e',' ','w','a','s',' ','h','e','t',' ','W','o','o','r','d',' ','e','n',' ','h','e','t',' ','W','o','o','r','d',' ','w','a','s',' ','b','i','j',' ','G','o','d',' ','e','n',' ','h','e','t',' ','W','o','o','r','d',' ','w','a','s',' ','G','o','d','.', '\0' }; +static unichar_t _dutchjohn2[] = { 'D','i','t',' ','w','a','s',' ','i','n',' ','d','e','n',' ','b','e','g','i','n','n','e',' ','b','i','j',' ','G','o','d','.', '\0' }; +static unichar_t *dutchjohn[] = { _dutchjohn1, _dutchjohn2, NULL }; +/* finnish */ +static unichar_t _finnishjohn1[] = { 'A','l','u','s','s','a',' ','o','l','i',' ','S','a','n','a',',',' ','j','a',' ','S','a','n','a',' ','o','l','i',' ','J','u','m','a','l','a','n',' ','l','u','o','n','a',',',' ','S','a','n','a',' ','o','l','i',' ','J','u','m','a','l','a','.', '\0' }; +static unichar_t _finnishjohn2[] = { 'j','a',' ','h', 0xe4, ' ','o','l','i',' ','a','l','u','s','s','a',' ','J','u','m','a','l','a','n',' ','l','u','o','n','a','.', '\0' }; +static unichar_t *finnishjohn[] = { _finnishjohn1, _finnishjohn2, NULL }; +/* georgian */ + /* Hmm, the first 0x10e0 might be 0x10dd, 0x301 */ +static unichar_t _georgianjohn1[] = { 0x10de, 0x10d8, 0x10e0, 0x10d5, + 0x10d4, 0x10da, 0x10d8, 0x10d7, 0x10d2, 0x10d0, 0x10dc, ' ', + 0x10d8, 0x10e7, 0x10dd, ' ', + 0x10e1, 0x10d8, 0x10e2, 0x10e7, 0x10e3, 0x10e3, 0x302, 0x10d0, ',', ' ', + 0x10d3, 0x10d0, ' ', + 0x10e1, 0x10d8, 0x10e2, 0x10e7, 0x10e3, 0x10e3, 0x302, 0x10d0, ' ', + 0x10d8, 0x10d2, 0x10d8, ' ', + 0x10d8, 0x10e7, 0x10dd, ' ', + 0x10e6, 0x10e3, 0x302, 0x10d7, 0x10d8, 0x10e1, 0x10d0, ' ', + 0x10d7, 0x10d0, 0x10dc, 0x10d0, ',', ' ', + 0x10d3, 0x10d0, ' ', + 0x10d3, 0x10d8, 0x10d4, 0x10e0, 0x10d7, 0x10d8, ' ', + 0x10d8, 0x10e7, 0x10dd, ' ', + 0x10e1, 0x10d8, 0x10e2, 0x10e7, 0x10e3, 0x10e3, 0x302, 0x10d0, ' ', + 0x10d8, 0x10d2, 0x10d8, '.', + '\0' }; +static unichar_t _georgianjohn2[] = { 0x10d4, 0x10e1, 0x10d4, ' ', + 0x10d8, 0x10e7, 0x10dd, ' ', + 0x10de, 0x10d8, 0x10e0, 0x10d5, + 0x10d4, 0x10da, 0x10d8, 0x10d7, 0x10d2, 0x10d0, 0x10dc, ' ', + 0x10d3, 0x10d8, 0x10d4, 0x10e0, 0x10d7, 0x10d8, ' ', + 0x10d7, 0x10d8, 0x10dc, 0x10d8, '.', + '\0' }; +static unichar_t *georgianjohn[] = { _georgianjohn1, _georgianjohn2, NULL }; +/* icelandic */ +static unichar_t _icelandicjohn1[] = { (uint8)'Í',' ','u','p','p','h','a','f','i',' ', + 'v','a','r',' ','O','r',(uint8)'ð','i',(uint8)'ð',' ','o','g',' ','O','r',(uint8)'ð','i', + (uint8)'ð',' ','v','a','r',' ','h','j',(uint8)'à',' ','G','u',(uint8)'ð','i',',',' ','o', + 'g',' ','O','r',(uint8)'ð','i',(uint8)'ð',' ','v','a','r',' ','G','u',(uint8)'ð','i','.', + '\0'}; +static unichar_t _icelandicjohn2[] = { (uint8)'Þ','a',(uint8)'ð',' ','v','a','r',' ',(uint8)'í', + ' ','u','p','p','h','a','f','i',' ','h','j',(uint8)'á',' ','G','u',(uint8)'ð','i', + '.', '\0' }; +static unichar_t *icelandicjohn[] = { _icelandicjohn1, _icelandicjohn2, NULL }; +/* irish */ +static unichar_t _irishjohn1[] = { 'B','h',(uint8)'í',' ','a','n',' ','B','r','i', + 'a','t','h','a','r','(','I',')',' ','a','n','n',' ','i',' ','d','t', + (uint8)'ú','s',' ','b',(uint8)'á','i','r','e',' ','a','g','u','s',' ','b','h',(uint8)'í', + ' ','a','n',' ','B','r','i','a','t','h','a','r',' ','i','n',' ',(uint8)'é', + 'i','n','e','a','c','h','t',' ','l','e',' ','D','i','a',',',' ','a', + 'g','u','s',' ','b','a',' ','D','h','i','a',' ','a','n',' ','B','r', + 'i','a','t','h','a','r','.', '\0'}; +static unichar_t _irishjohn2[] = { 'B','h',(uint8)'í',' ','s',(uint8)'é',' ','a','n','n', + ' ','i',' ','d','t',(uint8)'ú','s',' ','b',(uint8)'á','i','r','e',' ','i','n',' ', + (uint8)'é','i','n','e','a','c','h','t',' ','l','e',' ','D','i','a','.', '\0'}; +static unichar_t *irishjohn[] = { _irishjohn1, _irishjohn2, NULL }; +/* norwegian */ +static unichar_t _norwegianjohn1[] = { 'I',' ','b','e','g','y','n','n','e','l','s','e','n',' ','v','a','r',' ','O','r','d','e','t',',',' ','O','r','d','e','t',' ','v','a','r',' ','h','o','s',' ','G','u','d',',',' ','o','g',' ','O','r','d','e','t',' ','v','a','r',' ','G','u','d','.', '\0' }; +static unichar_t _norwegianjohn2[] = { 'H','a','n',' ','v','a','r',' ','i',' ','b','e','g','y','n','n','e','l','s','e','n',' ','h','o','s',' ','G','u','d','.', '\0' }; +static unichar_t _norwegianjohn3[] = { 'A','l','t',' ','e','r',' ','b','l','i','t','t',' ','t','i','l',' ','v','e','d',' ','h','a','m',';',' ','u','t','e','n',' ','h','a','m',' ','e','r',' ','i','k','k','e',' ','n','o','e',' ','b','l','i','t','t',' ','t','i','l',' ','a','v',' ','a','l','t',' ','s','o','m',' ','e','r',' ','t','i','l','.', '\0' }; +static unichar_t *norwegianjohn[] = { _norwegianjohn1, _norwegianjohn2, _norwegianjohn3, NULL }; +/* ?old? norwegian */ +static unichar_t _nnorwegianjohn1[] = { 'I',' ','o','p','p','h','a','v','e','t',' ','v','a','r',' ','O','r','d','e','t',',',' ','o','g',' ','O','r','d','e','t',' ','v','a','r',' ','h','j', 0xe5, ' ','G','u','d',',',' ','o','g',' ','O','r','d','e','t',' ','v','a','r',' ','G','u','d','.', '\0' }; +static unichar_t _nnorwegianjohn2[] = { 'H','a','n',' ','v','a','r',' ','i', + ' ','o','p','p','h','a','v','e','t',' ','h','j', 0xe5, ' ','G','u','d', + '.', '\0' }; +static unichar_t *nnorwegianjohn[] = { _nnorwegianjohn1, _nnorwegianjohn2, NULL }; +/* old church slavonic */ +static unichar_t _churchjohn1[] = { 0x412,0x44a,0x20,0x43d,0x430,0x447,0x430, + 0x43b,0x463,0x20,0x431,0x463,0x20,0x421,0x43b,0x43e, 0x432,0x43e,0x20, + 438,0x20,0x421,0x43b,0x43e,0x432,0x43e,0x20,0x421,0x43b,0x43e,0x432,0x43e, + 0x20,0x43a,0x44a,0x20,0x411,0x433,0x483,',', '\0' }; +static unichar_t _churchjohn2[] = { 0x433,0x483,' ',0x44a,0x431,0x463,0x20,0x421, + 0x43b,0x43e,0x432,0x43e,0x20,'.', '\0' }; +static unichar_t _churchjohn3[] = { 0x432,0x483,' ',0x421,0x435,0x439,0x20, + 0x431,0x463,0x20,0x438,0x441,0x43a,0x43e,0x43d,0x438,0x20,0x43a, + 0x44a,0x20,0x411,'.','\0' }; +static unichar_t *churchjohn[] = { _churchjohn1, _churchjohn2, _churchjohn3, NULL }; +/* swedish */ +static unichar_t _swedishjohn1[] = { 'I',' ','b','e','g','y','n','n','e','l','s','e','n',' ','v','a','r',' ','O','r','d','e','t',',',' ','o','c','h',' ','O','r','d','e','t',' ','v','a','r',' ','h','o','s',' ','G','u','d',',',' ','o','c','h',' ','O','r','d','e','t',' ','v','a','r',' ','G','u','d','.', '\0' }; +static unichar_t _swedishjohn2[] = { 'H','a','n',' ','v','a','r',' ','i',' ','b','e','g','y','n','n','e','l','s','e','n',' ','h','o','s',' ','G','u','d','.', '\0' }; +static unichar_t *swedishjohn[] = { _swedishjohn1, _swedishjohn2, NULL }; +/* portuguese */ +static unichar_t _portjohn1[] = { 'N','o',' ','P','r','i','n','c','i','p','i','o',' ','e','r','a',' ','a',' ','P','a','l','a','v','r','a',',',' ','e',' ','a',' ','P','a','l','a','v','r','a',' ','e','s','t','a','v','a',' ','j','u','n','t','o',' ','d','e',' ','D','e','o','s',',',' ','e',' ','a',' ','P','a','l','a','v','r','a',' ','e','r','a',' ','D','e','o','s','.', '\0' }; +static unichar_t _portjohn2[] = { 'E','s','t','a',' ','e','s','t','a','v','a',' ','n','o',' ','p','r','i','n','c','i','p','i','o',' ','j','u','n','t','o',' ','d','e',' ','D','e','o','s','.', '\0' }; +static unichar_t *portjohn[] = { _portjohn1, _portjohn2, NULL }; +/* cherokee */ +static unichar_t _cherokeejohn1[] = { 0x13d7, 0x13d3, 0x13b4, 0x13c2, 0x13ef, 0x13ac, + ' ', 0x13a7, 0x13c3, 0x13ae, 0x13d8, ' ', 0x13a1, 0x13ae, 0x13a2, ',', ' ', + 0x13a0, 0x13b4, ' ', 0x13be, 0x13ef, 0x13a9, ' ', 0x13a7, 0x13c3, 0x13ae, 0x13d8, ' ', + 0x13a4, 0x13c1, 0x13b3, 0x13c5, 0x13af, ' ', 0x13a2, 0x13e7, 0x13b3, 0x13ad, + ' ', 0x13a0, 0x13d8, 0x13ae, 0x13a2, ',', ' ', 0x13a0, 0x13b4, ' ', + 0x13be, 0x13ef, 0x13a9, ' ', 0x13a7, 0x13c3, 0x13ae, 0x13d8, ' ', + 0x13a4, 0x13c1, 0x13b3, 0x13c5, 0x13af, ' ', 0x13a8, 0x13ce, 0x13a2, '.', + '\0' }; +static unichar_t _cherokeejohn2[] = { 0x13d7, 0x13d3, 0x13b4, 0x13c2, 0x13ef, 0x13ac, + ' ', 0x13be, 0x13ef, 0x13a9, ' ', 0x13a4, 0x13c1, 0x13b3, 0x13c5, 0x13af, ' ', + 0x13a2, 0x13e7, 0x13b3, 0x13ad,' ', 0x13a0, 0x13d8, 0x13ae, 0x13a2, '\0' }; +static unichar_t *cherokeejohn[] = { _cherokeejohn1, _cherokeejohn2, NULL }; +/* swahili */ +static unichar_t _swahilijohn1[] = { 'H','a','p','o',' ','m','w','a','n','z','o',' ','k','u','l','i','k','u','w','a','k','o',' ','N','e','n','o',',',' ','n','a','y','e',' ','N','e','n','o',' ','a','l','i','k','u','w','a','k','o',' ','k','w','a',' ','M','u','n','g','o',',',' ','n','a','y','e',' ','N','e','n','o',' ','a','l','i','k','u','w','a',' ','M','u','n','g','u',',',' ','H','u','y','o',' ','m','w','a','n','z','o',' ','a','l','i','k','u','w','a','k','o',' ','k','w','a',' ','M','u','n','g','u','.', '\0' }; +static unichar_t _swahilijohn2[] = { 'V','y','o','t','e',' ','v','i','l','v','a','n','y','i','k','a',' ','k','w','a',' ','h','u','y','o',';',' ','w','a','l','a',' ','p','a','s','i','p','o',' ','y','e','y','e',' ','h','a','k','i','k','u','f','a','n','y','i','k','a',' ','c','h','o',' ','c','h','o','t','e',' ','k','i','l','i','c','h','o','f','a','n','y','i','k','i','.', '\0' }; +static unichar_t *swahilijohn[] = { _swahilijohn1, _swahilijohn2, NULL }; +/* thai */ /* I'm sure I've made transcription errors here, I can't figure out what "0xe27, 0xe38, 0xe4d" really is */ +static unichar_t _thaijohn1[] = { 0xe4f, ' ', 0xe43, 0xe19, 0xe17, 0xe35, 0xe40, 0xe14, + 0xe34, 0xe21, 0xe19, 0xe30, 0xe19, 0xe1e, 0xe27, 0xe38, 0xe4d, 0xe25, + 0xe2d, 0xe42, 0xe06, 0xe40, 0xe1b, 0xe19, 0xe2d, 0xe22, 0xe48, 0xe39, ' ', + 0xe41, 0xe25, 0xe40, 0xe1b, 0xe19, 0xe2d, 0xe22, 0xe48, 0xe39, 0xe14, + 0xe27, 0xe49, 0xe22, 0xe01, 0xe31, 0xe19, 0xe01, 0xe31, 0xe1a, ' ', + 0xe1e, 0xe27, 0xe38, 0xe4d, 0xe40, 0xe06, 0xe49, 0xe32, + '\0' }; +static unichar_t *thaijohn[] = { _thaijohn1, NULL }; + +/* I've omitted cornish. no interesting letters. no current speakers */ + +#if 1 /* http://www.ethnologue.com/iso639/codes.asp */ +enum scripts { sc_latin, sc_greek, sc_cyrillic, sc_georgian, sc_hebrew, + sc_arabic, sc_hangul, sc_chinesetrad, sc_chinesemod, sc_kanji, + sc_hiragana, sc_katakana +}; +static struct langsamples { + unichar_t **sample; + char *lang; /* ISO 639 two character abbreviation */ + enum scripts script; +} sample[] = { + { simple, "various", sc_latin }, + { simplecyrill, "various", sc_cyrillic }, + { simplehebrew, "he", sc_hebrew }, + { simplekata, "ja", sc_hebrew }, + { simplehira, "ja", sc_hebrew }, + { faust, "de", sc_latin }, + { pheadra, "fr", sc_latin }, + { antigone, "el", sc_greek }, + { annakarenena, "ru", sc_cyrillic }, + { debello, "la", sc_latin }, + { hebrew, "he", sc_hebrew }, + { arabic, "ar", sc_arabic }, + { hangulsijo, "ko", sc_hangul }, + { YihKing, "zh", sc_chinesetrad }, + { LiiBair, "zh", sc_chinesetrad }, + { Genji, "ja", sc_kanji }, + { IAmACat, "ja", sc_kanji }, + { donquixote, "es", sc_latin }, + { inferno, "it", sc_latin }, + { beorwulf, "enm", sc_latin }, /* 639-2 name for middle english */ + { muchado, "eng", sc_latin }, /* 639-2 name for modern english */ + { PippiGarOmBord, "sv", sc_latin }, + { mabinogion, "cy", sc_latin }, + { goodsoldier, "cs", sc_latin }, + { macedonian, "mk", sc_cyrillic }, + { bulgarian, "bg", sc_cyrillic }, + { belorussianjohn, "be", sc_cyrillic }, + { churchjohn, "cu", sc_cyrillic }, + { lithuanian, "lt", sc_latin }, + { polish, "pl", sc_latin }, + { slovene, "sl", sc_latin }, + { irishjohn, "ga", sc_latin }, + { basquejohn, "eu", sc_latin }, + { portjohn, "pt", sc_latin }, + { icelandicjohn, "is", sc_latin }, + { danishjohn, "da", sc_latin }, + { swedishjohn, "sv", sc_latin }, + { norwegianjohn, "no", sc_latin }, + { nnorwegianjohn, "no", sc_latin }, + { dutchjohn, "nl", sc_latin }, + { finnishjohn, "fi", sc_latin }, + { cherokeejohn, "chr", sc_latin }, + { thaijohn, "th", sc_latin }, + { georgianjohn, "ka", sc_georgian }, + { swahilijohn, "sw", sc_latin }, + { NULL } +}; +#else +static unichar_t **sample[] = { simple, simplecyrill, faust, pheadra, antigone, + annakarenena, debello, hebrew, arabic, hangulsijo, YihKing, LiiBair, Genji, + IAmACat, donquixote, inferno, beorwulf, muchado, PippiGarOmBord, + mabinogion, goodsoldier, macedonian, bulgarian, belorussianjohn, + churchjohn, + lithuanian, polish, slovene, irishjohn, basquejohn, portjohn, + icelandicjohn, danishjohn, swedishjohn, norwegianjohn, nnorwegianjohn, + dutchjohn, finnishjohn, + cherokeejohn, thaijohn, georgianjohn, swahilijohn, + NULL }; +#endif + +static void OrderSampleByLang(void) { + const char *lang = getenv("LANG"); + char langbuf[12], *pt; + int i,j; + + if ( lang==NULL ) +return; + + strncpy(langbuf,lang,10); + langbuf[10] = '\0'; + for ( j=0; j<3; ++j ) { + if ( j==1 ) { + for ( pt=langbuf; *pt!='\0' && *pt!='.'; ++pt ); + *pt = '\0'; + } else if ( j==2 ) { + for ( pt=langbuf; *pt!='\0' && *pt!='_'; ++pt ); + *pt = '\0'; + } + for ( i=0; sample[i].sample!=NULL; ++i ) + if ( strcmp(sample[i].lang,langbuf)==0 ) { + struct langsamples temp; + temp = sample[i]; + sample[i] = sample[2]; + sample[2] = temp; + goto out; + } + } + out: + if ( strcmp(langbuf,"sv")==0 ) + simple[0] = _simple3; + else if ( strcmp(langbuf,"en")==0 && simple[0] == _simple3 ) + simple[0] = _simple1; +} + +static int AllChars( SplineFont *sf, unichar_t *str, int istwobyte) { + int i, ch; + + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4 ) { + while ( (ch = *str)!='\0' ) { + if ( !SCWorthOutputting(sf->chars[ch])) +return( false ); + ++str; + } + } else if ( sf->subfontcnt==0 ) { + while ( (ch = *str)!='\0' ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]->unicodeenc == ch ) + break; + } + if ( i==sf->charcnt || !SCWorthOutputting(sf->chars[i]) || + (i>256 && !istwobyte) ) +return( false ); + ++str; + } + } else { + int max = 0, j; + for ( i=0; isubfontcnt; ++i ) + if ( sf->subfonts[i]->charcnt>max ) max = sf->subfonts[i]->charcnt; + while ( (ch = *str)!='\0' ) { + for ( i=0; isubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) + break; + if ( j!=sf->subfontcnt ) + if ( sf->subfonts[j]->chars[i]->unicodeenc == ch ) + break; + } + if ( i==max || !SCWorthOutputting(sf->subfonts[j]->chars[i])) +return( false ); + ++str; + } + } +return( true ); +} + +static void u_stupidstrcpy( unichar_t *pt1, unichar_t *pt2 ) { + int ch; + + while ( (ch = *pt2++)!='\0' ) { + /*if ( (ch&0xff00) == 0xff00 ) ch &= 0xff;*/ + *pt1 ++ = ch; + } + *pt1++ = '\0'; +} + +unichar_t *PrtBuildDef( SplineFont *sf, int istwobyte ) { + int i, j, gotem, len, any=0; + unichar_t *ret=NULL, **cur; + + for ( j=0; simplechoices[j]!=NULL; ++j ); + simple[0] = simplechoices[rand()%j]; + for ( j=0; simplecyrillchoices[j]!=NULL; ++j ); + simplecyrill[0] = simplecyrillchoices[rand()%j]; + + OrderSampleByLang(); + + while ( 1 ) { + len = any = 0; + for ( i=0; sample[i].sample!=NULL; ++i ) { + gotem = true; + cur = sample[i].sample; + for ( j=0; cur[j]!=NULL && gotem; ++j ) + gotem = AllChars(sf,cur[j],istwobyte); + if ( !gotem && sample[i].sample==simple ) { + gotem = true; + simple[0] = _simple1; + } else if ( !gotem && sample[i].sample==LiiBair ) { + cur = LiiBairShort; + gotem = true; + for ( j=0; cur[j]!=NULL && gotem; ++j ) + gotem = AllChars(sf,cur[j],istwobyte); + } + if ( gotem ) { + ++any; + for ( j=0; cur[j]!=NULL; ++j ) { + if ( ret ) + u_stupidstrcpy(ret+len,cur[j]); + len += u_strlen(cur[j]); + if ( ret ) + ret[len] = '\n'; + ++len; + } + if ( ret ) + ret[len] = '\n'; + ++len; + } + } + + /* If no matches then put in "the quick brown...", in russian too if the encoding suggests it... */ + if ( !any ) { + for ( j=0; simple[j]!=NULL; ++j ) { + if ( ret ) + u_stupidstrcpy(ret+len,simple[j]); + len += u_strlen(simple[j]); + if ( ret ) + ret[len] = '\n'; + ++len; + } + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4 || + sf->encoding_name==em_koi8_r || sf->encoding_name==em_iso8859_5 ) { + if ( ret ) + ret[len] = '\n'; + ++len; + for ( j=0; simplecyrill[j]!=NULL; ++j ) { + if ( ret ) + u_stupidstrcpy(ret+len,simplecyrill[j]); + len += u_strlen(simplecyrill[j]); + if ( ret ) + ret[len] = '\n'; + ++len; + } + } + } + + if ( ret ) { + ret[len-1]='\0'; +return( ret ); + } + if ( len == 0 ) { + /* Er... We didn't find anything?! */ +return( gcalloc(1,sizeof(unichar_t))); + } + ret = galloc((len+1)*sizeof(unichar_t)); + } +} + +static void PIInit(PI *pi,FontView *fv,SplineChar *sc,MetricsView *mv) { + int di = fv!=NULL?0:sc!=NULL?1:2; + + memset(pi,'\0',sizeof(*pi)); + pi->fv = fv; + pi->mv = mv; + pi->sc = sc; + if ( fv!=NULL ) + pi->sf = fv->sf; + else if ( sc!=NULL ) + pi->sf = sc->parent; + else + pi->sf = mv->fv->sf; + if ( pi->sf->cidmaster!=NULL ) pi->sf = pi->sf->cidmaster; + pi->twobyte = (pi->sf->encoding_name>=e_first2byte && pi->sf->encoding_namesf->encoding_name>=em_unicodeplanes; + pi->iscjk = (pi->sf->encoding_name>=e_first2byte && pi->sf->encoding_namesf->encoding_name!=em_unicode && pi->sf->encoding_name!=em_unicode4; + pi->iscid = pi->sf->subfontcnt!=0; + pi->pointsize = pdefs[di].pointsize; + if ( pi->pointsize==0 ) + pi->pointsize = pi->iscid?18:20; /* 18 fits 20 across, 20 fits 16 */ + PIGetPrinterDefs(pi); +} + +void PrintDlg(FontView *fv,SplineChar *sc,MetricsView *mv) { + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[13]; + GTextInfo label[13]; + int di = fv!=NULL?0:sc!=NULL?1:2; + PI pi; + int cnt; + char buf[10]; + + PIInit(&pi,fv,sc,mv); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<charcnt; + label[1].text = (unichar_t *) (cnt==1?_STR_FullPageChar:_STR_FullPageChars); + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.mnemonic = 'C'; + gcd[1].gd.pos.x = gcd[0].gd.pos.x; gcd[1].gd.pos.y = 18+gcd[0].gd.pos.y; + gcd[1].gd.flags = (cnt==0 ? gg_visible : (gg_visible | gg_enabled)); + gcd[1].gd.cid = CID_Chars; + gcd[1].gd.handle_controlevent = PRT_RadioSet; + gcd[1].gd.popup_msg = GStringGetResource(_STR_FullPageCharPopup,NULL); + gcd[1].creator = GRadioCreate; + + label[2].text = (unichar_t *) (cnt==1?_STR_MultiSizeChar:_STR_MultiSizeChars); + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.mnemonic = 'M'; + gcd[2].gd.pos.x = gcd[0].gd.pos.x; gcd[2].gd.pos.y = 18+gcd[1].gd.pos.y; + gcd[2].gd.flags = gcd[1].gd.flags; + gcd[2].gd.cid = CID_MultiSize; + gcd[2].gd.handle_controlevent = PRT_RadioSet; + gcd[2].gd.popup_msg = GStringGetResource(_STR_MultiSizeCharPopup,NULL); + gcd[2].creator = GRadioCreate; + + label[3].text = (unichar_t *) _STR_SampleText; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.mnemonic = 'S'; + gcd[3].gd.pos.x = gcd[0].gd.pos.x; gcd[3].gd.pos.y = 18+gcd[2].gd.pos.y; + gcd[3].gd.flags = gg_visible | gg_enabled; + gcd[3].gd.cid = CID_Sample; + gcd[3].gd.handle_controlevent = PRT_RadioSet; + gcd[3].gd.popup_msg = GStringGetResource(_STR_SampleTextPopup,NULL); + gcd[3].creator = GRadioCreate; + /*if ( pi.iscid ) gcd[3].gd.flags = gg_visible;*/ + + if ( pdefs[di].pt==pt_chars && cnt==0 ) + pdefs[di].pt = (fv!=NULL?pt_fontdisplay:pt_fontsample); + gcd[pdefs[di].pt].gd.flags |= gg_cb_on; + + + label[4].text = (unichar_t *) _STR_Pointsize; + label[4].text_in_resource = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.mnemonic = 'P'; + gcd[4].gd.pos.x = 5; gcd[4].gd.pos.y = 22+gcd[3].gd.pos.y+6; + gcd[4].gd.flags = gg_visible | gg_enabled; + gcd[4].gd.cid = CID_PSLab; + gcd[4].creator = GLabelCreate; + + sprintf(buf,"%d",pi.pointsize); + label[5].text = (unichar_t *) buf; + label[5].text_is_1byte = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.mnemonic = 'P'; + gcd[5].gd.pos.x = 67; gcd[5].gd.pos.y = gcd[4].gd.pos.y-6; + gcd[5].gd.pos.width = 60; + gcd[5].gd.flags = gg_visible | gg_enabled; + gcd[5].gd.cid = CID_PointSize; + gcd[5].creator = GTextFieldCreate; + + + label[6].text = (unichar_t *) _STR_SampleTextC; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.mnemonic = 'T'; + gcd[6].gd.pos.x = 5; gcd[6].gd.pos.y = 30+gcd[5].gd.pos.y; + gcd[6].gd.flags = gg_visible | gg_enabled; + gcd[6].gd.cid = CID_SmpLab; + gcd[6].creator = GLabelCreate; + + label[7].text = pdefs[di].text; + if ( label[7].text==NULL || pi.sf->encoding_name!=pdefs[di].last_cs ) + label[7].text = PrtBuildDef(pi.sf,pi.twobyte); + gcd[7].gd.label = &label[7]; + gcd[7].gd.mnemonic = 'T'; + gcd[7].gd.pos.x = 5; gcd[7].gd.pos.y = 13+gcd[6].gd.pos.y; + gcd[7].gd.pos.width = 300; gcd[7].gd.pos.height = 160; + gcd[7].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap | gg_text_xim; + gcd[7].gd.cid = CID_SampleText; + gcd[7].creator = GTextAreaCreate; + + + gcd[8].gd.pos.x = 235; gcd[8].gd.pos.y = 12; + gcd[8].gd.pos.width = -1; gcd[8].gd.pos.height = 0; + gcd[8].gd.flags = gg_visible | gg_enabled ; + label[8].text = (unichar_t *) _STR_Setup; + label[8].text_in_resource = true; + gcd[8].gd.mnemonic = 'e'; + gcd[8].gd.label = &label[8]; + gcd[8].gd.handle_controlevent = PRT_Setup; + gcd[8].creator = GButtonCreate; + + + gcd[9].gd.pos.x = 30-3; gcd[9].gd.pos.y = gcd[7].gd.pos.y+gcd[7].gd.pos.height+6; + gcd[9].gd.pos.width = -1; gcd[9].gd.pos.height = 0; + gcd[9].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[9].text = (unichar_t *) _STR_OK; + label[9].text_in_resource = true; + gcd[9].gd.mnemonic = 'O'; + gcd[9].gd.label = &label[9]; + gcd[9].gd.handle_controlevent = PRT_OK; + gcd[9].gd.cid = CID_OK; + gcd[9].creator = GButtonCreate; + + gcd[10].gd.pos.x = 310-GIntGetResource(_NUM_Buttonsize)-30; gcd[10].gd.pos.y = gcd[9].gd.pos.y+3; + gcd[10].gd.pos.width = -1; gcd[10].gd.pos.height = 0; + gcd[10].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[10].text = (unichar_t *) _STR_Cancel; + label[10].text_in_resource = true; + gcd[10].gd.label = &label[10]; + gcd[10].gd.mnemonic = 'C'; + gcd[10].gd.handle_controlevent = PRT_Cancel; + gcd[10].gd.cid = CID_Cancel; + gcd[10].creator = GButtonCreate; + + gcd[11].gd.pos.x = 2; gcd[11].gd.pos.y = 2; + gcd[11].gd.pos.width = pos.width-4; gcd[11].gd.pos.height = pos.height-2; + gcd[11].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + gcd[11].gd.cid = CID_Group; + gcd[11].creator = GGroupCreate; + + GGadgetsCreate(pi.gw,gcd); + if ( label[7].text != pdefs[di].text ) + free( label[7].text ); + PRT_SetEnabled(&pi); + GDrawSetVisible(pi.gw,true); + while ( !pi.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(pi.gw); + free(pi.printer); +} + +/* ************************************************************************** */ +/* ******************************** Scripting ******************************* */ +/* ************************************************************************** */ + +static unichar_t *FileToUString(char *filename,int max) { + FILE *file; + int ch, ch2; + int format=0; + unichar_t *space, *upt, *end; + + file = fopen( filename,"rb" ); + if ( file==NULL ) +return( NULL ); + ch = getc(file); ch2 = getc(file); + if ( ch==0xfe && ch2==0xff ) + format = 1; /* normal ucs2 */ + else if ( ch==0xff && ch2==0xfe ) + format = 2; /* byte-swapped ucs2 */ + else + rewind(file); + space = upt = galloc((max+1)*sizeof(unichar_t)); + end = space+max; + if ( format!=0 ) { + while ( uptfontname ); + outputfile = buf; + } + pi.out = fopen(outputfile,"wb"); + if ( pi.out==NULL ) { + GDrawError("Failed to open file %s for output", outputfile ); +return; + } + } else { + outputfile = NULL; + pi.out = tmpfile(); + if ( pi.out==NULL ) { + GWidgetErrorR(_STR_FailedOpenTemp,_STR_FailedOpenTemp); +return; + } + } + + DoPrinting(&pi,outputfile,sample); + + free(sample); +} diff --git a/fontforge/problems.c b/fontforge/problems.c new file mode 100644 index 00000000..d21bd070 --- /dev/null +++ b/fontforge/problems.c @@ -0,0 +1,2930 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include + +struct problems { + FontView *fv; + CharView *cv; + SplineChar *sc; + SplineChar *msc; + unsigned int openpaths: 1; + unsigned int pointstooclose: 1; + /*unsigned int missingextrema: 1;*/ + unsigned int xnearval: 1; + unsigned int ynearval: 1; + unsigned int ynearstd: 1; /* baseline, xheight, cap, ascent, descent, etc. */ + unsigned int linenearstd: 1; /* horizontal, vertical, italicangle */ + unsigned int cpnearstd: 1; /* control points near: horizontal, vertical, italicangle */ + unsigned int cpodd: 1; /* control points beyond points on spline */ + unsigned int hintwithnopt: 1; + unsigned int ptnearhint: 1; + unsigned int hintwidthnearval: 1; + unsigned int direction: 1; + unsigned int flippedrefs: 1; + unsigned int cidmultiple: 1; + unsigned int cidblank: 1; + unsigned int bitmaps: 1; + unsigned int advancewidth: 1; + unsigned int vadvancewidth: 1; + unsigned int stem3: 1; + unsigned int showexactstem3: 1; + unsigned int irrelevantcontrolpoints: 1; + unsigned int badsubs: 1; + unsigned int missingglyph: 1; + unsigned int missinglookuptag: 1; + unsigned int DFLTscript: 1; + unsigned int toomanypoints: 1; + unsigned int toomanyhints: 1; + unsigned int toodeeprefs: 1; + unsigned int explain: 1; + unsigned int done: 1; + unsigned int doneexplain: 1; + unsigned int finish: 1; + unsigned int ignorethis: 1; + real near, xval, yval, widthval; + int explaining; + real found, expected; + real xheight, caph, ascent, descent; + real irrelevantfactor; + int advancewidthval, vadvancewidthval; + int pointsmax, hintsmax, refdepthmax; + GWindow explainw; + GGadget *explaintext, *explainvals, *ignoregadg; + SplineChar *lastcharopened; + CharView *cvopened; + char *badsubsname; + uint32 badsubstag; + int rpl_cnt, rpl_max; + struct mgrpl { + char *search; + char *rpl; /* a rpl of "" means delete (NULL means not found) */ + } *mg; + struct mlrpl { + uint32 search; + uint32 rpl; + } *mlt; +}; + +static int openpaths=1, pointstooclose=1/*, missing=0*/, doxnear=0, doynear=0; +static int doynearstd=1, linestd=1, cpstd=1, cpodd=1, hintnopt=0, ptnearhint=0; +static int hintwidth=0, direction=1, flippedrefs=1, bitmaps=0; +static int cidblank=0, cidmultiple=1, advancewidth=0, vadvancewidth=0; +static int irrelevantcp=1, missingglyph=0, missinglookuptag=0, DFLTscript=0; +static int badsubs=1, toomanypoints=1, pointsmax = 1500; +static int toomanyhints=1, hintsmax=96, toodeeprefs=1, refdepthmax=9; +static int stem3=0, showexactstem3=0; +static real near=3, xval=0, yval=0, widthval=50, advancewidthval=0, vadvancewidthval=0; +static real irrelevantfactor = .005; + +#define CID_Stop 2001 +#define CID_Next 2002 +#define CID_Fix 2003 +#define CID_ClearAll 2004 +#define CID_SetAll 2005 + +#define CID_OpenPaths 1001 +#define CID_PointsTooClose 1002 +/*#define CID_MissingExtrema 1003*/ +#define CID_XNear 1004 +#define CID_YNear 1005 +#define CID_YNearStd 1006 +#define CID_HintNoPt 1007 +#define CID_PtNearHint 1008 +#define CID_HintWidthNear 1009 +#define CID_HintWidth 1010 +#define CID_Near 1011 +#define CID_XNearVal 1012 +#define CID_YNearVal 1013 +#define CID_LineStd 1014 +#define CID_Direction 1015 +#define CID_CpStd 1016 +#define CID_CpOdd 1017 +#define CID_CIDMultiple 1018 +#define CID_CIDBlank 1019 +#define CID_FlippedRefs 1020 +#define CID_Bitmaps 1021 +#define CID_AdvanceWidth 1022 +#define CID_AdvanceWidthVal 1023 +#define CID_VAdvanceWidth 1024 +#define CID_VAdvanceWidthVal 1025 +#define CID_Stem3 1026 +#define CID_ShowExactStem3 1027 +#define CID_IrrelevantCP 1028 +#define CID_IrrelevantFactor 1029 +#define CID_BadSubs 1030 +#define CID_MissingGlyph 1031 +#define CID_MissingLookupTag 1032 +#define CID_TooManyPoints 1033 +#define CID_PointsMax 1034 +#define CID_TooManyHints 1035 +#define CID_HintsMax 1036 +#define CID_TooDeepRefs 1037 +#define CID_RefDepthMax 1038 +#define CID_DFLTScript 1039 + + +static void FixIt(struct problems *p) { + SplinePointList *spl; + SplinePoint *sp; + /*StemInfo *h;*/ + RefChar *r; + int changed; + +#if 0 /* The ultimate cause (the thing we need to fix) for these two errors */ + /* is that the stem is wrong, it's too hard to fix that here, so best */ + /* not to attempt to fix the proximal cause */ + if ( p->explaining==_STR_ProbHintHWidth ) { + for ( h=p->sc->hstem; h!=NULL && !h->active; h=h->next ); + if ( h!=NULL ) { + h->width = p->widthval; + SCOutOfDateBackground(p->sc); + SCUpdateAll(p->sc); + } else + GDrawIError("Could not find hint"); +return; + } + if ( p->explaining==_STR_ProbHintVWidth ) { + for ( h=p->sc->vstem; h!=NULL && !h->active; h=h->next ); + if ( h!=NULL ) { + h->width = p->widthval; + SCOutOfDateBackground(p->sc); + SCUpdateAll(p->sc); + } else + GDrawIError("Could not find hint"); +return; + } +#endif + if ( p->explaining==_STR_ProbFlippedRef ) { + for ( r=p->sc->layers[ly_fore].refs; r!=NULL && !r->selected; r = r->next ); + if ( r!=NULL ) { + SCPreserveState(p->sc,false); + SCRefToSplines(p->sc,r); + changed = false; + p->sc->layers[ly_fore].splines = SplineSetsCorrect(p->sc->layers[ly_fore].splines,&changed); + if ( changed ) + SCCharChangedUpdate(p->sc); + } else + GDrawIError("Could not find referenc"); +return; + } else if ( p->explaining==_STR_ProbBadWidth ) { + SCSynchronizeWidth(p->sc,p->advancewidthval,p->sc->width,NULL); +return; + } else if ( p->explaining==_STR_ProbBadVWidth ) { + p->sc->vwidth=p->vadvancewidthval; +return; + } + + for ( spl=p->sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp = spl->first; ; ) { + if ( sp->selected ) + break; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( sp->selected ) + break; + } + if ( sp==NULL ) { + GDrawIError("Nothing selected"); +return; + } + +/* I do not handle: + _STR_ProbOpenPath + _STR_ProbPointsTooClose + _STR_ProbLineItal, _STR_ProbAboveItal, _STR_ProbBelowItal, _STR_ProbRightItal, _STR_ProbLeftItal + _STR_ProbAboveOdd, _STR_ProbBelowOdd, _STR_ProbRightOdd, _STR_ProbLeftOdd + _STR_ProbHintControl + _STR_ProbHint3* +*/ + + SCPreserveState(p->sc,false); + if ( p->explaining==_STR_ProbXNear || p->explaining==_STR_ProbPtNearVHint) { + sp->prevcp.x += p->expected-sp->me.x; + sp->nextcp.x += p->expected-sp->me.x; + sp->me.x = p->expected; + } else if ( p->explaining==_STR_ProbYNear || p->explaining==_STR_ProbPtNearHHint || + p->explaining==_STR_ProbYBase || p->explaining==_STR_ProbYXHeight || + p->explaining==_STR_ProbYCapHeight || p->explaining==_STR_ProbYAs || + p->explaining==_STR_ProbYDs ) { + sp->prevcp.y += p->expected-sp->me.y; + sp->nextcp.y += p->expected-sp->me.y; + sp->me.y = p->expected; + } else if ( p->explaining==_STR_ProbLineHor ) { + if ( sp->me.y!=p->found ) { + sp=sp->next->to; + if ( !sp->selected || sp->me.y!=p->found ) { + GDrawIError("Couldn't find line"); +return; + } + } + sp->prevcp.y += p->expected-sp->me.y; + sp->nextcp.y += p->expected-sp->me.y; + sp->me.y = p->expected; + } else if ( p->explaining==_STR_ProbAboveHor || p->explaining==_STR_ProbBelowHor || + p->explaining==_STR_ProbRightHor || p->explaining==_STR_ProbLeftHor ) { + BasePoint *tofix, *other; + if ( sp->nextcp.y==p->found ) { + tofix = &sp->nextcp; + other = &sp->prevcp; + } else { + tofix = &sp->prevcp; + other = &sp->nextcp; + } + if ( tofix->y!=p->found ) { + GDrawIError("Couldn't find control point"); +return; + } + tofix->y = p->expected; + if ( sp->pointtype==pt_curve ) + other->y = p->expected; + else + sp->pointtype = pt_corner; + } else if ( p->explaining==_STR_ProbLineVert ) { + if ( sp->me.x!=p->found ) { + sp=sp->next->to; + if ( !sp->selected || sp->me.x!=p->found ) { + GDrawIError("Couldn't find line"); +return; + } + } + sp->prevcp.x += p->expected-sp->me.x; + sp->nextcp.x += p->expected-sp->me.x; + sp->me.x = p->expected; + } else if ( p->explaining==_STR_ProbAboveVert || p->explaining==_STR_ProbBelowVert || + p->explaining==_STR_ProbRightVert || p->explaining==_STR_ProbLeftVert ) { + BasePoint *tofix, *other; + if ( sp->nextcp.x==p->found ) { + tofix = &sp->nextcp; + other = &sp->prevcp; + } else { + tofix = &sp->prevcp; + other = &sp->nextcp; + } + if ( tofix->x!=p->found ) { + GDrawIError("Couldn't find control point"); +return; + } + tofix->x = p->expected; + if ( sp->pointtype==pt_curve ) + other->x = p->expected; + else + sp->pointtype = pt_corner; + } else if ( p->explaining==_STR_ProbExpectedCounter || p->explaining==_STR_ProbExpectedClockwise ) { + SplineSetReverse(spl); + } else if ( p->explaining==_STR_ProbIrrelCP ) { + if ( sp->next!=NULL ) { + double len = sqrt((sp->me.x-sp->next->to->me.x)*(sp->me.x-sp->next->to->me.x) + + (sp->me.y-sp->next->to->me.y)*(sp->me.y-sp->next->to->me.y)); + double cplen = sqrt((sp->me.x-sp->nextcp.x)*(sp->me.x-sp->nextcp.x) + + (sp->me.y-sp->nextcp.y)*(sp->me.y-sp->nextcp.y)); + if ( cplen!=0 && cplenirrelevantfactor*len ) { + sp->nextcp = sp->me; + sp->nonextcp = true; + } + } + if ( sp->prev!=NULL ) { + double len = sqrt((sp->me.x-sp->prev->from->me.x)*(sp->me.x-sp->prev->from->me.x) + + (sp->me.y-sp->prev->from->me.y)*(sp->me.y-sp->prev->from->me.y)); + double cplen = sqrt((sp->me.x-sp->prevcp.x)*(sp->me.x-sp->prevcp.x) + + (sp->me.y-sp->prevcp.y)*(sp->me.y-sp->prevcp.y)); + if ( cplen!=0 && cplenirrelevantfactor*len ) { + sp->prevcp = sp->me; + sp->noprevcp = true; + } + } + } else + GDrawIError("Did not fix: %d", p->explaining ); + if ( sp->next!=NULL ) + SplineRefigure(sp->next); + if ( sp->prev!=NULL ) + SplineRefigure(sp->prev); + SCCharChangedUpdate(p->sc); +} + +static int explain_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct problems *p = GDrawGetUserData(gw); + p->doneexplain = true; + } else if ( event->type==et_controlevent && + event->u.control.subtype == et_buttonactivate ) { + struct problems *p = GDrawGetUserData(gw); + if ( GGadgetGetCid(event->u.control.g)==CID_Stop ) + p->finish = true; + else if ( GGadgetGetCid(event->u.control.g)==CID_Fix ) + FixIt(p); + p->doneexplain = true; + } else if ( event->type==et_controlevent && + event->u.control.subtype == et_radiochanged ) { + struct problems *p = GDrawGetUserData(gw); + p->ignorethis = GGadgetIsChecked(event->u.control.g); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("problems.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +static void ExplainIt(struct problems *p, SplineChar *sc, int explain, + real found, real expected ) { + GRect pos; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + unichar_t ubuf[100]; char buf[20]; + SplinePointList *spl; Spline *spline, *first; + int fixable; + + if ( !p->explain || p->finish ) +return; + if ( p->explainw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor; + wattrs.event_masks = ~(1<explainw = GDrawCreateTopWindow(NULL,&pos,explain_e_h,p,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + label[0].text = (unichar_t *) explain; + label[0].text_in_resource = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 6; gcd[0].gd.pos.y = 6; gcd[0].gd.pos.width = 400-12; + gcd[0].gd.flags = gg_visible | gg_enabled; + gcd[0].creator = GLabelCreate; + + label[4].text = (unichar_t *) ""; + label[4].text_is_1byte = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.pos.x = 6; gcd[4].gd.pos.y = gcd[0].gd.pos.y+12; gcd[4].gd.pos.width = 400-12; + gcd[4].gd.flags = gg_visible | gg_enabled; + gcd[4].creator = GLabelCreate; + + label[5].text = (unichar_t *) _STR_IgnoreProblemFuture; + label[5].text_in_resource = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.pos.x = 6; gcd[5].gd.pos.y = gcd[4].gd.pos.y+12; + gcd[5].gd.flags = gg_visible | gg_enabled; + gcd[5].creator = GCheckBoxCreate; + + gcd[1].gd.pos.x = 15-3; gcd[1].gd.pos.y = gcd[5].gd.pos.y+20; + gcd[1].gd.pos.width = -1; gcd[1].gd.pos.height = 0; + gcd[1].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[1].text = (unichar_t *) _STR_Next; + label[1].text_in_resource = true; + gcd[1].gd.mnemonic = 'N'; + gcd[1].gd.label = &label[1]; + gcd[1].gd.cid = CID_Next; + gcd[1].creator = GButtonCreate; + + gcd[2].gd.pos.x = -15; gcd[2].gd.pos.y = gcd[1].gd.pos.y+3; + gcd[2].gd.pos.width = -1; gcd[2].gd.pos.height = 0; + gcd[2].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[2].text = (unichar_t *) _STR_Stop; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.mnemonic = 'S'; + gcd[2].gd.cid = CID_Stop; + gcd[2].creator = GButtonCreate; + + gcd[3].gd.pos.x = 2; gcd[3].gd.pos.y = 2; + gcd[3].gd.pos.width = pos.width-4; gcd[3].gd.pos.height = pos.height-2; + gcd[3].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + gcd[3].creator = GGroupCreate; + + gcd[6].gd.pos.x = 200-30; gcd[6].gd.pos.y = gcd[2].gd.pos.y; + gcd[6].gd.pos.width = -1; gcd[6].gd.pos.height = 0; + gcd[6].gd.flags = /*gg_visible |*/ gg_enabled; + label[6].text = (unichar_t *) _STR_Fix; + label[6].text_in_resource = true; + gcd[6].gd.mnemonic = 'F'; + gcd[6].gd.label = &label[6]; + gcd[6].gd.cid = CID_Fix; + gcd[6].creator = GButtonCreate; + + GGadgetsCreate(p->explainw,gcd); + p->explaintext = gcd[0].ret; + p->explainvals = gcd[4].ret; + p->ignoregadg = gcd[5].ret; + } else + GGadgetSetTitle(p->explaintext,GStringGetResource(explain,NULL)); + p->explaining = explain; + fixable = explain==/*_STR_ProbHintHWidth || explain==_STR_ProbHintVWidth ||*/ + explain==_STR_ProbFlippedRef || + explain==_STR_ProbXNear || explain==_STR_ProbPtNearVHint || + explain==_STR_ProbYNear || explain==_STR_ProbPtNearHHint || + explain==_STR_ProbIrrelCP || + explain==_STR_ProbYBase || explain==_STR_ProbYXHeight || + explain==_STR_ProbYCapHeight || explain==_STR_ProbYAs || + explain==_STR_ProbYDs || + explain==_STR_ProbLineHor || explain==_STR_ProbLineVert || + explain==_STR_ProbAboveHor || explain==_STR_ProbBelowHor || + explain==_STR_ProbRightHor || explain==_STR_ProbLeftHor || + explain==_STR_ProbAboveVert || explain==_STR_ProbBelowVert || + explain==_STR_ProbRightVert || explain==_STR_ProbLeftVert || + explain==_STR_ProbExpectedCounter || explain==_STR_ProbExpectedClockwise || + explain==_STR_ProbBadWidth || + explain==_STR_ProbBadVWidth; + GGadgetSetVisible(GWidgetGetControl(p->explainw,CID_Fix),fixable); + + if ( explain==_STR_ProbBadSubs ) { + u_snprintf(ubuf,sizeof(ubuf)/sizeof(ubuf[0]), + GStringGetResource(_STR_ProbBadSubs2,NULL), p->badsubsname, + (p->badsubstag>>24),(p->badsubstag>>16)&0xff,(p->badsubstag>>8)&0xff,p->badsubstag&0xff); + } else if ( found==expected ) + ubuf[0]='\0'; + else { + u_strcpy(ubuf,GStringGetResource(_STR_Found,NULL)); + sprintf(buf,"%.4g", found ); + uc_strcat(ubuf,buf); + u_strcat(ubuf,GStringGetResource(_STR_Expected,NULL)); + sprintf(buf,"%.4g", expected ); + uc_strcat(ubuf,buf); + } + p->found = found; p->expected = expected; + GGadgetSetTitle(p->explainvals,ubuf); + GGadgetSetChecked(p->ignoregadg,false); + + p->doneexplain = false; + p->ignorethis = false; + + if ( sc!=p->lastcharopened || sc->views==NULL ) { + if ( p->cvopened!=NULL && CVValid(p->fv->sf,p->lastcharopened,p->cvopened) ) + GDrawDestroyWindow(p->cvopened->gw); + p->cvopened = NULL; + if ( sc->views!=NULL ) + GDrawRaise(sc->views->gw); + else + p->cvopened = CharViewCreate(sc,p->fv); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + GDrawProcessPendingEvents(NULL); + p->lastcharopened = sc; + } + if ( explain==_STR_ProbBadSubs ) { + SCCharInfo(sc); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + GDrawProcessPendingEvents(NULL); + } + + SCUpdateAll(sc); /* We almost certainly just selected something */ + + GDrawSetVisible(p->explainw,true); + GDrawRaise(p->explainw); + + while ( !p->doneexplain ) + GDrawProcessOneEvent(NULL); + /*GDrawSetVisible(p->explainw,false);*/ /* KDE gets unhappy about this and refuses to show the window later. I don't know why */ + + if ( p->cv!=NULL ) { + CVClearSel(p->cv); + } else { + for ( spl = p->sc->layers[ly_fore].splines; spl!=NULL; spl = spl->next ) { + spl->first->selected = false; + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + spline->to->selected = false; + if ( first==NULL ) first = spline; + } + } + } +} + +static void _ExplainIt(struct problems *p, int enc, int explain, + real found, real expected ) { + ExplainIt(p,p->sc=SFMakeChar(p->fv->sf,enc),explain,found,expected); +} + +/* if they deleted a point or a splineset while we were explaining then we */ +/* need to do some fix-ups. This routine detects a deletion and lets us know */ +/* that more processing is needed */ +static int missing(struct problems *p,SplineSet *test, SplinePoint *sp) { + SplinePointList *spl, *check; + SplinePoint *tsp; + + if ( !p->explain ) +return( false ); + + if ( p->cv!=NULL ) + spl = p->cv->layerheads[p->cv->drawmode]->splines; + else + spl = p->sc->layers[ly_fore].splines; + for ( check = spl; check!=test && check!=NULL; check = check->next ); + if ( check==NULL ) +return( true ); /* Deleted splineset */ + + if ( sp!=NULL ) { + for ( tsp=test->first; tsp!=sp ; ) { + if ( tsp->next==NULL ) +return( true ); + tsp = tsp->next->to; + if ( tsp==test->first ) +return( true ); + } + } +return( false ); +} + +static int missingspline(struct problems *p,SplineSet *test, Spline *spline) { + SplinePointList *spl, *check; + Spline *t, *first=NULL; + + if ( !p->explain ) +return( false ); + + if ( p->cv!=NULL ) + spl = p->cv->layerheads[p->cv->drawmode]->splines; + else + spl = p->sc->layers[ly_fore].splines; + for ( check = spl; check!=test && check!=NULL; check = check->next ); + if ( check==NULL ) +return( true ); /* Deleted splineset */ + + for ( t=test->first->next; t!=NULL && t!=first && t!=spline; t = t->to->next ) + if ( first==NULL ) first = t; +return( t!=spline ); +} + +static int missinghint(StemInfo *base, StemInfo *findme) { + + while ( base!=NULL && base!=findme ) + base = base->next; +return( base==NULL ); +} + +static int HVITest(struct problems *p,BasePoint *to, BasePoint *from, + Spline *spline, int hasia, real ia) { + real yoff, xoff, angle; + int ishor=false, isvert=false, isital=false; + int isto; + int type; + BasePoint *base, *other; + static int hmsgs[5] = { _STR_ProbLineHor, _STR_ProbAboveHor, _STR_ProbBelowHor, _STR_ProbRightHor, _STR_ProbLeftHor }; + static int vmsgs[5] = { _STR_ProbLineVert, _STR_ProbAboveVert, _STR_ProbBelowVert, _STR_ProbRightVert, _STR_ProbLeftVert }; + static int imsgs[5] = { _STR_ProbLineItal, _STR_ProbAboveItal, _STR_ProbBelowItal, _STR_ProbRightItal, _STR_ProbLeftItal }; + + yoff = to->y-from->y; + xoff = to->x-from->x; + angle = atan2(yoff,xoff); + if ( angle<0 ) + angle += 3.1415926535897932; + if ( angle<.1 || angle>3.1415926535897932-.1 ) { + if ( yoff!=0 ) + ishor = true; + } else if ( angle>1.5707963-.1 && angle<1.5707963+.1 ) { + if ( xoff!=0 ) + isvert = true; + } else if ( hasia && angle>ia-.1 && angleia+.03 ) + isital = true; + } + if ( ishor || isvert || isital ) { + isto = false; + if ( &spline->from->me==from || &spline->from->me==to ) + spline->from->selected = true; + if ( &spline->to->me==from || &spline->to->me==to ) + spline->to->selected = isto = true; + if ( from==&spline->from->me || from == &spline->to->me ) { + base = from; other = to; + } else { + base = to; other = from; + } + if ( &spline->from->me==from && &spline->to->me==to ) { + type = 0; /* Line */ + if ( (ishor && xoff<0) || (isvert && yoff<0)) { + base = from; + other = to; + } else { + base = to; + other = from; + } + } else if ( abs(yoff)>abs(xoff) ) + type = ((yoff>0) ^ isto)?1:2; + else + type = ((xoff>0) ^ isto)?3:4; + if ( ishor ) + ExplainIt(p,p->sc,hmsgs[type], other->y,base->y); + else if ( isvert ) + ExplainIt(p,p->sc,vmsgs[type], other->x,base->x); + else + ExplainIt(p,p->sc,imsgs[type],0,0); +return( true ); + } +return( false ); +} + +/* Is the control point outside of the spline segment when projected onto the */ +/* vector between the end points of the spline segment? */ +static int OddCPCheck(BasePoint *cp,BasePoint *base,BasePoint *v, + SplinePoint *sp, struct problems *p) { + real len = (cp->x-base->x)*v->x+ (cp->y-base->y)*v->y; + real xoff, yoff; + int msg=0; + + if ( len<0 || len>1 || (len==0 && &sp->me!=base) || (len==1 && &sp->me==base)) { + xoff = cp->x-sp->me.x; yoff = cp->y-sp->me.y; + if ( fabs(yoff)>fabs(xoff) ) + msg = yoff>0?_STR_ProbAboveOdd:_STR_ProbBelowOdd; + else + msg = xoff>0?_STR_ProbRightOdd:_STR_ProbLeftOdd; + sp->selected = true; + ExplainIt(p,p->sc,msg, 0,0); +return( true ); + } +return( false ); +} + +static int Hint3Check(struct problems *p,StemInfo *h) { + StemInfo *h2, *h3; + + /* Must be three hints to be interesting */ + if ( h==NULL || (h2=h->next)==NULL || (h3=h2->next)==NULL ) +return(false); + if ( h3->next!=NULL ) { + StemInfo *bad, *goods[3]; + if ( h3->next->next!=NULL ) /* Don't try to find a subset with 5 */ +return(false); + if ( h->width==h2->width || h->width==h3->width ) { + goods[0] = h; + if ( h->width==h2->width ) { + goods[1] = h2; + if ( h->width==h3->width && h->width!=h3->next->width ) { + goods[2] = h3; + bad = h3->next; + } else if ( h->width!=h3->width && h->width==h3->next->width ) { + goods[2] = h3->next; + bad = h3; + } else +return(false); + } else if ( h->width==h3->width && h->width==h3->next->width ) { + goods[1] = h3; + goods[2] = h3->next; + bad = h2; + } else +return(false); + } else if ( h2->width == h3->width && h2->width==h3->next->width ) { + bad = h; + goods[0] = h2; goods[1] = h3; goods[2] = h3->next; + } else +return(false); + if ( goods[2]->start-goods[1]->start == goods[1]->start-goods[0]->start ) { + bad->active = true; + ExplainIt(p,p->sc,_STR_ProbHint3Four,0,0); + if ( !missinghint(p->sc->hstem,bad) || !missinghint(p->sc->vstem,bad)) + bad->active = false; + if ( p->ignorethis ) + p->stem3 = false; +return( true ); + } +return(false); + } + + if ( h->width==h2->width && h->width==h3->width && + h2->start-h->start == h3->start-h2->start ) { + if ( p->showexactstem3 ) { + ExplainIt(p,p->sc,_STR_NoProbHint3,0,0); + if ( p->ignorethis ) + p->showexactstem3 = false; + } +return( false ); /* It IS a stem3, so don't complain */ + } + + if ( h->width==h2->width && h->width==h3->width ) { + if ( h2->start-h->start+p->near > h3->start-h2->start && + h2->start-h->start-p->near < h3->start-h2->start ) { + ExplainIt(p,p->sc,_STR_ProbHint3Spacing,0,0); + if ( p->ignorethis ) + p->stem3 = false; +return( true ); + } +return( false ); + } + + if ( (h2->start-h->start+p->near > h3->start-h2->start && + h2->start-h->start-p->near < h3->start-h2->start ) || + (h2->start-h->start-h->width+p->near > h3->start-h2->start-h2->width && + h2->start-h->start-h->width-p->near < h3->start-h2->start-h2->width )) { + if ( h->width==h2->width ) { + if ( h->width+p->near > h3->width && h->width-p->near < h3->width ) { + h3->active = true; + ExplainIt(p,p->sc,_STR_ProbHint3Width,0,0); + if ( !missinghint(p->sc->hstem,h3) || !missinghint(p->sc->vstem,h3)) + h3->active = false; + if ( p->ignorethis ) + p->stem3 = false; +return( true ); + } else +return( false ); + } + if ( h->width==h3->width ) { + if ( h->width+p->near > h2->width && h->width-p->near < h2->width ) { + h2->active = true; + ExplainIt(p,p->sc,_STR_ProbHint3Width,0,0); + if ( !missinghint(p->sc->hstem,h2) || !missinghint(p->sc->vstem,h2)) + h2->active = false; + if ( p->ignorethis ) + p->stem3 = false; +return( true ); + } else +return( false ); + } + if ( h2->width==h3->width ) { + if ( h2->width+p->near > h->width && h2->width-p->near < h->width ) { + h->active = true; + ExplainIt(p,p->sc,_STR_ProbHint3Width,0,0); + if ( !missinghint(p->sc->hstem,h) || !missinghint(p->sc->vstem,h)) + h->active = false; + if ( p->ignorethis ) + p->stem3 = false; +return( true ); + } else +return( false ); + } + } +return( false ); +} + +static int RefDepth(RefChar *r) { + RefChar *ref; + int cur, max=0; + + for ( ref= r->sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + cur = RefDepth(ref); + if ( cur>max ) max = cur; + } +return( max+1 ); +} + +static int SCRefDepth(SplineChar *sc) { + RefChar *ref; + int cur, max=0; + + for ( ref= sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + cur = RefDepth(ref); + if ( cur>max ) max = cur; + } +return( max ); +} + +static int SPLPointCnt(SplinePointList *spl) { + SplinePoint *sp; + int cnt=0; + + for ( ; spl!=NULL; spl = spl->next ) { + for ( sp = spl->first; ; ) { + ++cnt; + if ( sp->prev!=NULL && !sp->prev->knownlinear ) { + if ( sp->prev->order2 ) + ++cnt; + else + cnt += 2; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } +return( cnt ); +} + +static int SCProblems(CharView *cv,SplineChar *sc,struct problems *p) { + SplineSet *spl, *test; + Spline *spline, *first; + SplinePoint *sp, *nsp; + int needsupdate=false, changed=false; + StemInfo *h; + + restart: + if ( cv!=NULL ) { + needsupdate = CVClearSel(cv); + spl = cv->layerheads[cv->drawmode]->splines; + sc = cv->sc; + } else { + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl = spl->next ) { + if ( spl->first->selected ) { needsupdate = true; spl->first->selected = false; } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( spline->to->selected ) + { needsupdate = true; spline->to->selected = false; } + if ( first==NULL ) first = spline; + } + } + spl = sc->layers[ly_fore].splines; + } + p->sc = sc; + if (( p->ptnearhint || p->hintwidthnearval || p->hintwithnopt ) && + sc->changedsincelasthinted && !sc->manualhints ) + SplineCharAutoHint(sc,true); + + if ( p->openpaths ) { + for ( test=spl; test!=NULL && !p->finish; test=test->next ) { + /* I'm also including in "open paths" the special case of a */ + /* singleton point with connects to itself */ + if ( test->first!=NULL && ( test->first->prev==NULL || + ( test->first->prev == test->first->next && + test->first->noprevcp && test->first->nonextcp))) { + changed = true; + test->first->selected = test->last->selected = true; + ExplainIt(p,sc,_STR_ProbOpenPath,0,0); + if ( p->ignorethis ) { + p->openpaths = false; + break; + } + if ( missing(p,test,NULL)) + goto restart; + } + } + } + + if ( p->pointstooclose && !p->finish ) { + for ( test=spl; test!=NULL && !p->finish && p->pointstooclose; test=test->next ) { + sp = test->first; + do { + if ( sp->next==NULL ) + break; + nsp = sp->next->to; + if ( (nsp->me.x-sp->me.x)*(nsp->me.x-sp->me.x) + (nsp->me.y-sp->me.y)*(nsp->me.y-sp->me.y) < 2*2 ) { + changed = true; + sp->selected = nsp->selected = true; + ExplainIt(p,sc,_STR_ProbPointsTooClose,0,0); + if ( p->ignorethis ) { + p->pointstooclose = false; + break; + } + if ( missing(p,test,nsp)) + goto restart; + } + sp = nsp; + } while ( sp!=test->first && !p->finish ); + if ( !p->pointstooclose ) + break; + } + } + + if ( p->xnearval && !p->finish ) { + for ( test=spl; test!=NULL && !p->finish && p->xnearval; test=test->next ) { + sp = test->first; + do { + if ( sp->me.x-p->xvalnear && p->xval-sp->me.xnear && + sp->me.x!=p->xval ) { + changed = true; + sp->selected = true; + ExplainIt(p,sc,_STR_ProbXNear,sp->me.x,p->xval); + if ( p->ignorethis ) { + p->xnearval = false; + break; + } + if ( missing(p,test,sp)) + goto restart; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } while ( sp!=test->first && !p->finish ); + if ( !p->xnearval ) + break; + } + } + + if ( p->ynearval && !p->finish ) { + for ( test=spl; test!=NULL && !p->finish && p->ynearval; test=test->next ) { + sp = test->first; + do { + if ( sp->me.y-p->yvalnear && p->yval-sp->me.ynear && + sp->me.y != p->yval ) { + changed = true; + sp->selected = true; + ExplainIt(p,sc,_STR_ProbYNear,sp->me.y,p->yval); + if ( p->ignorethis ) { + p->ynearval = false; + break; + } + if ( missing(p,test,sp)) + goto restart; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } while ( sp!=test->first && !p->finish ); + if ( !p->ynearval ) + break; + } + } + + if ( p->ynearstd && !p->finish ) { + real expected; + int msg; + for ( test=spl; test!=NULL && !p->finish && p->ynearstd; test=test->next ) { + sp = test->first; + do { + if (( sp->me.y-p->xheightnear && p->xheight-sp->me.ynear && sp->me.y!=p->xheight ) || + ( sp->me.y-p->caphnear && p->caph-sp->me.ynear && sp->me.y!=p->caph && sp->me.y!=p->ascent ) || + ( sp->me.y-p->ascentnear && p->ascent-sp->me.ynear && sp->me.y!=p->caph && sp->me.y!=p->ascent ) || + ( sp->me.y-p->descentnear && p->descent-sp->me.ynear && sp->me.y!=p->descent ) || + ( sp->me.ynear && -sp->me.ynear && sp->me.y!=0 ) ) { + changed = true; + sp->selected = true; + if ( sp->me.ynear && -sp->me.ynear ) { + msg = _STR_ProbYBase; + expected = 0; + } else if ( sp->me.y-p->xheightnear && p->xheight-sp->me.ynear ) { + msg = _STR_ProbYXHeight; + expected = p->xheight; + } else if ( sp->me.y-p->caphnear && p->caph-sp->me.ynear ) { + msg = _STR_ProbYCapHeight; + expected = p->caph; + } else if ( sp->me.y-p->ascentnear && p->ascent-sp->me.ynear ) { + msg = _STR_ProbYAs; + expected = p->ascent; + } else { + msg = _STR_ProbYDs; + expected = p->descent; + } + ExplainIt(p,sc,msg,sp->me.y,expected); + if ( p->ignorethis ) { + p->ynearstd = false; + break; + } + if ( missing(p,test,sp)) + goto restart; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } while ( sp!=test->first && !p->finish ); + if ( !p->ynearstd ) + break; + } + } + + if ( p->linenearstd && !p->finish ) { + real ia = (90-p->fv->sf->italicangle)*(3.1415926535897932/180); + int hasia = p->fv->sf->italicangle!=0; + for ( test=spl; test!=NULL && !p->finish && p->linenearstd; test = test->next ) { + first = NULL; + for ( spline = test->first->next; spline!=NULL && spline!=first && !p->finish; spline=spline->to->next ) { + if ( spline->knownlinear ) { + if ( HVITest(p,&spline->to->me,&spline->from->me,spline, + hasia, ia)) { + changed = true; + if ( p->ignorethis ) { + p->linenearstd = false; + break; + } + if ( missingspline(p,test,spline)) + goto restart; + } + } + if ( first==NULL ) first = spline; + } + if ( !p->linenearstd ) + break; + } + } + + if ( p->cpnearstd && !p->finish ) { + real ia = (90-p->fv->sf->italicangle)*(3.1415926535897932/180); + int hasia = p->fv->sf->italicangle!=0; + for ( test=spl; test!=NULL && !p->finish && p->linenearstd; test = test->next ) { + first = NULL; + for ( spline = test->first->next; spline!=NULL && spline!=first && !p->finish; spline=spline->to->next ) { + if ( !spline->knownlinear ) { + if ( !spline->from->nonextcp && + HVITest(p,&spline->from->nextcp,&spline->from->me,spline, + hasia, ia)) { + changed = true; + if ( p->ignorethis ) { + p->cpnearstd = false; + break; + } + if ( missingspline(p,test,spline)) + goto restart; + } + if ( !spline->to->noprevcp && + HVITest(p,&spline->to->me,&spline->to->prevcp,spline, + hasia, ia)) { + changed = true; + if ( p->ignorethis ) { + p->cpnearstd = false; + break; + } + if ( missingspline(p,test,spline)) + goto restart; + } + } + if ( first==NULL ) first = spline; + } + if ( !p->cpnearstd ) + break; + } + } + + if ( p->cpodd && !p->finish ) { + for ( test=spl; test!=NULL && !p->finish && p->linenearstd; test = test->next ) { + first = NULL; + for ( spline = test->first->next; spline!=NULL && spline!=first && !p->finish; spline=spline->to->next ) { + if ( !spline->knownlinear ) { + BasePoint v; real len; + v.x = spline->to->me.x-spline->from->me.x; + v.y = spline->to->me.y-spline->from->me.y; + len = /*sqrt*/(v.x*v.x+v.y*v.y); + v.x /= len; v.y /= len; + if ( !spline->from->nonextcp && + OddCPCheck(&spline->from->nextcp,&spline->from->me,&v, + spline->from,p)) { + changed = true; + if ( p->ignorethis ) { + p->cpodd = false; + break; + } + if ( missingspline(p,test,spline)) + goto restart; + } + if ( !spline->to->noprevcp && + OddCPCheck(&spline->to->prevcp,&spline->from->me,&v, + spline->to,p)) { + changed = true; + if ( p->ignorethis ) { + p->cpodd = false; + break; + } + if ( missingspline(p,test,spline)) + goto restart; + } + } + if ( first==NULL ) first = spline; + } + if ( !p->cpodd ) + break; + } + } + + if ( p->irrelevantcontrolpoints && !p->finish ) { + for ( test=spl; test!=NULL && !p->finish && p->irrelevantcontrolpoints; test = test->next ) { + for ( sp=test->first; !p->finish && p->irrelevantcontrolpoints; ) { + int either = false; + if ( sp->prev!=NULL ) { + double len = sqrt((sp->me.x-sp->prev->from->me.x)*(sp->me.x-sp->prev->from->me.x) + + (sp->me.y-sp->prev->from->me.y)*(sp->me.y-sp->prev->from->me.y)); + double cplen = sqrt((sp->me.x-sp->prevcp.x)*(sp->me.x-sp->prevcp.x) + + (sp->me.y-sp->prevcp.y)*(sp->me.y-sp->prevcp.y)); + if ( cplen!=0 && cplenirrelevantfactor*len ) + either = true; + } + if ( sp->next!=NULL ) { + double len = sqrt((sp->me.x-sp->next->to->me.x)*(sp->me.x-sp->next->to->me.x) + + (sp->me.y-sp->next->to->me.y)*(sp->me.y-sp->next->to->me.y)); + double cplen = sqrt((sp->me.x-sp->nextcp.x)*(sp->me.x-sp->nextcp.x) + + (sp->me.y-sp->nextcp.y)*(sp->me.y-sp->nextcp.y)); + if ( cplen!=0 && cplenirrelevantfactor*len ) + either = true; + } + if ( either ) { + sp->selected = true; + ExplainIt(p,sc,_STR_ProbIrrelCP,0,0); + if ( p->ignorethis ) { + p->irrelevantcontrolpoints = false; + break; + } + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==test->first ) + break; + } + } + } + + if ( p->hintwithnopt && !p->finish ) { + int anys, anye; + restarthhint: + for ( h=sc->hstem; h!=NULL ; h=h->next ) { + anys = anye = false; + for ( test=spl; test!=NULL && !p->finish && (!anys || !anye); test=test->next ) { + sp = test->first; + do { + if (sp->me.y==h->start ) + anys = true; + if (sp->me.y==h->start+h->width ) + anye = true; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } while ( sp!=test->first && !p->finish ); + } + if ( h->ghost && ( anys || anye )) + /* Ghost hints only define one edge */; + else if ( !anys || !anye ) { + h->active = true; + changed = true; + ExplainIt(p,sc,_STR_ProbHintControl,0,0); + if ( !missinghint(sc->hstem,h)) + h->active = false; + if ( p->ignorethis ) { + p->hintwithnopt = false; + break; + } + if ( missinghint(sc->hstem,h)) + goto restarthhint; + } + } + restartvhint: + for ( h=sc->vstem; h!=NULL && p->hintwithnopt && !p->finish; h=h->next ) { + anys = anye = false; + for ( test=spl; test!=NULL && !p->finish && (!anys || !anye); test=test->next ) { + sp = test->first; + do { + if (sp->me.x==h->start ) + anys = true; + if (sp->me.x==h->start+h->width ) + anye = true; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } while ( sp!=test->first && !p->finish ); + } + if ( !anys || !anye ) { + h->active = true; + changed = true; + ExplainIt(p,sc,_STR_ProbHintControl,0,0); + if ( p->ignorethis ) { + p->hintwithnopt = false; + break; + } + if ( missinghint(sc->vstem,h)) + goto restartvhint; + h->active = false; + } + } + } + + if ( p->ptnearhint && !p->finish ) { + real found, expected; + for ( test=spl; test!=NULL && !p->finish && p->ptnearhint; test=test->next ) { + sp = test->first; + do { + int hs = false, vs = false; + for ( h=sc->hstem; h!=NULL; h=h->next ) { + if (( sp->me.y-h->startnear && h->start-sp->me.ynear && + sp->me.y!=h->start ) || + ( sp->me.y-h->start+h->widthnear && h->start+h->width-sp->me.ynear && + sp->me.y!=h->start+h->width )) { + found = sp->me.y; + if ( sp->me.y-h->startnear && h->start-sp->me.ynear ) + expected = h->start; + else + expected = h->start+h->width; + h->active = true; + hs = true; + break; + } + } + if ( !hs ) { + for ( h=sc->vstem; h!=NULL; h=h->next ) { + if (( sp->me.x-h->startnear && h->start-sp->me.xnear && + sp->me.x!=h->start ) || + ( sp->me.x-h->start+h->widthnear && h->start+h->width-sp->me.xnear && + sp->me.x!=h->start+h->width )) { + found = sp->me.x; + if ( sp->me.x-h->startnear && h->start-sp->me.xnear ) + expected = h->start; + else + expected = h->start+h->width; + h->active = true; + vs = true; + break; + } + } + } + if ( hs || vs ) { + changed = true; + sp->selected = true; + ExplainIt(p,sc,hs?_STR_ProbPtNearHHint:_STR_ProbPtNearVHint,found,expected); + if ( p->ignorethis ) { + p->ptnearhint = false; + break; + } + if ( missing(p,test,sp)) + goto restart; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } while ( sp!=test->first && !p->finish ); + if ( !p->ptnearhint ) + break; + } + } + + if ( p->hintwidthnearval && !p->finish ) { + StemInfo *hs = NULL, *vs = NULL; + for ( h=sc->hstem; h!=NULL; h=h->next ) { + if ( h->width-p->widthvalnear && p->widthval-h->widthnear && + h->width!=p->widthval ) { + h->active = true; + hs = h; + break; + } + } + for ( h=sc->vstem; h!=NULL; h=h->next ) { + if ( h->width-p->widthvalnear && p->widthval-h->widthnear && + h->width!=p->widthval ) { + h->active = true; + vs = h; + break; + } + } + if ( hs || vs ) { + changed = true; + ExplainIt(p,sc,hs?_STR_ProbHintHWidth:_STR_ProbHintVWidth, + hs?hs->width:vs->width,p->widthval); + if ( hs!=NULL && !missinghint(sc->hstem,hs)) hs->active = false; + if ( vs!=NULL && !missinghint(sc->vstem,vs)) vs->active = false; + if ( p->ignorethis ) + p->hintwidthnearval = false; + else if ( (hs!=NULL && missinghint(sc->hstem,hs)) && + ( vs!=NULL && missinghint(sc->vstem,vs))) + goto restart; + } + } + + if ( p->stem3 && !p->finish ) + changed |= Hint3Check(p,sc->hstem); + if ( p->stem3 && !p->finish ) + changed |= Hint3Check(p,sc->vstem); + + if ( p->direction && !p->finish ) { + SplineSet **base, *ret; + int lastscan= -1; + if ( cv!=NULL ) + base = &cv->layerheads[cv->drawmode]->splines; + else + base = &sc->layers[ly_fore].splines; + while ( !p->finish && (ret=SplineSetsDetectDir(base,&lastscan))!=NULL ) { + sp = ret->first; + changed = true; + while ( 1 ) { + sp->selected = true; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ret->first ) + break; + } + if ( SplinePointListIsClockwise(ret)) + ExplainIt(p,sc,_STR_ProbExpectedCounter,0,0); + else + ExplainIt(p,sc,_STR_ProbExpectedClockwise,0,0); + if ( p->ignorethis ) { + p->direction = false; + break; + } + } + } + + if ( p->flippedrefs && !p->finish && ( cv==NULL || cv->drawmode==dm_fore )) { + RefChar *ref; + for ( ref = sc->layers[ly_fore].refs; ref!=NULL ; ref = ref->next ) + ref->selected = false; + for ( ref = sc->layers[ly_fore].refs; !p->finish && ref!=NULL ; ref = ref->next ) { + if ( ref->transform[0]*ref->transform[3]<0 || + (ref->transform[0]==0 && ref->transform[1]*ref->transform[2]>0)) { + changed = true; + ref->selected = true; + ExplainIt(p,sc,_STR_ProbFlippedRef,0,0); + ref->selected = false; + if ( p->ignorethis ) { + p->flippedrefs = false; + break; + } + } + } + } + + if ( p->toodeeprefs && !p->finish ) { + int cnt=SCRefDepth(sc); + if ( cnt>p->refdepthmax ) { + changed = true; + ExplainIt(p,sc,_STR_ProbTooDeepRefs,cnt,p->refdepthmax); + if ( p->ignorethis ) + p->toodeeprefs = false; + } + } + + if ( p->toomanypoints && !p->finish ) { + int cnt=0; + RefChar *r; + cnt = SPLPointCnt(sc->layers[ly_fore].splines); + for ( r=sc->layers[ly_fore].refs; r!=NULL ; r=r->next ) + cnt += SPLPointCnt(r->layers[0].splines); + if ( cnt>p->pointsmax ) { + changed = true; + ExplainIt(p,sc,_STR_ProbTooManyPoints,cnt,p->pointsmax); + if ( p->ignorethis ) + p->toomanypoints = false; + } + } + + if ( p->toomanyhints && !p->finish ) { + int cnt=0; + for ( h=sc->hstem; h!=NULL; h=h->next ) + ++cnt; + for ( h=sc->vstem; h!=NULL; h=h->next ) + ++cnt; + if ( cnt>p->hintsmax ) { + changed = true; + ExplainIt(p,sc,_STR_ProbTooManyHints,cnt,p->hintsmax); + if ( p->ignorethis ) + p->toomanyhints = false; + } + } + + if ( p->bitmaps && !p->finish && SCWorthOutputting(sc)) { + BDFFont *bdf; + + for ( bdf=sc->parent->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( sc->enc>=bdf->charcnt || bdf->chars[sc->enc]==NULL ) { + changed = true; + ExplainIt(p,sc,_STR_ProbMissingBitmap,0,0); + if ( p->ignorethis ) + p->bitmaps = false; + break; + } + } + } + + if ( p->advancewidth && !p->finish && SCWorthOutputting(sc)) { + if ( sc->width!=p->advancewidthval ) { + changed = true; + ExplainIt(p,sc,_STR_ProbBadWidth,sc->width,p->advancewidthval); + if ( p->ignorethis ) + p->advancewidth = false; + } + } + + if ( p->vadvancewidth && !p->finish && SCWorthOutputting(sc)) { + if ( sc->vwidth!=p->vadvancewidthval ) { + changed = true; + ExplainIt(p,sc,_STR_ProbBadVWidth,sc->vwidth,p->vadvancewidthval); + if ( p->ignorethis ) + p->vadvancewidth = false; + } + } + + if ( p->badsubs && !p->finish ) { + PST *pst; + char *pt, *end; int ch; + for ( pst = sc->possub ; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_substitution || pst->type==pst_alternate || + pst->type==pst_multiple || pst->type==pst_ligature ) { + for ( pt=pst->u.subs.variant; *pt!='\0' ; pt=end ) { + end = strchr(pt,' '); + if ( end==NULL ) end=pt+strlen(pt); + ch = *end; + *end = '\0'; + if ( !SCWorthOutputting(SFGetCharDup(sc->parent,-1,pt)) ) { + changed = true; + p->badsubsname = copy(pt); + *end = ch; + p->badsubstag = pst->tag; + ExplainIt(p,sc,_STR_ProbBadSubs,0,0); + free(p->badsubsname); + if ( p->ignorethis ) + p->badsubs = false; + } else + *end = ch; + while ( *end==' ' ) ++end; + if ( !p->badsubs ) + break; + } + if ( !p->badsubs ) + break; + } + } + } + + + if ( needsupdate || changed ) + SCUpdateAll(sc); +return( changed ); +} + +static int CIDCheck(struct problems *p,int cid) { + int found = false; + + if ( (p->cidmultiple || p->cidblank) && !p->finish ) { + SplineFont *csf = p->fv->cidmaster; + int i, cnt; + for ( i=cnt=0; isubfontcnt; ++i ) + if ( cidsubfonts[i]->charcnt && + SCWorthOutputting(csf->subfonts[i]->chars[cid]) ) + ++cnt; + if ( cnt>1 && p->cidmultiple ) { + _ExplainIt(p,cid,_STR_ProbCIDMult,cnt,1); + if ( p->ignorethis ) + p->cidmultiple = false; + found = true; + } else if ( cnt==0 && p->cidblank ) { + _ExplainIt(p,cid,_STR_ProbCIDBlank,0,0); + if ( p->ignorethis ) + p->cidblank = false; + found = true; + } + } +return( found ); +} + +static char *missinglookup(struct problems *p,char *str) { + int i; + + for ( i=0; irpl_cnt; ++i ) + if ( strcmp(str,p->mg[i].search)==0 ) +return( p->mg[i].rpl ); + +return( NULL ); +} + +static uint32 missinglookup_tag(struct problems *p,uint32 tag) { + int i; + + for ( i=0; irpl_cnt; ++i ) + if ( p->mlt[i].search==tag ) +return( p->mlt[i].rpl ); + +return( 0 ); +} + +static void mgreplace(char **base, char *str,char *end, char *new, SplineChar *sc, PST *pst) { + PST *p, *ps; + + if ( new==NULL || *new=='\0' ) { + if ( *base==str && *end=='\0' && sc!=NULL ) { + /* We deleted the last name from the pst, it is meaningless, remove it */ + if ( sc->possub==pst ) + sc->possub = pst->next; + else { + for ( p = sc->possub, ps=p->next; ps!=NULL && ps!=pst; p=ps, ps=ps->next ); + if ( ps!=NULL ) + p->next = pst->next; + } + pst->next = NULL; + PSTFree(pst); + } else if ( *end=='\0' ) + *str = '\0'; + else + strcpy(str,end+1); /* Skip the space */ + } else { + char *res = galloc(strlen(*base)+strlen(new)-(end-str)+1); + strncpy(res,*base,str-*base); + strcpy(res+(str-*base),new); + strcat(res,end); + free(*base); + *base = res; + } +} + +static void ClearMissingState(struct problems *p) { + int i; + + if ( p->mg!=NULL ) { + for ( i=0; irpl_cnt; ++i ) { + free(p->mg[i].search); + free(p->mg[i].rpl); + } + free(p->mg); + } else + free(p->mlt); + p->mlt = NULL; + p->mg = NULL; + p->rpl_cnt = p->rpl_max = 0; +} + +enum missingglyph_type { mg_pst, mg_fpst, mg_kern, mg_vkern, mg_lookups, + mg_asm, mg_smlookups }; +struct mgask_data { + GWindow gw; + uint8 done, skipped, islookup; + uint32 tag; + char **_str, *start, *end; + SplineChar *sc; + PST *pst; + struct problems *p; +}; + +static void mark_tagto_replace(struct problems *p,uint32 tag, uint32 rpl) { + + if ( p->rpl_cnt >= p->rpl_max ) { + if ( p->rpl_max == 0 ) + p->mlt = galloc((p->rpl_max = 30)*sizeof(struct mlrpl)); + else + p->mlt = grealloc(p->mlt,(p->rpl_max += 30)*sizeof(struct mlrpl)); + } + p->mlt[p->rpl_cnt].search = tag; + p->mlt[p->rpl_cnt++].rpl = rpl; +} + +static void mark_to_replace(struct problems *p,struct mgask_data *d, char *rpl) { + int ch; + + if ( p->rpl_cnt >= p->rpl_max ) { + if ( p->rpl_max == 0 ) + p->mg = galloc((p->rpl_max = 30)*sizeof(struct mgrpl)); + else + p->mg = grealloc(p->mg,(p->rpl_max += 30)*sizeof(struct mgrpl)); + } + ch = *d->end; *d->end = '\0'; + p->mg[p->rpl_cnt].search = copy( d->start ); + p->mg[p->rpl_cnt++].rpl = copy( rpl ); + *d->end = ch; +} + +#define CID_Always 1001 +#define CID_RplText 1002 +#define CID_Ignore 1003 +#define CID_Rpl 1004 +#define CID_Skip 1005 +#define CID_Delete 1006 + +static int MGA_RplChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + struct mgask_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *rpl = _GGadgetGetTitle(g); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Rpl),*rpl!=0); + } +return( true ); +} + +static int MGA_Rpl(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct mgask_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *_rpl = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_RplText)); + if ( d->islookup ) { + if ( u_strlen(_rpl)!=4 ) { + GWidgetErrorR(_STR_TagMustBe4,_STR_TagMustBe4); +return( true); + } + mark_tagto_replace(d->p,d->tag,((_rpl[0]&0xff)<<24)|((_rpl[1]&0xff)<<16)|((_rpl[2]&0xff)<<8)|((_rpl[3]&0xff))); + } else { + char *rpl = cu_copy(_rpl); + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_Always))) + mark_to_replace(d->p,d,rpl); + mgreplace(d->_str,d->start,d->end,rpl,d->sc,d->pst); + free(rpl); + } + d->done = true; + } +return( true ); +} + +static int MGA_Delete(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct mgask_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + if ( d->islookup ) + mark_tagto_replace(d->p,d->tag,-1); + else { + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_Always))) + mark_to_replace(d->p,d,""); + mgreplace(d->_str,d->start,d->end,"",d->sc,d->pst); + } + d->done = true; + } +return( true ); +} + +static int MGA_Skip(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct mgask_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = d->skipped = true; + } +return( true ); +} + +static int mgask_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct mgask_data *d = GDrawGetUserData(gw); + d->done = d->skipped = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("problems.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +static int mgAsk(struct problems *p,char **_str,char *str, char *end,uint32 tag, + SplineChar *sc,enum missingglyph_type which,void *data) { + unichar_t buffer[200], tbuf[6]; + static char *pstnames[] = { "", "position", "pair", "substitution", + "alternate subs", "multiple subs", "ligature", NULL }; + static char *fpstnames[] = { "Contextual position", "Contextual substitution", + "Chaining position", "Chaining substitution", "Reverse chaining subs", NULL }; + static char *asmnames[] = { "Indic reordering", "Contextual substitution", + "Lig", NULL, "Simple", "Contextual insertion", NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "Kerning", NULL }; + PST *pst = data; + FPST *fpst = data; + ASM *sm = data; + char end_ch; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[12]; + GTextInfo label[12]; + struct mgask_data d; + int blen = GIntGetResource(_NUM_Buttonsize), ptwidth; + int k, rplpos; + + if ( which != mg_lookups ) { + end_ch = *end; *end = '\0'; + } + + if ( which == mg_pst ) { + if ( pst->macfeature ) + u_snprintf(buffer,sizeof(buffer)/sizeof(buffer[0]), + GStringGetResource(_STR_GlyphMacPSTTag,NULL), + sc->name, pstnames[pst->type], + pst->tag>>16, pst->tag&0xffff); + else + u_snprintf(buffer,sizeof(buffer)/sizeof(buffer[0]), + GStringGetResource(_STR_GlyphPSTTag,NULL), + sc->name, pstnames[pst->type], + pst->tag>>24, (pst->tag>>16)&0xff, (pst->tag>>8)&0xff, pst->tag&0xff); + } else if ( which == mg_fpst || which==mg_lookups ) + u_snprintf(buffer,sizeof(buffer)/sizeof(buffer[0]), + GStringGetResource(_STR_FPSTKernTag,NULL), + fpstnames[fpst->type-pst_contextpos], + fpst->tag>>24, (fpst->tag>>16)&0xff, (fpst->tag>>8)&0xff, fpst->tag&0xff); + else if ( which == mg_asm || which==mg_smlookups ) + u_snprintf(buffer,sizeof(buffer)/sizeof(buffer[0]), + GStringGetResource(_STR_MacASMTag,NULL), + asmnames[sm->type], + sm->feature, sm->setting); + else + u_snprintf(buffer,sizeof(buffer)/sizeof(buffer[0]), + GStringGetResource(_STR_FPSTKernTag,NULL), + which==mg_kern ? "Kerning Class": "Vertical Kerning Class", + which==mg_kern ? 'k' : 'v', which==mg_kern ? 'e' : 'k', 'r', 'n' ); + + memset(&d,'\0',sizeof(d)); + d._str = _str; + d.start = str; + d.end = end; + d.sc = sc; + d.pst = which==mg_pst ? data : NULL; + d.p = p; + d.islookup = which==mg_lookups; + d.tag = tag; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_centered|wam_restrict; + wattrs.event_masks = ~(1<>24; tbuf[1] = (tag>>16)&0xff; + tbuf[2] = (tag>>8)&0xff; tbuf[3] = tag&0xff; + tbuf[4] = 0; + } + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+13; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k++].creator = GLabelCreate; + + label[k].text = (unichar_t *) _STR_ReplaceWith; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+16; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k++].creator = GLabelCreate; + + rplpos = k; + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+13; gcd[k].gd.pos.width = ptwidth-20; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.cid = CID_RplText; + gcd[k].gd.handle_controlevent = MGA_RplChange; + if ( which==mg_lookups ) { + gcd[k++].creator = GListFieldCreate; + } else + gcd[k++].creator = GTextFieldCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+30; + gcd[k].gd.flags = gg_visible | gg_enabled; + label[k].text = (unichar_t *) _STR_Always; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_Always; + gcd[k++].creator = GCheckBoxCreate; + if ( which==mg_lookups ) + gcd[k-1].gd.flags = gg_enabled | gg_cb_on; + + label[k].text = (unichar_t *) _STR_IgnoreProblemFuture; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+20; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.cid = CID_Ignore; + gcd[k++].creator = GCheckBoxCreate; + + gcd[k].gd.pos.x = 10-3; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+30 -3; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible | gg_but_default; + label[k].text = (unichar_t *) _STR_Replace; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.handle_controlevent = MGA_Rpl; + gcd[k].gd.cid = CID_Rpl; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 10+blen+(ptwidth-3*blen-GGadgetScale(20))/2; + gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible | gg_enabled; + label[k].text = (unichar_t *) _STR_Remove; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.handle_controlevent = MGA_Delete; + gcd[k].gd.cid = CID_Delete; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = -10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[k].text = (unichar_t *) _STR_Skip; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.handle_controlevent = MGA_Skip; + gcd[k].gd.cid = CID_Skip; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 2; gcd[k].gd.pos.y = 2; + gcd[k].gd.pos.width = pos.width-4; gcd[k].gd.pos.height = pos.height-4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k++].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + if ( which!=mg_lookups && which!=mg_smlookups ) + *end = end_ch; + else { + int searchtype; + SplineFont *sf = p->fv!=NULL ? p->fv->sf : p->cv!=NULL ? p->cv->sc->parent : p->msc->parent; + if ( which==mg_smlookups ) + searchtype = fpst_max+1; /* Search for substitution tables */ + else if ( fpst->type==pst_contextpos || fpst->type==pst_chainpos ) + searchtype = fpst_max; /* Search for positioning tables */ + else + searchtype = fpst_max+1; /* Search for substitution tables */ + GGadgetSetList(gcd[rplpos].ret, SFGenTagListFromType(&sf->gentags,searchtype),false); + } + GDrawSetVisible(gw,true); + + while ( !d.done ) + GDrawProcessOneEvent(NULL); + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_Ignore))) + p->missingglyph = false; + GDrawDestroyWindow(gw); +return( !d.skipped ); +} + +static int StrMissingGlyph(struct problems *p,char **_str,SplineChar *sc,int which, void *data) { + char *end, ch, *str = *_str, *new; + int off; + int found = false; + SplineFont *sf = p->fv!=NULL ? p->fv->sf : p->cv!=NULL ? p->cv->sc->parent : p->msc->parent; + SplineChar *ssc; + int changed=false; + + if ( str==NULL ) +return( false ); + + while ( *str ) { + if ( p->finish || !p->missingglyph ) + break; + while ( *str==' ' ) ++str; + for ( end=str; *end!='\0' && *end!=' '; ++end ); + ch = *end; *end='\0'; + ssc = SFGetChar(sf,-1,str); + *end = ch; + if ( ssc==NULL ) { + off = end-*_str; + if ( (new = missinglookup(p,str))!=NULL ) { + mgreplace(_str, str,end, new, sc, which==mg_pst ? data : NULL); + changed = true; + off += (strlen(new)-(end-str)); + } else { + if ( mgAsk(p,_str,str,end,0,sc,which,data)) { + changed = true; + off = 0; + } + found = true; + } + if ( changed ) { + PST *test; + if ( which==mg_pst ) { + for ( test = sc->possub; test!=NULL && test!=data; test=test->next ); + if ( test==NULL ) /* Entire pst was removed */ +return( true ); + *_str = test->u.subs.variant; + } + end = *_str+off; + } + } + str = end; + } +return( found ); +} + +static int SCMissingGlyph(struct problems *p,SplineChar *sc) { + PST *pst, *next; + int found = false; + + if ( !p->missingglyph || p->finish || sc==NULL ) +return( false ); + + for ( pst=sc->possub; pst!=NULL; pst=next ) { + next = pst->next; + switch ( pst->type ) { + case pst_pair: + found |= StrMissingGlyph(p,&pst->u.pair.paired,sc,mg_pst,pst); + break; + case pst_substitution: + case pst_alternate: + case pst_multiple: + case pst_ligature: + found |= StrMissingGlyph(p,&pst->u.subs.variant,sc,mg_pst,pst); + break; + } + } +return( found ); +} + +static int KCMissingGlyph(struct problems *p,KernClass *kc,int isv) { + int i; + int found = false; + int which = isv ? mg_vkern : mg_kern; + + for ( i=1; ifirst_cnt; ++i ) + found |= StrMissingGlyph(p,&kc->firsts[i],NULL,which,kc); + for ( i=1; isecond_cnt; ++i ) + found |= StrMissingGlyph(p,&kc->seconds[i],NULL,which,kc); +return( found ); +} + +static int FPSTMissingGlyph(struct problems *p,FPST *fpst) { + int i,j; + int found = false; + + switch ( fpst->format ) { + case pst_glyphs: + for ( i=0; irule_cnt; ++i ) + for ( j=0; j<3; ++j ) + found |= StrMissingGlyph(p,&(&fpst->rules[i].u.glyph.names)[j], + NULL,mg_fpst,fpst); + break; + case pst_class: + for ( i=1; i<3; ++i ) + for ( j=0; j<(&fpst->nccnt)[i]; ++j ) + found |= StrMissingGlyph(p,&(&fpst->nclass)[i][j],NULL,mg_fpst,fpst); + break; + case pst_reversecoverage: + found |= StrMissingGlyph(p,&fpst->rules[0].u.rcoverage.replacements,NULL,mg_fpst,fpst); + /* fall through */; + case pst_coverage: + for ( i=1; i<3; ++i ) + for ( j=0; j<(&fpst->rules[0].u.coverage.ncnt)[i]; ++j ) + found |= StrMissingGlyph(p,&(&fpst->rules[0].u.coverage.ncovers)[i][j],NULL,mg_fpst,fpst); + break; + } +return( found ); +} + +static int FPSTMissingLookups(struct problems *p,FPST *fpst) { + int i, j; + int ispos = (fpst->type==pst_contextpos || fpst->type==pst_chainpos); + SplineFont *sf = p->fv!=NULL ? p->fv->sf : p->cv!=NULL ? p->cv->sc->parent : p->msc->parent; + int found = false; + uint32 new; + + if ( fpst->type==pst_reversesub ) /* No other lookups needed */ +return( false ); + + for ( i=0; irule_cnt ; ++i ) { + struct fpst_rule *r = &fpst->rules[i]; + for ( j=0; jlookup_cnt; ++j ) { + if ( !SFHasNestedLookupWithTag(sf,r->lookups[j].lookup_tag,ispos) ) { + found = true; + if ( (new = missinglookup_tag(p,r->lookups[j].lookup_tag))==0 ) { + if ( !mgAsk(p,NULL,NULL,NULL,r->lookups[j].lookup_tag,NULL,mg_lookups,fpst)) + continue; + } + if ( (new = missinglookup_tag(p,r->lookups[j].lookup_tag))!=0 ) { + if ( new==(uint32) -1 ) { + if ( j!=r->lookup_cnt-1 ) + memmove(&r->lookups[j],&r->lookups[j+1],r->lookup_cnt-j-1); + --r->lookup_cnt; + } else + r->lookups[j].lookup_tag = new; + --j; + } + } + } + } +return( found ); +} + +static int ASMMissingGlyph(struct problems *p,ASM *sm) { + int j; + int found = false; + + for ( j=4; jclass_cnt; ++j ) + found |= StrMissingGlyph(p,&sm->classes[j],NULL,mg_asm,sm); +return( found ); +} + +static int ASMMissingLookups(struct problems *p,ASM *sm) { + int i, j; + SplineFont *sf = p->fv!=NULL ? p->fv->sf : p->cv!=NULL ? p->cv->sc->parent : p->msc->parent; + int found = false; + uint32 new; + + if ( sm->type!=asm_context ) /* No lookups involved */ +return( false ); + + for ( i=0; istate_cnt*sm->class_cnt; ++i ) { + struct asm_state *this = &sm->state[i]; + for ( j=0; j<2; ++j ) { + uint32 *tagpt = &this->u.context.mark_tag+j; + if ( !SFHasNestedLookupWithTag(sf,*tagpt,false) ) { + found = true; + if ( (new = missinglookup_tag(p,*tagpt))==0 ) { + if ( !mgAsk(p,NULL,NULL,NULL,*tagpt,NULL,mg_smlookups,sm)) + continue; + } + if ( (new = missinglookup_tag(p,*tagpt))!=0 ) { + if ( new==(uint32) -1 ) + *tagpt = 0; + else + *tagpt = new; + } + } + } + } +return( found ); +} + +static int CheckForATT(struct problems *p) { + int found = false; + int i,k; + FPST *fpst; + ASM *sm; + KernClass *kc; + SplineFont *_sf, *sf; + static int buts[] = { _STR_Yes, _STR_No, 0 }; + + _sf = p->fv->sf; + if ( _sf->cidmaster ) _sf = _sf->cidmaster; + + if ( p->DFLTscript && !p->finish ) { + sf = _sf; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( sf->script_lang!=NULL ) { + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + if ( sf->script_lang[i][0].script == DEFAULT_SCRIPT ) { + found = true; + if ( GWidgetAskR(_STR_UsedDFLTscript,buts,0,1,_STR_ProbDFLT)==0 ) { + unichar_t *dflt, *result; + dflt = ScriptLangLine(sf->script_lang[i]); + result = ShowScripts(dflt); + if ( result!=NULL ) { + ScriptRecordFree(sf->script_lang[i]); + sf->script_lang[i] = SRParse(result); + free(result); + } + free(dflt); + } + } + } + } + } + + if ( p->missingglyph && !p->finish ) { + if ( p->cv!=NULL ) + found = SCMissingGlyph(p,p->cv->sc); + else if ( p->msc!=NULL ) + found = SCMissingGlyph(p,p->msc); + else { + k=0; + do { + if ( _sf->subfonts==NULL ) sf = _sf; + else sf = _sf->subfonts[k++]; + for ( i=0; icharcnt && !p->finish; ++i ) if ( sf->chars[i]!=NULL ) + found |= SCMissingGlyph(p,sf->chars[i]); + } while ( k<_sf->subfontcnt && !p->finish ); + for ( kc=_sf->kerns; kc!=NULL && !p->finish; kc=kc->next ) + found |= KCMissingGlyph(p,kc,false); + for ( kc=_sf->vkerns; kc!=NULL && !p->finish; kc=kc->next ) + found |= KCMissingGlyph(p,kc,true); + for ( fpst=_sf->possub; fpst!=NULL && !p->finish && p->missingglyph; fpst=fpst->next ) + found |= FPSTMissingGlyph(p,fpst); + for ( sm=_sf->sm; sm!=NULL && !p->finish && p->missingglyph; sm=sm->next ) + found |= ASMMissingGlyph(p,sm); + } + ClearMissingState(p); + } + + if ( p->missinglookuptag && !p->finish ) { + for ( fpst=_sf->possub; fpst!=NULL && !p->finish && p->missinglookuptag; fpst=fpst->next ) + found |= FPSTMissingLookups(p,fpst); + for ( sm=_sf->sm; sm!=NULL && !p->finish && p->missinglookuptag; sm=sm->next ) + found |= ASMMissingLookups(p,sm); + ClearMissingState(p); + } +return( found ); +} + +static void DoProbs(struct problems *p) { + int i, ret=false; + SplineChar *sc; + BDFFont *bdf; + + if ( p->missingglyph || p->missinglookuptag || p->DFLTscript ) + ret = CheckForATT(p); + if ( p->cv!=NULL ) { + ret |= SCProblems(p->cv,NULL,p); + ret |= CIDCheck(p,p->cv->sc->enc); + } else if ( p->msc!=NULL ) { + ret |= SCProblems(NULL,p->msc,p); + ret |= CIDCheck(p,p->msc->enc); + } else { + for ( i=0; ifv->sf->charcnt && !p->finish; ++i ) + if ( p->fv->selected[i] ) { + if ( (sc = p->fv->sf->chars[i])!=NULL ) { + if ( SCProblems(NULL,sc,p)) { + if ( sc!=p->lastcharopened ) { + if ( sc->views!=NULL ) + GDrawRaise(sc->views->gw); + else + CharViewCreate(sc,p->fv); + p->lastcharopened = sc; + } + ret = true; + } + } + if ( !p->finish && p->bitmaps && !SCWorthOutputting(sc)) { + for ( bdf=p->fv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if ( icharcnt && bdf->chars[i]!=NULL ) { + sc = SFMakeChar(p->fv->sf,i); + ExplainIt(p,sc,_STR_ProbMissingOutline,0,0); + ret = true; + } + } + ret |= CIDCheck(p,i); + } + } + if ( !ret ) + GDrawError( "No problems found"); +} + +static void FigureStandardHeights(struct problems *p) { + BlueData bd; + + QuickBlues(p->fv->sf,&bd); + p->xheight = bd.xheight; + p->caph = bd.caph; + p->ascent = bd.ascent; + p->descent = bd.descent; +} + +static int Prob_DoAll(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct problems *p = GDrawGetUserData(GGadgetGetWindow(g)); + int set = GGadgetGetCid(g)==CID_SetAll; + GWindow gw = GGadgetGetWindow(g); + static int cbs[] = { CID_OpenPaths, CID_PointsTooClose, CID_XNear, + CID_YNear, CID_YNearStd, CID_HintNoPt, CID_PtNearHint, + CID_HintWidthNear, CID_LineStd, CID_Direction, CID_CpStd, + CID_CpOdd, CID_FlippedRefs, CID_Bitmaps, CID_AdvanceWidth, + CID_BadSubs, CID_MissingGlyph, CID_MissingLookupTag, + CID_Stem3, CID_IrrelevantCP, CID_TooManyPoints, + CID_TooManyHints, CID_TooDeepRefs, CID_DFLTScript, + 0 }; + int i; + if ( p->fv->cidmaster!=NULL ) { + GGadgetSetChecked(GWidgetGetControl(gw,CID_CIDMultiple),set); + GGadgetSetChecked(GWidgetGetControl(gw,CID_CIDBlank),set); + } + if ( p->fv->sf->hasvmetrics ) + GGadgetSetChecked(GWidgetGetControl(gw,CID_VAdvanceWidth),set); + for ( i=0; cbs[i]!=0; ++i ) + GGadgetSetChecked(GWidgetGetControl(gw,cbs[i]),set); + } +return( true ); +} + +static int Prob_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct problems *p = GDrawGetUserData(gw); + int errs = false; + + openpaths = p->openpaths = GGadgetIsChecked(GWidgetGetControl(gw,CID_OpenPaths)); + pointstooclose = p->pointstooclose = GGadgetIsChecked(GWidgetGetControl(gw,CID_PointsTooClose)); + /*missing = p->missingextrema = GGadgetIsChecked(GWidgetGetControl(gw,CID_MissingExtrema))*/; + doxnear = p->xnearval = GGadgetIsChecked(GWidgetGetControl(gw,CID_XNear)); + doynear = p->ynearval = GGadgetIsChecked(GWidgetGetControl(gw,CID_YNear)); + doynearstd = p->ynearstd = GGadgetIsChecked(GWidgetGetControl(gw,CID_YNearStd)); + linestd = p->linenearstd = GGadgetIsChecked(GWidgetGetControl(gw,CID_LineStd)); + cpstd = p->cpnearstd = GGadgetIsChecked(GWidgetGetControl(gw,CID_CpStd)); + cpodd = p->cpodd = GGadgetIsChecked(GWidgetGetControl(gw,CID_CpOdd)); + hintnopt = p->hintwithnopt = GGadgetIsChecked(GWidgetGetControl(gw,CID_HintNoPt)); + ptnearhint = p->ptnearhint = GGadgetIsChecked(GWidgetGetControl(gw,CID_PtNearHint)); + hintwidth = p->hintwidthnearval = GGadgetIsChecked(GWidgetGetControl(gw,CID_HintWidthNear)); + direction = p->direction = GGadgetIsChecked(GWidgetGetControl(gw,CID_Direction)); + flippedrefs = p->flippedrefs = GGadgetIsChecked(GWidgetGetControl(gw,CID_FlippedRefs)); + bitmaps = p->bitmaps = GGadgetIsChecked(GWidgetGetControl(gw,CID_Bitmaps)); + advancewidth = p->advancewidth = GGadgetIsChecked(GWidgetGetControl(gw,CID_AdvanceWidth)); + irrelevantcp = p->irrelevantcontrolpoints = GGadgetIsChecked(GWidgetGetControl(gw,CID_IrrelevantCP)); + badsubs = p->badsubs = GGadgetIsChecked(GWidgetGetControl(gw,CID_BadSubs)); + missingglyph = p->missingglyph = GGadgetIsChecked(GWidgetGetControl(gw,CID_MissingGlyph)); + missinglookuptag = p->missinglookuptag = GGadgetIsChecked(GWidgetGetControl(gw,CID_MissingLookupTag)); + DFLTscript = p->DFLTscript = GGadgetIsChecked(GWidgetGetControl(gw,CID_DFLTScript)); + toomanypoints = p->toomanypoints = GGadgetIsChecked(GWidgetGetControl(gw,CID_TooManyPoints)); + toomanyhints = p->toomanyhints = GGadgetIsChecked(GWidgetGetControl(gw,CID_TooManyHints)); + toodeeprefs = p->toodeeprefs = GGadgetIsChecked(GWidgetGetControl(gw,CID_TooDeepRefs)); + stem3 = p->stem3 = GGadgetIsChecked(GWidgetGetControl(gw,CID_Stem3)); + if ( stem3 ) + showexactstem3 = p->showexactstem3 = GGadgetIsChecked(GWidgetGetControl(gw,CID_ShowExactStem3)); + if ( p->fv->cidmaster!=NULL ) { + cidmultiple = p->cidmultiple = GGadgetIsChecked(GWidgetGetControl(gw,CID_CIDMultiple)); + cidblank = p->cidblank = GGadgetIsChecked(GWidgetGetControl(gw,CID_CIDBlank)); + } + if ( p->fv->sf->hasvmetrics ) { + vadvancewidth = p->vadvancewidth = GGadgetIsChecked(GWidgetGetControl(gw,CID_VAdvanceWidth)); + } else + p->vadvancewidth = false; + p->explain = true; + if ( doxnear ) + p->xval = xval = GetRealR(gw,CID_XNearVal,_STR_XNear,&errs); + if ( doynear ) + p->yval = yval = GetRealR(gw,CID_YNearVal,_STR_YNear,&errs); + if ( hintwidth ) + widthval = p->widthval = GetRealR(gw,CID_HintWidth,_STR_HintWidth,&errs); + if ( p->advancewidth ) + advancewidthval = p->advancewidthval = GetIntR(gw,CID_AdvanceWidthVal,_STR_HintWidth,&errs); + if ( p->vadvancewidth ) + vadvancewidthval = p->vadvancewidthval = GetIntR(gw,CID_VAdvanceWidthVal,_STR_HintWidth,&errs); + if ( toomanypoints ) + p->pointsmax = pointsmax = GetIntR(gw,CID_PointsMax,_STR_MorePointsThan,&errs); + if ( toomanyhints ) + p->hintsmax = hintsmax = GetIntR(gw,CID_HintsMax,_STR_MoreHintsThan,&errs); + if ( toodeeprefs ) + p->refdepthmax = refdepthmax = GetIntR(gw,CID_RefDepthMax,_STR_RefsDeeperThan,&errs); + if ( irrelevantcp ) + p->irrelevantfactor = irrelevantfactor = GetRealR(gw,CID_IrrelevantFactor,_STR_IrrelevantFactor,&errs)/100.0; + near = p->near = GetRealR(gw,CID_Near,_STR_Near,&errs); + if ( errs ) +return( true ); + if ( doynearstd ) + FigureStandardHeights(p); + GDrawSetVisible(gw,false); + if ( openpaths || pointstooclose /*|| missing*/ || doxnear || doynear || + doynearstd || linestd || hintnopt || ptnearhint || hintwidth || + direction || p->cidmultiple || p->cidblank || p->flippedrefs || + p->bitmaps || p->advancewidth || p->vadvancewidth || p->stem3 || + p->irrelevantcontrolpoints || p->badsubs || p->missingglyph || + p->missinglookuptag || p->toomanypoints || p->toomanyhints || + p->toodeeprefs || p->DFLTscript ) { + DoProbs(p); + } + p->done = true; + } +return( true ); +} + +static int Prob_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct problems *p = GDrawGetUserData(GGadgetGetWindow(g)); + p->done = true; + } +return( true ); +} + +static int Prob_TextChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + GGadgetSetChecked(GWidgetGetControl(GGadgetGetWindow(g),(int) GGadgetGetUserData(g)),true); + } +return( true ); +} + +static int Prob_EnableExact(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_ShowExactStem3), + GGadgetIsChecked(g)); + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct problems *p = GDrawGetUserData(gw); + p->done = true; + } +return( event->type!=et_char ); +} + +void FindProblems(FontView *fv,CharView *cv, SplineChar *sc) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData pgcd[13], pagcd[7], hgcd[9], rgcd[7], cgcd[5], mgcd[11], agcd[6], rfgcd[5]; + GTextInfo plabel[13], palabel[7], hlabel[9], rlabel[7], clabel[5], mlabel[10], alabel[6], rflabel[5]; + GTabInfo aspects[8]; + struct problems p; + char xnbuf[20], ynbuf[20], widthbuf[20], nearbuf[20], awidthbuf[20], + vawidthbuf[20], irrel[20], pmax[20], hmax[20], rmax[20]; + int i; + SplineFont *sf; + /*static GBox smallbox = { bt_raised, bs_rect, 2, 1, 0, 0, 0,0,0,0, COLOR_DEFAULT,COLOR_DEFAULT };*/ + + memset(&p,0,sizeof(p)); + if ( fv==NULL ) fv = cv->fv; + p.fv = fv; p.cv=cv; p.msc = sc; + if ( cv!=NULL ) + p.lastcharopened = cv->sc; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<sf->italicangle==0?_STR_CpStd:_STR_CpStd2); + plabel[6].text_in_resource = true; + pgcd[6].gd.label = &plabel[6]; + pgcd[6].gd.mnemonic = 'C'; + pgcd[6].gd.pos.x = 3; pgcd[6].gd.pos.y = pgcd[5].gd.pos.y+15; + pgcd[6].gd.flags = gg_visible | gg_enabled; + if ( cpstd ) pgcd[6].gd.flags |= gg_cb_on; + pgcd[6].gd.popup_msg = GStringGetResource(_STR_CpStdPopup,NULL); + pgcd[6].gd.cid = CID_CpStd; + pgcd[6].creator = GCheckBoxCreate; + + plabel[7].text = (unichar_t *) _STR_CpOdd; + plabel[7].text_in_resource = true; + pgcd[7].gd.label = &plabel[7]; + pgcd[7].gd.mnemonic = 'b'; + pgcd[7].gd.pos.x = 3; pgcd[7].gd.pos.y = pgcd[6].gd.pos.y+15; + pgcd[7].gd.flags = gg_visible | gg_enabled; + if ( cpodd ) pgcd[7].gd.flags |= gg_cb_on; + pgcd[7].gd.popup_msg = GStringGetResource(_STR_CpOddPopup,NULL); + pgcd[7].gd.cid = CID_CpOdd; + pgcd[7].creator = GCheckBoxCreate; + + plabel[8].text = (unichar_t *) _STR_IrrelevantCP; + plabel[8].text_in_resource = true; + pgcd[8].gd.label = &plabel[8]; + pgcd[8].gd.pos.x = 3; pgcd[8].gd.pos.y = pgcd[7].gd.pos.y+15; + pgcd[8].gd.flags = gg_visible | gg_enabled; + if ( irrelevantcp ) pgcd[8].gd.flags |= gg_cb_on; + pgcd[8].gd.popup_msg = GStringGetResource(_STR_IrrelevantCPPopup,NULL); + pgcd[8].gd.cid = CID_IrrelevantCP; + pgcd[8].creator = GCheckBoxCreate; + + plabel[9].text = (unichar_t *) _STR_IrrelevantFactor; + plabel[9].text_in_resource = true; + pgcd[9].gd.label = &plabel[9]; + pgcd[9].gd.pos.x = 20; pgcd[9].gd.pos.y = pgcd[8].gd.pos.y+20; + pgcd[9].gd.flags = gg_visible | gg_enabled; + pgcd[9].gd.popup_msg = GStringGetResource(_STR_IrrelevantFactorPopup,NULL); + pgcd[9].creator = GLabelCreate; + + sprintf( irrel, "%g", irrelevantfactor*100 ); + plabel[10].text = (unichar_t *) irrel; + plabel[10].text_is_1byte = true; + pgcd[10].gd.label = &plabel[10]; + pgcd[10].gd.pos.x = 105; pgcd[10].gd.pos.y = pgcd[9].gd.pos.y-3; + pgcd[10].gd.pos.width = 50; + pgcd[10].gd.flags = gg_visible | gg_enabled; + pgcd[10].gd.popup_msg = GStringGetResource(_STR_IrrelevantFactorPopup,NULL); + pgcd[10].gd.cid = CID_IrrelevantFactor; + pgcd[10].creator = GTextFieldCreate; + + plabel[11].text = (unichar_t *) "%"; + plabel[11].text_is_1byte = true; + pgcd[11].gd.label = &plabel[11]; + pgcd[11].gd.pos.x = 163; pgcd[11].gd.pos.y = pgcd[9].gd.pos.y; + pgcd[11].gd.flags = gg_visible | gg_enabled; + pgcd[11].gd.popup_msg = GStringGetResource(_STR_IrrelevantFactorPopup,NULL); + pgcd[11].creator = GLabelCreate; + +/* ************************************************************************** */ + + memset(&palabel,0,sizeof(palabel)); + memset(&pagcd,0,sizeof(pagcd)); + + palabel[0].text = (unichar_t *) _STR_OpenPaths; + palabel[0].text_in_resource = true; + pagcd[0].gd.label = &palabel[0]; + pagcd[0].gd.mnemonic = 'P'; + pagcd[0].gd.pos.x = 3; pagcd[0].gd.pos.y = 6; + pagcd[0].gd.flags = gg_visible | gg_enabled; + if ( openpaths ) pagcd[0].gd.flags |= gg_cb_on; + pagcd[0].gd.popup_msg = GStringGetResource(_STR_OpenPathsPopup,NULL); + pagcd[0].gd.cid = CID_OpenPaths; + pagcd[0].creator = GCheckBoxCreate; + + palabel[1].text = (unichar_t *) (fv->sf->italicangle==0?_STR_LineStd:_STR_LineStd2); + palabel[1].text_in_resource = true; + pagcd[1].gd.label = &palabel[1]; + pagcd[1].gd.mnemonic = 'E'; + pagcd[1].gd.pos.x = 3; pagcd[1].gd.pos.y = pagcd[0].gd.pos.y+17; + pagcd[1].gd.flags = gg_visible | gg_enabled; + if ( linestd ) pagcd[1].gd.flags |= gg_cb_on; + pagcd[1].gd.popup_msg = GStringGetResource(_STR_LineStdPopup,NULL); + pagcd[1].gd.cid = CID_LineStd; + pagcd[1].creator = GCheckBoxCreate; + + palabel[2].text = (unichar_t *) _STR_CheckDirection; + palabel[2].text_in_resource = true; + pagcd[2].gd.label = &palabel[2]; + pagcd[2].gd.mnemonic = 'S'; + pagcd[2].gd.pos.x = 3; pagcd[2].gd.pos.y = pagcd[1].gd.pos.y+17; + pagcd[2].gd.flags = gg_visible | gg_enabled; + if ( direction ) pagcd[2].gd.flags |= gg_cb_on; + pagcd[2].gd.popup_msg = GStringGetResource(_STR_CheckDirectionPopup,NULL); + pagcd[2].gd.cid = CID_Direction; + pagcd[2].creator = GCheckBoxCreate; + + palabel[3].text = (unichar_t *) _STR_MorePointsThan; + palabel[3].text_in_resource = true; + pagcd[3].gd.label = &palabel[3]; + pagcd[3].gd.mnemonic = 'r'; + pagcd[3].gd.pos.x = 3; pagcd[3].gd.pos.y = pagcd[2].gd.pos.y+21; + pagcd[3].gd.flags = gg_visible | gg_enabled; + if ( toomanypoints ) pagcd[3].gd.flags |= gg_cb_on; + pagcd[3].gd.popup_msg = GStringGetResource(_STR_MorePointsThanPopup,NULL); + pagcd[3].gd.cid = CID_TooManyPoints; + pagcd[3].creator = GCheckBoxCreate; + + sprintf( pmax, "%d", pointsmax ); + palabel[4].text = (unichar_t *) pmax; + palabel[4].text_is_1byte = true; + pagcd[4].gd.label = &palabel[4]; + pagcd[4].gd.pos.x = 105; pagcd[4].gd.pos.y = pagcd[3].gd.pos.y-3; + pagcd[4].gd.pos.width = 50; + pagcd[4].gd.flags = gg_visible | gg_enabled; + pagcd[4].gd.popup_msg = GStringGetResource(_STR_MorePointsThanPopup,NULL); + pagcd[4].gd.cid = CID_PointsMax; + pagcd[4].creator = GTextFieldCreate; + +/* ************************************************************************** */ + + memset(&rflabel,0,sizeof(rflabel)); + memset(&rfgcd,0,sizeof(rfgcd)); + + rflabel[0].text = (unichar_t *) _STR_CheckFlippedRefs; + rflabel[0].text_in_resource = true; + rfgcd[0].gd.label = &rflabel[0]; + rfgcd[0].gd.mnemonic = 'r'; + rfgcd[0].gd.pos.x = 3; rfgcd[0].gd.pos.y = 6; + rfgcd[0].gd.flags = gg_visible | gg_enabled; + if ( flippedrefs ) rfgcd[0].gd.flags |= gg_cb_on; + rfgcd[0].gd.popup_msg = GStringGetResource(_STR_CheckFlippedRefsPopup,NULL); + rfgcd[0].gd.cid = CID_FlippedRefs; + rfgcd[0].creator = GCheckBoxCreate; + + rflabel[1].text = (unichar_t *) _STR_RefsDeeperThan; + rflabel[1].text_in_resource = true; + rfgcd[1].gd.label = &rflabel[1]; + rfgcd[1].gd.mnemonic = 'r'; + rfgcd[1].gd.pos.x = 3; rfgcd[1].gd.pos.y = rfgcd[0].gd.pos.y+21; + rfgcd[1].gd.flags = gg_visible | gg_enabled; + if ( toodeeprefs ) rfgcd[1].gd.flags |= gg_cb_on; + rfgcd[1].gd.popup_msg = GStringGetResource(_STR_RefsDeeperThanPopup,NULL); + rfgcd[1].gd.cid = CID_TooDeepRefs; + rfgcd[1].creator = GCheckBoxCreate; + + sprintf( rmax, "%d", refdepthmax ); + rflabel[2].text = (unichar_t *) rmax; + rflabel[2].text_is_1byte = true; + rfgcd[2].gd.label = &rflabel[2]; + rfgcd[2].gd.pos.x = 140; rfgcd[2].gd.pos.y = rfgcd[1].gd.pos.y-3; + rfgcd[2].gd.pos.width = 40; + rfgcd[2].gd.flags = gg_visible | gg_enabled; + rfgcd[2].gd.popup_msg = GStringGetResource(_STR_RefsDeeperThanPopup,NULL); + rfgcd[2].gd.cid = CID_RefDepthMax; + rfgcd[2].creator = GTextFieldCreate; + +/* ************************************************************************** */ + + memset(&hlabel,0,sizeof(hlabel)); + memset(&hgcd,0,sizeof(hgcd)); + + hlabel[0].text = (unichar_t *) _STR_HintNoPt; + hlabel[0].text_in_resource = true; + hgcd[0].gd.label = &hlabel[0]; + hgcd[0].gd.mnemonic = 'H'; + hgcd[0].gd.pos.x = 3; hgcd[0].gd.pos.y = 5; + hgcd[0].gd.flags = gg_visible | gg_enabled; + if ( hintnopt ) hgcd[0].gd.flags |= gg_cb_on; + hgcd[0].gd.popup_msg = GStringGetResource(_STR_HintNoPtPopup,NULL); + hgcd[0].gd.cid = CID_HintNoPt; + hgcd[0].creator = GCheckBoxCreate; + + hlabel[1].text = (unichar_t *) _STR_PtNearHint; + hlabel[1].text_in_resource = true; + hgcd[1].gd.label = &hlabel[1]; + hgcd[1].gd.mnemonic = 'H'; + hgcd[1].gd.pos.x = 3; hgcd[1].gd.pos.y = hgcd[0].gd.pos.y+17; + hgcd[1].gd.flags = gg_visible | gg_enabled; + if ( ptnearhint ) hgcd[1].gd.flags |= gg_cb_on; + hgcd[1].gd.popup_msg = GStringGetResource(_STR_PtNearHintPopup,NULL); + hgcd[1].gd.cid = CID_PtNearHint; + hgcd[1].creator = GCheckBoxCreate; + + hlabel[2].text = (unichar_t *) _STR_HintWidth; + hlabel[2].text_in_resource = true; + hgcd[2].gd.label = &hlabel[2]; + hgcd[2].gd.mnemonic = 'W'; + hgcd[2].gd.pos.x = 3; hgcd[2].gd.pos.y = hgcd[1].gd.pos.y+21; + hgcd[2].gd.flags = gg_visible | gg_enabled; + if ( hintwidth ) hgcd[2].gd.flags |= gg_cb_on; + hgcd[2].gd.popup_msg = GStringGetResource(_STR_HintWidthPopup,NULL); + hgcd[2].gd.cid = CID_HintWidthNear; + hgcd[2].creator = GCheckBoxCreate; + + sprintf(widthbuf,"%g",widthval); + hlabel[3].text = (unichar_t *) widthbuf; + hlabel[3].text_is_1byte = true; + hgcd[3].gd.label = &hlabel[3]; + hgcd[3].gd.pos.x = 100+5; hgcd[3].gd.pos.y = hgcd[2].gd.pos.y-1; hgcd[3].gd.pos.width = 40; + hgcd[3].gd.flags = gg_visible | gg_enabled; + hgcd[3].gd.cid = CID_HintWidth; + hgcd[3].gd.handle_controlevent = Prob_TextChanged; + hgcd[3].data = (void *) CID_HintWidthNear; + hgcd[3].creator = GTextFieldCreate; + + hlabel[4].text = (unichar_t *) _STR_Hint3; + hlabel[4].text_in_resource = true; + hgcd[4].gd.label = &hlabel[4]; + hgcd[4].gd.mnemonic = '3'; + hgcd[4].gd.pos.x = 3; hgcd[4].gd.pos.y = hgcd[3].gd.pos.y+19; + hgcd[4].gd.flags = gg_visible | gg_enabled; + if ( stem3 ) hgcd[4].gd.flags |= gg_cb_on; + hgcd[4].gd.popup_msg = GStringGetResource(_STR_Hint3Popup,NULL); + hgcd[4].gd.cid = CID_Stem3; + hgcd[4].gd.handle_controlevent = Prob_EnableExact; + hgcd[4].creator = GCheckBoxCreate; + + hlabel[5].text = (unichar_t *) _STR_ShowExactHint3; + hlabel[5].text_in_resource = true; + hgcd[5].gd.label = &hlabel[5]; + hgcd[5].gd.mnemonic = 'S'; + hgcd[5].gd.pos.x = hgcd[4].gd.pos.x+5; hgcd[5].gd.pos.y = hgcd[4].gd.pos.y+17; + hgcd[5].gd.flags = gg_visible; + if ( showexactstem3 ) hgcd[5].gd.flags |= gg_cb_on; + if ( stem3 ) hgcd[5].gd.flags |= gg_enabled; + hgcd[5].gd.popup_msg = GStringGetResource(_STR_ShowExactHint3Popup,NULL); + hgcd[5].gd.cid = CID_ShowExactStem3; + hgcd[5].creator = GCheckBoxCreate; + + hlabel[6].text = (unichar_t *) _STR_MoreHintsThan; + hlabel[6].text_in_resource = true; + hgcd[6].gd.label = &hlabel[6]; + hgcd[6].gd.pos.x = 3; hgcd[6].gd.pos.y = hgcd[5].gd.pos.y+21; + hgcd[6].gd.flags = gg_visible | gg_enabled; + if ( toomanyhints ) hgcd[6].gd.flags |= gg_cb_on; + hgcd[6].gd.popup_msg = GStringGetResource(_STR_MoreHintsThanPopup,NULL); + hgcd[6].gd.cid = CID_TooManyHints; + hgcd[6].creator = GCheckBoxCreate; + + sprintf( hmax, "%d", hintsmax ); + hlabel[7].text = (unichar_t *) hmax; + hlabel[7].text_is_1byte = true; + hgcd[7].gd.label = &hlabel[7]; + hgcd[7].gd.pos.x = 105; hgcd[7].gd.pos.y = hgcd[6].gd.pos.y-3; + hgcd[7].gd.pos.width = 50; + hgcd[7].gd.flags = gg_visible | gg_enabled; + hgcd[7].gd.popup_msg = GStringGetResource(_STR_MoreHintsThanPopup,NULL); + hgcd[7].gd.cid = CID_HintsMax; + hgcd[7].creator = GTextFieldCreate; + +/* ************************************************************************** */ + + memset(&rlabel,0,sizeof(rlabel)); + memset(&rgcd,0,sizeof(rgcd)); + + rlabel[0].text = (unichar_t *) _STR_CheckBitmaps; + rlabel[0].text_in_resource = true; + rgcd[0].gd.label = &rlabel[0]; + rgcd[0].gd.mnemonic = 'r'; + rgcd[0].gd.pos.x = 3; rgcd[0].gd.pos.y = 6; + rgcd[0].gd.flags = gg_visible | gg_enabled; + if ( bitmaps ) rgcd[0].gd.flags |= gg_cb_on; + rgcd[0].gd.popup_msg = GStringGetResource(_STR_CheckBitmapsPopup,NULL); + rgcd[0].gd.cid = CID_Bitmaps; + rgcd[0].creator = GCheckBoxCreate; + + rlabel[1].text = (unichar_t *) _STR_AdvanceWidth; + rlabel[1].text_in_resource = true; + rgcd[1].gd.label = &rlabel[1]; + rgcd[1].gd.mnemonic = 'W'; + rgcd[1].gd.pos.x = 3; rgcd[1].gd.pos.y = rgcd[0].gd.pos.y+21; + rgcd[1].gd.flags = gg_visible | gg_enabled; + if ( advancewidth ) rgcd[1].gd.flags |= gg_cb_on; + rgcd[1].gd.popup_msg = GStringGetResource(_STR_AdvanceWidthPopup,NULL); + rgcd[1].gd.cid = CID_AdvanceWidth; + rgcd[1].creator = GCheckBoxCreate; + + sf = p.fv->sf; + + if ( advancewidthval==0 && sf->chars[' ']!=NULL ) + advancewidthval = sf->chars[' ']->width; + sprintf(awidthbuf,"%g",advancewidthval); + rlabel[2].text = (unichar_t *) awidthbuf; + rlabel[2].text_is_1byte = true; + rgcd[2].gd.label = &rlabel[2]; + rgcd[2].gd.pos.x = 100+15; rgcd[2].gd.pos.y = rgcd[1].gd.pos.y-1; rgcd[2].gd.pos.width = 40; + rgcd[2].gd.flags = gg_visible | gg_enabled; + rgcd[2].gd.cid = CID_AdvanceWidthVal; + rgcd[2].gd.handle_controlevent = Prob_TextChanged; + rgcd[2].data = (void *) CID_AdvanceWidth; + rgcd[2].creator = GTextFieldCreate; + + rlabel[3].text = (unichar_t *) _STR_AdvanceVWidth; + rlabel[3].text_in_resource = true; + rgcd[3].gd.label = &rlabel[3]; + rgcd[3].gd.mnemonic = 'W'; + rgcd[3].gd.pos.x = 3; rgcd[3].gd.pos.y = rgcd[2].gd.pos.y+24; + rgcd[3].gd.flags = gg_visible | gg_enabled; + if ( !sf->hasvmetrics ) rgcd[3].gd.flags = gg_visible; + else if ( vadvancewidth ) rgcd[3].gd.flags |= gg_cb_on; + rgcd[3].gd.popup_msg = GStringGetResource(_STR_AdvanceVWidthPopup,NULL); + rgcd[3].gd.cid = CID_VAdvanceWidth; + rgcd[3].creator = GCheckBoxCreate; + + if ( vadvancewidth==0 ) vadvancewidth = sf->ascent+sf->descent; + sprintf(vawidthbuf,"%g",vadvancewidthval); + rlabel[4].text = (unichar_t *) vawidthbuf; + rlabel[4].text_is_1byte = true; + rgcd[4].gd.label = &rlabel[4]; + rgcd[4].gd.pos.x = 100+15; rgcd[4].gd.pos.y = rgcd[3].gd.pos.y-1; rgcd[4].gd.pos.width = 40; + rgcd[4].gd.flags = gg_visible | gg_enabled; + if ( !sf->hasvmetrics ) rgcd[4].gd.flags = gg_visible; + rgcd[4].gd.cid = CID_VAdvanceWidthVal; + rgcd[4].gd.handle_controlevent = Prob_TextChanged; + rgcd[4].data = (void *) CID_VAdvanceWidth; + rgcd[4].creator = GTextFieldCreate; + + rlabel[5].text = (unichar_t *) _STR_SubsToEmptyChar; + rlabel[5].text_in_resource = true; + rgcd[5].gd.label = &rlabel[5]; + rgcd[5].gd.pos.x = 3; rgcd[5].gd.pos.y = rgcd[4].gd.pos.y+24; + rgcd[5].gd.flags = gg_visible | gg_enabled; + if ( badsubs ) rgcd[5].gd.flags |= gg_cb_on; + rgcd[5].gd.popup_msg = GStringGetResource(_STR_SubsToEmptyCharPopup,NULL); + rgcd[5].gd.cid = CID_BadSubs; + rgcd[5].creator = GCheckBoxCreate; + +/* ************************************************************************** */ + + memset(&clabel,0,sizeof(clabel)); + memset(&cgcd,0,sizeof(cgcd)); + + clabel[0].text = (unichar_t *) _STR_CIDMultiple; + clabel[0].text_in_resource = true; + cgcd[0].gd.label = &clabel[0]; + cgcd[0].gd.mnemonic = 'S'; + cgcd[0].gd.pos.x = 3; cgcd[0].gd.pos.y = 6; + cgcd[0].gd.flags = gg_visible | gg_enabled; + if ( cidmultiple ) cgcd[0].gd.flags |= gg_cb_on; + cgcd[0].gd.popup_msg = GStringGetResource(_STR_CIDMultiplePopup,NULL); + cgcd[0].gd.cid = CID_CIDMultiple; + cgcd[0].creator = GCheckBoxCreate; + + clabel[1].text = (unichar_t *) _STR_CIDBlank; + clabel[1].text_in_resource = true; + cgcd[1].gd.label = &clabel[1]; + cgcd[1].gd.mnemonic = 'S'; + cgcd[1].gd.pos.x = 3; cgcd[1].gd.pos.y = cgcd[0].gd.pos.y+17; + cgcd[1].gd.flags = gg_visible | gg_enabled; + if ( cidblank ) cgcd[1].gd.flags |= gg_cb_on; + cgcd[1].gd.popup_msg = GStringGetResource(_STR_CIDBlankPopup,NULL); + cgcd[1].gd.cid = CID_CIDBlank; + cgcd[1].creator = GCheckBoxCreate; + +/* ************************************************************************** */ + + memset(&alabel,0,sizeof(alabel)); + memset(&agcd,0,sizeof(agcd)); + + alabel[0].text = (unichar_t *) _STR_MissingGlyph; + alabel[0].text_in_resource = true; + agcd[0].gd.label = &alabel[0]; + agcd[0].gd.pos.x = 3; agcd[0].gd.pos.y = 6; + agcd[0].gd.flags = gg_visible | gg_enabled; + if ( missingglyph ) agcd[0].gd.flags |= gg_cb_on; + agcd[0].gd.popup_msg = GStringGetResource(_STR_MissingGlyphPopup,NULL); + agcd[0].gd.cid = CID_MissingGlyph; + agcd[0].creator = GCheckBoxCreate; + + alabel[1].text = (unichar_t *) _STR_MissingLookupTag; + alabel[1].text_in_resource = true; + agcd[1].gd.label = &alabel[1]; + agcd[1].gd.pos.x = 3; agcd[1].gd.pos.y = agcd[0].gd.pos.y+17; + agcd[1].gd.flags = gg_visible | gg_enabled; + if ( missinglookuptag ) agcd[1].gd.flags |= gg_cb_on; + agcd[1].gd.popup_msg = GStringGetResource(_STR_MissingLookupTagPopup,NULL); + agcd[1].gd.cid = CID_MissingLookupTag; + agcd[1].creator = GCheckBoxCreate; + + alabel[2].text = (unichar_t *) _STR_UsedDFLTscript; + alabel[2].text_in_resource = true; + agcd[2].gd.label = &alabel[2]; + agcd[2].gd.pos.x = 3; agcd[2].gd.pos.y = agcd[1].gd.pos.y+17; + agcd[2].gd.flags = gg_visible | gg_enabled; + if ( DFLTscript ) agcd[2].gd.flags |= gg_cb_on; + agcd[2].gd.popup_msg = GStringGetResource(_STR_UsedDFLTscriptPopup,NULL); + agcd[2].gd.cid = CID_DFLTScript; + agcd[2].creator = GCheckBoxCreate; + +/* ************************************************************************** */ + + memset(&mlabel,0,sizeof(mlabel)); + memset(&mgcd,0,sizeof(mgcd)); + memset(aspects,0,sizeof(aspects)); + i = 0; + + aspects[i].text = (unichar_t *) _STR_PointsNoC; + aspects[i].selected = true; + aspects[i].text_in_resource = true; + aspects[i++].gcd = pgcd; + + aspects[i].text = (unichar_t *) _STR_Paths; + aspects[i].text_in_resource = true; + aspects[i++].gcd = pagcd; + + aspects[i].text = (unichar_t *) _STR_Refs; + aspects[i].text_in_resource = true; + aspects[i++].gcd = rfgcd; + + aspects[i].text = (unichar_t *) _STR_Hints; + aspects[i].text_in_resource = true; + aspects[i++].gcd = hgcd; + + aspects[i].text = (unichar_t *) _STR_ATT; + aspects[i].text_in_resource = true; + aspects[i++].gcd = agcd; + + aspects[i].text = (unichar_t *) _STR_CID; + aspects[i].disabled = fv->cidmaster==NULL; + aspects[i].text_in_resource = true; + aspects[i++].gcd = cgcd; + + aspects[i].text = (unichar_t *) _STR_Random; + aspects[i].text_in_resource = true; + aspects[i++].gcd = rgcd; + + mgcd[0].gd.pos.x = 4; mgcd[0].gd.pos.y = 6; + mgcd[0].gd.pos.width = 210; + mgcd[0].gd.pos.height = 190; + mgcd[0].gd.u.tabs = aspects; + mgcd[0].gd.flags = gg_visible | gg_enabled; + mgcd[0].creator = GTabSetCreate; + + mgcd[1].gd.pos.x = 15; mgcd[1].gd.pos.y = 190+10; + mgcd[1].gd.flags = gg_visible | gg_enabled | gg_dontcopybox; + mlabel[1].text = (unichar_t *) _STR_ClearAll; + mlabel[1].text_in_resource = true; + mgcd[1].gd.label = &mlabel[1]; + /*mgcd[1].gd.box = &smallbox;*/ + mgcd[1].gd.handle_controlevent = Prob_DoAll; + mgcd[2].gd.cid = CID_ClearAll; + mgcd[1].creator = GButtonCreate; + + mgcd[2].gd.pos.x = mgcd[1].gd.pos.x+1.25*GIntGetResource(_NUM_Buttonsize); + mgcd[2].gd.pos.y = mgcd[1].gd.pos.y; + mgcd[2].gd.flags = gg_visible | gg_enabled | gg_dontcopybox; + mlabel[2].text = (unichar_t *) _STR_SetAll; + mlabel[2].text_in_resource = true; + mgcd[2].gd.label = &mlabel[2]; + /*mgcd[2].gd.box = &smallbox;*/ + mgcd[2].gd.handle_controlevent = Prob_DoAll; + mgcd[2].gd.cid = CID_SetAll; + mgcd[2].creator = GButtonCreate; + + mgcd[3].gd.pos.x = 6; mgcd[3].gd.pos.y = mgcd[1].gd.pos.y+27; + mgcd[3].gd.pos.width = 218-12; + mgcd[3].gd.flags = gg_visible | gg_enabled; + mgcd[3].creator = GLineCreate; + + mlabel[4].text = (unichar_t *) _STR_PointsNear; + mlabel[4].text_in_resource = true; + mgcd[4].gd.label = &mlabel[4]; + mgcd[4].gd.mnemonic = 'N'; + mgcd[4].gd.pos.x = 6; mgcd[4].gd.pos.y = mgcd[3].gd.pos.y+6+6; + mgcd[4].gd.flags = gg_visible | gg_enabled; + mgcd[4].creator = GLabelCreate; + + sprintf(nearbuf,"%g",near); + mlabel[5].text = (unichar_t *) nearbuf; + mlabel[5].text_is_1byte = true; + mgcd[5].gd.label = &mlabel[5]; + mgcd[5].gd.pos.x = 130; mgcd[5].gd.pos.y = mgcd[4].gd.pos.y-6; mgcd[5].gd.pos.width = 40; + mgcd[5].gd.flags = gg_visible | gg_enabled; + mgcd[5].gd.cid = CID_Near; + mgcd[5].creator = GTextFieldCreate; + + mlabel[6].text = (unichar_t *) _STR_EmUnits; + mlabel[6].text_in_resource = true; + mgcd[6].gd.label = &mlabel[6]; + mgcd[6].gd.pos.x = mgcd[5].gd.pos.x+mgcd[5].gd.pos.width+4; mgcd[6].gd.pos.y = mgcd[4].gd.pos.y; + mgcd[6].gd.flags = gg_visible | gg_enabled; + mgcd[6].creator = GLabelCreate; + + mgcd[7].gd.pos.x = 15-3; mgcd[7].gd.pos.y = mgcd[5].gd.pos.y+26; + mgcd[7].gd.pos.width = -1; mgcd[7].gd.pos.height = 0; + mgcd[7].gd.flags = gg_visible | gg_enabled | gg_but_default; + mlabel[7].text = (unichar_t *) _STR_OK; + mlabel[7].text_in_resource = true; + mgcd[7].gd.mnemonic = 'O'; + mgcd[7].gd.label = &mlabel[7]; + mgcd[7].gd.handle_controlevent = Prob_OK; + mgcd[7].creator = GButtonCreate; + + mgcd[8].gd.pos.x = -15; mgcd[8].gd.pos.y = mgcd[7].gd.pos.y+3; + mgcd[8].gd.pos.width = -1; mgcd[8].gd.pos.height = 0; + mgcd[8].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + mlabel[8].text = (unichar_t *) _STR_Cancel; + mlabel[8].text_in_resource = true; + mgcd[8].gd.label = &mlabel[8]; + mgcd[8].gd.mnemonic = 'C'; + mgcd[8].gd.handle_controlevent = Prob_Cancel; + mgcd[8].creator = GButtonCreate; + + mgcd[9].gd.pos.x = 2; mgcd[9].gd.pos.y = 2; + mgcd[9].gd.pos.width = pos.width-4; mgcd[9].gd.pos.height = pos.height-2; + mgcd[9].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + mgcd[9].creator = GGroupCreate; + + GGadgetsCreate(gw,mgcd); + + GDrawSetVisible(gw,true); + while ( !p.done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); + if ( p.explainw!=NULL ) + GDrawDestroyWindow(p.explainw); +} diff --git a/fontforge/psfont.h b/fontforge/psfont.h new file mode 100644 index 00000000..c8850e28 --- /dev/null +++ b/fontforge/psfont.h @@ -0,0 +1,184 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _PSFONT_H_ +#define _PSFONT_H_ + +#include "splinefont.h" + +/* pfb section headers. + There seem to be three and a half of them. the first is a the start of the + file and is 6 bytes long "\200\001x\005\000\000", the second is right after + the newline after eexec and is 6 bytes "\200\002I\224\000\000", the third + is right before the zeros (after the encoded data) and is "\200\001\024\002\000\000" + the last is at the end of file and is only two bytes "\200\003" + I think that the \200 byte indicates a header, the next byte is 1 for ascii, + 2 for binary and 3 for eof, then next 4 bytes are the length (not present + for eof headers) with the first byte the least significant. +*/ + +struct charprocs { + int cnt, next; + char **keys; + SplineChar **values; +}; + +struct fontinfo { + char *familyname; + char *fullname; + char *notice; + char *weight; + char *version; + real italicangle; + unsigned int isfixedpitch:1; + real underlineposition; + real underlinethickness; + int em, ascent, descent; /* Generated by Fontographer (and us) */ + int fstype; /* 2=>no embedding, 4=>print, 8=>edit */ + /* Multiple master */ + char *blenddesignpositions; + char *blenddesignmap; + char *blendaxistypes; +}; + +struct private { + struct psdict *private; + struct pschars *subrs; /* (optional, required if othersubrs is present) */ + /* 0-2 part of Flex, 3 hint replacement, 4 and up for charstrings */ + int leniv; /* (optional) must be 4 for old interpreters (number of rand chars at start of charstrings entries) */ +#if 0 + int bluefuzz; /* (optional) (expand bluezones by this much, def=1) */ + real bluescale; /* (optional) if the current pointsize in pixels is less than this value then do overshoot hinting */ + int blueshift; /* (optional) */ + real bluevalues[14]; /* <=7 pairs of integers, first less than second, (may be empty) */ + /* first pair is baseline overshoots, other pairs above baseline */ + real expansionfactor; /* (optional) only for languagegroup==1 (CJK) */ + real familyblues[14]; /* (optional) bluevalues for family, can override local entry at small pointsizes */ + real familyotherblues[10];/* (optional) otherblues for family */ + unsigned int forcebold:1; /* (optional) */ + int languagegroup; /* (optional) (0=>latin, greek, cyril, etc.), (1=>CJK)*/ + int leniv; /* (optional) must be 4 for old interpreters (number of rand chars at start of charstrings entries) */ + char *minfeature; /* obsolete, required must be {16 16} */ + char *nd; /* "noaccess def" (may also be named "|-") */ + char *np; /* "noaccess put" (may also be named "|") */ + real otherblues[10]; /* (optional) descender blue zones */ + struct pschars *othersubrs; /* (optional) shouldn't contain user defined subs */ + int password; /* obsolete, required must be 5839 */ + char *rd; /* "{string currentfile exch readstring pop}" (may also be named "-|") */ + unsigned int rndstemup:1; /* (optional) obsolete, false if languagegroud==1 */ + real stdhw[1]; /* (optional) dominant horizontal stem width */ + real stdvw[1]; /* (optional) dominant vert */ + real stemsnaph[12]; /* (optional) common h stem widths (at most 12, includes stdhw, sorted by increasing size) */ + real stemsnapv[12]; /* (optional) common v stem widths*/ + struct pschars *subrs; /* (optional, required if othersubrs is present) */ + /* 0-2 part of Flex, 3 hint replacement, 4 and up for charstrings */ + int uniqueid; /* (optional) seems same as fontdict entry. why's it here too? what of XUID? */ +/* CID entries */ + int subrmapoffset; /* Offset to the start of this font's subr strings map */ + int sdbytes; /* bytes in each pointer in the map */ + int subrcnt; /* number of subroutines, number of pointers-1 in the map */ +#endif +}; + +typedef struct fontdict { + int fonttype; + real fontmatrix[6]; + char *fontname; /* (optional) */ + struct fontinfo *fontinfo; + int languagelevel; /* (optional) */ + int wmode; /* (optional) chooses between alternate metric sets */ +/* non-type0 entries */ + char *encoding[256]; + real fontbb[4]; + int uniqueid; /* (optional) open range between 4,000,000 and 4,999,999 */ + int xuid[20]; /* (optional) */ +/* Type1 specific values */ + int painttype; /* 0 (filled) 2 (stroked) */ + real strokewidth; /* (optional) only if painttype==2 */ + struct psdict *metrics; /* (optional) */ + struct psdict *metrics2; /* (optional) */ + struct pschars *chars; + struct charprocs *charprocs; + struct private *private; + unsigned int wasbinary: 1; + unsigned int wascff: 1; + enum charset encoding_name; +/* CID stuff */ + int fdcnt; /* For the underlying dictionaries */ + struct fontdict **fds; + char *cidfontname; + int cidfonttype; + real cidversion; + char *registry; + char *ordering; + int supplement; + int mapoffset; + int fdbytes; + int gdbytes; + int cidcnt; + uint8 **cidstrs; + int16 *cidlens; + int16 *cidfds; +/* CFF stuff */ + struct splinefont *sf; +/* MM stuff */ + char *blendfunc; + char *weightvector; + char *cdv; + char *ndv; + struct psdict *blendprivate; + struct psdict *blendfontinfo; +} FontDict; + +struct cidbytes { + int fdbytes, gdbytes, cidcnt; + int cidmapoffset; + int fdcnt; + struct fddata { + int leniv; + int subrmapoff, sdbytes, subrcnt; + int flexmax; + unsigned int iscjk:1; + struct pschars *subrs; + } *fds; + int *fdind; + int errors; +}; + +struct fd2data { + int defwid, nomwid; /* For Type2 charstrings */ + struct pschars *subrs; + FILE *private; /* Subroutines get stored in the private file immediately after the private dict */ + int eodictmark, fillindictmark; + int privatelen; +}; + +extern char *AdobeStandardEncoding[256]; + +extern FontDict *_ReadPSFont(FILE *ps); +extern FontDict *ReadPSFont(char *fontname); +extern void PSFontFree(FontDict *fd); +#endif diff --git a/fontforge/psread.c b/fontforge/psread.c new file mode 100644 index 00000000..990fa5ed --- /dev/null +++ b/fontforge/psread.c @@ -0,0 +1,3599 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include "psfont.h" +#include "sd.h" + +/* This is not a "real" structure. It is a temporary hack that encompasses */ +/* various possibilities, the combination of which won't occur in reality */ +typedef struct entitychar { + Entity *splines; + RefChar *refs; + int width; + SplineChar *sc; +} EntityChar; + +typedef struct _io { + char *macro, *start; + FILE *ps; + int backedup, cnt; + struct _io *prev; +} _IO; + +typedef struct io { + struct _io *top; +} IO; + +typedef struct growbuf { + char *pt; + char *base; + char *end; +} GrowBuf; + +static void GrowBuffer(GrowBuf *gb,int len) { + if ( len<400 ) len = 400; + if ( gb->base==NULL ) { + gb->base = gb->pt = galloc(len); + gb->end = gb->base + len; + } else { + int off = gb->pt-gb->base; + len += (gb->end-gb->base); + gb->base = grealloc(gb->base,len); + gb->end = gb->base + len; + gb->pt = gb->base+off; + } +} + +static void AddTok(GrowBuf *gb,char *buf,int islit) { + int len = islit + strlen(buf) + 1; + + if ( gb->pt+len+1 >= gb->end ) + GrowBuffer(gb,len+1); + if ( islit ) + *(gb->pt++) = '/'; + strcpy(gb->pt,buf); + gb->pt += strlen(buf); + *gb->pt++ = ' '; +} + +/**************************** Postscript Importer *****************************/ +/* It's really dumb. It ignores almost everything except linetos and curvetos */ +/* anything else, function calls, ... is thrown out, if this breaks a lineto */ +/* or curveto or moveto (if there aren't enough things on the stack) then we */ +/* ignore that too */ + +enum pstoks { pt_eof=-1, pt_moveto, pt_rmoveto, pt_curveto, pt_rcurveto, + pt_lineto, pt_rlineto, pt_arc, pt_arcn, pt_arct, pt_arcto, + pt_newpath, pt_closepath, pt_dup, pt_pop, pt_index, + pt_exch, pt_roll, pt_clear, pt_copy, pt_count, + pt_setcachedevice, pt_setcharwidth, + pt_translate, pt_scale, pt_rotate, pt_concat, pt_end, pt_exec, + pt_add, pt_sub, pt_mul, pt_div, pt_idiv, pt_mod, pt_neg, + pt_abs, pt_round, pt_ceiling, pt_floor, pt_truncate, pt_max, pt_min, + pt_ne, pt_eq, pt_gt, pt_ge, pt_lt, pt_le, pt_and, pt_or, pt_xor, pt_not, + pt_true, pt_false, + pt_if, pt_ifelse, pt_for, + pt_def, pt_bind, pt_load, + pt_setlinecap, pt_setlinejoin, pt_setlinewidth, + pt_currentlinecap, pt_currentlinejoin, pt_currentlinewidth, + pt_setgray, pt_currentgray, pt_sethsbcolor, pt_currenthsbcolor, + pt_setrgbcolor, pt_currentrgbcolor, pt_setcmykcolor, pt_currentcmykcolor, + pt_fill, pt_stroke, + + pt_transform, pt_itransform, pt_dtransform, pt_idtransform, + + /* things we sort of pretend to do, but actually do something wrong */ + pt_gsave, pt_grestore, pt_save, pt_restore, pt_currentmatrix, pt_setmatrix, + pt_setmiterlimit, pt_setdash, + + pt_mark, pt_counttomark, pt_cleartomark, pt_array, pt_aload, pt_astore, + pt_print, pt_cvi, pt_cvlit, pt_cvn, pt_cvr, pt_cvrs, pt_cvs, pt_cvx, pt_stringop, + + pt_opencurly, pt_closecurly, pt_openarray, pt_closearray, pt_string, + pt_number, pt_unknown, pt_namelit, pt_output, pt_outputd }; + +char *toknames[] = { "moveto", "rmoveto", "curveto", "rcurveto", + "lineto", "rlineto", "arc", "arcn", "arct", "arcto", + "newpath", "closepath", "dup", "pop", "index", + "exch", "roll", "clear", "copy", "count", + "setcachedevice", "setcharwidth", + "translate", "scale", "rotate", "concat", "end", "exec", + "add", "sub", "mul", "div", "idiv", "mod", "neg", + "abs", "round", "ceiling", "floor", "truncate", "max", "min", + "ne", "eq", "gt", "ge", "lt", "le", "and", "or", "xor", "not", + "true", "false", + "if", "ifelse", "for", + "def", "bind", "load", + "setlinecap", "setlinejoin", "setlinewidth", + "currentlinecap", "currentlinejoin", "currentlinewidth", + "setgray", "currentgray", "sethsbcolor", "currenthsbcolor", + "setrgbcolor", "currentrgbcolor", "setcmykcolor", "currentcmykcolor", + "fill", "stroke", + + "transform", "itransform", "dtransform", "idtransform", + + "gsave", "grestore", "save", "restore", "currentmatrix", "setmatrix", + "setmiterlimit", "setdash", + + "mark", "counttomark", "cleartomark", "array", "aload", "astore", + "print", "cvi", "cvlit", "cvn", "cvr", "cvrs", "cvs", "cvx", "string", + + "opencurly", "closecurly", "openarray", "closearray", "string", + "number", "unknown", "namelit", "=", "==", + + NULL }; + +/* length (of string) + sqrt sin ... + fill eofill stroke + gsave grestore +*/ + +static int nextch(IO *wrapper) { + int ch; + _IO *io = wrapper->top; + + while ( io!=NULL ) { + if ( io->backedup!=EOF ) { + ch = io->backedup; + io->backedup = EOF; +return( ch ); + } else if ( io->ps!=NULL ) { + if ( (ch = getc(io->ps))!=EOF ) +return( ch ); + } else { + if ( (ch = *(io->macro++))!='\0' ) +return( ch ); + if ( --io->cnt>0 ) { + io->macro = io->start; +return( nextch(wrapper)); + } + } + wrapper->top = io->prev; + free(io->start); + free(io); + io = wrapper->top; + } +return( EOF ); +} + +static void unnextch(int ch,IO *wrapper) { + if ( ch==EOF ) +return; + if ( wrapper->top==NULL ) + fprintf( stderr, "Can't back up with nothing on stack\n" ); + else if ( wrapper->top->backedup!=EOF ) + fprintf( stderr, "Attempt to back up twice\n" ); + else + wrapper->top->backedup = ch; +} + +static void pushio(IO *wrapper, FILE *ps, char *macro, int cnt) { + _IO *io = galloc(sizeof(_IO)); + + io->prev = wrapper->top; + io->ps = ps; + io->macro = io->start = copy(macro); + io->backedup = EOF; + io->cnt = cnt; + wrapper->top = io; +} + +static int nextpstoken(IO *wrapper, real *val, char *tokbuf, int tbsize) { + int ch, r, i; + char *pt, *end; + + /* Eat whitespace and comments. Comments last to eol (or formfeed) */ + while ( 1 ) { + while ( isspace(ch = nextch(wrapper)) ); + if ( ch!='%' ) + break; + while ( (ch=nextch(wrapper))!=EOF && ch!='\r' && ch!='\n' && ch!='\f' ); + } + + if ( ch==EOF ) +return( pt_eof ); + + pt = tokbuf; + end = pt+tbsize-1; + *pt++ = ch; *pt='\0'; + + if ( ch=='(' ) { + int nest=1, quote=0; + while ( (ch=nextch(wrapper))!=EOF ) { + if ( pt' ) + /* Done */; + else if ( ch!='~' ) { + while ( (ch=nextch(wrapper))!=EOF && ch!='>' ) + if ( pt' ) + break; + else twiddle = 0; + } + } + *pt='\0'; +return( pt_string ); + } else if ( ch==')' || ch=='>' || ch=='[' || ch==']' || ch=='{' || ch=='}' ) { + if ( ch=='{' ) +return( pt_opencurly ); + else if ( ch=='}' ) +return( pt_closecurly ); + if ( ch=='[' ) +return( pt_openarray ); + else if ( ch==']' ) +return( pt_closearray ); + +return( pt_unknown ); /* single character token */ + } else if ( ch=='/' ) { + pt = tokbuf; + while ( (ch=nextch(wrapper))!=EOF && !isspace(ch) && ch!='%' && + ch!='(' && ch!=')' && ch!='<' && ch!='>' && ch!='[' && ch!=']' && + ch!='{' && ch!='}' && ch!='/' ) + if ( ptx = trans[0]*from->x+trans[2]*from->y+trans[4]; + to->y = trans[1]*from->x+trans[3]*from->y+trans[5]; +} + +void MatMultiply(real m1[6], real m2[6], real to[6]) { + real trans[6]; + + trans[0] = m1[0]*m2[0] + + m1[1]*m2[2]; + trans[1] = m1[0]*m2[1] + + m1[1]*m2[3]; + trans[2] = m1[2]*m2[0] + + m1[3]*m2[2]; + trans[3] = m1[2]*m2[1] + + m1[3]*m2[3]; + trans[4] = m1[4]*m2[0] + + m1[5]*m2[2] + + m2[4]; + trans[5] = m1[4]*m2[1] + + m1[5]*m2[3] + + m2[5]; + memcpy(to,trans,sizeof(trans)); +} + +void MatInverse(real into[6], real orig[6]) { + real det = orig[0]*orig[3] - orig[1]*orig[2]; + + if ( det==0 ) { + fprintf(stderr, "Attempt to invert a singular matrix\n" ); + memset(into,0,sizeof(*into)); + } else { + into[0] = orig[3]/det; + into[1] = -orig[1]/det; + into[2] = -orig[2]/det; + into[3] = orig[0]/det; + into[4] = -orig[4]; + into[5] = -orig[5]; + } +} + +static void ECCatagorizePoints( EntityChar *ec ) { + Entity *ent; + + for ( ent=ec->splines; ent!=NULL; ent=ent->next ) if ( ent->type == et_splines ) { + SPLCatagorizePoints( ent->u.splines.splines ); + } +} + +struct pskeydict { + int16 cnt, max; + uint8 is_executable; + struct pskeyval *entries; +}; + +struct psstack { + enum pstype { ps_void, ps_num, ps_bool, ps_string, ps_instr, ps_lit, + ps_mark, ps_array, ps_dict } type; + union vals { + real val; + int tf; + char *str; + struct pskeydict dict; /* and for arrays too */ + } u; +}; + +struct pskeyval { + enum pstype type; + union vals u; + char *key; +}; + +typedef struct retstack { + int max; + int cnt; + real *stack; +} RetStack; + +static int AddEntry(struct pskeydict *dict,struct psstack *stack, int sp) { + int i; + + if ( dict->cnt>=dict->max ) { + if ( dict->cnt==0 ) { + dict->max = 30; + dict->entries = galloc(dict->max*sizeof(struct pskeyval)); + } else { + dict->max += 30; + dict->entries = grealloc(dict->entries,dict->max*sizeof(struct pskeyval)); + } + } + if ( sp<2 ) +return(sp); + if ( stack[sp-2].type!=ps_string && stack[sp-2].type!=ps_lit ) { + fprintf( stderr, "Key for a def must be a string or name literal\n" ); +return(sp-2); + } + for ( i=0; icnt; ++i ) + if ( strcmp(dict->entries[i].key,stack[sp-2].u.str)==0 ) + break; + if ( i!=dict->cnt ) { + free(stack[sp-2].u.str); + if ( dict->entries[i].type==ps_string || dict->entries[i].type==ps_instr || + dict->entries[i].type==ps_lit ) + free(dict->entries[i].u.str); + } else { + memset(&dict->entries[i],'\0',sizeof(struct pskeyval)); + dict->entries[i].key = stack[sp-2].u.str; + ++dict->cnt; + } + dict->entries[i].type = stack[sp-1].type; + dict->entries[i].u = stack[sp-1].u; +return(sp-2); +} + +static int rollstack(struct psstack *stack, int sp) { + int n,j,i; + struct psstack *temp; + + if ( sp>1 ) { + n = stack[sp-2].u.val; + j = stack[sp-1].u.val; + sp-=2; + if ( sp>=n && n>0 ) { + j %= n; + if ( j<0 ) j += n; + temp = galloc(n*sizeof(struct psstack)); + for ( i=0; ime,&temp,transform); + cp.x = temp.x-cplen*s2; cp.y = temp.y + cplen*c2; + if ( (cp.x-base.x)*(cp.x-base.x)+(cp.y-base.y)*(cp.y-base.y) > + (temp.x-base.x)*(temp.x-base.x)+(temp.y-base.y)*(temp.y-base.y) ) { + sign = -1; + cp.x = temp.x+cplen*s2; cp.y = temp.y - cplen*c2; + } + Transform(&pt->prevcp,&cp,transform); + pt->nonextcp = true; + cp.x = base.x + sign*cplen*s1; cp.y = base.y - sign*cplen*c1; + Transform(&cur->last->nextcp,&cp,transform); + cur->last->nonextcp = false; + SplineMake3(cur->last,pt); + cur->last = pt; +} + +static void circlearcsto(real a1, real a2, real cx, real cy, real r, + SplineSet *cur, real *transform, int clockwise ) { + int a; + real last; + + while ( a1<0 ) a1 += 360; while ( a2<0 ) a2 += 360; + while ( a1>=360 ) a1 -= 360; while ( a2>=360 ) a2 -= 360; + if ( !clockwise ) { + if ( a1>a2 ) + a2 += 360; + last = a1; + for ( a=((int) (a1+90)/90)*90; aa1 ) + a1 += 360; + last = a1; + for ( a=((int) (a1-90)/90)*90+90; a>a2; a -= 90 ) { + circlearcto(last,a,cx,cy,r,cur,transform); + last = a; + } + circlearcto(last,a2,cx,cy,r,cur,transform); + } +} + +static struct pskeyval *lookup(struct pskeydict *dict,char *tokbuf) { + int i; + + for ( i=0; icnt; ++i ) + if ( strcmp(dict->entries[i].key,tokbuf)==0 ) +return( &dict->entries[i] ); + +return( NULL ); +} + +static void dictfree(struct pskeydict *dict) { + int i; + + for ( i=0; icnt; ++i ) { + if ( dict->entries[i].type==ps_string || dict->entries[i].type==ps_instr || + dict->entries[i].type==ps_lit ) + free(dict->entries[i].u.str); + else if ( dict->entries[i].type==ps_array || dict->entries[i].type==ps_dict ) + dictfree(&dict->entries[i].u.dict); + } +} + +static void copyarray(struct pskeydict *to,struct pskeydict *from) { + int i; + struct pskeyval *oldent = from->entries; + + *to = *from; + to->entries = gcalloc(to->cnt,sizeof(struct pskeyval)); + for ( i=0; icnt; ++i ) { + to->entries[i] = oldent[i]; + if ( to->entries[i].type==ps_string || to->entries[i].type==ps_instr || + to->entries[i].type==ps_lit ) + to->entries[i].u.str = copy(to->entries[i].u.str); + else if ( to->entries[i].type==ps_array || to->entries[i].type==ps_dict ) + copyarray(&to->entries[i].u.dict,&oldent[i].u.dict); + } +} + +static int aload(int sp, struct psstack *stack,int stacktop) { + int i; + + if ( sp>=1 && stack[sp-1].type==ps_array ) { + struct pskeydict dict; + --sp; + dict = stack[sp].u.dict; + for ( i=0; icnt; ++i ) { + switch ( dict->entries[i].type ) { + case ps_num: + printf( "%g", dict->entries[i].u.val ); + break; + case ps_bool: + printf( "%s", dict->entries[i].u.tf ? "true" : "false" ); + break; + case ps_string: case ps_instr: case ps_lit: + printf( dict->entries[i].type==ps_lit ? "/" : + dict->entries[i].type==ps_string ? "(" : "{" ); + printf( "%s", dict->entries[i].u.str ); + printf( dict->entries[i].type==ps_lit ? "" : + dict->entries[i].type==ps_string ? ")" : "}" ); + break; + case ps_array: + printarray(&dict->entries[i].u.dict); + break; + case ps_void: + printf( "-- void --" ); + break; + default: + printf( "-- nostringval --" ); + break; + } + printf(" "); + } + printf( "]" ); +} + +static void freestuff(struct psstack *stack, int sp, struct pskeydict *dict, GrowBuf *gb) { + int i; + + free(gb->base); + for ( i=0; icnt; ++i ) { + if ( dict->entries[i].type==ps_string || dict->entries[i].type==ps_instr || + dict->entries[i].type==ps_lit ) + free(dict->entries[i].u.str); + free(dict->entries[i].key); + } + free( dict->entries ); + for ( i=0; i=3 ) { + stack[sp-1].u.dict.entries[5].u.val += stack[sp-3].u.val*t[0]+stack[sp-2].u.val*t[2]; + stack[sp-1].u.dict.entries[4].u.val += stack[sp-3].u.val*t[1]+stack[sp-2].u.val*t[3]; + nsp = sp-2; + } + break; + case pt_scale: + if ( sp>=2 ) { + stack[sp-1].u.dict.entries[0].u.val *= stack[sp-3].u.val; + stack[sp-1].u.dict.entries[1].u.val *= stack[sp-3].u.val; + stack[sp-1].u.dict.entries[2].u.val *= stack[sp-2].u.val; + stack[sp-1].u.dict.entries[3].u.val *= stack[sp-2].u.val; + /* transform[4,5] are unchanged */ + nsp = sp-2; + } + break; + case pt_rotate: + if ( sp>=1 ) { + --sp; + temp[0] = temp[3] = cos(stack[sp].u.val); + temp[1] = sin(stack[sp].u.val); + temp[2] = -temp[1]; + temp[4] = temp[5] = 0; + MatMultiply(temp,t,t); + stack[sp-1].u.dict.entries[5].u.val = t[5]; + stack[sp-1].u.dict.entries[4].u.val = t[4]; + stack[sp-1].u.dict.entries[3].u.val = t[3]; + stack[sp-1].u.dict.entries[2].u.val = t[2]; + stack[sp-1].u.dict.entries[1].u.val = t[1]; + stack[sp-1].u.dict.entries[0].u.val = t[0]; + nsp = sp-1; + } + break; + } + stack[nsp-1] = stack[sp-1]; + } +return(nsp); +} + +static Entity *EntityCreate(SplinePointList *head,int linecap,int linejoin, + real linewidth, real *transform) { + Entity *ent = gcalloc(1,sizeof(Entity)); + ent->type = et_splines; + ent->u.splines.splines = head; + ent->u.splines.cap = linecap; + ent->u.splines.join = linejoin; + ent->u.splines.stroke_width = linewidth; + ent->u.splines.fill.col = 0xffffffff; + ent->u.splines.stroke.col = 0xffffffff; + ent->u.splines.fill.opacity = 1.0; + ent->u.splines.stroke.opacity = 1.0; + memcpy(ent->u.splines.transform,transform,6*sizeof(real)); +return( ent ); +} + +static void InterpretPS(FILE *ps, char *psstr, EntityChar *ec, RetStack *rs) { + SplinePointList *cur=NULL, *head=NULL; + BasePoint current, temp; + int tok, i, j; + struct psstack stack[100]; + real dval; + int sp=0; + SplinePoint *pt; + RefChar *ref, *lastref=NULL; + real transform[6], t[6]; + struct graphicsstate { + real transform[6]; + BasePoint current; + real linewidth; + int linecap, linejoin; + Color fore; + } gsaves[30]; + int gsp = 0; + int ccnt=0; + char tokbuf[100]; + IO wrapper; + GrowBuf gb; + struct pskeydict dict; + struct pskeyval *kv; + Color fore=COLOR_INHERITED; + int linecap=lc_inherited, linejoin=lj_inherited; real linewidth=WIDTH_INHERITED; + Entity *ent; + char *oldloc; + int warned = 0; + + oldloc = setlocale(LC_NUMERIC,"C"); + + wrapper.top = NULL; + pushio(&wrapper,ps,psstr,1); + + memset(&gb,'\0',sizeof(GrowBuf)); + memset(&dict,'\0',sizeof(dict)); + + memset(ec,'\0',sizeof(EntityChar)); + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[4] = transform[5] = 0; + current.x = current.y = 0; + + while ( (tok = nextpstoken(&wrapper,&dval,tokbuf,sizeof(tokbuf)))!=pt_eof ) { + if ( ccnt>0 ) { + if ( tok==pt_closecurly ) + --ccnt; + else if ( tok==pt_opencurly ) + ++ccnt; + if ( ccnt>0 ) + AddTok(&gb,tokbuf,tok==pt_namelit); + else { + if ( sptype == ps_instr ) + pushio(&wrapper,NULL,copy(kv->u.str),1); + else if ( sptype; + stack[sp++].u = kv->u; + if ( kv->type==ps_instr || kv->type==ps_lit || kv->type==ps_string ) + stack[sp-1].u.str = copy(stack[sp-1].u.str); + else if ( kv->type==ps_array || kv->type==ps_dict ) { + copyarray(&stack[sp-1].u.dict,&stack[sp-1].u.dict); + if ( stack[sp-1].u.dict.is_executable ) + sp = aload(sp,stack,sizeof(stack)/sizeof(stack[0])); + } + } + } else { +#if 0 /* /ps{count /foo exch def count copy foo array astore ==}def */ + /* printstack */ +int ii; +for ( ii=0; ii0 ) { + --sp; + if ( stack[sp].type==ps_string || stack[sp].type==ps_instr || + stack[sp].type==ps_lit ) + free(stack[sp].u.str); + else if ( stack[sp].type==ps_array || stack[sp].type==ps_dict ) + dictfree(&stack[sp].u.dict); + } + break; + case pt_clear: + while ( sp>0 ) { + --sp; + if ( stack[sp].type==ps_string || stack[sp].type==ps_instr || + stack[sp].type==ps_lit ) + free(stack[sp].u.str); + else if ( stack[sp].type==ps_array || stack[sp].type==ps_dict ) + dictfree(&stack[sp].u.dict); + } + break; + case pt_dup: + if ( sp>0 && sp0 ) { + int n = stack[--sp].u.val; + if ( n+sp1 ) { + struct psstack temp; + temp = stack[sp-1]; + stack[sp-1] = stack[sp-2]; + stack[sp-2] = temp; + } + break; + case pt_roll: + sp = rollstack(stack,sp); + break; + case pt_index: + if ( sp>0 ) { + i = stack[--sp].u.val; + if ( sp>=i && i>=0 ) { + stack[sp] = stack[sp-i-1]; + if ( stack[sp].type==ps_string || stack[sp].type==ps_instr || + stack[sp].type==ps_lit ) + stack[sp].u.str = copy(stack[sp].u.str); + /* The following is incorrect behavior, but as I don't do garbage collection */ + /* and I'm not going to implement reference counts, this will work in most cases */ + else if ( stack[sp].type==ps_array ) + copyarray(&stack[sp].u.dict,&stack[sp].u.dict); + ++sp; + } + } + break; + case pt_add: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + stack[sp-2].u.val += stack[sp-1].u.val; + --sp; + } + break; + case pt_sub: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + stack[sp-2].u.val -= stack[sp-1].u.val; + --sp; + } + break; + case pt_mul: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + stack[sp-2].u.val *= stack[sp-1].u.val; + --sp; + } + break; + case pt_div: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + stack[sp-2].u.val /= stack[sp-1].u.val; + --sp; + } + break; + case pt_idiv: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + stack[sp-2].u.val = ((int) stack[sp-2].u.val) / ((int) stack[sp-1].u.val); + --sp; + } + break; + case pt_mod: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + stack[sp-2].u.val = ((int) stack[sp-2].u.val) % ((int) stack[sp-1].u.val); + --sp; + } + break; + case pt_max: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + if ( stack[sp-2].u.val < stack[sp-1].u.val ) + stack[sp-2].u.val = stack[sp-1].u.val; + --sp; + } + break; + case pt_min: + if ( sp>=2 && stack[sp-1].type==ps_num && stack[sp-2].type==ps_num ) { + if ( stack[sp-2].u.val > stack[sp-1].u.val ) + stack[sp-2].u.val = stack[sp-1].u.val; + --sp; + } + break; + case pt_neg: + if ( sp>=1 ) { + if ( stack[sp-1].type == ps_num ) + stack[sp-1].u.val = -stack[sp-1].u.val; + } + break; + case pt_abs: + if ( sp>=1 ) { + if ( stack[sp-1].type == ps_num ) + if ( stack[sp-1].u.val < 0 ) + stack[sp-1].u.val = -stack[sp-1].u.val; + } + break; + case pt_round: + if ( sp>=1 ) { + if ( stack[sp-1].type == ps_num ) + stack[sp-1].u.val = rint(stack[sp-1].u.val); + /* rint isn't quite right, round will take 6.5 to 7, 5.5 to 6, etc. while rint() will take both to 6 */ + } + break; + case pt_floor: + if ( sp>=1 ) { + if ( stack[sp-1].type == ps_num ) + stack[sp-1].u.val = floor(stack[sp-1].u.val); + } + break; + case pt_ceiling: + if ( sp>=1 ) { + if ( stack[sp-1].type == ps_num ) + stack[sp-1].u.val = ceil(stack[sp-1].u.val); + } + break; + case pt_truncate: + if ( sp>=1 ) { + if ( stack[sp-1].type == ps_num ) { + if ( stack[sp-1].u.val<0 ) + stack[sp-1].u.val = ceil(stack[sp-1].u.val); + else + stack[sp-1].u.val = floor(stack[sp-1].u.val); + } + } + break; + case pt_ne: case pt_eq: + if ( sp>=2 ) { + if ( stack[sp-2].type!=stack[sp-1].type ) + stack[sp-2].u.tf = false; + else if ( stack[sp-2].type==ps_num ) + stack[sp-2].u.tf = (stack[sp-2].u.val == stack[sp-1].u.val); + else if ( stack[sp-2].type==ps_bool ) + stack[sp-2].u.tf = (stack[sp-2].u.tf == stack[sp-1].u.tf); + else + stack[sp-2].u.tf = strcmp(stack[sp-2].u.str,stack[sp-1].u.str)==0 ; + stack[sp-2].type = ps_bool; + if ( tok==pt_ne ) stack[sp-2].u.tf = !stack[sp-2].u.tf; + --sp; + } + break; + case pt_gt: case pt_le: case pt_lt: case pt_ge: + if ( sp>=2 ) { + if ( stack[sp-2].type!=stack[sp-1].type ) + stack[sp-2].u.tf = false; + else if ( stack[sp-2].type==ps_array ) + fprintf( stderr, "Can't compare arrays\n" ); + else { + int cmp; + if ( stack[sp-2].type==ps_num ) + cmp = (stack[sp-2].u.val > stack[sp-1].u.val)?1: + (stack[sp-2].u.val == stack[sp-1].u.val)?0:-1; + else if ( stack[sp-2].type==ps_bool ) + cmp = (stack[sp-2].u.tf - stack[sp-1].u.tf); + else + cmp = strcmp(stack[sp-2].u.str,stack[sp-1].u.str); + if ( tok==pt_gt ) + stack[sp-2].u.tf = cmp>0; + else if ( tok==pt_lt ) + stack[sp-2].u.tf = cmp<0; + else if ( tok==pt_le ) + stack[sp-2].u.tf = cmp<=0; + else + stack[sp-2].u.tf = cmp>=0; + } + stack[sp-2].type = ps_bool; + --sp; + } + break; + case pt_not: + if ( sp>=1 ) { + if ( stack[sp-1].type == ps_bool ) + stack[sp-1].u.tf = !stack[sp-1].u.tf; + } + break; + case pt_and: + if ( sp>=2 ) { + if ( stack[sp-2].type == ps_num ) + stack[sp-2].u.val = ((int) stack[sp-1].u.val) & (int) stack[sp-1].u.val; + else if ( stack[sp-2].type == ps_bool ) + stack[sp-2].u.tf &= stack[sp-1].u.tf; + --sp; + } + break; + case pt_or: + if ( sp>=2 ) { + if ( stack[sp-2].type == ps_num ) + stack[sp-2].u.val = ((int) stack[sp-1].u.val) | (int) stack[sp-1].u.val; + else if ( stack[sp-2].type == ps_bool ) + stack[sp-2].u.tf |= stack[sp-1].u.tf; + --sp; + } + break; + case pt_xor: + if ( sp>=2 ) { + if ( stack[sp-2].type == ps_num ) + stack[sp-2].u.val = ((int) stack[sp-1].u.val) ^ (int) stack[sp-1].u.val; + else if ( stack[sp-2].type == ps_bool ) + stack[sp-2].u.tf ^= stack[sp-1].u.tf; + --sp; + } + break; + case pt_if: + if ( sp>=2 ) { + if ( ((stack[sp-2].type == ps_bool && stack[sp-2].u.tf) || + (stack[sp-2].type == ps_num && strstr(stack[sp-1].u.str,"setcachedevice")!=NULL)) && + stack[sp-1].type==ps_instr ) + pushio(&wrapper,NULL,stack[sp-1].u.str,1); + if ( stack[sp-1].type==ps_string || stack[sp-1].type==ps_instr || stack[sp-1].type==ps_lit ) + free(stack[sp-1].u.str); + sp -= 2; + } else if ( sp==1 && stack[sp-1].type==ps_instr ) { + /*This can happen when reading our type3 fonts, we get passed */ + /* values on the stack which the interpreter knows nothing */ + /* about, but the interp needs to learn the width of the char */ + if ( strstr(stack[sp-1].u.str,"setcachedevice")!=NULL || + strstr(stack[sp-1].u.str,"setcharwidth")!=NULL ) + pushio(&wrapper,NULL,stack[sp-1].u.str,1); + free(stack[sp-1].u.str); + sp = 0; + } + break; + case pt_ifelse: + if ( sp>=3 ) { + if ( stack[sp-3].type == ps_bool && stack[sp-3].u.tf ) { + if ( stack[sp-2].type==ps_instr ) + pushio(&wrapper,NULL,stack[sp-2].u.str,1); + } else { + if ( stack[sp-1].type==ps_instr ) + pushio(&wrapper,NULL,stack[sp-1].u.str,1); + } + if ( stack[sp-1].type==ps_string || stack[sp-1].type==ps_instr || stack[sp-1].type==ps_lit ) + free(stack[sp-1].u.str); + if ( stack[sp-2].type==ps_string || stack[sp-2].type==ps_instr || stack[sp-2].type==ps_lit ) + free(stack[sp-2].u.str); + sp -= 3; + } + break; + case pt_for: + if ( sp>=4 ) { + real init, incr, limit; + char *func; + int cnt; + + if ( stack[sp-4].type == ps_num && stack[sp-3].type==ps_num && + stack[sp-2].type==ps_num && stack[sp-1].type==ps_instr ) { + init = stack[sp-4].u.val; + incr = stack[sp-3].u.val; + limit = stack[sp-2].u.val; + func = stack[sp-1].u.str; + sp -= 4; + cnt = 0; + if ( incr>0 ) { + while ( init<=limit ) { ++cnt; init += incr; } + } else if ( incr<0 ) { + while ( init>=limit ) { ++cnt; init += incr; } + } + pushio(&wrapper,NULL,func,cnt); + free(func); + } + } + break; + case pt_load: + if ( sp>=1 && stack[sp-1].type==ps_lit ) { + kv = lookup(&dict,stack[sp-1].u.str); + if ( kv!=NULL ) { + free( stack[sp-1].u.str ); + stack[sp-1].type = kv->type; + stack[sp-1].u = kv->u; + if ( kv->type==ps_instr || kv->type==ps_lit ) + stack[sp-1].u.str = copy(stack[sp-1].u.str); + } else + stack[sp-1].type = ps_instr; + } + break; + case pt_def: + sp = AddEntry(&dict,stack,sp); + break; + case pt_bind: + /* a noop in this context */ + break; + case pt_setcachedevice: + if ( sp>=6 ) { + ec->width = stack[sp-6].u.val; + /* I don't care about the bounding box */ + /* I don't support a "height" (ie. for CJK vertical spacing) */ + sp-=6; + } + break; + case pt_setcharwidth: + if ( sp>=1 ) + ec->width = stack[--sp].u.val; + break; + case pt_translate: + if ( sp>=1 && stack[sp-1].type==ps_array ) + sp = DoMatOp(tok,sp,stack); + else if ( sp>=2 ) { + transform[4] += stack[sp-2].u.val*transform[0]+stack[sp-1].u.val*transform[2]; + transform[5] += stack[sp-2].u.val*transform[1]+stack[sp-1].u.val*transform[3]; + sp -= 2; + } + break; + case pt_scale: + if ( sp>=1 && stack[sp-1].type==ps_array ) + sp = DoMatOp(tok,sp,stack); + else if ( sp>=2 ) { + transform[0] *= stack[sp-2].u.val; + transform[1] *= stack[sp-2].u.val; + transform[2] *= stack[sp-1].u.val; + transform[3] *= stack[sp-1].u.val; + /* transform[4,5] are unchanged */ + sp -= 2; + } + break; + case pt_rotate: + if ( sp>=1 && stack[sp-1].type==ps_array ) + sp = DoMatOp(tok,sp,stack); + else if ( sp>=1 ) { + --sp; + t[0] = t[3] = cos(stack[sp].u.val); + t[1] = sin(stack[sp].u.val); + t[2] = -t[1]; + t[4] = t[5] = 0; + MatMultiply(t,transform,transform); + } + break; + case pt_concat: + if ( sp>=1 ) { + if ( stack[sp-1].type==ps_array ) { + if ( stack[sp-1].u.dict.cnt==6 && stack[sp-1].u.dict.entries[0].type==ps_num ) { + --sp; + t[5] = stack[sp].u.dict.entries[5].u.val; + t[4] = stack[sp].u.dict.entries[4].u.val; + t[3] = stack[sp].u.dict.entries[3].u.val; + t[2] = stack[sp].u.dict.entries[2].u.val; + t[1] = stack[sp].u.dict.entries[1].u.val; + t[0] = stack[sp].u.dict.entries[0].u.val; + dictfree(&stack[sp].u.dict); + MatMultiply(t,transform,transform); + } + } + } + break; + case pt_transform: + if ( sp>=1 && stack[sp-1].type==ps_array ) { + if ( sp>=3 ) { + DoMatTransform(tok,sp,stack); + --sp; + } + } else if ( sp>=2 ) { + double x = stack[sp-2].u.val, y = stack[sp-1].u.val; + stack[sp-2].u.val = transform[0]*x + transform[1]*y + transform[4]; + stack[sp-1].u.val = transform[2]*x + transform[3]*y + transform[5]; + } + break; + case pt_itransform: + if ( sp>=1 && stack[sp-1].type==ps_array ) { + if ( sp>=3 ) { + DoMatTransform(tok,sp,stack); + --sp; + } + } else if ( sp>=2 ) { + double x = stack[sp-2].u.val-transform[4], y = stack[sp-1].u.val-transform[5]; + MatInverse(t,transform); + stack[sp-2].u.val = t[0]*x + t[1]*y + t[4]; + stack[sp-1].u.val = t[2]*x + t[3]*y + t[5]; + } + case pt_dtransform: + if ( sp>=1 && stack[sp-1].type==ps_array ) { + if ( sp>=3 ) { + DoMatTransform(tok,sp,stack); + --sp; + } + } else if ( sp>=2 ) { + double x = stack[sp-2].u.val, y = stack[sp-1].u.val; + stack[sp-2].u.val = transform[0]*x + transform[1]*y; + stack[sp-1].u.val = transform[2]*x + transform[3]*y; + } + break; + case pt_idtransform: + if ( sp>=1 && stack[sp-1].type==ps_array ) { + if ( sp>=3 ) { + DoMatTransform(tok,sp,stack); + --sp; + } + } else if ( sp>=2 ) { + double x = stack[sp-2].u.val, y = stack[sp-1].u.val; + MatInverse(t,transform); + stack[sp-2].u.val = t[0]*x + t[1]*y; + stack[sp-1].u.val = t[2]*x + t[3]*y; + } + break; + case pt_namelit: + if ( sp0 && stack[sp-1].type == ps_lit ) { + ref = RefCharCreate(); + ref->sc = (SplineChar *) stack[--sp].u.str; + memcpy(ref->transform,transform,sizeof(transform)); + if ( ec->refs==NULL ) + ec->refs = ref; + else + lastref->next = ref; + lastref = ref; + } + break; + case pt_newpath: + break; + case pt_lineto: case pt_rlineto: + case pt_moveto: case pt_rmoveto: + if ( sp>=2 || tok==pt_newpath ) { + if ( tok==pt_rlineto || tok==pt_rmoveto ) { + current.x += stack[sp-2].u.val; + current.y += stack[sp-1].u.val; + sp -= 2; + } else if ( tok==pt_lineto || tok == pt_moveto ) { + current.x = stack[sp-2].u.val; + current.y = stack[sp-1].u.val; + sp -= 2; + } + pt = chunkalloc(sizeof(SplinePoint)); + Transform(&pt->me,¤t,transform); + pt->noprevcp = true; pt->nonextcp = true; + if ( tok==pt_moveto || tok==pt_rmoveto ) { + SplinePointList *spl = chunkalloc(sizeof(SplinePointList)); + spl->first = spl->last = pt; + if ( cur!=NULL ) + cur->next = spl; + else + head = spl; + cur = spl; + } else { + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + SplineMake3(cur->last,pt); + cur->last = pt; + } + } + } else + sp = 0; + break; + case pt_curveto: case pt_rcurveto: + if ( sp>=6 ) { + if ( tok==pt_rcurveto ) { + stack[sp-1].u.val += current.y; + stack[sp-3].u.val += current.y; + stack[sp-5].u.val += current.y; + stack[sp-2].u.val += current.x; + stack[sp-4].u.val += current.x; + stack[sp-6].u.val += current.x; + } + current.x = stack[sp-2].u.val; + current.y = stack[sp-1].u.val; + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + temp.x = stack[sp-6].u.val; temp.y = stack[sp-5].u.val; + Transform(&cur->last->nextcp,&temp,transform); + cur->last->nonextcp = false; + pt = chunkalloc(sizeof(SplinePoint)); + temp.x = stack[sp-4].u.val; temp.y = stack[sp-3].u.val; + Transform(&pt->prevcp,&temp,transform); + Transform(&pt->me,¤t,transform); + pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } + sp -= 6; + } else + sp = 0; + break; + case pt_arc: case pt_arcn: + if ( sp>=5 ) { + real cx, cy, r, a1, a2; + cx = stack[sp-5].u.val; + cy = stack[sp-4].u.val; + r = stack[sp-3].u.val; + a1 = stack[sp-2].u.val; + a2 = stack[sp-1].u.val; + sp -= 5; + temp.x = cx+r*cos(a1/180 * 3.1415926535897932); + temp.y = cy+r*sin(a1/180 * 3.1415926535897932); + if ( temp.x!=current.x || temp.y!=current.y || + !( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) )) { + pt = chunkalloc(sizeof(SplinePoint)); + Transform(&pt->me,&temp,transform); + pt->noprevcp = true; pt->nonextcp = true; + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + SplineMake3(cur->last,pt); + cur->last = pt; + } else { /* if no current point, then start here */ + SplinePointList *spl = chunkalloc(sizeof(SplinePointList)); + spl->first = spl->last = pt; + if ( cur!=NULL ) + cur->next = spl; + else + head = spl; + cur = spl; + } + } + circlearcsto(a1,a2,cx,cy,r,cur,transform,tok==pt_arcn); + current.x = cx+r*cos(a2/180 * 3.1415926535897932); + current.y = cy+r*sin(a2/180 * 3.1415926535897932); + } else + sp = 0; + break; + case pt_arct: case pt_arcto: + if ( sp>=5 ) { + real x1, y1, x2, y2, r; + real xt1, xt2, yt1, yt2; + x1 = stack[sp-5].u.val; + y1 = stack[sp-4].u.val; + x2 = stack[sp-3].u.val; + y2 = stack[sp-2].u.val; + r = stack[sp-1].u.val; + sp -= 5; + + xt1 = xt2 = x1; yt1 = yt2 = y1; + if ( cur==NULL || cur->first==NULL || (cur->first==cur->last && cur->first->next!=NULL) ) + /* Error */; + else if ( current.x==x1 && current.y==y1 ) + /* Error */; + else if (( x1==x2 && y1==y2 ) || + (current.x-x1)*(y2-y1) == (x2-x1)*(current.y-y1) ) { + /* Degenerate case */ + current.x = x1; current.y = y1; + pt = chunkalloc(sizeof(SplinePoint)); + Transform(&pt->me,¤t,transform); + pt->noprevcp = true; pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } else { + real l1 = sqrt((current.x-x1)*(current.x-x1)+(current.y-y1)*(current.y-y1)); + real l2 = sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); + real dx = ((current.x-x1)/l1 + (x2-x1)/l2); + real dy = ((current.y-y1)/l1 + (y2-y1)/l2); + /* the line from (x1,y1) to (x1+dx,y1+dy) contains the center*/ + real l3 = sqrt(dx*dx+dy*dy); + real cx, cy, t, tmid; + real a1, amid, a2; + int clockwise = true; + dx /= l3; dy /= l3; + a1 = atan2(current.y-y1,current.x-x1); + a2 = atan2(y2-y1,x2-x1); + amid = atan2(dy,dx) - a1; + tmid = r/sin(amid); + t = r/tan(amid); + if ( t<0 ) { + clockwise = false; + t = -t; + tmid = -tmid; + } + cx = x1+ tmid*dx; cy = y1 + tmid*dy; + xt1 = x1 + t*(current.x-x1)/l1; yt1 = y1 + t*(current.y-y1)/l1; + xt2 = x1 + t*(x2-x1)/l2; yt2 = y1 + t*(y2-y1)/l2; + if ( xt1!=current.x || yt1!=current.y ) { + BasePoint temp; + temp.x = xt1; temp.y = yt1; + pt = chunkalloc(sizeof(SplinePoint)); + Transform(&pt->me,&temp,transform); + pt->noprevcp = true; pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } + a1 = 3*3.1415926535897932/2+a1; + a2 = 3.1415926535897932/2+a2; + if ( !clockwise ) { + a1 += 3.1415926535897932; + a2 += 3.1415926535897932; + } + circlearcsto(a1*180/3.1415926535897932,a2*180/3.1415926535897932, + cx,cy,r,cur,transform,clockwise); + } + if ( tok==pt_arcto ) { + stack[sp].type = stack[sp+1].type = stack[sp+2].type = stack[sp+3].type = ps_num; + stack[sp++].u.val = xt1; + stack[sp++].u.val = yt1; + stack[sp++].u.val = xt2; + stack[sp++].u.val = yt2; + } + current.x = xt2; current.y = yt2; + } + break; + case pt_closepath: + if ( cur!=NULL && cur->first!=NULL && cur->first!=cur->last ) { + if ( cur->first->me.x==cur->last->me.x && cur->first->me.y==cur->last->me.y ) { + SplinePoint *oldlast = cur->last; + cur->first->prevcp = oldlast->prevcp; + cur->first->noprevcp = false; + oldlast->prev->from->next = NULL; + cur->last = oldlast->prev->from; + SplineFree(oldlast->prev); + SplinePointFree(oldlast); + } + SplineMake3(cur->last,cur->first); + cur->last = cur->first; + } + break; + case pt_setlinecap: + if ( sp>=1 ) + linecap = stack[--sp].u.val; + break; + case pt_setlinejoin: + if ( sp>=1 ) + linejoin = stack[--sp].u.val; + break; + case pt_setlinewidth: + if ( sp>=1 ) + linewidth = stack[--sp].u.val; + break; + case pt_currentlinecap: case pt_currentlinejoin: + if ( sp>16)&0xff) + 6*((fore>>8)&0xff) + (fore&0xff))/2550.; + } + break; + case pt_setgray: + if ( sp>=1 ) { + fore = stack[--sp].u.val*255; + fore *= 0x010101; + } + break; + case pt_setrgbcolor: + if ( sp>=3 ) { + fore = (((int) (stack[sp-3].u.val*255))<<16) + + (((int) (stack[sp-2].u.val*255))<<8) + + (int) (stack[sp-1].u.val*255); + sp -= 3; + } + break; + case pt_currenthsbcolor: case pt_currentrgbcolor: + if ( sp+2>16)&0xff)/255.; + stack[sp++].u.val = ((fore>>8)&0xff)/255.; + stack[sp++].u.val = (fore&0xff)/255.; + } else { + int r=fore>>16, g=(fore>>8)&0xff, bl=fore&0xff; + int mx, mn; + real h, s, b; + mx = mn = r; + if ( mx>g ) mn=g; else mx=g; + if ( mxbl ) mn = bl; + b = mx/255.; + s = h = 0; + if ( mx>0 ) + s = ((real) (mx-mn))/mx; + if ( s!=0 ) { + real rdiff = ((real) (mx-r))/(mx-mn); + real gdiff = ((real) (mx-g))/(mx-mn); + real bdiff = ((real) (mx-bl))/(mx-mn); + if ( rdiff==0 ) + h = bdiff-gdiff; + else if ( gdiff==0 ) + h = 2 + rdiff-bdiff; + else + h = 4 + gdiff-rdiff; + h /= 6; + if ( h<0 ) h += 1; + } + stack[sp++].u.val = h; + stack[sp++].u.val = s; + stack[sp++].u.val = b; + } + } + break; + case pt_sethsbcolor: + if ( sp>=3 ) { + real h = stack[sp-3].u.val, s = stack[sp-2].u.val, b = stack[sp-1].u.val; + int r,g,bl; + if ( s==0 ) /* it's grey */ + fore = ((int) (b*255)) * 0x010101; + else { + real sextant = (h-floor(h))*6; + real mod = sextant-floor(sextant); + real p = b*(1-s), q = b*(1-s*mod), t = b*(1-s*(1-mod)); + switch( (int) sextant) { + case 0: + r = b*255.; g = t*255.; bl = p*255.; + break; + case 1: + r = q*255.; g = b*255.; bl = p*255.; + break; + case 2: + r = p*255.; g = b*255.; bl = t*255.; + break; + case 3: + r = p*255.; g = q*255.; bl = b*255.; + break; + case 4: + r = t*255.; g = p*255.; bl = b*255.; + break; + case 5: + r = b*255.; g = p*255.; bl = q*255.; + break; + } + fore = COLOR_CREATE(r,g,bl); + } + sp -= 3; + } + break; + case pt_currentcmykcolor: + if ( sp+3>8)&0xff)/255.; + c = 1.-((fore>>16)&0xff)/255.; + k = y; if ( k>m ) k=m; if ( k>c ) k=c; + if ( k!=1 ) { + y = (y-k)/(1-k); + m = (m-k)/(1-k); + c = (c-k)/(1-k); + } else + y = m = c = 0; + stack[sp++].u.val = c; + stack[sp++].u.val = m; + stack[sp++].u.val = y; + stack[sp++].u.val = k; + } + break; + case pt_setcmykcolor: + if ( sp>=4 ) { + real c=stack[sp-4].u.val,m=stack[sp-3].u.val,y=stack[sp-2].u.val,k=stack[sp-1].u.val; + sp -= 4; + if ( k==1 ) + fore = 0x000000; + else { + if (( y = (1-k)*y+k )<0 ) y=0; else if ( y>1 ) y=1; + if (( m = (1-k)*m+k )<0 ) m=0; else if ( m>1 ) m=1; + if (( c = (1-k)*c+k )<0 ) c=0; else if ( c>1 ) c=1; + fore = ((int) ((1-c)*255.)<<16) | + ((int) ((1-m)*255.)<<8) | + ((int) ((1-y)*255.)); + } + } + break; + case pt_fill: case pt_stroke: + if ( head==NULL && ec->splines!=NULL ) { + /* assume they did a "gsave fill grestore stroke" (or reverse)*/ + ent = ec->splines; + if ( tok==pt_stroke ) { + ent->u.splines.cap = linecap; ent->u.splines.join = linejoin; + ent->u.splines.stroke_width = linewidth; + memcpy(ent->u.splines.transform,transform,sizeof(transform)); + } + } else { + ent = EntityCreate(head,linecap,linejoin,linewidth,transform); + ent->next = ec->splines; + ec->splines = ent; + } + if ( tok==pt_fill ) + ent->u.splines.fill.col = fore; + else + ent->u.splines.stroke.col = fore; + head = NULL; cur = NULL; + break; + + /* We don't do these right, but at least we'll avoid some errors with this hack */ + case pt_save: case pt_currentmatrix: + /* push some junk on the stack */ + if ( sp=1 ) + --sp; + /* Fall through into grestore */; + case pt_grestore: + if ( gsp>0 ) { + --gsp; + memcpy(transform,gsaves[gsp].transform,sizeof(transform)); + current = gsaves[gsp].current; + linewidth = gsaves[gsp].linewidth; + linecap = gsaves[gsp].linecap; + linejoin = gsaves[gsp].linejoin; + fore = gsaves[gsp].fore; + } + break; + case pt_setmiterlimit: + /* pop some junk off the stack */ + if ( sp>=1 ) + --sp; + break; + case pt_setdash: + /* pop some junk off the stack */ + if ( sp>=1 ) + --sp; + break; + + case pt_openarray: case pt_mark: + if ( sp=1 && stack[sp-1].type==ps_num ) { + struct pskeydict dict; + dict.cnt = dict.max = stack[sp-1].u.val; + dict.entries = gcalloc(dict.cnt,sizeof(struct pskeyval)); + /* all entries are inited to void */ + stack[sp-1].type = ps_array; + stack[sp-1].u.dict = dict; + } + break; + case pt_aload: + sp = aload(sp,stack,sizeof(stack)/sizeof(stack[0])); + break; + case pt_astore: + if ( sp>=1 && stack[sp-1].type==ps_array ) { + struct pskeydict dict; + --sp; + dict = stack[sp].u.dict; + if ( sp>=dict.cnt ) { + for ( i=dict.cnt-1; i>=0 ; --i ) { + --sp; + dict.entries[i].type = stack[sp].type; + dict.entries[i].u = stack[sp].u; + } + } + stack[sp].type = ps_array; + stack[sp].u.dict = dict; + ++sp; + } + break; + + case pt_output: case pt_outputd: case pt_print: + if ( sp>=1 ) { + --sp; + switch ( stack[sp].type ) { + case ps_num: + printf( "%g", stack[sp].u.val ); + break; + case ps_bool: + printf( "%s", stack[sp].u.tf ? "true" : "false" ); + break; + case ps_string: case ps_instr: case ps_lit: + if ( tok==pt_outputd ) + printf( stack[sp].type==ps_lit ? "/" : + stack[sp].type==ps_string ? "(" : "{" ); + printf( "%s", stack[sp].u.str ); + if ( tok==pt_outputd ) + printf( stack[sp].type==ps_lit ? "" : + stack[sp].type==ps_string ? ")" : "}" ); + free(stack[sp].u.str); + break; + case ps_void: + printf( "-- void --" ); + break; + case ps_array: + if ( tok==pt_outputd ) { + printarray(&stack[sp].u.dict); + dictfree(&stack[sp].u.dict); + break; + } /* else fall through */ + dictfree(&stack[sp].u.dict); + default: + printf( "-- nostringval --" ); + break; + } + if ( tok==pt_output || tok==pt_outputd ) + printf( "\n" ); + } else + fprintf(stderr, "Nothing on stack to print\n" ); + break; + + case pt_cvi: case pt_cvr: + /* I shan't distinguish between integers and reals */ + if ( sp>=1 && stack[sp-1].type==ps_string ) { + double val = strtod(stack[sp-1].u.str,NULL); + free(stack[sp-1].u.str); + stack[sp-1].u.val = val; + stack[sp-1].type = ps_num; + } + break; + case pt_cvlit: + if ( sp>=1 ) { + if ( stack[sp-1].type==ps_array ) + stack[sp-1].u.dict.is_executable = false; + } + case pt_cvn: + if ( sp>=1 ) { + if ( stack[sp-1].type==ps_string ) + stack[sp-1].type = ps_lit; + } + case pt_cvx: + if ( sp>=1 ) { + if ( stack[sp-1].type==ps_array ) + stack[sp-1].u.dict.is_executable = true; + } + break; + case pt_cvrs: + if ( sp>=3 && stack[sp-1].type==ps_string && + stack[sp-2].type==ps_num && + stack[sp-3].type==ps_num ) { + if ( stack[sp-2].u.val==8 ) + sprintf( stack[sp-1].u.str, "%o", (int) stack[sp-3].u.val ); + else if ( stack[sp-2].u.val==16 ) + sprintf( stack[sp-1].u.str, "%X", (int) stack[sp-3].u.val ); + else /* default to radix 10 no matter what they asked for */ + sprintf( stack[sp-1].u.str, "%g", stack[sp-3].u.val ); + stack[sp-3] = stack[sp-1]; + sp-=2; + } + break; + case pt_cvs: + if ( sp>=2 && stack[sp-1].type==ps_string ) { + switch ( stack[sp].type ) { + case ps_num: + sprintf( stack[sp-1].u.str, "%g", stack[sp-2].u.val ); + break; + case ps_bool: + sprintf( stack[sp-1].u.str, "%s", stack[sp-2].u.tf ? "true" : "false" ); + break; + case ps_string: case ps_instr: case ps_lit: + sprintf( stack[sp-1].u.str, "%s", stack[sp-2].u.str ); + free(stack[sp].u.str); + break; + case ps_void: + printf( "-- void --" ); + break; + case ps_array: + dictfree(&stack[sp].u.dict); + default: + sprintf( stack[sp-1].u.str, "-- nostringval --" ); + break; + } + stack[sp-2] = stack[sp-1]; + --sp; + } + break; + case pt_stringop: /* the string keyword, not the () thingy */ + if ( sp>=1 && stack[sp-1].type==ps_num ) { + stack[sp-1].type = ps_string; + stack[sp-1].u.str = gcalloc(stack[sp-1].u.val+1,1); + } + break; + + case pt_unknown: + if ( !warned ) { + fprintf( stderr, "Warning: Unable to parse token %s, some features may be lost\n", tokbuf ); + warned = true; + } + break; + + default: + break; + }} + } + done: + if ( rs!=NULL ) { + int i, cnt, j; + for ( i=sp-1; i>=0; --i ) + if ( stack[i].type!=ps_num ) + break; + cnt = sp-1-i; + if ( cnt>rs->max ) cnt = rs->max; + rs->cnt = cnt; + for ( j=i+1; jstack[j-i-1] = stack[j].u.val; + } + freestuff(stack,sp,&dict,&gb); + if ( head!=NULL ) { + ent = EntityCreate(head,linecap,linejoin,linewidth,transform); + ent->next = ec->splines; + ec->splines = ent; + } + ECCatagorizePoints(ec); + setlocale(LC_NUMERIC,oldloc); +} + +static SplinePointList *EraseStroke(SplineChar *sc,SplinePointList *head,SplinePointList *erase) { + SplineSet *spl, *last; + SplinePoint *sp; + + if ( head==NULL ) { + /* Pointless, but legal */ + SplinePointListFree(erase); +return( NULL ); + } + + last = NULL; + for ( spl=head; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; sp!=NULL; ) { + sp->selected = false; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + last = spl; + } + for ( spl=erase; spl!=NULL; spl=spl->next ) { + for ( sp=spl->first; sp!=NULL; ) { + sp->selected = true; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + last->next = erase; +return( SplineSetRemoveOverlap(sc,head,over_exclude) ); +} + +static Entity *EntityReverse(Entity *ent) { + Entity *next, *last = NULL; + + while ( ent!=NULL ) { + next = ent->next; + ent->next = last; + last = ent; + ent = next; + } +return( last ); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static SplinePointList *SplinesFromLayers(SplineChar *sc,int *flags) { + int layer; + SplinePointList *head=NULL, *last, *new, *nlast, *temp, *each, *transed; + StrokeInfo si; + /*SplineSet *spl;*/ + int handle_eraser; + real inversetrans[6], transform[6]; + int changed; + + if ( *flags==-1 ) + *flags = PsStrokeFlagsDlg(); + + if ( *flags & sf_correctdir ) { + for ( layer=ly_fore; layerlayer_cnt; ++layer ) if ( sc->layers[layer].dofill ) + SplineSetsCorrect(sc->layers[layer].splines,&changed); + } + + handle_eraser = *flags & sf_handle_eraser; + + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + if ( sc->layers[layer].dostroke ) { + memset(&si,'\0',sizeof(si)); + si.toobigwarn = *flags & sf_toobigwarn ? 1 : 0; + si.join = sc->layers[layer].stroke_pen.linejoin; + si.cap = sc->layers[layer].stroke_pen.linecap; + si.removeoverlapifneeded = *flags & sf_removeoverlap ? 1 : 0; + si.radius = sc->layers[layer].stroke_pen.width/2.0; + if ( sc->layers[layer].stroke_pen.width==WIDTH_INHERITED ) + si.radius = .5; + if ( si.cap == lc_inherited ) si.cap = lc_butt; + if ( si.join == lc_inherited ) si.join = lj_miter; + new = NULL; + memcpy(transform,sc->layers[layer].stroke_pen.trans,4*sizeof(real)); + transform[4] = transform[5] = 0; + MatInverse(inversetrans,transform); + transed = SplinePointListTransform(SplinePointListCopy( + sc->layers[layer].splines),inversetrans,true); + for ( each = transed; each!=NULL; each=each->next ) { + temp = SplineSetStroke(each,&si,sc); + if ( new==NULL ) + new=temp; + else + nlast->next = temp; + if ( temp!=NULL ) + for ( nlast=temp; nlast->next!=NULL; nlast=nlast->next ); + } + new = SplinePointListTransform(new,transform,true); + SplinePointListFree(transed); + if ( handle_eraser && sc->layers[layer].stroke_pen.brush.col==0xffffff ) { + head = EraseStroke(sc,head,new); + last = head; + if ( last!=NULL ) + for ( ; last->next!=NULL; last=last->next ); + } else { + if ( head==NULL ) + head = new; + else + last->next = new; + if ( new!=NULL ) + for ( last = new; last->next!=NULL; last=last->next ); + } + if ( si.toobigwarn ) + *flags |= sf_toobigwarn; + } + if ( sc->layers[layer].dofill ) { + if ( handle_eraser && sc->layers[layer].fill_brush.col==0xffffff ) { + head = EraseStroke(sc,head,sc->layers[layer].splines); + last = head; + if ( last!=NULL ) + for ( ; last->next!=NULL; last=last->next ); + } else { + new = sc->layers[layer].splines; + if ( head==NULL ) + head = new; + else + last->next = new; + if ( new!=NULL ) + for ( last = new; last->next!=NULL; last=last->next ); + } + } + } +return( head ); +} + +void SFSplinesFromLayers(SplineFont *sf) { + /* User has turned off multi-layer, flatten the font */ + int i, layer; + int flags= -1; + Layer *new; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SplineChar *sc = sf->chars[i]; + SplineSet *splines = SplinesFromLayers(sc,&flags); + RefChar *head=NULL, *last=NULL; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + if ( head==NULL ) + head = last = sc->layers[layer].refs; + else + last->next = sc->layers[layer].refs; + if ( last!=NULL ) + while ( last->next!=NULL ) last = last->next; + sc->layers[layer].refs = NULL; + } + new = gcalloc(2,sizeof(Layer)); + new[ly_back] = sc->layers[ly_back]; + memset(&sc->layers[ly_back],0,sizeof(Layer)); + LayerDefault(&new[ly_fore]); + new[ly_fore].splines = splines; + new[ly_fore].refs = head; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + SplinePointListsFree(sc->layers[layer].splines); + RefCharsFree(sc->layers[layer].refs); + ImageListsFree(sc->layers[layer].images); + } + free(sc->layers); + sc->layers = new; + sc->layer_cnt = 2; + } + SFReinstanciateRefs(sf); +} +#else +void SFSplinesFromLayers(SplineFont *sf) { +} +#endif + +static void EntityCharCorrectDir(EntityChar *ec) { + SplineSet *head=NULL, *last=NULL, *cur, *ss; + Entity *ent; + int changed; + + for ( ent=ec->splines; ent!=NULL; ent = ent->next ) { + /* ignore splines which are only stoked, but not filled */ + if ( ent->type == et_splines && ent->u.splines.fill.col!=0xffffffff ) { + for ( ss=ent->u.splines.splines; ss!=NULL; ss=ss->next ) { + cur = chunkalloc(sizeof(SplineSet)); + *cur = *ss; + cur->next = NULL; + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + } + } + + SplineSetsCorrect(head,&changed); + if ( changed ) { + cur = head; + for ( ent=ec->splines; ent!=NULL; ent = ent->next ) { + if ( ent->type == et_splines && ent->u.splines.fill.col!=0xffffffff ) { + for ( ss=ent->u.splines.splines; ss!=NULL; ss=ss->next ) { + if ( cur==NULL ) { + GDrawIError("SplineSets do not match"); + break; + } + ss->first = cur->first; + ss->last = cur->last; + cur = cur->next; + } + } + if ( cur==NULL ) + break; + } + } + + for ( cur=head; cur!=NULL; cur=last ) { + last = cur->next; + chunkfree(cur,sizeof(SplineSet)); + } +} + +static SplinePointList *SplinesFromEntityChar(EntityChar *ec,int *flags) { + Entity *ent, *next; + SplinePointList *head=NULL, *last, *new, *nlast, *temp, *each, *transed; + StrokeInfo si; + real inversetrans[6]; + /*SplineSet *spl;*/ + int handle_eraser; + + if ( *flags==-1 ) + *flags = PsStrokeFlagsDlg(); + + if ( *flags & sf_correctdir ) + EntityCharCorrectDir(ec); + + handle_eraser = *flags & sf_handle_eraser; + if ( handle_eraser ) + ec->splines = EntityReverse(ec->splines); + + for ( ent=ec->splines; ent!=NULL; ent = next ) { + next = ent->next; + if ( ent->type == et_splines ) { + if ( ent->u.splines.splines!=NULL && ent->u.splines.splines->next==NULL && + !SplinePointListIsClockwise(ent->u.splines.splines)) + SplineSetReverse(ent->u.splines.splines); + if ( ent->u.splines.stroke.col!=0xffffffff ) { + memset(&si,'\0',sizeof(si)); + si.toobigwarn = *flags & sf_toobigwarn ? 1 : 0; + si.join = ent->u.splines.join; + si.cap = ent->u.splines.cap; + si.removeoverlapifneeded = *flags & sf_removeoverlap ? 1 : 0; + si.radius = ent->u.splines.stroke_width/2; + if ( ent->u.splines.stroke_width==WIDTH_INHERITED ) + si.radius = .5; + if ( si.cap == lc_inherited ) si.cap = lc_butt; + if ( si.join == lc_inherited ) si.join = lj_miter; + new = NULL; +#if 0 + SSBisectTurners(ent->u.splines.splines); +#endif + MatInverse(inversetrans,ent->u.splines.transform); + transed = SplinePointListTransform(SplinePointListCopy( + ent->u.splines.splines),inversetrans,true); + for ( each = transed; each!=NULL; each=each->next ) { + temp = SplineSetStroke(each,&si,ec->sc); + if ( new==NULL ) + new=temp; + else + nlast->next = temp; + if ( temp!=NULL ) + for ( nlast=temp; nlast->next!=NULL; nlast=nlast->next ); + } + new = SplinePointListTransform(new,ent->u.splines.transform,true); + SplinePointListFree(transed); + if ( handle_eraser && ent->u.splines.stroke.col==0xffffff ) { + head = EraseStroke(ec->sc,head,new); + last = head; + if ( last!=NULL ) + for ( ; last->next!=NULL; last=last->next ); + } else { + if ( head==NULL ) + head = new; + else + last->next = new; + if ( new!=NULL ) + for ( last = new; last->next!=NULL; last=last->next ); + } + if ( si.toobigwarn ) + *flags |= sf_toobigwarn; + } + if ( ent->u.splines.fill.col==0xffffffff ) + SplinePointListFree(ent->u.splines.splines); + else if ( handle_eraser && ent->u.splines.fill.col==0xffffff ) { + head = EraseStroke(ec->sc,head,ent->u.splines.splines); + last = head; + if ( last!=NULL ) + for ( ; last->next!=NULL; last=last->next ); + } else { + new = ent->u.splines.splines; + if ( head==NULL ) + head = new; + else + last->next = new; + if ( new!=NULL ) + for ( last = new; last->next!=NULL; last=last->next ); + } + } + free(ent); + } +return( head ); +} + +SplinePointList *SplinesFromEntities(Entity *ent,int *flags) { + EntityChar ec; + + memset(&ec,'\0',sizeof(ec)); + ec.splines = ent; +return( SplinesFromEntityChar(&ec,flags)); +} + +SplinePointList *SplinePointListInterpretPS(FILE *ps) { + EntityChar ec; + int flags = -1; + + memset(&ec,'\0',sizeof(ec)); + InterpretPS(ps,NULL,&ec,NULL); +return( SplinesFromEntityChar(&ec,&flags)); +} + +Entity *EntityInterpretPS(FILE *ps) { + EntityChar ec; + + memset(&ec,'\0',sizeof(ec)); + InterpretPS(ps,NULL,&ec,NULL); +return( ec.splines ); +} + +static void SCInterpretPS(FILE *ps,SplineChar *sc, int *flags) { + EntityChar ec; + real dval; + char tokbuf[10]; + IO wrapper; + + wrapper.top = NULL; + pushio(&wrapper,ps,NULL,1); + + if ( nextpstoken(&wrapper,&dval,tokbuf,sizeof(tokbuf))!=pt_opencurly ) + fprintf(stderr, "We don't understand this font\n" ); + memset(&ec,'\0',sizeof(ec)); + InterpretPS(ps,NULL,&ec,NULL); + ec.sc = sc; + sc->width = ec.width; +#ifdef FONTFORGE_CONFIG_TYPE3 + sc->layer_cnt = 1; + SCAppendEntityLayers(sc,ec.splines); + if ( sc->layer_cnt==1 ) ++sc->layer_cnt; +#else + sc->layers[ly_fore].splines = SplinesFromEntityChar(&ec,flags); +#endif + sc->layers[ly_fore].refs = ec.refs; + free(wrapper.top); +} + +void PSFontInterpretPS(FILE *ps,struct charprocs *cp) { + char tokbuf[100]; + int tok,i, j; + real dval; + SplineChar *sc; EntityChar dummy; + RefChar *p, *ref, *next; + IO wrapper; + int flags = -1; + + wrapper.top = NULL; + pushio(&wrapper,ps,NULL,1); + + while ( (tok = nextpstoken(&wrapper,&dval,tokbuf,sizeof(tokbuf)))!=pt_eof && tok!=pt_end ) { + if ( tok==pt_namelit ) { + if ( cp->nextcnt ) { + sc = SplineCharCreate(); + cp->keys[cp->next] = copy(tokbuf); + cp->values[cp->next++] = sc; + sc->name = copy(tokbuf); + SCInterpretPS(ps,sc,&flags); + GProgressNext(); + } else { + InterpretPS(ps,NULL,&dummy,NULL); + } + } + } + free(wrapper.top); + + /* References were done by name in the postscript. we stored the names in */ + /* ref->sc (which is a hack). Now look up all those names and replace */ + /* with the appropriate splinechar. If we can't find anything then throw */ + /* out the reference */ + for ( i=0; inext; ++i ) { + for ( p=NULL, ref=cp->values[i]->layers[ly_fore].refs; ref!=NULL; ref=next ) { + next = ref->next; + for ( j=0; jnext; ++j ) + if ( strcmp(cp->keys[j],(char *) (ref->sc))==0 ) + break; + free(ref->sc); /* a string, not a splinechar */ + if ( j!=cp->next ) { + ref->sc = cp->values[j]; + SCMakeDependent(cp->values[i],ref->sc); + ref->adobe_enc = getAdobeEnc(ref->sc->name); + ref->checked = true; + p = ref; + } else { + if ( p==NULL ) + cp->values[i]->layers[ly_fore].refs = next; + else + p->next = next; + RefCharFree(ref); + } + } + } +} + +/* Slurp up an encoding in the form: + /Enc-name [ + /charname + ... + ] def +We're not smart here no: 0 1 255 {1 index exch /.notdef put} for */ +Encoding *PSSlurpEncodings(FILE *file) { + char *names[1024]; + int32 encs[1024]; + Encoding *item, *head = NULL, *last; + char *encname; + char tokbuf[200]; + IO wrapper; + real dval; + int i, max, any, enc; + int tok; + + wrapper.top = NULL; + pushio(&wrapper,file,NULL,1); + + while ( (tok = nextpstoken(&wrapper,&dval,tokbuf,sizeof(tokbuf)))!=pt_eof ) { + encname = NULL; + if ( tok==pt_namelit ) { + encname = copy(tokbuf); + tok = nextpstoken(&wrapper,&dval,tokbuf,sizeof(tokbuf)); + } + if ( tok!=pt_openarray ) +return( head ); + for ( i=0; i<1024; ++i ) { + encs[i] = 0; + names[i]=NULL; + } + + max = -1; any = 0; i=0; + while ( (tok = nextpstoken(&wrapper,&dval,tokbuf,sizeof(tokbuf)))!=pt_eof && + tok!=pt_closearray ) { + if ( tok==pt_namelit && i<1024 ) { + max = i; + if ( strcmp(tokbuf,".notdef")==0 ) { + encs[i] = 0; + if ( i<32 || (i>=0x7f && i<0xa0)) + encs[i] = i; + } else if ( (enc=UniFromName(tokbuf))!=-1 ) + encs[i] = enc; + else { + names[i] = copy(tokbuf); + any = 1; + } + } + ++i; + } + if ( encname!=NULL ) { + tok = nextpstoken(&wrapper,&dval,tokbuf,sizeof(tokbuf)); + if ( tok==pt_def ) + /* Good */; + } + if ( max!=-1 ) { + if ( ++max<256 ) max = 256; + item = gcalloc(1,sizeof(Encoding)); + item->enc_name = encname; + item->char_cnt = max; + item->unicode = galloc(max*sizeof(int32)); + memcpy(item->unicode,encs,max*sizeof(int32)); + if ( any ) { + item->psnames = gcalloc(max,sizeof(char *)); + memcpy(item->psnames,names,max*sizeof(char *)); + } + if ( head==NULL ) + head = item; + else + last->next = item; + last = item; + } + } + +return( head ); +} + +int EvaluatePS(char *str,real *stack,int size) { + EntityChar ec; + RetStack rs; + + memset(&ec,'\0',sizeof(ec)); + memset(&rs,'\0',sizeof(rs)); + rs.max = size; + rs.stack = stack; + InterpretPS(NULL,str,&ec,&rs); +return( rs.cnt ); +} + +static void closepath(SplinePointList *cur, int is_type2) { + if ( cur!=NULL && cur->first==cur->last && cur->first->prev==NULL && is_type2 ) +return; /* The "path" is just a single point created by a moveto */ + /* Probably we're just doing another moveto */ + if ( cur!=NULL && cur->first!=NULL && cur->first!=cur->last ) { + if ( cur->first->me.x==cur->last->me.x && cur->first->me.y==cur->last->me.y ) { + SplinePoint *oldlast = cur->last; + cur->first->prevcp = oldlast->prevcp; + cur->first->noprevcp = false; + oldlast->prev->from->next = NULL; + cur->last = oldlast->prev->from; + chunkfree(oldlast->prev,sizeof(*oldlast)); + chunkfree(oldlast,sizeof(*oldlast)); + } + SplineMake3(cur->last,cur->first); + cur->last = cur->first; + } +} + +static StemInfo *HintsAppend(StemInfo *to,StemInfo *extra) { + StemInfo *h; + + if ( to==NULL ) +return( extra ); + if ( extra==NULL ) +return( to ); + for ( h=to; h->next!=NULL; h=h->next ); + h->next = extra; +return( to ); +} + +static StemInfo *HintNew(double start,double width) { + StemInfo *h; + + h = chunkalloc(sizeof(StemInfo)); + h->start = start; + h->width = width; +return( h ); +} + +static void RemapHintMask(HintMask *hm,int mapping[96],int max) { + HintMask rpl; + int i, mb; + + if ( hm==NULL ) +return; + + if ( max>96 ) max = 96; + mb = (max+7)>>3; + + memset(&rpl,0,mb); + for ( i=0; i>3]&(0x80>>(i&0x7)) ) + rpl[mapping[i]>>3] |= (0x80>>(mapping[i]&0x7)); + memcpy(hm,&rpl,mb); +} + +static void HintsRenumber(SplineChar *sc) { + /* In a type1 font the hints may get added to our hint list in a semi- */ + /* random order. In an incorrect type2 font the same thing could happen. */ + /* Force the order to be correct, and then update all masks */ + int mapping[96]; + int i, max; + StemInfo *h; + SplineSet *spl; + SplinePoint *sp; + + for ( i=0; i<96; ++i ) mapping[i] = i; + + i = 0; + for ( h=sc->hstem; h!=NULL; h=h->next ) { + if ( h->hintnumber<96 && i<96 ) { + mapping[h->hintnumber] = i; + h->hintnumber = i++; + } + chunkfree(h->u.unblended,sizeof(real [2][MmMax])); + h->u.unblended = NULL; + } + for ( h=sc->vstem; h!=NULL; h=h->next ) { + if ( h->hintnumber<96 && i<96 ) { + mapping[h->hintnumber] = i; + h->hintnumber = i++; + } + chunkfree(h->u.unblended,sizeof(real [2][MmMax])); + h->u.unblended = NULL; + } + max = i; + for ( i=0; icountermask_cnt; ++i ) + RemapHintMask(&sc->countermasks[i],mapping,max); + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + for ( sp = spl->first; ; ) { + RemapHintMask(sp->hintmask,mapping,max); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } +} + +int UnblendedCompare(real u1[MmMax], real u2[MmMax], int cnt) { + int i; + + for ( i=0; iu2[i]?1:-1 ); + } +return( 0 ); +} + +static StemInfo *SameH(StemInfo *old,real start, real width, + real unblended[2][MmMax], int instance_count) { + StemInfo *sameh; + + if ( instance_count==0 ) { + for ( sameh=old; sameh!=NULL; sameh=sameh->next ) + if ( sameh->start==start && sameh->width==width) + break; + } else { int j; + for ( j=1; jnext ) + if ( UnblendedCompare((*sameh->u.unblended)[0],unblended[0],instance_count)==0 && + UnblendedCompare((*sameh->u.unblended)[1],unblended[1],instance_count)==0) + break; + } +return( sameh ); +} + +static real Blend(real u[MmMax],struct pscontext *context) { + real sum = u[0]; + int i; + + for ( i=1; iinstance_count; ++i ) + sum += context->blend_values[i]*u[i]; +return( sum ); +} + +/* this handles either Type1 or Type2 charstrings. Type2 charstrings have */ +/* more operators than Type1s and the old operators have extended meanings */ +/* (ie. the rlineto operator can produce more than one line). But pretty */ +/* much it's a superset and if we parse for type2 (with a few additions) */ +/* we'll get it right */ +/* Char width is done differently. Moveto starts a newpath. 0xff starts a 16.16*/ +/* number rather than a 32 bit number */ +SplineChar *PSCharStringToSplines(uint8 *type1, int len, struct pscontext *context, + struct pschars *subrs, struct pschars *gsubrs, const char *name) { + int is_type2 = context->is_type2; + real stack[50]; int sp=0, v; /* Type1 stack is about 25 long, Type2 stack is 48 */ + real transient[32]; + SplineChar *ret = SplineCharCreate(); + SplinePointList *cur=NULL, *oldcur=NULL; + RefChar *r1, *r2, *rlast=NULL; + BasePoint current, oldcurrent; + real dx, dy, dx2, dy2, dx3, dy3, dx4, dy4, dx5, dy5, dx6, dy6; + SplinePoint *pt; + /* subroutines may be nested to a depth of 10 */ + struct substate { unsigned char *type1; int len; int subnum; } pcstack[11]; + int pcsp=0; + StemInfo *hint, *hp; + real pops[30]; + int popsp=0; + int base, polarity; + real coord; + struct pschars *s; + int hint_cnt = 0; + StemInfo *activeh=NULL, *activev=NULL, *sameh; + HintMask *pending_hm = NULL; + HintMask *counters[96]; + int cp=0; + real unblended[2][MmMax]; + int last_was_b1=false, old_last_was_b1; + + if ( !is_type2 && context->instance_count>1 ) + memset(unblended,0,sizeof(unblended)); + + ret->name = copy( name ); + ret->unicodeenc = -1; + ret->width = (int16) 0x8000; + if ( name==NULL ) name = "unnamed"; + ret->manualhints = true; + + current.x = current.y = 0; + while ( len>0 ) { + if ( sp>48 ) { + fprintf( stderr, "Stack got too big in %s\n", name ); + sp = 48; + } + base = 0; + --len; + if ( (v = *type1++)>=32 ) { + if ( v<=246) { + stack[sp++] = v - 139; + } else if ( v<=250 ) { + stack[sp++] = (v-247)*256 + *type1++ + 108; + --len; + } else if ( v<=254 ) { + stack[sp++] = -(v-251)*256 - *type1++ - 108; + --len; + } else { + int val = (*type1<<24) | (type1[1]<<16) | (type1[2]<<8) | type1[3]; + stack[sp++] = val; + type1 += 4; + len -= 4; + if ( is_type2 ) { +#ifndef PSFixed_Is_TTF /* The type2 spec is contradictory. It says this is a */ + /* two's complement number, but it also says it is a */ + /* Fixed, which in truetype is not two's complement */ + /* (mantisa is always unsigned) */ + stack[sp-1] /= 65536.; +#else + int mant = val&0xffff; + stack[sp-1] = (val>>16) + mant/65536.; +#endif + } + } + } else if ( v==28 ) { + stack[sp++] = (short) ((type1[0]<<8) | type1[1]); + type1 += 2; + len -= 2; + /* In the Dict tables of CFF, a 5byte fixed value is prefixed by a */ + /* 29 code. In Type2 strings the prefix is 255. */ + } else if ( v==12 ) { + old_last_was_b1 = last_was_b1; last_was_b1 = false; + v = *type1++; + --len; + switch ( v ) { + case 0: /* dotsection */ + sp = 0; + break; + case 1: /* vstem3 */ /* specifies three v hints zones at once */ + if ( sp<6 ) fprintf(stderr, "Stack underflow on vstem3 in %s\n", name ); + /* according to the standard, if there is a vstem3 there can't */ + /* be any vstems, so there can't be any confusion about hint order */ + /* so we don't need to worry about unblended stuff */ + sameh = NULL; + if ( !is_type2 ) + sameh = SameH(ret->vstem,stack[0] + ret->lsidebearing,stack[1], + unblended,0); + hint = HintNew(stack[0] + ret->lsidebearing,stack[1]); + hint->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + if ( activev==NULL ) + activev = hp = hint; + else { + for ( hp=activev; hp->next!=NULL; hp = hp->next ); + hp->next = hint; + hp = hint; + } + sameh = NULL; + if ( !is_type2 ) + sameh = SameH(ret->vstem,stack[2] + ret->lsidebearing,stack[3], + unblended,0); + hp->next = HintNew(stack[2] + ret->lsidebearing,stack[3]); + hp->next->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + if ( !is_type2 ) + sameh = SameH(ret->vstem,stack[4] + ret->lsidebearing,stack[5], + unblended,0); + hp->next->next = HintNew(stack[4] + ret->lsidebearing,stack[5]); + hp->next->next->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + if ( !is_type2 && hp->next->next->hintnumber<96 ) { + if ( pending_hm==NULL ) + pending_hm = chunkalloc(sizeof(HintMask)); + (*pending_hm)[hint->hintnumber>>3] |= 0x80>>(hint->hintnumber&0x7); + (*pending_hm)[hint->next->hintnumber>>3] |= 0x80>>(hint->next->hintnumber&0x7); + (*pending_hm)[hint->next->next->hintnumber>>3] |= 0x80>>(hint->next->next->hintnumber&0x7); + } + hp = hp->next->next; + sp = 0; + break; + case 2: /* hstem3 */ /* specifies three h hints zones at once */ + if ( sp<6 ) fprintf(stderr, "Stack underflow on hstem3 in %s\n", name ); + sameh = NULL; + if ( !is_type2 ) + sameh = SameH(ret->hstem,stack[0],stack[1], unblended,0); + hint = HintNew(stack[0],stack[1]); + hint->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + if ( activeh==NULL ) + activeh = hp = hint; + else { + for ( hp=activeh; hp->next!=NULL; hp = hp->next ); + hp->next = hint; + hp = hint; + } + sameh = NULL; + if ( !is_type2 ) + sameh = SameH(ret->hstem,stack[2],stack[3], unblended,0); + hp->next = HintNew(stack[2],stack[3]); + hp->next->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + sameh = NULL; + if ( !is_type2 ) + sameh = SameH(ret->hstem,stack[4],stack[5], unblended,0); + hp->next->next = HintNew(stack[4],stack[5]); + hp->next->next->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + if ( !is_type2 && hp->next->next->hintnumber<96 ) { + if ( pending_hm==NULL ) + pending_hm = chunkalloc(sizeof(HintMask)); + (*pending_hm)[hint->hintnumber>>3] |= 0x80>>(hint->hintnumber&0x7); + (*pending_hm)[hint->next->hintnumber>>3] |= 0x80>>(hint->next->hintnumber&0x7); + (*pending_hm)[hint->next->next->hintnumber>>3] |= 0x80>>(hint->next->next->hintnumber&0x7); + } + hp = hp->next->next; + sp = 0; + break; + case 6: /* seac */ /* build accented characters */ + seac: + if ( sp<5 ) fprintf(stderr, "Stack underflow on seac in %s\n", name ); + /* stack[0] must be the lsidebearing of the accent. I'm not sure why */ + r1 = RefCharCreate(); + r2 = RefCharCreate(); + r2->transform[0] = 1; r2->transform[3]=1; + r2->transform[4] = stack[1] - (stack[0]-ret->lsidebearing); + r2->transform[5] = stack[2]; + /* the translation of the accent here is said to be relative */ + /* to the origins of the base character. I think they place */ + /* the origin at the left bearing. And they don't mean the */ + /* base char at all, they mean the current char's lbearing */ + /* (which is normally the same as the base char's, except */ + /* when I has a big accent (like diaerisis) */ + r1->transform[0] = 1; r1->transform[3]=1; + r1->adobe_enc = stack[3]; + r2->adobe_enc = stack[4]; + if ( stack[3]<0 || stack[3]>=256 || stack[4]<0 || stack[4]>=256 ) { + fprintf( stderr, "Reference encoding out of bounds in %s\n", name ); + r1->adobe_enc = 0; + r2->adobe_enc = 0; + } + r1->next = r2; + if ( rlast!=NULL ) rlast->next = r1; + else ret->layers[ly_fore].refs = r1; + rlast = r2; + sp = 0; + break; + case 7: /* sbw */ /* generalized width/sidebearing command */ + if ( sp<4 ) fprintf(stderr, "Stack underflow on sbw in %s\n", name ); + ret->lsidebearing = stack[0]; + /* stack[1] is lsidebearing y (only for vertical writing styles, CJK) */ + ret->width = stack[2]; + /* stack[3] is height (for vertical writing styles, CJK) */ + sp = 0; + break; + case 5: case 9: case 14: case 26: + if ( sp<1 ) fprintf(stderr, "Stack underflow on unary operator in %s\n", name ); + switch ( v ) { + case 5: stack[sp-1] = (stack[sp-1]==0); break; /* not */ + case 9: if ( stack[sp-1]<0 ) stack[sp-1]= -stack[sp-1]; break; /* abs */ + case 14: stack[sp-1] = -stack[sp-1]; break; /* neg */ + case 26: stack[sp-1] = sqrt(stack[sp-1]); break; /* sqrt */ + } + break; + case 3: case 4: case 10: case 11: case 12: case 15: case 24: + if ( sp<2 ) fprintf(stderr, "Stack underflow on binary operator in %s\n", name ); + else switch ( v ) { + case 3: /* and */ + stack[sp-2] = (stack[sp-1]!=0 && stack[sp-2]!=0); + break; + case 4: /* and */ + stack[sp-2] = (stack[sp-1]!=0 || stack[sp-2]!=0); + break; + case 10: /* add */ + stack[sp-2] += stack[sp-1]; + break; + case 11: /* sub */ + stack[sp-2] -= stack[sp-1]; + break; + case 12: /* div */ + stack[sp-2] /= stack[sp-1]; + break; + case 24: /* mul */ + stack[sp-2] *= stack[sp-1]; + break; + case 15: /* eq */ + stack[sp-2] = (stack[sp-1]==stack[sp-2]); + break; + } + --sp; + break; + case 22: /* ifelse */ + if ( sp<4 ) fprintf(stderr, "Stack underflow on ifelse in %s\n", name ); + else { + if ( stack[sp-2]>stack[sp-1] ) + stack[sp-4] = stack[sp-3]; + sp -= 3; + } + break; + case 23: /* random */ + /* This function returns something (0,1]. It's not clear to me*/ + /* if rand includes 0 and RAND_MAX or not, but this approach */ + /* should work no matter what */ + do { + stack[sp] = (rand()/(RAND_MAX-1)); + } while ( stack[sp]==0 || stack[sp]>1 ); + ++sp; + break; + case 16: /* callothersubr */ + /* stack[sp-1] is the number of the thing to call in the othersubr array */ + /* stack[sp-2] is the number of args to grab off our stack and put on the */ + /* real postscript stack */ + if ( sp<2 || sp < 2+stack[sp-2] ) { + fprintf(stderr, "Stack underflow on callothersubr in %s\n", name ); + sp = 0; + } else { + int tot = stack[sp-2], i, k, j; + popsp = 0; + for ( k=sp-3; k>=sp-2-tot; --k ) + pops[popsp++] = stack[k]; + /* othersubrs 0-3 must be interpretted. 0-2 are Flex, 3 is Hint Replacement */ + /* othersubrs 12,13 are for counter hints. We don't need to */ + /* do anything to ignore them */ + /* Subroutines 14-18 are multiple master blenders. We need */ + /* to pay attention to them too */ + switch ( (int) stack[sp-1] ) { + case 3: { + /* when we weren't capabable of hint replacement we */ + /* punted by putting 3 on the stack (T1 spec page 70) */ + /* subroutine 3 is a noop */ + /*pops[popsp-1] = 3;*/ + ret->manualhints = false; + /* We can manage hint substitution from hintmask though*/ + /* well enough that we needn't clear the manualhints bit */ + ret->hstem = HintsAppend(ret->hstem,activeh); activeh=NULL; + ret->vstem = HintsAppend(ret->vstem,activev); activev=NULL; + } break; + case 1: { + /* Essentially what we want to do is draw a line from */ + /* where we are at the beginning to where we are at */ + /* the end. So we save the beginning here (this starts*/ + /* the flex sequence), we ignore all calls to othersub*/ + /* 2, and when we get to othersub 0 we put everything*/ + /* back to where it should be and free up whatever */ + /* extranious junk we created along the way and draw */ + /* our line. */ + /* Let's punt a little less, and actually figure out */ + /* the appropriate rrcurveto commands and put in a */ + /* dished serif */ + if ( cur!=NULL ) { + oldcurrent = current; + oldcur = cur; + cur->next = NULL; + } else + fprintf(stderr, "Bad flex subroutine in %s\n", name ); + } break; + case 2: { + /* No op */; + } break; + case 0: if ( oldcur!=NULL ) { + SplinePointList *spl = oldcur->next; + if ( spl!=NULL && spl->next!=NULL && + spl->next->next!=NULL && + spl->next->next->next!=NULL && + spl->next->next->next->next!=NULL && + spl->next->next->next->next->next!=NULL && + spl->next->next->next->next->next->next!=NULL ) { + BasePoint old_nextcp, mid_prevcp, mid, mid_nextcp, + end_prevcp, end; + old_nextcp = spl->next->first->me; + mid_prevcp = spl->next->next->first->me; + mid = spl->next->next->next->first->me; + mid_nextcp = spl->next->next->next->next->first->me; + end_prevcp = spl->next->next->next->next->next->first->me; + end = spl->next->next->next->next->next->next->first->me; + cur = oldcur; + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + cur->last->nextcp = old_nextcp; + cur->last->nonextcp = false; + pt = chunkalloc(sizeof(SplinePoint)); + pt->hintmask = pending_hm; pending_hm = NULL; + pt->prevcp = mid_prevcp; + pt->me = mid; + pt->nextcp = mid_nextcp; + /*pt->flex = pops[2];*/ + SplineMake3(cur->last,pt); + cur->last = pt; + pt = chunkalloc(sizeof(SplinePoint)); + pt->prevcp = end_prevcp; + pt->me = end; + pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } else + fprintf(stderr, "No previous point on path in curveto from flex 0 in %s\n", name ); + } else { + /* Um, something's wrong. Let's just draw a line */ + /* do the simple method, which consists of creating */ + /* the appropriate line */ + pt = chunkalloc(sizeof(SplinePoint)); + pt->me.x = pops[1]; pt->me.y = pops[0]; + pt->noprevcp = true; pt->nonextcp = true; + SplinePointListFree(oldcur->next); oldcur->next = NULL; spl = NULL; + cur = oldcur; + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + SplineMake3(cur->last,pt); + cur->last = pt; + } else + fprintf(stderr, "No previous point on path in lineto from flex 0 in %s\n", name ); + } + --popsp; + cur->next = NULL; + SplinePointListFree(spl); + oldcur = NULL; + } else + fprintf(stderr, "Bad flex subroutine in %s\n", name ); + break; + case 14: /* results in 1 blended value */ + case 15: /* results in 2 blended values */ + case 16: /* results in 3 blended values */ + case 17: /* results in 4 blended values */ + case 18: { /* results in 6 blended values */ + int cnt = stack[sp-1]-13; + if ( cnt==5 ) cnt=6; + if ( context->instance_count==0 ) + fprintf( stderr, "Attempt to use a multiple master subroutine in a non-mm font in %s.\n", name ); + else if ( tot!=cnt*context->instance_count ) + fprintf( stderr, "Multiple master subroutine called with the wrong number of arguments in %s.\n", name ); + else { + /* Hints need to keep track of the original blends */ + if ( cnt==1 && !is_type2 ) { + if ( sp-2-tot>=1 && (!old_last_was_b1 || stack[0]!=Blend(unblended[1],context))) { + unblended[0][0] = stack[0]; + for ( i=1; iinstance_count; ++i ) + unblended[0][i] = 0; + } else + memcpy(unblended,unblended+1,context->instance_count*sizeof(real)); + for ( j=0; jinstance_count; ++j ) + unblended[1][j] = stack[sp-2-tot+j]; + } else if ( cnt==2 && !is_type2 ) { + unblended[0][0] = stack[sp-2-tot]; + unblended[1][0] = stack[sp-2-tot+1]; + for ( i=0; i<2; ++i ) + for ( j=1; jinstance_count; ++j ) + unblended[i][j] = stack[sp-2-tot+2+i*(context->instance_count-1)+(j-1)]; + } + popsp = 0; + for ( i=0; iinstance_count; ++j ) + sum += context->blend_values[j]* + stack[sp-2-tot+ cnt +i*(context->instance_count-1)+ j-1]; + pops[cnt-1-popsp++] = sum; + } + } + } break; + } + sp = k+1; + } + break; + case 20: /* put */ + if ( sp<2 ) fprintf(stderr, "Too few items on stack for put in %s\n", name ); + else if ( stack[sp-1]<0 || stack[sp-1]>=32 ) fprintf(stderr,"Reference to transient memory out of bounds in put in %s\n", name ); + else { + transient[(int)stack[sp-1]] = stack[sp-2]; + sp -= 2; + } + break; + case 21: /* get */ + if ( sp<1 ) fprintf(stderr, "Too few items on stack for get in %s\n", name ); + else if ( stack[sp-1]<0 || stack[sp-1]>=32 ) fprintf(stderr,"Reference to transient memory out of bounds in put in %s\n", name ); + else + stack[sp-1] = transient[(int)stack[sp-1]]; + break; + case 17: /* pop */ + /* pops something from the postscript stack and pushes it on ours */ + /* used to get a return value from an othersubr call */ + /* Bleah. Adobe wants the pops to return the arguments if we */ + /* don't understand the call. What use is the subroutine then?*/ + if ( popsp<=0 ) + fprintf(stderr, "Pop stack underflow on pop in %s\n", name ); + else + stack[sp++] = pops[--popsp]; + break; + case 18: /* drop */ + if ( sp>0 ) --sp; + break; + case 27: /* dup */ + if ( sp>=1 ) { + stack[sp] = stack[sp-1]; + ++sp; + } + break; + case 28: /* exch */ + if ( sp>=2 ) { + real temp = stack[sp-1]; + stack[sp-1] = stack[sp-2]; stack[sp-2] = temp; + } + break; + case 29: /* index */ + if ( sp>=1 ) { + int index = stack[--sp]; + if ( index<0 || sp=2 ) { + int j = stack[sp-1], N=stack[sp-2]; + if ( N>sp || j>=N || j<0 || N<0 ) + fprintf( stderr, "roll out of range in %s\n", name ); + else if ( j==0 || N==0 ) + /* No op */; + else { + real *temp = galloc(N*sizeof(real)); + int i; + for ( i=0; iyt ) { + dx6 = stack[base++]; + dy6 = -dy-dy2-dy3-dy4-dy5; + } else { + dy6 = stack[base++]; + dx6 = -dx-dx2-dx3-dx4-dx5; + } + break; + } + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + current.x += dx; current.y += dy; + cur->last->nextcp = current; + cur->last->nonextcp = false; + current.x += dx2; current.y += dy2; + pt = chunkalloc(sizeof(SplinePoint)); + pt->hintmask = pending_hm; pending_hm = NULL; + pt->prevcp = current; + current.x += dx3; current.y += dy3; + pt->me = current; + pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + + current.x += dx4; current.y += dy4; + cur->last->nextcp = current; + cur->last->nonextcp = false; + current.x += dx5; current.y += dy5; + pt = chunkalloc(sizeof(SplinePoint)); + pt->prevcp = current; + current.x += dx6; current.y += dy6; + pt->me = current; + pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } else + fprintf(stderr, "No previous point on path in flex operator in %s\n", name ); + sp = 0; + break; + default: + fprintf( stderr, "Uninterpreted opcode 12,%d in %s\n", v, name ); + break; + } + } else { last_was_b1 = false; switch ( v ) { + case 1: /* hstem */ + case 18: /* hstemhm */ + base = 0; + if ( sp&1 ) { + ret->width = stack[0]; + base=1; + } + if ( sp-base<2 ) + fprintf(stderr, "Stack underflow on hstem in %s\n", name ); + /* stack[0] is absolute y for start of horizontal hint */ + /* (actually relative to the y specified as lsidebearing y in sbw*/ + /* stack[1] is relative y for height of hint zone */ + coord = 0; + hp = NULL; + if ( activeh!=NULL ) + for ( hp=activeh; hp->next!=NULL; hp = hp->next ); + while ( sp-base>=2 ) { + sameh = NULL; + if ( !is_type2 ) + sameh = SameH(ret->hstem,stack[base]+coord,stack[base+1], + unblended,context->instance_count); + hint = HintNew(stack[base]+coord,stack[base+1]); + hint->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + if ( !is_type2 && context->instance_count!=0 ) { + hint->u.unblended = chunkalloc(sizeof(real [2][MmMax])); + memcpy(hint->u.unblended,unblended,sizeof(real [2][MmMax])); + } + if ( activeh==NULL ) + activeh = hint; + else + hp->next = hint; + hp = hint; + if ( !is_type2 && hint->hintnumber<96 ) { + if ( pending_hm==NULL ) + pending_hm = chunkalloc(sizeof(HintMask)); + (*pending_hm)[hint->hintnumber>>3] |= 0x80>>(hint->hintnumber&0x7); + } + base+=2; + coord = hint->start+hint->width; + } + sp = 0; + break; + case 19: /* hintmask */ + case 20: /* cntrmask */ + /* If there's anything on the stack treat it as a vstem hint */ + base = 0; + case 3: /* vstem */ + case 23: /* vstemhm */ + if ( cur==NULL || v==3 || v==23 ) { + if ( (sp&1) && is_type2 ) { + ret->width = stack[0]; + base=1; + } + /* I've seen a vstemhm with no arguments. I've no idea what that */ + /* means. It came right after a hintmask */ + /* I'm confused about v/hstemhm because the manual says it needs */ + /* to be used if one uses a hintmask, but that's not what the */ + /* examples show. Or I'm not understanding. */ + if ( sp-base<2 && v!=19 && v!=20 ) + fprintf(stderr, "Stack underflow on vstem in %s\n", name ); + /* stack[0] is absolute x for start of vertical hint */ + /* (actually relative to the x specified as lsidebearing in h/sbw*/ + /* stack[1] is relative x for height of hint zone */ + coord = ret->lsidebearing; + hp = NULL; + if ( activev!=NULL ) + for ( hp=activev; hp->next!=NULL; hp = hp->next ); + while ( sp-base>=2 ) { + sameh = NULL; + if ( !is_type2 ) + sameh = SameH(ret->vstem,stack[base]+coord,stack[base+1], + unblended,context->instance_count); + hint = HintNew(stack[base]+coord,stack[base+1]); + hint->hintnumber = sameh!=NULL ? sameh->hintnumber : hint_cnt++; + if ( !is_type2 && context->instance_count!=0 ) { + hint->u.unblended = chunkalloc(sizeof(real [2][MmMax])); + memcpy(hint->u.unblended,unblended,sizeof(real [2][MmMax])); + } + if ( !is_type2 && hint->hintnumber<96 ) { + if ( pending_hm==NULL ) + pending_hm = chunkalloc(sizeof(HintMask)); + (*pending_hm)[hint->hintnumber>>3] |= 0x80>>(hint->hintnumber&0x7); + } + if ( activev==NULL ) + activev = hint; + else + hp->next = hint; + hp = hint; + base+=2; + coord = hint->start+hint->width; + } + sp = 0; + } + if ( v==19 || v==20 ) { /* hintmask, cntrmask */ + int bytes = (hint_cnt+7)/8; + if ( v==19 ) { + ret->hstem = HintsAppend(ret->hstem,activeh); activeh=NULL; + ret->vstem = HintsAppend(ret->vstem,activev); activev=NULL; + pending_hm = chunkalloc(sizeof(HintMask)); + memcpy(pending_hm,type1,bytes); + } else if ( cplsidebearing = stack[0]; + current.x = stack[0]; /* sets the current point too */ + ret->width = stack[1]; + sp = 0; + break; + case 9: /* closepath */ + sp = 0; + closepath(cur,is_type2); + break; + case 21: /* rmoveto */ + case 22: /* hmoveto */ + case 4: /* vmoveto */ + if ( is_type2 ) { + if ( (v==21 && sp==3) || (v!=21 && sp==2)) { + /* Character's width may be specified on the first moveto */ + ret->width = stack[0]; + stack[0] = stack[1]; stack[1] = stack[2]; --sp; + } + closepath(cur,true); + } +#if 0 /* This doesn't work. It breaks type1 flex hinting. */ + /* There's now a special hack just before returning which closes any */ + /* open paths */ + else if ( cur!=NULL && cur->first->prev==NULL ) + closepath(cur,false); /* Even in type1 fonts closepath is optional */ +#endif + case 5: /* rlineto */ + case 6: /* hlineto */ + case 7: /* vlineto */ + polarity = 0; + base = 0; + while ( basehintmask = pending_hm; pending_hm = NULL; + pt->me = current; + pt->noprevcp = true; pt->nonextcp = true; + if ( v==4 || v==21 || v==22 ) { + if ( cur!=NULL && cur->first==cur->last && cur->first->prev==NULL && is_type2 ) { + /* Two adjacent movetos should not create single point paths */ + cur->first->me = current; + SplinePointFree(pt); + } else { + SplinePointList *spl = chunkalloc(sizeof(SplinePointList)); + spl->first = spl->last = pt; + if ( cur!=NULL ) + cur->next = spl; + else + ret->layers[ly_fore].splines = spl; + cur = spl; + } + break; + } else { + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + SplineMake3(cur->last,pt); + cur->last = pt; + } else + fprintf(stderr, "No previous point on path in lineto in %s\n", name ); + } + } + sp = 0; + break; + case 25: /* rlinecurve */ + base = 0; + while ( sp>base+6 ) { + current.x += stack[base++]; current.y += stack[base++]; + if ( cur!=NULL ) { + pt = chunkalloc(sizeof(SplinePoint)); + pt->hintmask = pending_hm; pending_hm = NULL; + pt->me = current; + pt->noprevcp = true; pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } + } + case 24: /* rcurveline */ + case 8: /* rrcurveto */ + case 31: /* hvcurveto */ + case 30: /* vhcurveto */ + case 27: /* hhcurveto */ + case 26: /* vvcurveto */ + polarity = 0; + while ( sp>base+2 ) { + dx = dy = dx2 = dy2 = dx3 = dy3 = 0; + if ( v==8 || v==25 || v==24 ) { + if ( sp<6+base ) { + fprintf(stderr, "Stack underflow on rrcurveto in %s\n", name ); + base = sp; + } else { + dx = stack[base++]; + dy = stack[base++]; + dx2 = stack[base++]; + dy2 = stack[base++]; + dx3 = stack[base++]; + dy3 = stack[base++]; + } + } else if ( v==27 ) { /* hhcurveto */ + if ( sp<4+base ) { + fprintf(stderr, "Stack underflow on hhcurveto in %s\n", name ); + base = sp; + } else { + if ( (sp-base)&1 ) dy = stack[base++]; + dx = stack[base++]; + dx2 = stack[base++]; + dy2 = stack[base++]; + dx3 = stack[base++]; + } + } else if ( v==26 ) { /* vvcurveto */ + if ( sp<4+base ) { + fprintf(stderr, "Stack underflow on hhcurveto in %s\n", name ); + base = sp; + } else { + if ( (sp-base)&1 ) dx = stack[base++]; + dy = stack[base++]; + dx2 = stack[base++]; + dy2 = stack[base++]; + dy3 = stack[base++]; + } + } else if ( (v==31 && !(polarity&1)) || (v==30 && (polarity&1)) ) { + if ( sp<4+base ) { + fprintf(stderr, "Stack underflow on hvcurveto in %s\n", name ); + base = sp; + } else { + dx = stack[base++]; + dx2 = stack[base++]; + dy2 = stack[base++]; + dy3 = stack[base++]; + if ( sp==base+1 ) + dx3 = stack[base++]; + } + } else /*if ( (v==30 && !(polarity&1)) || (v==31 && (polarity&1)) )*/ { + if ( sp<4+base ) { + fprintf(stderr, "Stack underflow on vhcurveto in %s\n", name ); + base = sp; + } else { + dy = stack[base++]; + dx2 = stack[base++]; + dy2 = stack[base++]; + dx3 = stack[base++]; + if ( sp==base+1 ) + dy3 = stack[base++]; + } + } + ++polarity; + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + current.x += dx; current.y += dy; + cur->last->nextcp = current; + cur->last->nonextcp = false; + current.x += dx2; current.y += dy2; + pt = chunkalloc(sizeof(SplinePoint)); + pt->hintmask = pending_hm; pending_hm = NULL; + pt->prevcp = current; + current.x += dx3; current.y += dy3; + pt->me = current; + pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } else + fprintf(stderr, "No previous point on path in curveto in %s\n", name ); + } + if ( v==24 ) { + current.x += stack[base++]; current.y += stack[base++]; + if ( cur!=NULL ) { /* In legal code, cur can't be null here, but I got something illegal... */ + pt = chunkalloc(sizeof(SplinePoint)); + pt->hintmask = pending_hm; pending_hm = NULL; + pt->me = current; + pt->noprevcp = true; pt->nonextcp = true; + SplineMake3(cur->last,pt); + cur->last = pt; + } + } + sp = 0; + break; + case 29: /* callgsubr */ + case 10: /* callsubr */ + /* stack[sp-1] contains the number of the subroutine to call */ + if ( sp<1 ) { + fprintf(stderr, "Stack underflow on callsubr in %s\n", name ); + break; + } else if ( pcsp>10 ) { + fprintf( stderr, "Too many subroutine calls in %s\n", name ); + break; + } + s=subrs; if ( v==29 ) s = gsubrs; + if ( s!=NULL ) stack[sp-1] += s->bias; + /* Type2 subrs have a bias that must be added to the subr-number */ + /* Type1 subrs do not. We set the bias on them to 0 */ + if ( s==NULL || stack[sp-1]>=s->cnt || stack[sp-1]<0 || + s->values[(int) stack[sp-1]]==NULL ) + fprintf(stderr,"Subroutine number out of bounds in %s\n", name ); + else { + pcstack[pcsp].type1 = type1; + pcstack[pcsp].len = len; + pcstack[pcsp].subnum = stack[sp-1]; + ++pcsp; + type1 = s->values[(int) stack[sp-1]]; + len = s->lens[(int) stack[sp-1]]; + } + if ( --sp<0 ) sp = 0; + break; + case 11: /* return */ + /* return from a subr outine */ + if ( pcsp<1 ) fprintf(stderr, "return when not in subroutine in %s\n", name ); + else { + --pcsp; + type1 = pcstack[pcsp].type1; + len = pcstack[pcsp].len; + } + break; + case 16: { /* blend -- obsolete type 2 multiple master operator */ + int cnt,i,j; + if ( context->instance_count==0 ) + fprintf( stderr, "Attempt to use a multiple master subroutine in a non-mm font.\n" ); + else if ( sp<1 || spinstance_count*stack[sp-1]+1 ) + fprintf(stderr, "Too few items on stack for blend in %s\n", name ); + else { + if ( !context->blend_warn ) { + fprintf( stderr, "Use of obsolete blend operator.\n" ); + context->blend_warn = true; + } + cnt = stack[sp-1]; + sp -= context->instance_count*stack[sp-1]+1; + for ( i=0; iinstance_count; ++j ) + stack[sp+i] += context->blend_values[j]*stack[sp+ + cnt+ i*(context->instance_count-1)+ j-1]; + } + /* there will always be fewer pushes than there were pops */ + /* so I don't bother to check the stack */ + sp += cnt; + } + } + break; + default: + fprintf( stderr, "Uninterpreted opcode %d in %s\n", v, name ); + break; + }} + } + done: + if ( pcsp!=0 ) + fprintf(stderr, "end of subroutine reached with no return in %s\n", name ); + SCCatagorizePoints(ret); + + ret->hstem = HintsAppend(ret->hstem,activeh); activeh=NULL; + ret->vstem = HintsAppend(ret->vstem,activev); activev=NULL; + + if ( cp!=0 ) { int i; + ret->countermasks = galloc(cp*sizeof(HintMask)); + ret->countermask_cnt = cp; + for ( i=0; icountermasks[i],counters[i],sizeof(HintMask)); + chunkfree(counters[i],sizeof(HintMask)); + } + } + + /* Even in type1 fonts all paths should be closed. But if we close them at*/ + /* the obvious moveto, that breaks flex hints. So we have a hack here at */ + /* the end which closes any open paths. */ + if ( !is_type2 ) for ( cur = ret->layers[ly_fore].splines; cur!=NULL; cur = cur->next ) if ( cur->first->prev==NULL ) { + SplineMake3(cur->last,cur->first); + cur->last = cur->first; + } + + /* For some reason, when I read splines in, I get their clockwise nature */ + /* backwards ... at least backwards from fontographer ... so reverse 'em*/ + /* Oh, I see. PS and TT disagree on which direction to use, so Fontographer*/ + /* chose the TT direction and we must reverse postscript */ + for ( cur = ret->layers[ly_fore].splines; cur!=NULL; cur = cur->next ) + SplineSetReverse(cur); + if ( ret->hstem==NULL && ret->vstem==NULL ) + ret->manualhints = false; + ret->hstem = HintCleanup(ret->hstem,true,context->instance_count); + ret->vstem = HintCleanup(ret->vstem,true,context->instance_count); + SCGuessHHintInstancesList(ret); + SCGuessVHintInstancesList(ret); + ret->hconflicts = StemListAnyConflicts(ret->hstem); + ret->vconflicts = StemListAnyConflicts(ret->vstem); + if ( context->instance_count==1 && !ret->hconflicts && !ret->vconflicts ) + SCClearHintMasks(ret,false); + HintsRenumber(ret); + if ( name!=NULL && strcmp(name,".notdef")!=0 ) + ret->widthset = true; +return( ret ); +} diff --git a/fontforge/psunicodenames.c b/fontforge/psunicodenames.c new file mode 100644 index 00000000..1507a1dc --- /dev/null +++ b/fontforge/psunicodenames.c @@ -0,0 +1,70995 @@ +#include + +/* Glyph Names for New Fonts 1.3 v1.1 (aglfn13.txt) */ +/* http://partners.adobe.com/asn/tech/type/aglfn13.txt */ + +const int psunicodenames_cnt = 65536; +const char *psunicodenames[65536] = { +/* 0000 */ NULL, +/* 0001 */ NULL, +/* 0002 */ NULL, +/* 0003 */ NULL, +/* 0004 */ NULL, +/* 0005 */ NULL, +/* 0006 */ NULL, +/* 0007 */ NULL, +/* 0008 */ NULL, +/* 0009 */ NULL, +/* 000a */ NULL, +/* 000b */ NULL, +/* 000c */ NULL, +/* 000d */ NULL, +/* 000e */ NULL, +/* 000f */ NULL, +/* 0010 */ NULL, +/* 0011 */ NULL, +/* 0012 */ NULL, +/* 0013 */ NULL, +/* 0014 */ NULL, +/* 0015 */ NULL, +/* 0016 */ NULL, +/* 0017 */ NULL, +/* 0018 */ NULL, +/* 0019 */ NULL, +/* 001a */ NULL, +/* 001b */ NULL, +/* 001c */ NULL, +/* 001d */ NULL, +/* 001e */ NULL, +/* 001f */ NULL, +/* 0020 */ "space", +/* 0021 */ "exclam", +/* 0022 */ "quotedbl", +/* 0023 */ "numbersign", +/* 0024 */ "dollar", +/* 0025 */ "percent", +/* 0026 */ "ampersand", +/* 0027 */ "quotesingle", +/* 0028 */ "parenleft", +/* 0029 */ "parenright", +/* 002a */ "asterisk", +/* 002b */ "plus", +/* 002c */ "comma", +/* 002d */ "hyphen", +/* 002e */ "period", +/* 002f */ "slash", +/* 0030 */ "zero", +/* 0031 */ "one", +/* 0032 */ "two", +/* 0033 */ "three", +/* 0034 */ "four", +/* 0035 */ "five", +/* 0036 */ "six", +/* 0037 */ "seven", +/* 0038 */ "eight", +/* 0039 */ "nine", +/* 003a */ "colon", +/* 003b */ "semicolon", +/* 003c */ "less", +/* 003d */ "equal", +/* 003e */ "greater", +/* 003f */ "question", +/* 0040 */ "at", +/* 0041 */ "A", +/* 0042 */ "B", +/* 0043 */ "C", +/* 0044 */ "D", +/* 0045 */ "E", +/* 0046 */ "F", +/* 0047 */ "G", +/* 0048 */ "H", +/* 0049 */ "I", +/* 004a */ "J", +/* 004b */ "K", +/* 004c */ "L", +/* 004d */ "M", +/* 004e */ "N", +/* 004f */ "O", +/* 0050 */ "P", +/* 0051 */ "Q", +/* 0052 */ "R", +/* 0053 */ "S", +/* 0054 */ "T", +/* 0055 */ "U", +/* 0056 */ "V", +/* 0057 */ "W", +/* 0058 */ "X", +/* 0059 */ "Y", +/* 005a */ "Z", +/* 005b */ "bracketleft", +/* 005c */ "backslash", +/* 005d */ "bracketright", +/* 005e */ "asciicircum", +/* 005f */ "underscore", +/* 0060 */ "grave", +/* 0061 */ "a", +/* 0062 */ "b", +/* 0063 */ "c", +/* 0064 */ "d", +/* 0065 */ "e", +/* 0066 */ "f", +/* 0067 */ "g", +/* 0068 */ "h", +/* 0069 */ "i", +/* 006a */ "j", +/* 006b */ "k", +/* 006c */ "l", +/* 006d */ "m", +/* 006e */ "n", +/* 006f */ "o", +/* 0070 */ "p", +/* 0071 */ "q", +/* 0072 */ "r", +/* 0073 */ "s", +/* 0074 */ "t", +/* 0075 */ "u", +/* 0076 */ "v", +/* 0077 */ "w", +/* 0078 */ "x", +/* 0079 */ "y", +/* 007a */ "z", +/* 007b */ "braceleft", +/* 007c */ "bar", +/* 007d */ "braceright", +/* 007e */ "asciitilde", +/* 007f */ NULL, +/* 0080 */ NULL, +/* 0081 */ NULL, +/* 0082 */ NULL, +/* 0083 */ NULL, +/* 0084 */ NULL, +/* 0085 */ NULL, +/* 0086 */ NULL, +/* 0087 */ NULL, +/* 0088 */ NULL, +/* 0089 */ NULL, +/* 008a */ NULL, +/* 008b */ NULL, +/* 008c */ NULL, +/* 008d */ NULL, +/* 008e */ NULL, +/* 008f */ NULL, +/* 0090 */ NULL, +/* 0091 */ NULL, +/* 0092 */ NULL, +/* 0093 */ NULL, +/* 0094 */ NULL, +/* 0095 */ NULL, +/* 0096 */ NULL, +/* 0097 */ NULL, +/* 0098 */ NULL, +/* 0099 */ NULL, +/* 009a */ NULL, +/* 009b */ NULL, +/* 009c */ NULL, +/* 009d */ NULL, +/* 009e */ NULL, +/* 009f */ NULL, +/* 00a0 */ NULL, +/* 00a1 */ "exclamdown", +/* 00a2 */ "cent", +/* 00a3 */ "sterling", +/* 00a4 */ "currency", +/* 00a5 */ "yen", +/* 00a6 */ "brokenbar", +/* 00a7 */ "section", +/* 00a8 */ "dieresis", +/* 00a9 */ "copyright", +/* 00aa */ "ordfeminine", +/* 00ab */ "guillemotleft", +/* 00ac */ "logicalnot", +/* 00ad */ NULL, +/* 00ae */ "registered", +/* 00af */ "macron", +/* 00b0 */ "degree", +/* 00b1 */ "plusminus", +/* 00b2 */ NULL, +/* 00b3 */ NULL, +/* 00b4 */ "acute", +/* 00b5 */ "mu", +/* 00b6 */ "paragraph", +/* 00b7 */ "periodcentered", +/* 00b8 */ "cedilla", +/* 00b9 */ NULL, +/* 00ba */ "ordmasculine", +/* 00bb */ "guillemotright", +/* 00bc */ "onequarter", +/* 00bd */ "onehalf", +/* 00be */ "threequarters", +/* 00bf */ "questiondown", +/* 00c0 */ "Agrave", +/* 00c1 */ "Aacute", +/* 00c2 */ "Acircumflex", +/* 00c3 */ "Atilde", +/* 00c4 */ "Adieresis", +/* 00c5 */ "Aring", +/* 00c6 */ "AE", +/* 00c7 */ "Ccedilla", +/* 00c8 */ "Egrave", +/* 00c9 */ "Eacute", +/* 00ca */ "Ecircumflex", +/* 00cb */ "Edieresis", +/* 00cc */ "Igrave", +/* 00cd */ "Iacute", +/* 00ce */ "Icircumflex", +/* 00cf */ "Idieresis", +/* 00d0 */ "Eth", +/* 00d1 */ "Ntilde", +/* 00d2 */ "Ograve", +/* 00d3 */ "Oacute", +/* 00d4 */ "Ocircumflex", +/* 00d5 */ "Otilde", +/* 00d6 */ "Odieresis", +/* 00d7 */ "multiply", +/* 00d8 */ "Oslash", +/* 00d9 */ "Ugrave", +/* 00da */ "Uacute", +/* 00db */ "Ucircumflex", +/* 00dc */ "Udieresis", +/* 00dd */ "Yacute", +/* 00de */ "Thorn", +/* 00df */ "germandbls", +/* 00e0 */ "agrave", +/* 00e1 */ "aacute", +/* 00e2 */ "acircumflex", +/* 00e3 */ "atilde", +/* 00e4 */ "adieresis", +/* 00e5 */ "aring", +/* 00e6 */ "ae", +/* 00e7 */ "ccedilla", +/* 00e8 */ "egrave", +/* 00e9 */ "eacute", +/* 00ea */ "ecircumflex", +/* 00eb */ "edieresis", +/* 00ec */ "igrave", +/* 00ed */ "iacute", +/* 00ee */ "icircumflex", +/* 00ef */ "idieresis", +/* 00f0 */ "eth", +/* 00f1 */ "ntilde", +/* 00f2 */ "ograve", +/* 00f3 */ "oacute", +/* 00f4 */ "ocircumflex", +/* 00f5 */ "otilde", +/* 00f6 */ "odieresis", +/* 00f7 */ "divide", +/* 00f8 */ "oslash", +/* 00f9 */ "ugrave", +/* 00fa */ "uacute", +/* 00fb */ "ucircumflex", +/* 00fc */ "udieresis", +/* 00fd */ "yacute", +/* 00fe */ "thorn", +/* 00ff */ "ydieresis", +/* 0100 */ "Amacron", +/* 0101 */ "amacron", +/* 0102 */ "Abreve", +/* 0103 */ "abreve", +/* 0104 */ "Aogonek", +/* 0105 */ "aogonek", +/* 0106 */ "Cacute", +/* 0107 */ "cacute", +/* 0108 */ "Ccircumflex", +/* 0109 */ "ccircumflex", +/* 010a */ "Cdotaccent", +/* 010b */ "cdotaccent", +/* 010c */ "Ccaron", +/* 010d */ "ccaron", +/* 010e */ "Dcaron", +/* 010f */ "dcaron", +/* 0110 */ "Dcroat", +/* 0111 */ "dcroat", +/* 0112 */ "Emacron", +/* 0113 */ "emacron", +/* 0114 */ "Ebreve", +/* 0115 */ "ebreve", +/* 0116 */ "Edotaccent", +/* 0117 */ "edotaccent", +/* 0118 */ "Eogonek", +/* 0119 */ "eogonek", +/* 011a */ "Ecaron", +/* 011b */ "ecaron", +/* 011c */ "Gcircumflex", +/* 011d */ "gcircumflex", +/* 011e */ "Gbreve", +/* 011f */ "gbreve", +/* 0120 */ "Gdotaccent", +/* 0121 */ "gdotaccent", +/* 0122 */ "Gcommaaccent", +/* 0123 */ "gcommaaccent", +/* 0124 */ "Hcircumflex", +/* 0125 */ "hcircumflex", +/* 0126 */ "Hbar", +/* 0127 */ "hbar", +/* 0128 */ "Itilde", +/* 0129 */ "itilde", +/* 012a */ "Imacron", +/* 012b */ "imacron", +/* 012c */ "Ibreve", +/* 012d */ "ibreve", +/* 012e */ "Iogonek", +/* 012f */ "iogonek", +/* 0130 */ "Idotaccent", +/* 0131 */ "dotlessi", +/* 0132 */ "IJ", +/* 0133 */ "ij", +/* 0134 */ "Jcircumflex", +/* 0135 */ "jcircumflex", +/* 0136 */ "Kcommaaccent", +/* 0137 */ "kcommaaccent", +/* 0138 */ "kgreenlandic", +/* 0139 */ "Lacute", +/* 013a */ "lacute", +/* 013b */ "Lcommaaccent", +/* 013c */ "lcommaaccent", +/* 013d */ "Lcaron", +/* 013e */ "lcaron", +/* 013f */ "Ldot", +/* 0140 */ "ldot", +/* 0141 */ "Lslash", +/* 0142 */ "lslash", +/* 0143 */ "Nacute", +/* 0144 */ "nacute", +/* 0145 */ "Ncommaaccent", +/* 0146 */ "ncommaaccent", +/* 0147 */ "Ncaron", +/* 0148 */ "ncaron", +/* 0149 */ "napostrophe", +/* 014a */ "Eng", +/* 014b */ "eng", +/* 014c */ "Omacron", +/* 014d */ "omacron", +/* 014e */ "Obreve", +/* 014f */ "obreve", +/* 0150 */ "Ohungarumlaut", +/* 0151 */ "ohungarumlaut", +/* 0152 */ "OE", +/* 0153 */ "oe", +/* 0154 */ "Racute", +/* 0155 */ "racute", +/* 0156 */ "Rcommaaccent", +/* 0157 */ "rcommaaccent", +/* 0158 */ "Rcaron", +/* 0159 */ "rcaron", +/* 015a */ "Sacute", +/* 015b */ "sacute", +/* 015c */ "Scircumflex", +/* 015d */ "scircumflex", +/* 015e */ "Scedilla", +/* 015f */ "scedilla", +/* 0160 */ "Scaron", +/* 0161 */ "scaron", +/* 0162 */ "Tcommaaccent", +/* 0163 */ "tcommaaccent", +/* 0164 */ "Tcaron", +/* 0165 */ "tcaron", +/* 0166 */ "Tbar", +/* 0167 */ "tbar", +/* 0168 */ "Utilde", +/* 0169 */ "utilde", +/* 016a */ "Umacron", +/* 016b */ "umacron", +/* 016c */ "Ubreve", +/* 016d */ "ubreve", +/* 016e */ "Uring", +/* 016f */ "uring", +/* 0170 */ "Uhungarumlaut", +/* 0171 */ "uhungarumlaut", +/* 0172 */ "Uogonek", +/* 0173 */ "uogonek", +/* 0174 */ "Wcircumflex", +/* 0175 */ "wcircumflex", +/* 0176 */ "Ycircumflex", +/* 0177 */ "ycircumflex", +/* 0178 */ "Ydieresis", +/* 0179 */ "Zacute", +/* 017a */ "zacute", +/* 017b */ "Zdotaccent", +/* 017c */ "zdotaccent", +/* 017d */ "Zcaron", +/* 017e */ "zcaron", +/* 017f */ "longs", +/* 0180 */ NULL, +/* 0181 */ NULL, +/* 0182 */ NULL, +/* 0183 */ NULL, +/* 0184 */ NULL, +/* 0185 */ NULL, +/* 0186 */ NULL, +/* 0187 */ NULL, +/* 0188 */ NULL, +/* 0189 */ NULL, +/* 018a */ NULL, +/* 018b */ NULL, +/* 018c */ NULL, +/* 018d */ NULL, +/* 018e */ NULL, +/* 018f */ NULL, +/* 0190 */ NULL, +/* 0191 */ NULL, +/* 0192 */ "florin", +/* 0193 */ NULL, +/* 0194 */ NULL, +/* 0195 */ NULL, +/* 0196 */ NULL, +/* 0197 */ NULL, +/* 0198 */ NULL, +/* 0199 */ NULL, +/* 019a */ NULL, +/* 019b */ NULL, +/* 019c */ NULL, +/* 019d */ NULL, +/* 019e */ NULL, +/* 019f */ NULL, +/* 01a0 */ "Ohorn", +/* 01a1 */ "ohorn", +/* 01a2 */ NULL, +/* 01a3 */ NULL, +/* 01a4 */ NULL, +/* 01a5 */ NULL, +/* 01a6 */ NULL, +/* 01a7 */ NULL, +/* 01a8 */ NULL, +/* 01a9 */ NULL, +/* 01aa */ NULL, +/* 01ab */ NULL, +/* 01ac */ NULL, +/* 01ad */ NULL, +/* 01ae */ NULL, +/* 01af */ "Uhorn", +/* 01b0 */ "uhorn", +/* 01b1 */ NULL, +/* 01b2 */ NULL, +/* 01b3 */ NULL, +/* 01b4 */ NULL, +/* 01b5 */ NULL, +/* 01b6 */ NULL, +/* 01b7 */ NULL, +/* 01b8 */ NULL, +/* 01b9 */ NULL, +/* 01ba */ NULL, +/* 01bb */ NULL, +/* 01bc */ NULL, +/* 01bd */ NULL, +/* 01be */ NULL, +/* 01bf */ NULL, +/* 01c0 */ NULL, +/* 01c1 */ NULL, +/* 01c2 */ NULL, +/* 01c3 */ NULL, +/* 01c4 */ NULL, +/* 01c5 */ NULL, +/* 01c6 */ NULL, +/* 01c7 */ NULL, +/* 01c8 */ NULL, +/* 01c9 */ NULL, +/* 01ca */ NULL, +/* 01cb */ NULL, +/* 01cc */ NULL, +/* 01cd */ NULL, +/* 01ce */ NULL, +/* 01cf */ NULL, +/* 01d0 */ NULL, +/* 01d1 */ NULL, +/* 01d2 */ NULL, +/* 01d3 */ NULL, +/* 01d4 */ NULL, +/* 01d5 */ NULL, +/* 01d6 */ NULL, +/* 01d7 */ NULL, +/* 01d8 */ NULL, +/* 01d9 */ NULL, +/* 01da */ NULL, +/* 01db */ NULL, +/* 01dc */ NULL, +/* 01dd */ NULL, +/* 01de */ NULL, +/* 01df */ NULL, +/* 01e0 */ NULL, +/* 01e1 */ NULL, +/* 01e2 */ NULL, +/* 01e3 */ NULL, +/* 01e4 */ NULL, +/* 01e5 */ NULL, +/* 01e6 */ "Gcaron", +/* 01e7 */ "gcaron", +/* 01e8 */ NULL, +/* 01e9 */ NULL, +/* 01ea */ NULL, +/* 01eb */ NULL, +/* 01ec */ NULL, +/* 01ed */ NULL, +/* 01ee */ NULL, +/* 01ef */ NULL, +/* 01f0 */ NULL, +/* 01f1 */ NULL, +/* 01f2 */ NULL, +/* 01f3 */ NULL, +/* 01f4 */ NULL, +/* 01f5 */ NULL, +/* 01f6 */ NULL, +/* 01f7 */ NULL, +/* 01f8 */ NULL, +/* 01f9 */ NULL, +/* 01fa */ "Aringacute", +/* 01fb */ "aringacute", +/* 01fc */ "AEacute", +/* 01fd */ "aeacute", +/* 01fe */ "Oslashacute", +/* 01ff */ "oslashacute", +/* 0200 */ NULL, +/* 0201 */ NULL, +/* 0202 */ NULL, +/* 0203 */ NULL, +/* 0204 */ NULL, +/* 0205 */ NULL, +/* 0206 */ NULL, +/* 0207 */ NULL, +/* 0208 */ NULL, +/* 0209 */ NULL, +/* 020a */ NULL, +/* 020b */ NULL, +/* 020c */ NULL, +/* 020d */ NULL, +/* 020e */ NULL, +/* 020f */ NULL, +/* 0210 */ NULL, +/* 0211 */ NULL, +/* 0212 */ NULL, +/* 0213 */ NULL, +/* 0214 */ NULL, +/* 0215 */ NULL, +/* 0216 */ NULL, +/* 0217 */ NULL, +/* 0218 */ "Scommaaccent", +/* 0219 */ "scommaaccent", +/* 021a */ NULL, +/* 021b */ NULL, +/* 021c */ NULL, +/* 021d */ NULL, +/* 021e */ NULL, +/* 021f */ NULL, +/* 0220 */ NULL, +/* 0221 */ NULL, +/* 0222 */ NULL, +/* 0223 */ NULL, +/* 0224 */ NULL, +/* 0225 */ NULL, +/* 0226 */ NULL, +/* 0227 */ NULL, +/* 0228 */ NULL, +/* 0229 */ NULL, +/* 022a */ NULL, +/* 022b */ NULL, +/* 022c */ NULL, +/* 022d */ NULL, +/* 022e */ NULL, +/* 022f */ NULL, +/* 0230 */ NULL, +/* 0231 */ NULL, +/* 0232 */ NULL, +/* 0233 */ NULL, +/* 0234 */ NULL, +/* 0235 */ NULL, +/* 0236 */ NULL, +/* 0237 */ NULL, +/* 0238 */ NULL, +/* 0239 */ NULL, +/* 023a */ NULL, +/* 023b */ NULL, +/* 023c */ NULL, +/* 023d */ NULL, +/* 023e */ NULL, +/* 023f */ NULL, +/* 0240 */ NULL, +/* 0241 */ NULL, +/* 0242 */ NULL, +/* 0243 */ NULL, +/* 0244 */ NULL, +/* 0245 */ NULL, +/* 0246 */ NULL, +/* 0247 */ NULL, +/* 0248 */ NULL, +/* 0249 */ NULL, +/* 024a */ NULL, +/* 024b */ NULL, +/* 024c */ NULL, +/* 024d */ NULL, +/* 024e */ NULL, +/* 024f */ NULL, +/* 0250 */ NULL, +/* 0251 */ NULL, +/* 0252 */ NULL, +/* 0253 */ NULL, +/* 0254 */ NULL, +/* 0255 */ NULL, +/* 0256 */ NULL, +/* 0257 */ NULL, +/* 0258 */ NULL, +/* 0259 */ NULL, +/* 025a */ NULL, +/* 025b */ NULL, +/* 025c */ NULL, +/* 025d */ NULL, +/* 025e */ NULL, +/* 025f */ NULL, +/* 0260 */ NULL, +/* 0261 */ NULL, +/* 0262 */ NULL, +/* 0263 */ NULL, +/* 0264 */ NULL, +/* 0265 */ NULL, +/* 0266 */ NULL, +/* 0267 */ NULL, +/* 0268 */ NULL, +/* 0269 */ NULL, +/* 026a */ NULL, +/* 026b */ NULL, +/* 026c */ NULL, +/* 026d */ NULL, +/* 026e */ NULL, +/* 026f */ NULL, +/* 0270 */ NULL, +/* 0271 */ NULL, +/* 0272 */ NULL, +/* 0273 */ NULL, +/* 0274 */ NULL, +/* 0275 */ NULL, +/* 0276 */ NULL, +/* 0277 */ NULL, +/* 0278 */ NULL, +/* 0279 */ NULL, +/* 027a */ NULL, +/* 027b */ NULL, +/* 027c */ NULL, +/* 027d */ NULL, +/* 027e */ NULL, +/* 027f */ NULL, +/* 0280 */ NULL, +/* 0281 */ NULL, +/* 0282 */ NULL, +/* 0283 */ NULL, +/* 0284 */ NULL, +/* 0285 */ NULL, +/* 0286 */ NULL, +/* 0287 */ NULL, +/* 0288 */ NULL, +/* 0289 */ NULL, +/* 028a */ NULL, +/* 028b */ NULL, +/* 028c */ NULL, +/* 028d */ NULL, +/* 028e */ NULL, +/* 028f */ NULL, +/* 0290 */ NULL, +/* 0291 */ NULL, +/* 0292 */ NULL, +/* 0293 */ NULL, +/* 0294 */ NULL, +/* 0295 */ NULL, +/* 0296 */ NULL, +/* 0297 */ NULL, +/* 0298 */ NULL, +/* 0299 */ NULL, +/* 029a */ NULL, +/* 029b */ NULL, +/* 029c */ NULL, +/* 029d */ NULL, +/* 029e */ NULL, +/* 029f */ NULL, +/* 02a0 */ NULL, +/* 02a1 */ NULL, +/* 02a2 */ NULL, +/* 02a3 */ NULL, +/* 02a4 */ NULL, +/* 02a5 */ NULL, +/* 02a6 */ NULL, +/* 02a7 */ NULL, +/* 02a8 */ NULL, +/* 02a9 */ NULL, +/* 02aa */ NULL, +/* 02ab */ NULL, +/* 02ac */ NULL, +/* 02ad */ NULL, +/* 02ae */ NULL, +/* 02af */ NULL, +/* 02b0 */ NULL, +/* 02b1 */ NULL, +/* 02b2 */ NULL, +/* 02b3 */ NULL, +/* 02b4 */ NULL, +/* 02b5 */ NULL, +/* 02b6 */ NULL, +/* 02b7 */ NULL, +/* 02b8 */ NULL, +/* 02b9 */ NULL, +/* 02ba */ NULL, +/* 02bb */ NULL, +/* 02bc */ "afii57929", +/* 02bd */ "afii64937", +/* 02be */ NULL, +/* 02bf */ NULL, +/* 02c0 */ NULL, +/* 02c1 */ NULL, +/* 02c2 */ NULL, +/* 02c3 */ NULL, +/* 02c4 */ NULL, +/* 02c5 */ NULL, +/* 02c6 */ "circumflex", +/* 02c7 */ "caron", +/* 02c8 */ NULL, +/* 02c9 */ NULL, +/* 02ca */ NULL, +/* 02cb */ NULL, +/* 02cc */ NULL, +/* 02cd */ NULL, +/* 02ce */ NULL, +/* 02cf */ NULL, +/* 02d0 */ NULL, +/* 02d1 */ NULL, +/* 02d2 */ NULL, +/* 02d3 */ NULL, +/* 02d4 */ NULL, +/* 02d5 */ NULL, +/* 02d6 */ NULL, +/* 02d7 */ NULL, +/* 02d8 */ "breve", +/* 02d9 */ "dotaccent", +/* 02da */ "ring", +/* 02db */ "ogonek", +/* 02dc */ "tilde", +/* 02dd */ "hungarumlaut", +/* 02de */ NULL, +/* 02df */ NULL, +/* 02e0 */ NULL, +/* 02e1 */ NULL, +/* 02e2 */ NULL, +/* 02e3 */ NULL, +/* 02e4 */ NULL, +/* 02e5 */ NULL, +/* 02e6 */ NULL, +/* 02e7 */ NULL, +/* 02e8 */ NULL, +/* 02e9 */ NULL, +/* 02ea */ NULL, +/* 02eb */ NULL, +/* 02ec */ NULL, +/* 02ed */ NULL, +/* 02ee */ NULL, +/* 02ef */ NULL, +/* 02f0 */ NULL, +/* 02f1 */ NULL, +/* 02f2 */ NULL, +/* 02f3 */ NULL, +/* 02f4 */ NULL, +/* 02f5 */ NULL, +/* 02f6 */ NULL, +/* 02f7 */ NULL, +/* 02f8 */ NULL, +/* 02f9 */ NULL, +/* 02fa */ NULL, +/* 02fb */ NULL, +/* 02fc */ NULL, +/* 02fd */ NULL, +/* 02fe */ NULL, +/* 02ff */ NULL, +/* 0300 */ "gravecomb", +/* 0301 */ "acutecomb", +/* 0302 */ NULL, +/* 0303 */ "tildecomb", +/* 0304 */ NULL, +/* 0305 */ NULL, +/* 0306 */ NULL, +/* 0307 */ NULL, +/* 0308 */ NULL, +/* 0309 */ "hookabovecomb", +/* 030a */ NULL, +/* 030b */ NULL, +/* 030c */ NULL, +/* 030d */ NULL, +/* 030e */ NULL, +/* 030f */ NULL, +/* 0310 */ NULL, +/* 0311 */ NULL, +/* 0312 */ NULL, +/* 0313 */ NULL, +/* 0314 */ NULL, +/* 0315 */ NULL, +/* 0316 */ NULL, +/* 0317 */ NULL, +/* 0318 */ NULL, +/* 0319 */ NULL, +/* 031a */ NULL, +/* 031b */ NULL, +/* 031c */ NULL, +/* 031d */ NULL, +/* 031e */ NULL, +/* 031f */ NULL, +/* 0320 */ NULL, +/* 0321 */ NULL, +/* 0322 */ NULL, +/* 0323 */ "dotbelowcomb", +/* 0324 */ NULL, +/* 0325 */ NULL, +/* 0326 */ NULL, +/* 0327 */ NULL, +/* 0328 */ NULL, +/* 0329 */ NULL, +/* 032a */ NULL, +/* 032b */ NULL, +/* 032c */ NULL, +/* 032d */ NULL, +/* 032e */ NULL, +/* 032f */ NULL, +/* 0330 */ NULL, +/* 0331 */ NULL, +/* 0332 */ NULL, +/* 0333 */ NULL, +/* 0334 */ NULL, +/* 0335 */ NULL, +/* 0336 */ NULL, +/* 0337 */ NULL, +/* 0338 */ NULL, +/* 0339 */ NULL, +/* 033a */ NULL, +/* 033b */ NULL, +/* 033c */ NULL, +/* 033d */ NULL, +/* 033e */ NULL, +/* 033f */ NULL, +/* 0340 */ NULL, +/* 0341 */ NULL, +/* 0342 */ NULL, +/* 0343 */ NULL, +/* 0344 */ NULL, +/* 0345 */ NULL, +/* 0346 */ NULL, +/* 0347 */ NULL, +/* 0348 */ NULL, +/* 0349 */ NULL, +/* 034a */ NULL, +/* 034b */ NULL, +/* 034c */ NULL, +/* 034d */ NULL, +/* 034e */ NULL, +/* 034f */ NULL, +/* 0350 */ NULL, +/* 0351 */ NULL, +/* 0352 */ NULL, +/* 0353 */ NULL, +/* 0354 */ NULL, +/* 0355 */ NULL, +/* 0356 */ NULL, +/* 0357 */ NULL, +/* 0358 */ NULL, +/* 0359 */ NULL, +/* 035a */ NULL, +/* 035b */ NULL, +/* 035c */ NULL, +/* 035d */ NULL, +/* 035e */ NULL, +/* 035f */ NULL, +/* 0360 */ NULL, +/* 0361 */ NULL, +/* 0362 */ NULL, +/* 0363 */ NULL, +/* 0364 */ NULL, +/* 0365 */ NULL, +/* 0366 */ NULL, +/* 0367 */ NULL, +/* 0368 */ NULL, +/* 0369 */ NULL, +/* 036a */ NULL, +/* 036b */ NULL, +/* 036c */ NULL, +/* 036d */ NULL, +/* 036e */ NULL, +/* 036f */ NULL, +/* 0370 */ NULL, +/* 0371 */ NULL, +/* 0372 */ NULL, +/* 0373 */ NULL, +/* 0374 */ NULL, +/* 0375 */ NULL, +/* 0376 */ NULL, +/* 0377 */ NULL, +/* 0378 */ NULL, +/* 0379 */ NULL, +/* 037a */ NULL, +/* 037b */ NULL, +/* 037c */ NULL, +/* 037d */ NULL, +/* 037e */ NULL, +/* 037f */ NULL, +/* 0380 */ NULL, +/* 0381 */ NULL, +/* 0382 */ NULL, +/* 0383 */ NULL, +/* 0384 */ "tonos", +/* 0385 */ "dieresistonos", +/* 0386 */ "Alphatonos", +/* 0387 */ "anoteleia", +/* 0388 */ "Epsilontonos", +/* 0389 */ "Etatonos", +/* 038a */ "Iotatonos", +/* 038b */ NULL, +/* 038c */ "Omicrontonos", +/* 038d */ NULL, +/* 038e */ "Upsilontonos", +/* 038f */ "Omegatonos", +/* 0390 */ "iotadieresistonos", +/* 0391 */ "Alpha", +/* 0392 */ "Beta", +/* 0393 */ "Gamma", +/* 0394 */ NULL, +/* 0395 */ "Epsilon", +/* 0396 */ "Zeta", +/* 0397 */ "Eta", +/* 0398 */ "Theta", +/* 0399 */ "Iota", +/* 039a */ "Kappa", +/* 039b */ "Lambda", +/* 039c */ "Mu", +/* 039d */ "Nu", +/* 039e */ "Xi", +/* 039f */ "Omicron", +/* 03a0 */ "Pi", +/* 03a1 */ "Rho", +/* 03a2 */ NULL, +/* 03a3 */ "Sigma", +/* 03a4 */ "Tau", +/* 03a5 */ "Upsilon", +/* 03a6 */ "Phi", +/* 03a7 */ "Chi", +/* 03a8 */ "Psi", +/* 03a9 */ NULL, +/* 03aa */ "Iotadieresis", +/* 03ab */ "Upsilondieresis", +/* 03ac */ "alphatonos", +/* 03ad */ "epsilontonos", +/* 03ae */ "etatonos", +/* 03af */ "iotatonos", +/* 03b0 */ "upsilondieresistonos", +/* 03b1 */ "alpha", +/* 03b2 */ "beta", +/* 03b3 */ "gamma", +/* 03b4 */ "delta", +/* 03b5 */ "epsilon", +/* 03b6 */ "zeta", +/* 03b7 */ "eta", +/* 03b8 */ "theta", +/* 03b9 */ "iota", +/* 03ba */ "kappa", +/* 03bb */ "lambda", +/* 03bc */ NULL, +/* 03bd */ "nu", +/* 03be */ "xi", +/* 03bf */ "omicron", +/* 03c0 */ "pi", +/* 03c1 */ "rho", +/* 03c2 */ "sigma1", +/* 03c3 */ "sigma", +/* 03c4 */ "tau", +/* 03c5 */ "upsilon", +/* 03c6 */ "phi", +/* 03c7 */ "chi", +/* 03c8 */ "psi", +/* 03c9 */ "omega", +/* 03ca */ "iotadieresis", +/* 03cb */ "upsilondieresis", +/* 03cc */ "omicrontonos", +/* 03cd */ "upsilontonos", +/* 03ce */ "omegatonos", +/* 03cf */ NULL, +/* 03d0 */ NULL, +/* 03d1 */ "theta1", +/* 03d2 */ "Upsilon1", +/* 03d3 */ NULL, +/* 03d4 */ NULL, +/* 03d5 */ "phi1", +/* 03d6 */ "omega1", +/* 03d7 */ NULL, +/* 03d8 */ NULL, +/* 03d9 */ NULL, +/* 03da */ NULL, +/* 03db */ NULL, +/* 03dc */ NULL, +/* 03dd */ NULL, +/* 03de */ NULL, +/* 03df */ NULL, +/* 03e0 */ NULL, +/* 03e1 */ NULL, +/* 03e2 */ NULL, +/* 03e3 */ NULL, +/* 03e4 */ NULL, +/* 03e5 */ NULL, +/* 03e6 */ NULL, +/* 03e7 */ NULL, +/* 03e8 */ NULL, +/* 03e9 */ NULL, +/* 03ea */ NULL, +/* 03eb */ NULL, +/* 03ec */ NULL, +/* 03ed */ NULL, +/* 03ee */ NULL, +/* 03ef */ NULL, +/* 03f0 */ NULL, +/* 03f1 */ NULL, +/* 03f2 */ NULL, +/* 03f3 */ NULL, +/* 03f4 */ NULL, +/* 03f5 */ NULL, +/* 03f6 */ NULL, +/* 03f7 */ NULL, +/* 03f8 */ NULL, +/* 03f9 */ NULL, +/* 03fa */ NULL, +/* 03fb */ NULL, +/* 03fc */ NULL, +/* 03fd */ NULL, +/* 03fe */ NULL, +/* 03ff */ NULL, +/* 0400 */ NULL, +/* 0401 */ "afii10023", +/* 0402 */ "afii10051", +/* 0403 */ "afii10052", +/* 0404 */ "afii10053", +/* 0405 */ "afii10054", +/* 0406 */ "afii10055", +/* 0407 */ "afii10056", +/* 0408 */ "afii10057", +/* 0409 */ "afii10058", +/* 040a */ "afii10059", +/* 040b */ "afii10060", +/* 040c */ "afii10061", +/* 040d */ NULL, +/* 040e */ "afii10062", +/* 040f */ "afii10145", +/* 0410 */ "afii10017", +/* 0411 */ "afii10018", +/* 0412 */ "afii10019", +/* 0413 */ "afii10020", +/* 0414 */ "afii10021", +/* 0415 */ "afii10022", +/* 0416 */ "afii10024", +/* 0417 */ "afii10025", +/* 0418 */ "afii10026", +/* 0419 */ "afii10027", +/* 041a */ "afii10028", +/* 041b */ "afii10029", +/* 041c */ "afii10030", +/* 041d */ "afii10031", +/* 041e */ "afii10032", +/* 041f */ "afii10033", +/* 0420 */ "afii10034", +/* 0421 */ "afii10035", +/* 0422 */ "afii10036", +/* 0423 */ "afii10037", +/* 0424 */ "afii10038", +/* 0425 */ "afii10039", +/* 0426 */ "afii10040", +/* 0427 */ "afii10041", +/* 0428 */ "afii10042", +/* 0429 */ "afii10043", +/* 042a */ "afii10044", +/* 042b */ "afii10045", +/* 042c */ "afii10046", +/* 042d */ "afii10047", +/* 042e */ "afii10048", +/* 042f */ "afii10049", +/* 0430 */ "afii10065", +/* 0431 */ "afii10066", +/* 0432 */ "afii10067", +/* 0433 */ "afii10068", +/* 0434 */ "afii10069", +/* 0435 */ "afii10070", +/* 0436 */ "afii10072", +/* 0437 */ "afii10073", +/* 0438 */ "afii10074", +/* 0439 */ "afii10075", +/* 043a */ "afii10076", +/* 043b */ "afii10077", +/* 043c */ "afii10078", +/* 043d */ "afii10079", +/* 043e */ "afii10080", +/* 043f */ "afii10081", +/* 0440 */ "afii10082", +/* 0441 */ "afii10083", +/* 0442 */ "afii10084", +/* 0443 */ "afii10085", +/* 0444 */ "afii10086", +/* 0445 */ "afii10087", +/* 0446 */ "afii10088", +/* 0447 */ "afii10089", +/* 0448 */ "afii10090", +/* 0449 */ "afii10091", +/* 044a */ "afii10092", +/* 044b */ "afii10093", +/* 044c */ "afii10094", +/* 044d */ "afii10095", +/* 044e */ "afii10096", +/* 044f */ "afii10097", +/* 0450 */ NULL, +/* 0451 */ "afii10071", +/* 0452 */ "afii10099", +/* 0453 */ "afii10100", +/* 0454 */ "afii10101", +/* 0455 */ "afii10102", +/* 0456 */ "afii10103", +/* 0457 */ "afii10104", +/* 0458 */ "afii10105", +/* 0459 */ "afii10106", +/* 045a */ "afii10107", +/* 045b */ "afii10108", +/* 045c */ "afii10109", +/* 045d */ NULL, +/* 045e */ "afii10110", +/* 045f */ "afii10193", +/* 0460 */ NULL, +/* 0461 */ NULL, +/* 0462 */ "afii10146", +/* 0463 */ "afii10194", +/* 0464 */ NULL, +/* 0465 */ NULL, +/* 0466 */ NULL, +/* 0467 */ NULL, +/* 0468 */ NULL, +/* 0469 */ NULL, +/* 046a */ NULL, +/* 046b */ NULL, +/* 046c */ NULL, +/* 046d */ NULL, +/* 046e */ NULL, +/* 046f */ NULL, +/* 0470 */ NULL, +/* 0471 */ NULL, +/* 0472 */ "afii10147", +/* 0473 */ "afii10195", +/* 0474 */ "afii10148", +/* 0475 */ "afii10196", +/* 0476 */ NULL, +/* 0477 */ NULL, +/* 0478 */ NULL, +/* 0479 */ NULL, +/* 047a */ NULL, +/* 047b */ NULL, +/* 047c */ NULL, +/* 047d */ NULL, +/* 047e */ NULL, +/* 047f */ NULL, +/* 0480 */ NULL, +/* 0481 */ NULL, +/* 0482 */ NULL, +/* 0483 */ NULL, +/* 0484 */ NULL, +/* 0485 */ NULL, +/* 0486 */ NULL, +/* 0487 */ NULL, +/* 0488 */ NULL, +/* 0489 */ NULL, +/* 048a */ NULL, +/* 048b */ NULL, +/* 048c */ NULL, +/* 048d */ NULL, +/* 048e */ NULL, +/* 048f */ NULL, +/* 0490 */ "afii10050", +/* 0491 */ "afii10098", +/* 0492 */ NULL, +/* 0493 */ NULL, +/* 0494 */ NULL, +/* 0495 */ NULL, +/* 0496 */ NULL, +/* 0497 */ NULL, +/* 0498 */ NULL, +/* 0499 */ NULL, +/* 049a */ NULL, +/* 049b */ NULL, +/* 049c */ NULL, +/* 049d */ NULL, +/* 049e */ NULL, +/* 049f */ NULL, +/* 04a0 */ NULL, +/* 04a1 */ NULL, +/* 04a2 */ NULL, +/* 04a3 */ NULL, +/* 04a4 */ NULL, +/* 04a5 */ NULL, +/* 04a6 */ NULL, +/* 04a7 */ NULL, +/* 04a8 */ NULL, +/* 04a9 */ NULL, +/* 04aa */ NULL, +/* 04ab */ NULL, +/* 04ac */ NULL, +/* 04ad */ NULL, +/* 04ae */ NULL, +/* 04af */ NULL, +/* 04b0 */ NULL, +/* 04b1 */ NULL, +/* 04b2 */ NULL, +/* 04b3 */ NULL, +/* 04b4 */ NULL, +/* 04b5 */ NULL, +/* 04b6 */ NULL, +/* 04b7 */ NULL, +/* 04b8 */ NULL, +/* 04b9 */ NULL, +/* 04ba */ NULL, +/* 04bb */ NULL, +/* 04bc */ NULL, +/* 04bd */ NULL, +/* 04be */ NULL, +/* 04bf */ NULL, +/* 04c0 */ NULL, +/* 04c1 */ NULL, +/* 04c2 */ NULL, +/* 04c3 */ NULL, +/* 04c4 */ NULL, +/* 04c5 */ NULL, +/* 04c6 */ NULL, +/* 04c7 */ NULL, +/* 04c8 */ NULL, +/* 04c9 */ NULL, +/* 04ca */ NULL, +/* 04cb */ NULL, +/* 04cc */ NULL, +/* 04cd */ NULL, +/* 04ce */ NULL, +/* 04cf */ NULL, +/* 04d0 */ NULL, +/* 04d1 */ NULL, +/* 04d2 */ NULL, +/* 04d3 */ NULL, +/* 04d4 */ NULL, +/* 04d5 */ NULL, +/* 04d6 */ NULL, +/* 04d7 */ NULL, +/* 04d8 */ NULL, +/* 04d9 */ "afii10846", +/* 04da */ NULL, +/* 04db */ NULL, +/* 04dc */ NULL, +/* 04dd */ NULL, +/* 04de */ NULL, +/* 04df */ NULL, +/* 04e0 */ NULL, +/* 04e1 */ NULL, +/* 04e2 */ NULL, +/* 04e3 */ NULL, +/* 04e4 */ NULL, +/* 04e5 */ NULL, +/* 04e6 */ NULL, +/* 04e7 */ NULL, +/* 04e8 */ NULL, +/* 04e9 */ NULL, +/* 04ea */ NULL, +/* 04eb */ NULL, +/* 04ec */ NULL, +/* 04ed */ NULL, +/* 04ee */ NULL, +/* 04ef */ NULL, +/* 04f0 */ NULL, +/* 04f1 */ NULL, +/* 04f2 */ NULL, +/* 04f3 */ NULL, +/* 04f4 */ NULL, +/* 04f5 */ NULL, +/* 04f6 */ NULL, +/* 04f7 */ NULL, +/* 04f8 */ NULL, +/* 04f9 */ NULL, +/* 04fa */ NULL, +/* 04fb */ NULL, +/* 04fc */ NULL, +/* 04fd */ NULL, +/* 04fe */ NULL, +/* 04ff */ NULL, +/* 0500 */ NULL, +/* 0501 */ NULL, +/* 0502 */ NULL, +/* 0503 */ NULL, +/* 0504 */ NULL, +/* 0505 */ NULL, +/* 0506 */ NULL, +/* 0507 */ NULL, +/* 0508 */ NULL, +/* 0509 */ NULL, +/* 050a */ NULL, +/* 050b */ NULL, +/* 050c */ NULL, +/* 050d */ NULL, +/* 050e */ NULL, +/* 050f */ NULL, +/* 0510 */ NULL, +/* 0511 */ NULL, +/* 0512 */ NULL, +/* 0513 */ NULL, +/* 0514 */ NULL, +/* 0515 */ NULL, +/* 0516 */ NULL, +/* 0517 */ NULL, +/* 0518 */ NULL, +/* 0519 */ NULL, +/* 051a */ NULL, +/* 051b */ NULL, +/* 051c */ NULL, +/* 051d */ NULL, +/* 051e */ NULL, +/* 051f */ NULL, +/* 0520 */ NULL, +/* 0521 */ NULL, +/* 0522 */ NULL, +/* 0523 */ NULL, +/* 0524 */ NULL, +/* 0525 */ NULL, +/* 0526 */ NULL, +/* 0527 */ NULL, +/* 0528 */ NULL, +/* 0529 */ NULL, +/* 052a */ NULL, +/* 052b */ NULL, +/* 052c */ NULL, +/* 052d */ NULL, +/* 052e */ NULL, +/* 052f */ NULL, +/* 0530 */ NULL, +/* 0531 */ NULL, +/* 0532 */ NULL, +/* 0533 */ NULL, +/* 0534 */ NULL, +/* 0535 */ NULL, +/* 0536 */ NULL, +/* 0537 */ NULL, +/* 0538 */ NULL, +/* 0539 */ NULL, +/* 053a */ NULL, +/* 053b */ NULL, +/* 053c */ NULL, +/* 053d */ NULL, +/* 053e */ NULL, +/* 053f */ NULL, +/* 0540 */ NULL, +/* 0541 */ NULL, +/* 0542 */ NULL, +/* 0543 */ NULL, +/* 0544 */ NULL, +/* 0545 */ NULL, +/* 0546 */ NULL, +/* 0547 */ NULL, +/* 0548 */ NULL, +/* 0549 */ NULL, +/* 054a */ NULL, +/* 054b */ NULL, +/* 054c */ NULL, +/* 054d */ NULL, +/* 054e */ NULL, +/* 054f */ NULL, +/* 0550 */ NULL, +/* 0551 */ NULL, +/* 0552 */ NULL, +/* 0553 */ NULL, +/* 0554 */ NULL, +/* 0555 */ NULL, +/* 0556 */ NULL, +/* 0557 */ NULL, +/* 0558 */ NULL, +/* 0559 */ NULL, +/* 055a */ NULL, +/* 055b */ NULL, +/* 055c */ NULL, +/* 055d */ NULL, +/* 055e */ NULL, +/* 055f */ NULL, +/* 0560 */ NULL, +/* 0561 */ NULL, +/* 0562 */ NULL, +/* 0563 */ NULL, +/* 0564 */ NULL, +/* 0565 */ NULL, +/* 0566 */ NULL, +/* 0567 */ NULL, +/* 0568 */ NULL, +/* 0569 */ NULL, +/* 056a */ NULL, +/* 056b */ NULL, +/* 056c */ NULL, +/* 056d */ NULL, +/* 056e */ NULL, +/* 056f */ NULL, +/* 0570 */ NULL, +/* 0571 */ NULL, +/* 0572 */ NULL, +/* 0573 */ NULL, +/* 0574 */ NULL, +/* 0575 */ NULL, +/* 0576 */ NULL, +/* 0577 */ NULL, +/* 0578 */ NULL, +/* 0579 */ NULL, +/* 057a */ NULL, +/* 057b */ NULL, +/* 057c */ NULL, +/* 057d */ NULL, +/* 057e */ NULL, +/* 057f */ NULL, +/* 0580 */ NULL, +/* 0581 */ NULL, +/* 0582 */ NULL, +/* 0583 */ NULL, +/* 0584 */ NULL, +/* 0585 */ NULL, +/* 0586 */ NULL, +/* 0587 */ NULL, +/* 0588 */ NULL, +/* 0589 */ NULL, +/* 058a */ NULL, +/* 058b */ NULL, +/* 058c */ NULL, +/* 058d */ NULL, +/* 058e */ NULL, +/* 058f */ NULL, +/* 0590 */ NULL, +/* 0591 */ NULL, +/* 0592 */ NULL, +/* 0593 */ NULL, +/* 0594 */ NULL, +/* 0595 */ NULL, +/* 0596 */ NULL, +/* 0597 */ NULL, +/* 0598 */ NULL, +/* 0599 */ NULL, +/* 059a */ NULL, +/* 059b */ NULL, +/* 059c */ NULL, +/* 059d */ NULL, +/* 059e */ NULL, +/* 059f */ NULL, +/* 05a0 */ NULL, +/* 05a1 */ NULL, +/* 05a2 */ NULL, +/* 05a3 */ NULL, +/* 05a4 */ NULL, +/* 05a5 */ NULL, +/* 05a6 */ NULL, +/* 05a7 */ NULL, +/* 05a8 */ NULL, +/* 05a9 */ NULL, +/* 05aa */ NULL, +/* 05ab */ NULL, +/* 05ac */ NULL, +/* 05ad */ NULL, +/* 05ae */ NULL, +/* 05af */ NULL, +/* 05b0 */ "afii57799", +/* 05b1 */ "afii57801", +/* 05b2 */ "afii57800", +/* 05b3 */ "afii57802", +/* 05b4 */ "afii57793", +/* 05b5 */ "afii57794", +/* 05b6 */ "afii57795", +/* 05b7 */ "afii57798", +/* 05b8 */ "afii57797", +/* 05b9 */ "afii57806", +/* 05ba */ NULL, +/* 05bb */ "afii57796", +/* 05bc */ "afii57807", +/* 05bd */ "afii57839", +/* 05be */ "afii57645", +/* 05bf */ "afii57841", +/* 05c0 */ "afii57842", +/* 05c1 */ "afii57804", +/* 05c2 */ "afii57803", +/* 05c3 */ "afii57658", +/* 05c4 */ NULL, +/* 05c5 */ NULL, +/* 05c6 */ NULL, +/* 05c7 */ NULL, +/* 05c8 */ NULL, +/* 05c9 */ NULL, +/* 05ca */ NULL, +/* 05cb */ NULL, +/* 05cc */ NULL, +/* 05cd */ NULL, +/* 05ce */ NULL, +/* 05cf */ NULL, +/* 05d0 */ "afii57664", +/* 05d1 */ "afii57665", +/* 05d2 */ "afii57666", +/* 05d3 */ "afii57667", +/* 05d4 */ "afii57668", +/* 05d5 */ "afii57669", +/* 05d6 */ "afii57670", +/* 05d7 */ "afii57671", +/* 05d8 */ "afii57672", +/* 05d9 */ "afii57673", +/* 05da */ "afii57674", +/* 05db */ "afii57675", +/* 05dc */ "afii57676", +/* 05dd */ "afii57677", +/* 05de */ "afii57678", +/* 05df */ "afii57679", +/* 05e0 */ "afii57680", +/* 05e1 */ "afii57681", +/* 05e2 */ "afii57682", +/* 05e3 */ "afii57683", +/* 05e4 */ "afii57684", +/* 05e5 */ "afii57685", +/* 05e6 */ "afii57686", +/* 05e7 */ "afii57687", +/* 05e8 */ "afii57688", +/* 05e9 */ "afii57689", +/* 05ea */ "afii57690", +/* 05eb */ NULL, +/* 05ec */ NULL, +/* 05ed */ NULL, +/* 05ee */ NULL, +/* 05ef */ NULL, +/* 05f0 */ "afii57716", +/* 05f1 */ "afii57717", +/* 05f2 */ "afii57718", +/* 05f3 */ NULL, +/* 05f4 */ NULL, +/* 05f5 */ NULL, +/* 05f6 */ NULL, +/* 05f7 */ NULL, +/* 05f8 */ NULL, +/* 05f9 */ NULL, +/* 05fa */ NULL, +/* 05fb */ NULL, +/* 05fc */ NULL, +/* 05fd */ NULL, +/* 05fe */ NULL, +/* 05ff */ NULL, +/* 0600 */ NULL, +/* 0601 */ NULL, +/* 0602 */ NULL, +/* 0603 */ NULL, +/* 0604 */ NULL, +/* 0605 */ NULL, +/* 0606 */ NULL, +/* 0607 */ NULL, +/* 0608 */ NULL, +/* 0609 */ NULL, +/* 060a */ NULL, +/* 060b */ NULL, +/* 060c */ "afii57388", +/* 060d */ NULL, +/* 060e */ NULL, +/* 060f */ NULL, +/* 0610 */ NULL, +/* 0611 */ NULL, +/* 0612 */ NULL, +/* 0613 */ NULL, +/* 0614 */ NULL, +/* 0615 */ NULL, +/* 0616 */ NULL, +/* 0617 */ NULL, +/* 0618 */ NULL, +/* 0619 */ NULL, +/* 061a */ NULL, +/* 061b */ "afii57403", +/* 061c */ NULL, +/* 061d */ NULL, +/* 061e */ NULL, +/* 061f */ "afii57407", +/* 0620 */ NULL, +/* 0621 */ "afii57409", +/* 0622 */ "afii57410", +/* 0623 */ "afii57411", +/* 0624 */ "afii57412", +/* 0625 */ "afii57413", +/* 0626 */ "afii57414", +/* 0627 */ "afii57415", +/* 0628 */ "afii57416", +/* 0629 */ "afii57417", +/* 062a */ "afii57418", +/* 062b */ "afii57419", +/* 062c */ "afii57420", +/* 062d */ "afii57421", +/* 062e */ "afii57422", +/* 062f */ "afii57423", +/* 0630 */ "afii57424", +/* 0631 */ "afii57425", +/* 0632 */ "afii57426", +/* 0633 */ "afii57427", +/* 0634 */ "afii57428", +/* 0635 */ "afii57429", +/* 0636 */ "afii57430", +/* 0637 */ "afii57431", +/* 0638 */ "afii57432", +/* 0639 */ "afii57433", +/* 063a */ "afii57434", +/* 063b */ NULL, +/* 063c */ NULL, +/* 063d */ NULL, +/* 063e */ NULL, +/* 063f */ NULL, +/* 0640 */ "afii57440", +/* 0641 */ "afii57441", +/* 0642 */ "afii57442", +/* 0643 */ "afii57443", +/* 0644 */ "afii57444", +/* 0645 */ "afii57445", +/* 0646 */ "afii57446", +/* 0647 */ "afii57470", +/* 0648 */ "afii57448", +/* 0649 */ "afii57449", +/* 064a */ "afii57450", +/* 064b */ "afii57451", +/* 064c */ "afii57452", +/* 064d */ "afii57453", +/* 064e */ "afii57454", +/* 064f */ "afii57455", +/* 0650 */ "afii57456", +/* 0651 */ "afii57457", +/* 0652 */ "afii57458", +/* 0653 */ NULL, +/* 0654 */ NULL, +/* 0655 */ NULL, +/* 0656 */ NULL, +/* 0657 */ NULL, +/* 0658 */ NULL, +/* 0659 */ NULL, +/* 065a */ NULL, +/* 065b */ NULL, +/* 065c */ NULL, +/* 065d */ NULL, +/* 065e */ NULL, +/* 065f */ NULL, +/* 0660 */ "afii57392", +/* 0661 */ "afii57393", +/* 0662 */ "afii57394", +/* 0663 */ "afii57395", +/* 0664 */ "afii57396", +/* 0665 */ "afii57397", +/* 0666 */ "afii57398", +/* 0667 */ "afii57399", +/* 0668 */ "afii57400", +/* 0669 */ "afii57401", +/* 066a */ "afii57381", +/* 066b */ NULL, +/* 066c */ NULL, +/* 066d */ "afii63167", +/* 066e */ NULL, +/* 066f */ NULL, +/* 0670 */ NULL, +/* 0671 */ NULL, +/* 0672 */ NULL, +/* 0673 */ NULL, +/* 0674 */ NULL, +/* 0675 */ NULL, +/* 0676 */ NULL, +/* 0677 */ NULL, +/* 0678 */ NULL, +/* 0679 */ "afii57511", +/* 067a */ NULL, +/* 067b */ NULL, +/* 067c */ NULL, +/* 067d */ NULL, +/* 067e */ "afii57506", +/* 067f */ NULL, +/* 0680 */ NULL, +/* 0681 */ NULL, +/* 0682 */ NULL, +/* 0683 */ NULL, +/* 0684 */ NULL, +/* 0685 */ NULL, +/* 0686 */ "afii57507", +/* 0687 */ NULL, +/* 0688 */ "afii57512", +/* 0689 */ NULL, +/* 068a */ NULL, +/* 068b */ NULL, +/* 068c */ NULL, +/* 068d */ NULL, +/* 068e */ NULL, +/* 068f */ NULL, +/* 0690 */ NULL, +/* 0691 */ "afii57513", +/* 0692 */ NULL, +/* 0693 */ NULL, +/* 0694 */ NULL, +/* 0695 */ NULL, +/* 0696 */ NULL, +/* 0697 */ NULL, +/* 0698 */ "afii57508", +/* 0699 */ NULL, +/* 069a */ NULL, +/* 069b */ NULL, +/* 069c */ NULL, +/* 069d */ NULL, +/* 069e */ NULL, +/* 069f */ NULL, +/* 06a0 */ NULL, +/* 06a1 */ NULL, +/* 06a2 */ NULL, +/* 06a3 */ NULL, +/* 06a4 */ "afii57505", +/* 06a5 */ NULL, +/* 06a6 */ NULL, +/* 06a7 */ NULL, +/* 06a8 */ NULL, +/* 06a9 */ NULL, +/* 06aa */ NULL, +/* 06ab */ NULL, +/* 06ac */ NULL, +/* 06ad */ NULL, +/* 06ae */ NULL, +/* 06af */ "afii57509", +/* 06b0 */ NULL, +/* 06b1 */ NULL, +/* 06b2 */ NULL, +/* 06b3 */ NULL, +/* 06b4 */ NULL, +/* 06b5 */ NULL, +/* 06b6 */ NULL, +/* 06b7 */ NULL, +/* 06b8 */ NULL, +/* 06b9 */ NULL, +/* 06ba */ "afii57514", +/* 06bb */ NULL, +/* 06bc */ NULL, +/* 06bd */ NULL, +/* 06be */ NULL, +/* 06bf */ NULL, +/* 06c0 */ NULL, +/* 06c1 */ NULL, +/* 06c2 */ NULL, +/* 06c3 */ NULL, +/* 06c4 */ NULL, +/* 06c5 */ NULL, +/* 06c6 */ NULL, +/* 06c7 */ NULL, +/* 06c8 */ NULL, +/* 06c9 */ NULL, +/* 06ca */ NULL, +/* 06cb */ NULL, +/* 06cc */ NULL, +/* 06cd */ NULL, +/* 06ce */ NULL, +/* 06cf */ NULL, +/* 06d0 */ NULL, +/* 06d1 */ NULL, +/* 06d2 */ "afii57519", +/* 06d3 */ NULL, +/* 06d4 */ NULL, +/* 06d5 */ "afii57534", +/* 06d6 */ NULL, +/* 06d7 */ NULL, +/* 06d8 */ NULL, +/* 06d9 */ NULL, +/* 06da */ NULL, +/* 06db */ NULL, +/* 06dc */ NULL, +/* 06dd */ NULL, +/* 06de */ NULL, +/* 06df */ NULL, +/* 06e0 */ NULL, +/* 06e1 */ NULL, +/* 06e2 */ NULL, +/* 06e3 */ NULL, +/* 06e4 */ NULL, +/* 06e5 */ NULL, +/* 06e6 */ NULL, +/* 06e7 */ NULL, +/* 06e8 */ NULL, +/* 06e9 */ NULL, +/* 06ea */ NULL, +/* 06eb */ NULL, +/* 06ec */ NULL, +/* 06ed */ NULL, +/* 06ee */ NULL, +/* 06ef */ NULL, +/* 06f0 */ NULL, +/* 06f1 */ NULL, +/* 06f2 */ NULL, +/* 06f3 */ NULL, +/* 06f4 */ NULL, +/* 06f5 */ NULL, +/* 06f6 */ NULL, +/* 06f7 */ NULL, +/* 06f8 */ NULL, +/* 06f9 */ NULL, +/* 06fa */ NULL, +/* 06fb */ NULL, +/* 06fc */ NULL, +/* 06fd */ NULL, +/* 06fe */ NULL, +/* 06ff */ NULL, +/* 0700 */ NULL, +/* 0701 */ NULL, +/* 0702 */ NULL, +/* 0703 */ NULL, +/* 0704 */ NULL, +/* 0705 */ NULL, +/* 0706 */ NULL, +/* 0707 */ NULL, +/* 0708 */ NULL, +/* 0709 */ NULL, +/* 070a */ NULL, +/* 070b */ NULL, +/* 070c */ NULL, +/* 070d */ NULL, +/* 070e */ NULL, +/* 070f */ NULL, +/* 0710 */ NULL, +/* 0711 */ NULL, +/* 0712 */ NULL, +/* 0713 */ NULL, +/* 0714 */ NULL, +/* 0715 */ NULL, +/* 0716 */ NULL, +/* 0717 */ NULL, +/* 0718 */ NULL, +/* 0719 */ NULL, +/* 071a */ NULL, +/* 071b */ NULL, +/* 071c */ NULL, +/* 071d */ NULL, +/* 071e */ NULL, +/* 071f */ NULL, +/* 0720 */ NULL, +/* 0721 */ NULL, +/* 0722 */ NULL, +/* 0723 */ NULL, +/* 0724 */ NULL, +/* 0725 */ NULL, +/* 0726 */ NULL, +/* 0727 */ NULL, +/* 0728 */ NULL, +/* 0729 */ NULL, +/* 072a */ NULL, +/* 072b */ NULL, +/* 072c */ NULL, +/* 072d */ NULL, +/* 072e */ NULL, +/* 072f */ NULL, +/* 0730 */ NULL, +/* 0731 */ NULL, +/* 0732 */ NULL, +/* 0733 */ NULL, +/* 0734 */ NULL, +/* 0735 */ NULL, +/* 0736 */ NULL, +/* 0737 */ NULL, +/* 0738 */ NULL, +/* 0739 */ NULL, +/* 073a */ NULL, +/* 073b */ NULL, +/* 073c */ NULL, +/* 073d */ NULL, +/* 073e */ NULL, +/* 073f */ NULL, +/* 0740 */ NULL, +/* 0741 */ NULL, +/* 0742 */ NULL, +/* 0743 */ NULL, +/* 0744 */ NULL, +/* 0745 */ NULL, +/* 0746 */ NULL, +/* 0747 */ NULL, +/* 0748 */ NULL, +/* 0749 */ NULL, +/* 074a */ NULL, +/* 074b */ NULL, +/* 074c */ NULL, +/* 074d */ NULL, +/* 074e */ NULL, +/* 074f */ NULL, +/* 0750 */ NULL, +/* 0751 */ NULL, +/* 0752 */ NULL, +/* 0753 */ NULL, +/* 0754 */ NULL, +/* 0755 */ NULL, +/* 0756 */ NULL, +/* 0757 */ NULL, +/* 0758 */ NULL, +/* 0759 */ NULL, +/* 075a */ NULL, +/* 075b */ NULL, +/* 075c */ NULL, +/* 075d */ NULL, +/* 075e */ NULL, +/* 075f */ NULL, +/* 0760 */ NULL, +/* 0761 */ NULL, +/* 0762 */ NULL, +/* 0763 */ NULL, +/* 0764 */ NULL, +/* 0765 */ NULL, +/* 0766 */ NULL, +/* 0767 */ NULL, +/* 0768 */ NULL, +/* 0769 */ NULL, +/* 076a */ NULL, +/* 076b */ NULL, +/* 076c */ NULL, +/* 076d */ NULL, +/* 076e */ NULL, +/* 076f */ NULL, +/* 0770 */ NULL, +/* 0771 */ NULL, +/* 0772 */ NULL, +/* 0773 */ NULL, +/* 0774 */ NULL, +/* 0775 */ NULL, +/* 0776 */ NULL, +/* 0777 */ NULL, +/* 0778 */ NULL, +/* 0779 */ NULL, +/* 077a */ NULL, +/* 077b */ NULL, +/* 077c */ NULL, +/* 077d */ NULL, +/* 077e */ NULL, +/* 077f */ NULL, +/* 0780 */ NULL, +/* 0781 */ NULL, +/* 0782 */ NULL, +/* 0783 */ NULL, +/* 0784 */ NULL, +/* 0785 */ NULL, +/* 0786 */ NULL, +/* 0787 */ NULL, +/* 0788 */ NULL, +/* 0789 */ NULL, +/* 078a */ NULL, +/* 078b */ NULL, +/* 078c */ NULL, +/* 078d */ NULL, +/* 078e */ NULL, +/* 078f */ NULL, +/* 0790 */ NULL, +/* 0791 */ NULL, +/* 0792 */ NULL, +/* 0793 */ NULL, +/* 0794 */ NULL, +/* 0795 */ NULL, +/* 0796 */ NULL, +/* 0797 */ NULL, +/* 0798 */ NULL, +/* 0799 */ NULL, +/* 079a */ NULL, +/* 079b */ NULL, +/* 079c */ NULL, +/* 079d */ NULL, +/* 079e */ NULL, +/* 079f */ NULL, +/* 07a0 */ NULL, +/* 07a1 */ NULL, +/* 07a2 */ NULL, +/* 07a3 */ NULL, +/* 07a4 */ NULL, +/* 07a5 */ NULL, +/* 07a6 */ NULL, +/* 07a7 */ NULL, +/* 07a8 */ NULL, +/* 07a9 */ NULL, +/* 07aa */ NULL, +/* 07ab */ NULL, +/* 07ac */ NULL, +/* 07ad */ NULL, +/* 07ae */ NULL, +/* 07af */ NULL, +/* 07b0 */ NULL, +/* 07b1 */ NULL, +/* 07b2 */ NULL, +/* 07b3 */ NULL, +/* 07b4 */ NULL, +/* 07b5 */ NULL, +/* 07b6 */ NULL, +/* 07b7 */ NULL, +/* 07b8 */ NULL, +/* 07b9 */ NULL, +/* 07ba */ NULL, +/* 07bb */ NULL, +/* 07bc */ NULL, +/* 07bd */ NULL, +/* 07be */ NULL, +/* 07bf */ NULL, +/* 07c0 */ NULL, +/* 07c1 */ NULL, +/* 07c2 */ NULL, +/* 07c3 */ NULL, +/* 07c4 */ NULL, +/* 07c5 */ NULL, +/* 07c6 */ NULL, +/* 07c7 */ NULL, +/* 07c8 */ NULL, +/* 07c9 */ NULL, +/* 07ca */ NULL, +/* 07cb */ NULL, +/* 07cc */ NULL, +/* 07cd */ NULL, +/* 07ce */ NULL, +/* 07cf */ NULL, +/* 07d0 */ NULL, +/* 07d1 */ NULL, +/* 07d2 */ NULL, +/* 07d3 */ NULL, +/* 07d4 */ NULL, +/* 07d5 */ NULL, +/* 07d6 */ NULL, +/* 07d7 */ NULL, +/* 07d8 */ NULL, +/* 07d9 */ NULL, +/* 07da */ NULL, +/* 07db */ NULL, +/* 07dc */ NULL, +/* 07dd */ NULL, +/* 07de */ NULL, +/* 07df */ NULL, +/* 07e0 */ NULL, +/* 07e1 */ NULL, +/* 07e2 */ NULL, +/* 07e3 */ NULL, +/* 07e4 */ NULL, +/* 07e5 */ NULL, +/* 07e6 */ NULL, +/* 07e7 */ NULL, +/* 07e8 */ NULL, +/* 07e9 */ NULL, +/* 07ea */ NULL, +/* 07eb */ NULL, +/* 07ec */ NULL, +/* 07ed */ NULL, +/* 07ee */ NULL, +/* 07ef */ NULL, +/* 07f0 */ NULL, +/* 07f1 */ NULL, +/* 07f2 */ NULL, +/* 07f3 */ NULL, +/* 07f4 */ NULL, +/* 07f5 */ NULL, +/* 07f6 */ NULL, +/* 07f7 */ NULL, +/* 07f8 */ NULL, +/* 07f9 */ NULL, +/* 07fa */ NULL, +/* 07fb */ NULL, +/* 07fc */ NULL, +/* 07fd */ NULL, +/* 07fe */ NULL, +/* 07ff */ NULL, +/* 0800 */ NULL, +/* 0801 */ NULL, +/* 0802 */ NULL, +/* 0803 */ NULL, +/* 0804 */ NULL, +/* 0805 */ NULL, +/* 0806 */ NULL, +/* 0807 */ NULL, +/* 0808 */ NULL, +/* 0809 */ NULL, +/* 080a */ NULL, +/* 080b */ NULL, +/* 080c */ NULL, +/* 080d */ NULL, +/* 080e */ NULL, +/* 080f */ NULL, +/* 0810 */ NULL, +/* 0811 */ NULL, +/* 0812 */ NULL, +/* 0813 */ NULL, +/* 0814 */ NULL, +/* 0815 */ NULL, +/* 0816 */ NULL, +/* 0817 */ NULL, +/* 0818 */ NULL, +/* 0819 */ NULL, +/* 081a */ NULL, +/* 081b */ NULL, +/* 081c */ NULL, +/* 081d */ NULL, +/* 081e */ NULL, +/* 081f */ NULL, +/* 0820 */ NULL, +/* 0821 */ NULL, +/* 0822 */ NULL, +/* 0823 */ NULL, +/* 0824 */ NULL, +/* 0825 */ NULL, +/* 0826 */ NULL, +/* 0827 */ NULL, +/* 0828 */ NULL, +/* 0829 */ NULL, +/* 082a */ NULL, +/* 082b */ NULL, +/* 082c */ NULL, +/* 082d */ NULL, +/* 082e */ NULL, +/* 082f */ NULL, +/* 0830 */ NULL, +/* 0831 */ NULL, +/* 0832 */ NULL, +/* 0833 */ NULL, +/* 0834 */ NULL, +/* 0835 */ NULL, +/* 0836 */ NULL, +/* 0837 */ NULL, +/* 0838 */ NULL, +/* 0839 */ NULL, +/* 083a */ NULL, +/* 083b */ NULL, +/* 083c */ NULL, +/* 083d */ NULL, +/* 083e */ NULL, +/* 083f */ NULL, +/* 0840 */ NULL, +/* 0841 */ NULL, +/* 0842 */ NULL, +/* 0843 */ NULL, +/* 0844 */ NULL, +/* 0845 */ NULL, +/* 0846 */ NULL, +/* 0847 */ NULL, +/* 0848 */ NULL, +/* 0849 */ NULL, +/* 084a */ NULL, +/* 084b */ NULL, +/* 084c */ NULL, +/* 084d */ NULL, +/* 084e */ NULL, +/* 084f */ NULL, +/* 0850 */ NULL, +/* 0851 */ NULL, +/* 0852 */ NULL, +/* 0853 */ NULL, +/* 0854 */ NULL, +/* 0855 */ NULL, +/* 0856 */ NULL, +/* 0857 */ NULL, +/* 0858 */ NULL, +/* 0859 */ NULL, +/* 085a */ NULL, +/* 085b */ NULL, +/* 085c */ NULL, +/* 085d */ NULL, +/* 085e */ NULL, +/* 085f */ NULL, +/* 0860 */ NULL, +/* 0861 */ NULL, +/* 0862 */ NULL, +/* 0863 */ NULL, +/* 0864 */ NULL, +/* 0865 */ NULL, +/* 0866 */ NULL, +/* 0867 */ NULL, +/* 0868 */ NULL, +/* 0869 */ NULL, +/* 086a */ NULL, +/* 086b */ NULL, +/* 086c */ NULL, +/* 086d */ NULL, +/* 086e */ NULL, +/* 086f */ NULL, +/* 0870 */ NULL, +/* 0871 */ NULL, +/* 0872 */ NULL, +/* 0873 */ NULL, +/* 0874 */ NULL, +/* 0875 */ NULL, +/* 0876 */ NULL, +/* 0877 */ NULL, +/* 0878 */ NULL, +/* 0879 */ NULL, +/* 087a */ NULL, +/* 087b */ NULL, +/* 087c */ NULL, +/* 087d */ NULL, +/* 087e */ NULL, +/* 087f */ NULL, +/* 0880 */ NULL, +/* 0881 */ NULL, +/* 0882 */ NULL, +/* 0883 */ NULL, +/* 0884 */ NULL, +/* 0885 */ NULL, +/* 0886 */ NULL, +/* 0887 */ NULL, +/* 0888 */ NULL, +/* 0889 */ NULL, +/* 088a */ NULL, +/* 088b */ NULL, +/* 088c */ NULL, +/* 088d */ NULL, +/* 088e */ NULL, +/* 088f */ NULL, +/* 0890 */ NULL, +/* 0891 */ NULL, +/* 0892 */ NULL, +/* 0893 */ NULL, +/* 0894 */ NULL, +/* 0895 */ NULL, +/* 0896 */ NULL, +/* 0897 */ NULL, +/* 0898 */ NULL, +/* 0899 */ NULL, +/* 089a */ NULL, +/* 089b */ NULL, +/* 089c */ NULL, +/* 089d */ NULL, +/* 089e */ NULL, +/* 089f */ NULL, +/* 08a0 */ NULL, +/* 08a1 */ NULL, +/* 08a2 */ NULL, +/* 08a3 */ NULL, +/* 08a4 */ NULL, +/* 08a5 */ NULL, +/* 08a6 */ NULL, +/* 08a7 */ NULL, +/* 08a8 */ NULL, +/* 08a9 */ NULL, +/* 08aa */ NULL, +/* 08ab */ NULL, +/* 08ac */ NULL, +/* 08ad */ NULL, +/* 08ae */ NULL, +/* 08af */ NULL, +/* 08b0 */ NULL, +/* 08b1 */ NULL, +/* 08b2 */ NULL, +/* 08b3 */ NULL, +/* 08b4 */ NULL, +/* 08b5 */ NULL, +/* 08b6 */ NULL, +/* 08b7 */ NULL, +/* 08b8 */ NULL, +/* 08b9 */ NULL, +/* 08ba */ NULL, +/* 08bb */ NULL, +/* 08bc */ NULL, +/* 08bd */ NULL, +/* 08be */ NULL, +/* 08bf */ NULL, +/* 08c0 */ NULL, +/* 08c1 */ NULL, +/* 08c2 */ NULL, +/* 08c3 */ NULL, +/* 08c4 */ NULL, +/* 08c5 */ NULL, +/* 08c6 */ NULL, +/* 08c7 */ NULL, +/* 08c8 */ NULL, +/* 08c9 */ NULL, +/* 08ca */ NULL, +/* 08cb */ NULL, +/* 08cc */ NULL, +/* 08cd */ NULL, +/* 08ce */ NULL, +/* 08cf */ NULL, +/* 08d0 */ NULL, +/* 08d1 */ NULL, +/* 08d2 */ NULL, +/* 08d3 */ NULL, +/* 08d4 */ NULL, +/* 08d5 */ NULL, +/* 08d6 */ NULL, +/* 08d7 */ NULL, +/* 08d8 */ NULL, +/* 08d9 */ NULL, +/* 08da */ NULL, +/* 08db */ NULL, +/* 08dc */ NULL, +/* 08dd */ NULL, +/* 08de */ NULL, +/* 08df */ NULL, +/* 08e0 */ NULL, +/* 08e1 */ NULL, +/* 08e2 */ NULL, +/* 08e3 */ NULL, +/* 08e4 */ NULL, +/* 08e5 */ NULL, +/* 08e6 */ NULL, +/* 08e7 */ NULL, +/* 08e8 */ NULL, +/* 08e9 */ NULL, +/* 08ea */ NULL, +/* 08eb */ NULL, +/* 08ec */ NULL, +/* 08ed */ NULL, +/* 08ee */ NULL, +/* 08ef */ NULL, +/* 08f0 */ NULL, +/* 08f1 */ NULL, +/* 08f2 */ NULL, +/* 08f3 */ NULL, +/* 08f4 */ NULL, +/* 08f5 */ NULL, +/* 08f6 */ NULL, +/* 08f7 */ NULL, +/* 08f8 */ NULL, +/* 08f9 */ NULL, +/* 08fa */ NULL, +/* 08fb */ NULL, +/* 08fc */ NULL, +/* 08fd */ NULL, +/* 08fe */ NULL, +/* 08ff */ NULL, +/* 0900 */ NULL, +/* 0901 */ NULL, +/* 0902 */ NULL, +/* 0903 */ NULL, +/* 0904 */ NULL, +/* 0905 */ NULL, +/* 0906 */ NULL, +/* 0907 */ NULL, +/* 0908 */ NULL, +/* 0909 */ NULL, +/* 090a */ NULL, +/* 090b */ NULL, +/* 090c */ NULL, +/* 090d */ NULL, +/* 090e */ NULL, +/* 090f */ NULL, +/* 0910 */ NULL, +/* 0911 */ NULL, +/* 0912 */ NULL, +/* 0913 */ NULL, +/* 0914 */ NULL, +/* 0915 */ NULL, +/* 0916 */ NULL, +/* 0917 */ NULL, +/* 0918 */ NULL, +/* 0919 */ NULL, +/* 091a */ NULL, +/* 091b */ NULL, +/* 091c */ NULL, +/* 091d */ NULL, +/* 091e */ NULL, +/* 091f */ NULL, +/* 0920 */ NULL, +/* 0921 */ NULL, +/* 0922 */ NULL, +/* 0923 */ NULL, +/* 0924 */ NULL, +/* 0925 */ NULL, +/* 0926 */ NULL, +/* 0927 */ NULL, +/* 0928 */ NULL, +/* 0929 */ NULL, +/* 092a */ NULL, +/* 092b */ NULL, +/* 092c */ NULL, +/* 092d */ NULL, +/* 092e */ NULL, +/* 092f */ NULL, +/* 0930 */ NULL, +/* 0931 */ NULL, +/* 0932 */ NULL, +/* 0933 */ NULL, +/* 0934 */ NULL, +/* 0935 */ NULL, +/* 0936 */ NULL, +/* 0937 */ NULL, +/* 0938 */ NULL, +/* 0939 */ NULL, +/* 093a */ NULL, +/* 093b */ NULL, +/* 093c */ NULL, +/* 093d */ NULL, +/* 093e */ NULL, +/* 093f */ NULL, +/* 0940 */ NULL, +/* 0941 */ NULL, +/* 0942 */ NULL, +/* 0943 */ NULL, +/* 0944 */ NULL, +/* 0945 */ NULL, +/* 0946 */ NULL, +/* 0947 */ NULL, +/* 0948 */ NULL, +/* 0949 */ NULL, +/* 094a */ NULL, +/* 094b */ NULL, +/* 094c */ NULL, +/* 094d */ NULL, +/* 094e */ NULL, +/* 094f */ NULL, +/* 0950 */ NULL, +/* 0951 */ NULL, +/* 0952 */ NULL, +/* 0953 */ NULL, +/* 0954 */ NULL, +/* 0955 */ NULL, +/* 0956 */ NULL, +/* 0957 */ NULL, +/* 0958 */ NULL, +/* 0959 */ NULL, +/* 095a */ NULL, +/* 095b */ NULL, +/* 095c */ NULL, +/* 095d */ NULL, +/* 095e */ NULL, +/* 095f */ NULL, +/* 0960 */ NULL, +/* 0961 */ NULL, +/* 0962 */ NULL, +/* 0963 */ NULL, +/* 0964 */ NULL, +/* 0965 */ NULL, +/* 0966 */ NULL, +/* 0967 */ NULL, +/* 0968 */ NULL, +/* 0969 */ NULL, +/* 096a */ NULL, +/* 096b */ NULL, +/* 096c */ NULL, +/* 096d */ NULL, +/* 096e */ NULL, +/* 096f */ NULL, +/* 0970 */ NULL, +/* 0971 */ NULL, +/* 0972 */ NULL, +/* 0973 */ NULL, +/* 0974 */ NULL, +/* 0975 */ NULL, +/* 0976 */ NULL, +/* 0977 */ NULL, +/* 0978 */ NULL, +/* 0979 */ NULL, +/* 097a */ NULL, +/* 097b */ NULL, +/* 097c */ NULL, +/* 097d */ NULL, +/* 097e */ NULL, +/* 097f */ NULL, +/* 0980 */ NULL, +/* 0981 */ NULL, +/* 0982 */ NULL, +/* 0983 */ NULL, +/* 0984 */ NULL, +/* 0985 */ NULL, +/* 0986 */ NULL, +/* 0987 */ NULL, +/* 0988 */ NULL, +/* 0989 */ NULL, +/* 098a */ NULL, +/* 098b */ NULL, +/* 098c */ NULL, +/* 098d */ NULL, +/* 098e */ NULL, +/* 098f */ NULL, +/* 0990 */ NULL, +/* 0991 */ NULL, +/* 0992 */ NULL, +/* 0993 */ NULL, +/* 0994 */ NULL, +/* 0995 */ NULL, +/* 0996 */ NULL, +/* 0997 */ NULL, +/* 0998 */ NULL, +/* 0999 */ NULL, +/* 099a */ NULL, +/* 099b */ NULL, +/* 099c */ NULL, +/* 099d */ NULL, +/* 099e */ NULL, +/* 099f */ NULL, +/* 09a0 */ NULL, +/* 09a1 */ NULL, +/* 09a2 */ NULL, +/* 09a3 */ NULL, +/* 09a4 */ NULL, +/* 09a5 */ NULL, +/* 09a6 */ NULL, +/* 09a7 */ NULL, +/* 09a8 */ NULL, +/* 09a9 */ NULL, +/* 09aa */ NULL, +/* 09ab */ NULL, +/* 09ac */ NULL, +/* 09ad */ NULL, +/* 09ae */ NULL, +/* 09af */ NULL, +/* 09b0 */ NULL, +/* 09b1 */ NULL, +/* 09b2 */ NULL, +/* 09b3 */ NULL, +/* 09b4 */ NULL, +/* 09b5 */ NULL, +/* 09b6 */ NULL, +/* 09b7 */ NULL, +/* 09b8 */ NULL, +/* 09b9 */ NULL, +/* 09ba */ NULL, +/* 09bb */ NULL, +/* 09bc */ NULL, +/* 09bd */ NULL, +/* 09be */ NULL, +/* 09bf */ NULL, +/* 09c0 */ NULL, +/* 09c1 */ NULL, +/* 09c2 */ NULL, +/* 09c3 */ NULL, +/* 09c4 */ NULL, +/* 09c5 */ NULL, +/* 09c6 */ NULL, +/* 09c7 */ NULL, +/* 09c8 */ NULL, +/* 09c9 */ NULL, +/* 09ca */ NULL, +/* 09cb */ NULL, +/* 09cc */ NULL, +/* 09cd */ NULL, +/* 09ce */ NULL, +/* 09cf */ NULL, +/* 09d0 */ NULL, +/* 09d1 */ NULL, +/* 09d2 */ NULL, +/* 09d3 */ NULL, +/* 09d4 */ NULL, +/* 09d5 */ NULL, +/* 09d6 */ NULL, +/* 09d7 */ NULL, +/* 09d8 */ NULL, +/* 09d9 */ NULL, +/* 09da */ NULL, +/* 09db */ NULL, +/* 09dc */ NULL, +/* 09dd */ NULL, +/* 09de */ NULL, +/* 09df */ NULL, +/* 09e0 */ NULL, +/* 09e1 */ NULL, +/* 09e2 */ NULL, +/* 09e3 */ NULL, +/* 09e4 */ NULL, +/* 09e5 */ NULL, +/* 09e6 */ NULL, +/* 09e7 */ NULL, +/* 09e8 */ NULL, +/* 09e9 */ NULL, +/* 09ea */ NULL, +/* 09eb */ NULL, +/* 09ec */ NULL, +/* 09ed */ NULL, +/* 09ee */ NULL, +/* 09ef */ NULL, +/* 09f0 */ NULL, +/* 09f1 */ NULL, +/* 09f2 */ NULL, +/* 09f3 */ NULL, +/* 09f4 */ NULL, +/* 09f5 */ NULL, +/* 09f6 */ NULL, +/* 09f7 */ NULL, +/* 09f8 */ NULL, +/* 09f9 */ NULL, +/* 09fa */ NULL, +/* 09fb */ NULL, +/* 09fc */ NULL, +/* 09fd */ NULL, +/* 09fe */ NULL, +/* 09ff */ NULL, +/* 0a00 */ NULL, +/* 0a01 */ NULL, +/* 0a02 */ NULL, +/* 0a03 */ NULL, +/* 0a04 */ NULL, +/* 0a05 */ NULL, +/* 0a06 */ NULL, +/* 0a07 */ NULL, +/* 0a08 */ NULL, +/* 0a09 */ NULL, +/* 0a0a */ NULL, +/* 0a0b */ NULL, +/* 0a0c */ NULL, +/* 0a0d */ NULL, +/* 0a0e */ NULL, +/* 0a0f */ NULL, +/* 0a10 */ NULL, +/* 0a11 */ NULL, +/* 0a12 */ NULL, +/* 0a13 */ NULL, +/* 0a14 */ NULL, +/* 0a15 */ NULL, +/* 0a16 */ NULL, +/* 0a17 */ NULL, +/* 0a18 */ NULL, +/* 0a19 */ NULL, +/* 0a1a */ NULL, +/* 0a1b */ NULL, +/* 0a1c */ NULL, +/* 0a1d */ NULL, +/* 0a1e */ NULL, +/* 0a1f */ NULL, +/* 0a20 */ NULL, +/* 0a21 */ NULL, +/* 0a22 */ NULL, +/* 0a23 */ NULL, +/* 0a24 */ NULL, +/* 0a25 */ NULL, +/* 0a26 */ NULL, +/* 0a27 */ NULL, +/* 0a28 */ NULL, +/* 0a29 */ NULL, +/* 0a2a */ NULL, +/* 0a2b */ NULL, +/* 0a2c */ NULL, +/* 0a2d */ NULL, +/* 0a2e */ NULL, +/* 0a2f */ NULL, +/* 0a30 */ NULL, +/* 0a31 */ NULL, +/* 0a32 */ NULL, +/* 0a33 */ NULL, +/* 0a34 */ NULL, +/* 0a35 */ NULL, +/* 0a36 */ NULL, +/* 0a37 */ NULL, +/* 0a38 */ NULL, +/* 0a39 */ NULL, +/* 0a3a */ NULL, +/* 0a3b */ NULL, +/* 0a3c */ NULL, +/* 0a3d */ NULL, +/* 0a3e */ NULL, +/* 0a3f */ NULL, +/* 0a40 */ NULL, +/* 0a41 */ NULL, +/* 0a42 */ NULL, +/* 0a43 */ NULL, +/* 0a44 */ NULL, +/* 0a45 */ NULL, +/* 0a46 */ NULL, +/* 0a47 */ NULL, +/* 0a48 */ NULL, +/* 0a49 */ NULL, +/* 0a4a */ NULL, +/* 0a4b */ NULL, +/* 0a4c */ NULL, +/* 0a4d */ NULL, +/* 0a4e */ NULL, +/* 0a4f */ NULL, +/* 0a50 */ NULL, +/* 0a51 */ NULL, +/* 0a52 */ NULL, +/* 0a53 */ NULL, +/* 0a54 */ NULL, +/* 0a55 */ NULL, +/* 0a56 */ NULL, +/* 0a57 */ NULL, +/* 0a58 */ NULL, +/* 0a59 */ NULL, +/* 0a5a */ NULL, +/* 0a5b */ NULL, +/* 0a5c */ NULL, +/* 0a5d */ NULL, +/* 0a5e */ NULL, +/* 0a5f */ NULL, +/* 0a60 */ NULL, +/* 0a61 */ NULL, +/* 0a62 */ NULL, +/* 0a63 */ NULL, +/* 0a64 */ NULL, +/* 0a65 */ NULL, +/* 0a66 */ NULL, +/* 0a67 */ NULL, +/* 0a68 */ NULL, +/* 0a69 */ NULL, +/* 0a6a */ NULL, +/* 0a6b */ NULL, +/* 0a6c */ NULL, +/* 0a6d */ NULL, +/* 0a6e */ NULL, +/* 0a6f */ NULL, +/* 0a70 */ NULL, +/* 0a71 */ NULL, +/* 0a72 */ NULL, +/* 0a73 */ NULL, +/* 0a74 */ NULL, +/* 0a75 */ NULL, +/* 0a76 */ NULL, +/* 0a77 */ NULL, +/* 0a78 */ NULL, +/* 0a79 */ NULL, +/* 0a7a */ NULL, +/* 0a7b */ NULL, +/* 0a7c */ NULL, +/* 0a7d */ NULL, +/* 0a7e */ NULL, +/* 0a7f */ NULL, +/* 0a80 */ NULL, +/* 0a81 */ NULL, +/* 0a82 */ NULL, +/* 0a83 */ NULL, +/* 0a84 */ NULL, +/* 0a85 */ NULL, +/* 0a86 */ NULL, +/* 0a87 */ NULL, +/* 0a88 */ NULL, +/* 0a89 */ NULL, +/* 0a8a */ NULL, +/* 0a8b */ NULL, +/* 0a8c */ NULL, +/* 0a8d */ NULL, +/* 0a8e */ NULL, +/* 0a8f */ NULL, +/* 0a90 */ NULL, +/* 0a91 */ NULL, +/* 0a92 */ NULL, +/* 0a93 */ NULL, +/* 0a94 */ NULL, +/* 0a95 */ NULL, +/* 0a96 */ NULL, +/* 0a97 */ NULL, +/* 0a98 */ NULL, +/* 0a99 */ NULL, +/* 0a9a */ NULL, +/* 0a9b */ NULL, +/* 0a9c */ NULL, +/* 0a9d */ NULL, +/* 0a9e */ NULL, +/* 0a9f */ NULL, +/* 0aa0 */ NULL, +/* 0aa1 */ NULL, +/* 0aa2 */ NULL, +/* 0aa3 */ NULL, +/* 0aa4 */ NULL, +/* 0aa5 */ NULL, +/* 0aa6 */ NULL, +/* 0aa7 */ NULL, +/* 0aa8 */ NULL, +/* 0aa9 */ NULL, +/* 0aaa */ NULL, +/* 0aab */ NULL, +/* 0aac */ NULL, +/* 0aad */ NULL, +/* 0aae */ NULL, +/* 0aaf */ NULL, +/* 0ab0 */ NULL, +/* 0ab1 */ NULL, +/* 0ab2 */ NULL, +/* 0ab3 */ NULL, +/* 0ab4 */ NULL, +/* 0ab5 */ NULL, +/* 0ab6 */ NULL, +/* 0ab7 */ NULL, +/* 0ab8 */ NULL, +/* 0ab9 */ NULL, +/* 0aba */ NULL, +/* 0abb */ NULL, +/* 0abc */ NULL, +/* 0abd */ NULL, +/* 0abe */ NULL, +/* 0abf */ NULL, +/* 0ac0 */ NULL, +/* 0ac1 */ NULL, +/* 0ac2 */ NULL, +/* 0ac3 */ NULL, +/* 0ac4 */ NULL, +/* 0ac5 */ NULL, +/* 0ac6 */ NULL, +/* 0ac7 */ NULL, +/* 0ac8 */ NULL, +/* 0ac9 */ NULL, +/* 0aca */ NULL, +/* 0acb */ NULL, +/* 0acc */ NULL, +/* 0acd */ NULL, +/* 0ace */ NULL, +/* 0acf */ NULL, +/* 0ad0 */ NULL, +/* 0ad1 */ NULL, +/* 0ad2 */ NULL, +/* 0ad3 */ NULL, +/* 0ad4 */ NULL, +/* 0ad5 */ NULL, +/* 0ad6 */ NULL, +/* 0ad7 */ NULL, +/* 0ad8 */ NULL, +/* 0ad9 */ NULL, +/* 0ada */ NULL, +/* 0adb */ NULL, +/* 0adc */ NULL, +/* 0add */ NULL, +/* 0ade */ NULL, +/* 0adf */ NULL, +/* 0ae0 */ NULL, +/* 0ae1 */ NULL, +/* 0ae2 */ NULL, +/* 0ae3 */ NULL, +/* 0ae4 */ NULL, +/* 0ae5 */ NULL, +/* 0ae6 */ NULL, +/* 0ae7 */ NULL, +/* 0ae8 */ NULL, +/* 0ae9 */ NULL, +/* 0aea */ NULL, +/* 0aeb */ NULL, +/* 0aec */ NULL, +/* 0aed */ NULL, +/* 0aee */ NULL, +/* 0aef */ NULL, +/* 0af0 */ NULL, +/* 0af1 */ NULL, +/* 0af2 */ NULL, +/* 0af3 */ NULL, +/* 0af4 */ NULL, +/* 0af5 */ NULL, +/* 0af6 */ NULL, +/* 0af7 */ NULL, +/* 0af8 */ NULL, +/* 0af9 */ NULL, +/* 0afa */ NULL, +/* 0afb */ NULL, +/* 0afc */ NULL, +/* 0afd */ NULL, +/* 0afe */ NULL, +/* 0aff */ NULL, +/* 0b00 */ NULL, +/* 0b01 */ NULL, +/* 0b02 */ NULL, +/* 0b03 */ NULL, +/* 0b04 */ NULL, +/* 0b05 */ NULL, +/* 0b06 */ NULL, +/* 0b07 */ NULL, +/* 0b08 */ NULL, +/* 0b09 */ NULL, +/* 0b0a */ NULL, +/* 0b0b */ NULL, +/* 0b0c */ NULL, +/* 0b0d */ NULL, +/* 0b0e */ NULL, +/* 0b0f */ NULL, +/* 0b10 */ NULL, +/* 0b11 */ NULL, +/* 0b12 */ NULL, +/* 0b13 */ NULL, +/* 0b14 */ NULL, +/* 0b15 */ NULL, +/* 0b16 */ NULL, +/* 0b17 */ NULL, +/* 0b18 */ NULL, +/* 0b19 */ NULL, +/* 0b1a */ NULL, +/* 0b1b */ NULL, +/* 0b1c */ NULL, +/* 0b1d */ NULL, +/* 0b1e */ NULL, +/* 0b1f */ NULL, +/* 0b20 */ NULL, +/* 0b21 */ NULL, +/* 0b22 */ NULL, +/* 0b23 */ NULL, +/* 0b24 */ NULL, +/* 0b25 */ NULL, +/* 0b26 */ NULL, +/* 0b27 */ NULL, +/* 0b28 */ NULL, +/* 0b29 */ NULL, +/* 0b2a */ NULL, +/* 0b2b */ NULL, +/* 0b2c */ NULL, +/* 0b2d */ NULL, +/* 0b2e */ NULL, +/* 0b2f */ NULL, +/* 0b30 */ NULL, +/* 0b31 */ NULL, +/* 0b32 */ NULL, +/* 0b33 */ NULL, +/* 0b34 */ NULL, +/* 0b35 */ NULL, +/* 0b36 */ NULL, +/* 0b37 */ NULL, +/* 0b38 */ NULL, +/* 0b39 */ NULL, +/* 0b3a */ NULL, +/* 0b3b */ NULL, +/* 0b3c */ NULL, +/* 0b3d */ NULL, +/* 0b3e */ NULL, +/* 0b3f */ NULL, +/* 0b40 */ NULL, +/* 0b41 */ NULL, +/* 0b42 */ NULL, +/* 0b43 */ NULL, +/* 0b44 */ NULL, +/* 0b45 */ NULL, +/* 0b46 */ NULL, +/* 0b47 */ NULL, +/* 0b48 */ NULL, +/* 0b49 */ NULL, +/* 0b4a */ NULL, +/* 0b4b */ NULL, +/* 0b4c */ NULL, +/* 0b4d */ NULL, +/* 0b4e */ NULL, +/* 0b4f */ NULL, +/* 0b50 */ NULL, +/* 0b51 */ NULL, +/* 0b52 */ NULL, +/* 0b53 */ NULL, +/* 0b54 */ NULL, +/* 0b55 */ NULL, +/* 0b56 */ NULL, +/* 0b57 */ NULL, +/* 0b58 */ NULL, +/* 0b59 */ NULL, +/* 0b5a */ NULL, +/* 0b5b */ NULL, +/* 0b5c */ NULL, +/* 0b5d */ NULL, +/* 0b5e */ NULL, +/* 0b5f */ NULL, +/* 0b60 */ NULL, +/* 0b61 */ NULL, +/* 0b62 */ NULL, +/* 0b63 */ NULL, +/* 0b64 */ NULL, +/* 0b65 */ NULL, +/* 0b66 */ NULL, +/* 0b67 */ NULL, +/* 0b68 */ NULL, +/* 0b69 */ NULL, +/* 0b6a */ NULL, +/* 0b6b */ NULL, +/* 0b6c */ NULL, +/* 0b6d */ NULL, +/* 0b6e */ NULL, +/* 0b6f */ NULL, +/* 0b70 */ NULL, +/* 0b71 */ NULL, +/* 0b72 */ NULL, +/* 0b73 */ NULL, +/* 0b74 */ NULL, +/* 0b75 */ NULL, +/* 0b76 */ NULL, +/* 0b77 */ NULL, +/* 0b78 */ NULL, +/* 0b79 */ NULL, +/* 0b7a */ NULL, +/* 0b7b */ NULL, +/* 0b7c */ NULL, +/* 0b7d */ NULL, +/* 0b7e */ NULL, +/* 0b7f */ NULL, +/* 0b80 */ NULL, +/* 0b81 */ NULL, +/* 0b82 */ NULL, +/* 0b83 */ NULL, +/* 0b84 */ NULL, +/* 0b85 */ NULL, +/* 0b86 */ NULL, +/* 0b87 */ NULL, +/* 0b88 */ NULL, +/* 0b89 */ NULL, +/* 0b8a */ NULL, +/* 0b8b */ NULL, +/* 0b8c */ NULL, +/* 0b8d */ NULL, +/* 0b8e */ NULL, +/* 0b8f */ NULL, +/* 0b90 */ NULL, +/* 0b91 */ NULL, +/* 0b92 */ NULL, +/* 0b93 */ NULL, +/* 0b94 */ NULL, +/* 0b95 */ NULL, +/* 0b96 */ NULL, +/* 0b97 */ NULL, +/* 0b98 */ NULL, +/* 0b99 */ NULL, +/* 0b9a */ NULL, +/* 0b9b */ NULL, +/* 0b9c */ NULL, +/* 0b9d */ NULL, +/* 0b9e */ NULL, +/* 0b9f */ NULL, +/* 0ba0 */ NULL, +/* 0ba1 */ NULL, +/* 0ba2 */ NULL, +/* 0ba3 */ NULL, +/* 0ba4 */ NULL, +/* 0ba5 */ NULL, +/* 0ba6 */ NULL, +/* 0ba7 */ NULL, +/* 0ba8 */ NULL, +/* 0ba9 */ NULL, +/* 0baa */ NULL, +/* 0bab */ NULL, +/* 0bac */ NULL, +/* 0bad */ NULL, +/* 0bae */ NULL, +/* 0baf */ NULL, +/* 0bb0 */ NULL, +/* 0bb1 */ NULL, +/* 0bb2 */ NULL, +/* 0bb3 */ NULL, +/* 0bb4 */ NULL, +/* 0bb5 */ NULL, +/* 0bb6 */ NULL, +/* 0bb7 */ NULL, +/* 0bb8 */ NULL, +/* 0bb9 */ NULL, +/* 0bba */ NULL, +/* 0bbb */ NULL, +/* 0bbc */ NULL, +/* 0bbd */ NULL, +/* 0bbe */ NULL, +/* 0bbf */ NULL, +/* 0bc0 */ NULL, +/* 0bc1 */ NULL, +/* 0bc2 */ NULL, +/* 0bc3 */ NULL, +/* 0bc4 */ NULL, +/* 0bc5 */ NULL, +/* 0bc6 */ NULL, +/* 0bc7 */ NULL, +/* 0bc8 */ NULL, +/* 0bc9 */ NULL, +/* 0bca */ NULL, +/* 0bcb */ NULL, +/* 0bcc */ NULL, +/* 0bcd */ NULL, +/* 0bce */ NULL, +/* 0bcf */ NULL, +/* 0bd0 */ NULL, +/* 0bd1 */ NULL, +/* 0bd2 */ NULL, +/* 0bd3 */ NULL, +/* 0bd4 */ NULL, +/* 0bd5 */ NULL, +/* 0bd6 */ NULL, +/* 0bd7 */ NULL, +/* 0bd8 */ NULL, +/* 0bd9 */ NULL, +/* 0bda */ NULL, +/* 0bdb */ NULL, +/* 0bdc */ NULL, +/* 0bdd */ NULL, +/* 0bde */ NULL, +/* 0bdf */ NULL, +/* 0be0 */ NULL, +/* 0be1 */ NULL, +/* 0be2 */ NULL, +/* 0be3 */ NULL, +/* 0be4 */ NULL, +/* 0be5 */ NULL, +/* 0be6 */ NULL, +/* 0be7 */ NULL, +/* 0be8 */ NULL, +/* 0be9 */ NULL, +/* 0bea */ NULL, +/* 0beb */ NULL, +/* 0bec */ NULL, +/* 0bed */ NULL, +/* 0bee */ NULL, +/* 0bef */ NULL, +/* 0bf0 */ NULL, +/* 0bf1 */ NULL, +/* 0bf2 */ NULL, +/* 0bf3 */ NULL, +/* 0bf4 */ NULL, +/* 0bf5 */ NULL, +/* 0bf6 */ NULL, +/* 0bf7 */ NULL, +/* 0bf8 */ NULL, +/* 0bf9 */ NULL, +/* 0bfa */ NULL, +/* 0bfb */ NULL, +/* 0bfc */ NULL, +/* 0bfd */ NULL, +/* 0bfe */ NULL, +/* 0bff */ NULL, +/* 0c00 */ NULL, +/* 0c01 */ NULL, +/* 0c02 */ NULL, +/* 0c03 */ NULL, +/* 0c04 */ NULL, +/* 0c05 */ NULL, +/* 0c06 */ NULL, +/* 0c07 */ NULL, +/* 0c08 */ NULL, +/* 0c09 */ NULL, +/* 0c0a */ NULL, +/* 0c0b */ NULL, +/* 0c0c */ NULL, +/* 0c0d */ NULL, +/* 0c0e */ NULL, +/* 0c0f */ NULL, +/* 0c10 */ NULL, +/* 0c11 */ NULL, +/* 0c12 */ NULL, +/* 0c13 */ NULL, +/* 0c14 */ NULL, +/* 0c15 */ NULL, +/* 0c16 */ NULL, +/* 0c17 */ NULL, +/* 0c18 */ NULL, +/* 0c19 */ NULL, +/* 0c1a */ NULL, +/* 0c1b */ NULL, +/* 0c1c */ NULL, +/* 0c1d */ NULL, +/* 0c1e */ NULL, +/* 0c1f */ NULL, +/* 0c20 */ NULL, +/* 0c21 */ NULL, +/* 0c22 */ NULL, +/* 0c23 */ NULL, +/* 0c24 */ NULL, +/* 0c25 */ NULL, +/* 0c26 */ NULL, +/* 0c27 */ NULL, +/* 0c28 */ NULL, +/* 0c29 */ NULL, +/* 0c2a */ NULL, +/* 0c2b */ NULL, +/* 0c2c */ NULL, +/* 0c2d */ NULL, +/* 0c2e */ NULL, +/* 0c2f */ NULL, +/* 0c30 */ NULL, +/* 0c31 */ NULL, +/* 0c32 */ NULL, +/* 0c33 */ NULL, +/* 0c34 */ NULL, +/* 0c35 */ NULL, +/* 0c36 */ NULL, +/* 0c37 */ NULL, +/* 0c38 */ NULL, +/* 0c39 */ NULL, +/* 0c3a */ NULL, +/* 0c3b */ NULL, +/* 0c3c */ NULL, +/* 0c3d */ NULL, +/* 0c3e */ NULL, +/* 0c3f */ NULL, +/* 0c40 */ NULL, +/* 0c41 */ NULL, +/* 0c42 */ NULL, +/* 0c43 */ NULL, +/* 0c44 */ NULL, +/* 0c45 */ NULL, +/* 0c46 */ NULL, +/* 0c47 */ NULL, +/* 0c48 */ NULL, +/* 0c49 */ NULL, +/* 0c4a */ NULL, +/* 0c4b */ NULL, +/* 0c4c */ NULL, +/* 0c4d */ NULL, +/* 0c4e */ NULL, +/* 0c4f */ NULL, +/* 0c50 */ NULL, +/* 0c51 */ NULL, +/* 0c52 */ NULL, +/* 0c53 */ NULL, +/* 0c54 */ NULL, +/* 0c55 */ NULL, +/* 0c56 */ NULL, +/* 0c57 */ NULL, +/* 0c58 */ NULL, +/* 0c59 */ NULL, +/* 0c5a */ NULL, +/* 0c5b */ NULL, +/* 0c5c */ NULL, +/* 0c5d */ NULL, +/* 0c5e */ NULL, +/* 0c5f */ NULL, +/* 0c60 */ NULL, +/* 0c61 */ NULL, +/* 0c62 */ NULL, +/* 0c63 */ NULL, +/* 0c64 */ NULL, +/* 0c65 */ NULL, +/* 0c66 */ NULL, +/* 0c67 */ NULL, +/* 0c68 */ NULL, +/* 0c69 */ NULL, +/* 0c6a */ NULL, +/* 0c6b */ NULL, +/* 0c6c */ NULL, +/* 0c6d */ NULL, +/* 0c6e */ NULL, +/* 0c6f */ NULL, +/* 0c70 */ NULL, +/* 0c71 */ NULL, +/* 0c72 */ NULL, +/* 0c73 */ NULL, +/* 0c74 */ NULL, +/* 0c75 */ NULL, +/* 0c76 */ NULL, +/* 0c77 */ NULL, +/* 0c78 */ NULL, +/* 0c79 */ NULL, +/* 0c7a */ NULL, +/* 0c7b */ NULL, +/* 0c7c */ NULL, +/* 0c7d */ NULL, +/* 0c7e */ NULL, +/* 0c7f */ NULL, +/* 0c80 */ NULL, +/* 0c81 */ NULL, +/* 0c82 */ NULL, +/* 0c83 */ NULL, +/* 0c84 */ NULL, +/* 0c85 */ NULL, +/* 0c86 */ NULL, +/* 0c87 */ NULL, +/* 0c88 */ NULL, +/* 0c89 */ NULL, +/* 0c8a */ NULL, +/* 0c8b */ NULL, +/* 0c8c */ NULL, +/* 0c8d */ NULL, +/* 0c8e */ NULL, +/* 0c8f */ NULL, +/* 0c90 */ NULL, +/* 0c91 */ NULL, +/* 0c92 */ NULL, +/* 0c93 */ NULL, +/* 0c94 */ NULL, +/* 0c95 */ NULL, +/* 0c96 */ NULL, +/* 0c97 */ NULL, +/* 0c98 */ NULL, +/* 0c99 */ NULL, +/* 0c9a */ NULL, +/* 0c9b */ NULL, +/* 0c9c */ NULL, +/* 0c9d */ NULL, +/* 0c9e */ NULL, +/* 0c9f */ NULL, +/* 0ca0 */ NULL, +/* 0ca1 */ NULL, +/* 0ca2 */ NULL, +/* 0ca3 */ NULL, +/* 0ca4 */ NULL, +/* 0ca5 */ NULL, +/* 0ca6 */ NULL, +/* 0ca7 */ NULL, +/* 0ca8 */ NULL, +/* 0ca9 */ NULL, +/* 0caa */ NULL, +/* 0cab */ NULL, +/* 0cac */ NULL, +/* 0cad */ NULL, +/* 0cae */ NULL, +/* 0caf */ NULL, +/* 0cb0 */ NULL, +/* 0cb1 */ NULL, +/* 0cb2 */ NULL, +/* 0cb3 */ NULL, +/* 0cb4 */ NULL, +/* 0cb5 */ NULL, +/* 0cb6 */ NULL, +/* 0cb7 */ NULL, +/* 0cb8 */ NULL, +/* 0cb9 */ NULL, +/* 0cba */ NULL, +/* 0cbb */ NULL, +/* 0cbc */ NULL, +/* 0cbd */ NULL, +/* 0cbe */ NULL, +/* 0cbf */ NULL, +/* 0cc0 */ NULL, +/* 0cc1 */ NULL, +/* 0cc2 */ NULL, +/* 0cc3 */ NULL, +/* 0cc4 */ NULL, +/* 0cc5 */ NULL, +/* 0cc6 */ NULL, +/* 0cc7 */ NULL, +/* 0cc8 */ NULL, +/* 0cc9 */ NULL, +/* 0cca */ NULL, +/* 0ccb */ NULL, +/* 0ccc */ NULL, +/* 0ccd */ NULL, +/* 0cce */ NULL, +/* 0ccf */ NULL, +/* 0cd0 */ NULL, +/* 0cd1 */ NULL, +/* 0cd2 */ NULL, +/* 0cd3 */ NULL, +/* 0cd4 */ NULL, +/* 0cd5 */ NULL, +/* 0cd6 */ NULL, +/* 0cd7 */ NULL, +/* 0cd8 */ NULL, +/* 0cd9 */ NULL, +/* 0cda */ NULL, +/* 0cdb */ NULL, +/* 0cdc */ NULL, +/* 0cdd */ NULL, +/* 0cde */ NULL, +/* 0cdf */ NULL, +/* 0ce0 */ NULL, +/* 0ce1 */ NULL, +/* 0ce2 */ NULL, +/* 0ce3 */ NULL, +/* 0ce4 */ NULL, +/* 0ce5 */ NULL, +/* 0ce6 */ NULL, +/* 0ce7 */ NULL, +/* 0ce8 */ NULL, +/* 0ce9 */ NULL, +/* 0cea */ NULL, +/* 0ceb */ NULL, +/* 0cec */ NULL, +/* 0ced */ NULL, +/* 0cee */ NULL, +/* 0cef */ NULL, +/* 0cf0 */ NULL, +/* 0cf1 */ NULL, +/* 0cf2 */ NULL, +/* 0cf3 */ NULL, +/* 0cf4 */ NULL, +/* 0cf5 */ NULL, +/* 0cf6 */ NULL, +/* 0cf7 */ NULL, +/* 0cf8 */ NULL, +/* 0cf9 */ NULL, +/* 0cfa */ NULL, +/* 0cfb */ NULL, +/* 0cfc */ NULL, +/* 0cfd */ NULL, +/* 0cfe */ NULL, +/* 0cff */ NULL, +/* 0d00 */ NULL, +/* 0d01 */ NULL, +/* 0d02 */ NULL, +/* 0d03 */ NULL, +/* 0d04 */ NULL, +/* 0d05 */ NULL, +/* 0d06 */ NULL, +/* 0d07 */ NULL, +/* 0d08 */ NULL, +/* 0d09 */ NULL, +/* 0d0a */ NULL, +/* 0d0b */ NULL, +/* 0d0c */ NULL, +/* 0d0d */ NULL, +/* 0d0e */ NULL, +/* 0d0f */ NULL, +/* 0d10 */ NULL, +/* 0d11 */ NULL, +/* 0d12 */ NULL, +/* 0d13 */ NULL, +/* 0d14 */ NULL, +/* 0d15 */ NULL, +/* 0d16 */ NULL, +/* 0d17 */ NULL, +/* 0d18 */ NULL, +/* 0d19 */ NULL, +/* 0d1a */ NULL, +/* 0d1b */ NULL, +/* 0d1c */ NULL, +/* 0d1d */ NULL, +/* 0d1e */ NULL, +/* 0d1f */ NULL, +/* 0d20 */ NULL, +/* 0d21 */ NULL, +/* 0d22 */ NULL, +/* 0d23 */ NULL, +/* 0d24 */ NULL, +/* 0d25 */ NULL, +/* 0d26 */ NULL, +/* 0d27 */ NULL, +/* 0d28 */ NULL, +/* 0d29 */ NULL, +/* 0d2a */ NULL, +/* 0d2b */ NULL, +/* 0d2c */ NULL, +/* 0d2d */ NULL, +/* 0d2e */ NULL, +/* 0d2f */ NULL, +/* 0d30 */ NULL, +/* 0d31 */ NULL, +/* 0d32 */ NULL, +/* 0d33 */ NULL, +/* 0d34 */ NULL, +/* 0d35 */ NULL, +/* 0d36 */ NULL, +/* 0d37 */ NULL, +/* 0d38 */ NULL, +/* 0d39 */ NULL, +/* 0d3a */ NULL, +/* 0d3b */ NULL, +/* 0d3c */ NULL, +/* 0d3d */ NULL, +/* 0d3e */ NULL, +/* 0d3f */ NULL, +/* 0d40 */ NULL, +/* 0d41 */ NULL, +/* 0d42 */ NULL, +/* 0d43 */ NULL, +/* 0d44 */ NULL, +/* 0d45 */ NULL, +/* 0d46 */ NULL, +/* 0d47 */ NULL, +/* 0d48 */ NULL, +/* 0d49 */ NULL, +/* 0d4a */ NULL, +/* 0d4b */ NULL, +/* 0d4c */ NULL, +/* 0d4d */ NULL, +/* 0d4e */ NULL, +/* 0d4f */ NULL, +/* 0d50 */ NULL, +/* 0d51 */ NULL, +/* 0d52 */ NULL, +/* 0d53 */ NULL, +/* 0d54 */ NULL, +/* 0d55 */ NULL, +/* 0d56 */ NULL, +/* 0d57 */ NULL, +/* 0d58 */ NULL, +/* 0d59 */ NULL, +/* 0d5a */ NULL, +/* 0d5b */ NULL, +/* 0d5c */ NULL, +/* 0d5d */ NULL, +/* 0d5e */ NULL, +/* 0d5f */ NULL, +/* 0d60 */ NULL, +/* 0d61 */ NULL, +/* 0d62 */ NULL, +/* 0d63 */ NULL, +/* 0d64 */ NULL, +/* 0d65 */ NULL, +/* 0d66 */ NULL, +/* 0d67 */ NULL, +/* 0d68 */ NULL, +/* 0d69 */ NULL, +/* 0d6a */ NULL, +/* 0d6b */ NULL, +/* 0d6c */ NULL, +/* 0d6d */ NULL, +/* 0d6e */ NULL, +/* 0d6f */ NULL, +/* 0d70 */ NULL, +/* 0d71 */ NULL, +/* 0d72 */ NULL, +/* 0d73 */ NULL, +/* 0d74 */ NULL, +/* 0d75 */ NULL, +/* 0d76 */ NULL, +/* 0d77 */ NULL, +/* 0d78 */ NULL, +/* 0d79 */ NULL, +/* 0d7a */ NULL, +/* 0d7b */ NULL, +/* 0d7c */ NULL, +/* 0d7d */ NULL, +/* 0d7e */ NULL, +/* 0d7f */ NULL, +/* 0d80 */ NULL, +/* 0d81 */ NULL, +/* 0d82 */ NULL, +/* 0d83 */ NULL, +/* 0d84 */ NULL, +/* 0d85 */ NULL, +/* 0d86 */ NULL, +/* 0d87 */ NULL, +/* 0d88 */ NULL, +/* 0d89 */ NULL, +/* 0d8a */ NULL, +/* 0d8b */ NULL, +/* 0d8c */ NULL, +/* 0d8d */ NULL, +/* 0d8e */ NULL, +/* 0d8f */ NULL, +/* 0d90 */ NULL, +/* 0d91 */ NULL, +/* 0d92 */ NULL, +/* 0d93 */ NULL, +/* 0d94 */ NULL, +/* 0d95 */ NULL, +/* 0d96 */ NULL, +/* 0d97 */ NULL, +/* 0d98 */ NULL, +/* 0d99 */ NULL, +/* 0d9a */ NULL, +/* 0d9b */ NULL, +/* 0d9c */ NULL, +/* 0d9d */ NULL, +/* 0d9e */ NULL, +/* 0d9f */ NULL, +/* 0da0 */ NULL, +/* 0da1 */ NULL, +/* 0da2 */ NULL, +/* 0da3 */ NULL, +/* 0da4 */ NULL, +/* 0da5 */ NULL, +/* 0da6 */ NULL, +/* 0da7 */ NULL, +/* 0da8 */ NULL, +/* 0da9 */ NULL, +/* 0daa */ NULL, +/* 0dab */ NULL, +/* 0dac */ NULL, +/* 0dad */ NULL, +/* 0dae */ NULL, +/* 0daf */ NULL, +/* 0db0 */ NULL, +/* 0db1 */ NULL, +/* 0db2 */ NULL, +/* 0db3 */ NULL, +/* 0db4 */ NULL, +/* 0db5 */ NULL, +/* 0db6 */ NULL, +/* 0db7 */ NULL, +/* 0db8 */ NULL, +/* 0db9 */ NULL, +/* 0dba */ NULL, +/* 0dbb */ NULL, +/* 0dbc */ NULL, +/* 0dbd */ NULL, +/* 0dbe */ NULL, +/* 0dbf */ NULL, +/* 0dc0 */ NULL, +/* 0dc1 */ NULL, +/* 0dc2 */ NULL, +/* 0dc3 */ NULL, +/* 0dc4 */ NULL, +/* 0dc5 */ NULL, +/* 0dc6 */ NULL, +/* 0dc7 */ NULL, +/* 0dc8 */ NULL, +/* 0dc9 */ NULL, +/* 0dca */ NULL, +/* 0dcb */ NULL, +/* 0dcc */ NULL, +/* 0dcd */ NULL, +/* 0dce */ NULL, +/* 0dcf */ NULL, +/* 0dd0 */ NULL, +/* 0dd1 */ NULL, +/* 0dd2 */ NULL, +/* 0dd3 */ NULL, +/* 0dd4 */ NULL, +/* 0dd5 */ NULL, +/* 0dd6 */ NULL, +/* 0dd7 */ NULL, +/* 0dd8 */ NULL, +/* 0dd9 */ NULL, +/* 0dda */ NULL, +/* 0ddb */ NULL, +/* 0ddc */ NULL, +/* 0ddd */ NULL, +/* 0dde */ NULL, +/* 0ddf */ NULL, +/* 0de0 */ NULL, +/* 0de1 */ NULL, +/* 0de2 */ NULL, +/* 0de3 */ NULL, +/* 0de4 */ NULL, +/* 0de5 */ NULL, +/* 0de6 */ NULL, +/* 0de7 */ NULL, +/* 0de8 */ NULL, +/* 0de9 */ NULL, +/* 0dea */ NULL, +/* 0deb */ NULL, +/* 0dec */ NULL, +/* 0ded */ NULL, +/* 0dee */ NULL, +/* 0def */ NULL, +/* 0df0 */ NULL, +/* 0df1 */ NULL, +/* 0df2 */ NULL, +/* 0df3 */ NULL, +/* 0df4 */ NULL, +/* 0df5 */ NULL, +/* 0df6 */ NULL, +/* 0df7 */ NULL, +/* 0df8 */ NULL, +/* 0df9 */ NULL, +/* 0dfa */ NULL, +/* 0dfb */ NULL, +/* 0dfc */ NULL, +/* 0dfd */ NULL, +/* 0dfe */ NULL, +/* 0dff */ NULL, +/* 0e00 */ NULL, +/* 0e01 */ NULL, +/* 0e02 */ NULL, +/* 0e03 */ NULL, +/* 0e04 */ NULL, +/* 0e05 */ NULL, +/* 0e06 */ NULL, +/* 0e07 */ NULL, +/* 0e08 */ NULL, +/* 0e09 */ NULL, +/* 0e0a */ NULL, +/* 0e0b */ NULL, +/* 0e0c */ NULL, +/* 0e0d */ NULL, +/* 0e0e */ NULL, +/* 0e0f */ NULL, +/* 0e10 */ NULL, +/* 0e11 */ NULL, +/* 0e12 */ NULL, +/* 0e13 */ NULL, +/* 0e14 */ NULL, +/* 0e15 */ NULL, +/* 0e16 */ NULL, +/* 0e17 */ NULL, +/* 0e18 */ NULL, +/* 0e19 */ NULL, +/* 0e1a */ NULL, +/* 0e1b */ NULL, +/* 0e1c */ NULL, +/* 0e1d */ NULL, +/* 0e1e */ NULL, +/* 0e1f */ NULL, +/* 0e20 */ NULL, +/* 0e21 */ NULL, +/* 0e22 */ NULL, +/* 0e23 */ NULL, +/* 0e24 */ NULL, +/* 0e25 */ NULL, +/* 0e26 */ NULL, +/* 0e27 */ NULL, +/* 0e28 */ NULL, +/* 0e29 */ NULL, +/* 0e2a */ NULL, +/* 0e2b */ NULL, +/* 0e2c */ NULL, +/* 0e2d */ NULL, +/* 0e2e */ NULL, +/* 0e2f */ NULL, +/* 0e30 */ NULL, +/* 0e31 */ NULL, +/* 0e32 */ NULL, +/* 0e33 */ NULL, +/* 0e34 */ NULL, +/* 0e35 */ NULL, +/* 0e36 */ NULL, +/* 0e37 */ NULL, +/* 0e38 */ NULL, +/* 0e39 */ NULL, +/* 0e3a */ NULL, +/* 0e3b */ NULL, +/* 0e3c */ NULL, +/* 0e3d */ NULL, +/* 0e3e */ NULL, +/* 0e3f */ NULL, +/* 0e40 */ NULL, +/* 0e41 */ NULL, +/* 0e42 */ NULL, +/* 0e43 */ NULL, +/* 0e44 */ NULL, +/* 0e45 */ NULL, +/* 0e46 */ NULL, +/* 0e47 */ NULL, +/* 0e48 */ NULL, +/* 0e49 */ NULL, +/* 0e4a */ NULL, +/* 0e4b */ NULL, +/* 0e4c */ NULL, +/* 0e4d */ NULL, +/* 0e4e */ NULL, +/* 0e4f */ NULL, +/* 0e50 */ NULL, +/* 0e51 */ NULL, +/* 0e52 */ NULL, +/* 0e53 */ NULL, +/* 0e54 */ NULL, +/* 0e55 */ NULL, +/* 0e56 */ NULL, +/* 0e57 */ NULL, +/* 0e58 */ NULL, +/* 0e59 */ NULL, +/* 0e5a */ NULL, +/* 0e5b */ NULL, +/* 0e5c */ NULL, +/* 0e5d */ NULL, +/* 0e5e */ NULL, +/* 0e5f */ NULL, +/* 0e60 */ NULL, +/* 0e61 */ NULL, +/* 0e62 */ NULL, +/* 0e63 */ NULL, +/* 0e64 */ NULL, +/* 0e65 */ NULL, +/* 0e66 */ NULL, +/* 0e67 */ NULL, +/* 0e68 */ NULL, +/* 0e69 */ NULL, +/* 0e6a */ NULL, +/* 0e6b */ NULL, +/* 0e6c */ NULL, +/* 0e6d */ NULL, +/* 0e6e */ NULL, +/* 0e6f */ NULL, +/* 0e70 */ NULL, +/* 0e71 */ NULL, +/* 0e72 */ NULL, +/* 0e73 */ NULL, +/* 0e74 */ NULL, +/* 0e75 */ NULL, +/* 0e76 */ NULL, +/* 0e77 */ NULL, +/* 0e78 */ NULL, +/* 0e79 */ NULL, +/* 0e7a */ NULL, +/* 0e7b */ NULL, +/* 0e7c */ NULL, +/* 0e7d */ NULL, +/* 0e7e */ NULL, +/* 0e7f */ NULL, +/* 0e80 */ NULL, +/* 0e81 */ NULL, +/* 0e82 */ NULL, +/* 0e83 */ NULL, +/* 0e84 */ NULL, +/* 0e85 */ NULL, +/* 0e86 */ NULL, +/* 0e87 */ NULL, +/* 0e88 */ NULL, +/* 0e89 */ NULL, +/* 0e8a */ NULL, +/* 0e8b */ NULL, +/* 0e8c */ NULL, +/* 0e8d */ NULL, +/* 0e8e */ NULL, +/* 0e8f */ NULL, +/* 0e90 */ NULL, +/* 0e91 */ NULL, +/* 0e92 */ NULL, +/* 0e93 */ NULL, +/* 0e94 */ NULL, +/* 0e95 */ NULL, +/* 0e96 */ NULL, +/* 0e97 */ NULL, +/* 0e98 */ NULL, +/* 0e99 */ NULL, +/* 0e9a */ NULL, +/* 0e9b */ NULL, +/* 0e9c */ NULL, +/* 0e9d */ NULL, +/* 0e9e */ NULL, +/* 0e9f */ NULL, +/* 0ea0 */ NULL, +/* 0ea1 */ NULL, +/* 0ea2 */ NULL, +/* 0ea3 */ NULL, +/* 0ea4 */ NULL, +/* 0ea5 */ NULL, +/* 0ea6 */ NULL, +/* 0ea7 */ NULL, +/* 0ea8 */ NULL, +/* 0ea9 */ NULL, +/* 0eaa */ NULL, +/* 0eab */ NULL, +/* 0eac */ NULL, +/* 0ead */ NULL, +/* 0eae */ NULL, +/* 0eaf */ NULL, +/* 0eb0 */ NULL, +/* 0eb1 */ NULL, +/* 0eb2 */ NULL, +/* 0eb3 */ NULL, +/* 0eb4 */ NULL, +/* 0eb5 */ NULL, +/* 0eb6 */ NULL, +/* 0eb7 */ NULL, +/* 0eb8 */ NULL, +/* 0eb9 */ NULL, +/* 0eba */ NULL, +/* 0ebb */ NULL, +/* 0ebc */ NULL, +/* 0ebd */ NULL, +/* 0ebe */ NULL, +/* 0ebf */ NULL, +/* 0ec0 */ NULL, +/* 0ec1 */ NULL, +/* 0ec2 */ NULL, +/* 0ec3 */ NULL, +/* 0ec4 */ NULL, +/* 0ec5 */ NULL, +/* 0ec6 */ NULL, +/* 0ec7 */ NULL, +/* 0ec8 */ NULL, +/* 0ec9 */ NULL, +/* 0eca */ NULL, +/* 0ecb */ NULL, +/* 0ecc */ NULL, +/* 0ecd */ NULL, +/* 0ece */ NULL, +/* 0ecf */ NULL, +/* 0ed0 */ NULL, +/* 0ed1 */ NULL, +/* 0ed2 */ NULL, +/* 0ed3 */ NULL, +/* 0ed4 */ NULL, +/* 0ed5 */ NULL, +/* 0ed6 */ NULL, +/* 0ed7 */ NULL, +/* 0ed8 */ NULL, +/* 0ed9 */ NULL, +/* 0eda */ NULL, +/* 0edb */ NULL, +/* 0edc */ NULL, +/* 0edd */ NULL, +/* 0ede */ NULL, +/* 0edf */ NULL, +/* 0ee0 */ NULL, +/* 0ee1 */ NULL, +/* 0ee2 */ NULL, +/* 0ee3 */ NULL, +/* 0ee4 */ NULL, +/* 0ee5 */ NULL, +/* 0ee6 */ NULL, +/* 0ee7 */ NULL, +/* 0ee8 */ NULL, +/* 0ee9 */ NULL, +/* 0eea */ NULL, +/* 0eeb */ NULL, +/* 0eec */ NULL, +/* 0eed */ NULL, +/* 0eee */ NULL, +/* 0eef */ NULL, +/* 0ef0 */ NULL, +/* 0ef1 */ NULL, +/* 0ef2 */ NULL, +/* 0ef3 */ NULL, +/* 0ef4 */ NULL, +/* 0ef5 */ NULL, +/* 0ef6 */ NULL, +/* 0ef7 */ NULL, +/* 0ef8 */ NULL, +/* 0ef9 */ NULL, +/* 0efa */ NULL, +/* 0efb */ NULL, +/* 0efc */ NULL, +/* 0efd */ NULL, +/* 0efe */ NULL, +/* 0eff */ NULL, +/* 0f00 */ NULL, +/* 0f01 */ NULL, +/* 0f02 */ NULL, +/* 0f03 */ NULL, +/* 0f04 */ NULL, +/* 0f05 */ NULL, +/* 0f06 */ NULL, +/* 0f07 */ NULL, +/* 0f08 */ NULL, +/* 0f09 */ NULL, +/* 0f0a */ NULL, +/* 0f0b */ NULL, +/* 0f0c */ NULL, +/* 0f0d */ NULL, +/* 0f0e */ NULL, +/* 0f0f */ NULL, +/* 0f10 */ NULL, +/* 0f11 */ NULL, +/* 0f12 */ NULL, +/* 0f13 */ NULL, +/* 0f14 */ NULL, +/* 0f15 */ NULL, +/* 0f16 */ NULL, +/* 0f17 */ NULL, +/* 0f18 */ NULL, +/* 0f19 */ NULL, +/* 0f1a */ NULL, +/* 0f1b */ NULL, +/* 0f1c */ NULL, +/* 0f1d */ NULL, +/* 0f1e */ NULL, +/* 0f1f */ NULL, +/* 0f20 */ NULL, +/* 0f21 */ NULL, +/* 0f22 */ NULL, +/* 0f23 */ NULL, +/* 0f24 */ NULL, +/* 0f25 */ NULL, +/* 0f26 */ NULL, +/* 0f27 */ NULL, +/* 0f28 */ NULL, +/* 0f29 */ NULL, +/* 0f2a */ NULL, +/* 0f2b */ NULL, +/* 0f2c */ NULL, +/* 0f2d */ NULL, +/* 0f2e */ NULL, +/* 0f2f */ NULL, +/* 0f30 */ NULL, +/* 0f31 */ NULL, +/* 0f32 */ NULL, +/* 0f33 */ NULL, +/* 0f34 */ NULL, +/* 0f35 */ NULL, +/* 0f36 */ NULL, +/* 0f37 */ NULL, +/* 0f38 */ NULL, +/* 0f39 */ NULL, +/* 0f3a */ NULL, +/* 0f3b */ NULL, +/* 0f3c */ NULL, +/* 0f3d */ NULL, +/* 0f3e */ NULL, +/* 0f3f */ NULL, +/* 0f40 */ NULL, +/* 0f41 */ NULL, +/* 0f42 */ NULL, +/* 0f43 */ NULL, +/* 0f44 */ NULL, +/* 0f45 */ NULL, +/* 0f46 */ NULL, +/* 0f47 */ NULL, +/* 0f48 */ NULL, +/* 0f49 */ NULL, +/* 0f4a */ NULL, +/* 0f4b */ NULL, +/* 0f4c */ NULL, +/* 0f4d */ NULL, +/* 0f4e */ NULL, +/* 0f4f */ NULL, +/* 0f50 */ NULL, +/* 0f51 */ NULL, +/* 0f52 */ NULL, +/* 0f53 */ NULL, +/* 0f54 */ NULL, +/* 0f55 */ NULL, +/* 0f56 */ NULL, +/* 0f57 */ NULL, +/* 0f58 */ NULL, +/* 0f59 */ NULL, +/* 0f5a */ NULL, +/* 0f5b */ NULL, +/* 0f5c */ NULL, +/* 0f5d */ NULL, +/* 0f5e */ NULL, +/* 0f5f */ NULL, +/* 0f60 */ NULL, +/* 0f61 */ NULL, +/* 0f62 */ NULL, +/* 0f63 */ NULL, +/* 0f64 */ NULL, +/* 0f65 */ NULL, +/* 0f66 */ NULL, +/* 0f67 */ NULL, +/* 0f68 */ NULL, +/* 0f69 */ NULL, +/* 0f6a */ NULL, +/* 0f6b */ NULL, +/* 0f6c */ NULL, +/* 0f6d */ NULL, +/* 0f6e */ NULL, +/* 0f6f */ NULL, +/* 0f70 */ NULL, +/* 0f71 */ NULL, +/* 0f72 */ NULL, +/* 0f73 */ NULL, +/* 0f74 */ NULL, +/* 0f75 */ NULL, +/* 0f76 */ NULL, +/* 0f77 */ NULL, +/* 0f78 */ NULL, +/* 0f79 */ NULL, +/* 0f7a */ NULL, +/* 0f7b */ NULL, +/* 0f7c */ NULL, +/* 0f7d */ NULL, +/* 0f7e */ NULL, +/* 0f7f */ NULL, +/* 0f80 */ NULL, +/* 0f81 */ NULL, +/* 0f82 */ NULL, +/* 0f83 */ NULL, +/* 0f84 */ NULL, +/* 0f85 */ NULL, +/* 0f86 */ NULL, +/* 0f87 */ NULL, +/* 0f88 */ NULL, +/* 0f89 */ NULL, +/* 0f8a */ NULL, +/* 0f8b */ NULL, +/* 0f8c */ NULL, +/* 0f8d */ NULL, +/* 0f8e */ NULL, +/* 0f8f */ NULL, +/* 0f90 */ NULL, +/* 0f91 */ NULL, +/* 0f92 */ NULL, +/* 0f93 */ NULL, +/* 0f94 */ NULL, +/* 0f95 */ NULL, +/* 0f96 */ NULL, +/* 0f97 */ NULL, +/* 0f98 */ NULL, +/* 0f99 */ NULL, +/* 0f9a */ NULL, +/* 0f9b */ NULL, +/* 0f9c */ NULL, +/* 0f9d */ NULL, +/* 0f9e */ NULL, +/* 0f9f */ NULL, +/* 0fa0 */ NULL, +/* 0fa1 */ NULL, +/* 0fa2 */ NULL, +/* 0fa3 */ NULL, +/* 0fa4 */ NULL, +/* 0fa5 */ NULL, +/* 0fa6 */ NULL, +/* 0fa7 */ NULL, +/* 0fa8 */ NULL, +/* 0fa9 */ NULL, +/* 0faa */ NULL, +/* 0fab */ NULL, +/* 0fac */ NULL, +/* 0fad */ NULL, +/* 0fae */ NULL, +/* 0faf */ NULL, +/* 0fb0 */ NULL, +/* 0fb1 */ NULL, +/* 0fb2 */ NULL, +/* 0fb3 */ NULL, +/* 0fb4 */ NULL, +/* 0fb5 */ NULL, +/* 0fb6 */ NULL, +/* 0fb7 */ NULL, +/* 0fb8 */ NULL, +/* 0fb9 */ NULL, +/* 0fba */ NULL, +/* 0fbb */ NULL, +/* 0fbc */ NULL, +/* 0fbd */ NULL, +/* 0fbe */ NULL, +/* 0fbf */ NULL, +/* 0fc0 */ NULL, +/* 0fc1 */ NULL, +/* 0fc2 */ NULL, +/* 0fc3 */ NULL, +/* 0fc4 */ NULL, +/* 0fc5 */ NULL, +/* 0fc6 */ NULL, +/* 0fc7 */ NULL, +/* 0fc8 */ NULL, +/* 0fc9 */ NULL, +/* 0fca */ NULL, +/* 0fcb */ NULL, +/* 0fcc */ NULL, +/* 0fcd */ NULL, +/* 0fce */ NULL, +/* 0fcf */ NULL, +/* 0fd0 */ NULL, +/* 0fd1 */ NULL, +/* 0fd2 */ NULL, +/* 0fd3 */ NULL, +/* 0fd4 */ NULL, +/* 0fd5 */ NULL, +/* 0fd6 */ NULL, +/* 0fd7 */ NULL, +/* 0fd8 */ NULL, +/* 0fd9 */ NULL, +/* 0fda */ NULL, +/* 0fdb */ NULL, +/* 0fdc */ NULL, +/* 0fdd */ NULL, +/* 0fde */ NULL, +/* 0fdf */ NULL, +/* 0fe0 */ NULL, +/* 0fe1 */ NULL, +/* 0fe2 */ NULL, +/* 0fe3 */ NULL, +/* 0fe4 */ NULL, +/* 0fe5 */ NULL, +/* 0fe6 */ NULL, +/* 0fe7 */ NULL, +/* 0fe8 */ NULL, +/* 0fe9 */ NULL, +/* 0fea */ NULL, +/* 0feb */ NULL, +/* 0fec */ NULL, +/* 0fed */ NULL, +/* 0fee */ NULL, +/* 0fef */ NULL, +/* 0ff0 */ NULL, +/* 0ff1 */ NULL, +/* 0ff2 */ NULL, +/* 0ff3 */ NULL, +/* 0ff4 */ NULL, +/* 0ff5 */ NULL, +/* 0ff6 */ NULL, +/* 0ff7 */ NULL, +/* 0ff8 */ NULL, +/* 0ff9 */ NULL, +/* 0ffa */ NULL, +/* 0ffb */ NULL, +/* 0ffc */ NULL, +/* 0ffd */ NULL, +/* 0ffe */ NULL, +/* 0fff */ NULL, +/* 1000 */ NULL, +/* 1001 */ NULL, +/* 1002 */ NULL, +/* 1003 */ NULL, +/* 1004 */ NULL, +/* 1005 */ NULL, +/* 1006 */ NULL, +/* 1007 */ NULL, +/* 1008 */ NULL, +/* 1009 */ NULL, +/* 100a */ NULL, +/* 100b */ NULL, +/* 100c */ NULL, +/* 100d */ NULL, +/* 100e */ NULL, +/* 100f */ NULL, +/* 1010 */ NULL, +/* 1011 */ NULL, +/* 1012 */ NULL, +/* 1013 */ NULL, +/* 1014 */ NULL, +/* 1015 */ NULL, +/* 1016 */ NULL, +/* 1017 */ NULL, +/* 1018 */ NULL, +/* 1019 */ NULL, +/* 101a */ NULL, +/* 101b */ NULL, +/* 101c */ NULL, +/* 101d */ NULL, +/* 101e */ NULL, +/* 101f */ NULL, +/* 1020 */ NULL, +/* 1021 */ NULL, +/* 1022 */ NULL, +/* 1023 */ NULL, +/* 1024 */ NULL, +/* 1025 */ NULL, +/* 1026 */ NULL, +/* 1027 */ NULL, +/* 1028 */ NULL, +/* 1029 */ NULL, +/* 102a */ NULL, +/* 102b */ NULL, +/* 102c */ NULL, +/* 102d */ NULL, +/* 102e */ NULL, +/* 102f */ NULL, +/* 1030 */ NULL, +/* 1031 */ NULL, +/* 1032 */ NULL, +/* 1033 */ NULL, +/* 1034 */ NULL, +/* 1035 */ NULL, +/* 1036 */ NULL, +/* 1037 */ NULL, +/* 1038 */ NULL, +/* 1039 */ NULL, +/* 103a */ NULL, +/* 103b */ NULL, +/* 103c */ NULL, +/* 103d */ NULL, +/* 103e */ NULL, +/* 103f */ NULL, +/* 1040 */ NULL, +/* 1041 */ NULL, +/* 1042 */ NULL, +/* 1043 */ NULL, +/* 1044 */ NULL, +/* 1045 */ NULL, +/* 1046 */ NULL, +/* 1047 */ NULL, +/* 1048 */ NULL, +/* 1049 */ NULL, +/* 104a */ NULL, +/* 104b */ NULL, +/* 104c */ NULL, +/* 104d */ NULL, +/* 104e */ NULL, +/* 104f */ NULL, +/* 1050 */ NULL, +/* 1051 */ NULL, +/* 1052 */ NULL, +/* 1053 */ NULL, +/* 1054 */ NULL, +/* 1055 */ NULL, +/* 1056 */ NULL, +/* 1057 */ NULL, +/* 1058 */ NULL, +/* 1059 */ NULL, +/* 105a */ NULL, +/* 105b */ NULL, +/* 105c */ NULL, +/* 105d */ NULL, +/* 105e */ NULL, +/* 105f */ NULL, +/* 1060 */ NULL, +/* 1061 */ NULL, +/* 1062 */ NULL, +/* 1063 */ NULL, +/* 1064 */ NULL, +/* 1065 */ NULL, +/* 1066 */ NULL, +/* 1067 */ NULL, +/* 1068 */ NULL, +/* 1069 */ NULL, +/* 106a */ NULL, +/* 106b */ NULL, +/* 106c */ NULL, +/* 106d */ NULL, +/* 106e */ NULL, +/* 106f */ NULL, +/* 1070 */ NULL, +/* 1071 */ NULL, +/* 1072 */ NULL, +/* 1073 */ NULL, +/* 1074 */ NULL, +/* 1075 */ NULL, +/* 1076 */ NULL, +/* 1077 */ NULL, +/* 1078 */ NULL, +/* 1079 */ NULL, +/* 107a */ NULL, +/* 107b */ NULL, +/* 107c */ NULL, +/* 107d */ NULL, +/* 107e */ NULL, +/* 107f */ NULL, +/* 1080 */ NULL, +/* 1081 */ NULL, +/* 1082 */ NULL, +/* 1083 */ NULL, +/* 1084 */ NULL, +/* 1085 */ NULL, +/* 1086 */ NULL, +/* 1087 */ NULL, +/* 1088 */ NULL, +/* 1089 */ NULL, +/* 108a */ NULL, +/* 108b */ NULL, +/* 108c */ NULL, +/* 108d */ NULL, +/* 108e */ NULL, +/* 108f */ NULL, +/* 1090 */ NULL, +/* 1091 */ NULL, +/* 1092 */ NULL, +/* 1093 */ NULL, +/* 1094 */ NULL, +/* 1095 */ NULL, +/* 1096 */ NULL, +/* 1097 */ NULL, +/* 1098 */ NULL, +/* 1099 */ NULL, +/* 109a */ NULL, +/* 109b */ NULL, +/* 109c */ NULL, +/* 109d */ NULL, +/* 109e */ NULL, +/* 109f */ NULL, +/* 10a0 */ NULL, +/* 10a1 */ NULL, +/* 10a2 */ NULL, +/* 10a3 */ NULL, +/* 10a4 */ NULL, +/* 10a5 */ NULL, +/* 10a6 */ NULL, +/* 10a7 */ NULL, +/* 10a8 */ NULL, +/* 10a9 */ NULL, +/* 10aa */ NULL, +/* 10ab */ NULL, +/* 10ac */ NULL, +/* 10ad */ NULL, +/* 10ae */ NULL, +/* 10af */ NULL, +/* 10b0 */ NULL, +/* 10b1 */ NULL, +/* 10b2 */ NULL, +/* 10b3 */ NULL, +/* 10b4 */ NULL, +/* 10b5 */ NULL, +/* 10b6 */ NULL, +/* 10b7 */ NULL, +/* 10b8 */ NULL, +/* 10b9 */ NULL, +/* 10ba */ NULL, +/* 10bb */ NULL, +/* 10bc */ NULL, +/* 10bd */ NULL, +/* 10be */ NULL, +/* 10bf */ NULL, +/* 10c0 */ NULL, +/* 10c1 */ NULL, +/* 10c2 */ NULL, +/* 10c3 */ NULL, +/* 10c4 */ NULL, +/* 10c5 */ NULL, +/* 10c6 */ NULL, +/* 10c7 */ NULL, +/* 10c8 */ NULL, +/* 10c9 */ NULL, +/* 10ca */ NULL, +/* 10cb */ NULL, +/* 10cc */ NULL, +/* 10cd */ NULL, +/* 10ce */ NULL, +/* 10cf */ NULL, +/* 10d0 */ NULL, +/* 10d1 */ NULL, +/* 10d2 */ NULL, +/* 10d3 */ NULL, +/* 10d4 */ NULL, +/* 10d5 */ NULL, +/* 10d6 */ NULL, +/* 10d7 */ NULL, +/* 10d8 */ NULL, +/* 10d9 */ NULL, +/* 10da */ NULL, +/* 10db */ NULL, +/* 10dc */ NULL, +/* 10dd */ NULL, +/* 10de */ NULL, +/* 10df */ NULL, +/* 10e0 */ NULL, +/* 10e1 */ NULL, +/* 10e2 */ NULL, +/* 10e3 */ NULL, +/* 10e4 */ NULL, +/* 10e5 */ NULL, +/* 10e6 */ NULL, +/* 10e7 */ NULL, +/* 10e8 */ NULL, +/* 10e9 */ NULL, +/* 10ea */ NULL, +/* 10eb */ NULL, +/* 10ec */ NULL, +/* 10ed */ NULL, +/* 10ee */ NULL, +/* 10ef */ NULL, +/* 10f0 */ NULL, +/* 10f1 */ NULL, +/* 10f2 */ NULL, +/* 10f3 */ NULL, +/* 10f4 */ NULL, +/* 10f5 */ NULL, +/* 10f6 */ NULL, +/* 10f7 */ NULL, +/* 10f8 */ NULL, +/* 10f9 */ NULL, +/* 10fa */ NULL, +/* 10fb */ NULL, +/* 10fc */ NULL, +/* 10fd */ NULL, +/* 10fe */ NULL, +/* 10ff */ NULL, +/* 1100 */ NULL, +/* 1101 */ NULL, +/* 1102 */ NULL, +/* 1103 */ NULL, +/* 1104 */ NULL, +/* 1105 */ NULL, +/* 1106 */ NULL, +/* 1107 */ NULL, +/* 1108 */ NULL, +/* 1109 */ NULL, +/* 110a */ NULL, +/* 110b */ NULL, +/* 110c */ NULL, +/* 110d */ NULL, +/* 110e */ NULL, +/* 110f */ NULL, +/* 1110 */ NULL, +/* 1111 */ NULL, +/* 1112 */ NULL, +/* 1113 */ NULL, +/* 1114 */ NULL, +/* 1115 */ NULL, +/* 1116 */ NULL, +/* 1117 */ NULL, +/* 1118 */ NULL, +/* 1119 */ NULL, +/* 111a */ NULL, +/* 111b */ NULL, +/* 111c */ NULL, +/* 111d */ NULL, +/* 111e */ NULL, +/* 111f */ NULL, +/* 1120 */ NULL, +/* 1121 */ NULL, +/* 1122 */ NULL, +/* 1123 */ NULL, +/* 1124 */ NULL, +/* 1125 */ NULL, +/* 1126 */ NULL, +/* 1127 */ NULL, +/* 1128 */ NULL, +/* 1129 */ NULL, +/* 112a */ NULL, +/* 112b */ NULL, +/* 112c */ NULL, +/* 112d */ NULL, +/* 112e */ NULL, +/* 112f */ NULL, +/* 1130 */ NULL, +/* 1131 */ NULL, +/* 1132 */ NULL, +/* 1133 */ NULL, +/* 1134 */ NULL, +/* 1135 */ NULL, +/* 1136 */ NULL, +/* 1137 */ NULL, +/* 1138 */ NULL, +/* 1139 */ NULL, +/* 113a */ NULL, +/* 113b */ NULL, +/* 113c */ NULL, +/* 113d */ NULL, +/* 113e */ NULL, +/* 113f */ NULL, +/* 1140 */ NULL, +/* 1141 */ NULL, +/* 1142 */ NULL, +/* 1143 */ NULL, +/* 1144 */ NULL, +/* 1145 */ NULL, +/* 1146 */ NULL, +/* 1147 */ NULL, +/* 1148 */ NULL, +/* 1149 */ NULL, +/* 114a */ NULL, +/* 114b */ NULL, +/* 114c */ NULL, +/* 114d */ NULL, +/* 114e */ NULL, +/* 114f */ NULL, +/* 1150 */ NULL, +/* 1151 */ NULL, +/* 1152 */ NULL, +/* 1153 */ NULL, +/* 1154 */ NULL, +/* 1155 */ NULL, +/* 1156 */ NULL, +/* 1157 */ NULL, +/* 1158 */ NULL, +/* 1159 */ NULL, +/* 115a */ NULL, +/* 115b */ NULL, +/* 115c */ NULL, +/* 115d */ NULL, +/* 115e */ NULL, +/* 115f */ NULL, +/* 1160 */ NULL, +/* 1161 */ NULL, +/* 1162 */ NULL, +/* 1163 */ NULL, +/* 1164 */ NULL, +/* 1165 */ NULL, +/* 1166 */ NULL, +/* 1167 */ NULL, +/* 1168 */ NULL, +/* 1169 */ NULL, +/* 116a */ NULL, +/* 116b */ NULL, +/* 116c */ NULL, +/* 116d */ NULL, +/* 116e */ NULL, +/* 116f */ NULL, +/* 1170 */ NULL, +/* 1171 */ NULL, +/* 1172 */ NULL, +/* 1173 */ NULL, +/* 1174 */ NULL, +/* 1175 */ NULL, +/* 1176 */ NULL, +/* 1177 */ NULL, +/* 1178 */ NULL, +/* 1179 */ NULL, +/* 117a */ NULL, +/* 117b */ NULL, +/* 117c */ NULL, +/* 117d */ NULL, +/* 117e */ NULL, +/* 117f */ NULL, +/* 1180 */ NULL, +/* 1181 */ NULL, +/* 1182 */ NULL, +/* 1183 */ NULL, +/* 1184 */ NULL, +/* 1185 */ NULL, +/* 1186 */ NULL, +/* 1187 */ NULL, +/* 1188 */ NULL, +/* 1189 */ NULL, +/* 118a */ NULL, +/* 118b */ NULL, +/* 118c */ NULL, +/* 118d */ NULL, +/* 118e */ NULL, +/* 118f */ NULL, +/* 1190 */ NULL, +/* 1191 */ NULL, +/* 1192 */ NULL, +/* 1193 */ NULL, +/* 1194 */ NULL, +/* 1195 */ NULL, +/* 1196 */ NULL, +/* 1197 */ NULL, +/* 1198 */ NULL, +/* 1199 */ NULL, +/* 119a */ NULL, +/* 119b */ NULL, +/* 119c */ NULL, +/* 119d */ NULL, +/* 119e */ NULL, +/* 119f */ NULL, +/* 11a0 */ NULL, +/* 11a1 */ NULL, +/* 11a2 */ NULL, +/* 11a3 */ NULL, +/* 11a4 */ NULL, +/* 11a5 */ NULL, +/* 11a6 */ NULL, +/* 11a7 */ NULL, +/* 11a8 */ NULL, +/* 11a9 */ NULL, +/* 11aa */ NULL, +/* 11ab */ NULL, +/* 11ac */ NULL, +/* 11ad */ NULL, +/* 11ae */ NULL, +/* 11af */ NULL, +/* 11b0 */ NULL, +/* 11b1 */ NULL, +/* 11b2 */ NULL, +/* 11b3 */ NULL, +/* 11b4 */ NULL, +/* 11b5 */ NULL, +/* 11b6 */ NULL, +/* 11b7 */ NULL, +/* 11b8 */ NULL, +/* 11b9 */ NULL, +/* 11ba */ NULL, +/* 11bb */ NULL, +/* 11bc */ NULL, +/* 11bd */ NULL, +/* 11be */ NULL, +/* 11bf */ NULL, +/* 11c0 */ NULL, +/* 11c1 */ NULL, +/* 11c2 */ NULL, +/* 11c3 */ NULL, +/* 11c4 */ NULL, +/* 11c5 */ NULL, +/* 11c6 */ NULL, +/* 11c7 */ NULL, +/* 11c8 */ NULL, +/* 11c9 */ NULL, +/* 11ca */ NULL, +/* 11cb */ NULL, +/* 11cc */ NULL, +/* 11cd */ NULL, +/* 11ce */ NULL, +/* 11cf */ NULL, +/* 11d0 */ NULL, +/* 11d1 */ NULL, +/* 11d2 */ NULL, +/* 11d3 */ NULL, +/* 11d4 */ NULL, +/* 11d5 */ NULL, +/* 11d6 */ NULL, +/* 11d7 */ NULL, +/* 11d8 */ NULL, +/* 11d9 */ NULL, +/* 11da */ NULL, +/* 11db */ NULL, +/* 11dc */ NULL, +/* 11dd */ NULL, +/* 11de */ NULL, +/* 11df */ NULL, +/* 11e0 */ NULL, +/* 11e1 */ NULL, +/* 11e2 */ NULL, +/* 11e3 */ NULL, +/* 11e4 */ NULL, +/* 11e5 */ NULL, +/* 11e6 */ NULL, +/* 11e7 */ NULL, +/* 11e8 */ NULL, +/* 11e9 */ NULL, +/* 11ea */ NULL, +/* 11eb */ NULL, +/* 11ec */ NULL, +/* 11ed */ NULL, +/* 11ee */ NULL, +/* 11ef */ NULL, +/* 11f0 */ NULL, +/* 11f1 */ NULL, +/* 11f2 */ NULL, +/* 11f3 */ NULL, +/* 11f4 */ NULL, +/* 11f5 */ NULL, +/* 11f6 */ NULL, +/* 11f7 */ NULL, +/* 11f8 */ NULL, +/* 11f9 */ NULL, +/* 11fa */ NULL, +/* 11fb */ NULL, +/* 11fc */ NULL, +/* 11fd */ NULL, +/* 11fe */ NULL, +/* 11ff */ NULL, +/* 1200 */ NULL, +/* 1201 */ NULL, +/* 1202 */ NULL, +/* 1203 */ NULL, +/* 1204 */ NULL, +/* 1205 */ NULL, +/* 1206 */ NULL, +/* 1207 */ NULL, +/* 1208 */ NULL, +/* 1209 */ NULL, +/* 120a */ NULL, +/* 120b */ NULL, +/* 120c */ NULL, +/* 120d */ NULL, +/* 120e */ NULL, +/* 120f */ NULL, +/* 1210 */ NULL, +/* 1211 */ NULL, +/* 1212 */ NULL, +/* 1213 */ NULL, +/* 1214 */ NULL, +/* 1215 */ NULL, +/* 1216 */ NULL, +/* 1217 */ NULL, +/* 1218 */ NULL, +/* 1219 */ NULL, +/* 121a */ NULL, +/* 121b */ NULL, +/* 121c */ NULL, +/* 121d */ NULL, +/* 121e */ NULL, +/* 121f */ NULL, +/* 1220 */ NULL, +/* 1221 */ NULL, +/* 1222 */ NULL, +/* 1223 */ NULL, +/* 1224 */ NULL, +/* 1225 */ NULL, +/* 1226 */ NULL, +/* 1227 */ NULL, +/* 1228 */ NULL, +/* 1229 */ NULL, +/* 122a */ NULL, +/* 122b */ NULL, +/* 122c */ NULL, +/* 122d */ NULL, +/* 122e */ NULL, +/* 122f */ NULL, +/* 1230 */ NULL, +/* 1231 */ NULL, +/* 1232 */ NULL, +/* 1233 */ NULL, +/* 1234 */ NULL, +/* 1235 */ NULL, +/* 1236 */ NULL, +/* 1237 */ NULL, +/* 1238 */ NULL, +/* 1239 */ NULL, +/* 123a */ NULL, +/* 123b */ NULL, +/* 123c */ NULL, +/* 123d */ NULL, +/* 123e */ NULL, +/* 123f */ NULL, +/* 1240 */ NULL, +/* 1241 */ NULL, +/* 1242 */ NULL, +/* 1243 */ NULL, +/* 1244 */ NULL, +/* 1245 */ NULL, +/* 1246 */ NULL, +/* 1247 */ NULL, +/* 1248 */ NULL, +/* 1249 */ NULL, +/* 124a */ NULL, +/* 124b */ NULL, +/* 124c */ NULL, +/* 124d */ NULL, +/* 124e */ NULL, +/* 124f */ NULL, +/* 1250 */ NULL, +/* 1251 */ NULL, +/* 1252 */ NULL, +/* 1253 */ NULL, +/* 1254 */ NULL, +/* 1255 */ NULL, +/* 1256 */ NULL, +/* 1257 */ NULL, +/* 1258 */ NULL, +/* 1259 */ NULL, +/* 125a */ NULL, +/* 125b */ NULL, +/* 125c */ NULL, +/* 125d */ NULL, +/* 125e */ NULL, +/* 125f */ NULL, +/* 1260 */ NULL, +/* 1261 */ NULL, +/* 1262 */ NULL, +/* 1263 */ NULL, +/* 1264 */ NULL, +/* 1265 */ NULL, +/* 1266 */ NULL, +/* 1267 */ NULL, +/* 1268 */ NULL, +/* 1269 */ NULL, +/* 126a */ NULL, +/* 126b */ NULL, +/* 126c */ NULL, +/* 126d */ NULL, +/* 126e */ NULL, +/* 126f */ NULL, +/* 1270 */ NULL, +/* 1271 */ NULL, +/* 1272 */ NULL, +/* 1273 */ NULL, +/* 1274 */ NULL, +/* 1275 */ NULL, +/* 1276 */ NULL, +/* 1277 */ NULL, +/* 1278 */ NULL, +/* 1279 */ NULL, +/* 127a */ NULL, +/* 127b */ NULL, +/* 127c */ NULL, +/* 127d */ NULL, +/* 127e */ NULL, +/* 127f */ NULL, +/* 1280 */ NULL, +/* 1281 */ NULL, +/* 1282 */ NULL, +/* 1283 */ NULL, +/* 1284 */ NULL, +/* 1285 */ NULL, +/* 1286 */ NULL, +/* 1287 */ NULL, +/* 1288 */ NULL, +/* 1289 */ NULL, +/* 128a */ NULL, +/* 128b */ NULL, +/* 128c */ NULL, +/* 128d */ NULL, +/* 128e */ NULL, +/* 128f */ NULL, +/* 1290 */ NULL, +/* 1291 */ NULL, +/* 1292 */ NULL, +/* 1293 */ NULL, +/* 1294 */ NULL, +/* 1295 */ NULL, +/* 1296 */ NULL, +/* 1297 */ NULL, +/* 1298 */ NULL, +/* 1299 */ NULL, +/* 129a */ NULL, +/* 129b */ NULL, +/* 129c */ NULL, +/* 129d */ NULL, +/* 129e */ NULL, +/* 129f */ NULL, +/* 12a0 */ NULL, +/* 12a1 */ NULL, +/* 12a2 */ NULL, +/* 12a3 */ NULL, +/* 12a4 */ NULL, +/* 12a5 */ NULL, +/* 12a6 */ NULL, +/* 12a7 */ NULL, +/* 12a8 */ NULL, +/* 12a9 */ NULL, +/* 12aa */ NULL, +/* 12ab */ NULL, +/* 12ac */ NULL, +/* 12ad */ NULL, +/* 12ae */ NULL, +/* 12af */ NULL, +/* 12b0 */ NULL, +/* 12b1 */ NULL, +/* 12b2 */ NULL, +/* 12b3 */ NULL, +/* 12b4 */ NULL, +/* 12b5 */ NULL, +/* 12b6 */ NULL, +/* 12b7 */ NULL, +/* 12b8 */ NULL, +/* 12b9 */ NULL, +/* 12ba */ NULL, +/* 12bb */ NULL, +/* 12bc */ NULL, +/* 12bd */ NULL, +/* 12be */ NULL, +/* 12bf */ NULL, +/* 12c0 */ NULL, +/* 12c1 */ NULL, +/* 12c2 */ NULL, +/* 12c3 */ NULL, +/* 12c4 */ NULL, +/* 12c5 */ NULL, +/* 12c6 */ NULL, +/* 12c7 */ NULL, +/* 12c8 */ NULL, +/* 12c9 */ NULL, +/* 12ca */ NULL, +/* 12cb */ NULL, +/* 12cc */ NULL, +/* 12cd */ NULL, +/* 12ce */ NULL, +/* 12cf */ NULL, +/* 12d0 */ NULL, +/* 12d1 */ NULL, +/* 12d2 */ NULL, +/* 12d3 */ NULL, +/* 12d4 */ NULL, +/* 12d5 */ NULL, +/* 12d6 */ NULL, +/* 12d7 */ NULL, +/* 12d8 */ NULL, +/* 12d9 */ NULL, +/* 12da */ NULL, +/* 12db */ NULL, +/* 12dc */ NULL, +/* 12dd */ NULL, +/* 12de */ NULL, +/* 12df */ NULL, +/* 12e0 */ NULL, +/* 12e1 */ NULL, +/* 12e2 */ NULL, +/* 12e3 */ NULL, +/* 12e4 */ NULL, +/* 12e5 */ NULL, +/* 12e6 */ NULL, +/* 12e7 */ NULL, +/* 12e8 */ NULL, +/* 12e9 */ NULL, +/* 12ea */ NULL, +/* 12eb */ NULL, +/* 12ec */ NULL, +/* 12ed */ NULL, +/* 12ee */ NULL, +/* 12ef */ NULL, +/* 12f0 */ NULL, +/* 12f1 */ NULL, +/* 12f2 */ NULL, +/* 12f3 */ NULL, +/* 12f4 */ NULL, +/* 12f5 */ NULL, +/* 12f6 */ NULL, +/* 12f7 */ NULL, +/* 12f8 */ NULL, +/* 12f9 */ NULL, +/* 12fa */ NULL, +/* 12fb */ NULL, +/* 12fc */ NULL, +/* 12fd */ NULL, +/* 12fe */ NULL, +/* 12ff */ NULL, +/* 1300 */ NULL, +/* 1301 */ NULL, +/* 1302 */ NULL, +/* 1303 */ NULL, +/* 1304 */ NULL, +/* 1305 */ NULL, +/* 1306 */ NULL, +/* 1307 */ NULL, +/* 1308 */ NULL, +/* 1309 */ NULL, +/* 130a */ NULL, +/* 130b */ NULL, +/* 130c */ NULL, +/* 130d */ NULL, +/* 130e */ NULL, +/* 130f */ NULL, +/* 1310 */ NULL, +/* 1311 */ NULL, +/* 1312 */ NULL, +/* 1313 */ NULL, +/* 1314 */ NULL, +/* 1315 */ NULL, +/* 1316 */ NULL, +/* 1317 */ NULL, +/* 1318 */ NULL, +/* 1319 */ NULL, +/* 131a */ NULL, +/* 131b */ NULL, +/* 131c */ NULL, +/* 131d */ NULL, +/* 131e */ NULL, +/* 131f */ NULL, +/* 1320 */ NULL, +/* 1321 */ NULL, +/* 1322 */ NULL, +/* 1323 */ NULL, +/* 1324 */ NULL, +/* 1325 */ NULL, +/* 1326 */ NULL, +/* 1327 */ NULL, +/* 1328 */ NULL, +/* 1329 */ NULL, +/* 132a */ NULL, +/* 132b */ NULL, +/* 132c */ NULL, +/* 132d */ NULL, +/* 132e */ NULL, +/* 132f */ NULL, +/* 1330 */ NULL, +/* 1331 */ NULL, +/* 1332 */ NULL, +/* 1333 */ NULL, +/* 1334 */ NULL, +/* 1335 */ NULL, +/* 1336 */ NULL, +/* 1337 */ NULL, +/* 1338 */ NULL, +/* 1339 */ NULL, +/* 133a */ NULL, +/* 133b */ NULL, +/* 133c */ NULL, +/* 133d */ NULL, +/* 133e */ NULL, +/* 133f */ NULL, +/* 1340 */ NULL, +/* 1341 */ NULL, +/* 1342 */ NULL, +/* 1343 */ NULL, +/* 1344 */ NULL, +/* 1345 */ NULL, +/* 1346 */ NULL, +/* 1347 */ NULL, +/* 1348 */ NULL, +/* 1349 */ NULL, +/* 134a */ NULL, +/* 134b */ NULL, +/* 134c */ NULL, +/* 134d */ NULL, +/* 134e */ NULL, +/* 134f */ NULL, +/* 1350 */ NULL, +/* 1351 */ NULL, +/* 1352 */ NULL, +/* 1353 */ NULL, +/* 1354 */ NULL, +/* 1355 */ NULL, +/* 1356 */ NULL, +/* 1357 */ NULL, +/* 1358 */ NULL, +/* 1359 */ NULL, +/* 135a */ NULL, +/* 135b */ NULL, +/* 135c */ NULL, +/* 135d */ NULL, +/* 135e */ NULL, +/* 135f */ NULL, +/* 1360 */ NULL, +/* 1361 */ NULL, +/* 1362 */ NULL, +/* 1363 */ NULL, +/* 1364 */ NULL, +/* 1365 */ NULL, +/* 1366 */ NULL, +/* 1367 */ NULL, +/* 1368 */ NULL, +/* 1369 */ NULL, +/* 136a */ NULL, +/* 136b */ NULL, +/* 136c */ NULL, +/* 136d */ NULL, +/* 136e */ NULL, +/* 136f */ NULL, +/* 1370 */ NULL, +/* 1371 */ NULL, +/* 1372 */ NULL, +/* 1373 */ NULL, +/* 1374 */ NULL, +/* 1375 */ NULL, +/* 1376 */ NULL, +/* 1377 */ NULL, +/* 1378 */ NULL, +/* 1379 */ NULL, +/* 137a */ NULL, +/* 137b */ NULL, +/* 137c */ NULL, +/* 137d */ NULL, +/* 137e */ NULL, +/* 137f */ NULL, +/* 1380 */ NULL, +/* 1381 */ NULL, +/* 1382 */ NULL, +/* 1383 */ NULL, +/* 1384 */ NULL, +/* 1385 */ NULL, +/* 1386 */ NULL, +/* 1387 */ NULL, +/* 1388 */ NULL, +/* 1389 */ NULL, +/* 138a */ NULL, +/* 138b */ NULL, +/* 138c */ NULL, +/* 138d */ NULL, +/* 138e */ NULL, +/* 138f */ NULL, +/* 1390 */ NULL, +/* 1391 */ NULL, +/* 1392 */ NULL, +/* 1393 */ NULL, +/* 1394 */ NULL, +/* 1395 */ NULL, +/* 1396 */ NULL, +/* 1397 */ NULL, +/* 1398 */ NULL, +/* 1399 */ NULL, +/* 139a */ NULL, +/* 139b */ NULL, +/* 139c */ NULL, +/* 139d */ NULL, +/* 139e */ NULL, +/* 139f */ NULL, +/* 13a0 */ NULL, +/* 13a1 */ NULL, +/* 13a2 */ NULL, +/* 13a3 */ NULL, +/* 13a4 */ NULL, +/* 13a5 */ NULL, +/* 13a6 */ NULL, +/* 13a7 */ NULL, +/* 13a8 */ NULL, +/* 13a9 */ NULL, +/* 13aa */ NULL, +/* 13ab */ NULL, +/* 13ac */ NULL, +/* 13ad */ NULL, +/* 13ae */ NULL, +/* 13af */ NULL, +/* 13b0 */ NULL, +/* 13b1 */ NULL, +/* 13b2 */ NULL, +/* 13b3 */ NULL, +/* 13b4 */ NULL, +/* 13b5 */ NULL, +/* 13b6 */ NULL, +/* 13b7 */ NULL, +/* 13b8 */ NULL, +/* 13b9 */ NULL, +/* 13ba */ NULL, +/* 13bb */ NULL, +/* 13bc */ NULL, +/* 13bd */ NULL, +/* 13be */ NULL, +/* 13bf */ NULL, +/* 13c0 */ NULL, +/* 13c1 */ NULL, +/* 13c2 */ NULL, +/* 13c3 */ NULL, +/* 13c4 */ NULL, +/* 13c5 */ NULL, +/* 13c6 */ NULL, +/* 13c7 */ NULL, +/* 13c8 */ NULL, +/* 13c9 */ NULL, +/* 13ca */ NULL, +/* 13cb */ NULL, +/* 13cc */ NULL, +/* 13cd */ NULL, +/* 13ce */ NULL, +/* 13cf */ NULL, +/* 13d0 */ NULL, +/* 13d1 */ NULL, +/* 13d2 */ NULL, +/* 13d3 */ NULL, +/* 13d4 */ NULL, +/* 13d5 */ NULL, +/* 13d6 */ NULL, +/* 13d7 */ NULL, +/* 13d8 */ NULL, +/* 13d9 */ NULL, +/* 13da */ NULL, +/* 13db */ NULL, +/* 13dc */ NULL, +/* 13dd */ NULL, +/* 13de */ NULL, +/* 13df */ NULL, +/* 13e0 */ NULL, +/* 13e1 */ NULL, +/* 13e2 */ NULL, +/* 13e3 */ NULL, +/* 13e4 */ NULL, +/* 13e5 */ NULL, +/* 13e6 */ NULL, +/* 13e7 */ NULL, +/* 13e8 */ NULL, +/* 13e9 */ NULL, +/* 13ea */ NULL, +/* 13eb */ NULL, +/* 13ec */ NULL, +/* 13ed */ NULL, +/* 13ee */ NULL, +/* 13ef */ NULL, +/* 13f0 */ NULL, +/* 13f1 */ NULL, +/* 13f2 */ NULL, +/* 13f3 */ NULL, +/* 13f4 */ NULL, +/* 13f5 */ NULL, +/* 13f6 */ NULL, +/* 13f7 */ NULL, +/* 13f8 */ NULL, +/* 13f9 */ NULL, +/* 13fa */ NULL, +/* 13fb */ NULL, +/* 13fc */ NULL, +/* 13fd */ NULL, +/* 13fe */ NULL, +/* 13ff */ NULL, +/* 1400 */ NULL, +/* 1401 */ NULL, +/* 1402 */ NULL, +/* 1403 */ NULL, +/* 1404 */ NULL, +/* 1405 */ NULL, +/* 1406 */ NULL, +/* 1407 */ NULL, +/* 1408 */ NULL, +/* 1409 */ NULL, +/* 140a */ NULL, +/* 140b */ NULL, +/* 140c */ NULL, +/* 140d */ NULL, +/* 140e */ NULL, +/* 140f */ NULL, +/* 1410 */ NULL, +/* 1411 */ NULL, +/* 1412 */ NULL, +/* 1413 */ NULL, +/* 1414 */ NULL, +/* 1415 */ NULL, +/* 1416 */ NULL, +/* 1417 */ NULL, +/* 1418 */ NULL, +/* 1419 */ NULL, +/* 141a */ NULL, +/* 141b */ NULL, +/* 141c */ NULL, +/* 141d */ NULL, +/* 141e */ NULL, +/* 141f */ NULL, +/* 1420 */ NULL, +/* 1421 */ NULL, +/* 1422 */ NULL, +/* 1423 */ NULL, +/* 1424 */ NULL, +/* 1425 */ NULL, +/* 1426 */ NULL, +/* 1427 */ NULL, +/* 1428 */ NULL, +/* 1429 */ NULL, +/* 142a */ NULL, +/* 142b */ NULL, +/* 142c */ NULL, +/* 142d */ NULL, +/* 142e */ NULL, +/* 142f */ NULL, +/* 1430 */ NULL, +/* 1431 */ NULL, +/* 1432 */ NULL, +/* 1433 */ NULL, +/* 1434 */ NULL, +/* 1435 */ NULL, +/* 1436 */ NULL, +/* 1437 */ NULL, +/* 1438 */ NULL, +/* 1439 */ NULL, +/* 143a */ NULL, +/* 143b */ NULL, +/* 143c */ NULL, +/* 143d */ NULL, +/* 143e */ NULL, +/* 143f */ NULL, +/* 1440 */ NULL, +/* 1441 */ NULL, +/* 1442 */ NULL, +/* 1443 */ NULL, +/* 1444 */ NULL, +/* 1445 */ NULL, +/* 1446 */ NULL, +/* 1447 */ NULL, +/* 1448 */ NULL, +/* 1449 */ NULL, +/* 144a */ NULL, +/* 144b */ NULL, +/* 144c */ NULL, +/* 144d */ NULL, +/* 144e */ NULL, +/* 144f */ NULL, +/* 1450 */ NULL, +/* 1451 */ NULL, +/* 1452 */ NULL, +/* 1453 */ NULL, +/* 1454 */ NULL, +/* 1455 */ NULL, +/* 1456 */ NULL, +/* 1457 */ NULL, +/* 1458 */ NULL, +/* 1459 */ NULL, +/* 145a */ NULL, +/* 145b */ NULL, +/* 145c */ NULL, +/* 145d */ NULL, +/* 145e */ NULL, +/* 145f */ NULL, +/* 1460 */ NULL, +/* 1461 */ NULL, +/* 1462 */ NULL, +/* 1463 */ NULL, +/* 1464 */ NULL, +/* 1465 */ NULL, +/* 1466 */ NULL, +/* 1467 */ NULL, +/* 1468 */ NULL, +/* 1469 */ NULL, +/* 146a */ NULL, +/* 146b */ NULL, +/* 146c */ NULL, +/* 146d */ NULL, +/* 146e */ NULL, +/* 146f */ NULL, +/* 1470 */ NULL, +/* 1471 */ NULL, +/* 1472 */ NULL, +/* 1473 */ NULL, +/* 1474 */ NULL, +/* 1475 */ NULL, +/* 1476 */ NULL, +/* 1477 */ NULL, +/* 1478 */ NULL, +/* 1479 */ NULL, +/* 147a */ NULL, +/* 147b */ NULL, +/* 147c */ NULL, +/* 147d */ NULL, +/* 147e */ NULL, +/* 147f */ NULL, +/* 1480 */ NULL, +/* 1481 */ NULL, +/* 1482 */ NULL, +/* 1483 */ NULL, +/* 1484 */ NULL, +/* 1485 */ NULL, +/* 1486 */ NULL, +/* 1487 */ NULL, +/* 1488 */ NULL, +/* 1489 */ NULL, +/* 148a */ NULL, +/* 148b */ NULL, +/* 148c */ NULL, +/* 148d */ NULL, +/* 148e */ NULL, +/* 148f */ NULL, +/* 1490 */ NULL, +/* 1491 */ NULL, +/* 1492 */ NULL, +/* 1493 */ NULL, +/* 1494 */ NULL, +/* 1495 */ NULL, +/* 1496 */ NULL, +/* 1497 */ NULL, +/* 1498 */ NULL, +/* 1499 */ NULL, +/* 149a */ NULL, +/* 149b */ NULL, +/* 149c */ NULL, +/* 149d */ NULL, +/* 149e */ NULL, +/* 149f */ NULL, +/* 14a0 */ NULL, +/* 14a1 */ NULL, +/* 14a2 */ NULL, +/* 14a3 */ NULL, +/* 14a4 */ NULL, +/* 14a5 */ NULL, +/* 14a6 */ NULL, +/* 14a7 */ NULL, +/* 14a8 */ NULL, +/* 14a9 */ NULL, +/* 14aa */ NULL, +/* 14ab */ NULL, +/* 14ac */ NULL, +/* 14ad */ NULL, +/* 14ae */ NULL, +/* 14af */ NULL, +/* 14b0 */ NULL, +/* 14b1 */ NULL, +/* 14b2 */ NULL, +/* 14b3 */ NULL, +/* 14b4 */ NULL, +/* 14b5 */ NULL, +/* 14b6 */ NULL, +/* 14b7 */ NULL, +/* 14b8 */ NULL, +/* 14b9 */ NULL, +/* 14ba */ NULL, +/* 14bb */ NULL, +/* 14bc */ NULL, +/* 14bd */ NULL, +/* 14be */ NULL, +/* 14bf */ NULL, +/* 14c0 */ NULL, +/* 14c1 */ NULL, +/* 14c2 */ NULL, +/* 14c3 */ NULL, +/* 14c4 */ NULL, +/* 14c5 */ NULL, +/* 14c6 */ NULL, +/* 14c7 */ NULL, +/* 14c8 */ NULL, +/* 14c9 */ NULL, +/* 14ca */ NULL, +/* 14cb */ NULL, +/* 14cc */ NULL, +/* 14cd */ NULL, +/* 14ce */ NULL, +/* 14cf */ NULL, +/* 14d0 */ NULL, +/* 14d1 */ NULL, +/* 14d2 */ NULL, +/* 14d3 */ NULL, +/* 14d4 */ NULL, +/* 14d5 */ NULL, +/* 14d6 */ NULL, +/* 14d7 */ NULL, +/* 14d8 */ NULL, +/* 14d9 */ NULL, +/* 14da */ NULL, +/* 14db */ NULL, +/* 14dc */ NULL, +/* 14dd */ NULL, +/* 14de */ NULL, +/* 14df */ NULL, +/* 14e0 */ NULL, +/* 14e1 */ NULL, +/* 14e2 */ NULL, +/* 14e3 */ NULL, +/* 14e4 */ NULL, +/* 14e5 */ NULL, +/* 14e6 */ NULL, +/* 14e7 */ NULL, +/* 14e8 */ NULL, +/* 14e9 */ NULL, +/* 14ea */ NULL, +/* 14eb */ NULL, +/* 14ec */ NULL, +/* 14ed */ NULL, +/* 14ee */ NULL, +/* 14ef */ NULL, +/* 14f0 */ NULL, +/* 14f1 */ NULL, +/* 14f2 */ NULL, +/* 14f3 */ NULL, +/* 14f4 */ NULL, +/* 14f5 */ NULL, +/* 14f6 */ NULL, +/* 14f7 */ NULL, +/* 14f8 */ NULL, +/* 14f9 */ NULL, +/* 14fa */ NULL, +/* 14fb */ NULL, +/* 14fc */ NULL, +/* 14fd */ NULL, +/* 14fe */ NULL, +/* 14ff */ NULL, +/* 1500 */ NULL, +/* 1501 */ NULL, +/* 1502 */ NULL, +/* 1503 */ NULL, +/* 1504 */ NULL, +/* 1505 */ NULL, +/* 1506 */ NULL, +/* 1507 */ NULL, +/* 1508 */ NULL, +/* 1509 */ NULL, +/* 150a */ NULL, +/* 150b */ NULL, +/* 150c */ NULL, +/* 150d */ NULL, +/* 150e */ NULL, +/* 150f */ NULL, +/* 1510 */ NULL, +/* 1511 */ NULL, +/* 1512 */ NULL, +/* 1513 */ NULL, +/* 1514 */ NULL, +/* 1515 */ NULL, +/* 1516 */ NULL, +/* 1517 */ NULL, +/* 1518 */ NULL, +/* 1519 */ NULL, +/* 151a */ NULL, +/* 151b */ NULL, +/* 151c */ NULL, +/* 151d */ NULL, +/* 151e */ NULL, +/* 151f */ NULL, +/* 1520 */ NULL, +/* 1521 */ NULL, +/* 1522 */ NULL, +/* 1523 */ NULL, +/* 1524 */ NULL, +/* 1525 */ NULL, +/* 1526 */ NULL, +/* 1527 */ NULL, +/* 1528 */ NULL, +/* 1529 */ NULL, +/* 152a */ NULL, +/* 152b */ NULL, +/* 152c */ NULL, +/* 152d */ NULL, +/* 152e */ NULL, +/* 152f */ NULL, +/* 1530 */ NULL, +/* 1531 */ NULL, +/* 1532 */ NULL, +/* 1533 */ NULL, +/* 1534 */ NULL, +/* 1535 */ NULL, +/* 1536 */ NULL, +/* 1537 */ NULL, +/* 1538 */ NULL, +/* 1539 */ NULL, +/* 153a */ NULL, +/* 153b */ NULL, +/* 153c */ NULL, +/* 153d */ NULL, +/* 153e */ NULL, +/* 153f */ NULL, +/* 1540 */ NULL, +/* 1541 */ NULL, +/* 1542 */ NULL, +/* 1543 */ NULL, +/* 1544 */ NULL, +/* 1545 */ NULL, +/* 1546 */ NULL, +/* 1547 */ NULL, +/* 1548 */ NULL, +/* 1549 */ NULL, +/* 154a */ NULL, +/* 154b */ NULL, +/* 154c */ NULL, +/* 154d */ NULL, +/* 154e */ NULL, +/* 154f */ NULL, +/* 1550 */ NULL, +/* 1551 */ NULL, +/* 1552 */ NULL, +/* 1553 */ NULL, +/* 1554 */ NULL, +/* 1555 */ NULL, +/* 1556 */ NULL, +/* 1557 */ NULL, +/* 1558 */ NULL, +/* 1559 */ NULL, +/* 155a */ NULL, +/* 155b */ NULL, +/* 155c */ NULL, +/* 155d */ NULL, +/* 155e */ NULL, +/* 155f */ NULL, +/* 1560 */ NULL, +/* 1561 */ NULL, +/* 1562 */ NULL, +/* 1563 */ NULL, +/* 1564 */ NULL, +/* 1565 */ NULL, +/* 1566 */ NULL, +/* 1567 */ NULL, +/* 1568 */ NULL, +/* 1569 */ NULL, +/* 156a */ NULL, +/* 156b */ NULL, +/* 156c */ NULL, +/* 156d */ NULL, +/* 156e */ NULL, +/* 156f */ NULL, +/* 1570 */ NULL, +/* 1571 */ NULL, +/* 1572 */ NULL, +/* 1573 */ NULL, +/* 1574 */ NULL, +/* 1575 */ NULL, +/* 1576 */ NULL, +/* 1577 */ NULL, +/* 1578 */ NULL, +/* 1579 */ NULL, +/* 157a */ NULL, +/* 157b */ NULL, +/* 157c */ NULL, +/* 157d */ NULL, +/* 157e */ NULL, +/* 157f */ NULL, +/* 1580 */ NULL, +/* 1581 */ NULL, +/* 1582 */ NULL, +/* 1583 */ NULL, +/* 1584 */ NULL, +/* 1585 */ NULL, +/* 1586 */ NULL, +/* 1587 */ NULL, +/* 1588 */ NULL, +/* 1589 */ NULL, +/* 158a */ NULL, +/* 158b */ NULL, +/* 158c */ NULL, +/* 158d */ NULL, +/* 158e */ NULL, +/* 158f */ NULL, +/* 1590 */ NULL, +/* 1591 */ NULL, +/* 1592 */ NULL, +/* 1593 */ NULL, +/* 1594 */ NULL, +/* 1595 */ NULL, +/* 1596 */ NULL, +/* 1597 */ NULL, +/* 1598 */ NULL, +/* 1599 */ NULL, +/* 159a */ NULL, +/* 159b */ NULL, +/* 159c */ NULL, +/* 159d */ NULL, +/* 159e */ NULL, +/* 159f */ NULL, +/* 15a0 */ NULL, +/* 15a1 */ NULL, +/* 15a2 */ NULL, +/* 15a3 */ NULL, +/* 15a4 */ NULL, +/* 15a5 */ NULL, +/* 15a6 */ NULL, +/* 15a7 */ NULL, +/* 15a8 */ NULL, +/* 15a9 */ NULL, +/* 15aa */ NULL, +/* 15ab */ NULL, +/* 15ac */ NULL, +/* 15ad */ NULL, +/* 15ae */ NULL, +/* 15af */ NULL, +/* 15b0 */ NULL, +/* 15b1 */ NULL, +/* 15b2 */ NULL, +/* 15b3 */ NULL, +/* 15b4 */ NULL, +/* 15b5 */ NULL, +/* 15b6 */ NULL, +/* 15b7 */ NULL, +/* 15b8 */ NULL, +/* 15b9 */ NULL, +/* 15ba */ NULL, +/* 15bb */ NULL, +/* 15bc */ NULL, +/* 15bd */ NULL, +/* 15be */ NULL, +/* 15bf */ NULL, +/* 15c0 */ NULL, +/* 15c1 */ NULL, +/* 15c2 */ NULL, +/* 15c3 */ NULL, +/* 15c4 */ NULL, +/* 15c5 */ NULL, +/* 15c6 */ NULL, +/* 15c7 */ NULL, +/* 15c8 */ NULL, +/* 15c9 */ NULL, +/* 15ca */ NULL, +/* 15cb */ NULL, +/* 15cc */ NULL, +/* 15cd */ NULL, +/* 15ce */ NULL, +/* 15cf */ NULL, +/* 15d0 */ NULL, +/* 15d1 */ NULL, +/* 15d2 */ NULL, +/* 15d3 */ NULL, +/* 15d4 */ NULL, +/* 15d5 */ NULL, +/* 15d6 */ NULL, +/* 15d7 */ NULL, +/* 15d8 */ NULL, +/* 15d9 */ NULL, +/* 15da */ NULL, +/* 15db */ NULL, +/* 15dc */ NULL, +/* 15dd */ NULL, +/* 15de */ NULL, +/* 15df */ NULL, +/* 15e0 */ NULL, +/* 15e1 */ NULL, +/* 15e2 */ NULL, +/* 15e3 */ NULL, +/* 15e4 */ NULL, +/* 15e5 */ NULL, +/* 15e6 */ NULL, +/* 15e7 */ NULL, +/* 15e8 */ NULL, +/* 15e9 */ NULL, +/* 15ea */ NULL, +/* 15eb */ NULL, +/* 15ec */ NULL, +/* 15ed */ NULL, +/* 15ee */ NULL, +/* 15ef */ NULL, +/* 15f0 */ NULL, +/* 15f1 */ NULL, +/* 15f2 */ NULL, +/* 15f3 */ NULL, +/* 15f4 */ NULL, +/* 15f5 */ NULL, +/* 15f6 */ NULL, +/* 15f7 */ NULL, +/* 15f8 */ NULL, +/* 15f9 */ NULL, +/* 15fa */ NULL, +/* 15fb */ NULL, +/* 15fc */ NULL, +/* 15fd */ NULL, +/* 15fe */ NULL, +/* 15ff */ NULL, +/* 1600 */ NULL, +/* 1601 */ NULL, +/* 1602 */ NULL, +/* 1603 */ NULL, +/* 1604 */ NULL, +/* 1605 */ NULL, +/* 1606 */ NULL, +/* 1607 */ NULL, +/* 1608 */ NULL, +/* 1609 */ NULL, +/* 160a */ NULL, +/* 160b */ NULL, +/* 160c */ NULL, +/* 160d */ NULL, +/* 160e */ NULL, +/* 160f */ NULL, +/* 1610 */ NULL, +/* 1611 */ NULL, +/* 1612 */ NULL, +/* 1613 */ NULL, +/* 1614 */ NULL, +/* 1615 */ NULL, +/* 1616 */ NULL, +/* 1617 */ NULL, +/* 1618 */ NULL, +/* 1619 */ NULL, +/* 161a */ NULL, +/* 161b */ NULL, +/* 161c */ NULL, +/* 161d */ NULL, +/* 161e */ NULL, +/* 161f */ NULL, +/* 1620 */ NULL, +/* 1621 */ NULL, +/* 1622 */ NULL, +/* 1623 */ NULL, +/* 1624 */ NULL, +/* 1625 */ NULL, +/* 1626 */ NULL, +/* 1627 */ NULL, +/* 1628 */ NULL, +/* 1629 */ NULL, +/* 162a */ NULL, +/* 162b */ NULL, +/* 162c */ NULL, +/* 162d */ NULL, +/* 162e */ NULL, +/* 162f */ NULL, +/* 1630 */ NULL, +/* 1631 */ NULL, +/* 1632 */ NULL, +/* 1633 */ NULL, +/* 1634 */ NULL, +/* 1635 */ NULL, +/* 1636 */ NULL, +/* 1637 */ NULL, +/* 1638 */ NULL, +/* 1639 */ NULL, +/* 163a */ NULL, +/* 163b */ NULL, +/* 163c */ NULL, +/* 163d */ NULL, +/* 163e */ NULL, +/* 163f */ NULL, +/* 1640 */ NULL, +/* 1641 */ NULL, +/* 1642 */ NULL, +/* 1643 */ NULL, +/* 1644 */ NULL, +/* 1645 */ NULL, +/* 1646 */ NULL, +/* 1647 */ NULL, +/* 1648 */ NULL, +/* 1649 */ NULL, +/* 164a */ NULL, +/* 164b */ NULL, +/* 164c */ NULL, +/* 164d */ NULL, +/* 164e */ NULL, +/* 164f */ NULL, +/* 1650 */ NULL, +/* 1651 */ NULL, +/* 1652 */ NULL, +/* 1653 */ NULL, +/* 1654 */ NULL, +/* 1655 */ NULL, +/* 1656 */ NULL, +/* 1657 */ NULL, +/* 1658 */ NULL, +/* 1659 */ NULL, +/* 165a */ NULL, +/* 165b */ NULL, +/* 165c */ NULL, +/* 165d */ NULL, +/* 165e */ NULL, +/* 165f */ NULL, +/* 1660 */ NULL, +/* 1661 */ NULL, +/* 1662 */ NULL, +/* 1663 */ NULL, +/* 1664 */ NULL, +/* 1665 */ NULL, +/* 1666 */ NULL, +/* 1667 */ NULL, +/* 1668 */ NULL, +/* 1669 */ NULL, +/* 166a */ NULL, +/* 166b */ NULL, +/* 166c */ NULL, +/* 166d */ NULL, +/* 166e */ NULL, +/* 166f */ NULL, +/* 1670 */ NULL, +/* 1671 */ NULL, +/* 1672 */ NULL, +/* 1673 */ NULL, +/* 1674 */ NULL, +/* 1675 */ NULL, +/* 1676 */ NULL, +/* 1677 */ NULL, +/* 1678 */ NULL, +/* 1679 */ NULL, +/* 167a */ NULL, +/* 167b */ NULL, +/* 167c */ NULL, +/* 167d */ NULL, +/* 167e */ NULL, +/* 167f */ NULL, +/* 1680 */ NULL, +/* 1681 */ NULL, +/* 1682 */ NULL, +/* 1683 */ NULL, +/* 1684 */ NULL, +/* 1685 */ NULL, +/* 1686 */ NULL, +/* 1687 */ NULL, +/* 1688 */ NULL, +/* 1689 */ NULL, +/* 168a */ NULL, +/* 168b */ NULL, +/* 168c */ NULL, +/* 168d */ NULL, +/* 168e */ NULL, +/* 168f */ NULL, +/* 1690 */ NULL, +/* 1691 */ NULL, +/* 1692 */ NULL, +/* 1693 */ NULL, +/* 1694 */ NULL, +/* 1695 */ NULL, +/* 1696 */ NULL, +/* 1697 */ NULL, +/* 1698 */ NULL, +/* 1699 */ NULL, +/* 169a */ NULL, +/* 169b */ NULL, +/* 169c */ NULL, +/* 169d */ NULL, +/* 169e */ NULL, +/* 169f */ NULL, +/* 16a0 */ NULL, +/* 16a1 */ NULL, +/* 16a2 */ NULL, +/* 16a3 */ NULL, +/* 16a4 */ NULL, +/* 16a5 */ NULL, +/* 16a6 */ NULL, +/* 16a7 */ NULL, +/* 16a8 */ NULL, +/* 16a9 */ NULL, +/* 16aa */ NULL, +/* 16ab */ NULL, +/* 16ac */ NULL, +/* 16ad */ NULL, +/* 16ae */ NULL, +/* 16af */ NULL, +/* 16b0 */ NULL, +/* 16b1 */ NULL, +/* 16b2 */ NULL, +/* 16b3 */ NULL, +/* 16b4 */ NULL, +/* 16b5 */ NULL, +/* 16b6 */ NULL, +/* 16b7 */ NULL, +/* 16b8 */ NULL, +/* 16b9 */ NULL, +/* 16ba */ NULL, +/* 16bb */ NULL, +/* 16bc */ NULL, +/* 16bd */ NULL, +/* 16be */ NULL, +/* 16bf */ NULL, +/* 16c0 */ NULL, +/* 16c1 */ NULL, +/* 16c2 */ NULL, +/* 16c3 */ NULL, +/* 16c4 */ NULL, +/* 16c5 */ NULL, +/* 16c6 */ NULL, +/* 16c7 */ NULL, +/* 16c8 */ NULL, +/* 16c9 */ NULL, +/* 16ca */ NULL, +/* 16cb */ NULL, +/* 16cc */ NULL, +/* 16cd */ NULL, +/* 16ce */ NULL, +/* 16cf */ NULL, +/* 16d0 */ NULL, +/* 16d1 */ NULL, +/* 16d2 */ NULL, +/* 16d3 */ NULL, +/* 16d4 */ NULL, +/* 16d5 */ NULL, +/* 16d6 */ NULL, +/* 16d7 */ NULL, +/* 16d8 */ NULL, +/* 16d9 */ NULL, +/* 16da */ NULL, +/* 16db */ NULL, +/* 16dc */ NULL, +/* 16dd */ NULL, +/* 16de */ NULL, +/* 16df */ NULL, +/* 16e0 */ NULL, +/* 16e1 */ NULL, +/* 16e2 */ NULL, +/* 16e3 */ NULL, +/* 16e4 */ NULL, +/* 16e5 */ NULL, +/* 16e6 */ NULL, +/* 16e7 */ NULL, +/* 16e8 */ NULL, +/* 16e9 */ NULL, +/* 16ea */ NULL, +/* 16eb */ NULL, +/* 16ec */ NULL, +/* 16ed */ NULL, +/* 16ee */ NULL, +/* 16ef */ NULL, +/* 16f0 */ NULL, +/* 16f1 */ NULL, +/* 16f2 */ NULL, +/* 16f3 */ NULL, +/* 16f4 */ NULL, +/* 16f5 */ NULL, +/* 16f6 */ NULL, +/* 16f7 */ NULL, +/* 16f8 */ NULL, +/* 16f9 */ NULL, +/* 16fa */ NULL, +/* 16fb */ NULL, +/* 16fc */ NULL, +/* 16fd */ NULL, +/* 16fe */ NULL, +/* 16ff */ NULL, +/* 1700 */ NULL, +/* 1701 */ NULL, +/* 1702 */ NULL, +/* 1703 */ NULL, +/* 1704 */ NULL, +/* 1705 */ NULL, +/* 1706 */ NULL, +/* 1707 */ NULL, +/* 1708 */ NULL, +/* 1709 */ NULL, +/* 170a */ NULL, +/* 170b */ NULL, +/* 170c */ NULL, +/* 170d */ NULL, +/* 170e */ NULL, +/* 170f */ NULL, +/* 1710 */ NULL, +/* 1711 */ NULL, +/* 1712 */ NULL, +/* 1713 */ NULL, +/* 1714 */ NULL, +/* 1715 */ NULL, +/* 1716 */ NULL, +/* 1717 */ NULL, +/* 1718 */ NULL, +/* 1719 */ NULL, +/* 171a */ NULL, +/* 171b */ NULL, +/* 171c */ NULL, +/* 171d */ NULL, +/* 171e */ NULL, +/* 171f */ NULL, +/* 1720 */ NULL, +/* 1721 */ NULL, +/* 1722 */ NULL, +/* 1723 */ NULL, +/* 1724 */ NULL, +/* 1725 */ NULL, +/* 1726 */ NULL, +/* 1727 */ NULL, +/* 1728 */ NULL, +/* 1729 */ NULL, +/* 172a */ NULL, +/* 172b */ NULL, +/* 172c */ NULL, +/* 172d */ NULL, +/* 172e */ NULL, +/* 172f */ NULL, +/* 1730 */ NULL, +/* 1731 */ NULL, +/* 1732 */ NULL, +/* 1733 */ NULL, +/* 1734 */ NULL, +/* 1735 */ NULL, +/* 1736 */ NULL, +/* 1737 */ NULL, +/* 1738 */ NULL, +/* 1739 */ NULL, +/* 173a */ NULL, +/* 173b */ NULL, +/* 173c */ NULL, +/* 173d */ NULL, +/* 173e */ NULL, +/* 173f */ NULL, +/* 1740 */ NULL, +/* 1741 */ NULL, +/* 1742 */ NULL, +/* 1743 */ NULL, +/* 1744 */ NULL, +/* 1745 */ NULL, +/* 1746 */ NULL, +/* 1747 */ NULL, +/* 1748 */ NULL, +/* 1749 */ NULL, +/* 174a */ NULL, +/* 174b */ NULL, +/* 174c */ NULL, +/* 174d */ NULL, +/* 174e */ NULL, +/* 174f */ NULL, +/* 1750 */ NULL, +/* 1751 */ NULL, +/* 1752 */ NULL, +/* 1753 */ NULL, +/* 1754 */ NULL, +/* 1755 */ NULL, +/* 1756 */ NULL, +/* 1757 */ NULL, +/* 1758 */ NULL, +/* 1759 */ NULL, +/* 175a */ NULL, +/* 175b */ NULL, +/* 175c */ NULL, +/* 175d */ NULL, +/* 175e */ NULL, +/* 175f */ NULL, +/* 1760 */ NULL, +/* 1761 */ NULL, +/* 1762 */ NULL, +/* 1763 */ NULL, +/* 1764 */ NULL, +/* 1765 */ NULL, +/* 1766 */ NULL, +/* 1767 */ NULL, +/* 1768 */ NULL, +/* 1769 */ NULL, +/* 176a */ NULL, +/* 176b */ NULL, +/* 176c */ NULL, +/* 176d */ NULL, +/* 176e */ NULL, +/* 176f */ NULL, +/* 1770 */ NULL, +/* 1771 */ NULL, +/* 1772 */ NULL, +/* 1773 */ NULL, +/* 1774 */ NULL, +/* 1775 */ NULL, +/* 1776 */ NULL, +/* 1777 */ NULL, +/* 1778 */ NULL, +/* 1779 */ NULL, +/* 177a */ NULL, +/* 177b */ NULL, +/* 177c */ NULL, +/* 177d */ NULL, +/* 177e */ NULL, +/* 177f */ NULL, +/* 1780 */ NULL, +/* 1781 */ NULL, +/* 1782 */ NULL, +/* 1783 */ NULL, +/* 1784 */ NULL, +/* 1785 */ NULL, +/* 1786 */ NULL, +/* 1787 */ NULL, +/* 1788 */ NULL, +/* 1789 */ NULL, +/* 178a */ NULL, +/* 178b */ NULL, +/* 178c */ NULL, +/* 178d */ NULL, +/* 178e */ NULL, +/* 178f */ NULL, +/* 1790 */ NULL, +/* 1791 */ NULL, +/* 1792 */ NULL, +/* 1793 */ NULL, +/* 1794 */ NULL, +/* 1795 */ NULL, +/* 1796 */ NULL, +/* 1797 */ NULL, +/* 1798 */ NULL, +/* 1799 */ NULL, +/* 179a */ NULL, +/* 179b */ NULL, +/* 179c */ NULL, +/* 179d */ NULL, +/* 179e */ NULL, +/* 179f */ NULL, +/* 17a0 */ NULL, +/* 17a1 */ NULL, +/* 17a2 */ NULL, +/* 17a3 */ NULL, +/* 17a4 */ NULL, +/* 17a5 */ NULL, +/* 17a6 */ NULL, +/* 17a7 */ NULL, +/* 17a8 */ NULL, +/* 17a9 */ NULL, +/* 17aa */ NULL, +/* 17ab */ NULL, +/* 17ac */ NULL, +/* 17ad */ NULL, +/* 17ae */ NULL, +/* 17af */ NULL, +/* 17b0 */ NULL, +/* 17b1 */ NULL, +/* 17b2 */ NULL, +/* 17b3 */ NULL, +/* 17b4 */ NULL, +/* 17b5 */ NULL, +/* 17b6 */ NULL, +/* 17b7 */ NULL, +/* 17b8 */ NULL, +/* 17b9 */ NULL, +/* 17ba */ NULL, +/* 17bb */ NULL, +/* 17bc */ NULL, +/* 17bd */ NULL, +/* 17be */ NULL, +/* 17bf */ NULL, +/* 17c0 */ NULL, +/* 17c1 */ NULL, +/* 17c2 */ NULL, +/* 17c3 */ NULL, +/* 17c4 */ NULL, +/* 17c5 */ NULL, +/* 17c6 */ NULL, +/* 17c7 */ NULL, +/* 17c8 */ NULL, +/* 17c9 */ NULL, +/* 17ca */ NULL, +/* 17cb */ NULL, +/* 17cc */ NULL, +/* 17cd */ NULL, +/* 17ce */ NULL, +/* 17cf */ NULL, +/* 17d0 */ NULL, +/* 17d1 */ NULL, +/* 17d2 */ NULL, +/* 17d3 */ NULL, +/* 17d4 */ NULL, +/* 17d5 */ NULL, +/* 17d6 */ NULL, +/* 17d7 */ NULL, +/* 17d8 */ NULL, +/* 17d9 */ NULL, +/* 17da */ NULL, +/* 17db */ NULL, +/* 17dc */ NULL, +/* 17dd */ NULL, +/* 17de */ NULL, +/* 17df */ NULL, +/* 17e0 */ NULL, +/* 17e1 */ NULL, +/* 17e2 */ NULL, +/* 17e3 */ NULL, +/* 17e4 */ NULL, +/* 17e5 */ NULL, +/* 17e6 */ NULL, +/* 17e7 */ NULL, +/* 17e8 */ NULL, +/* 17e9 */ NULL, +/* 17ea */ NULL, +/* 17eb */ NULL, +/* 17ec */ NULL, +/* 17ed */ NULL, +/* 17ee */ NULL, +/* 17ef */ NULL, +/* 17f0 */ NULL, +/* 17f1 */ NULL, +/* 17f2 */ NULL, +/* 17f3 */ NULL, +/* 17f4 */ NULL, +/* 17f5 */ NULL, +/* 17f6 */ NULL, +/* 17f7 */ NULL, +/* 17f8 */ NULL, +/* 17f9 */ NULL, +/* 17fa */ NULL, +/* 17fb */ NULL, +/* 17fc */ NULL, +/* 17fd */ NULL, +/* 17fe */ NULL, +/* 17ff */ NULL, +/* 1800 */ NULL, +/* 1801 */ NULL, +/* 1802 */ NULL, +/* 1803 */ NULL, +/* 1804 */ NULL, +/* 1805 */ NULL, +/* 1806 */ NULL, +/* 1807 */ NULL, +/* 1808 */ NULL, +/* 1809 */ NULL, +/* 180a */ NULL, +/* 180b */ NULL, +/* 180c */ NULL, +/* 180d */ NULL, +/* 180e */ NULL, +/* 180f */ NULL, +/* 1810 */ NULL, +/* 1811 */ NULL, +/* 1812 */ NULL, +/* 1813 */ NULL, +/* 1814 */ NULL, +/* 1815 */ NULL, +/* 1816 */ NULL, +/* 1817 */ NULL, +/* 1818 */ NULL, +/* 1819 */ NULL, +/* 181a */ NULL, +/* 181b */ NULL, +/* 181c */ NULL, +/* 181d */ NULL, +/* 181e */ NULL, +/* 181f */ NULL, +/* 1820 */ NULL, +/* 1821 */ NULL, +/* 1822 */ NULL, +/* 1823 */ NULL, +/* 1824 */ NULL, +/* 1825 */ NULL, +/* 1826 */ NULL, +/* 1827 */ NULL, +/* 1828 */ NULL, +/* 1829 */ NULL, +/* 182a */ NULL, +/* 182b */ NULL, +/* 182c */ NULL, +/* 182d */ NULL, +/* 182e */ NULL, +/* 182f */ NULL, +/* 1830 */ NULL, +/* 1831 */ NULL, +/* 1832 */ NULL, +/* 1833 */ NULL, +/* 1834 */ NULL, +/* 1835 */ NULL, +/* 1836 */ NULL, +/* 1837 */ NULL, +/* 1838 */ NULL, +/* 1839 */ NULL, +/* 183a */ NULL, +/* 183b */ NULL, +/* 183c */ NULL, +/* 183d */ NULL, +/* 183e */ NULL, +/* 183f */ NULL, +/* 1840 */ NULL, +/* 1841 */ NULL, +/* 1842 */ NULL, +/* 1843 */ NULL, +/* 1844 */ NULL, +/* 1845 */ NULL, +/* 1846 */ NULL, +/* 1847 */ NULL, +/* 1848 */ NULL, +/* 1849 */ NULL, +/* 184a */ NULL, +/* 184b */ NULL, +/* 184c */ NULL, +/* 184d */ NULL, +/* 184e */ NULL, +/* 184f */ NULL, +/* 1850 */ NULL, +/* 1851 */ NULL, +/* 1852 */ NULL, +/* 1853 */ NULL, +/* 1854 */ NULL, +/* 1855 */ NULL, +/* 1856 */ NULL, +/* 1857 */ NULL, +/* 1858 */ NULL, +/* 1859 */ NULL, +/* 185a */ NULL, +/* 185b */ NULL, +/* 185c */ NULL, +/* 185d */ NULL, +/* 185e */ NULL, +/* 185f */ NULL, +/* 1860 */ NULL, +/* 1861 */ NULL, +/* 1862 */ NULL, +/* 1863 */ NULL, +/* 1864 */ NULL, +/* 1865 */ NULL, +/* 1866 */ NULL, +/* 1867 */ NULL, +/* 1868 */ NULL, +/* 1869 */ NULL, +/* 186a */ NULL, +/* 186b */ NULL, +/* 186c */ NULL, +/* 186d */ NULL, +/* 186e */ NULL, +/* 186f */ NULL, +/* 1870 */ NULL, +/* 1871 */ NULL, +/* 1872 */ NULL, +/* 1873 */ NULL, +/* 1874 */ NULL, +/* 1875 */ NULL, +/* 1876 */ NULL, +/* 1877 */ NULL, +/* 1878 */ NULL, +/* 1879 */ NULL, +/* 187a */ NULL, +/* 187b */ NULL, +/* 187c */ NULL, +/* 187d */ NULL, +/* 187e */ NULL, +/* 187f */ NULL, +/* 1880 */ NULL, +/* 1881 */ NULL, +/* 1882 */ NULL, +/* 1883 */ NULL, +/* 1884 */ NULL, +/* 1885 */ NULL, +/* 1886 */ NULL, +/* 1887 */ NULL, +/* 1888 */ NULL, +/* 1889 */ NULL, +/* 188a */ NULL, +/* 188b */ NULL, +/* 188c */ NULL, +/* 188d */ NULL, +/* 188e */ NULL, +/* 188f */ NULL, +/* 1890 */ NULL, +/* 1891 */ NULL, +/* 1892 */ NULL, +/* 1893 */ NULL, +/* 1894 */ NULL, +/* 1895 */ NULL, +/* 1896 */ NULL, +/* 1897 */ NULL, +/* 1898 */ NULL, +/* 1899 */ NULL, +/* 189a */ NULL, +/* 189b */ NULL, +/* 189c */ NULL, +/* 189d */ NULL, +/* 189e */ NULL, +/* 189f */ NULL, +/* 18a0 */ NULL, +/* 18a1 */ NULL, +/* 18a2 */ NULL, +/* 18a3 */ NULL, +/* 18a4 */ NULL, +/* 18a5 */ NULL, +/* 18a6 */ NULL, +/* 18a7 */ NULL, +/* 18a8 */ NULL, +/* 18a9 */ NULL, +/* 18aa */ NULL, +/* 18ab */ NULL, +/* 18ac */ NULL, +/* 18ad */ NULL, +/* 18ae */ NULL, +/* 18af */ NULL, +/* 18b0 */ NULL, +/* 18b1 */ NULL, +/* 18b2 */ NULL, +/* 18b3 */ NULL, +/* 18b4 */ NULL, +/* 18b5 */ NULL, +/* 18b6 */ NULL, +/* 18b7 */ NULL, +/* 18b8 */ NULL, +/* 18b9 */ NULL, +/* 18ba */ NULL, +/* 18bb */ NULL, +/* 18bc */ NULL, +/* 18bd */ NULL, +/* 18be */ NULL, +/* 18bf */ NULL, +/* 18c0 */ NULL, +/* 18c1 */ NULL, +/* 18c2 */ NULL, +/* 18c3 */ NULL, +/* 18c4 */ NULL, +/* 18c5 */ NULL, +/* 18c6 */ NULL, +/* 18c7 */ NULL, +/* 18c8 */ NULL, +/* 18c9 */ NULL, +/* 18ca */ NULL, +/* 18cb */ NULL, +/* 18cc */ NULL, +/* 18cd */ NULL, +/* 18ce */ NULL, +/* 18cf */ NULL, +/* 18d0 */ NULL, +/* 18d1 */ NULL, +/* 18d2 */ NULL, +/* 18d3 */ NULL, +/* 18d4 */ NULL, +/* 18d5 */ NULL, +/* 18d6 */ NULL, +/* 18d7 */ NULL, +/* 18d8 */ NULL, +/* 18d9 */ NULL, +/* 18da */ NULL, +/* 18db */ NULL, +/* 18dc */ NULL, +/* 18dd */ NULL, +/* 18de */ NULL, +/* 18df */ NULL, +/* 18e0 */ NULL, +/* 18e1 */ NULL, +/* 18e2 */ NULL, +/* 18e3 */ NULL, +/* 18e4 */ NULL, +/* 18e5 */ NULL, +/* 18e6 */ NULL, +/* 18e7 */ NULL, +/* 18e8 */ NULL, +/* 18e9 */ NULL, +/* 18ea */ NULL, +/* 18eb */ NULL, +/* 18ec */ NULL, +/* 18ed */ NULL, +/* 18ee */ NULL, +/* 18ef */ NULL, +/* 18f0 */ NULL, +/* 18f1 */ NULL, +/* 18f2 */ NULL, +/* 18f3 */ NULL, +/* 18f4 */ NULL, +/* 18f5 */ NULL, +/* 18f6 */ NULL, +/* 18f7 */ NULL, +/* 18f8 */ NULL, +/* 18f9 */ NULL, +/* 18fa */ NULL, +/* 18fb */ NULL, +/* 18fc */ NULL, +/* 18fd */ NULL, +/* 18fe */ NULL, +/* 18ff */ NULL, +/* 1900 */ NULL, +/* 1901 */ NULL, +/* 1902 */ NULL, +/* 1903 */ NULL, +/* 1904 */ NULL, +/* 1905 */ NULL, +/* 1906 */ NULL, +/* 1907 */ NULL, +/* 1908 */ NULL, +/* 1909 */ NULL, +/* 190a */ NULL, +/* 190b */ NULL, +/* 190c */ NULL, +/* 190d */ NULL, +/* 190e */ NULL, +/* 190f */ NULL, +/* 1910 */ NULL, +/* 1911 */ NULL, +/* 1912 */ NULL, +/* 1913 */ NULL, +/* 1914 */ NULL, +/* 1915 */ NULL, +/* 1916 */ NULL, +/* 1917 */ NULL, +/* 1918 */ NULL, +/* 1919 */ NULL, +/* 191a */ NULL, +/* 191b */ NULL, +/* 191c */ NULL, +/* 191d */ NULL, +/* 191e */ NULL, +/* 191f */ NULL, +/* 1920 */ NULL, +/* 1921 */ NULL, +/* 1922 */ NULL, +/* 1923 */ NULL, +/* 1924 */ NULL, +/* 1925 */ NULL, +/* 1926 */ NULL, +/* 1927 */ NULL, +/* 1928 */ NULL, +/* 1929 */ NULL, +/* 192a */ NULL, +/* 192b */ NULL, +/* 192c */ NULL, +/* 192d */ NULL, +/* 192e */ NULL, +/* 192f */ NULL, +/* 1930 */ NULL, +/* 1931 */ NULL, +/* 1932 */ NULL, +/* 1933 */ NULL, +/* 1934 */ NULL, +/* 1935 */ NULL, +/* 1936 */ NULL, +/* 1937 */ NULL, +/* 1938 */ NULL, +/* 1939 */ NULL, +/* 193a */ NULL, +/* 193b */ NULL, +/* 193c */ NULL, +/* 193d */ NULL, +/* 193e */ NULL, +/* 193f */ NULL, +/* 1940 */ NULL, +/* 1941 */ NULL, +/* 1942 */ NULL, +/* 1943 */ NULL, +/* 1944 */ NULL, +/* 1945 */ NULL, +/* 1946 */ NULL, +/* 1947 */ NULL, +/* 1948 */ NULL, +/* 1949 */ NULL, +/* 194a */ NULL, +/* 194b */ NULL, +/* 194c */ NULL, +/* 194d */ NULL, +/* 194e */ NULL, +/* 194f */ NULL, +/* 1950 */ NULL, +/* 1951 */ NULL, +/* 1952 */ NULL, +/* 1953 */ NULL, +/* 1954 */ NULL, +/* 1955 */ NULL, +/* 1956 */ NULL, +/* 1957 */ NULL, +/* 1958 */ NULL, +/* 1959 */ NULL, +/* 195a */ NULL, +/* 195b */ NULL, +/* 195c */ NULL, +/* 195d */ NULL, +/* 195e */ NULL, +/* 195f */ NULL, +/* 1960 */ NULL, +/* 1961 */ NULL, +/* 1962 */ NULL, +/* 1963 */ NULL, +/* 1964 */ NULL, +/* 1965 */ NULL, +/* 1966 */ NULL, +/* 1967 */ NULL, +/* 1968 */ NULL, +/* 1969 */ NULL, +/* 196a */ NULL, +/* 196b */ NULL, +/* 196c */ NULL, +/* 196d */ NULL, +/* 196e */ NULL, +/* 196f */ NULL, +/* 1970 */ NULL, +/* 1971 */ NULL, +/* 1972 */ NULL, +/* 1973 */ NULL, +/* 1974 */ NULL, +/* 1975 */ NULL, +/* 1976 */ NULL, +/* 1977 */ NULL, +/* 1978 */ NULL, +/* 1979 */ NULL, +/* 197a */ NULL, +/* 197b */ NULL, +/* 197c */ NULL, +/* 197d */ NULL, +/* 197e */ NULL, +/* 197f */ NULL, +/* 1980 */ NULL, +/* 1981 */ NULL, +/* 1982 */ NULL, +/* 1983 */ NULL, +/* 1984 */ NULL, +/* 1985 */ NULL, +/* 1986 */ NULL, +/* 1987 */ NULL, +/* 1988 */ NULL, +/* 1989 */ NULL, +/* 198a */ NULL, +/* 198b */ NULL, +/* 198c */ NULL, +/* 198d */ NULL, +/* 198e */ NULL, +/* 198f */ NULL, +/* 1990 */ NULL, +/* 1991 */ NULL, +/* 1992 */ NULL, +/* 1993 */ NULL, +/* 1994 */ NULL, +/* 1995 */ NULL, +/* 1996 */ NULL, +/* 1997 */ NULL, +/* 1998 */ NULL, +/* 1999 */ NULL, +/* 199a */ NULL, +/* 199b */ NULL, +/* 199c */ NULL, +/* 199d */ NULL, +/* 199e */ NULL, +/* 199f */ NULL, +/* 19a0 */ NULL, +/* 19a1 */ NULL, +/* 19a2 */ NULL, +/* 19a3 */ NULL, +/* 19a4 */ NULL, +/* 19a5 */ NULL, +/* 19a6 */ NULL, +/* 19a7 */ NULL, +/* 19a8 */ NULL, +/* 19a9 */ NULL, +/* 19aa */ NULL, +/* 19ab */ NULL, +/* 19ac */ NULL, +/* 19ad */ NULL, +/* 19ae */ NULL, +/* 19af */ NULL, +/* 19b0 */ NULL, +/* 19b1 */ NULL, +/* 19b2 */ NULL, +/* 19b3 */ NULL, +/* 19b4 */ NULL, +/* 19b5 */ NULL, +/* 19b6 */ NULL, +/* 19b7 */ NULL, +/* 19b8 */ NULL, +/* 19b9 */ NULL, +/* 19ba */ NULL, +/* 19bb */ NULL, +/* 19bc */ NULL, +/* 19bd */ NULL, +/* 19be */ NULL, +/* 19bf */ NULL, +/* 19c0 */ NULL, +/* 19c1 */ NULL, +/* 19c2 */ NULL, +/* 19c3 */ NULL, +/* 19c4 */ NULL, +/* 19c5 */ NULL, +/* 19c6 */ NULL, +/* 19c7 */ NULL, +/* 19c8 */ NULL, +/* 19c9 */ NULL, +/* 19ca */ NULL, +/* 19cb */ NULL, +/* 19cc */ NULL, +/* 19cd */ NULL, +/* 19ce */ NULL, +/* 19cf */ NULL, +/* 19d0 */ NULL, +/* 19d1 */ NULL, +/* 19d2 */ NULL, +/* 19d3 */ NULL, +/* 19d4 */ NULL, +/* 19d5 */ NULL, +/* 19d6 */ NULL, +/* 19d7 */ NULL, +/* 19d8 */ NULL, +/* 19d9 */ NULL, +/* 19da */ NULL, +/* 19db */ NULL, +/* 19dc */ NULL, +/* 19dd */ NULL, +/* 19de */ NULL, +/* 19df */ NULL, +/* 19e0 */ NULL, +/* 19e1 */ NULL, +/* 19e2 */ NULL, +/* 19e3 */ NULL, +/* 19e4 */ NULL, +/* 19e5 */ NULL, +/* 19e6 */ NULL, +/* 19e7 */ NULL, +/* 19e8 */ NULL, +/* 19e9 */ NULL, +/* 19ea */ NULL, +/* 19eb */ NULL, +/* 19ec */ NULL, +/* 19ed */ NULL, +/* 19ee */ NULL, +/* 19ef */ NULL, +/* 19f0 */ NULL, +/* 19f1 */ NULL, +/* 19f2 */ NULL, +/* 19f3 */ NULL, +/* 19f4 */ NULL, +/* 19f5 */ NULL, +/* 19f6 */ NULL, +/* 19f7 */ NULL, +/* 19f8 */ NULL, +/* 19f9 */ NULL, +/* 19fa */ NULL, +/* 19fb */ NULL, +/* 19fc */ NULL, +/* 19fd */ NULL, +/* 19fe */ NULL, +/* 19ff */ NULL, +/* 1a00 */ NULL, +/* 1a01 */ NULL, +/* 1a02 */ NULL, +/* 1a03 */ NULL, +/* 1a04 */ NULL, +/* 1a05 */ NULL, +/* 1a06 */ NULL, +/* 1a07 */ NULL, +/* 1a08 */ NULL, +/* 1a09 */ NULL, +/* 1a0a */ NULL, +/* 1a0b */ NULL, +/* 1a0c */ NULL, +/* 1a0d */ NULL, +/* 1a0e */ NULL, +/* 1a0f */ NULL, +/* 1a10 */ NULL, +/* 1a11 */ NULL, +/* 1a12 */ NULL, +/* 1a13 */ NULL, +/* 1a14 */ NULL, +/* 1a15 */ NULL, +/* 1a16 */ NULL, +/* 1a17 */ NULL, +/* 1a18 */ NULL, +/* 1a19 */ NULL, +/* 1a1a */ NULL, +/* 1a1b */ NULL, +/* 1a1c */ NULL, +/* 1a1d */ NULL, +/* 1a1e */ NULL, +/* 1a1f */ NULL, +/* 1a20 */ NULL, +/* 1a21 */ NULL, +/* 1a22 */ NULL, +/* 1a23 */ NULL, +/* 1a24 */ NULL, +/* 1a25 */ NULL, +/* 1a26 */ NULL, +/* 1a27 */ NULL, +/* 1a28 */ NULL, +/* 1a29 */ NULL, +/* 1a2a */ NULL, +/* 1a2b */ NULL, +/* 1a2c */ NULL, +/* 1a2d */ NULL, +/* 1a2e */ NULL, +/* 1a2f */ NULL, +/* 1a30 */ NULL, +/* 1a31 */ NULL, +/* 1a32 */ NULL, +/* 1a33 */ NULL, +/* 1a34 */ NULL, +/* 1a35 */ NULL, +/* 1a36 */ NULL, +/* 1a37 */ NULL, +/* 1a38 */ NULL, +/* 1a39 */ NULL, +/* 1a3a */ NULL, +/* 1a3b */ NULL, +/* 1a3c */ NULL, +/* 1a3d */ NULL, +/* 1a3e */ NULL, +/* 1a3f */ NULL, +/* 1a40 */ NULL, +/* 1a41 */ NULL, +/* 1a42 */ NULL, +/* 1a43 */ NULL, +/* 1a44 */ NULL, +/* 1a45 */ NULL, +/* 1a46 */ NULL, +/* 1a47 */ NULL, +/* 1a48 */ NULL, +/* 1a49 */ NULL, +/* 1a4a */ NULL, +/* 1a4b */ NULL, +/* 1a4c */ NULL, +/* 1a4d */ NULL, +/* 1a4e */ NULL, +/* 1a4f */ NULL, +/* 1a50 */ NULL, +/* 1a51 */ NULL, +/* 1a52 */ NULL, +/* 1a53 */ NULL, +/* 1a54 */ NULL, +/* 1a55 */ NULL, +/* 1a56 */ NULL, +/* 1a57 */ NULL, +/* 1a58 */ NULL, +/* 1a59 */ NULL, +/* 1a5a */ NULL, +/* 1a5b */ NULL, +/* 1a5c */ NULL, +/* 1a5d */ NULL, +/* 1a5e */ NULL, +/* 1a5f */ NULL, +/* 1a60 */ NULL, +/* 1a61 */ NULL, +/* 1a62 */ NULL, +/* 1a63 */ NULL, +/* 1a64 */ NULL, +/* 1a65 */ NULL, +/* 1a66 */ NULL, +/* 1a67 */ NULL, +/* 1a68 */ NULL, +/* 1a69 */ NULL, +/* 1a6a */ NULL, +/* 1a6b */ NULL, +/* 1a6c */ NULL, +/* 1a6d */ NULL, +/* 1a6e */ NULL, +/* 1a6f */ NULL, +/* 1a70 */ NULL, +/* 1a71 */ NULL, +/* 1a72 */ NULL, +/* 1a73 */ NULL, +/* 1a74 */ NULL, +/* 1a75 */ NULL, +/* 1a76 */ NULL, +/* 1a77 */ NULL, +/* 1a78 */ NULL, +/* 1a79 */ NULL, +/* 1a7a */ NULL, +/* 1a7b */ NULL, +/* 1a7c */ NULL, +/* 1a7d */ NULL, +/* 1a7e */ NULL, +/* 1a7f */ NULL, +/* 1a80 */ NULL, +/* 1a81 */ NULL, +/* 1a82 */ NULL, +/* 1a83 */ NULL, +/* 1a84 */ NULL, +/* 1a85 */ NULL, +/* 1a86 */ NULL, +/* 1a87 */ NULL, +/* 1a88 */ NULL, +/* 1a89 */ NULL, +/* 1a8a */ NULL, +/* 1a8b */ NULL, +/* 1a8c */ NULL, +/* 1a8d */ NULL, +/* 1a8e */ NULL, +/* 1a8f */ NULL, +/* 1a90 */ NULL, +/* 1a91 */ NULL, +/* 1a92 */ NULL, +/* 1a93 */ NULL, +/* 1a94 */ NULL, +/* 1a95 */ NULL, +/* 1a96 */ NULL, +/* 1a97 */ NULL, +/* 1a98 */ NULL, +/* 1a99 */ NULL, +/* 1a9a */ NULL, +/* 1a9b */ NULL, +/* 1a9c */ NULL, +/* 1a9d */ NULL, +/* 1a9e */ NULL, +/* 1a9f */ NULL, +/* 1aa0 */ NULL, +/* 1aa1 */ NULL, +/* 1aa2 */ NULL, +/* 1aa3 */ NULL, +/* 1aa4 */ NULL, +/* 1aa5 */ NULL, +/* 1aa6 */ NULL, +/* 1aa7 */ NULL, +/* 1aa8 */ NULL, +/* 1aa9 */ NULL, +/* 1aaa */ NULL, +/* 1aab */ NULL, +/* 1aac */ NULL, +/* 1aad */ NULL, +/* 1aae */ NULL, +/* 1aaf */ NULL, +/* 1ab0 */ NULL, +/* 1ab1 */ NULL, +/* 1ab2 */ NULL, +/* 1ab3 */ NULL, +/* 1ab4 */ NULL, +/* 1ab5 */ NULL, +/* 1ab6 */ NULL, +/* 1ab7 */ NULL, +/* 1ab8 */ NULL, +/* 1ab9 */ NULL, +/* 1aba */ NULL, +/* 1abb */ NULL, +/* 1abc */ NULL, +/* 1abd */ NULL, +/* 1abe */ NULL, +/* 1abf */ NULL, +/* 1ac0 */ NULL, +/* 1ac1 */ NULL, +/* 1ac2 */ NULL, +/* 1ac3 */ NULL, +/* 1ac4 */ NULL, +/* 1ac5 */ NULL, +/* 1ac6 */ NULL, +/* 1ac7 */ NULL, +/* 1ac8 */ NULL, +/* 1ac9 */ NULL, +/* 1aca */ NULL, +/* 1acb */ NULL, +/* 1acc */ NULL, +/* 1acd */ NULL, +/* 1ace */ NULL, +/* 1acf */ NULL, +/* 1ad0 */ NULL, +/* 1ad1 */ NULL, +/* 1ad2 */ NULL, +/* 1ad3 */ NULL, +/* 1ad4 */ NULL, +/* 1ad5 */ NULL, +/* 1ad6 */ NULL, +/* 1ad7 */ NULL, +/* 1ad8 */ NULL, +/* 1ad9 */ NULL, +/* 1ada */ NULL, +/* 1adb */ NULL, +/* 1adc */ NULL, +/* 1add */ NULL, +/* 1ade */ NULL, +/* 1adf */ NULL, +/* 1ae0 */ NULL, +/* 1ae1 */ NULL, +/* 1ae2 */ NULL, +/* 1ae3 */ NULL, +/* 1ae4 */ NULL, +/* 1ae5 */ NULL, +/* 1ae6 */ NULL, +/* 1ae7 */ NULL, +/* 1ae8 */ NULL, +/* 1ae9 */ NULL, +/* 1aea */ NULL, +/* 1aeb */ NULL, +/* 1aec */ NULL, +/* 1aed */ NULL, +/* 1aee */ NULL, +/* 1aef */ NULL, +/* 1af0 */ NULL, +/* 1af1 */ NULL, +/* 1af2 */ NULL, +/* 1af3 */ NULL, +/* 1af4 */ NULL, +/* 1af5 */ NULL, +/* 1af6 */ NULL, +/* 1af7 */ NULL, +/* 1af8 */ NULL, +/* 1af9 */ NULL, +/* 1afa */ NULL, +/* 1afb */ NULL, +/* 1afc */ NULL, +/* 1afd */ NULL, +/* 1afe */ NULL, +/* 1aff */ NULL, +/* 1b00 */ NULL, +/* 1b01 */ NULL, +/* 1b02 */ NULL, +/* 1b03 */ NULL, +/* 1b04 */ NULL, +/* 1b05 */ NULL, +/* 1b06 */ NULL, +/* 1b07 */ NULL, +/* 1b08 */ NULL, +/* 1b09 */ NULL, +/* 1b0a */ NULL, +/* 1b0b */ NULL, +/* 1b0c */ NULL, +/* 1b0d */ NULL, +/* 1b0e */ NULL, +/* 1b0f */ NULL, +/* 1b10 */ NULL, +/* 1b11 */ NULL, +/* 1b12 */ NULL, +/* 1b13 */ NULL, +/* 1b14 */ NULL, +/* 1b15 */ NULL, +/* 1b16 */ NULL, +/* 1b17 */ NULL, +/* 1b18 */ NULL, +/* 1b19 */ NULL, +/* 1b1a */ NULL, +/* 1b1b */ NULL, +/* 1b1c */ NULL, +/* 1b1d */ NULL, +/* 1b1e */ NULL, +/* 1b1f */ NULL, +/* 1b20 */ NULL, +/* 1b21 */ NULL, +/* 1b22 */ NULL, +/* 1b23 */ NULL, +/* 1b24 */ NULL, +/* 1b25 */ NULL, +/* 1b26 */ NULL, +/* 1b27 */ NULL, +/* 1b28 */ NULL, +/* 1b29 */ NULL, +/* 1b2a */ NULL, +/* 1b2b */ NULL, +/* 1b2c */ NULL, +/* 1b2d */ NULL, +/* 1b2e */ NULL, +/* 1b2f */ NULL, +/* 1b30 */ NULL, +/* 1b31 */ NULL, +/* 1b32 */ NULL, +/* 1b33 */ NULL, +/* 1b34 */ NULL, +/* 1b35 */ NULL, +/* 1b36 */ NULL, +/* 1b37 */ NULL, +/* 1b38 */ NULL, +/* 1b39 */ NULL, +/* 1b3a */ NULL, +/* 1b3b */ NULL, +/* 1b3c */ NULL, +/* 1b3d */ NULL, +/* 1b3e */ NULL, +/* 1b3f */ NULL, +/* 1b40 */ NULL, +/* 1b41 */ NULL, +/* 1b42 */ NULL, +/* 1b43 */ NULL, +/* 1b44 */ NULL, +/* 1b45 */ NULL, +/* 1b46 */ NULL, +/* 1b47 */ NULL, +/* 1b48 */ NULL, +/* 1b49 */ NULL, +/* 1b4a */ NULL, +/* 1b4b */ NULL, +/* 1b4c */ NULL, +/* 1b4d */ NULL, +/* 1b4e */ NULL, +/* 1b4f */ NULL, +/* 1b50 */ NULL, +/* 1b51 */ NULL, +/* 1b52 */ NULL, +/* 1b53 */ NULL, +/* 1b54 */ NULL, +/* 1b55 */ NULL, +/* 1b56 */ NULL, +/* 1b57 */ NULL, +/* 1b58 */ NULL, +/* 1b59 */ NULL, +/* 1b5a */ NULL, +/* 1b5b */ NULL, +/* 1b5c */ NULL, +/* 1b5d */ NULL, +/* 1b5e */ NULL, +/* 1b5f */ NULL, +/* 1b60 */ NULL, +/* 1b61 */ NULL, +/* 1b62 */ NULL, +/* 1b63 */ NULL, +/* 1b64 */ NULL, +/* 1b65 */ NULL, +/* 1b66 */ NULL, +/* 1b67 */ NULL, +/* 1b68 */ NULL, +/* 1b69 */ NULL, +/* 1b6a */ NULL, +/* 1b6b */ NULL, +/* 1b6c */ NULL, +/* 1b6d */ NULL, +/* 1b6e */ NULL, +/* 1b6f */ NULL, +/* 1b70 */ NULL, +/* 1b71 */ NULL, +/* 1b72 */ NULL, +/* 1b73 */ NULL, +/* 1b74 */ NULL, +/* 1b75 */ NULL, +/* 1b76 */ NULL, +/* 1b77 */ NULL, +/* 1b78 */ NULL, +/* 1b79 */ NULL, +/* 1b7a */ NULL, +/* 1b7b */ NULL, +/* 1b7c */ NULL, +/* 1b7d */ NULL, +/* 1b7e */ NULL, +/* 1b7f */ NULL, +/* 1b80 */ NULL, +/* 1b81 */ NULL, +/* 1b82 */ NULL, +/* 1b83 */ NULL, +/* 1b84 */ NULL, +/* 1b85 */ NULL, +/* 1b86 */ NULL, +/* 1b87 */ NULL, +/* 1b88 */ NULL, +/* 1b89 */ NULL, +/* 1b8a */ NULL, +/* 1b8b */ NULL, +/* 1b8c */ NULL, +/* 1b8d */ NULL, +/* 1b8e */ NULL, +/* 1b8f */ NULL, +/* 1b90 */ NULL, +/* 1b91 */ NULL, +/* 1b92 */ NULL, +/* 1b93 */ NULL, +/* 1b94 */ NULL, +/* 1b95 */ NULL, +/* 1b96 */ NULL, +/* 1b97 */ NULL, +/* 1b98 */ NULL, +/* 1b99 */ NULL, +/* 1b9a */ NULL, +/* 1b9b */ NULL, +/* 1b9c */ NULL, +/* 1b9d */ NULL, +/* 1b9e */ NULL, +/* 1b9f */ NULL, +/* 1ba0 */ NULL, +/* 1ba1 */ NULL, +/* 1ba2 */ NULL, +/* 1ba3 */ NULL, +/* 1ba4 */ NULL, +/* 1ba5 */ NULL, +/* 1ba6 */ NULL, +/* 1ba7 */ NULL, +/* 1ba8 */ NULL, +/* 1ba9 */ NULL, +/* 1baa */ NULL, +/* 1bab */ NULL, +/* 1bac */ NULL, +/* 1bad */ NULL, +/* 1bae */ NULL, +/* 1baf */ NULL, +/* 1bb0 */ NULL, +/* 1bb1 */ NULL, +/* 1bb2 */ NULL, +/* 1bb3 */ NULL, +/* 1bb4 */ NULL, +/* 1bb5 */ NULL, +/* 1bb6 */ NULL, +/* 1bb7 */ NULL, +/* 1bb8 */ NULL, +/* 1bb9 */ NULL, +/* 1bba */ NULL, +/* 1bbb */ NULL, +/* 1bbc */ NULL, +/* 1bbd */ NULL, +/* 1bbe */ NULL, +/* 1bbf */ NULL, +/* 1bc0 */ NULL, +/* 1bc1 */ NULL, +/* 1bc2 */ NULL, +/* 1bc3 */ NULL, +/* 1bc4 */ NULL, +/* 1bc5 */ NULL, +/* 1bc6 */ NULL, +/* 1bc7 */ NULL, +/* 1bc8 */ NULL, +/* 1bc9 */ NULL, +/* 1bca */ NULL, +/* 1bcb */ NULL, +/* 1bcc */ NULL, +/* 1bcd */ NULL, +/* 1bce */ NULL, +/* 1bcf */ NULL, +/* 1bd0 */ NULL, +/* 1bd1 */ NULL, +/* 1bd2 */ NULL, +/* 1bd3 */ NULL, +/* 1bd4 */ NULL, +/* 1bd5 */ NULL, +/* 1bd6 */ NULL, +/* 1bd7 */ NULL, +/* 1bd8 */ NULL, +/* 1bd9 */ NULL, +/* 1bda */ NULL, +/* 1bdb */ NULL, +/* 1bdc */ NULL, +/* 1bdd */ NULL, +/* 1bde */ NULL, +/* 1bdf */ NULL, +/* 1be0 */ NULL, +/* 1be1 */ NULL, +/* 1be2 */ NULL, +/* 1be3 */ NULL, +/* 1be4 */ NULL, +/* 1be5 */ NULL, +/* 1be6 */ NULL, +/* 1be7 */ NULL, +/* 1be8 */ NULL, +/* 1be9 */ NULL, +/* 1bea */ NULL, +/* 1beb */ NULL, +/* 1bec */ NULL, +/* 1bed */ NULL, +/* 1bee */ NULL, +/* 1bef */ NULL, +/* 1bf0 */ NULL, +/* 1bf1 */ NULL, +/* 1bf2 */ NULL, +/* 1bf3 */ NULL, +/* 1bf4 */ NULL, +/* 1bf5 */ NULL, +/* 1bf6 */ NULL, +/* 1bf7 */ NULL, +/* 1bf8 */ NULL, +/* 1bf9 */ NULL, +/* 1bfa */ NULL, +/* 1bfb */ NULL, +/* 1bfc */ NULL, +/* 1bfd */ NULL, +/* 1bfe */ NULL, +/* 1bff */ NULL, +/* 1c00 */ NULL, +/* 1c01 */ NULL, +/* 1c02 */ NULL, +/* 1c03 */ NULL, +/* 1c04 */ NULL, +/* 1c05 */ NULL, +/* 1c06 */ NULL, +/* 1c07 */ NULL, +/* 1c08 */ NULL, +/* 1c09 */ NULL, +/* 1c0a */ NULL, +/* 1c0b */ NULL, +/* 1c0c */ NULL, +/* 1c0d */ NULL, +/* 1c0e */ NULL, +/* 1c0f */ NULL, +/* 1c10 */ NULL, +/* 1c11 */ NULL, +/* 1c12 */ NULL, +/* 1c13 */ NULL, +/* 1c14 */ NULL, +/* 1c15 */ NULL, +/* 1c16 */ NULL, +/* 1c17 */ NULL, +/* 1c18 */ NULL, +/* 1c19 */ NULL, +/* 1c1a */ NULL, +/* 1c1b */ NULL, +/* 1c1c */ NULL, +/* 1c1d */ NULL, +/* 1c1e */ NULL, +/* 1c1f */ NULL, +/* 1c20 */ NULL, +/* 1c21 */ NULL, +/* 1c22 */ NULL, +/* 1c23 */ NULL, +/* 1c24 */ NULL, +/* 1c25 */ NULL, +/* 1c26 */ NULL, +/* 1c27 */ NULL, +/* 1c28 */ NULL, +/* 1c29 */ NULL, +/* 1c2a */ NULL, +/* 1c2b */ NULL, +/* 1c2c */ NULL, +/* 1c2d */ NULL, +/* 1c2e */ NULL, +/* 1c2f */ NULL, +/* 1c30 */ NULL, +/* 1c31 */ NULL, +/* 1c32 */ NULL, +/* 1c33 */ NULL, +/* 1c34 */ NULL, +/* 1c35 */ NULL, +/* 1c36 */ NULL, +/* 1c37 */ NULL, +/* 1c38 */ NULL, +/* 1c39 */ NULL, +/* 1c3a */ NULL, +/* 1c3b */ NULL, +/* 1c3c */ NULL, +/* 1c3d */ NULL, +/* 1c3e */ NULL, +/* 1c3f */ NULL, +/* 1c40 */ NULL, +/* 1c41 */ NULL, +/* 1c42 */ NULL, +/* 1c43 */ NULL, +/* 1c44 */ NULL, +/* 1c45 */ NULL, +/* 1c46 */ NULL, +/* 1c47 */ NULL, +/* 1c48 */ NULL, +/* 1c49 */ NULL, +/* 1c4a */ NULL, +/* 1c4b */ NULL, +/* 1c4c */ NULL, +/* 1c4d */ NULL, +/* 1c4e */ NULL, +/* 1c4f */ NULL, +/* 1c50 */ NULL, +/* 1c51 */ NULL, +/* 1c52 */ NULL, +/* 1c53 */ NULL, +/* 1c54 */ NULL, +/* 1c55 */ NULL, +/* 1c56 */ NULL, +/* 1c57 */ NULL, +/* 1c58 */ NULL, +/* 1c59 */ NULL, +/* 1c5a */ NULL, +/* 1c5b */ NULL, +/* 1c5c */ NULL, +/* 1c5d */ NULL, +/* 1c5e */ NULL, +/* 1c5f */ NULL, +/* 1c60 */ NULL, +/* 1c61 */ NULL, +/* 1c62 */ NULL, +/* 1c63 */ NULL, +/* 1c64 */ NULL, +/* 1c65 */ NULL, +/* 1c66 */ NULL, +/* 1c67 */ NULL, +/* 1c68 */ NULL, +/* 1c69 */ NULL, +/* 1c6a */ NULL, +/* 1c6b */ NULL, +/* 1c6c */ NULL, +/* 1c6d */ NULL, +/* 1c6e */ NULL, +/* 1c6f */ NULL, +/* 1c70 */ NULL, +/* 1c71 */ NULL, +/* 1c72 */ NULL, +/* 1c73 */ NULL, +/* 1c74 */ NULL, +/* 1c75 */ NULL, +/* 1c76 */ NULL, +/* 1c77 */ NULL, +/* 1c78 */ NULL, +/* 1c79 */ NULL, +/* 1c7a */ NULL, +/* 1c7b */ NULL, +/* 1c7c */ NULL, +/* 1c7d */ NULL, +/* 1c7e */ NULL, +/* 1c7f */ NULL, +/* 1c80 */ NULL, +/* 1c81 */ NULL, +/* 1c82 */ NULL, +/* 1c83 */ NULL, +/* 1c84 */ NULL, +/* 1c85 */ NULL, +/* 1c86 */ NULL, +/* 1c87 */ NULL, +/* 1c88 */ NULL, +/* 1c89 */ NULL, +/* 1c8a */ NULL, +/* 1c8b */ NULL, +/* 1c8c */ NULL, +/* 1c8d */ NULL, +/* 1c8e */ NULL, +/* 1c8f */ NULL, +/* 1c90 */ NULL, +/* 1c91 */ NULL, +/* 1c92 */ NULL, +/* 1c93 */ NULL, +/* 1c94 */ NULL, +/* 1c95 */ NULL, +/* 1c96 */ NULL, +/* 1c97 */ NULL, +/* 1c98 */ NULL, +/* 1c99 */ NULL, +/* 1c9a */ NULL, +/* 1c9b */ NULL, +/* 1c9c */ NULL, +/* 1c9d */ NULL, +/* 1c9e */ NULL, +/* 1c9f */ NULL, +/* 1ca0 */ NULL, +/* 1ca1 */ NULL, +/* 1ca2 */ NULL, +/* 1ca3 */ NULL, +/* 1ca4 */ NULL, +/* 1ca5 */ NULL, +/* 1ca6 */ NULL, +/* 1ca7 */ NULL, +/* 1ca8 */ NULL, +/* 1ca9 */ NULL, +/* 1caa */ NULL, +/* 1cab */ NULL, +/* 1cac */ NULL, +/* 1cad */ NULL, +/* 1cae */ NULL, +/* 1caf */ NULL, +/* 1cb0 */ NULL, +/* 1cb1 */ NULL, +/* 1cb2 */ NULL, +/* 1cb3 */ NULL, +/* 1cb4 */ NULL, +/* 1cb5 */ NULL, +/* 1cb6 */ NULL, +/* 1cb7 */ NULL, +/* 1cb8 */ NULL, +/* 1cb9 */ NULL, +/* 1cba */ NULL, +/* 1cbb */ NULL, +/* 1cbc */ NULL, +/* 1cbd */ NULL, +/* 1cbe */ NULL, +/* 1cbf */ NULL, +/* 1cc0 */ NULL, +/* 1cc1 */ NULL, +/* 1cc2 */ NULL, +/* 1cc3 */ NULL, +/* 1cc4 */ NULL, +/* 1cc5 */ NULL, +/* 1cc6 */ NULL, +/* 1cc7 */ NULL, +/* 1cc8 */ NULL, +/* 1cc9 */ NULL, +/* 1cca */ NULL, +/* 1ccb */ NULL, +/* 1ccc */ NULL, +/* 1ccd */ NULL, +/* 1cce */ NULL, +/* 1ccf */ NULL, +/* 1cd0 */ NULL, +/* 1cd1 */ NULL, +/* 1cd2 */ NULL, +/* 1cd3 */ NULL, +/* 1cd4 */ NULL, +/* 1cd5 */ NULL, +/* 1cd6 */ NULL, +/* 1cd7 */ NULL, +/* 1cd8 */ NULL, +/* 1cd9 */ NULL, +/* 1cda */ NULL, +/* 1cdb */ NULL, +/* 1cdc */ NULL, +/* 1cdd */ NULL, +/* 1cde */ NULL, +/* 1cdf */ NULL, +/* 1ce0 */ NULL, +/* 1ce1 */ NULL, +/* 1ce2 */ NULL, +/* 1ce3 */ NULL, +/* 1ce4 */ NULL, +/* 1ce5 */ NULL, +/* 1ce6 */ NULL, +/* 1ce7 */ NULL, +/* 1ce8 */ NULL, +/* 1ce9 */ NULL, +/* 1cea */ NULL, +/* 1ceb */ NULL, +/* 1cec */ NULL, +/* 1ced */ NULL, +/* 1cee */ NULL, +/* 1cef */ NULL, +/* 1cf0 */ NULL, +/* 1cf1 */ NULL, +/* 1cf2 */ NULL, +/* 1cf3 */ NULL, +/* 1cf4 */ NULL, +/* 1cf5 */ NULL, +/* 1cf6 */ NULL, +/* 1cf7 */ NULL, +/* 1cf8 */ NULL, +/* 1cf9 */ NULL, +/* 1cfa */ NULL, +/* 1cfb */ NULL, +/* 1cfc */ NULL, +/* 1cfd */ NULL, +/* 1cfe */ NULL, +/* 1cff */ NULL, +/* 1d00 */ NULL, +/* 1d01 */ NULL, +/* 1d02 */ NULL, +/* 1d03 */ NULL, +/* 1d04 */ NULL, +/* 1d05 */ NULL, +/* 1d06 */ NULL, +/* 1d07 */ NULL, +/* 1d08 */ NULL, +/* 1d09 */ NULL, +/* 1d0a */ NULL, +/* 1d0b */ NULL, +/* 1d0c */ NULL, +/* 1d0d */ NULL, +/* 1d0e */ NULL, +/* 1d0f */ NULL, +/* 1d10 */ NULL, +/* 1d11 */ NULL, +/* 1d12 */ NULL, +/* 1d13 */ NULL, +/* 1d14 */ NULL, +/* 1d15 */ NULL, +/* 1d16 */ NULL, +/* 1d17 */ NULL, +/* 1d18 */ NULL, +/* 1d19 */ NULL, +/* 1d1a */ NULL, +/* 1d1b */ NULL, +/* 1d1c */ NULL, +/* 1d1d */ NULL, +/* 1d1e */ NULL, +/* 1d1f */ NULL, +/* 1d20 */ NULL, +/* 1d21 */ NULL, +/* 1d22 */ NULL, +/* 1d23 */ NULL, +/* 1d24 */ NULL, +/* 1d25 */ NULL, +/* 1d26 */ NULL, +/* 1d27 */ NULL, +/* 1d28 */ NULL, +/* 1d29 */ NULL, +/* 1d2a */ NULL, +/* 1d2b */ NULL, +/* 1d2c */ NULL, +/* 1d2d */ NULL, +/* 1d2e */ NULL, +/* 1d2f */ NULL, +/* 1d30 */ NULL, +/* 1d31 */ NULL, +/* 1d32 */ NULL, +/* 1d33 */ NULL, +/* 1d34 */ NULL, +/* 1d35 */ NULL, +/* 1d36 */ NULL, +/* 1d37 */ NULL, +/* 1d38 */ NULL, +/* 1d39 */ NULL, +/* 1d3a */ NULL, +/* 1d3b */ NULL, +/* 1d3c */ NULL, +/* 1d3d */ NULL, +/* 1d3e */ NULL, +/* 1d3f */ NULL, +/* 1d40 */ NULL, +/* 1d41 */ NULL, +/* 1d42 */ NULL, +/* 1d43 */ NULL, +/* 1d44 */ NULL, +/* 1d45 */ NULL, +/* 1d46 */ NULL, +/* 1d47 */ NULL, +/* 1d48 */ NULL, +/* 1d49 */ NULL, +/* 1d4a */ NULL, +/* 1d4b */ NULL, +/* 1d4c */ NULL, +/* 1d4d */ NULL, +/* 1d4e */ NULL, +/* 1d4f */ NULL, +/* 1d50 */ NULL, +/* 1d51 */ NULL, +/* 1d52 */ NULL, +/* 1d53 */ NULL, +/* 1d54 */ NULL, +/* 1d55 */ NULL, +/* 1d56 */ NULL, +/* 1d57 */ NULL, +/* 1d58 */ NULL, +/* 1d59 */ NULL, +/* 1d5a */ NULL, +/* 1d5b */ NULL, +/* 1d5c */ NULL, +/* 1d5d */ NULL, +/* 1d5e */ NULL, +/* 1d5f */ NULL, +/* 1d60 */ NULL, +/* 1d61 */ NULL, +/* 1d62 */ NULL, +/* 1d63 */ NULL, +/* 1d64 */ NULL, +/* 1d65 */ NULL, +/* 1d66 */ NULL, +/* 1d67 */ NULL, +/* 1d68 */ NULL, +/* 1d69 */ NULL, +/* 1d6a */ NULL, +/* 1d6b */ NULL, +/* 1d6c */ NULL, +/* 1d6d */ NULL, +/* 1d6e */ NULL, +/* 1d6f */ NULL, +/* 1d70 */ NULL, +/* 1d71 */ NULL, +/* 1d72 */ NULL, +/* 1d73 */ NULL, +/* 1d74 */ NULL, +/* 1d75 */ NULL, +/* 1d76 */ NULL, +/* 1d77 */ NULL, +/* 1d78 */ NULL, +/* 1d79 */ NULL, +/* 1d7a */ NULL, +/* 1d7b */ NULL, +/* 1d7c */ NULL, +/* 1d7d */ NULL, +/* 1d7e */ NULL, +/* 1d7f */ NULL, +/* 1d80 */ NULL, +/* 1d81 */ NULL, +/* 1d82 */ NULL, +/* 1d83 */ NULL, +/* 1d84 */ NULL, +/* 1d85 */ NULL, +/* 1d86 */ NULL, +/* 1d87 */ NULL, +/* 1d88 */ NULL, +/* 1d89 */ NULL, +/* 1d8a */ NULL, +/* 1d8b */ NULL, +/* 1d8c */ NULL, +/* 1d8d */ NULL, +/* 1d8e */ NULL, +/* 1d8f */ NULL, +/* 1d90 */ NULL, +/* 1d91 */ NULL, +/* 1d92 */ NULL, +/* 1d93 */ NULL, +/* 1d94 */ NULL, +/* 1d95 */ NULL, +/* 1d96 */ NULL, +/* 1d97 */ NULL, +/* 1d98 */ NULL, +/* 1d99 */ NULL, +/* 1d9a */ NULL, +/* 1d9b */ NULL, +/* 1d9c */ NULL, +/* 1d9d */ NULL, +/* 1d9e */ NULL, +/* 1d9f */ NULL, +/* 1da0 */ NULL, +/* 1da1 */ NULL, +/* 1da2 */ NULL, +/* 1da3 */ NULL, +/* 1da4 */ NULL, +/* 1da5 */ NULL, +/* 1da6 */ NULL, +/* 1da7 */ NULL, +/* 1da8 */ NULL, +/* 1da9 */ NULL, +/* 1daa */ NULL, +/* 1dab */ NULL, +/* 1dac */ NULL, +/* 1dad */ NULL, +/* 1dae */ NULL, +/* 1daf */ NULL, +/* 1db0 */ NULL, +/* 1db1 */ NULL, +/* 1db2 */ NULL, +/* 1db3 */ NULL, +/* 1db4 */ NULL, +/* 1db5 */ NULL, +/* 1db6 */ NULL, +/* 1db7 */ NULL, +/* 1db8 */ NULL, +/* 1db9 */ NULL, +/* 1dba */ NULL, +/* 1dbb */ NULL, +/* 1dbc */ NULL, +/* 1dbd */ NULL, +/* 1dbe */ NULL, +/* 1dbf */ NULL, +/* 1dc0 */ NULL, +/* 1dc1 */ NULL, +/* 1dc2 */ NULL, +/* 1dc3 */ NULL, +/* 1dc4 */ NULL, +/* 1dc5 */ NULL, +/* 1dc6 */ NULL, +/* 1dc7 */ NULL, +/* 1dc8 */ NULL, +/* 1dc9 */ NULL, +/* 1dca */ NULL, +/* 1dcb */ NULL, +/* 1dcc */ NULL, +/* 1dcd */ NULL, +/* 1dce */ NULL, +/* 1dcf */ NULL, +/* 1dd0 */ NULL, +/* 1dd1 */ NULL, +/* 1dd2 */ NULL, +/* 1dd3 */ NULL, +/* 1dd4 */ NULL, +/* 1dd5 */ NULL, +/* 1dd6 */ NULL, +/* 1dd7 */ NULL, +/* 1dd8 */ NULL, +/* 1dd9 */ NULL, +/* 1dda */ NULL, +/* 1ddb */ NULL, +/* 1ddc */ NULL, +/* 1ddd */ NULL, +/* 1dde */ NULL, +/* 1ddf */ NULL, +/* 1de0 */ NULL, +/* 1de1 */ NULL, +/* 1de2 */ NULL, +/* 1de3 */ NULL, +/* 1de4 */ NULL, +/* 1de5 */ NULL, +/* 1de6 */ NULL, +/* 1de7 */ NULL, +/* 1de8 */ NULL, +/* 1de9 */ NULL, +/* 1dea */ NULL, +/* 1deb */ NULL, +/* 1dec */ NULL, +/* 1ded */ NULL, +/* 1dee */ NULL, +/* 1def */ NULL, +/* 1df0 */ NULL, +/* 1df1 */ NULL, +/* 1df2 */ NULL, +/* 1df3 */ NULL, +/* 1df4 */ NULL, +/* 1df5 */ NULL, +/* 1df6 */ NULL, +/* 1df7 */ NULL, +/* 1df8 */ NULL, +/* 1df9 */ NULL, +/* 1dfa */ NULL, +/* 1dfb */ NULL, +/* 1dfc */ NULL, +/* 1dfd */ NULL, +/* 1dfe */ NULL, +/* 1dff */ NULL, +/* 1e00 */ NULL, +/* 1e01 */ NULL, +/* 1e02 */ NULL, +/* 1e03 */ NULL, +/* 1e04 */ NULL, +/* 1e05 */ NULL, +/* 1e06 */ NULL, +/* 1e07 */ NULL, +/* 1e08 */ NULL, +/* 1e09 */ NULL, +/* 1e0a */ NULL, +/* 1e0b */ NULL, +/* 1e0c */ NULL, +/* 1e0d */ NULL, +/* 1e0e */ NULL, +/* 1e0f */ NULL, +/* 1e10 */ NULL, +/* 1e11 */ NULL, +/* 1e12 */ NULL, +/* 1e13 */ NULL, +/* 1e14 */ NULL, +/* 1e15 */ NULL, +/* 1e16 */ NULL, +/* 1e17 */ NULL, +/* 1e18 */ NULL, +/* 1e19 */ NULL, +/* 1e1a */ NULL, +/* 1e1b */ NULL, +/* 1e1c */ NULL, +/* 1e1d */ NULL, +/* 1e1e */ NULL, +/* 1e1f */ NULL, +/* 1e20 */ NULL, +/* 1e21 */ NULL, +/* 1e22 */ NULL, +/* 1e23 */ NULL, +/* 1e24 */ NULL, +/* 1e25 */ NULL, +/* 1e26 */ NULL, +/* 1e27 */ NULL, +/* 1e28 */ NULL, +/* 1e29 */ NULL, +/* 1e2a */ NULL, +/* 1e2b */ NULL, +/* 1e2c */ NULL, +/* 1e2d */ NULL, +/* 1e2e */ NULL, +/* 1e2f */ NULL, +/* 1e30 */ NULL, +/* 1e31 */ NULL, +/* 1e32 */ NULL, +/* 1e33 */ NULL, +/* 1e34 */ NULL, +/* 1e35 */ NULL, +/* 1e36 */ NULL, +/* 1e37 */ NULL, +/* 1e38 */ NULL, +/* 1e39 */ NULL, +/* 1e3a */ NULL, +/* 1e3b */ NULL, +/* 1e3c */ NULL, +/* 1e3d */ NULL, +/* 1e3e */ NULL, +/* 1e3f */ NULL, +/* 1e40 */ NULL, +/* 1e41 */ NULL, +/* 1e42 */ NULL, +/* 1e43 */ NULL, +/* 1e44 */ NULL, +/* 1e45 */ NULL, +/* 1e46 */ NULL, +/* 1e47 */ NULL, +/* 1e48 */ NULL, +/* 1e49 */ NULL, +/* 1e4a */ NULL, +/* 1e4b */ NULL, +/* 1e4c */ NULL, +/* 1e4d */ NULL, +/* 1e4e */ NULL, +/* 1e4f */ NULL, +/* 1e50 */ NULL, +/* 1e51 */ NULL, +/* 1e52 */ NULL, +/* 1e53 */ NULL, +/* 1e54 */ NULL, +/* 1e55 */ NULL, +/* 1e56 */ NULL, +/* 1e57 */ NULL, +/* 1e58 */ NULL, +/* 1e59 */ NULL, +/* 1e5a */ NULL, +/* 1e5b */ NULL, +/* 1e5c */ NULL, +/* 1e5d */ NULL, +/* 1e5e */ NULL, +/* 1e5f */ NULL, +/* 1e60 */ NULL, +/* 1e61 */ NULL, +/* 1e62 */ NULL, +/* 1e63 */ NULL, +/* 1e64 */ NULL, +/* 1e65 */ NULL, +/* 1e66 */ NULL, +/* 1e67 */ NULL, +/* 1e68 */ NULL, +/* 1e69 */ NULL, +/* 1e6a */ NULL, +/* 1e6b */ NULL, +/* 1e6c */ NULL, +/* 1e6d */ NULL, +/* 1e6e */ NULL, +/* 1e6f */ NULL, +/* 1e70 */ NULL, +/* 1e71 */ NULL, +/* 1e72 */ NULL, +/* 1e73 */ NULL, +/* 1e74 */ NULL, +/* 1e75 */ NULL, +/* 1e76 */ NULL, +/* 1e77 */ NULL, +/* 1e78 */ NULL, +/* 1e79 */ NULL, +/* 1e7a */ NULL, +/* 1e7b */ NULL, +/* 1e7c */ NULL, +/* 1e7d */ NULL, +/* 1e7e */ NULL, +/* 1e7f */ NULL, +/* 1e80 */ "Wgrave", +/* 1e81 */ "wgrave", +/* 1e82 */ "Wacute", +/* 1e83 */ "wacute", +/* 1e84 */ "Wdieresis", +/* 1e85 */ "wdieresis", +/* 1e86 */ NULL, +/* 1e87 */ NULL, +/* 1e88 */ NULL, +/* 1e89 */ NULL, +/* 1e8a */ NULL, +/* 1e8b */ NULL, +/* 1e8c */ NULL, +/* 1e8d */ NULL, +/* 1e8e */ NULL, +/* 1e8f */ NULL, +/* 1e90 */ NULL, +/* 1e91 */ NULL, +/* 1e92 */ NULL, +/* 1e93 */ NULL, +/* 1e94 */ NULL, +/* 1e95 */ NULL, +/* 1e96 */ NULL, +/* 1e97 */ NULL, +/* 1e98 */ NULL, +/* 1e99 */ NULL, +/* 1e9a */ NULL, +/* 1e9b */ NULL, +/* 1e9c */ NULL, +/* 1e9d */ NULL, +/* 1e9e */ NULL, +/* 1e9f */ NULL, +/* 1ea0 */ NULL, +/* 1ea1 */ NULL, +/* 1ea2 */ NULL, +/* 1ea3 */ NULL, +/* 1ea4 */ NULL, +/* 1ea5 */ NULL, +/* 1ea6 */ NULL, +/* 1ea7 */ NULL, +/* 1ea8 */ NULL, +/* 1ea9 */ NULL, +/* 1eaa */ NULL, +/* 1eab */ NULL, +/* 1eac */ NULL, +/* 1ead */ NULL, +/* 1eae */ NULL, +/* 1eaf */ NULL, +/* 1eb0 */ NULL, +/* 1eb1 */ NULL, +/* 1eb2 */ NULL, +/* 1eb3 */ NULL, +/* 1eb4 */ NULL, +/* 1eb5 */ NULL, +/* 1eb6 */ NULL, +/* 1eb7 */ NULL, +/* 1eb8 */ NULL, +/* 1eb9 */ NULL, +/* 1eba */ NULL, +/* 1ebb */ NULL, +/* 1ebc */ NULL, +/* 1ebd */ NULL, +/* 1ebe */ NULL, +/* 1ebf */ NULL, +/* 1ec0 */ NULL, +/* 1ec1 */ NULL, +/* 1ec2 */ NULL, +/* 1ec3 */ NULL, +/* 1ec4 */ NULL, +/* 1ec5 */ NULL, +/* 1ec6 */ NULL, +/* 1ec7 */ NULL, +/* 1ec8 */ NULL, +/* 1ec9 */ NULL, +/* 1eca */ NULL, +/* 1ecb */ NULL, +/* 1ecc */ NULL, +/* 1ecd */ NULL, +/* 1ece */ NULL, +/* 1ecf */ NULL, +/* 1ed0 */ NULL, +/* 1ed1 */ NULL, +/* 1ed2 */ NULL, +/* 1ed3 */ NULL, +/* 1ed4 */ NULL, +/* 1ed5 */ NULL, +/* 1ed6 */ NULL, +/* 1ed7 */ NULL, +/* 1ed8 */ NULL, +/* 1ed9 */ NULL, +/* 1eda */ NULL, +/* 1edb */ NULL, +/* 1edc */ NULL, +/* 1edd */ NULL, +/* 1ede */ NULL, +/* 1edf */ NULL, +/* 1ee0 */ NULL, +/* 1ee1 */ NULL, +/* 1ee2 */ NULL, +/* 1ee3 */ NULL, +/* 1ee4 */ NULL, +/* 1ee5 */ NULL, +/* 1ee6 */ NULL, +/* 1ee7 */ NULL, +/* 1ee8 */ NULL, +/* 1ee9 */ NULL, +/* 1eea */ NULL, +/* 1eeb */ NULL, +/* 1eec */ NULL, +/* 1eed */ NULL, +/* 1eee */ NULL, +/* 1eef */ NULL, +/* 1ef0 */ NULL, +/* 1ef1 */ NULL, +/* 1ef2 */ "Ygrave", +/* 1ef3 */ "ygrave", +/* 1ef4 */ NULL, +/* 1ef5 */ NULL, +/* 1ef6 */ NULL, +/* 1ef7 */ NULL, +/* 1ef8 */ NULL, +/* 1ef9 */ NULL, +/* 1efa */ NULL, +/* 1efb */ NULL, +/* 1efc */ NULL, +/* 1efd */ NULL, +/* 1efe */ NULL, +/* 1eff */ NULL, +/* 1f00 */ NULL, +/* 1f01 */ NULL, +/* 1f02 */ NULL, +/* 1f03 */ NULL, +/* 1f04 */ NULL, +/* 1f05 */ NULL, +/* 1f06 */ NULL, +/* 1f07 */ NULL, +/* 1f08 */ NULL, +/* 1f09 */ NULL, +/* 1f0a */ NULL, +/* 1f0b */ NULL, +/* 1f0c */ NULL, +/* 1f0d */ NULL, +/* 1f0e */ NULL, +/* 1f0f */ NULL, +/* 1f10 */ NULL, +/* 1f11 */ NULL, +/* 1f12 */ NULL, +/* 1f13 */ NULL, +/* 1f14 */ NULL, +/* 1f15 */ NULL, +/* 1f16 */ NULL, +/* 1f17 */ NULL, +/* 1f18 */ NULL, +/* 1f19 */ NULL, +/* 1f1a */ NULL, +/* 1f1b */ NULL, +/* 1f1c */ NULL, +/* 1f1d */ NULL, +/* 1f1e */ NULL, +/* 1f1f */ NULL, +/* 1f20 */ NULL, +/* 1f21 */ NULL, +/* 1f22 */ NULL, +/* 1f23 */ NULL, +/* 1f24 */ NULL, +/* 1f25 */ NULL, +/* 1f26 */ NULL, +/* 1f27 */ NULL, +/* 1f28 */ NULL, +/* 1f29 */ NULL, +/* 1f2a */ NULL, +/* 1f2b */ NULL, +/* 1f2c */ NULL, +/* 1f2d */ NULL, +/* 1f2e */ NULL, +/* 1f2f */ NULL, +/* 1f30 */ NULL, +/* 1f31 */ NULL, +/* 1f32 */ NULL, +/* 1f33 */ NULL, +/* 1f34 */ NULL, +/* 1f35 */ NULL, +/* 1f36 */ NULL, +/* 1f37 */ NULL, +/* 1f38 */ NULL, +/* 1f39 */ NULL, +/* 1f3a */ NULL, +/* 1f3b */ NULL, +/* 1f3c */ NULL, +/* 1f3d */ NULL, +/* 1f3e */ NULL, +/* 1f3f */ NULL, +/* 1f40 */ NULL, +/* 1f41 */ NULL, +/* 1f42 */ NULL, +/* 1f43 */ NULL, +/* 1f44 */ NULL, +/* 1f45 */ NULL, +/* 1f46 */ NULL, +/* 1f47 */ NULL, +/* 1f48 */ NULL, +/* 1f49 */ NULL, +/* 1f4a */ NULL, +/* 1f4b */ NULL, +/* 1f4c */ NULL, +/* 1f4d */ NULL, +/* 1f4e */ NULL, +/* 1f4f */ NULL, +/* 1f50 */ NULL, +/* 1f51 */ NULL, +/* 1f52 */ NULL, +/* 1f53 */ NULL, +/* 1f54 */ NULL, +/* 1f55 */ NULL, +/* 1f56 */ NULL, +/* 1f57 */ NULL, +/* 1f58 */ NULL, +/* 1f59 */ NULL, +/* 1f5a */ NULL, +/* 1f5b */ NULL, +/* 1f5c */ NULL, +/* 1f5d */ NULL, +/* 1f5e */ NULL, +/* 1f5f */ NULL, +/* 1f60 */ NULL, +/* 1f61 */ NULL, +/* 1f62 */ NULL, +/* 1f63 */ NULL, +/* 1f64 */ NULL, +/* 1f65 */ NULL, +/* 1f66 */ NULL, +/* 1f67 */ NULL, +/* 1f68 */ NULL, +/* 1f69 */ NULL, +/* 1f6a */ NULL, +/* 1f6b */ NULL, +/* 1f6c */ NULL, +/* 1f6d */ NULL, +/* 1f6e */ NULL, +/* 1f6f */ NULL, +/* 1f70 */ NULL, +/* 1f71 */ NULL, +/* 1f72 */ NULL, +/* 1f73 */ NULL, +/* 1f74 */ NULL, +/* 1f75 */ NULL, +/* 1f76 */ NULL, +/* 1f77 */ NULL, +/* 1f78 */ NULL, +/* 1f79 */ NULL, +/* 1f7a */ NULL, +/* 1f7b */ NULL, +/* 1f7c */ NULL, +/* 1f7d */ NULL, +/* 1f7e */ NULL, +/* 1f7f */ NULL, +/* 1f80 */ NULL, +/* 1f81 */ NULL, +/* 1f82 */ NULL, +/* 1f83 */ NULL, +/* 1f84 */ NULL, +/* 1f85 */ NULL, +/* 1f86 */ NULL, +/* 1f87 */ NULL, +/* 1f88 */ NULL, +/* 1f89 */ NULL, +/* 1f8a */ NULL, +/* 1f8b */ NULL, +/* 1f8c */ NULL, +/* 1f8d */ NULL, +/* 1f8e */ NULL, +/* 1f8f */ NULL, +/* 1f90 */ NULL, +/* 1f91 */ NULL, +/* 1f92 */ NULL, +/* 1f93 */ NULL, +/* 1f94 */ NULL, +/* 1f95 */ NULL, +/* 1f96 */ NULL, +/* 1f97 */ NULL, +/* 1f98 */ NULL, +/* 1f99 */ NULL, +/* 1f9a */ NULL, +/* 1f9b */ NULL, +/* 1f9c */ NULL, +/* 1f9d */ NULL, +/* 1f9e */ NULL, +/* 1f9f */ NULL, +/* 1fa0 */ NULL, +/* 1fa1 */ NULL, +/* 1fa2 */ NULL, +/* 1fa3 */ NULL, +/* 1fa4 */ NULL, +/* 1fa5 */ NULL, +/* 1fa6 */ NULL, +/* 1fa7 */ NULL, +/* 1fa8 */ NULL, +/* 1fa9 */ NULL, +/* 1faa */ NULL, +/* 1fab */ NULL, +/* 1fac */ NULL, +/* 1fad */ NULL, +/* 1fae */ NULL, +/* 1faf */ NULL, +/* 1fb0 */ NULL, +/* 1fb1 */ NULL, +/* 1fb2 */ NULL, +/* 1fb3 */ NULL, +/* 1fb4 */ NULL, +/* 1fb5 */ NULL, +/* 1fb6 */ NULL, +/* 1fb7 */ NULL, +/* 1fb8 */ NULL, +/* 1fb9 */ NULL, +/* 1fba */ NULL, +/* 1fbb */ NULL, +/* 1fbc */ NULL, +/* 1fbd */ NULL, +/* 1fbe */ NULL, +/* 1fbf */ NULL, +/* 1fc0 */ NULL, +/* 1fc1 */ NULL, +/* 1fc2 */ NULL, +/* 1fc3 */ NULL, +/* 1fc4 */ NULL, +/* 1fc5 */ NULL, +/* 1fc6 */ NULL, +/* 1fc7 */ NULL, +/* 1fc8 */ NULL, +/* 1fc9 */ NULL, +/* 1fca */ NULL, +/* 1fcb */ NULL, +/* 1fcc */ NULL, +/* 1fcd */ NULL, +/* 1fce */ NULL, +/* 1fcf */ NULL, +/* 1fd0 */ NULL, +/* 1fd1 */ NULL, +/* 1fd2 */ NULL, +/* 1fd3 */ NULL, +/* 1fd4 */ NULL, +/* 1fd5 */ NULL, +/* 1fd6 */ NULL, +/* 1fd7 */ NULL, +/* 1fd8 */ NULL, +/* 1fd9 */ NULL, +/* 1fda */ NULL, +/* 1fdb */ NULL, +/* 1fdc */ NULL, +/* 1fdd */ NULL, +/* 1fde */ NULL, +/* 1fdf */ NULL, +/* 1fe0 */ NULL, +/* 1fe1 */ NULL, +/* 1fe2 */ NULL, +/* 1fe3 */ NULL, +/* 1fe4 */ NULL, +/* 1fe5 */ NULL, +/* 1fe6 */ NULL, +/* 1fe7 */ NULL, +/* 1fe8 */ NULL, +/* 1fe9 */ NULL, +/* 1fea */ NULL, +/* 1feb */ NULL, +/* 1fec */ NULL, +/* 1fed */ NULL, +/* 1fee */ NULL, +/* 1fef */ NULL, +/* 1ff0 */ NULL, +/* 1ff1 */ NULL, +/* 1ff2 */ NULL, +/* 1ff3 */ NULL, +/* 1ff4 */ NULL, +/* 1ff5 */ NULL, +/* 1ff6 */ NULL, +/* 1ff7 */ NULL, +/* 1ff8 */ NULL, +/* 1ff9 */ NULL, +/* 1ffa */ NULL, +/* 1ffb */ NULL, +/* 1ffc */ NULL, +/* 1ffd */ NULL, +/* 1ffe */ NULL, +/* 1fff */ NULL, +/* 2000 */ NULL, +/* 2001 */ NULL, +/* 2002 */ NULL, +/* 2003 */ NULL, +/* 2004 */ NULL, +/* 2005 */ NULL, +/* 2006 */ NULL, +/* 2007 */ NULL, +/* 2008 */ NULL, +/* 2009 */ NULL, +/* 200a */ NULL, +/* 200b */ NULL, +/* 200c */ "afii61664", +/* 200d */ "afii301", +/* 200e */ "afii299", +/* 200f */ "afii300", +/* 2010 */ NULL, +/* 2011 */ NULL, +/* 2012 */ "figuredash", +/* 2013 */ "endash", +/* 2014 */ "emdash", +/* 2015 */ "afii00208", +/* 2016 */ NULL, +/* 2017 */ "underscoredbl", +/* 2018 */ "quoteleft", +/* 2019 */ "quoteright", +/* 201a */ "quotesinglbase", +/* 201b */ "quotereversed", +/* 201c */ "quotedblleft", +/* 201d */ "quotedblright", +/* 201e */ "quotedblbase", +/* 201f */ NULL, +/* 2020 */ "dagger", +/* 2021 */ "daggerdbl", +/* 2022 */ "bullet", +/* 2023 */ NULL, +/* 2024 */ "onedotenleader", +/* 2025 */ "twodotenleader", +/* 2026 */ "ellipsis", +/* 2027 */ NULL, +/* 2028 */ NULL, +/* 2029 */ NULL, +/* 202a */ NULL, +/* 202b */ NULL, +/* 202c */ "afii61573", +/* 202d */ "afii61574", +/* 202e */ "afii61575", +/* 202f */ NULL, +/* 2030 */ "perthousand", +/* 2031 */ NULL, +/* 2032 */ "minute", +/* 2033 */ "second", +/* 2034 */ NULL, +/* 2035 */ NULL, +/* 2036 */ NULL, +/* 2037 */ NULL, +/* 2038 */ NULL, +/* 2039 */ "guilsinglleft", +/* 203a */ "guilsinglright", +/* 203b */ NULL, +/* 203c */ "exclamdbl", +/* 203d */ NULL, +/* 203e */ NULL, +/* 203f */ NULL, +/* 2040 */ NULL, +/* 2041 */ NULL, +/* 2042 */ NULL, +/* 2043 */ NULL, +/* 2044 */ "fraction", +/* 2045 */ NULL, +/* 2046 */ NULL, +/* 2047 */ NULL, +/* 2048 */ NULL, +/* 2049 */ NULL, +/* 204a */ NULL, +/* 204b */ NULL, +/* 204c */ NULL, +/* 204d */ NULL, +/* 204e */ NULL, +/* 204f */ NULL, +/* 2050 */ NULL, +/* 2051 */ NULL, +/* 2052 */ NULL, +/* 2053 */ NULL, +/* 2054 */ NULL, +/* 2055 */ NULL, +/* 2056 */ NULL, +/* 2057 */ NULL, +/* 2058 */ NULL, +/* 2059 */ NULL, +/* 205a */ NULL, +/* 205b */ NULL, +/* 205c */ NULL, +/* 205d */ NULL, +/* 205e */ NULL, +/* 205f */ NULL, +/* 2060 */ NULL, +/* 2061 */ NULL, +/* 2062 */ NULL, +/* 2063 */ NULL, +/* 2064 */ NULL, +/* 2065 */ NULL, +/* 2066 */ NULL, +/* 2067 */ NULL, +/* 2068 */ NULL, +/* 2069 */ NULL, +/* 206a */ NULL, +/* 206b */ NULL, +/* 206c */ NULL, +/* 206d */ NULL, +/* 206e */ NULL, +/* 206f */ NULL, +/* 2070 */ NULL, +/* 2071 */ NULL, +/* 2072 */ NULL, +/* 2073 */ NULL, +/* 2074 */ NULL, +/* 2075 */ NULL, +/* 2076 */ NULL, +/* 2077 */ NULL, +/* 2078 */ NULL, +/* 2079 */ NULL, +/* 207a */ NULL, +/* 207b */ NULL, +/* 207c */ NULL, +/* 207d */ NULL, +/* 207e */ NULL, +/* 207f */ NULL, +/* 2080 */ NULL, +/* 2081 */ NULL, +/* 2082 */ NULL, +/* 2083 */ NULL, +/* 2084 */ NULL, +/* 2085 */ NULL, +/* 2086 */ NULL, +/* 2087 */ NULL, +/* 2088 */ NULL, +/* 2089 */ NULL, +/* 208a */ NULL, +/* 208b */ NULL, +/* 208c */ NULL, +/* 208d */ NULL, +/* 208e */ NULL, +/* 208f */ NULL, +/* 2090 */ NULL, +/* 2091 */ NULL, +/* 2092 */ NULL, +/* 2093 */ NULL, +/* 2094 */ NULL, +/* 2095 */ NULL, +/* 2096 */ NULL, +/* 2097 */ NULL, +/* 2098 */ NULL, +/* 2099 */ NULL, +/* 209a */ NULL, +/* 209b */ NULL, +/* 209c */ NULL, +/* 209d */ NULL, +/* 209e */ NULL, +/* 209f */ NULL, +/* 20a0 */ NULL, +/* 20a1 */ "colonmonetary", +/* 20a2 */ NULL, +/* 20a3 */ "franc", +/* 20a4 */ "lira", +/* 20a5 */ NULL, +/* 20a6 */ NULL, +/* 20a7 */ "peseta", +/* 20a8 */ NULL, +/* 20a9 */ NULL, +/* 20aa */ "afii57636", +/* 20ab */ "dong", +/* 20ac */ "Euro", +/* 20ad */ NULL, +/* 20ae */ NULL, +/* 20af */ NULL, +/* 20b0 */ NULL, +/* 20b1 */ NULL, +/* 20b2 */ NULL, +/* 20b3 */ NULL, +/* 20b4 */ NULL, +/* 20b5 */ NULL, +/* 20b6 */ NULL, +/* 20b7 */ NULL, +/* 20b8 */ NULL, +/* 20b9 */ NULL, +/* 20ba */ NULL, +/* 20bb */ NULL, +/* 20bc */ NULL, +/* 20bd */ NULL, +/* 20be */ NULL, +/* 20bf */ NULL, +/* 20c0 */ NULL, +/* 20c1 */ NULL, +/* 20c2 */ NULL, +/* 20c3 */ NULL, +/* 20c4 */ NULL, +/* 20c5 */ NULL, +/* 20c6 */ NULL, +/* 20c7 */ NULL, +/* 20c8 */ NULL, +/* 20c9 */ NULL, +/* 20ca */ NULL, +/* 20cb */ NULL, +/* 20cc */ NULL, +/* 20cd */ NULL, +/* 20ce */ NULL, +/* 20cf */ NULL, +/* 20d0 */ NULL, +/* 20d1 */ NULL, +/* 20d2 */ NULL, +/* 20d3 */ NULL, +/* 20d4 */ NULL, +/* 20d5 */ NULL, +/* 20d6 */ NULL, +/* 20d7 */ NULL, +/* 20d8 */ NULL, +/* 20d9 */ NULL, +/* 20da */ NULL, +/* 20db */ NULL, +/* 20dc */ NULL, +/* 20dd */ NULL, +/* 20de */ NULL, +/* 20df */ NULL, +/* 20e0 */ NULL, +/* 20e1 */ NULL, +/* 20e2 */ NULL, +/* 20e3 */ NULL, +/* 20e4 */ NULL, +/* 20e5 */ NULL, +/* 20e6 */ NULL, +/* 20e7 */ NULL, +/* 20e8 */ NULL, +/* 20e9 */ NULL, +/* 20ea */ NULL, +/* 20eb */ NULL, +/* 20ec */ NULL, +/* 20ed */ NULL, +/* 20ee */ NULL, +/* 20ef */ NULL, +/* 20f0 */ NULL, +/* 20f1 */ NULL, +/* 20f2 */ NULL, +/* 20f3 */ NULL, +/* 20f4 */ NULL, +/* 20f5 */ NULL, +/* 20f6 */ NULL, +/* 20f7 */ NULL, +/* 20f8 */ NULL, +/* 20f9 */ NULL, +/* 20fa */ NULL, +/* 20fb */ NULL, +/* 20fc */ NULL, +/* 20fd */ NULL, +/* 20fe */ NULL, +/* 20ff */ NULL, +/* 2100 */ NULL, +/* 2101 */ NULL, +/* 2102 */ NULL, +/* 2103 */ NULL, +/* 2104 */ NULL, +/* 2105 */ "afii61248", +/* 2106 */ NULL, +/* 2107 */ NULL, +/* 2108 */ NULL, +/* 2109 */ NULL, +/* 210a */ NULL, +/* 210b */ NULL, +/* 210c */ NULL, +/* 210d */ NULL, +/* 210e */ NULL, +/* 210f */ NULL, +/* 2110 */ NULL, +/* 2111 */ "Ifraktur", +/* 2112 */ NULL, +/* 2113 */ "afii61289", +/* 2114 */ NULL, +/* 2115 */ NULL, +/* 2116 */ "afii61352", +/* 2117 */ NULL, +/* 2118 */ "weierstrass", +/* 2119 */ NULL, +/* 211a */ NULL, +/* 211b */ NULL, +/* 211c */ "Rfraktur", +/* 211d */ NULL, +/* 211e */ "prescription", +/* 211f */ NULL, +/* 2120 */ NULL, +/* 2121 */ NULL, +/* 2122 */ "trademark", +/* 2123 */ NULL, +/* 2124 */ NULL, +/* 2125 */ NULL, +/* 2126 */ "Omega", +/* 2127 */ NULL, +/* 2128 */ NULL, +/* 2129 */ NULL, +/* 212a */ NULL, +/* 212b */ NULL, +/* 212c */ NULL, +/* 212d */ NULL, +/* 212e */ "estimated", +/* 212f */ NULL, +/* 2130 */ NULL, +/* 2131 */ NULL, +/* 2132 */ NULL, +/* 2133 */ NULL, +/* 2134 */ NULL, +/* 2135 */ "aleph", +/* 2136 */ NULL, +/* 2137 */ NULL, +/* 2138 */ NULL, +/* 2139 */ NULL, +/* 213a */ NULL, +/* 213b */ NULL, +/* 213c */ NULL, +/* 213d */ NULL, +/* 213e */ NULL, +/* 213f */ NULL, +/* 2140 */ NULL, +/* 2141 */ NULL, +/* 2142 */ NULL, +/* 2143 */ NULL, +/* 2144 */ NULL, +/* 2145 */ NULL, +/* 2146 */ NULL, +/* 2147 */ NULL, +/* 2148 */ NULL, +/* 2149 */ NULL, +/* 214a */ NULL, +/* 214b */ NULL, +/* 214c */ NULL, +/* 214d */ NULL, +/* 214e */ NULL, +/* 214f */ NULL, +/* 2150 */ NULL, +/* 2151 */ NULL, +/* 2152 */ NULL, +/* 2153 */ "onethird", +/* 2154 */ "twothirds", +/* 2155 */ NULL, +/* 2156 */ NULL, +/* 2157 */ NULL, +/* 2158 */ NULL, +/* 2159 */ NULL, +/* 215a */ NULL, +/* 215b */ "oneeighth", +/* 215c */ "threeeighths", +/* 215d */ "fiveeighths", +/* 215e */ "seveneighths", +/* 215f */ NULL, +/* 2160 */ NULL, +/* 2161 */ NULL, +/* 2162 */ NULL, +/* 2163 */ NULL, +/* 2164 */ NULL, +/* 2165 */ NULL, +/* 2166 */ NULL, +/* 2167 */ NULL, +/* 2168 */ NULL, +/* 2169 */ NULL, +/* 216a */ NULL, +/* 216b */ NULL, +/* 216c */ NULL, +/* 216d */ NULL, +/* 216e */ NULL, +/* 216f */ NULL, +/* 2170 */ NULL, +/* 2171 */ NULL, +/* 2172 */ NULL, +/* 2173 */ NULL, +/* 2174 */ NULL, +/* 2175 */ NULL, +/* 2176 */ NULL, +/* 2177 */ NULL, +/* 2178 */ NULL, +/* 2179 */ NULL, +/* 217a */ NULL, +/* 217b */ NULL, +/* 217c */ NULL, +/* 217d */ NULL, +/* 217e */ NULL, +/* 217f */ NULL, +/* 2180 */ NULL, +/* 2181 */ NULL, +/* 2182 */ NULL, +/* 2183 */ NULL, +/* 2184 */ NULL, +/* 2185 */ NULL, +/* 2186 */ NULL, +/* 2187 */ NULL, +/* 2188 */ NULL, +/* 2189 */ NULL, +/* 218a */ NULL, +/* 218b */ NULL, +/* 218c */ NULL, +/* 218d */ NULL, +/* 218e */ NULL, +/* 218f */ NULL, +/* 2190 */ "arrowleft", +/* 2191 */ "arrowup", +/* 2192 */ "arrowright", +/* 2193 */ "arrowdown", +/* 2194 */ "arrowboth", +/* 2195 */ "arrowupdn", +/* 2196 */ NULL, +/* 2197 */ NULL, +/* 2198 */ NULL, +/* 2199 */ NULL, +/* 219a */ NULL, +/* 219b */ NULL, +/* 219c */ NULL, +/* 219d */ NULL, +/* 219e */ NULL, +/* 219f */ NULL, +/* 21a0 */ NULL, +/* 21a1 */ NULL, +/* 21a2 */ NULL, +/* 21a3 */ NULL, +/* 21a4 */ NULL, +/* 21a5 */ NULL, +/* 21a6 */ NULL, +/* 21a7 */ NULL, +/* 21a8 */ "arrowupdnbse", +/* 21a9 */ NULL, +/* 21aa */ NULL, +/* 21ab */ NULL, +/* 21ac */ NULL, +/* 21ad */ NULL, +/* 21ae */ NULL, +/* 21af */ NULL, +/* 21b0 */ NULL, +/* 21b1 */ NULL, +/* 21b2 */ NULL, +/* 21b3 */ NULL, +/* 21b4 */ NULL, +/* 21b5 */ "carriagereturn", +/* 21b6 */ NULL, +/* 21b7 */ NULL, +/* 21b8 */ NULL, +/* 21b9 */ NULL, +/* 21ba */ NULL, +/* 21bb */ NULL, +/* 21bc */ NULL, +/* 21bd */ NULL, +/* 21be */ NULL, +/* 21bf */ NULL, +/* 21c0 */ NULL, +/* 21c1 */ NULL, +/* 21c2 */ NULL, +/* 21c3 */ NULL, +/* 21c4 */ NULL, +/* 21c5 */ NULL, +/* 21c6 */ NULL, +/* 21c7 */ NULL, +/* 21c8 */ NULL, +/* 21c9 */ NULL, +/* 21ca */ NULL, +/* 21cb */ NULL, +/* 21cc */ NULL, +/* 21cd */ NULL, +/* 21ce */ NULL, +/* 21cf */ NULL, +/* 21d0 */ "arrowdblleft", +/* 21d1 */ "arrowdblup", +/* 21d2 */ "arrowdblright", +/* 21d3 */ "arrowdbldown", +/* 21d4 */ "arrowdblboth", +/* 21d5 */ NULL, +/* 21d6 */ NULL, +/* 21d7 */ NULL, +/* 21d8 */ NULL, +/* 21d9 */ NULL, +/* 21da */ NULL, +/* 21db */ NULL, +/* 21dc */ NULL, +/* 21dd */ NULL, +/* 21de */ NULL, +/* 21df */ NULL, +/* 21e0 */ NULL, +/* 21e1 */ NULL, +/* 21e2 */ NULL, +/* 21e3 */ NULL, +/* 21e4 */ NULL, +/* 21e5 */ NULL, +/* 21e6 */ NULL, +/* 21e7 */ NULL, +/* 21e8 */ NULL, +/* 21e9 */ NULL, +/* 21ea */ NULL, +/* 21eb */ NULL, +/* 21ec */ NULL, +/* 21ed */ NULL, +/* 21ee */ NULL, +/* 21ef */ NULL, +/* 21f0 */ NULL, +/* 21f1 */ NULL, +/* 21f2 */ NULL, +/* 21f3 */ NULL, +/* 21f4 */ NULL, +/* 21f5 */ NULL, +/* 21f6 */ NULL, +/* 21f7 */ NULL, +/* 21f8 */ NULL, +/* 21f9 */ NULL, +/* 21fa */ NULL, +/* 21fb */ NULL, +/* 21fc */ NULL, +/* 21fd */ NULL, +/* 21fe */ NULL, +/* 21ff */ NULL, +/* 2200 */ "universal", +/* 2201 */ NULL, +/* 2202 */ "partialdiff", +/* 2203 */ "existential", +/* 2204 */ NULL, +/* 2205 */ "emptyset", +/* 2206 */ "Delta", +/* 2207 */ "gradient", +/* 2208 */ "element", +/* 2209 */ "notelement", +/* 220a */ NULL, +/* 220b */ "suchthat", +/* 220c */ NULL, +/* 220d */ NULL, +/* 220e */ NULL, +/* 220f */ "product", +/* 2210 */ NULL, +/* 2211 */ "summation", +/* 2212 */ "minus", +/* 2213 */ NULL, +/* 2214 */ NULL, +/* 2215 */ NULL, +/* 2216 */ NULL, +/* 2217 */ "asteriskmath", +/* 2218 */ NULL, +/* 2219 */ NULL, +/* 221a */ "radical", +/* 221b */ NULL, +/* 221c */ NULL, +/* 221d */ "proportional", +/* 221e */ "infinity", +/* 221f */ "orthogonal", +/* 2220 */ "angle", +/* 2221 */ NULL, +/* 2222 */ NULL, +/* 2223 */ NULL, +/* 2224 */ NULL, +/* 2225 */ NULL, +/* 2226 */ NULL, +/* 2227 */ "logicaland", +/* 2228 */ "logicalor", +/* 2229 */ "intersection", +/* 222a */ "union", +/* 222b */ "integral", +/* 222c */ NULL, +/* 222d */ NULL, +/* 222e */ NULL, +/* 222f */ NULL, +/* 2230 */ NULL, +/* 2231 */ NULL, +/* 2232 */ NULL, +/* 2233 */ NULL, +/* 2234 */ "therefore", +/* 2235 */ NULL, +/* 2236 */ NULL, +/* 2237 */ NULL, +/* 2238 */ NULL, +/* 2239 */ NULL, +/* 223a */ NULL, +/* 223b */ NULL, +/* 223c */ "similar", +/* 223d */ NULL, +/* 223e */ NULL, +/* 223f */ NULL, +/* 2240 */ NULL, +/* 2241 */ NULL, +/* 2242 */ NULL, +/* 2243 */ NULL, +/* 2244 */ NULL, +/* 2245 */ "congruent", +/* 2246 */ NULL, +/* 2247 */ NULL, +/* 2248 */ "approxequal", +/* 2249 */ NULL, +/* 224a */ NULL, +/* 224b */ NULL, +/* 224c */ NULL, +/* 224d */ NULL, +/* 224e */ NULL, +/* 224f */ NULL, +/* 2250 */ NULL, +/* 2251 */ NULL, +/* 2252 */ NULL, +/* 2253 */ NULL, +/* 2254 */ NULL, +/* 2255 */ NULL, +/* 2256 */ NULL, +/* 2257 */ NULL, +/* 2258 */ NULL, +/* 2259 */ NULL, +/* 225a */ NULL, +/* 225b */ NULL, +/* 225c */ NULL, +/* 225d */ NULL, +/* 225e */ NULL, +/* 225f */ NULL, +/* 2260 */ "notequal", +/* 2261 */ "equivalence", +/* 2262 */ NULL, +/* 2263 */ NULL, +/* 2264 */ "lessequal", +/* 2265 */ "greaterequal", +/* 2266 */ NULL, +/* 2267 */ NULL, +/* 2268 */ NULL, +/* 2269 */ NULL, +/* 226a */ NULL, +/* 226b */ NULL, +/* 226c */ NULL, +/* 226d */ NULL, +/* 226e */ NULL, +/* 226f */ NULL, +/* 2270 */ NULL, +/* 2271 */ NULL, +/* 2272 */ NULL, +/* 2273 */ NULL, +/* 2274 */ NULL, +/* 2275 */ NULL, +/* 2276 */ NULL, +/* 2277 */ NULL, +/* 2278 */ NULL, +/* 2279 */ NULL, +/* 227a */ NULL, +/* 227b */ NULL, +/* 227c */ NULL, +/* 227d */ NULL, +/* 227e */ NULL, +/* 227f */ NULL, +/* 2280 */ NULL, +/* 2281 */ NULL, +/* 2282 */ "propersubset", +/* 2283 */ "propersuperset", +/* 2284 */ "notsubset", +/* 2285 */ NULL, +/* 2286 */ "reflexsubset", +/* 2287 */ "reflexsuperset", +/* 2288 */ NULL, +/* 2289 */ NULL, +/* 228a */ NULL, +/* 228b */ NULL, +/* 228c */ NULL, +/* 228d */ NULL, +/* 228e */ NULL, +/* 228f */ NULL, +/* 2290 */ NULL, +/* 2291 */ NULL, +/* 2292 */ NULL, +/* 2293 */ NULL, +/* 2294 */ NULL, +/* 2295 */ "circleplus", +/* 2296 */ NULL, +/* 2297 */ "circlemultiply", +/* 2298 */ NULL, +/* 2299 */ NULL, +/* 229a */ NULL, +/* 229b */ NULL, +/* 229c */ NULL, +/* 229d */ NULL, +/* 229e */ NULL, +/* 229f */ NULL, +/* 22a0 */ NULL, +/* 22a1 */ NULL, +/* 22a2 */ NULL, +/* 22a3 */ NULL, +/* 22a4 */ NULL, +/* 22a5 */ "perpendicular", +/* 22a6 */ NULL, +/* 22a7 */ NULL, +/* 22a8 */ NULL, +/* 22a9 */ NULL, +/* 22aa */ NULL, +/* 22ab */ NULL, +/* 22ac */ NULL, +/* 22ad */ NULL, +/* 22ae */ NULL, +/* 22af */ NULL, +/* 22b0 */ NULL, +/* 22b1 */ NULL, +/* 22b2 */ NULL, +/* 22b3 */ NULL, +/* 22b4 */ NULL, +/* 22b5 */ NULL, +/* 22b6 */ NULL, +/* 22b7 */ NULL, +/* 22b8 */ NULL, +/* 22b9 */ NULL, +/* 22ba */ NULL, +/* 22bb */ NULL, +/* 22bc */ NULL, +/* 22bd */ NULL, +/* 22be */ NULL, +/* 22bf */ NULL, +/* 22c0 */ NULL, +/* 22c1 */ NULL, +/* 22c2 */ NULL, +/* 22c3 */ NULL, +/* 22c4 */ NULL, +/* 22c5 */ "dotmath", +/* 22c6 */ NULL, +/* 22c7 */ NULL, +/* 22c8 */ NULL, +/* 22c9 */ NULL, +/* 22ca */ NULL, +/* 22cb */ NULL, +/* 22cc */ NULL, +/* 22cd */ NULL, +/* 22ce */ NULL, +/* 22cf */ NULL, +/* 22d0 */ NULL, +/* 22d1 */ NULL, +/* 22d2 */ NULL, +/* 22d3 */ NULL, +/* 22d4 */ NULL, +/* 22d5 */ NULL, +/* 22d6 */ NULL, +/* 22d7 */ NULL, +/* 22d8 */ NULL, +/* 22d9 */ NULL, +/* 22da */ NULL, +/* 22db */ NULL, +/* 22dc */ NULL, +/* 22dd */ NULL, +/* 22de */ NULL, +/* 22df */ NULL, +/* 22e0 */ NULL, +/* 22e1 */ NULL, +/* 22e2 */ NULL, +/* 22e3 */ NULL, +/* 22e4 */ NULL, +/* 22e5 */ NULL, +/* 22e6 */ NULL, +/* 22e7 */ NULL, +/* 22e8 */ NULL, +/* 22e9 */ NULL, +/* 22ea */ NULL, +/* 22eb */ NULL, +/* 22ec */ NULL, +/* 22ed */ NULL, +/* 22ee */ NULL, +/* 22ef */ NULL, +/* 22f0 */ NULL, +/* 22f1 */ NULL, +/* 22f2 */ NULL, +/* 22f3 */ NULL, +/* 22f4 */ NULL, +/* 22f5 */ NULL, +/* 22f6 */ NULL, +/* 22f7 */ NULL, +/* 22f8 */ NULL, +/* 22f9 */ NULL, +/* 22fa */ NULL, +/* 22fb */ NULL, +/* 22fc */ NULL, +/* 22fd */ NULL, +/* 22fe */ NULL, +/* 22ff */ NULL, +/* 2300 */ NULL, +/* 2301 */ NULL, +/* 2302 */ "house", +/* 2303 */ NULL, +/* 2304 */ NULL, +/* 2305 */ NULL, +/* 2306 */ NULL, +/* 2307 */ NULL, +/* 2308 */ NULL, +/* 2309 */ NULL, +/* 230a */ NULL, +/* 230b */ NULL, +/* 230c */ NULL, +/* 230d */ NULL, +/* 230e */ NULL, +/* 230f */ NULL, +/* 2310 */ "revlogicalnot", +/* 2311 */ NULL, +/* 2312 */ NULL, +/* 2313 */ NULL, +/* 2314 */ NULL, +/* 2315 */ NULL, +/* 2316 */ NULL, +/* 2317 */ NULL, +/* 2318 */ NULL, +/* 2319 */ NULL, +/* 231a */ NULL, +/* 231b */ NULL, +/* 231c */ NULL, +/* 231d */ NULL, +/* 231e */ NULL, +/* 231f */ NULL, +/* 2320 */ "integraltp", +/* 2321 */ "integralbt", +/* 2322 */ NULL, +/* 2323 */ NULL, +/* 2324 */ NULL, +/* 2325 */ NULL, +/* 2326 */ NULL, +/* 2327 */ NULL, +/* 2328 */ NULL, +/* 2329 */ "angleleft", +/* 232a */ "angleright", +/* 232b */ NULL, +/* 232c */ NULL, +/* 232d */ NULL, +/* 232e */ NULL, +/* 232f */ NULL, +/* 2330 */ NULL, +/* 2331 */ NULL, +/* 2332 */ NULL, +/* 2333 */ NULL, +/* 2334 */ NULL, +/* 2335 */ NULL, +/* 2336 */ NULL, +/* 2337 */ NULL, +/* 2338 */ NULL, +/* 2339 */ NULL, +/* 233a */ NULL, +/* 233b */ NULL, +/* 233c */ NULL, +/* 233d */ NULL, +/* 233e */ NULL, +/* 233f */ NULL, +/* 2340 */ NULL, +/* 2341 */ NULL, +/* 2342 */ NULL, +/* 2343 */ NULL, +/* 2344 */ NULL, +/* 2345 */ NULL, +/* 2346 */ NULL, +/* 2347 */ NULL, +/* 2348 */ NULL, +/* 2349 */ NULL, +/* 234a */ NULL, +/* 234b */ NULL, +/* 234c */ NULL, +/* 234d */ NULL, +/* 234e */ NULL, +/* 234f */ NULL, +/* 2350 */ NULL, +/* 2351 */ NULL, +/* 2352 */ NULL, +/* 2353 */ NULL, +/* 2354 */ NULL, +/* 2355 */ NULL, +/* 2356 */ NULL, +/* 2357 */ NULL, +/* 2358 */ NULL, +/* 2359 */ NULL, +/* 235a */ NULL, +/* 235b */ NULL, +/* 235c */ NULL, +/* 235d */ NULL, +/* 235e */ NULL, +/* 235f */ NULL, +/* 2360 */ NULL, +/* 2361 */ NULL, +/* 2362 */ NULL, +/* 2363 */ NULL, +/* 2364 */ NULL, +/* 2365 */ NULL, +/* 2366 */ NULL, +/* 2367 */ NULL, +/* 2368 */ NULL, +/* 2369 */ NULL, +/* 236a */ NULL, +/* 236b */ NULL, +/* 236c */ NULL, +/* 236d */ NULL, +/* 236e */ NULL, +/* 236f */ NULL, +/* 2370 */ NULL, +/* 2371 */ NULL, +/* 2372 */ NULL, +/* 2373 */ NULL, +/* 2374 */ NULL, +/* 2375 */ NULL, +/* 2376 */ NULL, +/* 2377 */ NULL, +/* 2378 */ NULL, +/* 2379 */ NULL, +/* 237a */ NULL, +/* 237b */ NULL, +/* 237c */ NULL, +/* 237d */ NULL, +/* 237e */ NULL, +/* 237f */ NULL, +/* 2380 */ NULL, +/* 2381 */ NULL, +/* 2382 */ NULL, +/* 2383 */ NULL, +/* 2384 */ NULL, +/* 2385 */ NULL, +/* 2386 */ NULL, +/* 2387 */ NULL, +/* 2388 */ NULL, +/* 2389 */ NULL, +/* 238a */ NULL, +/* 238b */ NULL, +/* 238c */ NULL, +/* 238d */ NULL, +/* 238e */ NULL, +/* 238f */ NULL, +/* 2390 */ NULL, +/* 2391 */ NULL, +/* 2392 */ NULL, +/* 2393 */ NULL, +/* 2394 */ NULL, +/* 2395 */ NULL, +/* 2396 */ NULL, +/* 2397 */ NULL, +/* 2398 */ NULL, +/* 2399 */ NULL, +/* 239a */ NULL, +/* 239b */ NULL, +/* 239c */ NULL, +/* 239d */ NULL, +/* 239e */ NULL, +/* 239f */ NULL, +/* 23a0 */ NULL, +/* 23a1 */ NULL, +/* 23a2 */ NULL, +/* 23a3 */ NULL, +/* 23a4 */ NULL, +/* 23a5 */ NULL, +/* 23a6 */ NULL, +/* 23a7 */ NULL, +/* 23a8 */ NULL, +/* 23a9 */ NULL, +/* 23aa */ NULL, +/* 23ab */ NULL, +/* 23ac */ NULL, +/* 23ad */ NULL, +/* 23ae */ NULL, +/* 23af */ NULL, +/* 23b0 */ NULL, +/* 23b1 */ NULL, +/* 23b2 */ NULL, +/* 23b3 */ NULL, +/* 23b4 */ NULL, +/* 23b5 */ NULL, +/* 23b6 */ NULL, +/* 23b7 */ NULL, +/* 23b8 */ NULL, +/* 23b9 */ NULL, +/* 23ba */ NULL, +/* 23bb */ NULL, +/* 23bc */ NULL, +/* 23bd */ NULL, +/* 23be */ NULL, +/* 23bf */ NULL, +/* 23c0 */ NULL, +/* 23c1 */ NULL, +/* 23c2 */ NULL, +/* 23c3 */ NULL, +/* 23c4 */ NULL, +/* 23c5 */ NULL, +/* 23c6 */ NULL, +/* 23c7 */ NULL, +/* 23c8 */ NULL, +/* 23c9 */ NULL, +/* 23ca */ NULL, +/* 23cb */ NULL, +/* 23cc */ NULL, +/* 23cd */ NULL, +/* 23ce */ NULL, +/* 23cf */ NULL, +/* 23d0 */ NULL, +/* 23d1 */ NULL, +/* 23d2 */ NULL, +/* 23d3 */ NULL, +/* 23d4 */ NULL, +/* 23d5 */ NULL, +/* 23d6 */ NULL, +/* 23d7 */ NULL, +/* 23d8 */ NULL, +/* 23d9 */ NULL, +/* 23da */ NULL, +/* 23db */ NULL, +/* 23dc */ NULL, +/* 23dd */ NULL, +/* 23de */ NULL, +/* 23df */ NULL, +/* 23e0 */ NULL, +/* 23e1 */ NULL, +/* 23e2 */ NULL, +/* 23e3 */ NULL, +/* 23e4 */ NULL, +/* 23e5 */ NULL, +/* 23e6 */ NULL, +/* 23e7 */ NULL, +/* 23e8 */ NULL, +/* 23e9 */ NULL, +/* 23ea */ NULL, +/* 23eb */ NULL, +/* 23ec */ NULL, +/* 23ed */ NULL, +/* 23ee */ NULL, +/* 23ef */ NULL, +/* 23f0 */ NULL, +/* 23f1 */ NULL, +/* 23f2 */ NULL, +/* 23f3 */ NULL, +/* 23f4 */ NULL, +/* 23f5 */ NULL, +/* 23f6 */ NULL, +/* 23f7 */ NULL, +/* 23f8 */ NULL, +/* 23f9 */ NULL, +/* 23fa */ NULL, +/* 23fb */ NULL, +/* 23fc */ NULL, +/* 23fd */ NULL, +/* 23fe */ NULL, +/* 23ff */ NULL, +/* 2400 */ NULL, +/* 2401 */ NULL, +/* 2402 */ NULL, +/* 2403 */ NULL, +/* 2404 */ NULL, +/* 2405 */ NULL, +/* 2406 */ NULL, +/* 2407 */ NULL, +/* 2408 */ NULL, +/* 2409 */ NULL, +/* 240a */ NULL, +/* 240b */ NULL, +/* 240c */ NULL, +/* 240d */ NULL, +/* 240e */ NULL, +/* 240f */ NULL, +/* 2410 */ NULL, +/* 2411 */ NULL, +/* 2412 */ NULL, +/* 2413 */ NULL, +/* 2414 */ NULL, +/* 2415 */ NULL, +/* 2416 */ NULL, +/* 2417 */ NULL, +/* 2418 */ NULL, +/* 2419 */ NULL, +/* 241a */ NULL, +/* 241b */ NULL, +/* 241c */ NULL, +/* 241d */ NULL, +/* 241e */ NULL, +/* 241f */ NULL, +/* 2420 */ NULL, +/* 2421 */ NULL, +/* 2422 */ NULL, +/* 2423 */ NULL, +/* 2424 */ NULL, +/* 2425 */ NULL, +/* 2426 */ NULL, +/* 2427 */ NULL, +/* 2428 */ NULL, +/* 2429 */ NULL, +/* 242a */ NULL, +/* 242b */ NULL, +/* 242c */ NULL, +/* 242d */ NULL, +/* 242e */ NULL, +/* 242f */ NULL, +/* 2430 */ NULL, +/* 2431 */ NULL, +/* 2432 */ NULL, +/* 2433 */ NULL, +/* 2434 */ NULL, +/* 2435 */ NULL, +/* 2436 */ NULL, +/* 2437 */ NULL, +/* 2438 */ NULL, +/* 2439 */ NULL, +/* 243a */ NULL, +/* 243b */ NULL, +/* 243c */ NULL, +/* 243d */ NULL, +/* 243e */ NULL, +/* 243f */ NULL, +/* 2440 */ NULL, +/* 2441 */ NULL, +/* 2442 */ NULL, +/* 2443 */ NULL, +/* 2444 */ NULL, +/* 2445 */ NULL, +/* 2446 */ NULL, +/* 2447 */ NULL, +/* 2448 */ NULL, +/* 2449 */ NULL, +/* 244a */ NULL, +/* 244b */ NULL, +/* 244c */ NULL, +/* 244d */ NULL, +/* 244e */ NULL, +/* 244f */ NULL, +/* 2450 */ NULL, +/* 2451 */ NULL, +/* 2452 */ NULL, +/* 2453 */ NULL, +/* 2454 */ NULL, +/* 2455 */ NULL, +/* 2456 */ NULL, +/* 2457 */ NULL, +/* 2458 */ NULL, +/* 2459 */ NULL, +/* 245a */ NULL, +/* 245b */ NULL, +/* 245c */ NULL, +/* 245d */ NULL, +/* 245e */ NULL, +/* 245f */ NULL, +/* 2460 */ NULL, +/* 2461 */ NULL, +/* 2462 */ NULL, +/* 2463 */ NULL, +/* 2464 */ NULL, +/* 2465 */ NULL, +/* 2466 */ NULL, +/* 2467 */ NULL, +/* 2468 */ NULL, +/* 2469 */ NULL, +/* 246a */ NULL, +/* 246b */ NULL, +/* 246c */ NULL, +/* 246d */ NULL, +/* 246e */ NULL, +/* 246f */ NULL, +/* 2470 */ NULL, +/* 2471 */ NULL, +/* 2472 */ NULL, +/* 2473 */ NULL, +/* 2474 */ NULL, +/* 2475 */ NULL, +/* 2476 */ NULL, +/* 2477 */ NULL, +/* 2478 */ NULL, +/* 2479 */ NULL, +/* 247a */ NULL, +/* 247b */ NULL, +/* 247c */ NULL, +/* 247d */ NULL, +/* 247e */ NULL, +/* 247f */ NULL, +/* 2480 */ NULL, +/* 2481 */ NULL, +/* 2482 */ NULL, +/* 2483 */ NULL, +/* 2484 */ NULL, +/* 2485 */ NULL, +/* 2486 */ NULL, +/* 2487 */ NULL, +/* 2488 */ NULL, +/* 2489 */ NULL, +/* 248a */ NULL, +/* 248b */ NULL, +/* 248c */ NULL, +/* 248d */ NULL, +/* 248e */ NULL, +/* 248f */ NULL, +/* 2490 */ NULL, +/* 2491 */ NULL, +/* 2492 */ NULL, +/* 2493 */ NULL, +/* 2494 */ NULL, +/* 2495 */ NULL, +/* 2496 */ NULL, +/* 2497 */ NULL, +/* 2498 */ NULL, +/* 2499 */ NULL, +/* 249a */ NULL, +/* 249b */ NULL, +/* 249c */ NULL, +/* 249d */ NULL, +/* 249e */ NULL, +/* 249f */ NULL, +/* 24a0 */ NULL, +/* 24a1 */ NULL, +/* 24a2 */ NULL, +/* 24a3 */ NULL, +/* 24a4 */ NULL, +/* 24a5 */ NULL, +/* 24a6 */ NULL, +/* 24a7 */ NULL, +/* 24a8 */ NULL, +/* 24a9 */ NULL, +/* 24aa */ NULL, +/* 24ab */ NULL, +/* 24ac */ NULL, +/* 24ad */ NULL, +/* 24ae */ NULL, +/* 24af */ NULL, +/* 24b0 */ NULL, +/* 24b1 */ NULL, +/* 24b2 */ NULL, +/* 24b3 */ NULL, +/* 24b4 */ NULL, +/* 24b5 */ NULL, +/* 24b6 */ NULL, +/* 24b7 */ NULL, +/* 24b8 */ NULL, +/* 24b9 */ NULL, +/* 24ba */ NULL, +/* 24bb */ NULL, +/* 24bc */ NULL, +/* 24bd */ NULL, +/* 24be */ NULL, +/* 24bf */ NULL, +/* 24c0 */ NULL, +/* 24c1 */ NULL, +/* 24c2 */ NULL, +/* 24c3 */ NULL, +/* 24c4 */ NULL, +/* 24c5 */ NULL, +/* 24c6 */ NULL, +/* 24c7 */ NULL, +/* 24c8 */ NULL, +/* 24c9 */ NULL, +/* 24ca */ NULL, +/* 24cb */ NULL, +/* 24cc */ NULL, +/* 24cd */ NULL, +/* 24ce */ NULL, +/* 24cf */ NULL, +/* 24d0 */ NULL, +/* 24d1 */ NULL, +/* 24d2 */ NULL, +/* 24d3 */ NULL, +/* 24d4 */ NULL, +/* 24d5 */ NULL, +/* 24d6 */ NULL, +/* 24d7 */ NULL, +/* 24d8 */ NULL, +/* 24d9 */ NULL, +/* 24da */ NULL, +/* 24db */ NULL, +/* 24dc */ NULL, +/* 24dd */ NULL, +/* 24de */ NULL, +/* 24df */ NULL, +/* 24e0 */ NULL, +/* 24e1 */ NULL, +/* 24e2 */ NULL, +/* 24e3 */ NULL, +/* 24e4 */ NULL, +/* 24e5 */ NULL, +/* 24e6 */ NULL, +/* 24e7 */ NULL, +/* 24e8 */ NULL, +/* 24e9 */ NULL, +/* 24ea */ NULL, +/* 24eb */ NULL, +/* 24ec */ NULL, +/* 24ed */ NULL, +/* 24ee */ NULL, +/* 24ef */ NULL, +/* 24f0 */ NULL, +/* 24f1 */ NULL, +/* 24f2 */ NULL, +/* 24f3 */ NULL, +/* 24f4 */ NULL, +/* 24f5 */ NULL, +/* 24f6 */ NULL, +/* 24f7 */ NULL, +/* 24f8 */ NULL, +/* 24f9 */ NULL, +/* 24fa */ NULL, +/* 24fb */ NULL, +/* 24fc */ NULL, +/* 24fd */ NULL, +/* 24fe */ NULL, +/* 24ff */ NULL, +/* 2500 */ "SF100000", +/* 2501 */ NULL, +/* 2502 */ "SF110000", +/* 2503 */ NULL, +/* 2504 */ NULL, +/* 2505 */ NULL, +/* 2506 */ NULL, +/* 2507 */ NULL, +/* 2508 */ NULL, +/* 2509 */ NULL, +/* 250a */ NULL, +/* 250b */ NULL, +/* 250c */ "SF010000", +/* 250d */ NULL, +/* 250e */ NULL, +/* 250f */ NULL, +/* 2510 */ "SF030000", +/* 2511 */ NULL, +/* 2512 */ NULL, +/* 2513 */ NULL, +/* 2514 */ "SF020000", +/* 2515 */ NULL, +/* 2516 */ NULL, +/* 2517 */ NULL, +/* 2518 */ "SF040000", +/* 2519 */ NULL, +/* 251a */ NULL, +/* 251b */ NULL, +/* 251c */ "SF080000", +/* 251d */ NULL, +/* 251e */ NULL, +/* 251f */ NULL, +/* 2520 */ NULL, +/* 2521 */ NULL, +/* 2522 */ NULL, +/* 2523 */ NULL, +/* 2524 */ "SF090000", +/* 2525 */ NULL, +/* 2526 */ NULL, +/* 2527 */ NULL, +/* 2528 */ NULL, +/* 2529 */ NULL, +/* 252a */ NULL, +/* 252b */ NULL, +/* 252c */ "SF060000", +/* 252d */ NULL, +/* 252e */ NULL, +/* 252f */ NULL, +/* 2530 */ NULL, +/* 2531 */ NULL, +/* 2532 */ NULL, +/* 2533 */ NULL, +/* 2534 */ "SF070000", +/* 2535 */ NULL, +/* 2536 */ NULL, +/* 2537 */ NULL, +/* 2538 */ NULL, +/* 2539 */ NULL, +/* 253a */ NULL, +/* 253b */ NULL, +/* 253c */ "SF050000", +/* 253d */ NULL, +/* 253e */ NULL, +/* 253f */ NULL, +/* 2540 */ NULL, +/* 2541 */ NULL, +/* 2542 */ NULL, +/* 2543 */ NULL, +/* 2544 */ NULL, +/* 2545 */ NULL, +/* 2546 */ NULL, +/* 2547 */ NULL, +/* 2548 */ NULL, +/* 2549 */ NULL, +/* 254a */ NULL, +/* 254b */ NULL, +/* 254c */ NULL, +/* 254d */ NULL, +/* 254e */ NULL, +/* 254f */ NULL, +/* 2550 */ "SF430000", +/* 2551 */ "SF240000", +/* 2552 */ "SF510000", +/* 2553 */ "SF520000", +/* 2554 */ "SF390000", +/* 2555 */ "SF220000", +/* 2556 */ "SF210000", +/* 2557 */ "SF250000", +/* 2558 */ "SF500000", +/* 2559 */ "SF490000", +/* 255a */ "SF380000", +/* 255b */ "SF280000", +/* 255c */ "SF270000", +/* 255d */ "SF260000", +/* 255e */ "SF360000", +/* 255f */ "SF370000", +/* 2560 */ "SF420000", +/* 2561 */ "SF190000", +/* 2562 */ "SF200000", +/* 2563 */ "SF230000", +/* 2564 */ "SF470000", +/* 2565 */ "SF480000", +/* 2566 */ "SF410000", +/* 2567 */ "SF450000", +/* 2568 */ "SF460000", +/* 2569 */ "SF400000", +/* 256a */ "SF540000", +/* 256b */ "SF530000", +/* 256c */ "SF440000", +/* 256d */ NULL, +/* 256e */ NULL, +/* 256f */ NULL, +/* 2570 */ NULL, +/* 2571 */ NULL, +/* 2572 */ NULL, +/* 2573 */ NULL, +/* 2574 */ NULL, +/* 2575 */ NULL, +/* 2576 */ NULL, +/* 2577 */ NULL, +/* 2578 */ NULL, +/* 2579 */ NULL, +/* 257a */ NULL, +/* 257b */ NULL, +/* 257c */ NULL, +/* 257d */ NULL, +/* 257e */ NULL, +/* 257f */ NULL, +/* 2580 */ "upblock", +/* 2581 */ NULL, +/* 2582 */ NULL, +/* 2583 */ NULL, +/* 2584 */ "dnblock", +/* 2585 */ NULL, +/* 2586 */ NULL, +/* 2587 */ NULL, +/* 2588 */ "block", +/* 2589 */ NULL, +/* 258a */ NULL, +/* 258b */ NULL, +/* 258c */ "lfblock", +/* 258d */ NULL, +/* 258e */ NULL, +/* 258f */ NULL, +/* 2590 */ "rtblock", +/* 2591 */ "ltshade", +/* 2592 */ "shade", +/* 2593 */ "dkshade", +/* 2594 */ NULL, +/* 2595 */ NULL, +/* 2596 */ NULL, +/* 2597 */ NULL, +/* 2598 */ NULL, +/* 2599 */ NULL, +/* 259a */ NULL, +/* 259b */ NULL, +/* 259c */ NULL, +/* 259d */ NULL, +/* 259e */ NULL, +/* 259f */ NULL, +/* 25a0 */ "filledbox", +/* 25a1 */ "H22073", +/* 25a2 */ NULL, +/* 25a3 */ NULL, +/* 25a4 */ NULL, +/* 25a5 */ NULL, +/* 25a6 */ NULL, +/* 25a7 */ NULL, +/* 25a8 */ NULL, +/* 25a9 */ NULL, +/* 25aa */ "H18543", +/* 25ab */ "H18551", +/* 25ac */ "filledrect", +/* 25ad */ NULL, +/* 25ae */ NULL, +/* 25af */ NULL, +/* 25b0 */ NULL, +/* 25b1 */ NULL, +/* 25b2 */ "triagup", +/* 25b3 */ NULL, +/* 25b4 */ NULL, +/* 25b5 */ NULL, +/* 25b6 */ NULL, +/* 25b7 */ NULL, +/* 25b8 */ NULL, +/* 25b9 */ NULL, +/* 25ba */ "triagrt", +/* 25bb */ NULL, +/* 25bc */ "triagdn", +/* 25bd */ NULL, +/* 25be */ NULL, +/* 25bf */ NULL, +/* 25c0 */ NULL, +/* 25c1 */ NULL, +/* 25c2 */ NULL, +/* 25c3 */ NULL, +/* 25c4 */ "triaglf", +/* 25c5 */ NULL, +/* 25c6 */ NULL, +/* 25c7 */ NULL, +/* 25c8 */ NULL, +/* 25c9 */ NULL, +/* 25ca */ "lozenge", +/* 25cb */ "circle", +/* 25cc */ NULL, +/* 25cd */ NULL, +/* 25ce */ NULL, +/* 25cf */ "H18533", +/* 25d0 */ NULL, +/* 25d1 */ NULL, +/* 25d2 */ NULL, +/* 25d3 */ NULL, +/* 25d4 */ NULL, +/* 25d5 */ NULL, +/* 25d6 */ NULL, +/* 25d7 */ NULL, +/* 25d8 */ "invbullet", +/* 25d9 */ "invcircle", +/* 25da */ NULL, +/* 25db */ NULL, +/* 25dc */ NULL, +/* 25dd */ NULL, +/* 25de */ NULL, +/* 25df */ NULL, +/* 25e0 */ NULL, +/* 25e1 */ NULL, +/* 25e2 */ NULL, +/* 25e3 */ NULL, +/* 25e4 */ NULL, +/* 25e5 */ NULL, +/* 25e6 */ "openbullet", +/* 25e7 */ NULL, +/* 25e8 */ NULL, +/* 25e9 */ NULL, +/* 25ea */ NULL, +/* 25eb */ NULL, +/* 25ec */ NULL, +/* 25ed */ NULL, +/* 25ee */ NULL, +/* 25ef */ NULL, +/* 25f0 */ NULL, +/* 25f1 */ NULL, +/* 25f2 */ NULL, +/* 25f3 */ NULL, +/* 25f4 */ NULL, +/* 25f5 */ NULL, +/* 25f6 */ NULL, +/* 25f7 */ NULL, +/* 25f8 */ NULL, +/* 25f9 */ NULL, +/* 25fa */ NULL, +/* 25fb */ NULL, +/* 25fc */ NULL, +/* 25fd */ NULL, +/* 25fe */ NULL, +/* 25ff */ NULL, +/* 2600 */ NULL, +/* 2601 */ NULL, +/* 2602 */ NULL, +/* 2603 */ NULL, +/* 2604 */ NULL, +/* 2605 */ NULL, +/* 2606 */ NULL, +/* 2607 */ NULL, +/* 2608 */ NULL, +/* 2609 */ NULL, +/* 260a */ NULL, +/* 260b */ NULL, +/* 260c */ NULL, +/* 260d */ NULL, +/* 260e */ NULL, +/* 260f */ NULL, +/* 2610 */ NULL, +/* 2611 */ NULL, +/* 2612 */ NULL, +/* 2613 */ NULL, +/* 2614 */ NULL, +/* 2615 */ NULL, +/* 2616 */ NULL, +/* 2617 */ NULL, +/* 2618 */ NULL, +/* 2619 */ NULL, +/* 261a */ NULL, +/* 261b */ NULL, +/* 261c */ NULL, +/* 261d */ NULL, +/* 261e */ NULL, +/* 261f */ NULL, +/* 2620 */ NULL, +/* 2621 */ NULL, +/* 2622 */ NULL, +/* 2623 */ NULL, +/* 2624 */ NULL, +/* 2625 */ NULL, +/* 2626 */ NULL, +/* 2627 */ NULL, +/* 2628 */ NULL, +/* 2629 */ NULL, +/* 262a */ NULL, +/* 262b */ NULL, +/* 262c */ NULL, +/* 262d */ NULL, +/* 262e */ NULL, +/* 262f */ NULL, +/* 2630 */ NULL, +/* 2631 */ NULL, +/* 2632 */ NULL, +/* 2633 */ NULL, +/* 2634 */ NULL, +/* 2635 */ NULL, +/* 2636 */ NULL, +/* 2637 */ NULL, +/* 2638 */ NULL, +/* 2639 */ NULL, +/* 263a */ "smileface", +/* 263b */ "invsmileface", +/* 263c */ "sun", +/* 263d */ NULL, +/* 263e */ NULL, +/* 263f */ NULL, +/* 2640 */ "female", +/* 2641 */ NULL, +/* 2642 */ "male", +/* 2643 */ NULL, +/* 2644 */ NULL, +/* 2645 */ NULL, +/* 2646 */ NULL, +/* 2647 */ NULL, +/* 2648 */ NULL, +/* 2649 */ NULL, +/* 264a */ NULL, +/* 264b */ NULL, +/* 264c */ NULL, +/* 264d */ NULL, +/* 264e */ NULL, +/* 264f */ NULL, +/* 2650 */ NULL, +/* 2651 */ NULL, +/* 2652 */ NULL, +/* 2653 */ NULL, +/* 2654 */ NULL, +/* 2655 */ NULL, +/* 2656 */ NULL, +/* 2657 */ NULL, +/* 2658 */ NULL, +/* 2659 */ NULL, +/* 265a */ NULL, +/* 265b */ NULL, +/* 265c */ NULL, +/* 265d */ NULL, +/* 265e */ NULL, +/* 265f */ NULL, +/* 2660 */ "spade", +/* 2661 */ NULL, +/* 2662 */ NULL, +/* 2663 */ "club", +/* 2664 */ NULL, +/* 2665 */ "heart", +/* 2666 */ "diamond", +/* 2667 */ NULL, +/* 2668 */ NULL, +/* 2669 */ NULL, +/* 266a */ "musicalnote", +/* 266b */ "musicalnotedbl", +/* 266c */ NULL, +/* 266d */ NULL, +/* 266e */ NULL, +/* 266f */ NULL, +/* 2670 */ NULL, +/* 2671 */ NULL, +/* 2672 */ NULL, +/* 2673 */ NULL, +/* 2674 */ NULL, +/* 2675 */ NULL, +/* 2676 */ NULL, +/* 2677 */ NULL, +/* 2678 */ NULL, +/* 2679 */ NULL, +/* 267a */ NULL, +/* 267b */ NULL, +/* 267c */ NULL, +/* 267d */ NULL, +/* 267e */ NULL, +/* 267f */ NULL, +/* 2680 */ NULL, +/* 2681 */ NULL, +/* 2682 */ NULL, +/* 2683 */ NULL, +/* 2684 */ NULL, +/* 2685 */ NULL, +/* 2686 */ NULL, +/* 2687 */ NULL, +/* 2688 */ NULL, +/* 2689 */ NULL, +/* 268a */ NULL, +/* 268b */ NULL, +/* 268c */ NULL, +/* 268d */ NULL, +/* 268e */ NULL, +/* 268f */ NULL, +/* 2690 */ NULL, +/* 2691 */ NULL, +/* 2692 */ NULL, +/* 2693 */ NULL, +/* 2694 */ NULL, +/* 2695 */ NULL, +/* 2696 */ NULL, +/* 2697 */ NULL, +/* 2698 */ NULL, +/* 2699 */ NULL, +/* 269a */ NULL, +/* 269b */ NULL, +/* 269c */ NULL, +/* 269d */ NULL, +/* 269e */ NULL, +/* 269f */ NULL, +/* 26a0 */ NULL, +/* 26a1 */ NULL, +/* 26a2 */ NULL, +/* 26a3 */ NULL, +/* 26a4 */ NULL, +/* 26a5 */ NULL, +/* 26a6 */ NULL, +/* 26a7 */ NULL, +/* 26a8 */ NULL, +/* 26a9 */ NULL, +/* 26aa */ NULL, +/* 26ab */ NULL, +/* 26ac */ NULL, +/* 26ad */ NULL, +/* 26ae */ NULL, +/* 26af */ NULL, +/* 26b0 */ NULL, +/* 26b1 */ NULL, +/* 26b2 */ NULL, +/* 26b3 */ NULL, +/* 26b4 */ NULL, +/* 26b5 */ NULL, +/* 26b6 */ NULL, +/* 26b7 */ NULL, +/* 26b8 */ NULL, +/* 26b9 */ NULL, +/* 26ba */ NULL, +/* 26bb */ NULL, +/* 26bc */ NULL, +/* 26bd */ NULL, +/* 26be */ NULL, +/* 26bf */ NULL, +/* 26c0 */ NULL, +/* 26c1 */ NULL, +/* 26c2 */ NULL, +/* 26c3 */ NULL, +/* 26c4 */ NULL, +/* 26c5 */ NULL, +/* 26c6 */ NULL, +/* 26c7 */ NULL, +/* 26c8 */ NULL, +/* 26c9 */ NULL, +/* 26ca */ NULL, +/* 26cb */ NULL, +/* 26cc */ NULL, +/* 26cd */ NULL, +/* 26ce */ NULL, +/* 26cf */ NULL, +/* 26d0 */ NULL, +/* 26d1 */ NULL, +/* 26d2 */ NULL, +/* 26d3 */ NULL, +/* 26d4 */ NULL, +/* 26d5 */ NULL, +/* 26d6 */ NULL, +/* 26d7 */ NULL, +/* 26d8 */ NULL, +/* 26d9 */ NULL, +/* 26da */ NULL, +/* 26db */ NULL, +/* 26dc */ NULL, +/* 26dd */ NULL, +/* 26de */ NULL, +/* 26df */ NULL, +/* 26e0 */ NULL, +/* 26e1 */ NULL, +/* 26e2 */ NULL, +/* 26e3 */ NULL, +/* 26e4 */ NULL, +/* 26e5 */ NULL, +/* 26e6 */ NULL, +/* 26e7 */ NULL, +/* 26e8 */ NULL, +/* 26e9 */ NULL, +/* 26ea */ NULL, +/* 26eb */ NULL, +/* 26ec */ NULL, +/* 26ed */ NULL, +/* 26ee */ NULL, +/* 26ef */ NULL, +/* 26f0 */ NULL, +/* 26f1 */ NULL, +/* 26f2 */ NULL, +/* 26f3 */ NULL, +/* 26f4 */ NULL, +/* 26f5 */ NULL, +/* 26f6 */ NULL, +/* 26f7 */ NULL, +/* 26f8 */ NULL, +/* 26f9 */ NULL, +/* 26fa */ NULL, +/* 26fb */ NULL, +/* 26fc */ NULL, +/* 26fd */ NULL, +/* 26fe */ NULL, +/* 26ff */ NULL, +/* 2700 */ NULL, +/* 2701 */ NULL, +/* 2702 */ NULL, +/* 2703 */ NULL, +/* 2704 */ NULL, +/* 2705 */ NULL, +/* 2706 */ NULL, +/* 2707 */ NULL, +/* 2708 */ NULL, +/* 2709 */ NULL, +/* 270a */ NULL, +/* 270b */ NULL, +/* 270c */ NULL, +/* 270d */ NULL, +/* 270e */ NULL, +/* 270f */ NULL, +/* 2710 */ NULL, +/* 2711 */ NULL, +/* 2712 */ NULL, +/* 2713 */ NULL, +/* 2714 */ NULL, +/* 2715 */ NULL, +/* 2716 */ NULL, +/* 2717 */ NULL, +/* 2718 */ NULL, +/* 2719 */ NULL, +/* 271a */ NULL, +/* 271b */ NULL, +/* 271c */ NULL, +/* 271d */ NULL, +/* 271e */ NULL, +/* 271f */ NULL, +/* 2720 */ NULL, +/* 2721 */ NULL, +/* 2722 */ NULL, +/* 2723 */ NULL, +/* 2724 */ NULL, +/* 2725 */ NULL, +/* 2726 */ NULL, +/* 2727 */ NULL, +/* 2728 */ NULL, +/* 2729 */ NULL, +/* 272a */ NULL, +/* 272b */ NULL, +/* 272c */ NULL, +/* 272d */ NULL, +/* 272e */ NULL, +/* 272f */ NULL, +/* 2730 */ NULL, +/* 2731 */ NULL, +/* 2732 */ NULL, +/* 2733 */ NULL, +/* 2734 */ NULL, +/* 2735 */ NULL, +/* 2736 */ NULL, +/* 2737 */ NULL, +/* 2738 */ NULL, +/* 2739 */ NULL, +/* 273a */ NULL, +/* 273b */ NULL, +/* 273c */ NULL, +/* 273d */ NULL, +/* 273e */ NULL, +/* 273f */ NULL, +/* 2740 */ NULL, +/* 2741 */ NULL, +/* 2742 */ NULL, +/* 2743 */ NULL, +/* 2744 */ NULL, +/* 2745 */ NULL, +/* 2746 */ NULL, +/* 2747 */ NULL, +/* 2748 */ NULL, +/* 2749 */ NULL, +/* 274a */ NULL, +/* 274b */ NULL, +/* 274c */ NULL, +/* 274d */ NULL, +/* 274e */ NULL, +/* 274f */ NULL, +/* 2750 */ NULL, +/* 2751 */ NULL, +/* 2752 */ NULL, +/* 2753 */ NULL, +/* 2754 */ NULL, +/* 2755 */ NULL, +/* 2756 */ NULL, +/* 2757 */ NULL, +/* 2758 */ NULL, +/* 2759 */ NULL, +/* 275a */ NULL, +/* 275b */ NULL, +/* 275c */ NULL, +/* 275d */ NULL, +/* 275e */ NULL, +/* 275f */ NULL, +/* 2760 */ NULL, +/* 2761 */ NULL, +/* 2762 */ NULL, +/* 2763 */ NULL, +/* 2764 */ NULL, +/* 2765 */ NULL, +/* 2766 */ NULL, +/* 2767 */ NULL, +/* 2768 */ NULL, +/* 2769 */ NULL, +/* 276a */ NULL, +/* 276b */ NULL, +/* 276c */ NULL, +/* 276d */ NULL, +/* 276e */ NULL, +/* 276f */ NULL, +/* 2770 */ NULL, +/* 2771 */ NULL, +/* 2772 */ NULL, +/* 2773 */ NULL, +/* 2774 */ NULL, +/* 2775 */ NULL, +/* 2776 */ NULL, +/* 2777 */ NULL, +/* 2778 */ NULL, +/* 2779 */ NULL, +/* 277a */ NULL, +/* 277b */ NULL, +/* 277c */ NULL, +/* 277d */ NULL, +/* 277e */ NULL, +/* 277f */ NULL, +/* 2780 */ NULL, +/* 2781 */ NULL, +/* 2782 */ NULL, +/* 2783 */ NULL, +/* 2784 */ NULL, +/* 2785 */ NULL, +/* 2786 */ NULL, +/* 2787 */ NULL, +/* 2788 */ NULL, +/* 2789 */ NULL, +/* 278a */ NULL, +/* 278b */ NULL, +/* 278c */ NULL, +/* 278d */ NULL, +/* 278e */ NULL, +/* 278f */ NULL, +/* 2790 */ NULL, +/* 2791 */ NULL, +/* 2792 */ NULL, +/* 2793 */ NULL, +/* 2794 */ NULL, +/* 2795 */ NULL, +/* 2796 */ NULL, +/* 2797 */ NULL, +/* 2798 */ NULL, +/* 2799 */ NULL, +/* 279a */ NULL, +/* 279b */ NULL, +/* 279c */ NULL, +/* 279d */ NULL, +/* 279e */ NULL, +/* 279f */ NULL, +/* 27a0 */ NULL, +/* 27a1 */ NULL, +/* 27a2 */ NULL, +/* 27a3 */ NULL, +/* 27a4 */ NULL, +/* 27a5 */ NULL, +/* 27a6 */ NULL, +/* 27a7 */ NULL, +/* 27a8 */ NULL, +/* 27a9 */ NULL, +/* 27aa */ NULL, +/* 27ab */ NULL, +/* 27ac */ NULL, +/* 27ad */ NULL, +/* 27ae */ NULL, +/* 27af */ NULL, +/* 27b0 */ NULL, +/* 27b1 */ NULL, +/* 27b2 */ NULL, +/* 27b3 */ NULL, +/* 27b4 */ NULL, +/* 27b5 */ NULL, +/* 27b6 */ NULL, +/* 27b7 */ NULL, +/* 27b8 */ NULL, +/* 27b9 */ NULL, +/* 27ba */ NULL, +/* 27bb */ NULL, +/* 27bc */ NULL, +/* 27bd */ NULL, +/* 27be */ NULL, +/* 27bf */ NULL, +/* 27c0 */ NULL, +/* 27c1 */ NULL, +/* 27c2 */ NULL, +/* 27c3 */ NULL, +/* 27c4 */ NULL, +/* 27c5 */ NULL, +/* 27c6 */ NULL, +/* 27c7 */ NULL, +/* 27c8 */ NULL, +/* 27c9 */ NULL, +/* 27ca */ NULL, +/* 27cb */ NULL, +/* 27cc */ NULL, +/* 27cd */ NULL, +/* 27ce */ NULL, +/* 27cf */ NULL, +/* 27d0 */ NULL, +/* 27d1 */ NULL, +/* 27d2 */ NULL, +/* 27d3 */ NULL, +/* 27d4 */ NULL, +/* 27d5 */ NULL, +/* 27d6 */ NULL, +/* 27d7 */ NULL, +/* 27d8 */ NULL, +/* 27d9 */ NULL, +/* 27da */ NULL, +/* 27db */ NULL, +/* 27dc */ NULL, +/* 27dd */ NULL, +/* 27de */ NULL, +/* 27df */ NULL, +/* 27e0 */ NULL, +/* 27e1 */ NULL, +/* 27e2 */ NULL, +/* 27e3 */ NULL, +/* 27e4 */ NULL, +/* 27e5 */ NULL, +/* 27e6 */ NULL, +/* 27e7 */ NULL, +/* 27e8 */ NULL, +/* 27e9 */ NULL, +/* 27ea */ NULL, +/* 27eb */ NULL, +/* 27ec */ NULL, +/* 27ed */ NULL, +/* 27ee */ NULL, +/* 27ef */ NULL, +/* 27f0 */ NULL, +/* 27f1 */ NULL, +/* 27f2 */ NULL, +/* 27f3 */ NULL, +/* 27f4 */ NULL, +/* 27f5 */ NULL, +/* 27f6 */ NULL, +/* 27f7 */ NULL, +/* 27f8 */ NULL, +/* 27f9 */ NULL, +/* 27fa */ NULL, +/* 27fb */ NULL, +/* 27fc */ NULL, +/* 27fd */ NULL, +/* 27fe */ NULL, +/* 27ff */ NULL, +/* 2800 */ NULL, +/* 2801 */ NULL, +/* 2802 */ NULL, +/* 2803 */ NULL, +/* 2804 */ NULL, +/* 2805 */ NULL, +/* 2806 */ NULL, +/* 2807 */ NULL, +/* 2808 */ NULL, +/* 2809 */ NULL, +/* 280a */ NULL, +/* 280b */ NULL, +/* 280c */ NULL, +/* 280d */ NULL, +/* 280e */ NULL, +/* 280f */ NULL, +/* 2810 */ NULL, +/* 2811 */ NULL, +/* 2812 */ NULL, +/* 2813 */ NULL, +/* 2814 */ NULL, +/* 2815 */ NULL, +/* 2816 */ NULL, +/* 2817 */ NULL, +/* 2818 */ NULL, +/* 2819 */ NULL, +/* 281a */ NULL, +/* 281b */ NULL, +/* 281c */ NULL, +/* 281d */ NULL, +/* 281e */ NULL, +/* 281f */ NULL, +/* 2820 */ NULL, +/* 2821 */ NULL, +/* 2822 */ NULL, +/* 2823 */ NULL, +/* 2824 */ NULL, +/* 2825 */ NULL, +/* 2826 */ NULL, +/* 2827 */ NULL, +/* 2828 */ NULL, +/* 2829 */ NULL, +/* 282a */ NULL, +/* 282b */ NULL, +/* 282c */ NULL, +/* 282d */ NULL, +/* 282e */ NULL, +/* 282f */ NULL, +/* 2830 */ NULL, +/* 2831 */ NULL, +/* 2832 */ NULL, +/* 2833 */ NULL, +/* 2834 */ NULL, +/* 2835 */ NULL, +/* 2836 */ NULL, +/* 2837 */ NULL, +/* 2838 */ NULL, +/* 2839 */ NULL, +/* 283a */ NULL, +/* 283b */ NULL, +/* 283c */ NULL, +/* 283d */ NULL, +/* 283e */ NULL, +/* 283f */ NULL, +/* 2840 */ NULL, +/* 2841 */ NULL, +/* 2842 */ NULL, +/* 2843 */ NULL, +/* 2844 */ NULL, +/* 2845 */ NULL, +/* 2846 */ NULL, +/* 2847 */ NULL, +/* 2848 */ NULL, +/* 2849 */ NULL, +/* 284a */ NULL, +/* 284b */ NULL, +/* 284c */ NULL, +/* 284d */ NULL, +/* 284e */ NULL, +/* 284f */ NULL, +/* 2850 */ NULL, +/* 2851 */ NULL, +/* 2852 */ NULL, +/* 2853 */ NULL, +/* 2854 */ NULL, +/* 2855 */ NULL, +/* 2856 */ NULL, +/* 2857 */ NULL, +/* 2858 */ NULL, +/* 2859 */ NULL, +/* 285a */ NULL, +/* 285b */ NULL, +/* 285c */ NULL, +/* 285d */ NULL, +/* 285e */ NULL, +/* 285f */ NULL, +/* 2860 */ NULL, +/* 2861 */ NULL, +/* 2862 */ NULL, +/* 2863 */ NULL, +/* 2864 */ NULL, +/* 2865 */ NULL, +/* 2866 */ NULL, +/* 2867 */ NULL, +/* 2868 */ NULL, +/* 2869 */ NULL, +/* 286a */ NULL, +/* 286b */ NULL, +/* 286c */ NULL, +/* 286d */ NULL, +/* 286e */ NULL, +/* 286f */ NULL, +/* 2870 */ NULL, +/* 2871 */ NULL, +/* 2872 */ NULL, +/* 2873 */ NULL, +/* 2874 */ NULL, +/* 2875 */ NULL, +/* 2876 */ NULL, +/* 2877 */ NULL, +/* 2878 */ NULL, +/* 2879 */ NULL, +/* 287a */ NULL, +/* 287b */ NULL, +/* 287c */ NULL, +/* 287d */ NULL, +/* 287e */ NULL, +/* 287f */ NULL, +/* 2880 */ NULL, +/* 2881 */ NULL, +/* 2882 */ NULL, +/* 2883 */ NULL, +/* 2884 */ NULL, +/* 2885 */ NULL, +/* 2886 */ NULL, +/* 2887 */ NULL, +/* 2888 */ NULL, +/* 2889 */ NULL, +/* 288a */ NULL, +/* 288b */ NULL, +/* 288c */ NULL, +/* 288d */ NULL, +/* 288e */ NULL, +/* 288f */ NULL, +/* 2890 */ NULL, +/* 2891 */ NULL, +/* 2892 */ NULL, +/* 2893 */ NULL, +/* 2894 */ NULL, +/* 2895 */ NULL, +/* 2896 */ NULL, +/* 2897 */ NULL, +/* 2898 */ NULL, +/* 2899 */ NULL, +/* 289a */ NULL, +/* 289b */ NULL, +/* 289c */ NULL, +/* 289d */ NULL, +/* 289e */ NULL, +/* 289f */ NULL, +/* 28a0 */ NULL, +/* 28a1 */ NULL, +/* 28a2 */ NULL, +/* 28a3 */ NULL, +/* 28a4 */ NULL, +/* 28a5 */ NULL, +/* 28a6 */ NULL, +/* 28a7 */ NULL, +/* 28a8 */ NULL, +/* 28a9 */ NULL, +/* 28aa */ NULL, +/* 28ab */ NULL, +/* 28ac */ NULL, +/* 28ad */ NULL, +/* 28ae */ NULL, +/* 28af */ NULL, +/* 28b0 */ NULL, +/* 28b1 */ NULL, +/* 28b2 */ NULL, +/* 28b3 */ NULL, +/* 28b4 */ NULL, +/* 28b5 */ NULL, +/* 28b6 */ NULL, +/* 28b7 */ NULL, +/* 28b8 */ NULL, +/* 28b9 */ NULL, +/* 28ba */ NULL, +/* 28bb */ NULL, +/* 28bc */ NULL, +/* 28bd */ NULL, +/* 28be */ NULL, +/* 28bf */ NULL, +/* 28c0 */ NULL, +/* 28c1 */ NULL, +/* 28c2 */ NULL, +/* 28c3 */ NULL, +/* 28c4 */ NULL, +/* 28c5 */ NULL, +/* 28c6 */ NULL, +/* 28c7 */ NULL, +/* 28c8 */ NULL, +/* 28c9 */ NULL, +/* 28ca */ NULL, +/* 28cb */ NULL, +/* 28cc */ NULL, +/* 28cd */ NULL, +/* 28ce */ NULL, +/* 28cf */ NULL, +/* 28d0 */ NULL, +/* 28d1 */ NULL, +/* 28d2 */ NULL, +/* 28d3 */ NULL, +/* 28d4 */ NULL, +/* 28d5 */ NULL, +/* 28d6 */ NULL, +/* 28d7 */ NULL, +/* 28d8 */ NULL, +/* 28d9 */ NULL, +/* 28da */ NULL, +/* 28db */ NULL, +/* 28dc */ NULL, +/* 28dd */ NULL, +/* 28de */ NULL, +/* 28df */ NULL, +/* 28e0 */ NULL, +/* 28e1 */ NULL, +/* 28e2 */ NULL, +/* 28e3 */ NULL, +/* 28e4 */ NULL, +/* 28e5 */ NULL, +/* 28e6 */ NULL, +/* 28e7 */ NULL, +/* 28e8 */ NULL, +/* 28e9 */ NULL, +/* 28ea */ NULL, +/* 28eb */ NULL, +/* 28ec */ NULL, +/* 28ed */ NULL, +/* 28ee */ NULL, +/* 28ef */ NULL, +/* 28f0 */ NULL, +/* 28f1 */ NULL, +/* 28f2 */ NULL, +/* 28f3 */ NULL, +/* 28f4 */ NULL, +/* 28f5 */ NULL, +/* 28f6 */ NULL, +/* 28f7 */ NULL, +/* 28f8 */ NULL, +/* 28f9 */ NULL, +/* 28fa */ NULL, +/* 28fb */ NULL, +/* 28fc */ NULL, +/* 28fd */ NULL, +/* 28fe */ NULL, +/* 28ff */ NULL, +/* 2900 */ NULL, +/* 2901 */ NULL, +/* 2902 */ NULL, +/* 2903 */ NULL, +/* 2904 */ NULL, +/* 2905 */ NULL, +/* 2906 */ NULL, +/* 2907 */ NULL, +/* 2908 */ NULL, +/* 2909 */ NULL, +/* 290a */ NULL, +/* 290b */ NULL, +/* 290c */ NULL, +/* 290d */ NULL, +/* 290e */ NULL, +/* 290f */ NULL, +/* 2910 */ NULL, +/* 2911 */ NULL, +/* 2912 */ NULL, +/* 2913 */ NULL, +/* 2914 */ NULL, +/* 2915 */ NULL, +/* 2916 */ NULL, +/* 2917 */ NULL, +/* 2918 */ NULL, +/* 2919 */ NULL, +/* 291a */ NULL, +/* 291b */ NULL, +/* 291c */ NULL, +/* 291d */ NULL, +/* 291e */ NULL, +/* 291f */ NULL, +/* 2920 */ NULL, +/* 2921 */ NULL, +/* 2922 */ NULL, +/* 2923 */ NULL, +/* 2924 */ NULL, +/* 2925 */ NULL, +/* 2926 */ NULL, +/* 2927 */ NULL, +/* 2928 */ NULL, +/* 2929 */ NULL, +/* 292a */ NULL, +/* 292b */ NULL, +/* 292c */ NULL, +/* 292d */ NULL, +/* 292e */ NULL, +/* 292f */ NULL, +/* 2930 */ NULL, +/* 2931 */ NULL, +/* 2932 */ NULL, +/* 2933 */ NULL, +/* 2934 */ NULL, +/* 2935 */ NULL, +/* 2936 */ NULL, +/* 2937 */ NULL, +/* 2938 */ NULL, +/* 2939 */ NULL, +/* 293a */ NULL, +/* 293b */ NULL, +/* 293c */ NULL, +/* 293d */ NULL, +/* 293e */ NULL, +/* 293f */ NULL, +/* 2940 */ NULL, +/* 2941 */ NULL, +/* 2942 */ NULL, +/* 2943 */ NULL, +/* 2944 */ NULL, +/* 2945 */ NULL, +/* 2946 */ NULL, +/* 2947 */ NULL, +/* 2948 */ NULL, +/* 2949 */ NULL, +/* 294a */ NULL, +/* 294b */ NULL, +/* 294c */ NULL, +/* 294d */ NULL, +/* 294e */ NULL, +/* 294f */ NULL, +/* 2950 */ NULL, +/* 2951 */ NULL, +/* 2952 */ NULL, +/* 2953 */ NULL, +/* 2954 */ NULL, +/* 2955 */ NULL, +/* 2956 */ NULL, +/* 2957 */ NULL, +/* 2958 */ NULL, +/* 2959 */ NULL, +/* 295a */ NULL, +/* 295b */ NULL, +/* 295c */ NULL, +/* 295d */ NULL, +/* 295e */ NULL, +/* 295f */ NULL, +/* 2960 */ NULL, +/* 2961 */ NULL, +/* 2962 */ NULL, +/* 2963 */ NULL, +/* 2964 */ NULL, +/* 2965 */ NULL, +/* 2966 */ NULL, +/* 2967 */ NULL, +/* 2968 */ NULL, +/* 2969 */ NULL, +/* 296a */ NULL, +/* 296b */ NULL, +/* 296c */ NULL, +/* 296d */ NULL, +/* 296e */ NULL, +/* 296f */ NULL, +/* 2970 */ NULL, +/* 2971 */ NULL, +/* 2972 */ NULL, +/* 2973 */ NULL, +/* 2974 */ NULL, +/* 2975 */ NULL, +/* 2976 */ NULL, +/* 2977 */ NULL, +/* 2978 */ NULL, +/* 2979 */ NULL, +/* 297a */ NULL, +/* 297b */ NULL, +/* 297c */ NULL, +/* 297d */ NULL, +/* 297e */ NULL, +/* 297f */ NULL, +/* 2980 */ NULL, +/* 2981 */ NULL, +/* 2982 */ NULL, +/* 2983 */ NULL, +/* 2984 */ NULL, +/* 2985 */ NULL, +/* 2986 */ NULL, +/* 2987 */ NULL, +/* 2988 */ NULL, +/* 2989 */ NULL, +/* 298a */ NULL, +/* 298b */ NULL, +/* 298c */ NULL, +/* 298d */ NULL, +/* 298e */ NULL, +/* 298f */ NULL, +/* 2990 */ NULL, +/* 2991 */ NULL, +/* 2992 */ NULL, +/* 2993 */ NULL, +/* 2994 */ NULL, +/* 2995 */ NULL, +/* 2996 */ NULL, +/* 2997 */ NULL, +/* 2998 */ NULL, +/* 2999 */ NULL, +/* 299a */ NULL, +/* 299b */ NULL, +/* 299c */ NULL, +/* 299d */ NULL, +/* 299e */ NULL, +/* 299f */ NULL, +/* 29a0 */ NULL, +/* 29a1 */ NULL, +/* 29a2 */ NULL, +/* 29a3 */ NULL, +/* 29a4 */ NULL, +/* 29a5 */ NULL, +/* 29a6 */ NULL, +/* 29a7 */ NULL, +/* 29a8 */ NULL, +/* 29a9 */ NULL, +/* 29aa */ NULL, +/* 29ab */ NULL, +/* 29ac */ NULL, +/* 29ad */ NULL, +/* 29ae */ NULL, +/* 29af */ NULL, +/* 29b0 */ NULL, +/* 29b1 */ NULL, +/* 29b2 */ NULL, +/* 29b3 */ NULL, +/* 29b4 */ NULL, +/* 29b5 */ NULL, +/* 29b6 */ NULL, +/* 29b7 */ NULL, +/* 29b8 */ NULL, +/* 29b9 */ NULL, +/* 29ba */ NULL, +/* 29bb */ NULL, +/* 29bc */ NULL, +/* 29bd */ NULL, +/* 29be */ NULL, +/* 29bf */ NULL, +/* 29c0 */ NULL, +/* 29c1 */ NULL, +/* 29c2 */ NULL, +/* 29c3 */ NULL, +/* 29c4 */ NULL, +/* 29c5 */ NULL, +/* 29c6 */ NULL, +/* 29c7 */ NULL, +/* 29c8 */ NULL, +/* 29c9 */ NULL, +/* 29ca */ NULL, +/* 29cb */ NULL, +/* 29cc */ NULL, +/* 29cd */ NULL, +/* 29ce */ NULL, +/* 29cf */ NULL, +/* 29d0 */ NULL, +/* 29d1 */ NULL, +/* 29d2 */ NULL, +/* 29d3 */ NULL, +/* 29d4 */ NULL, +/* 29d5 */ NULL, +/* 29d6 */ NULL, +/* 29d7 */ NULL, +/* 29d8 */ NULL, +/* 29d9 */ NULL, +/* 29da */ NULL, +/* 29db */ NULL, +/* 29dc */ NULL, +/* 29dd */ NULL, +/* 29de */ NULL, +/* 29df */ NULL, +/* 29e0 */ NULL, +/* 29e1 */ NULL, +/* 29e2 */ NULL, +/* 29e3 */ NULL, +/* 29e4 */ NULL, +/* 29e5 */ NULL, +/* 29e6 */ NULL, +/* 29e7 */ NULL, +/* 29e8 */ NULL, +/* 29e9 */ NULL, +/* 29ea */ NULL, +/* 29eb */ NULL, +/* 29ec */ NULL, +/* 29ed */ NULL, +/* 29ee */ NULL, +/* 29ef */ NULL, +/* 29f0 */ NULL, +/* 29f1 */ NULL, +/* 29f2 */ NULL, +/* 29f3 */ NULL, +/* 29f4 */ NULL, +/* 29f5 */ NULL, +/* 29f6 */ NULL, +/* 29f7 */ NULL, +/* 29f8 */ NULL, +/* 29f9 */ NULL, +/* 29fa */ NULL, +/* 29fb */ NULL, +/* 29fc */ NULL, +/* 29fd */ NULL, +/* 29fe */ NULL, +/* 29ff */ NULL, +/* 2a00 */ NULL, +/* 2a01 */ NULL, +/* 2a02 */ NULL, +/* 2a03 */ NULL, +/* 2a04 */ NULL, +/* 2a05 */ NULL, +/* 2a06 */ NULL, +/* 2a07 */ NULL, +/* 2a08 */ NULL, +/* 2a09 */ NULL, +/* 2a0a */ NULL, +/* 2a0b */ NULL, +/* 2a0c */ NULL, +/* 2a0d */ NULL, +/* 2a0e */ NULL, +/* 2a0f */ NULL, +/* 2a10 */ NULL, +/* 2a11 */ NULL, +/* 2a12 */ NULL, +/* 2a13 */ NULL, +/* 2a14 */ NULL, +/* 2a15 */ NULL, +/* 2a16 */ NULL, +/* 2a17 */ NULL, +/* 2a18 */ NULL, +/* 2a19 */ NULL, +/* 2a1a */ NULL, +/* 2a1b */ NULL, +/* 2a1c */ NULL, +/* 2a1d */ NULL, +/* 2a1e */ NULL, +/* 2a1f */ NULL, +/* 2a20 */ NULL, +/* 2a21 */ NULL, +/* 2a22 */ NULL, +/* 2a23 */ NULL, +/* 2a24 */ NULL, +/* 2a25 */ NULL, +/* 2a26 */ NULL, +/* 2a27 */ NULL, +/* 2a28 */ NULL, +/* 2a29 */ NULL, +/* 2a2a */ NULL, +/* 2a2b */ NULL, +/* 2a2c */ NULL, +/* 2a2d */ NULL, +/* 2a2e */ NULL, +/* 2a2f */ NULL, +/* 2a30 */ NULL, +/* 2a31 */ NULL, +/* 2a32 */ NULL, +/* 2a33 */ NULL, +/* 2a34 */ NULL, +/* 2a35 */ NULL, +/* 2a36 */ NULL, +/* 2a37 */ NULL, +/* 2a38 */ NULL, +/* 2a39 */ NULL, +/* 2a3a */ NULL, +/* 2a3b */ NULL, +/* 2a3c */ NULL, +/* 2a3d */ NULL, +/* 2a3e */ NULL, +/* 2a3f */ NULL, +/* 2a40 */ NULL, +/* 2a41 */ NULL, +/* 2a42 */ NULL, +/* 2a43 */ NULL, +/* 2a44 */ NULL, +/* 2a45 */ NULL, +/* 2a46 */ NULL, +/* 2a47 */ NULL, +/* 2a48 */ NULL, +/* 2a49 */ NULL, +/* 2a4a */ NULL, +/* 2a4b */ NULL, +/* 2a4c */ NULL, +/* 2a4d */ NULL, +/* 2a4e */ NULL, +/* 2a4f */ NULL, +/* 2a50 */ NULL, +/* 2a51 */ NULL, +/* 2a52 */ NULL, +/* 2a53 */ NULL, +/* 2a54 */ NULL, +/* 2a55 */ NULL, +/* 2a56 */ NULL, +/* 2a57 */ NULL, +/* 2a58 */ NULL, +/* 2a59 */ NULL, +/* 2a5a */ NULL, +/* 2a5b */ NULL, +/* 2a5c */ NULL, +/* 2a5d */ NULL, +/* 2a5e */ NULL, +/* 2a5f */ NULL, +/* 2a60 */ NULL, +/* 2a61 */ NULL, +/* 2a62 */ NULL, +/* 2a63 */ NULL, +/* 2a64 */ NULL, +/* 2a65 */ NULL, +/* 2a66 */ NULL, +/* 2a67 */ NULL, +/* 2a68 */ NULL, +/* 2a69 */ NULL, +/* 2a6a */ NULL, +/* 2a6b */ NULL, +/* 2a6c */ NULL, +/* 2a6d */ NULL, +/* 2a6e */ NULL, +/* 2a6f */ NULL, +/* 2a70 */ NULL, +/* 2a71 */ NULL, +/* 2a72 */ NULL, +/* 2a73 */ NULL, +/* 2a74 */ NULL, +/* 2a75 */ NULL, +/* 2a76 */ NULL, +/* 2a77 */ NULL, +/* 2a78 */ NULL, +/* 2a79 */ NULL, +/* 2a7a */ NULL, +/* 2a7b */ NULL, +/* 2a7c */ NULL, +/* 2a7d */ NULL, +/* 2a7e */ NULL, +/* 2a7f */ NULL, +/* 2a80 */ NULL, +/* 2a81 */ NULL, +/* 2a82 */ NULL, +/* 2a83 */ NULL, +/* 2a84 */ NULL, +/* 2a85 */ NULL, +/* 2a86 */ NULL, +/* 2a87 */ NULL, +/* 2a88 */ NULL, +/* 2a89 */ NULL, +/* 2a8a */ NULL, +/* 2a8b */ NULL, +/* 2a8c */ NULL, +/* 2a8d */ NULL, +/* 2a8e */ NULL, +/* 2a8f */ NULL, +/* 2a90 */ NULL, +/* 2a91 */ NULL, +/* 2a92 */ NULL, +/* 2a93 */ NULL, +/* 2a94 */ NULL, +/* 2a95 */ NULL, +/* 2a96 */ NULL, +/* 2a97 */ NULL, +/* 2a98 */ NULL, +/* 2a99 */ NULL, +/* 2a9a */ NULL, +/* 2a9b */ NULL, +/* 2a9c */ NULL, +/* 2a9d */ NULL, +/* 2a9e */ NULL, +/* 2a9f */ NULL, +/* 2aa0 */ NULL, +/* 2aa1 */ NULL, +/* 2aa2 */ NULL, +/* 2aa3 */ NULL, +/* 2aa4 */ NULL, +/* 2aa5 */ NULL, +/* 2aa6 */ NULL, +/* 2aa7 */ NULL, +/* 2aa8 */ NULL, +/* 2aa9 */ NULL, +/* 2aaa */ NULL, +/* 2aab */ NULL, +/* 2aac */ NULL, +/* 2aad */ NULL, +/* 2aae */ NULL, +/* 2aaf */ NULL, +/* 2ab0 */ NULL, +/* 2ab1 */ NULL, +/* 2ab2 */ NULL, +/* 2ab3 */ NULL, +/* 2ab4 */ NULL, +/* 2ab5 */ NULL, +/* 2ab6 */ NULL, +/* 2ab7 */ NULL, +/* 2ab8 */ NULL, +/* 2ab9 */ NULL, +/* 2aba */ NULL, +/* 2abb */ NULL, +/* 2abc */ NULL, +/* 2abd */ NULL, +/* 2abe */ NULL, +/* 2abf */ NULL, +/* 2ac0 */ NULL, +/* 2ac1 */ NULL, +/* 2ac2 */ NULL, +/* 2ac3 */ NULL, +/* 2ac4 */ NULL, +/* 2ac5 */ NULL, +/* 2ac6 */ NULL, +/* 2ac7 */ NULL, +/* 2ac8 */ NULL, +/* 2ac9 */ NULL, +/* 2aca */ NULL, +/* 2acb */ NULL, +/* 2acc */ NULL, +/* 2acd */ NULL, +/* 2ace */ NULL, +/* 2acf */ NULL, +/* 2ad0 */ NULL, +/* 2ad1 */ NULL, +/* 2ad2 */ NULL, +/* 2ad3 */ NULL, +/* 2ad4 */ NULL, +/* 2ad5 */ NULL, +/* 2ad6 */ NULL, +/* 2ad7 */ NULL, +/* 2ad8 */ NULL, +/* 2ad9 */ NULL, +/* 2ada */ NULL, +/* 2adb */ NULL, +/* 2adc */ NULL, +/* 2add */ NULL, +/* 2ade */ NULL, +/* 2adf */ NULL, +/* 2ae0 */ NULL, +/* 2ae1 */ NULL, +/* 2ae2 */ NULL, +/* 2ae3 */ NULL, +/* 2ae4 */ NULL, +/* 2ae5 */ NULL, +/* 2ae6 */ NULL, +/* 2ae7 */ NULL, +/* 2ae8 */ NULL, +/* 2ae9 */ NULL, +/* 2aea */ NULL, +/* 2aeb */ NULL, +/* 2aec */ NULL, +/* 2aed */ NULL, +/* 2aee */ NULL, +/* 2aef */ NULL, +/* 2af0 */ NULL, +/* 2af1 */ NULL, +/* 2af2 */ NULL, +/* 2af3 */ NULL, +/* 2af4 */ NULL, +/* 2af5 */ NULL, +/* 2af6 */ NULL, +/* 2af7 */ NULL, +/* 2af8 */ NULL, +/* 2af9 */ NULL, +/* 2afa */ NULL, +/* 2afb */ NULL, +/* 2afc */ NULL, +/* 2afd */ NULL, +/* 2afe */ NULL, +/* 2aff */ NULL, +/* 2b00 */ NULL, +/* 2b01 */ NULL, +/* 2b02 */ NULL, +/* 2b03 */ NULL, +/* 2b04 */ NULL, +/* 2b05 */ NULL, +/* 2b06 */ NULL, +/* 2b07 */ NULL, +/* 2b08 */ NULL, +/* 2b09 */ NULL, +/* 2b0a */ NULL, +/* 2b0b */ NULL, +/* 2b0c */ NULL, +/* 2b0d */ NULL, +/* 2b0e */ NULL, +/* 2b0f */ NULL, +/* 2b10 */ NULL, +/* 2b11 */ NULL, +/* 2b12 */ NULL, +/* 2b13 */ NULL, +/* 2b14 */ NULL, +/* 2b15 */ NULL, +/* 2b16 */ NULL, +/* 2b17 */ NULL, +/* 2b18 */ NULL, +/* 2b19 */ NULL, +/* 2b1a */ NULL, +/* 2b1b */ NULL, +/* 2b1c */ NULL, +/* 2b1d */ NULL, +/* 2b1e */ NULL, +/* 2b1f */ NULL, +/* 2b20 */ NULL, +/* 2b21 */ NULL, +/* 2b22 */ NULL, +/* 2b23 */ NULL, +/* 2b24 */ NULL, +/* 2b25 */ NULL, +/* 2b26 */ NULL, +/* 2b27 */ NULL, +/* 2b28 */ NULL, +/* 2b29 */ NULL, +/* 2b2a */ NULL, +/* 2b2b */ NULL, +/* 2b2c */ NULL, +/* 2b2d */ NULL, +/* 2b2e */ NULL, +/* 2b2f */ NULL, +/* 2b30 */ NULL, +/* 2b31 */ NULL, +/* 2b32 */ NULL, +/* 2b33 */ NULL, +/* 2b34 */ NULL, +/* 2b35 */ NULL, +/* 2b36 */ NULL, +/* 2b37 */ NULL, +/* 2b38 */ NULL, +/* 2b39 */ NULL, +/* 2b3a */ NULL, +/* 2b3b */ NULL, +/* 2b3c */ NULL, +/* 2b3d */ NULL, +/* 2b3e */ NULL, +/* 2b3f */ NULL, +/* 2b40 */ NULL, +/* 2b41 */ NULL, +/* 2b42 */ NULL, +/* 2b43 */ NULL, +/* 2b44 */ NULL, +/* 2b45 */ NULL, +/* 2b46 */ NULL, +/* 2b47 */ NULL, +/* 2b48 */ NULL, +/* 2b49 */ NULL, +/* 2b4a */ NULL, +/* 2b4b */ NULL, +/* 2b4c */ NULL, +/* 2b4d */ NULL, +/* 2b4e */ NULL, +/* 2b4f */ NULL, +/* 2b50 */ NULL, +/* 2b51 */ NULL, +/* 2b52 */ NULL, +/* 2b53 */ NULL, +/* 2b54 */ NULL, +/* 2b55 */ NULL, +/* 2b56 */ NULL, +/* 2b57 */ NULL, +/* 2b58 */ NULL, +/* 2b59 */ NULL, +/* 2b5a */ NULL, +/* 2b5b */ NULL, +/* 2b5c */ NULL, +/* 2b5d */ NULL, +/* 2b5e */ NULL, +/* 2b5f */ NULL, +/* 2b60 */ NULL, +/* 2b61 */ NULL, +/* 2b62 */ NULL, +/* 2b63 */ NULL, +/* 2b64 */ NULL, +/* 2b65 */ NULL, +/* 2b66 */ NULL, +/* 2b67 */ NULL, +/* 2b68 */ NULL, +/* 2b69 */ NULL, +/* 2b6a */ NULL, +/* 2b6b */ NULL, +/* 2b6c */ NULL, +/* 2b6d */ NULL, +/* 2b6e */ NULL, +/* 2b6f */ NULL, +/* 2b70 */ NULL, +/* 2b71 */ NULL, +/* 2b72 */ NULL, +/* 2b73 */ NULL, +/* 2b74 */ NULL, +/* 2b75 */ NULL, +/* 2b76 */ NULL, +/* 2b77 */ NULL, +/* 2b78 */ NULL, +/* 2b79 */ NULL, +/* 2b7a */ NULL, +/* 2b7b */ NULL, +/* 2b7c */ NULL, +/* 2b7d */ NULL, +/* 2b7e */ NULL, +/* 2b7f */ NULL, +/* 2b80 */ NULL, +/* 2b81 */ NULL, +/* 2b82 */ NULL, +/* 2b83 */ NULL, +/* 2b84 */ NULL, +/* 2b85 */ NULL, +/* 2b86 */ NULL, +/* 2b87 */ NULL, +/* 2b88 */ NULL, +/* 2b89 */ NULL, +/* 2b8a */ NULL, +/* 2b8b */ NULL, +/* 2b8c */ NULL, +/* 2b8d */ NULL, +/* 2b8e */ NULL, +/* 2b8f */ NULL, +/* 2b90 */ NULL, +/* 2b91 */ NULL, +/* 2b92 */ NULL, +/* 2b93 */ NULL, +/* 2b94 */ NULL, +/* 2b95 */ NULL, +/* 2b96 */ NULL, +/* 2b97 */ NULL, +/* 2b98 */ NULL, +/* 2b99 */ NULL, +/* 2b9a */ NULL, +/* 2b9b */ NULL, +/* 2b9c */ NULL, +/* 2b9d */ NULL, +/* 2b9e */ NULL, +/* 2b9f */ NULL, +/* 2ba0 */ NULL, +/* 2ba1 */ NULL, +/* 2ba2 */ NULL, +/* 2ba3 */ NULL, +/* 2ba4 */ NULL, +/* 2ba5 */ NULL, +/* 2ba6 */ NULL, +/* 2ba7 */ NULL, +/* 2ba8 */ NULL, +/* 2ba9 */ NULL, +/* 2baa */ NULL, +/* 2bab */ NULL, +/* 2bac */ NULL, +/* 2bad */ NULL, +/* 2bae */ NULL, +/* 2baf */ NULL, +/* 2bb0 */ NULL, +/* 2bb1 */ NULL, +/* 2bb2 */ NULL, +/* 2bb3 */ NULL, +/* 2bb4 */ NULL, +/* 2bb5 */ NULL, +/* 2bb6 */ NULL, +/* 2bb7 */ NULL, +/* 2bb8 */ NULL, +/* 2bb9 */ NULL, +/* 2bba */ NULL, +/* 2bbb */ NULL, +/* 2bbc */ NULL, +/* 2bbd */ NULL, +/* 2bbe */ NULL, +/* 2bbf */ NULL, +/* 2bc0 */ NULL, +/* 2bc1 */ NULL, +/* 2bc2 */ NULL, +/* 2bc3 */ NULL, +/* 2bc4 */ NULL, +/* 2bc5 */ NULL, +/* 2bc6 */ NULL, +/* 2bc7 */ NULL, +/* 2bc8 */ NULL, +/* 2bc9 */ NULL, +/* 2bca */ NULL, +/* 2bcb */ NULL, +/* 2bcc */ NULL, +/* 2bcd */ NULL, +/* 2bce */ NULL, +/* 2bcf */ NULL, +/* 2bd0 */ NULL, +/* 2bd1 */ NULL, +/* 2bd2 */ NULL, +/* 2bd3 */ NULL, +/* 2bd4 */ NULL, +/* 2bd5 */ NULL, +/* 2bd6 */ NULL, +/* 2bd7 */ NULL, +/* 2bd8 */ NULL, +/* 2bd9 */ NULL, +/* 2bda */ NULL, +/* 2bdb */ NULL, +/* 2bdc */ NULL, +/* 2bdd */ NULL, +/* 2bde */ NULL, +/* 2bdf */ NULL, +/* 2be0 */ NULL, +/* 2be1 */ NULL, +/* 2be2 */ NULL, +/* 2be3 */ NULL, +/* 2be4 */ NULL, +/* 2be5 */ NULL, +/* 2be6 */ NULL, +/* 2be7 */ NULL, +/* 2be8 */ NULL, +/* 2be9 */ NULL, +/* 2bea */ NULL, +/* 2beb */ NULL, +/* 2bec */ NULL, +/* 2bed */ NULL, +/* 2bee */ NULL, +/* 2bef */ NULL, +/* 2bf0 */ NULL, +/* 2bf1 */ NULL, +/* 2bf2 */ NULL, +/* 2bf3 */ NULL, +/* 2bf4 */ NULL, +/* 2bf5 */ NULL, +/* 2bf6 */ NULL, +/* 2bf7 */ NULL, +/* 2bf8 */ NULL, +/* 2bf9 */ NULL, +/* 2bfa */ NULL, +/* 2bfb */ NULL, +/* 2bfc */ NULL, +/* 2bfd */ NULL, +/* 2bfe */ NULL, +/* 2bff */ NULL, +/* 2c00 */ NULL, +/* 2c01 */ NULL, +/* 2c02 */ NULL, +/* 2c03 */ NULL, +/* 2c04 */ NULL, +/* 2c05 */ NULL, +/* 2c06 */ NULL, +/* 2c07 */ NULL, +/* 2c08 */ NULL, +/* 2c09 */ NULL, +/* 2c0a */ NULL, +/* 2c0b */ NULL, +/* 2c0c */ NULL, +/* 2c0d */ NULL, +/* 2c0e */ NULL, +/* 2c0f */ NULL, +/* 2c10 */ NULL, +/* 2c11 */ NULL, +/* 2c12 */ NULL, +/* 2c13 */ NULL, +/* 2c14 */ NULL, +/* 2c15 */ NULL, +/* 2c16 */ NULL, +/* 2c17 */ NULL, +/* 2c18 */ NULL, +/* 2c19 */ NULL, +/* 2c1a */ NULL, +/* 2c1b */ NULL, +/* 2c1c */ NULL, +/* 2c1d */ NULL, +/* 2c1e */ NULL, +/* 2c1f */ NULL, +/* 2c20 */ NULL, +/* 2c21 */ NULL, +/* 2c22 */ NULL, +/* 2c23 */ NULL, +/* 2c24 */ NULL, +/* 2c25 */ NULL, +/* 2c26 */ NULL, +/* 2c27 */ NULL, +/* 2c28 */ NULL, +/* 2c29 */ NULL, +/* 2c2a */ NULL, +/* 2c2b */ NULL, +/* 2c2c */ NULL, +/* 2c2d */ NULL, +/* 2c2e */ NULL, +/* 2c2f */ NULL, +/* 2c30 */ NULL, +/* 2c31 */ NULL, +/* 2c32 */ NULL, +/* 2c33 */ NULL, +/* 2c34 */ NULL, +/* 2c35 */ NULL, +/* 2c36 */ NULL, +/* 2c37 */ NULL, +/* 2c38 */ NULL, +/* 2c39 */ NULL, +/* 2c3a */ NULL, +/* 2c3b */ NULL, +/* 2c3c */ NULL, +/* 2c3d */ NULL, +/* 2c3e */ NULL, +/* 2c3f */ NULL, +/* 2c40 */ NULL, +/* 2c41 */ NULL, +/* 2c42 */ NULL, +/* 2c43 */ NULL, +/* 2c44 */ NULL, +/* 2c45 */ NULL, +/* 2c46 */ NULL, +/* 2c47 */ NULL, +/* 2c48 */ NULL, +/* 2c49 */ NULL, +/* 2c4a */ NULL, +/* 2c4b */ NULL, +/* 2c4c */ NULL, +/* 2c4d */ NULL, +/* 2c4e */ NULL, +/* 2c4f */ NULL, +/* 2c50 */ NULL, +/* 2c51 */ NULL, +/* 2c52 */ NULL, +/* 2c53 */ NULL, +/* 2c54 */ NULL, +/* 2c55 */ NULL, +/* 2c56 */ NULL, +/* 2c57 */ NULL, +/* 2c58 */ NULL, +/* 2c59 */ NULL, +/* 2c5a */ NULL, +/* 2c5b */ NULL, +/* 2c5c */ NULL, +/* 2c5d */ NULL, +/* 2c5e */ NULL, +/* 2c5f */ NULL, +/* 2c60 */ NULL, +/* 2c61 */ NULL, +/* 2c62 */ NULL, +/* 2c63 */ NULL, +/* 2c64 */ NULL, +/* 2c65 */ NULL, +/* 2c66 */ NULL, +/* 2c67 */ NULL, +/* 2c68 */ NULL, +/* 2c69 */ NULL, +/* 2c6a */ NULL, +/* 2c6b */ NULL, +/* 2c6c */ NULL, +/* 2c6d */ NULL, +/* 2c6e */ NULL, +/* 2c6f */ NULL, +/* 2c70 */ NULL, +/* 2c71 */ NULL, +/* 2c72 */ NULL, +/* 2c73 */ NULL, +/* 2c74 */ NULL, +/* 2c75 */ NULL, +/* 2c76 */ NULL, +/* 2c77 */ NULL, +/* 2c78 */ NULL, +/* 2c79 */ NULL, +/* 2c7a */ NULL, +/* 2c7b */ NULL, +/* 2c7c */ NULL, +/* 2c7d */ NULL, +/* 2c7e */ NULL, +/* 2c7f */ NULL, +/* 2c80 */ NULL, +/* 2c81 */ NULL, +/* 2c82 */ NULL, +/* 2c83 */ NULL, +/* 2c84 */ NULL, +/* 2c85 */ NULL, +/* 2c86 */ NULL, +/* 2c87 */ NULL, +/* 2c88 */ NULL, +/* 2c89 */ NULL, +/* 2c8a */ NULL, +/* 2c8b */ NULL, +/* 2c8c */ NULL, +/* 2c8d */ NULL, +/* 2c8e */ NULL, +/* 2c8f */ NULL, +/* 2c90 */ NULL, +/* 2c91 */ NULL, +/* 2c92 */ NULL, +/* 2c93 */ NULL, +/* 2c94 */ NULL, +/* 2c95 */ NULL, +/* 2c96 */ NULL, +/* 2c97 */ NULL, +/* 2c98 */ NULL, +/* 2c99 */ NULL, +/* 2c9a */ NULL, +/* 2c9b */ NULL, +/* 2c9c */ NULL, +/* 2c9d */ NULL, +/* 2c9e */ NULL, +/* 2c9f */ NULL, +/* 2ca0 */ NULL, +/* 2ca1 */ NULL, +/* 2ca2 */ NULL, +/* 2ca3 */ NULL, +/* 2ca4 */ NULL, +/* 2ca5 */ NULL, +/* 2ca6 */ NULL, +/* 2ca7 */ NULL, +/* 2ca8 */ NULL, +/* 2ca9 */ NULL, +/* 2caa */ NULL, +/* 2cab */ NULL, +/* 2cac */ NULL, +/* 2cad */ NULL, +/* 2cae */ NULL, +/* 2caf */ NULL, +/* 2cb0 */ NULL, +/* 2cb1 */ NULL, +/* 2cb2 */ NULL, +/* 2cb3 */ NULL, +/* 2cb4 */ NULL, +/* 2cb5 */ NULL, +/* 2cb6 */ NULL, +/* 2cb7 */ NULL, +/* 2cb8 */ NULL, +/* 2cb9 */ NULL, +/* 2cba */ NULL, +/* 2cbb */ NULL, +/* 2cbc */ NULL, +/* 2cbd */ NULL, +/* 2cbe */ NULL, +/* 2cbf */ NULL, +/* 2cc0 */ NULL, +/* 2cc1 */ NULL, +/* 2cc2 */ NULL, +/* 2cc3 */ NULL, +/* 2cc4 */ NULL, +/* 2cc5 */ NULL, +/* 2cc6 */ NULL, +/* 2cc7 */ NULL, +/* 2cc8 */ NULL, +/* 2cc9 */ NULL, +/* 2cca */ NULL, +/* 2ccb */ NULL, +/* 2ccc */ NULL, +/* 2ccd */ NULL, +/* 2cce */ NULL, +/* 2ccf */ NULL, +/* 2cd0 */ NULL, +/* 2cd1 */ NULL, +/* 2cd2 */ NULL, +/* 2cd3 */ NULL, +/* 2cd4 */ NULL, +/* 2cd5 */ NULL, +/* 2cd6 */ NULL, +/* 2cd7 */ NULL, +/* 2cd8 */ NULL, +/* 2cd9 */ NULL, +/* 2cda */ NULL, +/* 2cdb */ NULL, +/* 2cdc */ NULL, +/* 2cdd */ NULL, +/* 2cde */ NULL, +/* 2cdf */ NULL, +/* 2ce0 */ NULL, +/* 2ce1 */ NULL, +/* 2ce2 */ NULL, +/* 2ce3 */ NULL, +/* 2ce4 */ NULL, +/* 2ce5 */ NULL, +/* 2ce6 */ NULL, +/* 2ce7 */ NULL, +/* 2ce8 */ NULL, +/* 2ce9 */ NULL, +/* 2cea */ NULL, +/* 2ceb */ NULL, +/* 2cec */ NULL, +/* 2ced */ NULL, +/* 2cee */ NULL, +/* 2cef */ NULL, +/* 2cf0 */ NULL, +/* 2cf1 */ NULL, +/* 2cf2 */ NULL, +/* 2cf3 */ NULL, +/* 2cf4 */ NULL, +/* 2cf5 */ NULL, +/* 2cf6 */ NULL, +/* 2cf7 */ NULL, +/* 2cf8 */ NULL, +/* 2cf9 */ NULL, +/* 2cfa */ NULL, +/* 2cfb */ NULL, +/* 2cfc */ NULL, +/* 2cfd */ NULL, +/* 2cfe */ NULL, +/* 2cff */ NULL, +/* 2d00 */ NULL, +/* 2d01 */ NULL, +/* 2d02 */ NULL, +/* 2d03 */ NULL, +/* 2d04 */ NULL, +/* 2d05 */ NULL, +/* 2d06 */ NULL, +/* 2d07 */ NULL, +/* 2d08 */ NULL, +/* 2d09 */ NULL, +/* 2d0a */ NULL, +/* 2d0b */ NULL, +/* 2d0c */ NULL, +/* 2d0d */ NULL, +/* 2d0e */ NULL, +/* 2d0f */ NULL, +/* 2d10 */ NULL, +/* 2d11 */ NULL, +/* 2d12 */ NULL, +/* 2d13 */ NULL, +/* 2d14 */ NULL, +/* 2d15 */ NULL, +/* 2d16 */ NULL, +/* 2d17 */ NULL, +/* 2d18 */ NULL, +/* 2d19 */ NULL, +/* 2d1a */ NULL, +/* 2d1b */ NULL, +/* 2d1c */ NULL, +/* 2d1d */ NULL, +/* 2d1e */ NULL, +/* 2d1f */ NULL, +/* 2d20 */ NULL, +/* 2d21 */ NULL, +/* 2d22 */ NULL, +/* 2d23 */ NULL, +/* 2d24 */ NULL, +/* 2d25 */ NULL, +/* 2d26 */ NULL, +/* 2d27 */ NULL, +/* 2d28 */ NULL, +/* 2d29 */ NULL, +/* 2d2a */ NULL, +/* 2d2b */ NULL, +/* 2d2c */ NULL, +/* 2d2d */ NULL, +/* 2d2e */ NULL, +/* 2d2f */ NULL, +/* 2d30 */ NULL, +/* 2d31 */ NULL, +/* 2d32 */ NULL, +/* 2d33 */ NULL, +/* 2d34 */ NULL, +/* 2d35 */ NULL, +/* 2d36 */ NULL, +/* 2d37 */ NULL, +/* 2d38 */ NULL, +/* 2d39 */ NULL, +/* 2d3a */ NULL, +/* 2d3b */ NULL, +/* 2d3c */ NULL, +/* 2d3d */ NULL, +/* 2d3e */ NULL, +/* 2d3f */ NULL, +/* 2d40 */ NULL, +/* 2d41 */ NULL, +/* 2d42 */ NULL, +/* 2d43 */ NULL, +/* 2d44 */ NULL, +/* 2d45 */ NULL, +/* 2d46 */ NULL, +/* 2d47 */ NULL, +/* 2d48 */ NULL, +/* 2d49 */ NULL, +/* 2d4a */ NULL, +/* 2d4b */ NULL, +/* 2d4c */ NULL, +/* 2d4d */ NULL, +/* 2d4e */ NULL, +/* 2d4f */ NULL, +/* 2d50 */ NULL, +/* 2d51 */ NULL, +/* 2d52 */ NULL, +/* 2d53 */ NULL, +/* 2d54 */ NULL, +/* 2d55 */ NULL, +/* 2d56 */ NULL, +/* 2d57 */ NULL, +/* 2d58 */ NULL, +/* 2d59 */ NULL, +/* 2d5a */ NULL, +/* 2d5b */ NULL, +/* 2d5c */ NULL, +/* 2d5d */ NULL, +/* 2d5e */ NULL, +/* 2d5f */ NULL, +/* 2d60 */ NULL, +/* 2d61 */ NULL, +/* 2d62 */ NULL, +/* 2d63 */ NULL, +/* 2d64 */ NULL, +/* 2d65 */ NULL, +/* 2d66 */ NULL, +/* 2d67 */ NULL, +/* 2d68 */ NULL, +/* 2d69 */ NULL, +/* 2d6a */ NULL, +/* 2d6b */ NULL, +/* 2d6c */ NULL, +/* 2d6d */ NULL, +/* 2d6e */ NULL, +/* 2d6f */ NULL, +/* 2d70 */ NULL, +/* 2d71 */ NULL, +/* 2d72 */ NULL, +/* 2d73 */ NULL, +/* 2d74 */ NULL, +/* 2d75 */ NULL, +/* 2d76 */ NULL, +/* 2d77 */ NULL, +/* 2d78 */ NULL, +/* 2d79 */ NULL, +/* 2d7a */ NULL, +/* 2d7b */ NULL, +/* 2d7c */ NULL, +/* 2d7d */ NULL, +/* 2d7e */ NULL, +/* 2d7f */ NULL, +/* 2d80 */ NULL, +/* 2d81 */ NULL, +/* 2d82 */ NULL, +/* 2d83 */ NULL, +/* 2d84 */ NULL, +/* 2d85 */ NULL, +/* 2d86 */ NULL, +/* 2d87 */ NULL, +/* 2d88 */ NULL, +/* 2d89 */ NULL, +/* 2d8a */ NULL, +/* 2d8b */ NULL, +/* 2d8c */ NULL, +/* 2d8d */ NULL, +/* 2d8e */ NULL, +/* 2d8f */ NULL, +/* 2d90 */ NULL, +/* 2d91 */ NULL, +/* 2d92 */ NULL, +/* 2d93 */ NULL, +/* 2d94 */ NULL, +/* 2d95 */ NULL, +/* 2d96 */ NULL, +/* 2d97 */ NULL, +/* 2d98 */ NULL, +/* 2d99 */ NULL, +/* 2d9a */ NULL, +/* 2d9b */ NULL, +/* 2d9c */ NULL, +/* 2d9d */ NULL, +/* 2d9e */ NULL, +/* 2d9f */ NULL, +/* 2da0 */ NULL, +/* 2da1 */ NULL, +/* 2da2 */ NULL, +/* 2da3 */ NULL, +/* 2da4 */ NULL, +/* 2da5 */ NULL, +/* 2da6 */ NULL, +/* 2da7 */ NULL, +/* 2da8 */ NULL, +/* 2da9 */ NULL, +/* 2daa */ NULL, +/* 2dab */ NULL, +/* 2dac */ NULL, +/* 2dad */ NULL, +/* 2dae */ NULL, +/* 2daf */ NULL, +/* 2db0 */ NULL, +/* 2db1 */ NULL, +/* 2db2 */ NULL, +/* 2db3 */ NULL, +/* 2db4 */ NULL, +/* 2db5 */ NULL, +/* 2db6 */ NULL, +/* 2db7 */ NULL, +/* 2db8 */ NULL, +/* 2db9 */ NULL, +/* 2dba */ NULL, +/* 2dbb */ NULL, +/* 2dbc */ NULL, +/* 2dbd */ NULL, +/* 2dbe */ NULL, +/* 2dbf */ NULL, +/* 2dc0 */ NULL, +/* 2dc1 */ NULL, +/* 2dc2 */ NULL, +/* 2dc3 */ NULL, +/* 2dc4 */ NULL, +/* 2dc5 */ NULL, +/* 2dc6 */ NULL, +/* 2dc7 */ NULL, +/* 2dc8 */ NULL, +/* 2dc9 */ NULL, +/* 2dca */ NULL, +/* 2dcb */ NULL, +/* 2dcc */ NULL, +/* 2dcd */ NULL, +/* 2dce */ NULL, +/* 2dcf */ NULL, +/* 2dd0 */ NULL, +/* 2dd1 */ NULL, +/* 2dd2 */ NULL, +/* 2dd3 */ NULL, +/* 2dd4 */ NULL, +/* 2dd5 */ NULL, +/* 2dd6 */ NULL, +/* 2dd7 */ NULL, +/* 2dd8 */ NULL, +/* 2dd9 */ NULL, +/* 2dda */ NULL, +/* 2ddb */ NULL, +/* 2ddc */ NULL, +/* 2ddd */ NULL, +/* 2dde */ NULL, +/* 2ddf */ NULL, +/* 2de0 */ NULL, +/* 2de1 */ NULL, +/* 2de2 */ NULL, +/* 2de3 */ NULL, +/* 2de4 */ NULL, +/* 2de5 */ NULL, +/* 2de6 */ NULL, +/* 2de7 */ NULL, +/* 2de8 */ NULL, +/* 2de9 */ NULL, +/* 2dea */ NULL, +/* 2deb */ NULL, +/* 2dec */ NULL, +/* 2ded */ NULL, +/* 2dee */ NULL, +/* 2def */ NULL, +/* 2df0 */ NULL, +/* 2df1 */ NULL, +/* 2df2 */ NULL, +/* 2df3 */ NULL, +/* 2df4 */ NULL, +/* 2df5 */ NULL, +/* 2df6 */ NULL, +/* 2df7 */ NULL, +/* 2df8 */ NULL, +/* 2df9 */ NULL, +/* 2dfa */ NULL, +/* 2dfb */ NULL, +/* 2dfc */ NULL, +/* 2dfd */ NULL, +/* 2dfe */ NULL, +/* 2dff */ NULL, +/* 2e00 */ NULL, +/* 2e01 */ NULL, +/* 2e02 */ NULL, +/* 2e03 */ NULL, +/* 2e04 */ NULL, +/* 2e05 */ NULL, +/* 2e06 */ NULL, +/* 2e07 */ NULL, +/* 2e08 */ NULL, +/* 2e09 */ NULL, +/* 2e0a */ NULL, +/* 2e0b */ NULL, +/* 2e0c */ NULL, +/* 2e0d */ NULL, +/* 2e0e */ NULL, +/* 2e0f */ NULL, +/* 2e10 */ NULL, +/* 2e11 */ NULL, +/* 2e12 */ NULL, +/* 2e13 */ NULL, +/* 2e14 */ NULL, +/* 2e15 */ NULL, +/* 2e16 */ NULL, +/* 2e17 */ NULL, +/* 2e18 */ NULL, +/* 2e19 */ NULL, +/* 2e1a */ NULL, +/* 2e1b */ NULL, +/* 2e1c */ NULL, +/* 2e1d */ NULL, +/* 2e1e */ NULL, +/* 2e1f */ NULL, +/* 2e20 */ NULL, +/* 2e21 */ NULL, +/* 2e22 */ NULL, +/* 2e23 */ NULL, +/* 2e24 */ NULL, +/* 2e25 */ NULL, +/* 2e26 */ NULL, +/* 2e27 */ NULL, +/* 2e28 */ NULL, +/* 2e29 */ NULL, +/* 2e2a */ NULL, +/* 2e2b */ NULL, +/* 2e2c */ NULL, +/* 2e2d */ NULL, +/* 2e2e */ NULL, +/* 2e2f */ NULL, +/* 2e30 */ NULL, +/* 2e31 */ NULL, +/* 2e32 */ NULL, +/* 2e33 */ NULL, +/* 2e34 */ NULL, +/* 2e35 */ NULL, +/* 2e36 */ NULL, +/* 2e37 */ NULL, +/* 2e38 */ NULL, +/* 2e39 */ NULL, +/* 2e3a */ NULL, +/* 2e3b */ NULL, +/* 2e3c */ NULL, +/* 2e3d */ NULL, +/* 2e3e */ NULL, +/* 2e3f */ NULL, +/* 2e40 */ NULL, +/* 2e41 */ NULL, +/* 2e42 */ NULL, +/* 2e43 */ NULL, +/* 2e44 */ NULL, +/* 2e45 */ NULL, +/* 2e46 */ NULL, +/* 2e47 */ NULL, +/* 2e48 */ NULL, +/* 2e49 */ NULL, +/* 2e4a */ NULL, +/* 2e4b */ NULL, +/* 2e4c */ NULL, +/* 2e4d */ NULL, +/* 2e4e */ NULL, +/* 2e4f */ NULL, +/* 2e50 */ NULL, +/* 2e51 */ NULL, +/* 2e52 */ NULL, +/* 2e53 */ NULL, +/* 2e54 */ NULL, +/* 2e55 */ NULL, +/* 2e56 */ NULL, +/* 2e57 */ NULL, +/* 2e58 */ NULL, +/* 2e59 */ NULL, +/* 2e5a */ NULL, +/* 2e5b */ NULL, +/* 2e5c */ NULL, +/* 2e5d */ NULL, +/* 2e5e */ NULL, +/* 2e5f */ NULL, +/* 2e60 */ NULL, +/* 2e61 */ NULL, +/* 2e62 */ NULL, +/* 2e63 */ NULL, +/* 2e64 */ NULL, +/* 2e65 */ NULL, +/* 2e66 */ NULL, +/* 2e67 */ NULL, +/* 2e68 */ NULL, +/* 2e69 */ NULL, +/* 2e6a */ NULL, +/* 2e6b */ NULL, +/* 2e6c */ NULL, +/* 2e6d */ NULL, +/* 2e6e */ NULL, +/* 2e6f */ NULL, +/* 2e70 */ NULL, +/* 2e71 */ NULL, +/* 2e72 */ NULL, +/* 2e73 */ NULL, +/* 2e74 */ NULL, +/* 2e75 */ NULL, +/* 2e76 */ NULL, +/* 2e77 */ NULL, +/* 2e78 */ NULL, +/* 2e79 */ NULL, +/* 2e7a */ NULL, +/* 2e7b */ NULL, +/* 2e7c */ NULL, +/* 2e7d */ NULL, +/* 2e7e */ NULL, +/* 2e7f */ NULL, +/* 2e80 */ NULL, +/* 2e81 */ NULL, +/* 2e82 */ NULL, +/* 2e83 */ NULL, +/* 2e84 */ NULL, +/* 2e85 */ NULL, +/* 2e86 */ NULL, +/* 2e87 */ NULL, +/* 2e88 */ NULL, +/* 2e89 */ NULL, +/* 2e8a */ NULL, +/* 2e8b */ NULL, +/* 2e8c */ NULL, +/* 2e8d */ NULL, +/* 2e8e */ NULL, +/* 2e8f */ NULL, +/* 2e90 */ NULL, +/* 2e91 */ NULL, +/* 2e92 */ NULL, +/* 2e93 */ NULL, +/* 2e94 */ NULL, +/* 2e95 */ NULL, +/* 2e96 */ NULL, +/* 2e97 */ NULL, +/* 2e98 */ NULL, +/* 2e99 */ NULL, +/* 2e9a */ NULL, +/* 2e9b */ NULL, +/* 2e9c */ NULL, +/* 2e9d */ NULL, +/* 2e9e */ NULL, +/* 2e9f */ NULL, +/* 2ea0 */ NULL, +/* 2ea1 */ NULL, +/* 2ea2 */ NULL, +/* 2ea3 */ NULL, +/* 2ea4 */ NULL, +/* 2ea5 */ NULL, +/* 2ea6 */ NULL, +/* 2ea7 */ NULL, +/* 2ea8 */ NULL, +/* 2ea9 */ NULL, +/* 2eaa */ NULL, +/* 2eab */ NULL, +/* 2eac */ NULL, +/* 2ead */ NULL, +/* 2eae */ NULL, +/* 2eaf */ NULL, +/* 2eb0 */ NULL, +/* 2eb1 */ NULL, +/* 2eb2 */ NULL, +/* 2eb3 */ NULL, +/* 2eb4 */ NULL, +/* 2eb5 */ NULL, +/* 2eb6 */ NULL, +/* 2eb7 */ NULL, +/* 2eb8 */ NULL, +/* 2eb9 */ NULL, +/* 2eba */ NULL, +/* 2ebb */ NULL, +/* 2ebc */ NULL, +/* 2ebd */ NULL, +/* 2ebe */ NULL, +/* 2ebf */ NULL, +/* 2ec0 */ NULL, +/* 2ec1 */ NULL, +/* 2ec2 */ NULL, +/* 2ec3 */ NULL, +/* 2ec4 */ NULL, +/* 2ec5 */ NULL, +/* 2ec6 */ NULL, +/* 2ec7 */ NULL, +/* 2ec8 */ NULL, +/* 2ec9 */ NULL, +/* 2eca */ NULL, +/* 2ecb */ NULL, +/* 2ecc */ NULL, +/* 2ecd */ NULL, +/* 2ece */ NULL, +/* 2ecf */ NULL, +/* 2ed0 */ NULL, +/* 2ed1 */ NULL, +/* 2ed2 */ NULL, +/* 2ed3 */ NULL, +/* 2ed4 */ NULL, +/* 2ed5 */ NULL, +/* 2ed6 */ NULL, +/* 2ed7 */ NULL, +/* 2ed8 */ NULL, +/* 2ed9 */ NULL, +/* 2eda */ NULL, +/* 2edb */ NULL, +/* 2edc */ NULL, +/* 2edd */ NULL, +/* 2ede */ NULL, +/* 2edf */ NULL, +/* 2ee0 */ NULL, +/* 2ee1 */ NULL, +/* 2ee2 */ NULL, +/* 2ee3 */ NULL, +/* 2ee4 */ NULL, +/* 2ee5 */ NULL, +/* 2ee6 */ NULL, +/* 2ee7 */ NULL, +/* 2ee8 */ NULL, +/* 2ee9 */ NULL, +/* 2eea */ NULL, +/* 2eeb */ NULL, +/* 2eec */ NULL, +/* 2eed */ NULL, +/* 2eee */ NULL, +/* 2eef */ NULL, +/* 2ef0 */ NULL, +/* 2ef1 */ NULL, +/* 2ef2 */ NULL, +/* 2ef3 */ NULL, +/* 2ef4 */ NULL, +/* 2ef5 */ NULL, +/* 2ef6 */ NULL, +/* 2ef7 */ NULL, +/* 2ef8 */ NULL, +/* 2ef9 */ NULL, +/* 2efa */ NULL, +/* 2efb */ NULL, +/* 2efc */ NULL, +/* 2efd */ NULL, +/* 2efe */ NULL, +/* 2eff */ NULL, +/* 2f00 */ NULL, +/* 2f01 */ NULL, +/* 2f02 */ NULL, +/* 2f03 */ NULL, +/* 2f04 */ NULL, +/* 2f05 */ NULL, +/* 2f06 */ NULL, +/* 2f07 */ NULL, +/* 2f08 */ NULL, +/* 2f09 */ NULL, +/* 2f0a */ NULL, +/* 2f0b */ NULL, +/* 2f0c */ NULL, +/* 2f0d */ NULL, +/* 2f0e */ NULL, +/* 2f0f */ NULL, +/* 2f10 */ NULL, +/* 2f11 */ NULL, +/* 2f12 */ NULL, +/* 2f13 */ NULL, +/* 2f14 */ NULL, +/* 2f15 */ NULL, +/* 2f16 */ NULL, +/* 2f17 */ NULL, +/* 2f18 */ NULL, +/* 2f19 */ NULL, +/* 2f1a */ NULL, +/* 2f1b */ NULL, +/* 2f1c */ NULL, +/* 2f1d */ NULL, +/* 2f1e */ NULL, +/* 2f1f */ NULL, +/* 2f20 */ NULL, +/* 2f21 */ NULL, +/* 2f22 */ NULL, +/* 2f23 */ NULL, +/* 2f24 */ NULL, +/* 2f25 */ NULL, +/* 2f26 */ NULL, +/* 2f27 */ NULL, +/* 2f28 */ NULL, +/* 2f29 */ NULL, +/* 2f2a */ NULL, +/* 2f2b */ NULL, +/* 2f2c */ NULL, +/* 2f2d */ NULL, +/* 2f2e */ NULL, +/* 2f2f */ NULL, +/* 2f30 */ NULL, +/* 2f31 */ NULL, +/* 2f32 */ NULL, +/* 2f33 */ NULL, +/* 2f34 */ NULL, +/* 2f35 */ NULL, +/* 2f36 */ NULL, +/* 2f37 */ NULL, +/* 2f38 */ NULL, +/* 2f39 */ NULL, +/* 2f3a */ NULL, +/* 2f3b */ NULL, +/* 2f3c */ NULL, +/* 2f3d */ NULL, +/* 2f3e */ NULL, +/* 2f3f */ NULL, +/* 2f40 */ NULL, +/* 2f41 */ NULL, +/* 2f42 */ NULL, +/* 2f43 */ NULL, +/* 2f44 */ NULL, +/* 2f45 */ NULL, +/* 2f46 */ NULL, +/* 2f47 */ NULL, +/* 2f48 */ NULL, +/* 2f49 */ NULL, +/* 2f4a */ NULL, +/* 2f4b */ NULL, +/* 2f4c */ NULL, +/* 2f4d */ NULL, +/* 2f4e */ NULL, +/* 2f4f */ NULL, +/* 2f50 */ NULL, +/* 2f51 */ NULL, +/* 2f52 */ NULL, +/* 2f53 */ NULL, +/* 2f54 */ NULL, +/* 2f55 */ NULL, +/* 2f56 */ NULL, +/* 2f57 */ NULL, +/* 2f58 */ NULL, +/* 2f59 */ NULL, +/* 2f5a */ NULL, +/* 2f5b */ NULL, +/* 2f5c */ NULL, +/* 2f5d */ NULL, +/* 2f5e */ NULL, +/* 2f5f */ NULL, +/* 2f60 */ NULL, +/* 2f61 */ NULL, +/* 2f62 */ NULL, +/* 2f63 */ NULL, +/* 2f64 */ NULL, +/* 2f65 */ NULL, +/* 2f66 */ NULL, +/* 2f67 */ NULL, +/* 2f68 */ NULL, +/* 2f69 */ NULL, +/* 2f6a */ NULL, +/* 2f6b */ NULL, +/* 2f6c */ NULL, +/* 2f6d */ NULL, +/* 2f6e */ NULL, +/* 2f6f */ NULL, +/* 2f70 */ NULL, +/* 2f71 */ NULL, +/* 2f72 */ NULL, +/* 2f73 */ NULL, +/* 2f74 */ NULL, +/* 2f75 */ NULL, +/* 2f76 */ NULL, +/* 2f77 */ NULL, +/* 2f78 */ NULL, +/* 2f79 */ NULL, +/* 2f7a */ NULL, +/* 2f7b */ NULL, +/* 2f7c */ NULL, +/* 2f7d */ NULL, +/* 2f7e */ NULL, +/* 2f7f */ NULL, +/* 2f80 */ NULL, +/* 2f81 */ NULL, +/* 2f82 */ NULL, +/* 2f83 */ NULL, +/* 2f84 */ NULL, +/* 2f85 */ NULL, +/* 2f86 */ NULL, +/* 2f87 */ NULL, +/* 2f88 */ NULL, +/* 2f89 */ NULL, +/* 2f8a */ NULL, +/* 2f8b */ NULL, +/* 2f8c */ NULL, +/* 2f8d */ NULL, +/* 2f8e */ NULL, +/* 2f8f */ NULL, +/* 2f90 */ NULL, +/* 2f91 */ NULL, +/* 2f92 */ NULL, +/* 2f93 */ NULL, +/* 2f94 */ NULL, +/* 2f95 */ NULL, +/* 2f96 */ NULL, +/* 2f97 */ NULL, +/* 2f98 */ NULL, +/* 2f99 */ NULL, +/* 2f9a */ NULL, +/* 2f9b */ NULL, +/* 2f9c */ NULL, +/* 2f9d */ NULL, +/* 2f9e */ NULL, +/* 2f9f */ NULL, +/* 2fa0 */ NULL, +/* 2fa1 */ NULL, +/* 2fa2 */ NULL, +/* 2fa3 */ NULL, +/* 2fa4 */ NULL, +/* 2fa5 */ NULL, +/* 2fa6 */ NULL, +/* 2fa7 */ NULL, +/* 2fa8 */ NULL, +/* 2fa9 */ NULL, +/* 2faa */ NULL, +/* 2fab */ NULL, +/* 2fac */ NULL, +/* 2fad */ NULL, +/* 2fae */ NULL, +/* 2faf */ NULL, +/* 2fb0 */ NULL, +/* 2fb1 */ NULL, +/* 2fb2 */ NULL, +/* 2fb3 */ NULL, +/* 2fb4 */ NULL, +/* 2fb5 */ NULL, +/* 2fb6 */ NULL, +/* 2fb7 */ NULL, +/* 2fb8 */ NULL, +/* 2fb9 */ NULL, +/* 2fba */ NULL, +/* 2fbb */ NULL, +/* 2fbc */ NULL, +/* 2fbd */ NULL, +/* 2fbe */ NULL, +/* 2fbf */ NULL, +/* 2fc0 */ NULL, +/* 2fc1 */ NULL, +/* 2fc2 */ NULL, +/* 2fc3 */ NULL, +/* 2fc4 */ NULL, +/* 2fc5 */ NULL, +/* 2fc6 */ NULL, +/* 2fc7 */ NULL, +/* 2fc8 */ NULL, +/* 2fc9 */ NULL, +/* 2fca */ NULL, +/* 2fcb */ NULL, +/* 2fcc */ NULL, +/* 2fcd */ NULL, +/* 2fce */ NULL, +/* 2fcf */ NULL, +/* 2fd0 */ NULL, +/* 2fd1 */ NULL, +/* 2fd2 */ NULL, +/* 2fd3 */ NULL, +/* 2fd4 */ NULL, +/* 2fd5 */ NULL, +/* 2fd6 */ NULL, +/* 2fd7 */ NULL, +/* 2fd8 */ NULL, +/* 2fd9 */ NULL, +/* 2fda */ NULL, +/* 2fdb */ NULL, +/* 2fdc */ NULL, +/* 2fdd */ NULL, +/* 2fde */ NULL, +/* 2fdf */ NULL, +/* 2fe0 */ NULL, +/* 2fe1 */ NULL, +/* 2fe2 */ NULL, +/* 2fe3 */ NULL, +/* 2fe4 */ NULL, +/* 2fe5 */ NULL, +/* 2fe6 */ NULL, +/* 2fe7 */ NULL, +/* 2fe8 */ NULL, +/* 2fe9 */ NULL, +/* 2fea */ NULL, +/* 2feb */ NULL, +/* 2fec */ NULL, +/* 2fed */ NULL, +/* 2fee */ NULL, +/* 2fef */ NULL, +/* 2ff0 */ NULL, +/* 2ff1 */ NULL, +/* 2ff2 */ NULL, +/* 2ff3 */ NULL, +/* 2ff4 */ NULL, +/* 2ff5 */ NULL, +/* 2ff6 */ NULL, +/* 2ff7 */ NULL, +/* 2ff8 */ NULL, +/* 2ff9 */ NULL, +/* 2ffa */ NULL, +/* 2ffb */ NULL, +/* 2ffc */ NULL, +/* 2ffd */ NULL, +/* 2ffe */ NULL, +/* 2fff */ NULL, +/* 3000 */ NULL, +/* 3001 */ NULL, +/* 3002 */ NULL, +/* 3003 */ NULL, +/* 3004 */ NULL, +/* 3005 */ NULL, +/* 3006 */ NULL, +/* 3007 */ NULL, +/* 3008 */ NULL, +/* 3009 */ NULL, +/* 300a */ NULL, +/* 300b */ NULL, +/* 300c */ NULL, +/* 300d */ NULL, +/* 300e */ NULL, +/* 300f */ NULL, +/* 3010 */ NULL, +/* 3011 */ NULL, +/* 3012 */ NULL, +/* 3013 */ NULL, +/* 3014 */ NULL, +/* 3015 */ NULL, +/* 3016 */ NULL, +/* 3017 */ NULL, +/* 3018 */ NULL, +/* 3019 */ NULL, +/* 301a */ NULL, +/* 301b */ NULL, +/* 301c */ NULL, +/* 301d */ NULL, +/* 301e */ NULL, +/* 301f */ NULL, +/* 3020 */ NULL, +/* 3021 */ NULL, +/* 3022 */ NULL, +/* 3023 */ NULL, +/* 3024 */ NULL, +/* 3025 */ NULL, +/* 3026 */ NULL, +/* 3027 */ NULL, +/* 3028 */ NULL, +/* 3029 */ NULL, +/* 302a */ NULL, +/* 302b */ NULL, +/* 302c */ NULL, +/* 302d */ NULL, +/* 302e */ NULL, +/* 302f */ NULL, +/* 3030 */ NULL, +/* 3031 */ NULL, +/* 3032 */ NULL, +/* 3033 */ NULL, +/* 3034 */ NULL, +/* 3035 */ NULL, +/* 3036 */ NULL, +/* 3037 */ NULL, +/* 3038 */ NULL, +/* 3039 */ NULL, +/* 303a */ NULL, +/* 303b */ NULL, +/* 303c */ NULL, +/* 303d */ NULL, +/* 303e */ NULL, +/* 303f */ NULL, +/* 3040 */ NULL, +/* 3041 */ NULL, +/* 3042 */ NULL, +/* 3043 */ NULL, +/* 3044 */ NULL, +/* 3045 */ NULL, +/* 3046 */ NULL, +/* 3047 */ NULL, +/* 3048 */ NULL, +/* 3049 */ NULL, +/* 304a */ NULL, +/* 304b */ NULL, +/* 304c */ NULL, +/* 304d */ NULL, +/* 304e */ NULL, +/* 304f */ NULL, +/* 3050 */ NULL, +/* 3051 */ NULL, +/* 3052 */ NULL, +/* 3053 */ NULL, +/* 3054 */ NULL, +/* 3055 */ NULL, +/* 3056 */ NULL, +/* 3057 */ NULL, +/* 3058 */ NULL, +/* 3059 */ NULL, +/* 305a */ NULL, +/* 305b */ NULL, +/* 305c */ NULL, +/* 305d */ NULL, +/* 305e */ NULL, +/* 305f */ NULL, +/* 3060 */ NULL, +/* 3061 */ NULL, +/* 3062 */ NULL, +/* 3063 */ NULL, +/* 3064 */ NULL, +/* 3065 */ NULL, +/* 3066 */ NULL, +/* 3067 */ NULL, +/* 3068 */ NULL, +/* 3069 */ NULL, +/* 306a */ NULL, +/* 306b */ NULL, +/* 306c */ NULL, +/* 306d */ NULL, +/* 306e */ NULL, +/* 306f */ NULL, +/* 3070 */ NULL, +/* 3071 */ NULL, +/* 3072 */ NULL, +/* 3073 */ NULL, +/* 3074 */ NULL, +/* 3075 */ NULL, +/* 3076 */ NULL, +/* 3077 */ NULL, +/* 3078 */ NULL, +/* 3079 */ NULL, +/* 307a */ NULL, +/* 307b */ NULL, +/* 307c */ NULL, +/* 307d */ NULL, +/* 307e */ NULL, +/* 307f */ NULL, +/* 3080 */ NULL, +/* 3081 */ NULL, +/* 3082 */ NULL, +/* 3083 */ NULL, +/* 3084 */ NULL, +/* 3085 */ NULL, +/* 3086 */ NULL, +/* 3087 */ NULL, +/* 3088 */ NULL, +/* 3089 */ NULL, +/* 308a */ NULL, +/* 308b */ NULL, +/* 308c */ NULL, +/* 308d */ NULL, +/* 308e */ NULL, +/* 308f */ NULL, +/* 3090 */ NULL, +/* 3091 */ NULL, +/* 3092 */ NULL, +/* 3093 */ NULL, +/* 3094 */ NULL, +/* 3095 */ NULL, +/* 3096 */ NULL, +/* 3097 */ NULL, +/* 3098 */ NULL, +/* 3099 */ NULL, +/* 309a */ NULL, +/* 309b */ NULL, +/* 309c */ NULL, +/* 309d */ NULL, +/* 309e */ NULL, +/* 309f */ NULL, +/* 30a0 */ NULL, +/* 30a1 */ NULL, +/* 30a2 */ NULL, +/* 30a3 */ NULL, +/* 30a4 */ NULL, +/* 30a5 */ NULL, +/* 30a6 */ NULL, +/* 30a7 */ NULL, +/* 30a8 */ NULL, +/* 30a9 */ NULL, +/* 30aa */ NULL, +/* 30ab */ NULL, +/* 30ac */ NULL, +/* 30ad */ NULL, +/* 30ae */ NULL, +/* 30af */ NULL, +/* 30b0 */ NULL, +/* 30b1 */ NULL, +/* 30b2 */ NULL, +/* 30b3 */ NULL, +/* 30b4 */ NULL, +/* 30b5 */ NULL, +/* 30b6 */ NULL, +/* 30b7 */ NULL, +/* 30b8 */ NULL, +/* 30b9 */ NULL, +/* 30ba */ NULL, +/* 30bb */ NULL, +/* 30bc */ NULL, +/* 30bd */ NULL, +/* 30be */ NULL, +/* 30bf */ NULL, +/* 30c0 */ NULL, +/* 30c1 */ NULL, +/* 30c2 */ NULL, +/* 30c3 */ NULL, +/* 30c4 */ NULL, +/* 30c5 */ NULL, +/* 30c6 */ NULL, +/* 30c7 */ NULL, +/* 30c8 */ NULL, +/* 30c9 */ NULL, +/* 30ca */ NULL, +/* 30cb */ NULL, +/* 30cc */ NULL, +/* 30cd */ NULL, +/* 30ce */ NULL, +/* 30cf */ NULL, +/* 30d0 */ NULL, +/* 30d1 */ NULL, +/* 30d2 */ NULL, +/* 30d3 */ NULL, +/* 30d4 */ NULL, +/* 30d5 */ NULL, +/* 30d6 */ NULL, +/* 30d7 */ NULL, +/* 30d8 */ NULL, +/* 30d9 */ NULL, +/* 30da */ NULL, +/* 30db */ NULL, +/* 30dc */ NULL, +/* 30dd */ NULL, +/* 30de */ NULL, +/* 30df */ NULL, +/* 30e0 */ NULL, +/* 30e1 */ NULL, +/* 30e2 */ NULL, +/* 30e3 */ NULL, +/* 30e4 */ NULL, +/* 30e5 */ NULL, +/* 30e6 */ NULL, +/* 30e7 */ NULL, +/* 30e8 */ NULL, +/* 30e9 */ NULL, +/* 30ea */ NULL, +/* 30eb */ NULL, +/* 30ec */ NULL, +/* 30ed */ NULL, +/* 30ee */ NULL, +/* 30ef */ NULL, +/* 30f0 */ NULL, +/* 30f1 */ NULL, +/* 30f2 */ NULL, +/* 30f3 */ NULL, +/* 30f4 */ NULL, +/* 30f5 */ NULL, +/* 30f6 */ NULL, +/* 30f7 */ NULL, +/* 30f8 */ NULL, +/* 30f9 */ NULL, +/* 30fa */ NULL, +/* 30fb */ NULL, +/* 30fc */ NULL, +/* 30fd */ NULL, +/* 30fe */ NULL, +/* 30ff */ NULL, +/* 3100 */ NULL, +/* 3101 */ NULL, +/* 3102 */ NULL, +/* 3103 */ NULL, +/* 3104 */ NULL, +/* 3105 */ NULL, +/* 3106 */ NULL, +/* 3107 */ NULL, +/* 3108 */ NULL, +/* 3109 */ NULL, +/* 310a */ NULL, +/* 310b */ NULL, +/* 310c */ NULL, +/* 310d */ NULL, +/* 310e */ NULL, +/* 310f */ NULL, +/* 3110 */ NULL, +/* 3111 */ NULL, +/* 3112 */ NULL, +/* 3113 */ NULL, +/* 3114 */ NULL, +/* 3115 */ NULL, +/* 3116 */ NULL, +/* 3117 */ NULL, +/* 3118 */ NULL, +/* 3119 */ NULL, +/* 311a */ NULL, +/* 311b */ NULL, +/* 311c */ NULL, +/* 311d */ NULL, +/* 311e */ NULL, +/* 311f */ NULL, +/* 3120 */ NULL, +/* 3121 */ NULL, +/* 3122 */ NULL, +/* 3123 */ NULL, +/* 3124 */ NULL, +/* 3125 */ NULL, +/* 3126 */ NULL, +/* 3127 */ NULL, +/* 3128 */ NULL, +/* 3129 */ NULL, +/* 312a */ NULL, +/* 312b */ NULL, +/* 312c */ NULL, +/* 312d */ NULL, +/* 312e */ NULL, +/* 312f */ NULL, +/* 3130 */ NULL, +/* 3131 */ NULL, +/* 3132 */ NULL, +/* 3133 */ NULL, +/* 3134 */ NULL, +/* 3135 */ NULL, +/* 3136 */ NULL, +/* 3137 */ NULL, +/* 3138 */ NULL, +/* 3139 */ NULL, +/* 313a */ NULL, +/* 313b */ NULL, +/* 313c */ NULL, +/* 313d */ NULL, +/* 313e */ NULL, +/* 313f */ NULL, +/* 3140 */ NULL, +/* 3141 */ NULL, +/* 3142 */ NULL, +/* 3143 */ NULL, +/* 3144 */ NULL, +/* 3145 */ NULL, +/* 3146 */ NULL, +/* 3147 */ NULL, +/* 3148 */ NULL, +/* 3149 */ NULL, +/* 314a */ NULL, +/* 314b */ NULL, +/* 314c */ NULL, +/* 314d */ NULL, +/* 314e */ NULL, +/* 314f */ NULL, +/* 3150 */ NULL, +/* 3151 */ NULL, +/* 3152 */ NULL, +/* 3153 */ NULL, +/* 3154 */ NULL, +/* 3155 */ NULL, +/* 3156 */ NULL, +/* 3157 */ NULL, +/* 3158 */ NULL, +/* 3159 */ NULL, +/* 315a */ NULL, +/* 315b */ NULL, +/* 315c */ NULL, +/* 315d */ NULL, +/* 315e */ NULL, +/* 315f */ NULL, +/* 3160 */ NULL, +/* 3161 */ NULL, +/* 3162 */ NULL, +/* 3163 */ NULL, +/* 3164 */ NULL, +/* 3165 */ NULL, +/* 3166 */ NULL, +/* 3167 */ NULL, +/* 3168 */ NULL, +/* 3169 */ NULL, +/* 316a */ NULL, +/* 316b */ NULL, +/* 316c */ NULL, +/* 316d */ NULL, +/* 316e */ NULL, +/* 316f */ NULL, +/* 3170 */ NULL, +/* 3171 */ NULL, +/* 3172 */ NULL, +/* 3173 */ NULL, +/* 3174 */ NULL, +/* 3175 */ NULL, +/* 3176 */ NULL, +/* 3177 */ NULL, +/* 3178 */ NULL, +/* 3179 */ NULL, +/* 317a */ NULL, +/* 317b */ NULL, +/* 317c */ NULL, +/* 317d */ NULL, +/* 317e */ NULL, +/* 317f */ NULL, +/* 3180 */ NULL, +/* 3181 */ NULL, +/* 3182 */ NULL, +/* 3183 */ NULL, +/* 3184 */ NULL, +/* 3185 */ NULL, +/* 3186 */ NULL, +/* 3187 */ NULL, +/* 3188 */ NULL, +/* 3189 */ NULL, +/* 318a */ NULL, +/* 318b */ NULL, +/* 318c */ NULL, +/* 318d */ NULL, +/* 318e */ NULL, +/* 318f */ NULL, +/* 3190 */ NULL, +/* 3191 */ NULL, +/* 3192 */ NULL, +/* 3193 */ NULL, +/* 3194 */ NULL, +/* 3195 */ NULL, +/* 3196 */ NULL, +/* 3197 */ NULL, +/* 3198 */ NULL, +/* 3199 */ NULL, +/* 319a */ NULL, +/* 319b */ NULL, +/* 319c */ NULL, +/* 319d */ NULL, +/* 319e */ NULL, +/* 319f */ NULL, +/* 31a0 */ NULL, +/* 31a1 */ NULL, +/* 31a2 */ NULL, +/* 31a3 */ NULL, +/* 31a4 */ NULL, +/* 31a5 */ NULL, +/* 31a6 */ NULL, +/* 31a7 */ NULL, +/* 31a8 */ NULL, +/* 31a9 */ NULL, +/* 31aa */ NULL, +/* 31ab */ NULL, +/* 31ac */ NULL, +/* 31ad */ NULL, +/* 31ae */ NULL, +/* 31af */ NULL, +/* 31b0 */ NULL, +/* 31b1 */ NULL, +/* 31b2 */ NULL, +/* 31b3 */ NULL, +/* 31b4 */ NULL, +/* 31b5 */ NULL, +/* 31b6 */ NULL, +/* 31b7 */ NULL, +/* 31b8 */ NULL, +/* 31b9 */ NULL, +/* 31ba */ NULL, +/* 31bb */ NULL, +/* 31bc */ NULL, +/* 31bd */ NULL, +/* 31be */ NULL, +/* 31bf */ NULL, +/* 31c0 */ NULL, +/* 31c1 */ NULL, +/* 31c2 */ NULL, +/* 31c3 */ NULL, +/* 31c4 */ NULL, +/* 31c5 */ NULL, +/* 31c6 */ NULL, +/* 31c7 */ NULL, +/* 31c8 */ NULL, +/* 31c9 */ NULL, +/* 31ca */ NULL, +/* 31cb */ NULL, +/* 31cc */ NULL, +/* 31cd */ NULL, +/* 31ce */ NULL, +/* 31cf */ NULL, +/* 31d0 */ NULL, +/* 31d1 */ NULL, +/* 31d2 */ NULL, +/* 31d3 */ NULL, +/* 31d4 */ NULL, +/* 31d5 */ NULL, +/* 31d6 */ NULL, +/* 31d7 */ NULL, +/* 31d8 */ NULL, +/* 31d9 */ NULL, +/* 31da */ NULL, +/* 31db */ NULL, +/* 31dc */ NULL, +/* 31dd */ NULL, +/* 31de */ NULL, +/* 31df */ NULL, +/* 31e0 */ NULL, +/* 31e1 */ NULL, +/* 31e2 */ NULL, +/* 31e3 */ NULL, +/* 31e4 */ NULL, +/* 31e5 */ NULL, +/* 31e6 */ NULL, +/* 31e7 */ NULL, +/* 31e8 */ NULL, +/* 31e9 */ NULL, +/* 31ea */ NULL, +/* 31eb */ NULL, +/* 31ec */ NULL, +/* 31ed */ NULL, +/* 31ee */ NULL, +/* 31ef */ NULL, +/* 31f0 */ NULL, +/* 31f1 */ NULL, +/* 31f2 */ NULL, +/* 31f3 */ NULL, +/* 31f4 */ NULL, +/* 31f5 */ NULL, +/* 31f6 */ NULL, +/* 31f7 */ NULL, +/* 31f8 */ NULL, +/* 31f9 */ NULL, +/* 31fa */ NULL, +/* 31fb */ NULL, +/* 31fc */ NULL, +/* 31fd */ NULL, +/* 31fe */ NULL, +/* 31ff */ NULL, +/* 3200 */ NULL, +/* 3201 */ NULL, +/* 3202 */ NULL, +/* 3203 */ NULL, +/* 3204 */ NULL, +/* 3205 */ NULL, +/* 3206 */ NULL, +/* 3207 */ NULL, +/* 3208 */ NULL, +/* 3209 */ NULL, +/* 320a */ NULL, +/* 320b */ NULL, +/* 320c */ NULL, +/* 320d */ NULL, +/* 320e */ NULL, +/* 320f */ NULL, +/* 3210 */ NULL, +/* 3211 */ NULL, +/* 3212 */ NULL, +/* 3213 */ NULL, +/* 3214 */ NULL, +/* 3215 */ NULL, +/* 3216 */ NULL, +/* 3217 */ NULL, +/* 3218 */ NULL, +/* 3219 */ NULL, +/* 321a */ NULL, +/* 321b */ NULL, +/* 321c */ NULL, +/* 321d */ NULL, +/* 321e */ NULL, +/* 321f */ NULL, +/* 3220 */ NULL, +/* 3221 */ NULL, +/* 3222 */ NULL, +/* 3223 */ NULL, +/* 3224 */ NULL, +/* 3225 */ NULL, +/* 3226 */ NULL, +/* 3227 */ NULL, +/* 3228 */ NULL, +/* 3229 */ NULL, +/* 322a */ NULL, +/* 322b */ NULL, +/* 322c */ NULL, +/* 322d */ NULL, +/* 322e */ NULL, +/* 322f */ NULL, +/* 3230 */ NULL, +/* 3231 */ NULL, +/* 3232 */ NULL, +/* 3233 */ NULL, +/* 3234 */ NULL, +/* 3235 */ NULL, +/* 3236 */ NULL, +/* 3237 */ NULL, +/* 3238 */ NULL, +/* 3239 */ NULL, +/* 323a */ NULL, +/* 323b */ NULL, +/* 323c */ NULL, +/* 323d */ NULL, +/* 323e */ NULL, +/* 323f */ NULL, +/* 3240 */ NULL, +/* 3241 */ NULL, +/* 3242 */ NULL, +/* 3243 */ NULL, +/* 3244 */ NULL, +/* 3245 */ NULL, +/* 3246 */ NULL, +/* 3247 */ NULL, +/* 3248 */ NULL, +/* 3249 */ NULL, +/* 324a */ NULL, +/* 324b */ NULL, +/* 324c */ NULL, +/* 324d */ NULL, +/* 324e */ NULL, +/* 324f */ NULL, +/* 3250 */ NULL, +/* 3251 */ NULL, +/* 3252 */ NULL, +/* 3253 */ NULL, +/* 3254 */ NULL, +/* 3255 */ NULL, +/* 3256 */ NULL, +/* 3257 */ NULL, +/* 3258 */ NULL, +/* 3259 */ NULL, +/* 325a */ NULL, +/* 325b */ NULL, +/* 325c */ NULL, +/* 325d */ NULL, +/* 325e */ NULL, +/* 325f */ NULL, +/* 3260 */ NULL, +/* 3261 */ NULL, +/* 3262 */ NULL, +/* 3263 */ NULL, +/* 3264 */ NULL, +/* 3265 */ NULL, +/* 3266 */ NULL, +/* 3267 */ NULL, +/* 3268 */ NULL, +/* 3269 */ NULL, +/* 326a */ NULL, +/* 326b */ NULL, +/* 326c */ NULL, +/* 326d */ NULL, +/* 326e */ NULL, +/* 326f */ NULL, +/* 3270 */ NULL, +/* 3271 */ NULL, +/* 3272 */ NULL, +/* 3273 */ NULL, +/* 3274 */ NULL, +/* 3275 */ NULL, +/* 3276 */ NULL, +/* 3277 */ NULL, +/* 3278 */ NULL, +/* 3279 */ NULL, +/* 327a */ NULL, +/* 327b */ NULL, +/* 327c */ NULL, +/* 327d */ NULL, +/* 327e */ NULL, +/* 327f */ NULL, +/* 3280 */ NULL, +/* 3281 */ NULL, +/* 3282 */ NULL, +/* 3283 */ NULL, +/* 3284 */ NULL, +/* 3285 */ NULL, +/* 3286 */ NULL, +/* 3287 */ NULL, +/* 3288 */ NULL, +/* 3289 */ NULL, +/* 328a */ NULL, +/* 328b */ NULL, +/* 328c */ NULL, +/* 328d */ NULL, +/* 328e */ NULL, +/* 328f */ NULL, +/* 3290 */ NULL, +/* 3291 */ NULL, +/* 3292 */ NULL, +/* 3293 */ NULL, +/* 3294 */ NULL, +/* 3295 */ NULL, +/* 3296 */ NULL, +/* 3297 */ NULL, +/* 3298 */ NULL, +/* 3299 */ NULL, +/* 329a */ NULL, +/* 329b */ NULL, +/* 329c */ NULL, +/* 329d */ NULL, +/* 329e */ NULL, +/* 329f */ NULL, +/* 32a0 */ NULL, +/* 32a1 */ NULL, +/* 32a2 */ NULL, +/* 32a3 */ NULL, +/* 32a4 */ NULL, +/* 32a5 */ NULL, +/* 32a6 */ NULL, +/* 32a7 */ NULL, +/* 32a8 */ NULL, +/* 32a9 */ NULL, +/* 32aa */ NULL, +/* 32ab */ NULL, +/* 32ac */ NULL, +/* 32ad */ NULL, +/* 32ae */ NULL, +/* 32af */ NULL, +/* 32b0 */ NULL, +/* 32b1 */ NULL, +/* 32b2 */ NULL, +/* 32b3 */ NULL, +/* 32b4 */ NULL, +/* 32b5 */ NULL, +/* 32b6 */ NULL, +/* 32b7 */ NULL, +/* 32b8 */ NULL, +/* 32b9 */ NULL, +/* 32ba */ NULL, +/* 32bb */ NULL, +/* 32bc */ NULL, +/* 32bd */ NULL, +/* 32be */ NULL, +/* 32bf */ NULL, +/* 32c0 */ NULL, +/* 32c1 */ NULL, +/* 32c2 */ NULL, +/* 32c3 */ NULL, +/* 32c4 */ NULL, +/* 32c5 */ NULL, +/* 32c6 */ NULL, +/* 32c7 */ NULL, +/* 32c8 */ NULL, +/* 32c9 */ NULL, +/* 32ca */ NULL, +/* 32cb */ NULL, +/* 32cc */ NULL, +/* 32cd */ NULL, +/* 32ce */ NULL, +/* 32cf */ NULL, +/* 32d0 */ NULL, +/* 32d1 */ NULL, +/* 32d2 */ NULL, +/* 32d3 */ NULL, +/* 32d4 */ NULL, +/* 32d5 */ NULL, +/* 32d6 */ NULL, +/* 32d7 */ NULL, +/* 32d8 */ NULL, +/* 32d9 */ NULL, +/* 32da */ NULL, +/* 32db */ NULL, +/* 32dc */ NULL, +/* 32dd */ NULL, +/* 32de */ NULL, +/* 32df */ NULL, +/* 32e0 */ NULL, +/* 32e1 */ NULL, +/* 32e2 */ NULL, +/* 32e3 */ NULL, +/* 32e4 */ NULL, +/* 32e5 */ NULL, +/* 32e6 */ NULL, +/* 32e7 */ NULL, +/* 32e8 */ NULL, +/* 32e9 */ NULL, +/* 32ea */ NULL, +/* 32eb */ NULL, +/* 32ec */ NULL, +/* 32ed */ NULL, +/* 32ee */ NULL, +/* 32ef */ NULL, +/* 32f0 */ NULL, +/* 32f1 */ NULL, +/* 32f2 */ NULL, +/* 32f3 */ NULL, +/* 32f4 */ NULL, +/* 32f5 */ NULL, +/* 32f6 */ NULL, +/* 32f7 */ NULL, +/* 32f8 */ NULL, +/* 32f9 */ NULL, +/* 32fa */ NULL, +/* 32fb */ NULL, +/* 32fc */ NULL, +/* 32fd */ NULL, +/* 32fe */ NULL, +/* 32ff */ NULL, +/* 3300 */ NULL, +/* 3301 */ NULL, +/* 3302 */ NULL, +/* 3303 */ NULL, +/* 3304 */ NULL, +/* 3305 */ NULL, +/* 3306 */ NULL, +/* 3307 */ NULL, +/* 3308 */ NULL, +/* 3309 */ NULL, +/* 330a */ NULL, +/* 330b */ NULL, +/* 330c */ NULL, +/* 330d */ NULL, +/* 330e */ NULL, +/* 330f */ NULL, +/* 3310 */ NULL, +/* 3311 */ NULL, +/* 3312 */ NULL, +/* 3313 */ NULL, +/* 3314 */ NULL, +/* 3315 */ NULL, +/* 3316 */ NULL, +/* 3317 */ NULL, +/* 3318 */ NULL, +/* 3319 */ NULL, +/* 331a */ NULL, +/* 331b */ NULL, +/* 331c */ NULL, +/* 331d */ NULL, +/* 331e */ NULL, +/* 331f */ NULL, +/* 3320 */ NULL, +/* 3321 */ NULL, +/* 3322 */ NULL, +/* 3323 */ NULL, +/* 3324 */ NULL, +/* 3325 */ NULL, +/* 3326 */ NULL, +/* 3327 */ NULL, +/* 3328 */ NULL, +/* 3329 */ NULL, +/* 332a */ NULL, +/* 332b */ NULL, +/* 332c */ NULL, +/* 332d */ NULL, +/* 332e */ NULL, +/* 332f */ NULL, +/* 3330 */ NULL, +/* 3331 */ NULL, +/* 3332 */ NULL, +/* 3333 */ NULL, +/* 3334 */ NULL, +/* 3335 */ NULL, +/* 3336 */ NULL, +/* 3337 */ NULL, +/* 3338 */ NULL, +/* 3339 */ NULL, +/* 333a */ NULL, +/* 333b */ NULL, +/* 333c */ NULL, +/* 333d */ NULL, +/* 333e */ NULL, +/* 333f */ NULL, +/* 3340 */ NULL, +/* 3341 */ NULL, +/* 3342 */ NULL, +/* 3343 */ NULL, +/* 3344 */ NULL, +/* 3345 */ NULL, +/* 3346 */ NULL, +/* 3347 */ NULL, +/* 3348 */ NULL, +/* 3349 */ NULL, +/* 334a */ NULL, +/* 334b */ NULL, +/* 334c */ NULL, +/* 334d */ NULL, +/* 334e */ NULL, +/* 334f */ NULL, +/* 3350 */ NULL, +/* 3351 */ NULL, +/* 3352 */ NULL, +/* 3353 */ NULL, +/* 3354 */ NULL, +/* 3355 */ NULL, +/* 3356 */ NULL, +/* 3357 */ NULL, +/* 3358 */ NULL, +/* 3359 */ NULL, +/* 335a */ NULL, +/* 335b */ NULL, +/* 335c */ NULL, +/* 335d */ NULL, +/* 335e */ NULL, +/* 335f */ NULL, +/* 3360 */ NULL, +/* 3361 */ NULL, +/* 3362 */ NULL, +/* 3363 */ NULL, +/* 3364 */ NULL, +/* 3365 */ NULL, +/* 3366 */ NULL, +/* 3367 */ NULL, +/* 3368 */ NULL, +/* 3369 */ NULL, +/* 336a */ NULL, +/* 336b */ NULL, +/* 336c */ NULL, +/* 336d */ NULL, +/* 336e */ NULL, +/* 336f */ NULL, +/* 3370 */ NULL, +/* 3371 */ NULL, +/* 3372 */ NULL, +/* 3373 */ NULL, +/* 3374 */ NULL, +/* 3375 */ NULL, +/* 3376 */ NULL, +/* 3377 */ NULL, +/* 3378 */ NULL, +/* 3379 */ NULL, +/* 337a */ NULL, +/* 337b */ NULL, +/* 337c */ NULL, +/* 337d */ NULL, +/* 337e */ NULL, +/* 337f */ NULL, +/* 3380 */ NULL, +/* 3381 */ NULL, +/* 3382 */ NULL, +/* 3383 */ NULL, +/* 3384 */ NULL, +/* 3385 */ NULL, +/* 3386 */ NULL, +/* 3387 */ NULL, +/* 3388 */ NULL, +/* 3389 */ NULL, +/* 338a */ NULL, +/* 338b */ NULL, +/* 338c */ NULL, +/* 338d */ NULL, +/* 338e */ NULL, +/* 338f */ NULL, +/* 3390 */ NULL, +/* 3391 */ NULL, +/* 3392 */ NULL, +/* 3393 */ NULL, +/* 3394 */ NULL, +/* 3395 */ NULL, +/* 3396 */ NULL, +/* 3397 */ NULL, +/* 3398 */ NULL, +/* 3399 */ NULL, +/* 339a */ NULL, +/* 339b */ NULL, +/* 339c */ NULL, +/* 339d */ NULL, +/* 339e */ NULL, +/* 339f */ NULL, +/* 33a0 */ NULL, +/* 33a1 */ NULL, +/* 33a2 */ NULL, +/* 33a3 */ NULL, +/* 33a4 */ NULL, +/* 33a5 */ NULL, +/* 33a6 */ NULL, +/* 33a7 */ NULL, +/* 33a8 */ NULL, +/* 33a9 */ NULL, +/* 33aa */ NULL, +/* 33ab */ NULL, +/* 33ac */ NULL, +/* 33ad */ NULL, +/* 33ae */ NULL, +/* 33af */ NULL, +/* 33b0 */ NULL, +/* 33b1 */ NULL, +/* 33b2 */ NULL, +/* 33b3 */ NULL, +/* 33b4 */ NULL, +/* 33b5 */ NULL, +/* 33b6 */ NULL, +/* 33b7 */ NULL, +/* 33b8 */ NULL, +/* 33b9 */ NULL, +/* 33ba */ NULL, +/* 33bb */ NULL, +/* 33bc */ NULL, +/* 33bd */ NULL, +/* 33be */ NULL, +/* 33bf */ NULL, +/* 33c0 */ NULL, +/* 33c1 */ NULL, +/* 33c2 */ NULL, +/* 33c3 */ NULL, +/* 33c4 */ NULL, +/* 33c5 */ NULL, +/* 33c6 */ NULL, +/* 33c7 */ NULL, +/* 33c8 */ NULL, +/* 33c9 */ NULL, +/* 33ca */ NULL, +/* 33cb */ NULL, +/* 33cc */ NULL, +/* 33cd */ NULL, +/* 33ce */ NULL, +/* 33cf */ NULL, +/* 33d0 */ NULL, +/* 33d1 */ NULL, +/* 33d2 */ NULL, +/* 33d3 */ NULL, +/* 33d4 */ NULL, +/* 33d5 */ NULL, +/* 33d6 */ NULL, +/* 33d7 */ NULL, +/* 33d8 */ NULL, +/* 33d9 */ NULL, +/* 33da */ NULL, +/* 33db */ NULL, +/* 33dc */ NULL, +/* 33dd */ NULL, +/* 33de */ NULL, +/* 33df */ NULL, +/* 33e0 */ NULL, +/* 33e1 */ NULL, +/* 33e2 */ NULL, +/* 33e3 */ NULL, +/* 33e4 */ NULL, +/* 33e5 */ NULL, +/* 33e6 */ NULL, +/* 33e7 */ NULL, +/* 33e8 */ NULL, +/* 33e9 */ NULL, +/* 33ea */ NULL, +/* 33eb */ NULL, +/* 33ec */ NULL, +/* 33ed */ NULL, +/* 33ee */ NULL, +/* 33ef */ NULL, +/* 33f0 */ NULL, +/* 33f1 */ NULL, +/* 33f2 */ NULL, +/* 33f3 */ NULL, +/* 33f4 */ NULL, +/* 33f5 */ NULL, +/* 33f6 */ NULL, +/* 33f7 */ NULL, +/* 33f8 */ NULL, +/* 33f9 */ NULL, +/* 33fa */ NULL, +/* 33fb */ NULL, +/* 33fc */ NULL, +/* 33fd */ NULL, +/* 33fe */ NULL, +/* 33ff */ NULL, +/* 3400 */ NULL, +/* 3401 */ NULL, +/* 3402 */ NULL, +/* 3403 */ NULL, +/* 3404 */ NULL, +/* 3405 */ NULL, +/* 3406 */ NULL, +/* 3407 */ NULL, +/* 3408 */ NULL, +/* 3409 */ NULL, +/* 340a */ NULL, +/* 340b */ NULL, +/* 340c */ NULL, +/* 340d */ NULL, +/* 340e */ NULL, +/* 340f */ NULL, +/* 3410 */ NULL, +/* 3411 */ NULL, +/* 3412 */ NULL, +/* 3413 */ NULL, +/* 3414 */ NULL, +/* 3415 */ NULL, +/* 3416 */ NULL, +/* 3417 */ NULL, +/* 3418 */ NULL, +/* 3419 */ NULL, +/* 341a */ NULL, +/* 341b */ NULL, +/* 341c */ NULL, +/* 341d */ NULL, +/* 341e */ NULL, +/* 341f */ NULL, +/* 3420 */ NULL, +/* 3421 */ NULL, +/* 3422 */ NULL, +/* 3423 */ NULL, +/* 3424 */ NULL, +/* 3425 */ NULL, +/* 3426 */ NULL, +/* 3427 */ NULL, +/* 3428 */ NULL, +/* 3429 */ NULL, +/* 342a */ NULL, +/* 342b */ NULL, +/* 342c */ NULL, +/* 342d */ NULL, +/* 342e */ NULL, +/* 342f */ NULL, +/* 3430 */ NULL, +/* 3431 */ NULL, +/* 3432 */ NULL, +/* 3433 */ NULL, +/* 3434 */ NULL, +/* 3435 */ NULL, +/* 3436 */ NULL, +/* 3437 */ NULL, +/* 3438 */ NULL, +/* 3439 */ NULL, +/* 343a */ NULL, +/* 343b */ NULL, +/* 343c */ NULL, +/* 343d */ NULL, +/* 343e */ NULL, +/* 343f */ NULL, +/* 3440 */ NULL, +/* 3441 */ NULL, +/* 3442 */ NULL, +/* 3443 */ NULL, +/* 3444 */ NULL, +/* 3445 */ NULL, +/* 3446 */ NULL, +/* 3447 */ NULL, +/* 3448 */ NULL, +/* 3449 */ NULL, +/* 344a */ NULL, +/* 344b */ NULL, +/* 344c */ NULL, +/* 344d */ NULL, +/* 344e */ NULL, +/* 344f */ NULL, +/* 3450 */ NULL, +/* 3451 */ NULL, +/* 3452 */ NULL, +/* 3453 */ NULL, +/* 3454 */ NULL, +/* 3455 */ NULL, +/* 3456 */ NULL, +/* 3457 */ NULL, +/* 3458 */ NULL, +/* 3459 */ NULL, +/* 345a */ NULL, +/* 345b */ NULL, +/* 345c */ NULL, +/* 345d */ NULL, +/* 345e */ NULL, +/* 345f */ NULL, +/* 3460 */ NULL, +/* 3461 */ NULL, +/* 3462 */ NULL, +/* 3463 */ NULL, +/* 3464 */ NULL, +/* 3465 */ NULL, +/* 3466 */ NULL, +/* 3467 */ NULL, +/* 3468 */ NULL, +/* 3469 */ NULL, +/* 346a */ NULL, +/* 346b */ NULL, +/* 346c */ NULL, +/* 346d */ NULL, +/* 346e */ NULL, +/* 346f */ NULL, +/* 3470 */ NULL, +/* 3471 */ NULL, +/* 3472 */ NULL, +/* 3473 */ NULL, +/* 3474 */ NULL, +/* 3475 */ NULL, +/* 3476 */ NULL, +/* 3477 */ NULL, +/* 3478 */ NULL, +/* 3479 */ NULL, +/* 347a */ NULL, +/* 347b */ NULL, +/* 347c */ NULL, +/* 347d */ NULL, +/* 347e */ NULL, +/* 347f */ NULL, +/* 3480 */ NULL, +/* 3481 */ NULL, +/* 3482 */ NULL, +/* 3483 */ NULL, +/* 3484 */ NULL, +/* 3485 */ NULL, +/* 3486 */ NULL, +/* 3487 */ NULL, +/* 3488 */ NULL, +/* 3489 */ NULL, +/* 348a */ NULL, +/* 348b */ NULL, +/* 348c */ NULL, +/* 348d */ NULL, +/* 348e */ NULL, +/* 348f */ NULL, +/* 3490 */ NULL, +/* 3491 */ NULL, +/* 3492 */ NULL, +/* 3493 */ NULL, +/* 3494 */ NULL, +/* 3495 */ NULL, +/* 3496 */ NULL, +/* 3497 */ NULL, +/* 3498 */ NULL, +/* 3499 */ NULL, +/* 349a */ NULL, +/* 349b */ NULL, +/* 349c */ NULL, +/* 349d */ NULL, +/* 349e */ NULL, +/* 349f */ NULL, +/* 34a0 */ NULL, +/* 34a1 */ NULL, +/* 34a2 */ NULL, +/* 34a3 */ NULL, +/* 34a4 */ NULL, +/* 34a5 */ NULL, +/* 34a6 */ NULL, +/* 34a7 */ NULL, +/* 34a8 */ NULL, +/* 34a9 */ NULL, +/* 34aa */ NULL, +/* 34ab */ NULL, +/* 34ac */ NULL, +/* 34ad */ NULL, +/* 34ae */ NULL, +/* 34af */ NULL, +/* 34b0 */ NULL, +/* 34b1 */ NULL, +/* 34b2 */ NULL, +/* 34b3 */ NULL, +/* 34b4 */ NULL, +/* 34b5 */ NULL, +/* 34b6 */ NULL, +/* 34b7 */ NULL, +/* 34b8 */ NULL, +/* 34b9 */ NULL, +/* 34ba */ NULL, +/* 34bb */ NULL, +/* 34bc */ NULL, +/* 34bd */ NULL, +/* 34be */ NULL, +/* 34bf */ NULL, +/* 34c0 */ NULL, +/* 34c1 */ NULL, +/* 34c2 */ NULL, +/* 34c3 */ NULL, +/* 34c4 */ NULL, +/* 34c5 */ NULL, +/* 34c6 */ NULL, +/* 34c7 */ NULL, +/* 34c8 */ NULL, +/* 34c9 */ NULL, +/* 34ca */ NULL, +/* 34cb */ NULL, +/* 34cc */ NULL, +/* 34cd */ NULL, +/* 34ce */ NULL, +/* 34cf */ NULL, +/* 34d0 */ NULL, +/* 34d1 */ NULL, +/* 34d2 */ NULL, +/* 34d3 */ NULL, +/* 34d4 */ NULL, +/* 34d5 */ NULL, +/* 34d6 */ NULL, +/* 34d7 */ NULL, +/* 34d8 */ NULL, +/* 34d9 */ NULL, +/* 34da */ NULL, +/* 34db */ NULL, +/* 34dc */ NULL, +/* 34dd */ NULL, +/* 34de */ NULL, +/* 34df */ NULL, +/* 34e0 */ NULL, +/* 34e1 */ NULL, +/* 34e2 */ NULL, +/* 34e3 */ NULL, +/* 34e4 */ NULL, +/* 34e5 */ NULL, +/* 34e6 */ NULL, +/* 34e7 */ NULL, +/* 34e8 */ NULL, +/* 34e9 */ NULL, +/* 34ea */ NULL, +/* 34eb */ NULL, +/* 34ec */ NULL, +/* 34ed */ NULL, +/* 34ee */ NULL, +/* 34ef */ NULL, +/* 34f0 */ NULL, +/* 34f1 */ NULL, +/* 34f2 */ NULL, +/* 34f3 */ NULL, +/* 34f4 */ NULL, +/* 34f5 */ NULL, +/* 34f6 */ NULL, +/* 34f7 */ NULL, +/* 34f8 */ NULL, +/* 34f9 */ NULL, +/* 34fa */ NULL, +/* 34fb */ NULL, +/* 34fc */ NULL, +/* 34fd */ NULL, +/* 34fe */ NULL, +/* 34ff */ NULL, +/* 3500 */ NULL, +/* 3501 */ NULL, +/* 3502 */ NULL, +/* 3503 */ NULL, +/* 3504 */ NULL, +/* 3505 */ NULL, +/* 3506 */ NULL, +/* 3507 */ NULL, +/* 3508 */ NULL, +/* 3509 */ NULL, +/* 350a */ NULL, +/* 350b */ NULL, +/* 350c */ NULL, +/* 350d */ NULL, +/* 350e */ NULL, +/* 350f */ NULL, +/* 3510 */ NULL, +/* 3511 */ NULL, +/* 3512 */ NULL, +/* 3513 */ NULL, +/* 3514 */ NULL, +/* 3515 */ NULL, +/* 3516 */ NULL, +/* 3517 */ NULL, +/* 3518 */ NULL, +/* 3519 */ NULL, +/* 351a */ NULL, +/* 351b */ NULL, +/* 351c */ NULL, +/* 351d */ NULL, +/* 351e */ NULL, +/* 351f */ NULL, +/* 3520 */ NULL, +/* 3521 */ NULL, +/* 3522 */ NULL, +/* 3523 */ NULL, +/* 3524 */ NULL, +/* 3525 */ NULL, +/* 3526 */ NULL, +/* 3527 */ NULL, +/* 3528 */ NULL, +/* 3529 */ NULL, +/* 352a */ NULL, +/* 352b */ NULL, +/* 352c */ NULL, +/* 352d */ NULL, +/* 352e */ NULL, +/* 352f */ NULL, +/* 3530 */ NULL, +/* 3531 */ NULL, +/* 3532 */ NULL, +/* 3533 */ NULL, +/* 3534 */ NULL, +/* 3535 */ NULL, +/* 3536 */ NULL, +/* 3537 */ NULL, +/* 3538 */ NULL, +/* 3539 */ NULL, +/* 353a */ NULL, +/* 353b */ NULL, +/* 353c */ NULL, +/* 353d */ NULL, +/* 353e */ NULL, +/* 353f */ NULL, +/* 3540 */ NULL, +/* 3541 */ NULL, +/* 3542 */ NULL, +/* 3543 */ NULL, +/* 3544 */ NULL, +/* 3545 */ NULL, +/* 3546 */ NULL, +/* 3547 */ NULL, +/* 3548 */ NULL, +/* 3549 */ NULL, +/* 354a */ NULL, +/* 354b */ NULL, +/* 354c */ NULL, +/* 354d */ NULL, +/* 354e */ NULL, +/* 354f */ NULL, +/* 3550 */ NULL, +/* 3551 */ NULL, +/* 3552 */ NULL, +/* 3553 */ NULL, +/* 3554 */ NULL, +/* 3555 */ NULL, +/* 3556 */ NULL, +/* 3557 */ NULL, +/* 3558 */ NULL, +/* 3559 */ NULL, +/* 355a */ NULL, +/* 355b */ NULL, +/* 355c */ NULL, +/* 355d */ NULL, +/* 355e */ NULL, +/* 355f */ NULL, +/* 3560 */ NULL, +/* 3561 */ NULL, +/* 3562 */ NULL, +/* 3563 */ NULL, +/* 3564 */ NULL, +/* 3565 */ NULL, +/* 3566 */ NULL, +/* 3567 */ NULL, +/* 3568 */ NULL, +/* 3569 */ NULL, +/* 356a */ NULL, +/* 356b */ NULL, +/* 356c */ NULL, +/* 356d */ NULL, +/* 356e */ NULL, +/* 356f */ NULL, +/* 3570 */ NULL, +/* 3571 */ NULL, +/* 3572 */ NULL, +/* 3573 */ NULL, +/* 3574 */ NULL, +/* 3575 */ NULL, +/* 3576 */ NULL, +/* 3577 */ NULL, +/* 3578 */ NULL, +/* 3579 */ NULL, +/* 357a */ NULL, +/* 357b */ NULL, +/* 357c */ NULL, +/* 357d */ NULL, +/* 357e */ NULL, +/* 357f */ NULL, +/* 3580 */ NULL, +/* 3581 */ NULL, +/* 3582 */ NULL, +/* 3583 */ NULL, +/* 3584 */ NULL, +/* 3585 */ NULL, +/* 3586 */ NULL, +/* 3587 */ NULL, +/* 3588 */ NULL, +/* 3589 */ NULL, +/* 358a */ NULL, +/* 358b */ NULL, +/* 358c */ NULL, +/* 358d */ NULL, +/* 358e */ NULL, +/* 358f */ NULL, +/* 3590 */ NULL, +/* 3591 */ NULL, +/* 3592 */ NULL, +/* 3593 */ NULL, +/* 3594 */ NULL, +/* 3595 */ NULL, +/* 3596 */ NULL, +/* 3597 */ NULL, +/* 3598 */ NULL, +/* 3599 */ NULL, +/* 359a */ NULL, +/* 359b */ NULL, +/* 359c */ NULL, +/* 359d */ NULL, +/* 359e */ NULL, +/* 359f */ NULL, +/* 35a0 */ NULL, +/* 35a1 */ NULL, +/* 35a2 */ NULL, +/* 35a3 */ NULL, +/* 35a4 */ NULL, +/* 35a5 */ NULL, +/* 35a6 */ NULL, +/* 35a7 */ NULL, +/* 35a8 */ NULL, +/* 35a9 */ NULL, +/* 35aa */ NULL, +/* 35ab */ NULL, +/* 35ac */ NULL, +/* 35ad */ NULL, +/* 35ae */ NULL, +/* 35af */ NULL, +/* 35b0 */ NULL, +/* 35b1 */ NULL, +/* 35b2 */ NULL, +/* 35b3 */ NULL, +/* 35b4 */ NULL, +/* 35b5 */ NULL, +/* 35b6 */ NULL, +/* 35b7 */ NULL, +/* 35b8 */ NULL, +/* 35b9 */ NULL, +/* 35ba */ NULL, +/* 35bb */ NULL, +/* 35bc */ NULL, +/* 35bd */ NULL, +/* 35be */ NULL, +/* 35bf */ NULL, +/* 35c0 */ NULL, +/* 35c1 */ NULL, +/* 35c2 */ NULL, +/* 35c3 */ NULL, +/* 35c4 */ NULL, +/* 35c5 */ NULL, +/* 35c6 */ NULL, +/* 35c7 */ NULL, +/* 35c8 */ NULL, +/* 35c9 */ NULL, +/* 35ca */ NULL, +/* 35cb */ NULL, +/* 35cc */ NULL, +/* 35cd */ NULL, +/* 35ce */ NULL, +/* 35cf */ NULL, +/* 35d0 */ NULL, +/* 35d1 */ NULL, +/* 35d2 */ NULL, +/* 35d3 */ NULL, +/* 35d4 */ NULL, +/* 35d5 */ NULL, +/* 35d6 */ NULL, +/* 35d7 */ NULL, +/* 35d8 */ NULL, +/* 35d9 */ NULL, +/* 35da */ NULL, +/* 35db */ NULL, +/* 35dc */ NULL, +/* 35dd */ NULL, +/* 35de */ NULL, +/* 35df */ NULL, +/* 35e0 */ NULL, +/* 35e1 */ NULL, +/* 35e2 */ NULL, +/* 35e3 */ NULL, +/* 35e4 */ NULL, +/* 35e5 */ NULL, +/* 35e6 */ NULL, +/* 35e7 */ NULL, +/* 35e8 */ NULL, +/* 35e9 */ NULL, +/* 35ea */ NULL, +/* 35eb */ NULL, +/* 35ec */ NULL, +/* 35ed */ NULL, +/* 35ee */ NULL, +/* 35ef */ NULL, +/* 35f0 */ NULL, +/* 35f1 */ NULL, +/* 35f2 */ NULL, +/* 35f3 */ NULL, +/* 35f4 */ NULL, +/* 35f5 */ NULL, +/* 35f6 */ NULL, +/* 35f7 */ NULL, +/* 35f8 */ NULL, +/* 35f9 */ NULL, +/* 35fa */ NULL, +/* 35fb */ NULL, +/* 35fc */ NULL, +/* 35fd */ NULL, +/* 35fe */ NULL, +/* 35ff */ NULL, +/* 3600 */ NULL, +/* 3601 */ NULL, +/* 3602 */ NULL, +/* 3603 */ NULL, +/* 3604 */ NULL, +/* 3605 */ NULL, +/* 3606 */ NULL, +/* 3607 */ NULL, +/* 3608 */ NULL, +/* 3609 */ NULL, +/* 360a */ NULL, +/* 360b */ NULL, +/* 360c */ NULL, +/* 360d */ NULL, +/* 360e */ NULL, +/* 360f */ NULL, +/* 3610 */ NULL, +/* 3611 */ NULL, +/* 3612 */ NULL, +/* 3613 */ NULL, +/* 3614 */ NULL, +/* 3615 */ NULL, +/* 3616 */ NULL, +/* 3617 */ NULL, +/* 3618 */ NULL, +/* 3619 */ NULL, +/* 361a */ NULL, +/* 361b */ NULL, +/* 361c */ NULL, +/* 361d */ NULL, +/* 361e */ NULL, +/* 361f */ NULL, +/* 3620 */ NULL, +/* 3621 */ NULL, +/* 3622 */ NULL, +/* 3623 */ NULL, +/* 3624 */ NULL, +/* 3625 */ NULL, +/* 3626 */ NULL, +/* 3627 */ NULL, +/* 3628 */ NULL, +/* 3629 */ NULL, +/* 362a */ NULL, +/* 362b */ NULL, +/* 362c */ NULL, +/* 362d */ NULL, +/* 362e */ NULL, +/* 362f */ NULL, +/* 3630 */ NULL, +/* 3631 */ NULL, +/* 3632 */ NULL, +/* 3633 */ NULL, +/* 3634 */ NULL, +/* 3635 */ NULL, +/* 3636 */ NULL, +/* 3637 */ NULL, +/* 3638 */ NULL, +/* 3639 */ NULL, +/* 363a */ NULL, +/* 363b */ NULL, +/* 363c */ NULL, +/* 363d */ NULL, +/* 363e */ NULL, +/* 363f */ NULL, +/* 3640 */ NULL, +/* 3641 */ NULL, +/* 3642 */ NULL, +/* 3643 */ NULL, +/* 3644 */ NULL, +/* 3645 */ NULL, +/* 3646 */ NULL, +/* 3647 */ NULL, +/* 3648 */ NULL, +/* 3649 */ NULL, +/* 364a */ NULL, +/* 364b */ NULL, +/* 364c */ NULL, +/* 364d */ NULL, +/* 364e */ NULL, +/* 364f */ NULL, +/* 3650 */ NULL, +/* 3651 */ NULL, +/* 3652 */ NULL, +/* 3653 */ NULL, +/* 3654 */ NULL, +/* 3655 */ NULL, +/* 3656 */ NULL, +/* 3657 */ NULL, +/* 3658 */ NULL, +/* 3659 */ NULL, +/* 365a */ NULL, +/* 365b */ NULL, +/* 365c */ NULL, +/* 365d */ NULL, +/* 365e */ NULL, +/* 365f */ NULL, +/* 3660 */ NULL, +/* 3661 */ NULL, +/* 3662 */ NULL, +/* 3663 */ NULL, +/* 3664 */ NULL, +/* 3665 */ NULL, +/* 3666 */ NULL, +/* 3667 */ NULL, +/* 3668 */ NULL, +/* 3669 */ NULL, +/* 366a */ NULL, +/* 366b */ NULL, +/* 366c */ NULL, +/* 366d */ NULL, +/* 366e */ NULL, +/* 366f */ NULL, +/* 3670 */ NULL, +/* 3671 */ NULL, +/* 3672 */ NULL, +/* 3673 */ NULL, +/* 3674 */ NULL, +/* 3675 */ NULL, +/* 3676 */ NULL, +/* 3677 */ NULL, +/* 3678 */ NULL, +/* 3679 */ NULL, +/* 367a */ NULL, +/* 367b */ NULL, +/* 367c */ NULL, +/* 367d */ NULL, +/* 367e */ NULL, +/* 367f */ NULL, +/* 3680 */ NULL, +/* 3681 */ NULL, +/* 3682 */ NULL, +/* 3683 */ NULL, +/* 3684 */ NULL, +/* 3685 */ NULL, +/* 3686 */ NULL, +/* 3687 */ NULL, +/* 3688 */ NULL, +/* 3689 */ NULL, +/* 368a */ NULL, +/* 368b */ NULL, +/* 368c */ NULL, +/* 368d */ NULL, +/* 368e */ NULL, +/* 368f */ NULL, +/* 3690 */ NULL, +/* 3691 */ NULL, +/* 3692 */ NULL, +/* 3693 */ NULL, +/* 3694 */ NULL, +/* 3695 */ NULL, +/* 3696 */ NULL, +/* 3697 */ NULL, +/* 3698 */ NULL, +/* 3699 */ NULL, +/* 369a */ NULL, +/* 369b */ NULL, +/* 369c */ NULL, +/* 369d */ NULL, +/* 369e */ NULL, +/* 369f */ NULL, +/* 36a0 */ NULL, +/* 36a1 */ NULL, +/* 36a2 */ NULL, +/* 36a3 */ NULL, +/* 36a4 */ NULL, +/* 36a5 */ NULL, +/* 36a6 */ NULL, +/* 36a7 */ NULL, +/* 36a8 */ NULL, +/* 36a9 */ NULL, +/* 36aa */ NULL, +/* 36ab */ NULL, +/* 36ac */ NULL, +/* 36ad */ NULL, +/* 36ae */ NULL, +/* 36af */ NULL, +/* 36b0 */ NULL, +/* 36b1 */ NULL, +/* 36b2 */ NULL, +/* 36b3 */ NULL, +/* 36b4 */ NULL, +/* 36b5 */ NULL, +/* 36b6 */ NULL, +/* 36b7 */ NULL, +/* 36b8 */ NULL, +/* 36b9 */ NULL, +/* 36ba */ NULL, +/* 36bb */ NULL, +/* 36bc */ NULL, +/* 36bd */ NULL, +/* 36be */ NULL, +/* 36bf */ NULL, +/* 36c0 */ NULL, +/* 36c1 */ NULL, +/* 36c2 */ NULL, +/* 36c3 */ NULL, +/* 36c4 */ NULL, +/* 36c5 */ NULL, +/* 36c6 */ NULL, +/* 36c7 */ NULL, +/* 36c8 */ NULL, +/* 36c9 */ NULL, +/* 36ca */ NULL, +/* 36cb */ NULL, +/* 36cc */ NULL, +/* 36cd */ NULL, +/* 36ce */ NULL, +/* 36cf */ NULL, +/* 36d0 */ NULL, +/* 36d1 */ NULL, +/* 36d2 */ NULL, +/* 36d3 */ NULL, +/* 36d4 */ NULL, +/* 36d5 */ NULL, +/* 36d6 */ NULL, +/* 36d7 */ NULL, +/* 36d8 */ NULL, +/* 36d9 */ NULL, +/* 36da */ NULL, +/* 36db */ NULL, +/* 36dc */ NULL, +/* 36dd */ NULL, +/* 36de */ NULL, +/* 36df */ NULL, +/* 36e0 */ NULL, +/* 36e1 */ NULL, +/* 36e2 */ NULL, +/* 36e3 */ NULL, +/* 36e4 */ NULL, +/* 36e5 */ NULL, +/* 36e6 */ NULL, +/* 36e7 */ NULL, +/* 36e8 */ NULL, +/* 36e9 */ NULL, +/* 36ea */ NULL, +/* 36eb */ NULL, +/* 36ec */ NULL, +/* 36ed */ NULL, +/* 36ee */ NULL, +/* 36ef */ NULL, +/* 36f0 */ NULL, +/* 36f1 */ NULL, +/* 36f2 */ NULL, +/* 36f3 */ NULL, +/* 36f4 */ NULL, +/* 36f5 */ NULL, +/* 36f6 */ NULL, +/* 36f7 */ NULL, +/* 36f8 */ NULL, +/* 36f9 */ NULL, +/* 36fa */ NULL, +/* 36fb */ NULL, +/* 36fc */ NULL, +/* 36fd */ NULL, +/* 36fe */ NULL, +/* 36ff */ NULL, +/* 3700 */ NULL, +/* 3701 */ NULL, +/* 3702 */ NULL, +/* 3703 */ NULL, +/* 3704 */ NULL, +/* 3705 */ NULL, +/* 3706 */ NULL, +/* 3707 */ NULL, +/* 3708 */ NULL, +/* 3709 */ NULL, +/* 370a */ NULL, +/* 370b */ NULL, +/* 370c */ NULL, +/* 370d */ NULL, +/* 370e */ NULL, +/* 370f */ NULL, +/* 3710 */ NULL, +/* 3711 */ NULL, +/* 3712 */ NULL, +/* 3713 */ NULL, +/* 3714 */ NULL, +/* 3715 */ NULL, +/* 3716 */ NULL, +/* 3717 */ NULL, +/* 3718 */ NULL, +/* 3719 */ NULL, +/* 371a */ NULL, +/* 371b */ NULL, +/* 371c */ NULL, +/* 371d */ NULL, +/* 371e */ NULL, +/* 371f */ NULL, +/* 3720 */ NULL, +/* 3721 */ NULL, +/* 3722 */ NULL, +/* 3723 */ NULL, +/* 3724 */ NULL, +/* 3725 */ NULL, +/* 3726 */ NULL, +/* 3727 */ NULL, +/* 3728 */ NULL, +/* 3729 */ NULL, +/* 372a */ NULL, +/* 372b */ NULL, +/* 372c */ NULL, +/* 372d */ NULL, +/* 372e */ NULL, +/* 372f */ NULL, +/* 3730 */ NULL, +/* 3731 */ NULL, +/* 3732 */ NULL, +/* 3733 */ NULL, +/* 3734 */ NULL, +/* 3735 */ NULL, +/* 3736 */ NULL, +/* 3737 */ NULL, +/* 3738 */ NULL, +/* 3739 */ NULL, +/* 373a */ NULL, +/* 373b */ NULL, +/* 373c */ NULL, +/* 373d */ NULL, +/* 373e */ NULL, +/* 373f */ NULL, +/* 3740 */ NULL, +/* 3741 */ NULL, +/* 3742 */ NULL, +/* 3743 */ NULL, +/* 3744 */ NULL, +/* 3745 */ NULL, +/* 3746 */ NULL, +/* 3747 */ NULL, +/* 3748 */ NULL, +/* 3749 */ NULL, +/* 374a */ NULL, +/* 374b */ NULL, +/* 374c */ NULL, +/* 374d */ NULL, +/* 374e */ NULL, +/* 374f */ NULL, +/* 3750 */ NULL, +/* 3751 */ NULL, +/* 3752 */ NULL, +/* 3753 */ NULL, +/* 3754 */ NULL, +/* 3755 */ NULL, +/* 3756 */ NULL, +/* 3757 */ NULL, +/* 3758 */ NULL, +/* 3759 */ NULL, +/* 375a */ NULL, +/* 375b */ NULL, +/* 375c */ NULL, +/* 375d */ NULL, +/* 375e */ NULL, +/* 375f */ NULL, +/* 3760 */ NULL, +/* 3761 */ NULL, +/* 3762 */ NULL, +/* 3763 */ NULL, +/* 3764 */ NULL, +/* 3765 */ NULL, +/* 3766 */ NULL, +/* 3767 */ NULL, +/* 3768 */ NULL, +/* 3769 */ NULL, +/* 376a */ NULL, +/* 376b */ NULL, +/* 376c */ NULL, +/* 376d */ NULL, +/* 376e */ NULL, +/* 376f */ NULL, +/* 3770 */ NULL, +/* 3771 */ NULL, +/* 3772 */ NULL, +/* 3773 */ NULL, +/* 3774 */ NULL, +/* 3775 */ NULL, +/* 3776 */ NULL, +/* 3777 */ NULL, +/* 3778 */ NULL, +/* 3779 */ NULL, +/* 377a */ NULL, +/* 377b */ NULL, +/* 377c */ NULL, +/* 377d */ NULL, +/* 377e */ NULL, +/* 377f */ NULL, +/* 3780 */ NULL, +/* 3781 */ NULL, +/* 3782 */ NULL, +/* 3783 */ NULL, +/* 3784 */ NULL, +/* 3785 */ NULL, +/* 3786 */ NULL, +/* 3787 */ NULL, +/* 3788 */ NULL, +/* 3789 */ NULL, +/* 378a */ NULL, +/* 378b */ NULL, +/* 378c */ NULL, +/* 378d */ NULL, +/* 378e */ NULL, +/* 378f */ NULL, +/* 3790 */ NULL, +/* 3791 */ NULL, +/* 3792 */ NULL, +/* 3793 */ NULL, +/* 3794 */ NULL, +/* 3795 */ NULL, +/* 3796 */ NULL, +/* 3797 */ NULL, +/* 3798 */ NULL, +/* 3799 */ NULL, +/* 379a */ NULL, +/* 379b */ NULL, +/* 379c */ NULL, +/* 379d */ NULL, +/* 379e */ NULL, +/* 379f */ NULL, +/* 37a0 */ NULL, +/* 37a1 */ NULL, +/* 37a2 */ NULL, +/* 37a3 */ NULL, +/* 37a4 */ NULL, +/* 37a5 */ NULL, +/* 37a6 */ NULL, +/* 37a7 */ NULL, +/* 37a8 */ NULL, +/* 37a9 */ NULL, +/* 37aa */ NULL, +/* 37ab */ NULL, +/* 37ac */ NULL, +/* 37ad */ NULL, +/* 37ae */ NULL, +/* 37af */ NULL, +/* 37b0 */ NULL, +/* 37b1 */ NULL, +/* 37b2 */ NULL, +/* 37b3 */ NULL, +/* 37b4 */ NULL, +/* 37b5 */ NULL, +/* 37b6 */ NULL, +/* 37b7 */ NULL, +/* 37b8 */ NULL, +/* 37b9 */ NULL, +/* 37ba */ NULL, +/* 37bb */ NULL, +/* 37bc */ NULL, +/* 37bd */ NULL, +/* 37be */ NULL, +/* 37bf */ NULL, +/* 37c0 */ NULL, +/* 37c1 */ NULL, +/* 37c2 */ NULL, +/* 37c3 */ NULL, +/* 37c4 */ NULL, +/* 37c5 */ NULL, +/* 37c6 */ NULL, +/* 37c7 */ NULL, +/* 37c8 */ NULL, +/* 37c9 */ NULL, +/* 37ca */ NULL, +/* 37cb */ NULL, +/* 37cc */ NULL, +/* 37cd */ NULL, +/* 37ce */ NULL, +/* 37cf */ NULL, +/* 37d0 */ NULL, +/* 37d1 */ NULL, +/* 37d2 */ NULL, +/* 37d3 */ NULL, +/* 37d4 */ NULL, +/* 37d5 */ NULL, +/* 37d6 */ NULL, +/* 37d7 */ NULL, +/* 37d8 */ NULL, +/* 37d9 */ NULL, +/* 37da */ NULL, +/* 37db */ NULL, +/* 37dc */ NULL, +/* 37dd */ NULL, +/* 37de */ NULL, +/* 37df */ NULL, +/* 37e0 */ NULL, +/* 37e1 */ NULL, +/* 37e2 */ NULL, +/* 37e3 */ NULL, +/* 37e4 */ NULL, +/* 37e5 */ NULL, +/* 37e6 */ NULL, +/* 37e7 */ NULL, +/* 37e8 */ NULL, +/* 37e9 */ NULL, +/* 37ea */ NULL, +/* 37eb */ NULL, +/* 37ec */ NULL, +/* 37ed */ NULL, +/* 37ee */ NULL, +/* 37ef */ NULL, +/* 37f0 */ NULL, +/* 37f1 */ NULL, +/* 37f2 */ NULL, +/* 37f3 */ NULL, +/* 37f4 */ NULL, +/* 37f5 */ NULL, +/* 37f6 */ NULL, +/* 37f7 */ NULL, +/* 37f8 */ NULL, +/* 37f9 */ NULL, +/* 37fa */ NULL, +/* 37fb */ NULL, +/* 37fc */ NULL, +/* 37fd */ NULL, +/* 37fe */ NULL, +/* 37ff */ NULL, +/* 3800 */ NULL, +/* 3801 */ NULL, +/* 3802 */ NULL, +/* 3803 */ NULL, +/* 3804 */ NULL, +/* 3805 */ NULL, +/* 3806 */ NULL, +/* 3807 */ NULL, +/* 3808 */ NULL, +/* 3809 */ NULL, +/* 380a */ NULL, +/* 380b */ NULL, +/* 380c */ NULL, +/* 380d */ NULL, +/* 380e */ NULL, +/* 380f */ NULL, +/* 3810 */ NULL, +/* 3811 */ NULL, +/* 3812 */ NULL, +/* 3813 */ NULL, +/* 3814 */ NULL, +/* 3815 */ NULL, +/* 3816 */ NULL, +/* 3817 */ NULL, +/* 3818 */ NULL, +/* 3819 */ NULL, +/* 381a */ NULL, +/* 381b */ NULL, +/* 381c */ NULL, +/* 381d */ NULL, +/* 381e */ NULL, +/* 381f */ NULL, +/* 3820 */ NULL, +/* 3821 */ NULL, +/* 3822 */ NULL, +/* 3823 */ NULL, +/* 3824 */ NULL, +/* 3825 */ NULL, +/* 3826 */ NULL, +/* 3827 */ NULL, +/* 3828 */ NULL, +/* 3829 */ NULL, +/* 382a */ NULL, +/* 382b */ NULL, +/* 382c */ NULL, +/* 382d */ NULL, +/* 382e */ NULL, +/* 382f */ NULL, +/* 3830 */ NULL, +/* 3831 */ NULL, +/* 3832 */ NULL, +/* 3833 */ NULL, +/* 3834 */ NULL, +/* 3835 */ NULL, +/* 3836 */ NULL, +/* 3837 */ NULL, +/* 3838 */ NULL, +/* 3839 */ NULL, +/* 383a */ NULL, +/* 383b */ NULL, +/* 383c */ NULL, +/* 383d */ NULL, +/* 383e */ NULL, +/* 383f */ NULL, +/* 3840 */ NULL, +/* 3841 */ NULL, +/* 3842 */ NULL, +/* 3843 */ NULL, +/* 3844 */ NULL, +/* 3845 */ NULL, +/* 3846 */ NULL, +/* 3847 */ NULL, +/* 3848 */ NULL, +/* 3849 */ NULL, +/* 384a */ NULL, +/* 384b */ NULL, +/* 384c */ NULL, +/* 384d */ NULL, +/* 384e */ NULL, +/* 384f */ NULL, +/* 3850 */ NULL, +/* 3851 */ NULL, +/* 3852 */ NULL, +/* 3853 */ NULL, +/* 3854 */ NULL, +/* 3855 */ NULL, +/* 3856 */ NULL, +/* 3857 */ NULL, +/* 3858 */ NULL, +/* 3859 */ NULL, +/* 385a */ NULL, +/* 385b */ NULL, +/* 385c */ NULL, +/* 385d */ NULL, +/* 385e */ NULL, +/* 385f */ NULL, +/* 3860 */ NULL, +/* 3861 */ NULL, +/* 3862 */ NULL, +/* 3863 */ NULL, +/* 3864 */ NULL, +/* 3865 */ NULL, +/* 3866 */ NULL, +/* 3867 */ NULL, +/* 3868 */ NULL, +/* 3869 */ NULL, +/* 386a */ NULL, +/* 386b */ NULL, +/* 386c */ NULL, +/* 386d */ NULL, +/* 386e */ NULL, +/* 386f */ NULL, +/* 3870 */ NULL, +/* 3871 */ NULL, +/* 3872 */ NULL, +/* 3873 */ NULL, +/* 3874 */ NULL, +/* 3875 */ NULL, +/* 3876 */ NULL, +/* 3877 */ NULL, +/* 3878 */ NULL, +/* 3879 */ NULL, +/* 387a */ NULL, +/* 387b */ NULL, +/* 387c */ NULL, +/* 387d */ NULL, +/* 387e */ NULL, +/* 387f */ NULL, +/* 3880 */ NULL, +/* 3881 */ NULL, +/* 3882 */ NULL, +/* 3883 */ NULL, +/* 3884 */ NULL, +/* 3885 */ NULL, +/* 3886 */ NULL, +/* 3887 */ NULL, +/* 3888 */ NULL, +/* 3889 */ NULL, +/* 388a */ NULL, +/* 388b */ NULL, +/* 388c */ NULL, +/* 388d */ NULL, +/* 388e */ NULL, +/* 388f */ NULL, +/* 3890 */ NULL, +/* 3891 */ NULL, +/* 3892 */ NULL, +/* 3893 */ NULL, +/* 3894 */ NULL, +/* 3895 */ NULL, +/* 3896 */ NULL, +/* 3897 */ NULL, +/* 3898 */ NULL, +/* 3899 */ NULL, +/* 389a */ NULL, +/* 389b */ NULL, +/* 389c */ NULL, +/* 389d */ NULL, +/* 389e */ NULL, +/* 389f */ NULL, +/* 38a0 */ NULL, +/* 38a1 */ NULL, +/* 38a2 */ NULL, +/* 38a3 */ NULL, +/* 38a4 */ NULL, +/* 38a5 */ NULL, +/* 38a6 */ NULL, +/* 38a7 */ NULL, +/* 38a8 */ NULL, +/* 38a9 */ NULL, +/* 38aa */ NULL, +/* 38ab */ NULL, +/* 38ac */ NULL, +/* 38ad */ NULL, +/* 38ae */ NULL, +/* 38af */ NULL, +/* 38b0 */ NULL, +/* 38b1 */ NULL, +/* 38b2 */ NULL, +/* 38b3 */ NULL, +/* 38b4 */ NULL, +/* 38b5 */ NULL, +/* 38b6 */ NULL, +/* 38b7 */ NULL, +/* 38b8 */ NULL, +/* 38b9 */ NULL, +/* 38ba */ NULL, +/* 38bb */ NULL, +/* 38bc */ NULL, +/* 38bd */ NULL, +/* 38be */ NULL, +/* 38bf */ NULL, +/* 38c0 */ NULL, +/* 38c1 */ NULL, +/* 38c2 */ NULL, +/* 38c3 */ NULL, +/* 38c4 */ NULL, +/* 38c5 */ NULL, +/* 38c6 */ NULL, +/* 38c7 */ NULL, +/* 38c8 */ NULL, +/* 38c9 */ NULL, +/* 38ca */ NULL, +/* 38cb */ NULL, +/* 38cc */ NULL, +/* 38cd */ NULL, +/* 38ce */ NULL, +/* 38cf */ NULL, +/* 38d0 */ NULL, +/* 38d1 */ NULL, +/* 38d2 */ NULL, +/* 38d3 */ NULL, +/* 38d4 */ NULL, +/* 38d5 */ NULL, +/* 38d6 */ NULL, +/* 38d7 */ NULL, +/* 38d8 */ NULL, +/* 38d9 */ NULL, +/* 38da */ NULL, +/* 38db */ NULL, +/* 38dc */ NULL, +/* 38dd */ NULL, +/* 38de */ NULL, +/* 38df */ NULL, +/* 38e0 */ NULL, +/* 38e1 */ NULL, +/* 38e2 */ NULL, +/* 38e3 */ NULL, +/* 38e4 */ NULL, +/* 38e5 */ NULL, +/* 38e6 */ NULL, +/* 38e7 */ NULL, +/* 38e8 */ NULL, +/* 38e9 */ NULL, +/* 38ea */ NULL, +/* 38eb */ NULL, +/* 38ec */ NULL, +/* 38ed */ NULL, +/* 38ee */ NULL, +/* 38ef */ NULL, +/* 38f0 */ NULL, +/* 38f1 */ NULL, +/* 38f2 */ NULL, +/* 38f3 */ NULL, +/* 38f4 */ NULL, +/* 38f5 */ NULL, +/* 38f6 */ NULL, +/* 38f7 */ NULL, +/* 38f8 */ NULL, +/* 38f9 */ NULL, +/* 38fa */ NULL, +/* 38fb */ NULL, +/* 38fc */ NULL, +/* 38fd */ NULL, +/* 38fe */ NULL, +/* 38ff */ NULL, +/* 3900 */ NULL, +/* 3901 */ NULL, +/* 3902 */ NULL, +/* 3903 */ NULL, +/* 3904 */ NULL, +/* 3905 */ NULL, +/* 3906 */ NULL, +/* 3907 */ NULL, +/* 3908 */ NULL, +/* 3909 */ NULL, +/* 390a */ NULL, +/* 390b */ NULL, +/* 390c */ NULL, +/* 390d */ NULL, +/* 390e */ NULL, +/* 390f */ NULL, +/* 3910 */ NULL, +/* 3911 */ NULL, +/* 3912 */ NULL, +/* 3913 */ NULL, +/* 3914 */ NULL, +/* 3915 */ NULL, +/* 3916 */ NULL, +/* 3917 */ NULL, +/* 3918 */ NULL, +/* 3919 */ NULL, +/* 391a */ NULL, +/* 391b */ NULL, +/* 391c */ NULL, +/* 391d */ NULL, +/* 391e */ NULL, +/* 391f */ NULL, +/* 3920 */ NULL, +/* 3921 */ NULL, +/* 3922 */ NULL, +/* 3923 */ NULL, +/* 3924 */ NULL, +/* 3925 */ NULL, +/* 3926 */ NULL, +/* 3927 */ NULL, +/* 3928 */ NULL, +/* 3929 */ NULL, +/* 392a */ NULL, +/* 392b */ NULL, +/* 392c */ NULL, +/* 392d */ NULL, +/* 392e */ NULL, +/* 392f */ NULL, +/* 3930 */ NULL, +/* 3931 */ NULL, +/* 3932 */ NULL, +/* 3933 */ NULL, +/* 3934 */ NULL, +/* 3935 */ NULL, +/* 3936 */ NULL, +/* 3937 */ NULL, +/* 3938 */ NULL, +/* 3939 */ NULL, +/* 393a */ NULL, +/* 393b */ NULL, +/* 393c */ NULL, +/* 393d */ NULL, +/* 393e */ NULL, +/* 393f */ NULL, +/* 3940 */ NULL, +/* 3941 */ NULL, +/* 3942 */ NULL, +/* 3943 */ NULL, +/* 3944 */ NULL, +/* 3945 */ NULL, +/* 3946 */ NULL, +/* 3947 */ NULL, +/* 3948 */ NULL, +/* 3949 */ NULL, +/* 394a */ NULL, +/* 394b */ NULL, +/* 394c */ NULL, +/* 394d */ NULL, +/* 394e */ NULL, +/* 394f */ NULL, +/* 3950 */ NULL, +/* 3951 */ NULL, +/* 3952 */ NULL, +/* 3953 */ NULL, +/* 3954 */ NULL, +/* 3955 */ NULL, +/* 3956 */ NULL, +/* 3957 */ NULL, +/* 3958 */ NULL, +/* 3959 */ NULL, +/* 395a */ NULL, +/* 395b */ NULL, +/* 395c */ NULL, +/* 395d */ NULL, +/* 395e */ NULL, +/* 395f */ NULL, +/* 3960 */ NULL, +/* 3961 */ NULL, +/* 3962 */ NULL, +/* 3963 */ NULL, +/* 3964 */ NULL, +/* 3965 */ NULL, +/* 3966 */ NULL, +/* 3967 */ NULL, +/* 3968 */ NULL, +/* 3969 */ NULL, +/* 396a */ NULL, +/* 396b */ NULL, +/* 396c */ NULL, +/* 396d */ NULL, +/* 396e */ NULL, +/* 396f */ NULL, +/* 3970 */ NULL, +/* 3971 */ NULL, +/* 3972 */ NULL, +/* 3973 */ NULL, +/* 3974 */ NULL, +/* 3975 */ NULL, +/* 3976 */ NULL, +/* 3977 */ NULL, +/* 3978 */ NULL, +/* 3979 */ NULL, +/* 397a */ NULL, +/* 397b */ NULL, +/* 397c */ NULL, +/* 397d */ NULL, +/* 397e */ NULL, +/* 397f */ NULL, +/* 3980 */ NULL, +/* 3981 */ NULL, +/* 3982 */ NULL, +/* 3983 */ NULL, +/* 3984 */ NULL, +/* 3985 */ NULL, +/* 3986 */ NULL, +/* 3987 */ NULL, +/* 3988 */ NULL, +/* 3989 */ NULL, +/* 398a */ NULL, +/* 398b */ NULL, +/* 398c */ NULL, +/* 398d */ NULL, +/* 398e */ NULL, +/* 398f */ NULL, +/* 3990 */ NULL, +/* 3991 */ NULL, +/* 3992 */ NULL, +/* 3993 */ NULL, +/* 3994 */ NULL, +/* 3995 */ NULL, +/* 3996 */ NULL, +/* 3997 */ NULL, +/* 3998 */ NULL, +/* 3999 */ NULL, +/* 399a */ NULL, +/* 399b */ NULL, +/* 399c */ NULL, +/* 399d */ NULL, +/* 399e */ NULL, +/* 399f */ NULL, +/* 39a0 */ NULL, +/* 39a1 */ NULL, +/* 39a2 */ NULL, +/* 39a3 */ NULL, +/* 39a4 */ NULL, +/* 39a5 */ NULL, +/* 39a6 */ NULL, +/* 39a7 */ NULL, +/* 39a8 */ NULL, +/* 39a9 */ NULL, +/* 39aa */ NULL, +/* 39ab */ NULL, +/* 39ac */ NULL, +/* 39ad */ NULL, +/* 39ae */ NULL, +/* 39af */ NULL, +/* 39b0 */ NULL, +/* 39b1 */ NULL, +/* 39b2 */ NULL, +/* 39b3 */ NULL, +/* 39b4 */ NULL, +/* 39b5 */ NULL, +/* 39b6 */ NULL, +/* 39b7 */ NULL, +/* 39b8 */ NULL, +/* 39b9 */ NULL, +/* 39ba */ NULL, +/* 39bb */ NULL, +/* 39bc */ NULL, +/* 39bd */ NULL, +/* 39be */ NULL, +/* 39bf */ NULL, +/* 39c0 */ NULL, +/* 39c1 */ NULL, +/* 39c2 */ NULL, +/* 39c3 */ NULL, +/* 39c4 */ NULL, +/* 39c5 */ NULL, +/* 39c6 */ NULL, +/* 39c7 */ NULL, +/* 39c8 */ NULL, +/* 39c9 */ NULL, +/* 39ca */ NULL, +/* 39cb */ NULL, +/* 39cc */ NULL, +/* 39cd */ NULL, +/* 39ce */ NULL, +/* 39cf */ NULL, +/* 39d0 */ NULL, +/* 39d1 */ NULL, +/* 39d2 */ NULL, +/* 39d3 */ NULL, +/* 39d4 */ NULL, +/* 39d5 */ NULL, +/* 39d6 */ NULL, +/* 39d7 */ NULL, +/* 39d8 */ NULL, +/* 39d9 */ NULL, +/* 39da */ NULL, +/* 39db */ NULL, +/* 39dc */ NULL, +/* 39dd */ NULL, +/* 39de */ NULL, +/* 39df */ NULL, +/* 39e0 */ NULL, +/* 39e1 */ NULL, +/* 39e2 */ NULL, +/* 39e3 */ NULL, +/* 39e4 */ NULL, +/* 39e5 */ NULL, +/* 39e6 */ NULL, +/* 39e7 */ NULL, +/* 39e8 */ NULL, +/* 39e9 */ NULL, +/* 39ea */ NULL, +/* 39eb */ NULL, +/* 39ec */ NULL, +/* 39ed */ NULL, +/* 39ee */ NULL, +/* 39ef */ NULL, +/* 39f0 */ NULL, +/* 39f1 */ NULL, +/* 39f2 */ NULL, +/* 39f3 */ NULL, +/* 39f4 */ NULL, +/* 39f5 */ NULL, +/* 39f6 */ NULL, +/* 39f7 */ NULL, +/* 39f8 */ NULL, +/* 39f9 */ NULL, +/* 39fa */ NULL, +/* 39fb */ NULL, +/* 39fc */ NULL, +/* 39fd */ NULL, +/* 39fe */ NULL, +/* 39ff */ NULL, +/* 3a00 */ NULL, +/* 3a01 */ NULL, +/* 3a02 */ NULL, +/* 3a03 */ NULL, +/* 3a04 */ NULL, +/* 3a05 */ NULL, +/* 3a06 */ NULL, +/* 3a07 */ NULL, +/* 3a08 */ NULL, +/* 3a09 */ NULL, +/* 3a0a */ NULL, +/* 3a0b */ NULL, +/* 3a0c */ NULL, +/* 3a0d */ NULL, +/* 3a0e */ NULL, +/* 3a0f */ NULL, +/* 3a10 */ NULL, +/* 3a11 */ NULL, +/* 3a12 */ NULL, +/* 3a13 */ NULL, +/* 3a14 */ NULL, +/* 3a15 */ NULL, +/* 3a16 */ NULL, +/* 3a17 */ NULL, +/* 3a18 */ NULL, +/* 3a19 */ NULL, +/* 3a1a */ NULL, +/* 3a1b */ NULL, +/* 3a1c */ NULL, +/* 3a1d */ NULL, +/* 3a1e */ NULL, +/* 3a1f */ NULL, +/* 3a20 */ NULL, +/* 3a21 */ NULL, +/* 3a22 */ NULL, +/* 3a23 */ NULL, +/* 3a24 */ NULL, +/* 3a25 */ NULL, +/* 3a26 */ NULL, +/* 3a27 */ NULL, +/* 3a28 */ NULL, +/* 3a29 */ NULL, +/* 3a2a */ NULL, +/* 3a2b */ NULL, +/* 3a2c */ NULL, +/* 3a2d */ NULL, +/* 3a2e */ NULL, +/* 3a2f */ NULL, +/* 3a30 */ NULL, +/* 3a31 */ NULL, +/* 3a32 */ NULL, +/* 3a33 */ NULL, +/* 3a34 */ NULL, +/* 3a35 */ NULL, +/* 3a36 */ NULL, +/* 3a37 */ NULL, +/* 3a38 */ NULL, +/* 3a39 */ NULL, +/* 3a3a */ NULL, +/* 3a3b */ NULL, +/* 3a3c */ NULL, +/* 3a3d */ NULL, +/* 3a3e */ NULL, +/* 3a3f */ NULL, +/* 3a40 */ NULL, +/* 3a41 */ NULL, +/* 3a42 */ NULL, +/* 3a43 */ NULL, +/* 3a44 */ NULL, +/* 3a45 */ NULL, +/* 3a46 */ NULL, +/* 3a47 */ NULL, +/* 3a48 */ NULL, +/* 3a49 */ NULL, +/* 3a4a */ NULL, +/* 3a4b */ NULL, +/* 3a4c */ NULL, +/* 3a4d */ NULL, +/* 3a4e */ NULL, +/* 3a4f */ NULL, +/* 3a50 */ NULL, +/* 3a51 */ NULL, +/* 3a52 */ NULL, +/* 3a53 */ NULL, +/* 3a54 */ NULL, +/* 3a55 */ NULL, +/* 3a56 */ NULL, +/* 3a57 */ NULL, +/* 3a58 */ NULL, +/* 3a59 */ NULL, +/* 3a5a */ NULL, +/* 3a5b */ NULL, +/* 3a5c */ NULL, +/* 3a5d */ NULL, +/* 3a5e */ NULL, +/* 3a5f */ NULL, +/* 3a60 */ NULL, +/* 3a61 */ NULL, +/* 3a62 */ NULL, +/* 3a63 */ NULL, +/* 3a64 */ NULL, +/* 3a65 */ NULL, +/* 3a66 */ NULL, +/* 3a67 */ NULL, +/* 3a68 */ NULL, +/* 3a69 */ NULL, +/* 3a6a */ NULL, +/* 3a6b */ NULL, +/* 3a6c */ NULL, +/* 3a6d */ NULL, +/* 3a6e */ NULL, +/* 3a6f */ NULL, +/* 3a70 */ NULL, +/* 3a71 */ NULL, +/* 3a72 */ NULL, +/* 3a73 */ NULL, +/* 3a74 */ NULL, +/* 3a75 */ NULL, +/* 3a76 */ NULL, +/* 3a77 */ NULL, +/* 3a78 */ NULL, +/* 3a79 */ NULL, +/* 3a7a */ NULL, +/* 3a7b */ NULL, +/* 3a7c */ NULL, +/* 3a7d */ NULL, +/* 3a7e */ NULL, +/* 3a7f */ NULL, +/* 3a80 */ NULL, +/* 3a81 */ NULL, +/* 3a82 */ NULL, +/* 3a83 */ NULL, +/* 3a84 */ NULL, +/* 3a85 */ NULL, +/* 3a86 */ NULL, +/* 3a87 */ NULL, +/* 3a88 */ NULL, +/* 3a89 */ NULL, +/* 3a8a */ NULL, +/* 3a8b */ NULL, +/* 3a8c */ NULL, +/* 3a8d */ NULL, +/* 3a8e */ NULL, +/* 3a8f */ NULL, +/* 3a90 */ NULL, +/* 3a91 */ NULL, +/* 3a92 */ NULL, +/* 3a93 */ NULL, +/* 3a94 */ NULL, +/* 3a95 */ NULL, +/* 3a96 */ NULL, +/* 3a97 */ NULL, +/* 3a98 */ NULL, +/* 3a99 */ NULL, +/* 3a9a */ NULL, +/* 3a9b */ NULL, +/* 3a9c */ NULL, +/* 3a9d */ NULL, +/* 3a9e */ NULL, +/* 3a9f */ NULL, +/* 3aa0 */ NULL, +/* 3aa1 */ NULL, +/* 3aa2 */ NULL, +/* 3aa3 */ NULL, +/* 3aa4 */ NULL, +/* 3aa5 */ NULL, +/* 3aa6 */ NULL, +/* 3aa7 */ NULL, +/* 3aa8 */ NULL, +/* 3aa9 */ NULL, +/* 3aaa */ NULL, +/* 3aab */ NULL, +/* 3aac */ NULL, +/* 3aad */ NULL, +/* 3aae */ NULL, +/* 3aaf */ NULL, +/* 3ab0 */ NULL, +/* 3ab1 */ NULL, +/* 3ab2 */ NULL, +/* 3ab3 */ NULL, +/* 3ab4 */ NULL, +/* 3ab5 */ NULL, +/* 3ab6 */ NULL, +/* 3ab7 */ NULL, +/* 3ab8 */ NULL, +/* 3ab9 */ NULL, +/* 3aba */ NULL, +/* 3abb */ NULL, +/* 3abc */ NULL, +/* 3abd */ NULL, +/* 3abe */ NULL, +/* 3abf */ NULL, +/* 3ac0 */ NULL, +/* 3ac1 */ NULL, +/* 3ac2 */ NULL, +/* 3ac3 */ NULL, +/* 3ac4 */ NULL, +/* 3ac5 */ NULL, +/* 3ac6 */ NULL, +/* 3ac7 */ NULL, +/* 3ac8 */ NULL, +/* 3ac9 */ NULL, +/* 3aca */ NULL, +/* 3acb */ NULL, +/* 3acc */ NULL, +/* 3acd */ NULL, +/* 3ace */ NULL, +/* 3acf */ NULL, +/* 3ad0 */ NULL, +/* 3ad1 */ NULL, +/* 3ad2 */ NULL, +/* 3ad3 */ NULL, +/* 3ad4 */ NULL, +/* 3ad5 */ NULL, +/* 3ad6 */ NULL, +/* 3ad7 */ NULL, +/* 3ad8 */ NULL, +/* 3ad9 */ NULL, +/* 3ada */ NULL, +/* 3adb */ NULL, +/* 3adc */ NULL, +/* 3add */ NULL, +/* 3ade */ NULL, +/* 3adf */ NULL, +/* 3ae0 */ NULL, +/* 3ae1 */ NULL, +/* 3ae2 */ NULL, +/* 3ae3 */ NULL, +/* 3ae4 */ NULL, +/* 3ae5 */ NULL, +/* 3ae6 */ NULL, +/* 3ae7 */ NULL, +/* 3ae8 */ NULL, +/* 3ae9 */ NULL, +/* 3aea */ NULL, +/* 3aeb */ NULL, +/* 3aec */ NULL, +/* 3aed */ NULL, +/* 3aee */ NULL, +/* 3aef */ NULL, +/* 3af0 */ NULL, +/* 3af1 */ NULL, +/* 3af2 */ NULL, +/* 3af3 */ NULL, +/* 3af4 */ NULL, +/* 3af5 */ NULL, +/* 3af6 */ NULL, +/* 3af7 */ NULL, +/* 3af8 */ NULL, +/* 3af9 */ NULL, +/* 3afa */ NULL, +/* 3afb */ NULL, +/* 3afc */ NULL, +/* 3afd */ NULL, +/* 3afe */ NULL, +/* 3aff */ NULL, +/* 3b00 */ NULL, +/* 3b01 */ NULL, +/* 3b02 */ NULL, +/* 3b03 */ NULL, +/* 3b04 */ NULL, +/* 3b05 */ NULL, +/* 3b06 */ NULL, +/* 3b07 */ NULL, +/* 3b08 */ NULL, +/* 3b09 */ NULL, +/* 3b0a */ NULL, +/* 3b0b */ NULL, +/* 3b0c */ NULL, +/* 3b0d */ NULL, +/* 3b0e */ NULL, +/* 3b0f */ NULL, +/* 3b10 */ NULL, +/* 3b11 */ NULL, +/* 3b12 */ NULL, +/* 3b13 */ NULL, +/* 3b14 */ NULL, +/* 3b15 */ NULL, +/* 3b16 */ NULL, +/* 3b17 */ NULL, +/* 3b18 */ NULL, +/* 3b19 */ NULL, +/* 3b1a */ NULL, +/* 3b1b */ NULL, +/* 3b1c */ NULL, +/* 3b1d */ NULL, +/* 3b1e */ NULL, +/* 3b1f */ NULL, +/* 3b20 */ NULL, +/* 3b21 */ NULL, +/* 3b22 */ NULL, +/* 3b23 */ NULL, +/* 3b24 */ NULL, +/* 3b25 */ NULL, +/* 3b26 */ NULL, +/* 3b27 */ NULL, +/* 3b28 */ NULL, +/* 3b29 */ NULL, +/* 3b2a */ NULL, +/* 3b2b */ NULL, +/* 3b2c */ NULL, +/* 3b2d */ NULL, +/* 3b2e */ NULL, +/* 3b2f */ NULL, +/* 3b30 */ NULL, +/* 3b31 */ NULL, +/* 3b32 */ NULL, +/* 3b33 */ NULL, +/* 3b34 */ NULL, +/* 3b35 */ NULL, +/* 3b36 */ NULL, +/* 3b37 */ NULL, +/* 3b38 */ NULL, +/* 3b39 */ NULL, +/* 3b3a */ NULL, +/* 3b3b */ NULL, +/* 3b3c */ NULL, +/* 3b3d */ NULL, +/* 3b3e */ NULL, +/* 3b3f */ NULL, +/* 3b40 */ NULL, +/* 3b41 */ NULL, +/* 3b42 */ NULL, +/* 3b43 */ NULL, +/* 3b44 */ NULL, +/* 3b45 */ NULL, +/* 3b46 */ NULL, +/* 3b47 */ NULL, +/* 3b48 */ NULL, +/* 3b49 */ NULL, +/* 3b4a */ NULL, +/* 3b4b */ NULL, +/* 3b4c */ NULL, +/* 3b4d */ NULL, +/* 3b4e */ NULL, +/* 3b4f */ NULL, +/* 3b50 */ NULL, +/* 3b51 */ NULL, +/* 3b52 */ NULL, +/* 3b53 */ NULL, +/* 3b54 */ NULL, +/* 3b55 */ NULL, +/* 3b56 */ NULL, +/* 3b57 */ NULL, +/* 3b58 */ NULL, +/* 3b59 */ NULL, +/* 3b5a */ NULL, +/* 3b5b */ NULL, +/* 3b5c */ NULL, +/* 3b5d */ NULL, +/* 3b5e */ NULL, +/* 3b5f */ NULL, +/* 3b60 */ NULL, +/* 3b61 */ NULL, +/* 3b62 */ NULL, +/* 3b63 */ NULL, +/* 3b64 */ NULL, +/* 3b65 */ NULL, +/* 3b66 */ NULL, +/* 3b67 */ NULL, +/* 3b68 */ NULL, +/* 3b69 */ NULL, +/* 3b6a */ NULL, +/* 3b6b */ NULL, +/* 3b6c */ NULL, +/* 3b6d */ NULL, +/* 3b6e */ NULL, +/* 3b6f */ NULL, +/* 3b70 */ NULL, +/* 3b71 */ NULL, +/* 3b72 */ NULL, +/* 3b73 */ NULL, +/* 3b74 */ NULL, +/* 3b75 */ NULL, +/* 3b76 */ NULL, +/* 3b77 */ NULL, +/* 3b78 */ NULL, +/* 3b79 */ NULL, +/* 3b7a */ NULL, +/* 3b7b */ NULL, +/* 3b7c */ NULL, +/* 3b7d */ NULL, +/* 3b7e */ NULL, +/* 3b7f */ NULL, +/* 3b80 */ NULL, +/* 3b81 */ NULL, +/* 3b82 */ NULL, +/* 3b83 */ NULL, +/* 3b84 */ NULL, +/* 3b85 */ NULL, +/* 3b86 */ NULL, +/* 3b87 */ NULL, +/* 3b88 */ NULL, +/* 3b89 */ NULL, +/* 3b8a */ NULL, +/* 3b8b */ NULL, +/* 3b8c */ NULL, +/* 3b8d */ NULL, +/* 3b8e */ NULL, +/* 3b8f */ NULL, +/* 3b90 */ NULL, +/* 3b91 */ NULL, +/* 3b92 */ NULL, +/* 3b93 */ NULL, +/* 3b94 */ NULL, +/* 3b95 */ NULL, +/* 3b96 */ NULL, +/* 3b97 */ NULL, +/* 3b98 */ NULL, +/* 3b99 */ NULL, +/* 3b9a */ NULL, +/* 3b9b */ NULL, +/* 3b9c */ NULL, +/* 3b9d */ NULL, +/* 3b9e */ NULL, +/* 3b9f */ NULL, +/* 3ba0 */ NULL, +/* 3ba1 */ NULL, +/* 3ba2 */ NULL, +/* 3ba3 */ NULL, +/* 3ba4 */ NULL, +/* 3ba5 */ NULL, +/* 3ba6 */ NULL, +/* 3ba7 */ NULL, +/* 3ba8 */ NULL, +/* 3ba9 */ NULL, +/* 3baa */ NULL, +/* 3bab */ NULL, +/* 3bac */ NULL, +/* 3bad */ NULL, +/* 3bae */ NULL, +/* 3baf */ NULL, +/* 3bb0 */ NULL, +/* 3bb1 */ NULL, +/* 3bb2 */ NULL, +/* 3bb3 */ NULL, +/* 3bb4 */ NULL, +/* 3bb5 */ NULL, +/* 3bb6 */ NULL, +/* 3bb7 */ NULL, +/* 3bb8 */ NULL, +/* 3bb9 */ NULL, +/* 3bba */ NULL, +/* 3bbb */ NULL, +/* 3bbc */ NULL, +/* 3bbd */ NULL, +/* 3bbe */ NULL, +/* 3bbf */ NULL, +/* 3bc0 */ NULL, +/* 3bc1 */ NULL, +/* 3bc2 */ NULL, +/* 3bc3 */ NULL, +/* 3bc4 */ NULL, +/* 3bc5 */ NULL, +/* 3bc6 */ NULL, +/* 3bc7 */ NULL, +/* 3bc8 */ NULL, +/* 3bc9 */ NULL, +/* 3bca */ NULL, +/* 3bcb */ NULL, +/* 3bcc */ NULL, +/* 3bcd */ NULL, +/* 3bce */ NULL, +/* 3bcf */ NULL, +/* 3bd0 */ NULL, +/* 3bd1 */ NULL, +/* 3bd2 */ NULL, +/* 3bd3 */ NULL, +/* 3bd4 */ NULL, +/* 3bd5 */ NULL, +/* 3bd6 */ NULL, +/* 3bd7 */ NULL, +/* 3bd8 */ NULL, +/* 3bd9 */ NULL, +/* 3bda */ NULL, +/* 3bdb */ NULL, +/* 3bdc */ NULL, +/* 3bdd */ NULL, +/* 3bde */ NULL, +/* 3bdf */ NULL, +/* 3be0 */ NULL, +/* 3be1 */ NULL, +/* 3be2 */ NULL, +/* 3be3 */ NULL, +/* 3be4 */ NULL, +/* 3be5 */ NULL, +/* 3be6 */ NULL, +/* 3be7 */ NULL, +/* 3be8 */ NULL, +/* 3be9 */ NULL, +/* 3bea */ NULL, +/* 3beb */ NULL, +/* 3bec */ NULL, +/* 3bed */ NULL, +/* 3bee */ NULL, +/* 3bef */ NULL, +/* 3bf0 */ NULL, +/* 3bf1 */ NULL, +/* 3bf2 */ NULL, +/* 3bf3 */ NULL, +/* 3bf4 */ NULL, +/* 3bf5 */ NULL, +/* 3bf6 */ NULL, +/* 3bf7 */ NULL, +/* 3bf8 */ NULL, +/* 3bf9 */ NULL, +/* 3bfa */ NULL, +/* 3bfb */ NULL, +/* 3bfc */ NULL, +/* 3bfd */ NULL, +/* 3bfe */ NULL, +/* 3bff */ NULL, +/* 3c00 */ NULL, +/* 3c01 */ NULL, +/* 3c02 */ NULL, +/* 3c03 */ NULL, +/* 3c04 */ NULL, +/* 3c05 */ NULL, +/* 3c06 */ NULL, +/* 3c07 */ NULL, +/* 3c08 */ NULL, +/* 3c09 */ NULL, +/* 3c0a */ NULL, +/* 3c0b */ NULL, +/* 3c0c */ NULL, +/* 3c0d */ NULL, +/* 3c0e */ NULL, +/* 3c0f */ NULL, +/* 3c10 */ NULL, +/* 3c11 */ NULL, +/* 3c12 */ NULL, +/* 3c13 */ NULL, +/* 3c14 */ NULL, +/* 3c15 */ NULL, +/* 3c16 */ NULL, +/* 3c17 */ NULL, +/* 3c18 */ NULL, +/* 3c19 */ NULL, +/* 3c1a */ NULL, +/* 3c1b */ NULL, +/* 3c1c */ NULL, +/* 3c1d */ NULL, +/* 3c1e */ NULL, +/* 3c1f */ NULL, +/* 3c20 */ NULL, +/* 3c21 */ NULL, +/* 3c22 */ NULL, +/* 3c23 */ NULL, +/* 3c24 */ NULL, +/* 3c25 */ NULL, +/* 3c26 */ NULL, +/* 3c27 */ NULL, +/* 3c28 */ NULL, +/* 3c29 */ NULL, +/* 3c2a */ NULL, +/* 3c2b */ NULL, +/* 3c2c */ NULL, +/* 3c2d */ NULL, +/* 3c2e */ NULL, +/* 3c2f */ NULL, +/* 3c30 */ NULL, +/* 3c31 */ NULL, +/* 3c32 */ NULL, +/* 3c33 */ NULL, +/* 3c34 */ NULL, +/* 3c35 */ NULL, +/* 3c36 */ NULL, +/* 3c37 */ NULL, +/* 3c38 */ NULL, +/* 3c39 */ NULL, +/* 3c3a */ NULL, +/* 3c3b */ NULL, +/* 3c3c */ NULL, +/* 3c3d */ NULL, +/* 3c3e */ NULL, +/* 3c3f */ NULL, +/* 3c40 */ NULL, +/* 3c41 */ NULL, +/* 3c42 */ NULL, +/* 3c43 */ NULL, +/* 3c44 */ NULL, +/* 3c45 */ NULL, +/* 3c46 */ NULL, +/* 3c47 */ NULL, +/* 3c48 */ NULL, +/* 3c49 */ NULL, +/* 3c4a */ NULL, +/* 3c4b */ NULL, +/* 3c4c */ NULL, +/* 3c4d */ NULL, +/* 3c4e */ NULL, +/* 3c4f */ NULL, +/* 3c50 */ NULL, +/* 3c51 */ NULL, +/* 3c52 */ NULL, +/* 3c53 */ NULL, +/* 3c54 */ NULL, +/* 3c55 */ NULL, +/* 3c56 */ NULL, +/* 3c57 */ NULL, +/* 3c58 */ NULL, +/* 3c59 */ NULL, +/* 3c5a */ NULL, +/* 3c5b */ NULL, +/* 3c5c */ NULL, +/* 3c5d */ NULL, +/* 3c5e */ NULL, +/* 3c5f */ NULL, +/* 3c60 */ NULL, +/* 3c61 */ NULL, +/* 3c62 */ NULL, +/* 3c63 */ NULL, +/* 3c64 */ NULL, +/* 3c65 */ NULL, +/* 3c66 */ NULL, +/* 3c67 */ NULL, +/* 3c68 */ NULL, +/* 3c69 */ NULL, +/* 3c6a */ NULL, +/* 3c6b */ NULL, +/* 3c6c */ NULL, +/* 3c6d */ NULL, +/* 3c6e */ NULL, +/* 3c6f */ NULL, +/* 3c70 */ NULL, +/* 3c71 */ NULL, +/* 3c72 */ NULL, +/* 3c73 */ NULL, +/* 3c74 */ NULL, +/* 3c75 */ NULL, +/* 3c76 */ NULL, +/* 3c77 */ NULL, +/* 3c78 */ NULL, +/* 3c79 */ NULL, +/* 3c7a */ NULL, +/* 3c7b */ NULL, +/* 3c7c */ NULL, +/* 3c7d */ NULL, +/* 3c7e */ NULL, +/* 3c7f */ NULL, +/* 3c80 */ NULL, +/* 3c81 */ NULL, +/* 3c82 */ NULL, +/* 3c83 */ NULL, +/* 3c84 */ NULL, +/* 3c85 */ NULL, +/* 3c86 */ NULL, +/* 3c87 */ NULL, +/* 3c88 */ NULL, +/* 3c89 */ NULL, +/* 3c8a */ NULL, +/* 3c8b */ NULL, +/* 3c8c */ NULL, +/* 3c8d */ NULL, +/* 3c8e */ NULL, +/* 3c8f */ NULL, +/* 3c90 */ NULL, +/* 3c91 */ NULL, +/* 3c92 */ NULL, +/* 3c93 */ NULL, +/* 3c94 */ NULL, +/* 3c95 */ NULL, +/* 3c96 */ NULL, +/* 3c97 */ NULL, +/* 3c98 */ NULL, +/* 3c99 */ NULL, +/* 3c9a */ NULL, +/* 3c9b */ NULL, +/* 3c9c */ NULL, +/* 3c9d */ NULL, +/* 3c9e */ NULL, +/* 3c9f */ NULL, +/* 3ca0 */ NULL, +/* 3ca1 */ NULL, +/* 3ca2 */ NULL, +/* 3ca3 */ NULL, +/* 3ca4 */ NULL, +/* 3ca5 */ NULL, +/* 3ca6 */ NULL, +/* 3ca7 */ NULL, +/* 3ca8 */ NULL, +/* 3ca9 */ NULL, +/* 3caa */ NULL, +/* 3cab */ NULL, +/* 3cac */ NULL, +/* 3cad */ NULL, +/* 3cae */ NULL, +/* 3caf */ NULL, +/* 3cb0 */ NULL, +/* 3cb1 */ NULL, +/* 3cb2 */ NULL, +/* 3cb3 */ NULL, +/* 3cb4 */ NULL, +/* 3cb5 */ NULL, +/* 3cb6 */ NULL, +/* 3cb7 */ NULL, +/* 3cb8 */ NULL, +/* 3cb9 */ NULL, +/* 3cba */ NULL, +/* 3cbb */ NULL, +/* 3cbc */ NULL, +/* 3cbd */ NULL, +/* 3cbe */ NULL, +/* 3cbf */ NULL, +/* 3cc0 */ NULL, +/* 3cc1 */ NULL, +/* 3cc2 */ NULL, +/* 3cc3 */ NULL, +/* 3cc4 */ NULL, +/* 3cc5 */ NULL, +/* 3cc6 */ NULL, +/* 3cc7 */ NULL, +/* 3cc8 */ NULL, +/* 3cc9 */ NULL, +/* 3cca */ NULL, +/* 3ccb */ NULL, +/* 3ccc */ NULL, +/* 3ccd */ NULL, +/* 3cce */ NULL, +/* 3ccf */ NULL, +/* 3cd0 */ NULL, +/* 3cd1 */ NULL, +/* 3cd2 */ NULL, +/* 3cd3 */ NULL, +/* 3cd4 */ NULL, +/* 3cd5 */ NULL, +/* 3cd6 */ NULL, +/* 3cd7 */ NULL, +/* 3cd8 */ NULL, +/* 3cd9 */ NULL, +/* 3cda */ NULL, +/* 3cdb */ NULL, +/* 3cdc */ NULL, +/* 3cdd */ NULL, +/* 3cde */ NULL, +/* 3cdf */ NULL, +/* 3ce0 */ NULL, +/* 3ce1 */ NULL, +/* 3ce2 */ NULL, +/* 3ce3 */ NULL, +/* 3ce4 */ NULL, +/* 3ce5 */ NULL, +/* 3ce6 */ NULL, +/* 3ce7 */ NULL, +/* 3ce8 */ NULL, +/* 3ce9 */ NULL, +/* 3cea */ NULL, +/* 3ceb */ NULL, +/* 3cec */ NULL, +/* 3ced */ NULL, +/* 3cee */ NULL, +/* 3cef */ NULL, +/* 3cf0 */ NULL, +/* 3cf1 */ NULL, +/* 3cf2 */ NULL, +/* 3cf3 */ NULL, +/* 3cf4 */ NULL, +/* 3cf5 */ NULL, +/* 3cf6 */ NULL, +/* 3cf7 */ NULL, +/* 3cf8 */ NULL, +/* 3cf9 */ NULL, +/* 3cfa */ NULL, +/* 3cfb */ NULL, +/* 3cfc */ NULL, +/* 3cfd */ NULL, +/* 3cfe */ NULL, +/* 3cff */ NULL, +/* 3d00 */ NULL, +/* 3d01 */ NULL, +/* 3d02 */ NULL, +/* 3d03 */ NULL, +/* 3d04 */ NULL, +/* 3d05 */ NULL, +/* 3d06 */ NULL, +/* 3d07 */ NULL, +/* 3d08 */ NULL, +/* 3d09 */ NULL, +/* 3d0a */ NULL, +/* 3d0b */ NULL, +/* 3d0c */ NULL, +/* 3d0d */ NULL, +/* 3d0e */ NULL, +/* 3d0f */ NULL, +/* 3d10 */ NULL, +/* 3d11 */ NULL, +/* 3d12 */ NULL, +/* 3d13 */ NULL, +/* 3d14 */ NULL, +/* 3d15 */ NULL, +/* 3d16 */ NULL, +/* 3d17 */ NULL, +/* 3d18 */ NULL, +/* 3d19 */ NULL, +/* 3d1a */ NULL, +/* 3d1b */ NULL, +/* 3d1c */ NULL, +/* 3d1d */ NULL, +/* 3d1e */ NULL, +/* 3d1f */ NULL, +/* 3d20 */ NULL, +/* 3d21 */ NULL, +/* 3d22 */ NULL, +/* 3d23 */ NULL, +/* 3d24 */ NULL, +/* 3d25 */ NULL, +/* 3d26 */ NULL, +/* 3d27 */ NULL, +/* 3d28 */ NULL, +/* 3d29 */ NULL, +/* 3d2a */ NULL, +/* 3d2b */ NULL, +/* 3d2c */ NULL, +/* 3d2d */ NULL, +/* 3d2e */ NULL, +/* 3d2f */ NULL, +/* 3d30 */ NULL, +/* 3d31 */ NULL, +/* 3d32 */ NULL, +/* 3d33 */ NULL, +/* 3d34 */ NULL, +/* 3d35 */ NULL, +/* 3d36 */ NULL, +/* 3d37 */ NULL, +/* 3d38 */ NULL, +/* 3d39 */ NULL, +/* 3d3a */ NULL, +/* 3d3b */ NULL, +/* 3d3c */ NULL, +/* 3d3d */ NULL, +/* 3d3e */ NULL, +/* 3d3f */ NULL, +/* 3d40 */ NULL, +/* 3d41 */ NULL, +/* 3d42 */ NULL, +/* 3d43 */ NULL, +/* 3d44 */ NULL, +/* 3d45 */ NULL, +/* 3d46 */ NULL, +/* 3d47 */ NULL, +/* 3d48 */ NULL, +/* 3d49 */ NULL, +/* 3d4a */ NULL, +/* 3d4b */ NULL, +/* 3d4c */ NULL, +/* 3d4d */ NULL, +/* 3d4e */ NULL, +/* 3d4f */ NULL, +/* 3d50 */ NULL, +/* 3d51 */ NULL, +/* 3d52 */ NULL, +/* 3d53 */ NULL, +/* 3d54 */ NULL, +/* 3d55 */ NULL, +/* 3d56 */ NULL, +/* 3d57 */ NULL, +/* 3d58 */ NULL, +/* 3d59 */ NULL, +/* 3d5a */ NULL, +/* 3d5b */ NULL, +/* 3d5c */ NULL, +/* 3d5d */ NULL, +/* 3d5e */ NULL, +/* 3d5f */ NULL, +/* 3d60 */ NULL, +/* 3d61 */ NULL, +/* 3d62 */ NULL, +/* 3d63 */ NULL, +/* 3d64 */ NULL, +/* 3d65 */ NULL, +/* 3d66 */ NULL, +/* 3d67 */ NULL, +/* 3d68 */ NULL, +/* 3d69 */ NULL, +/* 3d6a */ NULL, +/* 3d6b */ NULL, +/* 3d6c */ NULL, +/* 3d6d */ NULL, +/* 3d6e */ NULL, +/* 3d6f */ NULL, +/* 3d70 */ NULL, +/* 3d71 */ NULL, +/* 3d72 */ NULL, +/* 3d73 */ NULL, +/* 3d74 */ NULL, +/* 3d75 */ NULL, +/* 3d76 */ NULL, +/* 3d77 */ NULL, +/* 3d78 */ NULL, +/* 3d79 */ NULL, +/* 3d7a */ NULL, +/* 3d7b */ NULL, +/* 3d7c */ NULL, +/* 3d7d */ NULL, +/* 3d7e */ NULL, +/* 3d7f */ NULL, +/* 3d80 */ NULL, +/* 3d81 */ NULL, +/* 3d82 */ NULL, +/* 3d83 */ NULL, +/* 3d84 */ NULL, +/* 3d85 */ NULL, +/* 3d86 */ NULL, +/* 3d87 */ NULL, +/* 3d88 */ NULL, +/* 3d89 */ NULL, +/* 3d8a */ NULL, +/* 3d8b */ NULL, +/* 3d8c */ NULL, +/* 3d8d */ NULL, +/* 3d8e */ NULL, +/* 3d8f */ NULL, +/* 3d90 */ NULL, +/* 3d91 */ NULL, +/* 3d92 */ NULL, +/* 3d93 */ NULL, +/* 3d94 */ NULL, +/* 3d95 */ NULL, +/* 3d96 */ NULL, +/* 3d97 */ NULL, +/* 3d98 */ NULL, +/* 3d99 */ NULL, +/* 3d9a */ NULL, +/* 3d9b */ NULL, +/* 3d9c */ NULL, +/* 3d9d */ NULL, +/* 3d9e */ NULL, +/* 3d9f */ NULL, +/* 3da0 */ NULL, +/* 3da1 */ NULL, +/* 3da2 */ NULL, +/* 3da3 */ NULL, +/* 3da4 */ NULL, +/* 3da5 */ NULL, +/* 3da6 */ NULL, +/* 3da7 */ NULL, +/* 3da8 */ NULL, +/* 3da9 */ NULL, +/* 3daa */ NULL, +/* 3dab */ NULL, +/* 3dac */ NULL, +/* 3dad */ NULL, +/* 3dae */ NULL, +/* 3daf */ NULL, +/* 3db0 */ NULL, +/* 3db1 */ NULL, +/* 3db2 */ NULL, +/* 3db3 */ NULL, +/* 3db4 */ NULL, +/* 3db5 */ NULL, +/* 3db6 */ NULL, +/* 3db7 */ NULL, +/* 3db8 */ NULL, +/* 3db9 */ NULL, +/* 3dba */ NULL, +/* 3dbb */ NULL, +/* 3dbc */ NULL, +/* 3dbd */ NULL, +/* 3dbe */ NULL, +/* 3dbf */ NULL, +/* 3dc0 */ NULL, +/* 3dc1 */ NULL, +/* 3dc2 */ NULL, +/* 3dc3 */ NULL, +/* 3dc4 */ NULL, +/* 3dc5 */ NULL, +/* 3dc6 */ NULL, +/* 3dc7 */ NULL, +/* 3dc8 */ NULL, +/* 3dc9 */ NULL, +/* 3dca */ NULL, +/* 3dcb */ NULL, +/* 3dcc */ NULL, +/* 3dcd */ NULL, +/* 3dce */ NULL, +/* 3dcf */ NULL, +/* 3dd0 */ NULL, +/* 3dd1 */ NULL, +/* 3dd2 */ NULL, +/* 3dd3 */ NULL, +/* 3dd4 */ NULL, +/* 3dd5 */ NULL, +/* 3dd6 */ NULL, +/* 3dd7 */ NULL, +/* 3dd8 */ NULL, +/* 3dd9 */ NULL, +/* 3dda */ NULL, +/* 3ddb */ NULL, +/* 3ddc */ NULL, +/* 3ddd */ NULL, +/* 3dde */ NULL, +/* 3ddf */ NULL, +/* 3de0 */ NULL, +/* 3de1 */ NULL, +/* 3de2 */ NULL, +/* 3de3 */ NULL, +/* 3de4 */ NULL, +/* 3de5 */ NULL, +/* 3de6 */ NULL, +/* 3de7 */ NULL, +/* 3de8 */ NULL, +/* 3de9 */ NULL, +/* 3dea */ NULL, +/* 3deb */ NULL, +/* 3dec */ NULL, +/* 3ded */ NULL, +/* 3dee */ NULL, +/* 3def */ NULL, +/* 3df0 */ NULL, +/* 3df1 */ NULL, +/* 3df2 */ NULL, +/* 3df3 */ NULL, +/* 3df4 */ NULL, +/* 3df5 */ NULL, +/* 3df6 */ NULL, +/* 3df7 */ NULL, +/* 3df8 */ NULL, +/* 3df9 */ NULL, +/* 3dfa */ NULL, +/* 3dfb */ NULL, +/* 3dfc */ NULL, +/* 3dfd */ NULL, +/* 3dfe */ NULL, +/* 3dff */ NULL, +/* 3e00 */ NULL, +/* 3e01 */ NULL, +/* 3e02 */ NULL, +/* 3e03 */ NULL, +/* 3e04 */ NULL, +/* 3e05 */ NULL, +/* 3e06 */ NULL, +/* 3e07 */ NULL, +/* 3e08 */ NULL, +/* 3e09 */ NULL, +/* 3e0a */ NULL, +/* 3e0b */ NULL, +/* 3e0c */ NULL, +/* 3e0d */ NULL, +/* 3e0e */ NULL, +/* 3e0f */ NULL, +/* 3e10 */ NULL, +/* 3e11 */ NULL, +/* 3e12 */ NULL, +/* 3e13 */ NULL, +/* 3e14 */ NULL, +/* 3e15 */ NULL, +/* 3e16 */ NULL, +/* 3e17 */ NULL, +/* 3e18 */ NULL, +/* 3e19 */ NULL, +/* 3e1a */ NULL, +/* 3e1b */ NULL, +/* 3e1c */ NULL, +/* 3e1d */ NULL, +/* 3e1e */ NULL, +/* 3e1f */ NULL, +/* 3e20 */ NULL, +/* 3e21 */ NULL, +/* 3e22 */ NULL, +/* 3e23 */ NULL, +/* 3e24 */ NULL, +/* 3e25 */ NULL, +/* 3e26 */ NULL, +/* 3e27 */ NULL, +/* 3e28 */ NULL, +/* 3e29 */ NULL, +/* 3e2a */ NULL, +/* 3e2b */ NULL, +/* 3e2c */ NULL, +/* 3e2d */ NULL, +/* 3e2e */ NULL, +/* 3e2f */ NULL, +/* 3e30 */ NULL, +/* 3e31 */ NULL, +/* 3e32 */ NULL, +/* 3e33 */ NULL, +/* 3e34 */ NULL, +/* 3e35 */ NULL, +/* 3e36 */ NULL, +/* 3e37 */ NULL, +/* 3e38 */ NULL, +/* 3e39 */ NULL, +/* 3e3a */ NULL, +/* 3e3b */ NULL, +/* 3e3c */ NULL, +/* 3e3d */ NULL, +/* 3e3e */ NULL, +/* 3e3f */ NULL, +/* 3e40 */ NULL, +/* 3e41 */ NULL, +/* 3e42 */ NULL, +/* 3e43 */ NULL, +/* 3e44 */ NULL, +/* 3e45 */ NULL, +/* 3e46 */ NULL, +/* 3e47 */ NULL, +/* 3e48 */ NULL, +/* 3e49 */ NULL, +/* 3e4a */ NULL, +/* 3e4b */ NULL, +/* 3e4c */ NULL, +/* 3e4d */ NULL, +/* 3e4e */ NULL, +/* 3e4f */ NULL, +/* 3e50 */ NULL, +/* 3e51 */ NULL, +/* 3e52 */ NULL, +/* 3e53 */ NULL, +/* 3e54 */ NULL, +/* 3e55 */ NULL, +/* 3e56 */ NULL, +/* 3e57 */ NULL, +/* 3e58 */ NULL, +/* 3e59 */ NULL, +/* 3e5a */ NULL, +/* 3e5b */ NULL, +/* 3e5c */ NULL, +/* 3e5d */ NULL, +/* 3e5e */ NULL, +/* 3e5f */ NULL, +/* 3e60 */ NULL, +/* 3e61 */ NULL, +/* 3e62 */ NULL, +/* 3e63 */ NULL, +/* 3e64 */ NULL, +/* 3e65 */ NULL, +/* 3e66 */ NULL, +/* 3e67 */ NULL, +/* 3e68 */ NULL, +/* 3e69 */ NULL, +/* 3e6a */ NULL, +/* 3e6b */ NULL, +/* 3e6c */ NULL, +/* 3e6d */ NULL, +/* 3e6e */ NULL, +/* 3e6f */ NULL, +/* 3e70 */ NULL, +/* 3e71 */ NULL, +/* 3e72 */ NULL, +/* 3e73 */ NULL, +/* 3e74 */ NULL, +/* 3e75 */ NULL, +/* 3e76 */ NULL, +/* 3e77 */ NULL, +/* 3e78 */ NULL, +/* 3e79 */ NULL, +/* 3e7a */ NULL, +/* 3e7b */ NULL, +/* 3e7c */ NULL, +/* 3e7d */ NULL, +/* 3e7e */ NULL, +/* 3e7f */ NULL, +/* 3e80 */ NULL, +/* 3e81 */ NULL, +/* 3e82 */ NULL, +/* 3e83 */ NULL, +/* 3e84 */ NULL, +/* 3e85 */ NULL, +/* 3e86 */ NULL, +/* 3e87 */ NULL, +/* 3e88 */ NULL, +/* 3e89 */ NULL, +/* 3e8a */ NULL, +/* 3e8b */ NULL, +/* 3e8c */ NULL, +/* 3e8d */ NULL, +/* 3e8e */ NULL, +/* 3e8f */ NULL, +/* 3e90 */ NULL, +/* 3e91 */ NULL, +/* 3e92 */ NULL, +/* 3e93 */ NULL, +/* 3e94 */ NULL, +/* 3e95 */ NULL, +/* 3e96 */ NULL, +/* 3e97 */ NULL, +/* 3e98 */ NULL, +/* 3e99 */ NULL, +/* 3e9a */ NULL, +/* 3e9b */ NULL, +/* 3e9c */ NULL, +/* 3e9d */ NULL, +/* 3e9e */ NULL, +/* 3e9f */ NULL, +/* 3ea0 */ NULL, +/* 3ea1 */ NULL, +/* 3ea2 */ NULL, +/* 3ea3 */ NULL, +/* 3ea4 */ NULL, +/* 3ea5 */ NULL, +/* 3ea6 */ NULL, +/* 3ea7 */ NULL, +/* 3ea8 */ NULL, +/* 3ea9 */ NULL, +/* 3eaa */ NULL, +/* 3eab */ NULL, +/* 3eac */ NULL, +/* 3ead */ NULL, +/* 3eae */ NULL, +/* 3eaf */ NULL, +/* 3eb0 */ NULL, +/* 3eb1 */ NULL, +/* 3eb2 */ NULL, +/* 3eb3 */ NULL, +/* 3eb4 */ NULL, +/* 3eb5 */ NULL, +/* 3eb6 */ NULL, +/* 3eb7 */ NULL, +/* 3eb8 */ NULL, +/* 3eb9 */ NULL, +/* 3eba */ NULL, +/* 3ebb */ NULL, +/* 3ebc */ NULL, +/* 3ebd */ NULL, +/* 3ebe */ NULL, +/* 3ebf */ NULL, +/* 3ec0 */ NULL, +/* 3ec1 */ NULL, +/* 3ec2 */ NULL, +/* 3ec3 */ NULL, +/* 3ec4 */ NULL, +/* 3ec5 */ NULL, +/* 3ec6 */ NULL, +/* 3ec7 */ NULL, +/* 3ec8 */ NULL, +/* 3ec9 */ NULL, +/* 3eca */ NULL, +/* 3ecb */ NULL, +/* 3ecc */ NULL, +/* 3ecd */ NULL, +/* 3ece */ NULL, +/* 3ecf */ NULL, +/* 3ed0 */ NULL, +/* 3ed1 */ NULL, +/* 3ed2 */ NULL, +/* 3ed3 */ NULL, +/* 3ed4 */ NULL, +/* 3ed5 */ NULL, +/* 3ed6 */ NULL, +/* 3ed7 */ NULL, +/* 3ed8 */ NULL, +/* 3ed9 */ NULL, +/* 3eda */ NULL, +/* 3edb */ NULL, +/* 3edc */ NULL, +/* 3edd */ NULL, +/* 3ede */ NULL, +/* 3edf */ NULL, +/* 3ee0 */ NULL, +/* 3ee1 */ NULL, +/* 3ee2 */ NULL, +/* 3ee3 */ NULL, +/* 3ee4 */ NULL, +/* 3ee5 */ NULL, +/* 3ee6 */ NULL, +/* 3ee7 */ NULL, +/* 3ee8 */ NULL, +/* 3ee9 */ NULL, +/* 3eea */ NULL, +/* 3eeb */ NULL, +/* 3eec */ NULL, +/* 3eed */ NULL, +/* 3eee */ NULL, +/* 3eef */ NULL, +/* 3ef0 */ NULL, +/* 3ef1 */ NULL, +/* 3ef2 */ NULL, +/* 3ef3 */ NULL, +/* 3ef4 */ NULL, +/* 3ef5 */ NULL, +/* 3ef6 */ NULL, +/* 3ef7 */ NULL, +/* 3ef8 */ NULL, +/* 3ef9 */ NULL, +/* 3efa */ NULL, +/* 3efb */ NULL, +/* 3efc */ NULL, +/* 3efd */ NULL, +/* 3efe */ NULL, +/* 3eff */ NULL, +/* 3f00 */ NULL, +/* 3f01 */ NULL, +/* 3f02 */ NULL, +/* 3f03 */ NULL, +/* 3f04 */ NULL, +/* 3f05 */ NULL, +/* 3f06 */ NULL, +/* 3f07 */ NULL, +/* 3f08 */ NULL, +/* 3f09 */ NULL, +/* 3f0a */ NULL, +/* 3f0b */ NULL, +/* 3f0c */ NULL, +/* 3f0d */ NULL, +/* 3f0e */ NULL, +/* 3f0f */ NULL, +/* 3f10 */ NULL, +/* 3f11 */ NULL, +/* 3f12 */ NULL, +/* 3f13 */ NULL, +/* 3f14 */ NULL, +/* 3f15 */ NULL, +/* 3f16 */ NULL, +/* 3f17 */ NULL, +/* 3f18 */ NULL, +/* 3f19 */ NULL, +/* 3f1a */ NULL, +/* 3f1b */ NULL, +/* 3f1c */ NULL, +/* 3f1d */ NULL, +/* 3f1e */ NULL, +/* 3f1f */ NULL, +/* 3f20 */ NULL, +/* 3f21 */ NULL, +/* 3f22 */ NULL, +/* 3f23 */ NULL, +/* 3f24 */ NULL, +/* 3f25 */ NULL, +/* 3f26 */ NULL, +/* 3f27 */ NULL, +/* 3f28 */ NULL, +/* 3f29 */ NULL, +/* 3f2a */ NULL, +/* 3f2b */ NULL, +/* 3f2c */ NULL, +/* 3f2d */ NULL, +/* 3f2e */ NULL, +/* 3f2f */ NULL, +/* 3f30 */ NULL, +/* 3f31 */ NULL, +/* 3f32 */ NULL, +/* 3f33 */ NULL, +/* 3f34 */ NULL, +/* 3f35 */ NULL, +/* 3f36 */ NULL, +/* 3f37 */ NULL, +/* 3f38 */ NULL, +/* 3f39 */ NULL, +/* 3f3a */ NULL, +/* 3f3b */ NULL, +/* 3f3c */ NULL, +/* 3f3d */ NULL, +/* 3f3e */ NULL, +/* 3f3f */ NULL, +/* 3f40 */ NULL, +/* 3f41 */ NULL, +/* 3f42 */ NULL, +/* 3f43 */ NULL, +/* 3f44 */ NULL, +/* 3f45 */ NULL, +/* 3f46 */ NULL, +/* 3f47 */ NULL, +/* 3f48 */ NULL, +/* 3f49 */ NULL, +/* 3f4a */ NULL, +/* 3f4b */ NULL, +/* 3f4c */ NULL, +/* 3f4d */ NULL, +/* 3f4e */ NULL, +/* 3f4f */ NULL, +/* 3f50 */ NULL, +/* 3f51 */ NULL, +/* 3f52 */ NULL, +/* 3f53 */ NULL, +/* 3f54 */ NULL, +/* 3f55 */ NULL, +/* 3f56 */ NULL, +/* 3f57 */ NULL, +/* 3f58 */ NULL, +/* 3f59 */ NULL, +/* 3f5a */ NULL, +/* 3f5b */ NULL, +/* 3f5c */ NULL, +/* 3f5d */ NULL, +/* 3f5e */ NULL, +/* 3f5f */ NULL, +/* 3f60 */ NULL, +/* 3f61 */ NULL, +/* 3f62 */ NULL, +/* 3f63 */ NULL, +/* 3f64 */ NULL, +/* 3f65 */ NULL, +/* 3f66 */ NULL, +/* 3f67 */ NULL, +/* 3f68 */ NULL, +/* 3f69 */ NULL, +/* 3f6a */ NULL, +/* 3f6b */ NULL, +/* 3f6c */ NULL, +/* 3f6d */ NULL, +/* 3f6e */ NULL, +/* 3f6f */ NULL, +/* 3f70 */ NULL, +/* 3f71 */ NULL, +/* 3f72 */ NULL, +/* 3f73 */ NULL, +/* 3f74 */ NULL, +/* 3f75 */ NULL, +/* 3f76 */ NULL, +/* 3f77 */ NULL, +/* 3f78 */ NULL, +/* 3f79 */ NULL, +/* 3f7a */ NULL, +/* 3f7b */ NULL, +/* 3f7c */ NULL, +/* 3f7d */ NULL, +/* 3f7e */ NULL, +/* 3f7f */ NULL, +/* 3f80 */ NULL, +/* 3f81 */ NULL, +/* 3f82 */ NULL, +/* 3f83 */ NULL, +/* 3f84 */ NULL, +/* 3f85 */ NULL, +/* 3f86 */ NULL, +/* 3f87 */ NULL, +/* 3f88 */ NULL, +/* 3f89 */ NULL, +/* 3f8a */ NULL, +/* 3f8b */ NULL, +/* 3f8c */ NULL, +/* 3f8d */ NULL, +/* 3f8e */ NULL, +/* 3f8f */ NULL, +/* 3f90 */ NULL, +/* 3f91 */ NULL, +/* 3f92 */ NULL, +/* 3f93 */ NULL, +/* 3f94 */ NULL, +/* 3f95 */ NULL, +/* 3f96 */ NULL, +/* 3f97 */ NULL, +/* 3f98 */ NULL, +/* 3f99 */ NULL, +/* 3f9a */ NULL, +/* 3f9b */ NULL, +/* 3f9c */ NULL, +/* 3f9d */ NULL, +/* 3f9e */ NULL, +/* 3f9f */ NULL, +/* 3fa0 */ NULL, +/* 3fa1 */ NULL, +/* 3fa2 */ NULL, +/* 3fa3 */ NULL, +/* 3fa4 */ NULL, +/* 3fa5 */ NULL, +/* 3fa6 */ NULL, +/* 3fa7 */ NULL, +/* 3fa8 */ NULL, +/* 3fa9 */ NULL, +/* 3faa */ NULL, +/* 3fab */ NULL, +/* 3fac */ NULL, +/* 3fad */ NULL, +/* 3fae */ NULL, +/* 3faf */ NULL, +/* 3fb0 */ NULL, +/* 3fb1 */ NULL, +/* 3fb2 */ NULL, +/* 3fb3 */ NULL, +/* 3fb4 */ NULL, +/* 3fb5 */ NULL, +/* 3fb6 */ NULL, +/* 3fb7 */ NULL, +/* 3fb8 */ NULL, +/* 3fb9 */ NULL, +/* 3fba */ NULL, +/* 3fbb */ NULL, +/* 3fbc */ NULL, +/* 3fbd */ NULL, +/* 3fbe */ NULL, +/* 3fbf */ NULL, +/* 3fc0 */ NULL, +/* 3fc1 */ NULL, +/* 3fc2 */ NULL, +/* 3fc3 */ NULL, +/* 3fc4 */ NULL, +/* 3fc5 */ NULL, +/* 3fc6 */ NULL, +/* 3fc7 */ NULL, +/* 3fc8 */ NULL, +/* 3fc9 */ NULL, +/* 3fca */ NULL, +/* 3fcb */ NULL, +/* 3fcc */ NULL, +/* 3fcd */ NULL, +/* 3fce */ NULL, +/* 3fcf */ NULL, +/* 3fd0 */ NULL, +/* 3fd1 */ NULL, +/* 3fd2 */ NULL, +/* 3fd3 */ NULL, +/* 3fd4 */ NULL, +/* 3fd5 */ NULL, +/* 3fd6 */ NULL, +/* 3fd7 */ NULL, +/* 3fd8 */ NULL, +/* 3fd9 */ NULL, +/* 3fda */ NULL, +/* 3fdb */ NULL, +/* 3fdc */ NULL, +/* 3fdd */ NULL, +/* 3fde */ NULL, +/* 3fdf */ NULL, +/* 3fe0 */ NULL, +/* 3fe1 */ NULL, +/* 3fe2 */ NULL, +/* 3fe3 */ NULL, +/* 3fe4 */ NULL, +/* 3fe5 */ NULL, +/* 3fe6 */ NULL, +/* 3fe7 */ NULL, +/* 3fe8 */ NULL, +/* 3fe9 */ NULL, +/* 3fea */ NULL, +/* 3feb */ NULL, +/* 3fec */ NULL, +/* 3fed */ NULL, +/* 3fee */ NULL, +/* 3fef */ NULL, +/* 3ff0 */ NULL, +/* 3ff1 */ NULL, +/* 3ff2 */ NULL, +/* 3ff3 */ NULL, +/* 3ff4 */ NULL, +/* 3ff5 */ NULL, +/* 3ff6 */ NULL, +/* 3ff7 */ NULL, +/* 3ff8 */ NULL, +/* 3ff9 */ NULL, +/* 3ffa */ NULL, +/* 3ffb */ NULL, +/* 3ffc */ NULL, +/* 3ffd */ NULL, +/* 3ffe */ NULL, +/* 3fff */ NULL, +/* 4000 */ NULL, +/* 4001 */ NULL, +/* 4002 */ NULL, +/* 4003 */ NULL, +/* 4004 */ NULL, +/* 4005 */ NULL, +/* 4006 */ NULL, +/* 4007 */ NULL, +/* 4008 */ NULL, +/* 4009 */ NULL, +/* 400a */ NULL, +/* 400b */ NULL, +/* 400c */ NULL, +/* 400d */ NULL, +/* 400e */ NULL, +/* 400f */ NULL, +/* 4010 */ NULL, +/* 4011 */ NULL, +/* 4012 */ NULL, +/* 4013 */ NULL, +/* 4014 */ NULL, +/* 4015 */ NULL, +/* 4016 */ NULL, +/* 4017 */ NULL, +/* 4018 */ NULL, +/* 4019 */ NULL, +/* 401a */ NULL, +/* 401b */ NULL, +/* 401c */ NULL, +/* 401d */ NULL, +/* 401e */ NULL, +/* 401f */ NULL, +/* 4020 */ NULL, +/* 4021 */ NULL, +/* 4022 */ NULL, +/* 4023 */ NULL, +/* 4024 */ NULL, +/* 4025 */ NULL, +/* 4026 */ NULL, +/* 4027 */ NULL, +/* 4028 */ NULL, +/* 4029 */ NULL, +/* 402a */ NULL, +/* 402b */ NULL, +/* 402c */ NULL, +/* 402d */ NULL, +/* 402e */ NULL, +/* 402f */ NULL, +/* 4030 */ NULL, +/* 4031 */ NULL, +/* 4032 */ NULL, +/* 4033 */ NULL, +/* 4034 */ NULL, +/* 4035 */ NULL, +/* 4036 */ NULL, +/* 4037 */ NULL, +/* 4038 */ NULL, +/* 4039 */ NULL, +/* 403a */ NULL, +/* 403b */ NULL, +/* 403c */ NULL, +/* 403d */ NULL, +/* 403e */ NULL, +/* 403f */ NULL, +/* 4040 */ NULL, +/* 4041 */ NULL, +/* 4042 */ NULL, +/* 4043 */ NULL, +/* 4044 */ NULL, +/* 4045 */ NULL, +/* 4046 */ NULL, +/* 4047 */ NULL, +/* 4048 */ NULL, +/* 4049 */ NULL, +/* 404a */ NULL, +/* 404b */ NULL, +/* 404c */ NULL, +/* 404d */ NULL, +/* 404e */ NULL, +/* 404f */ NULL, +/* 4050 */ NULL, +/* 4051 */ NULL, +/* 4052 */ NULL, +/* 4053 */ NULL, +/* 4054 */ NULL, +/* 4055 */ NULL, +/* 4056 */ NULL, +/* 4057 */ NULL, +/* 4058 */ NULL, +/* 4059 */ NULL, +/* 405a */ NULL, +/* 405b */ NULL, +/* 405c */ NULL, +/* 405d */ NULL, +/* 405e */ NULL, +/* 405f */ NULL, +/* 4060 */ NULL, +/* 4061 */ NULL, +/* 4062 */ NULL, +/* 4063 */ NULL, +/* 4064 */ NULL, +/* 4065 */ NULL, +/* 4066 */ NULL, +/* 4067 */ NULL, +/* 4068 */ NULL, +/* 4069 */ NULL, +/* 406a */ NULL, +/* 406b */ NULL, +/* 406c */ NULL, +/* 406d */ NULL, +/* 406e */ NULL, +/* 406f */ NULL, +/* 4070 */ NULL, +/* 4071 */ NULL, +/* 4072 */ NULL, +/* 4073 */ NULL, +/* 4074 */ NULL, +/* 4075 */ NULL, +/* 4076 */ NULL, +/* 4077 */ NULL, +/* 4078 */ NULL, +/* 4079 */ NULL, +/* 407a */ NULL, +/* 407b */ NULL, +/* 407c */ NULL, +/* 407d */ NULL, +/* 407e */ NULL, +/* 407f */ NULL, +/* 4080 */ NULL, +/* 4081 */ NULL, +/* 4082 */ NULL, +/* 4083 */ NULL, +/* 4084 */ NULL, +/* 4085 */ NULL, +/* 4086 */ NULL, +/* 4087 */ NULL, +/* 4088 */ NULL, +/* 4089 */ NULL, +/* 408a */ NULL, +/* 408b */ NULL, +/* 408c */ NULL, +/* 408d */ NULL, +/* 408e */ NULL, +/* 408f */ NULL, +/* 4090 */ NULL, +/* 4091 */ NULL, +/* 4092 */ NULL, +/* 4093 */ NULL, +/* 4094 */ NULL, +/* 4095 */ NULL, +/* 4096 */ NULL, +/* 4097 */ NULL, +/* 4098 */ NULL, +/* 4099 */ NULL, +/* 409a */ NULL, +/* 409b */ NULL, +/* 409c */ NULL, +/* 409d */ NULL, +/* 409e */ NULL, +/* 409f */ NULL, +/* 40a0 */ NULL, +/* 40a1 */ NULL, +/* 40a2 */ NULL, +/* 40a3 */ NULL, +/* 40a4 */ NULL, +/* 40a5 */ NULL, +/* 40a6 */ NULL, +/* 40a7 */ NULL, +/* 40a8 */ NULL, +/* 40a9 */ NULL, +/* 40aa */ NULL, +/* 40ab */ NULL, +/* 40ac */ NULL, +/* 40ad */ NULL, +/* 40ae */ NULL, +/* 40af */ NULL, +/* 40b0 */ NULL, +/* 40b1 */ NULL, +/* 40b2 */ NULL, +/* 40b3 */ NULL, +/* 40b4 */ NULL, +/* 40b5 */ NULL, +/* 40b6 */ NULL, +/* 40b7 */ NULL, +/* 40b8 */ NULL, +/* 40b9 */ NULL, +/* 40ba */ NULL, +/* 40bb */ NULL, +/* 40bc */ NULL, +/* 40bd */ NULL, +/* 40be */ NULL, +/* 40bf */ NULL, +/* 40c0 */ NULL, +/* 40c1 */ NULL, +/* 40c2 */ NULL, +/* 40c3 */ NULL, +/* 40c4 */ NULL, +/* 40c5 */ NULL, +/* 40c6 */ NULL, +/* 40c7 */ NULL, +/* 40c8 */ NULL, +/* 40c9 */ NULL, +/* 40ca */ NULL, +/* 40cb */ NULL, +/* 40cc */ NULL, +/* 40cd */ NULL, +/* 40ce */ NULL, +/* 40cf */ NULL, +/* 40d0 */ NULL, +/* 40d1 */ NULL, +/* 40d2 */ NULL, +/* 40d3 */ NULL, +/* 40d4 */ NULL, +/* 40d5 */ NULL, +/* 40d6 */ NULL, +/* 40d7 */ NULL, +/* 40d8 */ NULL, +/* 40d9 */ NULL, +/* 40da */ NULL, +/* 40db */ NULL, +/* 40dc */ NULL, +/* 40dd */ NULL, +/* 40de */ NULL, +/* 40df */ NULL, +/* 40e0 */ NULL, +/* 40e1 */ NULL, +/* 40e2 */ NULL, +/* 40e3 */ NULL, +/* 40e4 */ NULL, +/* 40e5 */ NULL, +/* 40e6 */ NULL, +/* 40e7 */ NULL, +/* 40e8 */ NULL, +/* 40e9 */ NULL, +/* 40ea */ NULL, +/* 40eb */ NULL, +/* 40ec */ NULL, +/* 40ed */ NULL, +/* 40ee */ NULL, +/* 40ef */ NULL, +/* 40f0 */ NULL, +/* 40f1 */ NULL, +/* 40f2 */ NULL, +/* 40f3 */ NULL, +/* 40f4 */ NULL, +/* 40f5 */ NULL, +/* 40f6 */ NULL, +/* 40f7 */ NULL, +/* 40f8 */ NULL, +/* 40f9 */ NULL, +/* 40fa */ NULL, +/* 40fb */ NULL, +/* 40fc */ NULL, +/* 40fd */ NULL, +/* 40fe */ NULL, +/* 40ff */ NULL, +/* 4100 */ NULL, +/* 4101 */ NULL, +/* 4102 */ NULL, +/* 4103 */ NULL, +/* 4104 */ NULL, +/* 4105 */ NULL, +/* 4106 */ NULL, +/* 4107 */ NULL, +/* 4108 */ NULL, +/* 4109 */ NULL, +/* 410a */ NULL, +/* 410b */ NULL, +/* 410c */ NULL, +/* 410d */ NULL, +/* 410e */ NULL, +/* 410f */ NULL, +/* 4110 */ NULL, +/* 4111 */ NULL, +/* 4112 */ NULL, +/* 4113 */ NULL, +/* 4114 */ NULL, +/* 4115 */ NULL, +/* 4116 */ NULL, +/* 4117 */ NULL, +/* 4118 */ NULL, +/* 4119 */ NULL, +/* 411a */ NULL, +/* 411b */ NULL, +/* 411c */ NULL, +/* 411d */ NULL, +/* 411e */ NULL, +/* 411f */ NULL, +/* 4120 */ NULL, +/* 4121 */ NULL, +/* 4122 */ NULL, +/* 4123 */ NULL, +/* 4124 */ NULL, +/* 4125 */ NULL, +/* 4126 */ NULL, +/* 4127 */ NULL, +/* 4128 */ NULL, +/* 4129 */ NULL, +/* 412a */ NULL, +/* 412b */ NULL, +/* 412c */ NULL, +/* 412d */ NULL, +/* 412e */ NULL, +/* 412f */ NULL, +/* 4130 */ NULL, +/* 4131 */ NULL, +/* 4132 */ NULL, +/* 4133 */ NULL, +/* 4134 */ NULL, +/* 4135 */ NULL, +/* 4136 */ NULL, +/* 4137 */ NULL, +/* 4138 */ NULL, +/* 4139 */ NULL, +/* 413a */ NULL, +/* 413b */ NULL, +/* 413c */ NULL, +/* 413d */ NULL, +/* 413e */ NULL, +/* 413f */ NULL, +/* 4140 */ NULL, +/* 4141 */ NULL, +/* 4142 */ NULL, +/* 4143 */ NULL, +/* 4144 */ NULL, +/* 4145 */ NULL, +/* 4146 */ NULL, +/* 4147 */ NULL, +/* 4148 */ NULL, +/* 4149 */ NULL, +/* 414a */ NULL, +/* 414b */ NULL, +/* 414c */ NULL, +/* 414d */ NULL, +/* 414e */ NULL, +/* 414f */ NULL, +/* 4150 */ NULL, +/* 4151 */ NULL, +/* 4152 */ NULL, +/* 4153 */ NULL, +/* 4154 */ NULL, +/* 4155 */ NULL, +/* 4156 */ NULL, +/* 4157 */ NULL, +/* 4158 */ NULL, +/* 4159 */ NULL, +/* 415a */ NULL, +/* 415b */ NULL, +/* 415c */ NULL, +/* 415d */ NULL, +/* 415e */ NULL, +/* 415f */ NULL, +/* 4160 */ NULL, +/* 4161 */ NULL, +/* 4162 */ NULL, +/* 4163 */ NULL, +/* 4164 */ NULL, +/* 4165 */ NULL, +/* 4166 */ NULL, +/* 4167 */ NULL, +/* 4168 */ NULL, +/* 4169 */ NULL, +/* 416a */ NULL, +/* 416b */ NULL, +/* 416c */ NULL, +/* 416d */ NULL, +/* 416e */ NULL, +/* 416f */ NULL, +/* 4170 */ NULL, +/* 4171 */ NULL, +/* 4172 */ NULL, +/* 4173 */ NULL, +/* 4174 */ NULL, +/* 4175 */ NULL, +/* 4176 */ NULL, +/* 4177 */ NULL, +/* 4178 */ NULL, +/* 4179 */ NULL, +/* 417a */ NULL, +/* 417b */ NULL, +/* 417c */ NULL, +/* 417d */ NULL, +/* 417e */ NULL, +/* 417f */ NULL, +/* 4180 */ NULL, +/* 4181 */ NULL, +/* 4182 */ NULL, +/* 4183 */ NULL, +/* 4184 */ NULL, +/* 4185 */ NULL, +/* 4186 */ NULL, +/* 4187 */ NULL, +/* 4188 */ NULL, +/* 4189 */ NULL, +/* 418a */ NULL, +/* 418b */ NULL, +/* 418c */ NULL, +/* 418d */ NULL, +/* 418e */ NULL, +/* 418f */ NULL, +/* 4190 */ NULL, +/* 4191 */ NULL, +/* 4192 */ NULL, +/* 4193 */ NULL, +/* 4194 */ NULL, +/* 4195 */ NULL, +/* 4196 */ NULL, +/* 4197 */ NULL, +/* 4198 */ NULL, +/* 4199 */ NULL, +/* 419a */ NULL, +/* 419b */ NULL, +/* 419c */ NULL, +/* 419d */ NULL, +/* 419e */ NULL, +/* 419f */ NULL, +/* 41a0 */ NULL, +/* 41a1 */ NULL, +/* 41a2 */ NULL, +/* 41a3 */ NULL, +/* 41a4 */ NULL, +/* 41a5 */ NULL, +/* 41a6 */ NULL, +/* 41a7 */ NULL, +/* 41a8 */ NULL, +/* 41a9 */ NULL, +/* 41aa */ NULL, +/* 41ab */ NULL, +/* 41ac */ NULL, +/* 41ad */ NULL, +/* 41ae */ NULL, +/* 41af */ NULL, +/* 41b0 */ NULL, +/* 41b1 */ NULL, +/* 41b2 */ NULL, +/* 41b3 */ NULL, +/* 41b4 */ NULL, +/* 41b5 */ NULL, +/* 41b6 */ NULL, +/* 41b7 */ NULL, +/* 41b8 */ NULL, +/* 41b9 */ NULL, +/* 41ba */ NULL, +/* 41bb */ NULL, +/* 41bc */ NULL, +/* 41bd */ NULL, +/* 41be */ NULL, +/* 41bf */ NULL, +/* 41c0 */ NULL, +/* 41c1 */ NULL, +/* 41c2 */ NULL, +/* 41c3 */ NULL, +/* 41c4 */ NULL, +/* 41c5 */ NULL, +/* 41c6 */ NULL, +/* 41c7 */ NULL, +/* 41c8 */ NULL, +/* 41c9 */ NULL, +/* 41ca */ NULL, +/* 41cb */ NULL, +/* 41cc */ NULL, +/* 41cd */ NULL, +/* 41ce */ NULL, +/* 41cf */ NULL, +/* 41d0 */ NULL, +/* 41d1 */ NULL, +/* 41d2 */ NULL, +/* 41d3 */ NULL, +/* 41d4 */ NULL, +/* 41d5 */ NULL, +/* 41d6 */ NULL, +/* 41d7 */ NULL, +/* 41d8 */ NULL, +/* 41d9 */ NULL, +/* 41da */ NULL, +/* 41db */ NULL, +/* 41dc */ NULL, +/* 41dd */ NULL, +/* 41de */ NULL, +/* 41df */ NULL, +/* 41e0 */ NULL, +/* 41e1 */ NULL, +/* 41e2 */ NULL, +/* 41e3 */ NULL, +/* 41e4 */ NULL, +/* 41e5 */ NULL, +/* 41e6 */ NULL, +/* 41e7 */ NULL, +/* 41e8 */ NULL, +/* 41e9 */ NULL, +/* 41ea */ NULL, +/* 41eb */ NULL, +/* 41ec */ NULL, +/* 41ed */ NULL, +/* 41ee */ NULL, +/* 41ef */ NULL, +/* 41f0 */ NULL, +/* 41f1 */ NULL, +/* 41f2 */ NULL, +/* 41f3 */ NULL, +/* 41f4 */ NULL, +/* 41f5 */ NULL, +/* 41f6 */ NULL, +/* 41f7 */ NULL, +/* 41f8 */ NULL, +/* 41f9 */ NULL, +/* 41fa */ NULL, +/* 41fb */ NULL, +/* 41fc */ NULL, +/* 41fd */ NULL, +/* 41fe */ NULL, +/* 41ff */ NULL, +/* 4200 */ NULL, +/* 4201 */ NULL, +/* 4202 */ NULL, +/* 4203 */ NULL, +/* 4204 */ NULL, +/* 4205 */ NULL, +/* 4206 */ NULL, +/* 4207 */ NULL, +/* 4208 */ NULL, +/* 4209 */ NULL, +/* 420a */ NULL, +/* 420b */ NULL, +/* 420c */ NULL, +/* 420d */ NULL, +/* 420e */ NULL, +/* 420f */ NULL, +/* 4210 */ NULL, +/* 4211 */ NULL, +/* 4212 */ NULL, +/* 4213 */ NULL, +/* 4214 */ NULL, +/* 4215 */ NULL, +/* 4216 */ NULL, +/* 4217 */ NULL, +/* 4218 */ NULL, +/* 4219 */ NULL, +/* 421a */ NULL, +/* 421b */ NULL, +/* 421c */ NULL, +/* 421d */ NULL, +/* 421e */ NULL, +/* 421f */ NULL, +/* 4220 */ NULL, +/* 4221 */ NULL, +/* 4222 */ NULL, +/* 4223 */ NULL, +/* 4224 */ NULL, +/* 4225 */ NULL, +/* 4226 */ NULL, +/* 4227 */ NULL, +/* 4228 */ NULL, +/* 4229 */ NULL, +/* 422a */ NULL, +/* 422b */ NULL, +/* 422c */ NULL, +/* 422d */ NULL, +/* 422e */ NULL, +/* 422f */ NULL, +/* 4230 */ NULL, +/* 4231 */ NULL, +/* 4232 */ NULL, +/* 4233 */ NULL, +/* 4234 */ NULL, +/* 4235 */ NULL, +/* 4236 */ NULL, +/* 4237 */ NULL, +/* 4238 */ NULL, +/* 4239 */ NULL, +/* 423a */ NULL, +/* 423b */ NULL, +/* 423c */ NULL, +/* 423d */ NULL, +/* 423e */ NULL, +/* 423f */ NULL, +/* 4240 */ NULL, +/* 4241 */ NULL, +/* 4242 */ NULL, +/* 4243 */ NULL, +/* 4244 */ NULL, +/* 4245 */ NULL, +/* 4246 */ NULL, +/* 4247 */ NULL, +/* 4248 */ NULL, +/* 4249 */ NULL, +/* 424a */ NULL, +/* 424b */ NULL, +/* 424c */ NULL, +/* 424d */ NULL, +/* 424e */ NULL, +/* 424f */ NULL, +/* 4250 */ NULL, +/* 4251 */ NULL, +/* 4252 */ NULL, +/* 4253 */ NULL, +/* 4254 */ NULL, +/* 4255 */ NULL, +/* 4256 */ NULL, +/* 4257 */ NULL, +/* 4258 */ NULL, +/* 4259 */ NULL, +/* 425a */ NULL, +/* 425b */ NULL, +/* 425c */ NULL, +/* 425d */ NULL, +/* 425e */ NULL, +/* 425f */ NULL, +/* 4260 */ NULL, +/* 4261 */ NULL, +/* 4262 */ NULL, +/* 4263 */ NULL, +/* 4264 */ NULL, +/* 4265 */ NULL, +/* 4266 */ NULL, +/* 4267 */ NULL, +/* 4268 */ NULL, +/* 4269 */ NULL, +/* 426a */ NULL, +/* 426b */ NULL, +/* 426c */ NULL, +/* 426d */ NULL, +/* 426e */ NULL, +/* 426f */ NULL, +/* 4270 */ NULL, +/* 4271 */ NULL, +/* 4272 */ NULL, +/* 4273 */ NULL, +/* 4274 */ NULL, +/* 4275 */ NULL, +/* 4276 */ NULL, +/* 4277 */ NULL, +/* 4278 */ NULL, +/* 4279 */ NULL, +/* 427a */ NULL, +/* 427b */ NULL, +/* 427c */ NULL, +/* 427d */ NULL, +/* 427e */ NULL, +/* 427f */ NULL, +/* 4280 */ NULL, +/* 4281 */ NULL, +/* 4282 */ NULL, +/* 4283 */ NULL, +/* 4284 */ NULL, +/* 4285 */ NULL, +/* 4286 */ NULL, +/* 4287 */ NULL, +/* 4288 */ NULL, +/* 4289 */ NULL, +/* 428a */ NULL, +/* 428b */ NULL, +/* 428c */ NULL, +/* 428d */ NULL, +/* 428e */ NULL, +/* 428f */ NULL, +/* 4290 */ NULL, +/* 4291 */ NULL, +/* 4292 */ NULL, +/* 4293 */ NULL, +/* 4294 */ NULL, +/* 4295 */ NULL, +/* 4296 */ NULL, +/* 4297 */ NULL, +/* 4298 */ NULL, +/* 4299 */ NULL, +/* 429a */ NULL, +/* 429b */ NULL, +/* 429c */ NULL, +/* 429d */ NULL, +/* 429e */ NULL, +/* 429f */ NULL, +/* 42a0 */ NULL, +/* 42a1 */ NULL, +/* 42a2 */ NULL, +/* 42a3 */ NULL, +/* 42a4 */ NULL, +/* 42a5 */ NULL, +/* 42a6 */ NULL, +/* 42a7 */ NULL, +/* 42a8 */ NULL, +/* 42a9 */ NULL, +/* 42aa */ NULL, +/* 42ab */ NULL, +/* 42ac */ NULL, +/* 42ad */ NULL, +/* 42ae */ NULL, +/* 42af */ NULL, +/* 42b0 */ NULL, +/* 42b1 */ NULL, +/* 42b2 */ NULL, +/* 42b3 */ NULL, +/* 42b4 */ NULL, +/* 42b5 */ NULL, +/* 42b6 */ NULL, +/* 42b7 */ NULL, +/* 42b8 */ NULL, +/* 42b9 */ NULL, +/* 42ba */ NULL, +/* 42bb */ NULL, +/* 42bc */ NULL, +/* 42bd */ NULL, +/* 42be */ NULL, +/* 42bf */ NULL, +/* 42c0 */ NULL, +/* 42c1 */ NULL, +/* 42c2 */ NULL, +/* 42c3 */ NULL, +/* 42c4 */ NULL, +/* 42c5 */ NULL, +/* 42c6 */ NULL, +/* 42c7 */ NULL, +/* 42c8 */ NULL, +/* 42c9 */ NULL, +/* 42ca */ NULL, +/* 42cb */ NULL, +/* 42cc */ NULL, +/* 42cd */ NULL, +/* 42ce */ NULL, +/* 42cf */ NULL, +/* 42d0 */ NULL, +/* 42d1 */ NULL, +/* 42d2 */ NULL, +/* 42d3 */ NULL, +/* 42d4 */ NULL, +/* 42d5 */ NULL, +/* 42d6 */ NULL, +/* 42d7 */ NULL, +/* 42d8 */ NULL, +/* 42d9 */ NULL, +/* 42da */ NULL, +/* 42db */ NULL, +/* 42dc */ NULL, +/* 42dd */ NULL, +/* 42de */ NULL, +/* 42df */ NULL, +/* 42e0 */ NULL, +/* 42e1 */ NULL, +/* 42e2 */ NULL, +/* 42e3 */ NULL, +/* 42e4 */ NULL, +/* 42e5 */ NULL, +/* 42e6 */ NULL, +/* 42e7 */ NULL, +/* 42e8 */ NULL, +/* 42e9 */ NULL, +/* 42ea */ NULL, +/* 42eb */ NULL, +/* 42ec */ NULL, +/* 42ed */ NULL, +/* 42ee */ NULL, +/* 42ef */ NULL, +/* 42f0 */ NULL, +/* 42f1 */ NULL, +/* 42f2 */ NULL, +/* 42f3 */ NULL, +/* 42f4 */ NULL, +/* 42f5 */ NULL, +/* 42f6 */ NULL, +/* 42f7 */ NULL, +/* 42f8 */ NULL, +/* 42f9 */ NULL, +/* 42fa */ NULL, +/* 42fb */ NULL, +/* 42fc */ NULL, +/* 42fd */ NULL, +/* 42fe */ NULL, +/* 42ff */ NULL, +/* 4300 */ NULL, +/* 4301 */ NULL, +/* 4302 */ NULL, +/* 4303 */ NULL, +/* 4304 */ NULL, +/* 4305 */ NULL, +/* 4306 */ NULL, +/* 4307 */ NULL, +/* 4308 */ NULL, +/* 4309 */ NULL, +/* 430a */ NULL, +/* 430b */ NULL, +/* 430c */ NULL, +/* 430d */ NULL, +/* 430e */ NULL, +/* 430f */ NULL, +/* 4310 */ NULL, +/* 4311 */ NULL, +/* 4312 */ NULL, +/* 4313 */ NULL, +/* 4314 */ NULL, +/* 4315 */ NULL, +/* 4316 */ NULL, +/* 4317 */ NULL, +/* 4318 */ NULL, +/* 4319 */ NULL, +/* 431a */ NULL, +/* 431b */ NULL, +/* 431c */ NULL, +/* 431d */ NULL, +/* 431e */ NULL, +/* 431f */ NULL, +/* 4320 */ NULL, +/* 4321 */ NULL, +/* 4322 */ NULL, +/* 4323 */ NULL, +/* 4324 */ NULL, +/* 4325 */ NULL, +/* 4326 */ NULL, +/* 4327 */ NULL, +/* 4328 */ NULL, +/* 4329 */ NULL, +/* 432a */ NULL, +/* 432b */ NULL, +/* 432c */ NULL, +/* 432d */ NULL, +/* 432e */ NULL, +/* 432f */ NULL, +/* 4330 */ NULL, +/* 4331 */ NULL, +/* 4332 */ NULL, +/* 4333 */ NULL, +/* 4334 */ NULL, +/* 4335 */ NULL, +/* 4336 */ NULL, +/* 4337 */ NULL, +/* 4338 */ NULL, +/* 4339 */ NULL, +/* 433a */ NULL, +/* 433b */ NULL, +/* 433c */ NULL, +/* 433d */ NULL, +/* 433e */ NULL, +/* 433f */ NULL, +/* 4340 */ NULL, +/* 4341 */ NULL, +/* 4342 */ NULL, +/* 4343 */ NULL, +/* 4344 */ NULL, +/* 4345 */ NULL, +/* 4346 */ NULL, +/* 4347 */ NULL, +/* 4348 */ NULL, +/* 4349 */ NULL, +/* 434a */ NULL, +/* 434b */ NULL, +/* 434c */ NULL, +/* 434d */ NULL, +/* 434e */ NULL, +/* 434f */ NULL, +/* 4350 */ NULL, +/* 4351 */ NULL, +/* 4352 */ NULL, +/* 4353 */ NULL, +/* 4354 */ NULL, +/* 4355 */ NULL, +/* 4356 */ NULL, +/* 4357 */ NULL, +/* 4358 */ NULL, +/* 4359 */ NULL, +/* 435a */ NULL, +/* 435b */ NULL, +/* 435c */ NULL, +/* 435d */ NULL, +/* 435e */ NULL, +/* 435f */ NULL, +/* 4360 */ NULL, +/* 4361 */ NULL, +/* 4362 */ NULL, +/* 4363 */ NULL, +/* 4364 */ NULL, +/* 4365 */ NULL, +/* 4366 */ NULL, +/* 4367 */ NULL, +/* 4368 */ NULL, +/* 4369 */ NULL, +/* 436a */ NULL, +/* 436b */ NULL, +/* 436c */ NULL, +/* 436d */ NULL, +/* 436e */ NULL, +/* 436f */ NULL, +/* 4370 */ NULL, +/* 4371 */ NULL, +/* 4372 */ NULL, +/* 4373 */ NULL, +/* 4374 */ NULL, +/* 4375 */ NULL, +/* 4376 */ NULL, +/* 4377 */ NULL, +/* 4378 */ NULL, +/* 4379 */ NULL, +/* 437a */ NULL, +/* 437b */ NULL, +/* 437c */ NULL, +/* 437d */ NULL, +/* 437e */ NULL, +/* 437f */ NULL, +/* 4380 */ NULL, +/* 4381 */ NULL, +/* 4382 */ NULL, +/* 4383 */ NULL, +/* 4384 */ NULL, +/* 4385 */ NULL, +/* 4386 */ NULL, +/* 4387 */ NULL, +/* 4388 */ NULL, +/* 4389 */ NULL, +/* 438a */ NULL, +/* 438b */ NULL, +/* 438c */ NULL, +/* 438d */ NULL, +/* 438e */ NULL, +/* 438f */ NULL, +/* 4390 */ NULL, +/* 4391 */ NULL, +/* 4392 */ NULL, +/* 4393 */ NULL, +/* 4394 */ NULL, +/* 4395 */ NULL, +/* 4396 */ NULL, +/* 4397 */ NULL, +/* 4398 */ NULL, +/* 4399 */ NULL, +/* 439a */ NULL, +/* 439b */ NULL, +/* 439c */ NULL, +/* 439d */ NULL, +/* 439e */ NULL, +/* 439f */ NULL, +/* 43a0 */ NULL, +/* 43a1 */ NULL, +/* 43a2 */ NULL, +/* 43a3 */ NULL, +/* 43a4 */ NULL, +/* 43a5 */ NULL, +/* 43a6 */ NULL, +/* 43a7 */ NULL, +/* 43a8 */ NULL, +/* 43a9 */ NULL, +/* 43aa */ NULL, +/* 43ab */ NULL, +/* 43ac */ NULL, +/* 43ad */ NULL, +/* 43ae */ NULL, +/* 43af */ NULL, +/* 43b0 */ NULL, +/* 43b1 */ NULL, +/* 43b2 */ NULL, +/* 43b3 */ NULL, +/* 43b4 */ NULL, +/* 43b5 */ NULL, +/* 43b6 */ NULL, +/* 43b7 */ NULL, +/* 43b8 */ NULL, +/* 43b9 */ NULL, +/* 43ba */ NULL, +/* 43bb */ NULL, +/* 43bc */ NULL, +/* 43bd */ NULL, +/* 43be */ NULL, +/* 43bf */ NULL, +/* 43c0 */ NULL, +/* 43c1 */ NULL, +/* 43c2 */ NULL, +/* 43c3 */ NULL, +/* 43c4 */ NULL, +/* 43c5 */ NULL, +/* 43c6 */ NULL, +/* 43c7 */ NULL, +/* 43c8 */ NULL, +/* 43c9 */ NULL, +/* 43ca */ NULL, +/* 43cb */ NULL, +/* 43cc */ NULL, +/* 43cd */ NULL, +/* 43ce */ NULL, +/* 43cf */ NULL, +/* 43d0 */ NULL, +/* 43d1 */ NULL, +/* 43d2 */ NULL, +/* 43d3 */ NULL, +/* 43d4 */ NULL, +/* 43d5 */ NULL, +/* 43d6 */ NULL, +/* 43d7 */ NULL, +/* 43d8 */ NULL, +/* 43d9 */ NULL, +/* 43da */ NULL, +/* 43db */ NULL, +/* 43dc */ NULL, +/* 43dd */ NULL, +/* 43de */ NULL, +/* 43df */ NULL, +/* 43e0 */ NULL, +/* 43e1 */ NULL, +/* 43e2 */ NULL, +/* 43e3 */ NULL, +/* 43e4 */ NULL, +/* 43e5 */ NULL, +/* 43e6 */ NULL, +/* 43e7 */ NULL, +/* 43e8 */ NULL, +/* 43e9 */ NULL, +/* 43ea */ NULL, +/* 43eb */ NULL, +/* 43ec */ NULL, +/* 43ed */ NULL, +/* 43ee */ NULL, +/* 43ef */ NULL, +/* 43f0 */ NULL, +/* 43f1 */ NULL, +/* 43f2 */ NULL, +/* 43f3 */ NULL, +/* 43f4 */ NULL, +/* 43f5 */ NULL, +/* 43f6 */ NULL, +/* 43f7 */ NULL, +/* 43f8 */ NULL, +/* 43f9 */ NULL, +/* 43fa */ NULL, +/* 43fb */ NULL, +/* 43fc */ NULL, +/* 43fd */ NULL, +/* 43fe */ NULL, +/* 43ff */ NULL, +/* 4400 */ NULL, +/* 4401 */ NULL, +/* 4402 */ NULL, +/* 4403 */ NULL, +/* 4404 */ NULL, +/* 4405 */ NULL, +/* 4406 */ NULL, +/* 4407 */ NULL, +/* 4408 */ NULL, +/* 4409 */ NULL, +/* 440a */ NULL, +/* 440b */ NULL, +/* 440c */ NULL, +/* 440d */ NULL, +/* 440e */ NULL, +/* 440f */ NULL, +/* 4410 */ NULL, +/* 4411 */ NULL, +/* 4412 */ NULL, +/* 4413 */ NULL, +/* 4414 */ NULL, +/* 4415 */ NULL, +/* 4416 */ NULL, +/* 4417 */ NULL, +/* 4418 */ NULL, +/* 4419 */ NULL, +/* 441a */ NULL, +/* 441b */ NULL, +/* 441c */ NULL, +/* 441d */ NULL, +/* 441e */ NULL, +/* 441f */ NULL, +/* 4420 */ NULL, +/* 4421 */ NULL, +/* 4422 */ NULL, +/* 4423 */ NULL, +/* 4424 */ NULL, +/* 4425 */ NULL, +/* 4426 */ NULL, +/* 4427 */ NULL, +/* 4428 */ NULL, +/* 4429 */ NULL, +/* 442a */ NULL, +/* 442b */ NULL, +/* 442c */ NULL, +/* 442d */ NULL, +/* 442e */ NULL, +/* 442f */ NULL, +/* 4430 */ NULL, +/* 4431 */ NULL, +/* 4432 */ NULL, +/* 4433 */ NULL, +/* 4434 */ NULL, +/* 4435 */ NULL, +/* 4436 */ NULL, +/* 4437 */ NULL, +/* 4438 */ NULL, +/* 4439 */ NULL, +/* 443a */ NULL, +/* 443b */ NULL, +/* 443c */ NULL, +/* 443d */ NULL, +/* 443e */ NULL, +/* 443f */ NULL, +/* 4440 */ NULL, +/* 4441 */ NULL, +/* 4442 */ NULL, +/* 4443 */ NULL, +/* 4444 */ NULL, +/* 4445 */ NULL, +/* 4446 */ NULL, +/* 4447 */ NULL, +/* 4448 */ NULL, +/* 4449 */ NULL, +/* 444a */ NULL, +/* 444b */ NULL, +/* 444c */ NULL, +/* 444d */ NULL, +/* 444e */ NULL, +/* 444f */ NULL, +/* 4450 */ NULL, +/* 4451 */ NULL, +/* 4452 */ NULL, +/* 4453 */ NULL, +/* 4454 */ NULL, +/* 4455 */ NULL, +/* 4456 */ NULL, +/* 4457 */ NULL, +/* 4458 */ NULL, +/* 4459 */ NULL, +/* 445a */ NULL, +/* 445b */ NULL, +/* 445c */ NULL, +/* 445d */ NULL, +/* 445e */ NULL, +/* 445f */ NULL, +/* 4460 */ NULL, +/* 4461 */ NULL, +/* 4462 */ NULL, +/* 4463 */ NULL, +/* 4464 */ NULL, +/* 4465 */ NULL, +/* 4466 */ NULL, +/* 4467 */ NULL, +/* 4468 */ NULL, +/* 4469 */ NULL, +/* 446a */ NULL, +/* 446b */ NULL, +/* 446c */ NULL, +/* 446d */ NULL, +/* 446e */ NULL, +/* 446f */ NULL, +/* 4470 */ NULL, +/* 4471 */ NULL, +/* 4472 */ NULL, +/* 4473 */ NULL, +/* 4474 */ NULL, +/* 4475 */ NULL, +/* 4476 */ NULL, +/* 4477 */ NULL, +/* 4478 */ NULL, +/* 4479 */ NULL, +/* 447a */ NULL, +/* 447b */ NULL, +/* 447c */ NULL, +/* 447d */ NULL, +/* 447e */ NULL, +/* 447f */ NULL, +/* 4480 */ NULL, +/* 4481 */ NULL, +/* 4482 */ NULL, +/* 4483 */ NULL, +/* 4484 */ NULL, +/* 4485 */ NULL, +/* 4486 */ NULL, +/* 4487 */ NULL, +/* 4488 */ NULL, +/* 4489 */ NULL, +/* 448a */ NULL, +/* 448b */ NULL, +/* 448c */ NULL, +/* 448d */ NULL, +/* 448e */ NULL, +/* 448f */ NULL, +/* 4490 */ NULL, +/* 4491 */ NULL, +/* 4492 */ NULL, +/* 4493 */ NULL, +/* 4494 */ NULL, +/* 4495 */ NULL, +/* 4496 */ NULL, +/* 4497 */ NULL, +/* 4498 */ NULL, +/* 4499 */ NULL, +/* 449a */ NULL, +/* 449b */ NULL, +/* 449c */ NULL, +/* 449d */ NULL, +/* 449e */ NULL, +/* 449f */ NULL, +/* 44a0 */ NULL, +/* 44a1 */ NULL, +/* 44a2 */ NULL, +/* 44a3 */ NULL, +/* 44a4 */ NULL, +/* 44a5 */ NULL, +/* 44a6 */ NULL, +/* 44a7 */ NULL, +/* 44a8 */ NULL, +/* 44a9 */ NULL, +/* 44aa */ NULL, +/* 44ab */ NULL, +/* 44ac */ NULL, +/* 44ad */ NULL, +/* 44ae */ NULL, +/* 44af */ NULL, +/* 44b0 */ NULL, +/* 44b1 */ NULL, +/* 44b2 */ NULL, +/* 44b3 */ NULL, +/* 44b4 */ NULL, +/* 44b5 */ NULL, +/* 44b6 */ NULL, +/* 44b7 */ NULL, +/* 44b8 */ NULL, +/* 44b9 */ NULL, +/* 44ba */ NULL, +/* 44bb */ NULL, +/* 44bc */ NULL, +/* 44bd */ NULL, +/* 44be */ NULL, +/* 44bf */ NULL, +/* 44c0 */ NULL, +/* 44c1 */ NULL, +/* 44c2 */ NULL, +/* 44c3 */ NULL, +/* 44c4 */ NULL, +/* 44c5 */ NULL, +/* 44c6 */ NULL, +/* 44c7 */ NULL, +/* 44c8 */ NULL, +/* 44c9 */ NULL, +/* 44ca */ NULL, +/* 44cb */ NULL, +/* 44cc */ NULL, +/* 44cd */ NULL, +/* 44ce */ NULL, +/* 44cf */ NULL, +/* 44d0 */ NULL, +/* 44d1 */ NULL, +/* 44d2 */ NULL, +/* 44d3 */ NULL, +/* 44d4 */ NULL, +/* 44d5 */ NULL, +/* 44d6 */ NULL, +/* 44d7 */ NULL, +/* 44d8 */ NULL, +/* 44d9 */ NULL, +/* 44da */ NULL, +/* 44db */ NULL, +/* 44dc */ NULL, +/* 44dd */ NULL, +/* 44de */ NULL, +/* 44df */ NULL, +/* 44e0 */ NULL, +/* 44e1 */ NULL, +/* 44e2 */ NULL, +/* 44e3 */ NULL, +/* 44e4 */ NULL, +/* 44e5 */ NULL, +/* 44e6 */ NULL, +/* 44e7 */ NULL, +/* 44e8 */ NULL, +/* 44e9 */ NULL, +/* 44ea */ NULL, +/* 44eb */ NULL, +/* 44ec */ NULL, +/* 44ed */ NULL, +/* 44ee */ NULL, +/* 44ef */ NULL, +/* 44f0 */ NULL, +/* 44f1 */ NULL, +/* 44f2 */ NULL, +/* 44f3 */ NULL, +/* 44f4 */ NULL, +/* 44f5 */ NULL, +/* 44f6 */ NULL, +/* 44f7 */ NULL, +/* 44f8 */ NULL, +/* 44f9 */ NULL, +/* 44fa */ NULL, +/* 44fb */ NULL, +/* 44fc */ NULL, +/* 44fd */ NULL, +/* 44fe */ NULL, +/* 44ff */ NULL, +/* 4500 */ NULL, +/* 4501 */ NULL, +/* 4502 */ NULL, +/* 4503 */ NULL, +/* 4504 */ NULL, +/* 4505 */ NULL, +/* 4506 */ NULL, +/* 4507 */ NULL, +/* 4508 */ NULL, +/* 4509 */ NULL, +/* 450a */ NULL, +/* 450b */ NULL, +/* 450c */ NULL, +/* 450d */ NULL, +/* 450e */ NULL, +/* 450f */ NULL, +/* 4510 */ NULL, +/* 4511 */ NULL, +/* 4512 */ NULL, +/* 4513 */ NULL, +/* 4514 */ NULL, +/* 4515 */ NULL, +/* 4516 */ NULL, +/* 4517 */ NULL, +/* 4518 */ NULL, +/* 4519 */ NULL, +/* 451a */ NULL, +/* 451b */ NULL, +/* 451c */ NULL, +/* 451d */ NULL, +/* 451e */ NULL, +/* 451f */ NULL, +/* 4520 */ NULL, +/* 4521 */ NULL, +/* 4522 */ NULL, +/* 4523 */ NULL, +/* 4524 */ NULL, +/* 4525 */ NULL, +/* 4526 */ NULL, +/* 4527 */ NULL, +/* 4528 */ NULL, +/* 4529 */ NULL, +/* 452a */ NULL, +/* 452b */ NULL, +/* 452c */ NULL, +/* 452d */ NULL, +/* 452e */ NULL, +/* 452f */ NULL, +/* 4530 */ NULL, +/* 4531 */ NULL, +/* 4532 */ NULL, +/* 4533 */ NULL, +/* 4534 */ NULL, +/* 4535 */ NULL, +/* 4536 */ NULL, +/* 4537 */ NULL, +/* 4538 */ NULL, +/* 4539 */ NULL, +/* 453a */ NULL, +/* 453b */ NULL, +/* 453c */ NULL, +/* 453d */ NULL, +/* 453e */ NULL, +/* 453f */ NULL, +/* 4540 */ NULL, +/* 4541 */ NULL, +/* 4542 */ NULL, +/* 4543 */ NULL, +/* 4544 */ NULL, +/* 4545 */ NULL, +/* 4546 */ NULL, +/* 4547 */ NULL, +/* 4548 */ NULL, +/* 4549 */ NULL, +/* 454a */ NULL, +/* 454b */ NULL, +/* 454c */ NULL, +/* 454d */ NULL, +/* 454e */ NULL, +/* 454f */ NULL, +/* 4550 */ NULL, +/* 4551 */ NULL, +/* 4552 */ NULL, +/* 4553 */ NULL, +/* 4554 */ NULL, +/* 4555 */ NULL, +/* 4556 */ NULL, +/* 4557 */ NULL, +/* 4558 */ NULL, +/* 4559 */ NULL, +/* 455a */ NULL, +/* 455b */ NULL, +/* 455c */ NULL, +/* 455d */ NULL, +/* 455e */ NULL, +/* 455f */ NULL, +/* 4560 */ NULL, +/* 4561 */ NULL, +/* 4562 */ NULL, +/* 4563 */ NULL, +/* 4564 */ NULL, +/* 4565 */ NULL, +/* 4566 */ NULL, +/* 4567 */ NULL, +/* 4568 */ NULL, +/* 4569 */ NULL, +/* 456a */ NULL, +/* 456b */ NULL, +/* 456c */ NULL, +/* 456d */ NULL, +/* 456e */ NULL, +/* 456f */ NULL, +/* 4570 */ NULL, +/* 4571 */ NULL, +/* 4572 */ NULL, +/* 4573 */ NULL, +/* 4574 */ NULL, +/* 4575 */ NULL, +/* 4576 */ NULL, +/* 4577 */ NULL, +/* 4578 */ NULL, +/* 4579 */ NULL, +/* 457a */ NULL, +/* 457b */ NULL, +/* 457c */ NULL, +/* 457d */ NULL, +/* 457e */ NULL, +/* 457f */ NULL, +/* 4580 */ NULL, +/* 4581 */ NULL, +/* 4582 */ NULL, +/* 4583 */ NULL, +/* 4584 */ NULL, +/* 4585 */ NULL, +/* 4586 */ NULL, +/* 4587 */ NULL, +/* 4588 */ NULL, +/* 4589 */ NULL, +/* 458a */ NULL, +/* 458b */ NULL, +/* 458c */ NULL, +/* 458d */ NULL, +/* 458e */ NULL, +/* 458f */ NULL, +/* 4590 */ NULL, +/* 4591 */ NULL, +/* 4592 */ NULL, +/* 4593 */ NULL, +/* 4594 */ NULL, +/* 4595 */ NULL, +/* 4596 */ NULL, +/* 4597 */ NULL, +/* 4598 */ NULL, +/* 4599 */ NULL, +/* 459a */ NULL, +/* 459b */ NULL, +/* 459c */ NULL, +/* 459d */ NULL, +/* 459e */ NULL, +/* 459f */ NULL, +/* 45a0 */ NULL, +/* 45a1 */ NULL, +/* 45a2 */ NULL, +/* 45a3 */ NULL, +/* 45a4 */ NULL, +/* 45a5 */ NULL, +/* 45a6 */ NULL, +/* 45a7 */ NULL, +/* 45a8 */ NULL, +/* 45a9 */ NULL, +/* 45aa */ NULL, +/* 45ab */ NULL, +/* 45ac */ NULL, +/* 45ad */ NULL, +/* 45ae */ NULL, +/* 45af */ NULL, +/* 45b0 */ NULL, +/* 45b1 */ NULL, +/* 45b2 */ NULL, +/* 45b3 */ NULL, +/* 45b4 */ NULL, +/* 45b5 */ NULL, +/* 45b6 */ NULL, +/* 45b7 */ NULL, +/* 45b8 */ NULL, +/* 45b9 */ NULL, +/* 45ba */ NULL, +/* 45bb */ NULL, +/* 45bc */ NULL, +/* 45bd */ NULL, +/* 45be */ NULL, +/* 45bf */ NULL, +/* 45c0 */ NULL, +/* 45c1 */ NULL, +/* 45c2 */ NULL, +/* 45c3 */ NULL, +/* 45c4 */ NULL, +/* 45c5 */ NULL, +/* 45c6 */ NULL, +/* 45c7 */ NULL, +/* 45c8 */ NULL, +/* 45c9 */ NULL, +/* 45ca */ NULL, +/* 45cb */ NULL, +/* 45cc */ NULL, +/* 45cd */ NULL, +/* 45ce */ NULL, +/* 45cf */ NULL, +/* 45d0 */ NULL, +/* 45d1 */ NULL, +/* 45d2 */ NULL, +/* 45d3 */ NULL, +/* 45d4 */ NULL, +/* 45d5 */ NULL, +/* 45d6 */ NULL, +/* 45d7 */ NULL, +/* 45d8 */ NULL, +/* 45d9 */ NULL, +/* 45da */ NULL, +/* 45db */ NULL, +/* 45dc */ NULL, +/* 45dd */ NULL, +/* 45de */ NULL, +/* 45df */ NULL, +/* 45e0 */ NULL, +/* 45e1 */ NULL, +/* 45e2 */ NULL, +/* 45e3 */ NULL, +/* 45e4 */ NULL, +/* 45e5 */ NULL, +/* 45e6 */ NULL, +/* 45e7 */ NULL, +/* 45e8 */ NULL, +/* 45e9 */ NULL, +/* 45ea */ NULL, +/* 45eb */ NULL, +/* 45ec */ NULL, +/* 45ed */ NULL, +/* 45ee */ NULL, +/* 45ef */ NULL, +/* 45f0 */ NULL, +/* 45f1 */ NULL, +/* 45f2 */ NULL, +/* 45f3 */ NULL, +/* 45f4 */ NULL, +/* 45f5 */ NULL, +/* 45f6 */ NULL, +/* 45f7 */ NULL, +/* 45f8 */ NULL, +/* 45f9 */ NULL, +/* 45fa */ NULL, +/* 45fb */ NULL, +/* 45fc */ NULL, +/* 45fd */ NULL, +/* 45fe */ NULL, +/* 45ff */ NULL, +/* 4600 */ NULL, +/* 4601 */ NULL, +/* 4602 */ NULL, +/* 4603 */ NULL, +/* 4604 */ NULL, +/* 4605 */ NULL, +/* 4606 */ NULL, +/* 4607 */ NULL, +/* 4608 */ NULL, +/* 4609 */ NULL, +/* 460a */ NULL, +/* 460b */ NULL, +/* 460c */ NULL, +/* 460d */ NULL, +/* 460e */ NULL, +/* 460f */ NULL, +/* 4610 */ NULL, +/* 4611 */ NULL, +/* 4612 */ NULL, +/* 4613 */ NULL, +/* 4614 */ NULL, +/* 4615 */ NULL, +/* 4616 */ NULL, +/* 4617 */ NULL, +/* 4618 */ NULL, +/* 4619 */ NULL, +/* 461a */ NULL, +/* 461b */ NULL, +/* 461c */ NULL, +/* 461d */ NULL, +/* 461e */ NULL, +/* 461f */ NULL, +/* 4620 */ NULL, +/* 4621 */ NULL, +/* 4622 */ NULL, +/* 4623 */ NULL, +/* 4624 */ NULL, +/* 4625 */ NULL, +/* 4626 */ NULL, +/* 4627 */ NULL, +/* 4628 */ NULL, +/* 4629 */ NULL, +/* 462a */ NULL, +/* 462b */ NULL, +/* 462c */ NULL, +/* 462d */ NULL, +/* 462e */ NULL, +/* 462f */ NULL, +/* 4630 */ NULL, +/* 4631 */ NULL, +/* 4632 */ NULL, +/* 4633 */ NULL, +/* 4634 */ NULL, +/* 4635 */ NULL, +/* 4636 */ NULL, +/* 4637 */ NULL, +/* 4638 */ NULL, +/* 4639 */ NULL, +/* 463a */ NULL, +/* 463b */ NULL, +/* 463c */ NULL, +/* 463d */ NULL, +/* 463e */ NULL, +/* 463f */ NULL, +/* 4640 */ NULL, +/* 4641 */ NULL, +/* 4642 */ NULL, +/* 4643 */ NULL, +/* 4644 */ NULL, +/* 4645 */ NULL, +/* 4646 */ NULL, +/* 4647 */ NULL, +/* 4648 */ NULL, +/* 4649 */ NULL, +/* 464a */ NULL, +/* 464b */ NULL, +/* 464c */ NULL, +/* 464d */ NULL, +/* 464e */ NULL, +/* 464f */ NULL, +/* 4650 */ NULL, +/* 4651 */ NULL, +/* 4652 */ NULL, +/* 4653 */ NULL, +/* 4654 */ NULL, +/* 4655 */ NULL, +/* 4656 */ NULL, +/* 4657 */ NULL, +/* 4658 */ NULL, +/* 4659 */ NULL, +/* 465a */ NULL, +/* 465b */ NULL, +/* 465c */ NULL, +/* 465d */ NULL, +/* 465e */ NULL, +/* 465f */ NULL, +/* 4660 */ NULL, +/* 4661 */ NULL, +/* 4662 */ NULL, +/* 4663 */ NULL, +/* 4664 */ NULL, +/* 4665 */ NULL, +/* 4666 */ NULL, +/* 4667 */ NULL, +/* 4668 */ NULL, +/* 4669 */ NULL, +/* 466a */ NULL, +/* 466b */ NULL, +/* 466c */ NULL, +/* 466d */ NULL, +/* 466e */ NULL, +/* 466f */ NULL, +/* 4670 */ NULL, +/* 4671 */ NULL, +/* 4672 */ NULL, +/* 4673 */ NULL, +/* 4674 */ NULL, +/* 4675 */ NULL, +/* 4676 */ NULL, +/* 4677 */ NULL, +/* 4678 */ NULL, +/* 4679 */ NULL, +/* 467a */ NULL, +/* 467b */ NULL, +/* 467c */ NULL, +/* 467d */ NULL, +/* 467e */ NULL, +/* 467f */ NULL, +/* 4680 */ NULL, +/* 4681 */ NULL, +/* 4682 */ NULL, +/* 4683 */ NULL, +/* 4684 */ NULL, +/* 4685 */ NULL, +/* 4686 */ NULL, +/* 4687 */ NULL, +/* 4688 */ NULL, +/* 4689 */ NULL, +/* 468a */ NULL, +/* 468b */ NULL, +/* 468c */ NULL, +/* 468d */ NULL, +/* 468e */ NULL, +/* 468f */ NULL, +/* 4690 */ NULL, +/* 4691 */ NULL, +/* 4692 */ NULL, +/* 4693 */ NULL, +/* 4694 */ NULL, +/* 4695 */ NULL, +/* 4696 */ NULL, +/* 4697 */ NULL, +/* 4698 */ NULL, +/* 4699 */ NULL, +/* 469a */ NULL, +/* 469b */ NULL, +/* 469c */ NULL, +/* 469d */ NULL, +/* 469e */ NULL, +/* 469f */ NULL, +/* 46a0 */ NULL, +/* 46a1 */ NULL, +/* 46a2 */ NULL, +/* 46a3 */ NULL, +/* 46a4 */ NULL, +/* 46a5 */ NULL, +/* 46a6 */ NULL, +/* 46a7 */ NULL, +/* 46a8 */ NULL, +/* 46a9 */ NULL, +/* 46aa */ NULL, +/* 46ab */ NULL, +/* 46ac */ NULL, +/* 46ad */ NULL, +/* 46ae */ NULL, +/* 46af */ NULL, +/* 46b0 */ NULL, +/* 46b1 */ NULL, +/* 46b2 */ NULL, +/* 46b3 */ NULL, +/* 46b4 */ NULL, +/* 46b5 */ NULL, +/* 46b6 */ NULL, +/* 46b7 */ NULL, +/* 46b8 */ NULL, +/* 46b9 */ NULL, +/* 46ba */ NULL, +/* 46bb */ NULL, +/* 46bc */ NULL, +/* 46bd */ NULL, +/* 46be */ NULL, +/* 46bf */ NULL, +/* 46c0 */ NULL, +/* 46c1 */ NULL, +/* 46c2 */ NULL, +/* 46c3 */ NULL, +/* 46c4 */ NULL, +/* 46c5 */ NULL, +/* 46c6 */ NULL, +/* 46c7 */ NULL, +/* 46c8 */ NULL, +/* 46c9 */ NULL, +/* 46ca */ NULL, +/* 46cb */ NULL, +/* 46cc */ NULL, +/* 46cd */ NULL, +/* 46ce */ NULL, +/* 46cf */ NULL, +/* 46d0 */ NULL, +/* 46d1 */ NULL, +/* 46d2 */ NULL, +/* 46d3 */ NULL, +/* 46d4 */ NULL, +/* 46d5 */ NULL, +/* 46d6 */ NULL, +/* 46d7 */ NULL, +/* 46d8 */ NULL, +/* 46d9 */ NULL, +/* 46da */ NULL, +/* 46db */ NULL, +/* 46dc */ NULL, +/* 46dd */ NULL, +/* 46de */ NULL, +/* 46df */ NULL, +/* 46e0 */ NULL, +/* 46e1 */ NULL, +/* 46e2 */ NULL, +/* 46e3 */ NULL, +/* 46e4 */ NULL, +/* 46e5 */ NULL, +/* 46e6 */ NULL, +/* 46e7 */ NULL, +/* 46e8 */ NULL, +/* 46e9 */ NULL, +/* 46ea */ NULL, +/* 46eb */ NULL, +/* 46ec */ NULL, +/* 46ed */ NULL, +/* 46ee */ NULL, +/* 46ef */ NULL, +/* 46f0 */ NULL, +/* 46f1 */ NULL, +/* 46f2 */ NULL, +/* 46f3 */ NULL, +/* 46f4 */ NULL, +/* 46f5 */ NULL, +/* 46f6 */ NULL, +/* 46f7 */ NULL, +/* 46f8 */ NULL, +/* 46f9 */ NULL, +/* 46fa */ NULL, +/* 46fb */ NULL, +/* 46fc */ NULL, +/* 46fd */ NULL, +/* 46fe */ NULL, +/* 46ff */ NULL, +/* 4700 */ NULL, +/* 4701 */ NULL, +/* 4702 */ NULL, +/* 4703 */ NULL, +/* 4704 */ NULL, +/* 4705 */ NULL, +/* 4706 */ NULL, +/* 4707 */ NULL, +/* 4708 */ NULL, +/* 4709 */ NULL, +/* 470a */ NULL, +/* 470b */ NULL, +/* 470c */ NULL, +/* 470d */ NULL, +/* 470e */ NULL, +/* 470f */ NULL, +/* 4710 */ NULL, +/* 4711 */ NULL, +/* 4712 */ NULL, +/* 4713 */ NULL, +/* 4714 */ NULL, +/* 4715 */ NULL, +/* 4716 */ NULL, +/* 4717 */ NULL, +/* 4718 */ NULL, +/* 4719 */ NULL, +/* 471a */ NULL, +/* 471b */ NULL, +/* 471c */ NULL, +/* 471d */ NULL, +/* 471e */ NULL, +/* 471f */ NULL, +/* 4720 */ NULL, +/* 4721 */ NULL, +/* 4722 */ NULL, +/* 4723 */ NULL, +/* 4724 */ NULL, +/* 4725 */ NULL, +/* 4726 */ NULL, +/* 4727 */ NULL, +/* 4728 */ NULL, +/* 4729 */ NULL, +/* 472a */ NULL, +/* 472b */ NULL, +/* 472c */ NULL, +/* 472d */ NULL, +/* 472e */ NULL, +/* 472f */ NULL, +/* 4730 */ NULL, +/* 4731 */ NULL, +/* 4732 */ NULL, +/* 4733 */ NULL, +/* 4734 */ NULL, +/* 4735 */ NULL, +/* 4736 */ NULL, +/* 4737 */ NULL, +/* 4738 */ NULL, +/* 4739 */ NULL, +/* 473a */ NULL, +/* 473b */ NULL, +/* 473c */ NULL, +/* 473d */ NULL, +/* 473e */ NULL, +/* 473f */ NULL, +/* 4740 */ NULL, +/* 4741 */ NULL, +/* 4742 */ NULL, +/* 4743 */ NULL, +/* 4744 */ NULL, +/* 4745 */ NULL, +/* 4746 */ NULL, +/* 4747 */ NULL, +/* 4748 */ NULL, +/* 4749 */ NULL, +/* 474a */ NULL, +/* 474b */ NULL, +/* 474c */ NULL, +/* 474d */ NULL, +/* 474e */ NULL, +/* 474f */ NULL, +/* 4750 */ NULL, +/* 4751 */ NULL, +/* 4752 */ NULL, +/* 4753 */ NULL, +/* 4754 */ NULL, +/* 4755 */ NULL, +/* 4756 */ NULL, +/* 4757 */ NULL, +/* 4758 */ NULL, +/* 4759 */ NULL, +/* 475a */ NULL, +/* 475b */ NULL, +/* 475c */ NULL, +/* 475d */ NULL, +/* 475e */ NULL, +/* 475f */ NULL, +/* 4760 */ NULL, +/* 4761 */ NULL, +/* 4762 */ NULL, +/* 4763 */ NULL, +/* 4764 */ NULL, +/* 4765 */ NULL, +/* 4766 */ NULL, +/* 4767 */ NULL, +/* 4768 */ NULL, +/* 4769 */ NULL, +/* 476a */ NULL, +/* 476b */ NULL, +/* 476c */ NULL, +/* 476d */ NULL, +/* 476e */ NULL, +/* 476f */ NULL, +/* 4770 */ NULL, +/* 4771 */ NULL, +/* 4772 */ NULL, +/* 4773 */ NULL, +/* 4774 */ NULL, +/* 4775 */ NULL, +/* 4776 */ NULL, +/* 4777 */ NULL, +/* 4778 */ NULL, +/* 4779 */ NULL, +/* 477a */ NULL, +/* 477b */ NULL, +/* 477c */ NULL, +/* 477d */ NULL, +/* 477e */ NULL, +/* 477f */ NULL, +/* 4780 */ NULL, +/* 4781 */ NULL, +/* 4782 */ NULL, +/* 4783 */ NULL, +/* 4784 */ NULL, +/* 4785 */ NULL, +/* 4786 */ NULL, +/* 4787 */ NULL, +/* 4788 */ NULL, +/* 4789 */ NULL, +/* 478a */ NULL, +/* 478b */ NULL, +/* 478c */ NULL, +/* 478d */ NULL, +/* 478e */ NULL, +/* 478f */ NULL, +/* 4790 */ NULL, +/* 4791 */ NULL, +/* 4792 */ NULL, +/* 4793 */ NULL, +/* 4794 */ NULL, +/* 4795 */ NULL, +/* 4796 */ NULL, +/* 4797 */ NULL, +/* 4798 */ NULL, +/* 4799 */ NULL, +/* 479a */ NULL, +/* 479b */ NULL, +/* 479c */ NULL, +/* 479d */ NULL, +/* 479e */ NULL, +/* 479f */ NULL, +/* 47a0 */ NULL, +/* 47a1 */ NULL, +/* 47a2 */ NULL, +/* 47a3 */ NULL, +/* 47a4 */ NULL, +/* 47a5 */ NULL, +/* 47a6 */ NULL, +/* 47a7 */ NULL, +/* 47a8 */ NULL, +/* 47a9 */ NULL, +/* 47aa */ NULL, +/* 47ab */ NULL, +/* 47ac */ NULL, +/* 47ad */ NULL, +/* 47ae */ NULL, +/* 47af */ NULL, +/* 47b0 */ NULL, +/* 47b1 */ NULL, +/* 47b2 */ NULL, +/* 47b3 */ NULL, +/* 47b4 */ NULL, +/* 47b5 */ NULL, +/* 47b6 */ NULL, +/* 47b7 */ NULL, +/* 47b8 */ NULL, +/* 47b9 */ NULL, +/* 47ba */ NULL, +/* 47bb */ NULL, +/* 47bc */ NULL, +/* 47bd */ NULL, +/* 47be */ NULL, +/* 47bf */ NULL, +/* 47c0 */ NULL, +/* 47c1 */ NULL, +/* 47c2 */ NULL, +/* 47c3 */ NULL, +/* 47c4 */ NULL, +/* 47c5 */ NULL, +/* 47c6 */ NULL, +/* 47c7 */ NULL, +/* 47c8 */ NULL, +/* 47c9 */ NULL, +/* 47ca */ NULL, +/* 47cb */ NULL, +/* 47cc */ NULL, +/* 47cd */ NULL, +/* 47ce */ NULL, +/* 47cf */ NULL, +/* 47d0 */ NULL, +/* 47d1 */ NULL, +/* 47d2 */ NULL, +/* 47d3 */ NULL, +/* 47d4 */ NULL, +/* 47d5 */ NULL, +/* 47d6 */ NULL, +/* 47d7 */ NULL, +/* 47d8 */ NULL, +/* 47d9 */ NULL, +/* 47da */ NULL, +/* 47db */ NULL, +/* 47dc */ NULL, +/* 47dd */ NULL, +/* 47de */ NULL, +/* 47df */ NULL, +/* 47e0 */ NULL, +/* 47e1 */ NULL, +/* 47e2 */ NULL, +/* 47e3 */ NULL, +/* 47e4 */ NULL, +/* 47e5 */ NULL, +/* 47e6 */ NULL, +/* 47e7 */ NULL, +/* 47e8 */ NULL, +/* 47e9 */ NULL, +/* 47ea */ NULL, +/* 47eb */ NULL, +/* 47ec */ NULL, +/* 47ed */ NULL, +/* 47ee */ NULL, +/* 47ef */ NULL, +/* 47f0 */ NULL, +/* 47f1 */ NULL, +/* 47f2 */ NULL, +/* 47f3 */ NULL, +/* 47f4 */ NULL, +/* 47f5 */ NULL, +/* 47f6 */ NULL, +/* 47f7 */ NULL, +/* 47f8 */ NULL, +/* 47f9 */ NULL, +/* 47fa */ NULL, +/* 47fb */ NULL, +/* 47fc */ NULL, +/* 47fd */ NULL, +/* 47fe */ NULL, +/* 47ff */ NULL, +/* 4800 */ NULL, +/* 4801 */ NULL, +/* 4802 */ NULL, +/* 4803 */ NULL, +/* 4804 */ NULL, +/* 4805 */ NULL, +/* 4806 */ NULL, +/* 4807 */ NULL, +/* 4808 */ NULL, +/* 4809 */ NULL, +/* 480a */ NULL, +/* 480b */ NULL, +/* 480c */ NULL, +/* 480d */ NULL, +/* 480e */ NULL, +/* 480f */ NULL, +/* 4810 */ NULL, +/* 4811 */ NULL, +/* 4812 */ NULL, +/* 4813 */ NULL, +/* 4814 */ NULL, +/* 4815 */ NULL, +/* 4816 */ NULL, +/* 4817 */ NULL, +/* 4818 */ NULL, +/* 4819 */ NULL, +/* 481a */ NULL, +/* 481b */ NULL, +/* 481c */ NULL, +/* 481d */ NULL, +/* 481e */ NULL, +/* 481f */ NULL, +/* 4820 */ NULL, +/* 4821 */ NULL, +/* 4822 */ NULL, +/* 4823 */ NULL, +/* 4824 */ NULL, +/* 4825 */ NULL, +/* 4826 */ NULL, +/* 4827 */ NULL, +/* 4828 */ NULL, +/* 4829 */ NULL, +/* 482a */ NULL, +/* 482b */ NULL, +/* 482c */ NULL, +/* 482d */ NULL, +/* 482e */ NULL, +/* 482f */ NULL, +/* 4830 */ NULL, +/* 4831 */ NULL, +/* 4832 */ NULL, +/* 4833 */ NULL, +/* 4834 */ NULL, +/* 4835 */ NULL, +/* 4836 */ NULL, +/* 4837 */ NULL, +/* 4838 */ NULL, +/* 4839 */ NULL, +/* 483a */ NULL, +/* 483b */ NULL, +/* 483c */ NULL, +/* 483d */ NULL, +/* 483e */ NULL, +/* 483f */ NULL, +/* 4840 */ NULL, +/* 4841 */ NULL, +/* 4842 */ NULL, +/* 4843 */ NULL, +/* 4844 */ NULL, +/* 4845 */ NULL, +/* 4846 */ NULL, +/* 4847 */ NULL, +/* 4848 */ NULL, +/* 4849 */ NULL, +/* 484a */ NULL, +/* 484b */ NULL, +/* 484c */ NULL, +/* 484d */ NULL, +/* 484e */ NULL, +/* 484f */ NULL, +/* 4850 */ NULL, +/* 4851 */ NULL, +/* 4852 */ NULL, +/* 4853 */ NULL, +/* 4854 */ NULL, +/* 4855 */ NULL, +/* 4856 */ NULL, +/* 4857 */ NULL, +/* 4858 */ NULL, +/* 4859 */ NULL, +/* 485a */ NULL, +/* 485b */ NULL, +/* 485c */ NULL, +/* 485d */ NULL, +/* 485e */ NULL, +/* 485f */ NULL, +/* 4860 */ NULL, +/* 4861 */ NULL, +/* 4862 */ NULL, +/* 4863 */ NULL, +/* 4864 */ NULL, +/* 4865 */ NULL, +/* 4866 */ NULL, +/* 4867 */ NULL, +/* 4868 */ NULL, +/* 4869 */ NULL, +/* 486a */ NULL, +/* 486b */ NULL, +/* 486c */ NULL, +/* 486d */ NULL, +/* 486e */ NULL, +/* 486f */ NULL, +/* 4870 */ NULL, +/* 4871 */ NULL, +/* 4872 */ NULL, +/* 4873 */ NULL, +/* 4874 */ NULL, +/* 4875 */ NULL, +/* 4876 */ NULL, +/* 4877 */ NULL, +/* 4878 */ NULL, +/* 4879 */ NULL, +/* 487a */ NULL, +/* 487b */ NULL, +/* 487c */ NULL, +/* 487d */ NULL, +/* 487e */ NULL, +/* 487f */ NULL, +/* 4880 */ NULL, +/* 4881 */ NULL, +/* 4882 */ NULL, +/* 4883 */ NULL, +/* 4884 */ NULL, +/* 4885 */ NULL, +/* 4886 */ NULL, +/* 4887 */ NULL, +/* 4888 */ NULL, +/* 4889 */ NULL, +/* 488a */ NULL, +/* 488b */ NULL, +/* 488c */ NULL, +/* 488d */ NULL, +/* 488e */ NULL, +/* 488f */ NULL, +/* 4890 */ NULL, +/* 4891 */ NULL, +/* 4892 */ NULL, +/* 4893 */ NULL, +/* 4894 */ NULL, +/* 4895 */ NULL, +/* 4896 */ NULL, +/* 4897 */ NULL, +/* 4898 */ NULL, +/* 4899 */ NULL, +/* 489a */ NULL, +/* 489b */ NULL, +/* 489c */ NULL, +/* 489d */ NULL, +/* 489e */ NULL, +/* 489f */ NULL, +/* 48a0 */ NULL, +/* 48a1 */ NULL, +/* 48a2 */ NULL, +/* 48a3 */ NULL, +/* 48a4 */ NULL, +/* 48a5 */ NULL, +/* 48a6 */ NULL, +/* 48a7 */ NULL, +/* 48a8 */ NULL, +/* 48a9 */ NULL, +/* 48aa */ NULL, +/* 48ab */ NULL, +/* 48ac */ NULL, +/* 48ad */ NULL, +/* 48ae */ NULL, +/* 48af */ NULL, +/* 48b0 */ NULL, +/* 48b1 */ NULL, +/* 48b2 */ NULL, +/* 48b3 */ NULL, +/* 48b4 */ NULL, +/* 48b5 */ NULL, +/* 48b6 */ NULL, +/* 48b7 */ NULL, +/* 48b8 */ NULL, +/* 48b9 */ NULL, +/* 48ba */ NULL, +/* 48bb */ NULL, +/* 48bc */ NULL, +/* 48bd */ NULL, +/* 48be */ NULL, +/* 48bf */ NULL, +/* 48c0 */ NULL, +/* 48c1 */ NULL, +/* 48c2 */ NULL, +/* 48c3 */ NULL, +/* 48c4 */ NULL, +/* 48c5 */ NULL, +/* 48c6 */ NULL, +/* 48c7 */ NULL, +/* 48c8 */ NULL, +/* 48c9 */ NULL, +/* 48ca */ NULL, +/* 48cb */ NULL, +/* 48cc */ NULL, +/* 48cd */ NULL, +/* 48ce */ NULL, +/* 48cf */ NULL, +/* 48d0 */ NULL, +/* 48d1 */ NULL, +/* 48d2 */ NULL, +/* 48d3 */ NULL, +/* 48d4 */ NULL, +/* 48d5 */ NULL, +/* 48d6 */ NULL, +/* 48d7 */ NULL, +/* 48d8 */ NULL, +/* 48d9 */ NULL, +/* 48da */ NULL, +/* 48db */ NULL, +/* 48dc */ NULL, +/* 48dd */ NULL, +/* 48de */ NULL, +/* 48df */ NULL, +/* 48e0 */ NULL, +/* 48e1 */ NULL, +/* 48e2 */ NULL, +/* 48e3 */ NULL, +/* 48e4 */ NULL, +/* 48e5 */ NULL, +/* 48e6 */ NULL, +/* 48e7 */ NULL, +/* 48e8 */ NULL, +/* 48e9 */ NULL, +/* 48ea */ NULL, +/* 48eb */ NULL, +/* 48ec */ NULL, +/* 48ed */ NULL, +/* 48ee */ NULL, +/* 48ef */ NULL, +/* 48f0 */ NULL, +/* 48f1 */ NULL, +/* 48f2 */ NULL, +/* 48f3 */ NULL, +/* 48f4 */ NULL, +/* 48f5 */ NULL, +/* 48f6 */ NULL, +/* 48f7 */ NULL, +/* 48f8 */ NULL, +/* 48f9 */ NULL, +/* 48fa */ NULL, +/* 48fb */ NULL, +/* 48fc */ NULL, +/* 48fd */ NULL, +/* 48fe */ NULL, +/* 48ff */ NULL, +/* 4900 */ NULL, +/* 4901 */ NULL, +/* 4902 */ NULL, +/* 4903 */ NULL, +/* 4904 */ NULL, +/* 4905 */ NULL, +/* 4906 */ NULL, +/* 4907 */ NULL, +/* 4908 */ NULL, +/* 4909 */ NULL, +/* 490a */ NULL, +/* 490b */ NULL, +/* 490c */ NULL, +/* 490d */ NULL, +/* 490e */ NULL, +/* 490f */ NULL, +/* 4910 */ NULL, +/* 4911 */ NULL, +/* 4912 */ NULL, +/* 4913 */ NULL, +/* 4914 */ NULL, +/* 4915 */ NULL, +/* 4916 */ NULL, +/* 4917 */ NULL, +/* 4918 */ NULL, +/* 4919 */ NULL, +/* 491a */ NULL, +/* 491b */ NULL, +/* 491c */ NULL, +/* 491d */ NULL, +/* 491e */ NULL, +/* 491f */ NULL, +/* 4920 */ NULL, +/* 4921 */ NULL, +/* 4922 */ NULL, +/* 4923 */ NULL, +/* 4924 */ NULL, +/* 4925 */ NULL, +/* 4926 */ NULL, +/* 4927 */ NULL, +/* 4928 */ NULL, +/* 4929 */ NULL, +/* 492a */ NULL, +/* 492b */ NULL, +/* 492c */ NULL, +/* 492d */ NULL, +/* 492e */ NULL, +/* 492f */ NULL, +/* 4930 */ NULL, +/* 4931 */ NULL, +/* 4932 */ NULL, +/* 4933 */ NULL, +/* 4934 */ NULL, +/* 4935 */ NULL, +/* 4936 */ NULL, +/* 4937 */ NULL, +/* 4938 */ NULL, +/* 4939 */ NULL, +/* 493a */ NULL, +/* 493b */ NULL, +/* 493c */ NULL, +/* 493d */ NULL, +/* 493e */ NULL, +/* 493f */ NULL, +/* 4940 */ NULL, +/* 4941 */ NULL, +/* 4942 */ NULL, +/* 4943 */ NULL, +/* 4944 */ NULL, +/* 4945 */ NULL, +/* 4946 */ NULL, +/* 4947 */ NULL, +/* 4948 */ NULL, +/* 4949 */ NULL, +/* 494a */ NULL, +/* 494b */ NULL, +/* 494c */ NULL, +/* 494d */ NULL, +/* 494e */ NULL, +/* 494f */ NULL, +/* 4950 */ NULL, +/* 4951 */ NULL, +/* 4952 */ NULL, +/* 4953 */ NULL, +/* 4954 */ NULL, +/* 4955 */ NULL, +/* 4956 */ NULL, +/* 4957 */ NULL, +/* 4958 */ NULL, +/* 4959 */ NULL, +/* 495a */ NULL, +/* 495b */ NULL, +/* 495c */ NULL, +/* 495d */ NULL, +/* 495e */ NULL, +/* 495f */ NULL, +/* 4960 */ NULL, +/* 4961 */ NULL, +/* 4962 */ NULL, +/* 4963 */ NULL, +/* 4964 */ NULL, +/* 4965 */ NULL, +/* 4966 */ NULL, +/* 4967 */ NULL, +/* 4968 */ NULL, +/* 4969 */ NULL, +/* 496a */ NULL, +/* 496b */ NULL, +/* 496c */ NULL, +/* 496d */ NULL, +/* 496e */ NULL, +/* 496f */ NULL, +/* 4970 */ NULL, +/* 4971 */ NULL, +/* 4972 */ NULL, +/* 4973 */ NULL, +/* 4974 */ NULL, +/* 4975 */ NULL, +/* 4976 */ NULL, +/* 4977 */ NULL, +/* 4978 */ NULL, +/* 4979 */ NULL, +/* 497a */ NULL, +/* 497b */ NULL, +/* 497c */ NULL, +/* 497d */ NULL, +/* 497e */ NULL, +/* 497f */ NULL, +/* 4980 */ NULL, +/* 4981 */ NULL, +/* 4982 */ NULL, +/* 4983 */ NULL, +/* 4984 */ NULL, +/* 4985 */ NULL, +/* 4986 */ NULL, +/* 4987 */ NULL, +/* 4988 */ NULL, +/* 4989 */ NULL, +/* 498a */ NULL, +/* 498b */ NULL, +/* 498c */ NULL, +/* 498d */ NULL, +/* 498e */ NULL, +/* 498f */ NULL, +/* 4990 */ NULL, +/* 4991 */ NULL, +/* 4992 */ NULL, +/* 4993 */ NULL, +/* 4994 */ NULL, +/* 4995 */ NULL, +/* 4996 */ NULL, +/* 4997 */ NULL, +/* 4998 */ NULL, +/* 4999 */ NULL, +/* 499a */ NULL, +/* 499b */ NULL, +/* 499c */ NULL, +/* 499d */ NULL, +/* 499e */ NULL, +/* 499f */ NULL, +/* 49a0 */ NULL, +/* 49a1 */ NULL, +/* 49a2 */ NULL, +/* 49a3 */ NULL, +/* 49a4 */ NULL, +/* 49a5 */ NULL, +/* 49a6 */ NULL, +/* 49a7 */ NULL, +/* 49a8 */ NULL, +/* 49a9 */ NULL, +/* 49aa */ NULL, +/* 49ab */ NULL, +/* 49ac */ NULL, +/* 49ad */ NULL, +/* 49ae */ NULL, +/* 49af */ NULL, +/* 49b0 */ NULL, +/* 49b1 */ NULL, +/* 49b2 */ NULL, +/* 49b3 */ NULL, +/* 49b4 */ NULL, +/* 49b5 */ NULL, +/* 49b6 */ NULL, +/* 49b7 */ NULL, +/* 49b8 */ NULL, +/* 49b9 */ NULL, +/* 49ba */ NULL, +/* 49bb */ NULL, +/* 49bc */ NULL, +/* 49bd */ NULL, +/* 49be */ NULL, +/* 49bf */ NULL, +/* 49c0 */ NULL, +/* 49c1 */ NULL, +/* 49c2 */ NULL, +/* 49c3 */ NULL, +/* 49c4 */ NULL, +/* 49c5 */ NULL, +/* 49c6 */ NULL, +/* 49c7 */ NULL, +/* 49c8 */ NULL, +/* 49c9 */ NULL, +/* 49ca */ NULL, +/* 49cb */ NULL, +/* 49cc */ NULL, +/* 49cd */ NULL, +/* 49ce */ NULL, +/* 49cf */ NULL, +/* 49d0 */ NULL, +/* 49d1 */ NULL, +/* 49d2 */ NULL, +/* 49d3 */ NULL, +/* 49d4 */ NULL, +/* 49d5 */ NULL, +/* 49d6 */ NULL, +/* 49d7 */ NULL, +/* 49d8 */ NULL, +/* 49d9 */ NULL, +/* 49da */ NULL, +/* 49db */ NULL, +/* 49dc */ NULL, +/* 49dd */ NULL, +/* 49de */ NULL, +/* 49df */ NULL, +/* 49e0 */ NULL, +/* 49e1 */ NULL, +/* 49e2 */ NULL, +/* 49e3 */ NULL, +/* 49e4 */ NULL, +/* 49e5 */ NULL, +/* 49e6 */ NULL, +/* 49e7 */ NULL, +/* 49e8 */ NULL, +/* 49e9 */ NULL, +/* 49ea */ NULL, +/* 49eb */ NULL, +/* 49ec */ NULL, +/* 49ed */ NULL, +/* 49ee */ NULL, +/* 49ef */ NULL, +/* 49f0 */ NULL, +/* 49f1 */ NULL, +/* 49f2 */ NULL, +/* 49f3 */ NULL, +/* 49f4 */ NULL, +/* 49f5 */ NULL, +/* 49f6 */ NULL, +/* 49f7 */ NULL, +/* 49f8 */ NULL, +/* 49f9 */ NULL, +/* 49fa */ NULL, +/* 49fb */ NULL, +/* 49fc */ NULL, +/* 49fd */ NULL, +/* 49fe */ NULL, +/* 49ff */ NULL, +/* 4a00 */ NULL, +/* 4a01 */ NULL, +/* 4a02 */ NULL, +/* 4a03 */ NULL, +/* 4a04 */ NULL, +/* 4a05 */ NULL, +/* 4a06 */ NULL, +/* 4a07 */ NULL, +/* 4a08 */ NULL, +/* 4a09 */ NULL, +/* 4a0a */ NULL, +/* 4a0b */ NULL, +/* 4a0c */ NULL, +/* 4a0d */ NULL, +/* 4a0e */ NULL, +/* 4a0f */ NULL, +/* 4a10 */ NULL, +/* 4a11 */ NULL, +/* 4a12 */ NULL, +/* 4a13 */ NULL, +/* 4a14 */ NULL, +/* 4a15 */ NULL, +/* 4a16 */ NULL, +/* 4a17 */ NULL, +/* 4a18 */ NULL, +/* 4a19 */ NULL, +/* 4a1a */ NULL, +/* 4a1b */ NULL, +/* 4a1c */ NULL, +/* 4a1d */ NULL, +/* 4a1e */ NULL, +/* 4a1f */ NULL, +/* 4a20 */ NULL, +/* 4a21 */ NULL, +/* 4a22 */ NULL, +/* 4a23 */ NULL, +/* 4a24 */ NULL, +/* 4a25 */ NULL, +/* 4a26 */ NULL, +/* 4a27 */ NULL, +/* 4a28 */ NULL, +/* 4a29 */ NULL, +/* 4a2a */ NULL, +/* 4a2b */ NULL, +/* 4a2c */ NULL, +/* 4a2d */ NULL, +/* 4a2e */ NULL, +/* 4a2f */ NULL, +/* 4a30 */ NULL, +/* 4a31 */ NULL, +/* 4a32 */ NULL, +/* 4a33 */ NULL, +/* 4a34 */ NULL, +/* 4a35 */ NULL, +/* 4a36 */ NULL, +/* 4a37 */ NULL, +/* 4a38 */ NULL, +/* 4a39 */ NULL, +/* 4a3a */ NULL, +/* 4a3b */ NULL, +/* 4a3c */ NULL, +/* 4a3d */ NULL, +/* 4a3e */ NULL, +/* 4a3f */ NULL, +/* 4a40 */ NULL, +/* 4a41 */ NULL, +/* 4a42 */ NULL, +/* 4a43 */ NULL, +/* 4a44 */ NULL, +/* 4a45 */ NULL, +/* 4a46 */ NULL, +/* 4a47 */ NULL, +/* 4a48 */ NULL, +/* 4a49 */ NULL, +/* 4a4a */ NULL, +/* 4a4b */ NULL, +/* 4a4c */ NULL, +/* 4a4d */ NULL, +/* 4a4e */ NULL, +/* 4a4f */ NULL, +/* 4a50 */ NULL, +/* 4a51 */ NULL, +/* 4a52 */ NULL, +/* 4a53 */ NULL, +/* 4a54 */ NULL, +/* 4a55 */ NULL, +/* 4a56 */ NULL, +/* 4a57 */ NULL, +/* 4a58 */ NULL, +/* 4a59 */ NULL, +/* 4a5a */ NULL, +/* 4a5b */ NULL, +/* 4a5c */ NULL, +/* 4a5d */ NULL, +/* 4a5e */ NULL, +/* 4a5f */ NULL, +/* 4a60 */ NULL, +/* 4a61 */ NULL, +/* 4a62 */ NULL, +/* 4a63 */ NULL, +/* 4a64 */ NULL, +/* 4a65 */ NULL, +/* 4a66 */ NULL, +/* 4a67 */ NULL, +/* 4a68 */ NULL, +/* 4a69 */ NULL, +/* 4a6a */ NULL, +/* 4a6b */ NULL, +/* 4a6c */ NULL, +/* 4a6d */ NULL, +/* 4a6e */ NULL, +/* 4a6f */ NULL, +/* 4a70 */ NULL, +/* 4a71 */ NULL, +/* 4a72 */ NULL, +/* 4a73 */ NULL, +/* 4a74 */ NULL, +/* 4a75 */ NULL, +/* 4a76 */ NULL, +/* 4a77 */ NULL, +/* 4a78 */ NULL, +/* 4a79 */ NULL, +/* 4a7a */ NULL, +/* 4a7b */ NULL, +/* 4a7c */ NULL, +/* 4a7d */ NULL, +/* 4a7e */ NULL, +/* 4a7f */ NULL, +/* 4a80 */ NULL, +/* 4a81 */ NULL, +/* 4a82 */ NULL, +/* 4a83 */ NULL, +/* 4a84 */ NULL, +/* 4a85 */ NULL, +/* 4a86 */ NULL, +/* 4a87 */ NULL, +/* 4a88 */ NULL, +/* 4a89 */ NULL, +/* 4a8a */ NULL, +/* 4a8b */ NULL, +/* 4a8c */ NULL, +/* 4a8d */ NULL, +/* 4a8e */ NULL, +/* 4a8f */ NULL, +/* 4a90 */ NULL, +/* 4a91 */ NULL, +/* 4a92 */ NULL, +/* 4a93 */ NULL, +/* 4a94 */ NULL, +/* 4a95 */ NULL, +/* 4a96 */ NULL, +/* 4a97 */ NULL, +/* 4a98 */ NULL, +/* 4a99 */ NULL, +/* 4a9a */ NULL, +/* 4a9b */ NULL, +/* 4a9c */ NULL, +/* 4a9d */ NULL, +/* 4a9e */ NULL, +/* 4a9f */ NULL, +/* 4aa0 */ NULL, +/* 4aa1 */ NULL, +/* 4aa2 */ NULL, +/* 4aa3 */ NULL, +/* 4aa4 */ NULL, +/* 4aa5 */ NULL, +/* 4aa6 */ NULL, +/* 4aa7 */ NULL, +/* 4aa8 */ NULL, +/* 4aa9 */ NULL, +/* 4aaa */ NULL, +/* 4aab */ NULL, +/* 4aac */ NULL, +/* 4aad */ NULL, +/* 4aae */ NULL, +/* 4aaf */ NULL, +/* 4ab0 */ NULL, +/* 4ab1 */ NULL, +/* 4ab2 */ NULL, +/* 4ab3 */ NULL, +/* 4ab4 */ NULL, +/* 4ab5 */ NULL, +/* 4ab6 */ NULL, +/* 4ab7 */ NULL, +/* 4ab8 */ NULL, +/* 4ab9 */ NULL, +/* 4aba */ NULL, +/* 4abb */ NULL, +/* 4abc */ NULL, +/* 4abd */ NULL, +/* 4abe */ NULL, +/* 4abf */ NULL, +/* 4ac0 */ NULL, +/* 4ac1 */ NULL, +/* 4ac2 */ NULL, +/* 4ac3 */ NULL, +/* 4ac4 */ NULL, +/* 4ac5 */ NULL, +/* 4ac6 */ NULL, +/* 4ac7 */ NULL, +/* 4ac8 */ NULL, +/* 4ac9 */ NULL, +/* 4aca */ NULL, +/* 4acb */ NULL, +/* 4acc */ NULL, +/* 4acd */ NULL, +/* 4ace */ NULL, +/* 4acf */ NULL, +/* 4ad0 */ NULL, +/* 4ad1 */ NULL, +/* 4ad2 */ NULL, +/* 4ad3 */ NULL, +/* 4ad4 */ NULL, +/* 4ad5 */ NULL, +/* 4ad6 */ NULL, +/* 4ad7 */ NULL, +/* 4ad8 */ NULL, +/* 4ad9 */ NULL, +/* 4ada */ NULL, +/* 4adb */ NULL, +/* 4adc */ NULL, +/* 4add */ NULL, +/* 4ade */ NULL, +/* 4adf */ NULL, +/* 4ae0 */ NULL, +/* 4ae1 */ NULL, +/* 4ae2 */ NULL, +/* 4ae3 */ NULL, +/* 4ae4 */ NULL, +/* 4ae5 */ NULL, +/* 4ae6 */ NULL, +/* 4ae7 */ NULL, +/* 4ae8 */ NULL, +/* 4ae9 */ NULL, +/* 4aea */ NULL, +/* 4aeb */ NULL, +/* 4aec */ NULL, +/* 4aed */ NULL, +/* 4aee */ NULL, +/* 4aef */ NULL, +/* 4af0 */ NULL, +/* 4af1 */ NULL, +/* 4af2 */ NULL, +/* 4af3 */ NULL, +/* 4af4 */ NULL, +/* 4af5 */ NULL, +/* 4af6 */ NULL, +/* 4af7 */ NULL, +/* 4af8 */ NULL, +/* 4af9 */ NULL, +/* 4afa */ NULL, +/* 4afb */ NULL, +/* 4afc */ NULL, +/* 4afd */ NULL, +/* 4afe */ NULL, +/* 4aff */ NULL, +/* 4b00 */ NULL, +/* 4b01 */ NULL, +/* 4b02 */ NULL, +/* 4b03 */ NULL, +/* 4b04 */ NULL, +/* 4b05 */ NULL, +/* 4b06 */ NULL, +/* 4b07 */ NULL, +/* 4b08 */ NULL, +/* 4b09 */ NULL, +/* 4b0a */ NULL, +/* 4b0b */ NULL, +/* 4b0c */ NULL, +/* 4b0d */ NULL, +/* 4b0e */ NULL, +/* 4b0f */ NULL, +/* 4b10 */ NULL, +/* 4b11 */ NULL, +/* 4b12 */ NULL, +/* 4b13 */ NULL, +/* 4b14 */ NULL, +/* 4b15 */ NULL, +/* 4b16 */ NULL, +/* 4b17 */ NULL, +/* 4b18 */ NULL, +/* 4b19 */ NULL, +/* 4b1a */ NULL, +/* 4b1b */ NULL, +/* 4b1c */ NULL, +/* 4b1d */ NULL, +/* 4b1e */ NULL, +/* 4b1f */ NULL, +/* 4b20 */ NULL, +/* 4b21 */ NULL, +/* 4b22 */ NULL, +/* 4b23 */ NULL, +/* 4b24 */ NULL, +/* 4b25 */ NULL, +/* 4b26 */ NULL, +/* 4b27 */ NULL, +/* 4b28 */ NULL, +/* 4b29 */ NULL, +/* 4b2a */ NULL, +/* 4b2b */ NULL, +/* 4b2c */ NULL, +/* 4b2d */ NULL, +/* 4b2e */ NULL, +/* 4b2f */ NULL, +/* 4b30 */ NULL, +/* 4b31 */ NULL, +/* 4b32 */ NULL, +/* 4b33 */ NULL, +/* 4b34 */ NULL, +/* 4b35 */ NULL, +/* 4b36 */ NULL, +/* 4b37 */ NULL, +/* 4b38 */ NULL, +/* 4b39 */ NULL, +/* 4b3a */ NULL, +/* 4b3b */ NULL, +/* 4b3c */ NULL, +/* 4b3d */ NULL, +/* 4b3e */ NULL, +/* 4b3f */ NULL, +/* 4b40 */ NULL, +/* 4b41 */ NULL, +/* 4b42 */ NULL, +/* 4b43 */ NULL, +/* 4b44 */ NULL, +/* 4b45 */ NULL, +/* 4b46 */ NULL, +/* 4b47 */ NULL, +/* 4b48 */ NULL, +/* 4b49 */ NULL, +/* 4b4a */ NULL, +/* 4b4b */ NULL, +/* 4b4c */ NULL, +/* 4b4d */ NULL, +/* 4b4e */ NULL, +/* 4b4f */ NULL, +/* 4b50 */ NULL, +/* 4b51 */ NULL, +/* 4b52 */ NULL, +/* 4b53 */ NULL, +/* 4b54 */ NULL, +/* 4b55 */ NULL, +/* 4b56 */ NULL, +/* 4b57 */ NULL, +/* 4b58 */ NULL, +/* 4b59 */ NULL, +/* 4b5a */ NULL, +/* 4b5b */ NULL, +/* 4b5c */ NULL, +/* 4b5d */ NULL, +/* 4b5e */ NULL, +/* 4b5f */ NULL, +/* 4b60 */ NULL, +/* 4b61 */ NULL, +/* 4b62 */ NULL, +/* 4b63 */ NULL, +/* 4b64 */ NULL, +/* 4b65 */ NULL, +/* 4b66 */ NULL, +/* 4b67 */ NULL, +/* 4b68 */ NULL, +/* 4b69 */ NULL, +/* 4b6a */ NULL, +/* 4b6b */ NULL, +/* 4b6c */ NULL, +/* 4b6d */ NULL, +/* 4b6e */ NULL, +/* 4b6f */ NULL, +/* 4b70 */ NULL, +/* 4b71 */ NULL, +/* 4b72 */ NULL, +/* 4b73 */ NULL, +/* 4b74 */ NULL, +/* 4b75 */ NULL, +/* 4b76 */ NULL, +/* 4b77 */ NULL, +/* 4b78 */ NULL, +/* 4b79 */ NULL, +/* 4b7a */ NULL, +/* 4b7b */ NULL, +/* 4b7c */ NULL, +/* 4b7d */ NULL, +/* 4b7e */ NULL, +/* 4b7f */ NULL, +/* 4b80 */ NULL, +/* 4b81 */ NULL, +/* 4b82 */ NULL, +/* 4b83 */ NULL, +/* 4b84 */ NULL, +/* 4b85 */ NULL, +/* 4b86 */ NULL, +/* 4b87 */ NULL, +/* 4b88 */ NULL, +/* 4b89 */ NULL, +/* 4b8a */ NULL, +/* 4b8b */ NULL, +/* 4b8c */ NULL, +/* 4b8d */ NULL, +/* 4b8e */ NULL, +/* 4b8f */ NULL, +/* 4b90 */ NULL, +/* 4b91 */ NULL, +/* 4b92 */ NULL, +/* 4b93 */ NULL, +/* 4b94 */ NULL, +/* 4b95 */ NULL, +/* 4b96 */ NULL, +/* 4b97 */ NULL, +/* 4b98 */ NULL, +/* 4b99 */ NULL, +/* 4b9a */ NULL, +/* 4b9b */ NULL, +/* 4b9c */ NULL, +/* 4b9d */ NULL, +/* 4b9e */ NULL, +/* 4b9f */ NULL, +/* 4ba0 */ NULL, +/* 4ba1 */ NULL, +/* 4ba2 */ NULL, +/* 4ba3 */ NULL, +/* 4ba4 */ NULL, +/* 4ba5 */ NULL, +/* 4ba6 */ NULL, +/* 4ba7 */ NULL, +/* 4ba8 */ NULL, +/* 4ba9 */ NULL, +/* 4baa */ NULL, +/* 4bab */ NULL, +/* 4bac */ NULL, +/* 4bad */ NULL, +/* 4bae */ NULL, +/* 4baf */ NULL, +/* 4bb0 */ NULL, +/* 4bb1 */ NULL, +/* 4bb2 */ NULL, +/* 4bb3 */ NULL, +/* 4bb4 */ NULL, +/* 4bb5 */ NULL, +/* 4bb6 */ NULL, +/* 4bb7 */ NULL, +/* 4bb8 */ NULL, +/* 4bb9 */ NULL, +/* 4bba */ NULL, +/* 4bbb */ NULL, +/* 4bbc */ NULL, +/* 4bbd */ NULL, +/* 4bbe */ NULL, +/* 4bbf */ NULL, +/* 4bc0 */ NULL, +/* 4bc1 */ NULL, +/* 4bc2 */ NULL, +/* 4bc3 */ NULL, +/* 4bc4 */ NULL, +/* 4bc5 */ NULL, +/* 4bc6 */ NULL, +/* 4bc7 */ NULL, +/* 4bc8 */ NULL, +/* 4bc9 */ NULL, +/* 4bca */ NULL, +/* 4bcb */ NULL, +/* 4bcc */ NULL, +/* 4bcd */ NULL, +/* 4bce */ NULL, +/* 4bcf */ NULL, +/* 4bd0 */ NULL, +/* 4bd1 */ NULL, +/* 4bd2 */ NULL, +/* 4bd3 */ NULL, +/* 4bd4 */ NULL, +/* 4bd5 */ NULL, +/* 4bd6 */ NULL, +/* 4bd7 */ NULL, +/* 4bd8 */ NULL, +/* 4bd9 */ NULL, +/* 4bda */ NULL, +/* 4bdb */ NULL, +/* 4bdc */ NULL, +/* 4bdd */ NULL, +/* 4bde */ NULL, +/* 4bdf */ NULL, +/* 4be0 */ NULL, +/* 4be1 */ NULL, +/* 4be2 */ NULL, +/* 4be3 */ NULL, +/* 4be4 */ NULL, +/* 4be5 */ NULL, +/* 4be6 */ NULL, +/* 4be7 */ NULL, +/* 4be8 */ NULL, +/* 4be9 */ NULL, +/* 4bea */ NULL, +/* 4beb */ NULL, +/* 4bec */ NULL, +/* 4bed */ NULL, +/* 4bee */ NULL, +/* 4bef */ NULL, +/* 4bf0 */ NULL, +/* 4bf1 */ NULL, +/* 4bf2 */ NULL, +/* 4bf3 */ NULL, +/* 4bf4 */ NULL, +/* 4bf5 */ NULL, +/* 4bf6 */ NULL, +/* 4bf7 */ NULL, +/* 4bf8 */ NULL, +/* 4bf9 */ NULL, +/* 4bfa */ NULL, +/* 4bfb */ NULL, +/* 4bfc */ NULL, +/* 4bfd */ NULL, +/* 4bfe */ NULL, +/* 4bff */ NULL, +/* 4c00 */ NULL, +/* 4c01 */ NULL, +/* 4c02 */ NULL, +/* 4c03 */ NULL, +/* 4c04 */ NULL, +/* 4c05 */ NULL, +/* 4c06 */ NULL, +/* 4c07 */ NULL, +/* 4c08 */ NULL, +/* 4c09 */ NULL, +/* 4c0a */ NULL, +/* 4c0b */ NULL, +/* 4c0c */ NULL, +/* 4c0d */ NULL, +/* 4c0e */ NULL, +/* 4c0f */ NULL, +/* 4c10 */ NULL, +/* 4c11 */ NULL, +/* 4c12 */ NULL, +/* 4c13 */ NULL, +/* 4c14 */ NULL, +/* 4c15 */ NULL, +/* 4c16 */ NULL, +/* 4c17 */ NULL, +/* 4c18 */ NULL, +/* 4c19 */ NULL, +/* 4c1a */ NULL, +/* 4c1b */ NULL, +/* 4c1c */ NULL, +/* 4c1d */ NULL, +/* 4c1e */ NULL, +/* 4c1f */ NULL, +/* 4c20 */ NULL, +/* 4c21 */ NULL, +/* 4c22 */ NULL, +/* 4c23 */ NULL, +/* 4c24 */ NULL, +/* 4c25 */ NULL, +/* 4c26 */ NULL, +/* 4c27 */ NULL, +/* 4c28 */ NULL, +/* 4c29 */ NULL, +/* 4c2a */ NULL, +/* 4c2b */ NULL, +/* 4c2c */ NULL, +/* 4c2d */ NULL, +/* 4c2e */ NULL, +/* 4c2f */ NULL, +/* 4c30 */ NULL, +/* 4c31 */ NULL, +/* 4c32 */ NULL, +/* 4c33 */ NULL, +/* 4c34 */ NULL, +/* 4c35 */ NULL, +/* 4c36 */ NULL, +/* 4c37 */ NULL, +/* 4c38 */ NULL, +/* 4c39 */ NULL, +/* 4c3a */ NULL, +/* 4c3b */ NULL, +/* 4c3c */ NULL, +/* 4c3d */ NULL, +/* 4c3e */ NULL, +/* 4c3f */ NULL, +/* 4c40 */ NULL, +/* 4c41 */ NULL, +/* 4c42 */ NULL, +/* 4c43 */ NULL, +/* 4c44 */ NULL, +/* 4c45 */ NULL, +/* 4c46 */ NULL, +/* 4c47 */ NULL, +/* 4c48 */ NULL, +/* 4c49 */ NULL, +/* 4c4a */ NULL, +/* 4c4b */ NULL, +/* 4c4c */ NULL, +/* 4c4d */ NULL, +/* 4c4e */ NULL, +/* 4c4f */ NULL, +/* 4c50 */ NULL, +/* 4c51 */ NULL, +/* 4c52 */ NULL, +/* 4c53 */ NULL, +/* 4c54 */ NULL, +/* 4c55 */ NULL, +/* 4c56 */ NULL, +/* 4c57 */ NULL, +/* 4c58 */ NULL, +/* 4c59 */ NULL, +/* 4c5a */ NULL, +/* 4c5b */ NULL, +/* 4c5c */ NULL, +/* 4c5d */ NULL, +/* 4c5e */ NULL, +/* 4c5f */ NULL, +/* 4c60 */ NULL, +/* 4c61 */ NULL, +/* 4c62 */ NULL, +/* 4c63 */ NULL, +/* 4c64 */ NULL, +/* 4c65 */ NULL, +/* 4c66 */ NULL, +/* 4c67 */ NULL, +/* 4c68 */ NULL, +/* 4c69 */ NULL, +/* 4c6a */ NULL, +/* 4c6b */ NULL, +/* 4c6c */ NULL, +/* 4c6d */ NULL, +/* 4c6e */ NULL, +/* 4c6f */ NULL, +/* 4c70 */ NULL, +/* 4c71 */ NULL, +/* 4c72 */ NULL, +/* 4c73 */ NULL, +/* 4c74 */ NULL, +/* 4c75 */ NULL, +/* 4c76 */ NULL, +/* 4c77 */ NULL, +/* 4c78 */ NULL, +/* 4c79 */ NULL, +/* 4c7a */ NULL, +/* 4c7b */ NULL, +/* 4c7c */ NULL, +/* 4c7d */ NULL, +/* 4c7e */ NULL, +/* 4c7f */ NULL, +/* 4c80 */ NULL, +/* 4c81 */ NULL, +/* 4c82 */ NULL, +/* 4c83 */ NULL, +/* 4c84 */ NULL, +/* 4c85 */ NULL, +/* 4c86 */ NULL, +/* 4c87 */ NULL, +/* 4c88 */ NULL, +/* 4c89 */ NULL, +/* 4c8a */ NULL, +/* 4c8b */ NULL, +/* 4c8c */ NULL, +/* 4c8d */ NULL, +/* 4c8e */ NULL, +/* 4c8f */ NULL, +/* 4c90 */ NULL, +/* 4c91 */ NULL, +/* 4c92 */ NULL, +/* 4c93 */ NULL, +/* 4c94 */ NULL, +/* 4c95 */ NULL, +/* 4c96 */ NULL, +/* 4c97 */ NULL, +/* 4c98 */ NULL, +/* 4c99 */ NULL, +/* 4c9a */ NULL, +/* 4c9b */ NULL, +/* 4c9c */ NULL, +/* 4c9d */ NULL, +/* 4c9e */ NULL, +/* 4c9f */ NULL, +/* 4ca0 */ NULL, +/* 4ca1 */ NULL, +/* 4ca2 */ NULL, +/* 4ca3 */ NULL, +/* 4ca4 */ NULL, +/* 4ca5 */ NULL, +/* 4ca6 */ NULL, +/* 4ca7 */ NULL, +/* 4ca8 */ NULL, +/* 4ca9 */ NULL, +/* 4caa */ NULL, +/* 4cab */ NULL, +/* 4cac */ NULL, +/* 4cad */ NULL, +/* 4cae */ NULL, +/* 4caf */ NULL, +/* 4cb0 */ NULL, +/* 4cb1 */ NULL, +/* 4cb2 */ NULL, +/* 4cb3 */ NULL, +/* 4cb4 */ NULL, +/* 4cb5 */ NULL, +/* 4cb6 */ NULL, +/* 4cb7 */ NULL, +/* 4cb8 */ NULL, +/* 4cb9 */ NULL, +/* 4cba */ NULL, +/* 4cbb */ NULL, +/* 4cbc */ NULL, +/* 4cbd */ NULL, +/* 4cbe */ NULL, +/* 4cbf */ NULL, +/* 4cc0 */ NULL, +/* 4cc1 */ NULL, +/* 4cc2 */ NULL, +/* 4cc3 */ NULL, +/* 4cc4 */ NULL, +/* 4cc5 */ NULL, +/* 4cc6 */ NULL, +/* 4cc7 */ NULL, +/* 4cc8 */ NULL, +/* 4cc9 */ NULL, +/* 4cca */ NULL, +/* 4ccb */ NULL, +/* 4ccc */ NULL, +/* 4ccd */ NULL, +/* 4cce */ NULL, +/* 4ccf */ NULL, +/* 4cd0 */ NULL, +/* 4cd1 */ NULL, +/* 4cd2 */ NULL, +/* 4cd3 */ NULL, +/* 4cd4 */ NULL, +/* 4cd5 */ NULL, +/* 4cd6 */ NULL, +/* 4cd7 */ NULL, +/* 4cd8 */ NULL, +/* 4cd9 */ NULL, +/* 4cda */ NULL, +/* 4cdb */ NULL, +/* 4cdc */ NULL, +/* 4cdd */ NULL, +/* 4cde */ NULL, +/* 4cdf */ NULL, +/* 4ce0 */ NULL, +/* 4ce1 */ NULL, +/* 4ce2 */ NULL, +/* 4ce3 */ NULL, +/* 4ce4 */ NULL, +/* 4ce5 */ NULL, +/* 4ce6 */ NULL, +/* 4ce7 */ NULL, +/* 4ce8 */ NULL, +/* 4ce9 */ NULL, +/* 4cea */ NULL, +/* 4ceb */ NULL, +/* 4cec */ NULL, +/* 4ced */ NULL, +/* 4cee */ NULL, +/* 4cef */ NULL, +/* 4cf0 */ NULL, +/* 4cf1 */ NULL, +/* 4cf2 */ NULL, +/* 4cf3 */ NULL, +/* 4cf4 */ NULL, +/* 4cf5 */ NULL, +/* 4cf6 */ NULL, +/* 4cf7 */ NULL, +/* 4cf8 */ NULL, +/* 4cf9 */ NULL, +/* 4cfa */ NULL, +/* 4cfb */ NULL, +/* 4cfc */ NULL, +/* 4cfd */ NULL, +/* 4cfe */ NULL, +/* 4cff */ NULL, +/* 4d00 */ NULL, +/* 4d01 */ NULL, +/* 4d02 */ NULL, +/* 4d03 */ NULL, +/* 4d04 */ NULL, +/* 4d05 */ NULL, +/* 4d06 */ NULL, +/* 4d07 */ NULL, +/* 4d08 */ NULL, +/* 4d09 */ NULL, +/* 4d0a */ NULL, +/* 4d0b */ NULL, +/* 4d0c */ NULL, +/* 4d0d */ NULL, +/* 4d0e */ NULL, +/* 4d0f */ NULL, +/* 4d10 */ NULL, +/* 4d11 */ NULL, +/* 4d12 */ NULL, +/* 4d13 */ NULL, +/* 4d14 */ NULL, +/* 4d15 */ NULL, +/* 4d16 */ NULL, +/* 4d17 */ NULL, +/* 4d18 */ NULL, +/* 4d19 */ NULL, +/* 4d1a */ NULL, +/* 4d1b */ NULL, +/* 4d1c */ NULL, +/* 4d1d */ NULL, +/* 4d1e */ NULL, +/* 4d1f */ NULL, +/* 4d20 */ NULL, +/* 4d21 */ NULL, +/* 4d22 */ NULL, +/* 4d23 */ NULL, +/* 4d24 */ NULL, +/* 4d25 */ NULL, +/* 4d26 */ NULL, +/* 4d27 */ NULL, +/* 4d28 */ NULL, +/* 4d29 */ NULL, +/* 4d2a */ NULL, +/* 4d2b */ NULL, +/* 4d2c */ NULL, +/* 4d2d */ NULL, +/* 4d2e */ NULL, +/* 4d2f */ NULL, +/* 4d30 */ NULL, +/* 4d31 */ NULL, +/* 4d32 */ NULL, +/* 4d33 */ NULL, +/* 4d34 */ NULL, +/* 4d35 */ NULL, +/* 4d36 */ NULL, +/* 4d37 */ NULL, +/* 4d38 */ NULL, +/* 4d39 */ NULL, +/* 4d3a */ NULL, +/* 4d3b */ NULL, +/* 4d3c */ NULL, +/* 4d3d */ NULL, +/* 4d3e */ NULL, +/* 4d3f */ NULL, +/* 4d40 */ NULL, +/* 4d41 */ NULL, +/* 4d42 */ NULL, +/* 4d43 */ NULL, +/* 4d44 */ NULL, +/* 4d45 */ NULL, +/* 4d46 */ NULL, +/* 4d47 */ NULL, +/* 4d48 */ NULL, +/* 4d49 */ NULL, +/* 4d4a */ NULL, +/* 4d4b */ NULL, +/* 4d4c */ NULL, +/* 4d4d */ NULL, +/* 4d4e */ NULL, +/* 4d4f */ NULL, +/* 4d50 */ NULL, +/* 4d51 */ NULL, +/* 4d52 */ NULL, +/* 4d53 */ NULL, +/* 4d54 */ NULL, +/* 4d55 */ NULL, +/* 4d56 */ NULL, +/* 4d57 */ NULL, +/* 4d58 */ NULL, +/* 4d59 */ NULL, +/* 4d5a */ NULL, +/* 4d5b */ NULL, +/* 4d5c */ NULL, +/* 4d5d */ NULL, +/* 4d5e */ NULL, +/* 4d5f */ NULL, +/* 4d60 */ NULL, +/* 4d61 */ NULL, +/* 4d62 */ NULL, +/* 4d63 */ NULL, +/* 4d64 */ NULL, +/* 4d65 */ NULL, +/* 4d66 */ NULL, +/* 4d67 */ NULL, +/* 4d68 */ NULL, +/* 4d69 */ NULL, +/* 4d6a */ NULL, +/* 4d6b */ NULL, +/* 4d6c */ NULL, +/* 4d6d */ NULL, +/* 4d6e */ NULL, +/* 4d6f */ NULL, +/* 4d70 */ NULL, +/* 4d71 */ NULL, +/* 4d72 */ NULL, +/* 4d73 */ NULL, +/* 4d74 */ NULL, +/* 4d75 */ NULL, +/* 4d76 */ NULL, +/* 4d77 */ NULL, +/* 4d78 */ NULL, +/* 4d79 */ NULL, +/* 4d7a */ NULL, +/* 4d7b */ NULL, +/* 4d7c */ NULL, +/* 4d7d */ NULL, +/* 4d7e */ NULL, +/* 4d7f */ NULL, +/* 4d80 */ NULL, +/* 4d81 */ NULL, +/* 4d82 */ NULL, +/* 4d83 */ NULL, +/* 4d84 */ NULL, +/* 4d85 */ NULL, +/* 4d86 */ NULL, +/* 4d87 */ NULL, +/* 4d88 */ NULL, +/* 4d89 */ NULL, +/* 4d8a */ NULL, +/* 4d8b */ NULL, +/* 4d8c */ NULL, +/* 4d8d */ NULL, +/* 4d8e */ NULL, +/* 4d8f */ NULL, +/* 4d90 */ NULL, +/* 4d91 */ NULL, +/* 4d92 */ NULL, +/* 4d93 */ NULL, +/* 4d94 */ NULL, +/* 4d95 */ NULL, +/* 4d96 */ NULL, +/* 4d97 */ NULL, +/* 4d98 */ NULL, +/* 4d99 */ NULL, +/* 4d9a */ NULL, +/* 4d9b */ NULL, +/* 4d9c */ NULL, +/* 4d9d */ NULL, +/* 4d9e */ NULL, +/* 4d9f */ NULL, +/* 4da0 */ NULL, +/* 4da1 */ NULL, +/* 4da2 */ NULL, +/* 4da3 */ NULL, +/* 4da4 */ NULL, +/* 4da5 */ NULL, +/* 4da6 */ NULL, +/* 4da7 */ NULL, +/* 4da8 */ NULL, +/* 4da9 */ NULL, +/* 4daa */ NULL, +/* 4dab */ NULL, +/* 4dac */ NULL, +/* 4dad */ NULL, +/* 4dae */ NULL, +/* 4daf */ NULL, +/* 4db0 */ NULL, +/* 4db1 */ NULL, +/* 4db2 */ NULL, +/* 4db3 */ NULL, +/* 4db4 */ NULL, +/* 4db5 */ NULL, +/* 4db6 */ NULL, +/* 4db7 */ NULL, +/* 4db8 */ NULL, +/* 4db9 */ NULL, +/* 4dba */ NULL, +/* 4dbb */ NULL, +/* 4dbc */ NULL, +/* 4dbd */ NULL, +/* 4dbe */ NULL, +/* 4dbf */ NULL, +/* 4dc0 */ NULL, +/* 4dc1 */ NULL, +/* 4dc2 */ NULL, +/* 4dc3 */ NULL, +/* 4dc4 */ NULL, +/* 4dc5 */ NULL, +/* 4dc6 */ NULL, +/* 4dc7 */ NULL, +/* 4dc8 */ NULL, +/* 4dc9 */ NULL, +/* 4dca */ NULL, +/* 4dcb */ NULL, +/* 4dcc */ NULL, +/* 4dcd */ NULL, +/* 4dce */ NULL, +/* 4dcf */ NULL, +/* 4dd0 */ NULL, +/* 4dd1 */ NULL, +/* 4dd2 */ NULL, +/* 4dd3 */ NULL, +/* 4dd4 */ NULL, +/* 4dd5 */ NULL, +/* 4dd6 */ NULL, +/* 4dd7 */ NULL, +/* 4dd8 */ NULL, +/* 4dd9 */ NULL, +/* 4dda */ NULL, +/* 4ddb */ NULL, +/* 4ddc */ NULL, +/* 4ddd */ NULL, +/* 4dde */ NULL, +/* 4ddf */ NULL, +/* 4de0 */ NULL, +/* 4de1 */ NULL, +/* 4de2 */ NULL, +/* 4de3 */ NULL, +/* 4de4 */ NULL, +/* 4de5 */ NULL, +/* 4de6 */ NULL, +/* 4de7 */ NULL, +/* 4de8 */ NULL, +/* 4de9 */ NULL, +/* 4dea */ NULL, +/* 4deb */ NULL, +/* 4dec */ NULL, +/* 4ded */ NULL, +/* 4dee */ NULL, +/* 4def */ NULL, +/* 4df0 */ NULL, +/* 4df1 */ NULL, +/* 4df2 */ NULL, +/* 4df3 */ NULL, +/* 4df4 */ NULL, +/* 4df5 */ NULL, +/* 4df6 */ NULL, +/* 4df7 */ NULL, +/* 4df8 */ NULL, +/* 4df9 */ NULL, +/* 4dfa */ NULL, +/* 4dfb */ NULL, +/* 4dfc */ NULL, +/* 4dfd */ NULL, +/* 4dfe */ NULL, +/* 4dff */ NULL, +/* 4e00 */ NULL, +/* 4e01 */ NULL, +/* 4e02 */ NULL, +/* 4e03 */ NULL, +/* 4e04 */ NULL, +/* 4e05 */ NULL, +/* 4e06 */ NULL, +/* 4e07 */ NULL, +/* 4e08 */ NULL, +/* 4e09 */ NULL, +/* 4e0a */ NULL, +/* 4e0b */ NULL, +/* 4e0c */ NULL, +/* 4e0d */ NULL, +/* 4e0e */ NULL, +/* 4e0f */ NULL, +/* 4e10 */ NULL, +/* 4e11 */ NULL, +/* 4e12 */ NULL, +/* 4e13 */ NULL, +/* 4e14 */ NULL, +/* 4e15 */ NULL, +/* 4e16 */ NULL, +/* 4e17 */ NULL, +/* 4e18 */ NULL, +/* 4e19 */ NULL, +/* 4e1a */ NULL, +/* 4e1b */ NULL, +/* 4e1c */ NULL, +/* 4e1d */ NULL, +/* 4e1e */ NULL, +/* 4e1f */ NULL, +/* 4e20 */ NULL, +/* 4e21 */ NULL, +/* 4e22 */ NULL, +/* 4e23 */ NULL, +/* 4e24 */ NULL, +/* 4e25 */ NULL, +/* 4e26 */ NULL, +/* 4e27 */ NULL, +/* 4e28 */ NULL, +/* 4e29 */ NULL, +/* 4e2a */ NULL, +/* 4e2b */ NULL, +/* 4e2c */ NULL, +/* 4e2d */ NULL, +/* 4e2e */ NULL, +/* 4e2f */ NULL, +/* 4e30 */ NULL, +/* 4e31 */ NULL, +/* 4e32 */ NULL, +/* 4e33 */ NULL, +/* 4e34 */ NULL, +/* 4e35 */ NULL, +/* 4e36 */ NULL, +/* 4e37 */ NULL, +/* 4e38 */ NULL, +/* 4e39 */ NULL, +/* 4e3a */ NULL, +/* 4e3b */ NULL, +/* 4e3c */ NULL, +/* 4e3d */ NULL, +/* 4e3e */ NULL, +/* 4e3f */ NULL, +/* 4e40 */ NULL, +/* 4e41 */ NULL, +/* 4e42 */ NULL, +/* 4e43 */ NULL, +/* 4e44 */ NULL, +/* 4e45 */ NULL, +/* 4e46 */ NULL, +/* 4e47 */ NULL, +/* 4e48 */ NULL, +/* 4e49 */ NULL, +/* 4e4a */ NULL, +/* 4e4b */ NULL, +/* 4e4c */ NULL, +/* 4e4d */ NULL, +/* 4e4e */ NULL, +/* 4e4f */ NULL, +/* 4e50 */ NULL, +/* 4e51 */ NULL, +/* 4e52 */ NULL, +/* 4e53 */ NULL, +/* 4e54 */ NULL, +/* 4e55 */ NULL, +/* 4e56 */ NULL, +/* 4e57 */ NULL, +/* 4e58 */ NULL, +/* 4e59 */ NULL, +/* 4e5a */ NULL, +/* 4e5b */ NULL, +/* 4e5c */ NULL, +/* 4e5d */ NULL, +/* 4e5e */ NULL, +/* 4e5f */ NULL, +/* 4e60 */ NULL, +/* 4e61 */ NULL, +/* 4e62 */ NULL, +/* 4e63 */ NULL, +/* 4e64 */ NULL, +/* 4e65 */ NULL, +/* 4e66 */ NULL, +/* 4e67 */ NULL, +/* 4e68 */ NULL, +/* 4e69 */ NULL, +/* 4e6a */ NULL, +/* 4e6b */ NULL, +/* 4e6c */ NULL, +/* 4e6d */ NULL, +/* 4e6e */ NULL, +/* 4e6f */ NULL, +/* 4e70 */ NULL, +/* 4e71 */ NULL, +/* 4e72 */ NULL, +/* 4e73 */ NULL, +/* 4e74 */ NULL, +/* 4e75 */ NULL, +/* 4e76 */ NULL, +/* 4e77 */ NULL, +/* 4e78 */ NULL, +/* 4e79 */ NULL, +/* 4e7a */ NULL, +/* 4e7b */ NULL, +/* 4e7c */ NULL, +/* 4e7d */ NULL, +/* 4e7e */ NULL, +/* 4e7f */ NULL, +/* 4e80 */ NULL, +/* 4e81 */ NULL, +/* 4e82 */ NULL, +/* 4e83 */ NULL, +/* 4e84 */ NULL, +/* 4e85 */ NULL, +/* 4e86 */ NULL, +/* 4e87 */ NULL, +/* 4e88 */ NULL, +/* 4e89 */ NULL, +/* 4e8a */ NULL, +/* 4e8b */ NULL, +/* 4e8c */ NULL, +/* 4e8d */ NULL, +/* 4e8e */ NULL, +/* 4e8f */ NULL, +/* 4e90 */ NULL, +/* 4e91 */ NULL, +/* 4e92 */ NULL, +/* 4e93 */ NULL, +/* 4e94 */ NULL, +/* 4e95 */ NULL, +/* 4e96 */ NULL, +/* 4e97 */ NULL, +/* 4e98 */ NULL, +/* 4e99 */ NULL, +/* 4e9a */ NULL, +/* 4e9b */ NULL, +/* 4e9c */ NULL, +/* 4e9d */ NULL, +/* 4e9e */ NULL, +/* 4e9f */ NULL, +/* 4ea0 */ NULL, +/* 4ea1 */ NULL, +/* 4ea2 */ NULL, +/* 4ea3 */ NULL, +/* 4ea4 */ NULL, +/* 4ea5 */ NULL, +/* 4ea6 */ NULL, +/* 4ea7 */ NULL, +/* 4ea8 */ NULL, +/* 4ea9 */ NULL, +/* 4eaa */ NULL, +/* 4eab */ NULL, +/* 4eac */ NULL, +/* 4ead */ NULL, +/* 4eae */ NULL, +/* 4eaf */ NULL, +/* 4eb0 */ NULL, +/* 4eb1 */ NULL, +/* 4eb2 */ NULL, +/* 4eb3 */ NULL, +/* 4eb4 */ NULL, +/* 4eb5 */ NULL, +/* 4eb6 */ NULL, +/* 4eb7 */ NULL, +/* 4eb8 */ NULL, +/* 4eb9 */ NULL, +/* 4eba */ NULL, +/* 4ebb */ NULL, +/* 4ebc */ NULL, +/* 4ebd */ NULL, +/* 4ebe */ NULL, +/* 4ebf */ NULL, +/* 4ec0 */ NULL, +/* 4ec1 */ NULL, +/* 4ec2 */ NULL, +/* 4ec3 */ NULL, +/* 4ec4 */ NULL, +/* 4ec5 */ NULL, +/* 4ec6 */ NULL, +/* 4ec7 */ NULL, +/* 4ec8 */ NULL, +/* 4ec9 */ NULL, +/* 4eca */ NULL, +/* 4ecb */ NULL, +/* 4ecc */ NULL, +/* 4ecd */ NULL, +/* 4ece */ NULL, +/* 4ecf */ NULL, +/* 4ed0 */ NULL, +/* 4ed1 */ NULL, +/* 4ed2 */ NULL, +/* 4ed3 */ NULL, +/* 4ed4 */ NULL, +/* 4ed5 */ NULL, +/* 4ed6 */ NULL, +/* 4ed7 */ NULL, +/* 4ed8 */ NULL, +/* 4ed9 */ NULL, +/* 4eda */ NULL, +/* 4edb */ NULL, +/* 4edc */ NULL, +/* 4edd */ NULL, +/* 4ede */ NULL, +/* 4edf */ NULL, +/* 4ee0 */ NULL, +/* 4ee1 */ NULL, +/* 4ee2 */ NULL, +/* 4ee3 */ NULL, +/* 4ee4 */ NULL, +/* 4ee5 */ NULL, +/* 4ee6 */ NULL, +/* 4ee7 */ NULL, +/* 4ee8 */ NULL, +/* 4ee9 */ NULL, +/* 4eea */ NULL, +/* 4eeb */ NULL, +/* 4eec */ NULL, +/* 4eed */ NULL, +/* 4eee */ NULL, +/* 4eef */ NULL, +/* 4ef0 */ NULL, +/* 4ef1 */ NULL, +/* 4ef2 */ NULL, +/* 4ef3 */ NULL, +/* 4ef4 */ NULL, +/* 4ef5 */ NULL, +/* 4ef6 */ NULL, +/* 4ef7 */ NULL, +/* 4ef8 */ NULL, +/* 4ef9 */ NULL, +/* 4efa */ NULL, +/* 4efb */ NULL, +/* 4efc */ NULL, +/* 4efd */ NULL, +/* 4efe */ NULL, +/* 4eff */ NULL, +/* 4f00 */ NULL, +/* 4f01 */ NULL, +/* 4f02 */ NULL, +/* 4f03 */ NULL, +/* 4f04 */ NULL, +/* 4f05 */ NULL, +/* 4f06 */ NULL, +/* 4f07 */ NULL, +/* 4f08 */ NULL, +/* 4f09 */ NULL, +/* 4f0a */ NULL, +/* 4f0b */ NULL, +/* 4f0c */ NULL, +/* 4f0d */ NULL, +/* 4f0e */ NULL, +/* 4f0f */ NULL, +/* 4f10 */ NULL, +/* 4f11 */ NULL, +/* 4f12 */ NULL, +/* 4f13 */ NULL, +/* 4f14 */ NULL, +/* 4f15 */ NULL, +/* 4f16 */ NULL, +/* 4f17 */ NULL, +/* 4f18 */ NULL, +/* 4f19 */ NULL, +/* 4f1a */ NULL, +/* 4f1b */ NULL, +/* 4f1c */ NULL, +/* 4f1d */ NULL, +/* 4f1e */ NULL, +/* 4f1f */ NULL, +/* 4f20 */ NULL, +/* 4f21 */ NULL, +/* 4f22 */ NULL, +/* 4f23 */ NULL, +/* 4f24 */ NULL, +/* 4f25 */ NULL, +/* 4f26 */ NULL, +/* 4f27 */ NULL, +/* 4f28 */ NULL, +/* 4f29 */ NULL, +/* 4f2a */ NULL, +/* 4f2b */ NULL, +/* 4f2c */ NULL, +/* 4f2d */ NULL, +/* 4f2e */ NULL, +/* 4f2f */ NULL, +/* 4f30 */ NULL, +/* 4f31 */ NULL, +/* 4f32 */ NULL, +/* 4f33 */ NULL, +/* 4f34 */ NULL, +/* 4f35 */ NULL, +/* 4f36 */ NULL, +/* 4f37 */ NULL, +/* 4f38 */ NULL, +/* 4f39 */ NULL, +/* 4f3a */ NULL, +/* 4f3b */ NULL, +/* 4f3c */ NULL, +/* 4f3d */ NULL, +/* 4f3e */ NULL, +/* 4f3f */ NULL, +/* 4f40 */ NULL, +/* 4f41 */ NULL, +/* 4f42 */ NULL, +/* 4f43 */ NULL, +/* 4f44 */ NULL, +/* 4f45 */ NULL, +/* 4f46 */ NULL, +/* 4f47 */ NULL, +/* 4f48 */ NULL, +/* 4f49 */ NULL, +/* 4f4a */ NULL, +/* 4f4b */ NULL, +/* 4f4c */ NULL, +/* 4f4d */ NULL, +/* 4f4e */ NULL, +/* 4f4f */ NULL, +/* 4f50 */ NULL, +/* 4f51 */ NULL, +/* 4f52 */ NULL, +/* 4f53 */ NULL, +/* 4f54 */ NULL, +/* 4f55 */ NULL, +/* 4f56 */ NULL, +/* 4f57 */ NULL, +/* 4f58 */ NULL, +/* 4f59 */ NULL, +/* 4f5a */ NULL, +/* 4f5b */ NULL, +/* 4f5c */ NULL, +/* 4f5d */ NULL, +/* 4f5e */ NULL, +/* 4f5f */ NULL, +/* 4f60 */ NULL, +/* 4f61 */ NULL, +/* 4f62 */ NULL, +/* 4f63 */ NULL, +/* 4f64 */ NULL, +/* 4f65 */ NULL, +/* 4f66 */ NULL, +/* 4f67 */ NULL, +/* 4f68 */ NULL, +/* 4f69 */ NULL, +/* 4f6a */ NULL, +/* 4f6b */ NULL, +/* 4f6c */ NULL, +/* 4f6d */ NULL, +/* 4f6e */ NULL, +/* 4f6f */ NULL, +/* 4f70 */ NULL, +/* 4f71 */ NULL, +/* 4f72 */ NULL, +/* 4f73 */ NULL, +/* 4f74 */ NULL, +/* 4f75 */ NULL, +/* 4f76 */ NULL, +/* 4f77 */ NULL, +/* 4f78 */ NULL, +/* 4f79 */ NULL, +/* 4f7a */ NULL, +/* 4f7b */ NULL, +/* 4f7c */ NULL, +/* 4f7d */ NULL, +/* 4f7e */ NULL, +/* 4f7f */ NULL, +/* 4f80 */ NULL, +/* 4f81 */ NULL, +/* 4f82 */ NULL, +/* 4f83 */ NULL, +/* 4f84 */ NULL, +/* 4f85 */ NULL, +/* 4f86 */ NULL, +/* 4f87 */ NULL, +/* 4f88 */ NULL, +/* 4f89 */ NULL, +/* 4f8a */ NULL, +/* 4f8b */ NULL, +/* 4f8c */ NULL, +/* 4f8d */ NULL, +/* 4f8e */ NULL, +/* 4f8f */ NULL, +/* 4f90 */ NULL, +/* 4f91 */ NULL, +/* 4f92 */ NULL, +/* 4f93 */ NULL, +/* 4f94 */ NULL, +/* 4f95 */ NULL, +/* 4f96 */ NULL, +/* 4f97 */ NULL, +/* 4f98 */ NULL, +/* 4f99 */ NULL, +/* 4f9a */ NULL, +/* 4f9b */ NULL, +/* 4f9c */ NULL, +/* 4f9d */ NULL, +/* 4f9e */ NULL, +/* 4f9f */ NULL, +/* 4fa0 */ NULL, +/* 4fa1 */ NULL, +/* 4fa2 */ NULL, +/* 4fa3 */ NULL, +/* 4fa4 */ NULL, +/* 4fa5 */ NULL, +/* 4fa6 */ NULL, +/* 4fa7 */ NULL, +/* 4fa8 */ NULL, +/* 4fa9 */ NULL, +/* 4faa */ NULL, +/* 4fab */ NULL, +/* 4fac */ NULL, +/* 4fad */ NULL, +/* 4fae */ NULL, +/* 4faf */ NULL, +/* 4fb0 */ NULL, +/* 4fb1 */ NULL, +/* 4fb2 */ NULL, +/* 4fb3 */ NULL, +/* 4fb4 */ NULL, +/* 4fb5 */ NULL, +/* 4fb6 */ NULL, +/* 4fb7 */ NULL, +/* 4fb8 */ NULL, +/* 4fb9 */ NULL, +/* 4fba */ NULL, +/* 4fbb */ NULL, +/* 4fbc */ NULL, +/* 4fbd */ NULL, +/* 4fbe */ NULL, +/* 4fbf */ NULL, +/* 4fc0 */ NULL, +/* 4fc1 */ NULL, +/* 4fc2 */ NULL, +/* 4fc3 */ NULL, +/* 4fc4 */ NULL, +/* 4fc5 */ NULL, +/* 4fc6 */ NULL, +/* 4fc7 */ NULL, +/* 4fc8 */ NULL, +/* 4fc9 */ NULL, +/* 4fca */ NULL, +/* 4fcb */ NULL, +/* 4fcc */ NULL, +/* 4fcd */ NULL, +/* 4fce */ NULL, +/* 4fcf */ NULL, +/* 4fd0 */ NULL, +/* 4fd1 */ NULL, +/* 4fd2 */ NULL, +/* 4fd3 */ NULL, +/* 4fd4 */ NULL, +/* 4fd5 */ NULL, +/* 4fd6 */ NULL, +/* 4fd7 */ NULL, +/* 4fd8 */ NULL, +/* 4fd9 */ NULL, +/* 4fda */ NULL, +/* 4fdb */ NULL, +/* 4fdc */ NULL, +/* 4fdd */ NULL, +/* 4fde */ NULL, +/* 4fdf */ NULL, +/* 4fe0 */ NULL, +/* 4fe1 */ NULL, +/* 4fe2 */ NULL, +/* 4fe3 */ NULL, +/* 4fe4 */ NULL, +/* 4fe5 */ NULL, +/* 4fe6 */ NULL, +/* 4fe7 */ NULL, +/* 4fe8 */ NULL, +/* 4fe9 */ NULL, +/* 4fea */ NULL, +/* 4feb */ NULL, +/* 4fec */ NULL, +/* 4fed */ NULL, +/* 4fee */ NULL, +/* 4fef */ NULL, +/* 4ff0 */ NULL, +/* 4ff1 */ NULL, +/* 4ff2 */ NULL, +/* 4ff3 */ NULL, +/* 4ff4 */ NULL, +/* 4ff5 */ NULL, +/* 4ff6 */ NULL, +/* 4ff7 */ NULL, +/* 4ff8 */ NULL, +/* 4ff9 */ NULL, +/* 4ffa */ NULL, +/* 4ffb */ NULL, +/* 4ffc */ NULL, +/* 4ffd */ NULL, +/* 4ffe */ NULL, +/* 4fff */ NULL, +/* 5000 */ NULL, +/* 5001 */ NULL, +/* 5002 */ NULL, +/* 5003 */ NULL, +/* 5004 */ NULL, +/* 5005 */ NULL, +/* 5006 */ NULL, +/* 5007 */ NULL, +/* 5008 */ NULL, +/* 5009 */ NULL, +/* 500a */ NULL, +/* 500b */ NULL, +/* 500c */ NULL, +/* 500d */ NULL, +/* 500e */ NULL, +/* 500f */ NULL, +/* 5010 */ NULL, +/* 5011 */ NULL, +/* 5012 */ NULL, +/* 5013 */ NULL, +/* 5014 */ NULL, +/* 5015 */ NULL, +/* 5016 */ NULL, +/* 5017 */ NULL, +/* 5018 */ NULL, +/* 5019 */ NULL, +/* 501a */ NULL, +/* 501b */ NULL, +/* 501c */ NULL, +/* 501d */ NULL, +/* 501e */ NULL, +/* 501f */ NULL, +/* 5020 */ NULL, +/* 5021 */ NULL, +/* 5022 */ NULL, +/* 5023 */ NULL, +/* 5024 */ NULL, +/* 5025 */ NULL, +/* 5026 */ NULL, +/* 5027 */ NULL, +/* 5028 */ NULL, +/* 5029 */ NULL, +/* 502a */ NULL, +/* 502b */ NULL, +/* 502c */ NULL, +/* 502d */ NULL, +/* 502e */ NULL, +/* 502f */ NULL, +/* 5030 */ NULL, +/* 5031 */ NULL, +/* 5032 */ NULL, +/* 5033 */ NULL, +/* 5034 */ NULL, +/* 5035 */ NULL, +/* 5036 */ NULL, +/* 5037 */ NULL, +/* 5038 */ NULL, +/* 5039 */ NULL, +/* 503a */ NULL, +/* 503b */ NULL, +/* 503c */ NULL, +/* 503d */ NULL, +/* 503e */ NULL, +/* 503f */ NULL, +/* 5040 */ NULL, +/* 5041 */ NULL, +/* 5042 */ NULL, +/* 5043 */ NULL, +/* 5044 */ NULL, +/* 5045 */ NULL, +/* 5046 */ NULL, +/* 5047 */ NULL, +/* 5048 */ NULL, +/* 5049 */ NULL, +/* 504a */ NULL, +/* 504b */ NULL, +/* 504c */ NULL, +/* 504d */ NULL, +/* 504e */ NULL, +/* 504f */ NULL, +/* 5050 */ NULL, +/* 5051 */ NULL, +/* 5052 */ NULL, +/* 5053 */ NULL, +/* 5054 */ NULL, +/* 5055 */ NULL, +/* 5056 */ NULL, +/* 5057 */ NULL, +/* 5058 */ NULL, +/* 5059 */ NULL, +/* 505a */ NULL, +/* 505b */ NULL, +/* 505c */ NULL, +/* 505d */ NULL, +/* 505e */ NULL, +/* 505f */ NULL, +/* 5060 */ NULL, +/* 5061 */ NULL, +/* 5062 */ NULL, +/* 5063 */ NULL, +/* 5064 */ NULL, +/* 5065 */ NULL, +/* 5066 */ NULL, +/* 5067 */ NULL, +/* 5068 */ NULL, +/* 5069 */ NULL, +/* 506a */ NULL, +/* 506b */ NULL, +/* 506c */ NULL, +/* 506d */ NULL, +/* 506e */ NULL, +/* 506f */ NULL, +/* 5070 */ NULL, +/* 5071 */ NULL, +/* 5072 */ NULL, +/* 5073 */ NULL, +/* 5074 */ NULL, +/* 5075 */ NULL, +/* 5076 */ NULL, +/* 5077 */ NULL, +/* 5078 */ NULL, +/* 5079 */ NULL, +/* 507a */ NULL, +/* 507b */ NULL, +/* 507c */ NULL, +/* 507d */ NULL, +/* 507e */ NULL, +/* 507f */ NULL, +/* 5080 */ NULL, +/* 5081 */ NULL, +/* 5082 */ NULL, +/* 5083 */ NULL, +/* 5084 */ NULL, +/* 5085 */ NULL, +/* 5086 */ NULL, +/* 5087 */ NULL, +/* 5088 */ NULL, +/* 5089 */ NULL, +/* 508a */ NULL, +/* 508b */ NULL, +/* 508c */ NULL, +/* 508d */ NULL, +/* 508e */ NULL, +/* 508f */ NULL, +/* 5090 */ NULL, +/* 5091 */ NULL, +/* 5092 */ NULL, +/* 5093 */ NULL, +/* 5094 */ NULL, +/* 5095 */ NULL, +/* 5096 */ NULL, +/* 5097 */ NULL, +/* 5098 */ NULL, +/* 5099 */ NULL, +/* 509a */ NULL, +/* 509b */ NULL, +/* 509c */ NULL, +/* 509d */ NULL, +/* 509e */ NULL, +/* 509f */ NULL, +/* 50a0 */ NULL, +/* 50a1 */ NULL, +/* 50a2 */ NULL, +/* 50a3 */ NULL, +/* 50a4 */ NULL, +/* 50a5 */ NULL, +/* 50a6 */ NULL, +/* 50a7 */ NULL, +/* 50a8 */ NULL, +/* 50a9 */ NULL, +/* 50aa */ NULL, +/* 50ab */ NULL, +/* 50ac */ NULL, +/* 50ad */ NULL, +/* 50ae */ NULL, +/* 50af */ NULL, +/* 50b0 */ NULL, +/* 50b1 */ NULL, +/* 50b2 */ NULL, +/* 50b3 */ NULL, +/* 50b4 */ NULL, +/* 50b5 */ NULL, +/* 50b6 */ NULL, +/* 50b7 */ NULL, +/* 50b8 */ NULL, +/* 50b9 */ NULL, +/* 50ba */ NULL, +/* 50bb */ NULL, +/* 50bc */ NULL, +/* 50bd */ NULL, +/* 50be */ NULL, +/* 50bf */ NULL, +/* 50c0 */ NULL, +/* 50c1 */ NULL, +/* 50c2 */ NULL, +/* 50c3 */ NULL, +/* 50c4 */ NULL, +/* 50c5 */ NULL, +/* 50c6 */ NULL, +/* 50c7 */ NULL, +/* 50c8 */ NULL, +/* 50c9 */ NULL, +/* 50ca */ NULL, +/* 50cb */ NULL, +/* 50cc */ NULL, +/* 50cd */ NULL, +/* 50ce */ NULL, +/* 50cf */ NULL, +/* 50d0 */ NULL, +/* 50d1 */ NULL, +/* 50d2 */ NULL, +/* 50d3 */ NULL, +/* 50d4 */ NULL, +/* 50d5 */ NULL, +/* 50d6 */ NULL, +/* 50d7 */ NULL, +/* 50d8 */ NULL, +/* 50d9 */ NULL, +/* 50da */ NULL, +/* 50db */ NULL, +/* 50dc */ NULL, +/* 50dd */ NULL, +/* 50de */ NULL, +/* 50df */ NULL, +/* 50e0 */ NULL, +/* 50e1 */ NULL, +/* 50e2 */ NULL, +/* 50e3 */ NULL, +/* 50e4 */ NULL, +/* 50e5 */ NULL, +/* 50e6 */ NULL, +/* 50e7 */ NULL, +/* 50e8 */ NULL, +/* 50e9 */ NULL, +/* 50ea */ NULL, +/* 50eb */ NULL, +/* 50ec */ NULL, +/* 50ed */ NULL, +/* 50ee */ NULL, +/* 50ef */ NULL, +/* 50f0 */ NULL, +/* 50f1 */ NULL, +/* 50f2 */ NULL, +/* 50f3 */ NULL, +/* 50f4 */ NULL, +/* 50f5 */ NULL, +/* 50f6 */ NULL, +/* 50f7 */ NULL, +/* 50f8 */ NULL, +/* 50f9 */ NULL, +/* 50fa */ NULL, +/* 50fb */ NULL, +/* 50fc */ NULL, +/* 50fd */ NULL, +/* 50fe */ NULL, +/* 50ff */ NULL, +/* 5100 */ NULL, +/* 5101 */ NULL, +/* 5102 */ NULL, +/* 5103 */ NULL, +/* 5104 */ NULL, +/* 5105 */ NULL, +/* 5106 */ NULL, +/* 5107 */ NULL, +/* 5108 */ NULL, +/* 5109 */ NULL, +/* 510a */ NULL, +/* 510b */ NULL, +/* 510c */ NULL, +/* 510d */ NULL, +/* 510e */ NULL, +/* 510f */ NULL, +/* 5110 */ NULL, +/* 5111 */ NULL, +/* 5112 */ NULL, +/* 5113 */ NULL, +/* 5114 */ NULL, +/* 5115 */ NULL, +/* 5116 */ NULL, +/* 5117 */ NULL, +/* 5118 */ NULL, +/* 5119 */ NULL, +/* 511a */ NULL, +/* 511b */ NULL, +/* 511c */ NULL, +/* 511d */ NULL, +/* 511e */ NULL, +/* 511f */ NULL, +/* 5120 */ NULL, +/* 5121 */ NULL, +/* 5122 */ NULL, +/* 5123 */ NULL, +/* 5124 */ NULL, +/* 5125 */ NULL, +/* 5126 */ NULL, +/* 5127 */ NULL, +/* 5128 */ NULL, +/* 5129 */ NULL, +/* 512a */ NULL, +/* 512b */ NULL, +/* 512c */ NULL, +/* 512d */ NULL, +/* 512e */ NULL, +/* 512f */ NULL, +/* 5130 */ NULL, +/* 5131 */ NULL, +/* 5132 */ NULL, +/* 5133 */ NULL, +/* 5134 */ NULL, +/* 5135 */ NULL, +/* 5136 */ NULL, +/* 5137 */ NULL, +/* 5138 */ NULL, +/* 5139 */ NULL, +/* 513a */ NULL, +/* 513b */ NULL, +/* 513c */ NULL, +/* 513d */ NULL, +/* 513e */ NULL, +/* 513f */ NULL, +/* 5140 */ NULL, +/* 5141 */ NULL, +/* 5142 */ NULL, +/* 5143 */ NULL, +/* 5144 */ NULL, +/* 5145 */ NULL, +/* 5146 */ NULL, +/* 5147 */ NULL, +/* 5148 */ NULL, +/* 5149 */ NULL, +/* 514a */ NULL, +/* 514b */ NULL, +/* 514c */ NULL, +/* 514d */ NULL, +/* 514e */ NULL, +/* 514f */ NULL, +/* 5150 */ NULL, +/* 5151 */ NULL, +/* 5152 */ NULL, +/* 5153 */ NULL, +/* 5154 */ NULL, +/* 5155 */ NULL, +/* 5156 */ NULL, +/* 5157 */ NULL, +/* 5158 */ NULL, +/* 5159 */ NULL, +/* 515a */ NULL, +/* 515b */ NULL, +/* 515c */ NULL, +/* 515d */ NULL, +/* 515e */ NULL, +/* 515f */ NULL, +/* 5160 */ NULL, +/* 5161 */ NULL, +/* 5162 */ NULL, +/* 5163 */ NULL, +/* 5164 */ NULL, +/* 5165 */ NULL, +/* 5166 */ NULL, +/* 5167 */ NULL, +/* 5168 */ NULL, +/* 5169 */ NULL, +/* 516a */ NULL, +/* 516b */ NULL, +/* 516c */ NULL, +/* 516d */ NULL, +/* 516e */ NULL, +/* 516f */ NULL, +/* 5170 */ NULL, +/* 5171 */ NULL, +/* 5172 */ NULL, +/* 5173 */ NULL, +/* 5174 */ NULL, +/* 5175 */ NULL, +/* 5176 */ NULL, +/* 5177 */ NULL, +/* 5178 */ NULL, +/* 5179 */ NULL, +/* 517a */ NULL, +/* 517b */ NULL, +/* 517c */ NULL, +/* 517d */ NULL, +/* 517e */ NULL, +/* 517f */ NULL, +/* 5180 */ NULL, +/* 5181 */ NULL, +/* 5182 */ NULL, +/* 5183 */ NULL, +/* 5184 */ NULL, +/* 5185 */ NULL, +/* 5186 */ NULL, +/* 5187 */ NULL, +/* 5188 */ NULL, +/* 5189 */ NULL, +/* 518a */ NULL, +/* 518b */ NULL, +/* 518c */ NULL, +/* 518d */ NULL, +/* 518e */ NULL, +/* 518f */ NULL, +/* 5190 */ NULL, +/* 5191 */ NULL, +/* 5192 */ NULL, +/* 5193 */ NULL, +/* 5194 */ NULL, +/* 5195 */ NULL, +/* 5196 */ NULL, +/* 5197 */ NULL, +/* 5198 */ NULL, +/* 5199 */ NULL, +/* 519a */ NULL, +/* 519b */ NULL, +/* 519c */ NULL, +/* 519d */ NULL, +/* 519e */ NULL, +/* 519f */ NULL, +/* 51a0 */ NULL, +/* 51a1 */ NULL, +/* 51a2 */ NULL, +/* 51a3 */ NULL, +/* 51a4 */ NULL, +/* 51a5 */ NULL, +/* 51a6 */ NULL, +/* 51a7 */ NULL, +/* 51a8 */ NULL, +/* 51a9 */ NULL, +/* 51aa */ NULL, +/* 51ab */ NULL, +/* 51ac */ NULL, +/* 51ad */ NULL, +/* 51ae */ NULL, +/* 51af */ NULL, +/* 51b0 */ NULL, +/* 51b1 */ NULL, +/* 51b2 */ NULL, +/* 51b3 */ NULL, +/* 51b4 */ NULL, +/* 51b5 */ NULL, +/* 51b6 */ NULL, +/* 51b7 */ NULL, +/* 51b8 */ NULL, +/* 51b9 */ NULL, +/* 51ba */ NULL, +/* 51bb */ NULL, +/* 51bc */ NULL, +/* 51bd */ NULL, +/* 51be */ NULL, +/* 51bf */ NULL, +/* 51c0 */ NULL, +/* 51c1 */ NULL, +/* 51c2 */ NULL, +/* 51c3 */ NULL, +/* 51c4 */ NULL, +/* 51c5 */ NULL, +/* 51c6 */ NULL, +/* 51c7 */ NULL, +/* 51c8 */ NULL, +/* 51c9 */ NULL, +/* 51ca */ NULL, +/* 51cb */ NULL, +/* 51cc */ NULL, +/* 51cd */ NULL, +/* 51ce */ NULL, +/* 51cf */ NULL, +/* 51d0 */ NULL, +/* 51d1 */ NULL, +/* 51d2 */ NULL, +/* 51d3 */ NULL, +/* 51d4 */ NULL, +/* 51d5 */ NULL, +/* 51d6 */ NULL, +/* 51d7 */ NULL, +/* 51d8 */ NULL, +/* 51d9 */ NULL, +/* 51da */ NULL, +/* 51db */ NULL, +/* 51dc */ NULL, +/* 51dd */ NULL, +/* 51de */ NULL, +/* 51df */ NULL, +/* 51e0 */ NULL, +/* 51e1 */ NULL, +/* 51e2 */ NULL, +/* 51e3 */ NULL, +/* 51e4 */ NULL, +/* 51e5 */ NULL, +/* 51e6 */ NULL, +/* 51e7 */ NULL, +/* 51e8 */ NULL, +/* 51e9 */ NULL, +/* 51ea */ NULL, +/* 51eb */ NULL, +/* 51ec */ NULL, +/* 51ed */ NULL, +/* 51ee */ NULL, +/* 51ef */ NULL, +/* 51f0 */ NULL, +/* 51f1 */ NULL, +/* 51f2 */ NULL, +/* 51f3 */ NULL, +/* 51f4 */ NULL, +/* 51f5 */ NULL, +/* 51f6 */ NULL, +/* 51f7 */ NULL, +/* 51f8 */ NULL, +/* 51f9 */ NULL, +/* 51fa */ NULL, +/* 51fb */ NULL, +/* 51fc */ NULL, +/* 51fd */ NULL, +/* 51fe */ NULL, +/* 51ff */ NULL, +/* 5200 */ NULL, +/* 5201 */ NULL, +/* 5202 */ NULL, +/* 5203 */ NULL, +/* 5204 */ NULL, +/* 5205 */ NULL, +/* 5206 */ NULL, +/* 5207 */ NULL, +/* 5208 */ NULL, +/* 5209 */ NULL, +/* 520a */ NULL, +/* 520b */ NULL, +/* 520c */ NULL, +/* 520d */ NULL, +/* 520e */ NULL, +/* 520f */ NULL, +/* 5210 */ NULL, +/* 5211 */ NULL, +/* 5212 */ NULL, +/* 5213 */ NULL, +/* 5214 */ NULL, +/* 5215 */ NULL, +/* 5216 */ NULL, +/* 5217 */ NULL, +/* 5218 */ NULL, +/* 5219 */ NULL, +/* 521a */ NULL, +/* 521b */ NULL, +/* 521c */ NULL, +/* 521d */ NULL, +/* 521e */ NULL, +/* 521f */ NULL, +/* 5220 */ NULL, +/* 5221 */ NULL, +/* 5222 */ NULL, +/* 5223 */ NULL, +/* 5224 */ NULL, +/* 5225 */ NULL, +/* 5226 */ NULL, +/* 5227 */ NULL, +/* 5228 */ NULL, +/* 5229 */ NULL, +/* 522a */ NULL, +/* 522b */ NULL, +/* 522c */ NULL, +/* 522d */ NULL, +/* 522e */ NULL, +/* 522f */ NULL, +/* 5230 */ NULL, +/* 5231 */ NULL, +/* 5232 */ NULL, +/* 5233 */ NULL, +/* 5234 */ NULL, +/* 5235 */ NULL, +/* 5236 */ NULL, +/* 5237 */ NULL, +/* 5238 */ NULL, +/* 5239 */ NULL, +/* 523a */ NULL, +/* 523b */ NULL, +/* 523c */ NULL, +/* 523d */ NULL, +/* 523e */ NULL, +/* 523f */ NULL, +/* 5240 */ NULL, +/* 5241 */ NULL, +/* 5242 */ NULL, +/* 5243 */ NULL, +/* 5244 */ NULL, +/* 5245 */ NULL, +/* 5246 */ NULL, +/* 5247 */ NULL, +/* 5248 */ NULL, +/* 5249 */ NULL, +/* 524a */ NULL, +/* 524b */ NULL, +/* 524c */ NULL, +/* 524d */ NULL, +/* 524e */ NULL, +/* 524f */ NULL, +/* 5250 */ NULL, +/* 5251 */ NULL, +/* 5252 */ NULL, +/* 5253 */ NULL, +/* 5254 */ NULL, +/* 5255 */ NULL, +/* 5256 */ NULL, +/* 5257 */ NULL, +/* 5258 */ NULL, +/* 5259 */ NULL, +/* 525a */ NULL, +/* 525b */ NULL, +/* 525c */ NULL, +/* 525d */ NULL, +/* 525e */ NULL, +/* 525f */ NULL, +/* 5260 */ NULL, +/* 5261 */ NULL, +/* 5262 */ NULL, +/* 5263 */ NULL, +/* 5264 */ NULL, +/* 5265 */ NULL, +/* 5266 */ NULL, +/* 5267 */ NULL, +/* 5268 */ NULL, +/* 5269 */ NULL, +/* 526a */ NULL, +/* 526b */ NULL, +/* 526c */ NULL, +/* 526d */ NULL, +/* 526e */ NULL, +/* 526f */ NULL, +/* 5270 */ NULL, +/* 5271 */ NULL, +/* 5272 */ NULL, +/* 5273 */ NULL, +/* 5274 */ NULL, +/* 5275 */ NULL, +/* 5276 */ NULL, +/* 5277 */ NULL, +/* 5278 */ NULL, +/* 5279 */ NULL, +/* 527a */ NULL, +/* 527b */ NULL, +/* 527c */ NULL, +/* 527d */ NULL, +/* 527e */ NULL, +/* 527f */ NULL, +/* 5280 */ NULL, +/* 5281 */ NULL, +/* 5282 */ NULL, +/* 5283 */ NULL, +/* 5284 */ NULL, +/* 5285 */ NULL, +/* 5286 */ NULL, +/* 5287 */ NULL, +/* 5288 */ NULL, +/* 5289 */ NULL, +/* 528a */ NULL, +/* 528b */ NULL, +/* 528c */ NULL, +/* 528d */ NULL, +/* 528e */ NULL, +/* 528f */ NULL, +/* 5290 */ NULL, +/* 5291 */ NULL, +/* 5292 */ NULL, +/* 5293 */ NULL, +/* 5294 */ NULL, +/* 5295 */ NULL, +/* 5296 */ NULL, +/* 5297 */ NULL, +/* 5298 */ NULL, +/* 5299 */ NULL, +/* 529a */ NULL, +/* 529b */ NULL, +/* 529c */ NULL, +/* 529d */ NULL, +/* 529e */ NULL, +/* 529f */ NULL, +/* 52a0 */ NULL, +/* 52a1 */ NULL, +/* 52a2 */ NULL, +/* 52a3 */ NULL, +/* 52a4 */ NULL, +/* 52a5 */ NULL, +/* 52a6 */ NULL, +/* 52a7 */ NULL, +/* 52a8 */ NULL, +/* 52a9 */ NULL, +/* 52aa */ NULL, +/* 52ab */ NULL, +/* 52ac */ NULL, +/* 52ad */ NULL, +/* 52ae */ NULL, +/* 52af */ NULL, +/* 52b0 */ NULL, +/* 52b1 */ NULL, +/* 52b2 */ NULL, +/* 52b3 */ NULL, +/* 52b4 */ NULL, +/* 52b5 */ NULL, +/* 52b6 */ NULL, +/* 52b7 */ NULL, +/* 52b8 */ NULL, +/* 52b9 */ NULL, +/* 52ba */ NULL, +/* 52bb */ NULL, +/* 52bc */ NULL, +/* 52bd */ NULL, +/* 52be */ NULL, +/* 52bf */ NULL, +/* 52c0 */ NULL, +/* 52c1 */ NULL, +/* 52c2 */ NULL, +/* 52c3 */ NULL, +/* 52c4 */ NULL, +/* 52c5 */ NULL, +/* 52c6 */ NULL, +/* 52c7 */ NULL, +/* 52c8 */ NULL, +/* 52c9 */ NULL, +/* 52ca */ NULL, +/* 52cb */ NULL, +/* 52cc */ NULL, +/* 52cd */ NULL, +/* 52ce */ NULL, +/* 52cf */ NULL, +/* 52d0 */ NULL, +/* 52d1 */ NULL, +/* 52d2 */ NULL, +/* 52d3 */ NULL, +/* 52d4 */ NULL, +/* 52d5 */ NULL, +/* 52d6 */ NULL, +/* 52d7 */ NULL, +/* 52d8 */ NULL, +/* 52d9 */ NULL, +/* 52da */ NULL, +/* 52db */ NULL, +/* 52dc */ NULL, +/* 52dd */ NULL, +/* 52de */ NULL, +/* 52df */ NULL, +/* 52e0 */ NULL, +/* 52e1 */ NULL, +/* 52e2 */ NULL, +/* 52e3 */ NULL, +/* 52e4 */ NULL, +/* 52e5 */ NULL, +/* 52e6 */ NULL, +/* 52e7 */ NULL, +/* 52e8 */ NULL, +/* 52e9 */ NULL, +/* 52ea */ NULL, +/* 52eb */ NULL, +/* 52ec */ NULL, +/* 52ed */ NULL, +/* 52ee */ NULL, +/* 52ef */ NULL, +/* 52f0 */ NULL, +/* 52f1 */ NULL, +/* 52f2 */ NULL, +/* 52f3 */ NULL, +/* 52f4 */ NULL, +/* 52f5 */ NULL, +/* 52f6 */ NULL, +/* 52f7 */ NULL, +/* 52f8 */ NULL, +/* 52f9 */ NULL, +/* 52fa */ NULL, +/* 52fb */ NULL, +/* 52fc */ NULL, +/* 52fd */ NULL, +/* 52fe */ NULL, +/* 52ff */ NULL, +/* 5300 */ NULL, +/* 5301 */ NULL, +/* 5302 */ NULL, +/* 5303 */ NULL, +/* 5304 */ NULL, +/* 5305 */ NULL, +/* 5306 */ NULL, +/* 5307 */ NULL, +/* 5308 */ NULL, +/* 5309 */ NULL, +/* 530a */ NULL, +/* 530b */ NULL, +/* 530c */ NULL, +/* 530d */ NULL, +/* 530e */ NULL, +/* 530f */ NULL, +/* 5310 */ NULL, +/* 5311 */ NULL, +/* 5312 */ NULL, +/* 5313 */ NULL, +/* 5314 */ NULL, +/* 5315 */ NULL, +/* 5316 */ NULL, +/* 5317 */ NULL, +/* 5318 */ NULL, +/* 5319 */ NULL, +/* 531a */ NULL, +/* 531b */ NULL, +/* 531c */ NULL, +/* 531d */ NULL, +/* 531e */ NULL, +/* 531f */ NULL, +/* 5320 */ NULL, +/* 5321 */ NULL, +/* 5322 */ NULL, +/* 5323 */ NULL, +/* 5324 */ NULL, +/* 5325 */ NULL, +/* 5326 */ NULL, +/* 5327 */ NULL, +/* 5328 */ NULL, +/* 5329 */ NULL, +/* 532a */ NULL, +/* 532b */ NULL, +/* 532c */ NULL, +/* 532d */ NULL, +/* 532e */ NULL, +/* 532f */ NULL, +/* 5330 */ NULL, +/* 5331 */ NULL, +/* 5332 */ NULL, +/* 5333 */ NULL, +/* 5334 */ NULL, +/* 5335 */ NULL, +/* 5336 */ NULL, +/* 5337 */ NULL, +/* 5338 */ NULL, +/* 5339 */ NULL, +/* 533a */ NULL, +/* 533b */ NULL, +/* 533c */ NULL, +/* 533d */ NULL, +/* 533e */ NULL, +/* 533f */ NULL, +/* 5340 */ NULL, +/* 5341 */ NULL, +/* 5342 */ NULL, +/* 5343 */ NULL, +/* 5344 */ NULL, +/* 5345 */ NULL, +/* 5346 */ NULL, +/* 5347 */ NULL, +/* 5348 */ NULL, +/* 5349 */ NULL, +/* 534a */ NULL, +/* 534b */ NULL, +/* 534c */ NULL, +/* 534d */ NULL, +/* 534e */ NULL, +/* 534f */ NULL, +/* 5350 */ NULL, +/* 5351 */ NULL, +/* 5352 */ NULL, +/* 5353 */ NULL, +/* 5354 */ NULL, +/* 5355 */ NULL, +/* 5356 */ NULL, +/* 5357 */ NULL, +/* 5358 */ NULL, +/* 5359 */ NULL, +/* 535a */ NULL, +/* 535b */ NULL, +/* 535c */ NULL, +/* 535d */ NULL, +/* 535e */ NULL, +/* 535f */ NULL, +/* 5360 */ NULL, +/* 5361 */ NULL, +/* 5362 */ NULL, +/* 5363 */ NULL, +/* 5364 */ NULL, +/* 5365 */ NULL, +/* 5366 */ NULL, +/* 5367 */ NULL, +/* 5368 */ NULL, +/* 5369 */ NULL, +/* 536a */ NULL, +/* 536b */ NULL, +/* 536c */ NULL, +/* 536d */ NULL, +/* 536e */ NULL, +/* 536f */ NULL, +/* 5370 */ NULL, +/* 5371 */ NULL, +/* 5372 */ NULL, +/* 5373 */ NULL, +/* 5374 */ NULL, +/* 5375 */ NULL, +/* 5376 */ NULL, +/* 5377 */ NULL, +/* 5378 */ NULL, +/* 5379 */ NULL, +/* 537a */ NULL, +/* 537b */ NULL, +/* 537c */ NULL, +/* 537d */ NULL, +/* 537e */ NULL, +/* 537f */ NULL, +/* 5380 */ NULL, +/* 5381 */ NULL, +/* 5382 */ NULL, +/* 5383 */ NULL, +/* 5384 */ NULL, +/* 5385 */ NULL, +/* 5386 */ NULL, +/* 5387 */ NULL, +/* 5388 */ NULL, +/* 5389 */ NULL, +/* 538a */ NULL, +/* 538b */ NULL, +/* 538c */ NULL, +/* 538d */ NULL, +/* 538e */ NULL, +/* 538f */ NULL, +/* 5390 */ NULL, +/* 5391 */ NULL, +/* 5392 */ NULL, +/* 5393 */ NULL, +/* 5394 */ NULL, +/* 5395 */ NULL, +/* 5396 */ NULL, +/* 5397 */ NULL, +/* 5398 */ NULL, +/* 5399 */ NULL, +/* 539a */ NULL, +/* 539b */ NULL, +/* 539c */ NULL, +/* 539d */ NULL, +/* 539e */ NULL, +/* 539f */ NULL, +/* 53a0 */ NULL, +/* 53a1 */ NULL, +/* 53a2 */ NULL, +/* 53a3 */ NULL, +/* 53a4 */ NULL, +/* 53a5 */ NULL, +/* 53a6 */ NULL, +/* 53a7 */ NULL, +/* 53a8 */ NULL, +/* 53a9 */ NULL, +/* 53aa */ NULL, +/* 53ab */ NULL, +/* 53ac */ NULL, +/* 53ad */ NULL, +/* 53ae */ NULL, +/* 53af */ NULL, +/* 53b0 */ NULL, +/* 53b1 */ NULL, +/* 53b2 */ NULL, +/* 53b3 */ NULL, +/* 53b4 */ NULL, +/* 53b5 */ NULL, +/* 53b6 */ NULL, +/* 53b7 */ NULL, +/* 53b8 */ NULL, +/* 53b9 */ NULL, +/* 53ba */ NULL, +/* 53bb */ NULL, +/* 53bc */ NULL, +/* 53bd */ NULL, +/* 53be */ NULL, +/* 53bf */ NULL, +/* 53c0 */ NULL, +/* 53c1 */ NULL, +/* 53c2 */ NULL, +/* 53c3 */ NULL, +/* 53c4 */ NULL, +/* 53c5 */ NULL, +/* 53c6 */ NULL, +/* 53c7 */ NULL, +/* 53c8 */ NULL, +/* 53c9 */ NULL, +/* 53ca */ NULL, +/* 53cb */ NULL, +/* 53cc */ NULL, +/* 53cd */ NULL, +/* 53ce */ NULL, +/* 53cf */ NULL, +/* 53d0 */ NULL, +/* 53d1 */ NULL, +/* 53d2 */ NULL, +/* 53d3 */ NULL, +/* 53d4 */ NULL, +/* 53d5 */ NULL, +/* 53d6 */ NULL, +/* 53d7 */ NULL, +/* 53d8 */ NULL, +/* 53d9 */ NULL, +/* 53da */ NULL, +/* 53db */ NULL, +/* 53dc */ NULL, +/* 53dd */ NULL, +/* 53de */ NULL, +/* 53df */ NULL, +/* 53e0 */ NULL, +/* 53e1 */ NULL, +/* 53e2 */ NULL, +/* 53e3 */ NULL, +/* 53e4 */ NULL, +/* 53e5 */ NULL, +/* 53e6 */ NULL, +/* 53e7 */ NULL, +/* 53e8 */ NULL, +/* 53e9 */ NULL, +/* 53ea */ NULL, +/* 53eb */ NULL, +/* 53ec */ NULL, +/* 53ed */ NULL, +/* 53ee */ NULL, +/* 53ef */ NULL, +/* 53f0 */ NULL, +/* 53f1 */ NULL, +/* 53f2 */ NULL, +/* 53f3 */ NULL, +/* 53f4 */ NULL, +/* 53f5 */ NULL, +/* 53f6 */ NULL, +/* 53f7 */ NULL, +/* 53f8 */ NULL, +/* 53f9 */ NULL, +/* 53fa */ NULL, +/* 53fb */ NULL, +/* 53fc */ NULL, +/* 53fd */ NULL, +/* 53fe */ NULL, +/* 53ff */ NULL, +/* 5400 */ NULL, +/* 5401 */ NULL, +/* 5402 */ NULL, +/* 5403 */ NULL, +/* 5404 */ NULL, +/* 5405 */ NULL, +/* 5406 */ NULL, +/* 5407 */ NULL, +/* 5408 */ NULL, +/* 5409 */ NULL, +/* 540a */ NULL, +/* 540b */ NULL, +/* 540c */ NULL, +/* 540d */ NULL, +/* 540e */ NULL, +/* 540f */ NULL, +/* 5410 */ NULL, +/* 5411 */ NULL, +/* 5412 */ NULL, +/* 5413 */ NULL, +/* 5414 */ NULL, +/* 5415 */ NULL, +/* 5416 */ NULL, +/* 5417 */ NULL, +/* 5418 */ NULL, +/* 5419 */ NULL, +/* 541a */ NULL, +/* 541b */ NULL, +/* 541c */ NULL, +/* 541d */ NULL, +/* 541e */ NULL, +/* 541f */ NULL, +/* 5420 */ NULL, +/* 5421 */ NULL, +/* 5422 */ NULL, +/* 5423 */ NULL, +/* 5424 */ NULL, +/* 5425 */ NULL, +/* 5426 */ NULL, +/* 5427 */ NULL, +/* 5428 */ NULL, +/* 5429 */ NULL, +/* 542a */ NULL, +/* 542b */ NULL, +/* 542c */ NULL, +/* 542d */ NULL, +/* 542e */ NULL, +/* 542f */ NULL, +/* 5430 */ NULL, +/* 5431 */ NULL, +/* 5432 */ NULL, +/* 5433 */ NULL, +/* 5434 */ NULL, +/* 5435 */ NULL, +/* 5436 */ NULL, +/* 5437 */ NULL, +/* 5438 */ NULL, +/* 5439 */ NULL, +/* 543a */ NULL, +/* 543b */ NULL, +/* 543c */ NULL, +/* 543d */ NULL, +/* 543e */ NULL, +/* 543f */ NULL, +/* 5440 */ NULL, +/* 5441 */ NULL, +/* 5442 */ NULL, +/* 5443 */ NULL, +/* 5444 */ NULL, +/* 5445 */ NULL, +/* 5446 */ NULL, +/* 5447 */ NULL, +/* 5448 */ NULL, +/* 5449 */ NULL, +/* 544a */ NULL, +/* 544b */ NULL, +/* 544c */ NULL, +/* 544d */ NULL, +/* 544e */ NULL, +/* 544f */ NULL, +/* 5450 */ NULL, +/* 5451 */ NULL, +/* 5452 */ NULL, +/* 5453 */ NULL, +/* 5454 */ NULL, +/* 5455 */ NULL, +/* 5456 */ NULL, +/* 5457 */ NULL, +/* 5458 */ NULL, +/* 5459 */ NULL, +/* 545a */ NULL, +/* 545b */ NULL, +/* 545c */ NULL, +/* 545d */ NULL, +/* 545e */ NULL, +/* 545f */ NULL, +/* 5460 */ NULL, +/* 5461 */ NULL, +/* 5462 */ NULL, +/* 5463 */ NULL, +/* 5464 */ NULL, +/* 5465 */ NULL, +/* 5466 */ NULL, +/* 5467 */ NULL, +/* 5468 */ NULL, +/* 5469 */ NULL, +/* 546a */ NULL, +/* 546b */ NULL, +/* 546c */ NULL, +/* 546d */ NULL, +/* 546e */ NULL, +/* 546f */ NULL, +/* 5470 */ NULL, +/* 5471 */ NULL, +/* 5472 */ NULL, +/* 5473 */ NULL, +/* 5474 */ NULL, +/* 5475 */ NULL, +/* 5476 */ NULL, +/* 5477 */ NULL, +/* 5478 */ NULL, +/* 5479 */ NULL, +/* 547a */ NULL, +/* 547b */ NULL, +/* 547c */ NULL, +/* 547d */ NULL, +/* 547e */ NULL, +/* 547f */ NULL, +/* 5480 */ NULL, +/* 5481 */ NULL, +/* 5482 */ NULL, +/* 5483 */ NULL, +/* 5484 */ NULL, +/* 5485 */ NULL, +/* 5486 */ NULL, +/* 5487 */ NULL, +/* 5488 */ NULL, +/* 5489 */ NULL, +/* 548a */ NULL, +/* 548b */ NULL, +/* 548c */ NULL, +/* 548d */ NULL, +/* 548e */ NULL, +/* 548f */ NULL, +/* 5490 */ NULL, +/* 5491 */ NULL, +/* 5492 */ NULL, +/* 5493 */ NULL, +/* 5494 */ NULL, +/* 5495 */ NULL, +/* 5496 */ NULL, +/* 5497 */ NULL, +/* 5498 */ NULL, +/* 5499 */ NULL, +/* 549a */ NULL, +/* 549b */ NULL, +/* 549c */ NULL, +/* 549d */ NULL, +/* 549e */ NULL, +/* 549f */ NULL, +/* 54a0 */ NULL, +/* 54a1 */ NULL, +/* 54a2 */ NULL, +/* 54a3 */ NULL, +/* 54a4 */ NULL, +/* 54a5 */ NULL, +/* 54a6 */ NULL, +/* 54a7 */ NULL, +/* 54a8 */ NULL, +/* 54a9 */ NULL, +/* 54aa */ NULL, +/* 54ab */ NULL, +/* 54ac */ NULL, +/* 54ad */ NULL, +/* 54ae */ NULL, +/* 54af */ NULL, +/* 54b0 */ NULL, +/* 54b1 */ NULL, +/* 54b2 */ NULL, +/* 54b3 */ NULL, +/* 54b4 */ NULL, +/* 54b5 */ NULL, +/* 54b6 */ NULL, +/* 54b7 */ NULL, +/* 54b8 */ NULL, +/* 54b9 */ NULL, +/* 54ba */ NULL, +/* 54bb */ NULL, +/* 54bc */ NULL, +/* 54bd */ NULL, +/* 54be */ NULL, +/* 54bf */ NULL, +/* 54c0 */ NULL, +/* 54c1 */ NULL, +/* 54c2 */ NULL, +/* 54c3 */ NULL, +/* 54c4 */ NULL, +/* 54c5 */ NULL, +/* 54c6 */ NULL, +/* 54c7 */ NULL, +/* 54c8 */ NULL, +/* 54c9 */ NULL, +/* 54ca */ NULL, +/* 54cb */ NULL, +/* 54cc */ NULL, +/* 54cd */ NULL, +/* 54ce */ NULL, +/* 54cf */ NULL, +/* 54d0 */ NULL, +/* 54d1 */ NULL, +/* 54d2 */ NULL, +/* 54d3 */ NULL, +/* 54d4 */ NULL, +/* 54d5 */ NULL, +/* 54d6 */ NULL, +/* 54d7 */ NULL, +/* 54d8 */ NULL, +/* 54d9 */ NULL, +/* 54da */ NULL, +/* 54db */ NULL, +/* 54dc */ NULL, +/* 54dd */ NULL, +/* 54de */ NULL, +/* 54df */ NULL, +/* 54e0 */ NULL, +/* 54e1 */ NULL, +/* 54e2 */ NULL, +/* 54e3 */ NULL, +/* 54e4 */ NULL, +/* 54e5 */ NULL, +/* 54e6 */ NULL, +/* 54e7 */ NULL, +/* 54e8 */ NULL, +/* 54e9 */ NULL, +/* 54ea */ NULL, +/* 54eb */ NULL, +/* 54ec */ NULL, +/* 54ed */ NULL, +/* 54ee */ NULL, +/* 54ef */ NULL, +/* 54f0 */ NULL, +/* 54f1 */ NULL, +/* 54f2 */ NULL, +/* 54f3 */ NULL, +/* 54f4 */ NULL, +/* 54f5 */ NULL, +/* 54f6 */ NULL, +/* 54f7 */ NULL, +/* 54f8 */ NULL, +/* 54f9 */ NULL, +/* 54fa */ NULL, +/* 54fb */ NULL, +/* 54fc */ NULL, +/* 54fd */ NULL, +/* 54fe */ NULL, +/* 54ff */ NULL, +/* 5500 */ NULL, +/* 5501 */ NULL, +/* 5502 */ NULL, +/* 5503 */ NULL, +/* 5504 */ NULL, +/* 5505 */ NULL, +/* 5506 */ NULL, +/* 5507 */ NULL, +/* 5508 */ NULL, +/* 5509 */ NULL, +/* 550a */ NULL, +/* 550b */ NULL, +/* 550c */ NULL, +/* 550d */ NULL, +/* 550e */ NULL, +/* 550f */ NULL, +/* 5510 */ NULL, +/* 5511 */ NULL, +/* 5512 */ NULL, +/* 5513 */ NULL, +/* 5514 */ NULL, +/* 5515 */ NULL, +/* 5516 */ NULL, +/* 5517 */ NULL, +/* 5518 */ NULL, +/* 5519 */ NULL, +/* 551a */ NULL, +/* 551b */ NULL, +/* 551c */ NULL, +/* 551d */ NULL, +/* 551e */ NULL, +/* 551f */ NULL, +/* 5520 */ NULL, +/* 5521 */ NULL, +/* 5522 */ NULL, +/* 5523 */ NULL, +/* 5524 */ NULL, +/* 5525 */ NULL, +/* 5526 */ NULL, +/* 5527 */ NULL, +/* 5528 */ NULL, +/* 5529 */ NULL, +/* 552a */ NULL, +/* 552b */ NULL, +/* 552c */ NULL, +/* 552d */ NULL, +/* 552e */ NULL, +/* 552f */ NULL, +/* 5530 */ NULL, +/* 5531 */ NULL, +/* 5532 */ NULL, +/* 5533 */ NULL, +/* 5534 */ NULL, +/* 5535 */ NULL, +/* 5536 */ NULL, +/* 5537 */ NULL, +/* 5538 */ NULL, +/* 5539 */ NULL, +/* 553a */ NULL, +/* 553b */ NULL, +/* 553c */ NULL, +/* 553d */ NULL, +/* 553e */ NULL, +/* 553f */ NULL, +/* 5540 */ NULL, +/* 5541 */ NULL, +/* 5542 */ NULL, +/* 5543 */ NULL, +/* 5544 */ NULL, +/* 5545 */ NULL, +/* 5546 */ NULL, +/* 5547 */ NULL, +/* 5548 */ NULL, +/* 5549 */ NULL, +/* 554a */ NULL, +/* 554b */ NULL, +/* 554c */ NULL, +/* 554d */ NULL, +/* 554e */ NULL, +/* 554f */ NULL, +/* 5550 */ NULL, +/* 5551 */ NULL, +/* 5552 */ NULL, +/* 5553 */ NULL, +/* 5554 */ NULL, +/* 5555 */ NULL, +/* 5556 */ NULL, +/* 5557 */ NULL, +/* 5558 */ NULL, +/* 5559 */ NULL, +/* 555a */ NULL, +/* 555b */ NULL, +/* 555c */ NULL, +/* 555d */ NULL, +/* 555e */ NULL, +/* 555f */ NULL, +/* 5560 */ NULL, +/* 5561 */ NULL, +/* 5562 */ NULL, +/* 5563 */ NULL, +/* 5564 */ NULL, +/* 5565 */ NULL, +/* 5566 */ NULL, +/* 5567 */ NULL, +/* 5568 */ NULL, +/* 5569 */ NULL, +/* 556a */ NULL, +/* 556b */ NULL, +/* 556c */ NULL, +/* 556d */ NULL, +/* 556e */ NULL, +/* 556f */ NULL, +/* 5570 */ NULL, +/* 5571 */ NULL, +/* 5572 */ NULL, +/* 5573 */ NULL, +/* 5574 */ NULL, +/* 5575 */ NULL, +/* 5576 */ NULL, +/* 5577 */ NULL, +/* 5578 */ NULL, +/* 5579 */ NULL, +/* 557a */ NULL, +/* 557b */ NULL, +/* 557c */ NULL, +/* 557d */ NULL, +/* 557e */ NULL, +/* 557f */ NULL, +/* 5580 */ NULL, +/* 5581 */ NULL, +/* 5582 */ NULL, +/* 5583 */ NULL, +/* 5584 */ NULL, +/* 5585 */ NULL, +/* 5586 */ NULL, +/* 5587 */ NULL, +/* 5588 */ NULL, +/* 5589 */ NULL, +/* 558a */ NULL, +/* 558b */ NULL, +/* 558c */ NULL, +/* 558d */ NULL, +/* 558e */ NULL, +/* 558f */ NULL, +/* 5590 */ NULL, +/* 5591 */ NULL, +/* 5592 */ NULL, +/* 5593 */ NULL, +/* 5594 */ NULL, +/* 5595 */ NULL, +/* 5596 */ NULL, +/* 5597 */ NULL, +/* 5598 */ NULL, +/* 5599 */ NULL, +/* 559a */ NULL, +/* 559b */ NULL, +/* 559c */ NULL, +/* 559d */ NULL, +/* 559e */ NULL, +/* 559f */ NULL, +/* 55a0 */ NULL, +/* 55a1 */ NULL, +/* 55a2 */ NULL, +/* 55a3 */ NULL, +/* 55a4 */ NULL, +/* 55a5 */ NULL, +/* 55a6 */ NULL, +/* 55a7 */ NULL, +/* 55a8 */ NULL, +/* 55a9 */ NULL, +/* 55aa */ NULL, +/* 55ab */ NULL, +/* 55ac */ NULL, +/* 55ad */ NULL, +/* 55ae */ NULL, +/* 55af */ NULL, +/* 55b0 */ NULL, +/* 55b1 */ NULL, +/* 55b2 */ NULL, +/* 55b3 */ NULL, +/* 55b4 */ NULL, +/* 55b5 */ NULL, +/* 55b6 */ NULL, +/* 55b7 */ NULL, +/* 55b8 */ NULL, +/* 55b9 */ NULL, +/* 55ba */ NULL, +/* 55bb */ NULL, +/* 55bc */ NULL, +/* 55bd */ NULL, +/* 55be */ NULL, +/* 55bf */ NULL, +/* 55c0 */ NULL, +/* 55c1 */ NULL, +/* 55c2 */ NULL, +/* 55c3 */ NULL, +/* 55c4 */ NULL, +/* 55c5 */ NULL, +/* 55c6 */ NULL, +/* 55c7 */ NULL, +/* 55c8 */ NULL, +/* 55c9 */ NULL, +/* 55ca */ NULL, +/* 55cb */ NULL, +/* 55cc */ NULL, +/* 55cd */ NULL, +/* 55ce */ NULL, +/* 55cf */ NULL, +/* 55d0 */ NULL, +/* 55d1 */ NULL, +/* 55d2 */ NULL, +/* 55d3 */ NULL, +/* 55d4 */ NULL, +/* 55d5 */ NULL, +/* 55d6 */ NULL, +/* 55d7 */ NULL, +/* 55d8 */ NULL, +/* 55d9 */ NULL, +/* 55da */ NULL, +/* 55db */ NULL, +/* 55dc */ NULL, +/* 55dd */ NULL, +/* 55de */ NULL, +/* 55df */ NULL, +/* 55e0 */ NULL, +/* 55e1 */ NULL, +/* 55e2 */ NULL, +/* 55e3 */ NULL, +/* 55e4 */ NULL, +/* 55e5 */ NULL, +/* 55e6 */ NULL, +/* 55e7 */ NULL, +/* 55e8 */ NULL, +/* 55e9 */ NULL, +/* 55ea */ NULL, +/* 55eb */ NULL, +/* 55ec */ NULL, +/* 55ed */ NULL, +/* 55ee */ NULL, +/* 55ef */ NULL, +/* 55f0 */ NULL, +/* 55f1 */ NULL, +/* 55f2 */ NULL, +/* 55f3 */ NULL, +/* 55f4 */ NULL, +/* 55f5 */ NULL, +/* 55f6 */ NULL, +/* 55f7 */ NULL, +/* 55f8 */ NULL, +/* 55f9 */ NULL, +/* 55fa */ NULL, +/* 55fb */ NULL, +/* 55fc */ NULL, +/* 55fd */ NULL, +/* 55fe */ NULL, +/* 55ff */ NULL, +/* 5600 */ NULL, +/* 5601 */ NULL, +/* 5602 */ NULL, +/* 5603 */ NULL, +/* 5604 */ NULL, +/* 5605 */ NULL, +/* 5606 */ NULL, +/* 5607 */ NULL, +/* 5608 */ NULL, +/* 5609 */ NULL, +/* 560a */ NULL, +/* 560b */ NULL, +/* 560c */ NULL, +/* 560d */ NULL, +/* 560e */ NULL, +/* 560f */ NULL, +/* 5610 */ NULL, +/* 5611 */ NULL, +/* 5612 */ NULL, +/* 5613 */ NULL, +/* 5614 */ NULL, +/* 5615 */ NULL, +/* 5616 */ NULL, +/* 5617 */ NULL, +/* 5618 */ NULL, +/* 5619 */ NULL, +/* 561a */ NULL, +/* 561b */ NULL, +/* 561c */ NULL, +/* 561d */ NULL, +/* 561e */ NULL, +/* 561f */ NULL, +/* 5620 */ NULL, +/* 5621 */ NULL, +/* 5622 */ NULL, +/* 5623 */ NULL, +/* 5624 */ NULL, +/* 5625 */ NULL, +/* 5626 */ NULL, +/* 5627 */ NULL, +/* 5628 */ NULL, +/* 5629 */ NULL, +/* 562a */ NULL, +/* 562b */ NULL, +/* 562c */ NULL, +/* 562d */ NULL, +/* 562e */ NULL, +/* 562f */ NULL, +/* 5630 */ NULL, +/* 5631 */ NULL, +/* 5632 */ NULL, +/* 5633 */ NULL, +/* 5634 */ NULL, +/* 5635 */ NULL, +/* 5636 */ NULL, +/* 5637 */ NULL, +/* 5638 */ NULL, +/* 5639 */ NULL, +/* 563a */ NULL, +/* 563b */ NULL, +/* 563c */ NULL, +/* 563d */ NULL, +/* 563e */ NULL, +/* 563f */ NULL, +/* 5640 */ NULL, +/* 5641 */ NULL, +/* 5642 */ NULL, +/* 5643 */ NULL, +/* 5644 */ NULL, +/* 5645 */ NULL, +/* 5646 */ NULL, +/* 5647 */ NULL, +/* 5648 */ NULL, +/* 5649 */ NULL, +/* 564a */ NULL, +/* 564b */ NULL, +/* 564c */ NULL, +/* 564d */ NULL, +/* 564e */ NULL, +/* 564f */ NULL, +/* 5650 */ NULL, +/* 5651 */ NULL, +/* 5652 */ NULL, +/* 5653 */ NULL, +/* 5654 */ NULL, +/* 5655 */ NULL, +/* 5656 */ NULL, +/* 5657 */ NULL, +/* 5658 */ NULL, +/* 5659 */ NULL, +/* 565a */ NULL, +/* 565b */ NULL, +/* 565c */ NULL, +/* 565d */ NULL, +/* 565e */ NULL, +/* 565f */ NULL, +/* 5660 */ NULL, +/* 5661 */ NULL, +/* 5662 */ NULL, +/* 5663 */ NULL, +/* 5664 */ NULL, +/* 5665 */ NULL, +/* 5666 */ NULL, +/* 5667 */ NULL, +/* 5668 */ NULL, +/* 5669 */ NULL, +/* 566a */ NULL, +/* 566b */ NULL, +/* 566c */ NULL, +/* 566d */ NULL, +/* 566e */ NULL, +/* 566f */ NULL, +/* 5670 */ NULL, +/* 5671 */ NULL, +/* 5672 */ NULL, +/* 5673 */ NULL, +/* 5674 */ NULL, +/* 5675 */ NULL, +/* 5676 */ NULL, +/* 5677 */ NULL, +/* 5678 */ NULL, +/* 5679 */ NULL, +/* 567a */ NULL, +/* 567b */ NULL, +/* 567c */ NULL, +/* 567d */ NULL, +/* 567e */ NULL, +/* 567f */ NULL, +/* 5680 */ NULL, +/* 5681 */ NULL, +/* 5682 */ NULL, +/* 5683 */ NULL, +/* 5684 */ NULL, +/* 5685 */ NULL, +/* 5686 */ NULL, +/* 5687 */ NULL, +/* 5688 */ NULL, +/* 5689 */ NULL, +/* 568a */ NULL, +/* 568b */ NULL, +/* 568c */ NULL, +/* 568d */ NULL, +/* 568e */ NULL, +/* 568f */ NULL, +/* 5690 */ NULL, +/* 5691 */ NULL, +/* 5692 */ NULL, +/* 5693 */ NULL, +/* 5694 */ NULL, +/* 5695 */ NULL, +/* 5696 */ NULL, +/* 5697 */ NULL, +/* 5698 */ NULL, +/* 5699 */ NULL, +/* 569a */ NULL, +/* 569b */ NULL, +/* 569c */ NULL, +/* 569d */ NULL, +/* 569e */ NULL, +/* 569f */ NULL, +/* 56a0 */ NULL, +/* 56a1 */ NULL, +/* 56a2 */ NULL, +/* 56a3 */ NULL, +/* 56a4 */ NULL, +/* 56a5 */ NULL, +/* 56a6 */ NULL, +/* 56a7 */ NULL, +/* 56a8 */ NULL, +/* 56a9 */ NULL, +/* 56aa */ NULL, +/* 56ab */ NULL, +/* 56ac */ NULL, +/* 56ad */ NULL, +/* 56ae */ NULL, +/* 56af */ NULL, +/* 56b0 */ NULL, +/* 56b1 */ NULL, +/* 56b2 */ NULL, +/* 56b3 */ NULL, +/* 56b4 */ NULL, +/* 56b5 */ NULL, +/* 56b6 */ NULL, +/* 56b7 */ NULL, +/* 56b8 */ NULL, +/* 56b9 */ NULL, +/* 56ba */ NULL, +/* 56bb */ NULL, +/* 56bc */ NULL, +/* 56bd */ NULL, +/* 56be */ NULL, +/* 56bf */ NULL, +/* 56c0 */ NULL, +/* 56c1 */ NULL, +/* 56c2 */ NULL, +/* 56c3 */ NULL, +/* 56c4 */ NULL, +/* 56c5 */ NULL, +/* 56c6 */ NULL, +/* 56c7 */ NULL, +/* 56c8 */ NULL, +/* 56c9 */ NULL, +/* 56ca */ NULL, +/* 56cb */ NULL, +/* 56cc */ NULL, +/* 56cd */ NULL, +/* 56ce */ NULL, +/* 56cf */ NULL, +/* 56d0 */ NULL, +/* 56d1 */ NULL, +/* 56d2 */ NULL, +/* 56d3 */ NULL, +/* 56d4 */ NULL, +/* 56d5 */ NULL, +/* 56d6 */ NULL, +/* 56d7 */ NULL, +/* 56d8 */ NULL, +/* 56d9 */ NULL, +/* 56da */ NULL, +/* 56db */ NULL, +/* 56dc */ NULL, +/* 56dd */ NULL, +/* 56de */ NULL, +/* 56df */ NULL, +/* 56e0 */ NULL, +/* 56e1 */ NULL, +/* 56e2 */ NULL, +/* 56e3 */ NULL, +/* 56e4 */ NULL, +/* 56e5 */ NULL, +/* 56e6 */ NULL, +/* 56e7 */ NULL, +/* 56e8 */ NULL, +/* 56e9 */ NULL, +/* 56ea */ NULL, +/* 56eb */ NULL, +/* 56ec */ NULL, +/* 56ed */ NULL, +/* 56ee */ NULL, +/* 56ef */ NULL, +/* 56f0 */ NULL, +/* 56f1 */ NULL, +/* 56f2 */ NULL, +/* 56f3 */ NULL, +/* 56f4 */ NULL, +/* 56f5 */ NULL, +/* 56f6 */ NULL, +/* 56f7 */ NULL, +/* 56f8 */ NULL, +/* 56f9 */ NULL, +/* 56fa */ NULL, +/* 56fb */ NULL, +/* 56fc */ NULL, +/* 56fd */ NULL, +/* 56fe */ NULL, +/* 56ff */ NULL, +/* 5700 */ NULL, +/* 5701 */ NULL, +/* 5702 */ NULL, +/* 5703 */ NULL, +/* 5704 */ NULL, +/* 5705 */ NULL, +/* 5706 */ NULL, +/* 5707 */ NULL, +/* 5708 */ NULL, +/* 5709 */ NULL, +/* 570a */ NULL, +/* 570b */ NULL, +/* 570c */ NULL, +/* 570d */ NULL, +/* 570e */ NULL, +/* 570f */ NULL, +/* 5710 */ NULL, +/* 5711 */ NULL, +/* 5712 */ NULL, +/* 5713 */ NULL, +/* 5714 */ NULL, +/* 5715 */ NULL, +/* 5716 */ NULL, +/* 5717 */ NULL, +/* 5718 */ NULL, +/* 5719 */ NULL, +/* 571a */ NULL, +/* 571b */ NULL, +/* 571c */ NULL, +/* 571d */ NULL, +/* 571e */ NULL, +/* 571f */ NULL, +/* 5720 */ NULL, +/* 5721 */ NULL, +/* 5722 */ NULL, +/* 5723 */ NULL, +/* 5724 */ NULL, +/* 5725 */ NULL, +/* 5726 */ NULL, +/* 5727 */ NULL, +/* 5728 */ NULL, +/* 5729 */ NULL, +/* 572a */ NULL, +/* 572b */ NULL, +/* 572c */ NULL, +/* 572d */ NULL, +/* 572e */ NULL, +/* 572f */ NULL, +/* 5730 */ NULL, +/* 5731 */ NULL, +/* 5732 */ NULL, +/* 5733 */ NULL, +/* 5734 */ NULL, +/* 5735 */ NULL, +/* 5736 */ NULL, +/* 5737 */ NULL, +/* 5738 */ NULL, +/* 5739 */ NULL, +/* 573a */ NULL, +/* 573b */ NULL, +/* 573c */ NULL, +/* 573d */ NULL, +/* 573e */ NULL, +/* 573f */ NULL, +/* 5740 */ NULL, +/* 5741 */ NULL, +/* 5742 */ NULL, +/* 5743 */ NULL, +/* 5744 */ NULL, +/* 5745 */ NULL, +/* 5746 */ NULL, +/* 5747 */ NULL, +/* 5748 */ NULL, +/* 5749 */ NULL, +/* 574a */ NULL, +/* 574b */ NULL, +/* 574c */ NULL, +/* 574d */ NULL, +/* 574e */ NULL, +/* 574f */ NULL, +/* 5750 */ NULL, +/* 5751 */ NULL, +/* 5752 */ NULL, +/* 5753 */ NULL, +/* 5754 */ NULL, +/* 5755 */ NULL, +/* 5756 */ NULL, +/* 5757 */ NULL, +/* 5758 */ NULL, +/* 5759 */ NULL, +/* 575a */ NULL, +/* 575b */ NULL, +/* 575c */ NULL, +/* 575d */ NULL, +/* 575e */ NULL, +/* 575f */ NULL, +/* 5760 */ NULL, +/* 5761 */ NULL, +/* 5762 */ NULL, +/* 5763 */ NULL, +/* 5764 */ NULL, +/* 5765 */ NULL, +/* 5766 */ NULL, +/* 5767 */ NULL, +/* 5768 */ NULL, +/* 5769 */ NULL, +/* 576a */ NULL, +/* 576b */ NULL, +/* 576c */ NULL, +/* 576d */ NULL, +/* 576e */ NULL, +/* 576f */ NULL, +/* 5770 */ NULL, +/* 5771 */ NULL, +/* 5772 */ NULL, +/* 5773 */ NULL, +/* 5774 */ NULL, +/* 5775 */ NULL, +/* 5776 */ NULL, +/* 5777 */ NULL, +/* 5778 */ NULL, +/* 5779 */ NULL, +/* 577a */ NULL, +/* 577b */ NULL, +/* 577c */ NULL, +/* 577d */ NULL, +/* 577e */ NULL, +/* 577f */ NULL, +/* 5780 */ NULL, +/* 5781 */ NULL, +/* 5782 */ NULL, +/* 5783 */ NULL, +/* 5784 */ NULL, +/* 5785 */ NULL, +/* 5786 */ NULL, +/* 5787 */ NULL, +/* 5788 */ NULL, +/* 5789 */ NULL, +/* 578a */ NULL, +/* 578b */ NULL, +/* 578c */ NULL, +/* 578d */ NULL, +/* 578e */ NULL, +/* 578f */ NULL, +/* 5790 */ NULL, +/* 5791 */ NULL, +/* 5792 */ NULL, +/* 5793 */ NULL, +/* 5794 */ NULL, +/* 5795 */ NULL, +/* 5796 */ NULL, +/* 5797 */ NULL, +/* 5798 */ NULL, +/* 5799 */ NULL, +/* 579a */ NULL, +/* 579b */ NULL, +/* 579c */ NULL, +/* 579d */ NULL, +/* 579e */ NULL, +/* 579f */ NULL, +/* 57a0 */ NULL, +/* 57a1 */ NULL, +/* 57a2 */ NULL, +/* 57a3 */ NULL, +/* 57a4 */ NULL, +/* 57a5 */ NULL, +/* 57a6 */ NULL, +/* 57a7 */ NULL, +/* 57a8 */ NULL, +/* 57a9 */ NULL, +/* 57aa */ NULL, +/* 57ab */ NULL, +/* 57ac */ NULL, +/* 57ad */ NULL, +/* 57ae */ NULL, +/* 57af */ NULL, +/* 57b0 */ NULL, +/* 57b1 */ NULL, +/* 57b2 */ NULL, +/* 57b3 */ NULL, +/* 57b4 */ NULL, +/* 57b5 */ NULL, +/* 57b6 */ NULL, +/* 57b7 */ NULL, +/* 57b8 */ NULL, +/* 57b9 */ NULL, +/* 57ba */ NULL, +/* 57bb */ NULL, +/* 57bc */ NULL, +/* 57bd */ NULL, +/* 57be */ NULL, +/* 57bf */ NULL, +/* 57c0 */ NULL, +/* 57c1 */ NULL, +/* 57c2 */ NULL, +/* 57c3 */ NULL, +/* 57c4 */ NULL, +/* 57c5 */ NULL, +/* 57c6 */ NULL, +/* 57c7 */ NULL, +/* 57c8 */ NULL, +/* 57c9 */ NULL, +/* 57ca */ NULL, +/* 57cb */ NULL, +/* 57cc */ NULL, +/* 57cd */ NULL, +/* 57ce */ NULL, +/* 57cf */ NULL, +/* 57d0 */ NULL, +/* 57d1 */ NULL, +/* 57d2 */ NULL, +/* 57d3 */ NULL, +/* 57d4 */ NULL, +/* 57d5 */ NULL, +/* 57d6 */ NULL, +/* 57d7 */ NULL, +/* 57d8 */ NULL, +/* 57d9 */ NULL, +/* 57da */ NULL, +/* 57db */ NULL, +/* 57dc */ NULL, +/* 57dd */ NULL, +/* 57de */ NULL, +/* 57df */ NULL, +/* 57e0 */ NULL, +/* 57e1 */ NULL, +/* 57e2 */ NULL, +/* 57e3 */ NULL, +/* 57e4 */ NULL, +/* 57e5 */ NULL, +/* 57e6 */ NULL, +/* 57e7 */ NULL, +/* 57e8 */ NULL, +/* 57e9 */ NULL, +/* 57ea */ NULL, +/* 57eb */ NULL, +/* 57ec */ NULL, +/* 57ed */ NULL, +/* 57ee */ NULL, +/* 57ef */ NULL, +/* 57f0 */ NULL, +/* 57f1 */ NULL, +/* 57f2 */ NULL, +/* 57f3 */ NULL, +/* 57f4 */ NULL, +/* 57f5 */ NULL, +/* 57f6 */ NULL, +/* 57f7 */ NULL, +/* 57f8 */ NULL, +/* 57f9 */ NULL, +/* 57fa */ NULL, +/* 57fb */ NULL, +/* 57fc */ NULL, +/* 57fd */ NULL, +/* 57fe */ NULL, +/* 57ff */ NULL, +/* 5800 */ NULL, +/* 5801 */ NULL, +/* 5802 */ NULL, +/* 5803 */ NULL, +/* 5804 */ NULL, +/* 5805 */ NULL, +/* 5806 */ NULL, +/* 5807 */ NULL, +/* 5808 */ NULL, +/* 5809 */ NULL, +/* 580a */ NULL, +/* 580b */ NULL, +/* 580c */ NULL, +/* 580d */ NULL, +/* 580e */ NULL, +/* 580f */ NULL, +/* 5810 */ NULL, +/* 5811 */ NULL, +/* 5812 */ NULL, +/* 5813 */ NULL, +/* 5814 */ NULL, +/* 5815 */ NULL, +/* 5816 */ NULL, +/* 5817 */ NULL, +/* 5818 */ NULL, +/* 5819 */ NULL, +/* 581a */ NULL, +/* 581b */ NULL, +/* 581c */ NULL, +/* 581d */ NULL, +/* 581e */ NULL, +/* 581f */ NULL, +/* 5820 */ NULL, +/* 5821 */ NULL, +/* 5822 */ NULL, +/* 5823 */ NULL, +/* 5824 */ NULL, +/* 5825 */ NULL, +/* 5826 */ NULL, +/* 5827 */ NULL, +/* 5828 */ NULL, +/* 5829 */ NULL, +/* 582a */ NULL, +/* 582b */ NULL, +/* 582c */ NULL, +/* 582d */ NULL, +/* 582e */ NULL, +/* 582f */ NULL, +/* 5830 */ NULL, +/* 5831 */ NULL, +/* 5832 */ NULL, +/* 5833 */ NULL, +/* 5834 */ NULL, +/* 5835 */ NULL, +/* 5836 */ NULL, +/* 5837 */ NULL, +/* 5838 */ NULL, +/* 5839 */ NULL, +/* 583a */ NULL, +/* 583b */ NULL, +/* 583c */ NULL, +/* 583d */ NULL, +/* 583e */ NULL, +/* 583f */ NULL, +/* 5840 */ NULL, +/* 5841 */ NULL, +/* 5842 */ NULL, +/* 5843 */ NULL, +/* 5844 */ NULL, +/* 5845 */ NULL, +/* 5846 */ NULL, +/* 5847 */ NULL, +/* 5848 */ NULL, +/* 5849 */ NULL, +/* 584a */ NULL, +/* 584b */ NULL, +/* 584c */ NULL, +/* 584d */ NULL, +/* 584e */ NULL, +/* 584f */ NULL, +/* 5850 */ NULL, +/* 5851 */ NULL, +/* 5852 */ NULL, +/* 5853 */ NULL, +/* 5854 */ NULL, +/* 5855 */ NULL, +/* 5856 */ NULL, +/* 5857 */ NULL, +/* 5858 */ NULL, +/* 5859 */ NULL, +/* 585a */ NULL, +/* 585b */ NULL, +/* 585c */ NULL, +/* 585d */ NULL, +/* 585e */ NULL, +/* 585f */ NULL, +/* 5860 */ NULL, +/* 5861 */ NULL, +/* 5862 */ NULL, +/* 5863 */ NULL, +/* 5864 */ NULL, +/* 5865 */ NULL, +/* 5866 */ NULL, +/* 5867 */ NULL, +/* 5868 */ NULL, +/* 5869 */ NULL, +/* 586a */ NULL, +/* 586b */ NULL, +/* 586c */ NULL, +/* 586d */ NULL, +/* 586e */ NULL, +/* 586f */ NULL, +/* 5870 */ NULL, +/* 5871 */ NULL, +/* 5872 */ NULL, +/* 5873 */ NULL, +/* 5874 */ NULL, +/* 5875 */ NULL, +/* 5876 */ NULL, +/* 5877 */ NULL, +/* 5878 */ NULL, +/* 5879 */ NULL, +/* 587a */ NULL, +/* 587b */ NULL, +/* 587c */ NULL, +/* 587d */ NULL, +/* 587e */ NULL, +/* 587f */ NULL, +/* 5880 */ NULL, +/* 5881 */ NULL, +/* 5882 */ NULL, +/* 5883 */ NULL, +/* 5884 */ NULL, +/* 5885 */ NULL, +/* 5886 */ NULL, +/* 5887 */ NULL, +/* 5888 */ NULL, +/* 5889 */ NULL, +/* 588a */ NULL, +/* 588b */ NULL, +/* 588c */ NULL, +/* 588d */ NULL, +/* 588e */ NULL, +/* 588f */ NULL, +/* 5890 */ NULL, +/* 5891 */ NULL, +/* 5892 */ NULL, +/* 5893 */ NULL, +/* 5894 */ NULL, +/* 5895 */ NULL, +/* 5896 */ NULL, +/* 5897 */ NULL, +/* 5898 */ NULL, +/* 5899 */ NULL, +/* 589a */ NULL, +/* 589b */ NULL, +/* 589c */ NULL, +/* 589d */ NULL, +/* 589e */ NULL, +/* 589f */ NULL, +/* 58a0 */ NULL, +/* 58a1 */ NULL, +/* 58a2 */ NULL, +/* 58a3 */ NULL, +/* 58a4 */ NULL, +/* 58a5 */ NULL, +/* 58a6 */ NULL, +/* 58a7 */ NULL, +/* 58a8 */ NULL, +/* 58a9 */ NULL, +/* 58aa */ NULL, +/* 58ab */ NULL, +/* 58ac */ NULL, +/* 58ad */ NULL, +/* 58ae */ NULL, +/* 58af */ NULL, +/* 58b0 */ NULL, +/* 58b1 */ NULL, +/* 58b2 */ NULL, +/* 58b3 */ NULL, +/* 58b4 */ NULL, +/* 58b5 */ NULL, +/* 58b6 */ NULL, +/* 58b7 */ NULL, +/* 58b8 */ NULL, +/* 58b9 */ NULL, +/* 58ba */ NULL, +/* 58bb */ NULL, +/* 58bc */ NULL, +/* 58bd */ NULL, +/* 58be */ NULL, +/* 58bf */ NULL, +/* 58c0 */ NULL, +/* 58c1 */ NULL, +/* 58c2 */ NULL, +/* 58c3 */ NULL, +/* 58c4 */ NULL, +/* 58c5 */ NULL, +/* 58c6 */ NULL, +/* 58c7 */ NULL, +/* 58c8 */ NULL, +/* 58c9 */ NULL, +/* 58ca */ NULL, +/* 58cb */ NULL, +/* 58cc */ NULL, +/* 58cd */ NULL, +/* 58ce */ NULL, +/* 58cf */ NULL, +/* 58d0 */ NULL, +/* 58d1 */ NULL, +/* 58d2 */ NULL, +/* 58d3 */ NULL, +/* 58d4 */ NULL, +/* 58d5 */ NULL, +/* 58d6 */ NULL, +/* 58d7 */ NULL, +/* 58d8 */ NULL, +/* 58d9 */ NULL, +/* 58da */ NULL, +/* 58db */ NULL, +/* 58dc */ NULL, +/* 58dd */ NULL, +/* 58de */ NULL, +/* 58df */ NULL, +/* 58e0 */ NULL, +/* 58e1 */ NULL, +/* 58e2 */ NULL, +/* 58e3 */ NULL, +/* 58e4 */ NULL, +/* 58e5 */ NULL, +/* 58e6 */ NULL, +/* 58e7 */ NULL, +/* 58e8 */ NULL, +/* 58e9 */ NULL, +/* 58ea */ NULL, +/* 58eb */ NULL, +/* 58ec */ NULL, +/* 58ed */ NULL, +/* 58ee */ NULL, +/* 58ef */ NULL, +/* 58f0 */ NULL, +/* 58f1 */ NULL, +/* 58f2 */ NULL, +/* 58f3 */ NULL, +/* 58f4 */ NULL, +/* 58f5 */ NULL, +/* 58f6 */ NULL, +/* 58f7 */ NULL, +/* 58f8 */ NULL, +/* 58f9 */ NULL, +/* 58fa */ NULL, +/* 58fb */ NULL, +/* 58fc */ NULL, +/* 58fd */ NULL, +/* 58fe */ NULL, +/* 58ff */ NULL, +/* 5900 */ NULL, +/* 5901 */ NULL, +/* 5902 */ NULL, +/* 5903 */ NULL, +/* 5904 */ NULL, +/* 5905 */ NULL, +/* 5906 */ NULL, +/* 5907 */ NULL, +/* 5908 */ NULL, +/* 5909 */ NULL, +/* 590a */ NULL, +/* 590b */ NULL, +/* 590c */ NULL, +/* 590d */ NULL, +/* 590e */ NULL, +/* 590f */ NULL, +/* 5910 */ NULL, +/* 5911 */ NULL, +/* 5912 */ NULL, +/* 5913 */ NULL, +/* 5914 */ NULL, +/* 5915 */ NULL, +/* 5916 */ NULL, +/* 5917 */ NULL, +/* 5918 */ NULL, +/* 5919 */ NULL, +/* 591a */ NULL, +/* 591b */ NULL, +/* 591c */ NULL, +/* 591d */ NULL, +/* 591e */ NULL, +/* 591f */ NULL, +/* 5920 */ NULL, +/* 5921 */ NULL, +/* 5922 */ NULL, +/* 5923 */ NULL, +/* 5924 */ NULL, +/* 5925 */ NULL, +/* 5926 */ NULL, +/* 5927 */ NULL, +/* 5928 */ NULL, +/* 5929 */ NULL, +/* 592a */ NULL, +/* 592b */ NULL, +/* 592c */ NULL, +/* 592d */ NULL, +/* 592e */ NULL, +/* 592f */ NULL, +/* 5930 */ NULL, +/* 5931 */ NULL, +/* 5932 */ NULL, +/* 5933 */ NULL, +/* 5934 */ NULL, +/* 5935 */ NULL, +/* 5936 */ NULL, +/* 5937 */ NULL, +/* 5938 */ NULL, +/* 5939 */ NULL, +/* 593a */ NULL, +/* 593b */ NULL, +/* 593c */ NULL, +/* 593d */ NULL, +/* 593e */ NULL, +/* 593f */ NULL, +/* 5940 */ NULL, +/* 5941 */ NULL, +/* 5942 */ NULL, +/* 5943 */ NULL, +/* 5944 */ NULL, +/* 5945 */ NULL, +/* 5946 */ NULL, +/* 5947 */ NULL, +/* 5948 */ NULL, +/* 5949 */ NULL, +/* 594a */ NULL, +/* 594b */ NULL, +/* 594c */ NULL, +/* 594d */ NULL, +/* 594e */ NULL, +/* 594f */ NULL, +/* 5950 */ NULL, +/* 5951 */ NULL, +/* 5952 */ NULL, +/* 5953 */ NULL, +/* 5954 */ NULL, +/* 5955 */ NULL, +/* 5956 */ NULL, +/* 5957 */ NULL, +/* 5958 */ NULL, +/* 5959 */ NULL, +/* 595a */ NULL, +/* 595b */ NULL, +/* 595c */ NULL, +/* 595d */ NULL, +/* 595e */ NULL, +/* 595f */ NULL, +/* 5960 */ NULL, +/* 5961 */ NULL, +/* 5962 */ NULL, +/* 5963 */ NULL, +/* 5964 */ NULL, +/* 5965 */ NULL, +/* 5966 */ NULL, +/* 5967 */ NULL, +/* 5968 */ NULL, +/* 5969 */ NULL, +/* 596a */ NULL, +/* 596b */ NULL, +/* 596c */ NULL, +/* 596d */ NULL, +/* 596e */ NULL, +/* 596f */ NULL, +/* 5970 */ NULL, +/* 5971 */ NULL, +/* 5972 */ NULL, +/* 5973 */ NULL, +/* 5974 */ NULL, +/* 5975 */ NULL, +/* 5976 */ NULL, +/* 5977 */ NULL, +/* 5978 */ NULL, +/* 5979 */ NULL, +/* 597a */ NULL, +/* 597b */ NULL, +/* 597c */ NULL, +/* 597d */ NULL, +/* 597e */ NULL, +/* 597f */ NULL, +/* 5980 */ NULL, +/* 5981 */ NULL, +/* 5982 */ NULL, +/* 5983 */ NULL, +/* 5984 */ NULL, +/* 5985 */ NULL, +/* 5986 */ NULL, +/* 5987 */ NULL, +/* 5988 */ NULL, +/* 5989 */ NULL, +/* 598a */ NULL, +/* 598b */ NULL, +/* 598c */ NULL, +/* 598d */ NULL, +/* 598e */ NULL, +/* 598f */ NULL, +/* 5990 */ NULL, +/* 5991 */ NULL, +/* 5992 */ NULL, +/* 5993 */ NULL, +/* 5994 */ NULL, +/* 5995 */ NULL, +/* 5996 */ NULL, +/* 5997 */ NULL, +/* 5998 */ NULL, +/* 5999 */ NULL, +/* 599a */ NULL, +/* 599b */ NULL, +/* 599c */ NULL, +/* 599d */ NULL, +/* 599e */ NULL, +/* 599f */ NULL, +/* 59a0 */ NULL, +/* 59a1 */ NULL, +/* 59a2 */ NULL, +/* 59a3 */ NULL, +/* 59a4 */ NULL, +/* 59a5 */ NULL, +/* 59a6 */ NULL, +/* 59a7 */ NULL, +/* 59a8 */ NULL, +/* 59a9 */ NULL, +/* 59aa */ NULL, +/* 59ab */ NULL, +/* 59ac */ NULL, +/* 59ad */ NULL, +/* 59ae */ NULL, +/* 59af */ NULL, +/* 59b0 */ NULL, +/* 59b1 */ NULL, +/* 59b2 */ NULL, +/* 59b3 */ NULL, +/* 59b4 */ NULL, +/* 59b5 */ NULL, +/* 59b6 */ NULL, +/* 59b7 */ NULL, +/* 59b8 */ NULL, +/* 59b9 */ NULL, +/* 59ba */ NULL, +/* 59bb */ NULL, +/* 59bc */ NULL, +/* 59bd */ NULL, +/* 59be */ NULL, +/* 59bf */ NULL, +/* 59c0 */ NULL, +/* 59c1 */ NULL, +/* 59c2 */ NULL, +/* 59c3 */ NULL, +/* 59c4 */ NULL, +/* 59c5 */ NULL, +/* 59c6 */ NULL, +/* 59c7 */ NULL, +/* 59c8 */ NULL, +/* 59c9 */ NULL, +/* 59ca */ NULL, +/* 59cb */ NULL, +/* 59cc */ NULL, +/* 59cd */ NULL, +/* 59ce */ NULL, +/* 59cf */ NULL, +/* 59d0 */ NULL, +/* 59d1 */ NULL, +/* 59d2 */ NULL, +/* 59d3 */ NULL, +/* 59d4 */ NULL, +/* 59d5 */ NULL, +/* 59d6 */ NULL, +/* 59d7 */ NULL, +/* 59d8 */ NULL, +/* 59d9 */ NULL, +/* 59da */ NULL, +/* 59db */ NULL, +/* 59dc */ NULL, +/* 59dd */ NULL, +/* 59de */ NULL, +/* 59df */ NULL, +/* 59e0 */ NULL, +/* 59e1 */ NULL, +/* 59e2 */ NULL, +/* 59e3 */ NULL, +/* 59e4 */ NULL, +/* 59e5 */ NULL, +/* 59e6 */ NULL, +/* 59e7 */ NULL, +/* 59e8 */ NULL, +/* 59e9 */ NULL, +/* 59ea */ NULL, +/* 59eb */ NULL, +/* 59ec */ NULL, +/* 59ed */ NULL, +/* 59ee */ NULL, +/* 59ef */ NULL, +/* 59f0 */ NULL, +/* 59f1 */ NULL, +/* 59f2 */ NULL, +/* 59f3 */ NULL, +/* 59f4 */ NULL, +/* 59f5 */ NULL, +/* 59f6 */ NULL, +/* 59f7 */ NULL, +/* 59f8 */ NULL, +/* 59f9 */ NULL, +/* 59fa */ NULL, +/* 59fb */ NULL, +/* 59fc */ NULL, +/* 59fd */ NULL, +/* 59fe */ NULL, +/* 59ff */ NULL, +/* 5a00 */ NULL, +/* 5a01 */ NULL, +/* 5a02 */ NULL, +/* 5a03 */ NULL, +/* 5a04 */ NULL, +/* 5a05 */ NULL, +/* 5a06 */ NULL, +/* 5a07 */ NULL, +/* 5a08 */ NULL, +/* 5a09 */ NULL, +/* 5a0a */ NULL, +/* 5a0b */ NULL, +/* 5a0c */ NULL, +/* 5a0d */ NULL, +/* 5a0e */ NULL, +/* 5a0f */ NULL, +/* 5a10 */ NULL, +/* 5a11 */ NULL, +/* 5a12 */ NULL, +/* 5a13 */ NULL, +/* 5a14 */ NULL, +/* 5a15 */ NULL, +/* 5a16 */ NULL, +/* 5a17 */ NULL, +/* 5a18 */ NULL, +/* 5a19 */ NULL, +/* 5a1a */ NULL, +/* 5a1b */ NULL, +/* 5a1c */ NULL, +/* 5a1d */ NULL, +/* 5a1e */ NULL, +/* 5a1f */ NULL, +/* 5a20 */ NULL, +/* 5a21 */ NULL, +/* 5a22 */ NULL, +/* 5a23 */ NULL, +/* 5a24 */ NULL, +/* 5a25 */ NULL, +/* 5a26 */ NULL, +/* 5a27 */ NULL, +/* 5a28 */ NULL, +/* 5a29 */ NULL, +/* 5a2a */ NULL, +/* 5a2b */ NULL, +/* 5a2c */ NULL, +/* 5a2d */ NULL, +/* 5a2e */ NULL, +/* 5a2f */ NULL, +/* 5a30 */ NULL, +/* 5a31 */ NULL, +/* 5a32 */ NULL, +/* 5a33 */ NULL, +/* 5a34 */ NULL, +/* 5a35 */ NULL, +/* 5a36 */ NULL, +/* 5a37 */ NULL, +/* 5a38 */ NULL, +/* 5a39 */ NULL, +/* 5a3a */ NULL, +/* 5a3b */ NULL, +/* 5a3c */ NULL, +/* 5a3d */ NULL, +/* 5a3e */ NULL, +/* 5a3f */ NULL, +/* 5a40 */ NULL, +/* 5a41 */ NULL, +/* 5a42 */ NULL, +/* 5a43 */ NULL, +/* 5a44 */ NULL, +/* 5a45 */ NULL, +/* 5a46 */ NULL, +/* 5a47 */ NULL, +/* 5a48 */ NULL, +/* 5a49 */ NULL, +/* 5a4a */ NULL, +/* 5a4b */ NULL, +/* 5a4c */ NULL, +/* 5a4d */ NULL, +/* 5a4e */ NULL, +/* 5a4f */ NULL, +/* 5a50 */ NULL, +/* 5a51 */ NULL, +/* 5a52 */ NULL, +/* 5a53 */ NULL, +/* 5a54 */ NULL, +/* 5a55 */ NULL, +/* 5a56 */ NULL, +/* 5a57 */ NULL, +/* 5a58 */ NULL, +/* 5a59 */ NULL, +/* 5a5a */ NULL, +/* 5a5b */ NULL, +/* 5a5c */ NULL, +/* 5a5d */ NULL, +/* 5a5e */ NULL, +/* 5a5f */ NULL, +/* 5a60 */ NULL, +/* 5a61 */ NULL, +/* 5a62 */ NULL, +/* 5a63 */ NULL, +/* 5a64 */ NULL, +/* 5a65 */ NULL, +/* 5a66 */ NULL, +/* 5a67 */ NULL, +/* 5a68 */ NULL, +/* 5a69 */ NULL, +/* 5a6a */ NULL, +/* 5a6b */ NULL, +/* 5a6c */ NULL, +/* 5a6d */ NULL, +/* 5a6e */ NULL, +/* 5a6f */ NULL, +/* 5a70 */ NULL, +/* 5a71 */ NULL, +/* 5a72 */ NULL, +/* 5a73 */ NULL, +/* 5a74 */ NULL, +/* 5a75 */ NULL, +/* 5a76 */ NULL, +/* 5a77 */ NULL, +/* 5a78 */ NULL, +/* 5a79 */ NULL, +/* 5a7a */ NULL, +/* 5a7b */ NULL, +/* 5a7c */ NULL, +/* 5a7d */ NULL, +/* 5a7e */ NULL, +/* 5a7f */ NULL, +/* 5a80 */ NULL, +/* 5a81 */ NULL, +/* 5a82 */ NULL, +/* 5a83 */ NULL, +/* 5a84 */ NULL, +/* 5a85 */ NULL, +/* 5a86 */ NULL, +/* 5a87 */ NULL, +/* 5a88 */ NULL, +/* 5a89 */ NULL, +/* 5a8a */ NULL, +/* 5a8b */ NULL, +/* 5a8c */ NULL, +/* 5a8d */ NULL, +/* 5a8e */ NULL, +/* 5a8f */ NULL, +/* 5a90 */ NULL, +/* 5a91 */ NULL, +/* 5a92 */ NULL, +/* 5a93 */ NULL, +/* 5a94 */ NULL, +/* 5a95 */ NULL, +/* 5a96 */ NULL, +/* 5a97 */ NULL, +/* 5a98 */ NULL, +/* 5a99 */ NULL, +/* 5a9a */ NULL, +/* 5a9b */ NULL, +/* 5a9c */ NULL, +/* 5a9d */ NULL, +/* 5a9e */ NULL, +/* 5a9f */ NULL, +/* 5aa0 */ NULL, +/* 5aa1 */ NULL, +/* 5aa2 */ NULL, +/* 5aa3 */ NULL, +/* 5aa4 */ NULL, +/* 5aa5 */ NULL, +/* 5aa6 */ NULL, +/* 5aa7 */ NULL, +/* 5aa8 */ NULL, +/* 5aa9 */ NULL, +/* 5aaa */ NULL, +/* 5aab */ NULL, +/* 5aac */ NULL, +/* 5aad */ NULL, +/* 5aae */ NULL, +/* 5aaf */ NULL, +/* 5ab0 */ NULL, +/* 5ab1 */ NULL, +/* 5ab2 */ NULL, +/* 5ab3 */ NULL, +/* 5ab4 */ NULL, +/* 5ab5 */ NULL, +/* 5ab6 */ NULL, +/* 5ab7 */ NULL, +/* 5ab8 */ NULL, +/* 5ab9 */ NULL, +/* 5aba */ NULL, +/* 5abb */ NULL, +/* 5abc */ NULL, +/* 5abd */ NULL, +/* 5abe */ NULL, +/* 5abf */ NULL, +/* 5ac0 */ NULL, +/* 5ac1 */ NULL, +/* 5ac2 */ NULL, +/* 5ac3 */ NULL, +/* 5ac4 */ NULL, +/* 5ac5 */ NULL, +/* 5ac6 */ NULL, +/* 5ac7 */ NULL, +/* 5ac8 */ NULL, +/* 5ac9 */ NULL, +/* 5aca */ NULL, +/* 5acb */ NULL, +/* 5acc */ NULL, +/* 5acd */ NULL, +/* 5ace */ NULL, +/* 5acf */ NULL, +/* 5ad0 */ NULL, +/* 5ad1 */ NULL, +/* 5ad2 */ NULL, +/* 5ad3 */ NULL, +/* 5ad4 */ NULL, +/* 5ad5 */ NULL, +/* 5ad6 */ NULL, +/* 5ad7 */ NULL, +/* 5ad8 */ NULL, +/* 5ad9 */ NULL, +/* 5ada */ NULL, +/* 5adb */ NULL, +/* 5adc */ NULL, +/* 5add */ NULL, +/* 5ade */ NULL, +/* 5adf */ NULL, +/* 5ae0 */ NULL, +/* 5ae1 */ NULL, +/* 5ae2 */ NULL, +/* 5ae3 */ NULL, +/* 5ae4 */ NULL, +/* 5ae5 */ NULL, +/* 5ae6 */ NULL, +/* 5ae7 */ NULL, +/* 5ae8 */ NULL, +/* 5ae9 */ NULL, +/* 5aea */ NULL, +/* 5aeb */ NULL, +/* 5aec */ NULL, +/* 5aed */ NULL, +/* 5aee */ NULL, +/* 5aef */ NULL, +/* 5af0 */ NULL, +/* 5af1 */ NULL, +/* 5af2 */ NULL, +/* 5af3 */ NULL, +/* 5af4 */ NULL, +/* 5af5 */ NULL, +/* 5af6 */ NULL, +/* 5af7 */ NULL, +/* 5af8 */ NULL, +/* 5af9 */ NULL, +/* 5afa */ NULL, +/* 5afb */ NULL, +/* 5afc */ NULL, +/* 5afd */ NULL, +/* 5afe */ NULL, +/* 5aff */ NULL, +/* 5b00 */ NULL, +/* 5b01 */ NULL, +/* 5b02 */ NULL, +/* 5b03 */ NULL, +/* 5b04 */ NULL, +/* 5b05 */ NULL, +/* 5b06 */ NULL, +/* 5b07 */ NULL, +/* 5b08 */ NULL, +/* 5b09 */ NULL, +/* 5b0a */ NULL, +/* 5b0b */ NULL, +/* 5b0c */ NULL, +/* 5b0d */ NULL, +/* 5b0e */ NULL, +/* 5b0f */ NULL, +/* 5b10 */ NULL, +/* 5b11 */ NULL, +/* 5b12 */ NULL, +/* 5b13 */ NULL, +/* 5b14 */ NULL, +/* 5b15 */ NULL, +/* 5b16 */ NULL, +/* 5b17 */ NULL, +/* 5b18 */ NULL, +/* 5b19 */ NULL, +/* 5b1a */ NULL, +/* 5b1b */ NULL, +/* 5b1c */ NULL, +/* 5b1d */ NULL, +/* 5b1e */ NULL, +/* 5b1f */ NULL, +/* 5b20 */ NULL, +/* 5b21 */ NULL, +/* 5b22 */ NULL, +/* 5b23 */ NULL, +/* 5b24 */ NULL, +/* 5b25 */ NULL, +/* 5b26 */ NULL, +/* 5b27 */ NULL, +/* 5b28 */ NULL, +/* 5b29 */ NULL, +/* 5b2a */ NULL, +/* 5b2b */ NULL, +/* 5b2c */ NULL, +/* 5b2d */ NULL, +/* 5b2e */ NULL, +/* 5b2f */ NULL, +/* 5b30 */ NULL, +/* 5b31 */ NULL, +/* 5b32 */ NULL, +/* 5b33 */ NULL, +/* 5b34 */ NULL, +/* 5b35 */ NULL, +/* 5b36 */ NULL, +/* 5b37 */ NULL, +/* 5b38 */ NULL, +/* 5b39 */ NULL, +/* 5b3a */ NULL, +/* 5b3b */ NULL, +/* 5b3c */ NULL, +/* 5b3d */ NULL, +/* 5b3e */ NULL, +/* 5b3f */ NULL, +/* 5b40 */ NULL, +/* 5b41 */ NULL, +/* 5b42 */ NULL, +/* 5b43 */ NULL, +/* 5b44 */ NULL, +/* 5b45 */ NULL, +/* 5b46 */ NULL, +/* 5b47 */ NULL, +/* 5b48 */ NULL, +/* 5b49 */ NULL, +/* 5b4a */ NULL, +/* 5b4b */ NULL, +/* 5b4c */ NULL, +/* 5b4d */ NULL, +/* 5b4e */ NULL, +/* 5b4f */ NULL, +/* 5b50 */ NULL, +/* 5b51 */ NULL, +/* 5b52 */ NULL, +/* 5b53 */ NULL, +/* 5b54 */ NULL, +/* 5b55 */ NULL, +/* 5b56 */ NULL, +/* 5b57 */ NULL, +/* 5b58 */ NULL, +/* 5b59 */ NULL, +/* 5b5a */ NULL, +/* 5b5b */ NULL, +/* 5b5c */ NULL, +/* 5b5d */ NULL, +/* 5b5e */ NULL, +/* 5b5f */ NULL, +/* 5b60 */ NULL, +/* 5b61 */ NULL, +/* 5b62 */ NULL, +/* 5b63 */ NULL, +/* 5b64 */ NULL, +/* 5b65 */ NULL, +/* 5b66 */ NULL, +/* 5b67 */ NULL, +/* 5b68 */ NULL, +/* 5b69 */ NULL, +/* 5b6a */ NULL, +/* 5b6b */ NULL, +/* 5b6c */ NULL, +/* 5b6d */ NULL, +/* 5b6e */ NULL, +/* 5b6f */ NULL, +/* 5b70 */ NULL, +/* 5b71 */ NULL, +/* 5b72 */ NULL, +/* 5b73 */ NULL, +/* 5b74 */ NULL, +/* 5b75 */ NULL, +/* 5b76 */ NULL, +/* 5b77 */ NULL, +/* 5b78 */ NULL, +/* 5b79 */ NULL, +/* 5b7a */ NULL, +/* 5b7b */ NULL, +/* 5b7c */ NULL, +/* 5b7d */ NULL, +/* 5b7e */ NULL, +/* 5b7f */ NULL, +/* 5b80 */ NULL, +/* 5b81 */ NULL, +/* 5b82 */ NULL, +/* 5b83 */ NULL, +/* 5b84 */ NULL, +/* 5b85 */ NULL, +/* 5b86 */ NULL, +/* 5b87 */ NULL, +/* 5b88 */ NULL, +/* 5b89 */ NULL, +/* 5b8a */ NULL, +/* 5b8b */ NULL, +/* 5b8c */ NULL, +/* 5b8d */ NULL, +/* 5b8e */ NULL, +/* 5b8f */ NULL, +/* 5b90 */ NULL, +/* 5b91 */ NULL, +/* 5b92 */ NULL, +/* 5b93 */ NULL, +/* 5b94 */ NULL, +/* 5b95 */ NULL, +/* 5b96 */ NULL, +/* 5b97 */ NULL, +/* 5b98 */ NULL, +/* 5b99 */ NULL, +/* 5b9a */ NULL, +/* 5b9b */ NULL, +/* 5b9c */ NULL, +/* 5b9d */ NULL, +/* 5b9e */ NULL, +/* 5b9f */ NULL, +/* 5ba0 */ NULL, +/* 5ba1 */ NULL, +/* 5ba2 */ NULL, +/* 5ba3 */ NULL, +/* 5ba4 */ NULL, +/* 5ba5 */ NULL, +/* 5ba6 */ NULL, +/* 5ba7 */ NULL, +/* 5ba8 */ NULL, +/* 5ba9 */ NULL, +/* 5baa */ NULL, +/* 5bab */ NULL, +/* 5bac */ NULL, +/* 5bad */ NULL, +/* 5bae */ NULL, +/* 5baf */ NULL, +/* 5bb0 */ NULL, +/* 5bb1 */ NULL, +/* 5bb2 */ NULL, +/* 5bb3 */ NULL, +/* 5bb4 */ NULL, +/* 5bb5 */ NULL, +/* 5bb6 */ NULL, +/* 5bb7 */ NULL, +/* 5bb8 */ NULL, +/* 5bb9 */ NULL, +/* 5bba */ NULL, +/* 5bbb */ NULL, +/* 5bbc */ NULL, +/* 5bbd */ NULL, +/* 5bbe */ NULL, +/* 5bbf */ NULL, +/* 5bc0 */ NULL, +/* 5bc1 */ NULL, +/* 5bc2 */ NULL, +/* 5bc3 */ NULL, +/* 5bc4 */ NULL, +/* 5bc5 */ NULL, +/* 5bc6 */ NULL, +/* 5bc7 */ NULL, +/* 5bc8 */ NULL, +/* 5bc9 */ NULL, +/* 5bca */ NULL, +/* 5bcb */ NULL, +/* 5bcc */ NULL, +/* 5bcd */ NULL, +/* 5bce */ NULL, +/* 5bcf */ NULL, +/* 5bd0 */ NULL, +/* 5bd1 */ NULL, +/* 5bd2 */ NULL, +/* 5bd3 */ NULL, +/* 5bd4 */ NULL, +/* 5bd5 */ NULL, +/* 5bd6 */ NULL, +/* 5bd7 */ NULL, +/* 5bd8 */ NULL, +/* 5bd9 */ NULL, +/* 5bda */ NULL, +/* 5bdb */ NULL, +/* 5bdc */ NULL, +/* 5bdd */ NULL, +/* 5bde */ NULL, +/* 5bdf */ NULL, +/* 5be0 */ NULL, +/* 5be1 */ NULL, +/* 5be2 */ NULL, +/* 5be3 */ NULL, +/* 5be4 */ NULL, +/* 5be5 */ NULL, +/* 5be6 */ NULL, +/* 5be7 */ NULL, +/* 5be8 */ NULL, +/* 5be9 */ NULL, +/* 5bea */ NULL, +/* 5beb */ NULL, +/* 5bec */ NULL, +/* 5bed */ NULL, +/* 5bee */ NULL, +/* 5bef */ NULL, +/* 5bf0 */ NULL, +/* 5bf1 */ NULL, +/* 5bf2 */ NULL, +/* 5bf3 */ NULL, +/* 5bf4 */ NULL, +/* 5bf5 */ NULL, +/* 5bf6 */ NULL, +/* 5bf7 */ NULL, +/* 5bf8 */ NULL, +/* 5bf9 */ NULL, +/* 5bfa */ NULL, +/* 5bfb */ NULL, +/* 5bfc */ NULL, +/* 5bfd */ NULL, +/* 5bfe */ NULL, +/* 5bff */ NULL, +/* 5c00 */ NULL, +/* 5c01 */ NULL, +/* 5c02 */ NULL, +/* 5c03 */ NULL, +/* 5c04 */ NULL, +/* 5c05 */ NULL, +/* 5c06 */ NULL, +/* 5c07 */ NULL, +/* 5c08 */ NULL, +/* 5c09 */ NULL, +/* 5c0a */ NULL, +/* 5c0b */ NULL, +/* 5c0c */ NULL, +/* 5c0d */ NULL, +/* 5c0e */ NULL, +/* 5c0f */ NULL, +/* 5c10 */ NULL, +/* 5c11 */ NULL, +/* 5c12 */ NULL, +/* 5c13 */ NULL, +/* 5c14 */ NULL, +/* 5c15 */ NULL, +/* 5c16 */ NULL, +/* 5c17 */ NULL, +/* 5c18 */ NULL, +/* 5c19 */ NULL, +/* 5c1a */ NULL, +/* 5c1b */ NULL, +/* 5c1c */ NULL, +/* 5c1d */ NULL, +/* 5c1e */ NULL, +/* 5c1f */ NULL, +/* 5c20 */ NULL, +/* 5c21 */ NULL, +/* 5c22 */ NULL, +/* 5c23 */ NULL, +/* 5c24 */ NULL, +/* 5c25 */ NULL, +/* 5c26 */ NULL, +/* 5c27 */ NULL, +/* 5c28 */ NULL, +/* 5c29 */ NULL, +/* 5c2a */ NULL, +/* 5c2b */ NULL, +/* 5c2c */ NULL, +/* 5c2d */ NULL, +/* 5c2e */ NULL, +/* 5c2f */ NULL, +/* 5c30 */ NULL, +/* 5c31 */ NULL, +/* 5c32 */ NULL, +/* 5c33 */ NULL, +/* 5c34 */ NULL, +/* 5c35 */ NULL, +/* 5c36 */ NULL, +/* 5c37 */ NULL, +/* 5c38 */ NULL, +/* 5c39 */ NULL, +/* 5c3a */ NULL, +/* 5c3b */ NULL, +/* 5c3c */ NULL, +/* 5c3d */ NULL, +/* 5c3e */ NULL, +/* 5c3f */ NULL, +/* 5c40 */ NULL, +/* 5c41 */ NULL, +/* 5c42 */ NULL, +/* 5c43 */ NULL, +/* 5c44 */ NULL, +/* 5c45 */ NULL, +/* 5c46 */ NULL, +/* 5c47 */ NULL, +/* 5c48 */ NULL, +/* 5c49 */ NULL, +/* 5c4a */ NULL, +/* 5c4b */ NULL, +/* 5c4c */ NULL, +/* 5c4d */ NULL, +/* 5c4e */ NULL, +/* 5c4f */ NULL, +/* 5c50 */ NULL, +/* 5c51 */ NULL, +/* 5c52 */ NULL, +/* 5c53 */ NULL, +/* 5c54 */ NULL, +/* 5c55 */ NULL, +/* 5c56 */ NULL, +/* 5c57 */ NULL, +/* 5c58 */ NULL, +/* 5c59 */ NULL, +/* 5c5a */ NULL, +/* 5c5b */ NULL, +/* 5c5c */ NULL, +/* 5c5d */ NULL, +/* 5c5e */ NULL, +/* 5c5f */ NULL, +/* 5c60 */ NULL, +/* 5c61 */ NULL, +/* 5c62 */ NULL, +/* 5c63 */ NULL, +/* 5c64 */ NULL, +/* 5c65 */ NULL, +/* 5c66 */ NULL, +/* 5c67 */ NULL, +/* 5c68 */ NULL, +/* 5c69 */ NULL, +/* 5c6a */ NULL, +/* 5c6b */ NULL, +/* 5c6c */ NULL, +/* 5c6d */ NULL, +/* 5c6e */ NULL, +/* 5c6f */ NULL, +/* 5c70 */ NULL, +/* 5c71 */ NULL, +/* 5c72 */ NULL, +/* 5c73 */ NULL, +/* 5c74 */ NULL, +/* 5c75 */ NULL, +/* 5c76 */ NULL, +/* 5c77 */ NULL, +/* 5c78 */ NULL, +/* 5c79 */ NULL, +/* 5c7a */ NULL, +/* 5c7b */ NULL, +/* 5c7c */ NULL, +/* 5c7d */ NULL, +/* 5c7e */ NULL, +/* 5c7f */ NULL, +/* 5c80 */ NULL, +/* 5c81 */ NULL, +/* 5c82 */ NULL, +/* 5c83 */ NULL, +/* 5c84 */ NULL, +/* 5c85 */ NULL, +/* 5c86 */ NULL, +/* 5c87 */ NULL, +/* 5c88 */ NULL, +/* 5c89 */ NULL, +/* 5c8a */ NULL, +/* 5c8b */ NULL, +/* 5c8c */ NULL, +/* 5c8d */ NULL, +/* 5c8e */ NULL, +/* 5c8f */ NULL, +/* 5c90 */ NULL, +/* 5c91 */ NULL, +/* 5c92 */ NULL, +/* 5c93 */ NULL, +/* 5c94 */ NULL, +/* 5c95 */ NULL, +/* 5c96 */ NULL, +/* 5c97 */ NULL, +/* 5c98 */ NULL, +/* 5c99 */ NULL, +/* 5c9a */ NULL, +/* 5c9b */ NULL, +/* 5c9c */ NULL, +/* 5c9d */ NULL, +/* 5c9e */ NULL, +/* 5c9f */ NULL, +/* 5ca0 */ NULL, +/* 5ca1 */ NULL, +/* 5ca2 */ NULL, +/* 5ca3 */ NULL, +/* 5ca4 */ NULL, +/* 5ca5 */ NULL, +/* 5ca6 */ NULL, +/* 5ca7 */ NULL, +/* 5ca8 */ NULL, +/* 5ca9 */ NULL, +/* 5caa */ NULL, +/* 5cab */ NULL, +/* 5cac */ NULL, +/* 5cad */ NULL, +/* 5cae */ NULL, +/* 5caf */ NULL, +/* 5cb0 */ NULL, +/* 5cb1 */ NULL, +/* 5cb2 */ NULL, +/* 5cb3 */ NULL, +/* 5cb4 */ NULL, +/* 5cb5 */ NULL, +/* 5cb6 */ NULL, +/* 5cb7 */ NULL, +/* 5cb8 */ NULL, +/* 5cb9 */ NULL, +/* 5cba */ NULL, +/* 5cbb */ NULL, +/* 5cbc */ NULL, +/* 5cbd */ NULL, +/* 5cbe */ NULL, +/* 5cbf */ NULL, +/* 5cc0 */ NULL, +/* 5cc1 */ NULL, +/* 5cc2 */ NULL, +/* 5cc3 */ NULL, +/* 5cc4 */ NULL, +/* 5cc5 */ NULL, +/* 5cc6 */ NULL, +/* 5cc7 */ NULL, +/* 5cc8 */ NULL, +/* 5cc9 */ NULL, +/* 5cca */ NULL, +/* 5ccb */ NULL, +/* 5ccc */ NULL, +/* 5ccd */ NULL, +/* 5cce */ NULL, +/* 5ccf */ NULL, +/* 5cd0 */ NULL, +/* 5cd1 */ NULL, +/* 5cd2 */ NULL, +/* 5cd3 */ NULL, +/* 5cd4 */ NULL, +/* 5cd5 */ NULL, +/* 5cd6 */ NULL, +/* 5cd7 */ NULL, +/* 5cd8 */ NULL, +/* 5cd9 */ NULL, +/* 5cda */ NULL, +/* 5cdb */ NULL, +/* 5cdc */ NULL, +/* 5cdd */ NULL, +/* 5cde */ NULL, +/* 5cdf */ NULL, +/* 5ce0 */ NULL, +/* 5ce1 */ NULL, +/* 5ce2 */ NULL, +/* 5ce3 */ NULL, +/* 5ce4 */ NULL, +/* 5ce5 */ NULL, +/* 5ce6 */ NULL, +/* 5ce7 */ NULL, +/* 5ce8 */ NULL, +/* 5ce9 */ NULL, +/* 5cea */ NULL, +/* 5ceb */ NULL, +/* 5cec */ NULL, +/* 5ced */ NULL, +/* 5cee */ NULL, +/* 5cef */ NULL, +/* 5cf0 */ NULL, +/* 5cf1 */ NULL, +/* 5cf2 */ NULL, +/* 5cf3 */ NULL, +/* 5cf4 */ NULL, +/* 5cf5 */ NULL, +/* 5cf6 */ NULL, +/* 5cf7 */ NULL, +/* 5cf8 */ NULL, +/* 5cf9 */ NULL, +/* 5cfa */ NULL, +/* 5cfb */ NULL, +/* 5cfc */ NULL, +/* 5cfd */ NULL, +/* 5cfe */ NULL, +/* 5cff */ NULL, +/* 5d00 */ NULL, +/* 5d01 */ NULL, +/* 5d02 */ NULL, +/* 5d03 */ NULL, +/* 5d04 */ NULL, +/* 5d05 */ NULL, +/* 5d06 */ NULL, +/* 5d07 */ NULL, +/* 5d08 */ NULL, +/* 5d09 */ NULL, +/* 5d0a */ NULL, +/* 5d0b */ NULL, +/* 5d0c */ NULL, +/* 5d0d */ NULL, +/* 5d0e */ NULL, +/* 5d0f */ NULL, +/* 5d10 */ NULL, +/* 5d11 */ NULL, +/* 5d12 */ NULL, +/* 5d13 */ NULL, +/* 5d14 */ NULL, +/* 5d15 */ NULL, +/* 5d16 */ NULL, +/* 5d17 */ NULL, +/* 5d18 */ NULL, +/* 5d19 */ NULL, +/* 5d1a */ NULL, +/* 5d1b */ NULL, +/* 5d1c */ NULL, +/* 5d1d */ NULL, +/* 5d1e */ NULL, +/* 5d1f */ NULL, +/* 5d20 */ NULL, +/* 5d21 */ NULL, +/* 5d22 */ NULL, +/* 5d23 */ NULL, +/* 5d24 */ NULL, +/* 5d25 */ NULL, +/* 5d26 */ NULL, +/* 5d27 */ NULL, +/* 5d28 */ NULL, +/* 5d29 */ NULL, +/* 5d2a */ NULL, +/* 5d2b */ NULL, +/* 5d2c */ NULL, +/* 5d2d */ NULL, +/* 5d2e */ NULL, +/* 5d2f */ NULL, +/* 5d30 */ NULL, +/* 5d31 */ NULL, +/* 5d32 */ NULL, +/* 5d33 */ NULL, +/* 5d34 */ NULL, +/* 5d35 */ NULL, +/* 5d36 */ NULL, +/* 5d37 */ NULL, +/* 5d38 */ NULL, +/* 5d39 */ NULL, +/* 5d3a */ NULL, +/* 5d3b */ NULL, +/* 5d3c */ NULL, +/* 5d3d */ NULL, +/* 5d3e */ NULL, +/* 5d3f */ NULL, +/* 5d40 */ NULL, +/* 5d41 */ NULL, +/* 5d42 */ NULL, +/* 5d43 */ NULL, +/* 5d44 */ NULL, +/* 5d45 */ NULL, +/* 5d46 */ NULL, +/* 5d47 */ NULL, +/* 5d48 */ NULL, +/* 5d49 */ NULL, +/* 5d4a */ NULL, +/* 5d4b */ NULL, +/* 5d4c */ NULL, +/* 5d4d */ NULL, +/* 5d4e */ NULL, +/* 5d4f */ NULL, +/* 5d50 */ NULL, +/* 5d51 */ NULL, +/* 5d52 */ NULL, +/* 5d53 */ NULL, +/* 5d54 */ NULL, +/* 5d55 */ NULL, +/* 5d56 */ NULL, +/* 5d57 */ NULL, +/* 5d58 */ NULL, +/* 5d59 */ NULL, +/* 5d5a */ NULL, +/* 5d5b */ NULL, +/* 5d5c */ NULL, +/* 5d5d */ NULL, +/* 5d5e */ NULL, +/* 5d5f */ NULL, +/* 5d60 */ NULL, +/* 5d61 */ NULL, +/* 5d62 */ NULL, +/* 5d63 */ NULL, +/* 5d64 */ NULL, +/* 5d65 */ NULL, +/* 5d66 */ NULL, +/* 5d67 */ NULL, +/* 5d68 */ NULL, +/* 5d69 */ NULL, +/* 5d6a */ NULL, +/* 5d6b */ NULL, +/* 5d6c */ NULL, +/* 5d6d */ NULL, +/* 5d6e */ NULL, +/* 5d6f */ NULL, +/* 5d70 */ NULL, +/* 5d71 */ NULL, +/* 5d72 */ NULL, +/* 5d73 */ NULL, +/* 5d74 */ NULL, +/* 5d75 */ NULL, +/* 5d76 */ NULL, +/* 5d77 */ NULL, +/* 5d78 */ NULL, +/* 5d79 */ NULL, +/* 5d7a */ NULL, +/* 5d7b */ NULL, +/* 5d7c */ NULL, +/* 5d7d */ NULL, +/* 5d7e */ NULL, +/* 5d7f */ NULL, +/* 5d80 */ NULL, +/* 5d81 */ NULL, +/* 5d82 */ NULL, +/* 5d83 */ NULL, +/* 5d84 */ NULL, +/* 5d85 */ NULL, +/* 5d86 */ NULL, +/* 5d87 */ NULL, +/* 5d88 */ NULL, +/* 5d89 */ NULL, +/* 5d8a */ NULL, +/* 5d8b */ NULL, +/* 5d8c */ NULL, +/* 5d8d */ NULL, +/* 5d8e */ NULL, +/* 5d8f */ NULL, +/* 5d90 */ NULL, +/* 5d91 */ NULL, +/* 5d92 */ NULL, +/* 5d93 */ NULL, +/* 5d94 */ NULL, +/* 5d95 */ NULL, +/* 5d96 */ NULL, +/* 5d97 */ NULL, +/* 5d98 */ NULL, +/* 5d99 */ NULL, +/* 5d9a */ NULL, +/* 5d9b */ NULL, +/* 5d9c */ NULL, +/* 5d9d */ NULL, +/* 5d9e */ NULL, +/* 5d9f */ NULL, +/* 5da0 */ NULL, +/* 5da1 */ NULL, +/* 5da2 */ NULL, +/* 5da3 */ NULL, +/* 5da4 */ NULL, +/* 5da5 */ NULL, +/* 5da6 */ NULL, +/* 5da7 */ NULL, +/* 5da8 */ NULL, +/* 5da9 */ NULL, +/* 5daa */ NULL, +/* 5dab */ NULL, +/* 5dac */ NULL, +/* 5dad */ NULL, +/* 5dae */ NULL, +/* 5daf */ NULL, +/* 5db0 */ NULL, +/* 5db1 */ NULL, +/* 5db2 */ NULL, +/* 5db3 */ NULL, +/* 5db4 */ NULL, +/* 5db5 */ NULL, +/* 5db6 */ NULL, +/* 5db7 */ NULL, +/* 5db8 */ NULL, +/* 5db9 */ NULL, +/* 5dba */ NULL, +/* 5dbb */ NULL, +/* 5dbc */ NULL, +/* 5dbd */ NULL, +/* 5dbe */ NULL, +/* 5dbf */ NULL, +/* 5dc0 */ NULL, +/* 5dc1 */ NULL, +/* 5dc2 */ NULL, +/* 5dc3 */ NULL, +/* 5dc4 */ NULL, +/* 5dc5 */ NULL, +/* 5dc6 */ NULL, +/* 5dc7 */ NULL, +/* 5dc8 */ NULL, +/* 5dc9 */ NULL, +/* 5dca */ NULL, +/* 5dcb */ NULL, +/* 5dcc */ NULL, +/* 5dcd */ NULL, +/* 5dce */ NULL, +/* 5dcf */ NULL, +/* 5dd0 */ NULL, +/* 5dd1 */ NULL, +/* 5dd2 */ NULL, +/* 5dd3 */ NULL, +/* 5dd4 */ NULL, +/* 5dd5 */ NULL, +/* 5dd6 */ NULL, +/* 5dd7 */ NULL, +/* 5dd8 */ NULL, +/* 5dd9 */ NULL, +/* 5dda */ NULL, +/* 5ddb */ NULL, +/* 5ddc */ NULL, +/* 5ddd */ NULL, +/* 5dde */ NULL, +/* 5ddf */ NULL, +/* 5de0 */ NULL, +/* 5de1 */ NULL, +/* 5de2 */ NULL, +/* 5de3 */ NULL, +/* 5de4 */ NULL, +/* 5de5 */ NULL, +/* 5de6 */ NULL, +/* 5de7 */ NULL, +/* 5de8 */ NULL, +/* 5de9 */ NULL, +/* 5dea */ NULL, +/* 5deb */ NULL, +/* 5dec */ NULL, +/* 5ded */ NULL, +/* 5dee */ NULL, +/* 5def */ NULL, +/* 5df0 */ NULL, +/* 5df1 */ NULL, +/* 5df2 */ NULL, +/* 5df3 */ NULL, +/* 5df4 */ NULL, +/* 5df5 */ NULL, +/* 5df6 */ NULL, +/* 5df7 */ NULL, +/* 5df8 */ NULL, +/* 5df9 */ NULL, +/* 5dfa */ NULL, +/* 5dfb */ NULL, +/* 5dfc */ NULL, +/* 5dfd */ NULL, +/* 5dfe */ NULL, +/* 5dff */ NULL, +/* 5e00 */ NULL, +/* 5e01 */ NULL, +/* 5e02 */ NULL, +/* 5e03 */ NULL, +/* 5e04 */ NULL, +/* 5e05 */ NULL, +/* 5e06 */ NULL, +/* 5e07 */ NULL, +/* 5e08 */ NULL, +/* 5e09 */ NULL, +/* 5e0a */ NULL, +/* 5e0b */ NULL, +/* 5e0c */ NULL, +/* 5e0d */ NULL, +/* 5e0e */ NULL, +/* 5e0f */ NULL, +/* 5e10 */ NULL, +/* 5e11 */ NULL, +/* 5e12 */ NULL, +/* 5e13 */ NULL, +/* 5e14 */ NULL, +/* 5e15 */ NULL, +/* 5e16 */ NULL, +/* 5e17 */ NULL, +/* 5e18 */ NULL, +/* 5e19 */ NULL, +/* 5e1a */ NULL, +/* 5e1b */ NULL, +/* 5e1c */ NULL, +/* 5e1d */ NULL, +/* 5e1e */ NULL, +/* 5e1f */ NULL, +/* 5e20 */ NULL, +/* 5e21 */ NULL, +/* 5e22 */ NULL, +/* 5e23 */ NULL, +/* 5e24 */ NULL, +/* 5e25 */ NULL, +/* 5e26 */ NULL, +/* 5e27 */ NULL, +/* 5e28 */ NULL, +/* 5e29 */ NULL, +/* 5e2a */ NULL, +/* 5e2b */ NULL, +/* 5e2c */ NULL, +/* 5e2d */ NULL, +/* 5e2e */ NULL, +/* 5e2f */ NULL, +/* 5e30 */ NULL, +/* 5e31 */ NULL, +/* 5e32 */ NULL, +/* 5e33 */ NULL, +/* 5e34 */ NULL, +/* 5e35 */ NULL, +/* 5e36 */ NULL, +/* 5e37 */ NULL, +/* 5e38 */ NULL, +/* 5e39 */ NULL, +/* 5e3a */ NULL, +/* 5e3b */ NULL, +/* 5e3c */ NULL, +/* 5e3d */ NULL, +/* 5e3e */ NULL, +/* 5e3f */ NULL, +/* 5e40 */ NULL, +/* 5e41 */ NULL, +/* 5e42 */ NULL, +/* 5e43 */ NULL, +/* 5e44 */ NULL, +/* 5e45 */ NULL, +/* 5e46 */ NULL, +/* 5e47 */ NULL, +/* 5e48 */ NULL, +/* 5e49 */ NULL, +/* 5e4a */ NULL, +/* 5e4b */ NULL, +/* 5e4c */ NULL, +/* 5e4d */ NULL, +/* 5e4e */ NULL, +/* 5e4f */ NULL, +/* 5e50 */ NULL, +/* 5e51 */ NULL, +/* 5e52 */ NULL, +/* 5e53 */ NULL, +/* 5e54 */ NULL, +/* 5e55 */ NULL, +/* 5e56 */ NULL, +/* 5e57 */ NULL, +/* 5e58 */ NULL, +/* 5e59 */ NULL, +/* 5e5a */ NULL, +/* 5e5b */ NULL, +/* 5e5c */ NULL, +/* 5e5d */ NULL, +/* 5e5e */ NULL, +/* 5e5f */ NULL, +/* 5e60 */ NULL, +/* 5e61 */ NULL, +/* 5e62 */ NULL, +/* 5e63 */ NULL, +/* 5e64 */ NULL, +/* 5e65 */ NULL, +/* 5e66 */ NULL, +/* 5e67 */ NULL, +/* 5e68 */ NULL, +/* 5e69 */ NULL, +/* 5e6a */ NULL, +/* 5e6b */ NULL, +/* 5e6c */ NULL, +/* 5e6d */ NULL, +/* 5e6e */ NULL, +/* 5e6f */ NULL, +/* 5e70 */ NULL, +/* 5e71 */ NULL, +/* 5e72 */ NULL, +/* 5e73 */ NULL, +/* 5e74 */ NULL, +/* 5e75 */ NULL, +/* 5e76 */ NULL, +/* 5e77 */ NULL, +/* 5e78 */ NULL, +/* 5e79 */ NULL, +/* 5e7a */ NULL, +/* 5e7b */ NULL, +/* 5e7c */ NULL, +/* 5e7d */ NULL, +/* 5e7e */ NULL, +/* 5e7f */ NULL, +/* 5e80 */ NULL, +/* 5e81 */ NULL, +/* 5e82 */ NULL, +/* 5e83 */ NULL, +/* 5e84 */ NULL, +/* 5e85 */ NULL, +/* 5e86 */ NULL, +/* 5e87 */ NULL, +/* 5e88 */ NULL, +/* 5e89 */ NULL, +/* 5e8a */ NULL, +/* 5e8b */ NULL, +/* 5e8c */ NULL, +/* 5e8d */ NULL, +/* 5e8e */ NULL, +/* 5e8f */ NULL, +/* 5e90 */ NULL, +/* 5e91 */ NULL, +/* 5e92 */ NULL, +/* 5e93 */ NULL, +/* 5e94 */ NULL, +/* 5e95 */ NULL, +/* 5e96 */ NULL, +/* 5e97 */ NULL, +/* 5e98 */ NULL, +/* 5e99 */ NULL, +/* 5e9a */ NULL, +/* 5e9b */ NULL, +/* 5e9c */ NULL, +/* 5e9d */ NULL, +/* 5e9e */ NULL, +/* 5e9f */ NULL, +/* 5ea0 */ NULL, +/* 5ea1 */ NULL, +/* 5ea2 */ NULL, +/* 5ea3 */ NULL, +/* 5ea4 */ NULL, +/* 5ea5 */ NULL, +/* 5ea6 */ NULL, +/* 5ea7 */ NULL, +/* 5ea8 */ NULL, +/* 5ea9 */ NULL, +/* 5eaa */ NULL, +/* 5eab */ NULL, +/* 5eac */ NULL, +/* 5ead */ NULL, +/* 5eae */ NULL, +/* 5eaf */ NULL, +/* 5eb0 */ NULL, +/* 5eb1 */ NULL, +/* 5eb2 */ NULL, +/* 5eb3 */ NULL, +/* 5eb4 */ NULL, +/* 5eb5 */ NULL, +/* 5eb6 */ NULL, +/* 5eb7 */ NULL, +/* 5eb8 */ NULL, +/* 5eb9 */ NULL, +/* 5eba */ NULL, +/* 5ebb */ NULL, +/* 5ebc */ NULL, +/* 5ebd */ NULL, +/* 5ebe */ NULL, +/* 5ebf */ NULL, +/* 5ec0 */ NULL, +/* 5ec1 */ NULL, +/* 5ec2 */ NULL, +/* 5ec3 */ NULL, +/* 5ec4 */ NULL, +/* 5ec5 */ NULL, +/* 5ec6 */ NULL, +/* 5ec7 */ NULL, +/* 5ec8 */ NULL, +/* 5ec9 */ NULL, +/* 5eca */ NULL, +/* 5ecb */ NULL, +/* 5ecc */ NULL, +/* 5ecd */ NULL, +/* 5ece */ NULL, +/* 5ecf */ NULL, +/* 5ed0 */ NULL, +/* 5ed1 */ NULL, +/* 5ed2 */ NULL, +/* 5ed3 */ NULL, +/* 5ed4 */ NULL, +/* 5ed5 */ NULL, +/* 5ed6 */ NULL, +/* 5ed7 */ NULL, +/* 5ed8 */ NULL, +/* 5ed9 */ NULL, +/* 5eda */ NULL, +/* 5edb */ NULL, +/* 5edc */ NULL, +/* 5edd */ NULL, +/* 5ede */ NULL, +/* 5edf */ NULL, +/* 5ee0 */ NULL, +/* 5ee1 */ NULL, +/* 5ee2 */ NULL, +/* 5ee3 */ NULL, +/* 5ee4 */ NULL, +/* 5ee5 */ NULL, +/* 5ee6 */ NULL, +/* 5ee7 */ NULL, +/* 5ee8 */ NULL, +/* 5ee9 */ NULL, +/* 5eea */ NULL, +/* 5eeb */ NULL, +/* 5eec */ NULL, +/* 5eed */ NULL, +/* 5eee */ NULL, +/* 5eef */ NULL, +/* 5ef0 */ NULL, +/* 5ef1 */ NULL, +/* 5ef2 */ NULL, +/* 5ef3 */ NULL, +/* 5ef4 */ NULL, +/* 5ef5 */ NULL, +/* 5ef6 */ NULL, +/* 5ef7 */ NULL, +/* 5ef8 */ NULL, +/* 5ef9 */ NULL, +/* 5efa */ NULL, +/* 5efb */ NULL, +/* 5efc */ NULL, +/* 5efd */ NULL, +/* 5efe */ NULL, +/* 5eff */ NULL, +/* 5f00 */ NULL, +/* 5f01 */ NULL, +/* 5f02 */ NULL, +/* 5f03 */ NULL, +/* 5f04 */ NULL, +/* 5f05 */ NULL, +/* 5f06 */ NULL, +/* 5f07 */ NULL, +/* 5f08 */ NULL, +/* 5f09 */ NULL, +/* 5f0a */ NULL, +/* 5f0b */ NULL, +/* 5f0c */ NULL, +/* 5f0d */ NULL, +/* 5f0e */ NULL, +/* 5f0f */ NULL, +/* 5f10 */ NULL, +/* 5f11 */ NULL, +/* 5f12 */ NULL, +/* 5f13 */ NULL, +/* 5f14 */ NULL, +/* 5f15 */ NULL, +/* 5f16 */ NULL, +/* 5f17 */ NULL, +/* 5f18 */ NULL, +/* 5f19 */ NULL, +/* 5f1a */ NULL, +/* 5f1b */ NULL, +/* 5f1c */ NULL, +/* 5f1d */ NULL, +/* 5f1e */ NULL, +/* 5f1f */ NULL, +/* 5f20 */ NULL, +/* 5f21 */ NULL, +/* 5f22 */ NULL, +/* 5f23 */ NULL, +/* 5f24 */ NULL, +/* 5f25 */ NULL, +/* 5f26 */ NULL, +/* 5f27 */ NULL, +/* 5f28 */ NULL, +/* 5f29 */ NULL, +/* 5f2a */ NULL, +/* 5f2b */ NULL, +/* 5f2c */ NULL, +/* 5f2d */ NULL, +/* 5f2e */ NULL, +/* 5f2f */ NULL, +/* 5f30 */ NULL, +/* 5f31 */ NULL, +/* 5f32 */ NULL, +/* 5f33 */ NULL, +/* 5f34 */ NULL, +/* 5f35 */ NULL, +/* 5f36 */ NULL, +/* 5f37 */ NULL, +/* 5f38 */ NULL, +/* 5f39 */ NULL, +/* 5f3a */ NULL, +/* 5f3b */ NULL, +/* 5f3c */ NULL, +/* 5f3d */ NULL, +/* 5f3e */ NULL, +/* 5f3f */ NULL, +/* 5f40 */ NULL, +/* 5f41 */ NULL, +/* 5f42 */ NULL, +/* 5f43 */ NULL, +/* 5f44 */ NULL, +/* 5f45 */ NULL, +/* 5f46 */ NULL, +/* 5f47 */ NULL, +/* 5f48 */ NULL, +/* 5f49 */ NULL, +/* 5f4a */ NULL, +/* 5f4b */ NULL, +/* 5f4c */ NULL, +/* 5f4d */ NULL, +/* 5f4e */ NULL, +/* 5f4f */ NULL, +/* 5f50 */ NULL, +/* 5f51 */ NULL, +/* 5f52 */ NULL, +/* 5f53 */ NULL, +/* 5f54 */ NULL, +/* 5f55 */ NULL, +/* 5f56 */ NULL, +/* 5f57 */ NULL, +/* 5f58 */ NULL, +/* 5f59 */ NULL, +/* 5f5a */ NULL, +/* 5f5b */ NULL, +/* 5f5c */ NULL, +/* 5f5d */ NULL, +/* 5f5e */ NULL, +/* 5f5f */ NULL, +/* 5f60 */ NULL, +/* 5f61 */ NULL, +/* 5f62 */ NULL, +/* 5f63 */ NULL, +/* 5f64 */ NULL, +/* 5f65 */ NULL, +/* 5f66 */ NULL, +/* 5f67 */ NULL, +/* 5f68 */ NULL, +/* 5f69 */ NULL, +/* 5f6a */ NULL, +/* 5f6b */ NULL, +/* 5f6c */ NULL, +/* 5f6d */ NULL, +/* 5f6e */ NULL, +/* 5f6f */ NULL, +/* 5f70 */ NULL, +/* 5f71 */ NULL, +/* 5f72 */ NULL, +/* 5f73 */ NULL, +/* 5f74 */ NULL, +/* 5f75 */ NULL, +/* 5f76 */ NULL, +/* 5f77 */ NULL, +/* 5f78 */ NULL, +/* 5f79 */ NULL, +/* 5f7a */ NULL, +/* 5f7b */ NULL, +/* 5f7c */ NULL, +/* 5f7d */ NULL, +/* 5f7e */ NULL, +/* 5f7f */ NULL, +/* 5f80 */ NULL, +/* 5f81 */ NULL, +/* 5f82 */ NULL, +/* 5f83 */ NULL, +/* 5f84 */ NULL, +/* 5f85 */ NULL, +/* 5f86 */ NULL, +/* 5f87 */ NULL, +/* 5f88 */ NULL, +/* 5f89 */ NULL, +/* 5f8a */ NULL, +/* 5f8b */ NULL, +/* 5f8c */ NULL, +/* 5f8d */ NULL, +/* 5f8e */ NULL, +/* 5f8f */ NULL, +/* 5f90 */ NULL, +/* 5f91 */ NULL, +/* 5f92 */ NULL, +/* 5f93 */ NULL, +/* 5f94 */ NULL, +/* 5f95 */ NULL, +/* 5f96 */ NULL, +/* 5f97 */ NULL, +/* 5f98 */ NULL, +/* 5f99 */ NULL, +/* 5f9a */ NULL, +/* 5f9b */ NULL, +/* 5f9c */ NULL, +/* 5f9d */ NULL, +/* 5f9e */ NULL, +/* 5f9f */ NULL, +/* 5fa0 */ NULL, +/* 5fa1 */ NULL, +/* 5fa2 */ NULL, +/* 5fa3 */ NULL, +/* 5fa4 */ NULL, +/* 5fa5 */ NULL, +/* 5fa6 */ NULL, +/* 5fa7 */ NULL, +/* 5fa8 */ NULL, +/* 5fa9 */ NULL, +/* 5faa */ NULL, +/* 5fab */ NULL, +/* 5fac */ NULL, +/* 5fad */ NULL, +/* 5fae */ NULL, +/* 5faf */ NULL, +/* 5fb0 */ NULL, +/* 5fb1 */ NULL, +/* 5fb2 */ NULL, +/* 5fb3 */ NULL, +/* 5fb4 */ NULL, +/* 5fb5 */ NULL, +/* 5fb6 */ NULL, +/* 5fb7 */ NULL, +/* 5fb8 */ NULL, +/* 5fb9 */ NULL, +/* 5fba */ NULL, +/* 5fbb */ NULL, +/* 5fbc */ NULL, +/* 5fbd */ NULL, +/* 5fbe */ NULL, +/* 5fbf */ NULL, +/* 5fc0 */ NULL, +/* 5fc1 */ NULL, +/* 5fc2 */ NULL, +/* 5fc3 */ NULL, +/* 5fc4 */ NULL, +/* 5fc5 */ NULL, +/* 5fc6 */ NULL, +/* 5fc7 */ NULL, +/* 5fc8 */ NULL, +/* 5fc9 */ NULL, +/* 5fca */ NULL, +/* 5fcb */ NULL, +/* 5fcc */ NULL, +/* 5fcd */ NULL, +/* 5fce */ NULL, +/* 5fcf */ NULL, +/* 5fd0 */ NULL, +/* 5fd1 */ NULL, +/* 5fd2 */ NULL, +/* 5fd3 */ NULL, +/* 5fd4 */ NULL, +/* 5fd5 */ NULL, +/* 5fd6 */ NULL, +/* 5fd7 */ NULL, +/* 5fd8 */ NULL, +/* 5fd9 */ NULL, +/* 5fda */ NULL, +/* 5fdb */ NULL, +/* 5fdc */ NULL, +/* 5fdd */ NULL, +/* 5fde */ NULL, +/* 5fdf */ NULL, +/* 5fe0 */ NULL, +/* 5fe1 */ NULL, +/* 5fe2 */ NULL, +/* 5fe3 */ NULL, +/* 5fe4 */ NULL, +/* 5fe5 */ NULL, +/* 5fe6 */ NULL, +/* 5fe7 */ NULL, +/* 5fe8 */ NULL, +/* 5fe9 */ NULL, +/* 5fea */ NULL, +/* 5feb */ NULL, +/* 5fec */ NULL, +/* 5fed */ NULL, +/* 5fee */ NULL, +/* 5fef */ NULL, +/* 5ff0 */ NULL, +/* 5ff1 */ NULL, +/* 5ff2 */ NULL, +/* 5ff3 */ NULL, +/* 5ff4 */ NULL, +/* 5ff5 */ NULL, +/* 5ff6 */ NULL, +/* 5ff7 */ NULL, +/* 5ff8 */ NULL, +/* 5ff9 */ NULL, +/* 5ffa */ NULL, +/* 5ffb */ NULL, +/* 5ffc */ NULL, +/* 5ffd */ NULL, +/* 5ffe */ NULL, +/* 5fff */ NULL, +/* 6000 */ NULL, +/* 6001 */ NULL, +/* 6002 */ NULL, +/* 6003 */ NULL, +/* 6004 */ NULL, +/* 6005 */ NULL, +/* 6006 */ NULL, +/* 6007 */ NULL, +/* 6008 */ NULL, +/* 6009 */ NULL, +/* 600a */ NULL, +/* 600b */ NULL, +/* 600c */ NULL, +/* 600d */ NULL, +/* 600e */ NULL, +/* 600f */ NULL, +/* 6010 */ NULL, +/* 6011 */ NULL, +/* 6012 */ NULL, +/* 6013 */ NULL, +/* 6014 */ NULL, +/* 6015 */ NULL, +/* 6016 */ NULL, +/* 6017 */ NULL, +/* 6018 */ NULL, +/* 6019 */ NULL, +/* 601a */ NULL, +/* 601b */ NULL, +/* 601c */ NULL, +/* 601d */ NULL, +/* 601e */ NULL, +/* 601f */ NULL, +/* 6020 */ NULL, +/* 6021 */ NULL, +/* 6022 */ NULL, +/* 6023 */ NULL, +/* 6024 */ NULL, +/* 6025 */ NULL, +/* 6026 */ NULL, +/* 6027 */ NULL, +/* 6028 */ NULL, +/* 6029 */ NULL, +/* 602a */ NULL, +/* 602b */ NULL, +/* 602c */ NULL, +/* 602d */ NULL, +/* 602e */ NULL, +/* 602f */ NULL, +/* 6030 */ NULL, +/* 6031 */ NULL, +/* 6032 */ NULL, +/* 6033 */ NULL, +/* 6034 */ NULL, +/* 6035 */ NULL, +/* 6036 */ NULL, +/* 6037 */ NULL, +/* 6038 */ NULL, +/* 6039 */ NULL, +/* 603a */ NULL, +/* 603b */ NULL, +/* 603c */ NULL, +/* 603d */ NULL, +/* 603e */ NULL, +/* 603f */ NULL, +/* 6040 */ NULL, +/* 6041 */ NULL, +/* 6042 */ NULL, +/* 6043 */ NULL, +/* 6044 */ NULL, +/* 6045 */ NULL, +/* 6046 */ NULL, +/* 6047 */ NULL, +/* 6048 */ NULL, +/* 6049 */ NULL, +/* 604a */ NULL, +/* 604b */ NULL, +/* 604c */ NULL, +/* 604d */ NULL, +/* 604e */ NULL, +/* 604f */ NULL, +/* 6050 */ NULL, +/* 6051 */ NULL, +/* 6052 */ NULL, +/* 6053 */ NULL, +/* 6054 */ NULL, +/* 6055 */ NULL, +/* 6056 */ NULL, +/* 6057 */ NULL, +/* 6058 */ NULL, +/* 6059 */ NULL, +/* 605a */ NULL, +/* 605b */ NULL, +/* 605c */ NULL, +/* 605d */ NULL, +/* 605e */ NULL, +/* 605f */ NULL, +/* 6060 */ NULL, +/* 6061 */ NULL, +/* 6062 */ NULL, +/* 6063 */ NULL, +/* 6064 */ NULL, +/* 6065 */ NULL, +/* 6066 */ NULL, +/* 6067 */ NULL, +/* 6068 */ NULL, +/* 6069 */ NULL, +/* 606a */ NULL, +/* 606b */ NULL, +/* 606c */ NULL, +/* 606d */ NULL, +/* 606e */ NULL, +/* 606f */ NULL, +/* 6070 */ NULL, +/* 6071 */ NULL, +/* 6072 */ NULL, +/* 6073 */ NULL, +/* 6074 */ NULL, +/* 6075 */ NULL, +/* 6076 */ NULL, +/* 6077 */ NULL, +/* 6078 */ NULL, +/* 6079 */ NULL, +/* 607a */ NULL, +/* 607b */ NULL, +/* 607c */ NULL, +/* 607d */ NULL, +/* 607e */ NULL, +/* 607f */ NULL, +/* 6080 */ NULL, +/* 6081 */ NULL, +/* 6082 */ NULL, +/* 6083 */ NULL, +/* 6084 */ NULL, +/* 6085 */ NULL, +/* 6086 */ NULL, +/* 6087 */ NULL, +/* 6088 */ NULL, +/* 6089 */ NULL, +/* 608a */ NULL, +/* 608b */ NULL, +/* 608c */ NULL, +/* 608d */ NULL, +/* 608e */ NULL, +/* 608f */ NULL, +/* 6090 */ NULL, +/* 6091 */ NULL, +/* 6092 */ NULL, +/* 6093 */ NULL, +/* 6094 */ NULL, +/* 6095 */ NULL, +/* 6096 */ NULL, +/* 6097 */ NULL, +/* 6098 */ NULL, +/* 6099 */ NULL, +/* 609a */ NULL, +/* 609b */ NULL, +/* 609c */ NULL, +/* 609d */ NULL, +/* 609e */ NULL, +/* 609f */ NULL, +/* 60a0 */ NULL, +/* 60a1 */ NULL, +/* 60a2 */ NULL, +/* 60a3 */ NULL, +/* 60a4 */ NULL, +/* 60a5 */ NULL, +/* 60a6 */ NULL, +/* 60a7 */ NULL, +/* 60a8 */ NULL, +/* 60a9 */ NULL, +/* 60aa */ NULL, +/* 60ab */ NULL, +/* 60ac */ NULL, +/* 60ad */ NULL, +/* 60ae */ NULL, +/* 60af */ NULL, +/* 60b0 */ NULL, +/* 60b1 */ NULL, +/* 60b2 */ NULL, +/* 60b3 */ NULL, +/* 60b4 */ NULL, +/* 60b5 */ NULL, +/* 60b6 */ NULL, +/* 60b7 */ NULL, +/* 60b8 */ NULL, +/* 60b9 */ NULL, +/* 60ba */ NULL, +/* 60bb */ NULL, +/* 60bc */ NULL, +/* 60bd */ NULL, +/* 60be */ NULL, +/* 60bf */ NULL, +/* 60c0 */ NULL, +/* 60c1 */ NULL, +/* 60c2 */ NULL, +/* 60c3 */ NULL, +/* 60c4 */ NULL, +/* 60c5 */ NULL, +/* 60c6 */ NULL, +/* 60c7 */ NULL, +/* 60c8 */ NULL, +/* 60c9 */ NULL, +/* 60ca */ NULL, +/* 60cb */ NULL, +/* 60cc */ NULL, +/* 60cd */ NULL, +/* 60ce */ NULL, +/* 60cf */ NULL, +/* 60d0 */ NULL, +/* 60d1 */ NULL, +/* 60d2 */ NULL, +/* 60d3 */ NULL, +/* 60d4 */ NULL, +/* 60d5 */ NULL, +/* 60d6 */ NULL, +/* 60d7 */ NULL, +/* 60d8 */ NULL, +/* 60d9 */ NULL, +/* 60da */ NULL, +/* 60db */ NULL, +/* 60dc */ NULL, +/* 60dd */ NULL, +/* 60de */ NULL, +/* 60df */ NULL, +/* 60e0 */ NULL, +/* 60e1 */ NULL, +/* 60e2 */ NULL, +/* 60e3 */ NULL, +/* 60e4 */ NULL, +/* 60e5 */ NULL, +/* 60e6 */ NULL, +/* 60e7 */ NULL, +/* 60e8 */ NULL, +/* 60e9 */ NULL, +/* 60ea */ NULL, +/* 60eb */ NULL, +/* 60ec */ NULL, +/* 60ed */ NULL, +/* 60ee */ NULL, +/* 60ef */ NULL, +/* 60f0 */ NULL, +/* 60f1 */ NULL, +/* 60f2 */ NULL, +/* 60f3 */ NULL, +/* 60f4 */ NULL, +/* 60f5 */ NULL, +/* 60f6 */ NULL, +/* 60f7 */ NULL, +/* 60f8 */ NULL, +/* 60f9 */ NULL, +/* 60fa */ NULL, +/* 60fb */ NULL, +/* 60fc */ NULL, +/* 60fd */ NULL, +/* 60fe */ NULL, +/* 60ff */ NULL, +/* 6100 */ NULL, +/* 6101 */ NULL, +/* 6102 */ NULL, +/* 6103 */ NULL, +/* 6104 */ NULL, +/* 6105 */ NULL, +/* 6106 */ NULL, +/* 6107 */ NULL, +/* 6108 */ NULL, +/* 6109 */ NULL, +/* 610a */ NULL, +/* 610b */ NULL, +/* 610c */ NULL, +/* 610d */ NULL, +/* 610e */ NULL, +/* 610f */ NULL, +/* 6110 */ NULL, +/* 6111 */ NULL, +/* 6112 */ NULL, +/* 6113 */ NULL, +/* 6114 */ NULL, +/* 6115 */ NULL, +/* 6116 */ NULL, +/* 6117 */ NULL, +/* 6118 */ NULL, +/* 6119 */ NULL, +/* 611a */ NULL, +/* 611b */ NULL, +/* 611c */ NULL, +/* 611d */ NULL, +/* 611e */ NULL, +/* 611f */ NULL, +/* 6120 */ NULL, +/* 6121 */ NULL, +/* 6122 */ NULL, +/* 6123 */ NULL, +/* 6124 */ NULL, +/* 6125 */ NULL, +/* 6126 */ NULL, +/* 6127 */ NULL, +/* 6128 */ NULL, +/* 6129 */ NULL, +/* 612a */ NULL, +/* 612b */ NULL, +/* 612c */ NULL, +/* 612d */ NULL, +/* 612e */ NULL, +/* 612f */ NULL, +/* 6130 */ NULL, +/* 6131 */ NULL, +/* 6132 */ NULL, +/* 6133 */ NULL, +/* 6134 */ NULL, +/* 6135 */ NULL, +/* 6136 */ NULL, +/* 6137 */ NULL, +/* 6138 */ NULL, +/* 6139 */ NULL, +/* 613a */ NULL, +/* 613b */ NULL, +/* 613c */ NULL, +/* 613d */ NULL, +/* 613e */ NULL, +/* 613f */ NULL, +/* 6140 */ NULL, +/* 6141 */ NULL, +/* 6142 */ NULL, +/* 6143 */ NULL, +/* 6144 */ NULL, +/* 6145 */ NULL, +/* 6146 */ NULL, +/* 6147 */ NULL, +/* 6148 */ NULL, +/* 6149 */ NULL, +/* 614a */ NULL, +/* 614b */ NULL, +/* 614c */ NULL, +/* 614d */ NULL, +/* 614e */ NULL, +/* 614f */ NULL, +/* 6150 */ NULL, +/* 6151 */ NULL, +/* 6152 */ NULL, +/* 6153 */ NULL, +/* 6154 */ NULL, +/* 6155 */ NULL, +/* 6156 */ NULL, +/* 6157 */ NULL, +/* 6158 */ NULL, +/* 6159 */ NULL, +/* 615a */ NULL, +/* 615b */ NULL, +/* 615c */ NULL, +/* 615d */ NULL, +/* 615e */ NULL, +/* 615f */ NULL, +/* 6160 */ NULL, +/* 6161 */ NULL, +/* 6162 */ NULL, +/* 6163 */ NULL, +/* 6164 */ NULL, +/* 6165 */ NULL, +/* 6166 */ NULL, +/* 6167 */ NULL, +/* 6168 */ NULL, +/* 6169 */ NULL, +/* 616a */ NULL, +/* 616b */ NULL, +/* 616c */ NULL, +/* 616d */ NULL, +/* 616e */ NULL, +/* 616f */ NULL, +/* 6170 */ NULL, +/* 6171 */ NULL, +/* 6172 */ NULL, +/* 6173 */ NULL, +/* 6174 */ NULL, +/* 6175 */ NULL, +/* 6176 */ NULL, +/* 6177 */ NULL, +/* 6178 */ NULL, +/* 6179 */ NULL, +/* 617a */ NULL, +/* 617b */ NULL, +/* 617c */ NULL, +/* 617d */ NULL, +/* 617e */ NULL, +/* 617f */ NULL, +/* 6180 */ NULL, +/* 6181 */ NULL, +/* 6182 */ NULL, +/* 6183 */ NULL, +/* 6184 */ NULL, +/* 6185 */ NULL, +/* 6186 */ NULL, +/* 6187 */ NULL, +/* 6188 */ NULL, +/* 6189 */ NULL, +/* 618a */ NULL, +/* 618b */ NULL, +/* 618c */ NULL, +/* 618d */ NULL, +/* 618e */ NULL, +/* 618f */ NULL, +/* 6190 */ NULL, +/* 6191 */ NULL, +/* 6192 */ NULL, +/* 6193 */ NULL, +/* 6194 */ NULL, +/* 6195 */ NULL, +/* 6196 */ NULL, +/* 6197 */ NULL, +/* 6198 */ NULL, +/* 6199 */ NULL, +/* 619a */ NULL, +/* 619b */ NULL, +/* 619c */ NULL, +/* 619d */ NULL, +/* 619e */ NULL, +/* 619f */ NULL, +/* 61a0 */ NULL, +/* 61a1 */ NULL, +/* 61a2 */ NULL, +/* 61a3 */ NULL, +/* 61a4 */ NULL, +/* 61a5 */ NULL, +/* 61a6 */ NULL, +/* 61a7 */ NULL, +/* 61a8 */ NULL, +/* 61a9 */ NULL, +/* 61aa */ NULL, +/* 61ab */ NULL, +/* 61ac */ NULL, +/* 61ad */ NULL, +/* 61ae */ NULL, +/* 61af */ NULL, +/* 61b0 */ NULL, +/* 61b1 */ NULL, +/* 61b2 */ NULL, +/* 61b3 */ NULL, +/* 61b4 */ NULL, +/* 61b5 */ NULL, +/* 61b6 */ NULL, +/* 61b7 */ NULL, +/* 61b8 */ NULL, +/* 61b9 */ NULL, +/* 61ba */ NULL, +/* 61bb */ NULL, +/* 61bc */ NULL, +/* 61bd */ NULL, +/* 61be */ NULL, +/* 61bf */ NULL, +/* 61c0 */ NULL, +/* 61c1 */ NULL, +/* 61c2 */ NULL, +/* 61c3 */ NULL, +/* 61c4 */ NULL, +/* 61c5 */ NULL, +/* 61c6 */ NULL, +/* 61c7 */ NULL, +/* 61c8 */ NULL, +/* 61c9 */ NULL, +/* 61ca */ NULL, +/* 61cb */ NULL, +/* 61cc */ NULL, +/* 61cd */ NULL, +/* 61ce */ NULL, +/* 61cf */ NULL, +/* 61d0 */ NULL, +/* 61d1 */ NULL, +/* 61d2 */ NULL, +/* 61d3 */ NULL, +/* 61d4 */ NULL, +/* 61d5 */ NULL, +/* 61d6 */ NULL, +/* 61d7 */ NULL, +/* 61d8 */ NULL, +/* 61d9 */ NULL, +/* 61da */ NULL, +/* 61db */ NULL, +/* 61dc */ NULL, +/* 61dd */ NULL, +/* 61de */ NULL, +/* 61df */ NULL, +/* 61e0 */ NULL, +/* 61e1 */ NULL, +/* 61e2 */ NULL, +/* 61e3 */ NULL, +/* 61e4 */ NULL, +/* 61e5 */ NULL, +/* 61e6 */ NULL, +/* 61e7 */ NULL, +/* 61e8 */ NULL, +/* 61e9 */ NULL, +/* 61ea */ NULL, +/* 61eb */ NULL, +/* 61ec */ NULL, +/* 61ed */ NULL, +/* 61ee */ NULL, +/* 61ef */ NULL, +/* 61f0 */ NULL, +/* 61f1 */ NULL, +/* 61f2 */ NULL, +/* 61f3 */ NULL, +/* 61f4 */ NULL, +/* 61f5 */ NULL, +/* 61f6 */ NULL, +/* 61f7 */ NULL, +/* 61f8 */ NULL, +/* 61f9 */ NULL, +/* 61fa */ NULL, +/* 61fb */ NULL, +/* 61fc */ NULL, +/* 61fd */ NULL, +/* 61fe */ NULL, +/* 61ff */ NULL, +/* 6200 */ NULL, +/* 6201 */ NULL, +/* 6202 */ NULL, +/* 6203 */ NULL, +/* 6204 */ NULL, +/* 6205 */ NULL, +/* 6206 */ NULL, +/* 6207 */ NULL, +/* 6208 */ NULL, +/* 6209 */ NULL, +/* 620a */ NULL, +/* 620b */ NULL, +/* 620c */ NULL, +/* 620d */ NULL, +/* 620e */ NULL, +/* 620f */ NULL, +/* 6210 */ NULL, +/* 6211 */ NULL, +/* 6212 */ NULL, +/* 6213 */ NULL, +/* 6214 */ NULL, +/* 6215 */ NULL, +/* 6216 */ NULL, +/* 6217 */ NULL, +/* 6218 */ NULL, +/* 6219 */ NULL, +/* 621a */ NULL, +/* 621b */ NULL, +/* 621c */ NULL, +/* 621d */ NULL, +/* 621e */ NULL, +/* 621f */ NULL, +/* 6220 */ NULL, +/* 6221 */ NULL, +/* 6222 */ NULL, +/* 6223 */ NULL, +/* 6224 */ NULL, +/* 6225 */ NULL, +/* 6226 */ NULL, +/* 6227 */ NULL, +/* 6228 */ NULL, +/* 6229 */ NULL, +/* 622a */ NULL, +/* 622b */ NULL, +/* 622c */ NULL, +/* 622d */ NULL, +/* 622e */ NULL, +/* 622f */ NULL, +/* 6230 */ NULL, +/* 6231 */ NULL, +/* 6232 */ NULL, +/* 6233 */ NULL, +/* 6234 */ NULL, +/* 6235 */ NULL, +/* 6236 */ NULL, +/* 6237 */ NULL, +/* 6238 */ NULL, +/* 6239 */ NULL, +/* 623a */ NULL, +/* 623b */ NULL, +/* 623c */ NULL, +/* 623d */ NULL, +/* 623e */ NULL, +/* 623f */ NULL, +/* 6240 */ NULL, +/* 6241 */ NULL, +/* 6242 */ NULL, +/* 6243 */ NULL, +/* 6244 */ NULL, +/* 6245 */ NULL, +/* 6246 */ NULL, +/* 6247 */ NULL, +/* 6248 */ NULL, +/* 6249 */ NULL, +/* 624a */ NULL, +/* 624b */ NULL, +/* 624c */ NULL, +/* 624d */ NULL, +/* 624e */ NULL, +/* 624f */ NULL, +/* 6250 */ NULL, +/* 6251 */ NULL, +/* 6252 */ NULL, +/* 6253 */ NULL, +/* 6254 */ NULL, +/* 6255 */ NULL, +/* 6256 */ NULL, +/* 6257 */ NULL, +/* 6258 */ NULL, +/* 6259 */ NULL, +/* 625a */ NULL, +/* 625b */ NULL, +/* 625c */ NULL, +/* 625d */ NULL, +/* 625e */ NULL, +/* 625f */ NULL, +/* 6260 */ NULL, +/* 6261 */ NULL, +/* 6262 */ NULL, +/* 6263 */ NULL, +/* 6264 */ NULL, +/* 6265 */ NULL, +/* 6266 */ NULL, +/* 6267 */ NULL, +/* 6268 */ NULL, +/* 6269 */ NULL, +/* 626a */ NULL, +/* 626b */ NULL, +/* 626c */ NULL, +/* 626d */ NULL, +/* 626e */ NULL, +/* 626f */ NULL, +/* 6270 */ NULL, +/* 6271 */ NULL, +/* 6272 */ NULL, +/* 6273 */ NULL, +/* 6274 */ NULL, +/* 6275 */ NULL, +/* 6276 */ NULL, +/* 6277 */ NULL, +/* 6278 */ NULL, +/* 6279 */ NULL, +/* 627a */ NULL, +/* 627b */ NULL, +/* 627c */ NULL, +/* 627d */ NULL, +/* 627e */ NULL, +/* 627f */ NULL, +/* 6280 */ NULL, +/* 6281 */ NULL, +/* 6282 */ NULL, +/* 6283 */ NULL, +/* 6284 */ NULL, +/* 6285 */ NULL, +/* 6286 */ NULL, +/* 6287 */ NULL, +/* 6288 */ NULL, +/* 6289 */ NULL, +/* 628a */ NULL, +/* 628b */ NULL, +/* 628c */ NULL, +/* 628d */ NULL, +/* 628e */ NULL, +/* 628f */ NULL, +/* 6290 */ NULL, +/* 6291 */ NULL, +/* 6292 */ NULL, +/* 6293 */ NULL, +/* 6294 */ NULL, +/* 6295 */ NULL, +/* 6296 */ NULL, +/* 6297 */ NULL, +/* 6298 */ NULL, +/* 6299 */ NULL, +/* 629a */ NULL, +/* 629b */ NULL, +/* 629c */ NULL, +/* 629d */ NULL, +/* 629e */ NULL, +/* 629f */ NULL, +/* 62a0 */ NULL, +/* 62a1 */ NULL, +/* 62a2 */ NULL, +/* 62a3 */ NULL, +/* 62a4 */ NULL, +/* 62a5 */ NULL, +/* 62a6 */ NULL, +/* 62a7 */ NULL, +/* 62a8 */ NULL, +/* 62a9 */ NULL, +/* 62aa */ NULL, +/* 62ab */ NULL, +/* 62ac */ NULL, +/* 62ad */ NULL, +/* 62ae */ NULL, +/* 62af */ NULL, +/* 62b0 */ NULL, +/* 62b1 */ NULL, +/* 62b2 */ NULL, +/* 62b3 */ NULL, +/* 62b4 */ NULL, +/* 62b5 */ NULL, +/* 62b6 */ NULL, +/* 62b7 */ NULL, +/* 62b8 */ NULL, +/* 62b9 */ NULL, +/* 62ba */ NULL, +/* 62bb */ NULL, +/* 62bc */ NULL, +/* 62bd */ NULL, +/* 62be */ NULL, +/* 62bf */ NULL, +/* 62c0 */ NULL, +/* 62c1 */ NULL, +/* 62c2 */ NULL, +/* 62c3 */ NULL, +/* 62c4 */ NULL, +/* 62c5 */ NULL, +/* 62c6 */ NULL, +/* 62c7 */ NULL, +/* 62c8 */ NULL, +/* 62c9 */ NULL, +/* 62ca */ NULL, +/* 62cb */ NULL, +/* 62cc */ NULL, +/* 62cd */ NULL, +/* 62ce */ NULL, +/* 62cf */ NULL, +/* 62d0 */ NULL, +/* 62d1 */ NULL, +/* 62d2 */ NULL, +/* 62d3 */ NULL, +/* 62d4 */ NULL, +/* 62d5 */ NULL, +/* 62d6 */ NULL, +/* 62d7 */ NULL, +/* 62d8 */ NULL, +/* 62d9 */ NULL, +/* 62da */ NULL, +/* 62db */ NULL, +/* 62dc */ NULL, +/* 62dd */ NULL, +/* 62de */ NULL, +/* 62df */ NULL, +/* 62e0 */ NULL, +/* 62e1 */ NULL, +/* 62e2 */ NULL, +/* 62e3 */ NULL, +/* 62e4 */ NULL, +/* 62e5 */ NULL, +/* 62e6 */ NULL, +/* 62e7 */ NULL, +/* 62e8 */ NULL, +/* 62e9 */ NULL, +/* 62ea */ NULL, +/* 62eb */ NULL, +/* 62ec */ NULL, +/* 62ed */ NULL, +/* 62ee */ NULL, +/* 62ef */ NULL, +/* 62f0 */ NULL, +/* 62f1 */ NULL, +/* 62f2 */ NULL, +/* 62f3 */ NULL, +/* 62f4 */ NULL, +/* 62f5 */ NULL, +/* 62f6 */ NULL, +/* 62f7 */ NULL, +/* 62f8 */ NULL, +/* 62f9 */ NULL, +/* 62fa */ NULL, +/* 62fb */ NULL, +/* 62fc */ NULL, +/* 62fd */ NULL, +/* 62fe */ NULL, +/* 62ff */ NULL, +/* 6300 */ NULL, +/* 6301 */ NULL, +/* 6302 */ NULL, +/* 6303 */ NULL, +/* 6304 */ NULL, +/* 6305 */ NULL, +/* 6306 */ NULL, +/* 6307 */ NULL, +/* 6308 */ NULL, +/* 6309 */ NULL, +/* 630a */ NULL, +/* 630b */ NULL, +/* 630c */ NULL, +/* 630d */ NULL, +/* 630e */ NULL, +/* 630f */ NULL, +/* 6310 */ NULL, +/* 6311 */ NULL, +/* 6312 */ NULL, +/* 6313 */ NULL, +/* 6314 */ NULL, +/* 6315 */ NULL, +/* 6316 */ NULL, +/* 6317 */ NULL, +/* 6318 */ NULL, +/* 6319 */ NULL, +/* 631a */ NULL, +/* 631b */ NULL, +/* 631c */ NULL, +/* 631d */ NULL, +/* 631e */ NULL, +/* 631f */ NULL, +/* 6320 */ NULL, +/* 6321 */ NULL, +/* 6322 */ NULL, +/* 6323 */ NULL, +/* 6324 */ NULL, +/* 6325 */ NULL, +/* 6326 */ NULL, +/* 6327 */ NULL, +/* 6328 */ NULL, +/* 6329 */ NULL, +/* 632a */ NULL, +/* 632b */ NULL, +/* 632c */ NULL, +/* 632d */ NULL, +/* 632e */ NULL, +/* 632f */ NULL, +/* 6330 */ NULL, +/* 6331 */ NULL, +/* 6332 */ NULL, +/* 6333 */ NULL, +/* 6334 */ NULL, +/* 6335 */ NULL, +/* 6336 */ NULL, +/* 6337 */ NULL, +/* 6338 */ NULL, +/* 6339 */ NULL, +/* 633a */ NULL, +/* 633b */ NULL, +/* 633c */ NULL, +/* 633d */ NULL, +/* 633e */ NULL, +/* 633f */ NULL, +/* 6340 */ NULL, +/* 6341 */ NULL, +/* 6342 */ NULL, +/* 6343 */ NULL, +/* 6344 */ NULL, +/* 6345 */ NULL, +/* 6346 */ NULL, +/* 6347 */ NULL, +/* 6348 */ NULL, +/* 6349 */ NULL, +/* 634a */ NULL, +/* 634b */ NULL, +/* 634c */ NULL, +/* 634d */ NULL, +/* 634e */ NULL, +/* 634f */ NULL, +/* 6350 */ NULL, +/* 6351 */ NULL, +/* 6352 */ NULL, +/* 6353 */ NULL, +/* 6354 */ NULL, +/* 6355 */ NULL, +/* 6356 */ NULL, +/* 6357 */ NULL, +/* 6358 */ NULL, +/* 6359 */ NULL, +/* 635a */ NULL, +/* 635b */ NULL, +/* 635c */ NULL, +/* 635d */ NULL, +/* 635e */ NULL, +/* 635f */ NULL, +/* 6360 */ NULL, +/* 6361 */ NULL, +/* 6362 */ NULL, +/* 6363 */ NULL, +/* 6364 */ NULL, +/* 6365 */ NULL, +/* 6366 */ NULL, +/* 6367 */ NULL, +/* 6368 */ NULL, +/* 6369 */ NULL, +/* 636a */ NULL, +/* 636b */ NULL, +/* 636c */ NULL, +/* 636d */ NULL, +/* 636e */ NULL, +/* 636f */ NULL, +/* 6370 */ NULL, +/* 6371 */ NULL, +/* 6372 */ NULL, +/* 6373 */ NULL, +/* 6374 */ NULL, +/* 6375 */ NULL, +/* 6376 */ NULL, +/* 6377 */ NULL, +/* 6378 */ NULL, +/* 6379 */ NULL, +/* 637a */ NULL, +/* 637b */ NULL, +/* 637c */ NULL, +/* 637d */ NULL, +/* 637e */ NULL, +/* 637f */ NULL, +/* 6380 */ NULL, +/* 6381 */ NULL, +/* 6382 */ NULL, +/* 6383 */ NULL, +/* 6384 */ NULL, +/* 6385 */ NULL, +/* 6386 */ NULL, +/* 6387 */ NULL, +/* 6388 */ NULL, +/* 6389 */ NULL, +/* 638a */ NULL, +/* 638b */ NULL, +/* 638c */ NULL, +/* 638d */ NULL, +/* 638e */ NULL, +/* 638f */ NULL, +/* 6390 */ NULL, +/* 6391 */ NULL, +/* 6392 */ NULL, +/* 6393 */ NULL, +/* 6394 */ NULL, +/* 6395 */ NULL, +/* 6396 */ NULL, +/* 6397 */ NULL, +/* 6398 */ NULL, +/* 6399 */ NULL, +/* 639a */ NULL, +/* 639b */ NULL, +/* 639c */ NULL, +/* 639d */ NULL, +/* 639e */ NULL, +/* 639f */ NULL, +/* 63a0 */ NULL, +/* 63a1 */ NULL, +/* 63a2 */ NULL, +/* 63a3 */ NULL, +/* 63a4 */ NULL, +/* 63a5 */ NULL, +/* 63a6 */ NULL, +/* 63a7 */ NULL, +/* 63a8 */ NULL, +/* 63a9 */ NULL, +/* 63aa */ NULL, +/* 63ab */ NULL, +/* 63ac */ NULL, +/* 63ad */ NULL, +/* 63ae */ NULL, +/* 63af */ NULL, +/* 63b0 */ NULL, +/* 63b1 */ NULL, +/* 63b2 */ NULL, +/* 63b3 */ NULL, +/* 63b4 */ NULL, +/* 63b5 */ NULL, +/* 63b6 */ NULL, +/* 63b7 */ NULL, +/* 63b8 */ NULL, +/* 63b9 */ NULL, +/* 63ba */ NULL, +/* 63bb */ NULL, +/* 63bc */ NULL, +/* 63bd */ NULL, +/* 63be */ NULL, +/* 63bf */ NULL, +/* 63c0 */ NULL, +/* 63c1 */ NULL, +/* 63c2 */ NULL, +/* 63c3 */ NULL, +/* 63c4 */ NULL, +/* 63c5 */ NULL, +/* 63c6 */ NULL, +/* 63c7 */ NULL, +/* 63c8 */ NULL, +/* 63c9 */ NULL, +/* 63ca */ NULL, +/* 63cb */ NULL, +/* 63cc */ NULL, +/* 63cd */ NULL, +/* 63ce */ NULL, +/* 63cf */ NULL, +/* 63d0 */ NULL, +/* 63d1 */ NULL, +/* 63d2 */ NULL, +/* 63d3 */ NULL, +/* 63d4 */ NULL, +/* 63d5 */ NULL, +/* 63d6 */ NULL, +/* 63d7 */ NULL, +/* 63d8 */ NULL, +/* 63d9 */ NULL, +/* 63da */ NULL, +/* 63db */ NULL, +/* 63dc */ NULL, +/* 63dd */ NULL, +/* 63de */ NULL, +/* 63df */ NULL, +/* 63e0 */ NULL, +/* 63e1 */ NULL, +/* 63e2 */ NULL, +/* 63e3 */ NULL, +/* 63e4 */ NULL, +/* 63e5 */ NULL, +/* 63e6 */ NULL, +/* 63e7 */ NULL, +/* 63e8 */ NULL, +/* 63e9 */ NULL, +/* 63ea */ NULL, +/* 63eb */ NULL, +/* 63ec */ NULL, +/* 63ed */ NULL, +/* 63ee */ NULL, +/* 63ef */ NULL, +/* 63f0 */ NULL, +/* 63f1 */ NULL, +/* 63f2 */ NULL, +/* 63f3 */ NULL, +/* 63f4 */ NULL, +/* 63f5 */ NULL, +/* 63f6 */ NULL, +/* 63f7 */ NULL, +/* 63f8 */ NULL, +/* 63f9 */ NULL, +/* 63fa */ NULL, +/* 63fb */ NULL, +/* 63fc */ NULL, +/* 63fd */ NULL, +/* 63fe */ NULL, +/* 63ff */ NULL, +/* 6400 */ NULL, +/* 6401 */ NULL, +/* 6402 */ NULL, +/* 6403 */ NULL, +/* 6404 */ NULL, +/* 6405 */ NULL, +/* 6406 */ NULL, +/* 6407 */ NULL, +/* 6408 */ NULL, +/* 6409 */ NULL, +/* 640a */ NULL, +/* 640b */ NULL, +/* 640c */ NULL, +/* 640d */ NULL, +/* 640e */ NULL, +/* 640f */ NULL, +/* 6410 */ NULL, +/* 6411 */ NULL, +/* 6412 */ NULL, +/* 6413 */ NULL, +/* 6414 */ NULL, +/* 6415 */ NULL, +/* 6416 */ NULL, +/* 6417 */ NULL, +/* 6418 */ NULL, +/* 6419 */ NULL, +/* 641a */ NULL, +/* 641b */ NULL, +/* 641c */ NULL, +/* 641d */ NULL, +/* 641e */ NULL, +/* 641f */ NULL, +/* 6420 */ NULL, +/* 6421 */ NULL, +/* 6422 */ NULL, +/* 6423 */ NULL, +/* 6424 */ NULL, +/* 6425 */ NULL, +/* 6426 */ NULL, +/* 6427 */ NULL, +/* 6428 */ NULL, +/* 6429 */ NULL, +/* 642a */ NULL, +/* 642b */ NULL, +/* 642c */ NULL, +/* 642d */ NULL, +/* 642e */ NULL, +/* 642f */ NULL, +/* 6430 */ NULL, +/* 6431 */ NULL, +/* 6432 */ NULL, +/* 6433 */ NULL, +/* 6434 */ NULL, +/* 6435 */ NULL, +/* 6436 */ NULL, +/* 6437 */ NULL, +/* 6438 */ NULL, +/* 6439 */ NULL, +/* 643a */ NULL, +/* 643b */ NULL, +/* 643c */ NULL, +/* 643d */ NULL, +/* 643e */ NULL, +/* 643f */ NULL, +/* 6440 */ NULL, +/* 6441 */ NULL, +/* 6442 */ NULL, +/* 6443 */ NULL, +/* 6444 */ NULL, +/* 6445 */ NULL, +/* 6446 */ NULL, +/* 6447 */ NULL, +/* 6448 */ NULL, +/* 6449 */ NULL, +/* 644a */ NULL, +/* 644b */ NULL, +/* 644c */ NULL, +/* 644d */ NULL, +/* 644e */ NULL, +/* 644f */ NULL, +/* 6450 */ NULL, +/* 6451 */ NULL, +/* 6452 */ NULL, +/* 6453 */ NULL, +/* 6454 */ NULL, +/* 6455 */ NULL, +/* 6456 */ NULL, +/* 6457 */ NULL, +/* 6458 */ NULL, +/* 6459 */ NULL, +/* 645a */ NULL, +/* 645b */ NULL, +/* 645c */ NULL, +/* 645d */ NULL, +/* 645e */ NULL, +/* 645f */ NULL, +/* 6460 */ NULL, +/* 6461 */ NULL, +/* 6462 */ NULL, +/* 6463 */ NULL, +/* 6464 */ NULL, +/* 6465 */ NULL, +/* 6466 */ NULL, +/* 6467 */ NULL, +/* 6468 */ NULL, +/* 6469 */ NULL, +/* 646a */ NULL, +/* 646b */ NULL, +/* 646c */ NULL, +/* 646d */ NULL, +/* 646e */ NULL, +/* 646f */ NULL, +/* 6470 */ NULL, +/* 6471 */ NULL, +/* 6472 */ NULL, +/* 6473 */ NULL, +/* 6474 */ NULL, +/* 6475 */ NULL, +/* 6476 */ NULL, +/* 6477 */ NULL, +/* 6478 */ NULL, +/* 6479 */ NULL, +/* 647a */ NULL, +/* 647b */ NULL, +/* 647c */ NULL, +/* 647d */ NULL, +/* 647e */ NULL, +/* 647f */ NULL, +/* 6480 */ NULL, +/* 6481 */ NULL, +/* 6482 */ NULL, +/* 6483 */ NULL, +/* 6484 */ NULL, +/* 6485 */ NULL, +/* 6486 */ NULL, +/* 6487 */ NULL, +/* 6488 */ NULL, +/* 6489 */ NULL, +/* 648a */ NULL, +/* 648b */ NULL, +/* 648c */ NULL, +/* 648d */ NULL, +/* 648e */ NULL, +/* 648f */ NULL, +/* 6490 */ NULL, +/* 6491 */ NULL, +/* 6492 */ NULL, +/* 6493 */ NULL, +/* 6494 */ NULL, +/* 6495 */ NULL, +/* 6496 */ NULL, +/* 6497 */ NULL, +/* 6498 */ NULL, +/* 6499 */ NULL, +/* 649a */ NULL, +/* 649b */ NULL, +/* 649c */ NULL, +/* 649d */ NULL, +/* 649e */ NULL, +/* 649f */ NULL, +/* 64a0 */ NULL, +/* 64a1 */ NULL, +/* 64a2 */ NULL, +/* 64a3 */ NULL, +/* 64a4 */ NULL, +/* 64a5 */ NULL, +/* 64a6 */ NULL, +/* 64a7 */ NULL, +/* 64a8 */ NULL, +/* 64a9 */ NULL, +/* 64aa */ NULL, +/* 64ab */ NULL, +/* 64ac */ NULL, +/* 64ad */ NULL, +/* 64ae */ NULL, +/* 64af */ NULL, +/* 64b0 */ NULL, +/* 64b1 */ NULL, +/* 64b2 */ NULL, +/* 64b3 */ NULL, +/* 64b4 */ NULL, +/* 64b5 */ NULL, +/* 64b6 */ NULL, +/* 64b7 */ NULL, +/* 64b8 */ NULL, +/* 64b9 */ NULL, +/* 64ba */ NULL, +/* 64bb */ NULL, +/* 64bc */ NULL, +/* 64bd */ NULL, +/* 64be */ NULL, +/* 64bf */ NULL, +/* 64c0 */ NULL, +/* 64c1 */ NULL, +/* 64c2 */ NULL, +/* 64c3 */ NULL, +/* 64c4 */ NULL, +/* 64c5 */ NULL, +/* 64c6 */ NULL, +/* 64c7 */ NULL, +/* 64c8 */ NULL, +/* 64c9 */ NULL, +/* 64ca */ NULL, +/* 64cb */ NULL, +/* 64cc */ NULL, +/* 64cd */ NULL, +/* 64ce */ NULL, +/* 64cf */ NULL, +/* 64d0 */ NULL, +/* 64d1 */ NULL, +/* 64d2 */ NULL, +/* 64d3 */ NULL, +/* 64d4 */ NULL, +/* 64d5 */ NULL, +/* 64d6 */ NULL, +/* 64d7 */ NULL, +/* 64d8 */ NULL, +/* 64d9 */ NULL, +/* 64da */ NULL, +/* 64db */ NULL, +/* 64dc */ NULL, +/* 64dd */ NULL, +/* 64de */ NULL, +/* 64df */ NULL, +/* 64e0 */ NULL, +/* 64e1 */ NULL, +/* 64e2 */ NULL, +/* 64e3 */ NULL, +/* 64e4 */ NULL, +/* 64e5 */ NULL, +/* 64e6 */ NULL, +/* 64e7 */ NULL, +/* 64e8 */ NULL, +/* 64e9 */ NULL, +/* 64ea */ NULL, +/* 64eb */ NULL, +/* 64ec */ NULL, +/* 64ed */ NULL, +/* 64ee */ NULL, +/* 64ef */ NULL, +/* 64f0 */ NULL, +/* 64f1 */ NULL, +/* 64f2 */ NULL, +/* 64f3 */ NULL, +/* 64f4 */ NULL, +/* 64f5 */ NULL, +/* 64f6 */ NULL, +/* 64f7 */ NULL, +/* 64f8 */ NULL, +/* 64f9 */ NULL, +/* 64fa */ NULL, +/* 64fb */ NULL, +/* 64fc */ NULL, +/* 64fd */ NULL, +/* 64fe */ NULL, +/* 64ff */ NULL, +/* 6500 */ NULL, +/* 6501 */ NULL, +/* 6502 */ NULL, +/* 6503 */ NULL, +/* 6504 */ NULL, +/* 6505 */ NULL, +/* 6506 */ NULL, +/* 6507 */ NULL, +/* 6508 */ NULL, +/* 6509 */ NULL, +/* 650a */ NULL, +/* 650b */ NULL, +/* 650c */ NULL, +/* 650d */ NULL, +/* 650e */ NULL, +/* 650f */ NULL, +/* 6510 */ NULL, +/* 6511 */ NULL, +/* 6512 */ NULL, +/* 6513 */ NULL, +/* 6514 */ NULL, +/* 6515 */ NULL, +/* 6516 */ NULL, +/* 6517 */ NULL, +/* 6518 */ NULL, +/* 6519 */ NULL, +/* 651a */ NULL, +/* 651b */ NULL, +/* 651c */ NULL, +/* 651d */ NULL, +/* 651e */ NULL, +/* 651f */ NULL, +/* 6520 */ NULL, +/* 6521 */ NULL, +/* 6522 */ NULL, +/* 6523 */ NULL, +/* 6524 */ NULL, +/* 6525 */ NULL, +/* 6526 */ NULL, +/* 6527 */ NULL, +/* 6528 */ NULL, +/* 6529 */ NULL, +/* 652a */ NULL, +/* 652b */ NULL, +/* 652c */ NULL, +/* 652d */ NULL, +/* 652e */ NULL, +/* 652f */ NULL, +/* 6530 */ NULL, +/* 6531 */ NULL, +/* 6532 */ NULL, +/* 6533 */ NULL, +/* 6534 */ NULL, +/* 6535 */ NULL, +/* 6536 */ NULL, +/* 6537 */ NULL, +/* 6538 */ NULL, +/* 6539 */ NULL, +/* 653a */ NULL, +/* 653b */ NULL, +/* 653c */ NULL, +/* 653d */ NULL, +/* 653e */ NULL, +/* 653f */ NULL, +/* 6540 */ NULL, +/* 6541 */ NULL, +/* 6542 */ NULL, +/* 6543 */ NULL, +/* 6544 */ NULL, +/* 6545 */ NULL, +/* 6546 */ NULL, +/* 6547 */ NULL, +/* 6548 */ NULL, +/* 6549 */ NULL, +/* 654a */ NULL, +/* 654b */ NULL, +/* 654c */ NULL, +/* 654d */ NULL, +/* 654e */ NULL, +/* 654f */ NULL, +/* 6550 */ NULL, +/* 6551 */ NULL, +/* 6552 */ NULL, +/* 6553 */ NULL, +/* 6554 */ NULL, +/* 6555 */ NULL, +/* 6556 */ NULL, +/* 6557 */ NULL, +/* 6558 */ NULL, +/* 6559 */ NULL, +/* 655a */ NULL, +/* 655b */ NULL, +/* 655c */ NULL, +/* 655d */ NULL, +/* 655e */ NULL, +/* 655f */ NULL, +/* 6560 */ NULL, +/* 6561 */ NULL, +/* 6562 */ NULL, +/* 6563 */ NULL, +/* 6564 */ NULL, +/* 6565 */ NULL, +/* 6566 */ NULL, +/* 6567 */ NULL, +/* 6568 */ NULL, +/* 6569 */ NULL, +/* 656a */ NULL, +/* 656b */ NULL, +/* 656c */ NULL, +/* 656d */ NULL, +/* 656e */ NULL, +/* 656f */ NULL, +/* 6570 */ NULL, +/* 6571 */ NULL, +/* 6572 */ NULL, +/* 6573 */ NULL, +/* 6574 */ NULL, +/* 6575 */ NULL, +/* 6576 */ NULL, +/* 6577 */ NULL, +/* 6578 */ NULL, +/* 6579 */ NULL, +/* 657a */ NULL, +/* 657b */ NULL, +/* 657c */ NULL, +/* 657d */ NULL, +/* 657e */ NULL, +/* 657f */ NULL, +/* 6580 */ NULL, +/* 6581 */ NULL, +/* 6582 */ NULL, +/* 6583 */ NULL, +/* 6584 */ NULL, +/* 6585 */ NULL, +/* 6586 */ NULL, +/* 6587 */ NULL, +/* 6588 */ NULL, +/* 6589 */ NULL, +/* 658a */ NULL, +/* 658b */ NULL, +/* 658c */ NULL, +/* 658d */ NULL, +/* 658e */ NULL, +/* 658f */ NULL, +/* 6590 */ NULL, +/* 6591 */ NULL, +/* 6592 */ NULL, +/* 6593 */ NULL, +/* 6594 */ NULL, +/* 6595 */ NULL, +/* 6596 */ NULL, +/* 6597 */ NULL, +/* 6598 */ NULL, +/* 6599 */ NULL, +/* 659a */ NULL, +/* 659b */ NULL, +/* 659c */ NULL, +/* 659d */ NULL, +/* 659e */ NULL, +/* 659f */ NULL, +/* 65a0 */ NULL, +/* 65a1 */ NULL, +/* 65a2 */ NULL, +/* 65a3 */ NULL, +/* 65a4 */ NULL, +/* 65a5 */ NULL, +/* 65a6 */ NULL, +/* 65a7 */ NULL, +/* 65a8 */ NULL, +/* 65a9 */ NULL, +/* 65aa */ NULL, +/* 65ab */ NULL, +/* 65ac */ NULL, +/* 65ad */ NULL, +/* 65ae */ NULL, +/* 65af */ NULL, +/* 65b0 */ NULL, +/* 65b1 */ NULL, +/* 65b2 */ NULL, +/* 65b3 */ NULL, +/* 65b4 */ NULL, +/* 65b5 */ NULL, +/* 65b6 */ NULL, +/* 65b7 */ NULL, +/* 65b8 */ NULL, +/* 65b9 */ NULL, +/* 65ba */ NULL, +/* 65bb */ NULL, +/* 65bc */ NULL, +/* 65bd */ NULL, +/* 65be */ NULL, +/* 65bf */ NULL, +/* 65c0 */ NULL, +/* 65c1 */ NULL, +/* 65c2 */ NULL, +/* 65c3 */ NULL, +/* 65c4 */ NULL, +/* 65c5 */ NULL, +/* 65c6 */ NULL, +/* 65c7 */ NULL, +/* 65c8 */ NULL, +/* 65c9 */ NULL, +/* 65ca */ NULL, +/* 65cb */ NULL, +/* 65cc */ NULL, +/* 65cd */ NULL, +/* 65ce */ NULL, +/* 65cf */ NULL, +/* 65d0 */ NULL, +/* 65d1 */ NULL, +/* 65d2 */ NULL, +/* 65d3 */ NULL, +/* 65d4 */ NULL, +/* 65d5 */ NULL, +/* 65d6 */ NULL, +/* 65d7 */ NULL, +/* 65d8 */ NULL, +/* 65d9 */ NULL, +/* 65da */ NULL, +/* 65db */ NULL, +/* 65dc */ NULL, +/* 65dd */ NULL, +/* 65de */ NULL, +/* 65df */ NULL, +/* 65e0 */ NULL, +/* 65e1 */ NULL, +/* 65e2 */ NULL, +/* 65e3 */ NULL, +/* 65e4 */ NULL, +/* 65e5 */ NULL, +/* 65e6 */ NULL, +/* 65e7 */ NULL, +/* 65e8 */ NULL, +/* 65e9 */ NULL, +/* 65ea */ NULL, +/* 65eb */ NULL, +/* 65ec */ NULL, +/* 65ed */ NULL, +/* 65ee */ NULL, +/* 65ef */ NULL, +/* 65f0 */ NULL, +/* 65f1 */ NULL, +/* 65f2 */ NULL, +/* 65f3 */ NULL, +/* 65f4 */ NULL, +/* 65f5 */ NULL, +/* 65f6 */ NULL, +/* 65f7 */ NULL, +/* 65f8 */ NULL, +/* 65f9 */ NULL, +/* 65fa */ NULL, +/* 65fb */ NULL, +/* 65fc */ NULL, +/* 65fd */ NULL, +/* 65fe */ NULL, +/* 65ff */ NULL, +/* 6600 */ NULL, +/* 6601 */ NULL, +/* 6602 */ NULL, +/* 6603 */ NULL, +/* 6604 */ NULL, +/* 6605 */ NULL, +/* 6606 */ NULL, +/* 6607 */ NULL, +/* 6608 */ NULL, +/* 6609 */ NULL, +/* 660a */ NULL, +/* 660b */ NULL, +/* 660c */ NULL, +/* 660d */ NULL, +/* 660e */ NULL, +/* 660f */ NULL, +/* 6610 */ NULL, +/* 6611 */ NULL, +/* 6612 */ NULL, +/* 6613 */ NULL, +/* 6614 */ NULL, +/* 6615 */ NULL, +/* 6616 */ NULL, +/* 6617 */ NULL, +/* 6618 */ NULL, +/* 6619 */ NULL, +/* 661a */ NULL, +/* 661b */ NULL, +/* 661c */ NULL, +/* 661d */ NULL, +/* 661e */ NULL, +/* 661f */ NULL, +/* 6620 */ NULL, +/* 6621 */ NULL, +/* 6622 */ NULL, +/* 6623 */ NULL, +/* 6624 */ NULL, +/* 6625 */ NULL, +/* 6626 */ NULL, +/* 6627 */ NULL, +/* 6628 */ NULL, +/* 6629 */ NULL, +/* 662a */ NULL, +/* 662b */ NULL, +/* 662c */ NULL, +/* 662d */ NULL, +/* 662e */ NULL, +/* 662f */ NULL, +/* 6630 */ NULL, +/* 6631 */ NULL, +/* 6632 */ NULL, +/* 6633 */ NULL, +/* 6634 */ NULL, +/* 6635 */ NULL, +/* 6636 */ NULL, +/* 6637 */ NULL, +/* 6638 */ NULL, +/* 6639 */ NULL, +/* 663a */ NULL, +/* 663b */ NULL, +/* 663c */ NULL, +/* 663d */ NULL, +/* 663e */ NULL, +/* 663f */ NULL, +/* 6640 */ NULL, +/* 6641 */ NULL, +/* 6642 */ NULL, +/* 6643 */ NULL, +/* 6644 */ NULL, +/* 6645 */ NULL, +/* 6646 */ NULL, +/* 6647 */ NULL, +/* 6648 */ NULL, +/* 6649 */ NULL, +/* 664a */ NULL, +/* 664b */ NULL, +/* 664c */ NULL, +/* 664d */ NULL, +/* 664e */ NULL, +/* 664f */ NULL, +/* 6650 */ NULL, +/* 6651 */ NULL, +/* 6652 */ NULL, +/* 6653 */ NULL, +/* 6654 */ NULL, +/* 6655 */ NULL, +/* 6656 */ NULL, +/* 6657 */ NULL, +/* 6658 */ NULL, +/* 6659 */ NULL, +/* 665a */ NULL, +/* 665b */ NULL, +/* 665c */ NULL, +/* 665d */ NULL, +/* 665e */ NULL, +/* 665f */ NULL, +/* 6660 */ NULL, +/* 6661 */ NULL, +/* 6662 */ NULL, +/* 6663 */ NULL, +/* 6664 */ NULL, +/* 6665 */ NULL, +/* 6666 */ NULL, +/* 6667 */ NULL, +/* 6668 */ NULL, +/* 6669 */ NULL, +/* 666a */ NULL, +/* 666b */ NULL, +/* 666c */ NULL, +/* 666d */ NULL, +/* 666e */ NULL, +/* 666f */ NULL, +/* 6670 */ NULL, +/* 6671 */ NULL, +/* 6672 */ NULL, +/* 6673 */ NULL, +/* 6674 */ NULL, +/* 6675 */ NULL, +/* 6676 */ NULL, +/* 6677 */ NULL, +/* 6678 */ NULL, +/* 6679 */ NULL, +/* 667a */ NULL, +/* 667b */ NULL, +/* 667c */ NULL, +/* 667d */ NULL, +/* 667e */ NULL, +/* 667f */ NULL, +/* 6680 */ NULL, +/* 6681 */ NULL, +/* 6682 */ NULL, +/* 6683 */ NULL, +/* 6684 */ NULL, +/* 6685 */ NULL, +/* 6686 */ NULL, +/* 6687 */ NULL, +/* 6688 */ NULL, +/* 6689 */ NULL, +/* 668a */ NULL, +/* 668b */ NULL, +/* 668c */ NULL, +/* 668d */ NULL, +/* 668e */ NULL, +/* 668f */ NULL, +/* 6690 */ NULL, +/* 6691 */ NULL, +/* 6692 */ NULL, +/* 6693 */ NULL, +/* 6694 */ NULL, +/* 6695 */ NULL, +/* 6696 */ NULL, +/* 6697 */ NULL, +/* 6698 */ NULL, +/* 6699 */ NULL, +/* 669a */ NULL, +/* 669b */ NULL, +/* 669c */ NULL, +/* 669d */ NULL, +/* 669e */ NULL, +/* 669f */ NULL, +/* 66a0 */ NULL, +/* 66a1 */ NULL, +/* 66a2 */ NULL, +/* 66a3 */ NULL, +/* 66a4 */ NULL, +/* 66a5 */ NULL, +/* 66a6 */ NULL, +/* 66a7 */ NULL, +/* 66a8 */ NULL, +/* 66a9 */ NULL, +/* 66aa */ NULL, +/* 66ab */ NULL, +/* 66ac */ NULL, +/* 66ad */ NULL, +/* 66ae */ NULL, +/* 66af */ NULL, +/* 66b0 */ NULL, +/* 66b1 */ NULL, +/* 66b2 */ NULL, +/* 66b3 */ NULL, +/* 66b4 */ NULL, +/* 66b5 */ NULL, +/* 66b6 */ NULL, +/* 66b7 */ NULL, +/* 66b8 */ NULL, +/* 66b9 */ NULL, +/* 66ba */ NULL, +/* 66bb */ NULL, +/* 66bc */ NULL, +/* 66bd */ NULL, +/* 66be */ NULL, +/* 66bf */ NULL, +/* 66c0 */ NULL, +/* 66c1 */ NULL, +/* 66c2 */ NULL, +/* 66c3 */ NULL, +/* 66c4 */ NULL, +/* 66c5 */ NULL, +/* 66c6 */ NULL, +/* 66c7 */ NULL, +/* 66c8 */ NULL, +/* 66c9 */ NULL, +/* 66ca */ NULL, +/* 66cb */ NULL, +/* 66cc */ NULL, +/* 66cd */ NULL, +/* 66ce */ NULL, +/* 66cf */ NULL, +/* 66d0 */ NULL, +/* 66d1 */ NULL, +/* 66d2 */ NULL, +/* 66d3 */ NULL, +/* 66d4 */ NULL, +/* 66d5 */ NULL, +/* 66d6 */ NULL, +/* 66d7 */ NULL, +/* 66d8 */ NULL, +/* 66d9 */ NULL, +/* 66da */ NULL, +/* 66db */ NULL, +/* 66dc */ NULL, +/* 66dd */ NULL, +/* 66de */ NULL, +/* 66df */ NULL, +/* 66e0 */ NULL, +/* 66e1 */ NULL, +/* 66e2 */ NULL, +/* 66e3 */ NULL, +/* 66e4 */ NULL, +/* 66e5 */ NULL, +/* 66e6 */ NULL, +/* 66e7 */ NULL, +/* 66e8 */ NULL, +/* 66e9 */ NULL, +/* 66ea */ NULL, +/* 66eb */ NULL, +/* 66ec */ NULL, +/* 66ed */ NULL, +/* 66ee */ NULL, +/* 66ef */ NULL, +/* 66f0 */ NULL, +/* 66f1 */ NULL, +/* 66f2 */ NULL, +/* 66f3 */ NULL, +/* 66f4 */ NULL, +/* 66f5 */ NULL, +/* 66f6 */ NULL, +/* 66f7 */ NULL, +/* 66f8 */ NULL, +/* 66f9 */ NULL, +/* 66fa */ NULL, +/* 66fb */ NULL, +/* 66fc */ NULL, +/* 66fd */ NULL, +/* 66fe */ NULL, +/* 66ff */ NULL, +/* 6700 */ NULL, +/* 6701 */ NULL, +/* 6702 */ NULL, +/* 6703 */ NULL, +/* 6704 */ NULL, +/* 6705 */ NULL, +/* 6706 */ NULL, +/* 6707 */ NULL, +/* 6708 */ NULL, +/* 6709 */ NULL, +/* 670a */ NULL, +/* 670b */ NULL, +/* 670c */ NULL, +/* 670d */ NULL, +/* 670e */ NULL, +/* 670f */ NULL, +/* 6710 */ NULL, +/* 6711 */ NULL, +/* 6712 */ NULL, +/* 6713 */ NULL, +/* 6714 */ NULL, +/* 6715 */ NULL, +/* 6716 */ NULL, +/* 6717 */ NULL, +/* 6718 */ NULL, +/* 6719 */ NULL, +/* 671a */ NULL, +/* 671b */ NULL, +/* 671c */ NULL, +/* 671d */ NULL, +/* 671e */ NULL, +/* 671f */ NULL, +/* 6720 */ NULL, +/* 6721 */ NULL, +/* 6722 */ NULL, +/* 6723 */ NULL, +/* 6724 */ NULL, +/* 6725 */ NULL, +/* 6726 */ NULL, +/* 6727 */ NULL, +/* 6728 */ NULL, +/* 6729 */ NULL, +/* 672a */ NULL, +/* 672b */ NULL, +/* 672c */ NULL, +/* 672d */ NULL, +/* 672e */ NULL, +/* 672f */ NULL, +/* 6730 */ NULL, +/* 6731 */ NULL, +/* 6732 */ NULL, +/* 6733 */ NULL, +/* 6734 */ NULL, +/* 6735 */ NULL, +/* 6736 */ NULL, +/* 6737 */ NULL, +/* 6738 */ NULL, +/* 6739 */ NULL, +/* 673a */ NULL, +/* 673b */ NULL, +/* 673c */ NULL, +/* 673d */ NULL, +/* 673e */ NULL, +/* 673f */ NULL, +/* 6740 */ NULL, +/* 6741 */ NULL, +/* 6742 */ NULL, +/* 6743 */ NULL, +/* 6744 */ NULL, +/* 6745 */ NULL, +/* 6746 */ NULL, +/* 6747 */ NULL, +/* 6748 */ NULL, +/* 6749 */ NULL, +/* 674a */ NULL, +/* 674b */ NULL, +/* 674c */ NULL, +/* 674d */ NULL, +/* 674e */ NULL, +/* 674f */ NULL, +/* 6750 */ NULL, +/* 6751 */ NULL, +/* 6752 */ NULL, +/* 6753 */ NULL, +/* 6754 */ NULL, +/* 6755 */ NULL, +/* 6756 */ NULL, +/* 6757 */ NULL, +/* 6758 */ NULL, +/* 6759 */ NULL, +/* 675a */ NULL, +/* 675b */ NULL, +/* 675c */ NULL, +/* 675d */ NULL, +/* 675e */ NULL, +/* 675f */ NULL, +/* 6760 */ NULL, +/* 6761 */ NULL, +/* 6762 */ NULL, +/* 6763 */ NULL, +/* 6764 */ NULL, +/* 6765 */ NULL, +/* 6766 */ NULL, +/* 6767 */ NULL, +/* 6768 */ NULL, +/* 6769 */ NULL, +/* 676a */ NULL, +/* 676b */ NULL, +/* 676c */ NULL, +/* 676d */ NULL, +/* 676e */ NULL, +/* 676f */ NULL, +/* 6770 */ NULL, +/* 6771 */ NULL, +/* 6772 */ NULL, +/* 6773 */ NULL, +/* 6774 */ NULL, +/* 6775 */ NULL, +/* 6776 */ NULL, +/* 6777 */ NULL, +/* 6778 */ NULL, +/* 6779 */ NULL, +/* 677a */ NULL, +/* 677b */ NULL, +/* 677c */ NULL, +/* 677d */ NULL, +/* 677e */ NULL, +/* 677f */ NULL, +/* 6780 */ NULL, +/* 6781 */ NULL, +/* 6782 */ NULL, +/* 6783 */ NULL, +/* 6784 */ NULL, +/* 6785 */ NULL, +/* 6786 */ NULL, +/* 6787 */ NULL, +/* 6788 */ NULL, +/* 6789 */ NULL, +/* 678a */ NULL, +/* 678b */ NULL, +/* 678c */ NULL, +/* 678d */ NULL, +/* 678e */ NULL, +/* 678f */ NULL, +/* 6790 */ NULL, +/* 6791 */ NULL, +/* 6792 */ NULL, +/* 6793 */ NULL, +/* 6794 */ NULL, +/* 6795 */ NULL, +/* 6796 */ NULL, +/* 6797 */ NULL, +/* 6798 */ NULL, +/* 6799 */ NULL, +/* 679a */ NULL, +/* 679b */ NULL, +/* 679c */ NULL, +/* 679d */ NULL, +/* 679e */ NULL, +/* 679f */ NULL, +/* 67a0 */ NULL, +/* 67a1 */ NULL, +/* 67a2 */ NULL, +/* 67a3 */ NULL, +/* 67a4 */ NULL, +/* 67a5 */ NULL, +/* 67a6 */ NULL, +/* 67a7 */ NULL, +/* 67a8 */ NULL, +/* 67a9 */ NULL, +/* 67aa */ NULL, +/* 67ab */ NULL, +/* 67ac */ NULL, +/* 67ad */ NULL, +/* 67ae */ NULL, +/* 67af */ NULL, +/* 67b0 */ NULL, +/* 67b1 */ NULL, +/* 67b2 */ NULL, +/* 67b3 */ NULL, +/* 67b4 */ NULL, +/* 67b5 */ NULL, +/* 67b6 */ NULL, +/* 67b7 */ NULL, +/* 67b8 */ NULL, +/* 67b9 */ NULL, +/* 67ba */ NULL, +/* 67bb */ NULL, +/* 67bc */ NULL, +/* 67bd */ NULL, +/* 67be */ NULL, +/* 67bf */ NULL, +/* 67c0 */ NULL, +/* 67c1 */ NULL, +/* 67c2 */ NULL, +/* 67c3 */ NULL, +/* 67c4 */ NULL, +/* 67c5 */ NULL, +/* 67c6 */ NULL, +/* 67c7 */ NULL, +/* 67c8 */ NULL, +/* 67c9 */ NULL, +/* 67ca */ NULL, +/* 67cb */ NULL, +/* 67cc */ NULL, +/* 67cd */ NULL, +/* 67ce */ NULL, +/* 67cf */ NULL, +/* 67d0 */ NULL, +/* 67d1 */ NULL, +/* 67d2 */ NULL, +/* 67d3 */ NULL, +/* 67d4 */ NULL, +/* 67d5 */ NULL, +/* 67d6 */ NULL, +/* 67d7 */ NULL, +/* 67d8 */ NULL, +/* 67d9 */ NULL, +/* 67da */ NULL, +/* 67db */ NULL, +/* 67dc */ NULL, +/* 67dd */ NULL, +/* 67de */ NULL, +/* 67df */ NULL, +/* 67e0 */ NULL, +/* 67e1 */ NULL, +/* 67e2 */ NULL, +/* 67e3 */ NULL, +/* 67e4 */ NULL, +/* 67e5 */ NULL, +/* 67e6 */ NULL, +/* 67e7 */ NULL, +/* 67e8 */ NULL, +/* 67e9 */ NULL, +/* 67ea */ NULL, +/* 67eb */ NULL, +/* 67ec */ NULL, +/* 67ed */ NULL, +/* 67ee */ NULL, +/* 67ef */ NULL, +/* 67f0 */ NULL, +/* 67f1 */ NULL, +/* 67f2 */ NULL, +/* 67f3 */ NULL, +/* 67f4 */ NULL, +/* 67f5 */ NULL, +/* 67f6 */ NULL, +/* 67f7 */ NULL, +/* 67f8 */ NULL, +/* 67f9 */ NULL, +/* 67fa */ NULL, +/* 67fb */ NULL, +/* 67fc */ NULL, +/* 67fd */ NULL, +/* 67fe */ NULL, +/* 67ff */ NULL, +/* 6800 */ NULL, +/* 6801 */ NULL, +/* 6802 */ NULL, +/* 6803 */ NULL, +/* 6804 */ NULL, +/* 6805 */ NULL, +/* 6806 */ NULL, +/* 6807 */ NULL, +/* 6808 */ NULL, +/* 6809 */ NULL, +/* 680a */ NULL, +/* 680b */ NULL, +/* 680c */ NULL, +/* 680d */ NULL, +/* 680e */ NULL, +/* 680f */ NULL, +/* 6810 */ NULL, +/* 6811 */ NULL, +/* 6812 */ NULL, +/* 6813 */ NULL, +/* 6814 */ NULL, +/* 6815 */ NULL, +/* 6816 */ NULL, +/* 6817 */ NULL, +/* 6818 */ NULL, +/* 6819 */ NULL, +/* 681a */ NULL, +/* 681b */ NULL, +/* 681c */ NULL, +/* 681d */ NULL, +/* 681e */ NULL, +/* 681f */ NULL, +/* 6820 */ NULL, +/* 6821 */ NULL, +/* 6822 */ NULL, +/* 6823 */ NULL, +/* 6824 */ NULL, +/* 6825 */ NULL, +/* 6826 */ NULL, +/* 6827 */ NULL, +/* 6828 */ NULL, +/* 6829 */ NULL, +/* 682a */ NULL, +/* 682b */ NULL, +/* 682c */ NULL, +/* 682d */ NULL, +/* 682e */ NULL, +/* 682f */ NULL, +/* 6830 */ NULL, +/* 6831 */ NULL, +/* 6832 */ NULL, +/* 6833 */ NULL, +/* 6834 */ NULL, +/* 6835 */ NULL, +/* 6836 */ NULL, +/* 6837 */ NULL, +/* 6838 */ NULL, +/* 6839 */ NULL, +/* 683a */ NULL, +/* 683b */ NULL, +/* 683c */ NULL, +/* 683d */ NULL, +/* 683e */ NULL, +/* 683f */ NULL, +/* 6840 */ NULL, +/* 6841 */ NULL, +/* 6842 */ NULL, +/* 6843 */ NULL, +/* 6844 */ NULL, +/* 6845 */ NULL, +/* 6846 */ NULL, +/* 6847 */ NULL, +/* 6848 */ NULL, +/* 6849 */ NULL, +/* 684a */ NULL, +/* 684b */ NULL, +/* 684c */ NULL, +/* 684d */ NULL, +/* 684e */ NULL, +/* 684f */ NULL, +/* 6850 */ NULL, +/* 6851 */ NULL, +/* 6852 */ NULL, +/* 6853 */ NULL, +/* 6854 */ NULL, +/* 6855 */ NULL, +/* 6856 */ NULL, +/* 6857 */ NULL, +/* 6858 */ NULL, +/* 6859 */ NULL, +/* 685a */ NULL, +/* 685b */ NULL, +/* 685c */ NULL, +/* 685d */ NULL, +/* 685e */ NULL, +/* 685f */ NULL, +/* 6860 */ NULL, +/* 6861 */ NULL, +/* 6862 */ NULL, +/* 6863 */ NULL, +/* 6864 */ NULL, +/* 6865 */ NULL, +/* 6866 */ NULL, +/* 6867 */ NULL, +/* 6868 */ NULL, +/* 6869 */ NULL, +/* 686a */ NULL, +/* 686b */ NULL, +/* 686c */ NULL, +/* 686d */ NULL, +/* 686e */ NULL, +/* 686f */ NULL, +/* 6870 */ NULL, +/* 6871 */ NULL, +/* 6872 */ NULL, +/* 6873 */ NULL, +/* 6874 */ NULL, +/* 6875 */ NULL, +/* 6876 */ NULL, +/* 6877 */ NULL, +/* 6878 */ NULL, +/* 6879 */ NULL, +/* 687a */ NULL, +/* 687b */ NULL, +/* 687c */ NULL, +/* 687d */ NULL, +/* 687e */ NULL, +/* 687f */ NULL, +/* 6880 */ NULL, +/* 6881 */ NULL, +/* 6882 */ NULL, +/* 6883 */ NULL, +/* 6884 */ NULL, +/* 6885 */ NULL, +/* 6886 */ NULL, +/* 6887 */ NULL, +/* 6888 */ NULL, +/* 6889 */ NULL, +/* 688a */ NULL, +/* 688b */ NULL, +/* 688c */ NULL, +/* 688d */ NULL, +/* 688e */ NULL, +/* 688f */ NULL, +/* 6890 */ NULL, +/* 6891 */ NULL, +/* 6892 */ NULL, +/* 6893 */ NULL, +/* 6894 */ NULL, +/* 6895 */ NULL, +/* 6896 */ NULL, +/* 6897 */ NULL, +/* 6898 */ NULL, +/* 6899 */ NULL, +/* 689a */ NULL, +/* 689b */ NULL, +/* 689c */ NULL, +/* 689d */ NULL, +/* 689e */ NULL, +/* 689f */ NULL, +/* 68a0 */ NULL, +/* 68a1 */ NULL, +/* 68a2 */ NULL, +/* 68a3 */ NULL, +/* 68a4 */ NULL, +/* 68a5 */ NULL, +/* 68a6 */ NULL, +/* 68a7 */ NULL, +/* 68a8 */ NULL, +/* 68a9 */ NULL, +/* 68aa */ NULL, +/* 68ab */ NULL, +/* 68ac */ NULL, +/* 68ad */ NULL, +/* 68ae */ NULL, +/* 68af */ NULL, +/* 68b0 */ NULL, +/* 68b1 */ NULL, +/* 68b2 */ NULL, +/* 68b3 */ NULL, +/* 68b4 */ NULL, +/* 68b5 */ NULL, +/* 68b6 */ NULL, +/* 68b7 */ NULL, +/* 68b8 */ NULL, +/* 68b9 */ NULL, +/* 68ba */ NULL, +/* 68bb */ NULL, +/* 68bc */ NULL, +/* 68bd */ NULL, +/* 68be */ NULL, +/* 68bf */ NULL, +/* 68c0 */ NULL, +/* 68c1 */ NULL, +/* 68c2 */ NULL, +/* 68c3 */ NULL, +/* 68c4 */ NULL, +/* 68c5 */ NULL, +/* 68c6 */ NULL, +/* 68c7 */ NULL, +/* 68c8 */ NULL, +/* 68c9 */ NULL, +/* 68ca */ NULL, +/* 68cb */ NULL, +/* 68cc */ NULL, +/* 68cd */ NULL, +/* 68ce */ NULL, +/* 68cf */ NULL, +/* 68d0 */ NULL, +/* 68d1 */ NULL, +/* 68d2 */ NULL, +/* 68d3 */ NULL, +/* 68d4 */ NULL, +/* 68d5 */ NULL, +/* 68d6 */ NULL, +/* 68d7 */ NULL, +/* 68d8 */ NULL, +/* 68d9 */ NULL, +/* 68da */ NULL, +/* 68db */ NULL, +/* 68dc */ NULL, +/* 68dd */ NULL, +/* 68de */ NULL, +/* 68df */ NULL, +/* 68e0 */ NULL, +/* 68e1 */ NULL, +/* 68e2 */ NULL, +/* 68e3 */ NULL, +/* 68e4 */ NULL, +/* 68e5 */ NULL, +/* 68e6 */ NULL, +/* 68e7 */ NULL, +/* 68e8 */ NULL, +/* 68e9 */ NULL, +/* 68ea */ NULL, +/* 68eb */ NULL, +/* 68ec */ NULL, +/* 68ed */ NULL, +/* 68ee */ NULL, +/* 68ef */ NULL, +/* 68f0 */ NULL, +/* 68f1 */ NULL, +/* 68f2 */ NULL, +/* 68f3 */ NULL, +/* 68f4 */ NULL, +/* 68f5 */ NULL, +/* 68f6 */ NULL, +/* 68f7 */ NULL, +/* 68f8 */ NULL, +/* 68f9 */ NULL, +/* 68fa */ NULL, +/* 68fb */ NULL, +/* 68fc */ NULL, +/* 68fd */ NULL, +/* 68fe */ NULL, +/* 68ff */ NULL, +/* 6900 */ NULL, +/* 6901 */ NULL, +/* 6902 */ NULL, +/* 6903 */ NULL, +/* 6904 */ NULL, +/* 6905 */ NULL, +/* 6906 */ NULL, +/* 6907 */ NULL, +/* 6908 */ NULL, +/* 6909 */ NULL, +/* 690a */ NULL, +/* 690b */ NULL, +/* 690c */ NULL, +/* 690d */ NULL, +/* 690e */ NULL, +/* 690f */ NULL, +/* 6910 */ NULL, +/* 6911 */ NULL, +/* 6912 */ NULL, +/* 6913 */ NULL, +/* 6914 */ NULL, +/* 6915 */ NULL, +/* 6916 */ NULL, +/* 6917 */ NULL, +/* 6918 */ NULL, +/* 6919 */ NULL, +/* 691a */ NULL, +/* 691b */ NULL, +/* 691c */ NULL, +/* 691d */ NULL, +/* 691e */ NULL, +/* 691f */ NULL, +/* 6920 */ NULL, +/* 6921 */ NULL, +/* 6922 */ NULL, +/* 6923 */ NULL, +/* 6924 */ NULL, +/* 6925 */ NULL, +/* 6926 */ NULL, +/* 6927 */ NULL, +/* 6928 */ NULL, +/* 6929 */ NULL, +/* 692a */ NULL, +/* 692b */ NULL, +/* 692c */ NULL, +/* 692d */ NULL, +/* 692e */ NULL, +/* 692f */ NULL, +/* 6930 */ NULL, +/* 6931 */ NULL, +/* 6932 */ NULL, +/* 6933 */ NULL, +/* 6934 */ NULL, +/* 6935 */ NULL, +/* 6936 */ NULL, +/* 6937 */ NULL, +/* 6938 */ NULL, +/* 6939 */ NULL, +/* 693a */ NULL, +/* 693b */ NULL, +/* 693c */ NULL, +/* 693d */ NULL, +/* 693e */ NULL, +/* 693f */ NULL, +/* 6940 */ NULL, +/* 6941 */ NULL, +/* 6942 */ NULL, +/* 6943 */ NULL, +/* 6944 */ NULL, +/* 6945 */ NULL, +/* 6946 */ NULL, +/* 6947 */ NULL, +/* 6948 */ NULL, +/* 6949 */ NULL, +/* 694a */ NULL, +/* 694b */ NULL, +/* 694c */ NULL, +/* 694d */ NULL, +/* 694e */ NULL, +/* 694f */ NULL, +/* 6950 */ NULL, +/* 6951 */ NULL, +/* 6952 */ NULL, +/* 6953 */ NULL, +/* 6954 */ NULL, +/* 6955 */ NULL, +/* 6956 */ NULL, +/* 6957 */ NULL, +/* 6958 */ NULL, +/* 6959 */ NULL, +/* 695a */ NULL, +/* 695b */ NULL, +/* 695c */ NULL, +/* 695d */ NULL, +/* 695e */ NULL, +/* 695f */ NULL, +/* 6960 */ NULL, +/* 6961 */ NULL, +/* 6962 */ NULL, +/* 6963 */ NULL, +/* 6964 */ NULL, +/* 6965 */ NULL, +/* 6966 */ NULL, +/* 6967 */ NULL, +/* 6968 */ NULL, +/* 6969 */ NULL, +/* 696a */ NULL, +/* 696b */ NULL, +/* 696c */ NULL, +/* 696d */ NULL, +/* 696e */ NULL, +/* 696f */ NULL, +/* 6970 */ NULL, +/* 6971 */ NULL, +/* 6972 */ NULL, +/* 6973 */ NULL, +/* 6974 */ NULL, +/* 6975 */ NULL, +/* 6976 */ NULL, +/* 6977 */ NULL, +/* 6978 */ NULL, +/* 6979 */ NULL, +/* 697a */ NULL, +/* 697b */ NULL, +/* 697c */ NULL, +/* 697d */ NULL, +/* 697e */ NULL, +/* 697f */ NULL, +/* 6980 */ NULL, +/* 6981 */ NULL, +/* 6982 */ NULL, +/* 6983 */ NULL, +/* 6984 */ NULL, +/* 6985 */ NULL, +/* 6986 */ NULL, +/* 6987 */ NULL, +/* 6988 */ NULL, +/* 6989 */ NULL, +/* 698a */ NULL, +/* 698b */ NULL, +/* 698c */ NULL, +/* 698d */ NULL, +/* 698e */ NULL, +/* 698f */ NULL, +/* 6990 */ NULL, +/* 6991 */ NULL, +/* 6992 */ NULL, +/* 6993 */ NULL, +/* 6994 */ NULL, +/* 6995 */ NULL, +/* 6996 */ NULL, +/* 6997 */ NULL, +/* 6998 */ NULL, +/* 6999 */ NULL, +/* 699a */ NULL, +/* 699b */ NULL, +/* 699c */ NULL, +/* 699d */ NULL, +/* 699e */ NULL, +/* 699f */ NULL, +/* 69a0 */ NULL, +/* 69a1 */ NULL, +/* 69a2 */ NULL, +/* 69a3 */ NULL, +/* 69a4 */ NULL, +/* 69a5 */ NULL, +/* 69a6 */ NULL, +/* 69a7 */ NULL, +/* 69a8 */ NULL, +/* 69a9 */ NULL, +/* 69aa */ NULL, +/* 69ab */ NULL, +/* 69ac */ NULL, +/* 69ad */ NULL, +/* 69ae */ NULL, +/* 69af */ NULL, +/* 69b0 */ NULL, +/* 69b1 */ NULL, +/* 69b2 */ NULL, +/* 69b3 */ NULL, +/* 69b4 */ NULL, +/* 69b5 */ NULL, +/* 69b6 */ NULL, +/* 69b7 */ NULL, +/* 69b8 */ NULL, +/* 69b9 */ NULL, +/* 69ba */ NULL, +/* 69bb */ NULL, +/* 69bc */ NULL, +/* 69bd */ NULL, +/* 69be */ NULL, +/* 69bf */ NULL, +/* 69c0 */ NULL, +/* 69c1 */ NULL, +/* 69c2 */ NULL, +/* 69c3 */ NULL, +/* 69c4 */ NULL, +/* 69c5 */ NULL, +/* 69c6 */ NULL, +/* 69c7 */ NULL, +/* 69c8 */ NULL, +/* 69c9 */ NULL, +/* 69ca */ NULL, +/* 69cb */ NULL, +/* 69cc */ NULL, +/* 69cd */ NULL, +/* 69ce */ NULL, +/* 69cf */ NULL, +/* 69d0 */ NULL, +/* 69d1 */ NULL, +/* 69d2 */ NULL, +/* 69d3 */ NULL, +/* 69d4 */ NULL, +/* 69d5 */ NULL, +/* 69d6 */ NULL, +/* 69d7 */ NULL, +/* 69d8 */ NULL, +/* 69d9 */ NULL, +/* 69da */ NULL, +/* 69db */ NULL, +/* 69dc */ NULL, +/* 69dd */ NULL, +/* 69de */ NULL, +/* 69df */ NULL, +/* 69e0 */ NULL, +/* 69e1 */ NULL, +/* 69e2 */ NULL, +/* 69e3 */ NULL, +/* 69e4 */ NULL, +/* 69e5 */ NULL, +/* 69e6 */ NULL, +/* 69e7 */ NULL, +/* 69e8 */ NULL, +/* 69e9 */ NULL, +/* 69ea */ NULL, +/* 69eb */ NULL, +/* 69ec */ NULL, +/* 69ed */ NULL, +/* 69ee */ NULL, +/* 69ef */ NULL, +/* 69f0 */ NULL, +/* 69f1 */ NULL, +/* 69f2 */ NULL, +/* 69f3 */ NULL, +/* 69f4 */ NULL, +/* 69f5 */ NULL, +/* 69f6 */ NULL, +/* 69f7 */ NULL, +/* 69f8 */ NULL, +/* 69f9 */ NULL, +/* 69fa */ NULL, +/* 69fb */ NULL, +/* 69fc */ NULL, +/* 69fd */ NULL, +/* 69fe */ NULL, +/* 69ff */ NULL, +/* 6a00 */ NULL, +/* 6a01 */ NULL, +/* 6a02 */ NULL, +/* 6a03 */ NULL, +/* 6a04 */ NULL, +/* 6a05 */ NULL, +/* 6a06 */ NULL, +/* 6a07 */ NULL, +/* 6a08 */ NULL, +/* 6a09 */ NULL, +/* 6a0a */ NULL, +/* 6a0b */ NULL, +/* 6a0c */ NULL, +/* 6a0d */ NULL, +/* 6a0e */ NULL, +/* 6a0f */ NULL, +/* 6a10 */ NULL, +/* 6a11 */ NULL, +/* 6a12 */ NULL, +/* 6a13 */ NULL, +/* 6a14 */ NULL, +/* 6a15 */ NULL, +/* 6a16 */ NULL, +/* 6a17 */ NULL, +/* 6a18 */ NULL, +/* 6a19 */ NULL, +/* 6a1a */ NULL, +/* 6a1b */ NULL, +/* 6a1c */ NULL, +/* 6a1d */ NULL, +/* 6a1e */ NULL, +/* 6a1f */ NULL, +/* 6a20 */ NULL, +/* 6a21 */ NULL, +/* 6a22 */ NULL, +/* 6a23 */ NULL, +/* 6a24 */ NULL, +/* 6a25 */ NULL, +/* 6a26 */ NULL, +/* 6a27 */ NULL, +/* 6a28 */ NULL, +/* 6a29 */ NULL, +/* 6a2a */ NULL, +/* 6a2b */ NULL, +/* 6a2c */ NULL, +/* 6a2d */ NULL, +/* 6a2e */ NULL, +/* 6a2f */ NULL, +/* 6a30 */ NULL, +/* 6a31 */ NULL, +/* 6a32 */ NULL, +/* 6a33 */ NULL, +/* 6a34 */ NULL, +/* 6a35 */ NULL, +/* 6a36 */ NULL, +/* 6a37 */ NULL, +/* 6a38 */ NULL, +/* 6a39 */ NULL, +/* 6a3a */ NULL, +/* 6a3b */ NULL, +/* 6a3c */ NULL, +/* 6a3d */ NULL, +/* 6a3e */ NULL, +/* 6a3f */ NULL, +/* 6a40 */ NULL, +/* 6a41 */ NULL, +/* 6a42 */ NULL, +/* 6a43 */ NULL, +/* 6a44 */ NULL, +/* 6a45 */ NULL, +/* 6a46 */ NULL, +/* 6a47 */ NULL, +/* 6a48 */ NULL, +/* 6a49 */ NULL, +/* 6a4a */ NULL, +/* 6a4b */ NULL, +/* 6a4c */ NULL, +/* 6a4d */ NULL, +/* 6a4e */ NULL, +/* 6a4f */ NULL, +/* 6a50 */ NULL, +/* 6a51 */ NULL, +/* 6a52 */ NULL, +/* 6a53 */ NULL, +/* 6a54 */ NULL, +/* 6a55 */ NULL, +/* 6a56 */ NULL, +/* 6a57 */ NULL, +/* 6a58 */ NULL, +/* 6a59 */ NULL, +/* 6a5a */ NULL, +/* 6a5b */ NULL, +/* 6a5c */ NULL, +/* 6a5d */ NULL, +/* 6a5e */ NULL, +/* 6a5f */ NULL, +/* 6a60 */ NULL, +/* 6a61 */ NULL, +/* 6a62 */ NULL, +/* 6a63 */ NULL, +/* 6a64 */ NULL, +/* 6a65 */ NULL, +/* 6a66 */ NULL, +/* 6a67 */ NULL, +/* 6a68 */ NULL, +/* 6a69 */ NULL, +/* 6a6a */ NULL, +/* 6a6b */ NULL, +/* 6a6c */ NULL, +/* 6a6d */ NULL, +/* 6a6e */ NULL, +/* 6a6f */ NULL, +/* 6a70 */ NULL, +/* 6a71 */ NULL, +/* 6a72 */ NULL, +/* 6a73 */ NULL, +/* 6a74 */ NULL, +/* 6a75 */ NULL, +/* 6a76 */ NULL, +/* 6a77 */ NULL, +/* 6a78 */ NULL, +/* 6a79 */ NULL, +/* 6a7a */ NULL, +/* 6a7b */ NULL, +/* 6a7c */ NULL, +/* 6a7d */ NULL, +/* 6a7e */ NULL, +/* 6a7f */ NULL, +/* 6a80 */ NULL, +/* 6a81 */ NULL, +/* 6a82 */ NULL, +/* 6a83 */ NULL, +/* 6a84 */ NULL, +/* 6a85 */ NULL, +/* 6a86 */ NULL, +/* 6a87 */ NULL, +/* 6a88 */ NULL, +/* 6a89 */ NULL, +/* 6a8a */ NULL, +/* 6a8b */ NULL, +/* 6a8c */ NULL, +/* 6a8d */ NULL, +/* 6a8e */ NULL, +/* 6a8f */ NULL, +/* 6a90 */ NULL, +/* 6a91 */ NULL, +/* 6a92 */ NULL, +/* 6a93 */ NULL, +/* 6a94 */ NULL, +/* 6a95 */ NULL, +/* 6a96 */ NULL, +/* 6a97 */ NULL, +/* 6a98 */ NULL, +/* 6a99 */ NULL, +/* 6a9a */ NULL, +/* 6a9b */ NULL, +/* 6a9c */ NULL, +/* 6a9d */ NULL, +/* 6a9e */ NULL, +/* 6a9f */ NULL, +/* 6aa0 */ NULL, +/* 6aa1 */ NULL, +/* 6aa2 */ NULL, +/* 6aa3 */ NULL, +/* 6aa4 */ NULL, +/* 6aa5 */ NULL, +/* 6aa6 */ NULL, +/* 6aa7 */ NULL, +/* 6aa8 */ NULL, +/* 6aa9 */ NULL, +/* 6aaa */ NULL, +/* 6aab */ NULL, +/* 6aac */ NULL, +/* 6aad */ NULL, +/* 6aae */ NULL, +/* 6aaf */ NULL, +/* 6ab0 */ NULL, +/* 6ab1 */ NULL, +/* 6ab2 */ NULL, +/* 6ab3 */ NULL, +/* 6ab4 */ NULL, +/* 6ab5 */ NULL, +/* 6ab6 */ NULL, +/* 6ab7 */ NULL, +/* 6ab8 */ NULL, +/* 6ab9 */ NULL, +/* 6aba */ NULL, +/* 6abb */ NULL, +/* 6abc */ NULL, +/* 6abd */ NULL, +/* 6abe */ NULL, +/* 6abf */ NULL, +/* 6ac0 */ NULL, +/* 6ac1 */ NULL, +/* 6ac2 */ NULL, +/* 6ac3 */ NULL, +/* 6ac4 */ NULL, +/* 6ac5 */ NULL, +/* 6ac6 */ NULL, +/* 6ac7 */ NULL, +/* 6ac8 */ NULL, +/* 6ac9 */ NULL, +/* 6aca */ NULL, +/* 6acb */ NULL, +/* 6acc */ NULL, +/* 6acd */ NULL, +/* 6ace */ NULL, +/* 6acf */ NULL, +/* 6ad0 */ NULL, +/* 6ad1 */ NULL, +/* 6ad2 */ NULL, +/* 6ad3 */ NULL, +/* 6ad4 */ NULL, +/* 6ad5 */ NULL, +/* 6ad6 */ NULL, +/* 6ad7 */ NULL, +/* 6ad8 */ NULL, +/* 6ad9 */ NULL, +/* 6ada */ NULL, +/* 6adb */ NULL, +/* 6adc */ NULL, +/* 6add */ NULL, +/* 6ade */ NULL, +/* 6adf */ NULL, +/* 6ae0 */ NULL, +/* 6ae1 */ NULL, +/* 6ae2 */ NULL, +/* 6ae3 */ NULL, +/* 6ae4 */ NULL, +/* 6ae5 */ NULL, +/* 6ae6 */ NULL, +/* 6ae7 */ NULL, +/* 6ae8 */ NULL, +/* 6ae9 */ NULL, +/* 6aea */ NULL, +/* 6aeb */ NULL, +/* 6aec */ NULL, +/* 6aed */ NULL, +/* 6aee */ NULL, +/* 6aef */ NULL, +/* 6af0 */ NULL, +/* 6af1 */ NULL, +/* 6af2 */ NULL, +/* 6af3 */ NULL, +/* 6af4 */ NULL, +/* 6af5 */ NULL, +/* 6af6 */ NULL, +/* 6af7 */ NULL, +/* 6af8 */ NULL, +/* 6af9 */ NULL, +/* 6afa */ NULL, +/* 6afb */ NULL, +/* 6afc */ NULL, +/* 6afd */ NULL, +/* 6afe */ NULL, +/* 6aff */ NULL, +/* 6b00 */ NULL, +/* 6b01 */ NULL, +/* 6b02 */ NULL, +/* 6b03 */ NULL, +/* 6b04 */ NULL, +/* 6b05 */ NULL, +/* 6b06 */ NULL, +/* 6b07 */ NULL, +/* 6b08 */ NULL, +/* 6b09 */ NULL, +/* 6b0a */ NULL, +/* 6b0b */ NULL, +/* 6b0c */ NULL, +/* 6b0d */ NULL, +/* 6b0e */ NULL, +/* 6b0f */ NULL, +/* 6b10 */ NULL, +/* 6b11 */ NULL, +/* 6b12 */ NULL, +/* 6b13 */ NULL, +/* 6b14 */ NULL, +/* 6b15 */ NULL, +/* 6b16 */ NULL, +/* 6b17 */ NULL, +/* 6b18 */ NULL, +/* 6b19 */ NULL, +/* 6b1a */ NULL, +/* 6b1b */ NULL, +/* 6b1c */ NULL, +/* 6b1d */ NULL, +/* 6b1e */ NULL, +/* 6b1f */ NULL, +/* 6b20 */ NULL, +/* 6b21 */ NULL, +/* 6b22 */ NULL, +/* 6b23 */ NULL, +/* 6b24 */ NULL, +/* 6b25 */ NULL, +/* 6b26 */ NULL, +/* 6b27 */ NULL, +/* 6b28 */ NULL, +/* 6b29 */ NULL, +/* 6b2a */ NULL, +/* 6b2b */ NULL, +/* 6b2c */ NULL, +/* 6b2d */ NULL, +/* 6b2e */ NULL, +/* 6b2f */ NULL, +/* 6b30 */ NULL, +/* 6b31 */ NULL, +/* 6b32 */ NULL, +/* 6b33 */ NULL, +/* 6b34 */ NULL, +/* 6b35 */ NULL, +/* 6b36 */ NULL, +/* 6b37 */ NULL, +/* 6b38 */ NULL, +/* 6b39 */ NULL, +/* 6b3a */ NULL, +/* 6b3b */ NULL, +/* 6b3c */ NULL, +/* 6b3d */ NULL, +/* 6b3e */ NULL, +/* 6b3f */ NULL, +/* 6b40 */ NULL, +/* 6b41 */ NULL, +/* 6b42 */ NULL, +/* 6b43 */ NULL, +/* 6b44 */ NULL, +/* 6b45 */ NULL, +/* 6b46 */ NULL, +/* 6b47 */ NULL, +/* 6b48 */ NULL, +/* 6b49 */ NULL, +/* 6b4a */ NULL, +/* 6b4b */ NULL, +/* 6b4c */ NULL, +/* 6b4d */ NULL, +/* 6b4e */ NULL, +/* 6b4f */ NULL, +/* 6b50 */ NULL, +/* 6b51 */ NULL, +/* 6b52 */ NULL, +/* 6b53 */ NULL, +/* 6b54 */ NULL, +/* 6b55 */ NULL, +/* 6b56 */ NULL, +/* 6b57 */ NULL, +/* 6b58 */ NULL, +/* 6b59 */ NULL, +/* 6b5a */ NULL, +/* 6b5b */ NULL, +/* 6b5c */ NULL, +/* 6b5d */ NULL, +/* 6b5e */ NULL, +/* 6b5f */ NULL, +/* 6b60 */ NULL, +/* 6b61 */ NULL, +/* 6b62 */ NULL, +/* 6b63 */ NULL, +/* 6b64 */ NULL, +/* 6b65 */ NULL, +/* 6b66 */ NULL, +/* 6b67 */ NULL, +/* 6b68 */ NULL, +/* 6b69 */ NULL, +/* 6b6a */ NULL, +/* 6b6b */ NULL, +/* 6b6c */ NULL, +/* 6b6d */ NULL, +/* 6b6e */ NULL, +/* 6b6f */ NULL, +/* 6b70 */ NULL, +/* 6b71 */ NULL, +/* 6b72 */ NULL, +/* 6b73 */ NULL, +/* 6b74 */ NULL, +/* 6b75 */ NULL, +/* 6b76 */ NULL, +/* 6b77 */ NULL, +/* 6b78 */ NULL, +/* 6b79 */ NULL, +/* 6b7a */ NULL, +/* 6b7b */ NULL, +/* 6b7c */ NULL, +/* 6b7d */ NULL, +/* 6b7e */ NULL, +/* 6b7f */ NULL, +/* 6b80 */ NULL, +/* 6b81 */ NULL, +/* 6b82 */ NULL, +/* 6b83 */ NULL, +/* 6b84 */ NULL, +/* 6b85 */ NULL, +/* 6b86 */ NULL, +/* 6b87 */ NULL, +/* 6b88 */ NULL, +/* 6b89 */ NULL, +/* 6b8a */ NULL, +/* 6b8b */ NULL, +/* 6b8c */ NULL, +/* 6b8d */ NULL, +/* 6b8e */ NULL, +/* 6b8f */ NULL, +/* 6b90 */ NULL, +/* 6b91 */ NULL, +/* 6b92 */ NULL, +/* 6b93 */ NULL, +/* 6b94 */ NULL, +/* 6b95 */ NULL, +/* 6b96 */ NULL, +/* 6b97 */ NULL, +/* 6b98 */ NULL, +/* 6b99 */ NULL, +/* 6b9a */ NULL, +/* 6b9b */ NULL, +/* 6b9c */ NULL, +/* 6b9d */ NULL, +/* 6b9e */ NULL, +/* 6b9f */ NULL, +/* 6ba0 */ NULL, +/* 6ba1 */ NULL, +/* 6ba2 */ NULL, +/* 6ba3 */ NULL, +/* 6ba4 */ NULL, +/* 6ba5 */ NULL, +/* 6ba6 */ NULL, +/* 6ba7 */ NULL, +/* 6ba8 */ NULL, +/* 6ba9 */ NULL, +/* 6baa */ NULL, +/* 6bab */ NULL, +/* 6bac */ NULL, +/* 6bad */ NULL, +/* 6bae */ NULL, +/* 6baf */ NULL, +/* 6bb0 */ NULL, +/* 6bb1 */ NULL, +/* 6bb2 */ NULL, +/* 6bb3 */ NULL, +/* 6bb4 */ NULL, +/* 6bb5 */ NULL, +/* 6bb6 */ NULL, +/* 6bb7 */ NULL, +/* 6bb8 */ NULL, +/* 6bb9 */ NULL, +/* 6bba */ NULL, +/* 6bbb */ NULL, +/* 6bbc */ NULL, +/* 6bbd */ NULL, +/* 6bbe */ NULL, +/* 6bbf */ NULL, +/* 6bc0 */ NULL, +/* 6bc1 */ NULL, +/* 6bc2 */ NULL, +/* 6bc3 */ NULL, +/* 6bc4 */ NULL, +/* 6bc5 */ NULL, +/* 6bc6 */ NULL, +/* 6bc7 */ NULL, +/* 6bc8 */ NULL, +/* 6bc9 */ NULL, +/* 6bca */ NULL, +/* 6bcb */ NULL, +/* 6bcc */ NULL, +/* 6bcd */ NULL, +/* 6bce */ NULL, +/* 6bcf */ NULL, +/* 6bd0 */ NULL, +/* 6bd1 */ NULL, +/* 6bd2 */ NULL, +/* 6bd3 */ NULL, +/* 6bd4 */ NULL, +/* 6bd5 */ NULL, +/* 6bd6 */ NULL, +/* 6bd7 */ NULL, +/* 6bd8 */ NULL, +/* 6bd9 */ NULL, +/* 6bda */ NULL, +/* 6bdb */ NULL, +/* 6bdc */ NULL, +/* 6bdd */ NULL, +/* 6bde */ NULL, +/* 6bdf */ NULL, +/* 6be0 */ NULL, +/* 6be1 */ NULL, +/* 6be2 */ NULL, +/* 6be3 */ NULL, +/* 6be4 */ NULL, +/* 6be5 */ NULL, +/* 6be6 */ NULL, +/* 6be7 */ NULL, +/* 6be8 */ NULL, +/* 6be9 */ NULL, +/* 6bea */ NULL, +/* 6beb */ NULL, +/* 6bec */ NULL, +/* 6bed */ NULL, +/* 6bee */ NULL, +/* 6bef */ NULL, +/* 6bf0 */ NULL, +/* 6bf1 */ NULL, +/* 6bf2 */ NULL, +/* 6bf3 */ NULL, +/* 6bf4 */ NULL, +/* 6bf5 */ NULL, +/* 6bf6 */ NULL, +/* 6bf7 */ NULL, +/* 6bf8 */ NULL, +/* 6bf9 */ NULL, +/* 6bfa */ NULL, +/* 6bfb */ NULL, +/* 6bfc */ NULL, +/* 6bfd */ NULL, +/* 6bfe */ NULL, +/* 6bff */ NULL, +/* 6c00 */ NULL, +/* 6c01 */ NULL, +/* 6c02 */ NULL, +/* 6c03 */ NULL, +/* 6c04 */ NULL, +/* 6c05 */ NULL, +/* 6c06 */ NULL, +/* 6c07 */ NULL, +/* 6c08 */ NULL, +/* 6c09 */ NULL, +/* 6c0a */ NULL, +/* 6c0b */ NULL, +/* 6c0c */ NULL, +/* 6c0d */ NULL, +/* 6c0e */ NULL, +/* 6c0f */ NULL, +/* 6c10 */ NULL, +/* 6c11 */ NULL, +/* 6c12 */ NULL, +/* 6c13 */ NULL, +/* 6c14 */ NULL, +/* 6c15 */ NULL, +/* 6c16 */ NULL, +/* 6c17 */ NULL, +/* 6c18 */ NULL, +/* 6c19 */ NULL, +/* 6c1a */ NULL, +/* 6c1b */ NULL, +/* 6c1c */ NULL, +/* 6c1d */ NULL, +/* 6c1e */ NULL, +/* 6c1f */ NULL, +/* 6c20 */ NULL, +/* 6c21 */ NULL, +/* 6c22 */ NULL, +/* 6c23 */ NULL, +/* 6c24 */ NULL, +/* 6c25 */ NULL, +/* 6c26 */ NULL, +/* 6c27 */ NULL, +/* 6c28 */ NULL, +/* 6c29 */ NULL, +/* 6c2a */ NULL, +/* 6c2b */ NULL, +/* 6c2c */ NULL, +/* 6c2d */ NULL, +/* 6c2e */ NULL, +/* 6c2f */ NULL, +/* 6c30 */ NULL, +/* 6c31 */ NULL, +/* 6c32 */ NULL, +/* 6c33 */ NULL, +/* 6c34 */ NULL, +/* 6c35 */ NULL, +/* 6c36 */ NULL, +/* 6c37 */ NULL, +/* 6c38 */ NULL, +/* 6c39 */ NULL, +/* 6c3a */ NULL, +/* 6c3b */ NULL, +/* 6c3c */ NULL, +/* 6c3d */ NULL, +/* 6c3e */ NULL, +/* 6c3f */ NULL, +/* 6c40 */ NULL, +/* 6c41 */ NULL, +/* 6c42 */ NULL, +/* 6c43 */ NULL, +/* 6c44 */ NULL, +/* 6c45 */ NULL, +/* 6c46 */ NULL, +/* 6c47 */ NULL, +/* 6c48 */ NULL, +/* 6c49 */ NULL, +/* 6c4a */ NULL, +/* 6c4b */ NULL, +/* 6c4c */ NULL, +/* 6c4d */ NULL, +/* 6c4e */ NULL, +/* 6c4f */ NULL, +/* 6c50 */ NULL, +/* 6c51 */ NULL, +/* 6c52 */ NULL, +/* 6c53 */ NULL, +/* 6c54 */ NULL, +/* 6c55 */ NULL, +/* 6c56 */ NULL, +/* 6c57 */ NULL, +/* 6c58 */ NULL, +/* 6c59 */ NULL, +/* 6c5a */ NULL, +/* 6c5b */ NULL, +/* 6c5c */ NULL, +/* 6c5d */ NULL, +/* 6c5e */ NULL, +/* 6c5f */ NULL, +/* 6c60 */ NULL, +/* 6c61 */ NULL, +/* 6c62 */ NULL, +/* 6c63 */ NULL, +/* 6c64 */ NULL, +/* 6c65 */ NULL, +/* 6c66 */ NULL, +/* 6c67 */ NULL, +/* 6c68 */ NULL, +/* 6c69 */ NULL, +/* 6c6a */ NULL, +/* 6c6b */ NULL, +/* 6c6c */ NULL, +/* 6c6d */ NULL, +/* 6c6e */ NULL, +/* 6c6f */ NULL, +/* 6c70 */ NULL, +/* 6c71 */ NULL, +/* 6c72 */ NULL, +/* 6c73 */ NULL, +/* 6c74 */ NULL, +/* 6c75 */ NULL, +/* 6c76 */ NULL, +/* 6c77 */ NULL, +/* 6c78 */ NULL, +/* 6c79 */ NULL, +/* 6c7a */ NULL, +/* 6c7b */ NULL, +/* 6c7c */ NULL, +/* 6c7d */ NULL, +/* 6c7e */ NULL, +/* 6c7f */ NULL, +/* 6c80 */ NULL, +/* 6c81 */ NULL, +/* 6c82 */ NULL, +/* 6c83 */ NULL, +/* 6c84 */ NULL, +/* 6c85 */ NULL, +/* 6c86 */ NULL, +/* 6c87 */ NULL, +/* 6c88 */ NULL, +/* 6c89 */ NULL, +/* 6c8a */ NULL, +/* 6c8b */ NULL, +/* 6c8c */ NULL, +/* 6c8d */ NULL, +/* 6c8e */ NULL, +/* 6c8f */ NULL, +/* 6c90 */ NULL, +/* 6c91 */ NULL, +/* 6c92 */ NULL, +/* 6c93 */ NULL, +/* 6c94 */ NULL, +/* 6c95 */ NULL, +/* 6c96 */ NULL, +/* 6c97 */ NULL, +/* 6c98 */ NULL, +/* 6c99 */ NULL, +/* 6c9a */ NULL, +/* 6c9b */ NULL, +/* 6c9c */ NULL, +/* 6c9d */ NULL, +/* 6c9e */ NULL, +/* 6c9f */ NULL, +/* 6ca0 */ NULL, +/* 6ca1 */ NULL, +/* 6ca2 */ NULL, +/* 6ca3 */ NULL, +/* 6ca4 */ NULL, +/* 6ca5 */ NULL, +/* 6ca6 */ NULL, +/* 6ca7 */ NULL, +/* 6ca8 */ NULL, +/* 6ca9 */ NULL, +/* 6caa */ NULL, +/* 6cab */ NULL, +/* 6cac */ NULL, +/* 6cad */ NULL, +/* 6cae */ NULL, +/* 6caf */ NULL, +/* 6cb0 */ NULL, +/* 6cb1 */ NULL, +/* 6cb2 */ NULL, +/* 6cb3 */ NULL, +/* 6cb4 */ NULL, +/* 6cb5 */ NULL, +/* 6cb6 */ NULL, +/* 6cb7 */ NULL, +/* 6cb8 */ NULL, +/* 6cb9 */ NULL, +/* 6cba */ NULL, +/* 6cbb */ NULL, +/* 6cbc */ NULL, +/* 6cbd */ NULL, +/* 6cbe */ NULL, +/* 6cbf */ NULL, +/* 6cc0 */ NULL, +/* 6cc1 */ NULL, +/* 6cc2 */ NULL, +/* 6cc3 */ NULL, +/* 6cc4 */ NULL, +/* 6cc5 */ NULL, +/* 6cc6 */ NULL, +/* 6cc7 */ NULL, +/* 6cc8 */ NULL, +/* 6cc9 */ NULL, +/* 6cca */ NULL, +/* 6ccb */ NULL, +/* 6ccc */ NULL, +/* 6ccd */ NULL, +/* 6cce */ NULL, +/* 6ccf */ NULL, +/* 6cd0 */ NULL, +/* 6cd1 */ NULL, +/* 6cd2 */ NULL, +/* 6cd3 */ NULL, +/* 6cd4 */ NULL, +/* 6cd5 */ NULL, +/* 6cd6 */ NULL, +/* 6cd7 */ NULL, +/* 6cd8 */ NULL, +/* 6cd9 */ NULL, +/* 6cda */ NULL, +/* 6cdb */ NULL, +/* 6cdc */ NULL, +/* 6cdd */ NULL, +/* 6cde */ NULL, +/* 6cdf */ NULL, +/* 6ce0 */ NULL, +/* 6ce1 */ NULL, +/* 6ce2 */ NULL, +/* 6ce3 */ NULL, +/* 6ce4 */ NULL, +/* 6ce5 */ NULL, +/* 6ce6 */ NULL, +/* 6ce7 */ NULL, +/* 6ce8 */ NULL, +/* 6ce9 */ NULL, +/* 6cea */ NULL, +/* 6ceb */ NULL, +/* 6cec */ NULL, +/* 6ced */ NULL, +/* 6cee */ NULL, +/* 6cef */ NULL, +/* 6cf0 */ NULL, +/* 6cf1 */ NULL, +/* 6cf2 */ NULL, +/* 6cf3 */ NULL, +/* 6cf4 */ NULL, +/* 6cf5 */ NULL, +/* 6cf6 */ NULL, +/* 6cf7 */ NULL, +/* 6cf8 */ NULL, +/* 6cf9 */ NULL, +/* 6cfa */ NULL, +/* 6cfb */ NULL, +/* 6cfc */ NULL, +/* 6cfd */ NULL, +/* 6cfe */ NULL, +/* 6cff */ NULL, +/* 6d00 */ NULL, +/* 6d01 */ NULL, +/* 6d02 */ NULL, +/* 6d03 */ NULL, +/* 6d04 */ NULL, +/* 6d05 */ NULL, +/* 6d06 */ NULL, +/* 6d07 */ NULL, +/* 6d08 */ NULL, +/* 6d09 */ NULL, +/* 6d0a */ NULL, +/* 6d0b */ NULL, +/* 6d0c */ NULL, +/* 6d0d */ NULL, +/* 6d0e */ NULL, +/* 6d0f */ NULL, +/* 6d10 */ NULL, +/* 6d11 */ NULL, +/* 6d12 */ NULL, +/* 6d13 */ NULL, +/* 6d14 */ NULL, +/* 6d15 */ NULL, +/* 6d16 */ NULL, +/* 6d17 */ NULL, +/* 6d18 */ NULL, +/* 6d19 */ NULL, +/* 6d1a */ NULL, +/* 6d1b */ NULL, +/* 6d1c */ NULL, +/* 6d1d */ NULL, +/* 6d1e */ NULL, +/* 6d1f */ NULL, +/* 6d20 */ NULL, +/* 6d21 */ NULL, +/* 6d22 */ NULL, +/* 6d23 */ NULL, +/* 6d24 */ NULL, +/* 6d25 */ NULL, +/* 6d26 */ NULL, +/* 6d27 */ NULL, +/* 6d28 */ NULL, +/* 6d29 */ NULL, +/* 6d2a */ NULL, +/* 6d2b */ NULL, +/* 6d2c */ NULL, +/* 6d2d */ NULL, +/* 6d2e */ NULL, +/* 6d2f */ NULL, +/* 6d30 */ NULL, +/* 6d31 */ NULL, +/* 6d32 */ NULL, +/* 6d33 */ NULL, +/* 6d34 */ NULL, +/* 6d35 */ NULL, +/* 6d36 */ NULL, +/* 6d37 */ NULL, +/* 6d38 */ NULL, +/* 6d39 */ NULL, +/* 6d3a */ NULL, +/* 6d3b */ NULL, +/* 6d3c */ NULL, +/* 6d3d */ NULL, +/* 6d3e */ NULL, +/* 6d3f */ NULL, +/* 6d40 */ NULL, +/* 6d41 */ NULL, +/* 6d42 */ NULL, +/* 6d43 */ NULL, +/* 6d44 */ NULL, +/* 6d45 */ NULL, +/* 6d46 */ NULL, +/* 6d47 */ NULL, +/* 6d48 */ NULL, +/* 6d49 */ NULL, +/* 6d4a */ NULL, +/* 6d4b */ NULL, +/* 6d4c */ NULL, +/* 6d4d */ NULL, +/* 6d4e */ NULL, +/* 6d4f */ NULL, +/* 6d50 */ NULL, +/* 6d51 */ NULL, +/* 6d52 */ NULL, +/* 6d53 */ NULL, +/* 6d54 */ NULL, +/* 6d55 */ NULL, +/* 6d56 */ NULL, +/* 6d57 */ NULL, +/* 6d58 */ NULL, +/* 6d59 */ NULL, +/* 6d5a */ NULL, +/* 6d5b */ NULL, +/* 6d5c */ NULL, +/* 6d5d */ NULL, +/* 6d5e */ NULL, +/* 6d5f */ NULL, +/* 6d60 */ NULL, +/* 6d61 */ NULL, +/* 6d62 */ NULL, +/* 6d63 */ NULL, +/* 6d64 */ NULL, +/* 6d65 */ NULL, +/* 6d66 */ NULL, +/* 6d67 */ NULL, +/* 6d68 */ NULL, +/* 6d69 */ NULL, +/* 6d6a */ NULL, +/* 6d6b */ NULL, +/* 6d6c */ NULL, +/* 6d6d */ NULL, +/* 6d6e */ NULL, +/* 6d6f */ NULL, +/* 6d70 */ NULL, +/* 6d71 */ NULL, +/* 6d72 */ NULL, +/* 6d73 */ NULL, +/* 6d74 */ NULL, +/* 6d75 */ NULL, +/* 6d76 */ NULL, +/* 6d77 */ NULL, +/* 6d78 */ NULL, +/* 6d79 */ NULL, +/* 6d7a */ NULL, +/* 6d7b */ NULL, +/* 6d7c */ NULL, +/* 6d7d */ NULL, +/* 6d7e */ NULL, +/* 6d7f */ NULL, +/* 6d80 */ NULL, +/* 6d81 */ NULL, +/* 6d82 */ NULL, +/* 6d83 */ NULL, +/* 6d84 */ NULL, +/* 6d85 */ NULL, +/* 6d86 */ NULL, +/* 6d87 */ NULL, +/* 6d88 */ NULL, +/* 6d89 */ NULL, +/* 6d8a */ NULL, +/* 6d8b */ NULL, +/* 6d8c */ NULL, +/* 6d8d */ NULL, +/* 6d8e */ NULL, +/* 6d8f */ NULL, +/* 6d90 */ NULL, +/* 6d91 */ NULL, +/* 6d92 */ NULL, +/* 6d93 */ NULL, +/* 6d94 */ NULL, +/* 6d95 */ NULL, +/* 6d96 */ NULL, +/* 6d97 */ NULL, +/* 6d98 */ NULL, +/* 6d99 */ NULL, +/* 6d9a */ NULL, +/* 6d9b */ NULL, +/* 6d9c */ NULL, +/* 6d9d */ NULL, +/* 6d9e */ NULL, +/* 6d9f */ NULL, +/* 6da0 */ NULL, +/* 6da1 */ NULL, +/* 6da2 */ NULL, +/* 6da3 */ NULL, +/* 6da4 */ NULL, +/* 6da5 */ NULL, +/* 6da6 */ NULL, +/* 6da7 */ NULL, +/* 6da8 */ NULL, +/* 6da9 */ NULL, +/* 6daa */ NULL, +/* 6dab */ NULL, +/* 6dac */ NULL, +/* 6dad */ NULL, +/* 6dae */ NULL, +/* 6daf */ NULL, +/* 6db0 */ NULL, +/* 6db1 */ NULL, +/* 6db2 */ NULL, +/* 6db3 */ NULL, +/* 6db4 */ NULL, +/* 6db5 */ NULL, +/* 6db6 */ NULL, +/* 6db7 */ NULL, +/* 6db8 */ NULL, +/* 6db9 */ NULL, +/* 6dba */ NULL, +/* 6dbb */ NULL, +/* 6dbc */ NULL, +/* 6dbd */ NULL, +/* 6dbe */ NULL, +/* 6dbf */ NULL, +/* 6dc0 */ NULL, +/* 6dc1 */ NULL, +/* 6dc2 */ NULL, +/* 6dc3 */ NULL, +/* 6dc4 */ NULL, +/* 6dc5 */ NULL, +/* 6dc6 */ NULL, +/* 6dc7 */ NULL, +/* 6dc8 */ NULL, +/* 6dc9 */ NULL, +/* 6dca */ NULL, +/* 6dcb */ NULL, +/* 6dcc */ NULL, +/* 6dcd */ NULL, +/* 6dce */ NULL, +/* 6dcf */ NULL, +/* 6dd0 */ NULL, +/* 6dd1 */ NULL, +/* 6dd2 */ NULL, +/* 6dd3 */ NULL, +/* 6dd4 */ NULL, +/* 6dd5 */ NULL, +/* 6dd6 */ NULL, +/* 6dd7 */ NULL, +/* 6dd8 */ NULL, +/* 6dd9 */ NULL, +/* 6dda */ NULL, +/* 6ddb */ NULL, +/* 6ddc */ NULL, +/* 6ddd */ NULL, +/* 6dde */ NULL, +/* 6ddf */ NULL, +/* 6de0 */ NULL, +/* 6de1 */ NULL, +/* 6de2 */ NULL, +/* 6de3 */ NULL, +/* 6de4 */ NULL, +/* 6de5 */ NULL, +/* 6de6 */ NULL, +/* 6de7 */ NULL, +/* 6de8 */ NULL, +/* 6de9 */ NULL, +/* 6dea */ NULL, +/* 6deb */ NULL, +/* 6dec */ NULL, +/* 6ded */ NULL, +/* 6dee */ NULL, +/* 6def */ NULL, +/* 6df0 */ NULL, +/* 6df1 */ NULL, +/* 6df2 */ NULL, +/* 6df3 */ NULL, +/* 6df4 */ NULL, +/* 6df5 */ NULL, +/* 6df6 */ NULL, +/* 6df7 */ NULL, +/* 6df8 */ NULL, +/* 6df9 */ NULL, +/* 6dfa */ NULL, +/* 6dfb */ NULL, +/* 6dfc */ NULL, +/* 6dfd */ NULL, +/* 6dfe */ NULL, +/* 6dff */ NULL, +/* 6e00 */ NULL, +/* 6e01 */ NULL, +/* 6e02 */ NULL, +/* 6e03 */ NULL, +/* 6e04 */ NULL, +/* 6e05 */ NULL, +/* 6e06 */ NULL, +/* 6e07 */ NULL, +/* 6e08 */ NULL, +/* 6e09 */ NULL, +/* 6e0a */ NULL, +/* 6e0b */ NULL, +/* 6e0c */ NULL, +/* 6e0d */ NULL, +/* 6e0e */ NULL, +/* 6e0f */ NULL, +/* 6e10 */ NULL, +/* 6e11 */ NULL, +/* 6e12 */ NULL, +/* 6e13 */ NULL, +/* 6e14 */ NULL, +/* 6e15 */ NULL, +/* 6e16 */ NULL, +/* 6e17 */ NULL, +/* 6e18 */ NULL, +/* 6e19 */ NULL, +/* 6e1a */ NULL, +/* 6e1b */ NULL, +/* 6e1c */ NULL, +/* 6e1d */ NULL, +/* 6e1e */ NULL, +/* 6e1f */ NULL, +/* 6e20 */ NULL, +/* 6e21 */ NULL, +/* 6e22 */ NULL, +/* 6e23 */ NULL, +/* 6e24 */ NULL, +/* 6e25 */ NULL, +/* 6e26 */ NULL, +/* 6e27 */ NULL, +/* 6e28 */ NULL, +/* 6e29 */ NULL, +/* 6e2a */ NULL, +/* 6e2b */ NULL, +/* 6e2c */ NULL, +/* 6e2d */ NULL, +/* 6e2e */ NULL, +/* 6e2f */ NULL, +/* 6e30 */ NULL, +/* 6e31 */ NULL, +/* 6e32 */ NULL, +/* 6e33 */ NULL, +/* 6e34 */ NULL, +/* 6e35 */ NULL, +/* 6e36 */ NULL, +/* 6e37 */ NULL, +/* 6e38 */ NULL, +/* 6e39 */ NULL, +/* 6e3a */ NULL, +/* 6e3b */ NULL, +/* 6e3c */ NULL, +/* 6e3d */ NULL, +/* 6e3e */ NULL, +/* 6e3f */ NULL, +/* 6e40 */ NULL, +/* 6e41 */ NULL, +/* 6e42 */ NULL, +/* 6e43 */ NULL, +/* 6e44 */ NULL, +/* 6e45 */ NULL, +/* 6e46 */ NULL, +/* 6e47 */ NULL, +/* 6e48 */ NULL, +/* 6e49 */ NULL, +/* 6e4a */ NULL, +/* 6e4b */ NULL, +/* 6e4c */ NULL, +/* 6e4d */ NULL, +/* 6e4e */ NULL, +/* 6e4f */ NULL, +/* 6e50 */ NULL, +/* 6e51 */ NULL, +/* 6e52 */ NULL, +/* 6e53 */ NULL, +/* 6e54 */ NULL, +/* 6e55 */ NULL, +/* 6e56 */ NULL, +/* 6e57 */ NULL, +/* 6e58 */ NULL, +/* 6e59 */ NULL, +/* 6e5a */ NULL, +/* 6e5b */ NULL, +/* 6e5c */ NULL, +/* 6e5d */ NULL, +/* 6e5e */ NULL, +/* 6e5f */ NULL, +/* 6e60 */ NULL, +/* 6e61 */ NULL, +/* 6e62 */ NULL, +/* 6e63 */ NULL, +/* 6e64 */ NULL, +/* 6e65 */ NULL, +/* 6e66 */ NULL, +/* 6e67 */ NULL, +/* 6e68 */ NULL, +/* 6e69 */ NULL, +/* 6e6a */ NULL, +/* 6e6b */ NULL, +/* 6e6c */ NULL, +/* 6e6d */ NULL, +/* 6e6e */ NULL, +/* 6e6f */ NULL, +/* 6e70 */ NULL, +/* 6e71 */ NULL, +/* 6e72 */ NULL, +/* 6e73 */ NULL, +/* 6e74 */ NULL, +/* 6e75 */ NULL, +/* 6e76 */ NULL, +/* 6e77 */ NULL, +/* 6e78 */ NULL, +/* 6e79 */ NULL, +/* 6e7a */ NULL, +/* 6e7b */ NULL, +/* 6e7c */ NULL, +/* 6e7d */ NULL, +/* 6e7e */ NULL, +/* 6e7f */ NULL, +/* 6e80 */ NULL, +/* 6e81 */ NULL, +/* 6e82 */ NULL, +/* 6e83 */ NULL, +/* 6e84 */ NULL, +/* 6e85 */ NULL, +/* 6e86 */ NULL, +/* 6e87 */ NULL, +/* 6e88 */ NULL, +/* 6e89 */ NULL, +/* 6e8a */ NULL, +/* 6e8b */ NULL, +/* 6e8c */ NULL, +/* 6e8d */ NULL, +/* 6e8e */ NULL, +/* 6e8f */ NULL, +/* 6e90 */ NULL, +/* 6e91 */ NULL, +/* 6e92 */ NULL, +/* 6e93 */ NULL, +/* 6e94 */ NULL, +/* 6e95 */ NULL, +/* 6e96 */ NULL, +/* 6e97 */ NULL, +/* 6e98 */ NULL, +/* 6e99 */ NULL, +/* 6e9a */ NULL, +/* 6e9b */ NULL, +/* 6e9c */ NULL, +/* 6e9d */ NULL, +/* 6e9e */ NULL, +/* 6e9f */ NULL, +/* 6ea0 */ NULL, +/* 6ea1 */ NULL, +/* 6ea2 */ NULL, +/* 6ea3 */ NULL, +/* 6ea4 */ NULL, +/* 6ea5 */ NULL, +/* 6ea6 */ NULL, +/* 6ea7 */ NULL, +/* 6ea8 */ NULL, +/* 6ea9 */ NULL, +/* 6eaa */ NULL, +/* 6eab */ NULL, +/* 6eac */ NULL, +/* 6ead */ NULL, +/* 6eae */ NULL, +/* 6eaf */ NULL, +/* 6eb0 */ NULL, +/* 6eb1 */ NULL, +/* 6eb2 */ NULL, +/* 6eb3 */ NULL, +/* 6eb4 */ NULL, +/* 6eb5 */ NULL, +/* 6eb6 */ NULL, +/* 6eb7 */ NULL, +/* 6eb8 */ NULL, +/* 6eb9 */ NULL, +/* 6eba */ NULL, +/* 6ebb */ NULL, +/* 6ebc */ NULL, +/* 6ebd */ NULL, +/* 6ebe */ NULL, +/* 6ebf */ NULL, +/* 6ec0 */ NULL, +/* 6ec1 */ NULL, +/* 6ec2 */ NULL, +/* 6ec3 */ NULL, +/* 6ec4 */ NULL, +/* 6ec5 */ NULL, +/* 6ec6 */ NULL, +/* 6ec7 */ NULL, +/* 6ec8 */ NULL, +/* 6ec9 */ NULL, +/* 6eca */ NULL, +/* 6ecb */ NULL, +/* 6ecc */ NULL, +/* 6ecd */ NULL, +/* 6ece */ NULL, +/* 6ecf */ NULL, +/* 6ed0 */ NULL, +/* 6ed1 */ NULL, +/* 6ed2 */ NULL, +/* 6ed3 */ NULL, +/* 6ed4 */ NULL, +/* 6ed5 */ NULL, +/* 6ed6 */ NULL, +/* 6ed7 */ NULL, +/* 6ed8 */ NULL, +/* 6ed9 */ NULL, +/* 6eda */ NULL, +/* 6edb */ NULL, +/* 6edc */ NULL, +/* 6edd */ NULL, +/* 6ede */ NULL, +/* 6edf */ NULL, +/* 6ee0 */ NULL, +/* 6ee1 */ NULL, +/* 6ee2 */ NULL, +/* 6ee3 */ NULL, +/* 6ee4 */ NULL, +/* 6ee5 */ NULL, +/* 6ee6 */ NULL, +/* 6ee7 */ NULL, +/* 6ee8 */ NULL, +/* 6ee9 */ NULL, +/* 6eea */ NULL, +/* 6eeb */ NULL, +/* 6eec */ NULL, +/* 6eed */ NULL, +/* 6eee */ NULL, +/* 6eef */ NULL, +/* 6ef0 */ NULL, +/* 6ef1 */ NULL, +/* 6ef2 */ NULL, +/* 6ef3 */ NULL, +/* 6ef4 */ NULL, +/* 6ef5 */ NULL, +/* 6ef6 */ NULL, +/* 6ef7 */ NULL, +/* 6ef8 */ NULL, +/* 6ef9 */ NULL, +/* 6efa */ NULL, +/* 6efb */ NULL, +/* 6efc */ NULL, +/* 6efd */ NULL, +/* 6efe */ NULL, +/* 6eff */ NULL, +/* 6f00 */ NULL, +/* 6f01 */ NULL, +/* 6f02 */ NULL, +/* 6f03 */ NULL, +/* 6f04 */ NULL, +/* 6f05 */ NULL, +/* 6f06 */ NULL, +/* 6f07 */ NULL, +/* 6f08 */ NULL, +/* 6f09 */ NULL, +/* 6f0a */ NULL, +/* 6f0b */ NULL, +/* 6f0c */ NULL, +/* 6f0d */ NULL, +/* 6f0e */ NULL, +/* 6f0f */ NULL, +/* 6f10 */ NULL, +/* 6f11 */ NULL, +/* 6f12 */ NULL, +/* 6f13 */ NULL, +/* 6f14 */ NULL, +/* 6f15 */ NULL, +/* 6f16 */ NULL, +/* 6f17 */ NULL, +/* 6f18 */ NULL, +/* 6f19 */ NULL, +/* 6f1a */ NULL, +/* 6f1b */ NULL, +/* 6f1c */ NULL, +/* 6f1d */ NULL, +/* 6f1e */ NULL, +/* 6f1f */ NULL, +/* 6f20 */ NULL, +/* 6f21 */ NULL, +/* 6f22 */ NULL, +/* 6f23 */ NULL, +/* 6f24 */ NULL, +/* 6f25 */ NULL, +/* 6f26 */ NULL, +/* 6f27 */ NULL, +/* 6f28 */ NULL, +/* 6f29 */ NULL, +/* 6f2a */ NULL, +/* 6f2b */ NULL, +/* 6f2c */ NULL, +/* 6f2d */ NULL, +/* 6f2e */ NULL, +/* 6f2f */ NULL, +/* 6f30 */ NULL, +/* 6f31 */ NULL, +/* 6f32 */ NULL, +/* 6f33 */ NULL, +/* 6f34 */ NULL, +/* 6f35 */ NULL, +/* 6f36 */ NULL, +/* 6f37 */ NULL, +/* 6f38 */ NULL, +/* 6f39 */ NULL, +/* 6f3a */ NULL, +/* 6f3b */ NULL, +/* 6f3c */ NULL, +/* 6f3d */ NULL, +/* 6f3e */ NULL, +/* 6f3f */ NULL, +/* 6f40 */ NULL, +/* 6f41 */ NULL, +/* 6f42 */ NULL, +/* 6f43 */ NULL, +/* 6f44 */ NULL, +/* 6f45 */ NULL, +/* 6f46 */ NULL, +/* 6f47 */ NULL, +/* 6f48 */ NULL, +/* 6f49 */ NULL, +/* 6f4a */ NULL, +/* 6f4b */ NULL, +/* 6f4c */ NULL, +/* 6f4d */ NULL, +/* 6f4e */ NULL, +/* 6f4f */ NULL, +/* 6f50 */ NULL, +/* 6f51 */ NULL, +/* 6f52 */ NULL, +/* 6f53 */ NULL, +/* 6f54 */ NULL, +/* 6f55 */ NULL, +/* 6f56 */ NULL, +/* 6f57 */ NULL, +/* 6f58 */ NULL, +/* 6f59 */ NULL, +/* 6f5a */ NULL, +/* 6f5b */ NULL, +/* 6f5c */ NULL, +/* 6f5d */ NULL, +/* 6f5e */ NULL, +/* 6f5f */ NULL, +/* 6f60 */ NULL, +/* 6f61 */ NULL, +/* 6f62 */ NULL, +/* 6f63 */ NULL, +/* 6f64 */ NULL, +/* 6f65 */ NULL, +/* 6f66 */ NULL, +/* 6f67 */ NULL, +/* 6f68 */ NULL, +/* 6f69 */ NULL, +/* 6f6a */ NULL, +/* 6f6b */ NULL, +/* 6f6c */ NULL, +/* 6f6d */ NULL, +/* 6f6e */ NULL, +/* 6f6f */ NULL, +/* 6f70 */ NULL, +/* 6f71 */ NULL, +/* 6f72 */ NULL, +/* 6f73 */ NULL, +/* 6f74 */ NULL, +/* 6f75 */ NULL, +/* 6f76 */ NULL, +/* 6f77 */ NULL, +/* 6f78 */ NULL, +/* 6f79 */ NULL, +/* 6f7a */ NULL, +/* 6f7b */ NULL, +/* 6f7c */ NULL, +/* 6f7d */ NULL, +/* 6f7e */ NULL, +/* 6f7f */ NULL, +/* 6f80 */ NULL, +/* 6f81 */ NULL, +/* 6f82 */ NULL, +/* 6f83 */ NULL, +/* 6f84 */ NULL, +/* 6f85 */ NULL, +/* 6f86 */ NULL, +/* 6f87 */ NULL, +/* 6f88 */ NULL, +/* 6f89 */ NULL, +/* 6f8a */ NULL, +/* 6f8b */ NULL, +/* 6f8c */ NULL, +/* 6f8d */ NULL, +/* 6f8e */ NULL, +/* 6f8f */ NULL, +/* 6f90 */ NULL, +/* 6f91 */ NULL, +/* 6f92 */ NULL, +/* 6f93 */ NULL, +/* 6f94 */ NULL, +/* 6f95 */ NULL, +/* 6f96 */ NULL, +/* 6f97 */ NULL, +/* 6f98 */ NULL, +/* 6f99 */ NULL, +/* 6f9a */ NULL, +/* 6f9b */ NULL, +/* 6f9c */ NULL, +/* 6f9d */ NULL, +/* 6f9e */ NULL, +/* 6f9f */ NULL, +/* 6fa0 */ NULL, +/* 6fa1 */ NULL, +/* 6fa2 */ NULL, +/* 6fa3 */ NULL, +/* 6fa4 */ NULL, +/* 6fa5 */ NULL, +/* 6fa6 */ NULL, +/* 6fa7 */ NULL, +/* 6fa8 */ NULL, +/* 6fa9 */ NULL, +/* 6faa */ NULL, +/* 6fab */ NULL, +/* 6fac */ NULL, +/* 6fad */ NULL, +/* 6fae */ NULL, +/* 6faf */ NULL, +/* 6fb0 */ NULL, +/* 6fb1 */ NULL, +/* 6fb2 */ NULL, +/* 6fb3 */ NULL, +/* 6fb4 */ NULL, +/* 6fb5 */ NULL, +/* 6fb6 */ NULL, +/* 6fb7 */ NULL, +/* 6fb8 */ NULL, +/* 6fb9 */ NULL, +/* 6fba */ NULL, +/* 6fbb */ NULL, +/* 6fbc */ NULL, +/* 6fbd */ NULL, +/* 6fbe */ NULL, +/* 6fbf */ NULL, +/* 6fc0 */ NULL, +/* 6fc1 */ NULL, +/* 6fc2 */ NULL, +/* 6fc3 */ NULL, +/* 6fc4 */ NULL, +/* 6fc5 */ NULL, +/* 6fc6 */ NULL, +/* 6fc7 */ NULL, +/* 6fc8 */ NULL, +/* 6fc9 */ NULL, +/* 6fca */ NULL, +/* 6fcb */ NULL, +/* 6fcc */ NULL, +/* 6fcd */ NULL, +/* 6fce */ NULL, +/* 6fcf */ NULL, +/* 6fd0 */ NULL, +/* 6fd1 */ NULL, +/* 6fd2 */ NULL, +/* 6fd3 */ NULL, +/* 6fd4 */ NULL, +/* 6fd5 */ NULL, +/* 6fd6 */ NULL, +/* 6fd7 */ NULL, +/* 6fd8 */ NULL, +/* 6fd9 */ NULL, +/* 6fda */ NULL, +/* 6fdb */ NULL, +/* 6fdc */ NULL, +/* 6fdd */ NULL, +/* 6fde */ NULL, +/* 6fdf */ NULL, +/* 6fe0 */ NULL, +/* 6fe1 */ NULL, +/* 6fe2 */ NULL, +/* 6fe3 */ NULL, +/* 6fe4 */ NULL, +/* 6fe5 */ NULL, +/* 6fe6 */ NULL, +/* 6fe7 */ NULL, +/* 6fe8 */ NULL, +/* 6fe9 */ NULL, +/* 6fea */ NULL, +/* 6feb */ NULL, +/* 6fec */ NULL, +/* 6fed */ NULL, +/* 6fee */ NULL, +/* 6fef */ NULL, +/* 6ff0 */ NULL, +/* 6ff1 */ NULL, +/* 6ff2 */ NULL, +/* 6ff3 */ NULL, +/* 6ff4 */ NULL, +/* 6ff5 */ NULL, +/* 6ff6 */ NULL, +/* 6ff7 */ NULL, +/* 6ff8 */ NULL, +/* 6ff9 */ NULL, +/* 6ffa */ NULL, +/* 6ffb */ NULL, +/* 6ffc */ NULL, +/* 6ffd */ NULL, +/* 6ffe */ NULL, +/* 6fff */ NULL, +/* 7000 */ NULL, +/* 7001 */ NULL, +/* 7002 */ NULL, +/* 7003 */ NULL, +/* 7004 */ NULL, +/* 7005 */ NULL, +/* 7006 */ NULL, +/* 7007 */ NULL, +/* 7008 */ NULL, +/* 7009 */ NULL, +/* 700a */ NULL, +/* 700b */ NULL, +/* 700c */ NULL, +/* 700d */ NULL, +/* 700e */ NULL, +/* 700f */ NULL, +/* 7010 */ NULL, +/* 7011 */ NULL, +/* 7012 */ NULL, +/* 7013 */ NULL, +/* 7014 */ NULL, +/* 7015 */ NULL, +/* 7016 */ NULL, +/* 7017 */ NULL, +/* 7018 */ NULL, +/* 7019 */ NULL, +/* 701a */ NULL, +/* 701b */ NULL, +/* 701c */ NULL, +/* 701d */ NULL, +/* 701e */ NULL, +/* 701f */ NULL, +/* 7020 */ NULL, +/* 7021 */ NULL, +/* 7022 */ NULL, +/* 7023 */ NULL, +/* 7024 */ NULL, +/* 7025 */ NULL, +/* 7026 */ NULL, +/* 7027 */ NULL, +/* 7028 */ NULL, +/* 7029 */ NULL, +/* 702a */ NULL, +/* 702b */ NULL, +/* 702c */ NULL, +/* 702d */ NULL, +/* 702e */ NULL, +/* 702f */ NULL, +/* 7030 */ NULL, +/* 7031 */ NULL, +/* 7032 */ NULL, +/* 7033 */ NULL, +/* 7034 */ NULL, +/* 7035 */ NULL, +/* 7036 */ NULL, +/* 7037 */ NULL, +/* 7038 */ NULL, +/* 7039 */ NULL, +/* 703a */ NULL, +/* 703b */ NULL, +/* 703c */ NULL, +/* 703d */ NULL, +/* 703e */ NULL, +/* 703f */ NULL, +/* 7040 */ NULL, +/* 7041 */ NULL, +/* 7042 */ NULL, +/* 7043 */ NULL, +/* 7044 */ NULL, +/* 7045 */ NULL, +/* 7046 */ NULL, +/* 7047 */ NULL, +/* 7048 */ NULL, +/* 7049 */ NULL, +/* 704a */ NULL, +/* 704b */ NULL, +/* 704c */ NULL, +/* 704d */ NULL, +/* 704e */ NULL, +/* 704f */ NULL, +/* 7050 */ NULL, +/* 7051 */ NULL, +/* 7052 */ NULL, +/* 7053 */ NULL, +/* 7054 */ NULL, +/* 7055 */ NULL, +/* 7056 */ NULL, +/* 7057 */ NULL, +/* 7058 */ NULL, +/* 7059 */ NULL, +/* 705a */ NULL, +/* 705b */ NULL, +/* 705c */ NULL, +/* 705d */ NULL, +/* 705e */ NULL, +/* 705f */ NULL, +/* 7060 */ NULL, +/* 7061 */ NULL, +/* 7062 */ NULL, +/* 7063 */ NULL, +/* 7064 */ NULL, +/* 7065 */ NULL, +/* 7066 */ NULL, +/* 7067 */ NULL, +/* 7068 */ NULL, +/* 7069 */ NULL, +/* 706a */ NULL, +/* 706b */ NULL, +/* 706c */ NULL, +/* 706d */ NULL, +/* 706e */ NULL, +/* 706f */ NULL, +/* 7070 */ NULL, +/* 7071 */ NULL, +/* 7072 */ NULL, +/* 7073 */ NULL, +/* 7074 */ NULL, +/* 7075 */ NULL, +/* 7076 */ NULL, +/* 7077 */ NULL, +/* 7078 */ NULL, +/* 7079 */ NULL, +/* 707a */ NULL, +/* 707b */ NULL, +/* 707c */ NULL, +/* 707d */ NULL, +/* 707e */ NULL, +/* 707f */ NULL, +/* 7080 */ NULL, +/* 7081 */ NULL, +/* 7082 */ NULL, +/* 7083 */ NULL, +/* 7084 */ NULL, +/* 7085 */ NULL, +/* 7086 */ NULL, +/* 7087 */ NULL, +/* 7088 */ NULL, +/* 7089 */ NULL, +/* 708a */ NULL, +/* 708b */ NULL, +/* 708c */ NULL, +/* 708d */ NULL, +/* 708e */ NULL, +/* 708f */ NULL, +/* 7090 */ NULL, +/* 7091 */ NULL, +/* 7092 */ NULL, +/* 7093 */ NULL, +/* 7094 */ NULL, +/* 7095 */ NULL, +/* 7096 */ NULL, +/* 7097 */ NULL, +/* 7098 */ NULL, +/* 7099 */ NULL, +/* 709a */ NULL, +/* 709b */ NULL, +/* 709c */ NULL, +/* 709d */ NULL, +/* 709e */ NULL, +/* 709f */ NULL, +/* 70a0 */ NULL, +/* 70a1 */ NULL, +/* 70a2 */ NULL, +/* 70a3 */ NULL, +/* 70a4 */ NULL, +/* 70a5 */ NULL, +/* 70a6 */ NULL, +/* 70a7 */ NULL, +/* 70a8 */ NULL, +/* 70a9 */ NULL, +/* 70aa */ NULL, +/* 70ab */ NULL, +/* 70ac */ NULL, +/* 70ad */ NULL, +/* 70ae */ NULL, +/* 70af */ NULL, +/* 70b0 */ NULL, +/* 70b1 */ NULL, +/* 70b2 */ NULL, +/* 70b3 */ NULL, +/* 70b4 */ NULL, +/* 70b5 */ NULL, +/* 70b6 */ NULL, +/* 70b7 */ NULL, +/* 70b8 */ NULL, +/* 70b9 */ NULL, +/* 70ba */ NULL, +/* 70bb */ NULL, +/* 70bc */ NULL, +/* 70bd */ NULL, +/* 70be */ NULL, +/* 70bf */ NULL, +/* 70c0 */ NULL, +/* 70c1 */ NULL, +/* 70c2 */ NULL, +/* 70c3 */ NULL, +/* 70c4 */ NULL, +/* 70c5 */ NULL, +/* 70c6 */ NULL, +/* 70c7 */ NULL, +/* 70c8 */ NULL, +/* 70c9 */ NULL, +/* 70ca */ NULL, +/* 70cb */ NULL, +/* 70cc */ NULL, +/* 70cd */ NULL, +/* 70ce */ NULL, +/* 70cf */ NULL, +/* 70d0 */ NULL, +/* 70d1 */ NULL, +/* 70d2 */ NULL, +/* 70d3 */ NULL, +/* 70d4 */ NULL, +/* 70d5 */ NULL, +/* 70d6 */ NULL, +/* 70d7 */ NULL, +/* 70d8 */ NULL, +/* 70d9 */ NULL, +/* 70da */ NULL, +/* 70db */ NULL, +/* 70dc */ NULL, +/* 70dd */ NULL, +/* 70de */ NULL, +/* 70df */ NULL, +/* 70e0 */ NULL, +/* 70e1 */ NULL, +/* 70e2 */ NULL, +/* 70e3 */ NULL, +/* 70e4 */ NULL, +/* 70e5 */ NULL, +/* 70e6 */ NULL, +/* 70e7 */ NULL, +/* 70e8 */ NULL, +/* 70e9 */ NULL, +/* 70ea */ NULL, +/* 70eb */ NULL, +/* 70ec */ NULL, +/* 70ed */ NULL, +/* 70ee */ NULL, +/* 70ef */ NULL, +/* 70f0 */ NULL, +/* 70f1 */ NULL, +/* 70f2 */ NULL, +/* 70f3 */ NULL, +/* 70f4 */ NULL, +/* 70f5 */ NULL, +/* 70f6 */ NULL, +/* 70f7 */ NULL, +/* 70f8 */ NULL, +/* 70f9 */ NULL, +/* 70fa */ NULL, +/* 70fb */ NULL, +/* 70fc */ NULL, +/* 70fd */ NULL, +/* 70fe */ NULL, +/* 70ff */ NULL, +/* 7100 */ NULL, +/* 7101 */ NULL, +/* 7102 */ NULL, +/* 7103 */ NULL, +/* 7104 */ NULL, +/* 7105 */ NULL, +/* 7106 */ NULL, +/* 7107 */ NULL, +/* 7108 */ NULL, +/* 7109 */ NULL, +/* 710a */ NULL, +/* 710b */ NULL, +/* 710c */ NULL, +/* 710d */ NULL, +/* 710e */ NULL, +/* 710f */ NULL, +/* 7110 */ NULL, +/* 7111 */ NULL, +/* 7112 */ NULL, +/* 7113 */ NULL, +/* 7114 */ NULL, +/* 7115 */ NULL, +/* 7116 */ NULL, +/* 7117 */ NULL, +/* 7118 */ NULL, +/* 7119 */ NULL, +/* 711a */ NULL, +/* 711b */ NULL, +/* 711c */ NULL, +/* 711d */ NULL, +/* 711e */ NULL, +/* 711f */ NULL, +/* 7120 */ NULL, +/* 7121 */ NULL, +/* 7122 */ NULL, +/* 7123 */ NULL, +/* 7124 */ NULL, +/* 7125 */ NULL, +/* 7126 */ NULL, +/* 7127 */ NULL, +/* 7128 */ NULL, +/* 7129 */ NULL, +/* 712a */ NULL, +/* 712b */ NULL, +/* 712c */ NULL, +/* 712d */ NULL, +/* 712e */ NULL, +/* 712f */ NULL, +/* 7130 */ NULL, +/* 7131 */ NULL, +/* 7132 */ NULL, +/* 7133 */ NULL, +/* 7134 */ NULL, +/* 7135 */ NULL, +/* 7136 */ NULL, +/* 7137 */ NULL, +/* 7138 */ NULL, +/* 7139 */ NULL, +/* 713a */ NULL, +/* 713b */ NULL, +/* 713c */ NULL, +/* 713d */ NULL, +/* 713e */ NULL, +/* 713f */ NULL, +/* 7140 */ NULL, +/* 7141 */ NULL, +/* 7142 */ NULL, +/* 7143 */ NULL, +/* 7144 */ NULL, +/* 7145 */ NULL, +/* 7146 */ NULL, +/* 7147 */ NULL, +/* 7148 */ NULL, +/* 7149 */ NULL, +/* 714a */ NULL, +/* 714b */ NULL, +/* 714c */ NULL, +/* 714d */ NULL, +/* 714e */ NULL, +/* 714f */ NULL, +/* 7150 */ NULL, +/* 7151 */ NULL, +/* 7152 */ NULL, +/* 7153 */ NULL, +/* 7154 */ NULL, +/* 7155 */ NULL, +/* 7156 */ NULL, +/* 7157 */ NULL, +/* 7158 */ NULL, +/* 7159 */ NULL, +/* 715a */ NULL, +/* 715b */ NULL, +/* 715c */ NULL, +/* 715d */ NULL, +/* 715e */ NULL, +/* 715f */ NULL, +/* 7160 */ NULL, +/* 7161 */ NULL, +/* 7162 */ NULL, +/* 7163 */ NULL, +/* 7164 */ NULL, +/* 7165 */ NULL, +/* 7166 */ NULL, +/* 7167 */ NULL, +/* 7168 */ NULL, +/* 7169 */ NULL, +/* 716a */ NULL, +/* 716b */ NULL, +/* 716c */ NULL, +/* 716d */ NULL, +/* 716e */ NULL, +/* 716f */ NULL, +/* 7170 */ NULL, +/* 7171 */ NULL, +/* 7172 */ NULL, +/* 7173 */ NULL, +/* 7174 */ NULL, +/* 7175 */ NULL, +/* 7176 */ NULL, +/* 7177 */ NULL, +/* 7178 */ NULL, +/* 7179 */ NULL, +/* 717a */ NULL, +/* 717b */ NULL, +/* 717c */ NULL, +/* 717d */ NULL, +/* 717e */ NULL, +/* 717f */ NULL, +/* 7180 */ NULL, +/* 7181 */ NULL, +/* 7182 */ NULL, +/* 7183 */ NULL, +/* 7184 */ NULL, +/* 7185 */ NULL, +/* 7186 */ NULL, +/* 7187 */ NULL, +/* 7188 */ NULL, +/* 7189 */ NULL, +/* 718a */ NULL, +/* 718b */ NULL, +/* 718c */ NULL, +/* 718d */ NULL, +/* 718e */ NULL, +/* 718f */ NULL, +/* 7190 */ NULL, +/* 7191 */ NULL, +/* 7192 */ NULL, +/* 7193 */ NULL, +/* 7194 */ NULL, +/* 7195 */ NULL, +/* 7196 */ NULL, +/* 7197 */ NULL, +/* 7198 */ NULL, +/* 7199 */ NULL, +/* 719a */ NULL, +/* 719b */ NULL, +/* 719c */ NULL, +/* 719d */ NULL, +/* 719e */ NULL, +/* 719f */ NULL, +/* 71a0 */ NULL, +/* 71a1 */ NULL, +/* 71a2 */ NULL, +/* 71a3 */ NULL, +/* 71a4 */ NULL, +/* 71a5 */ NULL, +/* 71a6 */ NULL, +/* 71a7 */ NULL, +/* 71a8 */ NULL, +/* 71a9 */ NULL, +/* 71aa */ NULL, +/* 71ab */ NULL, +/* 71ac */ NULL, +/* 71ad */ NULL, +/* 71ae */ NULL, +/* 71af */ NULL, +/* 71b0 */ NULL, +/* 71b1 */ NULL, +/* 71b2 */ NULL, +/* 71b3 */ NULL, +/* 71b4 */ NULL, +/* 71b5 */ NULL, +/* 71b6 */ NULL, +/* 71b7 */ NULL, +/* 71b8 */ NULL, +/* 71b9 */ NULL, +/* 71ba */ NULL, +/* 71bb */ NULL, +/* 71bc */ NULL, +/* 71bd */ NULL, +/* 71be */ NULL, +/* 71bf */ NULL, +/* 71c0 */ NULL, +/* 71c1 */ NULL, +/* 71c2 */ NULL, +/* 71c3 */ NULL, +/* 71c4 */ NULL, +/* 71c5 */ NULL, +/* 71c6 */ NULL, +/* 71c7 */ NULL, +/* 71c8 */ NULL, +/* 71c9 */ NULL, +/* 71ca */ NULL, +/* 71cb */ NULL, +/* 71cc */ NULL, +/* 71cd */ NULL, +/* 71ce */ NULL, +/* 71cf */ NULL, +/* 71d0 */ NULL, +/* 71d1 */ NULL, +/* 71d2 */ NULL, +/* 71d3 */ NULL, +/* 71d4 */ NULL, +/* 71d5 */ NULL, +/* 71d6 */ NULL, +/* 71d7 */ NULL, +/* 71d8 */ NULL, +/* 71d9 */ NULL, +/* 71da */ NULL, +/* 71db */ NULL, +/* 71dc */ NULL, +/* 71dd */ NULL, +/* 71de */ NULL, +/* 71df */ NULL, +/* 71e0 */ NULL, +/* 71e1 */ NULL, +/* 71e2 */ NULL, +/* 71e3 */ NULL, +/* 71e4 */ NULL, +/* 71e5 */ NULL, +/* 71e6 */ NULL, +/* 71e7 */ NULL, +/* 71e8 */ NULL, +/* 71e9 */ NULL, +/* 71ea */ NULL, +/* 71eb */ NULL, +/* 71ec */ NULL, +/* 71ed */ NULL, +/* 71ee */ NULL, +/* 71ef */ NULL, +/* 71f0 */ NULL, +/* 71f1 */ NULL, +/* 71f2 */ NULL, +/* 71f3 */ NULL, +/* 71f4 */ NULL, +/* 71f5 */ NULL, +/* 71f6 */ NULL, +/* 71f7 */ NULL, +/* 71f8 */ NULL, +/* 71f9 */ NULL, +/* 71fa */ NULL, +/* 71fb */ NULL, +/* 71fc */ NULL, +/* 71fd */ NULL, +/* 71fe */ NULL, +/* 71ff */ NULL, +/* 7200 */ NULL, +/* 7201 */ NULL, +/* 7202 */ NULL, +/* 7203 */ NULL, +/* 7204 */ NULL, +/* 7205 */ NULL, +/* 7206 */ NULL, +/* 7207 */ NULL, +/* 7208 */ NULL, +/* 7209 */ NULL, +/* 720a */ NULL, +/* 720b */ NULL, +/* 720c */ NULL, +/* 720d */ NULL, +/* 720e */ NULL, +/* 720f */ NULL, +/* 7210 */ NULL, +/* 7211 */ NULL, +/* 7212 */ NULL, +/* 7213 */ NULL, +/* 7214 */ NULL, +/* 7215 */ NULL, +/* 7216 */ NULL, +/* 7217 */ NULL, +/* 7218 */ NULL, +/* 7219 */ NULL, +/* 721a */ NULL, +/* 721b */ NULL, +/* 721c */ NULL, +/* 721d */ NULL, +/* 721e */ NULL, +/* 721f */ NULL, +/* 7220 */ NULL, +/* 7221 */ NULL, +/* 7222 */ NULL, +/* 7223 */ NULL, +/* 7224 */ NULL, +/* 7225 */ NULL, +/* 7226 */ NULL, +/* 7227 */ NULL, +/* 7228 */ NULL, +/* 7229 */ NULL, +/* 722a */ NULL, +/* 722b */ NULL, +/* 722c */ NULL, +/* 722d */ NULL, +/* 722e */ NULL, +/* 722f */ NULL, +/* 7230 */ NULL, +/* 7231 */ NULL, +/* 7232 */ NULL, +/* 7233 */ NULL, +/* 7234 */ NULL, +/* 7235 */ NULL, +/* 7236 */ NULL, +/* 7237 */ NULL, +/* 7238 */ NULL, +/* 7239 */ NULL, +/* 723a */ NULL, +/* 723b */ NULL, +/* 723c */ NULL, +/* 723d */ NULL, +/* 723e */ NULL, +/* 723f */ NULL, +/* 7240 */ NULL, +/* 7241 */ NULL, +/* 7242 */ NULL, +/* 7243 */ NULL, +/* 7244 */ NULL, +/* 7245 */ NULL, +/* 7246 */ NULL, +/* 7247 */ NULL, +/* 7248 */ NULL, +/* 7249 */ NULL, +/* 724a */ NULL, +/* 724b */ NULL, +/* 724c */ NULL, +/* 724d */ NULL, +/* 724e */ NULL, +/* 724f */ NULL, +/* 7250 */ NULL, +/* 7251 */ NULL, +/* 7252 */ NULL, +/* 7253 */ NULL, +/* 7254 */ NULL, +/* 7255 */ NULL, +/* 7256 */ NULL, +/* 7257 */ NULL, +/* 7258 */ NULL, +/* 7259 */ NULL, +/* 725a */ NULL, +/* 725b */ NULL, +/* 725c */ NULL, +/* 725d */ NULL, +/* 725e */ NULL, +/* 725f */ NULL, +/* 7260 */ NULL, +/* 7261 */ NULL, +/* 7262 */ NULL, +/* 7263 */ NULL, +/* 7264 */ NULL, +/* 7265 */ NULL, +/* 7266 */ NULL, +/* 7267 */ NULL, +/* 7268 */ NULL, +/* 7269 */ NULL, +/* 726a */ NULL, +/* 726b */ NULL, +/* 726c */ NULL, +/* 726d */ NULL, +/* 726e */ NULL, +/* 726f */ NULL, +/* 7270 */ NULL, +/* 7271 */ NULL, +/* 7272 */ NULL, +/* 7273 */ NULL, +/* 7274 */ NULL, +/* 7275 */ NULL, +/* 7276 */ NULL, +/* 7277 */ NULL, +/* 7278 */ NULL, +/* 7279 */ NULL, +/* 727a */ NULL, +/* 727b */ NULL, +/* 727c */ NULL, +/* 727d */ NULL, +/* 727e */ NULL, +/* 727f */ NULL, +/* 7280 */ NULL, +/* 7281 */ NULL, +/* 7282 */ NULL, +/* 7283 */ NULL, +/* 7284 */ NULL, +/* 7285 */ NULL, +/* 7286 */ NULL, +/* 7287 */ NULL, +/* 7288 */ NULL, +/* 7289 */ NULL, +/* 728a */ NULL, +/* 728b */ NULL, +/* 728c */ NULL, +/* 728d */ NULL, +/* 728e */ NULL, +/* 728f */ NULL, +/* 7290 */ NULL, +/* 7291 */ NULL, +/* 7292 */ NULL, +/* 7293 */ NULL, +/* 7294 */ NULL, +/* 7295 */ NULL, +/* 7296 */ NULL, +/* 7297 */ NULL, +/* 7298 */ NULL, +/* 7299 */ NULL, +/* 729a */ NULL, +/* 729b */ NULL, +/* 729c */ NULL, +/* 729d */ NULL, +/* 729e */ NULL, +/* 729f */ NULL, +/* 72a0 */ NULL, +/* 72a1 */ NULL, +/* 72a2 */ NULL, +/* 72a3 */ NULL, +/* 72a4 */ NULL, +/* 72a5 */ NULL, +/* 72a6 */ NULL, +/* 72a7 */ NULL, +/* 72a8 */ NULL, +/* 72a9 */ NULL, +/* 72aa */ NULL, +/* 72ab */ NULL, +/* 72ac */ NULL, +/* 72ad */ NULL, +/* 72ae */ NULL, +/* 72af */ NULL, +/* 72b0 */ NULL, +/* 72b1 */ NULL, +/* 72b2 */ NULL, +/* 72b3 */ NULL, +/* 72b4 */ NULL, +/* 72b5 */ NULL, +/* 72b6 */ NULL, +/* 72b7 */ NULL, +/* 72b8 */ NULL, +/* 72b9 */ NULL, +/* 72ba */ NULL, +/* 72bb */ NULL, +/* 72bc */ NULL, +/* 72bd */ NULL, +/* 72be */ NULL, +/* 72bf */ NULL, +/* 72c0 */ NULL, +/* 72c1 */ NULL, +/* 72c2 */ NULL, +/* 72c3 */ NULL, +/* 72c4 */ NULL, +/* 72c5 */ NULL, +/* 72c6 */ NULL, +/* 72c7 */ NULL, +/* 72c8 */ NULL, +/* 72c9 */ NULL, +/* 72ca */ NULL, +/* 72cb */ NULL, +/* 72cc */ NULL, +/* 72cd */ NULL, +/* 72ce */ NULL, +/* 72cf */ NULL, +/* 72d0 */ NULL, +/* 72d1 */ NULL, +/* 72d2 */ NULL, +/* 72d3 */ NULL, +/* 72d4 */ NULL, +/* 72d5 */ NULL, +/* 72d6 */ NULL, +/* 72d7 */ NULL, +/* 72d8 */ NULL, +/* 72d9 */ NULL, +/* 72da */ NULL, +/* 72db */ NULL, +/* 72dc */ NULL, +/* 72dd */ NULL, +/* 72de */ NULL, +/* 72df */ NULL, +/* 72e0 */ NULL, +/* 72e1 */ NULL, +/* 72e2 */ NULL, +/* 72e3 */ NULL, +/* 72e4 */ NULL, +/* 72e5 */ NULL, +/* 72e6 */ NULL, +/* 72e7 */ NULL, +/* 72e8 */ NULL, +/* 72e9 */ NULL, +/* 72ea */ NULL, +/* 72eb */ NULL, +/* 72ec */ NULL, +/* 72ed */ NULL, +/* 72ee */ NULL, +/* 72ef */ NULL, +/* 72f0 */ NULL, +/* 72f1 */ NULL, +/* 72f2 */ NULL, +/* 72f3 */ NULL, +/* 72f4 */ NULL, +/* 72f5 */ NULL, +/* 72f6 */ NULL, +/* 72f7 */ NULL, +/* 72f8 */ NULL, +/* 72f9 */ NULL, +/* 72fa */ NULL, +/* 72fb */ NULL, +/* 72fc */ NULL, +/* 72fd */ NULL, +/* 72fe */ NULL, +/* 72ff */ NULL, +/* 7300 */ NULL, +/* 7301 */ NULL, +/* 7302 */ NULL, +/* 7303 */ NULL, +/* 7304 */ NULL, +/* 7305 */ NULL, +/* 7306 */ NULL, +/* 7307 */ NULL, +/* 7308 */ NULL, +/* 7309 */ NULL, +/* 730a */ NULL, +/* 730b */ NULL, +/* 730c */ NULL, +/* 730d */ NULL, +/* 730e */ NULL, +/* 730f */ NULL, +/* 7310 */ NULL, +/* 7311 */ NULL, +/* 7312 */ NULL, +/* 7313 */ NULL, +/* 7314 */ NULL, +/* 7315 */ NULL, +/* 7316 */ NULL, +/* 7317 */ NULL, +/* 7318 */ NULL, +/* 7319 */ NULL, +/* 731a */ NULL, +/* 731b */ NULL, +/* 731c */ NULL, +/* 731d */ NULL, +/* 731e */ NULL, +/* 731f */ NULL, +/* 7320 */ NULL, +/* 7321 */ NULL, +/* 7322 */ NULL, +/* 7323 */ NULL, +/* 7324 */ NULL, +/* 7325 */ NULL, +/* 7326 */ NULL, +/* 7327 */ NULL, +/* 7328 */ NULL, +/* 7329 */ NULL, +/* 732a */ NULL, +/* 732b */ NULL, +/* 732c */ NULL, +/* 732d */ NULL, +/* 732e */ NULL, +/* 732f */ NULL, +/* 7330 */ NULL, +/* 7331 */ NULL, +/* 7332 */ NULL, +/* 7333 */ NULL, +/* 7334 */ NULL, +/* 7335 */ NULL, +/* 7336 */ NULL, +/* 7337 */ NULL, +/* 7338 */ NULL, +/* 7339 */ NULL, +/* 733a */ NULL, +/* 733b */ NULL, +/* 733c */ NULL, +/* 733d */ NULL, +/* 733e */ NULL, +/* 733f */ NULL, +/* 7340 */ NULL, +/* 7341 */ NULL, +/* 7342 */ NULL, +/* 7343 */ NULL, +/* 7344 */ NULL, +/* 7345 */ NULL, +/* 7346 */ NULL, +/* 7347 */ NULL, +/* 7348 */ NULL, +/* 7349 */ NULL, +/* 734a */ NULL, +/* 734b */ NULL, +/* 734c */ NULL, +/* 734d */ NULL, +/* 734e */ NULL, +/* 734f */ NULL, +/* 7350 */ NULL, +/* 7351 */ NULL, +/* 7352 */ NULL, +/* 7353 */ NULL, +/* 7354 */ NULL, +/* 7355 */ NULL, +/* 7356 */ NULL, +/* 7357 */ NULL, +/* 7358 */ NULL, +/* 7359 */ NULL, +/* 735a */ NULL, +/* 735b */ NULL, +/* 735c */ NULL, +/* 735d */ NULL, +/* 735e */ NULL, +/* 735f */ NULL, +/* 7360 */ NULL, +/* 7361 */ NULL, +/* 7362 */ NULL, +/* 7363 */ NULL, +/* 7364 */ NULL, +/* 7365 */ NULL, +/* 7366 */ NULL, +/* 7367 */ NULL, +/* 7368 */ NULL, +/* 7369 */ NULL, +/* 736a */ NULL, +/* 736b */ NULL, +/* 736c */ NULL, +/* 736d */ NULL, +/* 736e */ NULL, +/* 736f */ NULL, +/* 7370 */ NULL, +/* 7371 */ NULL, +/* 7372 */ NULL, +/* 7373 */ NULL, +/* 7374 */ NULL, +/* 7375 */ NULL, +/* 7376 */ NULL, +/* 7377 */ NULL, +/* 7378 */ NULL, +/* 7379 */ NULL, +/* 737a */ NULL, +/* 737b */ NULL, +/* 737c */ NULL, +/* 737d */ NULL, +/* 737e */ NULL, +/* 737f */ NULL, +/* 7380 */ NULL, +/* 7381 */ NULL, +/* 7382 */ NULL, +/* 7383 */ NULL, +/* 7384 */ NULL, +/* 7385 */ NULL, +/* 7386 */ NULL, +/* 7387 */ NULL, +/* 7388 */ NULL, +/* 7389 */ NULL, +/* 738a */ NULL, +/* 738b */ NULL, +/* 738c */ NULL, +/* 738d */ NULL, +/* 738e */ NULL, +/* 738f */ NULL, +/* 7390 */ NULL, +/* 7391 */ NULL, +/* 7392 */ NULL, +/* 7393 */ NULL, +/* 7394 */ NULL, +/* 7395 */ NULL, +/* 7396 */ NULL, +/* 7397 */ NULL, +/* 7398 */ NULL, +/* 7399 */ NULL, +/* 739a */ NULL, +/* 739b */ NULL, +/* 739c */ NULL, +/* 739d */ NULL, +/* 739e */ NULL, +/* 739f */ NULL, +/* 73a0 */ NULL, +/* 73a1 */ NULL, +/* 73a2 */ NULL, +/* 73a3 */ NULL, +/* 73a4 */ NULL, +/* 73a5 */ NULL, +/* 73a6 */ NULL, +/* 73a7 */ NULL, +/* 73a8 */ NULL, +/* 73a9 */ NULL, +/* 73aa */ NULL, +/* 73ab */ NULL, +/* 73ac */ NULL, +/* 73ad */ NULL, +/* 73ae */ NULL, +/* 73af */ NULL, +/* 73b0 */ NULL, +/* 73b1 */ NULL, +/* 73b2 */ NULL, +/* 73b3 */ NULL, +/* 73b4 */ NULL, +/* 73b5 */ NULL, +/* 73b6 */ NULL, +/* 73b7 */ NULL, +/* 73b8 */ NULL, +/* 73b9 */ NULL, +/* 73ba */ NULL, +/* 73bb */ NULL, +/* 73bc */ NULL, +/* 73bd */ NULL, +/* 73be */ NULL, +/* 73bf */ NULL, +/* 73c0 */ NULL, +/* 73c1 */ NULL, +/* 73c2 */ NULL, +/* 73c3 */ NULL, +/* 73c4 */ NULL, +/* 73c5 */ NULL, +/* 73c6 */ NULL, +/* 73c7 */ NULL, +/* 73c8 */ NULL, +/* 73c9 */ NULL, +/* 73ca */ NULL, +/* 73cb */ NULL, +/* 73cc */ NULL, +/* 73cd */ NULL, +/* 73ce */ NULL, +/* 73cf */ NULL, +/* 73d0 */ NULL, +/* 73d1 */ NULL, +/* 73d2 */ NULL, +/* 73d3 */ NULL, +/* 73d4 */ NULL, +/* 73d5 */ NULL, +/* 73d6 */ NULL, +/* 73d7 */ NULL, +/* 73d8 */ NULL, +/* 73d9 */ NULL, +/* 73da */ NULL, +/* 73db */ NULL, +/* 73dc */ NULL, +/* 73dd */ NULL, +/* 73de */ NULL, +/* 73df */ NULL, +/* 73e0 */ NULL, +/* 73e1 */ NULL, +/* 73e2 */ NULL, +/* 73e3 */ NULL, +/* 73e4 */ NULL, +/* 73e5 */ NULL, +/* 73e6 */ NULL, +/* 73e7 */ NULL, +/* 73e8 */ NULL, +/* 73e9 */ NULL, +/* 73ea */ NULL, +/* 73eb */ NULL, +/* 73ec */ NULL, +/* 73ed */ NULL, +/* 73ee */ NULL, +/* 73ef */ NULL, +/* 73f0 */ NULL, +/* 73f1 */ NULL, +/* 73f2 */ NULL, +/* 73f3 */ NULL, +/* 73f4 */ NULL, +/* 73f5 */ NULL, +/* 73f6 */ NULL, +/* 73f7 */ NULL, +/* 73f8 */ NULL, +/* 73f9 */ NULL, +/* 73fa */ NULL, +/* 73fb */ NULL, +/* 73fc */ NULL, +/* 73fd */ NULL, +/* 73fe */ NULL, +/* 73ff */ NULL, +/* 7400 */ NULL, +/* 7401 */ NULL, +/* 7402 */ NULL, +/* 7403 */ NULL, +/* 7404 */ NULL, +/* 7405 */ NULL, +/* 7406 */ NULL, +/* 7407 */ NULL, +/* 7408 */ NULL, +/* 7409 */ NULL, +/* 740a */ NULL, +/* 740b */ NULL, +/* 740c */ NULL, +/* 740d */ NULL, +/* 740e */ NULL, +/* 740f */ NULL, +/* 7410 */ NULL, +/* 7411 */ NULL, +/* 7412 */ NULL, +/* 7413 */ NULL, +/* 7414 */ NULL, +/* 7415 */ NULL, +/* 7416 */ NULL, +/* 7417 */ NULL, +/* 7418 */ NULL, +/* 7419 */ NULL, +/* 741a */ NULL, +/* 741b */ NULL, +/* 741c */ NULL, +/* 741d */ NULL, +/* 741e */ NULL, +/* 741f */ NULL, +/* 7420 */ NULL, +/* 7421 */ NULL, +/* 7422 */ NULL, +/* 7423 */ NULL, +/* 7424 */ NULL, +/* 7425 */ NULL, +/* 7426 */ NULL, +/* 7427 */ NULL, +/* 7428 */ NULL, +/* 7429 */ NULL, +/* 742a */ NULL, +/* 742b */ NULL, +/* 742c */ NULL, +/* 742d */ NULL, +/* 742e */ NULL, +/* 742f */ NULL, +/* 7430 */ NULL, +/* 7431 */ NULL, +/* 7432 */ NULL, +/* 7433 */ NULL, +/* 7434 */ NULL, +/* 7435 */ NULL, +/* 7436 */ NULL, +/* 7437 */ NULL, +/* 7438 */ NULL, +/* 7439 */ NULL, +/* 743a */ NULL, +/* 743b */ NULL, +/* 743c */ NULL, +/* 743d */ NULL, +/* 743e */ NULL, +/* 743f */ NULL, +/* 7440 */ NULL, +/* 7441 */ NULL, +/* 7442 */ NULL, +/* 7443 */ NULL, +/* 7444 */ NULL, +/* 7445 */ NULL, +/* 7446 */ NULL, +/* 7447 */ NULL, +/* 7448 */ NULL, +/* 7449 */ NULL, +/* 744a */ NULL, +/* 744b */ NULL, +/* 744c */ NULL, +/* 744d */ NULL, +/* 744e */ NULL, +/* 744f */ NULL, +/* 7450 */ NULL, +/* 7451 */ NULL, +/* 7452 */ NULL, +/* 7453 */ NULL, +/* 7454 */ NULL, +/* 7455 */ NULL, +/* 7456 */ NULL, +/* 7457 */ NULL, +/* 7458 */ NULL, +/* 7459 */ NULL, +/* 745a */ NULL, +/* 745b */ NULL, +/* 745c */ NULL, +/* 745d */ NULL, +/* 745e */ NULL, +/* 745f */ NULL, +/* 7460 */ NULL, +/* 7461 */ NULL, +/* 7462 */ NULL, +/* 7463 */ NULL, +/* 7464 */ NULL, +/* 7465 */ NULL, +/* 7466 */ NULL, +/* 7467 */ NULL, +/* 7468 */ NULL, +/* 7469 */ NULL, +/* 746a */ NULL, +/* 746b */ NULL, +/* 746c */ NULL, +/* 746d */ NULL, +/* 746e */ NULL, +/* 746f */ NULL, +/* 7470 */ NULL, +/* 7471 */ NULL, +/* 7472 */ NULL, +/* 7473 */ NULL, +/* 7474 */ NULL, +/* 7475 */ NULL, +/* 7476 */ NULL, +/* 7477 */ NULL, +/* 7478 */ NULL, +/* 7479 */ NULL, +/* 747a */ NULL, +/* 747b */ NULL, +/* 747c */ NULL, +/* 747d */ NULL, +/* 747e */ NULL, +/* 747f */ NULL, +/* 7480 */ NULL, +/* 7481 */ NULL, +/* 7482 */ NULL, +/* 7483 */ NULL, +/* 7484 */ NULL, +/* 7485 */ NULL, +/* 7486 */ NULL, +/* 7487 */ NULL, +/* 7488 */ NULL, +/* 7489 */ NULL, +/* 748a */ NULL, +/* 748b */ NULL, +/* 748c */ NULL, +/* 748d */ NULL, +/* 748e */ NULL, +/* 748f */ NULL, +/* 7490 */ NULL, +/* 7491 */ NULL, +/* 7492 */ NULL, +/* 7493 */ NULL, +/* 7494 */ NULL, +/* 7495 */ NULL, +/* 7496 */ NULL, +/* 7497 */ NULL, +/* 7498 */ NULL, +/* 7499 */ NULL, +/* 749a */ NULL, +/* 749b */ NULL, +/* 749c */ NULL, +/* 749d */ NULL, +/* 749e */ NULL, +/* 749f */ NULL, +/* 74a0 */ NULL, +/* 74a1 */ NULL, +/* 74a2 */ NULL, +/* 74a3 */ NULL, +/* 74a4 */ NULL, +/* 74a5 */ NULL, +/* 74a6 */ NULL, +/* 74a7 */ NULL, +/* 74a8 */ NULL, +/* 74a9 */ NULL, +/* 74aa */ NULL, +/* 74ab */ NULL, +/* 74ac */ NULL, +/* 74ad */ NULL, +/* 74ae */ NULL, +/* 74af */ NULL, +/* 74b0 */ NULL, +/* 74b1 */ NULL, +/* 74b2 */ NULL, +/* 74b3 */ NULL, +/* 74b4 */ NULL, +/* 74b5 */ NULL, +/* 74b6 */ NULL, +/* 74b7 */ NULL, +/* 74b8 */ NULL, +/* 74b9 */ NULL, +/* 74ba */ NULL, +/* 74bb */ NULL, +/* 74bc */ NULL, +/* 74bd */ NULL, +/* 74be */ NULL, +/* 74bf */ NULL, +/* 74c0 */ NULL, +/* 74c1 */ NULL, +/* 74c2 */ NULL, +/* 74c3 */ NULL, +/* 74c4 */ NULL, +/* 74c5 */ NULL, +/* 74c6 */ NULL, +/* 74c7 */ NULL, +/* 74c8 */ NULL, +/* 74c9 */ NULL, +/* 74ca */ NULL, +/* 74cb */ NULL, +/* 74cc */ NULL, +/* 74cd */ NULL, +/* 74ce */ NULL, +/* 74cf */ NULL, +/* 74d0 */ NULL, +/* 74d1 */ NULL, +/* 74d2 */ NULL, +/* 74d3 */ NULL, +/* 74d4 */ NULL, +/* 74d5 */ NULL, +/* 74d6 */ NULL, +/* 74d7 */ NULL, +/* 74d8 */ NULL, +/* 74d9 */ NULL, +/* 74da */ NULL, +/* 74db */ NULL, +/* 74dc */ NULL, +/* 74dd */ NULL, +/* 74de */ NULL, +/* 74df */ NULL, +/* 74e0 */ NULL, +/* 74e1 */ NULL, +/* 74e2 */ NULL, +/* 74e3 */ NULL, +/* 74e4 */ NULL, +/* 74e5 */ NULL, +/* 74e6 */ NULL, +/* 74e7 */ NULL, +/* 74e8 */ NULL, +/* 74e9 */ NULL, +/* 74ea */ NULL, +/* 74eb */ NULL, +/* 74ec */ NULL, +/* 74ed */ NULL, +/* 74ee */ NULL, +/* 74ef */ NULL, +/* 74f0 */ NULL, +/* 74f1 */ NULL, +/* 74f2 */ NULL, +/* 74f3 */ NULL, +/* 74f4 */ NULL, +/* 74f5 */ NULL, +/* 74f6 */ NULL, +/* 74f7 */ NULL, +/* 74f8 */ NULL, +/* 74f9 */ NULL, +/* 74fa */ NULL, +/* 74fb */ NULL, +/* 74fc */ NULL, +/* 74fd */ NULL, +/* 74fe */ NULL, +/* 74ff */ NULL, +/* 7500 */ NULL, +/* 7501 */ NULL, +/* 7502 */ NULL, +/* 7503 */ NULL, +/* 7504 */ NULL, +/* 7505 */ NULL, +/* 7506 */ NULL, +/* 7507 */ NULL, +/* 7508 */ NULL, +/* 7509 */ NULL, +/* 750a */ NULL, +/* 750b */ NULL, +/* 750c */ NULL, +/* 750d */ NULL, +/* 750e */ NULL, +/* 750f */ NULL, +/* 7510 */ NULL, +/* 7511 */ NULL, +/* 7512 */ NULL, +/* 7513 */ NULL, +/* 7514 */ NULL, +/* 7515 */ NULL, +/* 7516 */ NULL, +/* 7517 */ NULL, +/* 7518 */ NULL, +/* 7519 */ NULL, +/* 751a */ NULL, +/* 751b */ NULL, +/* 751c */ NULL, +/* 751d */ NULL, +/* 751e */ NULL, +/* 751f */ NULL, +/* 7520 */ NULL, +/* 7521 */ NULL, +/* 7522 */ NULL, +/* 7523 */ NULL, +/* 7524 */ NULL, +/* 7525 */ NULL, +/* 7526 */ NULL, +/* 7527 */ NULL, +/* 7528 */ NULL, +/* 7529 */ NULL, +/* 752a */ NULL, +/* 752b */ NULL, +/* 752c */ NULL, +/* 752d */ NULL, +/* 752e */ NULL, +/* 752f */ NULL, +/* 7530 */ NULL, +/* 7531 */ NULL, +/* 7532 */ NULL, +/* 7533 */ NULL, +/* 7534 */ NULL, +/* 7535 */ NULL, +/* 7536 */ NULL, +/* 7537 */ NULL, +/* 7538 */ NULL, +/* 7539 */ NULL, +/* 753a */ NULL, +/* 753b */ NULL, +/* 753c */ NULL, +/* 753d */ NULL, +/* 753e */ NULL, +/* 753f */ NULL, +/* 7540 */ NULL, +/* 7541 */ NULL, +/* 7542 */ NULL, +/* 7543 */ NULL, +/* 7544 */ NULL, +/* 7545 */ NULL, +/* 7546 */ NULL, +/* 7547 */ NULL, +/* 7548 */ NULL, +/* 7549 */ NULL, +/* 754a */ NULL, +/* 754b */ NULL, +/* 754c */ NULL, +/* 754d */ NULL, +/* 754e */ NULL, +/* 754f */ NULL, +/* 7550 */ NULL, +/* 7551 */ NULL, +/* 7552 */ NULL, +/* 7553 */ NULL, +/* 7554 */ NULL, +/* 7555 */ NULL, +/* 7556 */ NULL, +/* 7557 */ NULL, +/* 7558 */ NULL, +/* 7559 */ NULL, +/* 755a */ NULL, +/* 755b */ NULL, +/* 755c */ NULL, +/* 755d */ NULL, +/* 755e */ NULL, +/* 755f */ NULL, +/* 7560 */ NULL, +/* 7561 */ NULL, +/* 7562 */ NULL, +/* 7563 */ NULL, +/* 7564 */ NULL, +/* 7565 */ NULL, +/* 7566 */ NULL, +/* 7567 */ NULL, +/* 7568 */ NULL, +/* 7569 */ NULL, +/* 756a */ NULL, +/* 756b */ NULL, +/* 756c */ NULL, +/* 756d */ NULL, +/* 756e */ NULL, +/* 756f */ NULL, +/* 7570 */ NULL, +/* 7571 */ NULL, +/* 7572 */ NULL, +/* 7573 */ NULL, +/* 7574 */ NULL, +/* 7575 */ NULL, +/* 7576 */ NULL, +/* 7577 */ NULL, +/* 7578 */ NULL, +/* 7579 */ NULL, +/* 757a */ NULL, +/* 757b */ NULL, +/* 757c */ NULL, +/* 757d */ NULL, +/* 757e */ NULL, +/* 757f */ NULL, +/* 7580 */ NULL, +/* 7581 */ NULL, +/* 7582 */ NULL, +/* 7583 */ NULL, +/* 7584 */ NULL, +/* 7585 */ NULL, +/* 7586 */ NULL, +/* 7587 */ NULL, +/* 7588 */ NULL, +/* 7589 */ NULL, +/* 758a */ NULL, +/* 758b */ NULL, +/* 758c */ NULL, +/* 758d */ NULL, +/* 758e */ NULL, +/* 758f */ NULL, +/* 7590 */ NULL, +/* 7591 */ NULL, +/* 7592 */ NULL, +/* 7593 */ NULL, +/* 7594 */ NULL, +/* 7595 */ NULL, +/* 7596 */ NULL, +/* 7597 */ NULL, +/* 7598 */ NULL, +/* 7599 */ NULL, +/* 759a */ NULL, +/* 759b */ NULL, +/* 759c */ NULL, +/* 759d */ NULL, +/* 759e */ NULL, +/* 759f */ NULL, +/* 75a0 */ NULL, +/* 75a1 */ NULL, +/* 75a2 */ NULL, +/* 75a3 */ NULL, +/* 75a4 */ NULL, +/* 75a5 */ NULL, +/* 75a6 */ NULL, +/* 75a7 */ NULL, +/* 75a8 */ NULL, +/* 75a9 */ NULL, +/* 75aa */ NULL, +/* 75ab */ NULL, +/* 75ac */ NULL, +/* 75ad */ NULL, +/* 75ae */ NULL, +/* 75af */ NULL, +/* 75b0 */ NULL, +/* 75b1 */ NULL, +/* 75b2 */ NULL, +/* 75b3 */ NULL, +/* 75b4 */ NULL, +/* 75b5 */ NULL, +/* 75b6 */ NULL, +/* 75b7 */ NULL, +/* 75b8 */ NULL, +/* 75b9 */ NULL, +/* 75ba */ NULL, +/* 75bb */ NULL, +/* 75bc */ NULL, +/* 75bd */ NULL, +/* 75be */ NULL, +/* 75bf */ NULL, +/* 75c0 */ NULL, +/* 75c1 */ NULL, +/* 75c2 */ NULL, +/* 75c3 */ NULL, +/* 75c4 */ NULL, +/* 75c5 */ NULL, +/* 75c6 */ NULL, +/* 75c7 */ NULL, +/* 75c8 */ NULL, +/* 75c9 */ NULL, +/* 75ca */ NULL, +/* 75cb */ NULL, +/* 75cc */ NULL, +/* 75cd */ NULL, +/* 75ce */ NULL, +/* 75cf */ NULL, +/* 75d0 */ NULL, +/* 75d1 */ NULL, +/* 75d2 */ NULL, +/* 75d3 */ NULL, +/* 75d4 */ NULL, +/* 75d5 */ NULL, +/* 75d6 */ NULL, +/* 75d7 */ NULL, +/* 75d8 */ NULL, +/* 75d9 */ NULL, +/* 75da */ NULL, +/* 75db */ NULL, +/* 75dc */ NULL, +/* 75dd */ NULL, +/* 75de */ NULL, +/* 75df */ NULL, +/* 75e0 */ NULL, +/* 75e1 */ NULL, +/* 75e2 */ NULL, +/* 75e3 */ NULL, +/* 75e4 */ NULL, +/* 75e5 */ NULL, +/* 75e6 */ NULL, +/* 75e7 */ NULL, +/* 75e8 */ NULL, +/* 75e9 */ NULL, +/* 75ea */ NULL, +/* 75eb */ NULL, +/* 75ec */ NULL, +/* 75ed */ NULL, +/* 75ee */ NULL, +/* 75ef */ NULL, +/* 75f0 */ NULL, +/* 75f1 */ NULL, +/* 75f2 */ NULL, +/* 75f3 */ NULL, +/* 75f4 */ NULL, +/* 75f5 */ NULL, +/* 75f6 */ NULL, +/* 75f7 */ NULL, +/* 75f8 */ NULL, +/* 75f9 */ NULL, +/* 75fa */ NULL, +/* 75fb */ NULL, +/* 75fc */ NULL, +/* 75fd */ NULL, +/* 75fe */ NULL, +/* 75ff */ NULL, +/* 7600 */ NULL, +/* 7601 */ NULL, +/* 7602 */ NULL, +/* 7603 */ NULL, +/* 7604 */ NULL, +/* 7605 */ NULL, +/* 7606 */ NULL, +/* 7607 */ NULL, +/* 7608 */ NULL, +/* 7609 */ NULL, +/* 760a */ NULL, +/* 760b */ NULL, +/* 760c */ NULL, +/* 760d */ NULL, +/* 760e */ NULL, +/* 760f */ NULL, +/* 7610 */ NULL, +/* 7611 */ NULL, +/* 7612 */ NULL, +/* 7613 */ NULL, +/* 7614 */ NULL, +/* 7615 */ NULL, +/* 7616 */ NULL, +/* 7617 */ NULL, +/* 7618 */ NULL, +/* 7619 */ NULL, +/* 761a */ NULL, +/* 761b */ NULL, +/* 761c */ NULL, +/* 761d */ NULL, +/* 761e */ NULL, +/* 761f */ NULL, +/* 7620 */ NULL, +/* 7621 */ NULL, +/* 7622 */ NULL, +/* 7623 */ NULL, +/* 7624 */ NULL, +/* 7625 */ NULL, +/* 7626 */ NULL, +/* 7627 */ NULL, +/* 7628 */ NULL, +/* 7629 */ NULL, +/* 762a */ NULL, +/* 762b */ NULL, +/* 762c */ NULL, +/* 762d */ NULL, +/* 762e */ NULL, +/* 762f */ NULL, +/* 7630 */ NULL, +/* 7631 */ NULL, +/* 7632 */ NULL, +/* 7633 */ NULL, +/* 7634 */ NULL, +/* 7635 */ NULL, +/* 7636 */ NULL, +/* 7637 */ NULL, +/* 7638 */ NULL, +/* 7639 */ NULL, +/* 763a */ NULL, +/* 763b */ NULL, +/* 763c */ NULL, +/* 763d */ NULL, +/* 763e */ NULL, +/* 763f */ NULL, +/* 7640 */ NULL, +/* 7641 */ NULL, +/* 7642 */ NULL, +/* 7643 */ NULL, +/* 7644 */ NULL, +/* 7645 */ NULL, +/* 7646 */ NULL, +/* 7647 */ NULL, +/* 7648 */ NULL, +/* 7649 */ NULL, +/* 764a */ NULL, +/* 764b */ NULL, +/* 764c */ NULL, +/* 764d */ NULL, +/* 764e */ NULL, +/* 764f */ NULL, +/* 7650 */ NULL, +/* 7651 */ NULL, +/* 7652 */ NULL, +/* 7653 */ NULL, +/* 7654 */ NULL, +/* 7655 */ NULL, +/* 7656 */ NULL, +/* 7657 */ NULL, +/* 7658 */ NULL, +/* 7659 */ NULL, +/* 765a */ NULL, +/* 765b */ NULL, +/* 765c */ NULL, +/* 765d */ NULL, +/* 765e */ NULL, +/* 765f */ NULL, +/* 7660 */ NULL, +/* 7661 */ NULL, +/* 7662 */ NULL, +/* 7663 */ NULL, +/* 7664 */ NULL, +/* 7665 */ NULL, +/* 7666 */ NULL, +/* 7667 */ NULL, +/* 7668 */ NULL, +/* 7669 */ NULL, +/* 766a */ NULL, +/* 766b */ NULL, +/* 766c */ NULL, +/* 766d */ NULL, +/* 766e */ NULL, +/* 766f */ NULL, +/* 7670 */ NULL, +/* 7671 */ NULL, +/* 7672 */ NULL, +/* 7673 */ NULL, +/* 7674 */ NULL, +/* 7675 */ NULL, +/* 7676 */ NULL, +/* 7677 */ NULL, +/* 7678 */ NULL, +/* 7679 */ NULL, +/* 767a */ NULL, +/* 767b */ NULL, +/* 767c */ NULL, +/* 767d */ NULL, +/* 767e */ NULL, +/* 767f */ NULL, +/* 7680 */ NULL, +/* 7681 */ NULL, +/* 7682 */ NULL, +/* 7683 */ NULL, +/* 7684 */ NULL, +/* 7685 */ NULL, +/* 7686 */ NULL, +/* 7687 */ NULL, +/* 7688 */ NULL, +/* 7689 */ NULL, +/* 768a */ NULL, +/* 768b */ NULL, +/* 768c */ NULL, +/* 768d */ NULL, +/* 768e */ NULL, +/* 768f */ NULL, +/* 7690 */ NULL, +/* 7691 */ NULL, +/* 7692 */ NULL, +/* 7693 */ NULL, +/* 7694 */ NULL, +/* 7695 */ NULL, +/* 7696 */ NULL, +/* 7697 */ NULL, +/* 7698 */ NULL, +/* 7699 */ NULL, +/* 769a */ NULL, +/* 769b */ NULL, +/* 769c */ NULL, +/* 769d */ NULL, +/* 769e */ NULL, +/* 769f */ NULL, +/* 76a0 */ NULL, +/* 76a1 */ NULL, +/* 76a2 */ NULL, +/* 76a3 */ NULL, +/* 76a4 */ NULL, +/* 76a5 */ NULL, +/* 76a6 */ NULL, +/* 76a7 */ NULL, +/* 76a8 */ NULL, +/* 76a9 */ NULL, +/* 76aa */ NULL, +/* 76ab */ NULL, +/* 76ac */ NULL, +/* 76ad */ NULL, +/* 76ae */ NULL, +/* 76af */ NULL, +/* 76b0 */ NULL, +/* 76b1 */ NULL, +/* 76b2 */ NULL, +/* 76b3 */ NULL, +/* 76b4 */ NULL, +/* 76b5 */ NULL, +/* 76b6 */ NULL, +/* 76b7 */ NULL, +/* 76b8 */ NULL, +/* 76b9 */ NULL, +/* 76ba */ NULL, +/* 76bb */ NULL, +/* 76bc */ NULL, +/* 76bd */ NULL, +/* 76be */ NULL, +/* 76bf */ NULL, +/* 76c0 */ NULL, +/* 76c1 */ NULL, +/* 76c2 */ NULL, +/* 76c3 */ NULL, +/* 76c4 */ NULL, +/* 76c5 */ NULL, +/* 76c6 */ NULL, +/* 76c7 */ NULL, +/* 76c8 */ NULL, +/* 76c9 */ NULL, +/* 76ca */ NULL, +/* 76cb */ NULL, +/* 76cc */ NULL, +/* 76cd */ NULL, +/* 76ce */ NULL, +/* 76cf */ NULL, +/* 76d0 */ NULL, +/* 76d1 */ NULL, +/* 76d2 */ NULL, +/* 76d3 */ NULL, +/* 76d4 */ NULL, +/* 76d5 */ NULL, +/* 76d6 */ NULL, +/* 76d7 */ NULL, +/* 76d8 */ NULL, +/* 76d9 */ NULL, +/* 76da */ NULL, +/* 76db */ NULL, +/* 76dc */ NULL, +/* 76dd */ NULL, +/* 76de */ NULL, +/* 76df */ NULL, +/* 76e0 */ NULL, +/* 76e1 */ NULL, +/* 76e2 */ NULL, +/* 76e3 */ NULL, +/* 76e4 */ NULL, +/* 76e5 */ NULL, +/* 76e6 */ NULL, +/* 76e7 */ NULL, +/* 76e8 */ NULL, +/* 76e9 */ NULL, +/* 76ea */ NULL, +/* 76eb */ NULL, +/* 76ec */ NULL, +/* 76ed */ NULL, +/* 76ee */ NULL, +/* 76ef */ NULL, +/* 76f0 */ NULL, +/* 76f1 */ NULL, +/* 76f2 */ NULL, +/* 76f3 */ NULL, +/* 76f4 */ NULL, +/* 76f5 */ NULL, +/* 76f6 */ NULL, +/* 76f7 */ NULL, +/* 76f8 */ NULL, +/* 76f9 */ NULL, +/* 76fa */ NULL, +/* 76fb */ NULL, +/* 76fc */ NULL, +/* 76fd */ NULL, +/* 76fe */ NULL, +/* 76ff */ NULL, +/* 7700 */ NULL, +/* 7701 */ NULL, +/* 7702 */ NULL, +/* 7703 */ NULL, +/* 7704 */ NULL, +/* 7705 */ NULL, +/* 7706 */ NULL, +/* 7707 */ NULL, +/* 7708 */ NULL, +/* 7709 */ NULL, +/* 770a */ NULL, +/* 770b */ NULL, +/* 770c */ NULL, +/* 770d */ NULL, +/* 770e */ NULL, +/* 770f */ NULL, +/* 7710 */ NULL, +/* 7711 */ NULL, +/* 7712 */ NULL, +/* 7713 */ NULL, +/* 7714 */ NULL, +/* 7715 */ NULL, +/* 7716 */ NULL, +/* 7717 */ NULL, +/* 7718 */ NULL, +/* 7719 */ NULL, +/* 771a */ NULL, +/* 771b */ NULL, +/* 771c */ NULL, +/* 771d */ NULL, +/* 771e */ NULL, +/* 771f */ NULL, +/* 7720 */ NULL, +/* 7721 */ NULL, +/* 7722 */ NULL, +/* 7723 */ NULL, +/* 7724 */ NULL, +/* 7725 */ NULL, +/* 7726 */ NULL, +/* 7727 */ NULL, +/* 7728 */ NULL, +/* 7729 */ NULL, +/* 772a */ NULL, +/* 772b */ NULL, +/* 772c */ NULL, +/* 772d */ NULL, +/* 772e */ NULL, +/* 772f */ NULL, +/* 7730 */ NULL, +/* 7731 */ NULL, +/* 7732 */ NULL, +/* 7733 */ NULL, +/* 7734 */ NULL, +/* 7735 */ NULL, +/* 7736 */ NULL, +/* 7737 */ NULL, +/* 7738 */ NULL, +/* 7739 */ NULL, +/* 773a */ NULL, +/* 773b */ NULL, +/* 773c */ NULL, +/* 773d */ NULL, +/* 773e */ NULL, +/* 773f */ NULL, +/* 7740 */ NULL, +/* 7741 */ NULL, +/* 7742 */ NULL, +/* 7743 */ NULL, +/* 7744 */ NULL, +/* 7745 */ NULL, +/* 7746 */ NULL, +/* 7747 */ NULL, +/* 7748 */ NULL, +/* 7749 */ NULL, +/* 774a */ NULL, +/* 774b */ NULL, +/* 774c */ NULL, +/* 774d */ NULL, +/* 774e */ NULL, +/* 774f */ NULL, +/* 7750 */ NULL, +/* 7751 */ NULL, +/* 7752 */ NULL, +/* 7753 */ NULL, +/* 7754 */ NULL, +/* 7755 */ NULL, +/* 7756 */ NULL, +/* 7757 */ NULL, +/* 7758 */ NULL, +/* 7759 */ NULL, +/* 775a */ NULL, +/* 775b */ NULL, +/* 775c */ NULL, +/* 775d */ NULL, +/* 775e */ NULL, +/* 775f */ NULL, +/* 7760 */ NULL, +/* 7761 */ NULL, +/* 7762 */ NULL, +/* 7763 */ NULL, +/* 7764 */ NULL, +/* 7765 */ NULL, +/* 7766 */ NULL, +/* 7767 */ NULL, +/* 7768 */ NULL, +/* 7769 */ NULL, +/* 776a */ NULL, +/* 776b */ NULL, +/* 776c */ NULL, +/* 776d */ NULL, +/* 776e */ NULL, +/* 776f */ NULL, +/* 7770 */ NULL, +/* 7771 */ NULL, +/* 7772 */ NULL, +/* 7773 */ NULL, +/* 7774 */ NULL, +/* 7775 */ NULL, +/* 7776 */ NULL, +/* 7777 */ NULL, +/* 7778 */ NULL, +/* 7779 */ NULL, +/* 777a */ NULL, +/* 777b */ NULL, +/* 777c */ NULL, +/* 777d */ NULL, +/* 777e */ NULL, +/* 777f */ NULL, +/* 7780 */ NULL, +/* 7781 */ NULL, +/* 7782 */ NULL, +/* 7783 */ NULL, +/* 7784 */ NULL, +/* 7785 */ NULL, +/* 7786 */ NULL, +/* 7787 */ NULL, +/* 7788 */ NULL, +/* 7789 */ NULL, +/* 778a */ NULL, +/* 778b */ NULL, +/* 778c */ NULL, +/* 778d */ NULL, +/* 778e */ NULL, +/* 778f */ NULL, +/* 7790 */ NULL, +/* 7791 */ NULL, +/* 7792 */ NULL, +/* 7793 */ NULL, +/* 7794 */ NULL, +/* 7795 */ NULL, +/* 7796 */ NULL, +/* 7797 */ NULL, +/* 7798 */ NULL, +/* 7799 */ NULL, +/* 779a */ NULL, +/* 779b */ NULL, +/* 779c */ NULL, +/* 779d */ NULL, +/* 779e */ NULL, +/* 779f */ NULL, +/* 77a0 */ NULL, +/* 77a1 */ NULL, +/* 77a2 */ NULL, +/* 77a3 */ NULL, +/* 77a4 */ NULL, +/* 77a5 */ NULL, +/* 77a6 */ NULL, +/* 77a7 */ NULL, +/* 77a8 */ NULL, +/* 77a9 */ NULL, +/* 77aa */ NULL, +/* 77ab */ NULL, +/* 77ac */ NULL, +/* 77ad */ NULL, +/* 77ae */ NULL, +/* 77af */ NULL, +/* 77b0 */ NULL, +/* 77b1 */ NULL, +/* 77b2 */ NULL, +/* 77b3 */ NULL, +/* 77b4 */ NULL, +/* 77b5 */ NULL, +/* 77b6 */ NULL, +/* 77b7 */ NULL, +/* 77b8 */ NULL, +/* 77b9 */ NULL, +/* 77ba */ NULL, +/* 77bb */ NULL, +/* 77bc */ NULL, +/* 77bd */ NULL, +/* 77be */ NULL, +/* 77bf */ NULL, +/* 77c0 */ NULL, +/* 77c1 */ NULL, +/* 77c2 */ NULL, +/* 77c3 */ NULL, +/* 77c4 */ NULL, +/* 77c5 */ NULL, +/* 77c6 */ NULL, +/* 77c7 */ NULL, +/* 77c8 */ NULL, +/* 77c9 */ NULL, +/* 77ca */ NULL, +/* 77cb */ NULL, +/* 77cc */ NULL, +/* 77cd */ NULL, +/* 77ce */ NULL, +/* 77cf */ NULL, +/* 77d0 */ NULL, +/* 77d1 */ NULL, +/* 77d2 */ NULL, +/* 77d3 */ NULL, +/* 77d4 */ NULL, +/* 77d5 */ NULL, +/* 77d6 */ NULL, +/* 77d7 */ NULL, +/* 77d8 */ NULL, +/* 77d9 */ NULL, +/* 77da */ NULL, +/* 77db */ NULL, +/* 77dc */ NULL, +/* 77dd */ NULL, +/* 77de */ NULL, +/* 77df */ NULL, +/* 77e0 */ NULL, +/* 77e1 */ NULL, +/* 77e2 */ NULL, +/* 77e3 */ NULL, +/* 77e4 */ NULL, +/* 77e5 */ NULL, +/* 77e6 */ NULL, +/* 77e7 */ NULL, +/* 77e8 */ NULL, +/* 77e9 */ NULL, +/* 77ea */ NULL, +/* 77eb */ NULL, +/* 77ec */ NULL, +/* 77ed */ NULL, +/* 77ee */ NULL, +/* 77ef */ NULL, +/* 77f0 */ NULL, +/* 77f1 */ NULL, +/* 77f2 */ NULL, +/* 77f3 */ NULL, +/* 77f4 */ NULL, +/* 77f5 */ NULL, +/* 77f6 */ NULL, +/* 77f7 */ NULL, +/* 77f8 */ NULL, +/* 77f9 */ NULL, +/* 77fa */ NULL, +/* 77fb */ NULL, +/* 77fc */ NULL, +/* 77fd */ NULL, +/* 77fe */ NULL, +/* 77ff */ NULL, +/* 7800 */ NULL, +/* 7801 */ NULL, +/* 7802 */ NULL, +/* 7803 */ NULL, +/* 7804 */ NULL, +/* 7805 */ NULL, +/* 7806 */ NULL, +/* 7807 */ NULL, +/* 7808 */ NULL, +/* 7809 */ NULL, +/* 780a */ NULL, +/* 780b */ NULL, +/* 780c */ NULL, +/* 780d */ NULL, +/* 780e */ NULL, +/* 780f */ NULL, +/* 7810 */ NULL, +/* 7811 */ NULL, +/* 7812 */ NULL, +/* 7813 */ NULL, +/* 7814 */ NULL, +/* 7815 */ NULL, +/* 7816 */ NULL, +/* 7817 */ NULL, +/* 7818 */ NULL, +/* 7819 */ NULL, +/* 781a */ NULL, +/* 781b */ NULL, +/* 781c */ NULL, +/* 781d */ NULL, +/* 781e */ NULL, +/* 781f */ NULL, +/* 7820 */ NULL, +/* 7821 */ NULL, +/* 7822 */ NULL, +/* 7823 */ NULL, +/* 7824 */ NULL, +/* 7825 */ NULL, +/* 7826 */ NULL, +/* 7827 */ NULL, +/* 7828 */ NULL, +/* 7829 */ NULL, +/* 782a */ NULL, +/* 782b */ NULL, +/* 782c */ NULL, +/* 782d */ NULL, +/* 782e */ NULL, +/* 782f */ NULL, +/* 7830 */ NULL, +/* 7831 */ NULL, +/* 7832 */ NULL, +/* 7833 */ NULL, +/* 7834 */ NULL, +/* 7835 */ NULL, +/* 7836 */ NULL, +/* 7837 */ NULL, +/* 7838 */ NULL, +/* 7839 */ NULL, +/* 783a */ NULL, +/* 783b */ NULL, +/* 783c */ NULL, +/* 783d */ NULL, +/* 783e */ NULL, +/* 783f */ NULL, +/* 7840 */ NULL, +/* 7841 */ NULL, +/* 7842 */ NULL, +/* 7843 */ NULL, +/* 7844 */ NULL, +/* 7845 */ NULL, +/* 7846 */ NULL, +/* 7847 */ NULL, +/* 7848 */ NULL, +/* 7849 */ NULL, +/* 784a */ NULL, +/* 784b */ NULL, +/* 784c */ NULL, +/* 784d */ NULL, +/* 784e */ NULL, +/* 784f */ NULL, +/* 7850 */ NULL, +/* 7851 */ NULL, +/* 7852 */ NULL, +/* 7853 */ NULL, +/* 7854 */ NULL, +/* 7855 */ NULL, +/* 7856 */ NULL, +/* 7857 */ NULL, +/* 7858 */ NULL, +/* 7859 */ NULL, +/* 785a */ NULL, +/* 785b */ NULL, +/* 785c */ NULL, +/* 785d */ NULL, +/* 785e */ NULL, +/* 785f */ NULL, +/* 7860 */ NULL, +/* 7861 */ NULL, +/* 7862 */ NULL, +/* 7863 */ NULL, +/* 7864 */ NULL, +/* 7865 */ NULL, +/* 7866 */ NULL, +/* 7867 */ NULL, +/* 7868 */ NULL, +/* 7869 */ NULL, +/* 786a */ NULL, +/* 786b */ NULL, +/* 786c */ NULL, +/* 786d */ NULL, +/* 786e */ NULL, +/* 786f */ NULL, +/* 7870 */ NULL, +/* 7871 */ NULL, +/* 7872 */ NULL, +/* 7873 */ NULL, +/* 7874 */ NULL, +/* 7875 */ NULL, +/* 7876 */ NULL, +/* 7877 */ NULL, +/* 7878 */ NULL, +/* 7879 */ NULL, +/* 787a */ NULL, +/* 787b */ NULL, +/* 787c */ NULL, +/* 787d */ NULL, +/* 787e */ NULL, +/* 787f */ NULL, +/* 7880 */ NULL, +/* 7881 */ NULL, +/* 7882 */ NULL, +/* 7883 */ NULL, +/* 7884 */ NULL, +/* 7885 */ NULL, +/* 7886 */ NULL, +/* 7887 */ NULL, +/* 7888 */ NULL, +/* 7889 */ NULL, +/* 788a */ NULL, +/* 788b */ NULL, +/* 788c */ NULL, +/* 788d */ NULL, +/* 788e */ NULL, +/* 788f */ NULL, +/* 7890 */ NULL, +/* 7891 */ NULL, +/* 7892 */ NULL, +/* 7893 */ NULL, +/* 7894 */ NULL, +/* 7895 */ NULL, +/* 7896 */ NULL, +/* 7897 */ NULL, +/* 7898 */ NULL, +/* 7899 */ NULL, +/* 789a */ NULL, +/* 789b */ NULL, +/* 789c */ NULL, +/* 789d */ NULL, +/* 789e */ NULL, +/* 789f */ NULL, +/* 78a0 */ NULL, +/* 78a1 */ NULL, +/* 78a2 */ NULL, +/* 78a3 */ NULL, +/* 78a4 */ NULL, +/* 78a5 */ NULL, +/* 78a6 */ NULL, +/* 78a7 */ NULL, +/* 78a8 */ NULL, +/* 78a9 */ NULL, +/* 78aa */ NULL, +/* 78ab */ NULL, +/* 78ac */ NULL, +/* 78ad */ NULL, +/* 78ae */ NULL, +/* 78af */ NULL, +/* 78b0 */ NULL, +/* 78b1 */ NULL, +/* 78b2 */ NULL, +/* 78b3 */ NULL, +/* 78b4 */ NULL, +/* 78b5 */ NULL, +/* 78b6 */ NULL, +/* 78b7 */ NULL, +/* 78b8 */ NULL, +/* 78b9 */ NULL, +/* 78ba */ NULL, +/* 78bb */ NULL, +/* 78bc */ NULL, +/* 78bd */ NULL, +/* 78be */ NULL, +/* 78bf */ NULL, +/* 78c0 */ NULL, +/* 78c1 */ NULL, +/* 78c2 */ NULL, +/* 78c3 */ NULL, +/* 78c4 */ NULL, +/* 78c5 */ NULL, +/* 78c6 */ NULL, +/* 78c7 */ NULL, +/* 78c8 */ NULL, +/* 78c9 */ NULL, +/* 78ca */ NULL, +/* 78cb */ NULL, +/* 78cc */ NULL, +/* 78cd */ NULL, +/* 78ce */ NULL, +/* 78cf */ NULL, +/* 78d0 */ NULL, +/* 78d1 */ NULL, +/* 78d2 */ NULL, +/* 78d3 */ NULL, +/* 78d4 */ NULL, +/* 78d5 */ NULL, +/* 78d6 */ NULL, +/* 78d7 */ NULL, +/* 78d8 */ NULL, +/* 78d9 */ NULL, +/* 78da */ NULL, +/* 78db */ NULL, +/* 78dc */ NULL, +/* 78dd */ NULL, +/* 78de */ NULL, +/* 78df */ NULL, +/* 78e0 */ NULL, +/* 78e1 */ NULL, +/* 78e2 */ NULL, +/* 78e3 */ NULL, +/* 78e4 */ NULL, +/* 78e5 */ NULL, +/* 78e6 */ NULL, +/* 78e7 */ NULL, +/* 78e8 */ NULL, +/* 78e9 */ NULL, +/* 78ea */ NULL, +/* 78eb */ NULL, +/* 78ec */ NULL, +/* 78ed */ NULL, +/* 78ee */ NULL, +/* 78ef */ NULL, +/* 78f0 */ NULL, +/* 78f1 */ NULL, +/* 78f2 */ NULL, +/* 78f3 */ NULL, +/* 78f4 */ NULL, +/* 78f5 */ NULL, +/* 78f6 */ NULL, +/* 78f7 */ NULL, +/* 78f8 */ NULL, +/* 78f9 */ NULL, +/* 78fa */ NULL, +/* 78fb */ NULL, +/* 78fc */ NULL, +/* 78fd */ NULL, +/* 78fe */ NULL, +/* 78ff */ NULL, +/* 7900 */ NULL, +/* 7901 */ NULL, +/* 7902 */ NULL, +/* 7903 */ NULL, +/* 7904 */ NULL, +/* 7905 */ NULL, +/* 7906 */ NULL, +/* 7907 */ NULL, +/* 7908 */ NULL, +/* 7909 */ NULL, +/* 790a */ NULL, +/* 790b */ NULL, +/* 790c */ NULL, +/* 790d */ NULL, +/* 790e */ NULL, +/* 790f */ NULL, +/* 7910 */ NULL, +/* 7911 */ NULL, +/* 7912 */ NULL, +/* 7913 */ NULL, +/* 7914 */ NULL, +/* 7915 */ NULL, +/* 7916 */ NULL, +/* 7917 */ NULL, +/* 7918 */ NULL, +/* 7919 */ NULL, +/* 791a */ NULL, +/* 791b */ NULL, +/* 791c */ NULL, +/* 791d */ NULL, +/* 791e */ NULL, +/* 791f */ NULL, +/* 7920 */ NULL, +/* 7921 */ NULL, +/* 7922 */ NULL, +/* 7923 */ NULL, +/* 7924 */ NULL, +/* 7925 */ NULL, +/* 7926 */ NULL, +/* 7927 */ NULL, +/* 7928 */ NULL, +/* 7929 */ NULL, +/* 792a */ NULL, +/* 792b */ NULL, +/* 792c */ NULL, +/* 792d */ NULL, +/* 792e */ NULL, +/* 792f */ NULL, +/* 7930 */ NULL, +/* 7931 */ NULL, +/* 7932 */ NULL, +/* 7933 */ NULL, +/* 7934 */ NULL, +/* 7935 */ NULL, +/* 7936 */ NULL, +/* 7937 */ NULL, +/* 7938 */ NULL, +/* 7939 */ NULL, +/* 793a */ NULL, +/* 793b */ NULL, +/* 793c */ NULL, +/* 793d */ NULL, +/* 793e */ NULL, +/* 793f */ NULL, +/* 7940 */ NULL, +/* 7941 */ NULL, +/* 7942 */ NULL, +/* 7943 */ NULL, +/* 7944 */ NULL, +/* 7945 */ NULL, +/* 7946 */ NULL, +/* 7947 */ NULL, +/* 7948 */ NULL, +/* 7949 */ NULL, +/* 794a */ NULL, +/* 794b */ NULL, +/* 794c */ NULL, +/* 794d */ NULL, +/* 794e */ NULL, +/* 794f */ NULL, +/* 7950 */ NULL, +/* 7951 */ NULL, +/* 7952 */ NULL, +/* 7953 */ NULL, +/* 7954 */ NULL, +/* 7955 */ NULL, +/* 7956 */ NULL, +/* 7957 */ NULL, +/* 7958 */ NULL, +/* 7959 */ NULL, +/* 795a */ NULL, +/* 795b */ NULL, +/* 795c */ NULL, +/* 795d */ NULL, +/* 795e */ NULL, +/* 795f */ NULL, +/* 7960 */ NULL, +/* 7961 */ NULL, +/* 7962 */ NULL, +/* 7963 */ NULL, +/* 7964 */ NULL, +/* 7965 */ NULL, +/* 7966 */ NULL, +/* 7967 */ NULL, +/* 7968 */ NULL, +/* 7969 */ NULL, +/* 796a */ NULL, +/* 796b */ NULL, +/* 796c */ NULL, +/* 796d */ NULL, +/* 796e */ NULL, +/* 796f */ NULL, +/* 7970 */ NULL, +/* 7971 */ NULL, +/* 7972 */ NULL, +/* 7973 */ NULL, +/* 7974 */ NULL, +/* 7975 */ NULL, +/* 7976 */ NULL, +/* 7977 */ NULL, +/* 7978 */ NULL, +/* 7979 */ NULL, +/* 797a */ NULL, +/* 797b */ NULL, +/* 797c */ NULL, +/* 797d */ NULL, +/* 797e */ NULL, +/* 797f */ NULL, +/* 7980 */ NULL, +/* 7981 */ NULL, +/* 7982 */ NULL, +/* 7983 */ NULL, +/* 7984 */ NULL, +/* 7985 */ NULL, +/* 7986 */ NULL, +/* 7987 */ NULL, +/* 7988 */ NULL, +/* 7989 */ NULL, +/* 798a */ NULL, +/* 798b */ NULL, +/* 798c */ NULL, +/* 798d */ NULL, +/* 798e */ NULL, +/* 798f */ NULL, +/* 7990 */ NULL, +/* 7991 */ NULL, +/* 7992 */ NULL, +/* 7993 */ NULL, +/* 7994 */ NULL, +/* 7995 */ NULL, +/* 7996 */ NULL, +/* 7997 */ NULL, +/* 7998 */ NULL, +/* 7999 */ NULL, +/* 799a */ NULL, +/* 799b */ NULL, +/* 799c */ NULL, +/* 799d */ NULL, +/* 799e */ NULL, +/* 799f */ NULL, +/* 79a0 */ NULL, +/* 79a1 */ NULL, +/* 79a2 */ NULL, +/* 79a3 */ NULL, +/* 79a4 */ NULL, +/* 79a5 */ NULL, +/* 79a6 */ NULL, +/* 79a7 */ NULL, +/* 79a8 */ NULL, +/* 79a9 */ NULL, +/* 79aa */ NULL, +/* 79ab */ NULL, +/* 79ac */ NULL, +/* 79ad */ NULL, +/* 79ae */ NULL, +/* 79af */ NULL, +/* 79b0 */ NULL, +/* 79b1 */ NULL, +/* 79b2 */ NULL, +/* 79b3 */ NULL, +/* 79b4 */ NULL, +/* 79b5 */ NULL, +/* 79b6 */ NULL, +/* 79b7 */ NULL, +/* 79b8 */ NULL, +/* 79b9 */ NULL, +/* 79ba */ NULL, +/* 79bb */ NULL, +/* 79bc */ NULL, +/* 79bd */ NULL, +/* 79be */ NULL, +/* 79bf */ NULL, +/* 79c0 */ NULL, +/* 79c1 */ NULL, +/* 79c2 */ NULL, +/* 79c3 */ NULL, +/* 79c4 */ NULL, +/* 79c5 */ NULL, +/* 79c6 */ NULL, +/* 79c7 */ NULL, +/* 79c8 */ NULL, +/* 79c9 */ NULL, +/* 79ca */ NULL, +/* 79cb */ NULL, +/* 79cc */ NULL, +/* 79cd */ NULL, +/* 79ce */ NULL, +/* 79cf */ NULL, +/* 79d0 */ NULL, +/* 79d1 */ NULL, +/* 79d2 */ NULL, +/* 79d3 */ NULL, +/* 79d4 */ NULL, +/* 79d5 */ NULL, +/* 79d6 */ NULL, +/* 79d7 */ NULL, +/* 79d8 */ NULL, +/* 79d9 */ NULL, +/* 79da */ NULL, +/* 79db */ NULL, +/* 79dc */ NULL, +/* 79dd */ NULL, +/* 79de */ NULL, +/* 79df */ NULL, +/* 79e0 */ NULL, +/* 79e1 */ NULL, +/* 79e2 */ NULL, +/* 79e3 */ NULL, +/* 79e4 */ NULL, +/* 79e5 */ NULL, +/* 79e6 */ NULL, +/* 79e7 */ NULL, +/* 79e8 */ NULL, +/* 79e9 */ NULL, +/* 79ea */ NULL, +/* 79eb */ NULL, +/* 79ec */ NULL, +/* 79ed */ NULL, +/* 79ee */ NULL, +/* 79ef */ NULL, +/* 79f0 */ NULL, +/* 79f1 */ NULL, +/* 79f2 */ NULL, +/* 79f3 */ NULL, +/* 79f4 */ NULL, +/* 79f5 */ NULL, +/* 79f6 */ NULL, +/* 79f7 */ NULL, +/* 79f8 */ NULL, +/* 79f9 */ NULL, +/* 79fa */ NULL, +/* 79fb */ NULL, +/* 79fc */ NULL, +/* 79fd */ NULL, +/* 79fe */ NULL, +/* 79ff */ NULL, +/* 7a00 */ NULL, +/* 7a01 */ NULL, +/* 7a02 */ NULL, +/* 7a03 */ NULL, +/* 7a04 */ NULL, +/* 7a05 */ NULL, +/* 7a06 */ NULL, +/* 7a07 */ NULL, +/* 7a08 */ NULL, +/* 7a09 */ NULL, +/* 7a0a */ NULL, +/* 7a0b */ NULL, +/* 7a0c */ NULL, +/* 7a0d */ NULL, +/* 7a0e */ NULL, +/* 7a0f */ NULL, +/* 7a10 */ NULL, +/* 7a11 */ NULL, +/* 7a12 */ NULL, +/* 7a13 */ NULL, +/* 7a14 */ NULL, +/* 7a15 */ NULL, +/* 7a16 */ NULL, +/* 7a17 */ NULL, +/* 7a18 */ NULL, +/* 7a19 */ NULL, +/* 7a1a */ NULL, +/* 7a1b */ NULL, +/* 7a1c */ NULL, +/* 7a1d */ NULL, +/* 7a1e */ NULL, +/* 7a1f */ NULL, +/* 7a20 */ NULL, +/* 7a21 */ NULL, +/* 7a22 */ NULL, +/* 7a23 */ NULL, +/* 7a24 */ NULL, +/* 7a25 */ NULL, +/* 7a26 */ NULL, +/* 7a27 */ NULL, +/* 7a28 */ NULL, +/* 7a29 */ NULL, +/* 7a2a */ NULL, +/* 7a2b */ NULL, +/* 7a2c */ NULL, +/* 7a2d */ NULL, +/* 7a2e */ NULL, +/* 7a2f */ NULL, +/* 7a30 */ NULL, +/* 7a31 */ NULL, +/* 7a32 */ NULL, +/* 7a33 */ NULL, +/* 7a34 */ NULL, +/* 7a35 */ NULL, +/* 7a36 */ NULL, +/* 7a37 */ NULL, +/* 7a38 */ NULL, +/* 7a39 */ NULL, +/* 7a3a */ NULL, +/* 7a3b */ NULL, +/* 7a3c */ NULL, +/* 7a3d */ NULL, +/* 7a3e */ NULL, +/* 7a3f */ NULL, +/* 7a40 */ NULL, +/* 7a41 */ NULL, +/* 7a42 */ NULL, +/* 7a43 */ NULL, +/* 7a44 */ NULL, +/* 7a45 */ NULL, +/* 7a46 */ NULL, +/* 7a47 */ NULL, +/* 7a48 */ NULL, +/* 7a49 */ NULL, +/* 7a4a */ NULL, +/* 7a4b */ NULL, +/* 7a4c */ NULL, +/* 7a4d */ NULL, +/* 7a4e */ NULL, +/* 7a4f */ NULL, +/* 7a50 */ NULL, +/* 7a51 */ NULL, +/* 7a52 */ NULL, +/* 7a53 */ NULL, +/* 7a54 */ NULL, +/* 7a55 */ NULL, +/* 7a56 */ NULL, +/* 7a57 */ NULL, +/* 7a58 */ NULL, +/* 7a59 */ NULL, +/* 7a5a */ NULL, +/* 7a5b */ NULL, +/* 7a5c */ NULL, +/* 7a5d */ NULL, +/* 7a5e */ NULL, +/* 7a5f */ NULL, +/* 7a60 */ NULL, +/* 7a61 */ NULL, +/* 7a62 */ NULL, +/* 7a63 */ NULL, +/* 7a64 */ NULL, +/* 7a65 */ NULL, +/* 7a66 */ NULL, +/* 7a67 */ NULL, +/* 7a68 */ NULL, +/* 7a69 */ NULL, +/* 7a6a */ NULL, +/* 7a6b */ NULL, +/* 7a6c */ NULL, +/* 7a6d */ NULL, +/* 7a6e */ NULL, +/* 7a6f */ NULL, +/* 7a70 */ NULL, +/* 7a71 */ NULL, +/* 7a72 */ NULL, +/* 7a73 */ NULL, +/* 7a74 */ NULL, +/* 7a75 */ NULL, +/* 7a76 */ NULL, +/* 7a77 */ NULL, +/* 7a78 */ NULL, +/* 7a79 */ NULL, +/* 7a7a */ NULL, +/* 7a7b */ NULL, +/* 7a7c */ NULL, +/* 7a7d */ NULL, +/* 7a7e */ NULL, +/* 7a7f */ NULL, +/* 7a80 */ NULL, +/* 7a81 */ NULL, +/* 7a82 */ NULL, +/* 7a83 */ NULL, +/* 7a84 */ NULL, +/* 7a85 */ NULL, +/* 7a86 */ NULL, +/* 7a87 */ NULL, +/* 7a88 */ NULL, +/* 7a89 */ NULL, +/* 7a8a */ NULL, +/* 7a8b */ NULL, +/* 7a8c */ NULL, +/* 7a8d */ NULL, +/* 7a8e */ NULL, +/* 7a8f */ NULL, +/* 7a90 */ NULL, +/* 7a91 */ NULL, +/* 7a92 */ NULL, +/* 7a93 */ NULL, +/* 7a94 */ NULL, +/* 7a95 */ NULL, +/* 7a96 */ NULL, +/* 7a97 */ NULL, +/* 7a98 */ NULL, +/* 7a99 */ NULL, +/* 7a9a */ NULL, +/* 7a9b */ NULL, +/* 7a9c */ NULL, +/* 7a9d */ NULL, +/* 7a9e */ NULL, +/* 7a9f */ NULL, +/* 7aa0 */ NULL, +/* 7aa1 */ NULL, +/* 7aa2 */ NULL, +/* 7aa3 */ NULL, +/* 7aa4 */ NULL, +/* 7aa5 */ NULL, +/* 7aa6 */ NULL, +/* 7aa7 */ NULL, +/* 7aa8 */ NULL, +/* 7aa9 */ NULL, +/* 7aaa */ NULL, +/* 7aab */ NULL, +/* 7aac */ NULL, +/* 7aad */ NULL, +/* 7aae */ NULL, +/* 7aaf */ NULL, +/* 7ab0 */ NULL, +/* 7ab1 */ NULL, +/* 7ab2 */ NULL, +/* 7ab3 */ NULL, +/* 7ab4 */ NULL, +/* 7ab5 */ NULL, +/* 7ab6 */ NULL, +/* 7ab7 */ NULL, +/* 7ab8 */ NULL, +/* 7ab9 */ NULL, +/* 7aba */ NULL, +/* 7abb */ NULL, +/* 7abc */ NULL, +/* 7abd */ NULL, +/* 7abe */ NULL, +/* 7abf */ NULL, +/* 7ac0 */ NULL, +/* 7ac1 */ NULL, +/* 7ac2 */ NULL, +/* 7ac3 */ NULL, +/* 7ac4 */ NULL, +/* 7ac5 */ NULL, +/* 7ac6 */ NULL, +/* 7ac7 */ NULL, +/* 7ac8 */ NULL, +/* 7ac9 */ NULL, +/* 7aca */ NULL, +/* 7acb */ NULL, +/* 7acc */ NULL, +/* 7acd */ NULL, +/* 7ace */ NULL, +/* 7acf */ NULL, +/* 7ad0 */ NULL, +/* 7ad1 */ NULL, +/* 7ad2 */ NULL, +/* 7ad3 */ NULL, +/* 7ad4 */ NULL, +/* 7ad5 */ NULL, +/* 7ad6 */ NULL, +/* 7ad7 */ NULL, +/* 7ad8 */ NULL, +/* 7ad9 */ NULL, +/* 7ada */ NULL, +/* 7adb */ NULL, +/* 7adc */ NULL, +/* 7add */ NULL, +/* 7ade */ NULL, +/* 7adf */ NULL, +/* 7ae0 */ NULL, +/* 7ae1 */ NULL, +/* 7ae2 */ NULL, +/* 7ae3 */ NULL, +/* 7ae4 */ NULL, +/* 7ae5 */ NULL, +/* 7ae6 */ NULL, +/* 7ae7 */ NULL, +/* 7ae8 */ NULL, +/* 7ae9 */ NULL, +/* 7aea */ NULL, +/* 7aeb */ NULL, +/* 7aec */ NULL, +/* 7aed */ NULL, +/* 7aee */ NULL, +/* 7aef */ NULL, +/* 7af0 */ NULL, +/* 7af1 */ NULL, +/* 7af2 */ NULL, +/* 7af3 */ NULL, +/* 7af4 */ NULL, +/* 7af5 */ NULL, +/* 7af6 */ NULL, +/* 7af7 */ NULL, +/* 7af8 */ NULL, +/* 7af9 */ NULL, +/* 7afa */ NULL, +/* 7afb */ NULL, +/* 7afc */ NULL, +/* 7afd */ NULL, +/* 7afe */ NULL, +/* 7aff */ NULL, +/* 7b00 */ NULL, +/* 7b01 */ NULL, +/* 7b02 */ NULL, +/* 7b03 */ NULL, +/* 7b04 */ NULL, +/* 7b05 */ NULL, +/* 7b06 */ NULL, +/* 7b07 */ NULL, +/* 7b08 */ NULL, +/* 7b09 */ NULL, +/* 7b0a */ NULL, +/* 7b0b */ NULL, +/* 7b0c */ NULL, +/* 7b0d */ NULL, +/* 7b0e */ NULL, +/* 7b0f */ NULL, +/* 7b10 */ NULL, +/* 7b11 */ NULL, +/* 7b12 */ NULL, +/* 7b13 */ NULL, +/* 7b14 */ NULL, +/* 7b15 */ NULL, +/* 7b16 */ NULL, +/* 7b17 */ NULL, +/* 7b18 */ NULL, +/* 7b19 */ NULL, +/* 7b1a */ NULL, +/* 7b1b */ NULL, +/* 7b1c */ NULL, +/* 7b1d */ NULL, +/* 7b1e */ NULL, +/* 7b1f */ NULL, +/* 7b20 */ NULL, +/* 7b21 */ NULL, +/* 7b22 */ NULL, +/* 7b23 */ NULL, +/* 7b24 */ NULL, +/* 7b25 */ NULL, +/* 7b26 */ NULL, +/* 7b27 */ NULL, +/* 7b28 */ NULL, +/* 7b29 */ NULL, +/* 7b2a */ NULL, +/* 7b2b */ NULL, +/* 7b2c */ NULL, +/* 7b2d */ NULL, +/* 7b2e */ NULL, +/* 7b2f */ NULL, +/* 7b30 */ NULL, +/* 7b31 */ NULL, +/* 7b32 */ NULL, +/* 7b33 */ NULL, +/* 7b34 */ NULL, +/* 7b35 */ NULL, +/* 7b36 */ NULL, +/* 7b37 */ NULL, +/* 7b38 */ NULL, +/* 7b39 */ NULL, +/* 7b3a */ NULL, +/* 7b3b */ NULL, +/* 7b3c */ NULL, +/* 7b3d */ NULL, +/* 7b3e */ NULL, +/* 7b3f */ NULL, +/* 7b40 */ NULL, +/* 7b41 */ NULL, +/* 7b42 */ NULL, +/* 7b43 */ NULL, +/* 7b44 */ NULL, +/* 7b45 */ NULL, +/* 7b46 */ NULL, +/* 7b47 */ NULL, +/* 7b48 */ NULL, +/* 7b49 */ NULL, +/* 7b4a */ NULL, +/* 7b4b */ NULL, +/* 7b4c */ NULL, +/* 7b4d */ NULL, +/* 7b4e */ NULL, +/* 7b4f */ NULL, +/* 7b50 */ NULL, +/* 7b51 */ NULL, +/* 7b52 */ NULL, +/* 7b53 */ NULL, +/* 7b54 */ NULL, +/* 7b55 */ NULL, +/* 7b56 */ NULL, +/* 7b57 */ NULL, +/* 7b58 */ NULL, +/* 7b59 */ NULL, +/* 7b5a */ NULL, +/* 7b5b */ NULL, +/* 7b5c */ NULL, +/* 7b5d */ NULL, +/* 7b5e */ NULL, +/* 7b5f */ NULL, +/* 7b60 */ NULL, +/* 7b61 */ NULL, +/* 7b62 */ NULL, +/* 7b63 */ NULL, +/* 7b64 */ NULL, +/* 7b65 */ NULL, +/* 7b66 */ NULL, +/* 7b67 */ NULL, +/* 7b68 */ NULL, +/* 7b69 */ NULL, +/* 7b6a */ NULL, +/* 7b6b */ NULL, +/* 7b6c */ NULL, +/* 7b6d */ NULL, +/* 7b6e */ NULL, +/* 7b6f */ NULL, +/* 7b70 */ NULL, +/* 7b71 */ NULL, +/* 7b72 */ NULL, +/* 7b73 */ NULL, +/* 7b74 */ NULL, +/* 7b75 */ NULL, +/* 7b76 */ NULL, +/* 7b77 */ NULL, +/* 7b78 */ NULL, +/* 7b79 */ NULL, +/* 7b7a */ NULL, +/* 7b7b */ NULL, +/* 7b7c */ NULL, +/* 7b7d */ NULL, +/* 7b7e */ NULL, +/* 7b7f */ NULL, +/* 7b80 */ NULL, +/* 7b81 */ NULL, +/* 7b82 */ NULL, +/* 7b83 */ NULL, +/* 7b84 */ NULL, +/* 7b85 */ NULL, +/* 7b86 */ NULL, +/* 7b87 */ NULL, +/* 7b88 */ NULL, +/* 7b89 */ NULL, +/* 7b8a */ NULL, +/* 7b8b */ NULL, +/* 7b8c */ NULL, +/* 7b8d */ NULL, +/* 7b8e */ NULL, +/* 7b8f */ NULL, +/* 7b90 */ NULL, +/* 7b91 */ NULL, +/* 7b92 */ NULL, +/* 7b93 */ NULL, +/* 7b94 */ NULL, +/* 7b95 */ NULL, +/* 7b96 */ NULL, +/* 7b97 */ NULL, +/* 7b98 */ NULL, +/* 7b99 */ NULL, +/* 7b9a */ NULL, +/* 7b9b */ NULL, +/* 7b9c */ NULL, +/* 7b9d */ NULL, +/* 7b9e */ NULL, +/* 7b9f */ NULL, +/* 7ba0 */ NULL, +/* 7ba1 */ NULL, +/* 7ba2 */ NULL, +/* 7ba3 */ NULL, +/* 7ba4 */ NULL, +/* 7ba5 */ NULL, +/* 7ba6 */ NULL, +/* 7ba7 */ NULL, +/* 7ba8 */ NULL, +/* 7ba9 */ NULL, +/* 7baa */ NULL, +/* 7bab */ NULL, +/* 7bac */ NULL, +/* 7bad */ NULL, +/* 7bae */ NULL, +/* 7baf */ NULL, +/* 7bb0 */ NULL, +/* 7bb1 */ NULL, +/* 7bb2 */ NULL, +/* 7bb3 */ NULL, +/* 7bb4 */ NULL, +/* 7bb5 */ NULL, +/* 7bb6 */ NULL, +/* 7bb7 */ NULL, +/* 7bb8 */ NULL, +/* 7bb9 */ NULL, +/* 7bba */ NULL, +/* 7bbb */ NULL, +/* 7bbc */ NULL, +/* 7bbd */ NULL, +/* 7bbe */ NULL, +/* 7bbf */ NULL, +/* 7bc0 */ NULL, +/* 7bc1 */ NULL, +/* 7bc2 */ NULL, +/* 7bc3 */ NULL, +/* 7bc4 */ NULL, +/* 7bc5 */ NULL, +/* 7bc6 */ NULL, +/* 7bc7 */ NULL, +/* 7bc8 */ NULL, +/* 7bc9 */ NULL, +/* 7bca */ NULL, +/* 7bcb */ NULL, +/* 7bcc */ NULL, +/* 7bcd */ NULL, +/* 7bce */ NULL, +/* 7bcf */ NULL, +/* 7bd0 */ NULL, +/* 7bd1 */ NULL, +/* 7bd2 */ NULL, +/* 7bd3 */ NULL, +/* 7bd4 */ NULL, +/* 7bd5 */ NULL, +/* 7bd6 */ NULL, +/* 7bd7 */ NULL, +/* 7bd8 */ NULL, +/* 7bd9 */ NULL, +/* 7bda */ NULL, +/* 7bdb */ NULL, +/* 7bdc */ NULL, +/* 7bdd */ NULL, +/* 7bde */ NULL, +/* 7bdf */ NULL, +/* 7be0 */ NULL, +/* 7be1 */ NULL, +/* 7be2 */ NULL, +/* 7be3 */ NULL, +/* 7be4 */ NULL, +/* 7be5 */ NULL, +/* 7be6 */ NULL, +/* 7be7 */ NULL, +/* 7be8 */ NULL, +/* 7be9 */ NULL, +/* 7bea */ NULL, +/* 7beb */ NULL, +/* 7bec */ NULL, +/* 7bed */ NULL, +/* 7bee */ NULL, +/* 7bef */ NULL, +/* 7bf0 */ NULL, +/* 7bf1 */ NULL, +/* 7bf2 */ NULL, +/* 7bf3 */ NULL, +/* 7bf4 */ NULL, +/* 7bf5 */ NULL, +/* 7bf6 */ NULL, +/* 7bf7 */ NULL, +/* 7bf8 */ NULL, +/* 7bf9 */ NULL, +/* 7bfa */ NULL, +/* 7bfb */ NULL, +/* 7bfc */ NULL, +/* 7bfd */ NULL, +/* 7bfe */ NULL, +/* 7bff */ NULL, +/* 7c00 */ NULL, +/* 7c01 */ NULL, +/* 7c02 */ NULL, +/* 7c03 */ NULL, +/* 7c04 */ NULL, +/* 7c05 */ NULL, +/* 7c06 */ NULL, +/* 7c07 */ NULL, +/* 7c08 */ NULL, +/* 7c09 */ NULL, +/* 7c0a */ NULL, +/* 7c0b */ NULL, +/* 7c0c */ NULL, +/* 7c0d */ NULL, +/* 7c0e */ NULL, +/* 7c0f */ NULL, +/* 7c10 */ NULL, +/* 7c11 */ NULL, +/* 7c12 */ NULL, +/* 7c13 */ NULL, +/* 7c14 */ NULL, +/* 7c15 */ NULL, +/* 7c16 */ NULL, +/* 7c17 */ NULL, +/* 7c18 */ NULL, +/* 7c19 */ NULL, +/* 7c1a */ NULL, +/* 7c1b */ NULL, +/* 7c1c */ NULL, +/* 7c1d */ NULL, +/* 7c1e */ NULL, +/* 7c1f */ NULL, +/* 7c20 */ NULL, +/* 7c21 */ NULL, +/* 7c22 */ NULL, +/* 7c23 */ NULL, +/* 7c24 */ NULL, +/* 7c25 */ NULL, +/* 7c26 */ NULL, +/* 7c27 */ NULL, +/* 7c28 */ NULL, +/* 7c29 */ NULL, +/* 7c2a */ NULL, +/* 7c2b */ NULL, +/* 7c2c */ NULL, +/* 7c2d */ NULL, +/* 7c2e */ NULL, +/* 7c2f */ NULL, +/* 7c30 */ NULL, +/* 7c31 */ NULL, +/* 7c32 */ NULL, +/* 7c33 */ NULL, +/* 7c34 */ NULL, +/* 7c35 */ NULL, +/* 7c36 */ NULL, +/* 7c37 */ NULL, +/* 7c38 */ NULL, +/* 7c39 */ NULL, +/* 7c3a */ NULL, +/* 7c3b */ NULL, +/* 7c3c */ NULL, +/* 7c3d */ NULL, +/* 7c3e */ NULL, +/* 7c3f */ NULL, +/* 7c40 */ NULL, +/* 7c41 */ NULL, +/* 7c42 */ NULL, +/* 7c43 */ NULL, +/* 7c44 */ NULL, +/* 7c45 */ NULL, +/* 7c46 */ NULL, +/* 7c47 */ NULL, +/* 7c48 */ NULL, +/* 7c49 */ NULL, +/* 7c4a */ NULL, +/* 7c4b */ NULL, +/* 7c4c */ NULL, +/* 7c4d */ NULL, +/* 7c4e */ NULL, +/* 7c4f */ NULL, +/* 7c50 */ NULL, +/* 7c51 */ NULL, +/* 7c52 */ NULL, +/* 7c53 */ NULL, +/* 7c54 */ NULL, +/* 7c55 */ NULL, +/* 7c56 */ NULL, +/* 7c57 */ NULL, +/* 7c58 */ NULL, +/* 7c59 */ NULL, +/* 7c5a */ NULL, +/* 7c5b */ NULL, +/* 7c5c */ NULL, +/* 7c5d */ NULL, +/* 7c5e */ NULL, +/* 7c5f */ NULL, +/* 7c60 */ NULL, +/* 7c61 */ NULL, +/* 7c62 */ NULL, +/* 7c63 */ NULL, +/* 7c64 */ NULL, +/* 7c65 */ NULL, +/* 7c66 */ NULL, +/* 7c67 */ NULL, +/* 7c68 */ NULL, +/* 7c69 */ NULL, +/* 7c6a */ NULL, +/* 7c6b */ NULL, +/* 7c6c */ NULL, +/* 7c6d */ NULL, +/* 7c6e */ NULL, +/* 7c6f */ NULL, +/* 7c70 */ NULL, +/* 7c71 */ NULL, +/* 7c72 */ NULL, +/* 7c73 */ NULL, +/* 7c74 */ NULL, +/* 7c75 */ NULL, +/* 7c76 */ NULL, +/* 7c77 */ NULL, +/* 7c78 */ NULL, +/* 7c79 */ NULL, +/* 7c7a */ NULL, +/* 7c7b */ NULL, +/* 7c7c */ NULL, +/* 7c7d */ NULL, +/* 7c7e */ NULL, +/* 7c7f */ NULL, +/* 7c80 */ NULL, +/* 7c81 */ NULL, +/* 7c82 */ NULL, +/* 7c83 */ NULL, +/* 7c84 */ NULL, +/* 7c85 */ NULL, +/* 7c86 */ NULL, +/* 7c87 */ NULL, +/* 7c88 */ NULL, +/* 7c89 */ NULL, +/* 7c8a */ NULL, +/* 7c8b */ NULL, +/* 7c8c */ NULL, +/* 7c8d */ NULL, +/* 7c8e */ NULL, +/* 7c8f */ NULL, +/* 7c90 */ NULL, +/* 7c91 */ NULL, +/* 7c92 */ NULL, +/* 7c93 */ NULL, +/* 7c94 */ NULL, +/* 7c95 */ NULL, +/* 7c96 */ NULL, +/* 7c97 */ NULL, +/* 7c98 */ NULL, +/* 7c99 */ NULL, +/* 7c9a */ NULL, +/* 7c9b */ NULL, +/* 7c9c */ NULL, +/* 7c9d */ NULL, +/* 7c9e */ NULL, +/* 7c9f */ NULL, +/* 7ca0 */ NULL, +/* 7ca1 */ NULL, +/* 7ca2 */ NULL, +/* 7ca3 */ NULL, +/* 7ca4 */ NULL, +/* 7ca5 */ NULL, +/* 7ca6 */ NULL, +/* 7ca7 */ NULL, +/* 7ca8 */ NULL, +/* 7ca9 */ NULL, +/* 7caa */ NULL, +/* 7cab */ NULL, +/* 7cac */ NULL, +/* 7cad */ NULL, +/* 7cae */ NULL, +/* 7caf */ NULL, +/* 7cb0 */ NULL, +/* 7cb1 */ NULL, +/* 7cb2 */ NULL, +/* 7cb3 */ NULL, +/* 7cb4 */ NULL, +/* 7cb5 */ NULL, +/* 7cb6 */ NULL, +/* 7cb7 */ NULL, +/* 7cb8 */ NULL, +/* 7cb9 */ NULL, +/* 7cba */ NULL, +/* 7cbb */ NULL, +/* 7cbc */ NULL, +/* 7cbd */ NULL, +/* 7cbe */ NULL, +/* 7cbf */ NULL, +/* 7cc0 */ NULL, +/* 7cc1 */ NULL, +/* 7cc2 */ NULL, +/* 7cc3 */ NULL, +/* 7cc4 */ NULL, +/* 7cc5 */ NULL, +/* 7cc6 */ NULL, +/* 7cc7 */ NULL, +/* 7cc8 */ NULL, +/* 7cc9 */ NULL, +/* 7cca */ NULL, +/* 7ccb */ NULL, +/* 7ccc */ NULL, +/* 7ccd */ NULL, +/* 7cce */ NULL, +/* 7ccf */ NULL, +/* 7cd0 */ NULL, +/* 7cd1 */ NULL, +/* 7cd2 */ NULL, +/* 7cd3 */ NULL, +/* 7cd4 */ NULL, +/* 7cd5 */ NULL, +/* 7cd6 */ NULL, +/* 7cd7 */ NULL, +/* 7cd8 */ NULL, +/* 7cd9 */ NULL, +/* 7cda */ NULL, +/* 7cdb */ NULL, +/* 7cdc */ NULL, +/* 7cdd */ NULL, +/* 7cde */ NULL, +/* 7cdf */ NULL, +/* 7ce0 */ NULL, +/* 7ce1 */ NULL, +/* 7ce2 */ NULL, +/* 7ce3 */ NULL, +/* 7ce4 */ NULL, +/* 7ce5 */ NULL, +/* 7ce6 */ NULL, +/* 7ce7 */ NULL, +/* 7ce8 */ NULL, +/* 7ce9 */ NULL, +/* 7cea */ NULL, +/* 7ceb */ NULL, +/* 7cec */ NULL, +/* 7ced */ NULL, +/* 7cee */ NULL, +/* 7cef */ NULL, +/* 7cf0 */ NULL, +/* 7cf1 */ NULL, +/* 7cf2 */ NULL, +/* 7cf3 */ NULL, +/* 7cf4 */ NULL, +/* 7cf5 */ NULL, +/* 7cf6 */ NULL, +/* 7cf7 */ NULL, +/* 7cf8 */ NULL, +/* 7cf9 */ NULL, +/* 7cfa */ NULL, +/* 7cfb */ NULL, +/* 7cfc */ NULL, +/* 7cfd */ NULL, +/* 7cfe */ NULL, +/* 7cff */ NULL, +/* 7d00 */ NULL, +/* 7d01 */ NULL, +/* 7d02 */ NULL, +/* 7d03 */ NULL, +/* 7d04 */ NULL, +/* 7d05 */ NULL, +/* 7d06 */ NULL, +/* 7d07 */ NULL, +/* 7d08 */ NULL, +/* 7d09 */ NULL, +/* 7d0a */ NULL, +/* 7d0b */ NULL, +/* 7d0c */ NULL, +/* 7d0d */ NULL, +/* 7d0e */ NULL, +/* 7d0f */ NULL, +/* 7d10 */ NULL, +/* 7d11 */ NULL, +/* 7d12 */ NULL, +/* 7d13 */ NULL, +/* 7d14 */ NULL, +/* 7d15 */ NULL, +/* 7d16 */ NULL, +/* 7d17 */ NULL, +/* 7d18 */ NULL, +/* 7d19 */ NULL, +/* 7d1a */ NULL, +/* 7d1b */ NULL, +/* 7d1c */ NULL, +/* 7d1d */ NULL, +/* 7d1e */ NULL, +/* 7d1f */ NULL, +/* 7d20 */ NULL, +/* 7d21 */ NULL, +/* 7d22 */ NULL, +/* 7d23 */ NULL, +/* 7d24 */ NULL, +/* 7d25 */ NULL, +/* 7d26 */ NULL, +/* 7d27 */ NULL, +/* 7d28 */ NULL, +/* 7d29 */ NULL, +/* 7d2a */ NULL, +/* 7d2b */ NULL, +/* 7d2c */ NULL, +/* 7d2d */ NULL, +/* 7d2e */ NULL, +/* 7d2f */ NULL, +/* 7d30 */ NULL, +/* 7d31 */ NULL, +/* 7d32 */ NULL, +/* 7d33 */ NULL, +/* 7d34 */ NULL, +/* 7d35 */ NULL, +/* 7d36 */ NULL, +/* 7d37 */ NULL, +/* 7d38 */ NULL, +/* 7d39 */ NULL, +/* 7d3a */ NULL, +/* 7d3b */ NULL, +/* 7d3c */ NULL, +/* 7d3d */ NULL, +/* 7d3e */ NULL, +/* 7d3f */ NULL, +/* 7d40 */ NULL, +/* 7d41 */ NULL, +/* 7d42 */ NULL, +/* 7d43 */ NULL, +/* 7d44 */ NULL, +/* 7d45 */ NULL, +/* 7d46 */ NULL, +/* 7d47 */ NULL, +/* 7d48 */ NULL, +/* 7d49 */ NULL, +/* 7d4a */ NULL, +/* 7d4b */ NULL, +/* 7d4c */ NULL, +/* 7d4d */ NULL, +/* 7d4e */ NULL, +/* 7d4f */ NULL, +/* 7d50 */ NULL, +/* 7d51 */ NULL, +/* 7d52 */ NULL, +/* 7d53 */ NULL, +/* 7d54 */ NULL, +/* 7d55 */ NULL, +/* 7d56 */ NULL, +/* 7d57 */ NULL, +/* 7d58 */ NULL, +/* 7d59 */ NULL, +/* 7d5a */ NULL, +/* 7d5b */ NULL, +/* 7d5c */ NULL, +/* 7d5d */ NULL, +/* 7d5e */ NULL, +/* 7d5f */ NULL, +/* 7d60 */ NULL, +/* 7d61 */ NULL, +/* 7d62 */ NULL, +/* 7d63 */ NULL, +/* 7d64 */ NULL, +/* 7d65 */ NULL, +/* 7d66 */ NULL, +/* 7d67 */ NULL, +/* 7d68 */ NULL, +/* 7d69 */ NULL, +/* 7d6a */ NULL, +/* 7d6b */ NULL, +/* 7d6c */ NULL, +/* 7d6d */ NULL, +/* 7d6e */ NULL, +/* 7d6f */ NULL, +/* 7d70 */ NULL, +/* 7d71 */ NULL, +/* 7d72 */ NULL, +/* 7d73 */ NULL, +/* 7d74 */ NULL, +/* 7d75 */ NULL, +/* 7d76 */ NULL, +/* 7d77 */ NULL, +/* 7d78 */ NULL, +/* 7d79 */ NULL, +/* 7d7a */ NULL, +/* 7d7b */ NULL, +/* 7d7c */ NULL, +/* 7d7d */ NULL, +/* 7d7e */ NULL, +/* 7d7f */ NULL, +/* 7d80 */ NULL, +/* 7d81 */ NULL, +/* 7d82 */ NULL, +/* 7d83 */ NULL, +/* 7d84 */ NULL, +/* 7d85 */ NULL, +/* 7d86 */ NULL, +/* 7d87 */ NULL, +/* 7d88 */ NULL, +/* 7d89 */ NULL, +/* 7d8a */ NULL, +/* 7d8b */ NULL, +/* 7d8c */ NULL, +/* 7d8d */ NULL, +/* 7d8e */ NULL, +/* 7d8f */ NULL, +/* 7d90 */ NULL, +/* 7d91 */ NULL, +/* 7d92 */ NULL, +/* 7d93 */ NULL, +/* 7d94 */ NULL, +/* 7d95 */ NULL, +/* 7d96 */ NULL, +/* 7d97 */ NULL, +/* 7d98 */ NULL, +/* 7d99 */ NULL, +/* 7d9a */ NULL, +/* 7d9b */ NULL, +/* 7d9c */ NULL, +/* 7d9d */ NULL, +/* 7d9e */ NULL, +/* 7d9f */ NULL, +/* 7da0 */ NULL, +/* 7da1 */ NULL, +/* 7da2 */ NULL, +/* 7da3 */ NULL, +/* 7da4 */ NULL, +/* 7da5 */ NULL, +/* 7da6 */ NULL, +/* 7da7 */ NULL, +/* 7da8 */ NULL, +/* 7da9 */ NULL, +/* 7daa */ NULL, +/* 7dab */ NULL, +/* 7dac */ NULL, +/* 7dad */ NULL, +/* 7dae */ NULL, +/* 7daf */ NULL, +/* 7db0 */ NULL, +/* 7db1 */ NULL, +/* 7db2 */ NULL, +/* 7db3 */ NULL, +/* 7db4 */ NULL, +/* 7db5 */ NULL, +/* 7db6 */ NULL, +/* 7db7 */ NULL, +/* 7db8 */ NULL, +/* 7db9 */ NULL, +/* 7dba */ NULL, +/* 7dbb */ NULL, +/* 7dbc */ NULL, +/* 7dbd */ NULL, +/* 7dbe */ NULL, +/* 7dbf */ NULL, +/* 7dc0 */ NULL, +/* 7dc1 */ NULL, +/* 7dc2 */ NULL, +/* 7dc3 */ NULL, +/* 7dc4 */ NULL, +/* 7dc5 */ NULL, +/* 7dc6 */ NULL, +/* 7dc7 */ NULL, +/* 7dc8 */ NULL, +/* 7dc9 */ NULL, +/* 7dca */ NULL, +/* 7dcb */ NULL, +/* 7dcc */ NULL, +/* 7dcd */ NULL, +/* 7dce */ NULL, +/* 7dcf */ NULL, +/* 7dd0 */ NULL, +/* 7dd1 */ NULL, +/* 7dd2 */ NULL, +/* 7dd3 */ NULL, +/* 7dd4 */ NULL, +/* 7dd5 */ NULL, +/* 7dd6 */ NULL, +/* 7dd7 */ NULL, +/* 7dd8 */ NULL, +/* 7dd9 */ NULL, +/* 7dda */ NULL, +/* 7ddb */ NULL, +/* 7ddc */ NULL, +/* 7ddd */ NULL, +/* 7dde */ NULL, +/* 7ddf */ NULL, +/* 7de0 */ NULL, +/* 7de1 */ NULL, +/* 7de2 */ NULL, +/* 7de3 */ NULL, +/* 7de4 */ NULL, +/* 7de5 */ NULL, +/* 7de6 */ NULL, +/* 7de7 */ NULL, +/* 7de8 */ NULL, +/* 7de9 */ NULL, +/* 7dea */ NULL, +/* 7deb */ NULL, +/* 7dec */ NULL, +/* 7ded */ NULL, +/* 7dee */ NULL, +/* 7def */ NULL, +/* 7df0 */ NULL, +/* 7df1 */ NULL, +/* 7df2 */ NULL, +/* 7df3 */ NULL, +/* 7df4 */ NULL, +/* 7df5 */ NULL, +/* 7df6 */ NULL, +/* 7df7 */ NULL, +/* 7df8 */ NULL, +/* 7df9 */ NULL, +/* 7dfa */ NULL, +/* 7dfb */ NULL, +/* 7dfc */ NULL, +/* 7dfd */ NULL, +/* 7dfe */ NULL, +/* 7dff */ NULL, +/* 7e00 */ NULL, +/* 7e01 */ NULL, +/* 7e02 */ NULL, +/* 7e03 */ NULL, +/* 7e04 */ NULL, +/* 7e05 */ NULL, +/* 7e06 */ NULL, +/* 7e07 */ NULL, +/* 7e08 */ NULL, +/* 7e09 */ NULL, +/* 7e0a */ NULL, +/* 7e0b */ NULL, +/* 7e0c */ NULL, +/* 7e0d */ NULL, +/* 7e0e */ NULL, +/* 7e0f */ NULL, +/* 7e10 */ NULL, +/* 7e11 */ NULL, +/* 7e12 */ NULL, +/* 7e13 */ NULL, +/* 7e14 */ NULL, +/* 7e15 */ NULL, +/* 7e16 */ NULL, +/* 7e17 */ NULL, +/* 7e18 */ NULL, +/* 7e19 */ NULL, +/* 7e1a */ NULL, +/* 7e1b */ NULL, +/* 7e1c */ NULL, +/* 7e1d */ NULL, +/* 7e1e */ NULL, +/* 7e1f */ NULL, +/* 7e20 */ NULL, +/* 7e21 */ NULL, +/* 7e22 */ NULL, +/* 7e23 */ NULL, +/* 7e24 */ NULL, +/* 7e25 */ NULL, +/* 7e26 */ NULL, +/* 7e27 */ NULL, +/* 7e28 */ NULL, +/* 7e29 */ NULL, +/* 7e2a */ NULL, +/* 7e2b */ NULL, +/* 7e2c */ NULL, +/* 7e2d */ NULL, +/* 7e2e */ NULL, +/* 7e2f */ NULL, +/* 7e30 */ NULL, +/* 7e31 */ NULL, +/* 7e32 */ NULL, +/* 7e33 */ NULL, +/* 7e34 */ NULL, +/* 7e35 */ NULL, +/* 7e36 */ NULL, +/* 7e37 */ NULL, +/* 7e38 */ NULL, +/* 7e39 */ NULL, +/* 7e3a */ NULL, +/* 7e3b */ NULL, +/* 7e3c */ NULL, +/* 7e3d */ NULL, +/* 7e3e */ NULL, +/* 7e3f */ NULL, +/* 7e40 */ NULL, +/* 7e41 */ NULL, +/* 7e42 */ NULL, +/* 7e43 */ NULL, +/* 7e44 */ NULL, +/* 7e45 */ NULL, +/* 7e46 */ NULL, +/* 7e47 */ NULL, +/* 7e48 */ NULL, +/* 7e49 */ NULL, +/* 7e4a */ NULL, +/* 7e4b */ NULL, +/* 7e4c */ NULL, +/* 7e4d */ NULL, +/* 7e4e */ NULL, +/* 7e4f */ NULL, +/* 7e50 */ NULL, +/* 7e51 */ NULL, +/* 7e52 */ NULL, +/* 7e53 */ NULL, +/* 7e54 */ NULL, +/* 7e55 */ NULL, +/* 7e56 */ NULL, +/* 7e57 */ NULL, +/* 7e58 */ NULL, +/* 7e59 */ NULL, +/* 7e5a */ NULL, +/* 7e5b */ NULL, +/* 7e5c */ NULL, +/* 7e5d */ NULL, +/* 7e5e */ NULL, +/* 7e5f */ NULL, +/* 7e60 */ NULL, +/* 7e61 */ NULL, +/* 7e62 */ NULL, +/* 7e63 */ NULL, +/* 7e64 */ NULL, +/* 7e65 */ NULL, +/* 7e66 */ NULL, +/* 7e67 */ NULL, +/* 7e68 */ NULL, +/* 7e69 */ NULL, +/* 7e6a */ NULL, +/* 7e6b */ NULL, +/* 7e6c */ NULL, +/* 7e6d */ NULL, +/* 7e6e */ NULL, +/* 7e6f */ NULL, +/* 7e70 */ NULL, +/* 7e71 */ NULL, +/* 7e72 */ NULL, +/* 7e73 */ NULL, +/* 7e74 */ NULL, +/* 7e75 */ NULL, +/* 7e76 */ NULL, +/* 7e77 */ NULL, +/* 7e78 */ NULL, +/* 7e79 */ NULL, +/* 7e7a */ NULL, +/* 7e7b */ NULL, +/* 7e7c */ NULL, +/* 7e7d */ NULL, +/* 7e7e */ NULL, +/* 7e7f */ NULL, +/* 7e80 */ NULL, +/* 7e81 */ NULL, +/* 7e82 */ NULL, +/* 7e83 */ NULL, +/* 7e84 */ NULL, +/* 7e85 */ NULL, +/* 7e86 */ NULL, +/* 7e87 */ NULL, +/* 7e88 */ NULL, +/* 7e89 */ NULL, +/* 7e8a */ NULL, +/* 7e8b */ NULL, +/* 7e8c */ NULL, +/* 7e8d */ NULL, +/* 7e8e */ NULL, +/* 7e8f */ NULL, +/* 7e90 */ NULL, +/* 7e91 */ NULL, +/* 7e92 */ NULL, +/* 7e93 */ NULL, +/* 7e94 */ NULL, +/* 7e95 */ NULL, +/* 7e96 */ NULL, +/* 7e97 */ NULL, +/* 7e98 */ NULL, +/* 7e99 */ NULL, +/* 7e9a */ NULL, +/* 7e9b */ NULL, +/* 7e9c */ NULL, +/* 7e9d */ NULL, +/* 7e9e */ NULL, +/* 7e9f */ NULL, +/* 7ea0 */ NULL, +/* 7ea1 */ NULL, +/* 7ea2 */ NULL, +/* 7ea3 */ NULL, +/* 7ea4 */ NULL, +/* 7ea5 */ NULL, +/* 7ea6 */ NULL, +/* 7ea7 */ NULL, +/* 7ea8 */ NULL, +/* 7ea9 */ NULL, +/* 7eaa */ NULL, +/* 7eab */ NULL, +/* 7eac */ NULL, +/* 7ead */ NULL, +/* 7eae */ NULL, +/* 7eaf */ NULL, +/* 7eb0 */ NULL, +/* 7eb1 */ NULL, +/* 7eb2 */ NULL, +/* 7eb3 */ NULL, +/* 7eb4 */ NULL, +/* 7eb5 */ NULL, +/* 7eb6 */ NULL, +/* 7eb7 */ NULL, +/* 7eb8 */ NULL, +/* 7eb9 */ NULL, +/* 7eba */ NULL, +/* 7ebb */ NULL, +/* 7ebc */ NULL, +/* 7ebd */ NULL, +/* 7ebe */ NULL, +/* 7ebf */ NULL, +/* 7ec0 */ NULL, +/* 7ec1 */ NULL, +/* 7ec2 */ NULL, +/* 7ec3 */ NULL, +/* 7ec4 */ NULL, +/* 7ec5 */ NULL, +/* 7ec6 */ NULL, +/* 7ec7 */ NULL, +/* 7ec8 */ NULL, +/* 7ec9 */ NULL, +/* 7eca */ NULL, +/* 7ecb */ NULL, +/* 7ecc */ NULL, +/* 7ecd */ NULL, +/* 7ece */ NULL, +/* 7ecf */ NULL, +/* 7ed0 */ NULL, +/* 7ed1 */ NULL, +/* 7ed2 */ NULL, +/* 7ed3 */ NULL, +/* 7ed4 */ NULL, +/* 7ed5 */ NULL, +/* 7ed6 */ NULL, +/* 7ed7 */ NULL, +/* 7ed8 */ NULL, +/* 7ed9 */ NULL, +/* 7eda */ NULL, +/* 7edb */ NULL, +/* 7edc */ NULL, +/* 7edd */ NULL, +/* 7ede */ NULL, +/* 7edf */ NULL, +/* 7ee0 */ NULL, +/* 7ee1 */ NULL, +/* 7ee2 */ NULL, +/* 7ee3 */ NULL, +/* 7ee4 */ NULL, +/* 7ee5 */ NULL, +/* 7ee6 */ NULL, +/* 7ee7 */ NULL, +/* 7ee8 */ NULL, +/* 7ee9 */ NULL, +/* 7eea */ NULL, +/* 7eeb */ NULL, +/* 7eec */ NULL, +/* 7eed */ NULL, +/* 7eee */ NULL, +/* 7eef */ NULL, +/* 7ef0 */ NULL, +/* 7ef1 */ NULL, +/* 7ef2 */ NULL, +/* 7ef3 */ NULL, +/* 7ef4 */ NULL, +/* 7ef5 */ NULL, +/* 7ef6 */ NULL, +/* 7ef7 */ NULL, +/* 7ef8 */ NULL, +/* 7ef9 */ NULL, +/* 7efa */ NULL, +/* 7efb */ NULL, +/* 7efc */ NULL, +/* 7efd */ NULL, +/* 7efe */ NULL, +/* 7eff */ NULL, +/* 7f00 */ NULL, +/* 7f01 */ NULL, +/* 7f02 */ NULL, +/* 7f03 */ NULL, +/* 7f04 */ NULL, +/* 7f05 */ NULL, +/* 7f06 */ NULL, +/* 7f07 */ NULL, +/* 7f08 */ NULL, +/* 7f09 */ NULL, +/* 7f0a */ NULL, +/* 7f0b */ NULL, +/* 7f0c */ NULL, +/* 7f0d */ NULL, +/* 7f0e */ NULL, +/* 7f0f */ NULL, +/* 7f10 */ NULL, +/* 7f11 */ NULL, +/* 7f12 */ NULL, +/* 7f13 */ NULL, +/* 7f14 */ NULL, +/* 7f15 */ NULL, +/* 7f16 */ NULL, +/* 7f17 */ NULL, +/* 7f18 */ NULL, +/* 7f19 */ NULL, +/* 7f1a */ NULL, +/* 7f1b */ NULL, +/* 7f1c */ NULL, +/* 7f1d */ NULL, +/* 7f1e */ NULL, +/* 7f1f */ NULL, +/* 7f20 */ NULL, +/* 7f21 */ NULL, +/* 7f22 */ NULL, +/* 7f23 */ NULL, +/* 7f24 */ NULL, +/* 7f25 */ NULL, +/* 7f26 */ NULL, +/* 7f27 */ NULL, +/* 7f28 */ NULL, +/* 7f29 */ NULL, +/* 7f2a */ NULL, +/* 7f2b */ NULL, +/* 7f2c */ NULL, +/* 7f2d */ NULL, +/* 7f2e */ NULL, +/* 7f2f */ NULL, +/* 7f30 */ NULL, +/* 7f31 */ NULL, +/* 7f32 */ NULL, +/* 7f33 */ NULL, +/* 7f34 */ NULL, +/* 7f35 */ NULL, +/* 7f36 */ NULL, +/* 7f37 */ NULL, +/* 7f38 */ NULL, +/* 7f39 */ NULL, +/* 7f3a */ NULL, +/* 7f3b */ NULL, +/* 7f3c */ NULL, +/* 7f3d */ NULL, +/* 7f3e */ NULL, +/* 7f3f */ NULL, +/* 7f40 */ NULL, +/* 7f41 */ NULL, +/* 7f42 */ NULL, +/* 7f43 */ NULL, +/* 7f44 */ NULL, +/* 7f45 */ NULL, +/* 7f46 */ NULL, +/* 7f47 */ NULL, +/* 7f48 */ NULL, +/* 7f49 */ NULL, +/* 7f4a */ NULL, +/* 7f4b */ NULL, +/* 7f4c */ NULL, +/* 7f4d */ NULL, +/* 7f4e */ NULL, +/* 7f4f */ NULL, +/* 7f50 */ NULL, +/* 7f51 */ NULL, +/* 7f52 */ NULL, +/* 7f53 */ NULL, +/* 7f54 */ NULL, +/* 7f55 */ NULL, +/* 7f56 */ NULL, +/* 7f57 */ NULL, +/* 7f58 */ NULL, +/* 7f59 */ NULL, +/* 7f5a */ NULL, +/* 7f5b */ NULL, +/* 7f5c */ NULL, +/* 7f5d */ NULL, +/* 7f5e */ NULL, +/* 7f5f */ NULL, +/* 7f60 */ NULL, +/* 7f61 */ NULL, +/* 7f62 */ NULL, +/* 7f63 */ NULL, +/* 7f64 */ NULL, +/* 7f65 */ NULL, +/* 7f66 */ NULL, +/* 7f67 */ NULL, +/* 7f68 */ NULL, +/* 7f69 */ NULL, +/* 7f6a */ NULL, +/* 7f6b */ NULL, +/* 7f6c */ NULL, +/* 7f6d */ NULL, +/* 7f6e */ NULL, +/* 7f6f */ NULL, +/* 7f70 */ NULL, +/* 7f71 */ NULL, +/* 7f72 */ NULL, +/* 7f73 */ NULL, +/* 7f74 */ NULL, +/* 7f75 */ NULL, +/* 7f76 */ NULL, +/* 7f77 */ NULL, +/* 7f78 */ NULL, +/* 7f79 */ NULL, +/* 7f7a */ NULL, +/* 7f7b */ NULL, +/* 7f7c */ NULL, +/* 7f7d */ NULL, +/* 7f7e */ NULL, +/* 7f7f */ NULL, +/* 7f80 */ NULL, +/* 7f81 */ NULL, +/* 7f82 */ NULL, +/* 7f83 */ NULL, +/* 7f84 */ NULL, +/* 7f85 */ NULL, +/* 7f86 */ NULL, +/* 7f87 */ NULL, +/* 7f88 */ NULL, +/* 7f89 */ NULL, +/* 7f8a */ NULL, +/* 7f8b */ NULL, +/* 7f8c */ NULL, +/* 7f8d */ NULL, +/* 7f8e */ NULL, +/* 7f8f */ NULL, +/* 7f90 */ NULL, +/* 7f91 */ NULL, +/* 7f92 */ NULL, +/* 7f93 */ NULL, +/* 7f94 */ NULL, +/* 7f95 */ NULL, +/* 7f96 */ NULL, +/* 7f97 */ NULL, +/* 7f98 */ NULL, +/* 7f99 */ NULL, +/* 7f9a */ NULL, +/* 7f9b */ NULL, +/* 7f9c */ NULL, +/* 7f9d */ NULL, +/* 7f9e */ NULL, +/* 7f9f */ NULL, +/* 7fa0 */ NULL, +/* 7fa1 */ NULL, +/* 7fa2 */ NULL, +/* 7fa3 */ NULL, +/* 7fa4 */ NULL, +/* 7fa5 */ NULL, +/* 7fa6 */ NULL, +/* 7fa7 */ NULL, +/* 7fa8 */ NULL, +/* 7fa9 */ NULL, +/* 7faa */ NULL, +/* 7fab */ NULL, +/* 7fac */ NULL, +/* 7fad */ NULL, +/* 7fae */ NULL, +/* 7faf */ NULL, +/* 7fb0 */ NULL, +/* 7fb1 */ NULL, +/* 7fb2 */ NULL, +/* 7fb3 */ NULL, +/* 7fb4 */ NULL, +/* 7fb5 */ NULL, +/* 7fb6 */ NULL, +/* 7fb7 */ NULL, +/* 7fb8 */ NULL, +/* 7fb9 */ NULL, +/* 7fba */ NULL, +/* 7fbb */ NULL, +/* 7fbc */ NULL, +/* 7fbd */ NULL, +/* 7fbe */ NULL, +/* 7fbf */ NULL, +/* 7fc0 */ NULL, +/* 7fc1 */ NULL, +/* 7fc2 */ NULL, +/* 7fc3 */ NULL, +/* 7fc4 */ NULL, +/* 7fc5 */ NULL, +/* 7fc6 */ NULL, +/* 7fc7 */ NULL, +/* 7fc8 */ NULL, +/* 7fc9 */ NULL, +/* 7fca */ NULL, +/* 7fcb */ NULL, +/* 7fcc */ NULL, +/* 7fcd */ NULL, +/* 7fce */ NULL, +/* 7fcf */ NULL, +/* 7fd0 */ NULL, +/* 7fd1 */ NULL, +/* 7fd2 */ NULL, +/* 7fd3 */ NULL, +/* 7fd4 */ NULL, +/* 7fd5 */ NULL, +/* 7fd6 */ NULL, +/* 7fd7 */ NULL, +/* 7fd8 */ NULL, +/* 7fd9 */ NULL, +/* 7fda */ NULL, +/* 7fdb */ NULL, +/* 7fdc */ NULL, +/* 7fdd */ NULL, +/* 7fde */ NULL, +/* 7fdf */ NULL, +/* 7fe0 */ NULL, +/* 7fe1 */ NULL, +/* 7fe2 */ NULL, +/* 7fe3 */ NULL, +/* 7fe4 */ NULL, +/* 7fe5 */ NULL, +/* 7fe6 */ NULL, +/* 7fe7 */ NULL, +/* 7fe8 */ NULL, +/* 7fe9 */ NULL, +/* 7fea */ NULL, +/* 7feb */ NULL, +/* 7fec */ NULL, +/* 7fed */ NULL, +/* 7fee */ NULL, +/* 7fef */ NULL, +/* 7ff0 */ NULL, +/* 7ff1 */ NULL, +/* 7ff2 */ NULL, +/* 7ff3 */ NULL, +/* 7ff4 */ NULL, +/* 7ff5 */ NULL, +/* 7ff6 */ NULL, +/* 7ff7 */ NULL, +/* 7ff8 */ NULL, +/* 7ff9 */ NULL, +/* 7ffa */ NULL, +/* 7ffb */ NULL, +/* 7ffc */ NULL, +/* 7ffd */ NULL, +/* 7ffe */ NULL, +/* 7fff */ NULL, +/* 8000 */ NULL, +/* 8001 */ NULL, +/* 8002 */ NULL, +/* 8003 */ NULL, +/* 8004 */ NULL, +/* 8005 */ NULL, +/* 8006 */ NULL, +/* 8007 */ NULL, +/* 8008 */ NULL, +/* 8009 */ NULL, +/* 800a */ NULL, +/* 800b */ NULL, +/* 800c */ NULL, +/* 800d */ NULL, +/* 800e */ NULL, +/* 800f */ NULL, +/* 8010 */ NULL, +/* 8011 */ NULL, +/* 8012 */ NULL, +/* 8013 */ NULL, +/* 8014 */ NULL, +/* 8015 */ NULL, +/* 8016 */ NULL, +/* 8017 */ NULL, +/* 8018 */ NULL, +/* 8019 */ NULL, +/* 801a */ NULL, +/* 801b */ NULL, +/* 801c */ NULL, +/* 801d */ NULL, +/* 801e */ NULL, +/* 801f */ NULL, +/* 8020 */ NULL, +/* 8021 */ NULL, +/* 8022 */ NULL, +/* 8023 */ NULL, +/* 8024 */ NULL, +/* 8025 */ NULL, +/* 8026 */ NULL, +/* 8027 */ NULL, +/* 8028 */ NULL, +/* 8029 */ NULL, +/* 802a */ NULL, +/* 802b */ NULL, +/* 802c */ NULL, +/* 802d */ NULL, +/* 802e */ NULL, +/* 802f */ NULL, +/* 8030 */ NULL, +/* 8031 */ NULL, +/* 8032 */ NULL, +/* 8033 */ NULL, +/* 8034 */ NULL, +/* 8035 */ NULL, +/* 8036 */ NULL, +/* 8037 */ NULL, +/* 8038 */ NULL, +/* 8039 */ NULL, +/* 803a */ NULL, +/* 803b */ NULL, +/* 803c */ NULL, +/* 803d */ NULL, +/* 803e */ NULL, +/* 803f */ NULL, +/* 8040 */ NULL, +/* 8041 */ NULL, +/* 8042 */ NULL, +/* 8043 */ NULL, +/* 8044 */ NULL, +/* 8045 */ NULL, +/* 8046 */ NULL, +/* 8047 */ NULL, +/* 8048 */ NULL, +/* 8049 */ NULL, +/* 804a */ NULL, +/* 804b */ NULL, +/* 804c */ NULL, +/* 804d */ NULL, +/* 804e */ NULL, +/* 804f */ NULL, +/* 8050 */ NULL, +/* 8051 */ NULL, +/* 8052 */ NULL, +/* 8053 */ NULL, +/* 8054 */ NULL, +/* 8055 */ NULL, +/* 8056 */ NULL, +/* 8057 */ NULL, +/* 8058 */ NULL, +/* 8059 */ NULL, +/* 805a */ NULL, +/* 805b */ NULL, +/* 805c */ NULL, +/* 805d */ NULL, +/* 805e */ NULL, +/* 805f */ NULL, +/* 8060 */ NULL, +/* 8061 */ NULL, +/* 8062 */ NULL, +/* 8063 */ NULL, +/* 8064 */ NULL, +/* 8065 */ NULL, +/* 8066 */ NULL, +/* 8067 */ NULL, +/* 8068 */ NULL, +/* 8069 */ NULL, +/* 806a */ NULL, +/* 806b */ NULL, +/* 806c */ NULL, +/* 806d */ NULL, +/* 806e */ NULL, +/* 806f */ NULL, +/* 8070 */ NULL, +/* 8071 */ NULL, +/* 8072 */ NULL, +/* 8073 */ NULL, +/* 8074 */ NULL, +/* 8075 */ NULL, +/* 8076 */ NULL, +/* 8077 */ NULL, +/* 8078 */ NULL, +/* 8079 */ NULL, +/* 807a */ NULL, +/* 807b */ NULL, +/* 807c */ NULL, +/* 807d */ NULL, +/* 807e */ NULL, +/* 807f */ NULL, +/* 8080 */ NULL, +/* 8081 */ NULL, +/* 8082 */ NULL, +/* 8083 */ NULL, +/* 8084 */ NULL, +/* 8085 */ NULL, +/* 8086 */ NULL, +/* 8087 */ NULL, +/* 8088 */ NULL, +/* 8089 */ NULL, +/* 808a */ NULL, +/* 808b */ NULL, +/* 808c */ NULL, +/* 808d */ NULL, +/* 808e */ NULL, +/* 808f */ NULL, +/* 8090 */ NULL, +/* 8091 */ NULL, +/* 8092 */ NULL, +/* 8093 */ NULL, +/* 8094 */ NULL, +/* 8095 */ NULL, +/* 8096 */ NULL, +/* 8097 */ NULL, +/* 8098 */ NULL, +/* 8099 */ NULL, +/* 809a */ NULL, +/* 809b */ NULL, +/* 809c */ NULL, +/* 809d */ NULL, +/* 809e */ NULL, +/* 809f */ NULL, +/* 80a0 */ NULL, +/* 80a1 */ NULL, +/* 80a2 */ NULL, +/* 80a3 */ NULL, +/* 80a4 */ NULL, +/* 80a5 */ NULL, +/* 80a6 */ NULL, +/* 80a7 */ NULL, +/* 80a8 */ NULL, +/* 80a9 */ NULL, +/* 80aa */ NULL, +/* 80ab */ NULL, +/* 80ac */ NULL, +/* 80ad */ NULL, +/* 80ae */ NULL, +/* 80af */ NULL, +/* 80b0 */ NULL, +/* 80b1 */ NULL, +/* 80b2 */ NULL, +/* 80b3 */ NULL, +/* 80b4 */ NULL, +/* 80b5 */ NULL, +/* 80b6 */ NULL, +/* 80b7 */ NULL, +/* 80b8 */ NULL, +/* 80b9 */ NULL, +/* 80ba */ NULL, +/* 80bb */ NULL, +/* 80bc */ NULL, +/* 80bd */ NULL, +/* 80be */ NULL, +/* 80bf */ NULL, +/* 80c0 */ NULL, +/* 80c1 */ NULL, +/* 80c2 */ NULL, +/* 80c3 */ NULL, +/* 80c4 */ NULL, +/* 80c5 */ NULL, +/* 80c6 */ NULL, +/* 80c7 */ NULL, +/* 80c8 */ NULL, +/* 80c9 */ NULL, +/* 80ca */ NULL, +/* 80cb */ NULL, +/* 80cc */ NULL, +/* 80cd */ NULL, +/* 80ce */ NULL, +/* 80cf */ NULL, +/* 80d0 */ NULL, +/* 80d1 */ NULL, +/* 80d2 */ NULL, +/* 80d3 */ NULL, +/* 80d4 */ NULL, +/* 80d5 */ NULL, +/* 80d6 */ NULL, +/* 80d7 */ NULL, +/* 80d8 */ NULL, +/* 80d9 */ NULL, +/* 80da */ NULL, +/* 80db */ NULL, +/* 80dc */ NULL, +/* 80dd */ NULL, +/* 80de */ NULL, +/* 80df */ NULL, +/* 80e0 */ NULL, +/* 80e1 */ NULL, +/* 80e2 */ NULL, +/* 80e3 */ NULL, +/* 80e4 */ NULL, +/* 80e5 */ NULL, +/* 80e6 */ NULL, +/* 80e7 */ NULL, +/* 80e8 */ NULL, +/* 80e9 */ NULL, +/* 80ea */ NULL, +/* 80eb */ NULL, +/* 80ec */ NULL, +/* 80ed */ NULL, +/* 80ee */ NULL, +/* 80ef */ NULL, +/* 80f0 */ NULL, +/* 80f1 */ NULL, +/* 80f2 */ NULL, +/* 80f3 */ NULL, +/* 80f4 */ NULL, +/* 80f5 */ NULL, +/* 80f6 */ NULL, +/* 80f7 */ NULL, +/* 80f8 */ NULL, +/* 80f9 */ NULL, +/* 80fa */ NULL, +/* 80fb */ NULL, +/* 80fc */ NULL, +/* 80fd */ NULL, +/* 80fe */ NULL, +/* 80ff */ NULL, +/* 8100 */ NULL, +/* 8101 */ NULL, +/* 8102 */ NULL, +/* 8103 */ NULL, +/* 8104 */ NULL, +/* 8105 */ NULL, +/* 8106 */ NULL, +/* 8107 */ NULL, +/* 8108 */ NULL, +/* 8109 */ NULL, +/* 810a */ NULL, +/* 810b */ NULL, +/* 810c */ NULL, +/* 810d */ NULL, +/* 810e */ NULL, +/* 810f */ NULL, +/* 8110 */ NULL, +/* 8111 */ NULL, +/* 8112 */ NULL, +/* 8113 */ NULL, +/* 8114 */ NULL, +/* 8115 */ NULL, +/* 8116 */ NULL, +/* 8117 */ NULL, +/* 8118 */ NULL, +/* 8119 */ NULL, +/* 811a */ NULL, +/* 811b */ NULL, +/* 811c */ NULL, +/* 811d */ NULL, +/* 811e */ NULL, +/* 811f */ NULL, +/* 8120 */ NULL, +/* 8121 */ NULL, +/* 8122 */ NULL, +/* 8123 */ NULL, +/* 8124 */ NULL, +/* 8125 */ NULL, +/* 8126 */ NULL, +/* 8127 */ NULL, +/* 8128 */ NULL, +/* 8129 */ NULL, +/* 812a */ NULL, +/* 812b */ NULL, +/* 812c */ NULL, +/* 812d */ NULL, +/* 812e */ NULL, +/* 812f */ NULL, +/* 8130 */ NULL, +/* 8131 */ NULL, +/* 8132 */ NULL, +/* 8133 */ NULL, +/* 8134 */ NULL, +/* 8135 */ NULL, +/* 8136 */ NULL, +/* 8137 */ NULL, +/* 8138 */ NULL, +/* 8139 */ NULL, +/* 813a */ NULL, +/* 813b */ NULL, +/* 813c */ NULL, +/* 813d */ NULL, +/* 813e */ NULL, +/* 813f */ NULL, +/* 8140 */ NULL, +/* 8141 */ NULL, +/* 8142 */ NULL, +/* 8143 */ NULL, +/* 8144 */ NULL, +/* 8145 */ NULL, +/* 8146 */ NULL, +/* 8147 */ NULL, +/* 8148 */ NULL, +/* 8149 */ NULL, +/* 814a */ NULL, +/* 814b */ NULL, +/* 814c */ NULL, +/* 814d */ NULL, +/* 814e */ NULL, +/* 814f */ NULL, +/* 8150 */ NULL, +/* 8151 */ NULL, +/* 8152 */ NULL, +/* 8153 */ NULL, +/* 8154 */ NULL, +/* 8155 */ NULL, +/* 8156 */ NULL, +/* 8157 */ NULL, +/* 8158 */ NULL, +/* 8159 */ NULL, +/* 815a */ NULL, +/* 815b */ NULL, +/* 815c */ NULL, +/* 815d */ NULL, +/* 815e */ NULL, +/* 815f */ NULL, +/* 8160 */ NULL, +/* 8161 */ NULL, +/* 8162 */ NULL, +/* 8163 */ NULL, +/* 8164 */ NULL, +/* 8165 */ NULL, +/* 8166 */ NULL, +/* 8167 */ NULL, +/* 8168 */ NULL, +/* 8169 */ NULL, +/* 816a */ NULL, +/* 816b */ NULL, +/* 816c */ NULL, +/* 816d */ NULL, +/* 816e */ NULL, +/* 816f */ NULL, +/* 8170 */ NULL, +/* 8171 */ NULL, +/* 8172 */ NULL, +/* 8173 */ NULL, +/* 8174 */ NULL, +/* 8175 */ NULL, +/* 8176 */ NULL, +/* 8177 */ NULL, +/* 8178 */ NULL, +/* 8179 */ NULL, +/* 817a */ NULL, +/* 817b */ NULL, +/* 817c */ NULL, +/* 817d */ NULL, +/* 817e */ NULL, +/* 817f */ NULL, +/* 8180 */ NULL, +/* 8181 */ NULL, +/* 8182 */ NULL, +/* 8183 */ NULL, +/* 8184 */ NULL, +/* 8185 */ NULL, +/* 8186 */ NULL, +/* 8187 */ NULL, +/* 8188 */ NULL, +/* 8189 */ NULL, +/* 818a */ NULL, +/* 818b */ NULL, +/* 818c */ NULL, +/* 818d */ NULL, +/* 818e */ NULL, +/* 818f */ NULL, +/* 8190 */ NULL, +/* 8191 */ NULL, +/* 8192 */ NULL, +/* 8193 */ NULL, +/* 8194 */ NULL, +/* 8195 */ NULL, +/* 8196 */ NULL, +/* 8197 */ NULL, +/* 8198 */ NULL, +/* 8199 */ NULL, +/* 819a */ NULL, +/* 819b */ NULL, +/* 819c */ NULL, +/* 819d */ NULL, +/* 819e */ NULL, +/* 819f */ NULL, +/* 81a0 */ NULL, +/* 81a1 */ NULL, +/* 81a2 */ NULL, +/* 81a3 */ NULL, +/* 81a4 */ NULL, +/* 81a5 */ NULL, +/* 81a6 */ NULL, +/* 81a7 */ NULL, +/* 81a8 */ NULL, +/* 81a9 */ NULL, +/* 81aa */ NULL, +/* 81ab */ NULL, +/* 81ac */ NULL, +/* 81ad */ NULL, +/* 81ae */ NULL, +/* 81af */ NULL, +/* 81b0 */ NULL, +/* 81b1 */ NULL, +/* 81b2 */ NULL, +/* 81b3 */ NULL, +/* 81b4 */ NULL, +/* 81b5 */ NULL, +/* 81b6 */ NULL, +/* 81b7 */ NULL, +/* 81b8 */ NULL, +/* 81b9 */ NULL, +/* 81ba */ NULL, +/* 81bb */ NULL, +/* 81bc */ NULL, +/* 81bd */ NULL, +/* 81be */ NULL, +/* 81bf */ NULL, +/* 81c0 */ NULL, +/* 81c1 */ NULL, +/* 81c2 */ NULL, +/* 81c3 */ NULL, +/* 81c4 */ NULL, +/* 81c5 */ NULL, +/* 81c6 */ NULL, +/* 81c7 */ NULL, +/* 81c8 */ NULL, +/* 81c9 */ NULL, +/* 81ca */ NULL, +/* 81cb */ NULL, +/* 81cc */ NULL, +/* 81cd */ NULL, +/* 81ce */ NULL, +/* 81cf */ NULL, +/* 81d0 */ NULL, +/* 81d1 */ NULL, +/* 81d2 */ NULL, +/* 81d3 */ NULL, +/* 81d4 */ NULL, +/* 81d5 */ NULL, +/* 81d6 */ NULL, +/* 81d7 */ NULL, +/* 81d8 */ NULL, +/* 81d9 */ NULL, +/* 81da */ NULL, +/* 81db */ NULL, +/* 81dc */ NULL, +/* 81dd */ NULL, +/* 81de */ NULL, +/* 81df */ NULL, +/* 81e0 */ NULL, +/* 81e1 */ NULL, +/* 81e2 */ NULL, +/* 81e3 */ NULL, +/* 81e4 */ NULL, +/* 81e5 */ NULL, +/* 81e6 */ NULL, +/* 81e7 */ NULL, +/* 81e8 */ NULL, +/* 81e9 */ NULL, +/* 81ea */ NULL, +/* 81eb */ NULL, +/* 81ec */ NULL, +/* 81ed */ NULL, +/* 81ee */ NULL, +/* 81ef */ NULL, +/* 81f0 */ NULL, +/* 81f1 */ NULL, +/* 81f2 */ NULL, +/* 81f3 */ NULL, +/* 81f4 */ NULL, +/* 81f5 */ NULL, +/* 81f6 */ NULL, +/* 81f7 */ NULL, +/* 81f8 */ NULL, +/* 81f9 */ NULL, +/* 81fa */ NULL, +/* 81fb */ NULL, +/* 81fc */ NULL, +/* 81fd */ NULL, +/* 81fe */ NULL, +/* 81ff */ NULL, +/* 8200 */ NULL, +/* 8201 */ NULL, +/* 8202 */ NULL, +/* 8203 */ NULL, +/* 8204 */ NULL, +/* 8205 */ NULL, +/* 8206 */ NULL, +/* 8207 */ NULL, +/* 8208 */ NULL, +/* 8209 */ NULL, +/* 820a */ NULL, +/* 820b */ NULL, +/* 820c */ NULL, +/* 820d */ NULL, +/* 820e */ NULL, +/* 820f */ NULL, +/* 8210 */ NULL, +/* 8211 */ NULL, +/* 8212 */ NULL, +/* 8213 */ NULL, +/* 8214 */ NULL, +/* 8215 */ NULL, +/* 8216 */ NULL, +/* 8217 */ NULL, +/* 8218 */ NULL, +/* 8219 */ NULL, +/* 821a */ NULL, +/* 821b */ NULL, +/* 821c */ NULL, +/* 821d */ NULL, +/* 821e */ NULL, +/* 821f */ NULL, +/* 8220 */ NULL, +/* 8221 */ NULL, +/* 8222 */ NULL, +/* 8223 */ NULL, +/* 8224 */ NULL, +/* 8225 */ NULL, +/* 8226 */ NULL, +/* 8227 */ NULL, +/* 8228 */ NULL, +/* 8229 */ NULL, +/* 822a */ NULL, +/* 822b */ NULL, +/* 822c */ NULL, +/* 822d */ NULL, +/* 822e */ NULL, +/* 822f */ NULL, +/* 8230 */ NULL, +/* 8231 */ NULL, +/* 8232 */ NULL, +/* 8233 */ NULL, +/* 8234 */ NULL, +/* 8235 */ NULL, +/* 8236 */ NULL, +/* 8237 */ NULL, +/* 8238 */ NULL, +/* 8239 */ NULL, +/* 823a */ NULL, +/* 823b */ NULL, +/* 823c */ NULL, +/* 823d */ NULL, +/* 823e */ NULL, +/* 823f */ NULL, +/* 8240 */ NULL, +/* 8241 */ NULL, +/* 8242 */ NULL, +/* 8243 */ NULL, +/* 8244 */ NULL, +/* 8245 */ NULL, +/* 8246 */ NULL, +/* 8247 */ NULL, +/* 8248 */ NULL, +/* 8249 */ NULL, +/* 824a */ NULL, +/* 824b */ NULL, +/* 824c */ NULL, +/* 824d */ NULL, +/* 824e */ NULL, +/* 824f */ NULL, +/* 8250 */ NULL, +/* 8251 */ NULL, +/* 8252 */ NULL, +/* 8253 */ NULL, +/* 8254 */ NULL, +/* 8255 */ NULL, +/* 8256 */ NULL, +/* 8257 */ NULL, +/* 8258 */ NULL, +/* 8259 */ NULL, +/* 825a */ NULL, +/* 825b */ NULL, +/* 825c */ NULL, +/* 825d */ NULL, +/* 825e */ NULL, +/* 825f */ NULL, +/* 8260 */ NULL, +/* 8261 */ NULL, +/* 8262 */ NULL, +/* 8263 */ NULL, +/* 8264 */ NULL, +/* 8265 */ NULL, +/* 8266 */ NULL, +/* 8267 */ NULL, +/* 8268 */ NULL, +/* 8269 */ NULL, +/* 826a */ NULL, +/* 826b */ NULL, +/* 826c */ NULL, +/* 826d */ NULL, +/* 826e */ NULL, +/* 826f */ NULL, +/* 8270 */ NULL, +/* 8271 */ NULL, +/* 8272 */ NULL, +/* 8273 */ NULL, +/* 8274 */ NULL, +/* 8275 */ NULL, +/* 8276 */ NULL, +/* 8277 */ NULL, +/* 8278 */ NULL, +/* 8279 */ NULL, +/* 827a */ NULL, +/* 827b */ NULL, +/* 827c */ NULL, +/* 827d */ NULL, +/* 827e */ NULL, +/* 827f */ NULL, +/* 8280 */ NULL, +/* 8281 */ NULL, +/* 8282 */ NULL, +/* 8283 */ NULL, +/* 8284 */ NULL, +/* 8285 */ NULL, +/* 8286 */ NULL, +/* 8287 */ NULL, +/* 8288 */ NULL, +/* 8289 */ NULL, +/* 828a */ NULL, +/* 828b */ NULL, +/* 828c */ NULL, +/* 828d */ NULL, +/* 828e */ NULL, +/* 828f */ NULL, +/* 8290 */ NULL, +/* 8291 */ NULL, +/* 8292 */ NULL, +/* 8293 */ NULL, +/* 8294 */ NULL, +/* 8295 */ NULL, +/* 8296 */ NULL, +/* 8297 */ NULL, +/* 8298 */ NULL, +/* 8299 */ NULL, +/* 829a */ NULL, +/* 829b */ NULL, +/* 829c */ NULL, +/* 829d */ NULL, +/* 829e */ NULL, +/* 829f */ NULL, +/* 82a0 */ NULL, +/* 82a1 */ NULL, +/* 82a2 */ NULL, +/* 82a3 */ NULL, +/* 82a4 */ NULL, +/* 82a5 */ NULL, +/* 82a6 */ NULL, +/* 82a7 */ NULL, +/* 82a8 */ NULL, +/* 82a9 */ NULL, +/* 82aa */ NULL, +/* 82ab */ NULL, +/* 82ac */ NULL, +/* 82ad */ NULL, +/* 82ae */ NULL, +/* 82af */ NULL, +/* 82b0 */ NULL, +/* 82b1 */ NULL, +/* 82b2 */ NULL, +/* 82b3 */ NULL, +/* 82b4 */ NULL, +/* 82b5 */ NULL, +/* 82b6 */ NULL, +/* 82b7 */ NULL, +/* 82b8 */ NULL, +/* 82b9 */ NULL, +/* 82ba */ NULL, +/* 82bb */ NULL, +/* 82bc */ NULL, +/* 82bd */ NULL, +/* 82be */ NULL, +/* 82bf */ NULL, +/* 82c0 */ NULL, +/* 82c1 */ NULL, +/* 82c2 */ NULL, +/* 82c3 */ NULL, +/* 82c4 */ NULL, +/* 82c5 */ NULL, +/* 82c6 */ NULL, +/* 82c7 */ NULL, +/* 82c8 */ NULL, +/* 82c9 */ NULL, +/* 82ca */ NULL, +/* 82cb */ NULL, +/* 82cc */ NULL, +/* 82cd */ NULL, +/* 82ce */ NULL, +/* 82cf */ NULL, +/* 82d0 */ NULL, +/* 82d1 */ NULL, +/* 82d2 */ NULL, +/* 82d3 */ NULL, +/* 82d4 */ NULL, +/* 82d5 */ NULL, +/* 82d6 */ NULL, +/* 82d7 */ NULL, +/* 82d8 */ NULL, +/* 82d9 */ NULL, +/* 82da */ NULL, +/* 82db */ NULL, +/* 82dc */ NULL, +/* 82dd */ NULL, +/* 82de */ NULL, +/* 82df */ NULL, +/* 82e0 */ NULL, +/* 82e1 */ NULL, +/* 82e2 */ NULL, +/* 82e3 */ NULL, +/* 82e4 */ NULL, +/* 82e5 */ NULL, +/* 82e6 */ NULL, +/* 82e7 */ NULL, +/* 82e8 */ NULL, +/* 82e9 */ NULL, +/* 82ea */ NULL, +/* 82eb */ NULL, +/* 82ec */ NULL, +/* 82ed */ NULL, +/* 82ee */ NULL, +/* 82ef */ NULL, +/* 82f0 */ NULL, +/* 82f1 */ NULL, +/* 82f2 */ NULL, +/* 82f3 */ NULL, +/* 82f4 */ NULL, +/* 82f5 */ NULL, +/* 82f6 */ NULL, +/* 82f7 */ NULL, +/* 82f8 */ NULL, +/* 82f9 */ NULL, +/* 82fa */ NULL, +/* 82fb */ NULL, +/* 82fc */ NULL, +/* 82fd */ NULL, +/* 82fe */ NULL, +/* 82ff */ NULL, +/* 8300 */ NULL, +/* 8301 */ NULL, +/* 8302 */ NULL, +/* 8303 */ NULL, +/* 8304 */ NULL, +/* 8305 */ NULL, +/* 8306 */ NULL, +/* 8307 */ NULL, +/* 8308 */ NULL, +/* 8309 */ NULL, +/* 830a */ NULL, +/* 830b */ NULL, +/* 830c */ NULL, +/* 830d */ NULL, +/* 830e */ NULL, +/* 830f */ NULL, +/* 8310 */ NULL, +/* 8311 */ NULL, +/* 8312 */ NULL, +/* 8313 */ NULL, +/* 8314 */ NULL, +/* 8315 */ NULL, +/* 8316 */ NULL, +/* 8317 */ NULL, +/* 8318 */ NULL, +/* 8319 */ NULL, +/* 831a */ NULL, +/* 831b */ NULL, +/* 831c */ NULL, +/* 831d */ NULL, +/* 831e */ NULL, +/* 831f */ NULL, +/* 8320 */ NULL, +/* 8321 */ NULL, +/* 8322 */ NULL, +/* 8323 */ NULL, +/* 8324 */ NULL, +/* 8325 */ NULL, +/* 8326 */ NULL, +/* 8327 */ NULL, +/* 8328 */ NULL, +/* 8329 */ NULL, +/* 832a */ NULL, +/* 832b */ NULL, +/* 832c */ NULL, +/* 832d */ NULL, +/* 832e */ NULL, +/* 832f */ NULL, +/* 8330 */ NULL, +/* 8331 */ NULL, +/* 8332 */ NULL, +/* 8333 */ NULL, +/* 8334 */ NULL, +/* 8335 */ NULL, +/* 8336 */ NULL, +/* 8337 */ NULL, +/* 8338 */ NULL, +/* 8339 */ NULL, +/* 833a */ NULL, +/* 833b */ NULL, +/* 833c */ NULL, +/* 833d */ NULL, +/* 833e */ NULL, +/* 833f */ NULL, +/* 8340 */ NULL, +/* 8341 */ NULL, +/* 8342 */ NULL, +/* 8343 */ NULL, +/* 8344 */ NULL, +/* 8345 */ NULL, +/* 8346 */ NULL, +/* 8347 */ NULL, +/* 8348 */ NULL, +/* 8349 */ NULL, +/* 834a */ NULL, +/* 834b */ NULL, +/* 834c */ NULL, +/* 834d */ NULL, +/* 834e */ NULL, +/* 834f */ NULL, +/* 8350 */ NULL, +/* 8351 */ NULL, +/* 8352 */ NULL, +/* 8353 */ NULL, +/* 8354 */ NULL, +/* 8355 */ NULL, +/* 8356 */ NULL, +/* 8357 */ NULL, +/* 8358 */ NULL, +/* 8359 */ NULL, +/* 835a */ NULL, +/* 835b */ NULL, +/* 835c */ NULL, +/* 835d */ NULL, +/* 835e */ NULL, +/* 835f */ NULL, +/* 8360 */ NULL, +/* 8361 */ NULL, +/* 8362 */ NULL, +/* 8363 */ NULL, +/* 8364 */ NULL, +/* 8365 */ NULL, +/* 8366 */ NULL, +/* 8367 */ NULL, +/* 8368 */ NULL, +/* 8369 */ NULL, +/* 836a */ NULL, +/* 836b */ NULL, +/* 836c */ NULL, +/* 836d */ NULL, +/* 836e */ NULL, +/* 836f */ NULL, +/* 8370 */ NULL, +/* 8371 */ NULL, +/* 8372 */ NULL, +/* 8373 */ NULL, +/* 8374 */ NULL, +/* 8375 */ NULL, +/* 8376 */ NULL, +/* 8377 */ NULL, +/* 8378 */ NULL, +/* 8379 */ NULL, +/* 837a */ NULL, +/* 837b */ NULL, +/* 837c */ NULL, +/* 837d */ NULL, +/* 837e */ NULL, +/* 837f */ NULL, +/* 8380 */ NULL, +/* 8381 */ NULL, +/* 8382 */ NULL, +/* 8383 */ NULL, +/* 8384 */ NULL, +/* 8385 */ NULL, +/* 8386 */ NULL, +/* 8387 */ NULL, +/* 8388 */ NULL, +/* 8389 */ NULL, +/* 838a */ NULL, +/* 838b */ NULL, +/* 838c */ NULL, +/* 838d */ NULL, +/* 838e */ NULL, +/* 838f */ NULL, +/* 8390 */ NULL, +/* 8391 */ NULL, +/* 8392 */ NULL, +/* 8393 */ NULL, +/* 8394 */ NULL, +/* 8395 */ NULL, +/* 8396 */ NULL, +/* 8397 */ NULL, +/* 8398 */ NULL, +/* 8399 */ NULL, +/* 839a */ NULL, +/* 839b */ NULL, +/* 839c */ NULL, +/* 839d */ NULL, +/* 839e */ NULL, +/* 839f */ NULL, +/* 83a0 */ NULL, +/* 83a1 */ NULL, +/* 83a2 */ NULL, +/* 83a3 */ NULL, +/* 83a4 */ NULL, +/* 83a5 */ NULL, +/* 83a6 */ NULL, +/* 83a7 */ NULL, +/* 83a8 */ NULL, +/* 83a9 */ NULL, +/* 83aa */ NULL, +/* 83ab */ NULL, +/* 83ac */ NULL, +/* 83ad */ NULL, +/* 83ae */ NULL, +/* 83af */ NULL, +/* 83b0 */ NULL, +/* 83b1 */ NULL, +/* 83b2 */ NULL, +/* 83b3 */ NULL, +/* 83b4 */ NULL, +/* 83b5 */ NULL, +/* 83b6 */ NULL, +/* 83b7 */ NULL, +/* 83b8 */ NULL, +/* 83b9 */ NULL, +/* 83ba */ NULL, +/* 83bb */ NULL, +/* 83bc */ NULL, +/* 83bd */ NULL, +/* 83be */ NULL, +/* 83bf */ NULL, +/* 83c0 */ NULL, +/* 83c1 */ NULL, +/* 83c2 */ NULL, +/* 83c3 */ NULL, +/* 83c4 */ NULL, +/* 83c5 */ NULL, +/* 83c6 */ NULL, +/* 83c7 */ NULL, +/* 83c8 */ NULL, +/* 83c9 */ NULL, +/* 83ca */ NULL, +/* 83cb */ NULL, +/* 83cc */ NULL, +/* 83cd */ NULL, +/* 83ce */ NULL, +/* 83cf */ NULL, +/* 83d0 */ NULL, +/* 83d1 */ NULL, +/* 83d2 */ NULL, +/* 83d3 */ NULL, +/* 83d4 */ NULL, +/* 83d5 */ NULL, +/* 83d6 */ NULL, +/* 83d7 */ NULL, +/* 83d8 */ NULL, +/* 83d9 */ NULL, +/* 83da */ NULL, +/* 83db */ NULL, +/* 83dc */ NULL, +/* 83dd */ NULL, +/* 83de */ NULL, +/* 83df */ NULL, +/* 83e0 */ NULL, +/* 83e1 */ NULL, +/* 83e2 */ NULL, +/* 83e3 */ NULL, +/* 83e4 */ NULL, +/* 83e5 */ NULL, +/* 83e6 */ NULL, +/* 83e7 */ NULL, +/* 83e8 */ NULL, +/* 83e9 */ NULL, +/* 83ea */ NULL, +/* 83eb */ NULL, +/* 83ec */ NULL, +/* 83ed */ NULL, +/* 83ee */ NULL, +/* 83ef */ NULL, +/* 83f0 */ NULL, +/* 83f1 */ NULL, +/* 83f2 */ NULL, +/* 83f3 */ NULL, +/* 83f4 */ NULL, +/* 83f5 */ NULL, +/* 83f6 */ NULL, +/* 83f7 */ NULL, +/* 83f8 */ NULL, +/* 83f9 */ NULL, +/* 83fa */ NULL, +/* 83fb */ NULL, +/* 83fc */ NULL, +/* 83fd */ NULL, +/* 83fe */ NULL, +/* 83ff */ NULL, +/* 8400 */ NULL, +/* 8401 */ NULL, +/* 8402 */ NULL, +/* 8403 */ NULL, +/* 8404 */ NULL, +/* 8405 */ NULL, +/* 8406 */ NULL, +/* 8407 */ NULL, +/* 8408 */ NULL, +/* 8409 */ NULL, +/* 840a */ NULL, +/* 840b */ NULL, +/* 840c */ NULL, +/* 840d */ NULL, +/* 840e */ NULL, +/* 840f */ NULL, +/* 8410 */ NULL, +/* 8411 */ NULL, +/* 8412 */ NULL, +/* 8413 */ NULL, +/* 8414 */ NULL, +/* 8415 */ NULL, +/* 8416 */ NULL, +/* 8417 */ NULL, +/* 8418 */ NULL, +/* 8419 */ NULL, +/* 841a */ NULL, +/* 841b */ NULL, +/* 841c */ NULL, +/* 841d */ NULL, +/* 841e */ NULL, +/* 841f */ NULL, +/* 8420 */ NULL, +/* 8421 */ NULL, +/* 8422 */ NULL, +/* 8423 */ NULL, +/* 8424 */ NULL, +/* 8425 */ NULL, +/* 8426 */ NULL, +/* 8427 */ NULL, +/* 8428 */ NULL, +/* 8429 */ NULL, +/* 842a */ NULL, +/* 842b */ NULL, +/* 842c */ NULL, +/* 842d */ NULL, +/* 842e */ NULL, +/* 842f */ NULL, +/* 8430 */ NULL, +/* 8431 */ NULL, +/* 8432 */ NULL, +/* 8433 */ NULL, +/* 8434 */ NULL, +/* 8435 */ NULL, +/* 8436 */ NULL, +/* 8437 */ NULL, +/* 8438 */ NULL, +/* 8439 */ NULL, +/* 843a */ NULL, +/* 843b */ NULL, +/* 843c */ NULL, +/* 843d */ NULL, +/* 843e */ NULL, +/* 843f */ NULL, +/* 8440 */ NULL, +/* 8441 */ NULL, +/* 8442 */ NULL, +/* 8443 */ NULL, +/* 8444 */ NULL, +/* 8445 */ NULL, +/* 8446 */ NULL, +/* 8447 */ NULL, +/* 8448 */ NULL, +/* 8449 */ NULL, +/* 844a */ NULL, +/* 844b */ NULL, +/* 844c */ NULL, +/* 844d */ NULL, +/* 844e */ NULL, +/* 844f */ NULL, +/* 8450 */ NULL, +/* 8451 */ NULL, +/* 8452 */ NULL, +/* 8453 */ NULL, +/* 8454 */ NULL, +/* 8455 */ NULL, +/* 8456 */ NULL, +/* 8457 */ NULL, +/* 8458 */ NULL, +/* 8459 */ NULL, +/* 845a */ NULL, +/* 845b */ NULL, +/* 845c */ NULL, +/* 845d */ NULL, +/* 845e */ NULL, +/* 845f */ NULL, +/* 8460 */ NULL, +/* 8461 */ NULL, +/* 8462 */ NULL, +/* 8463 */ NULL, +/* 8464 */ NULL, +/* 8465 */ NULL, +/* 8466 */ NULL, +/* 8467 */ NULL, +/* 8468 */ NULL, +/* 8469 */ NULL, +/* 846a */ NULL, +/* 846b */ NULL, +/* 846c */ NULL, +/* 846d */ NULL, +/* 846e */ NULL, +/* 846f */ NULL, +/* 8470 */ NULL, +/* 8471 */ NULL, +/* 8472 */ NULL, +/* 8473 */ NULL, +/* 8474 */ NULL, +/* 8475 */ NULL, +/* 8476 */ NULL, +/* 8477 */ NULL, +/* 8478 */ NULL, +/* 8479 */ NULL, +/* 847a */ NULL, +/* 847b */ NULL, +/* 847c */ NULL, +/* 847d */ NULL, +/* 847e */ NULL, +/* 847f */ NULL, +/* 8480 */ NULL, +/* 8481 */ NULL, +/* 8482 */ NULL, +/* 8483 */ NULL, +/* 8484 */ NULL, +/* 8485 */ NULL, +/* 8486 */ NULL, +/* 8487 */ NULL, +/* 8488 */ NULL, +/* 8489 */ NULL, +/* 848a */ NULL, +/* 848b */ NULL, +/* 848c */ NULL, +/* 848d */ NULL, +/* 848e */ NULL, +/* 848f */ NULL, +/* 8490 */ NULL, +/* 8491 */ NULL, +/* 8492 */ NULL, +/* 8493 */ NULL, +/* 8494 */ NULL, +/* 8495 */ NULL, +/* 8496 */ NULL, +/* 8497 */ NULL, +/* 8498 */ NULL, +/* 8499 */ NULL, +/* 849a */ NULL, +/* 849b */ NULL, +/* 849c */ NULL, +/* 849d */ NULL, +/* 849e */ NULL, +/* 849f */ NULL, +/* 84a0 */ NULL, +/* 84a1 */ NULL, +/* 84a2 */ NULL, +/* 84a3 */ NULL, +/* 84a4 */ NULL, +/* 84a5 */ NULL, +/* 84a6 */ NULL, +/* 84a7 */ NULL, +/* 84a8 */ NULL, +/* 84a9 */ NULL, +/* 84aa */ NULL, +/* 84ab */ NULL, +/* 84ac */ NULL, +/* 84ad */ NULL, +/* 84ae */ NULL, +/* 84af */ NULL, +/* 84b0 */ NULL, +/* 84b1 */ NULL, +/* 84b2 */ NULL, +/* 84b3 */ NULL, +/* 84b4 */ NULL, +/* 84b5 */ NULL, +/* 84b6 */ NULL, +/* 84b7 */ NULL, +/* 84b8 */ NULL, +/* 84b9 */ NULL, +/* 84ba */ NULL, +/* 84bb */ NULL, +/* 84bc */ NULL, +/* 84bd */ NULL, +/* 84be */ NULL, +/* 84bf */ NULL, +/* 84c0 */ NULL, +/* 84c1 */ NULL, +/* 84c2 */ NULL, +/* 84c3 */ NULL, +/* 84c4 */ NULL, +/* 84c5 */ NULL, +/* 84c6 */ NULL, +/* 84c7 */ NULL, +/* 84c8 */ NULL, +/* 84c9 */ NULL, +/* 84ca */ NULL, +/* 84cb */ NULL, +/* 84cc */ NULL, +/* 84cd */ NULL, +/* 84ce */ NULL, +/* 84cf */ NULL, +/* 84d0 */ NULL, +/* 84d1 */ NULL, +/* 84d2 */ NULL, +/* 84d3 */ NULL, +/* 84d4 */ NULL, +/* 84d5 */ NULL, +/* 84d6 */ NULL, +/* 84d7 */ NULL, +/* 84d8 */ NULL, +/* 84d9 */ NULL, +/* 84da */ NULL, +/* 84db */ NULL, +/* 84dc */ NULL, +/* 84dd */ NULL, +/* 84de */ NULL, +/* 84df */ NULL, +/* 84e0 */ NULL, +/* 84e1 */ NULL, +/* 84e2 */ NULL, +/* 84e3 */ NULL, +/* 84e4 */ NULL, +/* 84e5 */ NULL, +/* 84e6 */ NULL, +/* 84e7 */ NULL, +/* 84e8 */ NULL, +/* 84e9 */ NULL, +/* 84ea */ NULL, +/* 84eb */ NULL, +/* 84ec */ NULL, +/* 84ed */ NULL, +/* 84ee */ NULL, +/* 84ef */ NULL, +/* 84f0 */ NULL, +/* 84f1 */ NULL, +/* 84f2 */ NULL, +/* 84f3 */ NULL, +/* 84f4 */ NULL, +/* 84f5 */ NULL, +/* 84f6 */ NULL, +/* 84f7 */ NULL, +/* 84f8 */ NULL, +/* 84f9 */ NULL, +/* 84fa */ NULL, +/* 84fb */ NULL, +/* 84fc */ NULL, +/* 84fd */ NULL, +/* 84fe */ NULL, +/* 84ff */ NULL, +/* 8500 */ NULL, +/* 8501 */ NULL, +/* 8502 */ NULL, +/* 8503 */ NULL, +/* 8504 */ NULL, +/* 8505 */ NULL, +/* 8506 */ NULL, +/* 8507 */ NULL, +/* 8508 */ NULL, +/* 8509 */ NULL, +/* 850a */ NULL, +/* 850b */ NULL, +/* 850c */ NULL, +/* 850d */ NULL, +/* 850e */ NULL, +/* 850f */ NULL, +/* 8510 */ NULL, +/* 8511 */ NULL, +/* 8512 */ NULL, +/* 8513 */ NULL, +/* 8514 */ NULL, +/* 8515 */ NULL, +/* 8516 */ NULL, +/* 8517 */ NULL, +/* 8518 */ NULL, +/* 8519 */ NULL, +/* 851a */ NULL, +/* 851b */ NULL, +/* 851c */ NULL, +/* 851d */ NULL, +/* 851e */ NULL, +/* 851f */ NULL, +/* 8520 */ NULL, +/* 8521 */ NULL, +/* 8522 */ NULL, +/* 8523 */ NULL, +/* 8524 */ NULL, +/* 8525 */ NULL, +/* 8526 */ NULL, +/* 8527 */ NULL, +/* 8528 */ NULL, +/* 8529 */ NULL, +/* 852a */ NULL, +/* 852b */ NULL, +/* 852c */ NULL, +/* 852d */ NULL, +/* 852e */ NULL, +/* 852f */ NULL, +/* 8530 */ NULL, +/* 8531 */ NULL, +/* 8532 */ NULL, +/* 8533 */ NULL, +/* 8534 */ NULL, +/* 8535 */ NULL, +/* 8536 */ NULL, +/* 8537 */ NULL, +/* 8538 */ NULL, +/* 8539 */ NULL, +/* 853a */ NULL, +/* 853b */ NULL, +/* 853c */ NULL, +/* 853d */ NULL, +/* 853e */ NULL, +/* 853f */ NULL, +/* 8540 */ NULL, +/* 8541 */ NULL, +/* 8542 */ NULL, +/* 8543 */ NULL, +/* 8544 */ NULL, +/* 8545 */ NULL, +/* 8546 */ NULL, +/* 8547 */ NULL, +/* 8548 */ NULL, +/* 8549 */ NULL, +/* 854a */ NULL, +/* 854b */ NULL, +/* 854c */ NULL, +/* 854d */ NULL, +/* 854e */ NULL, +/* 854f */ NULL, +/* 8550 */ NULL, +/* 8551 */ NULL, +/* 8552 */ NULL, +/* 8553 */ NULL, +/* 8554 */ NULL, +/* 8555 */ NULL, +/* 8556 */ NULL, +/* 8557 */ NULL, +/* 8558 */ NULL, +/* 8559 */ NULL, +/* 855a */ NULL, +/* 855b */ NULL, +/* 855c */ NULL, +/* 855d */ NULL, +/* 855e */ NULL, +/* 855f */ NULL, +/* 8560 */ NULL, +/* 8561 */ NULL, +/* 8562 */ NULL, +/* 8563 */ NULL, +/* 8564 */ NULL, +/* 8565 */ NULL, +/* 8566 */ NULL, +/* 8567 */ NULL, +/* 8568 */ NULL, +/* 8569 */ NULL, +/* 856a */ NULL, +/* 856b */ NULL, +/* 856c */ NULL, +/* 856d */ NULL, +/* 856e */ NULL, +/* 856f */ NULL, +/* 8570 */ NULL, +/* 8571 */ NULL, +/* 8572 */ NULL, +/* 8573 */ NULL, +/* 8574 */ NULL, +/* 8575 */ NULL, +/* 8576 */ NULL, +/* 8577 */ NULL, +/* 8578 */ NULL, +/* 8579 */ NULL, +/* 857a */ NULL, +/* 857b */ NULL, +/* 857c */ NULL, +/* 857d */ NULL, +/* 857e */ NULL, +/* 857f */ NULL, +/* 8580 */ NULL, +/* 8581 */ NULL, +/* 8582 */ NULL, +/* 8583 */ NULL, +/* 8584 */ NULL, +/* 8585 */ NULL, +/* 8586 */ NULL, +/* 8587 */ NULL, +/* 8588 */ NULL, +/* 8589 */ NULL, +/* 858a */ NULL, +/* 858b */ NULL, +/* 858c */ NULL, +/* 858d */ NULL, +/* 858e */ NULL, +/* 858f */ NULL, +/* 8590 */ NULL, +/* 8591 */ NULL, +/* 8592 */ NULL, +/* 8593 */ NULL, +/* 8594 */ NULL, +/* 8595 */ NULL, +/* 8596 */ NULL, +/* 8597 */ NULL, +/* 8598 */ NULL, +/* 8599 */ NULL, +/* 859a */ NULL, +/* 859b */ NULL, +/* 859c */ NULL, +/* 859d */ NULL, +/* 859e */ NULL, +/* 859f */ NULL, +/* 85a0 */ NULL, +/* 85a1 */ NULL, +/* 85a2 */ NULL, +/* 85a3 */ NULL, +/* 85a4 */ NULL, +/* 85a5 */ NULL, +/* 85a6 */ NULL, +/* 85a7 */ NULL, +/* 85a8 */ NULL, +/* 85a9 */ NULL, +/* 85aa */ NULL, +/* 85ab */ NULL, +/* 85ac */ NULL, +/* 85ad */ NULL, +/* 85ae */ NULL, +/* 85af */ NULL, +/* 85b0 */ NULL, +/* 85b1 */ NULL, +/* 85b2 */ NULL, +/* 85b3 */ NULL, +/* 85b4 */ NULL, +/* 85b5 */ NULL, +/* 85b6 */ NULL, +/* 85b7 */ NULL, +/* 85b8 */ NULL, +/* 85b9 */ NULL, +/* 85ba */ NULL, +/* 85bb */ NULL, +/* 85bc */ NULL, +/* 85bd */ NULL, +/* 85be */ NULL, +/* 85bf */ NULL, +/* 85c0 */ NULL, +/* 85c1 */ NULL, +/* 85c2 */ NULL, +/* 85c3 */ NULL, +/* 85c4 */ NULL, +/* 85c5 */ NULL, +/* 85c6 */ NULL, +/* 85c7 */ NULL, +/* 85c8 */ NULL, +/* 85c9 */ NULL, +/* 85ca */ NULL, +/* 85cb */ NULL, +/* 85cc */ NULL, +/* 85cd */ NULL, +/* 85ce */ NULL, +/* 85cf */ NULL, +/* 85d0 */ NULL, +/* 85d1 */ NULL, +/* 85d2 */ NULL, +/* 85d3 */ NULL, +/* 85d4 */ NULL, +/* 85d5 */ NULL, +/* 85d6 */ NULL, +/* 85d7 */ NULL, +/* 85d8 */ NULL, +/* 85d9 */ NULL, +/* 85da */ NULL, +/* 85db */ NULL, +/* 85dc */ NULL, +/* 85dd */ NULL, +/* 85de */ NULL, +/* 85df */ NULL, +/* 85e0 */ NULL, +/* 85e1 */ NULL, +/* 85e2 */ NULL, +/* 85e3 */ NULL, +/* 85e4 */ NULL, +/* 85e5 */ NULL, +/* 85e6 */ NULL, +/* 85e7 */ NULL, +/* 85e8 */ NULL, +/* 85e9 */ NULL, +/* 85ea */ NULL, +/* 85eb */ NULL, +/* 85ec */ NULL, +/* 85ed */ NULL, +/* 85ee */ NULL, +/* 85ef */ NULL, +/* 85f0 */ NULL, +/* 85f1 */ NULL, +/* 85f2 */ NULL, +/* 85f3 */ NULL, +/* 85f4 */ NULL, +/* 85f5 */ NULL, +/* 85f6 */ NULL, +/* 85f7 */ NULL, +/* 85f8 */ NULL, +/* 85f9 */ NULL, +/* 85fa */ NULL, +/* 85fb */ NULL, +/* 85fc */ NULL, +/* 85fd */ NULL, +/* 85fe */ NULL, +/* 85ff */ NULL, +/* 8600 */ NULL, +/* 8601 */ NULL, +/* 8602 */ NULL, +/* 8603 */ NULL, +/* 8604 */ NULL, +/* 8605 */ NULL, +/* 8606 */ NULL, +/* 8607 */ NULL, +/* 8608 */ NULL, +/* 8609 */ NULL, +/* 860a */ NULL, +/* 860b */ NULL, +/* 860c */ NULL, +/* 860d */ NULL, +/* 860e */ NULL, +/* 860f */ NULL, +/* 8610 */ NULL, +/* 8611 */ NULL, +/* 8612 */ NULL, +/* 8613 */ NULL, +/* 8614 */ NULL, +/* 8615 */ NULL, +/* 8616 */ NULL, +/* 8617 */ NULL, +/* 8618 */ NULL, +/* 8619 */ NULL, +/* 861a */ NULL, +/* 861b */ NULL, +/* 861c */ NULL, +/* 861d */ NULL, +/* 861e */ NULL, +/* 861f */ NULL, +/* 8620 */ NULL, +/* 8621 */ NULL, +/* 8622 */ NULL, +/* 8623 */ NULL, +/* 8624 */ NULL, +/* 8625 */ NULL, +/* 8626 */ NULL, +/* 8627 */ NULL, +/* 8628 */ NULL, +/* 8629 */ NULL, +/* 862a */ NULL, +/* 862b */ NULL, +/* 862c */ NULL, +/* 862d */ NULL, +/* 862e */ NULL, +/* 862f */ NULL, +/* 8630 */ NULL, +/* 8631 */ NULL, +/* 8632 */ NULL, +/* 8633 */ NULL, +/* 8634 */ NULL, +/* 8635 */ NULL, +/* 8636 */ NULL, +/* 8637 */ NULL, +/* 8638 */ NULL, +/* 8639 */ NULL, +/* 863a */ NULL, +/* 863b */ NULL, +/* 863c */ NULL, +/* 863d */ NULL, +/* 863e */ NULL, +/* 863f */ NULL, +/* 8640 */ NULL, +/* 8641 */ NULL, +/* 8642 */ NULL, +/* 8643 */ NULL, +/* 8644 */ NULL, +/* 8645 */ NULL, +/* 8646 */ NULL, +/* 8647 */ NULL, +/* 8648 */ NULL, +/* 8649 */ NULL, +/* 864a */ NULL, +/* 864b */ NULL, +/* 864c */ NULL, +/* 864d */ NULL, +/* 864e */ NULL, +/* 864f */ NULL, +/* 8650 */ NULL, +/* 8651 */ NULL, +/* 8652 */ NULL, +/* 8653 */ NULL, +/* 8654 */ NULL, +/* 8655 */ NULL, +/* 8656 */ NULL, +/* 8657 */ NULL, +/* 8658 */ NULL, +/* 8659 */ NULL, +/* 865a */ NULL, +/* 865b */ NULL, +/* 865c */ NULL, +/* 865d */ NULL, +/* 865e */ NULL, +/* 865f */ NULL, +/* 8660 */ NULL, +/* 8661 */ NULL, +/* 8662 */ NULL, +/* 8663 */ NULL, +/* 8664 */ NULL, +/* 8665 */ NULL, +/* 8666 */ NULL, +/* 8667 */ NULL, +/* 8668 */ NULL, +/* 8669 */ NULL, +/* 866a */ NULL, +/* 866b */ NULL, +/* 866c */ NULL, +/* 866d */ NULL, +/* 866e */ NULL, +/* 866f */ NULL, +/* 8670 */ NULL, +/* 8671 */ NULL, +/* 8672 */ NULL, +/* 8673 */ NULL, +/* 8674 */ NULL, +/* 8675 */ NULL, +/* 8676 */ NULL, +/* 8677 */ NULL, +/* 8678 */ NULL, +/* 8679 */ NULL, +/* 867a */ NULL, +/* 867b */ NULL, +/* 867c */ NULL, +/* 867d */ NULL, +/* 867e */ NULL, +/* 867f */ NULL, +/* 8680 */ NULL, +/* 8681 */ NULL, +/* 8682 */ NULL, +/* 8683 */ NULL, +/* 8684 */ NULL, +/* 8685 */ NULL, +/* 8686 */ NULL, +/* 8687 */ NULL, +/* 8688 */ NULL, +/* 8689 */ NULL, +/* 868a */ NULL, +/* 868b */ NULL, +/* 868c */ NULL, +/* 868d */ NULL, +/* 868e */ NULL, +/* 868f */ NULL, +/* 8690 */ NULL, +/* 8691 */ NULL, +/* 8692 */ NULL, +/* 8693 */ NULL, +/* 8694 */ NULL, +/* 8695 */ NULL, +/* 8696 */ NULL, +/* 8697 */ NULL, +/* 8698 */ NULL, +/* 8699 */ NULL, +/* 869a */ NULL, +/* 869b */ NULL, +/* 869c */ NULL, +/* 869d */ NULL, +/* 869e */ NULL, +/* 869f */ NULL, +/* 86a0 */ NULL, +/* 86a1 */ NULL, +/* 86a2 */ NULL, +/* 86a3 */ NULL, +/* 86a4 */ NULL, +/* 86a5 */ NULL, +/* 86a6 */ NULL, +/* 86a7 */ NULL, +/* 86a8 */ NULL, +/* 86a9 */ NULL, +/* 86aa */ NULL, +/* 86ab */ NULL, +/* 86ac */ NULL, +/* 86ad */ NULL, +/* 86ae */ NULL, +/* 86af */ NULL, +/* 86b0 */ NULL, +/* 86b1 */ NULL, +/* 86b2 */ NULL, +/* 86b3 */ NULL, +/* 86b4 */ NULL, +/* 86b5 */ NULL, +/* 86b6 */ NULL, +/* 86b7 */ NULL, +/* 86b8 */ NULL, +/* 86b9 */ NULL, +/* 86ba */ NULL, +/* 86bb */ NULL, +/* 86bc */ NULL, +/* 86bd */ NULL, +/* 86be */ NULL, +/* 86bf */ NULL, +/* 86c0 */ NULL, +/* 86c1 */ NULL, +/* 86c2 */ NULL, +/* 86c3 */ NULL, +/* 86c4 */ NULL, +/* 86c5 */ NULL, +/* 86c6 */ NULL, +/* 86c7 */ NULL, +/* 86c8 */ NULL, +/* 86c9 */ NULL, +/* 86ca */ NULL, +/* 86cb */ NULL, +/* 86cc */ NULL, +/* 86cd */ NULL, +/* 86ce */ NULL, +/* 86cf */ NULL, +/* 86d0 */ NULL, +/* 86d1 */ NULL, +/* 86d2 */ NULL, +/* 86d3 */ NULL, +/* 86d4 */ NULL, +/* 86d5 */ NULL, +/* 86d6 */ NULL, +/* 86d7 */ NULL, +/* 86d8 */ NULL, +/* 86d9 */ NULL, +/* 86da */ NULL, +/* 86db */ NULL, +/* 86dc */ NULL, +/* 86dd */ NULL, +/* 86de */ NULL, +/* 86df */ NULL, +/* 86e0 */ NULL, +/* 86e1 */ NULL, +/* 86e2 */ NULL, +/* 86e3 */ NULL, +/* 86e4 */ NULL, +/* 86e5 */ NULL, +/* 86e6 */ NULL, +/* 86e7 */ NULL, +/* 86e8 */ NULL, +/* 86e9 */ NULL, +/* 86ea */ NULL, +/* 86eb */ NULL, +/* 86ec */ NULL, +/* 86ed */ NULL, +/* 86ee */ NULL, +/* 86ef */ NULL, +/* 86f0 */ NULL, +/* 86f1 */ NULL, +/* 86f2 */ NULL, +/* 86f3 */ NULL, +/* 86f4 */ NULL, +/* 86f5 */ NULL, +/* 86f6 */ NULL, +/* 86f7 */ NULL, +/* 86f8 */ NULL, +/* 86f9 */ NULL, +/* 86fa */ NULL, +/* 86fb */ NULL, +/* 86fc */ NULL, +/* 86fd */ NULL, +/* 86fe */ NULL, +/* 86ff */ NULL, +/* 8700 */ NULL, +/* 8701 */ NULL, +/* 8702 */ NULL, +/* 8703 */ NULL, +/* 8704 */ NULL, +/* 8705 */ NULL, +/* 8706 */ NULL, +/* 8707 */ NULL, +/* 8708 */ NULL, +/* 8709 */ NULL, +/* 870a */ NULL, +/* 870b */ NULL, +/* 870c */ NULL, +/* 870d */ NULL, +/* 870e */ NULL, +/* 870f */ NULL, +/* 8710 */ NULL, +/* 8711 */ NULL, +/* 8712 */ NULL, +/* 8713 */ NULL, +/* 8714 */ NULL, +/* 8715 */ NULL, +/* 8716 */ NULL, +/* 8717 */ NULL, +/* 8718 */ NULL, +/* 8719 */ NULL, +/* 871a */ NULL, +/* 871b */ NULL, +/* 871c */ NULL, +/* 871d */ NULL, +/* 871e */ NULL, +/* 871f */ NULL, +/* 8720 */ NULL, +/* 8721 */ NULL, +/* 8722 */ NULL, +/* 8723 */ NULL, +/* 8724 */ NULL, +/* 8725 */ NULL, +/* 8726 */ NULL, +/* 8727 */ NULL, +/* 8728 */ NULL, +/* 8729 */ NULL, +/* 872a */ NULL, +/* 872b */ NULL, +/* 872c */ NULL, +/* 872d */ NULL, +/* 872e */ NULL, +/* 872f */ NULL, +/* 8730 */ NULL, +/* 8731 */ NULL, +/* 8732 */ NULL, +/* 8733 */ NULL, +/* 8734 */ NULL, +/* 8735 */ NULL, +/* 8736 */ NULL, +/* 8737 */ NULL, +/* 8738 */ NULL, +/* 8739 */ NULL, +/* 873a */ NULL, +/* 873b */ NULL, +/* 873c */ NULL, +/* 873d */ NULL, +/* 873e */ NULL, +/* 873f */ NULL, +/* 8740 */ NULL, +/* 8741 */ NULL, +/* 8742 */ NULL, +/* 8743 */ NULL, +/* 8744 */ NULL, +/* 8745 */ NULL, +/* 8746 */ NULL, +/* 8747 */ NULL, +/* 8748 */ NULL, +/* 8749 */ NULL, +/* 874a */ NULL, +/* 874b */ NULL, +/* 874c */ NULL, +/* 874d */ NULL, +/* 874e */ NULL, +/* 874f */ NULL, +/* 8750 */ NULL, +/* 8751 */ NULL, +/* 8752 */ NULL, +/* 8753 */ NULL, +/* 8754 */ NULL, +/* 8755 */ NULL, +/* 8756 */ NULL, +/* 8757 */ NULL, +/* 8758 */ NULL, +/* 8759 */ NULL, +/* 875a */ NULL, +/* 875b */ NULL, +/* 875c */ NULL, +/* 875d */ NULL, +/* 875e */ NULL, +/* 875f */ NULL, +/* 8760 */ NULL, +/* 8761 */ NULL, +/* 8762 */ NULL, +/* 8763 */ NULL, +/* 8764 */ NULL, +/* 8765 */ NULL, +/* 8766 */ NULL, +/* 8767 */ NULL, +/* 8768 */ NULL, +/* 8769 */ NULL, +/* 876a */ NULL, +/* 876b */ NULL, +/* 876c */ NULL, +/* 876d */ NULL, +/* 876e */ NULL, +/* 876f */ NULL, +/* 8770 */ NULL, +/* 8771 */ NULL, +/* 8772 */ NULL, +/* 8773 */ NULL, +/* 8774 */ NULL, +/* 8775 */ NULL, +/* 8776 */ NULL, +/* 8777 */ NULL, +/* 8778 */ NULL, +/* 8779 */ NULL, +/* 877a */ NULL, +/* 877b */ NULL, +/* 877c */ NULL, +/* 877d */ NULL, +/* 877e */ NULL, +/* 877f */ NULL, +/* 8780 */ NULL, +/* 8781 */ NULL, +/* 8782 */ NULL, +/* 8783 */ NULL, +/* 8784 */ NULL, +/* 8785 */ NULL, +/* 8786 */ NULL, +/* 8787 */ NULL, +/* 8788 */ NULL, +/* 8789 */ NULL, +/* 878a */ NULL, +/* 878b */ NULL, +/* 878c */ NULL, +/* 878d */ NULL, +/* 878e */ NULL, +/* 878f */ NULL, +/* 8790 */ NULL, +/* 8791 */ NULL, +/* 8792 */ NULL, +/* 8793 */ NULL, +/* 8794 */ NULL, +/* 8795 */ NULL, +/* 8796 */ NULL, +/* 8797 */ NULL, +/* 8798 */ NULL, +/* 8799 */ NULL, +/* 879a */ NULL, +/* 879b */ NULL, +/* 879c */ NULL, +/* 879d */ NULL, +/* 879e */ NULL, +/* 879f */ NULL, +/* 87a0 */ NULL, +/* 87a1 */ NULL, +/* 87a2 */ NULL, +/* 87a3 */ NULL, +/* 87a4 */ NULL, +/* 87a5 */ NULL, +/* 87a6 */ NULL, +/* 87a7 */ NULL, +/* 87a8 */ NULL, +/* 87a9 */ NULL, +/* 87aa */ NULL, +/* 87ab */ NULL, +/* 87ac */ NULL, +/* 87ad */ NULL, +/* 87ae */ NULL, +/* 87af */ NULL, +/* 87b0 */ NULL, +/* 87b1 */ NULL, +/* 87b2 */ NULL, +/* 87b3 */ NULL, +/* 87b4 */ NULL, +/* 87b5 */ NULL, +/* 87b6 */ NULL, +/* 87b7 */ NULL, +/* 87b8 */ NULL, +/* 87b9 */ NULL, +/* 87ba */ NULL, +/* 87bb */ NULL, +/* 87bc */ NULL, +/* 87bd */ NULL, +/* 87be */ NULL, +/* 87bf */ NULL, +/* 87c0 */ NULL, +/* 87c1 */ NULL, +/* 87c2 */ NULL, +/* 87c3 */ NULL, +/* 87c4 */ NULL, +/* 87c5 */ NULL, +/* 87c6 */ NULL, +/* 87c7 */ NULL, +/* 87c8 */ NULL, +/* 87c9 */ NULL, +/* 87ca */ NULL, +/* 87cb */ NULL, +/* 87cc */ NULL, +/* 87cd */ NULL, +/* 87ce */ NULL, +/* 87cf */ NULL, +/* 87d0 */ NULL, +/* 87d1 */ NULL, +/* 87d2 */ NULL, +/* 87d3 */ NULL, +/* 87d4 */ NULL, +/* 87d5 */ NULL, +/* 87d6 */ NULL, +/* 87d7 */ NULL, +/* 87d8 */ NULL, +/* 87d9 */ NULL, +/* 87da */ NULL, +/* 87db */ NULL, +/* 87dc */ NULL, +/* 87dd */ NULL, +/* 87de */ NULL, +/* 87df */ NULL, +/* 87e0 */ NULL, +/* 87e1 */ NULL, +/* 87e2 */ NULL, +/* 87e3 */ NULL, +/* 87e4 */ NULL, +/* 87e5 */ NULL, +/* 87e6 */ NULL, +/* 87e7 */ NULL, +/* 87e8 */ NULL, +/* 87e9 */ NULL, +/* 87ea */ NULL, +/* 87eb */ NULL, +/* 87ec */ NULL, +/* 87ed */ NULL, +/* 87ee */ NULL, +/* 87ef */ NULL, +/* 87f0 */ NULL, +/* 87f1 */ NULL, +/* 87f2 */ NULL, +/* 87f3 */ NULL, +/* 87f4 */ NULL, +/* 87f5 */ NULL, +/* 87f6 */ NULL, +/* 87f7 */ NULL, +/* 87f8 */ NULL, +/* 87f9 */ NULL, +/* 87fa */ NULL, +/* 87fb */ NULL, +/* 87fc */ NULL, +/* 87fd */ NULL, +/* 87fe */ NULL, +/* 87ff */ NULL, +/* 8800 */ NULL, +/* 8801 */ NULL, +/* 8802 */ NULL, +/* 8803 */ NULL, +/* 8804 */ NULL, +/* 8805 */ NULL, +/* 8806 */ NULL, +/* 8807 */ NULL, +/* 8808 */ NULL, +/* 8809 */ NULL, +/* 880a */ NULL, +/* 880b */ NULL, +/* 880c */ NULL, +/* 880d */ NULL, +/* 880e */ NULL, +/* 880f */ NULL, +/* 8810 */ NULL, +/* 8811 */ NULL, +/* 8812 */ NULL, +/* 8813 */ NULL, +/* 8814 */ NULL, +/* 8815 */ NULL, +/* 8816 */ NULL, +/* 8817 */ NULL, +/* 8818 */ NULL, +/* 8819 */ NULL, +/* 881a */ NULL, +/* 881b */ NULL, +/* 881c */ NULL, +/* 881d */ NULL, +/* 881e */ NULL, +/* 881f */ NULL, +/* 8820 */ NULL, +/* 8821 */ NULL, +/* 8822 */ NULL, +/* 8823 */ NULL, +/* 8824 */ NULL, +/* 8825 */ NULL, +/* 8826 */ NULL, +/* 8827 */ NULL, +/* 8828 */ NULL, +/* 8829 */ NULL, +/* 882a */ NULL, +/* 882b */ NULL, +/* 882c */ NULL, +/* 882d */ NULL, +/* 882e */ NULL, +/* 882f */ NULL, +/* 8830 */ NULL, +/* 8831 */ NULL, +/* 8832 */ NULL, +/* 8833 */ NULL, +/* 8834 */ NULL, +/* 8835 */ NULL, +/* 8836 */ NULL, +/* 8837 */ NULL, +/* 8838 */ NULL, +/* 8839 */ NULL, +/* 883a */ NULL, +/* 883b */ NULL, +/* 883c */ NULL, +/* 883d */ NULL, +/* 883e */ NULL, +/* 883f */ NULL, +/* 8840 */ NULL, +/* 8841 */ NULL, +/* 8842 */ NULL, +/* 8843 */ NULL, +/* 8844 */ NULL, +/* 8845 */ NULL, +/* 8846 */ NULL, +/* 8847 */ NULL, +/* 8848 */ NULL, +/* 8849 */ NULL, +/* 884a */ NULL, +/* 884b */ NULL, +/* 884c */ NULL, +/* 884d */ NULL, +/* 884e */ NULL, +/* 884f */ NULL, +/* 8850 */ NULL, +/* 8851 */ NULL, +/* 8852 */ NULL, +/* 8853 */ NULL, +/* 8854 */ NULL, +/* 8855 */ NULL, +/* 8856 */ NULL, +/* 8857 */ NULL, +/* 8858 */ NULL, +/* 8859 */ NULL, +/* 885a */ NULL, +/* 885b */ NULL, +/* 885c */ NULL, +/* 885d */ NULL, +/* 885e */ NULL, +/* 885f */ NULL, +/* 8860 */ NULL, +/* 8861 */ NULL, +/* 8862 */ NULL, +/* 8863 */ NULL, +/* 8864 */ NULL, +/* 8865 */ NULL, +/* 8866 */ NULL, +/* 8867 */ NULL, +/* 8868 */ NULL, +/* 8869 */ NULL, +/* 886a */ NULL, +/* 886b */ NULL, +/* 886c */ NULL, +/* 886d */ NULL, +/* 886e */ NULL, +/* 886f */ NULL, +/* 8870 */ NULL, +/* 8871 */ NULL, +/* 8872 */ NULL, +/* 8873 */ NULL, +/* 8874 */ NULL, +/* 8875 */ NULL, +/* 8876 */ NULL, +/* 8877 */ NULL, +/* 8878 */ NULL, +/* 8879 */ NULL, +/* 887a */ NULL, +/* 887b */ NULL, +/* 887c */ NULL, +/* 887d */ NULL, +/* 887e */ NULL, +/* 887f */ NULL, +/* 8880 */ NULL, +/* 8881 */ NULL, +/* 8882 */ NULL, +/* 8883 */ NULL, +/* 8884 */ NULL, +/* 8885 */ NULL, +/* 8886 */ NULL, +/* 8887 */ NULL, +/* 8888 */ NULL, +/* 8889 */ NULL, +/* 888a */ NULL, +/* 888b */ NULL, +/* 888c */ NULL, +/* 888d */ NULL, +/* 888e */ NULL, +/* 888f */ NULL, +/* 8890 */ NULL, +/* 8891 */ NULL, +/* 8892 */ NULL, +/* 8893 */ NULL, +/* 8894 */ NULL, +/* 8895 */ NULL, +/* 8896 */ NULL, +/* 8897 */ NULL, +/* 8898 */ NULL, +/* 8899 */ NULL, +/* 889a */ NULL, +/* 889b */ NULL, +/* 889c */ NULL, +/* 889d */ NULL, +/* 889e */ NULL, +/* 889f */ NULL, +/* 88a0 */ NULL, +/* 88a1 */ NULL, +/* 88a2 */ NULL, +/* 88a3 */ NULL, +/* 88a4 */ NULL, +/* 88a5 */ NULL, +/* 88a6 */ NULL, +/* 88a7 */ NULL, +/* 88a8 */ NULL, +/* 88a9 */ NULL, +/* 88aa */ NULL, +/* 88ab */ NULL, +/* 88ac */ NULL, +/* 88ad */ NULL, +/* 88ae */ NULL, +/* 88af */ NULL, +/* 88b0 */ NULL, +/* 88b1 */ NULL, +/* 88b2 */ NULL, +/* 88b3 */ NULL, +/* 88b4 */ NULL, +/* 88b5 */ NULL, +/* 88b6 */ NULL, +/* 88b7 */ NULL, +/* 88b8 */ NULL, +/* 88b9 */ NULL, +/* 88ba */ NULL, +/* 88bb */ NULL, +/* 88bc */ NULL, +/* 88bd */ NULL, +/* 88be */ NULL, +/* 88bf */ NULL, +/* 88c0 */ NULL, +/* 88c1 */ NULL, +/* 88c2 */ NULL, +/* 88c3 */ NULL, +/* 88c4 */ NULL, +/* 88c5 */ NULL, +/* 88c6 */ NULL, +/* 88c7 */ NULL, +/* 88c8 */ NULL, +/* 88c9 */ NULL, +/* 88ca */ NULL, +/* 88cb */ NULL, +/* 88cc */ NULL, +/* 88cd */ NULL, +/* 88ce */ NULL, +/* 88cf */ NULL, +/* 88d0 */ NULL, +/* 88d1 */ NULL, +/* 88d2 */ NULL, +/* 88d3 */ NULL, +/* 88d4 */ NULL, +/* 88d5 */ NULL, +/* 88d6 */ NULL, +/* 88d7 */ NULL, +/* 88d8 */ NULL, +/* 88d9 */ NULL, +/* 88da */ NULL, +/* 88db */ NULL, +/* 88dc */ NULL, +/* 88dd */ NULL, +/* 88de */ NULL, +/* 88df */ NULL, +/* 88e0 */ NULL, +/* 88e1 */ NULL, +/* 88e2 */ NULL, +/* 88e3 */ NULL, +/* 88e4 */ NULL, +/* 88e5 */ NULL, +/* 88e6 */ NULL, +/* 88e7 */ NULL, +/* 88e8 */ NULL, +/* 88e9 */ NULL, +/* 88ea */ NULL, +/* 88eb */ NULL, +/* 88ec */ NULL, +/* 88ed */ NULL, +/* 88ee */ NULL, +/* 88ef */ NULL, +/* 88f0 */ NULL, +/* 88f1 */ NULL, +/* 88f2 */ NULL, +/* 88f3 */ NULL, +/* 88f4 */ NULL, +/* 88f5 */ NULL, +/* 88f6 */ NULL, +/* 88f7 */ NULL, +/* 88f8 */ NULL, +/* 88f9 */ NULL, +/* 88fa */ NULL, +/* 88fb */ NULL, +/* 88fc */ NULL, +/* 88fd */ NULL, +/* 88fe */ NULL, +/* 88ff */ NULL, +/* 8900 */ NULL, +/* 8901 */ NULL, +/* 8902 */ NULL, +/* 8903 */ NULL, +/* 8904 */ NULL, +/* 8905 */ NULL, +/* 8906 */ NULL, +/* 8907 */ NULL, +/* 8908 */ NULL, +/* 8909 */ NULL, +/* 890a */ NULL, +/* 890b */ NULL, +/* 890c */ NULL, +/* 890d */ NULL, +/* 890e */ NULL, +/* 890f */ NULL, +/* 8910 */ NULL, +/* 8911 */ NULL, +/* 8912 */ NULL, +/* 8913 */ NULL, +/* 8914 */ NULL, +/* 8915 */ NULL, +/* 8916 */ NULL, +/* 8917 */ NULL, +/* 8918 */ NULL, +/* 8919 */ NULL, +/* 891a */ NULL, +/* 891b */ NULL, +/* 891c */ NULL, +/* 891d */ NULL, +/* 891e */ NULL, +/* 891f */ NULL, +/* 8920 */ NULL, +/* 8921 */ NULL, +/* 8922 */ NULL, +/* 8923 */ NULL, +/* 8924 */ NULL, +/* 8925 */ NULL, +/* 8926 */ NULL, +/* 8927 */ NULL, +/* 8928 */ NULL, +/* 8929 */ NULL, +/* 892a */ NULL, +/* 892b */ NULL, +/* 892c */ NULL, +/* 892d */ NULL, +/* 892e */ NULL, +/* 892f */ NULL, +/* 8930 */ NULL, +/* 8931 */ NULL, +/* 8932 */ NULL, +/* 8933 */ NULL, +/* 8934 */ NULL, +/* 8935 */ NULL, +/* 8936 */ NULL, +/* 8937 */ NULL, +/* 8938 */ NULL, +/* 8939 */ NULL, +/* 893a */ NULL, +/* 893b */ NULL, +/* 893c */ NULL, +/* 893d */ NULL, +/* 893e */ NULL, +/* 893f */ NULL, +/* 8940 */ NULL, +/* 8941 */ NULL, +/* 8942 */ NULL, +/* 8943 */ NULL, +/* 8944 */ NULL, +/* 8945 */ NULL, +/* 8946 */ NULL, +/* 8947 */ NULL, +/* 8948 */ NULL, +/* 8949 */ NULL, +/* 894a */ NULL, +/* 894b */ NULL, +/* 894c */ NULL, +/* 894d */ NULL, +/* 894e */ NULL, +/* 894f */ NULL, +/* 8950 */ NULL, +/* 8951 */ NULL, +/* 8952 */ NULL, +/* 8953 */ NULL, +/* 8954 */ NULL, +/* 8955 */ NULL, +/* 8956 */ NULL, +/* 8957 */ NULL, +/* 8958 */ NULL, +/* 8959 */ NULL, +/* 895a */ NULL, +/* 895b */ NULL, +/* 895c */ NULL, +/* 895d */ NULL, +/* 895e */ NULL, +/* 895f */ NULL, +/* 8960 */ NULL, +/* 8961 */ NULL, +/* 8962 */ NULL, +/* 8963 */ NULL, +/* 8964 */ NULL, +/* 8965 */ NULL, +/* 8966 */ NULL, +/* 8967 */ NULL, +/* 8968 */ NULL, +/* 8969 */ NULL, +/* 896a */ NULL, +/* 896b */ NULL, +/* 896c */ NULL, +/* 896d */ NULL, +/* 896e */ NULL, +/* 896f */ NULL, +/* 8970 */ NULL, +/* 8971 */ NULL, +/* 8972 */ NULL, +/* 8973 */ NULL, +/* 8974 */ NULL, +/* 8975 */ NULL, +/* 8976 */ NULL, +/* 8977 */ NULL, +/* 8978 */ NULL, +/* 8979 */ NULL, +/* 897a */ NULL, +/* 897b */ NULL, +/* 897c */ NULL, +/* 897d */ NULL, +/* 897e */ NULL, +/* 897f */ NULL, +/* 8980 */ NULL, +/* 8981 */ NULL, +/* 8982 */ NULL, +/* 8983 */ NULL, +/* 8984 */ NULL, +/* 8985 */ NULL, +/* 8986 */ NULL, +/* 8987 */ NULL, +/* 8988 */ NULL, +/* 8989 */ NULL, +/* 898a */ NULL, +/* 898b */ NULL, +/* 898c */ NULL, +/* 898d */ NULL, +/* 898e */ NULL, +/* 898f */ NULL, +/* 8990 */ NULL, +/* 8991 */ NULL, +/* 8992 */ NULL, +/* 8993 */ NULL, +/* 8994 */ NULL, +/* 8995 */ NULL, +/* 8996 */ NULL, +/* 8997 */ NULL, +/* 8998 */ NULL, +/* 8999 */ NULL, +/* 899a */ NULL, +/* 899b */ NULL, +/* 899c */ NULL, +/* 899d */ NULL, +/* 899e */ NULL, +/* 899f */ NULL, +/* 89a0 */ NULL, +/* 89a1 */ NULL, +/* 89a2 */ NULL, +/* 89a3 */ NULL, +/* 89a4 */ NULL, +/* 89a5 */ NULL, +/* 89a6 */ NULL, +/* 89a7 */ NULL, +/* 89a8 */ NULL, +/* 89a9 */ NULL, +/* 89aa */ NULL, +/* 89ab */ NULL, +/* 89ac */ NULL, +/* 89ad */ NULL, +/* 89ae */ NULL, +/* 89af */ NULL, +/* 89b0 */ NULL, +/* 89b1 */ NULL, +/* 89b2 */ NULL, +/* 89b3 */ NULL, +/* 89b4 */ NULL, +/* 89b5 */ NULL, +/* 89b6 */ NULL, +/* 89b7 */ NULL, +/* 89b8 */ NULL, +/* 89b9 */ NULL, +/* 89ba */ NULL, +/* 89bb */ NULL, +/* 89bc */ NULL, +/* 89bd */ NULL, +/* 89be */ NULL, +/* 89bf */ NULL, +/* 89c0 */ NULL, +/* 89c1 */ NULL, +/* 89c2 */ NULL, +/* 89c3 */ NULL, +/* 89c4 */ NULL, +/* 89c5 */ NULL, +/* 89c6 */ NULL, +/* 89c7 */ NULL, +/* 89c8 */ NULL, +/* 89c9 */ NULL, +/* 89ca */ NULL, +/* 89cb */ NULL, +/* 89cc */ NULL, +/* 89cd */ NULL, +/* 89ce */ NULL, +/* 89cf */ NULL, +/* 89d0 */ NULL, +/* 89d1 */ NULL, +/* 89d2 */ NULL, +/* 89d3 */ NULL, +/* 89d4 */ NULL, +/* 89d5 */ NULL, +/* 89d6 */ NULL, +/* 89d7 */ NULL, +/* 89d8 */ NULL, +/* 89d9 */ NULL, +/* 89da */ NULL, +/* 89db */ NULL, +/* 89dc */ NULL, +/* 89dd */ NULL, +/* 89de */ NULL, +/* 89df */ NULL, +/* 89e0 */ NULL, +/* 89e1 */ NULL, +/* 89e2 */ NULL, +/* 89e3 */ NULL, +/* 89e4 */ NULL, +/* 89e5 */ NULL, +/* 89e6 */ NULL, +/* 89e7 */ NULL, +/* 89e8 */ NULL, +/* 89e9 */ NULL, +/* 89ea */ NULL, +/* 89eb */ NULL, +/* 89ec */ NULL, +/* 89ed */ NULL, +/* 89ee */ NULL, +/* 89ef */ NULL, +/* 89f0 */ NULL, +/* 89f1 */ NULL, +/* 89f2 */ NULL, +/* 89f3 */ NULL, +/* 89f4 */ NULL, +/* 89f5 */ NULL, +/* 89f6 */ NULL, +/* 89f7 */ NULL, +/* 89f8 */ NULL, +/* 89f9 */ NULL, +/* 89fa */ NULL, +/* 89fb */ NULL, +/* 89fc */ NULL, +/* 89fd */ NULL, +/* 89fe */ NULL, +/* 89ff */ NULL, +/* 8a00 */ NULL, +/* 8a01 */ NULL, +/* 8a02 */ NULL, +/* 8a03 */ NULL, +/* 8a04 */ NULL, +/* 8a05 */ NULL, +/* 8a06 */ NULL, +/* 8a07 */ NULL, +/* 8a08 */ NULL, +/* 8a09 */ NULL, +/* 8a0a */ NULL, +/* 8a0b */ NULL, +/* 8a0c */ NULL, +/* 8a0d */ NULL, +/* 8a0e */ NULL, +/* 8a0f */ NULL, +/* 8a10 */ NULL, +/* 8a11 */ NULL, +/* 8a12 */ NULL, +/* 8a13 */ NULL, +/* 8a14 */ NULL, +/* 8a15 */ NULL, +/* 8a16 */ NULL, +/* 8a17 */ NULL, +/* 8a18 */ NULL, +/* 8a19 */ NULL, +/* 8a1a */ NULL, +/* 8a1b */ NULL, +/* 8a1c */ NULL, +/* 8a1d */ NULL, +/* 8a1e */ NULL, +/* 8a1f */ NULL, +/* 8a20 */ NULL, +/* 8a21 */ NULL, +/* 8a22 */ NULL, +/* 8a23 */ NULL, +/* 8a24 */ NULL, +/* 8a25 */ NULL, +/* 8a26 */ NULL, +/* 8a27 */ NULL, +/* 8a28 */ NULL, +/* 8a29 */ NULL, +/* 8a2a */ NULL, +/* 8a2b */ NULL, +/* 8a2c */ NULL, +/* 8a2d */ NULL, +/* 8a2e */ NULL, +/* 8a2f */ NULL, +/* 8a30 */ NULL, +/* 8a31 */ NULL, +/* 8a32 */ NULL, +/* 8a33 */ NULL, +/* 8a34 */ NULL, +/* 8a35 */ NULL, +/* 8a36 */ NULL, +/* 8a37 */ NULL, +/* 8a38 */ NULL, +/* 8a39 */ NULL, +/* 8a3a */ NULL, +/* 8a3b */ NULL, +/* 8a3c */ NULL, +/* 8a3d */ NULL, +/* 8a3e */ NULL, +/* 8a3f */ NULL, +/* 8a40 */ NULL, +/* 8a41 */ NULL, +/* 8a42 */ NULL, +/* 8a43 */ NULL, +/* 8a44 */ NULL, +/* 8a45 */ NULL, +/* 8a46 */ NULL, +/* 8a47 */ NULL, +/* 8a48 */ NULL, +/* 8a49 */ NULL, +/* 8a4a */ NULL, +/* 8a4b */ NULL, +/* 8a4c */ NULL, +/* 8a4d */ NULL, +/* 8a4e */ NULL, +/* 8a4f */ NULL, +/* 8a50 */ NULL, +/* 8a51 */ NULL, +/* 8a52 */ NULL, +/* 8a53 */ NULL, +/* 8a54 */ NULL, +/* 8a55 */ NULL, +/* 8a56 */ NULL, +/* 8a57 */ NULL, +/* 8a58 */ NULL, +/* 8a59 */ NULL, +/* 8a5a */ NULL, +/* 8a5b */ NULL, +/* 8a5c */ NULL, +/* 8a5d */ NULL, +/* 8a5e */ NULL, +/* 8a5f */ NULL, +/* 8a60 */ NULL, +/* 8a61 */ NULL, +/* 8a62 */ NULL, +/* 8a63 */ NULL, +/* 8a64 */ NULL, +/* 8a65 */ NULL, +/* 8a66 */ NULL, +/* 8a67 */ NULL, +/* 8a68 */ NULL, +/* 8a69 */ NULL, +/* 8a6a */ NULL, +/* 8a6b */ NULL, +/* 8a6c */ NULL, +/* 8a6d */ NULL, +/* 8a6e */ NULL, +/* 8a6f */ NULL, +/* 8a70 */ NULL, +/* 8a71 */ NULL, +/* 8a72 */ NULL, +/* 8a73 */ NULL, +/* 8a74 */ NULL, +/* 8a75 */ NULL, +/* 8a76 */ NULL, +/* 8a77 */ NULL, +/* 8a78 */ NULL, +/* 8a79 */ NULL, +/* 8a7a */ NULL, +/* 8a7b */ NULL, +/* 8a7c */ NULL, +/* 8a7d */ NULL, +/* 8a7e */ NULL, +/* 8a7f */ NULL, +/* 8a80 */ NULL, +/* 8a81 */ NULL, +/* 8a82 */ NULL, +/* 8a83 */ NULL, +/* 8a84 */ NULL, +/* 8a85 */ NULL, +/* 8a86 */ NULL, +/* 8a87 */ NULL, +/* 8a88 */ NULL, +/* 8a89 */ NULL, +/* 8a8a */ NULL, +/* 8a8b */ NULL, +/* 8a8c */ NULL, +/* 8a8d */ NULL, +/* 8a8e */ NULL, +/* 8a8f */ NULL, +/* 8a90 */ NULL, +/* 8a91 */ NULL, +/* 8a92 */ NULL, +/* 8a93 */ NULL, +/* 8a94 */ NULL, +/* 8a95 */ NULL, +/* 8a96 */ NULL, +/* 8a97 */ NULL, +/* 8a98 */ NULL, +/* 8a99 */ NULL, +/* 8a9a */ NULL, +/* 8a9b */ NULL, +/* 8a9c */ NULL, +/* 8a9d */ NULL, +/* 8a9e */ NULL, +/* 8a9f */ NULL, +/* 8aa0 */ NULL, +/* 8aa1 */ NULL, +/* 8aa2 */ NULL, +/* 8aa3 */ NULL, +/* 8aa4 */ NULL, +/* 8aa5 */ NULL, +/* 8aa6 */ NULL, +/* 8aa7 */ NULL, +/* 8aa8 */ NULL, +/* 8aa9 */ NULL, +/* 8aaa */ NULL, +/* 8aab */ NULL, +/* 8aac */ NULL, +/* 8aad */ NULL, +/* 8aae */ NULL, +/* 8aaf */ NULL, +/* 8ab0 */ NULL, +/* 8ab1 */ NULL, +/* 8ab2 */ NULL, +/* 8ab3 */ NULL, +/* 8ab4 */ NULL, +/* 8ab5 */ NULL, +/* 8ab6 */ NULL, +/* 8ab7 */ NULL, +/* 8ab8 */ NULL, +/* 8ab9 */ NULL, +/* 8aba */ NULL, +/* 8abb */ NULL, +/* 8abc */ NULL, +/* 8abd */ NULL, +/* 8abe */ NULL, +/* 8abf */ NULL, +/* 8ac0 */ NULL, +/* 8ac1 */ NULL, +/* 8ac2 */ NULL, +/* 8ac3 */ NULL, +/* 8ac4 */ NULL, +/* 8ac5 */ NULL, +/* 8ac6 */ NULL, +/* 8ac7 */ NULL, +/* 8ac8 */ NULL, +/* 8ac9 */ NULL, +/* 8aca */ NULL, +/* 8acb */ NULL, +/* 8acc */ NULL, +/* 8acd */ NULL, +/* 8ace */ NULL, +/* 8acf */ NULL, +/* 8ad0 */ NULL, +/* 8ad1 */ NULL, +/* 8ad2 */ NULL, +/* 8ad3 */ NULL, +/* 8ad4 */ NULL, +/* 8ad5 */ NULL, +/* 8ad6 */ NULL, +/* 8ad7 */ NULL, +/* 8ad8 */ NULL, +/* 8ad9 */ NULL, +/* 8ada */ NULL, +/* 8adb */ NULL, +/* 8adc */ NULL, +/* 8add */ NULL, +/* 8ade */ NULL, +/* 8adf */ NULL, +/* 8ae0 */ NULL, +/* 8ae1 */ NULL, +/* 8ae2 */ NULL, +/* 8ae3 */ NULL, +/* 8ae4 */ NULL, +/* 8ae5 */ NULL, +/* 8ae6 */ NULL, +/* 8ae7 */ NULL, +/* 8ae8 */ NULL, +/* 8ae9 */ NULL, +/* 8aea */ NULL, +/* 8aeb */ NULL, +/* 8aec */ NULL, +/* 8aed */ NULL, +/* 8aee */ NULL, +/* 8aef */ NULL, +/* 8af0 */ NULL, +/* 8af1 */ NULL, +/* 8af2 */ NULL, +/* 8af3 */ NULL, +/* 8af4 */ NULL, +/* 8af5 */ NULL, +/* 8af6 */ NULL, +/* 8af7 */ NULL, +/* 8af8 */ NULL, +/* 8af9 */ NULL, +/* 8afa */ NULL, +/* 8afb */ NULL, +/* 8afc */ NULL, +/* 8afd */ NULL, +/* 8afe */ NULL, +/* 8aff */ NULL, +/* 8b00 */ NULL, +/* 8b01 */ NULL, +/* 8b02 */ NULL, +/* 8b03 */ NULL, +/* 8b04 */ NULL, +/* 8b05 */ NULL, +/* 8b06 */ NULL, +/* 8b07 */ NULL, +/* 8b08 */ NULL, +/* 8b09 */ NULL, +/* 8b0a */ NULL, +/* 8b0b */ NULL, +/* 8b0c */ NULL, +/* 8b0d */ NULL, +/* 8b0e */ NULL, +/* 8b0f */ NULL, +/* 8b10 */ NULL, +/* 8b11 */ NULL, +/* 8b12 */ NULL, +/* 8b13 */ NULL, +/* 8b14 */ NULL, +/* 8b15 */ NULL, +/* 8b16 */ NULL, +/* 8b17 */ NULL, +/* 8b18 */ NULL, +/* 8b19 */ NULL, +/* 8b1a */ NULL, +/* 8b1b */ NULL, +/* 8b1c */ NULL, +/* 8b1d */ NULL, +/* 8b1e */ NULL, +/* 8b1f */ NULL, +/* 8b20 */ NULL, +/* 8b21 */ NULL, +/* 8b22 */ NULL, +/* 8b23 */ NULL, +/* 8b24 */ NULL, +/* 8b25 */ NULL, +/* 8b26 */ NULL, +/* 8b27 */ NULL, +/* 8b28 */ NULL, +/* 8b29 */ NULL, +/* 8b2a */ NULL, +/* 8b2b */ NULL, +/* 8b2c */ NULL, +/* 8b2d */ NULL, +/* 8b2e */ NULL, +/* 8b2f */ NULL, +/* 8b30 */ NULL, +/* 8b31 */ NULL, +/* 8b32 */ NULL, +/* 8b33 */ NULL, +/* 8b34 */ NULL, +/* 8b35 */ NULL, +/* 8b36 */ NULL, +/* 8b37 */ NULL, +/* 8b38 */ NULL, +/* 8b39 */ NULL, +/* 8b3a */ NULL, +/* 8b3b */ NULL, +/* 8b3c */ NULL, +/* 8b3d */ NULL, +/* 8b3e */ NULL, +/* 8b3f */ NULL, +/* 8b40 */ NULL, +/* 8b41 */ NULL, +/* 8b42 */ NULL, +/* 8b43 */ NULL, +/* 8b44 */ NULL, +/* 8b45 */ NULL, +/* 8b46 */ NULL, +/* 8b47 */ NULL, +/* 8b48 */ NULL, +/* 8b49 */ NULL, +/* 8b4a */ NULL, +/* 8b4b */ NULL, +/* 8b4c */ NULL, +/* 8b4d */ NULL, +/* 8b4e */ NULL, +/* 8b4f */ NULL, +/* 8b50 */ NULL, +/* 8b51 */ NULL, +/* 8b52 */ NULL, +/* 8b53 */ NULL, +/* 8b54 */ NULL, +/* 8b55 */ NULL, +/* 8b56 */ NULL, +/* 8b57 */ NULL, +/* 8b58 */ NULL, +/* 8b59 */ NULL, +/* 8b5a */ NULL, +/* 8b5b */ NULL, +/* 8b5c */ NULL, +/* 8b5d */ NULL, +/* 8b5e */ NULL, +/* 8b5f */ NULL, +/* 8b60 */ NULL, +/* 8b61 */ NULL, +/* 8b62 */ NULL, +/* 8b63 */ NULL, +/* 8b64 */ NULL, +/* 8b65 */ NULL, +/* 8b66 */ NULL, +/* 8b67 */ NULL, +/* 8b68 */ NULL, +/* 8b69 */ NULL, +/* 8b6a */ NULL, +/* 8b6b */ NULL, +/* 8b6c */ NULL, +/* 8b6d */ NULL, +/* 8b6e */ NULL, +/* 8b6f */ NULL, +/* 8b70 */ NULL, +/* 8b71 */ NULL, +/* 8b72 */ NULL, +/* 8b73 */ NULL, +/* 8b74 */ NULL, +/* 8b75 */ NULL, +/* 8b76 */ NULL, +/* 8b77 */ NULL, +/* 8b78 */ NULL, +/* 8b79 */ NULL, +/* 8b7a */ NULL, +/* 8b7b */ NULL, +/* 8b7c */ NULL, +/* 8b7d */ NULL, +/* 8b7e */ NULL, +/* 8b7f */ NULL, +/* 8b80 */ NULL, +/* 8b81 */ NULL, +/* 8b82 */ NULL, +/* 8b83 */ NULL, +/* 8b84 */ NULL, +/* 8b85 */ NULL, +/* 8b86 */ NULL, +/* 8b87 */ NULL, +/* 8b88 */ NULL, +/* 8b89 */ NULL, +/* 8b8a */ NULL, +/* 8b8b */ NULL, +/* 8b8c */ NULL, +/* 8b8d */ NULL, +/* 8b8e */ NULL, +/* 8b8f */ NULL, +/* 8b90 */ NULL, +/* 8b91 */ NULL, +/* 8b92 */ NULL, +/* 8b93 */ NULL, +/* 8b94 */ NULL, +/* 8b95 */ NULL, +/* 8b96 */ NULL, +/* 8b97 */ NULL, +/* 8b98 */ NULL, +/* 8b99 */ NULL, +/* 8b9a */ NULL, +/* 8b9b */ NULL, +/* 8b9c */ NULL, +/* 8b9d */ NULL, +/* 8b9e */ NULL, +/* 8b9f */ NULL, +/* 8ba0 */ NULL, +/* 8ba1 */ NULL, +/* 8ba2 */ NULL, +/* 8ba3 */ NULL, +/* 8ba4 */ NULL, +/* 8ba5 */ NULL, +/* 8ba6 */ NULL, +/* 8ba7 */ NULL, +/* 8ba8 */ NULL, +/* 8ba9 */ NULL, +/* 8baa */ NULL, +/* 8bab */ NULL, +/* 8bac */ NULL, +/* 8bad */ NULL, +/* 8bae */ NULL, +/* 8baf */ NULL, +/* 8bb0 */ NULL, +/* 8bb1 */ NULL, +/* 8bb2 */ NULL, +/* 8bb3 */ NULL, +/* 8bb4 */ NULL, +/* 8bb5 */ NULL, +/* 8bb6 */ NULL, +/* 8bb7 */ NULL, +/* 8bb8 */ NULL, +/* 8bb9 */ NULL, +/* 8bba */ NULL, +/* 8bbb */ NULL, +/* 8bbc */ NULL, +/* 8bbd */ NULL, +/* 8bbe */ NULL, +/* 8bbf */ NULL, +/* 8bc0 */ NULL, +/* 8bc1 */ NULL, +/* 8bc2 */ NULL, +/* 8bc3 */ NULL, +/* 8bc4 */ NULL, +/* 8bc5 */ NULL, +/* 8bc6 */ NULL, +/* 8bc7 */ NULL, +/* 8bc8 */ NULL, +/* 8bc9 */ NULL, +/* 8bca */ NULL, +/* 8bcb */ NULL, +/* 8bcc */ NULL, +/* 8bcd */ NULL, +/* 8bce */ NULL, +/* 8bcf */ NULL, +/* 8bd0 */ NULL, +/* 8bd1 */ NULL, +/* 8bd2 */ NULL, +/* 8bd3 */ NULL, +/* 8bd4 */ NULL, +/* 8bd5 */ NULL, +/* 8bd6 */ NULL, +/* 8bd7 */ NULL, +/* 8bd8 */ NULL, +/* 8bd9 */ NULL, +/* 8bda */ NULL, +/* 8bdb */ NULL, +/* 8bdc */ NULL, +/* 8bdd */ NULL, +/* 8bde */ NULL, +/* 8bdf */ NULL, +/* 8be0 */ NULL, +/* 8be1 */ NULL, +/* 8be2 */ NULL, +/* 8be3 */ NULL, +/* 8be4 */ NULL, +/* 8be5 */ NULL, +/* 8be6 */ NULL, +/* 8be7 */ NULL, +/* 8be8 */ NULL, +/* 8be9 */ NULL, +/* 8bea */ NULL, +/* 8beb */ NULL, +/* 8bec */ NULL, +/* 8bed */ NULL, +/* 8bee */ NULL, +/* 8bef */ NULL, +/* 8bf0 */ NULL, +/* 8bf1 */ NULL, +/* 8bf2 */ NULL, +/* 8bf3 */ NULL, +/* 8bf4 */ NULL, +/* 8bf5 */ NULL, +/* 8bf6 */ NULL, +/* 8bf7 */ NULL, +/* 8bf8 */ NULL, +/* 8bf9 */ NULL, +/* 8bfa */ NULL, +/* 8bfb */ NULL, +/* 8bfc */ NULL, +/* 8bfd */ NULL, +/* 8bfe */ NULL, +/* 8bff */ NULL, +/* 8c00 */ NULL, +/* 8c01 */ NULL, +/* 8c02 */ NULL, +/* 8c03 */ NULL, +/* 8c04 */ NULL, +/* 8c05 */ NULL, +/* 8c06 */ NULL, +/* 8c07 */ NULL, +/* 8c08 */ NULL, +/* 8c09 */ NULL, +/* 8c0a */ NULL, +/* 8c0b */ NULL, +/* 8c0c */ NULL, +/* 8c0d */ NULL, +/* 8c0e */ NULL, +/* 8c0f */ NULL, +/* 8c10 */ NULL, +/* 8c11 */ NULL, +/* 8c12 */ NULL, +/* 8c13 */ NULL, +/* 8c14 */ NULL, +/* 8c15 */ NULL, +/* 8c16 */ NULL, +/* 8c17 */ NULL, +/* 8c18 */ NULL, +/* 8c19 */ NULL, +/* 8c1a */ NULL, +/* 8c1b */ NULL, +/* 8c1c */ NULL, +/* 8c1d */ NULL, +/* 8c1e */ NULL, +/* 8c1f */ NULL, +/* 8c20 */ NULL, +/* 8c21 */ NULL, +/* 8c22 */ NULL, +/* 8c23 */ NULL, +/* 8c24 */ NULL, +/* 8c25 */ NULL, +/* 8c26 */ NULL, +/* 8c27 */ NULL, +/* 8c28 */ NULL, +/* 8c29 */ NULL, +/* 8c2a */ NULL, +/* 8c2b */ NULL, +/* 8c2c */ NULL, +/* 8c2d */ NULL, +/* 8c2e */ NULL, +/* 8c2f */ NULL, +/* 8c30 */ NULL, +/* 8c31 */ NULL, +/* 8c32 */ NULL, +/* 8c33 */ NULL, +/* 8c34 */ NULL, +/* 8c35 */ NULL, +/* 8c36 */ NULL, +/* 8c37 */ NULL, +/* 8c38 */ NULL, +/* 8c39 */ NULL, +/* 8c3a */ NULL, +/* 8c3b */ NULL, +/* 8c3c */ NULL, +/* 8c3d */ NULL, +/* 8c3e */ NULL, +/* 8c3f */ NULL, +/* 8c40 */ NULL, +/* 8c41 */ NULL, +/* 8c42 */ NULL, +/* 8c43 */ NULL, +/* 8c44 */ NULL, +/* 8c45 */ NULL, +/* 8c46 */ NULL, +/* 8c47 */ NULL, +/* 8c48 */ NULL, +/* 8c49 */ NULL, +/* 8c4a */ NULL, +/* 8c4b */ NULL, +/* 8c4c */ NULL, +/* 8c4d */ NULL, +/* 8c4e */ NULL, +/* 8c4f */ NULL, +/* 8c50 */ NULL, +/* 8c51 */ NULL, +/* 8c52 */ NULL, +/* 8c53 */ NULL, +/* 8c54 */ NULL, +/* 8c55 */ NULL, +/* 8c56 */ NULL, +/* 8c57 */ NULL, +/* 8c58 */ NULL, +/* 8c59 */ NULL, +/* 8c5a */ NULL, +/* 8c5b */ NULL, +/* 8c5c */ NULL, +/* 8c5d */ NULL, +/* 8c5e */ NULL, +/* 8c5f */ NULL, +/* 8c60 */ NULL, +/* 8c61 */ NULL, +/* 8c62 */ NULL, +/* 8c63 */ NULL, +/* 8c64 */ NULL, +/* 8c65 */ NULL, +/* 8c66 */ NULL, +/* 8c67 */ NULL, +/* 8c68 */ NULL, +/* 8c69 */ NULL, +/* 8c6a */ NULL, +/* 8c6b */ NULL, +/* 8c6c */ NULL, +/* 8c6d */ NULL, +/* 8c6e */ NULL, +/* 8c6f */ NULL, +/* 8c70 */ NULL, +/* 8c71 */ NULL, +/* 8c72 */ NULL, +/* 8c73 */ NULL, +/* 8c74 */ NULL, +/* 8c75 */ NULL, +/* 8c76 */ NULL, +/* 8c77 */ NULL, +/* 8c78 */ NULL, +/* 8c79 */ NULL, +/* 8c7a */ NULL, +/* 8c7b */ NULL, +/* 8c7c */ NULL, +/* 8c7d */ NULL, +/* 8c7e */ NULL, +/* 8c7f */ NULL, +/* 8c80 */ NULL, +/* 8c81 */ NULL, +/* 8c82 */ NULL, +/* 8c83 */ NULL, +/* 8c84 */ NULL, +/* 8c85 */ NULL, +/* 8c86 */ NULL, +/* 8c87 */ NULL, +/* 8c88 */ NULL, +/* 8c89 */ NULL, +/* 8c8a */ NULL, +/* 8c8b */ NULL, +/* 8c8c */ NULL, +/* 8c8d */ NULL, +/* 8c8e */ NULL, +/* 8c8f */ NULL, +/* 8c90 */ NULL, +/* 8c91 */ NULL, +/* 8c92 */ NULL, +/* 8c93 */ NULL, +/* 8c94 */ NULL, +/* 8c95 */ NULL, +/* 8c96 */ NULL, +/* 8c97 */ NULL, +/* 8c98 */ NULL, +/* 8c99 */ NULL, +/* 8c9a */ NULL, +/* 8c9b */ NULL, +/* 8c9c */ NULL, +/* 8c9d */ NULL, +/* 8c9e */ NULL, +/* 8c9f */ NULL, +/* 8ca0 */ NULL, +/* 8ca1 */ NULL, +/* 8ca2 */ NULL, +/* 8ca3 */ NULL, +/* 8ca4 */ NULL, +/* 8ca5 */ NULL, +/* 8ca6 */ NULL, +/* 8ca7 */ NULL, +/* 8ca8 */ NULL, +/* 8ca9 */ NULL, +/* 8caa */ NULL, +/* 8cab */ NULL, +/* 8cac */ NULL, +/* 8cad */ NULL, +/* 8cae */ NULL, +/* 8caf */ NULL, +/* 8cb0 */ NULL, +/* 8cb1 */ NULL, +/* 8cb2 */ NULL, +/* 8cb3 */ NULL, +/* 8cb4 */ NULL, +/* 8cb5 */ NULL, +/* 8cb6 */ NULL, +/* 8cb7 */ NULL, +/* 8cb8 */ NULL, +/* 8cb9 */ NULL, +/* 8cba */ NULL, +/* 8cbb */ NULL, +/* 8cbc */ NULL, +/* 8cbd */ NULL, +/* 8cbe */ NULL, +/* 8cbf */ NULL, +/* 8cc0 */ NULL, +/* 8cc1 */ NULL, +/* 8cc2 */ NULL, +/* 8cc3 */ NULL, +/* 8cc4 */ NULL, +/* 8cc5 */ NULL, +/* 8cc6 */ NULL, +/* 8cc7 */ NULL, +/* 8cc8 */ NULL, +/* 8cc9 */ NULL, +/* 8cca */ NULL, +/* 8ccb */ NULL, +/* 8ccc */ NULL, +/* 8ccd */ NULL, +/* 8cce */ NULL, +/* 8ccf */ NULL, +/* 8cd0 */ NULL, +/* 8cd1 */ NULL, +/* 8cd2 */ NULL, +/* 8cd3 */ NULL, +/* 8cd4 */ NULL, +/* 8cd5 */ NULL, +/* 8cd6 */ NULL, +/* 8cd7 */ NULL, +/* 8cd8 */ NULL, +/* 8cd9 */ NULL, +/* 8cda */ NULL, +/* 8cdb */ NULL, +/* 8cdc */ NULL, +/* 8cdd */ NULL, +/* 8cde */ NULL, +/* 8cdf */ NULL, +/* 8ce0 */ NULL, +/* 8ce1 */ NULL, +/* 8ce2 */ NULL, +/* 8ce3 */ NULL, +/* 8ce4 */ NULL, +/* 8ce5 */ NULL, +/* 8ce6 */ NULL, +/* 8ce7 */ NULL, +/* 8ce8 */ NULL, +/* 8ce9 */ NULL, +/* 8cea */ NULL, +/* 8ceb */ NULL, +/* 8cec */ NULL, +/* 8ced */ NULL, +/* 8cee */ NULL, +/* 8cef */ NULL, +/* 8cf0 */ NULL, +/* 8cf1 */ NULL, +/* 8cf2 */ NULL, +/* 8cf3 */ NULL, +/* 8cf4 */ NULL, +/* 8cf5 */ NULL, +/* 8cf6 */ NULL, +/* 8cf7 */ NULL, +/* 8cf8 */ NULL, +/* 8cf9 */ NULL, +/* 8cfa */ NULL, +/* 8cfb */ NULL, +/* 8cfc */ NULL, +/* 8cfd */ NULL, +/* 8cfe */ NULL, +/* 8cff */ NULL, +/* 8d00 */ NULL, +/* 8d01 */ NULL, +/* 8d02 */ NULL, +/* 8d03 */ NULL, +/* 8d04 */ NULL, +/* 8d05 */ NULL, +/* 8d06 */ NULL, +/* 8d07 */ NULL, +/* 8d08 */ NULL, +/* 8d09 */ NULL, +/* 8d0a */ NULL, +/* 8d0b */ NULL, +/* 8d0c */ NULL, +/* 8d0d */ NULL, +/* 8d0e */ NULL, +/* 8d0f */ NULL, +/* 8d10 */ NULL, +/* 8d11 */ NULL, +/* 8d12 */ NULL, +/* 8d13 */ NULL, +/* 8d14 */ NULL, +/* 8d15 */ NULL, +/* 8d16 */ NULL, +/* 8d17 */ NULL, +/* 8d18 */ NULL, +/* 8d19 */ NULL, +/* 8d1a */ NULL, +/* 8d1b */ NULL, +/* 8d1c */ NULL, +/* 8d1d */ NULL, +/* 8d1e */ NULL, +/* 8d1f */ NULL, +/* 8d20 */ NULL, +/* 8d21 */ NULL, +/* 8d22 */ NULL, +/* 8d23 */ NULL, +/* 8d24 */ NULL, +/* 8d25 */ NULL, +/* 8d26 */ NULL, +/* 8d27 */ NULL, +/* 8d28 */ NULL, +/* 8d29 */ NULL, +/* 8d2a */ NULL, +/* 8d2b */ NULL, +/* 8d2c */ NULL, +/* 8d2d */ NULL, +/* 8d2e */ NULL, +/* 8d2f */ NULL, +/* 8d30 */ NULL, +/* 8d31 */ NULL, +/* 8d32 */ NULL, +/* 8d33 */ NULL, +/* 8d34 */ NULL, +/* 8d35 */ NULL, +/* 8d36 */ NULL, +/* 8d37 */ NULL, +/* 8d38 */ NULL, +/* 8d39 */ NULL, +/* 8d3a */ NULL, +/* 8d3b */ NULL, +/* 8d3c */ NULL, +/* 8d3d */ NULL, +/* 8d3e */ NULL, +/* 8d3f */ NULL, +/* 8d40 */ NULL, +/* 8d41 */ NULL, +/* 8d42 */ NULL, +/* 8d43 */ NULL, +/* 8d44 */ NULL, +/* 8d45 */ NULL, +/* 8d46 */ NULL, +/* 8d47 */ NULL, +/* 8d48 */ NULL, +/* 8d49 */ NULL, +/* 8d4a */ NULL, +/* 8d4b */ NULL, +/* 8d4c */ NULL, +/* 8d4d */ NULL, +/* 8d4e */ NULL, +/* 8d4f */ NULL, +/* 8d50 */ NULL, +/* 8d51 */ NULL, +/* 8d52 */ NULL, +/* 8d53 */ NULL, +/* 8d54 */ NULL, +/* 8d55 */ NULL, +/* 8d56 */ NULL, +/* 8d57 */ NULL, +/* 8d58 */ NULL, +/* 8d59 */ NULL, +/* 8d5a */ NULL, +/* 8d5b */ NULL, +/* 8d5c */ NULL, +/* 8d5d */ NULL, +/* 8d5e */ NULL, +/* 8d5f */ NULL, +/* 8d60 */ NULL, +/* 8d61 */ NULL, +/* 8d62 */ NULL, +/* 8d63 */ NULL, +/* 8d64 */ NULL, +/* 8d65 */ NULL, +/* 8d66 */ NULL, +/* 8d67 */ NULL, +/* 8d68 */ NULL, +/* 8d69 */ NULL, +/* 8d6a */ NULL, +/* 8d6b */ NULL, +/* 8d6c */ NULL, +/* 8d6d */ NULL, +/* 8d6e */ NULL, +/* 8d6f */ NULL, +/* 8d70 */ NULL, +/* 8d71 */ NULL, +/* 8d72 */ NULL, +/* 8d73 */ NULL, +/* 8d74 */ NULL, +/* 8d75 */ NULL, +/* 8d76 */ NULL, +/* 8d77 */ NULL, +/* 8d78 */ NULL, +/* 8d79 */ NULL, +/* 8d7a */ NULL, +/* 8d7b */ NULL, +/* 8d7c */ NULL, +/* 8d7d */ NULL, +/* 8d7e */ NULL, +/* 8d7f */ NULL, +/* 8d80 */ NULL, +/* 8d81 */ NULL, +/* 8d82 */ NULL, +/* 8d83 */ NULL, +/* 8d84 */ NULL, +/* 8d85 */ NULL, +/* 8d86 */ NULL, +/* 8d87 */ NULL, +/* 8d88 */ NULL, +/* 8d89 */ NULL, +/* 8d8a */ NULL, +/* 8d8b */ NULL, +/* 8d8c */ NULL, +/* 8d8d */ NULL, +/* 8d8e */ NULL, +/* 8d8f */ NULL, +/* 8d90 */ NULL, +/* 8d91 */ NULL, +/* 8d92 */ NULL, +/* 8d93 */ NULL, +/* 8d94 */ NULL, +/* 8d95 */ NULL, +/* 8d96 */ NULL, +/* 8d97 */ NULL, +/* 8d98 */ NULL, +/* 8d99 */ NULL, +/* 8d9a */ NULL, +/* 8d9b */ NULL, +/* 8d9c */ NULL, +/* 8d9d */ NULL, +/* 8d9e */ NULL, +/* 8d9f */ NULL, +/* 8da0 */ NULL, +/* 8da1 */ NULL, +/* 8da2 */ NULL, +/* 8da3 */ NULL, +/* 8da4 */ NULL, +/* 8da5 */ NULL, +/* 8da6 */ NULL, +/* 8da7 */ NULL, +/* 8da8 */ NULL, +/* 8da9 */ NULL, +/* 8daa */ NULL, +/* 8dab */ NULL, +/* 8dac */ NULL, +/* 8dad */ NULL, +/* 8dae */ NULL, +/* 8daf */ NULL, +/* 8db0 */ NULL, +/* 8db1 */ NULL, +/* 8db2 */ NULL, +/* 8db3 */ NULL, +/* 8db4 */ NULL, +/* 8db5 */ NULL, +/* 8db6 */ NULL, +/* 8db7 */ NULL, +/* 8db8 */ NULL, +/* 8db9 */ NULL, +/* 8dba */ NULL, +/* 8dbb */ NULL, +/* 8dbc */ NULL, +/* 8dbd */ NULL, +/* 8dbe */ NULL, +/* 8dbf */ NULL, +/* 8dc0 */ NULL, +/* 8dc1 */ NULL, +/* 8dc2 */ NULL, +/* 8dc3 */ NULL, +/* 8dc4 */ NULL, +/* 8dc5 */ NULL, +/* 8dc6 */ NULL, +/* 8dc7 */ NULL, +/* 8dc8 */ NULL, +/* 8dc9 */ NULL, +/* 8dca */ NULL, +/* 8dcb */ NULL, +/* 8dcc */ NULL, +/* 8dcd */ NULL, +/* 8dce */ NULL, +/* 8dcf */ NULL, +/* 8dd0 */ NULL, +/* 8dd1 */ NULL, +/* 8dd2 */ NULL, +/* 8dd3 */ NULL, +/* 8dd4 */ NULL, +/* 8dd5 */ NULL, +/* 8dd6 */ NULL, +/* 8dd7 */ NULL, +/* 8dd8 */ NULL, +/* 8dd9 */ NULL, +/* 8dda */ NULL, +/* 8ddb */ NULL, +/* 8ddc */ NULL, +/* 8ddd */ NULL, +/* 8dde */ NULL, +/* 8ddf */ NULL, +/* 8de0 */ NULL, +/* 8de1 */ NULL, +/* 8de2 */ NULL, +/* 8de3 */ NULL, +/* 8de4 */ NULL, +/* 8de5 */ NULL, +/* 8de6 */ NULL, +/* 8de7 */ NULL, +/* 8de8 */ NULL, +/* 8de9 */ NULL, +/* 8dea */ NULL, +/* 8deb */ NULL, +/* 8dec */ NULL, +/* 8ded */ NULL, +/* 8dee */ NULL, +/* 8def */ NULL, +/* 8df0 */ NULL, +/* 8df1 */ NULL, +/* 8df2 */ NULL, +/* 8df3 */ NULL, +/* 8df4 */ NULL, +/* 8df5 */ NULL, +/* 8df6 */ NULL, +/* 8df7 */ NULL, +/* 8df8 */ NULL, +/* 8df9 */ NULL, +/* 8dfa */ NULL, +/* 8dfb */ NULL, +/* 8dfc */ NULL, +/* 8dfd */ NULL, +/* 8dfe */ NULL, +/* 8dff */ NULL, +/* 8e00 */ NULL, +/* 8e01 */ NULL, +/* 8e02 */ NULL, +/* 8e03 */ NULL, +/* 8e04 */ NULL, +/* 8e05 */ NULL, +/* 8e06 */ NULL, +/* 8e07 */ NULL, +/* 8e08 */ NULL, +/* 8e09 */ NULL, +/* 8e0a */ NULL, +/* 8e0b */ NULL, +/* 8e0c */ NULL, +/* 8e0d */ NULL, +/* 8e0e */ NULL, +/* 8e0f */ NULL, +/* 8e10 */ NULL, +/* 8e11 */ NULL, +/* 8e12 */ NULL, +/* 8e13 */ NULL, +/* 8e14 */ NULL, +/* 8e15 */ NULL, +/* 8e16 */ NULL, +/* 8e17 */ NULL, +/* 8e18 */ NULL, +/* 8e19 */ NULL, +/* 8e1a */ NULL, +/* 8e1b */ NULL, +/* 8e1c */ NULL, +/* 8e1d */ NULL, +/* 8e1e */ NULL, +/* 8e1f */ NULL, +/* 8e20 */ NULL, +/* 8e21 */ NULL, +/* 8e22 */ NULL, +/* 8e23 */ NULL, +/* 8e24 */ NULL, +/* 8e25 */ NULL, +/* 8e26 */ NULL, +/* 8e27 */ NULL, +/* 8e28 */ NULL, +/* 8e29 */ NULL, +/* 8e2a */ NULL, +/* 8e2b */ NULL, +/* 8e2c */ NULL, +/* 8e2d */ NULL, +/* 8e2e */ NULL, +/* 8e2f */ NULL, +/* 8e30 */ NULL, +/* 8e31 */ NULL, +/* 8e32 */ NULL, +/* 8e33 */ NULL, +/* 8e34 */ NULL, +/* 8e35 */ NULL, +/* 8e36 */ NULL, +/* 8e37 */ NULL, +/* 8e38 */ NULL, +/* 8e39 */ NULL, +/* 8e3a */ NULL, +/* 8e3b */ NULL, +/* 8e3c */ NULL, +/* 8e3d */ NULL, +/* 8e3e */ NULL, +/* 8e3f */ NULL, +/* 8e40 */ NULL, +/* 8e41 */ NULL, +/* 8e42 */ NULL, +/* 8e43 */ NULL, +/* 8e44 */ NULL, +/* 8e45 */ NULL, +/* 8e46 */ NULL, +/* 8e47 */ NULL, +/* 8e48 */ NULL, +/* 8e49 */ NULL, +/* 8e4a */ NULL, +/* 8e4b */ NULL, +/* 8e4c */ NULL, +/* 8e4d */ NULL, +/* 8e4e */ NULL, +/* 8e4f */ NULL, +/* 8e50 */ NULL, +/* 8e51 */ NULL, +/* 8e52 */ NULL, +/* 8e53 */ NULL, +/* 8e54 */ NULL, +/* 8e55 */ NULL, +/* 8e56 */ NULL, +/* 8e57 */ NULL, +/* 8e58 */ NULL, +/* 8e59 */ NULL, +/* 8e5a */ NULL, +/* 8e5b */ NULL, +/* 8e5c */ NULL, +/* 8e5d */ NULL, +/* 8e5e */ NULL, +/* 8e5f */ NULL, +/* 8e60 */ NULL, +/* 8e61 */ NULL, +/* 8e62 */ NULL, +/* 8e63 */ NULL, +/* 8e64 */ NULL, +/* 8e65 */ NULL, +/* 8e66 */ NULL, +/* 8e67 */ NULL, +/* 8e68 */ NULL, +/* 8e69 */ NULL, +/* 8e6a */ NULL, +/* 8e6b */ NULL, +/* 8e6c */ NULL, +/* 8e6d */ NULL, +/* 8e6e */ NULL, +/* 8e6f */ NULL, +/* 8e70 */ NULL, +/* 8e71 */ NULL, +/* 8e72 */ NULL, +/* 8e73 */ NULL, +/* 8e74 */ NULL, +/* 8e75 */ NULL, +/* 8e76 */ NULL, +/* 8e77 */ NULL, +/* 8e78 */ NULL, +/* 8e79 */ NULL, +/* 8e7a */ NULL, +/* 8e7b */ NULL, +/* 8e7c */ NULL, +/* 8e7d */ NULL, +/* 8e7e */ NULL, +/* 8e7f */ NULL, +/* 8e80 */ NULL, +/* 8e81 */ NULL, +/* 8e82 */ NULL, +/* 8e83 */ NULL, +/* 8e84 */ NULL, +/* 8e85 */ NULL, +/* 8e86 */ NULL, +/* 8e87 */ NULL, +/* 8e88 */ NULL, +/* 8e89 */ NULL, +/* 8e8a */ NULL, +/* 8e8b */ NULL, +/* 8e8c */ NULL, +/* 8e8d */ NULL, +/* 8e8e */ NULL, +/* 8e8f */ NULL, +/* 8e90 */ NULL, +/* 8e91 */ NULL, +/* 8e92 */ NULL, +/* 8e93 */ NULL, +/* 8e94 */ NULL, +/* 8e95 */ NULL, +/* 8e96 */ NULL, +/* 8e97 */ NULL, +/* 8e98 */ NULL, +/* 8e99 */ NULL, +/* 8e9a */ NULL, +/* 8e9b */ NULL, +/* 8e9c */ NULL, +/* 8e9d */ NULL, +/* 8e9e */ NULL, +/* 8e9f */ NULL, +/* 8ea0 */ NULL, +/* 8ea1 */ NULL, +/* 8ea2 */ NULL, +/* 8ea3 */ NULL, +/* 8ea4 */ NULL, +/* 8ea5 */ NULL, +/* 8ea6 */ NULL, +/* 8ea7 */ NULL, +/* 8ea8 */ NULL, +/* 8ea9 */ NULL, +/* 8eaa */ NULL, +/* 8eab */ NULL, +/* 8eac */ NULL, +/* 8ead */ NULL, +/* 8eae */ NULL, +/* 8eaf */ NULL, +/* 8eb0 */ NULL, +/* 8eb1 */ NULL, +/* 8eb2 */ NULL, +/* 8eb3 */ NULL, +/* 8eb4 */ NULL, +/* 8eb5 */ NULL, +/* 8eb6 */ NULL, +/* 8eb7 */ NULL, +/* 8eb8 */ NULL, +/* 8eb9 */ NULL, +/* 8eba */ NULL, +/* 8ebb */ NULL, +/* 8ebc */ NULL, +/* 8ebd */ NULL, +/* 8ebe */ NULL, +/* 8ebf */ NULL, +/* 8ec0 */ NULL, +/* 8ec1 */ NULL, +/* 8ec2 */ NULL, +/* 8ec3 */ NULL, +/* 8ec4 */ NULL, +/* 8ec5 */ NULL, +/* 8ec6 */ NULL, +/* 8ec7 */ NULL, +/* 8ec8 */ NULL, +/* 8ec9 */ NULL, +/* 8eca */ NULL, +/* 8ecb */ NULL, +/* 8ecc */ NULL, +/* 8ecd */ NULL, +/* 8ece */ NULL, +/* 8ecf */ NULL, +/* 8ed0 */ NULL, +/* 8ed1 */ NULL, +/* 8ed2 */ NULL, +/* 8ed3 */ NULL, +/* 8ed4 */ NULL, +/* 8ed5 */ NULL, +/* 8ed6 */ NULL, +/* 8ed7 */ NULL, +/* 8ed8 */ NULL, +/* 8ed9 */ NULL, +/* 8eda */ NULL, +/* 8edb */ NULL, +/* 8edc */ NULL, +/* 8edd */ NULL, +/* 8ede */ NULL, +/* 8edf */ NULL, +/* 8ee0 */ NULL, +/* 8ee1 */ NULL, +/* 8ee2 */ NULL, +/* 8ee3 */ NULL, +/* 8ee4 */ NULL, +/* 8ee5 */ NULL, +/* 8ee6 */ NULL, +/* 8ee7 */ NULL, +/* 8ee8 */ NULL, +/* 8ee9 */ NULL, +/* 8eea */ NULL, +/* 8eeb */ NULL, +/* 8eec */ NULL, +/* 8eed */ NULL, +/* 8eee */ NULL, +/* 8eef */ NULL, +/* 8ef0 */ NULL, +/* 8ef1 */ NULL, +/* 8ef2 */ NULL, +/* 8ef3 */ NULL, +/* 8ef4 */ NULL, +/* 8ef5 */ NULL, +/* 8ef6 */ NULL, +/* 8ef7 */ NULL, +/* 8ef8 */ NULL, +/* 8ef9 */ NULL, +/* 8efa */ NULL, +/* 8efb */ NULL, +/* 8efc */ NULL, +/* 8efd */ NULL, +/* 8efe */ NULL, +/* 8eff */ NULL, +/* 8f00 */ NULL, +/* 8f01 */ NULL, +/* 8f02 */ NULL, +/* 8f03 */ NULL, +/* 8f04 */ NULL, +/* 8f05 */ NULL, +/* 8f06 */ NULL, +/* 8f07 */ NULL, +/* 8f08 */ NULL, +/* 8f09 */ NULL, +/* 8f0a */ NULL, +/* 8f0b */ NULL, +/* 8f0c */ NULL, +/* 8f0d */ NULL, +/* 8f0e */ NULL, +/* 8f0f */ NULL, +/* 8f10 */ NULL, +/* 8f11 */ NULL, +/* 8f12 */ NULL, +/* 8f13 */ NULL, +/* 8f14 */ NULL, +/* 8f15 */ NULL, +/* 8f16 */ NULL, +/* 8f17 */ NULL, +/* 8f18 */ NULL, +/* 8f19 */ NULL, +/* 8f1a */ NULL, +/* 8f1b */ NULL, +/* 8f1c */ NULL, +/* 8f1d */ NULL, +/* 8f1e */ NULL, +/* 8f1f */ NULL, +/* 8f20 */ NULL, +/* 8f21 */ NULL, +/* 8f22 */ NULL, +/* 8f23 */ NULL, +/* 8f24 */ NULL, +/* 8f25 */ NULL, +/* 8f26 */ NULL, +/* 8f27 */ NULL, +/* 8f28 */ NULL, +/* 8f29 */ NULL, +/* 8f2a */ NULL, +/* 8f2b */ NULL, +/* 8f2c */ NULL, +/* 8f2d */ NULL, +/* 8f2e */ NULL, +/* 8f2f */ NULL, +/* 8f30 */ NULL, +/* 8f31 */ NULL, +/* 8f32 */ NULL, +/* 8f33 */ NULL, +/* 8f34 */ NULL, +/* 8f35 */ NULL, +/* 8f36 */ NULL, +/* 8f37 */ NULL, +/* 8f38 */ NULL, +/* 8f39 */ NULL, +/* 8f3a */ NULL, +/* 8f3b */ NULL, +/* 8f3c */ NULL, +/* 8f3d */ NULL, +/* 8f3e */ NULL, +/* 8f3f */ NULL, +/* 8f40 */ NULL, +/* 8f41 */ NULL, +/* 8f42 */ NULL, +/* 8f43 */ NULL, +/* 8f44 */ NULL, +/* 8f45 */ NULL, +/* 8f46 */ NULL, +/* 8f47 */ NULL, +/* 8f48 */ NULL, +/* 8f49 */ NULL, +/* 8f4a */ NULL, +/* 8f4b */ NULL, +/* 8f4c */ NULL, +/* 8f4d */ NULL, +/* 8f4e */ NULL, +/* 8f4f */ NULL, +/* 8f50 */ NULL, +/* 8f51 */ NULL, +/* 8f52 */ NULL, +/* 8f53 */ NULL, +/* 8f54 */ NULL, +/* 8f55 */ NULL, +/* 8f56 */ NULL, +/* 8f57 */ NULL, +/* 8f58 */ NULL, +/* 8f59 */ NULL, +/* 8f5a */ NULL, +/* 8f5b */ NULL, +/* 8f5c */ NULL, +/* 8f5d */ NULL, +/* 8f5e */ NULL, +/* 8f5f */ NULL, +/* 8f60 */ NULL, +/* 8f61 */ NULL, +/* 8f62 */ NULL, +/* 8f63 */ NULL, +/* 8f64 */ NULL, +/* 8f65 */ NULL, +/* 8f66 */ NULL, +/* 8f67 */ NULL, +/* 8f68 */ NULL, +/* 8f69 */ NULL, +/* 8f6a */ NULL, +/* 8f6b */ NULL, +/* 8f6c */ NULL, +/* 8f6d */ NULL, +/* 8f6e */ NULL, +/* 8f6f */ NULL, +/* 8f70 */ NULL, +/* 8f71 */ NULL, +/* 8f72 */ NULL, +/* 8f73 */ NULL, +/* 8f74 */ NULL, +/* 8f75 */ NULL, +/* 8f76 */ NULL, +/* 8f77 */ NULL, +/* 8f78 */ NULL, +/* 8f79 */ NULL, +/* 8f7a */ NULL, +/* 8f7b */ NULL, +/* 8f7c */ NULL, +/* 8f7d */ NULL, +/* 8f7e */ NULL, +/* 8f7f */ NULL, +/* 8f80 */ NULL, +/* 8f81 */ NULL, +/* 8f82 */ NULL, +/* 8f83 */ NULL, +/* 8f84 */ NULL, +/* 8f85 */ NULL, +/* 8f86 */ NULL, +/* 8f87 */ NULL, +/* 8f88 */ NULL, +/* 8f89 */ NULL, +/* 8f8a */ NULL, +/* 8f8b */ NULL, +/* 8f8c */ NULL, +/* 8f8d */ NULL, +/* 8f8e */ NULL, +/* 8f8f */ NULL, +/* 8f90 */ NULL, +/* 8f91 */ NULL, +/* 8f92 */ NULL, +/* 8f93 */ NULL, +/* 8f94 */ NULL, +/* 8f95 */ NULL, +/* 8f96 */ NULL, +/* 8f97 */ NULL, +/* 8f98 */ NULL, +/* 8f99 */ NULL, +/* 8f9a */ NULL, +/* 8f9b */ NULL, +/* 8f9c */ NULL, +/* 8f9d */ NULL, +/* 8f9e */ NULL, +/* 8f9f */ NULL, +/* 8fa0 */ NULL, +/* 8fa1 */ NULL, +/* 8fa2 */ NULL, +/* 8fa3 */ NULL, +/* 8fa4 */ NULL, +/* 8fa5 */ NULL, +/* 8fa6 */ NULL, +/* 8fa7 */ NULL, +/* 8fa8 */ NULL, +/* 8fa9 */ NULL, +/* 8faa */ NULL, +/* 8fab */ NULL, +/* 8fac */ NULL, +/* 8fad */ NULL, +/* 8fae */ NULL, +/* 8faf */ NULL, +/* 8fb0 */ NULL, +/* 8fb1 */ NULL, +/* 8fb2 */ NULL, +/* 8fb3 */ NULL, +/* 8fb4 */ NULL, +/* 8fb5 */ NULL, +/* 8fb6 */ NULL, +/* 8fb7 */ NULL, +/* 8fb8 */ NULL, +/* 8fb9 */ NULL, +/* 8fba */ NULL, +/* 8fbb */ NULL, +/* 8fbc */ NULL, +/* 8fbd */ NULL, +/* 8fbe */ NULL, +/* 8fbf */ NULL, +/* 8fc0 */ NULL, +/* 8fc1 */ NULL, +/* 8fc2 */ NULL, +/* 8fc3 */ NULL, +/* 8fc4 */ NULL, +/* 8fc5 */ NULL, +/* 8fc6 */ NULL, +/* 8fc7 */ NULL, +/* 8fc8 */ NULL, +/* 8fc9 */ NULL, +/* 8fca */ NULL, +/* 8fcb */ NULL, +/* 8fcc */ NULL, +/* 8fcd */ NULL, +/* 8fce */ NULL, +/* 8fcf */ NULL, +/* 8fd0 */ NULL, +/* 8fd1 */ NULL, +/* 8fd2 */ NULL, +/* 8fd3 */ NULL, +/* 8fd4 */ NULL, +/* 8fd5 */ NULL, +/* 8fd6 */ NULL, +/* 8fd7 */ NULL, +/* 8fd8 */ NULL, +/* 8fd9 */ NULL, +/* 8fda */ NULL, +/* 8fdb */ NULL, +/* 8fdc */ NULL, +/* 8fdd */ NULL, +/* 8fde */ NULL, +/* 8fdf */ NULL, +/* 8fe0 */ NULL, +/* 8fe1 */ NULL, +/* 8fe2 */ NULL, +/* 8fe3 */ NULL, +/* 8fe4 */ NULL, +/* 8fe5 */ NULL, +/* 8fe6 */ NULL, +/* 8fe7 */ NULL, +/* 8fe8 */ NULL, +/* 8fe9 */ NULL, +/* 8fea */ NULL, +/* 8feb */ NULL, +/* 8fec */ NULL, +/* 8fed */ NULL, +/* 8fee */ NULL, +/* 8fef */ NULL, +/* 8ff0 */ NULL, +/* 8ff1 */ NULL, +/* 8ff2 */ NULL, +/* 8ff3 */ NULL, +/* 8ff4 */ NULL, +/* 8ff5 */ NULL, +/* 8ff6 */ NULL, +/* 8ff7 */ NULL, +/* 8ff8 */ NULL, +/* 8ff9 */ NULL, +/* 8ffa */ NULL, +/* 8ffb */ NULL, +/* 8ffc */ NULL, +/* 8ffd */ NULL, +/* 8ffe */ NULL, +/* 8fff */ NULL, +/* 9000 */ NULL, +/* 9001 */ NULL, +/* 9002 */ NULL, +/* 9003 */ NULL, +/* 9004 */ NULL, +/* 9005 */ NULL, +/* 9006 */ NULL, +/* 9007 */ NULL, +/* 9008 */ NULL, +/* 9009 */ NULL, +/* 900a */ NULL, +/* 900b */ NULL, +/* 900c */ NULL, +/* 900d */ NULL, +/* 900e */ NULL, +/* 900f */ NULL, +/* 9010 */ NULL, +/* 9011 */ NULL, +/* 9012 */ NULL, +/* 9013 */ NULL, +/* 9014 */ NULL, +/* 9015 */ NULL, +/* 9016 */ NULL, +/* 9017 */ NULL, +/* 9018 */ NULL, +/* 9019 */ NULL, +/* 901a */ NULL, +/* 901b */ NULL, +/* 901c */ NULL, +/* 901d */ NULL, +/* 901e */ NULL, +/* 901f */ NULL, +/* 9020 */ NULL, +/* 9021 */ NULL, +/* 9022 */ NULL, +/* 9023 */ NULL, +/* 9024 */ NULL, +/* 9025 */ NULL, +/* 9026 */ NULL, +/* 9027 */ NULL, +/* 9028 */ NULL, +/* 9029 */ NULL, +/* 902a */ NULL, +/* 902b */ NULL, +/* 902c */ NULL, +/* 902d */ NULL, +/* 902e */ NULL, +/* 902f */ NULL, +/* 9030 */ NULL, +/* 9031 */ NULL, +/* 9032 */ NULL, +/* 9033 */ NULL, +/* 9034 */ NULL, +/* 9035 */ NULL, +/* 9036 */ NULL, +/* 9037 */ NULL, +/* 9038 */ NULL, +/* 9039 */ NULL, +/* 903a */ NULL, +/* 903b */ NULL, +/* 903c */ NULL, +/* 903d */ NULL, +/* 903e */ NULL, +/* 903f */ NULL, +/* 9040 */ NULL, +/* 9041 */ NULL, +/* 9042 */ NULL, +/* 9043 */ NULL, +/* 9044 */ NULL, +/* 9045 */ NULL, +/* 9046 */ NULL, +/* 9047 */ NULL, +/* 9048 */ NULL, +/* 9049 */ NULL, +/* 904a */ NULL, +/* 904b */ NULL, +/* 904c */ NULL, +/* 904d */ NULL, +/* 904e */ NULL, +/* 904f */ NULL, +/* 9050 */ NULL, +/* 9051 */ NULL, +/* 9052 */ NULL, +/* 9053 */ NULL, +/* 9054 */ NULL, +/* 9055 */ NULL, +/* 9056 */ NULL, +/* 9057 */ NULL, +/* 9058 */ NULL, +/* 9059 */ NULL, +/* 905a */ NULL, +/* 905b */ NULL, +/* 905c */ NULL, +/* 905d */ NULL, +/* 905e */ NULL, +/* 905f */ NULL, +/* 9060 */ NULL, +/* 9061 */ NULL, +/* 9062 */ NULL, +/* 9063 */ NULL, +/* 9064 */ NULL, +/* 9065 */ NULL, +/* 9066 */ NULL, +/* 9067 */ NULL, +/* 9068 */ NULL, +/* 9069 */ NULL, +/* 906a */ NULL, +/* 906b */ NULL, +/* 906c */ NULL, +/* 906d */ NULL, +/* 906e */ NULL, +/* 906f */ NULL, +/* 9070 */ NULL, +/* 9071 */ NULL, +/* 9072 */ NULL, +/* 9073 */ NULL, +/* 9074 */ NULL, +/* 9075 */ NULL, +/* 9076 */ NULL, +/* 9077 */ NULL, +/* 9078 */ NULL, +/* 9079 */ NULL, +/* 907a */ NULL, +/* 907b */ NULL, +/* 907c */ NULL, +/* 907d */ NULL, +/* 907e */ NULL, +/* 907f */ NULL, +/* 9080 */ NULL, +/* 9081 */ NULL, +/* 9082 */ NULL, +/* 9083 */ NULL, +/* 9084 */ NULL, +/* 9085 */ NULL, +/* 9086 */ NULL, +/* 9087 */ NULL, +/* 9088 */ NULL, +/* 9089 */ NULL, +/* 908a */ NULL, +/* 908b */ NULL, +/* 908c */ NULL, +/* 908d */ NULL, +/* 908e */ NULL, +/* 908f */ NULL, +/* 9090 */ NULL, +/* 9091 */ NULL, +/* 9092 */ NULL, +/* 9093 */ NULL, +/* 9094 */ NULL, +/* 9095 */ NULL, +/* 9096 */ NULL, +/* 9097 */ NULL, +/* 9098 */ NULL, +/* 9099 */ NULL, +/* 909a */ NULL, +/* 909b */ NULL, +/* 909c */ NULL, +/* 909d */ NULL, +/* 909e */ NULL, +/* 909f */ NULL, +/* 90a0 */ NULL, +/* 90a1 */ NULL, +/* 90a2 */ NULL, +/* 90a3 */ NULL, +/* 90a4 */ NULL, +/* 90a5 */ NULL, +/* 90a6 */ NULL, +/* 90a7 */ NULL, +/* 90a8 */ NULL, +/* 90a9 */ NULL, +/* 90aa */ NULL, +/* 90ab */ NULL, +/* 90ac */ NULL, +/* 90ad */ NULL, +/* 90ae */ NULL, +/* 90af */ NULL, +/* 90b0 */ NULL, +/* 90b1 */ NULL, +/* 90b2 */ NULL, +/* 90b3 */ NULL, +/* 90b4 */ NULL, +/* 90b5 */ NULL, +/* 90b6 */ NULL, +/* 90b7 */ NULL, +/* 90b8 */ NULL, +/* 90b9 */ NULL, +/* 90ba */ NULL, +/* 90bb */ NULL, +/* 90bc */ NULL, +/* 90bd */ NULL, +/* 90be */ NULL, +/* 90bf */ NULL, +/* 90c0 */ NULL, +/* 90c1 */ NULL, +/* 90c2 */ NULL, +/* 90c3 */ NULL, +/* 90c4 */ NULL, +/* 90c5 */ NULL, +/* 90c6 */ NULL, +/* 90c7 */ NULL, +/* 90c8 */ NULL, +/* 90c9 */ NULL, +/* 90ca */ NULL, +/* 90cb */ NULL, +/* 90cc */ NULL, +/* 90cd */ NULL, +/* 90ce */ NULL, +/* 90cf */ NULL, +/* 90d0 */ NULL, +/* 90d1 */ NULL, +/* 90d2 */ NULL, +/* 90d3 */ NULL, +/* 90d4 */ NULL, +/* 90d5 */ NULL, +/* 90d6 */ NULL, +/* 90d7 */ NULL, +/* 90d8 */ NULL, +/* 90d9 */ NULL, +/* 90da */ NULL, +/* 90db */ NULL, +/* 90dc */ NULL, +/* 90dd */ NULL, +/* 90de */ NULL, +/* 90df */ NULL, +/* 90e0 */ NULL, +/* 90e1 */ NULL, +/* 90e2 */ NULL, +/* 90e3 */ NULL, +/* 90e4 */ NULL, +/* 90e5 */ NULL, +/* 90e6 */ NULL, +/* 90e7 */ NULL, +/* 90e8 */ NULL, +/* 90e9 */ NULL, +/* 90ea */ NULL, +/* 90eb */ NULL, +/* 90ec */ NULL, +/* 90ed */ NULL, +/* 90ee */ NULL, +/* 90ef */ NULL, +/* 90f0 */ NULL, +/* 90f1 */ NULL, +/* 90f2 */ NULL, +/* 90f3 */ NULL, +/* 90f4 */ NULL, +/* 90f5 */ NULL, +/* 90f6 */ NULL, +/* 90f7 */ NULL, +/* 90f8 */ NULL, +/* 90f9 */ NULL, +/* 90fa */ NULL, +/* 90fb */ NULL, +/* 90fc */ NULL, +/* 90fd */ NULL, +/* 90fe */ NULL, +/* 90ff */ NULL, +/* 9100 */ NULL, +/* 9101 */ NULL, +/* 9102 */ NULL, +/* 9103 */ NULL, +/* 9104 */ NULL, +/* 9105 */ NULL, +/* 9106 */ NULL, +/* 9107 */ NULL, +/* 9108 */ NULL, +/* 9109 */ NULL, +/* 910a */ NULL, +/* 910b */ NULL, +/* 910c */ NULL, +/* 910d */ NULL, +/* 910e */ NULL, +/* 910f */ NULL, +/* 9110 */ NULL, +/* 9111 */ NULL, +/* 9112 */ NULL, +/* 9113 */ NULL, +/* 9114 */ NULL, +/* 9115 */ NULL, +/* 9116 */ NULL, +/* 9117 */ NULL, +/* 9118 */ NULL, +/* 9119 */ NULL, +/* 911a */ NULL, +/* 911b */ NULL, +/* 911c */ NULL, +/* 911d */ NULL, +/* 911e */ NULL, +/* 911f */ NULL, +/* 9120 */ NULL, +/* 9121 */ NULL, +/* 9122 */ NULL, +/* 9123 */ NULL, +/* 9124 */ NULL, +/* 9125 */ NULL, +/* 9126 */ NULL, +/* 9127 */ NULL, +/* 9128 */ NULL, +/* 9129 */ NULL, +/* 912a */ NULL, +/* 912b */ NULL, +/* 912c */ NULL, +/* 912d */ NULL, +/* 912e */ NULL, +/* 912f */ NULL, +/* 9130 */ NULL, +/* 9131 */ NULL, +/* 9132 */ NULL, +/* 9133 */ NULL, +/* 9134 */ NULL, +/* 9135 */ NULL, +/* 9136 */ NULL, +/* 9137 */ NULL, +/* 9138 */ NULL, +/* 9139 */ NULL, +/* 913a */ NULL, +/* 913b */ NULL, +/* 913c */ NULL, +/* 913d */ NULL, +/* 913e */ NULL, +/* 913f */ NULL, +/* 9140 */ NULL, +/* 9141 */ NULL, +/* 9142 */ NULL, +/* 9143 */ NULL, +/* 9144 */ NULL, +/* 9145 */ NULL, +/* 9146 */ NULL, +/* 9147 */ NULL, +/* 9148 */ NULL, +/* 9149 */ NULL, +/* 914a */ NULL, +/* 914b */ NULL, +/* 914c */ NULL, +/* 914d */ NULL, +/* 914e */ NULL, +/* 914f */ NULL, +/* 9150 */ NULL, +/* 9151 */ NULL, +/* 9152 */ NULL, +/* 9153 */ NULL, +/* 9154 */ NULL, +/* 9155 */ NULL, +/* 9156 */ NULL, +/* 9157 */ NULL, +/* 9158 */ NULL, +/* 9159 */ NULL, +/* 915a */ NULL, +/* 915b */ NULL, +/* 915c */ NULL, +/* 915d */ NULL, +/* 915e */ NULL, +/* 915f */ NULL, +/* 9160 */ NULL, +/* 9161 */ NULL, +/* 9162 */ NULL, +/* 9163 */ NULL, +/* 9164 */ NULL, +/* 9165 */ NULL, +/* 9166 */ NULL, +/* 9167 */ NULL, +/* 9168 */ NULL, +/* 9169 */ NULL, +/* 916a */ NULL, +/* 916b */ NULL, +/* 916c */ NULL, +/* 916d */ NULL, +/* 916e */ NULL, +/* 916f */ NULL, +/* 9170 */ NULL, +/* 9171 */ NULL, +/* 9172 */ NULL, +/* 9173 */ NULL, +/* 9174 */ NULL, +/* 9175 */ NULL, +/* 9176 */ NULL, +/* 9177 */ NULL, +/* 9178 */ NULL, +/* 9179 */ NULL, +/* 917a */ NULL, +/* 917b */ NULL, +/* 917c */ NULL, +/* 917d */ NULL, +/* 917e */ NULL, +/* 917f */ NULL, +/* 9180 */ NULL, +/* 9181 */ NULL, +/* 9182 */ NULL, +/* 9183 */ NULL, +/* 9184 */ NULL, +/* 9185 */ NULL, +/* 9186 */ NULL, +/* 9187 */ NULL, +/* 9188 */ NULL, +/* 9189 */ NULL, +/* 918a */ NULL, +/* 918b */ NULL, +/* 918c */ NULL, +/* 918d */ NULL, +/* 918e */ NULL, +/* 918f */ NULL, +/* 9190 */ NULL, +/* 9191 */ NULL, +/* 9192 */ NULL, +/* 9193 */ NULL, +/* 9194 */ NULL, +/* 9195 */ NULL, +/* 9196 */ NULL, +/* 9197 */ NULL, +/* 9198 */ NULL, +/* 9199 */ NULL, +/* 919a */ NULL, +/* 919b */ NULL, +/* 919c */ NULL, +/* 919d */ NULL, +/* 919e */ NULL, +/* 919f */ NULL, +/* 91a0 */ NULL, +/* 91a1 */ NULL, +/* 91a2 */ NULL, +/* 91a3 */ NULL, +/* 91a4 */ NULL, +/* 91a5 */ NULL, +/* 91a6 */ NULL, +/* 91a7 */ NULL, +/* 91a8 */ NULL, +/* 91a9 */ NULL, +/* 91aa */ NULL, +/* 91ab */ NULL, +/* 91ac */ NULL, +/* 91ad */ NULL, +/* 91ae */ NULL, +/* 91af */ NULL, +/* 91b0 */ NULL, +/* 91b1 */ NULL, +/* 91b2 */ NULL, +/* 91b3 */ NULL, +/* 91b4 */ NULL, +/* 91b5 */ NULL, +/* 91b6 */ NULL, +/* 91b7 */ NULL, +/* 91b8 */ NULL, +/* 91b9 */ NULL, +/* 91ba */ NULL, +/* 91bb */ NULL, +/* 91bc */ NULL, +/* 91bd */ NULL, +/* 91be */ NULL, +/* 91bf */ NULL, +/* 91c0 */ NULL, +/* 91c1 */ NULL, +/* 91c2 */ NULL, +/* 91c3 */ NULL, +/* 91c4 */ NULL, +/* 91c5 */ NULL, +/* 91c6 */ NULL, +/* 91c7 */ NULL, +/* 91c8 */ NULL, +/* 91c9 */ NULL, +/* 91ca */ NULL, +/* 91cb */ NULL, +/* 91cc */ NULL, +/* 91cd */ NULL, +/* 91ce */ NULL, +/* 91cf */ NULL, +/* 91d0 */ NULL, +/* 91d1 */ NULL, +/* 91d2 */ NULL, +/* 91d3 */ NULL, +/* 91d4 */ NULL, +/* 91d5 */ NULL, +/* 91d6 */ NULL, +/* 91d7 */ NULL, +/* 91d8 */ NULL, +/* 91d9 */ NULL, +/* 91da */ NULL, +/* 91db */ NULL, +/* 91dc */ NULL, +/* 91dd */ NULL, +/* 91de */ NULL, +/* 91df */ NULL, +/* 91e0 */ NULL, +/* 91e1 */ NULL, +/* 91e2 */ NULL, +/* 91e3 */ NULL, +/* 91e4 */ NULL, +/* 91e5 */ NULL, +/* 91e6 */ NULL, +/* 91e7 */ NULL, +/* 91e8 */ NULL, +/* 91e9 */ NULL, +/* 91ea */ NULL, +/* 91eb */ NULL, +/* 91ec */ NULL, +/* 91ed */ NULL, +/* 91ee */ NULL, +/* 91ef */ NULL, +/* 91f0 */ NULL, +/* 91f1 */ NULL, +/* 91f2 */ NULL, +/* 91f3 */ NULL, +/* 91f4 */ NULL, +/* 91f5 */ NULL, +/* 91f6 */ NULL, +/* 91f7 */ NULL, +/* 91f8 */ NULL, +/* 91f9 */ NULL, +/* 91fa */ NULL, +/* 91fb */ NULL, +/* 91fc */ NULL, +/* 91fd */ NULL, +/* 91fe */ NULL, +/* 91ff */ NULL, +/* 9200 */ NULL, +/* 9201 */ NULL, +/* 9202 */ NULL, +/* 9203 */ NULL, +/* 9204 */ NULL, +/* 9205 */ NULL, +/* 9206 */ NULL, +/* 9207 */ NULL, +/* 9208 */ NULL, +/* 9209 */ NULL, +/* 920a */ NULL, +/* 920b */ NULL, +/* 920c */ NULL, +/* 920d */ NULL, +/* 920e */ NULL, +/* 920f */ NULL, +/* 9210 */ NULL, +/* 9211 */ NULL, +/* 9212 */ NULL, +/* 9213 */ NULL, +/* 9214 */ NULL, +/* 9215 */ NULL, +/* 9216 */ NULL, +/* 9217 */ NULL, +/* 9218 */ NULL, +/* 9219 */ NULL, +/* 921a */ NULL, +/* 921b */ NULL, +/* 921c */ NULL, +/* 921d */ NULL, +/* 921e */ NULL, +/* 921f */ NULL, +/* 9220 */ NULL, +/* 9221 */ NULL, +/* 9222 */ NULL, +/* 9223 */ NULL, +/* 9224 */ NULL, +/* 9225 */ NULL, +/* 9226 */ NULL, +/* 9227 */ NULL, +/* 9228 */ NULL, +/* 9229 */ NULL, +/* 922a */ NULL, +/* 922b */ NULL, +/* 922c */ NULL, +/* 922d */ NULL, +/* 922e */ NULL, +/* 922f */ NULL, +/* 9230 */ NULL, +/* 9231 */ NULL, +/* 9232 */ NULL, +/* 9233 */ NULL, +/* 9234 */ NULL, +/* 9235 */ NULL, +/* 9236 */ NULL, +/* 9237 */ NULL, +/* 9238 */ NULL, +/* 9239 */ NULL, +/* 923a */ NULL, +/* 923b */ NULL, +/* 923c */ NULL, +/* 923d */ NULL, +/* 923e */ NULL, +/* 923f */ NULL, +/* 9240 */ NULL, +/* 9241 */ NULL, +/* 9242 */ NULL, +/* 9243 */ NULL, +/* 9244 */ NULL, +/* 9245 */ NULL, +/* 9246 */ NULL, +/* 9247 */ NULL, +/* 9248 */ NULL, +/* 9249 */ NULL, +/* 924a */ NULL, +/* 924b */ NULL, +/* 924c */ NULL, +/* 924d */ NULL, +/* 924e */ NULL, +/* 924f */ NULL, +/* 9250 */ NULL, +/* 9251 */ NULL, +/* 9252 */ NULL, +/* 9253 */ NULL, +/* 9254 */ NULL, +/* 9255 */ NULL, +/* 9256 */ NULL, +/* 9257 */ NULL, +/* 9258 */ NULL, +/* 9259 */ NULL, +/* 925a */ NULL, +/* 925b */ NULL, +/* 925c */ NULL, +/* 925d */ NULL, +/* 925e */ NULL, +/* 925f */ NULL, +/* 9260 */ NULL, +/* 9261 */ NULL, +/* 9262 */ NULL, +/* 9263 */ NULL, +/* 9264 */ NULL, +/* 9265 */ NULL, +/* 9266 */ NULL, +/* 9267 */ NULL, +/* 9268 */ NULL, +/* 9269 */ NULL, +/* 926a */ NULL, +/* 926b */ NULL, +/* 926c */ NULL, +/* 926d */ NULL, +/* 926e */ NULL, +/* 926f */ NULL, +/* 9270 */ NULL, +/* 9271 */ NULL, +/* 9272 */ NULL, +/* 9273 */ NULL, +/* 9274 */ NULL, +/* 9275 */ NULL, +/* 9276 */ NULL, +/* 9277 */ NULL, +/* 9278 */ NULL, +/* 9279 */ NULL, +/* 927a */ NULL, +/* 927b */ NULL, +/* 927c */ NULL, +/* 927d */ NULL, +/* 927e */ NULL, +/* 927f */ NULL, +/* 9280 */ NULL, +/* 9281 */ NULL, +/* 9282 */ NULL, +/* 9283 */ NULL, +/* 9284 */ NULL, +/* 9285 */ NULL, +/* 9286 */ NULL, +/* 9287 */ NULL, +/* 9288 */ NULL, +/* 9289 */ NULL, +/* 928a */ NULL, +/* 928b */ NULL, +/* 928c */ NULL, +/* 928d */ NULL, +/* 928e */ NULL, +/* 928f */ NULL, +/* 9290 */ NULL, +/* 9291 */ NULL, +/* 9292 */ NULL, +/* 9293 */ NULL, +/* 9294 */ NULL, +/* 9295 */ NULL, +/* 9296 */ NULL, +/* 9297 */ NULL, +/* 9298 */ NULL, +/* 9299 */ NULL, +/* 929a */ NULL, +/* 929b */ NULL, +/* 929c */ NULL, +/* 929d */ NULL, +/* 929e */ NULL, +/* 929f */ NULL, +/* 92a0 */ NULL, +/* 92a1 */ NULL, +/* 92a2 */ NULL, +/* 92a3 */ NULL, +/* 92a4 */ NULL, +/* 92a5 */ NULL, +/* 92a6 */ NULL, +/* 92a7 */ NULL, +/* 92a8 */ NULL, +/* 92a9 */ NULL, +/* 92aa */ NULL, +/* 92ab */ NULL, +/* 92ac */ NULL, +/* 92ad */ NULL, +/* 92ae */ NULL, +/* 92af */ NULL, +/* 92b0 */ NULL, +/* 92b1 */ NULL, +/* 92b2 */ NULL, +/* 92b3 */ NULL, +/* 92b4 */ NULL, +/* 92b5 */ NULL, +/* 92b6 */ NULL, +/* 92b7 */ NULL, +/* 92b8 */ NULL, +/* 92b9 */ NULL, +/* 92ba */ NULL, +/* 92bb */ NULL, +/* 92bc */ NULL, +/* 92bd */ NULL, +/* 92be */ NULL, +/* 92bf */ NULL, +/* 92c0 */ NULL, +/* 92c1 */ NULL, +/* 92c2 */ NULL, +/* 92c3 */ NULL, +/* 92c4 */ NULL, +/* 92c5 */ NULL, +/* 92c6 */ NULL, +/* 92c7 */ NULL, +/* 92c8 */ NULL, +/* 92c9 */ NULL, +/* 92ca */ NULL, +/* 92cb */ NULL, +/* 92cc */ NULL, +/* 92cd */ NULL, +/* 92ce */ NULL, +/* 92cf */ NULL, +/* 92d0 */ NULL, +/* 92d1 */ NULL, +/* 92d2 */ NULL, +/* 92d3 */ NULL, +/* 92d4 */ NULL, +/* 92d5 */ NULL, +/* 92d6 */ NULL, +/* 92d7 */ NULL, +/* 92d8 */ NULL, +/* 92d9 */ NULL, +/* 92da */ NULL, +/* 92db */ NULL, +/* 92dc */ NULL, +/* 92dd */ NULL, +/* 92de */ NULL, +/* 92df */ NULL, +/* 92e0 */ NULL, +/* 92e1 */ NULL, +/* 92e2 */ NULL, +/* 92e3 */ NULL, +/* 92e4 */ NULL, +/* 92e5 */ NULL, +/* 92e6 */ NULL, +/* 92e7 */ NULL, +/* 92e8 */ NULL, +/* 92e9 */ NULL, +/* 92ea */ NULL, +/* 92eb */ NULL, +/* 92ec */ NULL, +/* 92ed */ NULL, +/* 92ee */ NULL, +/* 92ef */ NULL, +/* 92f0 */ NULL, +/* 92f1 */ NULL, +/* 92f2 */ NULL, +/* 92f3 */ NULL, +/* 92f4 */ NULL, +/* 92f5 */ NULL, +/* 92f6 */ NULL, +/* 92f7 */ NULL, +/* 92f8 */ NULL, +/* 92f9 */ NULL, +/* 92fa */ NULL, +/* 92fb */ NULL, +/* 92fc */ NULL, +/* 92fd */ NULL, +/* 92fe */ NULL, +/* 92ff */ NULL, +/* 9300 */ NULL, +/* 9301 */ NULL, +/* 9302 */ NULL, +/* 9303 */ NULL, +/* 9304 */ NULL, +/* 9305 */ NULL, +/* 9306 */ NULL, +/* 9307 */ NULL, +/* 9308 */ NULL, +/* 9309 */ NULL, +/* 930a */ NULL, +/* 930b */ NULL, +/* 930c */ NULL, +/* 930d */ NULL, +/* 930e */ NULL, +/* 930f */ NULL, +/* 9310 */ NULL, +/* 9311 */ NULL, +/* 9312 */ NULL, +/* 9313 */ NULL, +/* 9314 */ NULL, +/* 9315 */ NULL, +/* 9316 */ NULL, +/* 9317 */ NULL, +/* 9318 */ NULL, +/* 9319 */ NULL, +/* 931a */ NULL, +/* 931b */ NULL, +/* 931c */ NULL, +/* 931d */ NULL, +/* 931e */ NULL, +/* 931f */ NULL, +/* 9320 */ NULL, +/* 9321 */ NULL, +/* 9322 */ NULL, +/* 9323 */ NULL, +/* 9324 */ NULL, +/* 9325 */ NULL, +/* 9326 */ NULL, +/* 9327 */ NULL, +/* 9328 */ NULL, +/* 9329 */ NULL, +/* 932a */ NULL, +/* 932b */ NULL, +/* 932c */ NULL, +/* 932d */ NULL, +/* 932e */ NULL, +/* 932f */ NULL, +/* 9330 */ NULL, +/* 9331 */ NULL, +/* 9332 */ NULL, +/* 9333 */ NULL, +/* 9334 */ NULL, +/* 9335 */ NULL, +/* 9336 */ NULL, +/* 9337 */ NULL, +/* 9338 */ NULL, +/* 9339 */ NULL, +/* 933a */ NULL, +/* 933b */ NULL, +/* 933c */ NULL, +/* 933d */ NULL, +/* 933e */ NULL, +/* 933f */ NULL, +/* 9340 */ NULL, +/* 9341 */ NULL, +/* 9342 */ NULL, +/* 9343 */ NULL, +/* 9344 */ NULL, +/* 9345 */ NULL, +/* 9346 */ NULL, +/* 9347 */ NULL, +/* 9348 */ NULL, +/* 9349 */ NULL, +/* 934a */ NULL, +/* 934b */ NULL, +/* 934c */ NULL, +/* 934d */ NULL, +/* 934e */ NULL, +/* 934f */ NULL, +/* 9350 */ NULL, +/* 9351 */ NULL, +/* 9352 */ NULL, +/* 9353 */ NULL, +/* 9354 */ NULL, +/* 9355 */ NULL, +/* 9356 */ NULL, +/* 9357 */ NULL, +/* 9358 */ NULL, +/* 9359 */ NULL, +/* 935a */ NULL, +/* 935b */ NULL, +/* 935c */ NULL, +/* 935d */ NULL, +/* 935e */ NULL, +/* 935f */ NULL, +/* 9360 */ NULL, +/* 9361 */ NULL, +/* 9362 */ NULL, +/* 9363 */ NULL, +/* 9364 */ NULL, +/* 9365 */ NULL, +/* 9366 */ NULL, +/* 9367 */ NULL, +/* 9368 */ NULL, +/* 9369 */ NULL, +/* 936a */ NULL, +/* 936b */ NULL, +/* 936c */ NULL, +/* 936d */ NULL, +/* 936e */ NULL, +/* 936f */ NULL, +/* 9370 */ NULL, +/* 9371 */ NULL, +/* 9372 */ NULL, +/* 9373 */ NULL, +/* 9374 */ NULL, +/* 9375 */ NULL, +/* 9376 */ NULL, +/* 9377 */ NULL, +/* 9378 */ NULL, +/* 9379 */ NULL, +/* 937a */ NULL, +/* 937b */ NULL, +/* 937c */ NULL, +/* 937d */ NULL, +/* 937e */ NULL, +/* 937f */ NULL, +/* 9380 */ NULL, +/* 9381 */ NULL, +/* 9382 */ NULL, +/* 9383 */ NULL, +/* 9384 */ NULL, +/* 9385 */ NULL, +/* 9386 */ NULL, +/* 9387 */ NULL, +/* 9388 */ NULL, +/* 9389 */ NULL, +/* 938a */ NULL, +/* 938b */ NULL, +/* 938c */ NULL, +/* 938d */ NULL, +/* 938e */ NULL, +/* 938f */ NULL, +/* 9390 */ NULL, +/* 9391 */ NULL, +/* 9392 */ NULL, +/* 9393 */ NULL, +/* 9394 */ NULL, +/* 9395 */ NULL, +/* 9396 */ NULL, +/* 9397 */ NULL, +/* 9398 */ NULL, +/* 9399 */ NULL, +/* 939a */ NULL, +/* 939b */ NULL, +/* 939c */ NULL, +/* 939d */ NULL, +/* 939e */ NULL, +/* 939f */ NULL, +/* 93a0 */ NULL, +/* 93a1 */ NULL, +/* 93a2 */ NULL, +/* 93a3 */ NULL, +/* 93a4 */ NULL, +/* 93a5 */ NULL, +/* 93a6 */ NULL, +/* 93a7 */ NULL, +/* 93a8 */ NULL, +/* 93a9 */ NULL, +/* 93aa */ NULL, +/* 93ab */ NULL, +/* 93ac */ NULL, +/* 93ad */ NULL, +/* 93ae */ NULL, +/* 93af */ NULL, +/* 93b0 */ NULL, +/* 93b1 */ NULL, +/* 93b2 */ NULL, +/* 93b3 */ NULL, +/* 93b4 */ NULL, +/* 93b5 */ NULL, +/* 93b6 */ NULL, +/* 93b7 */ NULL, +/* 93b8 */ NULL, +/* 93b9 */ NULL, +/* 93ba */ NULL, +/* 93bb */ NULL, +/* 93bc */ NULL, +/* 93bd */ NULL, +/* 93be */ NULL, +/* 93bf */ NULL, +/* 93c0 */ NULL, +/* 93c1 */ NULL, +/* 93c2 */ NULL, +/* 93c3 */ NULL, +/* 93c4 */ NULL, +/* 93c5 */ NULL, +/* 93c6 */ NULL, +/* 93c7 */ NULL, +/* 93c8 */ NULL, +/* 93c9 */ NULL, +/* 93ca */ NULL, +/* 93cb */ NULL, +/* 93cc */ NULL, +/* 93cd */ NULL, +/* 93ce */ NULL, +/* 93cf */ NULL, +/* 93d0 */ NULL, +/* 93d1 */ NULL, +/* 93d2 */ NULL, +/* 93d3 */ NULL, +/* 93d4 */ NULL, +/* 93d5 */ NULL, +/* 93d6 */ NULL, +/* 93d7 */ NULL, +/* 93d8 */ NULL, +/* 93d9 */ NULL, +/* 93da */ NULL, +/* 93db */ NULL, +/* 93dc */ NULL, +/* 93dd */ NULL, +/* 93de */ NULL, +/* 93df */ NULL, +/* 93e0 */ NULL, +/* 93e1 */ NULL, +/* 93e2 */ NULL, +/* 93e3 */ NULL, +/* 93e4 */ NULL, +/* 93e5 */ NULL, +/* 93e6 */ NULL, +/* 93e7 */ NULL, +/* 93e8 */ NULL, +/* 93e9 */ NULL, +/* 93ea */ NULL, +/* 93eb */ NULL, +/* 93ec */ NULL, +/* 93ed */ NULL, +/* 93ee */ NULL, +/* 93ef */ NULL, +/* 93f0 */ NULL, +/* 93f1 */ NULL, +/* 93f2 */ NULL, +/* 93f3 */ NULL, +/* 93f4 */ NULL, +/* 93f5 */ NULL, +/* 93f6 */ NULL, +/* 93f7 */ NULL, +/* 93f8 */ NULL, +/* 93f9 */ NULL, +/* 93fa */ NULL, +/* 93fb */ NULL, +/* 93fc */ NULL, +/* 93fd */ NULL, +/* 93fe */ NULL, +/* 93ff */ NULL, +/* 9400 */ NULL, +/* 9401 */ NULL, +/* 9402 */ NULL, +/* 9403 */ NULL, +/* 9404 */ NULL, +/* 9405 */ NULL, +/* 9406 */ NULL, +/* 9407 */ NULL, +/* 9408 */ NULL, +/* 9409 */ NULL, +/* 940a */ NULL, +/* 940b */ NULL, +/* 940c */ NULL, +/* 940d */ NULL, +/* 940e */ NULL, +/* 940f */ NULL, +/* 9410 */ NULL, +/* 9411 */ NULL, +/* 9412 */ NULL, +/* 9413 */ NULL, +/* 9414 */ NULL, +/* 9415 */ NULL, +/* 9416 */ NULL, +/* 9417 */ NULL, +/* 9418 */ NULL, +/* 9419 */ NULL, +/* 941a */ NULL, +/* 941b */ NULL, +/* 941c */ NULL, +/* 941d */ NULL, +/* 941e */ NULL, +/* 941f */ NULL, +/* 9420 */ NULL, +/* 9421 */ NULL, +/* 9422 */ NULL, +/* 9423 */ NULL, +/* 9424 */ NULL, +/* 9425 */ NULL, +/* 9426 */ NULL, +/* 9427 */ NULL, +/* 9428 */ NULL, +/* 9429 */ NULL, +/* 942a */ NULL, +/* 942b */ NULL, +/* 942c */ NULL, +/* 942d */ NULL, +/* 942e */ NULL, +/* 942f */ NULL, +/* 9430 */ NULL, +/* 9431 */ NULL, +/* 9432 */ NULL, +/* 9433 */ NULL, +/* 9434 */ NULL, +/* 9435 */ NULL, +/* 9436 */ NULL, +/* 9437 */ NULL, +/* 9438 */ NULL, +/* 9439 */ NULL, +/* 943a */ NULL, +/* 943b */ NULL, +/* 943c */ NULL, +/* 943d */ NULL, +/* 943e */ NULL, +/* 943f */ NULL, +/* 9440 */ NULL, +/* 9441 */ NULL, +/* 9442 */ NULL, +/* 9443 */ NULL, +/* 9444 */ NULL, +/* 9445 */ NULL, +/* 9446 */ NULL, +/* 9447 */ NULL, +/* 9448 */ NULL, +/* 9449 */ NULL, +/* 944a */ NULL, +/* 944b */ NULL, +/* 944c */ NULL, +/* 944d */ NULL, +/* 944e */ NULL, +/* 944f */ NULL, +/* 9450 */ NULL, +/* 9451 */ NULL, +/* 9452 */ NULL, +/* 9453 */ NULL, +/* 9454 */ NULL, +/* 9455 */ NULL, +/* 9456 */ NULL, +/* 9457 */ NULL, +/* 9458 */ NULL, +/* 9459 */ NULL, +/* 945a */ NULL, +/* 945b */ NULL, +/* 945c */ NULL, +/* 945d */ NULL, +/* 945e */ NULL, +/* 945f */ NULL, +/* 9460 */ NULL, +/* 9461 */ NULL, +/* 9462 */ NULL, +/* 9463 */ NULL, +/* 9464 */ NULL, +/* 9465 */ NULL, +/* 9466 */ NULL, +/* 9467 */ NULL, +/* 9468 */ NULL, +/* 9469 */ NULL, +/* 946a */ NULL, +/* 946b */ NULL, +/* 946c */ NULL, +/* 946d */ NULL, +/* 946e */ NULL, +/* 946f */ NULL, +/* 9470 */ NULL, +/* 9471 */ NULL, +/* 9472 */ NULL, +/* 9473 */ NULL, +/* 9474 */ NULL, +/* 9475 */ NULL, +/* 9476 */ NULL, +/* 9477 */ NULL, +/* 9478 */ NULL, +/* 9479 */ NULL, +/* 947a */ NULL, +/* 947b */ NULL, +/* 947c */ NULL, +/* 947d */ NULL, +/* 947e */ NULL, +/* 947f */ NULL, +/* 9480 */ NULL, +/* 9481 */ NULL, +/* 9482 */ NULL, +/* 9483 */ NULL, +/* 9484 */ NULL, +/* 9485 */ NULL, +/* 9486 */ NULL, +/* 9487 */ NULL, +/* 9488 */ NULL, +/* 9489 */ NULL, +/* 948a */ NULL, +/* 948b */ NULL, +/* 948c */ NULL, +/* 948d */ NULL, +/* 948e */ NULL, +/* 948f */ NULL, +/* 9490 */ NULL, +/* 9491 */ NULL, +/* 9492 */ NULL, +/* 9493 */ NULL, +/* 9494 */ NULL, +/* 9495 */ NULL, +/* 9496 */ NULL, +/* 9497 */ NULL, +/* 9498 */ NULL, +/* 9499 */ NULL, +/* 949a */ NULL, +/* 949b */ NULL, +/* 949c */ NULL, +/* 949d */ NULL, +/* 949e */ NULL, +/* 949f */ NULL, +/* 94a0 */ NULL, +/* 94a1 */ NULL, +/* 94a2 */ NULL, +/* 94a3 */ NULL, +/* 94a4 */ NULL, +/* 94a5 */ NULL, +/* 94a6 */ NULL, +/* 94a7 */ NULL, +/* 94a8 */ NULL, +/* 94a9 */ NULL, +/* 94aa */ NULL, +/* 94ab */ NULL, +/* 94ac */ NULL, +/* 94ad */ NULL, +/* 94ae */ NULL, +/* 94af */ NULL, +/* 94b0 */ NULL, +/* 94b1 */ NULL, +/* 94b2 */ NULL, +/* 94b3 */ NULL, +/* 94b4 */ NULL, +/* 94b5 */ NULL, +/* 94b6 */ NULL, +/* 94b7 */ NULL, +/* 94b8 */ NULL, +/* 94b9 */ NULL, +/* 94ba */ NULL, +/* 94bb */ NULL, +/* 94bc */ NULL, +/* 94bd */ NULL, +/* 94be */ NULL, +/* 94bf */ NULL, +/* 94c0 */ NULL, +/* 94c1 */ NULL, +/* 94c2 */ NULL, +/* 94c3 */ NULL, +/* 94c4 */ NULL, +/* 94c5 */ NULL, +/* 94c6 */ NULL, +/* 94c7 */ NULL, +/* 94c8 */ NULL, +/* 94c9 */ NULL, +/* 94ca */ NULL, +/* 94cb */ NULL, +/* 94cc */ NULL, +/* 94cd */ NULL, +/* 94ce */ NULL, +/* 94cf */ NULL, +/* 94d0 */ NULL, +/* 94d1 */ NULL, +/* 94d2 */ NULL, +/* 94d3 */ NULL, +/* 94d4 */ NULL, +/* 94d5 */ NULL, +/* 94d6 */ NULL, +/* 94d7 */ NULL, +/* 94d8 */ NULL, +/* 94d9 */ NULL, +/* 94da */ NULL, +/* 94db */ NULL, +/* 94dc */ NULL, +/* 94dd */ NULL, +/* 94de */ NULL, +/* 94df */ NULL, +/* 94e0 */ NULL, +/* 94e1 */ NULL, +/* 94e2 */ NULL, +/* 94e3 */ NULL, +/* 94e4 */ NULL, +/* 94e5 */ NULL, +/* 94e6 */ NULL, +/* 94e7 */ NULL, +/* 94e8 */ NULL, +/* 94e9 */ NULL, +/* 94ea */ NULL, +/* 94eb */ NULL, +/* 94ec */ NULL, +/* 94ed */ NULL, +/* 94ee */ NULL, +/* 94ef */ NULL, +/* 94f0 */ NULL, +/* 94f1 */ NULL, +/* 94f2 */ NULL, +/* 94f3 */ NULL, +/* 94f4 */ NULL, +/* 94f5 */ NULL, +/* 94f6 */ NULL, +/* 94f7 */ NULL, +/* 94f8 */ NULL, +/* 94f9 */ NULL, +/* 94fa */ NULL, +/* 94fb */ NULL, +/* 94fc */ NULL, +/* 94fd */ NULL, +/* 94fe */ NULL, +/* 94ff */ NULL, +/* 9500 */ NULL, +/* 9501 */ NULL, +/* 9502 */ NULL, +/* 9503 */ NULL, +/* 9504 */ NULL, +/* 9505 */ NULL, +/* 9506 */ NULL, +/* 9507 */ NULL, +/* 9508 */ NULL, +/* 9509 */ NULL, +/* 950a */ NULL, +/* 950b */ NULL, +/* 950c */ NULL, +/* 950d */ NULL, +/* 950e */ NULL, +/* 950f */ NULL, +/* 9510 */ NULL, +/* 9511 */ NULL, +/* 9512 */ NULL, +/* 9513 */ NULL, +/* 9514 */ NULL, +/* 9515 */ NULL, +/* 9516 */ NULL, +/* 9517 */ NULL, +/* 9518 */ NULL, +/* 9519 */ NULL, +/* 951a */ NULL, +/* 951b */ NULL, +/* 951c */ NULL, +/* 951d */ NULL, +/* 951e */ NULL, +/* 951f */ NULL, +/* 9520 */ NULL, +/* 9521 */ NULL, +/* 9522 */ NULL, +/* 9523 */ NULL, +/* 9524 */ NULL, +/* 9525 */ NULL, +/* 9526 */ NULL, +/* 9527 */ NULL, +/* 9528 */ NULL, +/* 9529 */ NULL, +/* 952a */ NULL, +/* 952b */ NULL, +/* 952c */ NULL, +/* 952d */ NULL, +/* 952e */ NULL, +/* 952f */ NULL, +/* 9530 */ NULL, +/* 9531 */ NULL, +/* 9532 */ NULL, +/* 9533 */ NULL, +/* 9534 */ NULL, +/* 9535 */ NULL, +/* 9536 */ NULL, +/* 9537 */ NULL, +/* 9538 */ NULL, +/* 9539 */ NULL, +/* 953a */ NULL, +/* 953b */ NULL, +/* 953c */ NULL, +/* 953d */ NULL, +/* 953e */ NULL, +/* 953f */ NULL, +/* 9540 */ NULL, +/* 9541 */ NULL, +/* 9542 */ NULL, +/* 9543 */ NULL, +/* 9544 */ NULL, +/* 9545 */ NULL, +/* 9546 */ NULL, +/* 9547 */ NULL, +/* 9548 */ NULL, +/* 9549 */ NULL, +/* 954a */ NULL, +/* 954b */ NULL, +/* 954c */ NULL, +/* 954d */ NULL, +/* 954e */ NULL, +/* 954f */ NULL, +/* 9550 */ NULL, +/* 9551 */ NULL, +/* 9552 */ NULL, +/* 9553 */ NULL, +/* 9554 */ NULL, +/* 9555 */ NULL, +/* 9556 */ NULL, +/* 9557 */ NULL, +/* 9558 */ NULL, +/* 9559 */ NULL, +/* 955a */ NULL, +/* 955b */ NULL, +/* 955c */ NULL, +/* 955d */ NULL, +/* 955e */ NULL, +/* 955f */ NULL, +/* 9560 */ NULL, +/* 9561 */ NULL, +/* 9562 */ NULL, +/* 9563 */ NULL, +/* 9564 */ NULL, +/* 9565 */ NULL, +/* 9566 */ NULL, +/* 9567 */ NULL, +/* 9568 */ NULL, +/* 9569 */ NULL, +/* 956a */ NULL, +/* 956b */ NULL, +/* 956c */ NULL, +/* 956d */ NULL, +/* 956e */ NULL, +/* 956f */ NULL, +/* 9570 */ NULL, +/* 9571 */ NULL, +/* 9572 */ NULL, +/* 9573 */ NULL, +/* 9574 */ NULL, +/* 9575 */ NULL, +/* 9576 */ NULL, +/* 9577 */ NULL, +/* 9578 */ NULL, +/* 9579 */ NULL, +/* 957a */ NULL, +/* 957b */ NULL, +/* 957c */ NULL, +/* 957d */ NULL, +/* 957e */ NULL, +/* 957f */ NULL, +/* 9580 */ NULL, +/* 9581 */ NULL, +/* 9582 */ NULL, +/* 9583 */ NULL, +/* 9584 */ NULL, +/* 9585 */ NULL, +/* 9586 */ NULL, +/* 9587 */ NULL, +/* 9588 */ NULL, +/* 9589 */ NULL, +/* 958a */ NULL, +/* 958b */ NULL, +/* 958c */ NULL, +/* 958d */ NULL, +/* 958e */ NULL, +/* 958f */ NULL, +/* 9590 */ NULL, +/* 9591 */ NULL, +/* 9592 */ NULL, +/* 9593 */ NULL, +/* 9594 */ NULL, +/* 9595 */ NULL, +/* 9596 */ NULL, +/* 9597 */ NULL, +/* 9598 */ NULL, +/* 9599 */ NULL, +/* 959a */ NULL, +/* 959b */ NULL, +/* 959c */ NULL, +/* 959d */ NULL, +/* 959e */ NULL, +/* 959f */ NULL, +/* 95a0 */ NULL, +/* 95a1 */ NULL, +/* 95a2 */ NULL, +/* 95a3 */ NULL, +/* 95a4 */ NULL, +/* 95a5 */ NULL, +/* 95a6 */ NULL, +/* 95a7 */ NULL, +/* 95a8 */ NULL, +/* 95a9 */ NULL, +/* 95aa */ NULL, +/* 95ab */ NULL, +/* 95ac */ NULL, +/* 95ad */ NULL, +/* 95ae */ NULL, +/* 95af */ NULL, +/* 95b0 */ NULL, +/* 95b1 */ NULL, +/* 95b2 */ NULL, +/* 95b3 */ NULL, +/* 95b4 */ NULL, +/* 95b5 */ NULL, +/* 95b6 */ NULL, +/* 95b7 */ NULL, +/* 95b8 */ NULL, +/* 95b9 */ NULL, +/* 95ba */ NULL, +/* 95bb */ NULL, +/* 95bc */ NULL, +/* 95bd */ NULL, +/* 95be */ NULL, +/* 95bf */ NULL, +/* 95c0 */ NULL, +/* 95c1 */ NULL, +/* 95c2 */ NULL, +/* 95c3 */ NULL, +/* 95c4 */ NULL, +/* 95c5 */ NULL, +/* 95c6 */ NULL, +/* 95c7 */ NULL, +/* 95c8 */ NULL, +/* 95c9 */ NULL, +/* 95ca */ NULL, +/* 95cb */ NULL, +/* 95cc */ NULL, +/* 95cd */ NULL, +/* 95ce */ NULL, +/* 95cf */ NULL, +/* 95d0 */ NULL, +/* 95d1 */ NULL, +/* 95d2 */ NULL, +/* 95d3 */ NULL, +/* 95d4 */ NULL, +/* 95d5 */ NULL, +/* 95d6 */ NULL, +/* 95d7 */ NULL, +/* 95d8 */ NULL, +/* 95d9 */ NULL, +/* 95da */ NULL, +/* 95db */ NULL, +/* 95dc */ NULL, +/* 95dd */ NULL, +/* 95de */ NULL, +/* 95df */ NULL, +/* 95e0 */ NULL, +/* 95e1 */ NULL, +/* 95e2 */ NULL, +/* 95e3 */ NULL, +/* 95e4 */ NULL, +/* 95e5 */ NULL, +/* 95e6 */ NULL, +/* 95e7 */ NULL, +/* 95e8 */ NULL, +/* 95e9 */ NULL, +/* 95ea */ NULL, +/* 95eb */ NULL, +/* 95ec */ NULL, +/* 95ed */ NULL, +/* 95ee */ NULL, +/* 95ef */ NULL, +/* 95f0 */ NULL, +/* 95f1 */ NULL, +/* 95f2 */ NULL, +/* 95f3 */ NULL, +/* 95f4 */ NULL, +/* 95f5 */ NULL, +/* 95f6 */ NULL, +/* 95f7 */ NULL, +/* 95f8 */ NULL, +/* 95f9 */ NULL, +/* 95fa */ NULL, +/* 95fb */ NULL, +/* 95fc */ NULL, +/* 95fd */ NULL, +/* 95fe */ NULL, +/* 95ff */ NULL, +/* 9600 */ NULL, +/* 9601 */ NULL, +/* 9602 */ NULL, +/* 9603 */ NULL, +/* 9604 */ NULL, +/* 9605 */ NULL, +/* 9606 */ NULL, +/* 9607 */ NULL, +/* 9608 */ NULL, +/* 9609 */ NULL, +/* 960a */ NULL, +/* 960b */ NULL, +/* 960c */ NULL, +/* 960d */ NULL, +/* 960e */ NULL, +/* 960f */ NULL, +/* 9610 */ NULL, +/* 9611 */ NULL, +/* 9612 */ NULL, +/* 9613 */ NULL, +/* 9614 */ NULL, +/* 9615 */ NULL, +/* 9616 */ NULL, +/* 9617 */ NULL, +/* 9618 */ NULL, +/* 9619 */ NULL, +/* 961a */ NULL, +/* 961b */ NULL, +/* 961c */ NULL, +/* 961d */ NULL, +/* 961e */ NULL, +/* 961f */ NULL, +/* 9620 */ NULL, +/* 9621 */ NULL, +/* 9622 */ NULL, +/* 9623 */ NULL, +/* 9624 */ NULL, +/* 9625 */ NULL, +/* 9626 */ NULL, +/* 9627 */ NULL, +/* 9628 */ NULL, +/* 9629 */ NULL, +/* 962a */ NULL, +/* 962b */ NULL, +/* 962c */ NULL, +/* 962d */ NULL, +/* 962e */ NULL, +/* 962f */ NULL, +/* 9630 */ NULL, +/* 9631 */ NULL, +/* 9632 */ NULL, +/* 9633 */ NULL, +/* 9634 */ NULL, +/* 9635 */ NULL, +/* 9636 */ NULL, +/* 9637 */ NULL, +/* 9638 */ NULL, +/* 9639 */ NULL, +/* 963a */ NULL, +/* 963b */ NULL, +/* 963c */ NULL, +/* 963d */ NULL, +/* 963e */ NULL, +/* 963f */ NULL, +/* 9640 */ NULL, +/* 9641 */ NULL, +/* 9642 */ NULL, +/* 9643 */ NULL, +/* 9644 */ NULL, +/* 9645 */ NULL, +/* 9646 */ NULL, +/* 9647 */ NULL, +/* 9648 */ NULL, +/* 9649 */ NULL, +/* 964a */ NULL, +/* 964b */ NULL, +/* 964c */ NULL, +/* 964d */ NULL, +/* 964e */ NULL, +/* 964f */ NULL, +/* 9650 */ NULL, +/* 9651 */ NULL, +/* 9652 */ NULL, +/* 9653 */ NULL, +/* 9654 */ NULL, +/* 9655 */ NULL, +/* 9656 */ NULL, +/* 9657 */ NULL, +/* 9658 */ NULL, +/* 9659 */ NULL, +/* 965a */ NULL, +/* 965b */ NULL, +/* 965c */ NULL, +/* 965d */ NULL, +/* 965e */ NULL, +/* 965f */ NULL, +/* 9660 */ NULL, +/* 9661 */ NULL, +/* 9662 */ NULL, +/* 9663 */ NULL, +/* 9664 */ NULL, +/* 9665 */ NULL, +/* 9666 */ NULL, +/* 9667 */ NULL, +/* 9668 */ NULL, +/* 9669 */ NULL, +/* 966a */ NULL, +/* 966b */ NULL, +/* 966c */ NULL, +/* 966d */ NULL, +/* 966e */ NULL, +/* 966f */ NULL, +/* 9670 */ NULL, +/* 9671 */ NULL, +/* 9672 */ NULL, +/* 9673 */ NULL, +/* 9674 */ NULL, +/* 9675 */ NULL, +/* 9676 */ NULL, +/* 9677 */ NULL, +/* 9678 */ NULL, +/* 9679 */ NULL, +/* 967a */ NULL, +/* 967b */ NULL, +/* 967c */ NULL, +/* 967d */ NULL, +/* 967e */ NULL, +/* 967f */ NULL, +/* 9680 */ NULL, +/* 9681 */ NULL, +/* 9682 */ NULL, +/* 9683 */ NULL, +/* 9684 */ NULL, +/* 9685 */ NULL, +/* 9686 */ NULL, +/* 9687 */ NULL, +/* 9688 */ NULL, +/* 9689 */ NULL, +/* 968a */ NULL, +/* 968b */ NULL, +/* 968c */ NULL, +/* 968d */ NULL, +/* 968e */ NULL, +/* 968f */ NULL, +/* 9690 */ NULL, +/* 9691 */ NULL, +/* 9692 */ NULL, +/* 9693 */ NULL, +/* 9694 */ NULL, +/* 9695 */ NULL, +/* 9696 */ NULL, +/* 9697 */ NULL, +/* 9698 */ NULL, +/* 9699 */ NULL, +/* 969a */ NULL, +/* 969b */ NULL, +/* 969c */ NULL, +/* 969d */ NULL, +/* 969e */ NULL, +/* 969f */ NULL, +/* 96a0 */ NULL, +/* 96a1 */ NULL, +/* 96a2 */ NULL, +/* 96a3 */ NULL, +/* 96a4 */ NULL, +/* 96a5 */ NULL, +/* 96a6 */ NULL, +/* 96a7 */ NULL, +/* 96a8 */ NULL, +/* 96a9 */ NULL, +/* 96aa */ NULL, +/* 96ab */ NULL, +/* 96ac */ NULL, +/* 96ad */ NULL, +/* 96ae */ NULL, +/* 96af */ NULL, +/* 96b0 */ NULL, +/* 96b1 */ NULL, +/* 96b2 */ NULL, +/* 96b3 */ NULL, +/* 96b4 */ NULL, +/* 96b5 */ NULL, +/* 96b6 */ NULL, +/* 96b7 */ NULL, +/* 96b8 */ NULL, +/* 96b9 */ NULL, +/* 96ba */ NULL, +/* 96bb */ NULL, +/* 96bc */ NULL, +/* 96bd */ NULL, +/* 96be */ NULL, +/* 96bf */ NULL, +/* 96c0 */ NULL, +/* 96c1 */ NULL, +/* 96c2 */ NULL, +/* 96c3 */ NULL, +/* 96c4 */ NULL, +/* 96c5 */ NULL, +/* 96c6 */ NULL, +/* 96c7 */ NULL, +/* 96c8 */ NULL, +/* 96c9 */ NULL, +/* 96ca */ NULL, +/* 96cb */ NULL, +/* 96cc */ NULL, +/* 96cd */ NULL, +/* 96ce */ NULL, +/* 96cf */ NULL, +/* 96d0 */ NULL, +/* 96d1 */ NULL, +/* 96d2 */ NULL, +/* 96d3 */ NULL, +/* 96d4 */ NULL, +/* 96d5 */ NULL, +/* 96d6 */ NULL, +/* 96d7 */ NULL, +/* 96d8 */ NULL, +/* 96d9 */ NULL, +/* 96da */ NULL, +/* 96db */ NULL, +/* 96dc */ NULL, +/* 96dd */ NULL, +/* 96de */ NULL, +/* 96df */ NULL, +/* 96e0 */ NULL, +/* 96e1 */ NULL, +/* 96e2 */ NULL, +/* 96e3 */ NULL, +/* 96e4 */ NULL, +/* 96e5 */ NULL, +/* 96e6 */ NULL, +/* 96e7 */ NULL, +/* 96e8 */ NULL, +/* 96e9 */ NULL, +/* 96ea */ NULL, +/* 96eb */ NULL, +/* 96ec */ NULL, +/* 96ed */ NULL, +/* 96ee */ NULL, +/* 96ef */ NULL, +/* 96f0 */ NULL, +/* 96f1 */ NULL, +/* 96f2 */ NULL, +/* 96f3 */ NULL, +/* 96f4 */ NULL, +/* 96f5 */ NULL, +/* 96f6 */ NULL, +/* 96f7 */ NULL, +/* 96f8 */ NULL, +/* 96f9 */ NULL, +/* 96fa */ NULL, +/* 96fb */ NULL, +/* 96fc */ NULL, +/* 96fd */ NULL, +/* 96fe */ NULL, +/* 96ff */ NULL, +/* 9700 */ NULL, +/* 9701 */ NULL, +/* 9702 */ NULL, +/* 9703 */ NULL, +/* 9704 */ NULL, +/* 9705 */ NULL, +/* 9706 */ NULL, +/* 9707 */ NULL, +/* 9708 */ NULL, +/* 9709 */ NULL, +/* 970a */ NULL, +/* 970b */ NULL, +/* 970c */ NULL, +/* 970d */ NULL, +/* 970e */ NULL, +/* 970f */ NULL, +/* 9710 */ NULL, +/* 9711 */ NULL, +/* 9712 */ NULL, +/* 9713 */ NULL, +/* 9714 */ NULL, +/* 9715 */ NULL, +/* 9716 */ NULL, +/* 9717 */ NULL, +/* 9718 */ NULL, +/* 9719 */ NULL, +/* 971a */ NULL, +/* 971b */ NULL, +/* 971c */ NULL, +/* 971d */ NULL, +/* 971e */ NULL, +/* 971f */ NULL, +/* 9720 */ NULL, +/* 9721 */ NULL, +/* 9722 */ NULL, +/* 9723 */ NULL, +/* 9724 */ NULL, +/* 9725 */ NULL, +/* 9726 */ NULL, +/* 9727 */ NULL, +/* 9728 */ NULL, +/* 9729 */ NULL, +/* 972a */ NULL, +/* 972b */ NULL, +/* 972c */ NULL, +/* 972d */ NULL, +/* 972e */ NULL, +/* 972f */ NULL, +/* 9730 */ NULL, +/* 9731 */ NULL, +/* 9732 */ NULL, +/* 9733 */ NULL, +/* 9734 */ NULL, +/* 9735 */ NULL, +/* 9736 */ NULL, +/* 9737 */ NULL, +/* 9738 */ NULL, +/* 9739 */ NULL, +/* 973a */ NULL, +/* 973b */ NULL, +/* 973c */ NULL, +/* 973d */ NULL, +/* 973e */ NULL, +/* 973f */ NULL, +/* 9740 */ NULL, +/* 9741 */ NULL, +/* 9742 */ NULL, +/* 9743 */ NULL, +/* 9744 */ NULL, +/* 9745 */ NULL, +/* 9746 */ NULL, +/* 9747 */ NULL, +/* 9748 */ NULL, +/* 9749 */ NULL, +/* 974a */ NULL, +/* 974b */ NULL, +/* 974c */ NULL, +/* 974d */ NULL, +/* 974e */ NULL, +/* 974f */ NULL, +/* 9750 */ NULL, +/* 9751 */ NULL, +/* 9752 */ NULL, +/* 9753 */ NULL, +/* 9754 */ NULL, +/* 9755 */ NULL, +/* 9756 */ NULL, +/* 9757 */ NULL, +/* 9758 */ NULL, +/* 9759 */ NULL, +/* 975a */ NULL, +/* 975b */ NULL, +/* 975c */ NULL, +/* 975d */ NULL, +/* 975e */ NULL, +/* 975f */ NULL, +/* 9760 */ NULL, +/* 9761 */ NULL, +/* 9762 */ NULL, +/* 9763 */ NULL, +/* 9764 */ NULL, +/* 9765 */ NULL, +/* 9766 */ NULL, +/* 9767 */ NULL, +/* 9768 */ NULL, +/* 9769 */ NULL, +/* 976a */ NULL, +/* 976b */ NULL, +/* 976c */ NULL, +/* 976d */ NULL, +/* 976e */ NULL, +/* 976f */ NULL, +/* 9770 */ NULL, +/* 9771 */ NULL, +/* 9772 */ NULL, +/* 9773 */ NULL, +/* 9774 */ NULL, +/* 9775 */ NULL, +/* 9776 */ NULL, +/* 9777 */ NULL, +/* 9778 */ NULL, +/* 9779 */ NULL, +/* 977a */ NULL, +/* 977b */ NULL, +/* 977c */ NULL, +/* 977d */ NULL, +/* 977e */ NULL, +/* 977f */ NULL, +/* 9780 */ NULL, +/* 9781 */ NULL, +/* 9782 */ NULL, +/* 9783 */ NULL, +/* 9784 */ NULL, +/* 9785 */ NULL, +/* 9786 */ NULL, +/* 9787 */ NULL, +/* 9788 */ NULL, +/* 9789 */ NULL, +/* 978a */ NULL, +/* 978b */ NULL, +/* 978c */ NULL, +/* 978d */ NULL, +/* 978e */ NULL, +/* 978f */ NULL, +/* 9790 */ NULL, +/* 9791 */ NULL, +/* 9792 */ NULL, +/* 9793 */ NULL, +/* 9794 */ NULL, +/* 9795 */ NULL, +/* 9796 */ NULL, +/* 9797 */ NULL, +/* 9798 */ NULL, +/* 9799 */ NULL, +/* 979a */ NULL, +/* 979b */ NULL, +/* 979c */ NULL, +/* 979d */ NULL, +/* 979e */ NULL, +/* 979f */ NULL, +/* 97a0 */ NULL, +/* 97a1 */ NULL, +/* 97a2 */ NULL, +/* 97a3 */ NULL, +/* 97a4 */ NULL, +/* 97a5 */ NULL, +/* 97a6 */ NULL, +/* 97a7 */ NULL, +/* 97a8 */ NULL, +/* 97a9 */ NULL, +/* 97aa */ NULL, +/* 97ab */ NULL, +/* 97ac */ NULL, +/* 97ad */ NULL, +/* 97ae */ NULL, +/* 97af */ NULL, +/* 97b0 */ NULL, +/* 97b1 */ NULL, +/* 97b2 */ NULL, +/* 97b3 */ NULL, +/* 97b4 */ NULL, +/* 97b5 */ NULL, +/* 97b6 */ NULL, +/* 97b7 */ NULL, +/* 97b8 */ NULL, +/* 97b9 */ NULL, +/* 97ba */ NULL, +/* 97bb */ NULL, +/* 97bc */ NULL, +/* 97bd */ NULL, +/* 97be */ NULL, +/* 97bf */ NULL, +/* 97c0 */ NULL, +/* 97c1 */ NULL, +/* 97c2 */ NULL, +/* 97c3 */ NULL, +/* 97c4 */ NULL, +/* 97c5 */ NULL, +/* 97c6 */ NULL, +/* 97c7 */ NULL, +/* 97c8 */ NULL, +/* 97c9 */ NULL, +/* 97ca */ NULL, +/* 97cb */ NULL, +/* 97cc */ NULL, +/* 97cd */ NULL, +/* 97ce */ NULL, +/* 97cf */ NULL, +/* 97d0 */ NULL, +/* 97d1 */ NULL, +/* 97d2 */ NULL, +/* 97d3 */ NULL, +/* 97d4 */ NULL, +/* 97d5 */ NULL, +/* 97d6 */ NULL, +/* 97d7 */ NULL, +/* 97d8 */ NULL, +/* 97d9 */ NULL, +/* 97da */ NULL, +/* 97db */ NULL, +/* 97dc */ NULL, +/* 97dd */ NULL, +/* 97de */ NULL, +/* 97df */ NULL, +/* 97e0 */ NULL, +/* 97e1 */ NULL, +/* 97e2 */ NULL, +/* 97e3 */ NULL, +/* 97e4 */ NULL, +/* 97e5 */ NULL, +/* 97e6 */ NULL, +/* 97e7 */ NULL, +/* 97e8 */ NULL, +/* 97e9 */ NULL, +/* 97ea */ NULL, +/* 97eb */ NULL, +/* 97ec */ NULL, +/* 97ed */ NULL, +/* 97ee */ NULL, +/* 97ef */ NULL, +/* 97f0 */ NULL, +/* 97f1 */ NULL, +/* 97f2 */ NULL, +/* 97f3 */ NULL, +/* 97f4 */ NULL, +/* 97f5 */ NULL, +/* 97f6 */ NULL, +/* 97f7 */ NULL, +/* 97f8 */ NULL, +/* 97f9 */ NULL, +/* 97fa */ NULL, +/* 97fb */ NULL, +/* 97fc */ NULL, +/* 97fd */ NULL, +/* 97fe */ NULL, +/* 97ff */ NULL, +/* 9800 */ NULL, +/* 9801 */ NULL, +/* 9802 */ NULL, +/* 9803 */ NULL, +/* 9804 */ NULL, +/* 9805 */ NULL, +/* 9806 */ NULL, +/* 9807 */ NULL, +/* 9808 */ NULL, +/* 9809 */ NULL, +/* 980a */ NULL, +/* 980b */ NULL, +/* 980c */ NULL, +/* 980d */ NULL, +/* 980e */ NULL, +/* 980f */ NULL, +/* 9810 */ NULL, +/* 9811 */ NULL, +/* 9812 */ NULL, +/* 9813 */ NULL, +/* 9814 */ NULL, +/* 9815 */ NULL, +/* 9816 */ NULL, +/* 9817 */ NULL, +/* 9818 */ NULL, +/* 9819 */ NULL, +/* 981a */ NULL, +/* 981b */ NULL, +/* 981c */ NULL, +/* 981d */ NULL, +/* 981e */ NULL, +/* 981f */ NULL, +/* 9820 */ NULL, +/* 9821 */ NULL, +/* 9822 */ NULL, +/* 9823 */ NULL, +/* 9824 */ NULL, +/* 9825 */ NULL, +/* 9826 */ NULL, +/* 9827 */ NULL, +/* 9828 */ NULL, +/* 9829 */ NULL, +/* 982a */ NULL, +/* 982b */ NULL, +/* 982c */ NULL, +/* 982d */ NULL, +/* 982e */ NULL, +/* 982f */ NULL, +/* 9830 */ NULL, +/* 9831 */ NULL, +/* 9832 */ NULL, +/* 9833 */ NULL, +/* 9834 */ NULL, +/* 9835 */ NULL, +/* 9836 */ NULL, +/* 9837 */ NULL, +/* 9838 */ NULL, +/* 9839 */ NULL, +/* 983a */ NULL, +/* 983b */ NULL, +/* 983c */ NULL, +/* 983d */ NULL, +/* 983e */ NULL, +/* 983f */ NULL, +/* 9840 */ NULL, +/* 9841 */ NULL, +/* 9842 */ NULL, +/* 9843 */ NULL, +/* 9844 */ NULL, +/* 9845 */ NULL, +/* 9846 */ NULL, +/* 9847 */ NULL, +/* 9848 */ NULL, +/* 9849 */ NULL, +/* 984a */ NULL, +/* 984b */ NULL, +/* 984c */ NULL, +/* 984d */ NULL, +/* 984e */ NULL, +/* 984f */ NULL, +/* 9850 */ NULL, +/* 9851 */ NULL, +/* 9852 */ NULL, +/* 9853 */ NULL, +/* 9854 */ NULL, +/* 9855 */ NULL, +/* 9856 */ NULL, +/* 9857 */ NULL, +/* 9858 */ NULL, +/* 9859 */ NULL, +/* 985a */ NULL, +/* 985b */ NULL, +/* 985c */ NULL, +/* 985d */ NULL, +/* 985e */ NULL, +/* 985f */ NULL, +/* 9860 */ NULL, +/* 9861 */ NULL, +/* 9862 */ NULL, +/* 9863 */ NULL, +/* 9864 */ NULL, +/* 9865 */ NULL, +/* 9866 */ NULL, +/* 9867 */ NULL, +/* 9868 */ NULL, +/* 9869 */ NULL, +/* 986a */ NULL, +/* 986b */ NULL, +/* 986c */ NULL, +/* 986d */ NULL, +/* 986e */ NULL, +/* 986f */ NULL, +/* 9870 */ NULL, +/* 9871 */ NULL, +/* 9872 */ NULL, +/* 9873 */ NULL, +/* 9874 */ NULL, +/* 9875 */ NULL, +/* 9876 */ NULL, +/* 9877 */ NULL, +/* 9878 */ NULL, +/* 9879 */ NULL, +/* 987a */ NULL, +/* 987b */ NULL, +/* 987c */ NULL, +/* 987d */ NULL, +/* 987e */ NULL, +/* 987f */ NULL, +/* 9880 */ NULL, +/* 9881 */ NULL, +/* 9882 */ NULL, +/* 9883 */ NULL, +/* 9884 */ NULL, +/* 9885 */ NULL, +/* 9886 */ NULL, +/* 9887 */ NULL, +/* 9888 */ NULL, +/* 9889 */ NULL, +/* 988a */ NULL, +/* 988b */ NULL, +/* 988c */ NULL, +/* 988d */ NULL, +/* 988e */ NULL, +/* 988f */ NULL, +/* 9890 */ NULL, +/* 9891 */ NULL, +/* 9892 */ NULL, +/* 9893 */ NULL, +/* 9894 */ NULL, +/* 9895 */ NULL, +/* 9896 */ NULL, +/* 9897 */ NULL, +/* 9898 */ NULL, +/* 9899 */ NULL, +/* 989a */ NULL, +/* 989b */ NULL, +/* 989c */ NULL, +/* 989d */ NULL, +/* 989e */ NULL, +/* 989f */ NULL, +/* 98a0 */ NULL, +/* 98a1 */ NULL, +/* 98a2 */ NULL, +/* 98a3 */ NULL, +/* 98a4 */ NULL, +/* 98a5 */ NULL, +/* 98a6 */ NULL, +/* 98a7 */ NULL, +/* 98a8 */ NULL, +/* 98a9 */ NULL, +/* 98aa */ NULL, +/* 98ab */ NULL, +/* 98ac */ NULL, +/* 98ad */ NULL, +/* 98ae */ NULL, +/* 98af */ NULL, +/* 98b0 */ NULL, +/* 98b1 */ NULL, +/* 98b2 */ NULL, +/* 98b3 */ NULL, +/* 98b4 */ NULL, +/* 98b5 */ NULL, +/* 98b6 */ NULL, +/* 98b7 */ NULL, +/* 98b8 */ NULL, +/* 98b9 */ NULL, +/* 98ba */ NULL, +/* 98bb */ NULL, +/* 98bc */ NULL, +/* 98bd */ NULL, +/* 98be */ NULL, +/* 98bf */ NULL, +/* 98c0 */ NULL, +/* 98c1 */ NULL, +/* 98c2 */ NULL, +/* 98c3 */ NULL, +/* 98c4 */ NULL, +/* 98c5 */ NULL, +/* 98c6 */ NULL, +/* 98c7 */ NULL, +/* 98c8 */ NULL, +/* 98c9 */ NULL, +/* 98ca */ NULL, +/* 98cb */ NULL, +/* 98cc */ NULL, +/* 98cd */ NULL, +/* 98ce */ NULL, +/* 98cf */ NULL, +/* 98d0 */ NULL, +/* 98d1 */ NULL, +/* 98d2 */ NULL, +/* 98d3 */ NULL, +/* 98d4 */ NULL, +/* 98d5 */ NULL, +/* 98d6 */ NULL, +/* 98d7 */ NULL, +/* 98d8 */ NULL, +/* 98d9 */ NULL, +/* 98da */ NULL, +/* 98db */ NULL, +/* 98dc */ NULL, +/* 98dd */ NULL, +/* 98de */ NULL, +/* 98df */ NULL, +/* 98e0 */ NULL, +/* 98e1 */ NULL, +/* 98e2 */ NULL, +/* 98e3 */ NULL, +/* 98e4 */ NULL, +/* 98e5 */ NULL, +/* 98e6 */ NULL, +/* 98e7 */ NULL, +/* 98e8 */ NULL, +/* 98e9 */ NULL, +/* 98ea */ NULL, +/* 98eb */ NULL, +/* 98ec */ NULL, +/* 98ed */ NULL, +/* 98ee */ NULL, +/* 98ef */ NULL, +/* 98f0 */ NULL, +/* 98f1 */ NULL, +/* 98f2 */ NULL, +/* 98f3 */ NULL, +/* 98f4 */ NULL, +/* 98f5 */ NULL, +/* 98f6 */ NULL, +/* 98f7 */ NULL, +/* 98f8 */ NULL, +/* 98f9 */ NULL, +/* 98fa */ NULL, +/* 98fb */ NULL, +/* 98fc */ NULL, +/* 98fd */ NULL, +/* 98fe */ NULL, +/* 98ff */ NULL, +/* 9900 */ NULL, +/* 9901 */ NULL, +/* 9902 */ NULL, +/* 9903 */ NULL, +/* 9904 */ NULL, +/* 9905 */ NULL, +/* 9906 */ NULL, +/* 9907 */ NULL, +/* 9908 */ NULL, +/* 9909 */ NULL, +/* 990a */ NULL, +/* 990b */ NULL, +/* 990c */ NULL, +/* 990d */ NULL, +/* 990e */ NULL, +/* 990f */ NULL, +/* 9910 */ NULL, +/* 9911 */ NULL, +/* 9912 */ NULL, +/* 9913 */ NULL, +/* 9914 */ NULL, +/* 9915 */ NULL, +/* 9916 */ NULL, +/* 9917 */ NULL, +/* 9918 */ NULL, +/* 9919 */ NULL, +/* 991a */ NULL, +/* 991b */ NULL, +/* 991c */ NULL, +/* 991d */ NULL, +/* 991e */ NULL, +/* 991f */ NULL, +/* 9920 */ NULL, +/* 9921 */ NULL, +/* 9922 */ NULL, +/* 9923 */ NULL, +/* 9924 */ NULL, +/* 9925 */ NULL, +/* 9926 */ NULL, +/* 9927 */ NULL, +/* 9928 */ NULL, +/* 9929 */ NULL, +/* 992a */ NULL, +/* 992b */ NULL, +/* 992c */ NULL, +/* 992d */ NULL, +/* 992e */ NULL, +/* 992f */ NULL, +/* 9930 */ NULL, +/* 9931 */ NULL, +/* 9932 */ NULL, +/* 9933 */ NULL, +/* 9934 */ NULL, +/* 9935 */ NULL, +/* 9936 */ NULL, +/* 9937 */ NULL, +/* 9938 */ NULL, +/* 9939 */ NULL, +/* 993a */ NULL, +/* 993b */ NULL, +/* 993c */ NULL, +/* 993d */ NULL, +/* 993e */ NULL, +/* 993f */ NULL, +/* 9940 */ NULL, +/* 9941 */ NULL, +/* 9942 */ NULL, +/* 9943 */ NULL, +/* 9944 */ NULL, +/* 9945 */ NULL, +/* 9946 */ NULL, +/* 9947 */ NULL, +/* 9948 */ NULL, +/* 9949 */ NULL, +/* 994a */ NULL, +/* 994b */ NULL, +/* 994c */ NULL, +/* 994d */ NULL, +/* 994e */ NULL, +/* 994f */ NULL, +/* 9950 */ NULL, +/* 9951 */ NULL, +/* 9952 */ NULL, +/* 9953 */ NULL, +/* 9954 */ NULL, +/* 9955 */ NULL, +/* 9956 */ NULL, +/* 9957 */ NULL, +/* 9958 */ NULL, +/* 9959 */ NULL, +/* 995a */ NULL, +/* 995b */ NULL, +/* 995c */ NULL, +/* 995d */ NULL, +/* 995e */ NULL, +/* 995f */ NULL, +/* 9960 */ NULL, +/* 9961 */ NULL, +/* 9962 */ NULL, +/* 9963 */ NULL, +/* 9964 */ NULL, +/* 9965 */ NULL, +/* 9966 */ NULL, +/* 9967 */ NULL, +/* 9968 */ NULL, +/* 9969 */ NULL, +/* 996a */ NULL, +/* 996b */ NULL, +/* 996c */ NULL, +/* 996d */ NULL, +/* 996e */ NULL, +/* 996f */ NULL, +/* 9970 */ NULL, +/* 9971 */ NULL, +/* 9972 */ NULL, +/* 9973 */ NULL, +/* 9974 */ NULL, +/* 9975 */ NULL, +/* 9976 */ NULL, +/* 9977 */ NULL, +/* 9978 */ NULL, +/* 9979 */ NULL, +/* 997a */ NULL, +/* 997b */ NULL, +/* 997c */ NULL, +/* 997d */ NULL, +/* 997e */ NULL, +/* 997f */ NULL, +/* 9980 */ NULL, +/* 9981 */ NULL, +/* 9982 */ NULL, +/* 9983 */ NULL, +/* 9984 */ NULL, +/* 9985 */ NULL, +/* 9986 */ NULL, +/* 9987 */ NULL, +/* 9988 */ NULL, +/* 9989 */ NULL, +/* 998a */ NULL, +/* 998b */ NULL, +/* 998c */ NULL, +/* 998d */ NULL, +/* 998e */ NULL, +/* 998f */ NULL, +/* 9990 */ NULL, +/* 9991 */ NULL, +/* 9992 */ NULL, +/* 9993 */ NULL, +/* 9994 */ NULL, +/* 9995 */ NULL, +/* 9996 */ NULL, +/* 9997 */ NULL, +/* 9998 */ NULL, +/* 9999 */ NULL, +/* 999a */ NULL, +/* 999b */ NULL, +/* 999c */ NULL, +/* 999d */ NULL, +/* 999e */ NULL, +/* 999f */ NULL, +/* 99a0 */ NULL, +/* 99a1 */ NULL, +/* 99a2 */ NULL, +/* 99a3 */ NULL, +/* 99a4 */ NULL, +/* 99a5 */ NULL, +/* 99a6 */ NULL, +/* 99a7 */ NULL, +/* 99a8 */ NULL, +/* 99a9 */ NULL, +/* 99aa */ NULL, +/* 99ab */ NULL, +/* 99ac */ NULL, +/* 99ad */ NULL, +/* 99ae */ NULL, +/* 99af */ NULL, +/* 99b0 */ NULL, +/* 99b1 */ NULL, +/* 99b2 */ NULL, +/* 99b3 */ NULL, +/* 99b4 */ NULL, +/* 99b5 */ NULL, +/* 99b6 */ NULL, +/* 99b7 */ NULL, +/* 99b8 */ NULL, +/* 99b9 */ NULL, +/* 99ba */ NULL, +/* 99bb */ NULL, +/* 99bc */ NULL, +/* 99bd */ NULL, +/* 99be */ NULL, +/* 99bf */ NULL, +/* 99c0 */ NULL, +/* 99c1 */ NULL, +/* 99c2 */ NULL, +/* 99c3 */ NULL, +/* 99c4 */ NULL, +/* 99c5 */ NULL, +/* 99c6 */ NULL, +/* 99c7 */ NULL, +/* 99c8 */ NULL, +/* 99c9 */ NULL, +/* 99ca */ NULL, +/* 99cb */ NULL, +/* 99cc */ NULL, +/* 99cd */ NULL, +/* 99ce */ NULL, +/* 99cf */ NULL, +/* 99d0 */ NULL, +/* 99d1 */ NULL, +/* 99d2 */ NULL, +/* 99d3 */ NULL, +/* 99d4 */ NULL, +/* 99d5 */ NULL, +/* 99d6 */ NULL, +/* 99d7 */ NULL, +/* 99d8 */ NULL, +/* 99d9 */ NULL, +/* 99da */ NULL, +/* 99db */ NULL, +/* 99dc */ NULL, +/* 99dd */ NULL, +/* 99de */ NULL, +/* 99df */ NULL, +/* 99e0 */ NULL, +/* 99e1 */ NULL, +/* 99e2 */ NULL, +/* 99e3 */ NULL, +/* 99e4 */ NULL, +/* 99e5 */ NULL, +/* 99e6 */ NULL, +/* 99e7 */ NULL, +/* 99e8 */ NULL, +/* 99e9 */ NULL, +/* 99ea */ NULL, +/* 99eb */ NULL, +/* 99ec */ NULL, +/* 99ed */ NULL, +/* 99ee */ NULL, +/* 99ef */ NULL, +/* 99f0 */ NULL, +/* 99f1 */ NULL, +/* 99f2 */ NULL, +/* 99f3 */ NULL, +/* 99f4 */ NULL, +/* 99f5 */ NULL, +/* 99f6 */ NULL, +/* 99f7 */ NULL, +/* 99f8 */ NULL, +/* 99f9 */ NULL, +/* 99fa */ NULL, +/* 99fb */ NULL, +/* 99fc */ NULL, +/* 99fd */ NULL, +/* 99fe */ NULL, +/* 99ff */ NULL, +/* 9a00 */ NULL, +/* 9a01 */ NULL, +/* 9a02 */ NULL, +/* 9a03 */ NULL, +/* 9a04 */ NULL, +/* 9a05 */ NULL, +/* 9a06 */ NULL, +/* 9a07 */ NULL, +/* 9a08 */ NULL, +/* 9a09 */ NULL, +/* 9a0a */ NULL, +/* 9a0b */ NULL, +/* 9a0c */ NULL, +/* 9a0d */ NULL, +/* 9a0e */ NULL, +/* 9a0f */ NULL, +/* 9a10 */ NULL, +/* 9a11 */ NULL, +/* 9a12 */ NULL, +/* 9a13 */ NULL, +/* 9a14 */ NULL, +/* 9a15 */ NULL, +/* 9a16 */ NULL, +/* 9a17 */ NULL, +/* 9a18 */ NULL, +/* 9a19 */ NULL, +/* 9a1a */ NULL, +/* 9a1b */ NULL, +/* 9a1c */ NULL, +/* 9a1d */ NULL, +/* 9a1e */ NULL, +/* 9a1f */ NULL, +/* 9a20 */ NULL, +/* 9a21 */ NULL, +/* 9a22 */ NULL, +/* 9a23 */ NULL, +/* 9a24 */ NULL, +/* 9a25 */ NULL, +/* 9a26 */ NULL, +/* 9a27 */ NULL, +/* 9a28 */ NULL, +/* 9a29 */ NULL, +/* 9a2a */ NULL, +/* 9a2b */ NULL, +/* 9a2c */ NULL, +/* 9a2d */ NULL, +/* 9a2e */ NULL, +/* 9a2f */ NULL, +/* 9a30 */ NULL, +/* 9a31 */ NULL, +/* 9a32 */ NULL, +/* 9a33 */ NULL, +/* 9a34 */ NULL, +/* 9a35 */ NULL, +/* 9a36 */ NULL, +/* 9a37 */ NULL, +/* 9a38 */ NULL, +/* 9a39 */ NULL, +/* 9a3a */ NULL, +/* 9a3b */ NULL, +/* 9a3c */ NULL, +/* 9a3d */ NULL, +/* 9a3e */ NULL, +/* 9a3f */ NULL, +/* 9a40 */ NULL, +/* 9a41 */ NULL, +/* 9a42 */ NULL, +/* 9a43 */ NULL, +/* 9a44 */ NULL, +/* 9a45 */ NULL, +/* 9a46 */ NULL, +/* 9a47 */ NULL, +/* 9a48 */ NULL, +/* 9a49 */ NULL, +/* 9a4a */ NULL, +/* 9a4b */ NULL, +/* 9a4c */ NULL, +/* 9a4d */ NULL, +/* 9a4e */ NULL, +/* 9a4f */ NULL, +/* 9a50 */ NULL, +/* 9a51 */ NULL, +/* 9a52 */ NULL, +/* 9a53 */ NULL, +/* 9a54 */ NULL, +/* 9a55 */ NULL, +/* 9a56 */ NULL, +/* 9a57 */ NULL, +/* 9a58 */ NULL, +/* 9a59 */ NULL, +/* 9a5a */ NULL, +/* 9a5b */ NULL, +/* 9a5c */ NULL, +/* 9a5d */ NULL, +/* 9a5e */ NULL, +/* 9a5f */ NULL, +/* 9a60 */ NULL, +/* 9a61 */ NULL, +/* 9a62 */ NULL, +/* 9a63 */ NULL, +/* 9a64 */ NULL, +/* 9a65 */ NULL, +/* 9a66 */ NULL, +/* 9a67 */ NULL, +/* 9a68 */ NULL, +/* 9a69 */ NULL, +/* 9a6a */ NULL, +/* 9a6b */ NULL, +/* 9a6c */ NULL, +/* 9a6d */ NULL, +/* 9a6e */ NULL, +/* 9a6f */ NULL, +/* 9a70 */ NULL, +/* 9a71 */ NULL, +/* 9a72 */ NULL, +/* 9a73 */ NULL, +/* 9a74 */ NULL, +/* 9a75 */ NULL, +/* 9a76 */ NULL, +/* 9a77 */ NULL, +/* 9a78 */ NULL, +/* 9a79 */ NULL, +/* 9a7a */ NULL, +/* 9a7b */ NULL, +/* 9a7c */ NULL, +/* 9a7d */ NULL, +/* 9a7e */ NULL, +/* 9a7f */ NULL, +/* 9a80 */ NULL, +/* 9a81 */ NULL, +/* 9a82 */ NULL, +/* 9a83 */ NULL, +/* 9a84 */ NULL, +/* 9a85 */ NULL, +/* 9a86 */ NULL, +/* 9a87 */ NULL, +/* 9a88 */ NULL, +/* 9a89 */ NULL, +/* 9a8a */ NULL, +/* 9a8b */ NULL, +/* 9a8c */ NULL, +/* 9a8d */ NULL, +/* 9a8e */ NULL, +/* 9a8f */ NULL, +/* 9a90 */ NULL, +/* 9a91 */ NULL, +/* 9a92 */ NULL, +/* 9a93 */ NULL, +/* 9a94 */ NULL, +/* 9a95 */ NULL, +/* 9a96 */ NULL, +/* 9a97 */ NULL, +/* 9a98 */ NULL, +/* 9a99 */ NULL, +/* 9a9a */ NULL, +/* 9a9b */ NULL, +/* 9a9c */ NULL, +/* 9a9d */ NULL, +/* 9a9e */ NULL, +/* 9a9f */ NULL, +/* 9aa0 */ NULL, +/* 9aa1 */ NULL, +/* 9aa2 */ NULL, +/* 9aa3 */ NULL, +/* 9aa4 */ NULL, +/* 9aa5 */ NULL, +/* 9aa6 */ NULL, +/* 9aa7 */ NULL, +/* 9aa8 */ NULL, +/* 9aa9 */ NULL, +/* 9aaa */ NULL, +/* 9aab */ NULL, +/* 9aac */ NULL, +/* 9aad */ NULL, +/* 9aae */ NULL, +/* 9aaf */ NULL, +/* 9ab0 */ NULL, +/* 9ab1 */ NULL, +/* 9ab2 */ NULL, +/* 9ab3 */ NULL, +/* 9ab4 */ NULL, +/* 9ab5 */ NULL, +/* 9ab6 */ NULL, +/* 9ab7 */ NULL, +/* 9ab8 */ NULL, +/* 9ab9 */ NULL, +/* 9aba */ NULL, +/* 9abb */ NULL, +/* 9abc */ NULL, +/* 9abd */ NULL, +/* 9abe */ NULL, +/* 9abf */ NULL, +/* 9ac0 */ NULL, +/* 9ac1 */ NULL, +/* 9ac2 */ NULL, +/* 9ac3 */ NULL, +/* 9ac4 */ NULL, +/* 9ac5 */ NULL, +/* 9ac6 */ NULL, +/* 9ac7 */ NULL, +/* 9ac8 */ NULL, +/* 9ac9 */ NULL, +/* 9aca */ NULL, +/* 9acb */ NULL, +/* 9acc */ NULL, +/* 9acd */ NULL, +/* 9ace */ NULL, +/* 9acf */ NULL, +/* 9ad0 */ NULL, +/* 9ad1 */ NULL, +/* 9ad2 */ NULL, +/* 9ad3 */ NULL, +/* 9ad4 */ NULL, +/* 9ad5 */ NULL, +/* 9ad6 */ NULL, +/* 9ad7 */ NULL, +/* 9ad8 */ NULL, +/* 9ad9 */ NULL, +/* 9ada */ NULL, +/* 9adb */ NULL, +/* 9adc */ NULL, +/* 9add */ NULL, +/* 9ade */ NULL, +/* 9adf */ NULL, +/* 9ae0 */ NULL, +/* 9ae1 */ NULL, +/* 9ae2 */ NULL, +/* 9ae3 */ NULL, +/* 9ae4 */ NULL, +/* 9ae5 */ NULL, +/* 9ae6 */ NULL, +/* 9ae7 */ NULL, +/* 9ae8 */ NULL, +/* 9ae9 */ NULL, +/* 9aea */ NULL, +/* 9aeb */ NULL, +/* 9aec */ NULL, +/* 9aed */ NULL, +/* 9aee */ NULL, +/* 9aef */ NULL, +/* 9af0 */ NULL, +/* 9af1 */ NULL, +/* 9af2 */ NULL, +/* 9af3 */ NULL, +/* 9af4 */ NULL, +/* 9af5 */ NULL, +/* 9af6 */ NULL, +/* 9af7 */ NULL, +/* 9af8 */ NULL, +/* 9af9 */ NULL, +/* 9afa */ NULL, +/* 9afb */ NULL, +/* 9afc */ NULL, +/* 9afd */ NULL, +/* 9afe */ NULL, +/* 9aff */ NULL, +/* 9b00 */ NULL, +/* 9b01 */ NULL, +/* 9b02 */ NULL, +/* 9b03 */ NULL, +/* 9b04 */ NULL, +/* 9b05 */ NULL, +/* 9b06 */ NULL, +/* 9b07 */ NULL, +/* 9b08 */ NULL, +/* 9b09 */ NULL, +/* 9b0a */ NULL, +/* 9b0b */ NULL, +/* 9b0c */ NULL, +/* 9b0d */ NULL, +/* 9b0e */ NULL, +/* 9b0f */ NULL, +/* 9b10 */ NULL, +/* 9b11 */ NULL, +/* 9b12 */ NULL, +/* 9b13 */ NULL, +/* 9b14 */ NULL, +/* 9b15 */ NULL, +/* 9b16 */ NULL, +/* 9b17 */ NULL, +/* 9b18 */ NULL, +/* 9b19 */ NULL, +/* 9b1a */ NULL, +/* 9b1b */ NULL, +/* 9b1c */ NULL, +/* 9b1d */ NULL, +/* 9b1e */ NULL, +/* 9b1f */ NULL, +/* 9b20 */ NULL, +/* 9b21 */ NULL, +/* 9b22 */ NULL, +/* 9b23 */ NULL, +/* 9b24 */ NULL, +/* 9b25 */ NULL, +/* 9b26 */ NULL, +/* 9b27 */ NULL, +/* 9b28 */ NULL, +/* 9b29 */ NULL, +/* 9b2a */ NULL, +/* 9b2b */ NULL, +/* 9b2c */ NULL, +/* 9b2d */ NULL, +/* 9b2e */ NULL, +/* 9b2f */ NULL, +/* 9b30 */ NULL, +/* 9b31 */ NULL, +/* 9b32 */ NULL, +/* 9b33 */ NULL, +/* 9b34 */ NULL, +/* 9b35 */ NULL, +/* 9b36 */ NULL, +/* 9b37 */ NULL, +/* 9b38 */ NULL, +/* 9b39 */ NULL, +/* 9b3a */ NULL, +/* 9b3b */ NULL, +/* 9b3c */ NULL, +/* 9b3d */ NULL, +/* 9b3e */ NULL, +/* 9b3f */ NULL, +/* 9b40 */ NULL, +/* 9b41 */ NULL, +/* 9b42 */ NULL, +/* 9b43 */ NULL, +/* 9b44 */ NULL, +/* 9b45 */ NULL, +/* 9b46 */ NULL, +/* 9b47 */ NULL, +/* 9b48 */ NULL, +/* 9b49 */ NULL, +/* 9b4a */ NULL, +/* 9b4b */ NULL, +/* 9b4c */ NULL, +/* 9b4d */ NULL, +/* 9b4e */ NULL, +/* 9b4f */ NULL, +/* 9b50 */ NULL, +/* 9b51 */ NULL, +/* 9b52 */ NULL, +/* 9b53 */ NULL, +/* 9b54 */ NULL, +/* 9b55 */ NULL, +/* 9b56 */ NULL, +/* 9b57 */ NULL, +/* 9b58 */ NULL, +/* 9b59 */ NULL, +/* 9b5a */ NULL, +/* 9b5b */ NULL, +/* 9b5c */ NULL, +/* 9b5d */ NULL, +/* 9b5e */ NULL, +/* 9b5f */ NULL, +/* 9b60 */ NULL, +/* 9b61 */ NULL, +/* 9b62 */ NULL, +/* 9b63 */ NULL, +/* 9b64 */ NULL, +/* 9b65 */ NULL, +/* 9b66 */ NULL, +/* 9b67 */ NULL, +/* 9b68 */ NULL, +/* 9b69 */ NULL, +/* 9b6a */ NULL, +/* 9b6b */ NULL, +/* 9b6c */ NULL, +/* 9b6d */ NULL, +/* 9b6e */ NULL, +/* 9b6f */ NULL, +/* 9b70 */ NULL, +/* 9b71 */ NULL, +/* 9b72 */ NULL, +/* 9b73 */ NULL, +/* 9b74 */ NULL, +/* 9b75 */ NULL, +/* 9b76 */ NULL, +/* 9b77 */ NULL, +/* 9b78 */ NULL, +/* 9b79 */ NULL, +/* 9b7a */ NULL, +/* 9b7b */ NULL, +/* 9b7c */ NULL, +/* 9b7d */ NULL, +/* 9b7e */ NULL, +/* 9b7f */ NULL, +/* 9b80 */ NULL, +/* 9b81 */ NULL, +/* 9b82 */ NULL, +/* 9b83 */ NULL, +/* 9b84 */ NULL, +/* 9b85 */ NULL, +/* 9b86 */ NULL, +/* 9b87 */ NULL, +/* 9b88 */ NULL, +/* 9b89 */ NULL, +/* 9b8a */ NULL, +/* 9b8b */ NULL, +/* 9b8c */ NULL, +/* 9b8d */ NULL, +/* 9b8e */ NULL, +/* 9b8f */ NULL, +/* 9b90 */ NULL, +/* 9b91 */ NULL, +/* 9b92 */ NULL, +/* 9b93 */ NULL, +/* 9b94 */ NULL, +/* 9b95 */ NULL, +/* 9b96 */ NULL, +/* 9b97 */ NULL, +/* 9b98 */ NULL, +/* 9b99 */ NULL, +/* 9b9a */ NULL, +/* 9b9b */ NULL, +/* 9b9c */ NULL, +/* 9b9d */ NULL, +/* 9b9e */ NULL, +/* 9b9f */ NULL, +/* 9ba0 */ NULL, +/* 9ba1 */ NULL, +/* 9ba2 */ NULL, +/* 9ba3 */ NULL, +/* 9ba4 */ NULL, +/* 9ba5 */ NULL, +/* 9ba6 */ NULL, +/* 9ba7 */ NULL, +/* 9ba8 */ NULL, +/* 9ba9 */ NULL, +/* 9baa */ NULL, +/* 9bab */ NULL, +/* 9bac */ NULL, +/* 9bad */ NULL, +/* 9bae */ NULL, +/* 9baf */ NULL, +/* 9bb0 */ NULL, +/* 9bb1 */ NULL, +/* 9bb2 */ NULL, +/* 9bb3 */ NULL, +/* 9bb4 */ NULL, +/* 9bb5 */ NULL, +/* 9bb6 */ NULL, +/* 9bb7 */ NULL, +/* 9bb8 */ NULL, +/* 9bb9 */ NULL, +/* 9bba */ NULL, +/* 9bbb */ NULL, +/* 9bbc */ NULL, +/* 9bbd */ NULL, +/* 9bbe */ NULL, +/* 9bbf */ NULL, +/* 9bc0 */ NULL, +/* 9bc1 */ NULL, +/* 9bc2 */ NULL, +/* 9bc3 */ NULL, +/* 9bc4 */ NULL, +/* 9bc5 */ NULL, +/* 9bc6 */ NULL, +/* 9bc7 */ NULL, +/* 9bc8 */ NULL, +/* 9bc9 */ NULL, +/* 9bca */ NULL, +/* 9bcb */ NULL, +/* 9bcc */ NULL, +/* 9bcd */ NULL, +/* 9bce */ NULL, +/* 9bcf */ NULL, +/* 9bd0 */ NULL, +/* 9bd1 */ NULL, +/* 9bd2 */ NULL, +/* 9bd3 */ NULL, +/* 9bd4 */ NULL, +/* 9bd5 */ NULL, +/* 9bd6 */ NULL, +/* 9bd7 */ NULL, +/* 9bd8 */ NULL, +/* 9bd9 */ NULL, +/* 9bda */ NULL, +/* 9bdb */ NULL, +/* 9bdc */ NULL, +/* 9bdd */ NULL, +/* 9bde */ NULL, +/* 9bdf */ NULL, +/* 9be0 */ NULL, +/* 9be1 */ NULL, +/* 9be2 */ NULL, +/* 9be3 */ NULL, +/* 9be4 */ NULL, +/* 9be5 */ NULL, +/* 9be6 */ NULL, +/* 9be7 */ NULL, +/* 9be8 */ NULL, +/* 9be9 */ NULL, +/* 9bea */ NULL, +/* 9beb */ NULL, +/* 9bec */ NULL, +/* 9bed */ NULL, +/* 9bee */ NULL, +/* 9bef */ NULL, +/* 9bf0 */ NULL, +/* 9bf1 */ NULL, +/* 9bf2 */ NULL, +/* 9bf3 */ NULL, +/* 9bf4 */ NULL, +/* 9bf5 */ NULL, +/* 9bf6 */ NULL, +/* 9bf7 */ NULL, +/* 9bf8 */ NULL, +/* 9bf9 */ NULL, +/* 9bfa */ NULL, +/* 9bfb */ NULL, +/* 9bfc */ NULL, +/* 9bfd */ NULL, +/* 9bfe */ NULL, +/* 9bff */ NULL, +/* 9c00 */ NULL, +/* 9c01 */ NULL, +/* 9c02 */ NULL, +/* 9c03 */ NULL, +/* 9c04 */ NULL, +/* 9c05 */ NULL, +/* 9c06 */ NULL, +/* 9c07 */ NULL, +/* 9c08 */ NULL, +/* 9c09 */ NULL, +/* 9c0a */ NULL, +/* 9c0b */ NULL, +/* 9c0c */ NULL, +/* 9c0d */ NULL, +/* 9c0e */ NULL, +/* 9c0f */ NULL, +/* 9c10 */ NULL, +/* 9c11 */ NULL, +/* 9c12 */ NULL, +/* 9c13 */ NULL, +/* 9c14 */ NULL, +/* 9c15 */ NULL, +/* 9c16 */ NULL, +/* 9c17 */ NULL, +/* 9c18 */ NULL, +/* 9c19 */ NULL, +/* 9c1a */ NULL, +/* 9c1b */ NULL, +/* 9c1c */ NULL, +/* 9c1d */ NULL, +/* 9c1e */ NULL, +/* 9c1f */ NULL, +/* 9c20 */ NULL, +/* 9c21 */ NULL, +/* 9c22 */ NULL, +/* 9c23 */ NULL, +/* 9c24 */ NULL, +/* 9c25 */ NULL, +/* 9c26 */ NULL, +/* 9c27 */ NULL, +/* 9c28 */ NULL, +/* 9c29 */ NULL, +/* 9c2a */ NULL, +/* 9c2b */ NULL, +/* 9c2c */ NULL, +/* 9c2d */ NULL, +/* 9c2e */ NULL, +/* 9c2f */ NULL, +/* 9c30 */ NULL, +/* 9c31 */ NULL, +/* 9c32 */ NULL, +/* 9c33 */ NULL, +/* 9c34 */ NULL, +/* 9c35 */ NULL, +/* 9c36 */ NULL, +/* 9c37 */ NULL, +/* 9c38 */ NULL, +/* 9c39 */ NULL, +/* 9c3a */ NULL, +/* 9c3b */ NULL, +/* 9c3c */ NULL, +/* 9c3d */ NULL, +/* 9c3e */ NULL, +/* 9c3f */ NULL, +/* 9c40 */ NULL, +/* 9c41 */ NULL, +/* 9c42 */ NULL, +/* 9c43 */ NULL, +/* 9c44 */ NULL, +/* 9c45 */ NULL, +/* 9c46 */ NULL, +/* 9c47 */ NULL, +/* 9c48 */ NULL, +/* 9c49 */ NULL, +/* 9c4a */ NULL, +/* 9c4b */ NULL, +/* 9c4c */ NULL, +/* 9c4d */ NULL, +/* 9c4e */ NULL, +/* 9c4f */ NULL, +/* 9c50 */ NULL, +/* 9c51 */ NULL, +/* 9c52 */ NULL, +/* 9c53 */ NULL, +/* 9c54 */ NULL, +/* 9c55 */ NULL, +/* 9c56 */ NULL, +/* 9c57 */ NULL, +/* 9c58 */ NULL, +/* 9c59 */ NULL, +/* 9c5a */ NULL, +/* 9c5b */ NULL, +/* 9c5c */ NULL, +/* 9c5d */ NULL, +/* 9c5e */ NULL, +/* 9c5f */ NULL, +/* 9c60 */ NULL, +/* 9c61 */ NULL, +/* 9c62 */ NULL, +/* 9c63 */ NULL, +/* 9c64 */ NULL, +/* 9c65 */ NULL, +/* 9c66 */ NULL, +/* 9c67 */ NULL, +/* 9c68 */ NULL, +/* 9c69 */ NULL, +/* 9c6a */ NULL, +/* 9c6b */ NULL, +/* 9c6c */ NULL, +/* 9c6d */ NULL, +/* 9c6e */ NULL, +/* 9c6f */ NULL, +/* 9c70 */ NULL, +/* 9c71 */ NULL, +/* 9c72 */ NULL, +/* 9c73 */ NULL, +/* 9c74 */ NULL, +/* 9c75 */ NULL, +/* 9c76 */ NULL, +/* 9c77 */ NULL, +/* 9c78 */ NULL, +/* 9c79 */ NULL, +/* 9c7a */ NULL, +/* 9c7b */ NULL, +/* 9c7c */ NULL, +/* 9c7d */ NULL, +/* 9c7e */ NULL, +/* 9c7f */ NULL, +/* 9c80 */ NULL, +/* 9c81 */ NULL, +/* 9c82 */ NULL, +/* 9c83 */ NULL, +/* 9c84 */ NULL, +/* 9c85 */ NULL, +/* 9c86 */ NULL, +/* 9c87 */ NULL, +/* 9c88 */ NULL, +/* 9c89 */ NULL, +/* 9c8a */ NULL, +/* 9c8b */ NULL, +/* 9c8c */ NULL, +/* 9c8d */ NULL, +/* 9c8e */ NULL, +/* 9c8f */ NULL, +/* 9c90 */ NULL, +/* 9c91 */ NULL, +/* 9c92 */ NULL, +/* 9c93 */ NULL, +/* 9c94 */ NULL, +/* 9c95 */ NULL, +/* 9c96 */ NULL, +/* 9c97 */ NULL, +/* 9c98 */ NULL, +/* 9c99 */ NULL, +/* 9c9a */ NULL, +/* 9c9b */ NULL, +/* 9c9c */ NULL, +/* 9c9d */ NULL, +/* 9c9e */ NULL, +/* 9c9f */ NULL, +/* 9ca0 */ NULL, +/* 9ca1 */ NULL, +/* 9ca2 */ NULL, +/* 9ca3 */ NULL, +/* 9ca4 */ NULL, +/* 9ca5 */ NULL, +/* 9ca6 */ NULL, +/* 9ca7 */ NULL, +/* 9ca8 */ NULL, +/* 9ca9 */ NULL, +/* 9caa */ NULL, +/* 9cab */ NULL, +/* 9cac */ NULL, +/* 9cad */ NULL, +/* 9cae */ NULL, +/* 9caf */ NULL, +/* 9cb0 */ NULL, +/* 9cb1 */ NULL, +/* 9cb2 */ NULL, +/* 9cb3 */ NULL, +/* 9cb4 */ NULL, +/* 9cb5 */ NULL, +/* 9cb6 */ NULL, +/* 9cb7 */ NULL, +/* 9cb8 */ NULL, +/* 9cb9 */ NULL, +/* 9cba */ NULL, +/* 9cbb */ NULL, +/* 9cbc */ NULL, +/* 9cbd */ NULL, +/* 9cbe */ NULL, +/* 9cbf */ NULL, +/* 9cc0 */ NULL, +/* 9cc1 */ NULL, +/* 9cc2 */ NULL, +/* 9cc3 */ NULL, +/* 9cc4 */ NULL, +/* 9cc5 */ NULL, +/* 9cc6 */ NULL, +/* 9cc7 */ NULL, +/* 9cc8 */ NULL, +/* 9cc9 */ NULL, +/* 9cca */ NULL, +/* 9ccb */ NULL, +/* 9ccc */ NULL, +/* 9ccd */ NULL, +/* 9cce */ NULL, +/* 9ccf */ NULL, +/* 9cd0 */ NULL, +/* 9cd1 */ NULL, +/* 9cd2 */ NULL, +/* 9cd3 */ NULL, +/* 9cd4 */ NULL, +/* 9cd5 */ NULL, +/* 9cd6 */ NULL, +/* 9cd7 */ NULL, +/* 9cd8 */ NULL, +/* 9cd9 */ NULL, +/* 9cda */ NULL, +/* 9cdb */ NULL, +/* 9cdc */ NULL, +/* 9cdd */ NULL, +/* 9cde */ NULL, +/* 9cdf */ NULL, +/* 9ce0 */ NULL, +/* 9ce1 */ NULL, +/* 9ce2 */ NULL, +/* 9ce3 */ NULL, +/* 9ce4 */ NULL, +/* 9ce5 */ NULL, +/* 9ce6 */ NULL, +/* 9ce7 */ NULL, +/* 9ce8 */ NULL, +/* 9ce9 */ NULL, +/* 9cea */ NULL, +/* 9ceb */ NULL, +/* 9cec */ NULL, +/* 9ced */ NULL, +/* 9cee */ NULL, +/* 9cef */ NULL, +/* 9cf0 */ NULL, +/* 9cf1 */ NULL, +/* 9cf2 */ NULL, +/* 9cf3 */ NULL, +/* 9cf4 */ NULL, +/* 9cf5 */ NULL, +/* 9cf6 */ NULL, +/* 9cf7 */ NULL, +/* 9cf8 */ NULL, +/* 9cf9 */ NULL, +/* 9cfa */ NULL, +/* 9cfb */ NULL, +/* 9cfc */ NULL, +/* 9cfd */ NULL, +/* 9cfe */ NULL, +/* 9cff */ NULL, +/* 9d00 */ NULL, +/* 9d01 */ NULL, +/* 9d02 */ NULL, +/* 9d03 */ NULL, +/* 9d04 */ NULL, +/* 9d05 */ NULL, +/* 9d06 */ NULL, +/* 9d07 */ NULL, +/* 9d08 */ NULL, +/* 9d09 */ NULL, +/* 9d0a */ NULL, +/* 9d0b */ NULL, +/* 9d0c */ NULL, +/* 9d0d */ NULL, +/* 9d0e */ NULL, +/* 9d0f */ NULL, +/* 9d10 */ NULL, +/* 9d11 */ NULL, +/* 9d12 */ NULL, +/* 9d13 */ NULL, +/* 9d14 */ NULL, +/* 9d15 */ NULL, +/* 9d16 */ NULL, +/* 9d17 */ NULL, +/* 9d18 */ NULL, +/* 9d19 */ NULL, +/* 9d1a */ NULL, +/* 9d1b */ NULL, +/* 9d1c */ NULL, +/* 9d1d */ NULL, +/* 9d1e */ NULL, +/* 9d1f */ NULL, +/* 9d20 */ NULL, +/* 9d21 */ NULL, +/* 9d22 */ NULL, +/* 9d23 */ NULL, +/* 9d24 */ NULL, +/* 9d25 */ NULL, +/* 9d26 */ NULL, +/* 9d27 */ NULL, +/* 9d28 */ NULL, +/* 9d29 */ NULL, +/* 9d2a */ NULL, +/* 9d2b */ NULL, +/* 9d2c */ NULL, +/* 9d2d */ NULL, +/* 9d2e */ NULL, +/* 9d2f */ NULL, +/* 9d30 */ NULL, +/* 9d31 */ NULL, +/* 9d32 */ NULL, +/* 9d33 */ NULL, +/* 9d34 */ NULL, +/* 9d35 */ NULL, +/* 9d36 */ NULL, +/* 9d37 */ NULL, +/* 9d38 */ NULL, +/* 9d39 */ NULL, +/* 9d3a */ NULL, +/* 9d3b */ NULL, +/* 9d3c */ NULL, +/* 9d3d */ NULL, +/* 9d3e */ NULL, +/* 9d3f */ NULL, +/* 9d40 */ NULL, +/* 9d41 */ NULL, +/* 9d42 */ NULL, +/* 9d43 */ NULL, +/* 9d44 */ NULL, +/* 9d45 */ NULL, +/* 9d46 */ NULL, +/* 9d47 */ NULL, +/* 9d48 */ NULL, +/* 9d49 */ NULL, +/* 9d4a */ NULL, +/* 9d4b */ NULL, +/* 9d4c */ NULL, +/* 9d4d */ NULL, +/* 9d4e */ NULL, +/* 9d4f */ NULL, +/* 9d50 */ NULL, +/* 9d51 */ NULL, +/* 9d52 */ NULL, +/* 9d53 */ NULL, +/* 9d54 */ NULL, +/* 9d55 */ NULL, +/* 9d56 */ NULL, +/* 9d57 */ NULL, +/* 9d58 */ NULL, +/* 9d59 */ NULL, +/* 9d5a */ NULL, +/* 9d5b */ NULL, +/* 9d5c */ NULL, +/* 9d5d */ NULL, +/* 9d5e */ NULL, +/* 9d5f */ NULL, +/* 9d60 */ NULL, +/* 9d61 */ NULL, +/* 9d62 */ NULL, +/* 9d63 */ NULL, +/* 9d64 */ NULL, +/* 9d65 */ NULL, +/* 9d66 */ NULL, +/* 9d67 */ NULL, +/* 9d68 */ NULL, +/* 9d69 */ NULL, +/* 9d6a */ NULL, +/* 9d6b */ NULL, +/* 9d6c */ NULL, +/* 9d6d */ NULL, +/* 9d6e */ NULL, +/* 9d6f */ NULL, +/* 9d70 */ NULL, +/* 9d71 */ NULL, +/* 9d72 */ NULL, +/* 9d73 */ NULL, +/* 9d74 */ NULL, +/* 9d75 */ NULL, +/* 9d76 */ NULL, +/* 9d77 */ NULL, +/* 9d78 */ NULL, +/* 9d79 */ NULL, +/* 9d7a */ NULL, +/* 9d7b */ NULL, +/* 9d7c */ NULL, +/* 9d7d */ NULL, +/* 9d7e */ NULL, +/* 9d7f */ NULL, +/* 9d80 */ NULL, +/* 9d81 */ NULL, +/* 9d82 */ NULL, +/* 9d83 */ NULL, +/* 9d84 */ NULL, +/* 9d85 */ NULL, +/* 9d86 */ NULL, +/* 9d87 */ NULL, +/* 9d88 */ NULL, +/* 9d89 */ NULL, +/* 9d8a */ NULL, +/* 9d8b */ NULL, +/* 9d8c */ NULL, +/* 9d8d */ NULL, +/* 9d8e */ NULL, +/* 9d8f */ NULL, +/* 9d90 */ NULL, +/* 9d91 */ NULL, +/* 9d92 */ NULL, +/* 9d93 */ NULL, +/* 9d94 */ NULL, +/* 9d95 */ NULL, +/* 9d96 */ NULL, +/* 9d97 */ NULL, +/* 9d98 */ NULL, +/* 9d99 */ NULL, +/* 9d9a */ NULL, +/* 9d9b */ NULL, +/* 9d9c */ NULL, +/* 9d9d */ NULL, +/* 9d9e */ NULL, +/* 9d9f */ NULL, +/* 9da0 */ NULL, +/* 9da1 */ NULL, +/* 9da2 */ NULL, +/* 9da3 */ NULL, +/* 9da4 */ NULL, +/* 9da5 */ NULL, +/* 9da6 */ NULL, +/* 9da7 */ NULL, +/* 9da8 */ NULL, +/* 9da9 */ NULL, +/* 9daa */ NULL, +/* 9dab */ NULL, +/* 9dac */ NULL, +/* 9dad */ NULL, +/* 9dae */ NULL, +/* 9daf */ NULL, +/* 9db0 */ NULL, +/* 9db1 */ NULL, +/* 9db2 */ NULL, +/* 9db3 */ NULL, +/* 9db4 */ NULL, +/* 9db5 */ NULL, +/* 9db6 */ NULL, +/* 9db7 */ NULL, +/* 9db8 */ NULL, +/* 9db9 */ NULL, +/* 9dba */ NULL, +/* 9dbb */ NULL, +/* 9dbc */ NULL, +/* 9dbd */ NULL, +/* 9dbe */ NULL, +/* 9dbf */ NULL, +/* 9dc0 */ NULL, +/* 9dc1 */ NULL, +/* 9dc2 */ NULL, +/* 9dc3 */ NULL, +/* 9dc4 */ NULL, +/* 9dc5 */ NULL, +/* 9dc6 */ NULL, +/* 9dc7 */ NULL, +/* 9dc8 */ NULL, +/* 9dc9 */ NULL, +/* 9dca */ NULL, +/* 9dcb */ NULL, +/* 9dcc */ NULL, +/* 9dcd */ NULL, +/* 9dce */ NULL, +/* 9dcf */ NULL, +/* 9dd0 */ NULL, +/* 9dd1 */ NULL, +/* 9dd2 */ NULL, +/* 9dd3 */ NULL, +/* 9dd4 */ NULL, +/* 9dd5 */ NULL, +/* 9dd6 */ NULL, +/* 9dd7 */ NULL, +/* 9dd8 */ NULL, +/* 9dd9 */ NULL, +/* 9dda */ NULL, +/* 9ddb */ NULL, +/* 9ddc */ NULL, +/* 9ddd */ NULL, +/* 9dde */ NULL, +/* 9ddf */ NULL, +/* 9de0 */ NULL, +/* 9de1 */ NULL, +/* 9de2 */ NULL, +/* 9de3 */ NULL, +/* 9de4 */ NULL, +/* 9de5 */ NULL, +/* 9de6 */ NULL, +/* 9de7 */ NULL, +/* 9de8 */ NULL, +/* 9de9 */ NULL, +/* 9dea */ NULL, +/* 9deb */ NULL, +/* 9dec */ NULL, +/* 9ded */ NULL, +/* 9dee */ NULL, +/* 9def */ NULL, +/* 9df0 */ NULL, +/* 9df1 */ NULL, +/* 9df2 */ NULL, +/* 9df3 */ NULL, +/* 9df4 */ NULL, +/* 9df5 */ NULL, +/* 9df6 */ NULL, +/* 9df7 */ NULL, +/* 9df8 */ NULL, +/* 9df9 */ NULL, +/* 9dfa */ NULL, +/* 9dfb */ NULL, +/* 9dfc */ NULL, +/* 9dfd */ NULL, +/* 9dfe */ NULL, +/* 9dff */ NULL, +/* 9e00 */ NULL, +/* 9e01 */ NULL, +/* 9e02 */ NULL, +/* 9e03 */ NULL, +/* 9e04 */ NULL, +/* 9e05 */ NULL, +/* 9e06 */ NULL, +/* 9e07 */ NULL, +/* 9e08 */ NULL, +/* 9e09 */ NULL, +/* 9e0a */ NULL, +/* 9e0b */ NULL, +/* 9e0c */ NULL, +/* 9e0d */ NULL, +/* 9e0e */ NULL, +/* 9e0f */ NULL, +/* 9e10 */ NULL, +/* 9e11 */ NULL, +/* 9e12 */ NULL, +/* 9e13 */ NULL, +/* 9e14 */ NULL, +/* 9e15 */ NULL, +/* 9e16 */ NULL, +/* 9e17 */ NULL, +/* 9e18 */ NULL, +/* 9e19 */ NULL, +/* 9e1a */ NULL, +/* 9e1b */ NULL, +/* 9e1c */ NULL, +/* 9e1d */ NULL, +/* 9e1e */ NULL, +/* 9e1f */ NULL, +/* 9e20 */ NULL, +/* 9e21 */ NULL, +/* 9e22 */ NULL, +/* 9e23 */ NULL, +/* 9e24 */ NULL, +/* 9e25 */ NULL, +/* 9e26 */ NULL, +/* 9e27 */ NULL, +/* 9e28 */ NULL, +/* 9e29 */ NULL, +/* 9e2a */ NULL, +/* 9e2b */ NULL, +/* 9e2c */ NULL, +/* 9e2d */ NULL, +/* 9e2e */ NULL, +/* 9e2f */ NULL, +/* 9e30 */ NULL, +/* 9e31 */ NULL, +/* 9e32 */ NULL, +/* 9e33 */ NULL, +/* 9e34 */ NULL, +/* 9e35 */ NULL, +/* 9e36 */ NULL, +/* 9e37 */ NULL, +/* 9e38 */ NULL, +/* 9e39 */ NULL, +/* 9e3a */ NULL, +/* 9e3b */ NULL, +/* 9e3c */ NULL, +/* 9e3d */ NULL, +/* 9e3e */ NULL, +/* 9e3f */ NULL, +/* 9e40 */ NULL, +/* 9e41 */ NULL, +/* 9e42 */ NULL, +/* 9e43 */ NULL, +/* 9e44 */ NULL, +/* 9e45 */ NULL, +/* 9e46 */ NULL, +/* 9e47 */ NULL, +/* 9e48 */ NULL, +/* 9e49 */ NULL, +/* 9e4a */ NULL, +/* 9e4b */ NULL, +/* 9e4c */ NULL, +/* 9e4d */ NULL, +/* 9e4e */ NULL, +/* 9e4f */ NULL, +/* 9e50 */ NULL, +/* 9e51 */ NULL, +/* 9e52 */ NULL, +/* 9e53 */ NULL, +/* 9e54 */ NULL, +/* 9e55 */ NULL, +/* 9e56 */ NULL, +/* 9e57 */ NULL, +/* 9e58 */ NULL, +/* 9e59 */ NULL, +/* 9e5a */ NULL, +/* 9e5b */ NULL, +/* 9e5c */ NULL, +/* 9e5d */ NULL, +/* 9e5e */ NULL, +/* 9e5f */ NULL, +/* 9e60 */ NULL, +/* 9e61 */ NULL, +/* 9e62 */ NULL, +/* 9e63 */ NULL, +/* 9e64 */ NULL, +/* 9e65 */ NULL, +/* 9e66 */ NULL, +/* 9e67 */ NULL, +/* 9e68 */ NULL, +/* 9e69 */ NULL, +/* 9e6a */ NULL, +/* 9e6b */ NULL, +/* 9e6c */ NULL, +/* 9e6d */ NULL, +/* 9e6e */ NULL, +/* 9e6f */ NULL, +/* 9e70 */ NULL, +/* 9e71 */ NULL, +/* 9e72 */ NULL, +/* 9e73 */ NULL, +/* 9e74 */ NULL, +/* 9e75 */ NULL, +/* 9e76 */ NULL, +/* 9e77 */ NULL, +/* 9e78 */ NULL, +/* 9e79 */ NULL, +/* 9e7a */ NULL, +/* 9e7b */ NULL, +/* 9e7c */ NULL, +/* 9e7d */ NULL, +/* 9e7e */ NULL, +/* 9e7f */ NULL, +/* 9e80 */ NULL, +/* 9e81 */ NULL, +/* 9e82 */ NULL, +/* 9e83 */ NULL, +/* 9e84 */ NULL, +/* 9e85 */ NULL, +/* 9e86 */ NULL, +/* 9e87 */ NULL, +/* 9e88 */ NULL, +/* 9e89 */ NULL, +/* 9e8a */ NULL, +/* 9e8b */ NULL, +/* 9e8c */ NULL, +/* 9e8d */ NULL, +/* 9e8e */ NULL, +/* 9e8f */ NULL, +/* 9e90 */ NULL, +/* 9e91 */ NULL, +/* 9e92 */ NULL, +/* 9e93 */ NULL, +/* 9e94 */ NULL, +/* 9e95 */ NULL, +/* 9e96 */ NULL, +/* 9e97 */ NULL, +/* 9e98 */ NULL, +/* 9e99 */ NULL, +/* 9e9a */ NULL, +/* 9e9b */ NULL, +/* 9e9c */ NULL, +/* 9e9d */ NULL, +/* 9e9e */ NULL, +/* 9e9f */ NULL, +/* 9ea0 */ NULL, +/* 9ea1 */ NULL, +/* 9ea2 */ NULL, +/* 9ea3 */ NULL, +/* 9ea4 */ NULL, +/* 9ea5 */ NULL, +/* 9ea6 */ NULL, +/* 9ea7 */ NULL, +/* 9ea8 */ NULL, +/* 9ea9 */ NULL, +/* 9eaa */ NULL, +/* 9eab */ NULL, +/* 9eac */ NULL, +/* 9ead */ NULL, +/* 9eae */ NULL, +/* 9eaf */ NULL, +/* 9eb0 */ NULL, +/* 9eb1 */ NULL, +/* 9eb2 */ NULL, +/* 9eb3 */ NULL, +/* 9eb4 */ NULL, +/* 9eb5 */ NULL, +/* 9eb6 */ NULL, +/* 9eb7 */ NULL, +/* 9eb8 */ NULL, +/* 9eb9 */ NULL, +/* 9eba */ NULL, +/* 9ebb */ NULL, +/* 9ebc */ NULL, +/* 9ebd */ NULL, +/* 9ebe */ NULL, +/* 9ebf */ NULL, +/* 9ec0 */ NULL, +/* 9ec1 */ NULL, +/* 9ec2 */ NULL, +/* 9ec3 */ NULL, +/* 9ec4 */ NULL, +/* 9ec5 */ NULL, +/* 9ec6 */ NULL, +/* 9ec7 */ NULL, +/* 9ec8 */ NULL, +/* 9ec9 */ NULL, +/* 9eca */ NULL, +/* 9ecb */ NULL, +/* 9ecc */ NULL, +/* 9ecd */ NULL, +/* 9ece */ NULL, +/* 9ecf */ NULL, +/* 9ed0 */ NULL, +/* 9ed1 */ NULL, +/* 9ed2 */ NULL, +/* 9ed3 */ NULL, +/* 9ed4 */ NULL, +/* 9ed5 */ NULL, +/* 9ed6 */ NULL, +/* 9ed7 */ NULL, +/* 9ed8 */ NULL, +/* 9ed9 */ NULL, +/* 9eda */ NULL, +/* 9edb */ NULL, +/* 9edc */ NULL, +/* 9edd */ NULL, +/* 9ede */ NULL, +/* 9edf */ NULL, +/* 9ee0 */ NULL, +/* 9ee1 */ NULL, +/* 9ee2 */ NULL, +/* 9ee3 */ NULL, +/* 9ee4 */ NULL, +/* 9ee5 */ NULL, +/* 9ee6 */ NULL, +/* 9ee7 */ NULL, +/* 9ee8 */ NULL, +/* 9ee9 */ NULL, +/* 9eea */ NULL, +/* 9eeb */ NULL, +/* 9eec */ NULL, +/* 9eed */ NULL, +/* 9eee */ NULL, +/* 9eef */ NULL, +/* 9ef0 */ NULL, +/* 9ef1 */ NULL, +/* 9ef2 */ NULL, +/* 9ef3 */ NULL, +/* 9ef4 */ NULL, +/* 9ef5 */ NULL, +/* 9ef6 */ NULL, +/* 9ef7 */ NULL, +/* 9ef8 */ NULL, +/* 9ef9 */ NULL, +/* 9efa */ NULL, +/* 9efb */ NULL, +/* 9efc */ NULL, +/* 9efd */ NULL, +/* 9efe */ NULL, +/* 9eff */ NULL, +/* 9f00 */ NULL, +/* 9f01 */ NULL, +/* 9f02 */ NULL, +/* 9f03 */ NULL, +/* 9f04 */ NULL, +/* 9f05 */ NULL, +/* 9f06 */ NULL, +/* 9f07 */ NULL, +/* 9f08 */ NULL, +/* 9f09 */ NULL, +/* 9f0a */ NULL, +/* 9f0b */ NULL, +/* 9f0c */ NULL, +/* 9f0d */ NULL, +/* 9f0e */ NULL, +/* 9f0f */ NULL, +/* 9f10 */ NULL, +/* 9f11 */ NULL, +/* 9f12 */ NULL, +/* 9f13 */ NULL, +/* 9f14 */ NULL, +/* 9f15 */ NULL, +/* 9f16 */ NULL, +/* 9f17 */ NULL, +/* 9f18 */ NULL, +/* 9f19 */ NULL, +/* 9f1a */ NULL, +/* 9f1b */ NULL, +/* 9f1c */ NULL, +/* 9f1d */ NULL, +/* 9f1e */ NULL, +/* 9f1f */ NULL, +/* 9f20 */ NULL, +/* 9f21 */ NULL, +/* 9f22 */ NULL, +/* 9f23 */ NULL, +/* 9f24 */ NULL, +/* 9f25 */ NULL, +/* 9f26 */ NULL, +/* 9f27 */ NULL, +/* 9f28 */ NULL, +/* 9f29 */ NULL, +/* 9f2a */ NULL, +/* 9f2b */ NULL, +/* 9f2c */ NULL, +/* 9f2d */ NULL, +/* 9f2e */ NULL, +/* 9f2f */ NULL, +/* 9f30 */ NULL, +/* 9f31 */ NULL, +/* 9f32 */ NULL, +/* 9f33 */ NULL, +/* 9f34 */ NULL, +/* 9f35 */ NULL, +/* 9f36 */ NULL, +/* 9f37 */ NULL, +/* 9f38 */ NULL, +/* 9f39 */ NULL, +/* 9f3a */ NULL, +/* 9f3b */ NULL, +/* 9f3c */ NULL, +/* 9f3d */ NULL, +/* 9f3e */ NULL, +/* 9f3f */ NULL, +/* 9f40 */ NULL, +/* 9f41 */ NULL, +/* 9f42 */ NULL, +/* 9f43 */ NULL, +/* 9f44 */ NULL, +/* 9f45 */ NULL, +/* 9f46 */ NULL, +/* 9f47 */ NULL, +/* 9f48 */ NULL, +/* 9f49 */ NULL, +/* 9f4a */ NULL, +/* 9f4b */ NULL, +/* 9f4c */ NULL, +/* 9f4d */ NULL, +/* 9f4e */ NULL, +/* 9f4f */ NULL, +/* 9f50 */ NULL, +/* 9f51 */ NULL, +/* 9f52 */ NULL, +/* 9f53 */ NULL, +/* 9f54 */ NULL, +/* 9f55 */ NULL, +/* 9f56 */ NULL, +/* 9f57 */ NULL, +/* 9f58 */ NULL, +/* 9f59 */ NULL, +/* 9f5a */ NULL, +/* 9f5b */ NULL, +/* 9f5c */ NULL, +/* 9f5d */ NULL, +/* 9f5e */ NULL, +/* 9f5f */ NULL, +/* 9f60 */ NULL, +/* 9f61 */ NULL, +/* 9f62 */ NULL, +/* 9f63 */ NULL, +/* 9f64 */ NULL, +/* 9f65 */ NULL, +/* 9f66 */ NULL, +/* 9f67 */ NULL, +/* 9f68 */ NULL, +/* 9f69 */ NULL, +/* 9f6a */ NULL, +/* 9f6b */ NULL, +/* 9f6c */ NULL, +/* 9f6d */ NULL, +/* 9f6e */ NULL, +/* 9f6f */ NULL, +/* 9f70 */ NULL, +/* 9f71 */ NULL, +/* 9f72 */ NULL, +/* 9f73 */ NULL, +/* 9f74 */ NULL, +/* 9f75 */ NULL, +/* 9f76 */ NULL, +/* 9f77 */ NULL, +/* 9f78 */ NULL, +/* 9f79 */ NULL, +/* 9f7a */ NULL, +/* 9f7b */ NULL, +/* 9f7c */ NULL, +/* 9f7d */ NULL, +/* 9f7e */ NULL, +/* 9f7f */ NULL, +/* 9f80 */ NULL, +/* 9f81 */ NULL, +/* 9f82 */ NULL, +/* 9f83 */ NULL, +/* 9f84 */ NULL, +/* 9f85 */ NULL, +/* 9f86 */ NULL, +/* 9f87 */ NULL, +/* 9f88 */ NULL, +/* 9f89 */ NULL, +/* 9f8a */ NULL, +/* 9f8b */ NULL, +/* 9f8c */ NULL, +/* 9f8d */ NULL, +/* 9f8e */ NULL, +/* 9f8f */ NULL, +/* 9f90 */ NULL, +/* 9f91 */ NULL, +/* 9f92 */ NULL, +/* 9f93 */ NULL, +/* 9f94 */ NULL, +/* 9f95 */ NULL, +/* 9f96 */ NULL, +/* 9f97 */ NULL, +/* 9f98 */ NULL, +/* 9f99 */ NULL, +/* 9f9a */ NULL, +/* 9f9b */ NULL, +/* 9f9c */ NULL, +/* 9f9d */ NULL, +/* 9f9e */ NULL, +/* 9f9f */ NULL, +/* 9fa0 */ NULL, +/* 9fa1 */ NULL, +/* 9fa2 */ NULL, +/* 9fa3 */ NULL, +/* 9fa4 */ NULL, +/* 9fa5 */ NULL, +/* 9fa6 */ NULL, +/* 9fa7 */ NULL, +/* 9fa8 */ NULL, +/* 9fa9 */ NULL, +/* 9faa */ NULL, +/* 9fab */ NULL, +/* 9fac */ NULL, +/* 9fad */ NULL, +/* 9fae */ NULL, +/* 9faf */ NULL, +/* 9fb0 */ NULL, +/* 9fb1 */ NULL, +/* 9fb2 */ NULL, +/* 9fb3 */ NULL, +/* 9fb4 */ NULL, +/* 9fb5 */ NULL, +/* 9fb6 */ NULL, +/* 9fb7 */ NULL, +/* 9fb8 */ NULL, +/* 9fb9 */ NULL, +/* 9fba */ NULL, +/* 9fbb */ NULL, +/* 9fbc */ NULL, +/* 9fbd */ NULL, +/* 9fbe */ NULL, +/* 9fbf */ NULL, +/* 9fc0 */ NULL, +/* 9fc1 */ NULL, +/* 9fc2 */ NULL, +/* 9fc3 */ NULL, +/* 9fc4 */ NULL, +/* 9fc5 */ NULL, +/* 9fc6 */ NULL, +/* 9fc7 */ NULL, +/* 9fc8 */ NULL, +/* 9fc9 */ NULL, +/* 9fca */ NULL, +/* 9fcb */ NULL, +/* 9fcc */ NULL, +/* 9fcd */ NULL, +/* 9fce */ NULL, +/* 9fcf */ NULL, +/* 9fd0 */ NULL, +/* 9fd1 */ NULL, +/* 9fd2 */ NULL, +/* 9fd3 */ NULL, +/* 9fd4 */ NULL, +/* 9fd5 */ NULL, +/* 9fd6 */ NULL, +/* 9fd7 */ NULL, +/* 9fd8 */ NULL, +/* 9fd9 */ NULL, +/* 9fda */ NULL, +/* 9fdb */ NULL, +/* 9fdc */ NULL, +/* 9fdd */ NULL, +/* 9fde */ NULL, +/* 9fdf */ NULL, +/* 9fe0 */ NULL, +/* 9fe1 */ NULL, +/* 9fe2 */ NULL, +/* 9fe3 */ NULL, +/* 9fe4 */ NULL, +/* 9fe5 */ NULL, +/* 9fe6 */ NULL, +/* 9fe7 */ NULL, +/* 9fe8 */ NULL, +/* 9fe9 */ NULL, +/* 9fea */ NULL, +/* 9feb */ NULL, +/* 9fec */ NULL, +/* 9fed */ NULL, +/* 9fee */ NULL, +/* 9fef */ NULL, +/* 9ff0 */ NULL, +/* 9ff1 */ NULL, +/* 9ff2 */ NULL, +/* 9ff3 */ NULL, +/* 9ff4 */ NULL, +/* 9ff5 */ NULL, +/* 9ff6 */ NULL, +/* 9ff7 */ NULL, +/* 9ff8 */ NULL, +/* 9ff9 */ NULL, +/* 9ffa */ NULL, +/* 9ffb */ NULL, +/* 9ffc */ NULL, +/* 9ffd */ NULL, +/* 9ffe */ NULL, +/* 9fff */ NULL, +/* a000 */ NULL, +/* a001 */ NULL, +/* a002 */ NULL, +/* a003 */ NULL, +/* a004 */ NULL, +/* a005 */ NULL, +/* a006 */ NULL, +/* a007 */ NULL, +/* a008 */ NULL, +/* a009 */ NULL, +/* a00a */ NULL, +/* a00b */ NULL, +/* a00c */ NULL, +/* a00d */ NULL, +/* a00e */ NULL, +/* a00f */ NULL, +/* a010 */ NULL, +/* a011 */ NULL, +/* a012 */ NULL, +/* a013 */ NULL, +/* a014 */ NULL, +/* a015 */ NULL, +/* a016 */ NULL, +/* a017 */ NULL, +/* a018 */ NULL, +/* a019 */ NULL, +/* a01a */ NULL, +/* a01b */ NULL, +/* a01c */ NULL, +/* a01d */ NULL, +/* a01e */ NULL, +/* a01f */ NULL, +/* a020 */ NULL, +/* a021 */ NULL, +/* a022 */ NULL, +/* a023 */ NULL, +/* a024 */ NULL, +/* a025 */ NULL, +/* a026 */ NULL, +/* a027 */ NULL, +/* a028 */ NULL, +/* a029 */ NULL, +/* a02a */ NULL, +/* a02b */ NULL, +/* a02c */ NULL, +/* a02d */ NULL, +/* a02e */ NULL, +/* a02f */ NULL, +/* a030 */ NULL, +/* a031 */ NULL, +/* a032 */ NULL, +/* a033 */ NULL, +/* a034 */ NULL, +/* a035 */ NULL, +/* a036 */ NULL, +/* a037 */ NULL, +/* a038 */ NULL, +/* a039 */ NULL, +/* a03a */ NULL, +/* a03b */ NULL, +/* a03c */ NULL, +/* a03d */ NULL, +/* a03e */ NULL, +/* a03f */ NULL, +/* a040 */ NULL, +/* a041 */ NULL, +/* a042 */ NULL, +/* a043 */ NULL, +/* a044 */ NULL, +/* a045 */ NULL, +/* a046 */ NULL, +/* a047 */ NULL, +/* a048 */ NULL, +/* a049 */ NULL, +/* a04a */ NULL, +/* a04b */ NULL, +/* a04c */ NULL, +/* a04d */ NULL, +/* a04e */ NULL, +/* a04f */ NULL, +/* a050 */ NULL, +/* a051 */ NULL, +/* a052 */ NULL, +/* a053 */ NULL, +/* a054 */ NULL, +/* a055 */ NULL, +/* a056 */ NULL, +/* a057 */ NULL, +/* a058 */ NULL, +/* a059 */ NULL, +/* a05a */ NULL, +/* a05b */ NULL, +/* a05c */ NULL, +/* a05d */ NULL, +/* a05e */ NULL, +/* a05f */ NULL, +/* a060 */ NULL, +/* a061 */ NULL, +/* a062 */ NULL, +/* a063 */ NULL, +/* a064 */ NULL, +/* a065 */ NULL, +/* a066 */ NULL, +/* a067 */ NULL, +/* a068 */ NULL, +/* a069 */ NULL, +/* a06a */ NULL, +/* a06b */ NULL, +/* a06c */ NULL, +/* a06d */ NULL, +/* a06e */ NULL, +/* a06f */ NULL, +/* a070 */ NULL, +/* a071 */ NULL, +/* a072 */ NULL, +/* a073 */ NULL, +/* a074 */ NULL, +/* a075 */ NULL, +/* a076 */ NULL, +/* a077 */ NULL, +/* a078 */ NULL, +/* a079 */ NULL, +/* a07a */ NULL, +/* a07b */ NULL, +/* a07c */ NULL, +/* a07d */ NULL, +/* a07e */ NULL, +/* a07f */ NULL, +/* a080 */ NULL, +/* a081 */ NULL, +/* a082 */ NULL, +/* a083 */ NULL, +/* a084 */ NULL, +/* a085 */ NULL, +/* a086 */ NULL, +/* a087 */ NULL, +/* a088 */ NULL, +/* a089 */ NULL, +/* a08a */ NULL, +/* a08b */ NULL, +/* a08c */ NULL, +/* a08d */ NULL, +/* a08e */ NULL, +/* a08f */ NULL, +/* a090 */ NULL, +/* a091 */ NULL, +/* a092 */ NULL, +/* a093 */ NULL, +/* a094 */ NULL, +/* a095 */ NULL, +/* a096 */ NULL, +/* a097 */ NULL, +/* a098 */ NULL, +/* a099 */ NULL, +/* a09a */ NULL, +/* a09b */ NULL, +/* a09c */ NULL, +/* a09d */ NULL, +/* a09e */ NULL, +/* a09f */ NULL, +/* a0a0 */ NULL, +/* a0a1 */ NULL, +/* a0a2 */ NULL, +/* a0a3 */ NULL, +/* a0a4 */ NULL, +/* a0a5 */ NULL, +/* a0a6 */ NULL, +/* a0a7 */ NULL, +/* a0a8 */ NULL, +/* a0a9 */ NULL, +/* a0aa */ NULL, +/* a0ab */ NULL, +/* a0ac */ NULL, +/* a0ad */ NULL, +/* a0ae */ NULL, +/* a0af */ NULL, +/* a0b0 */ NULL, +/* a0b1 */ NULL, +/* a0b2 */ NULL, +/* a0b3 */ NULL, +/* a0b4 */ NULL, +/* a0b5 */ NULL, +/* a0b6 */ NULL, +/* a0b7 */ NULL, +/* a0b8 */ NULL, +/* a0b9 */ NULL, +/* a0ba */ NULL, +/* a0bb */ NULL, +/* a0bc */ NULL, +/* a0bd */ NULL, +/* a0be */ NULL, +/* a0bf */ NULL, +/* a0c0 */ NULL, +/* a0c1 */ NULL, +/* a0c2 */ NULL, +/* a0c3 */ NULL, +/* a0c4 */ NULL, +/* a0c5 */ NULL, +/* a0c6 */ NULL, +/* a0c7 */ NULL, +/* a0c8 */ NULL, +/* a0c9 */ NULL, +/* a0ca */ NULL, +/* a0cb */ NULL, +/* a0cc */ NULL, +/* a0cd */ NULL, +/* a0ce */ NULL, +/* a0cf */ NULL, +/* a0d0 */ NULL, +/* a0d1 */ NULL, +/* a0d2 */ NULL, +/* a0d3 */ NULL, +/* a0d4 */ NULL, +/* a0d5 */ NULL, +/* a0d6 */ NULL, +/* a0d7 */ NULL, +/* a0d8 */ NULL, +/* a0d9 */ NULL, +/* a0da */ NULL, +/* a0db */ NULL, +/* a0dc */ NULL, +/* a0dd */ NULL, +/* a0de */ NULL, +/* a0df */ NULL, +/* a0e0 */ NULL, +/* a0e1 */ NULL, +/* a0e2 */ NULL, +/* a0e3 */ NULL, +/* a0e4 */ NULL, +/* a0e5 */ NULL, +/* a0e6 */ NULL, +/* a0e7 */ NULL, +/* a0e8 */ NULL, +/* a0e9 */ NULL, +/* a0ea */ NULL, +/* a0eb */ NULL, +/* a0ec */ NULL, +/* a0ed */ NULL, +/* a0ee */ NULL, +/* a0ef */ NULL, +/* a0f0 */ NULL, +/* a0f1 */ NULL, +/* a0f2 */ NULL, +/* a0f3 */ NULL, +/* a0f4 */ NULL, +/* a0f5 */ NULL, +/* a0f6 */ NULL, +/* a0f7 */ NULL, +/* a0f8 */ NULL, +/* a0f9 */ NULL, +/* a0fa */ NULL, +/* a0fb */ NULL, +/* a0fc */ NULL, +/* a0fd */ NULL, +/* a0fe */ NULL, +/* a0ff */ NULL, +/* a100 */ NULL, +/* a101 */ NULL, +/* a102 */ NULL, +/* a103 */ NULL, +/* a104 */ NULL, +/* a105 */ NULL, +/* a106 */ NULL, +/* a107 */ NULL, +/* a108 */ NULL, +/* a109 */ NULL, +/* a10a */ NULL, +/* a10b */ NULL, +/* a10c */ NULL, +/* a10d */ NULL, +/* a10e */ NULL, +/* a10f */ NULL, +/* a110 */ NULL, +/* a111 */ NULL, +/* a112 */ NULL, +/* a113 */ NULL, +/* a114 */ NULL, +/* a115 */ NULL, +/* a116 */ NULL, +/* a117 */ NULL, +/* a118 */ NULL, +/* a119 */ NULL, +/* a11a */ NULL, +/* a11b */ NULL, +/* a11c */ NULL, +/* a11d */ NULL, +/* a11e */ NULL, +/* a11f */ NULL, +/* a120 */ NULL, +/* a121 */ NULL, +/* a122 */ NULL, +/* a123 */ NULL, +/* a124 */ NULL, +/* a125 */ NULL, +/* a126 */ NULL, +/* a127 */ NULL, +/* a128 */ NULL, +/* a129 */ NULL, +/* a12a */ NULL, +/* a12b */ NULL, +/* a12c */ NULL, +/* a12d */ NULL, +/* a12e */ NULL, +/* a12f */ NULL, +/* a130 */ NULL, +/* a131 */ NULL, +/* a132 */ NULL, +/* a133 */ NULL, +/* a134 */ NULL, +/* a135 */ NULL, +/* a136 */ NULL, +/* a137 */ NULL, +/* a138 */ NULL, +/* a139 */ NULL, +/* a13a */ NULL, +/* a13b */ NULL, +/* a13c */ NULL, +/* a13d */ NULL, +/* a13e */ NULL, +/* a13f */ NULL, +/* a140 */ NULL, +/* a141 */ NULL, +/* a142 */ NULL, +/* a143 */ NULL, +/* a144 */ NULL, +/* a145 */ NULL, +/* a146 */ NULL, +/* a147 */ NULL, +/* a148 */ NULL, +/* a149 */ NULL, +/* a14a */ NULL, +/* a14b */ NULL, +/* a14c */ NULL, +/* a14d */ NULL, +/* a14e */ NULL, +/* a14f */ NULL, +/* a150 */ NULL, +/* a151 */ NULL, +/* a152 */ NULL, +/* a153 */ NULL, +/* a154 */ NULL, +/* a155 */ NULL, +/* a156 */ NULL, +/* a157 */ NULL, +/* a158 */ NULL, +/* a159 */ NULL, +/* a15a */ NULL, +/* a15b */ NULL, +/* a15c */ NULL, +/* a15d */ NULL, +/* a15e */ NULL, +/* a15f */ NULL, +/* a160 */ NULL, +/* a161 */ NULL, +/* a162 */ NULL, +/* a163 */ NULL, +/* a164 */ NULL, +/* a165 */ NULL, +/* a166 */ NULL, +/* a167 */ NULL, +/* a168 */ NULL, +/* a169 */ NULL, +/* a16a */ NULL, +/* a16b */ NULL, +/* a16c */ NULL, +/* a16d */ NULL, +/* a16e */ NULL, +/* a16f */ NULL, +/* a170 */ NULL, +/* a171 */ NULL, +/* a172 */ NULL, +/* a173 */ NULL, +/* a174 */ NULL, +/* a175 */ NULL, +/* a176 */ NULL, +/* a177 */ NULL, +/* a178 */ NULL, +/* a179 */ NULL, +/* a17a */ NULL, +/* a17b */ NULL, +/* a17c */ NULL, +/* a17d */ NULL, +/* a17e */ NULL, +/* a17f */ NULL, +/* a180 */ NULL, +/* a181 */ NULL, +/* a182 */ NULL, +/* a183 */ NULL, +/* a184 */ NULL, +/* a185 */ NULL, +/* a186 */ NULL, +/* a187 */ NULL, +/* a188 */ NULL, +/* a189 */ NULL, +/* a18a */ NULL, +/* a18b */ NULL, +/* a18c */ NULL, +/* a18d */ NULL, +/* a18e */ NULL, +/* a18f */ NULL, +/* a190 */ NULL, +/* a191 */ NULL, +/* a192 */ NULL, +/* a193 */ NULL, +/* a194 */ NULL, +/* a195 */ NULL, +/* a196 */ NULL, +/* a197 */ NULL, +/* a198 */ NULL, +/* a199 */ NULL, +/* a19a */ NULL, +/* a19b */ NULL, +/* a19c */ NULL, +/* a19d */ NULL, +/* a19e */ NULL, +/* a19f */ NULL, +/* a1a0 */ NULL, +/* a1a1 */ NULL, +/* a1a2 */ NULL, +/* a1a3 */ NULL, +/* a1a4 */ NULL, +/* a1a5 */ NULL, +/* a1a6 */ NULL, +/* a1a7 */ NULL, +/* a1a8 */ NULL, +/* a1a9 */ NULL, +/* a1aa */ NULL, +/* a1ab */ NULL, +/* a1ac */ NULL, +/* a1ad */ NULL, +/* a1ae */ NULL, +/* a1af */ NULL, +/* a1b0 */ NULL, +/* a1b1 */ NULL, +/* a1b2 */ NULL, +/* a1b3 */ NULL, +/* a1b4 */ NULL, +/* a1b5 */ NULL, +/* a1b6 */ NULL, +/* a1b7 */ NULL, +/* a1b8 */ NULL, +/* a1b9 */ NULL, +/* a1ba */ NULL, +/* a1bb */ NULL, +/* a1bc */ NULL, +/* a1bd */ NULL, +/* a1be */ NULL, +/* a1bf */ NULL, +/* a1c0 */ NULL, +/* a1c1 */ NULL, +/* a1c2 */ NULL, +/* a1c3 */ NULL, +/* a1c4 */ NULL, +/* a1c5 */ NULL, +/* a1c6 */ NULL, +/* a1c7 */ NULL, +/* a1c8 */ NULL, +/* a1c9 */ NULL, +/* a1ca */ NULL, +/* a1cb */ NULL, +/* a1cc */ NULL, +/* a1cd */ NULL, +/* a1ce */ NULL, +/* a1cf */ NULL, +/* a1d0 */ NULL, +/* a1d1 */ NULL, +/* a1d2 */ NULL, +/* a1d3 */ NULL, +/* a1d4 */ NULL, +/* a1d5 */ NULL, +/* a1d6 */ NULL, +/* a1d7 */ NULL, +/* a1d8 */ NULL, +/* a1d9 */ NULL, +/* a1da */ NULL, +/* a1db */ NULL, +/* a1dc */ NULL, +/* a1dd */ NULL, +/* a1de */ NULL, +/* a1df */ NULL, +/* a1e0 */ NULL, +/* a1e1 */ NULL, +/* a1e2 */ NULL, +/* a1e3 */ NULL, +/* a1e4 */ NULL, +/* a1e5 */ NULL, +/* a1e6 */ NULL, +/* a1e7 */ NULL, +/* a1e8 */ NULL, +/* a1e9 */ NULL, +/* a1ea */ NULL, +/* a1eb */ NULL, +/* a1ec */ NULL, +/* a1ed */ NULL, +/* a1ee */ NULL, +/* a1ef */ NULL, +/* a1f0 */ NULL, +/* a1f1 */ NULL, +/* a1f2 */ NULL, +/* a1f3 */ NULL, +/* a1f4 */ NULL, +/* a1f5 */ NULL, +/* a1f6 */ NULL, +/* a1f7 */ NULL, +/* a1f8 */ NULL, +/* a1f9 */ NULL, +/* a1fa */ NULL, +/* a1fb */ NULL, +/* a1fc */ NULL, +/* a1fd */ NULL, +/* a1fe */ NULL, +/* a1ff */ NULL, +/* a200 */ NULL, +/* a201 */ NULL, +/* a202 */ NULL, +/* a203 */ NULL, +/* a204 */ NULL, +/* a205 */ NULL, +/* a206 */ NULL, +/* a207 */ NULL, +/* a208 */ NULL, +/* a209 */ NULL, +/* a20a */ NULL, +/* a20b */ NULL, +/* a20c */ NULL, +/* a20d */ NULL, +/* a20e */ NULL, +/* a20f */ NULL, +/* a210 */ NULL, +/* a211 */ NULL, +/* a212 */ NULL, +/* a213 */ NULL, +/* a214 */ NULL, +/* a215 */ NULL, +/* a216 */ NULL, +/* a217 */ NULL, +/* a218 */ NULL, +/* a219 */ NULL, +/* a21a */ NULL, +/* a21b */ NULL, +/* a21c */ NULL, +/* a21d */ NULL, +/* a21e */ NULL, +/* a21f */ NULL, +/* a220 */ NULL, +/* a221 */ NULL, +/* a222 */ NULL, +/* a223 */ NULL, +/* a224 */ NULL, +/* a225 */ NULL, +/* a226 */ NULL, +/* a227 */ NULL, +/* a228 */ NULL, +/* a229 */ NULL, +/* a22a */ NULL, +/* a22b */ NULL, +/* a22c */ NULL, +/* a22d */ NULL, +/* a22e */ NULL, +/* a22f */ NULL, +/* a230 */ NULL, +/* a231 */ NULL, +/* a232 */ NULL, +/* a233 */ NULL, +/* a234 */ NULL, +/* a235 */ NULL, +/* a236 */ NULL, +/* a237 */ NULL, +/* a238 */ NULL, +/* a239 */ NULL, +/* a23a */ NULL, +/* a23b */ NULL, +/* a23c */ NULL, +/* a23d */ NULL, +/* a23e */ NULL, +/* a23f */ NULL, +/* a240 */ NULL, +/* a241 */ NULL, +/* a242 */ NULL, +/* a243 */ NULL, +/* a244 */ NULL, +/* a245 */ NULL, +/* a246 */ NULL, +/* a247 */ NULL, +/* a248 */ NULL, +/* a249 */ NULL, +/* a24a */ NULL, +/* a24b */ NULL, +/* a24c */ NULL, +/* a24d */ NULL, +/* a24e */ NULL, +/* a24f */ NULL, +/* a250 */ NULL, +/* a251 */ NULL, +/* a252 */ NULL, +/* a253 */ NULL, +/* a254 */ NULL, +/* a255 */ NULL, +/* a256 */ NULL, +/* a257 */ NULL, +/* a258 */ NULL, +/* a259 */ NULL, +/* a25a */ NULL, +/* a25b */ NULL, +/* a25c */ NULL, +/* a25d */ NULL, +/* a25e */ NULL, +/* a25f */ NULL, +/* a260 */ NULL, +/* a261 */ NULL, +/* a262 */ NULL, +/* a263 */ NULL, +/* a264 */ NULL, +/* a265 */ NULL, +/* a266 */ NULL, +/* a267 */ NULL, +/* a268 */ NULL, +/* a269 */ NULL, +/* a26a */ NULL, +/* a26b */ NULL, +/* a26c */ NULL, +/* a26d */ NULL, +/* a26e */ NULL, +/* a26f */ NULL, +/* a270 */ NULL, +/* a271 */ NULL, +/* a272 */ NULL, +/* a273 */ NULL, +/* a274 */ NULL, +/* a275 */ NULL, +/* a276 */ NULL, +/* a277 */ NULL, +/* a278 */ NULL, +/* a279 */ NULL, +/* a27a */ NULL, +/* a27b */ NULL, +/* a27c */ NULL, +/* a27d */ NULL, +/* a27e */ NULL, +/* a27f */ NULL, +/* a280 */ NULL, +/* a281 */ NULL, +/* a282 */ NULL, +/* a283 */ NULL, +/* a284 */ NULL, +/* a285 */ NULL, +/* a286 */ NULL, +/* a287 */ NULL, +/* a288 */ NULL, +/* a289 */ NULL, +/* a28a */ NULL, +/* a28b */ NULL, +/* a28c */ NULL, +/* a28d */ NULL, +/* a28e */ NULL, +/* a28f */ NULL, +/* a290 */ NULL, +/* a291 */ NULL, +/* a292 */ NULL, +/* a293 */ NULL, +/* a294 */ NULL, +/* a295 */ NULL, +/* a296 */ NULL, +/* a297 */ NULL, +/* a298 */ NULL, +/* a299 */ NULL, +/* a29a */ NULL, +/* a29b */ NULL, +/* a29c */ NULL, +/* a29d */ NULL, +/* a29e */ NULL, +/* a29f */ NULL, +/* a2a0 */ NULL, +/* a2a1 */ NULL, +/* a2a2 */ NULL, +/* a2a3 */ NULL, +/* a2a4 */ NULL, +/* a2a5 */ NULL, +/* a2a6 */ NULL, +/* a2a7 */ NULL, +/* a2a8 */ NULL, +/* a2a9 */ NULL, +/* a2aa */ NULL, +/* a2ab */ NULL, +/* a2ac */ NULL, +/* a2ad */ NULL, +/* a2ae */ NULL, +/* a2af */ NULL, +/* a2b0 */ NULL, +/* a2b1 */ NULL, +/* a2b2 */ NULL, +/* a2b3 */ NULL, +/* a2b4 */ NULL, +/* a2b5 */ NULL, +/* a2b6 */ NULL, +/* a2b7 */ NULL, +/* a2b8 */ NULL, +/* a2b9 */ NULL, +/* a2ba */ NULL, +/* a2bb */ NULL, +/* a2bc */ NULL, +/* a2bd */ NULL, +/* a2be */ NULL, +/* a2bf */ NULL, +/* a2c0 */ NULL, +/* a2c1 */ NULL, +/* a2c2 */ NULL, +/* a2c3 */ NULL, +/* a2c4 */ NULL, +/* a2c5 */ NULL, +/* a2c6 */ NULL, +/* a2c7 */ NULL, +/* a2c8 */ NULL, +/* a2c9 */ NULL, +/* a2ca */ NULL, +/* a2cb */ NULL, +/* a2cc */ NULL, +/* a2cd */ NULL, +/* a2ce */ NULL, +/* a2cf */ NULL, +/* a2d0 */ NULL, +/* a2d1 */ NULL, +/* a2d2 */ NULL, +/* a2d3 */ NULL, +/* a2d4 */ NULL, +/* a2d5 */ NULL, +/* a2d6 */ NULL, +/* a2d7 */ NULL, +/* a2d8 */ NULL, +/* a2d9 */ NULL, +/* a2da */ NULL, +/* a2db */ NULL, +/* a2dc */ NULL, +/* a2dd */ NULL, +/* a2de */ NULL, +/* a2df */ NULL, +/* a2e0 */ NULL, +/* a2e1 */ NULL, +/* a2e2 */ NULL, +/* a2e3 */ NULL, +/* a2e4 */ NULL, +/* a2e5 */ NULL, +/* a2e6 */ NULL, +/* a2e7 */ NULL, +/* a2e8 */ NULL, +/* a2e9 */ NULL, +/* a2ea */ NULL, +/* a2eb */ NULL, +/* a2ec */ NULL, +/* a2ed */ NULL, +/* a2ee */ NULL, +/* a2ef */ NULL, +/* a2f0 */ NULL, +/* a2f1 */ NULL, +/* a2f2 */ NULL, +/* a2f3 */ NULL, +/* a2f4 */ NULL, +/* a2f5 */ NULL, +/* a2f6 */ NULL, +/* a2f7 */ NULL, +/* a2f8 */ NULL, +/* a2f9 */ NULL, +/* a2fa */ NULL, +/* a2fb */ NULL, +/* a2fc */ NULL, +/* a2fd */ NULL, +/* a2fe */ NULL, +/* a2ff */ NULL, +/* a300 */ NULL, +/* a301 */ NULL, +/* a302 */ NULL, +/* a303 */ NULL, +/* a304 */ NULL, +/* a305 */ NULL, +/* a306 */ NULL, +/* a307 */ NULL, +/* a308 */ NULL, +/* a309 */ NULL, +/* a30a */ NULL, +/* a30b */ NULL, +/* a30c */ NULL, +/* a30d */ NULL, +/* a30e */ NULL, +/* a30f */ NULL, +/* a310 */ NULL, +/* a311 */ NULL, +/* a312 */ NULL, +/* a313 */ NULL, +/* a314 */ NULL, +/* a315 */ NULL, +/* a316 */ NULL, +/* a317 */ NULL, +/* a318 */ NULL, +/* a319 */ NULL, +/* a31a */ NULL, +/* a31b */ NULL, +/* a31c */ NULL, +/* a31d */ NULL, +/* a31e */ NULL, +/* a31f */ NULL, +/* a320 */ NULL, +/* a321 */ NULL, +/* a322 */ NULL, +/* a323 */ NULL, +/* a324 */ NULL, +/* a325 */ NULL, +/* a326 */ NULL, +/* a327 */ NULL, +/* a328 */ NULL, +/* a329 */ NULL, +/* a32a */ NULL, +/* a32b */ NULL, +/* a32c */ NULL, +/* a32d */ NULL, +/* a32e */ NULL, +/* a32f */ NULL, +/* a330 */ NULL, +/* a331 */ NULL, +/* a332 */ NULL, +/* a333 */ NULL, +/* a334 */ NULL, +/* a335 */ NULL, +/* a336 */ NULL, +/* a337 */ NULL, +/* a338 */ NULL, +/* a339 */ NULL, +/* a33a */ NULL, +/* a33b */ NULL, +/* a33c */ NULL, +/* a33d */ NULL, +/* a33e */ NULL, +/* a33f */ NULL, +/* a340 */ NULL, +/* a341 */ NULL, +/* a342 */ NULL, +/* a343 */ NULL, +/* a344 */ NULL, +/* a345 */ NULL, +/* a346 */ NULL, +/* a347 */ NULL, +/* a348 */ NULL, +/* a349 */ NULL, +/* a34a */ NULL, +/* a34b */ NULL, +/* a34c */ NULL, +/* a34d */ NULL, +/* a34e */ NULL, +/* a34f */ NULL, +/* a350 */ NULL, +/* a351 */ NULL, +/* a352 */ NULL, +/* a353 */ NULL, +/* a354 */ NULL, +/* a355 */ NULL, +/* a356 */ NULL, +/* a357 */ NULL, +/* a358 */ NULL, +/* a359 */ NULL, +/* a35a */ NULL, +/* a35b */ NULL, +/* a35c */ NULL, +/* a35d */ NULL, +/* a35e */ NULL, +/* a35f */ NULL, +/* a360 */ NULL, +/* a361 */ NULL, +/* a362 */ NULL, +/* a363 */ NULL, +/* a364 */ NULL, +/* a365 */ NULL, +/* a366 */ NULL, +/* a367 */ NULL, +/* a368 */ NULL, +/* a369 */ NULL, +/* a36a */ NULL, +/* a36b */ NULL, +/* a36c */ NULL, +/* a36d */ NULL, +/* a36e */ NULL, +/* a36f */ NULL, +/* a370 */ NULL, +/* a371 */ NULL, +/* a372 */ NULL, +/* a373 */ NULL, +/* a374 */ NULL, +/* a375 */ NULL, +/* a376 */ NULL, +/* a377 */ NULL, +/* a378 */ NULL, +/* a379 */ NULL, +/* a37a */ NULL, +/* a37b */ NULL, +/* a37c */ NULL, +/* a37d */ NULL, +/* a37e */ NULL, +/* a37f */ NULL, +/* a380 */ NULL, +/* a381 */ NULL, +/* a382 */ NULL, +/* a383 */ NULL, +/* a384 */ NULL, +/* a385 */ NULL, +/* a386 */ NULL, +/* a387 */ NULL, +/* a388 */ NULL, +/* a389 */ NULL, +/* a38a */ NULL, +/* a38b */ NULL, +/* a38c */ NULL, +/* a38d */ NULL, +/* a38e */ NULL, +/* a38f */ NULL, +/* a390 */ NULL, +/* a391 */ NULL, +/* a392 */ NULL, +/* a393 */ NULL, +/* a394 */ NULL, +/* a395 */ NULL, +/* a396 */ NULL, +/* a397 */ NULL, +/* a398 */ NULL, +/* a399 */ NULL, +/* a39a */ NULL, +/* a39b */ NULL, +/* a39c */ NULL, +/* a39d */ NULL, +/* a39e */ NULL, +/* a39f */ NULL, +/* a3a0 */ NULL, +/* a3a1 */ NULL, +/* a3a2 */ NULL, +/* a3a3 */ NULL, +/* a3a4 */ NULL, +/* a3a5 */ NULL, +/* a3a6 */ NULL, +/* a3a7 */ NULL, +/* a3a8 */ NULL, +/* a3a9 */ NULL, +/* a3aa */ NULL, +/* a3ab */ NULL, +/* a3ac */ NULL, +/* a3ad */ NULL, +/* a3ae */ NULL, +/* a3af */ NULL, +/* a3b0 */ NULL, +/* a3b1 */ NULL, +/* a3b2 */ NULL, +/* a3b3 */ NULL, +/* a3b4 */ NULL, +/* a3b5 */ NULL, +/* a3b6 */ NULL, +/* a3b7 */ NULL, +/* a3b8 */ NULL, +/* a3b9 */ NULL, +/* a3ba */ NULL, +/* a3bb */ NULL, +/* a3bc */ NULL, +/* a3bd */ NULL, +/* a3be */ NULL, +/* a3bf */ NULL, +/* a3c0 */ NULL, +/* a3c1 */ NULL, +/* a3c2 */ NULL, +/* a3c3 */ NULL, +/* a3c4 */ NULL, +/* a3c5 */ NULL, +/* a3c6 */ NULL, +/* a3c7 */ NULL, +/* a3c8 */ NULL, +/* a3c9 */ NULL, +/* a3ca */ NULL, +/* a3cb */ NULL, +/* a3cc */ NULL, +/* a3cd */ NULL, +/* a3ce */ NULL, +/* a3cf */ NULL, +/* a3d0 */ NULL, +/* a3d1 */ NULL, +/* a3d2 */ NULL, +/* a3d3 */ NULL, +/* a3d4 */ NULL, +/* a3d5 */ NULL, +/* a3d6 */ NULL, +/* a3d7 */ NULL, +/* a3d8 */ NULL, +/* a3d9 */ NULL, +/* a3da */ NULL, +/* a3db */ NULL, +/* a3dc */ NULL, +/* a3dd */ NULL, +/* a3de */ NULL, +/* a3df */ NULL, +/* a3e0 */ NULL, +/* a3e1 */ NULL, +/* a3e2 */ NULL, +/* a3e3 */ NULL, +/* a3e4 */ NULL, +/* a3e5 */ NULL, +/* a3e6 */ NULL, +/* a3e7 */ NULL, +/* a3e8 */ NULL, +/* a3e9 */ NULL, +/* a3ea */ NULL, +/* a3eb */ NULL, +/* a3ec */ NULL, +/* a3ed */ NULL, +/* a3ee */ NULL, +/* a3ef */ NULL, +/* a3f0 */ NULL, +/* a3f1 */ NULL, +/* a3f2 */ NULL, +/* a3f3 */ NULL, +/* a3f4 */ NULL, +/* a3f5 */ NULL, +/* a3f6 */ NULL, +/* a3f7 */ NULL, +/* a3f8 */ NULL, +/* a3f9 */ NULL, +/* a3fa */ NULL, +/* a3fb */ NULL, +/* a3fc */ NULL, +/* a3fd */ NULL, +/* a3fe */ NULL, +/* a3ff */ NULL, +/* a400 */ NULL, +/* a401 */ NULL, +/* a402 */ NULL, +/* a403 */ NULL, +/* a404 */ NULL, +/* a405 */ NULL, +/* a406 */ NULL, +/* a407 */ NULL, +/* a408 */ NULL, +/* a409 */ NULL, +/* a40a */ NULL, +/* a40b */ NULL, +/* a40c */ NULL, +/* a40d */ NULL, +/* a40e */ NULL, +/* a40f */ NULL, +/* a410 */ NULL, +/* a411 */ NULL, +/* a412 */ NULL, +/* a413 */ NULL, +/* a414 */ NULL, +/* a415 */ NULL, +/* a416 */ NULL, +/* a417 */ NULL, +/* a418 */ NULL, +/* a419 */ NULL, +/* a41a */ NULL, +/* a41b */ NULL, +/* a41c */ NULL, +/* a41d */ NULL, +/* a41e */ NULL, +/* a41f */ NULL, +/* a420 */ NULL, +/* a421 */ NULL, +/* a422 */ NULL, +/* a423 */ NULL, +/* a424 */ NULL, +/* a425 */ NULL, +/* a426 */ NULL, +/* a427 */ NULL, +/* a428 */ NULL, +/* a429 */ NULL, +/* a42a */ NULL, +/* a42b */ NULL, +/* a42c */ NULL, +/* a42d */ NULL, +/* a42e */ NULL, +/* a42f */ NULL, +/* a430 */ NULL, +/* a431 */ NULL, +/* a432 */ NULL, +/* a433 */ NULL, +/* a434 */ NULL, +/* a435 */ NULL, +/* a436 */ NULL, +/* a437 */ NULL, +/* a438 */ NULL, +/* a439 */ NULL, +/* a43a */ NULL, +/* a43b */ NULL, +/* a43c */ NULL, +/* a43d */ NULL, +/* a43e */ NULL, +/* a43f */ NULL, +/* a440 */ NULL, +/* a441 */ NULL, +/* a442 */ NULL, +/* a443 */ NULL, +/* a444 */ NULL, +/* a445 */ NULL, +/* a446 */ NULL, +/* a447 */ NULL, +/* a448 */ NULL, +/* a449 */ NULL, +/* a44a */ NULL, +/* a44b */ NULL, +/* a44c */ NULL, +/* a44d */ NULL, +/* a44e */ NULL, +/* a44f */ NULL, +/* a450 */ NULL, +/* a451 */ NULL, +/* a452 */ NULL, +/* a453 */ NULL, +/* a454 */ NULL, +/* a455 */ NULL, +/* a456 */ NULL, +/* a457 */ NULL, +/* a458 */ NULL, +/* a459 */ NULL, +/* a45a */ NULL, +/* a45b */ NULL, +/* a45c */ NULL, +/* a45d */ NULL, +/* a45e */ NULL, +/* a45f */ NULL, +/* a460 */ NULL, +/* a461 */ NULL, +/* a462 */ NULL, +/* a463 */ NULL, +/* a464 */ NULL, +/* a465 */ NULL, +/* a466 */ NULL, +/* a467 */ NULL, +/* a468 */ NULL, +/* a469 */ NULL, +/* a46a */ NULL, +/* a46b */ NULL, +/* a46c */ NULL, +/* a46d */ NULL, +/* a46e */ NULL, +/* a46f */ NULL, +/* a470 */ NULL, +/* a471 */ NULL, +/* a472 */ NULL, +/* a473 */ NULL, +/* a474 */ NULL, +/* a475 */ NULL, +/* a476 */ NULL, +/* a477 */ NULL, +/* a478 */ NULL, +/* a479 */ NULL, +/* a47a */ NULL, +/* a47b */ NULL, +/* a47c */ NULL, +/* a47d */ NULL, +/* a47e */ NULL, +/* a47f */ NULL, +/* a480 */ NULL, +/* a481 */ NULL, +/* a482 */ NULL, +/* a483 */ NULL, +/* a484 */ NULL, +/* a485 */ NULL, +/* a486 */ NULL, +/* a487 */ NULL, +/* a488 */ NULL, +/* a489 */ NULL, +/* a48a */ NULL, +/* a48b */ NULL, +/* a48c */ NULL, +/* a48d */ NULL, +/* a48e */ NULL, +/* a48f */ NULL, +/* a490 */ NULL, +/* a491 */ NULL, +/* a492 */ NULL, +/* a493 */ NULL, +/* a494 */ NULL, +/* a495 */ NULL, +/* a496 */ NULL, +/* a497 */ NULL, +/* a498 */ NULL, +/* a499 */ NULL, +/* a49a */ NULL, +/* a49b */ NULL, +/* a49c */ NULL, +/* a49d */ NULL, +/* a49e */ NULL, +/* a49f */ NULL, +/* a4a0 */ NULL, +/* a4a1 */ NULL, +/* a4a2 */ NULL, +/* a4a3 */ NULL, +/* a4a4 */ NULL, +/* a4a5 */ NULL, +/* a4a6 */ NULL, +/* a4a7 */ NULL, +/* a4a8 */ NULL, +/* a4a9 */ NULL, +/* a4aa */ NULL, +/* a4ab */ NULL, +/* a4ac */ NULL, +/* a4ad */ NULL, +/* a4ae */ NULL, +/* a4af */ NULL, +/* a4b0 */ NULL, +/* a4b1 */ NULL, +/* a4b2 */ NULL, +/* a4b3 */ NULL, +/* a4b4 */ NULL, +/* a4b5 */ NULL, +/* a4b6 */ NULL, +/* a4b7 */ NULL, +/* a4b8 */ NULL, +/* a4b9 */ NULL, +/* a4ba */ NULL, +/* a4bb */ NULL, +/* a4bc */ NULL, +/* a4bd */ NULL, +/* a4be */ NULL, +/* a4bf */ NULL, +/* a4c0 */ NULL, +/* a4c1 */ NULL, +/* a4c2 */ NULL, +/* a4c3 */ NULL, +/* a4c4 */ NULL, +/* a4c5 */ NULL, +/* a4c6 */ NULL, +/* a4c7 */ NULL, +/* a4c8 */ NULL, +/* a4c9 */ NULL, +/* a4ca */ NULL, +/* a4cb */ NULL, +/* a4cc */ NULL, +/* a4cd */ NULL, +/* a4ce */ NULL, +/* a4cf */ NULL, +/* a4d0 */ NULL, +/* a4d1 */ NULL, +/* a4d2 */ NULL, +/* a4d3 */ NULL, +/* a4d4 */ NULL, +/* a4d5 */ NULL, +/* a4d6 */ NULL, +/* a4d7 */ NULL, +/* a4d8 */ NULL, +/* a4d9 */ NULL, +/* a4da */ NULL, +/* a4db */ NULL, +/* a4dc */ NULL, +/* a4dd */ NULL, +/* a4de */ NULL, +/* a4df */ NULL, +/* a4e0 */ NULL, +/* a4e1 */ NULL, +/* a4e2 */ NULL, +/* a4e3 */ NULL, +/* a4e4 */ NULL, +/* a4e5 */ NULL, +/* a4e6 */ NULL, +/* a4e7 */ NULL, +/* a4e8 */ NULL, +/* a4e9 */ NULL, +/* a4ea */ NULL, +/* a4eb */ NULL, +/* a4ec */ NULL, +/* a4ed */ NULL, +/* a4ee */ NULL, +/* a4ef */ NULL, +/* a4f0 */ NULL, +/* a4f1 */ NULL, +/* a4f2 */ NULL, +/* a4f3 */ NULL, +/* a4f4 */ NULL, +/* a4f5 */ NULL, +/* a4f6 */ NULL, +/* a4f7 */ NULL, +/* a4f8 */ NULL, +/* a4f9 */ NULL, +/* a4fa */ NULL, +/* a4fb */ NULL, +/* a4fc */ NULL, +/* a4fd */ NULL, +/* a4fe */ NULL, +/* a4ff */ NULL, +/* a500 */ NULL, +/* a501 */ NULL, +/* a502 */ NULL, +/* a503 */ NULL, +/* a504 */ NULL, +/* a505 */ NULL, +/* a506 */ NULL, +/* a507 */ NULL, +/* a508 */ NULL, +/* a509 */ NULL, +/* a50a */ NULL, +/* a50b */ NULL, +/* a50c */ NULL, +/* a50d */ NULL, +/* a50e */ NULL, +/* a50f */ NULL, +/* a510 */ NULL, +/* a511 */ NULL, +/* a512 */ NULL, +/* a513 */ NULL, +/* a514 */ NULL, +/* a515 */ NULL, +/* a516 */ NULL, +/* a517 */ NULL, +/* a518 */ NULL, +/* a519 */ NULL, +/* a51a */ NULL, +/* a51b */ NULL, +/* a51c */ NULL, +/* a51d */ NULL, +/* a51e */ NULL, +/* a51f */ NULL, +/* a520 */ NULL, +/* a521 */ NULL, +/* a522 */ NULL, +/* a523 */ NULL, +/* a524 */ NULL, +/* a525 */ NULL, +/* a526 */ NULL, +/* a527 */ NULL, +/* a528 */ NULL, +/* a529 */ NULL, +/* a52a */ NULL, +/* a52b */ NULL, +/* a52c */ NULL, +/* a52d */ NULL, +/* a52e */ NULL, +/* a52f */ NULL, +/* a530 */ NULL, +/* a531 */ NULL, +/* a532 */ NULL, +/* a533 */ NULL, +/* a534 */ NULL, +/* a535 */ NULL, +/* a536 */ NULL, +/* a537 */ NULL, +/* a538 */ NULL, +/* a539 */ NULL, +/* a53a */ NULL, +/* a53b */ NULL, +/* a53c */ NULL, +/* a53d */ NULL, +/* a53e */ NULL, +/* a53f */ NULL, +/* a540 */ NULL, +/* a541 */ NULL, +/* a542 */ NULL, +/* a543 */ NULL, +/* a544 */ NULL, +/* a545 */ NULL, +/* a546 */ NULL, +/* a547 */ NULL, +/* a548 */ NULL, +/* a549 */ NULL, +/* a54a */ NULL, +/* a54b */ NULL, +/* a54c */ NULL, +/* a54d */ NULL, +/* a54e */ NULL, +/* a54f */ NULL, +/* a550 */ NULL, +/* a551 */ NULL, +/* a552 */ NULL, +/* a553 */ NULL, +/* a554 */ NULL, +/* a555 */ NULL, +/* a556 */ NULL, +/* a557 */ NULL, +/* a558 */ NULL, +/* a559 */ NULL, +/* a55a */ NULL, +/* a55b */ NULL, +/* a55c */ NULL, +/* a55d */ NULL, +/* a55e */ NULL, +/* a55f */ NULL, +/* a560 */ NULL, +/* a561 */ NULL, +/* a562 */ NULL, +/* a563 */ NULL, +/* a564 */ NULL, +/* a565 */ NULL, +/* a566 */ NULL, +/* a567 */ NULL, +/* a568 */ NULL, +/* a569 */ NULL, +/* a56a */ NULL, +/* a56b */ NULL, +/* a56c */ NULL, +/* a56d */ NULL, +/* a56e */ NULL, +/* a56f */ NULL, +/* a570 */ NULL, +/* a571 */ NULL, +/* a572 */ NULL, +/* a573 */ NULL, +/* a574 */ NULL, +/* a575 */ NULL, +/* a576 */ NULL, +/* a577 */ NULL, +/* a578 */ NULL, +/* a579 */ NULL, +/* a57a */ NULL, +/* a57b */ NULL, +/* a57c */ NULL, +/* a57d */ NULL, +/* a57e */ NULL, +/* a57f */ NULL, +/* a580 */ NULL, +/* a581 */ NULL, +/* a582 */ NULL, +/* a583 */ NULL, +/* a584 */ NULL, +/* a585 */ NULL, +/* a586 */ NULL, +/* a587 */ NULL, +/* a588 */ NULL, +/* a589 */ NULL, +/* a58a */ NULL, +/* a58b */ NULL, +/* a58c */ NULL, +/* a58d */ NULL, +/* a58e */ NULL, +/* a58f */ NULL, +/* a590 */ NULL, +/* a591 */ NULL, +/* a592 */ NULL, +/* a593 */ NULL, +/* a594 */ NULL, +/* a595 */ NULL, +/* a596 */ NULL, +/* a597 */ NULL, +/* a598 */ NULL, +/* a599 */ NULL, +/* a59a */ NULL, +/* a59b */ NULL, +/* a59c */ NULL, +/* a59d */ NULL, +/* a59e */ NULL, +/* a59f */ NULL, +/* a5a0 */ NULL, +/* a5a1 */ NULL, +/* a5a2 */ NULL, +/* a5a3 */ NULL, +/* a5a4 */ NULL, +/* a5a5 */ NULL, +/* a5a6 */ NULL, +/* a5a7 */ NULL, +/* a5a8 */ NULL, +/* a5a9 */ NULL, +/* a5aa */ NULL, +/* a5ab */ NULL, +/* a5ac */ NULL, +/* a5ad */ NULL, +/* a5ae */ NULL, +/* a5af */ NULL, +/* a5b0 */ NULL, +/* a5b1 */ NULL, +/* a5b2 */ NULL, +/* a5b3 */ NULL, +/* a5b4 */ NULL, +/* a5b5 */ NULL, +/* a5b6 */ NULL, +/* a5b7 */ NULL, +/* a5b8 */ NULL, +/* a5b9 */ NULL, +/* a5ba */ NULL, +/* a5bb */ NULL, +/* a5bc */ NULL, +/* a5bd */ NULL, +/* a5be */ NULL, +/* a5bf */ NULL, +/* a5c0 */ NULL, +/* a5c1 */ NULL, +/* a5c2 */ NULL, +/* a5c3 */ NULL, +/* a5c4 */ NULL, +/* a5c5 */ NULL, +/* a5c6 */ NULL, +/* a5c7 */ NULL, +/* a5c8 */ NULL, +/* a5c9 */ NULL, +/* a5ca */ NULL, +/* a5cb */ NULL, +/* a5cc */ NULL, +/* a5cd */ NULL, +/* a5ce */ NULL, +/* a5cf */ NULL, +/* a5d0 */ NULL, +/* a5d1 */ NULL, +/* a5d2 */ NULL, +/* a5d3 */ NULL, +/* a5d4 */ NULL, +/* a5d5 */ NULL, +/* a5d6 */ NULL, +/* a5d7 */ NULL, +/* a5d8 */ NULL, +/* a5d9 */ NULL, +/* a5da */ NULL, +/* a5db */ NULL, +/* a5dc */ NULL, +/* a5dd */ NULL, +/* a5de */ NULL, +/* a5df */ NULL, +/* a5e0 */ NULL, +/* a5e1 */ NULL, +/* a5e2 */ NULL, +/* a5e3 */ NULL, +/* a5e4 */ NULL, +/* a5e5 */ NULL, +/* a5e6 */ NULL, +/* a5e7 */ NULL, +/* a5e8 */ NULL, +/* a5e9 */ NULL, +/* a5ea */ NULL, +/* a5eb */ NULL, +/* a5ec */ NULL, +/* a5ed */ NULL, +/* a5ee */ NULL, +/* a5ef */ NULL, +/* a5f0 */ NULL, +/* a5f1 */ NULL, +/* a5f2 */ NULL, +/* a5f3 */ NULL, +/* a5f4 */ NULL, +/* a5f5 */ NULL, +/* a5f6 */ NULL, +/* a5f7 */ NULL, +/* a5f8 */ NULL, +/* a5f9 */ NULL, +/* a5fa */ NULL, +/* a5fb */ NULL, +/* a5fc */ NULL, +/* a5fd */ NULL, +/* a5fe */ NULL, +/* a5ff */ NULL, +/* a600 */ NULL, +/* a601 */ NULL, +/* a602 */ NULL, +/* a603 */ NULL, +/* a604 */ NULL, +/* a605 */ NULL, +/* a606 */ NULL, +/* a607 */ NULL, +/* a608 */ NULL, +/* a609 */ NULL, +/* a60a */ NULL, +/* a60b */ NULL, +/* a60c */ NULL, +/* a60d */ NULL, +/* a60e */ NULL, +/* a60f */ NULL, +/* a610 */ NULL, +/* a611 */ NULL, +/* a612 */ NULL, +/* a613 */ NULL, +/* a614 */ NULL, +/* a615 */ NULL, +/* a616 */ NULL, +/* a617 */ NULL, +/* a618 */ NULL, +/* a619 */ NULL, +/* a61a */ NULL, +/* a61b */ NULL, +/* a61c */ NULL, +/* a61d */ NULL, +/* a61e */ NULL, +/* a61f */ NULL, +/* a620 */ NULL, +/* a621 */ NULL, +/* a622 */ NULL, +/* a623 */ NULL, +/* a624 */ NULL, +/* a625 */ NULL, +/* a626 */ NULL, +/* a627 */ NULL, +/* a628 */ NULL, +/* a629 */ NULL, +/* a62a */ NULL, +/* a62b */ NULL, +/* a62c */ NULL, +/* a62d */ NULL, +/* a62e */ NULL, +/* a62f */ NULL, +/* a630 */ NULL, +/* a631 */ NULL, +/* a632 */ NULL, +/* a633 */ NULL, +/* a634 */ NULL, +/* a635 */ NULL, +/* a636 */ NULL, +/* a637 */ NULL, +/* a638 */ NULL, +/* a639 */ NULL, +/* a63a */ NULL, +/* a63b */ NULL, +/* a63c */ NULL, +/* a63d */ NULL, +/* a63e */ NULL, +/* a63f */ NULL, +/* a640 */ NULL, +/* a641 */ NULL, +/* a642 */ NULL, +/* a643 */ NULL, +/* a644 */ NULL, +/* a645 */ NULL, +/* a646 */ NULL, +/* a647 */ NULL, +/* a648 */ NULL, +/* a649 */ NULL, +/* a64a */ NULL, +/* a64b */ NULL, +/* a64c */ NULL, +/* a64d */ NULL, +/* a64e */ NULL, +/* a64f */ NULL, +/* a650 */ NULL, +/* a651 */ NULL, +/* a652 */ NULL, +/* a653 */ NULL, +/* a654 */ NULL, +/* a655 */ NULL, +/* a656 */ NULL, +/* a657 */ NULL, +/* a658 */ NULL, +/* a659 */ NULL, +/* a65a */ NULL, +/* a65b */ NULL, +/* a65c */ NULL, +/* a65d */ NULL, +/* a65e */ NULL, +/* a65f */ NULL, +/* a660 */ NULL, +/* a661 */ NULL, +/* a662 */ NULL, +/* a663 */ NULL, +/* a664 */ NULL, +/* a665 */ NULL, +/* a666 */ NULL, +/* a667 */ NULL, +/* a668 */ NULL, +/* a669 */ NULL, +/* a66a */ NULL, +/* a66b */ NULL, +/* a66c */ NULL, +/* a66d */ NULL, +/* a66e */ NULL, +/* a66f */ NULL, +/* a670 */ NULL, +/* a671 */ NULL, +/* a672 */ NULL, +/* a673 */ NULL, +/* a674 */ NULL, +/* a675 */ NULL, +/* a676 */ NULL, +/* a677 */ NULL, +/* a678 */ NULL, +/* a679 */ NULL, +/* a67a */ NULL, +/* a67b */ NULL, +/* a67c */ NULL, +/* a67d */ NULL, +/* a67e */ NULL, +/* a67f */ NULL, +/* a680 */ NULL, +/* a681 */ NULL, +/* a682 */ NULL, +/* a683 */ NULL, +/* a684 */ NULL, +/* a685 */ NULL, +/* a686 */ NULL, +/* a687 */ NULL, +/* a688 */ NULL, +/* a689 */ NULL, +/* a68a */ NULL, +/* a68b */ NULL, +/* a68c */ NULL, +/* a68d */ NULL, +/* a68e */ NULL, +/* a68f */ NULL, +/* a690 */ NULL, +/* a691 */ NULL, +/* a692 */ NULL, +/* a693 */ NULL, +/* a694 */ NULL, +/* a695 */ NULL, +/* a696 */ NULL, +/* a697 */ NULL, +/* a698 */ NULL, +/* a699 */ NULL, +/* a69a */ NULL, +/* a69b */ NULL, +/* a69c */ NULL, +/* a69d */ NULL, +/* a69e */ NULL, +/* a69f */ NULL, +/* a6a0 */ NULL, +/* a6a1 */ NULL, +/* a6a2 */ NULL, +/* a6a3 */ NULL, +/* a6a4 */ NULL, +/* a6a5 */ NULL, +/* a6a6 */ NULL, +/* a6a7 */ NULL, +/* a6a8 */ NULL, +/* a6a9 */ NULL, +/* a6aa */ NULL, +/* a6ab */ NULL, +/* a6ac */ NULL, +/* a6ad */ NULL, +/* a6ae */ NULL, +/* a6af */ NULL, +/* a6b0 */ NULL, +/* a6b1 */ NULL, +/* a6b2 */ NULL, +/* a6b3 */ NULL, +/* a6b4 */ NULL, +/* a6b5 */ NULL, +/* a6b6 */ NULL, +/* a6b7 */ NULL, +/* a6b8 */ NULL, +/* a6b9 */ NULL, +/* a6ba */ NULL, +/* a6bb */ NULL, +/* a6bc */ NULL, +/* a6bd */ NULL, +/* a6be */ NULL, +/* a6bf */ NULL, +/* a6c0 */ NULL, +/* a6c1 */ NULL, +/* a6c2 */ NULL, +/* a6c3 */ NULL, +/* a6c4 */ NULL, +/* a6c5 */ NULL, +/* a6c6 */ NULL, +/* a6c7 */ NULL, +/* a6c8 */ NULL, +/* a6c9 */ NULL, +/* a6ca */ NULL, +/* a6cb */ NULL, +/* a6cc */ NULL, +/* a6cd */ NULL, +/* a6ce */ NULL, +/* a6cf */ NULL, +/* a6d0 */ NULL, +/* a6d1 */ NULL, +/* a6d2 */ NULL, +/* a6d3 */ NULL, +/* a6d4 */ NULL, +/* a6d5 */ NULL, +/* a6d6 */ NULL, +/* a6d7 */ NULL, +/* a6d8 */ NULL, +/* a6d9 */ NULL, +/* a6da */ NULL, +/* a6db */ NULL, +/* a6dc */ NULL, +/* a6dd */ NULL, +/* a6de */ NULL, +/* a6df */ NULL, +/* a6e0 */ NULL, +/* a6e1 */ NULL, +/* a6e2 */ NULL, +/* a6e3 */ NULL, +/* a6e4 */ NULL, +/* a6e5 */ NULL, +/* a6e6 */ NULL, +/* a6e7 */ NULL, +/* a6e8 */ NULL, +/* a6e9 */ NULL, +/* a6ea */ NULL, +/* a6eb */ NULL, +/* a6ec */ NULL, +/* a6ed */ NULL, +/* a6ee */ NULL, +/* a6ef */ NULL, +/* a6f0 */ NULL, +/* a6f1 */ NULL, +/* a6f2 */ NULL, +/* a6f3 */ NULL, +/* a6f4 */ NULL, +/* a6f5 */ NULL, +/* a6f6 */ NULL, +/* a6f7 */ NULL, +/* a6f8 */ NULL, +/* a6f9 */ NULL, +/* a6fa */ NULL, +/* a6fb */ NULL, +/* a6fc */ NULL, +/* a6fd */ NULL, +/* a6fe */ NULL, +/* a6ff */ NULL, +/* a700 */ NULL, +/* a701 */ NULL, +/* a702 */ NULL, +/* a703 */ NULL, +/* a704 */ NULL, +/* a705 */ NULL, +/* a706 */ NULL, +/* a707 */ NULL, +/* a708 */ NULL, +/* a709 */ NULL, +/* a70a */ NULL, +/* a70b */ NULL, +/* a70c */ NULL, +/* a70d */ NULL, +/* a70e */ NULL, +/* a70f */ NULL, +/* a710 */ NULL, +/* a711 */ NULL, +/* a712 */ NULL, +/* a713 */ NULL, +/* a714 */ NULL, +/* a715 */ NULL, +/* a716 */ NULL, +/* a717 */ NULL, +/* a718 */ NULL, +/* a719 */ NULL, +/* a71a */ NULL, +/* a71b */ NULL, +/* a71c */ NULL, +/* a71d */ NULL, +/* a71e */ NULL, +/* a71f */ NULL, +/* a720 */ NULL, +/* a721 */ NULL, +/* a722 */ NULL, +/* a723 */ NULL, +/* a724 */ NULL, +/* a725 */ NULL, +/* a726 */ NULL, +/* a727 */ NULL, +/* a728 */ NULL, +/* a729 */ NULL, +/* a72a */ NULL, +/* a72b */ NULL, +/* a72c */ NULL, +/* a72d */ NULL, +/* a72e */ NULL, +/* a72f */ NULL, +/* a730 */ NULL, +/* a731 */ NULL, +/* a732 */ NULL, +/* a733 */ NULL, +/* a734 */ NULL, +/* a735 */ NULL, +/* a736 */ NULL, +/* a737 */ NULL, +/* a738 */ NULL, +/* a739 */ NULL, +/* a73a */ NULL, +/* a73b */ NULL, +/* a73c */ NULL, +/* a73d */ NULL, +/* a73e */ NULL, +/* a73f */ NULL, +/* a740 */ NULL, +/* a741 */ NULL, +/* a742 */ NULL, +/* a743 */ NULL, +/* a744 */ NULL, +/* a745 */ NULL, +/* a746 */ NULL, +/* a747 */ NULL, +/* a748 */ NULL, +/* a749 */ NULL, +/* a74a */ NULL, +/* a74b */ NULL, +/* a74c */ NULL, +/* a74d */ NULL, +/* a74e */ NULL, +/* a74f */ NULL, +/* a750 */ NULL, +/* a751 */ NULL, +/* a752 */ NULL, +/* a753 */ NULL, +/* a754 */ NULL, +/* a755 */ NULL, +/* a756 */ NULL, +/* a757 */ NULL, +/* a758 */ NULL, +/* a759 */ NULL, +/* a75a */ NULL, +/* a75b */ NULL, +/* a75c */ NULL, +/* a75d */ NULL, +/* a75e */ NULL, +/* a75f */ NULL, +/* a760 */ NULL, +/* a761 */ NULL, +/* a762 */ NULL, +/* a763 */ NULL, +/* a764 */ NULL, +/* a765 */ NULL, +/* a766 */ NULL, +/* a767 */ NULL, +/* a768 */ NULL, +/* a769 */ NULL, +/* a76a */ NULL, +/* a76b */ NULL, +/* a76c */ NULL, +/* a76d */ NULL, +/* a76e */ NULL, +/* a76f */ NULL, +/* a770 */ NULL, +/* a771 */ NULL, +/* a772 */ NULL, +/* a773 */ NULL, +/* a774 */ NULL, +/* a775 */ NULL, +/* a776 */ NULL, +/* a777 */ NULL, +/* a778 */ NULL, +/* a779 */ NULL, +/* a77a */ NULL, +/* a77b */ NULL, +/* a77c */ NULL, +/* a77d */ NULL, +/* a77e */ NULL, +/* a77f */ NULL, +/* a780 */ NULL, +/* a781 */ NULL, +/* a782 */ NULL, +/* a783 */ NULL, +/* a784 */ NULL, +/* a785 */ NULL, +/* a786 */ NULL, +/* a787 */ NULL, +/* a788 */ NULL, +/* a789 */ NULL, +/* a78a */ NULL, +/* a78b */ NULL, +/* a78c */ NULL, +/* a78d */ NULL, +/* a78e */ NULL, +/* a78f */ NULL, +/* a790 */ NULL, +/* a791 */ NULL, +/* a792 */ NULL, +/* a793 */ NULL, +/* a794 */ NULL, +/* a795 */ NULL, +/* a796 */ NULL, +/* a797 */ NULL, +/* a798 */ NULL, +/* a799 */ NULL, +/* a79a */ NULL, +/* a79b */ NULL, +/* a79c */ NULL, +/* a79d */ NULL, +/* a79e */ NULL, +/* a79f */ NULL, +/* a7a0 */ NULL, +/* a7a1 */ NULL, +/* a7a2 */ NULL, +/* a7a3 */ NULL, +/* a7a4 */ NULL, +/* a7a5 */ NULL, +/* a7a6 */ NULL, +/* a7a7 */ NULL, +/* a7a8 */ NULL, +/* a7a9 */ NULL, +/* a7aa */ NULL, +/* a7ab */ NULL, +/* a7ac */ NULL, +/* a7ad */ NULL, +/* a7ae */ NULL, +/* a7af */ NULL, +/* a7b0 */ NULL, +/* a7b1 */ NULL, +/* a7b2 */ NULL, +/* a7b3 */ NULL, +/* a7b4 */ NULL, +/* a7b5 */ NULL, +/* a7b6 */ NULL, +/* a7b7 */ NULL, +/* a7b8 */ NULL, +/* a7b9 */ NULL, +/* a7ba */ NULL, +/* a7bb */ NULL, +/* a7bc */ NULL, +/* a7bd */ NULL, +/* a7be */ NULL, +/* a7bf */ NULL, +/* a7c0 */ NULL, +/* a7c1 */ NULL, +/* a7c2 */ NULL, +/* a7c3 */ NULL, +/* a7c4 */ NULL, +/* a7c5 */ NULL, +/* a7c6 */ NULL, +/* a7c7 */ NULL, +/* a7c8 */ NULL, +/* a7c9 */ NULL, +/* a7ca */ NULL, +/* a7cb */ NULL, +/* a7cc */ NULL, +/* a7cd */ NULL, +/* a7ce */ NULL, +/* a7cf */ NULL, +/* a7d0 */ NULL, +/* a7d1 */ NULL, +/* a7d2 */ NULL, +/* a7d3 */ NULL, +/* a7d4 */ NULL, +/* a7d5 */ NULL, +/* a7d6 */ NULL, +/* a7d7 */ NULL, +/* a7d8 */ NULL, +/* a7d9 */ NULL, +/* a7da */ NULL, +/* a7db */ NULL, +/* a7dc */ NULL, +/* a7dd */ NULL, +/* a7de */ NULL, +/* a7df */ NULL, +/* a7e0 */ NULL, +/* a7e1 */ NULL, +/* a7e2 */ NULL, +/* a7e3 */ NULL, +/* a7e4 */ NULL, +/* a7e5 */ NULL, +/* a7e6 */ NULL, +/* a7e7 */ NULL, +/* a7e8 */ NULL, +/* a7e9 */ NULL, +/* a7ea */ NULL, +/* a7eb */ NULL, +/* a7ec */ NULL, +/* a7ed */ NULL, +/* a7ee */ NULL, +/* a7ef */ NULL, +/* a7f0 */ NULL, +/* a7f1 */ NULL, +/* a7f2 */ NULL, +/* a7f3 */ NULL, +/* a7f4 */ NULL, +/* a7f5 */ NULL, +/* a7f6 */ NULL, +/* a7f7 */ NULL, +/* a7f8 */ NULL, +/* a7f9 */ NULL, +/* a7fa */ NULL, +/* a7fb */ NULL, +/* a7fc */ NULL, +/* a7fd */ NULL, +/* a7fe */ NULL, +/* a7ff */ NULL, +/* a800 */ NULL, +/* a801 */ NULL, +/* a802 */ NULL, +/* a803 */ NULL, +/* a804 */ NULL, +/* a805 */ NULL, +/* a806 */ NULL, +/* a807 */ NULL, +/* a808 */ NULL, +/* a809 */ NULL, +/* a80a */ NULL, +/* a80b */ NULL, +/* a80c */ NULL, +/* a80d */ NULL, +/* a80e */ NULL, +/* a80f */ NULL, +/* a810 */ NULL, +/* a811 */ NULL, +/* a812 */ NULL, +/* a813 */ NULL, +/* a814 */ NULL, +/* a815 */ NULL, +/* a816 */ NULL, +/* a817 */ NULL, +/* a818 */ NULL, +/* a819 */ NULL, +/* a81a */ NULL, +/* a81b */ NULL, +/* a81c */ NULL, +/* a81d */ NULL, +/* a81e */ NULL, +/* a81f */ NULL, +/* a820 */ NULL, +/* a821 */ NULL, +/* a822 */ NULL, +/* a823 */ NULL, +/* a824 */ NULL, +/* a825 */ NULL, +/* a826 */ NULL, +/* a827 */ NULL, +/* a828 */ NULL, +/* a829 */ NULL, +/* a82a */ NULL, +/* a82b */ NULL, +/* a82c */ NULL, +/* a82d */ NULL, +/* a82e */ NULL, +/* a82f */ NULL, +/* a830 */ NULL, +/* a831 */ NULL, +/* a832 */ NULL, +/* a833 */ NULL, +/* a834 */ NULL, +/* a835 */ NULL, +/* a836 */ NULL, +/* a837 */ NULL, +/* a838 */ NULL, +/* a839 */ NULL, +/* a83a */ NULL, +/* a83b */ NULL, +/* a83c */ NULL, +/* a83d */ NULL, +/* a83e */ NULL, +/* a83f */ NULL, +/* a840 */ NULL, +/* a841 */ NULL, +/* a842 */ NULL, +/* a843 */ NULL, +/* a844 */ NULL, +/* a845 */ NULL, +/* a846 */ NULL, +/* a847 */ NULL, +/* a848 */ NULL, +/* a849 */ NULL, +/* a84a */ NULL, +/* a84b */ NULL, +/* a84c */ NULL, +/* a84d */ NULL, +/* a84e */ NULL, +/* a84f */ NULL, +/* a850 */ NULL, +/* a851 */ NULL, +/* a852 */ NULL, +/* a853 */ NULL, +/* a854 */ NULL, +/* a855 */ NULL, +/* a856 */ NULL, +/* a857 */ NULL, +/* a858 */ NULL, +/* a859 */ NULL, +/* a85a */ NULL, +/* a85b */ NULL, +/* a85c */ NULL, +/* a85d */ NULL, +/* a85e */ NULL, +/* a85f */ NULL, +/* a860 */ NULL, +/* a861 */ NULL, +/* a862 */ NULL, +/* a863 */ NULL, +/* a864 */ NULL, +/* a865 */ NULL, +/* a866 */ NULL, +/* a867 */ NULL, +/* a868 */ NULL, +/* a869 */ NULL, +/* a86a */ NULL, +/* a86b */ NULL, +/* a86c */ NULL, +/* a86d */ NULL, +/* a86e */ NULL, +/* a86f */ NULL, +/* a870 */ NULL, +/* a871 */ NULL, +/* a872 */ NULL, +/* a873 */ NULL, +/* a874 */ NULL, +/* a875 */ NULL, +/* a876 */ NULL, +/* a877 */ NULL, +/* a878 */ NULL, +/* a879 */ NULL, +/* a87a */ NULL, +/* a87b */ NULL, +/* a87c */ NULL, +/* a87d */ NULL, +/* a87e */ NULL, +/* a87f */ NULL, +/* a880 */ NULL, +/* a881 */ NULL, +/* a882 */ NULL, +/* a883 */ NULL, +/* a884 */ NULL, +/* a885 */ NULL, +/* a886 */ NULL, +/* a887 */ NULL, +/* a888 */ NULL, +/* a889 */ NULL, +/* a88a */ NULL, +/* a88b */ NULL, +/* a88c */ NULL, +/* a88d */ NULL, +/* a88e */ NULL, +/* a88f */ NULL, +/* a890 */ NULL, +/* a891 */ NULL, +/* a892 */ NULL, +/* a893 */ NULL, +/* a894 */ NULL, +/* a895 */ NULL, +/* a896 */ NULL, +/* a897 */ NULL, +/* a898 */ NULL, +/* a899 */ NULL, +/* a89a */ NULL, +/* a89b */ NULL, +/* a89c */ NULL, +/* a89d */ NULL, +/* a89e */ NULL, +/* a89f */ NULL, +/* a8a0 */ NULL, +/* a8a1 */ NULL, +/* a8a2 */ NULL, +/* a8a3 */ NULL, +/* a8a4 */ NULL, +/* a8a5 */ NULL, +/* a8a6 */ NULL, +/* a8a7 */ NULL, +/* a8a8 */ NULL, +/* a8a9 */ NULL, +/* a8aa */ NULL, +/* a8ab */ NULL, +/* a8ac */ NULL, +/* a8ad */ NULL, +/* a8ae */ NULL, +/* a8af */ NULL, +/* a8b0 */ NULL, +/* a8b1 */ NULL, +/* a8b2 */ NULL, +/* a8b3 */ NULL, +/* a8b4 */ NULL, +/* a8b5 */ NULL, +/* a8b6 */ NULL, +/* a8b7 */ NULL, +/* a8b8 */ NULL, +/* a8b9 */ NULL, +/* a8ba */ NULL, +/* a8bb */ NULL, +/* a8bc */ NULL, +/* a8bd */ NULL, +/* a8be */ NULL, +/* a8bf */ NULL, +/* a8c0 */ NULL, +/* a8c1 */ NULL, +/* a8c2 */ NULL, +/* a8c3 */ NULL, +/* a8c4 */ NULL, +/* a8c5 */ NULL, +/* a8c6 */ NULL, +/* a8c7 */ NULL, +/* a8c8 */ NULL, +/* a8c9 */ NULL, +/* a8ca */ NULL, +/* a8cb */ NULL, +/* a8cc */ NULL, +/* a8cd */ NULL, +/* a8ce */ NULL, +/* a8cf */ NULL, +/* a8d0 */ NULL, +/* a8d1 */ NULL, +/* a8d2 */ NULL, +/* a8d3 */ NULL, +/* a8d4 */ NULL, +/* a8d5 */ NULL, +/* a8d6 */ NULL, +/* a8d7 */ NULL, +/* a8d8 */ NULL, +/* a8d9 */ NULL, +/* a8da */ NULL, +/* a8db */ NULL, +/* a8dc */ NULL, +/* a8dd */ NULL, +/* a8de */ NULL, +/* a8df */ NULL, +/* a8e0 */ NULL, +/* a8e1 */ NULL, +/* a8e2 */ NULL, +/* a8e3 */ NULL, +/* a8e4 */ NULL, +/* a8e5 */ NULL, +/* a8e6 */ NULL, +/* a8e7 */ NULL, +/* a8e8 */ NULL, +/* a8e9 */ NULL, +/* a8ea */ NULL, +/* a8eb */ NULL, +/* a8ec */ NULL, +/* a8ed */ NULL, +/* a8ee */ NULL, +/* a8ef */ NULL, +/* a8f0 */ NULL, +/* a8f1 */ NULL, +/* a8f2 */ NULL, +/* a8f3 */ NULL, +/* a8f4 */ NULL, +/* a8f5 */ NULL, +/* a8f6 */ NULL, +/* a8f7 */ NULL, +/* a8f8 */ NULL, +/* a8f9 */ NULL, +/* a8fa */ NULL, +/* a8fb */ NULL, +/* a8fc */ NULL, +/* a8fd */ NULL, +/* a8fe */ NULL, +/* a8ff */ NULL, +/* a900 */ NULL, +/* a901 */ NULL, +/* a902 */ NULL, +/* a903 */ NULL, +/* a904 */ NULL, +/* a905 */ NULL, +/* a906 */ NULL, +/* a907 */ NULL, +/* a908 */ NULL, +/* a909 */ NULL, +/* a90a */ NULL, +/* a90b */ NULL, +/* a90c */ NULL, +/* a90d */ NULL, +/* a90e */ NULL, +/* a90f */ NULL, +/* a910 */ NULL, +/* a911 */ NULL, +/* a912 */ NULL, +/* a913 */ NULL, +/* a914 */ NULL, +/* a915 */ NULL, +/* a916 */ NULL, +/* a917 */ NULL, +/* a918 */ NULL, +/* a919 */ NULL, +/* a91a */ NULL, +/* a91b */ NULL, +/* a91c */ NULL, +/* a91d */ NULL, +/* a91e */ NULL, +/* a91f */ NULL, +/* a920 */ NULL, +/* a921 */ NULL, +/* a922 */ NULL, +/* a923 */ NULL, +/* a924 */ NULL, +/* a925 */ NULL, +/* a926 */ NULL, +/* a927 */ NULL, +/* a928 */ NULL, +/* a929 */ NULL, +/* a92a */ NULL, +/* a92b */ NULL, +/* a92c */ NULL, +/* a92d */ NULL, +/* a92e */ NULL, +/* a92f */ NULL, +/* a930 */ NULL, +/* a931 */ NULL, +/* a932 */ NULL, +/* a933 */ NULL, +/* a934 */ NULL, +/* a935 */ NULL, +/* a936 */ NULL, +/* a937 */ NULL, +/* a938 */ NULL, +/* a939 */ NULL, +/* a93a */ NULL, +/* a93b */ NULL, +/* a93c */ NULL, +/* a93d */ NULL, +/* a93e */ NULL, +/* a93f */ NULL, +/* a940 */ NULL, +/* a941 */ NULL, +/* a942 */ NULL, +/* a943 */ NULL, +/* a944 */ NULL, +/* a945 */ NULL, +/* a946 */ NULL, +/* a947 */ NULL, +/* a948 */ NULL, +/* a949 */ NULL, +/* a94a */ NULL, +/* a94b */ NULL, +/* a94c */ NULL, +/* a94d */ NULL, +/* a94e */ NULL, +/* a94f */ NULL, +/* a950 */ NULL, +/* a951 */ NULL, +/* a952 */ NULL, +/* a953 */ NULL, +/* a954 */ NULL, +/* a955 */ NULL, +/* a956 */ NULL, +/* a957 */ NULL, +/* a958 */ NULL, +/* a959 */ NULL, +/* a95a */ NULL, +/* a95b */ NULL, +/* a95c */ NULL, +/* a95d */ NULL, +/* a95e */ NULL, +/* a95f */ NULL, +/* a960 */ NULL, +/* a961 */ NULL, +/* a962 */ NULL, +/* a963 */ NULL, +/* a964 */ NULL, +/* a965 */ NULL, +/* a966 */ NULL, +/* a967 */ NULL, +/* a968 */ NULL, +/* a969 */ NULL, +/* a96a */ NULL, +/* a96b */ NULL, +/* a96c */ NULL, +/* a96d */ NULL, +/* a96e */ NULL, +/* a96f */ NULL, +/* a970 */ NULL, +/* a971 */ NULL, +/* a972 */ NULL, +/* a973 */ NULL, +/* a974 */ NULL, +/* a975 */ NULL, +/* a976 */ NULL, +/* a977 */ NULL, +/* a978 */ NULL, +/* a979 */ NULL, +/* a97a */ NULL, +/* a97b */ NULL, +/* a97c */ NULL, +/* a97d */ NULL, +/* a97e */ NULL, +/* a97f */ NULL, +/* a980 */ NULL, +/* a981 */ NULL, +/* a982 */ NULL, +/* a983 */ NULL, +/* a984 */ NULL, +/* a985 */ NULL, +/* a986 */ NULL, +/* a987 */ NULL, +/* a988 */ NULL, +/* a989 */ NULL, +/* a98a */ NULL, +/* a98b */ NULL, +/* a98c */ NULL, +/* a98d */ NULL, +/* a98e */ NULL, +/* a98f */ NULL, +/* a990 */ NULL, +/* a991 */ NULL, +/* a992 */ NULL, +/* a993 */ NULL, +/* a994 */ NULL, +/* a995 */ NULL, +/* a996 */ NULL, +/* a997 */ NULL, +/* a998 */ NULL, +/* a999 */ NULL, +/* a99a */ NULL, +/* a99b */ NULL, +/* a99c */ NULL, +/* a99d */ NULL, +/* a99e */ NULL, +/* a99f */ NULL, +/* a9a0 */ NULL, +/* a9a1 */ NULL, +/* a9a2 */ NULL, +/* a9a3 */ NULL, +/* a9a4 */ NULL, +/* a9a5 */ NULL, +/* a9a6 */ NULL, +/* a9a7 */ NULL, +/* a9a8 */ NULL, +/* a9a9 */ NULL, +/* a9aa */ NULL, +/* a9ab */ NULL, +/* a9ac */ NULL, +/* a9ad */ NULL, +/* a9ae */ NULL, +/* a9af */ NULL, +/* a9b0 */ NULL, +/* a9b1 */ NULL, +/* a9b2 */ NULL, +/* a9b3 */ NULL, +/* a9b4 */ NULL, +/* a9b5 */ NULL, +/* a9b6 */ NULL, +/* a9b7 */ NULL, +/* a9b8 */ NULL, +/* a9b9 */ NULL, +/* a9ba */ NULL, +/* a9bb */ NULL, +/* a9bc */ NULL, +/* a9bd */ NULL, +/* a9be */ NULL, +/* a9bf */ NULL, +/* a9c0 */ NULL, +/* a9c1 */ NULL, +/* a9c2 */ NULL, +/* a9c3 */ NULL, +/* a9c4 */ NULL, +/* a9c5 */ NULL, +/* a9c6 */ NULL, +/* a9c7 */ NULL, +/* a9c8 */ NULL, +/* a9c9 */ NULL, +/* a9ca */ NULL, +/* a9cb */ NULL, +/* a9cc */ NULL, +/* a9cd */ NULL, +/* a9ce */ NULL, +/* a9cf */ NULL, +/* a9d0 */ NULL, +/* a9d1 */ NULL, +/* a9d2 */ NULL, +/* a9d3 */ NULL, +/* a9d4 */ NULL, +/* a9d5 */ NULL, +/* a9d6 */ NULL, +/* a9d7 */ NULL, +/* a9d8 */ NULL, +/* a9d9 */ NULL, +/* a9da */ NULL, +/* a9db */ NULL, +/* a9dc */ NULL, +/* a9dd */ NULL, +/* a9de */ NULL, +/* a9df */ NULL, +/* a9e0 */ NULL, +/* a9e1 */ NULL, +/* a9e2 */ NULL, +/* a9e3 */ NULL, +/* a9e4 */ NULL, +/* a9e5 */ NULL, +/* a9e6 */ NULL, +/* a9e7 */ NULL, +/* a9e8 */ NULL, +/* a9e9 */ NULL, +/* a9ea */ NULL, +/* a9eb */ NULL, +/* a9ec */ NULL, +/* a9ed */ NULL, +/* a9ee */ NULL, +/* a9ef */ NULL, +/* a9f0 */ NULL, +/* a9f1 */ NULL, +/* a9f2 */ NULL, +/* a9f3 */ NULL, +/* a9f4 */ NULL, +/* a9f5 */ NULL, +/* a9f6 */ NULL, +/* a9f7 */ NULL, +/* a9f8 */ NULL, +/* a9f9 */ NULL, +/* a9fa */ NULL, +/* a9fb */ NULL, +/* a9fc */ NULL, +/* a9fd */ NULL, +/* a9fe */ NULL, +/* a9ff */ NULL, +/* aa00 */ NULL, +/* aa01 */ NULL, +/* aa02 */ NULL, +/* aa03 */ NULL, +/* aa04 */ NULL, +/* aa05 */ NULL, +/* aa06 */ NULL, +/* aa07 */ NULL, +/* aa08 */ NULL, +/* aa09 */ NULL, +/* aa0a */ NULL, +/* aa0b */ NULL, +/* aa0c */ NULL, +/* aa0d */ NULL, +/* aa0e */ NULL, +/* aa0f */ NULL, +/* aa10 */ NULL, +/* aa11 */ NULL, +/* aa12 */ NULL, +/* aa13 */ NULL, +/* aa14 */ NULL, +/* aa15 */ NULL, +/* aa16 */ NULL, +/* aa17 */ NULL, +/* aa18 */ NULL, +/* aa19 */ NULL, +/* aa1a */ NULL, +/* aa1b */ NULL, +/* aa1c */ NULL, +/* aa1d */ NULL, +/* aa1e */ NULL, +/* aa1f */ NULL, +/* aa20 */ NULL, +/* aa21 */ NULL, +/* aa22 */ NULL, +/* aa23 */ NULL, +/* aa24 */ NULL, +/* aa25 */ NULL, +/* aa26 */ NULL, +/* aa27 */ NULL, +/* aa28 */ NULL, +/* aa29 */ NULL, +/* aa2a */ NULL, +/* aa2b */ NULL, +/* aa2c */ NULL, +/* aa2d */ NULL, +/* aa2e */ NULL, +/* aa2f */ NULL, +/* aa30 */ NULL, +/* aa31 */ NULL, +/* aa32 */ NULL, +/* aa33 */ NULL, +/* aa34 */ NULL, +/* aa35 */ NULL, +/* aa36 */ NULL, +/* aa37 */ NULL, +/* aa38 */ NULL, +/* aa39 */ NULL, +/* aa3a */ NULL, +/* aa3b */ NULL, +/* aa3c */ NULL, +/* aa3d */ NULL, +/* aa3e */ NULL, +/* aa3f */ NULL, +/* aa40 */ NULL, +/* aa41 */ NULL, +/* aa42 */ NULL, +/* aa43 */ NULL, +/* aa44 */ NULL, +/* aa45 */ NULL, +/* aa46 */ NULL, +/* aa47 */ NULL, +/* aa48 */ NULL, +/* aa49 */ NULL, +/* aa4a */ NULL, +/* aa4b */ NULL, +/* aa4c */ NULL, +/* aa4d */ NULL, +/* aa4e */ NULL, +/* aa4f */ NULL, +/* aa50 */ NULL, +/* aa51 */ NULL, +/* aa52 */ NULL, +/* aa53 */ NULL, +/* aa54 */ NULL, +/* aa55 */ NULL, +/* aa56 */ NULL, +/* aa57 */ NULL, +/* aa58 */ NULL, +/* aa59 */ NULL, +/* aa5a */ NULL, +/* aa5b */ NULL, +/* aa5c */ NULL, +/* aa5d */ NULL, +/* aa5e */ NULL, +/* aa5f */ NULL, +/* aa60 */ NULL, +/* aa61 */ NULL, +/* aa62 */ NULL, +/* aa63 */ NULL, +/* aa64 */ NULL, +/* aa65 */ NULL, +/* aa66 */ NULL, +/* aa67 */ NULL, +/* aa68 */ NULL, +/* aa69 */ NULL, +/* aa6a */ NULL, +/* aa6b */ NULL, +/* aa6c */ NULL, +/* aa6d */ NULL, +/* aa6e */ NULL, +/* aa6f */ NULL, +/* aa70 */ NULL, +/* aa71 */ NULL, +/* aa72 */ NULL, +/* aa73 */ NULL, +/* aa74 */ NULL, +/* aa75 */ NULL, +/* aa76 */ NULL, +/* aa77 */ NULL, +/* aa78 */ NULL, +/* aa79 */ NULL, +/* aa7a */ NULL, +/* aa7b */ NULL, +/* aa7c */ NULL, +/* aa7d */ NULL, +/* aa7e */ NULL, +/* aa7f */ NULL, +/* aa80 */ NULL, +/* aa81 */ NULL, +/* aa82 */ NULL, +/* aa83 */ NULL, +/* aa84 */ NULL, +/* aa85 */ NULL, +/* aa86 */ NULL, +/* aa87 */ NULL, +/* aa88 */ NULL, +/* aa89 */ NULL, +/* aa8a */ NULL, +/* aa8b */ NULL, +/* aa8c */ NULL, +/* aa8d */ NULL, +/* aa8e */ NULL, +/* aa8f */ NULL, +/* aa90 */ NULL, +/* aa91 */ NULL, +/* aa92 */ NULL, +/* aa93 */ NULL, +/* aa94 */ NULL, +/* aa95 */ NULL, +/* aa96 */ NULL, +/* aa97 */ NULL, +/* aa98 */ NULL, +/* aa99 */ NULL, +/* aa9a */ NULL, +/* aa9b */ NULL, +/* aa9c */ NULL, +/* aa9d */ NULL, +/* aa9e */ NULL, +/* aa9f */ NULL, +/* aaa0 */ NULL, +/* aaa1 */ NULL, +/* aaa2 */ NULL, +/* aaa3 */ NULL, +/* aaa4 */ NULL, +/* aaa5 */ NULL, +/* aaa6 */ NULL, +/* aaa7 */ NULL, +/* aaa8 */ NULL, +/* aaa9 */ NULL, +/* aaaa */ NULL, +/* aaab */ NULL, +/* aaac */ NULL, +/* aaad */ NULL, +/* aaae */ NULL, +/* aaaf */ NULL, +/* aab0 */ NULL, +/* aab1 */ NULL, +/* aab2 */ NULL, +/* aab3 */ NULL, +/* aab4 */ NULL, +/* aab5 */ NULL, +/* aab6 */ NULL, +/* aab7 */ NULL, +/* aab8 */ NULL, +/* aab9 */ NULL, +/* aaba */ NULL, +/* aabb */ NULL, +/* aabc */ NULL, +/* aabd */ NULL, +/* aabe */ NULL, +/* aabf */ NULL, +/* aac0 */ NULL, +/* aac1 */ NULL, +/* aac2 */ NULL, +/* aac3 */ NULL, +/* aac4 */ NULL, +/* aac5 */ NULL, +/* aac6 */ NULL, +/* aac7 */ NULL, +/* aac8 */ NULL, +/* aac9 */ NULL, +/* aaca */ NULL, +/* aacb */ NULL, +/* aacc */ NULL, +/* aacd */ NULL, +/* aace */ NULL, +/* aacf */ NULL, +/* aad0 */ NULL, +/* aad1 */ NULL, +/* aad2 */ NULL, +/* aad3 */ NULL, +/* aad4 */ NULL, +/* aad5 */ NULL, +/* aad6 */ NULL, +/* aad7 */ NULL, +/* aad8 */ NULL, +/* aad9 */ NULL, +/* aada */ NULL, +/* aadb */ NULL, +/* aadc */ NULL, +/* aadd */ NULL, +/* aade */ NULL, +/* aadf */ NULL, +/* aae0 */ NULL, +/* aae1 */ NULL, +/* aae2 */ NULL, +/* aae3 */ NULL, +/* aae4 */ NULL, +/* aae5 */ NULL, +/* aae6 */ NULL, +/* aae7 */ NULL, +/* aae8 */ NULL, +/* aae9 */ NULL, +/* aaea */ NULL, +/* aaeb */ NULL, +/* aaec */ NULL, +/* aaed */ NULL, +/* aaee */ NULL, +/* aaef */ NULL, +/* aaf0 */ NULL, +/* aaf1 */ NULL, +/* aaf2 */ NULL, +/* aaf3 */ NULL, +/* aaf4 */ NULL, +/* aaf5 */ NULL, +/* aaf6 */ NULL, +/* aaf7 */ NULL, +/* aaf8 */ NULL, +/* aaf9 */ NULL, +/* aafa */ NULL, +/* aafb */ NULL, +/* aafc */ NULL, +/* aafd */ NULL, +/* aafe */ NULL, +/* aaff */ NULL, +/* ab00 */ NULL, +/* ab01 */ NULL, +/* ab02 */ NULL, +/* ab03 */ NULL, +/* ab04 */ NULL, +/* ab05 */ NULL, +/* ab06 */ NULL, +/* ab07 */ NULL, +/* ab08 */ NULL, +/* ab09 */ NULL, +/* ab0a */ NULL, +/* ab0b */ NULL, +/* ab0c */ NULL, +/* ab0d */ NULL, +/* ab0e */ NULL, +/* ab0f */ NULL, +/* ab10 */ NULL, +/* ab11 */ NULL, +/* ab12 */ NULL, +/* ab13 */ NULL, +/* ab14 */ NULL, +/* ab15 */ NULL, +/* ab16 */ NULL, +/* ab17 */ NULL, +/* ab18 */ NULL, +/* ab19 */ NULL, +/* ab1a */ NULL, +/* ab1b */ NULL, +/* ab1c */ NULL, +/* ab1d */ NULL, +/* ab1e */ NULL, +/* ab1f */ NULL, +/* ab20 */ NULL, +/* ab21 */ NULL, +/* ab22 */ NULL, +/* ab23 */ NULL, +/* ab24 */ NULL, +/* ab25 */ NULL, +/* ab26 */ NULL, +/* ab27 */ NULL, +/* ab28 */ NULL, +/* ab29 */ NULL, +/* ab2a */ NULL, +/* ab2b */ NULL, +/* ab2c */ NULL, +/* ab2d */ NULL, +/* ab2e */ NULL, +/* ab2f */ NULL, +/* ab30 */ NULL, +/* ab31 */ NULL, +/* ab32 */ NULL, +/* ab33 */ NULL, +/* ab34 */ NULL, +/* ab35 */ NULL, +/* ab36 */ NULL, +/* ab37 */ NULL, +/* ab38 */ NULL, +/* ab39 */ NULL, +/* ab3a */ NULL, +/* ab3b */ NULL, +/* ab3c */ NULL, +/* ab3d */ NULL, +/* ab3e */ NULL, +/* ab3f */ NULL, +/* ab40 */ NULL, +/* ab41 */ NULL, +/* ab42 */ NULL, +/* ab43 */ NULL, +/* ab44 */ NULL, +/* ab45 */ NULL, +/* ab46 */ NULL, +/* ab47 */ NULL, +/* ab48 */ NULL, +/* ab49 */ NULL, +/* ab4a */ NULL, +/* ab4b */ NULL, +/* ab4c */ NULL, +/* ab4d */ NULL, +/* ab4e */ NULL, +/* ab4f */ NULL, +/* ab50 */ NULL, +/* ab51 */ NULL, +/* ab52 */ NULL, +/* ab53 */ NULL, +/* ab54 */ NULL, +/* ab55 */ NULL, +/* ab56 */ NULL, +/* ab57 */ NULL, +/* ab58 */ NULL, +/* ab59 */ NULL, +/* ab5a */ NULL, +/* ab5b */ NULL, +/* ab5c */ NULL, +/* ab5d */ NULL, +/* ab5e */ NULL, +/* ab5f */ NULL, +/* ab60 */ NULL, +/* ab61 */ NULL, +/* ab62 */ NULL, +/* ab63 */ NULL, +/* ab64 */ NULL, +/* ab65 */ NULL, +/* ab66 */ NULL, +/* ab67 */ NULL, +/* ab68 */ NULL, +/* ab69 */ NULL, +/* ab6a */ NULL, +/* ab6b */ NULL, +/* ab6c */ NULL, +/* ab6d */ NULL, +/* ab6e */ NULL, +/* ab6f */ NULL, +/* ab70 */ NULL, +/* ab71 */ NULL, +/* ab72 */ NULL, +/* ab73 */ NULL, +/* ab74 */ NULL, +/* ab75 */ NULL, +/* ab76 */ NULL, +/* ab77 */ NULL, +/* ab78 */ NULL, +/* ab79 */ NULL, +/* ab7a */ NULL, +/* ab7b */ NULL, +/* ab7c */ NULL, +/* ab7d */ NULL, +/* ab7e */ NULL, +/* ab7f */ NULL, +/* ab80 */ NULL, +/* ab81 */ NULL, +/* ab82 */ NULL, +/* ab83 */ NULL, +/* ab84 */ NULL, +/* ab85 */ NULL, +/* ab86 */ NULL, +/* ab87 */ NULL, +/* ab88 */ NULL, +/* ab89 */ NULL, +/* ab8a */ NULL, +/* ab8b */ NULL, +/* ab8c */ NULL, +/* ab8d */ NULL, +/* ab8e */ NULL, +/* ab8f */ NULL, +/* ab90 */ NULL, +/* ab91 */ NULL, +/* ab92 */ NULL, +/* ab93 */ NULL, +/* ab94 */ NULL, +/* ab95 */ NULL, +/* ab96 */ NULL, +/* ab97 */ NULL, +/* ab98 */ NULL, +/* ab99 */ NULL, +/* ab9a */ NULL, +/* ab9b */ NULL, +/* ab9c */ NULL, +/* ab9d */ NULL, +/* ab9e */ NULL, +/* ab9f */ NULL, +/* aba0 */ NULL, +/* aba1 */ NULL, +/* aba2 */ NULL, +/* aba3 */ NULL, +/* aba4 */ NULL, +/* aba5 */ NULL, +/* aba6 */ NULL, +/* aba7 */ NULL, +/* aba8 */ NULL, +/* aba9 */ NULL, +/* abaa */ NULL, +/* abab */ NULL, +/* abac */ NULL, +/* abad */ NULL, +/* abae */ NULL, +/* abaf */ NULL, +/* abb0 */ NULL, +/* abb1 */ NULL, +/* abb2 */ NULL, +/* abb3 */ NULL, +/* abb4 */ NULL, +/* abb5 */ NULL, +/* abb6 */ NULL, +/* abb7 */ NULL, +/* abb8 */ NULL, +/* abb9 */ NULL, +/* abba */ NULL, +/* abbb */ NULL, +/* abbc */ NULL, +/* abbd */ NULL, +/* abbe */ NULL, +/* abbf */ NULL, +/* abc0 */ NULL, +/* abc1 */ NULL, +/* abc2 */ NULL, +/* abc3 */ NULL, +/* abc4 */ NULL, +/* abc5 */ NULL, +/* abc6 */ NULL, +/* abc7 */ NULL, +/* abc8 */ NULL, +/* abc9 */ NULL, +/* abca */ NULL, +/* abcb */ NULL, +/* abcc */ NULL, +/* abcd */ NULL, +/* abce */ NULL, +/* abcf */ NULL, +/* abd0 */ NULL, +/* abd1 */ NULL, +/* abd2 */ NULL, +/* abd3 */ NULL, +/* abd4 */ NULL, +/* abd5 */ NULL, +/* abd6 */ NULL, +/* abd7 */ NULL, +/* abd8 */ NULL, +/* abd9 */ NULL, +/* abda */ NULL, +/* abdb */ NULL, +/* abdc */ NULL, +/* abdd */ NULL, +/* abde */ NULL, +/* abdf */ NULL, +/* abe0 */ NULL, +/* abe1 */ NULL, +/* abe2 */ NULL, +/* abe3 */ NULL, +/* abe4 */ NULL, +/* abe5 */ NULL, +/* abe6 */ NULL, +/* abe7 */ NULL, +/* abe8 */ NULL, +/* abe9 */ NULL, +/* abea */ NULL, +/* abeb */ NULL, +/* abec */ NULL, +/* abed */ NULL, +/* abee */ NULL, +/* abef */ NULL, +/* abf0 */ NULL, +/* abf1 */ NULL, +/* abf2 */ NULL, +/* abf3 */ NULL, +/* abf4 */ NULL, +/* abf5 */ NULL, +/* abf6 */ NULL, +/* abf7 */ NULL, +/* abf8 */ NULL, +/* abf9 */ NULL, +/* abfa */ NULL, +/* abfb */ NULL, +/* abfc */ NULL, +/* abfd */ NULL, +/* abfe */ NULL, +/* abff */ NULL, +/* ac00 */ NULL, +/* ac01 */ NULL, +/* ac02 */ NULL, +/* ac03 */ NULL, +/* ac04 */ NULL, +/* ac05 */ NULL, +/* ac06 */ NULL, +/* ac07 */ NULL, +/* ac08 */ NULL, +/* ac09 */ NULL, +/* ac0a */ NULL, +/* ac0b */ NULL, +/* ac0c */ NULL, +/* ac0d */ NULL, +/* ac0e */ NULL, +/* ac0f */ NULL, +/* ac10 */ NULL, +/* ac11 */ NULL, +/* ac12 */ NULL, +/* ac13 */ NULL, +/* ac14 */ NULL, +/* ac15 */ NULL, +/* ac16 */ NULL, +/* ac17 */ NULL, +/* ac18 */ NULL, +/* ac19 */ NULL, +/* ac1a */ NULL, +/* ac1b */ NULL, +/* ac1c */ NULL, +/* ac1d */ NULL, +/* ac1e */ NULL, +/* ac1f */ NULL, +/* ac20 */ NULL, +/* ac21 */ NULL, +/* ac22 */ NULL, +/* ac23 */ NULL, +/* ac24 */ NULL, +/* ac25 */ NULL, +/* ac26 */ NULL, +/* ac27 */ NULL, +/* ac28 */ NULL, +/* ac29 */ NULL, +/* ac2a */ NULL, +/* ac2b */ NULL, +/* ac2c */ NULL, +/* ac2d */ NULL, +/* ac2e */ NULL, +/* ac2f */ NULL, +/* ac30 */ NULL, +/* ac31 */ NULL, +/* ac32 */ NULL, +/* ac33 */ NULL, +/* ac34 */ NULL, +/* ac35 */ NULL, +/* ac36 */ NULL, +/* ac37 */ NULL, +/* ac38 */ NULL, +/* ac39 */ NULL, +/* ac3a */ NULL, +/* ac3b */ NULL, +/* ac3c */ NULL, +/* ac3d */ NULL, +/* ac3e */ NULL, +/* ac3f */ NULL, +/* ac40 */ NULL, +/* ac41 */ NULL, +/* ac42 */ NULL, +/* ac43 */ NULL, +/* ac44 */ NULL, +/* ac45 */ NULL, +/* ac46 */ NULL, +/* ac47 */ NULL, +/* ac48 */ NULL, +/* ac49 */ NULL, +/* ac4a */ NULL, +/* ac4b */ NULL, +/* ac4c */ NULL, +/* ac4d */ NULL, +/* ac4e */ NULL, +/* ac4f */ NULL, +/* ac50 */ NULL, +/* ac51 */ NULL, +/* ac52 */ NULL, +/* ac53 */ NULL, +/* ac54 */ NULL, +/* ac55 */ NULL, +/* ac56 */ NULL, +/* ac57 */ NULL, +/* ac58 */ NULL, +/* ac59 */ NULL, +/* ac5a */ NULL, +/* ac5b */ NULL, +/* ac5c */ NULL, +/* ac5d */ NULL, +/* ac5e */ NULL, +/* ac5f */ NULL, +/* ac60 */ NULL, +/* ac61 */ NULL, +/* ac62 */ NULL, +/* ac63 */ NULL, +/* ac64 */ NULL, +/* ac65 */ NULL, +/* ac66 */ NULL, +/* ac67 */ NULL, +/* ac68 */ NULL, +/* ac69 */ NULL, +/* ac6a */ NULL, +/* ac6b */ NULL, +/* ac6c */ NULL, +/* ac6d */ NULL, +/* ac6e */ NULL, +/* ac6f */ NULL, +/* ac70 */ NULL, +/* ac71 */ NULL, +/* ac72 */ NULL, +/* ac73 */ NULL, +/* ac74 */ NULL, +/* ac75 */ NULL, +/* ac76 */ NULL, +/* ac77 */ NULL, +/* ac78 */ NULL, +/* ac79 */ NULL, +/* ac7a */ NULL, +/* ac7b */ NULL, +/* ac7c */ NULL, +/* ac7d */ NULL, +/* ac7e */ NULL, +/* ac7f */ NULL, +/* ac80 */ NULL, +/* ac81 */ NULL, +/* ac82 */ NULL, +/* ac83 */ NULL, +/* ac84 */ NULL, +/* ac85 */ NULL, +/* ac86 */ NULL, +/* ac87 */ NULL, +/* ac88 */ NULL, +/* ac89 */ NULL, +/* ac8a */ NULL, +/* ac8b */ NULL, +/* ac8c */ NULL, +/* ac8d */ NULL, +/* ac8e */ NULL, +/* ac8f */ NULL, +/* ac90 */ NULL, +/* ac91 */ NULL, +/* ac92 */ NULL, +/* ac93 */ NULL, +/* ac94 */ NULL, +/* ac95 */ NULL, +/* ac96 */ NULL, +/* ac97 */ NULL, +/* ac98 */ NULL, +/* ac99 */ NULL, +/* ac9a */ NULL, +/* ac9b */ NULL, +/* ac9c */ NULL, +/* ac9d */ NULL, +/* ac9e */ NULL, +/* ac9f */ NULL, +/* aca0 */ NULL, +/* aca1 */ NULL, +/* aca2 */ NULL, +/* aca3 */ NULL, +/* aca4 */ NULL, +/* aca5 */ NULL, +/* aca6 */ NULL, +/* aca7 */ NULL, +/* aca8 */ NULL, +/* aca9 */ NULL, +/* acaa */ NULL, +/* acab */ NULL, +/* acac */ NULL, +/* acad */ NULL, +/* acae */ NULL, +/* acaf */ NULL, +/* acb0 */ NULL, +/* acb1 */ NULL, +/* acb2 */ NULL, +/* acb3 */ NULL, +/* acb4 */ NULL, +/* acb5 */ NULL, +/* acb6 */ NULL, +/* acb7 */ NULL, +/* acb8 */ NULL, +/* acb9 */ NULL, +/* acba */ NULL, +/* acbb */ NULL, +/* acbc */ NULL, +/* acbd */ NULL, +/* acbe */ NULL, +/* acbf */ NULL, +/* acc0 */ NULL, +/* acc1 */ NULL, +/* acc2 */ NULL, +/* acc3 */ NULL, +/* acc4 */ NULL, +/* acc5 */ NULL, +/* acc6 */ NULL, +/* acc7 */ NULL, +/* acc8 */ NULL, +/* acc9 */ NULL, +/* acca */ NULL, +/* accb */ NULL, +/* accc */ NULL, +/* accd */ NULL, +/* acce */ NULL, +/* accf */ NULL, +/* acd0 */ NULL, +/* acd1 */ NULL, +/* acd2 */ NULL, +/* acd3 */ NULL, +/* acd4 */ NULL, +/* acd5 */ NULL, +/* acd6 */ NULL, +/* acd7 */ NULL, +/* acd8 */ NULL, +/* acd9 */ NULL, +/* acda */ NULL, +/* acdb */ NULL, +/* acdc */ NULL, +/* acdd */ NULL, +/* acde */ NULL, +/* acdf */ NULL, +/* ace0 */ NULL, +/* ace1 */ NULL, +/* ace2 */ NULL, +/* ace3 */ NULL, +/* ace4 */ NULL, +/* ace5 */ NULL, +/* ace6 */ NULL, +/* ace7 */ NULL, +/* ace8 */ NULL, +/* ace9 */ NULL, +/* acea */ NULL, +/* aceb */ NULL, +/* acec */ NULL, +/* aced */ NULL, +/* acee */ NULL, +/* acef */ NULL, +/* acf0 */ NULL, +/* acf1 */ NULL, +/* acf2 */ NULL, +/* acf3 */ NULL, +/* acf4 */ NULL, +/* acf5 */ NULL, +/* acf6 */ NULL, +/* acf7 */ NULL, +/* acf8 */ NULL, +/* acf9 */ NULL, +/* acfa */ NULL, +/* acfb */ NULL, +/* acfc */ NULL, +/* acfd */ NULL, +/* acfe */ NULL, +/* acff */ NULL, +/* ad00 */ NULL, +/* ad01 */ NULL, +/* ad02 */ NULL, +/* ad03 */ NULL, +/* ad04 */ NULL, +/* ad05 */ NULL, +/* ad06 */ NULL, +/* ad07 */ NULL, +/* ad08 */ NULL, +/* ad09 */ NULL, +/* ad0a */ NULL, +/* ad0b */ NULL, +/* ad0c */ NULL, +/* ad0d */ NULL, +/* ad0e */ NULL, +/* ad0f */ NULL, +/* ad10 */ NULL, +/* ad11 */ NULL, +/* ad12 */ NULL, +/* ad13 */ NULL, +/* ad14 */ NULL, +/* ad15 */ NULL, +/* ad16 */ NULL, +/* ad17 */ NULL, +/* ad18 */ NULL, +/* ad19 */ NULL, +/* ad1a */ NULL, +/* ad1b */ NULL, +/* ad1c */ NULL, +/* ad1d */ NULL, +/* ad1e */ NULL, +/* ad1f */ NULL, +/* ad20 */ NULL, +/* ad21 */ NULL, +/* ad22 */ NULL, +/* ad23 */ NULL, +/* ad24 */ NULL, +/* ad25 */ NULL, +/* ad26 */ NULL, +/* ad27 */ NULL, +/* ad28 */ NULL, +/* ad29 */ NULL, +/* ad2a */ NULL, +/* ad2b */ NULL, +/* ad2c */ NULL, +/* ad2d */ NULL, +/* ad2e */ NULL, +/* ad2f */ NULL, +/* ad30 */ NULL, +/* ad31 */ NULL, +/* ad32 */ NULL, +/* ad33 */ NULL, +/* ad34 */ NULL, +/* ad35 */ NULL, +/* ad36 */ NULL, +/* ad37 */ NULL, +/* ad38 */ NULL, +/* ad39 */ NULL, +/* ad3a */ NULL, +/* ad3b */ NULL, +/* ad3c */ NULL, +/* ad3d */ NULL, +/* ad3e */ NULL, +/* ad3f */ NULL, +/* ad40 */ NULL, +/* ad41 */ NULL, +/* ad42 */ NULL, +/* ad43 */ NULL, +/* ad44 */ NULL, +/* ad45 */ NULL, +/* ad46 */ NULL, +/* ad47 */ NULL, +/* ad48 */ NULL, +/* ad49 */ NULL, +/* ad4a */ NULL, +/* ad4b */ NULL, +/* ad4c */ NULL, +/* ad4d */ NULL, +/* ad4e */ NULL, +/* ad4f */ NULL, +/* ad50 */ NULL, +/* ad51 */ NULL, +/* ad52 */ NULL, +/* ad53 */ NULL, +/* ad54 */ NULL, +/* ad55 */ NULL, +/* ad56 */ NULL, +/* ad57 */ NULL, +/* ad58 */ NULL, +/* ad59 */ NULL, +/* ad5a */ NULL, +/* ad5b */ NULL, +/* ad5c */ NULL, +/* ad5d */ NULL, +/* ad5e */ NULL, +/* ad5f */ NULL, +/* ad60 */ NULL, +/* ad61 */ NULL, +/* ad62 */ NULL, +/* ad63 */ NULL, +/* ad64 */ NULL, +/* ad65 */ NULL, +/* ad66 */ NULL, +/* ad67 */ NULL, +/* ad68 */ NULL, +/* ad69 */ NULL, +/* ad6a */ NULL, +/* ad6b */ NULL, +/* ad6c */ NULL, +/* ad6d */ NULL, +/* ad6e */ NULL, +/* ad6f */ NULL, +/* ad70 */ NULL, +/* ad71 */ NULL, +/* ad72 */ NULL, +/* ad73 */ NULL, +/* ad74 */ NULL, +/* ad75 */ NULL, +/* ad76 */ NULL, +/* ad77 */ NULL, +/* ad78 */ NULL, +/* ad79 */ NULL, +/* ad7a */ NULL, +/* ad7b */ NULL, +/* ad7c */ NULL, +/* ad7d */ NULL, +/* ad7e */ NULL, +/* ad7f */ NULL, +/* ad80 */ NULL, +/* ad81 */ NULL, +/* ad82 */ NULL, +/* ad83 */ NULL, +/* ad84 */ NULL, +/* ad85 */ NULL, +/* ad86 */ NULL, +/* ad87 */ NULL, +/* ad88 */ NULL, +/* ad89 */ NULL, +/* ad8a */ NULL, +/* ad8b */ NULL, +/* ad8c */ NULL, +/* ad8d */ NULL, +/* ad8e */ NULL, +/* ad8f */ NULL, +/* ad90 */ NULL, +/* ad91 */ NULL, +/* ad92 */ NULL, +/* ad93 */ NULL, +/* ad94 */ NULL, +/* ad95 */ NULL, +/* ad96 */ NULL, +/* ad97 */ NULL, +/* ad98 */ NULL, +/* ad99 */ NULL, +/* ad9a */ NULL, +/* ad9b */ NULL, +/* ad9c */ NULL, +/* ad9d */ NULL, +/* ad9e */ NULL, +/* ad9f */ NULL, +/* ada0 */ NULL, +/* ada1 */ NULL, +/* ada2 */ NULL, +/* ada3 */ NULL, +/* ada4 */ NULL, +/* ada5 */ NULL, +/* ada6 */ NULL, +/* ada7 */ NULL, +/* ada8 */ NULL, +/* ada9 */ NULL, +/* adaa */ NULL, +/* adab */ NULL, +/* adac */ NULL, +/* adad */ NULL, +/* adae */ NULL, +/* adaf */ NULL, +/* adb0 */ NULL, +/* adb1 */ NULL, +/* adb2 */ NULL, +/* adb3 */ NULL, +/* adb4 */ NULL, +/* adb5 */ NULL, +/* adb6 */ NULL, +/* adb7 */ NULL, +/* adb8 */ NULL, +/* adb9 */ NULL, +/* adba */ NULL, +/* adbb */ NULL, +/* adbc */ NULL, +/* adbd */ NULL, +/* adbe */ NULL, +/* adbf */ NULL, +/* adc0 */ NULL, +/* adc1 */ NULL, +/* adc2 */ NULL, +/* adc3 */ NULL, +/* adc4 */ NULL, +/* adc5 */ NULL, +/* adc6 */ NULL, +/* adc7 */ NULL, +/* adc8 */ NULL, +/* adc9 */ NULL, +/* adca */ NULL, +/* adcb */ NULL, +/* adcc */ NULL, +/* adcd */ NULL, +/* adce */ NULL, +/* adcf */ NULL, +/* add0 */ NULL, +/* add1 */ NULL, +/* add2 */ NULL, +/* add3 */ NULL, +/* add4 */ NULL, +/* add5 */ NULL, +/* add6 */ NULL, +/* add7 */ NULL, +/* add8 */ NULL, +/* add9 */ NULL, +/* adda */ NULL, +/* addb */ NULL, +/* addc */ NULL, +/* addd */ NULL, +/* adde */ NULL, +/* addf */ NULL, +/* ade0 */ NULL, +/* ade1 */ NULL, +/* ade2 */ NULL, +/* ade3 */ NULL, +/* ade4 */ NULL, +/* ade5 */ NULL, +/* ade6 */ NULL, +/* ade7 */ NULL, +/* ade8 */ NULL, +/* ade9 */ NULL, +/* adea */ NULL, +/* adeb */ NULL, +/* adec */ NULL, +/* aded */ NULL, +/* adee */ NULL, +/* adef */ NULL, +/* adf0 */ NULL, +/* adf1 */ NULL, +/* adf2 */ NULL, +/* adf3 */ NULL, +/* adf4 */ NULL, +/* adf5 */ NULL, +/* adf6 */ NULL, +/* adf7 */ NULL, +/* adf8 */ NULL, +/* adf9 */ NULL, +/* adfa */ NULL, +/* adfb */ NULL, +/* adfc */ NULL, +/* adfd */ NULL, +/* adfe */ NULL, +/* adff */ NULL, +/* ae00 */ NULL, +/* ae01 */ NULL, +/* ae02 */ NULL, +/* ae03 */ NULL, +/* ae04 */ NULL, +/* ae05 */ NULL, +/* ae06 */ NULL, +/* ae07 */ NULL, +/* ae08 */ NULL, +/* ae09 */ NULL, +/* ae0a */ NULL, +/* ae0b */ NULL, +/* ae0c */ NULL, +/* ae0d */ NULL, +/* ae0e */ NULL, +/* ae0f */ NULL, +/* ae10 */ NULL, +/* ae11 */ NULL, +/* ae12 */ NULL, +/* ae13 */ NULL, +/* ae14 */ NULL, +/* ae15 */ NULL, +/* ae16 */ NULL, +/* ae17 */ NULL, +/* ae18 */ NULL, +/* ae19 */ NULL, +/* ae1a */ NULL, +/* ae1b */ NULL, +/* ae1c */ NULL, +/* ae1d */ NULL, +/* ae1e */ NULL, +/* ae1f */ NULL, +/* ae20 */ NULL, +/* ae21 */ NULL, +/* ae22 */ NULL, +/* ae23 */ NULL, +/* ae24 */ NULL, +/* ae25 */ NULL, +/* ae26 */ NULL, +/* ae27 */ NULL, +/* ae28 */ NULL, +/* ae29 */ NULL, +/* ae2a */ NULL, +/* ae2b */ NULL, +/* ae2c */ NULL, +/* ae2d */ NULL, +/* ae2e */ NULL, +/* ae2f */ NULL, +/* ae30 */ NULL, +/* ae31 */ NULL, +/* ae32 */ NULL, +/* ae33 */ NULL, +/* ae34 */ NULL, +/* ae35 */ NULL, +/* ae36 */ NULL, +/* ae37 */ NULL, +/* ae38 */ NULL, +/* ae39 */ NULL, +/* ae3a */ NULL, +/* ae3b */ NULL, +/* ae3c */ NULL, +/* ae3d */ NULL, +/* ae3e */ NULL, +/* ae3f */ NULL, +/* ae40 */ NULL, +/* ae41 */ NULL, +/* ae42 */ NULL, +/* ae43 */ NULL, +/* ae44 */ NULL, +/* ae45 */ NULL, +/* ae46 */ NULL, +/* ae47 */ NULL, +/* ae48 */ NULL, +/* ae49 */ NULL, +/* ae4a */ NULL, +/* ae4b */ NULL, +/* ae4c */ NULL, +/* ae4d */ NULL, +/* ae4e */ NULL, +/* ae4f */ NULL, +/* ae50 */ NULL, +/* ae51 */ NULL, +/* ae52 */ NULL, +/* ae53 */ NULL, +/* ae54 */ NULL, +/* ae55 */ NULL, +/* ae56 */ NULL, +/* ae57 */ NULL, +/* ae58 */ NULL, +/* ae59 */ NULL, +/* ae5a */ NULL, +/* ae5b */ NULL, +/* ae5c */ NULL, +/* ae5d */ NULL, +/* ae5e */ NULL, +/* ae5f */ NULL, +/* ae60 */ NULL, +/* ae61 */ NULL, +/* ae62 */ NULL, +/* ae63 */ NULL, +/* ae64 */ NULL, +/* ae65 */ NULL, +/* ae66 */ NULL, +/* ae67 */ NULL, +/* ae68 */ NULL, +/* ae69 */ NULL, +/* ae6a */ NULL, +/* ae6b */ NULL, +/* ae6c */ NULL, +/* ae6d */ NULL, +/* ae6e */ NULL, +/* ae6f */ NULL, +/* ae70 */ NULL, +/* ae71 */ NULL, +/* ae72 */ NULL, +/* ae73 */ NULL, +/* ae74 */ NULL, +/* ae75 */ NULL, +/* ae76 */ NULL, +/* ae77 */ NULL, +/* ae78 */ NULL, +/* ae79 */ NULL, +/* ae7a */ NULL, +/* ae7b */ NULL, +/* ae7c */ NULL, +/* ae7d */ NULL, +/* ae7e */ NULL, +/* ae7f */ NULL, +/* ae80 */ NULL, +/* ae81 */ NULL, +/* ae82 */ NULL, +/* ae83 */ NULL, +/* ae84 */ NULL, +/* ae85 */ NULL, +/* ae86 */ NULL, +/* ae87 */ NULL, +/* ae88 */ NULL, +/* ae89 */ NULL, +/* ae8a */ NULL, +/* ae8b */ NULL, +/* ae8c */ NULL, +/* ae8d */ NULL, +/* ae8e */ NULL, +/* ae8f */ NULL, +/* ae90 */ NULL, +/* ae91 */ NULL, +/* ae92 */ NULL, +/* ae93 */ NULL, +/* ae94 */ NULL, +/* ae95 */ NULL, +/* ae96 */ NULL, +/* ae97 */ NULL, +/* ae98 */ NULL, +/* ae99 */ NULL, +/* ae9a */ NULL, +/* ae9b */ NULL, +/* ae9c */ NULL, +/* ae9d */ NULL, +/* ae9e */ NULL, +/* ae9f */ NULL, +/* aea0 */ NULL, +/* aea1 */ NULL, +/* aea2 */ NULL, +/* aea3 */ NULL, +/* aea4 */ NULL, +/* aea5 */ NULL, +/* aea6 */ NULL, +/* aea7 */ NULL, +/* aea8 */ NULL, +/* aea9 */ NULL, +/* aeaa */ NULL, +/* aeab */ NULL, +/* aeac */ NULL, +/* aead */ NULL, +/* aeae */ NULL, +/* aeaf */ NULL, +/* aeb0 */ NULL, +/* aeb1 */ NULL, +/* aeb2 */ NULL, +/* aeb3 */ NULL, +/* aeb4 */ NULL, +/* aeb5 */ NULL, +/* aeb6 */ NULL, +/* aeb7 */ NULL, +/* aeb8 */ NULL, +/* aeb9 */ NULL, +/* aeba */ NULL, +/* aebb */ NULL, +/* aebc */ NULL, +/* aebd */ NULL, +/* aebe */ NULL, +/* aebf */ NULL, +/* aec0 */ NULL, +/* aec1 */ NULL, +/* aec2 */ NULL, +/* aec3 */ NULL, +/* aec4 */ NULL, +/* aec5 */ NULL, +/* aec6 */ NULL, +/* aec7 */ NULL, +/* aec8 */ NULL, +/* aec9 */ NULL, +/* aeca */ NULL, +/* aecb */ NULL, +/* aecc */ NULL, +/* aecd */ NULL, +/* aece */ NULL, +/* aecf */ NULL, +/* aed0 */ NULL, +/* aed1 */ NULL, +/* aed2 */ NULL, +/* aed3 */ NULL, +/* aed4 */ NULL, +/* aed5 */ NULL, +/* aed6 */ NULL, +/* aed7 */ NULL, +/* aed8 */ NULL, +/* aed9 */ NULL, +/* aeda */ NULL, +/* aedb */ NULL, +/* aedc */ NULL, +/* aedd */ NULL, +/* aede */ NULL, +/* aedf */ NULL, +/* aee0 */ NULL, +/* aee1 */ NULL, +/* aee2 */ NULL, +/* aee3 */ NULL, +/* aee4 */ NULL, +/* aee5 */ NULL, +/* aee6 */ NULL, +/* aee7 */ NULL, +/* aee8 */ NULL, +/* aee9 */ NULL, +/* aeea */ NULL, +/* aeeb */ NULL, +/* aeec */ NULL, +/* aeed */ NULL, +/* aeee */ NULL, +/* aeef */ NULL, +/* aef0 */ NULL, +/* aef1 */ NULL, +/* aef2 */ NULL, +/* aef3 */ NULL, +/* aef4 */ NULL, +/* aef5 */ NULL, +/* aef6 */ NULL, +/* aef7 */ NULL, +/* aef8 */ NULL, +/* aef9 */ NULL, +/* aefa */ NULL, +/* aefb */ NULL, +/* aefc */ NULL, +/* aefd */ NULL, +/* aefe */ NULL, +/* aeff */ NULL, +/* af00 */ NULL, +/* af01 */ NULL, +/* af02 */ NULL, +/* af03 */ NULL, +/* af04 */ NULL, +/* af05 */ NULL, +/* af06 */ NULL, +/* af07 */ NULL, +/* af08 */ NULL, +/* af09 */ NULL, +/* af0a */ NULL, +/* af0b */ NULL, +/* af0c */ NULL, +/* af0d */ NULL, +/* af0e */ NULL, +/* af0f */ NULL, +/* af10 */ NULL, +/* af11 */ NULL, +/* af12 */ NULL, +/* af13 */ NULL, +/* af14 */ NULL, +/* af15 */ NULL, +/* af16 */ NULL, +/* af17 */ NULL, +/* af18 */ NULL, +/* af19 */ NULL, +/* af1a */ NULL, +/* af1b */ NULL, +/* af1c */ NULL, +/* af1d */ NULL, +/* af1e */ NULL, +/* af1f */ NULL, +/* af20 */ NULL, +/* af21 */ NULL, +/* af22 */ NULL, +/* af23 */ NULL, +/* af24 */ NULL, +/* af25 */ NULL, +/* af26 */ NULL, +/* af27 */ NULL, +/* af28 */ NULL, +/* af29 */ NULL, +/* af2a */ NULL, +/* af2b */ NULL, +/* af2c */ NULL, +/* af2d */ NULL, +/* af2e */ NULL, +/* af2f */ NULL, +/* af30 */ NULL, +/* af31 */ NULL, +/* af32 */ NULL, +/* af33 */ NULL, +/* af34 */ NULL, +/* af35 */ NULL, +/* af36 */ NULL, +/* af37 */ NULL, +/* af38 */ NULL, +/* af39 */ NULL, +/* af3a */ NULL, +/* af3b */ NULL, +/* af3c */ NULL, +/* af3d */ NULL, +/* af3e */ NULL, +/* af3f */ NULL, +/* af40 */ NULL, +/* af41 */ NULL, +/* af42 */ NULL, +/* af43 */ NULL, +/* af44 */ NULL, +/* af45 */ NULL, +/* af46 */ NULL, +/* af47 */ NULL, +/* af48 */ NULL, +/* af49 */ NULL, +/* af4a */ NULL, +/* af4b */ NULL, +/* af4c */ NULL, +/* af4d */ NULL, +/* af4e */ NULL, +/* af4f */ NULL, +/* af50 */ NULL, +/* af51 */ NULL, +/* af52 */ NULL, +/* af53 */ NULL, +/* af54 */ NULL, +/* af55 */ NULL, +/* af56 */ NULL, +/* af57 */ NULL, +/* af58 */ NULL, +/* af59 */ NULL, +/* af5a */ NULL, +/* af5b */ NULL, +/* af5c */ NULL, +/* af5d */ NULL, +/* af5e */ NULL, +/* af5f */ NULL, +/* af60 */ NULL, +/* af61 */ NULL, +/* af62 */ NULL, +/* af63 */ NULL, +/* af64 */ NULL, +/* af65 */ NULL, +/* af66 */ NULL, +/* af67 */ NULL, +/* af68 */ NULL, +/* af69 */ NULL, +/* af6a */ NULL, +/* af6b */ NULL, +/* af6c */ NULL, +/* af6d */ NULL, +/* af6e */ NULL, +/* af6f */ NULL, +/* af70 */ NULL, +/* af71 */ NULL, +/* af72 */ NULL, +/* af73 */ NULL, +/* af74 */ NULL, +/* af75 */ NULL, +/* af76 */ NULL, +/* af77 */ NULL, +/* af78 */ NULL, +/* af79 */ NULL, +/* af7a */ NULL, +/* af7b */ NULL, +/* af7c */ NULL, +/* af7d */ NULL, +/* af7e */ NULL, +/* af7f */ NULL, +/* af80 */ NULL, +/* af81 */ NULL, +/* af82 */ NULL, +/* af83 */ NULL, +/* af84 */ NULL, +/* af85 */ NULL, +/* af86 */ NULL, +/* af87 */ NULL, +/* af88 */ NULL, +/* af89 */ NULL, +/* af8a */ NULL, +/* af8b */ NULL, +/* af8c */ NULL, +/* af8d */ NULL, +/* af8e */ NULL, +/* af8f */ NULL, +/* af90 */ NULL, +/* af91 */ NULL, +/* af92 */ NULL, +/* af93 */ NULL, +/* af94 */ NULL, +/* af95 */ NULL, +/* af96 */ NULL, +/* af97 */ NULL, +/* af98 */ NULL, +/* af99 */ NULL, +/* af9a */ NULL, +/* af9b */ NULL, +/* af9c */ NULL, +/* af9d */ NULL, +/* af9e */ NULL, +/* af9f */ NULL, +/* afa0 */ NULL, +/* afa1 */ NULL, +/* afa2 */ NULL, +/* afa3 */ NULL, +/* afa4 */ NULL, +/* afa5 */ NULL, +/* afa6 */ NULL, +/* afa7 */ NULL, +/* afa8 */ NULL, +/* afa9 */ NULL, +/* afaa */ NULL, +/* afab */ NULL, +/* afac */ NULL, +/* afad */ NULL, +/* afae */ NULL, +/* afaf */ NULL, +/* afb0 */ NULL, +/* afb1 */ NULL, +/* afb2 */ NULL, +/* afb3 */ NULL, +/* afb4 */ NULL, +/* afb5 */ NULL, +/* afb6 */ NULL, +/* afb7 */ NULL, +/* afb8 */ NULL, +/* afb9 */ NULL, +/* afba */ NULL, +/* afbb */ NULL, +/* afbc */ NULL, +/* afbd */ NULL, +/* afbe */ NULL, +/* afbf */ NULL, +/* afc0 */ NULL, +/* afc1 */ NULL, +/* afc2 */ NULL, +/* afc3 */ NULL, +/* afc4 */ NULL, +/* afc5 */ NULL, +/* afc6 */ NULL, +/* afc7 */ NULL, +/* afc8 */ NULL, +/* afc9 */ NULL, +/* afca */ NULL, +/* afcb */ NULL, +/* afcc */ NULL, +/* afcd */ NULL, +/* afce */ NULL, +/* afcf */ NULL, +/* afd0 */ NULL, +/* afd1 */ NULL, +/* afd2 */ NULL, +/* afd3 */ NULL, +/* afd4 */ NULL, +/* afd5 */ NULL, +/* afd6 */ NULL, +/* afd7 */ NULL, +/* afd8 */ NULL, +/* afd9 */ NULL, +/* afda */ NULL, +/* afdb */ NULL, +/* afdc */ NULL, +/* afdd */ NULL, +/* afde */ NULL, +/* afdf */ NULL, +/* afe0 */ NULL, +/* afe1 */ NULL, +/* afe2 */ NULL, +/* afe3 */ NULL, +/* afe4 */ NULL, +/* afe5 */ NULL, +/* afe6 */ NULL, +/* afe7 */ NULL, +/* afe8 */ NULL, +/* afe9 */ NULL, +/* afea */ NULL, +/* afeb */ NULL, +/* afec */ NULL, +/* afed */ NULL, +/* afee */ NULL, +/* afef */ NULL, +/* aff0 */ NULL, +/* aff1 */ NULL, +/* aff2 */ NULL, +/* aff3 */ NULL, +/* aff4 */ NULL, +/* aff5 */ NULL, +/* aff6 */ NULL, +/* aff7 */ NULL, +/* aff8 */ NULL, +/* aff9 */ NULL, +/* affa */ NULL, +/* affb */ NULL, +/* affc */ NULL, +/* affd */ NULL, +/* affe */ NULL, +/* afff */ NULL, +/* b000 */ NULL, +/* b001 */ NULL, +/* b002 */ NULL, +/* b003 */ NULL, +/* b004 */ NULL, +/* b005 */ NULL, +/* b006 */ NULL, +/* b007 */ NULL, +/* b008 */ NULL, +/* b009 */ NULL, +/* b00a */ NULL, +/* b00b */ NULL, +/* b00c */ NULL, +/* b00d */ NULL, +/* b00e */ NULL, +/* b00f */ NULL, +/* b010 */ NULL, +/* b011 */ NULL, +/* b012 */ NULL, +/* b013 */ NULL, +/* b014 */ NULL, +/* b015 */ NULL, +/* b016 */ NULL, +/* b017 */ NULL, +/* b018 */ NULL, +/* b019 */ NULL, +/* b01a */ NULL, +/* b01b */ NULL, +/* b01c */ NULL, +/* b01d */ NULL, +/* b01e */ NULL, +/* b01f */ NULL, +/* b020 */ NULL, +/* b021 */ NULL, +/* b022 */ NULL, +/* b023 */ NULL, +/* b024 */ NULL, +/* b025 */ NULL, +/* b026 */ NULL, +/* b027 */ NULL, +/* b028 */ NULL, +/* b029 */ NULL, +/* b02a */ NULL, +/* b02b */ NULL, +/* b02c */ NULL, +/* b02d */ NULL, +/* b02e */ NULL, +/* b02f */ NULL, +/* b030 */ NULL, +/* b031 */ NULL, +/* b032 */ NULL, +/* b033 */ NULL, +/* b034 */ NULL, +/* b035 */ NULL, +/* b036 */ NULL, +/* b037 */ NULL, +/* b038 */ NULL, +/* b039 */ NULL, +/* b03a */ NULL, +/* b03b */ NULL, +/* b03c */ NULL, +/* b03d */ NULL, +/* b03e */ NULL, +/* b03f */ NULL, +/* b040 */ NULL, +/* b041 */ NULL, +/* b042 */ NULL, +/* b043 */ NULL, +/* b044 */ NULL, +/* b045 */ NULL, +/* b046 */ NULL, +/* b047 */ NULL, +/* b048 */ NULL, +/* b049 */ NULL, +/* b04a */ NULL, +/* b04b */ NULL, +/* b04c */ NULL, +/* b04d */ NULL, +/* b04e */ NULL, +/* b04f */ NULL, +/* b050 */ NULL, +/* b051 */ NULL, +/* b052 */ NULL, +/* b053 */ NULL, +/* b054 */ NULL, +/* b055 */ NULL, +/* b056 */ NULL, +/* b057 */ NULL, +/* b058 */ NULL, +/* b059 */ NULL, +/* b05a */ NULL, +/* b05b */ NULL, +/* b05c */ NULL, +/* b05d */ NULL, +/* b05e */ NULL, +/* b05f */ NULL, +/* b060 */ NULL, +/* b061 */ NULL, +/* b062 */ NULL, +/* b063 */ NULL, +/* b064 */ NULL, +/* b065 */ NULL, +/* b066 */ NULL, +/* b067 */ NULL, +/* b068 */ NULL, +/* b069 */ NULL, +/* b06a */ NULL, +/* b06b */ NULL, +/* b06c */ NULL, +/* b06d */ NULL, +/* b06e */ NULL, +/* b06f */ NULL, +/* b070 */ NULL, +/* b071 */ NULL, +/* b072 */ NULL, +/* b073 */ NULL, +/* b074 */ NULL, +/* b075 */ NULL, +/* b076 */ NULL, +/* b077 */ NULL, +/* b078 */ NULL, +/* b079 */ NULL, +/* b07a */ NULL, +/* b07b */ NULL, +/* b07c */ NULL, +/* b07d */ NULL, +/* b07e */ NULL, +/* b07f */ NULL, +/* b080 */ NULL, +/* b081 */ NULL, +/* b082 */ NULL, +/* b083 */ NULL, +/* b084 */ NULL, +/* b085 */ NULL, +/* b086 */ NULL, +/* b087 */ NULL, +/* b088 */ NULL, +/* b089 */ NULL, +/* b08a */ NULL, +/* b08b */ NULL, +/* b08c */ NULL, +/* b08d */ NULL, +/* b08e */ NULL, +/* b08f */ NULL, +/* b090 */ NULL, +/* b091 */ NULL, +/* b092 */ NULL, +/* b093 */ NULL, +/* b094 */ NULL, +/* b095 */ NULL, +/* b096 */ NULL, +/* b097 */ NULL, +/* b098 */ NULL, +/* b099 */ NULL, +/* b09a */ NULL, +/* b09b */ NULL, +/* b09c */ NULL, +/* b09d */ NULL, +/* b09e */ NULL, +/* b09f */ NULL, +/* b0a0 */ NULL, +/* b0a1 */ NULL, +/* b0a2 */ NULL, +/* b0a3 */ NULL, +/* b0a4 */ NULL, +/* b0a5 */ NULL, +/* b0a6 */ NULL, +/* b0a7 */ NULL, +/* b0a8 */ NULL, +/* b0a9 */ NULL, +/* b0aa */ NULL, +/* b0ab */ NULL, +/* b0ac */ NULL, +/* b0ad */ NULL, +/* b0ae */ NULL, +/* b0af */ NULL, +/* b0b0 */ NULL, +/* b0b1 */ NULL, +/* b0b2 */ NULL, +/* b0b3 */ NULL, +/* b0b4 */ NULL, +/* b0b5 */ NULL, +/* b0b6 */ NULL, +/* b0b7 */ NULL, +/* b0b8 */ NULL, +/* b0b9 */ NULL, +/* b0ba */ NULL, +/* b0bb */ NULL, +/* b0bc */ NULL, +/* b0bd */ NULL, +/* b0be */ NULL, +/* b0bf */ NULL, +/* b0c0 */ NULL, +/* b0c1 */ NULL, +/* b0c2 */ NULL, +/* b0c3 */ NULL, +/* b0c4 */ NULL, +/* b0c5 */ NULL, +/* b0c6 */ NULL, +/* b0c7 */ NULL, +/* b0c8 */ NULL, +/* b0c9 */ NULL, +/* b0ca */ NULL, +/* b0cb */ NULL, +/* b0cc */ NULL, +/* b0cd */ NULL, +/* b0ce */ NULL, +/* b0cf */ NULL, +/* b0d0 */ NULL, +/* b0d1 */ NULL, +/* b0d2 */ NULL, +/* b0d3 */ NULL, +/* b0d4 */ NULL, +/* b0d5 */ NULL, +/* b0d6 */ NULL, +/* b0d7 */ NULL, +/* b0d8 */ NULL, +/* b0d9 */ NULL, +/* b0da */ NULL, +/* b0db */ NULL, +/* b0dc */ NULL, +/* b0dd */ NULL, +/* b0de */ NULL, +/* b0df */ NULL, +/* b0e0 */ NULL, +/* b0e1 */ NULL, +/* b0e2 */ NULL, +/* b0e3 */ NULL, +/* b0e4 */ NULL, +/* b0e5 */ NULL, +/* b0e6 */ NULL, +/* b0e7 */ NULL, +/* b0e8 */ NULL, +/* b0e9 */ NULL, +/* b0ea */ NULL, +/* b0eb */ NULL, +/* b0ec */ NULL, +/* b0ed */ NULL, +/* b0ee */ NULL, +/* b0ef */ NULL, +/* b0f0 */ NULL, +/* b0f1 */ NULL, +/* b0f2 */ NULL, +/* b0f3 */ NULL, +/* b0f4 */ NULL, +/* b0f5 */ NULL, +/* b0f6 */ NULL, +/* b0f7 */ NULL, +/* b0f8 */ NULL, +/* b0f9 */ NULL, +/* b0fa */ NULL, +/* b0fb */ NULL, +/* b0fc */ NULL, +/* b0fd */ NULL, +/* b0fe */ NULL, +/* b0ff */ NULL, +/* b100 */ NULL, +/* b101 */ NULL, +/* b102 */ NULL, +/* b103 */ NULL, +/* b104 */ NULL, +/* b105 */ NULL, +/* b106 */ NULL, +/* b107 */ NULL, +/* b108 */ NULL, +/* b109 */ NULL, +/* b10a */ NULL, +/* b10b */ NULL, +/* b10c */ NULL, +/* b10d */ NULL, +/* b10e */ NULL, +/* b10f */ NULL, +/* b110 */ NULL, +/* b111 */ NULL, +/* b112 */ NULL, +/* b113 */ NULL, +/* b114 */ NULL, +/* b115 */ NULL, +/* b116 */ NULL, +/* b117 */ NULL, +/* b118 */ NULL, +/* b119 */ NULL, +/* b11a */ NULL, +/* b11b */ NULL, +/* b11c */ NULL, +/* b11d */ NULL, +/* b11e */ NULL, +/* b11f */ NULL, +/* b120 */ NULL, +/* b121 */ NULL, +/* b122 */ NULL, +/* b123 */ NULL, +/* b124 */ NULL, +/* b125 */ NULL, +/* b126 */ NULL, +/* b127 */ NULL, +/* b128 */ NULL, +/* b129 */ NULL, +/* b12a */ NULL, +/* b12b */ NULL, +/* b12c */ NULL, +/* b12d */ NULL, +/* b12e */ NULL, +/* b12f */ NULL, +/* b130 */ NULL, +/* b131 */ NULL, +/* b132 */ NULL, +/* b133 */ NULL, +/* b134 */ NULL, +/* b135 */ NULL, +/* b136 */ NULL, +/* b137 */ NULL, +/* b138 */ NULL, +/* b139 */ NULL, +/* b13a */ NULL, +/* b13b */ NULL, +/* b13c */ NULL, +/* b13d */ NULL, +/* b13e */ NULL, +/* b13f */ NULL, +/* b140 */ NULL, +/* b141 */ NULL, +/* b142 */ NULL, +/* b143 */ NULL, +/* b144 */ NULL, +/* b145 */ NULL, +/* b146 */ NULL, +/* b147 */ NULL, +/* b148 */ NULL, +/* b149 */ NULL, +/* b14a */ NULL, +/* b14b */ NULL, +/* b14c */ NULL, +/* b14d */ NULL, +/* b14e */ NULL, +/* b14f */ NULL, +/* b150 */ NULL, +/* b151 */ NULL, +/* b152 */ NULL, +/* b153 */ NULL, +/* b154 */ NULL, +/* b155 */ NULL, +/* b156 */ NULL, +/* b157 */ NULL, +/* b158 */ NULL, +/* b159 */ NULL, +/* b15a */ NULL, +/* b15b */ NULL, +/* b15c */ NULL, +/* b15d */ NULL, +/* b15e */ NULL, +/* b15f */ NULL, +/* b160 */ NULL, +/* b161 */ NULL, +/* b162 */ NULL, +/* b163 */ NULL, +/* b164 */ NULL, +/* b165 */ NULL, +/* b166 */ NULL, +/* b167 */ NULL, +/* b168 */ NULL, +/* b169 */ NULL, +/* b16a */ NULL, +/* b16b */ NULL, +/* b16c */ NULL, +/* b16d */ NULL, +/* b16e */ NULL, +/* b16f */ NULL, +/* b170 */ NULL, +/* b171 */ NULL, +/* b172 */ NULL, +/* b173 */ NULL, +/* b174 */ NULL, +/* b175 */ NULL, +/* b176 */ NULL, +/* b177 */ NULL, +/* b178 */ NULL, +/* b179 */ NULL, +/* b17a */ NULL, +/* b17b */ NULL, +/* b17c */ NULL, +/* b17d */ NULL, +/* b17e */ NULL, +/* b17f */ NULL, +/* b180 */ NULL, +/* b181 */ NULL, +/* b182 */ NULL, +/* b183 */ NULL, +/* b184 */ NULL, +/* b185 */ NULL, +/* b186 */ NULL, +/* b187 */ NULL, +/* b188 */ NULL, +/* b189 */ NULL, +/* b18a */ NULL, +/* b18b */ NULL, +/* b18c */ NULL, +/* b18d */ NULL, +/* b18e */ NULL, +/* b18f */ NULL, +/* b190 */ NULL, +/* b191 */ NULL, +/* b192 */ NULL, +/* b193 */ NULL, +/* b194 */ NULL, +/* b195 */ NULL, +/* b196 */ NULL, +/* b197 */ NULL, +/* b198 */ NULL, +/* b199 */ NULL, +/* b19a */ NULL, +/* b19b */ NULL, +/* b19c */ NULL, +/* b19d */ NULL, +/* b19e */ NULL, +/* b19f */ NULL, +/* b1a0 */ NULL, +/* b1a1 */ NULL, +/* b1a2 */ NULL, +/* b1a3 */ NULL, +/* b1a4 */ NULL, +/* b1a5 */ NULL, +/* b1a6 */ NULL, +/* b1a7 */ NULL, +/* b1a8 */ NULL, +/* b1a9 */ NULL, +/* b1aa */ NULL, +/* b1ab */ NULL, +/* b1ac */ NULL, +/* b1ad */ NULL, +/* b1ae */ NULL, +/* b1af */ NULL, +/* b1b0 */ NULL, +/* b1b1 */ NULL, +/* b1b2 */ NULL, +/* b1b3 */ NULL, +/* b1b4 */ NULL, +/* b1b5 */ NULL, +/* b1b6 */ NULL, +/* b1b7 */ NULL, +/* b1b8 */ NULL, +/* b1b9 */ NULL, +/* b1ba */ NULL, +/* b1bb */ NULL, +/* b1bc */ NULL, +/* b1bd */ NULL, +/* b1be */ NULL, +/* b1bf */ NULL, +/* b1c0 */ NULL, +/* b1c1 */ NULL, +/* b1c2 */ NULL, +/* b1c3 */ NULL, +/* b1c4 */ NULL, +/* b1c5 */ NULL, +/* b1c6 */ NULL, +/* b1c7 */ NULL, +/* b1c8 */ NULL, +/* b1c9 */ NULL, +/* b1ca */ NULL, +/* b1cb */ NULL, +/* b1cc */ NULL, +/* b1cd */ NULL, +/* b1ce */ NULL, +/* b1cf */ NULL, +/* b1d0 */ NULL, +/* b1d1 */ NULL, +/* b1d2 */ NULL, +/* b1d3 */ NULL, +/* b1d4 */ NULL, +/* b1d5 */ NULL, +/* b1d6 */ NULL, +/* b1d7 */ NULL, +/* b1d8 */ NULL, +/* b1d9 */ NULL, +/* b1da */ NULL, +/* b1db */ NULL, +/* b1dc */ NULL, +/* b1dd */ NULL, +/* b1de */ NULL, +/* b1df */ NULL, +/* b1e0 */ NULL, +/* b1e1 */ NULL, +/* b1e2 */ NULL, +/* b1e3 */ NULL, +/* b1e4 */ NULL, +/* b1e5 */ NULL, +/* b1e6 */ NULL, +/* b1e7 */ NULL, +/* b1e8 */ NULL, +/* b1e9 */ NULL, +/* b1ea */ NULL, +/* b1eb */ NULL, +/* b1ec */ NULL, +/* b1ed */ NULL, +/* b1ee */ NULL, +/* b1ef */ NULL, +/* b1f0 */ NULL, +/* b1f1 */ NULL, +/* b1f2 */ NULL, +/* b1f3 */ NULL, +/* b1f4 */ NULL, +/* b1f5 */ NULL, +/* b1f6 */ NULL, +/* b1f7 */ NULL, +/* b1f8 */ NULL, +/* b1f9 */ NULL, +/* b1fa */ NULL, +/* b1fb */ NULL, +/* b1fc */ NULL, +/* b1fd */ NULL, +/* b1fe */ NULL, +/* b1ff */ NULL, +/* b200 */ NULL, +/* b201 */ NULL, +/* b202 */ NULL, +/* b203 */ NULL, +/* b204 */ NULL, +/* b205 */ NULL, +/* b206 */ NULL, +/* b207 */ NULL, +/* b208 */ NULL, +/* b209 */ NULL, +/* b20a */ NULL, +/* b20b */ NULL, +/* b20c */ NULL, +/* b20d */ NULL, +/* b20e */ NULL, +/* b20f */ NULL, +/* b210 */ NULL, +/* b211 */ NULL, +/* b212 */ NULL, +/* b213 */ NULL, +/* b214 */ NULL, +/* b215 */ NULL, +/* b216 */ NULL, +/* b217 */ NULL, +/* b218 */ NULL, +/* b219 */ NULL, +/* b21a */ NULL, +/* b21b */ NULL, +/* b21c */ NULL, +/* b21d */ NULL, +/* b21e */ NULL, +/* b21f */ NULL, +/* b220 */ NULL, +/* b221 */ NULL, +/* b222 */ NULL, +/* b223 */ NULL, +/* b224 */ NULL, +/* b225 */ NULL, +/* b226 */ NULL, +/* b227 */ NULL, +/* b228 */ NULL, +/* b229 */ NULL, +/* b22a */ NULL, +/* b22b */ NULL, +/* b22c */ NULL, +/* b22d */ NULL, +/* b22e */ NULL, +/* b22f */ NULL, +/* b230 */ NULL, +/* b231 */ NULL, +/* b232 */ NULL, +/* b233 */ NULL, +/* b234 */ NULL, +/* b235 */ NULL, +/* b236 */ NULL, +/* b237 */ NULL, +/* b238 */ NULL, +/* b239 */ NULL, +/* b23a */ NULL, +/* b23b */ NULL, +/* b23c */ NULL, +/* b23d */ NULL, +/* b23e */ NULL, +/* b23f */ NULL, +/* b240 */ NULL, +/* b241 */ NULL, +/* b242 */ NULL, +/* b243 */ NULL, +/* b244 */ NULL, +/* b245 */ NULL, +/* b246 */ NULL, +/* b247 */ NULL, +/* b248 */ NULL, +/* b249 */ NULL, +/* b24a */ NULL, +/* b24b */ NULL, +/* b24c */ NULL, +/* b24d */ NULL, +/* b24e */ NULL, +/* b24f */ NULL, +/* b250 */ NULL, +/* b251 */ NULL, +/* b252 */ NULL, +/* b253 */ NULL, +/* b254 */ NULL, +/* b255 */ NULL, +/* b256 */ NULL, +/* b257 */ NULL, +/* b258 */ NULL, +/* b259 */ NULL, +/* b25a */ NULL, +/* b25b */ NULL, +/* b25c */ NULL, +/* b25d */ NULL, +/* b25e */ NULL, +/* b25f */ NULL, +/* b260 */ NULL, +/* b261 */ NULL, +/* b262 */ NULL, +/* b263 */ NULL, +/* b264 */ NULL, +/* b265 */ NULL, +/* b266 */ NULL, +/* b267 */ NULL, +/* b268 */ NULL, +/* b269 */ NULL, +/* b26a */ NULL, +/* b26b */ NULL, +/* b26c */ NULL, +/* b26d */ NULL, +/* b26e */ NULL, +/* b26f */ NULL, +/* b270 */ NULL, +/* b271 */ NULL, +/* b272 */ NULL, +/* b273 */ NULL, +/* b274 */ NULL, +/* b275 */ NULL, +/* b276 */ NULL, +/* b277 */ NULL, +/* b278 */ NULL, +/* b279 */ NULL, +/* b27a */ NULL, +/* b27b */ NULL, +/* b27c */ NULL, +/* b27d */ NULL, +/* b27e */ NULL, +/* b27f */ NULL, +/* b280 */ NULL, +/* b281 */ NULL, +/* b282 */ NULL, +/* b283 */ NULL, +/* b284 */ NULL, +/* b285 */ NULL, +/* b286 */ NULL, +/* b287 */ NULL, +/* b288 */ NULL, +/* b289 */ NULL, +/* b28a */ NULL, +/* b28b */ NULL, +/* b28c */ NULL, +/* b28d */ NULL, +/* b28e */ NULL, +/* b28f */ NULL, +/* b290 */ NULL, +/* b291 */ NULL, +/* b292 */ NULL, +/* b293 */ NULL, +/* b294 */ NULL, +/* b295 */ NULL, +/* b296 */ NULL, +/* b297 */ NULL, +/* b298 */ NULL, +/* b299 */ NULL, +/* b29a */ NULL, +/* b29b */ NULL, +/* b29c */ NULL, +/* b29d */ NULL, +/* b29e */ NULL, +/* b29f */ NULL, +/* b2a0 */ NULL, +/* b2a1 */ NULL, +/* b2a2 */ NULL, +/* b2a3 */ NULL, +/* b2a4 */ NULL, +/* b2a5 */ NULL, +/* b2a6 */ NULL, +/* b2a7 */ NULL, +/* b2a8 */ NULL, +/* b2a9 */ NULL, +/* b2aa */ NULL, +/* b2ab */ NULL, +/* b2ac */ NULL, +/* b2ad */ NULL, +/* b2ae */ NULL, +/* b2af */ NULL, +/* b2b0 */ NULL, +/* b2b1 */ NULL, +/* b2b2 */ NULL, +/* b2b3 */ NULL, +/* b2b4 */ NULL, +/* b2b5 */ NULL, +/* b2b6 */ NULL, +/* b2b7 */ NULL, +/* b2b8 */ NULL, +/* b2b9 */ NULL, +/* b2ba */ NULL, +/* b2bb */ NULL, +/* b2bc */ NULL, +/* b2bd */ NULL, +/* b2be */ NULL, +/* b2bf */ NULL, +/* b2c0 */ NULL, +/* b2c1 */ NULL, +/* b2c2 */ NULL, +/* b2c3 */ NULL, +/* b2c4 */ NULL, +/* b2c5 */ NULL, +/* b2c6 */ NULL, +/* b2c7 */ NULL, +/* b2c8 */ NULL, +/* b2c9 */ NULL, +/* b2ca */ NULL, +/* b2cb */ NULL, +/* b2cc */ NULL, +/* b2cd */ NULL, +/* b2ce */ NULL, +/* b2cf */ NULL, +/* b2d0 */ NULL, +/* b2d1 */ NULL, +/* b2d2 */ NULL, +/* b2d3 */ NULL, +/* b2d4 */ NULL, +/* b2d5 */ NULL, +/* b2d6 */ NULL, +/* b2d7 */ NULL, +/* b2d8 */ NULL, +/* b2d9 */ NULL, +/* b2da */ NULL, +/* b2db */ NULL, +/* b2dc */ NULL, +/* b2dd */ NULL, +/* b2de */ NULL, +/* b2df */ NULL, +/* b2e0 */ NULL, +/* b2e1 */ NULL, +/* b2e2 */ NULL, +/* b2e3 */ NULL, +/* b2e4 */ NULL, +/* b2e5 */ NULL, +/* b2e6 */ NULL, +/* b2e7 */ NULL, +/* b2e8 */ NULL, +/* b2e9 */ NULL, +/* b2ea */ NULL, +/* b2eb */ NULL, +/* b2ec */ NULL, +/* b2ed */ NULL, +/* b2ee */ NULL, +/* b2ef */ NULL, +/* b2f0 */ NULL, +/* b2f1 */ NULL, +/* b2f2 */ NULL, +/* b2f3 */ NULL, +/* b2f4 */ NULL, +/* b2f5 */ NULL, +/* b2f6 */ NULL, +/* b2f7 */ NULL, +/* b2f8 */ NULL, +/* b2f9 */ NULL, +/* b2fa */ NULL, +/* b2fb */ NULL, +/* b2fc */ NULL, +/* b2fd */ NULL, +/* b2fe */ NULL, +/* b2ff */ NULL, +/* b300 */ NULL, +/* b301 */ NULL, +/* b302 */ NULL, +/* b303 */ NULL, +/* b304 */ NULL, +/* b305 */ NULL, +/* b306 */ NULL, +/* b307 */ NULL, +/* b308 */ NULL, +/* b309 */ NULL, +/* b30a */ NULL, +/* b30b */ NULL, +/* b30c */ NULL, +/* b30d */ NULL, +/* b30e */ NULL, +/* b30f */ NULL, +/* b310 */ NULL, +/* b311 */ NULL, +/* b312 */ NULL, +/* b313 */ NULL, +/* b314 */ NULL, +/* b315 */ NULL, +/* b316 */ NULL, +/* b317 */ NULL, +/* b318 */ NULL, +/* b319 */ NULL, +/* b31a */ NULL, +/* b31b */ NULL, +/* b31c */ NULL, +/* b31d */ NULL, +/* b31e */ NULL, +/* b31f */ NULL, +/* b320 */ NULL, +/* b321 */ NULL, +/* b322 */ NULL, +/* b323 */ NULL, +/* b324 */ NULL, +/* b325 */ NULL, +/* b326 */ NULL, +/* b327 */ NULL, +/* b328 */ NULL, +/* b329 */ NULL, +/* b32a */ NULL, +/* b32b */ NULL, +/* b32c */ NULL, +/* b32d */ NULL, +/* b32e */ NULL, +/* b32f */ NULL, +/* b330 */ NULL, +/* b331 */ NULL, +/* b332 */ NULL, +/* b333 */ NULL, +/* b334 */ NULL, +/* b335 */ NULL, +/* b336 */ NULL, +/* b337 */ NULL, +/* b338 */ NULL, +/* b339 */ NULL, +/* b33a */ NULL, +/* b33b */ NULL, +/* b33c */ NULL, +/* b33d */ NULL, +/* b33e */ NULL, +/* b33f */ NULL, +/* b340 */ NULL, +/* b341 */ NULL, +/* b342 */ NULL, +/* b343 */ NULL, +/* b344 */ NULL, +/* b345 */ NULL, +/* b346 */ NULL, +/* b347 */ NULL, +/* b348 */ NULL, +/* b349 */ NULL, +/* b34a */ NULL, +/* b34b */ NULL, +/* b34c */ NULL, +/* b34d */ NULL, +/* b34e */ NULL, +/* b34f */ NULL, +/* b350 */ NULL, +/* b351 */ NULL, +/* b352 */ NULL, +/* b353 */ NULL, +/* b354 */ NULL, +/* b355 */ NULL, +/* b356 */ NULL, +/* b357 */ NULL, +/* b358 */ NULL, +/* b359 */ NULL, +/* b35a */ NULL, +/* b35b */ NULL, +/* b35c */ NULL, +/* b35d */ NULL, +/* b35e */ NULL, +/* b35f */ NULL, +/* b360 */ NULL, +/* b361 */ NULL, +/* b362 */ NULL, +/* b363 */ NULL, +/* b364 */ NULL, +/* b365 */ NULL, +/* b366 */ NULL, +/* b367 */ NULL, +/* b368 */ NULL, +/* b369 */ NULL, +/* b36a */ NULL, +/* b36b */ NULL, +/* b36c */ NULL, +/* b36d */ NULL, +/* b36e */ NULL, +/* b36f */ NULL, +/* b370 */ NULL, +/* b371 */ NULL, +/* b372 */ NULL, +/* b373 */ NULL, +/* b374 */ NULL, +/* b375 */ NULL, +/* b376 */ NULL, +/* b377 */ NULL, +/* b378 */ NULL, +/* b379 */ NULL, +/* b37a */ NULL, +/* b37b */ NULL, +/* b37c */ NULL, +/* b37d */ NULL, +/* b37e */ NULL, +/* b37f */ NULL, +/* b380 */ NULL, +/* b381 */ NULL, +/* b382 */ NULL, +/* b383 */ NULL, +/* b384 */ NULL, +/* b385 */ NULL, +/* b386 */ NULL, +/* b387 */ NULL, +/* b388 */ NULL, +/* b389 */ NULL, +/* b38a */ NULL, +/* b38b */ NULL, +/* b38c */ NULL, +/* b38d */ NULL, +/* b38e */ NULL, +/* b38f */ NULL, +/* b390 */ NULL, +/* b391 */ NULL, +/* b392 */ NULL, +/* b393 */ NULL, +/* b394 */ NULL, +/* b395 */ NULL, +/* b396 */ NULL, +/* b397 */ NULL, +/* b398 */ NULL, +/* b399 */ NULL, +/* b39a */ NULL, +/* b39b */ NULL, +/* b39c */ NULL, +/* b39d */ NULL, +/* b39e */ NULL, +/* b39f */ NULL, +/* b3a0 */ NULL, +/* b3a1 */ NULL, +/* b3a2 */ NULL, +/* b3a3 */ NULL, +/* b3a4 */ NULL, +/* b3a5 */ NULL, +/* b3a6 */ NULL, +/* b3a7 */ NULL, +/* b3a8 */ NULL, +/* b3a9 */ NULL, +/* b3aa */ NULL, +/* b3ab */ NULL, +/* b3ac */ NULL, +/* b3ad */ NULL, +/* b3ae */ NULL, +/* b3af */ NULL, +/* b3b0 */ NULL, +/* b3b1 */ NULL, +/* b3b2 */ NULL, +/* b3b3 */ NULL, +/* b3b4 */ NULL, +/* b3b5 */ NULL, +/* b3b6 */ NULL, +/* b3b7 */ NULL, +/* b3b8 */ NULL, +/* b3b9 */ NULL, +/* b3ba */ NULL, +/* b3bb */ NULL, +/* b3bc */ NULL, +/* b3bd */ NULL, +/* b3be */ NULL, +/* b3bf */ NULL, +/* b3c0 */ NULL, +/* b3c1 */ NULL, +/* b3c2 */ NULL, +/* b3c3 */ NULL, +/* b3c4 */ NULL, +/* b3c5 */ NULL, +/* b3c6 */ NULL, +/* b3c7 */ NULL, +/* b3c8 */ NULL, +/* b3c9 */ NULL, +/* b3ca */ NULL, +/* b3cb */ NULL, +/* b3cc */ NULL, +/* b3cd */ NULL, +/* b3ce */ NULL, +/* b3cf */ NULL, +/* b3d0 */ NULL, +/* b3d1 */ NULL, +/* b3d2 */ NULL, +/* b3d3 */ NULL, +/* b3d4 */ NULL, +/* b3d5 */ NULL, +/* b3d6 */ NULL, +/* b3d7 */ NULL, +/* b3d8 */ NULL, +/* b3d9 */ NULL, +/* b3da */ NULL, +/* b3db */ NULL, +/* b3dc */ NULL, +/* b3dd */ NULL, +/* b3de */ NULL, +/* b3df */ NULL, +/* b3e0 */ NULL, +/* b3e1 */ NULL, +/* b3e2 */ NULL, +/* b3e3 */ NULL, +/* b3e4 */ NULL, +/* b3e5 */ NULL, +/* b3e6 */ NULL, +/* b3e7 */ NULL, +/* b3e8 */ NULL, +/* b3e9 */ NULL, +/* b3ea */ NULL, +/* b3eb */ NULL, +/* b3ec */ NULL, +/* b3ed */ NULL, +/* b3ee */ NULL, +/* b3ef */ NULL, +/* b3f0 */ NULL, +/* b3f1 */ NULL, +/* b3f2 */ NULL, +/* b3f3 */ NULL, +/* b3f4 */ NULL, +/* b3f5 */ NULL, +/* b3f6 */ NULL, +/* b3f7 */ NULL, +/* b3f8 */ NULL, +/* b3f9 */ NULL, +/* b3fa */ NULL, +/* b3fb */ NULL, +/* b3fc */ NULL, +/* b3fd */ NULL, +/* b3fe */ NULL, +/* b3ff */ NULL, +/* b400 */ NULL, +/* b401 */ NULL, +/* b402 */ NULL, +/* b403 */ NULL, +/* b404 */ NULL, +/* b405 */ NULL, +/* b406 */ NULL, +/* b407 */ NULL, +/* b408 */ NULL, +/* b409 */ NULL, +/* b40a */ NULL, +/* b40b */ NULL, +/* b40c */ NULL, +/* b40d */ NULL, +/* b40e */ NULL, +/* b40f */ NULL, +/* b410 */ NULL, +/* b411 */ NULL, +/* b412 */ NULL, +/* b413 */ NULL, +/* b414 */ NULL, +/* b415 */ NULL, +/* b416 */ NULL, +/* b417 */ NULL, +/* b418 */ NULL, +/* b419 */ NULL, +/* b41a */ NULL, +/* b41b */ NULL, +/* b41c */ NULL, +/* b41d */ NULL, +/* b41e */ NULL, +/* b41f */ NULL, +/* b420 */ NULL, +/* b421 */ NULL, +/* b422 */ NULL, +/* b423 */ NULL, +/* b424 */ NULL, +/* b425 */ NULL, +/* b426 */ NULL, +/* b427 */ NULL, +/* b428 */ NULL, +/* b429 */ NULL, +/* b42a */ NULL, +/* b42b */ NULL, +/* b42c */ NULL, +/* b42d */ NULL, +/* b42e */ NULL, +/* b42f */ NULL, +/* b430 */ NULL, +/* b431 */ NULL, +/* b432 */ NULL, +/* b433 */ NULL, +/* b434 */ NULL, +/* b435 */ NULL, +/* b436 */ NULL, +/* b437 */ NULL, +/* b438 */ NULL, +/* b439 */ NULL, +/* b43a */ NULL, +/* b43b */ NULL, +/* b43c */ NULL, +/* b43d */ NULL, +/* b43e */ NULL, +/* b43f */ NULL, +/* b440 */ NULL, +/* b441 */ NULL, +/* b442 */ NULL, +/* b443 */ NULL, +/* b444 */ NULL, +/* b445 */ NULL, +/* b446 */ NULL, +/* b447 */ NULL, +/* b448 */ NULL, +/* b449 */ NULL, +/* b44a */ NULL, +/* b44b */ NULL, +/* b44c */ NULL, +/* b44d */ NULL, +/* b44e */ NULL, +/* b44f */ NULL, +/* b450 */ NULL, +/* b451 */ NULL, +/* b452 */ NULL, +/* b453 */ NULL, +/* b454 */ NULL, +/* b455 */ NULL, +/* b456 */ NULL, +/* b457 */ NULL, +/* b458 */ NULL, +/* b459 */ NULL, +/* b45a */ NULL, +/* b45b */ NULL, +/* b45c */ NULL, +/* b45d */ NULL, +/* b45e */ NULL, +/* b45f */ NULL, +/* b460 */ NULL, +/* b461 */ NULL, +/* b462 */ NULL, +/* b463 */ NULL, +/* b464 */ NULL, +/* b465 */ NULL, +/* b466 */ NULL, +/* b467 */ NULL, +/* b468 */ NULL, +/* b469 */ NULL, +/* b46a */ NULL, +/* b46b */ NULL, +/* b46c */ NULL, +/* b46d */ NULL, +/* b46e */ NULL, +/* b46f */ NULL, +/* b470 */ NULL, +/* b471 */ NULL, +/* b472 */ NULL, +/* b473 */ NULL, +/* b474 */ NULL, +/* b475 */ NULL, +/* b476 */ NULL, +/* b477 */ NULL, +/* b478 */ NULL, +/* b479 */ NULL, +/* b47a */ NULL, +/* b47b */ NULL, +/* b47c */ NULL, +/* b47d */ NULL, +/* b47e */ NULL, +/* b47f */ NULL, +/* b480 */ NULL, +/* b481 */ NULL, +/* b482 */ NULL, +/* b483 */ NULL, +/* b484 */ NULL, +/* b485 */ NULL, +/* b486 */ NULL, +/* b487 */ NULL, +/* b488 */ NULL, +/* b489 */ NULL, +/* b48a */ NULL, +/* b48b */ NULL, +/* b48c */ NULL, +/* b48d */ NULL, +/* b48e */ NULL, +/* b48f */ NULL, +/* b490 */ NULL, +/* b491 */ NULL, +/* b492 */ NULL, +/* b493 */ NULL, +/* b494 */ NULL, +/* b495 */ NULL, +/* b496 */ NULL, +/* b497 */ NULL, +/* b498 */ NULL, +/* b499 */ NULL, +/* b49a */ NULL, +/* b49b */ NULL, +/* b49c */ NULL, +/* b49d */ NULL, +/* b49e */ NULL, +/* b49f */ NULL, +/* b4a0 */ NULL, +/* b4a1 */ NULL, +/* b4a2 */ NULL, +/* b4a3 */ NULL, +/* b4a4 */ NULL, +/* b4a5 */ NULL, +/* b4a6 */ NULL, +/* b4a7 */ NULL, +/* b4a8 */ NULL, +/* b4a9 */ NULL, +/* b4aa */ NULL, +/* b4ab */ NULL, +/* b4ac */ NULL, +/* b4ad */ NULL, +/* b4ae */ NULL, +/* b4af */ NULL, +/* b4b0 */ NULL, +/* b4b1 */ NULL, +/* b4b2 */ NULL, +/* b4b3 */ NULL, +/* b4b4 */ NULL, +/* b4b5 */ NULL, +/* b4b6 */ NULL, +/* b4b7 */ NULL, +/* b4b8 */ NULL, +/* b4b9 */ NULL, +/* b4ba */ NULL, +/* b4bb */ NULL, +/* b4bc */ NULL, +/* b4bd */ NULL, +/* b4be */ NULL, +/* b4bf */ NULL, +/* b4c0 */ NULL, +/* b4c1 */ NULL, +/* b4c2 */ NULL, +/* b4c3 */ NULL, +/* b4c4 */ NULL, +/* b4c5 */ NULL, +/* b4c6 */ NULL, +/* b4c7 */ NULL, +/* b4c8 */ NULL, +/* b4c9 */ NULL, +/* b4ca */ NULL, +/* b4cb */ NULL, +/* b4cc */ NULL, +/* b4cd */ NULL, +/* b4ce */ NULL, +/* b4cf */ NULL, +/* b4d0 */ NULL, +/* b4d1 */ NULL, +/* b4d2 */ NULL, +/* b4d3 */ NULL, +/* b4d4 */ NULL, +/* b4d5 */ NULL, +/* b4d6 */ NULL, +/* b4d7 */ NULL, +/* b4d8 */ NULL, +/* b4d9 */ NULL, +/* b4da */ NULL, +/* b4db */ NULL, +/* b4dc */ NULL, +/* b4dd */ NULL, +/* b4de */ NULL, +/* b4df */ NULL, +/* b4e0 */ NULL, +/* b4e1 */ NULL, +/* b4e2 */ NULL, +/* b4e3 */ NULL, +/* b4e4 */ NULL, +/* b4e5 */ NULL, +/* b4e6 */ NULL, +/* b4e7 */ NULL, +/* b4e8 */ NULL, +/* b4e9 */ NULL, +/* b4ea */ NULL, +/* b4eb */ NULL, +/* b4ec */ NULL, +/* b4ed */ NULL, +/* b4ee */ NULL, +/* b4ef */ NULL, +/* b4f0 */ NULL, +/* b4f1 */ NULL, +/* b4f2 */ NULL, +/* b4f3 */ NULL, +/* b4f4 */ NULL, +/* b4f5 */ NULL, +/* b4f6 */ NULL, +/* b4f7 */ NULL, +/* b4f8 */ NULL, +/* b4f9 */ NULL, +/* b4fa */ NULL, +/* b4fb */ NULL, +/* b4fc */ NULL, +/* b4fd */ NULL, +/* b4fe */ NULL, +/* b4ff */ NULL, +/* b500 */ NULL, +/* b501 */ NULL, +/* b502 */ NULL, +/* b503 */ NULL, +/* b504 */ NULL, +/* b505 */ NULL, +/* b506 */ NULL, +/* b507 */ NULL, +/* b508 */ NULL, +/* b509 */ NULL, +/* b50a */ NULL, +/* b50b */ NULL, +/* b50c */ NULL, +/* b50d */ NULL, +/* b50e */ NULL, +/* b50f */ NULL, +/* b510 */ NULL, +/* b511 */ NULL, +/* b512 */ NULL, +/* b513 */ NULL, +/* b514 */ NULL, +/* b515 */ NULL, +/* b516 */ NULL, +/* b517 */ NULL, +/* b518 */ NULL, +/* b519 */ NULL, +/* b51a */ NULL, +/* b51b */ NULL, +/* b51c */ NULL, +/* b51d */ NULL, +/* b51e */ NULL, +/* b51f */ NULL, +/* b520 */ NULL, +/* b521 */ NULL, +/* b522 */ NULL, +/* b523 */ NULL, +/* b524 */ NULL, +/* b525 */ NULL, +/* b526 */ NULL, +/* b527 */ NULL, +/* b528 */ NULL, +/* b529 */ NULL, +/* b52a */ NULL, +/* b52b */ NULL, +/* b52c */ NULL, +/* b52d */ NULL, +/* b52e */ NULL, +/* b52f */ NULL, +/* b530 */ NULL, +/* b531 */ NULL, +/* b532 */ NULL, +/* b533 */ NULL, +/* b534 */ NULL, +/* b535 */ NULL, +/* b536 */ NULL, +/* b537 */ NULL, +/* b538 */ NULL, +/* b539 */ NULL, +/* b53a */ NULL, +/* b53b */ NULL, +/* b53c */ NULL, +/* b53d */ NULL, +/* b53e */ NULL, +/* b53f */ NULL, +/* b540 */ NULL, +/* b541 */ NULL, +/* b542 */ NULL, +/* b543 */ NULL, +/* b544 */ NULL, +/* b545 */ NULL, +/* b546 */ NULL, +/* b547 */ NULL, +/* b548 */ NULL, +/* b549 */ NULL, +/* b54a */ NULL, +/* b54b */ NULL, +/* b54c */ NULL, +/* b54d */ NULL, +/* b54e */ NULL, +/* b54f */ NULL, +/* b550 */ NULL, +/* b551 */ NULL, +/* b552 */ NULL, +/* b553 */ NULL, +/* b554 */ NULL, +/* b555 */ NULL, +/* b556 */ NULL, +/* b557 */ NULL, +/* b558 */ NULL, +/* b559 */ NULL, +/* b55a */ NULL, +/* b55b */ NULL, +/* b55c */ NULL, +/* b55d */ NULL, +/* b55e */ NULL, +/* b55f */ NULL, +/* b560 */ NULL, +/* b561 */ NULL, +/* b562 */ NULL, +/* b563 */ NULL, +/* b564 */ NULL, +/* b565 */ NULL, +/* b566 */ NULL, +/* b567 */ NULL, +/* b568 */ NULL, +/* b569 */ NULL, +/* b56a */ NULL, +/* b56b */ NULL, +/* b56c */ NULL, +/* b56d */ NULL, +/* b56e */ NULL, +/* b56f */ NULL, +/* b570 */ NULL, +/* b571 */ NULL, +/* b572 */ NULL, +/* b573 */ NULL, +/* b574 */ NULL, +/* b575 */ NULL, +/* b576 */ NULL, +/* b577 */ NULL, +/* b578 */ NULL, +/* b579 */ NULL, +/* b57a */ NULL, +/* b57b */ NULL, +/* b57c */ NULL, +/* b57d */ NULL, +/* b57e */ NULL, +/* b57f */ NULL, +/* b580 */ NULL, +/* b581 */ NULL, +/* b582 */ NULL, +/* b583 */ NULL, +/* b584 */ NULL, +/* b585 */ NULL, +/* b586 */ NULL, +/* b587 */ NULL, +/* b588 */ NULL, +/* b589 */ NULL, +/* b58a */ NULL, +/* b58b */ NULL, +/* b58c */ NULL, +/* b58d */ NULL, +/* b58e */ NULL, +/* b58f */ NULL, +/* b590 */ NULL, +/* b591 */ NULL, +/* b592 */ NULL, +/* b593 */ NULL, +/* b594 */ NULL, +/* b595 */ NULL, +/* b596 */ NULL, +/* b597 */ NULL, +/* b598 */ NULL, +/* b599 */ NULL, +/* b59a */ NULL, +/* b59b */ NULL, +/* b59c */ NULL, +/* b59d */ NULL, +/* b59e */ NULL, +/* b59f */ NULL, +/* b5a0 */ NULL, +/* b5a1 */ NULL, +/* b5a2 */ NULL, +/* b5a3 */ NULL, +/* b5a4 */ NULL, +/* b5a5 */ NULL, +/* b5a6 */ NULL, +/* b5a7 */ NULL, +/* b5a8 */ NULL, +/* b5a9 */ NULL, +/* b5aa */ NULL, +/* b5ab */ NULL, +/* b5ac */ NULL, +/* b5ad */ NULL, +/* b5ae */ NULL, +/* b5af */ NULL, +/* b5b0 */ NULL, +/* b5b1 */ NULL, +/* b5b2 */ NULL, +/* b5b3 */ NULL, +/* b5b4 */ NULL, +/* b5b5 */ NULL, +/* b5b6 */ NULL, +/* b5b7 */ NULL, +/* b5b8 */ NULL, +/* b5b9 */ NULL, +/* b5ba */ NULL, +/* b5bb */ NULL, +/* b5bc */ NULL, +/* b5bd */ NULL, +/* b5be */ NULL, +/* b5bf */ NULL, +/* b5c0 */ NULL, +/* b5c1 */ NULL, +/* b5c2 */ NULL, +/* b5c3 */ NULL, +/* b5c4 */ NULL, +/* b5c5 */ NULL, +/* b5c6 */ NULL, +/* b5c7 */ NULL, +/* b5c8 */ NULL, +/* b5c9 */ NULL, +/* b5ca */ NULL, +/* b5cb */ NULL, +/* b5cc */ NULL, +/* b5cd */ NULL, +/* b5ce */ NULL, +/* b5cf */ NULL, +/* b5d0 */ NULL, +/* b5d1 */ NULL, +/* b5d2 */ NULL, +/* b5d3 */ NULL, +/* b5d4 */ NULL, +/* b5d5 */ NULL, +/* b5d6 */ NULL, +/* b5d7 */ NULL, +/* b5d8 */ NULL, +/* b5d9 */ NULL, +/* b5da */ NULL, +/* b5db */ NULL, +/* b5dc */ NULL, +/* b5dd */ NULL, +/* b5de */ NULL, +/* b5df */ NULL, +/* b5e0 */ NULL, +/* b5e1 */ NULL, +/* b5e2 */ NULL, +/* b5e3 */ NULL, +/* b5e4 */ NULL, +/* b5e5 */ NULL, +/* b5e6 */ NULL, +/* b5e7 */ NULL, +/* b5e8 */ NULL, +/* b5e9 */ NULL, +/* b5ea */ NULL, +/* b5eb */ NULL, +/* b5ec */ NULL, +/* b5ed */ NULL, +/* b5ee */ NULL, +/* b5ef */ NULL, +/* b5f0 */ NULL, +/* b5f1 */ NULL, +/* b5f2 */ NULL, +/* b5f3 */ NULL, +/* b5f4 */ NULL, +/* b5f5 */ NULL, +/* b5f6 */ NULL, +/* b5f7 */ NULL, +/* b5f8 */ NULL, +/* b5f9 */ NULL, +/* b5fa */ NULL, +/* b5fb */ NULL, +/* b5fc */ NULL, +/* b5fd */ NULL, +/* b5fe */ NULL, +/* b5ff */ NULL, +/* b600 */ NULL, +/* b601 */ NULL, +/* b602 */ NULL, +/* b603 */ NULL, +/* b604 */ NULL, +/* b605 */ NULL, +/* b606 */ NULL, +/* b607 */ NULL, +/* b608 */ NULL, +/* b609 */ NULL, +/* b60a */ NULL, +/* b60b */ NULL, +/* b60c */ NULL, +/* b60d */ NULL, +/* b60e */ NULL, +/* b60f */ NULL, +/* b610 */ NULL, +/* b611 */ NULL, +/* b612 */ NULL, +/* b613 */ NULL, +/* b614 */ NULL, +/* b615 */ NULL, +/* b616 */ NULL, +/* b617 */ NULL, +/* b618 */ NULL, +/* b619 */ NULL, +/* b61a */ NULL, +/* b61b */ NULL, +/* b61c */ NULL, +/* b61d */ NULL, +/* b61e */ NULL, +/* b61f */ NULL, +/* b620 */ NULL, +/* b621 */ NULL, +/* b622 */ NULL, +/* b623 */ NULL, +/* b624 */ NULL, +/* b625 */ NULL, +/* b626 */ NULL, +/* b627 */ NULL, +/* b628 */ NULL, +/* b629 */ NULL, +/* b62a */ NULL, +/* b62b */ NULL, +/* b62c */ NULL, +/* b62d */ NULL, +/* b62e */ NULL, +/* b62f */ NULL, +/* b630 */ NULL, +/* b631 */ NULL, +/* b632 */ NULL, +/* b633 */ NULL, +/* b634 */ NULL, +/* b635 */ NULL, +/* b636 */ NULL, +/* b637 */ NULL, +/* b638 */ NULL, +/* b639 */ NULL, +/* b63a */ NULL, +/* b63b */ NULL, +/* b63c */ NULL, +/* b63d */ NULL, +/* b63e */ NULL, +/* b63f */ NULL, +/* b640 */ NULL, +/* b641 */ NULL, +/* b642 */ NULL, +/* b643 */ NULL, +/* b644 */ NULL, +/* b645 */ NULL, +/* b646 */ NULL, +/* b647 */ NULL, +/* b648 */ NULL, +/* b649 */ NULL, +/* b64a */ NULL, +/* b64b */ NULL, +/* b64c */ NULL, +/* b64d */ NULL, +/* b64e */ NULL, +/* b64f */ NULL, +/* b650 */ NULL, +/* b651 */ NULL, +/* b652 */ NULL, +/* b653 */ NULL, +/* b654 */ NULL, +/* b655 */ NULL, +/* b656 */ NULL, +/* b657 */ NULL, +/* b658 */ NULL, +/* b659 */ NULL, +/* b65a */ NULL, +/* b65b */ NULL, +/* b65c */ NULL, +/* b65d */ NULL, +/* b65e */ NULL, +/* b65f */ NULL, +/* b660 */ NULL, +/* b661 */ NULL, +/* b662 */ NULL, +/* b663 */ NULL, +/* b664 */ NULL, +/* b665 */ NULL, +/* b666 */ NULL, +/* b667 */ NULL, +/* b668 */ NULL, +/* b669 */ NULL, +/* b66a */ NULL, +/* b66b */ NULL, +/* b66c */ NULL, +/* b66d */ NULL, +/* b66e */ NULL, +/* b66f */ NULL, +/* b670 */ NULL, +/* b671 */ NULL, +/* b672 */ NULL, +/* b673 */ NULL, +/* b674 */ NULL, +/* b675 */ NULL, +/* b676 */ NULL, +/* b677 */ NULL, +/* b678 */ NULL, +/* b679 */ NULL, +/* b67a */ NULL, +/* b67b */ NULL, +/* b67c */ NULL, +/* b67d */ NULL, +/* b67e */ NULL, +/* b67f */ NULL, +/* b680 */ NULL, +/* b681 */ NULL, +/* b682 */ NULL, +/* b683 */ NULL, +/* b684 */ NULL, +/* b685 */ NULL, +/* b686 */ NULL, +/* b687 */ NULL, +/* b688 */ NULL, +/* b689 */ NULL, +/* b68a */ NULL, +/* b68b */ NULL, +/* b68c */ NULL, +/* b68d */ NULL, +/* b68e */ NULL, +/* b68f */ NULL, +/* b690 */ NULL, +/* b691 */ NULL, +/* b692 */ NULL, +/* b693 */ NULL, +/* b694 */ NULL, +/* b695 */ NULL, +/* b696 */ NULL, +/* b697 */ NULL, +/* b698 */ NULL, +/* b699 */ NULL, +/* b69a */ NULL, +/* b69b */ NULL, +/* b69c */ NULL, +/* b69d */ NULL, +/* b69e */ NULL, +/* b69f */ NULL, +/* b6a0 */ NULL, +/* b6a1 */ NULL, +/* b6a2 */ NULL, +/* b6a3 */ NULL, +/* b6a4 */ NULL, +/* b6a5 */ NULL, +/* b6a6 */ NULL, +/* b6a7 */ NULL, +/* b6a8 */ NULL, +/* b6a9 */ NULL, +/* b6aa */ NULL, +/* b6ab */ NULL, +/* b6ac */ NULL, +/* b6ad */ NULL, +/* b6ae */ NULL, +/* b6af */ NULL, +/* b6b0 */ NULL, +/* b6b1 */ NULL, +/* b6b2 */ NULL, +/* b6b3 */ NULL, +/* b6b4 */ NULL, +/* b6b5 */ NULL, +/* b6b6 */ NULL, +/* b6b7 */ NULL, +/* b6b8 */ NULL, +/* b6b9 */ NULL, +/* b6ba */ NULL, +/* b6bb */ NULL, +/* b6bc */ NULL, +/* b6bd */ NULL, +/* b6be */ NULL, +/* b6bf */ NULL, +/* b6c0 */ NULL, +/* b6c1 */ NULL, +/* b6c2 */ NULL, +/* b6c3 */ NULL, +/* b6c4 */ NULL, +/* b6c5 */ NULL, +/* b6c6 */ NULL, +/* b6c7 */ NULL, +/* b6c8 */ NULL, +/* b6c9 */ NULL, +/* b6ca */ NULL, +/* b6cb */ NULL, +/* b6cc */ NULL, +/* b6cd */ NULL, +/* b6ce */ NULL, +/* b6cf */ NULL, +/* b6d0 */ NULL, +/* b6d1 */ NULL, +/* b6d2 */ NULL, +/* b6d3 */ NULL, +/* b6d4 */ NULL, +/* b6d5 */ NULL, +/* b6d6 */ NULL, +/* b6d7 */ NULL, +/* b6d8 */ NULL, +/* b6d9 */ NULL, +/* b6da */ NULL, +/* b6db */ NULL, +/* b6dc */ NULL, +/* b6dd */ NULL, +/* b6de */ NULL, +/* b6df */ NULL, +/* b6e0 */ NULL, +/* b6e1 */ NULL, +/* b6e2 */ NULL, +/* b6e3 */ NULL, +/* b6e4 */ NULL, +/* b6e5 */ NULL, +/* b6e6 */ NULL, +/* b6e7 */ NULL, +/* b6e8 */ NULL, +/* b6e9 */ NULL, +/* b6ea */ NULL, +/* b6eb */ NULL, +/* b6ec */ NULL, +/* b6ed */ NULL, +/* b6ee */ NULL, +/* b6ef */ NULL, +/* b6f0 */ NULL, +/* b6f1 */ NULL, +/* b6f2 */ NULL, +/* b6f3 */ NULL, +/* b6f4 */ NULL, +/* b6f5 */ NULL, +/* b6f6 */ NULL, +/* b6f7 */ NULL, +/* b6f8 */ NULL, +/* b6f9 */ NULL, +/* b6fa */ NULL, +/* b6fb */ NULL, +/* b6fc */ NULL, +/* b6fd */ NULL, +/* b6fe */ NULL, +/* b6ff */ NULL, +/* b700 */ NULL, +/* b701 */ NULL, +/* b702 */ NULL, +/* b703 */ NULL, +/* b704 */ NULL, +/* b705 */ NULL, +/* b706 */ NULL, +/* b707 */ NULL, +/* b708 */ NULL, +/* b709 */ NULL, +/* b70a */ NULL, +/* b70b */ NULL, +/* b70c */ NULL, +/* b70d */ NULL, +/* b70e */ NULL, +/* b70f */ NULL, +/* b710 */ NULL, +/* b711 */ NULL, +/* b712 */ NULL, +/* b713 */ NULL, +/* b714 */ NULL, +/* b715 */ NULL, +/* b716 */ NULL, +/* b717 */ NULL, +/* b718 */ NULL, +/* b719 */ NULL, +/* b71a */ NULL, +/* b71b */ NULL, +/* b71c */ NULL, +/* b71d */ NULL, +/* b71e */ NULL, +/* b71f */ NULL, +/* b720 */ NULL, +/* b721 */ NULL, +/* b722 */ NULL, +/* b723 */ NULL, +/* b724 */ NULL, +/* b725 */ NULL, +/* b726 */ NULL, +/* b727 */ NULL, +/* b728 */ NULL, +/* b729 */ NULL, +/* b72a */ NULL, +/* b72b */ NULL, +/* b72c */ NULL, +/* b72d */ NULL, +/* b72e */ NULL, +/* b72f */ NULL, +/* b730 */ NULL, +/* b731 */ NULL, +/* b732 */ NULL, +/* b733 */ NULL, +/* b734 */ NULL, +/* b735 */ NULL, +/* b736 */ NULL, +/* b737 */ NULL, +/* b738 */ NULL, +/* b739 */ NULL, +/* b73a */ NULL, +/* b73b */ NULL, +/* b73c */ NULL, +/* b73d */ NULL, +/* b73e */ NULL, +/* b73f */ NULL, +/* b740 */ NULL, +/* b741 */ NULL, +/* b742 */ NULL, +/* b743 */ NULL, +/* b744 */ NULL, +/* b745 */ NULL, +/* b746 */ NULL, +/* b747 */ NULL, +/* b748 */ NULL, +/* b749 */ NULL, +/* b74a */ NULL, +/* b74b */ NULL, +/* b74c */ NULL, +/* b74d */ NULL, +/* b74e */ NULL, +/* b74f */ NULL, +/* b750 */ NULL, +/* b751 */ NULL, +/* b752 */ NULL, +/* b753 */ NULL, +/* b754 */ NULL, +/* b755 */ NULL, +/* b756 */ NULL, +/* b757 */ NULL, +/* b758 */ NULL, +/* b759 */ NULL, +/* b75a */ NULL, +/* b75b */ NULL, +/* b75c */ NULL, +/* b75d */ NULL, +/* b75e */ NULL, +/* b75f */ NULL, +/* b760 */ NULL, +/* b761 */ NULL, +/* b762 */ NULL, +/* b763 */ NULL, +/* b764 */ NULL, +/* b765 */ NULL, +/* b766 */ NULL, +/* b767 */ NULL, +/* b768 */ NULL, +/* b769 */ NULL, +/* b76a */ NULL, +/* b76b */ NULL, +/* b76c */ NULL, +/* b76d */ NULL, +/* b76e */ NULL, +/* b76f */ NULL, +/* b770 */ NULL, +/* b771 */ NULL, +/* b772 */ NULL, +/* b773 */ NULL, +/* b774 */ NULL, +/* b775 */ NULL, +/* b776 */ NULL, +/* b777 */ NULL, +/* b778 */ NULL, +/* b779 */ NULL, +/* b77a */ NULL, +/* b77b */ NULL, +/* b77c */ NULL, +/* b77d */ NULL, +/* b77e */ NULL, +/* b77f */ NULL, +/* b780 */ NULL, +/* b781 */ NULL, +/* b782 */ NULL, +/* b783 */ NULL, +/* b784 */ NULL, +/* b785 */ NULL, +/* b786 */ NULL, +/* b787 */ NULL, +/* b788 */ NULL, +/* b789 */ NULL, +/* b78a */ NULL, +/* b78b */ NULL, +/* b78c */ NULL, +/* b78d */ NULL, +/* b78e */ NULL, +/* b78f */ NULL, +/* b790 */ NULL, +/* b791 */ NULL, +/* b792 */ NULL, +/* b793 */ NULL, +/* b794 */ NULL, +/* b795 */ NULL, +/* b796 */ NULL, +/* b797 */ NULL, +/* b798 */ NULL, +/* b799 */ NULL, +/* b79a */ NULL, +/* b79b */ NULL, +/* b79c */ NULL, +/* b79d */ NULL, +/* b79e */ NULL, +/* b79f */ NULL, +/* b7a0 */ NULL, +/* b7a1 */ NULL, +/* b7a2 */ NULL, +/* b7a3 */ NULL, +/* b7a4 */ NULL, +/* b7a5 */ NULL, +/* b7a6 */ NULL, +/* b7a7 */ NULL, +/* b7a8 */ NULL, +/* b7a9 */ NULL, +/* b7aa */ NULL, +/* b7ab */ NULL, +/* b7ac */ NULL, +/* b7ad */ NULL, +/* b7ae */ NULL, +/* b7af */ NULL, +/* b7b0 */ NULL, +/* b7b1 */ NULL, +/* b7b2 */ NULL, +/* b7b3 */ NULL, +/* b7b4 */ NULL, +/* b7b5 */ NULL, +/* b7b6 */ NULL, +/* b7b7 */ NULL, +/* b7b8 */ NULL, +/* b7b9 */ NULL, +/* b7ba */ NULL, +/* b7bb */ NULL, +/* b7bc */ NULL, +/* b7bd */ NULL, +/* b7be */ NULL, +/* b7bf */ NULL, +/* b7c0 */ NULL, +/* b7c1 */ NULL, +/* b7c2 */ NULL, +/* b7c3 */ NULL, +/* b7c4 */ NULL, +/* b7c5 */ NULL, +/* b7c6 */ NULL, +/* b7c7 */ NULL, +/* b7c8 */ NULL, +/* b7c9 */ NULL, +/* b7ca */ NULL, +/* b7cb */ NULL, +/* b7cc */ NULL, +/* b7cd */ NULL, +/* b7ce */ NULL, +/* b7cf */ NULL, +/* b7d0 */ NULL, +/* b7d1 */ NULL, +/* b7d2 */ NULL, +/* b7d3 */ NULL, +/* b7d4 */ NULL, +/* b7d5 */ NULL, +/* b7d6 */ NULL, +/* b7d7 */ NULL, +/* b7d8 */ NULL, +/* b7d9 */ NULL, +/* b7da */ NULL, +/* b7db */ NULL, +/* b7dc */ NULL, +/* b7dd */ NULL, +/* b7de */ NULL, +/* b7df */ NULL, +/* b7e0 */ NULL, +/* b7e1 */ NULL, +/* b7e2 */ NULL, +/* b7e3 */ NULL, +/* b7e4 */ NULL, +/* b7e5 */ NULL, +/* b7e6 */ NULL, +/* b7e7 */ NULL, +/* b7e8 */ NULL, +/* b7e9 */ NULL, +/* b7ea */ NULL, +/* b7eb */ NULL, +/* b7ec */ NULL, +/* b7ed */ NULL, +/* b7ee */ NULL, +/* b7ef */ NULL, +/* b7f0 */ NULL, +/* b7f1 */ NULL, +/* b7f2 */ NULL, +/* b7f3 */ NULL, +/* b7f4 */ NULL, +/* b7f5 */ NULL, +/* b7f6 */ NULL, +/* b7f7 */ NULL, +/* b7f8 */ NULL, +/* b7f9 */ NULL, +/* b7fa */ NULL, +/* b7fb */ NULL, +/* b7fc */ NULL, +/* b7fd */ NULL, +/* b7fe */ NULL, +/* b7ff */ NULL, +/* b800 */ NULL, +/* b801 */ NULL, +/* b802 */ NULL, +/* b803 */ NULL, +/* b804 */ NULL, +/* b805 */ NULL, +/* b806 */ NULL, +/* b807 */ NULL, +/* b808 */ NULL, +/* b809 */ NULL, +/* b80a */ NULL, +/* b80b */ NULL, +/* b80c */ NULL, +/* b80d */ NULL, +/* b80e */ NULL, +/* b80f */ NULL, +/* b810 */ NULL, +/* b811 */ NULL, +/* b812 */ NULL, +/* b813 */ NULL, +/* b814 */ NULL, +/* b815 */ NULL, +/* b816 */ NULL, +/* b817 */ NULL, +/* b818 */ NULL, +/* b819 */ NULL, +/* b81a */ NULL, +/* b81b */ NULL, +/* b81c */ NULL, +/* b81d */ NULL, +/* b81e */ NULL, +/* b81f */ NULL, +/* b820 */ NULL, +/* b821 */ NULL, +/* b822 */ NULL, +/* b823 */ NULL, +/* b824 */ NULL, +/* b825 */ NULL, +/* b826 */ NULL, +/* b827 */ NULL, +/* b828 */ NULL, +/* b829 */ NULL, +/* b82a */ NULL, +/* b82b */ NULL, +/* b82c */ NULL, +/* b82d */ NULL, +/* b82e */ NULL, +/* b82f */ NULL, +/* b830 */ NULL, +/* b831 */ NULL, +/* b832 */ NULL, +/* b833 */ NULL, +/* b834 */ NULL, +/* b835 */ NULL, +/* b836 */ NULL, +/* b837 */ NULL, +/* b838 */ NULL, +/* b839 */ NULL, +/* b83a */ NULL, +/* b83b */ NULL, +/* b83c */ NULL, +/* b83d */ NULL, +/* b83e */ NULL, +/* b83f */ NULL, +/* b840 */ NULL, +/* b841 */ NULL, +/* b842 */ NULL, +/* b843 */ NULL, +/* b844 */ NULL, +/* b845 */ NULL, +/* b846 */ NULL, +/* b847 */ NULL, +/* b848 */ NULL, +/* b849 */ NULL, +/* b84a */ NULL, +/* b84b */ NULL, +/* b84c */ NULL, +/* b84d */ NULL, +/* b84e */ NULL, +/* b84f */ NULL, +/* b850 */ NULL, +/* b851 */ NULL, +/* b852 */ NULL, +/* b853 */ NULL, +/* b854 */ NULL, +/* b855 */ NULL, +/* b856 */ NULL, +/* b857 */ NULL, +/* b858 */ NULL, +/* b859 */ NULL, +/* b85a */ NULL, +/* b85b */ NULL, +/* b85c */ NULL, +/* b85d */ NULL, +/* b85e */ NULL, +/* b85f */ NULL, +/* b860 */ NULL, +/* b861 */ NULL, +/* b862 */ NULL, +/* b863 */ NULL, +/* b864 */ NULL, +/* b865 */ NULL, +/* b866 */ NULL, +/* b867 */ NULL, +/* b868 */ NULL, +/* b869 */ NULL, +/* b86a */ NULL, +/* b86b */ NULL, +/* b86c */ NULL, +/* b86d */ NULL, +/* b86e */ NULL, +/* b86f */ NULL, +/* b870 */ NULL, +/* b871 */ NULL, +/* b872 */ NULL, +/* b873 */ NULL, +/* b874 */ NULL, +/* b875 */ NULL, +/* b876 */ NULL, +/* b877 */ NULL, +/* b878 */ NULL, +/* b879 */ NULL, +/* b87a */ NULL, +/* b87b */ NULL, +/* b87c */ NULL, +/* b87d */ NULL, +/* b87e */ NULL, +/* b87f */ NULL, +/* b880 */ NULL, +/* b881 */ NULL, +/* b882 */ NULL, +/* b883 */ NULL, +/* b884 */ NULL, +/* b885 */ NULL, +/* b886 */ NULL, +/* b887 */ NULL, +/* b888 */ NULL, +/* b889 */ NULL, +/* b88a */ NULL, +/* b88b */ NULL, +/* b88c */ NULL, +/* b88d */ NULL, +/* b88e */ NULL, +/* b88f */ NULL, +/* b890 */ NULL, +/* b891 */ NULL, +/* b892 */ NULL, +/* b893 */ NULL, +/* b894 */ NULL, +/* b895 */ NULL, +/* b896 */ NULL, +/* b897 */ NULL, +/* b898 */ NULL, +/* b899 */ NULL, +/* b89a */ NULL, +/* b89b */ NULL, +/* b89c */ NULL, +/* b89d */ NULL, +/* b89e */ NULL, +/* b89f */ NULL, +/* b8a0 */ NULL, +/* b8a1 */ NULL, +/* b8a2 */ NULL, +/* b8a3 */ NULL, +/* b8a4 */ NULL, +/* b8a5 */ NULL, +/* b8a6 */ NULL, +/* b8a7 */ NULL, +/* b8a8 */ NULL, +/* b8a9 */ NULL, +/* b8aa */ NULL, +/* b8ab */ NULL, +/* b8ac */ NULL, +/* b8ad */ NULL, +/* b8ae */ NULL, +/* b8af */ NULL, +/* b8b0 */ NULL, +/* b8b1 */ NULL, +/* b8b2 */ NULL, +/* b8b3 */ NULL, +/* b8b4 */ NULL, +/* b8b5 */ NULL, +/* b8b6 */ NULL, +/* b8b7 */ NULL, +/* b8b8 */ NULL, +/* b8b9 */ NULL, +/* b8ba */ NULL, +/* b8bb */ NULL, +/* b8bc */ NULL, +/* b8bd */ NULL, +/* b8be */ NULL, +/* b8bf */ NULL, +/* b8c0 */ NULL, +/* b8c1 */ NULL, +/* b8c2 */ NULL, +/* b8c3 */ NULL, +/* b8c4 */ NULL, +/* b8c5 */ NULL, +/* b8c6 */ NULL, +/* b8c7 */ NULL, +/* b8c8 */ NULL, +/* b8c9 */ NULL, +/* b8ca */ NULL, +/* b8cb */ NULL, +/* b8cc */ NULL, +/* b8cd */ NULL, +/* b8ce */ NULL, +/* b8cf */ NULL, +/* b8d0 */ NULL, +/* b8d1 */ NULL, +/* b8d2 */ NULL, +/* b8d3 */ NULL, +/* b8d4 */ NULL, +/* b8d5 */ NULL, +/* b8d6 */ NULL, +/* b8d7 */ NULL, +/* b8d8 */ NULL, +/* b8d9 */ NULL, +/* b8da */ NULL, +/* b8db */ NULL, +/* b8dc */ NULL, +/* b8dd */ NULL, +/* b8de */ NULL, +/* b8df */ NULL, +/* b8e0 */ NULL, +/* b8e1 */ NULL, +/* b8e2 */ NULL, +/* b8e3 */ NULL, +/* b8e4 */ NULL, +/* b8e5 */ NULL, +/* b8e6 */ NULL, +/* b8e7 */ NULL, +/* b8e8 */ NULL, +/* b8e9 */ NULL, +/* b8ea */ NULL, +/* b8eb */ NULL, +/* b8ec */ NULL, +/* b8ed */ NULL, +/* b8ee */ NULL, +/* b8ef */ NULL, +/* b8f0 */ NULL, +/* b8f1 */ NULL, +/* b8f2 */ NULL, +/* b8f3 */ NULL, +/* b8f4 */ NULL, +/* b8f5 */ NULL, +/* b8f6 */ NULL, +/* b8f7 */ NULL, +/* b8f8 */ NULL, +/* b8f9 */ NULL, +/* b8fa */ NULL, +/* b8fb */ NULL, +/* b8fc */ NULL, +/* b8fd */ NULL, +/* b8fe */ NULL, +/* b8ff */ NULL, +/* b900 */ NULL, +/* b901 */ NULL, +/* b902 */ NULL, +/* b903 */ NULL, +/* b904 */ NULL, +/* b905 */ NULL, +/* b906 */ NULL, +/* b907 */ NULL, +/* b908 */ NULL, +/* b909 */ NULL, +/* b90a */ NULL, +/* b90b */ NULL, +/* b90c */ NULL, +/* b90d */ NULL, +/* b90e */ NULL, +/* b90f */ NULL, +/* b910 */ NULL, +/* b911 */ NULL, +/* b912 */ NULL, +/* b913 */ NULL, +/* b914 */ NULL, +/* b915 */ NULL, +/* b916 */ NULL, +/* b917 */ NULL, +/* b918 */ NULL, +/* b919 */ NULL, +/* b91a */ NULL, +/* b91b */ NULL, +/* b91c */ NULL, +/* b91d */ NULL, +/* b91e */ NULL, +/* b91f */ NULL, +/* b920 */ NULL, +/* b921 */ NULL, +/* b922 */ NULL, +/* b923 */ NULL, +/* b924 */ NULL, +/* b925 */ NULL, +/* b926 */ NULL, +/* b927 */ NULL, +/* b928 */ NULL, +/* b929 */ NULL, +/* b92a */ NULL, +/* b92b */ NULL, +/* b92c */ NULL, +/* b92d */ NULL, +/* b92e */ NULL, +/* b92f */ NULL, +/* b930 */ NULL, +/* b931 */ NULL, +/* b932 */ NULL, +/* b933 */ NULL, +/* b934 */ NULL, +/* b935 */ NULL, +/* b936 */ NULL, +/* b937 */ NULL, +/* b938 */ NULL, +/* b939 */ NULL, +/* b93a */ NULL, +/* b93b */ NULL, +/* b93c */ NULL, +/* b93d */ NULL, +/* b93e */ NULL, +/* b93f */ NULL, +/* b940 */ NULL, +/* b941 */ NULL, +/* b942 */ NULL, +/* b943 */ NULL, +/* b944 */ NULL, +/* b945 */ NULL, +/* b946 */ NULL, +/* b947 */ NULL, +/* b948 */ NULL, +/* b949 */ NULL, +/* b94a */ NULL, +/* b94b */ NULL, +/* b94c */ NULL, +/* b94d */ NULL, +/* b94e */ NULL, +/* b94f */ NULL, +/* b950 */ NULL, +/* b951 */ NULL, +/* b952 */ NULL, +/* b953 */ NULL, +/* b954 */ NULL, +/* b955 */ NULL, +/* b956 */ NULL, +/* b957 */ NULL, +/* b958 */ NULL, +/* b959 */ NULL, +/* b95a */ NULL, +/* b95b */ NULL, +/* b95c */ NULL, +/* b95d */ NULL, +/* b95e */ NULL, +/* b95f */ NULL, +/* b960 */ NULL, +/* b961 */ NULL, +/* b962 */ NULL, +/* b963 */ NULL, +/* b964 */ NULL, +/* b965 */ NULL, +/* b966 */ NULL, +/* b967 */ NULL, +/* b968 */ NULL, +/* b969 */ NULL, +/* b96a */ NULL, +/* b96b */ NULL, +/* b96c */ NULL, +/* b96d */ NULL, +/* b96e */ NULL, +/* b96f */ NULL, +/* b970 */ NULL, +/* b971 */ NULL, +/* b972 */ NULL, +/* b973 */ NULL, +/* b974 */ NULL, +/* b975 */ NULL, +/* b976 */ NULL, +/* b977 */ NULL, +/* b978 */ NULL, +/* b979 */ NULL, +/* b97a */ NULL, +/* b97b */ NULL, +/* b97c */ NULL, +/* b97d */ NULL, +/* b97e */ NULL, +/* b97f */ NULL, +/* b980 */ NULL, +/* b981 */ NULL, +/* b982 */ NULL, +/* b983 */ NULL, +/* b984 */ NULL, +/* b985 */ NULL, +/* b986 */ NULL, +/* b987 */ NULL, +/* b988 */ NULL, +/* b989 */ NULL, +/* b98a */ NULL, +/* b98b */ NULL, +/* b98c */ NULL, +/* b98d */ NULL, +/* b98e */ NULL, +/* b98f */ NULL, +/* b990 */ NULL, +/* b991 */ NULL, +/* b992 */ NULL, +/* b993 */ NULL, +/* b994 */ NULL, +/* b995 */ NULL, +/* b996 */ NULL, +/* b997 */ NULL, +/* b998 */ NULL, +/* b999 */ NULL, +/* b99a */ NULL, +/* b99b */ NULL, +/* b99c */ NULL, +/* b99d */ NULL, +/* b99e */ NULL, +/* b99f */ NULL, +/* b9a0 */ NULL, +/* b9a1 */ NULL, +/* b9a2 */ NULL, +/* b9a3 */ NULL, +/* b9a4 */ NULL, +/* b9a5 */ NULL, +/* b9a6 */ NULL, +/* b9a7 */ NULL, +/* b9a8 */ NULL, +/* b9a9 */ NULL, +/* b9aa */ NULL, +/* b9ab */ NULL, +/* b9ac */ NULL, +/* b9ad */ NULL, +/* b9ae */ NULL, +/* b9af */ NULL, +/* b9b0 */ NULL, +/* b9b1 */ NULL, +/* b9b2 */ NULL, +/* b9b3 */ NULL, +/* b9b4 */ NULL, +/* b9b5 */ NULL, +/* b9b6 */ NULL, +/* b9b7 */ NULL, +/* b9b8 */ NULL, +/* b9b9 */ NULL, +/* b9ba */ NULL, +/* b9bb */ NULL, +/* b9bc */ NULL, +/* b9bd */ NULL, +/* b9be */ NULL, +/* b9bf */ NULL, +/* b9c0 */ NULL, +/* b9c1 */ NULL, +/* b9c2 */ NULL, +/* b9c3 */ NULL, +/* b9c4 */ NULL, +/* b9c5 */ NULL, +/* b9c6 */ NULL, +/* b9c7 */ NULL, +/* b9c8 */ NULL, +/* b9c9 */ NULL, +/* b9ca */ NULL, +/* b9cb */ NULL, +/* b9cc */ NULL, +/* b9cd */ NULL, +/* b9ce */ NULL, +/* b9cf */ NULL, +/* b9d0 */ NULL, +/* b9d1 */ NULL, +/* b9d2 */ NULL, +/* b9d3 */ NULL, +/* b9d4 */ NULL, +/* b9d5 */ NULL, +/* b9d6 */ NULL, +/* b9d7 */ NULL, +/* b9d8 */ NULL, +/* b9d9 */ NULL, +/* b9da */ NULL, +/* b9db */ NULL, +/* b9dc */ NULL, +/* b9dd */ NULL, +/* b9de */ NULL, +/* b9df */ NULL, +/* b9e0 */ NULL, +/* b9e1 */ NULL, +/* b9e2 */ NULL, +/* b9e3 */ NULL, +/* b9e4 */ NULL, +/* b9e5 */ NULL, +/* b9e6 */ NULL, +/* b9e7 */ NULL, +/* b9e8 */ NULL, +/* b9e9 */ NULL, +/* b9ea */ NULL, +/* b9eb */ NULL, +/* b9ec */ NULL, +/* b9ed */ NULL, +/* b9ee */ NULL, +/* b9ef */ NULL, +/* b9f0 */ NULL, +/* b9f1 */ NULL, +/* b9f2 */ NULL, +/* b9f3 */ NULL, +/* b9f4 */ NULL, +/* b9f5 */ NULL, +/* b9f6 */ NULL, +/* b9f7 */ NULL, +/* b9f8 */ NULL, +/* b9f9 */ NULL, +/* b9fa */ NULL, +/* b9fb */ NULL, +/* b9fc */ NULL, +/* b9fd */ NULL, +/* b9fe */ NULL, +/* b9ff */ NULL, +/* ba00 */ NULL, +/* ba01 */ NULL, +/* ba02 */ NULL, +/* ba03 */ NULL, +/* ba04 */ NULL, +/* ba05 */ NULL, +/* ba06 */ NULL, +/* ba07 */ NULL, +/* ba08 */ NULL, +/* ba09 */ NULL, +/* ba0a */ NULL, +/* ba0b */ NULL, +/* ba0c */ NULL, +/* ba0d */ NULL, +/* ba0e */ NULL, +/* ba0f */ NULL, +/* ba10 */ NULL, +/* ba11 */ NULL, +/* ba12 */ NULL, +/* ba13 */ NULL, +/* ba14 */ NULL, +/* ba15 */ NULL, +/* ba16 */ NULL, +/* ba17 */ NULL, +/* ba18 */ NULL, +/* ba19 */ NULL, +/* ba1a */ NULL, +/* ba1b */ NULL, +/* ba1c */ NULL, +/* ba1d */ NULL, +/* ba1e */ NULL, +/* ba1f */ NULL, +/* ba20 */ NULL, +/* ba21 */ NULL, +/* ba22 */ NULL, +/* ba23 */ NULL, +/* ba24 */ NULL, +/* ba25 */ NULL, +/* ba26 */ NULL, +/* ba27 */ NULL, +/* ba28 */ NULL, +/* ba29 */ NULL, +/* ba2a */ NULL, +/* ba2b */ NULL, +/* ba2c */ NULL, +/* ba2d */ NULL, +/* ba2e */ NULL, +/* ba2f */ NULL, +/* ba30 */ NULL, +/* ba31 */ NULL, +/* ba32 */ NULL, +/* ba33 */ NULL, +/* ba34 */ NULL, +/* ba35 */ NULL, +/* ba36 */ NULL, +/* ba37 */ NULL, +/* ba38 */ NULL, +/* ba39 */ NULL, +/* ba3a */ NULL, +/* ba3b */ NULL, +/* ba3c */ NULL, +/* ba3d */ NULL, +/* ba3e */ NULL, +/* ba3f */ NULL, +/* ba40 */ NULL, +/* ba41 */ NULL, +/* ba42 */ NULL, +/* ba43 */ NULL, +/* ba44 */ NULL, +/* ba45 */ NULL, +/* ba46 */ NULL, +/* ba47 */ NULL, +/* ba48 */ NULL, +/* ba49 */ NULL, +/* ba4a */ NULL, +/* ba4b */ NULL, +/* ba4c */ NULL, +/* ba4d */ NULL, +/* ba4e */ NULL, +/* ba4f */ NULL, +/* ba50 */ NULL, +/* ba51 */ NULL, +/* ba52 */ NULL, +/* ba53 */ NULL, +/* ba54 */ NULL, +/* ba55 */ NULL, +/* ba56 */ NULL, +/* ba57 */ NULL, +/* ba58 */ NULL, +/* ba59 */ NULL, +/* ba5a */ NULL, +/* ba5b */ NULL, +/* ba5c */ NULL, +/* ba5d */ NULL, +/* ba5e */ NULL, +/* ba5f */ NULL, +/* ba60 */ NULL, +/* ba61 */ NULL, +/* ba62 */ NULL, +/* ba63 */ NULL, +/* ba64 */ NULL, +/* ba65 */ NULL, +/* ba66 */ NULL, +/* ba67 */ NULL, +/* ba68 */ NULL, +/* ba69 */ NULL, +/* ba6a */ NULL, +/* ba6b */ NULL, +/* ba6c */ NULL, +/* ba6d */ NULL, +/* ba6e */ NULL, +/* ba6f */ NULL, +/* ba70 */ NULL, +/* ba71 */ NULL, +/* ba72 */ NULL, +/* ba73 */ NULL, +/* ba74 */ NULL, +/* ba75 */ NULL, +/* ba76 */ NULL, +/* ba77 */ NULL, +/* ba78 */ NULL, +/* ba79 */ NULL, +/* ba7a */ NULL, +/* ba7b */ NULL, +/* ba7c */ NULL, +/* ba7d */ NULL, +/* ba7e */ NULL, +/* ba7f */ NULL, +/* ba80 */ NULL, +/* ba81 */ NULL, +/* ba82 */ NULL, +/* ba83 */ NULL, +/* ba84 */ NULL, +/* ba85 */ NULL, +/* ba86 */ NULL, +/* ba87 */ NULL, +/* ba88 */ NULL, +/* ba89 */ NULL, +/* ba8a */ NULL, +/* ba8b */ NULL, +/* ba8c */ NULL, +/* ba8d */ NULL, +/* ba8e */ NULL, +/* ba8f */ NULL, +/* ba90 */ NULL, +/* ba91 */ NULL, +/* ba92 */ NULL, +/* ba93 */ NULL, +/* ba94 */ NULL, +/* ba95 */ NULL, +/* ba96 */ NULL, +/* ba97 */ NULL, +/* ba98 */ NULL, +/* ba99 */ NULL, +/* ba9a */ NULL, +/* ba9b */ NULL, +/* ba9c */ NULL, +/* ba9d */ NULL, +/* ba9e */ NULL, +/* ba9f */ NULL, +/* baa0 */ NULL, +/* baa1 */ NULL, +/* baa2 */ NULL, +/* baa3 */ NULL, +/* baa4 */ NULL, +/* baa5 */ NULL, +/* baa6 */ NULL, +/* baa7 */ NULL, +/* baa8 */ NULL, +/* baa9 */ NULL, +/* baaa */ NULL, +/* baab */ NULL, +/* baac */ NULL, +/* baad */ NULL, +/* baae */ NULL, +/* baaf */ NULL, +/* bab0 */ NULL, +/* bab1 */ NULL, +/* bab2 */ NULL, +/* bab3 */ NULL, +/* bab4 */ NULL, +/* bab5 */ NULL, +/* bab6 */ NULL, +/* bab7 */ NULL, +/* bab8 */ NULL, +/* bab9 */ NULL, +/* baba */ NULL, +/* babb */ NULL, +/* babc */ NULL, +/* babd */ NULL, +/* babe */ NULL, +/* babf */ NULL, +/* bac0 */ NULL, +/* bac1 */ NULL, +/* bac2 */ NULL, +/* bac3 */ NULL, +/* bac4 */ NULL, +/* bac5 */ NULL, +/* bac6 */ NULL, +/* bac7 */ NULL, +/* bac8 */ NULL, +/* bac9 */ NULL, +/* baca */ NULL, +/* bacb */ NULL, +/* bacc */ NULL, +/* bacd */ NULL, +/* bace */ NULL, +/* bacf */ NULL, +/* bad0 */ NULL, +/* bad1 */ NULL, +/* bad2 */ NULL, +/* bad3 */ NULL, +/* bad4 */ NULL, +/* bad5 */ NULL, +/* bad6 */ NULL, +/* bad7 */ NULL, +/* bad8 */ NULL, +/* bad9 */ NULL, +/* bada */ NULL, +/* badb */ NULL, +/* badc */ NULL, +/* badd */ NULL, +/* bade */ NULL, +/* badf */ NULL, +/* bae0 */ NULL, +/* bae1 */ NULL, +/* bae2 */ NULL, +/* bae3 */ NULL, +/* bae4 */ NULL, +/* bae5 */ NULL, +/* bae6 */ NULL, +/* bae7 */ NULL, +/* bae8 */ NULL, +/* bae9 */ NULL, +/* baea */ NULL, +/* baeb */ NULL, +/* baec */ NULL, +/* baed */ NULL, +/* baee */ NULL, +/* baef */ NULL, +/* baf0 */ NULL, +/* baf1 */ NULL, +/* baf2 */ NULL, +/* baf3 */ NULL, +/* baf4 */ NULL, +/* baf5 */ NULL, +/* baf6 */ NULL, +/* baf7 */ NULL, +/* baf8 */ NULL, +/* baf9 */ NULL, +/* bafa */ NULL, +/* bafb */ NULL, +/* bafc */ NULL, +/* bafd */ NULL, +/* bafe */ NULL, +/* baff */ NULL, +/* bb00 */ NULL, +/* bb01 */ NULL, +/* bb02 */ NULL, +/* bb03 */ NULL, +/* bb04 */ NULL, +/* bb05 */ NULL, +/* bb06 */ NULL, +/* bb07 */ NULL, +/* bb08 */ NULL, +/* bb09 */ NULL, +/* bb0a */ NULL, +/* bb0b */ NULL, +/* bb0c */ NULL, +/* bb0d */ NULL, +/* bb0e */ NULL, +/* bb0f */ NULL, +/* bb10 */ NULL, +/* bb11 */ NULL, +/* bb12 */ NULL, +/* bb13 */ NULL, +/* bb14 */ NULL, +/* bb15 */ NULL, +/* bb16 */ NULL, +/* bb17 */ NULL, +/* bb18 */ NULL, +/* bb19 */ NULL, +/* bb1a */ NULL, +/* bb1b */ NULL, +/* bb1c */ NULL, +/* bb1d */ NULL, +/* bb1e */ NULL, +/* bb1f */ NULL, +/* bb20 */ NULL, +/* bb21 */ NULL, +/* bb22 */ NULL, +/* bb23 */ NULL, +/* bb24 */ NULL, +/* bb25 */ NULL, +/* bb26 */ NULL, +/* bb27 */ NULL, +/* bb28 */ NULL, +/* bb29 */ NULL, +/* bb2a */ NULL, +/* bb2b */ NULL, +/* bb2c */ NULL, +/* bb2d */ NULL, +/* bb2e */ NULL, +/* bb2f */ NULL, +/* bb30 */ NULL, +/* bb31 */ NULL, +/* bb32 */ NULL, +/* bb33 */ NULL, +/* bb34 */ NULL, +/* bb35 */ NULL, +/* bb36 */ NULL, +/* bb37 */ NULL, +/* bb38 */ NULL, +/* bb39 */ NULL, +/* bb3a */ NULL, +/* bb3b */ NULL, +/* bb3c */ NULL, +/* bb3d */ NULL, +/* bb3e */ NULL, +/* bb3f */ NULL, +/* bb40 */ NULL, +/* bb41 */ NULL, +/* bb42 */ NULL, +/* bb43 */ NULL, +/* bb44 */ NULL, +/* bb45 */ NULL, +/* bb46 */ NULL, +/* bb47 */ NULL, +/* bb48 */ NULL, +/* bb49 */ NULL, +/* bb4a */ NULL, +/* bb4b */ NULL, +/* bb4c */ NULL, +/* bb4d */ NULL, +/* bb4e */ NULL, +/* bb4f */ NULL, +/* bb50 */ NULL, +/* bb51 */ NULL, +/* bb52 */ NULL, +/* bb53 */ NULL, +/* bb54 */ NULL, +/* bb55 */ NULL, +/* bb56 */ NULL, +/* bb57 */ NULL, +/* bb58 */ NULL, +/* bb59 */ NULL, +/* bb5a */ NULL, +/* bb5b */ NULL, +/* bb5c */ NULL, +/* bb5d */ NULL, +/* bb5e */ NULL, +/* bb5f */ NULL, +/* bb60 */ NULL, +/* bb61 */ NULL, +/* bb62 */ NULL, +/* bb63 */ NULL, +/* bb64 */ NULL, +/* bb65 */ NULL, +/* bb66 */ NULL, +/* bb67 */ NULL, +/* bb68 */ NULL, +/* bb69 */ NULL, +/* bb6a */ NULL, +/* bb6b */ NULL, +/* bb6c */ NULL, +/* bb6d */ NULL, +/* bb6e */ NULL, +/* bb6f */ NULL, +/* bb70 */ NULL, +/* bb71 */ NULL, +/* bb72 */ NULL, +/* bb73 */ NULL, +/* bb74 */ NULL, +/* bb75 */ NULL, +/* bb76 */ NULL, +/* bb77 */ NULL, +/* bb78 */ NULL, +/* bb79 */ NULL, +/* bb7a */ NULL, +/* bb7b */ NULL, +/* bb7c */ NULL, +/* bb7d */ NULL, +/* bb7e */ NULL, +/* bb7f */ NULL, +/* bb80 */ NULL, +/* bb81 */ NULL, +/* bb82 */ NULL, +/* bb83 */ NULL, +/* bb84 */ NULL, +/* bb85 */ NULL, +/* bb86 */ NULL, +/* bb87 */ NULL, +/* bb88 */ NULL, +/* bb89 */ NULL, +/* bb8a */ NULL, +/* bb8b */ NULL, +/* bb8c */ NULL, +/* bb8d */ NULL, +/* bb8e */ NULL, +/* bb8f */ NULL, +/* bb90 */ NULL, +/* bb91 */ NULL, +/* bb92 */ NULL, +/* bb93 */ NULL, +/* bb94 */ NULL, +/* bb95 */ NULL, +/* bb96 */ NULL, +/* bb97 */ NULL, +/* bb98 */ NULL, +/* bb99 */ NULL, +/* bb9a */ NULL, +/* bb9b */ NULL, +/* bb9c */ NULL, +/* bb9d */ NULL, +/* bb9e */ NULL, +/* bb9f */ NULL, +/* bba0 */ NULL, +/* bba1 */ NULL, +/* bba2 */ NULL, +/* bba3 */ NULL, +/* bba4 */ NULL, +/* bba5 */ NULL, +/* bba6 */ NULL, +/* bba7 */ NULL, +/* bba8 */ NULL, +/* bba9 */ NULL, +/* bbaa */ NULL, +/* bbab */ NULL, +/* bbac */ NULL, +/* bbad */ NULL, +/* bbae */ NULL, +/* bbaf */ NULL, +/* bbb0 */ NULL, +/* bbb1 */ NULL, +/* bbb2 */ NULL, +/* bbb3 */ NULL, +/* bbb4 */ NULL, +/* bbb5 */ NULL, +/* bbb6 */ NULL, +/* bbb7 */ NULL, +/* bbb8 */ NULL, +/* bbb9 */ NULL, +/* bbba */ NULL, +/* bbbb */ NULL, +/* bbbc */ NULL, +/* bbbd */ NULL, +/* bbbe */ NULL, +/* bbbf */ NULL, +/* bbc0 */ NULL, +/* bbc1 */ NULL, +/* bbc2 */ NULL, +/* bbc3 */ NULL, +/* bbc4 */ NULL, +/* bbc5 */ NULL, +/* bbc6 */ NULL, +/* bbc7 */ NULL, +/* bbc8 */ NULL, +/* bbc9 */ NULL, +/* bbca */ NULL, +/* bbcb */ NULL, +/* bbcc */ NULL, +/* bbcd */ NULL, +/* bbce */ NULL, +/* bbcf */ NULL, +/* bbd0 */ NULL, +/* bbd1 */ NULL, +/* bbd2 */ NULL, +/* bbd3 */ NULL, +/* bbd4 */ NULL, +/* bbd5 */ NULL, +/* bbd6 */ NULL, +/* bbd7 */ NULL, +/* bbd8 */ NULL, +/* bbd9 */ NULL, +/* bbda */ NULL, +/* bbdb */ NULL, +/* bbdc */ NULL, +/* bbdd */ NULL, +/* bbde */ NULL, +/* bbdf */ NULL, +/* bbe0 */ NULL, +/* bbe1 */ NULL, +/* bbe2 */ NULL, +/* bbe3 */ NULL, +/* bbe4 */ NULL, +/* bbe5 */ NULL, +/* bbe6 */ NULL, +/* bbe7 */ NULL, +/* bbe8 */ NULL, +/* bbe9 */ NULL, +/* bbea */ NULL, +/* bbeb */ NULL, +/* bbec */ NULL, +/* bbed */ NULL, +/* bbee */ NULL, +/* bbef */ NULL, +/* bbf0 */ NULL, +/* bbf1 */ NULL, +/* bbf2 */ NULL, +/* bbf3 */ NULL, +/* bbf4 */ NULL, +/* bbf5 */ NULL, +/* bbf6 */ NULL, +/* bbf7 */ NULL, +/* bbf8 */ NULL, +/* bbf9 */ NULL, +/* bbfa */ NULL, +/* bbfb */ NULL, +/* bbfc */ NULL, +/* bbfd */ NULL, +/* bbfe */ NULL, +/* bbff */ NULL, +/* bc00 */ NULL, +/* bc01 */ NULL, +/* bc02 */ NULL, +/* bc03 */ NULL, +/* bc04 */ NULL, +/* bc05 */ NULL, +/* bc06 */ NULL, +/* bc07 */ NULL, +/* bc08 */ NULL, +/* bc09 */ NULL, +/* bc0a */ NULL, +/* bc0b */ NULL, +/* bc0c */ NULL, +/* bc0d */ NULL, +/* bc0e */ NULL, +/* bc0f */ NULL, +/* bc10 */ NULL, +/* bc11 */ NULL, +/* bc12 */ NULL, +/* bc13 */ NULL, +/* bc14 */ NULL, +/* bc15 */ NULL, +/* bc16 */ NULL, +/* bc17 */ NULL, +/* bc18 */ NULL, +/* bc19 */ NULL, +/* bc1a */ NULL, +/* bc1b */ NULL, +/* bc1c */ NULL, +/* bc1d */ NULL, +/* bc1e */ NULL, +/* bc1f */ NULL, +/* bc20 */ NULL, +/* bc21 */ NULL, +/* bc22 */ NULL, +/* bc23 */ NULL, +/* bc24 */ NULL, +/* bc25 */ NULL, +/* bc26 */ NULL, +/* bc27 */ NULL, +/* bc28 */ NULL, +/* bc29 */ NULL, +/* bc2a */ NULL, +/* bc2b */ NULL, +/* bc2c */ NULL, +/* bc2d */ NULL, +/* bc2e */ NULL, +/* bc2f */ NULL, +/* bc30 */ NULL, +/* bc31 */ NULL, +/* bc32 */ NULL, +/* bc33 */ NULL, +/* bc34 */ NULL, +/* bc35 */ NULL, +/* bc36 */ NULL, +/* bc37 */ NULL, +/* bc38 */ NULL, +/* bc39 */ NULL, +/* bc3a */ NULL, +/* bc3b */ NULL, +/* bc3c */ NULL, +/* bc3d */ NULL, +/* bc3e */ NULL, +/* bc3f */ NULL, +/* bc40 */ NULL, +/* bc41 */ NULL, +/* bc42 */ NULL, +/* bc43 */ NULL, +/* bc44 */ NULL, +/* bc45 */ NULL, +/* bc46 */ NULL, +/* bc47 */ NULL, +/* bc48 */ NULL, +/* bc49 */ NULL, +/* bc4a */ NULL, +/* bc4b */ NULL, +/* bc4c */ NULL, +/* bc4d */ NULL, +/* bc4e */ NULL, +/* bc4f */ NULL, +/* bc50 */ NULL, +/* bc51 */ NULL, +/* bc52 */ NULL, +/* bc53 */ NULL, +/* bc54 */ NULL, +/* bc55 */ NULL, +/* bc56 */ NULL, +/* bc57 */ NULL, +/* bc58 */ NULL, +/* bc59 */ NULL, +/* bc5a */ NULL, +/* bc5b */ NULL, +/* bc5c */ NULL, +/* bc5d */ NULL, +/* bc5e */ NULL, +/* bc5f */ NULL, +/* bc60 */ NULL, +/* bc61 */ NULL, +/* bc62 */ NULL, +/* bc63 */ NULL, +/* bc64 */ NULL, +/* bc65 */ NULL, +/* bc66 */ NULL, +/* bc67 */ NULL, +/* bc68 */ NULL, +/* bc69 */ NULL, +/* bc6a */ NULL, +/* bc6b */ NULL, +/* bc6c */ NULL, +/* bc6d */ NULL, +/* bc6e */ NULL, +/* bc6f */ NULL, +/* bc70 */ NULL, +/* bc71 */ NULL, +/* bc72 */ NULL, +/* bc73 */ NULL, +/* bc74 */ NULL, +/* bc75 */ NULL, +/* bc76 */ NULL, +/* bc77 */ NULL, +/* bc78 */ NULL, +/* bc79 */ NULL, +/* bc7a */ NULL, +/* bc7b */ NULL, +/* bc7c */ NULL, +/* bc7d */ NULL, +/* bc7e */ NULL, +/* bc7f */ NULL, +/* bc80 */ NULL, +/* bc81 */ NULL, +/* bc82 */ NULL, +/* bc83 */ NULL, +/* bc84 */ NULL, +/* bc85 */ NULL, +/* bc86 */ NULL, +/* bc87 */ NULL, +/* bc88 */ NULL, +/* bc89 */ NULL, +/* bc8a */ NULL, +/* bc8b */ NULL, +/* bc8c */ NULL, +/* bc8d */ NULL, +/* bc8e */ NULL, +/* bc8f */ NULL, +/* bc90 */ NULL, +/* bc91 */ NULL, +/* bc92 */ NULL, +/* bc93 */ NULL, +/* bc94 */ NULL, +/* bc95 */ NULL, +/* bc96 */ NULL, +/* bc97 */ NULL, +/* bc98 */ NULL, +/* bc99 */ NULL, +/* bc9a */ NULL, +/* bc9b */ NULL, +/* bc9c */ NULL, +/* bc9d */ NULL, +/* bc9e */ NULL, +/* bc9f */ NULL, +/* bca0 */ NULL, +/* bca1 */ NULL, +/* bca2 */ NULL, +/* bca3 */ NULL, +/* bca4 */ NULL, +/* bca5 */ NULL, +/* bca6 */ NULL, +/* bca7 */ NULL, +/* bca8 */ NULL, +/* bca9 */ NULL, +/* bcaa */ NULL, +/* bcab */ NULL, +/* bcac */ NULL, +/* bcad */ NULL, +/* bcae */ NULL, +/* bcaf */ NULL, +/* bcb0 */ NULL, +/* bcb1 */ NULL, +/* bcb2 */ NULL, +/* bcb3 */ NULL, +/* bcb4 */ NULL, +/* bcb5 */ NULL, +/* bcb6 */ NULL, +/* bcb7 */ NULL, +/* bcb8 */ NULL, +/* bcb9 */ NULL, +/* bcba */ NULL, +/* bcbb */ NULL, +/* bcbc */ NULL, +/* bcbd */ NULL, +/* bcbe */ NULL, +/* bcbf */ NULL, +/* bcc0 */ NULL, +/* bcc1 */ NULL, +/* bcc2 */ NULL, +/* bcc3 */ NULL, +/* bcc4 */ NULL, +/* bcc5 */ NULL, +/* bcc6 */ NULL, +/* bcc7 */ NULL, +/* bcc8 */ NULL, +/* bcc9 */ NULL, +/* bcca */ NULL, +/* bccb */ NULL, +/* bccc */ NULL, +/* bccd */ NULL, +/* bcce */ NULL, +/* bccf */ NULL, +/* bcd0 */ NULL, +/* bcd1 */ NULL, +/* bcd2 */ NULL, +/* bcd3 */ NULL, +/* bcd4 */ NULL, +/* bcd5 */ NULL, +/* bcd6 */ NULL, +/* bcd7 */ NULL, +/* bcd8 */ NULL, +/* bcd9 */ NULL, +/* bcda */ NULL, +/* bcdb */ NULL, +/* bcdc */ NULL, +/* bcdd */ NULL, +/* bcde */ NULL, +/* bcdf */ NULL, +/* bce0 */ NULL, +/* bce1 */ NULL, +/* bce2 */ NULL, +/* bce3 */ NULL, +/* bce4 */ NULL, +/* bce5 */ NULL, +/* bce6 */ NULL, +/* bce7 */ NULL, +/* bce8 */ NULL, +/* bce9 */ NULL, +/* bcea */ NULL, +/* bceb */ NULL, +/* bcec */ NULL, +/* bced */ NULL, +/* bcee */ NULL, +/* bcef */ NULL, +/* bcf0 */ NULL, +/* bcf1 */ NULL, +/* bcf2 */ NULL, +/* bcf3 */ NULL, +/* bcf4 */ NULL, +/* bcf5 */ NULL, +/* bcf6 */ NULL, +/* bcf7 */ NULL, +/* bcf8 */ NULL, +/* bcf9 */ NULL, +/* bcfa */ NULL, +/* bcfb */ NULL, +/* bcfc */ NULL, +/* bcfd */ NULL, +/* bcfe */ NULL, +/* bcff */ NULL, +/* bd00 */ NULL, +/* bd01 */ NULL, +/* bd02 */ NULL, +/* bd03 */ NULL, +/* bd04 */ NULL, +/* bd05 */ NULL, +/* bd06 */ NULL, +/* bd07 */ NULL, +/* bd08 */ NULL, +/* bd09 */ NULL, +/* bd0a */ NULL, +/* bd0b */ NULL, +/* bd0c */ NULL, +/* bd0d */ NULL, +/* bd0e */ NULL, +/* bd0f */ NULL, +/* bd10 */ NULL, +/* bd11 */ NULL, +/* bd12 */ NULL, +/* bd13 */ NULL, +/* bd14 */ NULL, +/* bd15 */ NULL, +/* bd16 */ NULL, +/* bd17 */ NULL, +/* bd18 */ NULL, +/* bd19 */ NULL, +/* bd1a */ NULL, +/* bd1b */ NULL, +/* bd1c */ NULL, +/* bd1d */ NULL, +/* bd1e */ NULL, +/* bd1f */ NULL, +/* bd20 */ NULL, +/* bd21 */ NULL, +/* bd22 */ NULL, +/* bd23 */ NULL, +/* bd24 */ NULL, +/* bd25 */ NULL, +/* bd26 */ NULL, +/* bd27 */ NULL, +/* bd28 */ NULL, +/* bd29 */ NULL, +/* bd2a */ NULL, +/* bd2b */ NULL, +/* bd2c */ NULL, +/* bd2d */ NULL, +/* bd2e */ NULL, +/* bd2f */ NULL, +/* bd30 */ NULL, +/* bd31 */ NULL, +/* bd32 */ NULL, +/* bd33 */ NULL, +/* bd34 */ NULL, +/* bd35 */ NULL, +/* bd36 */ NULL, +/* bd37 */ NULL, +/* bd38 */ NULL, +/* bd39 */ NULL, +/* bd3a */ NULL, +/* bd3b */ NULL, +/* bd3c */ NULL, +/* bd3d */ NULL, +/* bd3e */ NULL, +/* bd3f */ NULL, +/* bd40 */ NULL, +/* bd41 */ NULL, +/* bd42 */ NULL, +/* bd43 */ NULL, +/* bd44 */ NULL, +/* bd45 */ NULL, +/* bd46 */ NULL, +/* bd47 */ NULL, +/* bd48 */ NULL, +/* bd49 */ NULL, +/* bd4a */ NULL, +/* bd4b */ NULL, +/* bd4c */ NULL, +/* bd4d */ NULL, +/* bd4e */ NULL, +/* bd4f */ NULL, +/* bd50 */ NULL, +/* bd51 */ NULL, +/* bd52 */ NULL, +/* bd53 */ NULL, +/* bd54 */ NULL, +/* bd55 */ NULL, +/* bd56 */ NULL, +/* bd57 */ NULL, +/* bd58 */ NULL, +/* bd59 */ NULL, +/* bd5a */ NULL, +/* bd5b */ NULL, +/* bd5c */ NULL, +/* bd5d */ NULL, +/* bd5e */ NULL, +/* bd5f */ NULL, +/* bd60 */ NULL, +/* bd61 */ NULL, +/* bd62 */ NULL, +/* bd63 */ NULL, +/* bd64 */ NULL, +/* bd65 */ NULL, +/* bd66 */ NULL, +/* bd67 */ NULL, +/* bd68 */ NULL, +/* bd69 */ NULL, +/* bd6a */ NULL, +/* bd6b */ NULL, +/* bd6c */ NULL, +/* bd6d */ NULL, +/* bd6e */ NULL, +/* bd6f */ NULL, +/* bd70 */ NULL, +/* bd71 */ NULL, +/* bd72 */ NULL, +/* bd73 */ NULL, +/* bd74 */ NULL, +/* bd75 */ NULL, +/* bd76 */ NULL, +/* bd77 */ NULL, +/* bd78 */ NULL, +/* bd79 */ NULL, +/* bd7a */ NULL, +/* bd7b */ NULL, +/* bd7c */ NULL, +/* bd7d */ NULL, +/* bd7e */ NULL, +/* bd7f */ NULL, +/* bd80 */ NULL, +/* bd81 */ NULL, +/* bd82 */ NULL, +/* bd83 */ NULL, +/* bd84 */ NULL, +/* bd85 */ NULL, +/* bd86 */ NULL, +/* bd87 */ NULL, +/* bd88 */ NULL, +/* bd89 */ NULL, +/* bd8a */ NULL, +/* bd8b */ NULL, +/* bd8c */ NULL, +/* bd8d */ NULL, +/* bd8e */ NULL, +/* bd8f */ NULL, +/* bd90 */ NULL, +/* bd91 */ NULL, +/* bd92 */ NULL, +/* bd93 */ NULL, +/* bd94 */ NULL, +/* bd95 */ NULL, +/* bd96 */ NULL, +/* bd97 */ NULL, +/* bd98 */ NULL, +/* bd99 */ NULL, +/* bd9a */ NULL, +/* bd9b */ NULL, +/* bd9c */ NULL, +/* bd9d */ NULL, +/* bd9e */ NULL, +/* bd9f */ NULL, +/* bda0 */ NULL, +/* bda1 */ NULL, +/* bda2 */ NULL, +/* bda3 */ NULL, +/* bda4 */ NULL, +/* bda5 */ NULL, +/* bda6 */ NULL, +/* bda7 */ NULL, +/* bda8 */ NULL, +/* bda9 */ NULL, +/* bdaa */ NULL, +/* bdab */ NULL, +/* bdac */ NULL, +/* bdad */ NULL, +/* bdae */ NULL, +/* bdaf */ NULL, +/* bdb0 */ NULL, +/* bdb1 */ NULL, +/* bdb2 */ NULL, +/* bdb3 */ NULL, +/* bdb4 */ NULL, +/* bdb5 */ NULL, +/* bdb6 */ NULL, +/* bdb7 */ NULL, +/* bdb8 */ NULL, +/* bdb9 */ NULL, +/* bdba */ NULL, +/* bdbb */ NULL, +/* bdbc */ NULL, +/* bdbd */ NULL, +/* bdbe */ NULL, +/* bdbf */ NULL, +/* bdc0 */ NULL, +/* bdc1 */ NULL, +/* bdc2 */ NULL, +/* bdc3 */ NULL, +/* bdc4 */ NULL, +/* bdc5 */ NULL, +/* bdc6 */ NULL, +/* bdc7 */ NULL, +/* bdc8 */ NULL, +/* bdc9 */ NULL, +/* bdca */ NULL, +/* bdcb */ NULL, +/* bdcc */ NULL, +/* bdcd */ NULL, +/* bdce */ NULL, +/* bdcf */ NULL, +/* bdd0 */ NULL, +/* bdd1 */ NULL, +/* bdd2 */ NULL, +/* bdd3 */ NULL, +/* bdd4 */ NULL, +/* bdd5 */ NULL, +/* bdd6 */ NULL, +/* bdd7 */ NULL, +/* bdd8 */ NULL, +/* bdd9 */ NULL, +/* bdda */ NULL, +/* bddb */ NULL, +/* bddc */ NULL, +/* bddd */ NULL, +/* bdde */ NULL, +/* bddf */ NULL, +/* bde0 */ NULL, +/* bde1 */ NULL, +/* bde2 */ NULL, +/* bde3 */ NULL, +/* bde4 */ NULL, +/* bde5 */ NULL, +/* bde6 */ NULL, +/* bde7 */ NULL, +/* bde8 */ NULL, +/* bde9 */ NULL, +/* bdea */ NULL, +/* bdeb */ NULL, +/* bdec */ NULL, +/* bded */ NULL, +/* bdee */ NULL, +/* bdef */ NULL, +/* bdf0 */ NULL, +/* bdf1 */ NULL, +/* bdf2 */ NULL, +/* bdf3 */ NULL, +/* bdf4 */ NULL, +/* bdf5 */ NULL, +/* bdf6 */ NULL, +/* bdf7 */ NULL, +/* bdf8 */ NULL, +/* bdf9 */ NULL, +/* bdfa */ NULL, +/* bdfb */ NULL, +/* bdfc */ NULL, +/* bdfd */ NULL, +/* bdfe */ NULL, +/* bdff */ NULL, +/* be00 */ NULL, +/* be01 */ NULL, +/* be02 */ NULL, +/* be03 */ NULL, +/* be04 */ NULL, +/* be05 */ NULL, +/* be06 */ NULL, +/* be07 */ NULL, +/* be08 */ NULL, +/* be09 */ NULL, +/* be0a */ NULL, +/* be0b */ NULL, +/* be0c */ NULL, +/* be0d */ NULL, +/* be0e */ NULL, +/* be0f */ NULL, +/* be10 */ NULL, +/* be11 */ NULL, +/* be12 */ NULL, +/* be13 */ NULL, +/* be14 */ NULL, +/* be15 */ NULL, +/* be16 */ NULL, +/* be17 */ NULL, +/* be18 */ NULL, +/* be19 */ NULL, +/* be1a */ NULL, +/* be1b */ NULL, +/* be1c */ NULL, +/* be1d */ NULL, +/* be1e */ NULL, +/* be1f */ NULL, +/* be20 */ NULL, +/* be21 */ NULL, +/* be22 */ NULL, +/* be23 */ NULL, +/* be24 */ NULL, +/* be25 */ NULL, +/* be26 */ NULL, +/* be27 */ NULL, +/* be28 */ NULL, +/* be29 */ NULL, +/* be2a */ NULL, +/* be2b */ NULL, +/* be2c */ NULL, +/* be2d */ NULL, +/* be2e */ NULL, +/* be2f */ NULL, +/* be30 */ NULL, +/* be31 */ NULL, +/* be32 */ NULL, +/* be33 */ NULL, +/* be34 */ NULL, +/* be35 */ NULL, +/* be36 */ NULL, +/* be37 */ NULL, +/* be38 */ NULL, +/* be39 */ NULL, +/* be3a */ NULL, +/* be3b */ NULL, +/* be3c */ NULL, +/* be3d */ NULL, +/* be3e */ NULL, +/* be3f */ NULL, +/* be40 */ NULL, +/* be41 */ NULL, +/* be42 */ NULL, +/* be43 */ NULL, +/* be44 */ NULL, +/* be45 */ NULL, +/* be46 */ NULL, +/* be47 */ NULL, +/* be48 */ NULL, +/* be49 */ NULL, +/* be4a */ NULL, +/* be4b */ NULL, +/* be4c */ NULL, +/* be4d */ NULL, +/* be4e */ NULL, +/* be4f */ NULL, +/* be50 */ NULL, +/* be51 */ NULL, +/* be52 */ NULL, +/* be53 */ NULL, +/* be54 */ NULL, +/* be55 */ NULL, +/* be56 */ NULL, +/* be57 */ NULL, +/* be58 */ NULL, +/* be59 */ NULL, +/* be5a */ NULL, +/* be5b */ NULL, +/* be5c */ NULL, +/* be5d */ NULL, +/* be5e */ NULL, +/* be5f */ NULL, +/* be60 */ NULL, +/* be61 */ NULL, +/* be62 */ NULL, +/* be63 */ NULL, +/* be64 */ NULL, +/* be65 */ NULL, +/* be66 */ NULL, +/* be67 */ NULL, +/* be68 */ NULL, +/* be69 */ NULL, +/* be6a */ NULL, +/* be6b */ NULL, +/* be6c */ NULL, +/* be6d */ NULL, +/* be6e */ NULL, +/* be6f */ NULL, +/* be70 */ NULL, +/* be71 */ NULL, +/* be72 */ NULL, +/* be73 */ NULL, +/* be74 */ NULL, +/* be75 */ NULL, +/* be76 */ NULL, +/* be77 */ NULL, +/* be78 */ NULL, +/* be79 */ NULL, +/* be7a */ NULL, +/* be7b */ NULL, +/* be7c */ NULL, +/* be7d */ NULL, +/* be7e */ NULL, +/* be7f */ NULL, +/* be80 */ NULL, +/* be81 */ NULL, +/* be82 */ NULL, +/* be83 */ NULL, +/* be84 */ NULL, +/* be85 */ NULL, +/* be86 */ NULL, +/* be87 */ NULL, +/* be88 */ NULL, +/* be89 */ NULL, +/* be8a */ NULL, +/* be8b */ NULL, +/* be8c */ NULL, +/* be8d */ NULL, +/* be8e */ NULL, +/* be8f */ NULL, +/* be90 */ NULL, +/* be91 */ NULL, +/* be92 */ NULL, +/* be93 */ NULL, +/* be94 */ NULL, +/* be95 */ NULL, +/* be96 */ NULL, +/* be97 */ NULL, +/* be98 */ NULL, +/* be99 */ NULL, +/* be9a */ NULL, +/* be9b */ NULL, +/* be9c */ NULL, +/* be9d */ NULL, +/* be9e */ NULL, +/* be9f */ NULL, +/* bea0 */ NULL, +/* bea1 */ NULL, +/* bea2 */ NULL, +/* bea3 */ NULL, +/* bea4 */ NULL, +/* bea5 */ NULL, +/* bea6 */ NULL, +/* bea7 */ NULL, +/* bea8 */ NULL, +/* bea9 */ NULL, +/* beaa */ NULL, +/* beab */ NULL, +/* beac */ NULL, +/* bead */ NULL, +/* beae */ NULL, +/* beaf */ NULL, +/* beb0 */ NULL, +/* beb1 */ NULL, +/* beb2 */ NULL, +/* beb3 */ NULL, +/* beb4 */ NULL, +/* beb5 */ NULL, +/* beb6 */ NULL, +/* beb7 */ NULL, +/* beb8 */ NULL, +/* beb9 */ NULL, +/* beba */ NULL, +/* bebb */ NULL, +/* bebc */ NULL, +/* bebd */ NULL, +/* bebe */ NULL, +/* bebf */ NULL, +/* bec0 */ NULL, +/* bec1 */ NULL, +/* bec2 */ NULL, +/* bec3 */ NULL, +/* bec4 */ NULL, +/* bec5 */ NULL, +/* bec6 */ NULL, +/* bec7 */ NULL, +/* bec8 */ NULL, +/* bec9 */ NULL, +/* beca */ NULL, +/* becb */ NULL, +/* becc */ NULL, +/* becd */ NULL, +/* bece */ NULL, +/* becf */ NULL, +/* bed0 */ NULL, +/* bed1 */ NULL, +/* bed2 */ NULL, +/* bed3 */ NULL, +/* bed4 */ NULL, +/* bed5 */ NULL, +/* bed6 */ NULL, +/* bed7 */ NULL, +/* bed8 */ NULL, +/* bed9 */ NULL, +/* beda */ NULL, +/* bedb */ NULL, +/* bedc */ NULL, +/* bedd */ NULL, +/* bede */ NULL, +/* bedf */ NULL, +/* bee0 */ NULL, +/* bee1 */ NULL, +/* bee2 */ NULL, +/* bee3 */ NULL, +/* bee4 */ NULL, +/* bee5 */ NULL, +/* bee6 */ NULL, +/* bee7 */ NULL, +/* bee8 */ NULL, +/* bee9 */ NULL, +/* beea */ NULL, +/* beeb */ NULL, +/* beec */ NULL, +/* beed */ NULL, +/* beee */ NULL, +/* beef */ NULL, +/* bef0 */ NULL, +/* bef1 */ NULL, +/* bef2 */ NULL, +/* bef3 */ NULL, +/* bef4 */ NULL, +/* bef5 */ NULL, +/* bef6 */ NULL, +/* bef7 */ NULL, +/* bef8 */ NULL, +/* bef9 */ NULL, +/* befa */ NULL, +/* befb */ NULL, +/* befc */ NULL, +/* befd */ NULL, +/* befe */ NULL, +/* beff */ NULL, +/* bf00 */ NULL, +/* bf01 */ NULL, +/* bf02 */ NULL, +/* bf03 */ NULL, +/* bf04 */ NULL, +/* bf05 */ NULL, +/* bf06 */ NULL, +/* bf07 */ NULL, +/* bf08 */ NULL, +/* bf09 */ NULL, +/* bf0a */ NULL, +/* bf0b */ NULL, +/* bf0c */ NULL, +/* bf0d */ NULL, +/* bf0e */ NULL, +/* bf0f */ NULL, +/* bf10 */ NULL, +/* bf11 */ NULL, +/* bf12 */ NULL, +/* bf13 */ NULL, +/* bf14 */ NULL, +/* bf15 */ NULL, +/* bf16 */ NULL, +/* bf17 */ NULL, +/* bf18 */ NULL, +/* bf19 */ NULL, +/* bf1a */ NULL, +/* bf1b */ NULL, +/* bf1c */ NULL, +/* bf1d */ NULL, +/* bf1e */ NULL, +/* bf1f */ NULL, +/* bf20 */ NULL, +/* bf21 */ NULL, +/* bf22 */ NULL, +/* bf23 */ NULL, +/* bf24 */ NULL, +/* bf25 */ NULL, +/* bf26 */ NULL, +/* bf27 */ NULL, +/* bf28 */ NULL, +/* bf29 */ NULL, +/* bf2a */ NULL, +/* bf2b */ NULL, +/* bf2c */ NULL, +/* bf2d */ NULL, +/* bf2e */ NULL, +/* bf2f */ NULL, +/* bf30 */ NULL, +/* bf31 */ NULL, +/* bf32 */ NULL, +/* bf33 */ NULL, +/* bf34 */ NULL, +/* bf35 */ NULL, +/* bf36 */ NULL, +/* bf37 */ NULL, +/* bf38 */ NULL, +/* bf39 */ NULL, +/* bf3a */ NULL, +/* bf3b */ NULL, +/* bf3c */ NULL, +/* bf3d */ NULL, +/* bf3e */ NULL, +/* bf3f */ NULL, +/* bf40 */ NULL, +/* bf41 */ NULL, +/* bf42 */ NULL, +/* bf43 */ NULL, +/* bf44 */ NULL, +/* bf45 */ NULL, +/* bf46 */ NULL, +/* bf47 */ NULL, +/* bf48 */ NULL, +/* bf49 */ NULL, +/* bf4a */ NULL, +/* bf4b */ NULL, +/* bf4c */ NULL, +/* bf4d */ NULL, +/* bf4e */ NULL, +/* bf4f */ NULL, +/* bf50 */ NULL, +/* bf51 */ NULL, +/* bf52 */ NULL, +/* bf53 */ NULL, +/* bf54 */ NULL, +/* bf55 */ NULL, +/* bf56 */ NULL, +/* bf57 */ NULL, +/* bf58 */ NULL, +/* bf59 */ NULL, +/* bf5a */ NULL, +/* bf5b */ NULL, +/* bf5c */ NULL, +/* bf5d */ NULL, +/* bf5e */ NULL, +/* bf5f */ NULL, +/* bf60 */ NULL, +/* bf61 */ NULL, +/* bf62 */ NULL, +/* bf63 */ NULL, +/* bf64 */ NULL, +/* bf65 */ NULL, +/* bf66 */ NULL, +/* bf67 */ NULL, +/* bf68 */ NULL, +/* bf69 */ NULL, +/* bf6a */ NULL, +/* bf6b */ NULL, +/* bf6c */ NULL, +/* bf6d */ NULL, +/* bf6e */ NULL, +/* bf6f */ NULL, +/* bf70 */ NULL, +/* bf71 */ NULL, +/* bf72 */ NULL, +/* bf73 */ NULL, +/* bf74 */ NULL, +/* bf75 */ NULL, +/* bf76 */ NULL, +/* bf77 */ NULL, +/* bf78 */ NULL, +/* bf79 */ NULL, +/* bf7a */ NULL, +/* bf7b */ NULL, +/* bf7c */ NULL, +/* bf7d */ NULL, +/* bf7e */ NULL, +/* bf7f */ NULL, +/* bf80 */ NULL, +/* bf81 */ NULL, +/* bf82 */ NULL, +/* bf83 */ NULL, +/* bf84 */ NULL, +/* bf85 */ NULL, +/* bf86 */ NULL, +/* bf87 */ NULL, +/* bf88 */ NULL, +/* bf89 */ NULL, +/* bf8a */ NULL, +/* bf8b */ NULL, +/* bf8c */ NULL, +/* bf8d */ NULL, +/* bf8e */ NULL, +/* bf8f */ NULL, +/* bf90 */ NULL, +/* bf91 */ NULL, +/* bf92 */ NULL, +/* bf93 */ NULL, +/* bf94 */ NULL, +/* bf95 */ NULL, +/* bf96 */ NULL, +/* bf97 */ NULL, +/* bf98 */ NULL, +/* bf99 */ NULL, +/* bf9a */ NULL, +/* bf9b */ NULL, +/* bf9c */ NULL, +/* bf9d */ NULL, +/* bf9e */ NULL, +/* bf9f */ NULL, +/* bfa0 */ NULL, +/* bfa1 */ NULL, +/* bfa2 */ NULL, +/* bfa3 */ NULL, +/* bfa4 */ NULL, +/* bfa5 */ NULL, +/* bfa6 */ NULL, +/* bfa7 */ NULL, +/* bfa8 */ NULL, +/* bfa9 */ NULL, +/* bfaa */ NULL, +/* bfab */ NULL, +/* bfac */ NULL, +/* bfad */ NULL, +/* bfae */ NULL, +/* bfaf */ NULL, +/* bfb0 */ NULL, +/* bfb1 */ NULL, +/* bfb2 */ NULL, +/* bfb3 */ NULL, +/* bfb4 */ NULL, +/* bfb5 */ NULL, +/* bfb6 */ NULL, +/* bfb7 */ NULL, +/* bfb8 */ NULL, +/* bfb9 */ NULL, +/* bfba */ NULL, +/* bfbb */ NULL, +/* bfbc */ NULL, +/* bfbd */ NULL, +/* bfbe */ NULL, +/* bfbf */ NULL, +/* bfc0 */ NULL, +/* bfc1 */ NULL, +/* bfc2 */ NULL, +/* bfc3 */ NULL, +/* bfc4 */ NULL, +/* bfc5 */ NULL, +/* bfc6 */ NULL, +/* bfc7 */ NULL, +/* bfc8 */ NULL, +/* bfc9 */ NULL, +/* bfca */ NULL, +/* bfcb */ NULL, +/* bfcc */ NULL, +/* bfcd */ NULL, +/* bfce */ NULL, +/* bfcf */ NULL, +/* bfd0 */ NULL, +/* bfd1 */ NULL, +/* bfd2 */ NULL, +/* bfd3 */ NULL, +/* bfd4 */ NULL, +/* bfd5 */ NULL, +/* bfd6 */ NULL, +/* bfd7 */ NULL, +/* bfd8 */ NULL, +/* bfd9 */ NULL, +/* bfda */ NULL, +/* bfdb */ NULL, +/* bfdc */ NULL, +/* bfdd */ NULL, +/* bfde */ NULL, +/* bfdf */ NULL, +/* bfe0 */ NULL, +/* bfe1 */ NULL, +/* bfe2 */ NULL, +/* bfe3 */ NULL, +/* bfe4 */ NULL, +/* bfe5 */ NULL, +/* bfe6 */ NULL, +/* bfe7 */ NULL, +/* bfe8 */ NULL, +/* bfe9 */ NULL, +/* bfea */ NULL, +/* bfeb */ NULL, +/* bfec */ NULL, +/* bfed */ NULL, +/* bfee */ NULL, +/* bfef */ NULL, +/* bff0 */ NULL, +/* bff1 */ NULL, +/* bff2 */ NULL, +/* bff3 */ NULL, +/* bff4 */ NULL, +/* bff5 */ NULL, +/* bff6 */ NULL, +/* bff7 */ NULL, +/* bff8 */ NULL, +/* bff9 */ NULL, +/* bffa */ NULL, +/* bffb */ NULL, +/* bffc */ NULL, +/* bffd */ NULL, +/* bffe */ NULL, +/* bfff */ NULL, +/* c000 */ NULL, +/* c001 */ NULL, +/* c002 */ NULL, +/* c003 */ NULL, +/* c004 */ NULL, +/* c005 */ NULL, +/* c006 */ NULL, +/* c007 */ NULL, +/* c008 */ NULL, +/* c009 */ NULL, +/* c00a */ NULL, +/* c00b */ NULL, +/* c00c */ NULL, +/* c00d */ NULL, +/* c00e */ NULL, +/* c00f */ NULL, +/* c010 */ NULL, +/* c011 */ NULL, +/* c012 */ NULL, +/* c013 */ NULL, +/* c014 */ NULL, +/* c015 */ NULL, +/* c016 */ NULL, +/* c017 */ NULL, +/* c018 */ NULL, +/* c019 */ NULL, +/* c01a */ NULL, +/* c01b */ NULL, +/* c01c */ NULL, +/* c01d */ NULL, +/* c01e */ NULL, +/* c01f */ NULL, +/* c020 */ NULL, +/* c021 */ NULL, +/* c022 */ NULL, +/* c023 */ NULL, +/* c024 */ NULL, +/* c025 */ NULL, +/* c026 */ NULL, +/* c027 */ NULL, +/* c028 */ NULL, +/* c029 */ NULL, +/* c02a */ NULL, +/* c02b */ NULL, +/* c02c */ NULL, +/* c02d */ NULL, +/* c02e */ NULL, +/* c02f */ NULL, +/* c030 */ NULL, +/* c031 */ NULL, +/* c032 */ NULL, +/* c033 */ NULL, +/* c034 */ NULL, +/* c035 */ NULL, +/* c036 */ NULL, +/* c037 */ NULL, +/* c038 */ NULL, +/* c039 */ NULL, +/* c03a */ NULL, +/* c03b */ NULL, +/* c03c */ NULL, +/* c03d */ NULL, +/* c03e */ NULL, +/* c03f */ NULL, +/* c040 */ NULL, +/* c041 */ NULL, +/* c042 */ NULL, +/* c043 */ NULL, +/* c044 */ NULL, +/* c045 */ NULL, +/* c046 */ NULL, +/* c047 */ NULL, +/* c048 */ NULL, +/* c049 */ NULL, +/* c04a */ NULL, +/* c04b */ NULL, +/* c04c */ NULL, +/* c04d */ NULL, +/* c04e */ NULL, +/* c04f */ NULL, +/* c050 */ NULL, +/* c051 */ NULL, +/* c052 */ NULL, +/* c053 */ NULL, +/* c054 */ NULL, +/* c055 */ NULL, +/* c056 */ NULL, +/* c057 */ NULL, +/* c058 */ NULL, +/* c059 */ NULL, +/* c05a */ NULL, +/* c05b */ NULL, +/* c05c */ NULL, +/* c05d */ NULL, +/* c05e */ NULL, +/* c05f */ NULL, +/* c060 */ NULL, +/* c061 */ NULL, +/* c062 */ NULL, +/* c063 */ NULL, +/* c064 */ NULL, +/* c065 */ NULL, +/* c066 */ NULL, +/* c067 */ NULL, +/* c068 */ NULL, +/* c069 */ NULL, +/* c06a */ NULL, +/* c06b */ NULL, +/* c06c */ NULL, +/* c06d */ NULL, +/* c06e */ NULL, +/* c06f */ NULL, +/* c070 */ NULL, +/* c071 */ NULL, +/* c072 */ NULL, +/* c073 */ NULL, +/* c074 */ NULL, +/* c075 */ NULL, +/* c076 */ NULL, +/* c077 */ NULL, +/* c078 */ NULL, +/* c079 */ NULL, +/* c07a */ NULL, +/* c07b */ NULL, +/* c07c */ NULL, +/* c07d */ NULL, +/* c07e */ NULL, +/* c07f */ NULL, +/* c080 */ NULL, +/* c081 */ NULL, +/* c082 */ NULL, +/* c083 */ NULL, +/* c084 */ NULL, +/* c085 */ NULL, +/* c086 */ NULL, +/* c087 */ NULL, +/* c088 */ NULL, +/* c089 */ NULL, +/* c08a */ NULL, +/* c08b */ NULL, +/* c08c */ NULL, +/* c08d */ NULL, +/* c08e */ NULL, +/* c08f */ NULL, +/* c090 */ NULL, +/* c091 */ NULL, +/* c092 */ NULL, +/* c093 */ NULL, +/* c094 */ NULL, +/* c095 */ NULL, +/* c096 */ NULL, +/* c097 */ NULL, +/* c098 */ NULL, +/* c099 */ NULL, +/* c09a */ NULL, +/* c09b */ NULL, +/* c09c */ NULL, +/* c09d */ NULL, +/* c09e */ NULL, +/* c09f */ NULL, +/* c0a0 */ NULL, +/* c0a1 */ NULL, +/* c0a2 */ NULL, +/* c0a3 */ NULL, +/* c0a4 */ NULL, +/* c0a5 */ NULL, +/* c0a6 */ NULL, +/* c0a7 */ NULL, +/* c0a8 */ NULL, +/* c0a9 */ NULL, +/* c0aa */ NULL, +/* c0ab */ NULL, +/* c0ac */ NULL, +/* c0ad */ NULL, +/* c0ae */ NULL, +/* c0af */ NULL, +/* c0b0 */ NULL, +/* c0b1 */ NULL, +/* c0b2 */ NULL, +/* c0b3 */ NULL, +/* c0b4 */ NULL, +/* c0b5 */ NULL, +/* c0b6 */ NULL, +/* c0b7 */ NULL, +/* c0b8 */ NULL, +/* c0b9 */ NULL, +/* c0ba */ NULL, +/* c0bb */ NULL, +/* c0bc */ NULL, +/* c0bd */ NULL, +/* c0be */ NULL, +/* c0bf */ NULL, +/* c0c0 */ NULL, +/* c0c1 */ NULL, +/* c0c2 */ NULL, +/* c0c3 */ NULL, +/* c0c4 */ NULL, +/* c0c5 */ NULL, +/* c0c6 */ NULL, +/* c0c7 */ NULL, +/* c0c8 */ NULL, +/* c0c9 */ NULL, +/* c0ca */ NULL, +/* c0cb */ NULL, +/* c0cc */ NULL, +/* c0cd */ NULL, +/* c0ce */ NULL, +/* c0cf */ NULL, +/* c0d0 */ NULL, +/* c0d1 */ NULL, +/* c0d2 */ NULL, +/* c0d3 */ NULL, +/* c0d4 */ NULL, +/* c0d5 */ NULL, +/* c0d6 */ NULL, +/* c0d7 */ NULL, +/* c0d8 */ NULL, +/* c0d9 */ NULL, +/* c0da */ NULL, +/* c0db */ NULL, +/* c0dc */ NULL, +/* c0dd */ NULL, +/* c0de */ NULL, +/* c0df */ NULL, +/* c0e0 */ NULL, +/* c0e1 */ NULL, +/* c0e2 */ NULL, +/* c0e3 */ NULL, +/* c0e4 */ NULL, +/* c0e5 */ NULL, +/* c0e6 */ NULL, +/* c0e7 */ NULL, +/* c0e8 */ NULL, +/* c0e9 */ NULL, +/* c0ea */ NULL, +/* c0eb */ NULL, +/* c0ec */ NULL, +/* c0ed */ NULL, +/* c0ee */ NULL, +/* c0ef */ NULL, +/* c0f0 */ NULL, +/* c0f1 */ NULL, +/* c0f2 */ NULL, +/* c0f3 */ NULL, +/* c0f4 */ NULL, +/* c0f5 */ NULL, +/* c0f6 */ NULL, +/* c0f7 */ NULL, +/* c0f8 */ NULL, +/* c0f9 */ NULL, +/* c0fa */ NULL, +/* c0fb */ NULL, +/* c0fc */ NULL, +/* c0fd */ NULL, +/* c0fe */ NULL, +/* c0ff */ NULL, +/* c100 */ NULL, +/* c101 */ NULL, +/* c102 */ NULL, +/* c103 */ NULL, +/* c104 */ NULL, +/* c105 */ NULL, +/* c106 */ NULL, +/* c107 */ NULL, +/* c108 */ NULL, +/* c109 */ NULL, +/* c10a */ NULL, +/* c10b */ NULL, +/* c10c */ NULL, +/* c10d */ NULL, +/* c10e */ NULL, +/* c10f */ NULL, +/* c110 */ NULL, +/* c111 */ NULL, +/* c112 */ NULL, +/* c113 */ NULL, +/* c114 */ NULL, +/* c115 */ NULL, +/* c116 */ NULL, +/* c117 */ NULL, +/* c118 */ NULL, +/* c119 */ NULL, +/* c11a */ NULL, +/* c11b */ NULL, +/* c11c */ NULL, +/* c11d */ NULL, +/* c11e */ NULL, +/* c11f */ NULL, +/* c120 */ NULL, +/* c121 */ NULL, +/* c122 */ NULL, +/* c123 */ NULL, +/* c124 */ NULL, +/* c125 */ NULL, +/* c126 */ NULL, +/* c127 */ NULL, +/* c128 */ NULL, +/* c129 */ NULL, +/* c12a */ NULL, +/* c12b */ NULL, +/* c12c */ NULL, +/* c12d */ NULL, +/* c12e */ NULL, +/* c12f */ NULL, +/* c130 */ NULL, +/* c131 */ NULL, +/* c132 */ NULL, +/* c133 */ NULL, +/* c134 */ NULL, +/* c135 */ NULL, +/* c136 */ NULL, +/* c137 */ NULL, +/* c138 */ NULL, +/* c139 */ NULL, +/* c13a */ NULL, +/* c13b */ NULL, +/* c13c */ NULL, +/* c13d */ NULL, +/* c13e */ NULL, +/* c13f */ NULL, +/* c140 */ NULL, +/* c141 */ NULL, +/* c142 */ NULL, +/* c143 */ NULL, +/* c144 */ NULL, +/* c145 */ NULL, +/* c146 */ NULL, +/* c147 */ NULL, +/* c148 */ NULL, +/* c149 */ NULL, +/* c14a */ NULL, +/* c14b */ NULL, +/* c14c */ NULL, +/* c14d */ NULL, +/* c14e */ NULL, +/* c14f */ NULL, +/* c150 */ NULL, +/* c151 */ NULL, +/* c152 */ NULL, +/* c153 */ NULL, +/* c154 */ NULL, +/* c155 */ NULL, +/* c156 */ NULL, +/* c157 */ NULL, +/* c158 */ NULL, +/* c159 */ NULL, +/* c15a */ NULL, +/* c15b */ NULL, +/* c15c */ NULL, +/* c15d */ NULL, +/* c15e */ NULL, +/* c15f */ NULL, +/* c160 */ NULL, +/* c161 */ NULL, +/* c162 */ NULL, +/* c163 */ NULL, +/* c164 */ NULL, +/* c165 */ NULL, +/* c166 */ NULL, +/* c167 */ NULL, +/* c168 */ NULL, +/* c169 */ NULL, +/* c16a */ NULL, +/* c16b */ NULL, +/* c16c */ NULL, +/* c16d */ NULL, +/* c16e */ NULL, +/* c16f */ NULL, +/* c170 */ NULL, +/* c171 */ NULL, +/* c172 */ NULL, +/* c173 */ NULL, +/* c174 */ NULL, +/* c175 */ NULL, +/* c176 */ NULL, +/* c177 */ NULL, +/* c178 */ NULL, +/* c179 */ NULL, +/* c17a */ NULL, +/* c17b */ NULL, +/* c17c */ NULL, +/* c17d */ NULL, +/* c17e */ NULL, +/* c17f */ NULL, +/* c180 */ NULL, +/* c181 */ NULL, +/* c182 */ NULL, +/* c183 */ NULL, +/* c184 */ NULL, +/* c185 */ NULL, +/* c186 */ NULL, +/* c187 */ NULL, +/* c188 */ NULL, +/* c189 */ NULL, +/* c18a */ NULL, +/* c18b */ NULL, +/* c18c */ NULL, +/* c18d */ NULL, +/* c18e */ NULL, +/* c18f */ NULL, +/* c190 */ NULL, +/* c191 */ NULL, +/* c192 */ NULL, +/* c193 */ NULL, +/* c194 */ NULL, +/* c195 */ NULL, +/* c196 */ NULL, +/* c197 */ NULL, +/* c198 */ NULL, +/* c199 */ NULL, +/* c19a */ NULL, +/* c19b */ NULL, +/* c19c */ NULL, +/* c19d */ NULL, +/* c19e */ NULL, +/* c19f */ NULL, +/* c1a0 */ NULL, +/* c1a1 */ NULL, +/* c1a2 */ NULL, +/* c1a3 */ NULL, +/* c1a4 */ NULL, +/* c1a5 */ NULL, +/* c1a6 */ NULL, +/* c1a7 */ NULL, +/* c1a8 */ NULL, +/* c1a9 */ NULL, +/* c1aa */ NULL, +/* c1ab */ NULL, +/* c1ac */ NULL, +/* c1ad */ NULL, +/* c1ae */ NULL, +/* c1af */ NULL, +/* c1b0 */ NULL, +/* c1b1 */ NULL, +/* c1b2 */ NULL, +/* c1b3 */ NULL, +/* c1b4 */ NULL, +/* c1b5 */ NULL, +/* c1b6 */ NULL, +/* c1b7 */ NULL, +/* c1b8 */ NULL, +/* c1b9 */ NULL, +/* c1ba */ NULL, +/* c1bb */ NULL, +/* c1bc */ NULL, +/* c1bd */ NULL, +/* c1be */ NULL, +/* c1bf */ NULL, +/* c1c0 */ NULL, +/* c1c1 */ NULL, +/* c1c2 */ NULL, +/* c1c3 */ NULL, +/* c1c4 */ NULL, +/* c1c5 */ NULL, +/* c1c6 */ NULL, +/* c1c7 */ NULL, +/* c1c8 */ NULL, +/* c1c9 */ NULL, +/* c1ca */ NULL, +/* c1cb */ NULL, +/* c1cc */ NULL, +/* c1cd */ NULL, +/* c1ce */ NULL, +/* c1cf */ NULL, +/* c1d0 */ NULL, +/* c1d1 */ NULL, +/* c1d2 */ NULL, +/* c1d3 */ NULL, +/* c1d4 */ NULL, +/* c1d5 */ NULL, +/* c1d6 */ NULL, +/* c1d7 */ NULL, +/* c1d8 */ NULL, +/* c1d9 */ NULL, +/* c1da */ NULL, +/* c1db */ NULL, +/* c1dc */ NULL, +/* c1dd */ NULL, +/* c1de */ NULL, +/* c1df */ NULL, +/* c1e0 */ NULL, +/* c1e1 */ NULL, +/* c1e2 */ NULL, +/* c1e3 */ NULL, +/* c1e4 */ NULL, +/* c1e5 */ NULL, +/* c1e6 */ NULL, +/* c1e7 */ NULL, +/* c1e8 */ NULL, +/* c1e9 */ NULL, +/* c1ea */ NULL, +/* c1eb */ NULL, +/* c1ec */ NULL, +/* c1ed */ NULL, +/* c1ee */ NULL, +/* c1ef */ NULL, +/* c1f0 */ NULL, +/* c1f1 */ NULL, +/* c1f2 */ NULL, +/* c1f3 */ NULL, +/* c1f4 */ NULL, +/* c1f5 */ NULL, +/* c1f6 */ NULL, +/* c1f7 */ NULL, +/* c1f8 */ NULL, +/* c1f9 */ NULL, +/* c1fa */ NULL, +/* c1fb */ NULL, +/* c1fc */ NULL, +/* c1fd */ NULL, +/* c1fe */ NULL, +/* c1ff */ NULL, +/* c200 */ NULL, +/* c201 */ NULL, +/* c202 */ NULL, +/* c203 */ NULL, +/* c204 */ NULL, +/* c205 */ NULL, +/* c206 */ NULL, +/* c207 */ NULL, +/* c208 */ NULL, +/* c209 */ NULL, +/* c20a */ NULL, +/* c20b */ NULL, +/* c20c */ NULL, +/* c20d */ NULL, +/* c20e */ NULL, +/* c20f */ NULL, +/* c210 */ NULL, +/* c211 */ NULL, +/* c212 */ NULL, +/* c213 */ NULL, +/* c214 */ NULL, +/* c215 */ NULL, +/* c216 */ NULL, +/* c217 */ NULL, +/* c218 */ NULL, +/* c219 */ NULL, +/* c21a */ NULL, +/* c21b */ NULL, +/* c21c */ NULL, +/* c21d */ NULL, +/* c21e */ NULL, +/* c21f */ NULL, +/* c220 */ NULL, +/* c221 */ NULL, +/* c222 */ NULL, +/* c223 */ NULL, +/* c224 */ NULL, +/* c225 */ NULL, +/* c226 */ NULL, +/* c227 */ NULL, +/* c228 */ NULL, +/* c229 */ NULL, +/* c22a */ NULL, +/* c22b */ NULL, +/* c22c */ NULL, +/* c22d */ NULL, +/* c22e */ NULL, +/* c22f */ NULL, +/* c230 */ NULL, +/* c231 */ NULL, +/* c232 */ NULL, +/* c233 */ NULL, +/* c234 */ NULL, +/* c235 */ NULL, +/* c236 */ NULL, +/* c237 */ NULL, +/* c238 */ NULL, +/* c239 */ NULL, +/* c23a */ NULL, +/* c23b */ NULL, +/* c23c */ NULL, +/* c23d */ NULL, +/* c23e */ NULL, +/* c23f */ NULL, +/* c240 */ NULL, +/* c241 */ NULL, +/* c242 */ NULL, +/* c243 */ NULL, +/* c244 */ NULL, +/* c245 */ NULL, +/* c246 */ NULL, +/* c247 */ NULL, +/* c248 */ NULL, +/* c249 */ NULL, +/* c24a */ NULL, +/* c24b */ NULL, +/* c24c */ NULL, +/* c24d */ NULL, +/* c24e */ NULL, +/* c24f */ NULL, +/* c250 */ NULL, +/* c251 */ NULL, +/* c252 */ NULL, +/* c253 */ NULL, +/* c254 */ NULL, +/* c255 */ NULL, +/* c256 */ NULL, +/* c257 */ NULL, +/* c258 */ NULL, +/* c259 */ NULL, +/* c25a */ NULL, +/* c25b */ NULL, +/* c25c */ NULL, +/* c25d */ NULL, +/* c25e */ NULL, +/* c25f */ NULL, +/* c260 */ NULL, +/* c261 */ NULL, +/* c262 */ NULL, +/* c263 */ NULL, +/* c264 */ NULL, +/* c265 */ NULL, +/* c266 */ NULL, +/* c267 */ NULL, +/* c268 */ NULL, +/* c269 */ NULL, +/* c26a */ NULL, +/* c26b */ NULL, +/* c26c */ NULL, +/* c26d */ NULL, +/* c26e */ NULL, +/* c26f */ NULL, +/* c270 */ NULL, +/* c271 */ NULL, +/* c272 */ NULL, +/* c273 */ NULL, +/* c274 */ NULL, +/* c275 */ NULL, +/* c276 */ NULL, +/* c277 */ NULL, +/* c278 */ NULL, +/* c279 */ NULL, +/* c27a */ NULL, +/* c27b */ NULL, +/* c27c */ NULL, +/* c27d */ NULL, +/* c27e */ NULL, +/* c27f */ NULL, +/* c280 */ NULL, +/* c281 */ NULL, +/* c282 */ NULL, +/* c283 */ NULL, +/* c284 */ NULL, +/* c285 */ NULL, +/* c286 */ NULL, +/* c287 */ NULL, +/* c288 */ NULL, +/* c289 */ NULL, +/* c28a */ NULL, +/* c28b */ NULL, +/* c28c */ NULL, +/* c28d */ NULL, +/* c28e */ NULL, +/* c28f */ NULL, +/* c290 */ NULL, +/* c291 */ NULL, +/* c292 */ NULL, +/* c293 */ NULL, +/* c294 */ NULL, +/* c295 */ NULL, +/* c296 */ NULL, +/* c297 */ NULL, +/* c298 */ NULL, +/* c299 */ NULL, +/* c29a */ NULL, +/* c29b */ NULL, +/* c29c */ NULL, +/* c29d */ NULL, +/* c29e */ NULL, +/* c29f */ NULL, +/* c2a0 */ NULL, +/* c2a1 */ NULL, +/* c2a2 */ NULL, +/* c2a3 */ NULL, +/* c2a4 */ NULL, +/* c2a5 */ NULL, +/* c2a6 */ NULL, +/* c2a7 */ NULL, +/* c2a8 */ NULL, +/* c2a9 */ NULL, +/* c2aa */ NULL, +/* c2ab */ NULL, +/* c2ac */ NULL, +/* c2ad */ NULL, +/* c2ae */ NULL, +/* c2af */ NULL, +/* c2b0 */ NULL, +/* c2b1 */ NULL, +/* c2b2 */ NULL, +/* c2b3 */ NULL, +/* c2b4 */ NULL, +/* c2b5 */ NULL, +/* c2b6 */ NULL, +/* c2b7 */ NULL, +/* c2b8 */ NULL, +/* c2b9 */ NULL, +/* c2ba */ NULL, +/* c2bb */ NULL, +/* c2bc */ NULL, +/* c2bd */ NULL, +/* c2be */ NULL, +/* c2bf */ NULL, +/* c2c0 */ NULL, +/* c2c1 */ NULL, +/* c2c2 */ NULL, +/* c2c3 */ NULL, +/* c2c4 */ NULL, +/* c2c5 */ NULL, +/* c2c6 */ NULL, +/* c2c7 */ NULL, +/* c2c8 */ NULL, +/* c2c9 */ NULL, +/* c2ca */ NULL, +/* c2cb */ NULL, +/* c2cc */ NULL, +/* c2cd */ NULL, +/* c2ce */ NULL, +/* c2cf */ NULL, +/* c2d0 */ NULL, +/* c2d1 */ NULL, +/* c2d2 */ NULL, +/* c2d3 */ NULL, +/* c2d4 */ NULL, +/* c2d5 */ NULL, +/* c2d6 */ NULL, +/* c2d7 */ NULL, +/* c2d8 */ NULL, +/* c2d9 */ NULL, +/* c2da */ NULL, +/* c2db */ NULL, +/* c2dc */ NULL, +/* c2dd */ NULL, +/* c2de */ NULL, +/* c2df */ NULL, +/* c2e0 */ NULL, +/* c2e1 */ NULL, +/* c2e2 */ NULL, +/* c2e3 */ NULL, +/* c2e4 */ NULL, +/* c2e5 */ NULL, +/* c2e6 */ NULL, +/* c2e7 */ NULL, +/* c2e8 */ NULL, +/* c2e9 */ NULL, +/* c2ea */ NULL, +/* c2eb */ NULL, +/* c2ec */ NULL, +/* c2ed */ NULL, +/* c2ee */ NULL, +/* c2ef */ NULL, +/* c2f0 */ NULL, +/* c2f1 */ NULL, +/* c2f2 */ NULL, +/* c2f3 */ NULL, +/* c2f4 */ NULL, +/* c2f5 */ NULL, +/* c2f6 */ NULL, +/* c2f7 */ NULL, +/* c2f8 */ NULL, +/* c2f9 */ NULL, +/* c2fa */ NULL, +/* c2fb */ NULL, +/* c2fc */ NULL, +/* c2fd */ NULL, +/* c2fe */ NULL, +/* c2ff */ NULL, +/* c300 */ NULL, +/* c301 */ NULL, +/* c302 */ NULL, +/* c303 */ NULL, +/* c304 */ NULL, +/* c305 */ NULL, +/* c306 */ NULL, +/* c307 */ NULL, +/* c308 */ NULL, +/* c309 */ NULL, +/* c30a */ NULL, +/* c30b */ NULL, +/* c30c */ NULL, +/* c30d */ NULL, +/* c30e */ NULL, +/* c30f */ NULL, +/* c310 */ NULL, +/* c311 */ NULL, +/* c312 */ NULL, +/* c313 */ NULL, +/* c314 */ NULL, +/* c315 */ NULL, +/* c316 */ NULL, +/* c317 */ NULL, +/* c318 */ NULL, +/* c319 */ NULL, +/* c31a */ NULL, +/* c31b */ NULL, +/* c31c */ NULL, +/* c31d */ NULL, +/* c31e */ NULL, +/* c31f */ NULL, +/* c320 */ NULL, +/* c321 */ NULL, +/* c322 */ NULL, +/* c323 */ NULL, +/* c324 */ NULL, +/* c325 */ NULL, +/* c326 */ NULL, +/* c327 */ NULL, +/* c328 */ NULL, +/* c329 */ NULL, +/* c32a */ NULL, +/* c32b */ NULL, +/* c32c */ NULL, +/* c32d */ NULL, +/* c32e */ NULL, +/* c32f */ NULL, +/* c330 */ NULL, +/* c331 */ NULL, +/* c332 */ NULL, +/* c333 */ NULL, +/* c334 */ NULL, +/* c335 */ NULL, +/* c336 */ NULL, +/* c337 */ NULL, +/* c338 */ NULL, +/* c339 */ NULL, +/* c33a */ NULL, +/* c33b */ NULL, +/* c33c */ NULL, +/* c33d */ NULL, +/* c33e */ NULL, +/* c33f */ NULL, +/* c340 */ NULL, +/* c341 */ NULL, +/* c342 */ NULL, +/* c343 */ NULL, +/* c344 */ NULL, +/* c345 */ NULL, +/* c346 */ NULL, +/* c347 */ NULL, +/* c348 */ NULL, +/* c349 */ NULL, +/* c34a */ NULL, +/* c34b */ NULL, +/* c34c */ NULL, +/* c34d */ NULL, +/* c34e */ NULL, +/* c34f */ NULL, +/* c350 */ NULL, +/* c351 */ NULL, +/* c352 */ NULL, +/* c353 */ NULL, +/* c354 */ NULL, +/* c355 */ NULL, +/* c356 */ NULL, +/* c357 */ NULL, +/* c358 */ NULL, +/* c359 */ NULL, +/* c35a */ NULL, +/* c35b */ NULL, +/* c35c */ NULL, +/* c35d */ NULL, +/* c35e */ NULL, +/* c35f */ NULL, +/* c360 */ NULL, +/* c361 */ NULL, +/* c362 */ NULL, +/* c363 */ NULL, +/* c364 */ NULL, +/* c365 */ NULL, +/* c366 */ NULL, +/* c367 */ NULL, +/* c368 */ NULL, +/* c369 */ NULL, +/* c36a */ NULL, +/* c36b */ NULL, +/* c36c */ NULL, +/* c36d */ NULL, +/* c36e */ NULL, +/* c36f */ NULL, +/* c370 */ NULL, +/* c371 */ NULL, +/* c372 */ NULL, +/* c373 */ NULL, +/* c374 */ NULL, +/* c375 */ NULL, +/* c376 */ NULL, +/* c377 */ NULL, +/* c378 */ NULL, +/* c379 */ NULL, +/* c37a */ NULL, +/* c37b */ NULL, +/* c37c */ NULL, +/* c37d */ NULL, +/* c37e */ NULL, +/* c37f */ NULL, +/* c380 */ NULL, +/* c381 */ NULL, +/* c382 */ NULL, +/* c383 */ NULL, +/* c384 */ NULL, +/* c385 */ NULL, +/* c386 */ NULL, +/* c387 */ NULL, +/* c388 */ NULL, +/* c389 */ NULL, +/* c38a */ NULL, +/* c38b */ NULL, +/* c38c */ NULL, +/* c38d */ NULL, +/* c38e */ NULL, +/* c38f */ NULL, +/* c390 */ NULL, +/* c391 */ NULL, +/* c392 */ NULL, +/* c393 */ NULL, +/* c394 */ NULL, +/* c395 */ NULL, +/* c396 */ NULL, +/* c397 */ NULL, +/* c398 */ NULL, +/* c399 */ NULL, +/* c39a */ NULL, +/* c39b */ NULL, +/* c39c */ NULL, +/* c39d */ NULL, +/* c39e */ NULL, +/* c39f */ NULL, +/* c3a0 */ NULL, +/* c3a1 */ NULL, +/* c3a2 */ NULL, +/* c3a3 */ NULL, +/* c3a4 */ NULL, +/* c3a5 */ NULL, +/* c3a6 */ NULL, +/* c3a7 */ NULL, +/* c3a8 */ NULL, +/* c3a9 */ NULL, +/* c3aa */ NULL, +/* c3ab */ NULL, +/* c3ac */ NULL, +/* c3ad */ NULL, +/* c3ae */ NULL, +/* c3af */ NULL, +/* c3b0 */ NULL, +/* c3b1 */ NULL, +/* c3b2 */ NULL, +/* c3b3 */ NULL, +/* c3b4 */ NULL, +/* c3b5 */ NULL, +/* c3b6 */ NULL, +/* c3b7 */ NULL, +/* c3b8 */ NULL, +/* c3b9 */ NULL, +/* c3ba */ NULL, +/* c3bb */ NULL, +/* c3bc */ NULL, +/* c3bd */ NULL, +/* c3be */ NULL, +/* c3bf */ NULL, +/* c3c0 */ NULL, +/* c3c1 */ NULL, +/* c3c2 */ NULL, +/* c3c3 */ NULL, +/* c3c4 */ NULL, +/* c3c5 */ NULL, +/* c3c6 */ NULL, +/* c3c7 */ NULL, +/* c3c8 */ NULL, +/* c3c9 */ NULL, +/* c3ca */ NULL, +/* c3cb */ NULL, +/* c3cc */ NULL, +/* c3cd */ NULL, +/* c3ce */ NULL, +/* c3cf */ NULL, +/* c3d0 */ NULL, +/* c3d1 */ NULL, +/* c3d2 */ NULL, +/* c3d3 */ NULL, +/* c3d4 */ NULL, +/* c3d5 */ NULL, +/* c3d6 */ NULL, +/* c3d7 */ NULL, +/* c3d8 */ NULL, +/* c3d9 */ NULL, +/* c3da */ NULL, +/* c3db */ NULL, +/* c3dc */ NULL, +/* c3dd */ NULL, +/* c3de */ NULL, +/* c3df */ NULL, +/* c3e0 */ NULL, +/* c3e1 */ NULL, +/* c3e2 */ NULL, +/* c3e3 */ NULL, +/* c3e4 */ NULL, +/* c3e5 */ NULL, +/* c3e6 */ NULL, +/* c3e7 */ NULL, +/* c3e8 */ NULL, +/* c3e9 */ NULL, +/* c3ea */ NULL, +/* c3eb */ NULL, +/* c3ec */ NULL, +/* c3ed */ NULL, +/* c3ee */ NULL, +/* c3ef */ NULL, +/* c3f0 */ NULL, +/* c3f1 */ NULL, +/* c3f2 */ NULL, +/* c3f3 */ NULL, +/* c3f4 */ NULL, +/* c3f5 */ NULL, +/* c3f6 */ NULL, +/* c3f7 */ NULL, +/* c3f8 */ NULL, +/* c3f9 */ NULL, +/* c3fa */ NULL, +/* c3fb */ NULL, +/* c3fc */ NULL, +/* c3fd */ NULL, +/* c3fe */ NULL, +/* c3ff */ NULL, +/* c400 */ NULL, +/* c401 */ NULL, +/* c402 */ NULL, +/* c403 */ NULL, +/* c404 */ NULL, +/* c405 */ NULL, +/* c406 */ NULL, +/* c407 */ NULL, +/* c408 */ NULL, +/* c409 */ NULL, +/* c40a */ NULL, +/* c40b */ NULL, +/* c40c */ NULL, +/* c40d */ NULL, +/* c40e */ NULL, +/* c40f */ NULL, +/* c410 */ NULL, +/* c411 */ NULL, +/* c412 */ NULL, +/* c413 */ NULL, +/* c414 */ NULL, +/* c415 */ NULL, +/* c416 */ NULL, +/* c417 */ NULL, +/* c418 */ NULL, +/* c419 */ NULL, +/* c41a */ NULL, +/* c41b */ NULL, +/* c41c */ NULL, +/* c41d */ NULL, +/* c41e */ NULL, +/* c41f */ NULL, +/* c420 */ NULL, +/* c421 */ NULL, +/* c422 */ NULL, +/* c423 */ NULL, +/* c424 */ NULL, +/* c425 */ NULL, +/* c426 */ NULL, +/* c427 */ NULL, +/* c428 */ NULL, +/* c429 */ NULL, +/* c42a */ NULL, +/* c42b */ NULL, +/* c42c */ NULL, +/* c42d */ NULL, +/* c42e */ NULL, +/* c42f */ NULL, +/* c430 */ NULL, +/* c431 */ NULL, +/* c432 */ NULL, +/* c433 */ NULL, +/* c434 */ NULL, +/* c435 */ NULL, +/* c436 */ NULL, +/* c437 */ NULL, +/* c438 */ NULL, +/* c439 */ NULL, +/* c43a */ NULL, +/* c43b */ NULL, +/* c43c */ NULL, +/* c43d */ NULL, +/* c43e */ NULL, +/* c43f */ NULL, +/* c440 */ NULL, +/* c441 */ NULL, +/* c442 */ NULL, +/* c443 */ NULL, +/* c444 */ NULL, +/* c445 */ NULL, +/* c446 */ NULL, +/* c447 */ NULL, +/* c448 */ NULL, +/* c449 */ NULL, +/* c44a */ NULL, +/* c44b */ NULL, +/* c44c */ NULL, +/* c44d */ NULL, +/* c44e */ NULL, +/* c44f */ NULL, +/* c450 */ NULL, +/* c451 */ NULL, +/* c452 */ NULL, +/* c453 */ NULL, +/* c454 */ NULL, +/* c455 */ NULL, +/* c456 */ NULL, +/* c457 */ NULL, +/* c458 */ NULL, +/* c459 */ NULL, +/* c45a */ NULL, +/* c45b */ NULL, +/* c45c */ NULL, +/* c45d */ NULL, +/* c45e */ NULL, +/* c45f */ NULL, +/* c460 */ NULL, +/* c461 */ NULL, +/* c462 */ NULL, +/* c463 */ NULL, +/* c464 */ NULL, +/* c465 */ NULL, +/* c466 */ NULL, +/* c467 */ NULL, +/* c468 */ NULL, +/* c469 */ NULL, +/* c46a */ NULL, +/* c46b */ NULL, +/* c46c */ NULL, +/* c46d */ NULL, +/* c46e */ NULL, +/* c46f */ NULL, +/* c470 */ NULL, +/* c471 */ NULL, +/* c472 */ NULL, +/* c473 */ NULL, +/* c474 */ NULL, +/* c475 */ NULL, +/* c476 */ NULL, +/* c477 */ NULL, +/* c478 */ NULL, +/* c479 */ NULL, +/* c47a */ NULL, +/* c47b */ NULL, +/* c47c */ NULL, +/* c47d */ NULL, +/* c47e */ NULL, +/* c47f */ NULL, +/* c480 */ NULL, +/* c481 */ NULL, +/* c482 */ NULL, +/* c483 */ NULL, +/* c484 */ NULL, +/* c485 */ NULL, +/* c486 */ NULL, +/* c487 */ NULL, +/* c488 */ NULL, +/* c489 */ NULL, +/* c48a */ NULL, +/* c48b */ NULL, +/* c48c */ NULL, +/* c48d */ NULL, +/* c48e */ NULL, +/* c48f */ NULL, +/* c490 */ NULL, +/* c491 */ NULL, +/* c492 */ NULL, +/* c493 */ NULL, +/* c494 */ NULL, +/* c495 */ NULL, +/* c496 */ NULL, +/* c497 */ NULL, +/* c498 */ NULL, +/* c499 */ NULL, +/* c49a */ NULL, +/* c49b */ NULL, +/* c49c */ NULL, +/* c49d */ NULL, +/* c49e */ NULL, +/* c49f */ NULL, +/* c4a0 */ NULL, +/* c4a1 */ NULL, +/* c4a2 */ NULL, +/* c4a3 */ NULL, +/* c4a4 */ NULL, +/* c4a5 */ NULL, +/* c4a6 */ NULL, +/* c4a7 */ NULL, +/* c4a8 */ NULL, +/* c4a9 */ NULL, +/* c4aa */ NULL, +/* c4ab */ NULL, +/* c4ac */ NULL, +/* c4ad */ NULL, +/* c4ae */ NULL, +/* c4af */ NULL, +/* c4b0 */ NULL, +/* c4b1 */ NULL, +/* c4b2 */ NULL, +/* c4b3 */ NULL, +/* c4b4 */ NULL, +/* c4b5 */ NULL, +/* c4b6 */ NULL, +/* c4b7 */ NULL, +/* c4b8 */ NULL, +/* c4b9 */ NULL, +/* c4ba */ NULL, +/* c4bb */ NULL, +/* c4bc */ NULL, +/* c4bd */ NULL, +/* c4be */ NULL, +/* c4bf */ NULL, +/* c4c0 */ NULL, +/* c4c1 */ NULL, +/* c4c2 */ NULL, +/* c4c3 */ NULL, +/* c4c4 */ NULL, +/* c4c5 */ NULL, +/* c4c6 */ NULL, +/* c4c7 */ NULL, +/* c4c8 */ NULL, +/* c4c9 */ NULL, +/* c4ca */ NULL, +/* c4cb */ NULL, +/* c4cc */ NULL, +/* c4cd */ NULL, +/* c4ce */ NULL, +/* c4cf */ NULL, +/* c4d0 */ NULL, +/* c4d1 */ NULL, +/* c4d2 */ NULL, +/* c4d3 */ NULL, +/* c4d4 */ NULL, +/* c4d5 */ NULL, +/* c4d6 */ NULL, +/* c4d7 */ NULL, +/* c4d8 */ NULL, +/* c4d9 */ NULL, +/* c4da */ NULL, +/* c4db */ NULL, +/* c4dc */ NULL, +/* c4dd */ NULL, +/* c4de */ NULL, +/* c4df */ NULL, +/* c4e0 */ NULL, +/* c4e1 */ NULL, +/* c4e2 */ NULL, +/* c4e3 */ NULL, +/* c4e4 */ NULL, +/* c4e5 */ NULL, +/* c4e6 */ NULL, +/* c4e7 */ NULL, +/* c4e8 */ NULL, +/* c4e9 */ NULL, +/* c4ea */ NULL, +/* c4eb */ NULL, +/* c4ec */ NULL, +/* c4ed */ NULL, +/* c4ee */ NULL, +/* c4ef */ NULL, +/* c4f0 */ NULL, +/* c4f1 */ NULL, +/* c4f2 */ NULL, +/* c4f3 */ NULL, +/* c4f4 */ NULL, +/* c4f5 */ NULL, +/* c4f6 */ NULL, +/* c4f7 */ NULL, +/* c4f8 */ NULL, +/* c4f9 */ NULL, +/* c4fa */ NULL, +/* c4fb */ NULL, +/* c4fc */ NULL, +/* c4fd */ NULL, +/* c4fe */ NULL, +/* c4ff */ NULL, +/* c500 */ NULL, +/* c501 */ NULL, +/* c502 */ NULL, +/* c503 */ NULL, +/* c504 */ NULL, +/* c505 */ NULL, +/* c506 */ NULL, +/* c507 */ NULL, +/* c508 */ NULL, +/* c509 */ NULL, +/* c50a */ NULL, +/* c50b */ NULL, +/* c50c */ NULL, +/* c50d */ NULL, +/* c50e */ NULL, +/* c50f */ NULL, +/* c510 */ NULL, +/* c511 */ NULL, +/* c512 */ NULL, +/* c513 */ NULL, +/* c514 */ NULL, +/* c515 */ NULL, +/* c516 */ NULL, +/* c517 */ NULL, +/* c518 */ NULL, +/* c519 */ NULL, +/* c51a */ NULL, +/* c51b */ NULL, +/* c51c */ NULL, +/* c51d */ NULL, +/* c51e */ NULL, +/* c51f */ NULL, +/* c520 */ NULL, +/* c521 */ NULL, +/* c522 */ NULL, +/* c523 */ NULL, +/* c524 */ NULL, +/* c525 */ NULL, +/* c526 */ NULL, +/* c527 */ NULL, +/* c528 */ NULL, +/* c529 */ NULL, +/* c52a */ NULL, +/* c52b */ NULL, +/* c52c */ NULL, +/* c52d */ NULL, +/* c52e */ NULL, +/* c52f */ NULL, +/* c530 */ NULL, +/* c531 */ NULL, +/* c532 */ NULL, +/* c533 */ NULL, +/* c534 */ NULL, +/* c535 */ NULL, +/* c536 */ NULL, +/* c537 */ NULL, +/* c538 */ NULL, +/* c539 */ NULL, +/* c53a */ NULL, +/* c53b */ NULL, +/* c53c */ NULL, +/* c53d */ NULL, +/* c53e */ NULL, +/* c53f */ NULL, +/* c540 */ NULL, +/* c541 */ NULL, +/* c542 */ NULL, +/* c543 */ NULL, +/* c544 */ NULL, +/* c545 */ NULL, +/* c546 */ NULL, +/* c547 */ NULL, +/* c548 */ NULL, +/* c549 */ NULL, +/* c54a */ NULL, +/* c54b */ NULL, +/* c54c */ NULL, +/* c54d */ NULL, +/* c54e */ NULL, +/* c54f */ NULL, +/* c550 */ NULL, +/* c551 */ NULL, +/* c552 */ NULL, +/* c553 */ NULL, +/* c554 */ NULL, +/* c555 */ NULL, +/* c556 */ NULL, +/* c557 */ NULL, +/* c558 */ NULL, +/* c559 */ NULL, +/* c55a */ NULL, +/* c55b */ NULL, +/* c55c */ NULL, +/* c55d */ NULL, +/* c55e */ NULL, +/* c55f */ NULL, +/* c560 */ NULL, +/* c561 */ NULL, +/* c562 */ NULL, +/* c563 */ NULL, +/* c564 */ NULL, +/* c565 */ NULL, +/* c566 */ NULL, +/* c567 */ NULL, +/* c568 */ NULL, +/* c569 */ NULL, +/* c56a */ NULL, +/* c56b */ NULL, +/* c56c */ NULL, +/* c56d */ NULL, +/* c56e */ NULL, +/* c56f */ NULL, +/* c570 */ NULL, +/* c571 */ NULL, +/* c572 */ NULL, +/* c573 */ NULL, +/* c574 */ NULL, +/* c575 */ NULL, +/* c576 */ NULL, +/* c577 */ NULL, +/* c578 */ NULL, +/* c579 */ NULL, +/* c57a */ NULL, +/* c57b */ NULL, +/* c57c */ NULL, +/* c57d */ NULL, +/* c57e */ NULL, +/* c57f */ NULL, +/* c580 */ NULL, +/* c581 */ NULL, +/* c582 */ NULL, +/* c583 */ NULL, +/* c584 */ NULL, +/* c585 */ NULL, +/* c586 */ NULL, +/* c587 */ NULL, +/* c588 */ NULL, +/* c589 */ NULL, +/* c58a */ NULL, +/* c58b */ NULL, +/* c58c */ NULL, +/* c58d */ NULL, +/* c58e */ NULL, +/* c58f */ NULL, +/* c590 */ NULL, +/* c591 */ NULL, +/* c592 */ NULL, +/* c593 */ NULL, +/* c594 */ NULL, +/* c595 */ NULL, +/* c596 */ NULL, +/* c597 */ NULL, +/* c598 */ NULL, +/* c599 */ NULL, +/* c59a */ NULL, +/* c59b */ NULL, +/* c59c */ NULL, +/* c59d */ NULL, +/* c59e */ NULL, +/* c59f */ NULL, +/* c5a0 */ NULL, +/* c5a1 */ NULL, +/* c5a2 */ NULL, +/* c5a3 */ NULL, +/* c5a4 */ NULL, +/* c5a5 */ NULL, +/* c5a6 */ NULL, +/* c5a7 */ NULL, +/* c5a8 */ NULL, +/* c5a9 */ NULL, +/* c5aa */ NULL, +/* c5ab */ NULL, +/* c5ac */ NULL, +/* c5ad */ NULL, +/* c5ae */ NULL, +/* c5af */ NULL, +/* c5b0 */ NULL, +/* c5b1 */ NULL, +/* c5b2 */ NULL, +/* c5b3 */ NULL, +/* c5b4 */ NULL, +/* c5b5 */ NULL, +/* c5b6 */ NULL, +/* c5b7 */ NULL, +/* c5b8 */ NULL, +/* c5b9 */ NULL, +/* c5ba */ NULL, +/* c5bb */ NULL, +/* c5bc */ NULL, +/* c5bd */ NULL, +/* c5be */ NULL, +/* c5bf */ NULL, +/* c5c0 */ NULL, +/* c5c1 */ NULL, +/* c5c2 */ NULL, +/* c5c3 */ NULL, +/* c5c4 */ NULL, +/* c5c5 */ NULL, +/* c5c6 */ NULL, +/* c5c7 */ NULL, +/* c5c8 */ NULL, +/* c5c9 */ NULL, +/* c5ca */ NULL, +/* c5cb */ NULL, +/* c5cc */ NULL, +/* c5cd */ NULL, +/* c5ce */ NULL, +/* c5cf */ NULL, +/* c5d0 */ NULL, +/* c5d1 */ NULL, +/* c5d2 */ NULL, +/* c5d3 */ NULL, +/* c5d4 */ NULL, +/* c5d5 */ NULL, +/* c5d6 */ NULL, +/* c5d7 */ NULL, +/* c5d8 */ NULL, +/* c5d9 */ NULL, +/* c5da */ NULL, +/* c5db */ NULL, +/* c5dc */ NULL, +/* c5dd */ NULL, +/* c5de */ NULL, +/* c5df */ NULL, +/* c5e0 */ NULL, +/* c5e1 */ NULL, +/* c5e2 */ NULL, +/* c5e3 */ NULL, +/* c5e4 */ NULL, +/* c5e5 */ NULL, +/* c5e6 */ NULL, +/* c5e7 */ NULL, +/* c5e8 */ NULL, +/* c5e9 */ NULL, +/* c5ea */ NULL, +/* c5eb */ NULL, +/* c5ec */ NULL, +/* c5ed */ NULL, +/* c5ee */ NULL, +/* c5ef */ NULL, +/* c5f0 */ NULL, +/* c5f1 */ NULL, +/* c5f2 */ NULL, +/* c5f3 */ NULL, +/* c5f4 */ NULL, +/* c5f5 */ NULL, +/* c5f6 */ NULL, +/* c5f7 */ NULL, +/* c5f8 */ NULL, +/* c5f9 */ NULL, +/* c5fa */ NULL, +/* c5fb */ NULL, +/* c5fc */ NULL, +/* c5fd */ NULL, +/* c5fe */ NULL, +/* c5ff */ NULL, +/* c600 */ NULL, +/* c601 */ NULL, +/* c602 */ NULL, +/* c603 */ NULL, +/* c604 */ NULL, +/* c605 */ NULL, +/* c606 */ NULL, +/* c607 */ NULL, +/* c608 */ NULL, +/* c609 */ NULL, +/* c60a */ NULL, +/* c60b */ NULL, +/* c60c */ NULL, +/* c60d */ NULL, +/* c60e */ NULL, +/* c60f */ NULL, +/* c610 */ NULL, +/* c611 */ NULL, +/* c612 */ NULL, +/* c613 */ NULL, +/* c614 */ NULL, +/* c615 */ NULL, +/* c616 */ NULL, +/* c617 */ NULL, +/* c618 */ NULL, +/* c619 */ NULL, +/* c61a */ NULL, +/* c61b */ NULL, +/* c61c */ NULL, +/* c61d */ NULL, +/* c61e */ NULL, +/* c61f */ NULL, +/* c620 */ NULL, +/* c621 */ NULL, +/* c622 */ NULL, +/* c623 */ NULL, +/* c624 */ NULL, +/* c625 */ NULL, +/* c626 */ NULL, +/* c627 */ NULL, +/* c628 */ NULL, +/* c629 */ NULL, +/* c62a */ NULL, +/* c62b */ NULL, +/* c62c */ NULL, +/* c62d */ NULL, +/* c62e */ NULL, +/* c62f */ NULL, +/* c630 */ NULL, +/* c631 */ NULL, +/* c632 */ NULL, +/* c633 */ NULL, +/* c634 */ NULL, +/* c635 */ NULL, +/* c636 */ NULL, +/* c637 */ NULL, +/* c638 */ NULL, +/* c639 */ NULL, +/* c63a */ NULL, +/* c63b */ NULL, +/* c63c */ NULL, +/* c63d */ NULL, +/* c63e */ NULL, +/* c63f */ NULL, +/* c640 */ NULL, +/* c641 */ NULL, +/* c642 */ NULL, +/* c643 */ NULL, +/* c644 */ NULL, +/* c645 */ NULL, +/* c646 */ NULL, +/* c647 */ NULL, +/* c648 */ NULL, +/* c649 */ NULL, +/* c64a */ NULL, +/* c64b */ NULL, +/* c64c */ NULL, +/* c64d */ NULL, +/* c64e */ NULL, +/* c64f */ NULL, +/* c650 */ NULL, +/* c651 */ NULL, +/* c652 */ NULL, +/* c653 */ NULL, +/* c654 */ NULL, +/* c655 */ NULL, +/* c656 */ NULL, +/* c657 */ NULL, +/* c658 */ NULL, +/* c659 */ NULL, +/* c65a */ NULL, +/* c65b */ NULL, +/* c65c */ NULL, +/* c65d */ NULL, +/* c65e */ NULL, +/* c65f */ NULL, +/* c660 */ NULL, +/* c661 */ NULL, +/* c662 */ NULL, +/* c663 */ NULL, +/* c664 */ NULL, +/* c665 */ NULL, +/* c666 */ NULL, +/* c667 */ NULL, +/* c668 */ NULL, +/* c669 */ NULL, +/* c66a */ NULL, +/* c66b */ NULL, +/* c66c */ NULL, +/* c66d */ NULL, +/* c66e */ NULL, +/* c66f */ NULL, +/* c670 */ NULL, +/* c671 */ NULL, +/* c672 */ NULL, +/* c673 */ NULL, +/* c674 */ NULL, +/* c675 */ NULL, +/* c676 */ NULL, +/* c677 */ NULL, +/* c678 */ NULL, +/* c679 */ NULL, +/* c67a */ NULL, +/* c67b */ NULL, +/* c67c */ NULL, +/* c67d */ NULL, +/* c67e */ NULL, +/* c67f */ NULL, +/* c680 */ NULL, +/* c681 */ NULL, +/* c682 */ NULL, +/* c683 */ NULL, +/* c684 */ NULL, +/* c685 */ NULL, +/* c686 */ NULL, +/* c687 */ NULL, +/* c688 */ NULL, +/* c689 */ NULL, +/* c68a */ NULL, +/* c68b */ NULL, +/* c68c */ NULL, +/* c68d */ NULL, +/* c68e */ NULL, +/* c68f */ NULL, +/* c690 */ NULL, +/* c691 */ NULL, +/* c692 */ NULL, +/* c693 */ NULL, +/* c694 */ NULL, +/* c695 */ NULL, +/* c696 */ NULL, +/* c697 */ NULL, +/* c698 */ NULL, +/* c699 */ NULL, +/* c69a */ NULL, +/* c69b */ NULL, +/* c69c */ NULL, +/* c69d */ NULL, +/* c69e */ NULL, +/* c69f */ NULL, +/* c6a0 */ NULL, +/* c6a1 */ NULL, +/* c6a2 */ NULL, +/* c6a3 */ NULL, +/* c6a4 */ NULL, +/* c6a5 */ NULL, +/* c6a6 */ NULL, +/* c6a7 */ NULL, +/* c6a8 */ NULL, +/* c6a9 */ NULL, +/* c6aa */ NULL, +/* c6ab */ NULL, +/* c6ac */ NULL, +/* c6ad */ NULL, +/* c6ae */ NULL, +/* c6af */ NULL, +/* c6b0 */ NULL, +/* c6b1 */ NULL, +/* c6b2 */ NULL, +/* c6b3 */ NULL, +/* c6b4 */ NULL, +/* c6b5 */ NULL, +/* c6b6 */ NULL, +/* c6b7 */ NULL, +/* c6b8 */ NULL, +/* c6b9 */ NULL, +/* c6ba */ NULL, +/* c6bb */ NULL, +/* c6bc */ NULL, +/* c6bd */ NULL, +/* c6be */ NULL, +/* c6bf */ NULL, +/* c6c0 */ NULL, +/* c6c1 */ NULL, +/* c6c2 */ NULL, +/* c6c3 */ NULL, +/* c6c4 */ NULL, +/* c6c5 */ NULL, +/* c6c6 */ NULL, +/* c6c7 */ NULL, +/* c6c8 */ NULL, +/* c6c9 */ NULL, +/* c6ca */ NULL, +/* c6cb */ NULL, +/* c6cc */ NULL, +/* c6cd */ NULL, +/* c6ce */ NULL, +/* c6cf */ NULL, +/* c6d0 */ NULL, +/* c6d1 */ NULL, +/* c6d2 */ NULL, +/* c6d3 */ NULL, +/* c6d4 */ NULL, +/* c6d5 */ NULL, +/* c6d6 */ NULL, +/* c6d7 */ NULL, +/* c6d8 */ NULL, +/* c6d9 */ NULL, +/* c6da */ NULL, +/* c6db */ NULL, +/* c6dc */ NULL, +/* c6dd */ NULL, +/* c6de */ NULL, +/* c6df */ NULL, +/* c6e0 */ NULL, +/* c6e1 */ NULL, +/* c6e2 */ NULL, +/* c6e3 */ NULL, +/* c6e4 */ NULL, +/* c6e5 */ NULL, +/* c6e6 */ NULL, +/* c6e7 */ NULL, +/* c6e8 */ NULL, +/* c6e9 */ NULL, +/* c6ea */ NULL, +/* c6eb */ NULL, +/* c6ec */ NULL, +/* c6ed */ NULL, +/* c6ee */ NULL, +/* c6ef */ NULL, +/* c6f0 */ NULL, +/* c6f1 */ NULL, +/* c6f2 */ NULL, +/* c6f3 */ NULL, +/* c6f4 */ NULL, +/* c6f5 */ NULL, +/* c6f6 */ NULL, +/* c6f7 */ NULL, +/* c6f8 */ NULL, +/* c6f9 */ NULL, +/* c6fa */ NULL, +/* c6fb */ NULL, +/* c6fc */ NULL, +/* c6fd */ NULL, +/* c6fe */ NULL, +/* c6ff */ NULL, +/* c700 */ NULL, +/* c701 */ NULL, +/* c702 */ NULL, +/* c703 */ NULL, +/* c704 */ NULL, +/* c705 */ NULL, +/* c706 */ NULL, +/* c707 */ NULL, +/* c708 */ NULL, +/* c709 */ NULL, +/* c70a */ NULL, +/* c70b */ NULL, +/* c70c */ NULL, +/* c70d */ NULL, +/* c70e */ NULL, +/* c70f */ NULL, +/* c710 */ NULL, +/* c711 */ NULL, +/* c712 */ NULL, +/* c713 */ NULL, +/* c714 */ NULL, +/* c715 */ NULL, +/* c716 */ NULL, +/* c717 */ NULL, +/* c718 */ NULL, +/* c719 */ NULL, +/* c71a */ NULL, +/* c71b */ NULL, +/* c71c */ NULL, +/* c71d */ NULL, +/* c71e */ NULL, +/* c71f */ NULL, +/* c720 */ NULL, +/* c721 */ NULL, +/* c722 */ NULL, +/* c723 */ NULL, +/* c724 */ NULL, +/* c725 */ NULL, +/* c726 */ NULL, +/* c727 */ NULL, +/* c728 */ NULL, +/* c729 */ NULL, +/* c72a */ NULL, +/* c72b */ NULL, +/* c72c */ NULL, +/* c72d */ NULL, +/* c72e */ NULL, +/* c72f */ NULL, +/* c730 */ NULL, +/* c731 */ NULL, +/* c732 */ NULL, +/* c733 */ NULL, +/* c734 */ NULL, +/* c735 */ NULL, +/* c736 */ NULL, +/* c737 */ NULL, +/* c738 */ NULL, +/* c739 */ NULL, +/* c73a */ NULL, +/* c73b */ NULL, +/* c73c */ NULL, +/* c73d */ NULL, +/* c73e */ NULL, +/* c73f */ NULL, +/* c740 */ NULL, +/* c741 */ NULL, +/* c742 */ NULL, +/* c743 */ NULL, +/* c744 */ NULL, +/* c745 */ NULL, +/* c746 */ NULL, +/* c747 */ NULL, +/* c748 */ NULL, +/* c749 */ NULL, +/* c74a */ NULL, +/* c74b */ NULL, +/* c74c */ NULL, +/* c74d */ NULL, +/* c74e */ NULL, +/* c74f */ NULL, +/* c750 */ NULL, +/* c751 */ NULL, +/* c752 */ NULL, +/* c753 */ NULL, +/* c754 */ NULL, +/* c755 */ NULL, +/* c756 */ NULL, +/* c757 */ NULL, +/* c758 */ NULL, +/* c759 */ NULL, +/* c75a */ NULL, +/* c75b */ NULL, +/* c75c */ NULL, +/* c75d */ NULL, +/* c75e */ NULL, +/* c75f */ NULL, +/* c760 */ NULL, +/* c761 */ NULL, +/* c762 */ NULL, +/* c763 */ NULL, +/* c764 */ NULL, +/* c765 */ NULL, +/* c766 */ NULL, +/* c767 */ NULL, +/* c768 */ NULL, +/* c769 */ NULL, +/* c76a */ NULL, +/* c76b */ NULL, +/* c76c */ NULL, +/* c76d */ NULL, +/* c76e */ NULL, +/* c76f */ NULL, +/* c770 */ NULL, +/* c771 */ NULL, +/* c772 */ NULL, +/* c773 */ NULL, +/* c774 */ NULL, +/* c775 */ NULL, +/* c776 */ NULL, +/* c777 */ NULL, +/* c778 */ NULL, +/* c779 */ NULL, +/* c77a */ NULL, +/* c77b */ NULL, +/* c77c */ NULL, +/* c77d */ NULL, +/* c77e */ NULL, +/* c77f */ NULL, +/* c780 */ NULL, +/* c781 */ NULL, +/* c782 */ NULL, +/* c783 */ NULL, +/* c784 */ NULL, +/* c785 */ NULL, +/* c786 */ NULL, +/* c787 */ NULL, +/* c788 */ NULL, +/* c789 */ NULL, +/* c78a */ NULL, +/* c78b */ NULL, +/* c78c */ NULL, +/* c78d */ NULL, +/* c78e */ NULL, +/* c78f */ NULL, +/* c790 */ NULL, +/* c791 */ NULL, +/* c792 */ NULL, +/* c793 */ NULL, +/* c794 */ NULL, +/* c795 */ NULL, +/* c796 */ NULL, +/* c797 */ NULL, +/* c798 */ NULL, +/* c799 */ NULL, +/* c79a */ NULL, +/* c79b */ NULL, +/* c79c */ NULL, +/* c79d */ NULL, +/* c79e */ NULL, +/* c79f */ NULL, +/* c7a0 */ NULL, +/* c7a1 */ NULL, +/* c7a2 */ NULL, +/* c7a3 */ NULL, +/* c7a4 */ NULL, +/* c7a5 */ NULL, +/* c7a6 */ NULL, +/* c7a7 */ NULL, +/* c7a8 */ NULL, +/* c7a9 */ NULL, +/* c7aa */ NULL, +/* c7ab */ NULL, +/* c7ac */ NULL, +/* c7ad */ NULL, +/* c7ae */ NULL, +/* c7af */ NULL, +/* c7b0 */ NULL, +/* c7b1 */ NULL, +/* c7b2 */ NULL, +/* c7b3 */ NULL, +/* c7b4 */ NULL, +/* c7b5 */ NULL, +/* c7b6 */ NULL, +/* c7b7 */ NULL, +/* c7b8 */ NULL, +/* c7b9 */ NULL, +/* c7ba */ NULL, +/* c7bb */ NULL, +/* c7bc */ NULL, +/* c7bd */ NULL, +/* c7be */ NULL, +/* c7bf */ NULL, +/* c7c0 */ NULL, +/* c7c1 */ NULL, +/* c7c2 */ NULL, +/* c7c3 */ NULL, +/* c7c4 */ NULL, +/* c7c5 */ NULL, +/* c7c6 */ NULL, +/* c7c7 */ NULL, +/* c7c8 */ NULL, +/* c7c9 */ NULL, +/* c7ca */ NULL, +/* c7cb */ NULL, +/* c7cc */ NULL, +/* c7cd */ NULL, +/* c7ce */ NULL, +/* c7cf */ NULL, +/* c7d0 */ NULL, +/* c7d1 */ NULL, +/* c7d2 */ NULL, +/* c7d3 */ NULL, +/* c7d4 */ NULL, +/* c7d5 */ NULL, +/* c7d6 */ NULL, +/* c7d7 */ NULL, +/* c7d8 */ NULL, +/* c7d9 */ NULL, +/* c7da */ NULL, +/* c7db */ NULL, +/* c7dc */ NULL, +/* c7dd */ NULL, +/* c7de */ NULL, +/* c7df */ NULL, +/* c7e0 */ NULL, +/* c7e1 */ NULL, +/* c7e2 */ NULL, +/* c7e3 */ NULL, +/* c7e4 */ NULL, +/* c7e5 */ NULL, +/* c7e6 */ NULL, +/* c7e7 */ NULL, +/* c7e8 */ NULL, +/* c7e9 */ NULL, +/* c7ea */ NULL, +/* c7eb */ NULL, +/* c7ec */ NULL, +/* c7ed */ NULL, +/* c7ee */ NULL, +/* c7ef */ NULL, +/* c7f0 */ NULL, +/* c7f1 */ NULL, +/* c7f2 */ NULL, +/* c7f3 */ NULL, +/* c7f4 */ NULL, +/* c7f5 */ NULL, +/* c7f6 */ NULL, +/* c7f7 */ NULL, +/* c7f8 */ NULL, +/* c7f9 */ NULL, +/* c7fa */ NULL, +/* c7fb */ NULL, +/* c7fc */ NULL, +/* c7fd */ NULL, +/* c7fe */ NULL, +/* c7ff */ NULL, +/* c800 */ NULL, +/* c801 */ NULL, +/* c802 */ NULL, +/* c803 */ NULL, +/* c804 */ NULL, +/* c805 */ NULL, +/* c806 */ NULL, +/* c807 */ NULL, +/* c808 */ NULL, +/* c809 */ NULL, +/* c80a */ NULL, +/* c80b */ NULL, +/* c80c */ NULL, +/* c80d */ NULL, +/* c80e */ NULL, +/* c80f */ NULL, +/* c810 */ NULL, +/* c811 */ NULL, +/* c812 */ NULL, +/* c813 */ NULL, +/* c814 */ NULL, +/* c815 */ NULL, +/* c816 */ NULL, +/* c817 */ NULL, +/* c818 */ NULL, +/* c819 */ NULL, +/* c81a */ NULL, +/* c81b */ NULL, +/* c81c */ NULL, +/* c81d */ NULL, +/* c81e */ NULL, +/* c81f */ NULL, +/* c820 */ NULL, +/* c821 */ NULL, +/* c822 */ NULL, +/* c823 */ NULL, +/* c824 */ NULL, +/* c825 */ NULL, +/* c826 */ NULL, +/* c827 */ NULL, +/* c828 */ NULL, +/* c829 */ NULL, +/* c82a */ NULL, +/* c82b */ NULL, +/* c82c */ NULL, +/* c82d */ NULL, +/* c82e */ NULL, +/* c82f */ NULL, +/* c830 */ NULL, +/* c831 */ NULL, +/* c832 */ NULL, +/* c833 */ NULL, +/* c834 */ NULL, +/* c835 */ NULL, +/* c836 */ NULL, +/* c837 */ NULL, +/* c838 */ NULL, +/* c839 */ NULL, +/* c83a */ NULL, +/* c83b */ NULL, +/* c83c */ NULL, +/* c83d */ NULL, +/* c83e */ NULL, +/* c83f */ NULL, +/* c840 */ NULL, +/* c841 */ NULL, +/* c842 */ NULL, +/* c843 */ NULL, +/* c844 */ NULL, +/* c845 */ NULL, +/* c846 */ NULL, +/* c847 */ NULL, +/* c848 */ NULL, +/* c849 */ NULL, +/* c84a */ NULL, +/* c84b */ NULL, +/* c84c */ NULL, +/* c84d */ NULL, +/* c84e */ NULL, +/* c84f */ NULL, +/* c850 */ NULL, +/* c851 */ NULL, +/* c852 */ NULL, +/* c853 */ NULL, +/* c854 */ NULL, +/* c855 */ NULL, +/* c856 */ NULL, +/* c857 */ NULL, +/* c858 */ NULL, +/* c859 */ NULL, +/* c85a */ NULL, +/* c85b */ NULL, +/* c85c */ NULL, +/* c85d */ NULL, +/* c85e */ NULL, +/* c85f */ NULL, +/* c860 */ NULL, +/* c861 */ NULL, +/* c862 */ NULL, +/* c863 */ NULL, +/* c864 */ NULL, +/* c865 */ NULL, +/* c866 */ NULL, +/* c867 */ NULL, +/* c868 */ NULL, +/* c869 */ NULL, +/* c86a */ NULL, +/* c86b */ NULL, +/* c86c */ NULL, +/* c86d */ NULL, +/* c86e */ NULL, +/* c86f */ NULL, +/* c870 */ NULL, +/* c871 */ NULL, +/* c872 */ NULL, +/* c873 */ NULL, +/* c874 */ NULL, +/* c875 */ NULL, +/* c876 */ NULL, +/* c877 */ NULL, +/* c878 */ NULL, +/* c879 */ NULL, +/* c87a */ NULL, +/* c87b */ NULL, +/* c87c */ NULL, +/* c87d */ NULL, +/* c87e */ NULL, +/* c87f */ NULL, +/* c880 */ NULL, +/* c881 */ NULL, +/* c882 */ NULL, +/* c883 */ NULL, +/* c884 */ NULL, +/* c885 */ NULL, +/* c886 */ NULL, +/* c887 */ NULL, +/* c888 */ NULL, +/* c889 */ NULL, +/* c88a */ NULL, +/* c88b */ NULL, +/* c88c */ NULL, +/* c88d */ NULL, +/* c88e */ NULL, +/* c88f */ NULL, +/* c890 */ NULL, +/* c891 */ NULL, +/* c892 */ NULL, +/* c893 */ NULL, +/* c894 */ NULL, +/* c895 */ NULL, +/* c896 */ NULL, +/* c897 */ NULL, +/* c898 */ NULL, +/* c899 */ NULL, +/* c89a */ NULL, +/* c89b */ NULL, +/* c89c */ NULL, +/* c89d */ NULL, +/* c89e */ NULL, +/* c89f */ NULL, +/* c8a0 */ NULL, +/* c8a1 */ NULL, +/* c8a2 */ NULL, +/* c8a3 */ NULL, +/* c8a4 */ NULL, +/* c8a5 */ NULL, +/* c8a6 */ NULL, +/* c8a7 */ NULL, +/* c8a8 */ NULL, +/* c8a9 */ NULL, +/* c8aa */ NULL, +/* c8ab */ NULL, +/* c8ac */ NULL, +/* c8ad */ NULL, +/* c8ae */ NULL, +/* c8af */ NULL, +/* c8b0 */ NULL, +/* c8b1 */ NULL, +/* c8b2 */ NULL, +/* c8b3 */ NULL, +/* c8b4 */ NULL, +/* c8b5 */ NULL, +/* c8b6 */ NULL, +/* c8b7 */ NULL, +/* c8b8 */ NULL, +/* c8b9 */ NULL, +/* c8ba */ NULL, +/* c8bb */ NULL, +/* c8bc */ NULL, +/* c8bd */ NULL, +/* c8be */ NULL, +/* c8bf */ NULL, +/* c8c0 */ NULL, +/* c8c1 */ NULL, +/* c8c2 */ NULL, +/* c8c3 */ NULL, +/* c8c4 */ NULL, +/* c8c5 */ NULL, +/* c8c6 */ NULL, +/* c8c7 */ NULL, +/* c8c8 */ NULL, +/* c8c9 */ NULL, +/* c8ca */ NULL, +/* c8cb */ NULL, +/* c8cc */ NULL, +/* c8cd */ NULL, +/* c8ce */ NULL, +/* c8cf */ NULL, +/* c8d0 */ NULL, +/* c8d1 */ NULL, +/* c8d2 */ NULL, +/* c8d3 */ NULL, +/* c8d4 */ NULL, +/* c8d5 */ NULL, +/* c8d6 */ NULL, +/* c8d7 */ NULL, +/* c8d8 */ NULL, +/* c8d9 */ NULL, +/* c8da */ NULL, +/* c8db */ NULL, +/* c8dc */ NULL, +/* c8dd */ NULL, +/* c8de */ NULL, +/* c8df */ NULL, +/* c8e0 */ NULL, +/* c8e1 */ NULL, +/* c8e2 */ NULL, +/* c8e3 */ NULL, +/* c8e4 */ NULL, +/* c8e5 */ NULL, +/* c8e6 */ NULL, +/* c8e7 */ NULL, +/* c8e8 */ NULL, +/* c8e9 */ NULL, +/* c8ea */ NULL, +/* c8eb */ NULL, +/* c8ec */ NULL, +/* c8ed */ NULL, +/* c8ee */ NULL, +/* c8ef */ NULL, +/* c8f0 */ NULL, +/* c8f1 */ NULL, +/* c8f2 */ NULL, +/* c8f3 */ NULL, +/* c8f4 */ NULL, +/* c8f5 */ NULL, +/* c8f6 */ NULL, +/* c8f7 */ NULL, +/* c8f8 */ NULL, +/* c8f9 */ NULL, +/* c8fa */ NULL, +/* c8fb */ NULL, +/* c8fc */ NULL, +/* c8fd */ NULL, +/* c8fe */ NULL, +/* c8ff */ NULL, +/* c900 */ NULL, +/* c901 */ NULL, +/* c902 */ NULL, +/* c903 */ NULL, +/* c904 */ NULL, +/* c905 */ NULL, +/* c906 */ NULL, +/* c907 */ NULL, +/* c908 */ NULL, +/* c909 */ NULL, +/* c90a */ NULL, +/* c90b */ NULL, +/* c90c */ NULL, +/* c90d */ NULL, +/* c90e */ NULL, +/* c90f */ NULL, +/* c910 */ NULL, +/* c911 */ NULL, +/* c912 */ NULL, +/* c913 */ NULL, +/* c914 */ NULL, +/* c915 */ NULL, +/* c916 */ NULL, +/* c917 */ NULL, +/* c918 */ NULL, +/* c919 */ NULL, +/* c91a */ NULL, +/* c91b */ NULL, +/* c91c */ NULL, +/* c91d */ NULL, +/* c91e */ NULL, +/* c91f */ NULL, +/* c920 */ NULL, +/* c921 */ NULL, +/* c922 */ NULL, +/* c923 */ NULL, +/* c924 */ NULL, +/* c925 */ NULL, +/* c926 */ NULL, +/* c927 */ NULL, +/* c928 */ NULL, +/* c929 */ NULL, +/* c92a */ NULL, +/* c92b */ NULL, +/* c92c */ NULL, +/* c92d */ NULL, +/* c92e */ NULL, +/* c92f */ NULL, +/* c930 */ NULL, +/* c931 */ NULL, +/* c932 */ NULL, +/* c933 */ NULL, +/* c934 */ NULL, +/* c935 */ NULL, +/* c936 */ NULL, +/* c937 */ NULL, +/* c938 */ NULL, +/* c939 */ NULL, +/* c93a */ NULL, +/* c93b */ NULL, +/* c93c */ NULL, +/* c93d */ NULL, +/* c93e */ NULL, +/* c93f */ NULL, +/* c940 */ NULL, +/* c941 */ NULL, +/* c942 */ NULL, +/* c943 */ NULL, +/* c944 */ NULL, +/* c945 */ NULL, +/* c946 */ NULL, +/* c947 */ NULL, +/* c948 */ NULL, +/* c949 */ NULL, +/* c94a */ NULL, +/* c94b */ NULL, +/* c94c */ NULL, +/* c94d */ NULL, +/* c94e */ NULL, +/* c94f */ NULL, +/* c950 */ NULL, +/* c951 */ NULL, +/* c952 */ NULL, +/* c953 */ NULL, +/* c954 */ NULL, +/* c955 */ NULL, +/* c956 */ NULL, +/* c957 */ NULL, +/* c958 */ NULL, +/* c959 */ NULL, +/* c95a */ NULL, +/* c95b */ NULL, +/* c95c */ NULL, +/* c95d */ NULL, +/* c95e */ NULL, +/* c95f */ NULL, +/* c960 */ NULL, +/* c961 */ NULL, +/* c962 */ NULL, +/* c963 */ NULL, +/* c964 */ NULL, +/* c965 */ NULL, +/* c966 */ NULL, +/* c967 */ NULL, +/* c968 */ NULL, +/* c969 */ NULL, +/* c96a */ NULL, +/* c96b */ NULL, +/* c96c */ NULL, +/* c96d */ NULL, +/* c96e */ NULL, +/* c96f */ NULL, +/* c970 */ NULL, +/* c971 */ NULL, +/* c972 */ NULL, +/* c973 */ NULL, +/* c974 */ NULL, +/* c975 */ NULL, +/* c976 */ NULL, +/* c977 */ NULL, +/* c978 */ NULL, +/* c979 */ NULL, +/* c97a */ NULL, +/* c97b */ NULL, +/* c97c */ NULL, +/* c97d */ NULL, +/* c97e */ NULL, +/* c97f */ NULL, +/* c980 */ NULL, +/* c981 */ NULL, +/* c982 */ NULL, +/* c983 */ NULL, +/* c984 */ NULL, +/* c985 */ NULL, +/* c986 */ NULL, +/* c987 */ NULL, +/* c988 */ NULL, +/* c989 */ NULL, +/* c98a */ NULL, +/* c98b */ NULL, +/* c98c */ NULL, +/* c98d */ NULL, +/* c98e */ NULL, +/* c98f */ NULL, +/* c990 */ NULL, +/* c991 */ NULL, +/* c992 */ NULL, +/* c993 */ NULL, +/* c994 */ NULL, +/* c995 */ NULL, +/* c996 */ NULL, +/* c997 */ NULL, +/* c998 */ NULL, +/* c999 */ NULL, +/* c99a */ NULL, +/* c99b */ NULL, +/* c99c */ NULL, +/* c99d */ NULL, +/* c99e */ NULL, +/* c99f */ NULL, +/* c9a0 */ NULL, +/* c9a1 */ NULL, +/* c9a2 */ NULL, +/* c9a3 */ NULL, +/* c9a4 */ NULL, +/* c9a5 */ NULL, +/* c9a6 */ NULL, +/* c9a7 */ NULL, +/* c9a8 */ NULL, +/* c9a9 */ NULL, +/* c9aa */ NULL, +/* c9ab */ NULL, +/* c9ac */ NULL, +/* c9ad */ NULL, +/* c9ae */ NULL, +/* c9af */ NULL, +/* c9b0 */ NULL, +/* c9b1 */ NULL, +/* c9b2 */ NULL, +/* c9b3 */ NULL, +/* c9b4 */ NULL, +/* c9b5 */ NULL, +/* c9b6 */ NULL, +/* c9b7 */ NULL, +/* c9b8 */ NULL, +/* c9b9 */ NULL, +/* c9ba */ NULL, +/* c9bb */ NULL, +/* c9bc */ NULL, +/* c9bd */ NULL, +/* c9be */ NULL, +/* c9bf */ NULL, +/* c9c0 */ NULL, +/* c9c1 */ NULL, +/* c9c2 */ NULL, +/* c9c3 */ NULL, +/* c9c4 */ NULL, +/* c9c5 */ NULL, +/* c9c6 */ NULL, +/* c9c7 */ NULL, +/* c9c8 */ NULL, +/* c9c9 */ NULL, +/* c9ca */ NULL, +/* c9cb */ NULL, +/* c9cc */ NULL, +/* c9cd */ NULL, +/* c9ce */ NULL, +/* c9cf */ NULL, +/* c9d0 */ NULL, +/* c9d1 */ NULL, +/* c9d2 */ NULL, +/* c9d3 */ NULL, +/* c9d4 */ NULL, +/* c9d5 */ NULL, +/* c9d6 */ NULL, +/* c9d7 */ NULL, +/* c9d8 */ NULL, +/* c9d9 */ NULL, +/* c9da */ NULL, +/* c9db */ NULL, +/* c9dc */ NULL, +/* c9dd */ NULL, +/* c9de */ NULL, +/* c9df */ NULL, +/* c9e0 */ NULL, +/* c9e1 */ NULL, +/* c9e2 */ NULL, +/* c9e3 */ NULL, +/* c9e4 */ NULL, +/* c9e5 */ NULL, +/* c9e6 */ NULL, +/* c9e7 */ NULL, +/* c9e8 */ NULL, +/* c9e9 */ NULL, +/* c9ea */ NULL, +/* c9eb */ NULL, +/* c9ec */ NULL, +/* c9ed */ NULL, +/* c9ee */ NULL, +/* c9ef */ NULL, +/* c9f0 */ NULL, +/* c9f1 */ NULL, +/* c9f2 */ NULL, +/* c9f3 */ NULL, +/* c9f4 */ NULL, +/* c9f5 */ NULL, +/* c9f6 */ NULL, +/* c9f7 */ NULL, +/* c9f8 */ NULL, +/* c9f9 */ NULL, +/* c9fa */ NULL, +/* c9fb */ NULL, +/* c9fc */ NULL, +/* c9fd */ NULL, +/* c9fe */ NULL, +/* c9ff */ NULL, +/* ca00 */ NULL, +/* ca01 */ NULL, +/* ca02 */ NULL, +/* ca03 */ NULL, +/* ca04 */ NULL, +/* ca05 */ NULL, +/* ca06 */ NULL, +/* ca07 */ NULL, +/* ca08 */ NULL, +/* ca09 */ NULL, +/* ca0a */ NULL, +/* ca0b */ NULL, +/* ca0c */ NULL, +/* ca0d */ NULL, +/* ca0e */ NULL, +/* ca0f */ NULL, +/* ca10 */ NULL, +/* ca11 */ NULL, +/* ca12 */ NULL, +/* ca13 */ NULL, +/* ca14 */ NULL, +/* ca15 */ NULL, +/* ca16 */ NULL, +/* ca17 */ NULL, +/* ca18 */ NULL, +/* ca19 */ NULL, +/* ca1a */ NULL, +/* ca1b */ NULL, +/* ca1c */ NULL, +/* ca1d */ NULL, +/* ca1e */ NULL, +/* ca1f */ NULL, +/* ca20 */ NULL, +/* ca21 */ NULL, +/* ca22 */ NULL, +/* ca23 */ NULL, +/* ca24 */ NULL, +/* ca25 */ NULL, +/* ca26 */ NULL, +/* ca27 */ NULL, +/* ca28 */ NULL, +/* ca29 */ NULL, +/* ca2a */ NULL, +/* ca2b */ NULL, +/* ca2c */ NULL, +/* ca2d */ NULL, +/* ca2e */ NULL, +/* ca2f */ NULL, +/* ca30 */ NULL, +/* ca31 */ NULL, +/* ca32 */ NULL, +/* ca33 */ NULL, +/* ca34 */ NULL, +/* ca35 */ NULL, +/* ca36 */ NULL, +/* ca37 */ NULL, +/* ca38 */ NULL, +/* ca39 */ NULL, +/* ca3a */ NULL, +/* ca3b */ NULL, +/* ca3c */ NULL, +/* ca3d */ NULL, +/* ca3e */ NULL, +/* ca3f */ NULL, +/* ca40 */ NULL, +/* ca41 */ NULL, +/* ca42 */ NULL, +/* ca43 */ NULL, +/* ca44 */ NULL, +/* ca45 */ NULL, +/* ca46 */ NULL, +/* ca47 */ NULL, +/* ca48 */ NULL, +/* ca49 */ NULL, +/* ca4a */ NULL, +/* ca4b */ NULL, +/* ca4c */ NULL, +/* ca4d */ NULL, +/* ca4e */ NULL, +/* ca4f */ NULL, +/* ca50 */ NULL, +/* ca51 */ NULL, +/* ca52 */ NULL, +/* ca53 */ NULL, +/* ca54 */ NULL, +/* ca55 */ NULL, +/* ca56 */ NULL, +/* ca57 */ NULL, +/* ca58 */ NULL, +/* ca59 */ NULL, +/* ca5a */ NULL, +/* ca5b */ NULL, +/* ca5c */ NULL, +/* ca5d */ NULL, +/* ca5e */ NULL, +/* ca5f */ NULL, +/* ca60 */ NULL, +/* ca61 */ NULL, +/* ca62 */ NULL, +/* ca63 */ NULL, +/* ca64 */ NULL, +/* ca65 */ NULL, +/* ca66 */ NULL, +/* ca67 */ NULL, +/* ca68 */ NULL, +/* ca69 */ NULL, +/* ca6a */ NULL, +/* ca6b */ NULL, +/* ca6c */ NULL, +/* ca6d */ NULL, +/* ca6e */ NULL, +/* ca6f */ NULL, +/* ca70 */ NULL, +/* ca71 */ NULL, +/* ca72 */ NULL, +/* ca73 */ NULL, +/* ca74 */ NULL, +/* ca75 */ NULL, +/* ca76 */ NULL, +/* ca77 */ NULL, +/* ca78 */ NULL, +/* ca79 */ NULL, +/* ca7a */ NULL, +/* ca7b */ NULL, +/* ca7c */ NULL, +/* ca7d */ NULL, +/* ca7e */ NULL, +/* ca7f */ NULL, +/* ca80 */ NULL, +/* ca81 */ NULL, +/* ca82 */ NULL, +/* ca83 */ NULL, +/* ca84 */ NULL, +/* ca85 */ NULL, +/* ca86 */ NULL, +/* ca87 */ NULL, +/* ca88 */ NULL, +/* ca89 */ NULL, +/* ca8a */ NULL, +/* ca8b */ NULL, +/* ca8c */ NULL, +/* ca8d */ NULL, +/* ca8e */ NULL, +/* ca8f */ NULL, +/* ca90 */ NULL, +/* ca91 */ NULL, +/* ca92 */ NULL, +/* ca93 */ NULL, +/* ca94 */ NULL, +/* ca95 */ NULL, +/* ca96 */ NULL, +/* ca97 */ NULL, +/* ca98 */ NULL, +/* ca99 */ NULL, +/* ca9a */ NULL, +/* ca9b */ NULL, +/* ca9c */ NULL, +/* ca9d */ NULL, +/* ca9e */ NULL, +/* ca9f */ NULL, +/* caa0 */ NULL, +/* caa1 */ NULL, +/* caa2 */ NULL, +/* caa3 */ NULL, +/* caa4 */ NULL, +/* caa5 */ NULL, +/* caa6 */ NULL, +/* caa7 */ NULL, +/* caa8 */ NULL, +/* caa9 */ NULL, +/* caaa */ NULL, +/* caab */ NULL, +/* caac */ NULL, +/* caad */ NULL, +/* caae */ NULL, +/* caaf */ NULL, +/* cab0 */ NULL, +/* cab1 */ NULL, +/* cab2 */ NULL, +/* cab3 */ NULL, +/* cab4 */ NULL, +/* cab5 */ NULL, +/* cab6 */ NULL, +/* cab7 */ NULL, +/* cab8 */ NULL, +/* cab9 */ NULL, +/* caba */ NULL, +/* cabb */ NULL, +/* cabc */ NULL, +/* cabd */ NULL, +/* cabe */ NULL, +/* cabf */ NULL, +/* cac0 */ NULL, +/* cac1 */ NULL, +/* cac2 */ NULL, +/* cac3 */ NULL, +/* cac4 */ NULL, +/* cac5 */ NULL, +/* cac6 */ NULL, +/* cac7 */ NULL, +/* cac8 */ NULL, +/* cac9 */ NULL, +/* caca */ NULL, +/* cacb */ NULL, +/* cacc */ NULL, +/* cacd */ NULL, +/* cace */ NULL, +/* cacf */ NULL, +/* cad0 */ NULL, +/* cad1 */ NULL, +/* cad2 */ NULL, +/* cad3 */ NULL, +/* cad4 */ NULL, +/* cad5 */ NULL, +/* cad6 */ NULL, +/* cad7 */ NULL, +/* cad8 */ NULL, +/* cad9 */ NULL, +/* cada */ NULL, +/* cadb */ NULL, +/* cadc */ NULL, +/* cadd */ NULL, +/* cade */ NULL, +/* cadf */ NULL, +/* cae0 */ NULL, +/* cae1 */ NULL, +/* cae2 */ NULL, +/* cae3 */ NULL, +/* cae4 */ NULL, +/* cae5 */ NULL, +/* cae6 */ NULL, +/* cae7 */ NULL, +/* cae8 */ NULL, +/* cae9 */ NULL, +/* caea */ NULL, +/* caeb */ NULL, +/* caec */ NULL, +/* caed */ NULL, +/* caee */ NULL, +/* caef */ NULL, +/* caf0 */ NULL, +/* caf1 */ NULL, +/* caf2 */ NULL, +/* caf3 */ NULL, +/* caf4 */ NULL, +/* caf5 */ NULL, +/* caf6 */ NULL, +/* caf7 */ NULL, +/* caf8 */ NULL, +/* caf9 */ NULL, +/* cafa */ NULL, +/* cafb */ NULL, +/* cafc */ NULL, +/* cafd */ NULL, +/* cafe */ NULL, +/* caff */ NULL, +/* cb00 */ NULL, +/* cb01 */ NULL, +/* cb02 */ NULL, +/* cb03 */ NULL, +/* cb04 */ NULL, +/* cb05 */ NULL, +/* cb06 */ NULL, +/* cb07 */ NULL, +/* cb08 */ NULL, +/* cb09 */ NULL, +/* cb0a */ NULL, +/* cb0b */ NULL, +/* cb0c */ NULL, +/* cb0d */ NULL, +/* cb0e */ NULL, +/* cb0f */ NULL, +/* cb10 */ NULL, +/* cb11 */ NULL, +/* cb12 */ NULL, +/* cb13 */ NULL, +/* cb14 */ NULL, +/* cb15 */ NULL, +/* cb16 */ NULL, +/* cb17 */ NULL, +/* cb18 */ NULL, +/* cb19 */ NULL, +/* cb1a */ NULL, +/* cb1b */ NULL, +/* cb1c */ NULL, +/* cb1d */ NULL, +/* cb1e */ NULL, +/* cb1f */ NULL, +/* cb20 */ NULL, +/* cb21 */ NULL, +/* cb22 */ NULL, +/* cb23 */ NULL, +/* cb24 */ NULL, +/* cb25 */ NULL, +/* cb26 */ NULL, +/* cb27 */ NULL, +/* cb28 */ NULL, +/* cb29 */ NULL, +/* cb2a */ NULL, +/* cb2b */ NULL, +/* cb2c */ NULL, +/* cb2d */ NULL, +/* cb2e */ NULL, +/* cb2f */ NULL, +/* cb30 */ NULL, +/* cb31 */ NULL, +/* cb32 */ NULL, +/* cb33 */ NULL, +/* cb34 */ NULL, +/* cb35 */ NULL, +/* cb36 */ NULL, +/* cb37 */ NULL, +/* cb38 */ NULL, +/* cb39 */ NULL, +/* cb3a */ NULL, +/* cb3b */ NULL, +/* cb3c */ NULL, +/* cb3d */ NULL, +/* cb3e */ NULL, +/* cb3f */ NULL, +/* cb40 */ NULL, +/* cb41 */ NULL, +/* cb42 */ NULL, +/* cb43 */ NULL, +/* cb44 */ NULL, +/* cb45 */ NULL, +/* cb46 */ NULL, +/* cb47 */ NULL, +/* cb48 */ NULL, +/* cb49 */ NULL, +/* cb4a */ NULL, +/* cb4b */ NULL, +/* cb4c */ NULL, +/* cb4d */ NULL, +/* cb4e */ NULL, +/* cb4f */ NULL, +/* cb50 */ NULL, +/* cb51 */ NULL, +/* cb52 */ NULL, +/* cb53 */ NULL, +/* cb54 */ NULL, +/* cb55 */ NULL, +/* cb56 */ NULL, +/* cb57 */ NULL, +/* cb58 */ NULL, +/* cb59 */ NULL, +/* cb5a */ NULL, +/* cb5b */ NULL, +/* cb5c */ NULL, +/* cb5d */ NULL, +/* cb5e */ NULL, +/* cb5f */ NULL, +/* cb60 */ NULL, +/* cb61 */ NULL, +/* cb62 */ NULL, +/* cb63 */ NULL, +/* cb64 */ NULL, +/* cb65 */ NULL, +/* cb66 */ NULL, +/* cb67 */ NULL, +/* cb68 */ NULL, +/* cb69 */ NULL, +/* cb6a */ NULL, +/* cb6b */ NULL, +/* cb6c */ NULL, +/* cb6d */ NULL, +/* cb6e */ NULL, +/* cb6f */ NULL, +/* cb70 */ NULL, +/* cb71 */ NULL, +/* cb72 */ NULL, +/* cb73 */ NULL, +/* cb74 */ NULL, +/* cb75 */ NULL, +/* cb76 */ NULL, +/* cb77 */ NULL, +/* cb78 */ NULL, +/* cb79 */ NULL, +/* cb7a */ NULL, +/* cb7b */ NULL, +/* cb7c */ NULL, +/* cb7d */ NULL, +/* cb7e */ NULL, +/* cb7f */ NULL, +/* cb80 */ NULL, +/* cb81 */ NULL, +/* cb82 */ NULL, +/* cb83 */ NULL, +/* cb84 */ NULL, +/* cb85 */ NULL, +/* cb86 */ NULL, +/* cb87 */ NULL, +/* cb88 */ NULL, +/* cb89 */ NULL, +/* cb8a */ NULL, +/* cb8b */ NULL, +/* cb8c */ NULL, +/* cb8d */ NULL, +/* cb8e */ NULL, +/* cb8f */ NULL, +/* cb90 */ NULL, +/* cb91 */ NULL, +/* cb92 */ NULL, +/* cb93 */ NULL, +/* cb94 */ NULL, +/* cb95 */ NULL, +/* cb96 */ NULL, +/* cb97 */ NULL, +/* cb98 */ NULL, +/* cb99 */ NULL, +/* cb9a */ NULL, +/* cb9b */ NULL, +/* cb9c */ NULL, +/* cb9d */ NULL, +/* cb9e */ NULL, +/* cb9f */ NULL, +/* cba0 */ NULL, +/* cba1 */ NULL, +/* cba2 */ NULL, +/* cba3 */ NULL, +/* cba4 */ NULL, +/* cba5 */ NULL, +/* cba6 */ NULL, +/* cba7 */ NULL, +/* cba8 */ NULL, +/* cba9 */ NULL, +/* cbaa */ NULL, +/* cbab */ NULL, +/* cbac */ NULL, +/* cbad */ NULL, +/* cbae */ NULL, +/* cbaf */ NULL, +/* cbb0 */ NULL, +/* cbb1 */ NULL, +/* cbb2 */ NULL, +/* cbb3 */ NULL, +/* cbb4 */ NULL, +/* cbb5 */ NULL, +/* cbb6 */ NULL, +/* cbb7 */ NULL, +/* cbb8 */ NULL, +/* cbb9 */ NULL, +/* cbba */ NULL, +/* cbbb */ NULL, +/* cbbc */ NULL, +/* cbbd */ NULL, +/* cbbe */ NULL, +/* cbbf */ NULL, +/* cbc0 */ NULL, +/* cbc1 */ NULL, +/* cbc2 */ NULL, +/* cbc3 */ NULL, +/* cbc4 */ NULL, +/* cbc5 */ NULL, +/* cbc6 */ NULL, +/* cbc7 */ NULL, +/* cbc8 */ NULL, +/* cbc9 */ NULL, +/* cbca */ NULL, +/* cbcb */ NULL, +/* cbcc */ NULL, +/* cbcd */ NULL, +/* cbce */ NULL, +/* cbcf */ NULL, +/* cbd0 */ NULL, +/* cbd1 */ NULL, +/* cbd2 */ NULL, +/* cbd3 */ NULL, +/* cbd4 */ NULL, +/* cbd5 */ NULL, +/* cbd6 */ NULL, +/* cbd7 */ NULL, +/* cbd8 */ NULL, +/* cbd9 */ NULL, +/* cbda */ NULL, +/* cbdb */ NULL, +/* cbdc */ NULL, +/* cbdd */ NULL, +/* cbde */ NULL, +/* cbdf */ NULL, +/* cbe0 */ NULL, +/* cbe1 */ NULL, +/* cbe2 */ NULL, +/* cbe3 */ NULL, +/* cbe4 */ NULL, +/* cbe5 */ NULL, +/* cbe6 */ NULL, +/* cbe7 */ NULL, +/* cbe8 */ NULL, +/* cbe9 */ NULL, +/* cbea */ NULL, +/* cbeb */ NULL, +/* cbec */ NULL, +/* cbed */ NULL, +/* cbee */ NULL, +/* cbef */ NULL, +/* cbf0 */ NULL, +/* cbf1 */ NULL, +/* cbf2 */ NULL, +/* cbf3 */ NULL, +/* cbf4 */ NULL, +/* cbf5 */ NULL, +/* cbf6 */ NULL, +/* cbf7 */ NULL, +/* cbf8 */ NULL, +/* cbf9 */ NULL, +/* cbfa */ NULL, +/* cbfb */ NULL, +/* cbfc */ NULL, +/* cbfd */ NULL, +/* cbfe */ NULL, +/* cbff */ NULL, +/* cc00 */ NULL, +/* cc01 */ NULL, +/* cc02 */ NULL, +/* cc03 */ NULL, +/* cc04 */ NULL, +/* cc05 */ NULL, +/* cc06 */ NULL, +/* cc07 */ NULL, +/* cc08 */ NULL, +/* cc09 */ NULL, +/* cc0a */ NULL, +/* cc0b */ NULL, +/* cc0c */ NULL, +/* cc0d */ NULL, +/* cc0e */ NULL, +/* cc0f */ NULL, +/* cc10 */ NULL, +/* cc11 */ NULL, +/* cc12 */ NULL, +/* cc13 */ NULL, +/* cc14 */ NULL, +/* cc15 */ NULL, +/* cc16 */ NULL, +/* cc17 */ NULL, +/* cc18 */ NULL, +/* cc19 */ NULL, +/* cc1a */ NULL, +/* cc1b */ NULL, +/* cc1c */ NULL, +/* cc1d */ NULL, +/* cc1e */ NULL, +/* cc1f */ NULL, +/* cc20 */ NULL, +/* cc21 */ NULL, +/* cc22 */ NULL, +/* cc23 */ NULL, +/* cc24 */ NULL, +/* cc25 */ NULL, +/* cc26 */ NULL, +/* cc27 */ NULL, +/* cc28 */ NULL, +/* cc29 */ NULL, +/* cc2a */ NULL, +/* cc2b */ NULL, +/* cc2c */ NULL, +/* cc2d */ NULL, +/* cc2e */ NULL, +/* cc2f */ NULL, +/* cc30 */ NULL, +/* cc31 */ NULL, +/* cc32 */ NULL, +/* cc33 */ NULL, +/* cc34 */ NULL, +/* cc35 */ NULL, +/* cc36 */ NULL, +/* cc37 */ NULL, +/* cc38 */ NULL, +/* cc39 */ NULL, +/* cc3a */ NULL, +/* cc3b */ NULL, +/* cc3c */ NULL, +/* cc3d */ NULL, +/* cc3e */ NULL, +/* cc3f */ NULL, +/* cc40 */ NULL, +/* cc41 */ NULL, +/* cc42 */ NULL, +/* cc43 */ NULL, +/* cc44 */ NULL, +/* cc45 */ NULL, +/* cc46 */ NULL, +/* cc47 */ NULL, +/* cc48 */ NULL, +/* cc49 */ NULL, +/* cc4a */ NULL, +/* cc4b */ NULL, +/* cc4c */ NULL, +/* cc4d */ NULL, +/* cc4e */ NULL, +/* cc4f */ NULL, +/* cc50 */ NULL, +/* cc51 */ NULL, +/* cc52 */ NULL, +/* cc53 */ NULL, +/* cc54 */ NULL, +/* cc55 */ NULL, +/* cc56 */ NULL, +/* cc57 */ NULL, +/* cc58 */ NULL, +/* cc59 */ NULL, +/* cc5a */ NULL, +/* cc5b */ NULL, +/* cc5c */ NULL, +/* cc5d */ NULL, +/* cc5e */ NULL, +/* cc5f */ NULL, +/* cc60 */ NULL, +/* cc61 */ NULL, +/* cc62 */ NULL, +/* cc63 */ NULL, +/* cc64 */ NULL, +/* cc65 */ NULL, +/* cc66 */ NULL, +/* cc67 */ NULL, +/* cc68 */ NULL, +/* cc69 */ NULL, +/* cc6a */ NULL, +/* cc6b */ NULL, +/* cc6c */ NULL, +/* cc6d */ NULL, +/* cc6e */ NULL, +/* cc6f */ NULL, +/* cc70 */ NULL, +/* cc71 */ NULL, +/* cc72 */ NULL, +/* cc73 */ NULL, +/* cc74 */ NULL, +/* cc75 */ NULL, +/* cc76 */ NULL, +/* cc77 */ NULL, +/* cc78 */ NULL, +/* cc79 */ NULL, +/* cc7a */ NULL, +/* cc7b */ NULL, +/* cc7c */ NULL, +/* cc7d */ NULL, +/* cc7e */ NULL, +/* cc7f */ NULL, +/* cc80 */ NULL, +/* cc81 */ NULL, +/* cc82 */ NULL, +/* cc83 */ NULL, +/* cc84 */ NULL, +/* cc85 */ NULL, +/* cc86 */ NULL, +/* cc87 */ NULL, +/* cc88 */ NULL, +/* cc89 */ NULL, +/* cc8a */ NULL, +/* cc8b */ NULL, +/* cc8c */ NULL, +/* cc8d */ NULL, +/* cc8e */ NULL, +/* cc8f */ NULL, +/* cc90 */ NULL, +/* cc91 */ NULL, +/* cc92 */ NULL, +/* cc93 */ NULL, +/* cc94 */ NULL, +/* cc95 */ NULL, +/* cc96 */ NULL, +/* cc97 */ NULL, +/* cc98 */ NULL, +/* cc99 */ NULL, +/* cc9a */ NULL, +/* cc9b */ NULL, +/* cc9c */ NULL, +/* cc9d */ NULL, +/* cc9e */ NULL, +/* cc9f */ NULL, +/* cca0 */ NULL, +/* cca1 */ NULL, +/* cca2 */ NULL, +/* cca3 */ NULL, +/* cca4 */ NULL, +/* cca5 */ NULL, +/* cca6 */ NULL, +/* cca7 */ NULL, +/* cca8 */ NULL, +/* cca9 */ NULL, +/* ccaa */ NULL, +/* ccab */ NULL, +/* ccac */ NULL, +/* ccad */ NULL, +/* ccae */ NULL, +/* ccaf */ NULL, +/* ccb0 */ NULL, +/* ccb1 */ NULL, +/* ccb2 */ NULL, +/* ccb3 */ NULL, +/* ccb4 */ NULL, +/* ccb5 */ NULL, +/* ccb6 */ NULL, +/* ccb7 */ NULL, +/* ccb8 */ NULL, +/* ccb9 */ NULL, +/* ccba */ NULL, +/* ccbb */ NULL, +/* ccbc */ NULL, +/* ccbd */ NULL, +/* ccbe */ NULL, +/* ccbf */ NULL, +/* ccc0 */ NULL, +/* ccc1 */ NULL, +/* ccc2 */ NULL, +/* ccc3 */ NULL, +/* ccc4 */ NULL, +/* ccc5 */ NULL, +/* ccc6 */ NULL, +/* ccc7 */ NULL, +/* ccc8 */ NULL, +/* ccc9 */ NULL, +/* ccca */ NULL, +/* cccb */ NULL, +/* cccc */ NULL, +/* cccd */ NULL, +/* ccce */ NULL, +/* cccf */ NULL, +/* ccd0 */ NULL, +/* ccd1 */ NULL, +/* ccd2 */ NULL, +/* ccd3 */ NULL, +/* ccd4 */ NULL, +/* ccd5 */ NULL, +/* ccd6 */ NULL, +/* ccd7 */ NULL, +/* ccd8 */ NULL, +/* ccd9 */ NULL, +/* ccda */ NULL, +/* ccdb */ NULL, +/* ccdc */ NULL, +/* ccdd */ NULL, +/* ccde */ NULL, +/* ccdf */ NULL, +/* cce0 */ NULL, +/* cce1 */ NULL, +/* cce2 */ NULL, +/* cce3 */ NULL, +/* cce4 */ NULL, +/* cce5 */ NULL, +/* cce6 */ NULL, +/* cce7 */ NULL, +/* cce8 */ NULL, +/* cce9 */ NULL, +/* ccea */ NULL, +/* cceb */ NULL, +/* ccec */ NULL, +/* cced */ NULL, +/* ccee */ NULL, +/* ccef */ NULL, +/* ccf0 */ NULL, +/* ccf1 */ NULL, +/* ccf2 */ NULL, +/* ccf3 */ NULL, +/* ccf4 */ NULL, +/* ccf5 */ NULL, +/* ccf6 */ NULL, +/* ccf7 */ NULL, +/* ccf8 */ NULL, +/* ccf9 */ NULL, +/* ccfa */ NULL, +/* ccfb */ NULL, +/* ccfc */ NULL, +/* ccfd */ NULL, +/* ccfe */ NULL, +/* ccff */ NULL, +/* cd00 */ NULL, +/* cd01 */ NULL, +/* cd02 */ NULL, +/* cd03 */ NULL, +/* cd04 */ NULL, +/* cd05 */ NULL, +/* cd06 */ NULL, +/* cd07 */ NULL, +/* cd08 */ NULL, +/* cd09 */ NULL, +/* cd0a */ NULL, +/* cd0b */ NULL, +/* cd0c */ NULL, +/* cd0d */ NULL, +/* cd0e */ NULL, +/* cd0f */ NULL, +/* cd10 */ NULL, +/* cd11 */ NULL, +/* cd12 */ NULL, +/* cd13 */ NULL, +/* cd14 */ NULL, +/* cd15 */ NULL, +/* cd16 */ NULL, +/* cd17 */ NULL, +/* cd18 */ NULL, +/* cd19 */ NULL, +/* cd1a */ NULL, +/* cd1b */ NULL, +/* cd1c */ NULL, +/* cd1d */ NULL, +/* cd1e */ NULL, +/* cd1f */ NULL, +/* cd20 */ NULL, +/* cd21 */ NULL, +/* cd22 */ NULL, +/* cd23 */ NULL, +/* cd24 */ NULL, +/* cd25 */ NULL, +/* cd26 */ NULL, +/* cd27 */ NULL, +/* cd28 */ NULL, +/* cd29 */ NULL, +/* cd2a */ NULL, +/* cd2b */ NULL, +/* cd2c */ NULL, +/* cd2d */ NULL, +/* cd2e */ NULL, +/* cd2f */ NULL, +/* cd30 */ NULL, +/* cd31 */ NULL, +/* cd32 */ NULL, +/* cd33 */ NULL, +/* cd34 */ NULL, +/* cd35 */ NULL, +/* cd36 */ NULL, +/* cd37 */ NULL, +/* cd38 */ NULL, +/* cd39 */ NULL, +/* cd3a */ NULL, +/* cd3b */ NULL, +/* cd3c */ NULL, +/* cd3d */ NULL, +/* cd3e */ NULL, +/* cd3f */ NULL, +/* cd40 */ NULL, +/* cd41 */ NULL, +/* cd42 */ NULL, +/* cd43 */ NULL, +/* cd44 */ NULL, +/* cd45 */ NULL, +/* cd46 */ NULL, +/* cd47 */ NULL, +/* cd48 */ NULL, +/* cd49 */ NULL, +/* cd4a */ NULL, +/* cd4b */ NULL, +/* cd4c */ NULL, +/* cd4d */ NULL, +/* cd4e */ NULL, +/* cd4f */ NULL, +/* cd50 */ NULL, +/* cd51 */ NULL, +/* cd52 */ NULL, +/* cd53 */ NULL, +/* cd54 */ NULL, +/* cd55 */ NULL, +/* cd56 */ NULL, +/* cd57 */ NULL, +/* cd58 */ NULL, +/* cd59 */ NULL, +/* cd5a */ NULL, +/* cd5b */ NULL, +/* cd5c */ NULL, +/* cd5d */ NULL, +/* cd5e */ NULL, +/* cd5f */ NULL, +/* cd60 */ NULL, +/* cd61 */ NULL, +/* cd62 */ NULL, +/* cd63 */ NULL, +/* cd64 */ NULL, +/* cd65 */ NULL, +/* cd66 */ NULL, +/* cd67 */ NULL, +/* cd68 */ NULL, +/* cd69 */ NULL, +/* cd6a */ NULL, +/* cd6b */ NULL, +/* cd6c */ NULL, +/* cd6d */ NULL, +/* cd6e */ NULL, +/* cd6f */ NULL, +/* cd70 */ NULL, +/* cd71 */ NULL, +/* cd72 */ NULL, +/* cd73 */ NULL, +/* cd74 */ NULL, +/* cd75 */ NULL, +/* cd76 */ NULL, +/* cd77 */ NULL, +/* cd78 */ NULL, +/* cd79 */ NULL, +/* cd7a */ NULL, +/* cd7b */ NULL, +/* cd7c */ NULL, +/* cd7d */ NULL, +/* cd7e */ NULL, +/* cd7f */ NULL, +/* cd80 */ NULL, +/* cd81 */ NULL, +/* cd82 */ NULL, +/* cd83 */ NULL, +/* cd84 */ NULL, +/* cd85 */ NULL, +/* cd86 */ NULL, +/* cd87 */ NULL, +/* cd88 */ NULL, +/* cd89 */ NULL, +/* cd8a */ NULL, +/* cd8b */ NULL, +/* cd8c */ NULL, +/* cd8d */ NULL, +/* cd8e */ NULL, +/* cd8f */ NULL, +/* cd90 */ NULL, +/* cd91 */ NULL, +/* cd92 */ NULL, +/* cd93 */ NULL, +/* cd94 */ NULL, +/* cd95 */ NULL, +/* cd96 */ NULL, +/* cd97 */ NULL, +/* cd98 */ NULL, +/* cd99 */ NULL, +/* cd9a */ NULL, +/* cd9b */ NULL, +/* cd9c */ NULL, +/* cd9d */ NULL, +/* cd9e */ NULL, +/* cd9f */ NULL, +/* cda0 */ NULL, +/* cda1 */ NULL, +/* cda2 */ NULL, +/* cda3 */ NULL, +/* cda4 */ NULL, +/* cda5 */ NULL, +/* cda6 */ NULL, +/* cda7 */ NULL, +/* cda8 */ NULL, +/* cda9 */ NULL, +/* cdaa */ NULL, +/* cdab */ NULL, +/* cdac */ NULL, +/* cdad */ NULL, +/* cdae */ NULL, +/* cdaf */ NULL, +/* cdb0 */ NULL, +/* cdb1 */ NULL, +/* cdb2 */ NULL, +/* cdb3 */ NULL, +/* cdb4 */ NULL, +/* cdb5 */ NULL, +/* cdb6 */ NULL, +/* cdb7 */ NULL, +/* cdb8 */ NULL, +/* cdb9 */ NULL, +/* cdba */ NULL, +/* cdbb */ NULL, +/* cdbc */ NULL, +/* cdbd */ NULL, +/* cdbe */ NULL, +/* cdbf */ NULL, +/* cdc0 */ NULL, +/* cdc1 */ NULL, +/* cdc2 */ NULL, +/* cdc3 */ NULL, +/* cdc4 */ NULL, +/* cdc5 */ NULL, +/* cdc6 */ NULL, +/* cdc7 */ NULL, +/* cdc8 */ NULL, +/* cdc9 */ NULL, +/* cdca */ NULL, +/* cdcb */ NULL, +/* cdcc */ NULL, +/* cdcd */ NULL, +/* cdce */ NULL, +/* cdcf */ NULL, +/* cdd0 */ NULL, +/* cdd1 */ NULL, +/* cdd2 */ NULL, +/* cdd3 */ NULL, +/* cdd4 */ NULL, +/* cdd5 */ NULL, +/* cdd6 */ NULL, +/* cdd7 */ NULL, +/* cdd8 */ NULL, +/* cdd9 */ NULL, +/* cdda */ NULL, +/* cddb */ NULL, +/* cddc */ NULL, +/* cddd */ NULL, +/* cdde */ NULL, +/* cddf */ NULL, +/* cde0 */ NULL, +/* cde1 */ NULL, +/* cde2 */ NULL, +/* cde3 */ NULL, +/* cde4 */ NULL, +/* cde5 */ NULL, +/* cde6 */ NULL, +/* cde7 */ NULL, +/* cde8 */ NULL, +/* cde9 */ NULL, +/* cdea */ NULL, +/* cdeb */ NULL, +/* cdec */ NULL, +/* cded */ NULL, +/* cdee */ NULL, +/* cdef */ NULL, +/* cdf0 */ NULL, +/* cdf1 */ NULL, +/* cdf2 */ NULL, +/* cdf3 */ NULL, +/* cdf4 */ NULL, +/* cdf5 */ NULL, +/* cdf6 */ NULL, +/* cdf7 */ NULL, +/* cdf8 */ NULL, +/* cdf9 */ NULL, +/* cdfa */ NULL, +/* cdfb */ NULL, +/* cdfc */ NULL, +/* cdfd */ NULL, +/* cdfe */ NULL, +/* cdff */ NULL, +/* ce00 */ NULL, +/* ce01 */ NULL, +/* ce02 */ NULL, +/* ce03 */ NULL, +/* ce04 */ NULL, +/* ce05 */ NULL, +/* ce06 */ NULL, +/* ce07 */ NULL, +/* ce08 */ NULL, +/* ce09 */ NULL, +/* ce0a */ NULL, +/* ce0b */ NULL, +/* ce0c */ NULL, +/* ce0d */ NULL, +/* ce0e */ NULL, +/* ce0f */ NULL, +/* ce10 */ NULL, +/* ce11 */ NULL, +/* ce12 */ NULL, +/* ce13 */ NULL, +/* ce14 */ NULL, +/* ce15 */ NULL, +/* ce16 */ NULL, +/* ce17 */ NULL, +/* ce18 */ NULL, +/* ce19 */ NULL, +/* ce1a */ NULL, +/* ce1b */ NULL, +/* ce1c */ NULL, +/* ce1d */ NULL, +/* ce1e */ NULL, +/* ce1f */ NULL, +/* ce20 */ NULL, +/* ce21 */ NULL, +/* ce22 */ NULL, +/* ce23 */ NULL, +/* ce24 */ NULL, +/* ce25 */ NULL, +/* ce26 */ NULL, +/* ce27 */ NULL, +/* ce28 */ NULL, +/* ce29 */ NULL, +/* ce2a */ NULL, +/* ce2b */ NULL, +/* ce2c */ NULL, +/* ce2d */ NULL, +/* ce2e */ NULL, +/* ce2f */ NULL, +/* ce30 */ NULL, +/* ce31 */ NULL, +/* ce32 */ NULL, +/* ce33 */ NULL, +/* ce34 */ NULL, +/* ce35 */ NULL, +/* ce36 */ NULL, +/* ce37 */ NULL, +/* ce38 */ NULL, +/* ce39 */ NULL, +/* ce3a */ NULL, +/* ce3b */ NULL, +/* ce3c */ NULL, +/* ce3d */ NULL, +/* ce3e */ NULL, +/* ce3f */ NULL, +/* ce40 */ NULL, +/* ce41 */ NULL, +/* ce42 */ NULL, +/* ce43 */ NULL, +/* ce44 */ NULL, +/* ce45 */ NULL, +/* ce46 */ NULL, +/* ce47 */ NULL, +/* ce48 */ NULL, +/* ce49 */ NULL, +/* ce4a */ NULL, +/* ce4b */ NULL, +/* ce4c */ NULL, +/* ce4d */ NULL, +/* ce4e */ NULL, +/* ce4f */ NULL, +/* ce50 */ NULL, +/* ce51 */ NULL, +/* ce52 */ NULL, +/* ce53 */ NULL, +/* ce54 */ NULL, +/* ce55 */ NULL, +/* ce56 */ NULL, +/* ce57 */ NULL, +/* ce58 */ NULL, +/* ce59 */ NULL, +/* ce5a */ NULL, +/* ce5b */ NULL, +/* ce5c */ NULL, +/* ce5d */ NULL, +/* ce5e */ NULL, +/* ce5f */ NULL, +/* ce60 */ NULL, +/* ce61 */ NULL, +/* ce62 */ NULL, +/* ce63 */ NULL, +/* ce64 */ NULL, +/* ce65 */ NULL, +/* ce66 */ NULL, +/* ce67 */ NULL, +/* ce68 */ NULL, +/* ce69 */ NULL, +/* ce6a */ NULL, +/* ce6b */ NULL, +/* ce6c */ NULL, +/* ce6d */ NULL, +/* ce6e */ NULL, +/* ce6f */ NULL, +/* ce70 */ NULL, +/* ce71 */ NULL, +/* ce72 */ NULL, +/* ce73 */ NULL, +/* ce74 */ NULL, +/* ce75 */ NULL, +/* ce76 */ NULL, +/* ce77 */ NULL, +/* ce78 */ NULL, +/* ce79 */ NULL, +/* ce7a */ NULL, +/* ce7b */ NULL, +/* ce7c */ NULL, +/* ce7d */ NULL, +/* ce7e */ NULL, +/* ce7f */ NULL, +/* ce80 */ NULL, +/* ce81 */ NULL, +/* ce82 */ NULL, +/* ce83 */ NULL, +/* ce84 */ NULL, +/* ce85 */ NULL, +/* ce86 */ NULL, +/* ce87 */ NULL, +/* ce88 */ NULL, +/* ce89 */ NULL, +/* ce8a */ NULL, +/* ce8b */ NULL, +/* ce8c */ NULL, +/* ce8d */ NULL, +/* ce8e */ NULL, +/* ce8f */ NULL, +/* ce90 */ NULL, +/* ce91 */ NULL, +/* ce92 */ NULL, +/* ce93 */ NULL, +/* ce94 */ NULL, +/* ce95 */ NULL, +/* ce96 */ NULL, +/* ce97 */ NULL, +/* ce98 */ NULL, +/* ce99 */ NULL, +/* ce9a */ NULL, +/* ce9b */ NULL, +/* ce9c */ NULL, +/* ce9d */ NULL, +/* ce9e */ NULL, +/* ce9f */ NULL, +/* cea0 */ NULL, +/* cea1 */ NULL, +/* cea2 */ NULL, +/* cea3 */ NULL, +/* cea4 */ NULL, +/* cea5 */ NULL, +/* cea6 */ NULL, +/* cea7 */ NULL, +/* cea8 */ NULL, +/* cea9 */ NULL, +/* ceaa */ NULL, +/* ceab */ NULL, +/* ceac */ NULL, +/* cead */ NULL, +/* ceae */ NULL, +/* ceaf */ NULL, +/* ceb0 */ NULL, +/* ceb1 */ NULL, +/* ceb2 */ NULL, +/* ceb3 */ NULL, +/* ceb4 */ NULL, +/* ceb5 */ NULL, +/* ceb6 */ NULL, +/* ceb7 */ NULL, +/* ceb8 */ NULL, +/* ceb9 */ NULL, +/* ceba */ NULL, +/* cebb */ NULL, +/* cebc */ NULL, +/* cebd */ NULL, +/* cebe */ NULL, +/* cebf */ NULL, +/* cec0 */ NULL, +/* cec1 */ NULL, +/* cec2 */ NULL, +/* cec3 */ NULL, +/* cec4 */ NULL, +/* cec5 */ NULL, +/* cec6 */ NULL, +/* cec7 */ NULL, +/* cec8 */ NULL, +/* cec9 */ NULL, +/* ceca */ NULL, +/* cecb */ NULL, +/* cecc */ NULL, +/* cecd */ NULL, +/* cece */ NULL, +/* cecf */ NULL, +/* ced0 */ NULL, +/* ced1 */ NULL, +/* ced2 */ NULL, +/* ced3 */ NULL, +/* ced4 */ NULL, +/* ced5 */ NULL, +/* ced6 */ NULL, +/* ced7 */ NULL, +/* ced8 */ NULL, +/* ced9 */ NULL, +/* ceda */ NULL, +/* cedb */ NULL, +/* cedc */ NULL, +/* cedd */ NULL, +/* cede */ NULL, +/* cedf */ NULL, +/* cee0 */ NULL, +/* cee1 */ NULL, +/* cee2 */ NULL, +/* cee3 */ NULL, +/* cee4 */ NULL, +/* cee5 */ NULL, +/* cee6 */ NULL, +/* cee7 */ NULL, +/* cee8 */ NULL, +/* cee9 */ NULL, +/* ceea */ NULL, +/* ceeb */ NULL, +/* ceec */ NULL, +/* ceed */ NULL, +/* ceee */ NULL, +/* ceef */ NULL, +/* cef0 */ NULL, +/* cef1 */ NULL, +/* cef2 */ NULL, +/* cef3 */ NULL, +/* cef4 */ NULL, +/* cef5 */ NULL, +/* cef6 */ NULL, +/* cef7 */ NULL, +/* cef8 */ NULL, +/* cef9 */ NULL, +/* cefa */ NULL, +/* cefb */ NULL, +/* cefc */ NULL, +/* cefd */ NULL, +/* cefe */ NULL, +/* ceff */ NULL, +/* cf00 */ NULL, +/* cf01 */ NULL, +/* cf02 */ NULL, +/* cf03 */ NULL, +/* cf04 */ NULL, +/* cf05 */ NULL, +/* cf06 */ NULL, +/* cf07 */ NULL, +/* cf08 */ NULL, +/* cf09 */ NULL, +/* cf0a */ NULL, +/* cf0b */ NULL, +/* cf0c */ NULL, +/* cf0d */ NULL, +/* cf0e */ NULL, +/* cf0f */ NULL, +/* cf10 */ NULL, +/* cf11 */ NULL, +/* cf12 */ NULL, +/* cf13 */ NULL, +/* cf14 */ NULL, +/* cf15 */ NULL, +/* cf16 */ NULL, +/* cf17 */ NULL, +/* cf18 */ NULL, +/* cf19 */ NULL, +/* cf1a */ NULL, +/* cf1b */ NULL, +/* cf1c */ NULL, +/* cf1d */ NULL, +/* cf1e */ NULL, +/* cf1f */ NULL, +/* cf20 */ NULL, +/* cf21 */ NULL, +/* cf22 */ NULL, +/* cf23 */ NULL, +/* cf24 */ NULL, +/* cf25 */ NULL, +/* cf26 */ NULL, +/* cf27 */ NULL, +/* cf28 */ NULL, +/* cf29 */ NULL, +/* cf2a */ NULL, +/* cf2b */ NULL, +/* cf2c */ NULL, +/* cf2d */ NULL, +/* cf2e */ NULL, +/* cf2f */ NULL, +/* cf30 */ NULL, +/* cf31 */ NULL, +/* cf32 */ NULL, +/* cf33 */ NULL, +/* cf34 */ NULL, +/* cf35 */ NULL, +/* cf36 */ NULL, +/* cf37 */ NULL, +/* cf38 */ NULL, +/* cf39 */ NULL, +/* cf3a */ NULL, +/* cf3b */ NULL, +/* cf3c */ NULL, +/* cf3d */ NULL, +/* cf3e */ NULL, +/* cf3f */ NULL, +/* cf40 */ NULL, +/* cf41 */ NULL, +/* cf42 */ NULL, +/* cf43 */ NULL, +/* cf44 */ NULL, +/* cf45 */ NULL, +/* cf46 */ NULL, +/* cf47 */ NULL, +/* cf48 */ NULL, +/* cf49 */ NULL, +/* cf4a */ NULL, +/* cf4b */ NULL, +/* cf4c */ NULL, +/* cf4d */ NULL, +/* cf4e */ NULL, +/* cf4f */ NULL, +/* cf50 */ NULL, +/* cf51 */ NULL, +/* cf52 */ NULL, +/* cf53 */ NULL, +/* cf54 */ NULL, +/* cf55 */ NULL, +/* cf56 */ NULL, +/* cf57 */ NULL, +/* cf58 */ NULL, +/* cf59 */ NULL, +/* cf5a */ NULL, +/* cf5b */ NULL, +/* cf5c */ NULL, +/* cf5d */ NULL, +/* cf5e */ NULL, +/* cf5f */ NULL, +/* cf60 */ NULL, +/* cf61 */ NULL, +/* cf62 */ NULL, +/* cf63 */ NULL, +/* cf64 */ NULL, +/* cf65 */ NULL, +/* cf66 */ NULL, +/* cf67 */ NULL, +/* cf68 */ NULL, +/* cf69 */ NULL, +/* cf6a */ NULL, +/* cf6b */ NULL, +/* cf6c */ NULL, +/* cf6d */ NULL, +/* cf6e */ NULL, +/* cf6f */ NULL, +/* cf70 */ NULL, +/* cf71 */ NULL, +/* cf72 */ NULL, +/* cf73 */ NULL, +/* cf74 */ NULL, +/* cf75 */ NULL, +/* cf76 */ NULL, +/* cf77 */ NULL, +/* cf78 */ NULL, +/* cf79 */ NULL, +/* cf7a */ NULL, +/* cf7b */ NULL, +/* cf7c */ NULL, +/* cf7d */ NULL, +/* cf7e */ NULL, +/* cf7f */ NULL, +/* cf80 */ NULL, +/* cf81 */ NULL, +/* cf82 */ NULL, +/* cf83 */ NULL, +/* cf84 */ NULL, +/* cf85 */ NULL, +/* cf86 */ NULL, +/* cf87 */ NULL, +/* cf88 */ NULL, +/* cf89 */ NULL, +/* cf8a */ NULL, +/* cf8b */ NULL, +/* cf8c */ NULL, +/* cf8d */ NULL, +/* cf8e */ NULL, +/* cf8f */ NULL, +/* cf90 */ NULL, +/* cf91 */ NULL, +/* cf92 */ NULL, +/* cf93 */ NULL, +/* cf94 */ NULL, +/* cf95 */ NULL, +/* cf96 */ NULL, +/* cf97 */ NULL, +/* cf98 */ NULL, +/* cf99 */ NULL, +/* cf9a */ NULL, +/* cf9b */ NULL, +/* cf9c */ NULL, +/* cf9d */ NULL, +/* cf9e */ NULL, +/* cf9f */ NULL, +/* cfa0 */ NULL, +/* cfa1 */ NULL, +/* cfa2 */ NULL, +/* cfa3 */ NULL, +/* cfa4 */ NULL, +/* cfa5 */ NULL, +/* cfa6 */ NULL, +/* cfa7 */ NULL, +/* cfa8 */ NULL, +/* cfa9 */ NULL, +/* cfaa */ NULL, +/* cfab */ NULL, +/* cfac */ NULL, +/* cfad */ NULL, +/* cfae */ NULL, +/* cfaf */ NULL, +/* cfb0 */ NULL, +/* cfb1 */ NULL, +/* cfb2 */ NULL, +/* cfb3 */ NULL, +/* cfb4 */ NULL, +/* cfb5 */ NULL, +/* cfb6 */ NULL, +/* cfb7 */ NULL, +/* cfb8 */ NULL, +/* cfb9 */ NULL, +/* cfba */ NULL, +/* cfbb */ NULL, +/* cfbc */ NULL, +/* cfbd */ NULL, +/* cfbe */ NULL, +/* cfbf */ NULL, +/* cfc0 */ NULL, +/* cfc1 */ NULL, +/* cfc2 */ NULL, +/* cfc3 */ NULL, +/* cfc4 */ NULL, +/* cfc5 */ NULL, +/* cfc6 */ NULL, +/* cfc7 */ NULL, +/* cfc8 */ NULL, +/* cfc9 */ NULL, +/* cfca */ NULL, +/* cfcb */ NULL, +/* cfcc */ NULL, +/* cfcd */ NULL, +/* cfce */ NULL, +/* cfcf */ NULL, +/* cfd0 */ NULL, +/* cfd1 */ NULL, +/* cfd2 */ NULL, +/* cfd3 */ NULL, +/* cfd4 */ NULL, +/* cfd5 */ NULL, +/* cfd6 */ NULL, +/* cfd7 */ NULL, +/* cfd8 */ NULL, +/* cfd9 */ NULL, +/* cfda */ NULL, +/* cfdb */ NULL, +/* cfdc */ NULL, +/* cfdd */ NULL, +/* cfde */ NULL, +/* cfdf */ NULL, +/* cfe0 */ NULL, +/* cfe1 */ NULL, +/* cfe2 */ NULL, +/* cfe3 */ NULL, +/* cfe4 */ NULL, +/* cfe5 */ NULL, +/* cfe6 */ NULL, +/* cfe7 */ NULL, +/* cfe8 */ NULL, +/* cfe9 */ NULL, +/* cfea */ NULL, +/* cfeb */ NULL, +/* cfec */ NULL, +/* cfed */ NULL, +/* cfee */ NULL, +/* cfef */ NULL, +/* cff0 */ NULL, +/* cff1 */ NULL, +/* cff2 */ NULL, +/* cff3 */ NULL, +/* cff4 */ NULL, +/* cff5 */ NULL, +/* cff6 */ NULL, +/* cff7 */ NULL, +/* cff8 */ NULL, +/* cff9 */ NULL, +/* cffa */ NULL, +/* cffb */ NULL, +/* cffc */ NULL, +/* cffd */ NULL, +/* cffe */ NULL, +/* cfff */ NULL, +/* d000 */ NULL, +/* d001 */ NULL, +/* d002 */ NULL, +/* d003 */ NULL, +/* d004 */ NULL, +/* d005 */ NULL, +/* d006 */ NULL, +/* d007 */ NULL, +/* d008 */ NULL, +/* d009 */ NULL, +/* d00a */ NULL, +/* d00b */ NULL, +/* d00c */ NULL, +/* d00d */ NULL, +/* d00e */ NULL, +/* d00f */ NULL, +/* d010 */ NULL, +/* d011 */ NULL, +/* d012 */ NULL, +/* d013 */ NULL, +/* d014 */ NULL, +/* d015 */ NULL, +/* d016 */ NULL, +/* d017 */ NULL, +/* d018 */ NULL, +/* d019 */ NULL, +/* d01a */ NULL, +/* d01b */ NULL, +/* d01c */ NULL, +/* d01d */ NULL, +/* d01e */ NULL, +/* d01f */ NULL, +/* d020 */ NULL, +/* d021 */ NULL, +/* d022 */ NULL, +/* d023 */ NULL, +/* d024 */ NULL, +/* d025 */ NULL, +/* d026 */ NULL, +/* d027 */ NULL, +/* d028 */ NULL, +/* d029 */ NULL, +/* d02a */ NULL, +/* d02b */ NULL, +/* d02c */ NULL, +/* d02d */ NULL, +/* d02e */ NULL, +/* d02f */ NULL, +/* d030 */ NULL, +/* d031 */ NULL, +/* d032 */ NULL, +/* d033 */ NULL, +/* d034 */ NULL, +/* d035 */ NULL, +/* d036 */ NULL, +/* d037 */ NULL, +/* d038 */ NULL, +/* d039 */ NULL, +/* d03a */ NULL, +/* d03b */ NULL, +/* d03c */ NULL, +/* d03d */ NULL, +/* d03e */ NULL, +/* d03f */ NULL, +/* d040 */ NULL, +/* d041 */ NULL, +/* d042 */ NULL, +/* d043 */ NULL, +/* d044 */ NULL, +/* d045 */ NULL, +/* d046 */ NULL, +/* d047 */ NULL, +/* d048 */ NULL, +/* d049 */ NULL, +/* d04a */ NULL, +/* d04b */ NULL, +/* d04c */ NULL, +/* d04d */ NULL, +/* d04e */ NULL, +/* d04f */ NULL, +/* d050 */ NULL, +/* d051 */ NULL, +/* d052 */ NULL, +/* d053 */ NULL, +/* d054 */ NULL, +/* d055 */ NULL, +/* d056 */ NULL, +/* d057 */ NULL, +/* d058 */ NULL, +/* d059 */ NULL, +/* d05a */ NULL, +/* d05b */ NULL, +/* d05c */ NULL, +/* d05d */ NULL, +/* d05e */ NULL, +/* d05f */ NULL, +/* d060 */ NULL, +/* d061 */ NULL, +/* d062 */ NULL, +/* d063 */ NULL, +/* d064 */ NULL, +/* d065 */ NULL, +/* d066 */ NULL, +/* d067 */ NULL, +/* d068 */ NULL, +/* d069 */ NULL, +/* d06a */ NULL, +/* d06b */ NULL, +/* d06c */ NULL, +/* d06d */ NULL, +/* d06e */ NULL, +/* d06f */ NULL, +/* d070 */ NULL, +/* d071 */ NULL, +/* d072 */ NULL, +/* d073 */ NULL, +/* d074 */ NULL, +/* d075 */ NULL, +/* d076 */ NULL, +/* d077 */ NULL, +/* d078 */ NULL, +/* d079 */ NULL, +/* d07a */ NULL, +/* d07b */ NULL, +/* d07c */ NULL, +/* d07d */ NULL, +/* d07e */ NULL, +/* d07f */ NULL, +/* d080 */ NULL, +/* d081 */ NULL, +/* d082 */ NULL, +/* d083 */ NULL, +/* d084 */ NULL, +/* d085 */ NULL, +/* d086 */ NULL, +/* d087 */ NULL, +/* d088 */ NULL, +/* d089 */ NULL, +/* d08a */ NULL, +/* d08b */ NULL, +/* d08c */ NULL, +/* d08d */ NULL, +/* d08e */ NULL, +/* d08f */ NULL, +/* d090 */ NULL, +/* d091 */ NULL, +/* d092 */ NULL, +/* d093 */ NULL, +/* d094 */ NULL, +/* d095 */ NULL, +/* d096 */ NULL, +/* d097 */ NULL, +/* d098 */ NULL, +/* d099 */ NULL, +/* d09a */ NULL, +/* d09b */ NULL, +/* d09c */ NULL, +/* d09d */ NULL, +/* d09e */ NULL, +/* d09f */ NULL, +/* d0a0 */ NULL, +/* d0a1 */ NULL, +/* d0a2 */ NULL, +/* d0a3 */ NULL, +/* d0a4 */ NULL, +/* d0a5 */ NULL, +/* d0a6 */ NULL, +/* d0a7 */ NULL, +/* d0a8 */ NULL, +/* d0a9 */ NULL, +/* d0aa */ NULL, +/* d0ab */ NULL, +/* d0ac */ NULL, +/* d0ad */ NULL, +/* d0ae */ NULL, +/* d0af */ NULL, +/* d0b0 */ NULL, +/* d0b1 */ NULL, +/* d0b2 */ NULL, +/* d0b3 */ NULL, +/* d0b4 */ NULL, +/* d0b5 */ NULL, +/* d0b6 */ NULL, +/* d0b7 */ NULL, +/* d0b8 */ NULL, +/* d0b9 */ NULL, +/* d0ba */ NULL, +/* d0bb */ NULL, +/* d0bc */ NULL, +/* d0bd */ NULL, +/* d0be */ NULL, +/* d0bf */ NULL, +/* d0c0 */ NULL, +/* d0c1 */ NULL, +/* d0c2 */ NULL, +/* d0c3 */ NULL, +/* d0c4 */ NULL, +/* d0c5 */ NULL, +/* d0c6 */ NULL, +/* d0c7 */ NULL, +/* d0c8 */ NULL, +/* d0c9 */ NULL, +/* d0ca */ NULL, +/* d0cb */ NULL, +/* d0cc */ NULL, +/* d0cd */ NULL, +/* d0ce */ NULL, +/* d0cf */ NULL, +/* d0d0 */ NULL, +/* d0d1 */ NULL, +/* d0d2 */ NULL, +/* d0d3 */ NULL, +/* d0d4 */ NULL, +/* d0d5 */ NULL, +/* d0d6 */ NULL, +/* d0d7 */ NULL, +/* d0d8 */ NULL, +/* d0d9 */ NULL, +/* d0da */ NULL, +/* d0db */ NULL, +/* d0dc */ NULL, +/* d0dd */ NULL, +/* d0de */ NULL, +/* d0df */ NULL, +/* d0e0 */ NULL, +/* d0e1 */ NULL, +/* d0e2 */ NULL, +/* d0e3 */ NULL, +/* d0e4 */ NULL, +/* d0e5 */ NULL, +/* d0e6 */ NULL, +/* d0e7 */ NULL, +/* d0e8 */ NULL, +/* d0e9 */ NULL, +/* d0ea */ NULL, +/* d0eb */ NULL, +/* d0ec */ NULL, +/* d0ed */ NULL, +/* d0ee */ NULL, +/* d0ef */ NULL, +/* d0f0 */ NULL, +/* d0f1 */ NULL, +/* d0f2 */ NULL, +/* d0f3 */ NULL, +/* d0f4 */ NULL, +/* d0f5 */ NULL, +/* d0f6 */ NULL, +/* d0f7 */ NULL, +/* d0f8 */ NULL, +/* d0f9 */ NULL, +/* d0fa */ NULL, +/* d0fb */ NULL, +/* d0fc */ NULL, +/* d0fd */ NULL, +/* d0fe */ NULL, +/* d0ff */ NULL, +/* d100 */ NULL, +/* d101 */ NULL, +/* d102 */ NULL, +/* d103 */ NULL, +/* d104 */ NULL, +/* d105 */ NULL, +/* d106 */ NULL, +/* d107 */ NULL, +/* d108 */ NULL, +/* d109 */ NULL, +/* d10a */ NULL, +/* d10b */ NULL, +/* d10c */ NULL, +/* d10d */ NULL, +/* d10e */ NULL, +/* d10f */ NULL, +/* d110 */ NULL, +/* d111 */ NULL, +/* d112 */ NULL, +/* d113 */ NULL, +/* d114 */ NULL, +/* d115 */ NULL, +/* d116 */ NULL, +/* d117 */ NULL, +/* d118 */ NULL, +/* d119 */ NULL, +/* d11a */ NULL, +/* d11b */ NULL, +/* d11c */ NULL, +/* d11d */ NULL, +/* d11e */ NULL, +/* d11f */ NULL, +/* d120 */ NULL, +/* d121 */ NULL, +/* d122 */ NULL, +/* d123 */ NULL, +/* d124 */ NULL, +/* d125 */ NULL, +/* d126 */ NULL, +/* d127 */ NULL, +/* d128 */ NULL, +/* d129 */ NULL, +/* d12a */ NULL, +/* d12b */ NULL, +/* d12c */ NULL, +/* d12d */ NULL, +/* d12e */ NULL, +/* d12f */ NULL, +/* d130 */ NULL, +/* d131 */ NULL, +/* d132 */ NULL, +/* d133 */ NULL, +/* d134 */ NULL, +/* d135 */ NULL, +/* d136 */ NULL, +/* d137 */ NULL, +/* d138 */ NULL, +/* d139 */ NULL, +/* d13a */ NULL, +/* d13b */ NULL, +/* d13c */ NULL, +/* d13d */ NULL, +/* d13e */ NULL, +/* d13f */ NULL, +/* d140 */ NULL, +/* d141 */ NULL, +/* d142 */ NULL, +/* d143 */ NULL, +/* d144 */ NULL, +/* d145 */ NULL, +/* d146 */ NULL, +/* d147 */ NULL, +/* d148 */ NULL, +/* d149 */ NULL, +/* d14a */ NULL, +/* d14b */ NULL, +/* d14c */ NULL, +/* d14d */ NULL, +/* d14e */ NULL, +/* d14f */ NULL, +/* d150 */ NULL, +/* d151 */ NULL, +/* d152 */ NULL, +/* d153 */ NULL, +/* d154 */ NULL, +/* d155 */ NULL, +/* d156 */ NULL, +/* d157 */ NULL, +/* d158 */ NULL, +/* d159 */ NULL, +/* d15a */ NULL, +/* d15b */ NULL, +/* d15c */ NULL, +/* d15d */ NULL, +/* d15e */ NULL, +/* d15f */ NULL, +/* d160 */ NULL, +/* d161 */ NULL, +/* d162 */ NULL, +/* d163 */ NULL, +/* d164 */ NULL, +/* d165 */ NULL, +/* d166 */ NULL, +/* d167 */ NULL, +/* d168 */ NULL, +/* d169 */ NULL, +/* d16a */ NULL, +/* d16b */ NULL, +/* d16c */ NULL, +/* d16d */ NULL, +/* d16e */ NULL, +/* d16f */ NULL, +/* d170 */ NULL, +/* d171 */ NULL, +/* d172 */ NULL, +/* d173 */ NULL, +/* d174 */ NULL, +/* d175 */ NULL, +/* d176 */ NULL, +/* d177 */ NULL, +/* d178 */ NULL, +/* d179 */ NULL, +/* d17a */ NULL, +/* d17b */ NULL, +/* d17c */ NULL, +/* d17d */ NULL, +/* d17e */ NULL, +/* d17f */ NULL, +/* d180 */ NULL, +/* d181 */ NULL, +/* d182 */ NULL, +/* d183 */ NULL, +/* d184 */ NULL, +/* d185 */ NULL, +/* d186 */ NULL, +/* d187 */ NULL, +/* d188 */ NULL, +/* d189 */ NULL, +/* d18a */ NULL, +/* d18b */ NULL, +/* d18c */ NULL, +/* d18d */ NULL, +/* d18e */ NULL, +/* d18f */ NULL, +/* d190 */ NULL, +/* d191 */ NULL, +/* d192 */ NULL, +/* d193 */ NULL, +/* d194 */ NULL, +/* d195 */ NULL, +/* d196 */ NULL, +/* d197 */ NULL, +/* d198 */ NULL, +/* d199 */ NULL, +/* d19a */ NULL, +/* d19b */ NULL, +/* d19c */ NULL, +/* d19d */ NULL, +/* d19e */ NULL, +/* d19f */ NULL, +/* d1a0 */ NULL, +/* d1a1 */ NULL, +/* d1a2 */ NULL, +/* d1a3 */ NULL, +/* d1a4 */ NULL, +/* d1a5 */ NULL, +/* d1a6 */ NULL, +/* d1a7 */ NULL, +/* d1a8 */ NULL, +/* d1a9 */ NULL, +/* d1aa */ NULL, +/* d1ab */ NULL, +/* d1ac */ NULL, +/* d1ad */ NULL, +/* d1ae */ NULL, +/* d1af */ NULL, +/* d1b0 */ NULL, +/* d1b1 */ NULL, +/* d1b2 */ NULL, +/* d1b3 */ NULL, +/* d1b4 */ NULL, +/* d1b5 */ NULL, +/* d1b6 */ NULL, +/* d1b7 */ NULL, +/* d1b8 */ NULL, +/* d1b9 */ NULL, +/* d1ba */ NULL, +/* d1bb */ NULL, +/* d1bc */ NULL, +/* d1bd */ NULL, +/* d1be */ NULL, +/* d1bf */ NULL, +/* d1c0 */ NULL, +/* d1c1 */ NULL, +/* d1c2 */ NULL, +/* d1c3 */ NULL, +/* d1c4 */ NULL, +/* d1c5 */ NULL, +/* d1c6 */ NULL, +/* d1c7 */ NULL, +/* d1c8 */ NULL, +/* d1c9 */ NULL, +/* d1ca */ NULL, +/* d1cb */ NULL, +/* d1cc */ NULL, +/* d1cd */ NULL, +/* d1ce */ NULL, +/* d1cf */ NULL, +/* d1d0 */ NULL, +/* d1d1 */ NULL, +/* d1d2 */ NULL, +/* d1d3 */ NULL, +/* d1d4 */ NULL, +/* d1d5 */ NULL, +/* d1d6 */ NULL, +/* d1d7 */ NULL, +/* d1d8 */ NULL, +/* d1d9 */ NULL, +/* d1da */ NULL, +/* d1db */ NULL, +/* d1dc */ NULL, +/* d1dd */ NULL, +/* d1de */ NULL, +/* d1df */ NULL, +/* d1e0 */ NULL, +/* d1e1 */ NULL, +/* d1e2 */ NULL, +/* d1e3 */ NULL, +/* d1e4 */ NULL, +/* d1e5 */ NULL, +/* d1e6 */ NULL, +/* d1e7 */ NULL, +/* d1e8 */ NULL, +/* d1e9 */ NULL, +/* d1ea */ NULL, +/* d1eb */ NULL, +/* d1ec */ NULL, +/* d1ed */ NULL, +/* d1ee */ NULL, +/* d1ef */ NULL, +/* d1f0 */ NULL, +/* d1f1 */ NULL, +/* d1f2 */ NULL, +/* d1f3 */ NULL, +/* d1f4 */ NULL, +/* d1f5 */ NULL, +/* d1f6 */ NULL, +/* d1f7 */ NULL, +/* d1f8 */ NULL, +/* d1f9 */ NULL, +/* d1fa */ NULL, +/* d1fb */ NULL, +/* d1fc */ NULL, +/* d1fd */ NULL, +/* d1fe */ NULL, +/* d1ff */ NULL, +/* d200 */ NULL, +/* d201 */ NULL, +/* d202 */ NULL, +/* d203 */ NULL, +/* d204 */ NULL, +/* d205 */ NULL, +/* d206 */ NULL, +/* d207 */ NULL, +/* d208 */ NULL, +/* d209 */ NULL, +/* d20a */ NULL, +/* d20b */ NULL, +/* d20c */ NULL, +/* d20d */ NULL, +/* d20e */ NULL, +/* d20f */ NULL, +/* d210 */ NULL, +/* d211 */ NULL, +/* d212 */ NULL, +/* d213 */ NULL, +/* d214 */ NULL, +/* d215 */ NULL, +/* d216 */ NULL, +/* d217 */ NULL, +/* d218 */ NULL, +/* d219 */ NULL, +/* d21a */ NULL, +/* d21b */ NULL, +/* d21c */ NULL, +/* d21d */ NULL, +/* d21e */ NULL, +/* d21f */ NULL, +/* d220 */ NULL, +/* d221 */ NULL, +/* d222 */ NULL, +/* d223 */ NULL, +/* d224 */ NULL, +/* d225 */ NULL, +/* d226 */ NULL, +/* d227 */ NULL, +/* d228 */ NULL, +/* d229 */ NULL, +/* d22a */ NULL, +/* d22b */ NULL, +/* d22c */ NULL, +/* d22d */ NULL, +/* d22e */ NULL, +/* d22f */ NULL, +/* d230 */ NULL, +/* d231 */ NULL, +/* d232 */ NULL, +/* d233 */ NULL, +/* d234 */ NULL, +/* d235 */ NULL, +/* d236 */ NULL, +/* d237 */ NULL, +/* d238 */ NULL, +/* d239 */ NULL, +/* d23a */ NULL, +/* d23b */ NULL, +/* d23c */ NULL, +/* d23d */ NULL, +/* d23e */ NULL, +/* d23f */ NULL, +/* d240 */ NULL, +/* d241 */ NULL, +/* d242 */ NULL, +/* d243 */ NULL, +/* d244 */ NULL, +/* d245 */ NULL, +/* d246 */ NULL, +/* d247 */ NULL, +/* d248 */ NULL, +/* d249 */ NULL, +/* d24a */ NULL, +/* d24b */ NULL, +/* d24c */ NULL, +/* d24d */ NULL, +/* d24e */ NULL, +/* d24f */ NULL, +/* d250 */ NULL, +/* d251 */ NULL, +/* d252 */ NULL, +/* d253 */ NULL, +/* d254 */ NULL, +/* d255 */ NULL, +/* d256 */ NULL, +/* d257 */ NULL, +/* d258 */ NULL, +/* d259 */ NULL, +/* d25a */ NULL, +/* d25b */ NULL, +/* d25c */ NULL, +/* d25d */ NULL, +/* d25e */ NULL, +/* d25f */ NULL, +/* d260 */ NULL, +/* d261 */ NULL, +/* d262 */ NULL, +/* d263 */ NULL, +/* d264 */ NULL, +/* d265 */ NULL, +/* d266 */ NULL, +/* d267 */ NULL, +/* d268 */ NULL, +/* d269 */ NULL, +/* d26a */ NULL, +/* d26b */ NULL, +/* d26c */ NULL, +/* d26d */ NULL, +/* d26e */ NULL, +/* d26f */ NULL, +/* d270 */ NULL, +/* d271 */ NULL, +/* d272 */ NULL, +/* d273 */ NULL, +/* d274 */ NULL, +/* d275 */ NULL, +/* d276 */ NULL, +/* d277 */ NULL, +/* d278 */ NULL, +/* d279 */ NULL, +/* d27a */ NULL, +/* d27b */ NULL, +/* d27c */ NULL, +/* d27d */ NULL, +/* d27e */ NULL, +/* d27f */ NULL, +/* d280 */ NULL, +/* d281 */ NULL, +/* d282 */ NULL, +/* d283 */ NULL, +/* d284 */ NULL, +/* d285 */ NULL, +/* d286 */ NULL, +/* d287 */ NULL, +/* d288 */ NULL, +/* d289 */ NULL, +/* d28a */ NULL, +/* d28b */ NULL, +/* d28c */ NULL, +/* d28d */ NULL, +/* d28e */ NULL, +/* d28f */ NULL, +/* d290 */ NULL, +/* d291 */ NULL, +/* d292 */ NULL, +/* d293 */ NULL, +/* d294 */ NULL, +/* d295 */ NULL, +/* d296 */ NULL, +/* d297 */ NULL, +/* d298 */ NULL, +/* d299 */ NULL, +/* d29a */ NULL, +/* d29b */ NULL, +/* d29c */ NULL, +/* d29d */ NULL, +/* d29e */ NULL, +/* d29f */ NULL, +/* d2a0 */ NULL, +/* d2a1 */ NULL, +/* d2a2 */ NULL, +/* d2a3 */ NULL, +/* d2a4 */ NULL, +/* d2a5 */ NULL, +/* d2a6 */ NULL, +/* d2a7 */ NULL, +/* d2a8 */ NULL, +/* d2a9 */ NULL, +/* d2aa */ NULL, +/* d2ab */ NULL, +/* d2ac */ NULL, +/* d2ad */ NULL, +/* d2ae */ NULL, +/* d2af */ NULL, +/* d2b0 */ NULL, +/* d2b1 */ NULL, +/* d2b2 */ NULL, +/* d2b3 */ NULL, +/* d2b4 */ NULL, +/* d2b5 */ NULL, +/* d2b6 */ NULL, +/* d2b7 */ NULL, +/* d2b8 */ NULL, +/* d2b9 */ NULL, +/* d2ba */ NULL, +/* d2bb */ NULL, +/* d2bc */ NULL, +/* d2bd */ NULL, +/* d2be */ NULL, +/* d2bf */ NULL, +/* d2c0 */ NULL, +/* d2c1 */ NULL, +/* d2c2 */ NULL, +/* d2c3 */ NULL, +/* d2c4 */ NULL, +/* d2c5 */ NULL, +/* d2c6 */ NULL, +/* d2c7 */ NULL, +/* d2c8 */ NULL, +/* d2c9 */ NULL, +/* d2ca */ NULL, +/* d2cb */ NULL, +/* d2cc */ NULL, +/* d2cd */ NULL, +/* d2ce */ NULL, +/* d2cf */ NULL, +/* d2d0 */ NULL, +/* d2d1 */ NULL, +/* d2d2 */ NULL, +/* d2d3 */ NULL, +/* d2d4 */ NULL, +/* d2d5 */ NULL, +/* d2d6 */ NULL, +/* d2d7 */ NULL, +/* d2d8 */ NULL, +/* d2d9 */ NULL, +/* d2da */ NULL, +/* d2db */ NULL, +/* d2dc */ NULL, +/* d2dd */ NULL, +/* d2de */ NULL, +/* d2df */ NULL, +/* d2e0 */ NULL, +/* d2e1 */ NULL, +/* d2e2 */ NULL, +/* d2e3 */ NULL, +/* d2e4 */ NULL, +/* d2e5 */ NULL, +/* d2e6 */ NULL, +/* d2e7 */ NULL, +/* d2e8 */ NULL, +/* d2e9 */ NULL, +/* d2ea */ NULL, +/* d2eb */ NULL, +/* d2ec */ NULL, +/* d2ed */ NULL, +/* d2ee */ NULL, +/* d2ef */ NULL, +/* d2f0 */ NULL, +/* d2f1 */ NULL, +/* d2f2 */ NULL, +/* d2f3 */ NULL, +/* d2f4 */ NULL, +/* d2f5 */ NULL, +/* d2f6 */ NULL, +/* d2f7 */ NULL, +/* d2f8 */ NULL, +/* d2f9 */ NULL, +/* d2fa */ NULL, +/* d2fb */ NULL, +/* d2fc */ NULL, +/* d2fd */ NULL, +/* d2fe */ NULL, +/* d2ff */ NULL, +/* d300 */ NULL, +/* d301 */ NULL, +/* d302 */ NULL, +/* d303 */ NULL, +/* d304 */ NULL, +/* d305 */ NULL, +/* d306 */ NULL, +/* d307 */ NULL, +/* d308 */ NULL, +/* d309 */ NULL, +/* d30a */ NULL, +/* d30b */ NULL, +/* d30c */ NULL, +/* d30d */ NULL, +/* d30e */ NULL, +/* d30f */ NULL, +/* d310 */ NULL, +/* d311 */ NULL, +/* d312 */ NULL, +/* d313 */ NULL, +/* d314 */ NULL, +/* d315 */ NULL, +/* d316 */ NULL, +/* d317 */ NULL, +/* d318 */ NULL, +/* d319 */ NULL, +/* d31a */ NULL, +/* d31b */ NULL, +/* d31c */ NULL, +/* d31d */ NULL, +/* d31e */ NULL, +/* d31f */ NULL, +/* d320 */ NULL, +/* d321 */ NULL, +/* d322 */ NULL, +/* d323 */ NULL, +/* d324 */ NULL, +/* d325 */ NULL, +/* d326 */ NULL, +/* d327 */ NULL, +/* d328 */ NULL, +/* d329 */ NULL, +/* d32a */ NULL, +/* d32b */ NULL, +/* d32c */ NULL, +/* d32d */ NULL, +/* d32e */ NULL, +/* d32f */ NULL, +/* d330 */ NULL, +/* d331 */ NULL, +/* d332 */ NULL, +/* d333 */ NULL, +/* d334 */ NULL, +/* d335 */ NULL, +/* d336 */ NULL, +/* d337 */ NULL, +/* d338 */ NULL, +/* d339 */ NULL, +/* d33a */ NULL, +/* d33b */ NULL, +/* d33c */ NULL, +/* d33d */ NULL, +/* d33e */ NULL, +/* d33f */ NULL, +/* d340 */ NULL, +/* d341 */ NULL, +/* d342 */ NULL, +/* d343 */ NULL, +/* d344 */ NULL, +/* d345 */ NULL, +/* d346 */ NULL, +/* d347 */ NULL, +/* d348 */ NULL, +/* d349 */ NULL, +/* d34a */ NULL, +/* d34b */ NULL, +/* d34c */ NULL, +/* d34d */ NULL, +/* d34e */ NULL, +/* d34f */ NULL, +/* d350 */ NULL, +/* d351 */ NULL, +/* d352 */ NULL, +/* d353 */ NULL, +/* d354 */ NULL, +/* d355 */ NULL, +/* d356 */ NULL, +/* d357 */ NULL, +/* d358 */ NULL, +/* d359 */ NULL, +/* d35a */ NULL, +/* d35b */ NULL, +/* d35c */ NULL, +/* d35d */ NULL, +/* d35e */ NULL, +/* d35f */ NULL, +/* d360 */ NULL, +/* d361 */ NULL, +/* d362 */ NULL, +/* d363 */ NULL, +/* d364 */ NULL, +/* d365 */ NULL, +/* d366 */ NULL, +/* d367 */ NULL, +/* d368 */ NULL, +/* d369 */ NULL, +/* d36a */ NULL, +/* d36b */ NULL, +/* d36c */ NULL, +/* d36d */ NULL, +/* d36e */ NULL, +/* d36f */ NULL, +/* d370 */ NULL, +/* d371 */ NULL, +/* d372 */ NULL, +/* d373 */ NULL, +/* d374 */ NULL, +/* d375 */ NULL, +/* d376 */ NULL, +/* d377 */ NULL, +/* d378 */ NULL, +/* d379 */ NULL, +/* d37a */ NULL, +/* d37b */ NULL, +/* d37c */ NULL, +/* d37d */ NULL, +/* d37e */ NULL, +/* d37f */ NULL, +/* d380 */ NULL, +/* d381 */ NULL, +/* d382 */ NULL, +/* d383 */ NULL, +/* d384 */ NULL, +/* d385 */ NULL, +/* d386 */ NULL, +/* d387 */ NULL, +/* d388 */ NULL, +/* d389 */ NULL, +/* d38a */ NULL, +/* d38b */ NULL, +/* d38c */ NULL, +/* d38d */ NULL, +/* d38e */ NULL, +/* d38f */ NULL, +/* d390 */ NULL, +/* d391 */ NULL, +/* d392 */ NULL, +/* d393 */ NULL, +/* d394 */ NULL, +/* d395 */ NULL, +/* d396 */ NULL, +/* d397 */ NULL, +/* d398 */ NULL, +/* d399 */ NULL, +/* d39a */ NULL, +/* d39b */ NULL, +/* d39c */ NULL, +/* d39d */ NULL, +/* d39e */ NULL, +/* d39f */ NULL, +/* d3a0 */ NULL, +/* d3a1 */ NULL, +/* d3a2 */ NULL, +/* d3a3 */ NULL, +/* d3a4 */ NULL, +/* d3a5 */ NULL, +/* d3a6 */ NULL, +/* d3a7 */ NULL, +/* d3a8 */ NULL, +/* d3a9 */ NULL, +/* d3aa */ NULL, +/* d3ab */ NULL, +/* d3ac */ NULL, +/* d3ad */ NULL, +/* d3ae */ NULL, +/* d3af */ NULL, +/* d3b0 */ NULL, +/* d3b1 */ NULL, +/* d3b2 */ NULL, +/* d3b3 */ NULL, +/* d3b4 */ NULL, +/* d3b5 */ NULL, +/* d3b6 */ NULL, +/* d3b7 */ NULL, +/* d3b8 */ NULL, +/* d3b9 */ NULL, +/* d3ba */ NULL, +/* d3bb */ NULL, +/* d3bc */ NULL, +/* d3bd */ NULL, +/* d3be */ NULL, +/* d3bf */ NULL, +/* d3c0 */ NULL, +/* d3c1 */ NULL, +/* d3c2 */ NULL, +/* d3c3 */ NULL, +/* d3c4 */ NULL, +/* d3c5 */ NULL, +/* d3c6 */ NULL, +/* d3c7 */ NULL, +/* d3c8 */ NULL, +/* d3c9 */ NULL, +/* d3ca */ NULL, +/* d3cb */ NULL, +/* d3cc */ NULL, +/* d3cd */ NULL, +/* d3ce */ NULL, +/* d3cf */ NULL, +/* d3d0 */ NULL, +/* d3d1 */ NULL, +/* d3d2 */ NULL, +/* d3d3 */ NULL, +/* d3d4 */ NULL, +/* d3d5 */ NULL, +/* d3d6 */ NULL, +/* d3d7 */ NULL, +/* d3d8 */ NULL, +/* d3d9 */ NULL, +/* d3da */ NULL, +/* d3db */ NULL, +/* d3dc */ NULL, +/* d3dd */ NULL, +/* d3de */ NULL, +/* d3df */ NULL, +/* d3e0 */ NULL, +/* d3e1 */ NULL, +/* d3e2 */ NULL, +/* d3e3 */ NULL, +/* d3e4 */ NULL, +/* d3e5 */ NULL, +/* d3e6 */ NULL, +/* d3e7 */ NULL, +/* d3e8 */ NULL, +/* d3e9 */ NULL, +/* d3ea */ NULL, +/* d3eb */ NULL, +/* d3ec */ NULL, +/* d3ed */ NULL, +/* d3ee */ NULL, +/* d3ef */ NULL, +/* d3f0 */ NULL, +/* d3f1 */ NULL, +/* d3f2 */ NULL, +/* d3f3 */ NULL, +/* d3f4 */ NULL, +/* d3f5 */ NULL, +/* d3f6 */ NULL, +/* d3f7 */ NULL, +/* d3f8 */ NULL, +/* d3f9 */ NULL, +/* d3fa */ NULL, +/* d3fb */ NULL, +/* d3fc */ NULL, +/* d3fd */ NULL, +/* d3fe */ NULL, +/* d3ff */ NULL, +/* d400 */ NULL, +/* d401 */ NULL, +/* d402 */ NULL, +/* d403 */ NULL, +/* d404 */ NULL, +/* d405 */ NULL, +/* d406 */ NULL, +/* d407 */ NULL, +/* d408 */ NULL, +/* d409 */ NULL, +/* d40a */ NULL, +/* d40b */ NULL, +/* d40c */ NULL, +/* d40d */ NULL, +/* d40e */ NULL, +/* d40f */ NULL, +/* d410 */ NULL, +/* d411 */ NULL, +/* d412 */ NULL, +/* d413 */ NULL, +/* d414 */ NULL, +/* d415 */ NULL, +/* d416 */ NULL, +/* d417 */ NULL, +/* d418 */ NULL, +/* d419 */ NULL, +/* d41a */ NULL, +/* d41b */ NULL, +/* d41c */ NULL, +/* d41d */ NULL, +/* d41e */ NULL, +/* d41f */ NULL, +/* d420 */ NULL, +/* d421 */ NULL, +/* d422 */ NULL, +/* d423 */ NULL, +/* d424 */ NULL, +/* d425 */ NULL, +/* d426 */ NULL, +/* d427 */ NULL, +/* d428 */ NULL, +/* d429 */ NULL, +/* d42a */ NULL, +/* d42b */ NULL, +/* d42c */ NULL, +/* d42d */ NULL, +/* d42e */ NULL, +/* d42f */ NULL, +/* d430 */ NULL, +/* d431 */ NULL, +/* d432 */ NULL, +/* d433 */ NULL, +/* d434 */ NULL, +/* d435 */ NULL, +/* d436 */ NULL, +/* d437 */ NULL, +/* d438 */ NULL, +/* d439 */ NULL, +/* d43a */ NULL, +/* d43b */ NULL, +/* d43c */ NULL, +/* d43d */ NULL, +/* d43e */ NULL, +/* d43f */ NULL, +/* d440 */ NULL, +/* d441 */ NULL, +/* d442 */ NULL, +/* d443 */ NULL, +/* d444 */ NULL, +/* d445 */ NULL, +/* d446 */ NULL, +/* d447 */ NULL, +/* d448 */ NULL, +/* d449 */ NULL, +/* d44a */ NULL, +/* d44b */ NULL, +/* d44c */ NULL, +/* d44d */ NULL, +/* d44e */ NULL, +/* d44f */ NULL, +/* d450 */ NULL, +/* d451 */ NULL, +/* d452 */ NULL, +/* d453 */ NULL, +/* d454 */ NULL, +/* d455 */ NULL, +/* d456 */ NULL, +/* d457 */ NULL, +/* d458 */ NULL, +/* d459 */ NULL, +/* d45a */ NULL, +/* d45b */ NULL, +/* d45c */ NULL, +/* d45d */ NULL, +/* d45e */ NULL, +/* d45f */ NULL, +/* d460 */ NULL, +/* d461 */ NULL, +/* d462 */ NULL, +/* d463 */ NULL, +/* d464 */ NULL, +/* d465 */ NULL, +/* d466 */ NULL, +/* d467 */ NULL, +/* d468 */ NULL, +/* d469 */ NULL, +/* d46a */ NULL, +/* d46b */ NULL, +/* d46c */ NULL, +/* d46d */ NULL, +/* d46e */ NULL, +/* d46f */ NULL, +/* d470 */ NULL, +/* d471 */ NULL, +/* d472 */ NULL, +/* d473 */ NULL, +/* d474 */ NULL, +/* d475 */ NULL, +/* d476 */ NULL, +/* d477 */ NULL, +/* d478 */ NULL, +/* d479 */ NULL, +/* d47a */ NULL, +/* d47b */ NULL, +/* d47c */ NULL, +/* d47d */ NULL, +/* d47e */ NULL, +/* d47f */ NULL, +/* d480 */ NULL, +/* d481 */ NULL, +/* d482 */ NULL, +/* d483 */ NULL, +/* d484 */ NULL, +/* d485 */ NULL, +/* d486 */ NULL, +/* d487 */ NULL, +/* d488 */ NULL, +/* d489 */ NULL, +/* d48a */ NULL, +/* d48b */ NULL, +/* d48c */ NULL, +/* d48d */ NULL, +/* d48e */ NULL, +/* d48f */ NULL, +/* d490 */ NULL, +/* d491 */ NULL, +/* d492 */ NULL, +/* d493 */ NULL, +/* d494 */ NULL, +/* d495 */ NULL, +/* d496 */ NULL, +/* d497 */ NULL, +/* d498 */ NULL, +/* d499 */ NULL, +/* d49a */ NULL, +/* d49b */ NULL, +/* d49c */ NULL, +/* d49d */ NULL, +/* d49e */ NULL, +/* d49f */ NULL, +/* d4a0 */ NULL, +/* d4a1 */ NULL, +/* d4a2 */ NULL, +/* d4a3 */ NULL, +/* d4a4 */ NULL, +/* d4a5 */ NULL, +/* d4a6 */ NULL, +/* d4a7 */ NULL, +/* d4a8 */ NULL, +/* d4a9 */ NULL, +/* d4aa */ NULL, +/* d4ab */ NULL, +/* d4ac */ NULL, +/* d4ad */ NULL, +/* d4ae */ NULL, +/* d4af */ NULL, +/* d4b0 */ NULL, +/* d4b1 */ NULL, +/* d4b2 */ NULL, +/* d4b3 */ NULL, +/* d4b4 */ NULL, +/* d4b5 */ NULL, +/* d4b6 */ NULL, +/* d4b7 */ NULL, +/* d4b8 */ NULL, +/* d4b9 */ NULL, +/* d4ba */ NULL, +/* d4bb */ NULL, +/* d4bc */ NULL, +/* d4bd */ NULL, +/* d4be */ NULL, +/* d4bf */ NULL, +/* d4c0 */ NULL, +/* d4c1 */ NULL, +/* d4c2 */ NULL, +/* d4c3 */ NULL, +/* d4c4 */ NULL, +/* d4c5 */ NULL, +/* d4c6 */ NULL, +/* d4c7 */ NULL, +/* d4c8 */ NULL, +/* d4c9 */ NULL, +/* d4ca */ NULL, +/* d4cb */ NULL, +/* d4cc */ NULL, +/* d4cd */ NULL, +/* d4ce */ NULL, +/* d4cf */ NULL, +/* d4d0 */ NULL, +/* d4d1 */ NULL, +/* d4d2 */ NULL, +/* d4d3 */ NULL, +/* d4d4 */ NULL, +/* d4d5 */ NULL, +/* d4d6 */ NULL, +/* d4d7 */ NULL, +/* d4d8 */ NULL, +/* d4d9 */ NULL, +/* d4da */ NULL, +/* d4db */ NULL, +/* d4dc */ NULL, +/* d4dd */ NULL, +/* d4de */ NULL, +/* d4df */ NULL, +/* d4e0 */ NULL, +/* d4e1 */ NULL, +/* d4e2 */ NULL, +/* d4e3 */ NULL, +/* d4e4 */ NULL, +/* d4e5 */ NULL, +/* d4e6 */ NULL, +/* d4e7 */ NULL, +/* d4e8 */ NULL, +/* d4e9 */ NULL, +/* d4ea */ NULL, +/* d4eb */ NULL, +/* d4ec */ NULL, +/* d4ed */ NULL, +/* d4ee */ NULL, +/* d4ef */ NULL, +/* d4f0 */ NULL, +/* d4f1 */ NULL, +/* d4f2 */ NULL, +/* d4f3 */ NULL, +/* d4f4 */ NULL, +/* d4f5 */ NULL, +/* d4f6 */ NULL, +/* d4f7 */ NULL, +/* d4f8 */ NULL, +/* d4f9 */ NULL, +/* d4fa */ NULL, +/* d4fb */ NULL, +/* d4fc */ NULL, +/* d4fd */ NULL, +/* d4fe */ NULL, +/* d4ff */ NULL, +/* d500 */ NULL, +/* d501 */ NULL, +/* d502 */ NULL, +/* d503 */ NULL, +/* d504 */ NULL, +/* d505 */ NULL, +/* d506 */ NULL, +/* d507 */ NULL, +/* d508 */ NULL, +/* d509 */ NULL, +/* d50a */ NULL, +/* d50b */ NULL, +/* d50c */ NULL, +/* d50d */ NULL, +/* d50e */ NULL, +/* d50f */ NULL, +/* d510 */ NULL, +/* d511 */ NULL, +/* d512 */ NULL, +/* d513 */ NULL, +/* d514 */ NULL, +/* d515 */ NULL, +/* d516 */ NULL, +/* d517 */ NULL, +/* d518 */ NULL, +/* d519 */ NULL, +/* d51a */ NULL, +/* d51b */ NULL, +/* d51c */ NULL, +/* d51d */ NULL, +/* d51e */ NULL, +/* d51f */ NULL, +/* d520 */ NULL, +/* d521 */ NULL, +/* d522 */ NULL, +/* d523 */ NULL, +/* d524 */ NULL, +/* d525 */ NULL, +/* d526 */ NULL, +/* d527 */ NULL, +/* d528 */ NULL, +/* d529 */ NULL, +/* d52a */ NULL, +/* d52b */ NULL, +/* d52c */ NULL, +/* d52d */ NULL, +/* d52e */ NULL, +/* d52f */ NULL, +/* d530 */ NULL, +/* d531 */ NULL, +/* d532 */ NULL, +/* d533 */ NULL, +/* d534 */ NULL, +/* d535 */ NULL, +/* d536 */ NULL, +/* d537 */ NULL, +/* d538 */ NULL, +/* d539 */ NULL, +/* d53a */ NULL, +/* d53b */ NULL, +/* d53c */ NULL, +/* d53d */ NULL, +/* d53e */ NULL, +/* d53f */ NULL, +/* d540 */ NULL, +/* d541 */ NULL, +/* d542 */ NULL, +/* d543 */ NULL, +/* d544 */ NULL, +/* d545 */ NULL, +/* d546 */ NULL, +/* d547 */ NULL, +/* d548 */ NULL, +/* d549 */ NULL, +/* d54a */ NULL, +/* d54b */ NULL, +/* d54c */ NULL, +/* d54d */ NULL, +/* d54e */ NULL, +/* d54f */ NULL, +/* d550 */ NULL, +/* d551 */ NULL, +/* d552 */ NULL, +/* d553 */ NULL, +/* d554 */ NULL, +/* d555 */ NULL, +/* d556 */ NULL, +/* d557 */ NULL, +/* d558 */ NULL, +/* d559 */ NULL, +/* d55a */ NULL, +/* d55b */ NULL, +/* d55c */ NULL, +/* d55d */ NULL, +/* d55e */ NULL, +/* d55f */ NULL, +/* d560 */ NULL, +/* d561 */ NULL, +/* d562 */ NULL, +/* d563 */ NULL, +/* d564 */ NULL, +/* d565 */ NULL, +/* d566 */ NULL, +/* d567 */ NULL, +/* d568 */ NULL, +/* d569 */ NULL, +/* d56a */ NULL, +/* d56b */ NULL, +/* d56c */ NULL, +/* d56d */ NULL, +/* d56e */ NULL, +/* d56f */ NULL, +/* d570 */ NULL, +/* d571 */ NULL, +/* d572 */ NULL, +/* d573 */ NULL, +/* d574 */ NULL, +/* d575 */ NULL, +/* d576 */ NULL, +/* d577 */ NULL, +/* d578 */ NULL, +/* d579 */ NULL, +/* d57a */ NULL, +/* d57b */ NULL, +/* d57c */ NULL, +/* d57d */ NULL, +/* d57e */ NULL, +/* d57f */ NULL, +/* d580 */ NULL, +/* d581 */ NULL, +/* d582 */ NULL, +/* d583 */ NULL, +/* d584 */ NULL, +/* d585 */ NULL, +/* d586 */ NULL, +/* d587 */ NULL, +/* d588 */ NULL, +/* d589 */ NULL, +/* d58a */ NULL, +/* d58b */ NULL, +/* d58c */ NULL, +/* d58d */ NULL, +/* d58e */ NULL, +/* d58f */ NULL, +/* d590 */ NULL, +/* d591 */ NULL, +/* d592 */ NULL, +/* d593 */ NULL, +/* d594 */ NULL, +/* d595 */ NULL, +/* d596 */ NULL, +/* d597 */ NULL, +/* d598 */ NULL, +/* d599 */ NULL, +/* d59a */ NULL, +/* d59b */ NULL, +/* d59c */ NULL, +/* d59d */ NULL, +/* d59e */ NULL, +/* d59f */ NULL, +/* d5a0 */ NULL, +/* d5a1 */ NULL, +/* d5a2 */ NULL, +/* d5a3 */ NULL, +/* d5a4 */ NULL, +/* d5a5 */ NULL, +/* d5a6 */ NULL, +/* d5a7 */ NULL, +/* d5a8 */ NULL, +/* d5a9 */ NULL, +/* d5aa */ NULL, +/* d5ab */ NULL, +/* d5ac */ NULL, +/* d5ad */ NULL, +/* d5ae */ NULL, +/* d5af */ NULL, +/* d5b0 */ NULL, +/* d5b1 */ NULL, +/* d5b2 */ NULL, +/* d5b3 */ NULL, +/* d5b4 */ NULL, +/* d5b5 */ NULL, +/* d5b6 */ NULL, +/* d5b7 */ NULL, +/* d5b8 */ NULL, +/* d5b9 */ NULL, +/* d5ba */ NULL, +/* d5bb */ NULL, +/* d5bc */ NULL, +/* d5bd */ NULL, +/* d5be */ NULL, +/* d5bf */ NULL, +/* d5c0 */ NULL, +/* d5c1 */ NULL, +/* d5c2 */ NULL, +/* d5c3 */ NULL, +/* d5c4 */ NULL, +/* d5c5 */ NULL, +/* d5c6 */ NULL, +/* d5c7 */ NULL, +/* d5c8 */ NULL, +/* d5c9 */ NULL, +/* d5ca */ NULL, +/* d5cb */ NULL, +/* d5cc */ NULL, +/* d5cd */ NULL, +/* d5ce */ NULL, +/* d5cf */ NULL, +/* d5d0 */ NULL, +/* d5d1 */ NULL, +/* d5d2 */ NULL, +/* d5d3 */ NULL, +/* d5d4 */ NULL, +/* d5d5 */ NULL, +/* d5d6 */ NULL, +/* d5d7 */ NULL, +/* d5d8 */ NULL, +/* d5d9 */ NULL, +/* d5da */ NULL, +/* d5db */ NULL, +/* d5dc */ NULL, +/* d5dd */ NULL, +/* d5de */ NULL, +/* d5df */ NULL, +/* d5e0 */ NULL, +/* d5e1 */ NULL, +/* d5e2 */ NULL, +/* d5e3 */ NULL, +/* d5e4 */ NULL, +/* d5e5 */ NULL, +/* d5e6 */ NULL, +/* d5e7 */ NULL, +/* d5e8 */ NULL, +/* d5e9 */ NULL, +/* d5ea */ NULL, +/* d5eb */ NULL, +/* d5ec */ NULL, +/* d5ed */ NULL, +/* d5ee */ NULL, +/* d5ef */ NULL, +/* d5f0 */ NULL, +/* d5f1 */ NULL, +/* d5f2 */ NULL, +/* d5f3 */ NULL, +/* d5f4 */ NULL, +/* d5f5 */ NULL, +/* d5f6 */ NULL, +/* d5f7 */ NULL, +/* d5f8 */ NULL, +/* d5f9 */ NULL, +/* d5fa */ NULL, +/* d5fb */ NULL, +/* d5fc */ NULL, +/* d5fd */ NULL, +/* d5fe */ NULL, +/* d5ff */ NULL, +/* d600 */ NULL, +/* d601 */ NULL, +/* d602 */ NULL, +/* d603 */ NULL, +/* d604 */ NULL, +/* d605 */ NULL, +/* d606 */ NULL, +/* d607 */ NULL, +/* d608 */ NULL, +/* d609 */ NULL, +/* d60a */ NULL, +/* d60b */ NULL, +/* d60c */ NULL, +/* d60d */ NULL, +/* d60e */ NULL, +/* d60f */ NULL, +/* d610 */ NULL, +/* d611 */ NULL, +/* d612 */ NULL, +/* d613 */ NULL, +/* d614 */ NULL, +/* d615 */ NULL, +/* d616 */ NULL, +/* d617 */ NULL, +/* d618 */ NULL, +/* d619 */ NULL, +/* d61a */ NULL, +/* d61b */ NULL, +/* d61c */ NULL, +/* d61d */ NULL, +/* d61e */ NULL, +/* d61f */ NULL, +/* d620 */ NULL, +/* d621 */ NULL, +/* d622 */ NULL, +/* d623 */ NULL, +/* d624 */ NULL, +/* d625 */ NULL, +/* d626 */ NULL, +/* d627 */ NULL, +/* d628 */ NULL, +/* d629 */ NULL, +/* d62a */ NULL, +/* d62b */ NULL, +/* d62c */ NULL, +/* d62d */ NULL, +/* d62e */ NULL, +/* d62f */ NULL, +/* d630 */ NULL, +/* d631 */ NULL, +/* d632 */ NULL, +/* d633 */ NULL, +/* d634 */ NULL, +/* d635 */ NULL, +/* d636 */ NULL, +/* d637 */ NULL, +/* d638 */ NULL, +/* d639 */ NULL, +/* d63a */ NULL, +/* d63b */ NULL, +/* d63c */ NULL, +/* d63d */ NULL, +/* d63e */ NULL, +/* d63f */ NULL, +/* d640 */ NULL, +/* d641 */ NULL, +/* d642 */ NULL, +/* d643 */ NULL, +/* d644 */ NULL, +/* d645 */ NULL, +/* d646 */ NULL, +/* d647 */ NULL, +/* d648 */ NULL, +/* d649 */ NULL, +/* d64a */ NULL, +/* d64b */ NULL, +/* d64c */ NULL, +/* d64d */ NULL, +/* d64e */ NULL, +/* d64f */ NULL, +/* d650 */ NULL, +/* d651 */ NULL, +/* d652 */ NULL, +/* d653 */ NULL, +/* d654 */ NULL, +/* d655 */ NULL, +/* d656 */ NULL, +/* d657 */ NULL, +/* d658 */ NULL, +/* d659 */ NULL, +/* d65a */ NULL, +/* d65b */ NULL, +/* d65c */ NULL, +/* d65d */ NULL, +/* d65e */ NULL, +/* d65f */ NULL, +/* d660 */ NULL, +/* d661 */ NULL, +/* d662 */ NULL, +/* d663 */ NULL, +/* d664 */ NULL, +/* d665 */ NULL, +/* d666 */ NULL, +/* d667 */ NULL, +/* d668 */ NULL, +/* d669 */ NULL, +/* d66a */ NULL, +/* d66b */ NULL, +/* d66c */ NULL, +/* d66d */ NULL, +/* d66e */ NULL, +/* d66f */ NULL, +/* d670 */ NULL, +/* d671 */ NULL, +/* d672 */ NULL, +/* d673 */ NULL, +/* d674 */ NULL, +/* d675 */ NULL, +/* d676 */ NULL, +/* d677 */ NULL, +/* d678 */ NULL, +/* d679 */ NULL, +/* d67a */ NULL, +/* d67b */ NULL, +/* d67c */ NULL, +/* d67d */ NULL, +/* d67e */ NULL, +/* d67f */ NULL, +/* d680 */ NULL, +/* d681 */ NULL, +/* d682 */ NULL, +/* d683 */ NULL, +/* d684 */ NULL, +/* d685 */ NULL, +/* d686 */ NULL, +/* d687 */ NULL, +/* d688 */ NULL, +/* d689 */ NULL, +/* d68a */ NULL, +/* d68b */ NULL, +/* d68c */ NULL, +/* d68d */ NULL, +/* d68e */ NULL, +/* d68f */ NULL, +/* d690 */ NULL, +/* d691 */ NULL, +/* d692 */ NULL, +/* d693 */ NULL, +/* d694 */ NULL, +/* d695 */ NULL, +/* d696 */ NULL, +/* d697 */ NULL, +/* d698 */ NULL, +/* d699 */ NULL, +/* d69a */ NULL, +/* d69b */ NULL, +/* d69c */ NULL, +/* d69d */ NULL, +/* d69e */ NULL, +/* d69f */ NULL, +/* d6a0 */ NULL, +/* d6a1 */ NULL, +/* d6a2 */ NULL, +/* d6a3 */ NULL, +/* d6a4 */ NULL, +/* d6a5 */ NULL, +/* d6a6 */ NULL, +/* d6a7 */ NULL, +/* d6a8 */ NULL, +/* d6a9 */ NULL, +/* d6aa */ NULL, +/* d6ab */ NULL, +/* d6ac */ NULL, +/* d6ad */ NULL, +/* d6ae */ NULL, +/* d6af */ NULL, +/* d6b0 */ NULL, +/* d6b1 */ NULL, +/* d6b2 */ NULL, +/* d6b3 */ NULL, +/* d6b4 */ NULL, +/* d6b5 */ NULL, +/* d6b6 */ NULL, +/* d6b7 */ NULL, +/* d6b8 */ NULL, +/* d6b9 */ NULL, +/* d6ba */ NULL, +/* d6bb */ NULL, +/* d6bc */ NULL, +/* d6bd */ NULL, +/* d6be */ NULL, +/* d6bf */ NULL, +/* d6c0 */ NULL, +/* d6c1 */ NULL, +/* d6c2 */ NULL, +/* d6c3 */ NULL, +/* d6c4 */ NULL, +/* d6c5 */ NULL, +/* d6c6 */ NULL, +/* d6c7 */ NULL, +/* d6c8 */ NULL, +/* d6c9 */ NULL, +/* d6ca */ NULL, +/* d6cb */ NULL, +/* d6cc */ NULL, +/* d6cd */ NULL, +/* d6ce */ NULL, +/* d6cf */ NULL, +/* d6d0 */ NULL, +/* d6d1 */ NULL, +/* d6d2 */ NULL, +/* d6d3 */ NULL, +/* d6d4 */ NULL, +/* d6d5 */ NULL, +/* d6d6 */ NULL, +/* d6d7 */ NULL, +/* d6d8 */ NULL, +/* d6d9 */ NULL, +/* d6da */ NULL, +/* d6db */ NULL, +/* d6dc */ NULL, +/* d6dd */ NULL, +/* d6de */ NULL, +/* d6df */ NULL, +/* d6e0 */ NULL, +/* d6e1 */ NULL, +/* d6e2 */ NULL, +/* d6e3 */ NULL, +/* d6e4 */ NULL, +/* d6e5 */ NULL, +/* d6e6 */ NULL, +/* d6e7 */ NULL, +/* d6e8 */ NULL, +/* d6e9 */ NULL, +/* d6ea */ NULL, +/* d6eb */ NULL, +/* d6ec */ NULL, +/* d6ed */ NULL, +/* d6ee */ NULL, +/* d6ef */ NULL, +/* d6f0 */ NULL, +/* d6f1 */ NULL, +/* d6f2 */ NULL, +/* d6f3 */ NULL, +/* d6f4 */ NULL, +/* d6f5 */ NULL, +/* d6f6 */ NULL, +/* d6f7 */ NULL, +/* d6f8 */ NULL, +/* d6f9 */ NULL, +/* d6fa */ NULL, +/* d6fb */ NULL, +/* d6fc */ NULL, +/* d6fd */ NULL, +/* d6fe */ NULL, +/* d6ff */ NULL, +/* d700 */ NULL, +/* d701 */ NULL, +/* d702 */ NULL, +/* d703 */ NULL, +/* d704 */ NULL, +/* d705 */ NULL, +/* d706 */ NULL, +/* d707 */ NULL, +/* d708 */ NULL, +/* d709 */ NULL, +/* d70a */ NULL, +/* d70b */ NULL, +/* d70c */ NULL, +/* d70d */ NULL, +/* d70e */ NULL, +/* d70f */ NULL, +/* d710 */ NULL, +/* d711 */ NULL, +/* d712 */ NULL, +/* d713 */ NULL, +/* d714 */ NULL, +/* d715 */ NULL, +/* d716 */ NULL, +/* d717 */ NULL, +/* d718 */ NULL, +/* d719 */ NULL, +/* d71a */ NULL, +/* d71b */ NULL, +/* d71c */ NULL, +/* d71d */ NULL, +/* d71e */ NULL, +/* d71f */ NULL, +/* d720 */ NULL, +/* d721 */ NULL, +/* d722 */ NULL, +/* d723 */ NULL, +/* d724 */ NULL, +/* d725 */ NULL, +/* d726 */ NULL, +/* d727 */ NULL, +/* d728 */ NULL, +/* d729 */ NULL, +/* d72a */ NULL, +/* d72b */ NULL, +/* d72c */ NULL, +/* d72d */ NULL, +/* d72e */ NULL, +/* d72f */ NULL, +/* d730 */ NULL, +/* d731 */ NULL, +/* d732 */ NULL, +/* d733 */ NULL, +/* d734 */ NULL, +/* d735 */ NULL, +/* d736 */ NULL, +/* d737 */ NULL, +/* d738 */ NULL, +/* d739 */ NULL, +/* d73a */ NULL, +/* d73b */ NULL, +/* d73c */ NULL, +/* d73d */ NULL, +/* d73e */ NULL, +/* d73f */ NULL, +/* d740 */ NULL, +/* d741 */ NULL, +/* d742 */ NULL, +/* d743 */ NULL, +/* d744 */ NULL, +/* d745 */ NULL, +/* d746 */ NULL, +/* d747 */ NULL, +/* d748 */ NULL, +/* d749 */ NULL, +/* d74a */ NULL, +/* d74b */ NULL, +/* d74c */ NULL, +/* d74d */ NULL, +/* d74e */ NULL, +/* d74f */ NULL, +/* d750 */ NULL, +/* d751 */ NULL, +/* d752 */ NULL, +/* d753 */ NULL, +/* d754 */ NULL, +/* d755 */ NULL, +/* d756 */ NULL, +/* d757 */ NULL, +/* d758 */ NULL, +/* d759 */ NULL, +/* d75a */ NULL, +/* d75b */ NULL, +/* d75c */ NULL, +/* d75d */ NULL, +/* d75e */ NULL, +/* d75f */ NULL, +/* d760 */ NULL, +/* d761 */ NULL, +/* d762 */ NULL, +/* d763 */ NULL, +/* d764 */ NULL, +/* d765 */ NULL, +/* d766 */ NULL, +/* d767 */ NULL, +/* d768 */ NULL, +/* d769 */ NULL, +/* d76a */ NULL, +/* d76b */ NULL, +/* d76c */ NULL, +/* d76d */ NULL, +/* d76e */ NULL, +/* d76f */ NULL, +/* d770 */ NULL, +/* d771 */ NULL, +/* d772 */ NULL, +/* d773 */ NULL, +/* d774 */ NULL, +/* d775 */ NULL, +/* d776 */ NULL, +/* d777 */ NULL, +/* d778 */ NULL, +/* d779 */ NULL, +/* d77a */ NULL, +/* d77b */ NULL, +/* d77c */ NULL, +/* d77d */ NULL, +/* d77e */ NULL, +/* d77f */ NULL, +/* d780 */ NULL, +/* d781 */ NULL, +/* d782 */ NULL, +/* d783 */ NULL, +/* d784 */ NULL, +/* d785 */ NULL, +/* d786 */ NULL, +/* d787 */ NULL, +/* d788 */ NULL, +/* d789 */ NULL, +/* d78a */ NULL, +/* d78b */ NULL, +/* d78c */ NULL, +/* d78d */ NULL, +/* d78e */ NULL, +/* d78f */ NULL, +/* d790 */ NULL, +/* d791 */ NULL, +/* d792 */ NULL, +/* d793 */ NULL, +/* d794 */ NULL, +/* d795 */ NULL, +/* d796 */ NULL, +/* d797 */ NULL, +/* d798 */ NULL, +/* d799 */ NULL, +/* d79a */ NULL, +/* d79b */ NULL, +/* d79c */ NULL, +/* d79d */ NULL, +/* d79e */ NULL, +/* d79f */ NULL, +/* d7a0 */ NULL, +/* d7a1 */ NULL, +/* d7a2 */ NULL, +/* d7a3 */ NULL, +/* d7a4 */ NULL, +/* d7a5 */ NULL, +/* d7a6 */ NULL, +/* d7a7 */ NULL, +/* d7a8 */ NULL, +/* d7a9 */ NULL, +/* d7aa */ NULL, +/* d7ab */ NULL, +/* d7ac */ NULL, +/* d7ad */ NULL, +/* d7ae */ NULL, +/* d7af */ NULL, +/* d7b0 */ NULL, +/* d7b1 */ NULL, +/* d7b2 */ NULL, +/* d7b3 */ NULL, +/* d7b4 */ NULL, +/* d7b5 */ NULL, +/* d7b6 */ NULL, +/* d7b7 */ NULL, +/* d7b8 */ NULL, +/* d7b9 */ NULL, +/* d7ba */ NULL, +/* d7bb */ NULL, +/* d7bc */ NULL, +/* d7bd */ NULL, +/* d7be */ NULL, +/* d7bf */ NULL, +/* d7c0 */ NULL, +/* d7c1 */ NULL, +/* d7c2 */ NULL, +/* d7c3 */ NULL, +/* d7c4 */ NULL, +/* d7c5 */ NULL, +/* d7c6 */ NULL, +/* d7c7 */ NULL, +/* d7c8 */ NULL, +/* d7c9 */ NULL, +/* d7ca */ NULL, +/* d7cb */ NULL, +/* d7cc */ NULL, +/* d7cd */ NULL, +/* d7ce */ NULL, +/* d7cf */ NULL, +/* d7d0 */ NULL, +/* d7d1 */ NULL, +/* d7d2 */ NULL, +/* d7d3 */ NULL, +/* d7d4 */ NULL, +/* d7d5 */ NULL, +/* d7d6 */ NULL, +/* d7d7 */ NULL, +/* d7d8 */ NULL, +/* d7d9 */ NULL, +/* d7da */ NULL, +/* d7db */ NULL, +/* d7dc */ NULL, +/* d7dd */ NULL, +/* d7de */ NULL, +/* d7df */ NULL, +/* d7e0 */ NULL, +/* d7e1 */ NULL, +/* d7e2 */ NULL, +/* d7e3 */ NULL, +/* d7e4 */ NULL, +/* d7e5 */ NULL, +/* d7e6 */ NULL, +/* d7e7 */ NULL, +/* d7e8 */ NULL, +/* d7e9 */ NULL, +/* d7ea */ NULL, +/* d7eb */ NULL, +/* d7ec */ NULL, +/* d7ed */ NULL, +/* d7ee */ NULL, +/* d7ef */ NULL, +/* d7f0 */ NULL, +/* d7f1 */ NULL, +/* d7f2 */ NULL, +/* d7f3 */ NULL, +/* d7f4 */ NULL, +/* d7f5 */ NULL, +/* d7f6 */ NULL, +/* d7f7 */ NULL, +/* d7f8 */ NULL, +/* d7f9 */ NULL, +/* d7fa */ NULL, +/* d7fb */ NULL, +/* d7fc */ NULL, +/* d7fd */ NULL, +/* d7fe */ NULL, +/* d7ff */ NULL, +/* d800 */ NULL, +/* d801 */ NULL, +/* d802 */ NULL, +/* d803 */ NULL, +/* d804 */ NULL, +/* d805 */ NULL, +/* d806 */ NULL, +/* d807 */ NULL, +/* d808 */ NULL, +/* d809 */ NULL, +/* d80a */ NULL, +/* d80b */ NULL, +/* d80c */ NULL, +/* d80d */ NULL, +/* d80e */ NULL, +/* d80f */ NULL, +/* d810 */ NULL, +/* d811 */ NULL, +/* d812 */ NULL, +/* d813 */ NULL, +/* d814 */ NULL, +/* d815 */ NULL, +/* d816 */ NULL, +/* d817 */ NULL, +/* d818 */ NULL, +/* d819 */ NULL, +/* d81a */ NULL, +/* d81b */ NULL, +/* d81c */ NULL, +/* d81d */ NULL, +/* d81e */ NULL, +/* d81f */ NULL, +/* d820 */ NULL, +/* d821 */ NULL, +/* d822 */ NULL, +/* d823 */ NULL, +/* d824 */ NULL, +/* d825 */ NULL, +/* d826 */ NULL, +/* d827 */ NULL, +/* d828 */ NULL, +/* d829 */ NULL, +/* d82a */ NULL, +/* d82b */ NULL, +/* d82c */ NULL, +/* d82d */ NULL, +/* d82e */ NULL, +/* d82f */ NULL, +/* d830 */ NULL, +/* d831 */ NULL, +/* d832 */ NULL, +/* d833 */ NULL, +/* d834 */ NULL, +/* d835 */ NULL, +/* d836 */ NULL, +/* d837 */ NULL, +/* d838 */ NULL, +/* d839 */ NULL, +/* d83a */ NULL, +/* d83b */ NULL, +/* d83c */ NULL, +/* d83d */ NULL, +/* d83e */ NULL, +/* d83f */ NULL, +/* d840 */ NULL, +/* d841 */ NULL, +/* d842 */ NULL, +/* d843 */ NULL, +/* d844 */ NULL, +/* d845 */ NULL, +/* d846 */ NULL, +/* d847 */ NULL, +/* d848 */ NULL, +/* d849 */ NULL, +/* d84a */ NULL, +/* d84b */ NULL, +/* d84c */ NULL, +/* d84d */ NULL, +/* d84e */ NULL, +/* d84f */ NULL, +/* d850 */ NULL, +/* d851 */ NULL, +/* d852 */ NULL, +/* d853 */ NULL, +/* d854 */ NULL, +/* d855 */ NULL, +/* d856 */ NULL, +/* d857 */ NULL, +/* d858 */ NULL, +/* d859 */ NULL, +/* d85a */ NULL, +/* d85b */ NULL, +/* d85c */ NULL, +/* d85d */ NULL, +/* d85e */ NULL, +/* d85f */ NULL, +/* d860 */ NULL, +/* d861 */ NULL, +/* d862 */ NULL, +/* d863 */ NULL, +/* d864 */ NULL, +/* d865 */ NULL, +/* d866 */ NULL, +/* d867 */ NULL, +/* d868 */ NULL, +/* d869 */ NULL, +/* d86a */ NULL, +/* d86b */ NULL, +/* d86c */ NULL, +/* d86d */ NULL, +/* d86e */ NULL, +/* d86f */ NULL, +/* d870 */ NULL, +/* d871 */ NULL, +/* d872 */ NULL, +/* d873 */ NULL, +/* d874 */ NULL, +/* d875 */ NULL, +/* d876 */ NULL, +/* d877 */ NULL, +/* d878 */ NULL, +/* d879 */ NULL, +/* d87a */ NULL, +/* d87b */ NULL, +/* d87c */ NULL, +/* d87d */ NULL, +/* d87e */ NULL, +/* d87f */ NULL, +/* d880 */ NULL, +/* d881 */ NULL, +/* d882 */ NULL, +/* d883 */ NULL, +/* d884 */ NULL, +/* d885 */ NULL, +/* d886 */ NULL, +/* d887 */ NULL, +/* d888 */ NULL, +/* d889 */ NULL, +/* d88a */ NULL, +/* d88b */ NULL, +/* d88c */ NULL, +/* d88d */ NULL, +/* d88e */ NULL, +/* d88f */ NULL, +/* d890 */ NULL, +/* d891 */ NULL, +/* d892 */ NULL, +/* d893 */ NULL, +/* d894 */ NULL, +/* d895 */ NULL, +/* d896 */ NULL, +/* d897 */ NULL, +/* d898 */ NULL, +/* d899 */ NULL, +/* d89a */ NULL, +/* d89b */ NULL, +/* d89c */ NULL, +/* d89d */ NULL, +/* d89e */ NULL, +/* d89f */ NULL, +/* d8a0 */ NULL, +/* d8a1 */ NULL, +/* d8a2 */ NULL, +/* d8a3 */ NULL, +/* d8a4 */ NULL, +/* d8a5 */ NULL, +/* d8a6 */ NULL, +/* d8a7 */ NULL, +/* d8a8 */ NULL, +/* d8a9 */ NULL, +/* d8aa */ NULL, +/* d8ab */ NULL, +/* d8ac */ NULL, +/* d8ad */ NULL, +/* d8ae */ NULL, +/* d8af */ NULL, +/* d8b0 */ NULL, +/* d8b1 */ NULL, +/* d8b2 */ NULL, +/* d8b3 */ NULL, +/* d8b4 */ NULL, +/* d8b5 */ NULL, +/* d8b6 */ NULL, +/* d8b7 */ NULL, +/* d8b8 */ NULL, +/* d8b9 */ NULL, +/* d8ba */ NULL, +/* d8bb */ NULL, +/* d8bc */ NULL, +/* d8bd */ NULL, +/* d8be */ NULL, +/* d8bf */ NULL, +/* d8c0 */ NULL, +/* d8c1 */ NULL, +/* d8c2 */ NULL, +/* d8c3 */ NULL, +/* d8c4 */ NULL, +/* d8c5 */ NULL, +/* d8c6 */ NULL, +/* d8c7 */ NULL, +/* d8c8 */ NULL, +/* d8c9 */ NULL, +/* d8ca */ NULL, +/* d8cb */ NULL, +/* d8cc */ NULL, +/* d8cd */ NULL, +/* d8ce */ NULL, +/* d8cf */ NULL, +/* d8d0 */ NULL, +/* d8d1 */ NULL, +/* d8d2 */ NULL, +/* d8d3 */ NULL, +/* d8d4 */ NULL, +/* d8d5 */ NULL, +/* d8d6 */ NULL, +/* d8d7 */ NULL, +/* d8d8 */ NULL, +/* d8d9 */ NULL, +/* d8da */ NULL, +/* d8db */ NULL, +/* d8dc */ NULL, +/* d8dd */ NULL, +/* d8de */ NULL, +/* d8df */ NULL, +/* d8e0 */ NULL, +/* d8e1 */ NULL, +/* d8e2 */ NULL, +/* d8e3 */ NULL, +/* d8e4 */ NULL, +/* d8e5 */ NULL, +/* d8e6 */ NULL, +/* d8e7 */ NULL, +/* d8e8 */ NULL, +/* d8e9 */ NULL, +/* d8ea */ NULL, +/* d8eb */ NULL, +/* d8ec */ NULL, +/* d8ed */ NULL, +/* d8ee */ NULL, +/* d8ef */ NULL, +/* d8f0 */ NULL, +/* d8f1 */ NULL, +/* d8f2 */ NULL, +/* d8f3 */ NULL, +/* d8f4 */ NULL, +/* d8f5 */ NULL, +/* d8f6 */ NULL, +/* d8f7 */ NULL, +/* d8f8 */ NULL, +/* d8f9 */ NULL, +/* d8fa */ NULL, +/* d8fb */ NULL, +/* d8fc */ NULL, +/* d8fd */ NULL, +/* d8fe */ NULL, +/* d8ff */ NULL, +/* d900 */ NULL, +/* d901 */ NULL, +/* d902 */ NULL, +/* d903 */ NULL, +/* d904 */ NULL, +/* d905 */ NULL, +/* d906 */ NULL, +/* d907 */ NULL, +/* d908 */ NULL, +/* d909 */ NULL, +/* d90a */ NULL, +/* d90b */ NULL, +/* d90c */ NULL, +/* d90d */ NULL, +/* d90e */ NULL, +/* d90f */ NULL, +/* d910 */ NULL, +/* d911 */ NULL, +/* d912 */ NULL, +/* d913 */ NULL, +/* d914 */ NULL, +/* d915 */ NULL, +/* d916 */ NULL, +/* d917 */ NULL, +/* d918 */ NULL, +/* d919 */ NULL, +/* d91a */ NULL, +/* d91b */ NULL, +/* d91c */ NULL, +/* d91d */ NULL, +/* d91e */ NULL, +/* d91f */ NULL, +/* d920 */ NULL, +/* d921 */ NULL, +/* d922 */ NULL, +/* d923 */ NULL, +/* d924 */ NULL, +/* d925 */ NULL, +/* d926 */ NULL, +/* d927 */ NULL, +/* d928 */ NULL, +/* d929 */ NULL, +/* d92a */ NULL, +/* d92b */ NULL, +/* d92c */ NULL, +/* d92d */ NULL, +/* d92e */ NULL, +/* d92f */ NULL, +/* d930 */ NULL, +/* d931 */ NULL, +/* d932 */ NULL, +/* d933 */ NULL, +/* d934 */ NULL, +/* d935 */ NULL, +/* d936 */ NULL, +/* d937 */ NULL, +/* d938 */ NULL, +/* d939 */ NULL, +/* d93a */ NULL, +/* d93b */ NULL, +/* d93c */ NULL, +/* d93d */ NULL, +/* d93e */ NULL, +/* d93f */ NULL, +/* d940 */ NULL, +/* d941 */ NULL, +/* d942 */ NULL, +/* d943 */ NULL, +/* d944 */ NULL, +/* d945 */ NULL, +/* d946 */ NULL, +/* d947 */ NULL, +/* d948 */ NULL, +/* d949 */ NULL, +/* d94a */ NULL, +/* d94b */ NULL, +/* d94c */ NULL, +/* d94d */ NULL, +/* d94e */ NULL, +/* d94f */ NULL, +/* d950 */ NULL, +/* d951 */ NULL, +/* d952 */ NULL, +/* d953 */ NULL, +/* d954 */ NULL, +/* d955 */ NULL, +/* d956 */ NULL, +/* d957 */ NULL, +/* d958 */ NULL, +/* d959 */ NULL, +/* d95a */ NULL, +/* d95b */ NULL, +/* d95c */ NULL, +/* d95d */ NULL, +/* d95e */ NULL, +/* d95f */ NULL, +/* d960 */ NULL, +/* d961 */ NULL, +/* d962 */ NULL, +/* d963 */ NULL, +/* d964 */ NULL, +/* d965 */ NULL, +/* d966 */ NULL, +/* d967 */ NULL, +/* d968 */ NULL, +/* d969 */ NULL, +/* d96a */ NULL, +/* d96b */ NULL, +/* d96c */ NULL, +/* d96d */ NULL, +/* d96e */ NULL, +/* d96f */ NULL, +/* d970 */ NULL, +/* d971 */ NULL, +/* d972 */ NULL, +/* d973 */ NULL, +/* d974 */ NULL, +/* d975 */ NULL, +/* d976 */ NULL, +/* d977 */ NULL, +/* d978 */ NULL, +/* d979 */ NULL, +/* d97a */ NULL, +/* d97b */ NULL, +/* d97c */ NULL, +/* d97d */ NULL, +/* d97e */ NULL, +/* d97f */ NULL, +/* d980 */ NULL, +/* d981 */ NULL, +/* d982 */ NULL, +/* d983 */ NULL, +/* d984 */ NULL, +/* d985 */ NULL, +/* d986 */ NULL, +/* d987 */ NULL, +/* d988 */ NULL, +/* d989 */ NULL, +/* d98a */ NULL, +/* d98b */ NULL, +/* d98c */ NULL, +/* d98d */ NULL, +/* d98e */ NULL, +/* d98f */ NULL, +/* d990 */ NULL, +/* d991 */ NULL, +/* d992 */ NULL, +/* d993 */ NULL, +/* d994 */ NULL, +/* d995 */ NULL, +/* d996 */ NULL, +/* d997 */ NULL, +/* d998 */ NULL, +/* d999 */ NULL, +/* d99a */ NULL, +/* d99b */ NULL, +/* d99c */ NULL, +/* d99d */ NULL, +/* d99e */ NULL, +/* d99f */ NULL, +/* d9a0 */ NULL, +/* d9a1 */ NULL, +/* d9a2 */ NULL, +/* d9a3 */ NULL, +/* d9a4 */ NULL, +/* d9a5 */ NULL, +/* d9a6 */ NULL, +/* d9a7 */ NULL, +/* d9a8 */ NULL, +/* d9a9 */ NULL, +/* d9aa */ NULL, +/* d9ab */ NULL, +/* d9ac */ NULL, +/* d9ad */ NULL, +/* d9ae */ NULL, +/* d9af */ NULL, +/* d9b0 */ NULL, +/* d9b1 */ NULL, +/* d9b2 */ NULL, +/* d9b3 */ NULL, +/* d9b4 */ NULL, +/* d9b5 */ NULL, +/* d9b6 */ NULL, +/* d9b7 */ NULL, +/* d9b8 */ NULL, +/* d9b9 */ NULL, +/* d9ba */ NULL, +/* d9bb */ NULL, +/* d9bc */ NULL, +/* d9bd */ NULL, +/* d9be */ NULL, +/* d9bf */ NULL, +/* d9c0 */ NULL, +/* d9c1 */ NULL, +/* d9c2 */ NULL, +/* d9c3 */ NULL, +/* d9c4 */ NULL, +/* d9c5 */ NULL, +/* d9c6 */ NULL, +/* d9c7 */ NULL, +/* d9c8 */ NULL, +/* d9c9 */ NULL, +/* d9ca */ NULL, +/* d9cb */ NULL, +/* d9cc */ NULL, +/* d9cd */ NULL, +/* d9ce */ NULL, +/* d9cf */ NULL, +/* d9d0 */ NULL, +/* d9d1 */ NULL, +/* d9d2 */ NULL, +/* d9d3 */ NULL, +/* d9d4 */ NULL, +/* d9d5 */ NULL, +/* d9d6 */ NULL, +/* d9d7 */ NULL, +/* d9d8 */ NULL, +/* d9d9 */ NULL, +/* d9da */ NULL, +/* d9db */ NULL, +/* d9dc */ NULL, +/* d9dd */ NULL, +/* d9de */ NULL, +/* d9df */ NULL, +/* d9e0 */ NULL, +/* d9e1 */ NULL, +/* d9e2 */ NULL, +/* d9e3 */ NULL, +/* d9e4 */ NULL, +/* d9e5 */ NULL, +/* d9e6 */ NULL, +/* d9e7 */ NULL, +/* d9e8 */ NULL, +/* d9e9 */ NULL, +/* d9ea */ NULL, +/* d9eb */ NULL, +/* d9ec */ NULL, +/* d9ed */ NULL, +/* d9ee */ NULL, +/* d9ef */ NULL, +/* d9f0 */ NULL, +/* d9f1 */ NULL, +/* d9f2 */ NULL, +/* d9f3 */ NULL, +/* d9f4 */ NULL, +/* d9f5 */ NULL, +/* d9f6 */ NULL, +/* d9f7 */ NULL, +/* d9f8 */ NULL, +/* d9f9 */ NULL, +/* d9fa */ NULL, +/* d9fb */ NULL, +/* d9fc */ NULL, +/* d9fd */ NULL, +/* d9fe */ NULL, +/* d9ff */ NULL, +/* da00 */ NULL, +/* da01 */ NULL, +/* da02 */ NULL, +/* da03 */ NULL, +/* da04 */ NULL, +/* da05 */ NULL, +/* da06 */ NULL, +/* da07 */ NULL, +/* da08 */ NULL, +/* da09 */ NULL, +/* da0a */ NULL, +/* da0b */ NULL, +/* da0c */ NULL, +/* da0d */ NULL, +/* da0e */ NULL, +/* da0f */ NULL, +/* da10 */ NULL, +/* da11 */ NULL, +/* da12 */ NULL, +/* da13 */ NULL, +/* da14 */ NULL, +/* da15 */ NULL, +/* da16 */ NULL, +/* da17 */ NULL, +/* da18 */ NULL, +/* da19 */ NULL, +/* da1a */ NULL, +/* da1b */ NULL, +/* da1c */ NULL, +/* da1d */ NULL, +/* da1e */ NULL, +/* da1f */ NULL, +/* da20 */ NULL, +/* da21 */ NULL, +/* da22 */ NULL, +/* da23 */ NULL, +/* da24 */ NULL, +/* da25 */ NULL, +/* da26 */ NULL, +/* da27 */ NULL, +/* da28 */ NULL, +/* da29 */ NULL, +/* da2a */ NULL, +/* da2b */ NULL, +/* da2c */ NULL, +/* da2d */ NULL, +/* da2e */ NULL, +/* da2f */ NULL, +/* da30 */ NULL, +/* da31 */ NULL, +/* da32 */ NULL, +/* da33 */ NULL, +/* da34 */ NULL, +/* da35 */ NULL, +/* da36 */ NULL, +/* da37 */ NULL, +/* da38 */ NULL, +/* da39 */ NULL, +/* da3a */ NULL, +/* da3b */ NULL, +/* da3c */ NULL, +/* da3d */ NULL, +/* da3e */ NULL, +/* da3f */ NULL, +/* da40 */ NULL, +/* da41 */ NULL, +/* da42 */ NULL, +/* da43 */ NULL, +/* da44 */ NULL, +/* da45 */ NULL, +/* da46 */ NULL, +/* da47 */ NULL, +/* da48 */ NULL, +/* da49 */ NULL, +/* da4a */ NULL, +/* da4b */ NULL, +/* da4c */ NULL, +/* da4d */ NULL, +/* da4e */ NULL, +/* da4f */ NULL, +/* da50 */ NULL, +/* da51 */ NULL, +/* da52 */ NULL, +/* da53 */ NULL, +/* da54 */ NULL, +/* da55 */ NULL, +/* da56 */ NULL, +/* da57 */ NULL, +/* da58 */ NULL, +/* da59 */ NULL, +/* da5a */ NULL, +/* da5b */ NULL, +/* da5c */ NULL, +/* da5d */ NULL, +/* da5e */ NULL, +/* da5f */ NULL, +/* da60 */ NULL, +/* da61 */ NULL, +/* da62 */ NULL, +/* da63 */ NULL, +/* da64 */ NULL, +/* da65 */ NULL, +/* da66 */ NULL, +/* da67 */ NULL, +/* da68 */ NULL, +/* da69 */ NULL, +/* da6a */ NULL, +/* da6b */ NULL, +/* da6c */ NULL, +/* da6d */ NULL, +/* da6e */ NULL, +/* da6f */ NULL, +/* da70 */ NULL, +/* da71 */ NULL, +/* da72 */ NULL, +/* da73 */ NULL, +/* da74 */ NULL, +/* da75 */ NULL, +/* da76 */ NULL, +/* da77 */ NULL, +/* da78 */ NULL, +/* da79 */ NULL, +/* da7a */ NULL, +/* da7b */ NULL, +/* da7c */ NULL, +/* da7d */ NULL, +/* da7e */ NULL, +/* da7f */ NULL, +/* da80 */ NULL, +/* da81 */ NULL, +/* da82 */ NULL, +/* da83 */ NULL, +/* da84 */ NULL, +/* da85 */ NULL, +/* da86 */ NULL, +/* da87 */ NULL, +/* da88 */ NULL, +/* da89 */ NULL, +/* da8a */ NULL, +/* da8b */ NULL, +/* da8c */ NULL, +/* da8d */ NULL, +/* da8e */ NULL, +/* da8f */ NULL, +/* da90 */ NULL, +/* da91 */ NULL, +/* da92 */ NULL, +/* da93 */ NULL, +/* da94 */ NULL, +/* da95 */ NULL, +/* da96 */ NULL, +/* da97 */ NULL, +/* da98 */ NULL, +/* da99 */ NULL, +/* da9a */ NULL, +/* da9b */ NULL, +/* da9c */ NULL, +/* da9d */ NULL, +/* da9e */ NULL, +/* da9f */ NULL, +/* daa0 */ NULL, +/* daa1 */ NULL, +/* daa2 */ NULL, +/* daa3 */ NULL, +/* daa4 */ NULL, +/* daa5 */ NULL, +/* daa6 */ NULL, +/* daa7 */ NULL, +/* daa8 */ NULL, +/* daa9 */ NULL, +/* daaa */ NULL, +/* daab */ NULL, +/* daac */ NULL, +/* daad */ NULL, +/* daae */ NULL, +/* daaf */ NULL, +/* dab0 */ NULL, +/* dab1 */ NULL, +/* dab2 */ NULL, +/* dab3 */ NULL, +/* dab4 */ NULL, +/* dab5 */ NULL, +/* dab6 */ NULL, +/* dab7 */ NULL, +/* dab8 */ NULL, +/* dab9 */ NULL, +/* daba */ NULL, +/* dabb */ NULL, +/* dabc */ NULL, +/* dabd */ NULL, +/* dabe */ NULL, +/* dabf */ NULL, +/* dac0 */ NULL, +/* dac1 */ NULL, +/* dac2 */ NULL, +/* dac3 */ NULL, +/* dac4 */ NULL, +/* dac5 */ NULL, +/* dac6 */ NULL, +/* dac7 */ NULL, +/* dac8 */ NULL, +/* dac9 */ NULL, +/* daca */ NULL, +/* dacb */ NULL, +/* dacc */ NULL, +/* dacd */ NULL, +/* dace */ NULL, +/* dacf */ NULL, +/* dad0 */ NULL, +/* dad1 */ NULL, +/* dad2 */ NULL, +/* dad3 */ NULL, +/* dad4 */ NULL, +/* dad5 */ NULL, +/* dad6 */ NULL, +/* dad7 */ NULL, +/* dad8 */ NULL, +/* dad9 */ NULL, +/* dada */ NULL, +/* dadb */ NULL, +/* dadc */ NULL, +/* dadd */ NULL, +/* dade */ NULL, +/* dadf */ NULL, +/* dae0 */ NULL, +/* dae1 */ NULL, +/* dae2 */ NULL, +/* dae3 */ NULL, +/* dae4 */ NULL, +/* dae5 */ NULL, +/* dae6 */ NULL, +/* dae7 */ NULL, +/* dae8 */ NULL, +/* dae9 */ NULL, +/* daea */ NULL, +/* daeb */ NULL, +/* daec */ NULL, +/* daed */ NULL, +/* daee */ NULL, +/* daef */ NULL, +/* daf0 */ NULL, +/* daf1 */ NULL, +/* daf2 */ NULL, +/* daf3 */ NULL, +/* daf4 */ NULL, +/* daf5 */ NULL, +/* daf6 */ NULL, +/* daf7 */ NULL, +/* daf8 */ NULL, +/* daf9 */ NULL, +/* dafa */ NULL, +/* dafb */ NULL, +/* dafc */ NULL, +/* dafd */ NULL, +/* dafe */ NULL, +/* daff */ NULL, +/* db00 */ NULL, +/* db01 */ NULL, +/* db02 */ NULL, +/* db03 */ NULL, +/* db04 */ NULL, +/* db05 */ NULL, +/* db06 */ NULL, +/* db07 */ NULL, +/* db08 */ NULL, +/* db09 */ NULL, +/* db0a */ NULL, +/* db0b */ NULL, +/* db0c */ NULL, +/* db0d */ NULL, +/* db0e */ NULL, +/* db0f */ NULL, +/* db10 */ NULL, +/* db11 */ NULL, +/* db12 */ NULL, +/* db13 */ NULL, +/* db14 */ NULL, +/* db15 */ NULL, +/* db16 */ NULL, +/* db17 */ NULL, +/* db18 */ NULL, +/* db19 */ NULL, +/* db1a */ NULL, +/* db1b */ NULL, +/* db1c */ NULL, +/* db1d */ NULL, +/* db1e */ NULL, +/* db1f */ NULL, +/* db20 */ NULL, +/* db21 */ NULL, +/* db22 */ NULL, +/* db23 */ NULL, +/* db24 */ NULL, +/* db25 */ NULL, +/* db26 */ NULL, +/* db27 */ NULL, +/* db28 */ NULL, +/* db29 */ NULL, +/* db2a */ NULL, +/* db2b */ NULL, +/* db2c */ NULL, +/* db2d */ NULL, +/* db2e */ NULL, +/* db2f */ NULL, +/* db30 */ NULL, +/* db31 */ NULL, +/* db32 */ NULL, +/* db33 */ NULL, +/* db34 */ NULL, +/* db35 */ NULL, +/* db36 */ NULL, +/* db37 */ NULL, +/* db38 */ NULL, +/* db39 */ NULL, +/* db3a */ NULL, +/* db3b */ NULL, +/* db3c */ NULL, +/* db3d */ NULL, +/* db3e */ NULL, +/* db3f */ NULL, +/* db40 */ NULL, +/* db41 */ NULL, +/* db42 */ NULL, +/* db43 */ NULL, +/* db44 */ NULL, +/* db45 */ NULL, +/* db46 */ NULL, +/* db47 */ NULL, +/* db48 */ NULL, +/* db49 */ NULL, +/* db4a */ NULL, +/* db4b */ NULL, +/* db4c */ NULL, +/* db4d */ NULL, +/* db4e */ NULL, +/* db4f */ NULL, +/* db50 */ NULL, +/* db51 */ NULL, +/* db52 */ NULL, +/* db53 */ NULL, +/* db54 */ NULL, +/* db55 */ NULL, +/* db56 */ NULL, +/* db57 */ NULL, +/* db58 */ NULL, +/* db59 */ NULL, +/* db5a */ NULL, +/* db5b */ NULL, +/* db5c */ NULL, +/* db5d */ NULL, +/* db5e */ NULL, +/* db5f */ NULL, +/* db60 */ NULL, +/* db61 */ NULL, +/* db62 */ NULL, +/* db63 */ NULL, +/* db64 */ NULL, +/* db65 */ NULL, +/* db66 */ NULL, +/* db67 */ NULL, +/* db68 */ NULL, +/* db69 */ NULL, +/* db6a */ NULL, +/* db6b */ NULL, +/* db6c */ NULL, +/* db6d */ NULL, +/* db6e */ NULL, +/* db6f */ NULL, +/* db70 */ NULL, +/* db71 */ NULL, +/* db72 */ NULL, +/* db73 */ NULL, +/* db74 */ NULL, +/* db75 */ NULL, +/* db76 */ NULL, +/* db77 */ NULL, +/* db78 */ NULL, +/* db79 */ NULL, +/* db7a */ NULL, +/* db7b */ NULL, +/* db7c */ NULL, +/* db7d */ NULL, +/* db7e */ NULL, +/* db7f */ NULL, +/* db80 */ NULL, +/* db81 */ NULL, +/* db82 */ NULL, +/* db83 */ NULL, +/* db84 */ NULL, +/* db85 */ NULL, +/* db86 */ NULL, +/* db87 */ NULL, +/* db88 */ NULL, +/* db89 */ NULL, +/* db8a */ NULL, +/* db8b */ NULL, +/* db8c */ NULL, +/* db8d */ NULL, +/* db8e */ NULL, +/* db8f */ NULL, +/* db90 */ NULL, +/* db91 */ NULL, +/* db92 */ NULL, +/* db93 */ NULL, +/* db94 */ NULL, +/* db95 */ NULL, +/* db96 */ NULL, +/* db97 */ NULL, +/* db98 */ NULL, +/* db99 */ NULL, +/* db9a */ NULL, +/* db9b */ NULL, +/* db9c */ NULL, +/* db9d */ NULL, +/* db9e */ NULL, +/* db9f */ NULL, +/* dba0 */ NULL, +/* dba1 */ NULL, +/* dba2 */ NULL, +/* dba3 */ NULL, +/* dba4 */ NULL, +/* dba5 */ NULL, +/* dba6 */ NULL, +/* dba7 */ NULL, +/* dba8 */ NULL, +/* dba9 */ NULL, +/* dbaa */ NULL, +/* dbab */ NULL, +/* dbac */ NULL, +/* dbad */ NULL, +/* dbae */ NULL, +/* dbaf */ NULL, +/* dbb0 */ NULL, +/* dbb1 */ NULL, +/* dbb2 */ NULL, +/* dbb3 */ NULL, +/* dbb4 */ NULL, +/* dbb5 */ NULL, +/* dbb6 */ NULL, +/* dbb7 */ NULL, +/* dbb8 */ NULL, +/* dbb9 */ NULL, +/* dbba */ NULL, +/* dbbb */ NULL, +/* dbbc */ NULL, +/* dbbd */ NULL, +/* dbbe */ NULL, +/* dbbf */ NULL, +/* dbc0 */ NULL, +/* dbc1 */ NULL, +/* dbc2 */ NULL, +/* dbc3 */ NULL, +/* dbc4 */ NULL, +/* dbc5 */ NULL, +/* dbc6 */ NULL, +/* dbc7 */ NULL, +/* dbc8 */ NULL, +/* dbc9 */ NULL, +/* dbca */ NULL, +/* dbcb */ NULL, +/* dbcc */ NULL, +/* dbcd */ NULL, +/* dbce */ NULL, +/* dbcf */ NULL, +/* dbd0 */ NULL, +/* dbd1 */ NULL, +/* dbd2 */ NULL, +/* dbd3 */ NULL, +/* dbd4 */ NULL, +/* dbd5 */ NULL, +/* dbd6 */ NULL, +/* dbd7 */ NULL, +/* dbd8 */ NULL, +/* dbd9 */ NULL, +/* dbda */ NULL, +/* dbdb */ NULL, +/* dbdc */ NULL, +/* dbdd */ NULL, +/* dbde */ NULL, +/* dbdf */ NULL, +/* dbe0 */ NULL, +/* dbe1 */ NULL, +/* dbe2 */ NULL, +/* dbe3 */ NULL, +/* dbe4 */ NULL, +/* dbe5 */ NULL, +/* dbe6 */ NULL, +/* dbe7 */ NULL, +/* dbe8 */ NULL, +/* dbe9 */ NULL, +/* dbea */ NULL, +/* dbeb */ NULL, +/* dbec */ NULL, +/* dbed */ NULL, +/* dbee */ NULL, +/* dbef */ NULL, +/* dbf0 */ NULL, +/* dbf1 */ NULL, +/* dbf2 */ NULL, +/* dbf3 */ NULL, +/* dbf4 */ NULL, +/* dbf5 */ NULL, +/* dbf6 */ NULL, +/* dbf7 */ NULL, +/* dbf8 */ NULL, +/* dbf9 */ NULL, +/* dbfa */ NULL, +/* dbfb */ NULL, +/* dbfc */ NULL, +/* dbfd */ NULL, +/* dbfe */ NULL, +/* dbff */ NULL, +/* dc00 */ NULL, +/* dc01 */ NULL, +/* dc02 */ NULL, +/* dc03 */ NULL, +/* dc04 */ NULL, +/* dc05 */ NULL, +/* dc06 */ NULL, +/* dc07 */ NULL, +/* dc08 */ NULL, +/* dc09 */ NULL, +/* dc0a */ NULL, +/* dc0b */ NULL, +/* dc0c */ NULL, +/* dc0d */ NULL, +/* dc0e */ NULL, +/* dc0f */ NULL, +/* dc10 */ NULL, +/* dc11 */ NULL, +/* dc12 */ NULL, +/* dc13 */ NULL, +/* dc14 */ NULL, +/* dc15 */ NULL, +/* dc16 */ NULL, +/* dc17 */ NULL, +/* dc18 */ NULL, +/* dc19 */ NULL, +/* dc1a */ NULL, +/* dc1b */ NULL, +/* dc1c */ NULL, +/* dc1d */ NULL, +/* dc1e */ NULL, +/* dc1f */ NULL, +/* dc20 */ NULL, +/* dc21 */ NULL, +/* dc22 */ NULL, +/* dc23 */ NULL, +/* dc24 */ NULL, +/* dc25 */ NULL, +/* dc26 */ NULL, +/* dc27 */ NULL, +/* dc28 */ NULL, +/* dc29 */ NULL, +/* dc2a */ NULL, +/* dc2b */ NULL, +/* dc2c */ NULL, +/* dc2d */ NULL, +/* dc2e */ NULL, +/* dc2f */ NULL, +/* dc30 */ NULL, +/* dc31 */ NULL, +/* dc32 */ NULL, +/* dc33 */ NULL, +/* dc34 */ NULL, +/* dc35 */ NULL, +/* dc36 */ NULL, +/* dc37 */ NULL, +/* dc38 */ NULL, +/* dc39 */ NULL, +/* dc3a */ NULL, +/* dc3b */ NULL, +/* dc3c */ NULL, +/* dc3d */ NULL, +/* dc3e */ NULL, +/* dc3f */ NULL, +/* dc40 */ NULL, +/* dc41 */ NULL, +/* dc42 */ NULL, +/* dc43 */ NULL, +/* dc44 */ NULL, +/* dc45 */ NULL, +/* dc46 */ NULL, +/* dc47 */ NULL, +/* dc48 */ NULL, +/* dc49 */ NULL, +/* dc4a */ NULL, +/* dc4b */ NULL, +/* dc4c */ NULL, +/* dc4d */ NULL, +/* dc4e */ NULL, +/* dc4f */ NULL, +/* dc50 */ NULL, +/* dc51 */ NULL, +/* dc52 */ NULL, +/* dc53 */ NULL, +/* dc54 */ NULL, +/* dc55 */ NULL, +/* dc56 */ NULL, +/* dc57 */ NULL, +/* dc58 */ NULL, +/* dc59 */ NULL, +/* dc5a */ NULL, +/* dc5b */ NULL, +/* dc5c */ NULL, +/* dc5d */ NULL, +/* dc5e */ NULL, +/* dc5f */ NULL, +/* dc60 */ NULL, +/* dc61 */ NULL, +/* dc62 */ NULL, +/* dc63 */ NULL, +/* dc64 */ NULL, +/* dc65 */ NULL, +/* dc66 */ NULL, +/* dc67 */ NULL, +/* dc68 */ NULL, +/* dc69 */ NULL, +/* dc6a */ NULL, +/* dc6b */ NULL, +/* dc6c */ NULL, +/* dc6d */ NULL, +/* dc6e */ NULL, +/* dc6f */ NULL, +/* dc70 */ NULL, +/* dc71 */ NULL, +/* dc72 */ NULL, +/* dc73 */ NULL, +/* dc74 */ NULL, +/* dc75 */ NULL, +/* dc76 */ NULL, +/* dc77 */ NULL, +/* dc78 */ NULL, +/* dc79 */ NULL, +/* dc7a */ NULL, +/* dc7b */ NULL, +/* dc7c */ NULL, +/* dc7d */ NULL, +/* dc7e */ NULL, +/* dc7f */ NULL, +/* dc80 */ NULL, +/* dc81 */ NULL, +/* dc82 */ NULL, +/* dc83 */ NULL, +/* dc84 */ NULL, +/* dc85 */ NULL, +/* dc86 */ NULL, +/* dc87 */ NULL, +/* dc88 */ NULL, +/* dc89 */ NULL, +/* dc8a */ NULL, +/* dc8b */ NULL, +/* dc8c */ NULL, +/* dc8d */ NULL, +/* dc8e */ NULL, +/* dc8f */ NULL, +/* dc90 */ NULL, +/* dc91 */ NULL, +/* dc92 */ NULL, +/* dc93 */ NULL, +/* dc94 */ NULL, +/* dc95 */ NULL, +/* dc96 */ NULL, +/* dc97 */ NULL, +/* dc98 */ NULL, +/* dc99 */ NULL, +/* dc9a */ NULL, +/* dc9b */ NULL, +/* dc9c */ NULL, +/* dc9d */ NULL, +/* dc9e */ NULL, +/* dc9f */ NULL, +/* dca0 */ NULL, +/* dca1 */ NULL, +/* dca2 */ NULL, +/* dca3 */ NULL, +/* dca4 */ NULL, +/* dca5 */ NULL, +/* dca6 */ NULL, +/* dca7 */ NULL, +/* dca8 */ NULL, +/* dca9 */ NULL, +/* dcaa */ NULL, +/* dcab */ NULL, +/* dcac */ NULL, +/* dcad */ NULL, +/* dcae */ NULL, +/* dcaf */ NULL, +/* dcb0 */ NULL, +/* dcb1 */ NULL, +/* dcb2 */ NULL, +/* dcb3 */ NULL, +/* dcb4 */ NULL, +/* dcb5 */ NULL, +/* dcb6 */ NULL, +/* dcb7 */ NULL, +/* dcb8 */ NULL, +/* dcb9 */ NULL, +/* dcba */ NULL, +/* dcbb */ NULL, +/* dcbc */ NULL, +/* dcbd */ NULL, +/* dcbe */ NULL, +/* dcbf */ NULL, +/* dcc0 */ NULL, +/* dcc1 */ NULL, +/* dcc2 */ NULL, +/* dcc3 */ NULL, +/* dcc4 */ NULL, +/* dcc5 */ NULL, +/* dcc6 */ NULL, +/* dcc7 */ NULL, +/* dcc8 */ NULL, +/* dcc9 */ NULL, +/* dcca */ NULL, +/* dccb */ NULL, +/* dccc */ NULL, +/* dccd */ NULL, +/* dcce */ NULL, +/* dccf */ NULL, +/* dcd0 */ NULL, +/* dcd1 */ NULL, +/* dcd2 */ NULL, +/* dcd3 */ NULL, +/* dcd4 */ NULL, +/* dcd5 */ NULL, +/* dcd6 */ NULL, +/* dcd7 */ NULL, +/* dcd8 */ NULL, +/* dcd9 */ NULL, +/* dcda */ NULL, +/* dcdb */ NULL, +/* dcdc */ NULL, +/* dcdd */ NULL, +/* dcde */ NULL, +/* dcdf */ NULL, +/* dce0 */ NULL, +/* dce1 */ NULL, +/* dce2 */ NULL, +/* dce3 */ NULL, +/* dce4 */ NULL, +/* dce5 */ NULL, +/* dce6 */ NULL, +/* dce7 */ NULL, +/* dce8 */ NULL, +/* dce9 */ NULL, +/* dcea */ NULL, +/* dceb */ NULL, +/* dcec */ NULL, +/* dced */ NULL, +/* dcee */ NULL, +/* dcef */ NULL, +/* dcf0 */ NULL, +/* dcf1 */ NULL, +/* dcf2 */ NULL, +/* dcf3 */ NULL, +/* dcf4 */ NULL, +/* dcf5 */ NULL, +/* dcf6 */ NULL, +/* dcf7 */ NULL, +/* dcf8 */ NULL, +/* dcf9 */ NULL, +/* dcfa */ NULL, +/* dcfb */ NULL, +/* dcfc */ NULL, +/* dcfd */ NULL, +/* dcfe */ NULL, +/* dcff */ NULL, +/* dd00 */ NULL, +/* dd01 */ NULL, +/* dd02 */ NULL, +/* dd03 */ NULL, +/* dd04 */ NULL, +/* dd05 */ NULL, +/* dd06 */ NULL, +/* dd07 */ NULL, +/* dd08 */ NULL, +/* dd09 */ NULL, +/* dd0a */ NULL, +/* dd0b */ NULL, +/* dd0c */ NULL, +/* dd0d */ NULL, +/* dd0e */ NULL, +/* dd0f */ NULL, +/* dd10 */ NULL, +/* dd11 */ NULL, +/* dd12 */ NULL, +/* dd13 */ NULL, +/* dd14 */ NULL, +/* dd15 */ NULL, +/* dd16 */ NULL, +/* dd17 */ NULL, +/* dd18 */ NULL, +/* dd19 */ NULL, +/* dd1a */ NULL, +/* dd1b */ NULL, +/* dd1c */ NULL, +/* dd1d */ NULL, +/* dd1e */ NULL, +/* dd1f */ NULL, +/* dd20 */ NULL, +/* dd21 */ NULL, +/* dd22 */ NULL, +/* dd23 */ NULL, +/* dd24 */ NULL, +/* dd25 */ NULL, +/* dd26 */ NULL, +/* dd27 */ NULL, +/* dd28 */ NULL, +/* dd29 */ NULL, +/* dd2a */ NULL, +/* dd2b */ NULL, +/* dd2c */ NULL, +/* dd2d */ NULL, +/* dd2e */ NULL, +/* dd2f */ NULL, +/* dd30 */ NULL, +/* dd31 */ NULL, +/* dd32 */ NULL, +/* dd33 */ NULL, +/* dd34 */ NULL, +/* dd35 */ NULL, +/* dd36 */ NULL, +/* dd37 */ NULL, +/* dd38 */ NULL, +/* dd39 */ NULL, +/* dd3a */ NULL, +/* dd3b */ NULL, +/* dd3c */ NULL, +/* dd3d */ NULL, +/* dd3e */ NULL, +/* dd3f */ NULL, +/* dd40 */ NULL, +/* dd41 */ NULL, +/* dd42 */ NULL, +/* dd43 */ NULL, +/* dd44 */ NULL, +/* dd45 */ NULL, +/* dd46 */ NULL, +/* dd47 */ NULL, +/* dd48 */ NULL, +/* dd49 */ NULL, +/* dd4a */ NULL, +/* dd4b */ NULL, +/* dd4c */ NULL, +/* dd4d */ NULL, +/* dd4e */ NULL, +/* dd4f */ NULL, +/* dd50 */ NULL, +/* dd51 */ NULL, +/* dd52 */ NULL, +/* dd53 */ NULL, +/* dd54 */ NULL, +/* dd55 */ NULL, +/* dd56 */ NULL, +/* dd57 */ NULL, +/* dd58 */ NULL, +/* dd59 */ NULL, +/* dd5a */ NULL, +/* dd5b */ NULL, +/* dd5c */ NULL, +/* dd5d */ NULL, +/* dd5e */ NULL, +/* dd5f */ NULL, +/* dd60 */ NULL, +/* dd61 */ NULL, +/* dd62 */ NULL, +/* dd63 */ NULL, +/* dd64 */ NULL, +/* dd65 */ NULL, +/* dd66 */ NULL, +/* dd67 */ NULL, +/* dd68 */ NULL, +/* dd69 */ NULL, +/* dd6a */ NULL, +/* dd6b */ NULL, +/* dd6c */ NULL, +/* dd6d */ NULL, +/* dd6e */ NULL, +/* dd6f */ NULL, +/* dd70 */ NULL, +/* dd71 */ NULL, +/* dd72 */ NULL, +/* dd73 */ NULL, +/* dd74 */ NULL, +/* dd75 */ NULL, +/* dd76 */ NULL, +/* dd77 */ NULL, +/* dd78 */ NULL, +/* dd79 */ NULL, +/* dd7a */ NULL, +/* dd7b */ NULL, +/* dd7c */ NULL, +/* dd7d */ NULL, +/* dd7e */ NULL, +/* dd7f */ NULL, +/* dd80 */ NULL, +/* dd81 */ NULL, +/* dd82 */ NULL, +/* dd83 */ NULL, +/* dd84 */ NULL, +/* dd85 */ NULL, +/* dd86 */ NULL, +/* dd87 */ NULL, +/* dd88 */ NULL, +/* dd89 */ NULL, +/* dd8a */ NULL, +/* dd8b */ NULL, +/* dd8c */ NULL, +/* dd8d */ NULL, +/* dd8e */ NULL, +/* dd8f */ NULL, +/* dd90 */ NULL, +/* dd91 */ NULL, +/* dd92 */ NULL, +/* dd93 */ NULL, +/* dd94 */ NULL, +/* dd95 */ NULL, +/* dd96 */ NULL, +/* dd97 */ NULL, +/* dd98 */ NULL, +/* dd99 */ NULL, +/* dd9a */ NULL, +/* dd9b */ NULL, +/* dd9c */ NULL, +/* dd9d */ NULL, +/* dd9e */ NULL, +/* dd9f */ NULL, +/* dda0 */ NULL, +/* dda1 */ NULL, +/* dda2 */ NULL, +/* dda3 */ NULL, +/* dda4 */ NULL, +/* dda5 */ NULL, +/* dda6 */ NULL, +/* dda7 */ NULL, +/* dda8 */ NULL, +/* dda9 */ NULL, +/* ddaa */ NULL, +/* ddab */ NULL, +/* ddac */ NULL, +/* ddad */ NULL, +/* ddae */ NULL, +/* ddaf */ NULL, +/* ddb0 */ NULL, +/* ddb1 */ NULL, +/* ddb2 */ NULL, +/* ddb3 */ NULL, +/* ddb4 */ NULL, +/* ddb5 */ NULL, +/* ddb6 */ NULL, +/* ddb7 */ NULL, +/* ddb8 */ NULL, +/* ddb9 */ NULL, +/* ddba */ NULL, +/* ddbb */ NULL, +/* ddbc */ NULL, +/* ddbd */ NULL, +/* ddbe */ NULL, +/* ddbf */ NULL, +/* ddc0 */ NULL, +/* ddc1 */ NULL, +/* ddc2 */ NULL, +/* ddc3 */ NULL, +/* ddc4 */ NULL, +/* ddc5 */ NULL, +/* ddc6 */ NULL, +/* ddc7 */ NULL, +/* ddc8 */ NULL, +/* ddc9 */ NULL, +/* ddca */ NULL, +/* ddcb */ NULL, +/* ddcc */ NULL, +/* ddcd */ NULL, +/* ddce */ NULL, +/* ddcf */ NULL, +/* ddd0 */ NULL, +/* ddd1 */ NULL, +/* ddd2 */ NULL, +/* ddd3 */ NULL, +/* ddd4 */ NULL, +/* ddd5 */ NULL, +/* ddd6 */ NULL, +/* ddd7 */ NULL, +/* ddd8 */ NULL, +/* ddd9 */ NULL, +/* ddda */ NULL, +/* dddb */ NULL, +/* dddc */ NULL, +/* dddd */ NULL, +/* ddde */ NULL, +/* dddf */ NULL, +/* dde0 */ NULL, +/* dde1 */ NULL, +/* dde2 */ NULL, +/* dde3 */ NULL, +/* dde4 */ NULL, +/* dde5 */ NULL, +/* dde6 */ NULL, +/* dde7 */ NULL, +/* dde8 */ NULL, +/* dde9 */ NULL, +/* ddea */ NULL, +/* ddeb */ NULL, +/* ddec */ NULL, +/* dded */ NULL, +/* ddee */ NULL, +/* ddef */ NULL, +/* ddf0 */ NULL, +/* ddf1 */ NULL, +/* ddf2 */ NULL, +/* ddf3 */ NULL, +/* ddf4 */ NULL, +/* ddf5 */ NULL, +/* ddf6 */ NULL, +/* ddf7 */ NULL, +/* ddf8 */ NULL, +/* ddf9 */ NULL, +/* ddfa */ NULL, +/* ddfb */ NULL, +/* ddfc */ NULL, +/* ddfd */ NULL, +/* ddfe */ NULL, +/* ddff */ NULL, +/* de00 */ NULL, +/* de01 */ NULL, +/* de02 */ NULL, +/* de03 */ NULL, +/* de04 */ NULL, +/* de05 */ NULL, +/* de06 */ NULL, +/* de07 */ NULL, +/* de08 */ NULL, +/* de09 */ NULL, +/* de0a */ NULL, +/* de0b */ NULL, +/* de0c */ NULL, +/* de0d */ NULL, +/* de0e */ NULL, +/* de0f */ NULL, +/* de10 */ NULL, +/* de11 */ NULL, +/* de12 */ NULL, +/* de13 */ NULL, +/* de14 */ NULL, +/* de15 */ NULL, +/* de16 */ NULL, +/* de17 */ NULL, +/* de18 */ NULL, +/* de19 */ NULL, +/* de1a */ NULL, +/* de1b */ NULL, +/* de1c */ NULL, +/* de1d */ NULL, +/* de1e */ NULL, +/* de1f */ NULL, +/* de20 */ NULL, +/* de21 */ NULL, +/* de22 */ NULL, +/* de23 */ NULL, +/* de24 */ NULL, +/* de25 */ NULL, +/* de26 */ NULL, +/* de27 */ NULL, +/* de28 */ NULL, +/* de29 */ NULL, +/* de2a */ NULL, +/* de2b */ NULL, +/* de2c */ NULL, +/* de2d */ NULL, +/* de2e */ NULL, +/* de2f */ NULL, +/* de30 */ NULL, +/* de31 */ NULL, +/* de32 */ NULL, +/* de33 */ NULL, +/* de34 */ NULL, +/* de35 */ NULL, +/* de36 */ NULL, +/* de37 */ NULL, +/* de38 */ NULL, +/* de39 */ NULL, +/* de3a */ NULL, +/* de3b */ NULL, +/* de3c */ NULL, +/* de3d */ NULL, +/* de3e */ NULL, +/* de3f */ NULL, +/* de40 */ NULL, +/* de41 */ NULL, +/* de42 */ NULL, +/* de43 */ NULL, +/* de44 */ NULL, +/* de45 */ NULL, +/* de46 */ NULL, +/* de47 */ NULL, +/* de48 */ NULL, +/* de49 */ NULL, +/* de4a */ NULL, +/* de4b */ NULL, +/* de4c */ NULL, +/* de4d */ NULL, +/* de4e */ NULL, +/* de4f */ NULL, +/* de50 */ NULL, +/* de51 */ NULL, +/* de52 */ NULL, +/* de53 */ NULL, +/* de54 */ NULL, +/* de55 */ NULL, +/* de56 */ NULL, +/* de57 */ NULL, +/* de58 */ NULL, +/* de59 */ NULL, +/* de5a */ NULL, +/* de5b */ NULL, +/* de5c */ NULL, +/* de5d */ NULL, +/* de5e */ NULL, +/* de5f */ NULL, +/* de60 */ NULL, +/* de61 */ NULL, +/* de62 */ NULL, +/* de63 */ NULL, +/* de64 */ NULL, +/* de65 */ NULL, +/* de66 */ NULL, +/* de67 */ NULL, +/* de68 */ NULL, +/* de69 */ NULL, +/* de6a */ NULL, +/* de6b */ NULL, +/* de6c */ NULL, +/* de6d */ NULL, +/* de6e */ NULL, +/* de6f */ NULL, +/* de70 */ NULL, +/* de71 */ NULL, +/* de72 */ NULL, +/* de73 */ NULL, +/* de74 */ NULL, +/* de75 */ NULL, +/* de76 */ NULL, +/* de77 */ NULL, +/* de78 */ NULL, +/* de79 */ NULL, +/* de7a */ NULL, +/* de7b */ NULL, +/* de7c */ NULL, +/* de7d */ NULL, +/* de7e */ NULL, +/* de7f */ NULL, +/* de80 */ NULL, +/* de81 */ NULL, +/* de82 */ NULL, +/* de83 */ NULL, +/* de84 */ NULL, +/* de85 */ NULL, +/* de86 */ NULL, +/* de87 */ NULL, +/* de88 */ NULL, +/* de89 */ NULL, +/* de8a */ NULL, +/* de8b */ NULL, +/* de8c */ NULL, +/* de8d */ NULL, +/* de8e */ NULL, +/* de8f */ NULL, +/* de90 */ NULL, +/* de91 */ NULL, +/* de92 */ NULL, +/* de93 */ NULL, +/* de94 */ NULL, +/* de95 */ NULL, +/* de96 */ NULL, +/* de97 */ NULL, +/* de98 */ NULL, +/* de99 */ NULL, +/* de9a */ NULL, +/* de9b */ NULL, +/* de9c */ NULL, +/* de9d */ NULL, +/* de9e */ NULL, +/* de9f */ NULL, +/* dea0 */ NULL, +/* dea1 */ NULL, +/* dea2 */ NULL, +/* dea3 */ NULL, +/* dea4 */ NULL, +/* dea5 */ NULL, +/* dea6 */ NULL, +/* dea7 */ NULL, +/* dea8 */ NULL, +/* dea9 */ NULL, +/* deaa */ NULL, +/* deab */ NULL, +/* deac */ NULL, +/* dead */ NULL, +/* deae */ NULL, +/* deaf */ NULL, +/* deb0 */ NULL, +/* deb1 */ NULL, +/* deb2 */ NULL, +/* deb3 */ NULL, +/* deb4 */ NULL, +/* deb5 */ NULL, +/* deb6 */ NULL, +/* deb7 */ NULL, +/* deb8 */ NULL, +/* deb9 */ NULL, +/* deba */ NULL, +/* debb */ NULL, +/* debc */ NULL, +/* debd */ NULL, +/* debe */ NULL, +/* debf */ NULL, +/* dec0 */ NULL, +/* dec1 */ NULL, +/* dec2 */ NULL, +/* dec3 */ NULL, +/* dec4 */ NULL, +/* dec5 */ NULL, +/* dec6 */ NULL, +/* dec7 */ NULL, +/* dec8 */ NULL, +/* dec9 */ NULL, +/* deca */ NULL, +/* decb */ NULL, +/* decc */ NULL, +/* decd */ NULL, +/* dece */ NULL, +/* decf */ NULL, +/* ded0 */ NULL, +/* ded1 */ NULL, +/* ded2 */ NULL, +/* ded3 */ NULL, +/* ded4 */ NULL, +/* ded5 */ NULL, +/* ded6 */ NULL, +/* ded7 */ NULL, +/* ded8 */ NULL, +/* ded9 */ NULL, +/* deda */ NULL, +/* dedb */ NULL, +/* dedc */ NULL, +/* dedd */ NULL, +/* dede */ NULL, +/* dedf */ NULL, +/* dee0 */ NULL, +/* dee1 */ NULL, +/* dee2 */ NULL, +/* dee3 */ NULL, +/* dee4 */ NULL, +/* dee5 */ NULL, +/* dee6 */ NULL, +/* dee7 */ NULL, +/* dee8 */ NULL, +/* dee9 */ NULL, +/* deea */ NULL, +/* deeb */ NULL, +/* deec */ NULL, +/* deed */ NULL, +/* deee */ NULL, +/* deef */ NULL, +/* def0 */ NULL, +/* def1 */ NULL, +/* def2 */ NULL, +/* def3 */ NULL, +/* def4 */ NULL, +/* def5 */ NULL, +/* def6 */ NULL, +/* def7 */ NULL, +/* def8 */ NULL, +/* def9 */ NULL, +/* defa */ NULL, +/* defb */ NULL, +/* defc */ NULL, +/* defd */ NULL, +/* defe */ NULL, +/* deff */ NULL, +/* df00 */ NULL, +/* df01 */ NULL, +/* df02 */ NULL, +/* df03 */ NULL, +/* df04 */ NULL, +/* df05 */ NULL, +/* df06 */ NULL, +/* df07 */ NULL, +/* df08 */ NULL, +/* df09 */ NULL, +/* df0a */ NULL, +/* df0b */ NULL, +/* df0c */ NULL, +/* df0d */ NULL, +/* df0e */ NULL, +/* df0f */ NULL, +/* df10 */ NULL, +/* df11 */ NULL, +/* df12 */ NULL, +/* df13 */ NULL, +/* df14 */ NULL, +/* df15 */ NULL, +/* df16 */ NULL, +/* df17 */ NULL, +/* df18 */ NULL, +/* df19 */ NULL, +/* df1a */ NULL, +/* df1b */ NULL, +/* df1c */ NULL, +/* df1d */ NULL, +/* df1e */ NULL, +/* df1f */ NULL, +/* df20 */ NULL, +/* df21 */ NULL, +/* df22 */ NULL, +/* df23 */ NULL, +/* df24 */ NULL, +/* df25 */ NULL, +/* df26 */ NULL, +/* df27 */ NULL, +/* df28 */ NULL, +/* df29 */ NULL, +/* df2a */ NULL, +/* df2b */ NULL, +/* df2c */ NULL, +/* df2d */ NULL, +/* df2e */ NULL, +/* df2f */ NULL, +/* df30 */ NULL, +/* df31 */ NULL, +/* df32 */ NULL, +/* df33 */ NULL, +/* df34 */ NULL, +/* df35 */ NULL, +/* df36 */ NULL, +/* df37 */ NULL, +/* df38 */ NULL, +/* df39 */ NULL, +/* df3a */ NULL, +/* df3b */ NULL, +/* df3c */ NULL, +/* df3d */ NULL, +/* df3e */ NULL, +/* df3f */ NULL, +/* df40 */ NULL, +/* df41 */ NULL, +/* df42 */ NULL, +/* df43 */ NULL, +/* df44 */ NULL, +/* df45 */ NULL, +/* df46 */ NULL, +/* df47 */ NULL, +/* df48 */ NULL, +/* df49 */ NULL, +/* df4a */ NULL, +/* df4b */ NULL, +/* df4c */ NULL, +/* df4d */ NULL, +/* df4e */ NULL, +/* df4f */ NULL, +/* df50 */ NULL, +/* df51 */ NULL, +/* df52 */ NULL, +/* df53 */ NULL, +/* df54 */ NULL, +/* df55 */ NULL, +/* df56 */ NULL, +/* df57 */ NULL, +/* df58 */ NULL, +/* df59 */ NULL, +/* df5a */ NULL, +/* df5b */ NULL, +/* df5c */ NULL, +/* df5d */ NULL, +/* df5e */ NULL, +/* df5f */ NULL, +/* df60 */ NULL, +/* df61 */ NULL, +/* df62 */ NULL, +/* df63 */ NULL, +/* df64 */ NULL, +/* df65 */ NULL, +/* df66 */ NULL, +/* df67 */ NULL, +/* df68 */ NULL, +/* df69 */ NULL, +/* df6a */ NULL, +/* df6b */ NULL, +/* df6c */ NULL, +/* df6d */ NULL, +/* df6e */ NULL, +/* df6f */ NULL, +/* df70 */ NULL, +/* df71 */ NULL, +/* df72 */ NULL, +/* df73 */ NULL, +/* df74 */ NULL, +/* df75 */ NULL, +/* df76 */ NULL, +/* df77 */ NULL, +/* df78 */ NULL, +/* df79 */ NULL, +/* df7a */ NULL, +/* df7b */ NULL, +/* df7c */ NULL, +/* df7d */ NULL, +/* df7e */ NULL, +/* df7f */ NULL, +/* df80 */ NULL, +/* df81 */ NULL, +/* df82 */ NULL, +/* df83 */ NULL, +/* df84 */ NULL, +/* df85 */ NULL, +/* df86 */ NULL, +/* df87 */ NULL, +/* df88 */ NULL, +/* df89 */ NULL, +/* df8a */ NULL, +/* df8b */ NULL, +/* df8c */ NULL, +/* df8d */ NULL, +/* df8e */ NULL, +/* df8f */ NULL, +/* df90 */ NULL, +/* df91 */ NULL, +/* df92 */ NULL, +/* df93 */ NULL, +/* df94 */ NULL, +/* df95 */ NULL, +/* df96 */ NULL, +/* df97 */ NULL, +/* df98 */ NULL, +/* df99 */ NULL, +/* df9a */ NULL, +/* df9b */ NULL, +/* df9c */ NULL, +/* df9d */ NULL, +/* df9e */ NULL, +/* df9f */ NULL, +/* dfa0 */ NULL, +/* dfa1 */ NULL, +/* dfa2 */ NULL, +/* dfa3 */ NULL, +/* dfa4 */ NULL, +/* dfa5 */ NULL, +/* dfa6 */ NULL, +/* dfa7 */ NULL, +/* dfa8 */ NULL, +/* dfa9 */ NULL, +/* dfaa */ NULL, +/* dfab */ NULL, +/* dfac */ NULL, +/* dfad */ NULL, +/* dfae */ NULL, +/* dfaf */ NULL, +/* dfb0 */ NULL, +/* dfb1 */ NULL, +/* dfb2 */ NULL, +/* dfb3 */ NULL, +/* dfb4 */ NULL, +/* dfb5 */ NULL, +/* dfb6 */ NULL, +/* dfb7 */ NULL, +/* dfb8 */ NULL, +/* dfb9 */ NULL, +/* dfba */ NULL, +/* dfbb */ NULL, +/* dfbc */ NULL, +/* dfbd */ NULL, +/* dfbe */ NULL, +/* dfbf */ NULL, +/* dfc0 */ NULL, +/* dfc1 */ NULL, +/* dfc2 */ NULL, +/* dfc3 */ NULL, +/* dfc4 */ NULL, +/* dfc5 */ NULL, +/* dfc6 */ NULL, +/* dfc7 */ NULL, +/* dfc8 */ NULL, +/* dfc9 */ NULL, +/* dfca */ NULL, +/* dfcb */ NULL, +/* dfcc */ NULL, +/* dfcd */ NULL, +/* dfce */ NULL, +/* dfcf */ NULL, +/* dfd0 */ NULL, +/* dfd1 */ NULL, +/* dfd2 */ NULL, +/* dfd3 */ NULL, +/* dfd4 */ NULL, +/* dfd5 */ NULL, +/* dfd6 */ NULL, +/* dfd7 */ NULL, +/* dfd8 */ NULL, +/* dfd9 */ NULL, +/* dfda */ NULL, +/* dfdb */ NULL, +/* dfdc */ NULL, +/* dfdd */ NULL, +/* dfde */ NULL, +/* dfdf */ NULL, +/* dfe0 */ NULL, +/* dfe1 */ NULL, +/* dfe2 */ NULL, +/* dfe3 */ NULL, +/* dfe4 */ NULL, +/* dfe5 */ NULL, +/* dfe6 */ NULL, +/* dfe7 */ NULL, +/* dfe8 */ NULL, +/* dfe9 */ NULL, +/* dfea */ NULL, +/* dfeb */ NULL, +/* dfec */ NULL, +/* dfed */ NULL, +/* dfee */ NULL, +/* dfef */ NULL, +/* dff0 */ NULL, +/* dff1 */ NULL, +/* dff2 */ NULL, +/* dff3 */ NULL, +/* dff4 */ NULL, +/* dff5 */ NULL, +/* dff6 */ NULL, +/* dff7 */ NULL, +/* dff8 */ NULL, +/* dff9 */ NULL, +/* dffa */ NULL, +/* dffb */ NULL, +/* dffc */ NULL, +/* dffd */ NULL, +/* dffe */ NULL, +/* dfff */ NULL, +/* e000 */ NULL, +/* e001 */ NULL, +/* e002 */ NULL, +/* e003 */ NULL, +/* e004 */ NULL, +/* e005 */ NULL, +/* e006 */ NULL, +/* e007 */ NULL, +/* e008 */ NULL, +/* e009 */ NULL, +/* e00a */ NULL, +/* e00b */ NULL, +/* e00c */ NULL, +/* e00d */ NULL, +/* e00e */ NULL, +/* e00f */ NULL, +/* e010 */ NULL, +/* e011 */ NULL, +/* e012 */ NULL, +/* e013 */ NULL, +/* e014 */ NULL, +/* e015 */ NULL, +/* e016 */ NULL, +/* e017 */ NULL, +/* e018 */ NULL, +/* e019 */ NULL, +/* e01a */ NULL, +/* e01b */ NULL, +/* e01c */ NULL, +/* e01d */ NULL, +/* e01e */ NULL, +/* e01f */ NULL, +/* e020 */ NULL, +/* e021 */ NULL, +/* e022 */ NULL, +/* e023 */ NULL, +/* e024 */ NULL, +/* e025 */ NULL, +/* e026 */ NULL, +/* e027 */ NULL, +/* e028 */ NULL, +/* e029 */ NULL, +/* e02a */ NULL, +/* e02b */ NULL, +/* e02c */ NULL, +/* e02d */ NULL, +/* e02e */ NULL, +/* e02f */ NULL, +/* e030 */ NULL, +/* e031 */ NULL, +/* e032 */ NULL, +/* e033 */ NULL, +/* e034 */ NULL, +/* e035 */ NULL, +/* e036 */ NULL, +/* e037 */ NULL, +/* e038 */ NULL, +/* e039 */ NULL, +/* e03a */ NULL, +/* e03b */ NULL, +/* e03c */ NULL, +/* e03d */ NULL, +/* e03e */ NULL, +/* e03f */ NULL, +/* e040 */ NULL, +/* e041 */ NULL, +/* e042 */ NULL, +/* e043 */ NULL, +/* e044 */ NULL, +/* e045 */ NULL, +/* e046 */ NULL, +/* e047 */ NULL, +/* e048 */ NULL, +/* e049 */ NULL, +/* e04a */ NULL, +/* e04b */ NULL, +/* e04c */ NULL, +/* e04d */ NULL, +/* e04e */ NULL, +/* e04f */ NULL, +/* e050 */ NULL, +/* e051 */ NULL, +/* e052 */ NULL, +/* e053 */ NULL, +/* e054 */ NULL, +/* e055 */ NULL, +/* e056 */ NULL, +/* e057 */ NULL, +/* e058 */ NULL, +/* e059 */ NULL, +/* e05a */ NULL, +/* e05b */ NULL, +/* e05c */ NULL, +/* e05d */ NULL, +/* e05e */ NULL, +/* e05f */ NULL, +/* e060 */ NULL, +/* e061 */ NULL, +/* e062 */ NULL, +/* e063 */ NULL, +/* e064 */ NULL, +/* e065 */ NULL, +/* e066 */ NULL, +/* e067 */ NULL, +/* e068 */ NULL, +/* e069 */ NULL, +/* e06a */ NULL, +/* e06b */ NULL, +/* e06c */ NULL, +/* e06d */ NULL, +/* e06e */ NULL, +/* e06f */ NULL, +/* e070 */ NULL, +/* e071 */ NULL, +/* e072 */ NULL, +/* e073 */ NULL, +/* e074 */ NULL, +/* e075 */ NULL, +/* e076 */ NULL, +/* e077 */ NULL, +/* e078 */ NULL, +/* e079 */ NULL, +/* e07a */ NULL, +/* e07b */ NULL, +/* e07c */ NULL, +/* e07d */ NULL, +/* e07e */ NULL, +/* e07f */ NULL, +/* e080 */ NULL, +/* e081 */ NULL, +/* e082 */ NULL, +/* e083 */ NULL, +/* e084 */ NULL, +/* e085 */ NULL, +/* e086 */ NULL, +/* e087 */ NULL, +/* e088 */ NULL, +/* e089 */ NULL, +/* e08a */ NULL, +/* e08b */ NULL, +/* e08c */ NULL, +/* e08d */ NULL, +/* e08e */ NULL, +/* e08f */ NULL, +/* e090 */ NULL, +/* e091 */ NULL, +/* e092 */ NULL, +/* e093 */ NULL, +/* e094 */ NULL, +/* e095 */ NULL, +/* e096 */ NULL, +/* e097 */ NULL, +/* e098 */ NULL, +/* e099 */ NULL, +/* e09a */ NULL, +/* e09b */ NULL, +/* e09c */ NULL, +/* e09d */ NULL, +/* e09e */ NULL, +/* e09f */ NULL, +/* e0a0 */ NULL, +/* e0a1 */ NULL, +/* e0a2 */ NULL, +/* e0a3 */ NULL, +/* e0a4 */ NULL, +/* e0a5 */ NULL, +/* e0a6 */ NULL, +/* e0a7 */ NULL, +/* e0a8 */ NULL, +/* e0a9 */ NULL, +/* e0aa */ NULL, +/* e0ab */ NULL, +/* e0ac */ NULL, +/* e0ad */ NULL, +/* e0ae */ NULL, +/* e0af */ NULL, +/* e0b0 */ NULL, +/* e0b1 */ NULL, +/* e0b2 */ NULL, +/* e0b3 */ NULL, +/* e0b4 */ NULL, +/* e0b5 */ NULL, +/* e0b6 */ NULL, +/* e0b7 */ NULL, +/* e0b8 */ NULL, +/* e0b9 */ NULL, +/* e0ba */ NULL, +/* e0bb */ NULL, +/* e0bc */ NULL, +/* e0bd */ NULL, +/* e0be */ NULL, +/* e0bf */ NULL, +/* e0c0 */ NULL, +/* e0c1 */ NULL, +/* e0c2 */ NULL, +/* e0c3 */ NULL, +/* e0c4 */ NULL, +/* e0c5 */ NULL, +/* e0c6 */ NULL, +/* e0c7 */ NULL, +/* e0c8 */ NULL, +/* e0c9 */ NULL, +/* e0ca */ NULL, +/* e0cb */ NULL, +/* e0cc */ NULL, +/* e0cd */ NULL, +/* e0ce */ NULL, +/* e0cf */ NULL, +/* e0d0 */ NULL, +/* e0d1 */ NULL, +/* e0d2 */ NULL, +/* e0d3 */ NULL, +/* e0d4 */ NULL, +/* e0d5 */ NULL, +/* e0d6 */ NULL, +/* e0d7 */ NULL, +/* e0d8 */ NULL, +/* e0d9 */ NULL, +/* e0da */ NULL, +/* e0db */ NULL, +/* e0dc */ NULL, +/* e0dd */ NULL, +/* e0de */ NULL, +/* e0df */ NULL, +/* e0e0 */ NULL, +/* e0e1 */ NULL, +/* e0e2 */ NULL, +/* e0e3 */ NULL, +/* e0e4 */ NULL, +/* e0e5 */ NULL, +/* e0e6 */ NULL, +/* e0e7 */ NULL, +/* e0e8 */ NULL, +/* e0e9 */ NULL, +/* e0ea */ NULL, +/* e0eb */ NULL, +/* e0ec */ NULL, +/* e0ed */ NULL, +/* e0ee */ NULL, +/* e0ef */ NULL, +/* e0f0 */ NULL, +/* e0f1 */ NULL, +/* e0f2 */ NULL, +/* e0f3 */ NULL, +/* e0f4 */ NULL, +/* e0f5 */ NULL, +/* e0f6 */ NULL, +/* e0f7 */ NULL, +/* e0f8 */ NULL, +/* e0f9 */ NULL, +/* e0fa */ NULL, +/* e0fb */ NULL, +/* e0fc */ NULL, +/* e0fd */ NULL, +/* e0fe */ NULL, +/* e0ff */ NULL, +/* e100 */ NULL, +/* e101 */ NULL, +/* e102 */ NULL, +/* e103 */ NULL, +/* e104 */ NULL, +/* e105 */ NULL, +/* e106 */ NULL, +/* e107 */ NULL, +/* e108 */ NULL, +/* e109 */ NULL, +/* e10a */ NULL, +/* e10b */ NULL, +/* e10c */ NULL, +/* e10d */ NULL, +/* e10e */ NULL, +/* e10f */ NULL, +/* e110 */ NULL, +/* e111 */ NULL, +/* e112 */ NULL, +/* e113 */ NULL, +/* e114 */ NULL, +/* e115 */ NULL, +/* e116 */ NULL, +/* e117 */ NULL, +/* e118 */ NULL, +/* e119 */ NULL, +/* e11a */ NULL, +/* e11b */ NULL, +/* e11c */ NULL, +/* e11d */ NULL, +/* e11e */ NULL, +/* e11f */ NULL, +/* e120 */ NULL, +/* e121 */ NULL, +/* e122 */ NULL, +/* e123 */ NULL, +/* e124 */ NULL, +/* e125 */ NULL, +/* e126 */ NULL, +/* e127 */ NULL, +/* e128 */ NULL, +/* e129 */ NULL, +/* e12a */ NULL, +/* e12b */ NULL, +/* e12c */ NULL, +/* e12d */ NULL, +/* e12e */ NULL, +/* e12f */ NULL, +/* e130 */ NULL, +/* e131 */ NULL, +/* e132 */ NULL, +/* e133 */ NULL, +/* e134 */ NULL, +/* e135 */ NULL, +/* e136 */ NULL, +/* e137 */ NULL, +/* e138 */ NULL, +/* e139 */ NULL, +/* e13a */ NULL, +/* e13b */ NULL, +/* e13c */ NULL, +/* e13d */ NULL, +/* e13e */ NULL, +/* e13f */ NULL, +/* e140 */ NULL, +/* e141 */ NULL, +/* e142 */ NULL, +/* e143 */ NULL, +/* e144 */ NULL, +/* e145 */ NULL, +/* e146 */ NULL, +/* e147 */ NULL, +/* e148 */ NULL, +/* e149 */ NULL, +/* e14a */ NULL, +/* e14b */ NULL, +/* e14c */ NULL, +/* e14d */ NULL, +/* e14e */ NULL, +/* e14f */ NULL, +/* e150 */ NULL, +/* e151 */ NULL, +/* e152 */ NULL, +/* e153 */ NULL, +/* e154 */ NULL, +/* e155 */ NULL, +/* e156 */ NULL, +/* e157 */ NULL, +/* e158 */ NULL, +/* e159 */ NULL, +/* e15a */ NULL, +/* e15b */ NULL, +/* e15c */ NULL, +/* e15d */ NULL, +/* e15e */ NULL, +/* e15f */ NULL, +/* e160 */ NULL, +/* e161 */ NULL, +/* e162 */ NULL, +/* e163 */ NULL, +/* e164 */ NULL, +/* e165 */ NULL, +/* e166 */ NULL, +/* e167 */ NULL, +/* e168 */ NULL, +/* e169 */ NULL, +/* e16a */ NULL, +/* e16b */ NULL, +/* e16c */ NULL, +/* e16d */ NULL, +/* e16e */ NULL, +/* e16f */ NULL, +/* e170 */ NULL, +/* e171 */ NULL, +/* e172 */ NULL, +/* e173 */ NULL, +/* e174 */ NULL, +/* e175 */ NULL, +/* e176 */ NULL, +/* e177 */ NULL, +/* e178 */ NULL, +/* e179 */ NULL, +/* e17a */ NULL, +/* e17b */ NULL, +/* e17c */ NULL, +/* e17d */ NULL, +/* e17e */ NULL, +/* e17f */ NULL, +/* e180 */ NULL, +/* e181 */ NULL, +/* e182 */ NULL, +/* e183 */ NULL, +/* e184 */ NULL, +/* e185 */ NULL, +/* e186 */ NULL, +/* e187 */ NULL, +/* e188 */ NULL, +/* e189 */ NULL, +/* e18a */ NULL, +/* e18b */ NULL, +/* e18c */ NULL, +/* e18d */ NULL, +/* e18e */ NULL, +/* e18f */ NULL, +/* e190 */ NULL, +/* e191 */ NULL, +/* e192 */ NULL, +/* e193 */ NULL, +/* e194 */ NULL, +/* e195 */ NULL, +/* e196 */ NULL, +/* e197 */ NULL, +/* e198 */ NULL, +/* e199 */ NULL, +/* e19a */ NULL, +/* e19b */ NULL, +/* e19c */ NULL, +/* e19d */ NULL, +/* e19e */ NULL, +/* e19f */ NULL, +/* e1a0 */ NULL, +/* e1a1 */ NULL, +/* e1a2 */ NULL, +/* e1a3 */ NULL, +/* e1a4 */ NULL, +/* e1a5 */ NULL, +/* e1a6 */ NULL, +/* e1a7 */ NULL, +/* e1a8 */ NULL, +/* e1a9 */ NULL, +/* e1aa */ NULL, +/* e1ab */ NULL, +/* e1ac */ NULL, +/* e1ad */ NULL, +/* e1ae */ NULL, +/* e1af */ NULL, +/* e1b0 */ NULL, +/* e1b1 */ NULL, +/* e1b2 */ NULL, +/* e1b3 */ NULL, +/* e1b4 */ NULL, +/* e1b5 */ NULL, +/* e1b6 */ NULL, +/* e1b7 */ NULL, +/* e1b8 */ NULL, +/* e1b9 */ NULL, +/* e1ba */ NULL, +/* e1bb */ NULL, +/* e1bc */ NULL, +/* e1bd */ NULL, +/* e1be */ NULL, +/* e1bf */ NULL, +/* e1c0 */ NULL, +/* e1c1 */ NULL, +/* e1c2 */ NULL, +/* e1c3 */ NULL, +/* e1c4 */ NULL, +/* e1c5 */ NULL, +/* e1c6 */ NULL, +/* e1c7 */ NULL, +/* e1c8 */ NULL, +/* e1c9 */ NULL, +/* e1ca */ NULL, +/* e1cb */ NULL, +/* e1cc */ NULL, +/* e1cd */ NULL, +/* e1ce */ NULL, +/* e1cf */ NULL, +/* e1d0 */ NULL, +/* e1d1 */ NULL, +/* e1d2 */ NULL, +/* e1d3 */ NULL, +/* e1d4 */ NULL, +/* e1d5 */ NULL, +/* e1d6 */ NULL, +/* e1d7 */ NULL, +/* e1d8 */ NULL, +/* e1d9 */ NULL, +/* e1da */ NULL, +/* e1db */ NULL, +/* e1dc */ NULL, +/* e1dd */ NULL, +/* e1de */ NULL, +/* e1df */ NULL, +/* e1e0 */ NULL, +/* e1e1 */ NULL, +/* e1e2 */ NULL, +/* e1e3 */ NULL, +/* e1e4 */ NULL, +/* e1e5 */ NULL, +/* e1e6 */ NULL, +/* e1e7 */ NULL, +/* e1e8 */ NULL, +/* e1e9 */ NULL, +/* e1ea */ NULL, +/* e1eb */ NULL, +/* e1ec */ NULL, +/* e1ed */ NULL, +/* e1ee */ NULL, +/* e1ef */ NULL, +/* e1f0 */ NULL, +/* e1f1 */ NULL, +/* e1f2 */ NULL, +/* e1f3 */ NULL, +/* e1f4 */ NULL, +/* e1f5 */ NULL, +/* e1f6 */ NULL, +/* e1f7 */ NULL, +/* e1f8 */ NULL, +/* e1f9 */ NULL, +/* e1fa */ NULL, +/* e1fb */ NULL, +/* e1fc */ NULL, +/* e1fd */ NULL, +/* e1fe */ NULL, +/* e1ff */ NULL, +/* e200 */ NULL, +/* e201 */ NULL, +/* e202 */ NULL, +/* e203 */ NULL, +/* e204 */ NULL, +/* e205 */ NULL, +/* e206 */ NULL, +/* e207 */ NULL, +/* e208 */ NULL, +/* e209 */ NULL, +/* e20a */ NULL, +/* e20b */ NULL, +/* e20c */ NULL, +/* e20d */ NULL, +/* e20e */ NULL, +/* e20f */ NULL, +/* e210 */ NULL, +/* e211 */ NULL, +/* e212 */ NULL, +/* e213 */ NULL, +/* e214 */ NULL, +/* e215 */ NULL, +/* e216 */ NULL, +/* e217 */ NULL, +/* e218 */ NULL, +/* e219 */ NULL, +/* e21a */ NULL, +/* e21b */ NULL, +/* e21c */ NULL, +/* e21d */ NULL, +/* e21e */ NULL, +/* e21f */ NULL, +/* e220 */ NULL, +/* e221 */ NULL, +/* e222 */ NULL, +/* e223 */ NULL, +/* e224 */ NULL, +/* e225 */ NULL, +/* e226 */ NULL, +/* e227 */ NULL, +/* e228 */ NULL, +/* e229 */ NULL, +/* e22a */ NULL, +/* e22b */ NULL, +/* e22c */ NULL, +/* e22d */ NULL, +/* e22e */ NULL, +/* e22f */ NULL, +/* e230 */ NULL, +/* e231 */ NULL, +/* e232 */ NULL, +/* e233 */ NULL, +/* e234 */ NULL, +/* e235 */ NULL, +/* e236 */ NULL, +/* e237 */ NULL, +/* e238 */ NULL, +/* e239 */ NULL, +/* e23a */ NULL, +/* e23b */ NULL, +/* e23c */ NULL, +/* e23d */ NULL, +/* e23e */ NULL, +/* e23f */ NULL, +/* e240 */ NULL, +/* e241 */ NULL, +/* e242 */ NULL, +/* e243 */ NULL, +/* e244 */ NULL, +/* e245 */ NULL, +/* e246 */ NULL, +/* e247 */ NULL, +/* e248 */ NULL, +/* e249 */ NULL, +/* e24a */ NULL, +/* e24b */ NULL, +/* e24c */ NULL, +/* e24d */ NULL, +/* e24e */ NULL, +/* e24f */ NULL, +/* e250 */ NULL, +/* e251 */ NULL, +/* e252 */ NULL, +/* e253 */ NULL, +/* e254 */ NULL, +/* e255 */ NULL, +/* e256 */ NULL, +/* e257 */ NULL, +/* e258 */ NULL, +/* e259 */ NULL, +/* e25a */ NULL, +/* e25b */ NULL, +/* e25c */ NULL, +/* e25d */ NULL, +/* e25e */ NULL, +/* e25f */ NULL, +/* e260 */ NULL, +/* e261 */ NULL, +/* e262 */ NULL, +/* e263 */ NULL, +/* e264 */ NULL, +/* e265 */ NULL, +/* e266 */ NULL, +/* e267 */ NULL, +/* e268 */ NULL, +/* e269 */ NULL, +/* e26a */ NULL, +/* e26b */ NULL, +/* e26c */ NULL, +/* e26d */ NULL, +/* e26e */ NULL, +/* e26f */ NULL, +/* e270 */ NULL, +/* e271 */ NULL, +/* e272 */ NULL, +/* e273 */ NULL, +/* e274 */ NULL, +/* e275 */ NULL, +/* e276 */ NULL, +/* e277 */ NULL, +/* e278 */ NULL, +/* e279 */ NULL, +/* e27a */ NULL, +/* e27b */ NULL, +/* e27c */ NULL, +/* e27d */ NULL, +/* e27e */ NULL, +/* e27f */ NULL, +/* e280 */ NULL, +/* e281 */ NULL, +/* e282 */ NULL, +/* e283 */ NULL, +/* e284 */ NULL, +/* e285 */ NULL, +/* e286 */ NULL, +/* e287 */ NULL, +/* e288 */ NULL, +/* e289 */ NULL, +/* e28a */ NULL, +/* e28b */ NULL, +/* e28c */ NULL, +/* e28d */ NULL, +/* e28e */ NULL, +/* e28f */ NULL, +/* e290 */ NULL, +/* e291 */ NULL, +/* e292 */ NULL, +/* e293 */ NULL, +/* e294 */ NULL, +/* e295 */ NULL, +/* e296 */ NULL, +/* e297 */ NULL, +/* e298 */ NULL, +/* e299 */ NULL, +/* e29a */ NULL, +/* e29b */ NULL, +/* e29c */ NULL, +/* e29d */ NULL, +/* e29e */ NULL, +/* e29f */ NULL, +/* e2a0 */ NULL, +/* e2a1 */ NULL, +/* e2a2 */ NULL, +/* e2a3 */ NULL, +/* e2a4 */ NULL, +/* e2a5 */ NULL, +/* e2a6 */ NULL, +/* e2a7 */ NULL, +/* e2a8 */ NULL, +/* e2a9 */ NULL, +/* e2aa */ NULL, +/* e2ab */ NULL, +/* e2ac */ NULL, +/* e2ad */ NULL, +/* e2ae */ NULL, +/* e2af */ NULL, +/* e2b0 */ NULL, +/* e2b1 */ NULL, +/* e2b2 */ NULL, +/* e2b3 */ NULL, +/* e2b4 */ NULL, +/* e2b5 */ NULL, +/* e2b6 */ NULL, +/* e2b7 */ NULL, +/* e2b8 */ NULL, +/* e2b9 */ NULL, +/* e2ba */ NULL, +/* e2bb */ NULL, +/* e2bc */ NULL, +/* e2bd */ NULL, +/* e2be */ NULL, +/* e2bf */ NULL, +/* e2c0 */ NULL, +/* e2c1 */ NULL, +/* e2c2 */ NULL, +/* e2c3 */ NULL, +/* e2c4 */ NULL, +/* e2c5 */ NULL, +/* e2c6 */ NULL, +/* e2c7 */ NULL, +/* e2c8 */ NULL, +/* e2c9 */ NULL, +/* e2ca */ NULL, +/* e2cb */ NULL, +/* e2cc */ NULL, +/* e2cd */ NULL, +/* e2ce */ NULL, +/* e2cf */ NULL, +/* e2d0 */ NULL, +/* e2d1 */ NULL, +/* e2d2 */ NULL, +/* e2d3 */ NULL, +/* e2d4 */ NULL, +/* e2d5 */ NULL, +/* e2d6 */ NULL, +/* e2d7 */ NULL, +/* e2d8 */ NULL, +/* e2d9 */ NULL, +/* e2da */ NULL, +/* e2db */ NULL, +/* e2dc */ NULL, +/* e2dd */ NULL, +/* e2de */ NULL, +/* e2df */ NULL, +/* e2e0 */ NULL, +/* e2e1 */ NULL, +/* e2e2 */ NULL, +/* e2e3 */ NULL, +/* e2e4 */ NULL, +/* e2e5 */ NULL, +/* e2e6 */ NULL, +/* e2e7 */ NULL, +/* e2e8 */ NULL, +/* e2e9 */ NULL, +/* e2ea */ NULL, +/* e2eb */ NULL, +/* e2ec */ NULL, +/* e2ed */ NULL, +/* e2ee */ NULL, +/* e2ef */ NULL, +/* e2f0 */ NULL, +/* e2f1 */ NULL, +/* e2f2 */ NULL, +/* e2f3 */ NULL, +/* e2f4 */ NULL, +/* e2f5 */ NULL, +/* e2f6 */ NULL, +/* e2f7 */ NULL, +/* e2f8 */ NULL, +/* e2f9 */ NULL, +/* e2fa */ NULL, +/* e2fb */ NULL, +/* e2fc */ NULL, +/* e2fd */ NULL, +/* e2fe */ NULL, +/* e2ff */ NULL, +/* e300 */ NULL, +/* e301 */ NULL, +/* e302 */ NULL, +/* e303 */ NULL, +/* e304 */ NULL, +/* e305 */ NULL, +/* e306 */ NULL, +/* e307 */ NULL, +/* e308 */ NULL, +/* e309 */ NULL, +/* e30a */ NULL, +/* e30b */ NULL, +/* e30c */ NULL, +/* e30d */ NULL, +/* e30e */ NULL, +/* e30f */ NULL, +/* e310 */ NULL, +/* e311 */ NULL, +/* e312 */ NULL, +/* e313 */ NULL, +/* e314 */ NULL, +/* e315 */ NULL, +/* e316 */ NULL, +/* e317 */ NULL, +/* e318 */ NULL, +/* e319 */ NULL, +/* e31a */ NULL, +/* e31b */ NULL, +/* e31c */ NULL, +/* e31d */ NULL, +/* e31e */ NULL, +/* e31f */ NULL, +/* e320 */ NULL, +/* e321 */ NULL, +/* e322 */ NULL, +/* e323 */ NULL, +/* e324 */ NULL, +/* e325 */ NULL, +/* e326 */ NULL, +/* e327 */ NULL, +/* e328 */ NULL, +/* e329 */ NULL, +/* e32a */ NULL, +/* e32b */ NULL, +/* e32c */ NULL, +/* e32d */ NULL, +/* e32e */ NULL, +/* e32f */ NULL, +/* e330 */ NULL, +/* e331 */ NULL, +/* e332 */ NULL, +/* e333 */ NULL, +/* e334 */ NULL, +/* e335 */ NULL, +/* e336 */ NULL, +/* e337 */ NULL, +/* e338 */ NULL, +/* e339 */ NULL, +/* e33a */ NULL, +/* e33b */ NULL, +/* e33c */ NULL, +/* e33d */ NULL, +/* e33e */ NULL, +/* e33f */ NULL, +/* e340 */ NULL, +/* e341 */ NULL, +/* e342 */ NULL, +/* e343 */ NULL, +/* e344 */ NULL, +/* e345 */ NULL, +/* e346 */ NULL, +/* e347 */ NULL, +/* e348 */ NULL, +/* e349 */ NULL, +/* e34a */ NULL, +/* e34b */ NULL, +/* e34c */ NULL, +/* e34d */ NULL, +/* e34e */ NULL, +/* e34f */ NULL, +/* e350 */ NULL, +/* e351 */ NULL, +/* e352 */ NULL, +/* e353 */ NULL, +/* e354 */ NULL, +/* e355 */ NULL, +/* e356 */ NULL, +/* e357 */ NULL, +/* e358 */ NULL, +/* e359 */ NULL, +/* e35a */ NULL, +/* e35b */ NULL, +/* e35c */ NULL, +/* e35d */ NULL, +/* e35e */ NULL, +/* e35f */ NULL, +/* e360 */ NULL, +/* e361 */ NULL, +/* e362 */ NULL, +/* e363 */ NULL, +/* e364 */ NULL, +/* e365 */ NULL, +/* e366 */ NULL, +/* e367 */ NULL, +/* e368 */ NULL, +/* e369 */ NULL, +/* e36a */ NULL, +/* e36b */ NULL, +/* e36c */ NULL, +/* e36d */ NULL, +/* e36e */ NULL, +/* e36f */ NULL, +/* e370 */ NULL, +/* e371 */ NULL, +/* e372 */ NULL, +/* e373 */ NULL, +/* e374 */ NULL, +/* e375 */ NULL, +/* e376 */ NULL, +/* e377 */ NULL, +/* e378 */ NULL, +/* e379 */ NULL, +/* e37a */ NULL, +/* e37b */ NULL, +/* e37c */ NULL, +/* e37d */ NULL, +/* e37e */ NULL, +/* e37f */ NULL, +/* e380 */ NULL, +/* e381 */ NULL, +/* e382 */ NULL, +/* e383 */ NULL, +/* e384 */ NULL, +/* e385 */ NULL, +/* e386 */ NULL, +/* e387 */ NULL, +/* e388 */ NULL, +/* e389 */ NULL, +/* e38a */ NULL, +/* e38b */ NULL, +/* e38c */ NULL, +/* e38d */ NULL, +/* e38e */ NULL, +/* e38f */ NULL, +/* e390 */ NULL, +/* e391 */ NULL, +/* e392 */ NULL, +/* e393 */ NULL, +/* e394 */ NULL, +/* e395 */ NULL, +/* e396 */ NULL, +/* e397 */ NULL, +/* e398 */ NULL, +/* e399 */ NULL, +/* e39a */ NULL, +/* e39b */ NULL, +/* e39c */ NULL, +/* e39d */ NULL, +/* e39e */ NULL, +/* e39f */ NULL, +/* e3a0 */ NULL, +/* e3a1 */ NULL, +/* e3a2 */ NULL, +/* e3a3 */ NULL, +/* e3a4 */ NULL, +/* e3a5 */ NULL, +/* e3a6 */ NULL, +/* e3a7 */ NULL, +/* e3a8 */ NULL, +/* e3a9 */ NULL, +/* e3aa */ NULL, +/* e3ab */ NULL, +/* e3ac */ NULL, +/* e3ad */ NULL, +/* e3ae */ NULL, +/* e3af */ NULL, +/* e3b0 */ NULL, +/* e3b1 */ NULL, +/* e3b2 */ NULL, +/* e3b3 */ NULL, +/* e3b4 */ NULL, +/* e3b5 */ NULL, +/* e3b6 */ NULL, +/* e3b7 */ NULL, +/* e3b8 */ NULL, +/* e3b9 */ NULL, +/* e3ba */ NULL, +/* e3bb */ NULL, +/* e3bc */ NULL, +/* e3bd */ NULL, +/* e3be */ NULL, +/* e3bf */ NULL, +/* e3c0 */ NULL, +/* e3c1 */ NULL, +/* e3c2 */ NULL, +/* e3c3 */ NULL, +/* e3c4 */ NULL, +/* e3c5 */ NULL, +/* e3c6 */ NULL, +/* e3c7 */ NULL, +/* e3c8 */ NULL, +/* e3c9 */ NULL, +/* e3ca */ NULL, +/* e3cb */ NULL, +/* e3cc */ NULL, +/* e3cd */ NULL, +/* e3ce */ NULL, +/* e3cf */ NULL, +/* e3d0 */ NULL, +/* e3d1 */ NULL, +/* e3d2 */ NULL, +/* e3d3 */ NULL, +/* e3d4 */ NULL, +/* e3d5 */ NULL, +/* e3d6 */ NULL, +/* e3d7 */ NULL, +/* e3d8 */ NULL, +/* e3d9 */ NULL, +/* e3da */ NULL, +/* e3db */ NULL, +/* e3dc */ NULL, +/* e3dd */ NULL, +/* e3de */ NULL, +/* e3df */ NULL, +/* e3e0 */ NULL, +/* e3e1 */ NULL, +/* e3e2 */ NULL, +/* e3e3 */ NULL, +/* e3e4 */ NULL, +/* e3e5 */ NULL, +/* e3e6 */ NULL, +/* e3e7 */ NULL, +/* e3e8 */ NULL, +/* e3e9 */ NULL, +/* e3ea */ NULL, +/* e3eb */ NULL, +/* e3ec */ NULL, +/* e3ed */ NULL, +/* e3ee */ NULL, +/* e3ef */ NULL, +/* e3f0 */ NULL, +/* e3f1 */ NULL, +/* e3f2 */ NULL, +/* e3f3 */ NULL, +/* e3f4 */ NULL, +/* e3f5 */ NULL, +/* e3f6 */ NULL, +/* e3f7 */ NULL, +/* e3f8 */ NULL, +/* e3f9 */ NULL, +/* e3fa */ NULL, +/* e3fb */ NULL, +/* e3fc */ NULL, +/* e3fd */ NULL, +/* e3fe */ NULL, +/* e3ff */ NULL, +/* e400 */ NULL, +/* e401 */ NULL, +/* e402 */ NULL, +/* e403 */ NULL, +/* e404 */ NULL, +/* e405 */ NULL, +/* e406 */ NULL, +/* e407 */ NULL, +/* e408 */ NULL, +/* e409 */ NULL, +/* e40a */ NULL, +/* e40b */ NULL, +/* e40c */ NULL, +/* e40d */ NULL, +/* e40e */ NULL, +/* e40f */ NULL, +/* e410 */ NULL, +/* e411 */ NULL, +/* e412 */ NULL, +/* e413 */ NULL, +/* e414 */ NULL, +/* e415 */ NULL, +/* e416 */ NULL, +/* e417 */ NULL, +/* e418 */ NULL, +/* e419 */ NULL, +/* e41a */ NULL, +/* e41b */ NULL, +/* e41c */ NULL, +/* e41d */ NULL, +/* e41e */ NULL, +/* e41f */ NULL, +/* e420 */ NULL, +/* e421 */ NULL, +/* e422 */ NULL, +/* e423 */ NULL, +/* e424 */ NULL, +/* e425 */ NULL, +/* e426 */ NULL, +/* e427 */ NULL, +/* e428 */ NULL, +/* e429 */ NULL, +/* e42a */ NULL, +/* e42b */ NULL, +/* e42c */ NULL, +/* e42d */ NULL, +/* e42e */ NULL, +/* e42f */ NULL, +/* e430 */ NULL, +/* e431 */ NULL, +/* e432 */ NULL, +/* e433 */ NULL, +/* e434 */ NULL, +/* e435 */ NULL, +/* e436 */ NULL, +/* e437 */ NULL, +/* e438 */ NULL, +/* e439 */ NULL, +/* e43a */ NULL, +/* e43b */ NULL, +/* e43c */ NULL, +/* e43d */ NULL, +/* e43e */ NULL, +/* e43f */ NULL, +/* e440 */ NULL, +/* e441 */ NULL, +/* e442 */ NULL, +/* e443 */ NULL, +/* e444 */ NULL, +/* e445 */ NULL, +/* e446 */ NULL, +/* e447 */ NULL, +/* e448 */ NULL, +/* e449 */ NULL, +/* e44a */ NULL, +/* e44b */ NULL, +/* e44c */ NULL, +/* e44d */ NULL, +/* e44e */ NULL, +/* e44f */ NULL, +/* e450 */ NULL, +/* e451 */ NULL, +/* e452 */ NULL, +/* e453 */ NULL, +/* e454 */ NULL, +/* e455 */ NULL, +/* e456 */ NULL, +/* e457 */ NULL, +/* e458 */ NULL, +/* e459 */ NULL, +/* e45a */ NULL, +/* e45b */ NULL, +/* e45c */ NULL, +/* e45d */ NULL, +/* e45e */ NULL, +/* e45f */ NULL, +/* e460 */ NULL, +/* e461 */ NULL, +/* e462 */ NULL, +/* e463 */ NULL, +/* e464 */ NULL, +/* e465 */ NULL, +/* e466 */ NULL, +/* e467 */ NULL, +/* e468 */ NULL, +/* e469 */ NULL, +/* e46a */ NULL, +/* e46b */ NULL, +/* e46c */ NULL, +/* e46d */ NULL, +/* e46e */ NULL, +/* e46f */ NULL, +/* e470 */ NULL, +/* e471 */ NULL, +/* e472 */ NULL, +/* e473 */ NULL, +/* e474 */ NULL, +/* e475 */ NULL, +/* e476 */ NULL, +/* e477 */ NULL, +/* e478 */ NULL, +/* e479 */ NULL, +/* e47a */ NULL, +/* e47b */ NULL, +/* e47c */ NULL, +/* e47d */ NULL, +/* e47e */ NULL, +/* e47f */ NULL, +/* e480 */ NULL, +/* e481 */ NULL, +/* e482 */ NULL, +/* e483 */ NULL, +/* e484 */ NULL, +/* e485 */ NULL, +/* e486 */ NULL, +/* e487 */ NULL, +/* e488 */ NULL, +/* e489 */ NULL, +/* e48a */ NULL, +/* e48b */ NULL, +/* e48c */ NULL, +/* e48d */ NULL, +/* e48e */ NULL, +/* e48f */ NULL, +/* e490 */ NULL, +/* e491 */ NULL, +/* e492 */ NULL, +/* e493 */ NULL, +/* e494 */ NULL, +/* e495 */ NULL, +/* e496 */ NULL, +/* e497 */ NULL, +/* e498 */ NULL, +/* e499 */ NULL, +/* e49a */ NULL, +/* e49b */ NULL, +/* e49c */ NULL, +/* e49d */ NULL, +/* e49e */ NULL, +/* e49f */ NULL, +/* e4a0 */ NULL, +/* e4a1 */ NULL, +/* e4a2 */ NULL, +/* e4a3 */ NULL, +/* e4a4 */ NULL, +/* e4a5 */ NULL, +/* e4a6 */ NULL, +/* e4a7 */ NULL, +/* e4a8 */ NULL, +/* e4a9 */ NULL, +/* e4aa */ NULL, +/* e4ab */ NULL, +/* e4ac */ NULL, +/* e4ad */ NULL, +/* e4ae */ NULL, +/* e4af */ NULL, +/* e4b0 */ NULL, +/* e4b1 */ NULL, +/* e4b2 */ NULL, +/* e4b3 */ NULL, +/* e4b4 */ NULL, +/* e4b5 */ NULL, +/* e4b6 */ NULL, +/* e4b7 */ NULL, +/* e4b8 */ NULL, +/* e4b9 */ NULL, +/* e4ba */ NULL, +/* e4bb */ NULL, +/* e4bc */ NULL, +/* e4bd */ NULL, +/* e4be */ NULL, +/* e4bf */ NULL, +/* e4c0 */ NULL, +/* e4c1 */ NULL, +/* e4c2 */ NULL, +/* e4c3 */ NULL, +/* e4c4 */ NULL, +/* e4c5 */ NULL, +/* e4c6 */ NULL, +/* e4c7 */ NULL, +/* e4c8 */ NULL, +/* e4c9 */ NULL, +/* e4ca */ NULL, +/* e4cb */ NULL, +/* e4cc */ NULL, +/* e4cd */ NULL, +/* e4ce */ NULL, +/* e4cf */ NULL, +/* e4d0 */ NULL, +/* e4d1 */ NULL, +/* e4d2 */ NULL, +/* e4d3 */ NULL, +/* e4d4 */ NULL, +/* e4d5 */ NULL, +/* e4d6 */ NULL, +/* e4d7 */ NULL, +/* e4d8 */ NULL, +/* e4d9 */ NULL, +/* e4da */ NULL, +/* e4db */ NULL, +/* e4dc */ NULL, +/* e4dd */ NULL, +/* e4de */ NULL, +/* e4df */ NULL, +/* e4e0 */ NULL, +/* e4e1 */ NULL, +/* e4e2 */ NULL, +/* e4e3 */ NULL, +/* e4e4 */ NULL, +/* e4e5 */ NULL, +/* e4e6 */ NULL, +/* e4e7 */ NULL, +/* e4e8 */ NULL, +/* e4e9 */ NULL, +/* e4ea */ NULL, +/* e4eb */ NULL, +/* e4ec */ NULL, +/* e4ed */ NULL, +/* e4ee */ NULL, +/* e4ef */ NULL, +/* e4f0 */ NULL, +/* e4f1 */ NULL, +/* e4f2 */ NULL, +/* e4f3 */ NULL, +/* e4f4 */ NULL, +/* e4f5 */ NULL, +/* e4f6 */ NULL, +/* e4f7 */ NULL, +/* e4f8 */ NULL, +/* e4f9 */ NULL, +/* e4fa */ NULL, +/* e4fb */ NULL, +/* e4fc */ NULL, +/* e4fd */ NULL, +/* e4fe */ NULL, +/* e4ff */ NULL, +/* e500 */ NULL, +/* e501 */ NULL, +/* e502 */ NULL, +/* e503 */ NULL, +/* e504 */ NULL, +/* e505 */ NULL, +/* e506 */ NULL, +/* e507 */ NULL, +/* e508 */ NULL, +/* e509 */ NULL, +/* e50a */ NULL, +/* e50b */ NULL, +/* e50c */ NULL, +/* e50d */ NULL, +/* e50e */ NULL, +/* e50f */ NULL, +/* e510 */ NULL, +/* e511 */ NULL, +/* e512 */ NULL, +/* e513 */ NULL, +/* e514 */ NULL, +/* e515 */ NULL, +/* e516 */ NULL, +/* e517 */ NULL, +/* e518 */ NULL, +/* e519 */ NULL, +/* e51a */ NULL, +/* e51b */ NULL, +/* e51c */ NULL, +/* e51d */ NULL, +/* e51e */ NULL, +/* e51f */ NULL, +/* e520 */ NULL, +/* e521 */ NULL, +/* e522 */ NULL, +/* e523 */ NULL, +/* e524 */ NULL, +/* e525 */ NULL, +/* e526 */ NULL, +/* e527 */ NULL, +/* e528 */ NULL, +/* e529 */ NULL, +/* e52a */ NULL, +/* e52b */ NULL, +/* e52c */ NULL, +/* e52d */ NULL, +/* e52e */ NULL, +/* e52f */ NULL, +/* e530 */ NULL, +/* e531 */ NULL, +/* e532 */ NULL, +/* e533 */ NULL, +/* e534 */ NULL, +/* e535 */ NULL, +/* e536 */ NULL, +/* e537 */ NULL, +/* e538 */ NULL, +/* e539 */ NULL, +/* e53a */ NULL, +/* e53b */ NULL, +/* e53c */ NULL, +/* e53d */ NULL, +/* e53e */ NULL, +/* e53f */ NULL, +/* e540 */ NULL, +/* e541 */ NULL, +/* e542 */ NULL, +/* e543 */ NULL, +/* e544 */ NULL, +/* e545 */ NULL, +/* e546 */ NULL, +/* e547 */ NULL, +/* e548 */ NULL, +/* e549 */ NULL, +/* e54a */ NULL, +/* e54b */ NULL, +/* e54c */ NULL, +/* e54d */ NULL, +/* e54e */ NULL, +/* e54f */ NULL, +/* e550 */ NULL, +/* e551 */ NULL, +/* e552 */ NULL, +/* e553 */ NULL, +/* e554 */ NULL, +/* e555 */ NULL, +/* e556 */ NULL, +/* e557 */ NULL, +/* e558 */ NULL, +/* e559 */ NULL, +/* e55a */ NULL, +/* e55b */ NULL, +/* e55c */ NULL, +/* e55d */ NULL, +/* e55e */ NULL, +/* e55f */ NULL, +/* e560 */ NULL, +/* e561 */ NULL, +/* e562 */ NULL, +/* e563 */ NULL, +/* e564 */ NULL, +/* e565 */ NULL, +/* e566 */ NULL, +/* e567 */ NULL, +/* e568 */ NULL, +/* e569 */ NULL, +/* e56a */ NULL, +/* e56b */ NULL, +/* e56c */ NULL, +/* e56d */ NULL, +/* e56e */ NULL, +/* e56f */ NULL, +/* e570 */ NULL, +/* e571 */ NULL, +/* e572 */ NULL, +/* e573 */ NULL, +/* e574 */ NULL, +/* e575 */ NULL, +/* e576 */ NULL, +/* e577 */ NULL, +/* e578 */ NULL, +/* e579 */ NULL, +/* e57a */ NULL, +/* e57b */ NULL, +/* e57c */ NULL, +/* e57d */ NULL, +/* e57e */ NULL, +/* e57f */ NULL, +/* e580 */ NULL, +/* e581 */ NULL, +/* e582 */ NULL, +/* e583 */ NULL, +/* e584 */ NULL, +/* e585 */ NULL, +/* e586 */ NULL, +/* e587 */ NULL, +/* e588 */ NULL, +/* e589 */ NULL, +/* e58a */ NULL, +/* e58b */ NULL, +/* e58c */ NULL, +/* e58d */ NULL, +/* e58e */ NULL, +/* e58f */ NULL, +/* e590 */ NULL, +/* e591 */ NULL, +/* e592 */ NULL, +/* e593 */ NULL, +/* e594 */ NULL, +/* e595 */ NULL, +/* e596 */ NULL, +/* e597 */ NULL, +/* e598 */ NULL, +/* e599 */ NULL, +/* e59a */ NULL, +/* e59b */ NULL, +/* e59c */ NULL, +/* e59d */ NULL, +/* e59e */ NULL, +/* e59f */ NULL, +/* e5a0 */ NULL, +/* e5a1 */ NULL, +/* e5a2 */ NULL, +/* e5a3 */ NULL, +/* e5a4 */ NULL, +/* e5a5 */ NULL, +/* e5a6 */ NULL, +/* e5a7 */ NULL, +/* e5a8 */ NULL, +/* e5a9 */ NULL, +/* e5aa */ NULL, +/* e5ab */ NULL, +/* e5ac */ NULL, +/* e5ad */ NULL, +/* e5ae */ NULL, +/* e5af */ NULL, +/* e5b0 */ NULL, +/* e5b1 */ NULL, +/* e5b2 */ NULL, +/* e5b3 */ NULL, +/* e5b4 */ NULL, +/* e5b5 */ NULL, +/* e5b6 */ NULL, +/* e5b7 */ NULL, +/* e5b8 */ NULL, +/* e5b9 */ NULL, +/* e5ba */ NULL, +/* e5bb */ NULL, +/* e5bc */ NULL, +/* e5bd */ NULL, +/* e5be */ NULL, +/* e5bf */ NULL, +/* e5c0 */ NULL, +/* e5c1 */ NULL, +/* e5c2 */ NULL, +/* e5c3 */ NULL, +/* e5c4 */ NULL, +/* e5c5 */ NULL, +/* e5c6 */ NULL, +/* e5c7 */ NULL, +/* e5c8 */ NULL, +/* e5c9 */ NULL, +/* e5ca */ NULL, +/* e5cb */ NULL, +/* e5cc */ NULL, +/* e5cd */ NULL, +/* e5ce */ NULL, +/* e5cf */ NULL, +/* e5d0 */ NULL, +/* e5d1 */ NULL, +/* e5d2 */ NULL, +/* e5d3 */ NULL, +/* e5d4 */ NULL, +/* e5d5 */ NULL, +/* e5d6 */ NULL, +/* e5d7 */ NULL, +/* e5d8 */ NULL, +/* e5d9 */ NULL, +/* e5da */ NULL, +/* e5db */ NULL, +/* e5dc */ NULL, +/* e5dd */ NULL, +/* e5de */ NULL, +/* e5df */ NULL, +/* e5e0 */ NULL, +/* e5e1 */ NULL, +/* e5e2 */ NULL, +/* e5e3 */ NULL, +/* e5e4 */ NULL, +/* e5e5 */ NULL, +/* e5e6 */ NULL, +/* e5e7 */ NULL, +/* e5e8 */ NULL, +/* e5e9 */ NULL, +/* e5ea */ NULL, +/* e5eb */ NULL, +/* e5ec */ NULL, +/* e5ed */ NULL, +/* e5ee */ NULL, +/* e5ef */ NULL, +/* e5f0 */ NULL, +/* e5f1 */ NULL, +/* e5f2 */ NULL, +/* e5f3 */ NULL, +/* e5f4 */ NULL, +/* e5f5 */ NULL, +/* e5f6 */ NULL, +/* e5f7 */ NULL, +/* e5f8 */ NULL, +/* e5f9 */ NULL, +/* e5fa */ NULL, +/* e5fb */ NULL, +/* e5fc */ NULL, +/* e5fd */ NULL, +/* e5fe */ NULL, +/* e5ff */ NULL, +/* e600 */ NULL, +/* e601 */ NULL, +/* e602 */ NULL, +/* e603 */ NULL, +/* e604 */ NULL, +/* e605 */ NULL, +/* e606 */ NULL, +/* e607 */ NULL, +/* e608 */ NULL, +/* e609 */ NULL, +/* e60a */ NULL, +/* e60b */ NULL, +/* e60c */ NULL, +/* e60d */ NULL, +/* e60e */ NULL, +/* e60f */ NULL, +/* e610 */ NULL, +/* e611 */ NULL, +/* e612 */ NULL, +/* e613 */ NULL, +/* e614 */ NULL, +/* e615 */ NULL, +/* e616 */ NULL, +/* e617 */ NULL, +/* e618 */ NULL, +/* e619 */ NULL, +/* e61a */ NULL, +/* e61b */ NULL, +/* e61c */ NULL, +/* e61d */ NULL, +/* e61e */ NULL, +/* e61f */ NULL, +/* e620 */ NULL, +/* e621 */ NULL, +/* e622 */ NULL, +/* e623 */ NULL, +/* e624 */ NULL, +/* e625 */ NULL, +/* e626 */ NULL, +/* e627 */ NULL, +/* e628 */ NULL, +/* e629 */ NULL, +/* e62a */ NULL, +/* e62b */ NULL, +/* e62c */ NULL, +/* e62d */ NULL, +/* e62e */ NULL, +/* e62f */ NULL, +/* e630 */ NULL, +/* e631 */ NULL, +/* e632 */ NULL, +/* e633 */ NULL, +/* e634 */ NULL, +/* e635 */ NULL, +/* e636 */ NULL, +/* e637 */ NULL, +/* e638 */ NULL, +/* e639 */ NULL, +/* e63a */ NULL, +/* e63b */ NULL, +/* e63c */ NULL, +/* e63d */ NULL, +/* e63e */ NULL, +/* e63f */ NULL, +/* e640 */ NULL, +/* e641 */ NULL, +/* e642 */ NULL, +/* e643 */ NULL, +/* e644 */ NULL, +/* e645 */ NULL, +/* e646 */ NULL, +/* e647 */ NULL, +/* e648 */ NULL, +/* e649 */ NULL, +/* e64a */ NULL, +/* e64b */ NULL, +/* e64c */ NULL, +/* e64d */ NULL, +/* e64e */ NULL, +/* e64f */ NULL, +/* e650 */ NULL, +/* e651 */ NULL, +/* e652 */ NULL, +/* e653 */ NULL, +/* e654 */ NULL, +/* e655 */ NULL, +/* e656 */ NULL, +/* e657 */ NULL, +/* e658 */ NULL, +/* e659 */ NULL, +/* e65a */ NULL, +/* e65b */ NULL, +/* e65c */ NULL, +/* e65d */ NULL, +/* e65e */ NULL, +/* e65f */ NULL, +/* e660 */ NULL, +/* e661 */ NULL, +/* e662 */ NULL, +/* e663 */ NULL, +/* e664 */ NULL, +/* e665 */ NULL, +/* e666 */ NULL, +/* e667 */ NULL, +/* e668 */ NULL, +/* e669 */ NULL, +/* e66a */ NULL, +/* e66b */ NULL, +/* e66c */ NULL, +/* e66d */ NULL, +/* e66e */ NULL, +/* e66f */ NULL, +/* e670 */ NULL, +/* e671 */ NULL, +/* e672 */ NULL, +/* e673 */ NULL, +/* e674 */ NULL, +/* e675 */ NULL, +/* e676 */ NULL, +/* e677 */ NULL, +/* e678 */ NULL, +/* e679 */ NULL, +/* e67a */ NULL, +/* e67b */ NULL, +/* e67c */ NULL, +/* e67d */ NULL, +/* e67e */ NULL, +/* e67f */ NULL, +/* e680 */ NULL, +/* e681 */ NULL, +/* e682 */ NULL, +/* e683 */ NULL, +/* e684 */ NULL, +/* e685 */ NULL, +/* e686 */ NULL, +/* e687 */ NULL, +/* e688 */ NULL, +/* e689 */ NULL, +/* e68a */ NULL, +/* e68b */ NULL, +/* e68c */ NULL, +/* e68d */ NULL, +/* e68e */ NULL, +/* e68f */ NULL, +/* e690 */ NULL, +/* e691 */ NULL, +/* e692 */ NULL, +/* e693 */ NULL, +/* e694 */ NULL, +/* e695 */ NULL, +/* e696 */ NULL, +/* e697 */ NULL, +/* e698 */ NULL, +/* e699 */ NULL, +/* e69a */ NULL, +/* e69b */ NULL, +/* e69c */ NULL, +/* e69d */ NULL, +/* e69e */ NULL, +/* e69f */ NULL, +/* e6a0 */ NULL, +/* e6a1 */ NULL, +/* e6a2 */ NULL, +/* e6a3 */ NULL, +/* e6a4 */ NULL, +/* e6a5 */ NULL, +/* e6a6 */ NULL, +/* e6a7 */ NULL, +/* e6a8 */ NULL, +/* e6a9 */ NULL, +/* e6aa */ NULL, +/* e6ab */ NULL, +/* e6ac */ NULL, +/* e6ad */ NULL, +/* e6ae */ NULL, +/* e6af */ NULL, +/* e6b0 */ NULL, +/* e6b1 */ NULL, +/* e6b2 */ NULL, +/* e6b3 */ NULL, +/* e6b4 */ NULL, +/* e6b5 */ NULL, +/* e6b6 */ NULL, +/* e6b7 */ NULL, +/* e6b8 */ NULL, +/* e6b9 */ NULL, +/* e6ba */ NULL, +/* e6bb */ NULL, +/* e6bc */ NULL, +/* e6bd */ NULL, +/* e6be */ NULL, +/* e6bf */ NULL, +/* e6c0 */ NULL, +/* e6c1 */ NULL, +/* e6c2 */ NULL, +/* e6c3 */ NULL, +/* e6c4 */ NULL, +/* e6c5 */ NULL, +/* e6c6 */ NULL, +/* e6c7 */ NULL, +/* e6c8 */ NULL, +/* e6c9 */ NULL, +/* e6ca */ NULL, +/* e6cb */ NULL, +/* e6cc */ NULL, +/* e6cd */ NULL, +/* e6ce */ NULL, +/* e6cf */ NULL, +/* e6d0 */ NULL, +/* e6d1 */ NULL, +/* e6d2 */ NULL, +/* e6d3 */ NULL, +/* e6d4 */ NULL, +/* e6d5 */ NULL, +/* e6d6 */ NULL, +/* e6d7 */ NULL, +/* e6d8 */ NULL, +/* e6d9 */ NULL, +/* e6da */ NULL, +/* e6db */ NULL, +/* e6dc */ NULL, +/* e6dd */ NULL, +/* e6de */ NULL, +/* e6df */ NULL, +/* e6e0 */ NULL, +/* e6e1 */ NULL, +/* e6e2 */ NULL, +/* e6e3 */ NULL, +/* e6e4 */ NULL, +/* e6e5 */ NULL, +/* e6e6 */ NULL, +/* e6e7 */ NULL, +/* e6e8 */ NULL, +/* e6e9 */ NULL, +/* e6ea */ NULL, +/* e6eb */ NULL, +/* e6ec */ NULL, +/* e6ed */ NULL, +/* e6ee */ NULL, +/* e6ef */ NULL, +/* e6f0 */ NULL, +/* e6f1 */ NULL, +/* e6f2 */ NULL, +/* e6f3 */ NULL, +/* e6f4 */ NULL, +/* e6f5 */ NULL, +/* e6f6 */ NULL, +/* e6f7 */ NULL, +/* e6f8 */ NULL, +/* e6f9 */ NULL, +/* e6fa */ NULL, +/* e6fb */ NULL, +/* e6fc */ NULL, +/* e6fd */ NULL, +/* e6fe */ NULL, +/* e6ff */ NULL, +/* e700 */ NULL, +/* e701 */ NULL, +/* e702 */ NULL, +/* e703 */ NULL, +/* e704 */ NULL, +/* e705 */ NULL, +/* e706 */ NULL, +/* e707 */ NULL, +/* e708 */ NULL, +/* e709 */ NULL, +/* e70a */ NULL, +/* e70b */ NULL, +/* e70c */ NULL, +/* e70d */ NULL, +/* e70e */ NULL, +/* e70f */ NULL, +/* e710 */ NULL, +/* e711 */ NULL, +/* e712 */ NULL, +/* e713 */ NULL, +/* e714 */ NULL, +/* e715 */ NULL, +/* e716 */ NULL, +/* e717 */ NULL, +/* e718 */ NULL, +/* e719 */ NULL, +/* e71a */ NULL, +/* e71b */ NULL, +/* e71c */ NULL, +/* e71d */ NULL, +/* e71e */ NULL, +/* e71f */ NULL, +/* e720 */ NULL, +/* e721 */ NULL, +/* e722 */ NULL, +/* e723 */ NULL, +/* e724 */ NULL, +/* e725 */ NULL, +/* e726 */ NULL, +/* e727 */ NULL, +/* e728 */ NULL, +/* e729 */ NULL, +/* e72a */ NULL, +/* e72b */ NULL, +/* e72c */ NULL, +/* e72d */ NULL, +/* e72e */ NULL, +/* e72f */ NULL, +/* e730 */ NULL, +/* e731 */ NULL, +/* e732 */ NULL, +/* e733 */ NULL, +/* e734 */ NULL, +/* e735 */ NULL, +/* e736 */ NULL, +/* e737 */ NULL, +/* e738 */ NULL, +/* e739 */ NULL, +/* e73a */ NULL, +/* e73b */ NULL, +/* e73c */ NULL, +/* e73d */ NULL, +/* e73e */ NULL, +/* e73f */ NULL, +/* e740 */ NULL, +/* e741 */ NULL, +/* e742 */ NULL, +/* e743 */ NULL, +/* e744 */ NULL, +/* e745 */ NULL, +/* e746 */ NULL, +/* e747 */ NULL, +/* e748 */ NULL, +/* e749 */ NULL, +/* e74a */ NULL, +/* e74b */ NULL, +/* e74c */ NULL, +/* e74d */ NULL, +/* e74e */ NULL, +/* e74f */ NULL, +/* e750 */ NULL, +/* e751 */ NULL, +/* e752 */ NULL, +/* e753 */ NULL, +/* e754 */ NULL, +/* e755 */ NULL, +/* e756 */ NULL, +/* e757 */ NULL, +/* e758 */ NULL, +/* e759 */ NULL, +/* e75a */ NULL, +/* e75b */ NULL, +/* e75c */ NULL, +/* e75d */ NULL, +/* e75e */ NULL, +/* e75f */ NULL, +/* e760 */ NULL, +/* e761 */ NULL, +/* e762 */ NULL, +/* e763 */ NULL, +/* e764 */ NULL, +/* e765 */ NULL, +/* e766 */ NULL, +/* e767 */ NULL, +/* e768 */ NULL, +/* e769 */ NULL, +/* e76a */ NULL, +/* e76b */ NULL, +/* e76c */ NULL, +/* e76d */ NULL, +/* e76e */ NULL, +/* e76f */ NULL, +/* e770 */ NULL, +/* e771 */ NULL, +/* e772 */ NULL, +/* e773 */ NULL, +/* e774 */ NULL, +/* e775 */ NULL, +/* e776 */ NULL, +/* e777 */ NULL, +/* e778 */ NULL, +/* e779 */ NULL, +/* e77a */ NULL, +/* e77b */ NULL, +/* e77c */ NULL, +/* e77d */ NULL, +/* e77e */ NULL, +/* e77f */ NULL, +/* e780 */ NULL, +/* e781 */ NULL, +/* e782 */ NULL, +/* e783 */ NULL, +/* e784 */ NULL, +/* e785 */ NULL, +/* e786 */ NULL, +/* e787 */ NULL, +/* e788 */ NULL, +/* e789 */ NULL, +/* e78a */ NULL, +/* e78b */ NULL, +/* e78c */ NULL, +/* e78d */ NULL, +/* e78e */ NULL, +/* e78f */ NULL, +/* e790 */ NULL, +/* e791 */ NULL, +/* e792 */ NULL, +/* e793 */ NULL, +/* e794 */ NULL, +/* e795 */ NULL, +/* e796 */ NULL, +/* e797 */ NULL, +/* e798 */ NULL, +/* e799 */ NULL, +/* e79a */ NULL, +/* e79b */ NULL, +/* e79c */ NULL, +/* e79d */ NULL, +/* e79e */ NULL, +/* e79f */ NULL, +/* e7a0 */ NULL, +/* e7a1 */ NULL, +/* e7a2 */ NULL, +/* e7a3 */ NULL, +/* e7a4 */ NULL, +/* e7a5 */ NULL, +/* e7a6 */ NULL, +/* e7a7 */ NULL, +/* e7a8 */ NULL, +/* e7a9 */ NULL, +/* e7aa */ NULL, +/* e7ab */ NULL, +/* e7ac */ NULL, +/* e7ad */ NULL, +/* e7ae */ NULL, +/* e7af */ NULL, +/* e7b0 */ NULL, +/* e7b1 */ NULL, +/* e7b2 */ NULL, +/* e7b3 */ NULL, +/* e7b4 */ NULL, +/* e7b5 */ NULL, +/* e7b6 */ NULL, +/* e7b7 */ NULL, +/* e7b8 */ NULL, +/* e7b9 */ NULL, +/* e7ba */ NULL, +/* e7bb */ NULL, +/* e7bc */ NULL, +/* e7bd */ NULL, +/* e7be */ NULL, +/* e7bf */ NULL, +/* e7c0 */ NULL, +/* e7c1 */ NULL, +/* e7c2 */ NULL, +/* e7c3 */ NULL, +/* e7c4 */ NULL, +/* e7c5 */ NULL, +/* e7c6 */ NULL, +/* e7c7 */ NULL, +/* e7c8 */ NULL, +/* e7c9 */ NULL, +/* e7ca */ NULL, +/* e7cb */ NULL, +/* e7cc */ NULL, +/* e7cd */ NULL, +/* e7ce */ NULL, +/* e7cf */ NULL, +/* e7d0 */ NULL, +/* e7d1 */ NULL, +/* e7d2 */ NULL, +/* e7d3 */ NULL, +/* e7d4 */ NULL, +/* e7d5 */ NULL, +/* e7d6 */ NULL, +/* e7d7 */ NULL, +/* e7d8 */ NULL, +/* e7d9 */ NULL, +/* e7da */ NULL, +/* e7db */ NULL, +/* e7dc */ NULL, +/* e7dd */ NULL, +/* e7de */ NULL, +/* e7df */ NULL, +/* e7e0 */ NULL, +/* e7e1 */ NULL, +/* e7e2 */ NULL, +/* e7e3 */ NULL, +/* e7e4 */ NULL, +/* e7e5 */ NULL, +/* e7e6 */ NULL, +/* e7e7 */ NULL, +/* e7e8 */ NULL, +/* e7e9 */ NULL, +/* e7ea */ NULL, +/* e7eb */ NULL, +/* e7ec */ NULL, +/* e7ed */ NULL, +/* e7ee */ NULL, +/* e7ef */ NULL, +/* e7f0 */ NULL, +/* e7f1 */ NULL, +/* e7f2 */ NULL, +/* e7f3 */ NULL, +/* e7f4 */ NULL, +/* e7f5 */ NULL, +/* e7f6 */ NULL, +/* e7f7 */ NULL, +/* e7f8 */ NULL, +/* e7f9 */ NULL, +/* e7fa */ NULL, +/* e7fb */ NULL, +/* e7fc */ NULL, +/* e7fd */ NULL, +/* e7fe */ NULL, +/* e7ff */ NULL, +/* e800 */ NULL, +/* e801 */ NULL, +/* e802 */ NULL, +/* e803 */ NULL, +/* e804 */ NULL, +/* e805 */ NULL, +/* e806 */ NULL, +/* e807 */ NULL, +/* e808 */ NULL, +/* e809 */ NULL, +/* e80a */ NULL, +/* e80b */ NULL, +/* e80c */ NULL, +/* e80d */ NULL, +/* e80e */ NULL, +/* e80f */ NULL, +/* e810 */ NULL, +/* e811 */ NULL, +/* e812 */ NULL, +/* e813 */ NULL, +/* e814 */ NULL, +/* e815 */ NULL, +/* e816 */ NULL, +/* e817 */ NULL, +/* e818 */ NULL, +/* e819 */ NULL, +/* e81a */ NULL, +/* e81b */ NULL, +/* e81c */ NULL, +/* e81d */ NULL, +/* e81e */ NULL, +/* e81f */ NULL, +/* e820 */ NULL, +/* e821 */ NULL, +/* e822 */ NULL, +/* e823 */ NULL, +/* e824 */ NULL, +/* e825 */ NULL, +/* e826 */ NULL, +/* e827 */ NULL, +/* e828 */ NULL, +/* e829 */ NULL, +/* e82a */ NULL, +/* e82b */ NULL, +/* e82c */ NULL, +/* e82d */ NULL, +/* e82e */ NULL, +/* e82f */ NULL, +/* e830 */ NULL, +/* e831 */ NULL, +/* e832 */ NULL, +/* e833 */ NULL, +/* e834 */ NULL, +/* e835 */ NULL, +/* e836 */ NULL, +/* e837 */ NULL, +/* e838 */ NULL, +/* e839 */ NULL, +/* e83a */ NULL, +/* e83b */ NULL, +/* e83c */ NULL, +/* e83d */ NULL, +/* e83e */ NULL, +/* e83f */ NULL, +/* e840 */ NULL, +/* e841 */ NULL, +/* e842 */ NULL, +/* e843 */ NULL, +/* e844 */ NULL, +/* e845 */ NULL, +/* e846 */ NULL, +/* e847 */ NULL, +/* e848 */ NULL, +/* e849 */ NULL, +/* e84a */ NULL, +/* e84b */ NULL, +/* e84c */ NULL, +/* e84d */ NULL, +/* e84e */ NULL, +/* e84f */ NULL, +/* e850 */ NULL, +/* e851 */ NULL, +/* e852 */ NULL, +/* e853 */ NULL, +/* e854 */ NULL, +/* e855 */ NULL, +/* e856 */ NULL, +/* e857 */ NULL, +/* e858 */ NULL, +/* e859 */ NULL, +/* e85a */ NULL, +/* e85b */ NULL, +/* e85c */ NULL, +/* e85d */ NULL, +/* e85e */ NULL, +/* e85f */ NULL, +/* e860 */ NULL, +/* e861 */ NULL, +/* e862 */ NULL, +/* e863 */ NULL, +/* e864 */ NULL, +/* e865 */ NULL, +/* e866 */ NULL, +/* e867 */ NULL, +/* e868 */ NULL, +/* e869 */ NULL, +/* e86a */ NULL, +/* e86b */ NULL, +/* e86c */ NULL, +/* e86d */ NULL, +/* e86e */ NULL, +/* e86f */ NULL, +/* e870 */ NULL, +/* e871 */ NULL, +/* e872 */ NULL, +/* e873 */ NULL, +/* e874 */ NULL, +/* e875 */ NULL, +/* e876 */ NULL, +/* e877 */ NULL, +/* e878 */ NULL, +/* e879 */ NULL, +/* e87a */ NULL, +/* e87b */ NULL, +/* e87c */ NULL, +/* e87d */ NULL, +/* e87e */ NULL, +/* e87f */ NULL, +/* e880 */ NULL, +/* e881 */ NULL, +/* e882 */ NULL, +/* e883 */ NULL, +/* e884 */ NULL, +/* e885 */ NULL, +/* e886 */ NULL, +/* e887 */ NULL, +/* e888 */ NULL, +/* e889 */ NULL, +/* e88a */ NULL, +/* e88b */ NULL, +/* e88c */ NULL, +/* e88d */ NULL, +/* e88e */ NULL, +/* e88f */ NULL, +/* e890 */ NULL, +/* e891 */ NULL, +/* e892 */ NULL, +/* e893 */ NULL, +/* e894 */ NULL, +/* e895 */ NULL, +/* e896 */ NULL, +/* e897 */ NULL, +/* e898 */ NULL, +/* e899 */ NULL, +/* e89a */ NULL, +/* e89b */ NULL, +/* e89c */ NULL, +/* e89d */ NULL, +/* e89e */ NULL, +/* e89f */ NULL, +/* e8a0 */ NULL, +/* e8a1 */ NULL, +/* e8a2 */ NULL, +/* e8a3 */ NULL, +/* e8a4 */ NULL, +/* e8a5 */ NULL, +/* e8a6 */ NULL, +/* e8a7 */ NULL, +/* e8a8 */ NULL, +/* e8a9 */ NULL, +/* e8aa */ NULL, +/* e8ab */ NULL, +/* e8ac */ NULL, +/* e8ad */ NULL, +/* e8ae */ NULL, +/* e8af */ NULL, +/* e8b0 */ NULL, +/* e8b1 */ NULL, +/* e8b2 */ NULL, +/* e8b3 */ NULL, +/* e8b4 */ NULL, +/* e8b5 */ NULL, +/* e8b6 */ NULL, +/* e8b7 */ NULL, +/* e8b8 */ NULL, +/* e8b9 */ NULL, +/* e8ba */ NULL, +/* e8bb */ NULL, +/* e8bc */ NULL, +/* e8bd */ NULL, +/* e8be */ NULL, +/* e8bf */ NULL, +/* e8c0 */ NULL, +/* e8c1 */ NULL, +/* e8c2 */ NULL, +/* e8c3 */ NULL, +/* e8c4 */ NULL, +/* e8c5 */ NULL, +/* e8c6 */ NULL, +/* e8c7 */ NULL, +/* e8c8 */ NULL, +/* e8c9 */ NULL, +/* e8ca */ NULL, +/* e8cb */ NULL, +/* e8cc */ NULL, +/* e8cd */ NULL, +/* e8ce */ NULL, +/* e8cf */ NULL, +/* e8d0 */ NULL, +/* e8d1 */ NULL, +/* e8d2 */ NULL, +/* e8d3 */ NULL, +/* e8d4 */ NULL, +/* e8d5 */ NULL, +/* e8d6 */ NULL, +/* e8d7 */ NULL, +/* e8d8 */ NULL, +/* e8d9 */ NULL, +/* e8da */ NULL, +/* e8db */ NULL, +/* e8dc */ NULL, +/* e8dd */ NULL, +/* e8de */ NULL, +/* e8df */ NULL, +/* e8e0 */ NULL, +/* e8e1 */ NULL, +/* e8e2 */ NULL, +/* e8e3 */ NULL, +/* e8e4 */ NULL, +/* e8e5 */ NULL, +/* e8e6 */ NULL, +/* e8e7 */ NULL, +/* e8e8 */ NULL, +/* e8e9 */ NULL, +/* e8ea */ NULL, +/* e8eb */ NULL, +/* e8ec */ NULL, +/* e8ed */ NULL, +/* e8ee */ NULL, +/* e8ef */ NULL, +/* e8f0 */ NULL, +/* e8f1 */ NULL, +/* e8f2 */ NULL, +/* e8f3 */ NULL, +/* e8f4 */ NULL, +/* e8f5 */ NULL, +/* e8f6 */ NULL, +/* e8f7 */ NULL, +/* e8f8 */ NULL, +/* e8f9 */ NULL, +/* e8fa */ NULL, +/* e8fb */ NULL, +/* e8fc */ NULL, +/* e8fd */ NULL, +/* e8fe */ NULL, +/* e8ff */ NULL, +/* e900 */ NULL, +/* e901 */ NULL, +/* e902 */ NULL, +/* e903 */ NULL, +/* e904 */ NULL, +/* e905 */ NULL, +/* e906 */ NULL, +/* e907 */ NULL, +/* e908 */ NULL, +/* e909 */ NULL, +/* e90a */ NULL, +/* e90b */ NULL, +/* e90c */ NULL, +/* e90d */ NULL, +/* e90e */ NULL, +/* e90f */ NULL, +/* e910 */ NULL, +/* e911 */ NULL, +/* e912 */ NULL, +/* e913 */ NULL, +/* e914 */ NULL, +/* e915 */ NULL, +/* e916 */ NULL, +/* e917 */ NULL, +/* e918 */ NULL, +/* e919 */ NULL, +/* e91a */ NULL, +/* e91b */ NULL, +/* e91c */ NULL, +/* e91d */ NULL, +/* e91e */ NULL, +/* e91f */ NULL, +/* e920 */ NULL, +/* e921 */ NULL, +/* e922 */ NULL, +/* e923 */ NULL, +/* e924 */ NULL, +/* e925 */ NULL, +/* e926 */ NULL, +/* e927 */ NULL, +/* e928 */ NULL, +/* e929 */ NULL, +/* e92a */ NULL, +/* e92b */ NULL, +/* e92c */ NULL, +/* e92d */ NULL, +/* e92e */ NULL, +/* e92f */ NULL, +/* e930 */ NULL, +/* e931 */ NULL, +/* e932 */ NULL, +/* e933 */ NULL, +/* e934 */ NULL, +/* e935 */ NULL, +/* e936 */ NULL, +/* e937 */ NULL, +/* e938 */ NULL, +/* e939 */ NULL, +/* e93a */ NULL, +/* e93b */ NULL, +/* e93c */ NULL, +/* e93d */ NULL, +/* e93e */ NULL, +/* e93f */ NULL, +/* e940 */ NULL, +/* e941 */ NULL, +/* e942 */ NULL, +/* e943 */ NULL, +/* e944 */ NULL, +/* e945 */ NULL, +/* e946 */ NULL, +/* e947 */ NULL, +/* e948 */ NULL, +/* e949 */ NULL, +/* e94a */ NULL, +/* e94b */ NULL, +/* e94c */ NULL, +/* e94d */ NULL, +/* e94e */ NULL, +/* e94f */ NULL, +/* e950 */ NULL, +/* e951 */ NULL, +/* e952 */ NULL, +/* e953 */ NULL, +/* e954 */ NULL, +/* e955 */ NULL, +/* e956 */ NULL, +/* e957 */ NULL, +/* e958 */ NULL, +/* e959 */ NULL, +/* e95a */ NULL, +/* e95b */ NULL, +/* e95c */ NULL, +/* e95d */ NULL, +/* e95e */ NULL, +/* e95f */ NULL, +/* e960 */ NULL, +/* e961 */ NULL, +/* e962 */ NULL, +/* e963 */ NULL, +/* e964 */ NULL, +/* e965 */ NULL, +/* e966 */ NULL, +/* e967 */ NULL, +/* e968 */ NULL, +/* e969 */ NULL, +/* e96a */ NULL, +/* e96b */ NULL, +/* e96c */ NULL, +/* e96d */ NULL, +/* e96e */ NULL, +/* e96f */ NULL, +/* e970 */ NULL, +/* e971 */ NULL, +/* e972 */ NULL, +/* e973 */ NULL, +/* e974 */ NULL, +/* e975 */ NULL, +/* e976 */ NULL, +/* e977 */ NULL, +/* e978 */ NULL, +/* e979 */ NULL, +/* e97a */ NULL, +/* e97b */ NULL, +/* e97c */ NULL, +/* e97d */ NULL, +/* e97e */ NULL, +/* e97f */ NULL, +/* e980 */ NULL, +/* e981 */ NULL, +/* e982 */ NULL, +/* e983 */ NULL, +/* e984 */ NULL, +/* e985 */ NULL, +/* e986 */ NULL, +/* e987 */ NULL, +/* e988 */ NULL, +/* e989 */ NULL, +/* e98a */ NULL, +/* e98b */ NULL, +/* e98c */ NULL, +/* e98d */ NULL, +/* e98e */ NULL, +/* e98f */ NULL, +/* e990 */ NULL, +/* e991 */ NULL, +/* e992 */ NULL, +/* e993 */ NULL, +/* e994 */ NULL, +/* e995 */ NULL, +/* e996 */ NULL, +/* e997 */ NULL, +/* e998 */ NULL, +/* e999 */ NULL, +/* e99a */ NULL, +/* e99b */ NULL, +/* e99c */ NULL, +/* e99d */ NULL, +/* e99e */ NULL, +/* e99f */ NULL, +/* e9a0 */ NULL, +/* e9a1 */ NULL, +/* e9a2 */ NULL, +/* e9a3 */ NULL, +/* e9a4 */ NULL, +/* e9a5 */ NULL, +/* e9a6 */ NULL, +/* e9a7 */ NULL, +/* e9a8 */ NULL, +/* e9a9 */ NULL, +/* e9aa */ NULL, +/* e9ab */ NULL, +/* e9ac */ NULL, +/* e9ad */ NULL, +/* e9ae */ NULL, +/* e9af */ NULL, +/* e9b0 */ NULL, +/* e9b1 */ NULL, +/* e9b2 */ NULL, +/* e9b3 */ NULL, +/* e9b4 */ NULL, +/* e9b5 */ NULL, +/* e9b6 */ NULL, +/* e9b7 */ NULL, +/* e9b8 */ NULL, +/* e9b9 */ NULL, +/* e9ba */ NULL, +/* e9bb */ NULL, +/* e9bc */ NULL, +/* e9bd */ NULL, +/* e9be */ NULL, +/* e9bf */ NULL, +/* e9c0 */ NULL, +/* e9c1 */ NULL, +/* e9c2 */ NULL, +/* e9c3 */ NULL, +/* e9c4 */ NULL, +/* e9c5 */ NULL, +/* e9c6 */ NULL, +/* e9c7 */ NULL, +/* e9c8 */ NULL, +/* e9c9 */ NULL, +/* e9ca */ NULL, +/* e9cb */ NULL, +/* e9cc */ NULL, +/* e9cd */ NULL, +/* e9ce */ NULL, +/* e9cf */ NULL, +/* e9d0 */ NULL, +/* e9d1 */ NULL, +/* e9d2 */ NULL, +/* e9d3 */ NULL, +/* e9d4 */ NULL, +/* e9d5 */ NULL, +/* e9d6 */ NULL, +/* e9d7 */ NULL, +/* e9d8 */ NULL, +/* e9d9 */ NULL, +/* e9da */ NULL, +/* e9db */ NULL, +/* e9dc */ NULL, +/* e9dd */ NULL, +/* e9de */ NULL, +/* e9df */ NULL, +/* e9e0 */ NULL, +/* e9e1 */ NULL, +/* e9e2 */ NULL, +/* e9e3 */ NULL, +/* e9e4 */ NULL, +/* e9e5 */ NULL, +/* e9e6 */ NULL, +/* e9e7 */ NULL, +/* e9e8 */ NULL, +/* e9e9 */ NULL, +/* e9ea */ NULL, +/* e9eb */ NULL, +/* e9ec */ NULL, +/* e9ed */ NULL, +/* e9ee */ NULL, +/* e9ef */ NULL, +/* e9f0 */ NULL, +/* e9f1 */ NULL, +/* e9f2 */ NULL, +/* e9f3 */ NULL, +/* e9f4 */ NULL, +/* e9f5 */ NULL, +/* e9f6 */ NULL, +/* e9f7 */ NULL, +/* e9f8 */ NULL, +/* e9f9 */ NULL, +/* e9fa */ NULL, +/* e9fb */ NULL, +/* e9fc */ NULL, +/* e9fd */ NULL, +/* e9fe */ NULL, +/* e9ff */ NULL, +/* ea00 */ NULL, +/* ea01 */ NULL, +/* ea02 */ NULL, +/* ea03 */ NULL, +/* ea04 */ NULL, +/* ea05 */ NULL, +/* ea06 */ NULL, +/* ea07 */ NULL, +/* ea08 */ NULL, +/* ea09 */ NULL, +/* ea0a */ NULL, +/* ea0b */ NULL, +/* ea0c */ NULL, +/* ea0d */ NULL, +/* ea0e */ NULL, +/* ea0f */ NULL, +/* ea10 */ NULL, +/* ea11 */ NULL, +/* ea12 */ NULL, +/* ea13 */ NULL, +/* ea14 */ NULL, +/* ea15 */ NULL, +/* ea16 */ NULL, +/* ea17 */ NULL, +/* ea18 */ NULL, +/* ea19 */ NULL, +/* ea1a */ NULL, +/* ea1b */ NULL, +/* ea1c */ NULL, +/* ea1d */ NULL, +/* ea1e */ NULL, +/* ea1f */ NULL, +/* ea20 */ NULL, +/* ea21 */ NULL, +/* ea22 */ NULL, +/* ea23 */ NULL, +/* ea24 */ NULL, +/* ea25 */ NULL, +/* ea26 */ NULL, +/* ea27 */ NULL, +/* ea28 */ NULL, +/* ea29 */ NULL, +/* ea2a */ NULL, +/* ea2b */ NULL, +/* ea2c */ NULL, +/* ea2d */ NULL, +/* ea2e */ NULL, +/* ea2f */ NULL, +/* ea30 */ NULL, +/* ea31 */ NULL, +/* ea32 */ NULL, +/* ea33 */ NULL, +/* ea34 */ NULL, +/* ea35 */ NULL, +/* ea36 */ NULL, +/* ea37 */ NULL, +/* ea38 */ NULL, +/* ea39 */ NULL, +/* ea3a */ NULL, +/* ea3b */ NULL, +/* ea3c */ NULL, +/* ea3d */ NULL, +/* ea3e */ NULL, +/* ea3f */ NULL, +/* ea40 */ NULL, +/* ea41 */ NULL, +/* ea42 */ NULL, +/* ea43 */ NULL, +/* ea44 */ NULL, +/* ea45 */ NULL, +/* ea46 */ NULL, +/* ea47 */ NULL, +/* ea48 */ NULL, +/* ea49 */ NULL, +/* ea4a */ NULL, +/* ea4b */ NULL, +/* ea4c */ NULL, +/* ea4d */ NULL, +/* ea4e */ NULL, +/* ea4f */ NULL, +/* ea50 */ NULL, +/* ea51 */ NULL, +/* ea52 */ NULL, +/* ea53 */ NULL, +/* ea54 */ NULL, +/* ea55 */ NULL, +/* ea56 */ NULL, +/* ea57 */ NULL, +/* ea58 */ NULL, +/* ea59 */ NULL, +/* ea5a */ NULL, +/* ea5b */ NULL, +/* ea5c */ NULL, +/* ea5d */ NULL, +/* ea5e */ NULL, +/* ea5f */ NULL, +/* ea60 */ NULL, +/* ea61 */ NULL, +/* ea62 */ NULL, +/* ea63 */ NULL, +/* ea64 */ NULL, +/* ea65 */ NULL, +/* ea66 */ NULL, +/* ea67 */ NULL, +/* ea68 */ NULL, +/* ea69 */ NULL, +/* ea6a */ NULL, +/* ea6b */ NULL, +/* ea6c */ NULL, +/* ea6d */ NULL, +/* ea6e */ NULL, +/* ea6f */ NULL, +/* ea70 */ NULL, +/* ea71 */ NULL, +/* ea72 */ NULL, +/* ea73 */ NULL, +/* ea74 */ NULL, +/* ea75 */ NULL, +/* ea76 */ NULL, +/* ea77 */ NULL, +/* ea78 */ NULL, +/* ea79 */ NULL, +/* ea7a */ NULL, +/* ea7b */ NULL, +/* ea7c */ NULL, +/* ea7d */ NULL, +/* ea7e */ NULL, +/* ea7f */ NULL, +/* ea80 */ NULL, +/* ea81 */ NULL, +/* ea82 */ NULL, +/* ea83 */ NULL, +/* ea84 */ NULL, +/* ea85 */ NULL, +/* ea86 */ NULL, +/* ea87 */ NULL, +/* ea88 */ NULL, +/* ea89 */ NULL, +/* ea8a */ NULL, +/* ea8b */ NULL, +/* ea8c */ NULL, +/* ea8d */ NULL, +/* ea8e */ NULL, +/* ea8f */ NULL, +/* ea90 */ NULL, +/* ea91 */ NULL, +/* ea92 */ NULL, +/* ea93 */ NULL, +/* ea94 */ NULL, +/* ea95 */ NULL, +/* ea96 */ NULL, +/* ea97 */ NULL, +/* ea98 */ NULL, +/* ea99 */ NULL, +/* ea9a */ NULL, +/* ea9b */ NULL, +/* ea9c */ NULL, +/* ea9d */ NULL, +/* ea9e */ NULL, +/* ea9f */ NULL, +/* eaa0 */ NULL, +/* eaa1 */ NULL, +/* eaa2 */ NULL, +/* eaa3 */ NULL, +/* eaa4 */ NULL, +/* eaa5 */ NULL, +/* eaa6 */ NULL, +/* eaa7 */ NULL, +/* eaa8 */ NULL, +/* eaa9 */ NULL, +/* eaaa */ NULL, +/* eaab */ NULL, +/* eaac */ NULL, +/* eaad */ NULL, +/* eaae */ NULL, +/* eaaf */ NULL, +/* eab0 */ NULL, +/* eab1 */ NULL, +/* eab2 */ NULL, +/* eab3 */ NULL, +/* eab4 */ NULL, +/* eab5 */ NULL, +/* eab6 */ NULL, +/* eab7 */ NULL, +/* eab8 */ NULL, +/* eab9 */ NULL, +/* eaba */ NULL, +/* eabb */ NULL, +/* eabc */ NULL, +/* eabd */ NULL, +/* eabe */ NULL, +/* eabf */ NULL, +/* eac0 */ NULL, +/* eac1 */ NULL, +/* eac2 */ NULL, +/* eac3 */ NULL, +/* eac4 */ NULL, +/* eac5 */ NULL, +/* eac6 */ NULL, +/* eac7 */ NULL, +/* eac8 */ NULL, +/* eac9 */ NULL, +/* eaca */ NULL, +/* eacb */ NULL, +/* eacc */ NULL, +/* eacd */ NULL, +/* eace */ NULL, +/* eacf */ NULL, +/* ead0 */ NULL, +/* ead1 */ NULL, +/* ead2 */ NULL, +/* ead3 */ NULL, +/* ead4 */ NULL, +/* ead5 */ NULL, +/* ead6 */ NULL, +/* ead7 */ NULL, +/* ead8 */ NULL, +/* ead9 */ NULL, +/* eada */ NULL, +/* eadb */ NULL, +/* eadc */ NULL, +/* eadd */ NULL, +/* eade */ NULL, +/* eadf */ NULL, +/* eae0 */ NULL, +/* eae1 */ NULL, +/* eae2 */ NULL, +/* eae3 */ NULL, +/* eae4 */ NULL, +/* eae5 */ NULL, +/* eae6 */ NULL, +/* eae7 */ NULL, +/* eae8 */ NULL, +/* eae9 */ NULL, +/* eaea */ NULL, +/* eaeb */ NULL, +/* eaec */ NULL, +/* eaed */ NULL, +/* eaee */ NULL, +/* eaef */ NULL, +/* eaf0 */ NULL, +/* eaf1 */ NULL, +/* eaf2 */ NULL, +/* eaf3 */ NULL, +/* eaf4 */ NULL, +/* eaf5 */ NULL, +/* eaf6 */ NULL, +/* eaf7 */ NULL, +/* eaf8 */ NULL, +/* eaf9 */ NULL, +/* eafa */ NULL, +/* eafb */ NULL, +/* eafc */ NULL, +/* eafd */ NULL, +/* eafe */ NULL, +/* eaff */ NULL, +/* eb00 */ NULL, +/* eb01 */ NULL, +/* eb02 */ NULL, +/* eb03 */ NULL, +/* eb04 */ NULL, +/* eb05 */ NULL, +/* eb06 */ NULL, +/* eb07 */ NULL, +/* eb08 */ NULL, +/* eb09 */ NULL, +/* eb0a */ NULL, +/* eb0b */ NULL, +/* eb0c */ NULL, +/* eb0d */ NULL, +/* eb0e */ NULL, +/* eb0f */ NULL, +/* eb10 */ NULL, +/* eb11 */ NULL, +/* eb12 */ NULL, +/* eb13 */ NULL, +/* eb14 */ NULL, +/* eb15 */ NULL, +/* eb16 */ NULL, +/* eb17 */ NULL, +/* eb18 */ NULL, +/* eb19 */ NULL, +/* eb1a */ NULL, +/* eb1b */ NULL, +/* eb1c */ NULL, +/* eb1d */ NULL, +/* eb1e */ NULL, +/* eb1f */ NULL, +/* eb20 */ NULL, +/* eb21 */ NULL, +/* eb22 */ NULL, +/* eb23 */ NULL, +/* eb24 */ NULL, +/* eb25 */ NULL, +/* eb26 */ NULL, +/* eb27 */ NULL, +/* eb28 */ NULL, +/* eb29 */ NULL, +/* eb2a */ NULL, +/* eb2b */ NULL, +/* eb2c */ NULL, +/* eb2d */ NULL, +/* eb2e */ NULL, +/* eb2f */ NULL, +/* eb30 */ NULL, +/* eb31 */ NULL, +/* eb32 */ NULL, +/* eb33 */ NULL, +/* eb34 */ NULL, +/* eb35 */ NULL, +/* eb36 */ NULL, +/* eb37 */ NULL, +/* eb38 */ NULL, +/* eb39 */ NULL, +/* eb3a */ NULL, +/* eb3b */ NULL, +/* eb3c */ NULL, +/* eb3d */ NULL, +/* eb3e */ NULL, +/* eb3f */ NULL, +/* eb40 */ NULL, +/* eb41 */ NULL, +/* eb42 */ NULL, +/* eb43 */ NULL, +/* eb44 */ NULL, +/* eb45 */ NULL, +/* eb46 */ NULL, +/* eb47 */ NULL, +/* eb48 */ NULL, +/* eb49 */ NULL, +/* eb4a */ NULL, +/* eb4b */ NULL, +/* eb4c */ NULL, +/* eb4d */ NULL, +/* eb4e */ NULL, +/* eb4f */ NULL, +/* eb50 */ NULL, +/* eb51 */ NULL, +/* eb52 */ NULL, +/* eb53 */ NULL, +/* eb54 */ NULL, +/* eb55 */ NULL, +/* eb56 */ NULL, +/* eb57 */ NULL, +/* eb58 */ NULL, +/* eb59 */ NULL, +/* eb5a */ NULL, +/* eb5b */ NULL, +/* eb5c */ NULL, +/* eb5d */ NULL, +/* eb5e */ NULL, +/* eb5f */ NULL, +/* eb60 */ NULL, +/* eb61 */ NULL, +/* eb62 */ NULL, +/* eb63 */ NULL, +/* eb64 */ NULL, +/* eb65 */ NULL, +/* eb66 */ NULL, +/* eb67 */ NULL, +/* eb68 */ NULL, +/* eb69 */ NULL, +/* eb6a */ NULL, +/* eb6b */ NULL, +/* eb6c */ NULL, +/* eb6d */ NULL, +/* eb6e */ NULL, +/* eb6f */ NULL, +/* eb70 */ NULL, +/* eb71 */ NULL, +/* eb72 */ NULL, +/* eb73 */ NULL, +/* eb74 */ NULL, +/* eb75 */ NULL, +/* eb76 */ NULL, +/* eb77 */ NULL, +/* eb78 */ NULL, +/* eb79 */ NULL, +/* eb7a */ NULL, +/* eb7b */ NULL, +/* eb7c */ NULL, +/* eb7d */ NULL, +/* eb7e */ NULL, +/* eb7f */ NULL, +/* eb80 */ NULL, +/* eb81 */ NULL, +/* eb82 */ NULL, +/* eb83 */ NULL, +/* eb84 */ NULL, +/* eb85 */ NULL, +/* eb86 */ NULL, +/* eb87 */ NULL, +/* eb88 */ NULL, +/* eb89 */ NULL, +/* eb8a */ NULL, +/* eb8b */ NULL, +/* eb8c */ NULL, +/* eb8d */ NULL, +/* eb8e */ NULL, +/* eb8f */ NULL, +/* eb90 */ NULL, +/* eb91 */ NULL, +/* eb92 */ NULL, +/* eb93 */ NULL, +/* eb94 */ NULL, +/* eb95 */ NULL, +/* eb96 */ NULL, +/* eb97 */ NULL, +/* eb98 */ NULL, +/* eb99 */ NULL, +/* eb9a */ NULL, +/* eb9b */ NULL, +/* eb9c */ NULL, +/* eb9d */ NULL, +/* eb9e */ NULL, +/* eb9f */ NULL, +/* eba0 */ NULL, +/* eba1 */ NULL, +/* eba2 */ NULL, +/* eba3 */ NULL, +/* eba4 */ NULL, +/* eba5 */ NULL, +/* eba6 */ NULL, +/* eba7 */ NULL, +/* eba8 */ NULL, +/* eba9 */ NULL, +/* ebaa */ NULL, +/* ebab */ NULL, +/* ebac */ NULL, +/* ebad */ NULL, +/* ebae */ NULL, +/* ebaf */ NULL, +/* ebb0 */ NULL, +/* ebb1 */ NULL, +/* ebb2 */ NULL, +/* ebb3 */ NULL, +/* ebb4 */ NULL, +/* ebb5 */ NULL, +/* ebb6 */ NULL, +/* ebb7 */ NULL, +/* ebb8 */ NULL, +/* ebb9 */ NULL, +/* ebba */ NULL, +/* ebbb */ NULL, +/* ebbc */ NULL, +/* ebbd */ NULL, +/* ebbe */ NULL, +/* ebbf */ NULL, +/* ebc0 */ NULL, +/* ebc1 */ NULL, +/* ebc2 */ NULL, +/* ebc3 */ NULL, +/* ebc4 */ NULL, +/* ebc5 */ NULL, +/* ebc6 */ NULL, +/* ebc7 */ NULL, +/* ebc8 */ NULL, +/* ebc9 */ NULL, +/* ebca */ NULL, +/* ebcb */ NULL, +/* ebcc */ NULL, +/* ebcd */ NULL, +/* ebce */ NULL, +/* ebcf */ NULL, +/* ebd0 */ NULL, +/* ebd1 */ NULL, +/* ebd2 */ NULL, +/* ebd3 */ NULL, +/* ebd4 */ NULL, +/* ebd5 */ NULL, +/* ebd6 */ NULL, +/* ebd7 */ NULL, +/* ebd8 */ NULL, +/* ebd9 */ NULL, +/* ebda */ NULL, +/* ebdb */ NULL, +/* ebdc */ NULL, +/* ebdd */ NULL, +/* ebde */ NULL, +/* ebdf */ NULL, +/* ebe0 */ NULL, +/* ebe1 */ NULL, +/* ebe2 */ NULL, +/* ebe3 */ NULL, +/* ebe4 */ NULL, +/* ebe5 */ NULL, +/* ebe6 */ NULL, +/* ebe7 */ NULL, +/* ebe8 */ NULL, +/* ebe9 */ NULL, +/* ebea */ NULL, +/* ebeb */ NULL, +/* ebec */ NULL, +/* ebed */ NULL, +/* ebee */ NULL, +/* ebef */ NULL, +/* ebf0 */ NULL, +/* ebf1 */ NULL, +/* ebf2 */ NULL, +/* ebf3 */ NULL, +/* ebf4 */ NULL, +/* ebf5 */ NULL, +/* ebf6 */ NULL, +/* ebf7 */ NULL, +/* ebf8 */ NULL, +/* ebf9 */ NULL, +/* ebfa */ NULL, +/* ebfb */ NULL, +/* ebfc */ NULL, +/* ebfd */ NULL, +/* ebfe */ NULL, +/* ebff */ NULL, +/* ec00 */ NULL, +/* ec01 */ NULL, +/* ec02 */ NULL, +/* ec03 */ NULL, +/* ec04 */ NULL, +/* ec05 */ NULL, +/* ec06 */ NULL, +/* ec07 */ NULL, +/* ec08 */ NULL, +/* ec09 */ NULL, +/* ec0a */ NULL, +/* ec0b */ NULL, +/* ec0c */ NULL, +/* ec0d */ NULL, +/* ec0e */ NULL, +/* ec0f */ NULL, +/* ec10 */ NULL, +/* ec11 */ NULL, +/* ec12 */ NULL, +/* ec13 */ NULL, +/* ec14 */ NULL, +/* ec15 */ NULL, +/* ec16 */ NULL, +/* ec17 */ NULL, +/* ec18 */ NULL, +/* ec19 */ NULL, +/* ec1a */ NULL, +/* ec1b */ NULL, +/* ec1c */ NULL, +/* ec1d */ NULL, +/* ec1e */ NULL, +/* ec1f */ NULL, +/* ec20 */ NULL, +/* ec21 */ NULL, +/* ec22 */ NULL, +/* ec23 */ NULL, +/* ec24 */ NULL, +/* ec25 */ NULL, +/* ec26 */ NULL, +/* ec27 */ NULL, +/* ec28 */ NULL, +/* ec29 */ NULL, +/* ec2a */ NULL, +/* ec2b */ NULL, +/* ec2c */ NULL, +/* ec2d */ NULL, +/* ec2e */ NULL, +/* ec2f */ NULL, +/* ec30 */ NULL, +/* ec31 */ NULL, +/* ec32 */ NULL, +/* ec33 */ NULL, +/* ec34 */ NULL, +/* ec35 */ NULL, +/* ec36 */ NULL, +/* ec37 */ NULL, +/* ec38 */ NULL, +/* ec39 */ NULL, +/* ec3a */ NULL, +/* ec3b */ NULL, +/* ec3c */ NULL, +/* ec3d */ NULL, +/* ec3e */ NULL, +/* ec3f */ NULL, +/* ec40 */ NULL, +/* ec41 */ NULL, +/* ec42 */ NULL, +/* ec43 */ NULL, +/* ec44 */ NULL, +/* ec45 */ NULL, +/* ec46 */ NULL, +/* ec47 */ NULL, +/* ec48 */ NULL, +/* ec49 */ NULL, +/* ec4a */ NULL, +/* ec4b */ NULL, +/* ec4c */ NULL, +/* ec4d */ NULL, +/* ec4e */ NULL, +/* ec4f */ NULL, +/* ec50 */ NULL, +/* ec51 */ NULL, +/* ec52 */ NULL, +/* ec53 */ NULL, +/* ec54 */ NULL, +/* ec55 */ NULL, +/* ec56 */ NULL, +/* ec57 */ NULL, +/* ec58 */ NULL, +/* ec59 */ NULL, +/* ec5a */ NULL, +/* ec5b */ NULL, +/* ec5c */ NULL, +/* ec5d */ NULL, +/* ec5e */ NULL, +/* ec5f */ NULL, +/* ec60 */ NULL, +/* ec61 */ NULL, +/* ec62 */ NULL, +/* ec63 */ NULL, +/* ec64 */ NULL, +/* ec65 */ NULL, +/* ec66 */ NULL, +/* ec67 */ NULL, +/* ec68 */ NULL, +/* ec69 */ NULL, +/* ec6a */ NULL, +/* ec6b */ NULL, +/* ec6c */ NULL, +/* ec6d */ NULL, +/* ec6e */ NULL, +/* ec6f */ NULL, +/* ec70 */ NULL, +/* ec71 */ NULL, +/* ec72 */ NULL, +/* ec73 */ NULL, +/* ec74 */ NULL, +/* ec75 */ NULL, +/* ec76 */ NULL, +/* ec77 */ NULL, +/* ec78 */ NULL, +/* ec79 */ NULL, +/* ec7a */ NULL, +/* ec7b */ NULL, +/* ec7c */ NULL, +/* ec7d */ NULL, +/* ec7e */ NULL, +/* ec7f */ NULL, +/* ec80 */ NULL, +/* ec81 */ NULL, +/* ec82 */ NULL, +/* ec83 */ NULL, +/* ec84 */ NULL, +/* ec85 */ NULL, +/* ec86 */ NULL, +/* ec87 */ NULL, +/* ec88 */ NULL, +/* ec89 */ NULL, +/* ec8a */ NULL, +/* ec8b */ NULL, +/* ec8c */ NULL, +/* ec8d */ NULL, +/* ec8e */ NULL, +/* ec8f */ NULL, +/* ec90 */ NULL, +/* ec91 */ NULL, +/* ec92 */ NULL, +/* ec93 */ NULL, +/* ec94 */ NULL, +/* ec95 */ NULL, +/* ec96 */ NULL, +/* ec97 */ NULL, +/* ec98 */ NULL, +/* ec99 */ NULL, +/* ec9a */ NULL, +/* ec9b */ NULL, +/* ec9c */ NULL, +/* ec9d */ NULL, +/* ec9e */ NULL, +/* ec9f */ NULL, +/* eca0 */ NULL, +/* eca1 */ NULL, +/* eca2 */ NULL, +/* eca3 */ NULL, +/* eca4 */ NULL, +/* eca5 */ NULL, +/* eca6 */ NULL, +/* eca7 */ NULL, +/* eca8 */ NULL, +/* eca9 */ NULL, +/* ecaa */ NULL, +/* ecab */ NULL, +/* ecac */ NULL, +/* ecad */ NULL, +/* ecae */ NULL, +/* ecaf */ NULL, +/* ecb0 */ NULL, +/* ecb1 */ NULL, +/* ecb2 */ NULL, +/* ecb3 */ NULL, +/* ecb4 */ NULL, +/* ecb5 */ NULL, +/* ecb6 */ NULL, +/* ecb7 */ NULL, +/* ecb8 */ NULL, +/* ecb9 */ NULL, +/* ecba */ NULL, +/* ecbb */ NULL, +/* ecbc */ NULL, +/* ecbd */ NULL, +/* ecbe */ NULL, +/* ecbf */ NULL, +/* ecc0 */ NULL, +/* ecc1 */ NULL, +/* ecc2 */ NULL, +/* ecc3 */ NULL, +/* ecc4 */ NULL, +/* ecc5 */ NULL, +/* ecc6 */ NULL, +/* ecc7 */ NULL, +/* ecc8 */ NULL, +/* ecc9 */ NULL, +/* ecca */ NULL, +/* eccb */ NULL, +/* eccc */ NULL, +/* eccd */ NULL, +/* ecce */ NULL, +/* eccf */ NULL, +/* ecd0 */ NULL, +/* ecd1 */ NULL, +/* ecd2 */ NULL, +/* ecd3 */ NULL, +/* ecd4 */ NULL, +/* ecd5 */ NULL, +/* ecd6 */ NULL, +/* ecd7 */ NULL, +/* ecd8 */ NULL, +/* ecd9 */ NULL, +/* ecda */ NULL, +/* ecdb */ NULL, +/* ecdc */ NULL, +/* ecdd */ NULL, +/* ecde */ NULL, +/* ecdf */ NULL, +/* ece0 */ NULL, +/* ece1 */ NULL, +/* ece2 */ NULL, +/* ece3 */ NULL, +/* ece4 */ NULL, +/* ece5 */ NULL, +/* ece6 */ NULL, +/* ece7 */ NULL, +/* ece8 */ NULL, +/* ece9 */ NULL, +/* ecea */ NULL, +/* eceb */ NULL, +/* ecec */ NULL, +/* eced */ NULL, +/* ecee */ NULL, +/* ecef */ NULL, +/* ecf0 */ NULL, +/* ecf1 */ NULL, +/* ecf2 */ NULL, +/* ecf3 */ NULL, +/* ecf4 */ NULL, +/* ecf5 */ NULL, +/* ecf6 */ NULL, +/* ecf7 */ NULL, +/* ecf8 */ NULL, +/* ecf9 */ NULL, +/* ecfa */ NULL, +/* ecfb */ NULL, +/* ecfc */ NULL, +/* ecfd */ NULL, +/* ecfe */ NULL, +/* ecff */ NULL, +/* ed00 */ NULL, +/* ed01 */ NULL, +/* ed02 */ NULL, +/* ed03 */ NULL, +/* ed04 */ NULL, +/* ed05 */ NULL, +/* ed06 */ NULL, +/* ed07 */ NULL, +/* ed08 */ NULL, +/* ed09 */ NULL, +/* ed0a */ NULL, +/* ed0b */ NULL, +/* ed0c */ NULL, +/* ed0d */ NULL, +/* ed0e */ NULL, +/* ed0f */ NULL, +/* ed10 */ NULL, +/* ed11 */ NULL, +/* ed12 */ NULL, +/* ed13 */ NULL, +/* ed14 */ NULL, +/* ed15 */ NULL, +/* ed16 */ NULL, +/* ed17 */ NULL, +/* ed18 */ NULL, +/* ed19 */ NULL, +/* ed1a */ NULL, +/* ed1b */ NULL, +/* ed1c */ NULL, +/* ed1d */ NULL, +/* ed1e */ NULL, +/* ed1f */ NULL, +/* ed20 */ NULL, +/* ed21 */ NULL, +/* ed22 */ NULL, +/* ed23 */ NULL, +/* ed24 */ NULL, +/* ed25 */ NULL, +/* ed26 */ NULL, +/* ed27 */ NULL, +/* ed28 */ NULL, +/* ed29 */ NULL, +/* ed2a */ NULL, +/* ed2b */ NULL, +/* ed2c */ NULL, +/* ed2d */ NULL, +/* ed2e */ NULL, +/* ed2f */ NULL, +/* ed30 */ NULL, +/* ed31 */ NULL, +/* ed32 */ NULL, +/* ed33 */ NULL, +/* ed34 */ NULL, +/* ed35 */ NULL, +/* ed36 */ NULL, +/* ed37 */ NULL, +/* ed38 */ NULL, +/* ed39 */ NULL, +/* ed3a */ NULL, +/* ed3b */ NULL, +/* ed3c */ NULL, +/* ed3d */ NULL, +/* ed3e */ NULL, +/* ed3f */ NULL, +/* ed40 */ NULL, +/* ed41 */ NULL, +/* ed42 */ NULL, +/* ed43 */ NULL, +/* ed44 */ NULL, +/* ed45 */ NULL, +/* ed46 */ NULL, +/* ed47 */ NULL, +/* ed48 */ NULL, +/* ed49 */ NULL, +/* ed4a */ NULL, +/* ed4b */ NULL, +/* ed4c */ NULL, +/* ed4d */ NULL, +/* ed4e */ NULL, +/* ed4f */ NULL, +/* ed50 */ NULL, +/* ed51 */ NULL, +/* ed52 */ NULL, +/* ed53 */ NULL, +/* ed54 */ NULL, +/* ed55 */ NULL, +/* ed56 */ NULL, +/* ed57 */ NULL, +/* ed58 */ NULL, +/* ed59 */ NULL, +/* ed5a */ NULL, +/* ed5b */ NULL, +/* ed5c */ NULL, +/* ed5d */ NULL, +/* ed5e */ NULL, +/* ed5f */ NULL, +/* ed60 */ NULL, +/* ed61 */ NULL, +/* ed62 */ NULL, +/* ed63 */ NULL, +/* ed64 */ NULL, +/* ed65 */ NULL, +/* ed66 */ NULL, +/* ed67 */ NULL, +/* ed68 */ NULL, +/* ed69 */ NULL, +/* ed6a */ NULL, +/* ed6b */ NULL, +/* ed6c */ NULL, +/* ed6d */ NULL, +/* ed6e */ NULL, +/* ed6f */ NULL, +/* ed70 */ NULL, +/* ed71 */ NULL, +/* ed72 */ NULL, +/* ed73 */ NULL, +/* ed74 */ NULL, +/* ed75 */ NULL, +/* ed76 */ NULL, +/* ed77 */ NULL, +/* ed78 */ NULL, +/* ed79 */ NULL, +/* ed7a */ NULL, +/* ed7b */ NULL, +/* ed7c */ NULL, +/* ed7d */ NULL, +/* ed7e */ NULL, +/* ed7f */ NULL, +/* ed80 */ NULL, +/* ed81 */ NULL, +/* ed82 */ NULL, +/* ed83 */ NULL, +/* ed84 */ NULL, +/* ed85 */ NULL, +/* ed86 */ NULL, +/* ed87 */ NULL, +/* ed88 */ NULL, +/* ed89 */ NULL, +/* ed8a */ NULL, +/* ed8b */ NULL, +/* ed8c */ NULL, +/* ed8d */ NULL, +/* ed8e */ NULL, +/* ed8f */ NULL, +/* ed90 */ NULL, +/* ed91 */ NULL, +/* ed92 */ NULL, +/* ed93 */ NULL, +/* ed94 */ NULL, +/* ed95 */ NULL, +/* ed96 */ NULL, +/* ed97 */ NULL, +/* ed98 */ NULL, +/* ed99 */ NULL, +/* ed9a */ NULL, +/* ed9b */ NULL, +/* ed9c */ NULL, +/* ed9d */ NULL, +/* ed9e */ NULL, +/* ed9f */ NULL, +/* eda0 */ NULL, +/* eda1 */ NULL, +/* eda2 */ NULL, +/* eda3 */ NULL, +/* eda4 */ NULL, +/* eda5 */ NULL, +/* eda6 */ NULL, +/* eda7 */ NULL, +/* eda8 */ NULL, +/* eda9 */ NULL, +/* edaa */ NULL, +/* edab */ NULL, +/* edac */ NULL, +/* edad */ NULL, +/* edae */ NULL, +/* edaf */ NULL, +/* edb0 */ NULL, +/* edb1 */ NULL, +/* edb2 */ NULL, +/* edb3 */ NULL, +/* edb4 */ NULL, +/* edb5 */ NULL, +/* edb6 */ NULL, +/* edb7 */ NULL, +/* edb8 */ NULL, +/* edb9 */ NULL, +/* edba */ NULL, +/* edbb */ NULL, +/* edbc */ NULL, +/* edbd */ NULL, +/* edbe */ NULL, +/* edbf */ NULL, +/* edc0 */ NULL, +/* edc1 */ NULL, +/* edc2 */ NULL, +/* edc3 */ NULL, +/* edc4 */ NULL, +/* edc5 */ NULL, +/* edc6 */ NULL, +/* edc7 */ NULL, +/* edc8 */ NULL, +/* edc9 */ NULL, +/* edca */ NULL, +/* edcb */ NULL, +/* edcc */ NULL, +/* edcd */ NULL, +/* edce */ NULL, +/* edcf */ NULL, +/* edd0 */ NULL, +/* edd1 */ NULL, +/* edd2 */ NULL, +/* edd3 */ NULL, +/* edd4 */ NULL, +/* edd5 */ NULL, +/* edd6 */ NULL, +/* edd7 */ NULL, +/* edd8 */ NULL, +/* edd9 */ NULL, +/* edda */ NULL, +/* eddb */ NULL, +/* eddc */ NULL, +/* eddd */ NULL, +/* edde */ NULL, +/* eddf */ NULL, +/* ede0 */ NULL, +/* ede1 */ NULL, +/* ede2 */ NULL, +/* ede3 */ NULL, +/* ede4 */ NULL, +/* ede5 */ NULL, +/* ede6 */ NULL, +/* ede7 */ NULL, +/* ede8 */ NULL, +/* ede9 */ NULL, +/* edea */ NULL, +/* edeb */ NULL, +/* edec */ NULL, +/* eded */ NULL, +/* edee */ NULL, +/* edef */ NULL, +/* edf0 */ NULL, +/* edf1 */ NULL, +/* edf2 */ NULL, +/* edf3 */ NULL, +/* edf4 */ NULL, +/* edf5 */ NULL, +/* edf6 */ NULL, +/* edf7 */ NULL, +/* edf8 */ NULL, +/* edf9 */ NULL, +/* edfa */ NULL, +/* edfb */ NULL, +/* edfc */ NULL, +/* edfd */ NULL, +/* edfe */ NULL, +/* edff */ NULL, +/* ee00 */ NULL, +/* ee01 */ NULL, +/* ee02 */ NULL, +/* ee03 */ NULL, +/* ee04 */ NULL, +/* ee05 */ NULL, +/* ee06 */ NULL, +/* ee07 */ NULL, +/* ee08 */ NULL, +/* ee09 */ NULL, +/* ee0a */ NULL, +/* ee0b */ NULL, +/* ee0c */ NULL, +/* ee0d */ NULL, +/* ee0e */ NULL, +/* ee0f */ NULL, +/* ee10 */ NULL, +/* ee11 */ NULL, +/* ee12 */ NULL, +/* ee13 */ NULL, +/* ee14 */ NULL, +/* ee15 */ NULL, +/* ee16 */ NULL, +/* ee17 */ NULL, +/* ee18 */ NULL, +/* ee19 */ NULL, +/* ee1a */ NULL, +/* ee1b */ NULL, +/* ee1c */ NULL, +/* ee1d */ NULL, +/* ee1e */ NULL, +/* ee1f */ NULL, +/* ee20 */ NULL, +/* ee21 */ NULL, +/* ee22 */ NULL, +/* ee23 */ NULL, +/* ee24 */ NULL, +/* ee25 */ NULL, +/* ee26 */ NULL, +/* ee27 */ NULL, +/* ee28 */ NULL, +/* ee29 */ NULL, +/* ee2a */ NULL, +/* ee2b */ NULL, +/* ee2c */ NULL, +/* ee2d */ NULL, +/* ee2e */ NULL, +/* ee2f */ NULL, +/* ee30 */ NULL, +/* ee31 */ NULL, +/* ee32 */ NULL, +/* ee33 */ NULL, +/* ee34 */ NULL, +/* ee35 */ NULL, +/* ee36 */ NULL, +/* ee37 */ NULL, +/* ee38 */ NULL, +/* ee39 */ NULL, +/* ee3a */ NULL, +/* ee3b */ NULL, +/* ee3c */ NULL, +/* ee3d */ NULL, +/* ee3e */ NULL, +/* ee3f */ NULL, +/* ee40 */ NULL, +/* ee41 */ NULL, +/* ee42 */ NULL, +/* ee43 */ NULL, +/* ee44 */ NULL, +/* ee45 */ NULL, +/* ee46 */ NULL, +/* ee47 */ NULL, +/* ee48 */ NULL, +/* ee49 */ NULL, +/* ee4a */ NULL, +/* ee4b */ NULL, +/* ee4c */ NULL, +/* ee4d */ NULL, +/* ee4e */ NULL, +/* ee4f */ NULL, +/* ee50 */ NULL, +/* ee51 */ NULL, +/* ee52 */ NULL, +/* ee53 */ NULL, +/* ee54 */ NULL, +/* ee55 */ NULL, +/* ee56 */ NULL, +/* ee57 */ NULL, +/* ee58 */ NULL, +/* ee59 */ NULL, +/* ee5a */ NULL, +/* ee5b */ NULL, +/* ee5c */ NULL, +/* ee5d */ NULL, +/* ee5e */ NULL, +/* ee5f */ NULL, +/* ee60 */ NULL, +/* ee61 */ NULL, +/* ee62 */ NULL, +/* ee63 */ NULL, +/* ee64 */ NULL, +/* ee65 */ NULL, +/* ee66 */ NULL, +/* ee67 */ NULL, +/* ee68 */ NULL, +/* ee69 */ NULL, +/* ee6a */ NULL, +/* ee6b */ NULL, +/* ee6c */ NULL, +/* ee6d */ NULL, +/* ee6e */ NULL, +/* ee6f */ NULL, +/* ee70 */ NULL, +/* ee71 */ NULL, +/* ee72 */ NULL, +/* ee73 */ NULL, +/* ee74 */ NULL, +/* ee75 */ NULL, +/* ee76 */ NULL, +/* ee77 */ NULL, +/* ee78 */ NULL, +/* ee79 */ NULL, +/* ee7a */ NULL, +/* ee7b */ NULL, +/* ee7c */ NULL, +/* ee7d */ NULL, +/* ee7e */ NULL, +/* ee7f */ NULL, +/* ee80 */ NULL, +/* ee81 */ NULL, +/* ee82 */ NULL, +/* ee83 */ NULL, +/* ee84 */ NULL, +/* ee85 */ NULL, +/* ee86 */ NULL, +/* ee87 */ NULL, +/* ee88 */ NULL, +/* ee89 */ NULL, +/* ee8a */ NULL, +/* ee8b */ NULL, +/* ee8c */ NULL, +/* ee8d */ NULL, +/* ee8e */ NULL, +/* ee8f */ NULL, +/* ee90 */ NULL, +/* ee91 */ NULL, +/* ee92 */ NULL, +/* ee93 */ NULL, +/* ee94 */ NULL, +/* ee95 */ NULL, +/* ee96 */ NULL, +/* ee97 */ NULL, +/* ee98 */ NULL, +/* ee99 */ NULL, +/* ee9a */ NULL, +/* ee9b */ NULL, +/* ee9c */ NULL, +/* ee9d */ NULL, +/* ee9e */ NULL, +/* ee9f */ NULL, +/* eea0 */ NULL, +/* eea1 */ NULL, +/* eea2 */ NULL, +/* eea3 */ NULL, +/* eea4 */ NULL, +/* eea5 */ NULL, +/* eea6 */ NULL, +/* eea7 */ NULL, +/* eea8 */ NULL, +/* eea9 */ NULL, +/* eeaa */ NULL, +/* eeab */ NULL, +/* eeac */ NULL, +/* eead */ NULL, +/* eeae */ NULL, +/* eeaf */ NULL, +/* eeb0 */ NULL, +/* eeb1 */ NULL, +/* eeb2 */ NULL, +/* eeb3 */ NULL, +/* eeb4 */ NULL, +/* eeb5 */ NULL, +/* eeb6 */ NULL, +/* eeb7 */ NULL, +/* eeb8 */ NULL, +/* eeb9 */ NULL, +/* eeba */ NULL, +/* eebb */ NULL, +/* eebc */ NULL, +/* eebd */ NULL, +/* eebe */ NULL, +/* eebf */ NULL, +/* eec0 */ NULL, +/* eec1 */ NULL, +/* eec2 */ NULL, +/* eec3 */ NULL, +/* eec4 */ NULL, +/* eec5 */ NULL, +/* eec6 */ NULL, +/* eec7 */ NULL, +/* eec8 */ NULL, +/* eec9 */ NULL, +/* eeca */ NULL, +/* eecb */ NULL, +/* eecc */ NULL, +/* eecd */ NULL, +/* eece */ NULL, +/* eecf */ NULL, +/* eed0 */ NULL, +/* eed1 */ NULL, +/* eed2 */ NULL, +/* eed3 */ NULL, +/* eed4 */ NULL, +/* eed5 */ NULL, +/* eed6 */ NULL, +/* eed7 */ NULL, +/* eed8 */ NULL, +/* eed9 */ NULL, +/* eeda */ NULL, +/* eedb */ NULL, +/* eedc */ NULL, +/* eedd */ NULL, +/* eede */ NULL, +/* eedf */ NULL, +/* eee0 */ NULL, +/* eee1 */ NULL, +/* eee2 */ NULL, +/* eee3 */ NULL, +/* eee4 */ NULL, +/* eee5 */ NULL, +/* eee6 */ NULL, +/* eee7 */ NULL, +/* eee8 */ NULL, +/* eee9 */ NULL, +/* eeea */ NULL, +/* eeeb */ NULL, +/* eeec */ NULL, +/* eeed */ NULL, +/* eeee */ NULL, +/* eeef */ NULL, +/* eef0 */ NULL, +/* eef1 */ NULL, +/* eef2 */ NULL, +/* eef3 */ NULL, +/* eef4 */ NULL, +/* eef5 */ NULL, +/* eef6 */ NULL, +/* eef7 */ NULL, +/* eef8 */ NULL, +/* eef9 */ NULL, +/* eefa */ NULL, +/* eefb */ NULL, +/* eefc */ NULL, +/* eefd */ NULL, +/* eefe */ NULL, +/* eeff */ NULL, +/* ef00 */ NULL, +/* ef01 */ NULL, +/* ef02 */ NULL, +/* ef03 */ NULL, +/* ef04 */ NULL, +/* ef05 */ NULL, +/* ef06 */ NULL, +/* ef07 */ NULL, +/* ef08 */ NULL, +/* ef09 */ NULL, +/* ef0a */ NULL, +/* ef0b */ NULL, +/* ef0c */ NULL, +/* ef0d */ NULL, +/* ef0e */ NULL, +/* ef0f */ NULL, +/* ef10 */ NULL, +/* ef11 */ NULL, +/* ef12 */ NULL, +/* ef13 */ NULL, +/* ef14 */ NULL, +/* ef15 */ NULL, +/* ef16 */ NULL, +/* ef17 */ NULL, +/* ef18 */ NULL, +/* ef19 */ NULL, +/* ef1a */ NULL, +/* ef1b */ NULL, +/* ef1c */ NULL, +/* ef1d */ NULL, +/* ef1e */ NULL, +/* ef1f */ NULL, +/* ef20 */ NULL, +/* ef21 */ NULL, +/* ef22 */ NULL, +/* ef23 */ NULL, +/* ef24 */ NULL, +/* ef25 */ NULL, +/* ef26 */ NULL, +/* ef27 */ NULL, +/* ef28 */ NULL, +/* ef29 */ NULL, +/* ef2a */ NULL, +/* ef2b */ NULL, +/* ef2c */ NULL, +/* ef2d */ NULL, +/* ef2e */ NULL, +/* ef2f */ NULL, +/* ef30 */ NULL, +/* ef31 */ NULL, +/* ef32 */ NULL, +/* ef33 */ NULL, +/* ef34 */ NULL, +/* ef35 */ NULL, +/* ef36 */ NULL, +/* ef37 */ NULL, +/* ef38 */ NULL, +/* ef39 */ NULL, +/* ef3a */ NULL, +/* ef3b */ NULL, +/* ef3c */ NULL, +/* ef3d */ NULL, +/* ef3e */ NULL, +/* ef3f */ NULL, +/* ef40 */ NULL, +/* ef41 */ NULL, +/* ef42 */ NULL, +/* ef43 */ NULL, +/* ef44 */ NULL, +/* ef45 */ NULL, +/* ef46 */ NULL, +/* ef47 */ NULL, +/* ef48 */ NULL, +/* ef49 */ NULL, +/* ef4a */ NULL, +/* ef4b */ NULL, +/* ef4c */ NULL, +/* ef4d */ NULL, +/* ef4e */ NULL, +/* ef4f */ NULL, +/* ef50 */ NULL, +/* ef51 */ NULL, +/* ef52 */ NULL, +/* ef53 */ NULL, +/* ef54 */ NULL, +/* ef55 */ NULL, +/* ef56 */ NULL, +/* ef57 */ NULL, +/* ef58 */ NULL, +/* ef59 */ NULL, +/* ef5a */ NULL, +/* ef5b */ NULL, +/* ef5c */ NULL, +/* ef5d */ NULL, +/* ef5e */ NULL, +/* ef5f */ NULL, +/* ef60 */ NULL, +/* ef61 */ NULL, +/* ef62 */ NULL, +/* ef63 */ NULL, +/* ef64 */ NULL, +/* ef65 */ NULL, +/* ef66 */ NULL, +/* ef67 */ NULL, +/* ef68 */ NULL, +/* ef69 */ NULL, +/* ef6a */ NULL, +/* ef6b */ NULL, +/* ef6c */ NULL, +/* ef6d */ NULL, +/* ef6e */ NULL, +/* ef6f */ NULL, +/* ef70 */ NULL, +/* ef71 */ NULL, +/* ef72 */ NULL, +/* ef73 */ NULL, +/* ef74 */ NULL, +/* ef75 */ NULL, +/* ef76 */ NULL, +/* ef77 */ NULL, +/* ef78 */ NULL, +/* ef79 */ NULL, +/* ef7a */ NULL, +/* ef7b */ NULL, +/* ef7c */ NULL, +/* ef7d */ NULL, +/* ef7e */ NULL, +/* ef7f */ NULL, +/* ef80 */ NULL, +/* ef81 */ NULL, +/* ef82 */ NULL, +/* ef83 */ NULL, +/* ef84 */ NULL, +/* ef85 */ NULL, +/* ef86 */ NULL, +/* ef87 */ NULL, +/* ef88 */ NULL, +/* ef89 */ NULL, +/* ef8a */ NULL, +/* ef8b */ NULL, +/* ef8c */ NULL, +/* ef8d */ NULL, +/* ef8e */ NULL, +/* ef8f */ NULL, +/* ef90 */ NULL, +/* ef91 */ NULL, +/* ef92 */ NULL, +/* ef93 */ NULL, +/* ef94 */ NULL, +/* ef95 */ NULL, +/* ef96 */ NULL, +/* ef97 */ NULL, +/* ef98 */ NULL, +/* ef99 */ NULL, +/* ef9a */ NULL, +/* ef9b */ NULL, +/* ef9c */ NULL, +/* ef9d */ NULL, +/* ef9e */ NULL, +/* ef9f */ NULL, +/* efa0 */ NULL, +/* efa1 */ NULL, +/* efa2 */ NULL, +/* efa3 */ NULL, +/* efa4 */ NULL, +/* efa5 */ NULL, +/* efa6 */ NULL, +/* efa7 */ NULL, +/* efa8 */ NULL, +/* efa9 */ NULL, +/* efaa */ NULL, +/* efab */ NULL, +/* efac */ NULL, +/* efad */ NULL, +/* efae */ NULL, +/* efaf */ NULL, +/* efb0 */ NULL, +/* efb1 */ NULL, +/* efb2 */ NULL, +/* efb3 */ NULL, +/* efb4 */ NULL, +/* efb5 */ NULL, +/* efb6 */ NULL, +/* efb7 */ NULL, +/* efb8 */ NULL, +/* efb9 */ NULL, +/* efba */ NULL, +/* efbb */ NULL, +/* efbc */ NULL, +/* efbd */ NULL, +/* efbe */ NULL, +/* efbf */ NULL, +/* efc0 */ NULL, +/* efc1 */ NULL, +/* efc2 */ NULL, +/* efc3 */ NULL, +/* efc4 */ NULL, +/* efc5 */ NULL, +/* efc6 */ NULL, +/* efc7 */ NULL, +/* efc8 */ NULL, +/* efc9 */ NULL, +/* efca */ NULL, +/* efcb */ NULL, +/* efcc */ NULL, +/* efcd */ NULL, +/* efce */ NULL, +/* efcf */ NULL, +/* efd0 */ NULL, +/* efd1 */ NULL, +/* efd2 */ NULL, +/* efd3 */ NULL, +/* efd4 */ NULL, +/* efd5 */ NULL, +/* efd6 */ NULL, +/* efd7 */ NULL, +/* efd8 */ NULL, +/* efd9 */ NULL, +/* efda */ NULL, +/* efdb */ NULL, +/* efdc */ NULL, +/* efdd */ NULL, +/* efde */ NULL, +/* efdf */ NULL, +/* efe0 */ NULL, +/* efe1 */ NULL, +/* efe2 */ NULL, +/* efe3 */ NULL, +/* efe4 */ NULL, +/* efe5 */ NULL, +/* efe6 */ NULL, +/* efe7 */ NULL, +/* efe8 */ NULL, +/* efe9 */ NULL, +/* efea */ NULL, +/* efeb */ NULL, +/* efec */ NULL, +/* efed */ NULL, +/* efee */ NULL, +/* efef */ NULL, +/* eff0 */ NULL, +/* eff1 */ NULL, +/* eff2 */ NULL, +/* eff3 */ NULL, +/* eff4 */ NULL, +/* eff5 */ NULL, +/* eff6 */ NULL, +/* eff7 */ NULL, +/* eff8 */ NULL, +/* eff9 */ NULL, +/* effa */ NULL, +/* effb */ NULL, +/* effc */ NULL, +/* effd */ NULL, +/* effe */ NULL, +/* efff */ NULL, +/* f000 */ NULL, +/* f001 */ NULL, +/* f002 */ NULL, +/* f003 */ NULL, +/* f004 */ NULL, +/* f005 */ NULL, +/* f006 */ NULL, +/* f007 */ NULL, +/* f008 */ NULL, +/* f009 */ NULL, +/* f00a */ NULL, +/* f00b */ NULL, +/* f00c */ NULL, +/* f00d */ NULL, +/* f00e */ NULL, +/* f00f */ NULL, +/* f010 */ NULL, +/* f011 */ NULL, +/* f012 */ NULL, +/* f013 */ NULL, +/* f014 */ NULL, +/* f015 */ NULL, +/* f016 */ NULL, +/* f017 */ NULL, +/* f018 */ NULL, +/* f019 */ NULL, +/* f01a */ NULL, +/* f01b */ NULL, +/* f01c */ NULL, +/* f01d */ NULL, +/* f01e */ NULL, +/* f01f */ NULL, +/* f020 */ NULL, +/* f021 */ NULL, +/* f022 */ NULL, +/* f023 */ NULL, +/* f024 */ NULL, +/* f025 */ NULL, +/* f026 */ NULL, +/* f027 */ NULL, +/* f028 */ NULL, +/* f029 */ NULL, +/* f02a */ NULL, +/* f02b */ NULL, +/* f02c */ NULL, +/* f02d */ NULL, +/* f02e */ NULL, +/* f02f */ NULL, +/* f030 */ NULL, +/* f031 */ NULL, +/* f032 */ NULL, +/* f033 */ NULL, +/* f034 */ NULL, +/* f035 */ NULL, +/* f036 */ NULL, +/* f037 */ NULL, +/* f038 */ NULL, +/* f039 */ NULL, +/* f03a */ NULL, +/* f03b */ NULL, +/* f03c */ NULL, +/* f03d */ NULL, +/* f03e */ NULL, +/* f03f */ NULL, +/* f040 */ NULL, +/* f041 */ NULL, +/* f042 */ NULL, +/* f043 */ NULL, +/* f044 */ NULL, +/* f045 */ NULL, +/* f046 */ NULL, +/* f047 */ NULL, +/* f048 */ NULL, +/* f049 */ NULL, +/* f04a */ NULL, +/* f04b */ NULL, +/* f04c */ NULL, +/* f04d */ NULL, +/* f04e */ NULL, +/* f04f */ NULL, +/* f050 */ NULL, +/* f051 */ NULL, +/* f052 */ NULL, +/* f053 */ NULL, +/* f054 */ NULL, +/* f055 */ NULL, +/* f056 */ NULL, +/* f057 */ NULL, +/* f058 */ NULL, +/* f059 */ NULL, +/* f05a */ NULL, +/* f05b */ NULL, +/* f05c */ NULL, +/* f05d */ NULL, +/* f05e */ NULL, +/* f05f */ NULL, +/* f060 */ NULL, +/* f061 */ NULL, +/* f062 */ NULL, +/* f063 */ NULL, +/* f064 */ NULL, +/* f065 */ NULL, +/* f066 */ NULL, +/* f067 */ NULL, +/* f068 */ NULL, +/* f069 */ NULL, +/* f06a */ NULL, +/* f06b */ NULL, +/* f06c */ NULL, +/* f06d */ NULL, +/* f06e */ NULL, +/* f06f */ NULL, +/* f070 */ NULL, +/* f071 */ NULL, +/* f072 */ NULL, +/* f073 */ NULL, +/* f074 */ NULL, +/* f075 */ NULL, +/* f076 */ NULL, +/* f077 */ NULL, +/* f078 */ NULL, +/* f079 */ NULL, +/* f07a */ NULL, +/* f07b */ NULL, +/* f07c */ NULL, +/* f07d */ NULL, +/* f07e */ NULL, +/* f07f */ NULL, +/* f080 */ NULL, +/* f081 */ NULL, +/* f082 */ NULL, +/* f083 */ NULL, +/* f084 */ NULL, +/* f085 */ NULL, +/* f086 */ NULL, +/* f087 */ NULL, +/* f088 */ NULL, +/* f089 */ NULL, +/* f08a */ NULL, +/* f08b */ NULL, +/* f08c */ NULL, +/* f08d */ NULL, +/* f08e */ NULL, +/* f08f */ NULL, +/* f090 */ NULL, +/* f091 */ NULL, +/* f092 */ NULL, +/* f093 */ NULL, +/* f094 */ NULL, +/* f095 */ NULL, +/* f096 */ NULL, +/* f097 */ NULL, +/* f098 */ NULL, +/* f099 */ NULL, +/* f09a */ NULL, +/* f09b */ NULL, +/* f09c */ NULL, +/* f09d */ NULL, +/* f09e */ NULL, +/* f09f */ NULL, +/* f0a0 */ NULL, +/* f0a1 */ NULL, +/* f0a2 */ NULL, +/* f0a3 */ NULL, +/* f0a4 */ NULL, +/* f0a5 */ NULL, +/* f0a6 */ NULL, +/* f0a7 */ NULL, +/* f0a8 */ NULL, +/* f0a9 */ NULL, +/* f0aa */ NULL, +/* f0ab */ NULL, +/* f0ac */ NULL, +/* f0ad */ NULL, +/* f0ae */ NULL, +/* f0af */ NULL, +/* f0b0 */ NULL, +/* f0b1 */ NULL, +/* f0b2 */ NULL, +/* f0b3 */ NULL, +/* f0b4 */ NULL, +/* f0b5 */ NULL, +/* f0b6 */ NULL, +/* f0b7 */ NULL, +/* f0b8 */ NULL, +/* f0b9 */ NULL, +/* f0ba */ NULL, +/* f0bb */ NULL, +/* f0bc */ NULL, +/* f0bd */ NULL, +/* f0be */ NULL, +/* f0bf */ NULL, +/* f0c0 */ NULL, +/* f0c1 */ NULL, +/* f0c2 */ NULL, +/* f0c3 */ NULL, +/* f0c4 */ NULL, +/* f0c5 */ NULL, +/* f0c6 */ NULL, +/* f0c7 */ NULL, +/* f0c8 */ NULL, +/* f0c9 */ NULL, +/* f0ca */ NULL, +/* f0cb */ NULL, +/* f0cc */ NULL, +/* f0cd */ NULL, +/* f0ce */ NULL, +/* f0cf */ NULL, +/* f0d0 */ NULL, +/* f0d1 */ NULL, +/* f0d2 */ NULL, +/* f0d3 */ NULL, +/* f0d4 */ NULL, +/* f0d5 */ NULL, +/* f0d6 */ NULL, +/* f0d7 */ NULL, +/* f0d8 */ NULL, +/* f0d9 */ NULL, +/* f0da */ NULL, +/* f0db */ NULL, +/* f0dc */ NULL, +/* f0dd */ NULL, +/* f0de */ NULL, +/* f0df */ NULL, +/* f0e0 */ NULL, +/* f0e1 */ NULL, +/* f0e2 */ NULL, +/* f0e3 */ NULL, +/* f0e4 */ NULL, +/* f0e5 */ NULL, +/* f0e6 */ NULL, +/* f0e7 */ NULL, +/* f0e8 */ NULL, +/* f0e9 */ NULL, +/* f0ea */ NULL, +/* f0eb */ NULL, +/* f0ec */ NULL, +/* f0ed */ NULL, +/* f0ee */ NULL, +/* f0ef */ NULL, +/* f0f0 */ NULL, +/* f0f1 */ NULL, +/* f0f2 */ NULL, +/* f0f3 */ NULL, +/* f0f4 */ NULL, +/* f0f5 */ NULL, +/* f0f6 */ NULL, +/* f0f7 */ NULL, +/* f0f8 */ NULL, +/* f0f9 */ NULL, +/* f0fa */ NULL, +/* f0fb */ NULL, +/* f0fc */ NULL, +/* f0fd */ NULL, +/* f0fe */ NULL, +/* f0ff */ NULL, +/* f100 */ NULL, +/* f101 */ NULL, +/* f102 */ NULL, +/* f103 */ NULL, +/* f104 */ NULL, +/* f105 */ NULL, +/* f106 */ NULL, +/* f107 */ NULL, +/* f108 */ NULL, +/* f109 */ NULL, +/* f10a */ NULL, +/* f10b */ NULL, +/* f10c */ NULL, +/* f10d */ NULL, +/* f10e */ NULL, +/* f10f */ NULL, +/* f110 */ NULL, +/* f111 */ NULL, +/* f112 */ NULL, +/* f113 */ NULL, +/* f114 */ NULL, +/* f115 */ NULL, +/* f116 */ NULL, +/* f117 */ NULL, +/* f118 */ NULL, +/* f119 */ NULL, +/* f11a */ NULL, +/* f11b */ NULL, +/* f11c */ NULL, +/* f11d */ NULL, +/* f11e */ NULL, +/* f11f */ NULL, +/* f120 */ NULL, +/* f121 */ NULL, +/* f122 */ NULL, +/* f123 */ NULL, +/* f124 */ NULL, +/* f125 */ NULL, +/* f126 */ NULL, +/* f127 */ NULL, +/* f128 */ NULL, +/* f129 */ NULL, +/* f12a */ NULL, +/* f12b */ NULL, +/* f12c */ NULL, +/* f12d */ NULL, +/* f12e */ NULL, +/* f12f */ NULL, +/* f130 */ NULL, +/* f131 */ NULL, +/* f132 */ NULL, +/* f133 */ NULL, +/* f134 */ NULL, +/* f135 */ NULL, +/* f136 */ NULL, +/* f137 */ NULL, +/* f138 */ NULL, +/* f139 */ NULL, +/* f13a */ NULL, +/* f13b */ NULL, +/* f13c */ NULL, +/* f13d */ NULL, +/* f13e */ NULL, +/* f13f */ NULL, +/* f140 */ NULL, +/* f141 */ NULL, +/* f142 */ NULL, +/* f143 */ NULL, +/* f144 */ NULL, +/* f145 */ NULL, +/* f146 */ NULL, +/* f147 */ NULL, +/* f148 */ NULL, +/* f149 */ NULL, +/* f14a */ NULL, +/* f14b */ NULL, +/* f14c */ NULL, +/* f14d */ NULL, +/* f14e */ NULL, +/* f14f */ NULL, +/* f150 */ NULL, +/* f151 */ NULL, +/* f152 */ NULL, +/* f153 */ NULL, +/* f154 */ NULL, +/* f155 */ NULL, +/* f156 */ NULL, +/* f157 */ NULL, +/* f158 */ NULL, +/* f159 */ NULL, +/* f15a */ NULL, +/* f15b */ NULL, +/* f15c */ NULL, +/* f15d */ NULL, +/* f15e */ NULL, +/* f15f */ NULL, +/* f160 */ NULL, +/* f161 */ NULL, +/* f162 */ NULL, +/* f163 */ NULL, +/* f164 */ NULL, +/* f165 */ NULL, +/* f166 */ NULL, +/* f167 */ NULL, +/* f168 */ NULL, +/* f169 */ NULL, +/* f16a */ NULL, +/* f16b */ NULL, +/* f16c */ NULL, +/* f16d */ NULL, +/* f16e */ NULL, +/* f16f */ NULL, +/* f170 */ NULL, +/* f171 */ NULL, +/* f172 */ NULL, +/* f173 */ NULL, +/* f174 */ NULL, +/* f175 */ NULL, +/* f176 */ NULL, +/* f177 */ NULL, +/* f178 */ NULL, +/* f179 */ NULL, +/* f17a */ NULL, +/* f17b */ NULL, +/* f17c */ NULL, +/* f17d */ NULL, +/* f17e */ NULL, +/* f17f */ NULL, +/* f180 */ NULL, +/* f181 */ NULL, +/* f182 */ NULL, +/* f183 */ NULL, +/* f184 */ NULL, +/* f185 */ NULL, +/* f186 */ NULL, +/* f187 */ NULL, +/* f188 */ NULL, +/* f189 */ NULL, +/* f18a */ NULL, +/* f18b */ NULL, +/* f18c */ NULL, +/* f18d */ NULL, +/* f18e */ NULL, +/* f18f */ NULL, +/* f190 */ NULL, +/* f191 */ NULL, +/* f192 */ NULL, +/* f193 */ NULL, +/* f194 */ NULL, +/* f195 */ NULL, +/* f196 */ NULL, +/* f197 */ NULL, +/* f198 */ NULL, +/* f199 */ NULL, +/* f19a */ NULL, +/* f19b */ NULL, +/* f19c */ NULL, +/* f19d */ NULL, +/* f19e */ NULL, +/* f19f */ NULL, +/* f1a0 */ NULL, +/* f1a1 */ NULL, +/* f1a2 */ NULL, +/* f1a3 */ NULL, +/* f1a4 */ NULL, +/* f1a5 */ NULL, +/* f1a6 */ NULL, +/* f1a7 */ NULL, +/* f1a8 */ NULL, +/* f1a9 */ NULL, +/* f1aa */ NULL, +/* f1ab */ NULL, +/* f1ac */ NULL, +/* f1ad */ NULL, +/* f1ae */ NULL, +/* f1af */ NULL, +/* f1b0 */ NULL, +/* f1b1 */ NULL, +/* f1b2 */ NULL, +/* f1b3 */ NULL, +/* f1b4 */ NULL, +/* f1b5 */ NULL, +/* f1b6 */ NULL, +/* f1b7 */ NULL, +/* f1b8 */ NULL, +/* f1b9 */ NULL, +/* f1ba */ NULL, +/* f1bb */ NULL, +/* f1bc */ NULL, +/* f1bd */ NULL, +/* f1be */ NULL, +/* f1bf */ NULL, +/* f1c0 */ NULL, +/* f1c1 */ NULL, +/* f1c2 */ NULL, +/* f1c3 */ NULL, +/* f1c4 */ NULL, +/* f1c5 */ NULL, +/* f1c6 */ NULL, +/* f1c7 */ NULL, +/* f1c8 */ NULL, +/* f1c9 */ NULL, +/* f1ca */ NULL, +/* f1cb */ NULL, +/* f1cc */ NULL, +/* f1cd */ NULL, +/* f1ce */ NULL, +/* f1cf */ NULL, +/* f1d0 */ NULL, +/* f1d1 */ NULL, +/* f1d2 */ NULL, +/* f1d3 */ NULL, +/* f1d4 */ NULL, +/* f1d5 */ NULL, +/* f1d6 */ NULL, +/* f1d7 */ NULL, +/* f1d8 */ NULL, +/* f1d9 */ NULL, +/* f1da */ NULL, +/* f1db */ NULL, +/* f1dc */ NULL, +/* f1dd */ NULL, +/* f1de */ NULL, +/* f1df */ NULL, +/* f1e0 */ NULL, +/* f1e1 */ NULL, +/* f1e2 */ NULL, +/* f1e3 */ NULL, +/* f1e4 */ NULL, +/* f1e5 */ NULL, +/* f1e6 */ NULL, +/* f1e7 */ NULL, +/* f1e8 */ NULL, +/* f1e9 */ NULL, +/* f1ea */ NULL, +/* f1eb */ NULL, +/* f1ec */ NULL, +/* f1ed */ NULL, +/* f1ee */ NULL, +/* f1ef */ NULL, +/* f1f0 */ NULL, +/* f1f1 */ NULL, +/* f1f2 */ NULL, +/* f1f3 */ NULL, +/* f1f4 */ NULL, +/* f1f5 */ NULL, +/* f1f6 */ NULL, +/* f1f7 */ NULL, +/* f1f8 */ NULL, +/* f1f9 */ NULL, +/* f1fa */ NULL, +/* f1fb */ NULL, +/* f1fc */ NULL, +/* f1fd */ NULL, +/* f1fe */ NULL, +/* f1ff */ NULL, +/* f200 */ NULL, +/* f201 */ NULL, +/* f202 */ NULL, +/* f203 */ NULL, +/* f204 */ NULL, +/* f205 */ NULL, +/* f206 */ NULL, +/* f207 */ NULL, +/* f208 */ NULL, +/* f209 */ NULL, +/* f20a */ NULL, +/* f20b */ NULL, +/* f20c */ NULL, +/* f20d */ NULL, +/* f20e */ NULL, +/* f20f */ NULL, +/* f210 */ NULL, +/* f211 */ NULL, +/* f212 */ NULL, +/* f213 */ NULL, +/* f214 */ NULL, +/* f215 */ NULL, +/* f216 */ NULL, +/* f217 */ NULL, +/* f218 */ NULL, +/* f219 */ NULL, +/* f21a */ NULL, +/* f21b */ NULL, +/* f21c */ NULL, +/* f21d */ NULL, +/* f21e */ NULL, +/* f21f */ NULL, +/* f220 */ NULL, +/* f221 */ NULL, +/* f222 */ NULL, +/* f223 */ NULL, +/* f224 */ NULL, +/* f225 */ NULL, +/* f226 */ NULL, +/* f227 */ NULL, +/* f228 */ NULL, +/* f229 */ NULL, +/* f22a */ NULL, +/* f22b */ NULL, +/* f22c */ NULL, +/* f22d */ NULL, +/* f22e */ NULL, +/* f22f */ NULL, +/* f230 */ NULL, +/* f231 */ NULL, +/* f232 */ NULL, +/* f233 */ NULL, +/* f234 */ NULL, +/* f235 */ NULL, +/* f236 */ NULL, +/* f237 */ NULL, +/* f238 */ NULL, +/* f239 */ NULL, +/* f23a */ NULL, +/* f23b */ NULL, +/* f23c */ NULL, +/* f23d */ NULL, +/* f23e */ NULL, +/* f23f */ NULL, +/* f240 */ NULL, +/* f241 */ NULL, +/* f242 */ NULL, +/* f243 */ NULL, +/* f244 */ NULL, +/* f245 */ NULL, +/* f246 */ NULL, +/* f247 */ NULL, +/* f248 */ NULL, +/* f249 */ NULL, +/* f24a */ NULL, +/* f24b */ NULL, +/* f24c */ NULL, +/* f24d */ NULL, +/* f24e */ NULL, +/* f24f */ NULL, +/* f250 */ NULL, +/* f251 */ NULL, +/* f252 */ NULL, +/* f253 */ NULL, +/* f254 */ NULL, +/* f255 */ NULL, +/* f256 */ NULL, +/* f257 */ NULL, +/* f258 */ NULL, +/* f259 */ NULL, +/* f25a */ NULL, +/* f25b */ NULL, +/* f25c */ NULL, +/* f25d */ NULL, +/* f25e */ NULL, +/* f25f */ NULL, +/* f260 */ NULL, +/* f261 */ NULL, +/* f262 */ NULL, +/* f263 */ NULL, +/* f264 */ NULL, +/* f265 */ NULL, +/* f266 */ NULL, +/* f267 */ NULL, +/* f268 */ NULL, +/* f269 */ NULL, +/* f26a */ NULL, +/* f26b */ NULL, +/* f26c */ NULL, +/* f26d */ NULL, +/* f26e */ NULL, +/* f26f */ NULL, +/* f270 */ NULL, +/* f271 */ NULL, +/* f272 */ NULL, +/* f273 */ NULL, +/* f274 */ NULL, +/* f275 */ NULL, +/* f276 */ NULL, +/* f277 */ NULL, +/* f278 */ NULL, +/* f279 */ NULL, +/* f27a */ NULL, +/* f27b */ NULL, +/* f27c */ NULL, +/* f27d */ NULL, +/* f27e */ NULL, +/* f27f */ NULL, +/* f280 */ NULL, +/* f281 */ NULL, +/* f282 */ NULL, +/* f283 */ NULL, +/* f284 */ NULL, +/* f285 */ NULL, +/* f286 */ NULL, +/* f287 */ NULL, +/* f288 */ NULL, +/* f289 */ NULL, +/* f28a */ NULL, +/* f28b */ NULL, +/* f28c */ NULL, +/* f28d */ NULL, +/* f28e */ NULL, +/* f28f */ NULL, +/* f290 */ NULL, +/* f291 */ NULL, +/* f292 */ NULL, +/* f293 */ NULL, +/* f294 */ NULL, +/* f295 */ NULL, +/* f296 */ NULL, +/* f297 */ NULL, +/* f298 */ NULL, +/* f299 */ NULL, +/* f29a */ NULL, +/* f29b */ NULL, +/* f29c */ NULL, +/* f29d */ NULL, +/* f29e */ NULL, +/* f29f */ NULL, +/* f2a0 */ NULL, +/* f2a1 */ NULL, +/* f2a2 */ NULL, +/* f2a3 */ NULL, +/* f2a4 */ NULL, +/* f2a5 */ NULL, +/* f2a6 */ NULL, +/* f2a7 */ NULL, +/* f2a8 */ NULL, +/* f2a9 */ NULL, +/* f2aa */ NULL, +/* f2ab */ NULL, +/* f2ac */ NULL, +/* f2ad */ NULL, +/* f2ae */ NULL, +/* f2af */ NULL, +/* f2b0 */ NULL, +/* f2b1 */ NULL, +/* f2b2 */ NULL, +/* f2b3 */ NULL, +/* f2b4 */ NULL, +/* f2b5 */ NULL, +/* f2b6 */ NULL, +/* f2b7 */ NULL, +/* f2b8 */ NULL, +/* f2b9 */ NULL, +/* f2ba */ NULL, +/* f2bb */ NULL, +/* f2bc */ NULL, +/* f2bd */ NULL, +/* f2be */ NULL, +/* f2bf */ NULL, +/* f2c0 */ NULL, +/* f2c1 */ NULL, +/* f2c2 */ NULL, +/* f2c3 */ NULL, +/* f2c4 */ NULL, +/* f2c5 */ NULL, +/* f2c6 */ NULL, +/* f2c7 */ NULL, +/* f2c8 */ NULL, +/* f2c9 */ NULL, +/* f2ca */ NULL, +/* f2cb */ NULL, +/* f2cc */ NULL, +/* f2cd */ NULL, +/* f2ce */ NULL, +/* f2cf */ NULL, +/* f2d0 */ NULL, +/* f2d1 */ NULL, +/* f2d2 */ NULL, +/* f2d3 */ NULL, +/* f2d4 */ NULL, +/* f2d5 */ NULL, +/* f2d6 */ NULL, +/* f2d7 */ NULL, +/* f2d8 */ NULL, +/* f2d9 */ NULL, +/* f2da */ NULL, +/* f2db */ NULL, +/* f2dc */ NULL, +/* f2dd */ NULL, +/* f2de */ NULL, +/* f2df */ NULL, +/* f2e0 */ NULL, +/* f2e1 */ NULL, +/* f2e2 */ NULL, +/* f2e3 */ NULL, +/* f2e4 */ NULL, +/* f2e5 */ NULL, +/* f2e6 */ NULL, +/* f2e7 */ NULL, +/* f2e8 */ NULL, +/* f2e9 */ NULL, +/* f2ea */ NULL, +/* f2eb */ NULL, +/* f2ec */ NULL, +/* f2ed */ NULL, +/* f2ee */ NULL, +/* f2ef */ NULL, +/* f2f0 */ NULL, +/* f2f1 */ NULL, +/* f2f2 */ NULL, +/* f2f3 */ NULL, +/* f2f4 */ NULL, +/* f2f5 */ NULL, +/* f2f6 */ NULL, +/* f2f7 */ NULL, +/* f2f8 */ NULL, +/* f2f9 */ NULL, +/* f2fa */ NULL, +/* f2fb */ NULL, +/* f2fc */ NULL, +/* f2fd */ NULL, +/* f2fe */ NULL, +/* f2ff */ NULL, +/* f300 */ NULL, +/* f301 */ NULL, +/* f302 */ NULL, +/* f303 */ NULL, +/* f304 */ NULL, +/* f305 */ NULL, +/* f306 */ NULL, +/* f307 */ NULL, +/* f308 */ NULL, +/* f309 */ NULL, +/* f30a */ NULL, +/* f30b */ NULL, +/* f30c */ NULL, +/* f30d */ NULL, +/* f30e */ NULL, +/* f30f */ NULL, +/* f310 */ NULL, +/* f311 */ NULL, +/* f312 */ NULL, +/* f313 */ NULL, +/* f314 */ NULL, +/* f315 */ NULL, +/* f316 */ NULL, +/* f317 */ NULL, +/* f318 */ NULL, +/* f319 */ NULL, +/* f31a */ NULL, +/* f31b */ NULL, +/* f31c */ NULL, +/* f31d */ NULL, +/* f31e */ NULL, +/* f31f */ NULL, +/* f320 */ NULL, +/* f321 */ NULL, +/* f322 */ NULL, +/* f323 */ NULL, +/* f324 */ NULL, +/* f325 */ NULL, +/* f326 */ NULL, +/* f327 */ NULL, +/* f328 */ NULL, +/* f329 */ NULL, +/* f32a */ NULL, +/* f32b */ NULL, +/* f32c */ NULL, +/* f32d */ NULL, +/* f32e */ NULL, +/* f32f */ NULL, +/* f330 */ NULL, +/* f331 */ NULL, +/* f332 */ NULL, +/* f333 */ NULL, +/* f334 */ NULL, +/* f335 */ NULL, +/* f336 */ NULL, +/* f337 */ NULL, +/* f338 */ NULL, +/* f339 */ NULL, +/* f33a */ NULL, +/* f33b */ NULL, +/* f33c */ NULL, +/* f33d */ NULL, +/* f33e */ NULL, +/* f33f */ NULL, +/* f340 */ NULL, +/* f341 */ NULL, +/* f342 */ NULL, +/* f343 */ NULL, +/* f344 */ NULL, +/* f345 */ NULL, +/* f346 */ NULL, +/* f347 */ NULL, +/* f348 */ NULL, +/* f349 */ NULL, +/* f34a */ NULL, +/* f34b */ NULL, +/* f34c */ NULL, +/* f34d */ NULL, +/* f34e */ NULL, +/* f34f */ NULL, +/* f350 */ NULL, +/* f351 */ NULL, +/* f352 */ NULL, +/* f353 */ NULL, +/* f354 */ NULL, +/* f355 */ NULL, +/* f356 */ NULL, +/* f357 */ NULL, +/* f358 */ NULL, +/* f359 */ NULL, +/* f35a */ NULL, +/* f35b */ NULL, +/* f35c */ NULL, +/* f35d */ NULL, +/* f35e */ NULL, +/* f35f */ NULL, +/* f360 */ NULL, +/* f361 */ NULL, +/* f362 */ NULL, +/* f363 */ NULL, +/* f364 */ NULL, +/* f365 */ NULL, +/* f366 */ NULL, +/* f367 */ NULL, +/* f368 */ NULL, +/* f369 */ NULL, +/* f36a */ NULL, +/* f36b */ NULL, +/* f36c */ NULL, +/* f36d */ NULL, +/* f36e */ NULL, +/* f36f */ NULL, +/* f370 */ NULL, +/* f371 */ NULL, +/* f372 */ NULL, +/* f373 */ NULL, +/* f374 */ NULL, +/* f375 */ NULL, +/* f376 */ NULL, +/* f377 */ NULL, +/* f378 */ NULL, +/* f379 */ NULL, +/* f37a */ NULL, +/* f37b */ NULL, +/* f37c */ NULL, +/* f37d */ NULL, +/* f37e */ NULL, +/* f37f */ NULL, +/* f380 */ NULL, +/* f381 */ NULL, +/* f382 */ NULL, +/* f383 */ NULL, +/* f384 */ NULL, +/* f385 */ NULL, +/* f386 */ NULL, +/* f387 */ NULL, +/* f388 */ NULL, +/* f389 */ NULL, +/* f38a */ NULL, +/* f38b */ NULL, +/* f38c */ NULL, +/* f38d */ NULL, +/* f38e */ NULL, +/* f38f */ NULL, +/* f390 */ NULL, +/* f391 */ NULL, +/* f392 */ NULL, +/* f393 */ NULL, +/* f394 */ NULL, +/* f395 */ NULL, +/* f396 */ NULL, +/* f397 */ NULL, +/* f398 */ NULL, +/* f399 */ NULL, +/* f39a */ NULL, +/* f39b */ NULL, +/* f39c */ NULL, +/* f39d */ NULL, +/* f39e */ NULL, +/* f39f */ NULL, +/* f3a0 */ NULL, +/* f3a1 */ NULL, +/* f3a2 */ NULL, +/* f3a3 */ NULL, +/* f3a4 */ NULL, +/* f3a5 */ NULL, +/* f3a6 */ NULL, +/* f3a7 */ NULL, +/* f3a8 */ NULL, +/* f3a9 */ NULL, +/* f3aa */ NULL, +/* f3ab */ NULL, +/* f3ac */ NULL, +/* f3ad */ NULL, +/* f3ae */ NULL, +/* f3af */ NULL, +/* f3b0 */ NULL, +/* f3b1 */ NULL, +/* f3b2 */ NULL, +/* f3b3 */ NULL, +/* f3b4 */ NULL, +/* f3b5 */ NULL, +/* f3b6 */ NULL, +/* f3b7 */ NULL, +/* f3b8 */ NULL, +/* f3b9 */ NULL, +/* f3ba */ NULL, +/* f3bb */ NULL, +/* f3bc */ NULL, +/* f3bd */ NULL, +/* f3be */ NULL, +/* f3bf */ NULL, +/* f3c0 */ NULL, +/* f3c1 */ NULL, +/* f3c2 */ NULL, +/* f3c3 */ NULL, +/* f3c4 */ NULL, +/* f3c5 */ NULL, +/* f3c6 */ NULL, +/* f3c7 */ NULL, +/* f3c8 */ NULL, +/* f3c9 */ NULL, +/* f3ca */ NULL, +/* f3cb */ NULL, +/* f3cc */ NULL, +/* f3cd */ NULL, +/* f3ce */ NULL, +/* f3cf */ NULL, +/* f3d0 */ NULL, +/* f3d1 */ NULL, +/* f3d2 */ NULL, +/* f3d3 */ NULL, +/* f3d4 */ NULL, +/* f3d5 */ NULL, +/* f3d6 */ NULL, +/* f3d7 */ NULL, +/* f3d8 */ NULL, +/* f3d9 */ NULL, +/* f3da */ NULL, +/* f3db */ NULL, +/* f3dc */ NULL, +/* f3dd */ NULL, +/* f3de */ NULL, +/* f3df */ NULL, +/* f3e0 */ NULL, +/* f3e1 */ NULL, +/* f3e2 */ NULL, +/* f3e3 */ NULL, +/* f3e4 */ NULL, +/* f3e5 */ NULL, +/* f3e6 */ NULL, +/* f3e7 */ NULL, +/* f3e8 */ NULL, +/* f3e9 */ NULL, +/* f3ea */ NULL, +/* f3eb */ NULL, +/* f3ec */ NULL, +/* f3ed */ NULL, +/* f3ee */ NULL, +/* f3ef */ NULL, +/* f3f0 */ NULL, +/* f3f1 */ NULL, +/* f3f2 */ NULL, +/* f3f3 */ NULL, +/* f3f4 */ NULL, +/* f3f5 */ NULL, +/* f3f6 */ NULL, +/* f3f7 */ NULL, +/* f3f8 */ NULL, +/* f3f9 */ NULL, +/* f3fa */ NULL, +/* f3fb */ NULL, +/* f3fc */ NULL, +/* f3fd */ NULL, +/* f3fe */ NULL, +/* f3ff */ NULL, +/* f400 */ NULL, +/* f401 */ NULL, +/* f402 */ NULL, +/* f403 */ NULL, +/* f404 */ NULL, +/* f405 */ NULL, +/* f406 */ NULL, +/* f407 */ NULL, +/* f408 */ NULL, +/* f409 */ NULL, +/* f40a */ NULL, +/* f40b */ NULL, +/* f40c */ NULL, +/* f40d */ NULL, +/* f40e */ NULL, +/* f40f */ NULL, +/* f410 */ NULL, +/* f411 */ NULL, +/* f412 */ NULL, +/* f413 */ NULL, +/* f414 */ NULL, +/* f415 */ NULL, +/* f416 */ NULL, +/* f417 */ NULL, +/* f418 */ NULL, +/* f419 */ NULL, +/* f41a */ NULL, +/* f41b */ NULL, +/* f41c */ NULL, +/* f41d */ NULL, +/* f41e */ NULL, +/* f41f */ NULL, +/* f420 */ NULL, +/* f421 */ NULL, +/* f422 */ NULL, +/* f423 */ NULL, +/* f424 */ NULL, +/* f425 */ NULL, +/* f426 */ NULL, +/* f427 */ NULL, +/* f428 */ NULL, +/* f429 */ NULL, +/* f42a */ NULL, +/* f42b */ NULL, +/* f42c */ NULL, +/* f42d */ NULL, +/* f42e */ NULL, +/* f42f */ NULL, +/* f430 */ NULL, +/* f431 */ NULL, +/* f432 */ NULL, +/* f433 */ NULL, +/* f434 */ NULL, +/* f435 */ NULL, +/* f436 */ NULL, +/* f437 */ NULL, +/* f438 */ NULL, +/* f439 */ NULL, +/* f43a */ NULL, +/* f43b */ NULL, +/* f43c */ NULL, +/* f43d */ NULL, +/* f43e */ NULL, +/* f43f */ NULL, +/* f440 */ NULL, +/* f441 */ NULL, +/* f442 */ NULL, +/* f443 */ NULL, +/* f444 */ NULL, +/* f445 */ NULL, +/* f446 */ NULL, +/* f447 */ NULL, +/* f448 */ NULL, +/* f449 */ NULL, +/* f44a */ NULL, +/* f44b */ NULL, +/* f44c */ NULL, +/* f44d */ NULL, +/* f44e */ NULL, +/* f44f */ NULL, +/* f450 */ NULL, +/* f451 */ NULL, +/* f452 */ NULL, +/* f453 */ NULL, +/* f454 */ NULL, +/* f455 */ NULL, +/* f456 */ NULL, +/* f457 */ NULL, +/* f458 */ NULL, +/* f459 */ NULL, +/* f45a */ NULL, +/* f45b */ NULL, +/* f45c */ NULL, +/* f45d */ NULL, +/* f45e */ NULL, +/* f45f */ NULL, +/* f460 */ NULL, +/* f461 */ NULL, +/* f462 */ NULL, +/* f463 */ NULL, +/* f464 */ NULL, +/* f465 */ NULL, +/* f466 */ NULL, +/* f467 */ NULL, +/* f468 */ NULL, +/* f469 */ NULL, +/* f46a */ NULL, +/* f46b */ NULL, +/* f46c */ NULL, +/* f46d */ NULL, +/* f46e */ NULL, +/* f46f */ NULL, +/* f470 */ NULL, +/* f471 */ NULL, +/* f472 */ NULL, +/* f473 */ NULL, +/* f474 */ NULL, +/* f475 */ NULL, +/* f476 */ NULL, +/* f477 */ NULL, +/* f478 */ NULL, +/* f479 */ NULL, +/* f47a */ NULL, +/* f47b */ NULL, +/* f47c */ NULL, +/* f47d */ NULL, +/* f47e */ NULL, +/* f47f */ NULL, +/* f480 */ NULL, +/* f481 */ NULL, +/* f482 */ NULL, +/* f483 */ NULL, +/* f484 */ NULL, +/* f485 */ NULL, +/* f486 */ NULL, +/* f487 */ NULL, +/* f488 */ NULL, +/* f489 */ NULL, +/* f48a */ NULL, +/* f48b */ NULL, +/* f48c */ NULL, +/* f48d */ NULL, +/* f48e */ NULL, +/* f48f */ NULL, +/* f490 */ NULL, +/* f491 */ NULL, +/* f492 */ NULL, +/* f493 */ NULL, +/* f494 */ NULL, +/* f495 */ NULL, +/* f496 */ NULL, +/* f497 */ NULL, +/* f498 */ NULL, +/* f499 */ NULL, +/* f49a */ NULL, +/* f49b */ NULL, +/* f49c */ NULL, +/* f49d */ NULL, +/* f49e */ NULL, +/* f49f */ NULL, +/* f4a0 */ NULL, +/* f4a1 */ NULL, +/* f4a2 */ NULL, +/* f4a3 */ NULL, +/* f4a4 */ NULL, +/* f4a5 */ NULL, +/* f4a6 */ NULL, +/* f4a7 */ NULL, +/* f4a8 */ NULL, +/* f4a9 */ NULL, +/* f4aa */ NULL, +/* f4ab */ NULL, +/* f4ac */ NULL, +/* f4ad */ NULL, +/* f4ae */ NULL, +/* f4af */ NULL, +/* f4b0 */ NULL, +/* f4b1 */ NULL, +/* f4b2 */ NULL, +/* f4b3 */ NULL, +/* f4b4 */ NULL, +/* f4b5 */ NULL, +/* f4b6 */ NULL, +/* f4b7 */ NULL, +/* f4b8 */ NULL, +/* f4b9 */ NULL, +/* f4ba */ NULL, +/* f4bb */ NULL, +/* f4bc */ NULL, +/* f4bd */ NULL, +/* f4be */ NULL, +/* f4bf */ NULL, +/* f4c0 */ NULL, +/* f4c1 */ NULL, +/* f4c2 */ NULL, +/* f4c3 */ NULL, +/* f4c4 */ NULL, +/* f4c5 */ NULL, +/* f4c6 */ NULL, +/* f4c7 */ NULL, +/* f4c8 */ NULL, +/* f4c9 */ NULL, +/* f4ca */ NULL, +/* f4cb */ NULL, +/* f4cc */ NULL, +/* f4cd */ NULL, +/* f4ce */ NULL, +/* f4cf */ NULL, +/* f4d0 */ NULL, +/* f4d1 */ NULL, +/* f4d2 */ NULL, +/* f4d3 */ NULL, +/* f4d4 */ NULL, +/* f4d5 */ NULL, +/* f4d6 */ NULL, +/* f4d7 */ NULL, +/* f4d8 */ NULL, +/* f4d9 */ NULL, +/* f4da */ NULL, +/* f4db */ NULL, +/* f4dc */ NULL, +/* f4dd */ NULL, +/* f4de */ NULL, +/* f4df */ NULL, +/* f4e0 */ NULL, +/* f4e1 */ NULL, +/* f4e2 */ NULL, +/* f4e3 */ NULL, +/* f4e4 */ NULL, +/* f4e5 */ NULL, +/* f4e6 */ NULL, +/* f4e7 */ NULL, +/* f4e8 */ NULL, +/* f4e9 */ NULL, +/* f4ea */ NULL, +/* f4eb */ NULL, +/* f4ec */ NULL, +/* f4ed */ NULL, +/* f4ee */ NULL, +/* f4ef */ NULL, +/* f4f0 */ NULL, +/* f4f1 */ NULL, +/* f4f2 */ NULL, +/* f4f3 */ NULL, +/* f4f4 */ NULL, +/* f4f5 */ NULL, +/* f4f6 */ NULL, +/* f4f7 */ NULL, +/* f4f8 */ NULL, +/* f4f9 */ NULL, +/* f4fa */ NULL, +/* f4fb */ NULL, +/* f4fc */ NULL, +/* f4fd */ NULL, +/* f4fe */ NULL, +/* f4ff */ NULL, +/* f500 */ NULL, +/* f501 */ NULL, +/* f502 */ NULL, +/* f503 */ NULL, +/* f504 */ NULL, +/* f505 */ NULL, +/* f506 */ NULL, +/* f507 */ NULL, +/* f508 */ NULL, +/* f509 */ NULL, +/* f50a */ NULL, +/* f50b */ NULL, +/* f50c */ NULL, +/* f50d */ NULL, +/* f50e */ NULL, +/* f50f */ NULL, +/* f510 */ NULL, +/* f511 */ NULL, +/* f512 */ NULL, +/* f513 */ NULL, +/* f514 */ NULL, +/* f515 */ NULL, +/* f516 */ NULL, +/* f517 */ NULL, +/* f518 */ NULL, +/* f519 */ NULL, +/* f51a */ NULL, +/* f51b */ NULL, +/* f51c */ NULL, +/* f51d */ NULL, +/* f51e */ NULL, +/* f51f */ NULL, +/* f520 */ NULL, +/* f521 */ NULL, +/* f522 */ NULL, +/* f523 */ NULL, +/* f524 */ NULL, +/* f525 */ NULL, +/* f526 */ NULL, +/* f527 */ NULL, +/* f528 */ NULL, +/* f529 */ NULL, +/* f52a */ NULL, +/* f52b */ NULL, +/* f52c */ NULL, +/* f52d */ NULL, +/* f52e */ NULL, +/* f52f */ NULL, +/* f530 */ NULL, +/* f531 */ NULL, +/* f532 */ NULL, +/* f533 */ NULL, +/* f534 */ NULL, +/* f535 */ NULL, +/* f536 */ NULL, +/* f537 */ NULL, +/* f538 */ NULL, +/* f539 */ NULL, +/* f53a */ NULL, +/* f53b */ NULL, +/* f53c */ NULL, +/* f53d */ NULL, +/* f53e */ NULL, +/* f53f */ NULL, +/* f540 */ NULL, +/* f541 */ NULL, +/* f542 */ NULL, +/* f543 */ NULL, +/* f544 */ NULL, +/* f545 */ NULL, +/* f546 */ NULL, +/* f547 */ NULL, +/* f548 */ NULL, +/* f549 */ NULL, +/* f54a */ NULL, +/* f54b */ NULL, +/* f54c */ NULL, +/* f54d */ NULL, +/* f54e */ NULL, +/* f54f */ NULL, +/* f550 */ NULL, +/* f551 */ NULL, +/* f552 */ NULL, +/* f553 */ NULL, +/* f554 */ NULL, +/* f555 */ NULL, +/* f556 */ NULL, +/* f557 */ NULL, +/* f558 */ NULL, +/* f559 */ NULL, +/* f55a */ NULL, +/* f55b */ NULL, +/* f55c */ NULL, +/* f55d */ NULL, +/* f55e */ NULL, +/* f55f */ NULL, +/* f560 */ NULL, +/* f561 */ NULL, +/* f562 */ NULL, +/* f563 */ NULL, +/* f564 */ NULL, +/* f565 */ NULL, +/* f566 */ NULL, +/* f567 */ NULL, +/* f568 */ NULL, +/* f569 */ NULL, +/* f56a */ NULL, +/* f56b */ NULL, +/* f56c */ NULL, +/* f56d */ NULL, +/* f56e */ NULL, +/* f56f */ NULL, +/* f570 */ NULL, +/* f571 */ NULL, +/* f572 */ NULL, +/* f573 */ NULL, +/* f574 */ NULL, +/* f575 */ NULL, +/* f576 */ NULL, +/* f577 */ NULL, +/* f578 */ NULL, +/* f579 */ NULL, +/* f57a */ NULL, +/* f57b */ NULL, +/* f57c */ NULL, +/* f57d */ NULL, +/* f57e */ NULL, +/* f57f */ NULL, +/* f580 */ NULL, +/* f581 */ NULL, +/* f582 */ NULL, +/* f583 */ NULL, +/* f584 */ NULL, +/* f585 */ NULL, +/* f586 */ NULL, +/* f587 */ NULL, +/* f588 */ NULL, +/* f589 */ NULL, +/* f58a */ NULL, +/* f58b */ NULL, +/* f58c */ NULL, +/* f58d */ NULL, +/* f58e */ NULL, +/* f58f */ NULL, +/* f590 */ NULL, +/* f591 */ NULL, +/* f592 */ NULL, +/* f593 */ NULL, +/* f594 */ NULL, +/* f595 */ NULL, +/* f596 */ NULL, +/* f597 */ NULL, +/* f598 */ NULL, +/* f599 */ NULL, +/* f59a */ NULL, +/* f59b */ NULL, +/* f59c */ NULL, +/* f59d */ NULL, +/* f59e */ NULL, +/* f59f */ NULL, +/* f5a0 */ NULL, +/* f5a1 */ NULL, +/* f5a2 */ NULL, +/* f5a3 */ NULL, +/* f5a4 */ NULL, +/* f5a5 */ NULL, +/* f5a6 */ NULL, +/* f5a7 */ NULL, +/* f5a8 */ NULL, +/* f5a9 */ NULL, +/* f5aa */ NULL, +/* f5ab */ NULL, +/* f5ac */ NULL, +/* f5ad */ NULL, +/* f5ae */ NULL, +/* f5af */ NULL, +/* f5b0 */ NULL, +/* f5b1 */ NULL, +/* f5b2 */ NULL, +/* f5b3 */ NULL, +/* f5b4 */ NULL, +/* f5b5 */ NULL, +/* f5b6 */ NULL, +/* f5b7 */ NULL, +/* f5b8 */ NULL, +/* f5b9 */ NULL, +/* f5ba */ NULL, +/* f5bb */ NULL, +/* f5bc */ NULL, +/* f5bd */ NULL, +/* f5be */ NULL, +/* f5bf */ NULL, +/* f5c0 */ NULL, +/* f5c1 */ NULL, +/* f5c2 */ NULL, +/* f5c3 */ NULL, +/* f5c4 */ NULL, +/* f5c5 */ NULL, +/* f5c6 */ NULL, +/* f5c7 */ NULL, +/* f5c8 */ NULL, +/* f5c9 */ NULL, +/* f5ca */ NULL, +/* f5cb */ NULL, +/* f5cc */ NULL, +/* f5cd */ NULL, +/* f5ce */ NULL, +/* f5cf */ NULL, +/* f5d0 */ NULL, +/* f5d1 */ NULL, +/* f5d2 */ NULL, +/* f5d3 */ NULL, +/* f5d4 */ NULL, +/* f5d5 */ NULL, +/* f5d6 */ NULL, +/* f5d7 */ NULL, +/* f5d8 */ NULL, +/* f5d9 */ NULL, +/* f5da */ NULL, +/* f5db */ NULL, +/* f5dc */ NULL, +/* f5dd */ NULL, +/* f5de */ NULL, +/* f5df */ NULL, +/* f5e0 */ NULL, +/* f5e1 */ NULL, +/* f5e2 */ NULL, +/* f5e3 */ NULL, +/* f5e4 */ NULL, +/* f5e5 */ NULL, +/* f5e6 */ NULL, +/* f5e7 */ NULL, +/* f5e8 */ NULL, +/* f5e9 */ NULL, +/* f5ea */ NULL, +/* f5eb */ NULL, +/* f5ec */ NULL, +/* f5ed */ NULL, +/* f5ee */ NULL, +/* f5ef */ NULL, +/* f5f0 */ NULL, +/* f5f1 */ NULL, +/* f5f2 */ NULL, +/* f5f3 */ NULL, +/* f5f4 */ NULL, +/* f5f5 */ NULL, +/* f5f6 */ NULL, +/* f5f7 */ NULL, +/* f5f8 */ NULL, +/* f5f9 */ NULL, +/* f5fa */ NULL, +/* f5fb */ NULL, +/* f5fc */ NULL, +/* f5fd */ NULL, +/* f5fe */ NULL, +/* f5ff */ NULL, +/* f600 */ NULL, +/* f601 */ NULL, +/* f602 */ NULL, +/* f603 */ NULL, +/* f604 */ NULL, +/* f605 */ NULL, +/* f606 */ NULL, +/* f607 */ NULL, +/* f608 */ NULL, +/* f609 */ NULL, +/* f60a */ NULL, +/* f60b */ NULL, +/* f60c */ NULL, +/* f60d */ NULL, +/* f60e */ NULL, +/* f60f */ NULL, +/* f610 */ NULL, +/* f611 */ NULL, +/* f612 */ NULL, +/* f613 */ NULL, +/* f614 */ NULL, +/* f615 */ NULL, +/* f616 */ NULL, +/* f617 */ NULL, +/* f618 */ NULL, +/* f619 */ NULL, +/* f61a */ NULL, +/* f61b */ NULL, +/* f61c */ NULL, +/* f61d */ NULL, +/* f61e */ NULL, +/* f61f */ NULL, +/* f620 */ NULL, +/* f621 */ NULL, +/* f622 */ NULL, +/* f623 */ NULL, +/* f624 */ NULL, +/* f625 */ NULL, +/* f626 */ NULL, +/* f627 */ NULL, +/* f628 */ NULL, +/* f629 */ NULL, +/* f62a */ NULL, +/* f62b */ NULL, +/* f62c */ NULL, +/* f62d */ NULL, +/* f62e */ NULL, +/* f62f */ NULL, +/* f630 */ NULL, +/* f631 */ NULL, +/* f632 */ NULL, +/* f633 */ NULL, +/* f634 */ NULL, +/* f635 */ NULL, +/* f636 */ NULL, +/* f637 */ NULL, +/* f638 */ NULL, +/* f639 */ NULL, +/* f63a */ NULL, +/* f63b */ NULL, +/* f63c */ NULL, +/* f63d */ NULL, +/* f63e */ NULL, +/* f63f */ NULL, +/* f640 */ NULL, +/* f641 */ NULL, +/* f642 */ NULL, +/* f643 */ NULL, +/* f644 */ NULL, +/* f645 */ NULL, +/* f646 */ NULL, +/* f647 */ NULL, +/* f648 */ NULL, +/* f649 */ NULL, +/* f64a */ NULL, +/* f64b */ NULL, +/* f64c */ NULL, +/* f64d */ NULL, +/* f64e */ NULL, +/* f64f */ NULL, +/* f650 */ NULL, +/* f651 */ NULL, +/* f652 */ NULL, +/* f653 */ NULL, +/* f654 */ NULL, +/* f655 */ NULL, +/* f656 */ NULL, +/* f657 */ NULL, +/* f658 */ NULL, +/* f659 */ NULL, +/* f65a */ NULL, +/* f65b */ NULL, +/* f65c */ NULL, +/* f65d */ NULL, +/* f65e */ NULL, +/* f65f */ NULL, +/* f660 */ NULL, +/* f661 */ NULL, +/* f662 */ NULL, +/* f663 */ NULL, +/* f664 */ NULL, +/* f665 */ NULL, +/* f666 */ NULL, +/* f667 */ NULL, +/* f668 */ NULL, +/* f669 */ NULL, +/* f66a */ NULL, +/* f66b */ NULL, +/* f66c */ NULL, +/* f66d */ NULL, +/* f66e */ NULL, +/* f66f */ NULL, +/* f670 */ NULL, +/* f671 */ NULL, +/* f672 */ NULL, +/* f673 */ NULL, +/* f674 */ NULL, +/* f675 */ NULL, +/* f676 */ NULL, +/* f677 */ NULL, +/* f678 */ NULL, +/* f679 */ NULL, +/* f67a */ NULL, +/* f67b */ NULL, +/* f67c */ NULL, +/* f67d */ NULL, +/* f67e */ NULL, +/* f67f */ NULL, +/* f680 */ NULL, +/* f681 */ NULL, +/* f682 */ NULL, +/* f683 */ NULL, +/* f684 */ NULL, +/* f685 */ NULL, +/* f686 */ NULL, +/* f687 */ NULL, +/* f688 */ NULL, +/* f689 */ NULL, +/* f68a */ NULL, +/* f68b */ NULL, +/* f68c */ NULL, +/* f68d */ NULL, +/* f68e */ NULL, +/* f68f */ NULL, +/* f690 */ NULL, +/* f691 */ NULL, +/* f692 */ NULL, +/* f693 */ NULL, +/* f694 */ NULL, +/* f695 */ NULL, +/* f696 */ NULL, +/* f697 */ NULL, +/* f698 */ NULL, +/* f699 */ NULL, +/* f69a */ NULL, +/* f69b */ NULL, +/* f69c */ NULL, +/* f69d */ NULL, +/* f69e */ NULL, +/* f69f */ NULL, +/* f6a0 */ NULL, +/* f6a1 */ NULL, +/* f6a2 */ NULL, +/* f6a3 */ NULL, +/* f6a4 */ NULL, +/* f6a5 */ NULL, +/* f6a6 */ NULL, +/* f6a7 */ NULL, +/* f6a8 */ NULL, +/* f6a9 */ NULL, +/* f6aa */ NULL, +/* f6ab */ NULL, +/* f6ac */ NULL, +/* f6ad */ NULL, +/* f6ae */ NULL, +/* f6af */ NULL, +/* f6b0 */ NULL, +/* f6b1 */ NULL, +/* f6b2 */ NULL, +/* f6b3 */ NULL, +/* f6b4 */ NULL, +/* f6b5 */ NULL, +/* f6b6 */ NULL, +/* f6b7 */ NULL, +/* f6b8 */ NULL, +/* f6b9 */ NULL, +/* f6ba */ NULL, +/* f6bb */ NULL, +/* f6bc */ NULL, +/* f6bd */ NULL, +/* f6be */ NULL, +/* f6bf */ NULL, +/* f6c0 */ NULL, +/* f6c1 */ NULL, +/* f6c2 */ NULL, +/* f6c3 */ NULL, +/* f6c4 */ NULL, +/* f6c5 */ NULL, +/* f6c6 */ NULL, +/* f6c7 */ NULL, +/* f6c8 */ NULL, +/* f6c9 */ NULL, +/* f6ca */ NULL, +/* f6cb */ NULL, +/* f6cc */ NULL, +/* f6cd */ NULL, +/* f6ce */ NULL, +/* f6cf */ NULL, +/* f6d0 */ NULL, +/* f6d1 */ NULL, +/* f6d2 */ NULL, +/* f6d3 */ NULL, +/* f6d4 */ NULL, +/* f6d5 */ NULL, +/* f6d6 */ NULL, +/* f6d7 */ NULL, +/* f6d8 */ NULL, +/* f6d9 */ NULL, +/* f6da */ NULL, +/* f6db */ NULL, +/* f6dc */ NULL, +/* f6dd */ NULL, +/* f6de */ NULL, +/* f6df */ NULL, +/* f6e0 */ NULL, +/* f6e1 */ NULL, +/* f6e2 */ NULL, +/* f6e3 */ NULL, +/* f6e4 */ NULL, +/* f6e5 */ NULL, +/* f6e6 */ NULL, +/* f6e7 */ NULL, +/* f6e8 */ NULL, +/* f6e9 */ NULL, +/* f6ea */ NULL, +/* f6eb */ NULL, +/* f6ec */ NULL, +/* f6ed */ NULL, +/* f6ee */ NULL, +/* f6ef */ NULL, +/* f6f0 */ NULL, +/* f6f1 */ NULL, +/* f6f2 */ NULL, +/* f6f3 */ NULL, +/* f6f4 */ NULL, +/* f6f5 */ NULL, +/* f6f6 */ NULL, +/* f6f7 */ NULL, +/* f6f8 */ NULL, +/* f6f9 */ NULL, +/* f6fa */ NULL, +/* f6fb */ NULL, +/* f6fc */ NULL, +/* f6fd */ NULL, +/* f6fe */ NULL, +/* f6ff */ NULL, +/* f700 */ NULL, +/* f701 */ NULL, +/* f702 */ NULL, +/* f703 */ NULL, +/* f704 */ NULL, +/* f705 */ NULL, +/* f706 */ NULL, +/* f707 */ NULL, +/* f708 */ NULL, +/* f709 */ NULL, +/* f70a */ NULL, +/* f70b */ NULL, +/* f70c */ NULL, +/* f70d */ NULL, +/* f70e */ NULL, +/* f70f */ NULL, +/* f710 */ NULL, +/* f711 */ NULL, +/* f712 */ NULL, +/* f713 */ NULL, +/* f714 */ NULL, +/* f715 */ NULL, +/* f716 */ NULL, +/* f717 */ NULL, +/* f718 */ NULL, +/* f719 */ NULL, +/* f71a */ NULL, +/* f71b */ NULL, +/* f71c */ NULL, +/* f71d */ NULL, +/* f71e */ NULL, +/* f71f */ NULL, +/* f720 */ NULL, +/* f721 */ NULL, +/* f722 */ NULL, +/* f723 */ NULL, +/* f724 */ NULL, +/* f725 */ NULL, +/* f726 */ NULL, +/* f727 */ NULL, +/* f728 */ NULL, +/* f729 */ NULL, +/* f72a */ NULL, +/* f72b */ NULL, +/* f72c */ NULL, +/* f72d */ NULL, +/* f72e */ NULL, +/* f72f */ NULL, +/* f730 */ NULL, +/* f731 */ NULL, +/* f732 */ NULL, +/* f733 */ NULL, +/* f734 */ NULL, +/* f735 */ NULL, +/* f736 */ NULL, +/* f737 */ NULL, +/* f738 */ NULL, +/* f739 */ NULL, +/* f73a */ NULL, +/* f73b */ NULL, +/* f73c */ NULL, +/* f73d */ NULL, +/* f73e */ NULL, +/* f73f */ NULL, +/* f740 */ NULL, +/* f741 */ NULL, +/* f742 */ NULL, +/* f743 */ NULL, +/* f744 */ NULL, +/* f745 */ NULL, +/* f746 */ NULL, +/* f747 */ NULL, +/* f748 */ NULL, +/* f749 */ NULL, +/* f74a */ NULL, +/* f74b */ NULL, +/* f74c */ NULL, +/* f74d */ NULL, +/* f74e */ NULL, +/* f74f */ NULL, +/* f750 */ NULL, +/* f751 */ NULL, +/* f752 */ NULL, +/* f753 */ NULL, +/* f754 */ NULL, +/* f755 */ NULL, +/* f756 */ NULL, +/* f757 */ NULL, +/* f758 */ NULL, +/* f759 */ NULL, +/* f75a */ NULL, +/* f75b */ NULL, +/* f75c */ NULL, +/* f75d */ NULL, +/* f75e */ NULL, +/* f75f */ NULL, +/* f760 */ NULL, +/* f761 */ NULL, +/* f762 */ NULL, +/* f763 */ NULL, +/* f764 */ NULL, +/* f765 */ NULL, +/* f766 */ NULL, +/* f767 */ NULL, +/* f768 */ NULL, +/* f769 */ NULL, +/* f76a */ NULL, +/* f76b */ NULL, +/* f76c */ NULL, +/* f76d */ NULL, +/* f76e */ NULL, +/* f76f */ NULL, +/* f770 */ NULL, +/* f771 */ NULL, +/* f772 */ NULL, +/* f773 */ NULL, +/* f774 */ NULL, +/* f775 */ NULL, +/* f776 */ NULL, +/* f777 */ NULL, +/* f778 */ NULL, +/* f779 */ NULL, +/* f77a */ NULL, +/* f77b */ NULL, +/* f77c */ NULL, +/* f77d */ NULL, +/* f77e */ NULL, +/* f77f */ NULL, +/* f780 */ NULL, +/* f781 */ NULL, +/* f782 */ NULL, +/* f783 */ NULL, +/* f784 */ NULL, +/* f785 */ NULL, +/* f786 */ NULL, +/* f787 */ NULL, +/* f788 */ NULL, +/* f789 */ NULL, +/* f78a */ NULL, +/* f78b */ NULL, +/* f78c */ NULL, +/* f78d */ NULL, +/* f78e */ NULL, +/* f78f */ NULL, +/* f790 */ NULL, +/* f791 */ NULL, +/* f792 */ NULL, +/* f793 */ NULL, +/* f794 */ NULL, +/* f795 */ NULL, +/* f796 */ NULL, +/* f797 */ NULL, +/* f798 */ NULL, +/* f799 */ NULL, +/* f79a */ NULL, +/* f79b */ NULL, +/* f79c */ NULL, +/* f79d */ NULL, +/* f79e */ NULL, +/* f79f */ NULL, +/* f7a0 */ NULL, +/* f7a1 */ NULL, +/* f7a2 */ NULL, +/* f7a3 */ NULL, +/* f7a4 */ NULL, +/* f7a5 */ NULL, +/* f7a6 */ NULL, +/* f7a7 */ NULL, +/* f7a8 */ NULL, +/* f7a9 */ NULL, +/* f7aa */ NULL, +/* f7ab */ NULL, +/* f7ac */ NULL, +/* f7ad */ NULL, +/* f7ae */ NULL, +/* f7af */ NULL, +/* f7b0 */ NULL, +/* f7b1 */ NULL, +/* f7b2 */ NULL, +/* f7b3 */ NULL, +/* f7b4 */ NULL, +/* f7b5 */ NULL, +/* f7b6 */ NULL, +/* f7b7 */ NULL, +/* f7b8 */ NULL, +/* f7b9 */ NULL, +/* f7ba */ NULL, +/* f7bb */ NULL, +/* f7bc */ NULL, +/* f7bd */ NULL, +/* f7be */ NULL, +/* f7bf */ NULL, +/* f7c0 */ NULL, +/* f7c1 */ NULL, +/* f7c2 */ NULL, +/* f7c3 */ NULL, +/* f7c4 */ NULL, +/* f7c5 */ NULL, +/* f7c6 */ NULL, +/* f7c7 */ NULL, +/* f7c8 */ NULL, +/* f7c9 */ NULL, +/* f7ca */ NULL, +/* f7cb */ NULL, +/* f7cc */ NULL, +/* f7cd */ NULL, +/* f7ce */ NULL, +/* f7cf */ NULL, +/* f7d0 */ NULL, +/* f7d1 */ NULL, +/* f7d2 */ NULL, +/* f7d3 */ NULL, +/* f7d4 */ NULL, +/* f7d5 */ NULL, +/* f7d6 */ NULL, +/* f7d7 */ NULL, +/* f7d8 */ NULL, +/* f7d9 */ NULL, +/* f7da */ NULL, +/* f7db */ NULL, +/* f7dc */ NULL, +/* f7dd */ NULL, +/* f7de */ NULL, +/* f7df */ NULL, +/* f7e0 */ NULL, +/* f7e1 */ NULL, +/* f7e2 */ NULL, +/* f7e3 */ NULL, +/* f7e4 */ NULL, +/* f7e5 */ NULL, +/* f7e6 */ NULL, +/* f7e7 */ NULL, +/* f7e8 */ NULL, +/* f7e9 */ NULL, +/* f7ea */ NULL, +/* f7eb */ NULL, +/* f7ec */ NULL, +/* f7ed */ NULL, +/* f7ee */ NULL, +/* f7ef */ NULL, +/* f7f0 */ NULL, +/* f7f1 */ NULL, +/* f7f2 */ NULL, +/* f7f3 */ NULL, +/* f7f4 */ NULL, +/* f7f5 */ NULL, +/* f7f6 */ NULL, +/* f7f7 */ NULL, +/* f7f8 */ NULL, +/* f7f9 */ NULL, +/* f7fa */ NULL, +/* f7fb */ NULL, +/* f7fc */ NULL, +/* f7fd */ NULL, +/* f7fe */ NULL, +/* f7ff */ NULL, +/* f800 */ NULL, +/* f801 */ NULL, +/* f802 */ NULL, +/* f803 */ NULL, +/* f804 */ NULL, +/* f805 */ NULL, +/* f806 */ NULL, +/* f807 */ NULL, +/* f808 */ NULL, +/* f809 */ NULL, +/* f80a */ NULL, +/* f80b */ NULL, +/* f80c */ NULL, +/* f80d */ NULL, +/* f80e */ NULL, +/* f80f */ NULL, +/* f810 */ NULL, +/* f811 */ NULL, +/* f812 */ NULL, +/* f813 */ NULL, +/* f814 */ NULL, +/* f815 */ NULL, +/* f816 */ NULL, +/* f817 */ NULL, +/* f818 */ NULL, +/* f819 */ NULL, +/* f81a */ NULL, +/* f81b */ NULL, +/* f81c */ NULL, +/* f81d */ NULL, +/* f81e */ NULL, +/* f81f */ NULL, +/* f820 */ NULL, +/* f821 */ NULL, +/* f822 */ NULL, +/* f823 */ NULL, +/* f824 */ NULL, +/* f825 */ NULL, +/* f826 */ NULL, +/* f827 */ NULL, +/* f828 */ NULL, +/* f829 */ NULL, +/* f82a */ NULL, +/* f82b */ NULL, +/* f82c */ NULL, +/* f82d */ NULL, +/* f82e */ NULL, +/* f82f */ NULL, +/* f830 */ NULL, +/* f831 */ NULL, +/* f832 */ NULL, +/* f833 */ NULL, +/* f834 */ NULL, +/* f835 */ NULL, +/* f836 */ NULL, +/* f837 */ NULL, +/* f838 */ NULL, +/* f839 */ NULL, +/* f83a */ NULL, +/* f83b */ NULL, +/* f83c */ NULL, +/* f83d */ NULL, +/* f83e */ NULL, +/* f83f */ NULL, +/* f840 */ NULL, +/* f841 */ NULL, +/* f842 */ NULL, +/* f843 */ NULL, +/* f844 */ NULL, +/* f845 */ NULL, +/* f846 */ NULL, +/* f847 */ NULL, +/* f848 */ NULL, +/* f849 */ NULL, +/* f84a */ NULL, +/* f84b */ NULL, +/* f84c */ NULL, +/* f84d */ NULL, +/* f84e */ NULL, +/* f84f */ NULL, +/* f850 */ NULL, +/* f851 */ NULL, +/* f852 */ NULL, +/* f853 */ NULL, +/* f854 */ NULL, +/* f855 */ NULL, +/* f856 */ NULL, +/* f857 */ NULL, +/* f858 */ NULL, +/* f859 */ NULL, +/* f85a */ NULL, +/* f85b */ NULL, +/* f85c */ NULL, +/* f85d */ NULL, +/* f85e */ NULL, +/* f85f */ NULL, +/* f860 */ NULL, +/* f861 */ NULL, +/* f862 */ NULL, +/* f863 */ NULL, +/* f864 */ NULL, +/* f865 */ NULL, +/* f866 */ NULL, +/* f867 */ NULL, +/* f868 */ NULL, +/* f869 */ NULL, +/* f86a */ NULL, +/* f86b */ NULL, +/* f86c */ NULL, +/* f86d */ NULL, +/* f86e */ NULL, +/* f86f */ NULL, +/* f870 */ NULL, +/* f871 */ NULL, +/* f872 */ NULL, +/* f873 */ NULL, +/* f874 */ NULL, +/* f875 */ NULL, +/* f876 */ NULL, +/* f877 */ NULL, +/* f878 */ NULL, +/* f879 */ NULL, +/* f87a */ NULL, +/* f87b */ NULL, +/* f87c */ NULL, +/* f87d */ NULL, +/* f87e */ NULL, +/* f87f */ NULL, +/* f880 */ NULL, +/* f881 */ NULL, +/* f882 */ NULL, +/* f883 */ NULL, +/* f884 */ NULL, +/* f885 */ NULL, +/* f886 */ NULL, +/* f887 */ NULL, +/* f888 */ NULL, +/* f889 */ NULL, +/* f88a */ NULL, +/* f88b */ NULL, +/* f88c */ NULL, +/* f88d */ NULL, +/* f88e */ NULL, +/* f88f */ NULL, +/* f890 */ NULL, +/* f891 */ NULL, +/* f892 */ NULL, +/* f893 */ NULL, +/* f894 */ NULL, +/* f895 */ NULL, +/* f896 */ NULL, +/* f897 */ NULL, +/* f898 */ NULL, +/* f899 */ NULL, +/* f89a */ NULL, +/* f89b */ NULL, +/* f89c */ NULL, +/* f89d */ NULL, +/* f89e */ NULL, +/* f89f */ NULL, +/* f8a0 */ NULL, +/* f8a1 */ NULL, +/* f8a2 */ NULL, +/* f8a3 */ NULL, +/* f8a4 */ NULL, +/* f8a5 */ NULL, +/* f8a6 */ NULL, +/* f8a7 */ NULL, +/* f8a8 */ NULL, +/* f8a9 */ NULL, +/* f8aa */ NULL, +/* f8ab */ NULL, +/* f8ac */ NULL, +/* f8ad */ NULL, +/* f8ae */ NULL, +/* f8af */ NULL, +/* f8b0 */ NULL, +/* f8b1 */ NULL, +/* f8b2 */ NULL, +/* f8b3 */ NULL, +/* f8b4 */ NULL, +/* f8b5 */ NULL, +/* f8b6 */ NULL, +/* f8b7 */ NULL, +/* f8b8 */ NULL, +/* f8b9 */ NULL, +/* f8ba */ NULL, +/* f8bb */ NULL, +/* f8bc */ NULL, +/* f8bd */ NULL, +/* f8be */ NULL, +/* f8bf */ NULL, +/* f8c0 */ NULL, +/* f8c1 */ NULL, +/* f8c2 */ NULL, +/* f8c3 */ NULL, +/* f8c4 */ NULL, +/* f8c5 */ NULL, +/* f8c6 */ NULL, +/* f8c7 */ NULL, +/* f8c8 */ NULL, +/* f8c9 */ NULL, +/* f8ca */ NULL, +/* f8cb */ NULL, +/* f8cc */ NULL, +/* f8cd */ NULL, +/* f8ce */ NULL, +/* f8cf */ NULL, +/* f8d0 */ NULL, +/* f8d1 */ NULL, +/* f8d2 */ NULL, +/* f8d3 */ NULL, +/* f8d4 */ NULL, +/* f8d5 */ NULL, +/* f8d6 */ NULL, +/* f8d7 */ NULL, +/* f8d8 */ NULL, +/* f8d9 */ NULL, +/* f8da */ NULL, +/* f8db */ NULL, +/* f8dc */ NULL, +/* f8dd */ NULL, +/* f8de */ NULL, +/* f8df */ NULL, +/* f8e0 */ NULL, +/* f8e1 */ NULL, +/* f8e2 */ NULL, +/* f8e3 */ NULL, +/* f8e4 */ NULL, +/* f8e5 */ NULL, +/* f8e6 */ NULL, +/* f8e7 */ NULL, +/* f8e8 */ NULL, +/* f8e9 */ NULL, +/* f8ea */ NULL, +/* f8eb */ NULL, +/* f8ec */ NULL, +/* f8ed */ NULL, +/* f8ee */ NULL, +/* f8ef */ NULL, +/* f8f0 */ NULL, +/* f8f1 */ NULL, +/* f8f2 */ NULL, +/* f8f3 */ NULL, +/* f8f4 */ NULL, +/* f8f5 */ NULL, +/* f8f6 */ NULL, +/* f8f7 */ NULL, +/* f8f8 */ NULL, +/* f8f9 */ NULL, +/* f8fa */ NULL, +/* f8fb */ NULL, +/* f8fc */ NULL, +/* f8fd */ NULL, +/* f8fe */ NULL, +/* f8ff */ NULL, +/* f900 */ NULL, +/* f901 */ NULL, +/* f902 */ NULL, +/* f903 */ NULL, +/* f904 */ NULL, +/* f905 */ NULL, +/* f906 */ NULL, +/* f907 */ NULL, +/* f908 */ NULL, +/* f909 */ NULL, +/* f90a */ NULL, +/* f90b */ NULL, +/* f90c */ NULL, +/* f90d */ NULL, +/* f90e */ NULL, +/* f90f */ NULL, +/* f910 */ NULL, +/* f911 */ NULL, +/* f912 */ NULL, +/* f913 */ NULL, +/* f914 */ NULL, +/* f915 */ NULL, +/* f916 */ NULL, +/* f917 */ NULL, +/* f918 */ NULL, +/* f919 */ NULL, +/* f91a */ NULL, +/* f91b */ NULL, +/* f91c */ NULL, +/* f91d */ NULL, +/* f91e */ NULL, +/* f91f */ NULL, +/* f920 */ NULL, +/* f921 */ NULL, +/* f922 */ NULL, +/* f923 */ NULL, +/* f924 */ NULL, +/* f925 */ NULL, +/* f926 */ NULL, +/* f927 */ NULL, +/* f928 */ NULL, +/* f929 */ NULL, +/* f92a */ NULL, +/* f92b */ NULL, +/* f92c */ NULL, +/* f92d */ NULL, +/* f92e */ NULL, +/* f92f */ NULL, +/* f930 */ NULL, +/* f931 */ NULL, +/* f932 */ NULL, +/* f933 */ NULL, +/* f934 */ NULL, +/* f935 */ NULL, +/* f936 */ NULL, +/* f937 */ NULL, +/* f938 */ NULL, +/* f939 */ NULL, +/* f93a */ NULL, +/* f93b */ NULL, +/* f93c */ NULL, +/* f93d */ NULL, +/* f93e */ NULL, +/* f93f */ NULL, +/* f940 */ NULL, +/* f941 */ NULL, +/* f942 */ NULL, +/* f943 */ NULL, +/* f944 */ NULL, +/* f945 */ NULL, +/* f946 */ NULL, +/* f947 */ NULL, +/* f948 */ NULL, +/* f949 */ NULL, +/* f94a */ NULL, +/* f94b */ NULL, +/* f94c */ NULL, +/* f94d */ NULL, +/* f94e */ NULL, +/* f94f */ NULL, +/* f950 */ NULL, +/* f951 */ NULL, +/* f952 */ NULL, +/* f953 */ NULL, +/* f954 */ NULL, +/* f955 */ NULL, +/* f956 */ NULL, +/* f957 */ NULL, +/* f958 */ NULL, +/* f959 */ NULL, +/* f95a */ NULL, +/* f95b */ NULL, +/* f95c */ NULL, +/* f95d */ NULL, +/* f95e */ NULL, +/* f95f */ NULL, +/* f960 */ NULL, +/* f961 */ NULL, +/* f962 */ NULL, +/* f963 */ NULL, +/* f964 */ NULL, +/* f965 */ NULL, +/* f966 */ NULL, +/* f967 */ NULL, +/* f968 */ NULL, +/* f969 */ NULL, +/* f96a */ NULL, +/* f96b */ NULL, +/* f96c */ NULL, +/* f96d */ NULL, +/* f96e */ NULL, +/* f96f */ NULL, +/* f970 */ NULL, +/* f971 */ NULL, +/* f972 */ NULL, +/* f973 */ NULL, +/* f974 */ NULL, +/* f975 */ NULL, +/* f976 */ NULL, +/* f977 */ NULL, +/* f978 */ NULL, +/* f979 */ NULL, +/* f97a */ NULL, +/* f97b */ NULL, +/* f97c */ NULL, +/* f97d */ NULL, +/* f97e */ NULL, +/* f97f */ NULL, +/* f980 */ NULL, +/* f981 */ NULL, +/* f982 */ NULL, +/* f983 */ NULL, +/* f984 */ NULL, +/* f985 */ NULL, +/* f986 */ NULL, +/* f987 */ NULL, +/* f988 */ NULL, +/* f989 */ NULL, +/* f98a */ NULL, +/* f98b */ NULL, +/* f98c */ NULL, +/* f98d */ NULL, +/* f98e */ NULL, +/* f98f */ NULL, +/* f990 */ NULL, +/* f991 */ NULL, +/* f992 */ NULL, +/* f993 */ NULL, +/* f994 */ NULL, +/* f995 */ NULL, +/* f996 */ NULL, +/* f997 */ NULL, +/* f998 */ NULL, +/* f999 */ NULL, +/* f99a */ NULL, +/* f99b */ NULL, +/* f99c */ NULL, +/* f99d */ NULL, +/* f99e */ NULL, +/* f99f */ NULL, +/* f9a0 */ NULL, +/* f9a1 */ NULL, +/* f9a2 */ NULL, +/* f9a3 */ NULL, +/* f9a4 */ NULL, +/* f9a5 */ NULL, +/* f9a6 */ NULL, +/* f9a7 */ NULL, +/* f9a8 */ NULL, +/* f9a9 */ NULL, +/* f9aa */ NULL, +/* f9ab */ NULL, +/* f9ac */ NULL, +/* f9ad */ NULL, +/* f9ae */ NULL, +/* f9af */ NULL, +/* f9b0 */ NULL, +/* f9b1 */ NULL, +/* f9b2 */ NULL, +/* f9b3 */ NULL, +/* f9b4 */ NULL, +/* f9b5 */ NULL, +/* f9b6 */ NULL, +/* f9b7 */ NULL, +/* f9b8 */ NULL, +/* f9b9 */ NULL, +/* f9ba */ NULL, +/* f9bb */ NULL, +/* f9bc */ NULL, +/* f9bd */ NULL, +/* f9be */ NULL, +/* f9bf */ NULL, +/* f9c0 */ NULL, +/* f9c1 */ NULL, +/* f9c2 */ NULL, +/* f9c3 */ NULL, +/* f9c4 */ NULL, +/* f9c5 */ NULL, +/* f9c6 */ NULL, +/* f9c7 */ NULL, +/* f9c8 */ NULL, +/* f9c9 */ NULL, +/* f9ca */ NULL, +/* f9cb */ NULL, +/* f9cc */ NULL, +/* f9cd */ NULL, +/* f9ce */ NULL, +/* f9cf */ NULL, +/* f9d0 */ NULL, +/* f9d1 */ NULL, +/* f9d2 */ NULL, +/* f9d3 */ NULL, +/* f9d4 */ NULL, +/* f9d5 */ NULL, +/* f9d6 */ NULL, +/* f9d7 */ NULL, +/* f9d8 */ NULL, +/* f9d9 */ NULL, +/* f9da */ NULL, +/* f9db */ NULL, +/* f9dc */ NULL, +/* f9dd */ NULL, +/* f9de */ NULL, +/* f9df */ NULL, +/* f9e0 */ NULL, +/* f9e1 */ NULL, +/* f9e2 */ NULL, +/* f9e3 */ NULL, +/* f9e4 */ NULL, +/* f9e5 */ NULL, +/* f9e6 */ NULL, +/* f9e7 */ NULL, +/* f9e8 */ NULL, +/* f9e9 */ NULL, +/* f9ea */ NULL, +/* f9eb */ NULL, +/* f9ec */ NULL, +/* f9ed */ NULL, +/* f9ee */ NULL, +/* f9ef */ NULL, +/* f9f0 */ NULL, +/* f9f1 */ NULL, +/* f9f2 */ NULL, +/* f9f3 */ NULL, +/* f9f4 */ NULL, +/* f9f5 */ NULL, +/* f9f6 */ NULL, +/* f9f7 */ NULL, +/* f9f8 */ NULL, +/* f9f9 */ NULL, +/* f9fa */ NULL, +/* f9fb */ NULL, +/* f9fc */ NULL, +/* f9fd */ NULL, +/* f9fe */ NULL, +/* f9ff */ NULL, +/* fa00 */ NULL, +/* fa01 */ NULL, +/* fa02 */ NULL, +/* fa03 */ NULL, +/* fa04 */ NULL, +/* fa05 */ NULL, +/* fa06 */ NULL, +/* fa07 */ NULL, +/* fa08 */ NULL, +/* fa09 */ NULL, +/* fa0a */ NULL, +/* fa0b */ NULL, +/* fa0c */ NULL, +/* fa0d */ NULL, +/* fa0e */ NULL, +/* fa0f */ NULL, +/* fa10 */ NULL, +/* fa11 */ NULL, +/* fa12 */ NULL, +/* fa13 */ NULL, +/* fa14 */ NULL, +/* fa15 */ NULL, +/* fa16 */ NULL, +/* fa17 */ NULL, +/* fa18 */ NULL, +/* fa19 */ NULL, +/* fa1a */ NULL, +/* fa1b */ NULL, +/* fa1c */ NULL, +/* fa1d */ NULL, +/* fa1e */ NULL, +/* fa1f */ NULL, +/* fa20 */ NULL, +/* fa21 */ NULL, +/* fa22 */ NULL, +/* fa23 */ NULL, +/* fa24 */ NULL, +/* fa25 */ NULL, +/* fa26 */ NULL, +/* fa27 */ NULL, +/* fa28 */ NULL, +/* fa29 */ NULL, +/* fa2a */ NULL, +/* fa2b */ NULL, +/* fa2c */ NULL, +/* fa2d */ NULL, +/* fa2e */ NULL, +/* fa2f */ NULL, +/* fa30 */ NULL, +/* fa31 */ NULL, +/* fa32 */ NULL, +/* fa33 */ NULL, +/* fa34 */ NULL, +/* fa35 */ NULL, +/* fa36 */ NULL, +/* fa37 */ NULL, +/* fa38 */ NULL, +/* fa39 */ NULL, +/* fa3a */ NULL, +/* fa3b */ NULL, +/* fa3c */ NULL, +/* fa3d */ NULL, +/* fa3e */ NULL, +/* fa3f */ NULL, +/* fa40 */ NULL, +/* fa41 */ NULL, +/* fa42 */ NULL, +/* fa43 */ NULL, +/* fa44 */ NULL, +/* fa45 */ NULL, +/* fa46 */ NULL, +/* fa47 */ NULL, +/* fa48 */ NULL, +/* fa49 */ NULL, +/* fa4a */ NULL, +/* fa4b */ NULL, +/* fa4c */ NULL, +/* fa4d */ NULL, +/* fa4e */ NULL, +/* fa4f */ NULL, +/* fa50 */ NULL, +/* fa51 */ NULL, +/* fa52 */ NULL, +/* fa53 */ NULL, +/* fa54 */ NULL, +/* fa55 */ NULL, +/* fa56 */ NULL, +/* fa57 */ NULL, +/* fa58 */ NULL, +/* fa59 */ NULL, +/* fa5a */ NULL, +/* fa5b */ NULL, +/* fa5c */ NULL, +/* fa5d */ NULL, +/* fa5e */ NULL, +/* fa5f */ NULL, +/* fa60 */ NULL, +/* fa61 */ NULL, +/* fa62 */ NULL, +/* fa63 */ NULL, +/* fa64 */ NULL, +/* fa65 */ NULL, +/* fa66 */ NULL, +/* fa67 */ NULL, +/* fa68 */ NULL, +/* fa69 */ NULL, +/* fa6a */ NULL, +/* fa6b */ NULL, +/* fa6c */ NULL, +/* fa6d */ NULL, +/* fa6e */ NULL, +/* fa6f */ NULL, +/* fa70 */ NULL, +/* fa71 */ NULL, +/* fa72 */ NULL, +/* fa73 */ NULL, +/* fa74 */ NULL, +/* fa75 */ NULL, +/* fa76 */ NULL, +/* fa77 */ NULL, +/* fa78 */ NULL, +/* fa79 */ NULL, +/* fa7a */ NULL, +/* fa7b */ NULL, +/* fa7c */ NULL, +/* fa7d */ NULL, +/* fa7e */ NULL, +/* fa7f */ NULL, +/* fa80 */ NULL, +/* fa81 */ NULL, +/* fa82 */ NULL, +/* fa83 */ NULL, +/* fa84 */ NULL, +/* fa85 */ NULL, +/* fa86 */ NULL, +/* fa87 */ NULL, +/* fa88 */ NULL, +/* fa89 */ NULL, +/* fa8a */ NULL, +/* fa8b */ NULL, +/* fa8c */ NULL, +/* fa8d */ NULL, +/* fa8e */ NULL, +/* fa8f */ NULL, +/* fa90 */ NULL, +/* fa91 */ NULL, +/* fa92 */ NULL, +/* fa93 */ NULL, +/* fa94 */ NULL, +/* fa95 */ NULL, +/* fa96 */ NULL, +/* fa97 */ NULL, +/* fa98 */ NULL, +/* fa99 */ NULL, +/* fa9a */ NULL, +/* fa9b */ NULL, +/* fa9c */ NULL, +/* fa9d */ NULL, +/* fa9e */ NULL, +/* fa9f */ NULL, +/* faa0 */ NULL, +/* faa1 */ NULL, +/* faa2 */ NULL, +/* faa3 */ NULL, +/* faa4 */ NULL, +/* faa5 */ NULL, +/* faa6 */ NULL, +/* faa7 */ NULL, +/* faa8 */ NULL, +/* faa9 */ NULL, +/* faaa */ NULL, +/* faab */ NULL, +/* faac */ NULL, +/* faad */ NULL, +/* faae */ NULL, +/* faaf */ NULL, +/* fab0 */ NULL, +/* fab1 */ NULL, +/* fab2 */ NULL, +/* fab3 */ NULL, +/* fab4 */ NULL, +/* fab5 */ NULL, +/* fab6 */ NULL, +/* fab7 */ NULL, +/* fab8 */ NULL, +/* fab9 */ NULL, +/* faba */ NULL, +/* fabb */ NULL, +/* fabc */ NULL, +/* fabd */ NULL, +/* fabe */ NULL, +/* fabf */ NULL, +/* fac0 */ NULL, +/* fac1 */ NULL, +/* fac2 */ NULL, +/* fac3 */ NULL, +/* fac4 */ NULL, +/* fac5 */ NULL, +/* fac6 */ NULL, +/* fac7 */ NULL, +/* fac8 */ NULL, +/* fac9 */ NULL, +/* faca */ NULL, +/* facb */ NULL, +/* facc */ NULL, +/* facd */ NULL, +/* face */ NULL, +/* facf */ NULL, +/* fad0 */ NULL, +/* fad1 */ NULL, +/* fad2 */ NULL, +/* fad3 */ NULL, +/* fad4 */ NULL, +/* fad5 */ NULL, +/* fad6 */ NULL, +/* fad7 */ NULL, +/* fad8 */ NULL, +/* fad9 */ NULL, +/* fada */ NULL, +/* fadb */ NULL, +/* fadc */ NULL, +/* fadd */ NULL, +/* fade */ NULL, +/* fadf */ NULL, +/* fae0 */ NULL, +/* fae1 */ NULL, +/* fae2 */ NULL, +/* fae3 */ NULL, +/* fae4 */ NULL, +/* fae5 */ NULL, +/* fae6 */ NULL, +/* fae7 */ NULL, +/* fae8 */ NULL, +/* fae9 */ NULL, +/* faea */ NULL, +/* faeb */ NULL, +/* faec */ NULL, +/* faed */ NULL, +/* faee */ NULL, +/* faef */ NULL, +/* faf0 */ NULL, +/* faf1 */ NULL, +/* faf2 */ NULL, +/* faf3 */ NULL, +/* faf4 */ NULL, +/* faf5 */ NULL, +/* faf6 */ NULL, +/* faf7 */ NULL, +/* faf8 */ NULL, +/* faf9 */ NULL, +/* fafa */ NULL, +/* fafb */ NULL, +/* fafc */ NULL, +/* fafd */ NULL, +/* fafe */ NULL, +/* faff */ NULL, +/* fb00 */ NULL, +/* fb01 */ NULL, +/* fb02 */ NULL, +/* fb03 */ NULL, +/* fb04 */ NULL, +/* fb05 */ NULL, +/* fb06 */ NULL, +/* fb07 */ NULL, +/* fb08 */ NULL, +/* fb09 */ NULL, +/* fb0a */ NULL, +/* fb0b */ NULL, +/* fb0c */ NULL, +/* fb0d */ NULL, +/* fb0e */ NULL, +/* fb0f */ NULL, +/* fb10 */ NULL, +/* fb11 */ NULL, +/* fb12 */ NULL, +/* fb13 */ NULL, +/* fb14 */ NULL, +/* fb15 */ NULL, +/* fb16 */ NULL, +/* fb17 */ NULL, +/* fb18 */ NULL, +/* fb19 */ NULL, +/* fb1a */ NULL, +/* fb1b */ NULL, +/* fb1c */ NULL, +/* fb1d */ NULL, +/* fb1e */ NULL, +/* fb1f */ NULL, +/* fb20 */ NULL, +/* fb21 */ NULL, +/* fb22 */ NULL, +/* fb23 */ NULL, +/* fb24 */ NULL, +/* fb25 */ NULL, +/* fb26 */ NULL, +/* fb27 */ NULL, +/* fb28 */ NULL, +/* fb29 */ NULL, +/* fb2a */ NULL, +/* fb2b */ NULL, +/* fb2c */ NULL, +/* fb2d */ NULL, +/* fb2e */ NULL, +/* fb2f */ NULL, +/* fb30 */ NULL, +/* fb31 */ NULL, +/* fb32 */ NULL, +/* fb33 */ NULL, +/* fb34 */ NULL, +/* fb35 */ NULL, +/* fb36 */ NULL, +/* fb37 */ NULL, +/* fb38 */ NULL, +/* fb39 */ NULL, +/* fb3a */ NULL, +/* fb3b */ NULL, +/* fb3c */ NULL, +/* fb3d */ NULL, +/* fb3e */ NULL, +/* fb3f */ NULL, +/* fb40 */ NULL, +/* fb41 */ NULL, +/* fb42 */ NULL, +/* fb43 */ NULL, +/* fb44 */ NULL, +/* fb45 */ NULL, +/* fb46 */ NULL, +/* fb47 */ NULL, +/* fb48 */ NULL, +/* fb49 */ NULL, +/* fb4a */ NULL, +/* fb4b */ NULL, +/* fb4c */ NULL, +/* fb4d */ NULL, +/* fb4e */ NULL, +/* fb4f */ NULL, +/* fb50 */ NULL, +/* fb51 */ NULL, +/* fb52 */ NULL, +/* fb53 */ NULL, +/* fb54 */ NULL, +/* fb55 */ NULL, +/* fb56 */ NULL, +/* fb57 */ NULL, +/* fb58 */ NULL, +/* fb59 */ NULL, +/* fb5a */ NULL, +/* fb5b */ NULL, +/* fb5c */ NULL, +/* fb5d */ NULL, +/* fb5e */ NULL, +/* fb5f */ NULL, +/* fb60 */ NULL, +/* fb61 */ NULL, +/* fb62 */ NULL, +/* fb63 */ NULL, +/* fb64 */ NULL, +/* fb65 */ NULL, +/* fb66 */ NULL, +/* fb67 */ NULL, +/* fb68 */ NULL, +/* fb69 */ NULL, +/* fb6a */ NULL, +/* fb6b */ NULL, +/* fb6c */ NULL, +/* fb6d */ NULL, +/* fb6e */ NULL, +/* fb6f */ NULL, +/* fb70 */ NULL, +/* fb71 */ NULL, +/* fb72 */ NULL, +/* fb73 */ NULL, +/* fb74 */ NULL, +/* fb75 */ NULL, +/* fb76 */ NULL, +/* fb77 */ NULL, +/* fb78 */ NULL, +/* fb79 */ NULL, +/* fb7a */ NULL, +/* fb7b */ NULL, +/* fb7c */ NULL, +/* fb7d */ NULL, +/* fb7e */ NULL, +/* fb7f */ NULL, +/* fb80 */ NULL, +/* fb81 */ NULL, +/* fb82 */ NULL, +/* fb83 */ NULL, +/* fb84 */ NULL, +/* fb85 */ NULL, +/* fb86 */ NULL, +/* fb87 */ NULL, +/* fb88 */ NULL, +/* fb89 */ NULL, +/* fb8a */ NULL, +/* fb8b */ NULL, +/* fb8c */ NULL, +/* fb8d */ NULL, +/* fb8e */ NULL, +/* fb8f */ NULL, +/* fb90 */ NULL, +/* fb91 */ NULL, +/* fb92 */ NULL, +/* fb93 */ NULL, +/* fb94 */ NULL, +/* fb95 */ NULL, +/* fb96 */ NULL, +/* fb97 */ NULL, +/* fb98 */ NULL, +/* fb99 */ NULL, +/* fb9a */ NULL, +/* fb9b */ NULL, +/* fb9c */ NULL, +/* fb9d */ NULL, +/* fb9e */ NULL, +/* fb9f */ NULL, +/* fba0 */ NULL, +/* fba1 */ NULL, +/* fba2 */ NULL, +/* fba3 */ NULL, +/* fba4 */ NULL, +/* fba5 */ NULL, +/* fba6 */ NULL, +/* fba7 */ NULL, +/* fba8 */ NULL, +/* fba9 */ NULL, +/* fbaa */ NULL, +/* fbab */ NULL, +/* fbac */ NULL, +/* fbad */ NULL, +/* fbae */ NULL, +/* fbaf */ NULL, +/* fbb0 */ NULL, +/* fbb1 */ NULL, +/* fbb2 */ NULL, +/* fbb3 */ NULL, +/* fbb4 */ NULL, +/* fbb5 */ NULL, +/* fbb6 */ NULL, +/* fbb7 */ NULL, +/* fbb8 */ NULL, +/* fbb9 */ NULL, +/* fbba */ NULL, +/* fbbb */ NULL, +/* fbbc */ NULL, +/* fbbd */ NULL, +/* fbbe */ NULL, +/* fbbf */ NULL, +/* fbc0 */ NULL, +/* fbc1 */ NULL, +/* fbc2 */ NULL, +/* fbc3 */ NULL, +/* fbc4 */ NULL, +/* fbc5 */ NULL, +/* fbc6 */ NULL, +/* fbc7 */ NULL, +/* fbc8 */ NULL, +/* fbc9 */ NULL, +/* fbca */ NULL, +/* fbcb */ NULL, +/* fbcc */ NULL, +/* fbcd */ NULL, +/* fbce */ NULL, +/* fbcf */ NULL, +/* fbd0 */ NULL, +/* fbd1 */ NULL, +/* fbd2 */ NULL, +/* fbd3 */ NULL, +/* fbd4 */ NULL, +/* fbd5 */ NULL, +/* fbd6 */ NULL, +/* fbd7 */ NULL, +/* fbd8 */ NULL, +/* fbd9 */ NULL, +/* fbda */ NULL, +/* fbdb */ NULL, +/* fbdc */ NULL, +/* fbdd */ NULL, +/* fbde */ NULL, +/* fbdf */ NULL, +/* fbe0 */ NULL, +/* fbe1 */ NULL, +/* fbe2 */ NULL, +/* fbe3 */ NULL, +/* fbe4 */ NULL, +/* fbe5 */ NULL, +/* fbe6 */ NULL, +/* fbe7 */ NULL, +/* fbe8 */ NULL, +/* fbe9 */ NULL, +/* fbea */ NULL, +/* fbeb */ NULL, +/* fbec */ NULL, +/* fbed */ NULL, +/* fbee */ NULL, +/* fbef */ NULL, +/* fbf0 */ NULL, +/* fbf1 */ NULL, +/* fbf2 */ NULL, +/* fbf3 */ NULL, +/* fbf4 */ NULL, +/* fbf5 */ NULL, +/* fbf6 */ NULL, +/* fbf7 */ NULL, +/* fbf8 */ NULL, +/* fbf9 */ NULL, +/* fbfa */ NULL, +/* fbfb */ NULL, +/* fbfc */ NULL, +/* fbfd */ NULL, +/* fbfe */ NULL, +/* fbff */ NULL, +/* fc00 */ NULL, +/* fc01 */ NULL, +/* fc02 */ NULL, +/* fc03 */ NULL, +/* fc04 */ NULL, +/* fc05 */ NULL, +/* fc06 */ NULL, +/* fc07 */ NULL, +/* fc08 */ NULL, +/* fc09 */ NULL, +/* fc0a */ NULL, +/* fc0b */ NULL, +/* fc0c */ NULL, +/* fc0d */ NULL, +/* fc0e */ NULL, +/* fc0f */ NULL, +/* fc10 */ NULL, +/* fc11 */ NULL, +/* fc12 */ NULL, +/* fc13 */ NULL, +/* fc14 */ NULL, +/* fc15 */ NULL, +/* fc16 */ NULL, +/* fc17 */ NULL, +/* fc18 */ NULL, +/* fc19 */ NULL, +/* fc1a */ NULL, +/* fc1b */ NULL, +/* fc1c */ NULL, +/* fc1d */ NULL, +/* fc1e */ NULL, +/* fc1f */ NULL, +/* fc20 */ NULL, +/* fc21 */ NULL, +/* fc22 */ NULL, +/* fc23 */ NULL, +/* fc24 */ NULL, +/* fc25 */ NULL, +/* fc26 */ NULL, +/* fc27 */ NULL, +/* fc28 */ NULL, +/* fc29 */ NULL, +/* fc2a */ NULL, +/* fc2b */ NULL, +/* fc2c */ NULL, +/* fc2d */ NULL, +/* fc2e */ NULL, +/* fc2f */ NULL, +/* fc30 */ NULL, +/* fc31 */ NULL, +/* fc32 */ NULL, +/* fc33 */ NULL, +/* fc34 */ NULL, +/* fc35 */ NULL, +/* fc36 */ NULL, +/* fc37 */ NULL, +/* fc38 */ NULL, +/* fc39 */ NULL, +/* fc3a */ NULL, +/* fc3b */ NULL, +/* fc3c */ NULL, +/* fc3d */ NULL, +/* fc3e */ NULL, +/* fc3f */ NULL, +/* fc40 */ NULL, +/* fc41 */ NULL, +/* fc42 */ NULL, +/* fc43 */ NULL, +/* fc44 */ NULL, +/* fc45 */ NULL, +/* fc46 */ NULL, +/* fc47 */ NULL, +/* fc48 */ NULL, +/* fc49 */ NULL, +/* fc4a */ NULL, +/* fc4b */ NULL, +/* fc4c */ NULL, +/* fc4d */ NULL, +/* fc4e */ NULL, +/* fc4f */ NULL, +/* fc50 */ NULL, +/* fc51 */ NULL, +/* fc52 */ NULL, +/* fc53 */ NULL, +/* fc54 */ NULL, +/* fc55 */ NULL, +/* fc56 */ NULL, +/* fc57 */ NULL, +/* fc58 */ NULL, +/* fc59 */ NULL, +/* fc5a */ NULL, +/* fc5b */ NULL, +/* fc5c */ NULL, +/* fc5d */ NULL, +/* fc5e */ NULL, +/* fc5f */ NULL, +/* fc60 */ NULL, +/* fc61 */ NULL, +/* fc62 */ NULL, +/* fc63 */ NULL, +/* fc64 */ NULL, +/* fc65 */ NULL, +/* fc66 */ NULL, +/* fc67 */ NULL, +/* fc68 */ NULL, +/* fc69 */ NULL, +/* fc6a */ NULL, +/* fc6b */ NULL, +/* fc6c */ NULL, +/* fc6d */ NULL, +/* fc6e */ NULL, +/* fc6f */ NULL, +/* fc70 */ NULL, +/* fc71 */ NULL, +/* fc72 */ NULL, +/* fc73 */ NULL, +/* fc74 */ NULL, +/* fc75 */ NULL, +/* fc76 */ NULL, +/* fc77 */ NULL, +/* fc78 */ NULL, +/* fc79 */ NULL, +/* fc7a */ NULL, +/* fc7b */ NULL, +/* fc7c */ NULL, +/* fc7d */ NULL, +/* fc7e */ NULL, +/* fc7f */ NULL, +/* fc80 */ NULL, +/* fc81 */ NULL, +/* fc82 */ NULL, +/* fc83 */ NULL, +/* fc84 */ NULL, +/* fc85 */ NULL, +/* fc86 */ NULL, +/* fc87 */ NULL, +/* fc88 */ NULL, +/* fc89 */ NULL, +/* fc8a */ NULL, +/* fc8b */ NULL, +/* fc8c */ NULL, +/* fc8d */ NULL, +/* fc8e */ NULL, +/* fc8f */ NULL, +/* fc90 */ NULL, +/* fc91 */ NULL, +/* fc92 */ NULL, +/* fc93 */ NULL, +/* fc94 */ NULL, +/* fc95 */ NULL, +/* fc96 */ NULL, +/* fc97 */ NULL, +/* fc98 */ NULL, +/* fc99 */ NULL, +/* fc9a */ NULL, +/* fc9b */ NULL, +/* fc9c */ NULL, +/* fc9d */ NULL, +/* fc9e */ NULL, +/* fc9f */ NULL, +/* fca0 */ NULL, +/* fca1 */ NULL, +/* fca2 */ NULL, +/* fca3 */ NULL, +/* fca4 */ NULL, +/* fca5 */ NULL, +/* fca6 */ NULL, +/* fca7 */ NULL, +/* fca8 */ NULL, +/* fca9 */ NULL, +/* fcaa */ NULL, +/* fcab */ NULL, +/* fcac */ NULL, +/* fcad */ NULL, +/* fcae */ NULL, +/* fcaf */ NULL, +/* fcb0 */ NULL, +/* fcb1 */ NULL, +/* fcb2 */ NULL, +/* fcb3 */ NULL, +/* fcb4 */ NULL, +/* fcb5 */ NULL, +/* fcb6 */ NULL, +/* fcb7 */ NULL, +/* fcb8 */ NULL, +/* fcb9 */ NULL, +/* fcba */ NULL, +/* fcbb */ NULL, +/* fcbc */ NULL, +/* fcbd */ NULL, +/* fcbe */ NULL, +/* fcbf */ NULL, +/* fcc0 */ NULL, +/* fcc1 */ NULL, +/* fcc2 */ NULL, +/* fcc3 */ NULL, +/* fcc4 */ NULL, +/* fcc5 */ NULL, +/* fcc6 */ NULL, +/* fcc7 */ NULL, +/* fcc8 */ NULL, +/* fcc9 */ NULL, +/* fcca */ NULL, +/* fccb */ NULL, +/* fccc */ NULL, +/* fccd */ NULL, +/* fcce */ NULL, +/* fccf */ NULL, +/* fcd0 */ NULL, +/* fcd1 */ NULL, +/* fcd2 */ NULL, +/* fcd3 */ NULL, +/* fcd4 */ NULL, +/* fcd5 */ NULL, +/* fcd6 */ NULL, +/* fcd7 */ NULL, +/* fcd8 */ NULL, +/* fcd9 */ NULL, +/* fcda */ NULL, +/* fcdb */ NULL, +/* fcdc */ NULL, +/* fcdd */ NULL, +/* fcde */ NULL, +/* fcdf */ NULL, +/* fce0 */ NULL, +/* fce1 */ NULL, +/* fce2 */ NULL, +/* fce3 */ NULL, +/* fce4 */ NULL, +/* fce5 */ NULL, +/* fce6 */ NULL, +/* fce7 */ NULL, +/* fce8 */ NULL, +/* fce9 */ NULL, +/* fcea */ NULL, +/* fceb */ NULL, +/* fcec */ NULL, +/* fced */ NULL, +/* fcee */ NULL, +/* fcef */ NULL, +/* fcf0 */ NULL, +/* fcf1 */ NULL, +/* fcf2 */ NULL, +/* fcf3 */ NULL, +/* fcf4 */ NULL, +/* fcf5 */ NULL, +/* fcf6 */ NULL, +/* fcf7 */ NULL, +/* fcf8 */ NULL, +/* fcf9 */ NULL, +/* fcfa */ NULL, +/* fcfb */ NULL, +/* fcfc */ NULL, +/* fcfd */ NULL, +/* fcfe */ NULL, +/* fcff */ NULL, +/* fd00 */ NULL, +/* fd01 */ NULL, +/* fd02 */ NULL, +/* fd03 */ NULL, +/* fd04 */ NULL, +/* fd05 */ NULL, +/* fd06 */ NULL, +/* fd07 */ NULL, +/* fd08 */ NULL, +/* fd09 */ NULL, +/* fd0a */ NULL, +/* fd0b */ NULL, +/* fd0c */ NULL, +/* fd0d */ NULL, +/* fd0e */ NULL, +/* fd0f */ NULL, +/* fd10 */ NULL, +/* fd11 */ NULL, +/* fd12 */ NULL, +/* fd13 */ NULL, +/* fd14 */ NULL, +/* fd15 */ NULL, +/* fd16 */ NULL, +/* fd17 */ NULL, +/* fd18 */ NULL, +/* fd19 */ NULL, +/* fd1a */ NULL, +/* fd1b */ NULL, +/* fd1c */ NULL, +/* fd1d */ NULL, +/* fd1e */ NULL, +/* fd1f */ NULL, +/* fd20 */ NULL, +/* fd21 */ NULL, +/* fd22 */ NULL, +/* fd23 */ NULL, +/* fd24 */ NULL, +/* fd25 */ NULL, +/* fd26 */ NULL, +/* fd27 */ NULL, +/* fd28 */ NULL, +/* fd29 */ NULL, +/* fd2a */ NULL, +/* fd2b */ NULL, +/* fd2c */ NULL, +/* fd2d */ NULL, +/* fd2e */ NULL, +/* fd2f */ NULL, +/* fd30 */ NULL, +/* fd31 */ NULL, +/* fd32 */ NULL, +/* fd33 */ NULL, +/* fd34 */ NULL, +/* fd35 */ NULL, +/* fd36 */ NULL, +/* fd37 */ NULL, +/* fd38 */ NULL, +/* fd39 */ NULL, +/* fd3a */ NULL, +/* fd3b */ NULL, +/* fd3c */ NULL, +/* fd3d */ NULL, +/* fd3e */ NULL, +/* fd3f */ NULL, +/* fd40 */ NULL, +/* fd41 */ NULL, +/* fd42 */ NULL, +/* fd43 */ NULL, +/* fd44 */ NULL, +/* fd45 */ NULL, +/* fd46 */ NULL, +/* fd47 */ NULL, +/* fd48 */ NULL, +/* fd49 */ NULL, +/* fd4a */ NULL, +/* fd4b */ NULL, +/* fd4c */ NULL, +/* fd4d */ NULL, +/* fd4e */ NULL, +/* fd4f */ NULL, +/* fd50 */ NULL, +/* fd51 */ NULL, +/* fd52 */ NULL, +/* fd53 */ NULL, +/* fd54 */ NULL, +/* fd55 */ NULL, +/* fd56 */ NULL, +/* fd57 */ NULL, +/* fd58 */ NULL, +/* fd59 */ NULL, +/* fd5a */ NULL, +/* fd5b */ NULL, +/* fd5c */ NULL, +/* fd5d */ NULL, +/* fd5e */ NULL, +/* fd5f */ NULL, +/* fd60 */ NULL, +/* fd61 */ NULL, +/* fd62 */ NULL, +/* fd63 */ NULL, +/* fd64 */ NULL, +/* fd65 */ NULL, +/* fd66 */ NULL, +/* fd67 */ NULL, +/* fd68 */ NULL, +/* fd69 */ NULL, +/* fd6a */ NULL, +/* fd6b */ NULL, +/* fd6c */ NULL, +/* fd6d */ NULL, +/* fd6e */ NULL, +/* fd6f */ NULL, +/* fd70 */ NULL, +/* fd71 */ NULL, +/* fd72 */ NULL, +/* fd73 */ NULL, +/* fd74 */ NULL, +/* fd75 */ NULL, +/* fd76 */ NULL, +/* fd77 */ NULL, +/* fd78 */ NULL, +/* fd79 */ NULL, +/* fd7a */ NULL, +/* fd7b */ NULL, +/* fd7c */ NULL, +/* fd7d */ NULL, +/* fd7e */ NULL, +/* fd7f */ NULL, +/* fd80 */ NULL, +/* fd81 */ NULL, +/* fd82 */ NULL, +/* fd83 */ NULL, +/* fd84 */ NULL, +/* fd85 */ NULL, +/* fd86 */ NULL, +/* fd87 */ NULL, +/* fd88 */ NULL, +/* fd89 */ NULL, +/* fd8a */ NULL, +/* fd8b */ NULL, +/* fd8c */ NULL, +/* fd8d */ NULL, +/* fd8e */ NULL, +/* fd8f */ NULL, +/* fd90 */ NULL, +/* fd91 */ NULL, +/* fd92 */ NULL, +/* fd93 */ NULL, +/* fd94 */ NULL, +/* fd95 */ NULL, +/* fd96 */ NULL, +/* fd97 */ NULL, +/* fd98 */ NULL, +/* fd99 */ NULL, +/* fd9a */ NULL, +/* fd9b */ NULL, +/* fd9c */ NULL, +/* fd9d */ NULL, +/* fd9e */ NULL, +/* fd9f */ NULL, +/* fda0 */ NULL, +/* fda1 */ NULL, +/* fda2 */ NULL, +/* fda3 */ NULL, +/* fda4 */ NULL, +/* fda5 */ NULL, +/* fda6 */ NULL, +/* fda7 */ NULL, +/* fda8 */ NULL, +/* fda9 */ NULL, +/* fdaa */ NULL, +/* fdab */ NULL, +/* fdac */ NULL, +/* fdad */ NULL, +/* fdae */ NULL, +/* fdaf */ NULL, +/* fdb0 */ NULL, +/* fdb1 */ NULL, +/* fdb2 */ NULL, +/* fdb3 */ NULL, +/* fdb4 */ NULL, +/* fdb5 */ NULL, +/* fdb6 */ NULL, +/* fdb7 */ NULL, +/* fdb8 */ NULL, +/* fdb9 */ NULL, +/* fdba */ NULL, +/* fdbb */ NULL, +/* fdbc */ NULL, +/* fdbd */ NULL, +/* fdbe */ NULL, +/* fdbf */ NULL, +/* fdc0 */ NULL, +/* fdc1 */ NULL, +/* fdc2 */ NULL, +/* fdc3 */ NULL, +/* fdc4 */ NULL, +/* fdc5 */ NULL, +/* fdc6 */ NULL, +/* fdc7 */ NULL, +/* fdc8 */ NULL, +/* fdc9 */ NULL, +/* fdca */ NULL, +/* fdcb */ NULL, +/* fdcc */ NULL, +/* fdcd */ NULL, +/* fdce */ NULL, +/* fdcf */ NULL, +/* fdd0 */ NULL, +/* fdd1 */ NULL, +/* fdd2 */ NULL, +/* fdd3 */ NULL, +/* fdd4 */ NULL, +/* fdd5 */ NULL, +/* fdd6 */ NULL, +/* fdd7 */ NULL, +/* fdd8 */ NULL, +/* fdd9 */ NULL, +/* fdda */ NULL, +/* fddb */ NULL, +/* fddc */ NULL, +/* fddd */ NULL, +/* fdde */ NULL, +/* fddf */ NULL, +/* fde0 */ NULL, +/* fde1 */ NULL, +/* fde2 */ NULL, +/* fde3 */ NULL, +/* fde4 */ NULL, +/* fde5 */ NULL, +/* fde6 */ NULL, +/* fde7 */ NULL, +/* fde8 */ NULL, +/* fde9 */ NULL, +/* fdea */ NULL, +/* fdeb */ NULL, +/* fdec */ NULL, +/* fded */ NULL, +/* fdee */ NULL, +/* fdef */ NULL, +/* fdf0 */ NULL, +/* fdf1 */ NULL, +/* fdf2 */ NULL, +/* fdf3 */ NULL, +/* fdf4 */ NULL, +/* fdf5 */ NULL, +/* fdf6 */ NULL, +/* fdf7 */ NULL, +/* fdf8 */ NULL, +/* fdf9 */ NULL, +/* fdfa */ NULL, +/* fdfb */ NULL, +/* fdfc */ NULL, +/* fdfd */ NULL, +/* fdfe */ NULL, +/* fdff */ NULL, +/* fe00 */ NULL, +/* fe01 */ NULL, +/* fe02 */ NULL, +/* fe03 */ NULL, +/* fe04 */ NULL, +/* fe05 */ NULL, +/* fe06 */ NULL, +/* fe07 */ NULL, +/* fe08 */ NULL, +/* fe09 */ NULL, +/* fe0a */ NULL, +/* fe0b */ NULL, +/* fe0c */ NULL, +/* fe0d */ NULL, +/* fe0e */ NULL, +/* fe0f */ NULL, +/* fe10 */ NULL, +/* fe11 */ NULL, +/* fe12 */ NULL, +/* fe13 */ NULL, +/* fe14 */ NULL, +/* fe15 */ NULL, +/* fe16 */ NULL, +/* fe17 */ NULL, +/* fe18 */ NULL, +/* fe19 */ NULL, +/* fe1a */ NULL, +/* fe1b */ NULL, +/* fe1c */ NULL, +/* fe1d */ NULL, +/* fe1e */ NULL, +/* fe1f */ NULL, +/* fe20 */ NULL, +/* fe21 */ NULL, +/* fe22 */ NULL, +/* fe23 */ NULL, +/* fe24 */ NULL, +/* fe25 */ NULL, +/* fe26 */ NULL, +/* fe27 */ NULL, +/* fe28 */ NULL, +/* fe29 */ NULL, +/* fe2a */ NULL, +/* fe2b */ NULL, +/* fe2c */ NULL, +/* fe2d */ NULL, +/* fe2e */ NULL, +/* fe2f */ NULL, +/* fe30 */ NULL, +/* fe31 */ NULL, +/* fe32 */ NULL, +/* fe33 */ NULL, +/* fe34 */ NULL, +/* fe35 */ NULL, +/* fe36 */ NULL, +/* fe37 */ NULL, +/* fe38 */ NULL, +/* fe39 */ NULL, +/* fe3a */ NULL, +/* fe3b */ NULL, +/* fe3c */ NULL, +/* fe3d */ NULL, +/* fe3e */ NULL, +/* fe3f */ NULL, +/* fe40 */ NULL, +/* fe41 */ NULL, +/* fe42 */ NULL, +/* fe43 */ NULL, +/* fe44 */ NULL, +/* fe45 */ NULL, +/* fe46 */ NULL, +/* fe47 */ NULL, +/* fe48 */ NULL, +/* fe49 */ NULL, +/* fe4a */ NULL, +/* fe4b */ NULL, +/* fe4c */ NULL, +/* fe4d */ NULL, +/* fe4e */ NULL, +/* fe4f */ NULL, +/* fe50 */ NULL, +/* fe51 */ NULL, +/* fe52 */ NULL, +/* fe53 */ NULL, +/* fe54 */ NULL, +/* fe55 */ NULL, +/* fe56 */ NULL, +/* fe57 */ NULL, +/* fe58 */ NULL, +/* fe59 */ NULL, +/* fe5a */ NULL, +/* fe5b */ NULL, +/* fe5c */ NULL, +/* fe5d */ NULL, +/* fe5e */ NULL, +/* fe5f */ NULL, +/* fe60 */ NULL, +/* fe61 */ NULL, +/* fe62 */ NULL, +/* fe63 */ NULL, +/* fe64 */ NULL, +/* fe65 */ NULL, +/* fe66 */ NULL, +/* fe67 */ NULL, +/* fe68 */ NULL, +/* fe69 */ NULL, +/* fe6a */ NULL, +/* fe6b */ NULL, +/* fe6c */ NULL, +/* fe6d */ NULL, +/* fe6e */ NULL, +/* fe6f */ NULL, +/* fe70 */ NULL, +/* fe71 */ NULL, +/* fe72 */ NULL, +/* fe73 */ NULL, +/* fe74 */ NULL, +/* fe75 */ NULL, +/* fe76 */ NULL, +/* fe77 */ NULL, +/* fe78 */ NULL, +/* fe79 */ NULL, +/* fe7a */ NULL, +/* fe7b */ NULL, +/* fe7c */ NULL, +/* fe7d */ NULL, +/* fe7e */ NULL, +/* fe7f */ NULL, +/* fe80 */ NULL, +/* fe81 */ NULL, +/* fe82 */ NULL, +/* fe83 */ NULL, +/* fe84 */ NULL, +/* fe85 */ NULL, +/* fe86 */ NULL, +/* fe87 */ NULL, +/* fe88 */ NULL, +/* fe89 */ NULL, +/* fe8a */ NULL, +/* fe8b */ NULL, +/* fe8c */ NULL, +/* fe8d */ NULL, +/* fe8e */ NULL, +/* fe8f */ NULL, +/* fe90 */ NULL, +/* fe91 */ NULL, +/* fe92 */ NULL, +/* fe93 */ NULL, +/* fe94 */ NULL, +/* fe95 */ NULL, +/* fe96 */ NULL, +/* fe97 */ NULL, +/* fe98 */ NULL, +/* fe99 */ NULL, +/* fe9a */ NULL, +/* fe9b */ NULL, +/* fe9c */ NULL, +/* fe9d */ NULL, +/* fe9e */ NULL, +/* fe9f */ NULL, +/* fea0 */ NULL, +/* fea1 */ NULL, +/* fea2 */ NULL, +/* fea3 */ NULL, +/* fea4 */ NULL, +/* fea5 */ NULL, +/* fea6 */ NULL, +/* fea7 */ NULL, +/* fea8 */ NULL, +/* fea9 */ NULL, +/* feaa */ NULL, +/* feab */ NULL, +/* feac */ NULL, +/* fead */ NULL, +/* feae */ NULL, +/* feaf */ NULL, +/* feb0 */ NULL, +/* feb1 */ NULL, +/* feb2 */ NULL, +/* feb3 */ NULL, +/* feb4 */ NULL, +/* feb5 */ NULL, +/* feb6 */ NULL, +/* feb7 */ NULL, +/* feb8 */ NULL, +/* feb9 */ NULL, +/* feba */ NULL, +/* febb */ NULL, +/* febc */ NULL, +/* febd */ NULL, +/* febe */ NULL, +/* febf */ NULL, +/* fec0 */ NULL, +/* fec1 */ NULL, +/* fec2 */ NULL, +/* fec3 */ NULL, +/* fec4 */ NULL, +/* fec5 */ NULL, +/* fec6 */ NULL, +/* fec7 */ NULL, +/* fec8 */ NULL, +/* fec9 */ NULL, +/* feca */ NULL, +/* fecb */ NULL, +/* fecc */ NULL, +/* fecd */ NULL, +/* fece */ NULL, +/* fecf */ NULL, +/* fed0 */ NULL, +/* fed1 */ NULL, +/* fed2 */ NULL, +/* fed3 */ NULL, +/* fed4 */ NULL, +/* fed5 */ NULL, +/* fed6 */ NULL, +/* fed7 */ NULL, +/* fed8 */ NULL, +/* fed9 */ NULL, +/* feda */ NULL, +/* fedb */ NULL, +/* fedc */ NULL, +/* fedd */ NULL, +/* fede */ NULL, +/* fedf */ NULL, +/* fee0 */ NULL, +/* fee1 */ NULL, +/* fee2 */ NULL, +/* fee3 */ NULL, +/* fee4 */ NULL, +/* fee5 */ NULL, +/* fee6 */ NULL, +/* fee7 */ NULL, +/* fee8 */ NULL, +/* fee9 */ NULL, +/* feea */ NULL, +/* feeb */ NULL, +/* feec */ NULL, +/* feed */ NULL, +/* feee */ NULL, +/* feef */ NULL, +/* fef0 */ NULL, +/* fef1 */ NULL, +/* fef2 */ NULL, +/* fef3 */ NULL, +/* fef4 */ NULL, +/* fef5 */ NULL, +/* fef6 */ NULL, +/* fef7 */ NULL, +/* fef8 */ NULL, +/* fef9 */ NULL, +/* fefa */ NULL, +/* fefb */ NULL, +/* fefc */ NULL, +/* fefd */ NULL, +/* fefe */ NULL, +/* feff */ NULL, +/* ff00 */ NULL, +/* ff01 */ NULL, +/* ff02 */ NULL, +/* ff03 */ NULL, +/* ff04 */ NULL, +/* ff05 */ NULL, +/* ff06 */ NULL, +/* ff07 */ NULL, +/* ff08 */ NULL, +/* ff09 */ NULL, +/* ff0a */ NULL, +/* ff0b */ NULL, +/* ff0c */ NULL, +/* ff0d */ NULL, +/* ff0e */ NULL, +/* ff0f */ NULL, +/* ff10 */ NULL, +/* ff11 */ NULL, +/* ff12 */ NULL, +/* ff13 */ NULL, +/* ff14 */ NULL, +/* ff15 */ NULL, +/* ff16 */ NULL, +/* ff17 */ NULL, +/* ff18 */ NULL, +/* ff19 */ NULL, +/* ff1a */ NULL, +/* ff1b */ NULL, +/* ff1c */ NULL, +/* ff1d */ NULL, +/* ff1e */ NULL, +/* ff1f */ NULL, +/* ff20 */ NULL, +/* ff21 */ NULL, +/* ff22 */ NULL, +/* ff23 */ NULL, +/* ff24 */ NULL, +/* ff25 */ NULL, +/* ff26 */ NULL, +/* ff27 */ NULL, +/* ff28 */ NULL, +/* ff29 */ NULL, +/* ff2a */ NULL, +/* ff2b */ NULL, +/* ff2c */ NULL, +/* ff2d */ NULL, +/* ff2e */ NULL, +/* ff2f */ NULL, +/* ff30 */ NULL, +/* ff31 */ NULL, +/* ff32 */ NULL, +/* ff33 */ NULL, +/* ff34 */ NULL, +/* ff35 */ NULL, +/* ff36 */ NULL, +/* ff37 */ NULL, +/* ff38 */ NULL, +/* ff39 */ NULL, +/* ff3a */ NULL, +/* ff3b */ NULL, +/* ff3c */ NULL, +/* ff3d */ NULL, +/* ff3e */ NULL, +/* ff3f */ NULL, +/* ff40 */ NULL, +/* ff41 */ NULL, +/* ff42 */ NULL, +/* ff43 */ NULL, +/* ff44 */ NULL, +/* ff45 */ NULL, +/* ff46 */ NULL, +/* ff47 */ NULL, +/* ff48 */ NULL, +/* ff49 */ NULL, +/* ff4a */ NULL, +/* ff4b */ NULL, +/* ff4c */ NULL, +/* ff4d */ NULL, +/* ff4e */ NULL, +/* ff4f */ NULL, +/* ff50 */ NULL, +/* ff51 */ NULL, +/* ff52 */ NULL, +/* ff53 */ NULL, +/* ff54 */ NULL, +/* ff55 */ NULL, +/* ff56 */ NULL, +/* ff57 */ NULL, +/* ff58 */ NULL, +/* ff59 */ NULL, +/* ff5a */ NULL, +/* ff5b */ NULL, +/* ff5c */ NULL, +/* ff5d */ NULL, +/* ff5e */ NULL, +/* ff5f */ NULL, +/* ff60 */ NULL, +/* ff61 */ NULL, +/* ff62 */ NULL, +/* ff63 */ NULL, +/* ff64 */ NULL, +/* ff65 */ NULL, +/* ff66 */ NULL, +/* ff67 */ NULL, +/* ff68 */ NULL, +/* ff69 */ NULL, +/* ff6a */ NULL, +/* ff6b */ NULL, +/* ff6c */ NULL, +/* ff6d */ NULL, +/* ff6e */ NULL, +/* ff6f */ NULL, +/* ff70 */ NULL, +/* ff71 */ NULL, +/* ff72 */ NULL, +/* ff73 */ NULL, +/* ff74 */ NULL, +/* ff75 */ NULL, +/* ff76 */ NULL, +/* ff77 */ NULL, +/* ff78 */ NULL, +/* ff79 */ NULL, +/* ff7a */ NULL, +/* ff7b */ NULL, +/* ff7c */ NULL, +/* ff7d */ NULL, +/* ff7e */ NULL, +/* ff7f */ NULL, +/* ff80 */ NULL, +/* ff81 */ NULL, +/* ff82 */ NULL, +/* ff83 */ NULL, +/* ff84 */ NULL, +/* ff85 */ NULL, +/* ff86 */ NULL, +/* ff87 */ NULL, +/* ff88 */ NULL, +/* ff89 */ NULL, +/* ff8a */ NULL, +/* ff8b */ NULL, +/* ff8c */ NULL, +/* ff8d */ NULL, +/* ff8e */ NULL, +/* ff8f */ NULL, +/* ff90 */ NULL, +/* ff91 */ NULL, +/* ff92 */ NULL, +/* ff93 */ NULL, +/* ff94 */ NULL, +/* ff95 */ NULL, +/* ff96 */ NULL, +/* ff97 */ NULL, +/* ff98 */ NULL, +/* ff99 */ NULL, +/* ff9a */ NULL, +/* ff9b */ NULL, +/* ff9c */ NULL, +/* ff9d */ NULL, +/* ff9e */ NULL, +/* ff9f */ NULL, +/* ffa0 */ NULL, +/* ffa1 */ NULL, +/* ffa2 */ NULL, +/* ffa3 */ NULL, +/* ffa4 */ NULL, +/* ffa5 */ NULL, +/* ffa6 */ NULL, +/* ffa7 */ NULL, +/* ffa8 */ NULL, +/* ffa9 */ NULL, +/* ffaa */ NULL, +/* ffab */ NULL, +/* ffac */ NULL, +/* ffad */ NULL, +/* ffae */ NULL, +/* ffaf */ NULL, +/* ffb0 */ NULL, +/* ffb1 */ NULL, +/* ffb2 */ NULL, +/* ffb3 */ NULL, +/* ffb4 */ NULL, +/* ffb5 */ NULL, +/* ffb6 */ NULL, +/* ffb7 */ NULL, +/* ffb8 */ NULL, +/* ffb9 */ NULL, +/* ffba */ NULL, +/* ffbb */ NULL, +/* ffbc */ NULL, +/* ffbd */ NULL, +/* ffbe */ NULL, +/* ffbf */ NULL, +/* ffc0 */ NULL, +/* ffc1 */ NULL, +/* ffc2 */ NULL, +/* ffc3 */ NULL, +/* ffc4 */ NULL, +/* ffc5 */ NULL, +/* ffc6 */ NULL, +/* ffc7 */ NULL, +/* ffc8 */ NULL, +/* ffc9 */ NULL, +/* ffca */ NULL, +/* ffcb */ NULL, +/* ffcc */ NULL, +/* ffcd */ NULL, +/* ffce */ NULL, +/* ffcf */ NULL, +/* ffd0 */ NULL, +/* ffd1 */ NULL, +/* ffd2 */ NULL, +/* ffd3 */ NULL, +/* ffd4 */ NULL, +/* ffd5 */ NULL, +/* ffd6 */ NULL, +/* ffd7 */ NULL, +/* ffd8 */ NULL, +/* ffd9 */ NULL, +/* ffda */ NULL, +/* ffdb */ NULL, +/* ffdc */ NULL, +/* ffdd */ NULL, +/* ffde */ NULL, +/* ffdf */ NULL, +/* ffe0 */ NULL, +/* ffe1 */ NULL, +/* ffe2 */ NULL, +/* ffe3 */ NULL, +/* ffe4 */ NULL, +/* ffe5 */ NULL, +/* ffe6 */ NULL, +/* ffe7 */ NULL, +/* ffe8 */ NULL, +/* ffe9 */ NULL, +/* ffea */ NULL, +/* ffeb */ NULL, +/* ffec */ NULL, +/* ffed */ NULL, +/* ffee */ NULL, +/* ffef */ NULL, +/* fff0 */ NULL, +/* fff1 */ NULL, +/* fff2 */ NULL, +/* fff3 */ NULL, +/* fff4 */ NULL, +/* fff5 */ NULL, +/* fff6 */ NULL, +/* fff7 */ NULL, +/* fff8 */ NULL, +/* fff9 */ NULL, +/* fffa */ NULL, +/* fffb */ NULL, +/* fffc */ NULL, +/* fffd */ NULL, +/* fffe */ NULL, +/* ffff */ NULL +}; + +/* Adobe also allows for alternate names */ +const struct psaltnames { + char *name; + int unicode; +} psaltuninames[] = { +/* These names are those that Adobe says people should use */ +/* in their naming conventions file, but which they do not */ +/* actually list in the glyph list files. I don't understand */ +/* their logic */ +/* http://partners.adobe.com/asn/tech/type/unicodegn.html */ + { "cent.inferior", 0xf6df }, + { "cent.superior", 0xf6e0 }, + { "comma.inferior", 0xf6e1 }, + { "comma.superior", 0xf6e2 }, + { "dollar.inferior", 0xf6e3 }, + { "dollar.superior", 0xf6e4 }, + { "hyphen.inferior", 0xf6e5 }, + { "hyphen.superior", 0xf6e6 }, + { "period.inferior", 0xf6e7 }, + { "period.superior", 0xf6e8 }, + { "a.superior", 0xf6e9 }, + { "b.superior", 0xf6ea }, + { "d.superior", 0xf6eb }, + { "e.superior", 0xf6ec }, + { "i.superior", 0xf6ed }, + { "l.superior", 0xf6ee }, + { "m.superior", 0xf6ef }, + { "o.superior", 0xf6f0 }, + { "r.superior", 0xf6f1 }, + { "s.superior", 0xf6f2 }, + { "t.superior", 0xf6f3 }, + { "breve.sc", 0xf6f4 }, + { "caron.sc", 0xf6f5 }, + { "circumflex.sc", 0xf6f6 }, + { "dotaccent.sc", 0xf6f7 }, + { "hungarumlaut.sc", 0xf6f8 }, + { "lslash.sc", 0xf6f9 }, + { "oe.sc", 0xf6fa }, + { "ogonek.sc", 0xf6fb }, + { "ring.sc", 0xf6fc }, + { "scaron.sc", 0xf6fd }, + { "tilde.sc", 0xf6fe }, + { "zcaron.sc", 0xf6ff }, + { "exclam.sc", 0xf721 }, + { "dollar.oldstyle", 0xf724 }, + { "ampersand.sc", 0xf726 }, + { "zero.oldstyle", 0xf730 }, + { "one.oldstyle", 0xf731 }, + { "two.oldstyle", 0xf732 }, + { "three.oldstyle", 0xf733 }, + { "four.oldstyle", 0xf734 }, + { "five.oldstyle", 0xf735 }, + { "six.oldstyle", 0xf736 }, + { "seven.oldstyle", 0xf737 }, + { "eight.oldstyle", 0xf738 }, + { "nine.oldstyle", 0xf739 }, + { "question.sc", 0xf73f }, + { "grave.sc", 0xf760 }, + { "a.sc", 0xf761 }, + { "b.sc", 0xf762 }, + { "c.sc", 0xf763 }, + { "d.sc", 0xf764 }, + { "e.sc", 0xf765 }, + { "f.sc", 0xf766 }, + { "g.sc", 0xf767 }, + { "h.sc", 0xf768 }, + { "i.sc", 0xf769 }, + { "j.sc", 0xf76a }, + { "k.sc", 0xf76b }, + { "l.sc", 0xf76c }, + { "m.sc", 0xf76d }, + { "n.sc", 0xf76e }, + { "o.sc", 0xf76f }, + { "p.sc", 0xf770 }, + { "q.sc", 0xf771 }, + { "r.sc", 0xf772 }, + { "s.sc", 0xf773 }, + { "t.sc", 0xf774 }, + { "u.sc", 0xf775 }, + { "v.sc", 0xf776 }, + { "w.sc", 0xf777 }, + { "x.sc", 0xf778 }, + { "y.sc", 0xf779 }, + { "z.sc", 0xf77a }, + { "exclamdown.sc", 0xf7a1 }, + { "cent.oldstyle", 0xf7a2 }, + { "dieresis.sc", 0xf7a8 }, + { "macron.sc", 0xf7af }, + { "acute.sc", 0xf7b4 }, + { "cedilla.sc", 0xf7b8 }, + { "questiondown.sc", 0xf7bf }, + { "agrave.sc", 0xf7e0 }, + { "aacute.sc", 0xf7e1 }, + { "acircumflex.sc", 0xf7e2 }, + { "atilde.sc", 0xf7e3 }, + { "adieresis.sc", 0xf7e4 }, + { "aring.sc", 0xf7e5 }, + { "ae.sc", 0xf7e6 }, + { "ccedilla.sc", 0xf7e7 }, + { "egrave.sc", 0xf7e8 }, + { "eacute.sc", 0xf7e9 }, + { "ecircumflex.sc", 0xf7ea }, + { "edieresis.sc", 0xf7eb }, + { "igrave.sc", 0xf7ec }, + { "iacute.sc", 0xf7ed }, + { "icircumflex.sc", 0xf7ee }, + { "idieresis.sc", 0xf7ef }, + { "eth.sc", 0xf7f0 }, + { "ntilde.sc", 0xf7f1 }, + { "ograve.sc", 0xf7f2 }, + { "oacute.sc", 0xf7f3 }, + { "ocircumflex.sc", 0xf7f4 }, + { "otilde.sc", 0xf7f5 }, + { "odieresis.sc", 0xf7f6 }, + { "oslash.sc", 0xf7f8 }, + { "ugrave.sc", 0xf7f9 }, + { "uacute.sc", 0xf7fa }, + { "ucircumflex.sc", 0xf7fb }, + { "udieresis.sc", 0xf7fc }, + { "yacute.sc", 0xf7fd }, + { "thorn.sc", 0xf7fe }, + { "ydieresis.sc", 0xf7ff }, + { "f_i", 0xfb01 }, + { "f_l", 0xfb02 }, + { "one.superior", 0x00b9 }, + { "two.superior", 0x00b2 }, + { "three.superior", 0x00b3 }, + { "parenleft.superior", 0x207d }, + { "parenright.superior", 0x207e }, + { "uni2014.alt", 0xf6de }, + { "n.superior", 0x207f }, + { "f_f", 0xfb00 }, + { "f_f_i", 0xfb03 }, + { "f_f_l", 0xfb04 }, + { "parenleft.inferior", 0x208d }, + { "parenright.inferior", 0x208e }, + { "one.fitted", 0xf6dc }, + { "R_p", 0xf6dd }, + { "zero.superior", 0x2070 }, + { "four.superior", 0x2074 }, + { "five.superior", 0x2075 }, + { "six.superior", 0x2076 }, + { "seven.superior", 0x2077 }, + { "eight.superior", 0x2078 }, + { "nine.superior", 0x2079 }, + { "zero.inferior", 0x2080 }, + { "one.inferior", 0x2081 }, + { "two.inferior", 0x2082 }, + { "three.inferior", 0x2083 }, + { "four.inferior", 0x2084 }, + { "five.inferior", 0x2085 }, + { "six.inferior", 0x2086 }, + { "seven.inferior", 0x2087 }, + { "eight.inferior", 0x2088 }, + { "nine.inferior", 0x2089 }, + { "mu.greek", 0x03bc }, + { "Delta.greek", 0x0394 }, + { "Omega.greek", 0x03a9 }, + { "sigma.end", 0x03c2 }, + { "beta.alt", 0x03d0 }, + { "kappa.alt", 0x03f0 }, + { "theta.alt", 0x03d1 }, + { "Upsilon.alt", 0x03d2 }, + { "phi.alt", 0x03d5 }, + { "pi.alt", 0x03d6 }, + { "A.cyr", 0x0410 }, + { "Ghe.up", 0x0490 }, + { "I.cyr", 0x0418 }, + { "I.short", 0x0419 }, + { "O.cyr", 0x041e }, + { "U.cyr", 0x0423 }, + { "E.cyr", 0x042d }, + { "Ie.ukran", 0x0404 }, + { "I.ukran", 0x0406 }, + { "U.short", 0x040e }, + { "a.cyr", 0x0430 }, + { "ghe.up", 0x0491 }, + { "i.cyr", 0x0438 }, + { "i.short", 0x0439 }, + { "o.cyr", 0x043e }, + { "u.cyr", 0x0443 }, + { "e.cyr", 0x044d }, + { "ie.ukran", 0x0454 }, + { "i.ukran", 0x0456 }, + { "u.short", 0x045e }, + { "afii10068.ital", 0xf6c4 }, + { "ghe.ital", 0xf6c4 }, + { "afii10066.ital", 0xf6c5 }, + { "be.alt", 0xf6c5 }, + { "afii10069.ital", 0xf6c6 }, + { "de.ital", 0xf6c6 }, + { "afii10081.ital", 0xf6c7 }, + { "pe.ital", 0xf6c7 }, + { "afii10084.ital", 0xf6c8 }, + { "te.ital", 0xf6c8 }, + { "Omega.math", 0x2126 }, + { "Delta.math", 0x2206 }, + { "acute.cap", 0xf6c9 }, + { "caron.cap", 0xf6ca }, + { "dieresis.cap", 0xf6cb }, + { "space_uni0308_uni0301.cap", 0xf6cc }, + { "space_uni0308_uni0300.cap", 0xf6cd }, + { "grave.cap", 0xf6ce }, + { "hungarumlaut.cap", 0xf6cf }, + { "macron.cap", 0xf6d0 }, + { "breve.cyrcap", 0xf6d1 }, + { "circumflex.cyrcap", 0xf6d2 }, + { "space_uni030F.cap", 0xf6d3 }, + { "breve.cyr", 0xf6d4 }, + { "circumflex.cyr", 0xf6d5 }, + { "space_uni030F", 0xf6d6 }, + { "space_uni0308_uni0301", 0xf6d7 }, + { "space_uni0308_uni0300", 0xf6d8 }, + { "commaaccent.cap", 0xf634 }, + { "commaaccent.small", 0xf635 }, + { "pi.math", 0xf636 }, + { "h.superior", 0xf637 }, + { "zero.slash", 0xf638 }, + { "zero.fitted", 0xf639 }, + { "one.fitted", 0xf6dc }, + { "two.fitted", 0xf63a }, + { "three.fitted", 0xf63b }, + { "four.fitted", 0xf63c }, + { "five.fitted", 0xf63d }, + { "six.fitted", 0xf63e }, + { "seven.fitted", 0xf63f }, + { "eight.fitted", 0xf640 }, + { "nine.fitted", 0xf641 }, + { "percent.oldstyle", 0xf642 }, + { "perthousand.oldstyle", 0xf628 }, + { "zero.taboldstyle", 0xf643 }, + { "one.taboldstyle", 0xf644 }, + { "two.taboldstyle", 0xf645 }, + { "three.taboldstyle", 0xf646 }, + { "four.taboldstyle", 0xf647 }, + { "five.taboldstyle", 0xf648 }, + { "six.taboldstyle", 0xf649 }, + { "seven.taboldstyle", 0xf64a }, + { "eight.taboldstyle", 0xf64b }, + { "nine.taboldstyle", 0xf64c }, + { "colonmonetary.taboldstyle", 0xf64d }, + { "Euro.taboldstyle", 0xf64e }, + { "florin.taboldstyle", 0xf64f }, + { "numbersign.taboldstyle", 0xf650 }, + { "sterling.taboldstyle", 0xf651 }, + { "yen.taboldstyle", 0xf652 }, + { "dollar.taboldstyle", 0xf653 }, + { "cent.taboldstyle", 0xf654 }, + { "zero.denominator", 0xf655 }, + { "one.denominator", 0xf656 }, + { "two.denominator", 0xf657 }, + { "three.denominator", 0xf658 }, + { "four.denominator", 0xf659 }, + { "five.denominator", 0xf65a }, + { "six.denominator", 0xf65b }, + { "seven.denominator", 0xf65c }, + { "eight.denominator", 0xf65d }, + { "nine.denominator", 0xf65e }, + { "comma.denominator", 0xf65f }, + { "period.denominator", 0xf660 }, + { "cent.denominator", 0xf629 }, + { "dollar.denominator", 0xf62a }, + { "hyphen.denominator", 0xf62b }, + { "parenleft.denominator", 0xf62c }, + { "parenright.denominator", 0xf62d }, + { "zero.numerator", 0xf661 }, + { "one.numerator", 0xf662 }, + { "two.numerator", 0xf663 }, + { "three.numerator", 0xf664 }, + { "four.numerator", 0xf665 }, + { "five.numerator", 0xf666 }, + { "six.numerator", 0xf667 }, + { "seven.numerator", 0xf668 }, + { "eight.numerator", 0xf669 }, + { "nine.numerator", 0xf66a }, + { "comma.numerator", 0xf66b }, + { "period.numerator", 0xf66c }, + { "cent.numerator", 0xf62e }, + { "dollar.numerator", 0xf62f }, + { "hyphen.numerator", 0xf630 }, + { "parenleft.numerator", 0xf631 }, + { "parenright.numerator", 0xf632 }, + { "Abreve.small", 0xf66d }, + { "Amacron.small", 0xf66e }, + { "Aogonek.small", 0xf66f }, + { "AEacute.small", 0xf670 }, + { "Cacute.small", 0xf671 }, + { "Ccaron.small", 0xf672 }, + { "Ccircumflex.small", 0xf673 }, + { "Cdotaccent.small", 0xf674 }, + { "Dcaron.small", 0xf675 }, + { "Dcroat.small", 0xf676 }, + { "Ebreve.small", 0xf677 }, + { "Ecaron.small", 0xf678 }, + { "Edotaccent.small", 0xf679 }, + { "Emacron.small", 0xf67a }, + { "Eng.small", 0xf67b }, + { "Eogonek.small", 0xf67c }, + { "Gbreve.small", 0xf67d }, + { "Gcircumflex.small", 0xf67e }, + { "Gcommaaccent.small", 0xf67f }, + { "Gdotaccent.small", 0xf680 }, + { "Hbar.small", 0xf681 }, + { "Hcircumflex.small", 0xf682 }, + { "Ibreve.small", 0xf683 }, + { "IJ.small", 0xf684 }, + { "Imacron.small", 0xf685 }, + { "Iogonek.small", 0xf686 }, + { "Itilde.small", 0xf687 }, + { "Jcircumflex.small", 0xf688 }, + { "Kcommaaccent.small", 0xf689 }, + { "Lacute.small", 0xf68a }, + { "Lcaron.small", 0xf68b }, + { "Lcommaaccent.small", 0xf68c }, + { "Ldot.small", 0xf68d }, + { "Nacute.small", 0xf68e }, + { "Ncaron.small", 0xf68f }, + { "Ncommaaccent.small", 0xf690 }, + { "Obreve.small", 0xf691 }, + { "Ohungarumlaut.small", 0xf692 }, + { "Omacron.small", 0xf693 }, + { "Oslashacute.small", 0xf694 }, + { "Racute.small", 0xf695 }, + { "Rcaron.small", 0xf696 }, + { "Rcommaaccent.small", 0xf697 }, + { "Sacute.small", 0xf698 }, + { "Scedilla.small", 0xf699 }, + { "Scircumflex.small", 0xf69a }, + { "Scommaaccent.small", 0xf69b }, + { "Tbar.small", 0xf69c }, + { "Tcaron.small", 0xf69d }, + { "Tcommaaccent.small", 0xf69e }, + { "Ubreve.small", 0xf69f }, + { "Uhungarumlaut.small", 0xf6a0 }, + { "Umacron.small", 0xf6a1 }, + { "Uogonek.small", 0xf6a2 }, + { "Uring.small", 0xf6a3 }, + { "Utilde.small", 0xf6a4 }, + { "Wacute.small", 0xf6a5 }, + { "Wcircumflex.small", 0xf6a6 }, + { "Wdieresis.small", 0xf6a7 }, + { "Wgrave.small", 0xf6a8 }, + { "Ycircumflex.small", 0xf6a9 }, + { "Ygrave.small", 0xf6aa }, + { "Zacute.small", 0xf6ab }, + { "Zdotaccent.small", 0xf6ac }, + { "Idotaccent.small", 0xf6ad }, + { "parenleft.cap", 0xf6ae }, + { "parenright.cap", 0xf6af }, + { "bracketleft.cap", 0xf6b0 }, + { "bracketright.cap", 0xf6b1 }, + { "braceleft.cap", 0xf6b2 }, + { "braceright.cap", 0xf6b3 }, + { "exclamdown.cap", 0xf6b4 }, + { "questiondown.cap", 0xf6b5 }, + { "guillemotleft.cap", 0xf6b6 }, + { "guillemotright.cap", 0xf6b7 }, + { "guilsinglleft.cap", 0xf6b8 }, + { "guilsinglright.cap", 0xf6b9 }, + { "hyphen.cap", 0xf6ba }, + { "endash.cap", 0xf6bb }, + { "emdash.cap", 0xf6bc }, + { "periodcentered.cap", 0xf6bd }, + { "at.cap", 0xf633 }, + { "s_t", 0xfb06 }, + { "longs_t", 0xfb05 }, + { "zero.slash", 0xf638 }, + { "j.dotless", 0xf6be }, + { "afii10066.ital", 0xf6c5 }, + { "afii10068.ital", 0xf6c4 }, + { "afii10069.ital", 0xf6c6 }, + { "afii10081.ital", 0xf6c7 }, + { "afii10084.ital", 0xf6c8 }, + { "registered.serif", 0xf6da }, + { "register.serif", 0xf6da }, + { "registered.sans", 0xf8e8 }, + { "register.sans", 0xf8e8 }, + { "trademark.sans", 0xf8ea }, + { "trademark.serif", 0xf6db }, + { "copyright.sans", 0xf8e9 }, + { "copyright.serif", 0xf6d9 }, + { "afii57689_afii57804", 0xfb2a }, + { "afii57689_afii57803", 0xfb2b }, + { "afii57669_afii57806", 0xfb4b }, + { "afii57718_afii57798", 0xfb1f }, + { "afii57669_afii57807", 0xfb35 }, + { ".null", 0x0000 }, + { "dialytika_perispomeni", 0x1fc1 }, + { "psili_varia", 0x1fcd }, + { "psili_oxia", 0x1fce }, + { "psili_perispomeni", 0x1fcf }, + { "dasia_varia", 0x1fdd }, + { "dasia_oxia", 0x1fde }, + { "dasia_perispomeni", 0x1fdf }, + { "dialytika_varia", 0x1fed }, + { "dialytika_oxia", 0x1fee }, + { "alpha.sc", 0xf500 }, + { "beta.sc", 0xf501 }, + { "gamma.sc", 0xf502 }, + { "delta.sc", 0xf503 }, + { "epsilon.sc", 0xf504 }, + { "zeta.sc", 0xf505 }, + { "eta.sc", 0xf506 }, + { "theta.sc", 0xf507 }, + { "iota.sc", 0xf508 }, + { "kappa.sc", 0xf509 }, + { "lambda.sc", 0xf50a }, + { "mu.sc", 0xf50b }, + { "nu.sc", 0xf50c }, + { "xi.sc", 0xf50d }, + { "omicron.sc", 0xf50e }, + { "pi.sc", 0xf50f }, + { "rho.sc", 0xf510 }, + { "sigma.sc", 0xf512 }, + { "tau.sc", 0xf513 }, + { "upsilon.sc", 0xf514 }, + { "phi.sc", 0xf515 }, + { "chi.sc", 0xf516 }, + { "psi.sc", 0xf517 }, + { "omega.sc", 0xf518 }, + { "iotadieresis.sc", 0xf519 }, + { "upsilondieresis.sc", 0xf51a }, +/* These names are from adobe's glyphlist (glyphlist.txt) */ +/* http://partners.adobe.com/asn/tech/type/glyphlist.txt */ + { "AEmacron", 0x01e2 }, + { "AEsmall", 0xf7e6 }, + { "Aacutesmall", 0xf7e1 }, + { "Abreveacute", 0x1eae }, + { "Abrevecyrillic", 0x04d0 }, + { "Abrevedotbelow", 0x1eb6 }, + { "Abrevegrave", 0x1eb0 }, + { "Abrevehookabove", 0x1eb2 }, + { "Abrevetilde", 0x1eb4 }, + { "Acaron", 0x01cd }, + { "Acircle", 0x24b6 }, + { "Acircumflexacute", 0x1ea4 }, + { "Acircumflexdotbelow", 0x1eac }, + { "Acircumflexgrave", 0x1ea6 }, + { "Acircumflexhookabove", 0x1ea8 }, + { "Acircumflexsmall", 0xf7e2 }, + { "Acircumflextilde", 0x1eaa }, + { "Acute", 0xf6c9 }, + { "Acutesmall", 0xf7b4 }, + { "Acyrillic", 0x0410 }, + { "Adblgrave", 0x0200 }, + { "Adieresiscyrillic", 0x04d2 }, + { "Adieresismacron", 0x01de }, + { "Adieresissmall", 0xf7e4 }, + { "Adotbelow", 0x1ea0 }, + { "Adotmacron", 0x01e0 }, + { "Agravesmall", 0xf7e0 }, + { "Ahookabove", 0x1ea2 }, + { "Aiecyrillic", 0x04d4 }, + { "Ainvertedbreve", 0x0202 }, + { "Amonospace", 0xff21 }, + { "Aringbelow", 0x1e00 }, + { "Aringsmall", 0xf7e5 }, + { "Asmall", 0xf761 }, + { "Atildesmall", 0xf7e3 }, + { "Aybarmenian", 0x0531 }, + { "Bcircle", 0x24b7 }, + { "Bdotaccent", 0x1e02 }, + { "Bdotbelow", 0x1e04 }, + { "Becyrillic", 0x0411 }, + { "Benarmenian", 0x0532 }, + { "Bhook", 0x0181 }, + { "Blinebelow", 0x1e06 }, + { "Bmonospace", 0xff22 }, + { "Brevesmall", 0xf6f4 }, + { "Bsmall", 0xf762 }, + { "Btopbar", 0x0182 }, + { "Caarmenian", 0x053e }, + { "Caron", 0xf6ca }, + { "Caronsmall", 0xf6f5 }, + { "Ccedillaacute", 0x1e08 }, + { "Ccedillasmall", 0xf7e7 }, + { "Ccircle", 0x24b8 }, + { "Cdot", 0x010a }, + { "Cedillasmall", 0xf7b8 }, + { "Chaarmenian", 0x0549 }, + { "Cheabkhasiancyrillic", 0x04bc }, + { "Checyrillic", 0x0427 }, + { "Chedescenderabkhasiancyrillic", 0x04be }, + { "Chedescendercyrillic", 0x04b6 }, + { "Chedieresiscyrillic", 0x04f4 }, + { "Cheharmenian", 0x0543 }, + { "Chekhakassiancyrillic", 0x04cb }, + { "Cheverticalstrokecyrillic", 0x04b8 }, + { "Chook", 0x0187 }, + { "Circumflexsmall", 0xf6f6 }, + { "Cmonospace", 0xff23 }, + { "Coarmenian", 0x0551 }, + { "Csmall", 0xf763 }, + { "DZ", 0x01f1 }, + { "DZcaron", 0x01c4 }, + { "Daarmenian", 0x0534 }, + { "Dafrican", 0x0189 }, + { "Dcedilla", 0x1e10 }, + { "Dcircle", 0x24b9 }, + { "Dcircumflexbelow", 0x1e12 }, + { "Ddotaccent", 0x1e0a }, + { "Ddotbelow", 0x1e0c }, + { "Decyrillic", 0x0414 }, + { "Deicoptic", 0x03ee }, + { "Deltagreek", 0x0394 }, + { "Dhook", 0x018a }, + { "Dieresis", 0xf6cb }, + { "DieresisAcute", 0xf6cc }, + { "DieresisGrave", 0xf6cd }, + { "Dieresissmall", 0xf7a8 }, + { "Digammagreek", 0x03dc }, + { "Djecyrillic", 0x0402 }, + { "Dlinebelow", 0x1e0e }, + { "Dmonospace", 0xff24 }, + { "Dotaccentsmall", 0xf6f7 }, + { "Dslash", 0x0110 }, + { "Dsmall", 0xf764 }, + { "Dtopbar", 0x018b }, + { "Dz", 0x01f2 }, + { "Dzcaron", 0x01c5 }, + { "Dzeabkhasiancyrillic", 0x04e0 }, + { "Dzecyrillic", 0x0405 }, + { "Dzhecyrillic", 0x040f }, + { "Eacutesmall", 0xf7e9 }, + { "Ecedillabreve", 0x1e1c }, + { "Echarmenian", 0x0535 }, + { "Ecircle", 0x24ba }, + { "Ecircumflexacute", 0x1ebe }, + { "Ecircumflexbelow", 0x1e18 }, + { "Ecircumflexdotbelow", 0x1ec6 }, + { "Ecircumflexgrave", 0x1ec0 }, + { "Ecircumflexhookabove", 0x1ec2 }, + { "Ecircumflexsmall", 0xf7ea }, + { "Ecircumflextilde", 0x1ec4 }, + { "Ecyrillic", 0x0404 }, + { "Edblgrave", 0x0204 }, + { "Edieresissmall", 0xf7eb }, + { "Edot", 0x0116 }, + { "Edotbelow", 0x1eb8 }, + { "Efcyrillic", 0x0424 }, + { "Egravesmall", 0xf7e8 }, + { "Eharmenian", 0x0537 }, + { "Ehookabove", 0x1eba }, + { "Eightroman", 0x2167 }, + { "Einvertedbreve", 0x0206 }, + { "Eiotifiedcyrillic", 0x0464 }, + { "Elcyrillic", 0x041b }, + { "Elevenroman", 0x216a }, + { "Emacronacute", 0x1e16 }, + { "Emacrongrave", 0x1e14 }, + { "Emcyrillic", 0x041c }, + { "Emonospace", 0xff25 }, + { "Encyrillic", 0x041d }, + { "Endescendercyrillic", 0x04a2 }, + { "Enghecyrillic", 0x04a4 }, + { "Enhookcyrillic", 0x04c7 }, + { "Eopen", 0x0190 }, + { "Ercyrillic", 0x0420 }, + { "Ereversed", 0x018e }, + { "Ereversedcyrillic", 0x042d }, + { "Escyrillic", 0x0421 }, + { "Esdescendercyrillic", 0x04aa }, + { "Esh", 0x01a9 }, + { "Esmall", 0xf765 }, + { "Etarmenian", 0x0538 }, + { "Ethsmall", 0xf7f0 }, + { "Etilde", 0x1ebc }, + { "Etildebelow", 0x1e1a }, + { "Ezh", 0x01b7 }, + { "Ezhcaron", 0x01ee }, + { "Ezhreversed", 0x01b8 }, + { "Fcircle", 0x24bb }, + { "Fdotaccent", 0x1e1e }, + { "Feharmenian", 0x0556 }, + { "Feicoptic", 0x03e4 }, + { "Fhook", 0x0191 }, + { "Fitacyrillic", 0x0472 }, + { "Fiveroman", 0x2164 }, + { "Fmonospace", 0xff26 }, + { "Fourroman", 0x2163 }, + { "Fsmall", 0xf766 }, + { "GBsquare", 0x3387 }, + { "Gacute", 0x01f4 }, + { "Gammaafrican", 0x0194 }, + { "Gangiacoptic", 0x03ea }, + { "Gcedilla", 0x0122 }, + { "Gcircle", 0x24bc }, + { "Gdot", 0x0120 }, + { "Gecyrillic", 0x0413 }, + { "Ghadarmenian", 0x0542 }, + { "Ghemiddlehookcyrillic", 0x0494 }, + { "Ghestrokecyrillic", 0x0492 }, + { "Gheupturncyrillic", 0x0490 }, + { "Ghook", 0x0193 }, + { "Gimarmenian", 0x0533 }, + { "Gjecyrillic", 0x0403 }, + { "Gmacron", 0x1e20 }, + { "Gmonospace", 0xff27 }, + { "Grave", 0xf6ce }, + { "Gravesmall", 0xf760 }, + { "Gsmall", 0xf767 }, + { "Gsmallhook", 0x029b }, + { "Gstroke", 0x01e4 }, + { "HPsquare", 0x33cb }, + { "Haabkhasiancyrillic", 0x04a8 }, + { "Hadescendercyrillic", 0x04b2 }, + { "Hardsigncyrillic", 0x042a }, + { "Hbrevebelow", 0x1e2a }, + { "Hcedilla", 0x1e28 }, + { "Hcircle", 0x24bd }, + { "Hdieresis", 0x1e26 }, + { "Hdotaccent", 0x1e22 }, + { "Hdotbelow", 0x1e24 }, + { "Hmonospace", 0xff28 }, + { "Hoarmenian", 0x0540 }, + { "Horicoptic", 0x03e8 }, + { "Hsmall", 0xf768 }, + { "Hungarumlaut", 0xf6cf }, + { "Hungarumlautsmall", 0xf6f8 }, + { "Hzsquare", 0x3390 }, + { "IAcyrillic", 0x042f }, + { "IUcyrillic", 0x042e }, + { "Iacutesmall", 0xf7ed }, + { "Icaron", 0x01cf }, + { "Icircle", 0x24be }, + { "Icircumflexsmall", 0xf7ee }, + { "Icyrillic", 0x0406 }, + { "Idblgrave", 0x0208 }, + { "Idieresisacute", 0x1e2e }, + { "Idieresiscyrillic", 0x04e4 }, + { "Idieresissmall", 0xf7ef }, + { "Idot", 0x0130 }, + { "Idotbelow", 0x1eca }, + { "Iebrevecyrillic", 0x04d6 }, + { "Iecyrillic", 0x0415 }, + { "Igravesmall", 0xf7ec }, + { "Ihookabove", 0x1ec8 }, + { "Iicyrillic", 0x0418 }, + { "Iinvertedbreve", 0x020a }, + { "Iishortcyrillic", 0x0419 }, + { "Imacroncyrillic", 0x04e2 }, + { "Imonospace", 0xff29 }, + { "Iniarmenian", 0x053b }, + { "Iocyrillic", 0x0401 }, + { "Iotaafrican", 0x0196 }, + { "Ismall", 0xf769 }, + { "Istroke", 0x0197 }, + { "Itildebelow", 0x1e2c }, + { "Izhitsacyrillic", 0x0474 }, + { "Izhitsadblgravecyrillic", 0x0476 }, + { "Jaarmenian", 0x0541 }, + { "Jcircle", 0x24bf }, + { "Jecyrillic", 0x0408 }, + { "Jheharmenian", 0x054b }, + { "Jmonospace", 0xff2a }, + { "Jsmall", 0xf76a }, + { "KBsquare", 0x3385 }, + { "KKsquare", 0x33cd }, + { "Kabashkircyrillic", 0x04a0 }, + { "Kacute", 0x1e30 }, + { "Kacyrillic", 0x041a }, + { "Kadescendercyrillic", 0x049a }, + { "Kahookcyrillic", 0x04c3 }, + { "Kastrokecyrillic", 0x049e }, + { "Kaverticalstrokecyrillic", 0x049c }, + { "Kcaron", 0x01e8 }, + { "Kcedilla", 0x0136 }, + { "Kcircle", 0x24c0 }, + { "Kdotbelow", 0x1e32 }, + { "Keharmenian", 0x0554 }, + { "Kenarmenian", 0x053f }, + { "Khacyrillic", 0x0425 }, + { "Kheicoptic", 0x03e6 }, + { "Khook", 0x0198 }, + { "Kjecyrillic", 0x040c }, + { "Klinebelow", 0x1e34 }, + { "Kmonospace", 0xff2b }, + { "Koppacyrillic", 0x0480 }, + { "Koppagreek", 0x03de }, + { "Ksicyrillic", 0x046e }, + { "Ksmall", 0xf76b }, + { "LJ", 0x01c7 }, + { "LL", 0xf6bf }, + { "Lcedilla", 0x013b }, + { "Lcircle", 0x24c1 }, + { "Lcircumflexbelow", 0x1e3c }, + { "Ldotaccent", 0x013f }, + { "Ldotbelow", 0x1e36 }, + { "Ldotbelowmacron", 0x1e38 }, + { "Liwnarmenian", 0x053c }, + { "Lj", 0x01c8 }, + { "Ljecyrillic", 0x0409 }, + { "Llinebelow", 0x1e3a }, + { "Lmonospace", 0xff2c }, + { "Lslashsmall", 0xf6f9 }, + { "Lsmall", 0xf76c }, + { "MBsquare", 0x3386 }, + { "Macron", 0xf6d0 }, + { "Macronsmall", 0xf7af }, + { "Macute", 0x1e3e }, + { "Mcircle", 0x24c2 }, + { "Mdotaccent", 0x1e40 }, + { "Mdotbelow", 0x1e42 }, + { "Menarmenian", 0x0544 }, + { "Mmonospace", 0xff2d }, + { "Msmall", 0xf76d }, + { "Mturned", 0x019c }, + { "NJ", 0x01ca }, + { "Ncedilla", 0x0145 }, + { "Ncircle", 0x24c3 }, + { "Ncircumflexbelow", 0x1e4a }, + { "Ndotaccent", 0x1e44 }, + { "Ndotbelow", 0x1e46 }, + { "Nhookleft", 0x019d }, + { "Nineroman", 0x2168 }, + { "Nj", 0x01cb }, + { "Njecyrillic", 0x040a }, + { "Nlinebelow", 0x1e48 }, + { "Nmonospace", 0xff2e }, + { "Nowarmenian", 0x0546 }, + { "Nsmall", 0xf76e }, + { "Ntildesmall", 0xf7f1 }, + { "OEsmall", 0xf6fa }, + { "Oacutesmall", 0xf7f3 }, + { "Obarredcyrillic", 0x04e8 }, + { "Obarreddieresiscyrillic", 0x04ea }, + { "Ocaron", 0x01d1 }, + { "Ocenteredtilde", 0x019f }, + { "Ocircle", 0x24c4 }, + { "Ocircumflexacute", 0x1ed0 }, + { "Ocircumflexdotbelow", 0x1ed8 }, + { "Ocircumflexgrave", 0x1ed2 }, + { "Ocircumflexhookabove", 0x1ed4 }, + { "Ocircumflexsmall", 0xf7f4 }, + { "Ocircumflextilde", 0x1ed6 }, + { "Ocyrillic", 0x041e }, + { "Odblacute", 0x0150 }, + { "Odblgrave", 0x020c }, + { "Odieresiscyrillic", 0x04e6 }, + { "Odieresissmall", 0xf7f6 }, + { "Odotbelow", 0x1ecc }, + { "Ogoneksmall", 0xf6fb }, + { "Ogravesmall", 0xf7f2 }, + { "Oharmenian", 0x0555 }, + { "Ohm", 0x2126 }, + { "Ohookabove", 0x1ece }, + { "Ohornacute", 0x1eda }, + { "Ohorndotbelow", 0x1ee2 }, + { "Ohorngrave", 0x1edc }, + { "Ohornhookabove", 0x1ede }, + { "Ohorntilde", 0x1ee0 }, + { "Oi", 0x01a2 }, + { "Oinvertedbreve", 0x020e }, + { "Omacronacute", 0x1e52 }, + { "Omacrongrave", 0x1e50 }, + { "Omegacyrillic", 0x0460 }, + { "Omegagreek", 0x03a9 }, + { "Omegaroundcyrillic", 0x047a }, + { "Omegatitlocyrillic", 0x047c }, + { "Omonospace", 0xff2f }, + { "Oneroman", 0x2160 }, + { "Oogonek", 0x01ea }, + { "Oogonekmacron", 0x01ec }, + { "Oopen", 0x0186 }, + { "Oslashsmall", 0xf7f8 }, + { "Osmall", 0xf76f }, + { "Ostrokeacute", 0x01fe }, + { "Otcyrillic", 0x047e }, + { "Otildeacute", 0x1e4c }, + { "Otildedieresis", 0x1e4e }, + { "Otildesmall", 0xf7f5 }, + { "Pacute", 0x1e54 }, + { "Pcircle", 0x24c5 }, + { "Pdotaccent", 0x1e56 }, + { "Pecyrillic", 0x041f }, + { "Peharmenian", 0x054a }, + { "Pemiddlehookcyrillic", 0x04a6 }, + { "Phook", 0x01a4 }, + { "Piwrarmenian", 0x0553 }, + { "Pmonospace", 0xff30 }, + { "Psicyrillic", 0x0470 }, + { "Psmall", 0xf770 }, + { "Qcircle", 0x24c6 }, + { "Qmonospace", 0xff31 }, + { "Qsmall", 0xf771 }, + { "Raarmenian", 0x054c }, + { "Rcedilla", 0x0156 }, + { "Rcircle", 0x24c7 }, + { "Rdblgrave", 0x0210 }, + { "Rdotaccent", 0x1e58 }, + { "Rdotbelow", 0x1e5a }, + { "Rdotbelowmacron", 0x1e5c }, + { "Reharmenian", 0x0550 }, + { "Ringsmall", 0xf6fc }, + { "Rinvertedbreve", 0x0212 }, + { "Rlinebelow", 0x1e5e }, + { "Rmonospace", 0xff32 }, + { "Rsmall", 0xf772 }, + { "Rsmallinverted", 0x0281 }, + { "Rsmallinvertedsuperior", 0x02b6 }, + { "Sacutedotaccent", 0x1e64 }, + { "Sampigreek", 0x03e0 }, + { "Scarondotaccent", 0x1e66 }, + { "Scaronsmall", 0xf6fd }, + { "Schwa", 0x018f }, + { "Schwacyrillic", 0x04d8 }, + { "Schwadieresiscyrillic", 0x04da }, + { "Scircle", 0x24c8 }, + { "Sdotaccent", 0x1e60 }, + { "Sdotbelow", 0x1e62 }, + { "Sdotbelowdotaccent", 0x1e68 }, + { "Seharmenian", 0x054d }, + { "Sevenroman", 0x2166 }, + { "Shaarmenian", 0x0547 }, + { "Shacyrillic", 0x0428 }, + { "Shchacyrillic", 0x0429 }, + { "Sheicoptic", 0x03e2 }, + { "Shhacyrillic", 0x04ba }, + { "Shimacoptic", 0x03ec }, + { "Sixroman", 0x2165 }, + { "Smonospace", 0xff33 }, + { "Softsigncyrillic", 0x042c }, + { "Ssmall", 0xf773 }, + { "Stigmagreek", 0x03da }, + { "Tcedilla", 0x0162 }, + { "Tcircle", 0x24c9 }, + { "Tcircumflexbelow", 0x1e70 }, + { "Tdotaccent", 0x1e6a }, + { "Tdotbelow", 0x1e6c }, + { "Tecyrillic", 0x0422 }, + { "Tedescendercyrillic", 0x04ac }, + { "Tenroman", 0x2169 }, + { "Tetsecyrillic", 0x04b4 }, + { "Thook", 0x01ac }, + { "Thornsmall", 0xf7fe }, + { "Threeroman", 0x2162 }, + { "Tildesmall", 0xf6fe }, + { "Tiwnarmenian", 0x054f }, + { "Tlinebelow", 0x1e6e }, + { "Tmonospace", 0xff34 }, + { "Toarmenian", 0x0539 }, + { "Tonefive", 0x01bc }, + { "Tonesix", 0x0184 }, + { "Tonetwo", 0x01a7 }, + { "Tretroflexhook", 0x01ae }, + { "Tsecyrillic", 0x0426 }, + { "Tshecyrillic", 0x040b }, + { "Tsmall", 0xf774 }, + { "Twelveroman", 0x216b }, + { "Tworoman", 0x2161 }, + { "Uacutesmall", 0xf7fa }, + { "Ucaron", 0x01d3 }, + { "Ucircle", 0x24ca }, + { "Ucircumflexbelow", 0x1e76 }, + { "Ucircumflexsmall", 0xf7fb }, + { "Ucyrillic", 0x0423 }, + { "Udblacute", 0x0170 }, + { "Udblgrave", 0x0214 }, + { "Udieresisacute", 0x01d7 }, + { "Udieresisbelow", 0x1e72 }, + { "Udieresiscaron", 0x01d9 }, + { "Udieresiscyrillic", 0x04f0 }, + { "Udieresisgrave", 0x01db }, + { "Udieresismacron", 0x01d5 }, + { "Udieresissmall", 0xf7fc }, + { "Udotbelow", 0x1ee4 }, + { "Ugravesmall", 0xf7f9 }, + { "Uhookabove", 0x1ee6 }, + { "Uhornacute", 0x1ee8 }, + { "Uhorndotbelow", 0x1ef0 }, + { "Uhorngrave", 0x1eea }, + { "Uhornhookabove", 0x1eec }, + { "Uhorntilde", 0x1eee }, + { "Uhungarumlautcyrillic", 0x04f2 }, + { "Uinvertedbreve", 0x0216 }, + { "Ukcyrillic", 0x0478 }, + { "Umacroncyrillic", 0x04ee }, + { "Umacrondieresis", 0x1e7a }, + { "Umonospace", 0xff35 }, + { "Upsilonacutehooksymbolgreek", 0x03d3 }, + { "Upsilonafrican", 0x01b1 }, + { "Upsilondieresishooksymbolgreek", 0x03d4 }, + { "Upsilonhooksymbol", 0x03d2 }, + { "Ushortcyrillic", 0x040e }, + { "Usmall", 0xf775 }, + { "Ustraightcyrillic", 0x04ae }, + { "Ustraightstrokecyrillic", 0x04b0 }, + { "Utildeacute", 0x1e78 }, + { "Utildebelow", 0x1e74 }, + { "Vcircle", 0x24cb }, + { "Vdotbelow", 0x1e7e }, + { "Vecyrillic", 0x0412 }, + { "Vewarmenian", 0x054e }, + { "Vhook", 0x01b2 }, + { "Vmonospace", 0xff36 }, + { "Voarmenian", 0x0548 }, + { "Vsmall", 0xf776 }, + { "Vtilde", 0x1e7c }, + { "Wcircle", 0x24cc }, + { "Wdotaccent", 0x1e86 }, + { "Wdotbelow", 0x1e88 }, + { "Wmonospace", 0xff37 }, + { "Wsmall", 0xf777 }, + { "Xcircle", 0x24cd }, + { "Xdieresis", 0x1e8c }, + { "Xdotaccent", 0x1e8a }, + { "Xeharmenian", 0x053d }, + { "Xmonospace", 0xff38 }, + { "Xsmall", 0xf778 }, + { "Yacutesmall", 0xf7fd }, + { "Yatcyrillic", 0x0462 }, + { "Ycircle", 0x24ce }, + { "Ydieresissmall", 0xf7ff }, + { "Ydotaccent", 0x1e8e }, + { "Ydotbelow", 0x1ef4 }, + { "Yericyrillic", 0x042b }, + { "Yerudieresiscyrillic", 0x04f8 }, + { "Yhook", 0x01b3 }, + { "Yhookabove", 0x1ef6 }, + { "Yiarmenian", 0x0545 }, + { "Yicyrillic", 0x0407 }, + { "Yiwnarmenian", 0x0552 }, + { "Ymonospace", 0xff39 }, + { "Ysmall", 0xf779 }, + { "Ytilde", 0x1ef8 }, + { "Yusbigcyrillic", 0x046a }, + { "Yusbigiotifiedcyrillic", 0x046c }, + { "Yuslittlecyrillic", 0x0466 }, + { "Yuslittleiotifiedcyrillic", 0x0468 }, + { "Zaarmenian", 0x0536 }, + { "Zcaronsmall", 0xf6ff }, + { "Zcircle", 0x24cf }, + { "Zcircumflex", 0x1e90 }, + { "Zdot", 0x017b }, + { "Zdotbelow", 0x1e92 }, + { "Zecyrillic", 0x0417 }, + { "Zedescendercyrillic", 0x0498 }, + { "Zedieresiscyrillic", 0x04de }, + { "Zhearmenian", 0x053a }, + { "Zhebrevecyrillic", 0x04c1 }, + { "Zhecyrillic", 0x0416 }, + { "Zhedescendercyrillic", 0x0496 }, + { "Zhedieresiscyrillic", 0x04dc }, + { "Zlinebelow", 0x1e94 }, + { "Zmonospace", 0xff3a }, + { "Zsmall", 0xf77a }, + { "Zstroke", 0x01b5 }, + { "aabengali", 0x0986 }, + { "aadeva", 0x0906 }, + { "aagujarati", 0x0a86 }, + { "aagurmukhi", 0x0a06 }, + { "aamatragurmukhi", 0x0a3e }, + { "aarusquare", 0x3303 }, + { "aavowelsignbengali", 0x09be }, + { "aavowelsigndeva", 0x093e }, + { "aavowelsigngujarati", 0x0abe }, + { "abbreviationmarkarmenian", 0x055f }, + { "abbreviationsigndeva", 0x0970 }, + { "abengali", 0x0985 }, + { "abopomofo", 0x311a }, + { "abreveacute", 0x1eaf }, + { "abrevecyrillic", 0x04d1 }, + { "abrevedotbelow", 0x1eb7 }, + { "abrevegrave", 0x1eb1 }, + { "abrevehookabove", 0x1eb3 }, + { "abrevetilde", 0x1eb5 }, + { "acaron", 0x01ce }, + { "acircle", 0x24d0 }, + { "acircumflexacute", 0x1ea5 }, + { "acircumflexdotbelow", 0x1ead }, + { "acircumflexgrave", 0x1ea7 }, + { "acircumflexhookabove", 0x1ea9 }, + { "acircumflextilde", 0x1eab }, + { "acutebelowcmb", 0x0317 }, + { "acutecmb", 0x0301 }, + { "acutedeva", 0x0954 }, + { "acutelowmod", 0x02cf }, + { "acutetonecmb", 0x0341 }, + { "acyrillic", 0x0430 }, + { "adblgrave", 0x0201 }, + { "addakgurmukhi", 0x0a71 }, + { "adeva", 0x0905 }, + { "adieresiscyrillic", 0x04d3 }, + { "adieresismacron", 0x01df }, + { "adotbelow", 0x1ea1 }, + { "adotmacron", 0x01e1 }, + { "aekorean", 0x3150 }, + { "aemacron", 0x01e3 }, + { "afii08941", 0x20a4 }, + { "afii10063", 0xf6c4 }, + { "afii10064", 0xf6c5 }, + { "afii10192", 0xf6c6 }, + { "afii10831", 0xf6c7 }, + { "afii10832", 0xf6c8 }, + { "afii57694", 0xfb2a }, + { "afii57695", 0xfb2b }, + { "afii57700", 0xfb4b }, + { "afii57705", 0xfb1f }, + { "afii57723", 0xfb35 }, + { "agujarati", 0x0a85 }, + { "agurmukhi", 0x0a05 }, + { "ahiragana", 0x3042 }, + { "ahookabove", 0x1ea3 }, + { "aibengali", 0x0990 }, + { "aibopomofo", 0x311e }, + { "aideva", 0x0910 }, + { "aiecyrillic", 0x04d5 }, + { "aigujarati", 0x0a90 }, + { "aigurmukhi", 0x0a10 }, + { "aimatragurmukhi", 0x0a48 }, + { "ainarabic", 0x0639 }, + { "ainfinalarabic", 0xfeca }, + { "aininitialarabic", 0xfecb }, + { "ainmedialarabic", 0xfecc }, + { "ainvertedbreve", 0x0203 }, + { "aivowelsignbengali", 0x09c8 }, + { "aivowelsigndeva", 0x0948 }, + { "aivowelsigngujarati", 0x0ac8 }, + { "akatakana", 0x30a2 }, + { "akatakanahalfwidth", 0xff71 }, + { "akorean", 0x314f }, + { "alef", 0x05d0 }, + { "alefarabic", 0x0627 }, + { "alefdageshhebrew", 0xfb30 }, + { "aleffinalarabic", 0xfe8e }, + { "alefhamzaabovearabic", 0x0623 }, + { "alefhamzaabovefinalarabic", 0xfe84 }, + { "alefhamzabelowarabic", 0x0625 }, + { "alefhamzabelowfinalarabic", 0xfe88 }, + { "alefhebrew", 0x05d0 }, + { "aleflamedhebrew", 0xfb4f }, + { "alefmaddaabovearabic", 0x0622 }, + { "alefmaddaabovefinalarabic", 0xfe82 }, + { "alefmaksuraarabic", 0x0649 }, + { "alefmaksurafinalarabic", 0xfef0 }, + { "alefmaksurainitialarabic", 0xfef3 }, + { "alefmaksuramedialarabic", 0xfef4 }, + { "alefpatahhebrew", 0xfb2e }, + { "alefqamatshebrew", 0xfb2f }, + { "allequal", 0x224c }, + { "amonospace", 0xff41 }, + { "ampersandmonospace", 0xff06 }, + { "ampersandsmall", 0xf726 }, + { "amsquare", 0x33c2 }, + { "anbopomofo", 0x3122 }, + { "angbopomofo", 0x3124 }, + { "angkhankhuthai", 0x0e5a }, + { "anglebracketleft", 0x3008 }, + { "anglebracketleftvertical", 0xfe3f }, + { "anglebracketright", 0x3009 }, + { "anglebracketrightvertical", 0xfe40 }, + { "angstrom", 0x212b }, + { "anudattadeva", 0x0952 }, + { "anusvarabengali", 0x0982 }, + { "anusvaradeva", 0x0902 }, + { "anusvaragujarati", 0x0a82 }, + { "apaatosquare", 0x3300 }, + { "aparen", 0x249c }, + { "apostrophearmenian", 0x055a }, + { "apostrophemod", 0x02bc }, + { "apple", 0xf8ff }, + { "approaches", 0x2250 }, + { "approxequalorimage", 0x2252 }, + { "approximatelyequal", 0x2245 }, + { "araeaekorean", 0x318e }, + { "araeakorean", 0x318d }, + { "arc", 0x2312 }, + { "arighthalfring", 0x1e9a }, + { "aringbelow", 0x1e01 }, + { "arrowdashdown", 0x21e3 }, + { "arrowdashleft", 0x21e0 }, + { "arrowdashright", 0x21e2 }, + { "arrowdashup", 0x21e1 }, + { "arrowdownleft", 0x2199 }, + { "arrowdownright", 0x2198 }, + { "arrowdownwhite", 0x21e9 }, + { "arrowheaddownmod", 0x02c5 }, + { "arrowheadleftmod", 0x02c2 }, + { "arrowheadrightmod", 0x02c3 }, + { "arrowheadupmod", 0x02c4 }, + { "arrowhorizex", 0xf8e7 }, + { "arrowleftdbl", 0x21d0 }, + { "arrowleftdblstroke", 0x21cd }, + { "arrowleftoverright", 0x21c6 }, + { "arrowleftwhite", 0x21e6 }, + { "arrowrightdblstroke", 0x21cf }, + { "arrowrightheavy", 0x279e }, + { "arrowrightoverleft", 0x21c4 }, + { "arrowrightwhite", 0x21e8 }, + { "arrowtableft", 0x21e4 }, + { "arrowtabright", 0x21e5 }, + { "arrowupdownbase", 0x21a8 }, + { "arrowupleft", 0x2196 }, + { "arrowupleftofdown", 0x21c5 }, + { "arrowupright", 0x2197 }, + { "arrowupwhite", 0x21e7 }, + { "arrowvertex", 0xf8e6 }, + { "asciicircummonospace", 0xff3e }, + { "asciitildemonospace", 0xff5e }, + { "ascript", 0x0251 }, + { "ascriptturned", 0x0252 }, + { "asmallhiragana", 0x3041 }, + { "asmallkatakana", 0x30a1 }, + { "asmallkatakanahalfwidth", 0xff67 }, + { "asteriskaltonearabic", 0x066d }, + { "asteriskarabic", 0x066d }, + { "asteriskmonospace", 0xff0a }, + { "asterisksmall", 0xfe61 }, + { "asterism", 0x2042 }, + { "asuperior", 0xf6e9 }, + { "asymptoticallyequal", 0x2243 }, + { "atmonospace", 0xff20 }, + { "atsmall", 0xfe6b }, + { "aturned", 0x0250 }, + { "aubengali", 0x0994 }, + { "aubopomofo", 0x3120 }, + { "audeva", 0x0914 }, + { "augujarati", 0x0a94 }, + { "augurmukhi", 0x0a14 }, + { "aulengthmarkbengali", 0x09d7 }, + { "aumatragurmukhi", 0x0a4c }, + { "auvowelsignbengali", 0x09cc }, + { "auvowelsigndeva", 0x094c }, + { "auvowelsigngujarati", 0x0acc }, + { "avagrahadeva", 0x093d }, + { "aybarmenian", 0x0561 }, + { "ayin", 0x05e2 }, + { "ayinaltonehebrew", 0xfb20 }, + { "ayinhebrew", 0x05e2 }, + { "babengali", 0x09ac }, + { "backslashmonospace", 0xff3c }, + { "badeva", 0x092c }, + { "bagujarati", 0x0aac }, + { "bagurmukhi", 0x0a2c }, + { "bahiragana", 0x3070 }, + { "bahtthai", 0x0e3f }, + { "bakatakana", 0x30d0 }, + { "barmonospace", 0xff5c }, + { "bbopomofo", 0x3105 }, + { "bcircle", 0x24d1 }, + { "bdotaccent", 0x1e03 }, + { "bdotbelow", 0x1e05 }, + { "beamedsixteenthnotes", 0x266c }, + { "because", 0x2235 }, + { "becyrillic", 0x0431 }, + { "beharabic", 0x0628 }, + { "behfinalarabic", 0xfe90 }, + { "behinitialarabic", 0xfe91 }, + { "behiragana", 0x3079 }, + { "behmedialarabic", 0xfe92 }, + { "behmeeminitialarabic", 0xfc9f }, + { "behmeemisolatedarabic", 0xfc08 }, + { "behnoonfinalarabic", 0xfc6d }, + { "bekatakana", 0x30d9 }, + { "benarmenian", 0x0562 }, + { "bet", 0x05d1 }, + { "betasymbolgreek", 0x03d0 }, + { "betdagesh", 0xfb31 }, + { "betdageshhebrew", 0xfb31 }, + { "bethebrew", 0x05d1 }, + { "betrafehebrew", 0xfb4c }, + { "bhabengali", 0x09ad }, + { "bhadeva", 0x092d }, + { "bhagujarati", 0x0aad }, + { "bhagurmukhi", 0x0a2d }, + { "bhook", 0x0253 }, + { "bihiragana", 0x3073 }, + { "bikatakana", 0x30d3 }, + { "bilabialclick", 0x0298 }, + { "bindigurmukhi", 0x0a02 }, + { "birusquare", 0x3331 }, + { "blackcircle", 0x25cf }, + { "blackdiamond", 0x25c6 }, + { "blackdownpointingtriangle", 0x25bc }, + { "blackleftpointingpointer", 0x25c4 }, + { "blackleftpointingtriangle", 0x25c0 }, + { "blacklenticularbracketleft", 0x3010 }, + { "blacklenticularbracketleftvertical", 0xfe3b }, + { "blacklenticularbracketright", 0x3011 }, + { "blacklenticularbracketrightvertical", 0xfe3c }, + { "blacklowerlefttriangle", 0x25e3 }, + { "blacklowerrighttriangle", 0x25e2 }, + { "blackrectangle", 0x25ac }, + { "blackrightpointingpointer", 0x25ba }, + { "blackrightpointingtriangle", 0x25b6 }, + { "blacksmallsquare", 0x25aa }, + { "blacksmilingface", 0x263b }, + { "blacksquare", 0x25a0 }, + { "blackstar", 0x2605 }, + { "blackupperlefttriangle", 0x25e4 }, + { "blackupperrighttriangle", 0x25e5 }, + { "blackuppointingsmalltriangle", 0x25b4 }, + { "blackuppointingtriangle", 0x25b2 }, + { "blank", 0x2423 }, + { "blinebelow", 0x1e07 }, + { "bmonospace", 0xff42 }, + { "bobaimaithai", 0x0e1a }, + { "bohiragana", 0x307c }, + { "bokatakana", 0x30dc }, + { "bparen", 0x249d }, + { "bqsquare", 0x33c3 }, + { "braceex", 0xf8f4 }, + { "braceleftbt", 0xf8f3 }, + { "braceleftmid", 0xf8f2 }, + { "braceleftmonospace", 0xff5b }, + { "braceleftsmall", 0xfe5b }, + { "bracelefttp", 0xf8f1 }, + { "braceleftvertical", 0xfe37 }, + { "bracerightbt", 0xf8fe }, + { "bracerightmid", 0xf8fd }, + { "bracerightmonospace", 0xff5d }, + { "bracerightsmall", 0xfe5c }, + { "bracerighttp", 0xf8fc }, + { "bracerightvertical", 0xfe38 }, + { "bracketleftbt", 0xf8f0 }, + { "bracketleftex", 0xf8ef }, + { "bracketleftmonospace", 0xff3b }, + { "bracketlefttp", 0xf8ee }, + { "bracketrightbt", 0xf8fb }, + { "bracketrightex", 0xf8fa }, + { "bracketrightmonospace", 0xff3d }, + { "bracketrighttp", 0xf8f9 }, + { "brevebelowcmb", 0x032e }, + { "brevecmb", 0x0306 }, + { "breveinvertedbelowcmb", 0x032f }, + { "breveinvertedcmb", 0x0311 }, + { "breveinverteddoublecmb", 0x0361 }, + { "bridgebelowcmb", 0x032a }, + { "bridgeinvertedbelowcmb", 0x033a }, + { "bstroke", 0x0180 }, + { "bsuperior", 0xf6ea }, + { "btopbar", 0x0183 }, + { "buhiragana", 0x3076 }, + { "bukatakana", 0x30d6 }, + { "bulletinverse", 0x25d8 }, + { "bulletoperator", 0x2219 }, + { "bullseye", 0x25ce }, + { "caarmenian", 0x056e }, + { "cabengali", 0x099a }, + { "cadeva", 0x091a }, + { "cagujarati", 0x0a9a }, + { "cagurmukhi", 0x0a1a }, + { "calsquare", 0x3388 }, + { "candrabindubengali", 0x0981 }, + { "candrabinducmb", 0x0310 }, + { "candrabindudeva", 0x0901 }, + { "candrabindugujarati", 0x0a81 }, + { "capslock", 0x21ea }, + { "careof", 0x2105 }, + { "caronbelowcmb", 0x032c }, + { "caroncmb", 0x030c }, + { "cbopomofo", 0x3118 }, + { "ccedillaacute", 0x1e09 }, + { "ccircle", 0x24d2 }, + { "ccurl", 0x0255 }, + { "cdot", 0x010b }, + { "cdsquare", 0x33c5 }, + { "cedillacmb", 0x0327 }, + { "centigrade", 0x2103 }, + { "centinferior", 0xf6df }, + { "centmonospace", 0xffe0 }, + { "centoldstyle", 0xf7a2 }, + { "centsuperior", 0xf6e0 }, + { "chaarmenian", 0x0579 }, + { "chabengali", 0x099b }, + { "chadeva", 0x091b }, + { "chagujarati", 0x0a9b }, + { "chagurmukhi", 0x0a1b }, + { "chbopomofo", 0x3114 }, + { "cheabkhasiancyrillic", 0x04bd }, + { "checkmark", 0x2713 }, + { "checyrillic", 0x0447 }, + { "chedescenderabkhasiancyrillic", 0x04bf }, + { "chedescendercyrillic", 0x04b7 }, + { "chedieresiscyrillic", 0x04f5 }, + { "cheharmenian", 0x0573 }, + { "chekhakassiancyrillic", 0x04cc }, + { "cheverticalstrokecyrillic", 0x04b9 }, + { "chieuchacirclekorean", 0x3277 }, + { "chieuchaparenkorean", 0x3217 }, + { "chieuchcirclekorean", 0x3269 }, + { "chieuchkorean", 0x314a }, + { "chieuchparenkorean", 0x3209 }, + { "chochangthai", 0x0e0a }, + { "chochanthai", 0x0e08 }, + { "chochingthai", 0x0e09 }, + { "chochoethai", 0x0e0c }, + { "chook", 0x0188 }, + { "cieucacirclekorean", 0x3276 }, + { "cieucaparenkorean", 0x3216 }, + { "cieuccirclekorean", 0x3268 }, + { "cieuckorean", 0x3148 }, + { "cieucparenkorean", 0x3208 }, + { "cieucuparenkorean", 0x321c }, + { "circleot", 0x2299 }, + { "circlepostalmark", 0x3036 }, + { "circlewithlefthalfblack", 0x25d0 }, + { "circlewithrighthalfblack", 0x25d1 }, + { "circumflexbelowcmb", 0x032d }, + { "circumflexcmb", 0x0302 }, + { "clear", 0x2327 }, + { "clickalveolar", 0x01c2 }, + { "clickdental", 0x01c0 }, + { "clicklateral", 0x01c1 }, + { "clickretroflex", 0x01c3 }, + { "clubsuitblack", 0x2663 }, + { "clubsuitwhite", 0x2667 }, + { "cmcubedsquare", 0x33a4 }, + { "cmonospace", 0xff43 }, + { "cmsquaredsquare", 0x33a0 }, + { "coarmenian", 0x0581 }, + { "colonmonospace", 0xff1a }, + { "colonsign", 0x20a1 }, + { "colonsmall", 0xfe55 }, + { "colontriangularhalfmod", 0x02d1 }, + { "colontriangularmod", 0x02d0 }, + { "commaabovecmb", 0x0313 }, + { "commaaboverightcmb", 0x0315 }, + { "commaaccent", 0xf6c3 }, + { "commaarabic", 0x060c }, + { "commaarmenian", 0x055d }, + { "commainferior", 0xf6e1 }, + { "commamonospace", 0xff0c }, + { "commareversedabovecmb", 0x0314 }, + { "commareversedmod", 0x02bd }, + { "commasmall", 0xfe50 }, + { "commasuperior", 0xf6e2 }, + { "commaturnedabovecmb", 0x0312 }, + { "commaturnedmod", 0x02bb }, + { "compass", 0x263c }, + { "contourintegral", 0x222e }, + { "control", 0x2303 }, + { "controlACK", 0x0006 }, + { "controlBEL", 0x0007 }, + { "controlBS", 0x0008 }, + { "controlCAN", 0x0018 }, + { "controlCR", 0x000d }, + { "controlDC1", 0x0011 }, + { "controlDC2", 0x0012 }, + { "controlDC3", 0x0013 }, + { "controlDC4", 0x0014 }, + { "controlDEL", 0x007f }, + { "controlDLE", 0x0010 }, + { "controlEM", 0x0019 }, + { "controlENQ", 0x0005 }, + { "controlEOT", 0x0004 }, + { "controlESC", 0x001b }, + { "controlETB", 0x0017 }, + { "controlETX", 0x0003 }, + { "controlFF", 0x000c }, + { "controlFS", 0x001c }, + { "controlGS", 0x001d }, + { "controlHT", 0x0009 }, + { "controlLF", 0x000a }, + { "controlNAK", 0x0015 }, + { "controlRS", 0x001e }, + { "controlSI", 0x000f }, + { "controlSO", 0x000e }, + { "controlSOT", 0x0002 }, + { "controlSTX", 0x0001 }, + { "controlSUB", 0x001a }, + { "controlSYN", 0x0016 }, + { "controlUS", 0x001f }, + { "controlVT", 0x000b }, + { "copyrightsans", 0xf8e9 }, + { "copyrightserif", 0xf6d9 }, + { "cornerbracketleft", 0x300c }, + { "cornerbracketlefthalfwidth", 0xff62 }, + { "cornerbracketleftvertical", 0xfe41 }, + { "cornerbracketright", 0x300d }, + { "cornerbracketrighthalfwidth", 0xff63 }, + { "cornerbracketrightvertical", 0xfe42 }, + { "corporationsquare", 0x337f }, + { "cosquare", 0x33c7 }, + { "coverkgsquare", 0x33c6 }, + { "cparen", 0x249e }, + { "cruzeiro", 0x20a2 }, + { "cstretched", 0x0297 }, + { "curlyand", 0x22cf }, + { "curlyor", 0x22ce }, + { "cyrBreve", 0xf6d1 }, + { "cyrFlex", 0xf6d2 }, + { "cyrbreve", 0xf6d4 }, + { "cyrflex", 0xf6d5 }, + { "daarmenian", 0x0564 }, + { "dabengali", 0x09a6 }, + { "dadarabic", 0x0636 }, + { "dadeva", 0x0926 }, + { "dadfinalarabic", 0xfebe }, + { "dadinitialarabic", 0xfebf }, + { "dadmedialarabic", 0xfec0 }, + { "dagesh", 0x05bc }, + { "dageshhebrew", 0x05bc }, + { "dagujarati", 0x0aa6 }, + { "dagurmukhi", 0x0a26 }, + { "dahiragana", 0x3060 }, + { "dakatakana", 0x30c0 }, + { "dalarabic", 0x062f }, + { "dalet", 0x05d3 }, + { "daletdagesh", 0xfb33 }, + { "daletdageshhebrew", 0xfb33 }, + { "dalethatafpatah", 0x05d3 }, + { "dalethatafpatahhebrew", 0x05d3 }, + { "dalethatafsegol", 0x05d3 }, + { "dalethatafsegolhebrew", 0x05d3 }, + { "dalethebrew", 0x05d3 }, + { "dalethiriq", 0x05d3 }, + { "dalethiriqhebrew", 0x05d3 }, + { "daletholam", 0x05d3 }, + { "daletholamhebrew", 0x05d3 }, + { "daletpatah", 0x05d3 }, + { "daletpatahhebrew", 0x05d3 }, + { "daletqamats", 0x05d3 }, + { "daletqamatshebrew", 0x05d3 }, + { "daletqubuts", 0x05d3 }, + { "daletqubutshebrew", 0x05d3 }, + { "daletsegol", 0x05d3 }, + { "daletsegolhebrew", 0x05d3 }, + { "daletsheva", 0x05d3 }, + { "daletshevahebrew", 0x05d3 }, + { "dalettsere", 0x05d3 }, + { "dalettserehebrew", 0x05d3 }, + { "dalfinalarabic", 0xfeaa }, + { "dammaarabic", 0x064f }, + { "dammalowarabic", 0x064f }, + { "dammatanaltonearabic", 0x064c }, + { "dammatanarabic", 0x064c }, + { "danda", 0x0964 }, + { "dargahebrew", 0x05a7 }, + { "dargalefthebrew", 0x05a7 }, + { "dasiapneumatacyrilliccmb", 0x0485 }, + { "dblGrave", 0xf6d3 }, + { "dblanglebracketleft", 0x300a }, + { "dblanglebracketleftvertical", 0xfe3d }, + { "dblanglebracketright", 0x300b }, + { "dblanglebracketrightvertical", 0xfe3e }, + { "dblarchinvertedbelowcmb", 0x032b }, + { "dblarrowleft", 0x21d4 }, + { "dblarrowright", 0x21d2 }, + { "dbldanda", 0x0965 }, + { "dblgrave", 0xf6d6 }, + { "dblgravecmb", 0x030f }, + { "dblintegral", 0x222c }, + { "dbllowline", 0x2017 }, + { "dbllowlinecmb", 0x0333 }, + { "dbloverlinecmb", 0x033f }, + { "dblprimemod", 0x02ba }, + { "dblverticalbar", 0x2016 }, + { "dblverticallineabovecmb", 0x030e }, + { "dbopomofo", 0x3109 }, + { "dbsquare", 0x33c8 }, + { "dcedilla", 0x1e11 }, + { "dcircle", 0x24d3 }, + { "dcircumflexbelow", 0x1e13 }, + { "ddabengali", 0x09a1 }, + { "ddadeva", 0x0921 }, + { "ddagujarati", 0x0aa1 }, + { "ddagurmukhi", 0x0a21 }, + { "ddalarabic", 0x0688 }, + { "ddalfinalarabic", 0xfb89 }, + { "dddhadeva", 0x095c }, + { "ddhabengali", 0x09a2 }, + { "ddhadeva", 0x0922 }, + { "ddhagujarati", 0x0aa2 }, + { "ddhagurmukhi", 0x0a22 }, + { "ddotaccent", 0x1e0b }, + { "ddotbelow", 0x1e0d }, + { "decimalseparatorarabic", 0x066b }, + { "decimalseparatorpersian", 0x066b }, + { "decyrillic", 0x0434 }, + { "dehihebrew", 0x05ad }, + { "dehiragana", 0x3067 }, + { "deicoptic", 0x03ef }, + { "dekatakana", 0x30c7 }, + { "deleteleft", 0x232b }, + { "deleteright", 0x2326 }, + { "deltaturned", 0x018d }, + { "denominatorminusonenumeratorbengali", 0x09f8 }, + { "dezh", 0x02a4 }, + { "dhabengali", 0x09a7 }, + { "dhadeva", 0x0927 }, + { "dhagujarati", 0x0aa7 }, + { "dhagurmukhi", 0x0a27 }, + { "dhook", 0x0257 }, + { "dialytikatonos", 0x0385 }, + { "dialytikatonoscmb", 0x0344 }, + { "diamondsuitwhite", 0x2662 }, + { "dieresisacute", 0xf6d7 }, + { "dieresisbelowcmb", 0x0324 }, + { "dieresiscmb", 0x0308 }, + { "dieresisgrave", 0xf6d8 }, + { "dihiragana", 0x3062 }, + { "dikatakana", 0x30c2 }, + { "dittomark", 0x3003 }, + { "divides", 0x2223 }, + { "divisionslash", 0x2215 }, + { "djecyrillic", 0x0452 }, + { "dlinebelow", 0x1e0f }, + { "dlsquare", 0x3397 }, + { "dmacron", 0x0111 }, + { "dmonospace", 0xff44 }, + { "dochadathai", 0x0e0e }, + { "dodekthai", 0x0e14 }, + { "dohiragana", 0x3069 }, + { "dokatakana", 0x30c9 }, + { "dollarinferior", 0xf6e3 }, + { "dollarmonospace", 0xff04 }, + { "dollaroldstyle", 0xf724 }, + { "dollarsmall", 0xfe69 }, + { "dollarsuperior", 0xf6e4 }, + { "dorusquare", 0x3326 }, + { "dotaccentcmb", 0x0307 }, + { "dotbelowcmb", 0x0323 }, + { "dotkatakana", 0x30fb }, + { "dotlessj", 0xf6be }, + { "dotlessjstrokehook", 0x0284 }, + { "dottedcircle", 0x25cc }, + { "doubleyodpatah", 0xfb1f }, + { "doubleyodpatahhebrew", 0xfb1f }, + { "downtackbelowcmb", 0x031e }, + { "downtackmod", 0x02d5 }, + { "dparen", 0x249f }, + { "dsuperior", 0xf6eb }, + { "dtail", 0x0256 }, + { "dtopbar", 0x018c }, + { "duhiragana", 0x3065 }, + { "dukatakana", 0x30c5 }, + { "dz", 0x01f3 }, + { "dzaltone", 0x02a3 }, + { "dzcaron", 0x01c6 }, + { "dzcurl", 0x02a5 }, + { "dzeabkhasiancyrillic", 0x04e1 }, + { "dzecyrillic", 0x0455 }, + { "dzhecyrillic", 0x045f }, + { "earth", 0x2641 }, + { "ebengali", 0x098f }, + { "ebopomofo", 0x311c }, + { "ecandradeva", 0x090d }, + { "ecandragujarati", 0x0a8d }, + { "ecandravowelsigndeva", 0x0945 }, + { "ecandravowelsigngujarati", 0x0ac5 }, + { "ecedillabreve", 0x1e1d }, + { "echarmenian", 0x0565 }, + { "echyiwnarmenian", 0x0587 }, + { "ecircle", 0x24d4 }, + { "ecircumflexacute", 0x1ebf }, + { "ecircumflexbelow", 0x1e19 }, + { "ecircumflexdotbelow", 0x1ec7 }, + { "ecircumflexgrave", 0x1ec1 }, + { "ecircumflexhookabove", 0x1ec3 }, + { "ecircumflextilde", 0x1ec5 }, + { "ecyrillic", 0x0454 }, + { "edblgrave", 0x0205 }, + { "edeva", 0x090f }, + { "edot", 0x0117 }, + { "edotbelow", 0x1eb9 }, + { "eegurmukhi", 0x0a0f }, + { "eematragurmukhi", 0x0a47 }, + { "efcyrillic", 0x0444 }, + { "egujarati", 0x0a8f }, + { "eharmenian", 0x0567 }, + { "ehbopomofo", 0x311d }, + { "ehiragana", 0x3048 }, + { "ehookabove", 0x1ebb }, + { "eibopomofo", 0x311f }, + { "eightarabic", 0x0668 }, + { "eightbengali", 0x09ee }, + { "eightcircle", 0x2467 }, + { "eightcircleinversesansserif", 0x2791 }, + { "eightdeva", 0x096e }, + { "eighteencircle", 0x2471 }, + { "eighteenparen", 0x2485 }, + { "eighteenperiod", 0x2499 }, + { "eightgujarati", 0x0aee }, + { "eightgurmukhi", 0x0a6e }, + { "eighthackarabic", 0x0668 }, + { "eighthangzhou", 0x3028 }, + { "eighthnotebeamed", 0x266b }, + { "eightideographicparen", 0x3227 }, + { "eightinferior", 0x2088 }, + { "eightmonospace", 0xff18 }, + { "eightoldstyle", 0xf738 }, + { "eightparen", 0x247b }, + { "eightperiod", 0x248f }, + { "eightpersian", 0x06f8 }, + { "eightroman", 0x2177 }, + { "eightsuperior", 0x2078 }, + { "eightthai", 0x0e58 }, + { "einvertedbreve", 0x0207 }, + { "eiotifiedcyrillic", 0x0465 }, + { "ekatakana", 0x30a8 }, + { "ekatakanahalfwidth", 0xff74 }, + { "ekonkargurmukhi", 0x0a74 }, + { "ekorean", 0x3154 }, + { "elcyrillic", 0x043b }, + { "elevencircle", 0x246a }, + { "elevenparen", 0x247e }, + { "elevenperiod", 0x2492 }, + { "elevenroman", 0x217a }, + { "ellipsisvertical", 0x22ee }, + { "emacronacute", 0x1e17 }, + { "emacrongrave", 0x1e15 }, + { "emcyrillic", 0x043c }, + { "emdashvertical", 0xfe31 }, + { "emonospace", 0xff45 }, + { "emphasismarkarmenian", 0x055b }, + { "enbopomofo", 0x3123 }, + { "encyrillic", 0x043d }, + { "endashvertical", 0xfe32 }, + { "endescendercyrillic", 0x04a3 }, + { "engbopomofo", 0x3125 }, + { "enghecyrillic", 0x04a5 }, + { "enhookcyrillic", 0x04c8 }, + { "enspace", 0x2002 }, + { "eokorean", 0x3153 }, + { "eopen", 0x025b }, + { "eopenclosed", 0x029a }, + { "eopenreversed", 0x025c }, + { "eopenreversedclosed", 0x025e }, + { "eopenreversedhook", 0x025d }, + { "eparen", 0x24a0 }, + { "equalmonospace", 0xff1d }, + { "equalsmall", 0xfe66 }, + { "equalsuperior", 0x207c }, + { "erbopomofo", 0x3126 }, + { "ercyrillic", 0x0440 }, + { "ereversed", 0x0258 }, + { "ereversedcyrillic", 0x044d }, + { "escyrillic", 0x0441 }, + { "esdescendercyrillic", 0x04ab }, + { "esh", 0x0283 }, + { "eshcurl", 0x0286 }, + { "eshortdeva", 0x090e }, + { "eshortvowelsigndeva", 0x0946 }, + { "eshreversedloop", 0x01aa }, + { "eshsquatreversed", 0x0285 }, + { "esmallhiragana", 0x3047 }, + { "esmallkatakana", 0x30a7 }, + { "esmallkatakanahalfwidth", 0xff6a }, + { "esuperior", 0xf6ec }, + { "etarmenian", 0x0568 }, + { "etilde", 0x1ebd }, + { "etildebelow", 0x1e1b }, + { "etnahtafoukhhebrew", 0x0591 }, + { "etnahtafoukhlefthebrew", 0x0591 }, + { "etnahtahebrew", 0x0591 }, + { "etnahtalefthebrew", 0x0591 }, + { "eturned", 0x01dd }, + { "eukorean", 0x3161 }, + { "euro", 0x20ac }, + { "evowelsignbengali", 0x09c7 }, + { "evowelsigndeva", 0x0947 }, + { "evowelsigngujarati", 0x0ac7 }, + { "exclamarmenian", 0x055c }, + { "exclamdownsmall", 0xf7a1 }, + { "exclammonospace", 0xff01 }, + { "exclamsmall", 0xf721 }, + { "ezh", 0x0292 }, + { "ezhcaron", 0x01ef }, + { "ezhcurl", 0x0293 }, + { "ezhreversed", 0x01b9 }, + { "ezhtail", 0x01ba }, + { "fadeva", 0x095e }, + { "fagurmukhi", 0x0a5e }, + { "fahrenheit", 0x2109 }, + { "fathaarabic", 0x064e }, + { "fathalowarabic", 0x064e }, + { "fathatanarabic", 0x064b }, + { "fbopomofo", 0x3108 }, + { "fcircle", 0x24d5 }, + { "fdotaccent", 0x1e1f }, + { "feharabic", 0x0641 }, + { "feharmenian", 0x0586 }, + { "fehfinalarabic", 0xfed2 }, + { "fehinitialarabic", 0xfed3 }, + { "fehmedialarabic", 0xfed4 }, + { "feicoptic", 0x03e5 }, + { "ff", 0xfb00 }, + { "ffi", 0xfb03 }, + { "ffl", 0xfb04 }, + { "fi", 0xfb01 }, + { "fifteencircle", 0x246e }, + { "fifteenparen", 0x2482 }, + { "fifteenperiod", 0x2496 }, + { "finalkaf", 0x05da }, + { "finalkafdagesh", 0xfb3a }, + { "finalkafdageshhebrew", 0xfb3a }, + { "finalkafhebrew", 0x05da }, + { "finalkafqamats", 0x05da }, + { "finalkafqamatshebrew", 0x05da }, + { "finalkafsheva", 0x05da }, + { "finalkafshevahebrew", 0x05da }, + { "finalmem", 0x05dd }, + { "finalmemhebrew", 0x05dd }, + { "finalnun", 0x05df }, + { "finalnunhebrew", 0x05df }, + { "finalpe", 0x05e3 }, + { "finalpehebrew", 0x05e3 }, + { "finaltsadi", 0x05e5 }, + { "finaltsadihebrew", 0x05e5 }, + { "firsttonechinese", 0x02c9 }, + { "fisheye", 0x25c9 }, + { "fitacyrillic", 0x0473 }, + { "fivearabic", 0x0665 }, + { "fivebengali", 0x09eb }, + { "fivecircle", 0x2464 }, + { "fivecircleinversesansserif", 0x278e }, + { "fivedeva", 0x096b }, + { "fivegujarati", 0x0aeb }, + { "fivegurmukhi", 0x0a6b }, + { "fivehackarabic", 0x0665 }, + { "fivehangzhou", 0x3025 }, + { "fiveideographicparen", 0x3224 }, + { "fiveinferior", 0x2085 }, + { "fivemonospace", 0xff15 }, + { "fiveoldstyle", 0xf735 }, + { "fiveparen", 0x2478 }, + { "fiveperiod", 0x248c }, + { "fivepersian", 0x06f5 }, + { "fiveroman", 0x2174 }, + { "fivesuperior", 0x2075 }, + { "fivethai", 0x0e55 }, + { "fl", 0xfb02 }, + { "fmonospace", 0xff46 }, + { "fmsquare", 0x3399 }, + { "fofanthai", 0x0e1f }, + { "fofathai", 0x0e1d }, + { "fongmanthai", 0x0e4f }, + { "forall", 0x2200 }, + { "fourarabic", 0x0664 }, + { "fourbengali", 0x09ea }, + { "fourcircle", 0x2463 }, + { "fourcircleinversesansserif", 0x278d }, + { "fourdeva", 0x096a }, + { "fourgujarati", 0x0aea }, + { "fourgurmukhi", 0x0a6a }, + { "fourhackarabic", 0x0664 }, + { "fourhangzhou", 0x3024 }, + { "fourideographicparen", 0x3223 }, + { "fourinferior", 0x2084 }, + { "fourmonospace", 0xff14 }, + { "fournumeratorbengali", 0x09f7 }, + { "fouroldstyle", 0xf734 }, + { "fourparen", 0x2477 }, + { "fourperiod", 0x248b }, + { "fourpersian", 0x06f4 }, + { "fourroman", 0x2173 }, + { "foursuperior", 0x2074 }, + { "fourteencircle", 0x246d }, + { "fourteenparen", 0x2481 }, + { "fourteenperiod", 0x2495 }, + { "fourthai", 0x0e54 }, + { "fourthtonechinese", 0x02cb }, + { "fparen", 0x24a1 }, + { "gabengali", 0x0997 }, + { "gacute", 0x01f5 }, + { "gadeva", 0x0917 }, + { "gafarabic", 0x06af }, + { "gaffinalarabic", 0xfb93 }, + { "gafinitialarabic", 0xfb94 }, + { "gafmedialarabic", 0xfb95 }, + { "gagujarati", 0x0a97 }, + { "gagurmukhi", 0x0a17 }, + { "gahiragana", 0x304c }, + { "gakatakana", 0x30ac }, + { "gammalatinsmall", 0x0263 }, + { "gammasuperior", 0x02e0 }, + { "gangiacoptic", 0x03eb }, + { "gbopomofo", 0x310d }, + { "gcedilla", 0x0123 }, + { "gcircle", 0x24d6 }, + { "gdot", 0x0121 }, + { "gecyrillic", 0x0433 }, + { "gehiragana", 0x3052 }, + { "gekatakana", 0x30b2 }, + { "geometricallyequal", 0x2251 }, + { "gereshaccenthebrew", 0x059c }, + { "gereshhebrew", 0x05f3 }, + { "gereshmuqdamhebrew", 0x059d }, + { "gershayimaccenthebrew", 0x059e }, + { "gershayimhebrew", 0x05f4 }, + { "getamark", 0x3013 }, + { "ghabengali", 0x0998 }, + { "ghadarmenian", 0x0572 }, + { "ghadeva", 0x0918 }, + { "ghagujarati", 0x0a98 }, + { "ghagurmukhi", 0x0a18 }, + { "ghainarabic", 0x063a }, + { "ghainfinalarabic", 0xfece }, + { "ghaininitialarabic", 0xfecf }, + { "ghainmedialarabic", 0xfed0 }, + { "ghemiddlehookcyrillic", 0x0495 }, + { "ghestrokecyrillic", 0x0493 }, + { "gheupturncyrillic", 0x0491 }, + { "ghhadeva", 0x095a }, + { "ghhagurmukhi", 0x0a5a }, + { "ghook", 0x0260 }, + { "ghzsquare", 0x3393 }, + { "gihiragana", 0x304e }, + { "gikatakana", 0x30ae }, + { "gimarmenian", 0x0563 }, + { "gimel", 0x05d2 }, + { "gimeldagesh", 0xfb32 }, + { "gimeldageshhebrew", 0xfb32 }, + { "gimelhebrew", 0x05d2 }, + { "gjecyrillic", 0x0453 }, + { "glottalinvertedstroke", 0x01be }, + { "glottalstop", 0x0294 }, + { "glottalstopinverted", 0x0296 }, + { "glottalstopmod", 0x02c0 }, + { "glottalstopreversed", 0x0295 }, + { "glottalstopreversedmod", 0x02c1 }, + { "glottalstopreversedsuperior", 0x02e4 }, + { "glottalstopstroke", 0x02a1 }, + { "glottalstopstrokereversed", 0x02a2 }, + { "gmacron", 0x1e21 }, + { "gmonospace", 0xff47 }, + { "gohiragana", 0x3054 }, + { "gokatakana", 0x30b4 }, + { "gparen", 0x24a2 }, + { "gpasquare", 0x33ac }, + { "gravebelowcmb", 0x0316 }, + { "gravecmb", 0x0300 }, + { "gravedeva", 0x0953 }, + { "gravelowmod", 0x02ce }, + { "gravemonospace", 0xff40 }, + { "gravetonecmb", 0x0340 }, + { "greaterequalorless", 0x22db }, + { "greatermonospace", 0xff1e }, + { "greaterorequivalent", 0x2273 }, + { "greaterorless", 0x2277 }, + { "greateroverequal", 0x2267 }, + { "greatersmall", 0xfe65 }, + { "gscript", 0x0261 }, + { "gstroke", 0x01e5 }, + { "guhiragana", 0x3050 }, + { "gukatakana", 0x30b0 }, + { "guramusquare", 0x3318 }, + { "gysquare", 0x33c9 }, + { "haabkhasiancyrillic", 0x04a9 }, + { "haaltonearabic", 0x06c1 }, + { "habengali", 0x09b9 }, + { "hadescendercyrillic", 0x04b3 }, + { "hadeva", 0x0939 }, + { "hagujarati", 0x0ab9 }, + { "hagurmukhi", 0x0a39 }, + { "haharabic", 0x062d }, + { "hahfinalarabic", 0xfea2 }, + { "hahinitialarabic", 0xfea3 }, + { "hahiragana", 0x306f }, + { "hahmedialarabic", 0xfea4 }, + { "haitusquare", 0x332a }, + { "hakatakana", 0x30cf }, + { "hakatakanahalfwidth", 0xff8a }, + { "halantgurmukhi", 0x0a4d }, + { "hamzaarabic", 0x0621 }, + { "hamzadammaarabic", 0x0621 }, + { "hamzadammatanarabic", 0x0621 }, + { "hamzafathaarabic", 0x0621 }, + { "hamzafathatanarabic", 0x0621 }, + { "hamzalowarabic", 0x0621 }, + { "hamzalowkasraarabic", 0x0621 }, + { "hamzalowkasratanarabic", 0x0621 }, + { "hamzasukunarabic", 0x0621 }, + { "hangulfiller", 0x3164 }, + { "hardsigncyrillic", 0x044a }, + { "harpoonleftbarbup", 0x21bc }, + { "harpoonrightbarbup", 0x21c0 }, + { "hasquare", 0x33ca }, + { "hatafpatah", 0x05b2 }, + { "hatafpatah16", 0x05b2 }, + { "hatafpatah23", 0x05b2 }, + { "hatafpatah2f", 0x05b2 }, + { "hatafpatahhebrew", 0x05b2 }, + { "hatafpatahnarrowhebrew", 0x05b2 }, + { "hatafpatahquarterhebrew", 0x05b2 }, + { "hatafpatahwidehebrew", 0x05b2 }, + { "hatafqamats", 0x05b3 }, + { "hatafqamats1b", 0x05b3 }, + { "hatafqamats28", 0x05b3 }, + { "hatafqamats34", 0x05b3 }, + { "hatafqamatshebrew", 0x05b3 }, + { "hatafqamatsnarrowhebrew", 0x05b3 }, + { "hatafqamatsquarterhebrew", 0x05b3 }, + { "hatafqamatswidehebrew", 0x05b3 }, + { "hatafsegol", 0x05b1 }, + { "hatafsegol17", 0x05b1 }, + { "hatafsegol24", 0x05b1 }, + { "hatafsegol30", 0x05b1 }, + { "hatafsegolhebrew", 0x05b1 }, + { "hatafsegolnarrowhebrew", 0x05b1 }, + { "hatafsegolquarterhebrew", 0x05b1 }, + { "hatafsegolwidehebrew", 0x05b1 }, + { "hbopomofo", 0x310f }, + { "hbrevebelow", 0x1e2b }, + { "hcedilla", 0x1e29 }, + { "hcircle", 0x24d7 }, + { "hdieresis", 0x1e27 }, + { "hdotaccent", 0x1e23 }, + { "hdotbelow", 0x1e25 }, + { "he", 0x05d4 }, + { "heartsuitblack", 0x2665 }, + { "heartsuitwhite", 0x2661 }, + { "hedagesh", 0xfb34 }, + { "hedageshhebrew", 0xfb34 }, + { "hehaltonearabic", 0x06c1 }, + { "heharabic", 0x0647 }, + { "hehebrew", 0x05d4 }, + { "hehfinalaltonearabic", 0xfba7 }, + { "hehfinalalttwoarabic", 0xfeea }, + { "hehfinalarabic", 0xfeea }, + { "hehhamzaabovefinalarabic", 0xfba5 }, + { "hehhamzaaboveisolatedarabic", 0xfba4 }, + { "hehinitialaltonearabic", 0xfba8 }, + { "hehinitialarabic", 0xfeeb }, + { "hehiragana", 0x3078 }, + { "hehmedialaltonearabic", 0xfba9 }, + { "hehmedialarabic", 0xfeec }, + { "heiseierasquare", 0x337b }, + { "hekatakana", 0x30d8 }, + { "hekatakanahalfwidth", 0xff8d }, + { "hekutaarusquare", 0x3336 }, + { "henghook", 0x0267 }, + { "herutusquare", 0x3339 }, + { "het", 0x05d7 }, + { "hethebrew", 0x05d7 }, + { "hhook", 0x0266 }, + { "hhooksuperior", 0x02b1 }, + { "hieuhacirclekorean", 0x327b }, + { "hieuhaparenkorean", 0x321b }, + { "hieuhcirclekorean", 0x326d }, + { "hieuhkorean", 0x314e }, + { "hieuhparenkorean", 0x320d }, + { "hihiragana", 0x3072 }, + { "hikatakana", 0x30d2 }, + { "hikatakanahalfwidth", 0xff8b }, + { "hiriq", 0x05b4 }, + { "hiriq14", 0x05b4 }, + { "hiriq21", 0x05b4 }, + { "hiriq2d", 0x05b4 }, + { "hiriqhebrew", 0x05b4 }, + { "hiriqnarrowhebrew", 0x05b4 }, + { "hiriqquarterhebrew", 0x05b4 }, + { "hiriqwidehebrew", 0x05b4 }, + { "hlinebelow", 0x1e96 }, + { "hmonospace", 0xff48 }, + { "hoarmenian", 0x0570 }, + { "hohipthai", 0x0e2b }, + { "hohiragana", 0x307b }, + { "hokatakana", 0x30db }, + { "hokatakanahalfwidth", 0xff8e }, + { "holam", 0x05b9 }, + { "holam19", 0x05b9 }, + { "holam26", 0x05b9 }, + { "holam32", 0x05b9 }, + { "holamhebrew", 0x05b9 }, + { "holamnarrowhebrew", 0x05b9 }, + { "holamquarterhebrew", 0x05b9 }, + { "holamwidehebrew", 0x05b9 }, + { "honokhukthai", 0x0e2e }, + { "hookcmb", 0x0309 }, + { "hookpalatalizedbelowcmb", 0x0321 }, + { "hookretroflexbelowcmb", 0x0322 }, + { "hoonsquare", 0x3342 }, + { "horicoptic", 0x03e9 }, + { "horizontalbar", 0x2015 }, + { "horncmb", 0x031b }, + { "hotsprings", 0x2668 }, + { "hparen", 0x24a3 }, + { "hsuperior", 0x02b0 }, + { "hturned", 0x0265 }, + { "huhiragana", 0x3075 }, + { "huiitosquare", 0x3333 }, + { "hukatakana", 0x30d5 }, + { "hukatakanahalfwidth", 0xff8c }, + { "hungarumlautcmb", 0x030b }, + { "hv", 0x0195 }, + { "hypheninferior", 0xf6e5 }, + { "hyphenmonospace", 0xff0d }, + { "hyphensmall", 0xfe63 }, + { "hyphensuperior", 0xf6e6 }, + { "hyphentwo", 0x2010 }, + { "iacyrillic", 0x044f }, + { "ibengali", 0x0987 }, + { "ibopomofo", 0x3127 }, + { "icaron", 0x01d0 }, + { "icircle", 0x24d8 }, + { "icyrillic", 0x0456 }, + { "idblgrave", 0x0209 }, + { "ideographearthcircle", 0x328f }, + { "ideographfirecircle", 0x328b }, + { "ideographicallianceparen", 0x323f }, + { "ideographiccallparen", 0x323a }, + { "ideographiccentrecircle", 0x32a5 }, + { "ideographicclose", 0x3006 }, + { "ideographiccomma", 0x3001 }, + { "ideographiccommaleft", 0xff64 }, + { "ideographiccongratulationparen", 0x3237 }, + { "ideographiccorrectcircle", 0x32a3 }, + { "ideographicearthparen", 0x322f }, + { "ideographicenterpriseparen", 0x323d }, + { "ideographicexcellentcircle", 0x329d }, + { "ideographicfestivalparen", 0x3240 }, + { "ideographicfinancialcircle", 0x3296 }, + { "ideographicfinancialparen", 0x3236 }, + { "ideographicfireparen", 0x322b }, + { "ideographichaveparen", 0x3232 }, + { "ideographichighcircle", 0x32a4 }, + { "ideographiciterationmark", 0x3005 }, + { "ideographiclaborcircle", 0x3298 }, + { "ideographiclaborparen", 0x3238 }, + { "ideographicleftcircle", 0x32a7 }, + { "ideographiclowcircle", 0x32a6 }, + { "ideographicmedicinecircle", 0x32a9 }, + { "ideographicmetalparen", 0x322e }, + { "ideographicmoonparen", 0x322a }, + { "ideographicnameparen", 0x3234 }, + { "ideographicperiod", 0x3002 }, + { "ideographicprintcircle", 0x329e }, + { "ideographicreachparen", 0x3243 }, + { "ideographicrepresentparen", 0x3239 }, + { "ideographicresourceparen", 0x323e }, + { "ideographicrightcircle", 0x32a8 }, + { "ideographicsecretcircle", 0x3299 }, + { "ideographicselfparen", 0x3242 }, + { "ideographicsocietyparen", 0x3233 }, + { "ideographicspace", 0x3000 }, + { "ideographicspecialparen", 0x3235 }, + { "ideographicstockparen", 0x3231 }, + { "ideographicstudyparen", 0x323b }, + { "ideographicsunparen", 0x3230 }, + { "ideographicsuperviseparen", 0x323c }, + { "ideographicwaterparen", 0x322c }, + { "ideographicwoodparen", 0x322d }, + { "ideographiczero", 0x3007 }, + { "ideographmetalcircle", 0x328e }, + { "ideographmooncircle", 0x328a }, + { "ideographnamecircle", 0x3294 }, + { "ideographsuncircle", 0x3290 }, + { "ideographwatercircle", 0x328c }, + { "ideographwoodcircle", 0x328d }, + { "ideva", 0x0907 }, + { "idieresisacute", 0x1e2f }, + { "idieresiscyrillic", 0x04e5 }, + { "idotbelow", 0x1ecb }, + { "iebrevecyrillic", 0x04d7 }, + { "iecyrillic", 0x0435 }, + { "ieungacirclekorean", 0x3275 }, + { "ieungaparenkorean", 0x3215 }, + { "ieungcirclekorean", 0x3267 }, + { "ieungkorean", 0x3147 }, + { "ieungparenkorean", 0x3207 }, + { "igujarati", 0x0a87 }, + { "igurmukhi", 0x0a07 }, + { "ihiragana", 0x3044 }, + { "ihookabove", 0x1ec9 }, + { "iibengali", 0x0988 }, + { "iicyrillic", 0x0438 }, + { "iideva", 0x0908 }, + { "iigujarati", 0x0a88 }, + { "iigurmukhi", 0x0a08 }, + { "iimatragurmukhi", 0x0a40 }, + { "iinvertedbreve", 0x020b }, + { "iishortcyrillic", 0x0439 }, + { "iivowelsignbengali", 0x09c0 }, + { "iivowelsigndeva", 0x0940 }, + { "iivowelsigngujarati", 0x0ac0 }, + { "ikatakana", 0x30a4 }, + { "ikatakanahalfwidth", 0xff72 }, + { "ikorean", 0x3163 }, + { "ilde", 0x02dc }, + { "iluyhebrew", 0x05ac }, + { "imacroncyrillic", 0x04e3 }, + { "imageorapproximatelyequal", 0x2253 }, + { "imatragurmukhi", 0x0a3f }, + { "imonospace", 0xff49 }, + { "increment", 0x2206 }, + { "iniarmenian", 0x056b }, + { "integralbottom", 0x2321 }, + { "integralex", 0xf8f5 }, + { "integraltop", 0x2320 }, + { "intisquare", 0x3305 }, + { "iocyrillic", 0x0451 }, + { "iotalatin", 0x0269 }, + { "iparen", 0x24a4 }, + { "irigurmukhi", 0x0a72 }, + { "ismallhiragana", 0x3043 }, + { "ismallkatakana", 0x30a3 }, + { "ismallkatakanahalfwidth", 0xff68 }, + { "issharbengali", 0x09fa }, + { "istroke", 0x0268 }, + { "isuperior", 0xf6ed }, + { "iterationhiragana", 0x309d }, + { "iterationkatakana", 0x30fd }, + { "itildebelow", 0x1e2d }, + { "iubopomofo", 0x3129 }, + { "iucyrillic", 0x044e }, + { "ivowelsignbengali", 0x09bf }, + { "ivowelsigndeva", 0x093f }, + { "ivowelsigngujarati", 0x0abf }, + { "izhitsacyrillic", 0x0475 }, + { "izhitsadblgravecyrillic", 0x0477 }, + { "jaarmenian", 0x0571 }, + { "jabengali", 0x099c }, + { "jadeva", 0x091c }, + { "jagujarati", 0x0a9c }, + { "jagurmukhi", 0x0a1c }, + { "jbopomofo", 0x3110 }, + { "jcaron", 0x01f0 }, + { "jcircle", 0x24d9 }, + { "jcrossedtail", 0x029d }, + { "jdotlessstroke", 0x025f }, + { "jecyrillic", 0x0458 }, + { "jeemarabic", 0x062c }, + { "jeemfinalarabic", 0xfe9e }, + { "jeeminitialarabic", 0xfe9f }, + { "jeemmedialarabic", 0xfea0 }, + { "jeharabic", 0x0698 }, + { "jehfinalarabic", 0xfb8b }, + { "jhabengali", 0x099d }, + { "jhadeva", 0x091d }, + { "jhagujarati", 0x0a9d }, + { "jhagurmukhi", 0x0a1d }, + { "jheharmenian", 0x057b }, + { "jis", 0x3004 }, + { "jmonospace", 0xff4a }, + { "jparen", 0x24a5 }, + { "jsuperior", 0x02b2 }, + { "kabashkircyrillic", 0x04a1 }, + { "kabengali", 0x0995 }, + { "kacute", 0x1e31 }, + { "kacyrillic", 0x043a }, + { "kadescendercyrillic", 0x049b }, + { "kadeva", 0x0915 }, + { "kaf", 0x05db }, + { "kafarabic", 0x0643 }, + { "kafdagesh", 0xfb3b }, + { "kafdageshhebrew", 0xfb3b }, + { "kaffinalarabic", 0xfeda }, + { "kafhebrew", 0x05db }, + { "kafinitialarabic", 0xfedb }, + { "kafmedialarabic", 0xfedc }, + { "kafrafehebrew", 0xfb4d }, + { "kagujarati", 0x0a95 }, + { "kagurmukhi", 0x0a15 }, + { "kahiragana", 0x304b }, + { "kahookcyrillic", 0x04c4 }, + { "kakatakana", 0x30ab }, + { "kakatakanahalfwidth", 0xff76 }, + { "kappasymbolgreek", 0x03f0 }, + { "kapyeounmieumkorean", 0x3171 }, + { "kapyeounphieuphkorean", 0x3184 }, + { "kapyeounpieupkorean", 0x3178 }, + { "kapyeounssangpieupkorean", 0x3179 }, + { "karoriisquare", 0x330d }, + { "kashidaautoarabic", 0x0640 }, + { "kashidaautonosidebearingarabic", 0x0640 }, + { "kasmallkatakana", 0x30f5 }, + { "kasquare", 0x3384 }, + { "kasraarabic", 0x0650 }, + { "kasratanarabic", 0x064d }, + { "kastrokecyrillic", 0x049f }, + { "katahiraprolongmarkhalfwidth", 0xff70 }, + { "kaverticalstrokecyrillic", 0x049d }, + { "kbopomofo", 0x310e }, + { "kcalsquare", 0x3389 }, + { "kcaron", 0x01e9 }, + { "kcedilla", 0x0137 }, + { "kcircle", 0x24da }, + { "kdotbelow", 0x1e33 }, + { "keharmenian", 0x0584 }, + { "kehiragana", 0x3051 }, + { "kekatakana", 0x30b1 }, + { "kekatakanahalfwidth", 0xff79 }, + { "kenarmenian", 0x056f }, + { "kesmallkatakana", 0x30f6 }, + { "khabengali", 0x0996 }, + { "khacyrillic", 0x0445 }, + { "khadeva", 0x0916 }, + { "khagujarati", 0x0a96 }, + { "khagurmukhi", 0x0a16 }, + { "khaharabic", 0x062e }, + { "khahfinalarabic", 0xfea6 }, + { "khahinitialarabic", 0xfea7 }, + { "khahmedialarabic", 0xfea8 }, + { "kheicoptic", 0x03e7 }, + { "khhadeva", 0x0959 }, + { "khhagurmukhi", 0x0a59 }, + { "khieukhacirclekorean", 0x3278 }, + { "khieukhaparenkorean", 0x3218 }, + { "khieukhcirclekorean", 0x326a }, + { "khieukhkorean", 0x314b }, + { "khieukhparenkorean", 0x320a }, + { "khokhaithai", 0x0e02 }, + { "khokhonthai", 0x0e05 }, + { "khokhuatthai", 0x0e03 }, + { "khokhwaithai", 0x0e04 }, + { "khomutthai", 0x0e5b }, + { "khook", 0x0199 }, + { "khorakhangthai", 0x0e06 }, + { "khzsquare", 0x3391 }, + { "kihiragana", 0x304d }, + { "kikatakana", 0x30ad }, + { "kikatakanahalfwidth", 0xff77 }, + { "kiroguramusquare", 0x3315 }, + { "kiromeetorusquare", 0x3316 }, + { "kirosquare", 0x3314 }, + { "kiyeokacirclekorean", 0x326e }, + { "kiyeokaparenkorean", 0x320e }, + { "kiyeokcirclekorean", 0x3260 }, + { "kiyeokkorean", 0x3131 }, + { "kiyeokparenkorean", 0x3200 }, + { "kiyeoksioskorean", 0x3133 }, + { "kjecyrillic", 0x045c }, + { "klinebelow", 0x1e35 }, + { "klsquare", 0x3398 }, + { "kmcubedsquare", 0x33a6 }, + { "kmonospace", 0xff4b }, + { "kmsquaredsquare", 0x33a2 }, + { "kohiragana", 0x3053 }, + { "kohmsquare", 0x33c0 }, + { "kokaithai", 0x0e01 }, + { "kokatakana", 0x30b3 }, + { "kokatakanahalfwidth", 0xff7a }, + { "kooposquare", 0x331e }, + { "koppacyrillic", 0x0481 }, + { "koreanstandardsymbol", 0x327f }, + { "koroniscmb", 0x0343 }, + { "kparen", 0x24a6 }, + { "kpasquare", 0x33aa }, + { "ksicyrillic", 0x046f }, + { "ktsquare", 0x33cf }, + { "kturned", 0x029e }, + { "kuhiragana", 0x304f }, + { "kukatakana", 0x30af }, + { "kukatakanahalfwidth", 0xff78 }, + { "kvsquare", 0x33b8 }, + { "kwsquare", 0x33be }, + { "labengali", 0x09b2 }, + { "ladeva", 0x0932 }, + { "lagujarati", 0x0ab2 }, + { "lagurmukhi", 0x0a32 }, + { "lakkhangyaothai", 0x0e45 }, + { "lamaleffinalarabic", 0xfefc }, + { "lamalefhamzaabovefinalarabic", 0xfef8 }, + { "lamalefhamzaaboveisolatedarabic", 0xfef7 }, + { "lamalefhamzabelowfinalarabic", 0xfefa }, + { "lamalefhamzabelowisolatedarabic", 0xfef9 }, + { "lamalefisolatedarabic", 0xfefb }, + { "lamalefmaddaabovefinalarabic", 0xfef6 }, + { "lamalefmaddaaboveisolatedarabic", 0xfef5 }, + { "lamarabic", 0x0644 }, + { "lambdastroke", 0x019b }, + { "lamed", 0x05dc }, + { "lameddagesh", 0xfb3c }, + { "lameddageshhebrew", 0xfb3c }, + { "lamedhebrew", 0x05dc }, + { "lamedholam", 0x05dc }, + { "lamedholamdagesh", 0x05dc }, + { "lamedholamdageshhebrew", 0x05dc }, + { "lamedholamhebrew", 0x05dc }, + { "lamfinalarabic", 0xfede }, + { "lamhahinitialarabic", 0xfcca }, + { "laminitialarabic", 0xfedf }, + { "lamjeeminitialarabic", 0xfcc9 }, + { "lamkhahinitialarabic", 0xfccb }, + { "lamlamhehisolatedarabic", 0xfdf2 }, + { "lammedialarabic", 0xfee0 }, + { "lammeemhahinitialarabic", 0xfd88 }, + { "lammeeminitialarabic", 0xfccc }, + { "lammeemjeeminitialarabic", 0xfedf }, + { "lammeemkhahinitialarabic", 0xfedf }, + { "largecircle", 0x25ef }, + { "lbar", 0x019a }, + { "lbelt", 0x026c }, + { "lbopomofo", 0x310c }, + { "lcedilla", 0x013c }, + { "lcircle", 0x24db }, + { "lcircumflexbelow", 0x1e3d }, + { "ldotaccent", 0x0140 }, + { "ldotbelow", 0x1e37 }, + { "ldotbelowmacron", 0x1e39 }, + { "leftangleabovecmb", 0x031a }, + { "lefttackbelowcmb", 0x0318 }, + { "lessequalorgreater", 0x22da }, + { "lessmonospace", 0xff1c }, + { "lessorequivalent", 0x2272 }, + { "lessorgreater", 0x2276 }, + { "lessoverequal", 0x2266 }, + { "lesssmall", 0xfe64 }, + { "lezh", 0x026e }, + { "lhookretroflex", 0x026d }, + { "liwnarmenian", 0x056c }, + { "lj", 0x01c9 }, + { "ljecyrillic", 0x0459 }, + { "ll", 0xf6c0 }, + { "lladeva", 0x0933 }, + { "llagujarati", 0x0ab3 }, + { "llinebelow", 0x1e3b }, + { "llladeva", 0x0934 }, + { "llvocalicbengali", 0x09e1 }, + { "llvocalicdeva", 0x0961 }, + { "llvocalicvowelsignbengali", 0x09e3 }, + { "llvocalicvowelsigndeva", 0x0963 }, + { "lmiddletilde", 0x026b }, + { "lmonospace", 0xff4c }, + { "lmsquare", 0x33d0 }, + { "lochulathai", 0x0e2c }, + { "logicalnotreversed", 0x2310 }, + { "lolingthai", 0x0e25 }, + { "lowlinecenterline", 0xfe4e }, + { "lowlinecmb", 0x0332 }, + { "lowlinedashed", 0xfe4d }, + { "lparen", 0x24a7 }, + { "lsquare", 0x2113 }, + { "lsuperior", 0xf6ee }, + { "luthai", 0x0e26 }, + { "lvocalicbengali", 0x098c }, + { "lvocalicdeva", 0x090c }, + { "lvocalicvowelsignbengali", 0x09e2 }, + { "lvocalicvowelsigndeva", 0x0962 }, + { "lxsquare", 0x33d3 }, + { "mabengali", 0x09ae }, + { "macronbelowcmb", 0x0331 }, + { "macroncmb", 0x0304 }, + { "macronlowmod", 0x02cd }, + { "macronmonospace", 0xffe3 }, + { "macute", 0x1e3f }, + { "madeva", 0x092e }, + { "magujarati", 0x0aae }, + { "magurmukhi", 0x0a2e }, + { "mahapakhhebrew", 0x05a4 }, + { "mahapakhlefthebrew", 0x05a4 }, + { "mahiragana", 0x307e }, + { "maichattawalowleftthai", 0xf895 }, + { "maichattawalowrightthai", 0xf894 }, + { "maichattawathai", 0x0e4b }, + { "maichattawaupperleftthai", 0xf893 }, + { "maieklowleftthai", 0xf88c }, + { "maieklowrightthai", 0xf88b }, + { "maiekthai", 0x0e48 }, + { "maiekupperleftthai", 0xf88a }, + { "maihanakatleftthai", 0xf884 }, + { "maihanakatthai", 0x0e31 }, + { "maitaikhuleftthai", 0xf889 }, + { "maitaikhuthai", 0x0e47 }, + { "maitholowleftthai", 0xf88f }, + { "maitholowrightthai", 0xf88e }, + { "maithothai", 0x0e49 }, + { "maithoupperleftthai", 0xf88d }, + { "maitrilowleftthai", 0xf892 }, + { "maitrilowrightthai", 0xf891 }, + { "maitrithai", 0x0e4a }, + { "maitriupperleftthai", 0xf890 }, + { "maiyamokthai", 0x0e46 }, + { "makatakana", 0x30de }, + { "makatakanahalfwidth", 0xff8f }, + { "mansyonsquare", 0x3347 }, + { "maqafhebrew", 0x05be }, + { "mars", 0x2642 }, + { "masoracirclehebrew", 0x05af }, + { "masquare", 0x3383 }, + { "mbopomofo", 0x3107 }, + { "mbsquare", 0x33d4 }, + { "mcircle", 0x24dc }, + { "mcubedsquare", 0x33a5 }, + { "mdotaccent", 0x1e41 }, + { "mdotbelow", 0x1e43 }, + { "meemarabic", 0x0645 }, + { "meemfinalarabic", 0xfee2 }, + { "meeminitialarabic", 0xfee3 }, + { "meemmedialarabic", 0xfee4 }, + { "meemmeeminitialarabic", 0xfcd1 }, + { "meemmeemisolatedarabic", 0xfc48 }, + { "meetorusquare", 0x334d }, + { "mehiragana", 0x3081 }, + { "meizierasquare", 0x337e }, + { "mekatakana", 0x30e1 }, + { "mekatakanahalfwidth", 0xff92 }, + { "mem", 0x05de }, + { "memdagesh", 0xfb3e }, + { "memdageshhebrew", 0xfb3e }, + { "memhebrew", 0x05de }, + { "menarmenian", 0x0574 }, + { "merkhahebrew", 0x05a5 }, + { "merkhakefulahebrew", 0x05a6 }, + { "merkhakefulalefthebrew", 0x05a6 }, + { "merkhalefthebrew", 0x05a5 }, + { "mhook", 0x0271 }, + { "mhzsquare", 0x3392 }, + { "middledotkatakanahalfwidth", 0xff65 }, + { "middot", 0x00b7 }, + { "mieumacirclekorean", 0x3272 }, + { "mieumaparenkorean", 0x3212 }, + { "mieumcirclekorean", 0x3264 }, + { "mieumkorean", 0x3141 }, + { "mieumpansioskorean", 0x3170 }, + { "mieumparenkorean", 0x3204 }, + { "mieumpieupkorean", 0x316e }, + { "mieumsioskorean", 0x316f }, + { "mihiragana", 0x307f }, + { "mikatakana", 0x30df }, + { "mikatakanahalfwidth", 0xff90 }, + { "minusbelowcmb", 0x0320 }, + { "minuscircle", 0x2296 }, + { "minusmod", 0x02d7 }, + { "minusplus", 0x2213 }, + { "miribaarusquare", 0x334a }, + { "mirisquare", 0x3349 }, + { "mlonglegturned", 0x0270 }, + { "mlsquare", 0x3396 }, + { "mmcubedsquare", 0x33a3 }, + { "mmonospace", 0xff4d }, + { "mmsquaredsquare", 0x339f }, + { "mohiragana", 0x3082 }, + { "mohmsquare", 0x33c1 }, + { "mokatakana", 0x30e2 }, + { "mokatakanahalfwidth", 0xff93 }, + { "molsquare", 0x33d6 }, + { "momathai", 0x0e21 }, + { "moverssquare", 0x33a7 }, + { "moverssquaredsquare", 0x33a8 }, + { "mparen", 0x24a8 }, + { "mpasquare", 0x33ab }, + { "mssquare", 0x33b3 }, + { "msuperior", 0xf6ef }, + { "mturned", 0x026f }, + { "mu1", 0x00b5 }, + { "muasquare", 0x3382 }, + { "muchgreater", 0x226b }, + { "muchless", 0x226a }, + { "mufsquare", 0x338c }, + { "mugreek", 0x03bc }, + { "mugsquare", 0x338d }, + { "muhiragana", 0x3080 }, + { "mukatakana", 0x30e0 }, + { "mukatakanahalfwidth", 0xff91 }, + { "mulsquare", 0x3395 }, + { "mumsquare", 0x339b }, + { "munahhebrew", 0x05a3 }, + { "munahlefthebrew", 0x05a3 }, + { "musicflatsign", 0x266d }, + { "musicsharpsign", 0x266f }, + { "mussquare", 0x33b2 }, + { "muvsquare", 0x33b6 }, + { "muwsquare", 0x33bc }, + { "mvmegasquare", 0x33b9 }, + { "mvsquare", 0x33b7 }, + { "mwmegasquare", 0x33bf }, + { "mwsquare", 0x33bd }, + { "nabengali", 0x09a8 }, + { "nabla", 0x2207 }, + { "nadeva", 0x0928 }, + { "nagujarati", 0x0aa8 }, + { "nagurmukhi", 0x0a28 }, + { "nahiragana", 0x306a }, + { "nakatakana", 0x30ca }, + { "nakatakanahalfwidth", 0xff85 }, + { "nasquare", 0x3381 }, + { "nbopomofo", 0x310b }, + { "nbspace", 0x00a0 }, + { "ncedilla", 0x0146 }, + { "ncircle", 0x24dd }, + { "ncircumflexbelow", 0x1e4b }, + { "ndotaccent", 0x1e45 }, + { "ndotbelow", 0x1e47 }, + { "nehiragana", 0x306d }, + { "nekatakana", 0x30cd }, + { "nekatakanahalfwidth", 0xff88 }, + { "newsheqelsign", 0x20aa }, + { "nfsquare", 0x338b }, + { "ngabengali", 0x0999 }, + { "ngadeva", 0x0919 }, + { "ngagujarati", 0x0a99 }, + { "ngagurmukhi", 0x0a19 }, + { "ngonguthai", 0x0e07 }, + { "nhiragana", 0x3093 }, + { "nhookleft", 0x0272 }, + { "nhookretroflex", 0x0273 }, + { "nieunacirclekorean", 0x326f }, + { "nieunaparenkorean", 0x320f }, + { "nieuncieuckorean", 0x3135 }, + { "nieuncirclekorean", 0x3261 }, + { "nieunhieuhkorean", 0x3136 }, + { "nieunkorean", 0x3134 }, + { "nieunpansioskorean", 0x3168 }, + { "nieunparenkorean", 0x3201 }, + { "nieunsioskorean", 0x3167 }, + { "nieuntikeutkorean", 0x3166 }, + { "nihiragana", 0x306b }, + { "nikatakana", 0x30cb }, + { "nikatakanahalfwidth", 0xff86 }, + { "nikhahitleftthai", 0xf899 }, + { "nikhahitthai", 0x0e4d }, + { "ninearabic", 0x0669 }, + { "ninebengali", 0x09ef }, + { "ninecircle", 0x2468 }, + { "ninecircleinversesansserif", 0x2792 }, + { "ninedeva", 0x096f }, + { "ninegujarati", 0x0aef }, + { "ninegurmukhi", 0x0a6f }, + { "ninehackarabic", 0x0669 }, + { "ninehangzhou", 0x3029 }, + { "nineideographicparen", 0x3228 }, + { "nineinferior", 0x2089 }, + { "ninemonospace", 0xff19 }, + { "nineoldstyle", 0xf739 }, + { "nineparen", 0x247c }, + { "nineperiod", 0x2490 }, + { "ninepersian", 0x06f9 }, + { "nineroman", 0x2178 }, + { "ninesuperior", 0x2079 }, + { "nineteencircle", 0x2472 }, + { "nineteenparen", 0x2486 }, + { "nineteenperiod", 0x249a }, + { "ninethai", 0x0e59 }, + { "nj", 0x01cc }, + { "njecyrillic", 0x045a }, + { "nkatakana", 0x30f3 }, + { "nkatakanahalfwidth", 0xff9d }, + { "nlegrightlong", 0x019e }, + { "nlinebelow", 0x1e49 }, + { "nmonospace", 0xff4e }, + { "nmsquare", 0x339a }, + { "nnabengali", 0x09a3 }, + { "nnadeva", 0x0923 }, + { "nnagujarati", 0x0aa3 }, + { "nnagurmukhi", 0x0a23 }, + { "nnnadeva", 0x0929 }, + { "nohiragana", 0x306e }, + { "nokatakana", 0x30ce }, + { "nokatakanahalfwidth", 0xff89 }, + { "nonbreakingspace", 0x00a0 }, + { "nonenthai", 0x0e13 }, + { "nonuthai", 0x0e19 }, + { "noonarabic", 0x0646 }, + { "noonfinalarabic", 0xfee6 }, + { "noonghunnaarabic", 0x06ba }, + { "noonghunnafinalarabic", 0xfb9f }, + { "noonhehinitialarabic", 0xfee7 }, + { "nooninitialarabic", 0xfee7 }, + { "noonjeeminitialarabic", 0xfcd2 }, + { "noonjeemisolatedarabic", 0xfc4b }, + { "noonmedialarabic", 0xfee8 }, + { "noonmeeminitialarabic", 0xfcd5 }, + { "noonmeemisolatedarabic", 0xfc4e }, + { "noonnoonfinalarabic", 0xfc8d }, + { "notcontains", 0x220c }, + { "notelementof", 0x2209 }, + { "notgreater", 0x226f }, + { "notgreaternorequal", 0x2271 }, + { "notgreaternorless", 0x2279 }, + { "notidentical", 0x2262 }, + { "notless", 0x226e }, + { "notlessnorequal", 0x2270 }, + { "notparallel", 0x2226 }, + { "notprecedes", 0x2280 }, + { "notsucceeds", 0x2281 }, + { "notsuperset", 0x2285 }, + { "nowarmenian", 0x0576 }, + { "nparen", 0x24a9 }, + { "nssquare", 0x33b1 }, + { "nsuperior", 0x207f }, + { "nuhiragana", 0x306c }, + { "nukatakana", 0x30cc }, + { "nukatakanahalfwidth", 0xff87 }, + { "nuktabengali", 0x09bc }, + { "nuktadeva", 0x093c }, + { "nuktagujarati", 0x0abc }, + { "nuktagurmukhi", 0x0a3c }, + { "numbersignmonospace", 0xff03 }, + { "numbersignsmall", 0xfe5f }, + { "numeralsigngreek", 0x0374 }, + { "numeralsignlowergreek", 0x0375 }, + { "numero", 0x2116 }, + { "nun", 0x05e0 }, + { "nundagesh", 0xfb40 }, + { "nundageshhebrew", 0xfb40 }, + { "nunhebrew", 0x05e0 }, + { "nvsquare", 0x33b5 }, + { "nwsquare", 0x33bb }, + { "nyabengali", 0x099e }, + { "nyadeva", 0x091e }, + { "nyagujarati", 0x0a9e }, + { "nyagurmukhi", 0x0a1e }, + { "oangthai", 0x0e2d }, + { "obarred", 0x0275 }, + { "obarredcyrillic", 0x04e9 }, + { "obarreddieresiscyrillic", 0x04eb }, + { "obengali", 0x0993 }, + { "obopomofo", 0x311b }, + { "ocandradeva", 0x0911 }, + { "ocandragujarati", 0x0a91 }, + { "ocandravowelsigndeva", 0x0949 }, + { "ocandravowelsigngujarati", 0x0ac9 }, + { "ocaron", 0x01d2 }, + { "ocircle", 0x24de }, + { "ocircumflexacute", 0x1ed1 }, + { "ocircumflexdotbelow", 0x1ed9 }, + { "ocircumflexgrave", 0x1ed3 }, + { "ocircumflexhookabove", 0x1ed5 }, + { "ocircumflextilde", 0x1ed7 }, + { "ocyrillic", 0x043e }, + { "odblacute", 0x0151 }, + { "odblgrave", 0x020d }, + { "odeva", 0x0913 }, + { "odieresiscyrillic", 0x04e7 }, + { "odotbelow", 0x1ecd }, + { "oekorean", 0x315a }, + { "ogonekcmb", 0x0328 }, + { "ogujarati", 0x0a93 }, + { "oharmenian", 0x0585 }, + { "ohiragana", 0x304a }, + { "ohookabove", 0x1ecf }, + { "ohornacute", 0x1edb }, + { "ohorndotbelow", 0x1ee3 }, + { "ohorngrave", 0x1edd }, + { "ohornhookabove", 0x1edf }, + { "ohorntilde", 0x1ee1 }, + { "oi", 0x01a3 }, + { "oinvertedbreve", 0x020f }, + { "okatakana", 0x30aa }, + { "okatakanahalfwidth", 0xff75 }, + { "okorean", 0x3157 }, + { "olehebrew", 0x05ab }, + { "omacronacute", 0x1e53 }, + { "omacrongrave", 0x1e51 }, + { "omdeva", 0x0950 }, + { "omegacyrillic", 0x0461 }, + { "omegalatinclosed", 0x0277 }, + { "omegaroundcyrillic", 0x047b }, + { "omegatitlocyrillic", 0x047d }, + { "omgujarati", 0x0ad0 }, + { "omonospace", 0xff4f }, + { "onearabic", 0x0661 }, + { "onebengali", 0x09e7 }, + { "onecircle", 0x2460 }, + { "onecircleinversesansserif", 0x278a }, + { "onedeva", 0x0967 }, + { "onefitted", 0xf6dc }, + { "onegujarati", 0x0ae7 }, + { "onegurmukhi", 0x0a67 }, + { "onehackarabic", 0x0661 }, + { "onehangzhou", 0x3021 }, + { "oneideographicparen", 0x3220 }, + { "oneinferior", 0x2081 }, + { "onemonospace", 0xff11 }, + { "onenumeratorbengali", 0x09f4 }, + { "oneoldstyle", 0xf731 }, + { "oneparen", 0x2474 }, + { "oneperiod", 0x2488 }, + { "onepersian", 0x06f1 }, + { "oneroman", 0x2170 }, + { "onesuperior", 0x00b9 }, + { "onethai", 0x0e51 }, + { "oogonek", 0x01eb }, + { "oogonekmacron", 0x01ed }, + { "oogurmukhi", 0x0a13 }, + { "oomatragurmukhi", 0x0a4b }, + { "oopen", 0x0254 }, + { "oparen", 0x24aa }, + { "option", 0x2325 }, + { "oshortdeva", 0x0912 }, + { "oshortvowelsigndeva", 0x094a }, + { "osmallhiragana", 0x3049 }, + { "osmallkatakana", 0x30a9 }, + { "osmallkatakanahalfwidth", 0xff6b }, + { "ostrokeacute", 0x01ff }, + { "osuperior", 0xf6f0 }, + { "otcyrillic", 0x047f }, + { "otildeacute", 0x1e4d }, + { "otildedieresis", 0x1e4f }, + { "oubopomofo", 0x3121 }, + { "overline", 0x203e }, + { "overlinecenterline", 0xfe4a }, + { "overlinecmb", 0x0305 }, + { "overlinedashed", 0xfe49 }, + { "overlinedblwavy", 0xfe4c }, + { "overlinewavy", 0xfe4b }, + { "overscore", 0x00af }, + { "ovowelsignbengali", 0x09cb }, + { "ovowelsigndeva", 0x094b }, + { "ovowelsigngujarati", 0x0acb }, + { "paampssquare", 0x3380 }, + { "paasentosquare", 0x332b }, + { "pabengali", 0x09aa }, + { "pacute", 0x1e55 }, + { "padeva", 0x092a }, + { "pagedown", 0x21df }, + { "pageup", 0x21de }, + { "pagujarati", 0x0aaa }, + { "pagurmukhi", 0x0a2a }, + { "pahiragana", 0x3071 }, + { "paiyannoithai", 0x0e2f }, + { "pakatakana", 0x30d1 }, + { "palatalizationcyrilliccmb", 0x0484 }, + { "palochkacyrillic", 0x04c0 }, + { "pansioskorean", 0x317f }, + { "parallel", 0x2225 }, + { "parenleftaltonearabic", 0xfd3e }, + { "parenleftbt", 0xf8ed }, + { "parenleftex", 0xf8ec }, + { "parenleftinferior", 0x208d }, + { "parenleftmonospace", 0xff08 }, + { "parenleftsmall", 0xfe59 }, + { "parenleftsuperior", 0x207d }, + { "parenlefttp", 0xf8eb }, + { "parenleftvertical", 0xfe35 }, + { "parenrightaltonearabic", 0xfd3f }, + { "parenrightbt", 0xf8f8 }, + { "parenrightex", 0xf8f7 }, + { "parenrightinferior", 0x208e }, + { "parenrightmonospace", 0xff09 }, + { "parenrightsmall", 0xfe5a }, + { "parenrightsuperior", 0x207e }, + { "parenrighttp", 0xf8f6 }, + { "parenrightvertical", 0xfe36 }, + { "paseqhebrew", 0x05c0 }, + { "pashtahebrew", 0x0599 }, + { "pasquare", 0x33a9 }, + { "patah", 0x05b7 }, + { "patah11", 0x05b7 }, + { "patah1d", 0x05b7 }, + { "patah2a", 0x05b7 }, + { "patahhebrew", 0x05b7 }, + { "patahnarrowhebrew", 0x05b7 }, + { "patahquarterhebrew", 0x05b7 }, + { "patahwidehebrew", 0x05b7 }, + { "pazerhebrew", 0x05a1 }, + { "pbopomofo", 0x3106 }, + { "pcircle", 0x24df }, + { "pdotaccent", 0x1e57 }, + { "pe", 0x05e4 }, + { "pecyrillic", 0x043f }, + { "pedagesh", 0xfb44 }, + { "pedageshhebrew", 0xfb44 }, + { "peezisquare", 0x333b }, + { "pefinaldageshhebrew", 0xfb43 }, + { "peharabic", 0x067e }, + { "peharmenian", 0x057a }, + { "pehebrew", 0x05e4 }, + { "pehfinalarabic", 0xfb57 }, + { "pehinitialarabic", 0xfb58 }, + { "pehiragana", 0x307a }, + { "pehmedialarabic", 0xfb59 }, + { "pekatakana", 0x30da }, + { "pemiddlehookcyrillic", 0x04a7 }, + { "perafehebrew", 0xfb4e }, + { "percentarabic", 0x066a }, + { "percentmonospace", 0xff05 }, + { "percentsmall", 0xfe6a }, + { "periodarmenian", 0x0589 }, + { "periodhalfwidth", 0xff61 }, + { "periodinferior", 0xf6e7 }, + { "periodmonospace", 0xff0e }, + { "periodsmall", 0xfe52 }, + { "periodsuperior", 0xf6e8 }, + { "perispomenigreekcmb", 0x0342 }, + { "pfsquare", 0x338a }, + { "phabengali", 0x09ab }, + { "phadeva", 0x092b }, + { "phagujarati", 0x0aab }, + { "phagurmukhi", 0x0a2b }, + { "phieuphacirclekorean", 0x327a }, + { "phieuphaparenkorean", 0x321a }, + { "phieuphcirclekorean", 0x326c }, + { "phieuphkorean", 0x314d }, + { "phieuphparenkorean", 0x320c }, + { "philatin", 0x0278 }, + { "phinthuthai", 0x0e3a }, + { "phisymbolgreek", 0x03d5 }, + { "phook", 0x01a5 }, + { "phophanthai", 0x0e1e }, + { "phophungthai", 0x0e1c }, + { "phosamphaothai", 0x0e20 }, + { "pieupacirclekorean", 0x3273 }, + { "pieupaparenkorean", 0x3213 }, + { "pieupcieuckorean", 0x3176 }, + { "pieupcirclekorean", 0x3265 }, + { "pieupkiyeokkorean", 0x3172 }, + { "pieupkorean", 0x3142 }, + { "pieupparenkorean", 0x3205 }, + { "pieupsioskiyeokkorean", 0x3174 }, + { "pieupsioskorean", 0x3144 }, + { "pieupsiostikeutkorean", 0x3175 }, + { "pieupthieuthkorean", 0x3177 }, + { "pieuptikeutkorean", 0x3173 }, + { "pihiragana", 0x3074 }, + { "pikatakana", 0x30d4 }, + { "pisymbolgreek", 0x03d6 }, + { "piwrarmenian", 0x0583 }, + { "plusbelowcmb", 0x031f }, + { "pluscircle", 0x2295 }, + { "plusmod", 0x02d6 }, + { "plusmonospace", 0xff0b }, + { "plussmall", 0xfe62 }, + { "plussuperior", 0x207a }, + { "pmonospace", 0xff50 }, + { "pmsquare", 0x33d8 }, + { "pohiragana", 0x307d }, + { "pointingindexdownwhite", 0x261f }, + { "pointingindexleftwhite", 0x261c }, + { "pointingindexrightwhite", 0x261e }, + { "pointingindexupwhite", 0x261d }, + { "pokatakana", 0x30dd }, + { "poplathai", 0x0e1b }, + { "postalmark", 0x3012 }, + { "postalmarkface", 0x3020 }, + { "pparen", 0x24ab }, + { "precedes", 0x227a }, + { "primemod", 0x02b9 }, + { "primereversed", 0x2035 }, + { "projective", 0x2305 }, + { "prolongedkana", 0x30fc }, + { "propellor", 0x2318 }, + { "proportion", 0x2237 }, + { "psicyrillic", 0x0471 }, + { "psilipneumatacyrilliccmb", 0x0486 }, + { "pssquare", 0x33b0 }, + { "puhiragana", 0x3077 }, + { "pukatakana", 0x30d7 }, + { "pvsquare", 0x33b4 }, + { "pwsquare", 0x33ba }, + { "qadeva", 0x0958 }, + { "qadmahebrew", 0x05a8 }, + { "qafarabic", 0x0642 }, + { "qaffinalarabic", 0xfed6 }, + { "qafinitialarabic", 0xfed7 }, + { "qafmedialarabic", 0xfed8 }, + { "qamats", 0x05b8 }, + { "qamats10", 0x05b8 }, + { "qamats1a", 0x05b8 }, + { "qamats1c", 0x05b8 }, + { "qamats27", 0x05b8 }, + { "qamats29", 0x05b8 }, + { "qamats33", 0x05b8 }, + { "qamatsde", 0x05b8 }, + { "qamatshebrew", 0x05b8 }, + { "qamatsnarrowhebrew", 0x05b8 }, + { "qamatsqatanhebrew", 0x05b8 }, + { "qamatsqatannarrowhebrew", 0x05b8 }, + { "qamatsqatanquarterhebrew", 0x05b8 }, + { "qamatsqatanwidehebrew", 0x05b8 }, + { "qamatsquarterhebrew", 0x05b8 }, + { "qamatswidehebrew", 0x05b8 }, + { "qarneyparahebrew", 0x059f }, + { "qbopomofo", 0x3111 }, + { "qcircle", 0x24e0 }, + { "qhook", 0x02a0 }, + { "qmonospace", 0xff51 }, + { "qof", 0x05e7 }, + { "qofdagesh", 0xfb47 }, + { "qofdageshhebrew", 0xfb47 }, + { "qofhatafpatah", 0x05e7 }, + { "qofhatafpatahhebrew", 0x05e7 }, + { "qofhatafsegol", 0x05e7 }, + { "qofhatafsegolhebrew", 0x05e7 }, + { "qofhebrew", 0x05e7 }, + { "qofhiriq", 0x05e7 }, + { "qofhiriqhebrew", 0x05e7 }, + { "qofholam", 0x05e7 }, + { "qofholamhebrew", 0x05e7 }, + { "qofpatah", 0x05e7 }, + { "qofpatahhebrew", 0x05e7 }, + { "qofqamats", 0x05e7 }, + { "qofqamatshebrew", 0x05e7 }, + { "qofqubuts", 0x05e7 }, + { "qofqubutshebrew", 0x05e7 }, + { "qofsegol", 0x05e7 }, + { "qofsegolhebrew", 0x05e7 }, + { "qofsheva", 0x05e7 }, + { "qofshevahebrew", 0x05e7 }, + { "qoftsere", 0x05e7 }, + { "qoftserehebrew", 0x05e7 }, + { "qparen", 0x24ac }, + { "quarternote", 0x2669 }, + { "qubuts", 0x05bb }, + { "qubuts18", 0x05bb }, + { "qubuts25", 0x05bb }, + { "qubuts31", 0x05bb }, + { "qubutshebrew", 0x05bb }, + { "qubutsnarrowhebrew", 0x05bb }, + { "qubutsquarterhebrew", 0x05bb }, + { "qubutswidehebrew", 0x05bb }, + { "questionarabic", 0x061f }, + { "questionarmenian", 0x055e }, + { "questiondownsmall", 0xf7bf }, + { "questiongreek", 0x037e }, + { "questionmonospace", 0xff1f }, + { "questionsmall", 0xf73f }, + { "quotedblmonospace", 0xff02 }, + { "quotedblprime", 0x301e }, + { "quotedblprimereversed", 0x301d }, + { "quoteleftreversed", 0x201b }, + { "quoterightn", 0x0149 }, + { "quotesinglemonospace", 0xff07 }, + { "raarmenian", 0x057c }, + { "rabengali", 0x09b0 }, + { "radeva", 0x0930 }, + { "radicalex", 0xf8e5 }, + { "radoverssquare", 0x33ae }, + { "radoverssquaredsquare", 0x33af }, + { "radsquare", 0x33ad }, + { "rafe", 0x05bf }, + { "rafehebrew", 0x05bf }, + { "ragujarati", 0x0ab0 }, + { "ragurmukhi", 0x0a30 }, + { "rahiragana", 0x3089 }, + { "rakatakana", 0x30e9 }, + { "rakatakanahalfwidth", 0xff97 }, + { "ralowerdiagonalbengali", 0x09f1 }, + { "ramiddlediagonalbengali", 0x09f0 }, + { "ramshorn", 0x0264 }, + { "ratio", 0x2236 }, + { "rbopomofo", 0x3116 }, + { "rcedilla", 0x0157 }, + { "rcircle", 0x24e1 }, + { "rdblgrave", 0x0211 }, + { "rdotaccent", 0x1e59 }, + { "rdotbelow", 0x1e5b }, + { "rdotbelowmacron", 0x1e5d }, + { "referencemark", 0x203b }, + { "registersans", 0xf8e8 }, + { "registerserif", 0xf6da }, + { "reharabic", 0x0631 }, + { "reharmenian", 0x0580 }, + { "rehfinalarabic", 0xfeae }, + { "rehiragana", 0x308c }, + { "rehyehaleflamarabic", 0x0631 }, + { "rekatakana", 0x30ec }, + { "rekatakanahalfwidth", 0xff9a }, + { "resh", 0x05e8 }, + { "reshdageshhebrew", 0xfb48 }, + { "reshhatafpatah", 0x05e8 }, + { "reshhatafpatahhebrew", 0x05e8 }, + { "reshhatafsegol", 0x05e8 }, + { "reshhatafsegolhebrew", 0x05e8 }, + { "reshhebrew", 0x05e8 }, + { "reshhiriq", 0x05e8 }, + { "reshhiriqhebrew", 0x05e8 }, + { "reshholam", 0x05e8 }, + { "reshholamhebrew", 0x05e8 }, + { "reshpatah", 0x05e8 }, + { "reshpatahhebrew", 0x05e8 }, + { "reshqamats", 0x05e8 }, + { "reshqamatshebrew", 0x05e8 }, + { "reshqubuts", 0x05e8 }, + { "reshqubutshebrew", 0x05e8 }, + { "reshsegol", 0x05e8 }, + { "reshsegolhebrew", 0x05e8 }, + { "reshsheva", 0x05e8 }, + { "reshshevahebrew", 0x05e8 }, + { "reshtsere", 0x05e8 }, + { "reshtserehebrew", 0x05e8 }, + { "reversedtilde", 0x223d }, + { "reviahebrew", 0x0597 }, + { "reviamugrashhebrew", 0x0597 }, + { "rfishhook", 0x027e }, + { "rfishhookreversed", 0x027f }, + { "rhabengali", 0x09dd }, + { "rhadeva", 0x095d }, + { "rhook", 0x027d }, + { "rhookturned", 0x027b }, + { "rhookturnedsuperior", 0x02b5 }, + { "rhosymbolgreek", 0x03f1 }, + { "rhotichookmod", 0x02de }, + { "rieulacirclekorean", 0x3271 }, + { "rieulaparenkorean", 0x3211 }, + { "rieulcirclekorean", 0x3263 }, + { "rieulhieuhkorean", 0x3140 }, + { "rieulkiyeokkorean", 0x313a }, + { "rieulkiyeoksioskorean", 0x3169 }, + { "rieulkorean", 0x3139 }, + { "rieulmieumkorean", 0x313b }, + { "rieulpansioskorean", 0x316c }, + { "rieulparenkorean", 0x3203 }, + { "rieulphieuphkorean", 0x313f }, + { "rieulpieupkorean", 0x313c }, + { "rieulpieupsioskorean", 0x316b }, + { "rieulsioskorean", 0x313d }, + { "rieulthieuthkorean", 0x313e }, + { "rieultikeutkorean", 0x316a }, + { "rieulyeorinhieuhkorean", 0x316d }, + { "rightangle", 0x221f }, + { "righttackbelowcmb", 0x0319 }, + { "righttriangle", 0x22bf }, + { "rihiragana", 0x308a }, + { "rikatakana", 0x30ea }, + { "rikatakanahalfwidth", 0xff98 }, + { "ringbelowcmb", 0x0325 }, + { "ringcmb", 0x030a }, + { "ringhalfleft", 0x02bf }, + { "ringhalfleftarmenian", 0x0559 }, + { "ringhalfleftbelowcmb", 0x031c }, + { "ringhalfleftcentered", 0x02d3 }, + { "ringhalfright", 0x02be }, + { "ringhalfrightbelowcmb", 0x0339 }, + { "ringhalfrightcentered", 0x02d2 }, + { "rinvertedbreve", 0x0213 }, + { "rittorusquare", 0x3351 }, + { "rlinebelow", 0x1e5f }, + { "rlongleg", 0x027c }, + { "rlonglegturned", 0x027a }, + { "rmonospace", 0xff52 }, + { "rohiragana", 0x308d }, + { "rokatakana", 0x30ed }, + { "rokatakanahalfwidth", 0xff9b }, + { "roruathai", 0x0e23 }, + { "rparen", 0x24ad }, + { "rrabengali", 0x09dc }, + { "rradeva", 0x0931 }, + { "rragurmukhi", 0x0a5c }, + { "rreharabic", 0x0691 }, + { "rrehfinalarabic", 0xfb8d }, + { "rrvocalicbengali", 0x09e0 }, + { "rrvocalicdeva", 0x0960 }, + { "rrvocalicgujarati", 0x0ae0 }, + { "rrvocalicvowelsignbengali", 0x09c4 }, + { "rrvocalicvowelsigndeva", 0x0944 }, + { "rrvocalicvowelsigngujarati", 0x0ac4 }, + { "rsuperior", 0xf6f1 }, + { "rturned", 0x0279 }, + { "rturnedsuperior", 0x02b4 }, + { "ruhiragana", 0x308b }, + { "rukatakana", 0x30eb }, + { "rukatakanahalfwidth", 0xff99 }, + { "rupeemarkbengali", 0x09f2 }, + { "rupeesignbengali", 0x09f3 }, + { "rupiah", 0xf6dd }, + { "ruthai", 0x0e24 }, + { "rvocalicbengali", 0x098b }, + { "rvocalicdeva", 0x090b }, + { "rvocalicgujarati", 0x0a8b }, + { "rvocalicvowelsignbengali", 0x09c3 }, + { "rvocalicvowelsigndeva", 0x0943 }, + { "rvocalicvowelsigngujarati", 0x0ac3 }, + { "sabengali", 0x09b8 }, + { "sacutedotaccent", 0x1e65 }, + { "sadarabic", 0x0635 }, + { "sadeva", 0x0938 }, + { "sadfinalarabic", 0xfeba }, + { "sadinitialarabic", 0xfebb }, + { "sadmedialarabic", 0xfebc }, + { "sagujarati", 0x0ab8 }, + { "sagurmukhi", 0x0a38 }, + { "sahiragana", 0x3055 }, + { "sakatakana", 0x30b5 }, + { "sakatakanahalfwidth", 0xff7b }, + { "sallallahoualayhewasallamarabic", 0xfdfa }, + { "samekh", 0x05e1 }, + { "samekhdagesh", 0xfb41 }, + { "samekhdageshhebrew", 0xfb41 }, + { "samekhhebrew", 0x05e1 }, + { "saraaathai", 0x0e32 }, + { "saraaethai", 0x0e41 }, + { "saraaimaimalaithai", 0x0e44 }, + { "saraaimaimuanthai", 0x0e43 }, + { "saraamthai", 0x0e33 }, + { "saraathai", 0x0e30 }, + { "saraethai", 0x0e40 }, + { "saraiileftthai", 0xf886 }, + { "saraiithai", 0x0e35 }, + { "saraileftthai", 0xf885 }, + { "saraithai", 0x0e34 }, + { "saraothai", 0x0e42 }, + { "saraueeleftthai", 0xf888 }, + { "saraueethai", 0x0e37 }, + { "saraueleftthai", 0xf887 }, + { "sarauethai", 0x0e36 }, + { "sarauthai", 0x0e38 }, + { "sarauuthai", 0x0e39 }, + { "sbopomofo", 0x3119 }, + { "scarondotaccent", 0x1e67 }, + { "schwa", 0x0259 }, + { "schwacyrillic", 0x04d9 }, + { "schwadieresiscyrillic", 0x04db }, + { "schwahook", 0x025a }, + { "scircle", 0x24e2 }, + { "sdotaccent", 0x1e61 }, + { "sdotbelow", 0x1e63 }, + { "sdotbelowdotaccent", 0x1e69 }, + { "seagullbelowcmb", 0x033c }, + { "secondtonechinese", 0x02ca }, + { "seenarabic", 0x0633 }, + { "seenfinalarabic", 0xfeb2 }, + { "seeninitialarabic", 0xfeb3 }, + { "seenmedialarabic", 0xfeb4 }, + { "segol", 0x05b6 }, + { "segol13", 0x05b6 }, + { "segol1f", 0x05b6 }, + { "segol2c", 0x05b6 }, + { "segolhebrew", 0x05b6 }, + { "segolnarrowhebrew", 0x05b6 }, + { "segolquarterhebrew", 0x05b6 }, + { "segoltahebrew", 0x0592 }, + { "segolwidehebrew", 0x05b6 }, + { "seharmenian", 0x057d }, + { "sehiragana", 0x305b }, + { "sekatakana", 0x30bb }, + { "sekatakanahalfwidth", 0xff7e }, + { "semicolonarabic", 0x061b }, + { "semicolonmonospace", 0xff1b }, + { "semicolonsmall", 0xfe54 }, + { "semivoicedmarkkana", 0x309c }, + { "semivoicedmarkkanahalfwidth", 0xff9f }, + { "sentisquare", 0x3322 }, + { "sentosquare", 0x3323 }, + { "sevenarabic", 0x0667 }, + { "sevenbengali", 0x09ed }, + { "sevencircle", 0x2466 }, + { "sevencircleinversesansserif", 0x2790 }, + { "sevendeva", 0x096d }, + { "sevengujarati", 0x0aed }, + { "sevengurmukhi", 0x0a6d }, + { "sevenhackarabic", 0x0667 }, + { "sevenhangzhou", 0x3027 }, + { "sevenideographicparen", 0x3226 }, + { "seveninferior", 0x2087 }, + { "sevenmonospace", 0xff17 }, + { "sevenoldstyle", 0xf737 }, + { "sevenparen", 0x247a }, + { "sevenperiod", 0x248e }, + { "sevenpersian", 0x06f7 }, + { "sevenroman", 0x2176 }, + { "sevensuperior", 0x2077 }, + { "seventeencircle", 0x2470 }, + { "seventeenparen", 0x2484 }, + { "seventeenperiod", 0x2498 }, + { "seventhai", 0x0e57 }, + { "sfthyphen", 0x00ad }, + { "shaarmenian", 0x0577 }, + { "shabengali", 0x09b6 }, + { "shacyrillic", 0x0448 }, + { "shaddaarabic", 0x0651 }, + { "shaddadammaarabic", 0xfc61 }, + { "shaddadammatanarabic", 0xfc5e }, + { "shaddafathaarabic", 0xfc60 }, + { "shaddafathatanarabic", 0x0651 }, + { "shaddakasraarabic", 0xfc62 }, + { "shaddakasratanarabic", 0xfc5f }, + { "shadedark", 0x2593 }, + { "shadelight", 0x2591 }, + { "shademedium", 0x2592 }, + { "shadeva", 0x0936 }, + { "shagujarati", 0x0ab6 }, + { "shagurmukhi", 0x0a36 }, + { "shalshelethebrew", 0x0593 }, + { "shbopomofo", 0x3115 }, + { "shchacyrillic", 0x0449 }, + { "sheenarabic", 0x0634 }, + { "sheenfinalarabic", 0xfeb6 }, + { "sheeninitialarabic", 0xfeb7 }, + { "sheenmedialarabic", 0xfeb8 }, + { "sheicoptic", 0x03e3 }, + { "sheqel", 0x20aa }, + { "sheqelhebrew", 0x20aa }, + { "sheva", 0x05b0 }, + { "sheva115", 0x05b0 }, + { "sheva15", 0x05b0 }, + { "sheva22", 0x05b0 }, + { "sheva2e", 0x05b0 }, + { "shevahebrew", 0x05b0 }, + { "shevanarrowhebrew", 0x05b0 }, + { "shevaquarterhebrew", 0x05b0 }, + { "shevawidehebrew", 0x05b0 }, + { "shhacyrillic", 0x04bb }, + { "shimacoptic", 0x03ed }, + { "shin", 0x05e9 }, + { "shindagesh", 0xfb49 }, + { "shindageshhebrew", 0xfb49 }, + { "shindageshshindot", 0xfb2c }, + { "shindageshshindothebrew", 0xfb2c }, + { "shindageshsindot", 0xfb2d }, + { "shindageshsindothebrew", 0xfb2d }, + { "shindothebrew", 0x05c1 }, + { "shinhebrew", 0x05e9 }, + { "shinshindot", 0xfb2a }, + { "shinshindothebrew", 0xfb2a }, + { "shinsindot", 0xfb2b }, + { "shinsindothebrew", 0xfb2b }, + { "shook", 0x0282 }, + { "sigmafinal", 0x03c2 }, + { "sigmalunatesymbolgreek", 0x03f2 }, + { "sihiragana", 0x3057 }, + { "sikatakana", 0x30b7 }, + { "sikatakanahalfwidth", 0xff7c }, + { "siluqhebrew", 0x05bd }, + { "siluqlefthebrew", 0x05bd }, + { "sindothebrew", 0x05c2 }, + { "siosacirclekorean", 0x3274 }, + { "siosaparenkorean", 0x3214 }, + { "sioscieuckorean", 0x317e }, + { "sioscirclekorean", 0x3266 }, + { "sioskiyeokkorean", 0x317a }, + { "sioskorean", 0x3145 }, + { "siosnieunkorean", 0x317b }, + { "siosparenkorean", 0x3206 }, + { "siospieupkorean", 0x317d }, + { "siostikeutkorean", 0x317c }, + { "sixarabic", 0x0666 }, + { "sixbengali", 0x09ec }, + { "sixcircle", 0x2465 }, + { "sixcircleinversesansserif", 0x278f }, + { "sixdeva", 0x096c }, + { "sixgujarati", 0x0aec }, + { "sixgurmukhi", 0x0a6c }, + { "sixhackarabic", 0x0666 }, + { "sixhangzhou", 0x3026 }, + { "sixideographicparen", 0x3225 }, + { "sixinferior", 0x2086 }, + { "sixmonospace", 0xff16 }, + { "sixoldstyle", 0xf736 }, + { "sixparen", 0x2479 }, + { "sixperiod", 0x248d }, + { "sixpersian", 0x06f6 }, + { "sixroman", 0x2175 }, + { "sixsuperior", 0x2076 }, + { "sixteencircle", 0x246f }, + { "sixteencurrencydenominatorbengali", 0x09f9 }, + { "sixteenparen", 0x2483 }, + { "sixteenperiod", 0x2497 }, + { "sixthai", 0x0e56 }, + { "slashmonospace", 0xff0f }, + { "slong", 0x017f }, + { "slongdotaccent", 0x1e9b }, + { "smonospace", 0xff53 }, + { "sofpasuqhebrew", 0x05c3 }, + { "softhyphen", 0x00ad }, + { "softsigncyrillic", 0x044c }, + { "sohiragana", 0x305d }, + { "sokatakana", 0x30bd }, + { "sokatakanahalfwidth", 0xff7f }, + { "soliduslongoverlaycmb", 0x0338 }, + { "solidusshortoverlaycmb", 0x0337 }, + { "sorusithai", 0x0e29 }, + { "sosalathai", 0x0e28 }, + { "sosothai", 0x0e0b }, + { "sosuathai", 0x0e2a }, + { "spacehackarabic", 0x0020 }, + { "spadesuitblack", 0x2660 }, + { "spadesuitwhite", 0x2664 }, + { "sparen", 0x24ae }, + { "squarebelowcmb", 0x033b }, + { "squarecc", 0x33c4 }, + { "squarecm", 0x339d }, + { "squarediagonalcrosshatchfill", 0x25a9 }, + { "squarehorizontalfill", 0x25a4 }, + { "squarekg", 0x338f }, + { "squarekm", 0x339e }, + { "squarekmcapital", 0x33ce }, + { "squareln", 0x33d1 }, + { "squarelog", 0x33d2 }, + { "squaremg", 0x338e }, + { "squaremil", 0x33d5 }, + { "squaremm", 0x339c }, + { "squaremsquared", 0x33a1 }, + { "squareorthogonalcrosshatchfill", 0x25a6 }, + { "squareupperlefttolowerrightfill", 0x25a7 }, + { "squareupperrighttolowerleftfill", 0x25a8 }, + { "squareverticalfill", 0x25a5 }, + { "squarewhitewithsmallblack", 0x25a3 }, + { "srsquare", 0x33db }, + { "ssabengali", 0x09b7 }, + { "ssadeva", 0x0937 }, + { "ssagujarati", 0x0ab7 }, + { "ssangcieuckorean", 0x3149 }, + { "ssanghieuhkorean", 0x3185 }, + { "ssangieungkorean", 0x3180 }, + { "ssangkiyeokkorean", 0x3132 }, + { "ssangnieunkorean", 0x3165 }, + { "ssangpieupkorean", 0x3143 }, + { "ssangsioskorean", 0x3146 }, + { "ssangtikeutkorean", 0x3138 }, + { "ssuperior", 0xf6f2 }, + { "sterlingmonospace", 0xffe1 }, + { "strokelongoverlaycmb", 0x0336 }, + { "strokeshortoverlaycmb", 0x0335 }, + { "subset", 0x2282 }, + { "subsetnotequal", 0x228a }, + { "subsetorequal", 0x2286 }, + { "succeeds", 0x227b }, + { "suhiragana", 0x3059 }, + { "sukatakana", 0x30b9 }, + { "sukatakanahalfwidth", 0xff7d }, + { "sukunarabic", 0x0652 }, + { "superset", 0x2283 }, + { "supersetnotequal", 0x228b }, + { "supersetorequal", 0x2287 }, + { "svsquare", 0x33dc }, + { "syouwaerasquare", 0x337c }, + { "tabengali", 0x09a4 }, + { "tackdown", 0x22a4 }, + { "tackleft", 0x22a3 }, + { "tadeva", 0x0924 }, + { "tagujarati", 0x0aa4 }, + { "tagurmukhi", 0x0a24 }, + { "taharabic", 0x0637 }, + { "tahfinalarabic", 0xfec2 }, + { "tahinitialarabic", 0xfec3 }, + { "tahiragana", 0x305f }, + { "tahmedialarabic", 0xfec4 }, + { "taisyouerasquare", 0x337d }, + { "takatakana", 0x30bf }, + { "takatakanahalfwidth", 0xff80 }, + { "tatweelarabic", 0x0640 }, + { "tav", 0x05ea }, + { "tavdages", 0xfb4a }, + { "tavdagesh", 0xfb4a }, + { "tavdageshhebrew", 0xfb4a }, + { "tavhebrew", 0x05ea }, + { "tbopomofo", 0x310a }, + { "tccurl", 0x02a8 }, + { "tcedilla", 0x0163 }, + { "tcheharabic", 0x0686 }, + { "tchehfinalarabic", 0xfb7b }, + { "tchehinitialarabic", 0xfb7c }, + { "tchehmedialarabic", 0xfb7d }, + { "tchehmeeminitialarabic", 0xfb7c }, + { "tcircle", 0x24e3 }, + { "tcircumflexbelow", 0x1e71 }, + { "tdieresis", 0x1e97 }, + { "tdotaccent", 0x1e6b }, + { "tdotbelow", 0x1e6d }, + { "tecyrillic", 0x0442 }, + { "tedescendercyrillic", 0x04ad }, + { "teharabic", 0x062a }, + { "tehfinalarabic", 0xfe96 }, + { "tehhahinitialarabic", 0xfca2 }, + { "tehhahisolatedarabic", 0xfc0c }, + { "tehinitialarabic", 0xfe97 }, + { "tehiragana", 0x3066 }, + { "tehjeeminitialarabic", 0xfca1 }, + { "tehjeemisolatedarabic", 0xfc0b }, + { "tehmarbutaarabic", 0x0629 }, + { "tehmarbutafinalarabic", 0xfe94 }, + { "tehmedialarabic", 0xfe98 }, + { "tehmeeminitialarabic", 0xfca4 }, + { "tehmeemisolatedarabic", 0xfc0e }, + { "tehnoonfinalarabic", 0xfc73 }, + { "tekatakana", 0x30c6 }, + { "tekatakanahalfwidth", 0xff83 }, + { "telephone", 0x2121 }, + { "telephoneblack", 0x260e }, + { "telishagedolahebrew", 0x05a0 }, + { "telishaqetanahebrew", 0x05a9 }, + { "tencircle", 0x2469 }, + { "tenideographicparen", 0x3229 }, + { "tenparen", 0x247d }, + { "tenperiod", 0x2491 }, + { "tenroman", 0x2179 }, + { "tesh", 0x02a7 }, + { "tet", 0x05d8 }, + { "tetdagesh", 0xfb38 }, + { "tetdageshhebrew", 0xfb38 }, + { "tethebrew", 0x05d8 }, + { "tetsecyrillic", 0x04b5 }, + { "tevirhebrew", 0x059b }, + { "tevirlefthebrew", 0x059b }, + { "thabengali", 0x09a5 }, + { "thadeva", 0x0925 }, + { "thagujarati", 0x0aa5 }, + { "thagurmukhi", 0x0a25 }, + { "thalarabic", 0x0630 }, + { "thalfinalarabic", 0xfeac }, + { "thanthakhatlowleftthai", 0xf898 }, + { "thanthakhatlowrightthai", 0xf897 }, + { "thanthakhatthai", 0x0e4c }, + { "thanthakhatupperleftthai", 0xf896 }, + { "theharabic", 0x062b }, + { "thehfinalarabic", 0xfe9a }, + { "thehinitialarabic", 0xfe9b }, + { "thehmedialarabic", 0xfe9c }, + { "thereexists", 0x2203 }, + { "thetasymbolgreek", 0x03d1 }, + { "thieuthacirclekorean", 0x3279 }, + { "thieuthaparenkorean", 0x3219 }, + { "thieuthcirclekorean", 0x326b }, + { "thieuthkorean", 0x314c }, + { "thieuthparenkorean", 0x320b }, + { "thirteencircle", 0x246c }, + { "thirteenparen", 0x2480 }, + { "thirteenperiod", 0x2494 }, + { "thonangmonthothai", 0x0e11 }, + { "thook", 0x01ad }, + { "thophuthaothai", 0x0e12 }, + { "thothahanthai", 0x0e17 }, + { "thothanthai", 0x0e10 }, + { "thothongthai", 0x0e18 }, + { "thothungthai", 0x0e16 }, + { "thousandcyrillic", 0x0482 }, + { "thousandsseparatorarabic", 0x066c }, + { "thousandsseparatorpersian", 0x066c }, + { "threearabic", 0x0663 }, + { "threebengali", 0x09e9 }, + { "threecircle", 0x2462 }, + { "threecircleinversesansserif", 0x278c }, + { "threedeva", 0x0969 }, + { "threegujarati", 0x0ae9 }, + { "threegurmukhi", 0x0a69 }, + { "threehackarabic", 0x0663 }, + { "threehangzhou", 0x3023 }, + { "threeideographicparen", 0x3222 }, + { "threeinferior", 0x2083 }, + { "threemonospace", 0xff13 }, + { "threenumeratorbengali", 0x09f6 }, + { "threeoldstyle", 0xf733 }, + { "threeparen", 0x2476 }, + { "threeperiod", 0x248a }, + { "threepersian", 0x06f3 }, + { "threequartersemdash", 0xf6de }, + { "threeroman", 0x2172 }, + { "threesuperior", 0x00b3 }, + { "threethai", 0x0e53 }, + { "thzsquare", 0x3394 }, + { "tihiragana", 0x3061 }, + { "tikatakana", 0x30c1 }, + { "tikatakanahalfwidth", 0xff81 }, + { "tikeutacirclekorean", 0x3270 }, + { "tikeutaparenkorean", 0x3210 }, + { "tikeutcirclekorean", 0x3262 }, + { "tikeutkorean", 0x3137 }, + { "tikeutparenkorean", 0x3202 }, + { "tildebelowcmb", 0x0330 }, + { "tildecmb", 0x0303 }, + { "tildedoublecmb", 0x0360 }, + { "tildeoperator", 0x223c }, + { "tildeoverlaycmb", 0x0334 }, + { "tildeverticalcmb", 0x033e }, + { "timescircle", 0x2297 }, + { "tipehahebrew", 0x0596 }, + { "tipehalefthebrew", 0x0596 }, + { "tippigurmukhi", 0x0a70 }, + { "titlocyrilliccmb", 0x0483 }, + { "tiwnarmenian", 0x057f }, + { "tlinebelow", 0x1e6f }, + { "tmonospace", 0xff54 }, + { "toarmenian", 0x0569 }, + { "tohiragana", 0x3068 }, + { "tokatakana", 0x30c8 }, + { "tokatakanahalfwidth", 0xff84 }, + { "tonebarextrahighmod", 0x02e5 }, + { "tonebarextralowmod", 0x02e9 }, + { "tonebarhighmod", 0x02e6 }, + { "tonebarlowmod", 0x02e8 }, + { "tonebarmidmod", 0x02e7 }, + { "tonefive", 0x01bd }, + { "tonesix", 0x0185 }, + { "tonetwo", 0x01a8 }, + { "tonsquare", 0x3327 }, + { "topatakthai", 0x0e0f }, + { "tortoiseshellbracketleft", 0x3014 }, + { "tortoiseshellbracketleftsmall", 0xfe5d }, + { "tortoiseshellbracketleftvertical", 0xfe39 }, + { "tortoiseshellbracketright", 0x3015 }, + { "tortoiseshellbracketrightsmall", 0xfe5e }, + { "tortoiseshellbracketrightvertical", 0xfe3a }, + { "totaothai", 0x0e15 }, + { "tpalatalhook", 0x01ab }, + { "tparen", 0x24af }, + { "trademarksans", 0xf8ea }, + { "trademarkserif", 0xf6db }, + { "tretroflexhook", 0x0288 }, + { "ts", 0x02a6 }, + { "tsadi", 0x05e6 }, + { "tsadidagesh", 0xfb46 }, + { "tsadidageshhebrew", 0xfb46 }, + { "tsadihebrew", 0x05e6 }, + { "tsecyrillic", 0x0446 }, + { "tsere", 0x05b5 }, + { "tsere12", 0x05b5 }, + { "tsere1e", 0x05b5 }, + { "tsere2b", 0x05b5 }, + { "tserehebrew", 0x05b5 }, + { "tserenarrowhebrew", 0x05b5 }, + { "tserequarterhebrew", 0x05b5 }, + { "tserewidehebrew", 0x05b5 }, + { "tshecyrillic", 0x045b }, + { "tsuperior", 0xf6f3 }, + { "ttabengali", 0x099f }, + { "ttadeva", 0x091f }, + { "ttagujarati", 0x0a9f }, + { "ttagurmukhi", 0x0a1f }, + { "tteharabic", 0x0679 }, + { "ttehfinalarabic", 0xfb67 }, + { "ttehinitialarabic", 0xfb68 }, + { "ttehmedialarabic", 0xfb69 }, + { "tthabengali", 0x09a0 }, + { "tthadeva", 0x0920 }, + { "tthagujarati", 0x0aa0 }, + { "tthagurmukhi", 0x0a20 }, + { "tturned", 0x0287 }, + { "tuhiragana", 0x3064 }, + { "tukatakana", 0x30c4 }, + { "tukatakanahalfwidth", 0xff82 }, + { "tusmallhiragana", 0x3063 }, + { "tusmallkatakana", 0x30c3 }, + { "tusmallkatakanahalfwidth", 0xff6f }, + { "twelvecircle", 0x246b }, + { "twelveparen", 0x247f }, + { "twelveperiod", 0x2493 }, + { "twelveroman", 0x217b }, + { "twentycircle", 0x2473 }, + { "twentyhangzhou", 0x5344 }, + { "twentyparen", 0x2487 }, + { "twentyperiod", 0x249b }, + { "twoarabic", 0x0662 }, + { "twobengali", 0x09e8 }, + { "twocircle", 0x2461 }, + { "twocircleinversesansserif", 0x278b }, + { "twodeva", 0x0968 }, + { "twodotleader", 0x2025 }, + { "twodotleadervertical", 0xfe30 }, + { "twogujarati", 0x0ae8 }, + { "twogurmukhi", 0x0a68 }, + { "twohackarabic", 0x0662 }, + { "twohangzhou", 0x3022 }, + { "twoideographicparen", 0x3221 }, + { "twoinferior", 0x2082 }, + { "twomonospace", 0xff12 }, + { "twonumeratorbengali", 0x09f5 }, + { "twooldstyle", 0xf732 }, + { "twoparen", 0x2475 }, + { "twoperiod", 0x2489 }, + { "twopersian", 0x06f2 }, + { "tworoman", 0x2171 }, + { "twostroke", 0x01bb }, + { "twosuperior", 0x00b2 }, + { "twothai", 0x0e52 }, + { "ubar", 0x0289 }, + { "ubengali", 0x0989 }, + { "ubopomofo", 0x3128 }, + { "ucaron", 0x01d4 }, + { "ucircle", 0x24e4 }, + { "ucircumflexbelow", 0x1e77 }, + { "ucyrillic", 0x0443 }, + { "udattadeva", 0x0951 }, + { "udblacute", 0x0171 }, + { "udblgrave", 0x0215 }, + { "udeva", 0x0909 }, + { "udieresisacute", 0x01d8 }, + { "udieresisbelow", 0x1e73 }, + { "udieresiscaron", 0x01da }, + { "udieresiscyrillic", 0x04f1 }, + { "udieresisgrave", 0x01dc }, + { "udieresismacron", 0x01d6 }, + { "udotbelow", 0x1ee5 }, + { "ugujarati", 0x0a89 }, + { "ugurmukhi", 0x0a09 }, + { "uhiragana", 0x3046 }, + { "uhookabove", 0x1ee7 }, + { "uhornacute", 0x1ee9 }, + { "uhorndotbelow", 0x1ef1 }, + { "uhorngrave", 0x1eeb }, + { "uhornhookabove", 0x1eed }, + { "uhorntilde", 0x1eef }, + { "uhungarumlautcyrillic", 0x04f3 }, + { "uinvertedbreve", 0x0217 }, + { "ukatakana", 0x30a6 }, + { "ukatakanahalfwidth", 0xff73 }, + { "ukcyrillic", 0x0479 }, + { "ukorean", 0x315c }, + { "umacroncyrillic", 0x04ef }, + { "umacrondieresis", 0x1e7b }, + { "umatragurmukhi", 0x0a41 }, + { "umonospace", 0xff55 }, + { "underscoremonospace", 0xff3f }, + { "underscorevertical", 0xfe33 }, + { "underscorewavy", 0xfe4f }, + { "uparen", 0x24b0 }, + { "upperdothebrew", 0x05c4 }, + { "upsilonlatin", 0x028a }, + { "uptackbelowcmb", 0x031d }, + { "uptackmod", 0x02d4 }, + { "uragurmukhi", 0x0a73 }, + { "ushortcyrillic", 0x045e }, + { "usmallhiragana", 0x3045 }, + { "usmallkatakana", 0x30a5 }, + { "usmallkatakanahalfwidth", 0xff69 }, + { "ustraightcyrillic", 0x04af }, + { "ustraightstrokecyrillic", 0x04b1 }, + { "utildeacute", 0x1e79 }, + { "utildebelow", 0x1e75 }, + { "uubengali", 0x098a }, + { "uudeva", 0x090a }, + { "uugujarati", 0x0a8a }, + { "uugurmukhi", 0x0a0a }, + { "uumatragurmukhi", 0x0a42 }, + { "uuvowelsignbengali", 0x09c2 }, + { "uuvowelsigndeva", 0x0942 }, + { "uuvowelsigngujarati", 0x0ac2 }, + { "uvowelsignbengali", 0x09c1 }, + { "uvowelsigndeva", 0x0941 }, + { "uvowelsigngujarati", 0x0ac1 }, + { "vadeva", 0x0935 }, + { "vagujarati", 0x0ab5 }, + { "vagurmukhi", 0x0a35 }, + { "vakatakana", 0x30f7 }, + { "vav", 0x05d5 }, + { "vavdagesh", 0xfb35 }, + { "vavdagesh65", 0xfb35 }, + { "vavdageshhebrew", 0xfb35 }, + { "vavhebrew", 0x05d5 }, + { "vavholam", 0xfb4b }, + { "vavholamhebrew", 0xfb4b }, + { "vavvavhebrew", 0x05f0 }, + { "vavyodhebrew", 0x05f1 }, + { "vcircle", 0x24e5 }, + { "vdotbelow", 0x1e7f }, + { "vecyrillic", 0x0432 }, + { "veharabic", 0x06a4 }, + { "vehfinalarabic", 0xfb6b }, + { "vehinitialarabic", 0xfb6c }, + { "vehmedialarabic", 0xfb6d }, + { "vekatakana", 0x30f9 }, + { "venus", 0x2640 }, + { "verticalbar", 0x007c }, + { "verticallineabovecmb", 0x030d }, + { "verticallinebelowcmb", 0x0329 }, + { "verticallinelowmod", 0x02cc }, + { "verticallinemod", 0x02c8 }, + { "vewarmenian", 0x057e }, + { "vhook", 0x028b }, + { "vikatakana", 0x30f8 }, + { "viramabengali", 0x09cd }, + { "viramadeva", 0x094d }, + { "viramagujarati", 0x0acd }, + { "visargabengali", 0x0983 }, + { "visargadeva", 0x0903 }, + { "visargagujarati", 0x0a83 }, + { "vmonospace", 0xff56 }, + { "voarmenian", 0x0578 }, + { "voicediterationhiragana", 0x309e }, + { "voicediterationkatakana", 0x30fe }, + { "voicedmarkkana", 0x309b }, + { "voicedmarkkanahalfwidth", 0xff9e }, + { "vokatakana", 0x30fa }, + { "vparen", 0x24b1 }, + { "vtilde", 0x1e7d }, + { "vturned", 0x028c }, + { "vuhiragana", 0x3094 }, + { "vukatakana", 0x30f4 }, + { "waekorean", 0x3159 }, + { "wahiragana", 0x308f }, + { "wakatakana", 0x30ef }, + { "wakatakanahalfwidth", 0xff9c }, + { "wakorean", 0x3158 }, + { "wasmallhiragana", 0x308e }, + { "wasmallkatakana", 0x30ee }, + { "wattosquare", 0x3357 }, + { "wavedash", 0x301c }, + { "wavyunderscorevertical", 0xfe34 }, + { "wawarabic", 0x0648 }, + { "wawfinalarabic", 0xfeee }, + { "wawhamzaabovearabic", 0x0624 }, + { "wawhamzaabovefinalarabic", 0xfe86 }, + { "wbsquare", 0x33dd }, + { "wcircle", 0x24e6 }, + { "wdotaccent", 0x1e87 }, + { "wdotbelow", 0x1e89 }, + { "wehiragana", 0x3091 }, + { "wekatakana", 0x30f1 }, + { "wekorean", 0x315e }, + { "weokorean", 0x315d }, + { "whitebullet", 0x25e6 }, + { "whitecircle", 0x25cb }, + { "whitecircleinverse", 0x25d9 }, + { "whitecornerbracketleft", 0x300e }, + { "whitecornerbracketleftvertical", 0xfe43 }, + { "whitecornerbracketright", 0x300f }, + { "whitecornerbracketrightvertical", 0xfe44 }, + { "whitediamond", 0x25c7 }, + { "whitediamondcontainingblacksmalldiamond", 0x25c8 }, + { "whitedownpointingsmalltriangle", 0x25bf }, + { "whitedownpointingtriangle", 0x25bd }, + { "whiteleftpointingsmalltriangle", 0x25c3 }, + { "whiteleftpointingtriangle", 0x25c1 }, + { "whitelenticularbracketleft", 0x3016 }, + { "whitelenticularbracketright", 0x3017 }, + { "whiterightpointingsmalltriangle", 0x25b9 }, + { "whiterightpointingtriangle", 0x25b7 }, + { "whitesmallsquare", 0x25ab }, + { "whitesmilingface", 0x263a }, + { "whitesquare", 0x25a1 }, + { "whitestar", 0x2606 }, + { "whitetelephone", 0x260f }, + { "whitetortoiseshellbracketleft", 0x3018 }, + { "whitetortoiseshellbracketright", 0x3019 }, + { "whiteuppointingsmalltriangle", 0x25b5 }, + { "whiteuppointingtriangle", 0x25b3 }, + { "wihiragana", 0x3090 }, + { "wikatakana", 0x30f0 }, + { "wikorean", 0x315f }, + { "wmonospace", 0xff57 }, + { "wohiragana", 0x3092 }, + { "wokatakana", 0x30f2 }, + { "wokatakanahalfwidth", 0xff66 }, + { "won", 0x20a9 }, + { "wonmonospace", 0xffe6 }, + { "wowaenthai", 0x0e27 }, + { "wparen", 0x24b2 }, + { "wring", 0x1e98 }, + { "wsuperior", 0x02b7 }, + { "wturned", 0x028d }, + { "wynn", 0x01bf }, + { "xabovecmb", 0x033d }, + { "xbopomofo", 0x3112 }, + { "xcircle", 0x24e7 }, + { "xdieresis", 0x1e8d }, + { "xdotaccent", 0x1e8b }, + { "xeharmenian", 0x056d }, + { "xmonospace", 0xff58 }, + { "xparen", 0x24b3 }, + { "xsuperior", 0x02e3 }, + { "yaadosquare", 0x334e }, + { "yabengali", 0x09af }, + { "yadeva", 0x092f }, + { "yaekorean", 0x3152 }, + { "yagujarati", 0x0aaf }, + { "yagurmukhi", 0x0a2f }, + { "yahiragana", 0x3084 }, + { "yakatakana", 0x30e4 }, + { "yakatakanahalfwidth", 0xff94 }, + { "yakorean", 0x3151 }, + { "yamakkanthai", 0x0e4e }, + { "yasmallhiragana", 0x3083 }, + { "yasmallkatakana", 0x30e3 }, + { "yasmallkatakanahalfwidth", 0xff6c }, + { "yatcyrillic", 0x0463 }, + { "ycircle", 0x24e8 }, + { "ydotaccent", 0x1e8f }, + { "ydotbelow", 0x1ef5 }, + { "yeharabic", 0x064a }, + { "yehbarreearabic", 0x06d2 }, + { "yehbarreefinalarabic", 0xfbaf }, + { "yehfinalarabic", 0xfef2 }, + { "yehhamzaabovearabic", 0x0626 }, + { "yehhamzaabovefinalarabic", 0xfe8a }, + { "yehhamzaaboveinitialarabic", 0xfe8b }, + { "yehhamzaabovemedialarabic", 0xfe8c }, + { "yehinitialarabic", 0xfef3 }, + { "yehmedialarabic", 0xfef4 }, + { "yehmeeminitialarabic", 0xfcdd }, + { "yehmeemisolatedarabic", 0xfc58 }, + { "yehnoonfinalarabic", 0xfc94 }, + { "yehthreedotsbelowarabic", 0x06d1 }, + { "yekorean", 0x3156 }, + { "yenmonospace", 0xffe5 }, + { "yeokorean", 0x3155 }, + { "yeorinhieuhkorean", 0x3186 }, + { "yerahbenyomohebrew", 0x05aa }, + { "yerahbenyomolefthebrew", 0x05aa }, + { "yericyrillic", 0x044b }, + { "yerudieresiscyrillic", 0x04f9 }, + { "yesieungkorean", 0x3181 }, + { "yesieungpansioskorean", 0x3183 }, + { "yesieungsioskorean", 0x3182 }, + { "yetivhebrew", 0x059a }, + { "yhook", 0x01b4 }, + { "yhookabove", 0x1ef7 }, + { "yiarmenian", 0x0575 }, + { "yicyrillic", 0x0457 }, + { "yikorean", 0x3162 }, + { "yinyang", 0x262f }, + { "yiwnarmenian", 0x0582 }, + { "ymonospace", 0xff59 }, + { "yod", 0x05d9 }, + { "yoddagesh", 0xfb39 }, + { "yoddageshhebrew", 0xfb39 }, + { "yodhebrew", 0x05d9 }, + { "yodyodhebrew", 0x05f2 }, + { "yodyodpatahhebrew", 0xfb1f }, + { "yohiragana", 0x3088 }, + { "yoikorean", 0x3189 }, + { "yokatakana", 0x30e8 }, + { "yokatakanahalfwidth", 0xff96 }, + { "yokorean", 0x315b }, + { "yosmallhiragana", 0x3087 }, + { "yosmallkatakana", 0x30e7 }, + { "yosmallkatakanahalfwidth", 0xff6e }, + { "yotgreek", 0x03f3 }, + { "yoyaekorean", 0x3188 }, + { "yoyakorean", 0x3187 }, + { "yoyakthai", 0x0e22 }, + { "yoyingthai", 0x0e0d }, + { "yparen", 0x24b4 }, + { "ypogegrammeni", 0x037a }, + { "ypogegrammenigreekcmb", 0x0345 }, + { "yr", 0x01a6 }, + { "yring", 0x1e99 }, + { "ysuperior", 0x02b8 }, + { "ytilde", 0x1ef9 }, + { "yturned", 0x028e }, + { "yuhiragana", 0x3086 }, + { "yuikorean", 0x318c }, + { "yukatakana", 0x30e6 }, + { "yukatakanahalfwidth", 0xff95 }, + { "yukorean", 0x3160 }, + { "yusbigcyrillic", 0x046b }, + { "yusbigiotifiedcyrillic", 0x046d }, + { "yuslittlecyrillic", 0x0467 }, + { "yuslittleiotifiedcyrillic", 0x0469 }, + { "yusmallhiragana", 0x3085 }, + { "yusmallkatakana", 0x30e5 }, + { "yusmallkatakanahalfwidth", 0xff6d }, + { "yuyekorean", 0x318b }, + { "yuyeokorean", 0x318a }, + { "yyabengali", 0x09df }, + { "yyadeva", 0x095f }, + { "zaarmenian", 0x0566 }, + { "zadeva", 0x095b }, + { "zagurmukhi", 0x0a5b }, + { "zaharabic", 0x0638 }, + { "zahfinalarabic", 0xfec6 }, + { "zahinitialarabic", 0xfec7 }, + { "zahiragana", 0x3056 }, + { "zahmedialarabic", 0xfec8 }, + { "zainarabic", 0x0632 }, + { "zainfinalarabic", 0xfeb0 }, + { "zakatakana", 0x30b6 }, + { "zaqefgadolhebrew", 0x0595 }, + { "zaqefqatanhebrew", 0x0594 }, + { "zarqahebrew", 0x0598 }, + { "zayin", 0x05d6 }, + { "zayindagesh", 0xfb36 }, + { "zayindageshhebrew", 0xfb36 }, + { "zayinhebrew", 0x05d6 }, + { "zbopomofo", 0x3117 }, + { "zcircle", 0x24e9 }, + { "zcircumflex", 0x1e91 }, + { "zcurl", 0x0291 }, + { "zdot", 0x017c }, + { "zdotbelow", 0x1e93 }, + { "zecyrillic", 0x0437 }, + { "zedescendercyrillic", 0x0499 }, + { "zedieresiscyrillic", 0x04df }, + { "zehiragana", 0x305c }, + { "zekatakana", 0x30bc }, + { "zeroarabic", 0x0660 }, + { "zerobengali", 0x09e6 }, + { "zerodeva", 0x0966 }, + { "zerogujarati", 0x0ae6 }, + { "zerogurmukhi", 0x0a66 }, + { "zerohackarabic", 0x0660 }, + { "zeroinferior", 0x2080 }, + { "zeromonospace", 0xff10 }, + { "zerooldstyle", 0xf730 }, + { "zeropersian", 0x06f0 }, + { "zerosuperior", 0x2070 }, + { "zerothai", 0x0e50 }, + { "zerowidthjoiner", 0xfeff }, + { "zerowidthnonjoiner", 0x200c }, + { "zerowidthspace", 0x200b }, + { "zhbopomofo", 0x3113 }, + { "zhearmenian", 0x056a }, + { "zhebrevecyrillic", 0x04c2 }, + { "zhecyrillic", 0x0436 }, + { "zhedescendercyrillic", 0x0497 }, + { "zhedieresiscyrillic", 0x04dd }, + { "zihiragana", 0x3058 }, + { "zikatakana", 0x30b8 }, + { "zinorhebrew", 0x05ae }, + { "zlinebelow", 0x1e95 }, + { "zmonospace", 0xff5a }, + { "zohiragana", 0x305e }, + { "zokatakana", 0x30be }, + { "zparen", 0x24b5 }, + { "zretroflexhook", 0x0290 }, + { "zstroke", 0x01b6 }, + { "zuhiragana", 0x305a }, + { "zukatakana", 0x30ba }, +/* These names are obsolete, but they might occur in old fonts */ +/* so I still want to recognize them. I no longer track their */ +/* original source */ + { "Alphaacute", 0x1fbb }, + { "Alphaasper", 0x1f09 }, + { "Alphaasperacute", 0x1f0d }, + { "Alphaaspergrave", 0x1f0b }, + { "Alphaaspertilde", 0x1f0f }, + { "Alphabreve", 0x1fb8 }, + { "Alphagrave", 0x1fba }, + { "Alphaiotasub", 0x1fbc }, + { "Alphaiotasubasper", 0x1f89 }, + { "Alphaiotasubasperacute", 0x1f8d }, + { "Alphaiotasubaspergrave", 0x1f8b }, + { "Alphaiotasubaspertilde", 0x1f8f }, + { "Alphaiotasublenis", 0x1f88 }, + { "Alphaiotasublenisacute", 0x1f8c }, + { "Alphaiotasublenisgrave", 0x1f8a }, + { "Alphaiotasublenistilde", 0x1f8e }, + { "Alphalenis", 0x1f08 }, + { "Alphalenisacute", 0x1f0c }, + { "Alphalenisgrave", 0x1f0a }, + { "Alphalenistilde", 0x1f0e }, + { "Alphamacron", 0x1fb9 }, + { "Epsilonacute", 0x1fc9 }, + { "Epsilonasper", 0x1f19 }, + { "Epsilonasperacute", 0x1f1d }, + { "Epsilonaspergrave", 0x1f1b }, + { "Epsilongrave", 0x1fc8 }, + { "Epsilonlenis", 0x1f18 }, + { "Epsilonlenisacute", 0x1f1c }, + { "Epsilonlenisgrave", 0x1f1a }, + { "Etaacute", 0x1fcb }, + { "Etaasper", 0x1f29 }, + { "Etaasperacute", 0x1f2d }, + { "Etaaspergrave", 0x1f2b }, + { "Etaaspertilde", 0x1f2f }, + { "Etagrave", 0x1fca }, + { "Etaiotasub", 0x1fcc }, + { "Etaiotasubasper", 0x1f99 }, + { "Etaiotasubasperacute", 0x1f9d }, + { "Etaiotasubaspergrave", 0x1f9b }, + { "Etaiotasubaspertilde", 0x1f9f }, + { "Etaiotasublenis", 0x1f98 }, + { "Etaiotasublenisacute", 0x1f9c }, + { "Etaiotasublenisgrave", 0x1f9a }, + { "Etaiotasublenistilde", 0x1f9e }, + { "Etalenis", 0x1f28 }, + { "Etalenisacute", 0x1f2c }, + { "Etalenisgrave", 0x1f2a }, + { "Etalenistilde", 0x1f2e }, + { "Iotaacute", 0x1fdb }, + { "Iotaasper", 0x1f39 }, + { "Iotaasperacute", 0x1f3d }, + { "Iotaaspergrave", 0x1f3b }, + { "Iotaaspertilde", 0x1f3f }, + { "Iotabreve", 0x1fd8 }, + { "Iotagrave", 0x1fda }, + { "Iotalenis", 0x1f38 }, + { "Iotalenisacute", 0x1f3c }, + { "Iotalenisgrave", 0x1f3a }, + { "Iotalenistilde", 0x1f3e }, + { "Iotamacron", 0x1fd9 }, + { "Omegaacute", 0x1ffb }, + { "Omegaasper", 0x1f69 }, + { "Omegaasperacute", 0x1f6d }, + { "Omegaaspergrave", 0x1f6b }, + { "Omegaaspertilde", 0x1f6f }, + { "Omegagrave", 0x1ffa }, + { "Omegaiotasub", 0x1ffc }, + { "Omegaiotasubasper", 0x1fa9 }, + { "Omegaiotasubasperacute", 0x1fad }, + { "Omegaiotasubaspergrave", 0x1fab }, + { "Omegaiotasubaspertilde", 0x1faf }, + { "Omegaiotasublenis", 0x1fa8 }, + { "Omegaiotasublenisacute", 0x1fac }, + { "Omegaiotasublenisgrave", 0x1faa }, + { "Omegaiotasublenistilde", 0x1fae }, + { "Omegalenis", 0x1f68 }, + { "Omegalenisacute", 0x1f6c }, + { "Omegalenisgrave", 0x1f6a }, + { "Omegalenistilde", 0x1f6e }, + { "Omicronacute", 0x1ff9 }, + { "Omicronasper", 0x1f49 }, + { "Omicronasperacute", 0x1f4d }, + { "Omicronaspergrave", 0x1f4b }, + { "Omicrongrave", 0x1ff8 }, + { "Omicronlenis", 0x1f48 }, + { "Omicronlenisacute", 0x1f4c }, + { "Omicronlenisgrave", 0x1f4a }, + { "Rhoasper", 0x1fec }, + { "Upsilonacute", 0x1feb }, + { "Upsilonasper", 0x1f59 }, + { "Upsilonasperacute", 0x1f5d }, + { "Upsilonaspergrave", 0x1f5b }, + { "Upsilonaspertilde", 0x1f5f }, + { "Upsilonbreve", 0x1fe8 }, + { "Upsilongrave", 0x1fea }, + { "Upsilonmacron", 0x1fe9 }, + { "numeralsign", 0x0374 }, + { "lownumeralsign", 0x0375 }, + { "lowcomma", 0x037a }, + { "stigma", 0x03da }, + { "koppa", 0x03de }, + { "sampi", 0x03e0 }, + { "lenis", 0x1fbd }, + { "iotasubscript", 0x1fbe }, + { "dieresistilde", 0x1fc1 }, + { "lenisgrave", 0x1fcd }, + { "lenisacute", 0x1fce }, + { "lenistilde", 0x1fcf }, + { "aspergrave", 0x1fdd }, + { "asperacute", 0x1fde }, + { "aspertilde", 0x1fdf }, + { "dialytikagrave", 0x1fed }, + { "dialytikaacute", 0x1fee }, + { "asper", 0x1ffe }, + { "alphalenis", 0x1f00 }, + { "alphaasper", 0x1f01 }, + { "alphalenisgrave", 0x1f02 }, + { "alphaaspergrave", 0x1f03 }, + { "alphalenisacute", 0x1f04 }, + { "alphaasperacute", 0x1f05 }, + { "alphalenistilde", 0x1f06 }, + { "alphaaspertilde", 0x1f07 }, + { "epsilonlenis", 0x1f10 }, + { "epsilonasper", 0x1f11 }, + { "epsilonlenisgrave", 0x1f12 }, + { "epsilonaspergrave", 0x1f13 }, + { "epsilonlenisacute", 0x1f14 }, + { "epsilonasperacute", 0x1f15 }, + { "etalenis", 0x1f20 }, + { "etaasper", 0x1f21 }, + { "etalenisgrave", 0x1f22 }, + { "etaaspergrave", 0x1f23 }, + { "etalenisacute", 0x1f24 }, + { "etaasperacute", 0x1f25 }, + { "etalenistilde", 0x1f26 }, + { "etaaspertilde", 0x1f27 }, + { "iotalenis", 0x1f30 }, + { "iotaasper", 0x1f31 }, + { "iotalenisgrave", 0x1f32 }, + { "iotaaspergrave", 0x1f33 }, + { "iotalenisacute", 0x1f34 }, + { "iotaasperacute", 0x1f35 }, + { "iotalenistilde", 0x1f36 }, + { "iotaaspertilde", 0x1f37 }, + { "omicronlenis", 0x1f40 }, + { "omicronasper", 0x1f41 }, + { "omicronlenisgrave", 0x1f42 }, + { "omicronaspergrave", 0x1f43 }, + { "omicronlenisacute", 0x1f44 }, + { "omicronasperacute", 0x1f45 }, + { "upsilonlenis", 0x1f50 }, + { "upsilonasper", 0x1f51 }, + { "upsilonlenisgrave", 0x1f52 }, + { "upsilonaspergrave", 0x1f53 }, + { "upsilonlenisacute", 0x1f54 }, + { "upsilonasperacute", 0x1f55 }, + { "upsilonlenistilde", 0x1f56 }, + { "upsilonaspertilde", 0x1f57 }, + { "omegalenis", 0x1f60 }, + { "omegaasper", 0x1f61 }, + { "omegalenisgrave", 0x1f62 }, + { "omegaaspergrave", 0x1f63 }, + { "omegalenisacute", 0x1f64 }, + { "omegaasperacute", 0x1f65 }, + { "omegalenistilde", 0x1f66 }, + { "omegaaspertilde", 0x1f67 }, + { "alphagrave", 0x1f70 }, + { "alphaacute", 0x1f71 }, + { "epsilongrave", 0x1f72 }, + { "epsilonacute", 0x1f73 }, + { "etagrave", 0x1f74 }, + { "etaacute", 0x1f75 }, + { "iotagrave", 0x1f76 }, + { "iotaacute", 0x1f77 }, + { "omicrongrave", 0x1f78 }, + { "omicronacute", 0x1f79 }, + { "upsilongrave", 0x1f7a }, + { "upsilonacute", 0x1f7b }, + { "omegagrave", 0x1f7c }, + { "omegaacute", 0x1f7d }, + { "alphaiotasublenis", 0x1f80 }, + { "alphaiotasubasper", 0x1f81 }, + { "alphaiotasublenisgrave", 0x1f82 }, + { "alphaiotasubaspergrave", 0x1f83 }, + { "alphaiotasublenisacute", 0x1f84 }, + { "alphaiotasubasperacute", 0x1f85 }, + { "alphaiotasublenistilde", 0x1f86 }, + { "alphaiotasubaspertilde", 0x1f87 }, + { "etaiotasublenis", 0x1f90 }, + { "etaiotasubasper", 0x1f91 }, + { "etaiotasublenisgrave", 0x1f92 }, + { "etaiotasubaspergrave", 0x1f93 }, + { "etaiotasublenisacute", 0x1f94 }, + { "etaiotasubasperacute", 0x1f95 }, + { "etaiotasublenistilde", 0x1f96 }, + { "etaiotasubaspertilde", 0x1f97 }, + { "omegaiotasublenis", 0x1fa0 }, + { "omegaiotasubasper", 0x1fa1 }, + { "omegaiotasublenisgrave", 0x1fa2 }, + { "omegaiotasubaspergrave", 0x1fa3 }, + { "omegaiotasublenisacute", 0x1fa4 }, + { "omegaiotasubasperacute", 0x1fa5 }, + { "omegaiotasublenistilde", 0x1fa6 }, + { "omegaiotasubaspertilde", 0x1fa7 }, + { "alphabreve", 0x1fb0 }, + { "alphamacron", 0x1fb1 }, + { "alphaiotasubgrave", 0x1fb2 }, + { "alphaiotasub", 0x1fb3 }, + { "alphatilde", 0x1fb6 }, + { "alphaiotasubtilde", 0x1fb7 }, + { "etaiotasubgrave", 0x1fc2 }, + { "etaiotasub", 0x1fc3 }, + { "etaiotasubacute", 0x1fc4 }, + { "etatilde", 0x1fc6 }, + { "etaiotasubtilde", 0x1fc7 }, + { "iotabreve", 0x1fd0 }, + { "iotamacron", 0x1fd1 }, + { "iotadieresisgrave", 0x1fd2 }, + { "iotadieresisacute", 0x1fd3 }, + { "iotatilde", 0x1fd6 }, + { "iotadieresistilde", 0x1fd7 }, + { "upsilonbreve", 0x1fe0 }, + { "upsilonmacron", 0x1fe1 }, + { "upsilondieresisgrave", 0x1fe2 }, + { "upsilondieresisacute", 0x1fe3 }, + { "rholenis", 0x1fe4 }, + { "rhoasper", 0x1fe5 }, + { "upsilontilde", 0x1fe6 }, + { "omegaiotasubgrave", 0x1ff2 }, + { "omegaiotasub", 0x1ff3 }, + { "omegaiotasubacute", 0x1ff4 }, + { "omegatilde", 0x1ff6 }, + { "omegaiotasubtilde", 0x1ff7 }, + { "alphaiotasubacute", 0x1fb4 }, + { "upsilondieresistilde", 0x1fe7 }, + { "digamma", 0xefd5 }, + { "Be", 0x0411 }, + { "Ve", 0x0412 }, + { "Ghe", 0x0413 }, + { "De", 0x0414 }, + { "Ie", 0x0415 }, + { "Zhe", 0x0416 }, + { "Ze", 0x0417 }, + { "Ka", 0x041a }, + { "El", 0x041b }, + { "Em", 0x041c }, + { "En", 0x041d }, + { "Pe", 0x041f }, + { "Er", 0x0420 }, + { "Es", 0x0421 }, + { "Te", 0x0422 }, + { "Ef", 0x0424 }, + { "Ha", 0x0425 }, + { "Tse", 0x0426 }, + { "Che", 0x0427 }, + { "Sha", 0x0428 }, + { "Shcha", 0x0429 }, + { "Hard", 0x042a }, + { "Yeru", 0x042b }, + { "Soft", 0x042c }, + { "Yu", 0x042e }, + { "Ya", 0x042f }, + { "Io", 0x0401 }, + { "Dje", 0x0402 }, + { "Gje", 0x0403 }, + { "Dze", 0x0405 }, + { "Yi", 0x0407 }, + { "Je", 0x0408 }, + { "Lje", 0x0409 }, + { "Nje", 0x040a }, + { "Tshe", 0x040b }, + { "Kje", 0x040c }, + { "Dzhe", 0x040f }, + { "Yat", 0x0462 }, + { "Fita", 0x0472 }, + { "Izhitsa", 0x0474 }, + { "be", 0x0431 }, + { "ve", 0x0432 }, + { "ghe", 0x0433 }, + { "de", 0x0434 }, + { "ie", 0x0435 }, + { "zhe", 0x0436 }, + { "ze", 0x0437 }, + { "ka", 0x043a }, + { "el", 0x043b }, + { "em", 0x043c }, + { "en", 0x043d }, + { "er", 0x0440 }, + { "es", 0x0441 }, + { "te", 0x0442 }, + { "ef", 0x0444 }, + { "ha", 0x0445 }, + { "tse", 0x0446 }, + { "che", 0x0447 }, + { "sha", 0x0448 }, + { "shcha", 0x0449 }, + { "hard", 0x044a }, + { "yeru", 0x044b }, + { "soft", 0x044c }, + { "yu", 0x044e }, + { "ya", 0x044f }, + { "io", 0x0451 }, + { "dje", 0x0452 }, + { "gje", 0x0453 }, + { "dze", 0x0455 }, + { "yi", 0x0457 }, + { "je", 0x0458 }, + { "lje", 0x0459 }, + { "nje", 0x045a }, + { "tshe", 0x045b }, + { "kje", 0x045c }, + { "dzhe", 0x045f }, + { "yat", 0x0463 }, + { "fita", 0x0473 }, + { "izhitsa", 0x0475 }, + { "litre", 0x2113 }, + { "Dotaccent", 0xefed }, + { "Breve", 0xefee }, + { "Ogonek", 0xeff1 }, + { "Cedilla", 0xeff2 }, + { "Ring", 0xeff3 }, + { "Tilde", 0xeff5 }, + { "Circumflex", 0xeff7 }, + { "dbar", 0x0111 }, + { "st", 0xfb06 }, + { "TeXtext32", 0x0337 }, + { "DD070", 0x2014 }, + { "monospacedash", 0x2014 }, + { "Dash1cent", 0x2015 }, + { "apostrophereverse", 0x201b }, + { "Pts", 0x20a7 }, + { "SM760000", 0x2195 }, + { "SM770000", 0x21a8 }, + { "SP320000", 0x2219 }, + { "SD630000", 0x22c5 }, + { "SM790000", 0x2302 }, + { "caretinverted", 0x2304 }, + { "SM680000", 0x2310 }, + { "SA420000", 0x2319 }, + { "BorderULCorner1", 0x231c }, + { "DD010", 0x231c }, + { "DD101", 0x231c }, + { "BorderURCorner1", 0x231d }, + { "DD012", 0x231d }, + { "DD104", 0x231d }, + { "BorderLLCorner1", 0x231e }, + { "DD014", 0x231e }, + { "DD109", 0x231e }, + { "BorderLRCorner1", 0x231f }, + { "DD015", 0x231f }, + { "DD112", 0x231f }, + { "SS260000", 0x2320 }, + { "SS270000", 0x2321 }, + { "hook", 0x2440 }, + { "chair", 0x2441 }, + { "fork", 0x2442 }, + { "SF600000", 0x2580 }, + { "BorderLower1", 0x2581 }, + { "DD011", 0x2581 }, + { "DD021", 0x2581 }, + { "DD110", 0x2581 }, + { "Flower1l", 0x2581 }, + { "SF570000", 0x2584 }, + { "SF610000", 0x2588 }, + { "Tile", 0x2588 }, + { "HalfTile", 0x258c }, + { "SF580000", 0x258c }, + { "BorderLeftVertical1", 0x258f }, + { "DD013", 0x258f }, + { "DD034", 0x258f }, + { "DD105", 0x258f }, + { "Flower1d", 0x258f }, + { "SF590000", 0x2590 }, + { "SF140000", 0x2591 }, + { "SF150000", 0x2592 }, + { "SF160000", 0x2593 }, + { "BorderUpper1", 0x2594 }, + { "DD024", 0x2594 }, + { "DD102", 0x2594 }, + { "BorderRightVertical1", 0x2595 }, + { "DD031", 0x2595 }, + { "DD106", 0x2595 }, + { "Flower2dr", 0x2595 }, + { "SM600000", 0x25b2 }, + { "SM590000", 0x25b6 }, + { "SV040000", 0x25bc }, + { "SM630000", 0x25c0 }, + { "SM750000", 0x25cb }, + { "SM570001", 0x25d8 }, + { "SM750002", 0x25d9 }, + { "ShootingStar", 0x2604 }, + { "DD130", 0x2605 }, + { "StarDingbat1", 0x2605 }, + { "TheSun", 0x2609 }, + { "FleuronLeft", 0x2619 }, + { "cross", 0x2629 }, + { "SS000000", 0x263a }, + { "SS010000", 0x263b }, + { "SM690000", 0x263c }, + { "TheMoon", 0x263d }, + { "Moon", 0x263e }, + { "Mercury", 0x263f }, + { "Venus", 0x2640 }, + { "Earth", 0x2641 }, + { "Mars", 0x2642 }, + { "Jupiter", 0x2643 }, + { "Saturn", 0x2644 }, + { "Uranus", 0x2645 }, + { "Neptune", 0x2646 }, + { "Pluto", 0x2647 }, + { "Aries", 0x2648 }, + { "Taurus", 0x2649 }, + { "Gemini", 0x264a }, + { "Cancer", 0x264b }, + { "Leo", 0x264c }, + { "Virgo", 0x264d }, + { "Libra", 0x264e }, + { "Scorpio", 0x264f }, + { "Sagittarius", 0x2650 }, + { "Capricorn", 0x2651 }, + { "Aquarius", 0x2652 }, + { "Pisces", 0x2653 }, + { "diamondopen", 0x2662 }, + { "FleuronCenter", 0x2766 }, + { "FleuronRight", 0x2767 }, + { "st1", 0xfb06 }, + { "zeroslash", 0xf638 }, + { "pi1", 0x03d6 }, + { "hyphen-minus", 0x002d }, + { "hyphenminus", 0x002d }, + { "nonmarkingreturn", 0x000c }, + { "micro", 0x00b5 }, + { "Dmacron", 0x0110 }, + { "kra", 0x0138 }, + { "bbar", 0x0180 }, + { "Dbar", 0x0189 }, + { "deltaturn", 0x018d }, + { "Eturn", 0x018e }, + { "Epsilonlatin", 0x0190 }, + { "Gammalatin", 0x0194 }, + { "Iotalatin", 0x0196 }, + { "Ibar", 0x0197 }, + { "lambdabar", 0x019b }, + { "mcapturn", 0x019c }, + { "Nhook", 0x019d }, + { "nleg", 0x019e }, + { "Obar", 0x019f }, + { "OI", 0x01a2 }, + { "YR", 0x01a6 }, + { "eshlooprev", 0x01aa }, + { "Trthook", 0x01ae }, + { "Upsilonlatin", 0x01b1 }, + { "Vcursive", 0x01b2 }, + { "Zbar", 0x01b5 }, + { "zbar", 0x01b6 }, + { "Yogh", 0x01b7 }, + { "Yoghrev", 0x01b8 }, + { "yoghrev", 0x01b9 }, + { "yoghtail", 0x01ba }, + { "twobar", 0x01bb }, + { "glottalstopbarinv", 0x01be }, + { "pipe", 0x01c0 }, + { "pipedbl", 0x01c1 }, + { "pipedblbar", 0x01c2 }, + { "exclamlatin", 0x01c3 }, + { "DZhacek", 0x01c4 }, + { "Dzhacek", 0x01c5 }, + { "dzhacek", 0x01c6 }, + { "Ahacek", 0x01cd }, + { "ahacek", 0x01ce }, + { "Ihacek", 0x01cf }, + { "ihacek", 0x01d0 }, + { "Ohacek", 0x01d1 }, + { "ohacek", 0x01d2 }, + { "Uhacek", 0x01d3 }, + { "uhacek", 0x01d4 }, + { "Udieresishacek", 0x01d9 }, + { "udieresishacek", 0x01da }, + { "eturn", 0x01dd }, + { "Gbar", 0x01e4 }, + { "gbar", 0x01e5 }, + { "Ghacek", 0x01e6 }, + { "ghacek", 0x01e7 }, + { "Khacek", 0x01e8 }, + { "khacek", 0x01e9 }, + { "Yoghhacek", 0x01ee }, + { "yoghhacek", 0x01ef }, + { "jhacek", 0x01f0 }, + { "aturn", 0x0250 }, + { "ascriptturn", 0x0252 }, + { "cturn", 0x0254 }, + { "drthook", 0x0256 }, + { "erev", 0x0258 }, + { "epsilonlatin", 0x025b }, + { "epsilonlatinrev", 0x025c }, + { "epsilonlatinrevhook", 0x025d }, + { "epsilonlatinrevclosed", 0x025e }, + { "jdotlessbar", 0x025f }, + { "gcursive", 0x0261 }, + { "Gsmallcap", 0x0262 }, + { "gammalatin", 0x0263 }, + { "babygamma", 0x0264 }, + { "hturn", 0x0265 }, + { "ibar", 0x0268 }, + { "Ismallcap", 0x026a }, + { "lmidtilde", 0x026b }, + { "lrthook", 0x026d }, + { "lyogh", 0x026e }, + { "mturn", 0x026f }, + { "mturndescend", 0x0270 }, + { "nlftlfthook", 0x0272 }, + { "nrthook", 0x0273 }, + { "Nsmallcap", 0x0274 }, + { "obar", 0x0275 }, + { "OEsmallcap", 0x0276 }, + { "omegaclosed", 0x0277 }, + { "rturn", 0x0279 }, + { "rturnascend", 0x027a }, + { "rturnrthook", 0x027b }, + { "rdescend", 0x027c }, + { "rrthook", 0x027d }, + { "rfishhookrev", 0x027f }, + { "Rsmallcap", 0x0280 }, + { "Rsmallcapinv", 0x0281 }, + { "srthook", 0x0282 }, + { "jhookdblbar", 0x0284 }, + { "eshshortrev", 0x0285 }, + { "tturn", 0x0287 }, + { "trthook", 0x0288 }, + { "vscript", 0x028b }, + { "vturn", 0x028c }, + { "wturn", 0x028d }, + { "yturn", 0x028e }, + { "Ysmallcap", 0x028f }, + { "zrthook", 0x0290 }, + { "yogh", 0x0292 }, + { "yoghcurl", 0x0293 }, + { "glottalstoprevinv", 0x0295 }, + { "glottalstopinv", 0x0296 }, + { "cstretch", 0x0297 }, + { "kiss", 0x0298 }, + { "Bsmallcap", 0x0299 }, + { "epsilonclosed", 0x029a }, + { "Gsmallcaphook", 0x029b }, + { "Hsmallcap", 0x029c }, + { "jcrosstail", 0x029d }, + { "kturn", 0x029e }, + { "Lsmallcap", 0x029f }, + { "glottalstopbar", 0x02a1 }, + { "glottalstopbarrev", 0x02a2 }, + { "dyogh", 0x02a4 }, + { "hsuper", 0x02b0 }, + { "hhooksuper", 0x02b1 }, + { "jsuper", 0x02b2 }, + { "rsuper", 0x02b3 }, + { "rturnsuper", 0x02b4 }, + { "rturnrthooksuper", 0x02b5 }, + { "Rturnsuper", 0x02b6 }, + { "wsuper", 0x02b7 }, + { "ysuper", 0x02b8 }, + { "primedblmod", 0x02ba }, + { "quoteleftmod", 0x02bb }, + { "apostrophe", 0x02bc }, + { "apostropherev", 0x02bd }, + { "ringrighthalfsuper", 0x02be }, + { "ringlefthalfsuper", 0x02bf }, + { "glottal", 0x02c0 }, + { "glottalrev", 0x02c1 }, + { "fronted", 0x02c2 }, + { "backed", 0x02c3 }, + { "raised", 0x02c4 }, + { "lowered", 0x02c5 }, + { "linevert", 0x02c8 }, + { "macronmodifier", 0x02c9 }, + { "acutemodifier", 0x02ca }, + { "gravemodifier", 0x02cb }, + { "linevertsub", 0x02cc }, + { "macronsub", 0x02cd }, + { "gravesub", 0x02ce }, + { "acutesub", 0x02cf }, + { "length", 0x02d0 }, + { "halflength", 0x02d1 }, + { "ringrighthalfcenter", 0x02d2 }, + { "ringlefthalfsup", 0x02d3 }, + { "tackupmid", 0x02d4 }, + { "tackdownmid", 0x02d5 }, + { "rhotichook", 0x02de }, + { "gammasuper", 0x02e0 }, + { "lsuper", 0x02e1 }, + { "ssuper", 0x02e2 }, + { "xsuper", 0x02e3 }, + { "glottalrevsuper", 0x02e4 }, + { "toneextrahigh", 0x02e5 }, + { "tonehigh", 0x02e6 }, + { "tonemid", 0x02e7 }, + { "tonelow", 0x02e8 }, + { "toneextralow", 0x02e9 }, + { "gravenosp", 0x0300 }, + { "acutenosp", 0x0301 }, + { "circumflexnosp", 0x0302 }, + { "tildenosp", 0x0303 }, + { "macronnosp", 0x0304 }, + { "overscorenosp", 0x0305 }, + { "brevenosp", 0x0306 }, + { "dotnosp", 0x0307 }, + { "dieresisnosp", 0x0308 }, + { "hooksupnosp", 0x0309 }, + { "ringnosp", 0x030a }, + { "acutedblnosp", 0x030b }, + { "haceknosp", 0x030c }, + { "linevertnosp", 0x030d }, + { "linevertdblnosp", 0x030e }, + { "gravedblnosp", 0x030f }, + { "candrabindunosp", 0x0310 }, + { "breveinvnosp", 0x0311 }, + { "commaturnsupnosp", 0x0312 }, + { "apostrophesupnosp", 0x0313 }, + { "commasuprevnosp", 0x0314 }, + { "commasuprightnosp", 0x0315 }, + { "gravesubnosp", 0x0316 }, + { "acutesubnosp", 0x0317 }, + { "tackleftsubnosp", 0x0318 }, + { "tackrightsubnosp", 0x0319 }, + { "anglesupnosp", 0x031a }, + { "hornnosp", 0x031b }, + { "ringlefthalfsubnosp", 0x031c }, + { "tackupsubnosp", 0x031d }, + { "tackdownsubnosp", 0x031e }, + { "plussubnosp", 0x031f }, + { "minussubnosp", 0x0320 }, + { "hooksubpalatnosp", 0x0321 }, + { "hooksubretronosp", 0x0322 }, + { "dotsubnosp", 0x0323 }, + { "dotdblsubnosp", 0x0324 }, + { "ringsubnosp", 0x0325 }, + { "commasubnosp", 0x0326 }, + { "cedillanosp", 0x0327 }, + { "ogoneknosp", 0x0328 }, + { "linevertsubnosp", 0x0329 }, + { "bridgesubnosp", 0x032a }, + { "archdblsubnosp", 0x032b }, + { "haceksubnosp", 0x032c }, + { "circumflexsubnosp", 0x032d }, + { "brevesubnosp", 0x032e }, + { "breveinvsubnosp", 0x032f }, + { "tildesubnosp", 0x0330 }, + { "macronsubnosp", 0x0331 }, + { "underscorenosp", 0x0332 }, + { "underscoredblnosp", 0x0333 }, + { "tildemidnosp", 0x0334 }, + { "barmidshortnosp", 0x0335 }, + { "barmidlongnosp", 0x0336 }, + { "slashshortnosp", 0x0337 }, + { "slashlongnosp", 0x0338 }, + { "ringrighthalfsubnosp", 0x0339 }, + { "bridgeinvsubnosp", 0x033a }, + { "squaresubnosp", 0x033b }, + { "seagullsubnosp", 0x033c }, + { "xsupnosp", 0x033d }, + { "tildevertsupnosp", 0x033e }, + { "overscoredblnosp", 0x033f }, + { "graveleftnosp", 0x0340 }, + { "acuterightnosp", 0x0341 }, + { "wavyoverscorenosp", 0x0342 }, + { "zigzagoverscorenosp", 0x0343 }, + { "diaeresistonosnosp", 0x0344 }, + { "iotasubnosp", 0x0345 }, + { "iotasub", 0x037a }, + { "diaeresistonos", 0x0385 }, + { "iotadiaeresistonos", 0x0390 }, + { "Iotadiaeresis", 0x03aa }, + { "Upsilondiaeresis", 0x03ab }, + { "upsilondiaeresistonos", 0x03b0 }, + { "iotadiaeresis", 0x03ca }, + { "upsilondiaeresis", 0x03cb }, + { "betacurled", 0x03d0 }, + { "thetascript", 0x03d1 }, + { "Upsilonhook", 0x03d2 }, + { "Upsilonhooktonos", 0x03d3 }, + { "Upsilonhookdiaeresis", 0x03d4 }, + { "phiscript", 0x03d5 }, + { "omegapi", 0x03d6 }, + { "Stigma", 0x03da }, + { "stigma", 0x03db }, + { "Digamma", 0x03dc }, + { "digamma", 0x03dd }, + { "Koppa", 0x03de }, + { "koppa", 0x03df }, + { "Sampi", 0x03e0 }, + { "sampi", 0x03e1 }, + { "Shei", 0x03e2 }, + { "shei", 0x03e3 }, + { "Fei", 0x03e4 }, + { "fei", 0x03e5 }, + { "Khei", 0x03e6 }, + { "khei", 0x03e7 }, + { "Hori", 0x03e8 }, + { "hori", 0x03e9 }, + { "Gangia", 0x03ea }, + { "gangia", 0x03eb }, + { "Shima", 0x03ec }, + { "shima", 0x03ed }, + { "Dei", 0x03ee }, + { "dei", 0x03ef }, + { "kappascript", 0x03f0 }, + { "sigmalunate", 0x03f2 }, + { "Io", 0x0401 }, + { "Dje", 0x0402 }, + { "Gje", 0x0403 }, + { "Ecyril", 0x0404 }, + { "Dze", 0x0405 }, + { "Icyril", 0x0406 }, + { "Yi", 0x0407 }, + { "Je", 0x0408 }, + { "Lje", 0x0409 }, + { "Nje", 0x040a }, + { "Tshe", 0x040b }, + { "Kje", 0x040c }, + { "Ucyrilbreve", 0x040e }, + { "Dzhe", 0x040f }, + { "Acyril", 0x0410 }, + { "Be", 0x0411 }, + { "Ve", 0x0412 }, + { "Ge", 0x0413 }, + { "De", 0x0414 }, + { "Ie", 0x0415 }, + { "Zhe", 0x0416 }, + { "Ze", 0x0417 }, + { "Ii", 0x0418 }, + { "Iibreve", 0x0419 }, + { "Ka", 0x041a }, + { "El", 0x041b }, + { "Em", 0x041c }, + { "En", 0x041d }, + { "Ocyril", 0x041e }, + { "Pecyril", 0x041f }, + { "Er", 0x0420 }, + { "Es", 0x0421 }, + { "Te", 0x0422 }, + { "Ucyril", 0x0423 }, + { "Ef", 0x0424 }, + { "Kha", 0x0425 }, + { "Tse", 0x0426 }, + { "Che", 0x0427 }, + { "Sha", 0x0428 }, + { "Shcha", 0x0429 }, + { "Hard", 0x042a }, + { "Yeri", 0x042b }, + { "Soft", 0x042c }, + { "Ecyrilrev", 0x042d }, + { "Iu", 0x042e }, + { "Ia", 0x042f }, + { "acyril", 0x0430 }, + { "be", 0x0431 }, + { "ve", 0x0432 }, + { "ge", 0x0433 }, + { "de", 0x0434 }, + { "ie", 0x0435 }, + { "zhe", 0x0436 }, + { "ze", 0x0437 }, + { "ii", 0x0438 }, + { "iibreve", 0x0439 }, + { "ka", 0x043a }, + { "el", 0x043b }, + { "em", 0x043c }, + { "en", 0x043d }, + { "ocyril", 0x043e }, + { "pecyril", 0x043f }, + { "er", 0x0440 }, + { "es", 0x0441 }, + { "te", 0x0442 }, + { "ucyril", 0x0443 }, + { "ef", 0x0444 }, + { "kha", 0x0445 }, + { "tse", 0x0446 }, + { "che", 0x0447 }, + { "sha", 0x0448 }, + { "shcha", 0x0449 }, + { "hard", 0x044a }, + { "yeri", 0x044b }, + { "soft", 0x044c }, + { "ecyrilrev", 0x044d }, + { "iu", 0x044e }, + { "ia", 0x044f }, + { "io", 0x0451 }, + { "dje", 0x0452 }, + { "gje", 0x0453 }, + { "ecyril", 0x0454 }, + { "dze", 0x0455 }, + { "icyril", 0x0456 }, + { "yi", 0x0457 }, + { "je", 0x0458 }, + { "lje", 0x0459 }, + { "nje", 0x045a }, + { "tshe", 0x045b }, + { "kje", 0x045c }, + { "ucyrilbreve", 0x045e }, + { "dzhe", 0x045f }, + { "Yat", 0x0462 }, + { "yat", 0x0463 }, + { "Yusbig", 0x046a }, + { "yusbig", 0x046b }, + { "Psicyril", 0x0470 }, + { "psicyril", 0x0471 }, + { "Fita", 0x0472 }, + { "fita", 0x0473 }, + { "Izhitsa", 0x0474 }, + { "izhitsa", 0x0475 }, + { "Izhitsagravedbl", 0x0476 }, + { "izhitsagravedbl", 0x0477 }, + { "Digraphuk", 0x0478 }, + { "digraphuk", 0x0479 }, + { "Omegaround", 0x047a }, + { "omegaround", 0x047b }, + { "Omegatitlo", 0x047c }, + { "omegatitlo", 0x047d }, + { "OT", 0x047e }, + { "ot", 0x047f }, + { "Geupturn", 0x0490 }, + { "geupturn", 0x0491 }, + { "Gebar", 0x0492 }, + { "gebar", 0x0493 }, + { "Gehook", 0x0494 }, + { "gehook", 0x0495 }, + { "Zhertdes", 0x0496 }, + { "zhertdes", 0x0497 }, + { "Zecedilla", 0x0498 }, + { "zecedilla", 0x0499 }, + { "Kartdes", 0x049a }, + { "kartdes", 0x049b }, + { "Kavertbar", 0x049c }, + { "kavertbar", 0x049d }, + { "Kabar", 0x049e }, + { "kabar", 0x049f }, + { "GeKarev", 0x04a0 }, + { "gekarev", 0x04a1 }, + { "Enrtdes", 0x04a2 }, + { "enrtdes", 0x04a3 }, + { "EnGe", 0x04a4 }, + { "enge", 0x04a5 }, + { "Pehook", 0x04a6 }, + { "pehook", 0x04a7 }, + { "Ohook", 0x04a8 }, + { "ohook", 0x04a9 }, + { "Escedilla", 0x04aa }, + { "escedilla", 0x04ab }, + { "Tertdes", 0x04ac }, + { "tertdes", 0x04ad }, + { "Ustrt", 0x04ae }, + { "ustrt", 0x04af }, + { "Ustrtbar", 0x04b0 }, + { "ustrtbar", 0x04b1 }, + { "Khartdes", 0x04b2 }, + { "khartdes", 0x04b3 }, + { "TeTse", 0x04b4 }, + { "tetse", 0x04b5 }, + { "Chertdes", 0x04b6 }, + { "chertdes", 0x04b7 }, + { "Chevertbar", 0x04b8 }, + { "chevertbar", 0x04b9 }, + { "Hcyril", 0x04ba }, + { "hcyril", 0x04bb }, + { "Iehook", 0x04bc }, + { "iehook", 0x04bd }, + { "Iehookogonek", 0x04be }, + { "iehookogonek", 0x04bf }, + { "Icyril1", 0x04c0 }, + { "Zhebreve", 0x04c1 }, + { "zhebreve", 0x04c2 }, + { "Kahook", 0x04c3 }, + { "kahook", 0x04c4 }, + { "Enhook", 0x04c7 }, + { "enhook", 0x04c8 }, + { "Cheleftdes", 0x04cb }, + { "cheleftdes", 0x04cc }, + { "qibuts", 0x05bb }, + { "meteg", 0x05bd }, + { "maqaf", 0x05be }, + { "paseq", 0x05c0 }, + { "shindot", 0x05c1 }, + { "sindot", 0x05c2 }, + { "sofpasuq", 0x05c3 }, + { "kaffinal", 0x05da }, + { "memfinal", 0x05dd }, + { "nunfinal", 0x05df }, + { "pefinal", 0x05e3 }, + { "tsadifinal", 0x05e5 }, + { "vavdbl", 0x05f0 }, + { "vavyod", 0x05f1 }, + { "yoddbl", 0x05f2 }, + { "geresh", 0x05f3 }, + { "gershayim", 0x05f4 }, + { "varika", 0x05f5 }, + { "enquad", 0x2000 }, + { "emquad", 0x2001 }, + { "emspace", 0x2003 }, + { "threeperemspace", 0x2004 }, + { "fourperemspace", 0x2005 }, + { "sixperemspace", 0x2006 }, + { "figurespace", 0x2007 }, + { "punctuationspace", 0x2008 }, + { "thinspace", 0x2009 }, + { "hairspace", 0x200a }, + { "zerospace", 0x200b }, + { "zeronojoin", 0x200c }, + { "zerojoin", 0x200d }, + { "hyphennobreak", 0x2011 }, + { "quotedash", 0x2015 }, + { "dashdbl", 0x2016 }, + { "quotesinglrev", 0x201b }, + { "quotedblrev", 0x201f }, + { "trianglebullet", 0x2023 }, + { "onedotlead", 0x2024 }, + { "twodotlead", 0x2025 }, + { "hyphendot", 0x2027 }, + { "lineseparator", 0x2028 }, + { "paragraphseparator", 0x2029 }, + { "lre", 0x202a }, + { "rle", 0x202b }, + { "pdf", 0x202c }, + { "lro", 0x202d }, + { "rlo", 0x202e }, + { "pertenthousand", 0x2031 }, + { "prime", 0x2032 }, + { "primedbl", 0x2033 }, + { "primetriple", 0x2034 }, + { "primerev", 0x2035 }, + { "primedblrev", 0x2036 }, + { "primetriplerev", 0x2037 }, + { "caret", 0x2038 }, + { "refmark", 0x203b }, + { "interrobang", 0x203d }, + { "tie", 0x2040 }, + { "caretinsert", 0x2041 }, + { "hyphenbullet", 0x2043 }, + { "minussuperior", 0x207b }, + { "plusinferior", 0x208a }, + { "equalinferior", 0x208c }, + { "eurocurrency", 0x20a0 }, + { "coloncurrency", 0x20a1 }, + { "mill", 0x20a5 }, + { "naira", 0x20a6 }, + { "pesetas", 0x20a7 }, + { "rupee", 0x20a8 }, + { "newsheqel", 0x20aa }, + { "accountof", 0x2100 }, + { "addresssubject", 0x2101 }, + { "Cbb", 0x2102 }, + { "degreecentigrade", 0x2103 }, + { "CL", 0x2104 }, + { "cadauna", 0x2106 }, + { "Euler", 0x2107 }, + { "scruple", 0x2108 }, + { "degreefarenheit", 0x2109 }, + { "Hscript", 0x210b }, + { "Hblackletter", 0x210c }, + { "Hbb", 0x210d }, + { "planck", 0x210e }, + { "planckover2pi", 0x210f }, + { "Iscript", 0x2110 }, + { "Lscript", 0x2112 }, + { "lscript", 0x2113 }, + { "lbbar", 0x2114 }, + { "Nbb", 0x2115 }, + { "recordright", 0x2117 }, + { "Pbb", 0x2119 }, + { "Qbb", 0x211a }, + { "Rscript", 0x211b }, + { "Rfractur", 0x211c }, + { "Rbb", 0x211d }, + { "Rx", 0x211e }, + { "response", 0x211f }, + { "servicemark", 0x2120 }, + { "tel", 0x2121 }, + { "versicle", 0x2123 }, + { "Zbb", 0x2124 }, + { "ounce", 0x2125 }, + { "ohm", 0x2126 }, + { "mho", 0x2127 }, + { "Zblackletter", 0x2128 }, + { "iotaturn", 0x2129 }, + { "degreekelvin", 0x212a }, + { "Bscript", 0x212c }, + { "Cblackletter", 0x212d }, + { "escript", 0x212f }, + { "Escript", 0x2130 }, + { "Fscript", 0x2131 }, + { "Fturn", 0x2132 }, + { "Mscript", 0x2133 }, + { "u0scrip", 0x2134 }, + { "alephmath", 0x2135 }, + { "gimelmath", 0x2137 }, + { "dalethmath", 0x2138 }, + { "twothird", 0x2154 }, + { "onefifth", 0x2155 }, + { "twofifths", 0x2156 }, + { "threefifths", 0x2157 }, + { "fourfifths", 0x2158 }, + { "onesixth", 0x2159 }, + { "fivesixths", 0x215a }, + { "onenumerator", 0x215f }, + { "arrowlongboth", 0x2194 }, + { "arrowlongbothv", 0x2195 }, + { "arrownorthwest", 0x2196 }, + { "arrownortheast", 0x2197 }, + { "arrowsoutheast", 0x2198 }, + { "arrowsouthwest", 0x2199 }, + { "arrowleftnot", 0x219a }, + { "arrowrightnot", 0x219b }, + { "arrowwaveleft", 0x219c }, + { "arrowwaveright", 0x219d }, + { "dblarrowheadleft", 0x219e }, + { "dblarrowheadup", 0x219f }, + { "dblarrowheadright", 0x21a0 }, + { "dblarrowheaddown", 0x21a1 }, + { "arrowtailleft", 0x21a2 }, + { "arrowtailright", 0x21a3 }, + { "arrowbarleft", 0x21a4 }, + { "arrowbarup", 0x21a5 }, + { "arrowbarright", 0x21a6 }, + { "arrowbardown", 0x21a7 }, + { "arrowbothvbase", 0x21a8 }, + { "arrowhookleft", 0x21a9 }, + { "arrowhookright", 0x21aa }, + { "arrowloopleft", 0x21ab }, + { "arrowloopright", 0x21ac }, + { "arrowwaveboth", 0x21ad }, + { "arrowlongbothnot", 0x21ae }, + { "arrowzigzag", 0x21af }, + { "arrowrightdown", 0x21b4 }, + { "carriagerreturn", 0x21b5 }, + { "arrowsemanticlockw", 0x21b6 }, + { "arrowsemclockw", 0x21b7 }, + { "home", 0x21b8 }, + { "tableftright", 0x21b9 }, + { "arrowanticlockw", 0x21ba }, + { "arrowclockw", 0x21bb }, + { "arrowlefttophalf", 0x21bc }, + { "arrowleftbothalf", 0x21bd }, + { "harpoonupright", 0x21be }, + { "harpoonupleft", 0x21bf }, + { "arrowrighttophalf", 0x21c0 }, + { "arrowrightbothalf", 0x21c1 }, + { "harpoondownright", 0x21c2 }, + { "harpoondownleft", 0x21c3 }, + { "arrowparrrightleft", 0x21c4 }, + { "dblarrowupdown", 0x21c5 }, + { "arrowparrleftright", 0x21c6 }, + { "dblarrowup", 0x21c8 }, + { "dblarrowdown", 0x21ca }, + { "harpoonleftright", 0x21cb }, + { "harpoonrightleft", 0x21cc }, + { "arrowdblleftnot", 0x21cd }, + { "arrowdbllongbothnot", 0x21ce }, + { "arrowdblrightnot", 0x21cf }, + { "arrowdbllongboth", 0x21d4 }, + { "arrowdbllongbothv", 0x21d5 }, + { "arrowdblnw", 0x21d6 }, + { "arrowdblne", 0x21d7 }, + { "arrowdblse", 0x21d8 }, + { "arrowdblsw", 0x21d9 }, + { "arrowtripleleft", 0x21da }, + { "arrowtripleright", 0x21db }, + { "arrowsquiggleleft", 0x21dc }, + { "arrowsquiggleright", 0x21dd }, + { "arrowopenleft", 0x21e6 }, + { "arrowopenup", 0x21e7 }, + { "arrowopenright", 0x21e8 }, + { "arrowopendown", 0x21e9 }, + { "complement", 0x2201 }, + { "notexistential", 0x2204 }, + { "elementsmall", 0x220a }, + { "owner", 0x220b }, + { "notowner", 0x220c }, + { "ownersmall", 0x220d }, + { "eop", 0x220e }, + { "coproduct", 0x2210 }, + { "dotplus", 0x2214 }, + { "slashmath", 0x2215 }, + { "backslashmath", 0x2216 }, + { "ringoperator", 0x2218 }, + { "bulletmath", 0x2219 }, + { "cuberoot", 0x221b }, + { "fourthroot", 0x221c }, + { "measuredangle", 0x2221 }, + { "sphericalangle", 0x2222 }, + { "notbar", 0x2224 }, + { "parallelto", 0x2225 }, + { "notbardbl", 0x2226 }, + { "integraldbl", 0x222c }, + { "integraltrpl", 0x222d }, + { "contintegral", 0x222e }, + { "surfintegral", 0x222f }, + { "volintegral", 0x2230 }, + { "clwintegral", 0x2231 }, + { "clwcontintegral", 0x2232 }, + { "cclwcontintegral", 0x2233 }, + { "dotminus", 0x2238 }, + { "excess", 0x2239 }, + { "geomproportion", 0x223a }, + { "homothetic", 0x223b }, + { "revsimilar", 0x223d }, + { "lazysinv", 0x223e }, + { "sine", 0x223f }, + { "wreathproduct", 0x2240 }, + { "notsimilar", 0x2241 }, + { "minustilde", 0x2242 }, + { "asymptequal", 0x2243 }, + { "notasymptequal", 0x2244 }, + { "approxorequal", 0x2245 }, + { "approxnotequal", 0x2246 }, + { "notapproxequal", 0x2247 }, + { "almostequal", 0x2248 }, + { "notalmostequal", 0x2249 }, + { "almostorequal", 0x224a }, + { "tildetrpl", 0x224b }, + { "equivasymptotic", 0x224d }, + { "geomequivalent", 0x224e }, + { "difference", 0x224f }, + { "approachlimit", 0x2250 }, + { "geomequal", 0x2251 }, + { "imageorapproxequal", 0x2253 }, + { "colonequal", 0x2254 }, + { "equalcolon", 0x2255 }, + { "ringinequal", 0x2256 }, + { "ringequal", 0x2257 }, + { "corresponds", 0x2258 }, + { "estimates", 0x2259 }, + { "equiangular", 0x225a }, + { "starequal", 0x225b }, + { "deltaequal", 0x225c }, + { "definequal", 0x225d }, + { "measurequal", 0x225e }, + { "questionequal", 0x225f }, + { "notequivalence", 0x2262 }, + { "strictequivalence", 0x2263 }, + { "lessdblequal", 0x2266 }, + { "greaterdblequal", 0x2267 }, + { "lessnotdblequal", 0x2268 }, + { "greaternotdblequal", 0x2269 }, + { "lessmuch", 0x226a }, + { "greatermuch", 0x226b }, + { "between", 0x226c }, + { "notequivasymptotic", 0x226d }, + { "notlessequal", 0x2270 }, + { "notgreaterequal", 0x2271 }, + { "lessequivlnt", 0x2272 }, + { "greaterequivlnt", 0x2273 }, + { "notlessequivlnt", 0x2274 }, + { "notgreaterequivlnt", 0x2275 }, + { "notlessgreater", 0x2278 }, + { "notgreaterless", 0x2279 }, + { "follows", 0x227b }, + { "precedesequal", 0x227c }, + { "followsequal", 0x227d }, + { "precedequivlnt", 0x227e }, + { "followsequivlnt", 0x227f }, + { "notpreceeds", 0x2280 }, + { "notfollows", 0x2281 }, + { "notpropersubset", 0x2284 }, + { "notpropersuperset", 0x2285 }, + { "notreflexsubset", 0x2288 }, + { "notreflexsuperset", 0x2289 }, + { "multiset", 0x228c }, + { "multiplymultiset", 0x228d }, + { "unionmulti", 0x228e }, + { "squareimage", 0x228f }, + { "squareoriginal", 0x2290 }, + { "subsetsqequal", 0x2291 }, + { "supersetsqequal", 0x2292 }, + { "intersectionsq", 0x2293 }, + { "unionsq", 0x2294 }, + { "circleminus", 0x2296 }, + { "circledivide", 0x2298 }, + { "circledot", 0x2299 }, + { "circlering", 0x229a }, + { "circleasterisk", 0x229b }, + { "circleequal", 0x229c }, + { "circlevertbar", 0x229d }, + { "squareplus", 0x229e }, + { "squareminus", 0x229f }, + { "squaremultiply", 0x22a0 }, + { "squaredot", 0x22a1 }, + { "turnstileleft", 0x22a2 }, + { "turnstileright", 0x22a3 }, + { "latticetop", 0x22a4 }, + { "assertion", 0x22a6 }, + { "truestate", 0x22a7 }, + { "satisfy", 0x22a8 }, + { "force", 0x22a9 }, + { "tacktrpl", 0x22aa }, + { "forceextr", 0x22ab }, + { "notturnstileleft", 0x22ac }, + { "notsatisfy", 0x22ad }, + { "notforce", 0x22ae }, + { "notforceextr", 0x22af }, + { "lowerrank", 0x22b0 }, + { "higherrank", 0x22b1 }, + { "triangleright", 0x22b2 }, + { "triangleleft", 0x22b3 }, + { "triangleftequal", 0x22b4 }, + { "triangrightequal", 0x22b5 }, + { "original", 0x22b6 }, + { "image", 0x22b7 }, + { "multimap", 0x22b8 }, + { "hermitconjmatrix", 0x22b9 }, + { "intercal", 0x22ba }, + { "xor", 0x22bb }, + { "nand", 0x22bc }, + { "nor", 0x22bd }, + { "rightanglearc", 0x22be }, + { "narylogicaland", 0x22c0 }, + { "narylogicalor", 0x22c1 }, + { "naryintersection", 0x22c2 }, + { "naryunion", 0x22c3 }, + { "diamondmath", 0x22c4 }, + { "divideonmultiply", 0x22c7 }, + { "bowtie", 0x22c8 }, + { "multicloseleft", 0x22c9 }, + { "multicloseright", 0x22ca }, + { "multiopenleft", 0x22cb }, + { "multiopenright", 0x22cc }, + { "revasymptequal", 0x22cd }, + { "curlor", 0x22ce }, + { "curland", 0x22cf }, + { "subsetdbl", 0x22d0 }, + { "supersetdbl", 0x22d1 }, + { "uniondbl", 0x22d2 }, + { "intersectiondbl", 0x22d3 }, + { "fork", 0x22d4 }, + { "equalparallel", 0x22d5 }, + { "lessdot", 0x22d6 }, + { "greaterdot", 0x22d7 }, + { "verymuchless", 0x22d8 }, + { "verymuchgreater", 0x22d9 }, + { "lessequalgreater", 0x22da }, + { "greaterequalless", 0x22db }, + { "equalless", 0x22dc }, + { "equalgreater", 0x22dd }, + { "equalprecedes", 0x22de }, + { "equalfollows", 0x22df }, + { "preceedsnotequal", 0x22e0 }, + { "followsnotequal", 0x22e1 }, + { "notsubsetsqequal", 0x22e2 }, + { "notsupersetsqequal", 0x22e3 }, + { "sqimageornotequal", 0x22e4 }, + { "sqoriginornotequal", 0x22e5 }, + { "lessnotequivlnt", 0x22e6 }, + { "greaternotequivlnt", 0x22e7 }, + { "preceedsnotsimilar", 0x22e8 }, + { "followsnotequivlnt", 0x22e9 }, + { "nottriangleleft", 0x22ea }, + { "nottriangleright", 0x22eb }, + { "nottriangleleftequal", 0x22ec }, + { "nottrianglerightequal", 0x22ed }, + { "vertellipsis", 0x22ee }, + { "midhorizellipsis", 0x22ef }, + { "upslopeellipsis", 0x22f0 }, + { "downslopeellipsis", 0x22f1 }, + { "perspcorrespond", 0x2306 }, + { "ceilingleft", 0x2308 }, + { "ceilingright", 0x2309 }, + { "floorleft", 0x230a }, + { "floorright", 0x230b }, + { "slurabove", 0x2322 }, + { "slurbelow", 0x2323 }, + { "null", 0x2400 }, + { "startofhead", 0x2401 }, + { "starttext", 0x2402 }, + { "endtext", 0x2403 }, + { "endtrans", 0x2404 }, + { "enquiry", 0x2405 }, + { "acknowledge", 0x2406 }, + { "bell", 0x2407 }, + { "backspace", 0x2408 }, + { "horiztab", 0x2409 }, + { "linefeed", 0x240a }, + { "verttab", 0x240b }, + { "formfeed", 0x240c }, + { "shiftout", 0x240e }, + { "shiftin", 0x240f }, + { "datalinkescape", 0x2410 }, + { "devcon1", 0x2411 }, + { "devcon2", 0x2412 }, + { "devcon3", 0x2413 }, + { "devcon4", 0x2414 }, + { "negacknowledge", 0x2415 }, + { "synch", 0x2416 }, + { "endtransblock", 0x2417 }, + { "cancel", 0x2418 }, + { "endmedium", 0x2419 }, + { "substitute", 0x241a }, + { "escape", 0x241b }, + { "fileseparator", 0x241c }, + { "groupseparator", 0x241d }, + { "recordseparator", 0x241e }, + { "unitseparator", 0x241f }, + { "spaceliteral", 0x2420 }, + { "delete", 0x2421 }, + { "blankb", 0x2422 }, + { "spaceopenbox", 0x2423 }, + { "newline", 0x2424 }, + { "lthorizform", 0x2500 }, + { "hvhorizform", 0x2501 }, + { "ltvertform", 0x2502 }, + { "hvvertform", 0x2503 }, + { "ltdashtriphorizform", 0x2504 }, + { "hvdashtriphorizform", 0x2505 }, + { "ltdashtripvertform", 0x2506 }, + { "hvdashtripvertform", 0x2507 }, + { "ltdashquadhorizform", 0x2508 }, + { "hvdashquadhorizform", 0x2509 }, + { "ltdashquadvertform", 0x250a }, + { "hvdashquadvertform", 0x250b }, + { "ltdnrtform", 0x250c }, + { "dnltrthvform", 0x250d }, + { "dnhvrtltform", 0x250e }, + { "hvdnrtform", 0x250f }, + { "ltdnleftform", 0x2510 }, + { "dnltlefthvform", 0x2511 }, + { "dnhvleftltform", 0x2512 }, + { "hvdnleftform", 0x2513 }, + { "ltuprtform", 0x2514 }, + { "upltrthvform", 0x2515 }, + { "uphvrtltform", 0x2516 }, + { "hvuprtform", 0x2517 }, + { "ltupleftform", 0x2518 }, + { "upltlefthvform", 0x2519 }, + { "uphvleftltform", 0x251a }, + { "hvupleftform", 0x251b }, + { "ltvertrightform", 0x251c }, + { "vertltrthvform", 0x251d }, + { "uphvrtdnltform", 0x251e }, + { "dnhvrtupltform", 0x251f }, + { "verthvrtltform", 0x2520 }, + { "dnltrtuphvform", 0x2521 }, + { "upltrtdnhvform", 0x2522 }, + { "hvvertrtform", 0x2523 }, + { "ltvertleftform", 0x2524 }, + { "vtltlefthvform", 0x2525 }, + { "uphvleftdnltform", 0x2526 }, + { "dnhvleftupltform", 0x2527 }, + { "verthvleftltform", 0x2528 }, + { "dnltleftuphvform", 0x2529 }, + { "upltleftdnhvform", 0x252a }, + { "hvvertleftform", 0x252b }, + { "ltdnhorizform", 0x252c }, + { "lefthvrtdnltform", 0x252d }, + { "rthvleftdnltform", 0x252e }, + { "dnlthorizhvform", 0x252f }, + { "dnhvhorizltform", 0x2530 }, + { "rtltrtdnhvform", 0x2531 }, + { "leftltrtdnhvform", 0x2532 }, + { "hvdnhorizform", 0x2533 }, + { "ltuphorizform", 0x2534 }, + { "lefthvrtupltform", 0x2535 }, + { "rthvleftupltform", 0x2536 }, + { "uplthorizhvform", 0x2537 }, + { "uphvhorizltform", 0x2538 }, + { "rtltleftuphvform", 0x2539 }, + { "leftltrtuphvform", 0x253a }, + { "hvuphorizform", 0x253b }, + { "ltverthorizform", 0x253c }, + { "lefthvrtvertltform", 0x253d }, + { "rthvleftvertltform", 0x253e }, + { "vertlthorizhvform", 0x253f }, + { "uphvdnhorizltform", 0x2540 }, + { "dnhvuphorizltform", 0x2541 }, + { "verthvhorizltform", 0x2542 }, + { "leftuphvrtdnltform", 0x2543 }, + { "rtuphvleftdnltform", 0x2544 }, + { "leftdnhvrtupltform", 0x2545 }, + { "rtdnhvleftupltform", 0x2546 }, + { "dnltuphorizhvform", 0x2547 }, + { "upltdnhorizhvform", 0x2548 }, + { "rtltleftverthvform", 0x2549 }, + { "leftltrtverthvform", 0x254a }, + { "hvverthorizform", 0x254b }, + { "ltdashdblhorizform", 0x254c }, + { "hvdashdblhorizform", 0x254d }, + { "ltdashdblvertform", 0x254e }, + { "hvdashdblvertform", 0x254f }, + { "horizdblbar", 0x2550 }, + { "vertdblbar", 0x2551 }, + { "dnrtdblform", 0x2552 }, + { "dndblrtform", 0x2553 }, + { "dbldnrtform", 0x2554 }, + { "dnleftdblform", 0x2555 }, + { "dndblleftform", 0x2556 }, + { "dbldnleftform", 0x2557 }, + { "uprtdblform", 0x2558 }, + { "updblrtform", 0x2559 }, + { "dbluprtform", 0x255a }, + { "upleftdblform", 0x255b }, + { "updblleftform", 0x255c }, + { "dblupleftform", 0x255d }, + { "vertrtdblform", 0x255e }, + { "vertdblrtform", 0x255f }, + { "dblvertrtform", 0x2560 }, + { "vertleftdblform", 0x2561 }, + { "vertdblleftform", 0x2562 }, + { "dblvertleftform", 0x2563 }, + { "dnhorizdblform", 0x2564 }, + { "dndblhorizform", 0x2565 }, + { "dbldnhorizform", 0x2566 }, + { "uphorizdblform", 0x2567 }, + { "updblhorizform", 0x2568 }, + { "dbluphorizform", 0x2569 }, + { "verthorizdblform", 0x256a }, + { "vertdblhorizform", 0x256b }, + { "dblverthorizform", 0x256c }, + { "ltarcdnrtform", 0x256d }, + { "ltarcdnleftform", 0x256e }, + { "ltarcupleftform", 0x256f }, + { "ltarcuprtform", 0x2570 }, + { "forwarddiagonal", 0x2571 }, + { "backwarddiagonal", 0x2572 }, + { "ltdiagonalcross", 0x2573 }, + { "dneighthblock", 0x2581 }, + { "dnquarterblock", 0x2582 }, + { "dnthreeeighthblock", 0x2583 }, + { "dnfiveeighthblock", 0x2585 }, + { "dnthreequarterblock", 0x2586 }, + { "dnseveneighthblock", 0x2587 }, + { "lfseveneighthblock", 0x2589 }, + { "lfthreequarterblock", 0x258a }, + { "lffiveeighthblock", 0x258b }, + { "lfthreeeighthblock", 0x258d }, + { "lfquarterblock", 0x258e }, + { "lfeighthblock", 0x258f }, + { "upeighthblock", 0x2594 }, + { "rteighthblock", 0x2595 }, + { "box", 0x25a1 }, + { "boxrounded", 0x25a2 }, + { "boxnested", 0x25a3 }, + { "boxhorizhatch", 0x25a4 }, + { "boxverthatch", 0x25a5 }, + { "boxcrosshatch", 0x25a6 }, + { "boxleftdiaghatch", 0x25a7 }, + { "boxrtdiaghatch", 0x25a8 }, + { "boxcrossdiaghatch", 0x25a9 }, + { "smallboxfilled", 0x25aa }, + { "smallbox", 0x25ab }, + { "rectangle", 0x25ad }, + { "filledvertrect", 0x25ae }, + { "vertrectangle", 0x25af }, + { "filledparallelogram", 0x25b0 }, + { "parallelogram", 0x25b1 }, + { "triangle", 0x25b3 }, + { "smalltrianglesld", 0x25b4 }, + { "smalltriangle", 0x25b5 }, + { "trianglerightsld1", 0x25b6 }, + { "triangleright1", 0x25b7 }, + { "smalltrianglerightsld", 0x25b8 }, + { "smalltriangleright", 0x25b9 }, + { "triagrtopen", 0x25bb }, + { "triangleinv", 0x25bd }, + { "smalltriangleinvsld", 0x25be }, + { "smalltriangleinv", 0x25bf }, + { "triangleleftsld1", 0x25c0 }, + { "triangleleft1", 0x25c1 }, + { "smalltriangleleftsld", 0x25c2 }, + { "smalltriangleleft", 0x25c3 }, + { "triaglfopen", 0x25c5 }, + { "diamondrhombsolid", 0x25c6 }, + { "diamondrhomb", 0x25c7 }, + { "diamondrhombnested", 0x25c8 }, + { "circledash", 0x25cc }, + { "circleverthatch", 0x25cd }, + { "circlesolid", 0x25cf }, + { "circleleftsld", 0x25d0 }, + { "circlerightsld", 0x25d1 }, + { "circlebottomsld", 0x25d2 }, + { "circletopsld", 0x25d3 }, + { "circlenesld", 0x25d4 }, + { "circlenwopen", 0x25d5 }, + { "semicircleleftsld", 0x25d6 }, + { "semicirclelertsld", 0x25d7 }, + { "invsemicircleup", 0x25da }, + { "invsemicircledn", 0x25db }, + { "nwquadarc", 0x25dc }, + { "nequadarc", 0x25dd }, + { "sequadarc", 0x25de }, + { "swquadarc", 0x25df }, + { "toparc", 0x25e0 }, + { "bottomarc", 0x25e1 }, + { "trianglesesld", 0x25e2 }, + { "triangleswsld", 0x25e3 }, + { "tranglenwsld", 0x25e4 }, + { "trianglenesld", 0x25e5 }, + { "squareleftsld", 0x25e7 }, + { "squarerightsld", 0x25e8 }, + { "squarenwsld", 0x25e9 }, + { "squaresesld", 0x25ea }, + { "squarevertbisect", 0x25eb }, + { "triangledot", 0x25ec }, + { "triangleleftsld", 0x25ed }, + { "trianglerightsld", 0x25ee }, + { "heartopen", 0x2661 }, + { "diamondopen", 0x2662 }, + { "spadeopen", 0x2664 }, + { "Omegaiotasubleniscircumflex", 0x1fae }, + { "Omegaleniscircumflex", 0x1f6e }, + { "Upsilonaspercircumflex", 0x1f5f }, + { "dieresiscircumflex", 0x1fc1 }, + { "leniscircumflex", 0x1fcf }, + { "aspercircumflex", 0x1fdf }, + { "alphaleniscircumflex", 0x1f06 }, + { "alphaaspercircumflex", 0x1f07 }, + { "etaleniscircumflex", 0x1f26 }, + { "etaaspercircumflex", 0x1f27 }, + { "iotaleniscircumflex", 0x1f36 }, + { "iotaaspercircumflex", 0x1f37 }, + { "upsilonleniscircumflex", 0x1f56 }, + { "upsilonaspercircumflex", 0x1f57 }, + { "omegaleniscircumflex", 0x1f66 }, + { "omegaaspercircumflex", 0x1f67 }, + { "alphaiotasubleniscircumflex", 0x1f86 }, + { "alphaiotasubaspercircumflex", 0x1f87 }, + { "etaiotasubleniscircumflex", 0x1f96 }, + { "etaiotasubaspercircumflex", 0x1f97 }, + { "omegaiotasubleniscircumflex", 0x1fa6 }, + { "omegaiotasubaspercircumflex", 0x1fa7 }, + { "alphacircumflex", 0x1fb6 }, + { "alphaiotasubcircumflex", 0x1fb7 }, + { "etacircumflex", 0x1fc6 }, + { "etaiotasubcircumflex", 0x1fc7 }, + { "iotacircumflex", 0x1fd6 }, + { "iotadieresiscircumflex", 0x1fd7 }, + { "upsiloncircumflex", 0x1fe6 }, + { "omegacircumflex", 0x1ff6 }, + { "omegaiotasubcircumflex", 0x1ff7 }, + { "upsilondieresiscircumflex", 0x1fe7 }, + { "dialytika", 0x0308 }, + { "koronis", 0x1fbd }, + { "prosgegrammeni", 0x1fbe }, + { "psili", 0x1fbf }, + { "perispomeni", 0x1fc0 }, + { "varia", 0x1fef }, + { "oxia", 0x1ffd }, + { "dasia", 0x1ffe }, + { "Alphasmall", 0xf500 }, + { "Betasmall", 0xf501 }, + { "Gammasmall", 0xf502 }, + { "Deltasmall", 0xf503 }, + { "Epsilonsmall", 0xf504 }, + { "Zetasmall", 0xf505 }, + { "Etasmall", 0xf506 }, + { "Thetasmall", 0xf507 }, + { "Iotasmall", 0xf508 }, + { "Kappasmall", 0xf509 }, + { "Lambdasmall", 0xf50a }, + { "Musmall", 0xf50b }, + { "Nusmall", 0xf50c }, + { "Xismall", 0xf50d }, + { "Omicronsmall", 0xf50e }, + { "Pismall", 0xf50f }, + { "Rhosmall", 0xf510 }, + { "Sigmasmall", 0xf512 }, + { "Tausmall", 0xf513 }, + { "Upsilonsmall", 0xf514 }, + { "Phismall", 0xf515 }, + { "Chismall", 0xf516 }, + { "Psismall", 0xf517 }, + { "Omegasmall", 0xf518 }, + { "Iotadieresissmall", 0xf519 }, + { "Upsilondieresissmall", 0xf51a }, +/* Archaic or Rare Latin Ligatures */ + { "c_t", 0xf520 }, + { "longs_i", 0xf521 }, + { "longs_l", 0xf522 }, + { "longs_longs", 0xf523 }, + { "longs_longs_i", 0xf524 }, + { "longs_longs_l", 0xf525 }, + NULL +}; +const int psaltuninames_cnt = sizeof(psaltuninames)/sizeof(psaltuninames[0])-1; diff --git a/fontforge/savedimage.c b/fontforge/savedimage.c new file mode 100644 index 00000000..200ec8ad --- /dev/null +++ b/fontforge/savedimage.c @@ -0,0 +1,18048 @@ +#include "gdraw.h" + +static uint8 savedimage0_data[] = { + 0x16, 0x15, 0xf1, 0xf1, 0xe6, 0xa, 0xc9, 0xe6, + 0xee, 0x16, 0x16, 0x16, 0x14, 0x14, 0x15, 0x15, + 0xee, 0xf2, 0xe6, 0xf1, 0x2a, 0x6e, 0x7f, 0x7f, + 0x48, 0x70, 0x41, 0x3e, 0x72, 0x41, 0xfd, 0x13, + 0xe5, 0xbf, 0xb4, 0x25, 0x26, 0x6e, 0x39, 0x99, + 0x54, 0x39, 0x20, 0x3e, 0x50, 0xcc, 0xe3, 0x50, + 0xe5, 0xd4, 0xbf, 0x50, 0x13, 0x66, 0x25, 0x60, + 0x50, 0x5a, 0xfd, 0x25, 0x40, 0xbf, 0xd0, 0xe0, + 0xd8, 0xeb, 0xe6, 0x9, 0x54, 0x54, 0x99, 0x40, + 0x50, 0xdf, 0xc9, 0xc9, 0xdf, 0xd0, 0xd0, 0xd4, + 0xdf, 0xdf, 0xcb, 0xcb, 0x9, 0xeb, 0xf2, 0x15, + 0x34, 0x34, 0x3d, 0x15, 0xde, 0xeb, 0xeb, 0xeb, + 0xfa, 0x3d, 0xf2, 0x3d, 0x18, 0x3d, 0x16, 0x15, + 0x70, 0x54, 0x54, 0x39, 0x36, 0x31, 0x90, 0x6a, + 0x47, 0x6a, 0x58, 0x71, 0x6b, 0x97, 0x23, 0x48, + 0x39, 0x26, 0x6e, 0x6e, 0x5a, 0xf9, 0x23, 0x23, + 0x41, 0x54, 0x34, 0x3d, 0x3d, 0xeb, 0x3d, 0xf2, + 0xeb, 0xf2, 0x3d, 0x15, 0xd8, 0xe6, 0x15, 0xf2, + 0x2b, 0x34, 0x15, 0x16, 0x16, 0xf2, 0x16, 0xf2, + 0xeb, 0x16, 0x16, 0xf2, 0x15, 0x34, 0x3d, 0x15, + 0x17, 0x16, 0x3d, 0x3d, 0xf2, 0x16, 0xf2, 0xf2, + 0xf5, 0x15, 0x16, 0xf2, 0x3b, 0x34, 0xf2, 0x16, + 0xf2, 0xf2, 0x3d, 0xf2, 0x16, 0x3d, 0xeb, 0xde, + 0xde, 0x1, 0x15, 0x16, 0x16, 0x3d, 0x14, 0x18, + 0x16, 0x14, 0x14, 0x16, 0x16, 0x14, 0x16, 0x16, + 0xf2, 0x16, 0x15, 0x14, 0x16, 0x3d, 0x3d, 0x14, + 0x16, 0xff, 0x18, 0x16, 0x16, 0x16, 0x14, 0x18, + 0x16, 0x3d, 0x15, 0x3d, 0xf2, 0x3d, 0x17, 0x34, + 0x15, 0xee, 0xf2, 0x16, 0x16, 0x16, 0xf2, 0x3d, + 0x3d, 0x15, 0x2a, 0x15, 0x3d, 0x3d, 0x15, 0x3d, + 0x16, 0x18, 0x16, 0x16, 0x16, 0xf2, 0xf2, 0x15, + 0x3d, 0x3d, 0x15, 0xfa, 0xee, 0x16, 0xff, 0x16, + 0x14, 0x16, 0x14, 0x18, 0x18, 0x14, 0x21, 0x21, + 0x22, 0x3f, 0x2e, 0x1c, 0x48, 0x70, 0x2b, 0x3b, + 0x3d, 0x17, 0x3d, 0x17, 0x3d, 0xf5, 0xfe, 0xf9, + 0x1c, 0x23, 0xf2, 0xf2, 0x18, 0x18, 0x16, 0x18, + 0x18, 0x18, 0x14, 0x16, 0x16, 0x16, 0x18, 0x15, + 0x16, 0x16, 0x16, 0xf2, 0x16, 0x14, 0x16, 0xff, + 0x18, 0x18, 0x18, 0x16, 0xf2, 0x16, 0x16, 0x14, + 0x16, 0x14, 0x14, 0x16, 0x16, 0xff, 0x18, 0x18, + 0x16, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x3d, 0x16, 0x3d, 0x22, 0x22, 0x42, 0x58, + 0x81, 0x91, 0x7e, 0x47, 0x64, 0x46, 0x7d, 0x9b, + 0x9b, 0x27, 0x30, 0xac, 0x8e, 0x62, 0x57, 0x47, + 0x62, 0x1f, 0x98, 0x74, 0x52, 0xe, 0x89, 0xac, + 0x87, 0xc, 0x27, 0x64, 0x7d, 0x28, 0x78, 0x4a, + 0x27, 0x82, 0x7d, 0xac, 0xa6, 0xf8, 0x52, 0x61, + 0xa6, 0xc, 0x30, + 0xf2, 0xe1, 0xd8, 0xea, 0xed, 0x41, 0x40, 0x56, + 0x48, 0x15, 0x3d, 0x14, 0x16, 0x18, 0x16, 0x16, + 0xf2, 0xeb, 0x5a, 0x40, 0x90, 0x6f, 0x83, 0x4a, + 0x90, 0x99, 0xaf, 0xbf, 0xc9, 0xcb, 0xdf, 0xe9, + 0xe9, 0xe4, 0x87, 0x44, 0x61, 0x6f, 0x61, 0x61, + 0x4a, 0x66, 0xaf, 0xa6, 0xa5, 0xe5, 0xe4, 0x29, + 0x38, 0xc, 0xc, 0x5f, 0x55, 0x33, 0xad, 0xa8, + 0x3e, 0xaf, 0xdf, 0x6d, 0xe9, 0xdf, 0xd4, 0xd4, + 0xdf, 0xc0, 0xc9, 0xb, 0x61, 0x83, 0xa1, 0x50, + 0x87, 0x6, 0xdf, 0xe5, 0xda, 0xe9, 0xda, 0xa5, + 0x44, 0x87, 0xa5, 0xbf, 0x6, 0x5a, 0x6e, 0x73, + 0xa, 0x54, 0x34, 0x34, 0xfa, 0xfa, 0xf5, 0xfa, + 0xeb, 0xf2, 0x3d, 0x17, 0x17, 0x14, 0x17, 0x3d, + 0x3d, 0x15, 0x16, 0x3d, 0x34, 0x54, 0x26, 0x56, + 0x83, 0x6a, 0x5d, 0x9a, 0x97, 0x56, 0x80, 0x7f, + 0x7f, 0xeb, 0xf2, 0x15, 0xd8, 0xe6, 0x15, 0x73, + 0xcb, 0xc0, 0xeb, 0x16, 0xeb, 0xeb, 0x2b, 0x2b, + 0x16, 0xf2, 0x16, 0xee, 0xeb, 0xeb, 0xeb, 0x3d, + 0x3d, 0x1, 0x34, 0xeb, 0xeb, 0xf2, 0xf2, 0x16, + 0x3d, 0xf2, 0x18, 0x18, 0xee, 0x15, 0x17, 0x16, + 0x3b, 0x3b, 0x16, 0x16, 0x3d, 0x16, 0x3d, 0x16, + 0x2b, 0xee, 0x16, 0x16, 0xf2, 0xf2, 0xf2, 0x3d, + 0x15, 0xee, 0x15, 0x15, 0x15, 0x15, 0x15, 0x3d, + 0xee, 0xf2, 0x16, 0x14, 0x18, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x14, 0x16, 0xf2, 0x14, 0x16, 0x18, + 0x3d, 0xee, 0x18, 0x16, 0x16, 0x16, 0x16, 0x14, + 0x14, 0x3d, 0x18, 0x14, 0x16, 0xff, 0x18, 0x18, + 0x18, 0x16, 0x14, 0x18, 0x14, 0x16, 0xee, 0x15, + 0x3d, 0x34, 0x3b, 0x3d, 0x16, 0x3d, 0x16, 0x16, + 0x18, 0x16, 0xf2, 0x16, 0xf2, 0x16, 0xf2, 0x16, + 0x14, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x14, 0x16, 0xee, 0x14, 0x16, 0x16, 0x16, + 0x14, 0x16, 0x18, 0x18, 0x16, 0x14, 0x3d, 0x3d, + 0x15, 0x15, 0x3d, 0x3b, 0x21, 0x48, 0x54, 0x1d, + 0x21, 0x17, 0x1d, 0x48, 0x3b, 0x3d, 0xf2, 0x15, + 0xeb, 0xeb, 0x16, 0x16, 0x14, 0x18, 0x18, 0x14, + 0x18, 0x18, 0x18, 0x16, 0x3d, 0x16, 0x18, 0x14, + 0x14, 0x18, 0x18, 0x16, 0x18, 0x14, 0x16, 0x16, + 0x18, 0x18, 0x18, 0x3d, 0x14, 0x16, 0x16, 0x16, + 0x16, 0x18, 0x16, 0xee, 0x14, 0x18, 0x18, 0x17, + 0x16, 0x18, 0x18, 0x18, 0xf2, 0x18, 0x14, 0x16, + 0x3d, 0x16, 0x3d, 0x3b, 0x3f, 0x2e, 0x2e, 0x4d, + 0x6f, 0x91, 0x91, 0x90, 0x4a, 0x55, 0x89, 0x7e, + 0x47, 0x47, 0x65, 0x91, 0x94, 0x94, 0x7e, 0x47, + 0x9b, 0x89, 0x7d, 0x8e, 0x61, 0x62, 0x62, 0x8f, + 0x62, 0x1f, 0x27, 0x4b, 0x74, 0x89, 0x55, 0x6a, + 0x40, 0xae, 0x62, 0x8e, 0x60, 0x2f, 0x8e, 0x8f, + 0x5c, 0x43, 0x62, + 0xf2, 0xeb, 0xfa, 0x2a, 0x42, 0x99, 0x99, 0x6e, + 0x34, 0x3d, 0x16, 0x3d, 0x14, 0x3b, 0x16, 0x3d, + 0x2b, 0x54, 0x99, 0x80, 0x9a, 0x80, 0x85, 0x90, + 0x99, 0x3, 0xf9, 0xfe, 0x99, 0x11, 0x29, 0x40, + 0x58, 0xf8, 0xa6, 0x83, 0xb0, 0xbf, 0xa1, 0x6a, + 0x6a, 0xa5, 0x2c, 0x4a, 0x27, 0x5f, 0x7d, 0x7e, + 0x55, 0x3e, 0x55, 0x91, 0xaa, 0x50, 0x40, 0x4a, + 0x83, 0x2c, 0x60, 0x6a, 0x58, 0x3e, 0x6a, 0x5a, + 0x99, 0xcb, 0xfd, 0x83, 0xa6, 0xa1, 0x50, 0x4a, + 0x11, 0x2c, 0x6a, 0x94, 0x60, 0x11, 0x55, 0x55, + 0xa8, 0xbe, 0xb4, 0x5a, 0xbf, 0xbf, 0x99, 0x90, + 0x4d, 0x90, 0x3a, 0x63, 0x99, 0x2a, 0x34, 0x15, + 0xf5, 0x15, 0x34, 0xf2, 0xeb, 0x15, 0x34, 0xee, + 0x17, 0x16, 0x3d, 0x16, 0x16, 0x3b, 0x3b, 0x54, + 0x48, 0x54, 0x54, 0x54, 0x99, 0x54, 0x80, 0x99, + 0x3d, 0x3d, 0x3d, 0x15, 0x3d, 0x16, 0x16, 0x16, + 0xf2, 0x14, 0x16, 0x3d, 0x16, 0x15, 0x34, 0x54, + 0x34, 0x17, 0x15, 0x16, 0xf2, 0x16, 0x16, 0x16, + 0x16, 0xf2, 0xeb, 0x34, 0xeb, 0x3d, 0x22, 0x15, + 0x3d, 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0xff, 0x18, + 0x16, 0x16, 0x16, 0x3b, 0x3d, 0x3d, 0x17, 0xf2, + 0xee, 0xf2, 0x3d, 0xf2, 0x3d, 0x16, 0x3d, 0x15, + 0x16, 0x15, 0x3b, 0x48, 0x73, 0x15, 0x3d, 0x15, + 0x3d, 0xf2, 0x16, 0x16, 0x14, 0x14, 0x14, 0x18, + 0x3d, 0x16, 0x3b, 0x16, 0x3d, 0x16, 0x14, 0xf2, + 0x14, 0x16, 0x14, 0x14, 0x14, 0x14, 0x16, 0x16, + 0xf2, 0x16, 0x16, 0x16, 0x16, 0x14, 0x16, 0x14, + 0x16, 0x16, 0x3d, 0x3d, 0x3d, 0x16, 0x3d, 0xf2, + 0x3d, 0xf2, 0xf2, 0x16, 0x15, 0x16, 0xee, 0x16, + 0x16, 0x16, 0x14, 0x16, 0x14, 0x16, 0x16, 0x3d, + 0x18, 0x16, 0x18, 0x16, 0x18, 0xf2, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, + 0x16, 0xf2, 0xf2, 0x3d, 0xf5, 0x16, 0xf2, 0x3b, + 0x22, 0x22, 0x3b, 0x15, 0x34, 0x73, 0x34, 0x3d, + 0xf2, 0x15, 0xeb, 0x16, 0x3d, 0x15, 0x15, 0x17, + 0x16, 0x16, 0x16, 0x16, 0x14, 0x14, 0x14, 0x16, + 0x14, 0x16, 0x16, 0x16, 0x15, 0xf5, 0x16, 0x14, + 0x14, 0x16, 0x16, 0x14, 0x14, 0x16, 0x16, 0x14, + 0x14, 0x14, 0x16, 0x14, 0x16, 0x3d, 0x16, 0x16, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x3d, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0x16, 0x18, 0x17, 0x16, 0x3d, + 0x16, 0x3d, 0x16, 0xf2, 0x16, 0x3b, 0x54, 0xf9, + 0x40, 0x30, 0x9c, 0x93, 0x1e, 0x1f, 0x82, 0x82, + 0x5e, 0x8d, 0x2f, 0xa9, 0xa7, 0xa7, 0x5f, 0xc, + 0xfc, 0x6c, 0x82, 0x5e, 0x68, 0x68, 0x8d, 0x6c, + 0x7, 0x68, 0x28, 0xba, 0xcd, 0xb6, 0xf7, 0x28, + 0x1e, 0x6c, 0x28, 0x37, 0x32, 0x9f, 0x32, 0x28, + 0x6c, 0x7, 0x9f, + 0x7f, 0xf4, 0x5a, 0x7f, 0x48, 0x34, 0x34, 0x70, + 0x1, 0x15, 0x3d, 0x16, 0x17, 0x3f, 0x15, 0x42, + 0x1d, 0x54, 0x73, 0x48, 0x7f, 0x2a, 0x7f, 0x80, + 0x80, 0x80, 0x99, 0x31, 0x5d, 0xa9, 0xa8, 0x55, + 0x3e, 0x50, 0x50, 0x50, 0x40, 0x50, 0xf8, 0x55, + 0x9c, 0x28, 0xa7, 0x55, 0x55, 0x6c, 0xa7, 0x74, + 0x55, 0x50, 0x50, 0x6a, 0xaa, 0x87, 0x2c, 0x55, + 0x46, 0x6c, 0x5f, 0x74, 0x55, 0xf8, 0xba, 0x83, + 0x50, 0xe5, 0xa1, 0x60, 0xa8, 0xa0, 0xe, 0x2f, + 0x37, 0x28, 0xa7, 0x55, 0x5f, 0x2c, 0xa6, 0xc, + 0x8, 0xf3, 0xe4, 0x2c, 0xc, 0x2c, 0x2c, 0x52, + 0x52, 0x2c, 0xb3, 0xb3, 0xc8, 0xbf, 0xd0, 0xca, + 0xcb, 0x39, 0xcb, 0x2a, 0x34, 0x34, 0xeb, 0xeb, + 0x15, 0x15, 0x3d, 0x14, 0x16, 0x3d, 0x34, 0x15, + 0x16, 0x3b, 0x70, 0x73, 0x15, 0x34, 0x73, 0xa, + 0x15, 0x3d, 0xf2, 0xf2, 0xf2, 0xf2, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0xee, 0x3b, 0xf2, 0xeb, 0xcb, + 0xe6, 0x1, 0x15, 0xde, 0xf2, 0x16, 0x15, 0x16, + 0xf2, 0x3d, 0xf2, 0x15, 0x1, 0xf2, 0x2b, 0xe6, + 0x15, 0xf5, 0x15, 0xf5, 0x3d, 0x3d, 0x16, 0x3d, + 0x16, 0x16, 0x3d, 0x3d, 0x3d, 0x16, 0xf2, 0x15, + 0xe1, 0x15, 0xfa, 0x54, 0xf9, 0xfa, 0x34, 0xfa, + 0xeb, 0x34, 0xeb, 0x1, 0x1, 0x1, 0x15, 0xde, + 0xde, 0xe1, 0x3d, 0xf2, 0xf2, 0x15, 0x3d, 0x16, + 0xf2, 0xf5, 0xf5, 0xf2, 0xee, 0x16, 0x16, 0xf2, + 0xf2, 0x16, 0x15, 0x16, 0x16, 0x16, 0x16, 0xf2, + 0xf2, 0xee, 0x16, 0xee, 0xf5, 0x14, 0x3d, 0x15, + 0xeb, 0x15, 0xf5, 0xfa, 0xf5, 0x15, 0xf2, 0x16, + 0x16, 0x3d, 0x16, 0x16, 0xe1, 0xee, 0x16, 0x15, + 0x15, 0xeb, 0xf2, 0x17, 0x3b, 0x16, 0x16, 0x18, + 0x16, 0x16, 0xf2, 0xf2, 0xde, 0xde, 0xf2, 0xf2, + 0x3d, 0xf5, 0x16, 0x15, 0x16, 0x16, 0x3d, 0x16, + 0xf2, 0xf2, 0xee, 0x16, 0xeb, 0xde, 0xeb, 0xfa, + 0x1a, 0x23, 0x34, 0x3d, 0xf2, 0x3d, 0xf2, 0xf2, + 0x3d, 0xe1, 0xf2, 0x14, 0x15, 0xf1, 0xd8, 0xfa, + 0x23, 0x17, 0xf2, 0x14, 0x3d, 0x16, 0x16, 0x14, + 0x16, 0xf2, 0x16, 0x3d, 0xf2, 0xde, 0xf5, 0x16, + 0x16, 0x14, 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0xf2, 0xee, 0x14, + 0x16, 0xf5, 0x16, 0x16, 0x16, 0x14, 0x16, 0xee, + 0xf2, 0xf2, 0xeb, 0xf2, 0x3d, 0x17, 0x15, 0x16, + 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0x15, 0x15, 0x23, + 0xfd, 0x60, 0x46, 0x37, 0xfc, 0x12, 0x12, 0xf7, + 0x6c, 0x6c, 0x2c, 0x11, 0x2c, 0x1e, 0x82, 0x46, + 0xe, 0x1f, 0x82, 0x8d, 0x5e, 0x5e, 0xe, 0x24, + 0xdd, 0x6c, 0xa7, 0xf8, 0xf8, 0x33, 0x5f, 0x89, + 0x82, 0x28, 0x1f, 0x30, 0x76, 0x32, 0x6c, 0x1e, + 0x12, 0xb7, 0x28, + 0xbf, 0xbf, 0xe5, 0x40, 0x26, 0x54, 0xfa, 0x3d, + 0x3d, 0xf2, 0x16, 0x16, 0x3d, 0xfa, 0x54, 0x63, + 0x99, 0x3, 0x54, 0x42, 0x67, 0x99, 0x23, 0x67, + 0x9a, 0x90, 0x97, 0x85, 0x6a, 0xb3, 0xb7, 0xa8, + 0x2c, 0xcc, 0xbc, 0x2c, 0x2c, 0xf7, 0x28, 0xa7, + 0x9f, 0x6c, 0x6c, 0x6c, 0x7, 0xb7, 0xbd, 0xa7, + 0x37, 0xdd, 0xbc, 0x24, 0xe, 0xa7, 0x28, 0x28, + 0x28, 0x6c, 0x7, 0xa7, 0xf7, 0xb7, 0xbe, 0xf3, + 0xf7, 0xc, 0xf3, 0xa0, 0x28, 0xfc, 0x6c, 0x6c, + 0x6c, 0xb8, 0xb9, 0xb8, 0x8, 0x7, 0xcd, 0xf7, + 0x6c, 0x8, 0xa0, 0x37, 0xf7, 0xe, 0xc, 0xa0, + 0x8, 0xdd, 0xbe, 0xbe, 0xce, 0xce, 0xbf, 0xe9, + 0xf0, 0x11, 0x50, 0xb, 0xf9, 0xf9, 0xa, 0xeb, + 0xf5, 0xf2, 0xf2, 0x3d, 0x3d, 0x17, 0xd8, 0xeb, + 0xf2, 0x15, 0x16, 0x15, 0x3d, 0x3d, 0xee, 0xf2, + 0x16, 0x3d, 0x16, 0x16, 0xf2, 0x16, 0x3d, 0x3d, + 0x16, 0xf5, 0x15, 0x3d, 0xf2, 0xeb, 0x3d, 0xf2, + 0xf2, 0xeb, 0xd8, 0xde, 0xe1, 0x2b, 0x17, 0xfa, + 0x3d, 0x15, 0x15, 0xf2, 0x15, 0xeb, 0xeb, 0xde, + 0xeb, 0xfa, 0x6e, 0xe6, 0xf2, 0x3d, 0x17, 0x16, + 0x14, 0x3d, 0x16, 0x16, 0x3d, 0x16, 0xf2, 0xeb, + 0xf2, 0x34, 0x39, 0x40, 0x40, 0xfd, 0x1c, 0x39, + 0xfa, 0x73, 0x34, 0x15, 0xf2, 0xeb, 0xeb, 0xeb, + 0xde, 0xeb, 0x15, 0xf1, 0xde, 0xeb, 0xf5, 0x15, + 0x16, 0x15, 0xf2, 0xeb, 0xee, 0x16, 0x16, 0xeb, + 0xee, 0x16, 0x15, 0x15, 0xf2, 0x16, 0xf5, 0xf2, + 0xf2, 0xf2, 0x15, 0x15, 0xf2, 0xf5, 0xf2, 0x34, + 0xfd, 0xeb, 0x23, 0x1a, 0xfa, 0x34, 0xeb, 0xf2, + 0x3d, 0x16, 0xf2, 0x3d, 0x15, 0xf2, 0xf2, 0x2b, + 0x2a, 0xde, 0xf2, 0x15, 0xf5, 0x3d, 0x16, 0x3d, + 0x3d, 0x3d, 0xf2, 0xf2, 0xf2, 0xee, 0xf2, 0x16, + 0x16, 0xeb, 0xf2, 0xf2, 0x3d, 0xf2, 0xf2, 0x2b, + 0x3b, 0xf2, 0xeb, 0x16, 0x16, 0x15, 0xeb, 0x15, + 0x21, 0x23, 0x34, 0x15, 0x15, 0x16, 0xeb, 0xf5, + 0xf2, 0xeb, 0x16, 0x14, 0x15, 0xe6, 0xd8, 0xeb, + 0xfa, 0xfa, 0xeb, 0x3d, 0x17, 0xf2, 0x3d, 0x17, + 0x16, 0xf2, 0x16, 0x16, 0x16, 0x15, 0xf2, 0xf2, + 0x3d, 0x16, 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, + 0xf5, 0xee, 0x16, 0x14, 0x14, 0x14, 0x16, 0x16, + 0x16, 0xf2, 0x3d, 0x14, 0x16, 0x15, 0x3d, 0x3d, + 0x16, 0x3d, 0xee, 0xf2, 0xf2, 0xeb, 0x15, 0xf2, + 0xf2, 0x15, 0x16, 0xf5, 0xf2, 0x2b, 0x3b, 0x34, + 0xfe, 0x6a, 0x74, 0x74, 0xa7, 0x30, 0x55, 0xa6, + 0xb7, 0x28, 0x62, 0x27, 0x62, 0x62, 0x94, 0x8f, + 0x1e, 0x62, 0x8f, 0x7d, 0x7, 0x7d, 0x62, 0x30, + 0xa0, 0x93, 0x8f, 0x62, 0x30, 0x8f, 0x74, 0x94, + 0x7d, 0x76, 0x62, 0x65, 0x76, 0xb8, 0x9c, 0x65, + 0x7d, 0xfc, 0x8d, + 0xe4, 0xcc, 0xf0, 0x3e, 0x83, 0x97, 0x23, 0x22, + 0x3b, 0x15, 0x3d, 0x3d, 0x15, 0x15, 0x34, 0x66, + 0x6f, 0x41, 0xf9, 0x4d, 0x58, 0x90, 0x99, 0x42, + 0x42, 0x99, 0x6e, 0x85, 0x6f, 0xb0, 0xa1, 0xaa, + 0xa8, 0x2c, 0xf3, 0x12, 0xe, 0x6c, 0x28, 0x8, + 0xe, 0xf0, 0xb7, 0xa0, 0x37, 0xcd, 0xe4, 0x2c, + 0x28, 0x28, 0xa7, 0x2f, 0x27, 0xa7, 0xa0, 0xa8, + 0xa7, 0xf3, 0xba, 0xc, 0xa7, 0x6c, 0xf3, 0x12, + 0xc, 0x28, 0x8, 0xe, 0x12, 0x2c, 0xb7, 0xb7, + 0x7, 0xdd, 0xcc, 0x2c, 0x6c, 0x37, 0x37, 0x12, + 0x12, 0x37, 0x5f, 0xa8, 0xe, 0xf8, 0x50, 0xba, + 0xa0, 0xf7, 0xf8, 0xf0, 0xc, 0xa7, 0x2c, 0x2c, + 0xf8, 0x27, 0xa6, 0x50, 0x50, 0xb, 0xf9, 0xfa, + 0xfa, 0xeb, 0x3d, 0x3d, 0x16, 0x3d, 0x15, 0xeb, + 0xf2, 0x15, 0x17, 0xee, 0xf2, 0x3d, 0x3d, 0x16, + 0x16, 0x3d, 0x15, 0xf2, 0x16, 0x16, 0x3d, 0x16, + 0x16, 0x17, 0x16, 0xf2, 0xeb, 0x34, 0x34, 0x21, + 0x15, 0x15, 0xeb, 0xeb, 0xf2, 0xf2, 0xee, 0xeb, + 0xf2, 0xfa, 0xfa, 0x2a, 0xfa, 0x39, 0x1c, 0x39, + 0x2a, 0x23, 0x26, 0x6e, 0x3d, 0x16, 0x3d, 0xf2, + 0x16, 0x14, 0x3d, 0x3d, 0x3d, 0x17, 0x15, 0x23, + 0xfa, 0xfa, 0xfe, 0x3e, 0xbf, 0x5a, 0xfd, 0xcb, + 0xcb, 0x23, 0x26, 0x39, 0x54, 0x34, 0x54, 0xfa, + 0xeb, 0xf2, 0xf2, 0xde, 0xeb, 0xeb, 0xfa, 0xde, + 0xfa, 0xeb, 0x2a, 0x23, 0xf5, 0xf2, 0x3d, 0xf2, + 0xf2, 0xf2, 0x15, 0xee, 0x16, 0xf2, 0x15, 0xeb, + 0xfa, 0x34, 0xf1, 0xfe, 0x39, 0x3b, 0x23, 0x99, + 0x7f, 0x73, 0xa, 0xea, 0xa, 0x54, 0xa, 0xea, + 0x54, 0xfa, 0xfa, 0x36, 0x23, 0x15, 0x15, 0x34, + 0x34, 0xeb, 0xeb, 0x15, 0x34, 0x15, 0x34, 0x48, + 0x1d, 0x48, 0x15, 0x15, 0x2b, 0xf2, 0xf2, 0x15, + 0xf2, 0xf2, 0x15, 0xf2, 0xfa, 0xf1, 0x6e, 0xfe, + 0x9a, 0x99, 0xfa, 0x34, 0xfa, 0x15, 0x15, 0xf2, + 0x15, 0x3d, 0x3d, 0x15, 0xf2, 0x15, 0x3d, 0x15, + 0x15, 0x22, 0x16, 0x3d, 0x3d, 0xeb, 0xf2, 0xf5, + 0x15, 0xde, 0xeb, 0xee, 0x21, 0x23, 0x15, 0x3d, + 0x34, 0xf2, 0x15, 0xf2, 0x3d, 0x16, 0x3d, 0xf2, + 0x3d, 0xf5, 0x16, 0x14, 0x17, 0x17, 0xf2, 0xee, + 0x15, 0x16, 0x3d, 0x3d, 0x14, 0x16, 0x3d, 0xf2, + 0x16, 0xf2, 0xf2, 0x16, 0x17, 0x21, 0x17, 0xf2, + 0x15, 0x15, 0x15, 0x16, 0x15, 0x34, 0x34, 0x34, + 0xf2, 0xf2, 0xf2, 0x3d, 0x15, 0x1c, 0x1a, 0xfe, + 0x97, 0x60, 0x7e, 0xb3, 0xf3, 0x37, 0x62, 0x74, + 0x46, 0x46, 0x94, 0x94, 0x9c, 0x74, 0x7e, 0x8f, + 0xc, 0x9c, 0x8f, 0x62, 0xe, 0x82, 0x8f, 0x93, + 0x5e, 0x46, 0x8f, 0x8b, 0x9c, 0xaa, 0xac, 0x8e, + 0x74, 0xa4, 0xad, 0x8f, 0x5c, 0x37, 0x89, 0x8b, + 0x79, 0x86, 0x8d, + 0x7e, 0x4a, 0x4a, 0x90, 0x99, 0x73, 0x15, 0x3b, + 0x16, 0x16, 0xf5, 0x3f, 0x42, 0x36, 0x63, 0x71, + 0x6b, 0x9a, 0x70, 0x3f, 0x48, 0x70, 0x3d, 0x3d, + 0x2b, 0x73, 0x48, 0x80, 0x85, 0x71, 0x6b, 0x81, + 0x91, 0x74, 0x55, 0x60, 0x6a, 0xf3, 0xba, 0xa6, + 0x6a, 0x52, 0x60, 0x7e, 0x62, 0x76, 0x55, 0x62, + 0x62, 0x76, 0xa9, 0xaa, 0x6a, 0x2c, 0x50, 0xa6, + 0x74, 0xa8, 0x55, 0x74, 0x93, 0x28, 0x62, 0x7e, + 0x5f, 0xa7, 0xb3, 0xb0, 0x60, 0x2f, 0x83, 0x6a, + 0x9c, 0x9c, 0x7e, 0x7e, 0x9c, 0x82, 0x74, 0x74, + 0xa7, 0xa7, 0xaa, 0xa6, 0x2f, 0x2f, 0xaa, 0x6a, + 0xa7, 0x76, 0x8f, 0x74, 0x76, 0x5f, 0x62, 0xb3, + 0x2c, 0xa9, 0x60, 0xbf, 0x50, 0x2c, 0x6a, 0x83, + 0x53, 0x83, 0x23, 0x2b, 0x15, 0xf2, 0xeb, 0x15, + 0xf2, 0xf2, 0x16, 0xf2, 0xf2, 0x3f, 0x2b, 0x34, + 0x3b, 0x23, 0x34, 0xf2, 0x3d, 0x14, 0x16, 0xee, + 0x16, 0x16, 0x3d, 0x3d, 0x34, 0xfe, 0x4d, 0x5a, + 0x6e, 0x54, 0xfa, 0xeb, 0xee, 0x17, 0x3d, 0x16, + 0x3d, 0x99, 0x5d, 0x3e, 0x50, 0x83, 0x6a, 0x3e, + 0x97, 0x97, 0x90, 0xea, 0xeb, 0x2b, 0x3d, 0x16, + 0x3d, 0x3d, 0x15, 0x15, 0x15, 0x21, 0x31, 0x1b, + 0x5a, 0x5a, 0xa1, 0x50, 0x5a, 0x5a, 0x40, 0xe4, + 0xb, 0x83, 0x2c, 0xc, 0xa1, 0xb4, 0x40, 0xfd, + 0xcb, 0x73, 0xeb, 0xfa, 0xeb, 0xfa, 0x5a, 0xec, + 0x3, 0xcb, 0x20, 0x6, 0x51, 0xa, 0xe6, 0xfa, + 0xeb, 0x34, 0x2a, 0xfa, 0x15, 0x34, 0x7f, 0xb, + 0x41, 0x3, 0xb, 0x11, 0x83, 0xb4, 0xbf, 0xa1, + 0xc9, 0x5a, 0x5a, 0x50, 0xb, 0x3, 0xcb, 0xb, + 0x40, 0x3, 0xe5, 0xfd, 0xb, 0xca, 0xd0, 0x3, + 0xcb, 0xf1, 0x2a, 0x54, 0x54, 0xfa, 0x23, 0x1b, + 0x83, 0xbf, 0xcb, 0xcb, 0xf1, 0xf1, 0x6e, 0x6e, + 0x54, 0xfa, 0xfa, 0x99, 0x40, 0xe5, 0x5a, 0x1b, + 0x11, 0xd4, 0xbf, 0xd0, 0xcb, 0x23, 0xe6, 0xa, + 0x23, 0x34, 0x15, 0xfa, 0xf5, 0x15, 0xee, 0x15, + 0xfa, 0x15, 0xf5, 0xa, 0xfa, 0xf9, 0xfa, 0xf9, + 0x41, 0xf9, 0xfa, 0xfa, 0xea, 0xe0, 0xe6, 0xfa, + 0xf1, 0xe6, 0xa, 0xf4, 0xf4, 0xf9, 0x39, 0x23, + 0x54, 0x54, 0x34, 0x17, 0xeb, 0xde, 0xeb, 0x15, + 0xde, 0xe6, 0xde, 0xe6, 0xa, 0x54, 0xfa, 0xe6, + 0xfa, 0xfa, 0x15, 0x15, 0xd8, 0xea, 0xe0, 0xe6, + 0xcb, 0xed, 0xf9, 0xf9, 0x41, 0x40, 0x41, 0x54, + 0x2b, 0xfa, 0x15, 0xf2, 0x34, 0xf9, 0x5a, 0xe3, + 0xc8, 0xf7, 0x12, 0x30, 0x28, 0x68, 0x5e, 0x5e, + 0xe, 0x1f, 0x8d, 0x8, 0xba, 0xf8, 0x27, 0xf7, + 0x8, 0x6c, 0x28, 0x1f, 0x1e, 0x28, 0x5e, 0x68, + 0xfc, 0x12, 0x76, 0x28, 0xcd, 0xdd, 0xf3, 0x12, + 0x30, 0x37, 0x37, 0x5e, 0x32, 0x1e, 0x43, 0x68, + 0x68, 0x32, 0x6c, + 0xaa, 0xaa, 0xa6, 0xaf, 0x73, 0xf2, 0xf2, 0x3d, + 0xf2, 0x16, 0x3b, 0x48, 0x6f, 0x71, 0x6b, 0x6b, + 0x6b, 0x6f, 0x7f, 0x70, 0x3d, 0x3d, 0x3d, 0x34, + 0x21, 0x3d, 0x2a, 0x42, 0x85, 0x71, 0x6f, 0x85, + 0x81, 0xa6, 0xbb, 0x50, 0xaa, 0xf8, 0x50, 0x60, + 0x9c, 0x28, 0x76, 0x74, 0x9c, 0x28, 0xa7, 0xaa, + 0xa8, 0x24, 0xc8, 0x50, 0xa8, 0x28, 0x2f, 0x60, + 0xa7, 0x28, 0x5e, 0x9c, 0x2f, 0x6c, 0xa7, 0xa8, + 0xa7, 0x2c, 0x50, 0x50, 0x37, 0x6c, 0x5f, 0x2f, + 0x38, 0x8d, 0x9c, 0x9c, 0x37, 0xe, 0x2c, 0xc8, + 0xa7, 0x37, 0x12, 0x60, 0xa7, 0x5e, 0x46, 0x46, + 0xe, 0x28, 0x76, 0xa7, 0x9f, 0x28, 0x2c, 0x50, + 0xba, 0x5f, 0x55, 0x2c, 0xe, 0x37, 0xa7, 0xa0, + 0xf8, 0xec, 0xb, 0xf4, 0xcb, 0xa, 0x15, 0x15, + 0xeb, 0x34, 0x34, 0xf2, 0xf2, 0xfa, 0xf1, 0xe6, + 0xe6, 0xe6, 0xf1, 0xde, 0xd8, 0xeb, 0xeb, 0xf2, + 0xf2, 0xfa, 0x48, 0x15, 0xfa, 0xfd, 0x50, 0xbf, + 0xdb, 0xd3, 0xcb, 0xea, 0xc9, 0xc0, 0x54, 0x2b, + 0x2a, 0x97, 0xb3, 0xb7, 0xf8, 0xf0, 0x2c, 0xc, + 0xbe, 0xbf, 0xd4, 0x26, 0xea, 0xcb, 0x6e, 0x73, + 0x15, 0xf5, 0xfa, 0xfa, 0xfa, 0x23, 0xfd, 0xe3, + 0xe3, 0xbf, 0xc8, 0xf8, 0x3e, 0x2c, 0xa9, 0xf7, + 0x50, 0x11, 0xa8, 0x8, 0xb7, 0xc7, 0xbf, 0xe3, + 0xe3, 0xd4, 0xbf, 0x41, 0xfd, 0x41, 0xa6, 0xa0, + 0xe3, 0xfd, 0xbf, 0xcc, 0xd4, 0xd0, 0xd3, 0xed, + 0xfd, 0x5a, 0xe5, 0xa1, 0x41, 0x26, 0x41, 0x2c, + 0xa1, 0x5a, 0xe5, 0x11, 0xb7, 0xcc, 0xcc, 0xe4, + 0x11, 0x50, 0xf8, 0xa0, 0xa8, 0x40, 0xe5, 0x50, + 0xcc, 0xd0, 0xd0, 0xe5, 0xe3, 0xcc, 0xcc, 0xe4, + 0xf8, 0x90, 0x40, 0x40, 0x40, 0x7f, 0x9, 0xe5, + 0xe3, 0xd0, 0xd0, 0xd4, 0x72, 0xa1, 0xbf, 0xa1, + 0x50, 0xb, 0x41, 0xa1, 0x2c, 0x50, 0xd4, 0xd4, + 0xa1, 0xc7, 0xbf, 0xbf, 0x40, 0x40, 0xb, 0xa1, + 0x83, 0x97, 0xfa, 0xeb, 0x34, 0xeb, 0xf2, 0xeb, + 0xde, 0xeb, 0xe6, 0x3, 0xe3, 0x20, 0x1b, 0x60, + 0xa8, 0x50, 0x5a, 0xa, 0xea, 0xa, 0xa, 0xa, + 0xcb, 0xed, 0xb, 0xa1, 0x50, 0x2c, 0x11, 0x90, + 0x40, 0xa1, 0x3, 0x73, 0xa, 0x54, 0xfa, 0xa, + 0xcb, 0x5a, 0xcb, 0xcb, 0xcf, 0xa1, 0x41, 0x6e, + 0x3, 0x3, 0xcb, 0xa, 0xcb, 0xf4, 0xcb, 0xcb, + 0xe5, 0xf8, 0x60, 0x55, 0x2c, 0x5f, 0x2c, 0x40, + 0xcb, 0xcb, 0x73, 0x15, 0xfa, 0x5a, 0xb, 0xf0, + 0xa7, 0x28, 0x8d, 0x8d, 0x5e, 0x5e, 0x5e, 0x5e, + 0xa0, 0xc, 0xa7, 0x5f, 0xdd, 0xe, 0x46, 0x82, + 0x5e, 0x5e, 0x8d, 0x82, 0x37, 0x6c, 0x28, 0x5e, + 0x7, 0xc, 0x76, 0x37, 0xa7, 0x2f, 0xa9, 0x62, + 0x7d, 0x82, 0x82, 0x5c, 0x43, 0x28, 0x43, 0x82, + 0x68, 0xa3, 0x7, + 0x60, 0x50, 0xcc, 0xbf, 0xcb, 0xeb, 0x3d, 0x3d, + 0x16, 0x16, 0x3b, 0x7f, 0x90, 0x97, 0x6a, 0x1b, + 0x58, 0x83, 0xaf, 0x99, 0x48, 0x3f, 0x3f, 0x3d, + 0x70, 0xf2, 0x15, 0x3f, 0x99, 0x80, 0xb0, 0x99, + 0x3a, 0x40, 0xbf, 0xa6, 0xe, 0xf3, 0xf8, 0x2f, + 0x37, 0x6c, 0x6c, 0xe, 0xe, 0xa7, 0xdd, 0xc8, + 0xf3, 0x12, 0xf8, 0xc, 0xa7, 0x6c, 0xe, 0x30, + 0x1e, 0x5e, 0x6c, 0xc, 0xf3, 0xf6, 0xdd, 0xbe, + 0x8, 0xe, 0xf8, 0x87, 0x28, 0x6c, 0x28, 0x12, + 0xfc, 0x5e, 0x5e, 0xa0, 0xf3, 0x12, 0xc, 0xb7, + 0x8, 0x28, 0xe, 0x12, 0xfc, 0x9f, 0x6c, 0xe, + 0x12, 0x37, 0x6c, 0xdd, 0xdd, 0xf7, 0x12, 0xb9, + 0xf7, 0x28, 0xe, 0x12, 0xe, 0x6c, 0x37, 0xb8, + 0xe4, 0xec, 0xbf, 0xd1, 0xd0, 0x3, 0x23, 0x2a, + 0x39, 0x99, 0x54, 0x73, 0xfa, 0x73, 0xe6, 0xd8, + 0xd8, 0xd6, 0xe6, 0xcb, 0xcb, 0xd0, 0x6e, 0x2a, + 0x2a, 0x7f, 0x41, 0x7f, 0x6e, 0x5a, 0xa1, 0xbf, + 0xd0, 0xd4, 0xb, 0xbf, 0xb4, 0xbf, 0xaf, 0x41, + 0x7f, 0x40, 0xc, 0xb7, 0xbe, 0x50, 0x2c, 0xb7, + 0xbe, 0xbe, 0x50, 0x50, 0xb4, 0xbf, 0xe3, 0x5a, + 0xf1, 0xa, 0xa, 0xcb, 0xa, 0xc9, 0x6, 0xa6, + 0xc8, 0xc8, 0xe, 0xe, 0x5f, 0xa8, 0x1e, 0x28, + 0xa8, 0xa6, 0xba, 0x7, 0xcd, 0xc7, 0xbe, 0xf8, + 0xba, 0xc8, 0xf3, 0xf8, 0x3e, 0x60, 0x2c, 0xa0, + 0x50, 0xb4, 0xe5, 0xbf, 0xbf, 0xd0, 0xbf, 0x50, + 0x40, 0x60, 0xa6, 0x2c, 0x3e, 0x83, 0x40, 0x2c, + 0x2c, 0xaf, 0xd4, 0x50, 0xa8, 0xba, 0xf3, 0xc, + 0x2c, 0x55, 0xa7, 0x37, 0xa7, 0xa6, 0xbf, 0xa1, + 0x50, 0xaf, 0xbf, 0xe4, 0xa6, 0x2c, 0xf3, 0xa0, + 0x2f, 0x52, 0x2c, 0xa6, 0x50, 0xaf, 0x5a, 0xbf, + 0xe5, 0x5a, 0xb4, 0xa1, 0x3e, 0xa9, 0xf3, 0xba, + 0x60, 0x60, 0xa1, 0xbf, 0xf3, 0x2c, 0x50, 0xbf, + 0x50, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60, 0x83, + 0xb0, 0xb0, 0xf4, 0xa, 0x2a, 0x54, 0x54, 0x54, + 0x54, 0x54, 0x54, 0xe5, 0x3e, 0xe4, 0x3e, 0x60, + 0x2c, 0xba, 0xbf, 0x3, 0xb4, 0x5a, 0x7f, 0x7f, + 0x41, 0xb, 0xb, 0x4a, 0x60, 0xa9, 0x2c, 0xb0, + 0xbf, 0xcc, 0xaf, 0x5a, 0x3, 0x5a, 0x7f, 0x5a, + 0xb, 0xe9, 0xf4, 0x5a, 0xd4, 0xcc, 0xa1, 0xb4, + 0xd0, 0xbf, 0xb4, 0x5a, 0xb4, 0xe3, 0x41, 0x41, + 0x50, 0xa9, 0x74, 0x7e, 0xa8, 0xf3, 0x60, 0xb0, + 0xbf, 0x3, 0x39, 0x54, 0x99, 0x97, 0x6f, 0x4a, + 0x12, 0x46, 0x62, 0x93, 0x82, 0x37, 0x93, 0x93, + 0xa0, 0xa0, 0x74, 0x62, 0x9c, 0x5c, 0x8f, 0x46, + 0x5e, 0x1f, 0x8f, 0x93, 0x37, 0xc, 0x2f, 0x46, + 0x28, 0x9c, 0x8f, 0x62, 0x5f, 0x8f, 0x62, 0x94, + 0x8f, 0x7d, 0x55, 0x8e, 0x8d, 0x76, 0xa9, 0xab, + 0x1f, 0x5e, 0x82, + 0x2c, 0xbc, 0xcc, 0xe3, 0x20, 0x42, 0x48, 0x48, + 0x3f, 0x3b, 0x21, 0x70, 0x23, 0x2a, 0x99, 0x71, + 0x71, 0x5d, 0x5d, 0x5d, 0x71, 0x59, 0x42, 0x3f, + 0x15, 0x16, 0x16, 0xf2, 0xeb, 0xeb, 0xa, 0x54, + 0x99, 0x83, 0x60, 0x2c, 0x74, 0x2f, 0x27, 0xa8, + 0xa8, 0x37, 0xb7, 0xc8, 0x2c, 0x28, 0xa0, 0xe, + 0xe, 0x46, 0x46, 0x9c, 0x1e, 0x68, 0x37, 0xf3, + 0xa0, 0x6c, 0x7, 0xc8, 0x2c, 0xa7, 0x43, 0x5f, + 0xa7, 0x37, 0x5f, 0x9c, 0xb6, 0x6c, 0x37, 0xc, + 0xa0, 0x7, 0x28, 0xb9, 0xf7, 0x37, 0x46, 0x76, + 0x37, 0x5e, 0x76, 0x5f, 0xa7, 0x6c, 0xa7, 0xba, + 0xc8, 0x37, 0xa7, 0x37, 0xa7, 0x6c, 0x9c, 0x82, + 0x37, 0x7, 0x5f, 0xa8, 0xb7, 0xb7, 0x5f, 0xba, + 0xcc, 0x50, 0xa1, 0xe3, 0x50, 0xf8, 0x6, 0x97, + 0x50, 0xa1, 0xb0, 0x5a, 0xc9, 0x3, 0x7f, 0x26, + 0x5a, 0xb, 0x5a, 0x5a, 0xd0, 0xbf, 0xb, 0xb4, + 0xb4, 0xb4, 0xa6, 0x40, 0xb, 0xb, 0x40, 0x83, + 0x3e, 0x60, 0x60, 0xaa, 0x2c, 0xa6, 0x83, 0x60, + 0x40, 0xbf, 0x50, 0x2c, 0xc8, 0x50, 0xa8, 0xa7, + 0xe, 0x60, 0x55, 0xa6, 0x50, 0xb4, 0xa1, 0x50, + 0xb4, 0xb4, 0xb4, 0xb, 0x41, 0x90, 0x60, 0xa7, + 0x5f, 0x74, 0x9c, 0x82, 0x76, 0xaa, 0xa8, 0xb7, + 0x5f, 0x50, 0xf3, 0x8, 0x2f, 0x74, 0x46, 0xa7, + 0x5f, 0xaa, 0x2c, 0xa7, 0xaa, 0xb0, 0x50, 0xa0, + 0x60, 0xa6, 0x50, 0x2c, 0x3e, 0x4a, 0x2c, 0x2f, + 0xaa, 0x5b, 0xa6, 0xc, 0xaa, 0xb0, 0xcc, 0x50, + 0x60, 0x60, 0x2c, 0x2f, 0x55, 0x27, 0xe, 0x5f, + 0x7e, 0x74, 0xc8, 0xc8, 0x55, 0xac, 0xba, 0x2c, + 0x60, 0x60, 0x5f, 0x74, 0x62, 0x74, 0xe, 0x5f, + 0x74, 0xaa, 0xba, 0xbf, 0xb0, 0x3e, 0xc8, 0xa6, + 0x4a, 0x4a, 0x60, 0x55, 0x7e, 0x74, 0x2c, 0x50, + 0x60, 0xa8, 0xc8, 0xcc, 0x11, 0x2c, 0xe, 0xac, + 0x7e, 0x55, 0x27, 0x6a, 0x91, 0x7e, 0xb0, 0x99, + 0xf4, 0x41, 0xb, 0x99, 0x20, 0x20, 0x4a, 0x6a, + 0x6a, 0x6a, 0x31, 0x20, 0xb0, 0xa1, 0x40, 0xaf, + 0xb, 0xf0, 0xa6, 0x40, 0x40, 0x11, 0x4a, 0x6a, + 0x94, 0x60, 0x6a, 0x4a, 0xa6, 0x5f, 0x5f, 0xb0, + 0x40, 0x11, 0x60, 0x6a, 0x60, 0x2c, 0x4a, 0x5d, + 0x83, 0x2c, 0x83, 0x97, 0x5a, 0xbf, 0xa1, 0x97, + 0xa1, 0xf0, 0x4a, 0x6a, 0x5f, 0xe, 0x94, 0x5d, + 0x60, 0xa7, 0x7e, 0xaa, 0xa1, 0x50, 0x6a, 0x6a, + 0x3e, 0xa1, 0x1b, 0x5d, 0x55, 0x9c, 0x7e, 0x6a, + 0x27, 0x74, 0x8f, 0x8f, 0x28, 0x2f, 0x62, 0x93, + 0x82, 0x7d, 0x8f, 0x7e, 0x30, 0x7d, 0x8f, 0x98, + 0xe, 0x3e, 0x74, 0x98, 0x28, 0x2c, 0x55, 0x46, + 0x8d, 0x98, 0x8f, 0x62, 0x27, 0xaa, 0xac, 0xac, + 0x98, 0x5f, 0x52, 0x64, 0x89, 0x75, 0x79, 0x62, + 0x1f, 0x75, 0x79, + 0x7e, 0x55, 0x3e, 0x83, 0x41, 0x73, 0x2a, 0xfa, + 0x34, 0x3f, 0x67, 0x80, 0x63, 0x59, 0x71, 0x6b, + 0x71, 0x63, 0x58, 0x71, 0x71, 0x85, 0x99, 0x70, + 0x48, 0xfa, 0x2b, 0x3b, 0x3d, 0x3d, 0x3b, 0x48, + 0x7f, 0x99, 0x90, 0x85, 0x6a, 0x6a, 0x83, 0xaf, + 0x83, 0x2f, 0x2f, 0x6a, 0x8f, 0x9c, 0x12, 0x7e, + 0x8f, 0x76, 0x9c, 0xb3, 0x60, 0xa7, 0x8f, 0x60, + 0x60, 0x2f, 0x64, 0x7e, 0x74, 0x76, 0x55, 0x60, + 0x9c, 0xa7, 0x74, 0xb3, 0xa1, 0x2c, 0x74, 0x60, + 0xa8, 0xe, 0x27, 0x74, 0x28, 0x5e, 0x7d, 0x55, + 0x2c, 0xa7, 0x9c, 0xaa, 0xc8, 0xf8, 0x7e, 0x62, + 0x5f, 0x76, 0x62, 0x55, 0x37, 0x76, 0x62, 0x74, + 0xa6, 0x52, 0xaa, 0xaa, 0xc8, 0xf8, 0x27, 0x55, + 0xa7, 0x2f, 0x7e, 0x27, 0xf0, 0x50, 0xaf, 0x97, + 0xbf, 0xe5, 0x83, 0x50, 0xc8, 0x50, 0x4a, 0x27, + 0x2f, 0xaa, 0x6a, 0x11, 0xb, 0x3, 0xf4, 0x5a, + 0xe5, 0xe5, 0x4a, 0x5f, 0xa7, 0x74, 0x7e, 0x27, + 0x2f, 0xaa, 0x62, 0x9c, 0xba, 0xd4, 0xa1, 0xa0, + 0xc8, 0x83, 0x3e, 0x2f, 0xa7, 0x62, 0x8f, 0x5f, + 0x12, 0xaa, 0xaa, 0xa6, 0x50, 0xb, 0xa1, 0xa0, + 0xf3, 0x3e, 0x2c, 0x12, 0x30, 0x74, 0x93, 0x28, + 0x2f, 0x83, 0xb3, 0x6c, 0xa7, 0x60, 0x3e, 0x46, + 0x5c, 0x62, 0x76, 0x37, 0x30, 0x74, 0x37, 0x6c, + 0x5f, 0xa6, 0xa1, 0xf3, 0xa8, 0x60, 0x2c, 0x12, + 0x74, 0x74, 0xa7, 0x1e, 0x2f, 0x60, 0xa0, 0xc, + 0x9c, 0xa6, 0x50, 0xa6, 0x9c, 0x5f, 0x5f, 0x12, + 0x55, 0x7d, 0xa7, 0xa7, 0x9c, 0x60, 0xc8, 0xba, + 0xa8, 0x9c, 0xa6, 0x2c, 0x74, 0x82, 0x28, 0x28, + 0x46, 0x46, 0x5e, 0xa7, 0x9c, 0x5f, 0xa6, 0x50, + 0xa8, 0xa7, 0xf3, 0x2c, 0x2f, 0xa7, 0x28, 0x1e, + 0x5f, 0x2f, 0x2c, 0xb3, 0xa8, 0x76, 0xf3, 0xe4, + 0x2c, 0x37, 0xf7, 0xf7, 0x2f, 0x28, 0x5e, 0xa7, + 0x9c, 0x37, 0x2c, 0x50, 0xa6, 0xa8, 0xa8, 0x40, + 0x83, 0x60, 0x2f, 0x5f, 0x2f, 0x2f, 0xe, 0xa0, + 0xb8, 0x7, 0xa0, 0x50, 0xcc, 0xb7, 0xe, 0xc, + 0x2f, 0xa7, 0x5e, 0xa7, 0xe, 0xe, 0x30, 0xa7, + 0xba, 0xb7, 0x24, 0xf8, 0xf8, 0x28, 0x28, 0x76, + 0xfc, 0xe, 0x37, 0x76, 0x28, 0x7, 0xe, 0x2c, + 0xbe, 0xba, 0xc, 0x2c, 0xf3, 0xa0, 0x28, 0x28, + 0x8, 0x28, 0x28, 0x76, 0x7, 0xb8, 0x7, 0x37, + 0xf7, 0xf7, 0x28, 0xa7, 0xa7, 0xe, 0x76, 0x6c, + 0x28, 0xf7, 0x2c, 0x2f, 0xa0, 0xba, 0xa0, 0x28, + 0xa7, 0x7, 0x5e, 0x68, 0xa3, 0x68, 0x5e, 0x86, + 0x5e, 0x9f, 0x37, 0xfc, 0xf7, 0xb8, 0x7, 0x5e, + 0x32, 0x6c, 0x9f, 0x5e, 0xa3, 0x68, 0x68, 0x68, + 0xa3, 0x9f, 0x9f, 0x5e, 0x28, 0xb7, 0xb7, 0xf3, + 0x28, 0x5e, 0x5e, 0x5e, 0xa3, 0x68, 0x68, 0x68, + 0x68, 0xa2, 0x9f, + 0x62, 0x55, 0x11, 0xaf, 0x6e, 0x54, 0xd8, 0xf2, + 0x3d, 0x42, 0x85, 0x6b, 0x6b, 0x71, 0x6b, 0x5d, + 0x6b, 0x6b, 0x58, 0x59, 0x71, 0x59, 0x9a, 0x7f, + 0x2a, 0x70, 0x36, 0x7f, 0x3d, 0x3b, 0x48, 0x67, + 0x7f, 0x99, 0x58, 0x99, 0xb0, 0x5d, 0x6a, 0x6a, + 0x6a, 0x55, 0x76, 0x74, 0x9c, 0x1e, 0x30, 0x3e, + 0xa8, 0x28, 0xa7, 0x50, 0xa1, 0x1e, 0x76, 0x8f, + 0x5f, 0x12, 0x55, 0x74, 0xa7, 0x6c, 0xa7, 0xa6, + 0xba, 0xc, 0xa8, 0x60, 0x50, 0x27, 0x46, 0x7d, + 0x37, 0x28, 0x30, 0x5f, 0x6c, 0xb6, 0x76, 0x2f, + 0xa6, 0xf7, 0xa7, 0x5f, 0xe, 0x12, 0x46, 0x8d, + 0x5e, 0x9f, 0x37, 0x2f, 0xb7, 0xdd, 0xa7, 0xa7, + 0xba, 0x2c, 0x5f, 0x5f, 0x28, 0x37, 0x2f, 0xa7, + 0x6c, 0x28, 0xa7, 0xe, 0xc8, 0xcc, 0xf0, 0xf8, + 0xf3, 0xf0, 0xe, 0x28, 0x9f, 0xfc, 0x2f, 0x5f, + 0x7, 0xb7, 0xa8, 0xa0, 0xe4, 0xcc, 0x50, 0x3e, + 0x2c, 0x2c, 0xe, 0x28, 0x6c, 0x6c, 0x37, 0x1e, + 0xa0, 0xb7, 0xc8, 0xa0, 0xf3, 0xf8, 0xf3, 0x28, + 0x7, 0x43, 0x1e, 0x28, 0x5e, 0x7, 0x6c, 0x6c, + 0x37, 0xba, 0xba, 0xf7, 0xf7, 0x2c, 0xa0, 0x6c, + 0x6c, 0x1e, 0x28, 0x6c, 0x28, 0xa7, 0x7, 0x6c, + 0x6c, 0xa0, 0xf3, 0x6c, 0x6c, 0x28, 0x43, 0x28, + 0x68, 0x9f, 0x5e, 0xa3, 0x6c, 0x6c, 0xb8, 0x8, + 0x6c, 0xf7, 0xf7, 0x8, 0x28, 0x28, 0x6c, 0x37, + 0x28, 0x6c, 0x8, 0x7, 0x28, 0xf7, 0xba, 0xcd, + 0xa7, 0xa7, 0xf7, 0x28, 0x6c, 0x6c, 0x6c, 0x28, + 0x37, 0x28, 0xb6, 0xdd, 0x8, 0x8, 0xc8, 0xcd, + 0xf7, 0x6c, 0x6c, 0x28, 0x28, 0x76, 0x9f, 0x7, + 0x6c, 0x6c, 0x7, 0xbd, 0x7, 0x6c, 0x6c, 0xf7, + 0x28, 0x28, 0x6c, 0x6c, 0x28, 0x6c, 0x6c, 0x7, + 0x7, 0x6c, 0x8, 0xc8, 0xdd, 0x7, 0x6c, 0x6c, + 0xfc, 0xe, 0xe, 0xa7, 0x28, 0x5e, 0xb6, 0xb8, + 0xbd, 0x7, 0x8, 0xc, 0xc8, 0x24, 0xfc, 0xa7, + 0x46, 0xe, 0xf7, 0xf7, 0xb8, 0x8, 0x8, 0xb7, + 0xbe, 0x8, 0x28, 0x5f, 0x2c, 0xe, 0xe, 0x37, + 0x28, 0x6c, 0x6c, 0xe, 0xba, 0xdd, 0x37, 0xa0, + 0xf3, 0xf3, 0x37, 0xa7, 0x37, 0x28, 0x7, 0xa7, + 0x6c, 0x6c, 0x6c, 0xf7, 0xb9, 0xdd, 0xa7, 0x5f, + 0xf3, 0xf0, 0xe, 0x5f, 0x82, 0x6c, 0x6c, 0xe, + 0x6c, 0xb8, 0xa7, 0x28, 0xdd, 0xc8, 0xa0, 0x37, + 0x6c, 0x28, 0xfc, 0x32, 0x9f, 0x5e, 0xa7, 0x2f, + 0xf3, 0xba, 0xa6, 0x5f, 0xf7, 0xf3, 0x2f, 0x82, + 0x5e, 0x5e, 0x37, 0xfc, 0x5e, 0x5e, 0x8d, 0x5e, + 0xe, 0xf7, 0xba, 0x76, 0x8, 0xe, 0x30, 0x1e, + 0x86, 0x75, 0x28, 0x1f, 0xfc, 0x28, 0xa7, 0x6c, + 0x28, 0xf7, 0xf3, 0x28, 0x5e, 0x1f, 0xe, 0x27, + 0x1f, 0x32, 0x43, 0x8d, 0x32, 0xfc, 0x28, 0xa7, + 0x6c, 0x32, 0x28, + 0xa7, 0xa0, 0x50, 0xbf, 0x5a, 0xea, 0x2b, 0x3d, + 0x3b, 0x54, 0x6f, 0x6a, 0x6a, 0x6a, 0x6a, 0xb0, + 0x6f, 0x6a, 0x6a, 0x6f, 0x71, 0x6a, 0x6f, 0x99, + 0x48, 0x70, 0x99, 0x7f, 0x34, 0x3f, 0x6e, 0x3, + 0x3, 0x99, 0x6f, 0x99, 0x90, 0x3e, 0xaa, 0x55, + 0x55, 0x5f, 0x5f, 0xa8, 0xa9, 0x37, 0xe, 0xb7, + 0xba, 0xf7, 0x6c, 0xe, 0x2f, 0xa7, 0x76, 0x28, + 0x37, 0xe, 0x5f, 0xa7, 0xb7, 0xa0, 0x37, 0xba, + 0xe4, 0xb7, 0xa0, 0xa0, 0xe, 0xe, 0x6c, 0x6c, + 0x7, 0x7, 0x6c, 0x28, 0xb8, 0xb8, 0x6c, 0x28, + 0xf7, 0x28, 0x6c, 0x6c, 0x6c, 0x6c, 0x5e, 0x6c, + 0x6c, 0xb8, 0x28, 0x7, 0xdd, 0xbd, 0x8, 0x9f, + 0x8, 0x28, 0x6c, 0x28, 0x9f, 0x6c, 0x6c, 0x6c, + 0xb8, 0xb8, 0xa0, 0x9f, 0xdd, 0xcd, 0xdd, 0x8, + 0x8, 0x37, 0xa7, 0x5e, 0x7, 0x7, 0x7, 0x8, + 0x7, 0xba, 0xf3, 0x8, 0xf7, 0xf3, 0xe, 0xa7, + 0xfc, 0x28, 0xa7, 0x6c, 0x6c, 0x7, 0xa7, 0xa7, + 0x8, 0xba, 0xf3, 0x8, 0x28, 0xa7, 0xe, 0x6c, + 0x6c, 0x6c, 0x9f, 0x68, 0x6c, 0xb8, 0xa0, 0x6c, + 0xb6, 0xa0, 0xf3, 0x8, 0x6c, 0x37, 0x37, 0x6c, + 0x6c, 0xa7, 0xa0, 0x8, 0xa7, 0xb7, 0xba, 0x8, + 0x28, 0xa9, 0xf, 0xfc, 0x28, 0x76, 0x5e, 0x9f, + 0x5e, 0x6c, 0x7, 0xb6, 0x5e, 0xa7, 0xb9, 0xf7, + 0x37, 0xa7, 0xa7, 0x37, 0x28, 0x37, 0x6c, 0xb6, + 0x6c, 0x8, 0xba, 0xba, 0xa7, 0x28, 0xf7, 0xf3, + 0xf, 0x76, 0x37, 0x6c, 0x28, 0xe, 0xa0, 0xb8, + 0xa7, 0xa7, 0xb9, 0xba, 0x5f, 0xa7, 0xf7, 0xe, + 0xe, 0x37, 0x6c, 0x76, 0x9c, 0x5f, 0xa0, 0xb7, + 0xa7, 0x6c, 0x8, 0xf3, 0xe, 0x37, 0x5e, 0x6c, + 0x5f, 0x1f, 0x28, 0x28, 0xa7, 0x76, 0x7, 0xb7, + 0xb9, 0xa7, 0x28, 0xe, 0x12, 0xe, 0x6c, 0x28, + 0xe, 0xf0, 0x27, 0x2f, 0xa8, 0x6c, 0x8, 0xc8, + 0xf8, 0x37, 0xa7, 0x9c, 0x27, 0x12, 0x5f, 0x7d, + 0x74, 0x2c, 0x12, 0x2c, 0x50, 0xa0, 0x28, 0x2c, + 0xf8, 0x37, 0x76, 0x74, 0x55, 0x27, 0x55, 0x8f, + 0x9c, 0xa0, 0xe, 0x3e, 0xa1, 0xb7, 0x5f, 0x55, + 0x27, 0x27, 0x5f, 0x8f, 0x9c, 0xfc, 0x12, 0x55, + 0xa8, 0x7, 0xa8, 0x27, 0x11, 0x2c, 0x74, 0x62, + 0x55, 0x27, 0x55, 0x8f, 0x7d, 0xa0, 0x2f, 0x55, + 0xa8, 0xb9, 0xa8, 0x74, 0x2c, 0x12, 0x9c, 0x8f, + 0x76, 0xfc, 0x27, 0x62, 0x82, 0x7, 0xaa, 0x27, + 0x27, 0x50, 0xa6, 0x7e, 0x2f, 0x27, 0x7e, 0x62, + 0x82, 0x82, 0x62, 0x30, 0x8d, 0x5e, 0x9c, 0x46, + 0x30, 0x55, 0x55, 0x62, 0x8d, 0x30, 0x27, 0x62, + 0x8d, 0x79, 0x8f, 0x62, 0x30, 0x9c, 0xb3, 0x9c, + 0xfc, 0x30, 0x55, 0x93, 0x5e, 0x98, 0x98, 0x47, + 0x55, 0x8d, 0x79, 0xab, 0x9c, 0x1f, 0x62, 0x9c, + 0x82, 0x86, 0x7d, + 0xc, 0xa7, 0xc, 0xf0, 0x40, 0xfd, 0x1c, 0x2b, + 0x3b, 0x21, 0x31, 0x7a, 0xb0, 0x6a, 0x83, 0x99, + 0x99, 0x83, 0x6a, 0x5d, 0x71, 0x6b, 0x6a, 0x5d, + 0x59, 0x59, 0x31, 0x2a, 0x2b, 0x70, 0x99, 0x6e, + 0xa, 0x7f, 0x61, 0x58, 0x6f, 0x83, 0x6f, 0x83, + 0xb0, 0xaa, 0x74, 0x83, 0xb0, 0xaa, 0x74, 0x7e, + 0x60, 0x2c, 0x5f, 0x74, 0x74, 0x74, 0x55, 0x3e, + 0xb3, 0xb3, 0xaa, 0x6a, 0x50, 0x2c, 0x55, 0x74, + 0x55, 0x2c, 0xf8, 0x2c, 0xb7, 0xb7, 0xa0, 0xf3, + 0xcd, 0xba, 0x8, 0xc, 0xf7, 0xf3, 0xa7, 0x82, + 0x5e, 0x6c, 0xe, 0x2f, 0x37, 0x7, 0xa7, 0xe, + 0xba, 0xc8, 0xa8, 0x9c, 0x37, 0xe, 0x12, 0x43, + 0x28, 0x6c, 0x5f, 0x12, 0xf7, 0xb7, 0xa8, 0xa7, + 0xf3, 0xf8, 0x5f, 0x28, 0x6c, 0xfc, 0x27, 0xe, + 0x6c, 0xa0, 0x9c, 0xe, 0xf8, 0xbc, 0xa6, 0x28, + 0x8, 0xf0, 0x2c, 0x76, 0x6c, 0x9c, 0x5f, 0x12, + 0xa7, 0xa8, 0xa8, 0xa7, 0x12, 0x50, 0x60, 0xa7, + 0x28, 0x46, 0x12, 0x5f, 0x37, 0x9c, 0x74, 0x2f, + 0x12, 0x74, 0xa9, 0x7, 0x37, 0x2c, 0x2f, 0x28, + 0x82, 0x62, 0x62, 0x12, 0x5f, 0x9c, 0x9c, 0xa0, + 0x2f, 0x60, 0xa6, 0xa8, 0xa7, 0x55, 0x27, 0x46, + 0x8d, 0x62, 0x9c, 0xe, 0x62, 0x74, 0xa7, 0x7, + 0x5f, 0x64, 0x2c, 0xf7, 0x9c, 0x8f, 0x55, 0x30, + 0x74, 0x8f, 0x7d, 0xa7, 0x2f, 0x55, 0xb7, 0xbe, + 0xa8, 0x55, 0x27, 0x2c, 0x74, 0x8f, 0x7d, 0x12, + 0x62, 0x74, 0xa7, 0xa7, 0xaa, 0x6a, 0x2c, 0xc8, + 0xaa, 0x74, 0x30, 0x55, 0x74, 0x8f, 0x82, 0x46, + 0x55, 0x74, 0xa7, 0xb3, 0xb3, 0x6a, 0x27, 0x2c, + 0x74, 0x7d, 0x28, 0x46, 0x62, 0x93, 0x5e, 0x76, + 0x74, 0x55, 0xa7, 0xa8, 0x3e, 0x9c, 0x37, 0x30, + 0x7e, 0x93, 0x37, 0x93, 0x7e, 0x46, 0x76, 0x5f, + 0xb3, 0x3e, 0x27, 0x3e, 0x60, 0x9c, 0x37, 0x62, + 0x7e, 0x9c, 0x82, 0x74, 0x94, 0x55, 0x9c, 0x94, + 0x50, 0xa6, 0x27, 0x55, 0x6a, 0x5f, 0x5f, 0x62, + 0x8f, 0x93, 0x93, 0x94, 0x6a, 0x60, 0x60, 0x91, + 0xa6, 0xa6, 0x2f, 0x7e, 0x7e, 0x9c, 0x93, 0x94, + 0x7e, 0x55, 0x74, 0x94, 0xaa, 0xb7, 0x2f, 0x7e, + 0x74, 0xa4, 0x9c, 0x62, 0x62, 0x5f, 0x93, 0x8f, + 0x7d, 0x5f, 0x74, 0x7e, 0x74, 0xb7, 0xaa, 0x62, + 0x93, 0xa7, 0x62, 0x8f, 0x62, 0x76, 0x93, 0x8f, + 0x8d, 0x28, 0xa8, 0x9c, 0x37, 0xdd, 0xa6, 0x74, + 0x5c, 0x5f, 0x7e, 0x94, 0x93, 0x7d, 0x8f, 0x8f, + 0x76, 0x6c, 0xaa, 0x62, 0x5e, 0x6c, 0x5f, 0x98, + 0x8d, 0x8d, 0x7d, 0x8b, 0x82, 0x82, 0x8f, 0x8b, + 0x82, 0x9c, 0x74, 0x98, 0x8d, 0x8d, 0x62, 0x79, + 0x5e, 0x8d, 0x8b, 0x82, 0x5e, 0x76, 0x76, 0xad, + 0xad, 0x6c, 0x89, 0xab, 0x37, 0x68, 0x79, 0x8d, + 0x43, 0x5e, 0x79, + 0x7e, 0x74, 0x5f, 0xa6, 0xfd, 0x42, 0x7f, 0x2a, + 0x34, 0x21, 0x59, 0x59, 0x63, 0x71, 0x71, 0x67, + 0x48, 0x67, 0x9a, 0x80, 0x80, 0x59, 0x59, 0x6b, + 0x71, 0x71, 0x71, 0x58, 0x59, 0x59, 0x59, 0x48, + 0x3f, 0x70, 0x7f, 0x70, 0x48, 0x54, 0x42, 0x80, + 0x99, 0x85, 0x85, 0x5d, 0x5d, 0x6a, 0x91, 0x81, + 0x6b, 0x5d, 0x5d, 0x6a, 0xb0, 0x90, 0x6f, 0x85, + 0x63, 0x6f, 0x81, 0x6a, 0x71, 0x6b, 0x91, 0x81, + 0x6f, 0xb0, 0x90, 0x97, 0xb4, 0xbf, 0x83, 0x6a, + 0x3e, 0xf7, 0x9c, 0x8f, 0x5f, 0x46, 0x8f, 0x62, + 0xa7, 0xb7, 0x55, 0x7e, 0xc, 0xba, 0x74, 0x8f, + 0x7d, 0x5f, 0x8f, 0x74, 0x76, 0xe, 0x74, 0x74, + 0xa8, 0xba, 0xa6, 0x55, 0x2f, 0xe, 0x55, 0x8b, + 0x76, 0x8d, 0x8b, 0x93, 0x5e, 0xa8, 0xaa, 0x74, + 0xa0, 0xb3, 0xa6, 0x9c, 0x46, 0x74, 0x8f, 0x82, + 0x6c, 0x76, 0x62, 0x28, 0x6c, 0x9c, 0xa6, 0xaa, + 0xa7, 0xaa, 0x60, 0x5f, 0x5f, 0x62, 0x62, 0x82, + 0x82, 0x93, 0x9c, 0xa7, 0x76, 0x74, 0xb3, 0xc, + 0x76, 0x9c, 0x74, 0xa7, 0x76, 0x93, 0x7d, 0x76, + 0x28, 0x7d, 0x9c, 0xc, 0xa7, 0xaa, 0x50, 0xf3, + 0xa7, 0x62, 0x9c, 0xe, 0x7d, 0x74, 0x93, 0x5e, + 0x76, 0x8f, 0xa8, 0xb7, 0xa7, 0x9c, 0xc, 0xa0, + 0x82, 0x93, 0x8d, 0x5e, 0x76, 0x7d, 0x9c, 0xa7, + 0xa7, 0x8f, 0xa8, 0xb7, 0xa8, 0x74, 0xa0, 0xf7, + 0x5f, 0x93, 0x37, 0x82, 0x76, 0x62, 0xa7, 0xa0, + 0xa8, 0x5f, 0xa0, 0xba, 0x2c, 0x46, 0x28, 0x37, + 0x46, 0x93, 0x28, 0x76, 0x89, 0x9c, 0x37, 0xb7, + 0xb3, 0x5f, 0x37, 0xc8, 0x2c, 0x76, 0x28, 0x82, + 0x9c, 0x6c, 0x5e, 0x6c, 0x7, 0x5e, 0x6c, 0x7, + 0xb7, 0x6c, 0x5e, 0x5e, 0xa7, 0x28, 0x5e, 0x76, + 0x76, 0x28, 0x28, 0x28, 0xa0, 0x7, 0x6c, 0xa0, + 0xf3, 0xe, 0x43, 0x1e, 0xe, 0x5e, 0x5e, 0x82, + 0x76, 0x28, 0x28, 0xa7, 0xba, 0xb7, 0x28, 0xa8, + 0xf0, 0xa0, 0x5e, 0x82, 0xa7, 0xe, 0x37, 0x8d, + 0xa7, 0xdd, 0xe, 0x12, 0x2c, 0xc8, 0xa7, 0x2f, + 0x11, 0xe, 0x6c, 0x8d, 0x1e, 0xf7, 0x12, 0x5f, + 0xa7, 0xb7, 0x2c, 0x27, 0xf3, 0xf7, 0x37, 0x8d, + 0xfc, 0xe, 0x28, 0x82, 0x6c, 0x7, 0xa0, 0xe, + 0x28, 0xb8, 0xb8, 0xe, 0xe, 0xe, 0x76, 0x5e, + 0x68, 0xfc, 0xfc, 0x28, 0x5e, 0x8, 0xdd, 0xe, + 0xfc, 0xb8, 0xf3, 0x6c, 0xfc, 0xe, 0x28, 0x5e, + 0x5e, 0x5e, 0xe, 0x1e, 0x6c, 0x7, 0xb9, 0xf3, + 0xfc, 0x28, 0x9f, 0x5e, 0x68, 0xfc, 0x37, 0x86, + 0x5e, 0x86, 0x6c, 0xe, 0x28, 0x6c, 0xb7, 0xb7, + 0xfc, 0xfc, 0x28, 0x5e, 0x68, 0xfc, 0x1e, 0xfc, + 0x5e, 0x68, 0x7, 0xdd, 0xe, 0x37, 0x28, 0xf3, + 0xf7, 0xfc, 0x1e, 0xfc, 0x5e, 0x68, 0x68, 0xfc, + 0x1e, 0x9f, 0x32, + 0x74, 0x9c, 0xa8, 0xa1, 0x6e, 0xea, 0x73, 0x34, + 0x34, 0x7f, 0x71, 0x6b, 0x6b, 0x5d, 0x71, 0x71, + 0x63, 0x63, 0x80, 0x70, 0x3f, 0x85, 0x6b, 0x71, + 0x71, 0x71, 0x71, 0x6b, 0x6b, 0x6b, 0x71, 0x71, + 0x7f, 0x70, 0x3d, 0x70, 0x70, 0x48, 0x48, 0x67, + 0x7f, 0x63, 0x71, 0x71, 0x71, 0x85, 0x5d, 0x5d, + 0x6f, 0x90, 0x85, 0x85, 0x63, 0x90, 0x6f, 0x6b, + 0x90, 0x90, 0x6f, 0x6b, 0x6a, 0x6a, 0x6f, 0x6a, + 0xb0, 0xb4, 0xb4, 0x90, 0xaf, 0xa5, 0x2c, 0x74, + 0x5f, 0xa7, 0xa7, 0x76, 0x76, 0x7, 0xa7, 0xa7, + 0xa0, 0xdd, 0xa8, 0xa7, 0x37, 0x7, 0x37, 0x28, + 0x5e, 0x9f, 0xa7, 0x2f, 0xa7, 0xb7, 0xa6, 0xa7, + 0xc, 0xba, 0xa6, 0x5f, 0x28, 0x37, 0xe, 0x37, + 0x9f, 0x9f, 0x6c, 0x8, 0x8, 0xa0, 0xc8, 0xc, + 0xf7, 0xf3, 0xe, 0x6c, 0x9f, 0x6c, 0x28, 0xfc, + 0x6c, 0x6c, 0xb8, 0x7, 0xf7, 0xf3, 0xba, 0x8, + 0x6c, 0xfc, 0xe, 0x28, 0x6c, 0x76, 0x76, 0xe, + 0xa7, 0x28, 0xb7, 0x7, 0x8, 0xe, 0x2c, 0xa7, + 0x6c, 0x37, 0xfc, 0x28, 0x5e, 0x5e, 0xb6, 0x7, + 0xf7, 0xf7, 0xb7, 0xb7, 0x8, 0xe, 0x12, 0x28, + 0x6c, 0x76, 0x28, 0xe, 0x1e, 0x76, 0xa7, 0xdd, + 0xf7, 0xc, 0xf7, 0xdd, 0x28, 0x68, 0xfc, 0xfc, + 0x5e, 0x5e, 0x68, 0x7, 0xf7, 0x6c, 0x7, 0xbd, + 0xf3, 0xf7, 0xe, 0xa0, 0x28, 0x6c, 0x28, 0xe, + 0xfc, 0x5e, 0x5e, 0x7, 0xf7, 0x24, 0x8, 0xdd, + 0xdd, 0x6c, 0xe, 0xe, 0x28, 0x5e, 0x6c, 0xfc, + 0x12, 0x6c, 0x6c, 0x7, 0xdd, 0xe, 0xe, 0xdd, + 0xb8, 0x8, 0xfc, 0x12, 0x30, 0x6c, 0x5e, 0x9f, + 0xf7, 0xfc, 0x5e, 0x7, 0xb8, 0xb8, 0xfc, 0x5e, + 0x6c, 0x9f, 0x5e, 0xfc, 0x28, 0x5e, 0x9f, 0x9f, + 0x7, 0xf3, 0x28, 0xa7, 0xb7, 0xa7, 0xfc, 0xfc, + 0x1e, 0x6c, 0x9f, 0x28, 0xe, 0xe, 0x9f, 0x6c, + 0xb8, 0xcd, 0xf3, 0x37, 0xa0, 0xf7, 0x6c, 0x46, + 0x1f, 0x5e, 0x9f, 0x5e, 0x5f, 0x12, 0x2f, 0xa7, + 0xa9, 0xba, 0x2c, 0x27, 0x2f, 0xa0, 0x37, 0x46, + 0x27, 0x2f, 0x28, 0x37, 0x28, 0xc8, 0xc8, 0x5f, + 0xa7, 0xdd, 0xa0, 0x12, 0x30, 0xfc, 0x6c, 0x28, + 0x1f, 0x12, 0x37, 0x28, 0x6c, 0xb7, 0xe4, 0x5f, + 0x5e, 0x28, 0x6c, 0x1f, 0x46, 0x37, 0x28, 0x5e, + 0x5e, 0x28, 0x2c, 0xa7, 0x6c, 0x7, 0xf3, 0xe, + 0x82, 0x5e, 0x28, 0x5e, 0x28, 0x1f, 0x76, 0x76, + 0x6c, 0x76, 0x2c, 0xa6, 0x28, 0x76, 0x5f, 0x2f, + 0x46, 0x28, 0x5e, 0x5e, 0x5e, 0x28, 0x46, 0x5e, + 0x68, 0x5e, 0xf3, 0xa6, 0x1f, 0x76, 0x9c, 0x2f, + 0x1f, 0x62, 0x8d, 0x8d, 0x5e, 0x37, 0x62, 0xc, + 0xb6, 0x37, 0x5f, 0xf3, 0x2f, 0x82, 0x76, 0x7d, + 0x89, 0x28, 0x5c, 0x98, 0x68, 0x32, 0x5e, 0x82, + 0xc, 0x28, 0x82, + 0xa9, 0x2f, 0x2c, 0xe3, 0xbf, 0x3, 0xd8, 0x15, + 0x2b, 0xfe, 0x83, 0x6a, 0x6a, 0x31, 0x6a, 0x71, + 0x85, 0x90, 0x3a, 0x67, 0x7f, 0x6f, 0x6a, 0x90, + 0x6f, 0x6a, 0x6a, 0x5d, 0x5d, 0x4a, 0x5d, 0x5d, + 0x90, 0x6e, 0x54, 0x34, 0x34, 0x54, 0x7f, 0x48, + 0x48, 0x31, 0x85, 0x9a, 0x85, 0x41, 0x99, 0x63, + 0x90, 0xaf, 0x83, 0x58, 0x3a, 0x3a, 0x6f, 0x85, + 0x99, 0x3c, 0x4d, 0x71, 0xb0, 0xa1, 0x97, 0x31, + 0x41, 0xbf, 0xb, 0x83, 0x6f, 0x11, 0x60, 0x9c, + 0x5f, 0xc, 0xf8, 0x55, 0xa7, 0xb7, 0xba, 0xe, + 0x12, 0xc, 0xa7, 0x82, 0x37, 0xe, 0xe, 0x6c, + 0x28, 0x7, 0xf3, 0x12, 0xf7, 0xb7, 0xba, 0xe, + 0x12, 0x2c, 0x74, 0xa7, 0x82, 0xfc, 0x12, 0xe, + 0x28, 0x6c, 0xb9, 0xf3, 0x12, 0xf3, 0xba, 0xa7, + 0xa7, 0xe, 0x46, 0x6c, 0x5e, 0x6c, 0xe, 0xf3, + 0x28, 0x7, 0xcd, 0xdd, 0xe, 0xe, 0xa7, 0x37, + 0x5e, 0xfc, 0x2f, 0x37, 0x6c, 0x37, 0xf3, 0xf8, + 0x2c, 0x28, 0xb9, 0xa0, 0xfc, 0x2f, 0x5f, 0x28, + 0x5e, 0x76, 0xe, 0x2f, 0x6c, 0x6c, 0x7, 0xcd, + 0xf3, 0xe, 0xa0, 0x7, 0x28, 0xfc, 0x2f, 0xa7, + 0x76, 0xa7, 0x37, 0x2c, 0x2c, 0x76, 0xa0, 0xcd, + 0xf7, 0x2f, 0xe, 0x6c, 0x5e, 0x37, 0x46, 0x1f, + 0x6c, 0x76, 0x6c, 0xdd, 0xf3, 0xa7, 0xf7, 0xdd, + 0xa7, 0x9c, 0x46, 0x37, 0x76, 0x76, 0x37, 0x1f, + 0xa7, 0x76, 0x6c, 0xb8, 0xba, 0x12, 0x37, 0x8, + 0x37, 0x37, 0x1f, 0x1f, 0xa7, 0xa7, 0x6c, 0x2c, + 0xf8, 0xe, 0x9f, 0xa0, 0xba, 0x12, 0x46, 0x37, + 0x76, 0x37, 0x1f, 0x30, 0x5f, 0x76, 0x9f, 0x9f, + 0xba, 0xc, 0x9f, 0x7, 0xf3, 0xa0, 0x28, 0x82, + 0x5e, 0x5e, 0x5e, 0x28, 0x5f, 0x28, 0xb6, 0x28, + 0xa8, 0xba, 0x37, 0x76, 0x5f, 0x8, 0x5e, 0x46, + 0x76, 0x76, 0x32, 0x8d, 0x74, 0xa8, 0x8, 0x82, + 0xaa, 0xc, 0xf, 0x76, 0x7d, 0x76, 0x28, 0x76, + 0x89, 0x76, 0x28, 0x9c, 0x9c, 0x2c, 0x60, 0x62, + 0x74, 0xa9, 0xe, 0x7e, 0x74, 0x46, 0x46, 0x62, + 0x7e, 0x2f, 0xc, 0x9c, 0xa8, 0xba, 0x50, 0x55, + 0x74, 0x5f, 0xe, 0x62, 0x74, 0x76, 0x9c, 0x9c, + 0x9c, 0xc, 0xc8, 0x5f, 0xa7, 0xa0, 0x2c, 0x74, + 0x82, 0x5e, 0x82, 0x7d, 0x46, 0x76, 0xa7, 0x74, + 0x82, 0x8, 0xa6, 0xaa, 0x46, 0x28, 0x9c, 0x8f, + 0x8d, 0x9f, 0x8d, 0x93, 0x76, 0x76, 0x9c, 0xaa, + 0x46, 0x9c, 0x60, 0x6a, 0x9c, 0x1e, 0x62, 0x8f, + 0x8d, 0x8d, 0x8b, 0x8b, 0x5e, 0x8d, 0x62, 0x9c, + 0x37, 0x82, 0x74, 0x74, 0x93, 0x62, 0x7e, 0x8f, + 0x76, 0x46, 0x8f, 0x74, 0x8d, 0x82, 0x74, 0xb3, + 0xa7, 0x82, 0x7e, 0x74, 0x82, 0x62, 0x8b, 0x8e, + 0x62, 0x1f, 0x7d, 0x8b, 0x89, 0x6c, 0x89, 0x98, + 0xa7, 0x82, 0x1f, + 0xf3, 0x2c, 0x27, 0x60, 0x40, 0x40, 0x4d, 0x1d, + 0x42, 0x9a, 0x90, 0x63, 0x56, 0x9a, 0x9d, 0x6f, + 0x83, 0x90, 0x3a, 0x4d, 0x71, 0x6a, 0x6a, 0x5d, + 0x6b, 0x5d, 0x83, 0x99, 0x99, 0x99, 0x6f, 0x41, + 0x90, 0x83, 0x5d, 0x59, 0x59, 0x63, 0x63, 0x80, + 0x36, 0x54, 0x99, 0x54, 0x54, 0xa, 0xf1, 0x39, + 0x9a, 0x90, 0x9a, 0x31, 0x42, 0x67, 0x99, 0x99, + 0x73, 0x1, 0x48, 0x54, 0x54, 0xc9, 0x7f, 0x36, + 0x26, 0x6f, 0x6f, 0x71, 0x71, 0x6f, 0xb0, 0x83, + 0x83, 0xb0, 0x97, 0x6a, 0x6a, 0x7e, 0x6a, 0x94, + 0x7e, 0x8f, 0x7e, 0x74, 0x8f, 0x74, 0xa6, 0x74, + 0x9c, 0x52, 0x3e, 0xaa, 0x74, 0x55, 0x55, 0x7e, + 0xaa, 0x7e, 0x6a, 0xaa, 0x74, 0x74, 0xb0, 0x60, + 0x9c, 0x74, 0x6a, 0x55, 0x74, 0x62, 0x94, 0x74, + 0x7d, 0x7e, 0x74, 0xa8, 0x76, 0xa7, 0x60, 0xa6, + 0xa7, 0xa7, 0x74, 0x5f, 0x37, 0x7d, 0x74, 0xa7, + 0x28, 0xa7, 0xaa, 0xc8, 0xa0, 0x9c, 0xaa, 0x2c, + 0x5f, 0x74, 0x8f, 0x46, 0x76, 0x62, 0x8f, 0xa7, + 0x28, 0x8f, 0xaa, 0xc8, 0xa8, 0x9c, 0x74, 0xa7, + 0x46, 0x8f, 0x7d, 0x28, 0xa7, 0x7d, 0x74, 0xc, + 0xa8, 0x74, 0x74, 0xf8, 0x2c, 0x74, 0x9c, 0xa7, + 0x98, 0x62, 0x93, 0xa7, 0xa7, 0x74, 0x93, 0xb7, + 0xb7, 0x9c, 0x9c, 0xf7, 0x5f, 0x8f, 0x82, 0x76, + 0x7d, 0x62, 0x93, 0xa7, 0xaa, 0x74, 0x93, 0xa0, + 0xa8, 0x5f, 0x76, 0x28, 0x8f, 0x62, 0x82, 0x5e, + 0x9c, 0x62, 0x82, 0xa7, 0xb3, 0xa9, 0xa7, 0xa8, + 0x60, 0x74, 0x37, 0x9c, 0x62, 0x8f, 0x76, 0x82, + 0x74, 0x9c, 0x76, 0xa7, 0xa6, 0xb3, 0x1e, 0x43, + 0x74, 0x9c, 0x68, 0x37, 0x8f, 0x93, 0x5e, 0x76, + 0x9c, 0xa8, 0x28, 0xa7, 0xaa, 0xa6, 0x6c, 0x5f, + 0x62, 0x9c, 0x82, 0x93, 0x8f, 0x82, 0x28, 0x76, + 0x74, 0xb7, 0xa7, 0x93, 0x74, 0x5f, 0xa7, 0x62, + 0x8f, 0x76, 0x76, 0x8f, 0x74, 0x5f, 0xa7, 0x8f, + 0x74, 0xc8, 0xf3, 0x7e, 0x62, 0x9c, 0x5f, 0x7e, + 0x7e, 0x74, 0x74, 0x94, 0x94, 0x60, 0xa6, 0xaa, + 0x94, 0x2c, 0x50, 0x6a, 0x62, 0x76, 0x46, 0x8f, + 0x62, 0x2f, 0x9c, 0x8f, 0x8f, 0xa8, 0x50, 0xaa, + 0x8f, 0xa7, 0xa8, 0x55, 0x62, 0x37, 0x93, 0x8f, + 0x93, 0xfc, 0x74, 0x8f, 0x93, 0x6c, 0xb3, 0x60, + 0x46, 0x5e, 0x93, 0x62, 0x30, 0x1e, 0x93, 0x98, + 0x79, 0x28, 0x2c, 0xa6, 0xa7, 0x6c, 0x2c, 0x3e, + 0x55, 0x46, 0x8f, 0x8f, 0x46, 0x12, 0x62, 0x8b, + 0x82, 0x5e, 0x5f, 0xa6, 0x37, 0x5e, 0x98, 0x8b, + 0x30, 0x30, 0x8b, 0x8f, 0x98, 0x62, 0x27, 0xaa, + 0xa0, 0x82, 0x74, 0x60, 0xe, 0x8d, 0x8b, 0x79, + 0x28, 0x30, 0x62, 0x98, 0x82, 0x93, 0x89, 0x57, + 0x44, 0xb7, 0x93, 0x7d, 0x5f, 0xfc, 0x89, 0x98, + 0x75, 0x86, 0x5c, + 0x7e, 0x7e, 0x74, 0x7e, 0x6f, 0x41, 0x9, 0x48, + 0x2a, 0x42, 0x58, 0x71, 0x58, 0x71, 0x71, 0x59, + 0x58, 0x63, 0x7f, 0x67, 0x80, 0x71, 0x71, 0x71, + 0x71, 0x80, 0x71, 0x59, 0x71, 0x71, 0x63, 0x48, + 0x63, 0x71, 0x71, 0x85, 0x85, 0x80, 0x7f, 0x7f, + 0x7f, 0x48, 0x7f, 0x23, 0x42, 0x7f, 0x48, 0x34, + 0x1d, 0x39, 0x99, 0x7f, 0x39, 0x23, 0x2a, 0x3b, + 0x2b, 0x54, 0x54, 0x42, 0x42, 0x42, 0x7f, 0x73, + 0x70, 0x99, 0x99, 0x99, 0x9a, 0x99, 0x99, 0x63, + 0x71, 0x85, 0x71, 0x71, 0x5d, 0x5d, 0x81, 0x91, + 0x6b, 0x6a, 0x85, 0x6f, 0x91, 0x91, 0x6f, 0x81, + 0x6a, 0x81, 0x91, 0x91, 0x91, 0x81, 0x6a, 0x6f, + 0x91, 0x6a, 0xb0, 0x9a, 0x6f, 0x91, 0x6b, 0x81, + 0x6a, 0x81, 0x81, 0x91, 0x81, 0x91, 0x83, 0x90, + 0x91, 0x91, 0x83, 0x83, 0x55, 0x62, 0x91, 0x7e, + 0x82, 0x27, 0x91, 0x74, 0x5e, 0x8f, 0x6a, 0x50, + 0xa0, 0x74, 0x60, 0xa6, 0x12, 0x27, 0x74, 0x9c, + 0x76, 0x7e, 0x6a, 0x74, 0xa7, 0x8f, 0xaa, 0xba, + 0x2c, 0x94, 0x74, 0x9c, 0x46, 0x62, 0x8f, 0x9c, + 0x76, 0x74, 0x74, 0xa6, 0xa0, 0x9c, 0x9c, 0xba, + 0x50, 0x55, 0x9c, 0x76, 0x82, 0x62, 0x62, 0x28, + 0x76, 0x8f, 0x9c, 0xba, 0x50, 0xaa, 0x9c, 0xf7, + 0xe, 0x27, 0x8d, 0x68, 0x9f, 0x7d, 0x1f, 0x2c, + 0xaa, 0xaa, 0x9c, 0xa0, 0xc8, 0x60, 0x5e, 0x5e, + 0x28, 0x1f, 0x37, 0x5e, 0x8d, 0x76, 0x28, 0xe, + 0xf8, 0xa8, 0x6c, 0x5e, 0x2c, 0x12, 0x28, 0x5e, + 0x82, 0x76, 0xfc, 0x30, 0x82, 0x9c, 0x9f, 0xa7, + 0xa6, 0xc8, 0x8, 0x6c, 0x5f, 0x2f, 0x1f, 0x5e, + 0x8d, 0x76, 0x5e, 0xfc, 0x5f, 0x7, 0x7, 0x6c, + 0xc, 0xba, 0x6c, 0x5e, 0x76, 0x6c, 0xfc, 0x46, + 0x8d, 0xa7, 0x28, 0x8, 0x12, 0xc, 0x7, 0x6c, + 0x82, 0xa0, 0x1f, 0x76, 0x82, 0x68, 0x5e, 0x46, + 0x5f, 0x6c, 0x6c, 0x76, 0x2f, 0x50, 0xcd, 0x37, + 0x76, 0xa7, 0x46, 0x46, 0x8d, 0x68, 0x6c, 0x30, + 0x27, 0xa0, 0xb7, 0xa8, 0x5f, 0xf8, 0x3e, 0x74, + 0x76, 0x37, 0xf, 0x1e, 0x37, 0x5e, 0x7, 0x28, + 0x30, 0xf8, 0xce, 0xb9, 0xa7, 0x6c, 0xe, 0x46, + 0x5e, 0x9e, 0x5e, 0x37, 0x1f, 0x9f, 0x7, 0xb7, + 0x6c, 0xfc, 0xc, 0xb8, 0x5e, 0x86, 0x75, 0x1e, + 0x68, 0x9f, 0x5e, 0x6c, 0x37, 0x82, 0x6c, 0x7, + 0x6c, 0x28, 0xe, 0xe, 0x5e, 0x5e, 0x32, 0x1f, + 0x8d, 0x5e, 0x76, 0xa7, 0x37, 0x1f, 0xa7, 0x7, + 0x6c, 0x68, 0x5e, 0x1f, 0x5e, 0x9e, 0x5e, 0xa3, + 0x28, 0x8d, 0x68, 0x7, 0xb8, 0xfc, 0x2f, 0xf8, + 0xf7, 0x5e, 0x68, 0x5e, 0x5e, 0x32, 0x68, 0x9f, + 0x5e, 0x37, 0x82, 0x6c, 0xb8, 0x9f, 0xfc, 0x82, + 0x37, 0xfc, 0x5e, 0x32, 0x5e, 0x75, 0x32, 0x68, + 0x68, 0x5e, 0x9f, + 0x55, 0x9c, 0x5f, 0x60, 0x41, 0x54, 0x73, 0xee, + 0xa, 0x7f, 0x31, 0x59, 0x71, 0x81, 0x81, 0x6b, + 0x6b, 0x58, 0x67, 0x42, 0x63, 0x80, 0x7f, 0x85, + 0x71, 0x71, 0x85, 0x58, 0x71, 0x81, 0x6b, 0x71, + 0x59, 0x58, 0x9a, 0x9a, 0x71, 0x99, 0x70, 0x7f, + 0x9a, 0x90, 0x7f, 0x4d, 0x3c, 0x99, 0x99, 0x73, + 0x48, 0x39, 0xfa, 0x73, 0x6e, 0x99, 0xfa, 0xfa, + 0x34, 0x3, 0x7f, 0x3a, 0x36, 0x26, 0x6e, 0x34, + 0x34, 0xfa, 0x73, 0x73, 0x80, 0x9a, 0x80, 0x42, + 0x59, 0x71, 0x71, 0x71, 0x58, 0x63, 0x85, 0x9a, + 0x6b, 0x81, 0x99, 0x71, 0x91, 0x7e, 0x91, 0x81, + 0x27, 0x81, 0x91, 0x91, 0x7e, 0x5d, 0x56, 0xb0, + 0x85, 0x6a, 0x85, 0x99, 0x85, 0x6a, 0x91, 0x91, + 0x4a, 0x5d, 0x81, 0x83, 0x91, 0x91, 0x90, 0xaf, + 0xaa, 0x91, 0x91, 0x7e, 0x55, 0x7e, 0x7e, 0x62, + 0xa7, 0x55, 0x60, 0xba, 0xa8, 0xa8, 0xad, 0x3e, + 0xa8, 0x5f, 0x93, 0xe, 0x2f, 0x30, 0x5f, 0xa0, + 0xa0, 0x9c, 0x55, 0xa6, 0xa8, 0xa7, 0xa9, 0xc, + 0x2f, 0x46, 0x76, 0x82, 0x82, 0x74, 0x74, 0xa0, + 0xb7, 0xa7, 0xa7, 0xc8, 0xba, 0x5f, 0x76, 0x28, + 0xe, 0x5f, 0x76, 0x6c, 0x28, 0xa7, 0xe, 0x28, + 0xb7, 0xb6, 0x7, 0xa0, 0xf3, 0x37, 0x5e, 0x9f, + 0x6c, 0x1e, 0x9f, 0x5e, 0x7, 0x7, 0x6c, 0xe, + 0xba, 0xdd, 0x6c, 0x6c, 0xe, 0x37, 0x5e, 0xa3, + 0x68, 0x5e, 0x32, 0x9f, 0x9f, 0x7, 0x9f, 0x6c, + 0xb7, 0xa0, 0x5e, 0x9f, 0x5e, 0x37, 0x68, 0x86, + 0x9f, 0x6c, 0x6c, 0x6c, 0xb8, 0xbd, 0x6c, 0x6c, + 0x6c, 0xf7, 0x6c, 0x9f, 0x6c, 0x76, 0x28, 0x5e, + 0x68, 0x7, 0x6c, 0x28, 0x8, 0xdd, 0x7, 0x6c, + 0x6c, 0x6c, 0x68, 0x9f, 0x5e, 0x5e, 0x6c, 0x5e, + 0x5e, 0x7, 0xb7, 0xa7, 0x37, 0x6c, 0x6c, 0x9f, + 0x28, 0x5e, 0x68, 0x5e, 0x5e, 0x6c, 0x7, 0x6c, + 0xa7, 0x7, 0xbd, 0xa7, 0x82, 0xa7, 0xa0, 0x76, + 0x5e, 0x68, 0x5e, 0x37, 0x5e, 0x28, 0xb7, 0xf3, + 0x5f, 0xba, 0xba, 0xf3, 0x5f, 0x37, 0x37, 0x82, + 0x76, 0x5e, 0x28, 0x76, 0x76, 0x7, 0xb8, 0xb7, + 0xa7, 0x8, 0xf3, 0x2c, 0x37, 0x32, 0x68, 0x28, + 0x9f, 0x5e, 0x5e, 0xb6, 0x6c, 0x9f, 0xcd, 0xb7, + 0x6c, 0x5e, 0x28, 0x1e, 0x5e, 0x5e, 0x5e, 0x8d, + 0x5e, 0x68, 0x43, 0xb7, 0x7, 0x6c, 0x6c, 0xf7, + 0x5e, 0x9e, 0x8d, 0x76, 0x5e, 0x28, 0x76, 0x76, + 0xa7, 0x76, 0xa8, 0x50, 0xa8, 0x5e, 0x82, 0x5c, + 0x28, 0x37, 0x98, 0x93, 0x8d, 0x28, 0x8d, 0x5e, + 0x5e, 0x5e, 0x46, 0xc, 0xf3, 0xa7, 0x62, 0x9c, + 0xe, 0x37, 0x8d, 0x82, 0x5e, 0x76, 0x46, 0x1e, + 0xb8, 0x6c, 0x7d, 0x5f, 0xf3, 0x46, 0x76, 0x8b, + 0x89, 0x76, 0x1e, 0x46, 0x43, 0x5e, 0x5e, 0x8d, + 0x37, 0x7, 0x8, + 0x2f, 0xa0, 0xb7, 0x2c, 0xb, 0xea, 0x2b, 0x70, + 0x23, 0x39, 0x20, 0x59, 0x71, 0x6a, 0x91, 0x27, + 0x5d, 0x6a, 0x90, 0x6f, 0x6b, 0x6f, 0x99, 0x85, + 0x71, 0x71, 0x90, 0x58, 0x71, 0x6a, 0x6a, 0x5d, + 0x6b, 0x6f, 0x90, 0x5d, 0x6b, 0x85, 0x42, 0x1d, + 0x85, 0x6a, 0x5a, 0x31, 0x58, 0x97, 0xb4, 0xc9, + 0x7f, 0x23, 0x54, 0x54, 0x48, 0x6e, 0x2a, 0x34, + 0x34, 0x54, 0xcb, 0x7f, 0x99, 0xf9, 0xa, 0xeb, + 0x54, 0xf4, 0x23, 0x34, 0x99, 0x90, 0x99, 0x3f, + 0x99, 0xb0, 0x80, 0x9a, 0x31, 0x99, 0x97, 0x90, + 0x6f, 0x6f, 0x71, 0x71, 0x91, 0x91, 0x6a, 0x81, + 0x81, 0x91, 0x85, 0xb0, 0x83, 0x6a, 0x90, 0x80, + 0x83, 0x6f, 0x6f, 0x31, 0x63, 0x6a, 0x6a, 0x90, + 0x6a, 0x6f, 0xb0, 0xb0, 0xb0, 0x6a, 0x85, 0x85, + 0x6a, 0x6a, 0x81, 0x91, 0x6a, 0x91, 0x91, 0xaa, + 0xaa, 0x74, 0x6a, 0xa1, 0xa6, 0xaa, 0x6a, 0x6a, + 0x74, 0xaa, 0x74, 0x9c, 0x5f, 0x5f, 0xaa, 0xba, + 0xba, 0xb3, 0x7e, 0x6a, 0xaa, 0x74, 0x74, 0x8f, + 0x9c, 0x74, 0x94, 0xaa, 0xaa, 0xaa, 0x94, 0xb3, + 0xa1, 0x60, 0x74, 0x55, 0xaa, 0x74, 0x7d, 0x9c, + 0x9c, 0x9c, 0x9c, 0x9c, 0xb7, 0xa8, 0x9c, 0xa7, + 0xc, 0x5f, 0xa7, 0x43, 0x82, 0x76, 0x76, 0x37, + 0x76, 0x76, 0x82, 0x9f, 0xb7, 0xb7, 0x6c, 0x8, + 0xf7, 0x2c, 0xfc, 0x68, 0x5e, 0x76, 0x5e, 0x5e, + 0x6c, 0x7, 0x9f, 0x6c, 0xb7, 0xb9, 0x6c, 0x5e, + 0x37, 0x82, 0x28, 0x6c, 0x76, 0x76, 0x5e, 0x6c, + 0xa7, 0xb7, 0xb6, 0x6c, 0xa8, 0xf8, 0x28, 0x28, + 0x76, 0x9c, 0x5e, 0x28, 0x7d, 0x76, 0x28, 0x76, + 0x76, 0xa8, 0x7, 0x28, 0x5f, 0xa7, 0xfc, 0x76, + 0x93, 0x76, 0x5e, 0x32, 0xa7, 0xa7, 0x7, 0xa7, + 0x9c, 0xb3, 0xf3, 0x9c, 0x74, 0x76, 0x28, 0x46, + 0x62, 0x76, 0x6c, 0xa7, 0x8f, 0xc, 0xb7, 0xc, + 0x8f, 0xaa, 0x2c, 0x9c, 0x62, 0x93, 0x76, 0x74, + 0x8f, 0x82, 0x7, 0xab, 0x8f, 0x2c, 0x50, 0xa6, + 0x7e, 0x55, 0x11, 0x27, 0x62, 0x93, 0x76, 0x7e, + 0x55, 0x30, 0xa7, 0xaa, 0x62, 0xe, 0xf8, 0x60, + 0x93, 0x82, 0x5f, 0x27, 0x30, 0x82, 0x5e, 0x9c, + 0x5f, 0xe, 0xe, 0xb3, 0xa8, 0x6c, 0xe, 0x60, + 0x8d, 0x68, 0x93, 0x62, 0x30, 0x37, 0x93, 0x74, + 0xa7, 0x37, 0x3e, 0x60, 0xa7, 0x5e, 0x37, 0x30, + 0x1e, 0x5e, 0x93, 0x74, 0x30, 0x30, 0x7e, 0xaa, + 0xb3, 0xaa, 0x4a, 0x4a, 0x60, 0x62, 0x8f, 0x94, + 0x27, 0x8f, 0x8f, 0x8f, 0x93, 0x46, 0x62, 0x7d, + 0xa0, 0x76, 0x7e, 0x27, 0x55, 0x46, 0x8f, 0x8f, + 0x30, 0x30, 0x8f, 0x7d, 0x7, 0xa7, 0x55, 0x55, + 0xf3, 0xa7, 0x8f, 0x62, 0x30, 0x62, 0x62, 0x8f, + 0x8f, 0x8d, 0x55, 0x57, 0x98, 0x6c, 0xa7, 0x62, + 0x33, 0xe, 0x7d, + 0x5f, 0x50, 0xf8, 0x2c, 0x40, 0x5a, 0x48, 0x1d, + 0x1c, 0x42, 0x67, 0x58, 0x63, 0x41, 0xaf, 0x6a, + 0x6a, 0x7e, 0x6a, 0x5d, 0x6a, 0x5d, 0x6b, 0x71, + 0x71, 0x85, 0x99, 0x63, 0x71, 0xb0, 0xc9, 0x90, + 0x5d, 0x81, 0x6a, 0x6a, 0x6b, 0x81, 0x6b, 0x71, + 0x59, 0x6f, 0x99, 0x99, 0x5d, 0x97, 0xf4, 0x99, + 0x90, 0x3a, 0x3a, 0x31, 0x31, 0x4d, 0x23, 0x48, + 0x21, 0x2b, 0x70, 0x2a, 0x54, 0x99, 0x7f, 0x73, + 0x39, 0x41, 0x90, 0x80, 0x36, 0x26, 0x48, 0x3d, + 0x70, 0x73, 0x73, 0x73, 0x8a, 0x97, 0x6e, 0x7f, + 0x80, 0x85, 0x71, 0x85, 0x6f, 0x85, 0x85, 0x99, + 0xb0, 0x6f, 0x99, 0x48, 0x99, 0x81, 0x90, 0x66, + 0x99, 0x63, 0x9a, 0x99, 0x6f, 0x63, 0x66, 0x99, + 0x6f, 0x5d, 0x71, 0x99, 0x99, 0x85, 0x6f, 0x6f, + 0x85, 0x4d, 0x9a, 0x9a, 0xb0, 0x6f, 0x6f, 0x9a, + 0xb0, 0x6a, 0x81, 0x6a, 0x5d, 0x6a, 0x81, 0x6a, + 0x6f, 0x5d, 0x5d, 0xb0, 0xb0, 0x83, 0x6a, 0x6f, + 0x83, 0x81, 0x6a, 0x81, 0x6f, 0x71, 0x5d, 0x91, + 0x91, 0xb0, 0x6f, 0x99, 0x99, 0x85, 0x6f, 0x6f, + 0x3a, 0x6b, 0x6b, 0x91, 0x91, 0x81, 0x91, 0x91, + 0xb3, 0xb0, 0x91, 0x6a, 0x83, 0x6a, 0x7e, 0x74, + 0x7e, 0x7e, 0x62, 0x76, 0x74, 0x94, 0x55, 0x2f, + 0xb3, 0xb3, 0x9c, 0x43, 0x12, 0x7e, 0x46, 0x82, + 0x5f, 0x55, 0x12, 0x28, 0xa7, 0xaa, 0xa7, 0xe, + 0x5f, 0x9c, 0x37, 0x28, 0x62, 0x7e, 0x82, 0x5e, + 0x7d, 0x8f, 0x27, 0x9c, 0x74, 0xb3, 0xa8, 0x1e, + 0x62, 0x60, 0x5f, 0x37, 0x8f, 0x55, 0x46, 0x82, + 0x74, 0x9c, 0x5f, 0x2f, 0x8f, 0xaa, 0xb7, 0xa7, + 0x62, 0x55, 0x37, 0x76, 0x8f, 0x8f, 0x30, 0x62, + 0x8f, 0x9c, 0xb7, 0xa8, 0x7e, 0x5f, 0xa0, 0x7d, + 0x62, 0x62, 0x46, 0x8f, 0x8f, 0x8f, 0xa7, 0x60, + 0x8f, 0x9c, 0xb7, 0xa8, 0x55, 0x12, 0xc, 0xa9, + 0x8f, 0x62, 0x12, 0x94, 0x8f, 0x9c, 0x9c, 0x60, + 0x7e, 0x9c, 0xa0, 0x60, 0x7e, 0x62, 0x55, 0x91, + 0x94, 0x62, 0x30, 0x27, 0x94, 0x7d, 0xa8, 0xa6, + 0x6a, 0x30, 0x2f, 0x8f, 0x8b, 0x1f, 0x46, 0x8f, + 0x8b, 0x82, 0x46, 0x55, 0x55, 0x76, 0xa7, 0xb3, + 0xa9, 0x30, 0x93, 0x74, 0x93, 0x68, 0x46, 0x62, + 0x8d, 0x8d, 0x82, 0x74, 0x55, 0x76, 0x82, 0xaa, + 0x5f, 0x1e, 0x46, 0x62, 0x82, 0x68, 0x82, 0x62, + 0x76, 0x82, 0x8b, 0x9c, 0xa8, 0x2f, 0x62, 0x74, + 0x2f, 0x30, 0x62, 0x7e, 0x62, 0x93, 0x8f, 0x62, + 0x62, 0x7e, 0x8f, 0x8f, 0x9c, 0x1f, 0x98, 0x98, + 0x8d, 0x5e, 0x8b, 0x62, 0x46, 0x8d, 0x8f, 0x8b, + 0xa7, 0xe, 0x98, 0x76, 0xa0, 0xfc, 0x46, 0x8d, + 0x68, 0x5e, 0x8d, 0x8d, 0x82, 0x9c, 0x7d, 0x8f, + 0x89, 0xa7, 0xa9, 0x89, 0x43, 0x1e, 0x32, 0x82, + 0x79, 0x75, 0x79, + 0x7e, 0x4a, 0x11, 0x6a, 0x6a, 0x99, 0x2a, 0x21, + 0x48, 0x99, 0x99, 0x56, 0x63, 0x7f, 0x42, 0x58, + 0x81, 0x6f, 0x6f, 0x6b, 0x6b, 0x71, 0x71, 0x71, + 0x71, 0x63, 0x9a, 0x58, 0x71, 0x67, 0x48, 0x59, + 0x71, 0x90, 0x83, 0x71, 0x6b, 0x6b, 0x9a, 0x85, + 0x71, 0x4c, 0x58, 0x58, 0x6b, 0x85, 0x42, 0x59, + 0x6b, 0x6f, 0x99, 0x80, 0x71, 0x58, 0x99, 0x99, + 0x9a, 0x4d, 0x36, 0x67, 0x4d, 0x7f, 0xeb, 0x15, + 0x34, 0x7f, 0x54, 0x54, 0x23, 0x21, 0x34, 0x73, + 0x6e, 0x54, 0x34, 0xee, 0x70, 0x2a, 0x6e, 0xfa, + 0x48, 0x7f, 0x7f, 0x99, 0x73, 0x67, 0x42, 0x6e, + 0x80, 0x71, 0x67, 0x48, 0x67, 0x9a, 0x99, 0x6e, + 0x70, 0x34, 0x73, 0x54, 0x99, 0x56, 0x63, 0x63, + 0x71, 0x81, 0x85, 0x70, 0x42, 0x67, 0x7f, 0x70, + 0x70, 0x70, 0x48, 0x48, 0x99, 0x9a, 0x58, 0x59, + 0x58, 0x81, 0x91, 0x71, 0x56, 0x4d, 0x9a, 0x90, + 0x99, 0x99, 0x71, 0x6f, 0x6f, 0x5d, 0x81, 0x6a, + 0x71, 0x6f, 0x6f, 0x9a, 0x54, 0x67, 0x58, 0x6f, + 0x90, 0x85, 0x6f, 0x31, 0x67, 0x9a, 0x71, 0x6b, + 0x58, 0x71, 0x81, 0x81, 0x90, 0xb0, 0x6f, 0x6f, + 0x9a, 0x85, 0x81, 0x91, 0x81, 0x81, 0x91, 0x94, + 0x8f, 0xaa, 0x74, 0xa7, 0xa9, 0x50, 0xa9, 0x9c, + 0x5f, 0x74, 0x82, 0x28, 0x76, 0x76, 0x76, 0x6c, + 0x37, 0xa8, 0xc, 0x7, 0xa9, 0xa6, 0x8, 0x28, + 0x76, 0x76, 0x5e, 0x5e, 0x5e, 0x76, 0x6c, 0x5e, + 0xa7, 0xb3, 0xb9, 0x37, 0x5f, 0xa8, 0x28, 0x5e, + 0x82, 0x82, 0x5e, 0x68, 0x76, 0x76, 0x8, 0x6c, + 0x82, 0xb7, 0xb7, 0x28, 0x9c, 0xa7, 0xe, 0x76, + 0x76, 0x76, 0x6c, 0x9f, 0x76, 0x37, 0x7, 0x6c, + 0xa7, 0xa8, 0xb7, 0xa7, 0x76, 0x68, 0x5e, 0x82, + 0x82, 0x76, 0x5e, 0xa7, 0x76, 0xa7, 0xba, 0xb7, + 0xa7, 0x6c, 0xf7, 0xa7, 0x76, 0x82, 0x6c, 0x37, + 0x76, 0x6c, 0xa7, 0xa0, 0xa7, 0xa7, 0xba, 0xc, + 0xa7, 0x28, 0x28, 0x9c, 0x76, 0x82, 0x28, 0x5f, + 0xe, 0x37, 0x28, 0xb7, 0xa0, 0x6c, 0xe, 0xf3, + 0xa7, 0x28, 0x9f, 0xfc, 0x28, 0x86, 0x5e, 0x6c, + 0x28, 0xfc, 0x7, 0xb7, 0xa0, 0x6c, 0xf7, 0xfc, + 0x6c, 0x68, 0x68, 0x5e, 0x5e, 0x68, 0x9f, 0x6c, + 0x7, 0x9f, 0x28, 0x7, 0x7, 0x6c, 0x28, 0x28, + 0x5e, 0xa3, 0x68, 0x5e, 0x6c, 0x6c, 0x6c, 0x6c, + 0xb8, 0x8, 0x6c, 0xf7, 0x7, 0x5e, 0x68, 0x28, + 0xfc, 0x6c, 0x82, 0x46, 0xf7, 0x2c, 0xfc, 0xa7, + 0xb7, 0x5f, 0x94, 0x62, 0x6c, 0xa3, 0x9f, 0xa3, + 0xfc, 0x68, 0x68, 0x86, 0x6c, 0xf7, 0xe, 0x28, + 0x6c, 0x5e, 0x68, 0xfc, 0xfc, 0x5e, 0x32, 0xa3, + 0x9f, 0xfc, 0x28, 0xa3, 0xb8, 0xb7, 0xb9, 0xc, + 0x24, 0xfc, 0x1e, 0x75, 0x86, 0xfc, 0x32, 0x68, + 0x68, 0xa2, 0x6c, + 0x89, 0x9c, 0x2c, 0xa6, 0xb0, 0x6e, 0x73, 0x34, + 0xfa, 0xa, 0x5a, 0x9a, 0x58, 0x59, 0x58, 0x6b, + 0x6a, 0x85, 0x85, 0x6a, 0x71, 0x80, 0x99, 0x9a, + 0x6b, 0x85, 0x6f, 0x71, 0x6b, 0x71, 0x85, 0x71, + 0x71, 0x9a, 0x80, 0x63, 0x71, 0x85, 0x9a, 0x71, + 0x81, 0x81, 0x6a, 0x81, 0x6a, 0x6a, 0x6a, 0x6b, + 0x6a, 0x85, 0x99, 0x7f, 0x90, 0x97, 0x7f, 0x9a, + 0x5d, 0x6a, 0x6a, 0x85, 0x58, 0x99, 0x34, 0xf2, + 0x16, 0x3d, 0x2b, 0xf2, 0x34, 0xd8, 0xee, 0x73, + 0xcb, 0x7f, 0x54, 0x73, 0x54, 0x54, 0x2a, 0xeb, + 0x34, 0xfa, 0x2b, 0xeb, 0x70, 0x54, 0x48, 0x7f, + 0x4d, 0x20, 0x67, 0x5a, 0x7f, 0xfd, 0x73, 0xeb, + 0x16, 0x34, 0x21, 0x48, 0x67, 0x85, 0x85, 0x85, + 0x4a, 0x83, 0x90, 0x99, 0x7f, 0x7f, 0x54, 0x34, + 0x3d, 0x3b, 0x15, 0x34, 0x54, 0x67, 0x9a, 0x90, + 0x97, 0x90, 0x85, 0x90, 0x5a, 0x6e, 0x54, 0x70, + 0x99, 0x85, 0x71, 0x56, 0x6a, 0x6a, 0x81, 0x83, + 0xb0, 0x80, 0x99, 0x54, 0x54, 0x7f, 0x85, 0x85, + 0x90, 0x85, 0x85, 0x7f, 0x42, 0x42, 0x3c, 0x90, + 0x97, 0x99, 0x99, 0x63, 0x9a, 0x9a, 0x81, 0x90, + 0x85, 0x71, 0x81, 0x6a, 0x6a, 0x81, 0x6f, 0x6a, + 0xb3, 0x50, 0xb3, 0x37, 0xa7, 0xa8, 0x5f, 0x82, + 0x6c, 0x1e, 0x76, 0x6c, 0x6c, 0x7, 0x7, 0x7, + 0xf7, 0xbe, 0xb7, 0x6c, 0x6c, 0xf7, 0x76, 0x5e, + 0x5e, 0x6c, 0x6c, 0x6c, 0x68, 0x7, 0xdd, 0x28, + 0xf7, 0xf3, 0xdd, 0x6c, 0x6c, 0xfc, 0x28, 0x5e, + 0x5e, 0x76, 0x6c, 0x28, 0x28, 0x7, 0xdd, 0x7, + 0xe, 0xf7, 0x8, 0x6c, 0x37, 0x1f, 0xf, 0xa7, + 0xa7, 0xa7, 0xa7, 0xa8, 0x9c, 0xa7, 0xb9, 0xc, + 0x89, 0x2f, 0x2f, 0x46, 0x9c, 0x76, 0xe, 0xe, + 0x9c, 0xa7, 0xb7, 0xc8, 0x2c, 0xe, 0xc, 0xc, + 0xa7, 0x37, 0x37, 0x82, 0x76, 0x76, 0x37, 0xf3, + 0xa8, 0xa7, 0xc, 0x50, 0x2c, 0x12, 0x5f, 0x74, + 0x8f, 0x7d, 0x2f, 0x9c, 0x9c, 0x37, 0x8, 0x50, + 0x50, 0xe, 0x6c, 0x2c, 0xe, 0xe, 0x27, 0x46, + 0x82, 0x5e, 0xfc, 0x12, 0xa7, 0x9f, 0x9f, 0xb9, + 0xf8, 0x12, 0x28, 0x5f, 0xa7, 0xfc, 0x1f, 0x1f, + 0x5e, 0x68, 0x5e, 0x46, 0xf3, 0x28, 0x68, 0xa7, + 0xf3, 0xe, 0x1f, 0x28, 0x43, 0x9f, 0xfc, 0x1f, + 0x37, 0x68, 0x8d, 0xa7, 0xf3, 0xe, 0x82, 0x9c, + 0x37, 0xfc, 0x46, 0x8d, 0x5e, 0x5e, 0x82, 0x62, + 0x27, 0xa8, 0x74, 0x74, 0x50, 0x2c, 0x27, 0x8d, + 0x68, 0x82, 0x30, 0x62, 0x68, 0x68, 0x79, 0x28, + 0xfc, 0x12, 0x9c, 0x79, 0xb6, 0xf3, 0x62, 0x46, + 0x8d, 0x28, 0x46, 0x98, 0x30, 0x8d, 0x98, 0x79, + 0xfc, 0xc8, 0x5f, 0x82, 0x37, 0xa8, 0xa9, 0x55, + 0x4b, 0x82, 0x82, 0x93, 0x79, 0x79, 0x89, 0x89, + 0x79, 0x32, 0x5f, + 0xa7, 0x6c, 0xba, 0xa1, 0xe5, 0xe6, 0xfa, 0x34, + 0xfa, 0xfa, 0x26, 0x4a, 0x5d, 0x6f, 0x4a, 0x5d, + 0x5d, 0x6a, 0x6f, 0x6f, 0x6a, 0x56, 0x63, 0x5d, + 0x6a, 0x97, 0x6f, 0x6f, 0x6b, 0x5d, 0x6a, 0x5d, + 0x6a, 0x5b, 0x90, 0x85, 0x5d, 0x85, 0x63, 0x71, + 0x81, 0x5d, 0x6a, 0x5d, 0x6a, 0x6a, 0x6a, 0x83, + 0x6a, 0x4a, 0x90, 0x63, 0x90, 0x99, 0x39, 0x63, + 0x5d, 0x83, 0x6f, 0x90, 0x20, 0x23, 0xf2, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x34, 0xf2, 0x3d, 0x15, + 0xeb, 0xa, 0x73, 0x54, 0xea, 0x6e, 0xfa, 0x48, + 0x48, 0x34, 0x3b, 0x3b, 0x34, 0xeb, 0x34, 0x15, + 0xf1, 0xf9, 0xcb, 0xe6, 0xe6, 0xcb, 0xeb, 0x34, + 0x34, 0x48, 0x48, 0x67, 0x90, 0x5d, 0x99, 0x7f, + 0xfd, 0x20, 0x7f, 0x3, 0x3, 0x3, 0x7f, 0x54, + 0x7f, 0x54, 0x3d, 0x16, 0x15, 0xfa, 0x6e, 0xa, + 0x5a, 0xfe, 0x67, 0x99, 0x3, 0x6e, 0x36, 0x2e, + 0x4d, 0x5d, 0x6f, 0x99, 0x6f, 0x66, 0x6f, 0xb0, + 0x5a, 0xe6, 0x34, 0xfa, 0xea, 0x99, 0x90, 0x31, + 0x3a, 0x58, 0x9a, 0x48, 0x54, 0xfa, 0xfa, 0xea, + 0xcb, 0x6e, 0x23, 0x36, 0x4d, 0x71, 0x85, 0x85, + 0x67, 0x9a, 0x9a, 0xb0, 0x6e, 0x99, 0x99, 0x90, + 0x6f, 0xb0, 0x6a, 0x55, 0x60, 0x55, 0x7e, 0x74, + 0x93, 0x60, 0x2c, 0xa7, 0xa7, 0xa6, 0xc8, 0x2c, + 0xa7, 0xa8, 0xc, 0xa7, 0xe, 0x30, 0xa7, 0x82, + 0x9c, 0x74, 0x2f, 0x37, 0xa7, 0xad, 0xa0, 0xe, + 0x30, 0x89, 0x9c, 0x37, 0x30, 0x27, 0x37, 0x28, + 0x76, 0x76, 0xf3, 0x2c, 0x9c, 0x9c, 0x8, 0x28, + 0x2f, 0x46, 0x6c, 0x76, 0x93, 0x74, 0x3e, 0xaa, + 0x94, 0x7e, 0xb3, 0x60, 0x7e, 0x7e, 0xaa, 0x91, + 0x7e, 0x7e, 0x7e, 0x94, 0x94, 0x94, 0x60, 0x83, + 0xac, 0x7e, 0x60, 0x50, 0x6a, 0x74, 0x9c, 0x74, + 0x8f, 0x62, 0x93, 0x74, 0x74, 0x74, 0xaa, 0xb0, + 0x83, 0x6a, 0xaa, 0x6a, 0x6a, 0x91, 0x7e, 0x94, + 0x94, 0x7e, 0x91, 0x6a, 0x6a, 0x74, 0xaa, 0x40, + 0x83, 0x74, 0x82, 0x74, 0x62, 0x46, 0x30, 0x74, + 0x8f, 0x76, 0x76, 0x60, 0x2c, 0x28, 0x1e, 0x5f, + 0xaa, 0x46, 0x89, 0x8f, 0x62, 0x82, 0x7d, 0x62, + 0x9c, 0x28, 0x82, 0x74, 0x60, 0xa7, 0x93, 0x7d, + 0x7d, 0x5e, 0x98, 0x7d, 0x82, 0x32, 0x46, 0x62, + 0x5f, 0x28, 0x46, 0x62, 0xb3, 0x5f, 0x93, 0x8f, + 0x8d, 0x8d, 0x46, 0x62, 0x82, 0x5e, 0x8f, 0x7e, + 0xa6, 0x40, 0x6a, 0x7e, 0x55, 0x74, 0x62, 0x62, + 0x8d, 0x8d, 0x8f, 0x8f, 0x8d, 0x6c, 0x93, 0x8b, + 0xa7, 0xb3, 0x74, 0x8f, 0x82, 0x82, 0x62, 0x62, + 0x8d, 0x98, 0x8f, 0x62, 0x76, 0x9c, 0x74, 0x7d, + 0x76, 0xa8, 0x74, 0x8f, 0x8d, 0x62, 0x7d, 0x94, + 0x62, 0x8d, 0x62, 0x8f, 0x98, 0x75, 0x5f, 0xab, + 0x8d, 0x5e, 0x89, + 0xe, 0xc, 0xf3, 0xe4, 0x40, 0xfd, 0x7f, 0x54, + 0x3b, 0x3f, 0x42, 0xfe, 0x6e, 0x7f, 0x26, 0x26, + 0x3a, 0x6a, 0x6a, 0x5b, 0x81, 0x6b, 0x71, 0x81, + 0x6b, 0x63, 0x31, 0x63, 0x6f, 0x5a, 0x41, 0x90, + 0x9d, 0x6f, 0x5d, 0x6b, 0x6b, 0x81, 0x81, 0x6b, + 0x6b, 0x90, 0x90, 0x99, 0x31, 0x51, 0x90, 0x9d, + 0x6f, 0x58, 0x5d, 0x71, 0x71, 0x71, 0x59, 0x58, + 0x63, 0x99, 0x6e, 0x54, 0x54, 0x15, 0x16, 0x16, + 0xf2, 0x16, 0x14, 0x16, 0x3d, 0x34, 0x3b, 0x3b, + 0x3d, 0x34, 0x21, 0x2b, 0x2a, 0x2a, 0x34, 0x59, + 0x63, 0x63, 0x4d, 0x4d, 0x7f, 0x48, 0x3d, 0x3d, + 0x16, 0xeb, 0xeb, 0xf2, 0xde, 0xde, 0x15, 0x48, + 0x9a, 0x80, 0x67, 0x67, 0x9a, 0x90, 0x67, 0x4d, + 0x67, 0x9a, 0x26, 0x7f, 0x99, 0x66, 0x54, 0x48, + 0x99, 0x99, 0xf2, 0x3d, 0x3d, 0x34, 0x15, 0x15, + 0x2a, 0x2a, 0x2a, 0x48, 0x7f, 0x7f, 0x7f, 0x59, + 0x63, 0x85, 0x85, 0x71, 0x9a, 0x99, 0x80, 0x39, + 0x54, 0x2a, 0x34, 0x3d, 0x34, 0x54, 0x99, 0x67, + 0x67, 0x99, 0x99, 0x70, 0x34, 0x15, 0x3d, 0xf2, + 0xf2, 0xeb, 0xfa, 0x34, 0x70, 0x7f, 0x7f, 0x99, + 0x42, 0x34, 0x54, 0x42, 0x1d, 0x54, 0x42, 0x2a, + 0x99, 0x85, 0x6a, 0x95, 0x81, 0x81, 0x83, 0x6f, + 0x6a, 0x83, 0x83, 0x6a, 0x7e, 0x7e, 0x94, 0x74, + 0x8f, 0x7e, 0x74, 0x9c, 0x94, 0x91, 0xaa, 0xaa, + 0x94, 0x7e, 0x60, 0x5f, 0x62, 0x8f, 0x62, 0x93, + 0x8f, 0x8f, 0x9c, 0xa7, 0x94, 0x7e, 0xa8, 0xa8, + 0x74, 0x8f, 0x9c, 0x76, 0x62, 0x93, 0x76, 0x76, + 0x62, 0x94, 0xa7, 0xb3, 0xaa, 0x91, 0x83, 0x90, + 0x91, 0x91, 0x91, 0x81, 0x6b, 0x91, 0x81, 0x91, + 0x91, 0x81, 0x81, 0xb0, 0x6f, 0x91, 0x6a, 0x90, + 0x81, 0x81, 0x6a, 0x95, 0x91, 0x94, 0x8f, 0x91, + 0x91, 0x91, 0x94, 0xb0, 0x90, 0x6a, 0x91, 0x6a, + 0x95, 0x91, 0x81, 0x6a, 0x81, 0x91, 0x91, 0x6f, + 0xb0, 0x6f, 0x6f, 0xb0, 0x97, 0x4a, 0x7e, 0x91, + 0x7e, 0x93, 0x46, 0x7e, 0x94, 0x76, 0x82, 0xaa, + 0xa6, 0xa0, 0x76, 0x74, 0x55, 0xa7, 0x46, 0x8f, + 0x62, 0x82, 0x82, 0x55, 0x74, 0xa7, 0x76, 0x8f, + 0xa6, 0xc, 0x46, 0x8f, 0x93, 0x82, 0x46, 0x62, + 0x98, 0x76, 0x82, 0x8f, 0x5f, 0xa7, 0x93, 0x7d, + 0xa8, 0xe, 0x30, 0x62, 0x98, 0x5e, 0x8d, 0x62, + 0x46, 0x6c, 0x93, 0x93, 0xa0, 0xb7, 0x9c, 0x8f, + 0x74, 0x60, 0x4a, 0x7e, 0x62, 0x8d, 0x8f, 0x8b, + 0xfc, 0xa7, 0x89, 0x98, 0x28, 0xf3, 0x12, 0x8d, + 0x5e, 0x1e, 0x93, 0x62, 0x28, 0x76, 0x93, 0x93, + 0x37, 0x2c, 0xaa, 0x7d, 0x82, 0xa0, 0x27, 0x46, + 0x5e, 0x79, 0x98, 0x98, 0x12, 0x9c, 0x9c, 0xad, + 0x89, 0x6c, 0xc, 0x52, 0x82, 0x32, 0x8d, 0x5c, + 0x38, 0x43, 0x79, + 0x8f, 0x74, 0xa7, 0x52, 0x6f, 0x90, 0x7f, 0x54, + 0x48, 0x42, 0x7f, 0x39, 0x48, 0x54, 0x67, 0x23, + 0x48, 0x56, 0x81, 0x6b, 0x71, 0x6b, 0x81, 0x71, + 0x85, 0x6b, 0x71, 0x85, 0x71, 0x59, 0x58, 0x6b, + 0x9a, 0x80, 0x71, 0x71, 0x6f, 0x6f, 0x6a, 0x85, + 0x9a, 0x63, 0x6b, 0x6b, 0x63, 0x63, 0x6b, 0x71, + 0x6f, 0x80, 0x9a, 0x71, 0x71, 0x71, 0x71, 0x9a, + 0x9a, 0x63, 0x59, 0x59, 0x59, 0x3f, 0x3b, 0x16, + 0x16, 0x16, 0x3b, 0x16, 0x16, 0x34, 0x67, 0x67, + 0x80, 0x71, 0x59, 0x58, 0x63, 0x42, 0x1d, 0x63, + 0x9a, 0x54, 0x99, 0x7f, 0x73, 0x34, 0xf2, 0x70, + 0xfa, 0x34, 0x3d, 0x3b, 0x3b, 0x15, 0x15, 0x42, + 0x99, 0x6e, 0x99, 0x99, 0x97, 0x41, 0x58, 0x6b, + 0x81, 0x81, 0x58, 0x59, 0x71, 0x67, 0x70, 0x1d, + 0x70, 0xeb, 0x3d, 0x16, 0x73, 0x73, 0x34, 0x48, + 0x80, 0x63, 0x7f, 0x3b, 0x3b, 0x3b, 0x34, 0x9, + 0x99, 0x97, 0x99, 0x6b, 0x6b, 0x6f, 0x71, 0x31, + 0x36, 0x48, 0x3d, 0x15, 0x3f, 0x1d, 0x48, 0x54, + 0x7f, 0x7f, 0x7f, 0x39, 0x7f, 0x34, 0x15, 0x16, + 0x16, 0x3d, 0x15, 0xf2, 0x34, 0x16, 0x3d, 0x16, + 0xee, 0xee, 0x15, 0x70, 0x48, 0x42, 0x7f, 0x70, + 0x1d, 0x36, 0x99, 0x99, 0x85, 0xb0, 0x7f, 0x99, + 0x85, 0x81, 0x81, 0x6a, 0x6a, 0x6a, 0x74, 0xa7, + 0x74, 0x6a, 0x40, 0xb3, 0x74, 0x7e, 0x83, 0x11, + 0x7e, 0x7e, 0x9c, 0x76, 0x74, 0x55, 0xa7, 0x7, + 0x9c, 0x74, 0x50, 0x50, 0x5f, 0x9c, 0xa7, 0xe, + 0x30, 0x7d, 0x6c, 0x28, 0x76, 0x5f, 0xa7, 0xb7, + 0x9c, 0x9c, 0xba, 0x50, 0x6a, 0x94, 0x94, 0x7e, + 0x6a, 0x6b, 0x81, 0x81, 0x6f, 0x6f, 0x63, 0x99, + 0x85, 0x6f, 0x6f, 0x63, 0x85, 0x5d, 0x91, 0x81, + 0x85, 0x58, 0x5d, 0x6f, 0x6a, 0x91, 0xb3, 0xaf, + 0xb0, 0x91, 0x9c, 0x7e, 0x6f, 0x6a, 0x7e, 0x91, + 0x6a, 0x4a, 0x58, 0x90, 0xb0, 0x85, 0x5d, 0x99, + 0x67, 0x99, 0x6a, 0x6f, 0x97, 0x1b, 0x4a, 0x5f, + 0x5f, 0x37, 0xe, 0x11, 0xba, 0xf7, 0x6c, 0x37, + 0x27, 0x1f, 0x28, 0x68, 0x5e, 0xfc, 0x1e, 0x76, + 0xa7, 0x8, 0xa7, 0x12, 0xf8, 0xa0, 0x5e, 0x8d, + 0xfc, 0x1f, 0x8d, 0x5e, 0x5e, 0x28, 0x1e, 0x46, + 0xf7, 0xb8, 0x9f, 0xfc, 0x2f, 0x1e, 0x9f, 0x5e, + 0x5e, 0x1f, 0x1f, 0x8d, 0xa3, 0x9f, 0x5e, 0x1f, + 0xe, 0xb7, 0x6c, 0x5e, 0x28, 0x1f, 0x5f, 0x76, + 0x76, 0x37, 0x27, 0x62, 0x28, 0x8, 0x7, 0x37, + 0x30, 0xf7, 0x5e, 0x68, 0x9e, 0xfc, 0x8d, 0x5e, + 0x68, 0xa3, 0x28, 0x46, 0x37, 0xb8, 0xb7, 0x6c, + 0xfc, 0x46, 0x28, 0x86, 0xa3, 0x68, 0x1f, 0x82, + 0x68, 0xa3, 0x6c, 0xe, 0x1f, 0x2c, 0x2c, 0xa6, + 0xc, 0x28, 0x1e, 0x46, 0x75, 0x68, 0x68, 0x43, + 0x79, 0x68, 0x5e, + 0x46, 0x5f, 0x2c, 0x2c, 0xb0, 0xb4, 0x3, 0xe6, + 0x73, 0x7f, 0x90, 0x41, 0x54, 0x48, 0x58, 0x5d, + 0x59, 0x5d, 0x6a, 0x6a, 0x99, 0x85, 0x81, 0x9a, + 0x9a, 0x71, 0x91, 0x81, 0x81, 0x91, 0x81, 0x81, + 0x6b, 0x58, 0x71, 0x85, 0x99, 0x90, 0x5d, 0x6f, + 0x90, 0x63, 0x5d, 0x81, 0x6a, 0x6a, 0x5d, 0x6b, + 0x63, 0x9a, 0x31, 0x9a, 0x80, 0x9a, 0x71, 0x71, + 0x71, 0x6b, 0x6b, 0x6b, 0x71, 0x99, 0x3f, 0x3b, + 0x18, 0x3d, 0x3d, 0x16, 0x3d, 0xf2, 0x54, 0x90, + 0x83, 0x6a, 0x6b, 0x6b, 0x6a, 0x5d, 0x85, 0x85, + 0x67, 0x54, 0x70, 0x54, 0xee, 0x3d, 0x15, 0x73, + 0xcb, 0x73, 0x34, 0x23, 0x39, 0x73, 0x34, 0x7f, + 0x39, 0x34, 0x3f, 0x9a, 0x83, 0x41, 0x90, 0x5d, + 0x6a, 0x91, 0x81, 0x6a, 0x6a, 0x41, 0x67, 0x67, + 0x54, 0x70, 0x3b, 0x3f, 0x48, 0x73, 0xeb, 0x54, + 0x97, 0xaf, 0x99, 0x54, 0x7f, 0x54, 0x48, 0x80, + 0x6f, 0x41, 0x41, 0x6f, 0x6a, 0x6a, 0x9a, 0x31, + 0x4d, 0x99, 0x6e, 0x48, 0x1d, 0x99, 0xfd, 0x39, + 0x9, 0x9, 0xf1, 0x6e, 0x6e, 0x54, 0xf2, 0x3d, + 0x16, 0xf2, 0xf2, 0x3d, 0xee, 0x16, 0x14, 0x16, + 0x16, 0x16, 0x16, 0x15, 0xeb, 0xee, 0x73, 0xeb, + 0x34, 0x70, 0x48, 0x99, 0x9a, 0x80, 0x54, 0x48, + 0x67, 0x85, 0x83, 0x6f, 0x58, 0x6a, 0xb0, 0xb3, + 0xb3, 0x83, 0x40, 0x50, 0x60, 0x6a, 0x6a, 0x27, + 0x5d, 0x91, 0x74, 0xa8, 0x55, 0x60, 0x2c, 0xba, + 0xaa, 0x74, 0x55, 0xaa, 0x46, 0x93, 0x43, 0x5f, + 0x55, 0x46, 0x6c, 0x7, 0xa8, 0x9c, 0x2c, 0xb7, + 0xa8, 0x74, 0x7d, 0x55, 0x91, 0x91, 0x91, 0x6f, + 0x63, 0x31, 0x99, 0x90, 0x90, 0x80, 0x36, 0x23, + 0x80, 0x71, 0x5d, 0x31, 0x42, 0x63, 0x85, 0x90, + 0x99, 0x80, 0x99, 0x99, 0x90, 0x83, 0x91, 0x5d, + 0x81, 0x6a, 0x7e, 0x6a, 0x71, 0x6f, 0x6a, 0x90, + 0x99, 0x90, 0x6f, 0x99, 0x6e, 0x90, 0x81, 0x63, + 0x4d, 0x63, 0x3a, 0x63, 0x39, 0x7f, 0x1b, 0x60, + 0x50, 0x2c, 0x2f, 0x74, 0x2f, 0x37, 0x5e, 0x76, + 0x76, 0x82, 0x5e, 0x76, 0x76, 0x8, 0xa7, 0x37, + 0xc, 0xf3, 0x28, 0x46, 0x46, 0x68, 0x5e, 0x37, + 0x82, 0x28, 0x82, 0x46, 0x37, 0x7, 0x37, 0x46, + 0x37, 0xf7, 0x37, 0x98, 0x8d, 0x5e, 0x8d, 0x8d, + 0x82, 0x5e, 0x76, 0x76, 0x28, 0xb8, 0xc, 0x46, + 0x82, 0xe, 0x93, 0x93, 0x82, 0x5e, 0x93, 0x74, + 0x5f, 0xa0, 0xaa, 0x60, 0x5f, 0xdd, 0x2c, 0x79, + 0x5e, 0x68, 0x82, 0x5e, 0x68, 0x9e, 0x8d, 0x8d, + 0x5e, 0x28, 0xa8, 0x9c, 0x82, 0xe, 0x60, 0x28, + 0x5e, 0x5e, 0x93, 0x82, 0x5e, 0x5e, 0x7d, 0x82, + 0x28, 0xa7, 0x2c, 0xa8, 0x93, 0x62, 0x7d, 0x64, + 0x55, 0x82, 0x89, 0x8b, 0x8d, 0x28, 0x8d, 0x89, + 0xa7, 0x32, 0x76, + 0x6c, 0xfc, 0xf8, 0xcc, 0xcc, 0xbf, 0xe3, 0xe6, + 0xeb, 0x9, 0xb, 0x41, 0x26, 0x48, 0x90, 0x3e, + 0x83, 0x94, 0x6a, 0x35, 0x58, 0x5d, 0x7e, 0x6a, + 0x99, 0x90, 0x6a, 0x6a, 0x6a, 0x6a, 0x55, 0x6a, + 0x6a, 0x91, 0x6a, 0x6f, 0x80, 0x63, 0x6a, 0x6a, + 0x99, 0x99, 0x81, 0x6a, 0x6a, 0x6a, 0x6a, 0x6f, + 0x90, 0x90, 0x6a, 0x58, 0x4d, 0x63, 0x6b, 0x71, + 0x71, 0x5d, 0x6b, 0x81, 0x90, 0x99, 0x42, 0x3b, + 0x17, 0x16, 0x3b, 0x3d, 0x16, 0x3d, 0x3d, 0x99, + 0xb4, 0x41, 0x90, 0x6a, 0x6a, 0xb0, 0x6a, 0x4a, + 0x4d, 0x99, 0x36, 0x42, 0x3f, 0x3d, 0x16, 0x3d, + 0xd8, 0xe1, 0x2a, 0xfe, 0xcb, 0xcb, 0x99, 0x90, + 0x3a, 0x31, 0x4d, 0x58, 0x5d, 0xf9, 0x7f, 0x5d, + 0x6a, 0x5b, 0x6a, 0x7e, 0x5b, 0x83, 0x5d, 0x5d, + 0x58, 0x4d, 0x42, 0x67, 0x39, 0x34, 0x3d, 0xfa, + 0x3, 0xcb, 0x3, 0x5a, 0x58, 0x20, 0x6f, 0x5d, + 0x65, 0x6a, 0x63, 0x71, 0x6a, 0x66, 0x7f, 0x9a, + 0x56, 0x99, 0x99, 0x90, 0x5d, 0x3a, 0x6f, 0x4d, + 0x3c, 0x67, 0x70, 0x15, 0x15, 0xf2, 0xf2, 0x16, + 0xf5, 0xf2, 0x16, 0x16, 0x16, 0x16, 0xff, 0x16, + 0x3d, 0x3d, 0x3d, 0xee, 0x3d, 0x3d, 0xf2, 0x16, + 0x3d, 0xf2, 0x15, 0x48, 0x36, 0x67, 0x23, 0x34, + 0x42, 0x80, 0x99, 0x54, 0x9a, 0x6f, 0x97, 0xb4, + 0x83, 0x6a, 0x83, 0x5d, 0x6a, 0x6a, 0x5d, 0x5d, + 0x6a, 0x6b, 0x85, 0xb0, 0x6f, 0x91, 0x6a, 0x83, + 0x6a, 0x91, 0x91, 0x94, 0x94, 0x7e, 0x7e, 0xaa, + 0xaa, 0x94, 0xaa, 0xb0, 0x78, 0x91, 0x91, 0x6a, + 0x6a, 0x91, 0x91, 0x91, 0x71, 0x81, 0x6f, 0x90, + 0x99, 0x56, 0x54, 0x73, 0x73, 0x23, 0x42, 0x1c, + 0x42, 0x4d, 0x63, 0x9a, 0x67, 0x42, 0x67, 0x54, + 0x73, 0x7f, 0x80, 0x73, 0x54, 0x9a, 0x71, 0x5d, + 0x6f, 0x6f, 0x6f, 0x85, 0x99, 0x80, 0x9a, 0x99, + 0x54, 0x99, 0x9a, 0x9a, 0x54, 0x7f, 0x9a, 0x85, + 0x99, 0x54, 0x42, 0x7f, 0x2a, 0x7f, 0x9a, 0x31, + 0x3a, 0x6a, 0x7e, 0x7e, 0x94, 0x46, 0x46, 0x62, + 0x8f, 0x46, 0x82, 0x55, 0x2f, 0xb7, 0x5f, 0x8f, + 0x55, 0x30, 0x46, 0x8f, 0x8f, 0x1e, 0x12, 0x8f, + 0x9c, 0xa7, 0x9c, 0x62, 0x3e, 0xf3, 0x5f, 0x8f, + 0x46, 0x30, 0x93, 0x8f, 0x8b, 0x82, 0x46, 0x62, + 0x9c, 0x7, 0xa8, 0x62, 0x55, 0x2c, 0x62, 0x8f, + 0x8f, 0x46, 0x7e, 0x8f, 0x82, 0x76, 0xaa, 0x7e, + 0x27, 0x50, 0xb0, 0x6a, 0x55, 0x27, 0x62, 0x8f, + 0x8d, 0x68, 0x46, 0x62, 0x68, 0x68, 0x9c, 0x7d, + 0x30, 0x2f, 0x6a, 0x74, 0x8f, 0x62, 0x27, 0x62, + 0x5e, 0x8d, 0x7d, 0x55, 0x46, 0x93, 0xaa, 0xaa, + 0x1f, 0x12, 0x7e, 0x8f, 0x76, 0x8f, 0x62, 0x47, + 0x47, 0x7d, 0x8b, 0x8f, 0x89, 0x38, 0x62, 0x74, + 0x89, 0x32, 0x5c, + 0xb7, 0xa7, 0xe, 0xf8, 0x50, 0x3e, 0x40, 0x6e, + 0x34, 0x48, 0x39, 0x6e, 0x6e, 0x34, 0x2a, 0x7f, + 0x99, 0x6a, 0x6a, 0x6a, 0x81, 0x6a, 0x6a, 0x6a, + 0x58, 0x71, 0x58, 0x9d, 0x99, 0xb0, 0x6a, 0x6f, + 0x6f, 0x6a, 0x5b, 0x5d, 0x71, 0x5d, 0x95, 0x5d, + 0x66, 0x9a, 0x6a, 0x6f, 0x88, 0x90, 0x5d, 0x6a, + 0x83, 0x6f, 0x6b, 0x71, 0x71, 0x71, 0x71, 0x71, + 0x9a, 0x80, 0x71, 0x9a, 0x54, 0x73, 0x73, 0x3f, + 0x3b, 0x3d, 0x3d, 0x3f, 0x3b, 0x3b, 0x3f, 0x15, + 0x73, 0x73, 0x7f, 0x6f, 0xaf, 0x83, 0x6f, 0x6f, + 0x6f, 0x6f, 0x85, 0x31, 0x48, 0x3d, 0x17, 0x3d, + 0xf2, 0x3d, 0x3d, 0x73, 0xf1, 0xa, 0x7f, 0x63, + 0xb0, 0x6f, 0x6b, 0x6b, 0x6a, 0x99, 0x80, 0x85, + 0x6f, 0x97, 0x6f, 0x6b, 0x6a, 0x6f, 0x6f, 0x81, + 0x5d, 0x6b, 0x6b, 0x71, 0x63, 0x42, 0x1d, 0x3f, + 0x42, 0x2a, 0x48, 0x99, 0x83, 0x90, 0x6f, 0x81, + 0x7e, 0x6a, 0x90, 0x85, 0x31, 0x4d, 0x7f, 0x4d, + 0x85, 0x90, 0x99, 0x58, 0x6a, 0x6f, 0x6f, 0x3a, + 0x85, 0x63, 0x48, 0x7f, 0x1d, 0x3b, 0x3d, 0x15, + 0x3d, 0x3d, 0x16, 0x14, 0x16, 0x16, 0x16, 0x14, + 0x16, 0x16, 0xf2, 0x3d, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0xf2, 0x34, 0x48, 0x34, 0xf2, + 0x2b, 0x34, 0x2b, 0x3b, 0x80, 0x85, 0x99, 0x39, + 0x85, 0x6f, 0x99, 0x99, 0x7f, 0x7f, 0x99, 0xa, + 0x99, 0x4d, 0x36, 0x67, 0x71, 0x71, 0x81, 0x58, + 0x5d, 0x6b, 0x71, 0x83, 0xb0, 0x6f, 0x6f, 0xb0, + 0x9a, 0x81, 0x6a, 0x58, 0x6b, 0x81, 0x81, 0x6a, + 0x6f, 0x85, 0x81, 0x99, 0x99, 0x7f, 0x39, 0x54, + 0x73, 0x8a, 0x34, 0x16, 0xf2, 0x3d, 0xf2, 0xee, + 0x15, 0x34, 0x54, 0x73, 0x73, 0x73, 0xfa, 0x3b, + 0x70, 0x7f, 0x7f, 0x70, 0x16, 0x48, 0x99, 0x99, + 0x6e, 0x7f, 0x54, 0x73, 0x99, 0x99, 0x99, 0x1a, + 0x42, 0x67, 0x9a, 0x99, 0x2b, 0x34, 0x73, 0x73, + 0x2b, 0xeb, 0x34, 0x34, 0x34, 0x54, 0x31, 0x31, + 0x3a, 0x4a, 0x7e, 0x94, 0x94, 0x27, 0x27, 0x94, + 0x9c, 0xa8, 0x46, 0x27, 0x62, 0x37, 0x79, 0x8b, + 0x7e, 0x27, 0x93, 0x8b, 0x8b, 0xa0, 0x27, 0x62, + 0x5f, 0xa0, 0x5f, 0x62, 0x30, 0x1f, 0x8d, 0x98, + 0x8d, 0x46, 0x2f, 0x8f, 0x76, 0xb6, 0xa6, 0x55, + 0x46, 0xf7, 0x5f, 0x8b, 0x46, 0x1f, 0x98, 0x8b, + 0x8b, 0x82, 0x55, 0x74, 0x82, 0x7, 0xa8, 0x60, + 0x27, 0x55, 0x55, 0x62, 0x98, 0x30, 0x62, 0x98, + 0x68, 0x68, 0xa7, 0x46, 0x5e, 0x5e, 0xa7, 0x79, + 0x1f, 0x46, 0x93, 0x98, 0x8d, 0x1f, 0x62, 0x46, + 0x5e, 0x76, 0xa8, 0xa6, 0x1f, 0x8d, 0x82, 0x8d, + 0x5e, 0x46, 0x46, 0x82, 0x82, 0x76, 0x76, 0x64, + 0x60, 0x28, 0x76, 0x89, 0xa7, 0x1e, 0x79, 0x8d, + 0x76, 0x75, 0x79, + 0x7e, 0x89, 0x76, 0x8f, 0x6a, 0x4a, 0x83, 0x6e, + 0xfa, 0x23, 0x1c, 0x21, 0x34, 0x48, 0x2b, 0x23, + 0x42, 0x63, 0x71, 0x6a, 0x5d, 0x85, 0x71, 0x6b, + 0x6b, 0x71, 0x71, 0x63, 0x59, 0x71, 0x6b, 0x99, + 0x67, 0x85, 0x5d, 0x9a, 0x9a, 0x85, 0x5d, 0x85, + 0x80, 0x80, 0x71, 0x58, 0x4d, 0x59, 0x71, 0x9a, + 0x7f, 0x7f, 0x31, 0x85, 0x85, 0x9a, 0x63, 0x36, + 0x67, 0x80, 0x85, 0x99, 0x3b, 0x3d, 0x16, 0x16, + 0x3d, 0x3d, 0x15, 0x3d, 0x3d, 0x70, 0x70, 0x3f, + 0x3f, 0x48, 0x63, 0x9a, 0x7f, 0x6e, 0x99, 0x80, + 0x99, 0x7f, 0x67, 0x59, 0x73, 0x70, 0x48, 0x1d, + 0x3b, 0x16, 0x3b, 0x3f, 0x3f, 0x48, 0x73, 0x54, + 0x6e, 0x99, 0x85, 0x6f, 0x6a, 0x6a, 0x5d, 0x6b, + 0x5d, 0x58, 0x6b, 0x6b, 0x90, 0x67, 0x80, 0x6b, + 0x6f, 0x99, 0x85, 0x6b, 0x5d, 0x71, 0x71, 0x71, + 0x5d, 0x58, 0x4d, 0x58, 0x67, 0x80, 0x80, 0x90, + 0x6f, 0x99, 0x99, 0x6f, 0x6a, 0x6f, 0x58, 0x6b, + 0x81, 0x5d, 0x4d, 0x6f, 0x5d, 0x99, 0x7f, 0x99, + 0x31, 0x99, 0x80, 0x99, 0x9a, 0x21, 0x3f, 0x22, + 0x21, 0x3b, 0x3b, 0x3d, 0x16, 0x3d, 0x14, 0x3d, + 0x16, 0x16, 0x16, 0x16, 0xf2, 0x3d, 0x16, 0x3d, + 0x3d, 0x3d, 0x3d, 0x3d, 0xeb, 0xee, 0x16, 0xf2, + 0x16, 0x15, 0xf2, 0x3d, 0x7f, 0x36, 0x1c, 0x48, + 0x42, 0x54, 0x73, 0xf2, 0xee, 0x15, 0x1, 0x73, + 0x73, 0x1c, 0x36, 0x4d, 0x9a, 0x85, 0x85, 0x9a, + 0x67, 0x63, 0x99, 0x7f, 0x99, 0x63, 0x58, 0x6f, + 0x71, 0x81, 0x6a, 0x5d, 0x6f, 0x6f, 0x6f, 0x80, + 0x99, 0x7f, 0x73, 0x73, 0x73, 0x70, 0x34, 0x15, + 0xee, 0xee, 0xf2, 0x16, 0x16, 0x14, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x3d, 0x3d, 0x15, 0xf2, + 0xeb, 0x73, 0x34, 0x3d, 0x16, 0x34, 0x2b, 0x16, + 0x73, 0xf2, 0xf2, 0xee, 0xeb, 0xeb, 0xfa, 0x34, + 0x2b, 0xfa, 0xa, 0xeb, 0xf2, 0xee, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0xf2, 0x2a, 0x26, 0x4d, + 0x3a, 0x1b, 0xf8, 0xe, 0xe, 0xb9, 0x37, 0x82, + 0x28, 0x28, 0x5e, 0x8d, 0x5e, 0x86, 0x5e, 0x28, + 0x82, 0x8, 0x7, 0x6c, 0x28, 0x7, 0xf7, 0x5e, + 0x5e, 0x68, 0x5e, 0x5e, 0x68, 0x5e, 0x9f, 0x9f, + 0x9f, 0x7, 0xdd, 0x7, 0x6c, 0xa7, 0xfc, 0x5e, + 0x86, 0x5e, 0x5e, 0x5e, 0x4e, 0x5e, 0xb6, 0x6c, + 0x68, 0x7, 0xdd, 0x6c, 0x5e, 0x37, 0x28, 0x82, + 0x5e, 0x28, 0xe, 0xe, 0x28, 0x68, 0x9f, 0x7, + 0x9e, 0x5e, 0x9f, 0x9f, 0x68, 0x4e, 0x68, 0x68, + 0xa3, 0x68, 0x28, 0x28, 0x9f, 0x68, 0x6c, 0xdd, + 0x6c, 0x28, 0x6c, 0x5e, 0x68, 0x9e, 0x5e, 0x68, + 0x9e, 0x5e, 0x5e, 0xb7, 0xb8, 0x28, 0x37, 0xa7, + 0xc, 0x28, 0x28, 0xfc, 0x32, 0x86, 0x68, 0x32, + 0x86, 0x32, 0x68, + 0x76, 0x76, 0x28, 0xa7, 0x60, 0xa1, 0xb, 0xcb, + 0x73, 0xfa, 0x23, 0x23, 0x67, 0x4d, 0x67, 0x48, + 0x9a, 0x5d, 0x6a, 0x90, 0x90, 0x63, 0x85, 0x85, + 0x6b, 0x6a, 0x6a, 0x81, 0x81, 0x91, 0x91, 0x58, + 0x80, 0x6f, 0x6f, 0x67, 0x7f, 0x41, 0x6f, 0x85, + 0x9a, 0x83, 0x7e, 0x6a, 0x71, 0x6a, 0x6a, 0x90, + 0x48, 0x7f, 0x9a, 0x67, 0x7f, 0x80, 0x99, 0x59, + 0x9a, 0x6f, 0x90, 0x67, 0x3b, 0x3f, 0x3f, 0x3d, + 0x3d, 0x16, 0x3b, 0x3d, 0xf2, 0x48, 0x6e, 0x70, + 0x21, 0x99, 0x58, 0x5d, 0x58, 0x31, 0x80, 0x67, + 0x7f, 0x42, 0x99, 0x99, 0x3b, 0x3f, 0x80, 0x9a, + 0x70, 0x3b, 0x7f, 0x63, 0x99, 0x54, 0x73, 0x73, + 0x73, 0x48, 0x99, 0x6f, 0x83, 0x72, 0x6a, 0x8e, + 0x6a, 0x6a, 0x6a, 0x8e, 0x6a, 0x90, 0x63, 0x83, + 0x97, 0x7f, 0x63, 0x7e, 0x55, 0x83, 0x91, 0x91, + 0x7e, 0x6a, 0x6a, 0x91, 0x6a, 0x6f, 0x99, 0x9d, + 0x41, 0x7f, 0x90, 0x6a, 0x83, 0x90, 0x85, 0x3e, + 0x6a, 0x55, 0x6a, 0x83, 0x83, 0x3a, 0x67, 0x3a, + 0x90, 0x26, 0x23, 0x5a, 0x5a, 0x54, 0x48, 0x99, + 0x39, 0xeb, 0x73, 0x54, 0x2a, 0x3d, 0x3d, 0x3d, + 0x16, 0x3d, 0x3d, 0x16, 0x16, 0x3d, 0x34, 0xe6, + 0xeb, 0x73, 0x34, 0x34, 0xf2, 0x3d, 0xf2, 0x16, + 0x16, 0x14, 0x16, 0x16, 0x3d, 0x15, 0x34, 0xeb, + 0xeb, 0x15, 0x16, 0x3d, 0x16, 0x3d, 0x16, 0xee, + 0x3d, 0x15, 0xfa, 0xfa, 0xfa, 0x39, 0x99, 0x54, + 0x73, 0x23, 0x7f, 0x7f, 0x67, 0x85, 0x99, 0x26, + 0x4d, 0x90, 0x83, 0x97, 0x7f, 0x54, 0x54, 0x99, + 0x6e, 0x48, 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0x16, + 0x14, 0x14, 0x16, 0x16, 0x16, 0x3d, 0x16, 0x16, + 0x16, 0x14, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0xf2, 0xf2, 0xeb, 0xf2, 0xee, 0x16, + 0x16, 0xf2, 0xf2, 0x16, 0x16, 0xee, 0xee, 0x18, + 0x3d, 0xf2, 0xeb, 0xee, 0x16, 0x16, 0xee, 0x16, + 0x14, 0x14, 0x14, 0x16, 0x16, 0xee, 0x15, 0xfa, + 0xf4, 0x5a, 0xec, 0x11, 0x30, 0x28, 0x28, 0x1f, + 0x30, 0x37, 0x28, 0x82, 0x82, 0xe, 0xf3, 0x62, + 0x7d, 0xa0, 0xa0, 0x12, 0xe, 0x28, 0x8d, 0x46, + 0x46, 0x1f, 0x37, 0x93, 0x82, 0x6c, 0xdd, 0x2f, + 0x5e, 0x6c, 0x28, 0x5f, 0x1f, 0x1e, 0x76, 0x93, + 0x8d, 0x1f, 0x2f, 0xab, 0x86, 0x9f, 0x7, 0xf8, + 0x1f, 0x5e, 0x76, 0x79, 0xfc, 0xe, 0x46, 0x9c, + 0x5e, 0xa7, 0xa1, 0x83, 0x37, 0x8d, 0x9c, 0x30, + 0xe, 0x37, 0x8d, 0x8d, 0x4e, 0xf, 0x1f, 0x8d, + 0x5e, 0x68, 0xaa, 0xf8, 0xe, 0x82, 0x93, 0x89, + 0x1f, 0x1f, 0x98, 0x8d, 0x86, 0x32, 0x30, 0xe, + 0x6c, 0x8d, 0x74, 0xa6, 0x60, 0x62, 0x74, 0x8f, + 0x93, 0x28, 0x38, 0x46, 0x8d, 0x68, 0x82, 0x7d, + 0x38, 0x28, 0x8d, + 0x6c, 0x6c, 0x6c, 0x7, 0xc8, 0xcc, 0xd0, 0xd8, + 0xeb, 0xf5, 0xfa, 0x54, 0x67, 0x3a, 0x41, 0x23, + 0x58, 0x83, 0x6a, 0x6f, 0x6f, 0x90, 0x83, 0x99, + 0x90, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x55, 0x6a, + 0x6f, 0x83, 0x5d, 0x90, 0x67, 0x63, 0x90, 0x99, + 0x99, 0x4a, 0x6a, 0x6a, 0x83, 0x6a, 0x35, 0x6f, + 0x99, 0x80, 0x41, 0x67, 0x67, 0x99, 0x5d, 0x80, + 0x99, 0xfd, 0x5a, 0x7f, 0x70, 0x70, 0x48, 0x3f, + 0x3d, 0x70, 0x3b, 0x3d, 0x3d, 0x54, 0x23, 0x73, + 0x34, 0xfa, 0x99, 0x97, 0x97, 0x97, 0x99, 0x63, + 0x9a, 0x4d, 0x56, 0x80, 0x42, 0x42, 0x4d, 0x7f, + 0x70, 0x3f, 0x48, 0x26, 0x5a, 0x3, 0x6e, 0xfa, + 0x1d, 0x63, 0x6f, 0x5d, 0x41, 0x99, 0x35, 0x83, + 0x83, 0x7a, 0x90, 0x6f, 0x35, 0x6b, 0x6f, 0x6b, + 0x6f, 0x58, 0x71, 0x6a, 0x83, 0x99, 0x5d, 0x7e, + 0xaa, 0x6a, 0x96, 0x40, 0x6a, 0x6a, 0x6a, 0x6a, + 0x90, 0x67, 0x56, 0x90, 0x41, 0x99, 0x99, 0x97, + 0x6f, 0x6a, 0x5d, 0x83, 0x4a, 0x31, 0x58, 0x5d, + 0x5d, 0x7f, 0x48, 0x23, 0x54, 0x34, 0x54, 0x6e, + 0xfd, 0xfa, 0x70, 0x7f, 0x99, 0x73, 0xf2, 0xf5, + 0x3d, 0x3d, 0x17, 0x3d, 0x16, 0x16, 0x15, 0xd8, + 0xd8, 0xfa, 0x73, 0x6e, 0x73, 0x34, 0x15, 0x3d, + 0x14, 0x14, 0x16, 0x16, 0xf2, 0x16, 0x16, 0xf5, + 0xf2, 0x15, 0x16, 0xf5, 0xeb, 0x3d, 0x14, 0x16, + 0xf2, 0x16, 0xf2, 0x15, 0x15, 0x15, 0x2b, 0x73, + 0x54, 0x39, 0x1c, 0x42, 0x31, 0x90, 0x7f, 0x48, + 0x23, 0x7f, 0x7f, 0x54, 0x73, 0x2b, 0xeb, 0xfa, + 0x73, 0xeb, 0x15, 0x3d, 0x16, 0x16, 0x14, 0x16, + 0xff, 0x16, 0x3d, 0x16, 0x3d, 0x16, 0x16, 0x3d, + 0x18, 0x16, 0x14, 0x16, 0x16, 0x16, 0x14, 0x16, + 0x14, 0x16, 0x16, 0xf2, 0xf2, 0xee, 0x16, 0xee, + 0x16, 0x34, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x14, 0x16, 0x16, 0x14, 0x16, 0xff, 0x14, + 0x14, 0x16, 0xee, 0x14, 0x16, 0x15, 0x15, 0x15, + 0xf1, 0xf9, 0x20, 0x5d, 0x55, 0x5c, 0x82, 0x62, + 0x7e, 0x30, 0x5f, 0x62, 0x62, 0x2f, 0x3e, 0x94, + 0x8f, 0x8d, 0x46, 0x27, 0x8f, 0x8d, 0x98, 0x8f, + 0x8b, 0x46, 0x5f, 0x9c, 0x7d, 0xa7, 0xa8, 0x74, + 0x8d, 0x8d, 0x82, 0x8f, 0x62, 0x93, 0x7d, 0x94, + 0x8f, 0x46, 0x60, 0xaa, 0x8d, 0x68, 0x76, 0x62, + 0x98, 0x5e, 0x93, 0x8f, 0x8d, 0x1f, 0x5f, 0xaa, + 0xa7, 0x5f, 0xa6, 0x83, 0x8f, 0x76, 0x8f, 0x8f, + 0x98, 0x5e, 0x98, 0x98, 0x5e, 0x5e, 0x8f, 0x74, + 0x6c, 0x82, 0x74, 0xaa, 0x5f, 0x93, 0x8f, 0x98, + 0x8d, 0x46, 0x8b, 0x7d, 0x6c, 0x8d, 0x8f, 0x9c, + 0xa0, 0x82, 0x8f, 0x8f, 0x46, 0x8f, 0x8b, 0x94, + 0x8f, 0x8d, 0x89, 0x8f, 0x89, 0x28, 0x89, 0x8f, + 0x7d, 0x5e, 0x8d, + 0xa7, 0xf3, 0xe, 0x2f, 0x60, 0x3e, 0x40, 0x23, + 0x15, 0x15, 0x15, 0x2b, 0xfa, 0xe6, 0xeb, 0x7f, + 0x80, 0x6f, 0x5b, 0x6b, 0x6b, 0x81, 0x71, 0x58, + 0x58, 0x6a, 0x7a, 0x41, 0xaf, 0x90, 0x41, 0x9d, + 0x6f, 0x6f, 0x7a, 0x58, 0x58, 0x81, 0x81, 0x58, + 0x59, 0x59, 0x66, 0x4, 0x6e, 0x99, 0xfd, 0x63, + 0x71, 0x31, 0x58, 0x63, 0x59, 0x71, 0x71, 0x63, + 0x42, 0x21, 0x3f, 0x3d, 0xf2, 0x54, 0xa, 0x34, + 0x48, 0x48, 0x7f, 0x3d, 0x17, 0x3b, 0x34, 0xee, + 0x15, 0x3b, 0x21, 0x34, 0x54, 0x58, 0x71, 0x71, + 0x58, 0x71, 0x6b, 0x71, 0x59, 0x59, 0x67, 0x80, + 0x1d, 0x48, 0x21, 0x73, 0xa, 0x23, 0x90, 0x85, + 0x58, 0x71, 0x71, 0x6b, 0x71, 0x71, 0x59, 0x99, + 0x7f, 0x99, 0x63, 0x3a, 0x99, 0x90, 0x71, 0x6b, + 0x81, 0x81, 0x6b, 0x81, 0x6a, 0x5d, 0x6b, 0x6b, + 0x97, 0x99, 0x71, 0x5d, 0xb0, 0x83, 0x71, 0x71, + 0x71, 0x71, 0x71, 0x9a, 0x9a, 0x63, 0x31, 0x67, + 0x26, 0x67, 0x58, 0x6b, 0x6b, 0x71, 0x71, 0x6b, + 0x6f, 0x58, 0x63, 0x7f, 0x48, 0x1d, 0x59, 0x36, + 0x99, 0x70, 0x48, 0x99, 0x7f, 0x54, 0x34, 0x34, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3d, 0x16, 0x3b, 0x1d, + 0x48, 0x34, 0x3b, 0x48, 0x73, 0x73, 0xee, 0xf2, + 0xee, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x16, 0x16, + 0x16, 0x14, 0x16, 0x3d, 0x3d, 0x16, 0x16, 0x16, + 0xf2, 0xf2, 0xf2, 0xee, 0x16, 0x16, 0x3d, 0x34, + 0xd8, 0xeb, 0x34, 0x34, 0x34, 0x73, 0x73, 0x34, + 0xeb, 0x34, 0xeb, 0x73, 0xeb, 0xf2, 0x3d, 0xeb, + 0xeb, 0xe1, 0x16, 0x16, 0x16, 0x3d, 0x16, 0x16, + 0x14, 0x18, 0x16, 0xee, 0x14, 0x16, 0x14, 0x16, + 0x16, 0x3d, 0x16, 0x3d, 0x15, 0xf2, 0xf2, 0x16, + 0x16, 0x16, 0xf2, 0x16, 0x16, 0x16, 0xee, 0x16, + 0xf2, 0xe1, 0xde, 0x16, 0x16, 0x3d, 0x18, 0xf5, + 0x16, 0x3d, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0xf2, 0xee, 0x16, 0x16, 0x15, 0xeb, 0xfa, + 0x1a, 0x3a, 0x4a, 0x4a, 0x7e, 0x9c, 0xa8, 0x74, + 0x8f, 0x5f, 0x2c, 0x55, 0x8f, 0x98, 0x46, 0x8b, + 0x8b, 0x46, 0x8d, 0x62, 0x8b, 0x37, 0xa7, 0x74, + 0x79, 0x5e, 0x5f, 0x93, 0x8d, 0x79, 0x8d, 0x93, + 0x98, 0x5e, 0x82, 0x89, 0x76, 0x82, 0xad, 0x60, + 0x8f, 0x76, 0x98, 0x93, 0x37, 0x5e, 0x8d, 0x8d, + 0x8d, 0x5e, 0x37, 0x9c, 0x76, 0x32, 0xa7, 0x2c, + 0xe, 0x82, 0x62, 0x62, 0x82, 0x28, 0x46, 0x93, + 0x82, 0x68, 0x37, 0xa7, 0x28, 0x68, 0x79, 0x76, + 0xfc, 0x5e, 0x8d, 0x82, 0x82, 0x37, 0x30, 0x46, + 0x5e, 0x5e, 0x76, 0xa0, 0xf7, 0x6c, 0x8d, 0x8d, + 0x5e, 0x37, 0x93, 0x8d, 0x76, 0x82, 0x82, 0x62, + 0x46, 0x7, 0x28, 0x79, 0x76, 0x8, 0x5c, 0x98, + 0x8d, 0x68, 0x43, + 0x8f, 0x62, 0x46, 0x74, 0x7e, 0x6f, 0x90, 0x7f, + 0x3f, 0x15, 0x3b, 0x48, 0x7f, 0x21, 0x3f, 0x42, + 0x59, 0x71, 0x5d, 0x6b, 0x71, 0x71, 0x6f, 0x71, + 0x71, 0x85, 0x58, 0x63, 0x59, 0x85, 0x90, 0x42, + 0x71, 0x71, 0x85, 0x9a, 0x71, 0x6b, 0x71, 0x6b, + 0x71, 0x85, 0x9a, 0x58, 0x59, 0x58, 0x80, 0x63, + 0x71, 0x71, 0x85, 0x80, 0x59, 0x63, 0x9a, 0x58, + 0x9a, 0x67, 0x48, 0x3f, 0x3b, 0x3f, 0x70, 0x3b, + 0x34, 0x73, 0x34, 0x3d, 0x3d, 0x70, 0x3d, 0x70, + 0x42, 0x63, 0x80, 0x42, 0x4d, 0x59, 0x59, 0x9a, + 0x85, 0x71, 0x9a, 0x9a, 0x71, 0x85, 0x80, 0x59, + 0x71, 0x63, 0x80, 0x3f, 0x3f, 0x3f, 0x99, 0x99, + 0x80, 0x71, 0x6b, 0x85, 0x71, 0x71, 0x71, 0x71, + 0x59, 0x58, 0x71, 0x99, 0x99, 0x67, 0x71, 0x85, + 0xb0, 0x6a, 0x81, 0x6a, 0x6a, 0x91, 0x81, 0x81, + 0x6a, 0x5d, 0x6b, 0x90, 0x99, 0x80, 0x6f, 0x99, + 0x99, 0x9a, 0x85, 0x90, 0x85, 0x71, 0x71, 0x81, + 0x6b, 0x71, 0x58, 0x71, 0x9a, 0x71, 0x71, 0x99, + 0x90, 0x5d, 0x5d, 0x6f, 0x5d, 0x58, 0x71, 0x81, + 0x6b, 0x4d, 0x4d, 0x42, 0x2a, 0x34, 0x34, 0x48, + 0x23, 0x26, 0x7f, 0x67, 0x23, 0x3f, 0x42, 0x4d, + 0x90, 0x7f, 0x48, 0x70, 0xfa, 0xeb, 0x3d, 0xeb, + 0xf2, 0x16, 0x3d, 0x15, 0x34, 0xf2, 0xf2, 0x16, + 0x14, 0x14, 0x14, 0x16, 0x3d, 0x16, 0x16, 0x16, + 0x14, 0x16, 0x16, 0x15, 0xee, 0x16, 0xeb, 0xeb, + 0xf2, 0xf2, 0x16, 0xf2, 0x16, 0x16, 0xee, 0x3d, + 0xf5, 0x16, 0xf2, 0xf2, 0x16, 0x16, 0x14, 0x16, + 0x16, 0x16, 0x16, 0xee, 0x16, 0xf2, 0x16, 0x16, + 0x16, 0x14, 0x18, 0x16, 0x3d, 0x16, 0x3d, 0x16, + 0x16, 0xf2, 0xeb, 0xf2, 0xeb, 0x34, 0xf2, 0xf2, + 0x3b, 0x3d, 0xf2, 0x16, 0x15, 0x16, 0x14, 0xff, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, 0x16, 0x17, + 0x15, 0xe6, 0xeb, 0x15, 0xf2, 0xf2, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0xde, 0xd8, 0xf9, + 0xfd, 0x1b, 0xe4, 0xf3, 0xe, 0xe, 0x12, 0x5f, + 0x5e, 0x5e, 0xfc, 0x12, 0x1f, 0x86, 0x5e, 0x28, + 0xe, 0xe, 0xf7, 0x8, 0x6c, 0x28, 0xe, 0x37, + 0x68, 0x86, 0x5e, 0xfc, 0x1f, 0x68, 0x86, 0x5e, + 0x5e, 0xfc, 0xe, 0xdd, 0x6c, 0x5e, 0xe, 0x27, + 0x46, 0x86, 0x5e, 0x28, 0xfc, 0x1e, 0x68, 0x7, + 0x7, 0x68, 0xe, 0xe, 0x6c, 0x68, 0x6c, 0x1f, + 0x46, 0x5e, 0x5e, 0x5e, 0x6c, 0x1f, 0x1f, 0xf7, + 0xb8, 0x5e, 0xfc, 0x1f, 0x5e, 0x4e, 0xa3, 0xa3, + 0xfc, 0x37, 0x5e, 0x7, 0xb8, 0xf7, 0x1f, 0x1f, + 0x6c, 0x5e, 0x68, 0x28, 0x1f, 0x68, 0x68, 0x5e, + 0xfc, 0x1e, 0x76, 0x9f, 0xb8, 0x7, 0x7, 0x2f, + 0x38, 0xfc, 0x9f, 0x32, 0x32, 0xfc, 0x43, 0x5e, + 0x68, 0x68, 0x68, + 0x76, 0x82, 0x86, 0xa7, 0x60, 0xb0, 0x5a, 0x73, + 0x73, 0xeb, 0x3b, 0x42, 0x31, 0x99, 0x34, 0x48, + 0x85, 0x71, 0x5d, 0x6b, 0x71, 0x9a, 0x80, 0x85, + 0x6f, 0x6a, 0x5d, 0x5d, 0x6b, 0x6a, 0x6a, 0x58, + 0x5d, 0x58, 0x99, 0x67, 0x71, 0x6f, 0x90, 0x71, + 0x6b, 0x6a, 0x6b, 0x5d, 0x71, 0x6a, 0x6a, 0x71, + 0x5d, 0x9d, 0x99, 0x54, 0x9a, 0x90, 0x99, 0x67, + 0x63, 0x6f, 0x6f, 0x59, 0x4d, 0x4d, 0x7f, 0x3b, + 0x3b, 0x3b, 0x3d, 0x3d, 0x3d, 0x70, 0x73, 0x48, + 0x90, 0x6a, 0x6a, 0x6f, 0x85, 0x6b, 0x6b, 0x80, + 0x85, 0x71, 0x80, 0x70, 0x80, 0x85, 0x71, 0x9a, + 0x63, 0x90, 0x63, 0x67, 0x67, 0x4d, 0x42, 0x21, + 0x80, 0x6b, 0x71, 0x80, 0x90, 0x5d, 0x6a, 0x81, + 0x6a, 0x4a, 0x6b, 0x58, 0x4d, 0x58, 0x71, 0x31, + 0x99, 0x66, 0x6a, 0xaf, 0xaf, 0x6a, 0x55, 0x7e, + 0x6a, 0x55, 0x6a, 0x6a, 0x90, 0x71, 0x6a, 0x90, + 0x66, 0x9a, 0x71, 0x6f, 0x6f, 0x31, 0x71, 0x6a, + 0x6a, 0x6b, 0x58, 0x58, 0x90, 0x71, 0x6f, 0x90, + 0x80, 0x7a, 0x6a, 0x6a, 0x83, 0x71, 0x4a, 0x6a, + 0x6a, 0x5d, 0x5d, 0x4a, 0x99, 0x48, 0x42, 0x7f, + 0x2a, 0x54, 0x7f, 0x26, 0x7f, 0xfa, 0x1c, 0x41, + 0xb4, 0x3, 0x99, 0x39, 0x54, 0x15, 0x3b, 0x15, + 0xf2, 0x3d, 0xf2, 0xee, 0xee, 0x3d, 0xee, 0xf5, + 0x16, 0x16, 0x14, 0x3d, 0xee, 0x14, 0x16, 0xf5, + 0x14, 0x14, 0x14, 0x3d, 0x16, 0x16, 0x16, 0xf2, + 0x16, 0x16, 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0x3d, + 0x16, 0x16, 0x16, 0x16, 0x18, 0x16, 0x16, 0x16, + 0x16, 0xff, 0x16, 0xf2, 0x16, 0x14, 0x16, 0x16, + 0x3d, 0x16, 0x14, 0x16, 0x17, 0xf2, 0x3d, 0xf2, + 0x3d, 0x14, 0x16, 0xf2, 0x16, 0xf2, 0x16, 0x14, + 0x16, 0x16, 0xee, 0x16, 0x16, 0x14, 0x16, 0x16, + 0x16, 0x16, 0x14, 0x14, 0x16, 0xff, 0x14, 0x3d, + 0x16, 0xe1, 0xde, 0xd8, 0xde, 0xeb, 0xee, 0xf2, + 0x16, 0x16, 0x16, 0x16, 0x16, 0xf5, 0xeb, 0x15, + 0x5a, 0xe5, 0xcc, 0xf8, 0x5c, 0x1f, 0x46, 0x93, + 0x46, 0x82, 0x37, 0x46, 0x93, 0x28, 0x7, 0xa8, + 0x2f, 0x46, 0xe, 0x5f, 0x5e, 0x5e, 0x1e, 0x46, + 0x79, 0x68, 0x9f, 0x8d, 0x46, 0x5e, 0x8d, 0x9c, + 0x5f, 0x82, 0x46, 0x93, 0x46, 0x8d, 0x82, 0x62, + 0x93, 0x82, 0x8d, 0xa7, 0xa7, 0x5e, 0x82, 0x5f, + 0x28, 0x5e, 0x8d, 0x93, 0x8d, 0x5e, 0x82, 0x93, + 0x76, 0x76, 0x76, 0xa8, 0xb7, 0xe, 0x93, 0x46, + 0x1e, 0x9f, 0x79, 0x98, 0x68, 0x75, 0x8d, 0x8d, + 0x6c, 0x37, 0x82, 0xa8, 0xc8, 0xf7, 0x62, 0x98, + 0x5e, 0x82, 0x8d, 0x98, 0x5e, 0x8d, 0x98, 0x98, + 0x6c, 0xa7, 0x8f, 0x74, 0x2c, 0x60, 0x60, 0x8e, + 0x8b, 0x5e, 0x8d, 0x8b, 0x98, 0x86, 0x89, 0x98, + 0x5c, 0x5e, 0x76, + 0x1e, 0x5e, 0x6c, 0x8, 0x50, 0xf4, 0xcb, 0xeb, + 0xeb, 0x3d, 0x15, 0x48, 0x90, 0x5a, 0x48, 0x36, + 0x3a, 0x6f, 0x4a, 0x6a, 0x85, 0x67, 0x54, 0x80, + 0x5d, 0x6a, 0x83, 0x90, 0x6a, 0x5b, 0x6a, 0x4a, + 0x58, 0x63, 0xfd, 0x80, 0x6a, 0x6f, 0x3a, 0x6f, + 0x6b, 0x91, 0x83, 0x71, 0x58, 0x6a, 0x6a, 0x83, + 0x5d, 0x58, 0x7f, 0x42, 0x63, 0x58, 0x66, 0x42, + 0x4d, 0x5d, 0x6f, 0x9a, 0x71, 0x58, 0x80, 0x42, + 0x42, 0x1d, 0x1d, 0x3f, 0x3f, 0x3f, 0x70, 0x34, + 0x99, 0x83, 0xb0, 0x83, 0x6a, 0x6f, 0x85, 0x9a, + 0x71, 0x5d, 0x80, 0x42, 0x80, 0x85, 0x85, 0x7f, + 0x23, 0x67, 0x7f, 0x7f, 0x63, 0x58, 0x59, 0x63, + 0x85, 0x71, 0x71, 0x63, 0x63, 0x71, 0x6a, 0x90, + 0x41, 0x3a, 0x90, 0x97, 0x6f, 0x6a, 0x6b, 0x5d, + 0x58, 0x71, 0x5d, 0x99, 0x99, 0x85, 0x6a, 0xb0, + 0x97, 0x6a, 0x5d, 0x83, 0x6f, 0x6a, 0x71, 0x6f, + 0x4c, 0x6b, 0x6b, 0x6f, 0x99, 0x71, 0x71, 0x85, + 0x83, 0x85, 0x71, 0x58, 0x63, 0x71, 0x71, 0x6b, + 0x58, 0x85, 0x6b, 0x5d, 0x97, 0x71, 0x6b, 0x6a, + 0xb0, 0x6f, 0x71, 0x6b, 0x58, 0x63, 0x58, 0x58, + 0x42, 0x1d, 0x36, 0x48, 0x54, 0x34, 0x7f, 0x5a, + 0x3, 0x6e, 0x66, 0xfe, 0x39, 0x1d, 0x1d, 0x48, + 0xf2, 0xf2, 0x16, 0x16, 0x14, 0xff, 0x16, 0xee, + 0x16, 0x16, 0x16, 0x3d, 0x18, 0x14, 0x14, 0x16, + 0x14, 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, 0xee, + 0x16, 0x16, 0x3d, 0x21, 0x15, 0x14, 0x16, 0x16, + 0x14, 0x16, 0x16, 0x16, 0x14, 0x14, 0x16, 0x16, + 0x16, 0x14, 0x16, 0x3b, 0x17, 0x14, 0xf2, 0x16, + 0x16, 0xf5, 0x3d, 0x14, 0xee, 0xf2, 0x16, 0x15, + 0x17, 0x16, 0x14, 0x3d, 0x16, 0x16, 0x14, 0x16, + 0x14, 0x14, 0x16, 0x16, 0x16, 0x16, 0x16, 0xf2, + 0xfa, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, 0x16, + 0xf5, 0x16, 0xf2, 0xf2, 0x70, 0xd8, 0xee, 0x16, + 0x15, 0x16, 0x16, 0xf2, 0xf2, 0x15, 0x34, 0xfa, + 0xfd, 0x11, 0xf8, 0x60, 0x94, 0x98, 0x76, 0x62, + 0x7e, 0x62, 0x7d, 0xaa, 0x7e, 0x76, 0xad, 0xa6, + 0x55, 0x8d, 0x82, 0x62, 0x62, 0x5e, 0x8d, 0x8f, + 0x93, 0x1f, 0x8d, 0x9c, 0x9c, 0x79, 0x46, 0x7e, + 0x94, 0x93, 0x8b, 0x8f, 0x62, 0x82, 0x7d, 0x94, + 0xaa, 0xe, 0x62, 0x6a, 0x5f, 0x5e, 0x79, 0x62, + 0x46, 0x5e, 0x98, 0x8f, 0x76, 0x1e, 0x9c, 0x8f, + 0xa7, 0xa7, 0x74, 0x3e, 0xa9, 0x37, 0x93, 0x8f, + 0x46, 0x46, 0x8b, 0x8b, 0x79, 0x1e, 0x46, 0x93, + 0xa0, 0xa0, 0x62, 0x27, 0x2c, 0x76, 0x8f, 0x98, + 0x37, 0x1f, 0x8f, 0x8b, 0x82, 0xa7, 0x62, 0x93, + 0xa7, 0x5f, 0x8f, 0x8f, 0x27, 0x7e, 0x4b, 0x65, + 0x8b, 0x75, 0x46, 0x62, 0x8d, 0x6c, 0xa7, 0x62, + 0x62, 0x32, 0x5c, + 0x7d, 0xa8, 0xb9, 0x5f, 0x60, 0x5d, 0x26, 0x36, + 0x21, 0x3b, 0x3d, 0x15, 0x73, 0x2a, 0x34, 0xfe, + 0x31, 0x6f, 0x5d, 0x6a, 0x58, 0x59, 0x59, 0x58, + 0x6b, 0x5d, 0x99, 0x85, 0x58, 0x90, 0xaf, 0x90, + 0x71, 0x3a, 0x85, 0x58, 0x71, 0x71, 0x71, 0x71, + 0x71, 0x85, 0x99, 0x9a, 0x85, 0x71, 0x7f, 0x9a, + 0x71, 0x63, 0x63, 0x63, 0x63, 0x63, 0x67, 0x42, + 0x36, 0x80, 0x7f, 0x7f, 0x58, 0x71, 0x9a, 0x9a, + 0x9a, 0x63, 0x63, 0x67, 0x59, 0x42, 0x21, 0x34, + 0x99, 0x99, 0xd8, 0x73, 0x99, 0x85, 0x85, 0x9a, + 0x71, 0x85, 0x71, 0x59, 0x9a, 0x85, 0x7f, 0x3d, + 0x3d, 0x3d, 0x70, 0x73, 0x99, 0x71, 0x6b, 0x71, + 0x6b, 0x71, 0x71, 0x71, 0x85, 0x6f, 0x9a, 0x54, + 0x54, 0x85, 0x80, 0x99, 0x99, 0x6a, 0x6a, 0x9a, + 0x81, 0x81, 0x6b, 0x71, 0x63, 0x71, 0x58, 0x67, + 0x7f, 0x4d, 0x71, 0x9a, 0x6f, 0x71, 0x71, 0x71, + 0x85, 0x71, 0x71, 0x85, 0x99, 0x80, 0x71, 0x71, + 0x85, 0x71, 0x6b, 0x71, 0x85, 0x59, 0x71, 0x6b, + 0x6b, 0x71, 0x71, 0x71, 0x59, 0x63, 0x6b, 0x85, + 0x67, 0x85, 0x6b, 0x71, 0x6f, 0x71, 0x71, 0x6b, + 0x71, 0x9a, 0x71, 0x4d, 0x23, 0x42, 0x67, 0x7f, + 0xa, 0x73, 0x7f, 0x80, 0x54, 0x3f, 0x3b, 0x15, + 0x16, 0x16, 0x16, 0xee, 0x16, 0x14, 0x16, 0x16, + 0x16, 0x14, 0x3d, 0x14, 0x16, 0x14, 0x16, 0x3d, + 0x18, 0x14, 0x14, 0x16, 0x3d, 0x3d, 0x3d, 0x16, + 0x16, 0x16, 0x14, 0x15, 0xf5, 0x3d, 0x3d, 0xf2, + 0x14, 0x14, 0x16, 0x16, 0x14, 0x14, 0xff, 0x16, + 0x3d, 0x3d, 0x16, 0xf2, 0xee, 0x14, 0x16, 0x16, + 0xf2, 0x16, 0x16, 0x3d, 0x16, 0x3d, 0xf2, 0xf2, + 0xee, 0x14, 0x16, 0x3d, 0x16, 0x16, 0x14, 0xf5, + 0xee, 0x14, 0x14, 0x14, 0x16, 0x16, 0x14, 0x16, + 0xee, 0x14, 0x14, 0x16, 0x16, 0x14, 0x16, 0xf5, + 0xf2, 0x17, 0x15, 0x2b, 0x54, 0x73, 0xf2, 0x16, + 0xf2, 0xf2, 0xf2, 0x3b, 0x15, 0x21, 0x39, 0x20, + 0x6a, 0x30, 0x1f, 0x27, 0x62, 0x82, 0x76, 0xaa, + 0x4a, 0x27, 0xe, 0x60, 0x74, 0x30, 0x30, 0x62, + 0x93, 0x8d, 0x8d, 0x30, 0x30, 0x5e, 0x5e, 0xa7, + 0xa8, 0x12, 0x93, 0x62, 0x8d, 0x5e, 0x1f, 0x62, + 0x93, 0x8d, 0x8d, 0x62, 0x55, 0x46, 0x82, 0xa8, + 0xa6, 0x12, 0x30, 0x46, 0x8d, 0x68, 0x37, 0x30, + 0x46, 0x5e, 0x8d, 0x76, 0xa7, 0x5f, 0x46, 0x9c, + 0xc, 0xf7, 0x30, 0x62, 0x82, 0x68, 0x8d, 0x93, + 0x30, 0x1f, 0x79, 0x8d, 0x9f, 0x28, 0x46, 0x8d, + 0x68, 0x5e, 0x8d, 0x30, 0x46, 0x5e, 0x8d, 0x8d, + 0x28, 0x46, 0x8d, 0x8d, 0x6c, 0x6c, 0x46, 0x1f, + 0x68, 0x68, 0x8d, 0x46, 0x30, 0x30, 0x62, 0x89, + 0x82, 0x6c, 0xc, 0x2f, 0x43, 0x68, 0x6c, 0x82, + 0x1e, 0x43, 0x68, + 0x8f, 0x62, 0x2f, 0x74, 0x91, 0x6a, 0x99, 0x23, + 0x2b, 0x15, 0x3d, 0x21, 0x3f, 0x2b, 0x48, 0x36, + 0x6b, 0x85, 0x58, 0x63, 0x71, 0x71, 0x71, 0x9a, + 0x59, 0x71, 0x80, 0x80, 0x71, 0x80, 0x7f, 0x63, + 0x71, 0x85, 0x9a, 0x4d, 0x59, 0x71, 0x85, 0x9a, + 0x59, 0x80, 0x42, 0x80, 0x71, 0x58, 0x7f, 0x48, + 0x80, 0x80, 0x7f, 0x7f, 0x1d, 0x67, 0x99, 0x54, + 0x99, 0x31, 0x42, 0x4d, 0x85, 0x90, 0x54, 0x48, + 0x7f, 0x7f, 0x7f, 0x3f, 0x7f, 0x1c, 0x7f, 0x48, + 0x99, 0x3, 0x73, 0x16, 0x70, 0x54, 0x73, 0x3f, + 0x67, 0x80, 0x80, 0x70, 0x7f, 0x48, 0x34, 0x16, + 0x3b, 0x70, 0x3d, 0x3b, 0x67, 0x71, 0x80, 0x7f, + 0x80, 0x59, 0x80, 0x7f, 0x99, 0x99, 0x42, 0x42, + 0x63, 0x6b, 0x71, 0x99, 0x58, 0x71, 0x9a, 0x56, + 0x90, 0x6f, 0x6a, 0x6a, 0x5d, 0x6a, 0x81, 0x6b, + 0x71, 0x81, 0x71, 0x67, 0x67, 0x59, 0x85, 0x80, + 0x99, 0x99, 0x58, 0x58, 0x85, 0x85, 0x71, 0x59, + 0x58, 0x71, 0x6b, 0x9a, 0x67, 0x4d, 0x63, 0x9a, + 0x9a, 0x9a, 0x59, 0x6b, 0x6a, 0x6a, 0x6b, 0x6f, + 0x6b, 0x58, 0x6b, 0x90, 0x80, 0x80, 0x58, 0x5d, + 0x85, 0x83, 0x6a, 0x6f, 0x58, 0x71, 0x5d, 0x58, + 0x48, 0x3f, 0x3f, 0x73, 0x3b, 0xf2, 0x3d, 0x16, + 0x16, 0x3d, 0x73, 0xeb, 0x16, 0x3d, 0x22, 0xfa, + 0x3d, 0x16, 0x3b, 0x3d, 0xf5, 0x3d, 0x14, 0x14, + 0x16, 0x18, 0x3d, 0xf5, 0x16, 0x14, 0x16, 0xee, + 0x16, 0x14, 0x18, 0x16, 0xf2, 0x14, 0xf2, 0xee, + 0x16, 0xee, 0x3d, 0xf2, 0x16, 0x14, 0x16, 0x16, + 0xf2, 0xeb, 0x15, 0xf2, 0x14, 0x16, 0xf2, 0xde, + 0xee, 0x16, 0xf5, 0xeb, 0xf2, 0xf2, 0xf5, 0xeb, + 0xf2, 0x14, 0xf2, 0x14, 0xf2, 0x14, 0xf2, 0xde, + 0xe1, 0x14, 0xf5, 0xf2, 0xee, 0xf2, 0x14, 0xee, + 0xee, 0xf2, 0x14, 0x14, 0xf2, 0x16, 0xee, 0xde, + 0xe6, 0xf1, 0xe6, 0xe6, 0xe0, 0xe0, 0xd8, 0xeb, + 0xf2, 0xf2, 0xf2, 0x15, 0xeb, 0x23, 0x1b, 0x2c, + 0xa7, 0x6c, 0x28, 0xc, 0x8, 0x6c, 0x6c, 0xf7, + 0xe, 0x37, 0x5e, 0x28, 0x6c, 0x5e, 0x37, 0x5e, + 0x6c, 0x9e, 0x5e, 0x8, 0xa0, 0x6c, 0x9e, 0x6c, + 0x28, 0x5e, 0x5e, 0x68, 0x86, 0x5e, 0x5e, 0x1f, + 0x37, 0x5e, 0x68, 0xa7, 0x6c, 0x5e, 0x68, 0x6c, + 0x5e, 0x68, 0x28, 0x86, 0x5e, 0x68, 0x68, 0x5e, + 0x9f, 0x5e, 0xa3, 0x6c, 0x6c, 0x28, 0x68, 0x8d, + 0x68, 0x68, 0x5e, 0x79, 0x28, 0x9f, 0x9f, 0x5e, + 0x7, 0x7, 0x5e, 0x68, 0xa3, 0x9f, 0x4e, 0x68, + 0xa3, 0x68, 0x68, 0x5e, 0x5e, 0xb6, 0x6c, 0x68, + 0x9f, 0x6c, 0x5e, 0x68, 0x68, 0x68, 0x5e, 0x5e, + 0x86, 0x6c, 0x28, 0x28, 0x7, 0xb9, 0xb9, 0xb7, + 0xfc, 0x28, 0x1e, 0x43, 0x68, 0x32, 0x32, 0x75, + 0x75, 0x68, 0x68, + 0x76, 0x1f, 0x12, 0x5f, 0x9c, 0xa1, 0x3, 0x73, + 0x34, 0xf2, 0x34, 0x73, 0x39, 0x21, 0x4d, 0x5d, + 0x6a, 0x6a, 0x58, 0x3a, 0x9a, 0x70, 0x48, 0x99, + 0x3a, 0x58, 0x5d, 0x85, 0x71, 0x5d, 0x31, 0x63, + 0x9a, 0x41, 0x6e, 0x39, 0x41, 0x97, 0xb, 0x41, + 0x58, 0x3a, 0x58, 0x58, 0x71, 0x71, 0x4d, 0x36, + 0x48, 0x70, 0x70, 0x3b, 0x34, 0x2b, 0x1, 0x73, + 0xf9, 0xf9, 0xfd, 0x20, 0x3e, 0xb, 0x73, 0x3d, + 0x3d, 0x34, 0x3d, 0x3d, 0x15, 0xe6, 0xeb, 0xc0, + 0x3, 0xcb, 0xeb, 0x3d, 0x73, 0x34, 0x3d, 0x16, + 0x3d, 0xeb, 0x70, 0xf2, 0xeb, 0xeb, 0x3d, 0x3d, + 0x73, 0x6e, 0x73, 0x48, 0x90, 0x6f, 0x9a, 0x42, + 0x54, 0x6e, 0x2a, 0x34, 0x2a, 0x99, 0x23, 0x99, + 0x83, 0x6a, 0x6a, 0x6a, 0x91, 0x6a, 0x4a, 0x99, + 0x99, 0x6f, 0x97, 0x97, 0x6a, 0x7e, 0x6a, 0x6a, + 0x7e, 0x7e, 0x91, 0x6f, 0x90, 0x97, 0x99, 0x54, + 0x7f, 0x97, 0x31, 0x90, 0x5d, 0x85, 0x58, 0x6b, + 0x5d, 0x5d, 0x85, 0x6f, 0x80, 0x99, 0x58, 0x80, + 0x99, 0x85, 0x6b, 0x6a, 0x6a, 0x5d, 0x95, 0x6a, + 0x6f, 0x90, 0x83, 0x5d, 0x90, 0x6f, 0x5d, 0x83, + 0x6a, 0x6f, 0x6a, 0x6a, 0x6a, 0x81, 0x6a, 0x6a, + 0x63, 0x26, 0x7f, 0x7f, 0x48, 0x70, 0x1d, 0x3b, + 0x15, 0x3b, 0x34, 0x34, 0x3d, 0x3d, 0x73, 0xcb, + 0x15, 0x70, 0xfa, 0x2b, 0x15, 0x16, 0x3d, 0x3d, + 0x16, 0x3d, 0x14, 0xee, 0x14, 0x14, 0xee, 0xf2, + 0x14, 0x14, 0x3d, 0x16, 0xe1, 0x3d, 0x16, 0x14, + 0x16, 0x16, 0xf2, 0xee, 0x16, 0x16, 0x14, 0x14, + 0x16, 0x16, 0xf2, 0xf2, 0x3d, 0x16, 0x16, 0x16, + 0x16, 0x16, 0xee, 0xe1, 0xee, 0xf2, 0xd8, 0xe6, + 0xd8, 0xeb, 0xe1, 0xf2, 0xe1, 0x16, 0xf2, 0xee, + 0xee, 0xf2, 0xee, 0xe1, 0xe1, 0xee, 0xee, 0xe1, + 0xee, 0x14, 0xee, 0xf2, 0x14, 0x16, 0xe1, 0xe1, + 0xeb, 0xde, 0xde, 0xd7, 0xe0, 0xe0, 0xd0, 0xcb, + 0x73, 0xf2, 0xf2, 0xf2, 0x15, 0xa, 0x5a, 0x40, + 0x50, 0xa0, 0x6c, 0xa0, 0x60, 0xe, 0x30, 0x82, + 0x46, 0x8d, 0x28, 0x30, 0xe, 0x5e, 0x79, 0x9c, + 0xa8, 0x1f, 0x28, 0x98, 0x76, 0x5e, 0xfc, 0x1f, + 0x8d, 0x68, 0x68, 0x82, 0xe, 0x6c, 0x5e, 0x9c, + 0xa6, 0x12, 0x1f, 0x93, 0x8d, 0x5e, 0x28, 0x46, + 0x37, 0x5e, 0x98, 0x8f, 0x2f, 0xa0, 0x8d, 0x98, + 0x5e, 0x5e, 0x1f, 0x93, 0x82, 0x5e, 0x98, 0x62, + 0x2f, 0xa7, 0x8f, 0x62, 0xa8, 0xf0, 0x55, 0x98, + 0x5e, 0x5e, 0x46, 0x30, 0x32, 0x68, 0x79, 0x98, + 0xfc, 0xe, 0x9c, 0x8b, 0x76, 0xc, 0x27, 0x62, + 0x68, 0x79, 0x8b, 0x62, 0x30, 0x5c, 0x8f, 0x98, + 0x37, 0x2c, 0x60, 0x62, 0xac, 0x3e, 0x78, 0x4a, + 0x47, 0x5c, 0x8d, 0x8f, 0x98, 0x1f, 0x7d, 0x8b, + 0x79, 0x68, 0x76, + 0x68, 0x6c, 0xf7, 0xb7, 0xa0, 0xcc, 0xcb, 0xa, + 0x1, 0xf2, 0xf2, 0xfa, 0x7f, 0x48, 0x58, 0x6a, + 0x6a, 0x6a, 0x6f, 0x41, 0x3a, 0x7f, 0x48, 0x99, + 0x90, 0x90, 0x4a, 0x6a, 0x6f, 0x5d, 0x90, 0x90, + 0x5a, 0x7f, 0x9, 0x6e, 0x7f, 0x5a, 0xf4, 0x6f, + 0x6f, 0x5d, 0x90, 0x58, 0x58, 0x6f, 0x99, 0x54, + 0x70, 0x70, 0xf2, 0x34, 0x73, 0xf2, 0x15, 0x15, + 0xf1, 0x23, 0xea, 0x5a, 0xe5, 0x3, 0xd8, 0xee, + 0xeb, 0x34, 0x16, 0x3d, 0x3d, 0x15, 0xf2, 0xeb, + 0xf1, 0x73, 0x2b, 0x3d, 0xd8, 0x1, 0xf2, 0xf2, + 0x1, 0xf2, 0x3d, 0x14, 0x3d, 0xf2, 0x2b, 0x3d, + 0x1, 0xe6, 0x73, 0x48, 0x5a, 0xaf, 0x31, 0x67, + 0x99, 0x3, 0xeb, 0x3d, 0x34, 0x73, 0xfa, 0x34, + 0x6f, 0x9d, 0x6a, 0x4a, 0x6a, 0x8e, 0x6a, 0x71, + 0x85, 0x6f, 0x63, 0x80, 0x5d, 0x6a, 0x6f, 0x97, + 0x6a, 0x6a, 0x6a, 0x6a, 0xb0, 0x99, 0x9a, 0x4d, + 0x63, 0x71, 0x58, 0x80, 0x63, 0x4d, 0x67, 0x80, + 0x99, 0x97, 0x99, 0x31, 0x63, 0x9a, 0x58, 0x59, + 0x36, 0x71, 0x71, 0x5d, 0x6a, 0x71, 0x71, 0x6f, + 0x7a, 0x99, 0x80, 0x5d, 0x5d, 0x5d, 0x6a, 0x6a, + 0x5d, 0x58, 0x6b, 0x6f, 0x6f, 0x85, 0x90, 0x90, + 0x90, 0x99, 0x99, 0x3a, 0x42, 0x4d, 0x63, 0x48, + 0x3b, 0x17, 0x3d, 0x34, 0x70, 0x34, 0x73, 0xde, + 0x34, 0x67, 0x67, 0x48, 0x70, 0x3f, 0x70, 0x3f, + 0x3b, 0x3d, 0x14, 0x16, 0x14, 0xff, 0x14, 0x14, + 0x16, 0x3d, 0xfa, 0xf2, 0x3d, 0x17, 0x3d, 0xee, + 0x16, 0x14, 0x16, 0xf2, 0xee, 0xee, 0x3d, 0x16, + 0x16, 0x16, 0x34, 0xeb, 0xf2, 0x16, 0x16, 0xee, + 0x16, 0x16, 0xee, 0x16, 0x16, 0xf2, 0xe6, 0xe6, + 0xeb, 0xfa, 0xde, 0xeb, 0xe1, 0xf2, 0xe1, 0xe1, + 0xee, 0xee, 0xee, 0xee, 0x14, 0x16, 0xde, 0xde, + 0xe1, 0xf2, 0xf2, 0xe1, 0xde, 0xeb, 0xe1, 0xe1, + 0xe1, 0xee, 0xde, 0xe6, 0xcb, 0xfd, 0x97, 0xcb, + 0xa, 0xd8, 0x3d, 0x3b, 0x34, 0x2a, 0x99, 0x99, + 0x1b, 0x2f, 0x37, 0x9c, 0x7e, 0x30, 0x30, 0x8f, + 0x8f, 0x76, 0x43, 0x55, 0x60, 0xa7, 0x76, 0x62, + 0x55, 0x30, 0x46, 0x8b, 0x8b, 0x8d, 0x1f, 0x62, + 0x98, 0x5e, 0x79, 0x93, 0x60, 0xa0, 0x82, 0x7d, + 0x74, 0x12, 0x62, 0x62, 0x8d, 0x4e, 0x8d, 0x62, + 0x9c, 0x37, 0x7d, 0x8f, 0x55, 0x2f, 0x98, 0x8f, + 0x8d, 0x68, 0x5c, 0x62, 0x98, 0x8d, 0x93, 0x62, + 0x55, 0xa6, 0xaa, 0x8f, 0x74, 0x2f, 0x62, 0x8b, + 0x8d, 0x5e, 0x8b, 0x62, 0x8d, 0x5e, 0x98, 0x98, + 0x82, 0x2c, 0xaa, 0x7d, 0x82, 0x37, 0x62, 0x8b, + 0x8d, 0x82, 0x98, 0x98, 0x46, 0x82, 0xaa, 0x93, + 0x82, 0xa8, 0xaa, 0x94, 0x8f, 0x94, 0x8e, 0x57, + 0x4b, 0x43, 0x79, 0x8b, 0x98, 0x8d, 0x89, 0xab, + 0x89, 0x75, 0x43, + 0x5f, 0x9c, 0xa0, 0xba, 0xf8, 0x1b, 0x41, 0xea, + 0x70, 0xeb, 0x15, 0x3b, 0x48, 0x34, 0x6e, 0x88, + 0x58, 0x5d, 0x90, 0x6f, 0x90, 0x31, 0x31, 0x71, + 0x4d, 0x67, 0x9a, 0x9a, 0x99, 0x99, 0x54, 0x54, + 0xfa, 0x23, 0x23, 0x9, 0x26, 0x67, 0x1c, 0x36, + 0x63, 0x99, 0x7f, 0x70, 0x34, 0x73, 0xa, 0xa, + 0xfa, 0x34, 0x21, 0x70, 0x73, 0x34, 0xee, 0x3d, + 0xee, 0xf2, 0xf2, 0xee, 0xde, 0xde, 0xee, 0xf2, + 0xeb, 0x14, 0x16, 0x3b, 0x2b, 0xeb, 0xf2, 0x16, + 0x3d, 0x15, 0xeb, 0xeb, 0xf2, 0xee, 0x3d, 0xf2, + 0x73, 0x34, 0x14, 0x16, 0x16, 0xf2, 0x3d, 0x16, + 0x16, 0x16, 0x3d, 0x73, 0x73, 0x73, 0x73, 0x7f, + 0x90, 0x7f, 0x70, 0x3f, 0x1d, 0x34, 0x34, 0x70, + 0x39, 0xf1, 0x99, 0x90, 0x6a, 0x6a, 0x58, 0x71, + 0x81, 0x81, 0x6b, 0x71, 0x71, 0x85, 0x99, 0x67, + 0x63, 0x99, 0x6e, 0x99, 0x71, 0x71, 0x59, 0x59, + 0x59, 0x71, 0x85, 0x63, 0x67, 0x48, 0x1d, 0x7f, + 0x66, 0x99, 0x31, 0x59, 0x71, 0x71, 0x71, 0x59, + 0x63, 0x85, 0x85, 0x71, 0x71, 0x9a, 0x99, 0x99, + 0x9a, 0x59, 0x63, 0x67, 0x71, 0x58, 0x81, 0x81, + 0x5d, 0x6f, 0x90, 0x71, 0x6b, 0x6f, 0x26, 0x67, + 0x71, 0x71, 0x71, 0x59, 0x58, 0x6b, 0x81, 0x9a, + 0x67, 0x1d, 0x3f, 0x3f, 0x70, 0x21, 0x3f, 0x3b, + 0x3f, 0x63, 0x9a, 0x99, 0x42, 0x80, 0x2a, 0x6e, + 0x7f, 0x3f, 0x3f, 0x3f, 0x16, 0x17, 0x16, 0x3d, + 0x16, 0x3d, 0xf5, 0x16, 0x16, 0x15, 0x15, 0xf2, + 0x16, 0x16, 0x3b, 0x16, 0x16, 0xf2, 0x16, 0xf2, + 0x3b, 0x3d, 0x15, 0xde, 0xee, 0x16, 0x3d, 0xee, + 0x16, 0x16, 0xf2, 0xf2, 0xee, 0xf2, 0xde, 0xde, + 0xeb, 0xde, 0xe6, 0xe6, 0xe6, 0xde, 0xde, 0xde, + 0xeb, 0xf5, 0xf2, 0xe1, 0x16, 0xf2, 0xde, 0xde, + 0xe1, 0xe1, 0xde, 0xd7, 0xd7, 0xd7, 0xd7, 0xe6, + 0xde, 0xfa, 0xf9, 0x41, 0xfd, 0xb, 0xaf, 0xb4, + 0x73, 0x1, 0x34, 0xeb, 0xfa, 0xfd, 0x1b, 0x6a, + 0x55, 0x76, 0x5e, 0x7d, 0x7d, 0x76, 0x76, 0x8f, + 0xa8, 0x28, 0x5e, 0x82, 0x5f, 0x43, 0x5e, 0x98, + 0x98, 0x8d, 0x8d, 0x98, 0x93, 0x5e, 0x68, 0x82, + 0xa7, 0x7, 0x68, 0x8d, 0x8d, 0x68, 0x86, 0x8d, + 0x8d, 0x5e, 0x5e, 0x8d, 0x8d, 0x6c, 0x5e, 0x79, + 0x37, 0xb8, 0x82, 0x98, 0x8d, 0x68, 0x5e, 0x8d, + 0x68, 0x68, 0x8d, 0x8d, 0x5e, 0x7, 0x76, 0x82, + 0x76, 0xa0, 0x2f, 0x62, 0x82, 0x5e, 0x79, 0x8d, + 0x68, 0x5e, 0x28, 0x8d, 0x5e, 0x6c, 0x28, 0x5e, + 0x68, 0x5e, 0x82, 0x82, 0x5e, 0x5e, 0x8d, 0x5e, + 0x68, 0x6c, 0xa7, 0x28, 0x5e, 0x5e, 0xf7, 0x28, + 0x68, 0x5e, 0x8d, 0x82, 0x46, 0x46, 0x89, 0x89, + 0x82, 0x86, 0xfc, 0x37, 0x5e, 0x86, 0x75, 0x5e, + 0x75, 0x68, 0x68, + 0x74, 0x8f, 0x7d, 0x74, 0x7e, 0x4a, 0xb, 0xa, + 0x73, 0x15, 0x3b, 0xfa, 0x48, 0x3f, 0x63, 0x63, + 0x58, 0x85, 0x7a, 0x90, 0x9d, 0x31, 0x71, 0x31, + 0x9a, 0x71, 0x63, 0x7f, 0x42, 0x7f, 0x48, 0x73, + 0x15, 0x34, 0x21, 0x73, 0x54, 0x54, 0x1d, 0x48, + 0x54, 0x54, 0x48, 0x15, 0x16, 0x3d, 0x16, 0xf2, + 0xf2, 0x15, 0x15, 0x3b, 0xee, 0xee, 0x16, 0xee, + 0x16, 0xf2, 0xf2, 0x3d, 0x16, 0x16, 0x16, 0x16, + 0x3d, 0xf2, 0x3d, 0xeb, 0x73, 0x15, 0x3d, 0x15, + 0x15, 0xeb, 0xf2, 0x15, 0x3d, 0xf2, 0x16, 0x16, + 0x3d, 0x16, 0x16, 0x3d, 0x16, 0x16, 0x16, 0x3d, + 0x16, 0xf2, 0x3d, 0x3b, 0x70, 0x34, 0x3b, 0x3d, + 0xeb, 0xf2, 0x3d, 0x7f, 0x5a, 0x3, 0x39, 0x9a, + 0x58, 0x99, 0x67, 0x63, 0x6a, 0x90, 0x99, 0x85, + 0x6a, 0x83, 0x6f, 0x81, 0x6a, 0x6a, 0x85, 0x6b, + 0x6a, 0x6b, 0x9a, 0x59, 0x5d, 0x71, 0x80, 0x80, + 0x85, 0x97, 0x85, 0x6f, 0x90, 0x99, 0x90, 0x4d, + 0x4c, 0x6f, 0x80, 0x63, 0x71, 0x9a, 0x48, 0x99, + 0x9a, 0x80, 0x99, 0x5d, 0x6a, 0x5d, 0x6b, 0x59, + 0x71, 0x71, 0x99, 0x42, 0x9a, 0x99, 0x6e, 0x99, + 0x5d, 0x85, 0x90, 0x6a, 0x6a, 0x81, 0x6b, 0x71, + 0x6b, 0x5d, 0x58, 0x90, 0x5d, 0x7e, 0x2c, 0xa1, + 0x6f, 0x6b, 0x71, 0x58, 0x31, 0x63, 0x90, 0x58, + 0x58, 0x71, 0x9a, 0x7f, 0x67, 0x85, 0x99, 0x5a, + 0x90, 0x6f, 0x90, 0x39, 0x42, 0x36, 0x48, 0x2b, + 0x3d, 0x15, 0x16, 0x16, 0x14, 0x16, 0xeb, 0xf2, + 0x3b, 0x21, 0x23, 0xde, 0x15, 0x3d, 0xf2, 0xeb, + 0xf2, 0xee, 0xee, 0xee, 0xee, 0xf2, 0xde, 0xeb, + 0xf2, 0xeb, 0xde, 0xde, 0xde, 0xeb, 0xde, 0xf5, + 0xde, 0xe6, 0xe6, 0xd6, 0xde, 0xd7, 0xd6, 0xd6, + 0xe0, 0xf1, 0xd7, 0xd7, 0xd7, 0xd8, 0xd8, 0xde, + 0xeb, 0xde, 0xe0, 0xd6, 0xd7, 0xe0, 0xdb, 0xd3, + 0xd3, 0xe0, 0xed, 0xe5, 0xbf, 0xbf, 0xd2, 0xd6, + 0xeb, 0xeb, 0x15, 0xeb, 0xeb, 0x23, 0x11, 0x2c, + 0xa7, 0x6c, 0xfc, 0xe, 0x8, 0xdd, 0x9f, 0xfc, + 0xe, 0x1f, 0x5e, 0x5e, 0x68, 0x28, 0xfc, 0x5e, + 0x5e, 0x9f, 0x5e, 0xfc, 0xf7, 0x7, 0x68, 0x68, + 0x28, 0xfc, 0x5e, 0x5e, 0x9e, 0x5e, 0xa3, 0xfc, + 0xa3, 0x9f, 0xa3, 0x5e, 0xfc, 0x28, 0xa3, 0x9f, + 0xa3, 0x68, 0x1f, 0x5e, 0x4e, 0x5e, 0x86, 0xfc, + 0x1e, 0x7, 0x9f, 0x9f, 0x5e, 0xfc, 0x28, 0x68, + 0x86, 0x5e, 0xe, 0x12, 0x5e, 0x68, 0x7, 0x28, + 0xe, 0xdd, 0x7, 0x9f, 0x5e, 0x5e, 0xfc, 0x8d, + 0x5e, 0xa3, 0x6c, 0xe, 0x37, 0x6c, 0x7, 0x6c, + 0xfc, 0xe, 0xe, 0x5e, 0x68, 0x86, 0x1f, 0x1f, + 0x68, 0x5e, 0x76, 0x2c, 0x27, 0xe, 0x12, 0xa4, + 0xa7, 0x5e, 0xfc, 0x5c, 0x75, 0xa3, 0x68, 0x32, + 0x28, 0x32, 0x68, + 0x82, 0x28, 0xfc, 0x5f, 0xa9, 0x2c, 0xbf, 0xcb, + 0x73, 0x2a, 0x54, 0xfa, 0x67, 0x42, 0x6f, 0x5d, + 0x81, 0x81, 0x6f, 0x90, 0x7f, 0x41, 0x90, 0x9d, + 0x80, 0x85, 0x71, 0x9a, 0x80, 0x4d, 0xfe, 0x48, + 0xf2, 0xf2, 0x3d, 0x15, 0xeb, 0xeb, 0xeb, 0xeb, + 0x15, 0x34, 0x39, 0xfa, 0x16, 0x3d, 0x16, 0x3d, + 0x16, 0xf2, 0x16, 0x3d, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0x15, 0x23, 0x34, 0x3d, 0x16, 0x3b, + 0x15, 0xf2, 0xf2, 0xf2, 0xe1, 0xe1, 0xeb, 0xa, + 0xd8, 0x15, 0x15, 0x48, 0x34, 0xf2, 0x16, 0x16, + 0xff, 0x16, 0x16, 0x16, 0xf2, 0xf2, 0x16, 0x3d, + 0x15, 0xf2, 0x3d, 0x3b, 0xeb, 0x3d, 0xee, 0x34, + 0x3d, 0xf2, 0x34, 0xeb, 0xa, 0xcb, 0xea, 0x20, + 0x3e, 0x5d, 0x90, 0x58, 0x4a, 0x20, 0x99, 0x85, + 0x6a, 0x5d, 0x99, 0x6f, 0x6a, 0x60, 0x90, 0x5d, + 0x6a, 0x55, 0x6a, 0x5d, 0x6f, 0x90, 0x99, 0x85, + 0x6f, 0x99, 0x99, 0x90, 0x6f, 0x40, 0x41, 0x20, + 0x20, 0x4a, 0x6f, 0x83, 0x83, 0x4d, 0x7f, 0x42, + 0x6f, 0x90, 0x99, 0x90, 0x4a, 0x6f, 0x85, 0x83, + 0x4a, 0x90, 0x9a, 0x90, 0x5d, 0x9a, 0x7f, 0x99, + 0x5d, 0x6a, 0x6f, 0x5d, 0x6a, 0x5d, 0x83, 0x83, + 0x58, 0x3a, 0x41, 0x90, 0x6a, 0x6a, 0x90, 0x26, + 0x5d, 0x81, 0x6a, 0x90, 0x58, 0x58, 0x6a, 0x83, + 0x94, 0x6f, 0x90, 0x99, 0x58, 0x71, 0x63, 0x39, + 0x80, 0x71, 0x99, 0x5a, 0x54, 0x42, 0x6e, 0x73, + 0x73, 0x34, 0x15, 0xf5, 0x16, 0x17, 0x3d, 0xf2, + 0x3d, 0x15, 0xe6, 0xde, 0xee, 0xee, 0xf2, 0xf2, + 0x16, 0x34, 0xeb, 0xeb, 0xf2, 0x73, 0xd8, 0xde, + 0xeb, 0xf1, 0xe0, 0xd6, 0xd7, 0xd7, 0xd7, 0xcb, + 0xe6, 0xd3, 0xd3, 0xd6, 0xd7, 0xe0, 0xc4, 0xd2, + 0xd3, 0xd6, 0xd6, 0xd3, 0xd2, 0xd2, 0xd3, 0xd6, + 0xd8, 0xd6, 0xd2, 0xd2, 0xd3, 0xd6, 0xdb, 0xd2, + 0xd3, 0xd6, 0xed, 0xed, 0xd0, 0xbf, 0xb4, 0xcb, + 0xeb, 0x15, 0x15, 0x15, 0x15, 0xea, 0x20, 0x6a, + 0x60, 0xb7, 0xe, 0x12, 0x5f, 0x5f, 0x82, 0x98, + 0x62, 0x46, 0x8d, 0x98, 0x8d, 0x37, 0x46, 0x46, + 0x82, 0xdd, 0x9f, 0x46, 0x46, 0x8d, 0x68, 0x79, + 0x98, 0x46, 0x8d, 0x98, 0x8d, 0x5e, 0x28, 0x46, + 0x8d, 0x9f, 0x6c, 0x8d, 0x8d, 0x5e, 0x8d, 0x79, + 0x5e, 0x28, 0x46, 0x98, 0x8d, 0x7, 0x7, 0x46, + 0x8d, 0x28, 0x8d, 0x98, 0x86, 0x82, 0x93, 0x8d, + 0x82, 0x9f, 0x2c, 0x55, 0x8d, 0x5e, 0x5f, 0x89, + 0x46, 0x8d, 0x46, 0x98, 0x79, 0x4e, 0x98, 0x79, + 0x9f, 0x5e, 0xaa, 0x55, 0x98, 0x76, 0x64, 0x8f, + 0x8d, 0x98, 0x8f, 0x98, 0x5e, 0x8d, 0x98, 0x9c, + 0x68, 0x8d, 0x74, 0x60, 0x7e, 0x94, 0x65, 0x7e, + 0x62, 0x43, 0x8d, 0x8b, 0x79, 0x68, 0x75, 0x82, + 0x89, 0x86, 0x79, + 0x5e, 0x37, 0x12, 0xf3, 0xc, 0xa6, 0xe3, 0xd8, + 0x1, 0x15, 0x54, 0x54, 0x23, 0x26, 0x3a, 0x6a, + 0x5d, 0x6a, 0x58, 0x26, 0x39, 0x90, 0x83, 0x6f, + 0x26, 0x99, 0x5d, 0x85, 0x67, 0x99, 0x67, 0x48, + 0x3d, 0x3d, 0xeb, 0xeb, 0xf2, 0xf2, 0x15, 0xf2, + 0x16, 0xf2, 0xfa, 0xfa, 0xf2, 0xf2, 0x17, 0x15, + 0x16, 0xf2, 0xee, 0xf2, 0xee, 0xe1, 0xf2, 0x15, + 0xee, 0xee, 0x21, 0xf1, 0xd8, 0xeb, 0x15, 0xfa, + 0xeb, 0xeb, 0xf5, 0xeb, 0xee, 0xee, 0xf2, 0xeb, + 0xeb, 0x15, 0x17, 0xf9, 0xeb, 0xeb, 0x16, 0x16, + 0x14, 0x14, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0xf2, 0xf2, 0xf2, 0x34, 0x15, 0xeb, 0x3d, 0x3b, + 0x16, 0x16, 0xf2, 0x34, 0xeb, 0x15, 0x34, 0x39, + 0x97, 0x5a, 0x99, 0x90, 0x4a, 0x90, 0x71, 0x6b, + 0x6a, 0x5d, 0x71, 0x6f, 0x9d, 0x90, 0x99, 0x4a, + 0x6a, 0x7a, 0x90, 0x6a, 0x58, 0x63, 0x6f, 0x71, + 0x71, 0x4d, 0x48, 0x99, 0x9d, 0x5a, 0x54, 0x26, + 0x31, 0x90, 0xb4, 0xb0, 0x1b, 0x31, 0x4d, 0x63, + 0x6b, 0x9a, 0x42, 0x42, 0x71, 0x9a, 0x99, 0x99, + 0x58, 0x63, 0x66, 0x9d, 0x6a, 0x63, 0x59, 0x63, + 0x71, 0x6b, 0x85, 0x6f, 0x58, 0x66, 0x99, 0x99, + 0x66, 0x59, 0x58, 0x58, 0x6b, 0x6b, 0x85, 0x59, + 0x6b, 0x6b, 0x85, 0x99, 0x3a, 0x6f, 0x97, 0x97, + 0x6a, 0x6b, 0x71, 0x71, 0x71, 0x6b, 0x71, 0x63, + 0x63, 0x71, 0x7f, 0x73, 0x48, 0x67, 0x99, 0x99, + 0x7f, 0x99, 0x54, 0x34, 0x3d, 0x17, 0x15, 0x16, + 0xf2, 0x16, 0x16, 0xee, 0xee, 0x14, 0x16, 0x16, + 0x15, 0x48, 0x21, 0x15, 0x73, 0x54, 0xa, 0xd8, + 0xe6, 0xd8, 0xd7, 0xd8, 0xd8, 0xcb, 0xe0, 0xd9, + 0xd3, 0xd0, 0xd2, 0xd3, 0xd6, 0xd3, 0xd3, 0xd2, + 0xd3, 0xd3, 0xd6, 0xd0, 0xd3, 0xd2, 0xc4, 0xd4, + 0xd3, 0xd3, 0xc4, 0xd2, 0xd6, 0xd6, 0xd6, 0xd3, + 0xd7, 0xe0, 0x5a, 0x41, 0x97, 0x6f, 0x97, 0x7f, + 0xfa, 0x34, 0x15, 0x15, 0x15, 0x2a, 0x41, 0x6a, + 0x6a, 0x2c, 0x5f, 0x62, 0x94, 0x93, 0x46, 0x8f, + 0x8f, 0x7d, 0x76, 0x62, 0x62, 0xa7, 0x76, 0x8f, + 0x93, 0xa7, 0x79, 0x98, 0x98, 0x5e, 0x8d, 0x8b, + 0x98, 0x82, 0x82, 0x62, 0x93, 0x28, 0x82, 0x98, + 0x8d, 0x28, 0x8d, 0x8b, 0x98, 0x5e, 0x8d, 0x8b, + 0x8d, 0x5e, 0xc, 0x8f, 0x76, 0x6c, 0x5f, 0x98, + 0x8d, 0x5e, 0x8d, 0x8b, 0x8d, 0x5e, 0x76, 0x9c, + 0x46, 0x7, 0xa6, 0xaa, 0x8d, 0x28, 0x93, 0x8b, + 0x8d, 0x82, 0x93, 0x98, 0x8d, 0x75, 0x93, 0x93, + 0x79, 0x1e, 0xaa, 0x74, 0x82, 0x46, 0x62, 0x8f, + 0x8d, 0x8d, 0x98, 0x8f, 0x1e, 0x82, 0x9c, 0xa8, + 0x28, 0x37, 0x74, 0x55, 0x98, 0x8b, 0x8b, 0x65, + 0x62, 0x79, 0x8d, 0x98, 0x82, 0x43, 0x43, 0x93, + 0xa9, 0x5e, 0x43, + 0xa8, 0xa8, 0x30, 0x60, 0x60, 0x6a, 0x6f, 0x48, + 0x15, 0x15, 0xf2, 0x15, 0x34, 0x39, 0x6e, 0x99, + 0x99, 0x6f, 0x58, 0x59, 0x4d, 0x58, 0x5d, 0x6f, + 0x59, 0x63, 0x80, 0x73, 0x73, 0x73, 0xeb, 0xf2, + 0x34, 0x73, 0xeb, 0xfa, 0x15, 0x3d, 0x3b, 0x15, + 0x18, 0x16, 0xf2, 0x15, 0x16, 0x16, 0xee, 0xee, + 0x16, 0xf2, 0x34, 0x2b, 0x3d, 0x16, 0x15, 0xf2, + 0xf2, 0x16, 0xee, 0xeb, 0xf2, 0xee, 0xeb, 0xf1, + 0xeb, 0xf5, 0x34, 0xf9, 0x15, 0x15, 0x15, 0xeb, + 0xf2, 0xf2, 0x15, 0x15, 0xe1, 0x16, 0x16, 0x17, + 0x14, 0x14, 0x17, 0x3b, 0x16, 0x14, 0x16, 0x14, + 0x14, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x16, 0x73, + 0x3d, 0x15, 0x3d, 0x3b, 0x3d, 0x16, 0x3d, 0x34, + 0xfa, 0x73, 0x70, 0x99, 0x99, 0x80, 0x85, 0x71, + 0x6a, 0x81, 0x6b, 0x6b, 0x71, 0x66, 0x99, 0x80, + 0x90, 0x99, 0x99, 0x6b, 0x71, 0x71, 0x71, 0x85, + 0x71, 0x9a, 0x80, 0x99, 0x9a, 0x48, 0x7f, 0x4d, + 0x9a, 0x7f, 0x7f, 0x63, 0x71, 0x71, 0x59, 0x58, + 0x71, 0x71, 0x63, 0x80, 0x71, 0x80, 0x67, 0x66, + 0x9a, 0x7f, 0x7f, 0x71, 0x81, 0x71, 0x6b, 0x71, + 0x71, 0x6a, 0x85, 0x99, 0x9a, 0x66, 0x42, 0x7f, + 0x63, 0x58, 0x71, 0x71, 0x71, 0x59, 0x6b, 0x71, + 0x71, 0x71, 0x58, 0x63, 0x58, 0x90, 0x48, 0x99, + 0x6f, 0x71, 0x71, 0x71, 0x71, 0x71, 0x71, 0x99, + 0x80, 0x71, 0x2e, 0x42, 0x59, 0x71, 0x59, 0x59, + 0x4d, 0x67, 0x70, 0x34, 0x3d, 0x3d, 0xf2, 0x16, + 0x16, 0x16, 0x14, 0x16, 0x16, 0x14, 0x16, 0x3d, + 0xf2, 0x34, 0x54, 0xa, 0xa, 0xcb, 0xe0, 0xe0, + 0x3, 0xd0, 0xdb, 0xcb, 0xcb, 0xd4, 0xe4, 0xd1, + 0xd0, 0xd2, 0xd1, 0xc4, 0xd2, 0xd2, 0xd6, 0xd3, + 0xd2, 0xc4, 0xd2, 0xd3, 0xd3, 0xe7, 0xcc, 0xc7, + 0xd2, 0xd3, 0xd3, 0xd3, 0xd2, 0xd3, 0xd3, 0xd6, + 0xd7, 0xcb, 0x50, 0x3e, 0x4a, 0xb, 0xb, 0xc9, + 0xeb, 0x15, 0xeb, 0x15, 0xa, 0x5a, 0x50, 0x55, + 0x27, 0x30, 0x37, 0x93, 0x46, 0xe, 0x30, 0x98, + 0x93, 0xa7, 0xa0, 0x30, 0x62, 0x28, 0x8d, 0x8d, + 0x46, 0x1e, 0x5e, 0x79, 0x8d, 0x28, 0xfc, 0x62, + 0x8d, 0x28, 0x28, 0x46, 0x30, 0x28, 0x68, 0x79, + 0x5e, 0xfc, 0x1f, 0x8d, 0x8d, 0x5e, 0x7, 0x1f, + 0x37, 0x6c, 0x9f, 0x8d, 0x37, 0x1f, 0x5e, 0x86, + 0x68, 0x68, 0x1f, 0x46, 0x68, 0x5e, 0xb7, 0x2c, + 0xe, 0x1e, 0x28, 0x37, 0x5e, 0xfc, 0x46, 0x8d, + 0x68, 0x68, 0x37, 0x2c, 0x4e, 0x68, 0x6c, 0x37, + 0x1f, 0x1f, 0x8d, 0x8d, 0x68, 0x28, 0x30, 0x30, + 0x5e, 0x68, 0x6c, 0xf3, 0xe, 0x5e, 0x5e, 0x28, + 0x5e, 0x37, 0x82, 0x8d, 0x5e, 0x8d, 0x43, 0x30, + 0x33, 0xe, 0x68, 0x5e, 0x28, 0x1e, 0x28, 0x75, + 0x32, 0x86, 0x32, + 0x60, 0x9c, 0xa7, 0x74, 0x6a, 0x7a, 0x90, 0x54, + 0x70, 0x3b, 0x3d, 0x3b, 0x70, 0x54, 0x48, 0x1d, + 0x42, 0x71, 0x71, 0x9a, 0x63, 0x58, 0x71, 0x71, + 0x9a, 0x99, 0x54, 0x3d, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x3d, 0x34, 0xeb, 0x1, 0xeb, 0x1, 0x3d, + 0x16, 0x16, 0x16, 0x14, 0x16, 0xee, 0x16, 0x16, + 0x16, 0x16, 0xf2, 0xf2, 0x14, 0xeb, 0xde, 0xeb, + 0xeb, 0xde, 0xd8, 0xeb, 0xeb, 0xf2, 0xf2, 0xde, + 0xeb, 0xeb, 0xf1, 0xed, 0xe0, 0xe0, 0xe0, 0xd8, + 0xde, 0xe6, 0xd8, 0xc0, 0xf5, 0x3d, 0x14, 0x18, + 0x3d, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3d, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3d, 0x16, + 0x3d, 0x3f, 0x3d, 0x3b, 0xf2, 0x3d, 0x70, 0x42, + 0x7f, 0x1d, 0x59, 0x67, 0x48, 0x48, 0x67, 0x85, + 0xb0, 0xb0, 0x90, 0x90, 0x5d, 0x5d, 0x71, 0x6b, + 0x5d, 0x58, 0x59, 0x71, 0x6a, 0x6b, 0x85, 0x67, + 0x80, 0x7f, 0x70, 0x67, 0x26, 0x63, 0x6f, 0x6a, + 0x87, 0x90, 0x1c, 0x9a, 0x9a, 0x99, 0x7f, 0x67, + 0x59, 0x63, 0x9a, 0x85, 0x5d, 0x58, 0x58, 0x5d, + 0x5d, 0x80, 0x42, 0x9a, 0x6f, 0x85, 0x9a, 0x80, + 0x5d, 0x81, 0x6a, 0x5d, 0x5d, 0x58, 0x4d, 0x4d, + 0x6f, 0x71, 0x63, 0x67, 0x31, 0x9a, 0x9a, 0x83, + 0x5d, 0x59, 0x58, 0x81, 0x6a, 0x6a, 0x58, 0x58, + 0x6a, 0x5d, 0x90, 0x80, 0x97, 0x90, 0xaf, 0x99, + 0x6f, 0x71, 0x71, 0x6b, 0x6b, 0x81, 0x71, 0x58, + 0x26, 0x48, 0x3d, 0x16, 0x15, 0x34, 0x3d, 0xee, + 0xeb, 0xde, 0xee, 0x3d, 0xf2, 0x15, 0x3d, 0x3d, + 0x3d, 0x2b, 0xeb, 0xd8, 0xcb, 0xe6, 0xed, 0xe7, + 0xbf, 0xe4, 0xf3, 0xf3, 0xbf, 0xc7, 0xc2, 0xc2, + 0xc4, 0xd3, 0xd3, 0xd2, 0xc4, 0xc4, 0xdb, 0xdb, + 0xd3, 0xc4, 0xc4, 0xd2, 0xd3, 0xd3, 0xd2, 0xc2, + 0xc4, 0xd3, 0xd6, 0xd3, 0xc4, 0xd2, 0xd3, 0xd9, + 0xd6, 0xdb, 0xc7, 0xbe, 0xc7, 0xd0, 0xe0, 0xde, + 0xee, 0xee, 0xe1, 0xe1, 0xea, 0x50, 0xe, 0xe, + 0x2f, 0xa7, 0x6c, 0x37, 0x5e, 0xa0, 0xf7, 0x5e, + 0x5e, 0xa3, 0x5e, 0x1f, 0x8d, 0x4e, 0x68, 0x68, + 0x68, 0x28, 0x6c, 0x5e, 0x5e, 0x9f, 0x28, 0x5e, + 0x5e, 0xa3, 0x68, 0x5e, 0x5e, 0x68, 0xa3, 0x9e, + 0x5e, 0x9f, 0x7, 0x7, 0xa3, 0x9e, 0x5e, 0x28, + 0x5e, 0x9e, 0x5e, 0x4e, 0x68, 0x86, 0x9f, 0x68, + 0x68, 0x68, 0x6c, 0x9f, 0x5e, 0x9e, 0x9f, 0x5e, + 0x5e, 0x86, 0x5e, 0x5e, 0x68, 0x68, 0x6c, 0x7, + 0x5e, 0xa3, 0x28, 0x46, 0x75, 0x68, 0x5e, 0x8d, + 0x68, 0x68, 0x5e, 0x28, 0x6c, 0x68, 0x76, 0xb7, + 0x8, 0x5e, 0x5e, 0x37, 0x5e, 0x5e, 0x5e, 0x5e, + 0x68, 0x68, 0x82, 0xa7, 0xb8, 0xa7, 0x82, 0x38, + 0xa9, 0x1e, 0x43, 0x82, 0x5e, 0x68, 0x75, 0x86, + 0x68, 0x68, 0x75, + 0x30, 0x1e, 0x82, 0xa7, 0x40, 0x5a, 0xc9, 0x73, + 0xeb, 0xeb, 0xfa, 0x21, 0x36, 0x4d, 0x58, 0x71, + 0x71, 0x71, 0x6a, 0x99, 0x7f, 0x66, 0x4d, 0x9a, + 0x99, 0x3, 0x80, 0x48, 0x16, 0x16, 0x18, 0x16, + 0x14, 0x16, 0xeb, 0xf2, 0xee, 0xee, 0xe1, 0xde, + 0xf2, 0xeb, 0xeb, 0xf2, 0x3d, 0xf2, 0x15, 0xf2, + 0xf2, 0x14, 0xee, 0xee, 0xf2, 0xe1, 0xd8, 0xde, + 0xd7, 0xe0, 0xd3, 0xed, 0x39, 0xfa, 0xde, 0xde, + 0xeb, 0xe6, 0xe6, 0xd7, 0xd6, 0xbf, 0xd2, 0xd9, + 0xed, 0xd6, 0xd3, 0xd0, 0xe6, 0x15, 0x17, 0x16, + 0x17, 0x3d, 0x14, 0x16, 0x16, 0x3d, 0x2b, 0xeb, + 0x16, 0x16, 0x3d, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x3d, 0x3d, 0xf2, 0xf2, 0x3d, 0x3d, 0x70, 0x90, + 0x99, 0x31, 0x71, 0x6b, 0x6b, 0x63, 0x63, 0x90, + 0x6e, 0x67, 0x99, 0x5d, 0x83, 0x83, 0x6a, 0x6a, + 0x6a, 0x6b, 0x71, 0x6f, 0x81, 0x5d, 0x9a, 0x54, + 0x54, 0x70, 0x7f, 0x9a, 0x6f, 0x6f, 0x6a, 0x6a, + 0x83, 0x6a, 0x63, 0x6e, 0x7f, 0x48, 0x42, 0x7f, + 0x67, 0x67, 0x80, 0x6f, 0x83, 0x90, 0x5d, 0x81, + 0x5d, 0x5d, 0x58, 0x99, 0x90, 0x71, 0x71, 0x6a, + 0x6a, 0x81, 0x81, 0x6a, 0x6a, 0x71, 0x58, 0x9a, + 0x97, 0x6f, 0x85, 0x9d, 0x90, 0x3a, 0x4d, 0x5d, + 0x6f, 0x63, 0x97, 0x6a, 0x55, 0x6a, 0x6a, 0x91, + 0x6a, 0x6a, 0x6b, 0x5d, 0x6f, 0x63, 0x67, 0x67, + 0x58, 0x71, 0x6f, 0x5d, 0x6a, 0x6f, 0x6a, 0x97, + 0x6e, 0x34, 0x3b, 0x22, 0x3b, 0x3b, 0x16, 0x16, + 0xee, 0xee, 0xf2, 0x15, 0xf2, 0xe1, 0xee, 0x3d, + 0x2b, 0x48, 0x15, 0x48, 0x23, 0x23, 0x26, 0xfd, + 0xb, 0xbf, 0xcd, 0xdd, 0xc1, 0xc2, 0xc2, 0xd1, + 0xd1, 0xc4, 0xd0, 0xd2, 0xd2, 0xc4, 0xd2, 0xc4, + 0xd2, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, 0xd2, + 0xd2, 0xd2, 0xd3, 0xd6, 0xd3, 0xd3, 0xd2, 0xd0, + 0xd3, 0xd6, 0xd0, 0xd4, 0xbf, 0xd0, 0xe0, 0xde, + 0xee, 0x15, 0xf2, 0x15, 0x48, 0x20, 0xf0, 0x5f, + 0x9c, 0xa0, 0xf3, 0x5f, 0x9c, 0x37, 0x28, 0x82, + 0x46, 0x5e, 0x68, 0x8d, 0x98, 0x6c, 0x6c, 0xa7, + 0x79, 0x86, 0x6c, 0x46, 0x82, 0x68, 0x5e, 0x8d, + 0x8d, 0x28, 0x5e, 0x98, 0x8d, 0x68, 0x6c, 0x5f, + 0x79, 0x9f, 0x28, 0x82, 0x1f, 0x5e, 0x5e, 0x98, + 0x79, 0x68, 0xfc, 0x82, 0x8d, 0x68, 0x28, 0xa8, + 0x37, 0x4e, 0x5e, 0x98, 0x5e, 0xfc, 0x8d, 0x93, + 0x82, 0x5e, 0x5f, 0xaa, 0x82, 0x68, 0x8d, 0x2f, + 0x2f, 0x1f, 0x8b, 0x8f, 0x98, 0x79, 0x62, 0x98, + 0x8d, 0x68, 0x9c, 0x3e, 0xa8, 0xa7, 0x93, 0x62, + 0x1f, 0x1f, 0x98, 0x93, 0x8d, 0x5e, 0x46, 0x98, + 0x28, 0x8d, 0x74, 0x60, 0x50, 0x27, 0x78, 0x94, + 0x8f, 0x5c, 0x1f, 0x62, 0x98, 0x75, 0x79, 0x98, + 0x5f, 0x28, 0x8d, + 0x37, 0x37, 0xa7, 0xa0, 0xa1, 0x5a, 0xe6, 0xe1, + 0xee, 0xf2, 0x15, 0x34, 0x59, 0x6b, 0x8f, 0x7e, + 0x5d, 0x85, 0x6a, 0x31, 0x42, 0x7f, 0x3a, 0x99, + 0x99, 0x99, 0x41, 0x70, 0x3d, 0x16, 0xf2, 0x16, + 0x16, 0xf2, 0xee, 0xee, 0xee, 0xee, 0xf2, 0xf2, + 0xee, 0xeb, 0xe6, 0xeb, 0x15, 0xeb, 0xd8, 0xde, + 0xde, 0xeb, 0xee, 0xe1, 0xf2, 0xde, 0xd8, 0xd8, + 0xe6, 0xd6, 0xd3, 0xed, 0xed, 0xe0, 0xe6, 0xe0, + 0xde, 0xd7, 0xd6, 0xd7, 0xe0, 0xd0, 0xd2, 0xd3, + 0xea, 0xe0, 0xd7, 0xd8, 0xeb, 0xeb, 0xee, 0xee, + 0x15, 0xee, 0x16, 0x16, 0x15, 0xf2, 0xee, 0xf2, + 0x16, 0x16, 0x3d, 0x14, 0x16, 0x14, 0xf5, 0xf2, + 0xf2, 0xf2, 0x3d, 0xf2, 0x3b, 0x3d, 0x15, 0x54, + 0x6e, 0x58, 0x6a, 0x6a, 0x6a, 0x6b, 0x71, 0x6b, + 0x58, 0x4d, 0x58, 0x85, 0x99, 0x9a, 0x71, 0x71, + 0x6a, 0x5d, 0x71, 0x85, 0x85, 0x71, 0x80, 0x99, + 0x70, 0x3f, 0x42, 0x9a, 0x90, 0x90, 0x90, 0x66, + 0x99, 0x85, 0x90, 0x99, 0x54, 0x42, 0x42, 0x59, + 0x80, 0x48, 0x42, 0x31, 0x99, 0x90, 0x85, 0x6f, + 0x6f, 0x6b, 0x85, 0x9a, 0x85, 0x71, 0x71, 0x71, + 0x81, 0x71, 0x6b, 0x71, 0x85, 0x71, 0x71, 0x99, + 0x56, 0x58, 0x71, 0x3c, 0x58, 0x85, 0x59, 0x58, + 0x6f, 0x66, 0x7f, 0x90, 0x6f, 0x90, 0x85, 0x6a, + 0x6a, 0x6b, 0x6a, 0x6a, 0x81, 0x71, 0x58, 0x58, + 0x58, 0x71, 0x99, 0x6b, 0x90, 0x90, 0x56, 0x6f, + 0x99, 0x48, 0x21, 0x4d, 0x42, 0x3b, 0x16, 0x16, + 0x16, 0xf2, 0x3b, 0x48, 0x15, 0x16, 0x16, 0x16, + 0x70, 0x48, 0x34, 0x21, 0x23, 0x54, 0x7f, 0x23, + 0xf1, 0xf4, 0xc5, 0xcd, 0xce, 0xc2, 0xe7, 0xec, + 0xbf, 0xc4, 0xd1, 0xd2, 0xd3, 0xd2, 0xc4, 0xc4, + 0xd2, 0xd9, 0xd6, 0xd2, 0xc4, 0xc4, 0xd3, 0xd9, + 0xd3, 0xd2, 0xc4, 0xd2, 0xd6, 0xd6, 0xd3, 0xd2, + 0xd6, 0xd7, 0xe0, 0x5a, 0xb0, 0xbf, 0xcb, 0xd8, + 0xeb, 0xf2, 0x34, 0x34, 0x23, 0xfd, 0x41, 0x3e, + 0x74, 0x5f, 0xe, 0x27, 0x7e, 0x8d, 0x5e, 0x98, + 0x62, 0x46, 0x28, 0x8d, 0x8b, 0x37, 0xf3, 0x55, + 0x98, 0x68, 0x5e, 0x46, 0x30, 0x8d, 0x68, 0x98, + 0x8b, 0x1f, 0x46, 0x74, 0x79, 0x5e, 0x37, 0x30, + 0x98, 0x68, 0x79, 0x8b, 0x62, 0x1e, 0x8d, 0x98, + 0x8d, 0x68, 0x46, 0x5f, 0x82, 0x68, 0x68, 0x46, + 0x46, 0x5e, 0x8d, 0x98, 0x8d, 0x1f, 0x93, 0x74, + 0x82, 0x5e, 0x2f, 0x3e, 0xa7, 0x32, 0x8d, 0x62, + 0x46, 0x46, 0x98, 0x8f, 0x98, 0x8d, 0x30, 0x7d, + 0xa7, 0x76, 0x74, 0x60, 0x38, 0x8d, 0x8b, 0x98, + 0x1f, 0x30, 0x98, 0x93, 0x5e, 0x5e, 0x62, 0x30, + 0x28, 0x82, 0x93, 0x74, 0x3e, 0x62, 0x62, 0x8f, + 0x8f, 0x5c, 0x5c, 0x62, 0x79, 0x68, 0x68, 0x79, + 0x5c, 0xf7, 0x76, + 0x9c, 0xa6, 0xf3, 0x2f, 0x83, 0xb4, 0x8a, 0x2b, + 0x3d, 0x16, 0x3b, 0x3f, 0x1d, 0x99, 0x83, 0x83, + 0x6f, 0x9a, 0x7f, 0x63, 0x71, 0x71, 0x58, 0x7f, + 0x23, 0x99, 0x73, 0xf2, 0x16, 0x3d, 0xee, 0x16, + 0x16, 0xeb, 0xe1, 0x14, 0x14, 0x3d, 0xf2, 0xf2, + 0x16, 0xf2, 0xf5, 0xeb, 0xeb, 0xfa, 0xd7, 0xd8, + 0xea, 0xd0, 0xe0, 0xf9, 0xfe, 0xf9, 0xdb, 0xe6, + 0xe6, 0xd7, 0xd6, 0xd9, 0xd3, 0xd3, 0xd3, 0xd6, + 0xd9, 0xd0, 0xd2, 0xd3, 0xd9, 0xd9, 0xd6, 0xd8, + 0xcb, 0xd8, 0xde, 0xeb, 0xf2, 0x73, 0xf2, 0xee, + 0xf2, 0x15, 0x3f, 0x16, 0x16, 0x14, 0x14, 0xff, + 0x16, 0xf2, 0x16, 0x14, 0x16, 0x3d, 0x2b, 0x3d, + 0x15, 0x3b, 0x1d, 0x42, 0x70, 0x22, 0x1d, 0x70, + 0x3f, 0x9a, 0x5d, 0x6f, 0x6f, 0x6b, 0x6b, 0x81, + 0x81, 0x71, 0x71, 0x71, 0x59, 0x59, 0x71, 0x80, + 0x9a, 0x85, 0x71, 0x58, 0x4d, 0x67, 0x67, 0x80, + 0x99, 0x1d, 0x2e, 0x54, 0x54, 0x73, 0x6e, 0x54, + 0x73, 0xa, 0x99, 0x99, 0x54, 0x48, 0x42, 0x80, + 0x99, 0x80, 0x36, 0x1d, 0x3f, 0x48, 0x99, 0x58, + 0x42, 0x99, 0x85, 0x71, 0x71, 0x59, 0x59, 0x71, + 0x9a, 0x85, 0x71, 0x4d, 0x67, 0x9a, 0x71, 0x71, + 0x63, 0x3a, 0x71, 0x71, 0x71, 0x59, 0x59, 0x31, + 0x9a, 0x66, 0x59, 0x58, 0x31, 0x67, 0x9a, 0x81, + 0x6a, 0x90, 0x5d, 0x91, 0x6a, 0x81, 0x6b, 0x71, + 0x63, 0x6f, 0x71, 0x71, 0x90, 0x99, 0x99, 0x9a, + 0x99, 0x48, 0x48, 0x7f, 0x99, 0x70, 0x3b, 0x3f, + 0x15, 0x3f, 0x48, 0x67, 0x54, 0x17, 0x17, 0x3d, + 0x3d, 0xf2, 0x3d, 0x34, 0xeb, 0x73, 0xa, 0xa, + 0xfa, 0xf1, 0xe5, 0xf3, 0xdd, 0xdc, 0xf0, 0x50, + 0xc7, 0xc7, 0xc4, 0xd2, 0xd6, 0xd3, 0xc4, 0xc4, + 0xd2, 0xd3, 0xd9, 0xdb, 0xd1, 0xc4, 0xd2, 0xd9, + 0xd9, 0xd2, 0xc4, 0xd2, 0xd6, 0xd6, 0xd3, 0xd2, + 0xd0, 0xd3, 0xe0, 0x1b, 0x83, 0xa1, 0xd3, 0xde, + 0xf5, 0xf2, 0xeb, 0xeb, 0x1c, 0x20, 0x11, 0x55, + 0x8f, 0x68, 0x28, 0x46, 0x98, 0x5e, 0x5e, 0x82, + 0x46, 0x8d, 0x6c, 0x28, 0x8d, 0x5e, 0x5e, 0x79, + 0x8d, 0x5e, 0x9e, 0x37, 0x8d, 0x68, 0x68, 0x6c, + 0x82, 0x5e, 0x68, 0x28, 0x5e, 0x68, 0x68, 0x8d, + 0x32, 0x68, 0x4e, 0x82, 0x5e, 0x68, 0x5e, 0x7, + 0x6c, 0xa3, 0x28, 0x5e, 0x68, 0xa3, 0x68, 0x68, + 0x68, 0x68, 0xa3, 0x6c, 0x7, 0x5e, 0x68, 0xa0, + 0x8, 0x5e, 0x32, 0x8d, 0x68, 0x68, 0x68, 0x79, + 0x68, 0x68, 0x8d, 0x8d, 0x5e, 0x86, 0x68, 0x28, + 0x7, 0x68, 0x8d, 0x79, 0x5e, 0x5e, 0x5e, 0x5e, + 0x5e, 0x5e, 0x5e, 0x6c, 0xb8, 0x5e, 0x5e, 0x68, + 0x68, 0x68, 0x5e, 0x32, 0x32, 0x5e, 0x43, 0x43, + 0x43, 0x7, 0x6c, 0x86, 0x5e, 0x5e, 0x86, 0x68, + 0x68, 0x68, 0x68, + 0x74, 0x55, 0x55, 0x74, 0x6a, 0xaf, 0x6e, 0x3f, + 0x2b, 0x3d, 0x15, 0x73, 0x42, 0x3f, 0x42, 0x63, + 0x71, 0x58, 0x36, 0x42, 0x59, 0x71, 0x85, 0x80, + 0x36, 0x54, 0xf2, 0x14, 0x14, 0x3d, 0xee, 0x16, + 0x16, 0x3d, 0xf2, 0x3d, 0x3d, 0xeb, 0xe1, 0xf2, + 0xf2, 0xeb, 0xeb, 0xde, 0x6e, 0xf1, 0xd8, 0xe6, + 0xfd, 0xd1, 0xd2, 0xdb, 0xdb, 0xd4, 0xd0, 0xd2, + 0xd2, 0xd6, 0xd6, 0xd6, 0xd2, 0xd2, 0xd3, 0xd9, + 0xed, 0xc4, 0xd2, 0xc4, 0xd3, 0xe0, 0xcb, 0xcb, + 0xcb, 0xde, 0xde, 0xf2, 0x3d, 0xeb, 0xf2, 0x16, + 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x17, 0x3d, 0x16, + 0x16, 0x3b, 0x16, 0x3d, 0x16, 0x3d, 0xf2, 0x70, + 0x1d, 0x7f, 0x9a, 0x90, 0x99, 0x63, 0x85, 0x85, + 0x58, 0x81, 0x91, 0x81, 0x6f, 0x81, 0x81, 0x90, + 0x90, 0x71, 0x58, 0x83, 0x85, 0x6b, 0x6b, 0x6b, + 0x6b, 0x6b, 0x71, 0x80, 0x73, 0x2b, 0x3b, 0x73, + 0x73, 0x73, 0x73, 0x73, 0xd8, 0x54, 0x99, 0x7f, + 0xeb, 0x3b, 0x34, 0x15, 0x3d, 0x3d, 0x34, 0x73, + 0xf4, 0x6e, 0x99, 0x5a, 0xa, 0x7f, 0x90, 0x90, + 0x99, 0x7f, 0x80, 0x5a, 0x99, 0x7f, 0x80, 0x80, + 0x99, 0x80, 0x71, 0x71, 0x71, 0x6b, 0x71, 0x5d, + 0x6a, 0x71, 0x71, 0x6a, 0x97, 0x99, 0x58, 0x6f, + 0x5a, 0x99, 0x9d, 0x6a, 0x6a, 0x81, 0x6a, 0x6a, + 0x83, 0x99, 0x90, 0x6a, 0x83, 0xaf, 0x6f, 0x7e, + 0x6a, 0x6a, 0x6a, 0x6a, 0x47, 0x6f, 0x6b, 0x5d, + 0x80, 0x54, 0x70, 0x2b, 0x2b, 0x15, 0x2a, 0x7f, + 0x90, 0x6f, 0x90, 0x58, 0x63, 0x7f, 0x34, 0x15, + 0x3d, 0x3d, 0x15, 0xeb, 0x1, 0xde, 0xde, 0xe6, + 0xea, 0xcb, 0xd9, 0xe7, 0xe7, 0xd1, 0xc2, 0xc2, + 0xc2, 0xc4, 0xc4, 0xc4, 0xc4, 0xd2, 0xd3, 0xd2, + 0xd2, 0xc4, 0xd2, 0xd3, 0xd2, 0xd2, 0xc4, 0xc4, + 0xd2, 0xd3, 0xd3, 0xd3, 0xd2, 0xd2, 0xd3, 0xd9, + 0xdb, 0xdb, 0xbf, 0xbf, 0xcc, 0xbf, 0xd6, 0xeb, + 0xf2, 0xee, 0xf2, 0x34, 0x20, 0x2f, 0x1e, 0x28, + 0xfc, 0x5e, 0x68, 0x9f, 0x9f, 0x5e, 0xf7, 0x8, + 0x68, 0x9f, 0x4e, 0x28, 0x68, 0x68, 0xa3, 0xa3, + 0x68, 0x86, 0x5e, 0x7, 0x9f, 0xa3, 0xfc, 0xf7, + 0x68, 0x86, 0x5e, 0x5e, 0x28, 0x68, 0xa3, 0x68, + 0x9f, 0xa3, 0xf, 0x7, 0x9f, 0x68, 0x68, 0x37, + 0x86, 0x5e, 0x68, 0x86, 0x32, 0xa3, 0x68, 0x68, + 0x9f, 0xa3, 0x28, 0x8, 0x68, 0xa3, 0x5e, 0x5e, + 0x1f, 0x68, 0x5e, 0x5e, 0x6c, 0xfc, 0xfc, 0x5e, + 0x9f, 0x9f, 0xa3, 0x1e, 0x5e, 0xa3, 0x5e, 0x5e, + 0xfc, 0xfc, 0x8d, 0x5e, 0x6c, 0x6c, 0xfc, 0x37, + 0xb8, 0x6c, 0x5e, 0xfc, 0xfc, 0x5e, 0x8d, 0x8d, + 0x68, 0xfc, 0x1f, 0x5e, 0x7, 0xb8, 0xbd, 0xf6, + 0x1f, 0xf7, 0xfc, 0x75, 0x32, 0x32, 0x1e, 0x79, + 0x75, 0x86, 0x5e, + 0x28, 0x76, 0x6c, 0x37, 0xa6, 0x3, 0xd8, 0xd8, + 0xf2, 0x15, 0xf2, 0x80, 0x63, 0x6b, 0x58, 0x6b, + 0x6b, 0x71, 0x99, 0x1d, 0x67, 0x7f, 0x3, 0x54, + 0x54, 0xeb, 0xeb, 0x16, 0x3d, 0x3d, 0x3d, 0x16, + 0x16, 0xf2, 0x34, 0xee, 0xf2, 0xeb, 0xeb, 0xeb, + 0xcb, 0xe0, 0xd3, 0xe0, 0xed, 0x5a, 0xe0, 0xd7, + 0xd0, 0xdb, 0xd2, 0xd2, 0xd3, 0xd2, 0xd2, 0xdb, + 0xd2, 0xd2, 0xd2, 0xd9, 0xd9, 0xd2, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, 0xcb, 0xd8, + 0xd8, 0xf1, 0xde, 0xf2, 0x15, 0xfa, 0x16, 0xf2, + 0x3d, 0xf2, 0xf2, 0xf2, 0x15, 0xeb, 0x15, 0x16, + 0x3d, 0x3f, 0x70, 0x3d, 0x3b, 0x3f, 0x70, 0x70, + 0x99, 0x31, 0x5a, 0x5a, 0x5a, 0x90, 0x6a, 0x6a, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x91, 0x6a, 0x99, + 0x99, 0x71, 0x6b, 0x71, 0x6f, 0x5d, 0x71, 0x71, + 0x6a, 0x83, 0x4d, 0x54, 0xee, 0x16, 0x16, 0xee, + 0x16, 0x1, 0x1, 0x1, 0xde, 0xe6, 0x99, 0x3, + 0x73, 0xeb, 0x3d, 0x16, 0x16, 0x3d, 0x3d, 0xf2, + 0xeb, 0xeb, 0xa, 0xcb, 0xfa, 0x23, 0xf9, 0x5a, + 0xe6, 0x48, 0x26, 0xa, 0xeb, 0x34, 0x67, 0x99, + 0x73, 0x67, 0x31, 0x85, 0x71, 0x59, 0x63, 0x58, + 0x6f, 0x90, 0x71, 0x6a, 0x90, 0x67, 0x6f, 0x6f, + 0x99, 0xfe, 0x3a, 0x6a, 0x5b, 0x6a, 0x4a, 0x4c, + 0x6f, 0x99, 0x90, 0x6a, 0x4a, 0x3a, 0x5d, 0x7e, + 0x5b, 0xb0, 0x9d, 0x5b, 0x4a, 0x6f, 0x83, 0x6a, + 0x4a, 0x99, 0x80, 0x67, 0x48, 0x2b, 0x23, 0x99, + 0x83, 0x41, 0x90, 0x3a, 0x56, 0x7f, 0x73, 0x48, + 0x48, 0x2b, 0x2a, 0x48, 0x2b, 0xf2, 0xeb, 0xf1, + 0x54, 0xe6, 0xa, 0xe6, 0xd6, 0xd3, 0xd2, 0xd1, + 0xd1, 0xd6, 0xd2, 0xd2, 0xc2, 0xd2, 0xd3, 0xd9, + 0xd2, 0xc4, 0xc4, 0xd2, 0xd3, 0xd3, 0xc4, 0xc4, + 0xc4, 0xd3, 0xd3, 0xd2, 0xd1, 0xc4, 0xd2, 0xd6, + 0xd6, 0xd0, 0xd2, 0xbf, 0xb, 0x26, 0xcb, 0xa, + 0x1, 0x15, 0xf2, 0x34, 0x99, 0x60, 0x5f, 0xa8, + 0x27, 0x46, 0x28, 0x5f, 0x82, 0x1e, 0x1f, 0x46, + 0x79, 0x68, 0x68, 0x1e, 0x62, 0x4e, 0x68, 0x82, + 0x1f, 0x1f, 0x28, 0xc, 0x76, 0x5e, 0xfc, 0x98, + 0x8d, 0x8d, 0x8d, 0x98, 0x30, 0x1e, 0x68, 0x9c, + 0xc, 0xfc, 0x1f, 0x82, 0x82, 0x68, 0x5e, 0x46, + 0x79, 0x68, 0x9f, 0x98, 0xa7, 0x1f, 0x8d, 0x82, + 0x37, 0x68, 0x1e, 0x46, 0x8d, 0x5e, 0x79, 0x93, + 0x62, 0x82, 0x93, 0x74, 0xa8, 0xe, 0x98, 0x7d, + 0x28, 0x5e, 0x46, 0x62, 0x1e, 0x5e, 0x8d, 0x8b, + 0x98, 0x7d, 0x8f, 0x62, 0xa8, 0xa0, 0x30, 0x62, + 0x8d, 0x5e, 0x98, 0x8b, 0x46, 0x8d, 0x8d, 0x98, + 0x28, 0xe, 0x8f, 0x89, 0xdd, 0xf3, 0xb7, 0x33, + 0x57, 0x82, 0x32, 0x98, 0x98, 0x79, 0x98, 0x93, + 0x98, 0x32, 0xa7, + 0x28, 0x8, 0x7, 0xb9, 0xbf, 0xcb, 0xe6, 0xeb, + 0x15, 0x1, 0x34, 0x54, 0x85, 0x5d, 0x95, 0x6b, + 0x6b, 0x85, 0x7f, 0x67, 0x59, 0x48, 0x15, 0xf2, + 0xf2, 0xee, 0x16, 0x14, 0x3b, 0x73, 0xf2, 0x16, + 0x16, 0x16, 0xf2, 0xee, 0xf2, 0xf2, 0xeb, 0xeb, + 0xe5, 0xbf, 0xd0, 0xd9, 0xd9, 0xd9, 0xd2, 0xd2, + 0xd3, 0xd6, 0xd3, 0xd2, 0xc4, 0xc4, 0xd2, 0xd3, + 0xdb, 0xd1, 0xc4, 0xd3, 0xd9, 0xd6, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd3, 0xcb, 0xd3, 0xd0, 0xcb, 0xd8, + 0xa, 0xfa, 0xee, 0xee, 0x15, 0xeb, 0xf2, 0x16, + 0x3d, 0x3d, 0x15, 0x17, 0xee, 0x34, 0xf2, 0x3d, + 0x15, 0xeb, 0xf2, 0x15, 0x2a, 0x67, 0x67, 0x48, + 0x66, 0x9d, 0x4d, 0x48, 0x67, 0x85, 0x6f, 0x85, + 0x7a, 0x5d, 0x81, 0x6a, 0xb0, 0x6a, 0x6b, 0x58, + 0x63, 0x6b, 0x71, 0x80, 0x80, 0x9a, 0x80, 0x99, + 0x7f, 0x26, 0x21, 0x3b, 0x3d, 0x3d, 0x16, 0xf2, + 0xee, 0xf2, 0x16, 0x3d, 0x16, 0x15, 0x34, 0xe6, + 0xeb, 0xf2, 0x3d, 0xf2, 0x16, 0x16, 0x16, 0xf2, + 0x70, 0x3d, 0xeb, 0x34, 0xeb, 0x15, 0x48, 0xe6, + 0xf2, 0x3d, 0x48, 0x15, 0x3d, 0x3f, 0x59, 0x7f, + 0x3b, 0x48, 0x80, 0x80, 0x7f, 0x7f, 0x36, 0x63, + 0x9a, 0x90, 0x71, 0x6b, 0x63, 0x71, 0x71, 0x85, + 0x31, 0x7f, 0x67, 0x90, 0x99, 0x99, 0x90, 0x5d, + 0x85, 0x63, 0x71, 0x6b, 0x6b, 0x6b, 0x6b, 0x91, + 0x83, 0x7f, 0x31, 0x6a, 0x9d, 0x99, 0x90, 0x5d, + 0x31, 0x63, 0x71, 0x85, 0x67, 0x3f, 0x42, 0x63, + 0x58, 0x7f, 0x48, 0x80, 0x80, 0x99, 0x54, 0x7f, + 0x26, 0x48, 0x23, 0x7f, 0x1d, 0x3d, 0x3d, 0x16, + 0x73, 0x73, 0xd8, 0xe6, 0xe6, 0xcb, 0xd2, 0xc2, + 0xce, 0xd4, 0xd0, 0xc4, 0xd1, 0xc4, 0xd3, 0xd3, + 0xd2, 0xd2, 0xc4, 0xd3, 0xd9, 0xdb, 0xc4, 0xc4, + 0xd1, 0xd2, 0xd3, 0xd3, 0xd2, 0xc4, 0xd2, 0xd6, + 0xe0, 0xe0, 0xd3, 0xd4, 0x90, 0x6, 0xcb, 0xe6, + 0xf1, 0x15, 0x3d, 0x21, 0x67, 0x5d, 0x6a, 0x83, + 0x6a, 0x93, 0x5e, 0x8b, 0x62, 0x8d, 0x8d, 0x98, + 0x8b, 0x32, 0x68, 0x8b, 0x98, 0x79, 0x68, 0x93, + 0x8b, 0x8d, 0x5e, 0x93, 0x8b, 0x5e, 0x8d, 0x8b, + 0x98, 0x5e, 0x8d, 0x9c, 0x74, 0x5e, 0x8d, 0x7d, + 0x93, 0x5e, 0x82, 0x8f, 0x8d, 0x8d, 0x8d, 0x8b, + 0x7d, 0x86, 0x79, 0x93, 0x2f, 0x68, 0x8d, 0x98, + 0x8d, 0x68, 0x8d, 0x98, 0x8d, 0x9e, 0x8d, 0x93, + 0x9c, 0x7, 0x93, 0x93, 0x5f, 0x37, 0x98, 0x98, + 0x82, 0x5e, 0x98, 0x8b, 0x8d, 0x5e, 0x82, 0x62, + 0xa7, 0xa7, 0x62, 0x8f, 0xa0, 0x82, 0x46, 0x98, + 0x5e, 0x5e, 0x46, 0x98, 0x8d, 0x5e, 0x93, 0x98, + 0x68, 0x8, 0x93, 0x82, 0x28, 0x28, 0x1e, 0x89, + 0x89, 0x32, 0x32, 0x7d, 0x79, 0x43, 0x82, 0x7d, + 0x89, 0x5e, 0x6c, + 0x55, 0xa8, 0xc8, 0xc8, 0x1b, 0x54, 0xfa, 0xfa, + 0x34, 0xf2, 0x16, 0x3b, 0x99, 0x9a, 0x85, 0x85, + 0x31, 0x63, 0x80, 0x9a, 0x63, 0x2e, 0x15, 0x17, + 0x3d, 0x14, 0x16, 0x3d, 0x16, 0xf2, 0xf2, 0x16, + 0x16, 0x16, 0xf2, 0x15, 0x7f, 0x23, 0xfa, 0xa, + 0xa1, 0xcc, 0xd2, 0xd6, 0xd6, 0xd3, 0xd2, 0xd2, + 0xd2, 0xd3, 0xd9, 0xd3, 0xc4, 0xd1, 0xd2, 0xd3, + 0xd3, 0xd2, 0xc4, 0xd2, 0xd6, 0xd6, 0xd3, 0xd2, + 0xd2, 0xd2, 0xcb, 0xd8, 0x54, 0x99, 0x6e, 0xeb, + 0xf5, 0xe1, 0xee, 0xee, 0xee, 0x16, 0xf2, 0x16, + 0x3b, 0x70, 0x70, 0x3d, 0x3b, 0x3b, 0xf2, 0x3d, + 0x16, 0x15, 0x3d, 0x34, 0x54, 0x58, 0x6f, 0x58, + 0x59, 0x81, 0x81, 0x58, 0x71, 0x6b, 0x6b, 0x9a, + 0x80, 0x58, 0x85, 0x9a, 0x71, 0x6b, 0x6b, 0x71, + 0x6b, 0x71, 0x71, 0x63, 0x7f, 0x42, 0x48, 0x3d, + 0x16, 0x3d, 0x16, 0x16, 0xf2, 0xf2, 0x3d, 0x3d, + 0xf2, 0xf2, 0x3d, 0x16, 0x3d, 0xf2, 0x16, 0xf2, + 0x3d, 0xf2, 0xf2, 0x16, 0x16, 0x3d, 0x3d, 0x3d, + 0x34, 0x15, 0x3d, 0x34, 0xee, 0x16, 0xee, 0xf2, + 0x3d, 0xf2, 0x3d, 0x3d, 0x3d, 0x3f, 0x7f, 0x42, + 0x70, 0x70, 0x70, 0x70, 0x70, 0x3f, 0x42, 0x99, + 0x67, 0x99, 0x71, 0x81, 0x6b, 0x6b, 0x6b, 0x6b, + 0x6a, 0x99, 0x80, 0x58, 0x42, 0x42, 0x71, 0x90, + 0x99, 0x9a, 0x5d, 0x81, 0x6b, 0x81, 0x81, 0x6a, + 0x5d, 0x58, 0x85, 0x6a, 0x99, 0x67, 0x71, 0x6b, + 0x9a, 0x9a, 0x6f, 0x6a, 0x58, 0x80, 0x9a, 0x90, + 0x85, 0x63, 0x63, 0x85, 0x63, 0x7f, 0x4d, 0x9a, + 0x23, 0x34, 0x15, 0x34, 0x34, 0x3d, 0x2b, 0x2a, + 0xeb, 0xfa, 0xeb, 0xd8, 0x6e, 0xea, 0xd6, 0xdb, + 0xce, 0xc2, 0xd1, 0xc4, 0xd2, 0xd2, 0xc4, 0xd2, + 0xd3, 0xd3, 0xd3, 0xd2, 0xc7, 0xbe, 0xd1, 0xc4, + 0xc4, 0xc4, 0xd2, 0xd3, 0xd3, 0xd3, 0xd2, 0xd0, + 0xe0, 0xed, 0xf9, 0x20, 0x60, 0xa1, 0xd6, 0xeb, + 0xeb, 0x15, 0xeb, 0x2a, 0x26, 0x20, 0x27, 0x55, + 0x46, 0x37, 0x28, 0x30, 0x8d, 0x68, 0x68, 0x76, + 0x82, 0x5e, 0x5e, 0x79, 0x37, 0x5e, 0xfc, 0x8d, + 0x8d, 0x68, 0x68, 0x1f, 0x46, 0x5e, 0x5e, 0x5e, + 0x28, 0x28, 0x28, 0x82, 0x5e, 0x68, 0x5e, 0x1e, + 0x5e, 0xa3, 0x8d, 0x8d, 0x5f, 0x5e, 0x5e, 0x6c, + 0x7, 0x6c, 0x28, 0x8d, 0x5e, 0x68, 0x68, 0x28, + 0xfc, 0xa3, 0x5e, 0x0, 0x6c, 0xfc, 0x5e, 0x68, + 0x6c, 0x6c, 0xfc, 0x46, 0x5e, 0x5e, 0x68, 0x68, + 0xfc, 0x28, 0x5e, 0x5e, 0x7, 0xf7, 0xfc, 0x82, + 0x28, 0x6c, 0x28, 0x1f, 0x46, 0x5e, 0x68, 0x8d, + 0x28, 0xf7, 0x37, 0x68, 0x86, 0x9f, 0xfc, 0x1f, + 0x68, 0x5e, 0x68, 0x68, 0x1f, 0x28, 0x28, 0x32, + 0x5e, 0x5e, 0x7, 0xe, 0x32, 0x86, 0x9f, 0x28, + 0x1e, 0x32, 0x68, + 0x82, 0x9c, 0x2f, 0x2c, 0x83, 0x5a, 0xa, 0xfa, + 0x15, 0x16, 0x22, 0x70, 0x3f, 0x67, 0x63, 0x71, + 0x71, 0x85, 0x80, 0x63, 0x63, 0x80, 0x70, 0x3f, + 0x3b, 0x16, 0x14, 0x16, 0x3d, 0x16, 0x3d, 0x16, + 0x3d, 0x3d, 0x3d, 0x2b, 0x7f, 0xb, 0xd4, 0xd3, + 0xbf, 0xc2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd2, 0xd1, 0xc4, 0xd0, 0xd2, 0xd1, 0xc4, 0xc4, + 0xc4, 0xd2, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd3, 0xbf, 0xd3, 0xa, 0x73, 0xfa, 0xfa, 0xeb, + 0xeb, 0xee, 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, + 0xee, 0xeb, 0x34, 0x16, 0x34, 0xd8, 0x17, 0xf2, + 0x21, 0x2b, 0x3b, 0x3f, 0x80, 0x99, 0x99, 0x9a, + 0x4a, 0x4a, 0x6a, 0x5d, 0x81, 0x7e, 0x7e, 0x5d, + 0x6a, 0x7e, 0x5d, 0x67, 0x59, 0x71, 0x9a, 0x80, + 0x7f, 0x9a, 0x80, 0x54, 0x73, 0xa, 0x2b, 0x16, + 0x3d, 0x34, 0x15, 0x3d, 0x3b, 0x3d, 0x16, 0xf2, + 0x16, 0x16, 0xf2, 0x16, 0x16, 0xf2, 0x16, 0x3d, + 0x34, 0x15, 0x3d, 0xf2, 0x15, 0x16, 0x3d, 0x3d, + 0x34, 0x34, 0xf2, 0x3d, 0xf2, 0x3d, 0x3d, 0x3d, + 0x17, 0x15, 0x16, 0x16, 0x16, 0x16, 0x70, 0x54, + 0xeb, 0x54, 0x73, 0x34, 0x2b, 0x67, 0x85, 0x67, + 0x70, 0x1d, 0x85, 0x83, 0x5d, 0x9a, 0x90, 0x6f, + 0x6a, 0x6f, 0x5d, 0x6f, 0x3a, 0x58, 0x6a, 0x4a, + 0x4d, 0x9a, 0x6f, 0x83, 0xb0, 0x83, 0x7a, 0x6f, + 0x6a, 0x6a, 0x6a, 0x55, 0x5d, 0x58, 0x6a, 0x7e, + 0x58, 0x58, 0x99, 0x9a, 0x99, 0x90, 0x97, 0x40, + 0x20, 0x5d, 0x6a, 0x91, 0x71, 0x58, 0x31, 0x41, + 0x7f, 0x34, 0x34, 0x3b, 0x2b, 0x21, 0xde, 0xd7, + 0xd8, 0xe6, 0xd7, 0xd6, 0xd6, 0xd6, 0xd7, 0xd6, + 0xd6, 0xd2, 0xc4, 0xd2, 0xd9, 0xd2, 0xc4, 0xc4, + 0xc4, 0xd9, 0xd9, 0xd2, 0xc2, 0xc2, 0xc4, 0xd9, + 0xd3, 0xc4, 0xc4, 0xc4, 0xd3, 0xd3, 0xdb, 0xc4, + 0xd2, 0xe5, 0xed, 0xe5, 0xbf, 0xbf, 0xcb, 0xd8, + 0xe1, 0xf2, 0xf2, 0xeb, 0x23, 0xfd, 0x11, 0x2f, + 0xa7, 0x5e, 0x28, 0xe, 0x37, 0x68, 0xa3, 0x86, + 0xfc, 0x28, 0x68, 0x68, 0x5e, 0x5e, 0x37, 0x37, + 0x68, 0x68, 0x68, 0x37, 0x76, 0x5e, 0xa3, 0x5e, + 0x5e, 0xfc, 0x68, 0x68, 0x5e, 0xa3, 0x5e, 0x1f, + 0x5e, 0x9f, 0xa3, 0x6c, 0xe, 0xfc, 0xa3, 0x5e, + 0x5e, 0x68, 0x28, 0x5e, 0x68, 0x68, 0x68, 0x5e, + 0x37, 0xb6, 0x68, 0x68, 0x5e, 0x28, 0x8d, 0x5e, + 0x68, 0x5e, 0x82, 0x8d, 0x5e, 0x5e, 0x5e, 0x8d, + 0x37, 0xa0, 0x6c, 0x8d, 0x68, 0x5e, 0x82, 0x8d, + 0x68, 0x68, 0x8d, 0x46, 0x82, 0x6c, 0x6c, 0x5e, + 0x7, 0xf3, 0xa7, 0x76, 0x68, 0x5e, 0x5e, 0x79, + 0x68, 0x5e, 0x8d, 0x8d, 0x28, 0xa7, 0x7, 0xa4, + 0xa7, 0x5e, 0xfc, 0x89, 0x75, 0x68, 0x68, 0x79, + 0x43, 0x75, 0x68, + 0x6c, 0x1e, 0xe, 0xf8, 0xa1, 0x3, 0xd8, 0xde, + 0xf2, 0x3d, 0x1, 0xcb, 0x31, 0x31, 0x58, 0x5d, + 0x71, 0x99, 0x23, 0x7f, 0x54, 0x73, 0x70, 0x73, + 0x15, 0x16, 0x3d, 0x34, 0x39, 0x23, 0x34, 0x34, + 0x3b, 0x34, 0x15, 0x15, 0xde, 0xcb, 0xd2, 0xd2, + 0xc2, 0xbe, 0xc7, 0xc4, 0xc4, 0xc4, 0xd3, 0xd3, + 0xd2, 0xc2, 0xc2, 0xc4, 0xd3, 0xd2, 0xc4, 0xc4, + 0xd2, 0xd3, 0xd3, 0xd3, 0xc4, 0xd1, 0xc4, 0xe0, + 0xd6, 0xd3, 0xd6, 0xe6, 0xfa, 0xf5, 0xde, 0xf2, + 0xde, 0xee, 0x14, 0x16, 0x17, 0x16, 0x16, 0x14, + 0x14, 0x16, 0x34, 0x34, 0xeb, 0x15, 0x3b, 0x70, + 0x39, 0x66, 0x23, 0x42, 0x31, 0x90, 0x31, 0x31, + 0x90, 0x6f, 0x97, 0x97, 0x6a, 0x6a, 0x6a, 0x6a, + 0x6a, 0x7e, 0x6a, 0x58, 0x9a, 0x80, 0x7f, 0x70, + 0x70, 0x2a, 0x34, 0x34, 0xa, 0xcb, 0xde, 0x3d, + 0x2b, 0x73, 0x34, 0x3d, 0x2b, 0x3d, 0x16, 0x3d, + 0xf2, 0x16, 0x16, 0x16, 0xf2, 0xf2, 0x3d, 0x16, + 0x3d, 0xeb, 0xf2, 0x3d, 0xf2, 0xee, 0x16, 0xf2, + 0xf2, 0xf2, 0x15, 0x16, 0x16, 0x3d, 0xf2, 0x16, + 0x16, 0x16, 0x16, 0x14, 0x16, 0x16, 0xf5, 0xeb, + 0xfa, 0xeb, 0xe1, 0xf2, 0x3d, 0x70, 0x99, 0x99, + 0x70, 0x70, 0x48, 0x97, 0x5d, 0x71, 0x58, 0x58, + 0x6f, 0x71, 0x5d, 0x6f, 0x58, 0x71, 0x6b, 0x6a, + 0x4a, 0x71, 0x6f, 0x4a, 0x31, 0x71, 0x5d, 0x83, + 0x99, 0x56, 0x6a, 0x6a, 0x6a, 0x6b, 0x81, 0x7e, + 0x6a, 0x6b, 0x4a, 0x4a, 0x63, 0x4c, 0x6f, 0x90, + 0x39, 0x80, 0x5d, 0x6f, 0x85, 0x71, 0x80, 0x99, + 0x7f, 0x48, 0x23, 0x2a, 0x7f, 0x7f, 0xeb, 0xeb, + 0x15, 0xeb, 0xe6, 0xd7, 0xcb, 0xd8, 0xd8, 0xd7, + 0xe0, 0xd0, 0xd2, 0xd2, 0xc4, 0xd1, 0xc7, 0xc4, + 0xc4, 0xd2, 0xd3, 0xd3, 0xd2, 0xd2, 0xc4, 0xd3, + 0xd2, 0xd2, 0xd2, 0xc4, 0xd3, 0xdb, 0xd3, 0xd3, + 0xd6, 0xe0, 0xe0, 0xcb, 0xd0, 0xd2, 0xd4, 0xd8, + 0xeb, 0xee, 0x15, 0x15, 0x34, 0x39, 0x58, 0x60, + 0x60, 0xa7, 0x5e, 0x93, 0x5f, 0x28, 0x5e, 0x8d, + 0x98, 0x8d, 0x68, 0x98, 0x98, 0x5e, 0x8d, 0x93, + 0x9c, 0x37, 0x68, 0x98, 0x93, 0x5e, 0x28, 0x8d, + 0x98, 0x5e, 0x8d, 0x98, 0x8d, 0x5e, 0x5e, 0x8b, + 0x9c, 0x28, 0x5e, 0x98, 0x82, 0x8d, 0x8d, 0x98, + 0x8d, 0x5e, 0x8d, 0x8b, 0x82, 0xb6, 0x5e, 0x98, + 0xa7, 0x8, 0x1f, 0x8b, 0x8d, 0xa3, 0x8d, 0x8f, + 0x46, 0x76, 0x9c, 0x8f, 0x76, 0xb7, 0x9c, 0x7d, + 0x82, 0x28, 0x82, 0x98, 0x8d, 0x5e, 0x98, 0x8b, + 0x8d, 0xa7, 0xaa, 0x8f, 0x7d, 0xa0, 0x55, 0x62, + 0x79, 0x76, 0x8f, 0x98, 0x28, 0x9f, 0x98, 0x98, + 0x5e, 0x1e, 0x74, 0x93, 0x8d, 0x9c, 0x89, 0x64, + 0x84, 0x43, 0x79, 0x98, 0x98, 0x43, 0x43, 0x8b, + 0x98, 0x82, 0x89, + 0x76, 0x37, 0xf3, 0xa1, 0xb4, 0xa, 0xeb, 0xee, + 0xee, 0x15, 0x34, 0xea, 0x7f, 0x3a, 0x58, 0x6b, + 0x85, 0x63, 0x7f, 0x54, 0x3b, 0x2b, 0x70, 0xd8, + 0xf2, 0x16, 0x3d, 0x2a, 0x5a, 0x7f, 0xf9, 0xe6, + 0xe6, 0xeb, 0x1, 0x73, 0x1, 0xde, 0xc9, 0xa1, + 0xcc, 0xc8, 0xbe, 0xc2, 0xc4, 0xc4, 0xd3, 0xd0, + 0xd2, 0xc4, 0xc4, 0xd2, 0xd2, 0xc7, 0xc7, 0xc2, + 0xc4, 0xdb, 0xdb, 0xd3, 0xd3, 0xd2, 0xd3, 0xd7, + 0xd8, 0xd8, 0xd8, 0xe1, 0xf2, 0xf2, 0xee, 0xee, + 0xeb, 0xe1, 0xee, 0x16, 0x15, 0xf2, 0x16, 0x16, + 0x3d, 0x3d, 0x15, 0xeb, 0xeb, 0x15, 0x70, 0x73, + 0x7f, 0x7f, 0x48, 0x80, 0x80, 0x63, 0x71, 0x71, + 0x6f, 0x6f, 0x99, 0x67, 0x83, 0x9d, 0x90, 0x6f, + 0x6b, 0x6a, 0x6f, 0x71, 0x99, 0x70, 0x3f, 0x3f, + 0x3f, 0xf2, 0x3d, 0x3d, 0xf2, 0xf2, 0x3d, 0x3d, + 0x3d, 0x73, 0xee, 0x34, 0x48, 0x70, 0x3b, 0x3b, + 0x17, 0x3b, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x15, 0xeb, 0x16, 0x16, 0x3d, 0x3d, 0x16, 0x3d, + 0x3d, 0x16, 0xf2, 0x3d, 0x16, 0x16, 0x16, 0x16, + 0x14, 0x16, 0x3d, 0x16, 0x3d, 0x3d, 0x15, 0x3b, + 0xf5, 0x16, 0x3d, 0x17, 0x3d, 0x3d, 0x3d, 0x16, + 0x3b, 0x70, 0x6e, 0x67, 0x58, 0x71, 0x71, 0x59, + 0x63, 0x71, 0x58, 0x67, 0x9a, 0x85, 0x6f, 0x6f, + 0x6f, 0x71, 0x6a, 0x6b, 0x6b, 0x6b, 0x6b, 0x58, + 0x9a, 0x58, 0x71, 0x9a, 0x90, 0x71, 0x6a, 0x6a, + 0x71, 0x6b, 0x81, 0x81, 0x5d, 0x71, 0x71, 0x90, + 0x7f, 0x67, 0x85, 0x99, 0x99, 0x9a, 0x9a, 0x99, + 0x4d, 0x4d, 0x63, 0x7f, 0x34, 0x23, 0x3d, 0xf2, + 0xeb, 0xeb, 0xd8, 0xeb, 0xde, 0x1, 0xde, 0xd8, + 0xd8, 0xfd, 0xdb, 0xc4, 0xc2, 0xce, 0xc4, 0xd2, + 0xd2, 0xd2, 0xc4, 0xd9, 0xd3, 0xdb, 0xd2, 0xc4, + 0xc4, 0xdb, 0xdb, 0xd9, 0xc4, 0xd2, 0xd3, 0xd6, + 0xde, 0xe6, 0xd0, 0x5a, 0x5a, 0xa1, 0xa6, 0xcb, + 0xa, 0xeb, 0x15, 0x21, 0xfa, 0x54, 0x83, 0x61, + 0x90, 0x2c, 0x37, 0x82, 0x8f, 0x46, 0x1f, 0x8b, + 0x98, 0x8d, 0x28, 0x46, 0x55, 0xa7, 0x5e, 0x93, + 0x74, 0x46, 0x8d, 0x98, 0x98, 0x8d, 0x1f, 0x30, + 0x98, 0x68, 0x5e, 0x93, 0x2f, 0xa0, 0x76, 0x98, + 0x46, 0x37, 0x1f, 0x98, 0x8d, 0x5e, 0x5e, 0x62, + 0x46, 0x7, 0x76, 0x93, 0x9c, 0xc, 0x76, 0x8d, + 0x79, 0x5e, 0x37, 0x46, 0x8d, 0x68, 0x82, 0x62, + 0x30, 0xb7, 0x9c, 0x93, 0x76, 0x24, 0x30, 0x98, + 0x8d, 0x5e, 0x8d, 0x30, 0x8d, 0x86, 0x8d, 0x93, + 0x1f, 0xf3, 0xa6, 0x9c, 0x5e, 0x28, 0x12, 0x62, + 0x5e, 0x68, 0x98, 0x46, 0x1f, 0x79, 0x9c, 0x79, + 0x5e, 0xa7, 0x30, 0x93, 0x5e, 0x8d, 0x8d, 0x62, + 0x62, 0x43, 0x75, 0x79, 0x43, 0x43, 0x5c, 0xa9, + 0xa7, 0x5e, 0x76, + 0xaa, 0x9c, 0xa8, 0xb, 0x41, 0x39, 0x48, 0x15, + 0x3d, 0x3d, 0x15, 0xeb, 0x34, 0x7f, 0x99, 0x99, + 0x99, 0x85, 0x6a, 0x90, 0x59, 0x1d, 0x21, 0x3f, + 0x16, 0x3d, 0x16, 0x3d, 0xf2, 0xeb, 0xeb, 0xf2, + 0x15, 0xf2, 0x34, 0xfa, 0xeb, 0x2a, 0xfd, 0x6f, + 0x72, 0xba, 0xc7, 0xd3, 0xd3, 0xd3, 0xd2, 0xd4, + 0xbf, 0xd1, 0xdc, 0xba, 0xcc, 0xce, 0xdc, 0xd1, + 0xc4, 0xc4, 0xd2, 0xd6, 0xd7, 0xd6, 0xcb, 0xeb, + 0xde, 0xde, 0x15, 0xeb, 0xf5, 0xf2, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0x3d, 0xee, 0x16, 0x3b, 0x3b, + 0x48, 0x73, 0x34, 0x21, 0x80, 0x99, 0x42, 0x42, + 0x39, 0x34, 0x48, 0x63, 0x71, 0x71, 0x58, 0x71, + 0x6b, 0x6b, 0x71, 0x59, 0x5d, 0x4a, 0x9a, 0x58, + 0x6f, 0x90, 0x54, 0x80, 0x99, 0x34, 0x70, 0x3f, + 0x48, 0x3f, 0x3b, 0x3d, 0x3d, 0x16, 0x16, 0x3d, + 0x3d, 0x16, 0xfa, 0x70, 0x99, 0x80, 0x48, 0x1d, + 0x2e, 0x1d, 0x3d, 0x16, 0x16, 0x16, 0x16, 0xf2, + 0xf2, 0xee, 0xee, 0x16, 0x15, 0x34, 0x16, 0x16, + 0x17, 0x3b, 0x16, 0x16, 0x3d, 0x18, 0x14, 0x16, + 0x16, 0x18, 0x14, 0x18, 0x16, 0x3b, 0x2b, 0xf2, + 0x17, 0x16, 0x16, 0x16, 0x3d, 0x3d, 0x3d, 0x3b, + 0x3f, 0x70, 0x54, 0x42, 0x4d, 0x31, 0x85, 0x9a, + 0x63, 0x4d, 0x4d, 0x67, 0x31, 0x71, 0x9a, 0x54, + 0x99, 0x71, 0x6b, 0x6a, 0x71, 0x6b, 0x6b, 0x81, + 0x6b, 0x6b, 0x71, 0x58, 0x71, 0x6b, 0x71, 0x99, + 0x80, 0x6b, 0x6a, 0x83, 0x83, 0x6b, 0x71, 0x90, + 0x63, 0x71, 0x90, 0x54, 0x1d, 0x67, 0x71, 0x6f, + 0x66, 0x59, 0x85, 0x80, 0x73, 0x2b, 0x21, 0xeb, + 0xf2, 0xeb, 0xde, 0xde, 0xde, 0xd8, 0xcb, 0xd6, + 0xe6, 0xe6, 0xe0, 0xd2, 0xd3, 0xc4, 0xd3, 0xd9, + 0xd2, 0xc4, 0xc4, 0xc4, 0xd9, 0xdb, 0xe2, 0xc4, + 0xc4, 0xd3, 0xd9, 0xd3, 0xc4, 0xc4, 0xd3, 0xd6, + 0xe0, 0xed, 0x40, 0xf8, 0x2c, 0x2c, 0xbc, 0xbf, + 0xcb, 0xde, 0xeb, 0x15, 0xf1, 0x5a, 0x2c, 0x2f, + 0x55, 0x1f, 0x68, 0x5e, 0x5e, 0x5e, 0x37, 0x8d, + 0x28, 0x6c, 0x5e, 0x37, 0x1e, 0x6c, 0x32, 0x8d, + 0x8d, 0x37, 0x68, 0x5e, 0x5e, 0x68, 0xfc, 0x8d, + 0x37, 0x7, 0x6c, 0x5e, 0x37, 0x5e, 0x68, 0x68, + 0x68, 0x68, 0x82, 0x5e, 0x9e, 0xa3, 0x5e, 0x28, + 0x28, 0xb8, 0x8, 0x5e, 0x68, 0x5e, 0x68, 0x68, + 0x4e, 0xa3, 0x68, 0x68, 0xa3, 0x9f, 0xb8, 0x5e, + 0x28, 0x28, 0x28, 0x82, 0x86, 0x68, 0x68, 0xa3, + 0x5e, 0x9e, 0x6c, 0x8d, 0x68, 0xa3, 0x6c, 0x5e, + 0x68, 0x28, 0x28, 0x5e, 0x68, 0x68, 0x8d, 0x5e, + 0x68, 0x5e, 0x28, 0x28, 0x5e, 0x68, 0x6c, 0x6c, + 0x86, 0x32, 0x5e, 0x5e, 0x5e, 0x68, 0x32, 0x5e, + 0x5e, 0x68, 0xa3, 0x9f, 0x9f, 0x32, 0x75, 0x28, + 0x32, 0x68, 0x68, + 0x55, 0x7d, 0x9c, 0xa6, 0x20, 0x4d, 0x39, 0x2a, + 0x34, 0x15, 0x34, 0x3d, 0x3d, 0x3d, 0x3b, 0x23, + 0x48, 0x6e, 0x41, 0x90, 0x90, 0x39, 0x1c, 0x48, + 0x3d, 0x14, 0x3d, 0x16, 0x3d, 0x16, 0xeb, 0x1, + 0x16, 0x16, 0x1, 0x73, 0xa, 0xcb, 0xfd, 0x5a, + 0xbf, 0xd2, 0xc4, 0xd3, 0xd7, 0xe0, 0xbf, 0xcc, + 0xcc, 0xe4, 0xe4, 0xdc, 0xc2, 0xc2, 0xd2, 0xd3, + 0xd6, 0xd2, 0xd2, 0xd3, 0xe0, 0xd8, 0xd8, 0xa, + 0x73, 0xee, 0x15, 0x15, 0xeb, 0xee, 0x16, 0x16, + 0xf2, 0xf2, 0xf2, 0x15, 0x16, 0x16, 0x3d, 0x2b, + 0x73, 0x34, 0x48, 0x42, 0x99, 0x3, 0x80, 0x71, + 0x63, 0x63, 0x63, 0x6b, 0x81, 0x5d, 0x9a, 0x6b, + 0x81, 0x83, 0x6f, 0x5d, 0x5d, 0x90, 0x5d, 0x6a, + 0x6a, 0x6f, 0x99, 0x42, 0x3f, 0x16, 0x16, 0x3d, + 0x70, 0x73, 0xf2, 0x34, 0x34, 0xf2, 0x16, 0x3b, + 0x48, 0x22, 0x16, 0x15, 0x3f, 0x70, 0x16, 0x16, + 0xf2, 0xeb, 0xee, 0x16, 0x3d, 0xf5, 0x16, 0x15, + 0x15, 0x15, 0xf2, 0x16, 0x3d, 0xf2, 0x16, 0x16, + 0x15, 0xf2, 0x16, 0x16, 0x17, 0x16, 0x3d, 0x16, + 0x15, 0x16, 0x14, 0x14, 0x14, 0x16, 0xf2, 0x16, + 0xf2, 0x16, 0x14, 0x17, 0x15, 0x16, 0x15, 0x3d, + 0x70, 0x2b, 0xf2, 0x15, 0x2a, 0x7f, 0xa, 0x6e, + 0x41, 0x58, 0x6f, 0x6a, 0x6a, 0x6a, 0x5d, 0x63, + 0x63, 0x71, 0x6a, 0x41, 0x5d, 0x6a, 0x6a, 0x83, + 0x6a, 0x6a, 0x6a, 0x7e, 0x7e, 0x6a, 0x6a, 0x4a, + 0x58, 0x6b, 0x83, 0x7f, 0x99, 0x6a, 0x47, 0x83, + 0x52, 0x6a, 0x6a, 0x90, 0x58, 0x71, 0x6a, 0x6a, + 0x99, 0x6f, 0x90, 0xa, 0x15, 0x34, 0x73, 0xf2, + 0xf2, 0xf1, 0xe0, 0xd8, 0xde, 0xe6, 0xe0, 0xd6, + 0xd7, 0xe0, 0xd7, 0xd6, 0xd3, 0xd2, 0xd1, 0xd1, + 0xc2, 0xc4, 0xd1, 0xc4, 0xd2, 0xd2, 0xd2, 0xc4, + 0xc4, 0xd2, 0xd2, 0xd3, 0xd2, 0xd2, 0xd2, 0xd0, + 0xd3, 0xd9, 0xec, 0xc8, 0xba, 0xc7, 0xc2, 0xcb, + 0xde, 0xee, 0xe1, 0xde, 0xde, 0xe7, 0x27, 0x37, + 0x1e, 0x5e, 0x9f, 0x28, 0x6c, 0x6c, 0x9f, 0x5e, + 0x6c, 0x6c, 0x5e, 0x5e, 0x68, 0x68, 0x86, 0x68, + 0x68, 0x9e, 0x5e, 0x5e, 0x28, 0x7, 0x6c, 0x5e, + 0x5e, 0x28, 0x5e, 0x5e, 0x8d, 0xa3, 0x68, 0x68, + 0x68, 0x7, 0xb6, 0x6c, 0x28, 0x7, 0x9f, 0x5e, + 0x5e, 0xfc, 0x46, 0x8d, 0x68, 0xa3, 0x68, 0x5e, + 0x68, 0x9f, 0x7, 0x6c, 0x68, 0xfc, 0x6c, 0x5e, + 0x5e, 0x5e, 0xfc, 0x1e, 0x68, 0x9e, 0x5e, 0x28, + 0x6c, 0x8, 0x7, 0x6c, 0x68, 0x68, 0x9f, 0x5e, + 0x68, 0x68, 0x76, 0xe, 0x28, 0x68, 0xa7, 0xc, + 0x28, 0xfc, 0xa7, 0x76, 0x68, 0x5e, 0x1f, 0x1e, + 0x68, 0x5e, 0x8d, 0x46, 0xfc, 0x1f, 0x1f, 0xa9, + 0xa0, 0xfc, 0x5e, 0x1e, 0x76, 0x86, 0x75, 0x89, + 0x5c, 0x32, 0x75, + 0x76, 0x6c, 0x6c, 0xba, 0x3, 0x9, 0xfa, 0xeb, + 0xeb, 0xeb, 0xea, 0x2a, 0x2b, 0x3f, 0x3f, 0x70, + 0x15, 0x2b, 0x48, 0x54, 0x23, 0x34, 0x23, 0x6e, + 0xeb, 0x16, 0x15, 0x34, 0xf2, 0x15, 0xea, 0xd8, + 0xf2, 0xee, 0x16, 0xee, 0xde, 0xd7, 0xd3, 0xd4, + 0xd2, 0xc2, 0xc4, 0xd0, 0xd6, 0xcb, 0xe5, 0xe4, + 0xbe, 0xc7, 0xe7, 0xd2, 0xc4, 0xd2, 0xd2, 0xd3, + 0xd3, 0xd3, 0xdb, 0xd0, 0xcb, 0xd7, 0xe6, 0x34, + 0xee, 0x14, 0xee, 0xee, 0xee, 0xee, 0xee, 0x16, + 0x16, 0xf2, 0x3d, 0x34, 0x16, 0x3d, 0x34, 0x70, + 0x3f, 0x34, 0x2a, 0x66, 0x7f, 0x39, 0x85, 0x5d, + 0x6a, 0x6a, 0x6b, 0x6b, 0x7e, 0x6a, 0x71, 0x5d, + 0x6f, 0x99, 0x3, 0x97, 0x40, 0x97, 0x5d, 0x91, + 0x5b, 0x6f, 0x80, 0x7f, 0x70, 0x16, 0x16, 0x16, + 0x16, 0xee, 0xf2, 0x34, 0xd8, 0xf2, 0xf2, 0x70, + 0x39, 0x70, 0x16, 0x17, 0x3d, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0xee, 0xf2, 0xe1, 0xf2, 0xfa, + 0x23, 0x39, 0x15, 0x15, 0x15, 0xf2, 0x3d, 0x14, + 0x3d, 0x18, 0x3d, 0x3d, 0x17, 0x17, 0x16, 0x15, + 0x17, 0x17, 0x14, 0x16, 0x14, 0x14, 0x3d, 0x14, + 0x16, 0x14, 0x14, 0x14, 0x17, 0x17, 0x18, 0x15, + 0x22, 0x3f, 0x17, 0x3d, 0x34, 0x3b, 0x34, 0x34, + 0x7f, 0x9a, 0x90, 0x83, 0x4c, 0x6b, 0x6b, 0x6b, + 0x6b, 0x6b, 0x95, 0x85, 0x71, 0x6b, 0x90, 0x41, + 0x6f, 0x6b, 0x6f, 0x6f, 0x6a, 0x81, 0x81, 0x6a, + 0x81, 0x6a, 0x5d, 0x63, 0x58, 0x6b, 0x6a, 0x41, + 0x90, 0x5d, 0x6a, 0x83, 0x9a, 0x58, 0x5d, 0x90, + 0x99, 0x85, 0x85, 0x1d, 0x34, 0x22, 0x2b, 0x3b, + 0xf2, 0x15, 0xea, 0xd8, 0xde, 0xde, 0xde, 0xd8, + 0xde, 0xd8, 0xe6, 0xd8, 0xf1, 0xc6, 0xc8, 0xc1, + 0xc4, 0xd3, 0xd3, 0xc4, 0xd2, 0xc4, 0xd3, 0xd9, + 0xd6, 0xc4, 0xc4, 0xd2, 0xd3, 0xd3, 0xd2, 0xc4, + 0xd3, 0xe0, 0xd6, 0x3, 0xb4, 0xd0, 0xb4, 0xd8, + 0xf2, 0xee, 0xf2, 0xf2, 0x15, 0x39, 0x4a, 0x7e, + 0x74, 0xc, 0xf7, 0x30, 0x62, 0x43, 0x32, 0x98, + 0x62, 0x1f, 0x8d, 0x98, 0x98, 0x37, 0x1f, 0x46, + 0x98, 0x6c, 0x9f, 0x1f, 0x30, 0x37, 0x8d, 0x98, + 0x98, 0x1f, 0x8d, 0x98, 0x8d, 0x5e, 0x28, 0x2f, + 0x82, 0x8, 0xa7, 0x46, 0x46, 0x1f, 0x82, 0x98, + 0x98, 0x37, 0x46, 0x62, 0x98, 0x5e, 0x7, 0x30, + 0x46, 0x68, 0xa7, 0x62, 0x46, 0x1f, 0x98, 0x8f, + 0x98, 0x76, 0x55, 0x60, 0x8d, 0x32, 0xa8, 0x9c, + 0x46, 0x28, 0x7d, 0x93, 0x79, 0x28, 0x46, 0x98, + 0x82, 0x82, 0x7c, 0x3e, 0x74, 0x79, 0xab, 0x8f, + 0x46, 0x46, 0x62, 0x98, 0x8d, 0x5e, 0x8b, 0x62, + 0x5e, 0x79, 0x7d, 0x60, 0x27, 0x62, 0x62, 0x94, + 0x74, 0x76, 0x32, 0x62, 0x98, 0x75, 0x79, 0x8f, + 0x62, 0x89, 0x79, + 0x76, 0xa7, 0x2c, 0xe9, 0xcb, 0xfa, 0x34, 0xf2, + 0xf2, 0x34, 0x67, 0x7f, 0x21, 0x48, 0x23, 0x21, + 0x3b, 0x21, 0x56, 0x23, 0x54, 0x3f, 0x48, 0x34, + 0xf2, 0x3d, 0x54, 0x73, 0xeb, 0xe1, 0xe6, 0xeb, + 0xf2, 0xf2, 0xee, 0x16, 0xee, 0xde, 0xd4, 0xbe, + 0xe3, 0xc4, 0xd5, 0xc2, 0xd2, 0xd3, 0xe0, 0xdb, + 0xc4, 0xc4, 0xc4, 0xd2, 0xd9, 0xd9, 0xd0, 0xd4, + 0xd0, 0xd6, 0xe0, 0x6e, 0xd8, 0xde, 0xeb, 0xeb, + 0xee, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, 0xee, + 0x16, 0x3d, 0x16, 0x16, 0x16, 0x15, 0x48, 0x67, + 0x42, 0x1c, 0x67, 0x9a, 0x26, 0x54, 0x58, 0x81, + 0x6a, 0x6f, 0x6f, 0x58, 0x71, 0x6f, 0x85, 0x71, + 0x59, 0x42, 0x42, 0x67, 0x7f, 0x99, 0x85, 0x71, + 0x6f, 0x80, 0x3f, 0x3f, 0x3d, 0x16, 0x16, 0x48, + 0x1d, 0x3b, 0x3b, 0x3d, 0xf2, 0x3d, 0x3d, 0xf2, + 0x15, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x16, 0xff, + 0x16, 0x16, 0x16, 0xf2, 0xf2, 0xf2, 0xf2, 0xeb, + 0xf1, 0xeb, 0xd8, 0xd8, 0xe6, 0xf1, 0x22, 0x21, + 0x1d, 0x17, 0x15, 0x16, 0xf2, 0x15, 0x16, 0xf5, + 0x15, 0x15, 0x17, 0x3b, 0x17, 0x17, 0x17, 0x14, + 0x16, 0x17, 0x14, 0x14, 0x14, 0x18, 0x14, 0x16, + 0x3b, 0x3f, 0x17, 0x3b, 0x1d, 0x36, 0x3b, 0x3b, + 0x1d, 0x7f, 0x48, 0x67, 0x9a, 0x71, 0x71, 0x6b, + 0x71, 0x6b, 0x6b, 0x6b, 0x6b, 0x71, 0x58, 0x9a, + 0x71, 0x6b, 0x85, 0x99, 0x71, 0x71, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x71, 0x59, + 0x58, 0x6b, 0x85, 0x7f, 0x7f, 0x63, 0x58, 0x59, + 0x71, 0x71, 0x59, 0x4d, 0x42, 0x42, 0x7f, 0x48, + 0x15, 0x17, 0x16, 0xee, 0x16, 0xee, 0xee, 0x16, + 0x73, 0xd8, 0xea, 0xf1, 0xde, 0xcb, 0xcc, 0xc2, + 0xc4, 0xd2, 0xd9, 0xd3, 0xc4, 0xc4, 0xd2, 0xdb, + 0xd9, 0xd2, 0xd1, 0xc4, 0xd3, 0xd9, 0xd3, 0xd2, + 0xd3, 0xd6, 0xed, 0xed, 0x5a, 0x41, 0x97, 0x7f, + 0xd8, 0x15, 0x15, 0x15, 0xeb, 0x23, 0x6, 0x55, + 0x74, 0xa8, 0xa7, 0x62, 0x62, 0x82, 0x68, 0x98, + 0x46, 0x8d, 0x5e, 0x8d, 0x98, 0x28, 0xf7, 0x8d, + 0x98, 0x5e, 0x5e, 0x8d, 0x98, 0x5e, 0x5e, 0x8d, + 0x98, 0x5e, 0x28, 0x98, 0x98, 0x5e, 0x6c, 0x46, + 0x8d, 0x6c, 0x28, 0x8d, 0x8d, 0x5e, 0x5e, 0x8d, + 0x8d, 0x68, 0x76, 0x76, 0x8d, 0x86, 0x6c, 0x8d, + 0x8d, 0x68, 0x79, 0x98, 0x8d, 0x5e, 0x82, 0x93, + 0x76, 0x6c, 0xb9, 0x2c, 0x28, 0x9f, 0x82, 0x46, + 0x5e, 0x5e, 0x82, 0x8d, 0x5e, 0x68, 0x79, 0xa7, + 0x32, 0x5e, 0xa7, 0xa6, 0x43, 0x5e, 0x79, 0x8d, + 0x8d, 0x5e, 0x8d, 0x8d, 0x68, 0x68, 0x82, 0xa7, + 0x6c, 0x5e, 0x82, 0xa8, 0x37, 0x8d, 0x8d, 0x5c, + 0x82, 0x75, 0x75, 0x79, 0x79, 0x32, 0x43, 0x8d, + 0xa9, 0x7, 0x43, + 0xb3, 0xa6, 0x11, 0xb, 0x6e, 0x6e, 0x34, 0x34, + 0x34, 0x48, 0x7f, 0x73, 0x34, 0xf2, 0x15, 0x3d, + 0x70, 0x99, 0x58, 0x58, 0x4d, 0x4d, 0x63, 0x67, + 0x48, 0x3b, 0xeb, 0xf2, 0x16, 0xf2, 0x15, 0xf2, + 0xeb, 0xeb, 0x15, 0x15, 0xeb, 0xe6, 0xbf, 0x50, + 0xa1, 0xd3, 0xcf, 0xd2, 0xd2, 0xd2, 0xd3, 0xd6, + 0xd3, 0xd1, 0xd1, 0xc4, 0xd9, 0xd3, 0xd2, 0xd0, + 0xcb, 0xde, 0xde, 0xde, 0xde, 0xd8, 0xe1, 0xeb, + 0x16, 0x16, 0x16, 0x16, 0x14, 0x16, 0x16, 0x14, + 0xf2, 0x3d, 0x16, 0x14, 0x3d, 0x2b, 0x7f, 0x71, + 0x6b, 0x6b, 0x71, 0x71, 0x59, 0x63, 0x71, 0x6b, + 0x85, 0x7f, 0x80, 0x71, 0x6b, 0x71, 0x71, 0x6b, + 0x71, 0x59, 0x58, 0x71, 0x59, 0x71, 0x71, 0x85, + 0x80, 0x70, 0x70, 0x3d, 0x16, 0x3d, 0x48, 0x80, + 0x80, 0x7f, 0x3f, 0x3b, 0x34, 0xf2, 0xee, 0x16, + 0x14, 0x16, 0x14, 0x16, 0x16, 0x16, 0x14, 0x3d, + 0x16, 0x15, 0xf2, 0xeb, 0xf2, 0xf2, 0xee, 0xee, + 0xeb, 0xeb, 0xeb, 0xf1, 0xed, 0xfe, 0x1a, 0xfe, + 0x36, 0x1a, 0x15, 0xf2, 0x15, 0x15, 0x15, 0x17, + 0xfa, 0x15, 0xf5, 0x34, 0x1d, 0x1a, 0x22, 0x17, + 0x3b, 0x17, 0x17, 0x14, 0x16, 0x14, 0x14, 0x16, + 0x3d, 0x15, 0x17, 0x3f, 0x1d, 0x1d, 0x3f, 0x3b, + 0x70, 0x48, 0x34, 0x48, 0x67, 0x85, 0x99, 0x85, + 0x81, 0x6b, 0x85, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x91, 0x5d, 0x58, 0x71, 0x6b, 0x85, 0x85, + 0x81, 0x91, 0x6a, 0x6a, 0x6a, 0x6b, 0x6b, 0x6a, + 0x85, 0x6f, 0x5d, 0x4d, 0x59, 0x58, 0x9a, 0x80, + 0x59, 0x6b, 0x71, 0x71, 0x7f, 0x99, 0x48, 0x48, + 0x54, 0x73, 0xee, 0x3d, 0xee, 0x3d, 0xf2, 0x16, + 0xee, 0xeb, 0xe6, 0xd8, 0xe6, 0xd7, 0xd9, 0xd3, + 0xc4, 0xc4, 0xd1, 0xc7, 0xd2, 0xc4, 0xd1, 0xd5, + 0xd2, 0xd3, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, 0xd3, + 0xd3, 0xd0, 0xd0, 0x5a, 0xfd, 0xb, 0xbf, 0xcb, + 0xeb, 0xe1, 0xeb, 0xde, 0x23, 0x6, 0xf8, 0x5f, + 0x5c, 0x28, 0x68, 0x4e, 0x8d, 0x5e, 0x6c, 0x5e, + 0x8d, 0x68, 0x9f, 0x28, 0x5e, 0x5e, 0x9e, 0x5e, + 0x5e, 0x28, 0x68, 0x68, 0x5e, 0x68, 0x6c, 0x28, + 0x5e, 0x68, 0x9f, 0x5e, 0x28, 0x5e, 0x9f, 0x32, + 0x5e, 0x5e, 0x5e, 0x5e, 0x68, 0xa3, 0x9f, 0x8, + 0x68, 0xa3, 0x9f, 0x68, 0x5e, 0xa3, 0xa3, 0x68, + 0x4e, 0x5e, 0x28, 0x6c, 0x68, 0xa3, 0x6c, 0xb7, + 0xe, 0x28, 0x6c, 0x28, 0x32, 0xfc, 0x28, 0x68, + 0x68, 0x68, 0xa3, 0xf7, 0x5e, 0x68, 0x5e, 0x9f, + 0x28, 0x28, 0x5e, 0x5e, 0x68, 0x68, 0xe, 0xfc, + 0x5e, 0x4e, 0xa3, 0x8, 0xf7, 0x5e, 0x9f, 0x6c, + 0x86, 0xfc, 0x28, 0x5e, 0x68, 0x86, 0x68, 0xfc, + 0x1f, 0x6c, 0xa3, 0x68, 0x9f, 0x8, 0xfc, 0x5e, + 0x68, 0x32, 0x32, + 0xa6, 0x60, 0xa8, 0x50, 0x5a, 0x6e, 0x2a, 0xee, + 0x15, 0xfa, 0x39, 0x73, 0x16, 0x16, 0x15, 0x70, + 0x70, 0x99, 0x5d, 0x60, 0x6f, 0x6a, 0x83, 0x83, + 0x80, 0x54, 0xf2, 0xf2, 0xee, 0xeb, 0xde, 0xeb, + 0xe1, 0xeb, 0xeb, 0x15, 0xf2, 0xcb, 0xd0, 0xe3, + 0xa1, 0xd2, 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd1, 0xd1, 0xd0, 0xd3, 0xd6, 0xcb, + 0xd8, 0xd8, 0xde, 0xe1, 0xee, 0xee, 0xee, 0x16, + 0xf2, 0x3d, 0xee, 0x16, 0x16, 0x16, 0xf5, 0xf2, + 0x3d, 0x34, 0x34, 0x15, 0x3d, 0x3f, 0x59, 0x90, + 0x6a, 0x95, 0x81, 0x5d, 0x6a, 0x6a, 0x83, 0x6a, + 0x6f, 0x58, 0x6b, 0x81, 0x5d, 0x83, 0x71, 0x71, + 0x5d, 0x6f, 0x85, 0x90, 0x6a, 0x5d, 0x9a, 0x9a, + 0x7f, 0x70, 0x3d, 0x3d, 0x3d, 0x3d, 0x3b, 0x48, + 0x6e, 0x73, 0xf2, 0x34, 0xee, 0x16, 0xff, 0x14, + 0xff, 0x16, 0x14, 0x14, 0xff, 0x14, 0x14, 0x18, + 0xee, 0x16, 0xde, 0xd7, 0xd7, 0xd8, 0xde, 0xde, + 0xd8, 0xde, 0xe6, 0xe6, 0xdb, 0x3, 0xe0, 0xe0, + 0xf1, 0xe6, 0x23, 0xfa, 0x23, 0x1d, 0x1a, 0x1d, + 0xfe, 0x23, 0x17, 0x34, 0xfa, 0xfa, 0x2a, 0xeb, + 0xde, 0x17, 0x3b, 0x3b, 0xfa, 0x3b, 0x17, 0x3d, + 0x18, 0x16, 0x16, 0xee, 0x3d, 0x15, 0xf2, 0xf2, + 0xeb, 0x54, 0x34, 0x99, 0x90, 0x83, 0x90, 0x3a, + 0x83, 0x6a, 0x41, 0x6f, 0x6a, 0xaa, 0x83, 0x55, + 0x7e, 0x7e, 0x7e, 0x7e, 0x91, 0x6a, 0x5d, 0x5d, + 0x6a, 0x6a, 0x99, 0x41, 0x97, 0x41, 0x97, 0x83, + 0x6a, 0x6a, 0x6a, 0x5d, 0x5d, 0x5d, 0x5d, 0x4d, + 0x63, 0x3a, 0x97, 0x5a, 0x99, 0x6e, 0xf1, 0x23, + 0x7f, 0x6e, 0xfa, 0x15, 0x15, 0xf2, 0xee, 0xee, + 0xe1, 0xe1, 0xde, 0xd8, 0xd6, 0xe0, 0xd6, 0xed, + 0xe7, 0xd2, 0xc7, 0xe2, 0xdb, 0xd9, 0xd2, 0xc2, + 0xc4, 0xd3, 0xd6, 0xd3, 0xd2, 0xc4, 0xd2, 0xed, + 0xd9, 0xd9, 0xbf, 0xcc, 0x5a, 0xe0, 0xe0, 0xd8, + 0xeb, 0xeb, 0xeb, 0xa, 0xfd, 0x2c, 0x1e, 0x1f, + 0x30, 0x37, 0x6c, 0x5e, 0x5e, 0xfc, 0xa0, 0x28, + 0x68, 0x68, 0x68, 0x1f, 0x1e, 0x68, 0xa3, 0x5e, + 0x1f, 0x1f, 0x28, 0x6c, 0x5e, 0x86, 0xf7, 0x1f, + 0x4e, 0x5e, 0xa3, 0x37, 0x1f, 0x79, 0x75, 0x82, + 0x82, 0x37, 0x1e, 0xa0, 0x68, 0x9f, 0x6c, 0xfc, + 0x1e, 0x9e, 0x5e, 0x5e, 0x5e, 0x28, 0x68, 0x32, + 0x75, 0x86, 0xfc, 0xc, 0x28, 0x68, 0x28, 0x46, + 0x46, 0x1e, 0x82, 0x76, 0x76, 0x1e, 0x46, 0x76, + 0x5e, 0x68, 0x37, 0x2f, 0x82, 0x68, 0x5e, 0x79, + 0x28, 0x46, 0x98, 0x98, 0x76, 0x28, 0x30, 0xa8, + 0xb8, 0x5e, 0x82, 0x1e, 0x28, 0x75, 0x32, 0x8d, + 0x5e, 0x28, 0x98, 0x8d, 0x6c, 0x6c, 0x6c, 0x38, + 0x55, 0xf7, 0x5e, 0x79, 0x43, 0x32, 0x8d, 0x98, + 0x75, 0x86, 0x75, + 0xfc, 0x37, 0x37, 0xa1, 0x6e, 0xe6, 0xeb, 0xeb, + 0xeb, 0xde, 0xe6, 0xd8, 0x2a, 0x73, 0x34, 0x15, + 0x23, 0x4d, 0x83, 0x83, 0x83, 0x72, 0x50, 0xa6, + 0xcc, 0xd3, 0xcb, 0x15, 0xeb, 0xe6, 0xd6, 0xd8, + 0x1, 0xde, 0xe1, 0xee, 0xe1, 0xe6, 0xe0, 0xd4, + 0xcc, 0xc2, 0xc2, 0xd1, 0xe5, 0xd1, 0xc4, 0xc2, + 0xd2, 0xd3, 0xd3, 0xd2, 0xc4, 0xd2, 0xd6, 0xd8, + 0xe6, 0xd8, 0xd8, 0xeb, 0xf2, 0x16, 0x16, 0x16, + 0xf2, 0xee, 0x16, 0x16, 0xf5, 0x15, 0xeb, 0xf5, + 0x3d, 0xfa, 0x7f, 0x70, 0x21, 0x42, 0x58, 0x5d, + 0x6f, 0x6f, 0x83, 0x63, 0x90, 0x6a, 0x6a, 0x6a, + 0x35, 0x5d, 0x95, 0x6a, 0x6a, 0x5d, 0x31, 0x63, + 0x99, 0x99, 0x90, 0x3a, 0x4a, 0x6a, 0x71, 0x9a, + 0x36, 0x1d, 0x3b, 0x15, 0x3d, 0x3d, 0x3d, 0xf2, + 0xf2, 0xee, 0x3d, 0x16, 0xee, 0x14, 0x14, 0xf2, + 0x16, 0x14, 0x14, 0x14, 0x14, 0xff, 0xff, 0x14, + 0x16, 0xee, 0xd8, 0xd6, 0xd6, 0xed, 0xe0, 0xd3, + 0xd3, 0xe0, 0xe6, 0xd7, 0xd7, 0xcb, 0xe6, 0xe0, + 0xd7, 0xf1, 0xfb, 0xfd, 0xf9, 0x1a, 0x1a, 0x1c, + 0x39, 0x39, 0x23, 0x2a, 0xe6, 0x15, 0x34, 0xfa, + 0xfa, 0xfa, 0x1d, 0x1a, 0x1d, 0x1d, 0x1d, 0x17, + 0x17, 0x3b, 0x16, 0x14, 0x16, 0x16, 0x16, 0xf2, + 0x16, 0x15, 0xf2, 0x2a, 0x41, 0x41, 0x41, 0x3a, + 0x83, 0x6f, 0x85, 0x81, 0x6a, 0x85, 0x99, 0x6f, + 0x6a, 0x6a, 0x83, 0x6a, 0x6a, 0x6b, 0x81, 0x7e, + 0x6a, 0x6a, 0x58, 0x63, 0x71, 0x99, 0x23, 0x80, + 0x71, 0x71, 0x6f, 0x5d, 0x71, 0x85, 0x5d, 0x5d, + 0x9a, 0x99, 0x58, 0x71, 0x85, 0x80, 0x48, 0x15, + 0x2a, 0xfa, 0xf2, 0x16, 0x3d, 0x16, 0xe1, 0xf2, + 0x34, 0xeb, 0x1, 0xeb, 0xa, 0xd8, 0xe6, 0xf1, + 0xd6, 0xd0, 0xd2, 0xd2, 0xd0, 0xd0, 0xd1, 0xc4, + 0xd3, 0xd6, 0xd6, 0xd9, 0xd3, 0xd3, 0xd2, 0xd3, + 0xe0, 0xd6, 0xd2, 0xd0, 0x5a, 0xa, 0xd8, 0xeb, + 0xeb, 0x15, 0xf2, 0x34, 0x39, 0x4a, 0x2f, 0x74, + 0x62, 0x46, 0xb8, 0x5f, 0x8f, 0x98, 0x76, 0x8f, + 0x8b, 0x79, 0x8d, 0x98, 0x8f, 0x8d, 0x68, 0x98, + 0x98, 0x82, 0x76, 0x46, 0x98, 0x68, 0x68, 0x98, + 0x8b, 0x5e, 0x5e, 0x8b, 0x8b, 0x82, 0x76, 0xaa, + 0x8f, 0x82, 0x93, 0x74, 0x8b, 0x79, 0x79, 0x98, + 0x98, 0x68, 0x8d, 0x8b, 0x98, 0x68, 0x79, 0x9c, + 0x8d, 0x68, 0x8d, 0x8f, 0x98, 0x68, 0x93, 0x8f, + 0x8b, 0x82, 0x5f, 0xaa, 0xaa, 0x82, 0x8b, 0xaa, + 0x5f, 0x86, 0x8d, 0x8b, 0x8d, 0x68, 0x46, 0x8b, + 0x8d, 0x8d, 0x8f, 0xaa, 0xb3, 0x76, 0x8f, 0x62, + 0x28, 0x28, 0x98, 0x8b, 0x79, 0x8d, 0x98, 0x93, + 0x5e, 0x8d, 0x8b, 0x8f, 0xba, 0x5f, 0x5f, 0x8f, + 0x8f, 0x43, 0x79, 0x8f, 0x98, 0x75, 0x8d, 0x8b, + 0x98, 0xa7, 0x89, + 0x46, 0x5f, 0xa8, 0xa1, 0x6e, 0x73, 0xf5, 0xf2, + 0xf2, 0xf2, 0xf2, 0xeb, 0x48, 0x7f, 0x73, 0x21, + 0x42, 0x41, 0x83, 0x6a, 0x83, 0x41, 0xb, 0x60, + 0x50, 0xb4, 0xd7, 0xde, 0x34, 0xd8, 0xcb, 0xcb, + 0xe6, 0xeb, 0xf2, 0xf2, 0x15, 0xe6, 0xcb, 0xfd, + 0x3e, 0xc8, 0xbc, 0xc8, 0xe4, 0xc2, 0xc4, 0xd1, + 0xc4, 0xd3, 0xd6, 0xd6, 0xd2, 0xd3, 0xd7, 0xde, + 0xde, 0xeb, 0xde, 0xfa, 0xeb, 0xeb, 0xf2, 0xf2, + 0x16, 0x16, 0xee, 0x3d, 0xf2, 0xf2, 0xeb, 0xf2, + 0x3d, 0x3f, 0x54, 0x70, 0x48, 0x58, 0x85, 0x81, + 0x6a, 0x6a, 0x90, 0x66, 0x99, 0x9d, 0x6a, 0x66, + 0x90, 0x5d, 0x71, 0x6a, 0x5d, 0x71, 0x58, 0x99, + 0x80, 0x71, 0x71, 0x59, 0x6b, 0x58, 0x9a, 0x80, + 0x48, 0x21, 0x3b, 0x14, 0xf2, 0x3d, 0x3d, 0x3d, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, + 0x3d, 0xf2, 0x54, 0xea, 0xd6, 0xe0, 0xd6, 0xd6, + 0xd3, 0xd3, 0xd7, 0xd7, 0xe6, 0xf1, 0x39, 0xf9, + 0xed, 0xf9, 0x1a, 0x1a, 0x23, 0x1c, 0x23, 0xfa, + 0xfa, 0xfa, 0x21, 0xfa, 0xfa, 0x23, 0x1a, 0x1a, + 0x23, 0x3f, 0x21, 0x1a, 0x23, 0x15, 0x21, 0x15, + 0x3d, 0x15, 0x17, 0x17, 0x17, 0x14, 0x14, 0x14, + 0x14, 0x17, 0x15, 0x3d, 0x34, 0x48, 0x54, 0x99, + 0x90, 0x85, 0x6b, 0x91, 0x81, 0x71, 0x85, 0x6b, + 0x6a, 0x6f, 0x63, 0x5d, 0x71, 0x85, 0x85, 0x6a, + 0x6f, 0x71, 0x95, 0x71, 0x71, 0x58, 0x67, 0x58, + 0x59, 0x9a, 0x80, 0x85, 0x71, 0x9a, 0x9a, 0x6b, + 0x71, 0x71, 0x6b, 0x6b, 0x6b, 0x59, 0x67, 0x3b, + 0x3b, 0x3b, 0x16, 0x16, 0x14, 0x16, 0xf2, 0xf2, + 0xeb, 0xde, 0xd8, 0xeb, 0xd8, 0xe6, 0xd8, 0xa, + 0xde, 0xd7, 0xd3, 0xd0, 0xbf, 0xd0, 0xd2, 0xdb, + 0xdb, 0xd0, 0xd3, 0xd3, 0xd3, 0xd9, 0xd3, 0xd2, + 0xd3, 0xd6, 0xe0, 0xcb, 0x99, 0xb4, 0xcb, 0x73, + 0x34, 0xfa, 0xeb, 0x54, 0x42, 0x1b, 0x11, 0xb3, + 0x8f, 0x9c, 0xe, 0x55, 0x62, 0x93, 0x68, 0x98, + 0x62, 0x46, 0x5e, 0x98, 0x8b, 0x5e, 0x28, 0x74, + 0x8b, 0x5e, 0x68, 0x46, 0x98, 0x5e, 0x5e, 0x79, + 0x98, 0x37, 0x8d, 0x9c, 0x82, 0x82, 0x5f, 0x60, + 0x62, 0x8d, 0x8d, 0x93, 0x62, 0x1f, 0x5e, 0x8d, + 0x8d, 0x68, 0xfc, 0x5f, 0x79, 0xa3, 0x68, 0xa7, + 0x46, 0x68, 0x79, 0x8d, 0x8d, 0xfc, 0x82, 0x9c, + 0xa7, 0x28, 0x60, 0xa1, 0x2c, 0x37, 0x82, 0x93, + 0x1f, 0x37, 0x68, 0x79, 0x5e, 0x68, 0x46, 0x46, + 0xc, 0x6c, 0x62, 0x3e, 0xf8, 0x76, 0x8d, 0x8d, + 0x28, 0x1f, 0x46, 0x8d, 0x68, 0x5e, 0x1e, 0x30, + 0x8, 0x6c, 0x8d, 0x76, 0x12, 0x46, 0x46, 0x98, + 0x79, 0x75, 0x32, 0x5c, 0x79, 0x68, 0x6c, 0x8d, + 0x46, 0xa0, 0xa7, + 0x74, 0xa6, 0x50, 0xb, 0x7f, 0x73, 0x15, 0x3d, + 0x15, 0x17, 0xee, 0x3d, 0x34, 0x34, 0xfa, 0x70, + 0x7f, 0x99, 0xb0, 0x11, 0x6a, 0x6a, 0x55, 0x55, + 0x6a, 0x5a, 0x73, 0x15, 0x15, 0x15, 0xd8, 0xcb, + 0xe6, 0x73, 0xeb, 0x15, 0x23, 0xf9, 0x5a, 0x97, + 0xb0, 0xc8, 0xc7, 0xbe, 0xbf, 0xd1, 0xc4, 0xc4, + 0xd2, 0xd2, 0xd3, 0xd7, 0xc0, 0xd8, 0x1, 0xeb, + 0xeb, 0xe1, 0xee, 0xee, 0xe1, 0xeb, 0xe1, 0x15, + 0x16, 0x15, 0x17, 0x3d, 0xf2, 0x15, 0x3d, 0x3d, + 0x3b, 0x3d, 0x70, 0x70, 0x67, 0x71, 0x71, 0x71, + 0x6a, 0x5d, 0x81, 0x71, 0x71, 0x6b, 0x5d, 0x67, + 0x67, 0x71, 0x85, 0x99, 0x9a, 0x6b, 0x81, 0x71, + 0x5d, 0x71, 0x71, 0x6b, 0x6b, 0x59, 0x7f, 0x48, + 0x34, 0x16, 0x16, 0x14, 0x16, 0x16, 0x70, 0x3d, + 0x16, 0x16, 0x14, 0xff, 0x14, 0x14, 0x16, 0x16, + 0x14, 0x14, 0x17, 0x14, 0x14, 0x16, 0x15, 0xf5, + 0xf2, 0x21, 0xf9, 0xed, 0xd3, 0xe0, 0xd0, 0xd6, + 0xd6, 0xd7, 0xd6, 0xd6, 0xd7, 0xf9, 0xfe, 0x41, + 0x5a, 0xf9, 0xfe, 0xf1, 0xfa, 0x15, 0x21, 0x21, + 0x15, 0xfa, 0x1c, 0x1c, 0x1c, 0x2e, 0x1a, 0x1a, + 0x48, 0x2a, 0x3f, 0x15, 0x15, 0x15, 0x15, 0x21, + 0xfa, 0x15, 0x1d, 0x1d, 0x3b, 0x16, 0x16, 0x17, + 0x16, 0x3d, 0x3d, 0x16, 0x3d, 0x16, 0x34, 0x54, + 0xa, 0x7f, 0x56, 0x6a, 0x6a, 0x91, 0x81, 0x6a, + 0x5d, 0x71, 0x85, 0x81, 0x6a, 0x99, 0x99, 0x5d, + 0x6a, 0x81, 0x6a, 0x6a, 0x81, 0x5d, 0x71, 0x85, + 0x85, 0x99, 0x4d, 0x58, 0x71, 0x80, 0x99, 0x85, + 0x6b, 0x81, 0x5d, 0x6a, 0x6f, 0x9a, 0x7f, 0x7f, + 0x3f, 0x2b, 0x34, 0x3d, 0x3b, 0x15, 0xf2, 0x3d, + 0xeb, 0x1, 0xde, 0xeb, 0xeb, 0xfa, 0xd8, 0xcb, + 0xcb, 0xd7, 0xd6, 0xd0, 0xcc, 0xcc, 0xc4, 0xdb, + 0xdb, 0xd2, 0xd2, 0xc4, 0xd9, 0xd6, 0xd9, 0xd2, + 0xc4, 0xd0, 0xe0, 0xcb, 0x97, 0xa1, 0xd0, 0xde, + 0x1, 0xe6, 0xa, 0xea, 0xfe, 0x58, 0x11, 0x2f, + 0x76, 0x68, 0xfc, 0x30, 0x46, 0x5e, 0x68, 0x5e, + 0x8d, 0x1f, 0x6c, 0x28, 0x5e, 0x68, 0x1f, 0x79, + 0x8d, 0x68, 0x68, 0x68, 0x1f, 0x68, 0x4e, 0x6c, + 0x6c, 0x28, 0x28, 0x28, 0x5e, 0x68, 0x28, 0x5c, + 0x8d, 0x5e, 0x86, 0x5e, 0x1f, 0x82, 0x5e, 0x28, + 0x8, 0x5e, 0x28, 0x82, 0x68, 0xa3, 0xa3, 0x5e, + 0x28, 0x68, 0x68, 0x5e, 0x9f, 0xe, 0x37, 0xa0, + 0xdd, 0x6c, 0x1f, 0x27, 0xa7, 0x5e, 0x68, 0x5e, + 0x28, 0x79, 0xa3, 0x5e, 0x9f, 0x6c, 0x37, 0x5e, + 0x6c, 0x7, 0x75, 0x46, 0x46, 0x68, 0x0, 0x68, + 0xa3, 0x8d, 0x5e, 0x5e, 0x9f, 0x7, 0x5e, 0x28, + 0x5e, 0x9e, 0x68, 0x68, 0x28, 0x8d, 0x43, 0x79, + 0x5e, 0xa3, 0x6c, 0x32, 0x5e, 0x7, 0x8, 0x5e, + 0x32, 0x86, 0xa3, + 0x9c, 0x60, 0x72, 0x1b, 0x90, 0xa, 0x1, 0x34, + 0x21, 0x34, 0x34, 0x15, 0xf2, 0xee, 0x73, 0x2a, + 0x90, 0x4a, 0x27, 0x6a, 0x55, 0x9c, 0xa7, 0xba, + 0x72, 0xf9, 0xeb, 0xee, 0xeb, 0xeb, 0xde, 0x6e, + 0x41, 0x3, 0xd7, 0xeb, 0xf9, 0xf4, 0xd0, 0xbf, + 0xd4, 0xdb, 0xd2, 0xc4, 0xc7, 0xc4, 0xd3, 0xd9, + 0xdb, 0xc4, 0xd2, 0xd6, 0xd8, 0xd8, 0xe6, 0xeb, + 0xf2, 0xf2, 0xee, 0xee, 0x16, 0xf2, 0xf2, 0xf2, + 0xf2, 0x34, 0xee, 0x16, 0x3b, 0x22, 0xfa, 0x3d, + 0x3f, 0x42, 0x36, 0x4d, 0x63, 0x5d, 0x6a, 0x80, + 0x5d, 0x81, 0x91, 0x81, 0x91, 0x4a, 0x5d, 0x9a, + 0x5d, 0x6b, 0x5d, 0x99, 0x3a, 0x81, 0x6a, 0x81, + 0x4a, 0x58, 0x9a, 0x90, 0xb0, 0x99, 0x48, 0x15, + 0x3d, 0x14, 0x3d, 0x16, 0x3d, 0x16, 0xf2, 0x3d, + 0x16, 0x14, 0x14, 0x14, 0x14, 0x17, 0x17, 0x3b, + 0x17, 0x17, 0x17, 0x14, 0x16, 0x16, 0xee, 0xee, + 0xeb, 0xd8, 0xe0, 0xd9, 0xd1, 0xd2, 0xdb, 0xd9, + 0xd7, 0xd7, 0xdb, 0xd3, 0xd7, 0xf1, 0xf9, 0xed, + 0xd2, 0xd2, 0xed, 0xed, 0xf9, 0xf9, 0xfe, 0xfe, + 0x23, 0x21, 0x1a, 0xfe, 0xf9, 0xfa, 0x23, 0x23, + 0xde, 0xfa, 0x23, 0x1d, 0x1d, 0x22, 0x2e, 0x1a, + 0x23, 0x15, 0x1d, 0x23, 0xfa, 0x14, 0x3d, 0x3d, + 0x16, 0x3d, 0xee, 0x17, 0x15, 0xf2, 0x70, 0x48, + 0x7f, 0x70, 0x67, 0x6a, 0x6a, 0x83, 0x7e, 0x55, + 0x6a, 0x6a, 0x91, 0x55, 0x6a, 0x85, 0x71, 0x6a, + 0x91, 0x7e, 0x6a, 0x91, 0x6a, 0xaf, 0x83, 0x6a, + 0x5d, 0x6f, 0x6a, 0x81, 0x5d, 0x5d, 0x63, 0x71, + 0x5d, 0x99, 0x90, 0x35, 0x5d, 0x99, 0x41, 0x90, + 0x4d, 0x2a, 0x15, 0x3b, 0x21, 0x3b, 0xf2, 0x2b, + 0xeb, 0xf2, 0xeb, 0xe1, 0xde, 0xde, 0xd6, 0xd3, + 0xed, 0xe0, 0xe0, 0xdb, 0xec, 0xc7, 0xc4, 0xd0, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd3, 0xd9, 0xd2, + 0xd5, 0xd5, 0xd0, 0xd0, 0xbf, 0xbf, 0xe0, 0xeb, + 0xee, 0xeb, 0xde, 0xea, 0x90, 0x27, 0x2f, 0x46, + 0xa7, 0x37, 0x5e, 0x37, 0x5e, 0x68, 0x9f, 0x6c, + 0x5e, 0x5e, 0xa3, 0x86, 0x5e, 0x68, 0x68, 0x86, + 0x5e, 0x68, 0x68, 0x9f, 0x32, 0x68, 0x9f, 0x28, + 0x5e, 0x5e, 0xa3, 0x5e, 0x8d, 0x68, 0x68, 0x8d, + 0x6c, 0x5e, 0x6c, 0x8, 0xb8, 0x9f, 0x5e, 0x28, + 0x6c, 0x68, 0x68, 0x8d, 0x68, 0x68, 0x68, 0x5e, + 0x68, 0x68, 0x9f, 0x6c, 0xb8, 0x6c, 0x5e, 0x82, + 0x37, 0x28, 0x93, 0x62, 0x8d, 0x28, 0x28, 0x76, + 0x7, 0x7, 0x5e, 0x28, 0x9f, 0x5e, 0x5e, 0x8d, + 0x5e, 0x28, 0x79, 0x98, 0x79, 0x6c, 0x37, 0x8d, + 0xb6, 0x6c, 0x8d, 0x8d, 0xfc, 0x5e, 0x8d, 0x8d, + 0x68, 0x68, 0x37, 0x8d, 0x5e, 0xa7, 0xa0, 0x2f, + 0x38, 0x28, 0x28, 0x89, 0x8d, 0x28, 0xfc, 0x82, + 0x8d, 0x68, 0x32, + 0x82, 0xa7, 0xf0, 0xb, 0x5a, 0xa, 0xd8, 0x15, + 0xeb, 0xde, 0xeb, 0x73, 0x39, 0x23, 0x26, 0x90, + 0x6a, 0x5f, 0x5f, 0x5f, 0xa7, 0x7, 0xbd, 0xc7, + 0xe3, 0x5a, 0xc9, 0xa, 0x54, 0xf9, 0xf9, 0x41, + 0xa1, 0xbf, 0xd8, 0xeb, 0xde, 0xd6, 0xd2, 0xd2, + 0xd2, 0xd4, 0xdb, 0xc4, 0xce, 0xd5, 0xc4, 0xd3, + 0xd3, 0xd0, 0xd2, 0xd6, 0xd7, 0xde, 0xde, 0xe1, + 0xeb, 0xde, 0xeb, 0x15, 0xf2, 0x3d, 0xf2, 0x16, + 0x16, 0x16, 0x3d, 0xf2, 0x15, 0xea, 0xa, 0x15, + 0x7f, 0x6f, 0x5d, 0x6f, 0x5d, 0x6a, 0x90, 0x90, + 0x90, 0x60, 0x83, 0x97, 0x5d, 0x6a, 0x6a, 0x5d, + 0x6a, 0x55, 0x6a, 0x6b, 0x6a, 0x6a, 0x6a, 0x6f, + 0x90, 0x90, 0x63, 0x54, 0x73, 0x39, 0x7f, 0xee, + 0x3d, 0x3b, 0x17, 0x16, 0x14, 0x18, 0x14, 0x16, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x17, 0x1d, 0x1d, + 0x3f, 0x3b, 0x17, 0x14, 0x14, 0xff, 0x14, 0xee, + 0xeb, 0xe6, 0xe5, 0x50, 0xcc, 0xe2, 0xbe, 0xd4, + 0xd3, 0xd6, 0xd6, 0xd6, 0xe6, 0xd8, 0xd6, 0xd7, + 0xe0, 0xd7, 0xfd, 0xfd, 0xf9, 0xfe, 0xfe, 0xfe, + 0xfb, 0x3f, 0x1c, 0x23, 0xfa, 0x17, 0x23, 0x1d, + 0xfa, 0xfa, 0x1a, 0x1a, 0x1a, 0x1c, 0x1d, 0x1a, + 0x1d, 0x15, 0x21, 0x34, 0x17, 0x16, 0x17, 0x3d, + 0x18, 0x14, 0x14, 0x17, 0x3d, 0x17, 0x3b, 0x23, + 0x54, 0x7f, 0x56, 0x6a, 0x6f, 0x99, 0x6f, 0x83, + 0x41, 0x99, 0x6a, 0x6a, 0x6a, 0x6a, 0x81, 0x7e, + 0x6a, 0x5b, 0x6a, 0x6a, 0x6f, 0x80, 0x58, 0x6a, + 0x6f, 0x85, 0x90, 0x5d, 0x71, 0x85, 0x90, 0x80, + 0x58, 0x9a, 0x63, 0x6a, 0x6f, 0x80, 0x48, 0xf9, + 0x54, 0x34, 0x3f, 0x3f, 0x3b, 0x3d, 0xee, 0x73, + 0x34, 0x15, 0xeb, 0xeb, 0xee, 0xee, 0xee, 0xde, + 0xe6, 0xe6, 0xe0, 0xd6, 0xd9, 0xdb, 0xd1, 0xc4, + 0xd2, 0xd3, 0xd6, 0xd9, 0xd3, 0xc4, 0xd2, 0xe0, + 0xdb, 0xbf, 0xd2, 0xd4, 0xd0, 0xd0, 0xd7, 0x73, + 0xeb, 0x15, 0xf2, 0x3b, 0x4d, 0x6a, 0x7e, 0xaa, + 0x27, 0x5f, 0x28, 0xa7, 0x74, 0x1f, 0xe, 0x46, + 0x8b, 0x8d, 0x5e, 0x1f, 0x30, 0x5e, 0x5e, 0x79, + 0x9c, 0x1f, 0x28, 0x82, 0x93, 0x5e, 0xfc, 0x62, + 0x98, 0x8d, 0x8d, 0x98, 0x55, 0x37, 0x8d, 0x9c, + 0xaa, 0xe, 0x1e, 0x93, 0x46, 0x5e, 0x37, 0x30, + 0x46, 0x68, 0x79, 0x98, 0x9c, 0xe, 0x5c, 0x8f, + 0x9c, 0x6c, 0x1e, 0x62, 0x82, 0x5e, 0x98, 0x62, + 0x30, 0x76, 0x8b, 0x8f, 0xaa, 0x2c, 0x62, 0x62, + 0x9c, 0x28, 0x8d, 0x62, 0x5e, 0x5e, 0x8d, 0x98, + 0x46, 0x2f, 0x74, 0x8b, 0xa7, 0xa8, 0x27, 0x62, + 0x8d, 0x5e, 0x98, 0x62, 0x46, 0x8d, 0x8b, 0x8b, + 0x8d, 0xe, 0x55, 0x93, 0xa7, 0xc, 0xa4, 0x60, + 0x4b, 0x5c, 0x98, 0x8b, 0x8f, 0x5c, 0x30, 0x8f, + 0x98, 0x5e, 0xa7, + 0xa7, 0x5f, 0xc8, 0xd4, 0xa, 0xeb, 0xf2, 0xee, + 0x15, 0xeb, 0xeb, 0x7f, 0x90, 0x6f, 0x83, 0x52, + 0x60, 0xa7, 0xb8, 0xb7, 0xa8, 0xa8, 0xbe, 0xc8, + 0x83, 0xb, 0xa, 0xfa, 0xfa, 0x42, 0x41, 0xb4, + 0xb4, 0xd6, 0xd8, 0xf2, 0xd8, 0xe6, 0xe0, 0xd0, + 0xc5, 0xc8, 0xd1, 0xdb, 0xe7, 0xd2, 0xd2, 0xd3, + 0xe0, 0xd6, 0xd7, 0xd8, 0x34, 0x15, 0xe1, 0xee, + 0x14, 0xee, 0xee, 0xf2, 0x16, 0x3d, 0xeb, 0xf2, + 0xf2, 0xf2, 0x16, 0x16, 0x15, 0x54, 0x23, 0x3f, + 0x48, 0x6f, 0x6f, 0x71, 0x6b, 0x6b, 0x71, 0x58, + 0x85, 0x5d, 0x58, 0x80, 0x71, 0x6a, 0x85, 0x85, + 0x58, 0x71, 0x71, 0x85, 0x85, 0x85, 0x71, 0x71, + 0x85, 0x90, 0x80, 0x70, 0x16, 0x3d, 0x70, 0x16, + 0x16, 0x3d, 0x3d, 0x16, 0x16, 0x3d, 0x16, 0x16, + 0xff, 0x14, 0x14, 0x14, 0x14, 0x3b, 0x21, 0x3b, + 0x15, 0x16, 0x3d, 0x18, 0xff, 0x16, 0x3d, 0x16, + 0xeb, 0xf1, 0x90, 0xf8, 0xbe, 0xd4, 0xd1, 0xc4, + 0xc4, 0xd3, 0xd6, 0xd7, 0xd7, 0xd9, 0xd9, 0xed, + 0xde, 0x23, 0x41, 0x41, 0xf1, 0x23, 0x23, 0x23, + 0xfa, 0xfa, 0x15, 0x23, 0x23, 0x1d, 0x36, 0x1a, + 0x1d, 0x1d, 0x1a, 0x1a, 0x23, 0x34, 0x23, 0x21, + 0x34, 0x34, 0x15, 0x1d, 0x2e, 0x17, 0x22, 0x17, + 0x17, 0x14, 0x14, 0x16, 0x16, 0x3d, 0x3d, 0x34, + 0x1d, 0x67, 0x9a, 0x6a, 0x5d, 0x71, 0x71, 0x5d, + 0x7f, 0x7f, 0x58, 0x6f, 0x85, 0x85, 0x6a, 0x91, + 0x6a, 0x81, 0x6b, 0x6b, 0x71, 0x59, 0x71, 0x6b, + 0x9a, 0x7f, 0x7f, 0x9a, 0x71, 0x9a, 0x99, 0x63, + 0x4d, 0x58, 0x71, 0x81, 0x71, 0x63, 0x42, 0x48, + 0x3f, 0x3b, 0x70, 0x54, 0x3d, 0x16, 0x3d, 0x48, + 0x39, 0x34, 0xfa, 0xeb, 0x15, 0x3d, 0xee, 0x15, + 0x34, 0xd8, 0xd6, 0xd6, 0xed, 0xec, 0xcc, 0xc4, + 0xc4, 0xd2, 0xd9, 0xd3, 0xd2, 0xc4, 0xd2, 0xd9, + 0xd7, 0xcb, 0xd1, 0xbf, 0xb, 0x1b, 0xd4, 0xcb, + 0x73, 0x15, 0x3d, 0x3b, 0x67, 0x6a, 0x7e, 0x60, + 0x6a, 0x46, 0x5e, 0x46, 0x8b, 0x46, 0x1f, 0x98, + 0x98, 0x5e, 0x4e, 0x46, 0x46, 0x5e, 0x86, 0x82, + 0x93, 0x1f, 0x8d, 0x8d, 0x8d, 0x68, 0x68, 0x46, + 0x8d, 0x68, 0x68, 0x76, 0x2c, 0x28, 0x5e, 0x76, + 0x5f, 0x1f, 0x1f, 0x8d, 0x68, 0x9f, 0x68, 0x1f, + 0x37, 0x5e, 0x86, 0x82, 0xa7, 0x37, 0x8d, 0x8d, + 0x8d, 0x68, 0x68, 0x8d, 0x8d, 0x5e, 0x9f, 0x8d, + 0xa7, 0xa0, 0xa7, 0x7d, 0x2c, 0xe, 0x46, 0x8d, + 0x8d, 0x5e, 0x28, 0x5e, 0x68, 0x68, 0x5e, 0x5e, + 0x6c, 0xb7, 0xa0, 0x76, 0x28, 0x6c, 0x8d, 0x5e, + 0x5e, 0x9e, 0x8d, 0x8d, 0x5e, 0x6c, 0x76, 0x82, + 0x5e, 0x7, 0xa7, 0x82, 0x5e, 0x6c, 0xfc, 0x75, + 0x43, 0x75, 0x68, 0x79, 0x8d, 0x32, 0x5e, 0x6c, + 0x5e, 0x32, 0x9f, + 0x60, 0xaa, 0xbf, 0xd0, 0xea, 0x34, 0x15, 0x15, + 0x15, 0xf2, 0xf5, 0xfa, 0x7f, 0xb4, 0xbf, 0x50, + 0x60, 0x74, 0xf3, 0xa6, 0x74, 0x55, 0x27, 0x60, + 0x6a, 0x97, 0xa, 0x15, 0x34, 0x73, 0xcb, 0x6e, + 0xd8, 0xde, 0xde, 0xeb, 0x73, 0xf9, 0xfe, 0x20, + 0x50, 0xbe, 0xc2, 0xd2, 0xd3, 0xd3, 0xd2, 0xd6, + 0xd7, 0x1, 0xd8, 0xf1, 0xa, 0x73, 0xee, 0x14, + 0xee, 0x16, 0x16, 0x16, 0x16, 0x3d, 0x3d, 0x3d, + 0x70, 0x3f, 0x3b, 0x3f, 0x42, 0x36, 0x42, 0x48, + 0x7f, 0x7f, 0x54, 0x9a, 0x71, 0x58, 0x71, 0x71, + 0x6b, 0x5d, 0x6b, 0x59, 0x6b, 0x6b, 0x71, 0x63, + 0x63, 0x58, 0x9a, 0x99, 0x90, 0x85, 0x6b, 0x6b, + 0x71, 0x85, 0x80, 0x48, 0x3d, 0x3d, 0x16, 0x14, + 0xff, 0x14, 0x14, 0x3d, 0x16, 0x3d, 0x16, 0xf2, + 0x14, 0x17, 0x22, 0x17, 0x17, 0x17, 0x15, 0x17, + 0x16, 0x16, 0x14, 0x16, 0x16, 0x3b, 0x15, 0xf5, + 0xfa, 0xcb, 0xb0, 0xa6, 0xc7, 0xd2, 0xd3, 0xd2, + 0xc4, 0xd3, 0xd6, 0xe0, 0xd6, 0xd2, 0xd2, 0xed, + 0xf1, 0xea, 0xed, 0xd0, 0xd8, 0xde, 0xfa, 0xfa, + 0xfa, 0xfa, 0x23, 0x1c, 0x1c, 0x1a, 0x36, 0x36, + 0x1c, 0x23, 0x39, 0x23, 0x15, 0x15, 0x2b, 0x21, + 0x15, 0x22, 0x1a, 0x1a, 0x1d, 0x2e, 0x22, 0x1d, + 0x17, 0x17, 0x17, 0x3b, 0x3b, 0x3d, 0x3b, 0x21, + 0x70, 0x99, 0x90, 0x6a, 0x6a, 0x81, 0x81, 0x6a, + 0x5d, 0x71, 0x71, 0x6a, 0x99, 0x99, 0x71, 0x91, + 0x6a, 0x81, 0x81, 0x81, 0x6a, 0x81, 0x5d, 0x6a, + 0x5d, 0x59, 0x67, 0x9a, 0x58, 0x9a, 0x6f, 0x6a, + 0x9a, 0x71, 0x71, 0x6a, 0x5d, 0x71, 0x99, 0x48, + 0x48, 0x42, 0x48, 0x23, 0x22, 0x3d, 0x3b, 0xfa, + 0x34, 0x15, 0xf1, 0xd8, 0xde, 0xee, 0xe1, 0x1, + 0xde, 0xd8, 0xd6, 0xd3, 0xd4, 0xf8, 0xf3, 0xc1, + 0xc2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd2, 0xd2, 0xd3, + 0xe0, 0xd9, 0xec, 0xe4, 0xf8, 0xba, 0xe3, 0xd6, + 0xd8, 0xe1, 0xde, 0xeb, 0x23, 0x1b, 0x2c, 0x2f, + 0xe, 0x6c, 0x68, 0x5e, 0x5e, 0x8d, 0x68, 0x68, + 0x6c, 0x6c, 0x9f, 0x68, 0x6c, 0x68, 0xa3, 0x5e, + 0x86, 0x68, 0x68, 0x4e, 0x75, 0x68, 0x68, 0x4e, + 0x6c, 0x9f, 0x5e, 0x9f, 0x7, 0x7, 0x68, 0x5e, + 0x5e, 0x5e, 0x9e, 0x5e, 0x9f, 0x9f, 0xa3, 0x9f, + 0xb6, 0xb8, 0x9f, 0x5e, 0x9f, 0x68, 0x68, 0x68, + 0x68, 0xa3, 0x5e, 0x86, 0x9f, 0x9f, 0x7, 0x68, + 0x6c, 0xdd, 0xfc, 0x28, 0x5e, 0x5e, 0x68, 0x5e, + 0x5e, 0x9f, 0x68, 0x4e, 0x68, 0xb6, 0x8, 0x5e, + 0x6c, 0x7, 0x6c, 0x28, 0x5e, 0x9f, 0x68, 0xa2, + 0xa3, 0x68, 0x5e, 0x86, 0x5e, 0x9f, 0xb8, 0x28, + 0x68, 0x5e, 0x5e, 0x5e, 0xfc, 0x86, 0x5e, 0x68, + 0x68, 0x68, 0xa3, 0x8, 0x5e, 0xa3, 0x9f, 0x6c, + 0xfc, 0x32, 0x32, + 0x5f, 0x5f, 0xc8, 0xb, 0x41, 0x48, 0x23, 0xfa, + 0xeb, 0x34, 0x34, 0x9, 0x9, 0x7f, 0x97, 0xe8, + 0xa8, 0x5f, 0x6c, 0x28, 0x82, 0x9c, 0x37, 0xa8, + 0xb3, 0xaf, 0x73, 0x1, 0x15, 0xeb, 0x73, 0xcb, + 0x3, 0xe0, 0xcb, 0xd8, 0xf1, 0xed, 0xb, 0xd4, + 0xc2, 0xc4, 0xd2, 0xd2, 0xd3, 0xd0, 0xd3, 0xd6, + 0xcb, 0xd8, 0xde, 0xf5, 0xeb, 0xe1, 0xee, 0x16, + 0x14, 0x16, 0xf2, 0x16, 0x3d, 0x15, 0x15, 0x34, + 0x73, 0x2a, 0x15, 0x7f, 0x63, 0x6f, 0x6f, 0x58, + 0x67, 0x63, 0x67, 0x63, 0x6b, 0x6a, 0x99, 0x83, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x91, 0x6a, 0x6a, + 0x97, 0x90, 0x90, 0x4d, 0x6f, 0x85, 0x71, 0x6b, + 0x85, 0x99, 0x7f, 0x70, 0x16, 0x3d, 0x16, 0xff, + 0x14, 0x14, 0x18, 0x14, 0x18, 0x16, 0x16, 0x16, + 0xf5, 0xf2, 0x3b, 0x3b, 0x15, 0xeb, 0x15, 0xeb, + 0xf2, 0xf2, 0x14, 0x14, 0xf2, 0xee, 0xe1, 0xeb, + 0xe6, 0xe0, 0xd4, 0xce, 0xc2, 0xd2, 0xd2, 0xd3, + 0xd6, 0xd3, 0xd2, 0xd3, 0xd9, 0xd9, 0xd6, 0xd6, + 0xd7, 0xd6, 0xd6, 0xd6, 0xed, 0xfd, 0xfd, 0xfd, + 0x1c, 0x1a, 0xfe, 0xfa, 0xfa, 0x23, 0x23, 0xf9, + 0xf1, 0xe6, 0xfa, 0xf9, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1d, 0x1d, 0x1d, 0xfa, 0x15, 0x17, 0x15, 0xeb, + 0x17, 0x3b, 0x15, 0xf2, 0x16, 0x15, 0x21, 0x34, + 0x2b, 0x54, 0x41, 0xb4, 0xaf, 0x5d, 0x55, 0x60, + 0x6a, 0x6a, 0x6a, 0x55, 0x6a, 0x71, 0x6a, 0x7e, + 0x83, 0x6a, 0x6a, 0xb0, 0x97, 0x83, 0x83, 0x5b, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x3a, 0x58, 0x90, + 0x99, 0x90, 0x97, 0x99, 0x99, 0x85, 0x90, 0x90, + 0x4d, 0x58, 0x58, 0x58, 0x80, 0x3f, 0x3b, 0x16, + 0x16, 0x16, 0xe1, 0xde, 0xe1, 0xee, 0xde, 0xd7, + 0xd8, 0xde, 0xd7, 0xd3, 0xbf, 0xbe, 0xce, 0xd1, + 0xd2, 0xc4, 0xc4, 0xd2, 0xd3, 0xd6, 0xd3, 0xc4, + 0xd2, 0xe7, 0x20, 0xec, 0xa1, 0xcc, 0xd6, 0xcb, + 0xeb, 0xee, 0xf2, 0x15, 0xf1, 0xfd, 0x1b, 0x2f, + 0x9c, 0x5e, 0x28, 0xfc, 0x28, 0x9f, 0x5e, 0x5e, + 0xc, 0x1f, 0x68, 0x32, 0x8d, 0x5e, 0xfc, 0x1f, + 0x68, 0x9e, 0x5e, 0x68, 0x24, 0x6c, 0xa3, 0x75, + 0x28, 0xfc, 0x28, 0x5e, 0x5e, 0x4e, 0x68, 0x1e, + 0x5e, 0x5e, 0xa3, 0x86, 0xf3, 0xb9, 0x6c, 0x5e, + 0x5e, 0x28, 0xfc, 0x79, 0x68, 0x68, 0x68, 0x1f, + 0x1f, 0x9f, 0x5e, 0x5e, 0x6c, 0xdd, 0x28, 0x76, + 0x82, 0x5e, 0x46, 0x55, 0x8d, 0x5e, 0x6c, 0x93, + 0x46, 0xa0, 0x6c, 0x8d, 0x5e, 0x5e, 0x1f, 0x8d, + 0x5e, 0x5e, 0x82, 0x30, 0x46, 0x68, 0x37, 0x8d, + 0x28, 0xe, 0xe, 0x5e, 0x86, 0x68, 0x1f, 0x46, + 0x5e, 0x8d, 0x93, 0x62, 0x46, 0x2f, 0x2f, 0xa8, + 0x9c, 0x32, 0xfc, 0x2f, 0x8d, 0x68, 0x75, 0x89, + 0x30, 0x32, 0x75, + 0x68, 0xfc, 0xf3, 0xf0, 0x3, 0xfa, 0xeb, 0xd8, + 0xde, 0xeb, 0x3, 0xe5, 0xa1, 0x11, 0x11, 0x37, + 0x28, 0x6c, 0x6c, 0x7, 0x7, 0x9f, 0x7, 0xba, + 0xbf, 0xdb, 0xe0, 0x6e, 0x34, 0x34, 0xf9, 0xb, + 0xb, 0xcb, 0xe6, 0xe6, 0xd8, 0xd7, 0xbf, 0xc2, + 0xd2, 0xd2, 0xd2, 0xc4, 0xd2, 0xd2, 0xd6, 0xd7, + 0xde, 0xde, 0xde, 0xe1, 0xee, 0xe1, 0xee, 0xee, + 0xeb, 0xee, 0x16, 0x2b, 0x2a, 0xeb, 0x34, 0x15, + 0xf2, 0xeb, 0x54, 0x7f, 0x9, 0x5a, 0x4a, 0x6a, + 0x6a, 0x6a, 0x58, 0x5d, 0x6a, 0x4a, 0x99, 0x31, + 0x3a, 0x97, 0x6e, 0x9a, 0x83, 0x83, 0x90, 0x71, + 0x6a, 0x6a, 0x58, 0x58, 0x71, 0x71, 0x71, 0x9a, + 0x99, 0x54, 0xf2, 0xf2, 0xeb, 0xe1, 0x16, 0xff, + 0x14, 0xff, 0x14, 0x14, 0x14, 0xff, 0xff, 0x18, + 0x15, 0xf2, 0xee, 0x15, 0x73, 0xf5, 0xeb, 0xeb, + 0xe1, 0x16, 0xff, 0x14, 0x16, 0xe1, 0xeb, 0xde, + 0xcb, 0xed, 0xe5, 0xf0, 0xdc, 0xc2, 0xd2, 0xd9, + 0xd3, 0xd3, 0xd2, 0xc4, 0xd3, 0xd3, 0xd6, 0xd7, + 0xd7, 0xd7, 0xe6, 0xd7, 0xed, 0x11, 0xb, 0x20, + 0xf9, 0x23, 0xfa, 0xe6, 0x2a, 0xfa, 0xfa, 0xeb, + 0x23, 0x23, 0xfe, 0xfe, 0xfe, 0x31, 0x1c, 0x1c, + 0x1d, 0x21, 0x21, 0x17, 0x17, 0x17, 0x21, 0x15, + 0x2b, 0x2e, 0x48, 0x15, 0x16, 0x3b, 0x48, 0x73, + 0x70, 0x1d, 0xfe, 0x26, 0x67, 0x58, 0x6a, 0x97, + 0x56, 0x5d, 0x81, 0x6a, 0x6a, 0x6b, 0x6a, 0x6a, + 0x6b, 0x6b, 0x5d, 0x31, 0x7f, 0x31, 0x6b, 0x83, + 0x99, 0x85, 0x71, 0x90, 0x6f, 0x71, 0x58, 0x99, + 0x80, 0x63, 0x63, 0x63, 0x63, 0x71, 0x6b, 0x6b, + 0x71, 0x58, 0x6b, 0x6f, 0x99, 0x7f, 0x3f, 0x3b, + 0x16, 0x14, 0x16, 0x16, 0x14, 0x16, 0xee, 0xeb, + 0xe1, 0xee, 0xd8, 0xe6, 0xcb, 0xb4, 0xcc, 0xbf, + 0xc4, 0xc2, 0xd1, 0xc4, 0xd3, 0xd9, 0xdb, 0xdb, + 0xcb, 0xed, 0xed, 0x5a, 0x5a, 0xb4, 0x3, 0xa, + 0xe1, 0xf2, 0x16, 0xee, 0x15, 0xfa, 0x99, 0x6a, + 0x7e, 0x5f, 0x76, 0x5c, 0x74, 0x8d, 0x86, 0x8b, + 0x8f, 0x98, 0x75, 0x98, 0x8b, 0x8d, 0x8d, 0x98, + 0x8b, 0x8d, 0x9e, 0x98, 0x38, 0x5e, 0x79, 0x98, + 0x98, 0x8d, 0x8d, 0x98, 0x8b, 0x6c, 0x5e, 0x93, + 0x7d, 0x7, 0x6c, 0x98, 0x93, 0x79, 0x5e, 0x8b, + 0x98, 0x5e, 0x8d, 0x8b, 0x76, 0x7, 0xa8, 0x8b, + 0x93, 0x6c, 0x76, 0x8b, 0x98, 0x75, 0x82, 0x8b, + 0x93, 0x76, 0x9c, 0x7e, 0x7d, 0xa7, 0xa9, 0x74, + 0x98, 0x5e, 0x82, 0x8b, 0x8d, 0x5e, 0x98, 0x8f, + 0x8d, 0x82, 0x74, 0x8f, 0x98, 0xa7, 0xa8, 0x62, + 0x79, 0x86, 0x98, 0x98, 0x5e, 0x5e, 0x93, 0x8f, + 0x8d, 0x1e, 0x74, 0x8f, 0x7d, 0x9c, 0x89, 0xaa, + 0x62, 0x5e, 0x8d, 0x8b, 0x98, 0x43, 0x43, 0x98, + 0x98, 0x75, 0x79, + 0x76, 0x5f, 0x11, 0xe5, 0xcb, 0x73, 0xeb, 0xeb, + 0xeb, 0xfa, 0xaf, 0x50, 0x60, 0x60, 0x27, 0xc, + 0x9c, 0x76, 0x6c, 0xf3, 0xa6, 0x37, 0x8, 0xba, + 0xbf, 0xfd, 0x5a, 0xa, 0x73, 0xfa, 0x23, 0x5a, + 0x5a, 0xe6, 0x73, 0xeb, 0xeb, 0xa, 0xe5, 0xba, + 0xd4, 0xd4, 0xe7, 0xbf, 0xd3, 0xd6, 0xd8, 0xd8, + 0xe1, 0xde, 0xe1, 0xee, 0x14, 0x14, 0xee, 0xf2, + 0xf2, 0x16, 0x14, 0x34, 0x2a, 0xeb, 0x15, 0x15, + 0x2b, 0x34, 0x7f, 0x7f, 0x6e, 0x7f, 0x56, 0x5d, + 0x6b, 0x5d, 0x6b, 0x71, 0x81, 0x6b, 0x6b, 0x71, + 0x59, 0x80, 0x7f, 0x63, 0x71, 0x6f, 0x3c, 0x71, + 0x71, 0x6b, 0x6b, 0x71, 0x71, 0x80, 0x80, 0x67, + 0x3b, 0x34, 0x16, 0xf2, 0x16, 0x16, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x17, + 0x15, 0x15, 0x21, 0x15, 0xfa, 0xeb, 0xee, 0x16, + 0xff, 0x14, 0x14, 0x14, 0xf5, 0xeb, 0xf5, 0xfa, + 0xe5, 0x50, 0x40, 0x60, 0xb7, 0xc7, 0xc4, 0xd3, + 0xd3, 0xd3, 0xd3, 0xc4, 0xc4, 0xd3, 0xd7, 0xd7, + 0xe6, 0xe6, 0xe6, 0xf1, 0xfd, 0xe5, 0xdb, 0xed, + 0xfa, 0x21, 0x15, 0xfa, 0x1d, 0x23, 0x21, 0x15, + 0x1a, 0x36, 0x1c, 0x23, 0x1c, 0x1a, 0x34, 0x3f, + 0x1d, 0x21, 0xfa, 0xfa, 0x22, 0x1a, 0x1d, 0x22, + 0x48, 0x1d, 0x21, 0x16, 0x3d, 0x16, 0xf2, 0xee, + 0x70, 0x80, 0x80, 0x85, 0x9a, 0x71, 0x6f, 0x56, + 0x7f, 0x71, 0x71, 0x97, 0x56, 0x71, 0x71, 0x6f, + 0x6b, 0x71, 0x81, 0x71, 0x71, 0x6b, 0x81, 0x85, + 0x67, 0x63, 0x85, 0x90, 0x9a, 0x71, 0x58, 0x9a, + 0x63, 0x71, 0x71, 0x6b, 0x6b, 0x6b, 0x71, 0x6f, + 0x80, 0x71, 0x85, 0x90, 0x48, 0x7f, 0x7f, 0x70, + 0x15, 0x16, 0x3b, 0xf5, 0x16, 0x14, 0x16, 0x16, + 0xf2, 0xf2, 0xeb, 0xe6, 0xa, 0x5a, 0x50, 0xc8, + 0xcc, 0xce, 0xd5, 0xd2, 0xc4, 0xd3, 0xd9, 0xd3, + 0xd6, 0xe0, 0x5a, 0x41, 0xb4, 0x41, 0x99, 0xa, + 0x73, 0xf2, 0x15, 0x15, 0xf2, 0x34, 0x31, 0x6a, + 0x83, 0x2c, 0x28, 0x82, 0x93, 0x68, 0x28, 0x8d, + 0x8b, 0x8d, 0x8d, 0x98, 0x62, 0x8, 0x5e, 0x8d, + 0x8d, 0x5e, 0x68, 0x79, 0x8d, 0x68, 0x68, 0x8d, + 0x79, 0x68, 0x68, 0x79, 0x5f, 0xdd, 0x9f, 0x82, + 0x5e, 0x9f, 0x5e, 0x8d, 0x8d, 0x68, 0x68, 0x1e, + 0x8d, 0x5e, 0x6c, 0x82, 0x9c, 0xdd, 0xa0, 0x82, + 0x8d, 0x68, 0x28, 0x82, 0x8d, 0x86, 0x5e, 0x76, + 0x76, 0x7, 0xa8, 0x74, 0x93, 0xf3, 0x2c, 0x93, + 0x68, 0x32, 0x5e, 0x1f, 0x5e, 0x68, 0x68, 0x79, + 0xfc, 0xa7, 0xa9, 0x74, 0x5e, 0x5e, 0x2f, 0x46, + 0x68, 0x68, 0x5e, 0x5e, 0xfc, 0x5e, 0x76, 0x76, + 0x68, 0xfc, 0x2f, 0x9c, 0x9f, 0x68, 0x32, 0x1f, + 0x30, 0x43, 0x68, 0x79, 0x43, 0x28, 0x43, 0x82, + 0x28, 0x5e, 0x32, + 0xa8, 0xaa, 0x50, 0xe5, 0xcb, 0x23, 0x23, 0x48, + 0x2a, 0x54, 0x40, 0x60, 0x7e, 0x7e, 0x93, 0x9c, + 0xb3, 0x9c, 0x28, 0xe, 0x60, 0x9c, 0x28, 0x74, + 0x83, 0x7f, 0x6e, 0x1, 0xeb, 0xeb, 0xfa, 0xa, + 0x73, 0x73, 0xeb, 0xeb, 0xfa, 0x23, 0x40, 0x2c, + 0xc8, 0xc7, 0xbf, 0xd6, 0xc0, 0xcb, 0xd8, 0xeb, + 0xeb, 0xf2, 0x15, 0x17, 0xee, 0x14, 0x16, 0xf2, + 0xf2, 0x3d, 0x16, 0x16, 0xf2, 0x34, 0x73, 0x7f, + 0x48, 0x48, 0x42, 0x58, 0x59, 0x59, 0x59, 0x6b, + 0x71, 0x99, 0x63, 0x6b, 0x71, 0x85, 0x71, 0x81, + 0x6b, 0x6b, 0x71, 0x71, 0x6b, 0x71, 0x58, 0x71, + 0x9a, 0x7f, 0x85, 0x85, 0x9a, 0x99, 0x80, 0x42, + 0x48, 0x48, 0x3f, 0x3b, 0x16, 0x16, 0x14, 0x14, + 0x14, 0x16, 0x16, 0x14, 0x14, 0x16, 0x17, 0x1d, + 0x2e, 0x1d, 0x22, 0x22, 0xf5, 0xee, 0x14, 0x14, + 0x16, 0x14, 0x14, 0xf5, 0xde, 0xd8, 0xe6, 0xed, + 0xe5, 0xf8, 0xba, 0xba, 0xc7, 0xc4, 0xd2, 0xd2, + 0xd2, 0xd2, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, 0xd6, + 0xd7, 0xd7, 0xe6, 0xde, 0xd7, 0xd7, 0xd7, 0xd8, + 0xe6, 0xa, 0xeb, 0x23, 0x1a, 0x1c, 0x36, 0x36, + 0xfe, 0x1c, 0xfa, 0xfa, 0xfa, 0x23, 0x21, 0x17, + 0x21, 0x1c, 0x1c, 0x1d, 0x36, 0x1a, 0x36, 0x23, + 0x1a, 0x1a, 0x22, 0x17, 0x17, 0x3b, 0x3d, 0x3d, + 0x3d, 0x7f, 0x97, 0xb0, 0x1b, 0x31, 0x71, 0x5d, + 0x71, 0x6b, 0x5d, 0x9a, 0x63, 0x85, 0x81, 0x90, + 0x6a, 0x6b, 0x81, 0x95, 0x6b, 0x6a, 0x6a, 0x83, + 0x6f, 0x71, 0x85, 0x66, 0x9a, 0x6b, 0x6b, 0x90, + 0x9a, 0x59, 0x71, 0x81, 0x6f, 0x71, 0x58, 0x4d, + 0x99, 0x9a, 0x6a, 0x6f, 0x4d, 0x80, 0x9a, 0x54, + 0x3d, 0x16, 0x3b, 0xf2, 0xf2, 0x3d, 0x16, 0xee, + 0xee, 0xf2, 0xe6, 0xd8, 0xde, 0xfd, 0xf0, 0xcd, + 0xbe, 0xc4, 0xd2, 0xd9, 0xd3, 0xc4, 0xd3, 0xd6, + 0xe0, 0x3, 0xe3, 0xf8, 0x40, 0x20, 0x41, 0xcb, + 0x73, 0x1, 0xf5, 0x15, 0x34, 0x54, 0x72, 0x27, + 0x27, 0x12, 0x5e, 0x5e, 0x5e, 0xfc, 0x1f, 0x5e, + 0x8d, 0x6c, 0x9f, 0xfc, 0xe, 0x7, 0xa3, 0x5e, + 0x5e, 0xfc, 0x68, 0x68, 0x68, 0xa3, 0x68, 0xfc, + 0x5e, 0x9f, 0x9f, 0x5e, 0x1f, 0x28, 0x68, 0x5e, + 0x9e, 0x5e, 0x5e, 0x68, 0x68, 0xa3, 0x9f, 0x5e, + 0x6c, 0x7, 0x7, 0x6c, 0x68, 0x1f, 0x5e, 0x68, + 0x5e, 0x4e, 0x28, 0x37, 0x5e, 0x6c, 0x7, 0x37, + 0x37, 0xf7, 0xf3, 0xa7, 0x37, 0x28, 0x1f, 0x5e, + 0x86, 0xa3, 0x68, 0x28, 0x5e, 0x68, 0x9f, 0x86, + 0x5e, 0x1e, 0xe, 0x6c, 0x5e, 0x86, 0x1e, 0x37, + 0x68, 0xa3, 0x9e, 0x8, 0x37, 0x68, 0xb6, 0x28, + 0x5e, 0x37, 0x5c, 0x32, 0x32, 0x68, 0x5e, 0x1e, + 0x46, 0x68, 0xa3, 0x68, 0x7, 0x1e, 0x28, 0x32, + 0x9f, 0x86, 0x86, + 0xba, 0xa7, 0xf7, 0xa1, 0xe5, 0xfd, 0x1b, 0x40, + 0x41, 0x1b, 0x1b, 0x50, 0x50, 0xc, 0x6c, 0x28, + 0x2c, 0xa7, 0x5e, 0x86, 0x76, 0xa7, 0xfc, 0x2c, + 0x50, 0xbf, 0xe6, 0xeb, 0x16, 0xf2, 0xa, 0x7f, + 0xa, 0xe6, 0x6e, 0x9, 0x7f, 0xe5, 0x11, 0xe4, + 0xc1, 0xc4, 0xd2, 0xd6, 0xd7, 0xd7, 0xd7, 0xde, + 0xeb, 0xe1, 0xde, 0x15, 0x16, 0x17, 0x3b, 0x15, + 0x16, 0x3d, 0x15, 0x15, 0x3d, 0x15, 0x3f, 0x23, + 0x39, 0x48, 0x58, 0x6b, 0x6a, 0x6a, 0x6a, 0x6a, + 0x58, 0x58, 0x71, 0x81, 0x6f, 0x63, 0x6a, 0x81, + 0x91, 0x6a, 0x58, 0x63, 0x6a, 0xb0, 0x90, 0x85, + 0x4d, 0x31, 0x71, 0x71, 0x58, 0x7f, 0x2a, 0x3f, + 0x70, 0x2a, 0xf2, 0x3d, 0x3d, 0x14, 0x14, 0x16, + 0xff, 0x18, 0x14, 0x16, 0x14, 0x14, 0x17, 0x22, + 0x22, 0x23, 0xf2, 0xf2, 0xee, 0x14, 0xf2, 0x14, + 0x14, 0x14, 0x16, 0xf5, 0xcb, 0xd9, 0xd6, 0xe0, + 0xe5, 0xd1, 0xc4, 0xc4, 0xd2, 0xd9, 0xd3, 0xc4, + 0xc7, 0xd1, 0xdb, 0xdb, 0xd1, 0xc7, 0xc4, 0xd3, + 0xd9, 0xe0, 0xd9, 0xd3, 0xd6, 0xe0, 0xd8, 0xe6, + 0xf1, 0xed, 0xde, 0xeb, 0xf1, 0xf1, 0xcb, 0xd7, + 0xf1, 0xf1, 0xf1, 0xe0, 0xf9, 0xfe, 0x1a, 0x1d, + 0x1c, 0x31, 0x48, 0x23, 0x42, 0x23, 0x48, 0xf1, + 0xf9, 0x1a, 0x2e, 0x22, 0x1d, 0x22, 0x3b, 0x16, + 0x3d, 0x3b, 0x73, 0xea, 0xf9, 0x41, 0x97, 0x40, + 0x6a, 0x6a, 0x6a, 0x6a, 0x81, 0x6a, 0x5d, 0x90, + 0x63, 0x81, 0x6a, 0x40, 0x6a, 0x6a, 0x6a, 0x6a, + 0x83, 0x6a, 0x81, 0x5d, 0x6b, 0x81, 0x6a, 0x90, + 0x31, 0x58, 0x5d, 0xb0, 0x41, 0x6f, 0x3a, 0x90, + 0x6f, 0x5d, 0x6a, 0x6a, 0x71, 0x58, 0x67, 0x34, + 0x17, 0x16, 0x16, 0x16, 0x16, 0xee, 0xee, 0xee, + 0x16, 0xde, 0xcb, 0xcb, 0xde, 0xcb, 0x5a, 0xc7, + 0xd2, 0xd2, 0xd3, 0xd3, 0xc4, 0xd2, 0xd2, 0xdb, + 0xd6, 0xd9, 0xe3, 0x50, 0xb, 0x3, 0xd9, 0xd8, + 0xeb, 0xee, 0xeb, 0xee, 0x15, 0x5a, 0x11, 0x2f, + 0x62, 0x46, 0x5e, 0x5e, 0x8d, 0x5e, 0x5e, 0x5e, + 0x5e, 0x6c, 0x5e, 0x5e, 0x79, 0x68, 0x9f, 0x4e, + 0x68, 0x68, 0x68, 0x68, 0x68, 0x9f, 0x5e, 0x5e, + 0x8d, 0xb6, 0x5e, 0x8d, 0x8f, 0x8d, 0x68, 0x5e, + 0x8d, 0x5e, 0x68, 0x68, 0x68, 0x9f, 0x7, 0x82, + 0x5e, 0x68, 0x28, 0x82, 0x82, 0x82, 0x5e, 0x76, + 0x82, 0x6c, 0xa0, 0x76, 0x5e, 0x76, 0x9c, 0x8f, + 0x62, 0x8f, 0x74, 0x7e, 0x7d, 0x82, 0x28, 0x82, + 0x5e, 0xa3, 0x28, 0xa8, 0x5e, 0x68, 0x5e, 0x82, + 0x5e, 0x5e, 0x93, 0x62, 0x46, 0x82, 0x89, 0x93, + 0x5e, 0x28, 0x37, 0x5f, 0x5e, 0x5e, 0x98, 0x93, + 0x8d, 0x5e, 0x98, 0x89, 0x82, 0x82, 0x76, 0x89, + 0xad, 0x6c, 0x75, 0x5c, 0x89, 0x86, 0x79, 0x89, + 0x79, 0x32, 0x75, + 0xe, 0x28, 0x6c, 0xc8, 0x5a, 0xe5, 0x50, 0xcc, + 0xd1, 0xcc, 0xf8, 0x27, 0x2c, 0x6c, 0x68, 0xa3, + 0x6c, 0xfc, 0x86, 0x5e, 0xb6, 0xf7, 0xe, 0xa0, + 0xbe, 0xc4, 0xe0, 0xde, 0xf2, 0xfa, 0x5a, 0x6, + 0x23, 0xeb, 0xd8, 0xd8, 0xd8, 0xd3, 0xe5, 0xcc, + 0xc2, 0xd2, 0xd2, 0xe0, 0xde, 0xd7, 0xd8, 0xde, + 0xeb, 0xf2, 0xee, 0x15, 0xf2, 0xf2, 0xe1, 0x73, + 0x15, 0x34, 0x6e, 0x67, 0x70, 0x3f, 0x42, 0x67, + 0x42, 0x67, 0x31, 0x6a, 0x6a, 0x6a, 0x8e, 0x6a, + 0x6a, 0x6a, 0x6a, 0x81, 0x6a, 0x4a, 0x6a, 0x6a, + 0x83, 0x6e, 0x99, 0x58, 0x6a, 0x83, 0x90, 0x71, + 0x71, 0x71, 0x6b, 0x5d, 0x9a, 0x42, 0x3d, 0x16, + 0x3d, 0xf2, 0x16, 0x16, 0x16, 0x14, 0xf2, 0x14, + 0x14, 0x14, 0x14, 0x17, 0x22, 0x17, 0x14, 0x3b, + 0xf2, 0xf2, 0x14, 0x14, 0xff, 0xf2, 0x14, 0xee, + 0x15, 0xf5, 0xeb, 0xde, 0xe0, 0xd6, 0xd6, 0xd3, + 0xd3, 0xd2, 0xd2, 0xc4, 0xe2, 0xec, 0xbf, 0xd1, + 0xce, 0xce, 0xc4, 0xd2, 0xd2, 0xc4, 0xd2, 0xd2, + 0xd3, 0xd3, 0xd6, 0xd3, 0xd6, 0xd6, 0xd7, 0xf1, + 0xe0, 0xd7, 0xde, 0xeb, 0xde, 0xeb, 0xeb, 0xde, + 0xe6, 0xf9, 0x23, 0xf9, 0xfe, 0xfe, 0x36, 0x23, + 0x1a, 0x1d, 0x21, 0x15, 0xfa, 0x15, 0x15, 0xfa, + 0x23, 0x1a, 0x1a, 0x1a, 0x1c, 0x1a, 0x48, 0x3b, + 0x3b, 0x3b, 0x3d, 0x3d, 0x34, 0x34, 0x73, 0x6e, + 0x63, 0x6f, 0x6f, 0x6a, 0x81, 0x81, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6a, 0x99, 0x63, 0x6b, 0x6f, 0x97, + 0x85, 0x6b, 0x6b, 0x6b, 0x71, 0x71, 0x85, 0x85, + 0x80, 0x71, 0x71, 0x58, 0x31, 0x71, 0x71, 0x99, + 0x9a, 0x59, 0x71, 0x6b, 0x71, 0x80, 0x42, 0x15, + 0x3d, 0x3d, 0x3b, 0x16, 0x15, 0x16, 0x16, 0x16, + 0xee, 0xee, 0xde, 0xde, 0xde, 0xa, 0xd8, 0xcb, + 0xcb, 0xd0, 0xd2, 0xd2, 0xd6, 0xdb, 0xdb, 0xd1, + 0xd2, 0xd6, 0xe0, 0xe0, 0xcb, 0xe6, 0xa, 0xeb, + 0xf2, 0x3d, 0xf2, 0xf2, 0xee, 0x23, 0x3a, 0x6a, + 0x7e, 0x93, 0xa7, 0x30, 0x62, 0x8d, 0x8d, 0x98, + 0x62, 0x46, 0x5e, 0x98, 0x98, 0x32, 0x28, 0x8b, + 0x8b, 0x68, 0x68, 0x98, 0x5c, 0x68, 0x5e, 0x8b, + 0x8b, 0x1f, 0x37, 0x98, 0x98, 0x8d, 0x28, 0x5f, + 0x8d, 0x68, 0x7, 0x8b, 0x8f, 0x5e, 0x8d, 0x8b, + 0x98, 0x5e, 0x46, 0x62, 0x98, 0x5e, 0xa8, 0xaa, + 0x46, 0x28, 0x37, 0x74, 0x93, 0x1f, 0x7e, 0x94, + 0x94, 0x91, 0x6a, 0x5d, 0x7e, 0xa7, 0xa8, 0xaa, + 0x1f, 0x82, 0x82, 0x8f, 0x8d, 0x5e, 0x1f, 0x98, + 0x82, 0x5e, 0x9c, 0xa6, 0x60, 0x82, 0x74, 0xaa, + 0x1f, 0x1f, 0x98, 0x98, 0x5e, 0x5e, 0x98, 0x30, + 0x5e, 0x8d, 0x7d, 0xb3, 0x2c, 0x46, 0x46, 0x8b, + 0x93, 0x32, 0x28, 0x62, 0x98, 0x68, 0x75, 0x8b, + 0x62, 0xe, 0x8d, + 0x46, 0x9c, 0xa7, 0xdd, 0xb4, 0x5a, 0xcc, 0xbe, + 0xa1, 0xe4, 0x2f, 0xa7, 0x74, 0x46, 0x5e, 0x8d, + 0x98, 0x9c, 0x6c, 0x6c, 0x9c, 0xc8, 0xf7, 0xa0, + 0xa1, 0xd0, 0xcb, 0xde, 0xeb, 0x15, 0x6e, 0xfe, + 0x2a, 0xeb, 0x15, 0xeb, 0xeb, 0xcb, 0xcc, 0x50, + 0xaf, 0xd0, 0xcb, 0xcb, 0x73, 0x1, 0xde, 0xee, + 0xee, 0xee, 0xf2, 0x3d, 0xeb, 0x3d, 0xf2, 0xf2, + 0xee, 0x15, 0x48, 0x67, 0x42, 0x4d, 0x63, 0x31, + 0x63, 0x59, 0x71, 0x71, 0x90, 0x90, 0x5d, 0x6b, + 0x6f, 0x6f, 0x6b, 0x71, 0x6b, 0x6a, 0x71, 0x71, + 0x58, 0x48, 0x67, 0x59, 0x9a, 0x99, 0x63, 0x71, + 0x59, 0x6b, 0x9a, 0x63, 0x9a, 0x73, 0x16, 0x16, + 0x16, 0x16, 0x14, 0x16, 0x16, 0x16, 0x14, 0x14, + 0x14, 0xff, 0x14, 0x16, 0x17, 0x15, 0x17, 0xf2, + 0x17, 0xf2, 0x14, 0x14, 0xf2, 0x14, 0x14, 0x16, + 0xeb, 0xeb, 0xd8, 0xd8, 0xd7, 0xd6, 0xd6, 0xd2, + 0xc4, 0xd5, 0xd2, 0xd2, 0xbe, 0xbd, 0xce, 0xd1, + 0xbf, 0xc2, 0xd3, 0xd2, 0xd2, 0xdb, 0xd3, 0xc4, + 0xc4, 0xd2, 0xd6, 0xd7, 0xd6, 0xd6, 0xe0, 0xd7, + 0xe0, 0xe0, 0xe6, 0xd7, 0xf1, 0xde, 0xeb, 0xfa, + 0xf1, 0xf1, 0x34, 0x23, 0x1c, 0xfe, 0x26, 0xfb, + 0x34, 0x21, 0x21, 0xfa, 0x21, 0x1a, 0x22, 0x22, + 0x2e, 0x36, 0x15, 0x3b, 0x22, 0x1d, 0x3b, 0x34, + 0x34, 0x70, 0x3b, 0x3b, 0x48, 0x48, 0x70, 0x3b, + 0x67, 0x63, 0x9a, 0x9a, 0x6b, 0x6b, 0x71, 0x6b, + 0x6b, 0x95, 0x6b, 0x58, 0x71, 0x6b, 0x85, 0x67, + 0x71, 0x6b, 0x6f, 0x85, 0x99, 0x80, 0x59, 0x58, + 0x58, 0x71, 0x6b, 0x59, 0x59, 0x6b, 0x5d, 0x58, + 0x67, 0x63, 0x5d, 0x85, 0x9a, 0x99, 0x48, 0x3b, + 0x1d, 0x3f, 0x3b, 0x15, 0x17, 0x3d, 0x16, 0x14, + 0xff, 0x14, 0xff, 0xee, 0x34, 0xde, 0xd8, 0xf1, + 0xcb, 0xd0, 0xd1, 0xc4, 0xd9, 0xd9, 0xd3, 0xd2, + 0xd2, 0xd3, 0xd6, 0xcb, 0xcb, 0xcb, 0xcb, 0xa, + 0x15, 0x15, 0xee, 0xf2, 0x15, 0xfa, 0xfd, 0x6a, + 0x74, 0x46, 0xfc, 0x30, 0x98, 0x82, 0x68, 0x68, + 0x46, 0x1f, 0x5e, 0x8d, 0x8d, 0x9f, 0xf7, 0x8d, + 0x68, 0x68, 0xa3, 0x68, 0x1f, 0x68, 0x68, 0x79, + 0x8d, 0x37, 0x76, 0x76, 0x8d, 0x5e, 0x7, 0xe, + 0x8d, 0x5e, 0x68, 0x8d, 0x8d, 0xfc, 0x86, 0x8d, + 0x8d, 0x68, 0xe, 0x9c, 0x5e, 0x5e, 0x7, 0xc, + 0x1f, 0x5e, 0x5e, 0x82, 0x8d, 0xa7, 0x7e, 0x91, + 0x91, 0x91, 0x83, 0x90, 0x6a, 0x82, 0x37, 0x9c, + 0x37, 0x5e, 0x5e, 0x76, 0x86, 0x68, 0x28, 0x6c, + 0x6c, 0x9f, 0x1e, 0xa6, 0x2f, 0x28, 0x5e, 0x5e, + 0x5e, 0x28, 0x5e, 0x5e, 0x68, 0x68, 0x5e, 0x28, + 0x7, 0xa3, 0x5e, 0xa0, 0xf7, 0x8d, 0x43, 0x75, + 0x68, 0xa3, 0x32, 0x75, 0x68, 0x68, 0x68, 0x68, + 0x28, 0xa0, 0x5e, + 0x9c, 0xaa, 0xa0, 0x2c, 0x40, 0xa1, 0xf3, 0xf, + 0x3e, 0x55, 0xa7, 0x8d, 0x8f, 0x74, 0xa7, 0x76, + 0x55, 0xb3, 0xc, 0x2f, 0xaa, 0x5f, 0x6c, 0x5f, + 0xb, 0x8a, 0xd8, 0xeb, 0xee, 0x15, 0xeb, 0x3d, + 0x73, 0x1, 0x34, 0xeb, 0xfa, 0xfd, 0xf8, 0x60, + 0x40, 0xea, 0xcb, 0x6e, 0xd8, 0xeb, 0xee, 0xee, + 0x14, 0x15, 0xfa, 0x15, 0x16, 0x14, 0x16, 0x16, + 0x16, 0x3b, 0x70, 0x48, 0x54, 0x99, 0x90, 0x31, + 0x58, 0x81, 0x81, 0x81, 0x58, 0x58, 0x81, 0x71, + 0x80, 0x80, 0x63, 0x85, 0x80, 0x90, 0x6f, 0x58, + 0x59, 0x71, 0x71, 0x6b, 0x71, 0x59, 0x59, 0x71, + 0x85, 0x99, 0x99, 0x48, 0x70, 0x3d, 0xf2, 0x34, + 0x3d, 0x16, 0xf5, 0x3d, 0x16, 0x14, 0x16, 0x16, + 0x17, 0x14, 0x16, 0x17, 0x15, 0x15, 0x17, 0x34, + 0x15, 0x16, 0x14, 0x16, 0xee, 0xee, 0xf2, 0xf2, + 0xde, 0xde, 0xd8, 0xd7, 0xd9, 0xed, 0xd4, 0xc4, + 0xc5, 0xbe, 0xd2, 0xd0, 0xc7, 0xc2, 0xc4, 0xd2, + 0xd3, 0xd2, 0xc2, 0xc4, 0xd1, 0xe7, 0xdb, 0xd2, + 0xc7, 0xbf, 0xd6, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, + 0xd6, 0xd7, 0xd7, 0xd3, 0xd3, 0xed, 0xf9, 0xf1, + 0xd0, 0xd4, 0xea, 0xfa, 0xf1, 0xfa, 0x34, 0x23, + 0xfa, 0x1d, 0x23, 0x1a, 0xfe, 0x1c, 0x2e, 0x1d, + 0x1d, 0x23, 0x48, 0x15, 0x3f, 0x3b, 0x16, 0x15, + 0x2b, 0x15, 0x16, 0x3b, 0x48, 0x23, 0x34, 0x21, + 0x99, 0x90, 0x99, 0x9a, 0x6a, 0x6a, 0xb0, 0x6f, + 0x81, 0x81, 0x6a, 0x6a, 0x91, 0x6a, 0x81, 0x6a, + 0x85, 0x83, 0x6a, 0x9a, 0x80, 0x58, 0x4d, 0x90, + 0x6b, 0x95, 0x81, 0x5d, 0x6b, 0x71, 0x6f, 0x6f, + 0x97, 0x83, 0x83, 0x6f, 0x85, 0x58, 0x99, 0x2b, + 0x70, 0x54, 0x17, 0x3f, 0x3d, 0x3d, 0x16, 0xf5, + 0x14, 0xff, 0x16, 0x16, 0x16, 0x1, 0xd7, 0xf1, + 0xcb, 0xd9, 0xd0, 0xd3, 0xd3, 0xd3, 0xd6, 0xd3, + 0xc4, 0xd6, 0xd7, 0xe0, 0xcb, 0xd6, 0xd3, 0xd7, + 0xe1, 0xe1, 0xde, 0xeb, 0x15, 0x23, 0x20, 0x2c, + 0x28, 0x5e, 0x68, 0x68, 0x5e, 0x68, 0x68, 0x68, + 0x68, 0x68, 0x7, 0x6c, 0x5e, 0x5e, 0x9f, 0x68, + 0xa3, 0x68, 0x4e, 0xa3, 0x68, 0x68, 0xa3, 0xa3, + 0xa3, 0x32, 0xb6, 0x8, 0x9f, 0xa3, 0x68, 0xa3, + 0x9f, 0x4e, 0x68, 0x68, 0x9e, 0xa3, 0x68, 0x9f, + 0x9f, 0xa3, 0x6c, 0x9f, 0xa3, 0x5e, 0x5e, 0x5e, + 0x68, 0x5e, 0x5e, 0xa7, 0x76, 0x7d, 0xaa, 0xb0, + 0x90, 0x81, 0x71, 0x6f, 0xad, 0x5f, 0x46, 0x93, + 0x82, 0x82, 0x68, 0x5e, 0x7, 0x68, 0x68, 0x6c, + 0x9f, 0x68, 0x5e, 0x28, 0x28, 0x5e, 0x86, 0x5e, + 0x5e, 0x9e, 0x68, 0x68, 0x7, 0x9e, 0x68, 0x6c, + 0x9f, 0x5e, 0x86, 0x5e, 0x86, 0x68, 0x68, 0x68, + 0x32, 0x86, 0x9f, 0x32, 0x5e, 0x7, 0x5e, 0x68, + 0x68, 0x9f, 0x32, + 0x37, 0xa7, 0x37, 0x37, 0x37, 0x28, 0x6c, 0x6c, + 0x1e, 0xa7, 0xb6, 0x5e, 0xa7, 0xc8, 0xa0, 0x5e, + 0x68, 0x6c, 0x6c, 0x37, 0x37, 0x5e, 0x6c, 0x28, + 0xc8, 0x3, 0xcb, 0xeb, 0xe1, 0xf2, 0xf2, 0xf2, + 0xee, 0xde, 0xde, 0xfa, 0x1c, 0x20, 0x50, 0x50, + 0xbf, 0xe0, 0xd7, 0x1, 0xde, 0xeb, 0xeb, 0xee, + 0x16, 0xfa, 0xcb, 0xd8, 0x16, 0x3b, 0x34, 0x3d, + 0x34, 0x48, 0x39, 0x99, 0x48, 0x59, 0x9d, 0x63, + 0x99, 0x4a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x5d, + 0x71, 0x58, 0x6f, 0x9a, 0x7f, 0x99, 0x6a, 0x6a, + 0x6f, 0x6a, 0x6a, 0x85, 0x5d, 0x90, 0x80, 0x7f, + 0x9a, 0x63, 0x67, 0x48, 0x3d, 0x16, 0x3d, 0xf2, + 0xee, 0x14, 0x16, 0x16, 0x16, 0x14, 0x18, 0x3d, + 0xf2, 0x17, 0x17, 0x21, 0x48, 0x17, 0x21, 0xf2, + 0xf2, 0xee, 0x16, 0x16, 0xee, 0xf2, 0xe1, 0xde, + 0xde, 0xde, 0xcb, 0xd2, 0xd4, 0xe4, 0xc7, 0xd1, + 0xc2, 0xc7, 0xc4, 0xc4, 0xd2, 0xc4, 0xd1, 0xc4, + 0xc7, 0xf3, 0xe2, 0xc2, 0xc7, 0xbe, 0xd1, 0xc4, + 0xc4, 0xc4, 0xc4, 0xd2, 0xd2, 0xd9, 0xd6, 0xd9, + 0xd3, 0xd7, 0xf1, 0xd6, 0xd9, 0xd6, 0xd6, 0xd3, + 0xd3, 0xd3, 0xdb, 0xdb, 0xed, 0xf9, 0xfe, 0xfe, + 0xfe, 0x21, 0x15, 0x1c, 0xf9, 0x21, 0x21, 0x21, + 0xfa, 0xfa, 0x1a, 0x1a, 0x1a, 0x1a, 0x1d, 0x2e, + 0x22, 0x17, 0x15, 0x3b, 0x34, 0x34, 0x3b, 0x34, + 0x6e, 0x5a, 0x26, 0x58, 0x8e, 0x6a, 0x5d, 0x5d, + 0x6a, 0x6f, 0x99, 0x90, 0x6a, 0x7e, 0x6a, 0x6a, + 0x6a, 0x5d, 0x6a, 0x6a, 0x81, 0x6b, 0x5d, 0x58, + 0x58, 0x90, 0x97, 0x6a, 0x5d, 0x90, 0x90, 0x6a, + 0x6a, 0x5d, 0x6a, 0x5d, 0x58, 0x58, 0x67, 0x36, + 0x3f, 0x2b, 0x8a, 0x2b, 0xf2, 0x15, 0x15, 0x16, + 0x17, 0x34, 0x15, 0xf2, 0xee, 0xee, 0xe1, 0xde, + 0xde, 0xe6, 0xd7, 0xd9, 0xd3, 0xd2, 0xd3, 0xd6, + 0xd6, 0xd3, 0xd2, 0xbf, 0x26, 0xe6, 0xd8, 0xde, + 0xf2, 0xf2, 0xee, 0x15, 0x39, 0x52, 0xe, 0xe, + 0x12, 0x1f, 0x68, 0x5e, 0x8d, 0xfc, 0x8, 0xa7, + 0x8d, 0x68, 0x5e, 0x46, 0x8d, 0x5e, 0x4e, 0x68, + 0x5e, 0x1e, 0x68, 0x5e, 0x79, 0x68, 0x7, 0xc, + 0x8d, 0x5e, 0x5e, 0x79, 0x1e, 0x5e, 0x68, 0x79, + 0x32, 0x5e, 0x28, 0x37, 0x5e, 0x86, 0x6c, 0x2c, + 0x8d, 0x5e, 0x5e, 0x8d, 0x8d, 0x1e, 0x8d, 0x93, + 0x93, 0x7d, 0x74, 0xb0, 0x6a, 0x91, 0x6f, 0x9a, + 0x99, 0x99, 0x6f, 0x6a, 0x6f, 0x5d, 0x6a, 0x6a, + 0x94, 0x8f, 0x94, 0x60, 0xa8, 0x76, 0x82, 0x8b, + 0x46, 0x46, 0x93, 0x7d, 0x76, 0x37, 0x30, 0x30, + 0x76, 0x68, 0x8d, 0x74, 0x12, 0x5e, 0x8d, 0x8b, + 0x8d, 0xfc, 0x46, 0x93, 0x5e, 0x28, 0x82, 0x89, + 0x55, 0xf6, 0xa7, 0x8b, 0x98, 0x1f, 0x5c, 0x98, + 0x98, 0x75, 0x82, + 0x5e, 0x32, 0x9f, 0x5e, 0x6c, 0x28, 0x6c, 0x9f, + 0x6c, 0xdd, 0xb7, 0x28, 0x9f, 0x6c, 0x6c, 0x9f, + 0x6c, 0x9f, 0x5e, 0x5e, 0x5e, 0x6c, 0xb8, 0x7, + 0xb7, 0xbf, 0xd3, 0xde, 0x15, 0x3d, 0x16, 0xf2, + 0x3d, 0xf2, 0xeb, 0xf2, 0xfa, 0xe6, 0xd6, 0xd0, + 0xcb, 0xcb, 0xe6, 0xfa, 0x15, 0xfa, 0xeb, 0xf2, + 0x16, 0xf2, 0xf2, 0x15, 0xf2, 0xf2, 0xf2, 0xf2, + 0x48, 0x99, 0x4a, 0x58, 0x71, 0x5d, 0x5d, 0x71, + 0x7f, 0x31, 0x26, 0x6e, 0x20, 0x6a, 0x6a, 0x5d, + 0x5d, 0x6a, 0x6a, 0x81, 0x58, 0x58, 0x5d, 0x6f, + 0x99, 0x6f, 0x41, 0x99, 0x99, 0x6f, 0x6f, 0x85, + 0x59, 0x63, 0x80, 0x7f, 0x3b, 0x16, 0x16, 0x16, + 0x16, 0x16, 0xff, 0x14, 0x14, 0x16, 0xf5, 0x15, + 0x15, 0x22, 0x2e, 0x22, 0x3f, 0x15, 0x16, 0x14, + 0x16, 0xee, 0xee, 0xe1, 0xee, 0xde, 0xe6, 0xd6, + 0xd3, 0xed, 0xed, 0xd9, 0xc4, 0xc2, 0xc4, 0xd2, + 0xd3, 0xc2, 0xd1, 0xc2, 0xd2, 0xe7, 0xec, 0xdc, + 0xce, 0xce, 0xe2, 0xdb, 0xc4, 0xc4, 0xc2, 0xc4, + 0xd3, 0xd2, 0xc7, 0xc2, 0xc4, 0xe7, 0xec, 0xd4, + 0xd2, 0xd2, 0xd3, 0xe0, 0xd6, 0xd7, 0xe0, 0xd0, + 0xd6, 0xe0, 0x20, 0x50, 0xe3, 0xfe, 0xfe, 0x1a, + 0x23, 0x48, 0xfa, 0x21, 0x15, 0x17, 0x15, 0x42, + 0x21, 0x22, 0x1a, 0x1a, 0x59, 0x36, 0x2e, 0x1d, + 0x2e, 0x3b, 0x3b, 0x3d, 0x3d, 0xf2, 0x3d, 0x3d, + 0x34, 0x34, 0x34, 0x80, 0x90, 0x6b, 0x81, 0x81, + 0x81, 0x71, 0x71, 0x71, 0x6b, 0x90, 0x88, 0x5d, + 0x71, 0x71, 0x71, 0x6b, 0x81, 0x71, 0x6b, 0x6b, + 0x58, 0x67, 0x59, 0x71, 0x6b, 0x71, 0x4d, 0x85, + 0x6b, 0x71, 0x71, 0x71, 0x59, 0x9a, 0x99, 0x63, + 0x80, 0x48, 0x21, 0x3f, 0x3b, 0x3d, 0x34, 0x3d, + 0x3b, 0x3d, 0xf2, 0xf2, 0x3d, 0x3d, 0xee, 0x73, + 0x73, 0xde, 0xe6, 0xa, 0x5a, 0xd0, 0xc4, 0xd3, + 0xd6, 0xd6, 0xd3, 0xd0, 0xd8, 0xe6, 0xd8, 0x1, + 0x15, 0xeb, 0x17, 0x15, 0x99, 0x60, 0x5f, 0x9c, + 0x62, 0x46, 0x6c, 0x5f, 0x8f, 0x98, 0x1e, 0x98, + 0x8f, 0x8d, 0x8d, 0x8b, 0x62, 0x79, 0x75, 0x8b, + 0x8b, 0x8d, 0x37, 0x9c, 0x7d, 0x8d, 0x37, 0x8b, + 0x98, 0x79, 0x68, 0x8d, 0x98, 0x68, 0x68, 0x93, + 0x93, 0x8d, 0x82, 0x9c, 0x8d, 0x68, 0x8d, 0x98, + 0x93, 0x5e, 0x8d, 0x93, 0x7d, 0x82, 0x82, 0x74, + 0xaa, 0x94, 0x94, 0x81, 0x81, 0x81, 0x5d, 0x99, + 0x2a, 0x54, 0x39, 0x7f, 0x99, 0x31, 0x71, 0x6f, + 0x6f, 0x91, 0x91, 0x8f, 0x8f, 0x93, 0x8b, 0x8b, + 0x82, 0x82, 0x76, 0x8f, 0xb3, 0xc, 0x9c, 0x93, + 0x82, 0x5e, 0x98, 0x98, 0x8d, 0x5e, 0x8d, 0x98, + 0x5e, 0x5e, 0x98, 0x93, 0xc, 0xa7, 0xa0, 0x62, + 0x98, 0x76, 0x43, 0x98, 0x79, 0x75, 0x75, 0x8d, + 0x8d, 0x82, 0x6c, + 0x30, 0x93, 0x82, 0x8d, 0x62, 0x3e, 0xf7, 0xa7, + 0x9c, 0xaa, 0xe, 0xe, 0x46, 0x79, 0x5e, 0x6c, + 0x1f, 0x1f, 0x6c, 0x1e, 0x89, 0xa8, 0xa6, 0x52, + 0xaa, 0xaf, 0xcb, 0xa, 0x34, 0x15, 0xeb, 0x15, + 0xeb, 0xeb, 0xf2, 0xee, 0x15, 0xeb, 0x34, 0xe1, + 0xa, 0x73, 0xd8, 0xeb, 0x15, 0x23, 0xf5, 0x16, + 0x16, 0xf2, 0x15, 0x34, 0x73, 0xf2, 0x15, 0x15, + 0x3f, 0x85, 0x6b, 0x71, 0x6b, 0x31, 0x6b, 0x85, + 0x63, 0x58, 0x42, 0x2e, 0x80, 0x5d, 0x71, 0x58, + 0x59, 0x71, 0x6b, 0x6b, 0x6b, 0x71, 0x71, 0x9a, + 0x9a, 0x71, 0x80, 0x42, 0x48, 0x71, 0x6b, 0x6b, + 0x59, 0x36, 0x42, 0x48, 0x3b, 0x3b, 0x3d, 0x16, + 0x16, 0x16, 0x14, 0xff, 0x14, 0x16, 0x3d, 0x15, + 0xfa, 0x1d, 0x1a, 0x48, 0xeb, 0x15, 0xf2, 0x14, + 0x14, 0x16, 0xee, 0xee, 0xee, 0xfa, 0x7f, 0xcb, + 0xd2, 0xdb, 0xe0, 0xd3, 0xd2, 0xc4, 0xd1, 0xd2, + 0xbf, 0xdc, 0xbd, 0xce, 0xd1, 0xe7, 0xf0, 0xbe, + 0xc2, 0xd1, 0xd2, 0xd2, 0xd2, 0xc4, 0xc7, 0xc4, + 0xd0, 0xd4, 0xbe, 0xce, 0xd1, 0xd2, 0xdb, 0xd2, + 0xc4, 0xc4, 0xd2, 0xd9, 0xd6, 0x3, 0xb4, 0xcc, + 0xd2, 0xd0, 0x40, 0xc8, 0xe3, 0x5a, 0x23, 0x1c, + 0xfa, 0x34, 0x3f, 0x23, 0x21, 0x21, 0x1a, 0x2e, + 0x1a, 0x17, 0x22, 0x1a, 0x1a, 0x1a, 0x1a, 0x2e, + 0x22, 0x17, 0x3f, 0x17, 0x15, 0x15, 0x3d, 0x3d, + 0x3b, 0x3b, 0x3b, 0x7f, 0x9a, 0x71, 0x6b, 0x91, + 0x81, 0x81, 0x81, 0x81, 0x91, 0x6f, 0x85, 0x6f, + 0x81, 0x85, 0x80, 0x6b, 0x81, 0x6f, 0x9a, 0x6b, + 0x6b, 0x85, 0x71, 0x6b, 0x6b, 0x6b, 0x71, 0x9a, + 0x6b, 0x71, 0x9a, 0x63, 0x71, 0x9a, 0x85, 0x85, + 0x71, 0x59, 0x9a, 0x7f, 0x1d, 0x3b, 0x3d, 0x3b, + 0x34, 0xf2, 0xee, 0x16, 0x16, 0xf2, 0xeb, 0x1, + 0x73, 0xd8, 0xd8, 0xcb, 0x5a, 0xd0, 0xd3, 0xd3, + 0xd3, 0xd6, 0xd0, 0xcb, 0xb4, 0xb4, 0xcb, 0xde, + 0x15, 0x34, 0x34, 0x54, 0x4d, 0x60, 0xc, 0xa0, + 0x9c, 0x82, 0x6c, 0x28, 0x8d, 0x5e, 0x86, 0x8d, + 0x98, 0x79, 0x5e, 0x8d, 0x8d, 0x5e, 0x4e, 0x79, + 0x8d, 0x68, 0x5e, 0x76, 0x98, 0x86, 0x68, 0x79, + 0x8d, 0x68, 0x68, 0x79, 0x5e, 0x68, 0x68, 0x28, + 0x6c, 0xa3, 0x5e, 0x79, 0x5e, 0x68, 0x68, 0x5e, + 0x5e, 0x5e, 0x9f, 0xa7, 0xc, 0x9f, 0x76, 0x8f, + 0xaa, 0x8f, 0x91, 0x91, 0x6f, 0x3a, 0x4d, 0x1d, + 0x34, 0x34, 0xfa, 0x34, 0x34, 0x67, 0x6b, 0x5d, + 0x6f, 0x6b, 0x81, 0x94, 0x8f, 0x76, 0x46, 0x82, + 0x6c, 0x6c, 0x6c, 0xa0, 0xc8, 0xa0, 0x37, 0x79, + 0x28, 0xfc, 0x28, 0x5e, 0x68, 0x5e, 0x4e, 0x37, + 0x6c, 0x7, 0x68, 0x5e, 0xf7, 0xa7, 0xa0, 0x79, + 0x86, 0x68, 0x86, 0x1e, 0x75, 0xa3, 0x68, 0x68, + 0xfc, 0x7, 0x8, + 0x62, 0x74, 0xa8, 0x9c, 0x8f, 0x91, 0x74, 0x62, + 0x8f, 0x94, 0x76, 0x82, 0x98, 0x93, 0x6c, 0x6c, + 0x9c, 0x9c, 0xcd, 0xa7, 0x93, 0x8f, 0x5f, 0x9c, + 0x91, 0x83, 0x6e, 0xa, 0xeb, 0xe6, 0xeb, 0x15, + 0x15, 0xeb, 0xf2, 0xf2, 0x3f, 0xfa, 0x15, 0xfa, + 0xfa, 0xd8, 0xde, 0xee, 0xf2, 0x15, 0xe1, 0xee, + 0x15, 0x70, 0x15, 0xfa, 0xeb, 0x34, 0x34, 0x48, + 0x42, 0x85, 0x6f, 0x9a, 0x6f, 0x71, 0x9a, 0x9a, + 0x6b, 0x81, 0x6b, 0x58, 0x6b, 0x6b, 0x6b, 0x56, + 0x67, 0x71, 0x85, 0x99, 0x85, 0x81, 0x71, 0x71, + 0x71, 0x81, 0x6b, 0x71, 0x71, 0x71, 0x71, 0x9a, + 0x67, 0x7f, 0x70, 0x3d, 0x3d, 0x70, 0x7f, 0x70, + 0x70, 0x48, 0x22, 0x16, 0x14, 0x14, 0xff, 0x14, + 0x14, 0x15, 0x22, 0xf2, 0x17, 0x15, 0x15, 0x16, + 0x16, 0xf2, 0xfa, 0xeb, 0xf5, 0xe6, 0xc9, 0xd3, + 0xd2, 0xd2, 0xd2, 0xc4, 0xd2, 0xbe, 0xdc, 0xf3, + 0xdd, 0xcd, 0xcd, 0xc2, 0xc2, 0xd2, 0xd1, 0xc4, + 0xc4, 0xc2, 0xce, 0xd1, 0xd1, 0xe2, 0xdc, 0xcd, + 0xc7, 0xc2, 0xce, 0xd5, 0xc4, 0xc4, 0xd1, 0xd1, + 0xc4, 0xc4, 0xd1, 0xcc, 0xbf, 0xe3, 0xe4, 0xe4, + 0xc5, 0xc7, 0xcc, 0xd5, 0xdb, 0xe6, 0x2a, 0x23, + 0xfa, 0xfa, 0x1a, 0x1a, 0x36, 0x1a, 0x1d, 0x1a, + 0x1d, 0x15, 0x15, 0x22, 0x21, 0x17, 0x1d, 0x59, + 0x1a, 0x3b, 0x22, 0x1d, 0x34, 0x15, 0x34, 0x3b, + 0x34, 0x34, 0x15, 0x48, 0x23, 0x99, 0x90, 0x6a, + 0x6a, 0xb0, 0x5d, 0x91, 0x91, 0x91, 0x6a, 0x7e, + 0x6a, 0x58, 0x56, 0x6b, 0x81, 0x90, 0x90, 0x6a, + 0x81, 0x81, 0x6a, 0x5d, 0x81, 0x6b, 0xb0, 0x6a, + 0x71, 0x5d, 0x67, 0x85, 0x81, 0x58, 0x90, 0x5d, + 0x81, 0x6b, 0x6a, 0x20, 0x36, 0x7f, 0x34, 0x15, + 0x34, 0x16, 0x16, 0xf2, 0x16, 0xf2, 0xf2, 0xde, + 0xde, 0xcb, 0xd3, 0xd3, 0xd6, 0xd6, 0xd3, 0xd2, + 0xc4, 0xdb, 0xd7, 0x5a, 0x50, 0x50, 0xdb, 0xd8, + 0xfa, 0xfa, 0xd8, 0xcb, 0x6, 0x11, 0xf8, 0xe, + 0x5e, 0x86, 0x5e, 0x37, 0x37, 0x9f, 0x4e, 0x68, + 0xfc, 0xfc, 0x5e, 0x5e, 0x5e, 0x68, 0x1e, 0x28, + 0x68, 0x86, 0x68, 0x28, 0x1f, 0x68, 0x4e, 0xa3, + 0x9f, 0xfc, 0x37, 0x6c, 0xa3, 0xa3, 0xa3, 0x28, + 0x5e, 0x86, 0xa3, 0xa3, 0xfc, 0x1e, 0x86, 0x8, + 0xb8, 0x7, 0xfc, 0x1e, 0xa7, 0xfc, 0x82, 0x7d, + 0x55, 0x7e, 0xaa, 0x90, 0x54, 0x6e, 0xfa, 0x2a, + 0xeb, 0xfa, 0xfa, 0x2b, 0x21, 0x4d, 0x85, 0x4d, + 0x39, 0x3a, 0x6b, 0x91, 0x7e, 0xa8, 0x12, 0x5f, + 0xf7, 0x7, 0x1e, 0x30, 0x30, 0x37, 0x8d, 0x8d, + 0x28, 0x1f, 0x1f, 0x8d, 0x9f, 0x7, 0xf, 0x1f, + 0x5e, 0x86, 0x4e, 0x8d, 0x1f, 0x46, 0x5c, 0x43, + 0x75, 0x5e, 0xf7, 0xe, 0x32, 0x5e, 0x7, 0xfc, + 0x28, 0x32, 0x5e, + 0x76, 0x9c, 0x2c, 0x2f, 0x7e, 0x8f, 0x93, 0x5f, + 0x55, 0x9c, 0x37, 0x6c, 0x5e, 0x6c, 0x7, 0x8, + 0x32, 0x6c, 0x8, 0x28, 0x5e, 0x5e, 0x6c, 0x28, + 0x2c, 0xb, 0xcb, 0xd8, 0xf2, 0xeb, 0xf2, 0xf2, + 0xf2, 0xde, 0xe1, 0xde, 0x54, 0xf9, 0xd8, 0x73, + 0x1, 0xeb, 0xf2, 0x15, 0xf2, 0xee, 0xee, 0x16, + 0x15, 0xfa, 0x34, 0xeb, 0x21, 0xfa, 0x54, 0x99, + 0x90, 0x6a, 0x90, 0x56, 0x6a, 0x6a, 0x9d, 0x99, + 0x58, 0x6a, 0x95, 0x6b, 0x6b, 0x5d, 0x4a, 0x58, + 0x85, 0x6a, 0x31, 0x67, 0x63, 0x5d, 0x6a, 0x83, + 0x5d, 0x6a, 0x91, 0x91, 0x83, 0x31, 0x67, 0x70, + 0x73, 0x7f, 0xfa, 0x3d, 0x3b, 0x99, 0x9a, 0x54, + 0x39, 0xf9, 0x2b, 0x16, 0x14, 0x14, 0x17, 0x17, + 0x17, 0x36, 0x1d, 0x3b, 0x16, 0x15, 0x16, 0xf2, + 0xf2, 0xe6, 0xd7, 0xd6, 0xd3, 0xd2, 0xd0, 0xd9, + 0xd0, 0xd1, 0xbe, 0xc7, 0xe7, 0xdb, 0xe4, 0xbd, + 0xc2, 0xc4, 0xd2, 0xdb, 0xd2, 0xc2, 0xc7, 0xd5, + 0xdb, 0xd1, 0xbd, 0xb8, 0xc7, 0xd2, 0xec, 0xc7, + 0xd1, 0xc4, 0xc4, 0xdb, 0xc4, 0xd1, 0xce, 0xdc, + 0xe7, 0xe7, 0xe4, 0xf3, 0xce, 0xd1, 0xe7, 0xd4, + 0xc4, 0xc2, 0xd2, 0xd0, 0xed, 0xfd, 0x99, 0x90, + 0x23, 0x21, 0x1c, 0xfe, 0xf9, 0x3f, 0x21, 0x23, + 0xfa, 0x15, 0xfa, 0xfe, 0x1a, 0x1a, 0x36, 0x3a, + 0xfe, 0x17, 0x15, 0xeb, 0x15, 0xf2, 0xf2, 0x16, + 0x16, 0x3b, 0x54, 0x90, 0x90, 0x4d, 0x71, 0x7e, + 0x9d, 0x99, 0x67, 0x4a, 0x83, 0x83, 0x6a, 0x55, + 0x6a, 0x6a, 0x6a, 0x91, 0x6a, 0x6b, 0x6b, 0x6a, + 0x6a, 0x71, 0x83, 0x5d, 0x58, 0x9a, 0x41, 0x6f, + 0x5d, 0x58, 0x71, 0x6a, 0x91, 0x5d, 0x71, 0x5d, + 0x6f, 0x85, 0x99, 0x5a, 0x67, 0xfa, 0xeb, 0x34, + 0x7f, 0x3d, 0x16, 0x3d, 0x16, 0x3d, 0x16, 0xee, + 0xee, 0xde, 0xd7, 0xcb, 0xe6, 0xd7, 0xd6, 0xd2, + 0xd0, 0xd0, 0xfd, 0xe5, 0x40, 0xaf, 0xcb, 0xde, + 0xf2, 0xeb, 0xd8, 0xa, 0x90, 0x27, 0x62, 0x1f, + 0x7d, 0x5e, 0x86, 0x1f, 0x79, 0x32, 0x68, 0x5e, + 0x82, 0x8d, 0x5e, 0x79, 0x98, 0x8d, 0x5e, 0x98, + 0x98, 0x5e, 0x68, 0x82, 0x5f, 0x5e, 0x5e, 0x5e, + 0x9c, 0x5e, 0x5e, 0x8d, 0x5e, 0x68, 0xa3, 0x8d, + 0x8d, 0x32, 0x5e, 0x76, 0xc, 0x6c, 0x32, 0x9c, + 0xa7, 0x8d, 0x76, 0x94, 0x94, 0x8f, 0x94, 0x91, + 0x6a, 0xb0, 0x99, 0x54, 0x70, 0x15, 0x15, 0xeb, + 0x15, 0x15, 0x3f, 0x34, 0x3f, 0x23, 0x42, 0x1c, + 0x48, 0x23, 0x31, 0x58, 0x71, 0x6a, 0x91, 0x94, + 0x8f, 0x62, 0x8f, 0x8f, 0x62, 0x74, 0x7e, 0x8f, + 0x93, 0x7, 0x7d, 0x98, 0x37, 0x28, 0x79, 0x98, + 0x68, 0x5e, 0x8b, 0x8f, 0x8f, 0x62, 0xab, 0x8e, + 0x8e, 0x89, 0xa0, 0x74, 0x93, 0x32, 0x5e, 0x98, + 0x98, 0x8d, 0x8d, + 0x28, 0x82, 0x27, 0x27, 0x91, 0x94, 0x9c, 0x2c, + 0x27, 0x5f, 0xc, 0x8, 0x28, 0x1f, 0x37, 0x68, + 0x5e, 0x5e, 0x6c, 0x1f, 0x76, 0x6c, 0x7, 0xbd, + 0x50, 0xb, 0x3, 0xd8, 0x2a, 0x34, 0x15, 0xf2, + 0xee, 0xe1, 0xf2, 0x16, 0xf5, 0xeb, 0xde, 0xd8, + 0xeb, 0xeb, 0xeb, 0x34, 0x17, 0x15, 0x16, 0x16, + 0xf2, 0x34, 0x34, 0x34, 0x3d, 0x15, 0x2b, 0x67, + 0x5d, 0x6a, 0x6f, 0x6b, 0x6a, 0x6a, 0x5d, 0x4d, + 0x59, 0x6f, 0x6f, 0x9a, 0x56, 0x58, 0x31, 0x9a, + 0x71, 0x6a, 0x6a, 0x58, 0x6b, 0x6a, 0x6f, 0x9a, + 0x63, 0x5d, 0x6a, 0x90, 0xaf, 0x80, 0x42, 0x48, + 0x48, 0x99, 0x67, 0x3f, 0x3f, 0x48, 0x48, 0xeb, + 0xf2, 0x3d, 0xee, 0x14, 0x14, 0x14, 0x17, 0x21, + 0x1a, 0xfe, 0x36, 0x17, 0x14, 0x14, 0x16, 0x14, + 0xee, 0xde, 0xd7, 0xd6, 0xd0, 0xd2, 0xe5, 0x5, + 0xd4, 0xd1, 0xcd, 0xcd, 0xc4, 0xd1, 0xd2, 0xc2, + 0xc4, 0xd2, 0xd2, 0xd4, 0xd1, 0xc4, 0xdc, 0xf3, + 0xbf, 0xd2, 0xce, 0xc2, 0xc4, 0xd2, 0xd2, 0xd2, + 0xc4, 0xc4, 0xd5, 0xcc, 0xe8, 0xc7, 0xdc, 0xcd, + 0xbe, 0xd1, 0xd1, 0xc1, 0xc2, 0xbf, 0xbf, 0xbf, + 0xe3, 0xbf, 0xbf, 0x50, 0xa1, 0x41, 0x90, 0xfe, + 0x1d, 0x15, 0x17, 0x17, 0x15, 0x15, 0x15, 0x1d, + 0xfa, 0x21, 0x1a, 0x1a, 0x1a, 0x1a, 0x1d, 0x1a, + 0x48, 0x3d, 0x3b, 0x22, 0x15, 0x16, 0x16, 0x15, + 0x3b, 0x70, 0x48, 0x99, 0x99, 0x9a, 0x6b, 0x6a, + 0x6b, 0x71, 0x71, 0x6a, 0x90, 0x42, 0x56, 0x6a, + 0x6f, 0x9a, 0x6f, 0x6a, 0x5d, 0x71, 0x85, 0x85, + 0x71, 0x71, 0x85, 0x6a, 0x85, 0x48, 0x42, 0x59, + 0x71, 0x71, 0x5d, 0x6a, 0x6b, 0x6b, 0x71, 0x71, + 0x81, 0x71, 0x59, 0x58, 0x63, 0x70, 0x3d, 0x3b, + 0x70, 0x3f, 0x16, 0x3d, 0x16, 0xee, 0xee, 0x16, + 0xf2, 0xee, 0xee, 0x73, 0xa, 0x3, 0xcb, 0xd6, + 0xc0, 0xd0, 0xd0, 0xd0, 0xcb, 0x3, 0xe6, 0x34, + 0x34, 0x15, 0x15, 0x23, 0x58, 0x91, 0x5f, 0x74, + 0x55, 0x46, 0x5e, 0x76, 0x74, 0x82, 0x1f, 0x5c, + 0x8f, 0x8d, 0x8d, 0x98, 0x62, 0x98, 0x8d, 0x98, + 0x74, 0x5f, 0x8d, 0x8d, 0x9c, 0x5e, 0x5e, 0x79, + 0x8b, 0x4e, 0x5e, 0x8d, 0x82, 0x68, 0x68, 0x93, + 0xa8, 0xa0, 0x28, 0x46, 0x9c, 0x5e, 0x5e, 0x98, + 0x62, 0x8d, 0x7d, 0x8f, 0x6a, 0x83, 0x6a, 0x6f, + 0xb0, 0x6e, 0x99, 0x42, 0x48, 0x73, 0x48, 0x70, + 0x15, 0x15, 0x15, 0xf2, 0x16, 0x15, 0x15, 0x34, + 0x34, 0x70, 0x1c, 0x31, 0x31, 0x6b, 0x91, 0x94, + 0x91, 0x27, 0x7e, 0x94, 0x8f, 0xa6, 0x4a, 0x27, + 0x46, 0x5e, 0x8d, 0x46, 0x46, 0x28, 0x98, 0x98, + 0x79, 0xfc, 0x2f, 0x8b, 0x89, 0xb3, 0xad, 0x78, + 0x47, 0x5c, 0x43, 0x98, 0x8d, 0xfc, 0x5c, 0x93, + 0x98, 0x86, 0x6c, + 0x62, 0x94, 0x6a, 0x81, 0x81, 0x91, 0x83, 0xb0, + 0x81, 0x91, 0x62, 0x9c, 0x62, 0x8f, 0x8d, 0x5e, + 0x93, 0x7d, 0x76, 0xa8, 0x9c, 0x8b, 0xa0, 0xc8, + 0x11, 0x40, 0xb4, 0xa, 0xfa, 0xfa, 0x34, 0x3d, + 0x3d, 0x16, 0xf2, 0xf2, 0x15, 0xf2, 0xf2, 0xeb, + 0xf2, 0xf5, 0xf2, 0xfa, 0x48, 0x48, 0x15, 0x16, + 0x3d, 0x16, 0xf2, 0x34, 0x3d, 0x3b, 0x3f, 0x80, + 0x71, 0x58, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0x71, + 0x9a, 0x85, 0x99, 0x99, 0x58, 0x71, 0x80, 0x80, + 0x58, 0x81, 0x6a, 0x71, 0x71, 0x71, 0x71, 0x9a, + 0x80, 0x6f, 0x81, 0x9a, 0x59, 0x80, 0x67, 0x3f, + 0x3f, 0x1d, 0x42, 0x7f, 0x34, 0x34, 0x15, 0xf2, + 0x3d, 0xf2, 0x14, 0x14, 0x16, 0x16, 0x17, 0x22, + 0x3f, 0x21, 0x23, 0x15, 0x17, 0x16, 0xf2, 0xf2, + 0xeb, 0xd8, 0x5a, 0xea, 0xe0, 0xd0, 0xb4, 0xa1, + 0xbf, 0xc4, 0xd1, 0xc2, 0xc2, 0xc4, 0xc4, 0xd2, + 0xd2, 0xc4, 0xce, 0xdc, 0xd5, 0xc4, 0xbe, 0xc1, + 0xc7, 0xc4, 0xd1, 0xc4, 0xc4, 0xd1, 0xc4, 0xd2, + 0xd5, 0xd2, 0xbe, 0xdc, 0xcd, 0xc7, 0xe2, 0xc1, + 0xc2, 0xc2, 0xc4, 0xd2, 0xc5, 0xe3, 0xa1, 0x2c, + 0xf3, 0xb, 0xb, 0xc8, 0xba, 0xaf, 0xea, 0x39, + 0x34, 0x1, 0xeb, 0x21, 0x1a, 0x22, 0x1d, 0x1a, + 0x21, 0x17, 0x1d, 0x1d, 0x21, 0x34, 0xfa, 0xfa, + 0x23, 0x21, 0x3f, 0x48, 0x1a, 0x22, 0x22, 0x3b, + 0x2b, 0x73, 0xee, 0x3d, 0x48, 0x7f, 0x6f, 0x6a, + 0x6a, 0x81, 0x81, 0x6a, 0x5d, 0x4d, 0x58, 0x5d, + 0x99, 0x7f, 0x99, 0x90, 0x80, 0x80, 0x85, 0x6f, + 0x6b, 0x81, 0x81, 0x6a, 0x5d, 0x63, 0x36, 0x4d, + 0x63, 0x99, 0x7f, 0x97, 0x6f, 0x6a, 0x6b, 0x71, + 0x6a, 0x58, 0x58, 0x5d, 0x58, 0x42, 0x3f, 0x42, + 0x34, 0x3d, 0x3b, 0xf2, 0x16, 0x16, 0x3d, 0xf2, + 0xeb, 0xf2, 0xf2, 0x73, 0x6e, 0xcb, 0xd3, 0xd6, + 0xc0, 0xd6, 0xd2, 0xc4, 0xd0, 0xcb, 0xf9, 0xa, + 0x73, 0x2a, 0x34, 0x1c, 0x3a, 0xaa, 0xa7, 0xa7, + 0x60, 0x46, 0x5e, 0x5e, 0x82, 0x28, 0x1f, 0x8d, + 0x8d, 0x5e, 0x5e, 0x1f, 0x46, 0x8d, 0x5e, 0x76, + 0xa9, 0x30, 0x28, 0x68, 0x8d, 0x68, 0xfc, 0x1f, + 0x5e, 0x75, 0xa2, 0x68, 0x28, 0x7, 0xa3, 0x5e, + 0x82, 0x37, 0x28, 0x68, 0x68, 0xa3, 0x5e, 0x1e, + 0x82, 0x37, 0x76, 0x94, 0xb0, 0x90, 0x90, 0x90, + 0x99, 0x6e, 0x48, 0x39, 0x39, 0x6e, 0x99, 0x23, + 0x2b, 0x34, 0x1, 0xf2, 0x15, 0x3d, 0x3d, 0x3d, + 0x15, 0xfa, 0x23, 0x36, 0x4d, 0x5d, 0x71, 0x81, + 0x6a, 0x3e, 0xa8, 0x9c, 0xa7, 0xa0, 0x27, 0x27, + 0x37, 0xa3, 0x5e, 0x4e, 0xf, 0x5e, 0x5e, 0x86, + 0xa3, 0x8, 0xc, 0x28, 0x68, 0x5e, 0x32, 0x1f, + 0x30, 0x1e, 0x68, 0x68, 0x68, 0x32, 0x1e, 0x6c, + 0x9f, 0x68, 0x5e, + 0x6a, 0x91, 0x83, 0xaf, 0x90, 0x58, 0x58, 0x6b, + 0x91, 0x94, 0x62, 0x9c, 0x8f, 0x8f, 0x76, 0x7, + 0xac, 0x93, 0x6c, 0x37, 0x74, 0x74, 0xe, 0x2f, + 0xaa, 0xb0, 0xcb, 0xe6, 0xde, 0xf2, 0xeb, 0x15, + 0xee, 0xf2, 0x3d, 0xf2, 0xf2, 0x3d, 0xeb, 0x16, + 0x16, 0xee, 0x16, 0x15, 0x15, 0xf5, 0xf2, 0x15, + 0x34, 0x3d, 0x15, 0x22, 0x36, 0x36, 0x4d, 0x58, + 0x71, 0x85, 0x99, 0x9a, 0x85, 0x90, 0x5d, 0x71, + 0x85, 0x58, 0x59, 0x59, 0x71, 0x71, 0x80, 0x42, + 0x4d, 0x85, 0x90, 0x6f, 0x9a, 0x90, 0x63, 0x71, + 0x71, 0x81, 0x6b, 0x58, 0x80, 0x80, 0x70, 0x16, + 0x16, 0x16, 0x70, 0x3d, 0x73, 0xee, 0x15, 0x3d, + 0x3d, 0x3d, 0x16, 0x14, 0x14, 0x17, 0x3b, 0x15, + 0x15, 0xeb, 0xf2, 0xf2, 0xee, 0xf2, 0xee, 0x15, + 0xf1, 0xd0, 0xbf, 0xe5, 0xe0, 0xd0, 0xd3, 0xbf, + 0xc4, 0xd2, 0xdb, 0xd5, 0xc7, 0xd1, 0xd1, 0xe7, + 0xd4, 0xc4, 0xc2, 0xc1, 0xd2, 0xd2, 0xd2, 0xc4, + 0xc2, 0xc4, 0xd2, 0xe7, 0xec, 0xc2, 0xc7, 0xec, + 0xe7, 0xdb, 0xd1, 0xc2, 0xc2, 0xd2, 0xdb, 0xd5, + 0xce, 0xce, 0xc7, 0xf0, 0xf0, 0xc, 0xa0, 0xf7, + 0xdc, 0x5a, 0xbf, 0xc2, 0xbf, 0xd0, 0xe6, 0x15, + 0x15, 0x34, 0xfa, 0x21, 0x1a, 0x1a, 0x1d, 0x39, + 0x23, 0x15, 0x21, 0xeb, 0x15, 0xfa, 0x23, 0x39, + 0xfa, 0x1c, 0x36, 0x36, 0xfe, 0x1a, 0x1a, 0x54, + 0x34, 0x3b, 0x3d, 0x70, 0x73, 0x70, 0x99, 0x97, + 0x90, 0x83, 0x91, 0x55, 0x6a, 0x6a, 0x6a, 0x6a, + 0x35, 0x31, 0x71, 0x3a, 0x99, 0x7f, 0x6f, 0x6a, + 0x6a, 0x6a, 0x6a, 0x7e, 0x6a, 0x5d, 0x3a, 0x41, + 0x90, 0x4d, 0x4d, 0x3a, 0x6f, 0x5d, 0x6a, 0x6a, + 0x6a, 0x6f, 0x5d, 0x81, 0x71, 0x5d, 0x63, 0x5a, + 0xfa, 0x3d, 0xf2, 0x16, 0x16, 0x3d, 0xeb, 0xeb, + 0xde, 0xee, 0xeb, 0xd8, 0xcb, 0xd3, 0xd2, 0xd3, + 0xd0, 0x26, 0xe5, 0xec, 0xe3, 0xd4, 0xcb, 0xd8, + 0xde, 0x1, 0x2a, 0xa, 0x3, 0x50, 0x8, 0x28, + 0x1e, 0x28, 0x68, 0x5e, 0x9e, 0x68, 0x68, 0x68, + 0x9f, 0xa3, 0x68, 0x68, 0x6c, 0x5e, 0x9e, 0x68, + 0x5e, 0x5e, 0x5e, 0x4e, 0x5e, 0x68, 0xa3, 0x68, + 0x9f, 0x7, 0xa3, 0xa3, 0x6c, 0x6c, 0x5e, 0x86, + 0x68, 0x68, 0x5e, 0x86, 0xa3, 0x9e, 0x5e, 0x82, + 0x76, 0xb7, 0xa8, 0x7e, 0x81, 0x6f, 0x4d, 0x39, + 0x42, 0xea, 0xeb, 0xfa, 0xfa, 0xcb, 0xa, 0x54, + 0x23, 0xe6, 0xfa, 0x48, 0x1d, 0x21, 0x3b, 0x17, + 0x15, 0xf2, 0x15, 0x34, 0x54, 0x6e, 0x99, 0x6f, + 0x55, 0x55, 0x2f, 0xe, 0x1e, 0x28, 0x37, 0x8d, + 0x5e, 0x86, 0x68, 0x75, 0x32, 0x86, 0x8, 0x6c, + 0x68, 0xa3, 0x5e, 0x8d, 0x28, 0x68, 0x5e, 0x32, + 0x8d, 0x75, 0x9f, 0x7, 0x5e, 0x86, 0x5e, 0x28, + 0xfc, 0x86, 0x68, + 0x6a, 0x74, 0xad, 0x6f, 0x1b, 0x31, 0x3a, 0x6a, + 0x6a, 0x94, 0x55, 0x55, 0x74, 0x76, 0x9f, 0x6c, + 0xe, 0x82, 0x5e, 0x5e, 0x68, 0xa7, 0x2f, 0x37, + 0xb7, 0xa1, 0x3, 0xe6, 0x15, 0xf2, 0x1, 0x73, + 0xeb, 0xde, 0xeb, 0xeb, 0x34, 0xf2, 0xf2, 0x3b, + 0x16, 0x16, 0x15, 0x2b, 0xf2, 0xf2, 0x15, 0xfa, + 0xeb, 0xf2, 0x3f, 0x63, 0x6f, 0x6a, 0x6b, 0x71, + 0x81, 0x83, 0x80, 0x58, 0x63, 0x99, 0x99, 0x6a, + 0x6a, 0x5d, 0x90, 0x71, 0x71, 0x6f, 0x6a, 0x58, + 0x63, 0x63, 0x80, 0x9a, 0x5d, 0x20, 0x7f, 0x58, + 0x6a, 0x6a, 0x5d, 0x58, 0x67, 0x54, 0xf2, 0x3d, + 0x3b, 0x3b, 0x3f, 0x3f, 0x3f, 0xf5, 0x16, 0x16, + 0xf2, 0xf2, 0x14, 0x14, 0x17, 0x17, 0x15, 0x22, + 0x15, 0x15, 0x15, 0x16, 0x14, 0x14, 0x14, 0xf2, + 0xe6, 0xd3, 0xd1, 0xd2, 0xd0, 0xd2, 0xd2, 0xd1, + 0xc7, 0xc4, 0xd5, 0xe4, 0xdc, 0xc2, 0xc2, 0xd1, + 0xd2, 0xd3, 0xc4, 0xc4, 0xc4, 0xd2, 0xc4, 0xd5, + 0xd5, 0xc2, 0xd1, 0xcc, 0xc5, 0xd1, 0xd1, 0xc2, + 0xd2, 0xd2, 0xd2, 0xd1, 0xd1, 0xe2, 0xdc, 0xf3, + 0x7, 0xdd, 0xcd, 0xdd, 0x8, 0xb8, 0xbd, 0xc1, + 0xc7, 0xd1, 0xd2, 0xd1, 0xe3, 0xb, 0x6e, 0xd8, + 0x3d, 0x17, 0x16, 0x15, 0x15, 0x15, 0x2a, 0xeb, + 0xfa, 0x22, 0x17, 0x23, 0x1a, 0x1a, 0x1a, 0x1d, + 0x1d, 0x1d, 0x1c, 0x23, 0xfa, 0x23, 0xd8, 0xe6, + 0x2a, 0x34, 0x48, 0xfa, 0x34, 0x3f, 0x80, 0x63, + 0x63, 0x85, 0x6a, 0x7a, 0xaf, 0x6f, 0x5b, 0x52, + 0x6a, 0x6a, 0x91, 0x7e, 0x71, 0x58, 0x6b, 0x6a, + 0x90, 0x85, 0x6a, 0xb0, 0x97, 0x85, 0x5d, 0x90, + 0x3a, 0x5d, 0x6a, 0x81, 0x6b, 0x6b, 0x90, 0x20, + 0x99, 0x67, 0x71, 0x90, 0x6f, 0x71, 0x6a, 0x6f, + 0x26, 0x3b, 0x3d, 0x16, 0x16, 0x3d, 0xf2, 0xee, + 0x16, 0x16, 0xe1, 0x1, 0xde, 0xd8, 0x5a, 0xbf, + 0xcb, 0xe5, 0x1b, 0x50, 0xbf, 0x3, 0xd8, 0x1, + 0xf2, 0xf2, 0xf2, 0x34, 0xf9, 0x1b, 0x12, 0x46, + 0x76, 0x79, 0x9f, 0x37, 0x46, 0x68, 0x68, 0x32, + 0x2f, 0xa7, 0x86, 0x5e, 0x8d, 0x5e, 0xfc, 0x37, + 0x8d, 0x68, 0x86, 0x82, 0xe, 0xa0, 0x5e, 0x82, + 0x82, 0x28, 0x28, 0x28, 0x8d, 0x9f, 0x5e, 0x82, + 0x8d, 0x6c, 0x5e, 0x76, 0x37, 0xb7, 0x9c, 0x8f, + 0x94, 0x7e, 0x6a, 0x6a, 0x81, 0xb0, 0x99, 0x42, + 0x39, 0x34, 0x73, 0x34, 0x34, 0x15, 0x15, 0x54, + 0x9a, 0x39, 0x34, 0x48, 0x42, 0x7f, 0x54, 0x54, + 0x34, 0x2b, 0x15, 0x34, 0x23, 0x54, 0x2a, 0x99, + 0x5d, 0x7e, 0x7e, 0x27, 0x27, 0x5f, 0xa8, 0xaa, + 0x30, 0x30, 0x30, 0x8b, 0x8d, 0x5e, 0x46, 0x62, + 0x8d, 0x5e, 0x98, 0x62, 0x30, 0x30, 0x30, 0x9b, + 0xac, 0x79, 0xfc, 0x30, 0x46, 0x68, 0x8d, 0x98, + 0x62, 0x1f, 0x43, + 0x74, 0x7e, 0x60, 0x11, 0xfd, 0x26, 0x20, 0x41, + 0xaf, 0x83, 0x74, 0x74, 0xaa, 0x93, 0x37, 0x5e, + 0x82, 0x82, 0x5e, 0x6c, 0x28, 0x82, 0x6c, 0xa0, + 0xcc, 0xbf, 0xd4, 0xcb, 0x73, 0xeb, 0x21, 0xfa, + 0xd8, 0xeb, 0xf2, 0xe1, 0xee, 0xee, 0xf2, 0x21, + 0xf2, 0x16, 0x3b, 0x42, 0x1d, 0x15, 0x15, 0x2b, + 0x34, 0x15, 0x70, 0x99, 0x99, 0x97, 0x6f, 0x6a, + 0x6f, 0x5d, 0x58, 0x9a, 0x6b, 0x63, 0x80, 0x58, + 0x71, 0x41, 0x99, 0x9a, 0x90, 0x99, 0x83, 0x6f, + 0x6b, 0x6a, 0x58, 0x6b, 0x5d, 0x6a, 0x31, 0x80, + 0x31, 0x85, 0x85, 0x9a, 0x39, 0x34, 0x15, 0x3f, + 0x67, 0x67, 0x36, 0x2e, 0x22, 0x17, 0x14, 0x14, + 0x16, 0xee, 0x16, 0x14, 0x17, 0x3d, 0x21, 0x1a, + 0x2e, 0x1d, 0x3b, 0x17, 0x14, 0x14, 0x14, 0x16, + 0xeb, 0xe6, 0xd7, 0xbf, 0xd4, 0xd1, 0xc4, 0xec, + 0xf0, 0xc7, 0xc2, 0xc7, 0xd5, 0xd3, 0xd2, 0xc4, + 0xc4, 0xc4, 0xd3, 0xd2, 0xe2, 0xce, 0xc2, 0xe2, + 0xe2, 0xd1, 0xc7, 0xc2, 0xc2, 0xd2, 0xd2, 0xd2, + 0xd1, 0xd2, 0xd9, 0xe7, 0xf0, 0xdd, 0x8, 0x7, + 0x7, 0xdd, 0xbd, 0xbd, 0xb8, 0xdd, 0xbe, 0xc7, + 0xbe, 0xcc, 0xe3, 0xe7, 0x20, 0x41, 0x6e, 0x34, + 0xee, 0x3d, 0x15, 0xf2, 0x16, 0x22, 0x15, 0xfa, + 0x15, 0x1a, 0x1c, 0x1d, 0x1a, 0x1a, 0x1a, 0x23, + 0x1d, 0x1d, 0xfa, 0x15, 0x15, 0x21, 0x15, 0x15, + 0x15, 0x3d, 0x70, 0x3b, 0x34, 0x3f, 0x59, 0x81, + 0x6b, 0x81, 0x6b, 0x90, 0x4d, 0x63, 0x6b, 0x90, + 0x90, 0x63, 0x6a, 0x6a, 0x5d, 0x81, 0x85, 0x71, + 0x71, 0x71, 0x58, 0x58, 0x4d, 0x80, 0x71, 0x58, + 0x80, 0x58, 0x6a, 0x81, 0x6f, 0x71, 0x59, 0x67, + 0x42, 0x59, 0x71, 0x71, 0x59, 0x71, 0x6b, 0x71, + 0x80, 0x48, 0x3b, 0x3b, 0x14, 0x16, 0x3d, 0xf2, + 0x14, 0x16, 0xf2, 0x16, 0xee, 0x15, 0x7f, 0x99, + 0x6e, 0x5a, 0xed, 0xfd, 0xcb, 0xcb, 0xc9, 0xeb, + 0xf2, 0xf2, 0xf2, 0x3b, 0x21, 0xf9, 0x4a, 0x62, + 0x8f, 0x9c, 0x1e, 0x46, 0x8f, 0x76, 0x68, 0x98, + 0x62, 0x46, 0x68, 0x98, 0x98, 0x8d, 0x1e, 0x8b, + 0x74, 0xa7, 0x7, 0x5c, 0x62, 0xa7, 0x5e, 0x98, + 0x93, 0x82, 0x37, 0x98, 0x82, 0x82, 0x28, 0x98, + 0x9c, 0xb7, 0x8, 0x82, 0x8b, 0x46, 0x8f, 0x94, + 0x91, 0x81, 0x58, 0x63, 0x99, 0x54, 0x73, 0xeb, + 0xfa, 0x2a, 0x2a, 0x23, 0x42, 0x1d, 0x1d, 0x42, + 0x59, 0x99, 0x34, 0xfa, 0x23, 0xa, 0xcb, 0xa, + 0x23, 0xf1, 0xea, 0x26, 0x4d, 0xfe, 0x54, 0x36, + 0x5d, 0x55, 0x6a, 0x6a, 0x55, 0xc, 0x50, 0x60, + 0x46, 0x8d, 0x98, 0x98, 0x8d, 0x68, 0x98, 0x8d, + 0x68, 0x68, 0x76, 0xa8, 0x5f, 0x46, 0x5f, 0xa9, + 0xa9, 0x43, 0x75, 0x8d, 0x79, 0x68, 0x75, 0x8d, + 0x79, 0x75, 0x75, + 0x91, 0x6a, 0x3a, 0x26, 0x48, 0xfa, 0x99, 0x7f, + 0x39, 0x85, 0x81, 0x91, 0x94, 0x7e, 0x46, 0x46, + 0x8f, 0x93, 0x28, 0xe, 0xaa, 0xaa, 0x28, 0xa8, + 0xb, 0xe3, 0xa1, 0xb4, 0xa, 0x34, 0x48, 0x34, + 0x73, 0x1, 0xf2, 0xee, 0x16, 0x16, 0x3d, 0x34, + 0x3d, 0x3d, 0x17, 0x67, 0x80, 0x7f, 0x3f, 0x3f, + 0x15, 0xf2, 0x48, 0x67, 0x42, 0x7f, 0x71, 0x6b, + 0x6b, 0x63, 0x31, 0x71, 0x6b, 0x71, 0x6b, 0x71, + 0x71, 0x80, 0x59, 0x6b, 0x80, 0x99, 0x99, 0x58, + 0x71, 0x6b, 0x71, 0x71, 0x71, 0x71, 0x9a, 0x59, + 0x63, 0x80, 0x63, 0x71, 0x7f, 0x3b, 0x16, 0x70, + 0x80, 0x9a, 0x80, 0x1a, 0xfa, 0x16, 0x14, 0x14, + 0x14, 0x14, 0x3d, 0x17, 0x2b, 0x17, 0x21, 0x1a, + 0x36, 0x48, 0x15, 0x15, 0x16, 0x16, 0x16, 0x3d, + 0xe6, 0xfa, 0x6e, 0x41, 0xc8, 0xbe, 0xe4, 0xec, + 0xe4, 0xc2, 0xc7, 0xc2, 0xd2, 0xdb, 0xd1, 0xc4, + 0xc7, 0xc4, 0xd3, 0xe5, 0xbe, 0xc1, 0xc2, 0xd1, + 0xe7, 0xd2, 0xc4, 0xc4, 0xd2, 0xd0, 0xd0, 0xc4, + 0xc7, 0xd1, 0xdb, 0xdb, 0xf0, 0x7, 0x7, 0x7, + 0x7, 0xb8, 0xc1, 0xbe, 0xb8, 0x7, 0xa6, 0xb7, + 0xa0, 0xc, 0xa6, 0xec, 0xfd, 0x23, 0xeb, 0xeb, + 0xf2, 0xf2, 0x17, 0xeb, 0x15, 0x23, 0x1c, 0x21, + 0x21, 0x2e, 0x2e, 0x22, 0x2e, 0x1d, 0x1d, 0xfa, + 0x21, 0x1d, 0x1d, 0x1d, 0x36, 0x36, 0x21, 0x15, + 0xf2, 0x16, 0x3d, 0x3b, 0x3b, 0x3f, 0x80, 0x6a, + 0x6a, 0x81, 0x81, 0x81, 0x6a, 0x71, 0x81, 0x90, + 0x99, 0x80, 0x6f, 0x6f, 0x85, 0x85, 0x6b, 0x6f, + 0x5d, 0x6b, 0x81, 0x6b, 0x71, 0x71, 0x71, 0x63, + 0x80, 0x71, 0x6a, 0x6a, 0x90, 0x85, 0x58, 0x31, + 0x80, 0x71, 0x6b, 0x6b, 0x71, 0x71, 0x71, 0x85, + 0x7f, 0x70, 0x3b, 0x3d, 0x16, 0x3f, 0x34, 0xeb, + 0x3d, 0x16, 0x34, 0x15, 0x16, 0xf2, 0x54, 0x3, + 0x73, 0xcb, 0xd0, 0xbf, 0xbf, 0xd0, 0xd4, 0x3, + 0xeb, 0x3d, 0x22, 0x1d, 0x23, 0x99, 0x60, 0x9c, + 0xa7, 0xa7, 0x5e, 0x68, 0x79, 0x5e, 0x5e, 0x86, + 0x79, 0x5e, 0x68, 0x68, 0x79, 0x5e, 0x9f, 0x6c, + 0x82, 0xf7, 0x6c, 0x86, 0x68, 0x5e, 0x68, 0x5e, + 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x6c, 0x7, 0x5e, + 0x5e, 0x28, 0x6c, 0x76, 0x5e, 0x82, 0x62, 0x91, + 0x91, 0x6a, 0x90, 0x99, 0x54, 0xeb, 0x15, 0x3d, + 0x34, 0xeb, 0x2a, 0x1c, 0x36, 0x67, 0x39, 0x1c, + 0x1c, 0x39, 0x73, 0x70, 0x54, 0xe6, 0xa, 0xa, + 0xaf, 0x5a, 0xcb, 0xe5, 0x11, 0x40, 0x5a, 0xfe, + 0x20, 0x11, 0x50, 0xba, 0xf7, 0x8, 0xf7, 0xfc, + 0x5e, 0x68, 0x5e, 0x28, 0x68, 0x68, 0x4e, 0x75, + 0xa3, 0x68, 0x7, 0xa0, 0x28, 0x5e, 0x32, 0x28, + 0x1e, 0x32, 0x68, 0x68, 0xa3, 0x32, 0x32, 0x32, + 0x9f, 0xa3, 0x68, + 0x90, 0x90, 0x99, 0x99, 0x54, 0x48, 0x85, 0x20, + 0x67, 0x59, 0x81, 0x81, 0x81, 0x6a, 0x7e, 0x8b, + 0xaa, 0x9c, 0x37, 0x46, 0x60, 0x5f, 0x76, 0xa7, + 0x7e, 0x6a, 0xa6, 0xa1, 0xa, 0x15, 0xfa, 0x1, + 0xeb, 0xeb, 0xf2, 0xf2, 0x17, 0x14, 0x17, 0x15, + 0x3d, 0x14, 0x3d, 0x70, 0x73, 0x16, 0x3b, 0x15, + 0x3d, 0x3b, 0x67, 0x71, 0x63, 0x59, 0x71, 0x6b, + 0x6f, 0x67, 0x42, 0x59, 0x83, 0x85, 0x6b, 0x81, + 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4d, 0x59, 0x71, + 0x71, 0x80, 0x85, 0x6b, 0x85, 0x9a, 0x9a, 0x71, + 0x58, 0x6b, 0x71, 0x63, 0x42, 0x3b, 0x3d, 0x3b, + 0x70, 0x3, 0x73, 0x1, 0xf2, 0xf2, 0x14, 0x3d, + 0x16, 0x3d, 0x16, 0x17, 0x22, 0x22, 0x15, 0x3b, + 0x21, 0xf2, 0xf2, 0x16, 0x16, 0x3d, 0x3d, 0x21, + 0xfe, 0xfe, 0x41, 0x40, 0xc8, 0xbe, 0xc7, 0xc2, + 0xc7, 0xc2, 0xc2, 0xc2, 0xd1, 0xbf, 0xc4, 0xd5, + 0xce, 0xcc, 0xd2, 0xd1, 0xc7, 0xc2, 0xc4, 0xc4, + 0xd2, 0xc4, 0xc4, 0xd1, 0xce, 0xdc, 0xd1, 0xc2, + 0xe2, 0xe7, 0xdb, 0xdb, 0xcc, 0xc1, 0xc1, 0xc1, + 0x7, 0x9f, 0xf7, 0xf7, 0x9f, 0x9f, 0x6c, 0xb6, + 0x7, 0xb8, 0xbe, 0xbf, 0xd0, 0xd8, 0xeb, 0xee, + 0xee, 0xee, 0xf2, 0xfa, 0x1c, 0x36, 0x1a, 0x21, + 0x23, 0x21, 0x15, 0x17, 0x17, 0x22, 0x22, 0x17, + 0x23, 0x36, 0x36, 0x31, 0xfe, 0x1a, 0x31, 0x48, + 0x48, 0x70, 0x3d, 0xf2, 0xeb, 0x34, 0x54, 0x99, + 0x83, 0x6a, 0x91, 0x55, 0x91, 0x6a, 0x6a, 0x6a, + 0x6b, 0x6f, 0x90, 0x7f, 0x7f, 0x90, 0x6f, 0xb0, + 0x83, 0x81, 0x6a, 0x6a, 0x85, 0x58, 0x5d, 0x90, + 0x80, 0x90, 0x6a, 0x5b, 0x41, 0x58, 0x6a, 0x6a, + 0x90, 0x71, 0x5d, 0x6a, 0x5d, 0x5d, 0x83, 0x4a, + 0x39, 0x48, 0x3f, 0x15, 0x16, 0xeb, 0x73, 0xeb, + 0xf5, 0x3d, 0x15, 0xee, 0xf2, 0x34, 0xe6, 0xcb, + 0xea, 0x7f, 0x50, 0xf3, 0xe4, 0xd4, 0xd4, 0xd0, + 0xd8, 0x15, 0x34, 0xfe, 0x54, 0xe5, 0xf8, 0x6c, + 0xfc, 0xe, 0x68, 0x4e, 0x5e, 0x9e, 0xfc, 0x68, + 0x5e, 0x68, 0x9f, 0xfc, 0xfc, 0x8, 0x6c, 0x68, + 0x5e, 0xfc, 0x5e, 0x68, 0x68, 0x68, 0x9f, 0xfc, + 0x28, 0x6c, 0x7, 0x6c, 0x5e, 0x6c, 0x68, 0x5e, + 0x5e, 0x5e, 0x28, 0x76, 0x7d, 0xa7, 0xb3, 0x58, + 0x3a, 0xb4, 0xa, 0x54, 0x23, 0x2b, 0x3b, 0x3f, + 0x48, 0xfa, 0xeb, 0x34, 0x6e, 0xcb, 0xd8, 0xfa, + 0x6e, 0xf1, 0x54, 0x7f, 0x80, 0x36, 0x1c, 0x4d, + 0x4a, 0x41, 0xcb, 0x6e, 0xd4, 0xb4, 0xcb, 0x6e, + 0x20, 0x1b, 0x11, 0xe, 0x37, 0x28, 0xe, 0x1f, + 0x28, 0x68, 0x5e, 0x28, 0x1f, 0x28, 0x68, 0x32, + 0x68, 0xfc, 0x1e, 0x8d, 0x86, 0x5e, 0x5e, 0x1e, + 0x38, 0xfc, 0x32, 0x68, 0x5e, 0xfc, 0xfc, 0x75, + 0x32, 0x86, 0x68, + 0x97, 0x90, 0x3e, 0x40, 0x90, 0x58, 0x6a, 0x6a, + 0x71, 0x9a, 0x5d, 0x6a, 0x83, 0xaa, 0x9c, 0x37, + 0x5f, 0x37, 0x5e, 0x5e, 0x5e, 0x28, 0x6c, 0x6c, + 0xc, 0xb9, 0xc7, 0xd0, 0xd8, 0x1, 0xd8, 0xd8, + 0xeb, 0xde, 0xeb, 0x34, 0xf5, 0x34, 0x39, 0x23, + 0xf2, 0x16, 0x15, 0x3d, 0x16, 0xf2, 0xf2, 0x3d, + 0x16, 0x34, 0x4d, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, + 0x58, 0x63, 0x71, 0x71, 0x99, 0x67, 0x5d, 0x81, + 0x5d, 0x91, 0x7e, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, + 0x6f, 0x66, 0x63, 0x5d, 0x6f, 0x41, 0x90, 0x6a, + 0x6a, 0x5d, 0x90, 0x39, 0x3f, 0xf2, 0x3b, 0x3f, + 0x21, 0x15, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x14, + 0x14, 0x14, 0x14, 0x22, 0x15, 0xf5, 0x15, 0x34, + 0x21, 0x15, 0x14, 0x14, 0x14, 0x14, 0x16, 0x23, + 0xfd, 0xb, 0xd0, 0xd0, 0xe7, 0xd2, 0xc4, 0xce, + 0xcd, 0xcd, 0xd5, 0xc2, 0xcd, 0xcd, 0xc2, 0xdb, + 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, 0xd2, 0xd2, 0xd1, + 0xc2, 0xdc, 0xd5, 0xd5, 0xdc, 0xbd, 0xc2, 0xc4, + 0xdb, 0xdb, 0xd2, 0xc4, 0xc1, 0xf0, 0xf0, 0x28, + 0x9f, 0xfc, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xbd, + 0xbd, 0xce, 0xbe, 0xd2, 0xd6, 0xa, 0x15, 0xee, + 0x16, 0x3d, 0xf2, 0xeb, 0x15, 0x23, 0xfa, 0xe6, + 0xde, 0xf9, 0x39, 0x23, 0x1c, 0x36, 0x2e, 0x22, + 0x1d, 0x1c, 0x1c, 0x23, 0xfe, 0xfe, 0xfd, 0xe5, + 0x3, 0xf9, 0x34, 0x3d, 0xf2, 0x3b, 0x70, 0x54, + 0x67, 0x6f, 0x6a, 0x83, 0x6f, 0x5d, 0x5d, 0x6a, + 0x6a, 0x5d, 0x6f, 0x67, 0x58, 0x5d, 0x58, 0x9a, + 0x9a, 0x71, 0x6a, 0xb0, 0x99, 0x9a, 0x4d, 0x58, + 0x71, 0x6b, 0x6b, 0x6a, 0x71, 0x58, 0x5d, 0x6f, + 0x67, 0x9a, 0x4d, 0x97, 0x99, 0x90, 0x58, 0x58, + 0x59, 0x58, 0x63, 0x42, 0x3d, 0x16, 0x3d, 0xeb, + 0xee, 0xee, 0xee, 0xee, 0xee, 0x34, 0xa, 0x1c, + 0x4d, 0x20, 0x83, 0xa8, 0x50, 0xb4, 0xd6, 0xd8, + 0xeb, 0xee, 0xf2, 0xfa, 0x54, 0x6f, 0x2f, 0x9c, + 0x55, 0x62, 0x5e, 0x8d, 0x98, 0xe, 0xe, 0x46, + 0x98, 0x76, 0x6c, 0x37, 0x46, 0x68, 0x86, 0x82, + 0x8d, 0x8d, 0x82, 0x79, 0x93, 0x37, 0xf7, 0x5f, + 0x93, 0x82, 0x5e, 0x8d, 0x98, 0x8d, 0x8d, 0x93, + 0x8f, 0x93, 0x74, 0x94, 0x94, 0xb0, 0x99, 0x99, + 0x54, 0x73, 0x73, 0xa, 0x23, 0x21, 0x70, 0x7f, + 0x80, 0x73, 0x34, 0x34, 0xeb, 0x15, 0x15, 0x3f, + 0xfa, 0xfa, 0x7f, 0x66, 0x63, 0x58, 0x63, 0x80, + 0x6f, 0x6f, 0x63, 0x99, 0x66, 0x7f, 0xf1, 0x67, + 0x5d, 0x6a, 0x7e, 0x8f, 0x62, 0x93, 0x62, 0x94, + 0x74, 0x93, 0x8f, 0x7e, 0x46, 0x8d, 0x98, 0x8b, + 0x8d, 0x5e, 0x98, 0x8b, 0x82, 0x8d, 0x76, 0x8f, + 0xac, 0xa9, 0x5e, 0x89, 0x8f, 0x75, 0x79, 0x98, + 0x98, 0x75, 0x75, + 0x3a, 0x5d, 0x47, 0x50, 0x5a, 0x26, 0x1b, 0x83, + 0xaf, 0xb4, 0x41, 0x3a, 0x63, 0x83, 0x7d, 0x9c, + 0x12, 0x2f, 0x82, 0x5e, 0x76, 0x5f, 0x12, 0x37, + 0xa0, 0xcc, 0xbf, 0x3, 0xa, 0xeb, 0xd8, 0xeb, + 0xf2, 0xee, 0xee, 0xee, 0xee, 0xeb, 0xde, 0xde, + 0xe1, 0x15, 0xea, 0x54, 0x34, 0x23, 0x48, 0x2b, + 0x3d, 0x3f, 0x36, 0x85, 0x90, 0x97, 0x90, 0x3a, + 0x58, 0x71, 0x71, 0x5d, 0x58, 0x63, 0x71, 0x6b, + 0x71, 0x90, 0x90, 0x6f, 0x90, 0xaf, 0x9a, 0x5d, + 0x5d, 0x71, 0x6b, 0x6b, 0x6b, 0x71, 0x85, 0x6b, + 0x90, 0x99, 0x54, 0x1d, 0x70, 0x3f, 0x3f, 0x1d, + 0x42, 0x2e, 0x15, 0xee, 0x16, 0x14, 0x14, 0xff, + 0x14, 0x14, 0x14, 0x34, 0x21, 0x21, 0x17, 0x1a, + 0x1a, 0x2e, 0x17, 0x16, 0x14, 0x14, 0x16, 0x15, + 0xf1, 0xe6, 0xcb, 0xcb, 0xfd, 0x50, 0xdc, 0xcd, + 0x7, 0x7, 0xcd, 0xc1, 0xc1, 0xc2, 0xc4, 0xd2, + 0xd2, 0xd2, 0xc4, 0xc4, 0xd1, 0xec, 0xec, 0xc2, + 0xcd, 0xcd, 0xc7, 0xd2, 0xd1, 0xc2, 0xc4, 0xd2, + 0xdb, 0xd9, 0xe7, 0xd1, 0xcd, 0xf7, 0xf, 0x9f, + 0x9f, 0x9f, 0xa7, 0xa7, 0x7, 0x6c, 0x9c, 0xc, + 0xf3, 0xaa, 0x6a, 0xaf, 0x6e, 0x54, 0xee, 0xf2, + 0x18, 0x16, 0x3d, 0xf2, 0xf5, 0x15, 0x15, 0x15, + 0x1d, 0x1d, 0x1c, 0x1a, 0x36, 0x1a, 0x36, 0x1d, + 0x23, 0x23, 0x23, 0x21, 0x21, 0x1a, 0x15, 0xf1, + 0x7f, 0x99, 0x34, 0x3d, 0x3f, 0x70, 0x3b, 0x70, + 0x4d, 0x71, 0x85, 0x4d, 0x71, 0x71, 0x6b, 0x6f, + 0x5d, 0x6b, 0x6b, 0x63, 0x71, 0x71, 0x71, 0x71, + 0x9a, 0x85, 0x71, 0x80, 0x59, 0x71, 0x71, 0x6b, + 0x6b, 0x81, 0x71, 0x6b, 0x5d, 0x9a, 0x71, 0x6b, + 0x59, 0x80, 0x63, 0x56, 0x59, 0x71, 0x71, 0x71, + 0x71, 0x71, 0x9a, 0x7f, 0x3d, 0x16, 0x3d, 0x16, + 0x16, 0x3d, 0x16, 0x16, 0x16, 0xf2, 0x1, 0x73, + 0x48, 0x9, 0x5a, 0x58, 0x97, 0xb4, 0xd6, 0xde, + 0xf2, 0xf2, 0x3d, 0xf2, 0xfa, 0x66, 0x27, 0x7e, + 0x8f, 0x93, 0xa7, 0x7d, 0x8f, 0x8f, 0xa7, 0x93, + 0x8f, 0x46, 0x5e, 0x8d, 0x98, 0x8d, 0x5e, 0x79, + 0x8b, 0x82, 0x6c, 0x7d, 0x8f, 0x76, 0x37, 0x98, + 0x8f, 0x98, 0x37, 0x98, 0x93, 0x8d, 0xa7, 0xaa, + 0x8e, 0x8f, 0xaa, 0x6f, 0x6a, 0x5d, 0x6f, 0x80, + 0x48, 0x34, 0x34, 0x34, 0x34, 0x2b, 0xfa, 0x73, + 0x6e, 0x54, 0x48, 0x48, 0x48, 0x1d, 0x3f, 0x23, + 0x48, 0x34, 0x2b, 0x54, 0x54, 0x99, 0x9a, 0x99, + 0x90, 0x5d, 0x4a, 0x6b, 0x5b, 0x58, 0x31, 0x3a, + 0x6a, 0x55, 0x8f, 0x60, 0x55, 0x82, 0x7d, 0x74, + 0x2f, 0x30, 0x62, 0x98, 0x8d, 0xa3, 0x8d, 0x46, + 0x8d, 0x68, 0x79, 0x9c, 0x2c, 0x37, 0x1e, 0x89, + 0x93, 0x28, 0x28, 0x62, 0x79, 0x75, 0x68, 0x79, + 0x5c, 0x28, 0x68, + 0x31, 0x71, 0x6a, 0x85, 0x7f, 0x54, 0x7f, 0x7f, + 0x54, 0x99, 0x26, 0x4d, 0x3a, 0x5d, 0x91, 0x7e, + 0x6a, 0x7e, 0x7d, 0x93, 0x94, 0xaa, 0x74, 0x9c, + 0x6a, 0xa1, 0x50, 0xfd, 0x73, 0x73, 0xd8, 0x73, + 0xee, 0x16, 0x16, 0x14, 0x16, 0xf2, 0xf2, 0xf2, + 0x16, 0x34, 0x3, 0x54, 0x2b, 0x99, 0x99, 0x23, + 0x3f, 0x48, 0x67, 0x67, 0x7f, 0x4d, 0x58, 0x58, + 0x58, 0x71, 0x6b, 0x6b, 0x71, 0x6b, 0x6b, 0x81, + 0x6b, 0x71, 0x6f, 0x71, 0x7f, 0x67, 0x71, 0x71, + 0x71, 0x71, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0x71, + 0x71, 0x9a, 0x67, 0x42, 0x3f, 0x70, 0x42, 0x63, + 0x59, 0x42, 0x15, 0x14, 0x3d, 0x16, 0x14, 0x14, + 0x14, 0x14, 0x17, 0x1d, 0x1a, 0x1d, 0x1d, 0x1d, + 0x1d, 0x1d, 0x17, 0x3d, 0x18, 0x16, 0x16, 0x3d, + 0xeb, 0xfa, 0x23, 0x5a, 0x50, 0xf3, 0x8, 0xf7, + 0x7, 0xb8, 0xbd, 0xc2, 0xc2, 0xc4, 0xc4, 0xc4, + 0xd2, 0xc7, 0xd5, 0xd1, 0xc7, 0xdc, 0xbe, 0xc7, + 0xc2, 0xc2, 0xc7, 0xc4, 0xc4, 0xc4, 0xd1, 0xd1, + 0xc7, 0xec, 0xec, 0xe7, 0xdc, 0xdd, 0x7, 0x9f, + 0x8, 0x82, 0x7d, 0xb7, 0xb8, 0x37, 0x9c, 0xa7, + 0xa7, 0x74, 0x6a, 0x99, 0xa, 0xeb, 0xeb, 0x16, + 0x16, 0x16, 0x3d, 0x17, 0x17, 0x21, 0x22, 0x1a, + 0x1c, 0x1d, 0x3b, 0x21, 0x22, 0x22, 0x1d, 0xfa, + 0x3f, 0x34, 0x1a, 0x1a, 0x36, 0x36, 0x2e, 0x21, + 0x1d, 0x48, 0x15, 0x3d, 0xf2, 0xf2, 0x3d, 0x70, + 0x99, 0x9a, 0x6f, 0x58, 0x81, 0x81, 0x5d, 0x90, + 0x71, 0x6b, 0x85, 0x99, 0x5d, 0x85, 0x71, 0x5d, + 0x5d, 0x71, 0x6b, 0x58, 0x71, 0x6b, 0x6b, 0x81, + 0x6b, 0x71, 0x71, 0x85, 0x85, 0x9a, 0x71, 0x6a, + 0x6b, 0x81, 0x81, 0x6b, 0x58, 0x6b, 0x6b, 0x81, + 0x85, 0x80, 0x42, 0x16, 0x16, 0xf2, 0xde, 0xee, + 0x3d, 0x2a, 0xfa, 0xf2, 0x16, 0xf2, 0xf2, 0x3d, + 0x3d, 0xeb, 0xea, 0x5a, 0x40, 0xbf, 0xbf, 0xea, + 0x2a, 0xeb, 0xeb, 0x2a, 0x3f, 0x26, 0x1b, 0x2f, + 0x82, 0x76, 0xf7, 0x12, 0x46, 0x5e, 0x86, 0x68, + 0x46, 0x46, 0x5e, 0x5e, 0x68, 0x68, 0xfc, 0x37, + 0x68, 0x68, 0x5e, 0xfc, 0x1e, 0x8d, 0x68, 0x8d, + 0x8d, 0x5e, 0x28, 0x76, 0x76, 0x5e, 0x7, 0xa6, + 0x8f, 0x89, 0x74, 0x91, 0x5d, 0x58, 0x63, 0x99, + 0x54, 0x34, 0xeb, 0x2b, 0x15, 0x15, 0x34, 0xeb, + 0xfa, 0x7f, 0x67, 0x67, 0x42, 0x1c, 0x1d, 0x7f, + 0x23, 0x73, 0x34, 0x21, 0x34, 0x54, 0x99, 0x31, + 0x3a, 0x4a, 0x55, 0x6a, 0x60, 0x11, 0x20, 0x1b, + 0x50, 0xc, 0xa7, 0x2c, 0x12, 0x5e, 0x5e, 0x82, + 0x37, 0x1f, 0x30, 0x8d, 0x5e, 0x9e, 0x68, 0xfc, + 0x68, 0x68, 0x5e, 0x5e, 0xe, 0x1f, 0x1f, 0x43, + 0x75, 0x68, 0x32, 0x1e, 0x75, 0xa3, 0x68, 0x32, + 0x1e, 0xe, 0x6c, + 0x85, 0x99, 0x99, 0x90, 0x67, 0x39, 0x39, 0x48, + 0x26, 0x31, 0x99, 0x7f, 0x99, 0x3a, 0x6f, 0x6a, + 0x91, 0x91, 0xaa, 0x74, 0x94, 0x7e, 0x7d, 0x76, + 0x74, 0x60, 0x50, 0xbf, 0xa, 0xe6, 0xde, 0xeb, + 0xf2, 0xf2, 0xf2, 0x16, 0xf2, 0xf2, 0x15, 0x3f, + 0x15, 0xf2, 0x73, 0x1, 0xf2, 0x2a, 0xf1, 0xe6, + 0x54, 0x6e, 0x41, 0x31, 0x31, 0x58, 0x81, 0x6b, + 0x9a, 0x9a, 0x63, 0x85, 0x9a, 0x81, 0x91, 0x81, + 0x81, 0x81, 0x81, 0x6b, 0x59, 0x59, 0x6b, 0x6b, + 0x85, 0x80, 0x80, 0x9a, 0x71, 0x85, 0x5d, 0x6b, + 0x6a, 0x71, 0x71, 0x71, 0x59, 0x42, 0x59, 0x80, + 0x54, 0x73, 0xf2, 0x14, 0x18, 0xf2, 0x16, 0x16, + 0x14, 0x17, 0x22, 0x42, 0x42, 0x1d, 0x22, 0x21, + 0x22, 0x15, 0x16, 0x15, 0x3d, 0x16, 0xf2, 0xfa, + 0x23, 0xfe, 0xfe, 0xb, 0xc8, 0xdd, 0xb8, 0xcd, + 0xbd, 0xdd, 0xbd, 0xc2, 0xd1, 0xe7, 0xd5, 0xc4, + 0xc2, 0xd5, 0xe7, 0xd3, 0xc4, 0xc1, 0xc2, 0xd2, + 0xd2, 0xd1, 0xc4, 0xd1, 0xc2, 0xe7, 0xec, 0xce, + 0xce, 0xdc, 0xec, 0xe7, 0xd1, 0xcd, 0x7, 0x7, + 0xdd, 0x28, 0x6c, 0x6c, 0x6c, 0x6c, 0x37, 0x37, + 0xa0, 0xaa, 0xb0, 0x3, 0xfa, 0xeb, 0xeb, 0xee, + 0x16, 0x14, 0x17, 0x21, 0x66, 0xfe, 0x1a, 0x1a, + 0x23, 0x23, 0x15, 0x15, 0x22, 0x15, 0x15, 0x21, + 0x23, 0x21, 0x1a, 0x31, 0x31, 0x31, 0x31, 0xfe, + 0xfe, 0x48, 0x15, 0x17, 0x3d, 0x3d, 0x34, 0x48, + 0x2a, 0x99, 0x5a, 0x20, 0x6a, 0x91, 0x7e, 0x47, + 0x5d, 0x81, 0x5d, 0x63, 0x71, 0x6a, 0x90, 0xb0, + 0x6a, 0x6a, 0x91, 0x5d, 0x71, 0x85, 0x81, 0x91, + 0x5d, 0x90, 0x67, 0x99, 0x5d, 0x81, 0x6a, 0x90, + 0x6a, 0x6a, 0x6a, 0x6a, 0x5d, 0x71, 0x83, 0x6a, + 0x85, 0x67, 0x70, 0x3d, 0x16, 0xf2, 0xe1, 0xf2, + 0x3d, 0xcb, 0xcb, 0xeb, 0xf2, 0xee, 0x16, 0x16, + 0x34, 0xfa, 0xf1, 0xcb, 0x50, 0xc8, 0xcc, 0xd0, + 0xf1, 0xde, 0xe6, 0xea, 0xf9, 0xfd, 0x40, 0xc, + 0x6c, 0x5e, 0x5e, 0x1e, 0x8d, 0x68, 0x68, 0x68, + 0x68, 0x37, 0x5e, 0x7, 0x68, 0x68, 0x28, 0x8d, + 0x68, 0x86, 0x9e, 0x5e, 0x37, 0x68, 0x68, 0x5e, + 0x5e, 0x5e, 0xa7, 0xb7, 0xa7, 0x76, 0x5f, 0x55, + 0x7e, 0x8f, 0x8f, 0x6a, 0x99, 0x99, 0x9, 0x73, + 0xa, 0xe6, 0xfa, 0xde, 0xfa, 0x21, 0x1d, 0x21, + 0x2b, 0x48, 0x67, 0x99, 0x54, 0xfa, 0x34, 0x73, + 0x73, 0xa, 0x54, 0x34, 0x23, 0x42, 0x85, 0x71, + 0x58, 0x20, 0x6a, 0xb0, 0xb4, 0x3, 0xed, 0x5a, + 0xd4, 0xf3, 0xfc, 0x28, 0x37, 0x5e, 0x5e, 0x5e, + 0x76, 0x37, 0x1f, 0x8d, 0x9f, 0x68, 0x4e, 0x75, + 0x4e, 0x9f, 0x68, 0x79, 0x37, 0x8d, 0x43, 0x82, + 0x8d, 0x5e, 0x86, 0x75, 0x43, 0x9f, 0x7, 0x43, + 0x43, 0x32, 0x5e, + 0x67, 0x7f, 0x7f, 0xfe, 0x58, 0x85, 0x5d, 0x20, + 0x31, 0x80, 0x5a, 0x6e, 0x9, 0x7f, 0x5a, 0x83, + 0x7e, 0x7e, 0x2f, 0x30, 0x93, 0x76, 0x5e, 0x6c, + 0x12, 0xa1, 0xbf, 0xcb, 0xd8, 0xde, 0xde, 0xe1, + 0xde, 0xde, 0xe1, 0x16, 0x3d, 0xfa, 0x3, 0xe6, + 0x15, 0x2b, 0xf2, 0xf2, 0xf2, 0xeb, 0xd8, 0xeb, + 0x54, 0xb, 0x40, 0x41, 0x4d, 0x5d, 0x5d, 0x6a, + 0x6b, 0x58, 0x4d, 0x23, 0x67, 0x6f, 0x6a, 0x83, + 0x5d, 0x91, 0x7e, 0x6a, 0x6a, 0x6a, 0x91, 0x6a, + 0x5d, 0x58, 0x67, 0x39, 0x39, 0x6f, 0x6a, 0x6a, + 0x6a, 0x6b, 0x85, 0x9a, 0x9a, 0x31, 0x59, 0x70, + 0x73, 0x16, 0xff, 0x14, 0xff, 0xff, 0x16, 0x16, + 0x16, 0x22, 0x22, 0x34, 0x39, 0x21, 0x21, 0x15, + 0x15, 0x17, 0x17, 0x16, 0x3d, 0x3d, 0x15, 0xeb, + 0xea, 0xf9, 0xfd, 0xd4, 0xc7, 0xbd, 0xdd, 0xc1, + 0xcd, 0x9f, 0x7, 0xbd, 0xdc, 0xdc, 0xe4, 0xc2, + 0xd1, 0xc4, 0xd2, 0xd3, 0xc4, 0xd2, 0xc4, 0xc4, + 0xdb, 0xcc, 0xcd, 0xce, 0xd1, 0xe2, 0xe2, 0xd1, + 0xc4, 0xc2, 0xd2, 0xd9, 0xd0, 0xcc, 0xdd, 0x28, + 0x9f, 0xa3, 0x6c, 0x6c, 0x7, 0xf3, 0xb3, 0xa6, + 0xbf, 0xb4, 0x6e, 0xa, 0xeb, 0xee, 0x16, 0x16, + 0x14, 0x14, 0x16, 0x21, 0x6e, 0x15, 0x21, 0x23, + 0xfa, 0xfa, 0x48, 0x1a, 0x21, 0x22, 0x22, 0x1a, + 0x1a, 0x23, 0x15, 0x23, 0x1c, 0x23, 0xfe, 0x3c, + 0x1a, 0x23, 0x21, 0x22, 0x17, 0x15, 0x16, 0x3b, + 0x34, 0x73, 0x2a, 0x99, 0x6f, 0x6a, 0x6a, 0x7e, + 0x91, 0x6a, 0x6a, 0x6a, 0x6a, 0x5d, 0x6f, 0x58, + 0x6f, 0x6a, 0x97, 0x4a, 0x6f, 0x9a, 0x97, 0x6a, + 0x81, 0x5d, 0x5d, 0x5d, 0x5d, 0x6a, 0x85, 0x56, + 0x4c, 0x9a, 0xaf, 0x6a, 0x81, 0x71, 0x85, 0x6b, + 0x6b, 0x63, 0x48, 0x3b, 0x17, 0x15, 0x16, 0xf2, + 0x3d, 0xf2, 0xe1, 0xee, 0x16, 0x3d, 0x16, 0x16, + 0x48, 0x23, 0xcb, 0x99, 0x5d, 0x83, 0xbf, 0xde, + 0xeb, 0xf2, 0x15, 0xf1, 0x26, 0x6a, 0xe, 0x46, + 0x7d, 0x46, 0x5e, 0x82, 0x8f, 0x98, 0xe, 0xa8, + 0x8f, 0x8d, 0x68, 0xa7, 0x7d, 0x8d, 0x8d, 0x79, + 0x98, 0x8d, 0x5e, 0x8d, 0x93, 0x82, 0x28, 0xaa, + 0x74, 0x8b, 0x8f, 0x94, 0x7e, 0x94, 0x94, 0x91, + 0x6a, 0x6f, 0x56, 0x54, 0x73, 0x73, 0x34, 0x1, + 0x34, 0x2a, 0xfd, 0x6e, 0xfa, 0x1a, 0x1c, 0x39, + 0x70, 0xfa, 0xfa, 0xeb, 0x15, 0x15, 0x2b, 0xee, + 0x1, 0x70, 0x48, 0x7f, 0x23, 0x31, 0x31, 0x4d, + 0x97, 0x90, 0x90, 0x7f, 0x6e, 0x6e, 0x99, 0x41, + 0x41, 0x11, 0x9c, 0x62, 0x82, 0x76, 0x30, 0x55, + 0xb3, 0xa0, 0x62, 0x62, 0x2f, 0x28, 0x79, 0x8b, + 0x79, 0x32, 0x46, 0x8f, 0x8d, 0x76, 0x82, 0x62, + 0x55, 0x12, 0x8, 0x8b, 0x98, 0x1e, 0x1f, 0x8b, + 0x8b, 0x79, 0x43, + 0x58, 0x85, 0x26, 0x54, 0x9a, 0x99, 0x41, 0x99, + 0x39, 0x6e, 0xa, 0x23, 0x99, 0x4d, 0x20, 0x6f, + 0x6a, 0x81, 0x7e, 0x7e, 0x94, 0x74, 0xa8, 0xa7, + 0xa8, 0x50, 0xd2, 0xd0, 0xa, 0x73, 0x1, 0xee, + 0x3d, 0xee, 0xee, 0x14, 0xf2, 0xee, 0xde, 0xde, + 0x73, 0x54, 0xa, 0x34, 0x21, 0x48, 0x34, 0x2a, + 0x54, 0x39, 0x7f, 0x39, 0x80, 0x71, 0x63, 0x90, + 0x6a, 0x81, 0x6b, 0x71, 0x63, 0x58, 0x5d, 0x56, + 0x63, 0x6a, 0x6a, 0x90, 0x9a, 0x5d, 0x6b, 0x81, + 0x81, 0x91, 0x6b, 0x58, 0x63, 0x71, 0x71, 0x6b, + 0x5d, 0x9a, 0x7f, 0x70, 0x48, 0x80, 0x80, 0x70, + 0x3b, 0x15, 0x16, 0x14, 0x14, 0x14, 0xff, 0x14, + 0x18, 0x3d, 0x17, 0xf2, 0x15, 0x21, 0x1d, 0x21, + 0x1d, 0x2e, 0x1d, 0x15, 0x3d, 0x3d, 0x3d, 0x16, + 0x15, 0xa, 0x7f, 0xb4, 0xe3, 0xba, 0x7, 0x9f, + 0x9f, 0xdd, 0xdd, 0xcd, 0xce, 0xc2, 0xc2, 0xc4, + 0xc4, 0xd1, 0xc4, 0xc4, 0xd2, 0xe7, 0xec, 0xce, + 0xc2, 0xc2, 0xe2, 0xd1, 0xc4, 0xc2, 0xd1, 0xc4, + 0xc4, 0xc4, 0xc7, 0xe2, 0xd5, 0xec, 0x11, 0xfc, + 0x6c, 0x9c, 0x74, 0xaa, 0x50, 0xb0, 0xb0, 0x97, + 0x6e, 0xa, 0x54, 0x39, 0x34, 0x16, 0x16, 0x14, + 0x14, 0x18, 0xf2, 0x17, 0x17, 0xeb, 0x15, 0x1c, + 0x23, 0x21, 0x1c, 0x1a, 0x31, 0x42, 0x1a, 0x1a, + 0x1a, 0xfa, 0x22, 0x1d, 0x21, 0x17, 0x3b, 0x36, + 0x3c, 0x1a, 0x22, 0x1a, 0x42, 0x3b, 0x3d, 0x15, + 0x3d, 0xee, 0x34, 0x7f, 0x4c, 0x56, 0x9a, 0x5d, + 0x6a, 0x71, 0x71, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, + 0x71, 0x59, 0x9a, 0x85, 0x6b, 0x80, 0x7f, 0x99, + 0x6f, 0x90, 0x6f, 0x5d, 0x58, 0x85, 0x85, 0x9a, + 0x58, 0x63, 0x80, 0x63, 0x6b, 0x6b, 0x71, 0x58, + 0x31, 0x80, 0x70, 0x3d, 0x3d, 0x17, 0x16, 0x16, + 0x15, 0x15, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x15, 0x23, 0xa, 0xb4, 0x99, 0x99, 0x3, 0xe6, + 0x73, 0x15, 0x15, 0x34, 0x31, 0x8e, 0x76, 0x5f, + 0x55, 0x62, 0x37, 0xa8, 0x8f, 0x62, 0x30, 0x62, + 0x8f, 0x8d, 0x5e, 0x46, 0x62, 0x8d, 0x5e, 0x98, + 0x8b, 0x30, 0x8d, 0x7d, 0x9c, 0x82, 0x8d, 0x30, + 0x8f, 0x8f, 0x8f, 0x94, 0x81, 0x81, 0x91, 0xb0, + 0x99, 0x7f, 0x48, 0x70, 0x73, 0x48, 0x23, 0x70, + 0x48, 0x99, 0x41, 0x6e, 0x73, 0x54, 0x54, 0xeb, + 0x73, 0x2a, 0x23, 0x34, 0x15, 0x48, 0x23, 0x21, + 0x3b, 0x3b, 0x3f, 0x73, 0x34, 0x34, 0xf9, 0x7f, + 0x6e, 0xaf, 0x9d, 0x31, 0x20, 0x6f, 0x6a, 0x6a, + 0x83, 0x4a, 0x5f, 0x98, 0xa7, 0xa0, 0x2f, 0x55, + 0xc, 0xf7, 0x82, 0x8d, 0x46, 0x5e, 0x8d, 0x8d, + 0x68, 0x5e, 0x8d, 0x79, 0xa7, 0xa0, 0xa0, 0x5f, + 0x93, 0x43, 0x68, 0x75, 0x79, 0x68, 0x75, 0x8d, + 0x79, 0x68, 0xb6, + 0x31, 0x58, 0x80, 0x48, 0x42, 0x7f, 0x54, 0x54, + 0x99, 0x6e, 0x54, 0x39, 0x9a, 0x71, 0x5d, 0x6b, + 0x58, 0x5d, 0x5d, 0x81, 0x91, 0x94, 0x50, 0xa6, + 0x7e, 0xb3, 0xbf, 0x3, 0xf9, 0x6e, 0xa, 0xeb, + 0x15, 0xf2, 0x14, 0x16, 0x14, 0xf2, 0xf2, 0xee, + 0x48, 0x7f, 0x54, 0x2b, 0x1d, 0x1c, 0xa, 0x73, + 0x73, 0x23, 0x39, 0x48, 0x42, 0x59, 0x63, 0x4d, + 0x58, 0x6b, 0x81, 0x6b, 0x59, 0x58, 0x6b, 0x81, + 0x6f, 0x71, 0x5d, 0x67, 0x80, 0x71, 0x6b, 0x6b, + 0x81, 0x6a, 0x81, 0x71, 0x59, 0x59, 0x71, 0x6b, + 0x85, 0x85, 0x48, 0x3d, 0x3b, 0x7f, 0x80, 0x7f, + 0x3b, 0x3b, 0x17, 0x16, 0x16, 0x14, 0x14, 0x14, + 0x16, 0x3b, 0x17, 0x3d, 0x17, 0x2e, 0x36, 0x42, + 0x22, 0x1a, 0x22, 0x15, 0x16, 0x16, 0xee, 0x16, + 0x3d, 0x34, 0x85, 0x90, 0x1b, 0xf8, 0xf7, 0x7, + 0x7, 0xdd, 0xf0, 0xe2, 0xc2, 0xc2, 0xd1, 0xd2, + 0xdb, 0xd2, 0xce, 0xce, 0xc4, 0xe7, 0xe4, 0xc7, + 0xc2, 0xc2, 0xd5, 0xd2, 0xd2, 0xc4, 0xc2, 0xd1, + 0xdb, 0xd5, 0xbe, 0xdd, 0xbe, 0xec, 0x11, 0x2f, + 0x6c, 0xa7, 0x74, 0x60, 0xbf, 0xb4, 0x97, 0x6f, + 0x99, 0x2b, 0x34, 0x48, 0xeb, 0xee, 0x14, 0x16, + 0x16, 0x3d, 0x17, 0xfa, 0x15, 0x17, 0x21, 0x36, + 0x1d, 0x17, 0x1a, 0x1c, 0x36, 0x39, 0x23, 0x1d, + 0x23, 0x23, 0x70, 0x1c, 0x1a, 0x22, 0x22, 0x36, + 0x67, 0x21, 0x22, 0x21, 0x3b, 0x3d, 0x3d, 0x15, + 0x15, 0x3d, 0x34, 0x99, 0x6f, 0x9a, 0x63, 0x6a, + 0x81, 0x85, 0x9a, 0x85, 0x6b, 0x71, 0x83, 0x6a, + 0x5d, 0x71, 0x5d, 0x6a, 0x6a, 0x85, 0x48, 0x9a, + 0x9a, 0x99, 0x7f, 0x90, 0x71, 0x85, 0x99, 0x85, + 0x6b, 0x6b, 0x6b, 0x81, 0x81, 0x6b, 0x71, 0x4d, + 0x63, 0x7f, 0x73, 0x2b, 0x15, 0x16, 0x16, 0xf2, + 0x23, 0x54, 0x15, 0x3d, 0x3d, 0x16, 0xf2, 0x16, + 0xf5, 0xe6, 0xd8, 0xcb, 0xaf, 0xb, 0xd4, 0xd0, + 0xea, 0x23, 0x23, 0x54, 0x20, 0x2f, 0x6c, 0xf7, + 0xe, 0x1f, 0x6c, 0xa0, 0x28, 0x5e, 0x5e, 0x5e, + 0x8d, 0x5e, 0x9f, 0x4e, 0x37, 0x5e, 0x5e, 0x6c, + 0x37, 0x5e, 0x68, 0x5e, 0x5e, 0x68, 0x32, 0x5e, + 0x76, 0x82, 0x93, 0x74, 0x94, 0x94, 0x6f, 0x90, + 0x99, 0x39, 0x54, 0x34, 0x54, 0x66, 0x9d, 0x67, + 0x99, 0x40, 0xe4, 0x3, 0xd8, 0xea, 0xe6, 0xeb, + 0x15, 0xa, 0x23, 0xfa, 0xfa, 0x39, 0xfe, 0x1d, + 0x34, 0x21, 0xfa, 0x3b, 0x15, 0x48, 0x99, 0x6e, + 0x3, 0xb, 0x60, 0x6a, 0x3e, 0x52, 0x2f, 0x2f, + 0x2c, 0xb7, 0x28, 0x6c, 0x8, 0x8, 0x5e, 0x5e, + 0x6c, 0x9f, 0x68, 0x5e, 0x68, 0x68, 0xa3, 0x68, + 0x68, 0x9f, 0x5e, 0x86, 0x9f, 0x8, 0x8, 0x6c, + 0x32, 0x86, 0x4e, 0x32, 0x86, 0xa3, 0xa2, 0x5e, + 0x86, 0xa3, 0x7, + 0x31, 0x63, 0x99, 0x99, 0x59, 0x42, 0x23, 0x67, + 0x9a, 0x99, 0x48, 0x48, 0x58, 0x71, 0x90, 0x6f, + 0x31, 0x4d, 0x80, 0xb0, 0x6a, 0x7e, 0x27, 0x55, + 0x74, 0xac, 0xa1, 0xe0, 0x6e, 0xc9, 0xcb, 0xd8, + 0x1, 0xeb, 0x14, 0x16, 0x3b, 0x3b, 0x3b, 0x15, + 0x7f, 0x7f, 0x73, 0x70, 0x34, 0x2a, 0xd8, 0xeb, + 0x54, 0x67, 0x4d, 0x80, 0x71, 0x81, 0x71, 0x4d, + 0x59, 0x71, 0x83, 0x9a, 0x85, 0x6b, 0x91, 0x91, + 0x91, 0x6a, 0x81, 0x71, 0x71, 0x6b, 0x81, 0x85, + 0x58, 0x6b, 0x90, 0x99, 0x80, 0x71, 0x6b, 0x6b, + 0x6a, 0x85, 0x1d, 0x16, 0x16, 0x3b, 0x70, 0x3d, + 0x3d, 0x16, 0x16, 0xf2, 0x16, 0x16, 0x14, 0x14, + 0x16, 0x22, 0x2e, 0x22, 0x22, 0x1d, 0x42, 0x21, + 0x16, 0x17, 0x3d, 0xf5, 0x3b, 0xf2, 0x15, 0x16, + 0x15, 0x23, 0x58, 0x6f, 0x52, 0x2c, 0x8, 0xb8, + 0xc1, 0xc1, 0xe2, 0xe3, 0xc7, 0xc7, 0xce, 0xdc, + 0xbf, 0xc4, 0xc1, 0xc2, 0xd1, 0xd2, 0xdb, 0xc4, + 0xd1, 0xc4, 0xd2, 0xd1, 0xd1, 0xd1, 0xdc, 0xcd, + 0xc7, 0xbf, 0xbe, 0xdd, 0xc1, 0xd1, 0x50, 0x28, + 0x7, 0xf7, 0x5f, 0x5f, 0x3e, 0x40, 0x90, 0x85, + 0x26, 0x2a, 0x34, 0x15, 0x16, 0x16, 0x14, 0x14, + 0xf5, 0x3d, 0x17, 0x1a, 0x1a, 0x1d, 0x1a, 0x1c, + 0x1c, 0x15, 0x17, 0x23, 0x23, 0xeb, 0x15, 0x23, + 0xfe, 0xfa, 0x1a, 0x1a, 0x1a, 0x36, 0x1a, 0x36, + 0x1a, 0x15, 0x3b, 0x3b, 0x15, 0x16, 0x15, 0xeb, + 0x34, 0x3b, 0x34, 0x41, 0x3e, 0x6a, 0x6a, 0x91, + 0x55, 0x90, 0x58, 0x6b, 0x6a, 0x90, 0x97, 0x6a, + 0x6a, 0x5d, 0x83, 0x6a, 0x6a, 0x6a, 0x85, 0x6f, + 0x5d, 0x63, 0x42, 0x4d, 0x6b, 0x71, 0x90, 0x5d, + 0x6a, 0x6a, 0x6a, 0x6a, 0x83, 0x6a, 0xb0, 0x41, + 0x41, 0x48, 0x3f, 0xf2, 0x16, 0x16, 0x14, 0x3d, + 0xa, 0xcb, 0x1, 0xeb, 0x3d, 0x3d, 0x16, 0x16, + 0xf2, 0xeb, 0xfa, 0xea, 0x40, 0xf8, 0xbf, 0xd0, + 0xc0, 0xfb, 0xa, 0xcb, 0x40, 0xf8, 0xf7, 0xf7, + 0x6c, 0x5e, 0x5e, 0x28, 0x28, 0x5e, 0x86, 0x68, + 0x86, 0x68, 0xa3, 0x6c, 0x6c, 0x5e, 0x5e, 0xfc, + 0x5e, 0x5e, 0x68, 0x5e, 0x28, 0x5e, 0x86, 0x28, + 0xa7, 0xf3, 0x2f, 0x6a, 0xb0, 0x60, 0x83, 0xf9, + 0x54, 0x6e, 0x2a, 0x34, 0xeb, 0x39, 0x41, 0x99, + 0x3, 0xb, 0x50, 0xe3, 0xb, 0xb, 0xb, 0x39, + 0xfa, 0xfa, 0xe6, 0xeb, 0xf2, 0xde, 0xfa, 0x73, + 0xeb, 0xa, 0x21, 0x1a, 0x42, 0x63, 0x90, 0x67, + 0xf9, 0x20, 0x83, 0xb0, 0xaf, 0xb, 0x11, 0x60, + 0x2c, 0xf3, 0x37, 0xc, 0x1f, 0x28, 0x68, 0x37, + 0x5e, 0xfc, 0x37, 0x68, 0x68, 0xa3, 0x28, 0xfc, + 0x4e, 0x9f, 0x68, 0x68, 0xfc, 0x1f, 0xfc, 0x75, + 0x75, 0x68, 0x9f, 0x1e, 0x28, 0x32, 0x9f, 0x8, + 0xfc, 0xfc, 0x5e, + 0x67, 0x26, 0x3, 0xb, 0x6a, 0x6b, 0x4a, 0x4a, + 0x3a, 0x31, 0x48, 0x2a, 0x26, 0x7f, 0xa, 0xb4, + 0x4a, 0x1b, 0xfd, 0x50, 0x2f, 0x28, 0x6c, 0x5e, + 0x8, 0xa0, 0xbf, 0xcb, 0xcb, 0xd7, 0xd7, 0xd8, + 0xd8, 0xde, 0xee, 0xf2, 0x23, 0x1c, 0xeb, 0x34, + 0x2a, 0x73, 0x54, 0xeb, 0xeb, 0xde, 0x15, 0x2a, + 0x7f, 0x5d, 0x6a, 0x81, 0x58, 0x6b, 0x6a, 0x6a, + 0x5d, 0x6a, 0x63, 0x67, 0x58, 0x6a, 0x72, 0x6a, + 0x6a, 0x7e, 0x6a, 0x6a, 0x5d, 0x5d, 0x6a, 0x6a, + 0x6f, 0x6a, 0x90, 0x80, 0x90, 0x5d, 0x5d, 0x85, + 0x9a, 0xfe, 0x34, 0x16, 0x3d, 0x2b, 0xeb, 0xf2, + 0x3d, 0xf2, 0x3d, 0xee, 0x14, 0x14, 0x18, 0x14, + 0x17, 0x23, 0x1a, 0x1d, 0x3b, 0x21, 0xfa, 0x17, + 0x16, 0x21, 0x17, 0x15, 0x16, 0x16, 0x16, 0x18, + 0x22, 0x23, 0x42, 0x20, 0xa1, 0xbf, 0xb7, 0xc8, + 0xce, 0xdc, 0xdd, 0xdd, 0xf0, 0xf0, 0xdd, 0xb8, + 0xc2, 0xc4, 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, 0xd9, + 0xd9, 0xc4, 0xdc, 0xcd, 0xc2, 0xd1, 0xe2, 0xbe, + 0xc1, 0xd1, 0xc4, 0xd1, 0xd2, 0xd1, 0xcd, 0x8, + 0xdd, 0xf3, 0xe, 0xa9, 0xa1, 0x7f, 0x23, 0x23, + 0x54, 0xd8, 0x15, 0xee, 0xee, 0x16, 0x14, 0x16, + 0xee, 0x15, 0x15, 0x39, 0xfa, 0xfa, 0x34, 0x23, + 0xfa, 0xfa, 0xeb, 0x21, 0x1c, 0x21, 0x1c, 0x4d, + 0x23, 0x3b, 0x1d, 0x1a, 0x1d, 0x21, 0x15, 0x34, + 0x21, 0x1d, 0x48, 0x1a, 0xfa, 0x16, 0x16, 0x3d, + 0x2b, 0x3d, 0xee, 0x73, 0x7f, 0x90, 0x6a, 0x6a, + 0x5d, 0x6b, 0x6b, 0x6a, 0x71, 0x58, 0x58, 0x5d, + 0x90, 0x54, 0x7f, 0x13, 0x3a, 0x6f, 0x5d, 0x6f, + 0x6f, 0x58, 0x71, 0x6b, 0x6b, 0x58, 0x80, 0x4d, + 0x58, 0x99, 0x88, 0x99, 0x4d, 0x4d, 0x63, 0x90, + 0x85, 0x63, 0x48, 0x22, 0x48, 0x3b, 0x16, 0x14, + 0x16, 0xf2, 0xf2, 0x16, 0xf2, 0x15, 0xf2, 0x3d, + 0x70, 0x7f, 0x39, 0x23, 0x5a, 0x72, 0xd0, 0x73, + 0xfa, 0xeb, 0xe6, 0x5a, 0x41, 0x4a, 0x27, 0x93, + 0x62, 0x98, 0x9f, 0x30, 0x62, 0x8d, 0x68, 0x76, + 0x60, 0x27, 0x37, 0x79, 0x8b, 0x8d, 0x1e, 0x62, + 0x8f, 0x98, 0x8d, 0x46, 0x74, 0x37, 0x5e, 0x9c, + 0x40, 0x6a, 0x6b, 0x6a, 0x81, 0x5d, 0x63, 0x42, + 0x48, 0x54, 0x73, 0x34, 0x2b, 0x2a, 0x54, 0xa, + 0x99, 0x90, 0x4a, 0x6a, 0x7e, 0xa8, 0x2f, 0x83, + 0x6e, 0xf1, 0xeb, 0x15, 0x16, 0x16, 0xf2, 0x16, + 0x34, 0x34, 0x23, 0x42, 0x36, 0x63, 0x9a, 0x63, + 0x9a, 0x7f, 0x99, 0x9a, 0x99, 0x99, 0x3a, 0x81, + 0x7e, 0x9c, 0x62, 0x8f, 0x62, 0x5e, 0x7d, 0x8b, + 0x98, 0x1f, 0x93, 0x8f, 0x79, 0x68, 0x28, 0x8b, + 0x75, 0x68, 0x8d, 0x8d, 0x8d, 0x37, 0x1e, 0xad, + 0xab, 0x8d, 0xa7, 0x74, 0x8b, 0x75, 0x75, 0x98, + 0x8f, 0x79, 0x8d, + 0x63, 0x99, 0x26, 0x4d, 0x6f, 0x6f, 0x90, 0x99, + 0x23, 0x26, 0x7f, 0x5a, 0x99, 0x26, 0x67, 0x3a, + 0x90, 0x99, 0x5a, 0x20, 0x11, 0xe, 0x6c, 0xb9, + 0x50, 0xf0, 0xbf, 0xd0, 0xcb, 0x5a, 0xe6, 0xeb, + 0x54, 0x54, 0x3d, 0x16, 0x15, 0xa, 0x34, 0x34, + 0x73, 0xeb, 0xeb, 0x34, 0x73, 0x48, 0x21, 0x23, + 0x67, 0x6f, 0x85, 0x6f, 0x31, 0x4d, 0x5d, 0x6a, + 0x6f, 0x5d, 0x58, 0x6b, 0x71, 0x6a, 0x5d, 0x58, + 0x5d, 0x5d, 0x97, 0x80, 0x9a, 0x63, 0x71, 0x71, + 0x6f, 0x4a, 0x4c, 0x31, 0x58, 0x81, 0x71, 0x67, + 0x48, 0x21, 0x3b, 0x3d, 0x16, 0xeb, 0xeb, 0xf2, + 0xf2, 0xf2, 0x3d, 0x14, 0x14, 0x14, 0x16, 0x3d, + 0x16, 0xfa, 0xfa, 0x15, 0x15, 0x15, 0x21, 0x22, + 0x22, 0x42, 0x1a, 0x22, 0x17, 0x3d, 0x14, 0x16, + 0x16, 0xf2, 0xfa, 0x42, 0x99, 0x97, 0x6a, 0x6a, + 0xaa, 0xdd, 0xb8, 0xdd, 0xe2, 0xec, 0xce, 0xc1, + 0xc2, 0xc2, 0xd2, 0xdb, 0xc4, 0xc4, 0xd1, 0xe7, + 0xdb, 0xdb, 0xc2, 0xc1, 0xc7, 0xd2, 0xd2, 0xd1, + 0xc4, 0xc4, 0xc4, 0xe7, 0xec, 0xcc, 0x60, 0xe, + 0x12, 0x11, 0xb0, 0xaf, 0x3, 0xa, 0xfa, 0x15, + 0xf2, 0xee, 0xe1, 0xee, 0x14, 0x14, 0x16, 0x15, + 0x16, 0xee, 0x15, 0xeb, 0x15, 0xee, 0x15, 0xf2, + 0xeb, 0xeb, 0xfa, 0x1d, 0x1a, 0x1a, 0x22, 0x42, + 0x42, 0x21, 0x17, 0x15, 0x17, 0x15, 0x17, 0x21, + 0x21, 0x42, 0x36, 0x36, 0x21, 0x14, 0x17, 0x3d, + 0x3d, 0x16, 0x16, 0x3d, 0x3b, 0x70, 0x67, 0x9a, + 0x85, 0x58, 0x6b, 0x81, 0x6b, 0x6b, 0x6b, 0x85, + 0x71, 0x58, 0x63, 0x63, 0x80, 0x80, 0x6b, 0x6b, + 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x85, 0x66, + 0x80, 0x4d, 0x63, 0x58, 0x63, 0x7f, 0x42, 0x71, + 0x71, 0x63, 0x80, 0x7f, 0x67, 0x70, 0x3d, 0x3d, + 0xf2, 0x16, 0x16, 0x16, 0x16, 0x16, 0xee, 0xf2, + 0x34, 0x34, 0xea, 0xe6, 0xa, 0xf4, 0xd0, 0xcb, + 0x73, 0xfa, 0x2a, 0xfe, 0x5d, 0x7e, 0x37, 0x46, + 0x8f, 0x74, 0x79, 0x8d, 0x74, 0x93, 0x5e, 0x8d, + 0x93, 0x79, 0x8d, 0x8d, 0x62, 0x8d, 0x8d, 0x98, + 0x62, 0x76, 0x5e, 0x82, 0x9c, 0x76, 0x5e, 0x7d, + 0x94, 0x8e, 0x91, 0x81, 0x90, 0x99, 0x54, 0x48, + 0x2a, 0x54, 0x54, 0x48, 0x7f, 0x99, 0x39, 0x42, + 0x4d, 0x6a, 0x5f, 0x94, 0x74, 0xa7, 0xb7, 0x50, + 0xbf, 0xd0, 0xe0, 0xfa, 0x2a, 0xfa, 0xeb, 0x3d, + 0x15, 0x3f, 0x34, 0x34, 0x34, 0x2a, 0x54, 0x99, + 0x80, 0x99, 0x66, 0x31, 0x31, 0x6a, 0x6a, 0x62, + 0x46, 0x2f, 0x46, 0x8b, 0x8d, 0x7, 0xa0, 0x46, + 0x68, 0x68, 0x5e, 0x8d, 0xfc, 0x68, 0x68, 0x32, + 0x68, 0xa3, 0x28, 0x8d, 0xa3, 0x7, 0x7, 0xf3, + 0x2f, 0x43, 0x86, 0x79, 0x79, 0x32, 0x32, 0x43, + 0x75, 0x86, 0x5e, + 0x71, 0x63, 0x36, 0x39, 0x9a, 0x99, 0x99, 0x6e, + 0x23, 0x48, 0x80, 0x99, 0x3a, 0x58, 0x31, 0x85, + 0x6f, 0x90, 0x67, 0xfd, 0x90, 0x7e, 0xc, 0xb7, + 0x40, 0x4a, 0x50, 0xb4, 0x3, 0x6e, 0x23, 0x34, + 0x73, 0x73, 0x1, 0x16, 0x16, 0xeb, 0xee, 0xee, + 0x1, 0xf2, 0x3d, 0x70, 0x70, 0x54, 0x70, 0x42, + 0x48, 0x67, 0x31, 0x85, 0x67, 0x1c, 0x80, 0x71, + 0x6b, 0x6b, 0x58, 0x6b, 0x6b, 0x6b, 0x5d, 0x71, + 0x6b, 0x6b, 0x80, 0x67, 0x80, 0x63, 0x9a, 0x85, + 0x6b, 0x6b, 0x95, 0x59, 0x71, 0x71, 0x71, 0x63, + 0x42, 0x70, 0x15, 0x3d, 0x18, 0x3d, 0xf2, 0x16, + 0x73, 0x34, 0x16, 0x14, 0x16, 0x16, 0x14, 0x18, + 0x3d, 0x17, 0xfa, 0x15, 0x17, 0x21, 0x1a, 0x22, + 0x2e, 0x1d, 0x1d, 0x21, 0x15, 0x16, 0xf5, 0xee, + 0x14, 0x16, 0xf2, 0x15, 0x42, 0x58, 0x6a, 0x7e, + 0xaa, 0xbe, 0xbe, 0xbe, 0xc7, 0xd2, 0xe2, 0xdc, + 0xce, 0xd1, 0xc7, 0xdc, 0xc7, 0xc4, 0xd1, 0xd2, + 0xdb, 0xd2, 0xd2, 0xc4, 0xc4, 0xd1, 0xd2, 0xd2, + 0xe2, 0xd5, 0xd1, 0xe4, 0xf0, 0xe3, 0x50, 0xa8, + 0xf7, 0x50, 0x41, 0x7f, 0xea, 0xfa, 0xf5, 0xf2, + 0x16, 0x16, 0xee, 0x14, 0x14, 0x16, 0xf2, 0xe1, + 0xf2, 0xf2, 0x15, 0x15, 0x15, 0x15, 0xeb, 0xf2, + 0xf2, 0x3d, 0x17, 0x15, 0x15, 0x15, 0x15, 0x22, + 0x21, 0x21, 0xfa, 0x21, 0x1d, 0x2e, 0x21, 0x1d, + 0xfa, 0x23, 0x1c, 0x23, 0x15, 0x3b, 0x15, 0x34, + 0x15, 0x3b, 0x3b, 0x3b, 0x3d, 0x3f, 0x48, 0x67, + 0x99, 0x80, 0x71, 0x6a, 0x6a, 0x71, 0x81, 0x6f, + 0x81, 0x81, 0x81, 0x6b, 0x71, 0x58, 0x71, 0x6a, + 0x71, 0x80, 0x71, 0x9a, 0x6f, 0x6f, 0x90, 0x41, + 0x3a, 0x31, 0x58, 0x6a, 0x5d, 0x59, 0x67, 0x80, + 0x80, 0x99, 0x99, 0x54, 0x99, 0x48, 0x48, 0x39, + 0xa, 0x15, 0x15, 0x3b, 0x15, 0xf2, 0x16, 0x16, + 0xf2, 0xeb, 0xe6, 0xe0, 0xe0, 0xed, 0xe5, 0xe5, + 0x3, 0x39, 0x23, 0x3c, 0x4a, 0x5f, 0x28, 0x7, + 0xc8, 0x2c, 0x6c, 0x5e, 0x46, 0x1f, 0x1f, 0x28, + 0x5e, 0x68, 0x68, 0x28, 0x46, 0x5e, 0x68, 0x5e, + 0xa0, 0xe, 0x28, 0x5e, 0x5e, 0x5e, 0x5e, 0x5f, + 0x8f, 0x9c, 0x74, 0x6f, 0x26, 0x6e, 0x73, 0xfa, + 0x2a, 0x54, 0x23, 0x80, 0x85, 0x90, 0x6f, 0x26, + 0x3a, 0x10, 0xa8, 0xa7, 0xa9, 0xba, 0xba, 0xf3, + 0xe4, 0xd4, 0xdb, 0xed, 0xfd, 0xbf, 0xe6, 0x15, + 0x34, 0xfa, 0x15, 0x15, 0x15, 0x34, 0x2b, 0x42, + 0x90, 0x5d, 0x41, 0x3a, 0x3a, 0x4a, 0xa4, 0x5f, + 0x12, 0x12, 0x2c, 0x76, 0x6c, 0x8, 0x2f, 0x1f, + 0x68, 0x68, 0xa3, 0x5e, 0x1e, 0x28, 0x4e, 0x68, + 0x68, 0xa2, 0xf7, 0x5e, 0x9f, 0xa3, 0x5e, 0xfc, + 0xfc, 0xfc, 0x68, 0x68, 0xa3, 0x32, 0xfc, 0x86, + 0x68, 0x68, 0x5e, + 0x85, 0x85, 0x9a, 0x7f, 0x39, 0x31, 0x36, 0x67, + 0x67, 0x70, 0x67, 0x63, 0x63, 0x9a, 0x90, 0x90, + 0x90, 0xb0, 0x40, 0x50, 0x60, 0x62, 0x1e, 0x5f, + 0x74, 0x74, 0xc, 0xbf, 0x3, 0xb4, 0xcb, 0x73, + 0xd8, 0xfa, 0x34, 0x22, 0x15, 0x16, 0x16, 0x16, + 0x16, 0x15, 0x3d, 0x15, 0x34, 0xeb, 0x54, 0x6e, + 0x6e, 0x42, 0x63, 0x58, 0x63, 0x63, 0x99, 0x63, + 0x5d, 0x6f, 0x97, 0x83, 0x71, 0x83, 0x5d, 0x81, + 0x6b, 0x81, 0x6b, 0x71, 0x71, 0x58, 0x80, 0x63, + 0x71, 0x6f, 0x66, 0x9a, 0x85, 0x83, 0x85, 0x85, + 0x80, 0x54, 0x3b, 0x16, 0x3d, 0x3d, 0xf2, 0x3d, + 0x3d, 0xf2, 0x16, 0x16, 0x14, 0x14, 0x16, 0x17, + 0x17, 0x21, 0x1c, 0x1d, 0x2e, 0x23, 0x21, 0x17, + 0x15, 0x15, 0xeb, 0xf2, 0x15, 0xf2, 0xf2, 0x16, + 0x16, 0x14, 0x16, 0x15, 0x1d, 0x67, 0x90, 0x81, + 0xaa, 0xbe, 0xd1, 0xd5, 0xe4, 0xe4, 0xdc, 0xf0, + 0xf0, 0xdc, 0xbe, 0xcd, 0xc7, 0xd2, 0xd3, 0xc4, + 0xc4, 0xd2, 0xd2, 0xd2, 0xd1, 0xc4, 0xc4, 0xd5, + 0xec, 0xe7, 0xd5, 0xbe, 0xce, 0xd1, 0xdb, 0xcc, + 0xb7, 0xcc, 0xd0, 0xc9, 0xfe, 0x48, 0x34, 0xf2, + 0x16, 0xee, 0xee, 0xee, 0x14, 0x16, 0xf2, 0xee, + 0xee, 0xeb, 0xde, 0xe6, 0xf1, 0xf9, 0xe6, 0xf1, + 0xeb, 0xee, 0xee, 0xf2, 0x16, 0x17, 0x14, 0xf2, + 0x15, 0x1c, 0x36, 0x3a, 0x1a, 0x1a, 0x1a, 0x23, + 0x23, 0x22, 0x15, 0xde, 0xfa, 0x17, 0x34, 0xe6, + 0x16, 0x3d, 0x70, 0x54, 0x15, 0x2b, 0x36, 0x58, + 0x31, 0x58, 0x5d, 0x1b, 0x99, 0x90, 0x81, 0x6a, + 0x91, 0x91, 0x91, 0x6a, 0x6a, 0x58, 0x1b, 0x9a, + 0x41, 0x80, 0x6f, 0x90, 0x41, 0x99, 0x9d, 0x90, + 0x41, 0x31, 0x58, 0x7e, 0x6a, 0x6f, 0x58, 0x59, + 0x99, 0x59, 0x71, 0x63, 0x26, 0x2a, 0x70, 0x41, + 0x6e, 0x15, 0x15, 0xeb, 0xeb, 0xf2, 0x16, 0x3d, + 0xf2, 0x15, 0x6e, 0xfd, 0xe5, 0x20, 0x11, 0xa1, + 0xb4, 0x6e, 0xfd, 0xfd, 0xe5, 0xb7, 0x7, 0xa0, + 0xf8, 0x12, 0x28, 0x68, 0x8d, 0x37, 0x1f, 0x8d, + 0x68, 0x5e, 0x86, 0x37, 0x1f, 0x28, 0x5e, 0x68, + 0x28, 0x1f, 0x1f, 0x5e, 0x86, 0x68, 0x5e, 0x30, + 0xaa, 0x50, 0xbb, 0xaf, 0x99, 0xf1, 0x2a, 0x42, + 0x59, 0x23, 0x39, 0x4d, 0x6f, 0xb0, 0x5a, 0x39, + 0x39, 0xe5, 0x50, 0xa8, 0x9c, 0x2f, 0xe, 0xa7, + 0xe, 0xf3, 0xbf, 0xfd, 0xa1, 0xd2, 0xe0, 0x1, + 0x15, 0xeb, 0xeb, 0x23, 0x1d, 0x23, 0x21, 0x48, + 0x9a, 0x97, 0x7f, 0x2a, 0xf9, 0xe5, 0xa1, 0xa6, + 0xe, 0x12, 0x2f, 0x46, 0x8d, 0x5e, 0x1e, 0x46, + 0x5e, 0x68, 0x5e, 0x8d, 0x8d, 0x5e, 0x5e, 0x68, + 0x5e, 0x68, 0x1e, 0x79, 0x68, 0x68, 0x86, 0x5e, + 0x8d, 0x43, 0x68, 0x32, 0x76, 0x75, 0x43, 0x43, + 0x82, 0x75, 0x75, + 0x9, 0x7f, 0x40, 0x6, 0x20, 0x31, 0x3a, 0x4a, + 0x83, 0x63, 0x36, 0x39, 0x6e, 0x6e, 0x41, 0xe5, + 0x5a, 0x40, 0xe, 0x28, 0x28, 0xfc, 0xc, 0xe, + 0x37, 0xa0, 0xb7, 0xe3, 0xcb, 0xd8, 0xcb, 0xd8, + 0xe6, 0x73, 0x23, 0x26, 0x7f, 0xfa, 0x21, 0x17, + 0x15, 0x73, 0xf5, 0x2b, 0x2a, 0x48, 0x26, 0x3a, + 0x99, 0xfe, 0x4d, 0x71, 0x5d, 0x6a, 0x58, 0x31, + 0x5d, 0x83, 0x63, 0x63, 0x63, 0x7f, 0x99, 0x6a, + 0x6a, 0x91, 0x91, 0x91, 0x6a, 0x5d, 0x6f, 0x58, + 0x63, 0xaf, 0x9a, 0x58, 0x6f, 0x6f, 0x90, 0x58, + 0x85, 0x54, 0x3d, 0x16, 0x16, 0x34, 0xeb, 0x34, + 0xeb, 0xe1, 0xf2, 0xf2, 0xff, 0x14, 0x16, 0x14, + 0x2e, 0xf9, 0x39, 0x1d, 0x21, 0xfa, 0xfa, 0x15, + 0x17, 0xfa, 0x15, 0x15, 0x21, 0xeb, 0x16, 0x14, + 0x18, 0x3d, 0x16, 0x3d, 0x3b, 0xfa, 0x39, 0x90, + 0x6a, 0x40, 0x40, 0x40, 0x2c, 0xdd, 0xcc, 0xe7, + 0xe7, 0xe7, 0xd1, 0xc4, 0xc4, 0xd3, 0xd3, 0xc4, + 0xd1, 0xc4, 0xd2, 0xdb, 0xd4, 0xd5, 0xc4, 0xd2, + 0xd2, 0xd9, 0xd2, 0xc2, 0xc2, 0xd5, 0xec, 0xf8, + 0xf7, 0x2c, 0xb4, 0x73, 0x15, 0x15, 0xf2, 0xf2, + 0x16, 0xee, 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, + 0xf2, 0xee, 0xde, 0xde, 0xd8, 0xd7, 0xd7, 0xd3, + 0xd7, 0x39, 0x15, 0x16, 0x3d, 0x15, 0x17, 0x18, + 0x17, 0x1a, 0x36, 0x23, 0x23, 0x1d, 0x15, 0xfa, + 0xfa, 0x1a, 0x1a, 0x1a, 0x1a, 0x21, 0x22, 0x21, + 0x15, 0x3b, 0x34, 0x34, 0xee, 0x70, 0x67, 0x41, + 0x6f, 0x71, 0x6a, 0x81, 0x5d, 0x6b, 0x81, 0x6a, + 0x81, 0x81, 0x81, 0x6f, 0x9a, 0x85, 0x3a, 0x4d, + 0x67, 0x59, 0x71, 0x6b, 0x58, 0x58, 0x58, 0x63, + 0x7f, 0x59, 0x5d, 0x7a, 0x90, 0x6f, 0x6b, 0x71, + 0x71, 0x71, 0x71, 0x71, 0x71, 0x59, 0x1d, 0x3f, + 0x3d, 0x16, 0xf2, 0xf2, 0x16, 0x16, 0x70, 0x34, + 0x34, 0x2a, 0xfe, 0x90, 0x97, 0x41, 0xaf, 0xb4, + 0xa, 0xa, 0x23, 0x99, 0x90, 0x6a, 0x62, 0x5c, + 0x62, 0x98, 0x5e, 0x46, 0x8b, 0x74, 0x82, 0x8d, + 0x93, 0x5f, 0x82, 0x98, 0x8f, 0x98, 0x37, 0x46, + 0x8b, 0x82, 0x5e, 0x98, 0x93, 0xa8, 0xc, 0x74, + 0xb0, 0xb4, 0x6e, 0x67, 0x31, 0x59, 0x4d, 0x3c, + 0x71, 0x99, 0x80, 0x99, 0x99, 0x54, 0x73, 0x23, + 0x99, 0x5a, 0x41, 0x6a, 0x7e, 0x8f, 0x74, 0x94, + 0x55, 0x2c, 0xe3, 0xaf, 0xb4, 0xcb, 0xd8, 0x15, + 0x15, 0x3d, 0x15, 0x48, 0x36, 0x67, 0x7f, 0x48, + 0x1d, 0x23, 0xfa, 0x34, 0x23, 0xf9, 0xfd, 0x72, + 0x93, 0x82, 0x8b, 0x7e, 0x55, 0x82, 0x8b, 0x8f, + 0x93, 0x1e, 0x9c, 0x62, 0x98, 0x5e, 0x8d, 0x62, + 0x79, 0x5e, 0x98, 0x8b, 0x46, 0x1f, 0x82, 0x93, + 0xab, 0x43, 0x8d, 0x30, 0x74, 0x79, 0x79, 0x8b, + 0x65, 0x62, 0x8f, + 0x39, 0x7f, 0x63, 0x6f, 0x99, 0x23, 0x31, 0x99, + 0x99, 0x66, 0x90, 0x99, 0x26, 0x99, 0x4a, 0x4a, + 0x40, 0x40, 0x2f, 0xa7, 0x93, 0x9c, 0x46, 0x9c, + 0xb3, 0xb3, 0x60, 0x40, 0x7f, 0x23, 0x39, 0x39, + 0xd8, 0x15, 0xeb, 0x34, 0xd8, 0xee, 0x73, 0x73, + 0xe6, 0xe6, 0x48, 0x59, 0x59, 0x31, 0x58, 0x6a, + 0x63, 0x67, 0x59, 0x71, 0x9a, 0xb4, 0x6f, 0x6b, + 0x71, 0x5d, 0x5d, 0x6b, 0x71, 0x59, 0x59, 0x71, + 0x6b, 0x6f, 0x6f, 0x6a, 0x6f, 0xb4, 0x9a, 0x6b, + 0x6b, 0x85, 0x71, 0x71, 0x71, 0x71, 0x63, 0x80, + 0x48, 0x34, 0x16, 0x16, 0x16, 0xf2, 0x73, 0x73, + 0x73, 0x3d, 0x16, 0x14, 0xff, 0x14, 0x14, 0x14, + 0x17, 0x15, 0xf2, 0x15, 0xfa, 0x15, 0xfa, 0x21, + 0x1d, 0x1a, 0x22, 0x22, 0x22, 0x17, 0x14, 0x14, + 0x16, 0xee, 0x18, 0x16, 0x21, 0x34, 0x1d, 0x4d, + 0x58, 0x6a, 0x6f, 0x6f, 0x83, 0xa1, 0xd0, 0xc9, + 0xd0, 0xd3, 0xd3, 0xd2, 0xd5, 0xd1, 0xd1, 0xd3, + 0xd5, 0xd2, 0xc4, 0xd2, 0xd2, 0xd9, 0xd2, 0xc4, + 0xd2, 0xd2, 0xdb, 0xe7, 0xe2, 0xe, 0x6c, 0x28, + 0xa7, 0x83, 0x7f, 0xd8, 0xee, 0x16, 0x16, 0x14, + 0x14, 0x16, 0xf2, 0x16, 0xf5, 0x17, 0x15, 0xf2, + 0xeb, 0xfa, 0xeb, 0xe1, 0xde, 0xf1, 0xd7, 0xe6, + 0xe6, 0xfa, 0x15, 0x16, 0x3d, 0x17, 0x17, 0x16, + 0x15, 0x21, 0x23, 0xeb, 0x15, 0x21, 0x23, 0x2a, + 0x23, 0x1a, 0x31, 0x36, 0x1c, 0x1a, 0x2e, 0x3b, + 0xf2, 0x3d, 0xf2, 0xee, 0x3d, 0x3b, 0x70, 0x48, + 0x7f, 0x9a, 0x5d, 0x6a, 0x81, 0x6b, 0x6b, 0x6b, + 0x71, 0x81, 0x81, 0x6f, 0x4d, 0x80, 0x6f, 0x9a, + 0x42, 0x31, 0x6b, 0x71, 0x6b, 0x71, 0x5d, 0x58, + 0x59, 0x85, 0x81, 0x63, 0x99, 0x9a, 0x71, 0x71, + 0x9a, 0x59, 0x59, 0x71, 0x85, 0x80, 0x80, 0x1d, + 0x3b, 0x17, 0x15, 0x3d, 0x16, 0x16, 0xf2, 0xf2, + 0x73, 0xfa, 0x39, 0xf9, 0x6e, 0xcb, 0xb4, 0xcb, + 0xa, 0xeb, 0x9, 0x63, 0x5d, 0x4a, 0x38, 0x46, + 0x8f, 0x7d, 0xa7, 0x30, 0x7e, 0xa8, 0x5e, 0x8d, + 0x62, 0x30, 0x8d, 0x98, 0x8f, 0x93, 0x30, 0x30, + 0x8b, 0xa7, 0x7, 0x5f, 0x55, 0x2f, 0xa7, 0x74, + 0x6a, 0x7f, 0x23, 0x67, 0x85, 0x99, 0x7f, 0x36, + 0x31, 0x99, 0x6e, 0x99, 0x67, 0x23, 0x23, 0x9a, + 0x4c, 0x66, 0x20, 0x5d, 0x7e, 0x9c, 0xa8, 0x3e, + 0x6a, 0xf3, 0xcc, 0xa1, 0x11, 0x1b, 0x39, 0x48, + 0x48, 0x34, 0xf2, 0x3b, 0x48, 0xa, 0xa, 0x34, + 0xf1, 0xea, 0x23, 0xf9, 0x40, 0x4a, 0x4a, 0x55, + 0x76, 0x6c, 0xa7, 0x60, 0x27, 0x76, 0x76, 0xa8, + 0x8d, 0x1f, 0x46, 0x79, 0x8d, 0x5e, 0x28, 0x46, + 0x5e, 0x68, 0x8d, 0x8d, 0x46, 0x8d, 0x5c, 0x5c, + 0xa7, 0x86, 0x32, 0x1e, 0x79, 0x5e, 0x5e, 0x79, + 0x89, 0x46, 0x79, + 0x63, 0x4d, 0x31, 0x4d, 0x54, 0x48, 0x67, 0x7f, + 0x54, 0x99, 0x71, 0x85, 0x63, 0x58, 0x58, 0x6a, + 0x6a, 0x6a, 0x55, 0x9c, 0x7e, 0xaa, 0x9c, 0x9c, + 0x83, 0x90, 0x6a, 0x6f, 0x6f, 0x67, 0x42, 0x39, + 0x34, 0x34, 0x15, 0x2b, 0x3d, 0x15, 0x15, 0x73, + 0x73, 0xfa, 0x31, 0x6b, 0x6a, 0x71, 0x5d, 0x1b, + 0x90, 0x67, 0x85, 0x5d, 0x99, 0x21, 0x9a, 0x71, + 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x71, 0x71, + 0x71, 0x85, 0x85, 0x6b, 0x9a, 0x7f, 0x80, 0x6b, + 0x6b, 0x6b, 0x71, 0x59, 0x6b, 0x71, 0x80, 0x42, + 0x3f, 0x16, 0x14, 0x16, 0x3d, 0xf2, 0x34, 0x99, + 0x7f, 0x73, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, + 0x15, 0x15, 0x15, 0x21, 0x23, 0x23, 0xfa, 0x1a, + 0x1a, 0x42, 0x48, 0x1d, 0x1d, 0x15, 0x16, 0x16, + 0x16, 0x14, 0x14, 0x16, 0xf2, 0x15, 0x23, 0x1c, + 0x31, 0x85, 0x6f, 0xb0, 0x90, 0x5a, 0xcb, 0xcb, + 0xd4, 0xd0, 0xd9, 0x5a, 0xf0, 0xcd, 0xc2, 0xd2, + 0xdb, 0xd2, 0xd2, 0xc4, 0xd2, 0xd9, 0xd9, 0xd3, + 0xc4, 0xd1, 0xd2, 0xe7, 0xf0, 0xdd, 0x8, 0x7, + 0xa0, 0xb, 0x9, 0x73, 0xeb, 0xee, 0x16, 0x14, + 0xf2, 0x16, 0xf2, 0xee, 0x16, 0xeb, 0xde, 0xd8, + 0xd7, 0xe6, 0xcb, 0xe6, 0xcb, 0xd0, 0xd9, 0xe6, + 0xde, 0x6e, 0x1, 0x14, 0xee, 0x3d, 0x3d, 0x3d, + 0x17, 0xfa, 0x15, 0x15, 0x21, 0x36, 0x1a, 0x17, + 0x21, 0x36, 0x36, 0x39, 0x1c, 0x1a, 0x21, 0x15, + 0x3d, 0x16, 0x15, 0x16, 0x3d, 0x3d, 0x15, 0x70, + 0x23, 0x67, 0x90, 0x40, 0x90, 0x58, 0x5d, 0x6a, + 0x6a, 0x6a, 0x6b, 0x6f, 0x31, 0x63, 0x6f, 0x99, + 0x48, 0x36, 0x71, 0x6f, 0x83, 0x6f, 0x58, 0x58, + 0x71, 0x6a, 0x6a, 0x6a, 0x4d, 0x63, 0x85, 0x85, + 0x7f, 0x59, 0x71, 0x58, 0x9a, 0x90, 0x97, 0x99, + 0x42, 0x3f, 0x70, 0x70, 0x3d, 0xf2, 0x16, 0x3d, + 0xf2, 0x15, 0xf1, 0xea, 0xe0, 0xd0, 0xd4, 0x3, + 0xf1, 0xfa, 0x39, 0x3a, 0x47, 0x27, 0x30, 0x76, + 0x76, 0x7, 0xf7, 0x46, 0x46, 0x76, 0x5e, 0x86, + 0x79, 0x46, 0x5e, 0x8d, 0x8d, 0x28, 0x37, 0x37, + 0x28, 0x7, 0x7, 0x6c, 0x46, 0x28, 0x6c, 0x5f, + 0x60, 0xfd, 0x54, 0x7f, 0x99, 0x54, 0x23, 0x42, + 0x67, 0x7f, 0x5a, 0x66, 0x31, 0x39, 0xf9, 0x1b, + 0x3e, 0x40, 0x1b, 0x3e, 0x2f, 0x7, 0xba, 0xf3, + 0x12, 0x28, 0xa0, 0xa0, 0xa8, 0x2c, 0x6f, 0x9a, + 0x67, 0x48, 0x3d, 0x15, 0x34, 0xeb, 0xeb, 0xeb, + 0xf1, 0xf1, 0xcb, 0xe9, 0x2c, 0xe, 0x2f, 0x5f, + 0x6c, 0x5e, 0x7, 0xf3, 0xe, 0x37, 0x5e, 0x6c, + 0x68, 0x5e, 0x5e, 0x68, 0x68, 0x4e, 0x75, 0x32, + 0x68, 0x68, 0x68, 0x5e, 0x6c, 0x5e, 0x5e, 0x68, + 0x68, 0xa3, 0xa3, 0x5e, 0x5e, 0x32, 0x86, 0x68, + 0x43, 0x43, 0x43, + 0x90, 0x99, 0x42, 0x39, 0x48, 0x1d, 0x80, 0x67, + 0x21, 0x80, 0x71, 0x6a, 0x90, 0x3a, 0x3a, 0x60, + 0x83, 0xb3, 0x5f, 0x12, 0x6a, 0xaa, 0x5f, 0x9c, + 0x7e, 0x6a, 0x94, 0x83, 0x90, 0x54, 0x2a, 0x73, + 0x34, 0x34, 0x34, 0x34, 0xf2, 0x3b, 0x34, 0xeb, + 0x34, 0xfa, 0x99, 0x97, 0x97, 0x90, 0x58, 0x71, + 0x31, 0x99, 0x6f, 0x5d, 0x26, 0x63, 0x6f, 0x6b, + 0x85, 0x58, 0x6b, 0x6b, 0x81, 0x81, 0x85, 0x6b, + 0x71, 0x81, 0x6a, 0x81, 0x71, 0x80, 0x63, 0x71, + 0x6b, 0x71, 0x6b, 0x6b, 0x6b, 0x9a, 0x7f, 0x48, + 0x3f, 0x16, 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0x70, + 0x73, 0x3d, 0x14, 0x14, 0x14, 0x14, 0x16, 0x17, + 0x2e, 0x1a, 0x1d, 0x2e, 0x36, 0x21, 0x17, 0x21, + 0xfa, 0x2a, 0x15, 0xe1, 0x15, 0xf2, 0x15, 0xf2, + 0x17, 0x14, 0x14, 0x16, 0xf2, 0x16, 0xf2, 0xfa, + 0x23, 0x54, 0x54, 0x99, 0x20, 0x1b, 0xb, 0xa1, + 0xf8, 0xf8, 0x41, 0x5a, 0xc8, 0xce, 0xc4, 0xd2, + 0xd6, 0xd9, 0xd2, 0xd2, 0xd3, 0xd9, 0xd9, 0xd3, + 0xd1, 0xc7, 0xd4, 0xd4, 0xe3, 0xdd, 0x7, 0xbd, + 0xce, 0xd0, 0xa, 0xd8, 0xeb, 0x15, 0x15, 0xf2, + 0xf2, 0x16, 0x14, 0xf2, 0xe1, 0xe1, 0xde, 0xd8, + 0xd6, 0xe0, 0xed, 0xdb, 0xd4, 0xe4, 0x50, 0x3, + 0xcb, 0xf4, 0xd8, 0xee, 0xee, 0x14, 0x14, 0xee, + 0xe1, 0xfa, 0x1d, 0x21, 0x1c, 0x36, 0x1c, 0x21, + 0x3b, 0x1d, 0x21, 0x15, 0xfa, 0x21, 0x34, 0xf2, + 0xf2, 0x15, 0xf2, 0x3d, 0x3d, 0x3f, 0x70, 0xfa, + 0x73, 0x26, 0x66, 0xf9, 0x7f, 0x3a, 0x6a, 0x83, + 0x3e, 0x6a, 0x6a, 0x4a, 0x9d, 0xb0, 0x6f, 0x9a, + 0x7f, 0x80, 0x5d, 0x6a, 0x58, 0x5d, 0x91, 0x6a, + 0x83, 0x6a, 0x7e, 0x6a, 0x6a, 0x85, 0x5d, 0x58, + 0x67, 0x80, 0x71, 0x6a, 0x99, 0x63, 0x6a, 0x5d, + 0x9a, 0x80, 0x99, 0x2a, 0xeb, 0xf2, 0xee, 0x16, + 0x16, 0xe1, 0xd8, 0x26, 0xe0, 0xe5, 0xe3, 0xbf, + 0xa, 0xa, 0xcb, 0xfd, 0x11, 0xf8, 0xb7, 0x28, + 0x6c, 0x28, 0x6c, 0x5e, 0x5e, 0x5e, 0x9f, 0x68, + 0x32, 0x9f, 0x7, 0x7, 0x28, 0x6c, 0xdd, 0x37, + 0x5e, 0x6c, 0x28, 0x5e, 0x82, 0x28, 0x7, 0xf3, + 0xa1, 0xb4, 0xea, 0x23, 0x36, 0x42, 0x7f, 0x9a, + 0x67, 0x6e, 0x26, 0x59, 0x99, 0xa, 0xf1, 0xed, + 0x11, 0x50, 0xc5, 0xc8, 0xe, 0xf3, 0xe, 0x1f, + 0x82, 0x28, 0xa7, 0x5f, 0x5f, 0xaa, 0xb0, 0x6e, + 0x54, 0x34, 0x3b, 0x70, 0x48, 0x23, 0x23, 0xfa, + 0x23, 0xea, 0x23, 0x20, 0xf8, 0xa7, 0x8, 0xb7, + 0xf7, 0xfc, 0xe, 0x2f, 0x76, 0x28, 0x37, 0x37, + 0x28, 0x68, 0x68, 0x68, 0xfc, 0x68, 0x75, 0x82, + 0x68, 0x68, 0x5e, 0x8d, 0x5e, 0x5e, 0x68, 0x75, + 0xfc, 0x32, 0x32, 0x75, 0x43, 0x28, 0xfc, 0x43, + 0x9c, 0x46, 0x46, + 0x3, 0x3, 0xb, 0x20, 0x41, 0x85, 0x6a, 0x4a, + 0x59, 0x4d, 0x4a, 0xa6, 0xb, 0x5a, 0x50, 0x2f, + 0xa0, 0xf3, 0x37, 0x82, 0x5f, 0x82, 0x28, 0x1e, + 0x5f, 0xa6, 0xbf, 0xb4, 0xd8, 0xeb, 0xde, 0xe1, + 0x15, 0xeb, 0xa, 0x15, 0x15, 0x21, 0x39, 0x48, + 0x2b, 0x54, 0x7f, 0x7f, 0x7f, 0x90, 0x83, 0x5d, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x71, 0x6f, 0x6f, + 0x6f, 0x6b, 0x91, 0x6a, 0x6a, 0x6a, 0x5d, 0x5d, + 0x5d, 0x6a, 0x6a, 0x6a, 0x6a, 0x5d, 0x71, 0x6b, + 0x81, 0x85, 0x83, 0x71, 0x85, 0x90, 0x90, 0x59, + 0x70, 0x16, 0x16, 0x3f, 0x70, 0x73, 0x70, 0x73, + 0x1, 0x16, 0xff, 0x14, 0x14, 0x14, 0x14, 0x22, + 0x1a, 0x1a, 0x1d, 0x21, 0x1d, 0x21, 0xeb, 0x15, + 0x15, 0x16, 0x16, 0x15, 0xf2, 0xf2, 0x3d, 0x15, + 0x17, 0x16, 0x14, 0x16, 0x16, 0x16, 0xf2, 0xee, + 0x15, 0xeb, 0x34, 0x39, 0x6f, 0x6a, 0x6f, 0x60, + 0x87, 0xc, 0xbf, 0xbf, 0xd2, 0xc4, 0xd9, 0xd3, + 0xd2, 0xd3, 0xd6, 0xd6, 0xd2, 0xd1, 0xd2, 0xd3, + 0xd9, 0xd2, 0xd2, 0xc4, 0xc7, 0xcd, 0xf7, 0xdd, + 0xcd, 0xe3, 0xe6, 0xde, 0xeb, 0xf2, 0xf2, 0xeb, + 0xe1, 0xee, 0x16, 0xeb, 0xeb, 0xeb, 0xfa, 0xf1, + 0xd0, 0xcc, 0xf8, 0xd5, 0xdb, 0xd1, 0xc7, 0xc4, + 0xd2, 0xd3, 0xe0, 0xd8, 0xe1, 0xe1, 0xf2, 0xf2, + 0xf2, 0xe1, 0xf2, 0xf2, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x23, 0x1d, 0x1d, 0x1a, 0x36, 0x21, 0x17, + 0x3d, 0x16, 0x16, 0x15, 0xf2, 0x2b, 0x15, 0xeb, + 0x48, 0x41, 0x3a, 0x36, 0x36, 0x71, 0x5d, 0x99, + 0x67, 0x67, 0x99, 0x7f, 0x99, 0x67, 0x20, 0x59, + 0x71, 0x71, 0x81, 0x5d, 0x58, 0x6b, 0x5d, 0x99, + 0x85, 0x3a, 0x58, 0x6f, 0x90, 0x63, 0x58, 0x31, + 0x59, 0x71, 0x81, 0x6b, 0x59, 0x63, 0x71, 0x85, + 0x48, 0x73, 0xf1, 0x1, 0x15, 0xf2, 0xf2, 0xf2, + 0x15, 0xeb, 0x6e, 0x99, 0x6e, 0xea, 0xe0, 0xcb, + 0x1, 0x15, 0xfa, 0x6e, 0x99, 0x60, 0x5f, 0x76, + 0x27, 0x30, 0x28, 0x93, 0x8f, 0x98, 0xf8, 0x9c, + 0x62, 0x76, 0xa0, 0xe, 0x27, 0x8d, 0x28, 0x98, + 0x62, 0x38, 0x46, 0x7d, 0x8f, 0xa8, 0xcc, 0x3, + 0xcb, 0xe6, 0xea, 0x39, 0x36, 0x4d, 0x58, 0x6f, + 0x9a, 0x42, 0x48, 0x54, 0xeb, 0x73, 0x2a, 0x54, + 0x41, 0x40, 0x29, 0x55, 0x7e, 0x27, 0x30, 0x94, + 0x74, 0x76, 0x60, 0x83, 0x90, 0x6a, 0x90, 0x6e, + 0x48, 0x34, 0x2a, 0x99, 0xfe, 0x36, 0x36, 0x7f, + 0x41, 0x41, 0x41, 0x5a, 0x3e, 0x82, 0x5c, 0x74, + 0x74, 0x30, 0x62, 0x8f, 0x8b, 0x76, 0x30, 0x7e, + 0x9c, 0x68, 0x93, 0x62, 0x30, 0x8d, 0x8d, 0x8b, + 0x8d, 0x5e, 0x46, 0x8f, 0x93, 0x8d, 0x8d, 0x8b, + 0x62, 0x2f, 0x5e, 0x98, 0x8f, 0x46, 0x46, 0x8f, + 0x8f, 0x8f, 0x8e, + 0xf9, 0x41, 0x4a, 0xaf, 0x99, 0x39, 0x20, 0x6f, + 0x90, 0x99, 0xfd, 0x1b, 0x1b, 0x40, 0x2c, 0x37, + 0x12, 0xe, 0x28, 0x28, 0x82, 0x5f, 0x2c, 0x5f, + 0xaa, 0xaf, 0xb4, 0xa, 0x34, 0xf2, 0xee, 0xf2, + 0x3d, 0x15, 0xf2, 0xfa, 0xf2, 0x15, 0xfa, 0x2a, + 0x34, 0x7f, 0x99, 0x4d, 0x4d, 0x3c, 0x6f, 0x6b, + 0x90, 0x3a, 0x1b, 0x5d, 0x83, 0x90, 0x41, 0x59, + 0x58, 0x6b, 0x6b, 0x6b, 0x71, 0x58, 0x71, 0x85, + 0x99, 0x41, 0x3a, 0x5d, 0x85, 0x83, 0x90, 0x81, + 0x6f, 0x6b, 0x6b, 0x71, 0x71, 0x63, 0x4d, 0x67, + 0x48, 0x3d, 0x14, 0x16, 0xeb, 0x34, 0x73, 0x73, + 0xf2, 0x16, 0x14, 0x14, 0x14, 0x14, 0x14, 0x17, + 0x17, 0x2b, 0x3b, 0x15, 0x15, 0xfa, 0xf2, 0xeb, + 0x17, 0x15, 0x16, 0x3d, 0x16, 0x14, 0x16, 0x3b, + 0x16, 0x14, 0x14, 0x14, 0x14, 0x16, 0xf2, 0xeb, + 0x34, 0x15, 0x15, 0x48, 0x67, 0x99, 0x90, 0x41, + 0xaf, 0x40, 0xaf, 0xb4, 0xe5, 0xfd, 0x26, 0xd0, + 0xc4, 0xc4, 0xd6, 0xd6, 0xd9, 0xc4, 0xc4, 0xd2, + 0xd3, 0xd9, 0xd2, 0xd1, 0xce, 0xdd, 0xf7, 0x7, + 0xb7, 0xbf, 0xa, 0xeb, 0xeb, 0xf2, 0xf2, 0xee, + 0xf2, 0xee, 0x14, 0xf5, 0xd8, 0x23, 0x23, 0xf9, + 0xd0, 0xc7, 0xce, 0xd2, 0xd9, 0xdb, 0xd1, 0xc4, + 0xc4, 0xdb, 0xed, 0xed, 0xd6, 0xcb, 0xd8, 0xf2, + 0xeb, 0xf2, 0xee, 0x16, 0xee, 0x16, 0x17, 0x15, + 0x17, 0x23, 0x1a, 0x1a, 0x1a, 0x36, 0x1c, 0x17, + 0x16, 0x14, 0x14, 0x15, 0x3d, 0xee, 0x17, 0x15, + 0x48, 0x80, 0x58, 0x31, 0x59, 0x59, 0x71, 0x71, + 0x4d, 0x23, 0x48, 0x48, 0x7f, 0x63, 0x58, 0x63, + 0x71, 0x6b, 0x81, 0x81, 0x6b, 0x71, 0x71, 0x6b, + 0x59, 0x71, 0x71, 0x5d, 0x9a, 0x71, 0x71, 0x59, + 0x71, 0x6b, 0x81, 0x81, 0x71, 0x85, 0x85, 0x71, + 0x80, 0x1d, 0x48, 0x15, 0x16, 0x16, 0x16, 0xee, + 0x15, 0x15, 0xa, 0x5a, 0x3, 0xcb, 0xcb, 0xcb, + 0xeb, 0xeb, 0x15, 0xfa, 0x54, 0x6a, 0x5f, 0x82, + 0x62, 0x46, 0x7, 0xa7, 0x8f, 0x7d, 0xe, 0x93, + 0x8b, 0x98, 0x28, 0x8d, 0x8b, 0x8d, 0x5e, 0x76, + 0x93, 0x46, 0xa7, 0x9c, 0x74, 0xa7, 0xc8, 0xa1, + 0x99, 0x8a, 0x39, 0x39, 0x54, 0x42, 0x99, 0x99, + 0x99, 0x7f, 0x48, 0x34, 0xfa, 0x21, 0x42, 0x3a, + 0x58, 0x60, 0x5f, 0x5f, 0x46, 0x82, 0x76, 0xa8, + 0xa8, 0xa7, 0x55, 0x83, 0x6a, 0x81, 0x6f, 0x99, + 0x70, 0x34, 0x34, 0x2a, 0x6e, 0xfd, 0x41, 0xbf, + 0xbf, 0xc8, 0x55, 0x55, 0x5f, 0x32, 0x82, 0x46, + 0x79, 0x8d, 0x82, 0x76, 0xa7, 0x28, 0x76, 0xa7, + 0xa0, 0x6c, 0x5e, 0x8d, 0x68, 0x86, 0x5e, 0x79, + 0x68, 0x9e, 0x8d, 0x76, 0x7, 0x28, 0x28, 0x82, + 0x43, 0x6c, 0x5e, 0x43, 0x75, 0x75, 0x75, 0x79, + 0x89, 0x5f, 0xa9, + 0x20, 0x63, 0x83, 0x99, 0x2a, 0x23, 0x7f, 0x99, + 0x6e, 0x6e, 0x26, 0x3a, 0x5d, 0x6a, 0x55, 0x37, + 0x55, 0x55, 0xa7, 0x76, 0x94, 0x83, 0x40, 0x60, + 0x6a, 0xaf, 0x6e, 0x54, 0x21, 0x34, 0x34, 0x2b, + 0x3b, 0x34, 0x15, 0x21, 0x15, 0x3d, 0x15, 0x15, + 0x34, 0x67, 0x63, 0x5d, 0x31, 0x71, 0x71, 0x71, + 0x63, 0x63, 0x99, 0x63, 0x99, 0x99, 0x63, 0x3a, + 0x58, 0x71, 0x6b, 0x6b, 0x71, 0x59, 0x58, 0x71, + 0x42, 0x42, 0x59, 0x59, 0x9a, 0x85, 0x9a, 0x85, + 0x85, 0x6b, 0x6b, 0x71, 0x71, 0x59, 0x36, 0x7f, + 0x70, 0x3d, 0x3d, 0x16, 0xf2, 0xf2, 0x73, 0x73, + 0x15, 0x16, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, + 0x3d, 0x15, 0x17, 0x15, 0xf5, 0x15, 0x3b, 0x17, + 0x34, 0x21, 0x15, 0x3d, 0x16, 0x16, 0xf2, 0xf2, + 0xf2, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, 0xf2, + 0xf2, 0xee, 0x15, 0x34, 0x2a, 0x48, 0x36, 0x67, + 0x58, 0x6a, 0x4a, 0x83, 0x50, 0x1b, 0x41, 0xcb, + 0xd3, 0xd3, 0xd3, 0xd6, 0xd6, 0xd3, 0xd2, 0xd3, + 0xd3, 0xd9, 0xe7, 0xe2, 0xce, 0xdd, 0xb8, 0xb7, + 0xc2, 0xbf, 0xd8, 0xde, 0xeb, 0xde, 0xee, 0xf2, + 0xf2, 0xf2, 0x14, 0x3d, 0xeb, 0xe6, 0x23, 0xc9, + 0xd3, 0xd2, 0xc2, 0xc4, 0xd2, 0xd0, 0xd5, 0xe2, + 0xd1, 0xd1, 0xec, 0xe7, 0xd2, 0xd3, 0xd6, 0xe6, + 0xe6, 0xde, 0xe1, 0x14, 0xf2, 0xee, 0x16, 0xee, + 0x15, 0x21, 0xfa, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x15, 0x3d, 0x16, 0xf5, 0x15, 0x3d, 0x3b, 0x3d, + 0x34, 0x7f, 0x99, 0x7f, 0x31, 0x67, 0x63, 0x5d, + 0x90, 0x99, 0x9a, 0x36, 0x59, 0x71, 0x71, 0x80, + 0x71, 0x71, 0x58, 0x5d, 0x81, 0x83, 0x5d, 0x95, + 0x81, 0x81, 0x91, 0x6a, 0x6f, 0x6b, 0x6a, 0x80, + 0x59, 0x6b, 0x5d, 0x83, 0x81, 0x90, 0x85, 0x71, + 0x85, 0x85, 0x6e, 0x34, 0x3d, 0x14, 0x16, 0x14, + 0xf2, 0xde, 0xd8, 0xd7, 0x5a, 0xd4, 0xd2, 0xe0, + 0x23, 0x23, 0xfa, 0x23, 0x26, 0x4a, 0xc, 0x7, + 0x76, 0x6c, 0xb8, 0xf3, 0x76, 0x5e, 0x86, 0x5e, + 0x5e, 0x28, 0x68, 0x68, 0x68, 0x68, 0x7, 0xb8, + 0x37, 0x5e, 0x8, 0x6c, 0x5f, 0xa7, 0x28, 0x2c, + 0x50, 0x20, 0x39, 0x54, 0xfa, 0x54, 0xa, 0x73, + 0x73, 0x73, 0x6e, 0xd8, 0x34, 0x1c, 0x58, 0x52, + 0x5f, 0x5f, 0xe, 0xa0, 0x7, 0x9f, 0x7, 0xb8, + 0xc, 0xe, 0x9c, 0x91, 0x6a, 0x56, 0x3a, 0x99, + 0x54, 0x34, 0x15, 0xfa, 0x2a, 0x5a, 0x11, 0xe4, + 0xdd, 0xe, 0x37, 0x28, 0x5e, 0x68, 0x28, 0x28, + 0x6c, 0x9f, 0x5e, 0xa0, 0xb7, 0x6c, 0x5e, 0x6c, + 0xfc, 0xfc, 0x5e, 0x5e, 0x86, 0x68, 0x68, 0x68, + 0x6c, 0x32, 0x9e, 0x6c, 0xa0, 0xe, 0xa0, 0x5e, + 0x86, 0x68, 0x32, 0x28, 0x32, 0x68, 0x68, 0x5e, + 0xe, 0xc8, 0xb7, + 0x11, 0xb4, 0x41, 0x97, 0x99, 0x54, 0x54, 0x34, + 0x48, 0x31, 0xfe, 0x67, 0x5d, 0x7e, 0xa7, 0x37, + 0x7d, 0x74, 0xb7, 0xa8, 0x74, 0x60, 0x60, 0xaa, + 0x7e, 0x6f, 0x5a, 0xa, 0x15, 0xeb, 0xeb, 0x73, + 0x73, 0x73, 0x73, 0x73, 0x2b, 0x21, 0x3f, 0x34, + 0x1d, 0x31, 0x5d, 0x6b, 0x6b, 0x71, 0x97, 0x71, + 0x71, 0x85, 0x58, 0x85, 0x31, 0x6b, 0x6a, 0x9a, + 0x80, 0x71, 0x6b, 0x6b, 0x6b, 0x81, 0x99, 0x80, + 0x4d, 0x71, 0x81, 0x6b, 0x71, 0x59, 0x6b, 0x85, + 0x80, 0x85, 0x6f, 0x71, 0x71, 0x6f, 0x80, 0x70, + 0x3f, 0x3b, 0x17, 0x3f, 0x2b, 0x3b, 0x73, 0x1, + 0x3d, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x3d, + 0x22, 0x2e, 0x21, 0x22, 0xf2, 0x3d, 0x16, 0x16, + 0xf2, 0xee, 0x14, 0xee, 0xf2, 0x14, 0xf2, 0xeb, + 0xf2, 0x14, 0x14, 0x16, 0x14, 0x14, 0x16, 0x16, + 0xee, 0xf2, 0x15, 0xee, 0x15, 0x23, 0x36, 0x31, + 0x6a, 0x2c, 0x3e, 0x40, 0xba, 0xbf, 0xd3, 0xd3, + 0xd3, 0xc4, 0xd3, 0xd3, 0xd3, 0xd3, 0xd9, 0xd2, + 0xd2, 0xd2, 0xe7, 0xe7, 0xc2, 0xbd, 0xb8, 0xbd, + 0xc7, 0xd2, 0xd3, 0xcb, 0xe0, 0xde, 0xee, 0xee, + 0xee, 0xee, 0x16, 0xf2, 0xde, 0xde, 0xe6, 0xd3, + 0xdb, 0xdb, 0xe2, 0xe2, 0xc7, 0xc2, 0xe2, 0xec, + 0xc7, 0xc2, 0xbe, 0xd2, 0xd2, 0xd3, 0xd9, 0xd6, + 0xd6, 0xde, 0xde, 0x15, 0x15, 0xee, 0xee, 0x15, + 0x15, 0xeb, 0x15, 0xeb, 0xeb, 0xe6, 0xeb, 0xde, + 0xde, 0xeb, 0x16, 0x16, 0x17, 0x3b, 0x15, 0x3b, + 0x22, 0x70, 0x2a, 0x26, 0x3a, 0x39, 0x39, 0x41, + 0x5d, 0x6a, 0x1b, 0x58, 0x58, 0x71, 0x71, 0x6b, + 0x81, 0x31, 0x99, 0x97, 0x6a, 0x6a, 0x6a, 0x83, + 0x6a, 0x6a, 0x91, 0x27, 0x5d, 0x5d, 0x83, 0x58, + 0x71, 0x9a, 0x90, 0x99, 0x83, 0x47, 0x6a, 0x40, + 0x58, 0x90, 0x99, 0x2a, 0x3b, 0x17, 0x16, 0x16, + 0xf2, 0xf2, 0xde, 0xd8, 0xf4, 0x11, 0xbf, 0xd0, + 0xc9, 0x23, 0xea, 0x5a, 0x90, 0x1b, 0x11, 0xb7, + 0x37, 0x5e, 0xfc, 0xe, 0x38, 0x5e, 0xa3, 0x5e, + 0x28, 0x12, 0xfc, 0xb8, 0x9f, 0x28, 0xf7, 0x12, + 0xa7, 0x76, 0x6c, 0x28, 0x30, 0x37, 0x6c, 0xb9, + 0x50, 0xb, 0xcb, 0xa, 0x54, 0x26, 0x39, 0xfa, + 0x34, 0x73, 0xa, 0xeb, 0x3f, 0x23, 0x20, 0x50, + 0xb3, 0xa0, 0xe, 0xf8, 0xa8, 0x28, 0x6c, 0x5f, + 0x27, 0x74, 0x8f, 0x6a, 0x66, 0x6e, 0x39, 0x6e, + 0x73, 0xea, 0x2a, 0xfe, 0x26, 0x4a, 0x27, 0x89, + 0x30, 0xe, 0x76, 0x76, 0x37, 0x9f, 0x1f, 0x46, + 0xa0, 0x6c, 0x5e, 0x46, 0x30, 0x46, 0x5e, 0x8d, + 0x5e, 0x37, 0x28, 0x8d, 0x5e, 0x5e, 0x28, 0x1e, + 0x28, 0x9f, 0x5e, 0x8d, 0x46, 0x1f, 0x5c, 0x5c, + 0x8d, 0x68, 0x32, 0x32, 0x43, 0x32, 0x7, 0x76, + 0x46, 0x27, 0xe, + 0xbe, 0xbf, 0xd4, 0xb, 0x5d, 0x6f, 0x90, 0x42, + 0x36, 0x31, 0xe5, 0x5a, 0x4a, 0xf8, 0xba, 0x6c, + 0x9f, 0x6c, 0xf7, 0xe, 0xe, 0x76, 0x28, 0x1e, + 0x3e, 0xb, 0xc9, 0xde, 0xf2, 0x16, 0xe1, 0xde, + 0xcb, 0xfd, 0xcb, 0xfa, 0x23, 0x31, 0x7f, 0x39, + 0x42, 0x4c, 0x90, 0x83, 0x71, 0x5d, 0x90, 0xfd, + 0x9a, 0x6a, 0x6a, 0x6a, 0x58, 0x58, 0x6a, 0x6f, + 0x63, 0x58, 0x20, 0x90, 0x90, 0x5b, 0x66, 0xf1, + 0x99, 0x5d, 0x7e, 0x6a, 0x6a, 0x6a, 0x5d, 0x85, + 0x63, 0x85, 0x5d, 0x85, 0x6a, 0x6b, 0x58, 0x7f, + 0x22, 0x3b, 0x1d, 0x7f, 0x99, 0x73, 0xeb, 0xf2, + 0xee, 0x16, 0x14, 0x18, 0x14, 0x16, 0x16, 0x15, + 0x15, 0x1d, 0x21, 0x17, 0x16, 0x16, 0x17, 0xf2, + 0xf2, 0xeb, 0xf2, 0xe1, 0xf2, 0xee, 0xe1, 0xd8, + 0xe1, 0xf2, 0xf5, 0xf5, 0x14, 0x3d, 0xf2, 0x16, + 0x16, 0xee, 0x15, 0xeb, 0xee, 0xf2, 0x48, 0x26, + 0xaf, 0xb, 0xfd, 0x26, 0xd3, 0xd3, 0xb4, 0xe0, + 0xd6, 0xd9, 0xdb, 0xd2, 0xd2, 0xd9, 0xd9, 0xd3, + 0xc4, 0xc4, 0xd2, 0xd6, 0xdb, 0xc2, 0xcd, 0xf3, + 0xe3, 0xed, 0x56, 0xe3, 0xd3, 0xde, 0xe1, 0xeb, + 0xe1, 0xee, 0xee, 0xeb, 0xde, 0xeb, 0xf9, 0x40, + 0xe4, 0xf0, 0xf8, 0xdd, 0xc1, 0xc2, 0xd1, 0xd2, + 0xd2, 0xc4, 0xc2, 0xd1, 0xdb, 0xed, 0xf4, 0xe9, + 0xc4, 0xd6, 0xe1, 0xe1, 0xe1, 0xee, 0x16, 0xf2, + 0xeb, 0xeb, 0x34, 0x39, 0xf9, 0xf9, 0x15, 0x21, + 0xfa, 0xf5, 0x14, 0x14, 0x16, 0xf2, 0xf2, 0x48, + 0x42, 0x1d, 0x67, 0x58, 0x58, 0x31, 0x36, 0x36, + 0x58, 0x63, 0x80, 0x71, 0x81, 0x81, 0x6f, 0x71, + 0x6b, 0x71, 0x58, 0x59, 0x71, 0x6b, 0x99, 0x99, + 0x6f, 0x6b, 0x90, 0x85, 0x71, 0x71, 0x90, 0x6f, + 0x6b, 0x71, 0x81, 0x58, 0x71, 0x6b, 0x99, 0x7f, + 0x59, 0x99, 0x6e, 0x73, 0x34, 0x16, 0x16, 0xf2, + 0x3b, 0x21, 0xeb, 0x15, 0x48, 0x97, 0x99, 0x73, + 0xeb, 0xeb, 0xd8, 0xa, 0x58, 0x6a, 0x30, 0x62, + 0x94, 0x98, 0x8d, 0x1f, 0x8f, 0x98, 0x37, 0xa8, + 0x74, 0x62, 0x76, 0x2f, 0x8f, 0x98, 0x1f, 0x8f, + 0x8f, 0x93, 0x82, 0x7d, 0x9c, 0x76, 0xa7, 0xa1, + 0xb4, 0x41, 0x99, 0x54, 0x7f, 0x59, 0x59, 0x36, + 0x1d, 0x1d, 0x70, 0x15, 0xeb, 0xfa, 0x54, 0x54, + 0x97, 0x55, 0x82, 0x8f, 0x8f, 0x46, 0x93, 0x7e, + 0x91, 0x91, 0x6f, 0x90, 0x54, 0x54, 0xea, 0xfa, + 0xa, 0xf9, 0x4a, 0x6b, 0x91, 0x55, 0x8f, 0x62, + 0x74, 0x9c, 0x93, 0x74, 0xaa, 0xa0, 0x93, 0x8f, + 0x93, 0x82, 0x8b, 0x8f, 0x8f, 0x82, 0x93, 0x8f, + 0x7d, 0x6c, 0x98, 0x8b, 0x76, 0x37, 0x98, 0x8b, + 0x8d, 0x5e, 0x8d, 0x98, 0x82, 0x76, 0x76, 0x8b, + 0x62, 0x8d, 0x6c, 0x98, 0x8b, 0x76, 0x1e, 0x7d, + 0x98, 0x82, 0x43, + 0xe, 0x11, 0x41, 0xfd, 0x90, 0x6f, 0x80, 0x26, + 0x1c, 0x26, 0x5a, 0xa1, 0x60, 0x6a, 0x27, 0x5f, + 0x84, 0x93, 0x28, 0x30, 0x55, 0x8f, 0xa7, 0xf3, + 0x83, 0x26, 0x2a, 0x3d, 0x17, 0x15, 0x3d, 0x17, + 0x73, 0x6e, 0xf1, 0x15, 0x34, 0x54, 0x3, 0x6e, + 0x9a, 0x31, 0x4d, 0x9a, 0x6b, 0x6b, 0x58, 0x4d, + 0x59, 0x85, 0x90, 0x9a, 0x59, 0x71, 0x6f, 0x90, + 0x9a, 0x6b, 0x58, 0x71, 0x6b, 0x5d, 0x63, 0x42, + 0x48, 0x63, 0x6a, 0x6a, 0x6b, 0x6f, 0x71, 0x85, + 0x6b, 0x6b, 0x81, 0x71, 0x71, 0x6b, 0x71, 0x7f, + 0x3b, 0x16, 0x3b, 0x70, 0x73, 0x73, 0x1, 0x34, + 0xf2, 0x3d, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0xf2, 0xf2, 0xee, 0x14, 0xf2, 0x2b, 0x15, + 0xf2, 0xde, 0x23, 0xeb, 0xeb, 0xeb, 0xf5, 0xeb, + 0xeb, 0xf2, 0xee, 0x16, 0xf5, 0xf2, 0xf2, 0x15, + 0x16, 0x15, 0x1d, 0x17, 0xee, 0x16, 0x15, 0xeb, + 0xeb, 0xa, 0x6e, 0x7f, 0xcb, 0xcb, 0x7f, 0x3, + 0xd7, 0xe0, 0xe0, 0xd0, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd2, 0xd2, 0xd2, 0xdb, 0xdb, 0xcf, 0xe4, 0x11, + 0x83, 0x6f, 0x83, 0x40, 0xe0, 0xde, 0x15, 0xe1, + 0xf2, 0xf2, 0xf2, 0xeb, 0xe6, 0xfa, 0xfd, 0x11, + 0xf7, 0xcd, 0xbd, 0xb8, 0xc1, 0xc2, 0xd1, 0xc2, + 0xce, 0xc4, 0xd1, 0xce, 0xce, 0xd1, 0xd5, 0xe2, + 0xd2, 0xd6, 0xde, 0xe1, 0x14, 0x14, 0xee, 0xf5, + 0xfa, 0xeb, 0x23, 0xfe, 0xfe, 0xf9, 0xf9, 0xf1, + 0xfa, 0xf2, 0x16, 0x18, 0x3d, 0x16, 0x3d, 0x48, + 0x80, 0x80, 0x80, 0x6f, 0x59, 0x71, 0x59, 0x58, + 0x71, 0x31, 0x9a, 0x85, 0x81, 0x5d, 0x6f, 0x58, + 0x6b, 0x6b, 0x71, 0x58, 0x71, 0x58, 0x71, 0x63, + 0x71, 0x71, 0x67, 0x58, 0x6b, 0x85, 0x9a, 0x58, + 0x6b, 0x6b, 0x71, 0x6b, 0x59, 0x71, 0x9a, 0x80, + 0x71, 0x9a, 0x54, 0x70, 0x3d, 0x16, 0x14, 0x16, + 0x3f, 0x23, 0xcb, 0xa, 0xf9, 0x23, 0xa, 0x1, + 0x34, 0xf2, 0x15, 0x3f, 0x99, 0x7e, 0x5f, 0x7d, + 0x55, 0x30, 0x82, 0xa7, 0x74, 0x93, 0xe, 0x55, + 0x74, 0x98, 0x8d, 0x30, 0x62, 0x46, 0x8d, 0x76, + 0x8f, 0x12, 0x1f, 0xa8, 0xb3, 0xa7, 0xa7, 0x3e, + 0x6f, 0x6a, 0x90, 0x73, 0x2a, 0x42, 0x80, 0x99, + 0x73, 0x2b, 0x34, 0x15, 0x3b, 0x7f, 0x4d, 0xfe, + 0x3a, 0x9c, 0x76, 0x93, 0x93, 0x2f, 0x46, 0x94, + 0x83, 0xb0, 0x83, 0x7f, 0x6e, 0x4, 0x66, 0x26, + 0x39, 0x41, 0x55, 0x74, 0x74, 0x2f, 0x12, 0x74, + 0xa9, 0xdd, 0xa7, 0x62, 0x30, 0x28, 0x5e, 0x8d, + 0x30, 0x12, 0x46, 0x8b, 0x8b, 0x7, 0xe, 0x1f, + 0x6c, 0x7, 0x8d, 0x8d, 0x37, 0x5e, 0x8d, 0x8d, + 0x5e, 0xfc, 0x1f, 0x79, 0x7, 0xb8, 0xb8, 0xf3, + 0x30, 0x1f, 0x5e, 0x68, 0x79, 0x1e, 0x1f, 0x79, + 0x75, 0x86, 0x86, + 0x74, 0x94, 0x97, 0x99, 0x90, 0x99, 0x54, 0x2a, + 0x54, 0x26, 0x5a, 0xa1, 0x91, 0x7e, 0x8f, 0x7d, + 0x62, 0x62, 0x82, 0x93, 0x62, 0x74, 0xb3, 0x50, + 0x72, 0x99, 0x2a, 0x34, 0x21, 0x21, 0x70, 0x34, + 0x48, 0x48, 0xf2, 0x16, 0x16, 0x3d, 0x34, 0x54, + 0x63, 0x58, 0x71, 0x71, 0x71, 0x71, 0x6b, 0x71, + 0x59, 0x58, 0x67, 0x48, 0x9a, 0x71, 0x80, 0x7f, + 0x9a, 0x6b, 0x6b, 0x81, 0x6b, 0x6b, 0x71, 0x80, + 0x67, 0x71, 0x56, 0x99, 0x85, 0x71, 0x71, 0x85, + 0x6f, 0x6a, 0x81, 0x81, 0x6b, 0x6b, 0x59, 0x7f, + 0x70, 0x3d, 0xff, 0xee, 0xee, 0x34, 0xeb, 0xeb, + 0xf2, 0x17, 0x17, 0x16, 0x15, 0x18, 0x14, 0xff, + 0x14, 0x16, 0x16, 0x16, 0x16, 0xf2, 0xfa, 0xa, + 0xde, 0x23, 0xed, 0xa, 0xe6, 0xd8, 0xe6, 0xeb, + 0xde, 0xeb, 0xeb, 0xeb, 0xf2, 0xf2, 0x17, 0x15, + 0xf2, 0x15, 0x22, 0x15, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x15, 0x7f, 0x99, 0x54, 0x54, 0xf9, 0x99, + 0xd3, 0xd3, 0xe0, 0xd6, 0xd3, 0xd2, 0xd2, 0xd2, + 0xd3, 0xdb, 0xd1, 0xce, 0xc7, 0xe7, 0xec, 0x1b, + 0x50, 0xb4, 0xb0, 0xaf, 0xd0, 0xcb, 0xd8, 0xd8, + 0xeb, 0xeb, 0xeb, 0xeb, 0xe6, 0xf1, 0xf9, 0x11, + 0xcd, 0xc1, 0xc1, 0xc1, 0xc1, 0xd1, 0xc2, 0xcd, + 0xc1, 0xd5, 0xe7, 0xf3, 0xce, 0xc2, 0xd2, 0xdb, + 0xed, 0xd0, 0xd6, 0xd7, 0xde, 0xe1, 0xf2, 0x34, + 0x6e, 0xeb, 0xfa, 0xf9, 0xed, 0xd0, 0xd9, 0xd6, + 0xfa, 0xf2, 0x16, 0x3d, 0x16, 0x16, 0x3d, 0x34, + 0x80, 0x70, 0x23, 0xfe, 0x3a, 0x71, 0x9a, 0x90, + 0x4a, 0x31, 0x4a, 0x6a, 0x81, 0x71, 0x4d, 0x58, + 0x6b, 0x85, 0x80, 0x67, 0x31, 0x31, 0x9d, 0x97, + 0x5d, 0x58, 0x31, 0x71, 0x81, 0x71, 0x80, 0x31, + 0x71, 0x71, 0x9a, 0x90, 0x3c, 0x58, 0x90, 0x5d, + 0x6b, 0x90, 0x42, 0x70, 0x3d, 0x16, 0xff, 0x14, + 0x15, 0xf1, 0xcb, 0xd6, 0xc0, 0xf9, 0xf1, 0xe6, + 0xa, 0x34, 0x22, 0x34, 0x20, 0x60, 0xa7, 0xf7, + 0x27, 0x30, 0x28, 0x7, 0xa7, 0x46, 0x1f, 0x5c, + 0x82, 0x68, 0x68, 0x1e, 0x30, 0x82, 0x68, 0x9f, + 0xb7, 0x12, 0x30, 0x37, 0xa7, 0x1e, 0x43, 0x55, + 0x6a, 0x6a, 0xb0, 0x6e, 0x2b, 0x23, 0x54, 0x73, + 0x2b, 0xfa, 0xfa, 0x34, 0x54, 0x41, 0x40, 0x4a, + 0x4a, 0xe, 0x6c, 0x6c, 0x28, 0xe, 0xa7, 0xaa, + 0x50, 0x50, 0x1b, 0xfd, 0xfd, 0xb, 0x10, 0x11, + 0x41, 0x90, 0x29, 0xa7, 0xb8, 0xba, 0x2f, 0x37, + 0x6c, 0x8, 0x5e, 0x43, 0x1f, 0x5e, 0x5e, 0x9f, + 0x28, 0x1f, 0x82, 0x82, 0xa7, 0xb7, 0xfc, 0x82, + 0x5e, 0x68, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x8d, + 0x5e, 0x6c, 0x37, 0x5e, 0x9f, 0xb8, 0xb8, 0x8, + 0x1f, 0x43, 0x68, 0x68, 0x68, 0x68, 0x43, 0x32, + 0x68, 0xa3, 0x9f, + 0x55, 0x7e, 0x50, 0xaf, 0x99, 0x6e, 0x2a, 0x2a, + 0x67, 0x99, 0xfd, 0x11, 0x55, 0x74, 0x5e, 0xa7, + 0x55, 0x55, 0xa7, 0xb7, 0x9c, 0x74, 0x12, 0xf8, + 0xaa, 0x90, 0x73, 0xeb, 0x2b, 0x54, 0x6e, 0xde, + 0xeb, 0xeb, 0xf2, 0x15, 0x3f, 0x3d, 0x3d, 0x70, + 0x56, 0x71, 0x83, 0x99, 0x31, 0x59, 0x6b, 0x85, + 0x9a, 0x59, 0x4d, 0x36, 0x71, 0x6b, 0x63, 0x48, + 0x80, 0x81, 0x6f, 0x85, 0x6f, 0x6b, 0x6b, 0x71, + 0x85, 0x6a, 0x58, 0x58, 0x71, 0x81, 0x71, 0x9a, + 0x9a, 0x85, 0x6a, 0x81, 0x90, 0x71, 0x59, 0x7f, + 0x70, 0x3b, 0x15, 0x18, 0x16, 0xee, 0xf2, 0x16, + 0x16, 0xee, 0x16, 0x16, 0xf2, 0x17, 0x14, 0xff, + 0xff, 0x14, 0x16, 0x16, 0xf2, 0x15, 0xfd, 0xcb, + 0xd8, 0xd7, 0xe0, 0xd3, 0xd2, 0xd0, 0xe0, 0xed, + 0xcb, 0xa, 0x3, 0x73, 0xeb, 0xeb, 0xeb, 0xe1, + 0xee, 0xee, 0xf2, 0xee, 0x16, 0xf5, 0x15, 0x3d, + 0x16, 0xeb, 0x54, 0x54, 0xeb, 0xeb, 0xea, 0xd0, + 0xd2, 0xc4, 0xd3, 0xd6, 0xd3, 0xd2, 0xc4, 0xd1, + 0xd9, 0xd9, 0xbf, 0xbe, 0xc2, 0xd2, 0xed, 0xd0, + 0xd2, 0xbf, 0xbf, 0xb, 0xe3, 0xb, 0xb, 0xb, + 0xcb, 0xeb, 0xfa, 0xde, 0xd8, 0xd8, 0xe0, 0x50, + 0xe, 0xcd, 0xbd, 0xdd, 0xf7, 0xf3, 0xdd, 0xdd, + 0x7, 0xce, 0xd1, 0xc2, 0xc2, 0xd1, 0xd1, 0xd3, + 0xd9, 0xd3, 0xd2, 0xd2, 0xd6, 0xd8, 0xeb, 0xf1, + 0xed, 0xde, 0xeb, 0xd7, 0xd7, 0xe0, 0xd3, 0xd9, + 0xf9, 0xe6, 0x21, 0x48, 0x3b, 0x14, 0x16, 0x15, + 0x34, 0x3d, 0x34, 0x23, 0x26, 0x99, 0x41, 0x6f, + 0x5d, 0x90, 0x6b, 0x4a, 0x91, 0x6a, 0x63, 0x85, + 0x6f, 0x63, 0x23, 0x67, 0x4d, 0x99, 0x69, 0x6a, + 0x91, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x90, 0x90, + 0x85, 0x58, 0x67, 0x99, 0x5d, 0x5d, 0x6a, 0x55, + 0x6a, 0x6b, 0x63, 0x7f, 0x70, 0x16, 0x3d, 0x16, + 0xf2, 0xd8, 0xd8, 0xd8, 0xcb, 0xf9, 0xf1, 0xf1, + 0xfa, 0x2a, 0x34, 0x2a, 0xfd, 0x50, 0xc, 0xf7, + 0xf3, 0x37, 0x5e, 0x68, 0x8d, 0x5e, 0x5e, 0x5e, + 0x76, 0x76, 0x68, 0x6c, 0xc, 0x6c, 0xa3, 0x6c, + 0xe, 0x46, 0x76, 0x76, 0x74, 0x9c, 0x8f, 0x91, + 0x7a, 0xb0, 0x41, 0x73, 0x73, 0x73, 0x39, 0x2b, + 0x21, 0x36, 0x54, 0x2b, 0x73, 0x7f, 0x6, 0x4a, + 0x60, 0xc, 0x6c, 0xfc, 0xa7, 0xa0, 0x37, 0x2c, + 0x4a, 0xf8, 0xf0, 0x5a, 0xe5, 0xe3, 0xc8, 0x2c, + 0xa1, 0xa1, 0xba, 0x2f, 0xe, 0x37, 0x28, 0x82, + 0x5e, 0x5e, 0x5e, 0x8d, 0x8d, 0x9f, 0x6c, 0x1e, + 0x43, 0xa0, 0xa8, 0x5f, 0x46, 0x37, 0x76, 0x8d, + 0x8d, 0x28, 0x8d, 0x98, 0x98, 0x76, 0xa7, 0x46, + 0x8d, 0x5e, 0x37, 0x8d, 0x37, 0x5e, 0xfc, 0x8d, + 0x79, 0x75, 0x68, 0x5e, 0x75, 0x68, 0x5e, 0xb6, + 0x37, 0x5e, 0x9f, + 0x2f, 0x5f, 0xa6, 0xe4, 0x11, 0x3a, 0x4d, 0x20, + 0x60, 0x3e, 0x4a, 0x11, 0x37, 0xa7, 0x28, 0xb7, + 0x2f, 0x46, 0x9f, 0x6c, 0x28, 0x28, 0xe, 0x5f, + 0xa6, 0xb4, 0x73, 0xf2, 0x15, 0xf2, 0xd8, 0xcb, + 0x34, 0xfa, 0xfa, 0xfa, 0x6e, 0x48, 0x2e, 0x42, + 0x58, 0x5d, 0x99, 0x42, 0x7f, 0x6f, 0x6a, 0x5d, + 0x85, 0x6b, 0x58, 0x6b, 0x6a, 0x6a, 0x5d, 0x80, + 0x80, 0x90, 0x41, 0x80, 0x9a, 0x6a, 0x5d, 0x85, + 0x5d, 0x6a, 0x6a, 0x95, 0x6b, 0x5d, 0x6a, 0x58, + 0x80, 0x90, 0x90, 0x99, 0x97, 0x6f, 0x90, 0x7f, + 0x39, 0x7f, 0x3b, 0x16, 0x3d, 0x70, 0xf2, 0x16, + 0x16, 0x16, 0xee, 0x14, 0x14, 0x16, 0x14, 0x14, + 0xff, 0x3d, 0xf2, 0xf2, 0xfa, 0xd8, 0xe0, 0xe0, + 0xd7, 0xd0, 0xe3, 0xcc, 0xd1, 0xc2, 0xe4, 0xf8, + 0xc5, 0xd2, 0xbf, 0xd0, 0xcb, 0xd8, 0xde, 0xeb, + 0xf2, 0xf2, 0xee, 0x14, 0xee, 0xf2, 0xee, 0xf2, + 0x16, 0x15, 0x34, 0x34, 0xfa, 0xe6, 0xd8, 0xe0, + 0xd6, 0xd2, 0xd2, 0xdf, 0xc4, 0xc4, 0xd1, 0xce, + 0xc4, 0xd3, 0xd2, 0xc4, 0xc4, 0xd1, 0xd2, 0xd6, + 0xf1, 0xfd, 0x1b, 0x60, 0xaa, 0x60, 0xaf, 0xa1, + 0xbf, 0xcf, 0xe0, 0xcb, 0xcb, 0x5a, 0x50, 0xf7, + 0x9f, 0x9f, 0x9f, 0x6c, 0xfc, 0xb8, 0xcd, 0xbd, + 0xbd, 0xc2, 0xd1, 0xc4, 0xd1, 0xd1, 0xd1, 0xd1, + 0xcc, 0xdb, 0xd3, 0xd9, 0xd9, 0xd6, 0xd6, 0xd6, + 0xd7, 0xde, 0xd8, 0xeb, 0x23, 0x23, 0x23, 0x5a, + 0x99, 0xfa, 0x15, 0xf5, 0x16, 0x3b, 0x3d, 0xeb, + 0xeb, 0x15, 0x48, 0x67, 0x63, 0x63, 0x4d, 0x5d, + 0x85, 0x67, 0x85, 0x90, 0x63, 0x9a, 0x9a, 0x31, + 0x58, 0x58, 0x58, 0x71, 0x71, 0x4d, 0x59, 0x6f, + 0x6a, 0x99, 0x90, 0x6f, 0x71, 0x6b, 0x71, 0x63, + 0x6f, 0x58, 0x31, 0x58, 0x6b, 0x6b, 0x58, 0x58, + 0x85, 0x6f, 0x99, 0x7f, 0x70, 0x3d, 0x16, 0x3d, + 0x48, 0x48, 0x21, 0xfa, 0x2a, 0x73, 0x1, 0x15, + 0xe1, 0xf2, 0xf2, 0x34, 0x6e, 0x20, 0x11, 0x62, + 0x62, 0x8f, 0x82, 0x30, 0x55, 0x62, 0x8d, 0x9c, + 0x60, 0x60, 0x37, 0x93, 0x74, 0x62, 0xfc, 0x30, + 0x8f, 0x8f, 0x93, 0x7e, 0x6a, 0x6a, 0x91, 0x6f, + 0x99, 0x6e, 0x54, 0x2a, 0x7f, 0x67, 0x36, 0x2e, + 0x1a, 0x99, 0x7f, 0x70, 0x15, 0xeb, 0x2a, 0x80, + 0x6f, 0x3e, 0x27, 0x55, 0x8f, 0x82, 0x5f, 0x7e, + 0x1b, 0x50, 0xcc, 0xe5, 0xfd, 0x5a, 0xa1, 0x6a, + 0x91, 0x60, 0x27, 0x5d, 0x62, 0x82, 0x76, 0x8f, + 0x55, 0x12, 0xa7, 0x8f, 0x9c, 0x2c, 0x27, 0x62, + 0x8b, 0x82, 0x93, 0x7e, 0x7e, 0x62, 0x8b, 0x8f, + 0x8b, 0x2f, 0x60, 0x94, 0x94, 0x7e, 0x6a, 0x7e, + 0x62, 0x8d, 0x98, 0x8f, 0x62, 0x38, 0x62, 0x74, + 0x8f, 0x79, 0x43, 0x2f, 0x93, 0x75, 0x5e, 0x93, + 0x62, 0x1f, 0x75, + 0x74, 0x7e, 0x55, 0x6a, 0x6a, 0x90, 0x20, 0xfd, + 0x11, 0x60, 0xc, 0xba, 0x2c, 0x9c, 0xa7, 0x37, + 0x46, 0x93, 0x79, 0x5e, 0x76, 0x93, 0xa7, 0xb3, + 0xaf, 0xcb, 0x34, 0x34, 0x2a, 0xf5, 0x15, 0x2a, + 0x73, 0x34, 0x15, 0x2a, 0x15, 0x2b, 0x99, 0x67, + 0x99, 0x85, 0x4d, 0x63, 0x9a, 0x85, 0x6f, 0x63, + 0x6b, 0x85, 0x90, 0x6f, 0x71, 0x6b, 0x6b, 0x85, + 0x80, 0x63, 0x63, 0x71, 0x58, 0x6b, 0x71, 0x63, + 0x71, 0x71, 0x90, 0x6f, 0x6b, 0x71, 0x6b, 0x71, + 0x9a, 0x90, 0x4d, 0x4d, 0x63, 0x6b, 0x99, 0x48, + 0x2b, 0x34, 0x3d, 0x14, 0x14, 0xeb, 0xeb, 0xeb, + 0x34, 0xf2, 0x3d, 0x16, 0x14, 0x14, 0x14, 0x14, + 0xff, 0x18, 0xf2, 0x15, 0xe6, 0xe0, 0xed, 0xfd, + 0xe3, 0xe4, 0xdd, 0xdd, 0xf0, 0xbe, 0xba, 0xb9, + 0xc2, 0xd2, 0xd0, 0xcb, 0xd3, 0xd3, 0xcb, 0xd8, + 0xeb, 0xe1, 0xee, 0x16, 0x16, 0x14, 0xee, 0xee, + 0xee, 0xeb, 0xde, 0x15, 0xd8, 0xd8, 0xa, 0xfe, + 0xed, 0xd0, 0xd1, 0xce, 0xc2, 0xd2, 0xd3, 0xc4, + 0xc4, 0xc4, 0xd2, 0xd9, 0xdb, 0xc4, 0xc4, 0x26, + 0xfd, 0xfe, 0x99, 0x6f, 0x83, 0xb0, 0xb4, 0xb, + 0xcc, 0xbf, 0xb4, 0xe9, 0x1b, 0xf8, 0xf7, 0x7, + 0x9f, 0xf7, 0xdd, 0xb8, 0xb6, 0xb8, 0xc1, 0xce, + 0xdc, 0xc1, 0xc2, 0xc7, 0xec, 0xe7, 0xc4, 0xc2, + 0xc2, 0xd2, 0xd9, 0xd6, 0xd2, 0xd2, 0xd3, 0xd6, + 0xd7, 0xe6, 0xd8, 0xe6, 0xfa, 0x23, 0xfa, 0x54, + 0x6e, 0x34, 0x15, 0x16, 0x14, 0x16, 0x16, 0xf2, + 0x3d, 0x3d, 0x7f, 0x9a, 0x85, 0x6b, 0x58, 0x6b, + 0x85, 0x59, 0x80, 0x67, 0x39, 0x42, 0x58, 0x6b, + 0x71, 0x59, 0x71, 0x6b, 0x81, 0x6b, 0x6b, 0x71, + 0x85, 0x80, 0x63, 0x71, 0x71, 0x6b, 0x6b, 0x81, + 0x6b, 0x71, 0x59, 0x71, 0x6b, 0x6b, 0x6b, 0x63, + 0x67, 0x85, 0x80, 0x54, 0x70, 0x3b, 0x3d, 0xf2, + 0x2a, 0x7f, 0x23, 0xfa, 0x34, 0x73, 0xee, 0x15, + 0xee, 0x3d, 0x2b, 0x23, 0x3a, 0x5d, 0x27, 0x62, + 0x8f, 0x93, 0x37, 0x46, 0x6a, 0x5f, 0x5e, 0x93, + 0x74, 0x55, 0x82, 0x93, 0x8b, 0x93, 0x1f, 0x62, + 0x62, 0x8f, 0x9c, 0x62, 0x6a, 0x41, 0x6a, 0x81, + 0x90, 0x7f, 0xfa, 0x73, 0x54, 0x48, 0x48, 0x42, + 0x48, 0x54, 0xa, 0x73, 0x48, 0x21, 0x48, 0x3a, + 0x60, 0x5f, 0x8d, 0x46, 0x93, 0x6c, 0xa7, 0x60, + 0x50, 0xe5, 0xcc, 0x3e, 0xa6, 0x2c, 0x2f, 0x8f, + 0x62, 0x93, 0x46, 0x62, 0x46, 0x6c, 0xa7, 0x76, + 0x76, 0xc, 0xa0, 0x7d, 0x79, 0x5e, 0x82, 0x98, + 0x8d, 0x5e, 0x76, 0x62, 0x62, 0xe, 0xa8, 0x9c, + 0x93, 0x37, 0x9c, 0x7e, 0x62, 0x93, 0x98, 0x62, + 0x79, 0x86, 0x5e, 0x93, 0x8d, 0x8d, 0x32, 0xa7, + 0xa7, 0x75, 0x68, 0x75, 0x8d, 0x68, 0x68, 0x75, + 0x75, 0x75, 0x68, + 0x94, 0x91, 0x5d, 0x58, 0x90, 0x69, 0x5a, 0x3, + 0xfd, 0x83, 0x2f, 0xba, 0x55, 0x7e, 0x30, 0x76, + 0x8f, 0x8f, 0x76, 0x12, 0x55, 0x94, 0xa7, 0x50, + 0xb4, 0x73, 0x73, 0x54, 0xfa, 0x21, 0x42, 0x48, + 0xeb, 0xf2, 0x16, 0x3d, 0xee, 0x15, 0x48, 0x67, + 0x7f, 0x4d, 0x59, 0x58, 0x81, 0x71, 0x71, 0x58, + 0x6a, 0x90, 0x99, 0x80, 0x63, 0x9a, 0x85, 0x71, + 0x58, 0x71, 0x58, 0x6b, 0x81, 0x81, 0x6b, 0x59, + 0x59, 0x80, 0x99, 0x63, 0x71, 0x85, 0x71, 0x6b, + 0x6b, 0x71, 0x59, 0x59, 0x71, 0x6b, 0x85, 0x42, + 0x21, 0x3b, 0x16, 0x14, 0x14, 0xf2, 0xeb, 0xf2, + 0x73, 0x73, 0xf2, 0x14, 0x14, 0x16, 0x16, 0x14, + 0x14, 0x16, 0xf2, 0xe6, 0x5a, 0xd4, 0xe7, 0x1b, + 0xf0, 0xdd, 0x7, 0x7, 0xdc, 0xc7, 0xc2, 0xc2, + 0xc2, 0xd1, 0xd4, 0xb, 0xcc, 0xc2, 0xd3, 0xcb, + 0xf1, 0xd8, 0xe1, 0xee, 0x14, 0xf2, 0xee, 0x16, + 0xee, 0xf2, 0xee, 0xee, 0xde, 0x2a, 0xcb, 0x20, + 0x20, 0xd0, 0xc4, 0xc4, 0xc4, 0xd3, 0xd2, 0xd2, + 0xc4, 0xc4, 0xd2, 0xdb, 0xe7, 0xd1, 0xd2, 0xd0, + 0x5a, 0xcb, 0xfd, 0xaf, 0x50, 0x40, 0x41, 0x40, + 0xf3, 0xf3, 0x50, 0xf8, 0xf3, 0xf7, 0x7, 0x7, + 0x9f, 0x7, 0xc1, 0xc1, 0xdd, 0x7, 0xcd, 0xdc, + 0xf3, 0x7, 0xc1, 0xd1, 0xe2, 0xe7, 0xd2, 0xd1, + 0xc4, 0xd2, 0xd3, 0xd9, 0xd9, 0xd2, 0xd2, 0xd3, + 0xd7, 0xd8, 0xd8, 0xde, 0xe6, 0xfa, 0xeb, 0xd8, + 0xeb, 0xd8, 0xeb, 0xf2, 0x16, 0x16, 0x16, 0x16, + 0x3b, 0x3b, 0x54, 0x5a, 0x90, 0x6f, 0x6a, 0x83, + 0x90, 0x71, 0x5d, 0x6f, 0x4d, 0x7f, 0x63, 0x6a, + 0x5d, 0x85, 0x6b, 0x91, 0x91, 0x81, 0x91, 0x81, + 0x6a, 0x6b, 0x6b, 0x6a, 0x6b, 0x81, 0x81, 0x91, + 0x6b, 0x58, 0x6b, 0x71, 0x85, 0x71, 0x6a, 0x5d, + 0x85, 0x71, 0x58, 0x80, 0x54, 0x3d, 0x18, 0x16, + 0xf2, 0xeb, 0xe6, 0xd8, 0xeb, 0xd8, 0xe6, 0xeb, + 0x34, 0x15, 0x15, 0xfe, 0x3a, 0x27, 0xe, 0xa7, + 0xa7, 0x7, 0x5e, 0x9f, 0x1e, 0x7, 0x5e, 0x5e, + 0x5e, 0x37, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, + 0xa7, 0xb7, 0xa0, 0xa7, 0x6a, 0x52, 0x1b, 0x90, + 0x3c, 0x26, 0x2a, 0x2b, 0x70, 0x34, 0x34, 0x2b, + 0x70, 0xa, 0xea, 0x23, 0x67, 0x26, 0x20, 0x1b, + 0x55, 0x1e, 0x5e, 0x5e, 0x9f, 0xb8, 0xbd, 0xf3, + 0xb7, 0xcc, 0xe4, 0xe, 0xa7, 0x5e, 0x28, 0x37, + 0xa7, 0x7, 0x6c, 0x28, 0x28, 0xb8, 0xdd, 0x28, + 0x5e, 0x5e, 0x9f, 0x28, 0x9f, 0x68, 0x32, 0x5e, + 0x5e, 0x9f, 0xdd, 0xa0, 0x28, 0x8, 0xb7, 0xe, + 0x76, 0x5e, 0x82, 0x93, 0x30, 0x12, 0x37, 0x82, + 0x5e, 0x5e, 0x7, 0x7, 0x5e, 0x68, 0x5e, 0x6c, + 0xfc, 0x32, 0x32, 0xa2, 0x32, 0x86, 0x32, 0x86, + 0x7, 0xa3, 0x68, + 0x91, 0x91, 0x5d, 0x41, 0x5a, 0x7f, 0xfd, 0x50, + 0x58, 0x55, 0x43, 0x43, 0x8d, 0x62, 0x46, 0x76, + 0x9c, 0x9c, 0x46, 0xc, 0xa6, 0x9c, 0xa7, 0xbc, + 0xc9, 0x73, 0xeb, 0x73, 0x73, 0x34, 0x39, 0x2a, + 0x70, 0xd8, 0x15, 0x15, 0x17, 0x3d, 0x54, 0x63, + 0x3a, 0x4d, 0x31, 0x71, 0x5d, 0x6a, 0x5d, 0x5d, + 0x9a, 0x63, 0x58, 0x6b, 0x71, 0x58, 0x97, 0x71, + 0x71, 0x90, 0x90, 0x5d, 0x81, 0x6a, 0x91, 0x81, + 0x71, 0x63, 0x58, 0x71, 0x6b, 0x6b, 0x85, 0x71, + 0x6b, 0x6b, 0x6f, 0x71, 0x71, 0x83, 0x6f, 0x6f, + 0x9a, 0x39, 0x3b, 0x17, 0x16, 0x3d, 0xf2, 0xf2, + 0xde, 0xde, 0xee, 0x16, 0x16, 0xf2, 0x14, 0x14, + 0xf5, 0xf5, 0xfa, 0xf9, 0x40, 0xcc, 0xe4, 0xf0, + 0xba, 0xbd, 0xbd, 0xcd, 0xc1, 0xc7, 0xc7, 0xce, + 0xdc, 0xe4, 0xf0, 0xa0, 0xdd, 0xc7, 0xc4, 0xd6, + 0xd7, 0xd7, 0xe1, 0xe1, 0xee, 0xee, 0x14, 0x16, + 0x17, 0x15, 0xf2, 0xf2, 0x15, 0xeb, 0xe0, 0xd4, + 0xbf, 0xd1, 0xd1, 0xc4, 0xc7, 0xd1, 0xc4, 0xd1, + 0xe2, 0xd1, 0xc4, 0xc4, 0xbf, 0xd2, 0xd2, 0xd6, + 0xd6, 0xd7, 0xe0, 0xdb, 0xec, 0x11, 0x2c, 0xf7, + 0x8, 0xdd, 0xf7, 0xb8, 0xb8, 0xb8, 0xbd, 0xbd, + 0x7, 0x7, 0xdd, 0xcd, 0x7, 0xf7, 0xf7, 0x7, + 0xb8, 0xcd, 0xc2, 0xc2, 0xc2, 0xc4, 0xd2, 0xd2, + 0xd2, 0xc4, 0xc4, 0xd3, 0xd9, 0xdb, 0xd2, 0xd2, + 0xd3, 0xe6, 0xd7, 0xd7, 0xde, 0xeb, 0xde, 0xde, + 0xde, 0xfa, 0x39, 0xfa, 0x15, 0x16, 0x17, 0x3f, + 0x73, 0xf2, 0x2b, 0xeb, 0x73, 0x97, 0x6a, 0x6a, + 0x6a, 0x5d, 0x6a, 0x6a, 0x5d, 0x58, 0x31, 0x6f, + 0x90, 0x63, 0x5d, 0x6a, 0x90, 0x6f, 0x6a, 0x6a, + 0x7e, 0x6a, 0x6a, 0x6a, 0x81, 0x91, 0x6a, 0x6a, + 0x90, 0x59, 0x71, 0x6f, 0x9a, 0x63, 0x6f, 0x6a, + 0x6b, 0x6b, 0x58, 0x66, 0x73, 0x15, 0x16, 0x18, + 0xf2, 0xf2, 0xde, 0xe0, 0xd8, 0xeb, 0xf1, 0xfb, + 0x73, 0xf5, 0x34, 0x1c, 0x41, 0x50, 0xa7, 0xfc, + 0x8, 0xf3, 0x28, 0x75, 0x76, 0x1f, 0xe, 0x37, + 0x5e, 0x82, 0x5e, 0xfc, 0xf7, 0xa0, 0x6c, 0x5e, + 0x5f, 0x12, 0x12, 0x74, 0x7e, 0xb0, 0xe5, 0xfe, + 0x42, 0x6e, 0x54, 0x73, 0x2b, 0x15, 0x34, 0x36, + 0x67, 0x23, 0xfa, 0x7f, 0x99, 0x90, 0xfd, 0x58, + 0x27, 0x28, 0xb8, 0x82, 0x1e, 0xdd, 0xf3, 0xfc, + 0x1f, 0xe, 0x12, 0x12, 0x46, 0x28, 0xa7, 0x5f, + 0x12, 0xf8, 0xba, 0xb3, 0x76, 0xe, 0xe, 0xa7, + 0x8d, 0x86, 0x68, 0x1f, 0x1f, 0x75, 0x6c, 0x76, + 0x1f, 0xe, 0xe4, 0xa6, 0x76, 0x37, 0x30, 0x27, + 0x62, 0x93, 0x74, 0x6a, 0x4a, 0x27, 0xaa, 0xb3, + 0xa7, 0x1e, 0x12, 0x46, 0x5e, 0x68, 0x32, 0x32, + 0x30, 0x1f, 0x75, 0x79, 0x8d, 0x32, 0xfc, 0x43, + 0x76, 0x5e, 0x32, + 0xb0, 0x83, 0xad, 0xf0, 0xe3, 0x11, 0x27, 0xfc, + 0x6c, 0x32, 0x9f, 0x6c, 0x7, 0x6c, 0x5e, 0x8, + 0xb7, 0xf7, 0x6c, 0x6c, 0x37, 0x37, 0xf7, 0x2c, + 0xb, 0x73, 0x15, 0xf2, 0xeb, 0xfa, 0xe6, 0xe6, + 0xeb, 0xeb, 0xf1, 0x23, 0x34, 0x3b, 0x1d, 0x31, + 0x85, 0x80, 0x80, 0x85, 0x9a, 0x41, 0x5d, 0x6a, + 0x83, 0x90, 0x4a, 0x5d, 0x4a, 0x6a, 0x3a, 0x5d, + 0x83, 0x56, 0x99, 0x58, 0x83, 0xb4, 0x83, 0x6a, + 0x6a, 0x4a, 0x58, 0x58, 0x91, 0x6a, 0x5d, 0x6b, + 0x5d, 0x6f, 0x41, 0x85, 0x5d, 0x97, 0x5d, 0x5d, + 0x6b, 0x90, 0x23, 0x22, 0x22, 0x3f, 0xf2, 0x16, + 0xee, 0xee, 0xff, 0x14, 0x16, 0xee, 0xf2, 0x3d, + 0xf9, 0xd6, 0xe0, 0xed, 0xe7, 0xe7, 0xc4, 0xbe, + 0xce, 0xc7, 0xdc, 0xdd, 0x7, 0x7, 0xdd, 0xf0, + 0xf7, 0xdd, 0xbd, 0xbd, 0xce, 0xc2, 0xd2, 0xd6, + 0xd3, 0xd6, 0xe1, 0xe1, 0xee, 0xee, 0xee, 0xf2, + 0x21, 0xfa, 0xf2, 0xe1, 0x15, 0xf1, 0xea, 0x3, + 0xe4, 0xcd, 0xdc, 0xec, 0xf3, 0xc1, 0xc2, 0xc4, + 0xd2, 0xdb, 0xc4, 0xc4, 0xc4, 0xd2, 0xd6, 0xd7, + 0xe6, 0xcb, 0xe6, 0xe6, 0xfd, 0x4a, 0xc, 0xba, + 0xcd, 0xf0, 0xcc, 0xc2, 0xcd, 0xdd, 0xdd, 0xf0, + 0xf7, 0x9f, 0x9f, 0xdd, 0xf0, 0xdd, 0xb8, 0xc1, + 0xc1, 0xc2, 0xd2, 0xd2, 0xd1, 0xc2, 0xd1, 0xd9, + 0xdb, 0xe4, 0xc2, 0xc4, 0xd2, 0xd3, 0xd3, 0xd2, + 0xc4, 0xd2, 0xd6, 0xd7, 0xde, 0xf1, 0xfa, 0xe1, + 0xee, 0xf2, 0xf5, 0xde, 0xee, 0x17, 0x2b, 0xf2, + 0xeb, 0x3f, 0x3f, 0x3b, 0x15, 0x42, 0x6f, 0x5d, + 0x56, 0x58, 0x71, 0x71, 0x9a, 0x71, 0x63, 0x71, + 0x3c, 0x71, 0x6b, 0x6b, 0x4d, 0x63, 0x6b, 0x6a, + 0x90, 0x5d, 0x81, 0x5d, 0x85, 0x6f, 0x81, 0x71, + 0x71, 0x6b, 0x6b, 0x58, 0x31, 0x1c, 0x80, 0x58, + 0x9a, 0x80, 0x80, 0x48, 0x70, 0xf2, 0x3d, 0x17, + 0x15, 0x3d, 0x48, 0x39, 0x34, 0xeb, 0xeb, 0xeb, + 0xeb, 0xf2, 0x21, 0x1a, 0x26, 0x1b, 0x2f, 0x46, + 0x7e, 0x62, 0x82, 0x93, 0x8f, 0x7e, 0x55, 0x62, + 0x8f, 0xaa, 0xa7, 0x62, 0x7e, 0x62, 0x46, 0x8f, + 0x94, 0x94, 0x7e, 0x6a, 0x83, 0x99, 0x73, 0x34, + 0xfa, 0x73, 0x73, 0x48, 0x42, 0x42, 0x42, 0x63, + 0x3a, 0x67, 0x34, 0x34, 0x34, 0x73, 0x6e, 0x3a, + 0x91, 0x9c, 0xe, 0x8f, 0x8f, 0x79, 0x76, 0x8f, + 0x93, 0x76, 0x28, 0x8f, 0x8f, 0x9c, 0xa8, 0x60, + 0x91, 0x62, 0x55, 0x7e, 0x8f, 0x79, 0x46, 0x8f, + 0x98, 0x5e, 0x1e, 0x74, 0x93, 0x8d, 0x7d, 0x74, + 0x93, 0x8d, 0x62, 0x8f, 0x94, 0x93, 0x94, 0x94, + 0x94, 0x6a, 0xb0, 0x97, 0x6f, 0x91, 0x6a, 0x6a, + 0x62, 0x79, 0x46, 0x8b, 0x98, 0x8d, 0x32, 0x8b, + 0x8f, 0x8d, 0x75, 0x98, 0x93, 0x79, 0x75, 0x8d, + 0x98, 0x79, 0x75, + 0x1b, 0x58, 0x7e, 0xc, 0xf8, 0x27, 0x27, 0x1e, + 0x93, 0x9c, 0x1f, 0x12, 0x2c, 0x5f, 0x5e, 0x6c, + 0x12, 0x30, 0x82, 0x37, 0x9c, 0x55, 0x11, 0x11, + 0x99, 0x6e, 0x34, 0x15, 0x3b, 0x2b, 0xfa, 0x39, + 0xfa, 0x16, 0x3b, 0x34, 0xf2, 0x3d, 0x42, 0x31, + 0x7f, 0x99, 0x9a, 0x58, 0x31, 0x4d, 0x31, 0x6b, + 0x71, 0x4d, 0x6f, 0x5d, 0x6b, 0x71, 0x6f, 0x6b, + 0x58, 0x63, 0x9a, 0x6b, 0x6b, 0x59, 0x63, 0x71, + 0x6b, 0x99, 0x99, 0x59, 0x71, 0x71, 0x6f, 0x6b, + 0x71, 0x6b, 0x71, 0x6b, 0x6b, 0x71, 0x59, 0x71, + 0x6f, 0x7f, 0x3b, 0x1d, 0x3f, 0x34, 0x3d, 0x3d, + 0x3f, 0x3d, 0x14, 0x14, 0x14, 0x14, 0x16, 0xee, + 0x15, 0xd6, 0xd6, 0xcb, 0xd7, 0xd0, 0xc4, 0xce, + 0xdd, 0xf3, 0xe, 0x9f, 0x7, 0xf7, 0xdd, 0xdc, + 0xdc, 0xc1, 0xc1, 0xc1, 0xcd, 0xdc, 0xce, 0xc7, + 0xbf, 0xd0, 0xd7, 0xeb, 0xee, 0xee, 0x14, 0x16, + 0xeb, 0xeb, 0xf2, 0xeb, 0x23, 0xfd, 0x20, 0x11, + 0xa0, 0xf7, 0xdd, 0xbe, 0xcd, 0xc1, 0xc2, 0xc4, + 0xd2, 0xd2, 0xd2, 0xc4, 0xc4, 0xd1, 0xd0, 0xe0, + 0xe0, 0xd4, 0xd8, 0xe6, 0xcb, 0xa1, 0xaf, 0xd1, + 0xbe, 0xf8, 0xe4, 0xd5, 0xdc, 0xf7, 0xdd, 0xdd, + 0xdd, 0x7, 0x7, 0xb8, 0xc1, 0xdd, 0xbd, 0xc2, + 0xc2, 0xdc, 0xe2, 0xd1, 0xd1, 0xce, 0xce, 0xd2, + 0xd4, 0xd1, 0xd1, 0xc4, 0xd2, 0xd3, 0xd6, 0xd3, + 0xd2, 0xd3, 0xd9, 0xd6, 0xe6, 0xf1, 0xde, 0xeb, + 0xf2, 0x16, 0x16, 0x14, 0x14, 0x16, 0xf2, 0xf2, + 0x3d, 0x3f, 0x99, 0x39, 0x70, 0x63, 0x71, 0x81, + 0x71, 0x71, 0x6b, 0x85, 0x99, 0x9a, 0x6b, 0x81, + 0x6f, 0x81, 0x81, 0x6a, 0x6b, 0x71, 0x81, 0x81, + 0x58, 0x85, 0x6a, 0x6f, 0x99, 0x9a, 0x6b, 0x6b, + 0x71, 0x71, 0x6b, 0x6b, 0x85, 0x80, 0x80, 0x31, + 0x67, 0x99, 0x80, 0x99, 0x70, 0xf2, 0x3b, 0x3b, + 0x3d, 0x16, 0xfa, 0xfa, 0xfa, 0xeb, 0x73, 0xeb, + 0xfa, 0x15, 0x15, 0x48, 0x39, 0x41, 0x27, 0x76, + 0x62, 0x93, 0x37, 0x46, 0x62, 0xaa, 0xc, 0x76, + 0x62, 0x55, 0x46, 0x93, 0x8f, 0x98, 0x37, 0x46, + 0x62, 0x9c, 0xa1, 0xbc, 0x97, 0x6e, 0x54, 0x36, + 0x48, 0x70, 0x21, 0x80, 0x80, 0x99, 0x42, 0x26, + 0x36, 0x99, 0x54, 0xa, 0xfa, 0x23, 0x39, 0x6a, + 0x62, 0x82, 0xfc, 0x76, 0x98, 0x5e, 0x9f, 0xa7, + 0x37, 0x76, 0x8, 0xa7, 0x76, 0x37, 0x2f, 0x62, + 0x93, 0x82, 0x46, 0x27, 0x62, 0x5e, 0x5e, 0xa7, + 0x76, 0x28, 0x6c, 0xa7, 0x68, 0x9e, 0x28, 0x8d, + 0x68, 0x68, 0x5e, 0x5f, 0x2f, 0x46, 0x9c, 0xb3, + 0x6a, 0x6a, 0x1b, 0x83, 0x55, 0x9c, 0x2c, 0x5b, + 0x1f, 0x68, 0x68, 0x28, 0x8, 0xfc, 0x1e, 0x82, + 0xa7, 0x6c, 0x32, 0x32, 0x43, 0x68, 0x68, 0x75, + 0x75, 0xfc, 0x86, + 0x58, 0x4a, 0x6a, 0x30, 0x6a, 0x4a, 0x55, 0x76, + 0xaa, 0xaa, 0x46, 0x1e, 0x74, 0x74, 0x8d, 0x5e, + 0x7d, 0x62, 0x7d, 0x76, 0x94, 0x6a, 0x55, 0x83, + 0xb4, 0xa, 0xeb, 0xfa, 0x34, 0x2a, 0xfe, 0x36, + 0x23, 0x16, 0x16, 0x15, 0x16, 0x16, 0x48, 0x80, + 0x99, 0x99, 0x58, 0x71, 0x71, 0x71, 0x71, 0x6b, + 0x6b, 0x9a, 0x58, 0x6b, 0x71, 0x80, 0x71, 0x5d, + 0x71, 0x71, 0x6b, 0x6b, 0x6b, 0x6b, 0x71, 0x81, + 0x71, 0x67, 0x1d, 0x59, 0x9a, 0x80, 0x9a, 0x6b, + 0x6b, 0x81, 0x81, 0x6b, 0x6b, 0x81, 0x6b, 0x6b, + 0x71, 0x3f, 0x16, 0x3b, 0x3f, 0x3d, 0x3d, 0x70, + 0x48, 0x3b, 0x16, 0x17, 0x3d, 0x14, 0x16, 0xf2, + 0xf2, 0xde, 0xd7, 0xcb, 0xd0, 0xd2, 0xdb, 0xdc, + 0xdd, 0xfc, 0x9f, 0x9f, 0x9f, 0x7, 0xcd, 0xc1, + 0xc1, 0xc2, 0xc2, 0xce, 0xdd, 0xb8, 0xcd, 0xdc, + 0xdc, 0xd1, 0xd3, 0xd8, 0xde, 0xee, 0xee, 0x16, + 0xf5, 0xe1, 0xf2, 0xe6, 0xf1, 0x1b, 0x60, 0x2f, + 0x7, 0x7, 0xbd, 0xc1, 0xc2, 0xc2, 0xc4, 0xc4, + 0xd1, 0xc2, 0xc4, 0xd1, 0xbe, 0xdc, 0xc7, 0xd2, + 0xd9, 0xe0, 0xe0, 0xcb, 0x3, 0xbf, 0xbf, 0xc7, + 0xbe, 0xb8, 0xdd, 0xe4, 0xf0, 0xdd, 0x9f, 0xdd, + 0xbd, 0xdc, 0xdc, 0xc1, 0xc2, 0xcd, 0xcd, 0xe2, + 0xce, 0xcd, 0xdd, 0xc7, 0xd1, 0xe2, 0xce, 0xc4, + 0xc2, 0xc4, 0xc4, 0xd2, 0xc4, 0xc4, 0xd3, 0xd3, + 0xd3, 0xd2, 0xbf, 0xd1, 0xd9, 0xd7, 0xe6, 0xe6, + 0xde, 0xfa, 0x15, 0x16, 0x16, 0x16, 0x3d, 0x16, + 0x17, 0x34, 0x54, 0x6e, 0x2a, 0x36, 0x3a, 0x5d, + 0x6a, 0x81, 0x81, 0x9a, 0x39, 0x9a, 0x6b, 0x6a, + 0x90, 0x5d, 0x91, 0x91, 0x6a, 0x5d, 0x4a, 0x5d, + 0x83, 0x5d, 0x91, 0x6a, 0x63, 0x63, 0x6b, 0x6b, + 0x9a, 0x4d, 0x31, 0x5d, 0x90, 0x41, 0x97, 0x3a, + 0x63, 0x3c, 0x6f, 0x90, 0x23, 0x3b, 0x15, 0x3d, + 0x3d, 0xf2, 0xfa, 0xf1, 0xe6, 0xcb, 0xd7, 0xe6, + 0xe6, 0x1, 0xfa, 0x7f, 0x26, 0xfe, 0x11, 0xe, + 0x82, 0xa7, 0x7, 0xe, 0x30, 0x5f, 0x8, 0x5e, + 0x37, 0x12, 0x1f, 0x5e, 0x82, 0x28, 0xe, 0x2f, + 0xa8, 0xb7, 0xbe, 0xa1, 0x20, 0xfd, 0x41, 0x63, + 0x63, 0x67, 0x42, 0x80, 0x99, 0x48, 0x34, 0x23, + 0x39, 0x54, 0xcb, 0xcb, 0xfe, 0x1c, 0x20, 0x60, + 0x82, 0x28, 0xfc, 0x30, 0x68, 0x5e, 0x7, 0xdd, + 0xe, 0x28, 0x6c, 0x28, 0x5e, 0xfc, 0x46, 0x5e, + 0x28, 0x5e, 0xe, 0x11, 0x27, 0x5e, 0x6c, 0x8, + 0x1e, 0x1f, 0x5e, 0x5e, 0x5e, 0x68, 0x1e, 0x37, + 0x5e, 0x4e, 0x5e, 0xf3, 0x2c, 0x37, 0xa7, 0xa6, + 0xf8, 0x27, 0x4a, 0x55, 0x9c, 0x8d, 0xe, 0x27, + 0x5f, 0x5e, 0x9f, 0xdd, 0xf3, 0xe, 0x1f, 0x43, + 0x43, 0x32, 0x86, 0x28, 0x75, 0x68, 0x68, 0x68, + 0x32, 0xf7, 0x86, + 0x83, 0x83, 0x11, 0xf8, 0xa5, 0x50, 0x5f, 0x37, + 0x30, 0x62, 0x82, 0x5e, 0x79, 0x82, 0x5e, 0x5e, + 0x76, 0xa8, 0xa7, 0xf, 0x60, 0xa6, 0xa8, 0xa6, + 0x7f, 0x34, 0x34, 0x3d, 0x3d, 0x15, 0x34, 0x48, + 0x23, 0x15, 0x16, 0x16, 0x16, 0x15, 0x2a, 0x5a, + 0x54, 0x80, 0x31, 0x6b, 0x71, 0x71, 0x85, 0x58, + 0x6b, 0x6b, 0x6f, 0x6a, 0x63, 0x67, 0x85, 0x5d, + 0x80, 0x9a, 0x5d, 0x81, 0x81, 0x6a, 0x6a, 0x91, + 0x71, 0x71, 0x59, 0x6b, 0x63, 0x48, 0x67, 0x71, + 0x6a, 0x83, 0x6a, 0x5d, 0x6b, 0x85, 0xb0, 0x9a, + 0x63, 0x42, 0x7f, 0x42, 0x3f, 0x3d, 0x3d, 0x70, + 0xa, 0x73, 0xee, 0xf2, 0xf2, 0xeb, 0xe6, 0xe6, + 0xe6, 0xd8, 0xe6, 0xd0, 0xba, 0xe4, 0xd4, 0xe7, + 0xf3, 0x7, 0x7, 0xb8, 0xdd, 0xdd, 0xbd, 0xcd, + 0xcd, 0xf0, 0xf0, 0xdd, 0x9f, 0xb8, 0xcd, 0xc7, + 0xd1, 0xc2, 0xd2, 0xd3, 0xd7, 0xe6, 0xeb, 0xeb, + 0xea, 0xfa, 0xfa, 0xa, 0xfd, 0xf8, 0xb8, 0xbd, + 0xbd, 0xcd, 0xc1, 0xc2, 0xc4, 0xd5, 0xe7, 0xd1, + 0xce, 0xcd, 0xdc, 0xd2, 0xd1, 0xce, 0xc2, 0xc4, + 0xd3, 0xd3, 0xd3, 0xd0, 0xc2, 0xdc, 0xf0, 0xf0, + 0xcd, 0xdd, 0xb8, 0xd5, 0xdb, 0xcc, 0xc1, 0xc2, + 0xc2, 0xe2, 0xe2, 0xf0, 0xbd, 0xdd, 0xdd, 0xf0, + 0xe2, 0xbd, 0xb8, 0xc2, 0xd2, 0xdb, 0xc4, 0xd1, + 0xc4, 0xd2, 0xe7, 0xdb, 0xd2, 0xd1, 0xd1, 0xd3, + 0xd9, 0xd2, 0xc7, 0xc4, 0xd2, 0xd6, 0xd7, 0xd7, + 0xd7, 0xf1, 0x23, 0xf2, 0x3b, 0x1d, 0x21, 0x3d, + 0x16, 0x16, 0xf2, 0x34, 0x15, 0x2a, 0x39, 0x1b, + 0x6a, 0x6a, 0x6a, 0x5d, 0x58, 0x5d, 0x6a, 0x7a, + 0x58, 0x71, 0x6a, 0x83, 0xaf, 0x6f, 0x4a, 0x5d, + 0x6a, 0x6a, 0x91, 0x6a, 0x5d, 0x58, 0x6f, 0x6f, + 0xfe, 0x7f, 0x5d, 0x9d, 0x97, 0x6f, 0x83, 0x4a, + 0x58, 0x6a, 0x6a, 0x90, 0x54, 0xf2, 0x16, 0x16, + 0x16, 0x16, 0xd8, 0xde, 0xde, 0xd7, 0xd7, 0xf1, + 0xfa, 0xfa, 0x23, 0x5a, 0x4d, 0x41, 0xb, 0xe, + 0x37, 0x28, 0xe, 0x1f, 0x62, 0x76, 0x5e, 0x5e, + 0x8d, 0x93, 0xa7, 0x37, 0x76, 0x37, 0xc8, 0x2c, + 0x5f, 0x2f, 0xc, 0x60, 0x83, 0x3a, 0x90, 0x6f, + 0x81, 0x71, 0x99, 0x7f, 0x48, 0x70, 0x48, 0x23, + 0x34, 0xfa, 0xf1, 0x23, 0x23, 0x39, 0x1b, 0x3e, + 0x2f, 0x1e, 0x28, 0xa0, 0x28, 0x9f, 0x75, 0x37, + 0x8d, 0x86, 0x68, 0x79, 0x8d, 0x82, 0x82, 0xa7, + 0xa8, 0xa7, 0xf3, 0x83, 0xaa, 0x37, 0x8d, 0x46, + 0x8d, 0x5e, 0x5e, 0x8d, 0x5e, 0x68, 0x37, 0xa7, + 0x37, 0x9f, 0x28, 0xa8, 0x30, 0x76, 0x7d, 0x55, + 0x7e, 0x6a, 0x83, 0x6a, 0xaa, 0x5f, 0x9c, 0x74, + 0xc, 0x6c, 0x75, 0x46, 0x1f, 0x8d, 0x43, 0x8d, + 0x98, 0x32, 0x68, 0x43, 0x79, 0x75, 0x68, 0x75, + 0x8d, 0x28, 0x5e, + 0xbf, 0xd4, 0xec, 0x27, 0xc, 0xf7, 0x5e, 0x5e, + 0x1f, 0x37, 0x5e, 0x86, 0x5e, 0x6c, 0xe, 0x6c, + 0x28, 0xb7, 0xa0, 0x12, 0x2f, 0x5f, 0x5f, 0xa6, + 0x26, 0x73, 0xeb, 0x15, 0x3d, 0x16, 0xeb, 0x2a, + 0x6e, 0x54, 0x48, 0x15, 0x3b, 0x36, 0x99, 0x63, + 0x4d, 0x4d, 0x63, 0x85, 0x9a, 0x99, 0x97, 0x31, + 0x5d, 0x6a, 0x6a, 0x6a, 0x6f, 0x58, 0x5d, 0x6a, + 0x9a, 0x42, 0x85, 0x6f, 0x97, 0x99, 0xb0, 0x5d, + 0x6a, 0x6a, 0x81, 0x6a, 0x85, 0x59, 0x58, 0x5d, + 0x6f, 0x99, 0x66, 0x3a, 0x80, 0x90, 0x90, 0x71, + 0x58, 0x59, 0x4d, 0x80, 0x42, 0x3f, 0x3b, 0xf2, + 0x34, 0xee, 0xee, 0x16, 0xee, 0xeb, 0xd8, 0xcb, + 0xe0, 0xed, 0xd6, 0xd2, 0xc7, 0xc2, 0xd2, 0xdb, + 0xcc, 0xdd, 0xdd, 0xdd, 0x9f, 0xfc, 0x9f, 0xb6, + 0xfc, 0xf7, 0xdd, 0xbe, 0xbd, 0xc1, 0xc2, 0xc4, + 0xdb, 0xd1, 0xc4, 0xd2, 0xd2, 0xd6, 0xd7, 0xd7, + 0xed, 0xed, 0x23, 0xd8, 0xd0, 0xba, 0xcd, 0xc1, + 0xc1, 0xdd, 0xcd, 0xc2, 0xce, 0xe4, 0xe4, 0xc1, + 0xc2, 0xc1, 0xc2, 0xc4, 0xd2, 0xd1, 0xc4, 0xc4, + 0xd2, 0xbf, 0xec, 0xcc, 0xce, 0xdc, 0xf8, 0xcc, + 0xbe, 0xc2, 0xc2, 0xc4, 0xd2, 0xd2, 0xd1, 0xd5, + 0xc2, 0xe2, 0xf8, 0xf7, 0xdd, 0xdd, 0xcd, 0xce, + 0xc4, 0xc2, 0xc2, 0xc2, 0xd1, 0xd2, 0xe2, 0xce, + 0xc2, 0xce, 0xdc, 0xd1, 0xc4, 0xc4, 0xc4, 0xd2, + 0xd2, 0xd2, 0xc4, 0xd2, 0xc4, 0xd0, 0xcb, 0xe6, + 0xeb, 0xe6, 0xfa, 0xfa, 0x48, 0x54, 0x73, 0x3d, + 0x3d, 0x3b, 0x3b, 0x15, 0x3b, 0x3f, 0x2b, 0x48, + 0x9a, 0x6b, 0x5d, 0x6a, 0x6b, 0x71, 0x5d, 0x81, + 0x6b, 0x6b, 0x6b, 0x6f, 0x31, 0x71, 0x71, 0x90, + 0x9a, 0x71, 0x71, 0x6f, 0x85, 0x80, 0x9a, 0x85, + 0x59, 0x58, 0x71, 0x71, 0x58, 0x59, 0x71, 0x99, + 0x67, 0x9a, 0x99, 0x99, 0x73, 0x16, 0x3d, 0x15, + 0x15, 0x15, 0xfa, 0xd8, 0x15, 0xeb, 0x34, 0xf2, + 0xf2, 0xf2, 0xfa, 0x2a, 0x66, 0x5d, 0x60, 0x62, + 0x7e, 0x62, 0x76, 0x93, 0x94, 0x94, 0x60, 0x74, + 0x8f, 0x74, 0xf3, 0xa6, 0x7e, 0x8f, 0x76, 0x62, + 0x94, 0x55, 0x27, 0x6a, 0x97, 0x39, 0x39, 0x99, + 0x99, 0x85, 0x99, 0x99, 0x42, 0x36, 0x59, 0x63, + 0x80, 0x1d, 0x3f, 0x15, 0x15, 0x34, 0x48, 0x26, + 0x4a, 0x74, 0x76, 0x62, 0x98, 0x1e, 0x28, 0x98, + 0x8b, 0x79, 0x28, 0x55, 0x9c, 0x82, 0x76, 0x60, + 0x5d, 0x7e, 0x91, 0x94, 0x8f, 0x46, 0x12, 0x8f, + 0x8b, 0x5e, 0x8d, 0x46, 0x62, 0x8d, 0x79, 0x74, + 0x74, 0xe, 0x98, 0x8f, 0x8f, 0x46, 0x27, 0x5d, + 0x83, 0x7a, 0x5d, 0x90, 0x97, 0x97, 0x6a, 0x91, + 0x8f, 0x46, 0x30, 0x8f, 0x8d, 0x79, 0x75, 0x62, + 0x4b, 0x64, 0x32, 0x79, 0x98, 0x43, 0x28, 0x98, + 0x8b, 0x79, 0x32, + 0xfd, 0xb, 0x60, 0x2f, 0x9c, 0x7d, 0x76, 0x5e, + 0x82, 0x46, 0x76, 0x6c, 0x76, 0xa8, 0xc, 0x76, + 0x93, 0x74, 0x37, 0x82, 0x62, 0x74, 0xa8, 0x60, + 0x99, 0x73, 0x2b, 0x21, 0x15, 0x3d, 0xf2, 0x34, + 0xeb, 0xa, 0xf1, 0xeb, 0xf2, 0x48, 0x99, 0x85, + 0x71, 0x80, 0x99, 0x63, 0x36, 0x59, 0x9a, 0x58, + 0x80, 0x58, 0x5d, 0x85, 0x71, 0x71, 0x6f, 0x71, + 0x71, 0x71, 0x71, 0x85, 0x80, 0x99, 0x58, 0x71, + 0x71, 0x71, 0x81, 0x71, 0x71, 0x71, 0x71, 0x71, + 0x71, 0x71, 0x6b, 0x71, 0x80, 0x67, 0x59, 0x71, + 0x85, 0x67, 0x1d, 0x42, 0x48, 0x3f, 0x70, 0x73, + 0xf2, 0x3d, 0x16, 0x14, 0xee, 0xf2, 0xd8, 0x73, + 0xcb, 0xcb, 0xd6, 0xe0, 0xd3, 0xd2, 0xc4, 0xc4, + 0xc7, 0xdd, 0xdd, 0xfc, 0x9f, 0x9f, 0x9f, 0x7, + 0x9f, 0xb8, 0xc1, 0xc2, 0xc2, 0xd1, 0xd1, 0xc2, + 0xc7, 0xdc, 0xe7, 0xc4, 0xd1, 0xd6, 0xde, 0xd8, + 0xd6, 0xe0, 0xc9, 0xd0, 0xd4, 0xdc, 0xdd, 0xdd, + 0xdd, 0x7, 0xdc, 0xd5, 0xd1, 0xc1, 0xc1, 0xc2, + 0xc4, 0xd1, 0xc7, 0xc2, 0xc4, 0xd1, 0xe7, 0xe9, + 0xce, 0xba, 0x50, 0xec, 0xd2, 0xc7, 0xc7, 0xc2, + 0xd2, 0xd2, 0xd5, 0xd1, 0xc2, 0xd1, 0xe7, 0xe2, + 0xd1, 0xc1, 0xcd, 0xce, 0xd1, 0xc7, 0xc1, 0xc2, + 0xd1, 0xd1, 0xe7, 0xe2, 0xc1, 0xc2, 0xdc, 0xec, + 0xd5, 0xc7, 0xc2, 0xc2, 0xc4, 0xd3, 0xd2, 0xc4, + 0xd1, 0xc4, 0xd1, 0xe7, 0xd4, 0xd4, 0x3, 0xea, + 0xe6, 0xf5, 0x34, 0xeb, 0xeb, 0x73, 0xeb, 0x15, + 0x3b, 0x48, 0x3b, 0x15, 0x2e, 0x4d, 0x4d, 0x59, + 0x59, 0x71, 0x85, 0x9a, 0x90, 0x85, 0x9a, 0x63, + 0x6b, 0x6b, 0x81, 0x81, 0x58, 0x6b, 0x6b, 0x58, + 0x71, 0x5d, 0x99, 0x67, 0x9a, 0x58, 0x90, 0x31, + 0x59, 0x6b, 0x6b, 0x6b, 0x71, 0x4d, 0x80, 0x80, + 0x67, 0x99, 0x48, 0x15, 0x3d, 0x3d, 0x34, 0x15, + 0x2b, 0x23, 0x6e, 0xcb, 0xa, 0xeb, 0x15, 0xf2, + 0x16, 0x3d, 0xeb, 0xeb, 0x54, 0x6a, 0x5f, 0x76, + 0x62, 0x27, 0x82, 0x76, 0x8f, 0x74, 0xa1, 0x3e, + 0x74, 0x93, 0x76, 0x30, 0x7e, 0x62, 0x82, 0x82, + 0x94, 0x27, 0x3e, 0xaf, 0xb4, 0x39, 0x48, 0xfa, + 0x2a, 0x99, 0x63, 0x99, 0x39, 0x42, 0x4d, 0x99, + 0x80, 0x48, 0x48, 0x34, 0x3b, 0x48, 0x31, 0x3a, + 0x27, 0x82, 0x68, 0x8d, 0x98, 0x1f, 0x8d, 0x8d, + 0x9c, 0x5e, 0x28, 0x2c, 0xa8, 0x5e, 0x82, 0x76, + 0x62, 0x27, 0x8b, 0x62, 0x8d, 0x1f, 0x1f, 0x46, + 0x37, 0x68, 0x68, 0x8d, 0x1e, 0x68, 0x68, 0x8d, + 0x79, 0x1f, 0x46, 0x98, 0x43, 0xa7, 0x30, 0x11, + 0xaf, 0xa1, 0x60, 0x47, 0x4a, 0x4a, 0x6a, 0x62, + 0x8d, 0x5e, 0x8d, 0x8d, 0x5e, 0x6c, 0x6c, 0x68, + 0x89, 0x5f, 0x5e, 0x68, 0x68, 0x86, 0x75, 0x75, + 0x79, 0x4e, 0x86, + 0x3a, 0x5d, 0x74, 0x5f, 0x62, 0x7e, 0x74, 0x82, + 0x8f, 0x74, 0xa8, 0x1f, 0x62, 0x8f, 0x93, 0x76, + 0x7e, 0x62, 0x7d, 0x93, 0x8f, 0x6a, 0xaf, 0xb4, + 0x6e, 0x73, 0x54, 0x48, 0xeb, 0xeb, 0x73, 0x1, + 0x3d, 0x15, 0x15, 0x3d, 0x16, 0x3b, 0x34, 0x67, + 0x9a, 0x71, 0x9a, 0x71, 0x59, 0x59, 0x71, 0x71, + 0x63, 0x59, 0x58, 0x80, 0x80, 0x85, 0x71, 0x71, + 0x6b, 0x6b, 0x6b, 0x6b, 0x58, 0x59, 0x71, 0x6b, + 0x9a, 0x71, 0x85, 0x85, 0x80, 0x9a, 0x71, 0x71, + 0x71, 0x71, 0x81, 0x6b, 0x58, 0x63, 0x59, 0x58, + 0x9a, 0x70, 0x70, 0x3f, 0x3d, 0x70, 0x7f, 0x54, + 0x73, 0x15, 0x17, 0x15, 0x3d, 0x3d, 0xf5, 0xe6, + 0xd8, 0xd7, 0xd6, 0xe0, 0xe0, 0xdb, 0xc7, 0xc7, + 0xe2, 0xf0, 0xf7, 0xf7, 0x7, 0x9f, 0x9f, 0xcd, + 0xcd, 0xb8, 0xc1, 0xd1, 0xd2, 0xe7, 0xf3, 0xcd, + 0xc1, 0xdc, 0xec, 0xdb, 0xd2, 0xd3, 0xd7, 0xe6, + 0xe6, 0xd8, 0x5a, 0xe3, 0xbe, 0xf0, 0xdd, 0xdd, + 0xb8, 0xc1, 0xe2, 0xd2, 0xd2, 0xc4, 0xc2, 0xc4, + 0xd2, 0xdb, 0xe2, 0xc2, 0xc4, 0xd5, 0xec, 0xe7, + 0xc4, 0xc2, 0xd1, 0xd0, 0xd0, 0xd2, 0xc2, 0xd2, + 0xd2, 0xdb, 0xe7, 0xdc, 0xc2, 0xc2, 0xe7, 0xe7, + 0xd2, 0xc4, 0xc1, 0xc2, 0xd2, 0xd2, 0xd1, 0xc2, + 0xc2, 0xd1, 0xe7, 0xe2, 0xc7, 0xc2, 0xce, 0xe2, + 0xdb, 0xc4, 0xc2, 0xc4, 0xd2, 0xd6, 0xd9, 0xd1, + 0xc2, 0xd1, 0xd1, 0xec, 0xcc, 0xd1, 0xbf, 0xdb, + 0xcb, 0xe6, 0xa, 0x54, 0x2a, 0x15, 0x3d, 0x16, + 0x3d, 0x54, 0x16, 0x3b, 0x67, 0x99, 0x9a, 0x6a, + 0x5d, 0x5d, 0x81, 0x58, 0x6b, 0x6b, 0x9a, 0x7f, + 0x80, 0x6f, 0x6a, 0x4a, 0x5d, 0x5d, 0xb0, 0x6a, + 0x6b, 0x5d, 0x6f, 0x63, 0x58, 0x71, 0x58, 0x4d, + 0x71, 0x6b, 0x6a, 0x6f, 0x6b, 0x31, 0x99, 0x90, + 0x6f, 0x63, 0x99, 0x73, 0x16, 0x16, 0x15, 0x15, + 0xeb, 0xe6, 0xcb, 0xd6, 0xe0, 0xd8, 0xd7, 0xe1, + 0xf2, 0x15, 0x17, 0x34, 0x36, 0x3e, 0xa7, 0x28, + 0x37, 0x1f, 0x8, 0xb8, 0x6c, 0x28, 0xe, 0x5f, + 0x79, 0x5e, 0x6c, 0x28, 0x37, 0x5e, 0x6c, 0x7, + 0x28, 0x37, 0xba, 0xbf, 0x5a, 0x20, 0xfe, 0x23, + 0x70, 0x1d, 0x66, 0xf9, 0x3d, 0x34, 0x48, 0x54, + 0x54, 0xfa, 0xfa, 0xfa, 0xfa, 0xfe, 0x4a, 0x12, + 0x46, 0x5e, 0x68, 0x68, 0x6c, 0x68, 0x68, 0x6c, + 0x7, 0x68, 0xa3, 0x6c, 0x28, 0x5e, 0x86, 0x5e, + 0x5e, 0x28, 0x6c, 0x6c, 0x6c, 0x6c, 0x5e, 0x5e, + 0xb6, 0x5e, 0x86, 0x68, 0xa3, 0x4e, 0x4e, 0x5e, + 0x5e, 0x5e, 0x68, 0x32, 0xb8, 0xb8, 0x6c, 0xc, + 0xba, 0xf8, 0xe, 0x5f, 0x46, 0x76, 0x46, 0x1e, + 0x5e, 0x86, 0x68, 0x68, 0x9f, 0x7, 0x7, 0x5e, + 0x75, 0x32, 0x86, 0xa3, 0x68, 0x68, 0x68, 0x86, + 0x68, 0x68, 0xa3, + 0x4a, 0x83, 0x50, 0xa0, 0xa7, 0x60, 0x2c, 0x37, + 0x76, 0x8d, 0x37, 0x1f, 0x8d, 0x82, 0x82, 0x8d, + 0x46, 0x55, 0xc, 0xb6, 0x8b, 0xb3, 0xb, 0x3, + 0xa, 0x73, 0xeb, 0x15, 0x3b, 0x34, 0xd8, 0xe6, + 0x21, 0x3b, 0x3d, 0x16, 0x15, 0x3b, 0x21, 0x48, + 0x63, 0x6a, 0x5d, 0x58, 0x59, 0x59, 0x71, 0x6b, + 0x6b, 0x6b, 0x58, 0x80, 0x67, 0x59, 0x81, 0x81, + 0x5d, 0x6a, 0x91, 0x6a, 0x5d, 0x58, 0x6a, 0x6f, + 0x71, 0x81, 0x5d, 0x63, 0x4d, 0x9a, 0x5d, 0x5d, + 0x90, 0x6b, 0x91, 0x5d, 0x71, 0x5d, 0x31, 0x9a, + 0x99, 0x39, 0x48, 0x15, 0x3d, 0x3b, 0x41, 0x6e, + 0x16, 0x15, 0x15, 0x34, 0x73, 0xe6, 0xe6, 0xa, + 0xcb, 0xcb, 0xd0, 0xd2, 0xdb, 0xf0, 0xf3, 0xce, + 0xce, 0xe2, 0xe4, 0xcd, 0xbd, 0xf7, 0x9f, 0xdd, + 0xdd, 0xdd, 0xdd, 0xcd, 0xc7, 0xba, 0xdd, 0xbd, + 0xc2, 0xce, 0xd1, 0xc4, 0xc4, 0xc4, 0xd4, 0xd4, + 0xd0, 0xfd, 0x40, 0xf3, 0xdd, 0xcd, 0xb7, 0xc1, + 0xc2, 0xc2, 0xc4, 0xd2, 0xc4, 0xd1, 0xd5, 0xce, + 0xd1, 0xbf, 0xdc, 0xce, 0xc4, 0xd1, 0xdb, 0xd2, + 0xc4, 0xc4, 0xc4, 0xd1, 0xc4, 0xd2, 0xce, 0xe2, + 0xce, 0xd4, 0xcc, 0xbe, 0xc2, 0xd1, 0xc2, 0xc4, + 0xd1, 0xc2, 0xd1, 0xce, 0xe2, 0xbf, 0xdc, 0xcd, + 0xdc, 0xc4, 0xc7, 0xbe, 0xc2, 0xd1, 0xc4, 0xd1, + 0xc4, 0xd1, 0xc4, 0xbe, 0xd1, 0xc4, 0xd4, 0xcc, + 0xce, 0xc4, 0xc7, 0xbf, 0xc2, 0xd2, 0xd1, 0xd4, + 0xfd, 0x5a, 0xfe, 0x67, 0x39, 0x34, 0x16, 0x16, + 0x14, 0x15, 0x3d, 0x3b, 0x54, 0x6e, 0x3, 0x83, + 0x6a, 0x7e, 0x6a, 0x7e, 0x6a, 0x6a, 0x63, 0x23, + 0x36, 0x97, 0xcb, 0x7f, 0x90, 0x6f, 0x97, 0x6f, + 0x6a, 0x6a, 0x6a, 0x6a, 0x5d, 0x5d, 0x90, 0x9a, + 0x71, 0x6a, 0x41, 0x41, 0x90, 0x71, 0x5d, 0x20, + 0x58, 0x5d, 0x97, 0x54, 0x3b, 0x3d, 0x16, 0x16, + 0xf2, 0xf2, 0xd8, 0xd7, 0xcb, 0x3, 0xe0, 0xe6, + 0xfa, 0x21, 0x73, 0x54, 0x4d, 0x4a, 0xf8, 0xba, + 0xa7, 0x28, 0x28, 0xf7, 0x1e, 0x5e, 0x68, 0x68, + 0x28, 0xe, 0xfc, 0x7, 0xa8, 0x6c, 0xf7, 0xcd, + 0xe, 0xa7, 0x1e, 0x50, 0x5a, 0xfe, 0x99, 0x7f, + 0x21, 0x23, 0x39, 0x34, 0x15, 0x70, 0x2a, 0xfa, + 0x34, 0x2a, 0x99, 0x73, 0x2a, 0x67, 0x4a, 0x5f, + 0xa8, 0x28, 0xfc, 0xf7, 0xa0, 0x5e, 0x5e, 0x5e, + 0x37, 0x68, 0x5e, 0x5e, 0x8d, 0x28, 0xfc, 0x76, + 0xa8, 0xb8, 0xe, 0x12, 0xf8, 0x6c, 0x32, 0x8d, + 0x1f, 0x1f, 0x68, 0x79, 0x8d, 0x75, 0x1e, 0x46, + 0xa7, 0x6c, 0x82, 0x46, 0x12, 0xe, 0x37, 0x93, + 0x55, 0xf0, 0x11, 0x7e, 0x74, 0x9c, 0x55, 0x27, + 0xe, 0x8, 0x68, 0x93, 0x1f, 0x1f, 0x1f, 0x43, + 0x98, 0x75, 0x32, 0xfc, 0x5c, 0x75, 0x68, 0x8d, + 0x5c, 0x1f, 0x5e, + 0x2c, 0xc8, 0xbe, 0xb7, 0x6c, 0x28, 0x28, 0x32, + 0x9f, 0x68, 0x9f, 0x5e, 0x5e, 0x76, 0x9c, 0xa8, + 0x5e, 0xa7, 0xa0, 0xf7, 0x6c, 0xa7, 0xe, 0x50, + 0xfd, 0x34, 0x15, 0xf2, 0xf2, 0xe1, 0xde, 0xde, + 0xeb, 0xfa, 0xeb, 0x15, 0x2b, 0x42, 0x67, 0x4d, + 0x71, 0x6b, 0x83, 0x99, 0x99, 0x58, 0x97, 0x97, + 0x6a, 0x55, 0x6a, 0x6a, 0x6b, 0x81, 0x91, 0x6a, + 0x5d, 0x6a, 0x83, 0x99, 0xb4, 0x85, 0x83, 0x83, + 0xb0, 0x6a, 0x6a, 0x6b, 0x6b, 0x58, 0x5d, 0x90, + 0x90, 0x5d, 0x6a, 0x9a, 0x80, 0x6a, 0x6a, 0x9d, + 0x41, 0x31, 0xfe, 0x48, 0x3b, 0x3f, 0x23, 0xe6, + 0xeb, 0x16, 0xf2, 0xee, 0xde, 0xcb, 0xb, 0xb, + 0xd0, 0xdb, 0xec, 0xc4, 0xd2, 0xd1, 0xd1, 0xd2, + 0xc4, 0xc2, 0xcd, 0xce, 0xdc, 0xdd, 0x9f, 0x9f, + 0xf7, 0xdd, 0xdd, 0xdc, 0xc2, 0xc2, 0xc1, 0xc2, + 0xc2, 0xc2, 0xdc, 0xce, 0xc7, 0xe2, 0xc8, 0xcd, + 0xbe, 0xbe, 0xdc, 0xcc, 0xc2, 0xc2, 0xc2, 0xc4, + 0xd2, 0xc4, 0xc2, 0xce, 0xc2, 0xe2, 0xe2, 0xe2, + 0xd1, 0xc2, 0xc4, 0xd2, 0xd2, 0xc4, 0xc4, 0xc4, + 0xd2, 0xd2, 0xd5, 0xdc, 0xce, 0xc4, 0xd1, 0xd1, + 0xd1, 0xc2, 0xc2, 0xc4, 0xd2, 0xd2, 0xc7, 0xce, + 0xc2, 0xd2, 0xe2, 0xcd, 0xb8, 0xce, 0xc7, 0xe7, + 0xd1, 0xc2, 0xd1, 0xc4, 0xc4, 0xd2, 0xc7, 0xbd, + 0xcd, 0xc1, 0xe7, 0xe2, 0xdc, 0xc7, 0xc2, 0xd2, + 0xd9, 0xd4, 0xbf, 0xbf, 0xb, 0x5a, 0x5a, 0x90, + 0x83, 0x99, 0x54, 0x2a, 0xfa, 0x15, 0xf2, 0x16, + 0x3b, 0x15, 0x3d, 0x2b, 0x42, 0x21, 0x48, 0x67, + 0x6b, 0x81, 0x6f, 0x81, 0x5d, 0x81, 0x85, 0x85, + 0x58, 0x59, 0x59, 0x36, 0x58, 0x63, 0x42, 0x9a, + 0x71, 0x6b, 0x6f, 0x85, 0x63, 0x59, 0x80, 0x63, + 0x71, 0x58, 0x4d, 0x59, 0x71, 0x71, 0x90, 0x90, + 0x59, 0x71, 0x99, 0x7f, 0x70, 0x16, 0x17, 0x16, + 0x34, 0xfa, 0xfa, 0xeb, 0x54, 0x99, 0x3, 0xd8, + 0xde, 0xeb, 0x73, 0xa, 0x66, 0x3a, 0x1b, 0x27, + 0x74, 0x8b, 0x37, 0x1f, 0x62, 0x8b, 0x5e, 0xa7, + 0xaa, 0x62, 0x2f, 0xa6, 0x60, 0x74, 0x30, 0x30, + 0x8f, 0x8f, 0x5f, 0xb0, 0x6e, 0x54, 0x2a, 0x34, + 0xf5, 0x15, 0xeb, 0x15, 0x34, 0x67, 0x31, 0x1d, + 0x48, 0x42, 0x7f, 0xfa, 0x15, 0x23, 0x3a, 0x6a, + 0xa6, 0xa8, 0x46, 0x62, 0x62, 0x82, 0x86, 0x98, + 0x62, 0x8d, 0x79, 0x93, 0xaa, 0x5f, 0x5c, 0x74, + 0xb3, 0x2c, 0x30, 0x7e, 0x8f, 0x37, 0x8d, 0x8f, + 0x8f, 0x8d, 0x8d, 0x8b, 0x98, 0x6c, 0x38, 0x8f, + 0x8b, 0x8d, 0x82, 0x62, 0x62, 0x76, 0x93, 0x74, + 0xaa, 0xb, 0x83, 0x6a, 0x6a, 0x40, 0x7e, 0x7e, + 0x8b, 0x8d, 0x8d, 0x8f, 0x98, 0x8d, 0x79, 0x8f, + 0x8b, 0x79, 0x9f, 0x89, 0x8b, 0x79, 0x75, 0x89, + 0x8f, 0x79, 0x75, + 0x55, 0x55, 0x11, 0x12, 0x46, 0x8b, 0x76, 0x28, + 0x12, 0x46, 0xa7, 0x7, 0x93, 0x7e, 0x4a, 0x5f, + 0x62, 0x93, 0x46, 0x12, 0x55, 0x74, 0xa0, 0x50, + 0x5a, 0x54, 0x15, 0x34, 0x70, 0x2b, 0x15, 0x16, + 0x3b, 0x70, 0xf5, 0xf2, 0x15, 0x42, 0x80, 0x99, + 0x85, 0x58, 0x4d, 0x67, 0x80, 0x71, 0x31, 0x26, + 0x80, 0x71, 0x6f, 0x90, 0x58, 0x5d, 0x6a, 0x81, + 0x6b, 0x6b, 0x71, 0x67, 0x2e, 0x71, 0x90, 0x5a, + 0x7f, 0x58, 0x6b, 0x6b, 0x85, 0x71, 0x31, 0x99, + 0x80, 0x71, 0x71, 0x31, 0x59, 0x71, 0x6a, 0x90, + 0x23, 0x48, 0x67, 0x70, 0x3d, 0x3d, 0x3b, 0x2b, + 0x34, 0xf2, 0x3d, 0xf2, 0x16, 0x48, 0x90, 0x90, + 0x3, 0xed, 0xd0, 0xd3, 0xd2, 0xc4, 0xd2, 0xdb, + 0xd2, 0xc7, 0xcd, 0xdd, 0xf0, 0xf0, 0xf7, 0xdd, + 0xbd, 0xe2, 0xd5, 0xd1, 0xc2, 0xc2, 0xc1, 0xe2, + 0xcc, 0xcd, 0xdd, 0xdd, 0xdc, 0xd5, 0xf3, 0xbd, + 0xce, 0xc2, 0xd1, 0xd0, 0xd2, 0xd1, 0xc2, 0xe2, + 0xd2, 0xe7, 0xdc, 0xcd, 0xc7, 0xd1, 0xd1, 0xc4, + 0xc4, 0xc4, 0xd1, 0xd2, 0xd9, 0xd1, 0xc2, 0xdc, + 0xe2, 0xd4, 0xbe, 0xcd, 0xc1, 0xc4, 0xd2, 0xd9, + 0xd2, 0xc2, 0xc2, 0xd5, 0xe5, 0xd1, 0xc2, 0xcd, + 0xbd, 0xd1, 0xd5, 0xbe, 0xc1, 0xc2, 0xc4, 0xd1, + 0xd2, 0xc4, 0xc2, 0xce, 0xdc, 0xec, 0xe2, 0xb8, + 0xcd, 0xc1, 0xd5, 0xcc, 0xc2, 0xce, 0xce, 0xbf, + 0xbf, 0x41, 0x97, 0x90, 0x5d, 0x6f, 0x85, 0x85, + 0x9a, 0x54, 0xf2, 0xf2, 0xf2, 0x15, 0xf2, 0x3d, + 0x15, 0x34, 0x2b, 0x48, 0x63, 0x67, 0x42, 0x58, + 0x6b, 0x6f, 0x63, 0x6b, 0x81, 0x71, 0x85, 0x71, + 0x6b, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0x80, 0x63, + 0x71, 0x5d, 0x99, 0x9a, 0x71, 0x71, 0x71, 0x85, + 0x6b, 0x71, 0x71, 0x6b, 0x71, 0x6b, 0x9a, 0x99, + 0x63, 0x6f, 0x6f, 0x7f, 0x34, 0x3d, 0x16, 0xf2, + 0xeb, 0x39, 0xf9, 0xa, 0xea, 0xea, 0xe6, 0xd8, + 0xeb, 0x15, 0xeb, 0xfa, 0x7f, 0x27, 0x46, 0x82, + 0x62, 0x8d, 0x5e, 0x5e, 0x5f, 0x82, 0x28, 0xa7, + 0xa8, 0x46, 0x68, 0x1e, 0x9c, 0x82, 0x8d, 0x82, + 0x62, 0x9c, 0xa7, 0xa1, 0x6e, 0xa, 0xfa, 0x15, + 0x3d, 0x15, 0x15, 0x3b, 0x34, 0x42, 0x4d, 0x67, + 0x70, 0x3f, 0x34, 0x34, 0x34, 0x6e, 0x1b, 0x27, + 0x55, 0xa7, 0x5e, 0x8d, 0x8d, 0x5e, 0x5e, 0x5e, + 0x76, 0x7, 0x6c, 0x82, 0xa7, 0x7, 0x28, 0x82, + 0x5f, 0x28, 0x37, 0x46, 0x8d, 0x5e, 0x28, 0x8d, + 0x5e, 0x6c, 0x6c, 0x8d, 0x28, 0x5e, 0x68, 0x8d, + 0x28, 0x28, 0x5e, 0x8d, 0x82, 0x6c, 0xe, 0xe, + 0xb7, 0xcc, 0xe4, 0x52, 0x6a, 0x2f, 0x82, 0x8d, + 0x5e, 0xa3, 0x5e, 0x5e, 0x68, 0x7, 0x9f, 0xb8, + 0xe, 0x28, 0x5e, 0x9f, 0x75, 0x32, 0x32, 0x32, + 0x75, 0x68, 0x68, + 0x74, 0x94, 0x7e, 0x30, 0x8f, 0x8f, 0x9c, 0x37, + 0x55, 0x7e, 0x9c, 0xa8, 0x62, 0x94, 0x74, 0x7d, + 0x8f, 0x8f, 0x46, 0x2f, 0x6a, 0x74, 0x50, 0xbf, + 0xcb, 0xde, 0xeb, 0x15, 0x73, 0x23, 0x34, 0x16, + 0xf5, 0xf2, 0xf2, 0x14, 0x16, 0x70, 0x73, 0x54, + 0x99, 0x58, 0x59, 0x63, 0x71, 0x59, 0x71, 0x63, + 0x63, 0x71, 0x99, 0x48, 0x80, 0x71, 0x85, 0x71, + 0x71, 0x81, 0x6b, 0x71, 0x6b, 0x6b, 0x85, 0x7f, + 0x42, 0x71, 0x6b, 0x85, 0x90, 0x58, 0x71, 0x85, + 0x85, 0x6b, 0x71, 0x71, 0x71, 0x6b, 0x6b, 0x90, + 0x48, 0x48, 0x39, 0x34, 0xf2, 0xee, 0xeb, 0xeb, + 0x15, 0x15, 0x15, 0x16, 0x3d, 0x23, 0x66, 0x99, + 0xcb, 0xcb, 0xd6, 0xd6, 0xc4, 0xd1, 0xc7, 0xe3, + 0xcc, 0xce, 0xdd, 0xdd, 0xdd, 0xdd, 0xcd, 0xc1, + 0xc2, 0xc2, 0xc2, 0xd5, 0xd1, 0xce, 0xcd, 0xdd, + 0xf7, 0x7, 0xdd, 0xb8, 0xc1, 0xc2, 0xc2, 0xc2, + 0xc4, 0xc4, 0xc2, 0xc7, 0xc2, 0xc4, 0xce, 0xdd, + 0xce, 0xc2, 0xc2, 0xce, 0xc2, 0xc4, 0xc4, 0xd1, + 0xc4, 0xc4, 0xc4, 0xcc, 0xd5, 0xc4, 0xd5, 0xcd, + 0xcd, 0xc2, 0xc7, 0xce, 0xc2, 0xc4, 0xd1, 0xc4, + 0xd1, 0xd2, 0xd1, 0xcd, 0xcd, 0xce, 0xc1, 0xce, + 0xce, 0xc4, 0xc4, 0xc2, 0xc4, 0xc4, 0xc2, 0xc7, + 0xce, 0xc1, 0xce, 0xcd, 0xb8, 0xc1, 0xc2, 0xce, + 0xc1, 0xc2, 0xc4, 0xd1, 0xc4, 0xc4, 0xc7, 0xce, + 0xc8, 0xa6, 0x90, 0x6f, 0x6f, 0x90, 0x99, 0x5a, + 0x23, 0x15, 0x16, 0x16, 0xf2, 0xee, 0xf2, 0xf2, + 0xf2, 0x34, 0x15, 0x23, 0xfd, 0x90, 0x97, 0x58, + 0x58, 0x58, 0x5d, 0x6a, 0x7e, 0x6f, 0x90, 0x6f, + 0x6a, 0x90, 0x90, 0x6a, 0x5d, 0x71, 0x9a, 0x97, + 0x5d, 0x71, 0x59, 0x71, 0x6b, 0x71, 0x85, 0x31, + 0x5d, 0x81, 0x5d, 0x5d, 0x31, 0x58, 0x58, 0x56, + 0x90, 0x5d, 0xfd, 0xa, 0x34, 0xf2, 0x16, 0x16, + 0x15, 0xfa, 0xc0, 0xd6, 0xe0, 0xcb, 0xcb, 0xd8, + 0xcb, 0xfa, 0xfa, 0xfa, 0x26, 0x27, 0x28, 0x5e, + 0xe, 0xfc, 0x68, 0x7, 0xb8, 0x37, 0xfc, 0xfc, + 0x5e, 0x5e, 0x5e, 0xfc, 0xe, 0xfc, 0x5e, 0x9f, + 0xa7, 0xdd, 0xf8, 0xa1, 0xb4, 0x6e, 0x23, 0x2b, + 0x3b, 0x70, 0x34, 0x3d, 0x15, 0x21, 0x7f, 0x54, + 0x34, 0xeb, 0xfa, 0x2a, 0x2a, 0x5a, 0x50, 0x11, + 0x27, 0x28, 0x5e, 0x5e, 0x5e, 0xf7, 0x28, 0x5e, + 0x7, 0xb8, 0xfc, 0xfc, 0x28, 0x37, 0x5e, 0x5e, + 0xfc, 0xe, 0x28, 0x82, 0x76, 0x8, 0xe, 0x37, + 0x5e, 0x9f, 0xa3, 0x28, 0x28, 0x5e, 0x9e, 0x68, + 0x68, 0x1f, 0x37, 0x28, 0x6c, 0xdd, 0xf3, 0x12, + 0xa7, 0xf3, 0xaa, 0x27, 0x27, 0x27, 0x37, 0x5e, + 0x68, 0xfc, 0xe, 0x28, 0x68, 0x9f, 0x7, 0xdd, + 0x38, 0x1e, 0x32, 0x86, 0x68, 0x32, 0xfc, 0x43, + 0x75, 0x68, 0x32, + 0x5f, 0x7d, 0x82, 0xb7, 0xa7, 0x93, 0xa8, 0xf7, + 0x5f, 0x98, 0x1e, 0x28, 0x93, 0x98, 0x8d, 0x9f, + 0x9c, 0x9c, 0xa7, 0xb7, 0xc, 0xa8, 0xe4, 0xc9, + 0xcb, 0xe6, 0xf2, 0x15, 0xfa, 0x99, 0x7f, 0x15, + 0x3d, 0x3d, 0x14, 0x16, 0x3d, 0x3b, 0x2b, 0x48, + 0x85, 0x6b, 0x71, 0x6f, 0x58, 0x6b, 0x71, 0x6a, + 0x6b, 0x6a, 0x58, 0x36, 0x63, 0x85, 0x99, 0x99, + 0x85, 0x6a, 0x83, 0x83, 0x6a, 0x6a, 0x6a, 0x9a, + 0x80, 0x83, 0x5d, 0x71, 0x6f, 0x6a, 0x5d, 0x90, + 0x63, 0x5d, 0x81, 0x71, 0x71, 0x5d, 0x90, 0x63, + 0x99, 0x54, 0x2a, 0x15, 0x15, 0x14, 0xee, 0x16, + 0x16, 0xee, 0xf2, 0x3d, 0x15, 0xeb, 0xc9, 0xd7, + 0xe0, 0xd2, 0xd1, 0xdb, 0xdb, 0xd1, 0xcd, 0xcd, + 0xce, 0xd1, 0xd5, 0xc1, 0xc2, 0xc2, 0xd5, 0xe2, + 0xe2, 0xc2, 0xdc, 0xcd, 0xe2, 0xe2, 0xdc, 0xb8, + 0xbd, 0xc2, 0xc2, 0xd1, 0xc4, 0xd1, 0xd1, 0xd5, + 0xd5, 0xc4, 0xce, 0xcd, 0xc7, 0xd2, 0xd1, 0xce, + 0xc2, 0xc4, 0xd2, 0xd2, 0xc4, 0xd1, 0xc2, 0xce, + 0xe2, 0xd2, 0xd1, 0xc1, 0xbe, 0xd1, 0xd2, 0xd2, + 0xc2, 0xc4, 0xc4, 0xd1, 0xd2, 0xc2, 0xc4, 0xc7, + 0xec, 0xe7, 0xd2, 0xc1, 0xbd, 0xc2, 0xc4, 0xd2, + 0xc4, 0xd1, 0xc4, 0xd1, 0xe2, 0xe2, 0xce, 0xc1, + 0xdd, 0xe2, 0xd2, 0xcc, 0xc1, 0xc2, 0xc4, 0xd2, + 0xd2, 0xd1, 0xc4, 0xc2, 0xe2, 0xe7, 0xd2, 0xc5, + 0xc8, 0x40, 0x4, 0xcb, 0xa, 0x99, 0x73, 0xd8, + 0xea, 0xfa, 0xfa, 0x23, 0xeb, 0x14, 0x3d, 0x16, + 0xf2, 0xf2, 0xee, 0xf2, 0x73, 0xa, 0x5a, 0xfd, + 0x3a, 0x3a, 0x5d, 0x8e, 0x7e, 0x6a, 0x5d, 0x5d, + 0x5d, 0x7f, 0x63, 0x90, 0x5d, 0x85, 0x83, 0x6a, + 0x6a, 0x5d, 0x58, 0x6b, 0x6a, 0x6b, 0x58, 0x4d, + 0x3a, 0x90, 0x99, 0x41, 0x20, 0x4d, 0x58, 0x6a, + 0x5d, 0x5d, 0x4d, 0x42, 0x70, 0x70, 0x16, 0x16, + 0x16, 0xee, 0xd8, 0xe0, 0xe0, 0xf1, 0xed, 0x5a, + 0xb4, 0x5a, 0x23, 0x2a, 0x6e, 0x40, 0x28, 0x8, + 0xf3, 0x30, 0x5e, 0x68, 0x37, 0x76, 0x1f, 0x46, + 0x82, 0x82, 0x5e, 0x37, 0x2c, 0xb7, 0x9f, 0x28, + 0x2c, 0x11, 0x60, 0xa6, 0x41, 0x6e, 0xf1, 0x21, + 0x21, 0x70, 0x70, 0x3b, 0x3b, 0x15, 0xfa, 0x2b, + 0x15, 0xfa, 0x2a, 0xfa, 0x23, 0x41, 0x11, 0x27, + 0x55, 0xc, 0x6c, 0x5e, 0xa7, 0xe, 0x37, 0x8d, + 0x37, 0x6c, 0x5e, 0x46, 0x82, 0x5e, 0x5e, 0x82, + 0x74, 0xa6, 0xb3, 0x9c, 0x62, 0x2f, 0x30, 0x93, + 0x8d, 0x5e, 0x5e, 0x8d, 0x8d, 0x68, 0x32, 0x82, + 0x82, 0xe, 0xa0, 0x5f, 0x82, 0x28, 0x46, 0x8f, + 0x62, 0x46, 0x74, 0x91, 0x91, 0x74, 0xa8, 0x74, + 0x82, 0x5e, 0xe, 0x82, 0x5e, 0x86, 0x68, 0x82, + 0x7d, 0x8d, 0x68, 0x75, 0x8d, 0x32, 0x79, 0x89, + 0x76, 0x75, 0x86, + 0xf8, 0x28, 0xf7, 0xcd, 0xf7, 0xe, 0x1f, 0x6c, + 0x5e, 0x5e, 0x28, 0xe, 0x37, 0x68, 0x6c, 0xb8, + 0xf3, 0x12, 0xa0, 0xb7, 0xb8, 0x2f, 0xf0, 0x40, + 0x5a, 0xe6, 0xf2, 0xeb, 0xeb, 0xd8, 0xcb, 0xd8, + 0xeb, 0xf2, 0x16, 0x34, 0x34, 0x67, 0x36, 0x63, + 0x59, 0x83, 0x41, 0x99, 0x42, 0x26, 0x41, 0x83, + 0x6f, 0x6a, 0x71, 0x6b, 0x6a, 0x6a, 0x6f, 0x4d, + 0x63, 0x6f, 0x5a, 0x99, 0x9a, 0x90, 0x90, 0x90, + 0x90, 0x6f, 0x58, 0x58, 0x6b, 0x95, 0x6a, 0x58, + 0x4d, 0x58, 0x6f, 0x41, 0x9a, 0x6f, 0x58, 0x6f, + 0x3a, 0x63, 0x36, 0x22, 0x21, 0x3d, 0x16, 0x16, + 0x16, 0x14, 0x14, 0x16, 0xf2, 0xde, 0xf1, 0xf1, + 0xd3, 0xd2, 0xc7, 0xe7, 0xdb, 0xdb, 0xc7, 0xc2, + 0xc4, 0xd2, 0xdb, 0xd1, 0xdc, 0xc2, 0xe2, 0xf0, + 0xec, 0xc2, 0xc1, 0xcd, 0xd5, 0xdb, 0xc2, 0xc2, + 0xc2, 0xc4, 0xd2, 0xe7, 0xc7, 0xd1, 0xc2, 0xec, + 0xe5, 0xdb, 0xc2, 0xc1, 0xc2, 0xd2, 0xd2, 0xc4, + 0xc4, 0xc4, 0xc4, 0xe7, 0xcc, 0xc2, 0xc2, 0xce, + 0xe2, 0xd2, 0xc4, 0xc2, 0xc2, 0xc4, 0xd3, 0xd1, + 0xc7, 0xc1, 0xc2, 0xe2, 0xe4, 0xc7, 0xc2, 0xc2, + 0xc7, 0xd1, 0xd0, 0xc4, 0xc2, 0xc4, 0xd1, 0xd5, + 0xe4, 0xce, 0xc2, 0xce, 0xf0, 0xcc, 0xc2, 0xc2, + 0xc1, 0xc2, 0xd2, 0xd1, 0xc4, 0xc1, 0xd1, 0xd1, + 0xf0, 0xe4, 0xce, 0xce, 0xbe, 0xa1, 0x3, 0xcb, + 0x3, 0xa, 0xa, 0x73, 0xeb, 0xf2, 0xee, 0xf2, + 0xee, 0x15, 0x15, 0xfa, 0xf2, 0x14, 0x14, 0xf2, + 0x16, 0x3d, 0x3f, 0x3f, 0x21, 0x2b, 0x1d, 0x1c, + 0x23, 0x31, 0x5d, 0x6a, 0x6a, 0x81, 0x6b, 0x6b, + 0x6b, 0x71, 0x71, 0x6b, 0x71, 0x63, 0x9a, 0x6f, + 0x6b, 0x71, 0x6b, 0x85, 0x9a, 0x71, 0x58, 0x9a, + 0x99, 0x63, 0x59, 0x71, 0x71, 0x58, 0x63, 0x85, + 0x71, 0x71, 0x71, 0x99, 0x73, 0x73, 0xeb, 0x16, + 0x3d, 0xf2, 0x15, 0xfa, 0x54, 0x6e, 0xcb, 0xb4, + 0xcb, 0xcb, 0xa, 0x73, 0x39, 0x99, 0x55, 0x46, + 0x62, 0x8b, 0x8d, 0xfc, 0x8f, 0x8b, 0x82, 0x82, + 0xaa, 0xaa, 0xa7, 0x9c, 0x6a, 0xa8, 0x1f, 0x9c, + 0x7e, 0x74, 0x60, 0x90, 0x7f, 0x73, 0x15, 0x2b, + 0xf2, 0x3d, 0x15, 0x34, 0x70, 0x54, 0x1d, 0x1d, + 0x2e, 0x42, 0x2b, 0x3d, 0x2b, 0x48, 0x99, 0x5d, + 0x91, 0x60, 0x2c, 0x62, 0x8f, 0x93, 0x82, 0x8b, + 0x8f, 0x8d, 0x5e, 0x98, 0x8b, 0x7, 0xa8, 0x62, + 0x8f, 0xaa, 0xf8, 0x6a, 0x91, 0x98, 0x98, 0x62, + 0x8b, 0x1f, 0x82, 0x8b, 0x98, 0x7, 0xa0, 0x74, + 0x8b, 0x28, 0x5f, 0x62, 0x62, 0x82, 0x93, 0x8f, + 0x8f, 0xaa, 0x83, 0x6a, 0x94, 0xaa, 0x60, 0x6a, + 0x93, 0x5e, 0x8d, 0x8b, 0x46, 0x37, 0xfc, 0x7d, + 0x8f, 0x79, 0x32, 0xe, 0xab, 0x8d, 0x68, 0x32, + 0x7d, 0x8d, 0x75, + 0x60, 0x74, 0x76, 0xa7, 0x46, 0x62, 0x8b, 0x5e, + 0x7d, 0x8b, 0x93, 0xa7, 0xa6, 0x55, 0x82, 0xa0, + 0x74, 0x74, 0x82, 0x1e, 0x74, 0x74, 0x55, 0xa6, + 0xb4, 0x73, 0xf2, 0xf5, 0x15, 0xee, 0xee, 0xee, + 0xf2, 0x16, 0x3b, 0x21, 0x80, 0x80, 0x80, 0x67, + 0x7f, 0x85, 0x63, 0x63, 0x67, 0x42, 0x7f, 0x67, + 0x58, 0x31, 0x90, 0x5d, 0x6a, 0x6a, 0x6a, 0x71, + 0x85, 0x71, 0x59, 0x59, 0x71, 0x58, 0x80, 0x63, + 0x6b, 0x71, 0x63, 0x71, 0x71, 0x6b, 0x6b, 0x58, + 0x6f, 0x66, 0x63, 0x59, 0x5d, 0x6b, 0x6f, 0x85, + 0x58, 0x9a, 0x7f, 0x70, 0x34, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x3d, 0xee, 0xee, 0xde, 0xfa, + 0xcb, 0xd3, 0xc4, 0xc4, 0xd2, 0xc4, 0xd1, 0xc4, + 0xd1, 0xc4, 0xbf, 0xdc, 0xdc, 0xce, 0xcd, 0xce, + 0xce, 0xd2, 0xd1, 0xc2, 0xc2, 0xc4, 0xd2, 0xd1, + 0xd5, 0xd1, 0xc4, 0xe2, 0xe2, 0xc4, 0xd2, 0xd1, + 0xc4, 0xd2, 0xd2, 0xc4, 0xc4, 0xd1, 0xc4, 0xd1, + 0xe2, 0xd1, 0xc2, 0xce, 0xbe, 0xd1, 0xc4, 0xc2, + 0xc4, 0xc4, 0xc4, 0xd2, 0xd1, 0xc4, 0xc2, 0xc7, + 0xdc, 0xe2, 0xe2, 0xc1, 0xce, 0xc2, 0xc4, 0xc4, + 0xd1, 0xc4, 0xc4, 0xd1, 0xd5, 0xe2, 0xc2, 0xc1, + 0xcd, 0xe2, 0xd1, 0xc4, 0xc1, 0xc2, 0xd2, 0xc4, + 0xd1, 0xce, 0xc2, 0xc2, 0xdc, 0xe2, 0xe2, 0xc1, + 0xcd, 0xcd, 0xd5, 0xc4, 0xd1, 0xd0, 0xcb, 0xa, + 0xa, 0x6e, 0x54, 0xa, 0x2a, 0x15, 0x17, 0x15, + 0xf2, 0x3d, 0x15, 0x16, 0x14, 0x16, 0x14, 0xf2, + 0x3d, 0x1d, 0x63, 0x6f, 0x80, 0x42, 0x36, 0x1a, + 0x48, 0x48, 0x63, 0x4a, 0x58, 0x6f, 0x6b, 0x81, + 0x81, 0x71, 0x6b, 0x6b, 0x81, 0x6b, 0x5d, 0x5d, + 0x85, 0x9a, 0x58, 0x9a, 0x67, 0x63, 0x85, 0x6b, + 0x6b, 0x31, 0x59, 0x6b, 0x6b, 0x71, 0x9a, 0x4d, + 0x67, 0x9a, 0x90, 0x97, 0x7f, 0x1, 0x3b, 0x16, + 0x3d, 0x73, 0x23, 0x23, 0xe6, 0x3, 0xf4, 0xd0, + 0xcb, 0xe6, 0xa, 0x54, 0x66, 0x20, 0x4a, 0x2f, + 0x7d, 0x82, 0xa3, 0x1e, 0x2f, 0xa8, 0x5e, 0x76, + 0xaa, 0x60, 0x1f, 0x82, 0x98, 0x82, 0xfc, 0x27, + 0x9c, 0x9c, 0xb3, 0x40, 0x26, 0xfa, 0x34, 0x15, + 0x34, 0x15, 0x15, 0x48, 0x80, 0x99, 0x7f, 0x36, + 0x1d, 0x54, 0x73, 0x15, 0x15, 0x2b, 0x39, 0x85, + 0x7e, 0xa7, 0xe, 0x46, 0x8d, 0x5e, 0x5e, 0x82, + 0x12, 0x28, 0x7, 0x6c, 0x5e, 0xa0, 0xe, 0x8d, + 0x76, 0x37, 0x1f, 0x27, 0x27, 0x37, 0x5e, 0x76, + 0x1f, 0xe, 0xdd, 0x28, 0x86, 0x5e, 0xfc, 0x8d, + 0x68, 0x68, 0x5e, 0x1f, 0x46, 0x37, 0x37, 0xa7, + 0x76, 0x2c, 0x83, 0xac, 0x74, 0x82, 0x37, 0x30, + 0x28, 0x68, 0x5e, 0x8d, 0x28, 0x1f, 0x1f, 0xa7, + 0xa0, 0x5e, 0x68, 0x1e, 0x43, 0x68, 0x4e, 0x68, + 0x32, 0x1e, 0x32, + 0x9c, 0x94, 0x62, 0x46, 0x8f, 0x8f, 0x8b, 0x76, + 0xaa, 0x8f, 0x7d, 0xa7, 0x2c, 0x55, 0x2f, 0x8d, + 0x8f, 0x8b, 0x93, 0x37, 0xaa, 0x74, 0xaa, 0x50, + 0xc9, 0xea, 0x34, 0xeb, 0x54, 0x3b, 0x15, 0xf2, + 0x3d, 0x16, 0x48, 0x34, 0x73, 0x73, 0x99, 0x99, + 0x6e, 0x99, 0x63, 0x71, 0x71, 0x71, 0x2e, 0x4d, + 0x59, 0x63, 0x7f, 0x80, 0x9a, 0x9a, 0x6f, 0x71, + 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x6b, 0x71, 0x59, + 0x71, 0x80, 0x7f, 0x80, 0x71, 0x9a, 0x6b, 0x81, + 0x6b, 0x85, 0x4c, 0x58, 0x6b, 0x81, 0x6b, 0x6b, + 0x58, 0x7f, 0x73, 0x3d, 0x34, 0xf2, 0x14, 0x14, + 0xf2, 0x16, 0x14, 0x16, 0xf2, 0xf2, 0xeb, 0xeb, + 0xd8, 0xed, 0xd9, 0xd2, 0xc4, 0xc4, 0xd2, 0xe7, + 0xe2, 0xce, 0xce, 0xe2, 0xec, 0xd2, 0xc2, 0xc1, + 0xc2, 0xc4, 0xd2, 0xd1, 0xd1, 0xc2, 0xc4, 0xe2, + 0xec, 0xd1, 0xc2, 0xc2, 0xd1, 0xd9, 0xd2, 0xc4, + 0xc4, 0xc4, 0xd2, 0xd5, 0xce, 0xc1, 0xd1, 0xd1, + 0xec, 0xd5, 0xc4, 0xc2, 0xc2, 0xd1, 0xd2, 0xd2, + 0xc2, 0xc4, 0xc4, 0xdb, 0xe7, 0xf0, 0xce, 0xc2, + 0xe2, 0xe7, 0xd2, 0xc4, 0xc2, 0xd1, 0xd2, 0xd2, + 0xc4, 0xc2, 0xc7, 0xd1, 0xe7, 0xe4, 0xc1, 0xc2, + 0xce, 0xd5, 0xd2, 0xc4, 0xc4, 0xc2, 0xc4, 0xd2, + 0xec, 0xf3, 0xc1, 0xce, 0xe2, 0xf0, 0xbe, 0xc2, + 0xc2, 0xd1, 0xd3, 0xd0, 0xd2, 0xbf, 0xb4, 0xa, + 0xeb, 0xfa, 0x73, 0xde, 0x15, 0x17, 0x3b, 0x15, + 0xd8, 0x15, 0x17, 0x18, 0x16, 0x3d, 0x17, 0xf2, + 0xf2, 0x23, 0x90, 0x83, 0xaf, 0x39, 0x1c, 0x26, + 0xfe, 0x31, 0x5d, 0x58, 0x20, 0x67, 0x6a, 0x6a, + 0x6a, 0x4d, 0x5d, 0x7e, 0x6a, 0x6a, 0x6a, 0x6f, + 0x5d, 0x6a, 0x6a, 0x4a, 0x4d, 0x66, 0x85, 0x6a, + 0x6a, 0x5d, 0x5d, 0x81, 0xb0, 0x9a, 0x31, 0x63, + 0x3a, 0x3a, 0x6a, 0x5d, 0x99, 0x34, 0x16, 0x16, + 0xeb, 0xeb, 0xde, 0xd7, 0xe0, 0xd0, 0xbf, 0xc5, + 0xbf, 0xfd, 0xf9, 0x26, 0x69, 0xfd, 0x1b, 0xe, + 0x6c, 0xb6, 0x9f, 0x28, 0xa7, 0xdd, 0x9f, 0x68, + 0x5e, 0x1f, 0x5e, 0x5e, 0x68, 0x6c, 0x28, 0xe, + 0xa7, 0xb7, 0xba, 0x50, 0x7f, 0x73, 0xfa, 0x48, + 0x22, 0x17, 0x17, 0x3f, 0x36, 0x7f, 0x34, 0x2b, + 0x21, 0x54, 0xa, 0x34, 0x48, 0x23, 0xfe, 0x4a, + 0x55, 0x1e, 0x37, 0x37, 0x5e, 0x6c, 0x7, 0x6c, + 0x5e, 0xf7, 0x7, 0x6c, 0x86, 0x5e, 0x5e, 0x5e, + 0x5e, 0x28, 0x37, 0x12, 0x30, 0x28, 0xb8, 0x8, + 0x5e, 0x5e, 0x6c, 0x9f, 0x68, 0xa3, 0x68, 0x8d, + 0x68, 0x5e, 0x5e, 0x28, 0x37, 0x5e, 0xa0, 0xa8, + 0x76, 0x46, 0x46, 0x74, 0x74, 0x98, 0x93, 0x62, + 0x79, 0x68, 0x68, 0x6c, 0x5e, 0x5e, 0x5e, 0xf7, + 0xa0, 0x9f, 0x32, 0x32, 0x75, 0xa2, 0xa3, 0xa3, + 0x68, 0x68, 0x68, + 0x82, 0x62, 0x62, 0x12, 0xa8, 0x9c, 0x9c, 0x28, + 0x2c, 0x55, 0x98, 0xfc, 0x8d, 0x46, 0x12, 0x37, + 0x76, 0x76, 0x37, 0xf3, 0x3e, 0xb3, 0xc, 0xbc, + 0x5a, 0xe6, 0xde, 0xa, 0x6e, 0x54, 0x23, 0xfa, + 0x15, 0x3d, 0x34, 0x34, 0x15, 0x34, 0x54, 0x67, + 0x90, 0x31, 0x58, 0x6b, 0x6b, 0x81, 0x6b, 0x58, + 0x6b, 0x5d, 0x63, 0x59, 0x36, 0x7f, 0x99, 0x71, + 0x81, 0x91, 0x5d, 0x81, 0x81, 0x81, 0x6a, 0x5d, + 0x9a, 0x99, 0x42, 0x59, 0x71, 0x6b, 0x81, 0x81, + 0x81, 0x6a, 0x3a, 0x31, 0x5d, 0x6a, 0x83, 0x5d, + 0x90, 0x66, 0x42, 0x21, 0x3f, 0xf2, 0x14, 0x14, + 0xf2, 0xee, 0xff, 0x14, 0xf2, 0xeb, 0xe6, 0xe6, + 0xd7, 0xd6, 0xd9, 0xe7, 0xc7, 0xc2, 0xd2, 0xec, + 0xe4, 0xc1, 0xc4, 0xc4, 0xdb, 0xdb, 0xc4, 0xc2, + 0xd1, 0xd1, 0xdb, 0xe2, 0xcd, 0xdc, 0xc2, 0xc4, + 0xe7, 0xc4, 0xc4, 0xc4, 0xc4, 0xd3, 0xd3, 0xd3, + 0xd1, 0xd5, 0xd5, 0xec, 0xdc, 0xcd, 0xc2, 0xce, + 0xd2, 0xd2, 0xd1, 0xc4, 0xc2, 0xd1, 0xd2, 0xc7, + 0xce, 0xdc, 0xc7, 0xc4, 0xec, 0xdc, 0xce, 0xc2, + 0xc4, 0xd2, 0xd2, 0xc4, 0xc2, 0xe2, 0xd2, 0xdb, + 0xe2, 0xdc, 0xce, 0xc4, 0xd4, 0xd1, 0xc4, 0xd1, + 0xc2, 0xd1, 0xe7, 0xd2, 0xce, 0xce, 0xce, 0xd5, + 0xcc, 0xb8, 0xdd, 0xc2, 0xc2, 0xd1, 0xc4, 0xd1, + 0xc4, 0xd1, 0xd5, 0xd4, 0xc5, 0x40, 0x90, 0x6e, + 0xf2, 0xf2, 0xee, 0xe1, 0xe1, 0xeb, 0xf2, 0xfa, + 0xde, 0x22, 0x22, 0x1d, 0x3d, 0x14, 0x3d, 0xf2, + 0xf2, 0x34, 0xb4, 0xb4, 0x3, 0xfa, 0x23, 0xf9, + 0x67, 0x3a, 0x6a, 0x6a, 0x5d, 0x71, 0x4a, 0x4a, + 0x97, 0x99, 0x5d, 0x83, 0xb0, 0xb0, 0x6a, 0x5b, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6f, 0x63, 0x6f, 0x6f, + 0xb0, 0x6f, 0x6a, 0x6a, 0x99, 0x58, 0x5d, 0x4a, + 0x5d, 0x6a, 0x4a, 0x83, 0x99, 0x3f, 0x3d, 0x16, + 0xf2, 0xee, 0xeb, 0xea, 0xcb, 0xd0, 0xe4, 0xf3, + 0xf8, 0x58, 0x26, 0x36, 0x26, 0x99, 0x83, 0x5f, + 0xa7, 0xdd, 0x6c, 0x32, 0x79, 0x37, 0x5e, 0x5e, + 0x8d, 0x82, 0x5e, 0x82, 0x37, 0x7, 0xb8, 0xa7, + 0x5f, 0xf8, 0xf8, 0x60, 0x83, 0x6e, 0x73, 0x23, + 0x1d, 0x3f, 0x3b, 0x3b, 0x2b, 0x34, 0x15, 0x70, + 0x42, 0x73, 0xfa, 0x48, 0x67, 0x4d, 0x66, 0x58, + 0x6a, 0xa7, 0x7, 0xa7, 0x82, 0xa0, 0xdd, 0x28, + 0x8d, 0x68, 0x9e, 0x28, 0x82, 0x68, 0x5e, 0x76, + 0x9c, 0xa8, 0xba, 0xa6, 0x74, 0x37, 0xf3, 0x1e, + 0x8d, 0xa3, 0x68, 0x28, 0x28, 0x68, 0x5e, 0x76, + 0x76, 0x28, 0xc, 0xa8, 0x76, 0x82, 0x46, 0x55, + 0x62, 0x8f, 0x8f, 0x7e, 0x27, 0x62, 0x8f, 0x8f, + 0x7d, 0x82, 0x1f, 0x9c, 0x82, 0x86, 0x68, 0x43, + 0x30, 0x1f, 0x75, 0x75, 0x79, 0x79, 0x32, 0x43, + 0x89, 0x5e, 0x68, + 0xb8, 0xa7, 0xa7, 0xe, 0x2c, 0xa8, 0x5e, 0x6c, + 0x8d, 0x8d, 0x5e, 0x68, 0x7, 0x28, 0x37, 0x5e, + 0xb6, 0xdd, 0x9f, 0x28, 0x43, 0x6c, 0x6c, 0xf7, + 0xe5, 0xa, 0x34, 0xeb, 0xde, 0xd8, 0xde, 0xde, + 0xeb, 0xeb, 0x21, 0x26, 0x99, 0x67, 0x67, 0x90, + 0x58, 0x90, 0x63, 0x5d, 0x9a, 0x99, 0x83, 0x5d, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6b, 0x58, 0x71, 0x81, + 0x81, 0x83, 0xaf, 0x6a, 0x5d, 0xb0, 0x83, 0x81, + 0x6b, 0x5d, 0x6f, 0x6b, 0x6b, 0x81, 0x6a, 0x6a, + 0x85, 0x99, 0x54, 0x63, 0x71, 0x90, 0x58, 0x5d, + 0x81, 0x6b, 0x9a, 0x71, 0x42, 0x3d, 0x14, 0x14, + 0x16, 0x16, 0x16, 0x16, 0xf2, 0xeb, 0xe6, 0xf1, + 0xed, 0xdb, 0xd0, 0xc4, 0xe2, 0xd1, 0xc4, 0xc2, + 0xc2, 0xc4, 0xc4, 0xd1, 0xc7, 0xc7, 0xd1, 0xe2, + 0xdc, 0xcd, 0xc2, 0xce, 0xce, 0xc2, 0xd1, 0xc4, + 0xc4, 0xc4, 0xc4, 0xc4, 0xc4, 0xd2, 0xc4, 0xd2, + 0xe7, 0xce, 0xc2, 0xc2, 0xce, 0xc4, 0xc4, 0xc4, + 0xd1, 0xd1, 0xc2, 0xd1, 0xe2, 0xcd, 0xcd, 0xc2, + 0xe2, 0xe2, 0xc4, 0xc4, 0xd1, 0xc4, 0xd2, 0xd2, + 0xd1, 0xd1, 0xc4, 0xd2, 0xe2, 0xdc, 0xce, 0xc2, + 0xd1, 0xd2, 0xd1, 0xd1, 0xc4, 0xc4, 0xd1, 0xd2, + 0xc2, 0xce, 0xcd, 0xce, 0xd1, 0xdc, 0xcd, 0xc2, + 0xc2, 0xc2, 0xd1, 0xc2, 0xc2, 0xce, 0xce, 0xd5, + 0xd5, 0x50, 0x60, 0x50, 0xa1, 0x26, 0x6e, 0x73, + 0xeb, 0x3d, 0xee, 0x14, 0x16, 0x17, 0x21, 0x15, + 0x15, 0x23, 0x42, 0xfa, 0x16, 0x14, 0x17, 0x15, + 0x3b, 0x70, 0x54, 0x39, 0xfa, 0x34, 0x70, 0x15, + 0x1d, 0x42, 0x6b, 0x6a, 0x6b, 0x85, 0x71, 0x5d, + 0x6f, 0x5d, 0x6b, 0x4a, 0x90, 0x67, 0x71, 0x71, + 0x9a, 0x56, 0x4c, 0x5d, 0x90, 0x99, 0x63, 0x4c, + 0x63, 0x85, 0x6b, 0x6b, 0x31, 0x4d, 0x71, 0x81, + 0x81, 0x6b, 0x71, 0x9a, 0x48, 0x73, 0x34, 0x3d, + 0x16, 0x16, 0x70, 0x99, 0x39, 0x23, 0x40, 0x2c, + 0xb0, 0x9, 0xa, 0x39, 0x23, 0x20, 0x60, 0x5f, + 0x62, 0x27, 0x28, 0x8d, 0x8b, 0x62, 0x30, 0x62, + 0x8f, 0x9c, 0xa8, 0x2f, 0x27, 0x64, 0xa7, 0x93, + 0x7e, 0x7e, 0x27, 0x6a, 0x90, 0xa, 0x73, 0xfa, + 0xfa, 0x34, 0x73, 0x48, 0x1c, 0x2e, 0x42, 0x59, + 0x58, 0x48, 0x3f, 0xfa, 0x34, 0x73, 0x48, 0x26, + 0x58, 0x55, 0x5f, 0x74, 0x8f, 0x46, 0x82, 0x93, + 0x98, 0x5e, 0x28, 0x46, 0x93, 0x8d, 0x7, 0xa6, + 0x6a, 0x55, 0x6a, 0x91, 0x8f, 0x46, 0x30, 0x62, + 0x98, 0x68, 0x5e, 0x46, 0x46, 0x68, 0x6c, 0xaa, + 0x74, 0x30, 0x62, 0x8f, 0x8f, 0x8d, 0x62, 0x7e, + 0x94, 0x8f, 0xaa, 0xb0, 0x6f, 0x55, 0x7d, 0x74, + 0x93, 0x5e, 0x98, 0x8f, 0x8d, 0x79, 0x75, 0x79, + 0x62, 0x9c, 0x68, 0x79, 0x7d, 0x28, 0x1e, 0x8d, + 0x93, 0x75, 0x68, + 0x11, 0x83, 0x94, 0x94, 0x7e, 0x27, 0x62, 0x46, + 0x7d, 0x8f, 0x93, 0xe, 0x2f, 0xa6, 0x76, 0x6c, + 0x2f, 0x2f, 0x6c, 0x5e, 0x76, 0x62, 0x2f, 0xa8, + 0xb0, 0xcb, 0x73, 0x34, 0x15, 0x15, 0xeb, 0xf2, + 0x16, 0x16, 0x3f, 0x7f, 0x67, 0x99, 0x31, 0x3c, + 0x59, 0x85, 0x66, 0x63, 0x42, 0x48, 0x67, 0x71, + 0x9a, 0x80, 0x5d, 0x6a, 0x6b, 0x81, 0x6a, 0x5d, + 0x81, 0x9a, 0x63, 0x6b, 0x71, 0x67, 0x63, 0x6b, + 0x71, 0x9a, 0x63, 0x59, 0x71, 0x71, 0x85, 0x63, + 0x31, 0x42, 0x67, 0x63, 0x71, 0x4d, 0x63, 0x71, + 0x6b, 0x71, 0x9a, 0x4d, 0x4d, 0x3f, 0x16, 0x16, + 0x16, 0x18, 0x3d, 0x16, 0x16, 0xf2, 0xeb, 0xa, + 0x3, 0xc2, 0xd2, 0xd3, 0xd3, 0xd2, 0xc4, 0xd1, + 0xc4, 0xd1, 0xdb, 0xd5, 0xdd, 0xcd, 0xc2, 0xd5, + 0xec, 0xc2, 0xc2, 0xc4, 0xc4, 0xd2, 0xd1, 0xc4, + 0xc7, 0xd5, 0xd2, 0xdb, 0xc7, 0xce, 0xc4, 0xd2, + 0xd9, 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, 0xd2, 0xd1, + 0xc2, 0xcd, 0xe2, 0xd2, 0xe4, 0xcd, 0xc1, 0xd1, + 0xd2, 0xd2, 0xd2, 0xc4, 0xc2, 0xd1, 0xdb, 0xd2, + 0xce, 0xc1, 0xbe, 0xd2, 0xdb, 0xd2, 0xc2, 0xc4, + 0xc4, 0xd3, 0xd9, 0xc4, 0xc2, 0xce, 0xec, 0xd1, + 0xd5, 0xcd, 0xbd, 0xc2, 0xd2, 0xd2, 0xc7, 0xc4, + 0xc4, 0xd1, 0xe2, 0xe2, 0xce, 0xdd, 0xdd, 0xf0, + 0xec, 0xa6, 0xb0, 0xb4, 0xb4, 0x54, 0xeb, 0x1, + 0xeb, 0xee, 0xf2, 0xeb, 0x15, 0x22, 0x1c, 0x3b, + 0x15, 0x17, 0x3f, 0xf2, 0x14, 0x14, 0x16, 0x3b, + 0x2a, 0x7f, 0x99, 0x4d, 0x39, 0x1d, 0x23, 0x22, + 0x22, 0x4d, 0x71, 0x6a, 0x99, 0x9a, 0x71, 0x81, + 0x81, 0x81, 0x6a, 0x81, 0x58, 0x58, 0x71, 0x5d, + 0x67, 0x67, 0x56, 0x63, 0x99, 0x80, 0x71, 0x81, + 0x71, 0x6b, 0x6b, 0x6b, 0x58, 0x31, 0x3a, 0x4a, + 0x6b, 0x6a, 0x85, 0x9a, 0x70, 0x70, 0x15, 0xfa, + 0xf2, 0xf2, 0xea, 0xaf, 0x97, 0x5a, 0xbf, 0x50, + 0xb4, 0xa, 0xeb, 0x2a, 0x23, 0x41, 0x2f, 0x28, + 0x46, 0x82, 0x5e, 0x5e, 0x76, 0xa7, 0xb7, 0x37, + 0x93, 0x9c, 0xfc, 0x82, 0x46, 0x79, 0x5e, 0x76, + 0x7d, 0x5f, 0xb3, 0x50, 0xb4, 0x73, 0xeb, 0x34, + 0x15, 0x3d, 0x70, 0x1c, 0x42, 0x42, 0x1c, 0x42, + 0x4d, 0x39, 0x2a, 0xfa, 0x21, 0x3b, 0xfa, 0x67, + 0x6b, 0x62, 0x28, 0x8d, 0x93, 0x8d, 0x5e, 0x5e, + 0x5e, 0x68, 0x9f, 0xb8, 0x6c, 0x9f, 0x76, 0x5f, + 0x76, 0x82, 0x76, 0x76, 0x82, 0x5e, 0x5e, 0x6c, + 0x5e, 0x5e, 0x9f, 0x6c, 0x5e, 0x68, 0x5e, 0x37, + 0x68, 0x68, 0x8d, 0x82, 0x82, 0x5e, 0x5e, 0xa7, + 0xb7, 0xe, 0x2c, 0xf8, 0xa0, 0x28, 0x5e, 0x5e, + 0x68, 0x68, 0x68, 0x68, 0x9f, 0x5e, 0x5e, 0x68, + 0xa7, 0xb8, 0x9f, 0x5e, 0x5e, 0x32, 0x68, 0xa3, + 0x32, 0x32, 0xa3, + 0x4a, 0x81, 0x91, 0x94, 0x91, 0x81, 0x6a, 0x62, + 0x7e, 0xb3, 0x55, 0x30, 0x55, 0xaa, 0x76, 0x5e, + 0x30, 0x62, 0x79, 0x5e, 0x93, 0x74, 0x27, 0xa6, + 0xb0, 0x3, 0xd8, 0x73, 0xfa, 0x34, 0x34, 0x3b, + 0x16, 0x14, 0x3b, 0x48, 0x70, 0x2b, 0x48, 0x59, + 0x63, 0x99, 0x97, 0x58, 0x4d, 0x42, 0x4d, 0x71, + 0x9a, 0x7f, 0x63, 0x71, 0x71, 0x5d, 0x6a, 0x6a, + 0x81, 0x81, 0x6b, 0x6b, 0x71, 0x59, 0x71, 0x81, + 0x71, 0x99, 0x67, 0x59, 0x80, 0x99, 0x99, 0x59, + 0x71, 0x58, 0x85, 0x71, 0x6b, 0x58, 0x31, 0x71, + 0x71, 0x80, 0x99, 0x99, 0x99, 0x54, 0x16, 0xf2, + 0x16, 0x16, 0x14, 0x18, 0x16, 0xee, 0xf2, 0xe6, + 0xe0, 0xd2, 0xc4, 0xc4, 0xd0, 0xd2, 0xc4, 0xc2, + 0xce, 0xe2, 0xd4, 0xd4, 0xcd, 0xbd, 0xc7, 0xd2, + 0xd1, 0xd1, 0xc2, 0xd1, 0xd1, 0xe3, 0xd1, 0xc2, + 0xce, 0xce, 0xd1, 0xd2, 0xd1, 0xc2, 0xc4, 0xd2, + 0xd2, 0xd2, 0xc4, 0xc4, 0xc2, 0xe2, 0xbf, 0xc2, + 0xce, 0xcd, 0xbe, 0xd1, 0xd2, 0xc1, 0xc2, 0xc4, + 0xc4, 0xdb, 0xd1, 0xd1, 0xc4, 0xcd, 0xe4, 0xd1, + 0xc2, 0xce, 0xc4, 0xc4, 0xd2, 0xd2, 0xc4, 0xc4, + 0xd2, 0xdb, 0xdb, 0xdb, 0xd1, 0xce, 0xcd, 0xcc, + 0xd1, 0xc1, 0xc2, 0xc2, 0xc4, 0xc4, 0xd1, 0xd1, + 0xc1, 0xc1, 0xb7, 0xdd, 0xcd, 0xdd, 0xb8, 0xbd, + 0xbe, 0xd1, 0xbe, 0xbf, 0xd6, 0xcb, 0xeb, 0xee, + 0xe1, 0xe1, 0xf2, 0x15, 0xf5, 0x23, 0x23, 0x21, + 0xf2, 0x15, 0x15, 0x17, 0x16, 0x16, 0x3b, 0x34, + 0x34, 0x7f, 0x80, 0x97, 0xf9, 0x23, 0x1c, 0x1c, + 0x42, 0x58, 0x6a, 0x6a, 0x41, 0x71, 0x81, 0x7e, + 0x6a, 0x81, 0x91, 0x7e, 0x7e, 0x5d, 0x6a, 0x6f, + 0x90, 0x41, 0x90, 0x90, 0x67, 0x58, 0x81, 0x91, + 0x81, 0x71, 0x71, 0x5d, 0x5d, 0x80, 0x41, 0x1b, + 0x4a, 0x6a, 0x83, 0x85, 0x70, 0x3d, 0x3d, 0x34, + 0xf2, 0xf2, 0xe6, 0xe0, 0xd0, 0xd0, 0xbf, 0xc7, + 0xe5, 0xea, 0x34, 0xeb, 0x34, 0xfd, 0x11, 0x37, + 0x37, 0x37, 0x6c, 0x28, 0x37, 0x8, 0xa0, 0x6c, + 0x28, 0xfc, 0x28, 0x5e, 0x5e, 0x5e, 0x28, 0xfc, + 0xa7, 0x6c, 0xbe, 0xbf, 0xc9, 0x54, 0x70, 0x48, + 0x70, 0x3b, 0x21, 0x36, 0x7f, 0x34, 0x48, 0x23, + 0x1d, 0x54, 0xe6, 0x73, 0x34, 0x1d, 0x1d, 0x59, + 0x81, 0x8f, 0x76, 0x9c, 0x76, 0x5e, 0x9e, 0x7, + 0xfc, 0x5e, 0x9f, 0x8, 0x6c, 0x32, 0xfc, 0x68, + 0x76, 0x9f, 0x28, 0xe, 0xe, 0x5e, 0x9f, 0xb8, + 0x8, 0xfc, 0x86, 0x5e, 0x9f, 0xa3, 0x68, 0x28, + 0x5e, 0x68, 0x5e, 0xa7, 0xe, 0x5e, 0x5e, 0x7, + 0xf3, 0xe, 0x27, 0x2f, 0x28, 0x68, 0x5e, 0x1f, + 0x37, 0x68, 0x68, 0x68, 0xdd, 0xfc, 0xfc, 0x28, + 0x28, 0x28, 0x9f, 0x1e, 0xfc, 0x86, 0x68, 0xa3, + 0x32, 0x32, 0x32, + 0x46, 0x7e, 0x7e, 0x74, 0x94, 0x6a, 0x60, 0x37, + 0x9c, 0x55, 0x46, 0x82, 0x82, 0x8d, 0x68, 0x68, + 0x5e, 0xa7, 0x7, 0x5e, 0x6c, 0xc, 0xb7, 0xa0, + 0x50, 0xbf, 0x3, 0xea, 0xde, 0xeb, 0xeb, 0xfa, + 0x17, 0x16, 0x3d, 0x16, 0x16, 0x3f, 0x6e, 0x85, + 0x6b, 0x71, 0x6f, 0x6b, 0x71, 0x6b, 0x5d, 0x5d, + 0x5d, 0x67, 0x56, 0x5d, 0x97, 0x99, 0x83, 0x6a, + 0x6f, 0xb0, 0x6a, 0x91, 0x91, 0x91, 0x5d, 0x5d, + 0x71, 0x59, 0x9a, 0x63, 0x71, 0x48, 0x80, 0x71, + 0x81, 0x81, 0x81, 0x6b, 0x81, 0x6a, 0x90, 0x9a, + 0x63, 0x9a, 0x99, 0x80, 0xf9, 0x15, 0x16, 0x14, + 0x14, 0x16, 0x16, 0x3d, 0x3d, 0xf2, 0xde, 0xd8, + 0xd6, 0xd3, 0xd2, 0xc4, 0xc7, 0xcd, 0xe2, 0xd1, + 0xce, 0xbe, 0xc2, 0xc4, 0xc4, 0xd1, 0xc2, 0xd1, + 0xd1, 0xd1, 0xd1, 0xe2, 0xce, 0xcd, 0xc2, 0xd1, + 0xd5, 0xc2, 0xc4, 0xd2, 0xc4, 0xc4, 0xc4, 0xc4, + 0xc4, 0xd5, 0xe2, 0xd5, 0xce, 0xcd, 0xbd, 0xc4, + 0xd2, 0xc2, 0xc2, 0xc4, 0xc4, 0xd1, 0xd5, 0xd1, + 0xc2, 0xbe, 0xe2, 0xd2, 0xd2, 0xc1, 0xc1, 0xc4, + 0xc4, 0xc4, 0xd2, 0xc4, 0xc4, 0xd2, 0xd2, 0xd3, + 0xc4, 0xd1, 0xcc, 0xd2, 0xd2, 0xc4, 0xce, 0xc4, + 0xc4, 0xd2, 0xd1, 0xd1, 0xc2, 0xce, 0xe2, 0xf0, + 0xf0, 0xdd, 0x7, 0xbd, 0xc2, 0xd1, 0xc1, 0xc2, + 0xc2, 0xc2, 0xec, 0xec, 0xe3, 0x5a, 0xa, 0xee, + 0xee, 0xee, 0x14, 0xee, 0xf2, 0xe1, 0xf2, 0xde, + 0xeb, 0xfa, 0x1d, 0x1d, 0x22, 0x22, 0x15, 0xf2, + 0x15, 0xa, 0xa, 0xd8, 0xde, 0xeb, 0x34, 0x7f, + 0x3a, 0x81, 0x5b, 0x6a, 0x58, 0x71, 0x81, 0x6a, + 0x6a, 0x5d, 0x6a, 0x83, 0x83, 0x90, 0x83, 0x20, + 0x5d, 0x6f, 0x5d, 0x6a, 0x31, 0x71, 0x5d, 0x81, + 0x81, 0x58, 0x67, 0x31, 0x41, 0x41, 0x58, 0x3a, + 0x85, 0x5d, 0x83, 0x90, 0x7f, 0x3b, 0x15, 0xf2, + 0x16, 0x3d, 0xde, 0xe6, 0xf1, 0xe3, 0xc8, 0xf0, + 0x20, 0xf9, 0x54, 0x48, 0x1d, 0x1c, 0x20, 0x50, + 0x74, 0x8f, 0xa8, 0x12, 0x30, 0x82, 0x82, 0x68, + 0x1f, 0x30, 0x1f, 0x6c, 0x76, 0x9c, 0xf7, 0xf8, + 0x5f, 0xa7, 0xf3, 0x50, 0xfd, 0x23, 0x39, 0x7f, + 0x42, 0x1d, 0x48, 0x2a, 0x54, 0xfa, 0x2b, 0x15, + 0x2b, 0xeb, 0xfa, 0x73, 0x23, 0x23, 0x67, 0x85, + 0x6a, 0x7e, 0x7e, 0x60, 0xaa, 0x76, 0x76, 0xe, + 0x46, 0x28, 0x86, 0x8d, 0x8d, 0x28, 0x46, 0x9c, + 0x9c, 0x9c, 0xa9, 0x40, 0x3e, 0x6c, 0x79, 0x46, + 0x46, 0x28, 0x5e, 0x79, 0x68, 0x68, 0x28, 0x62, + 0xa7, 0xa7, 0x7d, 0x55, 0x3e, 0x1e, 0x82, 0x93, + 0x62, 0x30, 0x27, 0x62, 0x82, 0x5e, 0x8d, 0x62, + 0xa7, 0x6c, 0x5e, 0x98, 0x74, 0x30, 0x30, 0x8b, + 0x8f, 0x79, 0x32, 0x1f, 0x98, 0x43, 0x68, 0x79, + 0x89, 0x1f, 0x8d, + 0xa7, 0xc8, 0x50, 0x11, 0x60, 0x55, 0x5f, 0x5f, + 0xe, 0x1f, 0x9f, 0x5e, 0x5e, 0x28, 0xf7, 0x6c, + 0x5e, 0xa0, 0xdd, 0xdd, 0xfc, 0x6c, 0x6c, 0x6c, + 0xf0, 0x5a, 0xcb, 0xe0, 0xeb, 0x1, 0xde, 0xd8, + 0xeb, 0xeb, 0xe6, 0xa, 0x2a, 0x21, 0x31, 0x6a, + 0x5d, 0x58, 0x3a, 0x90, 0x99, 0x41, 0x97, 0x26, + 0x3c, 0x90, 0x6a, 0x6a, 0x71, 0x71, 0x6a, 0x6a, + 0x97, 0x67, 0x6a, 0x6a, 0x6f, 0x83, 0x83, 0x90, + 0x58, 0x71, 0x6a, 0x6b, 0x6a, 0x31, 0x59, 0x81, + 0x5d, 0x6a, 0x6f, 0x90, 0x5d, 0x83, 0xb0, 0x56, + 0x31, 0x31, 0x31, 0x63, 0x99, 0x3d, 0xff, 0xff, + 0xff, 0x14, 0x16, 0x18, 0xf2, 0xeb, 0xcb, 0xcb, + 0xe0, 0xe7, 0xe7, 0xd1, 0xbe, 0xbe, 0xd1, 0xd2, + 0xd2, 0xc4, 0xc2, 0xc4, 0xd3, 0xe7, 0xd1, 0xc2, + 0xc7, 0xe2, 0xec, 0xd5, 0xc2, 0xc1, 0xd1, 0xd3, + 0xd2, 0xd2, 0xc4, 0xc4, 0xd2, 0xdb, 0xdb, 0xd2, + 0xc2, 0xc7, 0xd5, 0xd9, 0xd2, 0xc2, 0xc2, 0xc4, + 0xd2, 0xd2, 0xc7, 0xc2, 0xc4, 0xe2, 0xf0, 0xe2, + 0xc2, 0xc1, 0xc2, 0xd2, 0xdb, 0xc4, 0xc4, 0xc4, + 0xd2, 0xd9, 0xdb, 0xd1, 0xc2, 0xd1, 0xe7, 0xdb, + 0xd2, 0xc4, 0xc2, 0xc4, 0xd2, 0xdb, 0xd2, 0xc7, + 0xc2, 0xd5, 0xec, 0xe4, 0xce, 0xbe, 0xf0, 0xf0, + 0xcc, 0xc1, 0xc1, 0xce, 0xc4, 0xd0, 0xe3, 0xba, + 0xdc, 0xba, 0x11, 0x1b, 0x41, 0xa, 0xf2, 0x16, + 0x14, 0x16, 0x14, 0x16, 0xf2, 0xf2, 0xee, 0x16, + 0x17, 0x23, 0x15, 0x23, 0x17, 0x3b, 0x16, 0x3d, + 0xf2, 0x48, 0x70, 0x3d, 0x3d, 0x3b, 0x3b, 0x3f, + 0x80, 0x6b, 0x6a, 0x5d, 0x6b, 0x6b, 0x6b, 0x81, + 0x6b, 0x6b, 0x6b, 0x71, 0x71, 0x71, 0x71, 0x9a, + 0x58, 0x85, 0x71, 0x71, 0x71, 0x6b, 0x6b, 0x6b, + 0x71, 0x63, 0x4d, 0x26, 0x31, 0x58, 0x6a, 0x6a, + 0x6f, 0x85, 0x80, 0x99, 0x73, 0x34, 0xeb, 0xf2, + 0xeb, 0x15, 0xeb, 0x15, 0x2a, 0x41, 0x50, 0x50, + 0x5a, 0x23, 0xfa, 0xfa, 0x48, 0x31, 0x6f, 0x5d, + 0x91, 0x91, 0x94, 0x94, 0x94, 0x94, 0x62, 0x9c, + 0x8f, 0x62, 0xa8, 0xa9, 0x74, 0x8b, 0x82, 0x9c, + 0x8f, 0x8f, 0x9c, 0x83, 0x6e, 0x73, 0x73, 0xeb, + 0x34, 0x34, 0xeb, 0xfa, 0x21, 0x1a, 0x42, 0x36, + 0x48, 0x21, 0x48, 0x73, 0x3d, 0x15, 0x2b, 0x2a, + 0x99, 0x6f, 0x6a, 0x6a, 0x81, 0x91, 0x8f, 0x8f, + 0x8f, 0x8d, 0x8d, 0x93, 0x8f, 0x82, 0x76, 0xa6, + 0xb0, 0xa9, 0x9c, 0x7e, 0x62, 0x8d, 0x1f, 0x8b, + 0x98, 0x79, 0x68, 0x8d, 0x46, 0x68, 0x5e, 0x98, + 0x74, 0x2f, 0x62, 0x8f, 0x8f, 0x8d, 0x1f, 0x62, + 0x74, 0x37, 0x82, 0x62, 0xaa, 0x37, 0x8d, 0x8b, + 0x79, 0x8d, 0x46, 0x8b, 0x98, 0x8d, 0x82, 0x98, + 0x62, 0x5f, 0x9f, 0x8d, 0x98, 0x82, 0x8, 0x79, + 0x79, 0x75, 0x86, + 0x9c, 0x6a, 0x4a, 0x4a, 0x5d, 0x91, 0x7e, 0x62, + 0x7e, 0x7e, 0x9c, 0x86, 0x8b, 0x74, 0x50, 0xa7, + 0x46, 0x8f, 0x46, 0x46, 0x62, 0x8f, 0x76, 0xa7, + 0xad, 0x41, 0xcb, 0xa, 0xeb, 0xf2, 0xf2, 0x15, + 0x15, 0xeb, 0xe6, 0x2a, 0x2b, 0x42, 0x9a, 0x85, + 0x71, 0x58, 0x99, 0x67, 0x1d, 0x42, 0x31, 0x39, + 0x7f, 0x99, 0x6f, 0x6a, 0x71, 0x6b, 0x81, 0x6a, + 0x71, 0x71, 0x85, 0x4c, 0x9a, 0x58, 0x6b, 0x6f, + 0x80, 0x58, 0x6b, 0x6b, 0x81, 0x71, 0x58, 0x85, + 0x71, 0x6b, 0x6b, 0x6b, 0x6b, 0x59, 0x58, 0x85, + 0x67, 0x42, 0x63, 0x80, 0x70, 0x3d, 0x3d, 0x16, + 0x14, 0xff, 0x14, 0x14, 0x3d, 0x15, 0x73, 0xcb, + 0xd0, 0xe5, 0xd4, 0xc4, 0xc4, 0xc7, 0xc4, 0xd2, + 0xc4, 0xc4, 0xd5, 0xc2, 0xd1, 0xe4, 0xdc, 0xc2, + 0xc2, 0xc7, 0xd4, 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, + 0xc4, 0xd2, 0xd1, 0xdb, 0xd1, 0xd1, 0xe3, 0xc4, + 0xd1, 0xc4, 0xd2, 0xd2, 0xd2, 0xc4, 0xd1, 0xd1, + 0xc4, 0xce, 0xdc, 0xdc, 0xc7, 0xc7, 0xc7, 0xc2, + 0xd1, 0xc4, 0xc4, 0xd2, 0xc4, 0xd1, 0xd5, 0xd5, + 0xc4, 0xd2, 0xe7, 0xe7, 0xd1, 0xc4, 0xc4, 0xd2, + 0xd9, 0xd2, 0xd2, 0xd1, 0xd1, 0xcc, 0xba, 0xdc, + 0xce, 0xc7, 0xc8, 0xba, 0xc2, 0xbf, 0xcc, 0xce, + 0xc2, 0xc1, 0xc1, 0xbd, 0xbe, 0xc7, 0x50, 0xf0, + 0xf3, 0xba, 0xa6, 0xa1, 0xcb, 0xeb, 0xee, 0xee, + 0x16, 0xf2, 0x3d, 0x17, 0x21, 0x21, 0x17, 0x17, + 0x17, 0x3b, 0x17, 0x3d, 0x16, 0xee, 0x14, 0x3d, + 0x3f, 0x54, 0x54, 0x3f, 0x2e, 0x36, 0x48, 0x48, + 0x42, 0x71, 0x6f, 0x67, 0x71, 0x6b, 0x71, 0x71, + 0x6b, 0x81, 0x81, 0x81, 0x59, 0x71, 0x71, 0x63, + 0x63, 0x80, 0x99, 0x99, 0x59, 0x6b, 0x6b, 0x59, + 0x59, 0x71, 0x6b, 0x71, 0x31, 0x58, 0x27, 0x8e, + 0x6f, 0x9a, 0x7f, 0x34, 0x3d, 0x34, 0xeb, 0x34, + 0x34, 0x23, 0xa, 0xcb, 0x39, 0xfd, 0xe5, 0xd0, + 0xcb, 0xde, 0x15, 0x15, 0x48, 0x58, 0x55, 0x74, + 0x4a, 0x5d, 0x6a, 0x7e, 0x94, 0x62, 0x2c, 0xa6, + 0x9c, 0x76, 0x7, 0xe, 0x30, 0x8d, 0x5e, 0x76, + 0x82, 0xe, 0x2c, 0x50, 0xe6, 0x34, 0x15, 0xf2, + 0x15, 0x34, 0x48, 0x34, 0x21, 0x42, 0x4d, 0x80, + 0x7f, 0x42, 0x21, 0xf5, 0x3d, 0x3b, 0x15, 0x2b, + 0x54, 0x80, 0x5d, 0x95, 0x6a, 0x27, 0x30, 0x5c, + 0x9c, 0x5e, 0x5e, 0xe, 0xc, 0x6c, 0x28, 0xa8, + 0x27, 0x27, 0x1e, 0x93, 0x8d, 0x28, 0x1f, 0x82, + 0x6c, 0xa3, 0x68, 0x37, 0x37, 0x5e, 0x5e, 0x68, + 0x37, 0xe, 0x30, 0x98, 0xfc, 0x9f, 0x28, 0x12, + 0xb7, 0xba, 0x7, 0x28, 0xe, 0x37, 0x4e, 0x75, + 0x4e, 0x5e, 0x1f, 0x8d, 0x5e, 0x9f, 0xb6, 0x8, + 0x1f, 0x2f, 0x8, 0x68, 0x75, 0x86, 0xfc, 0x32, + 0x75, 0x4e, 0x68, + 0x55, 0x7e, 0x6a, 0x90, 0x6a, 0x81, 0x6a, 0x91, + 0x7e, 0x7e, 0xa9, 0xa7, 0x98, 0x8f, 0x5f, 0x5e, + 0x98, 0x8f, 0x76, 0x79, 0x93, 0x8f, 0xa4, 0xa9, + 0xaa, 0xaf, 0xd0, 0xcb, 0x34, 0x21, 0xf2, 0x16, + 0x14, 0x16, 0x3d, 0x3d, 0x3d, 0x70, 0x99, 0x90, + 0x71, 0x71, 0x9a, 0x63, 0x4d, 0x59, 0x71, 0x80, + 0x1d, 0x7f, 0x9a, 0x85, 0x80, 0x85, 0x6f, 0x90, + 0x5d, 0x6b, 0x81, 0x71, 0x71, 0x71, 0x6a, 0x71, + 0x67, 0x9a, 0x71, 0x85, 0x6f, 0x6b, 0x9a, 0x9a, + 0x59, 0x6b, 0x81, 0x6b, 0x6b, 0x6b, 0x71, 0x58, + 0x7f, 0x3f, 0x7f, 0x70, 0x70, 0x3d, 0x3d, 0x14, + 0x16, 0x14, 0x17, 0x16, 0x3d, 0xf5, 0xfa, 0xcb, + 0xbf, 0xc2, 0xd1, 0xd2, 0xc4, 0xc4, 0xc7, 0xc2, + 0xd1, 0xe2, 0xe2, 0xc7, 0xc2, 0xcd, 0xce, 0xd2, + 0xd1, 0xc2, 0xc4, 0xc4, 0xd1, 0xd2, 0xd5, 0xc2, + 0xd1, 0xd5, 0xe7, 0xdb, 0xc4, 0xc4, 0xc2, 0xd2, + 0xd3, 0xd2, 0xc2, 0xc4, 0xc4, 0xd1, 0xec, 0xdc, + 0xce, 0xc1, 0xdc, 0xe2, 0xc4, 0xc4, 0xc2, 0xd1, + 0xc4, 0xc4, 0xd5, 0xce, 0xc1, 0xd1, 0xec, 0xe2, + 0xd1, 0xc2, 0xd1, 0xdb, 0xd9, 0xd2, 0xc4, 0xd1, + 0xc4, 0xdb, 0xec, 0xf3, 0xcd, 0xce, 0xdc, 0xba, + 0xce, 0xc2, 0xc2, 0xc2, 0xd2, 0xd2, 0xd1, 0xcd, + 0xcd, 0xcd, 0x7, 0x7, 0xcd, 0xc1, 0xce, 0xe9, + 0xe7, 0xbf, 0xbf, 0xc2, 0xd3, 0xde, 0xee, 0x14, + 0xee, 0xee, 0x16, 0x17, 0x1d, 0x48, 0x70, 0x21, + 0x34, 0x15, 0xee, 0x15, 0x16, 0x14, 0x16, 0x3d, + 0x54, 0x5a, 0xea, 0xa, 0x4d, 0x97, 0x41, 0x67, + 0x31, 0x71, 0x85, 0x90, 0x71, 0x71, 0x80, 0x63, + 0x5d, 0x6a, 0x6a, 0x6a, 0x5d, 0x71, 0x5d, 0x6a, + 0x5d, 0x63, 0x31, 0x80, 0x71, 0x6b, 0x58, 0x31, + 0x85, 0x71, 0x6a, 0x83, 0x4a, 0x4a, 0x6a, 0x5b, + 0x6a, 0x85, 0x26, 0x54, 0x34, 0x34, 0xeb, 0x15, + 0xfa, 0x6e, 0xd6, 0xd0, 0xd0, 0xfd, 0xdb, 0xd0, + 0xcb, 0xea, 0xeb, 0xeb, 0x2a, 0x20, 0xa8, 0xe, + 0xf0, 0x1b, 0x11, 0xba, 0xa8, 0x5f, 0x12, 0x12, + 0xa7, 0x68, 0x68, 0x28, 0x1f, 0x37, 0x5e, 0x9f, + 0x7, 0xe, 0xf8, 0xbf, 0xc9, 0xfa, 0x23, 0x15, + 0x3d, 0x2b, 0x21, 0x15, 0x15, 0x34, 0x36, 0x54, + 0x54, 0xa, 0x23, 0xfa, 0x15, 0x34, 0x1d, 0x36, + 0x1d, 0x7f, 0x85, 0x6f, 0x85, 0x63, 0x55, 0x9c, + 0xb5, 0x37, 0x28, 0x46, 0xa7, 0x5e, 0x76, 0x37, + 0xe, 0x46, 0x37, 0x76, 0xa7, 0x8, 0x1e, 0x37, + 0x6c, 0x9f, 0x68, 0x68, 0x37, 0x68, 0x86, 0x68, + 0x82, 0x46, 0x93, 0x76, 0x7, 0xb8, 0x6c, 0xe, + 0xf7, 0xdd, 0x9f, 0x5e, 0x28, 0x28, 0x5e, 0x86, + 0x75, 0x86, 0x68, 0x8d, 0x9f, 0xb8, 0xdd, 0x8, + 0x5c, 0x5c, 0x9f, 0x32, 0x68, 0x68, 0x5e, 0x75, + 0x68, 0x68, 0x68, + 0x27, 0x60, 0xb3, 0x7a, 0x4a, 0x90, 0xaf, 0xa6, + 0x9c, 0x93, 0x37, 0x37, 0x1f, 0x8d, 0x68, 0x68, + 0x28, 0x46, 0x9f, 0x9f, 0x6c, 0xa7, 0xc8, 0xc8, + 0x2c, 0xc8, 0xbf, 0xe0, 0x26, 0x39, 0x73, 0x15, + 0x14, 0x14, 0x14, 0x16, 0x3d, 0x34, 0x73, 0x6e, + 0x9a, 0x5d, 0x6a, 0x5d, 0x31, 0x31, 0x6a, 0x83, + 0x63, 0x31, 0x4d, 0x26, 0x7f, 0x6f, 0x6a, 0x97, + 0x90, 0x6a, 0x6a, 0x6a, 0x6a, 0x5d, 0x6a, 0xb0, + 0x99, 0x31, 0x5d, 0x63, 0x85, 0x6a, 0x91, 0x6a, + 0x63, 0x31, 0x6a, 0x81, 0x81, 0x5d, 0x3a, 0x99, + 0x70, 0x42, 0x67, 0x48, 0x3d, 0x3b, 0x3d, 0x16, + 0x14, 0x16, 0x3b, 0x3b, 0xeb, 0x15, 0xe6, 0xe0, + 0xd2, 0xd1, 0xd1, 0xd2, 0xdb, 0xec, 0xdc, 0xc2, + 0xc2, 0xd2, 0xd5, 0xd2, 0xc4, 0xc4, 0xc2, 0xdb, + 0xd2, 0xd1, 0xce, 0xce, 0xd2, 0xe7, 0xe4, 0xce, + 0xc4, 0xc4, 0xd3, 0xd9, 0xd2, 0xc4, 0xc4, 0xd2, + 0xd3, 0xd2, 0xd1, 0xc7, 0xc4, 0xd9, 0xe7, 0xc2, + 0xc4, 0xc4, 0xc4, 0xd2, 0xd3, 0xd2, 0xc2, 0xd1, + 0xd1, 0xdb, 0xdc, 0xcd, 0xc1, 0xc4, 0xd2, 0xdb, + 0xd2, 0xd2, 0xc4, 0xd0, 0xd0, 0xd5, 0xcc, 0xf3, + 0x2c, 0xf0, 0xa6, 0xdd, 0xb7, 0xbd, 0xbe, 0xcc, + 0xce, 0xc2, 0xc7, 0xc7, 0xcc, 0xe7, 0xe4, 0xdd, + 0xf7, 0x9f, 0xb8, 0xb8, 0xc1, 0xc2, 0xc4, 0xd2, + 0xdb, 0xd2, 0xbf, 0x6, 0xed, 0xeb, 0x16, 0x16, + 0xee, 0x16, 0x16, 0x15, 0x15, 0xf2, 0x15, 0xde, + 0xfa, 0x48, 0x23, 0x1a, 0x21, 0x17, 0x16, 0x3d, + 0x34, 0x73, 0x1, 0x15, 0x26, 0x5a, 0x3, 0x90, + 0x6a, 0x6b, 0x6a, 0x6a, 0x6b, 0x71, 0x9a, 0x4d, + 0x85, 0x85, 0x99, 0x5a, 0x59, 0x58, 0x85, 0x6f, + 0x81, 0x6b, 0x71, 0x6b, 0x58, 0x71, 0x80, 0x8a, + 0xfe, 0x99, 0xb4, 0xb4, 0x6a, 0x5d, 0x6a, 0x6a, + 0x6a, 0x71, 0x59, 0x42, 0x3b, 0x15, 0xf2, 0x3d, + 0xf2, 0xde, 0xd8, 0xd6, 0xcb, 0x1b, 0x40, 0x50, + 0xb, 0x5a, 0xa, 0xeb, 0xfa, 0x26, 0x50, 0xbf, + 0xe5, 0x1b, 0xec, 0xe5, 0xa1, 0x74, 0x7d, 0x62, + 0x98, 0x46, 0x5e, 0x82, 0x7d, 0x82, 0x28, 0x7, + 0xa6, 0xa8, 0x87, 0xa1, 0x3, 0x1c, 0x1c, 0x15, + 0x3b, 0x21, 0x22, 0x17, 0x3d, 0x17, 0x34, 0xeb, + 0xeb, 0x48, 0x23, 0x34, 0x3f, 0x1c, 0x36, 0x36, + 0x7f, 0x42, 0x26, 0x66, 0x99, 0x63, 0x81, 0x7e, + 0x6a, 0x55, 0x74, 0x8b, 0x93, 0x82, 0x76, 0x8f, + 0x9c, 0xa8, 0xa7, 0x74, 0x60, 0xc, 0x76, 0x82, + 0x82, 0x28, 0x5e, 0x8d, 0x98, 0x8d, 0x5e, 0x62, + 0x8f, 0xb3, 0xaa, 0x74, 0x30, 0xa0, 0x28, 0x98, + 0x8d, 0x28, 0x28, 0x98, 0x8d, 0x86, 0x68, 0x79, + 0x79, 0x6c, 0x5e, 0x98, 0x82, 0x37, 0xe, 0x7d, + 0x8b, 0x79, 0x5e, 0x43, 0x89, 0x79, 0x68, 0x79, + 0x98, 0x43, 0x75, + 0x12, 0x60, 0xcc, 0xcc, 0x44, 0x58, 0x4a, 0x2f, + 0x76, 0x82, 0x5e, 0x5e, 0x5e, 0x5e, 0x9f, 0x7, + 0x37, 0x46, 0xf7, 0x7, 0x5e, 0x76, 0xe, 0x5f, + 0xa8, 0xa8, 0xb, 0xe6, 0xe6, 0xa, 0xde, 0xe1, + 0x17, 0x3b, 0x17, 0x15, 0x2e, 0x59, 0x4d, 0x42, + 0x59, 0x71, 0x6f, 0x41, 0x63, 0x71, 0x5d, 0x97, + 0x6f, 0x6b, 0x81, 0x6b, 0x71, 0x6b, 0x6a, 0x56, + 0x63, 0x5d, 0x6a, 0x83, 0x9a, 0x5d, 0x6f, 0x9a, + 0x80, 0x5d, 0x6b, 0x58, 0x81, 0x95, 0x6a, 0x9d, + 0x9a, 0x58, 0x71, 0x85, 0x9a, 0x6a, 0x5d, 0x63, + 0x80, 0x63, 0x63, 0x4d, 0x1d, 0x3f, 0x3b, 0x3d, + 0x16, 0x16, 0x16, 0xee, 0xee, 0x1, 0x23, 0x7f, + 0xd4, 0xd4, 0xdc, 0xbe, 0xc4, 0xe7, 0xd1, 0xd1, + 0xc4, 0xc4, 0xd1, 0xd1, 0xd1, 0xc2, 0xce, 0xc7, + 0xd1, 0xc2, 0xdc, 0xc2, 0xc2, 0xd1, 0xc4, 0xc4, + 0xc4, 0xd2, 0xd0, 0x5a, 0xd0, 0xd2, 0xbf, 0xd4, + 0xc4, 0xd0, 0xd1, 0xc7, 0xc4, 0xc4, 0xd2, 0xd2, + 0xd2, 0xc4, 0xd1, 0xc4, 0xd2, 0xd2, 0xe2, 0xcd, + 0xc1, 0xc4, 0xc2, 0xc2, 0xc4, 0xc4, 0xd3, 0xd3, + 0xd3, 0xdb, 0x88, 0x4a, 0x60, 0x60, 0xaa, 0xab, + 0xb8, 0x50, 0xb0, 0xa1, 0xbf, 0xbf, 0xbf, 0xa1, + 0xa6, 0x25, 0xa1, 0x2c, 0xdd, 0xbe, 0xcc, 0xf0, + 0xdc, 0xbe, 0xbf, 0xc2, 0xc2, 0xd1, 0xbf, 0xc5, + 0x50, 0x97, 0x5a, 0xfe, 0x26, 0x34, 0xf5, 0x3d, + 0xf2, 0x3d, 0x16, 0xf2, 0x15, 0x15, 0x3d, 0x21, + 0x1a, 0x23, 0x21, 0x1d, 0x23, 0x15, 0x3d, 0x15, + 0x3b, 0x16, 0xf2, 0x48, 0x36, 0x7f, 0x23, 0x58, + 0x6b, 0x71, 0x85, 0x6f, 0x5d, 0x85, 0x9a, 0x9a, + 0x85, 0x59, 0x42, 0x59, 0x71, 0x71, 0x80, 0x71, + 0x6b, 0x81, 0x6b, 0x71, 0x59, 0x59, 0x99, 0x7f, + 0x67, 0x63, 0x4d, 0x59, 0x71, 0x6b, 0x71, 0x90, + 0x9a, 0x71, 0x80, 0x73, 0x3b, 0x15, 0x16, 0x3d, + 0x34, 0x70, 0xfa, 0x70, 0x26, 0x6a, 0xaa, 0x50, + 0xb4, 0xa, 0x73, 0xeb, 0xfa, 0x67, 0x20, 0x20, + 0x90, 0x6a, 0x4a, 0x26, 0x3a, 0x91, 0x94, 0x8f, + 0xaa, 0x6a, 0x46, 0x76, 0xaa, 0x62, 0x37, 0x30, + 0x55, 0x8e, 0x6a, 0x99, 0x54, 0x73, 0xeb, 0x16, + 0x15, 0x15, 0x34, 0x34, 0x73, 0x54, 0x1c, 0x1d, + 0x1d, 0x42, 0x7f, 0x2a, 0x3b, 0x15, 0x54, 0x6e, + 0xe6, 0xa, 0x3f, 0x42, 0x7f, 0x56, 0x6b, 0x5d, + 0x58, 0x5d, 0x94, 0x91, 0x94, 0xaa, 0x5f, 0x94, + 0x6a, 0xa6, 0x55, 0x27, 0x7e, 0x37, 0x8d, 0x8b, + 0x62, 0x46, 0x8d, 0x8f, 0x93, 0xa7, 0xaa, 0x7e, + 0x94, 0x6a, 0x7e, 0x91, 0x27, 0x46, 0x8d, 0x8b, + 0x93, 0x37, 0x46, 0x98, 0x79, 0x9f, 0x6c, 0x62, + 0x37, 0x9e, 0x5e, 0x8b, 0x98, 0x30, 0x46, 0x7d, + 0x98, 0x79, 0x32, 0x1f, 0x89, 0x79, 0x4e, 0x79, + 0x89, 0x5c, 0x43, + 0xa8, 0x55, 0x40, 0x11, 0x6a, 0x7e, 0x7e, 0x55, + 0x27, 0x62, 0x7d, 0x37, 0x93, 0x62, 0x5f, 0xdd, + 0x5f, 0x7d, 0x76, 0x37, 0x7d, 0x8f, 0x7d, 0xa7, + 0x55, 0x83, 0x99, 0x23, 0x2b, 0x34, 0x3d, 0x16, + 0x16, 0x15, 0x34, 0x3b, 0x42, 0x59, 0x71, 0x71, + 0x71, 0x9a, 0x59, 0x7f, 0x80, 0x71, 0x9a, 0x7f, + 0x59, 0x71, 0x71, 0x71, 0x6b, 0x71, 0x81, 0x71, + 0x71, 0x71, 0x6f, 0x67, 0x4d, 0x6b, 0x6b, 0x80, + 0x4d, 0x71, 0x6b, 0x6b, 0x6b, 0x58, 0x58, 0x9a, + 0x99, 0x85, 0x58, 0x59, 0x71, 0x71, 0x6b, 0x56, + 0x42, 0x59, 0x63, 0x99, 0x70, 0x70, 0x15, 0x3d, + 0x16, 0xff, 0x14, 0x16, 0x16, 0xeb, 0x99, 0x66, + 0xc9, 0xd0, 0xe5, 0xc7, 0xc2, 0xc4, 0xd2, 0xd9, + 0xd2, 0xc4, 0xd1, 0xc7, 0xd2, 0xd5, 0xdc, 0xcd, + 0xc2, 0xd2, 0xc4, 0xd1, 0xd1, 0xc4, 0xc4, 0xe5, + 0xdb, 0xbf, 0xa1, 0x40, 0xb4, 0xd3, 0x3, 0xbf, + 0xbf, 0xc4, 0xd3, 0xd2, 0xd2, 0xc4, 0xc4, 0xd2, + 0xd3, 0xd6, 0xc2, 0xce, 0xd1, 0xd3, 0xdb, 0xd5, + 0xc4, 0xc4, 0xc4, 0xd3, 0xd3, 0xd3, 0xd6, 0xb4, + 0xdb, 0xcb, 0x41, 0x6a, 0xaa, 0x74, 0xb3, 0xaa, + 0xa6, 0xb4, 0xcb, 0xaf, 0xb, 0x41, 0x6f, 0x6a, + 0x6a, 0x4a, 0x4a, 0xa9, 0xbd, 0xbe, 0xd2, 0xd0, + 0xd4, 0xbf, 0xc7, 0xdc, 0xf3, 0xe4, 0x50, 0xb7, + 0x2c, 0xb0, 0x6e, 0x2a, 0x2b, 0xeb, 0x15, 0x15, + 0x15, 0xf2, 0xf2, 0x23, 0x2e, 0x1d, 0x21, 0x21, + 0x1c, 0xfa, 0x15, 0x15, 0x15, 0xf2, 0x16, 0x16, + 0x15, 0x3d, 0x3b, 0x99, 0x85, 0x58, 0x59, 0x6b, + 0x6b, 0x85, 0x99, 0x54, 0x31, 0x63, 0x97, 0x90, + 0x6b, 0x59, 0x71, 0x81, 0x81, 0x6b, 0x59, 0x71, + 0x6b, 0x6b, 0x85, 0x9a, 0x59, 0x3a, 0x99, 0x80, + 0x85, 0x58, 0x6b, 0x5d, 0x81, 0x6f, 0x6a, 0x6b, + 0x71, 0x9a, 0x7f, 0x73, 0x3d, 0x15, 0x3d, 0x34, + 0x73, 0x66, 0x7f, 0x34, 0x7f, 0xa6, 0xb7, 0xc7, + 0xd0, 0xe6, 0xeb, 0x15, 0x34, 0xfe, 0x20, 0x11, + 0x55, 0xa7, 0xe, 0x11, 0x5d, 0xaa, 0x76, 0xa7, + 0xa6, 0x2f, 0x82, 0x5e, 0x82, 0x82, 0x28, 0x46, + 0x7d, 0x9c, 0xb3, 0xa1, 0x6e, 0xfa, 0xeb, 0x3d, + 0x15, 0xeb, 0x15, 0xeb, 0x34, 0x1c, 0x36, 0x1c, + 0x1d, 0x54, 0x7f, 0x34, 0x15, 0x3d, 0x15, 0x34, + 0xeb, 0x15, 0xfa, 0x48, 0x23, 0x67, 0x3a, 0x31, + 0x3a, 0x4a, 0x6a, 0x91, 0x91, 0x2c, 0xa7, 0x9c, + 0x9c, 0x5f, 0x37, 0x46, 0x76, 0x5e, 0x5e, 0x68, + 0x8d, 0x6c, 0x7, 0x5e, 0x89, 0x7, 0xe, 0x8f, + 0x8f, 0x7d, 0x46, 0x8b, 0x8d, 0x5e, 0x5e, 0x68, + 0x68, 0x9f, 0x7, 0x5e, 0x86, 0x5e, 0xa3, 0x68, + 0x68, 0xa3, 0x68, 0x5e, 0xa3, 0x68, 0x68, 0x6c, + 0x6c, 0x68, 0xa3, 0x86, 0x4e, 0xa3, 0x68, 0x4e, + 0x68, 0x68, 0x68, + 0x74, 0x7e, 0x83, 0x1b, 0x6a, 0x6a, 0x6a, 0x3e, + 0x4a, 0x55, 0x5f, 0xa0, 0x9c, 0x62, 0x30, 0x5f, + 0x93, 0x8f, 0x46, 0x1f, 0x55, 0x8f, 0x76, 0xa8, + 0x40, 0x41, 0x99, 0x5a, 0x99, 0x70, 0x15, 0x16, + 0x16, 0x15, 0x3d, 0x3d, 0x1d, 0x63, 0x85, 0x85, + 0x6f, 0x59, 0x59, 0x63, 0x85, 0x71, 0x59, 0x67, + 0x71, 0x6b, 0x9a, 0x80, 0x59, 0x71, 0x81, 0x85, + 0x85, 0x71, 0x58, 0x31, 0x71, 0x6b, 0x5d, 0x63, + 0x63, 0x6b, 0x6b, 0x85, 0x85, 0x63, 0x63, 0x9a, + 0x9a, 0x5d, 0x6b, 0x59, 0x71, 0x6b, 0x6b, 0x80, + 0x7f, 0x67, 0x7f, 0x70, 0x3d, 0x2b, 0xeb, 0xf2, + 0x16, 0x16, 0x3d, 0x14, 0xf5, 0xfa, 0x41, 0x99, + 0x6e, 0xe0, 0xd0, 0xd2, 0xd1, 0xc4, 0xd2, 0xdb, + 0xdb, 0xc2, 0xbe, 0xdc, 0xc7, 0xdb, 0xc7, 0xbe, + 0xc4, 0xc4, 0xdb, 0xd2, 0xc4, 0xc4, 0xc7, 0xe4, + 0x50, 0xc8, 0xa6, 0xa6, 0xbf, 0xd4, 0xd3, 0xbf, + 0xd2, 0xc4, 0xd3, 0xd9, 0xd2, 0xc4, 0xc4, 0xd1, + 0xdb, 0xd2, 0xc4, 0xc7, 0xc4, 0xd2, 0xd3, 0xd3, + 0xd2, 0xc4, 0xc4, 0xdb, 0xdb, 0xd2, 0xbf, 0xcc, + 0xec, 0xdb, 0xed, 0x40, 0x2c, 0xa6, 0xb0, 0xa6, + 0xc, 0xa1, 0xb4, 0x90, 0x11, 0x3e, 0xa5, 0xb3, + 0xc, 0xf8, 0x50, 0xba, 0xc1, 0xc2, 0xc4, 0xd1, + 0xec, 0xe4, 0xb7, 0xb7, 0xdd, 0xf3, 0xbd, 0xcd, + 0xba, 0xbf, 0xcb, 0xeb, 0x15, 0xeb, 0x1, 0x15, + 0xeb, 0x17, 0x3b, 0xfa, 0x1a, 0x1a, 0xfa, 0xfa, + 0xf9, 0x22, 0xfa, 0x17, 0xeb, 0x15, 0x15, 0x15, + 0xfa, 0x15, 0x34, 0x99, 0x90, 0x6a, 0x6a, 0x7e, + 0x55, 0x6a, 0x99, 0x7f, 0x9d, 0x99, 0x63, 0x6a, + 0x6a, 0x81, 0x5d, 0x6a, 0x6a, 0x6a, 0x5d, 0x6a, + 0x6a, 0x6a, 0x6a, 0x97, 0x85, 0x99, 0x26, 0x6f, + 0x5d, 0x6b, 0x5d, 0x7e, 0x6a, 0x6a, 0x6a, 0x6a, + 0x5d, 0x63, 0x54, 0x3d, 0x3d, 0xf2, 0x3d, 0x73, + 0xcb, 0xb4, 0x3, 0xc9, 0xed, 0xe3, 0xc8, 0xc7, + 0xbf, 0xcb, 0xe6, 0xeb, 0x3f, 0x26, 0x1b, 0x60, + 0x1e, 0x8, 0x28, 0xdd, 0xcc, 0xf3, 0xf7, 0xfc, + 0x37, 0x28, 0x9e, 0x5e, 0x9e, 0x5e, 0x9e, 0x5e, + 0x6c, 0xf7, 0xf3, 0xbf, 0xbf, 0xea, 0x2b, 0x3d, + 0x15, 0x34, 0x3b, 0x17, 0x22, 0x23, 0x1c, 0x23, + 0x2a, 0x34, 0xfa, 0xfa, 0x34, 0x54, 0x23, 0x23, + 0x34, 0x3f, 0x34, 0x15, 0x2b, 0x34, 0x23, 0x26, + 0x80, 0x56, 0x83, 0x5d, 0x6a, 0x6a, 0x74, 0x8f, + 0x62, 0x5f, 0x9c, 0x93, 0x7d, 0x76, 0x6c, 0x76, + 0x5e, 0x7, 0x8, 0x37, 0x28, 0x7d, 0x8b, 0x8f, + 0x94, 0x55, 0x2f, 0x46, 0x82, 0x7, 0xb6, 0x28, + 0x5e, 0x9f, 0x5e, 0x86, 0x68, 0x68, 0x86, 0x68, + 0x4e, 0x68, 0xa3, 0x86, 0x68, 0xa3, 0x6c, 0xb8, + 0xc, 0xfc, 0x68, 0x68, 0x75, 0x68, 0x32, 0x75, + 0x68, 0x4e, 0x68, + 0x5e, 0x9c, 0x60, 0x40, 0x72, 0xb0, 0xb, 0xe3, + 0xf0, 0x46, 0x5e, 0x86, 0xa3, 0x8d, 0x8d, 0x5e, + 0x82, 0x82, 0x6c, 0xa0, 0xc, 0xa7, 0x6c, 0xb7, + 0x50, 0x40, 0x5a, 0xcb, 0xa, 0x23, 0x39, 0x17, + 0x15, 0x3d, 0x16, 0x16, 0x16, 0x34, 0xa, 0x54, + 0x90, 0x3a, 0x5d, 0x4a, 0x5d, 0x95, 0x6a, 0x5d, + 0x6b, 0x6b, 0x90, 0x67, 0x80, 0x5d, 0x83, 0x97, + 0x6b, 0x6a, 0x83, 0x6a, 0x6b, 0x6a, 0x6a, 0x5d, + 0x9a, 0x97, 0x6f, 0x99, 0x90, 0x6f, 0x6a, 0x90, + 0x5d, 0x6a, 0x6a, 0x6b, 0x6b, 0x91, 0x6a, 0x85, + 0x48, 0x54, 0x3f, 0x3b, 0x3b, 0x54, 0xeb, 0x16, + 0xee, 0xee, 0xee, 0x16, 0xf2, 0x15, 0xcb, 0xe0, + 0xcb, 0xd3, 0xdb, 0xe7, 0xc4, 0xd1, 0xbe, 0xba, + 0xcc, 0xc2, 0xce, 0xbe, 0xc2, 0xd2, 0xc4, 0xc4, + 0xd1, 0xc4, 0xd1, 0xe4, 0xce, 0xd1, 0xce, 0xb7, + 0xcd, 0xbe, 0xbe, 0xbf, 0xbf, 0xd3, 0xd2, 0xc4, + 0xd2, 0xd2, 0xc4, 0xbf, 0xd1, 0xc4, 0xc4, 0xc2, + 0xd1, 0xc4, 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, 0xd9, + 0xdb, 0xd2, 0xd2, 0xd1, 0xcc, 0xdb, 0xd2, 0xc4, + 0xc2, 0xd2, 0xd6, 0xdb, 0xec, 0xf0, 0xe4, 0xf3, + 0xf8, 0xb, 0x5a, 0x97, 0xb0, 0x50, 0xbf, 0xc4, + 0xbf, 0xcc, 0xbf, 0xbe, 0xba, 0xbe, 0xdc, 0xcc, + 0xf3, 0xdc, 0xf0, 0xdd, 0xb8, 0xbd, 0xbe, 0xd2, + 0xd1, 0xcb, 0xe6, 0xde, 0x1, 0xee, 0x16, 0x15, + 0xf2, 0xf2, 0xf2, 0x15, 0xeb, 0xf2, 0x15, 0x15, + 0xfa, 0x23, 0x1a, 0x66, 0x6e, 0x15, 0x15, 0x2b, + 0x73, 0x48, 0x34, 0xeb, 0xa, 0x9, 0x83, 0x55, + 0x6a, 0x5d, 0x5d, 0x5d, 0x6b, 0x58, 0x3a, 0x5d, + 0x6a, 0x90, 0x99, 0x92, 0x6f, 0x90, 0x6a, 0x83, + 0x6f, 0x6a, 0x4a, 0x6a, 0x83, 0x4d, 0x7f, 0xfe, + 0x99, 0x9a, 0x90, 0x6a, 0x6a, 0x71, 0x91, 0x6a, + 0x6a, 0x31, 0x36, 0x3f, 0x3b, 0x16, 0xf2, 0xee, + 0xe1, 0xeb, 0xd7, 0xd8, 0xa, 0xfd, 0x11, 0x50, + 0xaf, 0x99, 0x42, 0x21, 0xfa, 0x54, 0x5a, 0x40, + 0xa1, 0xf0, 0xf7, 0x6c, 0x2c, 0x12, 0x12, 0x12, + 0x46, 0x82, 0x5e, 0xfc, 0x12, 0xe, 0x6c, 0x6c, + 0xa8, 0x50, 0xf8, 0x50, 0xb4, 0x6e, 0x73, 0x15, + 0x1d, 0x7f, 0x48, 0x3b, 0x2b, 0x34, 0x15, 0x34, + 0x2b, 0x15, 0x21, 0x2b, 0x36, 0x9a, 0x4d, 0x36, + 0x36, 0x48, 0x73, 0x15, 0x15, 0xf2, 0x15, 0x2b, + 0x54, 0x54, 0x39, 0x4d, 0x58, 0x81, 0x91, 0x91, + 0x6a, 0x83, 0xb0, 0x7e, 0x94, 0x74, 0x60, 0x62, + 0x8f, 0x93, 0x62, 0x7e, 0x7e, 0x94, 0x94, 0x91, + 0x91, 0x20, 0x41, 0x6a, 0x74, 0x28, 0x37, 0x30, + 0x46, 0x68, 0x5e, 0x98, 0x1f, 0x28, 0x68, 0x8d, + 0x8d, 0x68, 0xe, 0x74, 0x8b, 0x8b, 0x93, 0x62, + 0x4b, 0x62, 0x75, 0x79, 0x98, 0x79, 0x32, 0x79, + 0x98, 0x75, 0x4e, + 0x8, 0x5f, 0xc, 0xcc, 0xbf, 0x50, 0x4a, 0x2c, + 0x46, 0x82, 0x5e, 0x28, 0x6c, 0x82, 0x5e, 0x9f, + 0x7, 0x28, 0x6c, 0xdd, 0xb7, 0xe, 0xe, 0xf3, + 0x60, 0x50, 0xf4, 0xe6, 0xa, 0xfa, 0xeb, 0xeb, + 0xf2, 0x16, 0x16, 0x2b, 0x48, 0x7f, 0x1d, 0x59, + 0x71, 0x85, 0x99, 0x97, 0x4d, 0x90, 0x6a, 0x6a, + 0x6f, 0x5d, 0x58, 0x71, 0x71, 0x71, 0x5d, 0x59, + 0x63, 0x9a, 0x99, 0x63, 0x85, 0x90, 0x5d, 0x6f, + 0x85, 0x85, 0x58, 0x58, 0x58, 0x6b, 0x5d, 0x99, + 0x3c, 0x97, 0x41, 0x9a, 0x58, 0x6f, 0x85, 0x85, + 0x80, 0x67, 0x42, 0x2e, 0x1d, 0x42, 0x15, 0x3d, + 0xee, 0x14, 0xff, 0x14, 0x3d, 0xeb, 0xf1, 0x54, + 0x41, 0xe5, 0xa1, 0x83, 0xfd, 0xd4, 0xbf, 0xbe, + 0xc2, 0xd6, 0xd2, 0xd1, 0xd1, 0xc2, 0xd1, 0xe7, + 0xec, 0xc7, 0xce, 0xcd, 0xd5, 0xdb, 0xd2, 0xc7, + 0xbe, 0xd2, 0xd0, 0x5a, 0xaf, 0xaf, 0x41, 0x69, + 0x41, 0xbf, 0xc4, 0xbf, 0xc4, 0xd3, 0xd6, 0xd2, + 0xc4, 0xc4, 0xd2, 0xd3, 0xd2, 0xc4, 0xc4, 0xc4, + 0xdb, 0xd9, 0xd3, 0xc4, 0xc2, 0xd2, 0xd0, 0xd6, + 0xd2, 0xc4, 0xd0, 0xcb, 0xfd, 0xfd, 0xb0, 0xaf, + 0xfd, 0x23, 0x23, 0x6e, 0xcb, 0xa, 0xa, 0xe6, + 0xe0, 0x5a, 0x83, 0x60, 0xe, 0x7, 0xc8, 0xbe, + 0xc1, 0xc5, 0xf4, 0xbf, 0xf3, 0xf3, 0xaf, 0xc9, + 0xcb, 0xd8, 0x73, 0xde, 0x16, 0x14, 0x16, 0xf2, + 0xf2, 0x16, 0x15, 0x3d, 0x16, 0x17, 0x15, 0xfa, + 0x15, 0x21, 0x1a, 0x67, 0x23, 0x3d, 0x3b, 0x3b, + 0x3d, 0x3b, 0x3b, 0x3b, 0x3b, 0x48, 0x67, 0x6a, + 0x5d, 0x9a, 0x71, 0x81, 0x6a, 0x81, 0x6b, 0x58, + 0x71, 0x5d, 0x71, 0x6f, 0x58, 0x80, 0x58, 0x6b, + 0x6b, 0x71, 0x5d, 0x5d, 0x90, 0x85, 0x58, 0x67, + 0x7f, 0x42, 0x59, 0x6b, 0x95, 0x6b, 0x6b, 0x71, + 0x71, 0x80, 0x2e, 0x21, 0xf2, 0xf2, 0x16, 0xf2, + 0x3d, 0x3d, 0x15, 0x48, 0x99, 0x58, 0x4a, 0x60, + 0xaf, 0x7f, 0x73, 0xfa, 0x3f, 0x48, 0x90, 0x6a, + 0x6a, 0x7e, 0x9c, 0x76, 0x8f, 0x62, 0x46, 0x46, + 0x8f, 0x74, 0x76, 0x82, 0x74, 0x9c, 0x28, 0x8d, + 0x74, 0x55, 0x60, 0x40, 0x97, 0x73, 0x1, 0x15, + 0x34, 0x15, 0xee, 0x34, 0x3f, 0x22, 0x34, 0x1d, + 0x22, 0x22, 0x3b, 0x3b, 0x3f, 0x48, 0x54, 0x54, + 0xfa, 0x2a, 0xfa, 0x48, 0x48, 0x34, 0x21, 0x2b, + 0x21, 0x2b, 0x3b, 0x21, 0x42, 0x63, 0x90, 0x6f, + 0x81, 0x6f, 0x90, 0x6a, 0x91, 0x91, 0x94, 0x8f, + 0x94, 0x94, 0x94, 0x91, 0x91, 0x91, 0xb0, 0x90, + 0x6a, 0x4a, 0x83, 0x4a, 0x62, 0x8d, 0x8d, 0x98, + 0x98, 0x68, 0x68, 0x79, 0x68, 0x68, 0x68, 0x76, + 0x8d, 0x4e, 0x68, 0x8f, 0x8b, 0x98, 0x7d, 0x8f, + 0x8b, 0x98, 0x75, 0x75, 0xa7, 0x43, 0x75, 0x75, + 0x79, 0x75, 0x68, + 0xf8, 0x7e, 0x7e, 0x6a, 0x4a, 0x4a, 0x27, 0x82, + 0x7d, 0x93, 0x7d, 0xf7, 0xb3, 0x74, 0x76, 0x6c, + 0x2f, 0x55, 0x82, 0x6c, 0x9c, 0x62, 0x55, 0x55, + 0x6a, 0x90, 0x99, 0x2a, 0xeb, 0xeb, 0x15, 0x3d, + 0x3b, 0x3b, 0x3b, 0x70, 0x7f, 0x67, 0x59, 0x59, + 0x59, 0x85, 0x63, 0x63, 0x4d, 0x3c, 0x80, 0x85, + 0x6b, 0x71, 0x63, 0x71, 0x6b, 0x6b, 0x6b, 0x71, + 0x59, 0x67, 0x42, 0x63, 0x58, 0x58, 0x80, 0x85, + 0x6b, 0x71, 0x71, 0x59, 0x71, 0x6b, 0x71, 0x71, + 0x67, 0x7f, 0x7f, 0x4d, 0x6b, 0x71, 0x71, 0x59, + 0x71, 0x71, 0x80, 0x59, 0x42, 0x7f, 0x70, 0x16, + 0x16, 0x16, 0x14, 0x16, 0xf2, 0xee, 0x15, 0x23, + 0x90, 0xb0, 0xb4, 0xb4, 0x5a, 0xd0, 0xd2, 0xbf, + 0xd2, 0xd0, 0xd2, 0xe5, 0xdc, 0xce, 0xd1, 0xec, + 0xec, 0xc4, 0xd1, 0xc2, 0xc4, 0xd3, 0xd0, 0xb, + 0xa1, 0xc5, 0x5a, 0x23, 0x67, 0x3a, 0x99, 0x97, + 0x97, 0xbf, 0xd3, 0xd3, 0xd2, 0xd2, 0xd3, 0xc4, + 0xd1, 0xc4, 0xc4, 0xd2, 0xcc, 0xc7, 0xc4, 0xc4, + 0xd2, 0xd3, 0xd3, 0xc4, 0xd2, 0xc4, 0xd0, 0xbf, + 0xbe, 0xbe, 0xd0, 0xcb, 0xe6, 0xcb, 0xcb, 0xa, + 0xa, 0xe6, 0xeb, 0xfa, 0xfa, 0x23, 0x39, 0xd8, + 0xfa, 0x26, 0x58, 0x60, 0xa7, 0xa0, 0x50, 0xc2, + 0xc2, 0xbf, 0xe3, 0xcc, 0xb7, 0xc, 0x60, 0xaf, + 0xc9, 0x73, 0xee, 0xff, 0x14, 0xee, 0xf2, 0xf2, + 0xf2, 0xf2, 0x17, 0x17, 0x17, 0x22, 0x1d, 0x1a, + 0xfa, 0x15, 0x21, 0x54, 0xeb, 0x15, 0x15, 0x73, + 0xf2, 0x70, 0x63, 0x66, 0x73, 0x48, 0x67, 0x6f, + 0x97, 0x7f, 0x85, 0x90, 0xaf, 0x85, 0x6b, 0x6a, + 0x6b, 0x6b, 0x6b, 0x6a, 0x6a, 0x71, 0x71, 0x71, + 0x6a, 0x5b, 0x6a, 0x40, 0x90, 0x41, 0x5d, 0x4a, + 0x6f, 0x71, 0x71, 0x5d, 0x81, 0x6b, 0x81, 0x6a, + 0x85, 0x70, 0x73, 0xf2, 0xf2, 0x16, 0xf2, 0x73, + 0xa, 0x73, 0x23, 0x36, 0x20, 0x50, 0x2c, 0xba, + 0x3, 0xc9, 0xeb, 0x15, 0x34, 0xf9, 0x1b, 0x2c, + 0x46, 0x76, 0x6c, 0xfc, 0x5f, 0xb7, 0xa0, 0x6c, + 0xa7, 0x2c, 0x6c, 0x5e, 0x8d, 0x5e, 0x5e, 0x28, + 0x8d, 0x5e, 0x8, 0x2c, 0x41, 0xa, 0xeb, 0x2b, + 0xeb, 0x3d, 0x3d, 0x21, 0x67, 0x67, 0xfe, 0x36, + 0x1c, 0x1c, 0x73, 0x34, 0x34, 0x15, 0x15, 0x2b, + 0x7f, 0x48, 0x34, 0x48, 0x1a, 0x67, 0x54, 0x34, + 0x21, 0x34, 0x3d, 0x3b, 0x1d, 0x23, 0x54, 0x99, + 0x6f, 0x6a, 0x6f, 0x3a, 0x6b, 0x91, 0x91, 0x91, + 0x81, 0x7e, 0x83, 0x83, 0x91, 0x6a, 0x20, 0x5a, + 0x3e, 0x5f, 0xe, 0x27, 0x30, 0xfc, 0xa3, 0x9f, + 0x9f, 0x5e, 0x28, 0x9f, 0x68, 0x4e, 0xa3, 0x68, + 0xa3, 0x5e, 0x68, 0xa3, 0x37, 0x30, 0x38, 0x5c, + 0x82, 0x5e, 0xa2, 0x1e, 0x1e, 0x68, 0x68, 0x68, + 0x32, 0x32, 0x68, + 0x5f, 0x94, 0x8f, 0x8f, 0x7e, 0x7e, 0x62, 0x37, + 0x9c, 0x9c, 0x76, 0xf7, 0xba, 0xa9, 0x76, 0x5e, + 0x37, 0x93, 0x5e, 0x5e, 0x89, 0x74, 0x7d, 0xa8, + 0xbc, 0xaf, 0xb4, 0xcb, 0xa, 0xfa, 0x15, 0x17, + 0x2b, 0x15, 0x16, 0x3d, 0x70, 0x54, 0x9a, 0x5d, + 0x85, 0x63, 0x5d, 0x81, 0x6b, 0x6b, 0x58, 0x71, + 0x71, 0x99, 0x67, 0x6b, 0x6b, 0x71, 0x6b, 0x6b, + 0x9a, 0x80, 0x58, 0x71, 0x6b, 0x81, 0x31, 0x58, + 0x6b, 0x71, 0x67, 0x63, 0x71, 0x85, 0x83, 0x6b, + 0x58, 0x63, 0x3a, 0x58, 0x71, 0x6b, 0x71, 0x85, + 0x85, 0x7f, 0x70, 0x7f, 0x7f, 0x73, 0x73, 0x70, + 0x3b, 0x3b, 0x16, 0x3d, 0x16, 0xf2, 0x15, 0x34, + 0xb4, 0xbf, 0xd3, 0xd0, 0xd0, 0xd2, 0xd1, 0xd4, + 0xec, 0xc7, 0xd2, 0xce, 0xec, 0xd5, 0xc4, 0xc7, + 0xc2, 0xc4, 0xd2, 0xd2, 0xc4, 0xd2, 0xc4, 0xe9, + 0xf8, 0xc8, 0xb, 0x5a, 0x26, 0xf9, 0x54, 0xcb, + 0xb4, 0xd2, 0xd2, 0xbf, 0xc4, 0xd1, 0xc4, 0xc4, + 0xe7, 0xd5, 0xc4, 0xc4, 0xc4, 0xc4, 0xd2, 0xd3, + 0xc4, 0xc4, 0xd2, 0xd2, 0xe7, 0xe4, 0xc8, 0xdd, + 0xdd, 0xbe, 0xd1, 0xd3, 0xd7, 0xe6, 0xe6, 0xd8, + 0xde, 0x1, 0xeb, 0x15, 0xfa, 0xfe, 0x99, 0xcb, + 0xe0, 0xfd, 0x1b, 0xe3, 0xba, 0x7, 0xbc, 0xd1, + 0xc7, 0xcd, 0xf3, 0xa0, 0xf3, 0xf8, 0xc8, 0xa6, + 0xd3, 0xd8, 0xde, 0xee, 0x16, 0xee, 0x16, 0xee, + 0x16, 0x17, 0xfe, 0x23, 0xf1, 0x1a, 0x1a, 0xf9, + 0xf1, 0x48, 0x1c, 0xfa, 0xf2, 0x15, 0xf2, 0xee, + 0x3d, 0x2b, 0x41, 0xb, 0xcb, 0x23, 0x36, 0x58, + 0x90, 0x99, 0x5d, 0x6f, 0x90, 0x63, 0x6a, 0x6a, + 0x6f, 0x58, 0x6a, 0x6a, 0x5b, 0x6a, 0x5d, 0x58, + 0x83, 0x6a, 0x5b, 0x83, 0x20, 0x41, 0x85, 0x94, + 0x83, 0x90, 0x3a, 0x58, 0x6f, 0x6a, 0x6a, 0x6a, + 0x99, 0x48, 0x3d, 0x16, 0x16, 0x16, 0x16, 0x73, + 0xcb, 0x1, 0x23, 0xed, 0x5a, 0xbf, 0xbe, 0xc7, + 0xd0, 0xd8, 0xeb, 0x15, 0x15, 0x54, 0xfd, 0x27, + 0x37, 0x28, 0x8, 0xe, 0xf8, 0xf3, 0xb7, 0x6c, + 0xfc, 0x12, 0x1f, 0x68, 0x68, 0x68, 0xfc, 0x1f, + 0x76, 0x7, 0xbd, 0xce, 0xe5, 0xcb, 0xa, 0xfa, + 0x48, 0x15, 0x3d, 0x2b, 0x67, 0x99, 0x6e, 0x23, + 0x39, 0x54, 0xd8, 0x2a, 0x21, 0x21, 0x3b, 0x48, + 0x59, 0x7f, 0x2b, 0x15, 0x48, 0x54, 0xeb, 0xeb, + 0xfa, 0xeb, 0xeb, 0xeb, 0x1d, 0x1d, 0x3f, 0x21, + 0x63, 0x85, 0x99, 0x7f, 0x31, 0x6b, 0x6a, 0xb0, + 0x5d, 0x58, 0x6f, 0x85, 0x81, 0x27, 0x1b, 0xfd, + 0x4a, 0x1e, 0xa0, 0x2c, 0x27, 0x37, 0x6c, 0x7, + 0x6c, 0x28, 0x86, 0x68, 0x68, 0x4e, 0x5e, 0xfc, + 0x5e, 0x9e, 0x4e, 0x6c, 0xe, 0x30, 0x12, 0x33, + 0x5f, 0x37, 0x32, 0x32, 0x8d, 0x32, 0x68, 0x68, + 0x32, 0x43, 0x32, + 0x76, 0x7d, 0x46, 0x2c, 0xa8, 0xa8, 0xa7, 0x6c, + 0xf7, 0xa0, 0x5e, 0x5e, 0x6c, 0x5e, 0x28, 0x5e, + 0x5e, 0x9f, 0x6c, 0x6c, 0xb7, 0xc8, 0xf7, 0x7, + 0xcc, 0xe5, 0xb, 0xb, 0x99, 0x34, 0x48, 0x1d, + 0x22, 0x16, 0x3d, 0x16, 0x16, 0x34, 0x7f, 0x5d, + 0x6b, 0x83, 0x58, 0x6a, 0x6a, 0x6a, 0x7e, 0x4a, + 0x5d, 0x99, 0x63, 0x71, 0x71, 0x85, 0x5d, 0x6a, + 0x6b, 0x6f, 0x31, 0x5d, 0x81, 0x6a, 0x6a, 0x5d, + 0x58, 0x90, 0x99, 0x63, 0x6f, 0x97, 0x99, 0x5d, + 0x81, 0x6a, 0x5d, 0x58, 0x71, 0x71, 0xb0, 0x90, + 0x99, 0x42, 0x54, 0x48, 0x67, 0x6e, 0x34, 0x3b, + 0x70, 0x73, 0xee, 0x14, 0x3b, 0xeb, 0xc0, 0xf1, + 0x41, 0xd4, 0xbf, 0xbf, 0xc8, 0xc5, 0xd2, 0x5a, + 0xec, 0xbe, 0xc4, 0xc4, 0xd3, 0xd3, 0xd2, 0xc4, + 0xd1, 0xd2, 0xdb, 0xdb, 0xe4, 0xbe, 0xe4, 0xe7, + 0xb, 0xe5, 0xb4, 0xd8, 0x73, 0xfa, 0xeb, 0x73, + 0x5a, 0x5, 0xe5, 0xd0, 0xcc, 0xcd, 0xc7, 0xd2, + 0xdb, 0xdb, 0xd2, 0xc4, 0xc4, 0xd2, 0xd3, 0xd3, + 0xd2, 0xd1, 0xc4, 0xdb, 0xd4, 0xf0, 0xb7, 0xbd, + 0xbd, 0xc7, 0xd2, 0xd2, 0xd3, 0xd0, 0xd7, 0xde, + 0xf2, 0x15, 0xeb, 0xde, 0xeb, 0x54, 0x3, 0xcb, + 0xd3, 0xd9, 0xed, 0xd4, 0xbe, 0xf7, 0xf7, 0xf3, + 0xf3, 0xc, 0xa8, 0xc8, 0xa1, 0xe5, 0xb4, 0xd6, + 0xcb, 0xde, 0xee, 0x14, 0x16, 0x15, 0x17, 0x16, + 0x16, 0x17, 0x21, 0x73, 0xe1, 0xfa, 0xfa, 0xfa, + 0xf1, 0xf9, 0x1a, 0x23, 0xf2, 0x3d, 0x2b, 0x16, + 0x16, 0x15, 0x73, 0xa, 0x73, 0x48, 0x4d, 0x4a, + 0x90, 0x58, 0x81, 0x6b, 0x6b, 0x6b, 0x71, 0x6a, + 0x88, 0x66, 0x5b, 0x6f, 0xb0, 0xaf, 0x4a, 0x58, + 0x58, 0x6b, 0x6a, 0x6a, 0x5d, 0x59, 0x71, 0x6a, + 0x41, 0x54, 0x67, 0x31, 0x90, 0x90, 0x71, 0x6b, + 0x63, 0x67, 0x42, 0x3f, 0x16, 0x16, 0x16, 0xee, + 0xf2, 0xf2, 0xde, 0xeb, 0xe6, 0xcb, 0x50, 0xe9, + 0x5a, 0x54, 0x34, 0x2b, 0x22, 0x34, 0x26, 0x6a, + 0x74, 0xaa, 0xc, 0xe, 0x46, 0x89, 0xfc, 0x5e, + 0x82, 0x46, 0x79, 0x5e, 0x8d, 0x76, 0xa7, 0x76, + 0x93, 0x9c, 0xc8, 0x2c, 0x83, 0x99, 0xf1, 0x39, + 0x1d, 0x15, 0xf2, 0x21, 0x34, 0xfa, 0x15, 0x15, + 0x34, 0xfa, 0xeb, 0x23, 0x36, 0x1d, 0x36, 0x36, + 0x31, 0x36, 0x34, 0x34, 0x15, 0x15, 0x3d, 0x2b, + 0x3f, 0xeb, 0x15, 0x2a, 0x48, 0x48, 0x21, 0x1d, + 0x42, 0x42, 0x23, 0x48, 0x67, 0x4d, 0x99, 0x99, + 0x71, 0x6f, 0x63, 0x4d, 0x3a, 0x4a, 0x1b, 0x41, + 0x41, 0xa0, 0x60, 0x97, 0x55, 0x82, 0x82, 0x62, + 0x98, 0x68, 0x68, 0x79, 0x68, 0x86, 0x68, 0x98, + 0x82, 0x68, 0x5e, 0xab, 0x55, 0x8d, 0x46, 0x62, + 0x4b, 0x7d, 0x75, 0x79, 0x8f, 0x8d, 0x5e, 0x79, + 0x8b, 0x82, 0x86, + 0xa7, 0xaa, 0x4a, 0x11, 0x50, 0xf8, 0x28, 0x5e, + 0x1f, 0x46, 0x5e, 0x68, 0x68, 0x37, 0x37, 0x28, + 0x9f, 0xb7, 0x7, 0xe, 0x60, 0x2c, 0xa7, 0xa7, + 0x60, 0xaf, 0x40, 0x50, 0x54, 0x34, 0x2a, 0x73, + 0x15, 0x15, 0x73, 0x23, 0x3f, 0x3b, 0x80, 0x6f, + 0x6b, 0x9a, 0x3a, 0x81, 0x81, 0x61, 0x6f, 0x6b, + 0x6b, 0x58, 0x5d, 0x6b, 0x81, 0x6b, 0x6b, 0x6b, + 0x6b, 0x80, 0x7f, 0x58, 0x71, 0xb0, 0x90, 0x6b, + 0x71, 0x58, 0x85, 0x6b, 0x71, 0x63, 0x59, 0x71, + 0x6b, 0x6f, 0x80, 0x4d, 0x71, 0x6f, 0x99, 0x9a, + 0x4d, 0x4d, 0x42, 0x42, 0x58, 0x67, 0x3b, 0x3d, + 0x3d, 0x3d, 0x16, 0x16, 0xee, 0x15, 0x73, 0x99, + 0x6f, 0x6f, 0x5d, 0x83, 0x60, 0xcc, 0xd3, 0xd6, + 0xd0, 0xd1, 0xd2, 0xd0, 0xd0, 0xdb, 0xd4, 0xd1, + 0xcc, 0xdc, 0xbf, 0xbf, 0xe3, 0xbe, 0xb4, 0xcb, + 0xa, 0xa, 0xde, 0x34, 0xe1, 0x15, 0xeb, 0x34, + 0x39, 0x4d, 0x99, 0x88, 0xbf, 0xc4, 0xd2, 0xd3, + 0xd2, 0xd2, 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, 0xd2, + 0xc4, 0xe2, 0xc2, 0xd2, 0xd2, 0xc7, 0xe4, 0xbf, + 0xce, 0xc5, 0xb, 0xbf, 0xd4, 0xb, 0x99, 0xa, + 0x15, 0xeb, 0xeb, 0xee, 0x15, 0xeb, 0xeb, 0xd8, + 0x54, 0x41, 0x90, 0x97, 0x11, 0x50, 0x60, 0xb3, + 0xba, 0x50, 0xb0, 0xb4, 0xf4, 0x6e, 0x6e, 0x73, + 0x1, 0xf2, 0xf2, 0xf5, 0x16, 0x17, 0x22, 0x17, + 0x3d, 0xee, 0x17, 0x15, 0x15, 0x23, 0x23, 0xfa, + 0xfa, 0x1d, 0x23, 0x15, 0x15, 0x22, 0x21, 0x3b, + 0x3d, 0x3b, 0x70, 0xeb, 0x3f, 0x48, 0x80, 0x80, + 0x99, 0x58, 0x6b, 0x81, 0x6a, 0x71, 0x71, 0x71, + 0x9a, 0x9d, 0x6f, 0x90, 0x99, 0x67, 0x71, 0x6b, + 0x6b, 0x6b, 0x6b, 0x81, 0x6b, 0x71, 0x71, 0x85, + 0x4d, 0x7f, 0x85, 0x63, 0x99, 0x59, 0x71, 0x71, + 0x80, 0x70, 0x21, 0x3f, 0x16, 0x16, 0xf2, 0xf2, + 0x16, 0x16, 0xf2, 0x2b, 0xeb, 0x23, 0x1b, 0xb0, + 0xb4, 0x73, 0xfa, 0x3f, 0x34, 0x23, 0x40, 0x2f, + 0x7e, 0x27, 0x46, 0x5e, 0x8b, 0x62, 0x1f, 0x46, + 0x8b, 0x98, 0x7, 0xa7, 0x62, 0x74, 0xa0, 0x82, + 0x62, 0x62, 0x2f, 0x74, 0xaa, 0x5a, 0xa, 0x34, + 0x3f, 0x15, 0x15, 0xfa, 0xfa, 0x48, 0x34, 0x42, + 0x4d, 0x48, 0x3b, 0x21, 0x7f, 0x54, 0x34, 0x2b, + 0x34, 0xfa, 0x73, 0x54, 0x23, 0x1d, 0x21, 0x21, + 0x67, 0x70, 0x16, 0x15, 0x15, 0x15, 0x3d, 0x3d, + 0x2b, 0x34, 0x34, 0x54, 0x26, 0x36, 0x1c, 0x36, + 0x31, 0x99, 0x6e, 0x2a, 0xf9, 0x41, 0xbf, 0xb4, + 0xb, 0x11, 0x62, 0x8f, 0x62, 0x8d, 0xfc, 0x62, + 0x98, 0x68, 0x68, 0x68, 0x5e, 0x68, 0x68, 0x28, + 0x5e, 0x68, 0x28, 0x8b, 0x8d, 0x68, 0x75, 0x5c, + 0x33, 0x33, 0x32, 0x75, 0x79, 0x1e, 0x1f, 0x5c, + 0x8d, 0x75, 0x68, + 0x60, 0xb0, 0x6a, 0x91, 0x6a, 0x7e, 0x62, 0x5e, + 0x8d, 0x8f, 0x82, 0x5e, 0x82, 0xa8, 0xa7, 0x5e, + 0x5f, 0x55, 0x76, 0x5e, 0x8b, 0x8f, 0x74, 0x7d, + 0x7e, 0x97, 0x90, 0x99, 0xa, 0x15, 0xeb, 0xeb, + 0x34, 0xeb, 0xfa, 0x67, 0x67, 0x7f, 0x36, 0x5d, + 0x6b, 0x80, 0x71, 0x81, 0x6a, 0x67, 0x85, 0x81, + 0x6a, 0x63, 0x58, 0x71, 0x81, 0x6b, 0x6b, 0x6b, + 0x6b, 0x85, 0x67, 0x71, 0x71, 0x67, 0x71, 0x6b, + 0x6b, 0x71, 0x71, 0x59, 0x6b, 0x6b, 0x71, 0x6b, + 0x71, 0x58, 0x9a, 0x71, 0x71, 0x80, 0x67, 0x59, + 0x71, 0x80, 0x39, 0x42, 0x31, 0x7f, 0x34, 0xf2, + 0xf2, 0xee, 0x14, 0x16, 0xee, 0xee, 0x15, 0x67, + 0x85, 0x6a, 0xb0, 0xaf, 0x5a, 0xd4, 0xbf, 0xb4, + 0xd6, 0xd0, 0xd0, 0xd4, 0xcc, 0xbe, 0xbf, 0xd4, + 0xcc, 0xbe, 0xbf, 0xcb, 0xd0, 0xd0, 0xcb, 0xa, + 0x3, 0xc9, 0x73, 0xf2, 0xee, 0xf2, 0xf2, 0xf2, + 0xfa, 0x39, 0x6e, 0xcb, 0xcb, 0xd3, 0xd0, 0xd3, + 0xc4, 0xd1, 0xd2, 0xd3, 0xd9, 0xd1, 0xc4, 0xd2, + 0xd2, 0xd2, 0xd2, 0xc4, 0xc4, 0xd5, 0xf0, 0xf8, + 0xa0, 0xa0, 0x60, 0xb4, 0xdb, 0x5a, 0xb4, 0xa, + 0xde, 0xde, 0xee, 0xee, 0xf2, 0x1, 0xfa, 0xfa, + 0x6e, 0x90, 0x7a, 0xf4, 0xf4, 0xfd, 0x97, 0xbf, + 0xbf, 0xbf, 0x41, 0x41, 0xb4, 0x99, 0x99, 0x1, + 0xe1, 0x15, 0xf2, 0xf2, 0x14, 0xf2, 0x15, 0xeb, + 0xeb, 0x15, 0x34, 0x1d, 0x48, 0x23, 0x1c, 0x1d, + 0x17, 0x34, 0x15, 0x15, 0x3d, 0x16, 0x16, 0x3d, + 0x3d, 0x34, 0x54, 0x3d, 0x48, 0x4d, 0x85, 0x99, + 0x42, 0x67, 0x6b, 0x6a, 0x81, 0x85, 0x58, 0x58, + 0x6b, 0x5d, 0x81, 0x5d, 0x31, 0x59, 0x6b, 0x81, + 0x94, 0x81, 0x81, 0x91, 0x81, 0x83, 0x5d, 0x31, + 0x71, 0x71, 0x6a, 0x6a, 0x58, 0x4d, 0x85, 0x85, + 0x54, 0xf2, 0xf2, 0x16, 0xf2, 0xf2, 0xd8, 0xd8, + 0xeb, 0xee, 0xa, 0xcb, 0x6e, 0xf1, 0x5a, 0xd4, + 0xcb, 0x1, 0xeb, 0xeb, 0xea, 0x5a, 0x2c, 0x37, + 0xe, 0x30, 0x37, 0x5e, 0x5e, 0x5e, 0xe, 0xe, + 0x5e, 0x5e, 0x9f, 0x28, 0x28, 0x79, 0x68, 0x5e, + 0x8d, 0x1f, 0xe, 0xa0, 0xa8, 0xb4, 0xea, 0xa, + 0x15, 0xf2, 0xeb, 0xeb, 0x23, 0x1d, 0x1a, 0x99, + 0x99, 0x23, 0x2b, 0x3b, 0x2b, 0x34, 0x15, 0x3b, + 0x15, 0x34, 0x73, 0x39, 0x42, 0x1c, 0x23, 0x23, + 0x7f, 0x54, 0x3d, 0x17, 0x16, 0x3d, 0x16, 0x3d, + 0x3d, 0xf2, 0x15, 0x70, 0x48, 0x1c, 0x48, 0x48, + 0x23, 0x23, 0xfa, 0x54, 0xcb, 0x5a, 0xfd, 0x40, + 0xf7, 0x28, 0x32, 0x9f, 0x5e, 0xa3, 0x68, 0x5e, + 0x5e, 0x4e, 0x4e, 0x68, 0x9e, 0x5e, 0x4e, 0xa3, + 0x9e, 0x4e, 0x5e, 0x68, 0xa3, 0xa3, 0x9f, 0x32, + 0x89, 0xe, 0x6c, 0x68, 0xa3, 0x68, 0x32, 0x75, + 0x68, 0x68, 0x68, + 0x27, 0x4a, 0x7e, 0x62, 0x8f, 0x27, 0x62, 0x37, + 0x82, 0x8b, 0x76, 0x6c, 0x82, 0xa8, 0x37, 0x5e, + 0x46, 0x27, 0x76, 0x5e, 0x76, 0x74, 0x27, 0x2c, + 0xaa, 0xb4, 0xbf, 0x3, 0xe6, 0x1, 0x15, 0x3d, + 0x15, 0x3d, 0x3b, 0x7f, 0x48, 0x54, 0x39, 0x31, + 0x71, 0x85, 0x90, 0x6a, 0x58, 0x58, 0x6b, 0x6a, + 0x90, 0x9a, 0x63, 0x71, 0x71, 0x85, 0x5d, 0x5d, + 0x81, 0x81, 0x85, 0x6b, 0x71, 0x59, 0x71, 0x6b, + 0x71, 0x80, 0x58, 0x59, 0x6b, 0x71, 0x9a, 0x58, + 0x59, 0x71, 0x5d, 0x6a, 0x71, 0x67, 0x36, 0x71, + 0x85, 0x7f, 0x48, 0x21, 0x7f, 0xa, 0x73, 0x73, + 0xde, 0x16, 0x16, 0x16, 0x16, 0x16, 0x2b, 0x1d, + 0x90, 0xb0, 0xb, 0xd0, 0xcb, 0xd0, 0xd2, 0xbf, + 0xbf, 0xec, 0xe5, 0xbf, 0xbe, 0xbd, 0xc7, 0xd0, + 0xd4, 0xd2, 0xc4, 0xd3, 0xd0, 0xea, 0x3, 0xcb, + 0x99, 0x5a, 0xe6, 0xe1, 0xee, 0xee, 0xf2, 0xf2, + 0xf2, 0x15, 0x73, 0xd8, 0xd3, 0xdb, 0xe0, 0xc4, + 0xc4, 0xc2, 0xd2, 0xd9, 0xd9, 0xd2, 0xd1, 0xc4, + 0xd3, 0xd9, 0xd2, 0xc4, 0xd1, 0xdc, 0xf0, 0xe, + 0x8, 0x8, 0xb7, 0xbf, 0xd3, 0xd3, 0xcb, 0xd8, + 0xd7, 0xde, 0xe1, 0xee, 0xeb, 0xde, 0x34, 0x34, + 0xf9, 0xb4, 0xb4, 0x3, 0xe0, 0xfd, 0xd0, 0xd0, + 0xd1, 0xbf, 0x4a, 0x40, 0x50, 0xaf, 0x99, 0x34, + 0xf2, 0xee, 0x16, 0xee, 0x14, 0xee, 0xee, 0xeb, + 0xf5, 0x15, 0x1d, 0x1c, 0x23, 0x1c, 0x1c, 0xfe, + 0x23, 0x2a, 0x15, 0xf2, 0x15, 0xf2, 0x3d, 0x16, + 0x3d, 0x2b, 0x6e, 0x34, 0x48, 0x90, 0x40, 0x5d, + 0x80, 0x67, 0x5d, 0x6a, 0x7e, 0x5d, 0x5d, 0x4a, + 0x5d, 0x6a, 0x6a, 0x5d, 0x5d, 0x9a, 0x6f, 0x6a, + 0x7e, 0x6a, 0x81, 0x91, 0x6a, 0x5d, 0x81, 0x33, + 0x81, 0x6a, 0x6a, 0x7e, 0x6a, 0x6f, 0x6f, 0x41, + 0x73, 0x3d, 0x16, 0xf2, 0x3d, 0xee, 0xde, 0xd8, + 0xf2, 0xeb, 0xcb, 0xd3, 0xd0, 0x3, 0xd0, 0xd2, + 0xd6, 0xeb, 0x15, 0xfa, 0xfa, 0x5a, 0xf8, 0xfc, + 0x37, 0x37, 0x6c, 0x7, 0x9f, 0x6c, 0x8, 0x6c, + 0x5e, 0x68, 0x5e, 0x9e, 0x68, 0x8d, 0x5e, 0x5e, + 0x5e, 0x5e, 0x6c, 0xcd, 0xce, 0xbf, 0xbf, 0xcb, + 0xa, 0x1, 0xf2, 0xf2, 0x15, 0x15, 0x54, 0x54, + 0x48, 0x23, 0x34, 0x2a, 0x34, 0x48, 0x1d, 0x7f, + 0x70, 0x34, 0x21, 0x1d, 0x23, 0x15, 0x34, 0x34, + 0x34, 0x2b, 0x3b, 0x3d, 0x15, 0x3b, 0x3b, 0x15, + 0x3d, 0x16, 0xf2, 0x3d, 0x15, 0x34, 0x34, 0xeb, + 0xfa, 0xe6, 0xea, 0x7f, 0x41, 0x11, 0x3e, 0x55, + 0x1e, 0x68, 0x5e, 0x5e, 0x28, 0x9f, 0x68, 0x5e, + 0x6c, 0x5e, 0x86, 0x68, 0x68, 0x4e, 0x86, 0x68, + 0xa3, 0xa3, 0x9e, 0x4e, 0x6c, 0x7, 0xdd, 0x8d, + 0x1f, 0xa7, 0x5e, 0x32, 0x32, 0x68, 0xa3, 0x68, + 0x32, 0x5e, 0x32, + 0x30, 0x27, 0xa8, 0x6c, 0x28, 0x2c, 0x2c, 0x28, + 0x5e, 0x28, 0x6c, 0x32, 0x5e, 0x68, 0x86, 0x5e, + 0xfc, 0x46, 0x28, 0x6c, 0x6c, 0xc, 0xbe, 0x2c, + 0xa7, 0xc8, 0xbf, 0xe5, 0xcb, 0xeb, 0xeb, 0xf2, + 0x15, 0x3d, 0x2b, 0x2a, 0xeb, 0x2b, 0xa, 0x6e, + 0x90, 0x6a, 0x5b, 0x6a, 0x5d, 0x5d, 0x6a, 0x7e, + 0x6a, 0x5d, 0x85, 0x85, 0x99, 0x99, 0x83, 0x6a, + 0x6a, 0x7e, 0x7e, 0x91, 0x81, 0x81, 0x81, 0x71, + 0x6b, 0x59, 0x85, 0x90, 0x6b, 0x85, 0x6a, 0x6b, + 0x6b, 0x6a, 0x6a, 0x6a, 0x6a, 0x71, 0x71, 0x85, + 0x90, 0x7f, 0x1d, 0x70, 0x48, 0x15, 0x34, 0x34, + 0xeb, 0x16, 0x14, 0x16, 0x16, 0x3d, 0x3d, 0x73, + 0x7f, 0x41, 0xe5, 0xb, 0x40, 0xe4, 0x50, 0xbe, + 0xbe, 0xf3, 0xa6, 0xcc, 0xc7, 0xc2, 0xc7, 0xbf, + 0xbf, 0xc7, 0xcc, 0xbf, 0xb4, 0xb4, 0xcb, 0x6e, + 0xcb, 0xd8, 0xde, 0xee, 0xf2, 0xf2, 0xee, 0x16, + 0xf2, 0xe1, 0xeb, 0xea, 0xcf, 0xe3, 0xbf, 0xd3, + 0xd3, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xc4, 0xc4, + 0xd2, 0xd2, 0xe7, 0xe7, 0xd5, 0xbe, 0xdd, 0xb8, + 0xbd, 0xc1, 0xc7, 0xc4, 0xd4, 0xd0, 0xed, 0xf1, + 0xd8, 0xde, 0xee, 0xee, 0xe1, 0xeb, 0xeb, 0xfa, + 0xde, 0xe6, 0xcb, 0xe0, 0x3, 0xd0, 0x41, 0x20, + 0x40, 0x83, 0xb0, 0xaf, 0xb4, 0xa, 0xd8, 0xf2, + 0xf2, 0xf2, 0x3d, 0x16, 0x3b, 0x3d, 0x17, 0x17, + 0x21, 0x23, 0x21, 0x15, 0xeb, 0x15, 0xfa, 0x23, + 0xf1, 0xe6, 0xee, 0x3d, 0x15, 0x3f, 0x15, 0x3d, + 0x15, 0xf2, 0x34, 0x34, 0x70, 0x7f, 0x41, 0x83, + 0x5d, 0x6b, 0x81, 0x5b, 0x6a, 0x5d, 0x81, 0x90, + 0x63, 0x85, 0x90, 0x90, 0x6f, 0x90, 0x90, 0x5d, + 0x5d, 0x6b, 0x6a, 0x6b, 0x5d, 0x58, 0x5d, 0x6a, + 0x81, 0x5d, 0x90, 0x7a, 0x6a, 0x6f, 0x41, 0x6e, + 0x3d, 0x22, 0x1d, 0x3b, 0x3d, 0x16, 0x16, 0x16, + 0xf2, 0xe1, 0xde, 0xde, 0xd8, 0x5a, 0xd4, 0xe5, + 0xfd, 0x54, 0x34, 0x2a, 0x48, 0x42, 0x1b, 0xa6, + 0x9c, 0x89, 0x6c, 0xdd, 0x30, 0x82, 0x8d, 0x5e, + 0x82, 0x1f, 0x37, 0x5e, 0x98, 0x93, 0x37, 0xa0, + 0x9c, 0x93, 0x28, 0xf7, 0x27, 0x3e, 0xc8, 0xb, + 0x3, 0xfa, 0x15, 0x15, 0xee, 0x15, 0xf2, 0x15, + 0x15, 0x34, 0x54, 0x2a, 0x48, 0x42, 0x42, 0x67, + 0x99, 0x7f, 0x3f, 0x2a, 0x34, 0x15, 0x3d, 0x15, + 0x15, 0x15, 0x48, 0x54, 0x70, 0x23, 0x1d, 0x3f, + 0x34, 0x3d, 0x15, 0x16, 0xf2, 0xf2, 0x15, 0x34, + 0xeb, 0xfa, 0x7f, 0x4a, 0x8e, 0x9c, 0x46, 0x62, + 0x74, 0x76, 0x5e, 0x74, 0x60, 0xfc, 0x5e, 0x98, + 0x98, 0x5e, 0x68, 0x8b, 0x68, 0x68, 0x4e, 0x5e, + 0x5e, 0xa3, 0x75, 0x8b, 0x74, 0x27, 0x3e, 0x62, + 0x8f, 0x98, 0x75, 0x1f, 0x8b, 0x8d, 0x75, 0x79, + 0x8b, 0x1f, 0x32, + 0x1e, 0x50, 0xc5, 0x2c, 0xf7, 0x2f, 0xa7, 0x5e, + 0x5e, 0x28, 0x68, 0x68, 0x68, 0x79, 0x6c, 0x9f, + 0x5e, 0x89, 0xb7, 0x9f, 0xfc, 0x5f, 0xa7, 0x1e, + 0x5f, 0x60, 0x50, 0xbf, 0xe6, 0x34, 0x15, 0xeb, + 0xf2, 0x2b, 0x23, 0xe6, 0x15, 0x3f, 0x26, 0x67, + 0x63, 0x6b, 0x6a, 0x5d, 0x99, 0x85, 0x90, 0x90, + 0x58, 0x71, 0x6a, 0x6b, 0x58, 0x59, 0x6b, 0x6a, + 0x85, 0x90, 0x6a, 0x6b, 0x6a, 0x95, 0x5d, 0x71, + 0x71, 0x6b, 0x71, 0x71, 0x6b, 0x58, 0x58, 0x6b, + 0x71, 0x9a, 0x58, 0x7f, 0x67, 0x9a, 0x6f, 0x58, + 0x5d, 0x31, 0x59, 0x63, 0x63, 0x42, 0x1d, 0x3f, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x3d, 0x70, 0x48, + 0x99, 0x4d, 0x31, 0x6f, 0x6a, 0x60, 0x60, 0xb4, + 0xb4, 0xba, 0xa6, 0xb4, 0xbf, 0xa1, 0xa1, 0x83, + 0x83, 0x83, 0x4d, 0x7f, 0x5a, 0xa, 0x1, 0x73, + 0xd8, 0xe1, 0xee, 0xee, 0xee, 0xee, 0x16, 0xf2, + 0xf2, 0xf2, 0xf2, 0x15, 0xa, 0xd0, 0xd6, 0xd6, + 0xd6, 0xd3, 0xd2, 0xc4, 0xc4, 0xd2, 0xdb, 0xe7, + 0xd2, 0xc4, 0xd1, 0xd2, 0xdb, 0xbe, 0xdd, 0xb8, + 0xc2, 0xd2, 0xe3, 0x72, 0xbf, 0x5a, 0xf9, 0x23, + 0xde, 0xeb, 0xe1, 0xee, 0xf2, 0xee, 0xee, 0xee, + 0xe1, 0x15, 0x2a, 0xfe, 0x99, 0x99, 0x90, 0x31, + 0x99, 0x99, 0x99, 0x6e, 0x73, 0x34, 0xf2, 0x16, + 0xeb, 0xf2, 0xf2, 0x15, 0x15, 0xeb, 0x70, 0x22, + 0x15, 0x15, 0xf2, 0x15, 0x17, 0x17, 0xf2, 0x16, + 0x15, 0xf2, 0x3d, 0x16, 0x3f, 0x7f, 0x3d, 0x3b, + 0x3b, 0x3b, 0x3b, 0x34, 0x2b, 0x67, 0x67, 0x67, + 0x6b, 0x81, 0x81, 0x6b, 0x58, 0x58, 0x9a, 0x58, + 0x6b, 0x9a, 0x63, 0x9a, 0x71, 0x81, 0x71, 0x58, + 0x71, 0x6b, 0x6b, 0x6b, 0x3a, 0x63, 0x9a, 0x85, + 0x6b, 0x71, 0x58, 0x6b, 0x6b, 0x71, 0x67, 0x3b, + 0x3d, 0x3f, 0x3f, 0x3d, 0x16, 0x3d, 0x16, 0x3d, + 0xf2, 0xee, 0x34, 0xee, 0xfa, 0x66, 0x40, 0xbf, + 0xea, 0xeb, 0xfa, 0x54, 0x99, 0x31, 0x1b, 0x3e, + 0x8f, 0x8f, 0x82, 0x28, 0x46, 0x98, 0x5e, 0x86, + 0x7d, 0x62, 0x5f, 0xa7, 0x9c, 0x8f, 0x82, 0x46, + 0x8b, 0x93, 0x5e, 0x8d, 0x62, 0x46, 0xa0, 0xbe, + 0xcb, 0xa, 0xa, 0xfa, 0xfa, 0x34, 0x23, 0x1d, + 0x3f, 0x1d, 0x7f, 0x39, 0x2b, 0xfa, 0x1d, 0x48, + 0x73, 0x2a, 0xfa, 0xfa, 0xfa, 0x48, 0x1c, 0x48, + 0x2b, 0x3d, 0x34, 0x34, 0x34, 0xfa, 0x34, 0xf5, + 0xeb, 0x15, 0x48, 0x34, 0x15, 0x3d, 0x21, 0x34, + 0x2a, 0x48, 0x66, 0x7e, 0xac, 0x7, 0x28, 0x8d, + 0xa7, 0x7, 0x68, 0x82, 0x98, 0x5e, 0x5e, 0x79, + 0x68, 0x68, 0x68, 0x68, 0x68, 0x75, 0x4e, 0x68, + 0x68, 0xa3, 0x4e, 0x68, 0x8d, 0x68, 0x79, 0x8d, + 0x98, 0x79, 0x68, 0x75, 0x79, 0x75, 0x9f, 0x75, + 0x79, 0x79, 0x68, + 0x5f, 0x60, 0x40, 0x11, 0x62, 0x94, 0x8f, 0x37, + 0x46, 0x62, 0x82, 0x5e, 0x98, 0x74, 0x60, 0xa7, + 0x8d, 0x62, 0x5f, 0xfc, 0x30, 0x62, 0x93, 0x9c, + 0x7e, 0x4a, 0x41, 0xa, 0xeb, 0xf2, 0xf2, 0xee, + 0x15, 0x34, 0x99, 0xeb, 0x3b, 0x42, 0x80, 0x80, + 0x71, 0x71, 0x9a, 0x80, 0x99, 0x4d, 0x63, 0x4d, + 0x4d, 0x71, 0x71, 0x6b, 0x81, 0x6a, 0x6b, 0x81, + 0x6b, 0x71, 0x58, 0x99, 0x80, 0x71, 0x71, 0x6b, + 0x71, 0x6b, 0x6b, 0x6b, 0x6b, 0x71, 0x71, 0x9a, + 0x85, 0x71, 0x58, 0x67, 0x48, 0x36, 0x71, 0x6b, + 0x90, 0x59, 0x71, 0x71, 0x85, 0x9a, 0x42, 0x70, + 0x3d, 0x3d, 0x14, 0x16, 0xff, 0x16, 0x3d, 0x70, + 0x48, 0x42, 0x4d, 0x9a, 0xb0, 0x90, 0x83, 0xaf, + 0xb4, 0x50, 0xaa, 0x6a, 0x5d, 0x6a, 0x6a, 0x6a, + 0xb0, 0x66, 0x42, 0x6e, 0xd8, 0x73, 0x73, 0xe6, + 0xeb, 0xee, 0x16, 0xee, 0xee, 0x14, 0x14, 0xe1, + 0xe1, 0xf2, 0xf2, 0x15, 0xd8, 0xd6, 0xd6, 0xd0, + 0xd6, 0xd9, 0xd2, 0xd1, 0xd2, 0xd2, 0xdb, 0xd3, + 0xc4, 0xc4, 0xc4, 0xd2, 0xdb, 0xc2, 0xcd, 0xdd, + 0xf3, 0xf0, 0xec, 0x50, 0xbf, 0xd0, 0xf1, 0xea, + 0xf1, 0xe6, 0xe6, 0xeb, 0xd8, 0xf5, 0xee, 0x16, + 0x16, 0xee, 0xee, 0x70, 0x80, 0x6e, 0x99, 0x80, + 0x99, 0xa, 0xa, 0x99, 0x34, 0x73, 0xeb, 0xf2, + 0x16, 0xee, 0xee, 0x3d, 0x17, 0xf2, 0xf2, 0x15, + 0x16, 0x15, 0x15, 0x1d, 0x1a, 0x2e, 0x17, 0x17, + 0x17, 0x16, 0x14, 0x16, 0x3d, 0x73, 0x3d, 0x70, + 0x54, 0x54, 0x54, 0x48, 0x31, 0x71, 0x71, 0x5d, + 0x6b, 0x6b, 0x6f, 0x90, 0x5d, 0x9a, 0x9a, 0x90, + 0x6b, 0x6b, 0x81, 0x81, 0x81, 0x81, 0x6a, 0x81, + 0x6b, 0x71, 0x83, 0x97, 0x6f, 0x58, 0x97, 0x90, + 0x6a, 0x6b, 0x81, 0x6a, 0x5d, 0x85, 0x7f, 0x3b, + 0x16, 0x3d, 0x3d, 0x3d, 0x3d, 0x73, 0xeb, 0x15, + 0x34, 0x6e, 0xd7, 0xd8, 0xfa, 0xf9, 0xe5, 0xd0, + 0xd8, 0xde, 0xde, 0xd8, 0x7f, 0x3e, 0x5f, 0x28, + 0x43, 0xfc, 0x5e, 0x68, 0x9f, 0x5e, 0xa3, 0x7, + 0x7, 0x5e, 0x5e, 0x6c, 0x37, 0x8d, 0x5e, 0x68, + 0x5e, 0x28, 0x5e, 0x5e, 0x68, 0x7, 0xdd, 0xcc, + 0xd0, 0xcb, 0x23, 0xd8, 0x15, 0x23, 0xfe, 0x63, + 0x67, 0x42, 0x39, 0x34, 0x34, 0x34, 0x2a, 0xfa, + 0xe6, 0xeb, 0x7f, 0x1d, 0x21, 0x1a, 0x42, 0x42, + 0x22, 0x70, 0x34, 0xf2, 0xf2, 0x16, 0x21, 0x15, + 0xf2, 0xf5, 0x7f, 0x54, 0x34, 0x34, 0x39, 0x1c, + 0xf4, 0xf4, 0x11, 0x2c, 0xf3, 0xf7, 0x68, 0x9f, + 0x32, 0x68, 0x68, 0x68, 0x68, 0x9f, 0x5e, 0x9e, + 0x68, 0x68, 0x4e, 0x4e, 0x68, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x9e, 0x5e, 0x4e, 0xa3, 0x9f, 0x7, + 0xfc, 0xfc, 0x8, 0x6c, 0xa3, 0xa2, 0x32, 0x32, + 0x68, 0xa3, 0x4e, + 0x76, 0x62, 0x30, 0x30, 0x46, 0x8f, 0x8d, 0x5e, + 0x28, 0x82, 0xa7, 0x7, 0x82, 0x93, 0xe, 0x1e, + 0x8d, 0x98, 0x5e, 0x1e, 0x46, 0x89, 0xa7, 0xa8, + 0xaa, 0x85, 0xaf, 0xcb, 0xfa, 0x15, 0x16, 0x16, + 0x16, 0x3d, 0xf2, 0x3d, 0x34, 0x70, 0x3, 0x6e, + 0x9a, 0x6b, 0x85, 0x90, 0x63, 0x58, 0x81, 0x99, + 0x59, 0x81, 0x81, 0x81, 0x6f, 0x81, 0x6a, 0xb0, + 0x6a, 0x91, 0x5d, 0x5d, 0x58, 0x71, 0x6b, 0x81, + 0x6b, 0x81, 0x6b, 0x85, 0x85, 0x71, 0x5d, 0x90, + 0x85, 0x6b, 0x6a, 0x31, 0x59, 0x59, 0x71, 0x71, + 0x99, 0x63, 0x71, 0x99, 0x99, 0x80, 0x80, 0x70, + 0x3b, 0x16, 0x17, 0x14, 0x14, 0x14, 0x16, 0x3b, + 0x34, 0x34, 0x42, 0x9a, 0x6e, 0x40, 0xa8, 0x3e, + 0x3e, 0xc8, 0xaa, 0xaa, 0xb3, 0xb3, 0xb0, 0x66, + 0x6e, 0xa, 0x73, 0x1, 0xf2, 0xde, 0xfa, 0x73, + 0xeb, 0x15, 0x16, 0x16, 0x14, 0xee, 0xff, 0x14, + 0xee, 0xee, 0xf2, 0xde, 0xd8, 0xd6, 0xe0, 0xd5, + 0xc4, 0xd2, 0xd2, 0xd2, 0xc4, 0xc4, 0xc4, 0xd2, + 0xd2, 0xd2, 0xc4, 0xc7, 0xe2, 0xe2, 0xf0, 0xdd, + 0xdd, 0xce, 0xcc, 0xd5, 0xd0, 0xd3, 0xd8, 0xd8, + 0xe0, 0xd7, 0xf1, 0xe0, 0xe0, 0xde, 0xee, 0x15, + 0xde, 0xeb, 0xf2, 0xfa, 0xd8, 0xd8, 0xa, 0x99, + 0x85, 0x54, 0x54, 0x42, 0x48, 0xee, 0xee, 0x14, + 0xee, 0x14, 0x14, 0xf2, 0xee, 0xf2, 0x16, 0x17, + 0x23, 0x21, 0x17, 0x1a, 0x1a, 0x1a, 0x1d, 0x1d, + 0x21, 0x15, 0xf5, 0x3d, 0x3d, 0x34, 0x34, 0x34, + 0x2a, 0x54, 0x54, 0x39, 0x3a, 0x5d, 0x6a, 0x6a, + 0x6a, 0x85, 0x63, 0x90, 0x5d, 0x58, 0x90, 0x90, + 0x81, 0x81, 0x81, 0x7e, 0x6a, 0x6a, 0x6a, 0xb0, + 0x83, 0x3a, 0x4d, 0x99, 0x6a, 0x5d, 0x6b, 0x58, + 0x58, 0x81, 0x6a, 0x81, 0x71, 0x63, 0x7f, 0x3d, + 0x3d, 0x3f, 0x3d, 0x3d, 0x3d, 0xeb, 0xeb, 0xeb, + 0xeb, 0xc9, 0xd3, 0xe0, 0xcb, 0xf9, 0xcb, 0xd6, + 0xa, 0x2a, 0xfa, 0x15, 0x2a, 0x83, 0xa7, 0x6c, + 0xfc, 0x30, 0x5e, 0xb6, 0x7, 0x68, 0xfc, 0xf7, + 0x37, 0x5e, 0x9e, 0xfc, 0xfc, 0x28, 0x86, 0x5e, + 0x7, 0x1f, 0xe, 0x6c, 0x7, 0x28, 0xf7, 0xe4, + 0x41, 0x40, 0x40, 0xe0, 0xeb, 0xeb, 0x54, 0x9, + 0x6e, 0x6e, 0x23, 0xfa, 0xeb, 0x2a, 0x39, 0x48, + 0x15, 0x3b, 0x7f, 0x48, 0x34, 0x3b, 0x23, 0x54, + 0x73, 0x1, 0xfa, 0xfa, 0x15, 0x21, 0x42, 0x1d, + 0x15, 0x16, 0xeb, 0xeb, 0xf2, 0x15, 0x23, 0x5a, + 0xf4, 0xc6, 0xa0, 0x46, 0x27, 0x5e, 0x86, 0x32, + 0x28, 0x1f, 0x46, 0x76, 0x82, 0x7, 0xb6, 0x37, + 0x5e, 0x4e, 0x68, 0x5e, 0x86, 0x68, 0xa3, 0x68, + 0x75, 0xa3, 0x68, 0x68, 0x9f, 0x7, 0xb8, 0xcd, + 0x30, 0x30, 0x28, 0x32, 0x75, 0x75, 0x32, 0x32, + 0x75, 0x68, 0x68, + 0xfc, 0x28, 0x5e, 0x5e, 0x68, 0x28, 0x37, 0x7, + 0x5e, 0x9f, 0x5e, 0x9f, 0x5e, 0x68, 0x86, 0x9f, + 0x9f, 0xfc, 0x6c, 0xb8, 0x6c, 0x8, 0xba, 0xba, + 0x83, 0x6a, 0xb0, 0xd0, 0xf1, 0x23, 0x48, 0x2a, + 0x22, 0x17, 0x16, 0x3d, 0x34, 0xf2, 0xd8, 0xa, + 0xb4, 0x6a, 0x6a, 0x6a, 0x58, 0x5d, 0x6a, 0x5d, + 0x6f, 0x55, 0x55, 0x4a, 0x90, 0x7e, 0x6a, 0xb0, + 0xb0, 0x6a, 0x6a, 0x6a, 0x5d, 0x71, 0x6a, 0x6f, + 0x85, 0x71, 0x6f, 0x63, 0x99, 0x85, 0x6a, 0x83, + 0x3a, 0x5d, 0x81, 0x81, 0x6b, 0x71, 0x31, 0x90, + 0x99, 0x80, 0x85, 0x4d, 0x7f, 0x58, 0x5d, 0x80, + 0x3f, 0x16, 0x17, 0x17, 0x16, 0x3d, 0x16, 0xf2, + 0xf2, 0x34, 0x7f, 0x7f, 0x54, 0x83, 0xaa, 0xaa, + 0x40, 0x11, 0x50, 0xb0, 0x3, 0xbf, 0xcb, 0xc0, + 0xeb, 0xee, 0xeb, 0xf2, 0x16, 0x16, 0x34, 0x23, + 0x73, 0xe1, 0xf2, 0xee, 0xee, 0xee, 0x14, 0x14, + 0xee, 0xe1, 0xeb, 0xf1, 0xd7, 0xd7, 0xed, 0xd4, + 0xc4, 0xc4, 0xd2, 0xd3, 0xd3, 0xd2, 0xc4, 0xd2, + 0xd3, 0xdb, 0xe7, 0xcd, 0xcd, 0xce, 0xe7, 0xec, + 0xce, 0xc2, 0xc4, 0xd2, 0xd9, 0xd6, 0xa, 0xd0, + 0xe0, 0xde, 0xe6, 0x41, 0x5a, 0xd8, 0xe1, 0xeb, + 0xde, 0xd8, 0xeb, 0xeb, 0x6e, 0xfa, 0x23, 0x80, + 0x99, 0x2b, 0xee, 0x16, 0x16, 0x14, 0xff, 0xff, + 0x14, 0x16, 0x14, 0x15, 0x21, 0x22, 0x17, 0x22, + 0x36, 0x15, 0x17, 0x22, 0x23, 0x1d, 0xfa, 0xeb, + 0x23, 0x15, 0xf2, 0x15, 0x21, 0x3d, 0x3f, 0xf2, + 0x70, 0x34, 0x2a, 0xf9, 0x31, 0x5d, 0x85, 0x90, + 0x5d, 0x58, 0x58, 0x5d, 0x81, 0x6b, 0x63, 0x4d, + 0x71, 0x71, 0x83, 0x83, 0x4c, 0x5d, 0x99, 0x6f, + 0x58, 0x58, 0x58, 0x71, 0x6b, 0x81, 0x71, 0x31, + 0x3a, 0x6b, 0x81, 0x81, 0x71, 0x59, 0x3f, 0x3b, + 0x3f, 0x42, 0x3f, 0x3d, 0x2b, 0x3b, 0xf2, 0xee, + 0xf2, 0xde, 0xd8, 0xd8, 0xe6, 0xf9, 0x20, 0x41, + 0x3, 0x99, 0x48, 0xfa, 0x23, 0x90, 0x55, 0xa8, + 0x3e, 0x55, 0x76, 0x28, 0x5f, 0x93, 0x5e, 0x37, + 0x8d, 0x82, 0x5e, 0x28, 0x46, 0x98, 0x68, 0x6c, + 0xa9, 0x2f, 0x8d, 0x37, 0x8b, 0x9c, 0x76, 0x2f, + 0x7e, 0x60, 0xa6, 0xb4, 0xa, 0xeb, 0x34, 0x34, + 0xd8, 0xa, 0x23, 0xfa, 0xfa, 0xf9, 0x36, 0x1c, + 0x3f, 0x2b, 0x48, 0x73, 0xeb, 0x15, 0x15, 0x15, + 0xf2, 0x15, 0x21, 0x15, 0x22, 0x3f, 0x42, 0x48, + 0x15, 0x3d, 0x3d, 0x3d, 0xf2, 0x34, 0x54, 0x3a, + 0x4a, 0x2f, 0x1e, 0x62, 0x8f, 0x5e, 0x68, 0x8b, + 0x8f, 0x9c, 0x9c, 0x8f, 0x62, 0x6c, 0x28, 0x8b, + 0x8b, 0xa3, 0x9e, 0x98, 0x98, 0x68, 0x68, 0x8b, + 0x4e, 0x68, 0x5e, 0x8b, 0x98, 0x9f, 0x28, 0xe, + 0x8f, 0x89, 0x75, 0x79, 0x98, 0x79, 0x68, 0x79, + 0x79, 0x8d, 0x9f, + 0x12, 0x46, 0xa7, 0xb8, 0x6c, 0x37, 0x12, 0x28, + 0x68, 0x79, 0x8d, 0xfc, 0x1f, 0x82, 0x32, 0x7, + 0xe, 0x12, 0xa0, 0xcd, 0xa8, 0x7e, 0x4a, 0x58, + 0x6a, 0x5d, 0x99, 0x73, 0x34, 0xfa, 0xd8, 0xeb, + 0x34, 0x15, 0x16, 0x3b, 0x3f, 0x48, 0x3b, 0x15, + 0x1d, 0x71, 0x6f, 0x90, 0x90, 0x58, 0x3a, 0x99, + 0x9a, 0x5d, 0x6a, 0x6b, 0x81, 0x6a, 0x6a, 0x58, + 0x63, 0x6b, 0x90, 0x99, 0x99, 0x4d, 0x58, 0x85, + 0x85, 0x6f, 0x6b, 0x58, 0x58, 0x6b, 0x81, 0x58, + 0x42, 0x58, 0x6b, 0x90, 0x99, 0x9a, 0x58, 0x71, + 0x71, 0x58, 0x6b, 0x71, 0x59, 0x71, 0x9a, 0x7f, + 0x73, 0x16, 0x14, 0x14, 0xff, 0x16, 0x16, 0xf2, + 0xee, 0x34, 0x1c, 0x1a, 0x42, 0x31, 0x90, 0x85, + 0x6e, 0xa, 0x54, 0x54, 0xa, 0xd8, 0xa, 0x2a, + 0x15, 0x15, 0xeb, 0xee, 0x14, 0x14, 0x16, 0xf2, + 0x16, 0xee, 0xee, 0xff, 0x14, 0xff, 0x14, 0x16, + 0x14, 0xee, 0xeb, 0xa, 0xe6, 0xd8, 0xd6, 0xd3, + 0xd2, 0xc4, 0xc4, 0xd2, 0xdb, 0xd2, 0xc4, 0xc7, + 0xd1, 0xc4, 0xc4, 0xc1, 0xc2, 0xc4, 0xd1, 0xd2, + 0xd1, 0xc7, 0xc2, 0xc7, 0xe7, 0xd9, 0xcb, 0xf9, + 0xed, 0xa, 0xe6, 0xa, 0xcb, 0xd8, 0x15, 0xf2, + 0xe1, 0xeb, 0xf2, 0xfa, 0x23, 0x21, 0x21, 0x23, + 0x2b, 0x16, 0x14, 0x14, 0xff, 0xff, 0x14, 0xff, + 0xff, 0x14, 0x14, 0x22, 0x22, 0x1d, 0x22, 0x21, + 0x21, 0x3f, 0x3d, 0x17, 0x3b, 0xf5, 0x14, 0x3d, + 0x3d, 0x14, 0x3d, 0x3f, 0x48, 0x3d, 0x34, 0x3d, + 0x70, 0x34, 0x48, 0x99, 0x6a, 0x6b, 0x9a, 0x71, + 0x81, 0x71, 0x71, 0x71, 0x6b, 0x6b, 0x71, 0x99, + 0x9a, 0x58, 0x31, 0x66, 0x71, 0x6f, 0x85, 0x31, + 0x71, 0x71, 0x6b, 0x6b, 0x71, 0x71, 0x71, 0x99, + 0x80, 0x6b, 0x6b, 0x6b, 0x71, 0x80, 0x3b, 0x3d, + 0x3d, 0x70, 0x34, 0x3d, 0x34, 0x48, 0x34, 0x15, + 0x73, 0x34, 0xf2, 0xf2, 0xeb, 0x90, 0x3e, 0x50, + 0x3, 0x6e, 0xfa, 0x34, 0x54, 0x4d, 0x4a, 0x60, + 0x60, 0x74, 0x76, 0x37, 0x93, 0x98, 0x68, 0x68, + 0x9c, 0x5f, 0x5e, 0x82, 0xa8, 0x9c, 0x5e, 0x37, + 0x7d, 0x98, 0x5e, 0x82, 0x62, 0x93, 0x76, 0x82, + 0xb3, 0x50, 0xbe, 0xbf, 0xd4, 0x5a, 0x5a, 0xf9, + 0x34, 0xfa, 0xe6, 0x34, 0x15, 0x2b, 0x23, 0x48, + 0x73, 0x2a, 0xfa, 0x34, 0x34, 0x48, 0x48, 0x21, + 0x3d, 0x15, 0x2b, 0x34, 0x3d, 0xf2, 0xeb, 0x15, + 0xf2, 0x15, 0xfa, 0x15, 0x34, 0xf9, 0x5b, 0x7d, + 0x30, 0xe, 0x37, 0x93, 0x8d, 0x6c, 0x8, 0x62, + 0x93, 0x6c, 0x8, 0x8f, 0x62, 0x5e, 0x68, 0x68, + 0x68, 0x68, 0x68, 0x68, 0x68, 0xa3, 0x9f, 0x75, + 0x5e, 0x4e, 0x9e, 0x68, 0x4e, 0x68, 0xfc, 0x32, + 0x75, 0x68, 0xa2, 0x6c, 0x1e, 0x75, 0x9e, 0x6c, + 0x28, 0xfc, 0x32, + 0xc, 0x8f, 0x62, 0x28, 0x82, 0x62, 0x8b, 0x5e, + 0x98, 0x8f, 0x98, 0x76, 0x9c, 0x8f, 0x5f, 0xb7, + 0x2c, 0x94, 0x74, 0x74, 0x7e, 0x91, 0x81, 0x6b, + 0x63, 0x9a, 0x54, 0x15, 0x3d, 0xf2, 0xf2, 0x16, + 0xf2, 0x17, 0x15, 0x34, 0x7f, 0x42, 0x67, 0x70, + 0x7f, 0x9a, 0x9a, 0x99, 0x99, 0x9a, 0x67, 0x39, + 0x80, 0x6b, 0x5d, 0x81, 0x6b, 0x6b, 0x6b, 0x71, + 0x71, 0x71, 0x71, 0x7f, 0x48, 0x80, 0x85, 0x80, + 0x99, 0x71, 0x6b, 0x6b, 0x6b, 0x71, 0x6b, 0x6b, + 0x9a, 0x80, 0x85, 0x67, 0x42, 0x71, 0x6b, 0x71, + 0x71, 0x81, 0x81, 0x6b, 0x5d, 0x90, 0x42, 0x48, + 0x34, 0x16, 0xff, 0x14, 0xff, 0x14, 0x16, 0x14, + 0x16, 0x16, 0x34, 0x34, 0x15, 0x73, 0x54, 0x39, + 0x7f, 0x54, 0x99, 0x48, 0x73, 0x73, 0x34, 0x34, + 0xf2, 0xee, 0xee, 0x14, 0x14, 0x16, 0x16, 0x16, + 0x14, 0xff, 0xff, 0x14, 0xff, 0x14, 0x16, 0xf2, + 0x14, 0xee, 0xf2, 0xd8, 0xd7, 0xd6, 0xd3, 0xd3, + 0xd9, 0xd9, 0xc4, 0xce, 0xbe, 0xd2, 0xd2, 0xd1, + 0xc2, 0xd2, 0xc4, 0xd2, 0xc4, 0xd1, 0xc2, 0xce, + 0xdc, 0xdc, 0xdc, 0xcd, 0xd1, 0xcb, 0xd6, 0xe0, + 0xe0, 0xe0, 0xcb, 0xcb, 0xf1, 0xf1, 0xa, 0x23, + 0xeb, 0xf2, 0xf2, 0x16, 0x15, 0x16, 0x15, 0xf5, + 0x14, 0x14, 0x14, 0x14, 0x16, 0xff, 0x14, 0x14, + 0x14, 0x14, 0x17, 0x17, 0x2a, 0x17, 0x15, 0xfa, + 0xfa, 0xfa, 0xfa, 0xeb, 0xfa, 0x3d, 0x14, 0x16, + 0x3d, 0x17, 0x16, 0x3d, 0x34, 0xf2, 0xee, 0x73, + 0xde, 0x15, 0x48, 0x85, 0x6a, 0x5d, 0x31, 0x81, + 0x6b, 0x9a, 0x99, 0x97, 0x90, 0x6f, 0xb0, 0xaf, + 0x90, 0x58, 0x59, 0x5d, 0x6a, 0x81, 0x58, 0x3a, + 0x71, 0x6b, 0x71, 0xb0, 0x41, 0x59, 0x5d, 0x6f, + 0x6a, 0x6b, 0x58, 0x6b, 0x71, 0x80, 0x3b, 0x3d, + 0x3d, 0x3d, 0x3d, 0xf2, 0x1, 0xde, 0xde, 0xd8, + 0xd6, 0xd6, 0xe6, 0xeb, 0xf1, 0xb, 0xc8, 0xcc, + 0xd3, 0xe6, 0xeb, 0xd8, 0x54, 0x20, 0x1b, 0x27, + 0x5f, 0x76, 0x5e, 0xfc, 0x12, 0x28, 0x5e, 0x9f, + 0xdd, 0x2c, 0x1e, 0xa3, 0x9f, 0x5e, 0x28, 0x1f, + 0x5e, 0x86, 0x68, 0x68, 0xe, 0xe, 0x9f, 0x5e, + 0xa0, 0xb9, 0xf3, 0xf8, 0xc8, 0xe4, 0x50, 0x1b, + 0x23, 0xe6, 0xe6, 0xeb, 0xeb, 0xeb, 0xf5, 0xeb, + 0x1, 0xde, 0xfa, 0xfa, 0x39, 0x7f, 0x41, 0x42, + 0x34, 0xeb, 0xfa, 0x15, 0xee, 0x15, 0xf2, 0xf2, + 0xee, 0x15, 0x15, 0xe6, 0x6e, 0x41, 0xf7, 0x9f, + 0x28, 0x37, 0x9f, 0x5e, 0x9e, 0x6c, 0x28, 0x28, + 0x5e, 0x5e, 0x68, 0x8d, 0x46, 0x5e, 0x5e, 0x68, + 0x68, 0x68, 0x8, 0x9f, 0x4e, 0x4e, 0xa3, 0xa3, + 0xa3, 0x68, 0xa3, 0x4e, 0xa3, 0xa3, 0x32, 0x9f, + 0x9f, 0xa3, 0x4e, 0x9f, 0x75, 0x68, 0xa3, 0xa3, + 0x32, 0x75, 0x75, + 0xa7, 0x8d, 0x8d, 0x37, 0x5e, 0x8d, 0x8d, 0x5e, + 0x37, 0x62, 0x7d, 0x7, 0xa0, 0x5f, 0x2f, 0xa0, + 0xa7, 0x7d, 0x93, 0x30, 0x6a, 0x81, 0x6a, 0x90, + 0x54, 0x1d, 0x54, 0x54, 0x73, 0xee, 0x16, 0x14, + 0x16, 0x3d, 0x3d, 0x17, 0x48, 0x70, 0x48, 0x73, + 0x54, 0x99, 0x58, 0x31, 0x63, 0x58, 0x99, 0x48, + 0x63, 0x6b, 0x83, 0x6f, 0x6b, 0x81, 0x81, 0x6a, + 0x85, 0x85, 0x71, 0x59, 0x71, 0x71, 0x9a, 0x7f, + 0x36, 0x71, 0x71, 0x71, 0x85, 0x85, 0x6b, 0x6b, + 0x85, 0x85, 0x3a, 0x4d, 0x59, 0x6b, 0x91, 0x90, + 0x58, 0x5d, 0x6a, 0x6a, 0x80, 0x6e, 0x23, 0x73, + 0x3b, 0x73, 0x3d, 0x16, 0x3d, 0x18, 0x14, 0x16, + 0x16, 0x16, 0xf2, 0x16, 0x3d, 0xeb, 0xfa, 0x23, + 0x42, 0x7f, 0x99, 0x99, 0x3d, 0xee, 0xf2, 0xf2, + 0xee, 0xee, 0x14, 0xf2, 0x14, 0xf2, 0xee, 0x14, + 0xff, 0x14, 0x14, 0xff, 0x14, 0x14, 0xf2, 0x14, + 0xee, 0xe1, 0xde, 0xd7, 0xd7, 0xd2, 0xd2, 0xe7, + 0xe7, 0xdb, 0xd2, 0xc7, 0xc2, 0xc4, 0xd9, 0xd3, + 0xc4, 0xd1, 0xc4, 0xd2, 0xe7, 0xc7, 0xc2, 0xcd, + 0xdd, 0xf3, 0xce, 0xc1, 0xbf, 0xd3, 0xe0, 0xd7, + 0xd7, 0xd6, 0xd3, 0xed, 0xec, 0xed, 0x41, 0xe3, + 0x5a, 0x15, 0xf2, 0x16, 0xf2, 0x3d, 0xf2, 0xee, + 0x14, 0xff, 0x14, 0x14, 0x14, 0xff, 0x14, 0x14, + 0x14, 0x17, 0xf5, 0xeb, 0xe1, 0x16, 0x15, 0xeb, + 0xfa, 0xde, 0x54, 0x23, 0x23, 0x15, 0x14, 0x16, + 0xf5, 0x15, 0x16, 0x3d, 0x15, 0x34, 0x34, 0xde, + 0xee, 0x2b, 0xfe, 0x6a, 0x6a, 0x6a, 0x71, 0x4a, + 0x60, 0x6f, 0x9a, 0x80, 0x6f, 0x41, 0x99, 0x6f, + 0x4a, 0x58, 0x58, 0x6a, 0x8e, 0x91, 0x6a, 0x58, + 0x90, 0x6b, 0x5d, 0x6f, 0x90, 0x58, 0x6b, 0x91, + 0x7e, 0x6a, 0x5d, 0x6a, 0x80, 0x99, 0x3b, 0x15, + 0x3d, 0xf2, 0x3d, 0xf2, 0xeb, 0xeb, 0xeb, 0xd8, + 0xd6, 0xd6, 0xd6, 0xde, 0xf1, 0x3, 0xbf, 0xbf, + 0xd0, 0xa, 0xeb, 0x15, 0x21, 0xfe, 0x1b, 0x60, + 0x5f, 0xa7, 0x28, 0x5e, 0xe, 0xa0, 0x68, 0x68, + 0x6c, 0x37, 0x5e, 0x68, 0x68, 0x68, 0x86, 0x5e, + 0x5e, 0xa3, 0x5e, 0x9e, 0x28, 0xa0, 0x6c, 0x5e, + 0x6c, 0x37, 0x28, 0x28, 0xc, 0xa0, 0xf8, 0xe4, + 0x5a, 0xe0, 0xe0, 0xf1, 0x15, 0xeb, 0x15, 0x15, + 0xf2, 0x16, 0xf2, 0x15, 0x48, 0xf9, 0x6e, 0x23, + 0x34, 0x15, 0x1, 0xeb, 0x15, 0xeb, 0x34, 0xeb, + 0x15, 0xeb, 0xeb, 0xeb, 0x2a, 0xfd, 0xf3, 0x8, + 0x68, 0x6c, 0x7, 0x6c, 0x32, 0x68, 0x9e, 0x8d, + 0x82, 0x5e, 0x5e, 0x98, 0x98, 0x68, 0x86, 0x4e, + 0x68, 0xa3, 0xa3, 0x68, 0xa3, 0x68, 0x4e, 0x68, + 0xa3, 0x4e, 0xa3, 0x68, 0xa3, 0xa3, 0x68, 0x8, + 0xa0, 0x32, 0x86, 0x68, 0x79, 0x79, 0x32, 0x75, + 0x79, 0x75, 0x68, + 0x68, 0x68, 0x68, 0xfc, 0x28, 0x5e, 0xa3, 0x8, + 0x2c, 0x1f, 0x5e, 0x9f, 0x68, 0x28, 0x46, 0x37, + 0x5e, 0x76, 0x9c, 0x60, 0x41, 0x90, 0x54, 0xcb, + 0x73, 0x1, 0xe6, 0xcb, 0x6e, 0x73, 0x48, 0x3b, + 0x3f, 0x70, 0x3d, 0x16, 0xf2, 0xf2, 0x34, 0x1, + 0xcb, 0xfd, 0x41, 0x40, 0x4a, 0x6a, 0x6f, 0x59, + 0x58, 0x5d, 0x6f, 0x58, 0x90, 0x83, 0x83, 0xb0, + 0x6a, 0x7e, 0x6a, 0x5d, 0x81, 0x6a, 0x6a, 0x71, + 0x80, 0x99, 0x97, 0x90, 0x9a, 0x58, 0x6f, 0x6a, + 0x6f, 0x6f, 0x6f, 0x58, 0x71, 0x5d, 0x6a, 0x6a, + 0x5d, 0x90, 0x90, 0x41, 0x99, 0xf1, 0xfa, 0x15, + 0x3b, 0x54, 0x70, 0x16, 0x16, 0x16, 0x16, 0x16, + 0xff, 0x14, 0x14, 0x14, 0x18, 0xee, 0xf2, 0x34, + 0xfa, 0xa, 0xa, 0x48, 0x15, 0x15, 0x16, 0xee, + 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, 0xee, 0xee, + 0x14, 0x14, 0x14, 0x14, 0x14, 0xf5, 0xeb, 0xeb, + 0xf5, 0xf1, 0xd7, 0xd7, 0xd7, 0xd3, 0xc4, 0xd2, + 0xdb, 0xdb, 0xd2, 0xc4, 0xc4, 0xd3, 0xd2, 0xc4, + 0xd1, 0xd1, 0xc4, 0xcc, 0xba, 0xdd, 0xbd, 0xbd, + 0xb8, 0xcd, 0xc2, 0xc2, 0xd1, 0xd0, 0xd0, 0xd3, + 0xf1, 0xe6, 0xe0, 0xd9, 0xed, 0xed, 0x5a, 0xd0, + 0xcb, 0xe6, 0x15, 0xeb, 0xfa, 0x15, 0x15, 0x16, + 0x16, 0x14, 0x14, 0x14, 0xff, 0x14, 0x14, 0x16, + 0x15, 0x16, 0x15, 0x15, 0x15, 0x17, 0x22, 0x21, + 0x15, 0x15, 0x15, 0xeb, 0xe1, 0x16, 0x14, 0xf5, + 0xee, 0x15, 0x3d, 0x48, 0x34, 0x3d, 0xf2, 0x3d, + 0x3d, 0x3b, 0x99, 0x9d, 0x83, 0x90, 0x5d, 0x5d, + 0x6f, 0x5d, 0x6b, 0x81, 0x5d, 0x71, 0x71, 0x5d, + 0x6f, 0x7f, 0x80, 0x6f, 0x90, 0x6f, 0x6b, 0x6f, + 0x6f, 0x71, 0x71, 0x5d, 0x81, 0x6b, 0x81, 0x6a, + 0x6a, 0x5d, 0x6f, 0x99, 0x54, 0x2b, 0x16, 0x3d, + 0x15, 0x15, 0x2b, 0x48, 0x70, 0xf2, 0xf2, 0xde, + 0xd8, 0xde, 0xde, 0xde, 0x15, 0x23, 0xec, 0x50, + 0xb, 0x73, 0x34, 0x21, 0x22, 0x54, 0x26, 0x5d, + 0x60, 0x50, 0xa8, 0x5e, 0x93, 0x93, 0x28, 0x28, + 0x46, 0x93, 0x5e, 0x5e, 0x5c, 0x5f, 0x6c, 0x8d, + 0x8b, 0xa8, 0xfc, 0x5e, 0x93, 0x98, 0x5e, 0x28, + 0x7d, 0x9c, 0x6c, 0x76, 0x74, 0xa1, 0xcc, 0xbf, + 0x41, 0x3, 0xcb, 0xd8, 0x2a, 0x73, 0xeb, 0x3d, + 0x17, 0x15, 0x3d, 0x14, 0x3d, 0xee, 0xeb, 0xeb, + 0xf2, 0xeb, 0xeb, 0xee, 0x15, 0xfa, 0x73, 0x34, + 0x2b, 0x34, 0xeb, 0xfa, 0x7f, 0xfd, 0x20, 0x55, + 0x8f, 0x5e, 0x68, 0x93, 0x62, 0x68, 0x5e, 0x98, + 0x8f, 0x5f, 0x3e, 0xaa, 0x8f, 0x68, 0x68, 0x8f, + 0x8b, 0x68, 0x68, 0x98, 0x98, 0x68, 0x68, 0x98, + 0x68, 0x68, 0x4e, 0x7d, 0x86, 0x4e, 0x68, 0x76, + 0x46, 0x79, 0x68, 0x79, 0x8b, 0x98, 0x1e, 0x5c, + 0x8f, 0x79, 0x68, + 0x68, 0x5e, 0x5e, 0x5e, 0x8, 0x76, 0x76, 0x5e, + 0x37, 0x98, 0x8d, 0x68, 0x37, 0x98, 0x8b, 0x7d, + 0x94, 0x6a, 0x91, 0x6a, 0x99, 0x6e, 0x23, 0xfa, + 0xfa, 0x34, 0x15, 0x73, 0x73, 0x73, 0x34, 0x16, + 0x54, 0x2a, 0x34, 0x21, 0x3b, 0xf2, 0x3d, 0x15, + 0x34, 0x7f, 0x9, 0x80, 0x99, 0x99, 0x85, 0x71, + 0x71, 0x9a, 0x58, 0x71, 0x71, 0x6b, 0x58, 0x63, + 0x5d, 0x6a, 0xb0, 0x6f, 0x81, 0x90, 0x83, 0x71, + 0x85, 0x90, 0x58, 0x58, 0x6b, 0x6b, 0x6b, 0x58, + 0x71, 0x71, 0x9a, 0x80, 0x85, 0x99, 0x97, 0x71, + 0x71, 0x6b, 0x71, 0x63, 0x59, 0x59, 0x48, 0x3f, + 0x3f, 0x15, 0xf2, 0x3d, 0x16, 0x14, 0x14, 0x14, + 0x14, 0x16, 0x14, 0x16, 0x14, 0x14, 0x14, 0x16, + 0x16, 0x16, 0x3d, 0xee, 0x14, 0xf2, 0xee, 0x14, + 0x14, 0x14, 0xff, 0xff, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0xff, 0x16, 0xf2, 0xeb, 0x23, + 0xfe, 0xed, 0xd0, 0xd3, 0xd7, 0xd7, 0xd6, 0xd3, + 0xd3, 0xd2, 0xd3, 0xd9, 0xd2, 0xd1, 0xd1, 0xc4, + 0xe2, 0xe7, 0xd1, 0xc2, 0xc1, 0xc1, 0xd1, 0xd1, + 0xc1, 0xdd, 0xc1, 0xcd, 0xcd, 0xcd, 0xc7, 0xc2, + 0xd0, 0xe0, 0xe6, 0xcb, 0xcb, 0xe6, 0xe6, 0xe6, + 0xeb, 0x54, 0x54, 0xfa, 0x22, 0x21, 0x17, 0xf2, + 0xf5, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, + 0x3d, 0x15, 0x1d, 0x48, 0x22, 0x2e, 0x2e, 0x22, + 0x17, 0x3d, 0x15, 0x3d, 0x14, 0x16, 0x3d, 0x16, + 0x14, 0x16, 0x3d, 0x73, 0x15, 0x3d, 0x3b, 0x3f, + 0x15, 0x48, 0x59, 0x63, 0x66, 0x99, 0x71, 0x6a, + 0x6f, 0x63, 0x58, 0x6b, 0x6b, 0x6b, 0x71, 0x59, + 0x99, 0x67, 0x63, 0x59, 0x59, 0x80, 0x71, 0x6b, + 0x6b, 0x6b, 0x58, 0x81, 0x6b, 0x81, 0x6b, 0x6a, + 0x31, 0x85, 0x71, 0x80, 0x48, 0x15, 0x16, 0x3d, + 0x3d, 0x16, 0x3b, 0x23, 0x73, 0xde, 0xeb, 0xde, + 0xde, 0xe1, 0xde, 0xeb, 0x1, 0xfa, 0xf9, 0x40, + 0xb4, 0xd8, 0x73, 0xfa, 0x73, 0x54, 0x41, 0x60, + 0x55, 0x55, 0x76, 0x5e, 0x98, 0x93, 0x1f, 0x1f, + 0x98, 0x93, 0x6c, 0x5e, 0x30, 0xb3, 0x28, 0x8d, + 0x98, 0x98, 0x46, 0x8d, 0x98, 0x8d, 0x5e, 0x1e, + 0x93, 0xa7, 0xa0, 0xa7, 0x74, 0x60, 0x2c, 0xa9, + 0xaa, 0x50, 0x3, 0xea, 0x54, 0xa, 0xd8, 0xf2, + 0x15, 0xf5, 0x15, 0x15, 0xfa, 0x2a, 0xeb, 0x34, + 0x15, 0x34, 0xf2, 0x15, 0xfa, 0xa, 0xd8, 0xe6, + 0xa, 0xea, 0x3, 0x41, 0xad, 0x1e, 0xfc, 0x93, + 0x8d, 0xa3, 0x68, 0x5e, 0x32, 0x9f, 0x9f, 0x6c, + 0x68, 0x1e, 0x5f, 0x8f, 0x98, 0x68, 0x68, 0x5e, + 0x68, 0x4e, 0x0, 0x68, 0xa3, 0x68, 0xa3, 0x68, + 0x4e, 0x4e, 0x9e, 0x5e, 0x4e, 0x4e, 0xa3, 0x86, + 0x79, 0x75, 0x68, 0x75, 0xa3, 0x8b, 0x68, 0xa3, + 0x68, 0x8b, 0x4e, + 0xf3, 0x74, 0x93, 0x5e, 0x82, 0x62, 0x46, 0x5e, + 0x8d, 0x8b, 0x93, 0xe, 0x55, 0xaa, 0x94, 0x91, + 0x9d, 0x90, 0x95, 0x6a, 0x71, 0x9a, 0x36, 0x36, + 0x48, 0x48, 0x34, 0x34, 0x34, 0x16, 0xee, 0x16, + 0xeb, 0xeb, 0x21, 0x1d, 0x7f, 0x3b, 0x15, 0x3f, + 0x70, 0x48, 0x54, 0x67, 0x66, 0x67, 0x42, 0x71, + 0x59, 0x71, 0x59, 0x71, 0x6b, 0x6b, 0x71, 0x71, + 0x71, 0x85, 0x9a, 0x58, 0x6a, 0x9a, 0x67, 0x85, + 0x71, 0x71, 0x58, 0x59, 0x71, 0x81, 0x81, 0x6a, + 0x59, 0x42, 0x99, 0x67, 0x58, 0x63, 0x42, 0x59, + 0x6b, 0x6b, 0x6b, 0x59, 0x59, 0x71, 0x99, 0x80, + 0x7f, 0x3b, 0x3d, 0x3d, 0x16, 0x14, 0x14, 0x14, + 0x16, 0x3d, 0x14, 0x3d, 0x17, 0x16, 0x14, 0xee, + 0x14, 0xff, 0x14, 0x14, 0x16, 0xee, 0x16, 0x16, + 0x14, 0x16, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x16, 0x14, 0x14, 0x14, 0x16, 0xf2, 0xf5, 0xf1, + 0xf9, 0xe7, 0xc4, 0xd2, 0xd2, 0xd6, 0xe0, 0xd6, + 0xd0, 0xd4, 0xc4, 0xd9, 0xe7, 0xcc, 0xc4, 0xc4, + 0xc4, 0xdb, 0xd2, 0xc4, 0xc2, 0xc1, 0xd5, 0xd1, + 0xdd, 0x9f, 0xf7, 0x7, 0x7, 0xb8, 0xc1, 0xd1, + 0xd1, 0xd3, 0xd6, 0xd3, 0xd0, 0x3, 0xfd, 0x54, + 0x2a, 0x1d, 0x36, 0x34, 0x15, 0x15, 0x3d, 0x3d, + 0xf2, 0x3d, 0x17, 0x16, 0x14, 0x17, 0x17, 0x18, + 0x16, 0x15, 0x1d, 0xfa, 0xeb, 0x17, 0x17, 0x15, + 0xeb, 0xf5, 0x15, 0x15, 0x3d, 0x16, 0x17, 0x16, + 0x3d, 0x16, 0x16, 0x3d, 0x15, 0x3b, 0x3f, 0xea, + 0xca, 0x66, 0x6f, 0x6a, 0x81, 0x58, 0x71, 0x6a, + 0x97, 0x7f, 0x58, 0x83, 0xb0, 0x83, 0x6b, 0x5d, + 0x85, 0x5d, 0x81, 0x81, 0x6b, 0x71, 0x81, 0x6a, + 0x91, 0x5d, 0x4a, 0x6a, 0x97, 0x90, 0x6a, 0x6a, + 0x5d, 0x71, 0x71, 0x58, 0x48, 0x17, 0x3b, 0x16, + 0x3d, 0x3d, 0x15, 0xd8, 0xcb, 0xd8, 0xcb, 0xd6, + 0xcb, 0xde, 0xe6, 0xe6, 0xf1, 0xa, 0x5a, 0xbf, + 0xd0, 0xcb, 0xd8, 0xde, 0xeb, 0xa, 0x40, 0xe, + 0xa7, 0x82, 0x5e, 0x68, 0x5e, 0x6c, 0x6c, 0x68, + 0x6c, 0x7, 0x7, 0x9f, 0x5e, 0x5e, 0x9e, 0x5e, + 0x68, 0x86, 0x5e, 0x4e, 0x86, 0x6c, 0x9f, 0xa3, + 0x5e, 0x8, 0x7, 0x28, 0x32, 0x28, 0x9f, 0x9f, + 0x6c, 0x7, 0xcc, 0x3, 0xcb, 0xa, 0xeb, 0x15, + 0xeb, 0xfa, 0xeb, 0xfa, 0xfe, 0x20, 0xc9, 0xf9, + 0xf9, 0x23, 0x2a, 0x73, 0xfa, 0xa, 0xea, 0x6e, + 0xfd, 0x29, 0xf7, 0xf7, 0xfc, 0x9f, 0x68, 0x9f, + 0x4e, 0x68, 0x7, 0x7, 0x9f, 0xa2, 0xa3, 0x9f, + 0x5e, 0xa3, 0x68, 0x9e, 0x5e, 0x4e, 0x4e, 0x68, + 0x4e, 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0xa3, + 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x9e, 0x32, 0x68, + 0xa3, 0x68, 0xa3, 0xa3, 0x68, 0x98, 0x8d, 0x4e, + 0x68, 0x8b, 0x75, + 0xe, 0x46, 0x8d, 0x68, 0xa3, 0x8d, 0x46, 0x8d, + 0x5e, 0xa7, 0x82, 0x46, 0xa8, 0x83, 0x94, 0x94, + 0x81, 0x63, 0x9a, 0x85, 0x9a, 0x7f, 0x39, 0x26, + 0x6e, 0x6e, 0xa, 0xea, 0xa, 0xeb, 0xf2, 0x3d, + 0x3d, 0x3d, 0x3d, 0x70, 0x73, 0x34, 0xf2, 0x15, + 0x73, 0xa, 0x5a, 0x90, 0x4d, 0x3a, 0x31, 0x71, + 0x6b, 0x9a, 0x99, 0x59, 0x81, 0x85, 0x6a, 0x6a, + 0x6a, 0x5d, 0x6a, 0x6a, 0x71, 0x6b, 0x63, 0x71, + 0x6b, 0x71, 0x56, 0x63, 0x71, 0xb0, 0xb0, 0x6f, + 0x71, 0x3a, 0x90, 0x71, 0x6b, 0x85, 0x9a, 0x71, + 0x71, 0x81, 0x83, 0x85, 0x58, 0x97, 0xb4, 0x97, + 0x63, 0x36, 0x1d, 0x3f, 0x17, 0x3d, 0x18, 0x14, + 0x16, 0x14, 0x16, 0x14, 0x16, 0xf5, 0x16, 0x14, + 0x17, 0x14, 0x14, 0x16, 0x3d, 0xf2, 0x16, 0x16, + 0x16, 0x14, 0x16, 0x14, 0x14, 0xf5, 0xf2, 0x14, + 0x16, 0x16, 0x16, 0xf2, 0xf5, 0xf2, 0xf2, 0xd8, + 0xcb, 0xd0, 0xc4, 0xc4, 0xc4, 0xd1, 0xdb, 0xd2, + 0xe5, 0xbe, 0xd1, 0xc4, 0xd2, 0xc4, 0xc4, 0xc4, + 0xc4, 0xd2, 0xd1, 0xc4, 0xce, 0xdd, 0xcd, 0xdc, + 0xdd, 0xdd, 0xdd, 0xb8, 0xbd, 0x7, 0xc1, 0xc2, + 0xd1, 0xd2, 0xd1, 0xd9, 0xe7, 0xec, 0x50, 0xfd, + 0xf9, 0x23, 0x1c, 0xfa, 0x15, 0xf2, 0x17, 0xf2, + 0x16, 0x16, 0x17, 0x15, 0x17, 0x17, 0x2e, 0x22, + 0x3b, 0x17, 0x22, 0xf2, 0x16, 0x3d, 0x3b, 0x15, + 0xeb, 0x15, 0x17, 0xf5, 0x3d, 0x16, 0x17, 0x3d, + 0x14, 0x3d, 0x16, 0x16, 0x34, 0xa, 0xeb, 0xd8, + 0xe6, 0x7f, 0x35, 0x55, 0x7e, 0x7e, 0x91, 0x7e, + 0x97, 0x99, 0x58, 0x6a, 0x99, 0x80, 0x6a, 0x6a, + 0x6a, 0x5d, 0x81, 0x7e, 0x6a, 0x6b, 0x6a, 0x4a, + 0x83, 0xaf, 0x6a, 0x6a, 0x1b, 0x6f, 0x6a, 0x6a, + 0x6f, 0x71, 0x59, 0x4d, 0x39, 0x16, 0x3d, 0x16, + 0xf2, 0xf2, 0xeb, 0xe6, 0xd8, 0xd8, 0xcb, 0xd0, + 0xd6, 0xd7, 0xd8, 0xe6, 0xd8, 0xe6, 0xf4, 0xbf, + 0xd3, 0xd8, 0xeb, 0xf5, 0xfa, 0xfa, 0xfd, 0x27, + 0x46, 0x82, 0x6c, 0xfc, 0x1f, 0xa0, 0x7, 0x9f, + 0x1e, 0xe, 0xfc, 0x6c, 0x79, 0x5e, 0x28, 0x1f, + 0x5e, 0x5e, 0x9f, 0x9f, 0x37, 0x37, 0x7, 0x5e, + 0x5e, 0x28, 0xfc, 0x82, 0x76, 0x5e, 0x68, 0x6c, + 0x28, 0xdd, 0xc7, 0xd1, 0xe5, 0x5a, 0x5a, 0x6e, + 0x39, 0xf1, 0x34, 0xa, 0x41, 0xe3, 0xd0, 0xe0, + 0xea, 0xcb, 0xe0, 0xc9, 0x5a, 0x41, 0xfd, 0x4d, + 0x6a, 0x5f, 0xe, 0x27, 0x62, 0x5e, 0x9f, 0x7, + 0x6c, 0xfc, 0x6c, 0x28, 0x28, 0x5e, 0x5e, 0xfc, + 0x9f, 0x68, 0x68, 0x62, 0x27, 0x5e, 0x5e, 0x9f, + 0xa3, 0x68, 0x68, 0x5e, 0x86, 0x4e, 0xa3, 0x68, + 0x68, 0xa3, 0x4e, 0xa3, 0x68, 0xa3, 0x1e, 0x43, + 0x79, 0x28, 0x68, 0x1e, 0xa3, 0x4e, 0x4e, 0x4e, + 0xa3, 0x68, 0x0, + 0x68, 0x5e, 0x68, 0x5e, 0x9e, 0x9f, 0x68, 0xa3, + 0x7, 0xdd, 0x76, 0x5e, 0x76, 0x74, 0x94, 0x6a, + 0x91, 0x6f, 0x99, 0x41, 0xe6, 0x54, 0x6e, 0x41, + 0xb4, 0xcb, 0x5a, 0xe3, 0x3, 0x15, 0x15, 0x22, + 0xf2, 0xf2, 0x15, 0x3b, 0xeb, 0x16, 0x16, 0xeb, + 0xde, 0xd8, 0xe5, 0x5b, 0x4a, 0x91, 0x6a, 0x6a, + 0x5d, 0x99, 0x39, 0x63, 0x41, 0x41, 0xaf, 0x6a, + 0x91, 0x6a, 0x6a, 0x91, 0x6a, 0x6a, 0x6a, 0x5d, + 0x6b, 0x90, 0x99, 0x63, 0x71, 0x99, 0x5a, 0x6f, + 0x6a, 0x6a, 0x6a, 0x71, 0x6b, 0x5d, 0x85, 0x85, + 0x71, 0x9a, 0x41, 0x90, 0x71, 0x90, 0x6f, 0x41, + 0x5d, 0x6f, 0x85, 0x23, 0x3f, 0x16, 0x14, 0x14, + 0x18, 0x14, 0x14, 0x14, 0x16, 0xf5, 0x3d, 0x16, + 0x3b, 0x22, 0x15, 0x3d, 0x16, 0x3d, 0x16, 0x3d, + 0x16, 0x16, 0x14, 0x16, 0x14, 0xee, 0xff, 0x14, + 0x14, 0x16, 0xf2, 0xee, 0xf2, 0xeb, 0xde, 0xe6, + 0x5a, 0xcc, 0xe2, 0xe7, 0xe4, 0xf3, 0xdc, 0xc7, + 0xd2, 0xe7, 0xc4, 0xd3, 0xc4, 0xd2, 0xd9, 0xd2, + 0xc4, 0xce, 0xce, 0xe2, 0xf0, 0xdd, 0xb8, 0xc1, + 0xc2, 0xd5, 0xe2, 0xc2, 0xc1, 0xb8, 0xbd, 0xc2, + 0xc2, 0xbe, 0xe4, 0xc4, 0xdb, 0x5a, 0xb, 0xcb, + 0xcb, 0x2a, 0xfa, 0x15, 0x15, 0x22, 0x21, 0x17, + 0x17, 0x17, 0x22, 0x16, 0xf5, 0x21, 0x3b, 0xfa, + 0xeb, 0xfa, 0xfa, 0x21, 0x17, 0x15, 0x1d, 0x17, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x3b, 0x3f, 0x16, 0xf2, 0x34, 0x3b, 0x3d, + 0x3b, 0x48, 0x58, 0x6a, 0x83, 0x6f, 0x6a, 0x6a, + 0x6f, 0x5d, 0x81, 0x5d, 0x58, 0x71, 0x6b, 0x6b, + 0x6a, 0x63, 0x71, 0x6a, 0x90, 0x85, 0x5d, 0x58, + 0x63, 0x58, 0x6f, 0x6a, 0x71, 0x63, 0x71, 0x6b, + 0x6b, 0x99, 0x42, 0x34, 0x16, 0x16, 0x15, 0xfa, + 0x15, 0x2b, 0x39, 0x99, 0x99, 0x34, 0xde, 0xcb, + 0xcb, 0xd8, 0xeb, 0xde, 0xde, 0xa, 0xe5, 0xe3, + 0xfd, 0xfa, 0xeb, 0xfa, 0xf5, 0x15, 0x23, 0x1b, + 0x7e, 0x74, 0xa8, 0xf7, 0x62, 0x62, 0x82, 0x75, + 0x93, 0x62, 0x46, 0x8d, 0x98, 0x93, 0xa7, 0xe, + 0x8f, 0x7d, 0xa7, 0x37, 0x62, 0x62, 0x8d, 0x8d, + 0x8b, 0x8b, 0x46, 0xa7, 0x98, 0x7d, 0x7, 0xa8, + 0x55, 0x5f, 0xf3, 0xf8, 0x6a, 0x27, 0x27, 0x60, + 0x6a, 0x90, 0x6e, 0xa, 0x5a, 0xb4, 0xcb, 0x5a, + 0x99, 0x1b, 0x11, 0x3e, 0x55, 0x55, 0x62, 0x7e, + 0x94, 0x8f, 0x9c, 0x60, 0x7e, 0x93, 0x28, 0x9c, + 0x62, 0x8d, 0x5e, 0x8b, 0x8f, 0x9f, 0x68, 0x62, + 0x8f, 0x79, 0x93, 0x8f, 0x74, 0x93, 0xa2, 0x8b, + 0x8b, 0xa3, 0xa2, 0x98, 0x98, 0x68, 0x4e, 0x98, + 0x98, 0xa3, 0x68, 0x8b, 0x98, 0x68, 0x43, 0x98, + 0x8b, 0x98, 0x75, 0x79, 0x4e, 0x68, 0x4e, 0x4e, + 0xa3, 0xa3, 0xa3, + 0x32, 0xa7, 0x8d, 0x1e, 0xfc, 0xa7, 0x28, 0x28, + 0xe, 0x30, 0x62, 0x7d, 0x94, 0x6a, 0x3a, 0x90, + 0x90, 0x6e, 0x5a, 0x6e, 0x8a, 0x54, 0x66, 0x5d, + 0x90, 0x54, 0x7f, 0xb4, 0xe6, 0xf2, 0xeb, 0xeb, + 0xee, 0x16, 0x2b, 0xfa, 0x15, 0x15, 0x15, 0x15, + 0x3d, 0x15, 0x23, 0x85, 0x90, 0x90, 0x97, 0x3a, + 0x31, 0x63, 0x63, 0x71, 0x58, 0x4d, 0x58, 0x6b, + 0x5d, 0x97, 0x6f, 0x6b, 0x81, 0x85, 0x90, 0x58, + 0x58, 0x71, 0x6b, 0x6b, 0x71, 0x63, 0x4d, 0x71, + 0x6b, 0x85, 0x80, 0x4d, 0x58, 0x85, 0x99, 0x80, + 0x71, 0x59, 0x71, 0x71, 0x71, 0x9a, 0x67, 0x7f, + 0x63, 0x54, 0x73, 0x15, 0x16, 0x3d, 0xff, 0x14, + 0x14, 0x14, 0x16, 0x3d, 0x3b, 0x15, 0x16, 0xf2, + 0x17, 0x15, 0xf2, 0xf5, 0x16, 0x17, 0x3d, 0x15, + 0x21, 0x1a, 0x17, 0x17, 0x16, 0x14, 0x14, 0x14, + 0x16, 0x16, 0x14, 0xee, 0xeb, 0xf1, 0xf9, 0x5a, + 0xf8, 0xdd, 0xe4, 0xe5, 0xcc, 0xce, 0xbe, 0xd2, + 0xd9, 0xd3, 0xd1, 0xc4, 0xc4, 0xc7, 0xe7, 0xd1, + 0xce, 0xcd, 0xcd, 0xce, 0xbf, 0xc1, 0xc1, 0xc2, + 0xc4, 0xd5, 0xec, 0xf3, 0xdd, 0x28, 0x9f, 0xdd, + 0xbd, 0xbe, 0x50, 0xbf, 0xcb, 0xd0, 0xcb, 0xeb, + 0xf2, 0x15, 0x17, 0xfa, 0x21, 0x1d, 0x1a, 0x2e, + 0x17, 0x22, 0x3f, 0x16, 0x14, 0x15, 0x15, 0xf2, + 0x15, 0x23, 0x1c, 0x1d, 0x21, 0x22, 0x2e, 0x17, + 0x14, 0xff, 0x14, 0x16, 0x14, 0x14, 0x3d, 0x16, + 0x3d, 0x16, 0x70, 0x70, 0x70, 0x1d, 0x42, 0x48, + 0x3f, 0x48, 0x63, 0x9a, 0x59, 0x58, 0x6b, 0x81, + 0x6f, 0x6b, 0x6b, 0x81, 0x81, 0x6b, 0x81, 0x95, + 0x85, 0x85, 0x85, 0x81, 0x85, 0x6f, 0x6b, 0x6b, + 0x6b, 0x71, 0x6b, 0x81, 0x81, 0x71, 0x85, 0x71, + 0x9a, 0x7f, 0x3f, 0x3d, 0x16, 0x16, 0x3d, 0x34, + 0x34, 0xfa, 0x6e, 0xb, 0xb4, 0xcb, 0xcb, 0xd6, + 0xde, 0xde, 0xeb, 0x15, 0x15, 0xea, 0x20, 0x50, + 0x40, 0xcb, 0x73, 0x34, 0xfa, 0xeb, 0x3, 0x3e, + 0x74, 0x7e, 0x9c, 0x8d, 0x93, 0x62, 0x82, 0x28, + 0x98, 0x93, 0x6c, 0x7, 0x46, 0x93, 0x6c, 0x28, + 0x8d, 0x98, 0xfc, 0x8d, 0x8d, 0x8d, 0x5e, 0x5e, + 0x7d, 0x8d, 0xa7, 0xa0, 0x76, 0x76, 0x6c, 0xfc, + 0x76, 0x76, 0x9f, 0x28, 0x9c, 0x6c, 0x8, 0xb7, + 0xba, 0xba, 0xd5, 0xbf, 0xe4, 0xf8, 0x11, 0x60, + 0x2f, 0x1e, 0x6c, 0x5f, 0x9c, 0x5e, 0x28, 0x9c, + 0xaa, 0x5f, 0x37, 0xa8, 0x5f, 0x28, 0x5e, 0x37, + 0x79, 0xa3, 0xa3, 0x9f, 0x75, 0x32, 0xa3, 0x6c, + 0x7, 0x9f, 0x9f, 0x7d, 0x5e, 0xa3, 0xa3, 0x68, + 0xa3, 0x4e, 0xa3, 0x4e, 0x68, 0xa3, 0x4e, 0xa3, + 0xa3, 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, 0x68, 0x86, + 0x8d, 0x1e, 0x32, 0x68, 0x4e, 0x68, 0x68, 0x68, + 0x4e, 0x68, 0x68, + 0x8d, 0x74, 0x62, 0x8d, 0x8d, 0x8b, 0x98, 0x8d, + 0x93, 0x7e, 0x94, 0x94, 0x91, 0xb0, 0x99, 0x54, + 0x73, 0x73, 0xa, 0x39, 0x42, 0x4d, 0x4c, 0x81, + 0x85, 0x99, 0x39, 0x73, 0xf2, 0xf2, 0xf2, 0x14, + 0x14, 0x14, 0x16, 0x22, 0x17, 0x3b, 0x22, 0x48, + 0x3b, 0x3d, 0x70, 0x7f, 0x99, 0x54, 0x80, 0x58, + 0x58, 0x9a, 0x71, 0x6b, 0x6b, 0x71, 0x6b, 0x81, + 0x81, 0x71, 0x9a, 0x85, 0x71, 0x80, 0x9a, 0x85, + 0x6b, 0x71, 0x6a, 0x6a, 0x6b, 0x6b, 0x71, 0x59, + 0x71, 0x85, 0x99, 0x80, 0x63, 0x7f, 0x7f, 0x80, + 0x63, 0x85, 0x5d, 0x6b, 0x6b, 0x71, 0x99, 0x7f, + 0x80, 0x7f, 0x3b, 0x3b, 0x3d, 0x14, 0x18, 0x14, + 0x14, 0x16, 0x16, 0xf2, 0x17, 0x22, 0x15, 0x15, + 0x34, 0x15, 0x15, 0x15, 0x22, 0x3b, 0x15, 0x17, + 0x1c, 0x1a, 0x22, 0xf5, 0xf5, 0xf2, 0x14, 0x16, + 0xf5, 0xeb, 0xf2, 0xf2, 0xfa, 0xe0, 0x5a, 0xa1, + 0xc8, 0xba, 0xbd, 0xc2, 0xd2, 0xc2, 0xc4, 0xd2, + 0xc4, 0xd1, 0xe2, 0xd1, 0xd2, 0xbe, 0xcd, 0xc2, + 0xc4, 0xc2, 0xc1, 0xc2, 0xc2, 0xc2, 0xce, 0xc2, + 0xce, 0xcd, 0xdd, 0xf7, 0xdd, 0x9f, 0x9f, 0xb8, + 0xc2, 0xc2, 0xc7, 0xbf, 0xd2, 0xbf, 0x5a, 0x54, + 0xfa, 0x15, 0xee, 0x3d, 0x17, 0x15, 0x15, 0x15, + 0xfa, 0xeb, 0x15, 0x17, 0x17, 0xf1, 0x23, 0x21, + 0x15, 0x21, 0x23, 0x15, 0x15, 0x15, 0xf2, 0x16, + 0x3d, 0x16, 0x14, 0x3d, 0x16, 0x17, 0x3d, 0xf2, + 0x16, 0x16, 0x3d, 0x3b, 0x34, 0x73, 0x9, 0x23, + 0x90, 0x90, 0x6a, 0x5d, 0x6a, 0x95, 0x81, 0x5d, + 0x90, 0x63, 0x6f, 0x6a, 0x6a, 0x90, 0x97, 0x6f, + 0x5d, 0x5d, 0x91, 0x6a, 0x5d, 0x6b, 0x6a, 0x6a, + 0x6a, 0x90, 0x9a, 0x6a, 0x6a, 0x71, 0x9a, 0x58, + 0x31, 0x99, 0x99, 0x2a, 0x3b, 0x16, 0x3d, 0x34, + 0x34, 0xd8, 0xe6, 0xe0, 0xe0, 0xd3, 0xd3, 0xd6, + 0xd7, 0xde, 0xe6, 0xd7, 0xe6, 0x34, 0xfd, 0xd4, + 0xbf, 0xd8, 0xd8, 0xde, 0xeb, 0xfb, 0x50, 0x2f, + 0xe, 0x27, 0xe, 0x68, 0x5e, 0x28, 0xf7, 0xf3, + 0x37, 0x5e, 0x8, 0xf7, 0xe, 0x28, 0xa3, 0xa3, + 0x86, 0x28, 0xfc, 0x5e, 0x5e, 0x86, 0x6c, 0xf7, + 0xe, 0x5e, 0x5e, 0x28, 0xfc, 0x1f, 0x28, 0x68, + 0x68, 0x5e, 0xfc, 0xc, 0x7, 0x5e, 0x9f, 0xcd, + 0xf3, 0xf7, 0x7, 0x8, 0x8, 0xfc, 0x37, 0x6c, + 0x6c, 0x68, 0x7, 0xf3, 0xb7, 0x7, 0x7, 0x7, + 0xf8, 0x27, 0x28, 0x5e, 0x5e, 0x5e, 0xfc, 0x5e, + 0x9f, 0xa3, 0xa3, 0x6c, 0xa0, 0x9f, 0x68, 0xa3, + 0x6c, 0x28, 0x46, 0x68, 0x86, 0xa3, 0x4e, 0x68, + 0xa3, 0xa3, 0x4e, 0xa3, 0x9f, 0xa3, 0xa3, 0x4e, + 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0xa2, 0x32, + 0x43, 0x5f, 0x7, 0x68, 0xa3, 0x8b, 0x68, 0xa3, + 0x4e, 0x68, 0x68, + 0x5e, 0x82, 0x8d, 0x5e, 0x5e, 0x5e, 0x82, 0x5e, + 0x82, 0x74, 0xac, 0x6a, 0x6a, 0x99, 0x99, 0x99, + 0x70, 0x34, 0x73, 0x7f, 0xf9, 0x4d, 0x4d, 0x90, + 0x6f, 0x99, 0xa, 0xde, 0xe1, 0xf2, 0x16, 0x16, + 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, 0x15, 0xfa, + 0x34, 0xf2, 0xa, 0x5a, 0x26, 0x67, 0x6f, 0x6a, + 0x90, 0x99, 0x4d, 0x4a, 0x85, 0x5d, 0x6a, 0x6a, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x63, 0x71, 0x6a, + 0x5d, 0x9a, 0x6a, 0x5d, 0x71, 0x85, 0xb0, 0xb0, + 0x58, 0x58, 0x6f, 0x90, 0x85, 0x70, 0x1d, 0x80, + 0x7f, 0x67, 0x85, 0x5d, 0x5d, 0x6f, 0x97, 0x99, + 0x99, 0x26, 0x42, 0x67, 0x3f, 0x16, 0xff, 0x14, + 0x14, 0x14, 0x16, 0xf2, 0x16, 0xeb, 0x15, 0x73, + 0x3f, 0x21, 0x1a, 0x22, 0x42, 0x23, 0x2b, 0x34, + 0x3f, 0xfa, 0x34, 0xf2, 0xe1, 0xee, 0x16, 0x34, + 0xa, 0xf1, 0x23, 0xf5, 0xcb, 0xcb, 0xcb, 0xbf, + 0xd2, 0xc5, 0xc2, 0xc2, 0xc4, 0xd2, 0xec, 0xe5, + 0xc2, 0xce, 0xce, 0xdb, 0xd2, 0xc2, 0xc2, 0xc4, + 0xd2, 0xd2, 0xd2, 0xc2, 0xc2, 0xdc, 0xdd, 0xdc, + 0xbd, 0xcd, 0xdd, 0xdd, 0xe2, 0xdd, 0x7, 0xb8, + 0xbe, 0xc2, 0xbe, 0xce, 0xc5, 0xcc, 0x40, 0xfe, + 0x23, 0xa, 0xeb, 0x16, 0xee, 0xf2, 0x16, 0xeb, + 0xde, 0xe6, 0xfa, 0x23, 0x39, 0xf1, 0x1c, 0x1a, + 0xfa, 0x21, 0x15, 0x3d, 0xf2, 0xf2, 0xee, 0x16, + 0xf2, 0xee, 0x16, 0x16, 0x3d, 0x48, 0x15, 0x3d, + 0x16, 0x16, 0x16, 0x34, 0x15, 0x34, 0x34, 0x2a, + 0x63, 0x5b, 0x6a, 0x35, 0x6a, 0x6a, 0x91, 0x6a, + 0x5d, 0x4d, 0x63, 0xaf, 0x6f, 0x90, 0x90, 0xfe, + 0x6f, 0x81, 0x81, 0x7e, 0x4a, 0x58, 0x83, 0x6a, + 0x5d, 0x90, 0x99, 0x5d, 0x6a, 0x6b, 0x6b, 0x4d, + 0x42, 0x48, 0x99, 0xa, 0x3d, 0x3b, 0xf2, 0x34, + 0x15, 0x73, 0xd8, 0xde, 0xd8, 0xd7, 0xd3, 0xd6, + 0xd7, 0xd8, 0xd7, 0xd7, 0xe6, 0xfa, 0xe0, 0xd0, + 0xd3, 0xd8, 0xeb, 0xf2, 0x15, 0x99, 0x60, 0xf7, + 0xe, 0x27, 0x46, 0x8, 0x76, 0x76, 0xa0, 0x2c, + 0x76, 0x82, 0x6c, 0x28, 0x1f, 0x8d, 0x68, 0x68, + 0x8d, 0x8d, 0x37, 0x7, 0xa7, 0x32, 0x9f, 0xe, + 0x82, 0x8d, 0x86, 0x68, 0x5e, 0x1f, 0x5e, 0x5e, + 0x76, 0x5e, 0x6c, 0xa0, 0xa8, 0x5e, 0x9f, 0x8, + 0xa7, 0x1e, 0x86, 0x6c, 0x82, 0x76, 0x28, 0x37, + 0xa0, 0x28, 0x6c, 0xa0, 0xa8, 0x28, 0x6c, 0x82, + 0x62, 0x62, 0x93, 0x7d, 0x8f, 0x82, 0x28, 0x62, + 0x9c, 0x6c, 0x32, 0x98, 0x9c, 0x6c, 0xa3, 0x5e, + 0x8b, 0x98, 0x8b, 0x8b, 0x98, 0x68, 0xa3, 0x98, + 0x68, 0xa3, 0xa3, 0x68, 0x5e, 0x4e, 0x8d, 0x5e, + 0x68, 0x68, 0x8b, 0x98, 0x68, 0x8b, 0x8f, 0x31, + 0x98, 0x8b, 0x8b, 0x93, 0xa3, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0xa3, + 0xfc, 0x1f, 0x5e, 0x5e, 0x9e, 0xfc, 0xf3, 0x6c, + 0x9f, 0xa7, 0xf8, 0x11, 0x1b, 0x5d, 0x90, 0x83, + 0x26, 0x36, 0x54, 0xa, 0x6e, 0x6e, 0xea, 0xea, + 0xa, 0xa, 0xd8, 0xd8, 0x15, 0xeb, 0xeb, 0xeb, + 0x16, 0x14, 0x14, 0x3d, 0x16, 0x3b, 0xf2, 0xe1, + 0xee, 0x34, 0xcb, 0xb, 0x20, 0x31, 0x90, 0x6a, + 0x6f, 0x31, 0x4d, 0x3a, 0x26, 0x99, 0x97, 0x20, + 0x90, 0x9d, 0x6a, 0x7e, 0x5d, 0x81, 0x5d, 0x6a, + 0x6a, 0x6f, 0x1b, 0x90, 0x99, 0x97, 0x85, 0x6f, + 0x58, 0x71, 0x6b, 0x81, 0x71, 0x58, 0x59, 0x42, + 0x42, 0x4d, 0x85, 0x83, 0x6f, 0x97, 0x6f, 0x5d, + 0x5d, 0x58, 0x71, 0x85, 0x99, 0x22, 0x17, 0x16, + 0x14, 0x15, 0x16, 0x16, 0x16, 0xf5, 0x2a, 0x7f, + 0x42, 0x1a, 0x1c, 0x1d, 0x48, 0x23, 0x21, 0x21, + 0xeb, 0xeb, 0xf5, 0xf2, 0x16, 0x16, 0x3b, 0x7f, + 0x3, 0xb4, 0x41, 0x99, 0x3, 0xd0, 0xb4, 0xb, + 0xbf, 0xcc, 0xcd, 0xce, 0xce, 0xe4, 0xec, 0xe4, + 0xc2, 0xce, 0xc2, 0xc4, 0xd2, 0xc4, 0xd1, 0xc4, + 0xc4, 0xdb, 0xec, 0xdd, 0xdd, 0xdd, 0xf7, 0xdd, + 0xc1, 0xc1, 0xcd, 0xcd, 0xc7, 0xcd, 0x7, 0x7, + 0xdd, 0xb8, 0xc, 0xa8, 0xba, 0x50, 0x83, 0x41, + 0xea, 0xe6, 0xeb, 0xf2, 0xf2, 0x16, 0x3d, 0x17, + 0xfa, 0x21, 0xf2, 0x17, 0x21, 0x15, 0x3b, 0x15, + 0x17, 0xeb, 0xf5, 0xf5, 0x21, 0xf2, 0x16, 0x3d, + 0x18, 0x14, 0x14, 0x14, 0x16, 0xf2, 0x16, 0x16, + 0x3d, 0x16, 0x3d, 0x3d, 0x3f, 0x1d, 0x42, 0x42, + 0x63, 0x71, 0x85, 0x90, 0x9d, 0x85, 0xb0, 0x83, + 0x5d, 0x6f, 0x58, 0x71, 0x71, 0x71, 0x59, 0x42, + 0x4d, 0x85, 0x90, 0x90, 0x58, 0x9a, 0x99, 0x90, + 0x5d, 0x6b, 0x5d, 0x81, 0x6b, 0x6b, 0x31, 0x67, + 0x3d, 0x16, 0x3d, 0xeb, 0xf2, 0x70, 0x73, 0x73, + 0x2a, 0x42, 0xcb, 0xcb, 0xe6, 0xe6, 0xd6, 0xd7, + 0xd8, 0xde, 0xeb, 0xde, 0xeb, 0xf9, 0x41, 0xe5, + 0x56, 0x54, 0x34, 0x15, 0xfa, 0xf9, 0x1b, 0x3e, + 0xaa, 0x7e, 0x5f, 0xba, 0x60, 0x62, 0x8d, 0x8d, + 0x93, 0x62, 0x82, 0x82, 0x8b, 0x8b, 0x5e, 0xa0, + 0xa8, 0x62, 0x82, 0x37, 0x62, 0x62, 0x5e, 0x8d, + 0x98, 0x98, 0x6c, 0x76, 0x9c, 0x93, 0x8d, 0xa7, + 0xaa, 0x93, 0x5e, 0x76, 0x62, 0x82, 0x32, 0x8d, + 0x8b, 0x8d, 0x5e, 0x76, 0x8b, 0x7d, 0x5e, 0xa7, + 0xaa, 0xa9, 0x5e, 0x82, 0x62, 0x8f, 0x93, 0x62, + 0x94, 0x8f, 0x8f, 0x7e, 0x3e, 0xaa, 0x68, 0x8b, + 0x94, 0x62, 0x5e, 0x8f, 0x8f, 0x68, 0x68, 0x8b, + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x89, 0x68, 0x98, + 0x8b, 0x68, 0xa3, 0x98, 0x9f, 0x68, 0x4e, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0x5e, 0x26, + 0xd3, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0xa3, + 0x68, 0xa3, 0xa3, + 0x8d, 0x93, 0x76, 0x5e, 0x5e, 0x7d, 0x55, 0x28, + 0x32, 0x9c, 0xaa, 0x50, 0xfd, 0x26, 0x41, 0x99, + 0xf9, 0x7f, 0x6e, 0x6e, 0x23, 0x67, 0x7f, 0x39, + 0x34, 0x73, 0xe6, 0xde, 0xe1, 0x1, 0xeb, 0xeb, + 0xf2, 0x14, 0x16, 0x14, 0x16, 0x17, 0x15, 0x16, + 0x14, 0x16, 0xd8, 0x6e, 0x99, 0x80, 0x99, 0x99, + 0x6f, 0x71, 0x58, 0x58, 0x59, 0x63, 0x58, 0x9a, + 0x9a, 0x3a, 0x6a, 0x6f, 0x85, 0x71, 0x81, 0x6f, + 0x85, 0x6b, 0x6b, 0x71, 0x58, 0x59, 0x71, 0x71, + 0x9a, 0x59, 0x71, 0x9a, 0x9a, 0x63, 0x85, 0x80, + 0x63, 0x71, 0x6b, 0x6b, 0x71, 0x59, 0x71, 0x6b, + 0x71, 0x9a, 0x59, 0x99, 0x34, 0xf2, 0x16, 0x3d, + 0x18, 0x16, 0xeb, 0x16, 0x16, 0x16, 0x22, 0x1d, + 0x2a, 0x2b, 0x48, 0x34, 0x15, 0x21, 0x1d, 0x42, + 0x23, 0x22, 0x22, 0x22, 0x3d, 0x16, 0x17, 0x2b, + 0x73, 0x6e, 0x9a, 0x80, 0xb4, 0xbf, 0x11, 0x6a, + 0xaa, 0xa0, 0xdd, 0xdc, 0xce, 0xc2, 0xbe, 0xc2, + 0xc4, 0xc4, 0xd2, 0xc2, 0xd1, 0xc4, 0xe2, 0xe2, + 0xd1, 0xc2, 0xdc, 0xe2, 0xce, 0xce, 0xbd, 0xcd, + 0xc2, 0xc2, 0xcd, 0x7, 0x7, 0xdd, 0xdd, 0xdd, + 0xf7, 0xdd, 0xaa, 0x6a, 0x97, 0x5a, 0x6e, 0x99, + 0x6e, 0xfa, 0xeb, 0x70, 0x70, 0xf2, 0xf2, 0x17, + 0x17, 0x15, 0x16, 0x3d, 0x15, 0x15, 0x16, 0x3d, + 0x21, 0x2b, 0x17, 0x22, 0x22, 0x3b, 0x3d, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x3d, 0x16, 0x16, 0x3d, + 0x16, 0x16, 0x3d, 0x3d, 0x1d, 0x63, 0x6f, 0x5d, + 0x6b, 0x6f, 0x99, 0x80, 0x71, 0x58, 0x67, 0x80, + 0x71, 0x6b, 0x6b, 0x6b, 0x59, 0x58, 0x9a, 0x85, + 0x5d, 0x63, 0x67, 0x7f, 0x63, 0x71, 0x63, 0x42, + 0x58, 0x81, 0x6a, 0x81, 0x58, 0x36, 0x7f, 0x73, + 0x3d, 0x16, 0x16, 0x16, 0x3d, 0x73, 0xa, 0xde, + 0x23, 0x26, 0xc9, 0xd2, 0xd3, 0xd7, 0xd7, 0xe0, + 0xd7, 0xd8, 0xde, 0xee, 0x15, 0x67, 0x60, 0x2c, + 0x41, 0xfb, 0xeb, 0xfa, 0x48, 0xfe, 0x20, 0x11, + 0x60, 0x74, 0x46, 0x2f, 0x27, 0x62, 0x8d, 0x68, + 0x46, 0x30, 0x30, 0xf7, 0xa8, 0x46, 0x37, 0x2c, + 0x46, 0x8d, 0x68, 0x5e, 0x46, 0x5c, 0x68, 0x5e, + 0x76, 0x82, 0x1f, 0xc, 0xa0, 0x76, 0x68, 0x1e, + 0x46, 0x8d, 0x68, 0x68, 0x82, 0x1f, 0x8d, 0x5e, + 0x76, 0x6c, 0x9f, 0x1e, 0xa7, 0x5e, 0xa3, 0x5e, + 0x1f, 0x79, 0x68, 0x5e, 0x5e, 0x6c, 0x1f, 0x9c, + 0xb3, 0xb3, 0x8, 0x55, 0x74, 0x5e, 0x68, 0x5e, + 0x5e, 0x28, 0x5e, 0x79, 0x9f, 0x6c, 0x68, 0x37, + 0x9c, 0xb8, 0x9f, 0x68, 0x8b, 0x68, 0x4e, 0xa3, + 0x4e, 0xa3, 0xa3, 0x68, 0x0, 0x4e, 0x68, 0xa3, + 0x4e, 0xa3, 0xa3, 0xa3, 0x9f, 0x9f, 0x5e, 0x9f, + 0x9f, 0xfc, 0x68, 0x4e, 0x68, 0x8b, 0x79, 0xa3, + 0x4e, 0x98, 0x68, + 0x8d, 0x8b, 0x74, 0xfc, 0x8d, 0x8b, 0x93, 0x5e, + 0x1f, 0x55, 0x60, 0xbf, 0x6e, 0xf1, 0x34, 0x2a, + 0x54, 0x99, 0x99, 0x26, 0x3c, 0x3c, 0x71, 0x9a, + 0x48, 0x3f, 0x15, 0x3d, 0x16, 0xf5, 0xf2, 0xee, + 0x14, 0xff, 0x16, 0xf5, 0x17, 0x22, 0x1d, 0x3f, + 0x3b, 0x3b, 0x16, 0xeb, 0xfa, 0x26, 0x99, 0x99, + 0x99, 0x5d, 0x6b, 0x6b, 0x6b, 0x58, 0x71, 0x81, + 0x6b, 0x6b, 0x6b, 0x99, 0x67, 0x85, 0x5d, 0x6f, + 0x9a, 0x59, 0x6b, 0x6b, 0x71, 0x71, 0x71, 0x59, + 0x80, 0x71, 0x71, 0x80, 0x7f, 0x7f, 0x59, 0x9a, + 0x67, 0x59, 0x6b, 0x81, 0x81, 0x6b, 0x71, 0x80, + 0x99, 0x9a, 0x71, 0x80, 0x70, 0x3b, 0x3b, 0x16, + 0x14, 0x3d, 0x16, 0x3b, 0x16, 0x16, 0x3b, 0x3b, + 0x34, 0x2a, 0x7f, 0x42, 0x21, 0x21, 0x36, 0x36, + 0x39, 0x23, 0x48, 0xfa, 0x15, 0x15, 0x23, 0x23, + 0xfa, 0x54, 0x85, 0x4a, 0x6a, 0x11, 0x4a, 0x74, + 0xa9, 0xba, 0xce, 0xc4, 0xd1, 0xd2, 0xc2, 0xc7, + 0xd2, 0xd2, 0xce, 0xbe, 0xc1, 0xc7, 0xe7, 0xcc, + 0xc4, 0xd1, 0xc2, 0xd2, 0xd2, 0xc2, 0xc1, 0xdd, + 0xdd, 0xf0, 0xf3, 0xf7, 0x7, 0xdd, 0xdc, 0xf0, + 0xbe, 0xc7, 0xbf, 0x83, 0x40, 0xfd, 0x41, 0x83, + 0x83, 0xb4, 0x34, 0xeb, 0xf2, 0x16, 0x18, 0xf2, + 0x15, 0x15, 0xf2, 0x17, 0x48, 0x17, 0x15, 0x22, + 0x36, 0x23, 0x3d, 0x16, 0x15, 0x16, 0x14, 0x17, + 0x17, 0x16, 0x16, 0x3d, 0x15, 0x15, 0x16, 0x16, + 0x3d, 0x3d, 0x3d, 0x3b, 0x70, 0x99, 0x97, 0x83, + 0x7e, 0x6a, 0x5d, 0x71, 0x81, 0x6b, 0x71, 0x63, + 0x6b, 0x81, 0x6f, 0x83, 0x5d, 0x85, 0x97, 0x83, + 0x6a, 0x5d, 0x58, 0x5d, 0x6a, 0x5d, 0x6f, 0x67, + 0x31, 0x6b, 0x6f, 0x83, 0x9a, 0x4d, 0x48, 0xd8, + 0x34, 0x3f, 0x3f, 0x3b, 0x21, 0x7f, 0x73, 0xf2, + 0xde, 0xd8, 0xd6, 0xd3, 0xd3, 0xd7, 0xd6, 0xd6, + 0xd6, 0xd7, 0xe6, 0xd8, 0xfa, 0x20, 0xf8, 0xbe, + 0xd4, 0xcb, 0xd8, 0xd8, 0x34, 0x26, 0x4a, 0x2f, + 0x79, 0x28, 0x68, 0x5e, 0x8d, 0x28, 0xa3, 0x9f, + 0xdd, 0x37, 0x37, 0x6c, 0x6c, 0x5e, 0x5e, 0x5e, + 0x79, 0x68, 0x4e, 0x5e, 0x68, 0x68, 0x68, 0x68, + 0x7, 0x28, 0x5e, 0x28, 0x82, 0x9f, 0x9f, 0x4e, + 0x5e, 0x68, 0xa3, 0xa3, 0x68, 0x9f, 0x5e, 0x4e, + 0x68, 0x9f, 0xa3, 0x68, 0x68, 0x4e, 0xa3, 0xa3, + 0x68, 0x68, 0xa3, 0x9e, 0x6c, 0x7, 0x9f, 0x5e, + 0xa0, 0xf7, 0x6c, 0x5e, 0x8d, 0x9e, 0x5e, 0x4e, + 0xa3, 0x9f, 0xa3, 0x9e, 0x9f, 0x7, 0x9f, 0x9e, + 0x5e, 0xa3, 0x9e, 0x5e, 0xa3, 0xa3, 0x4e, 0xa3, + 0x4e, 0x4e, 0x0, 0x68, 0x4e, 0x68, 0x68, 0x68, + 0xa3, 0xa3, 0x98, 0x68, 0x9f, 0x93, 0x8f, 0x8b, + 0x8b, 0x8f, 0x8b, 0x8b, 0x4e, 0x68, 0x68, 0x4e, + 0x4e, 0x75, 0x4e, + 0x68, 0x82, 0x82, 0x1f, 0x5e, 0x8d, 0x5e, 0x5e, + 0xfc, 0x27, 0x50, 0xbf, 0x3, 0xcb, 0xf1, 0x54, + 0x7f, 0x63, 0x90, 0x7f, 0xfe, 0x58, 0x9a, 0xb4, + 0x54, 0x15, 0x15, 0xde, 0x1, 0xd8, 0xe1, 0xee, + 0xff, 0xff, 0x14, 0x14, 0x17, 0x21, 0x73, 0xe6, + 0x1, 0xfa, 0xfa, 0xeb, 0x2a, 0x99, 0x58, 0x99, + 0x4d, 0x71, 0x6a, 0x6f, 0x99, 0x3a, 0x6b, 0x6f, + 0x6a, 0x6a, 0x6a, 0x6f, 0x31, 0x6f, 0x91, 0x6f, + 0x99, 0x9a, 0x6a, 0x5d, 0x85, 0x71, 0x81, 0x90, + 0x90, 0x85, 0x6a, 0x58, 0x63, 0x59, 0x71, 0x9a, + 0x42, 0x6f, 0x6a, 0x81, 0x85, 0x9a, 0x5d, 0x58, + 0x9a, 0x85, 0x71, 0x85, 0x42, 0x3f, 0x3b, 0x14, + 0x14, 0x16, 0x3d, 0xf2, 0x16, 0x3d, 0xf1, 0xf9, + 0x23, 0xfd, 0x1b, 0x4d, 0x1a, 0x21, 0x1c, 0x1c, + 0x34, 0x15, 0xfa, 0x15, 0x15, 0xfa, 0x23, 0xfe, + 0x36, 0x20, 0x4a, 0xaa, 0x60, 0xc8, 0x2c, 0xb7, + 0xbe, 0xc2, 0xd1, 0xd4, 0xd1, 0xc7, 0xdc, 0xcd, + 0xce, 0xce, 0xce, 0xcd, 0xc2, 0xc4, 0xd2, 0xc4, + 0xc4, 0xc4, 0xd1, 0xd1, 0xe2, 0xc2, 0xdc, 0x7, + 0xf7, 0xdd, 0xdd, 0xb8, 0xb8, 0xc1, 0xc1, 0xc7, + 0xce, 0xc2, 0xce, 0xf3, 0x2c, 0x11, 0x3e, 0x60, + 0x3e, 0xb, 0x73, 0xf2, 0xee, 0xee, 0x14, 0x14, + 0xf2, 0xee, 0x15, 0x1d, 0x1a, 0x1d, 0x15, 0x22, + 0x1c, 0x15, 0x14, 0x14, 0x14, 0x14, 0xff, 0x16, + 0xee, 0xf5, 0x3d, 0x15, 0x6e, 0xa, 0xf2, 0x15, + 0x15, 0x34, 0xf2, 0xf2, 0x34, 0x54, 0x7f, 0x6f, + 0x7e, 0x6a, 0x81, 0x91, 0x7e, 0x91, 0x6b, 0x5d, + 0x95, 0x91, 0x90, 0x90, 0x47, 0x6a, 0x97, 0x97, + 0x6a, 0x7e, 0x6a, 0x6a, 0x6f, 0x5d, 0x85, 0x90, + 0x71, 0x6b, 0x9a, 0x99, 0x90, 0x67, 0x54, 0x15, + 0x34, 0x67, 0x99, 0x54, 0x23, 0x39, 0xd8, 0xeb, + 0xeb, 0xd7, 0xd7, 0xde, 0xe0, 0xd0, 0xd9, 0xd9, + 0xe0, 0xed, 0xd7, 0xd8, 0x23, 0xf9, 0xe5, 0xc2, + 0xd3, 0xcb, 0xd8, 0x15, 0x34, 0x31, 0x55, 0x37, + 0x37, 0xa7, 0x28, 0x6c, 0x7, 0x28, 0xfc, 0xfc, + 0xa0, 0x46, 0x5e, 0x5e, 0xfc, 0x82, 0x68, 0xa3, + 0x82, 0x37, 0x5e, 0x86, 0xa7, 0x28, 0xa3, 0x28, + 0xe, 0x5e, 0x5e, 0x5e, 0x8d, 0x1e, 0x68, 0x68, + 0x8d, 0x68, 0x68, 0x5e, 0x82, 0x6c, 0x4e, 0x5e, + 0x37, 0x68, 0x4e, 0x68, 0x79, 0x5e, 0x68, 0x79, + 0x8d, 0x5e, 0x68, 0x5e, 0x1e, 0x7, 0x5e, 0x93, + 0x62, 0x55, 0x76, 0x93, 0x8f, 0x5e, 0x28, 0x7d, + 0x5e, 0x9f, 0x7, 0x68, 0x93, 0x68, 0xa3, 0x8d, + 0x98, 0x37, 0x5e, 0x98, 0x79, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0x79, 0xa3, 0x4e, 0x8b, 0x68, + 0x4e, 0xa3, 0x98, 0x68, 0xa3, 0x98, 0x8f, 0x8b, + 0x8b, 0x8b, 0x8b, 0x98, 0x4e, 0x4e, 0x68, 0x4e, + 0xa3, 0x0, 0xa3, + 0x5e, 0x86, 0x5e, 0x5e, 0x5e, 0xa3, 0x32, 0x7, + 0x7, 0xa7, 0xf3, 0xbe, 0xdc, 0x50, 0x1b, 0xfd, + 0x4d, 0x3a, 0x3a, 0x99, 0x99, 0x67, 0x3, 0xcb, + 0xde, 0x1, 0xde, 0xe6, 0xe6, 0xcb, 0xcb, 0xee, + 0x14, 0x14, 0xff, 0xff, 0xee, 0xee, 0xeb, 0xf2, + 0xf5, 0xea, 0x5a, 0xcb, 0x23, 0x58, 0x6f, 0x6f, + 0x85, 0x71, 0x6a, 0x5a, 0x7f, 0x58, 0x90, 0x92, + 0x6f, 0x6a, 0x5b, 0x6a, 0x5d, 0x81, 0x7e, 0x6a, + 0x6f, 0x6f, 0x6a, 0x90, 0x90, 0x90, 0x6a, 0x6f, + 0x90, 0x6f, 0x6a, 0x6a, 0x6b, 0x81, 0x6a, 0x58, + 0x80, 0x90, 0x6a, 0x97, 0x5a, 0x90, 0x6a, 0x6b, + 0x85, 0x85, 0x4a, 0x6f, 0x80, 0x70, 0x15, 0x16, + 0x3d, 0x18, 0x14, 0x16, 0x16, 0x3d, 0x6e, 0x99, + 0x99, 0xfd, 0xfd, 0x20, 0x67, 0x54, 0x23, 0x48, + 0x3b, 0x17, 0x15, 0xe1, 0xeb, 0xeb, 0x23, 0x36, + 0x63, 0x20, 0x20, 0x90, 0x40, 0xbf, 0xbf, 0xa1, + 0xd0, 0xd6, 0xd4, 0xa6, 0xf3, 0xdd, 0xcd, 0xb8, + 0xbd, 0xc2, 0xc2, 0xc2, 0xc4, 0xc4, 0xc4, 0xd1, + 0xc4, 0xd1, 0xd1, 0xcd, 0xcd, 0xcd, 0xd5, 0xdc, + 0xcd, 0xc1, 0xc2, 0xc1, 0xc2, 0xc2, 0xc2, 0xdc, + 0xf3, 0xf0, 0xf0, 0x6a, 0xaa, 0xb0, 0x99, 0x26, + 0x97, 0xf4, 0x73, 0x73, 0x16, 0x16, 0x14, 0x16, + 0x15, 0x16, 0x15, 0x1d, 0x1d, 0x48, 0x15, 0x15, + 0x17, 0x16, 0x14, 0x14, 0x14, 0xff, 0x16, 0x14, + 0x16, 0xf2, 0x16, 0x16, 0xeb, 0xd8, 0xf2, 0x34, + 0x2a, 0xf2, 0x3d, 0x70, 0x42, 0x1c, 0x67, 0x58, + 0x6a, 0x81, 0x6f, 0x6f, 0x58, 0x6a, 0x6f, 0x85, + 0x5d, 0x5d, 0x58, 0x6b, 0x6a, 0x81, 0x58, 0x58, + 0x6b, 0x81, 0x71, 0x90, 0x69, 0x59, 0x63, 0x99, + 0x6f, 0x6b, 0x59, 0x42, 0x80, 0x99, 0x16, 0x3d, + 0x3d, 0x2b, 0x73, 0xeb, 0x34, 0xeb, 0xeb, 0x73, + 0xe0, 0xfd, 0xed, 0xf1, 0xe0, 0xd2, 0xd1, 0xd3, + 0xe0, 0xe6, 0xd8, 0xcb, 0xa, 0xf9, 0xfd, 0xe5, + 0xb4, 0x3, 0x48, 0x15, 0x34, 0x99, 0x6a, 0xa7, + 0xa6, 0x4a, 0x46, 0x5e, 0x2f, 0x74, 0x46, 0x46, + 0x93, 0x93, 0x82, 0x28, 0x30, 0x74, 0x8d, 0x5e, + 0x9c, 0xaa, 0x46, 0x1f, 0x8b, 0x8b, 0x5e, 0x1f, + 0x46, 0x98, 0x68, 0x8d, 0x8f, 0x55, 0x75, 0x5e, + 0x93, 0x93, 0x37, 0x46, 0x8b, 0x8d, 0x68, 0x5e, + 0x8b, 0x8d, 0x68, 0x68, 0x8b, 0x9c, 0x1f, 0x8d, + 0x8b, 0x8d, 0x68, 0x43, 0x8b, 0x8d, 0x86, 0x8f, + 0x94, 0x27, 0x74, 0x8f, 0x8f, 0xaa, 0x5f, 0x8f, + 0x8f, 0x68, 0x5e, 0x98, 0x62, 0x68, 0xa3, 0x8b, + 0x8b, 0x7d, 0x26, 0x8b, 0x98, 0xa3, 0x9f, 0x98, + 0x98, 0x4e, 0x4e, 0x98, 0xa3, 0x68, 0x4e, 0x4e, + 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0xa3, + 0xa3, 0x9f, 0xa3, 0x4e, 0xa3, 0x68, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, + 0x6c, 0x46, 0x8d, 0x6c, 0x6c, 0x98, 0xe, 0xfc, + 0x9c, 0x8f, 0x46, 0xe, 0x11, 0x55, 0x50, 0xd4, + 0x5a, 0xfe, 0x66, 0x7f, 0x7f, 0x39, 0x48, 0x15, + 0xf2, 0x34, 0xf2, 0xeb, 0xeb, 0xa, 0xa, 0xeb, + 0xf5, 0x16, 0x14, 0x14, 0x16, 0x17, 0x3d, 0x16, + 0x15, 0x2b, 0xf1, 0x15, 0x34, 0x54, 0x9a, 0x9a, + 0x9a, 0x71, 0x71, 0x59, 0x58, 0x71, 0x6f, 0x26, + 0x67, 0x5d, 0x81, 0x85, 0x71, 0x81, 0x6f, 0x6f, + 0x6f, 0x6f, 0x6a, 0x71, 0x71, 0x6b, 0x6b, 0x63, + 0x67, 0x58, 0x85, 0x9a, 0x9a, 0x85, 0x85, 0x58, + 0x58, 0x71, 0x71, 0x59, 0x59, 0x59, 0x71, 0x71, + 0x80, 0x67, 0x4d, 0x7f, 0x70, 0x54, 0x23, 0x15, + 0x16, 0x3b, 0x3d, 0x14, 0x3d, 0x16, 0x3d, 0x34, + 0xeb, 0x3f, 0x21, 0x1d, 0x54, 0x54, 0x23, 0x1a, + 0x1a, 0x23, 0x48, 0x3b, 0x16, 0x14, 0x16, 0x34, + 0x70, 0x73, 0x21, 0x36, 0x9a, 0x9a, 0x90, 0x58, + 0x3a, 0x99, 0x90, 0x6a, 0xb3, 0xcc, 0xd1, 0xc2, + 0xc2, 0xc2, 0xc4, 0xd2, 0xd2, 0xd1, 0xc2, 0xce, + 0xe2, 0xdb, 0xd2, 0xc1, 0xbd, 0xc2, 0xd2, 0xdb, + 0xc2, 0xc2, 0xc4, 0xce, 0xf0, 0xf0, 0xe4, 0xf3, + 0xdd, 0xf0, 0x5a, 0x97, 0xb0, 0x7f, 0xa, 0x54, + 0x39, 0xa, 0x73, 0xeb, 0xf2, 0x14, 0x14, 0x3b, + 0x21, 0x17, 0x3d, 0x16, 0xf2, 0x16, 0xee, 0x16, + 0x16, 0x16, 0x14, 0x16, 0x14, 0x14, 0x16, 0x16, + 0x3b, 0x3d, 0x16, 0x16, 0x16, 0xf2, 0x16, 0xf2, + 0x15, 0x16, 0x3f, 0x67, 0x83, 0x6b, 0x81, 0x6b, + 0x81, 0x6b, 0x9a, 0x56, 0x31, 0x9a, 0x9a, 0x71, + 0x6a, 0x6b, 0x6b, 0x81, 0x81, 0x81, 0x6b, 0x81, + 0x5d, 0x81, 0x6f, 0xb0, 0x6f, 0x71, 0x95, 0x6b, + 0x6b, 0x71, 0x4d, 0x42, 0x42, 0x3f, 0x3d, 0x16, + 0x3d, 0x3b, 0xee, 0xf2, 0xf2, 0xf2, 0x15, 0xd8, + 0x5a, 0xe4, 0xec, 0xdb, 0xd9, 0xd3, 0xd2, 0xd9, + 0xd6, 0xe6, 0xe6, 0xde, 0xa, 0x41, 0x40, 0x50, + 0xb4, 0xcb, 0xeb, 0xeb, 0xfa, 0x39, 0x40, 0x2c, + 0xf8, 0x2f, 0x5e, 0x5e, 0x82, 0x8d, 0x68, 0x68, + 0x82, 0x76, 0x5e, 0x5e, 0xa7, 0xa8, 0x5e, 0x5e, + 0x82, 0x76, 0x82, 0x8d, 0x8d, 0x8d, 0x5e, 0x5e, + 0x8d, 0x5e, 0x5e, 0x86, 0x76, 0x28, 0x86, 0x68, + 0x8d, 0x32, 0x68, 0x75, 0x4e, 0x75, 0x4e, 0x68, + 0x5e, 0x7, 0x9f, 0xa3, 0x8d, 0x5e, 0x68, 0x68, + 0x68, 0x68, 0x4e, 0x68, 0x68, 0xa3, 0x9f, 0x68, + 0x74, 0xb3, 0xb7, 0xaa, 0x98, 0x6c, 0x9f, 0xa3, + 0x68, 0x9e, 0x4e, 0x68, 0x68, 0xa3, 0x86, 0x5e, + 0x86, 0x9f, 0x9f, 0x9f, 0xa3, 0xa3, 0x4e, 0xa3, + 0x4e, 0xa3, 0x4e, 0xa3, 0xa3, 0x4e, 0x68, 0xa3, + 0x4e, 0x4e, 0x5e, 0x4e, 0xa3, 0x9f, 0x9f, 0x98, + 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x98, 0x68, 0x68, + 0x4e, 0x68, 0x68, + 0x2c, 0x62, 0x8b, 0x28, 0x82, 0x62, 0x98, 0x8d, + 0x8d, 0x8b, 0x8f, 0x2f, 0xb3, 0xb0, 0xb4, 0xcb, + 0xf1, 0x6e, 0x9, 0x6e, 0x26, 0x4d, 0x1c, 0x1d, + 0x2b, 0x3d, 0xf2, 0x16, 0x15, 0xf2, 0xf2, 0x3d, + 0xf2, 0x16, 0x14, 0x16, 0xf2, 0x2a, 0x22, 0x22, + 0x15, 0x48, 0x34, 0x16, 0x15, 0x34, 0x23, 0x99, + 0x90, 0x71, 0x6b, 0x81, 0x6b, 0x6b, 0x6b, 0x31, + 0x4d, 0x3a, 0x6b, 0x63, 0x85, 0x6f, 0x6b, 0x85, + 0x85, 0x81, 0x81, 0x81, 0x6b, 0x81, 0x81, 0x71, + 0x59, 0x9a, 0x9a, 0x70, 0x67, 0x58, 0x6b, 0x71, + 0x71, 0x81, 0x81, 0x6b, 0x58, 0x6b, 0x71, 0x71, + 0x9a, 0x42, 0x7f, 0x1d, 0x48, 0x7f, 0x66, 0x3f, + 0x3b, 0x3d, 0x15, 0x3d, 0x3d, 0xf2, 0x15, 0x3d, + 0x34, 0x54, 0x5a, 0x67, 0x48, 0xfe, 0x36, 0x1c, + 0x1d, 0x21, 0x70, 0xfa, 0x16, 0x16, 0x3d, 0x16, + 0x3d, 0x22, 0x23, 0x63, 0x99, 0x4a, 0x6a, 0x6a, + 0x83, 0xb, 0xb4, 0xb4, 0xbf, 0xd2, 0xc4, 0xc7, + 0xc4, 0xd2, 0xc4, 0xd5, 0xe4, 0xc7, 0xd1, 0xc7, + 0xc2, 0xc2, 0xc2, 0xd1, 0xc4, 0xc4, 0xc4, 0xd2, + 0xe2, 0xe2, 0xce, 0xdc, 0xcd, 0xcd, 0xc1, 0xc7, + 0xbe, 0xc7, 0xd0, 0x3, 0x5a, 0xfd, 0x99, 0x67, + 0x99, 0x73, 0xee, 0xee, 0x14, 0x14, 0x14, 0xf2, + 0xeb, 0xeb, 0x15, 0x15, 0x17, 0x17, 0x14, 0x17, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x18, 0x3d, 0xf5, + 0xeb, 0xeb, 0x3d, 0x15, 0xeb, 0x16, 0x16, 0x3b, + 0x34, 0x3b, 0x34, 0x7f, 0x11, 0x83, 0x6a, 0x50, + 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x5d, 0x63, 0x5d, + 0x6a, 0x6a, 0x91, 0x6a, 0x83, 0x6a, 0x6a, 0x6a, + 0x6a, 0x6a, 0x6a, 0x5d, 0x6a, 0x6a, 0x6b, 0x5d, + 0x63, 0x80, 0x54, 0x34, 0x1, 0x15, 0x3d, 0x3b, + 0x54, 0x23, 0x21, 0x21, 0x48, 0x34, 0xeb, 0xeb, + 0xd7, 0xd0, 0xbf, 0xd1, 0xdb, 0xd9, 0xd6, 0xd9, + 0xd3, 0xd0, 0x5a, 0x23, 0x3, 0xa1, 0xbf, 0xbf, + 0xd3, 0xcb, 0xde, 0xeb, 0xe6, 0xf9, 0x1b, 0x11, + 0x37, 0x28, 0x5e, 0x68, 0xfc, 0x6c, 0xa3, 0x68, + 0x9f, 0xdd, 0x28, 0x6c, 0x5e, 0x37, 0x28, 0xfc, + 0x5e, 0x68, 0xa3, 0x68, 0xfc, 0xfc, 0x9f, 0x5e, + 0x68, 0x7, 0xfc, 0x32, 0x68, 0x9f, 0x68, 0x68, + 0xfc, 0x68, 0x4e, 0x4e, 0x9f, 0x43, 0x7, 0xa3, + 0x68, 0x9f, 0x28, 0xa3, 0xa3, 0xa3, 0x9e, 0x4e, + 0xa3, 0x68, 0xa3, 0x4e, 0x68, 0x7, 0x7, 0x6c, + 0x68, 0x7, 0x8, 0x30, 0x62, 0x86, 0x4e, 0xa3, + 0x68, 0x68, 0x5e, 0x9e, 0x5e, 0x4e, 0x7, 0x9f, + 0xa3, 0x4e, 0x4e, 0x4e, 0x68, 0xa3, 0x4e, 0x4e, + 0x4e, 0xa3, 0x9f, 0x68, 0x4e, 0x68, 0x98, 0x68, + 0x4e, 0x68, 0x8b, 0x86, 0x4e, 0x98, 0x8b, 0x98, + 0x79, 0x98, 0x98, 0x79, 0x68, 0x68, 0x68, 0x4e, + 0xa3, 0x8b, 0x4e, + 0x8, 0x76, 0x8d, 0x5e, 0x68, 0x8d, 0x5e, 0x5e, + 0x9f, 0x9c, 0x76, 0x7, 0xbe, 0xa1, 0xb, 0x5a, + 0x5a, 0xea, 0xf1, 0x2a, 0x1c, 0xfe, 0x20, 0x39, + 0xe6, 0xeb, 0xf2, 0xeb, 0x73, 0x73, 0xee, 0xee, + 0x3d, 0x14, 0x14, 0x16, 0xf5, 0x15, 0x21, 0x70, + 0x2b, 0x48, 0x34, 0x15, 0x34, 0x34, 0x70, 0x7f, + 0x63, 0x6b, 0x91, 0x6a, 0x81, 0x6f, 0x6a, 0x6f, + 0x97, 0x83, 0x6a, 0x5d, 0x6b, 0x81, 0x6a, 0x31, + 0x71, 0x6a, 0x91, 0x6a, 0x81, 0x6f, 0x6a, 0x5d, + 0x6f, 0x97, 0x6f, 0x4d, 0x59, 0x6a, 0x5d, 0x9a, + 0x85, 0x4a, 0x6a, 0x90, 0x85, 0xb0, 0x6f, 0x71, + 0x85, 0x90, 0x90, 0x4d, 0x42, 0x31, 0x6e, 0x48, + 0x3d, 0x16, 0xf2, 0xf2, 0x3d, 0xd8, 0xe6, 0x1, + 0x34, 0x41, 0x40, 0x41, 0x26, 0xfe, 0xfe, 0x48, + 0xfa, 0x34, 0xfa, 0x15, 0x14, 0x3d, 0x15, 0x17, + 0x3b, 0x42, 0x80, 0x9a, 0x99, 0x20, 0x41, 0xb0, + 0xb4, 0xd2, 0xd0, 0xe0, 0xd0, 0xd1, 0xc4, 0xd1, + 0xe7, 0xdb, 0xd2, 0xc2, 0xce, 0xd1, 0xd2, 0xd2, + 0xd1, 0xc4, 0xc4, 0xd2, 0xd2, 0xd5, 0xd1, 0xc2, + 0xe2, 0xec, 0xd5, 0xc2, 0xc1, 0xc1, 0xd2, 0xdb, + 0xd2, 0xd1, 0xd0, 0xd0, 0xfd, 0x20, 0x63, 0x90, + 0x80, 0xfa, 0x3d, 0x16, 0x14, 0x14, 0x16, 0x3d, + 0xe1, 0xeb, 0x34, 0x17, 0x22, 0x22, 0x22, 0x17, + 0x16, 0x14, 0x14, 0x14, 0x16, 0x14, 0x16, 0xee, + 0xee, 0xf2, 0xf2, 0xeb, 0x73, 0xf2, 0x3b, 0x48, + 0xa, 0x2a, 0x48, 0x36, 0x20, 0x41, 0x6f, 0x6a, + 0x4a, 0x20, 0x6f, 0x6a, 0x8e, 0x6a, 0x58, 0x58, + 0x6f, 0x6a, 0x6a, 0x83, 0x20, 0x6a, 0x6a, 0x7e, + 0x8e, 0x5d, 0x71, 0x6b, 0x81, 0x6b, 0x6b, 0x58, + 0x80, 0x70, 0x34, 0xf2, 0xf2, 0xee, 0xf2, 0x2a, + 0x5a, 0x99, 0x1c, 0x23, 0x23, 0x73, 0xfa, 0xeb, + 0xf1, 0xe0, 0xe5, 0xe5, 0xd2, 0xed, 0xed, 0xdb, + 0xd0, 0xd2, 0xe5, 0xc9, 0x5a, 0xb4, 0xe9, 0xbf, + 0xd0, 0xd8, 0xe1, 0xfa, 0xea, 0xed, 0x1b, 0x27, + 0x5f, 0x76, 0x6c, 0x28, 0x12, 0xf3, 0x6c, 0x5e, + 0x6c, 0x2f, 0x46, 0x8d, 0x82, 0x98, 0x8d, 0x1f, + 0x8d, 0x82, 0x6c, 0x68, 0x5c, 0x5f, 0x28, 0xa3, + 0x5e, 0x82, 0x37, 0x37, 0x8d, 0x79, 0xa3, 0x32, + 0x46, 0x68, 0x68, 0xa3, 0x79, 0x1e, 0x28, 0x68, + 0x8d, 0x68, 0xa3, 0x28, 0x79, 0x68, 0x4e, 0x5e, + 0x8d, 0x5e, 0x9f, 0x5e, 0x82, 0x28, 0x28, 0x8f, + 0x8f, 0x93, 0x93, 0x62, 0x8f, 0x68, 0x5e, 0x86, + 0x8b, 0x93, 0x9f, 0x93, 0x98, 0x9f, 0xa2, 0x98, + 0x98, 0xa3, 0xa3, 0x68, 0x98, 0x4e, 0xa3, 0xa3, + 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, 0x68, 0x93, 0x98, + 0x4e, 0x68, 0x98, 0xa3, 0x4e, 0x98, 0x98, 0x98, + 0xa3, 0x98, 0x7d, 0x9e, 0x4e, 0x4e, 0x8d, 0x4e, + 0x4e, 0x4e, 0x4e, + 0x5e, 0x86, 0x28, 0xfc, 0x28, 0x5e, 0x9e, 0x9f, + 0xdd, 0xc, 0x28, 0x28, 0xf7, 0xf7, 0x12, 0x11, + 0x50, 0xb, 0x6e, 0xfa, 0xe6, 0xe6, 0xcb, 0xe6, + 0xd8, 0xde, 0x15, 0xa, 0xc9, 0xa, 0xfa, 0x34, + 0x15, 0xf2, 0x16, 0x3d, 0x16, 0xf2, 0xf2, 0xe1, + 0x15, 0x2a, 0xeb, 0x3f, 0x48, 0x48, 0x2b, 0x21, + 0x67, 0x6f, 0x6f, 0x5d, 0x7a, 0x99, 0x5a, 0x41, + 0x5d, 0x90, 0x20, 0x58, 0x5d, 0x81, 0x91, 0x95, + 0x5d, 0x6a, 0x83, 0x90, 0x6f, 0x97, 0x41, 0x85, + 0x71, 0x6a, 0x5d, 0x3a, 0x31, 0x4a, 0x6a, 0x71, + 0x71, 0x3a, 0x3, 0x99, 0x63, 0x90, 0x63, 0x3a, + 0x5d, 0x6b, 0x6a, 0x31, 0x59, 0x4d, 0x80, 0x48, + 0x17, 0x16, 0x16, 0x16, 0x15, 0xeb, 0xde, 0xeb, + 0xeb, 0x41, 0xa1, 0x97, 0x4d, 0xf9, 0xf1, 0x34, + 0x3f, 0xfa, 0x15, 0xee, 0x3d, 0xf2, 0xf2, 0x3d, + 0x3b, 0x48, 0x7f, 0x99, 0x31, 0x1c, 0x54, 0x6e, + 0x7f, 0xe5, 0xcb, 0xa, 0xc9, 0xbf, 0xcf, 0xd0, + 0xdb, 0xd9, 0xd2, 0xc4, 0xc4, 0xd2, 0xd3, 0xd3, + 0xc4, 0xd1, 0xc4, 0xd9, 0xd9, 0xe7, 0xc4, 0xc4, + 0xd1, 0xd2, 0xd9, 0xd2, 0xc4, 0xd2, 0xd3, 0xd6, + 0xe0, 0xfd, 0x41, 0x99, 0xfd, 0xf9, 0x66, 0x6e, + 0x9, 0x34, 0xf2, 0x14, 0x14, 0x14, 0x17, 0x3d, + 0x3d, 0x14, 0x21, 0x23, 0x3b, 0x3d, 0x17, 0x14, + 0x14, 0x14, 0x14, 0x18, 0x14, 0x14, 0x16, 0x16, + 0x16, 0x3d, 0xf2, 0x15, 0xf2, 0x3d, 0x3b, 0x54, + 0xcb, 0x48, 0x59, 0x5d, 0x5d, 0x71, 0x5d, 0x95, + 0x6f, 0x99, 0x9a, 0x71, 0x90, 0x85, 0x6b, 0x63, + 0xaf, 0x6a, 0x71, 0x6b, 0x6b, 0x6b, 0x81, 0x95, + 0x6a, 0x6b, 0x71, 0x6b, 0x81, 0x85, 0x71, 0x67, + 0x54, 0x54, 0x3b, 0x3b, 0x15, 0x3d, 0x3b, 0x73, + 0x73, 0x2b, 0x15, 0x34, 0xeb, 0xeb, 0xeb, 0xea, + 0xd6, 0xed, 0xe7, 0xec, 0xec, 0xe5, 0x5a, 0xed, + 0xd0, 0xcb, 0xcb, 0xcb, 0xf4, 0xb4, 0xa1, 0xc8, + 0xaf, 0xa, 0xfa, 0x23, 0x1c, 0x26, 0x20, 0x60, + 0x74, 0xb3, 0xa8, 0x28, 0x93, 0x74, 0xa7, 0x86, + 0x98, 0x8b, 0x82, 0x5e, 0x62, 0x8f, 0xa7, 0x82, + 0x7d, 0x74, 0xa0, 0x8d, 0x8b, 0x8f, 0x32, 0x5e, + 0x98, 0x8d, 0x8d, 0x8d, 0x8b, 0x7d, 0xb6, 0x5e, + 0x8b, 0x8d, 0x5e, 0x5e, 0x98, 0x98, 0x68, 0x8d, + 0x98, 0x79, 0x68, 0x8d, 0x98, 0x8d, 0x7, 0x5e, + 0x8b, 0x5e, 0x9f, 0x8d, 0x8b, 0x8d, 0x5e, 0x9c, + 0x8f, 0x74, 0x74, 0xac, 0x8f, 0x93, 0x6c, 0x55, + 0x8b, 0x68, 0x68, 0x8b, 0x8b, 0x68, 0xa3, 0x98, + 0x98, 0xa3, 0xa3, 0x98, 0x98, 0xa3, 0xa3, 0x98, + 0x98, 0xa3, 0x4e, 0x79, 0x4e, 0x4e, 0xa3, 0x4e, + 0x68, 0x0, 0x4e, 0x4e, 0xa3, 0xa3, 0xa3, 0xa3, + 0x4e, 0x9e, 0x8d, 0xa3, 0x0, 0x4e, 0x4e, 0x4e, + 0x4e, 0x0, 0x0, + 0x5e, 0x8b, 0x7d, 0x82, 0xc, 0x9c, 0x93, 0x5e, + 0x46, 0x8f, 0x8f, 0x8f, 0x8f, 0x7e, 0x74, 0x2f, + 0x50, 0xbf, 0x5a, 0x5a, 0xcb, 0x8a, 0xfa, 0x23, + 0xeb, 0x15, 0xeb, 0xfa, 0x8a, 0x73, 0xeb, 0x15, + 0x15, 0xf2, 0x16, 0xf2, 0xf5, 0xf2, 0x16, 0x16, + 0x16, 0xf2, 0xf2, 0x3d, 0x70, 0x3d, 0x3b, 0x3f, + 0x48, 0x7f, 0x9a, 0x71, 0x71, 0x58, 0x63, 0x59, + 0x63, 0x9a, 0x7f, 0x56, 0x71, 0x71, 0x6a, 0x81, + 0x71, 0x85, 0x85, 0x71, 0x71, 0x71, 0x7f, 0x67, + 0x71, 0x6f, 0x80, 0x59, 0x59, 0x80, 0x90, 0x5d, + 0x6a, 0x85, 0x58, 0x59, 0x71, 0x71, 0x63, 0x67, + 0x85, 0x85, 0x85, 0x80, 0x58, 0x80, 0x99, 0x80, + 0x42, 0x42, 0x1d, 0x3f, 0x48, 0x3d, 0xee, 0x3d, + 0x15, 0x34, 0x73, 0x73, 0x7f, 0x7f, 0x48, 0x48, + 0x1c, 0x36, 0x21, 0x15, 0x22, 0x15, 0x16, 0x16, + 0x16, 0x16, 0xf2, 0xeb, 0x23, 0x67, 0x99, 0xfe, + 0x3a, 0x58, 0x63, 0x99, 0x54, 0x6e, 0xd8, 0xcb, + 0xe0, 0xd3, 0xd3, 0xd3, 0xd2, 0xc4, 0xd2, 0xd3, + 0xdb, 0xd2, 0xd2, 0xd2, 0xd2, 0xd2, 0xd3, 0xd6, + 0xd3, 0xd3, 0xd2, 0xd3, 0xd2, 0xe7, 0xd0, 0xcb, + 0x5a, 0xfd, 0x36, 0x99, 0xd8, 0x70, 0x34, 0xeb, + 0xeb, 0xe1, 0xee, 0x16, 0x16, 0x17, 0x22, 0x15, + 0x16, 0x22, 0x22, 0x15, 0x16, 0x18, 0xff, 0xff, + 0x14, 0x14, 0x18, 0x3d, 0x16, 0x3d, 0x17, 0x3b, + 0x3d, 0x3d, 0x3d, 0x3d, 0xee, 0xf2, 0xf2, 0xeb, + 0xeb, 0x23, 0x71, 0x6a, 0x6a, 0x6b, 0x6b, 0x6b, + 0x6f, 0x80, 0x71, 0x58, 0x90, 0x6f, 0x71, 0x6b, + 0x71, 0x71, 0x71, 0x81, 0x6a, 0x81, 0x6b, 0x6b, + 0x58, 0x85, 0x6b, 0x6b, 0x63, 0x67, 0x99, 0x7f, + 0x70, 0x3f, 0x2b, 0x21, 0x34, 0x15, 0x73, 0xeb, + 0x1, 0xf2, 0xf2, 0x34, 0x15, 0xf2, 0x34, 0xe5, + 0xd2, 0xd2, 0xe7, 0xe7, 0xdb, 0xd2, 0xd2, 0xd2, + 0xd6, 0xcb, 0xb4, 0xb4, 0x5a, 0x6e, 0x20, 0x3e, + 0xa1, 0xcb, 0xa, 0xfe, 0x23, 0x5a, 0x50, 0x5f, + 0x5f, 0x60, 0xa7, 0x68, 0x8d, 0x1e, 0x28, 0x1f, + 0x37, 0x8d, 0x5e, 0x28, 0x30, 0x2c, 0xb7, 0x6c, + 0x82, 0x1f, 0xe, 0x28, 0x8d, 0x4e, 0x5e, 0x28, + 0x1f, 0x8d, 0x9f, 0x5e, 0x37, 0x2f, 0xa7, 0x5e, + 0x8d, 0x5e, 0x37, 0x37, 0x79, 0x68, 0x0, 0x5e, + 0x28, 0x5e, 0x7, 0x7, 0x8d, 0x68, 0x28, 0x68, + 0x68, 0x68, 0x4e, 0x28, 0x5e, 0x5e, 0xa3, 0x6c, + 0x27, 0x20, 0xf8, 0x9c, 0x93, 0x9f, 0x28, 0x68, + 0x68, 0xa3, 0x4e, 0x68, 0x68, 0x4e, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0xa3, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0xa3, + 0x4e, 0xa3, 0xa3, 0xa3, 0xa3, 0x79, 0x9c, 0x7d, + 0xa3, 0xa3, 0x8d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x4e, + 0xc, 0xb3, 0x8f, 0x8d, 0x8d, 0x62, 0x62, 0x82, + 0x8d, 0x8f, 0x8f, 0x7e, 0x91, 0x91, 0x62, 0xa7, + 0xa6, 0x97, 0x50, 0x2c, 0x50, 0x20, 0x20, 0x20, + 0x7f, 0x34, 0xf2, 0xf2, 0x1, 0xee, 0xee, 0xee, + 0xee, 0x14, 0x14, 0x3d, 0x3d, 0xf2, 0x3d, 0x17, + 0x17, 0x16, 0x16, 0x15, 0x3f, 0x3d, 0x3d, 0x3b, + 0x73, 0x34, 0x23, 0x58, 0x71, 0x6b, 0x71, 0x71, + 0x71, 0x7f, 0x70, 0x67, 0x71, 0x9a, 0x99, 0x6f, + 0x6b, 0x6b, 0x5d, 0x63, 0x71, 0x71, 0x71, 0x59, + 0x71, 0x9a, 0x7f, 0x80, 0x58, 0x63, 0x67, 0x9a, + 0x71, 0x81, 0x6b, 0x58, 0x31, 0x6b, 0x85, 0x9a, + 0x58, 0x4d, 0x7f, 0x67, 0x71, 0x6b, 0x58, 0x4d, + 0x80, 0x67, 0x54, 0x34, 0x2a, 0x3d, 0x3d, 0x16, + 0xf2, 0x3d, 0x16, 0x3d, 0x70, 0x3, 0xcb, 0x39, + 0x1a, 0x4d, 0x99, 0x54, 0xfa, 0x16, 0x3d, 0x3d, + 0x3d, 0x14, 0x16, 0x3d, 0x34, 0x7f, 0x7f, 0x42, + 0x36, 0x31, 0x66, 0xa, 0xd8, 0xd8, 0xd8, 0xd7, + 0xd3, 0xd2, 0xd3, 0xd6, 0xd9, 0xd2, 0xc4, 0xd2, + 0xd9, 0xd9, 0xd3, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, + 0xd3, 0xc4, 0xd2, 0xd3, 0xd6, 0xed, 0xd4, 0xd2, + 0xd0, 0xea, 0xf1, 0xeb, 0xa, 0xea, 0x54, 0x3d, + 0x16, 0x16, 0x16, 0x14, 0x14, 0xf2, 0x17, 0x16, + 0x3d, 0x15, 0x15, 0x16, 0x18, 0x14, 0x14, 0x14, + 0x14, 0x16, 0x3d, 0x16, 0x3d, 0x17, 0x3d, 0x15, + 0x15, 0xf2, 0x2b, 0x15, 0xf2, 0x15, 0x21, 0x21, + 0x48, 0x99, 0x90, 0x83, 0x6a, 0x5d, 0x5d, 0x5d, + 0xaf, 0x83, 0x6b, 0x5d, 0x5d, 0x6a, 0x6a, 0x6a, + 0x6a, 0x58, 0x58, 0x6a, 0x83, 0x83, 0x58, 0x5d, + 0x85, 0x58, 0x71, 0x6b, 0x63, 0x1d, 0x3f, 0x48, + 0xf2, 0x3d, 0xee, 0x73, 0xde, 0x73, 0xd8, 0xd7, + 0xd8, 0xc0, 0x23, 0x41, 0x23, 0xeb, 0xe6, 0xe0, + 0xd1, 0xd3, 0xd9, 0xe0, 0xd3, 0xd2, 0xc4, 0xbf, + 0xe5, 0x5a, 0xbf, 0xcc, 0x41, 0xea, 0xfd, 0x10, + 0xbf, 0xcb, 0xd8, 0xea, 0xfd, 0x20, 0xf3, 0x28, + 0x28, 0x1f, 0x28, 0x5e, 0x68, 0x68, 0x6c, 0x37, + 0x5e, 0x6c, 0x7, 0x6c, 0x37, 0x46, 0x5e, 0x5e, + 0x5e, 0x5e, 0x8d, 0x68, 0x68, 0x75, 0xa3, 0x68, + 0x68, 0x68, 0x9f, 0x9f, 0x5e, 0x5e, 0x32, 0x68, + 0x68, 0x68, 0x5e, 0x5e, 0x68, 0xa3, 0x9f, 0x9f, + 0x68, 0x86, 0xa3, 0xa3, 0x0, 0x5e, 0x68, 0x68, + 0xa3, 0x4e, 0xa3, 0x9e, 0x5e, 0xa3, 0xb6, 0xb8, + 0x8, 0x98, 0x5e, 0x6c, 0x68, 0x68, 0xa3, 0x68, + 0x68, 0x4e, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x9f, + 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x68, 0x98, 0x68, + 0xa3, 0xa3, 0x93, 0x5e, 0xa3, 0x98, 0x8b, 0x86, + 0x98, 0x98, 0x98, 0x8d, 0x4e, 0xa3, 0x8d, 0x4e, + 0x4e, 0x4e, 0x82, + 0xe, 0x2f, 0x8d, 0xa3, 0x68, 0x1e, 0x1f, 0x37, + 0x5e, 0x76, 0x5f, 0x27, 0x27, 0xb7, 0xa0, 0x6c, + 0xe, 0x12, 0xe, 0x5e, 0x6c, 0x2c, 0x50, 0x20, + 0xd0, 0xcb, 0xd8, 0xd8, 0xde, 0xe1, 0xee, 0xeb, + 0xee, 0x14, 0x14, 0x16, 0xeb, 0xee, 0xf2, 0x15, + 0xeb, 0x16, 0x3d, 0x16, 0x70, 0x15, 0x15, 0x34, + 0x3b, 0x70, 0x48, 0x67, 0x71, 0x6a, 0x91, 0x6a, + 0x31, 0x80, 0x26, 0x71, 0x5d, 0x67, 0x67, 0x90, + 0x6a, 0x6a, 0x83, 0x3a, 0x58, 0x90, 0xb0, 0x6f, + 0x71, 0x5d, 0x90, 0x6f, 0x6b, 0x31, 0x67, 0x4d, + 0x71, 0x85, 0xaf, 0x3a, 0x58, 0x83, 0xb4, 0x97, + 0x5d, 0x58, 0x31, 0x58, 0x6a, 0x6a, 0x6f, 0x4d, + 0x3a, 0x7f, 0x73, 0xf2, 0xf2, 0x3d, 0x16, 0x3d, + 0x34, 0x2b, 0xf2, 0x16, 0x3d, 0xfa, 0xe6, 0xeb, + 0xfb, 0x5a, 0x3, 0xa, 0x34, 0xfa, 0x15, 0x15, + 0x17, 0x22, 0x3d, 0x18, 0x16, 0x3d, 0x34, 0x15, + 0x54, 0xf9, 0x9, 0xa, 0xd8, 0xd7, 0xd7, 0xd8, + 0xd3, 0xd2, 0xd3, 0xd6, 0xd7, 0xd3, 0xd2, 0xd3, + 0xd6, 0xd6, 0xd6, 0xd3, 0xd3, 0xd3, 0xd6, 0xd6, + 0xd3, 0xd2, 0xd2, 0xd6, 0xd6, 0xd6, 0xd3, 0xd3, + 0xd3, 0xe0, 0xfa, 0x23, 0xea, 0xfd, 0x23, 0xf2, + 0x16, 0xee, 0xee, 0x14, 0x14, 0x14, 0x14, 0x16, + 0xf2, 0xf2, 0x15, 0x16, 0x14, 0x14, 0x17, 0x17, + 0x22, 0x16, 0x16, 0x16, 0xee, 0x16, 0xf2, 0xf2, + 0x1, 0x15, 0x34, 0x34, 0x15, 0x34, 0x67, 0x67, + 0x26, 0x67, 0x58, 0x85, 0x83, 0x83, 0x5d, 0x6f, + 0x97, 0x6f, 0x5d, 0x71, 0x5d, 0x6b, 0x6a, 0x6a, + 0x6a, 0x97, 0x6f, 0x6a, 0x83, 0x6f, 0x6b, 0x6b, + 0x71, 0x71, 0x71, 0x71, 0x63, 0x7f, 0x3f, 0x3b, + 0x16, 0xf2, 0x15, 0x15, 0xe1, 0xeb, 0xd8, 0xcb, + 0xe6, 0xe6, 0xcb, 0xe5, 0xd0, 0xd7, 0xd8, 0xd6, + 0xd3, 0xd3, 0xd3, 0xd3, 0xd9, 0xdb, 0xd2, 0xe4, + 0x2c, 0xa1, 0x5a, 0xfd, 0xcb, 0x54, 0x3, 0xbf, + 0xcb, 0xd8, 0xfa, 0x48, 0x20, 0x1b, 0xf8, 0xa7, + 0x82, 0x8b, 0x82, 0x6c, 0x82, 0x76, 0x37, 0x6c, + 0x8d, 0x82, 0x37, 0x82, 0x82, 0x98, 0x8d, 0x5e, + 0x8d, 0x8d, 0x5e, 0x7, 0x79, 0x5e, 0x86, 0x68, + 0x5e, 0x8d, 0x68, 0x68, 0x79, 0x8d, 0x86, 0x68, + 0x82, 0x8d, 0x5e, 0x6c, 0x8d, 0x8d, 0x5e, 0x5e, + 0x79, 0x68, 0x68, 0x68, 0x8d, 0x68, 0x4e, 0xa3, + 0x79, 0x75, 0xa3, 0x9f, 0x5e, 0x5e, 0x6c, 0x9c, + 0x62, 0x8f, 0x8b, 0x8f, 0x62, 0x68, 0x4e, 0x5e, + 0x9c, 0x32, 0x9e, 0x8d, 0x98, 0xa3, 0xa3, 0x68, + 0x98, 0x4e, 0xa3, 0x98, 0x98, 0xa3, 0x4e, 0x93, + 0xa3, 0xa3, 0x4e, 0xa3, 0x5e, 0x4e, 0x8b, 0x68, + 0x0, 0xa3, 0x98, 0x98, 0x4e, 0x98, 0x98, 0x98, + 0x98, 0x98, 0x98, 0x8d, 0x4e, 0x4e, 0x79, 0x4e, + 0x4e, 0x0, 0x8d, + 0x5e, 0x82, 0x5e, 0x4e, 0xa3, 0x68, 0x37, 0x5e, + 0x9f, 0xb8, 0xdd, 0x1f, 0x46, 0x37, 0x28, 0x5e, + 0x5e, 0x28, 0x6c, 0x9f, 0x9f, 0xbd, 0xd5, 0xbf, + 0xbf, 0xd6, 0xe0, 0xe0, 0xf1, 0xde, 0xeb, 0xeb, + 0xee, 0x14, 0x14, 0xff, 0x16, 0x14, 0xee, 0xe1, + 0xe1, 0xee, 0xf2, 0x17, 0x16, 0x3d, 0xf2, 0x34, + 0x34, 0x34, 0x34, 0x54, 0x80, 0x99, 0x6a, 0x5d, + 0x81, 0x85, 0x6a, 0x5d, 0x6a, 0x71, 0x31, 0x6b, + 0x5d, 0x6f, 0x99, 0x99, 0x99, 0x5a, 0x99, 0x97, + 0x81, 0x6b, 0x81, 0x81, 0x6a, 0x6b, 0x59, 0x63, + 0x71, 0x9a, 0x7f, 0x7f, 0x71, 0x90, 0x5a, 0x99, + 0x6b, 0x81, 0x81, 0x81, 0x71, 0x5d, 0x6f, 0x85, + 0x9a, 0x7f, 0x3b, 0x16, 0x16, 0x14, 0x3d, 0xf2, + 0x34, 0x2a, 0x3d, 0x3d, 0x3b, 0x2b, 0x34, 0xf2, + 0x73, 0xea, 0xf1, 0xeb, 0x1c, 0x23, 0x21, 0x17, + 0x21, 0x1d, 0x17, 0x3d, 0x17, 0xee, 0x16, 0xf2, + 0x15, 0x54, 0x73, 0x1, 0xa, 0x6e, 0xa, 0xe6, + 0xd8, 0xcb, 0xd7, 0xd8, 0xd8, 0xd6, 0xd7, 0xd6, + 0xd3, 0xd3, 0xd9, 0xd9, 0xd2, 0xd9, 0xd2, 0xd6, + 0xd6, 0xd6, 0xd6, 0xe0, 0xe0, 0xe0, 0xde, 0xd7, + 0xd8, 0x23, 0x54, 0xfa, 0xfa, 0xfa, 0x15, 0x3d, + 0x18, 0x16, 0xee, 0xff, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xee, 0x16, 0xff, 0x14, 0x16, 0x16, + 0xee, 0x16, 0x3d, 0x3d, 0x3d, 0xee, 0x16, 0x16, + 0xf2, 0x3d, 0x3b, 0x15, 0x34, 0x21, 0x42, 0x3a, + 0x90, 0x80, 0x58, 0x71, 0x58, 0x58, 0x6b, 0x71, + 0x67, 0x42, 0x9a, 0x71, 0x83, 0x90, 0x99, 0x6f, + 0x90, 0x80, 0x58, 0x5d, 0x58, 0x58, 0x71, 0x71, + 0x80, 0x99, 0x80, 0x80, 0x70, 0x70, 0x3d, 0xf2, + 0x16, 0x3d, 0x70, 0x3f, 0x3d, 0xf2, 0xeb, 0xeb, + 0xde, 0xde, 0xd8, 0xed, 0xd3, 0xd0, 0xd3, 0xd6, + 0xd6, 0xd6, 0xd0, 0xc4, 0xe5, 0xd9, 0xdb, 0xe9, + 0x50, 0xc9, 0xcb, 0xf1, 0xfa, 0x54, 0x5a, 0xb, + 0xfd, 0x2a, 0x34, 0x23, 0x63, 0x20, 0x4a, 0x60, + 0x74, 0x8f, 0x9c, 0xc, 0x30, 0x62, 0x82, 0x5e, + 0x98, 0x62, 0x46, 0x5e, 0x8b, 0x8f, 0x28, 0xe, + 0x62, 0x8f, 0x28, 0x28, 0x46, 0x46, 0x5e, 0x86, + 0x98, 0x98, 0x1f, 0x37, 0x98, 0x98, 0x68, 0x37, + 0x62, 0x98, 0x5e, 0x28, 0x98, 0x62, 0x5e, 0x8d, + 0x98, 0x98, 0x68, 0x28, 0x98, 0x8d, 0x5e, 0x6c, + 0x8f, 0x68, 0xa3, 0x68, 0x8b, 0x98, 0x46, 0x8f, + 0x8f, 0x8f, 0x8f, 0x31, 0x31, 0x93, 0x5e, 0x9c, + 0x8f, 0x98, 0x68, 0x8b, 0x98, 0x68, 0x4e, 0x8b, + 0x98, 0xa3, 0x4e, 0x98, 0x93, 0xa3, 0x4e, 0x98, + 0x8d, 0x4e, 0x4e, 0x79, 0x9e, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0xa3, 0x4e, 0xa3, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, + 0x0, 0x4e, 0x0, + 0x8d, 0x9c, 0x9c, 0x37, 0x28, 0xa8, 0x5f, 0x5e, + 0x37, 0x55, 0x7d, 0x5e, 0x8d, 0x62, 0x46, 0x37, + 0x76, 0x74, 0xa8, 0xf7, 0xe, 0x60, 0x50, 0xf3, + 0xb, 0xea, 0xd8, 0xcb, 0xa, 0xeb, 0xeb, 0xeb, + 0x16, 0x16, 0xf5, 0x16, 0x14, 0x16, 0xee, 0x16, + 0x16, 0x16, 0x17, 0x3d, 0x16, 0x16, 0x16, 0x3d, + 0x16, 0x3d, 0x34, 0x67, 0x67, 0x42, 0x58, 0x6b, + 0x71, 0x99, 0x63, 0x58, 0x58, 0x80, 0x85, 0x97, + 0x6a, 0x6b, 0x6f, 0x58, 0x59, 0x59, 0x4d, 0x71, + 0x71, 0x6b, 0x5d, 0x85, 0x63, 0x85, 0x71, 0x85, + 0x6b, 0x71, 0x58, 0x59, 0x71, 0x63, 0x7f, 0x67, + 0x6b, 0x5d, 0x90, 0x99, 0x85, 0x59, 0x71, 0x9a, + 0x85, 0x31, 0x36, 0x1d, 0x3f, 0x3b, 0x16, 0x16, + 0x3d, 0xf2, 0x3d, 0x16, 0x14, 0x16, 0x16, 0x70, + 0x7f, 0x3c, 0x23, 0x42, 0x67, 0x99, 0x34, 0x15, + 0xeb, 0x15, 0xf2, 0x16, 0x15, 0x15, 0xf2, 0x2b, + 0x48, 0x42, 0x1d, 0x15, 0x15, 0xeb, 0xeb, 0xee, + 0x1, 0xde, 0xd8, 0x73, 0xcb, 0xd7, 0xd8, 0xde, + 0xe0, 0xd2, 0xc4, 0xd6, 0xd6, 0xd6, 0xd3, 0xd7, + 0xd6, 0xd7, 0xd7, 0xd8, 0xcb, 0xd7, 0xf1, 0x23, + 0xe6, 0x54, 0x54, 0xeb, 0x16, 0xf2, 0x16, 0x16, + 0x16, 0xf2, 0x16, 0x3d, 0x16, 0x16, 0x16, 0xff, + 0xff, 0x14, 0xff, 0xff, 0xff, 0x14, 0x14, 0x16, + 0x16, 0x14, 0x3d, 0x16, 0x15, 0x3b, 0x3d, 0x3d, + 0x16, 0x16, 0x3d, 0x34, 0x34, 0x34, 0x54, 0x7f, + 0x90, 0x5d, 0x6b, 0x6b, 0x71, 0x81, 0x6b, 0x71, + 0x63, 0x42, 0x80, 0x63, 0x80, 0x9a, 0x31, 0x4d, + 0x85, 0x71, 0x6b, 0x81, 0x6b, 0x71, 0x71, 0x85, + 0x67, 0x3f, 0x3f, 0x14, 0x16, 0x16, 0xf2, 0x34, + 0x3d, 0x7f, 0x80, 0x99, 0x73, 0xf2, 0xee, 0xde, + 0xee, 0x1, 0xeb, 0xde, 0xf1, 0xe0, 0xd3, 0xd9, + 0xed, 0xd9, 0xd2, 0xd2, 0xd1, 0xd3, 0xd9, 0xd0, + 0xbf, 0xd0, 0xcb, 0xde, 0xeb, 0xe6, 0x41, 0x11, + 0xb, 0xe6, 0xfa, 0x39, 0x20, 0x58, 0x40, 0x2c, + 0x62, 0x93, 0xa7, 0x28, 0x37, 0x8d, 0x86, 0x5e, + 0x5e, 0x8d, 0x28, 0x6c, 0x8d, 0x82, 0x28, 0x28, + 0x37, 0x5e, 0x5e, 0x68, 0x5e, 0x79, 0x68, 0x68, + 0x68, 0x79, 0x68, 0x68, 0x68, 0x68, 0xa3, 0x68, + 0x5e, 0x4e, 0x68, 0x68, 0x68, 0x5e, 0x5e, 0x4e, + 0x68, 0xa3, 0x4e, 0x9e, 0x5e, 0x4e, 0x9e, 0xa3, + 0x4e, 0x68, 0x4e, 0x68, 0x4e, 0x68, 0x9e, 0x5e, + 0x9c, 0x9c, 0x6c, 0x9c, 0x9c, 0x9f, 0x4e, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, + 0xa3, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0xa3, 0xa3, + 0x4e, 0x4e, 0x4e, 0xa3, 0x9f, 0x79, 0x82, 0x5e, + 0xa3, 0xa3, 0x8d, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, + 0x4e, 0x0, 0x4e, + 0x5e, 0x9c, 0xb3, 0x30, 0x46, 0x98, 0x82, 0x5e, + 0x1f, 0x62, 0x93, 0x5e, 0x8d, 0x62, 0x27, 0x5f, + 0x93, 0x9c, 0xa8, 0xfc, 0x2f, 0x7d, 0x5f, 0x28, + 0xa6, 0x5a, 0xa, 0xd8, 0xeb, 0xf2, 0xee, 0xe1, + 0xee, 0xee, 0xf2, 0xf2, 0x14, 0x16, 0xee, 0x15, + 0x15, 0x16, 0x16, 0x18, 0x3b, 0x16, 0x14, 0x16, + 0x14, 0x16, 0x70, 0x66, 0x63, 0x4d, 0x71, 0x71, + 0x71, 0x58, 0x80, 0x9a, 0x9a, 0x70, 0x7f, 0x63, + 0x58, 0x5d, 0x6a, 0x81, 0x81, 0x71, 0x5d, 0x5d, + 0x71, 0x6b, 0x85, 0x85, 0x9a, 0x80, 0x6f, 0x95, + 0x5d, 0x6b, 0x81, 0x81, 0x5d, 0x81, 0x3a, 0x7f, + 0x9a, 0x85, 0x90, 0x99, 0x58, 0x6b, 0x6b, 0x5d, + 0x6b, 0x81, 0x81, 0x59, 0x7f, 0x1d, 0x3b, 0x16, + 0xf2, 0x16, 0x16, 0x16, 0x16, 0x3d, 0x3d, 0x54, + 0xaf, 0x40, 0xfd, 0x39, 0x54, 0x6e, 0xfa, 0x34, + 0x15, 0x17, 0x17, 0x15, 0x3d, 0x16, 0x15, 0x21, + 0x48, 0x23, 0x21, 0x34, 0xeb, 0xe1, 0xee, 0xeb, + 0xfa, 0xeb, 0xd8, 0xde, 0xd8, 0xd7, 0xd7, 0xd8, + 0xd6, 0xd2, 0xd3, 0xd3, 0xd6, 0xd6, 0xd6, 0xd6, + 0xd6, 0xd7, 0xd7, 0xd7, 0xd6, 0xd7, 0xd8, 0x15, + 0xeb, 0x15, 0xf2, 0xf2, 0x16, 0x15, 0x16, 0x16, + 0x17, 0x16, 0x16, 0x16, 0x3d, 0x16, 0x14, 0x14, + 0xff, 0x14, 0xff, 0xff, 0x14, 0x14, 0x14, 0x18, + 0x3d, 0x16, 0x3d, 0x15, 0x16, 0x34, 0xf2, 0xf2, + 0x16, 0xeb, 0x15, 0x34, 0x34, 0x48, 0x23, 0x26, + 0x63, 0x91, 0x6a, 0x7e, 0x7e, 0x6a, 0x83, 0x6a, + 0x83, 0x97, 0x90, 0x5d, 0x5d, 0x4a, 0x5d, 0x6f, + 0x99, 0x90, 0x5d, 0x91, 0x6a, 0x9a, 0x99, 0x80, + 0x99, 0x42, 0x70, 0x34, 0x16, 0x3d, 0x3d, 0x34, + 0xeb, 0xeb, 0xcb, 0xcb, 0xde, 0xa, 0xde, 0xde, + 0xde, 0xf1, 0xd7, 0xe0, 0xd8, 0xd7, 0xd6, 0xd3, + 0xd2, 0xd3, 0xd3, 0xd3, 0xc4, 0xd2, 0xd2, 0xd2, + 0xe7, 0xd0, 0xd3, 0xcb, 0xde, 0x2a, 0x23, 0xd0, + 0xd0, 0xd8, 0xd7, 0xd8, 0x23, 0x90, 0x2c, 0xe, + 0x37, 0xe, 0xfc, 0x5e, 0x68, 0x68, 0x68, 0x9f, + 0x9f, 0x68, 0x9f, 0xb8, 0xfc, 0x9e, 0x5e, 0xa3, + 0x68, 0x68, 0x9f, 0x5e, 0xa3, 0xa3, 0x4e, 0x9f, + 0x6c, 0x68, 0xa3, 0x4e, 0x68, 0x68, 0x68, 0xa3, + 0xa3, 0x86, 0x5e, 0xa3, 0x68, 0x68, 0x9e, 0x9f, + 0x6c, 0x4e, 0xa3, 0xa3, 0xa3, 0x68, 0xa3, 0xa3, + 0x68, 0x4e, 0x68, 0x4e, 0x9f, 0xa3, 0x68, 0xb6, + 0x41, 0x12, 0x68, 0x9f, 0x68, 0xa3, 0xa3, 0xa3, + 0xa3, 0x4e, 0x4e, 0xa3, 0x9f, 0x4e, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x98, 0x68, + 0x4e, 0x4e, 0x98, 0x82, 0xa3, 0x98, 0x98, 0x98, + 0x9e, 0x8d, 0x98, 0x8d, 0x4e, 0x4e, 0x8d, 0x4e, + 0x4e, 0x4e, 0x8d, + 0x5e, 0x28, 0x28, 0x5e, 0x68, 0x68, 0x5e, 0x5e, + 0x9f, 0x1e, 0x6c, 0xb6, 0x6c, 0x6c, 0xa0, 0x6c, + 0x5e, 0x5e, 0x5e, 0x5e, 0x9f, 0x6c, 0xb6, 0x8, + 0x7, 0xbf, 0xd0, 0xe6, 0xde, 0xee, 0xeb, 0xee, + 0xee, 0x16, 0x16, 0xee, 0x14, 0x14, 0xeb, 0xde, + 0xde, 0xf5, 0xde, 0xfa, 0x15, 0xf2, 0xf2, 0xf2, + 0x16, 0x3d, 0xeb, 0x39, 0x5a, 0x5a, 0x90, 0x83, + 0x85, 0x71, 0x83, 0x90, 0x9a, 0x7f, 0x67, 0x5d, + 0x6f, 0x90, 0x35, 0x6a, 0x6a, 0x91, 0x6a, 0x83, + 0x85, 0x81, 0x6a, 0x6f, 0x85, 0x99, 0x63, 0x5d, + 0x4a, 0x6a, 0x60, 0x83, 0x90, 0x6a, 0x83, 0x41, + 0x97, 0x58, 0x5d, 0x5d, 0x6b, 0x6a, 0x6a, 0x5d, + 0x6b, 0x91, 0x6a, 0x41, 0x54, 0x54, 0xf2, 0x3b, + 0xeb, 0x16, 0x16, 0x3d, 0x16, 0x3d, 0x3d, 0xf2, + 0x5a, 0xd0, 0x5a, 0xcb, 0xe6, 0xcb, 0xea, 0x39, + 0x54, 0x48, 0x22, 0x22, 0x17, 0x3d, 0x16, 0x3b, + 0x15, 0x15, 0xeb, 0x34, 0xde, 0xde, 0x15, 0x15, + 0xeb, 0xd7, 0xeb, 0xeb, 0xd8, 0xd7, 0xd7, 0xe0, + 0xd7, 0xd6, 0xd3, 0xd2, 0xd3, 0xd6, 0xd7, 0xd7, + 0xd6, 0xd3, 0xd6, 0xde, 0xde, 0xd8, 0xde, 0xee, + 0xde, 0xe1, 0xee, 0x16, 0xee, 0xeb, 0x21, 0x17, + 0x17, 0x3b, 0x16, 0xf2, 0x14, 0x14, 0x14, 0x14, + 0xff, 0x14, 0x14, 0x14, 0x16, 0x22, 0x16, 0x3d, + 0x18, 0x3d, 0x3d, 0xf2, 0xf2, 0x16, 0x15, 0xf2, + 0x3d, 0xeb, 0xea, 0x70, 0x1a, 0x90, 0x63, 0x3c, + 0x5d, 0x5d, 0x6a, 0x6a, 0x6a, 0x9d, 0x90, 0x6f, + 0x6a, 0x5d, 0x5d, 0x3a, 0x5d, 0x5d, 0x6a, 0x6f, + 0x31, 0x4d, 0x85, 0x6a, 0x6a, 0x85, 0x99, 0x39, + 0x39, 0x67, 0x7f, 0x70, 0x16, 0x3d, 0x3d, 0x34, + 0xf2, 0x34, 0xf2, 0xeb, 0xeb, 0xde, 0xde, 0xde, + 0xeb, 0x5a, 0xd3, 0xd2, 0xd9, 0xd9, 0xd6, 0xd0, + 0xc4, 0xc4, 0xd3, 0xd3, 0xd2, 0xc4, 0xd1, 0xd2, + 0xec, 0xfd, 0xd6, 0xcb, 0xd8, 0xfa, 0xea, 0xe0, + 0xd8, 0xde, 0xf2, 0x15, 0xfa, 0x66, 0x33, 0xe, + 0x30, 0x27, 0x46, 0x37, 0x82, 0x98, 0x1f, 0xf3, + 0x1e, 0x8d, 0x68, 0x9f, 0x1f, 0x46, 0x5e, 0x9e, + 0x79, 0x1f, 0x1f, 0x28, 0x86, 0x79, 0x5e, 0xfc, + 0x46, 0x8d, 0x4e, 0x5e, 0x8d, 0x30, 0x5e, 0x86, + 0x79, 0x5e, 0x86, 0x1e, 0x98, 0x4e, 0x4e, 0x75, + 0x98, 0x68, 0xa3, 0x68, 0x68, 0x5e, 0x5e, 0x68, + 0x68, 0x5e, 0x9e, 0x5e, 0x74, 0x6c, 0x5e, 0x8b, + 0x8f, 0x27, 0x62, 0x8b, 0x8f, 0x68, 0x32, 0x98, + 0x98, 0xa3, 0xa3, 0xa3, 0x98, 0xa3, 0x4e, 0xa3, + 0x98, 0x98, 0x8d, 0x98, 0x98, 0xa3, 0x4e, 0xa3, + 0x79, 0xa3, 0x0, 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, + 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x8d, 0x98, 0x98, + 0x79, 0x8d, 0x8d, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x68, + 0x28, 0x5e, 0x68, 0x68, 0x68, 0x68, 0x7, 0x9f, + 0xa2, 0xb6, 0xb8, 0xdd, 0xfc, 0x5e, 0x5e, 0x5e, + 0x9f, 0xfc, 0x9f, 0x9f, 0x68, 0x6c, 0xcd, 0xce, + 0xc8, 0xcc, 0xbf, 0xd3, 0xea, 0xf1, 0xd8, 0xde, + 0xee, 0xee, 0x14, 0x14, 0x14, 0x14, 0xe1, 0xe1, + 0xde, 0xd8, 0xe0, 0xf1, 0xfa, 0x15, 0x22, 0x15, + 0x3d, 0x16, 0xf5, 0xf2, 0xeb, 0x73, 0x3, 0xea, + 0xfe, 0x9a, 0x6a, 0x71, 0x6b, 0x59, 0x58, 0x5d, + 0x5d, 0x58, 0x5d, 0x3a, 0x41, 0x97, 0x6a, 0x5b, + 0x6a, 0x6f, 0x6a, 0x81, 0x71, 0x59, 0x31, 0x58, + 0x99, 0x80, 0x6f, 0x90, 0x7f, 0x99, 0x6a, 0x5d, + 0x5d, 0x58, 0x5d, 0x81, 0x81, 0x6b, 0x58, 0x31, + 0x90, 0x6f, 0x83, 0x80, 0x39, 0xfa, 0xf2, 0x70, + 0x34, 0x16, 0x3d, 0x17, 0x3d, 0x16, 0xf2, 0x3d, + 0xf2, 0xde, 0xeb, 0xeb, 0xde, 0xde, 0x54, 0x80, + 0x9a, 0x67, 0x42, 0x2e, 0x15, 0x15, 0x15, 0x17, + 0x34, 0xfa, 0x15, 0xfa, 0x15, 0xf2, 0x15, 0x3f, + 0xde, 0xde, 0xde, 0xeb, 0xeb, 0xde, 0xde, 0xde, + 0xd8, 0xe0, 0xcb, 0xd0, 0xd2, 0xd3, 0xd8, 0xd8, + 0xde, 0xc9, 0xd8, 0xde, 0xde, 0xe1, 0xf2, 0xf2, + 0x15, 0xe1, 0x14, 0x14, 0x16, 0xf2, 0x15, 0x17, + 0x17, 0x3d, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x14, + 0x14, 0x14, 0x16, 0x14, 0x16, 0x3d, 0x16, 0x16, + 0x3b, 0x3d, 0x14, 0x3d, 0x2b, 0x21, 0xee, 0x3d, + 0x34, 0x2a, 0x34, 0x15, 0x42, 0x66, 0x9a, 0x85, + 0x6b, 0x5d, 0x6f, 0x6f, 0x6b, 0x71, 0x58, 0x3a, + 0x5d, 0x81, 0x71, 0x80, 0x71, 0x71, 0x80, 0x66, + 0x71, 0x71, 0x59, 0x71, 0x6b, 0x81, 0x58, 0x3f, + 0x3d, 0x3d, 0x34, 0x3d, 0x16, 0x3d, 0xf2, 0xeb, + 0x48, 0x70, 0x73, 0x1, 0x48, 0x34, 0xfa, 0xe1, + 0xf2, 0xd7, 0xd2, 0xd3, 0xd3, 0xd6, 0xd6, 0xd2, + 0xc4, 0xd1, 0xd2, 0xd3, 0xdb, 0xd1, 0xd1, 0xd2, + 0xe5, 0xf9, 0xcb, 0xd8, 0xeb, 0xf1, 0xf9, 0xe5, + 0x5a, 0x6e, 0xfa, 0x15, 0x2b, 0x26, 0x6a, 0xaa, + 0xaa, 0x7e, 0x5f, 0xf3, 0xaa, 0x8f, 0x8d, 0x37, + 0x98, 0x8b, 0x8d, 0x68, 0x98, 0x98, 0x68, 0x5e, + 0xa8, 0x7d, 0x79, 0x5e, 0x8d, 0x98, 0x86, 0x68, + 0x98, 0x98, 0x86, 0x68, 0x98, 0x98, 0x86, 0x5e, + 0x9c, 0x82, 0x68, 0x68, 0x8b, 0x8d, 0x68, 0x4e, + 0x8b, 0x79, 0x68, 0x68, 0x79, 0x68, 0x4e, 0x68, + 0x8f, 0x9f, 0x68, 0x68, 0x8b, 0x86, 0x5e, 0x8b, + 0x8f, 0x8f, 0x8b, 0x8f, 0xab, 0x9c, 0x9e, 0x98, + 0x8b, 0x68, 0x4e, 0x79, 0x98, 0xa3, 0x4e, 0x79, + 0x98, 0xa3, 0x4e, 0x98, 0x98, 0x5e, 0x4e, 0x68, + 0x8d, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x8d, 0x68, + 0x68, 0xa3, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x4e, + 0x37, 0x93, 0x9c, 0xb6, 0x5e, 0x46, 0x55, 0x37, + 0x5e, 0x8b, 0x93, 0x1f, 0x82, 0x8b, 0x93, 0x32, + 0x82, 0x62, 0x2f, 0xb7, 0xa7, 0x8f, 0xaa, 0x55, + 0x55, 0x6a, 0xaf, 0xa, 0x34, 0xfa, 0xd8, 0xeb, + 0x16, 0x14, 0x14, 0xf2, 0xf2, 0x14, 0x16, 0xee, + 0xee, 0xfa, 0xed, 0xe0, 0xf1, 0x22, 0x23, 0xeb, + 0x16, 0x3d, 0x3b, 0x16, 0x3d, 0x3d, 0x34, 0x73, + 0x48, 0x48, 0x80, 0x9a, 0x71, 0x59, 0x58, 0x9a, + 0x9a, 0x71, 0x6b, 0x58, 0x63, 0x58, 0x6b, 0x6f, + 0x9a, 0x99, 0x6b, 0x85, 0x85, 0x71, 0x5d, 0x80, + 0x63, 0x71, 0x6b, 0x71, 0x58, 0x58, 0x6b, 0x6b, + 0x6b, 0x71, 0x6b, 0x6f, 0x85, 0x9a, 0x71, 0x58, + 0x59, 0x58, 0x71, 0x71, 0x4d, 0x48, 0x3b, 0x3d, + 0x16, 0x16, 0x14, 0x16, 0x3d, 0xf2, 0x3d, 0x3f, + 0x3b, 0xf5, 0x15, 0x15, 0x15, 0x3d, 0xf2, 0x48, + 0x54, 0x73, 0x34, 0xeb, 0x15, 0x17, 0x21, 0x1d, + 0x1d, 0x21, 0x21, 0x23, 0xfa, 0xf2, 0xf2, 0x15, + 0x15, 0xeb, 0xeb, 0xde, 0xeb, 0x15, 0xfa, 0x67, + 0x41, 0xb4, 0xd0, 0xc9, 0xd6, 0xe0, 0xd7, 0xeb, + 0xd8, 0xde, 0xde, 0xde, 0xeb, 0xde, 0x15, 0x21, + 0x21, 0x3d, 0xf2, 0x16, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xf2, 0xf2, 0xf5, 0x16, 0x18, 0x14, + 0x16, 0x18, 0x3d, 0x16, 0x14, 0x14, 0x16, 0x16, + 0x3d, 0x14, 0x3d, 0x16, 0x99, 0x99, 0x48, 0x3f, + 0x1a, 0x36, 0x34, 0x70, 0x7f, 0x7f, 0x54, 0x85, + 0x81, 0x81, 0x81, 0x6b, 0x81, 0x81, 0x6b, 0x6a, + 0x6a, 0x6b, 0x99, 0x7f, 0x6b, 0x85, 0x99, 0x99, + 0x5d, 0x95, 0x6b, 0x81, 0x71, 0x31, 0x7f, 0x70, + 0x3d, 0x16, 0x16, 0x3d, 0x16, 0x3d, 0xf2, 0x2b, + 0x99, 0x90, 0x6e, 0xcb, 0xf9, 0xf1, 0xeb, 0xde, + 0x15, 0xd7, 0xd7, 0xd9, 0xd9, 0xd2, 0xdb, 0xd2, + 0xe2, 0xce, 0xc2, 0xc4, 0xd2, 0xd3, 0xd3, 0xd2, + 0xd2, 0xd0, 0xcb, 0xd8, 0xeb, 0x7f, 0x3e, 0xa6, + 0x50, 0x20, 0x6e, 0x73, 0x48, 0x36, 0x4a, 0x50, + 0xc8, 0x37, 0x6c, 0xe, 0x12, 0x8d, 0x5e, 0x68, + 0x5e, 0x28, 0x68, 0x86, 0x32, 0x5e, 0x68, 0xf7, + 0xa7, 0x5e, 0x68, 0x68, 0x28, 0x1e, 0x68, 0x5e, + 0x68, 0x68, 0x68, 0x68, 0x9f, 0x5e, 0x4e, 0x86, + 0xfc, 0x68, 0x4e, 0x68, 0x68, 0x68, 0x5e, 0x4e, + 0x68, 0x4e, 0x4e, 0x68, 0xa3, 0xa3, 0x4e, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x9f, 0x7, + 0xb8, 0xd3, 0x9f, 0x1e, 0x30, 0x9f, 0xa3, 0xa3, + 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x0, 0x4e, 0xa3, + 0x4e, 0x4e, 0x4e, 0x4e, 0x79, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x4e, 0x0, 0xa3, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0xb8, 0x82, 0x98, + 0x82, 0x79, 0x8d, 0x4e, 0x0, 0x4e, 0x4e, 0x0, + 0x0, 0x0, 0x4e, + 0x5e, 0x7d, 0x76, 0xf7, 0x82, 0x8d, 0x93, 0x5e, + 0x8d, 0x98, 0x93, 0x5e, 0x82, 0x93, 0x76, 0xb8, + 0x5f, 0x8f, 0x98, 0x28, 0x93, 0x8b, 0x76, 0x76, + 0x9c, 0x6a, 0xaf, 0xe6, 0xd8, 0xeb, 0xeb, 0xee, + 0x14, 0x14, 0xf2, 0x16, 0x16, 0x17, 0xf5, 0xf2, + 0xeb, 0x23, 0xf1, 0xd7, 0xde, 0xde, 0xeb, 0xe1, + 0xee, 0x34, 0x7f, 0x54, 0x15, 0x3b, 0x3d, 0x3d, + 0x2b, 0x34, 0x70, 0x48, 0x54, 0x80, 0x85, 0x99, + 0x63, 0x71, 0x6b, 0x81, 0x6b, 0x81, 0x5d, 0x6a, + 0x99, 0x80, 0x5d, 0x9a, 0x54, 0x99, 0x6a, 0x5d, + 0x90, 0x5d, 0x6a, 0x81, 0x81, 0x6b, 0x6f, 0x71, + 0x85, 0x85, 0x6a, 0x71, 0x58, 0x71, 0x81, 0x6b, + 0x59, 0x58, 0x58, 0x71, 0x85, 0x7f, 0x48, 0x3b, + 0x16, 0x17, 0x3d, 0x16, 0x16, 0x16, 0x3d, 0x73, + 0x34, 0x34, 0x34, 0x48, 0xfa, 0x15, 0xf2, 0x34, + 0xf2, 0xee, 0xee, 0x15, 0x21, 0x21, 0x2e, 0x1a, + 0x42, 0x3f, 0x22, 0x1d, 0x3f, 0xeb, 0x15, 0xeb, + 0xf2, 0xf2, 0xf2, 0xee, 0xee, 0xf2, 0xeb, 0x26, + 0xe3, 0xd2, 0xd4, 0xe0, 0xd7, 0xd7, 0xd8, 0xcb, + 0xde, 0xde, 0xe1, 0x2a, 0xea, 0xde, 0xeb, 0x3f, + 0xfa, 0xd8, 0xeb, 0xf5, 0x16, 0x16, 0x14, 0x14, + 0x17, 0x16, 0x16, 0x14, 0xee, 0xff, 0x14, 0x14, + 0x16, 0x3d, 0x16, 0x17, 0x16, 0x14, 0x14, 0x3d, + 0x3d, 0x3d, 0x3d, 0x15, 0x73, 0xea, 0x6e, 0x26, + 0x3a, 0x3a, 0x66, 0x41, 0x5d, 0x58, 0x4d, 0x6f, + 0x91, 0x91, 0x81, 0x5d, 0x58, 0x6a, 0x83, 0x6f, + 0x6a, 0x4a, 0x90, 0x90, 0x6a, 0x6a, 0x26, 0x9a, + 0x5d, 0x6a, 0x6f, 0x90, 0x26, 0x39, 0x73, 0x34, + 0x34, 0x15, 0x3d, 0xeb, 0x15, 0x34, 0x34, 0x1, + 0x73, 0xcb, 0xcb, 0xe0, 0xd7, 0xd7, 0xd7, 0xd6, + 0xd6, 0xd9, 0xe0, 0xd6, 0xd4, 0xce, 0xce, 0xc2, + 0xd1, 0xc7, 0xc4, 0xc4, 0xd2, 0xd3, 0xd9, 0xd0, + 0xd1, 0xcc, 0xd0, 0xe6, 0xf1, 0xfd, 0x10, 0xf3, + 0xcc, 0xd9, 0xcb, 0xd8, 0xfa, 0xfe, 0x58, 0x27, + 0xe, 0x5e, 0x86, 0x5e, 0x1f, 0x1e, 0x5e, 0x68, + 0x7, 0xfc, 0x28, 0x68, 0x9f, 0x5e, 0x5e, 0x37, + 0x5e, 0x32, 0x86, 0x5e, 0x5e, 0x37, 0x68, 0x9e, + 0x9f, 0x28, 0x28, 0x68, 0x5e, 0xa3, 0x68, 0x4e, + 0x5e, 0xa3, 0x68, 0xa3, 0x68, 0x68, 0x68, 0x86, + 0x4e, 0x68, 0x68, 0x9e, 0x5e, 0x4e, 0x4e, 0xa3, + 0x68, 0x68, 0xa3, 0xa3, 0xa3, 0x9f, 0x8, 0x7, + 0xd0, 0xd0, 0x7, 0x46, 0x98, 0x68, 0x4e, 0xa3, + 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0xa3, 0xa3, 0xa3, + 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, + 0x4e, 0x4e, 0x98, 0x4e, 0x0, 0x68, 0x98, 0x98, + 0x8d, 0x8d, 0x8d, 0x0, 0x4e, 0x0, 0x79, 0x4e, + 0x4e, 0x0, 0x68, + 0x5e, 0x86, 0x5e, 0xfc, 0x5e, 0x68, 0x68, 0xa3, + 0x68, 0xfc, 0x5e, 0x9f, 0x9f, 0x5e, 0x28, 0xf7, + 0x6c, 0x76, 0x86, 0xfc, 0x1f, 0x37, 0x5e, 0x9f, + 0x7, 0xbb, 0xe5, 0xcb, 0x73, 0xa, 0xd8, 0xe1, + 0x16, 0xf2, 0xff, 0x14, 0xee, 0xee, 0xe1, 0xd7, + 0xd6, 0xde, 0xd7, 0xd8, 0xde, 0xeb, 0xf5, 0xee, + 0x16, 0x3d, 0xa, 0xd8, 0xeb, 0xf2, 0x15, 0xee, + 0x34, 0x34, 0xfa, 0x3b, 0x3d, 0x7f, 0x90, 0x99, + 0x7f, 0x3a, 0x6a, 0x6a, 0x6f, 0x58, 0x58, 0x4a, + 0x66, 0x6f, 0x4a, 0x20, 0x67, 0x4d, 0x5d, 0xb0, + 0x99, 0x58, 0x6a, 0x6a, 0x83, 0x6f, 0x4a, 0x58, + 0x90, 0x5d, 0x6a, 0x5d, 0x71, 0x5d, 0x91, 0x6a, + 0x9a, 0x3a, 0x58, 0x71, 0x80, 0x99, 0x99, 0x1d, + 0x1d, 0x3f, 0x1d, 0x17, 0x3d, 0x14, 0x3d, 0x3d, + 0x15, 0xee, 0xf2, 0xf5, 0xd8, 0xf2, 0x34, 0xfa, + 0xf2, 0xf2, 0x3d, 0x3b, 0x15, 0x3d, 0x3b, 0x22, + 0x70, 0x15, 0x15, 0x3f, 0xfa, 0x2a, 0xfa, 0x23, + 0x15, 0xf2, 0xf2, 0x16, 0xee, 0xee, 0x15, 0xf9, + 0xb, 0xd1, 0xd3, 0xd6, 0xde, 0xd7, 0xd8, 0xd7, + 0xf1, 0xe1, 0xfa, 0x2a, 0xeb, 0xeb, 0xf2, 0xeb, + 0xd8, 0xd8, 0xeb, 0x73, 0xfa, 0xf5, 0x17, 0x17, + 0x15, 0xf5, 0x16, 0x14, 0x14, 0x14, 0x14, 0x14, + 0xf5, 0xee, 0x14, 0xeb, 0x2a, 0x16, 0x16, 0x3d, + 0x48, 0x16, 0x3d, 0x16, 0x15, 0xeb, 0x2a, 0xfd, + 0x4a, 0x4a, 0x9d, 0x47, 0x55, 0x6a, 0x5d, 0x6a, + 0x6a, 0x6a, 0x85, 0x63, 0x5d, 0x6b, 0x90, 0xb0, + 0x6a, 0x5d, 0x5d, 0x47, 0x6a, 0x5b, 0x58, 0x63, + 0x71, 0x71, 0x71, 0x99, 0x48, 0x70, 0x1, 0xeb, + 0xeb, 0xf2, 0x3d, 0x15, 0x70, 0x70, 0x34, 0x15, + 0xee, 0xeb, 0xeb, 0xe1, 0xde, 0xd8, 0xd7, 0xd6, + 0xd3, 0xd9, 0xd9, 0xd3, 0xdb, 0xc7, 0xc2, 0xd2, + 0xc4, 0xd2, 0xc4, 0xd2, 0xd2, 0xd3, 0xdb, 0xe5, + 0xbf, 0x5, 0x5a, 0xcb, 0xa, 0xf9, 0x5, 0xbf, + 0xd2, 0xcb, 0xd8, 0xde, 0xfa, 0xfe, 0x5d, 0x55, + 0x74, 0x7d, 0x82, 0x28, 0xa7, 0x9c, 0x82, 0x5e, + 0xa7, 0x76, 0x32, 0x4e, 0x1e, 0x79, 0x5e, 0x5e, + 0x8d, 0x76, 0x5e, 0x4e, 0x8d, 0x76, 0x4e, 0x5e, + 0x37, 0x8d, 0x5e, 0x68, 0x8d, 0x5e, 0xa3, 0x5e, + 0x8d, 0x8d, 0x68, 0x68, 0x79, 0x82, 0x68, 0x68, + 0x8d, 0x68, 0x4e, 0x68, 0x68, 0x86, 0x4e, 0x75, + 0x79, 0x68, 0xa3, 0x68, 0x98, 0x6c, 0x9f, 0x8b, + 0x89, 0x26, 0x98, 0x8b, 0x8f, 0x98, 0x4e, 0x98, + 0x98, 0xa3, 0xa3, 0xa3, 0x98, 0x4e, 0x4e, 0x98, + 0x79, 0xa3, 0x4e, 0x98, 0x98, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, + 0x4e, 0x4e, 0xa3, 0x4e, 0xa3, 0x98, 0x8d, 0x8d, + 0x4e, 0x8d, 0x75, 0x4e, 0x0, 0x4e, 0x4e, 0x68, + 0x0, 0x0, 0x68, + 0x9f, 0x68, 0x68, 0x28, 0x68, 0x68, 0x68, 0x5e, + 0x9f, 0x1f, 0x5e, 0x7, 0x9f, 0x9f, 0x28, 0x32, + 0x79, 0x5e, 0x5e, 0x6c, 0xe, 0xa7, 0x7, 0xbd, + 0xcd, 0xe3, 0x5a, 0xe0, 0xcb, 0x6e, 0x5a, 0xf2, + 0xee, 0x14, 0x16, 0xff, 0x14, 0x14, 0xe1, 0xd7, + 0xd6, 0xd7, 0xd7, 0xe6, 0xd7, 0xf1, 0x23, 0x17, + 0xeb, 0x15, 0x15, 0xee, 0x16, 0x16, 0x3d, 0xeb, + 0xeb, 0x73, 0xd8, 0x34, 0x34, 0x67, 0x90, 0x4d, + 0x67, 0x9a, 0x90, 0x41, 0x99, 0x3a, 0x58, 0x90, + 0x90, 0x83, 0x4a, 0x5d, 0x71, 0x71, 0x5d, 0x58, + 0x7f, 0x99, 0x6f, 0x97, 0x7f, 0x90, 0x85, 0x58, + 0x71, 0x6b, 0x6a, 0x81, 0x6b, 0x71, 0x6a, 0x85, + 0x67, 0x99, 0x31, 0x58, 0x9a, 0x63, 0x58, 0x59, + 0x4d, 0x36, 0x80, 0x21, 0x3f, 0x3d, 0x3d, 0x16, + 0xee, 0xf2, 0x16, 0xee, 0xf2, 0xe1, 0xf2, 0x73, + 0xee, 0xf2, 0xf2, 0x73, 0xee, 0x3d, 0x16, 0x15, + 0x3d, 0x3d, 0x3b, 0x1d, 0x23, 0xfa, 0x23, 0x1a, + 0x1d, 0x3b, 0x15, 0xf2, 0x14, 0xee, 0x16, 0x34, + 0xed, 0xd0, 0xd3, 0xcb, 0xcb, 0xd8, 0xde, 0xe6, + 0xfa, 0xd8, 0xeb, 0x15, 0x15, 0xf2, 0x15, 0x15, + 0xeb, 0xe1, 0xf2, 0x34, 0xfa, 0xee, 0x14, 0xff, + 0x16, 0x16, 0xee, 0x14, 0x14, 0xff, 0x14, 0x14, + 0xff, 0x14, 0x16, 0x16, 0xf5, 0x34, 0x3d, 0x17, + 0x34, 0x15, 0x3d, 0x70, 0x1d, 0x1d, 0x42, 0x58, + 0x6b, 0x90, 0x41, 0x6f, 0x6a, 0x6a, 0x6a, 0x81, + 0x6a, 0x85, 0x9a, 0x66, 0x6f, 0x6a, 0x85, 0x58, + 0x81, 0x6b, 0x6b, 0x5d, 0x58, 0x58, 0x71, 0x9a, + 0x9a, 0x58, 0x63, 0x7f, 0x7f, 0x3b, 0x16, 0x3d, + 0x16, 0x16, 0x3d, 0x3d, 0x34, 0x73, 0x1, 0x34, + 0xa, 0x34, 0xf2, 0xeb, 0xd8, 0xe0, 0xd8, 0xd7, + 0xd6, 0xd3, 0xd2, 0xd2, 0xd2, 0xd2, 0xd1, 0xc4, + 0xc4, 0xc4, 0xd3, 0xd3, 0xd3, 0xc4, 0xe2, 0xd4, + 0xd6, 0xcb, 0xcb, 0xd8, 0xa, 0x23, 0x20, 0xa5, + 0xbf, 0x5a, 0x73, 0xeb, 0x15, 0x42, 0x90, 0x40, + 0x6a, 0x52, 0x5f, 0x5e, 0x9c, 0x9c, 0x1f, 0x37, + 0x46, 0x8f, 0x8d, 0x5e, 0x30, 0x8b, 0x8d, 0x68, + 0x9c, 0xaa, 0x2f, 0x8d, 0x82, 0x8b, 0x8d, 0xfc, + 0x8b, 0x8b, 0x8d, 0x4e, 0x8b, 0x46, 0x86, 0x68, + 0x98, 0x68, 0x28, 0x1e, 0x8b, 0x98, 0x4e, 0x75, + 0x98, 0x79, 0xa3, 0x68, 0x79, 0x68, 0x68, 0x4e, + 0x8d, 0x5e, 0x86, 0x68, 0x8b, 0x98, 0x5e, 0x8b, + 0x8f, 0x31, 0x93, 0x8b, 0x8b, 0x93, 0x9f, 0x98, + 0x98, 0xa3, 0x4e, 0xa3, 0x98, 0xa3, 0x4e, 0x79, + 0x98, 0x79, 0x8d, 0x8d, 0x8d, 0x4e, 0x4e, 0xa3, + 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x98, 0x93, 0x7, 0x8, 0x76, 0x7d, 0x28, + 0x76, 0x98, 0x98, 0x5e, 0x28, 0x98, 0x98, 0x68, + 0xa7, 0x74, 0x8f, 0xa7, 0xc, 0x74, 0x74, 0xc, + 0xa6, 0x83, 0x99, 0xd8, 0x73, 0x54, 0x2a, 0x34, + 0x16, 0x16, 0x14, 0xff, 0x14, 0x16, 0xee, 0x16, + 0xde, 0xd8, 0xd9, 0xd6, 0xd6, 0xd6, 0xed, 0xe6, + 0xde, 0xf5, 0xfa, 0xfa, 0x17, 0x15, 0x15, 0x15, + 0xf2, 0xee, 0xeb, 0x3d, 0x3d, 0x70, 0x7f, 0x99, + 0x99, 0x99, 0x58, 0x59, 0x59, 0x71, 0x71, 0x80, + 0x70, 0x42, 0x99, 0x9a, 0x9a, 0x71, 0x6b, 0x71, + 0x59, 0x58, 0x71, 0x63, 0x59, 0x71, 0x6b, 0x9a, + 0x99, 0x5d, 0x63, 0x71, 0x71, 0x99, 0x9a, 0x59, + 0x71, 0x6b, 0x6b, 0x71, 0x59, 0x58, 0x6b, 0x71, + 0x7f, 0x42, 0x1d, 0x3f, 0x3d, 0x3d, 0x15, 0xee, + 0x17, 0x15, 0x3d, 0x16, 0x15, 0x3d, 0xf2, 0x3d, + 0x3d, 0x16, 0xee, 0x16, 0x16, 0x34, 0x2b, 0x15, + 0x3d, 0xee, 0x15, 0x54, 0x15, 0x15, 0x15, 0x34, + 0x1, 0x73, 0x15, 0xf2, 0xf2, 0x16, 0xeb, 0x23, + 0xfd, 0xfd, 0x26, 0xa, 0x73, 0xeb, 0xeb, 0x1, + 0xeb, 0xeb, 0xeb, 0xeb, 0xfa, 0x23, 0x42, 0x66, + 0x7f, 0x15, 0xf2, 0xf2, 0x16, 0x16, 0x14, 0xff, + 0x14, 0xff, 0x14, 0x14, 0x14, 0xff, 0x18, 0x3d, + 0x16, 0x3d, 0x16, 0x14, 0x16, 0x3d, 0x14, 0x16, + 0x16, 0x3b, 0x48, 0x9a, 0x1b, 0x3a, 0x58, 0x6b, + 0x81, 0x6f, 0x80, 0x26, 0x20, 0x6a, 0x81, 0x6a, + 0x5d, 0x4d, 0x71, 0x81, 0x81, 0x81, 0x31, 0x5d, + 0x6a, 0x81, 0x71, 0x80, 0x99, 0x85, 0x6b, 0x71, + 0x71, 0x59, 0x4d, 0x42, 0x7f, 0x48, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0xf2, 0xeb, 0xf2, 0xf2, 0xa, + 0xcb, 0x5a, 0x54, 0xe6, 0xd6, 0xd2, 0xd3, 0xde, + 0xd6, 0xd3, 0xd2, 0xc4, 0xc4, 0xd1, 0xcc, 0xbe, + 0xc4, 0xd2, 0xd3, 0xd6, 0xd6, 0xd2, 0xc4, 0xd2, + 0xd6, 0xcb, 0xde, 0xde, 0xa, 0x23, 0xfe, 0xe9, + 0x50, 0xbf, 0xcb, 0xeb, 0x34, 0x6e, 0x41, 0x6f, + 0xf8, 0x60, 0x28, 0x5e, 0x5e, 0x8d, 0x5e, 0x1f, + 0x8d, 0x79, 0x68, 0x68, 0x37, 0xa7, 0x6c, 0x68, + 0x28, 0x28, 0x1e, 0x68, 0x68, 0x68, 0x4e, 0x68, + 0x28, 0x68, 0x68, 0x4e, 0x68, 0x28, 0x68, 0x4e, + 0x68, 0x68, 0xa2, 0x75, 0x4e, 0x68, 0x4e, 0xa3, + 0xa3, 0x68, 0x4e, 0x4e, 0x4e, 0x9e, 0x5e, 0x4e, + 0x68, 0xa3, 0x4e, 0xa3, 0xa3, 0x9e, 0x4e, 0x9e, + 0x32, 0x26, 0xd3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x4e, + 0x4e, 0x0, 0x0, 0x0, 0xa3, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x5e, 0x79, + 0x4e, 0x4e, 0x75, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xf3, 0x30, 0x8d, 0x6c, 0x28, 0x7d, 0x38, 0x5e, + 0x68, 0x8d, 0x8d, 0x1e, 0x2f, 0x9c, 0x82, 0x8, + 0xba, 0x60, 0x46, 0x9f, 0x76, 0x89, 0x27, 0x27, + 0x60, 0x83, 0xb4, 0x73, 0xeb, 0xeb, 0xeb, 0xeb, + 0xe1, 0xee, 0x16, 0x16, 0xf5, 0xf5, 0xf2, 0xeb, + 0xe6, 0xd6, 0xc4, 0xd2, 0xd6, 0xd7, 0xd7, 0xd7, + 0xd7, 0xe6, 0xf1, 0x23, 0x21, 0x26, 0x54, 0x34, + 0x3d, 0x16, 0x3d, 0x16, 0x16, 0x16, 0x3d, 0x54, + 0x99, 0x9a, 0x6b, 0x6b, 0x81, 0x6b, 0x6b, 0x5d, + 0x67, 0x1d, 0x70, 0x42, 0x9a, 0x5d, 0x81, 0x71, + 0x6b, 0x81, 0x5d, 0x5d, 0x58, 0x5d, 0x6a, 0x58, + 0x67, 0x99, 0x6f, 0x9a, 0x85, 0x6f, 0x5d, 0x71, + 0x81, 0x6a, 0x6a, 0x6b, 0x58, 0x5d, 0x5d, 0x9a, + 0x63, 0x9a, 0x9a, 0x67, 0x3f, 0x21, 0xfa, 0x3b, + 0x17, 0x3b, 0x34, 0x3d, 0x16, 0xf2, 0xf2, 0x3d, + 0xee, 0x15, 0xf2, 0x16, 0x16, 0x16, 0xf2, 0xf2, + 0xf2, 0x3d, 0x15, 0x15, 0xf2, 0x3d, 0x3d, 0xf2, + 0xf2, 0xf2, 0xe1, 0xf2, 0x16, 0xf2, 0xde, 0xf1, + 0xfd, 0xe5, 0xd0, 0xd3, 0xd7, 0xe1, 0x15, 0xeb, + 0x15, 0xeb, 0xeb, 0x15, 0xeb, 0xa, 0x6e, 0x4, + 0xcb, 0xeb, 0xeb, 0xe1, 0xee, 0x14, 0x16, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x3d, 0x14, + 0x3d, 0x14, 0x16, 0xf5, 0x16, 0x3d, 0x17, 0x15, + 0x15, 0x3b, 0x39, 0x58, 0x6a, 0x6a, 0x6a, 0x7e, + 0x83, 0x6a, 0x90, 0x90, 0x5d, 0x6a, 0x7e, 0x33, + 0x6a, 0x5d, 0x71, 0x5d, 0x83, 0x83, 0x5d, 0x90, + 0xb0, 0x6a, 0x6a, 0x83, 0x4a, 0x5d, 0x6b, 0x6a, + 0x90, 0x99, 0x73, 0xfa, 0xd8, 0xeb, 0x3d, 0x16, + 0xeb, 0xf2, 0xfa, 0x23, 0x26, 0x54, 0x34, 0xeb, + 0xd8, 0xd7, 0xde, 0xd7, 0xd6, 0xd3, 0xd3, 0xd6, + 0xd3, 0xd9, 0xe7, 0xe2, 0xce, 0xbe, 0xce, 0xd1, + 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd3, 0xd2, 0xdb, + 0xd0, 0xd3, 0xe6, 0xe6, 0xfa, 0xe6, 0x5a, 0x50, + 0xc7, 0xbf, 0xd6, 0xd8, 0xe6, 0x23, 0xfd, 0xf8, + 0x43, 0x28, 0x5e, 0x5e, 0x5e, 0x68, 0x4e, 0x5e, + 0x5e, 0x7, 0x7, 0x68, 0x86, 0x5e, 0x68, 0x9f, + 0x5e, 0x68, 0x68, 0x68, 0x68, 0x68, 0x5e, 0x4e, + 0x68, 0x9f, 0x9f, 0xa3, 0x68, 0x75, 0x4e, 0x9e, + 0x5e, 0x68, 0xa3, 0x4e, 0x75, 0xa3, 0x9f, 0xa3, + 0xa3, 0x4e, 0xa3, 0xa3, 0x68, 0x4e, 0x4e, 0x4e, + 0x4e, 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, 0x9f, 0x9f, + 0x86, 0x9f, 0x9f, 0xfc, 0x68, 0xa3, 0x4e, 0x4e, + 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x4e, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x98, 0x4e, + 0x4e, 0x4e, 0x93, 0x4e, 0x4e, 0xa3, 0x79, 0x75, + 0x75, 0x79, 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x4e, + 0xf7, 0x1f, 0x5e, 0xa3, 0x5e, 0x86, 0x68, 0x68, + 0x4e, 0x5e, 0x86, 0x5e, 0xa0, 0xb8, 0x5e, 0x9f, + 0xdd, 0x37, 0x75, 0x68, 0x68, 0x5e, 0x28, 0x37, + 0xb9, 0x50, 0xb4, 0xe6, 0xe6, 0xd8, 0xe1, 0xee, + 0xf2, 0xee, 0xee, 0x16, 0xf2, 0xeb, 0xd8, 0xe6, + 0xd7, 0xd6, 0xd3, 0xd3, 0xd3, 0xd6, 0xd7, 0xe6, + 0xe0, 0xd6, 0xd8, 0xfa, 0xea, 0x9, 0x3, 0xe6, + 0x15, 0xf2, 0x16, 0x16, 0x3b, 0x16, 0x34, 0xf2, + 0x42, 0x85, 0x6f, 0x5d, 0x6a, 0x6a, 0x83, 0x6f, + 0x63, 0x99, 0x99, 0x42, 0x56, 0x81, 0x6a, 0x6f, + 0x6a, 0x6a, 0xb0, 0x90, 0x6f, 0x83, 0xaf, 0x83, + 0x85, 0x6f, 0x97, 0x6f, 0x63, 0x5d, 0x6a, 0x81, + 0x6b, 0x6a, 0x6a, 0x5d, 0x5d, 0x90, 0xb0, 0x58, + 0x71, 0x5d, 0x6a, 0x6f, 0x4d, 0x42, 0x48, 0x70, + 0x3f, 0x34, 0x15, 0x16, 0x16, 0xf2, 0xde, 0xe1, + 0xf2, 0x3b, 0xee, 0x16, 0x16, 0x16, 0x16, 0xee, + 0x16, 0xee, 0xee, 0xee, 0xee, 0xf2, 0xf2, 0xf2, + 0x15, 0x21, 0x15, 0xee, 0xf2, 0xf2, 0xe1, 0xd8, + 0xdb, 0xd4, 0xd2, 0xd3, 0xd7, 0xd8, 0xeb, 0xeb, + 0x15, 0xee, 0x3d, 0xf2, 0xf2, 0xf5, 0xeb, 0xe6, + 0xd8, 0xeb, 0xe1, 0xe1, 0xee, 0x16, 0x16, 0x16, + 0x16, 0x17, 0x14, 0x14, 0x16, 0x16, 0x14, 0x16, + 0x16, 0x16, 0x3d, 0xeb, 0xf2, 0x15, 0x3f, 0x1d, + 0x70, 0x3f, 0x42, 0x3a, 0x72, 0x90, 0x6a, 0x6a, + 0x6f, 0x5d, 0x6b, 0x6a, 0x6a, 0x5b, 0x7e, 0x6a, + 0x8e, 0x6b, 0x58, 0x90, 0x41, 0x63, 0x71, 0x6f, + 0x20, 0x58, 0x5d, 0x6a, 0x6a, 0x6b, 0x71, 0x31, + 0x99, 0x73, 0x16, 0x16, 0xee, 0x16, 0x16, 0x15, + 0xe1, 0xf2, 0x48, 0x41, 0x97, 0x99, 0x2a, 0x34, + 0xde, 0xeb, 0xde, 0xd7, 0xd7, 0xd7, 0xd6, 0xd3, + 0xd2, 0xd2, 0xe7, 0xf0, 0xbe, 0xc7, 0xc2, 0xd2, + 0xd9, 0xd3, 0xc4, 0xc4, 0xd3, 0xd6, 0xed, 0xe5, + 0xbf, 0xcb, 0xcb, 0xf1, 0xfa, 0x6e, 0x5a, 0xa1, + 0xbf, 0xd6, 0xd8, 0xde, 0x73, 0x73, 0xfd, 0x58, + 0x2f, 0x7d, 0x76, 0x28, 0xe, 0x5f, 0x6c, 0x86, + 0x5e, 0x2f, 0xfc, 0x68, 0x68, 0x8d, 0x5e, 0xfc, + 0x46, 0x79, 0x28, 0x5e, 0x28, 0xe, 0x86, 0x68, + 0x79, 0x79, 0xfc, 0xfc, 0x79, 0x8d, 0x68, 0x68, + 0x1e, 0x5e, 0x5e, 0x5e, 0x86, 0x28, 0x28, 0x68, + 0x79, 0x68, 0xa3, 0x68, 0x68, 0x68, 0x4e, 0x75, + 0x32, 0x75, 0xa3, 0xa3, 0x98, 0x68, 0x9f, 0x93, + 0x8f, 0x8f, 0x8b, 0x8b, 0x8b, 0x98, 0xa3, 0xa3, + 0x98, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0x98, + 0x8d, 0xa3, 0x0, 0x4e, 0x8d, 0x4e, 0x4e, 0x4e, + 0x8d, 0x4e, 0x0, 0x8d, 0x4e, 0x4e, 0xa3, 0xa3, + 0x4e, 0x4e, 0x8d, 0x4e, 0x4e, 0x4e, 0x75, 0x4e, + 0x4e, 0x68, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x68, 0x5e, 0x86, 0x68, 0x5e, 0x68, 0xa3, + 0xb6, 0x7, 0x9f, 0x9f, 0x9f, 0x28, 0x28, 0x9e, + 0x68, 0x5e, 0x5e, 0x9f, 0x9f, 0x7, 0x6c, 0x7, + 0xbe, 0xbf, 0xd0, 0xd0, 0x3, 0xde, 0x15, 0xf2, + 0xf2, 0xee, 0x14, 0xee, 0xee, 0xee, 0xeb, 0xd7, + 0xd3, 0xd3, 0xd3, 0xd9, 0xd2, 0xd3, 0xd3, 0xed, + 0xe0, 0xd7, 0xde, 0xde, 0xeb, 0xde, 0xde, 0x1, + 0x73, 0x1, 0xf2, 0x3b, 0x1d, 0x1d, 0x34, 0x3b, + 0x70, 0x54, 0xb4, 0x99, 0x9a, 0x9a, 0x41, 0x6f, + 0x71, 0x5d, 0x6f, 0x31, 0x59, 0x6a, 0x6a, 0x6a, + 0x85, 0x90, 0x39, 0x7f, 0x58, 0x6f, 0x20, 0x99, + 0x5d, 0x6a, 0x47, 0x5d, 0x58, 0x71, 0x6f, 0x5d, + 0x71, 0x63, 0x41, 0xaf, 0x90, 0x5d, 0x4a, 0x31, + 0x58, 0x81, 0x6a, 0x81, 0x6b, 0x58, 0x66, 0x70, + 0x70, 0x48, 0x15, 0x16, 0x16, 0xeb, 0xde, 0xee, + 0x16, 0x21, 0x34, 0x16, 0x16, 0xee, 0xee, 0xee, + 0xee, 0x16, 0x16, 0x16, 0x16, 0xf2, 0x15, 0xf2, + 0xf2, 0xfa, 0x2b, 0xf2, 0xee, 0x16, 0xf2, 0xeb, + 0xf1, 0xb, 0x5a, 0xcb, 0xde, 0x15, 0x34, 0xeb, + 0x34, 0x15, 0x15, 0xee, 0xee, 0x16, 0xf2, 0xee, + 0xe1, 0xf2, 0x16, 0x16, 0x14, 0x14, 0x16, 0x16, + 0x14, 0x16, 0x16, 0x3d, 0x18, 0x16, 0x16, 0x16, + 0x14, 0x14, 0xf5, 0xf2, 0xf2, 0x3b, 0x1d, 0x99, + 0x99, 0x80, 0x59, 0x58, 0x58, 0x4c, 0x6b, 0x81, + 0x5d, 0x6f, 0x5d, 0x6a, 0x91, 0x6a, 0x81, 0x6a, + 0xb0, 0x97, 0x6f, 0x4d, 0x31, 0x63, 0x71, 0x6b, + 0x71, 0x59, 0x71, 0x71, 0x6a, 0x6b, 0x58, 0x42, + 0x3b, 0x3d, 0x3b, 0x15, 0x16, 0x16, 0x16, 0x3d, + 0x3d, 0xf2, 0x34, 0x7f, 0xb4, 0xe6, 0x73, 0xd8, + 0xde, 0xd8, 0xd8, 0xe0, 0xd6, 0xd6, 0xd9, 0xd4, + 0xc4, 0xd2, 0xd4, 0xd4, 0xd2, 0xbf, 0xd6, 0xd3, + 0xd9, 0xd9, 0xd3, 0xd1, 0xd2, 0xd9, 0xe0, 0xe7, + 0xb4, 0xcb, 0xe6, 0xfa, 0xde, 0xa, 0x3, 0x50, + 0xe9, 0x3, 0xe6, 0x34, 0x34, 0x34, 0xfa, 0x20, + 0x55, 0x8e, 0xa7, 0x28, 0x98, 0x62, 0x82, 0x68, + 0x98, 0x8f, 0x8d, 0x5e, 0x8d, 0x98, 0x32, 0x37, + 0x98, 0x8f, 0xb7, 0x76, 0x98, 0x8f, 0x5e, 0x86, + 0x8d, 0x8b, 0x8d, 0x8d, 0x98, 0x98, 0x68, 0x68, + 0x98, 0x8d, 0x9f, 0x68, 0x79, 0x8b, 0x68, 0x4e, + 0x8b, 0x68, 0x4e, 0x75, 0x8b, 0x68, 0xa3, 0x4e, + 0x8b, 0x4e, 0x68, 0x4e, 0x98, 0x68, 0xa3, 0x98, + 0x8f, 0x98, 0x8b, 0x8b, 0x8b, 0x98, 0xa3, 0xa3, + 0x98, 0xa3, 0x4e, 0x4e, 0x79, 0x4e, 0x0, 0x8d, + 0x98, 0x68, 0x0, 0xa3, 0x79, 0x4e, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x7d, 0x98, 0x1f, 0xe, 0x74, 0x98, 0x5e, + 0x6c, 0x5f, 0x82, 0x68, 0x28, 0x93, 0x46, 0x1f, + 0x9c, 0x9c, 0x9c, 0x37, 0x2c, 0x3e, 0x9c, 0x37, + 0x60, 0x5a, 0xea, 0x6e, 0x6e, 0xeb, 0xf2, 0x3d, + 0x16, 0xee, 0x16, 0x16, 0x14, 0x16, 0xeb, 0xcb, + 0x6, 0xd0, 0xd9, 0xe5, 0xc4, 0xc4, 0xd2, 0xd6, + 0xd7, 0xd6, 0xd7, 0xe6, 0xeb, 0xe1, 0xeb, 0xf2, + 0xf2, 0xf2, 0xf2, 0x17, 0x7f, 0x70, 0x3d, 0x34, + 0x34, 0x34, 0x23, 0x80, 0x6b, 0x71, 0x63, 0x80, + 0x71, 0x85, 0x7f, 0x67, 0x59, 0x63, 0x85, 0x58, + 0x6b, 0x59, 0x71, 0x58, 0x6b, 0x6b, 0x58, 0x80, + 0x59, 0x71, 0x6f, 0x9a, 0x58, 0x63, 0x99, 0x9a, + 0x6b, 0x71, 0x58, 0x59, 0x71, 0x71, 0x63, 0x99, + 0x58, 0x5d, 0x71, 0x85, 0x71, 0x71, 0x4c, 0x9a, + 0x59, 0x59, 0x48, 0x3b, 0x3f, 0x48, 0x3d, 0x3d, + 0x16, 0x3d, 0xf2, 0xf2, 0x16, 0x3d, 0xf2, 0xee, + 0xee, 0x16, 0xee, 0xee, 0xee, 0x3d, 0x16, 0xee, + 0xee, 0xee, 0xf2, 0xee, 0x16, 0x15, 0x17, 0x48, + 0x99, 0x83, 0x97, 0x73, 0xee, 0xee, 0xee, 0xee, + 0xee, 0x15, 0xf5, 0xee, 0xee, 0x16, 0x3b, 0x16, + 0x3d, 0xf2, 0xf2, 0x16, 0x14, 0x14, 0x3d, 0x14, + 0xf2, 0x15, 0x3b, 0x16, 0x14, 0x16, 0x3b, 0x3d, + 0x16, 0x3b, 0x16, 0x16, 0x16, 0x16, 0x70, 0x48, + 0xcb, 0x90, 0x5d, 0x81, 0x6a, 0x6b, 0x6b, 0x81, + 0x6b, 0x6f, 0x71, 0x6b, 0x6a, 0x81, 0x81, 0x71, + 0x6f, 0x58, 0x6b, 0x6b, 0x6b, 0x81, 0x6b, 0x81, + 0x81, 0x81, 0x6b, 0x6b, 0x9a, 0x7f, 0x80, 0x1d, + 0x3d, 0x3d, 0x3b, 0x70, 0x3b, 0xf2, 0x3d, 0x15, + 0x16, 0x16, 0xf2, 0xeb, 0xd8, 0x73, 0xcb, 0x3, + 0xdb, 0xd6, 0xd9, 0xd9, 0xd9, 0xd6, 0xd3, 0xd3, + 0xd2, 0xd2, 0xd2, 0xc4, 0xd2, 0xd3, 0xd2, 0xd4, + 0xd2, 0xd3, 0xd9, 0xdb, 0xd2, 0xd2, 0xd3, 0xd0, + 0xd9, 0xe0, 0xd8, 0xd8, 0xe6, 0xe6, 0x5a, 0xf8, + 0x4f, 0xbf, 0xcb, 0xe6, 0xfa, 0x34, 0x9, 0x83, + 0x2f, 0x2c, 0x28, 0x5e, 0x5e, 0x5e, 0xa3, 0x68, + 0x28, 0x5e, 0x68, 0x9e, 0x5e, 0x28, 0x9f, 0x5e, + 0x5e, 0x9f, 0xfc, 0x68, 0xa3, 0x68, 0x68, 0xa3, + 0x68, 0x68, 0x4e, 0xa3, 0x68, 0x68, 0x68, 0x4e, + 0xa3, 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, + 0xa3, 0x4e, 0xa3, 0x9f, 0x4e, 0x4e, 0xa3, 0xa3, + 0x68, 0x4e, 0x0, 0x68, 0x4e, 0x4e, 0x4e, 0xa3, + 0x9e, 0x5e, 0xa3, 0x9f, 0xa3, 0x4e, 0x4e, 0xa3, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x68, 0x68, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7, 0xa9, 0x9c, 0x5e, 0x82, 0x82, 0x79, 0x68, + 0x86, 0x8d, 0x8d, 0x5e, 0x5e, 0x9c, 0xa7, 0x5e, + 0x37, 0xa6, 0xc, 0x5e, 0x5e, 0x7d, 0x82, 0x28, + 0xaa, 0x97, 0x70, 0xeb, 0xeb, 0xf2, 0xf2, 0xf2, + 0xe1, 0x16, 0xf2, 0xf2, 0x17, 0xeb, 0xfa, 0xe7, + 0x50, 0xc2, 0xd2, 0xd2, 0xd3, 0xd3, 0xd3, 0xd3, + 0xd3, 0xd6, 0xd6, 0xe0, 0xed, 0xf1, 0xde, 0xfa, + 0x15, 0xf2, 0x3d, 0xf2, 0xf2, 0xeb, 0xe1, 0xee, + 0x73, 0x2a, 0x39, 0x9a, 0x58, 0x71, 0x5d, 0x71, + 0x71, 0x67, 0x48, 0x48, 0x6b, 0x85, 0x90, 0x85, + 0x81, 0x81, 0x91, 0x6a, 0x5d, 0x81, 0x6a, 0x6f, + 0x6b, 0x83, 0x99, 0x7f, 0x71, 0x71, 0x6f, 0x31, + 0x6b, 0x81, 0x6a, 0x6b, 0x71, 0x71, 0x90, 0x99, + 0x99, 0x90, 0x99, 0x67, 0x5d, 0x91, 0x6a, 0x5d, + 0x58, 0x4a, 0x99, 0x23, 0x48, 0x23, 0x15, 0x15, + 0x3b, 0x3b, 0x3d, 0x15, 0xf2, 0x15, 0xf2, 0xf2, + 0x16, 0x16, 0xf2, 0xf2, 0xf2, 0xee, 0xf2, 0x16, + 0xee, 0x16, 0xf2, 0xee, 0xee, 0x3d, 0x3b, 0x23, + 0x1b, 0x40, 0x41, 0x73, 0x1, 0xee, 0xee, 0x16, + 0xee, 0xe1, 0xee, 0x16, 0x16, 0x3d, 0x34, 0xf2, + 0xf2, 0xf2, 0xf2, 0x16, 0xf2, 0x3d, 0x16, 0x14, + 0xee, 0xf2, 0x3d, 0x16, 0x3d, 0x17, 0x3d, 0x15, + 0x3d, 0x3d, 0x17, 0x3d, 0x3b, 0x3f, 0x1d, 0x7f, + 0x42, 0x4c, 0x6a, 0x6a, 0x83, 0x4a, 0x58, 0x6f, + 0xb0, 0xaf, 0x20, 0x5d, 0x7e, 0x8e, 0x6a, 0x6a, + 0x6a, 0x5d, 0x6b, 0x6a, 0x6a, 0x6f, 0x5d, 0x5d, + 0x83, 0x83, 0x6b, 0x6b, 0x3a, 0x1d, 0x67, 0x7f, + 0x34, 0x16, 0xf2, 0xeb, 0x15, 0x15, 0x15, 0xeb, + 0xf5, 0xf2, 0xa, 0x7f, 0xa, 0x1, 0xcb, 0xbf, + 0xd2, 0xd6, 0xd7, 0xd6, 0xd0, 0xc4, 0xd2, 0xdb, + 0xd3, 0xd1, 0xd1, 0xbe, 0xd1, 0xd9, 0xd9, 0xd1, + 0xc2, 0xc4, 0xd3, 0xd6, 0xd2, 0xd2, 0xc4, 0xd2, + 0xed, 0xe0, 0xcb, 0xcb, 0xcb, 0xe6, 0xf9, 0x50, + 0xc8, 0xbf, 0xd6, 0xe6, 0x2a, 0xfa, 0x41, 0xf8, + 0xe, 0x30, 0x1f, 0x86, 0x68, 0x5e, 0xfc, 0xfc, + 0x5e, 0x5e, 0xb6, 0x6c, 0x1e, 0x1f, 0x5e, 0x86, + 0x68, 0x28, 0x37, 0x68, 0x68, 0x68, 0x68, 0xfc, + 0x37, 0xa3, 0xa3, 0x9f, 0x68, 0x1e, 0x4e, 0x68, + 0xa3, 0xa3, 0x68, 0x75, 0x68, 0x4e, 0x68, 0x9f, + 0x68, 0x68, 0xa3, 0xa3, 0x4e, 0x68, 0xa3, 0xa3, + 0x4e, 0xa3, 0x4e, 0x9e, 0x5e, 0x4e, 0xa3, 0x9f, + 0x9f, 0x98, 0x9e, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, + 0xa3, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x4e, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x79, 0xa3, + 0x0, 0x0, 0x8d, 0x76, 0x0, 0x68, 0x68, 0x4e, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, + 0x6c, 0xdd, 0x6c, 0x68, 0x68, 0xa3, 0x5e, 0x9e, + 0x4e, 0xa3, 0x9f, 0x9f, 0x6c, 0xb8, 0x7, 0x9f, + 0x6c, 0xe, 0xfc, 0x6c, 0x9f, 0x9f, 0x6c, 0xf7, + 0xb9, 0xbf, 0xcb, 0xf1, 0xeb, 0xf2, 0xeb, 0xeb, + 0xe1, 0xee, 0xee, 0xeb, 0xeb, 0xeb, 0xd8, 0xed, + 0xe5, 0xd2, 0xc4, 0xc4, 0xd3, 0xd3, 0xd3, 0xd2, + 0xd2, 0xd6, 0xd6, 0xed, 0xed, 0xe0, 0xd6, 0xe6, + 0xe6, 0xeb, 0xee, 0x15, 0xf2, 0xf2, 0xf2, 0xf2, + 0x15, 0x54, 0x23, 0x26, 0x90, 0xb0, 0xaf, 0xaf, + 0x63, 0x67, 0x48, 0x4d, 0x5d, 0x4a, 0x26, 0x5d, + 0x81, 0x91, 0x55, 0x4a, 0x5d, 0x6a, 0xb0, 0x97, + 0x6f, 0x31, 0x4d, 0x3a, 0x85, 0x5d, 0x41, 0x67, + 0x71, 0x6a, 0x6a, 0x83, 0x59, 0x3a, 0x66, 0x7f, + 0x63, 0x3a, 0x3c, 0x67, 0x5d, 0x6a, 0x6a, 0x5d, + 0x58, 0x4a, 0x80, 0x6e, 0x23, 0xfe, 0x54, 0xa, + 0x6e, 0x6e, 0x2a, 0x15, 0xee, 0xf2, 0x15, 0xeb, + 0xf2, 0xee, 0xee, 0xeb, 0xf2, 0xf2, 0xee, 0x16, + 0x16, 0x16, 0x16, 0xee, 0x14, 0x16, 0x3d, 0x73, + 0xcb, 0x99, 0x6e, 0x73, 0xd8, 0xde, 0xe1, 0x16, + 0x15, 0x15, 0xf2, 0x16, 0x16, 0xf2, 0xf2, 0xf2, + 0x16, 0xf2, 0xf2, 0x16, 0x16, 0x70, 0x3b, 0x16, + 0x16, 0x3d, 0x3d, 0x16, 0x14, 0x16, 0x16, 0x3d, + 0x16, 0x3d, 0x15, 0x3d, 0x1d, 0x80, 0x71, 0x63, + 0x31, 0x5d, 0x6a, 0x56, 0x99, 0x80, 0x58, 0x58, + 0xc9, 0x41, 0x3a, 0x58, 0x5d, 0x6a, 0x81, 0x81, + 0x58, 0x3a, 0x5d, 0x6b, 0x6f, 0x90, 0x63, 0x6a, + 0x6f, 0x71, 0x6b, 0x6b, 0x59, 0x42, 0x67, 0x54, + 0xf2, 0x16, 0x16, 0xee, 0xee, 0xee, 0xe1, 0xeb, + 0xee, 0xeb, 0x7f, 0x41, 0xfd, 0xe6, 0xd7, 0xbf, + 0xd2, 0xd7, 0xd6, 0xd9, 0xd2, 0xc4, 0xc2, 0xd5, + 0xec, 0xcc, 0xc2, 0xb9, 0xd1, 0xd0, 0xd3, 0xd2, + 0xc4, 0xd2, 0xd2, 0xd2, 0xd2, 0xc4, 0xd1, 0xd1, + 0xec, 0x41, 0xcb, 0xd0, 0xcb, 0xa, 0xa, 0xe5, + 0x50, 0xd6, 0xd8, 0xeb, 0xf2, 0x2a, 0x41, 0x6a, + 0x7e, 0x7e, 0x93, 0x28, 0x5e, 0x98, 0xa7, 0x2f, + 0x82, 0x98, 0x37, 0x28, 0x8d, 0x62, 0x8d, 0x5e, + 0x79, 0x8b, 0x8d, 0x5e, 0x8d, 0x98, 0x5e, 0x9f, + 0x79, 0x8d, 0x68, 0x68, 0x79, 0x98, 0x5e, 0x75, + 0x4e, 0x8d, 0x68, 0xa3, 0x79, 0x68, 0x4e, 0xa3, + 0x8b, 0x68, 0x4e, 0x75, 0x98, 0x68, 0x4e, 0x75, + 0x98, 0x68, 0x4e, 0x68, 0x8b, 0x86, 0x4e, 0x98, + 0x8b, 0x98, 0x8d, 0x98, 0x98, 0x79, 0xa3, 0x79, + 0x98, 0xa3, 0x0, 0x4e, 0x8d, 0x4e, 0x4e, 0x68, + 0x8d, 0x8d, 0x4e, 0x8d, 0x8d, 0x4e, 0x0, 0x8d, + 0x68, 0x4e, 0x0, 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x8d, 0x0, 0x0, 0x0, 0x4e, 0x4e, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xfc, 0x37, 0x5e, 0x68, 0xa3, 0x86, 0x1f, 0x28, + 0xa3, 0x7, 0xb8, 0xfc, 0x1e, 0xe, 0x28, 0x86, + 0x68, 0x30, 0xa7, 0x9f, 0x68, 0x28, 0xb9, 0x50, + 0xa1, 0xb4, 0xa, 0xd8, 0x34, 0x15, 0xeb, 0xa, + 0xf2, 0x14, 0x16, 0xf2, 0x14, 0x16, 0xde, 0xcb, + 0xed, 0xd4, 0xc4, 0xc4, 0xc4, 0xd9, 0xd3, 0xc4, + 0xc4, 0xd3, 0xd7, 0xd7, 0xd6, 0xd3, 0xd3, 0xd7, + 0xe6, 0xe1, 0xeb, 0x54, 0x1d, 0x15, 0x16, 0xf2, + 0x16, 0x34, 0x73, 0xa, 0xe6, 0xa, 0x3, 0x99, + 0x63, 0x59, 0x58, 0x6f, 0x58, 0x5d, 0x4d, 0x6b, + 0x5d, 0x6a, 0x97, 0x58, 0x58, 0x58, 0x97, 0x90, + 0x71, 0x71, 0x58, 0x71, 0x6b, 0x6b, 0x63, 0x7f, + 0x85, 0x6f, 0x41, 0x99, 0x99, 0x58, 0x41, 0x66, + 0x4c, 0x6b, 0x63, 0x59, 0x71, 0x6b, 0x6b, 0x6f, + 0x9a, 0x63, 0x26, 0x2a, 0x67, 0xfe, 0x23, 0x39, + 0x67, 0x4d, 0x39, 0x15, 0x16, 0x16, 0xf2, 0xeb, + 0xf2, 0xf2, 0xf2, 0xee, 0xf2, 0xf2, 0x16, 0x16, + 0x16, 0xf2, 0xee, 0x14, 0x14, 0x14, 0x3d, 0xeb, + 0x34, 0x99, 0xa, 0xa, 0xde, 0x1, 0xe1, 0xf2, + 0x15, 0x2b, 0x15, 0xf2, 0x14, 0x3d, 0xf2, 0xee, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x73, 0x3d, 0x3b, + 0x3d, 0x15, 0x3d, 0x3d, 0x17, 0x3b, 0x15, 0x16, + 0x3d, 0x3d, 0x3b, 0x3f, 0x42, 0x63, 0x71, 0x6b, + 0x6a, 0x6f, 0x71, 0x58, 0x9a, 0x4d, 0x58, 0x80, + 0x7f, 0x7f, 0x58, 0x6b, 0x81, 0x81, 0x5d, 0x6b, + 0x9a, 0x99, 0x9a, 0x58, 0x71, 0x58, 0x71, 0x6b, + 0x71, 0x71, 0x71, 0x85, 0x99, 0x70, 0x73, 0x34, + 0x16, 0x3d, 0x3d, 0x15, 0x3d, 0x3d, 0x3d, 0x3d, + 0xf2, 0xf2, 0x73, 0xb4, 0xd0, 0xd6, 0xe0, 0xd3, + 0xd3, 0xd3, 0xd6, 0xdb, 0xe7, 0xe4, 0xdc, 0xcd, + 0xdd, 0xbd, 0xc2, 0xc2, 0xc2, 0xc4, 0xc4, 0xd1, + 0xc2, 0xd1, 0xd1, 0xd1, 0xbc, 0xce, 0xd1, 0xc7, + 0xa6, 0xaf, 0xcb, 0xcb, 0xa, 0x6e, 0x3, 0xbf, + 0x5, 0x54, 0x73, 0xde, 0xf2, 0x15, 0x23, 0x4a, + 0x7e, 0x94, 0x9c, 0xb7, 0x9c, 0x8f, 0x46, 0x6c, + 0x8d, 0x62, 0x8d, 0x5e, 0x8d, 0x8b, 0x8d, 0x28, + 0x8f, 0x8b, 0x8d, 0x28, 0x98, 0x8b, 0x5e, 0x9e, + 0x8d, 0x8d, 0x28, 0x68, 0x98, 0x8d, 0x68, 0x68, + 0x8b, 0x98, 0x68, 0x5e, 0x98, 0x79, 0x5e, 0x86, + 0x98, 0x79, 0x68, 0x68, 0x8b, 0x68, 0x4e, 0xa3, + 0x98, 0x8b, 0x4e, 0x4e, 0x8b, 0xa3, 0x4e, 0x98, + 0x98, 0x98, 0xa3, 0x98, 0x7d, 0x9e, 0x4e, 0xa3, + 0x8d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x8d, + 0x8d, 0x4e, 0x0, 0x8d, 0x8d, 0x4e, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x68, 0x68, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8d, 0x98, 0x7d, 0x5e, 0x5e, 0x46, 0xa8, 0x68, + 0x5e, 0x62, 0x93, 0x79, 0x98, 0x8f, 0x93, 0x5e, + 0x8d, 0x74, 0xaa, 0x28, 0xa7, 0xaa, 0x50, 0xe9, + 0xb, 0xa, 0xd8, 0xeb, 0xfa, 0x15, 0xeb, 0xeb, + 0xf2, 0x16, 0xf2, 0xf5, 0x16, 0x16, 0xf5, 0x5a, + 0x40, 0xa1, 0xd4, 0xd1, 0xcc, 0xb4, 0xd3, 0xd3, + 0xd3, 0xd6, 0xd3, 0xd6, 0xd6, 0xd7, 0xd7, 0xd7, + 0xde, 0xeb, 0xf5, 0x21, 0x2a, 0x3d, 0x3d, 0x16, + 0x16, 0x16, 0x3d, 0x3d, 0x3d, 0x3d, 0x70, 0x7f, + 0x7f, 0x70, 0x9a, 0x9a, 0x9a, 0x71, 0x71, 0x85, + 0x71, 0x71, 0x71, 0x6b, 0x71, 0x99, 0x26, 0x59, + 0x71, 0x85, 0x85, 0x85, 0x85, 0x71, 0x6f, 0x80, + 0x6f, 0x58, 0x59, 0x71, 0x71, 0x58, 0x99, 0x36, + 0x58, 0x85, 0x9a, 0x99, 0x80, 0x63, 0x71, 0x6f, + 0x6f, 0x71, 0x4d, 0x59, 0x71, 0x85, 0x26, 0x23, + 0x67, 0x31, 0x54, 0x34, 0xf2, 0x16, 0x16, 0x34, + 0x2a, 0x34, 0x15, 0x3d, 0xf2, 0xf2, 0x16, 0x16, + 0x16, 0xee, 0x16, 0x14, 0x16, 0x16, 0x16, 0x2b, + 0x42, 0x80, 0x73, 0x3d, 0x16, 0x14, 0x14, 0x16, + 0x16, 0x14, 0x16, 0x16, 0x3d, 0x34, 0x3d, 0x3d, + 0x16, 0x3d, 0x3d, 0x14, 0x14, 0x14, 0x16, 0x3b, + 0x34, 0xf2, 0x16, 0x17, 0x26, 0x9a, 0x3c, 0x1d, + 0x22, 0x36, 0x36, 0x42, 0x42, 0x9a, 0x63, 0x9a, + 0x90, 0x6f, 0x58, 0x58, 0x6b, 0x6b, 0x6b, 0x58, + 0x42, 0x42, 0x9a, 0x5d, 0x6a, 0x99, 0x9a, 0x63, + 0x58, 0x9a, 0x59, 0x59, 0x58, 0x6b, 0x6b, 0x6b, + 0x58, 0x42, 0x7f, 0x70, 0x14, 0x16, 0x16, 0x16, + 0x3d, 0x70, 0x54, 0x73, 0x15, 0x15, 0x15, 0xf2, + 0xf2, 0xf2, 0x1, 0xde, 0xd7, 0xd6, 0xd3, 0xd6, + 0xed, 0xd2, 0xc4, 0xc7, 0xdd, 0xf0, 0xbd, 0xbd, + 0xb8, 0xc1, 0xc2, 0xc7, 0xce, 0xce, 0xce, 0xdc, + 0xec, 0xf0, 0xbe, 0xcd, 0xcd, 0xe2, 0xd2, 0xbf, + 0xbe, 0xbf, 0xd0, 0xcb, 0xf1, 0x5a, 0xa1, 0xf8, + 0xf8, 0xfd, 0xcb, 0xa, 0xeb, 0x34, 0x48, 0x41, + 0x60, 0x62, 0xa7, 0xfc, 0x30, 0x8d, 0xa3, 0x68, + 0x68, 0x37, 0x1f, 0x68, 0x5e, 0x8d, 0x5e, 0xe, + 0x28, 0x8d, 0x5e, 0xa3, 0x28, 0x37, 0x68, 0x68, + 0xa3, 0x68, 0x68, 0x28, 0x5e, 0x4e, 0x0, 0xa3, + 0x28, 0xa3, 0x4e, 0x4e, 0xa3, 0x9e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x68, 0x4e, 0x4e, 0x4e, + 0xa3, 0x4e, 0x68, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, + 0xa3, 0xa3, 0x4e, 0x9e, 0x82, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x76, 0xa8, 0xe, 0x5e, 0x8d, 0x86, 0x5e, + 0x5e, 0x30, 0x82, 0x68, 0x5e, 0x93, 0x55, 0x1f, + 0x82, 0x8d, 0xc, 0xb7, 0x12, 0x93, 0xa9, 0x28, + 0xa1, 0x23, 0xeb, 0xeb, 0xf2, 0xf2, 0xeb, 0xeb, + 0xf2, 0xf2, 0xeb, 0xf2, 0x15, 0x15, 0xe6, 0xd4, + 0xc8, 0x50, 0xdb, 0xd3, 0xd2, 0xd2, 0xd2, 0xd3, + 0xd6, 0xd9, 0xd2, 0xd2, 0xd3, 0xed, 0xd7, 0xd6, + 0xd7, 0xeb, 0xeb, 0x15, 0xeb, 0xf2, 0x3d, 0xee, + 0x16, 0x16, 0x3d, 0x3d, 0x70, 0x3d, 0x3b, 0x48, + 0x70, 0x3d, 0x70, 0x54, 0x48, 0x99, 0x6f, 0x81, + 0x71, 0x31, 0x5d, 0x81, 0x6a, 0x59, 0x36, 0x4d, + 0x9a, 0x9a, 0x80, 0x63, 0x80, 0x85, 0x6a, 0x85, + 0x5d, 0x3a, 0x71, 0x5d, 0x81, 0x6a, 0x31, 0x4d, + 0x80, 0x97, 0x7f, 0x63, 0x67, 0x67, 0x63, 0x6b, + 0x81, 0x6a, 0x5d, 0x58, 0x6b, 0x5d, 0x6f, 0x4d, + 0x58, 0x90, 0x23, 0x48, 0x2a, 0x34, 0x2b, 0x54, + 0x41, 0x3, 0xeb, 0xee, 0xf2, 0xf2, 0xee, 0xf2, + 0xf2, 0x16, 0x16, 0xf2, 0x16, 0x16, 0xf2, 0x21, + 0x6e, 0xc9, 0x1, 0x16, 0xee, 0xf2, 0x16, 0x16, + 0x16, 0x16, 0xf5, 0x16, 0x15, 0xa, 0x15, 0x3d, + 0x15, 0x73, 0xf2, 0x16, 0x16, 0x16, 0x16, 0x3d, + 0x34, 0xf2, 0x15, 0x3d, 0x67, 0x5d, 0x83, 0x4a, + 0x58, 0x97, 0x90, 0x71, 0x71, 0x3a, 0x66, 0x63, + 0x6f, 0x7e, 0x58, 0x6f, 0x5d, 0x6a, 0x90, 0x97, + 0x26, 0x23, 0x80, 0x6a, 0x5d, 0x4a, 0x31, 0x7f, + 0x99, 0x85, 0x58, 0x6b, 0x81, 0x5d, 0x85, 0x90, + 0x97, 0x48, 0x70, 0x2b, 0x3d, 0x3d, 0x16, 0x3b, + 0x3d, 0x34, 0xe6, 0xd8, 0xee, 0x34, 0x1, 0xde, + 0x3d, 0x34, 0x34, 0x73, 0xd8, 0xc0, 0xd6, 0xd0, + 0xe0, 0xd0, 0xc4, 0xc7, 0xcd, 0xb7, 0xce, 0xc2, + 0xb8, 0xdd, 0xf3, 0xdc, 0xf3, 0xdc, 0xe4, 0xbe, + 0xe4, 0xe7, 0xd1, 0xd2, 0xd1, 0xbf, 0xd1, 0xd2, + 0xe2, 0x50, 0xe5, 0xe0, 0xea, 0xf9, 0xa1, 0xbe, + 0xbe, 0xb4, 0xcb, 0xe6, 0x15, 0x34, 0x42, 0x20, + 0x11, 0x2f, 0x28, 0x68, 0x5e, 0x8d, 0x5e, 0xa3, + 0x9f, 0x68, 0x68, 0xb6, 0x6c, 0xa3, 0x68, 0x9f, + 0x5e, 0x68, 0x68, 0xa2, 0x68, 0x9f, 0x5e, 0x4e, + 0xa3, 0x68, 0x4e, 0xa3, 0x68, 0x86, 0x68, 0x4e, + 0x68, 0x68, 0xa3, 0xa3, 0xa3, 0x68, 0x4e, 0x4e, + 0x68, 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0x68, + 0x4e, 0x68, 0x0, 0x68, 0x4e, 0xa3, 0xa3, 0x79, + 0x9c, 0x93, 0xa3, 0xa3, 0x8d, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x86, 0x5e, 0x6c, 0xfc, 0x5e, 0xa3, 0x68, 0x4e, + 0x9f, 0x1f, 0x28, 0x9f, 0x68, 0x5e, 0x2c, 0xe, + 0x68, 0x5e, 0x5e, 0x5e, 0x1e, 0x37, 0x6c, 0x7, + 0xb9, 0x3, 0xf1, 0xeb, 0xf2, 0xf2, 0xeb, 0xde, + 0xeb, 0xf2, 0xde, 0xde, 0xeb, 0xfa, 0xf4, 0xd4, + 0xc7, 0xd1, 0xd3, 0xd6, 0xd3, 0xd2, 0xc4, 0xd3, + 0xd7, 0xdb, 0xc4, 0xc4, 0xd3, 0xd9, 0xd6, 0xd6, + 0xd3, 0xd6, 0xe6, 0xe6, 0xeb, 0xf2, 0xf2, 0x3d, + 0x14, 0x16, 0x3d, 0x34, 0x34, 0xf2, 0x34, 0xa, + 0xd8, 0x73, 0x7f, 0x7f, 0x54, 0x7f, 0x90, 0x6a, + 0x71, 0x58, 0x6a, 0x6a, 0x6a, 0x5d, 0x90, 0x31, + 0x41, 0x90, 0x58, 0x5d, 0x58, 0x31, 0x90, 0x81, + 0x5d, 0x6b, 0x5d, 0x6a, 0x90, 0x83, 0x6a, 0x6f, + 0x63, 0x6f, 0x58, 0x71, 0x59, 0x67, 0x3a, 0x6b, + 0x5d, 0x4a, 0x5d, 0x71, 0x85, 0x97, 0x6a, 0x5d, + 0x4a, 0x83, 0x66, 0x7f, 0x42, 0x15, 0x3b, 0x48, + 0xcb, 0xcb, 0xeb, 0xf2, 0xf2, 0xeb, 0xf2, 0xf2, + 0xeb, 0xee, 0x16, 0x16, 0x16, 0x16, 0x16, 0xf2, + 0xe6, 0xd8, 0xeb, 0xf2, 0xeb, 0xeb, 0xf2, 0x17, + 0x3f, 0x3b, 0x3d, 0x15, 0x3d, 0x34, 0x15, 0x3d, + 0xf2, 0xeb, 0xf2, 0x16, 0x3b, 0x15, 0x3d, 0x16, + 0x3b, 0x3b, 0x3b, 0x3f, 0x7f, 0x1b, 0x97, 0x90, + 0x85, 0x99, 0x63, 0x5d, 0x6a, 0x6b, 0x71, 0x71, + 0x58, 0x6a, 0x5d, 0x3a, 0x5d, 0x83, 0x99, 0x7f, + 0x41, 0x99, 0x80, 0x71, 0x6f, 0x71, 0x59, 0x4d, + 0x59, 0x63, 0x80, 0x90, 0x5d, 0x85, 0x80, 0x7f, + 0x99, 0x7f, 0x70, 0x3b, 0x3b, 0x3f, 0x3b, 0x3d, + 0xf2, 0xf2, 0xf2, 0xeb, 0xf2, 0xf2, 0xeb, 0xf2, + 0x3d, 0x73, 0x73, 0xa, 0xea, 0xe6, 0xcb, 0xd3, + 0xd3, 0xe0, 0xd9, 0xdb, 0xbe, 0xf3, 0xc8, 0xe2, + 0xf0, 0xdd, 0xf3, 0xb7, 0xf0, 0xa5, 0xe5, 0xd1, + 0xe3, 0xd0, 0xe0, 0xd9, 0xdb, 0xbf, 0xe3, 0xbf, + 0xe7, 0x1b, 0x41, 0x3, 0x54, 0xfe, 0xf9, 0xe5, + 0xbf, 0xcb, 0xd8, 0xeb, 0xf2, 0xfa, 0x31, 0x5d, + 0x4a, 0x4a, 0x30, 0x28, 0x82, 0x62, 0x8d, 0xfc, + 0xc, 0x76, 0x68, 0x5e, 0x1e, 0x46, 0x79, 0x32, + 0x98, 0x8b, 0x1f, 0x5e, 0x8d, 0x79, 0x68, 0xa2, + 0x37, 0x79, 0x68, 0xa3, 0x46, 0x98, 0x68, 0x68, + 0x68, 0x79, 0x68, 0x68, 0x79, 0x68, 0x4e, 0x4e, + 0x68, 0x68, 0x4e, 0x68, 0x4e, 0x75, 0x4e, 0x68, + 0x98, 0x68, 0xa3, 0x4e, 0x7d, 0x5e, 0xa3, 0x98, + 0x8b, 0x68, 0x98, 0x98, 0x98, 0x79, 0x4e, 0xa3, + 0x79, 0x4e, 0x4e, 0x4e, 0x82, 0x4e, 0x0, 0x0, + 0x8d, 0x8d, 0x68, 0x79, 0x68, 0x4e, 0x0, 0x0, + 0x68, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x9f, 0x68, 0x68, 0x68, 0x68, 0x32, 0xa3, + 0x68, 0x32, 0x6c, 0xb8, 0x6c, 0x5e, 0x82, 0x68, + 0x68, 0x9f, 0x68, 0x5e, 0x28, 0x76, 0xb7, 0xc2, + 0xbf, 0xcb, 0xa, 0xde, 0xfa, 0x15, 0x23, 0xfa, + 0xf5, 0x16, 0xee, 0xee, 0xee, 0xe1, 0xde, 0xd7, + 0xd2, 0xd0, 0xd2, 0xd3, 0xdb, 0xd2, 0xdb, 0xd3, + 0xdb, 0xdb, 0xdb, 0xd3, 0xc4, 0xd2, 0xd3, 0xd3, + 0xd7, 0xd6, 0xed, 0xe0, 0xf1, 0x23, 0x21, 0x17, + 0x16, 0x3d, 0x16, 0xf2, 0x16, 0x3d, 0xf2, 0xde, + 0x1, 0x2a, 0x90, 0x56, 0x9a, 0x67, 0x4d, 0x66, + 0x80, 0x80, 0x6f, 0x6f, 0x99, 0x97, 0x6b, 0x6f, + 0x58, 0x58, 0x58, 0x5d, 0x71, 0x71, 0x58, 0x5d, + 0x85, 0x99, 0x90, 0x5d, 0x99, 0x99, 0x5d, 0x81, + 0x81, 0x81, 0x6b, 0x71, 0x71, 0x71, 0x58, 0x31, + 0x67, 0x99, 0x6f, 0x6a, 0x5d, 0x58, 0x58, 0x6b, + 0x81, 0x5d, 0x4c, 0x31, 0x4d, 0x7f, 0x1d, 0x42, + 0x21, 0xfa, 0x15, 0x3b, 0x15, 0xee, 0x15, 0x2b, + 0x34, 0xf2, 0x3d, 0x17, 0xee, 0xf2, 0x16, 0xf2, + 0x15, 0xe1, 0xf2, 0x73, 0x54, 0xeb, 0x15, 0x3f, + 0x42, 0x54, 0x3b, 0x3b, 0x17, 0x3d, 0x15, 0x3f, + 0x17, 0x16, 0x14, 0x16, 0x3b, 0x34, 0x3d, 0x15, + 0x2e, 0x48, 0x7f, 0x59, 0x59, 0x4d, 0x67, 0x59, + 0x6b, 0x71, 0x63, 0x58, 0x6b, 0x81, 0x6b, 0x71, + 0x63, 0x58, 0x90, 0x90, 0x5d, 0x5d, 0x7f, 0x39, + 0x58, 0x6b, 0x63, 0x4d, 0x67, 0x80, 0x80, 0x7f, + 0x99, 0xfe, 0x54, 0x42, 0x80, 0x63, 0x54, 0x2b, + 0x70, 0x70, 0x70, 0x3b, 0x3b, 0x1d, 0x70, 0x3d, + 0x3d, 0x3b, 0x15, 0x3d, 0x15, 0x15, 0x3d, 0x16, + 0x16, 0x3d, 0x73, 0xa, 0xd8, 0xde, 0xcb, 0xd7, + 0xd0, 0xc0, 0xea, 0x26, 0xa1, 0x60, 0x60, 0xe9, + 0xec, 0xb, 0x50, 0xbf, 0xd4, 0xed, 0xcb, 0xd0, + 0xd3, 0xd0, 0xe6, 0xcb, 0xdb, 0x40, 0xbf, 0xbf, + 0xed, 0x23, 0xea, 0xa, 0x73, 0x54, 0x23, 0xfd, + 0x5a, 0x99, 0x54, 0x15, 0x3d, 0xf2, 0x48, 0x99, + 0x26, 0x5d, 0x27, 0xa7, 0xac, 0x62, 0x93, 0x30, + 0x93, 0x8b, 0x8d, 0x5e, 0x8d, 0x62, 0x5e, 0x5e, + 0x9c, 0x74, 0x62, 0x37, 0x9c, 0x8b, 0x68, 0x68, + 0x98, 0x98, 0x68, 0x68, 0x98, 0x8b, 0x68, 0x68, + 0x68, 0x98, 0x5e, 0x5e, 0x68, 0x68, 0x68, 0xa3, + 0x8b, 0x68, 0x4e, 0x68, 0x68, 0x68, 0xa3, 0xa3, + 0x98, 0x68, 0x4e, 0x86, 0x98, 0x98, 0x4e, 0x98, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x8d, 0x4e, 0x4e, + 0x8d, 0x4e, 0x4e, 0x0, 0x8d, 0x4e, 0x0, 0x4e, + 0x4e, 0x0, 0x4e, 0x68, 0x68, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x28, 0x46, 0x93, 0x7, 0x5e, 0x93, 0x62, 0xf7, + 0x76, 0x8b, 0x8b, 0x1e, 0x30, 0x8f, 0x98, 0x8d, + 0x32, 0x30, 0x5f, 0xb8, 0xa7, 0x74, 0x83, 0xd4, + 0x3, 0x3, 0x73, 0x15, 0x15, 0x21, 0x7f, 0x54, + 0xfa, 0x15, 0xf2, 0x14, 0xff, 0x15, 0xeb, 0xd7, + 0xe0, 0xe5, 0xd1, 0xd2, 0xdb, 0xd9, 0xd3, 0xd2, + 0xd2, 0xd3, 0xd6, 0xd7, 0xd3, 0xc4, 0xd1, 0xdb, + 0xd9, 0xed, 0xe5, 0xd2, 0xd9, 0xfb, 0xf9, 0xde, + 0x14, 0x16, 0x17, 0x14, 0x16, 0x3d, 0x34, 0x3d, + 0x16, 0x3d, 0x70, 0x7f, 0x54, 0x54, 0x48, 0x42, + 0x99, 0x99, 0x71, 0x58, 0x4d, 0x59, 0x6b, 0x81, + 0x85, 0x31, 0x71, 0x6f, 0x9a, 0x90, 0x58, 0x31, + 0x59, 0x58, 0x6b, 0x6a, 0x90, 0x80, 0x6b, 0x81, + 0x6a, 0x85, 0x71, 0x59, 0x9a, 0x9a, 0x6f, 0x6b, + 0x58, 0x71, 0x81, 0x6b, 0x6f, 0x59, 0x58, 0x6b, + 0x6a, 0x85, 0x71, 0x58, 0x9a, 0x99, 0x9a, 0x58, + 0x31, 0x36, 0x42, 0x36, 0x70, 0x34, 0x15, 0x3d, + 0x3d, 0x15, 0xeb, 0xfa, 0xa, 0x15, 0x34, 0x7f, + 0x26, 0x48, 0x34, 0x21, 0x21, 0x2b, 0x16, 0x15, + 0x3d, 0xeb, 0x3b, 0x48, 0x4d, 0x2a, 0x70, 0x67, + 0x36, 0x3f, 0x3b, 0x3f, 0x3f, 0xe1, 0x17, 0x3f, + 0x80, 0x7f, 0x9a, 0x71, 0x81, 0x81, 0x6b, 0x71, + 0x6b, 0x6a, 0x31, 0x9a, 0x71, 0x56, 0x7f, 0x80, + 0x5d, 0x6a, 0x5d, 0x81, 0x6b, 0x5d, 0x58, 0x71, + 0x6b, 0x5d, 0x80, 0x70, 0x48, 0xfa, 0x73, 0x34, + 0x3f, 0x2a, 0x2b, 0x99, 0x63, 0x90, 0x2a, 0x3b, + 0x3b, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0xf2, 0x3d, + 0x34, 0x7f, 0xfa, 0xfa, 0xf9, 0x39, 0xeb, 0xf2, + 0x16, 0xee, 0xee, 0xee, 0xde, 0xd8, 0xe6, 0xd6, + 0xd0, 0x99, 0x3, 0xcb, 0xe5, 0x5a, 0x5a, 0xd3, + 0xe0, 0xe0, 0xd6, 0xd3, 0xd3, 0xcb, 0xcb, 0xe0, + 0xe0, 0xcb, 0xcb, 0xd9, 0xe0, 0xcb, 0xd0, 0xd2, + 0xd6, 0xcb, 0xd7, 0xd8, 0xde, 0xf9, 0x26, 0xb, + 0x50, 0xb, 0xd4, 0xcb, 0xeb, 0x34, 0x48, 0xa, + 0x5a, 0x60, 0xa7, 0x32, 0x5e, 0x5e, 0x5e, 0x68, + 0x68, 0x5e, 0x68, 0xa3, 0x9f, 0x8, 0xa3, 0x9f, + 0xf7, 0x6c, 0x68, 0xa3, 0x68, 0x68, 0x68, 0xa3, + 0x4e, 0x75, 0x4e, 0x4e, 0x86, 0x5e, 0x4e, 0x9e, + 0x5e, 0x4e, 0x9e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0xa3, + 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x6c, 0x8d, 0x89, 0x7, 0x28, 0x8d, 0x82, 0x68, + 0x68, 0x8d, 0x98, 0x68, 0x5e, 0x8d, 0x82, 0x7, + 0x7, 0x8d, 0x28, 0x7, 0xa0, 0x98, 0xa9, 0x50, + 0x5a, 0x7f, 0xa, 0x1, 0x15, 0x15, 0xeb, 0xde, + 0x15, 0xf2, 0x16, 0x14, 0x16, 0xf2, 0x48, 0xe6, + 0xcb, 0xbf, 0xc2, 0xc4, 0xd3, 0xd3, 0xd6, 0xd3, + 0xd2, 0xd2, 0xd6, 0xd6, 0xd6, 0xdb, 0xd5, 0xdb, + 0xd9, 0xd9, 0xd2, 0xd3, 0xd7, 0xd7, 0xd7, 0xe6, + 0xe1, 0x15, 0x23, 0x17, 0x15, 0x15, 0x2b, 0x3d, + 0xf2, 0x16, 0x3d, 0xf2, 0xf2, 0x34, 0xeb, 0x54, + 0x54, 0x80, 0x5d, 0x71, 0x71, 0x71, 0x5d, 0x81, + 0x85, 0x99, 0x6a, 0x58, 0x99, 0x99, 0x5d, 0x81, + 0x71, 0x6f, 0x6a, 0x6a, 0x5d, 0x5d, 0x6a, 0x6a, + 0x9a, 0x99, 0x6f, 0x81, 0x71, 0x56, 0x83, 0x6a, + 0x6a, 0x6a, 0x4a, 0x6a, 0x5d, 0x90, 0x90, 0x9a, + 0x90, 0x41, 0x6b, 0x5d, 0x9a, 0x41, 0x3a, 0x81, + 0x6a, 0x6a, 0x3a, 0x4d, 0x36, 0x7f, 0x54, 0x2a, + 0x3b, 0xeb, 0x34, 0xfa, 0xeb, 0xa, 0x23, 0x20, + 0x40, 0xb, 0x99, 0xfe, 0xf9, 0x54, 0x15, 0x17, + 0x3f, 0x3d, 0x70, 0xfe, 0x97, 0x6e, 0x34, 0x36, + 0x6f, 0x90, 0x70, 0x42, 0x42, 0x21, 0x1d, 0x80, + 0x58, 0x26, 0x20, 0x6a, 0x7e, 0x6a, 0x5d, 0x6f, + 0x6f, 0x6f, 0x97, 0x90, 0x9d, 0x31, 0x7f, 0x4d, + 0x6a, 0x91, 0x6a, 0x6a, 0x6a, 0x5d, 0x85, 0x9a, + 0x6f, 0x90, 0x99, 0x54, 0x54, 0x2a, 0xfa, 0x15, + 0x34, 0x21, 0x3d, 0xfa, 0xe6, 0x3, 0xd8, 0x34, + 0x15, 0xf2, 0x16, 0x3d, 0x3d, 0x16, 0x16, 0x16, + 0xee, 0x73, 0xeb, 0x34, 0x54, 0xf1, 0xf2, 0xee, + 0x16, 0xf2, 0x15, 0xeb, 0xd8, 0x6e, 0xa, 0xcb, + 0xcb, 0xf4, 0xcb, 0xe0, 0xe6, 0xe6, 0xe0, 0xd6, + 0xd6, 0xa, 0xcb, 0xe6, 0xf1, 0x6e, 0x3, 0xcb, + 0xd7, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xd8, 0xd7, + 0xd6, 0xcb, 0xcb, 0xeb, 0xee, 0x2a, 0x6e, 0xed, + 0xed, 0xe5, 0xd6, 0xcb, 0xd8, 0x15, 0x1c, 0x1a, + 0x4a, 0x55, 0x86, 0xfc, 0xfc, 0x1f, 0x5e, 0xa3, + 0x6c, 0xe, 0xfc, 0x28, 0x6c, 0x6c, 0x5e, 0xfc, + 0x28, 0x86, 0x4e, 0xa3, 0x4e, 0xf, 0x4e, 0x4e, + 0x68, 0x32, 0x68, 0xf, 0x5e, 0x5e, 0x68, 0x4e, + 0xfc, 0x9f, 0xa3, 0x4e, 0x4e, 0x68, 0xa3, 0x68, + 0xa3, 0xa3, 0xa3, 0xa3, 0x68, 0xa3, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0xa3, 0x9f, 0x79, + 0x8d, 0x32, 0xa3, 0xa3, 0x8d, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7, 0x68, 0x9f, 0x6c, 0x9e, 0xa3, 0x5e, 0x9e, + 0x68, 0x68, 0xa3, 0x68, 0xb6, 0xa3, 0x5e, 0x7, + 0x7, 0xa3, 0x68, 0xa3, 0x5e, 0x6c, 0x28, 0xb9, + 0xbf, 0xd0, 0xd8, 0xeb, 0xd8, 0xeb, 0xde, 0xe1, + 0xee, 0xf2, 0xee, 0x16, 0x3d, 0xf5, 0xea, 0xe0, + 0xd2, 0xd2, 0xd3, 0xd2, 0xd3, 0xd3, 0xd6, 0xd6, + 0xd6, 0xd3, 0xc4, 0xd0, 0xd6, 0xd9, 0xd3, 0xd2, + 0xd1, 0xd3, 0xd6, 0xd6, 0xe6, 0xe0, 0xd6, 0xd8, + 0xf2, 0xf2, 0xeb, 0xa, 0x15, 0x15, 0xfa, 0x15, + 0x3d, 0x15, 0x73, 0x15, 0xf2, 0xee, 0x34, 0xe6, + 0x48, 0x7f, 0x97, 0x6f, 0x80, 0x9a, 0x31, 0x6b, + 0x6f, 0x9a, 0x85, 0x71, 0x59, 0x9a, 0x5d, 0x6b, + 0x90, 0x90, 0x3a, 0x90, 0x6f, 0xb0, 0x83, 0x58, + 0x58, 0x6f, 0x83, 0x6a, 0x6f, 0x80, 0x5d, 0x6a, + 0x6f, 0x90, 0x20, 0x3a, 0x85, 0xaf, 0x41, 0x58, + 0x31, 0x58, 0x6a, 0x5d, 0x63, 0x26, 0x58, 0x81, + 0x5d, 0x83, 0x41, 0x20, 0x4d, 0x90, 0x41, 0x26, + 0x2e, 0x48, 0x48, 0x23, 0x2a, 0x48, 0xfa, 0xfd, + 0xb, 0x3, 0x3, 0x7f, 0xfe, 0xfe, 0x48, 0x63, + 0x42, 0x3f, 0x1d, 0x31, 0x41, 0x2a, 0x48, 0x39, + 0x41, 0x7f, 0x54, 0x26, 0x3a, 0x36, 0x63, 0x71, + 0x6a, 0x58, 0x31, 0x58, 0x5d, 0x5d, 0x97, 0x99, + 0x4d, 0x63, 0x66, 0x99, 0x4a, 0x3a, 0x58, 0x71, + 0x6b, 0x81, 0x91, 0x81, 0x6a, 0x6f, 0x99, 0x99, + 0x63, 0x58, 0x80, 0x99, 0x54, 0x48, 0x34, 0x3f, + 0x23, 0x7f, 0x16, 0xf2, 0xeb, 0xf2, 0xf2, 0xf2, + 0xeb, 0xf2, 0x16, 0x3b, 0x42, 0x70, 0x16, 0x3d, + 0x3d, 0x34, 0xf2, 0xf2, 0xf2, 0xf2, 0x16, 0x16, + 0x3d, 0x15, 0x15, 0x34, 0xa, 0xa, 0xfa, 0xeb, + 0xde, 0x73, 0xa, 0xd8, 0xe6, 0xe6, 0x34, 0xcb, + 0xcb, 0xe6, 0xfa, 0xeb, 0xe6, 0xa, 0x6e, 0xe6, + 0xe6, 0xf1, 0xd8, 0xcb, 0xe6, 0xe6, 0xeb, 0x73, + 0xd8, 0xe6, 0xf9, 0xfa, 0x34, 0x2a, 0x54, 0x54, + 0xa, 0xa, 0xd8, 0xd8, 0xeb, 0x54, 0xfe, 0x31, + 0x5d, 0x91, 0x93, 0x28, 0x55, 0x74, 0x8d, 0x5e, + 0x76, 0x55, 0x46, 0x5e, 0x82, 0x8b, 0x28, 0x28, + 0x46, 0x98, 0x68, 0x68, 0x8d, 0x8b, 0x5e, 0x75, + 0x8b, 0x8b, 0x28, 0x8d, 0x8b, 0x8f, 0x86, 0xa3, + 0x8b, 0x68, 0x4e, 0x4e, 0x68, 0x6c, 0xa3, 0x68, + 0x98, 0x79, 0xa3, 0x4e, 0x98, 0x68, 0x4e, 0x4e, + 0x98, 0x68, 0x4e, 0x4e, 0x98, 0x82, 0xa3, 0x98, + 0x98, 0x98, 0x9e, 0x79, 0x98, 0x8d, 0x4e, 0x4e, + 0x8d, 0x4e, 0x4e, 0x4e, 0x8d, 0x4e, 0x0, 0x68, + 0x68, 0x4e, 0x0, 0x68, 0x4e, 0x0, 0x0, 0x4e, + 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x4e, 0x32, 0x68, 0xf, 0x68, 0x68, 0x9f, + 0xb8, 0xfc, 0x32, 0x9f, 0x7, 0x9f, 0x1f, 0x28, + 0xa3, 0x8d, 0x5e, 0x37, 0xfc, 0x37, 0x7, 0xbe, + 0xbf, 0xcb, 0xe6, 0xe6, 0x73, 0xa, 0xfa, 0x15, + 0xee, 0xf2, 0x14, 0xff, 0x14, 0xeb, 0xde, 0xcb, + 0xd6, 0xd3, 0xe0, 0xcb, 0xd6, 0xd6, 0xb4, 0xe0, + 0xd7, 0xc0, 0xd3, 0xd2, 0xd3, 0xd7, 0xd7, 0xd3, + 0xd2, 0xd2, 0xd6, 0xd7, 0xd7, 0xd0, 0xd4, 0xe0, + 0xf2, 0xf2, 0xf5, 0xf2, 0xde, 0xee, 0xf2, 0xee, + 0x34, 0x7f, 0x7f, 0x48, 0x21, 0x2b, 0x16, 0x3d, + 0x16, 0x34, 0x54, 0x73, 0x7f, 0x99, 0x63, 0x58, + 0x71, 0x6b, 0x6b, 0x71, 0x71, 0x71, 0x71, 0x85, + 0x42, 0x48, 0x39, 0x67, 0x99, 0x67, 0x31, 0x58, + 0x58, 0x81, 0x6b, 0x81, 0x5d, 0x58, 0x85, 0x85, + 0x99, 0x99, 0x99, 0x36, 0x7f, 0x63, 0x71, 0x71, + 0x58, 0x71, 0x6b, 0x81, 0x6b, 0x71, 0x58, 0x6a, + 0x6f, 0x90, 0x63, 0x59, 0x59, 0x58, 0x58, 0x6b, + 0x31, 0x31, 0x4d, 0x99, 0x67, 0x39, 0x2a, 0x70, + 0x23, 0xf1, 0xfe, 0x3a, 0x31, 0x67, 0x63, 0x59, + 0x71, 0x59, 0x63, 0x63, 0x63, 0x42, 0x1d, 0x42, + 0x26, 0x2a, 0x36, 0x71, 0x58, 0x71, 0x6b, 0x6b, + 0x5d, 0x71, 0x58, 0x80, 0x85, 0x85, 0x67, 0x31, + 0x59, 0x80, 0x66, 0x58, 0x58, 0x71, 0x71, 0x71, + 0x71, 0x6b, 0x81, 0x9a, 0x85, 0x85, 0x9a, 0x58, + 0x71, 0x71, 0x9a, 0x99, 0x99, 0x42, 0x3f, 0x73, + 0x54, 0x70, 0x3b, 0x3d, 0x16, 0x3d, 0x16, 0x3d, + 0xf2, 0x3d, 0x16, 0x3d, 0x48, 0x73, 0x3d, 0x3d, + 0xf2, 0xf2, 0x15, 0x3d, 0x15, 0x16, 0x16, 0xff, + 0x14, 0x3d, 0xf2, 0x15, 0xeb, 0xeb, 0xde, 0x15, + 0xeb, 0xeb, 0xde, 0xf2, 0xeb, 0xfa, 0xeb, 0xde, + 0xe1, 0xe6, 0xeb, 0xeb, 0xde, 0xeb, 0xeb, 0xfa, + 0xeb, 0x1, 0xe6, 0xfa, 0xfa, 0xfa, 0xfa, 0xe1, + 0xeb, 0x8a, 0xa, 0x73, 0xeb, 0x34, 0x2a, 0x23, + 0x5a, 0x99, 0x39, 0x15, 0x15, 0xeb, 0xfa, 0x48, + 0x58, 0x6a, 0x62, 0x5e, 0x7d, 0xaa, 0x7d, 0x5e, + 0x82, 0x8b, 0x8d, 0x68, 0x79, 0x98, 0x8d, 0x68, + 0x79, 0x93, 0x5e, 0x5e, 0x8d, 0x98, 0x68, 0x68, + 0x98, 0x98, 0x79, 0x68, 0x8b, 0x8f, 0x68, 0x68, + 0x68, 0x79, 0x68, 0x4e, 0x75, 0x4e, 0x68, 0x4e, + 0x68, 0x68, 0x4e, 0x4e, 0x68, 0x4e, 0x68, 0xa3, + 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x8d, + 0x98, 0x98, 0x8d, 0x8d, 0x8d, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x68, 0x0, 0x0, 0x4e, + 0x68, 0x68, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x86, 0x8b, 0x98, 0x76, 0x7, 0x9c, 0x7d, 0x6c, + 0xf7, 0x7d, 0x93, 0xa3, 0x5e, 0x98, 0x79, 0x68, + 0x8d, 0x93, 0x93, 0x37, 0xc8, 0xaa, 0x74, 0x2c, + 0xaf, 0xa, 0xeb, 0x15, 0xde, 0xfa, 0x23, 0x2b, + 0x16, 0x3d, 0x16, 0x16, 0x16, 0xf2, 0xf2, 0xe1, + 0xa, 0xa, 0x99, 0x5a, 0xa, 0x73, 0x6e, 0x6e, + 0xa, 0xd8, 0xc0, 0xcb, 0xde, 0xd8, 0xcb, 0xdb, + 0xcb, 0xc0, 0xd0, 0xd4, 0xcb, 0xe0, 0xd3, 0xd6, + 0xd8, 0xde, 0xeb, 0xf2, 0x17, 0xf2, 0xf2, 0x3d, + 0xeb, 0xa, 0x99, 0x54, 0x7f, 0x70, 0x3d, 0x16, + 0x3d, 0x16, 0xf2, 0x16, 0x70, 0x67, 0x9a, 0x99, + 0x80, 0x71, 0x71, 0x71, 0x71, 0x85, 0x85, 0x71, + 0x71, 0x63, 0x58, 0x63, 0x42, 0x59, 0x5d, 0x99, + 0x99, 0x6f, 0x6f, 0x6f, 0x71, 0x85, 0x90, 0x58, + 0x59, 0x71, 0x81, 0x58, 0x42, 0x31, 0x71, 0x5d, + 0x6f, 0x6b, 0x6a, 0x6f, 0x85, 0x71, 0x6f, 0x6b, + 0x58, 0x6b, 0x81, 0x81, 0x58, 0x58, 0x58, 0x6f, + 0x99, 0x99, 0x99, 0xfe, 0x4d, 0x90, 0x6f, 0x3a, + 0x31, 0x36, 0x31, 0x6b, 0x99, 0x1c, 0x42, 0x80, + 0x85, 0x6f, 0x9a, 0x9a, 0x58, 0x71, 0x6b, 0x6b, + 0x71, 0x36, 0x59, 0x81, 0x81, 0x6a, 0x6b, 0x90, + 0x5d, 0x81, 0x71, 0x59, 0x58, 0x58, 0x71, 0x71, + 0x6b, 0x59, 0x42, 0x67, 0x99, 0x80, 0x97, 0x41, + 0x9a, 0x6b, 0x71, 0x6b, 0x6b, 0x71, 0x4d, 0x6b, + 0x81, 0x85, 0x67, 0x70, 0x15, 0xf2, 0x3d, 0xee, + 0x73, 0x54, 0x54, 0x42, 0x54, 0x3b, 0x3d, 0x3f, + 0x3d, 0x34, 0x3d, 0x16, 0xf2, 0x3d, 0x16, 0x73, + 0x73, 0x2a, 0x22, 0x21, 0x34, 0x3d, 0x14, 0x14, + 0x14, 0x16, 0x16, 0xee, 0xe1, 0xee, 0xf2, 0x34, + 0xeb, 0xeb, 0x15, 0xfa, 0xeb, 0xa, 0xf2, 0xeb, + 0xeb, 0xf2, 0xeb, 0xeb, 0xf2, 0xe1, 0x15, 0xeb, + 0xeb, 0xeb, 0xfa, 0xfa, 0x2a, 0xeb, 0xf2, 0x3d, + 0x15, 0xeb, 0xd8, 0xa, 0xa, 0xa, 0xfa, 0xfd, + 0x1b, 0x40, 0xb, 0x6e, 0xfa, 0x2a, 0xfa, 0x42, + 0x1b, 0x11, 0x1f, 0xa3, 0x9e, 0x5e, 0x28, 0xfc, + 0x68, 0x68, 0x68, 0xa3, 0xfc, 0x28, 0x9f, 0x4e, + 0x9e, 0x5e, 0xfc, 0x86, 0x4e, 0x68, 0x4e, 0x68, + 0xf, 0x4e, 0x68, 0x4e, 0x4e, 0xfc, 0x68, 0x4e, + 0x4e, 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, + 0x4e, 0x68, 0x4e, 0xa3, 0x4e, 0xa3, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x8d, 0x68, 0x68, 0xa3, 0x4e, 0x0, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x6c, 0x37, 0x82, 0x5e, 0x8, 0x28, 0x28, 0x5e, + 0x86, 0x5e, 0x86, 0x68, 0xfc, 0x5e, 0x5e, 0xa3, + 0x6c, 0xa8, 0x82, 0x5e, 0x7, 0x2f, 0x2f, 0xf8, + 0xb, 0xa, 0x34, 0x16, 0xee, 0x15, 0xeb, 0xeb, + 0xf2, 0xee, 0x16, 0x16, 0xf5, 0xeb, 0x15, 0x34, + 0x15, 0x73, 0x54, 0x3, 0xa, 0x73, 0xa, 0xa, + 0xa, 0x73, 0xa, 0x9, 0x3, 0xcb, 0xbf, 0xd4, + 0xe0, 0xe0, 0xd3, 0xd2, 0xd3, 0xe0, 0xd6, 0xe0, + 0xd6, 0xcb, 0xe0, 0xf9, 0x1d, 0x23, 0xfa, 0x16, + 0x3d, 0x16, 0xf2, 0xeb, 0xf2, 0xeb, 0xe1, 0xf2, + 0x34, 0xa, 0xd8, 0x34, 0x1d, 0x67, 0x5a, 0x73, + 0x21, 0x67, 0x42, 0x99, 0x80, 0x90, 0x90, 0x58, + 0x71, 0x6b, 0x6a, 0x6b, 0x5d, 0x71, 0x83, 0x99, + 0x67, 0x99, 0x41, 0x97, 0x6f, 0x6a, 0x6a, 0x5d, + 0x5d, 0x6a, 0x91, 0x6a, 0x6f, 0x5d, 0x90, 0x41, + 0x80, 0x83, 0x97, 0x41, 0x90, 0x6a, 0x91, 0x6a, + 0x58, 0x5d, 0x6a, 0x6a, 0x6b, 0x5d, 0x3a, 0x99, + 0x66, 0x4d, 0x90, 0x3c, 0x90, 0x58, 0x6a, 0x6a, + 0x4a, 0x31, 0x4a, 0x6f, 0x5d, 0x6f, 0x31, 0x26, + 0x99, 0x58, 0x4a, 0x6a, 0x5d, 0x5d, 0x6b, 0x6a, + 0x6a, 0x5d, 0x5d, 0x6f, 0x6a, 0x7e, 0x6a, 0x5d, + 0x6a, 0x7e, 0x7e, 0x6a, 0x5d, 0x5d, 0x58, 0x71, + 0x83, 0x6f, 0x59, 0x7f, 0x7f, 0x9a, 0x58, 0x31, + 0x3a, 0x71, 0x6b, 0x81, 0x81, 0x6b, 0x31, 0x59, + 0xb0, 0x90, 0x9a, 0x39, 0x48, 0x3d, 0x3b, 0x3d, + 0x15, 0x15, 0x2b, 0x54, 0xcb, 0xeb, 0x3d, 0x34, + 0xde, 0xf2, 0xee, 0x3d, 0x3d, 0x16, 0x3b, 0x48, + 0x1, 0xf2, 0x3b, 0x15, 0xf2, 0xee, 0x16, 0xf5, + 0x16, 0x16, 0x14, 0xee, 0x16, 0x16, 0x16, 0xf2, + 0xeb, 0xe1, 0xf2, 0xe1, 0xde, 0xeb, 0xeb, 0xeb, + 0xeb, 0xeb, 0xee, 0x3d, 0xee, 0xee, 0xee, 0xe1, + 0xf2, 0xf2, 0x15, 0xeb, 0xeb, 0xf5, 0xeb, 0xf2, + 0x15, 0x15, 0x34, 0x23, 0x6e, 0x15, 0x15, 0x54, + 0x41, 0x3, 0xcb, 0xcb, 0xe6, 0xfa, 0x6e, 0x1b, + 0x3e, 0x7e, 0x1e, 0x68, 0xa3, 0x68, 0x68, 0x68, + 0x68, 0x5e, 0x68, 0x4e, 0x9f, 0x5e, 0x68, 0xa3, + 0x68, 0x68, 0x86, 0x68, 0xa3, 0x68, 0xa3, 0x68, + 0x68, 0x5e, 0x9f, 0xa3, 0x75, 0x68, 0x68, 0x68, + 0x68, 0x75, 0x4e, 0xa3, 0x75, 0x4e, 0x4e, 0xa3, + 0x68, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0xb8, + 0x82, 0x93, 0x8d, 0x79, 0x8d, 0x4e, 0x0, 0x4e, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8, 0xe, 0x5e, 0x9f, 0x68, 0x5e, 0xfc, 0x28, + 0xa3, 0x5e, 0x4e, 0xf, 0xe, 0xa0, 0x5e, 0x9f, + 0x6c, 0xe, 0x37, 0x9e, 0x5e, 0x6c, 0x37, 0x11, + 0xb, 0xe6, 0x34, 0x15, 0x15, 0xee, 0xee, 0xeb, + 0xee, 0x14, 0xee, 0x14, 0xde, 0xeb, 0xfa, 0xfa, + 0xeb, 0x1, 0xcb, 0xcb, 0xd8, 0xeb, 0xeb, 0x54, + 0x6e, 0xd8, 0xf1, 0xfe, 0x39, 0xe6, 0x3, 0xd0, + 0xd8, 0xcb, 0xd3, 0xd3, 0xd6, 0xd7, 0xcb, 0xe0, + 0x3, 0xe0, 0xe0, 0xf9, 0xfe, 0x23, 0xe6, 0xf2, + 0x16, 0xf2, 0xf2, 0xf2, 0xf2, 0xeb, 0xeb, 0x16, + 0xf2, 0xeb, 0xde, 0xf2, 0xfa, 0xea, 0xcb, 0x34, + 0x42, 0x67, 0x39, 0x70, 0x7f, 0x6f, 0x7a, 0x9a, + 0x58, 0x6a, 0x6a, 0x6a, 0x5d, 0x5d, 0x97, 0x97, + 0x58, 0x58, 0x90, 0x90, 0x9d, 0x6a, 0x8e, 0x4a, + 0x5d, 0x8e, 0x60, 0x83, 0x6a, 0x4a, 0x90, 0x41, + 0x6f, 0x81, 0x4a, 0x63, 0x99, 0x6a, 0x6a, 0x6a, + 0x6f, 0x5d, 0x5d, 0x90, 0x6a, 0x5d, 0x5d, 0x58, + 0x6b, 0x5d, 0x5d, 0x6f, 0x56, 0x5d, 0x6a, 0x5d, + 0x58, 0x71, 0x6f, 0x90, 0x90, 0x6a, 0x6f, 0x58, + 0x31, 0x71, 0x6a, 0x6a, 0x5d, 0x6b, 0x6a, 0x6f, + 0x6f, 0x6a, 0x6a, 0x6f, 0x35, 0x6a, 0x6a, 0x6a, + 0x6a, 0x5b, 0x6a, 0x81, 0x5d, 0x6f, 0x71, 0x80, + 0x90, 0x6f, 0x6f, 0x80, 0x80, 0x58, 0x71, 0x71, + 0x6b, 0x71, 0x71, 0x6b, 0x90, 0x67, 0x63, 0x99, + 0xb4, 0x9a, 0x9a, 0x99, 0x7f, 0x70, 0x3f, 0x3f, + 0x3b, 0x3d, 0x15, 0xeb, 0xf5, 0xf2, 0xf2, 0xeb, + 0xde, 0xee, 0x3b, 0x42, 0x7f, 0x3f, 0x3f, 0x48, + 0xd8, 0xee, 0x3d, 0x15, 0x16, 0x16, 0x16, 0xeb, + 0xf2, 0x16, 0x16, 0xf2, 0x16, 0x16, 0xee, 0xee, + 0xf2, 0xee, 0xf2, 0xf2, 0xee, 0xee, 0xf2, 0xeb, + 0xf5, 0xe1, 0x16, 0x17, 0xee, 0x14, 0x14, 0xee, + 0x16, 0xf2, 0xe1, 0xf2, 0xe1, 0xf2, 0xf2, 0xf2, + 0x17, 0x3f, 0x23, 0x36, 0x48, 0x34, 0xee, 0x34, + 0xf9, 0x6e, 0xd8, 0xde, 0xeb, 0xeb, 0xfa, 0x20, + 0x4a, 0x7e, 0x82, 0x5e, 0x28, 0x79, 0x5e, 0x68, + 0x79, 0x82, 0x28, 0x68, 0x68, 0x79, 0x5e, 0xa3, + 0x8d, 0x8b, 0x68, 0x68, 0x68, 0x8b, 0x5e, 0xa3, + 0x8d, 0x93, 0x28, 0x32, 0x8d, 0x8b, 0x68, 0xa3, + 0x79, 0x79, 0xa3, 0xa3, 0x79, 0x79, 0xa3, 0x4e, + 0x98, 0x4e, 0x68, 0xa3, 0x68, 0x68, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0x98, 0x4e, 0x0, 0x68, + 0x98, 0x98, 0x8d, 0x8d, 0x8d, 0x4e, 0x4e, 0x0, + 0x8d, 0x4e, 0x4e, 0x0, 0x68, 0x0, 0x0, 0xa3, + 0x4e, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x5e, 0x32, 0x68, 0x9e, 0x6c, 0x82, 0x5e, + 0xb6, 0x7, 0x5e, 0xa3, 0x28, 0x37, 0x68, 0x68, + 0x68, 0x8d, 0x8d, 0x5e, 0x6c, 0x9c, 0xa8, 0xa6, + 0xb4, 0xd8, 0x34, 0x15, 0xeb, 0x1, 0x15, 0x15, + 0x15, 0x18, 0x14, 0x16, 0x16, 0xf2, 0xee, 0xde, + 0xde, 0xeb, 0xde, 0xe6, 0xfa, 0x15, 0xeb, 0x48, + 0x23, 0xfa, 0xeb, 0xeb, 0xfa, 0xde, 0xd8, 0xd8, + 0x6e, 0xea, 0xea, 0x99, 0x99, 0x54, 0xd8, 0xf1, + 0xa, 0xe6, 0xd8, 0x15, 0x15, 0xeb, 0xe1, 0xf2, + 0x15, 0x23, 0x34, 0x15, 0x2e, 0x1d, 0x3d, 0xf2, + 0x16, 0x16, 0x16, 0x16, 0x16, 0xeb, 0xd8, 0x73, + 0x99, 0x99, 0x7f, 0x70, 0x36, 0x90, 0x99, 0x2a, + 0x9a, 0x85, 0x97, 0x99, 0x9a, 0x71, 0x6f, 0x58, + 0x6b, 0x91, 0x81, 0x6b, 0x71, 0x5d, 0x6f, 0x6f, + 0x90, 0x6b, 0x97, 0x99, 0x90, 0x6a, 0x6a, 0x85, + 0x58, 0x6b, 0x81, 0x71, 0x5d, 0x6b, 0x1b, 0x90, + 0x85, 0x5d, 0x90, 0x90, 0x90, 0x71, 0x5d, 0x6b, + 0x5d, 0x5d, 0x5d, 0x5d, 0x71, 0x6b, 0x85, 0x63, + 0x66, 0x5d, 0x6b, 0x5d, 0x58, 0x71, 0x6b, 0x6b, + 0x6b, 0x6b, 0x71, 0xb0, 0x85, 0x6f, 0x90, 0x99, + 0x88, 0x5d, 0x6b, 0x71, 0x58, 0x71, 0x81, 0x81, + 0x6b, 0x6b, 0x71, 0x63, 0x66, 0x63, 0x71, 0x59, + 0x4d, 0x3a, 0x6b, 0x6b, 0x71, 0x71, 0x59, 0x71, + 0x71, 0x63, 0x59, 0x80, 0x54, 0x70, 0x59, 0x67, + 0x70, 0x54, 0x80, 0x99, 0x70, 0x3f, 0x1d, 0x1d, + 0x70, 0x16, 0x16, 0x3d, 0x16, 0x16, 0x16, 0xf2, + 0x16, 0x16, 0x3d, 0x70, 0x70, 0x70, 0x34, 0xfa, + 0x15, 0xee, 0xf2, 0xf2, 0xf2, 0xf2, 0x14, 0xee, + 0xee, 0x14, 0xee, 0x16, 0xe1, 0xee, 0xf2, 0xeb, + 0xf2, 0xee, 0xf2, 0xee, 0x14, 0x14, 0x16, 0xee, + 0xee, 0x16, 0x16, 0xee, 0xee, 0x14, 0x14, 0x16, + 0xee, 0x14, 0x14, 0x14, 0xee, 0x16, 0xf2, 0xf2, + 0x15, 0xeb, 0xfa, 0x34, 0xeb, 0x15, 0x3d, 0xeb, + 0x39, 0xfa, 0xeb, 0x34, 0x34, 0xeb, 0xfa, 0x39, + 0x5d, 0x7e, 0x9c, 0x28, 0x30, 0x62, 0x37, 0x68, + 0x8d, 0x8b, 0x8d, 0x68, 0x32, 0x98, 0x5e, 0xfc, + 0x98, 0x98, 0x68, 0x68, 0x5e, 0x98, 0x5e, 0x68, + 0x68, 0x98, 0x46, 0x5e, 0x8b, 0x98, 0x68, 0x68, + 0x98, 0x98, 0x68, 0xa3, 0x98, 0x98, 0x68, 0x68, + 0x68, 0x75, 0x0, 0xa3, 0x98, 0x4e, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0xa3, 0x98, + 0x8d, 0x8d, 0x4e, 0x8d, 0x8d, 0x4e, 0x0, 0x4e, + 0x68, 0x68, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x98, 0x93, 0x37, 0x37, 0xa8, 0x9c, 0x82, + 0x28, 0x2f, 0x98, 0x5e, 0x8d, 0x98, 0x62, 0x1e, + 0x79, 0x74, 0x9c, 0x46, 0x27, 0xb0, 0xb0, 0x83, + 0x6e, 0x73, 0xf2, 0x34, 0x73, 0xeb, 0x34, 0x17, + 0x16, 0x16, 0xf2, 0x16, 0x3d, 0x16, 0x16, 0x16, + 0xf2, 0xf2, 0xf2, 0xeb, 0x15, 0xeb, 0xf2, 0x15, + 0x15, 0xee, 0x16, 0xf5, 0x15, 0xf2, 0xf2, 0xfa, + 0x67, 0x80, 0x23, 0x23, 0x67, 0xea, 0x73, 0xeb, + 0x15, 0x34, 0xfa, 0x15, 0xeb, 0xeb, 0x16, 0xee, + 0x3b, 0x73, 0x16, 0x15, 0x3f, 0x48, 0xeb, 0x15, + 0x15, 0x17, 0x3d, 0x3d, 0x17, 0x15, 0x16, 0x16, + 0xeb, 0x73, 0x34, 0x15, 0x1c, 0xfe, 0x6e, 0x6e, + 0x99, 0x4d, 0x39, 0x7f, 0x59, 0x71, 0x90, 0x99, + 0x71, 0x6a, 0x6a, 0x90, 0x85, 0x58, 0x6f, 0x90, + 0x6b, 0x6a, 0x5d, 0x67, 0x9d, 0x90, 0x99, 0x42, + 0x31, 0x58, 0x90, 0xaf, 0x85, 0x5d, 0x31, 0x85, + 0x85, 0x81, 0x6b, 0x4d, 0x31, 0x6a, 0x6a, 0x90, + 0x90, 0x31, 0x9a, 0x90, 0x6f, 0x6b, 0x6b, 0x4c, + 0x6b, 0x6b, 0x81, 0x58, 0x71, 0x81, 0x81, 0x6f, + 0x71, 0x6b, 0x85, 0x9a, 0x99, 0x6b, 0x6b, 0x63, + 0x71, 0x81, 0x6b, 0x71, 0x63, 0x31, 0x5d, 0x6f, + 0x9a, 0x71, 0x58, 0x71, 0x5d, 0x6b, 0x6b, 0x58, + 0x6f, 0x71, 0x6b, 0x6b, 0x80, 0x67, 0x4d, 0x80, + 0xb4, 0x99, 0x80, 0x42, 0x48, 0x80, 0x71, 0x80, + 0x3b, 0x16, 0x3d, 0x3d, 0x70, 0x16, 0x16, 0x34, + 0xe1, 0xf2, 0x3b, 0x3b, 0x3d, 0x3d, 0x15, 0x16, + 0x16, 0x14, 0x16, 0x3d, 0x3d, 0xf2, 0xeb, 0x34, + 0x15, 0xee, 0xf2, 0xeb, 0xf2, 0x16, 0x16, 0x14, + 0x16, 0x14, 0x14, 0x16, 0xee, 0x16, 0xee, 0xee, + 0xee, 0x14, 0x16, 0x17, 0x16, 0x16, 0xee, 0x14, + 0x14, 0x14, 0xf2, 0xee, 0xee, 0xf2, 0xee, 0xf5, + 0x3d, 0x14, 0x14, 0x16, 0x15, 0xeb, 0xee, 0xee, + 0x16, 0xee, 0x15, 0xf2, 0xf2, 0xee, 0x15, 0xfa, + 0x23, 0x23, 0xe6, 0xea, 0xf1, 0xeb, 0xfa, 0x5a, + 0x3e, 0xe, 0x6c, 0x68, 0x68, 0x86, 0x5e, 0xa3, + 0xa3, 0x9e, 0x5e, 0xa3, 0x68, 0x68, 0xa3, 0x9f, + 0x5e, 0xa3, 0xa3, 0x9e, 0x5e, 0x4e, 0xa3, 0x4e, + 0x68, 0x68, 0xa3, 0x68, 0xa3, 0x4e, 0xa3, 0xa3, + 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x7, 0xa7, 0x37, 0x1e, 0xa7, 0x28, 0x5e, + 0x5e, 0x8d, 0x5e, 0xa3, 0x68, 0x82, 0x46, 0x5e, + 0x82, 0xa8, 0xa0, 0x28, 0x30, 0x60, 0x60, 0xa8, + 0xb, 0x73, 0xeb, 0x15, 0x34, 0xeb, 0xee, 0xee, + 0x16, 0x16, 0x14, 0x16, 0xee, 0xee, 0xf2, 0x16, + 0x15, 0xee, 0xf2, 0xf2, 0x16, 0x16, 0xee, 0xf2, + 0xee, 0xee, 0xee, 0xf2, 0x15, 0x15, 0xf2, 0x34, + 0x23, 0x34, 0x1, 0x15, 0x15, 0xe1, 0xeb, 0xeb, + 0xeb, 0x15, 0xeb, 0xde, 0xfa, 0xfa, 0xf2, 0x16, + 0x15, 0x16, 0x14, 0x16, 0x17, 0xf2, 0xe1, 0x15, + 0xfa, 0x23, 0x15, 0x22, 0x21, 0x15, 0x3b, 0x16, + 0x3d, 0x34, 0x34, 0xf2, 0xeb, 0xe6, 0xd8, 0xe6, + 0x41, 0x41, 0x39, 0x99, 0x6f, 0x6a, 0x5d, 0x80, + 0x5d, 0x7e, 0xaf, 0x99, 0x6f, 0x6a, 0x6a, 0x6a, + 0x7e, 0x7e, 0x7e, 0x6a, 0x5d, 0x6a, 0x58, 0x7f, + 0x99, 0x9d, 0x66, 0x7f, 0x97, 0x6a, 0x6a, 0x5d, + 0x6b, 0x6a, 0x91, 0x5d, 0x6f, 0x6a, 0x6f, 0x26, + 0x7f, 0x41, 0x99, 0x99, 0x97, 0x6a, 0x6a, 0x81, + 0x95, 0x6a, 0x6a, 0x71, 0x9a, 0x83, 0x91, 0x90, + 0x6a, 0x6a, 0x6b, 0x71, 0x71, 0x6a, 0x81, 0x6b, + 0x81, 0x6a, 0x81, 0x6f, 0x80, 0x90, 0x71, 0x5d, + 0x5d, 0x71, 0x81, 0x6b, 0x81, 0x71, 0x59, 0x6b, + 0x71, 0x5d, 0x6f, 0x85, 0x7f, 0x7f, 0x54, 0x73, + 0xeb, 0xa, 0x7f, 0x6e, 0xa, 0x6e, 0x41, 0x99, + 0x73, 0x16, 0x3d, 0x3d, 0x16, 0xf2, 0x16, 0x16, + 0xf2, 0x16, 0x3d, 0xf2, 0x3d, 0x16, 0x17, 0x16, + 0x14, 0xff, 0x3d, 0x16, 0xf2, 0xf2, 0xeb, 0xee, + 0xee, 0x16, 0x16, 0x14, 0x16, 0xee, 0x3d, 0xee, + 0xf2, 0xf5, 0x16, 0xee, 0xee, 0x16, 0x16, 0x14, + 0x14, 0x14, 0x16, 0xe1, 0xee, 0x14, 0x16, 0x16, + 0x14, 0x14, 0x16, 0x16, 0xee, 0xee, 0xee, 0xf2, + 0xee, 0x16, 0x16, 0xf2, 0xf2, 0xee, 0xee, 0xf2, + 0xee, 0x16, 0xf2, 0xee, 0x15, 0xf2, 0x16, 0xfa, + 0xfa, 0x34, 0x15, 0xd8, 0xd8, 0xfa, 0x5a, 0x50, + 0x27, 0x24, 0xfc, 0x5e, 0x68, 0x5e, 0x4e, 0x86, + 0x68, 0x68, 0x68, 0x9e, 0xa3, 0x68, 0xa3, 0x68, + 0x86, 0x68, 0x86, 0x5e, 0x4e, 0x9f, 0xa3, 0x9e, + 0x5e, 0x68, 0x68, 0x9f, 0x68, 0x68, 0xa3, 0xa3, + 0xa3, 0x68, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x5e, 0x8d, 0x0, 0x4e, 0x8d, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x9f, 0x7, 0x9f, 0xa3, 0x68, 0xa3, 0x32, 0x9e, + 0xa3, 0x68, 0x68, 0xa3, 0x68, 0x9f, 0xb8, 0x9f, + 0xa3, 0x9f, 0x8, 0x5e, 0x9f, 0x28, 0xe, 0xf3, + 0xe3, 0xa, 0x15, 0xfa, 0xeb, 0xf2, 0xf2, 0xeb, + 0xee, 0x14, 0x14, 0x14, 0xee, 0xee, 0xf2, 0x15, + 0xf2, 0x16, 0xee, 0xee, 0xee, 0x16, 0x16, 0xe1, + 0xee, 0x14, 0xee, 0xf2, 0xf2, 0x16, 0xf2, 0xeb, + 0x34, 0x15, 0x15, 0xf2, 0xf2, 0xf2, 0xf2, 0xeb, + 0xeb, 0xf2, 0xeb, 0xf5, 0x15, 0x15, 0xee, 0xee, + 0x15, 0xee, 0x16, 0x16, 0xee, 0x16, 0x14, 0xee, + 0xeb, 0xfa, 0xfa, 0x2b, 0x1c, 0x39, 0xfa, 0x3d, + 0x3d, 0x3d, 0xeb, 0x34, 0x15, 0x1, 0xeb, 0xeb, + 0x8a, 0x3, 0xcb, 0x99, 0x90, 0x1b, 0x6a, 0x97, + 0x6f, 0x6a, 0x20, 0x67, 0x85, 0x5d, 0xb0, 0x56, + 0x6f, 0x6a, 0x6a, 0x83, 0x90, 0x83, 0x1b, 0x4d, + 0x9a, 0x6f, 0x4d, 0x7f, 0x3a, 0x6a, 0x6a, 0x83, + 0x90, 0x6f, 0x6a, 0x83, 0x97, 0x6f, 0x5d, 0x58, + 0x3a, 0x5d, 0x4d, 0x4d, 0x58, 0x6a, 0x6a, 0x81, + 0x6f, 0x5d, 0x5d, 0x85, 0x97, 0x6f, 0x5d, 0x5d, + 0x6f, 0x81, 0x6b, 0x6b, 0x71, 0x58, 0x6b, 0x6b, + 0x6f, 0xb0, 0x5d, 0x71, 0x63, 0x97, 0x71, 0x31, + 0x58, 0x6b, 0x6b, 0x6b, 0x6f, 0x85, 0x71, 0x9a, + 0x9a, 0x90, 0x58, 0x63, 0x58, 0x99, 0x48, 0x3d, + 0x16, 0x16, 0xf2, 0xf2, 0xee, 0x15, 0x48, 0x73, + 0xee, 0x3d, 0x34, 0x16, 0x16, 0x15, 0x3d, 0x16, + 0x16, 0x16, 0x14, 0x16, 0xee, 0x16, 0x14, 0x14, + 0x16, 0x14, 0x16, 0x16, 0xf2, 0xf2, 0xf2, 0x16, + 0x16, 0x14, 0x16, 0x16, 0x16, 0xee, 0xee, 0xee, + 0xf2, 0xee, 0xf2, 0x14, 0x14, 0x16, 0x16, 0x16, + 0x16, 0x14, 0x14, 0x14, 0x16, 0x14, 0x16, 0x3d, + 0x16, 0x16, 0xf5, 0xf2, 0x16, 0x14, 0xee, 0x14, + 0xee, 0xee, 0x16, 0x16, 0xf2, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0x3d, 0xf2, 0x16, 0xf2, 0x16, + 0xf2, 0xf2, 0xeb, 0xeb, 0xeb, 0xa, 0x5a, 0x2c, + 0x12, 0x4a, 0x30, 0x5e, 0x5e, 0x98, 0x82, 0xf, + 0x8d, 0x98, 0x68, 0x68, 0xfc, 0x98, 0x5e, 0xa3, + 0x79, 0x8b, 0x30, 0x68, 0x8b, 0x8b, 0x68, 0x8, + 0x93, 0x8b, 0x5e, 0x9f, 0x98, 0x8b, 0x32, 0xa3, + 0x79, 0x98, 0x68, 0x68, 0x8b, 0x79, 0x4e, 0xa3, + 0x98, 0x98, 0x4e, 0x4e, 0x98, 0x98, 0xa3, 0x4e, + 0x98, 0x4e, 0x4e, 0x4e, 0x7d, 0x4e, 0x4e, 0x5e, + 0x8d, 0x8d, 0x8d, 0x8d, 0x68, 0x68, 0x0, 0x0, + 0x68, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0xfc, 0x5e, 0x68, 0xa3, 0x5e, 0x6c, 0x6c, + 0x68, 0x5e, 0x7, 0x8, 0xfc, 0x76, 0xe, 0x5e, + 0x9f, 0xfc, 0x37, 0xa2, 0x68, 0xa7, 0x50, 0xe3, + 0xd4, 0xcb, 0xa, 0xe6, 0xe6, 0xfa, 0xeb, 0xeb, + 0x3d, 0x14, 0xf2, 0x14, 0x16, 0x14, 0xee, 0xeb, + 0xee, 0xee, 0xf2, 0xeb, 0xee, 0x16, 0x14, 0xee, + 0x14, 0x14, 0x14, 0xee, 0xee, 0x16, 0xee, 0xe1, + 0xeb, 0xf2, 0x15, 0xde, 0xf2, 0xee, 0xee, 0x16, + 0x16, 0xff, 0x16, 0x14, 0x16, 0xee, 0xee, 0xee, + 0xf2, 0xf2, 0x3d, 0x3d, 0x3b, 0x3b, 0x16, 0x3d, + 0x3d, 0xf2, 0xf2, 0xfa, 0xeb, 0x15, 0x1, 0x34, + 0x2b, 0x34, 0x2b, 0x21, 0x70, 0x15, 0x2b, 0x2b, + 0xf2, 0xeb, 0x34, 0x21, 0x7f, 0x26, 0x90, 0x85, + 0x71, 0x6f, 0x58, 0x71, 0x6b, 0x5d, 0x4d, 0x4d, + 0x63, 0x5d, 0xb0, 0xb0, 0x63, 0x6f, 0x71, 0x6b, + 0x71, 0x6b, 0x58, 0x59, 0x58, 0x71, 0x71, 0x9a, + 0x7f, 0x67, 0x90, 0x6f, 0x90, 0x5d, 0x31, 0x6b, + 0x81, 0x6b, 0x71, 0x58, 0x71, 0x6f, 0x6b, 0x6a, + 0x41, 0x4d, 0x63, 0x9a, 0x63, 0x71, 0x58, 0x58, + 0x6b, 0x71, 0x71, 0x71, 0x9a, 0x80, 0x6b, 0x6b, + 0x71, 0x85, 0x6b, 0x71, 0x71, 0x71, 0x71, 0x59, + 0x59, 0x71, 0x71, 0x6b, 0x63, 0x42, 0x67, 0x48, + 0x3f, 0x80, 0x67, 0x42, 0x80, 0x80, 0x3f, 0x3b, + 0x16, 0x14, 0x16, 0x14, 0x14, 0x14, 0x16, 0xf2, + 0x16, 0x3d, 0xf2, 0x16, 0x16, 0x3d, 0x3d, 0x3d, + 0x16, 0x3d, 0x16, 0xff, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x16, 0xf2, 0xee, 0x16, 0x16, 0x16, 0xee, + 0x16, 0xf2, 0x16, 0x16, 0xf2, 0xf2, 0xee, 0x14, + 0xee, 0x16, 0xee, 0xee, 0x14, 0x16, 0x15, 0xee, + 0xee, 0x14, 0xff, 0x14, 0xff, 0x14, 0x16, 0xf2, + 0xf2, 0x16, 0xf2, 0xf2, 0xee, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0xf5, 0xee, 0xf2, 0xf2, 0x16, + 0x16, 0x14, 0x16, 0x16, 0xee, 0x16, 0xee, 0xf2, + 0xf2, 0xf2, 0xf2, 0x34, 0xfa, 0x54, 0x41, 0xe, + 0x46, 0x8b, 0x8d, 0x9f, 0x37, 0x8d, 0x5e, 0x6c, + 0x5e, 0x98, 0x4e, 0x68, 0x68, 0x79, 0x79, 0xa3, + 0x68, 0x98, 0x8d, 0x5e, 0x82, 0x98, 0x68, 0x68, + 0x68, 0x8b, 0x86, 0x68, 0x98, 0x8b, 0x68, 0x4e, + 0x5e, 0x68, 0x4e, 0x4e, 0x8b, 0x68, 0x4e, 0x4e, + 0x68, 0x4e, 0x4e, 0x4e, 0x68, 0x4e, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0x8d, 0x4e, 0x0, 0x4e, + 0x8d, 0x68, 0x68, 0x68, 0x68, 0x68, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x37, 0x98, 0x98, 0x5e, 0x5e, 0x7d, 0xa6, 0x8, + 0x8d, 0x8b, 0x8e, 0x82, 0x8d, 0x8b, 0x8b, 0x8d, + 0x68, 0x62, 0x9c, 0x7, 0x37, 0xaa, 0xb, 0xd0, + 0xcb, 0xa, 0xd8, 0xeb, 0xee, 0x15, 0xfa, 0xeb, + 0xf5, 0x16, 0x16, 0xee, 0x16, 0x16, 0x16, 0xee, + 0xee, 0xee, 0x15, 0xeb, 0xf2, 0x16, 0x14, 0xf2, + 0xf2, 0x16, 0x16, 0x14, 0xee, 0xee, 0x14, 0x16, + 0xf2, 0xee, 0xe1, 0xeb, 0xeb, 0x16, 0x16, 0xf2, + 0x16, 0x16, 0x16, 0xf2, 0x16, 0x14, 0x16, 0xf2, + 0x16, 0x16, 0xf2, 0xeb, 0x34, 0xeb, 0x15, 0xf5, + 0xf2, 0xf2, 0x34, 0xeb, 0x34, 0x34, 0xf2, 0x34, + 0xeb, 0xf2, 0xee, 0x15, 0x15, 0xf2, 0xf2, 0x15, + 0x34, 0x70, 0x54, 0xeb, 0x34, 0x2b, 0x48, 0x99, + 0x6f, 0x90, 0x85, 0x71, 0x85, 0x71, 0x6f, 0x6f, + 0x6f, 0x83, 0x20, 0x58, 0x71, 0x6f, 0x99, 0x71, + 0x71, 0x6f, 0x5d, 0x6f, 0x9a, 0x90, 0x6b, 0x5d, + 0x58, 0x71, 0x58, 0x58, 0x6b, 0x5d, 0x9a, 0x85, + 0x6a, 0x83, 0x6b, 0x71, 0x83, 0x83, 0x6a, 0x71, + 0x6b, 0x6b, 0x9a, 0x67, 0x80, 0x3a, 0x80, 0x9a, + 0x85, 0x85, 0x90, 0x71, 0x85, 0x85, 0x71, 0x58, + 0x71, 0x71, 0x71, 0x80, 0x67, 0x67, 0x80, 0x9a, + 0x9a, 0x9a, 0x67, 0x71, 0x6b, 0x71, 0x85, 0x42, + 0x4d, 0x63, 0x48, 0x3d, 0x70, 0x70, 0x16, 0x3d, + 0x3d, 0x16, 0x16, 0x16, 0x17, 0x3f, 0x3d, 0x16, + 0x16, 0x14, 0xff, 0x16, 0x18, 0x16, 0x16, 0xf2, + 0xf2, 0xeb, 0x17, 0x3d, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0xf2, 0x16, 0x16, 0x16, 0xee, 0xee, + 0xee, 0xee, 0xf2, 0xf2, 0xf2, 0x15, 0x15, 0xf5, + 0xf2, 0xf2, 0x16, 0x16, 0x16, 0xf2, 0xeb, 0xe1, + 0xee, 0xf2, 0xeb, 0xf5, 0xf2, 0x17, 0xf2, 0x15, + 0xf2, 0x16, 0xf2, 0xf2, 0x16, 0x15, 0xeb, 0xde, + 0xf2, 0x15, 0xeb, 0xe6, 0x34, 0x15, 0xfa, 0xf2, + 0xf2, 0x15, 0x15, 0xf2, 0x3d, 0xf2, 0xeb, 0xe6, + 0xeb, 0x3f, 0x39, 0xcb, 0x5a, 0xfd, 0x1b, 0xcc, + 0x7, 0x5e, 0x9f, 0xfc, 0xfc, 0x5e, 0xa3, 0x68, + 0x68, 0x4e, 0x5e, 0x4e, 0x68, 0x68, 0xa3, 0x8, + 0x7, 0x68, 0x68, 0x9e, 0x68, 0x68, 0xa3, 0x4e, + 0x9e, 0x5e, 0xa3, 0x68, 0x9f, 0xa3, 0xa3, 0xa3, + 0x68, 0xa3, 0x4e, 0x4e, 0x0, 0xa3, 0x68, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x5e, 0xb7, 0x7, 0x6c, 0x8d, 0xa7, 0x6c, + 0xa3, 0x28, 0x79, 0x9f, 0x5e, 0x82, 0x37, 0x6c, + 0x5e, 0x82, 0xc, 0xdd, 0xf7, 0x5f, 0xc, 0xc8, + 0x5a, 0xe6, 0x1, 0x15, 0x2b, 0xf2, 0xee, 0xee, + 0xee, 0x16, 0xeb, 0xee, 0x14, 0xee, 0x16, 0xf2, + 0xf2, 0x16, 0xeb, 0xd8, 0xde, 0xf2, 0xee, 0xee, + 0xf2, 0xee, 0xf2, 0x16, 0x16, 0x14, 0x16, 0x16, + 0xf2, 0xf2, 0xf2, 0xf2, 0xee, 0xf2, 0xeb, 0xeb, + 0xf2, 0xf2, 0xeb, 0x15, 0xeb, 0x15, 0x15, 0xf2, + 0x16, 0x16, 0x16, 0xe1, 0xf2, 0xeb, 0xd8, 0xd8, + 0xfa, 0xfa, 0xf9, 0x5a, 0x6e, 0xfa, 0xfa, 0xeb, + 0xee, 0xeb, 0xf2, 0x3d, 0xee, 0x15, 0x15, 0x34, + 0x34, 0xeb, 0x2a, 0x23, 0x34, 0x34, 0x2b, 0x36, + 0x7f, 0x6e, 0x5a, 0x90, 0x9a, 0x41, 0x97, 0x96, + 0x6a, 0x6a, 0x58, 0x58, 0x6a, 0x7a, 0x66, 0x63, + 0x41, 0x41, 0xaf, 0x6a, 0x6f, 0x83, 0x90, 0x6b, + 0x71, 0x6a, 0x4a, 0x31, 0x58, 0x5d, 0x9a, 0x71, + 0x90, 0x41, 0x90, 0x85, 0x5d, 0x5d, 0x58, 0x71, + 0x81, 0x4a, 0x5d, 0x31, 0x4d, 0x99, 0x7f, 0x99, + 0x90, 0x41, 0x41, 0x90, 0x5d, 0x83, 0x41, 0x31, + 0x59, 0x90, 0x85, 0x67, 0x48, 0x48, 0x70, 0x7f, + 0x9a, 0x67, 0x48, 0x42, 0x5d, 0x5d, 0x85, 0x58, + 0x31, 0x90, 0x6e, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3d, 0x16, 0x16, 0x16, 0x16, 0x70, 0x70, 0x14, + 0x14, 0x14, 0x16, 0x16, 0x3d, 0xf2, 0x16, 0x16, + 0xf2, 0xf2, 0x1, 0x34, 0x3d, 0xf5, 0xf5, 0x16, + 0xf5, 0xf5, 0xeb, 0xf2, 0xf2, 0xee, 0x16, 0xf2, + 0x16, 0xf2, 0x15, 0x15, 0xf2, 0xf2, 0xeb, 0xeb, + 0xeb, 0xf5, 0xf2, 0xf2, 0xeb, 0x3d, 0xf5, 0x16, + 0xf2, 0xf2, 0xd7, 0xd7, 0xde, 0xeb, 0xe6, 0xcb, + 0xe6, 0x2a, 0xa, 0x15, 0xfa, 0x23, 0x9, 0xeb, + 0x15, 0xfa, 0xe0, 0xd0, 0xd0, 0xcb, 0xcb, 0xcb, + 0xf1, 0x7f, 0x39, 0xfa, 0x2a, 0x34, 0xea, 0xe6, + 0xd8, 0x54, 0xcb, 0xd0, 0xbf, 0x83, 0x3e, 0xf8, + 0xf7, 0x5e, 0x9e, 0xa3, 0x28, 0x5e, 0x68, 0xa3, + 0xa3, 0x68, 0x5e, 0xa3, 0x7, 0xa3, 0x4e, 0x68, + 0x5e, 0x5e, 0x68, 0x4e, 0x68, 0x5e, 0x68, 0xa3, + 0x9f, 0x68, 0x86, 0x5e, 0x7, 0x9f, 0xa3, 0xa3, + 0xa3, 0x68, 0x4e, 0xa3, 0xa3, 0x68, 0x4e, 0xa3, + 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x5e, 0x8d, 0x0, 0x68, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x9f, 0x32, 0x7, 0xdd, 0xfc, 0x6c, 0x28, 0x68, + 0x68, 0xfc, 0x5e, 0xa3, 0x68, 0x9e, 0xa0, 0xf3, + 0x7, 0x9f, 0x6c, 0xf7, 0xe, 0xe, 0x6c, 0xa0, + 0x50, 0x23, 0x34, 0x15, 0xee, 0xf2, 0xee, 0xee, + 0x16, 0xee, 0xeb, 0xe1, 0xee, 0x16, 0xeb, 0xeb, + 0xe1, 0xf5, 0xde, 0xd8, 0xeb, 0xeb, 0xf2, 0xf2, + 0xe1, 0xee, 0xf2, 0xeb, 0xee, 0x16, 0x3d, 0x15, + 0x15, 0xeb, 0xeb, 0xeb, 0xf2, 0xf2, 0xde, 0xde, + 0xf2, 0xf2, 0xe6, 0xe6, 0xa, 0xde, 0xfa, 0xde, + 0xf2, 0xf2, 0x34, 0xeb, 0xee, 0xee, 0xde, 0xde, + 0xde, 0xde, 0xf9, 0xf4, 0xf4, 0xa, 0xf1, 0x15, + 0xee, 0xf2, 0x15, 0xeb, 0xf2, 0xf2, 0xee, 0x15, + 0x15, 0xf2, 0x15, 0x23, 0x3f, 0x34, 0x21, 0x1d, + 0x54, 0x34, 0x54, 0x99, 0x99, 0x54, 0x39, 0x99, + 0x41, 0x92, 0x4a, 0x58, 0x90, 0x97, 0x90, 0x58, + 0x80, 0x7f, 0x99, 0x6f, 0x5d, 0x90, 0x99, 0x71, + 0x5d, 0x6a, 0x83, 0x63, 0x63, 0x97, 0x83, 0x71, + 0x85, 0x63, 0x99, 0x71, 0x71, 0x58, 0x85, 0x58, + 0x6b, 0x90, 0x41, 0x9a, 0x4d, 0x66, 0x99, 0x4d, + 0x6f, 0x99, 0x23, 0x39, 0x99, 0x41, 0x23, 0x42, + 0x67, 0x99, 0x54, 0x7f, 0x7f, 0x48, 0x48, 0x59, + 0x58, 0x63, 0x70, 0x3f, 0x9a, 0x83, 0x99, 0x4d, + 0x67, 0xf1, 0x73, 0x3b, 0x48, 0x70, 0x3d, 0x16, + 0x16, 0x3d, 0x3d, 0x3d, 0x18, 0x16, 0x3d, 0x16, + 0x16, 0x16, 0x3d, 0xf5, 0xf2, 0xf2, 0x16, 0x16, + 0x3d, 0xf2, 0xeb, 0x15, 0xeb, 0x15, 0xee, 0xf2, + 0xeb, 0xeb, 0x15, 0xf2, 0xf2, 0x3d, 0x15, 0x15, + 0xee, 0x15, 0x1, 0xeb, 0xeb, 0x15, 0x15, 0xd8, + 0xfa, 0x73, 0x73, 0xeb, 0xfa, 0x48, 0x34, 0xeb, + 0x15, 0xeb, 0xde, 0xd8, 0xd8, 0x6e, 0x3, 0xd0, + 0xd4, 0x41, 0x5a, 0x3, 0x5a, 0x67, 0x5a, 0xc9, + 0xa, 0xa, 0xcb, 0xd4, 0xd0, 0xb4, 0xb, 0xe3, + 0xb, 0x83, 0xb0, 0xb, 0x3, 0x7f, 0x7f, 0xc9, + 0xeb, 0x2a, 0x3, 0xd0, 0xd4, 0x4a, 0x74, 0x76, + 0x76, 0x98, 0x5e, 0x68, 0x5e, 0x8d, 0x68, 0xa3, + 0x7, 0x8d, 0x5e, 0x9e, 0x68, 0x8d, 0x68, 0x68, + 0x79, 0x8b, 0x68, 0x4e, 0x8d, 0x8b, 0x86, 0x68, + 0x9c, 0x9c, 0x68, 0xa3, 0x8b, 0x8b, 0x68, 0x4e, + 0x75, 0x98, 0xa3, 0xa3, 0x98, 0x98, 0xa3, 0x4e, + 0x8d, 0x93, 0xa3, 0x4e, 0x98, 0xa3, 0x4e, 0x4e, + 0x8d, 0xa3, 0x0, 0x4e, 0x8d, 0x76, 0x0, 0x68, + 0x68, 0x68, 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x75, 0x82, 0x82, 0x37, 0x37, 0x82, 0x76, 0x6c, + 0x6c, 0x46, 0x1e, 0xb8, 0x6c, 0x6c, 0x46, 0x1f, + 0x28, 0x8d, 0x8d, 0x28, 0x1f, 0x62, 0x9c, 0xbf, + 0xb4, 0xa, 0xeb, 0xeb, 0xf2, 0x15, 0x34, 0xf2, + 0x16, 0xf2, 0xee, 0xee, 0x16, 0xee, 0x15, 0xde, + 0xeb, 0xf2, 0xeb, 0xe6, 0xe6, 0xfa, 0xfa, 0xf5, + 0xf2, 0xe1, 0x16, 0xee, 0x16, 0x16, 0x3d, 0xeb, + 0x15, 0xfa, 0x23, 0x23, 0x15, 0x34, 0x39, 0xeb, + 0xf2, 0xf2, 0xe1, 0xde, 0xde, 0xde, 0xd8, 0xde, + 0xeb, 0xeb, 0xfa, 0xfa, 0xf5, 0xf2, 0xeb, 0xeb, + 0xf5, 0xeb, 0xfa, 0xe6, 0xe6, 0xeb, 0xd8, 0xeb, + 0xeb, 0xf2, 0x3b, 0x2b, 0x15, 0xf2, 0x15, 0x1, + 0xf2, 0xf2, 0x34, 0xeb, 0xeb, 0xeb, 0x15, 0xfa, + 0x34, 0x15, 0x48, 0x31, 0x48, 0x34, 0x34, 0x3f, + 0x73, 0x54, 0x7f, 0x9a, 0x90, 0x6e, 0x99, 0x9a, + 0x85, 0x58, 0x58, 0x58, 0x71, 0x80, 0x39, 0x9a, + 0x99, 0x54, 0x99, 0x9a, 0x9a, 0x9a, 0x9a, 0x71, + 0x71, 0x71, 0x71, 0x59, 0x6b, 0x85, 0x67, 0x71, + 0x80, 0x6e, 0x54, 0x99, 0x9a, 0x99, 0x67, 0x63, + 0x58, 0x99, 0x48, 0x1d, 0x1d, 0x2b, 0x2b, 0x54, + 0x48, 0x70, 0x48, 0x67, 0x63, 0x63, 0x80, 0x59, + 0x59, 0x80, 0x70, 0x3f, 0x42, 0x48, 0x3b, 0x70, + 0x3d, 0x34, 0x3d, 0x3b, 0x70, 0x3f, 0x3d, 0x3d, + 0x3b, 0x3b, 0x3d, 0x14, 0x16, 0x3d, 0x16, 0x3d, + 0x16, 0x3d, 0x14, 0x16, 0x3b, 0x21, 0x34, 0x15, + 0xfa, 0x2a, 0x34, 0xeb, 0x39, 0x39, 0x34, 0x2b, + 0x2a, 0x7f, 0x73, 0x1, 0xfa, 0x39, 0xea, 0x34, + 0xa, 0xf1, 0x54, 0xea, 0x23, 0x39, 0x23, 0xfa, + 0x39, 0x6f, 0x41, 0xcb, 0xcb, 0xf9, 0xea, 0xcb, + 0xcb, 0x5a, 0xf9, 0xf9, 0x41, 0x6a, 0x60, 0xf8, + 0x11, 0x60, 0x60, 0x50, 0xd4, 0x6, 0x20, 0xb4, + 0xd4, 0x97, 0x40, 0xec, 0x40, 0x6a, 0x74, 0xe, + 0x2c, 0x27, 0xa8, 0xba, 0xbf, 0x6, 0xfd, 0xfd, + 0xe5, 0x90, 0x60, 0x40, 0x20, 0x94, 0x93, 0x5e, + 0x82, 0x46, 0x37, 0x5e, 0x6c, 0x98, 0x8d, 0x68, + 0x28, 0x8d, 0x9e, 0xa3, 0x5e, 0x98, 0x68, 0x4e, + 0x5e, 0x98, 0x28, 0x5e, 0x6c, 0x7d, 0x68, 0xa3, + 0x7d, 0x8b, 0x68, 0x4e, 0x8d, 0x98, 0x68, 0x4e, + 0xa3, 0x68, 0xa3, 0xa3, 0x98, 0x5e, 0x4e, 0xa3, + 0x68, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, + 0xa3, 0x4e, 0x4e, 0x4e, 0x8d, 0x0, 0x0, 0x4e, + 0x68, 0x68, 0x68, 0xa3, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x8f, 0x8f, 0x76, 0x76, 0x93, 0x74, 0xc, + 0x28, 0x98, 0x93, 0x28, 0x28, 0x98, 0x98, 0x5e, + 0x82, 0x62, 0x8e, 0x7, 0xb7, 0xaa, 0x83, 0xb4, + 0xa, 0x6e, 0x73, 0xeb, 0xf2, 0x21, 0x3f, 0x2a, + 0xf2, 0xf2, 0xf2, 0x16, 0x15, 0xf2, 0x15, 0xf2, + 0xf5, 0x73, 0x5a, 0xd7, 0xf1, 0x39, 0xfe, 0xcb, + 0xd8, 0xeb, 0xf5, 0xf2, 0x16, 0xf2, 0xf5, 0xf2, + 0xee, 0xfa, 0x6e, 0x5a, 0xa, 0xfa, 0xfb, 0xfa, + 0xeb, 0xf2, 0xe1, 0xeb, 0xe1, 0x15, 0xde, 0xde, + 0xf2, 0xeb, 0xed, 0x23, 0xe6, 0xd8, 0xe6, 0xe6, + 0xe6, 0xa, 0xcb, 0xea, 0xeb, 0xa, 0x2a, 0xe6, + 0xeb, 0xeb, 0xfa, 0xfd, 0xf1, 0xa, 0xe6, 0xe6, + 0x2a, 0xeb, 0x34, 0xf4, 0xeb, 0x34, 0x15, 0x34, + 0x15, 0x15, 0xfa, 0x48, 0xfa, 0x34, 0x70, 0x48, + 0x2b, 0x34, 0x67, 0x80, 0x54, 0x34, 0x70, 0x70, + 0x99, 0x56, 0x90, 0x4d, 0x85, 0xaf, 0x41, 0x63, + 0x54, 0x73, 0x34, 0x73, 0x54, 0x73, 0x21, 0x80, + 0x9a, 0x99, 0x85, 0x63, 0x58, 0x83, 0x90, 0x71, + 0x85, 0x42, 0x67, 0x42, 0x48, 0x2a, 0x48, 0x67, + 0x99, 0x6e, 0xa, 0x99, 0x31, 0xfe, 0x48, 0x7f, + 0x42, 0x7f, 0x34, 0x73, 0x54, 0x73, 0x70, 0x1d, + 0x1d, 0x73, 0x2b, 0x54, 0x67, 0x39, 0x15, 0x70, + 0x70, 0x34, 0x16, 0x15, 0x3d, 0x70, 0x16, 0x16, + 0x3d, 0xf2, 0xf5, 0x16, 0x3b, 0x16, 0x3d, 0x3d, + 0x3d, 0x3d, 0x3d, 0x16, 0x3d, 0xeb, 0xde, 0xeb, + 0x23, 0xfd, 0xe5, 0xa1, 0x2c, 0x2c, 0x1b, 0x41, + 0xb, 0xe9, 0xcb, 0xa, 0xf4, 0xd0, 0xd4, 0xd4, + 0xbf, 0x11, 0x40, 0x11, 0x2c, 0x2c, 0x40, 0x97, + 0x40, 0x2c, 0xa1, 0xd0, 0xe5, 0xb, 0xe4, 0xe4, + 0xdc, 0xf3, 0x2c, 0x2f, 0x5f, 0x28, 0x6c, 0x7, + 0xba, 0xf7, 0xb7, 0xce, 0xbe, 0xf8, 0x2c, 0xf3, + 0xf3, 0x37, 0x6c, 0xe, 0xa7, 0x28, 0x68, 0x7, + 0xb7, 0xb7, 0xf7, 0xdd, 0xcd, 0x8, 0xe, 0xa0, + 0x28, 0x28, 0x6c, 0xe, 0x2f, 0xa7, 0x9f, 0x9f, + 0x7, 0x8, 0x86, 0x4e, 0x9e, 0xa3, 0xa3, 0x68, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x9f, 0x5e, 0xa3, + 0x9f, 0x9f, 0x68, 0x9e, 0x4e, 0x9e, 0x4e, 0xa3, + 0x86, 0x4e, 0x4e, 0x4e, 0x9e, 0x6c, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0xa3, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0xa3, 0x4e, 0x4e, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5f, 0x38, 0x8f, 0xa0, 0x7, 0x76, 0x46, 0xa7, + 0x5e, 0x68, 0x68, 0x5e, 0x37, 0x8d, 0x82, 0x6c, + 0x7, 0x2f, 0x46, 0xa0, 0xa0, 0x9c, 0x60, 0x1b, + 0x5a, 0x99, 0x73, 0xeb, 0xf2, 0x15, 0xeb, 0xa, + 0xde, 0xeb, 0xe6, 0xe6, 0xa, 0xcb, 0x5a, 0xea, + 0xeb, 0xf1, 0x5a, 0xd7, 0xe6, 0xe6, 0xcb, 0xd9, + 0xd3, 0xcb, 0xcb, 0xe6, 0xfa, 0xf1, 0x23, 0xea, + 0x15, 0xeb, 0xf4, 0xd7, 0xd8, 0xd8, 0xe6, 0xe6, + 0xd8, 0xd8, 0xe0, 0xf9, 0xea, 0xf4, 0x5a, 0xa, + 0xf5, 0xeb, 0xe6, 0xd6, 0xd8, 0xd6, 0xe0, 0xed, + 0xd4, 0xd4, 0xb, 0xb, 0x5a, 0xf1, 0x5a, 0x3, + 0xa, 0xd8, 0xea, 0xe0, 0xd0, 0xe0, 0xd0, 0xe5, + 0x5a, 0x3, 0xfd, 0x41, 0x6e, 0xfa, 0xeb, 0x15, + 0xf5, 0xeb, 0x3d, 0xf2, 0x3d, 0xf2, 0xfa, 0xfa, + 0x3f, 0xfa, 0x41, 0xb, 0x39, 0xfa, 0x15, 0x34, + 0xeb, 0xe6, 0x7f, 0x99, 0x5a, 0xb4, 0xaf, 0x97, + 0x7f, 0x34, 0x3b, 0x48, 0x34, 0xfa, 0x3d, 0x2b, + 0xa, 0xeb, 0xa, 0x7f, 0x41, 0x83, 0x6a, 0x6a, + 0x6a, 0x6f, 0x63, 0x85, 0x58, 0x48, 0x54, 0x7f, + 0x26, 0x99, 0x23, 0x41, 0x1b, 0x90, 0x58, 0x6f, + 0x63, 0x66, 0x34, 0x3d, 0x16, 0x3d, 0x3d, 0x3d, + 0x2a, 0xee, 0xf2, 0xa, 0x26, 0xea, 0xfa, 0x34, + 0x54, 0xd8, 0x16, 0x16, 0x16, 0x3d, 0x16, 0x16, + 0x3d, 0x16, 0x16, 0xf2, 0xfa, 0x15, 0xf2, 0x15, + 0x15, 0x15, 0xf5, 0x15, 0xfa, 0x2a, 0xfa, 0x6e, + 0x6, 0x60, 0xa6, 0xf3, 0xf7, 0x6c, 0xa0, 0x50, + 0xbf, 0x50, 0x41, 0x5a, 0xda, 0x50, 0xe3, 0x50, + 0xf3, 0xf7, 0xe, 0xc, 0xa0, 0xa0, 0xa0, 0xc8, + 0xce, 0xf3, 0xba, 0x50, 0x50, 0xe, 0xa7, 0xf7, + 0xf7, 0x43, 0x37, 0x6c, 0x7, 0x7, 0x6c, 0xb8, + 0xcd, 0xa0, 0xe, 0xf7, 0xf7, 0x1e, 0x43, 0x7, + 0x28, 0x28, 0x28, 0x68, 0x7, 0xa0, 0x6c, 0x8, + 0xdd, 0xa0, 0x6c, 0x6c, 0x6c, 0x6c, 0x5e, 0xa2, + 0x6c, 0x7, 0x7, 0x9f, 0xbd, 0xb7, 0x7, 0x5e, + 0x28, 0x68, 0x68, 0x68, 0x68, 0xa3, 0x68, 0xa3, + 0x68, 0x5e, 0x32, 0xa3, 0x68, 0x7, 0xa3, 0x9e, + 0x68, 0x68, 0x68, 0x4e, 0x68, 0xa3, 0xa3, 0xa3, + 0xa3, 0x5e, 0x9f, 0xa3, 0xa3, 0x9f, 0x86, 0x4e, + 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, + 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa8, 0x74, 0x62, 0x8f, 0x37, 0x5e, 0x5e, 0x32, + 0x9e, 0xa3, 0x68, 0xa3, 0x32, 0x9e, 0x5e, 0xb6, + 0xdd, 0xfc, 0x28, 0x68, 0x6c, 0x37, 0xe, 0xf8, + 0xb, 0x6e, 0x1, 0xeb, 0xee, 0xf2, 0xf2, 0xeb, + 0xde, 0xd8, 0xcb, 0xf1, 0xd0, 0xd4, 0x50, 0xb, + 0xc9, 0xcb, 0xdb, 0xa, 0x73, 0xe6, 0xcb, 0xe0, + 0xcb, 0xdb, 0xd0, 0xe0, 0xd7, 0xcb, 0xd4, 0x5a, + 0xcb, 0xe6, 0xe6, 0xe6, 0x15, 0xf1, 0xe0, 0xe6, + 0xd8, 0xd3, 0xd4, 0x50, 0xbf, 0xc6, 0xc7, 0xd0, + 0xcb, 0xc9, 0xe0, 0xe0, 0xea, 0x3, 0xbf, 0x50, + 0xf0, 0xe4, 0xf3, 0xf3, 0xcc, 0xd4, 0xd0, 0xd4, + 0xcb, 0xcb, 0xd0, 0xe5, 0x5a, 0xb4, 0xe3, 0x50, + 0xe3, 0xd4, 0xbf, 0xcc, 0xd4, 0xe0, 0xc9, 0xd8, + 0xd8, 0xeb, 0x15, 0xee, 0x3d, 0xf2, 0x15, 0xfa, + 0x34, 0xfa, 0x39, 0xfd, 0xea, 0xeb, 0x1, 0x15, + 0xee, 0x34, 0xea, 0x6e, 0x73, 0x73, 0x54, 0x7f, + 0x7f, 0x34, 0x15, 0x34, 0x34, 0x34, 0x34, 0x70, + 0x3f, 0x3d, 0x3b, 0x73, 0xa, 0x6e, 0x41, 0x90, + 0x90, 0x99, 0x90, 0x85, 0x5d, 0x31, 0x7f, 0x99, + 0x7f, 0x48, 0x48, 0x67, 0x41, 0x99, 0x99, 0x80, + 0x7f, 0x7f, 0x73, 0x34, 0x15, 0x3d, 0x3b, 0x3f, + 0x3b, 0x16, 0x16, 0x15, 0x34, 0xfa, 0x34, 0x34, + 0x15, 0xf2, 0x16, 0xf2, 0x16, 0x16, 0x16, 0x1, + 0xf5, 0xf2, 0x3d, 0xf2, 0xf2, 0xeb, 0x15, 0xeb, + 0xf1, 0xfa, 0x54, 0xcb, 0x5a, 0xfd, 0xfe, 0x20, + 0x2c, 0x2c, 0xa6, 0x3e, 0xf3, 0xa7, 0xa8, 0xbb, + 0xcc, 0x2c, 0x4a, 0x60, 0xc, 0x12, 0x6a, 0x11, + 0xe, 0x76, 0x9c, 0xa8, 0xba, 0x2c, 0x74, 0xf3, + 0xf3, 0x2c, 0x27, 0x2c, 0xe, 0x5f, 0x74, 0x2f, + 0x2c, 0x62, 0x8f, 0xa7, 0xb7, 0x52, 0x74, 0x37, + 0xa0, 0x74, 0x55, 0x30, 0x5f, 0x74, 0x8f, 0xa7, + 0xc, 0x74, 0x7d, 0x6c, 0xb8, 0x2c, 0x27, 0x28, + 0x6c, 0x7d, 0x93, 0xfc, 0x46, 0x9c, 0x76, 0x9f, + 0xa0, 0x50, 0xa8, 0x8, 0xc, 0xa6, 0x55, 0x1f, + 0x82, 0x8b, 0x8d, 0x68, 0xfc, 0x8b, 0x68, 0x4e, + 0x5e, 0x9c, 0x62, 0x86, 0x5e, 0x98, 0x68, 0x28, + 0x98, 0x8b, 0x68, 0x4e, 0x68, 0x8b, 0x68, 0x4e, + 0x8b, 0x8b, 0x9f, 0x32, 0x8b, 0x98, 0x4e, 0xa3, + 0x98, 0x98, 0xa3, 0xa3, 0x98, 0x98, 0xa3, 0xa3, + 0x98, 0x79, 0xa3, 0xa3, 0x98, 0x4e, 0x0, 0x4e, + 0x8d, 0x8d, 0x0, 0x4e, 0x68, 0x68, 0x0, 0x68, + 0x4e, 0x4e, 0x0, 0xa3, 0xa3, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x4e, + 0xa3, 0x0, 0x0, 0x0, 0xa3, 0x4e, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x28, 0x82, 0x8f, 0xab, 0x46, 0x8d, 0x82, 0x5e, + 0x5e, 0xfc, 0x68, 0x9f, 0x7, 0x28, 0x82, 0x28, + 0x28, 0x76, 0x8d, 0x6c, 0xe, 0xaa, 0xa8, 0x50, + 0xd0, 0xd8, 0x15, 0xee, 0xeb, 0x34, 0x15, 0x15, + 0xf2, 0x15, 0xe6, 0xd8, 0xcb, 0xf4, 0xc8, 0xbe, + 0xbf, 0xd0, 0x5a, 0xe5, 0xfd, 0x5a, 0xb, 0xfd, + 0xfd, 0xe5, 0x50, 0xd0, 0xcb, 0xe0, 0xd0, 0xd4, + 0xd4, 0x3, 0x5a, 0xfd, 0x26, 0x56, 0x50, 0x41, + 0x5a, 0xea, 0xbf, 0xba, 0xe3, 0x3, 0xd0, 0xd0, + 0x5a, 0xb4, 0xbf, 0x11, 0x1b, 0x11, 0xe, 0xa0, + 0x9c, 0x2c, 0xba, 0xb7, 0xcc, 0xbf, 0xe5, 0xb, + 0x40, 0xa1, 0xf8, 0x12, 0x4a, 0x4a, 0x2c, 0xa8, + 0x40, 0xb, 0xd0, 0xd4, 0xb4, 0xbf, 0xd2, 0xf1, + 0x54, 0xfa, 0xe6, 0x73, 0xf2, 0x15, 0xfa, 0x15, + 0x15, 0x15, 0xeb, 0x15, 0xeb, 0x34, 0xeb, 0x34, + 0x3d, 0x3b, 0x48, 0x34, 0xee, 0x15, 0x3d, 0x3d, + 0xa, 0xf2, 0xf2, 0x15, 0x3d, 0x3d, 0x48, 0x42, + 0x48, 0x3b, 0x3f, 0x48, 0x3d, 0x70, 0x3f, 0x1d, + 0x48, 0x48, 0x80, 0x63, 0x59, 0x85, 0x58, 0x59, + 0x63, 0x36, 0x36, 0x59, 0x80, 0x42, 0x7f, 0x54, + 0x48, 0x16, 0x70, 0x34, 0x3b, 0x15, 0x3b, 0x7f, + 0x70, 0x3d, 0x16, 0x16, 0x16, 0xf2, 0x3d, 0xee, + 0x15, 0x3d, 0x16, 0xf2, 0xf2, 0x16, 0x3b, 0xfa, + 0xd8, 0x15, 0xeb, 0xfa, 0x2a, 0xfa, 0xfa, 0x6e, + 0xed, 0xcb, 0xfd, 0x5d, 0x2c, 0xf8, 0x4a, 0x83, + 0xba, 0xa8, 0x74, 0x60, 0xc8, 0x5f, 0x74, 0x60, + 0xe, 0x30, 0x7e, 0x7d, 0x6c, 0x76, 0x62, 0xa8, + 0xb7, 0xa7, 0x74, 0xa8, 0xf3, 0x74, 0x8b, 0x76, + 0x28, 0x46, 0x62, 0x7d, 0xa7, 0x9c, 0x93, 0x5f, + 0xa6, 0xa6, 0x8f, 0x76, 0xa7, 0x62, 0x98, 0x82, + 0x28, 0x93, 0x62, 0x46, 0x76, 0x9c, 0x8b, 0x76, + 0xc, 0xa8, 0x76, 0x9f, 0x6c, 0x76, 0x46, 0x5e, + 0x5e, 0x76, 0x93, 0x5e, 0xa7, 0xa8, 0xa7, 0x5e, + 0xb8, 0x2c, 0xa7, 0x5e, 0x5e, 0x93, 0x98, 0x5e, + 0x8d, 0x7d, 0x5e, 0x9e, 0x68, 0x82, 0x32, 0x86, + 0x68, 0x8d, 0x68, 0x68, 0x68, 0x79, 0xa3, 0x68, + 0x8d, 0x68, 0x6c, 0x86, 0x5e, 0x9f, 0xa3, 0xa3, + 0x68, 0x68, 0xa2, 0xa3, 0x68, 0x68, 0x4e, 0x4e, + 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x93, 0x8f, 0x62, 0x74, 0x9c, 0x93, 0x5e, + 0xb6, 0x5f, 0x82, 0x5e, 0x5e, 0x8d, 0x62, 0x8d, + 0x82, 0x8b, 0x93, 0x6c, 0xf8, 0xa1, 0xaf, 0xc9, + 0xd8, 0x73, 0xde, 0x1, 0x73, 0x73, 0xf9, 0xf9, + 0xfa, 0xa, 0x5a, 0x5a, 0xfd, 0xe5, 0xa1, 0xdd, + 0xc, 0x3e, 0x2c, 0x2c, 0x55, 0xaa, 0xa8, 0x2c, + 0x40, 0xb4, 0xbf, 0x5a, 0x5a, 0x5a, 0x50, 0xf8, + 0x2c, 0x60, 0x2c, 0x12, 0x55, 0xa8, 0xc, 0xa0, + 0xb, 0xe5, 0xc7, 0xf8, 0xa6, 0x50, 0xf8, 0x2c, + 0x2f, 0x2c, 0xf7, 0xf7, 0x74, 0xa7, 0x7, 0x28, + 0x9c, 0xb7, 0xcd, 0xf3, 0xa9, 0xa0, 0xf7, 0xe, + 0x62, 0xa7, 0x6c, 0x28, 0x5f, 0xa0, 0xdd, 0xc, + 0xaa, 0xf8, 0xe4, 0xf8, 0x3e, 0xf8, 0xf3, 0xe3, + 0xcb, 0xed, 0xd0, 0xcb, 0xe6, 0xa, 0xd8, 0xf1, + 0x34, 0xfa, 0x34, 0x34, 0xfa, 0x15, 0x15, 0x15, + 0x34, 0x34, 0x2a, 0xf2, 0x16, 0x15, 0xeb, 0x15, + 0x15, 0x3d, 0x17, 0x16, 0x16, 0x3d, 0x34, 0x73, + 0x34, 0x3d, 0x34, 0x34, 0x48, 0x7f, 0x58, 0x9a, + 0x7f, 0x42, 0x71, 0x6b, 0x7f, 0x42, 0x80, 0x80, + 0x99, 0x99, 0x90, 0x99, 0x41, 0x5d, 0x6f, 0x99, + 0x39, 0x34, 0x15, 0x16, 0x3d, 0x3d, 0x3d, 0xeb, + 0xee, 0xf2, 0x3d, 0x15, 0x15, 0x3d, 0x3f, 0x48, + 0x34, 0x15, 0x3f, 0x34, 0xeb, 0x34, 0x34, 0xe6, + 0xd9, 0xd0, 0xb, 0xe3, 0x50, 0x11, 0x4a, 0xf8, + 0xf0, 0xb, 0x6a, 0xf3, 0xb7, 0xf7, 0xe, 0xf3, + 0xbe, 0xf7, 0x28, 0x6c, 0x6c, 0x9f, 0x28, 0x6c, + 0x6c, 0x6c, 0x6c, 0x7, 0xbd, 0xa0, 0x37, 0x6c, + 0xf7, 0x8, 0x6c, 0x32, 0x9f, 0x9f, 0x5e, 0x9f, + 0x6c, 0x6c, 0x9f, 0x6c, 0xb7, 0xcd, 0x6c, 0x5e, + 0x9f, 0x6c, 0x28, 0x5e, 0x86, 0x9f, 0x5e, 0x9f, + 0x8, 0xb8, 0x7, 0x6c, 0x7, 0xf7, 0x28, 0x6c, + 0xa3, 0xa3, 0xa3, 0xa3, 0x68, 0x6c, 0x5e, 0x68, + 0x7, 0xb8, 0x7, 0xa3, 0x9f, 0x8, 0xfc, 0x9f, + 0xa3, 0x68, 0x9e, 0xa3, 0x9e, 0x6c, 0x9f, 0xa3, + 0x9f, 0xb8, 0x7, 0x4e, 0xa3, 0x9e, 0xa3, 0xa3, + 0x4e, 0xa3, 0x4e, 0x4e, 0xa3, 0x9f, 0x9f, 0xa3, + 0xa3, 0x9f, 0x9f, 0xa3, 0xa3, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0xa3, 0x9f, 0xa3, + 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x4e, + 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x6c, 0xa7, 0x76, 0x93, 0xa4, 0x7, 0x68, 0x68, + 0xa3, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x9e, + 0x6c, 0x7, 0x6c, 0x68, 0xdd, 0xba, 0xe4, 0xec, + 0x39, 0xf1, 0xeb, 0xeb, 0xeb, 0xd8, 0xe6, 0xd6, + 0xd0, 0xd0, 0xe5, 0xf8, 0xc, 0xf3, 0xb8, 0x6c, + 0x8, 0x6c, 0x9f, 0x6c, 0x7, 0xba, 0xb7, 0xb8, + 0xf3, 0xbe, 0xbe, 0xdd, 0xf3, 0xf3, 0xf7, 0x6c, + 0x6c, 0x28, 0x6c, 0x6c, 0x28, 0xb7, 0xbe, 0xb7, + 0xdd, 0xc8, 0xcd, 0xf7, 0xf7, 0x6c, 0x8, 0x6c, + 0x8, 0x8, 0xb8, 0x7, 0x6c, 0xb8, 0xcd, 0x7, + 0x9f, 0x9f, 0x9f, 0x9f, 0xfc, 0x9f, 0x9f, 0x6c, + 0x9f, 0x5e, 0xb8, 0xb8, 0x9f, 0x7, 0xdd, 0xf3, + 0xfc, 0x6c, 0x6c, 0x6c, 0x6c, 0xf7, 0xdd, 0xcc, + 0xb4, 0xbf, 0xd0, 0xe0, 0xa, 0x3, 0xdb, 0xe0, + 0xf9, 0xfd, 0x7f, 0x6e, 0x2a, 0x2a, 0xeb, 0x73, + 0xeb, 0x15, 0xeb, 0x15, 0x15, 0xf2, 0xeb, 0xde, + 0x15, 0x21, 0x2a, 0x15, 0x3d, 0x16, 0x15, 0xeb, + 0x2a, 0x54, 0xfa, 0x34, 0xfa, 0x7f, 0x6f, 0x4a, + 0x3a, 0x4d, 0x58, 0x58, 0x63, 0x59, 0x67, 0x42, + 0x2a, 0x54, 0x41, 0x3, 0xfd, 0x20, 0x6a, 0x40, + 0x41, 0x39, 0x22, 0x15, 0x3d, 0x15, 0x15, 0xf2, + 0x16, 0x15, 0xeb, 0xd8, 0xde, 0x34, 0x1c, 0xb, + 0x3, 0x3, 0xcb, 0xf1, 0xe6, 0x2a, 0x6e, 0x5a, + 0xed, 0x5a, 0x29, 0xa7, 0x28, 0xf7, 0x12, 0xa0, + 0xb7, 0xba, 0xae, 0xf8, 0xcc, 0xb7, 0x6c, 0x8, + 0xf3, 0xe, 0xe, 0x68, 0x9f, 0x6c, 0xe, 0xe, + 0xb8, 0xb8, 0xa7, 0xf7, 0xf8, 0xf3, 0x76, 0x5e, + 0x5e, 0xfc, 0xfc, 0x5e, 0x68, 0x9f, 0x28, 0xfc, + 0xa0, 0xdd, 0x6c, 0x28, 0xa7, 0x12, 0x37, 0x9e, + 0x5e, 0x5e, 0x37, 0x28, 0x6c, 0x7, 0x7, 0x6c, + 0xf3, 0xba, 0xf7, 0x9f, 0x9f, 0xe, 0x1f, 0x5e, + 0x86, 0x68, 0x32, 0xfc, 0x5e, 0x7, 0xb8, 0x9f, + 0xfc, 0x2c, 0x28, 0x9e, 0x5e, 0x5e, 0x1f, 0x28, + 0x86, 0x5e, 0x5e, 0x28, 0xfc, 0x28, 0xb8, 0x5e, + 0x5e, 0x37, 0x43, 0xa3, 0xa3, 0x68, 0x4e, 0x68, + 0x5e, 0x68, 0x9f, 0x9f, 0x5e, 0x30, 0x8, 0x9f, + 0x68, 0x5e, 0x5e, 0x68, 0x68, 0x68, 0xa3, 0xa3, + 0x68, 0x68, 0xa3, 0xa3, 0xa3, 0x8b, 0xa3, 0xa3, + 0x4e, 0x68, 0xa3, 0xa3, 0x98, 0xa3, 0x4e, 0x4e, + 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, + 0x0, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0xa3, 0x0, 0x0, 0xa3, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xb8, 0xb7, 0x76, 0x82, 0x5e, 0x5e, 0x9f, 0xa3, + 0x68, 0xa3, 0x5e, 0x5e, 0x9f, 0x9f, 0x5e, 0x5e, + 0xb6, 0xdd, 0xf7, 0xa3, 0x7, 0xf7, 0xf8, 0x1b, + 0xe5, 0xd0, 0xa, 0xd8, 0xde, 0xd8, 0xd8, 0x3, + 0xd4, 0xe5, 0xec, 0x2c, 0x8, 0x6c, 0x6c, 0xfc, + 0xfc, 0x28, 0x8, 0x9f, 0xb6, 0xbe, 0xcd, 0x8, + 0x8, 0xa0, 0xf3, 0xf6, 0xa7, 0x1e, 0x6c, 0x28, + 0xe, 0xf7, 0xb8, 0x8, 0x7, 0xf3, 0xc8, 0xf7, + 0xa7, 0x8, 0xf7, 0xe, 0xe, 0x6c, 0x8, 0x6c, + 0xf7, 0xf3, 0xce, 0xdd, 0x6c, 0x6c, 0xf3, 0xe, + 0x37, 0x5e, 0x9f, 0x9f, 0x1f, 0xfc, 0x7, 0xb6, + 0x28, 0x28, 0xf3, 0xf7, 0x28, 0x6c, 0x9f, 0xe, + 0x1e, 0x6c, 0x6c, 0x6c, 0xfc, 0x2c, 0xcd, 0xcc, + 0xa1, 0xa1, 0xbf, 0x5a, 0x41, 0xa1, 0xcc, 0xd4, + 0xfd, 0x11, 0xe3, 0xd4, 0x3, 0xcb, 0xcb, 0xa, + 0xa, 0x54, 0xeb, 0xe1, 0x15, 0x73, 0xeb, 0x15, + 0xfa, 0x23, 0x23, 0xa, 0xeb, 0xfa, 0xeb, 0xeb, + 0xfa, 0x54, 0x23, 0x2a, 0xfa, 0x39, 0x41, 0x90, + 0x90, 0x31, 0x58, 0x9a, 0x9a, 0x85, 0x80, 0x99, + 0x7f, 0x1d, 0x80, 0x48, 0x54, 0x20, 0x83, 0xaf, + 0x5a, 0xed, 0xea, 0xe6, 0x73, 0x54, 0x54, 0x70, + 0x34, 0x2b, 0xfa, 0x73, 0xeb, 0x3f, 0xfe, 0xb, + 0xbf, 0xd4, 0xb4, 0x5a, 0xb4, 0xaf, 0x83, 0x83, + 0xa1, 0x90, 0xaa, 0x7d, 0xf7, 0xa7, 0x55, 0x2f, + 0xbe, 0xc8, 0x74, 0x74, 0xc, 0xa7, 0x62, 0x46, + 0x28, 0x5f, 0x8f, 0x76, 0x6c, 0x7, 0x5f, 0x5f, + 0xb7, 0xb7, 0x9c, 0x7d, 0xa7, 0x89, 0x9c, 0x82, + 0x5e, 0x28, 0x62, 0x82, 0xb6, 0xb7, 0x74, 0x46, + 0xa7, 0xa8, 0x8b, 0x82, 0x5e, 0x7d, 0x93, 0x5e, + 0x5e, 0x76, 0x9c, 0x82, 0x6c, 0xc8, 0xad, 0x37, + 0x28, 0xa7, 0x7d, 0x9f, 0x68, 0x46, 0x62, 0x76, + 0x5e, 0x76, 0x9c, 0x5e, 0x28, 0xa8, 0xa8, 0x5e, + 0x5e, 0x93, 0x93, 0x68, 0x5e, 0x93, 0x93, 0x5e, + 0x5e, 0x7d, 0xae, 0x6c, 0x82, 0x93, 0x9c, 0x9f, + 0x79, 0x8f, 0x8d, 0x68, 0x68, 0x79, 0x5e, 0x5e, + 0x5e, 0x7d, 0x7, 0xb6, 0x28, 0x8b, 0x5e, 0x68, + 0x68, 0x8b, 0x86, 0x4e, 0x68, 0x98, 0x4e, 0x68, + 0x98, 0x8b, 0x68, 0x5e, 0x8b, 0x8b, 0x68, 0x4e, + 0x8b, 0x98, 0x4e, 0x4e, 0x79, 0x98, 0xa3, 0xa3, + 0x79, 0x8d, 0x4e, 0x4e, 0x8d, 0x79, 0x0, 0x0, + 0x8d, 0x4e, 0x4e, 0x0, 0x68, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0xa3, + 0xa3, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x28, 0x37, 0x93, 0x79, 0x86, 0x8d, 0x46, 0x32, + 0x5e, 0xa7, 0x93, 0x28, 0x1e, 0xe, 0x5e, 0x5e, + 0x5e, 0x46, 0x46, 0x68, 0x5e, 0xa8, 0x50, 0x50, + 0xbf, 0xd0, 0x3, 0x3, 0xcb, 0x23, 0x7f, 0x40, + 0x2c, 0x6a, 0x27, 0x2f, 0x76, 0x9c, 0xa7, 0x6c, + 0x5f, 0xa8, 0xdd, 0x6c, 0x37, 0x62, 0x46, 0x37, + 0x7d, 0x62, 0x5c, 0x5f, 0x74, 0x8f, 0xb7, 0xb8, + 0x46, 0x55, 0xc, 0x37, 0x9c, 0x74, 0x62, 0x8d, + 0x62, 0x8f, 0xa7, 0xa0, 0x74, 0x5f, 0xb7, 0xcd, + 0x5f, 0x2f, 0xf7, 0x28, 0x9c, 0x93, 0x5e, 0x82, + 0x8b, 0x82, 0x7, 0x7, 0x9c, 0x82, 0x8, 0xc, + 0x98, 0x76, 0x28, 0x76, 0x7d, 0x82, 0x5e, 0x5f, + 0x7d, 0x76, 0x9f, 0xa9, 0x74, 0x82, 0x37, 0xa8, + 0x55, 0x5f, 0xa7, 0x55, 0x7e, 0x7d, 0xa0, 0xb, + 0xb, 0x50, 0xcc, 0xd4, 0x97, 0x50, 0xa1, 0x40, + 0x83, 0x6f, 0x97, 0x6e, 0xfa, 0x23, 0xeb, 0x34, + 0x34, 0xe6, 0xc9, 0xea, 0x54, 0x41, 0x4a, 0x41, + 0x3c, 0x3a, 0x90, 0x99, 0x39, 0x99, 0x23, 0x6e, + 0xa, 0x67, 0x59, 0x99, 0x99, 0x58, 0x71, 0x71, + 0x71, 0x59, 0x31, 0x42, 0x54, 0x7f, 0xaf, 0x7f, + 0xc9, 0x5a, 0x41, 0x5a, 0x5a, 0xb, 0x5d, 0x6f, + 0x97, 0x41, 0x90, 0x99, 0x2a, 0x54, 0x99, 0x97, + 0xd0, 0x50, 0x6a, 0x6a, 0x2f, 0x2f, 0x91, 0x7e, + 0xaa, 0xa9, 0x7e, 0x74, 0xba, 0xba, 0x74, 0x74, + 0xe, 0x2f, 0x8f, 0x7d, 0x76, 0x9c, 0x55, 0x8f, + 0xa7, 0xa8, 0xaa, 0x9c, 0xa0, 0xa4, 0x74, 0x82, + 0x5e, 0x28, 0x62, 0x82, 0x82, 0x76, 0x74, 0x82, + 0x28, 0xb7, 0x74, 0x76, 0x6c, 0x30, 0x93, 0x82, + 0x28, 0x93, 0x89, 0x82, 0x5e, 0x76, 0x9c, 0x5e, + 0x9f, 0xc, 0xc, 0x82, 0x6c, 0x76, 0x46, 0x5e, + 0x68, 0x82, 0x82, 0x68, 0x5e, 0xa7, 0xb7, 0x9f, + 0x6c, 0x5f, 0xa7, 0x5e, 0x9f, 0x8d, 0x76, 0x5e, + 0x9f, 0x8d, 0x76, 0x6c, 0x37, 0x9c, 0xa0, 0x6c, + 0x5e, 0x62, 0x37, 0x86, 0x68, 0x5e, 0x8d, 0x28, + 0x5e, 0x93, 0x68, 0x9f, 0x6c, 0x82, 0xb6, 0x9f, + 0x9e, 0x5e, 0x5e, 0xa3, 0x68, 0x68, 0x5e, 0x9e, + 0x68, 0x68, 0xa3, 0x9f, 0x68, 0x68, 0xa3, 0xa3, + 0xa3, 0x98, 0x9e, 0xa3, 0x98, 0x98, 0x4e, 0xa3, + 0x8d, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, + 0xa3, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x82, 0x8b, 0x5e, 0x5e, 0x9c, 0x9c, 0x82, + 0x82, 0x9c, 0x9c, 0x68, 0x8d, 0x98, 0x8b, 0x8d, + 0x8d, 0x98, 0x93, 0x5e, 0x6c, 0xa6, 0xe3, 0xbe, + 0xe4, 0xaf, 0xcc, 0xbe, 0x50, 0xa1, 0x6, 0xf0, + 0x60, 0xaa, 0xb3, 0xf7, 0xe, 0x60, 0xc8, 0x8, + 0x82, 0x93, 0xa7, 0x28, 0x82, 0x93, 0x76, 0x28, + 0x46, 0x8f, 0xa8, 0x7, 0x76, 0x74, 0x2c, 0x28, + 0x93, 0x93, 0x76, 0x37, 0x62, 0x8b, 0x76, 0x6c, + 0x9c, 0x2f, 0xb7, 0xb7, 0x5f, 0x9c, 0xf7, 0x28, + 0x82, 0x82, 0x5e, 0x28, 0x5f, 0x76, 0x6c, 0x7, + 0x9c, 0xa7, 0xdd, 0xe, 0x9c, 0x82, 0x5e, 0xfc, + 0x93, 0x82, 0x5e, 0x76, 0x5f, 0x28, 0x6c, 0xb8, + 0x76, 0x32, 0xfc, 0x28, 0x82, 0x82, 0x5e, 0xe, + 0x46, 0x5e, 0x5e, 0xa7, 0x5f, 0xe, 0xf7, 0xba, + 0xc8, 0xa0, 0xf3, 0x50, 0x2f, 0x28, 0x28, 0xa7, + 0xf8, 0xf8, 0xf3, 0xbf, 0xbf, 0xcf, 0x5a, 0x5a, + 0x5a, 0x40, 0xb, 0xfd, 0x41, 0x2c, 0xa0, 0x50, + 0xe5, 0x40, 0x10, 0xbf, 0xd4, 0xe5, 0xfd, 0xf9, + 0x26, 0x6f, 0x90, 0x54, 0x21, 0x63, 0x83, 0xb0, + 0x41, 0xfd, 0xfd, 0x5a, 0xd4, 0xe3, 0x50, 0x1b, + 0x41, 0x83, 0x2c, 0x50, 0xfd, 0xb, 0xf3, 0xba, + 0xc7, 0xc5, 0xe3, 0x50, 0xa1, 0xa6, 0xe, 0x2c, + 0x11, 0x55, 0xa7, 0x6c, 0x28, 0xb7, 0x2c, 0xa7, + 0xb7, 0xcd, 0xe, 0x12, 0xe, 0x37, 0x5e, 0x82, + 0xe, 0x2f, 0x76, 0x68, 0x7, 0xbd, 0xf8, 0xe, + 0x8, 0xba, 0x9c, 0x1e, 0xe, 0x28, 0x82, 0x9f, + 0x9f, 0xfc, 0xa7, 0x5e, 0x9f, 0xb8, 0xb7, 0x1f, + 0x6c, 0x6c, 0x86, 0x5e, 0xfc, 0x1f, 0x5e, 0x5e, + 0x5e, 0x6c, 0xe, 0x5e, 0x9e, 0x9f, 0x7, 0xfc, + 0x28, 0x5e, 0x68, 0x9f, 0x5e, 0x28, 0x28, 0x9e, + 0x5e, 0x9f, 0x7, 0x8, 0x9f, 0x6c, 0xf7, 0x6c, + 0x5e, 0x68, 0x9e, 0x68, 0xa3, 0x9f, 0xfc, 0x68, + 0xa3, 0x5e, 0x7, 0x28, 0x28, 0x86, 0x32, 0xa3, + 0xa3, 0x5e, 0x5e, 0xa3, 0x4e, 0x9f, 0x6c, 0x6c, + 0x5e, 0x5e, 0x9f, 0xb6, 0x6c, 0x5e, 0x5e, 0x5e, + 0x5e, 0x68, 0x68, 0xa3, 0xa3, 0x9e, 0xa3, 0x7, + 0x9f, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, + 0x4e, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0x9f, + 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, + 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x4e, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa3, 0x7, 0x7, 0x6c, 0x28, 0xa7, 0xa7, 0x68, + 0x6c, 0x1f, 0x82, 0x68, 0xa3, 0x5e, 0x37, 0x28, + 0x68, 0x37, 0xb7, 0x6c, 0xfc, 0xf3, 0xa0, 0xf7, + 0x8, 0xa0, 0xf8, 0xf7, 0xf7, 0x50, 0xbf, 0xec, + 0x11, 0xba, 0xbe, 0xdd, 0xe, 0x12, 0xfc, 0x9e, + 0x5e, 0x6c, 0xfc, 0x28, 0x5e, 0x5e, 0x7, 0xb8, + 0xe, 0x37, 0x7, 0xa7, 0x5e, 0xfc, 0x46, 0x6c, + 0x6c, 0x82, 0x28, 0xe, 0xa7, 0x37, 0x7, 0xcd, + 0x2f, 0xe, 0x28, 0xa3, 0x5e, 0x6c, 0x37, 0x28, + 0x6c, 0x5e, 0x7, 0xa0, 0x2f, 0x28, 0x8, 0xb8, + 0x6c, 0xfc, 0x5e, 0xa3, 0x86, 0x5e, 0x68, 0x1e, + 0x5e, 0x68, 0xa3, 0x7, 0x28, 0x28, 0x5e, 0x6c, + 0x6c, 0x68, 0x1f, 0x5e, 0x68, 0xa3, 0x9f, 0x28, + 0x6c, 0x32, 0x5e, 0x7, 0xf7, 0x37, 0x6c, 0x6c, + 0x6c, 0x86, 0xfc, 0x38, 0x76, 0x9f, 0x9f, 0xdd, + 0xbe, 0xb7, 0xb7, 0xdc, 0xcc, 0xe4, 0x11, 0x29, + 0x2c, 0xe, 0x24, 0x3e, 0x60, 0xa0, 0x7, 0xa1, + 0xbf, 0xe4, 0xa0, 0xf3, 0xbe, 0xb7, 0x11, 0x1b, + 0x4a, 0xf8, 0x10, 0x99, 0x6e, 0x5a, 0xb, 0xea, + 0xc0, 0x5a, 0x20, 0x50, 0xf8, 0xa0, 0xe, 0x2f, + 0x46, 0xa7, 0x37, 0xa8, 0xe3, 0xbf, 0xc8, 0xf3, + 0xc8, 0xf8, 0x55, 0x7e, 0x74, 0xa7, 0x82, 0x5f, + 0x5f, 0xa7, 0x7, 0x28, 0xb8, 0xbe, 0xe, 0x28, + 0x8, 0x8, 0x6c, 0x1e, 0x5e, 0x5e, 0x6c, 0x5e, + 0x6c, 0xa0, 0xa0, 0x6c, 0x7, 0xcd, 0x2c, 0x76, + 0x5e, 0x6c, 0x76, 0x5e, 0x5e, 0x6c, 0x37, 0x32, + 0x68, 0xb8, 0xb7, 0x37, 0x9f, 0x7, 0x1e, 0x9f, + 0x5e, 0xa3, 0x5e, 0xa3, 0x86, 0x28, 0xa7, 0x68, + 0x9f, 0x6c, 0xa0, 0x6c, 0x9f, 0x5e, 0x5e, 0x68, + 0x68, 0x5e, 0x68, 0xa3, 0x9f, 0x5e, 0xa0, 0x7, + 0x9f, 0x76, 0xa0, 0x28, 0x32, 0x32, 0x5e, 0x68, + 0x5e, 0x5e, 0x5e, 0x6c, 0x68, 0x32, 0x7, 0x7, + 0x5e, 0x6c, 0x28, 0x5e, 0x8d, 0x8d, 0x5e, 0x9e, + 0x5e, 0x5e, 0x5e, 0x9f, 0x5e, 0x68, 0x9f, 0x7, + 0x6c, 0x9f, 0x5e, 0x5e, 0x8b, 0x8b, 0x8b, 0x5e, + 0x98, 0x8b, 0x98, 0x7, 0x5e, 0x5e, 0x9f, 0x9f, + 0x68, 0xa3, 0xa3, 0x0, 0x68, 0x68, 0xa3, 0xa3, + 0xa3, 0x68, 0xa3, 0x9f, 0xa3, 0xa3, 0x4e, 0x4e, + 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0xa3, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x7, 0xb8, 0x6c, 0x5e, 0x5e, 0x5e, 0x9f, + 0x68, 0x1e, 0x5e, 0x5e, 0x86, 0x5e, 0x6c, 0x28, + 0x5e, 0x5e, 0x7, 0x28, 0x28, 0x28, 0x28, 0x6c, + 0x28, 0x37, 0xb7, 0xb7, 0xbd, 0xc7, 0xbf, 0xe3, + 0x2c, 0xf7, 0x8, 0xfc, 0xfc, 0x46, 0x28, 0x5e, + 0x4e, 0x5e, 0x6c, 0x7, 0x6c, 0x6c, 0x7, 0xdd, + 0x37, 0x76, 0x6c, 0x9f, 0x6c, 0x37, 0x28, 0x6c, + 0x76, 0x76, 0x6c, 0xdd, 0xa7, 0x76, 0x37, 0xa7, + 0x28, 0x82, 0x5e, 0x5e, 0x76, 0x76, 0x76, 0xa7, + 0xa7, 0x7d, 0xa7, 0x2c, 0x5f, 0x93, 0x6c, 0xfc, + 0x5e, 0x5e, 0x68, 0x68, 0x5e, 0x5e, 0x9f, 0x6c, + 0x7, 0x9f, 0x68, 0x8, 0xa7, 0x5e, 0x9f, 0x68, + 0x32, 0x5e, 0x68, 0x79, 0x76, 0x8d, 0x9f, 0x6c, + 0xa0, 0x9f, 0x9e, 0x6c, 0x5f, 0x5e, 0x5e, 0x5e, + 0x82, 0x5e, 0x68, 0x28, 0xa7, 0x6c, 0x6c, 0x8, + 0xc8, 0xa0, 0x8, 0x2f, 0xa8, 0xa7, 0x76, 0x74, + 0x74, 0xa0, 0xa7, 0xac, 0x50, 0xb7, 0xa0, 0xf8, + 0xa6, 0xf3, 0xe, 0x5f, 0xe, 0xf7, 0xc8, 0x97, + 0x20, 0xa1, 0x40, 0x6f, 0xb4, 0xd0, 0x5a, 0x23, + 0x66, 0x41, 0x40, 0x40, 0x60, 0xe, 0x9c, 0x8f, + 0xa7, 0xb7, 0xa8, 0x55, 0xa6, 0xcc, 0x60, 0xaa, + 0xaa, 0x7e, 0x91, 0x91, 0x91, 0x91, 0x91, 0x91, + 0x74, 0x50, 0x60, 0x2f, 0xa0, 0xa0, 0x7d, 0x8f, + 0x1e, 0x5f, 0x7d, 0x93, 0x76, 0x6c, 0x74, 0x9c, + 0x82, 0xa0, 0xa6, 0x55, 0xa7, 0xfc, 0x62, 0x8b, + 0x5e, 0x1e, 0x9c, 0x9c, 0x6c, 0xa8, 0xb3, 0x9c, + 0x82, 0xa8, 0xaa, 0x7d, 0x5e, 0x82, 0x93, 0x8d, + 0xa3, 0x28, 0x9c, 0x82, 0x5e, 0x9c, 0xb3, 0x5f, + 0x1e, 0x82, 0x8f, 0x79, 0x68, 0x46, 0x98, 0x68, + 0xa3, 0x82, 0x9c, 0x37, 0x32, 0x9c, 0xaa, 0x9c, + 0x46, 0x74, 0x8f, 0x82, 0x82, 0x8f, 0x93, 0x5e, + 0x9f, 0x82, 0x9c, 0xc, 0x6c, 0x98, 0x8b, 0xa7, + 0x28, 0x62, 0x8f, 0x68, 0x5e, 0x8b, 0x62, 0x37, + 0x6c, 0x8b, 0x9c, 0xb8, 0xe, 0x8f, 0x98, 0x5e, + 0x8d, 0x8f, 0x8f, 0x93, 0x8f, 0x94, 0x94, 0x91, + 0x94, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x98, 0x5e, + 0x86, 0x8b, 0x5e, 0x68, 0xa3, 0x98, 0x4e, 0xa3, + 0x7d, 0x8b, 0x68, 0xa3, 0x98, 0x98, 0x68, 0x4e, + 0x98, 0x98, 0xa3, 0xa3, 0x98, 0x79, 0x4e, 0x4e, + 0x82, 0x8d, 0x4e, 0x0, 0x8d, 0x8d, 0x4e, 0x4e, + 0x8d, 0x4e, 0x0, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x4e, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0xa3, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa3, 0x76, 0x46, 0x82, 0x5e, 0x76, 0x82, 0x1e, + 0x5e, 0x82, 0xa8, 0x7, 0x5e, 0x82, 0x5f, 0x5e, + 0x5e, 0x93, 0x82, 0x5e, 0x68, 0x98, 0x9c, 0xa7, + 0x37, 0x9c, 0x50, 0xc7, 0xe2, 0xb, 0xe3, 0xe4, + 0x2f, 0x7d, 0x5f, 0x6c, 0x5e, 0x82, 0x6c, 0x7, + 0xb6, 0x76, 0xa0, 0xdd, 0x28, 0x46, 0x37, 0x28, + 0x82, 0x93, 0x46, 0xe, 0x9c, 0x8b, 0xa7, 0xb7, + 0x2c, 0x74, 0x76, 0xa7, 0x62, 0x62, 0x5f, 0x43, + 0x93, 0x93, 0x76, 0xa7, 0xaa, 0x94, 0x94, 0xb3, + 0x6a, 0x94, 0x94, 0x91, 0x91, 0x8f, 0x46, 0x37, + 0x76, 0x82, 0x5e, 0x6c, 0xa8, 0x46, 0x5e, 0x28, + 0xac, 0x1f, 0xfc, 0x37, 0x98, 0x98, 0x68, 0x1f, + 0x62, 0x79, 0x68, 0x76, 0xaa, 0x2f, 0x32, 0x82, + 0x9c, 0x8d, 0xfc, 0x30, 0x8b, 0x8d, 0x68, 0x5c, + 0x55, 0x37, 0x5e, 0x93, 0x74, 0x2f, 0xfc, 0x98, + 0x62, 0x8d, 0x37, 0x55, 0x74, 0x76, 0x76, 0x74, + 0xb0, 0x50, 0x5f, 0x7e, 0x55, 0xe, 0x12, 0x62, + 0x62, 0x76, 0x46, 0x7e, 0x3e, 0xba, 0xbf, 0x5a, + 0x3, 0x5a, 0x1b, 0x6f, 0x83, 0xec, 0x1b, 0x3a, + 0x4c, 0xa6, 0xa6, 0x83, 0x4a, 0x50, 0xaa, 0x94, + 0xa8, 0xba, 0x27, 0x7e, 0x9c, 0x5f, 0x74, 0x81, + 0x91, 0x6a, 0x6f, 0x81, 0x71, 0x85, 0x6f, 0x91, + 0x91, 0x9b, 0x6a, 0x7e, 0x46, 0x82, 0x8f, 0x8f, + 0x30, 0x2c, 0xaa, 0x8f, 0x76, 0xf3, 0x3e, 0x7c, + 0x76, 0x28, 0x8b, 0x62, 0x1f, 0x82, 0x8b, 0x93, + 0x76, 0xa8, 0xb3, 0xa9, 0x76, 0xa8, 0xaa, 0x74, + 0x76, 0x93, 0x8f, 0x93, 0x8d, 0x82, 0x9c, 0x76, + 0x68, 0x37, 0xa6, 0xa7, 0x5e, 0x8d, 0x74, 0x30, + 0x79, 0x93, 0x93, 0x82, 0x28, 0x82, 0x9c, 0x28, + 0x5e, 0x76, 0x5f, 0xa7, 0x5e, 0x8d, 0x62, 0x76, + 0x82, 0x8f, 0x94, 0x9c, 0x82, 0x89, 0x9c, 0xb7, + 0x5e, 0x93, 0x9c, 0xe, 0x82, 0x8d, 0x8d, 0x68, + 0x5e, 0x93, 0x76, 0x86, 0x5e, 0x8b, 0x74, 0xf3, + 0xa7, 0x43, 0x8d, 0x5e, 0x28, 0x98, 0x5e, 0x9f, + 0x32, 0x8f, 0x98, 0x9c, 0x8f, 0x94, 0x94, 0x91, + 0x91, 0x94, 0x94, 0x8f, 0x94, 0x8f, 0x98, 0x4e, + 0x5e, 0x8d, 0x68, 0x5e, 0x9f, 0xa3, 0x68, 0x9e, + 0xa3, 0x68, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, + 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x46, 0x98, 0x5e, 0x8d, 0x9c, 0x52, 0xae, + 0x76, 0x8f, 0x8f, 0x1e, 0x30, 0x8b, 0x8f, 0x8d, + 0x82, 0x93, 0x62, 0x6c, 0x82, 0x7d, 0xa9, 0xc8, + 0xa9, 0x62, 0x74, 0xc, 0xf8, 0x4a, 0x60, 0xa0, + 0xa7, 0x74, 0x2c, 0xb7, 0xc, 0x9c, 0x37, 0xf7, + 0xe, 0x93, 0x5e, 0x5e, 0x76, 0x46, 0x82, 0x68, + 0x76, 0x7d, 0x76, 0x2c, 0x5f, 0x93, 0x43, 0xa7, + 0x55, 0x62, 0x8d, 0x68, 0x93, 0x62, 0x30, 0x5f, + 0x9c, 0x9c, 0x76, 0xb3, 0x6a, 0x91, 0x91, 0x94, + 0x81, 0x94, 0x94, 0x94, 0x94, 0x94, 0x9c, 0xa7, + 0xa8, 0x82, 0x9f, 0x8, 0x2f, 0x82, 0x68, 0x5e, + 0x8d, 0x8d, 0x1f, 0x8d, 0x82, 0x76, 0x68, 0x28, + 0xa7, 0x5e, 0x4e, 0x68, 0x82, 0x1f, 0x68, 0x8d, + 0x8d, 0x68, 0x28, 0x8d, 0x76, 0xb6, 0x5e, 0x6c, + 0x2f, 0x6c, 0x68, 0x68, 0x5e, 0x5e, 0x37, 0x82, + 0x5e, 0x6c, 0x28, 0x37, 0xa7, 0xbd, 0x7, 0x76, + 0x2c, 0x2c, 0xa7, 0x76, 0x76, 0x5e, 0x68, 0x8d, + 0x76, 0x7, 0xa7, 0x82, 0xa0, 0xba, 0xe4, 0x60, + 0x11, 0xf8, 0x2c, 0x9c, 0xe, 0xb7, 0xcc, 0x11, + 0xcc, 0xc2, 0xcc, 0xba, 0xc, 0xf3, 0xa7, 0x76, + 0x82, 0x28, 0x82, 0xa7, 0x6c, 0x37, 0x9c, 0x8f, + 0x74, 0xb0, 0xb0, 0x85, 0x71, 0x71, 0x6b, 0x81, + 0x94, 0x5f, 0x9c, 0x76, 0x6c, 0x6c, 0x7, 0x7, + 0x28, 0xb8, 0xb7, 0x7, 0x6c, 0x68, 0x28, 0x68, + 0x9e, 0x5e, 0x5e, 0x6c, 0x5e, 0x9f, 0x7, 0x7, + 0x6c, 0x6c, 0xe, 0xa7, 0x6c, 0x76, 0x8b, 0x7d, + 0x82, 0x5e, 0x9c, 0xa7, 0x6c, 0x9f, 0xb8, 0x7, + 0xa3, 0x9f, 0x6c, 0x5e, 0x6c, 0x5e, 0x28, 0x68, + 0x9f, 0x5e, 0x6c, 0x7, 0x5e, 0x5e, 0x8, 0xb6, + 0x5e, 0x86, 0x5e, 0x5e, 0x5e, 0x82, 0x76, 0x9c, + 0x8e, 0x8f, 0xac, 0xb3, 0x6c, 0x76, 0x76, 0x43, + 0x9f, 0x5e, 0x5e, 0x68, 0xa3, 0x86, 0x5e, 0x9f, + 0xa3, 0x86, 0x5e, 0xb8, 0x7, 0x5e, 0xa3, 0x9f, + 0x68, 0x9e, 0x5e, 0x9e, 0xa3, 0xa3, 0xa2, 0x7, + 0x7, 0x8b, 0x8b, 0x9c, 0xaa, 0x91, 0x94, 0x94, + 0x94, 0x91, 0x94, 0x8b, 0x8f, 0x8f, 0x8b, 0x6c, + 0x7, 0x5e, 0xa3, 0x9e, 0xa3, 0xa3, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0xa3, + 0xa3, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x4e, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa3, 0x68, 0x6c, 0x7, 0x5e, 0x28, 0xa7, 0xa7, + 0x9f, 0x86, 0x68, 0x68, 0x68, 0x5e, 0x68, 0x9f, + 0x5e, 0x5e, 0x6c, 0xb8, 0xb6, 0x82, 0x6c, 0x28, + 0x32, 0x5e, 0x28, 0x6c, 0xf7, 0xc, 0xb7, 0xcd, + 0xbd, 0x28, 0xa0, 0xf3, 0xa0, 0x82, 0x5e, 0x5e, + 0x5e, 0x5e, 0x5e, 0xa3, 0x9f, 0x9f, 0x5e, 0x9f, + 0xb8, 0x5e, 0x68, 0x28, 0x68, 0x9f, 0x5e, 0xa2, + 0x68, 0x5e, 0x68, 0x7, 0x7, 0x6c, 0x32, 0xb8, + 0xc, 0xa7, 0x82, 0x7d, 0x94, 0x94, 0x7e, 0x91, + 0x91, 0x81, 0x94, 0x6a, 0x83, 0xaa, 0x74, 0x5f, + 0xa8, 0x28, 0x68, 0x68, 0xa3, 0x68, 0xa3, 0x68, + 0x32, 0x9f, 0x5e, 0xa3, 0x7, 0x9f, 0xa3, 0xa3, + 0x68, 0xa3, 0x68, 0xa3, 0x68, 0x68, 0xa3, 0x68, + 0x9f, 0x7, 0x9e, 0x5e, 0x9f, 0x7, 0x9f, 0x6c, + 0x5e, 0x86, 0x5e, 0x68, 0x68, 0x9e, 0x5e, 0x6c, + 0x6c, 0xa0, 0x6c, 0x5e, 0x8, 0xf7, 0xf7, 0x28, + 0x5e, 0x5e, 0x28, 0x28, 0x28, 0x9f, 0x5e, 0x6c, + 0x6c, 0xa6, 0xac, 0x74, 0x37, 0x6c, 0x6c, 0x37, + 0x28, 0x6c, 0x28, 0xf7, 0xf3, 0xce, 0xd4, 0xb, + 0xba, 0xd1, 0xcc, 0xdd, 0x6c, 0x6c, 0x6c, 0xfc, + 0x6c, 0x6c, 0x7, 0xa7, 0x5f, 0xba, 0xb0, 0xaa, + 0x91, 0xb0, 0x7f, 0x80, 0x85, 0x71, 0x71, 0x71, + 0x4a, 0x60, 0x60, 0xaa, 0xa7, 0xdd, 0xbe, 0x8, + 0x6c, 0x6c, 0xe, 0xe, 0x28, 0x68, 0x8d, 0x5e, + 0x28, 0xfc, 0xb8, 0xb8, 0x6c, 0x8, 0xf3, 0xa0, + 0x5e, 0x76, 0x9c, 0x8f, 0x74, 0x8f, 0x94, 0xaa, + 0x8f, 0x6a, 0xb3, 0xb3, 0x9c, 0x9c, 0x74, 0x5f, + 0x68, 0x32, 0x79, 0x5e, 0xfc, 0x1f, 0x76, 0x7, + 0x7, 0x28, 0x2c, 0xdd, 0x6c, 0x5e, 0x76, 0x37, + 0x28, 0x82, 0x7d, 0x76, 0x9c, 0x74, 0x91, 0xb3, + 0x83, 0x91, 0x6b, 0x58, 0x7e, 0x7e, 0x8f, 0x8f, + 0x62, 0x8b, 0x93, 0x5e, 0x5e, 0x8d, 0x28, 0x7, + 0x7, 0x76, 0x5e, 0xe, 0x1f, 0x93, 0x82, 0x68, + 0x68, 0x28, 0x5e, 0x68, 0x7, 0x82, 0xab, 0x74, + 0xac, 0x91, 0x94, 0x91, 0x4d, 0x4d, 0x91, 0x91, + 0x80, 0x42, 0x36, 0x4d, 0x99, 0x94, 0x94, 0x7e, + 0x94, 0x8f, 0x8b, 0x79, 0x98, 0x98, 0x68, 0x68, + 0x4e, 0xa3, 0xa3, 0xa3, 0x9f, 0xa3, 0x4e, 0x4e, + 0x4e, 0xa3, 0x4e, 0x0, 0x4e, 0xa3, 0x4e, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x68, 0x79, 0x68, 0x68, 0x68, + 0x19, 0x19, 0x19, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x4e, + 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x19, 0x19, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x68, 0x7, 0x8, 0x9f, 0x5e, 0x9f, 0x32, + 0x68, 0x5e, 0x5e, 0x5e, 0x86, 0x5e, 0x28, 0xdd, + 0x9f, 0x86, 0x6c, 0x8, 0xfc, 0x6c, 0x5e, 0x9f, + 0x68, 0x6c, 0x8, 0xdd, 0xbd, 0xcd, 0xbe, 0xc7, + 0xf3, 0x9c, 0xa7, 0x5f, 0x9c, 0x93, 0x7d, 0x76, + 0x93, 0x93, 0x82, 0x7, 0xb8, 0x6c, 0x6c, 0x7, + 0xf7, 0x82, 0x68, 0x5e, 0x86, 0x28, 0xfc, 0x5e, + 0x6c, 0x76, 0x6c, 0xf3, 0xba, 0xa0, 0x6c, 0x6c, + 0x2f, 0x55, 0x8f, 0x8f, 0x7e, 0x7e, 0x6a, 0x5d, + 0x90, 0x90, 0x6f, 0x4c, 0x90, 0x6a, 0x7e, 0x8f, + 0x62, 0x74, 0x1f, 0x5e, 0x8d, 0x5e, 0xa3, 0x32, + 0xa7, 0xa7, 0xa2, 0x5e, 0xa0, 0x28, 0x9e, 0x68, + 0x5e, 0x86, 0xfc, 0x68, 0x82, 0x68, 0x6c, 0xfc, + 0xe, 0x7, 0x68, 0x68, 0x28, 0xe, 0xfc, 0x79, + 0x98, 0x68, 0xfc, 0x1e, 0x82, 0x8, 0x6c, 0x82, + 0x2f, 0xc, 0x28, 0x82, 0x82, 0xfc, 0x30, 0x46, + 0x93, 0x5e, 0x28, 0x30, 0x30, 0x7, 0x8, 0x7d, + 0x9c, 0x60, 0x91, 0x8f, 0x93, 0x6c, 0x28, 0x5f, + 0x76, 0x8, 0xb7, 0x2c, 0x11, 0xe3, 0xe5, 0x6a, + 0x2c, 0xcc, 0x50, 0x60, 0x9c, 0x1e, 0xa7, 0x30, + 0x9c, 0xa0, 0xb3, 0x6a, 0x74, 0x83, 0x90, 0x71, + 0x6a, 0x85, 0x2a, 0x70, 0x42, 0x9a, 0x99, 0x4d, + 0x31, 0x63, 0x97, 0x83, 0x7e, 0x60, 0x55, 0x8f, + 0x82, 0x28, 0x46, 0x62, 0x1f, 0x82, 0x7d, 0x74, + 0x1e, 0x46, 0xa8, 0xa8, 0x5e, 0x28, 0x55, 0x62, + 0x82, 0x7d, 0x94, 0x91, 0x91, 0x91, 0x6f, 0xb0, + 0x5d, 0x6b, 0x6b, 0x6a, 0x91, 0x94, 0x94, 0x8f, + 0x82, 0x82, 0x8b, 0x9c, 0x5f, 0x74, 0x8f, 0xa8, + 0xa0, 0x76, 0x55, 0x9c, 0x28, 0x98, 0x8f, 0x93, + 0x76, 0x8b, 0x94, 0x94, 0xaa, 0x6a, 0x81, 0x85, + 0x6f, 0x81, 0x5d, 0x58, 0x5d, 0x81, 0x91, 0x94, + 0x91, 0x94, 0x94, 0x9c, 0xa7, 0x8b, 0x8b, 0x5e, + 0x28, 0x93, 0x8b, 0x8d, 0x82, 0x8f, 0x8b, 0x5e, + 0x5e, 0x7d, 0x82, 0x6c, 0xb7, 0x94, 0x94, 0x94, + 0x94, 0x94, 0x94, 0x5d, 0x48, 0x48, 0x42, 0x48, + 0x70, 0x2b, 0x21, 0x70, 0x73, 0x67, 0x94, 0x8f, + 0x94, 0x8f, 0x8f, 0x8f, 0x8b, 0x8f, 0x98, 0x0, + 0x8b, 0x7d, 0x4e, 0xa3, 0x79, 0x98, 0x4e, 0x4e, + 0x98, 0x79, 0x4e, 0x4e, 0x4e, 0x79, 0x4e, 0x0, + 0x4e, 0x82, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x4e, + 0x68, 0x68, 0x4e, 0x68, 0x68, 0x79, 0x68, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x76, 0x8d, 0x37, 0x37, 0x82, 0x82, 0x5e, + 0x7, 0x1f, 0x46, 0x7, 0x7, 0x93, 0x5f, 0x30, + 0x37, 0x8d, 0x98, 0x5e, 0x1f, 0x46, 0x98, 0x6c, + 0x7, 0x5f, 0x12, 0xf3, 0xe4, 0xa6, 0x60, 0x60, + 0x74, 0x7e, 0x94, 0x7e, 0x91, 0x6a, 0x91, 0x94, + 0xaa, 0x94, 0x94, 0x5f, 0x2f, 0x62, 0x82, 0x9f, + 0x1f, 0x8b, 0x8d, 0x82, 0x82, 0x62, 0x46, 0x28, + 0xa8, 0xb3, 0x5f, 0x12, 0x55, 0x62, 0x93, 0x9c, + 0x7e, 0x94, 0x94, 0x91, 0xb0, 0xaf, 0x4d, 0x99, + 0x99, 0x99, 0x90, 0x31, 0x31, 0x5d, 0x81, 0x91, + 0x91, 0x91, 0x7e, 0x8f, 0x94, 0xa8, 0x28, 0x1e, + 0x62, 0x46, 0x5e, 0x8d, 0x8b, 0x8d, 0x68, 0x8d, + 0x98, 0x82, 0xe, 0x98, 0x8f, 0xa8, 0x28, 0x82, + 0x8f, 0x8d, 0x5e, 0x8d, 0x8f, 0x98, 0x79, 0x98, + 0x8b, 0x76, 0x28, 0x93, 0x7d, 0xa7, 0x28, 0x98, + 0x62, 0x98, 0x8d, 0x8f, 0x8f, 0x8d, 0x46, 0x8b, + 0x7d, 0xa7, 0xb9, 0x8f, 0x62, 0x37, 0x82, 0x98, + 0x8f, 0x46, 0x8b, 0x8f, 0x8f, 0x6c, 0xa7, 0x9c, + 0x9c, 0xb7, 0xc8, 0xaa, 0x74, 0x5f, 0x74, 0x7e, + 0x7d, 0xa7, 0xa9, 0x7e, 0x93, 0x7, 0xb3, 0xaa, + 0x62, 0xa7, 0x60, 0x91, 0x91, 0x81, 0x81, 0x71, + 0x85, 0x7f, 0x34, 0x3b, 0x34, 0x2b, 0x73, 0x34, + 0x20, 0x4d, 0x66, 0x71, 0x91, 0x94, 0x94, 0x8f, + 0x76, 0x6c, 0x9c, 0xaa, 0x76, 0x76, 0x8f, 0x74, + 0x8d, 0x5e, 0x8b, 0x7d, 0x6c, 0x76, 0x7d, 0x9c, + 0x9c, 0x8f, 0x91, 0x90, 0x6a, 0x71, 0x90, 0x99, + 0x71, 0x6b, 0x95, 0x81, 0x6b, 0x91, 0x91, 0x8f, + 0x9c, 0x7d, 0x8f, 0xa8, 0x37, 0x76, 0x8b, 0x5f, + 0x5e, 0x82, 0x98, 0x5e, 0x5e, 0x76, 0x8b, 0xa7, + 0xa7, 0x74, 0x94, 0x6a, 0x6f, 0x81, 0x6a, 0x9a, + 0x99, 0x58, 0x71, 0x71, 0x63, 0x58, 0x5d, 0x81, + 0x90, 0x91, 0x94, 0x7d, 0xa7, 0x98, 0x8d, 0x5e, + 0x5e, 0x82, 0x82, 0x5e, 0x6c, 0x9c, 0x7d, 0x6c, + 0xb8, 0x76, 0x5e, 0x86, 0x76, 0x94, 0x94, 0x94, + 0x91, 0x5d, 0x67, 0x99, 0x70, 0x34, 0x2b, 0xf2, + 0x3d, 0x3d, 0x70, 0x2b, 0x3d, 0x2b, 0x42, 0x91, + 0x8f, 0x94, 0x8f, 0x8f, 0x8b, 0x98, 0xa3, 0x4e, + 0x9e, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x4e, 0x68, 0x68, 0x68, 0x68, 0x19, + 0x19, 0xff, 0x19, 0x19, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x93, 0x8f, 0x62, 0x76, 0x76, 0x76, 0x7d, 0xa0, + 0xa0, 0x46, 0x7d, 0x6c, 0x6c, 0x98, 0x98, 0x79, + 0x8d, 0x8b, 0x93, 0x76, 0x6c, 0x93, 0x9c, 0xf7, + 0xb7, 0x9c, 0x89, 0x6c, 0xa7, 0x62, 0x94, 0x8f, + 0x7e, 0x91, 0x81, 0x81, 0x85, 0x6f, 0x81, 0x81, + 0x6b, 0x91, 0x94, 0x93, 0x93, 0x8f, 0x8d, 0x68, + 0x8d, 0x8b, 0x76, 0x28, 0xa8, 0xa8, 0x76, 0x5e, + 0x5f, 0x62, 0x8d, 0x82, 0x8b, 0x8f, 0x9c, 0x62, + 0x91, 0x6a, 0x91, 0x6f, 0x67, 0x99, 0x99, 0x99, + 0x54, 0x54, 0x1c, 0x4d, 0x3a, 0x20, 0x31, 0x5d, + 0x6f, 0xb0, 0x7e, 0x74, 0x74, 0x74, 0x5e, 0x5e, + 0x82, 0x8d, 0x68, 0x5e, 0x8d, 0x32, 0xa3, 0x5e, + 0x5e, 0xa0, 0x6c, 0x86, 0x76, 0xfc, 0x5e, 0x8d, + 0x82, 0x5e, 0x28, 0x28, 0x8d, 0x5e, 0x5e, 0x5e, + 0x37, 0x6c, 0x6c, 0x8d, 0x32, 0x28, 0x1e, 0x8d, + 0x8d, 0x68, 0x9f, 0x1e, 0x76, 0x6c, 0x7, 0x28, + 0x37, 0x8, 0xfc, 0x8d, 0x68, 0x68, 0x28, 0x82, + 0x8d, 0x5e, 0x6c, 0xa7, 0x37, 0x8, 0xdd, 0x6c, + 0x68, 0x8, 0xf7, 0x6c, 0x5e, 0x6c, 0x6c, 0x28, + 0x5e, 0x7, 0xba, 0xc, 0x2f, 0x2f, 0xa0, 0x9c, + 0x76, 0x28, 0x55, 0x91, 0x6b, 0x6f, 0x9a, 0x7f, + 0x48, 0x34, 0x34, 0x15, 0x3b, 0x3b, 0x3b, 0x48, + 0x9a, 0x7f, 0x48, 0x31, 0x55, 0xa7, 0x9c, 0xa8, + 0xa0, 0xe, 0xc, 0xa0, 0x6c, 0x6c, 0x1f, 0x9f, + 0x5e, 0xa3, 0x86, 0xfc, 0xa7, 0x6c, 0xa7, 0xb3, + 0xba, 0x3e, 0x6f, 0x6f, 0x6a, 0x71, 0x7f, 0x42, + 0x9a, 0x85, 0x90, 0x99, 0x99, 0x71, 0x81, 0xaa, + 0xa8, 0x28, 0x46, 0x28, 0x5e, 0x5e, 0x5e, 0xfc, + 0x28, 0x6c, 0x5e, 0x6c, 0xdd, 0x2f, 0x76, 0x37, + 0xa9, 0x5f, 0x55, 0x27, 0x91, 0x81, 0x85, 0x48, + 0x54, 0x23, 0x54, 0xa, 0xea, 0x42, 0x4d, 0x31, + 0x6a, 0x81, 0x94, 0x7e, 0x46, 0x82, 0x76, 0x5e, + 0x9f, 0x6c, 0x5e, 0x9f, 0x7, 0x8, 0x1e, 0x1e, + 0x5e, 0x5e, 0x5e, 0x76, 0x30, 0x7e, 0x94, 0x94, + 0x99, 0x73, 0x2b, 0x34, 0x34, 0xf2, 0x2b, 0x15, + 0x3d, 0x3b, 0x73, 0x3d, 0x3d, 0x3d, 0x34, 0xf2, + 0xf2, 0xf2, 0x42, 0x36, 0x8b, 0x8b, 0x98, 0xa3, + 0xa3, 0x4e, 0x4e, 0x0, 0x4e, 0xa3, 0x4e, 0x4e, + 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x4e, 0x4e, 0x0, + 0x8d, 0x68, 0x68, 0xa3, 0x4e, 0x4e, 0x68, 0x19, + 0xff, 0xff, 0x34, 0x19, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x4e, 0x0, 0x4e, 0xff, 0x19, 0x19, 0xff, + 0x19, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x9c, 0x93, 0xa7, 0xb7, 0x6c, 0x28, 0xfc, + 0x6c, 0x5e, 0x68, 0x86, 0xfc, 0x68, 0x68, 0xa3, + 0x9f, 0xe, 0x37, 0x6c, 0x7, 0x6c, 0x28, 0xe, + 0xfc, 0x28, 0x82, 0x6c, 0x37, 0x74, 0x9c, 0x9c, + 0xb3, 0x85, 0x58, 0x6f, 0x85, 0x71, 0x81, 0x5d, + 0x5d, 0x81, 0x94, 0x76, 0x9c, 0x5f, 0x76, 0x5e, + 0x6c, 0xa0, 0xfc, 0x1f, 0x28, 0x28, 0x5e, 0x5e, + 0xe, 0x46, 0x28, 0x5e, 0xa7, 0xa6, 0x3e, 0x55, + 0x6a, 0xb0, 0x90, 0x3a, 0x4d, 0x26, 0x97, 0x6e, + 0xfa, 0x73, 0xf1, 0xa, 0x6e, 0x54, 0xf9, 0x4d, + 0x3a, 0x6f, 0x74, 0x7d, 0x55, 0x46, 0x76, 0x5e, + 0x5e, 0xe, 0xe, 0x68, 0x9f, 0x9f, 0x9f, 0xfc, + 0x5e, 0x86, 0x5e, 0xa3, 0x28, 0x1e, 0x5e, 0x68, + 0x9f, 0x6c, 0xf7, 0x1e, 0x9f, 0x5e, 0x9f, 0x9e, + 0x28, 0x86, 0x5e, 0xa3, 0x86, 0x6c, 0x1f, 0x5e, + 0x5e, 0x6c, 0xb7, 0xe, 0x1e, 0x68, 0x9f, 0x5e, + 0x37, 0x1e, 0x68, 0xa3, 0x86, 0x5e, 0x6c, 0x1e, + 0x9f, 0x9f, 0xb8, 0xf, 0x1f, 0x5e, 0xa2, 0x68, + 0x9f, 0x5e, 0x28, 0x9e, 0x5e, 0xa3, 0x8, 0xba, + 0x6c, 0x7, 0xdd, 0xa0, 0xe, 0x46, 0x46, 0x8f, + 0x93, 0x74, 0x81, 0x90, 0x83, 0x99, 0x73, 0x34, + 0x15, 0x3d, 0xf2, 0xeb, 0x34, 0x21, 0x34, 0x70, + 0x99, 0x67, 0x21, 0x39, 0x83, 0x60, 0x6a, 0x60, + 0x5f, 0x46, 0x93, 0x76, 0x5e, 0x79, 0x62, 0x82, + 0x6c, 0x5e, 0x76, 0xb3, 0x2c, 0x7d, 0x74, 0x60, + 0x47, 0x5d, 0x63, 0x9a, 0x85, 0x9a, 0x42, 0x34, + 0x42, 0x54, 0x73, 0x2a, 0x23, 0x67, 0x99, 0x6a, + 0x7e, 0x74, 0x8f, 0x82, 0x5e, 0x76, 0x82, 0xa7, + 0xa0, 0x37, 0x76, 0xa7, 0xc, 0x74, 0x62, 0x9c, + 0x74, 0x91, 0x81, 0x71, 0x6f, 0x99, 0x99, 0x34, + 0x3d, 0xeb, 0x34, 0x70, 0x21, 0x34, 0x48, 0x7f, + 0x58, 0x81, 0x81, 0x91, 0x91, 0x94, 0x8f, 0x9c, + 0x76, 0x9c, 0x82, 0x9f, 0x5e, 0x8d, 0x93, 0x8d, + 0x76, 0x8f, 0x8f, 0x8f, 0x7e, 0xb0, 0x99, 0x9a, + 0x48, 0x73, 0x15, 0x3d, 0x3d, 0x3d, 0x16, 0x16, + 0x16, 0x3d, 0xee, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, + 0x3d, 0x3b, 0x2e, 0x42, 0x62, 0x8f, 0x8b, 0x8b, + 0x98, 0x98, 0xa3, 0x4e, 0xa3, 0x79, 0x4e, 0x4e, + 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0xa3, 0x8d, 0x0, 0x4e, 0x79, 0x68, 0x8d, 0x8d, + 0x0, 0xa3, 0x68, 0x68, 0xff, 0xff, 0xff, 0xff, + 0x19, 0x19, 0xff, 0x15, 0xa3, 0x0, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x4e, 0x0, + 0x4e, 0x0, 0xff, 0xff, 0x0, 0x19, 0x19, 0x19, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xaa, 0xaa, 0x74, 0xa7, 0x37, 0xa7, 0x46, 0x37, + 0x5e, 0x86, 0x5e, 0x5e, 0xfc, 0x6c, 0x68, 0x68, + 0x7, 0xe, 0x1f, 0x5e, 0x5e, 0x5e, 0x46, 0x46, + 0x76, 0x76, 0x7d, 0x76, 0xa8, 0x83, 0x94, 0x91, + 0x6f, 0x63, 0x31, 0x31, 0x71, 0x6b, 0x71, 0x58, + 0x58, 0x6b, 0x91, 0x7e, 0x74, 0xb0, 0x9c, 0x76, + 0xa7, 0x9c, 0x46, 0x82, 0x76, 0x76, 0x5e, 0x5e, + 0x46, 0xaa, 0x9c, 0x9c, 0x7e, 0xb0, 0x5d, 0x6a, + 0x95, 0x90, 0x3a, 0x3a, 0xfe, 0x26, 0x5a, 0x7f, + 0x73, 0xeb, 0x15, 0x34, 0xeb, 0xfa, 0xfa, 0x39, + 0x26, 0x71, 0x6a, 0x91, 0x91, 0x94, 0x9c, 0x8b, + 0x7d, 0xe, 0xa0, 0x37, 0x79, 0x79, 0x5e, 0x5e, + 0x8d, 0x68, 0xa3, 0x8d, 0x79, 0x82, 0x6c, 0x76, + 0x8d, 0x28, 0xf7, 0x46, 0x98, 0x32, 0x9e, 0x8d, + 0x98, 0x79, 0x68, 0x82, 0x79, 0x79, 0x5e, 0x76, + 0x93, 0x82, 0xf7, 0x9c, 0x98, 0x5e, 0x68, 0x79, + 0x98, 0x8d, 0x6c, 0x82, 0x7d, 0x5e, 0xa0, 0xa8, + 0x8d, 0x32, 0x6c, 0x5f, 0x93, 0x5e, 0x5e, 0x76, + 0x68, 0xa3, 0x6c, 0xa8, 0x76, 0x9f, 0xa7, 0xaa, + 0x82, 0x5e, 0x46, 0x62, 0x94, 0x8f, 0x94, 0x91, + 0x91, 0x91, 0x90, 0x99, 0x6e, 0x7f, 0x73, 0x34, + 0x34, 0x15, 0x3d, 0x15, 0x15, 0x3b, 0x3d, 0x15, + 0xfa, 0x48, 0x48, 0x54, 0x26, 0x58, 0x6b, 0x91, + 0x91, 0x8f, 0x94, 0x94, 0x74, 0x46, 0x94, 0xaa, + 0xa8, 0x9c, 0x8f, 0x6a, 0x5b, 0x91, 0x91, 0x81, + 0x81, 0x85, 0x54, 0x70, 0xfa, 0x34, 0x2b, 0x15, + 0x34, 0x34, 0x34, 0x48, 0x23, 0x36, 0x67, 0x31, + 0x81, 0x91, 0x94, 0x8f, 0xa8, 0x9c, 0x8f, 0x7d, + 0xa0, 0x9c, 0x94, 0x62, 0x9c, 0x94, 0x91, 0x91, + 0x6a, 0x6a, 0x6f, 0x99, 0x54, 0x2a, 0x2b, 0x3b, + 0x34, 0xfa, 0x2b, 0x23, 0x23, 0x48, 0xfa, 0x21, + 0x67, 0x9a, 0x85, 0x6a, 0x6f, 0xb0, 0x81, 0x94, + 0x94, 0x8f, 0x8f, 0x8d, 0x82, 0x8f, 0x8f, 0x76, + 0x74, 0x94, 0x91, 0x91, 0x91, 0x99, 0x7f, 0x39, + 0x48, 0x34, 0x70, 0x3d, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0x16, 0x16, 0x3d, 0x3d, 0x16, + 0x17, 0x2e, 0x1a, 0x42, 0x2e, 0x2e, 0x8f, 0x8f, + 0x8b, 0x8b, 0x98, 0xa3, 0x79, 0x98, 0x4e, 0x4e, + 0x79, 0x8d, 0x4e, 0x4e, 0x8d, 0x8d, 0x4e, 0x4e, + 0x79, 0x8d, 0x0, 0x8d, 0x68, 0x79, 0x68, 0x4e, + 0x37, 0x16, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xa3, 0x4e, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x81, 0x91, 0x94, 0x94, 0x74, 0x8f, 0x8b, 0x8d, + 0x5e, 0x76, 0x82, 0x5e, 0x7, 0xa8, 0x76, 0x5e, + 0x28, 0x93, 0x93, 0x8d, 0x37, 0x62, 0x8f, 0x8f, + 0x74, 0xb3, 0x7e, 0x91, 0x6a, 0x83, 0x81, 0x5d, + 0x71, 0x3a, 0x99, 0x8a, 0x42, 0x67, 0x4d, 0x63, + 0x9a, 0x99, 0x6f, 0x6b, 0x81, 0x6a, 0x94, 0x94, + 0x94, 0x8f, 0x8f, 0x76, 0x9c, 0x8f, 0x9c, 0x76, + 0x74, 0x91, 0x83, 0x6a, 0x81, 0x81, 0x81, 0x85, + 0x9a, 0x67, 0x54, 0x34, 0x34, 0x34, 0xa, 0xa, + 0x54, 0x54, 0x73, 0xfa, 0x23, 0x48, 0xfa, 0xeb, + 0x48, 0x99, 0x90, 0x90, 0x81, 0x91, 0xb0, 0x6a, + 0x94, 0x94, 0x82, 0x82, 0x62, 0x8d, 0x8d, 0x8d, + 0x98, 0x98, 0x6c, 0x76, 0x8f, 0x93, 0x8, 0x5f, + 0x8f, 0x76, 0x68, 0x98, 0x98, 0x46, 0x8d, 0x98, + 0x8b, 0x8d, 0x7, 0x9c, 0x62, 0x8d, 0x28, 0x8b, + 0x62, 0x46, 0x79, 0x8f, 0x8f, 0x82, 0x37, 0x9c, + 0x98, 0x8d, 0x7, 0xa6, 0x93, 0x8d, 0x8d, 0x8f, + 0x8f, 0x1e, 0x76, 0x8b, 0x7d, 0x5e, 0x7, 0xab, + 0xa7, 0x32, 0x6c, 0xa8, 0x5f, 0x6c, 0x8d, 0x8b, + 0x93, 0x28, 0x74, 0x94, 0x91, 0x94, 0x6a, 0xb0, + 0x99, 0xb0, 0xb0, 0x99, 0x7f, 0x42, 0x23, 0xa, + 0xfa, 0x34, 0x15, 0xee, 0x3b, 0x3d, 0x15, 0x15, + 0xee, 0x15, 0x2a, 0x66, 0x59, 0x31, 0x58, 0x81, + 0x91, 0x94, 0x91, 0x6a, 0xa6, 0x9c, 0x8f, 0x7e, + 0x3e, 0x55, 0x91, 0x91, 0x91, 0x91, 0x6b, 0x85, + 0x9a, 0x99, 0x73, 0xee, 0x3d, 0x3d, 0x3d, 0xee, + 0xf2, 0xf2, 0x3b, 0x1d, 0x80, 0x99, 0x36, 0x4d, + 0x63, 0x6f, 0x91, 0x7e, 0x2c, 0x60, 0x94, 0x82, + 0x5e, 0x46, 0x55, 0x93, 0x93, 0x91, 0x91, 0x6f, + 0x99, 0x99, 0x6e, 0x54, 0x34, 0x34, 0x3d, 0x3d, + 0x73, 0x34, 0x21, 0x1c, 0x39, 0x73, 0x73, 0x2b, + 0x21, 0x70, 0x48, 0x9a, 0x71, 0x58, 0x5d, 0x91, + 0x8f, 0x8f, 0x8f, 0x1f, 0x46, 0xab, 0x9c, 0x82, + 0x8f, 0xaa, 0x6a, 0x94, 0x91, 0x99, 0x54, 0x2b, + 0x2b, 0x34, 0x3d, 0x15, 0x3d, 0x3d, 0xf2, 0x3d, + 0x3d, 0xf2, 0x16, 0x16, 0xf2, 0x16, 0x16, 0x14, + 0x16, 0xf2, 0x3d, 0xf2, 0x3b, 0xf2, 0x3d, 0x8f, + 0x8b, 0x98, 0x98, 0x79, 0xa3, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8d, 0x68, 0x68, 0x8d, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x81, 0x81, 0x94, 0x81, 0x91, 0x91, 0x8f, 0x76, + 0x7, 0xa8, 0x62, 0x5e, 0x28, 0x76, 0x46, 0x1e, + 0x5e, 0x98, 0x98, 0x1f, 0x30, 0x7e, 0x74, 0x93, + 0xaa, 0x71, 0x6b, 0x81, 0x95, 0x6b, 0x71, 0x4d, + 0x31, 0x67, 0x70, 0x34, 0x2b, 0xeb, 0xfa, 0x54, + 0x67, 0x67, 0x31, 0x31, 0x6b, 0x81, 0x91, 0x7e, + 0x6a, 0x55, 0x9c, 0x68, 0x7d, 0x60, 0x60, 0x46, + 0x8f, 0x91, 0x81, 0x95, 0x6b, 0x81, 0x6f, 0x85, + 0x7f, 0xfa, 0x3b, 0x15, 0x34, 0xfa, 0xeb, 0x34, + 0x99, 0x90, 0x6e, 0xfe, 0x36, 0x26, 0x6e, 0x54, + 0x2a, 0x23, 0x7f, 0x99, 0x6f, 0x6a, 0x6a, 0x5b, + 0x94, 0x98, 0x37, 0x82, 0x46, 0x79, 0x9f, 0x5e, + 0x8d, 0x5e, 0xe, 0x5f, 0x76, 0x8d, 0x68, 0x37, + 0x8d, 0x5e, 0x68, 0x5e, 0x8d, 0x1f, 0x5e, 0x76, + 0x98, 0x8d, 0x28, 0x46, 0x68, 0x68, 0x68, 0x5e, + 0x46, 0x1f, 0x68, 0x76, 0x76, 0x5e, 0xe, 0x37, + 0x5e, 0xa3, 0x5e, 0x37, 0x1e, 0xa3, 0xa3, 0x9f, + 0x5e, 0x1f, 0xa7, 0x76, 0x7, 0x9f, 0x5e, 0xf7, + 0x6c, 0x9f, 0x68, 0x32, 0x68, 0x68, 0x5e, 0x6c, + 0x7, 0x6c, 0x5f, 0xb3, 0xa8, 0x9c, 0x6a, 0x9a, + 0x80, 0x67, 0x80, 0x48, 0x73, 0x34, 0x21, 0x34, + 0xeb, 0xfa, 0x2b, 0x15, 0x34, 0x34, 0x21, 0x34, + 0x15, 0x3b, 0x70, 0x48, 0x2a, 0x23, 0x4d, 0x58, + 0xb0, 0xaa, 0x7e, 0xaa, 0x2c, 0x37, 0x8d, 0xa7, + 0x5f, 0x74, 0x94, 0x81, 0x6a, 0x90, 0x6f, 0x99, + 0x54, 0xa, 0x73, 0xf2, 0x16, 0x16, 0xf2, 0x15, + 0x3d, 0x16, 0x3d, 0x2b, 0x2b, 0x73, 0x34, 0x23, + 0x39, 0x90, 0x6a, 0x74, 0xa7, 0x76, 0x5e, 0x5e, + 0x5e, 0x76, 0x82, 0x9c, 0xa8, 0xb0, 0x6f, 0x81, + 0x66, 0x7f, 0x42, 0x42, 0x21, 0x15, 0x3d, 0x15, + 0x15, 0x3d, 0x3d, 0x73, 0xe6, 0x73, 0xeb, 0x48, + 0x1c, 0x1c, 0x1a, 0x31, 0x58, 0x58, 0x6b, 0x7e, + 0x74, 0xaa, 0xaa, 0x76, 0x82, 0x9c, 0x9c, 0x9c, + 0x8b, 0x91, 0x91, 0x6a, 0x80, 0x23, 0xf2, 0x3d, + 0x3d, 0x16, 0x3d, 0xf2, 0x34, 0x3b, 0x3d, 0x34, + 0x22, 0x3f, 0x3d, 0x3d, 0x16, 0x16, 0x16, 0x14, + 0x14, 0x16, 0x16, 0x16, 0x16, 0x2e, 0x22, 0x42, + 0x2e, 0x98, 0x98, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x4e, 0x4e, 0x79, 0x68, 0x79, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x90, 0x90, 0x81, 0x6b, 0x6a, 0xb3, 0x74, 0x76, + 0x5e, 0x37, 0x5e, 0x68, 0x68, 0x5e, 0x5e, 0x5e, + 0x5e, 0x9f, 0x6c, 0x5e, 0xe, 0x55, 0x9c, 0x46, + 0x62, 0x91, 0x81, 0x91, 0x81, 0x66, 0x9a, 0xfe, + 0x1c, 0xfa, 0x34, 0x34, 0x34, 0x21, 0x2b, 0x48, + 0x63, 0x63, 0x54, 0x39, 0x31, 0x6f, 0xb0, 0x9c, + 0x9c, 0xaa, 0xb7, 0x28, 0x28, 0x5f, 0x82, 0x76, + 0x62, 0x91, 0x91, 0x6a, 0x6f, 0x9a, 0x6e, 0x7f, + 0x48, 0x2a, 0x48, 0x21, 0x42, 0x36, 0x48, 0x48, + 0x7f, 0x5a, 0xd0, 0x3, 0x39, 0x39, 0xcb, 0xcb, + 0x7f, 0x66, 0x26, 0x20, 0x5d, 0x6a, 0x62, 0x8f, + 0x8f, 0x46, 0x76, 0x6c, 0x5e, 0x5e, 0x68, 0x68, + 0x86, 0x5e, 0x86, 0x5e, 0x5e, 0x86, 0xa3, 0xa3, + 0x5e, 0x68, 0x9f, 0x7, 0x5e, 0x4e, 0x5e, 0x68, + 0x9f, 0x5e, 0xa3, 0x68, 0x68, 0xa3, 0x4e, 0x5e, + 0x6c, 0x5e, 0x6c, 0xdd, 0x9f, 0x68, 0x68, 0x5e, + 0x32, 0x9f, 0x5e, 0x68, 0x5e, 0xa3, 0xa3, 0xb8, + 0x7, 0x9f, 0x9f, 0xb8, 0xa7, 0x68, 0x9f, 0x5e, + 0x32, 0xa3, 0x5e, 0x5e, 0x68, 0x9f, 0x6c, 0x7, + 0xb9, 0x37, 0x9c, 0x60, 0x6a, 0x6a, 0x91, 0x95, + 0x58, 0x36, 0x3f, 0x2b, 0xeb, 0xf2, 0x15, 0xeb, + 0x15, 0x15, 0x48, 0x48, 0xfa, 0x1a, 0x36, 0x42, + 0x70, 0x34, 0x34, 0xeb, 0x15, 0x2b, 0x42, 0x31, + 0x7f, 0x90, 0x6a, 0x91, 0x74, 0x74, 0x55, 0x74, + 0x9c, 0xaa, 0x81, 0x6f, 0x85, 0x90, 0x80, 0x99, + 0x73, 0x34, 0xee, 0xf2, 0x16, 0x14, 0x3b, 0x22, + 0x2b, 0x3d, 0x3d, 0x15, 0x3d, 0xee, 0xeb, 0x48, + 0x23, 0x39, 0x58, 0x55, 0x82, 0xa7, 0x9c, 0x5f, + 0x5f, 0xb3, 0x91, 0x91, 0x6a, 0x97, 0x99, 0x85, + 0x6f, 0x54, 0x2a, 0x42, 0x23, 0x34, 0xf2, 0x2b, + 0x34, 0x34, 0x34, 0x54, 0x23, 0x34, 0x34, 0x1d, + 0x80, 0x67, 0x54, 0x1c, 0x67, 0x80, 0x99, 0x5d, + 0x63, 0x31, 0x83, 0x91, 0x94, 0x94, 0x91, 0x91, + 0x91, 0x91, 0x99, 0x7f, 0xfa, 0x34, 0x14, 0x3d, + 0x3d, 0x15, 0x3d, 0x3b, 0x48, 0x70, 0x3d, 0x3b, + 0x2b, 0x70, 0x3d, 0x3d, 0x16, 0x16, 0x16, 0x14, + 0x16, 0x16, 0x18, 0x14, 0x16, 0x16, 0x16, 0x16, + 0x22, 0x1d, 0x98, 0x98, 0x98, 0x98, 0x5e, 0x4e, + 0x8d, 0x8d, 0x79, 0x68, 0x8d, 0x79, 0x68, 0x8d, + 0x8d, 0x8d, 0x8d, 0x7, 0x79, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xa3, 0xa3, + 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x23, 0x99, 0x90, 0x6a, 0x91, 0x6a, 0x91, 0x8f, + 0x46, 0x76, 0x93, 0x5e, 0x5e, 0x5e, 0x28, 0x5e, + 0x9f, 0xf7, 0xa7, 0x32, 0x8d, 0x74, 0x94, 0x7e, + 0x91, 0x91, 0x81, 0x5d, 0x90, 0x7f, 0x34, 0x2a, + 0x2a, 0x34, 0x15, 0x48, 0x36, 0x7f, 0x48, 0x1a, + 0x36, 0x67, 0x34, 0x48, 0x1c, 0x7f, 0x99, 0x83, + 0x7e, 0x7e, 0x2f, 0x2f, 0x62, 0x62, 0x8f, 0x74, + 0x91, 0x81, 0x6f, 0x6f, 0x90, 0x7f, 0x73, 0xfa, + 0x80, 0x80, 0x39, 0x42, 0x36, 0x63, 0x80, 0x99, + 0x3f, 0x54, 0xa, 0xea, 0x7f, 0x7f, 0x54, 0x54, + 0x3a, 0x6f, 0x90, 0x3a, 0x31, 0x58, 0x6a, 0x6a, + 0x91, 0x91, 0x60, 0xaa, 0x8f, 0x98, 0x5e, 0x37, + 0x46, 0x8d, 0x68, 0x82, 0x62, 0x1f, 0x28, 0x82, + 0x76, 0x79, 0x28, 0xa0, 0x93, 0x8d, 0x5e, 0x8d, + 0x30, 0x32, 0x86, 0x8d, 0x79, 0x1e, 0xf, 0xa8, + 0xa8, 0x5e, 0x28, 0x2c, 0x46, 0x5e, 0x68, 0x82, + 0x98, 0x1f, 0x68, 0x76, 0x9c, 0x6c, 0xfc, 0x2c, + 0xc, 0x5e, 0x5e, 0x46, 0x38, 0x5e, 0x79, 0x98, + 0x98, 0x28, 0x28, 0x9c, 0xb7, 0x5e, 0x76, 0x78, + 0xac, 0x9c, 0x7e, 0x91, 0x5d, 0x4c, 0x71, 0x80, + 0x99, 0x23, 0x2b, 0x3d, 0x3d, 0xf2, 0x2b, 0x15, + 0x15, 0x3b, 0x48, 0x48, 0x3f, 0x23, 0x1c, 0x39, + 0x73, 0x34, 0x15, 0x34, 0x15, 0x3f, 0xfe, 0x36, + 0x23, 0x36, 0x6b, 0x91, 0x81, 0x6a, 0x58, 0x81, + 0x6f, 0xb0, 0x6f, 0x58, 0x26, 0x7f, 0x9a, 0x7f, + 0x2b, 0xee, 0x3b, 0x3d, 0x14, 0x3d, 0x3d, 0x34, + 0xeb, 0x34, 0x73, 0x2a, 0x15, 0x3d, 0x15, 0x34, + 0xfa, 0x21, 0x42, 0x6a, 0x74, 0xa8, 0x6a, 0x7e, + 0x6a, 0x83, 0x6a, 0x91, 0x71, 0x4d, 0x36, 0x9a, + 0x7f, 0x2b, 0x3d, 0x3b, 0x34, 0x70, 0x70, 0x21, + 0x34, 0x3f, 0x70, 0x67, 0x42, 0x2b, 0x70, 0x54, + 0x48, 0x34, 0x2b, 0x34, 0x48, 0x2a, 0x54, 0x67, + 0x3c, 0x31, 0x58, 0x91, 0x81, 0x91, 0x81, 0x31, + 0x9a, 0x99, 0x48, 0x34, 0x15, 0xf2, 0x3d, 0x3d, + 0x15, 0x3f, 0x17, 0x3f, 0x70, 0x48, 0x3d, 0x3d, + 0x3b, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x16, 0x16, + 0x70, 0x3d, 0x16, 0x14, 0x16, 0x14, 0x14, 0x16, + 0x3d, 0x22, 0x2e, 0x93, 0x98, 0x98, 0x8d, 0x4e, + 0x8d, 0x8d, 0x8d, 0x8d, 0x79, 0x8d, 0x8d, 0x68, + 0x79, 0x68, 0x68, 0x8d, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0x4e, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x4e, + 0x4e, 0x0, 0x0, 0x4e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x70, 0x3b, 0x7f, 0x58, 0x71, 0x6a, 0x5d, 0x6a, + 0x7e, 0x94, 0x8f, 0x82, 0x1f, 0xa8, 0x9c, 0x82, + 0x82, 0x62, 0x62, 0x93, 0x8f, 0x91, 0x6a, 0x5d, + 0x5d, 0x85, 0x99, 0x99, 0x48, 0x2b, 0x3d, 0x3f, + 0x70, 0x16, 0x15, 0x48, 0x80, 0x99, 0x73, 0x23, + 0x48, 0x23, 0x73, 0x2a, 0x1d, 0x1a, 0x42, 0x58, + 0x81, 0x91, 0x6a, 0x4a, 0x91, 0x91, 0x91, 0x6f, + 0x58, 0x31, 0x99, 0x99, 0x31, 0x1c, 0x3f, 0x1d, + 0x80, 0x9a, 0x2a, 0x48, 0x42, 0x67, 0x54, 0x70, + 0x73, 0x48, 0xf9, 0x67, 0x58, 0x85, 0x67, 0x23, + 0x63, 0x6f, 0x99, 0x54, 0x26, 0x67, 0x99, 0x90, + 0x6a, 0x81, 0x81, 0x91, 0x8f, 0x8f, 0x8d, 0x46, + 0x8f, 0x98, 0x5e, 0xa8, 0xaa, 0x62, 0x28, 0x5f, + 0x7d, 0x8d, 0x28, 0x98, 0x8f, 0x8d, 0x8d, 0x98, + 0x62, 0x8d, 0x82, 0xa7, 0x9c, 0x8d, 0x46, 0x62, + 0x8f, 0x8d, 0x5e, 0x98, 0x8b, 0x8d, 0x68, 0x9c, + 0x5f, 0x82, 0x76, 0x5f, 0xb3, 0x28, 0x28, 0x93, + 0x8d, 0xa3, 0x5e, 0x98, 0x93, 0x5e, 0x82, 0x9c, + 0x9c, 0xa7, 0x8d, 0x89, 0x5f, 0x9f, 0x79, 0x8f, + 0x89, 0x74, 0x91, 0x81, 0x63, 0x6e, 0x7f, 0x73, + 0x1, 0x34, 0xfa, 0x15, 0x3d, 0x21, 0x36, 0x1a, + 0x22, 0x3f, 0x1d, 0x48, 0xf2, 0x15, 0x2b, 0x15, + 0xeb, 0x34, 0x21, 0x2b, 0x3b, 0x34, 0x36, 0x36, + 0x36, 0x42, 0x80, 0x71, 0xb0, 0x90, 0x71, 0x6b, + 0x90, 0x90, 0x6f, 0x58, 0x4d, 0x1c, 0x23, 0x21, + 0x16, 0x16, 0xf2, 0x16, 0x16, 0x14, 0x16, 0xf5, + 0xeb, 0xfa, 0x23, 0x1c, 0x23, 0x3b, 0x3b, 0x15, + 0x3d, 0x15, 0x48, 0x6f, 0x2c, 0x2c, 0x60, 0x7e, + 0x94, 0x91, 0x95, 0x6a, 0x6f, 0x67, 0x48, 0x54, + 0x70, 0x15, 0x3d, 0x3b, 0x3b, 0xf2, 0x34, 0x7f, + 0x36, 0x48, 0x42, 0x42, 0x36, 0x3f, 0x34, 0xfa, + 0x34, 0x15, 0x3d, 0x2b, 0x34, 0x15, 0x15, 0x48, + 0x36, 0x4d, 0x59, 0x5d, 0x81, 0x81, 0x99, 0x8a, + 0x48, 0x70, 0x34, 0xee, 0x3d, 0x3d, 0x16, 0x15, + 0x3f, 0x70, 0x70, 0x3d, 0x70, 0x34, 0xf2, 0x3d, + 0xf2, 0x3d, 0x16, 0x3d, 0x3d, 0x3d, 0x16, 0x3d, + 0x3d, 0x16, 0x16, 0x16, 0x14, 0x16, 0x14, 0x14, + 0x14, 0x22, 0x16, 0x3f, 0x8d, 0x8d, 0x4e, 0x4e, + 0x4e, 0x4e, 0x0, 0x0, 0x68, 0x79, 0x0, 0x68, + 0x79, 0x68, 0x79, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x16, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x4e, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x4d, 0x1d, 0x42, 0x9a, 0x85, 0x99, 0x9a, 0x6b, + 0x91, 0x7e, 0xaa, 0x82, 0x5e, 0x8d, 0x93, 0x5e, + 0x8d, 0x8b, 0x94, 0x62, 0x7e, 0x81, 0x90, 0x63, + 0x59, 0x99, 0x99, 0x99, 0x42, 0x21, 0x70, 0x42, + 0x42, 0x3f, 0x3b, 0x2a, 0x48, 0x15, 0xeb, 0x3b, + 0x15, 0x34, 0x34, 0x42, 0x4d, 0x4d, 0x36, 0x3a, + 0x5d, 0x6a, 0x60, 0xa6, 0x55, 0x91, 0x83, 0x83, + 0x5d, 0x63, 0x31, 0x36, 0x4d, 0x36, 0x1d, 0x3f, + 0x42, 0x39, 0x34, 0x73, 0x54, 0x2a, 0x73, 0x54, + 0x6e, 0x66, 0x4d, 0x3a, 0x58, 0x5d, 0x90, 0x26, + 0x7f, 0x99, 0x54, 0x2b, 0x54, 0x54, 0xf1, 0x99, + 0x6f, 0x91, 0x62, 0x62, 0x8f, 0x46, 0x5e, 0x6c, + 0x9c, 0x5e, 0x6c, 0x8, 0x28, 0x5e, 0x68, 0x9f, + 0x5e, 0x5e, 0x68, 0x5e, 0x76, 0x82, 0xa3, 0x7, + 0x7, 0x5e, 0x68, 0x28, 0x68, 0xa3, 0x68, 0x68, + 0x37, 0x68, 0x68, 0x86, 0x6c, 0x9f, 0x68, 0x6c, + 0xa0, 0x9f, 0x5e, 0x6c, 0x5e, 0x4e, 0x68, 0xa3, + 0x4e, 0xa3, 0x9e, 0x5e, 0x7, 0xb6, 0x5e, 0x5e, + 0x6c, 0x9f, 0x5e, 0x5e, 0x6c, 0x9f, 0x86, 0x76, + 0xa7, 0xc, 0x6a, 0x90, 0x90, 0xe6, 0x2a, 0x15, + 0x16, 0x3d, 0x15, 0x16, 0xf2, 0x34, 0x1c, 0x7f, + 0x48, 0xeb, 0x2a, 0xfa, 0xf5, 0x73, 0x73, 0x2b, + 0x3b, 0x34, 0x36, 0x70, 0x3d, 0x15, 0x2b, 0x34, + 0xfa, 0x73, 0x23, 0x4d, 0x58, 0x83, 0x81, 0x71, + 0x63, 0x67, 0x67, 0x99, 0x34, 0x1, 0x15, 0x15, + 0x16, 0x3d, 0x3d, 0x15, 0x17, 0x3b, 0x3d, 0x3f, + 0x3b, 0x15, 0x48, 0x23, 0x73, 0xf2, 0xf2, 0xf2, + 0x3d, 0x2b, 0x99, 0x3e, 0x27, 0x27, 0x74, 0x74, + 0x7e, 0x83, 0x99, 0x99, 0x99, 0xa, 0x34, 0x34, + 0xfa, 0x34, 0x70, 0x67, 0x36, 0x22, 0x42, 0x99, + 0x6e, 0x15, 0x15, 0xfa, 0x34, 0x73, 0x73, 0x73, + 0x23, 0x22, 0x48, 0x1d, 0x48, 0x3b, 0x3d, 0x3b, + 0x34, 0x54, 0x48, 0x21, 0x48, 0x7f, 0x73, 0x54, + 0x23, 0x15, 0x15, 0x3d, 0x15, 0x3d, 0x16, 0x3d, + 0x15, 0x3d, 0x16, 0xf2, 0xf2, 0xf2, 0x34, 0x70, + 0x70, 0x3f, 0x3b, 0x3d, 0x3b, 0x3d, 0x16, 0x16, + 0x3d, 0x16, 0x16, 0x16, 0x14, 0x16, 0x16, 0x16, + 0x3d, 0x22, 0x22, 0x22, 0x98, 0x8d, 0x4e, 0x0, + 0x9f, 0x4e, 0x4e, 0x4e, 0x79, 0x68, 0x79, 0x8d, + 0x79, 0x68, 0x15, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x19, 0x0, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x4e, + 0x4e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x19, 0x19, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x90, 0x67, 0x48, 0x42, 0x26, 0x67, 0x99, 0x6a, + 0x55, 0x55, 0x46, 0x76, 0x68, 0x5e, 0x5e, 0xfc, + 0x28, 0x76, 0xa7, 0xa8, 0x27, 0x6f, 0x99, 0x90, + 0x99, 0x70, 0x48, 0x67, 0x99, 0x54, 0x2a, 0x23, + 0x39, 0x2a, 0xa, 0xcb, 0xe6, 0x21, 0x48, 0x48, + 0x48, 0x2b, 0x3b, 0x23, 0x67, 0x54, 0x54, 0xf9, + 0x20, 0x4a, 0x50, 0xe4, 0x60, 0x6a, 0x27, 0x60, + 0x6a, 0x99, 0x6e, 0xea, 0x23, 0x48, 0x9, 0x6e, + 0xfa, 0x23, 0x42, 0x7f, 0x80, 0x67, 0x23, 0xa, + 0xb4, 0x69, 0x7f, 0xfd, 0x26, 0x41, 0xb4, 0xd0, + 0x26, 0xf9, 0xfe, 0x99, 0x66, 0x67, 0x7f, 0x1c, + 0x3a, 0x6f, 0xa6, 0xa0, 0x11, 0x1f, 0x28, 0x6c, + 0x28, 0x5e, 0x1e, 0x28, 0x5e, 0x5e, 0x32, 0xfc, + 0xe, 0x5e, 0x68, 0x7, 0xdd, 0xe, 0x37, 0x5e, + 0x37, 0x68, 0x68, 0x1f, 0x68, 0x9f, 0x5e, 0x68, + 0xe, 0xe, 0x9f, 0x5e, 0x7, 0xfc, 0xfc, 0x5e, + 0x79, 0x68, 0x68, 0xfc, 0x1e, 0x5e, 0xa3, 0x68, + 0x7, 0x7, 0x68, 0x6c, 0x6c, 0x9f, 0x86, 0x37, + 0x5e, 0x68, 0x5e, 0x37, 0x2f, 0xf3, 0xa7, 0x74, + 0x50, 0xb, 0x20, 0x99, 0x99, 0x8a, 0x48, 0x22, + 0x15, 0x15, 0x70, 0x3b, 0x3d, 0x15, 0x3b, 0xf2, + 0xeb, 0x15, 0x2a, 0x34, 0x54, 0x7f, 0x67, 0x1a, + 0x2e, 0x3f, 0x48, 0x70, 0x16, 0x3d, 0x3d, 0x3d, + 0x15, 0x15, 0x39, 0x1a, 0x36, 0x71, 0x6f, 0x85, + 0x4d, 0x23, 0xfa, 0x15, 0x3d, 0x16, 0x16, 0x16, + 0x16, 0xf2, 0x15, 0x3f, 0x22, 0x3f, 0x70, 0x48, + 0x15, 0x15, 0xf5, 0x3d, 0x15, 0x16, 0x16, 0x3d, + 0xf2, 0x70, 0x67, 0x6a, 0x6a, 0x6b, 0x81, 0x83, + 0x90, 0x99, 0x54, 0xfa, 0xeb, 0x34, 0xeb, 0xf2, + 0x15, 0x21, 0x67, 0x9a, 0x67, 0x42, 0x23, 0x54, + 0x54, 0x34, 0x3d, 0x34, 0x15, 0x15, 0x15, 0x21, + 0x34, 0x21, 0x48, 0x70, 0x7f, 0x3f, 0x3d, 0x17, + 0x15, 0x3d, 0x17, 0x70, 0x34, 0x34, 0x34, 0x34, + 0xfa, 0x3b, 0x15, 0x16, 0x34, 0x3d, 0xf2, 0xf2, + 0xf2, 0xf2, 0x16, 0x3d, 0x3d, 0x3d, 0x3d, 0x70, + 0x70, 0x3f, 0x3b, 0x16, 0x3d, 0x16, 0x16, 0x16, + 0x16, 0x14, 0x14, 0x16, 0x14, 0x14, 0x14, 0x14, + 0x18, 0x16, 0x16, 0x16, 0x16, 0x98, 0x8d, 0x4e, + 0x8d, 0x8d, 0x8d, 0x19, 0x19, 0x19, 0x79, 0x68, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, + 0x19, 0x19, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x19, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, + 0x73, 0x73, 0x73, 0x23, 0x1c, 0x4d, 0x63, 0x6a, + 0x4a, 0x4a, 0x7e, 0x46, 0x5e, 0x82, 0xe, 0xe, + 0x9c, 0x93, 0x6a, 0x6a, 0x58, 0x3a, 0x6f, 0x90, + 0x4d, 0x48, 0x1a, 0x39, 0x54, 0xeb, 0xeb, 0xea, + 0xfa, 0x54, 0x6e, 0xf9, 0x26, 0x36, 0x36, 0x80, + 0x7f, 0x48, 0x3b, 0x2b, 0x34, 0x2b, 0x34, 0x54, + 0x42, 0x6f, 0x6a, 0x6a, 0x55, 0x5d, 0x4a, 0x1b, + 0x97, 0xa, 0xfa, 0xeb, 0xeb, 0xeb, 0xfa, 0x54, + 0x23, 0x1c, 0x31, 0x90, 0x6f, 0x63, 0x23, 0x48, + 0x54, 0x54, 0x9, 0x54, 0x39, 0x54, 0x5a, 0x56, + 0x90, 0x3c, 0x4d, 0x31, 0x90, 0x90, 0x99, 0xfe, + 0x99, 0x99, 0x41, 0x11, 0x4a, 0x27, 0x8d, 0x82, + 0x8b, 0x8b, 0x46, 0x62, 0x8f, 0x76, 0x82, 0x82, + 0x60, 0x9c, 0x5e, 0x82, 0x9c, 0x46, 0x8d, 0x82, + 0x93, 0x8d, 0x28, 0x98, 0x8b, 0x32, 0x79, 0x76, + 0x60, 0xa8, 0x28, 0x98, 0x93, 0x8d, 0x8d, 0x98, + 0x98, 0x8d, 0x68, 0x98, 0x98, 0x37, 0x28, 0x82, + 0x5f, 0x28, 0x5e, 0x98, 0x98, 0x5e, 0x5e, 0x98, + 0x98, 0x6c, 0x76, 0x74, 0xaa, 0x50, 0xa6, 0x91, + 0x6a, 0x6f, 0x63, 0x7f, 0x73, 0x73, 0x73, 0x15, + 0x22, 0xeb, 0x73, 0xfa, 0x15, 0xeb, 0x2b, 0x15, + 0x3b, 0x34, 0x15, 0x15, 0x22, 0x23, 0x23, 0x48, + 0x21, 0x15, 0x34, 0xfa, 0x15, 0x15, 0xf2, 0x3d, + 0x16, 0x3d, 0x15, 0x2b, 0x70, 0x7f, 0x99, 0x99, + 0x54, 0x34, 0xeb, 0xee, 0x15, 0x3b, 0x16, 0x16, + 0x16, 0x16, 0xf2, 0x16, 0xf2, 0x17, 0x34, 0xeb, + 0xfa, 0x34, 0x34, 0x17, 0x3b, 0x17, 0x17, 0x16, + 0x17, 0x3b, 0x48, 0x9a, 0x81, 0x71, 0xb0, 0x99, + 0x99, 0x39, 0x2a, 0x34, 0x2b, 0x15, 0x21, 0x3d, + 0x15, 0x3b, 0x48, 0x54, 0x54, 0x54, 0x73, 0xfa, + 0x23, 0x48, 0x42, 0x1d, 0x1d, 0x3b, 0x22, 0x21, + 0x15, 0x3d, 0x15, 0x15, 0x1, 0x2b, 0x34, 0x34, + 0x34, 0x22, 0x22, 0x21, 0x15, 0x3d, 0x3d, 0xf2, + 0x3d, 0x3d, 0x3d, 0xf2, 0xf2, 0x34, 0x34, 0x34, + 0x15, 0x3b, 0x17, 0x3b, 0x3d, 0x16, 0xf2, 0x3d, + 0x3d, 0x3d, 0x3d, 0xf2, 0x3d, 0x16, 0x3d, 0x3d, + 0x3d, 0x16, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, + 0x14, 0xff, 0x14, 0x16, 0x22, 0x22, 0x8d, 0x0, + 0x8d, 0x8d, 0x19, 0x19, 0x19, 0x19, 0x19, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, + 0x19, 0x19, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, + 0xeb, 0x3f, 0x2a, 0x34, 0x48, 0x7f, 0x99, 0x85, + 0x5d, 0x6b, 0x5d, 0xaa, 0x9c, 0x8f, 0x6a, 0x6a, + 0x91, 0x91, 0x91, 0x6a, 0x66, 0x26, 0x99, 0x7f, + 0x39, 0x48, 0xfa, 0x34, 0x48, 0x48, 0x23, 0x23, + 0x54, 0x54, 0x7f, 0x9a, 0x59, 0x67, 0x67, 0x54, + 0x70, 0x48, 0x48, 0x34, 0x2b, 0x21, 0x21, 0x36, + 0x67, 0x9a, 0x71, 0x6a, 0x6a, 0x6f, 0x90, 0x7f, + 0x9, 0x54, 0x2a, 0x54, 0x2a, 0x21, 0x1c, 0x36, + 0x23, 0x54, 0x39, 0x99, 0x99, 0x99, 0x54, 0x54, + 0x54, 0x67, 0x4d, 0x3a, 0x90, 0x4d, 0x26, 0x58, + 0x6f, 0x99, 0x26, 0x31, 0x5a, 0x99, 0x9a, 0x99, + 0xf1, 0x26, 0x3a, 0x5d, 0x91, 0x62, 0x8d, 0x62, + 0x74, 0x8f, 0x98, 0x8f, 0xad, 0x55, 0x82, 0x46, + 0x62, 0x82, 0x5e, 0x46, 0x8f, 0x98, 0x8d, 0x93, + 0x62, 0x93, 0x5e, 0x98, 0x74, 0xa8, 0x28, 0x93, + 0x8f, 0x8d, 0x8d, 0x8b, 0x8f, 0x8d, 0x5e, 0x98, + 0x7d, 0x28, 0x32, 0x98, 0x93, 0x76, 0x5e, 0x93, + 0x8d, 0x8d, 0x5e, 0x93, 0x7d, 0x28, 0x5e, 0x93, + 0xa7, 0xb8, 0xa8, 0x8f, 0x94, 0x55, 0x6a, 0x6a, + 0x95, 0x6f, 0x6f, 0x48, 0x34, 0xee, 0xf2, 0x3d, + 0x15, 0xee, 0x15, 0x34, 0x7f, 0x80, 0x23, 0x36, + 0x2e, 0x1d, 0x70, 0x3b, 0x3b, 0x15, 0xf2, 0x15, + 0x34, 0x34, 0xee, 0x15, 0x3f, 0x48, 0x34, 0x16, + 0x17, 0x17, 0x16, 0x3d, 0x15, 0x2b, 0x34, 0xf2, + 0x2b, 0xeb, 0xeb, 0x3d, 0x15, 0x54, 0x2a, 0x2a, + 0x22, 0x3b, 0x16, 0x3b, 0xf2, 0x3d, 0x15, 0xf2, + 0x34, 0x48, 0x48, 0x48, 0x2e, 0x1d, 0x70, 0x15, + 0x3d, 0x3d, 0x70, 0x7f, 0x85, 0x6f, 0x99, 0x54, + 0x23, 0x39, 0x99, 0xa, 0x23, 0x1d, 0x70, 0x73, + 0x34, 0x34, 0x2b, 0xeb, 0xeb, 0x2a, 0x48, 0x54, + 0x23, 0x1c, 0x80, 0x85, 0x67, 0x1d, 0x3f, 0x3d, + 0x15, 0x34, 0x2b, 0x15, 0x3d, 0x3d, 0x73, 0xfa, + 0xeb, 0x34, 0x48, 0x34, 0xf2, 0x3d, 0xf2, 0xf2, + 0x3d, 0xf2, 0x3d, 0xf2, 0xf2, 0xf2, 0x34, 0x70, + 0x15, 0x3b, 0x3b, 0x3d, 0x3d, 0x16, 0x3d, 0x16, + 0x3d, 0x16, 0x3d, 0x3d, 0x16, 0x14, 0x16, 0x70, + 0x3d, 0x3d, 0x3d, 0x18, 0x14, 0x18, 0x14, 0x18, + 0x14, 0xff, 0x14, 0x22, 0x22, 0x22, 0x17, 0x4e, + 0x0, 0x0, 0x19, 0x19, 0x19, 0xff, 0x17, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, + 0x19, 0x19, 0x0, 0x0, 0x4e, 0x4e, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, + 0x36, 0x36, 0x36, 0x54, 0x34, 0x34, 0x2b, 0x54, + 0x99, 0x90, 0x81, 0x6a, 0x55, 0x94, 0x8f, 0x8f, + 0x91, 0x5d, 0x31, 0x99, 0x54, 0x15, 0x3d, 0x15, + 0x15, 0x70, 0x7f, 0x54, 0x23, 0x36, 0x31, 0x6f, + 0x63, 0x42, 0x1c, 0x39, 0x73, 0x54, 0x2a, 0xfa, + 0x2a, 0x48, 0x80, 0x9a, 0x36, 0x36, 0x36, 0x58, + 0x90, 0x58, 0x31, 0x99, 0x3, 0x99, 0x5a, 0x5a, + 0xea, 0xcb, 0x40, 0xa1, 0x41, 0x20, 0xfe, 0x26, + 0x7f, 0x54, 0x54, 0x23, 0x54, 0x73, 0x54, 0x5a, + 0x6e, 0x26, 0x3a, 0x81, 0x6a, 0x6f, 0x31, 0x3a, + 0x67, 0x7f, 0x99, 0x67, 0x39, 0x6e, 0x99, 0x90, + 0x5a, 0x67, 0x1b, 0x30, 0x46, 0x5e, 0x28, 0x12, + 0x78, 0xa0, 0x6c, 0x76, 0x55, 0x30, 0x82, 0x8d, + 0x8d, 0x37, 0x1f, 0x1f, 0x9c, 0x7, 0x9f, 0x28, + 0x2c, 0xa0, 0x68, 0x68, 0x79, 0x1f, 0x1f, 0x5e, + 0x8d, 0x5e, 0xa3, 0x1f, 0xfc, 0x6c, 0xa3, 0x5e, + 0x37, 0xc, 0x68, 0x68, 0x68, 0x68, 0xfc, 0x1e, + 0x9f, 0x5e, 0xa3, 0x28, 0xe, 0xb8, 0x9f, 0x32, + 0x6c, 0xa7, 0x5f, 0x9c, 0xa7, 0xa7, 0x3e, 0x3a, + 0x67, 0xb4, 0xa, 0x73, 0x1, 0x15, 0xf2, 0x15, + 0x3b, 0x15, 0x3d, 0x34, 0x23, 0x6e, 0x54, 0x70, + 0x21, 0xfa, 0xa, 0x73, 0x23, 0xfa, 0x15, 0x3f, + 0x42, 0x1d, 0x15, 0x3d, 0x15, 0x73, 0xf2, 0x16, + 0x15, 0x3d, 0x15, 0x15, 0x48, 0xfa, 0x15, 0x16, + 0x16, 0x16, 0x14, 0x16, 0x3b, 0xeb, 0xeb, 0xe6, + 0xfa, 0x15, 0x21, 0x15, 0x1d, 0x1c, 0x48, 0x3d, + 0x3b, 0x54, 0x73, 0x3d, 0x34, 0x23, 0x73, 0x73, + 0xe6, 0x23, 0x39, 0x36, 0x6f, 0x85, 0x67, 0x34, + 0xeb, 0xfa, 0x73, 0xd8, 0x2a, 0xfa, 0xfa, 0xeb, + 0x6e, 0x1c, 0x23, 0x1d, 0x21, 0x42, 0x80, 0x34, + 0x15, 0x48, 0x54, 0xa, 0x73, 0x2a, 0x48, 0xfa, + 0x2a, 0x1d, 0x1a, 0x21, 0x15, 0x21, 0x2b, 0xf2, + 0x16, 0x15, 0xf2, 0xf2, 0xf2, 0xf2, 0xeb, 0xe6, + 0xeb, 0x3f, 0x23, 0x34, 0xf2, 0xf2, 0x16, 0x3d, + 0x16, 0x16, 0xf2, 0x16, 0x3d, 0x3d, 0x3b, 0x15, + 0x3d, 0x15, 0x3b, 0x3b, 0x16, 0x14, 0x16, 0x16, + 0x14, 0x18, 0x18, 0x14, 0x16, 0x14, 0x14, 0x16, + 0x14, 0x14, 0x16, 0x22, 0x17, 0x17, 0x8d, 0x0, + 0x4e, 0x4e, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x19, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x23, 0x42, 0x23, 0x6e, 0x2a, 0x34, 0x3f, 0x34, + 0x70, 0x63, 0x6a, 0x7e, 0x55, 0x7e, 0x8f, 0xac, + 0x52, 0x90, 0x7f, 0xa, 0xeb, 0x3f, 0x3b, 0x15, + 0x15, 0x48, 0x54, 0xa, 0xfa, 0x1c, 0x63, 0xb0, + 0xb4, 0x99, 0x7f, 0x6e, 0x23, 0x67, 0x63, 0x31, + 0x48, 0x48, 0x63, 0x90, 0x6e, 0x23, 0x42, 0x7f, + 0x6e, 0x99, 0x3a, 0xfd, 0xfd, 0x20, 0x3e, 0xf8, + 0xb, 0x26, 0x40, 0xc8, 0xd0, 0x5a, 0xe5, 0xf4, + 0xcb, 0xf9, 0xfe, 0xfd, 0x26, 0x39, 0x20, 0x6f, + 0x6f, 0x39, 0x31, 0x6f, 0xb4, 0x99, 0x20, 0x13, + 0x66, 0x99, 0x4a, 0x58, 0x3a, 0x26, 0x31, 0x6f, + 0x7f, 0x39, 0x1b, 0x2c, 0x28, 0xb8, 0x6c, 0x28, + 0x5f, 0xa7, 0x28, 0x5e, 0x82, 0x8d, 0x5e, 0x68, + 0x5e, 0x6c, 0x6c, 0x1f, 0x37, 0xb7, 0x7, 0x5e, + 0x37, 0x82, 0x68, 0x68, 0x68, 0x68, 0x5e, 0x8d, + 0x5e, 0x7, 0xb6, 0x5e, 0x79, 0x6c, 0x86, 0x5e, + 0x8d, 0x68, 0x68, 0x5e, 0x79, 0x5e, 0x5e, 0x8d, + 0x8d, 0x8, 0x7, 0x76, 0x82, 0x5e, 0x28, 0x82, + 0x93, 0x8b, 0x74, 0x7e, 0x91, 0xb0, 0xb4, 0x54, + 0x54, 0x34, 0x34, 0xe1, 0xfa, 0xe6, 0xfa, 0x1c, + 0x31, 0xf9, 0xfa, 0x34, 0x48, 0x34, 0xeb, 0x15, + 0x70, 0x34, 0x34, 0xfa, 0x36, 0x31, 0x1a, 0x2e, + 0x36, 0x1d, 0x2b, 0x15, 0x3d, 0xf2, 0x16, 0x3d, + 0x3d, 0x3d, 0x16, 0x15, 0x21, 0x23, 0x15, 0x16, + 0x14, 0x16, 0x14, 0x16, 0x16, 0x16, 0xf5, 0x1, + 0xfa, 0x48, 0x21, 0x21, 0x1c, 0x1a, 0x23, 0x34, + 0x34, 0x2b, 0xeb, 0x16, 0x15, 0x34, 0xfa, 0xee, + 0x34, 0x67, 0x63, 0x67, 0x36, 0x26, 0x39, 0x34, + 0x15, 0xfa, 0x34, 0xfa, 0xfa, 0x39, 0x39, 0xeb, + 0x2a, 0x42, 0x9a, 0x80, 0x48, 0x1c, 0x1d, 0x34, + 0x34, 0x3b, 0x3f, 0x2b, 0x34, 0x1d, 0x42, 0x70, + 0x34, 0x48, 0x1d, 0x54, 0xfa, 0x2b, 0x15, 0x3d, + 0x3d, 0x3d, 0x17, 0x3d, 0x3d, 0x3d, 0xeb, 0xd8, + 0xfa, 0x34, 0x23, 0xe6, 0xeb, 0xf2, 0x3d, 0x16, + 0x16, 0xf2, 0x3d, 0x3d, 0x16, 0x16, 0x3d, 0x3d, + 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0x16, 0x14, 0x14, + 0x14, 0x14, 0x16, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xff, 0x16, 0x16, 0x14, 0x8d, 0x8d, + 0x0, 0x79, 0x68, 0x19, 0xff, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x4e, + 0x0, 0x4e, 0x0, 0x4e, 0xff, 0x19, 0x19, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xfa, 0x48, 0x2a, 0xe6, 0x6e, 0x48, 0x67, 0x1d, + 0x1d, 0x59, 0x71, 0x81, 0x91, 0x91, 0x5d, 0xb0, + 0xb4, 0x99, 0x39, 0xa, 0xfa, 0x1c, 0x1c, 0x1d, + 0x22, 0x1c, 0x23, 0x34, 0x15, 0x23, 0x67, 0x6e, + 0xa, 0x7f, 0x9a, 0x99, 0x39, 0x31, 0x58, 0x85, + 0x67, 0x36, 0x36, 0x48, 0x34, 0x34, 0x34, 0x34, + 0x73, 0x23, 0x3c, 0x11, 0x1b, 0x1b, 0x11, 0xe, + 0x83, 0x90, 0x83, 0xcc, 0x3, 0xcb, 0x5a, 0xe0, + 0xcb, 0xf9, 0x20, 0x85, 0x85, 0x99, 0x41, 0x3a, + 0x99, 0x99, 0x99, 0x4d, 0x54, 0x54, 0x90, 0x85, + 0x59, 0x4d, 0x58, 0x5d, 0x5d, 0x63, 0x4d, 0x31, + 0xf1, 0x6e, 0xb, 0x55, 0x2c, 0x2c, 0x9f, 0x79, + 0x8b, 0x98, 0x1f, 0x46, 0x93, 0x93, 0x5e, 0x1f, + 0x55, 0xc, 0x8, 0x76, 0x9c, 0x12, 0xfc, 0x82, + 0x98, 0x82, 0x68, 0x1f, 0x93, 0x82, 0x6c, 0x76, + 0x9c, 0xc, 0x37, 0x93, 0x98, 0x5e, 0x1f, 0x98, + 0x98, 0x8d, 0x68, 0x98, 0x93, 0x76, 0x7, 0x8f, + 0x7d, 0xe, 0xe, 0x9c, 0x8b, 0x5e, 0x82, 0x8f, + 0x8f, 0x94, 0x91, 0x6a, 0x85, 0x99, 0x73, 0x70, + 0x73, 0x73, 0x3d, 0x34, 0x2a, 0xa, 0xf1, 0x23, + 0xfb, 0x39, 0x73, 0xeb, 0x2b, 0x15, 0x3d, 0x34, + 0x42, 0x48, 0x2b, 0x21, 0x36, 0x63, 0x99, 0x48, + 0x1d, 0x1d, 0x34, 0x34, 0x15, 0x17, 0x16, 0x16, + 0x3b, 0x17, 0x16, 0x3d, 0x15, 0x3b, 0x3d, 0xf2, + 0x16, 0x3d, 0x16, 0x3d, 0x15, 0x3b, 0x16, 0x15, + 0x15, 0x70, 0x34, 0x15, 0x22, 0x23, 0x54, 0x73, + 0xeb, 0x34, 0x21, 0x2b, 0x70, 0x42, 0x2b, 0x3b, + 0x21, 0x67, 0x99, 0x54, 0x23, 0x23, 0xfa, 0x73, + 0xa, 0xf9, 0x23, 0x23, 0x7f, 0x85, 0x99, 0x73, + 0x15, 0x48, 0x67, 0x7f, 0x34, 0xfa, 0x2b, 0x34, + 0x73, 0x2a, 0x1d, 0x22, 0x3f, 0x67, 0x67, 0x3b, + 0x3d, 0x21, 0x2b, 0x2b, 0x34, 0x15, 0xeb, 0xf2, + 0x3d, 0x73, 0x21, 0x15, 0x16, 0x2b, 0x2a, 0xfa, + 0xeb, 0x15, 0xa, 0xd8, 0xd8, 0xeb, 0x15, 0x15, + 0x3d, 0x3d, 0x3f, 0x15, 0x14, 0x3d, 0x3d, 0x16, + 0x18, 0x16, 0x16, 0x3d, 0x3d, 0x3d, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0x16, 0x14, 0xff, 0x14, 0x14, + 0xff, 0x14, 0x14, 0x14, 0x17, 0x3b, 0x79, 0x68, + 0x79, 0x8d, 0x0, 0x19, 0xff, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x4e, + 0x4e, 0x4e, 0x4e, 0xff, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x2b, 0x67, 0x54, 0x15, 0x48, 0x63, 0x9a, 0x99, + 0x7f, 0x42, 0x31, 0x90, 0xb0, 0x6f, 0x85, 0x67, + 0x7f, 0x4d, 0x99, 0xfa, 0x2a, 0x23, 0x67, 0x99, + 0x54, 0x48, 0x21, 0x2b, 0x70, 0x7f, 0x36, 0x1c, + 0x48, 0x9a, 0x85, 0x80, 0x26, 0x36, 0x4d, 0x9a, + 0x99, 0x70, 0x48, 0x21, 0x3f, 0x70, 0x1d, 0x15, + 0x15, 0x48, 0x63, 0xa1, 0xb, 0xfd, 0x1b, 0x60, + 0xa1, 0xaf, 0x3e, 0x11, 0x1b, 0x90, 0x60, 0x40, + 0x23, 0x54, 0x67, 0xaf, 0x5a, 0xf4, 0x23, 0x66, + 0x67, 0x99, 0x63, 0x31, 0x36, 0x4d, 0x71, 0x71, + 0x99, 0x26, 0x26, 0x9a, 0x90, 0x3, 0xf1, 0x39, + 0x39, 0x5a, 0x83, 0x55, 0x7e, 0x62, 0x32, 0x8d, + 0x8f, 0x55, 0x11, 0x62, 0x8f, 0xa8, 0xa7, 0x46, + 0x62, 0x46, 0x82, 0x8d, 0x62, 0x30, 0x46, 0x98, + 0x8f, 0xa7, 0xa0, 0x30, 0x62, 0xa7, 0x8, 0x98, + 0x62, 0x46, 0x76, 0x93, 0x98, 0x8d, 0x46, 0x62, + 0x8b, 0x76, 0x7, 0x8b, 0x8d, 0x8d, 0xa7, 0x8b, + 0x8b, 0x46, 0x8d, 0x8b, 0x8b, 0x5e, 0x9c, 0x94, + 0x94, 0x91, 0x99, 0x99, 0x3a, 0x36, 0x54, 0x54, + 0x48, 0x34, 0x15, 0x34, 0xeb, 0xfa, 0xfa, 0xa, + 0xea, 0xe0, 0xe6, 0xfa, 0x23, 0x21, 0x22, 0x42, + 0x4d, 0x36, 0x34, 0x34, 0x48, 0x54, 0x73, 0x15, + 0x34, 0x34, 0x34, 0x34, 0x48, 0x2e, 0x3b, 0x3b, + 0x48, 0x70, 0x16, 0x16, 0x3d, 0xf2, 0xf2, 0x15, + 0x15, 0xfa, 0xfa, 0x34, 0x23, 0x23, 0x17, 0xf2, + 0x34, 0x15, 0x3d, 0x16, 0x3b, 0x16, 0xfa, 0xd8, + 0xfa, 0x23, 0x22, 0x21, 0x48, 0x36, 0x3f, 0x15, + 0x3b, 0x48, 0x34, 0x34, 0x15, 0x34, 0xfa, 0xd8, + 0x5a, 0x11, 0x4a, 0x4a, 0xa6, 0x50, 0xaf, 0x54, + 0x2b, 0x34, 0x34, 0x34, 0x34, 0x48, 0x2a, 0x34, + 0x73, 0x23, 0x1c, 0x1c, 0x48, 0x48, 0x54, 0x34, + 0x3d, 0x15, 0x15, 0x15, 0xeb, 0x54, 0xf9, 0x34, + 0x34, 0x70, 0x23, 0x1c, 0x54, 0xe6, 0x97, 0x5a, + 0x6e, 0x6e, 0xcb, 0xf1, 0xa, 0xa, 0x6e, 0xa, + 0xeb, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x3d, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3d, 0x3d, + 0x14, 0x14, 0x18, 0x16, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xff, 0x14, 0x14, 0x79, 0x0, 0x4e, + 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x4e, + 0x0, 0x0, 0xff, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x36, 0x9a, 0x67, 0x3f, 0x2b, 0x48, 0x7f, 0x2b, + 0x70, 0x48, 0x39, 0x99, 0x63, 0x71, 0x5d, 0x3a, + 0x3a, 0x3a, 0x41, 0xfa, 0xeb, 0x34, 0x54, 0xa, + 0xa, 0x54, 0x39, 0xf9, 0x39, 0x4d, 0x31, 0x4d, + 0x36, 0x9a, 0x6f, 0x99, 0x2a, 0x54, 0x54, 0x54, + 0xa, 0x54, 0x80, 0x1c, 0x42, 0x67, 0x42, 0x1d, + 0x34, 0x2a, 0xc9, 0x5a, 0xcb, 0xb4, 0x50, 0xa7, + 0xc, 0x29, 0xa7, 0xa7, 0x5f, 0x5f, 0x5f, 0xf3, + 0xaf, 0x6e, 0xcb, 0x6e, 0xf1, 0x54, 0x6e, 0xf9, + 0x26, 0x99, 0x5d, 0x6a, 0x58, 0x58, 0x6f, 0x90, + 0x99, 0x54, 0xf9, 0x23, 0xa, 0x73, 0x6e, 0xf9, + 0x26, 0x1b, 0xe, 0x28, 0x8d, 0x28, 0x9f, 0x5e, + 0x28, 0xb7, 0xf7, 0x6c, 0x5e, 0x28, 0x32, 0x68, + 0x68, 0x68, 0x9e, 0x5e, 0x5e, 0x6c, 0x7, 0x7, + 0x68, 0x8, 0x7, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, + 0x5e, 0x86, 0x5e, 0x28, 0x5e, 0x5e, 0x7, 0x9f, + 0x5e, 0x6c, 0x5e, 0x9e, 0x5e, 0xa3, 0x68, 0x5e, + 0x68, 0x68, 0x7, 0x28, 0x5e, 0x6c, 0xb7, 0xaa, + 0x91, 0x81, 0x6f, 0x71, 0x99, 0x73, 0x34, 0x34, + 0x34, 0xeb, 0x15, 0xe6, 0x23, 0x66, 0x26, 0x41, + 0xe3, 0x5a, 0xea, 0xd8, 0xe6, 0xfa, 0xfa, 0x15, + 0x48, 0x54, 0x34, 0x34, 0xfa, 0x54, 0x3f, 0x36, + 0x59, 0x48, 0x34, 0x3b, 0x1d, 0xf1, 0xeb, 0x15, + 0xeb, 0xde, 0xeb, 0xeb, 0xf1, 0x54, 0x48, 0xf9, + 0x7f, 0xea, 0xfa, 0xeb, 0xea, 0xea, 0xde, 0xde, + 0xde, 0xeb, 0x21, 0x2b, 0x70, 0x48, 0x2b, 0x3f, + 0xfa, 0x54, 0x15, 0x2b, 0xfa, 0xfa, 0x2b, 0x73, + 0xd8, 0xfa, 0x34, 0xfa, 0x54, 0x23, 0x34, 0x1d, + 0x58, 0xa0, 0xb7, 0xce, 0xc7, 0xd4, 0xd0, 0xd3, + 0xcb, 0xf4, 0x39, 0x23, 0x23, 0x99, 0x48, 0x15, + 0x3d, 0x3b, 0x34, 0x34, 0xeb, 0x15, 0xfa, 0xea, + 0xcb, 0x6e, 0xf9, 0x1c, 0x4d, 0x1b, 0xb4, 0xa, + 0x15, 0x34, 0xeb, 0xa, 0xcb, 0xb4, 0xdd, 0x6c, + 0x6c, 0x74, 0x93, 0x38, 0x4d, 0x20, 0x3, 0xe6, + 0xf2, 0xf2, 0xf2, 0xee, 0xf2, 0x16, 0xf2, 0x16, + 0x3d, 0x3b, 0x3d, 0x16, 0x16, 0x14, 0x14, 0x18, + 0x14, 0x14, 0x16, 0x14, 0x16, 0x16, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x16, 0x3b, 0x0, 0x4e, 0x0, + 0x0, 0x4e, 0x19, 0x19, 0xff, 0xff, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x4e, + 0x0, 0xff, 0x0, 0x0, 0x19, 0xff, 0x19, 0xff, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x54, 0x39, 0x67, 0x54, 0x2a, 0x2a, 0xfa, 0x21, + 0x34, 0x48, 0x48, 0x23, 0x26, 0x58, 0x90, 0x41, + 0xfd, 0xf4, 0x5a, 0x3, 0x5a, 0x3, 0xfd, 0x26, + 0xf9, 0xaf, 0x5a, 0xcb, 0xf9, 0xfe, 0x99, 0x90, + 0x7f, 0x54, 0x39, 0x7f, 0x6e, 0x54, 0x26, 0x1c, + 0x23, 0x67, 0x67, 0x23, 0x54, 0x54, 0xf9, 0x6e, + 0xcb, 0xfd, 0xe5, 0xb, 0x4a, 0xf8, 0xa0, 0xfc, + 0xfc, 0x12, 0x28, 0x6c, 0x6c, 0xa0, 0xf3, 0xf7, + 0xce, 0xd4, 0xd4, 0xfd, 0xf9, 0x5a, 0x41, 0xf4, + 0x39, 0xfe, 0x20, 0x97, 0x90, 0x97, 0x5a, 0xfd, + 0x66, 0x99, 0xb4, 0xfd, 0x1c, 0x42, 0x99, 0xf4, + 0x39, 0xfd, 0xf0, 0xf7, 0x76, 0x8, 0xdd, 0xfc, + 0xfc, 0x28, 0x6c, 0x68, 0x28, 0xfc, 0x5e, 0x9e, + 0x68, 0x9f, 0xdd, 0x7, 0x6c, 0x6c, 0x7, 0x9f, + 0xfc, 0xfc, 0x5e, 0x5e, 0x5e, 0x28, 0xfc, 0x76, + 0x5e, 0x5e, 0xb8, 0xf7, 0xe, 0x5e, 0x9f, 0x5e, + 0x37, 0xfc, 0x5e, 0x68, 0x68, 0x86, 0xfc, 0xa0, + 0x32, 0xa3, 0x7, 0xa0, 0x2f, 0x9c, 0x74, 0x91, + 0x81, 0x58, 0x3a, 0x99, 0x23, 0x15, 0x3d, 0x15, + 0x3d, 0xf2, 0xfa, 0x23, 0xfd, 0x1b, 0x3e, 0x60, + 0x2f, 0x11, 0x7f, 0x54, 0xfa, 0x1, 0x15, 0x15, + 0xee, 0x15, 0xeb, 0x48, 0x23, 0x1a, 0x36, 0x63, + 0x9a, 0x7f, 0x3f, 0x15, 0x3b, 0x15, 0xeb, 0xf2, + 0xeb, 0xde, 0xa, 0x5a, 0xb, 0x1b, 0x3a, 0x56, + 0x6, 0xaf, 0x6e, 0xa, 0xe6, 0xe6, 0xfa, 0xeb, + 0xeb, 0xeb, 0x3b, 0x99, 0x99, 0x39, 0x2e, 0x3f, + 0x34, 0x2a, 0xf2, 0x15, 0x15, 0xeb, 0xeb, 0x1, + 0xeb, 0x15, 0x21, 0x23, 0x9, 0x99, 0x63, 0x31, + 0xe3, 0xa6, 0x60, 0xa6, 0xcc, 0xd4, 0x3, 0xd0, + 0xd0, 0xed, 0xf9, 0x1d, 0x39, 0x7f, 0x54, 0x34, + 0xf5, 0x15, 0x15, 0x15, 0x15, 0xf2, 0x15, 0xf1, + 0x5a, 0x41, 0x3a, 0x3a, 0x1b, 0x41, 0x99, 0x54, + 0x70, 0xf2, 0x34, 0x34, 0x99, 0x55, 0x62, 0x93, + 0x8b, 0x8b, 0x74, 0x9c, 0x55, 0x6e, 0xa, 0xa, + 0x73, 0xeb, 0xf2, 0xee, 0x16, 0x16, 0x16, 0x16, + 0x3d, 0x16, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x16, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x79, 0x0, 0x4e, 0x68, + 0x79, 0x68, 0x19, 0x19, 0x19, 0x19, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0xff, 0x0, 0x0, 0x0, 0xff, 0x19, 0x19, 0x19, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0x19, 0x19, 0xff, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x2a, 0xfa, 0x54, 0x54, 0xcb, 0x54, 0x42, 0x2e, + 0x4d, 0x80, 0x1d, 0x3f, 0x36, 0x7f, 0x9, 0xcb, + 0xcb, 0xed, 0xf4, 0xe9, 0x50, 0x11, 0x4a, 0x58, + 0x4a, 0x3e, 0x41, 0x23, 0x54, 0xea, 0xa, 0xa, + 0xa, 0x73, 0x48, 0xfe, 0x4d, 0x56, 0x58, 0x36, + 0x36, 0x67, 0x7f, 0x73, 0xeb, 0x15, 0xeb, 0x73, + 0xc9, 0x5a, 0x1b, 0x11, 0x55, 0x62, 0x82, 0x28, + 0x12, 0x27, 0xa7, 0x6c, 0x5f, 0xa6, 0x50, 0x2c, + 0x2f, 0x60, 0xf0, 0x11, 0x20, 0x41, 0xe5, 0x41, + 0x39, 0x23, 0x54, 0x54, 0x7f, 0x99, 0x7f, 0x26, + 0x90, 0x6f, 0x4a, 0x31, 0x31, 0x36, 0x67, 0x26, + 0x6e, 0x6e, 0x41, 0x60, 0x7e, 0x62, 0xe, 0x30, + 0x62, 0x98, 0x5e, 0x8d, 0x8b, 0x62, 0xa7, 0x37, + 0x7d, 0xa8, 0xf3, 0x2c, 0x46, 0x8d, 0x5e, 0x1f, + 0x62, 0x8d, 0x5e, 0x93, 0x8b, 0x93, 0x5f, 0x9c, + 0x74, 0x82, 0xf7, 0x60, 0x62, 0x8d, 0x5e, 0x98, + 0x62, 0x46, 0x82, 0x9c, 0x93, 0xf, 0xc, 0x50, + 0x8f, 0x82, 0x9c, 0x91, 0x81, 0x91, 0x91, 0x91, + 0x5d, 0x31, 0x23, 0x34, 0x34, 0xf2, 0x3d, 0xf2, + 0x15, 0x15, 0x70, 0x66, 0x31, 0x1b, 0x7e, 0x7e, + 0x74, 0xa8, 0xb0, 0x5a, 0x3, 0xa, 0xfa, 0x1, + 0xf2, 0x15, 0x2b, 0x1c, 0x1d, 0x1a, 0x1c, 0x48, + 0x7f, 0x54, 0x70, 0x3d, 0x34, 0x15, 0x15, 0x3b, + 0x15, 0x15, 0x34, 0x66, 0x40, 0xf8, 0x4a, 0x40, + 0xbf, 0xbf, 0xb4, 0x5a, 0x3, 0x3, 0x54, 0x34, + 0x15, 0xf2, 0x3d, 0x48, 0x70, 0x73, 0xfa, 0xfa, + 0xfa, 0x34, 0x3b, 0x2b, 0x34, 0xeb, 0x2b, 0x21, + 0x15, 0xf2, 0x15, 0x3b, 0xa, 0x6e, 0x97, 0x83, + 0x50, 0xc8, 0x7e, 0x74, 0xc, 0x60, 0x41, 0x5a, + 0xb, 0xe0, 0xa, 0xfa, 0x2a, 0xfa, 0x73, 0x3d, + 0xfa, 0x15, 0x17, 0x22, 0x21, 0x15, 0x15, 0x2b, + 0x6e, 0x5a, 0x99, 0x3e, 0xa9, 0xb4, 0x99, 0x80, + 0x99, 0x48, 0x48, 0x1d, 0x31, 0x94, 0x8f, 0x93, + 0x5e, 0x74, 0x8f, 0x93, 0x9c, 0x9c, 0x6e, 0x7, + 0x12, 0x42, 0x73, 0x15, 0xf2, 0x16, 0x16, 0x14, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, 0x14, + 0x16, 0x14, 0x14, 0x14, 0x14, 0x16, 0xff, 0x14, + 0x18, 0xff, 0xff, 0x14, 0x79, 0x8d, 0x8d, 0x0, + 0x68, 0x68, 0x0, 0x19, 0x19, 0x19, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0x19, 0xff, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x34, 0x70, 0x3b, 0x7f, 0x80, 0x67, 0x1d, 0x42, + 0x67, 0x7f, 0x99, 0x42, 0x34, 0x34, 0xfa, 0x23, + 0xfd, 0x63, 0x6f, 0x52, 0x2f, 0x7e, 0x91, 0x62, + 0xaa, 0xb0, 0xaf, 0x41, 0x3, 0xa, 0x34, 0x34, + 0x48, 0x67, 0x48, 0x48, 0x80, 0x9a, 0x80, 0x4d, + 0x7f, 0x2a, 0x54, 0x48, 0x48, 0x34, 0x34, 0x21, + 0xfe, 0x6b, 0x7e, 0x46, 0x8f, 0x94, 0x9c, 0xa7, + 0x62, 0x6a, 0x2c, 0x37, 0x7d, 0x62, 0x62, 0x1e, + 0x74, 0x7e, 0xaa, 0x50, 0x6f, 0xaf, 0xb4, 0xb4, + 0x5a, 0x99, 0x26, 0x36, 0x4d, 0x71, 0x6f, 0x7f, + 0x99, 0x31, 0x99, 0x99, 0x99, 0x26, 0x6e, 0x6e, + 0x39, 0x58, 0x27, 0x7e, 0x7e, 0x7e, 0x98, 0x98, + 0x8f, 0x8f, 0x5e, 0x7d, 0x8f, 0x8b, 0xf7, 0xa8, + 0x8f, 0x93, 0xfc, 0x8d, 0x98, 0x8d, 0x5e, 0x82, + 0x98, 0x8d, 0x6c, 0xa8, 0x74, 0x98, 0x28, 0x9c, + 0x8f, 0x8d, 0x5e, 0x98, 0x98, 0x8d, 0x82, 0x93, + 0x93, 0x8d, 0x82, 0xa8, 0x9c, 0x76, 0x5e, 0x74, + 0x74, 0x82, 0x82, 0x8f, 0x94, 0x91, 0x6f, 0x99, + 0x99, 0x73, 0x73, 0x15, 0xeb, 0x15, 0x3f, 0x70, + 0x3f, 0x21, 0x1c, 0x31, 0x7a, 0x60, 0x9c, 0xb3, + 0x50, 0xc, 0x2c, 0xa1, 0xe5, 0x1b, 0x20, 0x7f, + 0x54, 0x23, 0x1c, 0x1d, 0x34, 0x15, 0x70, 0x2b, + 0xeb, 0x34, 0x48, 0x2a, 0xfa, 0x39, 0x1a, 0x23, + 0xf1, 0xf9, 0x39, 0xfd, 0xc6, 0xc8, 0x2f, 0xa6, + 0xe4, 0xf8, 0x27, 0x60, 0x2c, 0xf8, 0x4a, 0xfd, + 0xa, 0xeb, 0xf2, 0xf2, 0xf2, 0xf2, 0x34, 0xeb, + 0xeb, 0x34, 0x48, 0x36, 0x7f, 0x6e, 0x1d, 0x21, + 0x15, 0x3d, 0xf2, 0x17, 0xeb, 0xa, 0x97, 0x5f, + 0x1e, 0xa7, 0x30, 0xe, 0x6c, 0xa7, 0x2f, 0x60, + 0xbf, 0xd0, 0xea, 0x54, 0xea, 0xd8, 0xeb, 0xfa, + 0xe6, 0xeb, 0xfa, 0x23, 0x1c, 0x54, 0x2a, 0x23, + 0x39, 0xcb, 0x5a, 0x55, 0x6c, 0x37, 0x3e, 0x7c, + 0x7e, 0x91, 0x4d, 0xfe, 0x3a, 0x8f, 0x9c, 0x5e, + 0x9f, 0x2f, 0x9c, 0x9f, 0x68, 0xa3, 0x9f, 0xa3, + 0xa3, 0xa3, 0x9f, 0xd8, 0xf2, 0xee, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, + 0x16, 0x16, 0x14, 0x14, 0x14, 0xff, 0x14, 0xff, + 0x14, 0x14, 0x14, 0x16, 0x79, 0x4e, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0xff, 0x19, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x63, 0x80, 0x42, 0x36, 0x42, 0x54, 0x34, 0x2b, + 0x34, 0x73, 0x73, 0x7f, 0x99, 0x39, 0x36, 0x58, + 0x52, 0x74, 0x6a, 0x2f, 0xe, 0xaa, 0x9c, 0x28, + 0xa0, 0xf8, 0x50, 0xf8, 0x50, 0xb, 0xf9, 0x36, + 0x36, 0x80, 0x23, 0x7f, 0x48, 0x54, 0x73, 0x54, + 0x99, 0x54, 0xfa, 0x42, 0x59, 0x4d, 0x99, 0x36, + 0x31, 0x6a, 0xa7, 0x6c, 0x76, 0x2c, 0xc8, 0xa7, + 0x82, 0x76, 0x37, 0xfc, 0x1e, 0x76, 0x5e, 0x9f, + 0x37, 0xf8, 0xbe, 0xbf, 0x50, 0xe3, 0xd4, 0x5a, + 0x97, 0x4a, 0x3e, 0x1b, 0x3a, 0x58, 0x83, 0x97, + 0x9, 0x7f, 0xea, 0x54, 0x39, 0x99, 0xcb, 0x39, + 0xfd, 0x55, 0x37, 0x28, 0x30, 0x30, 0xa7, 0x6c, + 0x82, 0x76, 0xe, 0xf7, 0x5e, 0x86, 0x5e, 0xfc, + 0xf, 0x68, 0x9e, 0x5e, 0x68, 0x68, 0x9f, 0xb8, + 0x28, 0x5e, 0x6c, 0xe, 0x82, 0x86, 0x5e, 0x5e, + 0x28, 0xfc, 0x68, 0xa3, 0x5e, 0x5e, 0xfc, 0xa0, + 0x6c, 0x9f, 0x5e, 0xe, 0x1f, 0x5e, 0x5e, 0x68, + 0x28, 0x1f, 0x2f, 0xaa, 0xb3, 0xb0, 0x99, 0x48, + 0xeb, 0x1, 0x3d, 0xf2, 0x16, 0x15, 0x23, 0x73, + 0x73, 0x23, 0xfd, 0xb, 0xe4, 0xa0, 0xfc, 0xf3, + 0x12, 0x6c, 0x6c, 0x37, 0xe, 0xf0, 0x11, 0xcc, + 0xd0, 0xe0, 0x54, 0x2b, 0x34, 0x34, 0x42, 0x23, + 0x34, 0xfa, 0x2a, 0x54, 0xeb, 0xe6, 0xf1, 0xed, + 0xd0, 0xd0, 0xb, 0x1b, 0x11, 0xe, 0x37, 0x82, + 0xfc, 0x46, 0x28, 0x1e, 0x8, 0xb7, 0xf0, 0xb, + 0xdb, 0xd0, 0x73, 0x2a, 0x15, 0x3d, 0x3b, 0x21, + 0x34, 0x16, 0x15, 0x39, 0xc9, 0xde, 0x73, 0xfa, + 0xeb, 0x15, 0x15, 0x23, 0xfe, 0x3a, 0x4a, 0xa7, + 0x6c, 0xfc, 0x2f, 0x1f, 0x68, 0x7, 0xdd, 0xf7, + 0xf8, 0xe3, 0xb, 0x11, 0x40, 0x23, 0x2a, 0xfa, + 0xe6, 0xde, 0xeb, 0xf1, 0xcb, 0xd7, 0xcb, 0xb, + 0x1b, 0x27, 0x55, 0x6c, 0x6c, 0x75, 0x9c, 0x9c, + 0xaa, 0xa, 0x73, 0x6e, 0x20, 0x27, 0xb6, 0x9f, + 0xa3, 0x93, 0x32, 0xa3, 0xa3, 0xa3, 0xa3, 0x68, + 0xa3, 0x9f, 0xd3, 0xd3, 0xde, 0xeb, 0xf2, 0xeb, + 0x21, 0x3b, 0x16, 0x14, 0x16, 0x16, 0x14, 0x14, + 0xff, 0x14, 0x14, 0x16, 0x18, 0x14, 0x14, 0x14, + 0x14, 0x3b, 0x17, 0x17, 0x68, 0xa3, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x68, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x56, 0x90, 0x99, 0x26, 0xf9, 0x34, 0x34, 0x48, + 0x23, 0x34, 0x2b, 0x54, 0x80, 0x99, 0x20, 0x1b, + 0x38, 0x28, 0xa0, 0x37, 0x12, 0xf8, 0xc, 0x6c, + 0x5e, 0xe, 0x12, 0xe, 0xa7, 0x50, 0xb4, 0xf9, + 0x26, 0x6e, 0x54, 0x3, 0x39, 0x1d, 0x21, 0x67, + 0x58, 0x67, 0x70, 0x23, 0x31, 0x80, 0xb4, 0xfd, + 0x1b, 0x11, 0xc8, 0xf7, 0x6c, 0x2f, 0x55, 0x28, + 0x68, 0x5e, 0x28, 0x46, 0x46, 0x82, 0x7, 0x8, + 0xa7, 0x12, 0xf8, 0xc, 0xe, 0x2c, 0x40, 0xfd, + 0x6f, 0x60, 0xa1, 0x41, 0x20, 0x31, 0xb4, 0xb4, + 0x5a, 0x31, 0x99, 0x4d, 0x58, 0x85, 0x31, 0x7f, + 0x41, 0x60, 0xf7, 0xb7, 0x12, 0x30, 0xa0, 0xdd, + 0x6c, 0x5e, 0x37, 0x28, 0x8d, 0x68, 0x86, 0x5e, + 0x46, 0x5e, 0x5e, 0x9f, 0x9f, 0x28, 0x5e, 0x6c, + 0x28, 0x5e, 0x5e, 0x46, 0x46, 0x4e, 0x86, 0x5e, + 0x82, 0x37, 0x68, 0x7, 0x7, 0x86, 0x28, 0x8d, + 0x76, 0x32, 0x86, 0x82, 0x82, 0x32, 0x9f, 0x76, + 0xa7, 0xe, 0x9c, 0xb0, 0x97, 0x90, 0x99, 0x2a, + 0x34, 0x15, 0x15, 0x16, 0x15, 0x15, 0x34, 0x16, + 0xeb, 0xfa, 0xfd, 0x1b, 0xf8, 0x37, 0xa7, 0x62, + 0x7d, 0x28, 0x76, 0x9c, 0x2c, 0xba, 0x50, 0xbf, + 0xcb, 0xd8, 0xa, 0xfa, 0x15, 0x48, 0x36, 0x36, + 0x1d, 0x21, 0x34, 0x34, 0xeb, 0xfa, 0xe6, 0xd0, + 0xd0, 0xbf, 0xf8, 0x55, 0x5f, 0x37, 0x76, 0x89, + 0x76, 0x28, 0x9c, 0x9c, 0xa0, 0xbc, 0x50, 0xa6, + 0xbf, 0xd0, 0x6e, 0x39, 0x54, 0x17, 0x21, 0x2e, + 0x3b, 0x15, 0x3d, 0x3d, 0x16, 0x3d, 0xf2, 0xeb, + 0x15, 0x15, 0x48, 0x3a, 0x1b, 0x60, 0x7e, 0x46, + 0x28, 0xa7, 0xaa, 0x9c, 0x28, 0x5f, 0x5f, 0x82, + 0x28, 0x9c, 0x74, 0x5f, 0xc, 0xaf, 0x6e, 0xea, + 0xea, 0x34, 0xfa, 0x34, 0xf1, 0xf1, 0xcb, 0xf8, + 0xfc, 0x8f, 0x62, 0x8f, 0x7d, 0x7e, 0xb0, 0x3, + 0x6e, 0x73, 0x34, 0x2a, 0x27, 0x8f, 0x62, 0x68, + 0x68, 0x8f, 0x8b, 0x68, 0x68, 0x98, 0x7d, 0x9f, + 0xa3, 0x93, 0xfe, 0x9f, 0x93, 0x42, 0xf2, 0xf2, + 0x15, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xff, 0xff, 0x14, 0x14, 0xff, 0xff, + 0xff, 0x17, 0x17, 0x8d, 0x79, 0x68, 0x79, 0x0, + 0x68, 0x68, 0x4e, 0x0, 0x68, 0x68, 0x4e, 0x0, + 0x68, 0x4e, 0xff, 0x19, 0x19, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0x19, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x19, + 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7f, 0x54, 0xa, 0x23, 0x7f, 0x48, 0x23, 0x67, + 0x4d, 0x48, 0x21, 0x1d, 0x99, 0x54, 0x39, 0x5d, + 0x55, 0xaa, 0x2c, 0xc, 0x37, 0x62, 0x46, 0x82, + 0x5e, 0x46, 0x74, 0x82, 0xc, 0xaf, 0xcb, 0xfa, + 0x2b, 0xfa, 0x54, 0x7f, 0x20, 0x4d, 0x42, 0x31, + 0x31, 0x99, 0x48, 0x48, 0x7f, 0x48, 0x54, 0x7f, + 0x90, 0x6a, 0x55, 0xa7, 0x62, 0x8f, 0x62, 0x82, + 0x46, 0x8f, 0x76, 0x5f, 0x7d, 0x93, 0xa8, 0x7, + 0x46, 0x62, 0x76, 0xa7, 0x9c, 0x8f, 0xaa, 0x83, + 0x6f, 0x90, 0x5a, 0x23, 0x26, 0x6e, 0x6e, 0xea, + 0x63, 0x71, 0x6f, 0x5d, 0x71, 0x58, 0x90, 0x54, + 0x66, 0x1b, 0xf8, 0xbe, 0x60, 0x8f, 0x76, 0x2f, + 0x62, 0x46, 0x8d, 0x8d, 0x93, 0x98, 0x5e, 0xa7, + 0x9c, 0x8d, 0x9e, 0x37, 0x9c, 0x5e, 0x68, 0x8d, + 0x62, 0x98, 0x5e, 0x98, 0x8f, 0x46, 0x37, 0x5f, + 0x74, 0x82, 0x5e, 0x5f, 0x5f, 0x5e, 0x5e, 0x93, + 0x8f, 0x82, 0x82, 0x8f, 0x8f, 0x76, 0x82, 0x74, + 0xa6, 0xaa, 0x74, 0x6f, 0x99, 0x63, 0x66, 0x54, + 0x15, 0x15, 0x22, 0x15, 0xf2, 0x2b, 0x15, 0x16, + 0x3b, 0x48, 0x9a, 0x6a, 0x6a, 0x30, 0x74, 0x94, + 0x8f, 0xa7, 0x55, 0x6a, 0x50, 0xcc, 0x50, 0xb4, + 0xcb, 0xfa, 0x48, 0x34, 0x3b, 0x22, 0x1a, 0x1c, + 0x23, 0x34, 0xfa, 0x34, 0xfa, 0xcb, 0x41, 0x97, + 0x41, 0x40, 0x74, 0x8f, 0x76, 0x76, 0x55, 0x8f, + 0xa7, 0xb7, 0xaa, 0x55, 0xf8, 0xa6, 0xaa, 0x6a, + 0x40, 0xcb, 0x23, 0x99, 0x73, 0x3d, 0x15, 0x3b, + 0x3b, 0x70, 0x34, 0x2b, 0x21, 0x15, 0x34, 0x15, + 0xf2, 0xee, 0x17, 0x4d, 0x44, 0x2f, 0xaa, 0x55, + 0xe, 0xa8, 0x74, 0x7d, 0x28, 0x62, 0x62, 0x93, + 0x5e, 0x93, 0x60, 0x55, 0xa0, 0xbf, 0xb4, 0x3, + 0xed, 0x39, 0x7f, 0x6, 0x97, 0xf9, 0x26, 0x74, + 0x6c, 0x8f, 0xab, 0x27, 0xaa, 0x8f, 0x6e, 0x6e, + 0x6e, 0x23, 0x73, 0x4d, 0x7d, 0x8f, 0x62, 0x5e, + 0x68, 0x8b, 0x8b, 0x9f, 0x5e, 0x98, 0x8b, 0x9e, + 0xa3, 0x8b, 0x93, 0xa3, 0xa3, 0x7d, 0x34, 0xf2, + 0xf2, 0x3d, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0x14, 0xff, 0x14, 0x14, 0x14, + 0xff, 0xff, 0x17, 0x0, 0x8d, 0x68, 0x68, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x68, 0x68, 0x0, 0x0, + 0x4e, 0x6c, 0x19, 0xff, 0x19, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x21, 0x34, 0x23, 0x9a, 0x9a, 0x39, 0x23, 0x4d, + 0x63, 0x9a, 0x48, 0x48, 0xfa, 0xfa, 0x7f, 0x90, + 0x6a, 0x6a, 0x6a, 0x93, 0x93, 0x8f, 0x62, 0x30, + 0x9c, 0x8f, 0xaa, 0xb3, 0x2c, 0x41, 0x54, 0x54, + 0x34, 0x34, 0x34, 0x42, 0x9a, 0x9a, 0x99, 0x23, + 0x7f, 0x39, 0x54, 0x54, 0x54, 0x48, 0x54, 0x66, + 0x81, 0x91, 0x7e, 0x27, 0x7e, 0x8f, 0x8f, 0xb7, + 0x55, 0x7e, 0xaa, 0x9c, 0x62, 0x8f, 0x62, 0x28, + 0x93, 0x8f, 0x8d, 0xfc, 0x55, 0x62, 0xaa, 0x50, + 0x97, 0x4d, 0x20, 0x26, 0x6f, 0x58, 0x48, 0x39, + 0x9a, 0x81, 0x81, 0x90, 0x42, 0x99, 0x7f, 0x9, + 0x99, 0x58, 0x27, 0x55, 0x91, 0x8b, 0x46, 0x12, + 0x7e, 0x98, 0x8d, 0x76, 0x74, 0x27, 0x8d, 0x76, + 0x9c, 0x46, 0x37, 0x5f, 0x98, 0x8d, 0x68, 0x5c, + 0x30, 0x46, 0x5e, 0x9c, 0xaa, 0x33, 0x30, 0x9c, + 0x9c, 0x8d, 0x5e, 0x1f, 0x98, 0x8d, 0x68, 0x93, + 0x8f, 0x52, 0x76, 0xab, 0xb3, 0xa7, 0x46, 0x55, + 0x94, 0x7d, 0x74, 0x5d, 0xfe, 0xf4, 0x73, 0x15, + 0x16, 0x3d, 0xf2, 0x15, 0x73, 0x54, 0x21, 0x22, + 0x48, 0x4d, 0x6a, 0x7e, 0x55, 0x2c, 0x5f, 0x94, + 0xa8, 0xc8, 0x11, 0x7e, 0x2f, 0xa7, 0x2f, 0x6a, + 0x4a, 0x41, 0x99, 0x34, 0x3d, 0x3d, 0x3d, 0x15, + 0xeb, 0xa, 0xf9, 0xfe, 0x20, 0x11, 0x60, 0x55, + 0x27, 0x30, 0x82, 0x76, 0x5e, 0xb7, 0x2c, 0x5f, + 0x28, 0xa7, 0x5f, 0x55, 0x30, 0x5f, 0x74, 0xac, + 0xa6, 0xb4, 0xa, 0xa, 0xee, 0x3d, 0x16, 0x16, + 0x3d, 0x73, 0x48, 0x42, 0x1a, 0x21, 0x48, 0x48, + 0x15, 0x15, 0x34, 0xfd, 0xf8, 0x2c, 0x2c, 0x46, + 0x46, 0x79, 0x82, 0x5e, 0x5e, 0x1f, 0x89, 0x5e, + 0x5e, 0x28, 0xa6, 0x2c, 0x6c, 0xf7, 0xf3, 0xf8, + 0x12, 0x2f, 0x5f, 0x6c, 0x6c, 0x5f, 0x74, 0x8, + 0x5e, 0x9f, 0xb7, 0xf8, 0x5f, 0x74, 0x9c, 0x9c, + 0x27, 0x4d, 0x20, 0x27, 0x9f, 0x5e, 0x9f, 0x9f, + 0xa3, 0xa3, 0x5e, 0x9e, 0x5e, 0x9f, 0xa3, 0xa3, + 0x4e, 0xa3, 0xa3, 0xa3, 0x9e, 0xa3, 0xeb, 0xeb, + 0xf2, 0x3d, 0x16, 0x16, 0x16, 0x14, 0x14, 0x16, + 0x14, 0x16, 0x18, 0x14, 0x14, 0x14, 0xff, 0xff, + 0x14, 0x14, 0x14, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0x19, 0x19, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, + 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x36, 0x1c, 0x36, 0x85, 0x99, 0x2a, 0x2b, 0x48, + 0x7f, 0x54, 0x73, 0x54, 0x2e, 0x1d, 0x9a, 0x81, + 0x74, 0x7e, 0x27, 0x46, 0x1e, 0x9c, 0xaa, 0x60, + 0x5f, 0x93, 0x9c, 0xe, 0x12, 0x4a, 0x6f, 0x97, + 0x67, 0x21, 0x2b, 0x2a, 0x6e, 0x54, 0x73, 0xfa, + 0x23, 0x23, 0x7f, 0x99, 0x31, 0x36, 0x31, 0x35, + 0x55, 0x8f, 0x74, 0xa8, 0x5f, 0x9c, 0xa8, 0xb7, + 0xe, 0x62, 0x76, 0x82, 0x8d, 0x98, 0x46, 0x37, + 0x8d, 0x76, 0x5e, 0x8, 0xc, 0x46, 0x28, 0xba, + 0x3e, 0x90, 0x20, 0x4a, 0x5d, 0x5d, 0x90, 0x26, + 0x4d, 0x6f, 0x97, 0x6e, 0x54, 0x6e, 0xf1, 0x3, + 0x4a, 0x55, 0x46, 0x8d, 0x76, 0x76, 0x5e, 0x1e, + 0xe, 0x9f, 0x5e, 0x6c, 0x8, 0x5e, 0x68, 0x68, + 0x68, 0x68, 0x32, 0x75, 0x4e, 0x68, 0x86, 0x6c, + 0xb9, 0x28, 0xa3, 0x9f, 0x5e, 0x32, 0x79, 0x32, + 0x5e, 0x9e, 0x5e, 0x5e, 0x28, 0x9f, 0x9f, 0x6c, + 0xa0, 0x28, 0x5e, 0x8d, 0x37, 0x5e, 0x5e, 0x82, + 0x5e, 0x7, 0xa9, 0xb0, 0x54, 0x73, 0xe1, 0x16, + 0x16, 0x15, 0x3d, 0x15, 0x34, 0xe6, 0xf9, 0x34, + 0x54, 0xe5, 0xf8, 0x2c, 0x2c, 0xb7, 0xa7, 0x37, + 0x37, 0x8, 0x6c, 0x28, 0x6c, 0x6c, 0xa7, 0x74, + 0xa6, 0xbf, 0xcb, 0x73, 0xfa, 0xeb, 0xeb, 0x15, + 0x2b, 0x23, 0x41, 0xe3, 0x3e, 0xf7, 0x1e, 0x6c, + 0x6c, 0xb8, 0x7, 0x9f, 0x9f, 0x7, 0x28, 0x9f, + 0x5e, 0x9f, 0x28, 0x5e, 0x76, 0x7, 0xa0, 0x7, + 0xb7, 0xbf, 0xd0, 0xe6, 0xeb, 0x16, 0x16, 0x3d, + 0x3d, 0x15, 0x2a, 0x23, 0x54, 0x34, 0x15, 0x34, + 0x34, 0xa, 0x23, 0x1b, 0x11, 0xe, 0x28, 0x5e, + 0xa3, 0x68, 0x28, 0x6c, 0x9e, 0x5e, 0x7, 0xb6, + 0x9f, 0x7, 0x8, 0x6c, 0x5e, 0x9f, 0x6c, 0x9f, + 0x5e, 0x68, 0x7, 0x8, 0x9f, 0x6c, 0x8, 0xb8, + 0x28, 0x9f, 0x5e, 0x9f, 0x5e, 0x6c, 0xe, 0xf7, + 0xdd, 0x3, 0xa, 0xcb, 0xdd, 0x68, 0x9f, 0x9f, + 0xa3, 0x9f, 0x68, 0xa3, 0xa3, 0x4e, 0xa3, 0x4e, + 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xed, + 0xf2, 0x3d, 0x16, 0x14, 0x16, 0x14, 0x14, 0x14, + 0x14, 0x14, 0x14, 0xff, 0xff, 0xff, 0x14, 0x14, + 0x14, 0x17, 0x17, 0x68, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0x19, 0xff, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, + 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x63, 0x4d, 0x7f, 0x26, 0x7f, 0x70, 0x34, 0x34, + 0x2a, 0x2b, 0x48, 0x67, 0x67, 0x42, 0x31, 0x40, + 0x2f, 0x5f, 0x5f, 0xb9, 0x37, 0x28, 0xa0, 0x8, + 0x5e, 0x5e, 0x9f, 0x6c, 0x6c, 0x5f, 0x50, 0xb4, + 0x6e, 0x48, 0x73, 0xe6, 0xfa, 0xfa, 0x34, 0x7f, + 0x7f, 0x70, 0x23, 0xfd, 0x99, 0x9a, 0x3a, 0xb, + 0x50, 0xa0, 0xe, 0xdd, 0xa0, 0x37, 0x28, 0xfc, + 0x28, 0x82, 0x82, 0x28, 0x6c, 0x5e, 0x5e, 0x6c, + 0x7, 0x5e, 0x9f, 0x6c, 0x6c, 0x28, 0x28, 0xe, + 0xaa, 0x83, 0xfd, 0xf1, 0x3, 0x99, 0xaf, 0x5a, + 0x26, 0x4d, 0x3a, 0x90, 0x26, 0x23, 0x6e, 0xf9, + 0x6f, 0x5f, 0x6c, 0x6c, 0xb7, 0xa0, 0x6c, 0x9f, + 0xf7, 0x6c, 0xa3, 0x9f, 0x5e, 0x5e, 0x68, 0x86, + 0x32, 0x68, 0x86, 0x75, 0x6c, 0x37, 0xa3, 0x86, + 0x28, 0x5e, 0x68, 0x68, 0x5e, 0xa3, 0xa3, 0x68, + 0x9f, 0x8, 0xa3, 0x68, 0xa0, 0xdd, 0xfc, 0x28, + 0x37, 0x28, 0x5e, 0x28, 0x37, 0x5e, 0x37, 0x76, + 0xa8, 0xb9, 0xbf, 0xb4, 0xcb, 0xa, 0xf2, 0x15, + 0x15, 0x34, 0x34, 0x34, 0x15, 0xfa, 0xf2, 0xf2, + 0xeb, 0x23, 0x20, 0x60, 0x74, 0xe, 0x5f, 0x55, + 0x12, 0x37, 0x82, 0x62, 0x2f, 0xf8, 0x52, 0x6a, + 0xb0, 0xb4, 0xa, 0xfa, 0x2a, 0xcb, 0xc9, 0x23, + 0x42, 0x1b, 0x40, 0x6f, 0x60, 0xba, 0x2c, 0x5f, + 0x76, 0x6c, 0xe, 0x1f, 0xfc, 0x68, 0x79, 0x8d, + 0x28, 0xfc, 0x9c, 0xa7, 0xa7, 0xa0, 0xcc, 0xf8, + 0xf3, 0xc8, 0xb4, 0xa, 0x48, 0x3b, 0x3d, 0x70, + 0x3b, 0x15, 0x17, 0xeb, 0x17, 0xeb, 0x15, 0xf2, + 0x34, 0x6e, 0x41, 0x6a, 0x27, 0x12, 0x93, 0x82, + 0x9f, 0x28, 0x2f, 0xc, 0x5e, 0x8d, 0x9c, 0x1f, + 0x37, 0x8d, 0x8f, 0x82, 0x86, 0x30, 0x30, 0x28, + 0x9f, 0x76, 0x9c, 0xf3, 0x6c, 0x8d, 0x93, 0x28, + 0xfc, 0x46, 0x8b, 0x82, 0x28, 0x7d, 0x4d, 0x6e, + 0xa, 0xa, 0x54, 0x39, 0x27, 0x8f, 0x8b, 0xa3, + 0x68, 0x8b, 0x8b, 0xa3, 0x4e, 0x98, 0x98, 0x9f, + 0xa3, 0x98, 0x79, 0xa3, 0x4e, 0x93, 0x82, 0x82, + 0x98, 0x3f, 0x16, 0x14, 0x14, 0x14, 0x18, 0x14, + 0x18, 0x14, 0xff, 0x16, 0x14, 0xff, 0xff, 0x14, + 0xff, 0xff, 0x17, 0x79, 0x68, 0x68, 0x0, 0x0, + 0x68, 0x68, 0x0, 0x0, 0x68, 0x68, 0xa3, 0x4e, + 0xa3, 0xa3, 0x4e, 0x19, 0xff, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x26, 0x99, 0x54, 0x54, 0x1c, 0x7f, 0x67, 0x99, + 0x1a, 0x2e, 0x36, 0x80, 0x7f, 0x6e, 0x54, 0x7f, + 0x40, 0x55, 0xaa, 0xf8, 0x12, 0x30, 0x76, 0x82, + 0x5e, 0x46, 0x30, 0x37, 0x9c, 0xb0, 0xaf, 0xea, + 0xa, 0x73, 0x54, 0x8a, 0x39, 0x1a, 0x36, 0x63, + 0x63, 0x48, 0x1d, 0x48, 0x23, 0x54, 0x7f, 0xfd, + 0x20, 0x6a, 0x62, 0xa7, 0x62, 0x55, 0x12, 0x37, + 0x76, 0x62, 0x93, 0x2c, 0x2c, 0x9c, 0x8d, 0x8, + 0x2f, 0x12, 0x79, 0x68, 0x93, 0x62, 0x27, 0x27, + 0x83, 0xb4, 0xa, 0xa, 0x8a, 0xa, 0x6e, 0x5a, + 0x41, 0x20, 0x4d, 0x3a, 0x97, 0x7f, 0x39, 0x39, + 0x99, 0x60, 0x9c, 0x5f, 0xa1, 0x27, 0x37, 0x8d, + 0x93, 0x79, 0x1f, 0x98, 0x8b, 0x79, 0x9f, 0x1f, + 0x60, 0xa7, 0x68, 0x8d, 0x62, 0x30, 0x1f, 0x98, + 0x8f, 0x8d, 0x9f, 0x1f, 0x98, 0x82, 0x32, 0x82, + 0x55, 0xc, 0x28, 0x98, 0x62, 0x46, 0x1f, 0x8b, + 0x8f, 0x76, 0x82, 0x30, 0x7e, 0x9c, 0xa7, 0x94, + 0x83, 0xaf, 0x3, 0x6e, 0x73, 0x1, 0x2b, 0x3b, + 0x34, 0x73, 0x54, 0x34, 0xeb, 0x15, 0x16, 0x16, + 0x3b, 0x1c, 0x31, 0x5d, 0x94, 0x7d, 0x62, 0x6a, + 0x6a, 0x9c, 0xaa, 0x91, 0x91, 0x90, 0xb0, 0x81, + 0x5d, 0x80, 0x6e, 0x2a, 0x23, 0x5a, 0x3, 0xfe, + 0x20, 0x5a, 0xb, 0x87, 0x74, 0xe, 0x60, 0x74, + 0x82, 0x5e, 0x93, 0x62, 0x46, 0x86, 0x9c, 0x8b, + 0x82, 0xa7, 0xb3, 0xaa, 0x9c, 0xa7, 0x60, 0xaa, + 0x5f, 0xa6, 0xaf, 0xa, 0x15, 0x3d, 0x73, 0xeb, + 0x73, 0x34, 0x34, 0x15, 0x3b, 0x22, 0x34, 0x3d, + 0x15, 0x23, 0x6f, 0x55, 0x5f, 0x46, 0x74, 0x9c, + 0x68, 0x8d, 0x74, 0x74, 0x5e, 0x93, 0x8f, 0x79, + 0x28, 0x93, 0x8b, 0x76, 0x5e, 0x98, 0x62, 0xa7, + 0x7, 0x76, 0x62, 0x93, 0x5e, 0x93, 0x8b, 0x82, + 0x5e, 0x62, 0x8f, 0x9c, 0x7, 0x8f, 0x6a, 0x54, + 0x6e, 0x31, 0x94, 0x62, 0x98, 0x8b, 0x8b, 0x68, + 0xa3, 0x8b, 0x8b, 0x68, 0x9f, 0x8b, 0x98, 0xa3, + 0xa3, 0x98, 0x98, 0x4e, 0x4e, 0x98, 0x98, 0xa3, + 0xb5, 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, 0x14, + 0x14, 0x14, 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, + 0x14, 0xff, 0x68, 0x0, 0x68, 0x68, 0x0, 0x0, + 0x0, 0x68, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0xa3, 0xa3, 0xa3, 0x4e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x34, 0x23, 0x39, 0x23, 0x23, 0x36, 0x58, 0x9a, + 0x4d, 0x36, 0x36, 0x7f, 0x2a, 0x21, 0x3f, 0x23, + 0x99, 0x6f, 0x91, 0x62, 0x27, 0x62, 0x62, 0x76, + 0x82, 0x8f, 0x7e, 0xb3, 0x50, 0x83, 0x99, 0x48, + 0xfa, 0x2b, 0x7f, 0x67, 0x23, 0x36, 0x36, 0x80, + 0x99, 0x80, 0x48, 0x2b, 0x3f, 0x23, 0x42, 0x58, + 0x58, 0x6b, 0x7e, 0x93, 0x8f, 0x91, 0x8f, 0xa7, + 0xaa, 0x8f, 0x8f, 0x2f, 0xa8, 0x8f, 0x98, 0x5e, + 0x93, 0x62, 0x93, 0x82, 0x9c, 0x8f, 0x74, 0xa6, + 0xb4, 0x99, 0x39, 0x23, 0x39, 0x2a, 0x39, 0x63, + 0x90, 0x23, 0x23, 0x99, 0x9, 0x9, 0x54, 0x39, + 0x99, 0x83, 0x7d, 0x46, 0x8f, 0x62, 0x8d, 0x8d, + 0x8b, 0x8d, 0x79, 0x79, 0x8b, 0xa8, 0x82, 0x8d, + 0x62, 0x8d, 0x5e, 0x8d, 0x8b, 0x98, 0x8d, 0x8d, + 0x8f, 0x79, 0xa3, 0x79, 0x7d, 0xa7, 0x9f, 0x8d, + 0x93, 0x82, 0x8d, 0x93, 0x98, 0x8d, 0x8d, 0x8b, + 0x8b, 0xa7, 0xa7, 0x7d, 0x8f, 0xf3, 0xa8, 0x74, + 0x94, 0x6a, 0x41, 0x54, 0xfa, 0xf2, 0xf2, 0xf2, + 0xf2, 0x1, 0xeb, 0x15, 0xeb, 0x15, 0x15, 0x1d, + 0x36, 0x31, 0x6a, 0x7e, 0x8f, 0xa7, 0x9c, 0x8f, + 0x62, 0xa8, 0x50, 0x91, 0x91, 0x91, 0x81, 0x6f, + 0x5d, 0x90, 0x23, 0xea, 0x39, 0xd0, 0xd0, 0x3, + 0x40, 0x50, 0xe9, 0x60, 0x1e, 0x6c, 0x79, 0x8d, + 0x5e, 0x5e, 0x76, 0x76, 0x68, 0x6c, 0xb7, 0xa8, + 0xa7, 0x28, 0x5f, 0x9c, 0x6c, 0x28, 0x9c, 0x9c, + 0xa7, 0xc, 0xaf, 0xa, 0x34, 0x34, 0xeb, 0x1, + 0x2a, 0x23, 0x39, 0x1d, 0x1a, 0x36, 0x48, 0x15, + 0x34, 0x39, 0x41, 0x50, 0x7, 0x6c, 0x37, 0xf7, + 0x6c, 0x86, 0x79, 0x68, 0xa3, 0x28, 0x76, 0x68, + 0x5e, 0x86, 0x76, 0xb6, 0x6c, 0x86, 0x5e, 0x5e, + 0xa3, 0x5e, 0x68, 0x86, 0xa3, 0x5e, 0x5e, 0x7, + 0x9f, 0x5e, 0x6c, 0xdd, 0xdd, 0x74, 0x94, 0x74, + 0x20, 0x3a, 0x9c, 0x32, 0x9e, 0x5e, 0x9f, 0x9f, + 0x9f, 0xa3, 0xa3, 0x9f, 0xa3, 0xa3, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0xb8, + 0xee, 0x16, 0x16, 0x16, 0xff, 0xff, 0x14, 0x22, + 0x14, 0xff, 0x14, 0x14, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x14, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x19, 0xff, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x36, 0x36, 0x4d, 0x42, 0x70, 0x42, 0x7f, 0x54, + 0x54, 0x1d, 0x48, 0x70, 0x23, 0x80, 0x31, 0x63, + 0x31, 0x5d, 0x7e, 0x46, 0x28, 0x82, 0x93, 0x8, + 0x28, 0x93, 0x7d, 0xf7, 0x87, 0x6a, 0x5d, 0x99, + 0x7f, 0x1d, 0x1a, 0x48, 0x73, 0x70, 0x2a, 0x73, + 0xa, 0x7f, 0x80, 0x9a, 0x23, 0x36, 0x31, 0x5d, + 0x55, 0x74, 0x5f, 0xc, 0xb7, 0x9c, 0x76, 0xf7, + 0xf3, 0x5f, 0x76, 0x86, 0x5e, 0x8d, 0x28, 0x68, + 0x5e, 0x76, 0x68, 0x5e, 0xba, 0xa8, 0xa7, 0xc, + 0xbf, 0x5a, 0x58, 0x6a, 0x6f, 0x67, 0x31, 0x26, + 0x6e, 0xa, 0x6e, 0x54, 0x2a, 0x54, 0x99, 0x4a, + 0x60, 0x27, 0xe, 0x5e, 0x5e, 0x5e, 0x9e, 0x5e, + 0xe, 0xb8, 0x9e, 0x5e, 0x8, 0xf7, 0x6c, 0x68, + 0x68, 0x68, 0x28, 0x68, 0x86, 0x5e, 0xa3, 0x68, + 0x1f, 0x7, 0x5e, 0x9e, 0x5e, 0x28, 0x68, 0x68, + 0x68, 0x68, 0xa3, 0x5e, 0x5e, 0x9f, 0x9f, 0x32, + 0xa7, 0xe, 0x7, 0x5e, 0x5e, 0x28, 0xfc, 0xe, + 0xa7, 0xb7, 0xbf, 0x5a, 0x2a, 0xeb, 0xf2, 0x2b, + 0x3b, 0xf2, 0x16, 0x16, 0x70, 0xee, 0x15, 0x21, + 0x4d, 0x11, 0xb7, 0xa7, 0xe, 0xf0, 0xb7, 0x28, + 0x5e, 0xe, 0x27, 0x55, 0x74, 0x74, 0x83, 0x63, + 0xfd, 0xed, 0xc9, 0x5a, 0xe5, 0xfd, 0xfd, 0x11, + 0x2c, 0xe, 0xe, 0x12, 0x28, 0x68, 0x9e, 0x6c, + 0xfc, 0xfc, 0x7, 0x7, 0x9f, 0x9f, 0xf, 0xa7, + 0x5e, 0x68, 0x68, 0xfc, 0xe, 0x6c, 0x7, 0xb7, + 0xc1, 0x50, 0xb4, 0x6e, 0x73, 0x48, 0xfa, 0x34, + 0x23, 0x80, 0x7f, 0xa, 0xf9, 0x23, 0xfa, 0x73, + 0xea, 0xfe, 0x1b, 0x11, 0x6c, 0x9f, 0x5e, 0xfc, + 0x28, 0x68, 0x68, 0x9f, 0x6c, 0x1f, 0x1e, 0x7, + 0xb6, 0x5e, 0xfc, 0xfc, 0x5e, 0xa3, 0x68, 0x86, + 0xfc, 0x28, 0x5e, 0x9f, 0x9f, 0x9f, 0xfc, 0x7, + 0x9f, 0x9f, 0x68, 0xfc, 0x93, 0x93, 0x8f, 0xaa, + 0xa, 0xf9, 0x8f, 0x9f, 0x9f, 0x68, 0xa3, 0x68, + 0xa3, 0x68, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0x4e, + 0x4e, 0xa3, 0xa3, 0xa3, 0xa3, 0x9e, 0x5e, 0x48, + 0xf2, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, 0x14, + 0xff, 0x14, 0xff, 0x14, 0xff, 0x14, 0x14, 0x3b, + 0x17, 0x16, 0x68, 0x0, 0x0, 0x68, 0x68, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x4e, 0x4e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x42, 0x4d, 0x36, 0x7f, 0x54, 0x70, 0x21, 0x3b, + 0x2a, 0x80, 0x63, 0x48, 0x23, 0x36, 0x85, 0xb0, + 0x40, 0x1b, 0x12, 0x7, 0xb8, 0x7, 0x6c, 0xe, + 0xa7, 0x5e, 0x6c, 0x5e, 0x12, 0x11, 0x5d, 0xaf, + 0x99, 0x54, 0x23, 0x23, 0x54, 0x48, 0x26, 0x23, + 0x2b, 0x48, 0x58, 0x6f, 0x7f, 0x42, 0x20, 0x72, + 0x50, 0x50, 0x2c, 0x11, 0xf8, 0xa0, 0x5e, 0x28, + 0xe, 0x30, 0x86, 0x68, 0x9f, 0x28, 0x1f, 0xfc, + 0x7, 0xb8, 0x6c, 0xfc, 0x12, 0x5f, 0x76, 0xa7, + 0x40, 0xf4, 0x20, 0x6a, 0xb0, 0x99, 0x6e, 0xf9, + 0x6e, 0x54, 0x67, 0x99, 0x1c, 0x39, 0x41, 0x55, + 0x7e, 0x27, 0x27, 0x1f, 0x5e, 0xb8, 0x9f, 0xfc, + 0x28, 0xfc, 0x5e, 0x4e, 0x28, 0x1f, 0x1f, 0x68, + 0x8d, 0x68, 0xfc, 0x46, 0x8d, 0x7, 0x7, 0x5e, + 0x1f, 0x1f, 0x9e, 0x68, 0x5e, 0x5e, 0x1f, 0x5e, + 0x5e, 0x5e, 0x6c, 0x28, 0x1f, 0x7, 0x7, 0x5e, + 0x79, 0x46, 0x1f, 0x82, 0x76, 0x28, 0x5f, 0x74, + 0xaa, 0xa1, 0xd0, 0xa, 0xfa, 0x34, 0x34, 0x48, + 0x42, 0x21, 0x16, 0x17, 0x3b, 0x3d, 0x16, 0x3d, + 0xfa, 0xf4, 0xbf, 0x3e, 0x55, 0x38, 0x5f, 0x93, + 0x62, 0x93, 0x6a, 0x81, 0x91, 0xb0, 0xb4, 0x54, + 0xf9, 0xe0, 0xd4, 0xb, 0x60, 0x12, 0x60, 0x94, + 0x9c, 0x37, 0x1e, 0x74, 0x82, 0x5e, 0xa7, 0xb9, + 0x37, 0x1e, 0xa7, 0xa7, 0x5e, 0x5e, 0x46, 0x7d, + 0x32, 0x5e, 0x9c, 0xa8, 0xa8, 0x7, 0xba, 0xbf, + 0xbe, 0xa1, 0x90, 0x26, 0x7f, 0x42, 0x36, 0x21, + 0x48, 0x7f, 0x73, 0xeb, 0xeb, 0x34, 0x15, 0xeb, + 0xf9, 0x3a, 0x5d, 0x55, 0x37, 0x5e, 0x93, 0x76, + 0x76, 0x5e, 0x8b, 0xa7, 0xa0, 0x28, 0x8b, 0x82, + 0x5e, 0x8d, 0x8b, 0x98, 0x5e, 0x8d, 0x98, 0x28, + 0x6c, 0x76, 0x7d, 0x6c, 0x7, 0x28, 0x98, 0x5e, + 0x5e, 0x93, 0x8b, 0x68, 0xa7, 0x8f, 0xaa, 0x54, + 0x73, 0x54, 0x74, 0x76, 0x9f, 0x93, 0x8b, 0x5e, + 0xa3, 0x98, 0x98, 0x4e, 0x68, 0x8b, 0x98, 0xa3, + 0x4e, 0x8d, 0x98, 0x0, 0x4e, 0x93, 0x98, 0x98, + 0x98, 0x16, 0x14, 0x14, 0x14, 0xff, 0x14, 0x14, + 0xff, 0x14, 0x14, 0xff, 0xff, 0xff, 0xff, 0x14, + 0x16, 0x18, 0x68, 0x0, 0x68, 0x68, 0x4e, 0x68, + 0x68, 0x68, 0x68, 0x0, 0xa3, 0xa3, 0xa3, 0x0, + 0x4e, 0xa3, 0xa3, 0xa3, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x23, 0x23, 0x48, 0x54, 0xa, 0x23, 0x1c, 0x48, + 0x36, 0x59, 0x9a, 0x48, 0x34, 0x21, 0x7f, 0x5a, + 0xb4, 0x1b, 0x55, 0xa8, 0xb7, 0x46, 0x76, 0x46, + 0x1e, 0x46, 0x93, 0xa7, 0x2f, 0x40, 0x99, 0x6e, + 0xa, 0xfa, 0x23, 0x54, 0x39, 0x67, 0x63, 0x42, + 0x48, 0x7f, 0x63, 0x99, 0x6e, 0xfa, 0x39, 0x7f, + 0xb4, 0xb0, 0x55, 0x30, 0x74, 0x62, 0x7d, 0x82, + 0x93, 0x94, 0x8d, 0x5e, 0x1e, 0xb3, 0x46, 0x8d, + 0x5f, 0x5f, 0x76, 0x82, 0x62, 0x94, 0x74, 0x7e, + 0x90, 0x99, 0x99, 0x90, 0x99, 0x6e, 0x7f, 0x99, + 0x54, 0x7f, 0x63, 0x71, 0x71, 0x67, 0x4d, 0x6a, + 0x6a, 0x60, 0xaa, 0x76, 0x74, 0x2c, 0x6c, 0x8d, + 0x93, 0x98, 0x9f, 0x79, 0x8b, 0x8b, 0x5e, 0x79, + 0x98, 0x9c, 0x8, 0x98, 0x93, 0x5f, 0x6c, 0x8d, + 0x8f, 0x8d, 0x5e, 0x82, 0x8b, 0x82, 0x5e, 0x8d, + 0x93, 0x37, 0x7, 0x76, 0x8f, 0x8d, 0x5e, 0x8b, + 0x8f, 0x98, 0x82, 0x7d, 0x8b, 0x9c, 0xa8, 0xaa, + 0x6f, 0xb4, 0x73, 0x73, 0xeb, 0xfa, 0x2b, 0x23, + 0x36, 0x1d, 0x3b, 0x15, 0x3d, 0x16, 0x16, 0x15, + 0x15, 0x2a, 0x7f, 0x6f, 0x74, 0x8d, 0x93, 0x7e, + 0x7e, 0x94, 0x91, 0x6f, 0x90, 0x99, 0x54, 0x54, + 0x7f, 0xc9, 0x5a, 0x6f, 0x5f, 0x37, 0x62, 0x74, + 0x74, 0x82, 0x9c, 0xaa, 0x9c, 0x28, 0x46, 0x74, + 0x82, 0x5e, 0x98, 0x8f, 0x82, 0x5e, 0x93, 0x8f, + 0x9c, 0x82, 0x62, 0xa6, 0xa8, 0xa8, 0x50, 0xb4, + 0xa1, 0xa6, 0x97, 0x6e, 0xf9, 0x39, 0x54, 0x73, + 0xfa, 0xfa, 0x15, 0x15, 0x34, 0x34, 0x3d, 0x15, + 0x39, 0x58, 0x65, 0x74, 0xa7, 0x5f, 0x62, 0x9c, + 0xb8, 0x76, 0x62, 0x98, 0x28, 0x76, 0x8b, 0x98, + 0xfc, 0x8d, 0x8b, 0x8d, 0x5e, 0x28, 0x62, 0x76, + 0x7, 0x9c, 0x8b, 0x28, 0x5e, 0x5e, 0x8b, 0x5e, + 0x5e, 0x93, 0x8f, 0x6c, 0xb8, 0xe6, 0x73, 0x54, + 0x70, 0x54, 0x8f, 0x93, 0x82, 0x8b, 0x8b, 0x4e, + 0x86, 0x98, 0x98, 0xa3, 0xa3, 0x7d, 0x82, 0xa3, + 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x98, 0x8d, 0x7d, + 0x16, 0x16, 0x14, 0x16, 0xff, 0x14, 0xff, 0x14, + 0x14, 0x14, 0xff, 0x14, 0x14, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x4e, 0x68, 0x68, 0x68, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0xa3, 0xa3, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x70, 0x1c, 0x48, 0xfa, 0x23, 0x63, 0x63, 0x63, + 0x36, 0x4d, 0x59, 0x7f, 0x70, 0x3b, 0x3b, 0x2b, + 0x39, 0x6f, 0x91, 0x93, 0x46, 0x62, 0x8f, 0x7d, + 0x76, 0x74, 0x94, 0x5f, 0x50, 0xb4, 0x99, 0x34, + 0xeb, 0x34, 0x48, 0x2a, 0x39, 0xfe, 0x4d, 0x56, + 0x7f, 0x2a, 0x23, 0x23, 0x2a, 0x34, 0x48, 0x23, + 0xf9, 0x58, 0x7e, 0x46, 0x89, 0x7e, 0x7e, 0x76, + 0x74, 0xb3, 0x9c, 0x1f, 0x9c, 0x7e, 0x98, 0x5e, + 0x46, 0x7e, 0x7d, 0x76, 0x8f, 0xaa, 0x83, 0x83, + 0xb0, 0x99, 0x99, 0x3a, 0x42, 0x26, 0x63, 0x90, + 0x7f, 0x23, 0x67, 0x85, 0x90, 0x99, 0x26, 0x4d, + 0x35, 0x83, 0x2f, 0x8d, 0x62, 0x62, 0x37, 0x8d, + 0x98, 0x98, 0x1e, 0x37, 0x98, 0x76, 0x5e, 0x37, + 0x62, 0x7d, 0x28, 0x82, 0x98, 0x46, 0xfc, 0x8d, + 0x98, 0x8d, 0x6c, 0x46, 0x93, 0x76, 0x7, 0x37, + 0x93, 0x76, 0x5e, 0x8d, 0x8d, 0x8d, 0xfc, 0x46, + 0x98, 0x8d, 0x7, 0xa8, 0x94, 0x9c, 0xb3, 0x60, + 0x6a, 0x26, 0x34, 0x34, 0x70, 0xf2, 0x15, 0x2b, + 0x54, 0x73, 0xf2, 0x3d, 0x17, 0x16, 0xf2, 0x2b, + 0x42, 0x1c, 0x31, 0x6a, 0x9c, 0x76, 0xa7, 0x50, + 0x60, 0x9c, 0xaa, 0xb0, 0x41, 0x20, 0xfd, 0x20, + 0x4a, 0x35, 0x1b, 0x4a, 0xa7, 0x5e, 0x76, 0xa8, + 0x2c, 0x1f, 0x37, 0x5f, 0x28, 0x68, 0x1f, 0x93, + 0x8d, 0x68, 0x8d, 0x30, 0xa7, 0x5e, 0x82, 0xa8, + 0xa0, 0x2f, 0x93, 0x8f, 0x28, 0x7, 0xba, 0xbf, + 0xa1, 0x50, 0xc9, 0x73, 0xf2, 0xf2, 0xee, 0x15, + 0x15, 0x23, 0x21, 0x34, 0xa, 0x7f, 0x2b, 0x3f, + 0x26, 0x52, 0x5f, 0x37, 0xdd, 0x12, 0x82, 0x5e, + 0x28, 0x28, 0x1f, 0x1f, 0x5e, 0x86, 0x8d, 0x28, + 0xfc, 0x76, 0x68, 0x9f, 0x9f, 0xfc, 0x37, 0x5e, + 0xa3, 0x5e, 0x5e, 0x28, 0x5e, 0x9e, 0x5e, 0x4e, + 0x7, 0xf7, 0x5e, 0x9e, 0x7, 0xc9, 0x8a, 0x54, + 0x4d, 0x7d, 0x93, 0x93, 0x9f, 0x68, 0xa3, 0x4e, + 0xa3, 0x9f, 0xa3, 0x4e, 0x4e, 0x9e, 0x4e, 0xa3, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x76, 0x76, 0xf2, + 0x16, 0x16, 0xff, 0xff, 0xff, 0x16, 0x14, 0x14, + 0x18, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x67, 0x9a, 0x80, 0x21, 0x42, 0x80, 0x99, 0x54, + 0x73, 0x48, 0x42, 0x54, 0x54, 0x54, 0x48, 0x1a, + 0x58, 0x7e, 0x7d, 0x76, 0xe, 0x30, 0x93, 0x76, + 0x7, 0xa6, 0x27, 0x12, 0xa8, 0x11, 0x90, 0x39, + 0x21, 0x3f, 0x70, 0x34, 0x34, 0x2a, 0x39, 0x48, + 0x6e, 0x54, 0x23, 0xfe, 0x42, 0x67, 0x9a, 0x4d, + 0x31, 0x6a, 0x9c, 0x76, 0x76, 0xa6, 0x12, 0x76, + 0x37, 0xa8, 0x5f, 0x1f, 0x46, 0x79, 0x68, 0x68, + 0x82, 0x30, 0xa7, 0x28, 0xa8, 0x50, 0xb, 0x40, + 0x41, 0x41, 0x83, 0x58, 0x3a, 0x58, 0x90, 0x90, + 0x99, 0x34, 0x39, 0x6e, 0x3, 0x3, 0x5a, 0x1b, + 0x27, 0x5f, 0x6c, 0x5e, 0x37, 0x46, 0x4e, 0x5e, + 0x5e, 0x9f, 0xf7, 0x37, 0x5e, 0x5e, 0x68, 0x68, + 0x37, 0x5e, 0x68, 0x68, 0x8d, 0x28, 0x28, 0xa3, + 0xa3, 0x9f, 0x7, 0xfc, 0x5e, 0x9e, 0x5e, 0x68, + 0x28, 0x68, 0x68, 0x68, 0x68, 0xa3, 0x28, 0xa7, + 0x5e, 0x5e, 0x8, 0xe, 0x46, 0x5e, 0x6c, 0x5f, + 0x60, 0x41, 0x6e, 0xa, 0x73, 0x15, 0x34, 0xf2, + 0x3d, 0xf2, 0xf2, 0x34, 0xe1, 0x3d, 0x15, 0x54, + 0x26, 0x3a, 0x4a, 0xa6, 0x8, 0x6c, 0xdd, 0xc8, + 0x2f, 0x28, 0x8, 0xf8, 0xf0, 0x1b, 0x1b, 0xf8, + 0xa0, 0xf7, 0x5f, 0xf3, 0x7, 0x9f, 0x9f, 0x28, + 0x37, 0x8d, 0x9f, 0x5e, 0x68, 0x68, 0x5e, 0x5e, + 0x9f, 0xa3, 0x9f, 0x6c, 0xf7, 0x5e, 0x68, 0x5e, + 0x28, 0x37, 0x82, 0x5e, 0x5e, 0x9f, 0xb7, 0xbf, + 0xc2, 0xbf, 0xcb, 0x73, 0x15, 0x3d, 0x15, 0x15, + 0x15, 0xfa, 0x21, 0x8a, 0xe6, 0xa, 0x2a, 0xfa, + 0x3, 0x50, 0x8, 0x6c, 0x8, 0x28, 0x5e, 0x5e, + 0xa3, 0x68, 0x5e, 0x86, 0xa3, 0x9f, 0x9e, 0x5e, + 0x9f, 0x9f, 0x68, 0xa3, 0xa3, 0xa3, 0x68, 0x68, + 0xa3, 0x86, 0xa3, 0x9f, 0xa3, 0x9f, 0x9f, 0x5e, + 0x7, 0xb6, 0x5e, 0xa3, 0x9f, 0x8f, 0x54, 0xeb, + 0xe6, 0x3, 0x6c, 0xa3, 0x9f, 0x9f, 0xa3, 0xa3, + 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0xb5, 0x3d, 0x16, + 0x16, 0xff, 0x16, 0x14, 0x14, 0xff, 0x14, 0xff, + 0x14, 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, 0x14, + 0x16, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x90, 0x90, 0x9a, 0x7f, 0x54, 0x54, 0x73, 0x70, + 0x34, 0xfa, 0x34, 0x6e, 0x5a, 0x7f, 0x31, 0x20, + 0x4a, 0x2c, 0xa7, 0x6c, 0x8, 0xa0, 0x28, 0x68, + 0x6c, 0xe, 0x46, 0x37, 0xa7, 0xa8, 0x60, 0x41, + 0x23, 0x34, 0x48, 0x34, 0x21, 0x34, 0xfa, 0x34, + 0x23, 0x42, 0x39, 0x39, 0xf9, 0x99, 0x66, 0x90, + 0x9d, 0xa1, 0xba, 0x6c, 0x6c, 0xa7, 0xe, 0x5e, + 0x5e, 0x5e, 0x5e, 0x8d, 0x5e, 0x5e, 0x5e, 0x4e, + 0x5e, 0xc, 0xf3, 0x7, 0xa7, 0x2f, 0x60, 0xb, + 0x6e, 0x41, 0x5d, 0x83, 0x58, 0x99, 0x41, 0x5, + 0x99, 0x6e, 0x99, 0xfd, 0x7f, 0xfe, 0x83, 0x6f, + 0x3e, 0x5f, 0x28, 0x6c, 0x5e, 0x5e, 0xb8, 0xb6, + 0x5e, 0x68, 0x6c, 0x8d, 0x8d, 0x5e, 0xa3, 0xa3, + 0x79, 0x5e, 0x68, 0x7, 0x68, 0x5e, 0xb8, 0x9f, + 0x32, 0x9e, 0x5e, 0x68, 0x86, 0x5e, 0xa3, 0x86, + 0x8d, 0x5e, 0x68, 0x7, 0x86, 0x5e, 0x9f, 0x8, + 0x28, 0x68, 0x9e, 0x82, 0x82, 0x82, 0x37, 0xb3, + 0xb0, 0x5a, 0xeb, 0xfa, 0x34, 0xfa, 0x73, 0x3b, + 0x21, 0x2b, 0x22, 0xf2, 0xf2, 0xf2, 0xf2, 0x15, + 0x48, 0x41, 0x60, 0x40, 0x2c, 0xfc, 0x28, 0x5f, + 0x5f, 0x5e, 0xdd, 0xf0, 0xcc, 0xe5, 0x40, 0xe5, + 0xc8, 0xa0, 0x7d, 0x5f, 0x2f, 0x28, 0x37, 0x76, + 0x76, 0x5e, 0x28, 0x1e, 0x9f, 0x5e, 0x8d, 0x76, + 0xf7, 0x9f, 0x1e, 0x79, 0x5e, 0x86, 0x37, 0x93, + 0x5e, 0x82, 0x93, 0x9c, 0xb7, 0x7, 0xa6, 0xbf, + 0xbf, 0x9, 0x5a, 0x54, 0xfa, 0x3f, 0x22, 0x2b, + 0x21, 0x15, 0x15, 0xf2, 0xeb, 0xeb, 0x34, 0x6e, + 0xb, 0x3e, 0x55, 0x82, 0x5e, 0x5e, 0x7d, 0x46, + 0xfc, 0x76, 0x93, 0x82, 0x7, 0xf7, 0x82, 0x5e, + 0x9e, 0x5e, 0x8d, 0x1e, 0x68, 0x68, 0x98, 0x68, + 0x28, 0x6c, 0x9c, 0x68, 0x9f, 0x8, 0x9c, 0x86, + 0x68, 0x98, 0x8f, 0x93, 0x46, 0xaa, 0x54, 0x70, + 0x34, 0xeb, 0x6e, 0x86, 0xa3, 0xa3, 0x93, 0xa3, + 0xa3, 0x98, 0x98, 0xa3, 0xa3, 0x93, 0x8d, 0xa3, + 0x4e, 0x93, 0x9c, 0x82, 0x98, 0x98, 0x3f, 0x3b, + 0x14, 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, + 0xff, 0x16, 0x4e, 0x68, 0x0, 0x68, 0x0, 0x0, + 0x68, 0xa3, 0xa3, 0x4e, 0xa3, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x39, 0x54, 0x7f, 0x99, 0x54, 0x70, 0x1d, 0x36, + 0x36, 0x67, 0x48, 0x48, 0x39, 0x54, 0x6e, 0x7f, + 0x41, 0x97, 0x60, 0x43, 0x43, 0x2f, 0x93, 0xfc, + 0x37, 0x93, 0x74, 0x76, 0x2c, 0xb0, 0x3, 0x6e, + 0x54, 0x34, 0xfa, 0x1d, 0x80, 0x67, 0x67, 0x1c, + 0x42, 0x42, 0x48, 0x34, 0x34, 0x34, 0xfa, 0x99, + 0x90, 0x90, 0x40, 0x12, 0x46, 0x8f, 0x93, 0x5e, + 0x46, 0x62, 0x9c, 0x5e, 0x79, 0x74, 0xa8, 0x28, + 0x93, 0x8f, 0x5f, 0xfc, 0x55, 0x74, 0x6a, 0x97, + 0x7f, 0x39, 0x9, 0x3, 0x99, 0x99, 0xf9, 0x39, + 0x9a, 0x90, 0x90, 0x31, 0x31, 0x4d, 0x5d, 0x6a, + 0x6a, 0x6a, 0x10, 0x2c, 0x74, 0x8f, 0x28, 0x30, + 0x62, 0x98, 0x8d, 0x8d, 0x8b, 0x30, 0x79, 0x5e, + 0x98, 0x93, 0xa0, 0xf3, 0x8b, 0x8d, 0x68, 0x28, + 0x30, 0x37, 0x68, 0x79, 0x98, 0x8d, 0xfc, 0x76, + 0x93, 0x8d, 0x9f, 0xa8, 0x7d, 0x8d, 0x5e, 0x8d, + 0x62, 0x30, 0x37, 0x7d, 0x8f, 0x9c, 0xa6, 0x41, + 0x3, 0xa, 0xd8, 0xeb, 0xf5, 0x34, 0x23, 0x54, + 0x2a, 0x21, 0x34, 0xfa, 0x3d, 0x16, 0xf2, 0x15, + 0x15, 0x7f, 0x6a, 0x81, 0x55, 0x30, 0x62, 0x94, + 0x74, 0xe, 0x11, 0xaf, 0xb4, 0xb, 0x40, 0x40, + 0x11, 0x1f, 0x7d, 0x8f, 0x7d, 0x1e, 0x62, 0x8f, + 0x9c, 0x82, 0x82, 0x55, 0xc, 0x6c, 0x82, 0x8b, + 0x30, 0x46, 0x98, 0x8b, 0x8d, 0x5e, 0x30, 0x62, + 0x76, 0x28, 0x74, 0x55, 0xa6, 0xc, 0x5f, 0x83, + 0x97, 0x5a, 0x48, 0x48, 0x73, 0x34, 0x2b, 0x3f, + 0x34, 0x34, 0x34, 0x15, 0x15, 0x15, 0xeb, 0x26, + 0x6a, 0x55, 0x7e, 0x62, 0x5e, 0x5e, 0x93, 0x62, + 0xe, 0xc, 0x8f, 0x8d, 0x5e, 0x1f, 0x8b, 0x8d, + 0x68, 0x5e, 0x8b, 0x8d, 0x86, 0x68, 0x82, 0x5e, + 0x5e, 0x37, 0x8b, 0x32, 0xa3, 0x5e, 0x62, 0x5e, + 0xa3, 0x98, 0x8f, 0x7d, 0x9c, 0xa, 0x73, 0x73, + 0x34, 0x2a, 0x55, 0x5e, 0x4e, 0x5e, 0x98, 0xa3, + 0x4e, 0x79, 0x93, 0xa3, 0xa3, 0x98, 0x7d, 0x4e, + 0x4e, 0x8d, 0x98, 0x79, 0x8d, 0x98, 0x22, 0x14, + 0x14, 0xff, 0x16, 0xff, 0x14, 0xff, 0x14, 0xff, + 0x14, 0x14, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa3, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x48, 0x2b, 0x48, 0x67, 0x63, 0x42, 0x36, 0x31, + 0x59, 0x9a, 0x80, 0x48, 0x1d, 0x34, 0x3f, 0x39, + 0x3a, 0x20, 0x5d, 0x62, 0x76, 0x8f, 0x94, 0x62, + 0x55, 0x94, 0xaa, 0x9c, 0x3e, 0x5a, 0xa, 0x73, + 0x2a, 0x2a, 0x34, 0x23, 0x63, 0x71, 0x9a, 0x36, + 0x42, 0x48, 0x54, 0x34, 0x22, 0x34, 0x34, 0x48, + 0x4c, 0x6a, 0x91, 0x27, 0x62, 0x94, 0x9c, 0x82, + 0x46, 0x60, 0xa9, 0x37, 0x93, 0x93, 0x62, 0x82, + 0x93, 0x8f, 0x93, 0x37, 0x55, 0x6a, 0xb0, 0xaf, + 0x26, 0x23, 0x6e, 0x39, 0x4d, 0x58, 0x99, 0x54, + 0x26, 0x6f, 0x6f, 0x63, 0x26, 0x31, 0x99, 0xaf, + 0x6a, 0x8e, 0x60, 0x2f, 0x8b, 0x8f, 0x5e, 0x37, + 0x8b, 0x98, 0x5e, 0x76, 0x8f, 0x62, 0x37, 0xa0, + 0x8b, 0x8d, 0x28, 0x46, 0x98, 0x8d, 0x5e, 0x4e, + 0x8d, 0x8d, 0x68, 0x5e, 0x8d, 0x8d, 0x37, 0xa7, + 0x93, 0x8d, 0x5e, 0x8d, 0x98, 0x86, 0xa3, 0x8d, + 0x98, 0x46, 0x76, 0xa8, 0xaa, 0x5f, 0xba, 0xb, + 0x6e, 0x54, 0x34, 0xf2, 0x3d, 0x3d, 0x34, 0x34, + 0xf2, 0x34, 0x34, 0xeb, 0xf2, 0x2b, 0x21, 0x3f, + 0x22, 0x4d, 0x5d, 0x91, 0x74, 0x76, 0x76, 0x9c, + 0xa9, 0xb7, 0xb7, 0x50, 0xcc, 0xf3, 0xe, 0x74, + 0x5f, 0x76, 0x8d, 0x98, 0x8d, 0x5e, 0x76, 0x7d, + 0xb7, 0xb6, 0x5e, 0x76, 0x28, 0x68, 0x5e, 0x8d, + 0x8d, 0x68, 0x68, 0x8d, 0x5e, 0x7, 0x5e, 0x82, + 0x7, 0x7, 0x8d, 0x93, 0x76, 0x28, 0x76, 0x74, + 0xa6, 0xb4, 0x2a, 0x34, 0xee, 0x3d, 0x3d, 0x34, + 0xfa, 0xfa, 0x23, 0x1c, 0x23, 0xfa, 0x21, 0xfe, + 0x60, 0x28, 0xa7, 0x68, 0x7, 0xb8, 0x37, 0x8d, + 0x5e, 0x5e, 0x9f, 0x68, 0x86, 0xa3, 0x68, 0x68, + 0x4e, 0x5e, 0x5e, 0x9e, 0x5e, 0xb6, 0x5e, 0x9f, + 0xa3, 0xa3, 0x5e, 0x9e, 0xa3, 0xa3, 0x68, 0x5e, + 0x9e, 0x9f, 0x7, 0x9f, 0x9f, 0xcb, 0xa, 0x73, + 0x8f, 0x8b, 0x93, 0x9e, 0xa3, 0x4e, 0x9e, 0x4e, + 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0xa3, 0x4e, 0xa3, 0x79, 0x16, 0x16, 0x14, + 0xff, 0x16, 0xff, 0xff, 0x14, 0x14, 0xff, 0x14, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x36, 0x1c, 0x48, 0x4d, 0x58, 0x80, 0x7f, 0x4d, + 0x99, 0x54, 0x99, 0x54, 0x54, 0x2a, 0x23, 0x20, + 0x6a, 0x55, 0x62, 0x37, 0x5e, 0x76, 0x9c, 0x37, + 0x46, 0xa8, 0xa8, 0xa0, 0x5f, 0x40, 0x41, 0xfe, + 0x31, 0x23, 0x21, 0x34, 0x7f, 0x7f, 0x54, 0x6e, + 0x54, 0x2a, 0x48, 0x7f, 0x4d, 0x36, 0x42, 0x42, + 0x5d, 0x55, 0x9c, 0x5f, 0x1e, 0xa7, 0xb7, 0x7, + 0x28, 0x28, 0x28, 0xa7, 0x5e, 0x82, 0x5e, 0x68, + 0x76, 0x76, 0x6c, 0x8, 0xa7, 0xae, 0xbf, 0xd0, + 0x99, 0x56, 0x4d, 0x20, 0x31, 0x5d, 0x90, 0x26, + 0x67, 0x4d, 0x99, 0xa, 0x99, 0x99, 0xf4, 0xe3, + 0x60, 0x76, 0x5e, 0x68, 0x32, 0x9f, 0x5e, 0xa3, + 0x68, 0x5e, 0x6c, 0xb7, 0x9f, 0x32, 0xa3, 0x9f, + 0x5e, 0x68, 0xa3, 0xa3, 0xa3, 0x4e, 0x9e, 0xa3, + 0x68, 0xa3, 0x4e, 0x7, 0x9f, 0x4e, 0xa3, 0x9e, + 0x5e, 0xa3, 0x9e, 0xa3, 0x68, 0x32, 0x9f, 0x5e, + 0x6c, 0x68, 0xa3, 0x8, 0xf7, 0x28, 0x37, 0x50, + 0x3, 0xf9, 0x48, 0x15, 0x3d, 0x34, 0x15, 0x3d, + 0x16, 0xf2, 0x3d, 0x16, 0x3d, 0x23, 0x42, 0x67, + 0x67, 0x3a, 0x1b, 0x12, 0xa0, 0x7, 0x6c, 0xa0, + 0xe4, 0xc, 0xfc, 0x28, 0xfc, 0xfc, 0x6c, 0x5e, + 0x6c, 0x9f, 0x28, 0x86, 0x7, 0x9f, 0x5e, 0x9f, + 0xfc, 0xfc, 0x68, 0x86, 0x5e, 0xa3, 0x5e, 0x5e, + 0x4e, 0xa3, 0xa3, 0x9f, 0x8, 0xb8, 0xa3, 0x5e, + 0x5e, 0xfc, 0x5e, 0x68, 0x9f, 0x6c, 0xa0, 0xc, + 0xc8, 0xb4, 0x73, 0x15, 0xf2, 0x3d, 0x34, 0x23, + 0xfa, 0xeb, 0x23, 0x42, 0x7f, 0xa, 0x23, 0xfe, + 0x11, 0xba, 0xa0, 0x9f, 0xfc, 0x24, 0xfc, 0x5e, + 0x9e, 0x5e, 0x68, 0x5e, 0x68, 0xa3, 0x9f, 0xa3, + 0xfc, 0x9f, 0x9f, 0xa3, 0x4e, 0x5e, 0x68, 0x4e, + 0xa3, 0xa2, 0xa3, 0x68, 0x68, 0xa3, 0x7, 0x4e, + 0x9f, 0x28, 0x9f, 0x9f, 0xa3, 0xfd, 0x73, 0x73, + 0x9c, 0x6c, 0x9f, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0x82, 0x93, + 0x79, 0x98, 0x8d, 0xb5, 0xf2, 0x16, 0xff, 0xff, + 0x16, 0xff, 0x14, 0x14, 0xff, 0x14, 0xff, 0xff, + 0xff, 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, + 0x16, 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x3a, 0x85, 0x9a, 0x31, 0x67, 0x48, 0x48, 0x99, + 0xcb, 0x34, 0x73, 0x80, 0x90, 0x39, 0x23, 0x20, + 0x12, 0x5f, 0xa7, 0x6c, 0xfc, 0xf7, 0xb7, 0x6c, + 0x5e, 0xa0, 0xe, 0xfc, 0x28, 0xaa, 0x40, 0xfd, + 0xfd, 0x39, 0x73, 0x48, 0x48, 0x70, 0x34, 0x54, + 0x59, 0x99, 0x2a, 0x1c, 0x63, 0x85, 0x99, 0xfd, + 0x20, 0x4a, 0xba, 0xb7, 0x37, 0x1f, 0x12, 0x28, + 0x5e, 0x32, 0x9f, 0xfc, 0x1e, 0x5e, 0x5e, 0x7, + 0x9f, 0x12, 0xf3, 0xcd, 0xa7, 0xc, 0x72, 0x3, + 0x63, 0x83, 0x90, 0x7f, 0x20, 0x4d, 0xb, 0x3, + 0x6e, 0x39, 0x39, 0x48, 0x67, 0x58, 0x5a, 0xfd, + 0x3e, 0x5f, 0x28, 0x28, 0x2f, 0x1f, 0x68, 0x7, + 0x28, 0x68, 0x1f, 0x12, 0x93, 0x8d, 0x68, 0x4e, + 0x1f, 0x28, 0x86, 0x32, 0x6c, 0xf, 0xfc, 0x5e, + 0x6c, 0xa3, 0xa3, 0xfc, 0x43, 0x75, 0x4e, 0x68, + 0x1f, 0x28, 0x68, 0x5e, 0xa7, 0x6c, 0x1f, 0x1e, + 0x8d, 0x86, 0x5e, 0x1f, 0x12, 0x76, 0x5f, 0xb0, + 0xa, 0x34, 0xfa, 0xeb, 0x73, 0x34, 0x23, 0x34, + 0x17, 0x15, 0x2b, 0x3d, 0x16, 0x3b, 0x54, 0x73, + 0xfa, 0xf9, 0x3a, 0x4a, 0xa6, 0xe, 0x37, 0x55, + 0x62, 0x62, 0x76, 0x76, 0x76, 0xe, 0x1f, 0x82, + 0xa7, 0xb8, 0xe, 0x30, 0x8d, 0x5e, 0x82, 0x46, + 0x46, 0x5e, 0x8d, 0x8d, 0x79, 0x9f, 0x37, 0x8d, + 0x9f, 0x7, 0x6c, 0x46, 0x28, 0x5e, 0x82, 0x8d, + 0x1e, 0x37, 0x98, 0x98, 0xa7, 0xb7, 0x50, 0x83, + 0xaf, 0xe6, 0xa, 0x2a, 0x21, 0x15, 0x21, 0x67, + 0x2a, 0x3d, 0x3d, 0x2a, 0xeb, 0xf2, 0x34, 0x39, + 0x3a, 0x3e, 0x55, 0x7d, 0x28, 0x46, 0x8b, 0x8d, + 0x5e, 0x86, 0x9c, 0x82, 0x9e, 0x32, 0xa7, 0x28, + 0x28, 0x8d, 0x98, 0x68, 0x9e, 0x28, 0x98, 0x75, + 0x4e, 0x68, 0x74, 0x7d, 0x68, 0x93, 0x74, 0x9f, + 0x5e, 0x98, 0x8b, 0x5e, 0x5e, 0x8f, 0x34, 0x34, + 0x73, 0x42, 0x73, 0x9c, 0xa3, 0x93, 0x93, 0x4e, + 0xa3, 0x8d, 0x98, 0x4e, 0xa3, 0x98, 0x98, 0x93, + 0x98, 0x98, 0x93, 0x3d, 0x16, 0x18, 0x16, 0xff, + 0x14, 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, 0x14, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x16, 0x68, 0x68, 0x0, 0x68, 0xa3, 0xa3, 0x0, + 0xa3, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x0, + 0x4e, 0x4e, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, + 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x99, 0x99, 0x6e, 0x42, 0x1c, 0x39, 0x54, 0x90, + 0x4d, 0x48, 0x70, 0x4d, 0x99, 0x54, 0x48, 0x36, + 0x58, 0x6a, 0xa1, 0x2f, 0x12, 0x30, 0x74, 0x76, + 0x5e, 0x9c, 0x7e, 0x5f, 0x9c, 0x60, 0xb4, 0x39, + 0x23, 0x23, 0x6e, 0x7f, 0x42, 0x42, 0x2e, 0x4d, + 0x85, 0x9a, 0x48, 0x48, 0x26, 0x7f, 0x2a, 0x39, + 0x3a, 0x5d, 0x6a, 0xc, 0x9c, 0x62, 0x62, 0x82, + 0x8d, 0x93, 0x82, 0x43, 0x46, 0x8b, 0xa7, 0xb7, + 0x5f, 0x62, 0x9c, 0xa7, 0x74, 0x7e, 0x90, 0x39, + 0x67, 0x99, 0x54, 0x6e, 0x39, 0x7f, 0x9, 0x6e, + 0x99, 0x3a, 0x4d, 0x31, 0x63, 0x6f, 0x4d, 0x67, + 0x83, 0x7e, 0x9c, 0xa8, 0x6a, 0x62, 0x8d, 0x37, + 0x93, 0x98, 0x8d, 0x98, 0x8f, 0x98, 0x5e, 0x8d, + 0x62, 0x98, 0x68, 0x7, 0xa8, 0x8d, 0x5e, 0x5e, + 0x98, 0x79, 0x68, 0x8d, 0x8b, 0x8d, 0x68, 0x79, + 0x8f, 0x8d, 0x68, 0x93, 0xaa, 0x8d, 0x79, 0x98, + 0x8b, 0x82, 0x68, 0x82, 0x74, 0x74, 0xaa, 0x41, + 0x73, 0x34, 0x15, 0x1, 0x34, 0x23, 0x23, 0x1d, + 0x22, 0x70, 0x3f, 0x15, 0x3d, 0x3d, 0xeb, 0xee, + 0x34, 0x48, 0x58, 0x6b, 0x7e, 0x5f, 0x46, 0x8f, + 0x8f, 0x76, 0x82, 0x62, 0x9c, 0x7, 0x76, 0x8b, + 0xa7, 0x8, 0x82, 0x8f, 0x98, 0x5e, 0x82, 0x8f, + 0x8d, 0x8d, 0x82, 0x8b, 0x82, 0x7, 0x8d, 0x93, + 0x8d, 0x5e, 0x8d, 0x98, 0x8d, 0x5e, 0x82, 0x98, + 0x8d, 0x76, 0x9c, 0x62, 0xa7, 0xc8, 0xa6, 0x6a, + 0x99, 0x8a, 0xeb, 0x48, 0x48, 0x70, 0xfa, 0x39, + 0x34, 0x34, 0x15, 0x34, 0x34, 0x15, 0x15, 0x23, + 0x99, 0x5d, 0x91, 0x8f, 0x9f, 0x8d, 0x9c, 0x76, + 0x9f, 0x6c, 0x5f, 0x82, 0x5e, 0x86, 0x98, 0x8d, + 0x68, 0x79, 0x98, 0x68, 0x68, 0x68, 0x98, 0x68, + 0x68, 0x68, 0x8b, 0x86, 0xa3, 0x8d, 0x8b, 0x68, + 0x68, 0x93, 0x8b, 0x5e, 0x9f, 0x74, 0xb3, 0x73, + 0x34, 0x1a, 0x42, 0x93, 0xa3, 0xa3, 0x98, 0xa3, + 0x4e, 0x98, 0x98, 0xa3, 0x79, 0x98, 0x98, 0x93, + 0x98, 0x98, 0x22, 0x3f, 0x8d, 0x16, 0xff, 0x14, + 0xff, 0x14, 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0x9f, 0x68, 0x0, 0x4e, 0xa3, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, + 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x15, 0x34, 0x2a, 0x67, 0x4d, 0x36, 0x67, 0x63, + 0x63, 0x4d, 0x42, 0x7f, 0x7f, 0x34, 0x34, 0x54, + 0x56, 0x90, 0x6a, 0x9c, 0x8d, 0x8f, 0x62, 0x82, + 0x5f, 0x74, 0x7e, 0xa8, 0xaa, 0x83, 0x7f, 0x54, + 0x39, 0x48, 0x48, 0x67, 0x63, 0x59, 0x67, 0x42, + 0x80, 0x99, 0x54, 0xfa, 0x48, 0x34, 0x15, 0x54, + 0x71, 0x81, 0x7e, 0x46, 0x93, 0x8f, 0x8b, 0x82, + 0x76, 0x62, 0x9c, 0x7, 0xab, 0x8b, 0x46, 0x1f, + 0x93, 0x8f, 0x98, 0x7d, 0x74, 0x91, 0x6f, 0xb4, + 0x6e, 0x23, 0x23, 0x23, 0x99, 0x31, 0x26, 0x67, + 0x90, 0x71, 0x90, 0x67, 0x7f, 0x26, 0x66, 0xb4, + 0x97, 0x60, 0x2f, 0x2f, 0x74, 0x8b, 0x5e, 0x37, + 0x93, 0x8d, 0x5e, 0x5e, 0x9c, 0x46, 0x5e, 0x82, + 0xa7, 0x82, 0x68, 0x37, 0x98, 0x8d, 0x68, 0x86, + 0x98, 0x5e, 0x68, 0x4e, 0x89, 0x82, 0x5e, 0x8d, + 0x76, 0x68, 0x68, 0x8d, 0x46, 0x8d, 0x68, 0x8d, + 0x76, 0x37, 0x5e, 0x28, 0xb3, 0xba, 0x83, 0xfd, + 0x6e, 0x73, 0xee, 0x15, 0x34, 0x2a, 0x23, 0x34, + 0x3b, 0x15, 0x15, 0x2b, 0x3d, 0x34, 0x15, 0x21, + 0x48, 0x4d, 0x6a, 0x62, 0x55, 0x12, 0x5f, 0x74, + 0x76, 0xb6, 0xf7, 0x46, 0x37, 0x6c, 0x28, 0x82, + 0x1f, 0x5e, 0x5e, 0x8d, 0x5e, 0xfc, 0x5f, 0x93, + 0x5e, 0x6c, 0x5e, 0x46, 0x5e, 0x68, 0x68, 0x5e, + 0x86, 0x5e, 0x9f, 0x79, 0x68, 0x9f, 0xa0, 0xa7, + 0x5e, 0x7, 0x37, 0x46, 0x46, 0xa7, 0x7e, 0x91, + 0x99, 0x34, 0xeb, 0xf2, 0x34, 0xeb, 0xf5, 0x34, + 0xeb, 0x73, 0x73, 0x23, 0x23, 0x21, 0x70, 0x31, + 0x4d, 0x4a, 0x3e, 0xa7, 0x68, 0x6c, 0xb8, 0x6c, + 0xfc, 0x68, 0x32, 0x68, 0x4e, 0x68, 0x68, 0x4e, + 0xa3, 0x4e, 0x6c, 0x5e, 0xa3, 0x4e, 0x5e, 0x9e, + 0x5e, 0x86, 0x68, 0xa3, 0xa3, 0x4e, 0x5e, 0x6c, + 0xa3, 0xa3, 0x9f, 0x7, 0xa2, 0xa3, 0x7d, 0x26, + 0xfe, 0x1a, 0x93, 0xa3, 0x4e, 0xa3, 0x4e, 0xa3, + 0x4e, 0x4e, 0x4e, 0x4e, 0x8d, 0x98, 0x98, 0x98, + 0x8d, 0x22, 0x22, 0x17, 0xd7, 0x16, 0xff, 0x16, + 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, 0xff, 0x14, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0x4e, 0x0, 0x0, 0xa3, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, + 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x2a, 0x3f, 0x48, 0x6f, 0x97, 0x39, 0x39, 0x39, + 0x99, 0x7f, 0x73, 0x2a, 0x48, 0x23, 0x39, 0x41, + 0x35, 0x1b, 0x27, 0x1f, 0x5e, 0x8d, 0xa7, 0xe, + 0xe, 0x76, 0xa9, 0xba, 0x2c, 0x1b, 0x97, 0xb, + 0x41, 0x54, 0x21, 0x23, 0x99, 0x54, 0x54, 0xa, + 0xfa, 0x2a, 0x54, 0xa, 0x39, 0x1c, 0x42, 0x31, + 0xaa, 0x74, 0x2f, 0xf8, 0xe, 0x82, 0x5e, 0xb8, + 0xf7, 0x46, 0x68, 0x6c, 0x32, 0x82, 0xfc, 0x37, + 0x5e, 0x5e, 0x68, 0xdd, 0x3e, 0xb3, 0xbc, 0xbf, + 0xc9, 0x67, 0xfe, 0x90, 0x85, 0x6f, 0x4d, 0x31, + 0x63, 0x90, 0x99, 0x54, 0x23, 0x2a, 0xcb, 0xe3, + 0xf8, 0x2f, 0x30, 0x1e, 0x76, 0x5e, 0x68, 0x1f, + 0xe, 0x6c, 0x68, 0x9f, 0xf7, 0xe, 0x79, 0xa3, + 0x68, 0x68, 0x68, 0x1f, 0x68, 0xa3, 0x68, 0x68, + 0xfc, 0xfc, 0x5e, 0x86, 0x6c, 0x9f, 0xfc, 0x86, + 0x5e, 0x4e, 0x5e, 0x1f, 0x1e, 0x5e, 0x9f, 0x5e, + 0x7, 0xf3, 0x6c, 0x5e, 0xa7, 0xf3, 0x11, 0x1b, + 0x8a, 0xe6, 0xeb, 0x15, 0x15, 0xfa, 0xd8, 0x15, + 0xeb, 0xeb, 0x15, 0x3d, 0x34, 0x73, 0xfa, 0x1d, + 0x36, 0x40, 0xc, 0xa7, 0x2c, 0x50, 0xf8, 0x1e, + 0x6c, 0xf7, 0xe, 0x37, 0x68, 0x9f, 0x5e, 0x5e, + 0x37, 0x5e, 0x5e, 0x9e, 0x5e, 0xdd, 0xf7, 0x32, + 0x68, 0x9f, 0x68, 0x5e, 0x79, 0xa3, 0x4e, 0x86, + 0x68, 0xfc, 0x9f, 0x5e, 0xa3, 0x7, 0xf7, 0x28, + 0x68, 0x6c, 0x28, 0x76, 0x1e, 0xa7, 0xb3, 0xb0, + 0x99, 0x73, 0xf2, 0x3d, 0x15, 0x34, 0x34, 0x15, + 0xeb, 0x73, 0x54, 0x54, 0x39, 0x23, 0x23, 0x99, + 0xa6, 0x2f, 0x50, 0xf7, 0x9f, 0x5e, 0x5e, 0x32, + 0x68, 0x68, 0x86, 0x5e, 0xa3, 0x68, 0x28, 0x9f, + 0xa3, 0x86, 0x6c, 0x5e, 0x68, 0x9e, 0xa3, 0xa3, + 0x4e, 0x75, 0x4e, 0x68, 0x4e, 0x5e, 0x6c, 0x7, + 0x9f, 0x86, 0x5e, 0xa3, 0x68, 0x9f, 0x93, 0x7d, + 0xa, 0x1c, 0x7d, 0xa3, 0xa3, 0xa3, 0xa3, 0x9f, + 0xa3, 0x8d, 0x98, 0x98, 0x98, 0x98, 0x8d, 0x8d, + 0x8d, 0x22, 0x14, 0x16, 0x16, 0x16, 0x16, 0xff, + 0xff, 0x14, 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4e, 0xa3, 0x0, 0x0, 0x4e, 0xa3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x26, 0x42, 0x67, 0x99, 0xb4, 0x54, 0x54, 0x34, + 0x2a, 0x34, 0x34, 0xa, 0xf1, 0x39, 0x99, 0x40, + 0x2c, 0x27, 0x27, 0xa0, 0x28, 0x28, 0xa0, 0x2c, + 0x76, 0xa7, 0x5f, 0x37, 0x2c, 0x27, 0x4a, 0xa1, + 0xaf, 0x7f, 0x48, 0x73, 0x54, 0x70, 0x48, 0x54, + 0x2a, 0x34, 0x54, 0x7f, 0x48, 0x1d, 0x4d, 0x20, + 0x50, 0x5f, 0x5f, 0xf8, 0xf3, 0xa7, 0x82, 0x5e, + 0x28, 0x8d, 0x8d, 0x86, 0x5e, 0x82, 0x1f, 0xa7, + 0xb8, 0xa7, 0x6c, 0xa0, 0x50, 0x3e, 0xe5, 0x7f, + 0xf9, 0x9, 0xf9, 0x90, 0x83, 0x71, 0x6f, 0x99, + 0x26, 0x99, 0x99, 0x26, 0x39, 0x54, 0x23, 0x40, + 0x60, 0x74, 0x37, 0x82, 0x82, 0xa7, 0x68, 0x5e, + 0x2c, 0x2c, 0x28, 0x82, 0x8d, 0x46, 0x5e, 0x5e, + 0x79, 0x5e, 0xa3, 0x68, 0x8d, 0x9f, 0x5e, 0x68, + 0xa7, 0xa7, 0x9f, 0x5e, 0x79, 0x68, 0x68, 0x8d, + 0x79, 0x32, 0x9f, 0x82, 0x74, 0xb7, 0x8, 0x5e, + 0x5f, 0x37, 0x76, 0x9c, 0x5f, 0x5f, 0xa6, 0x5a, + 0xfa, 0xeb, 0xf2, 0xf2, 0x15, 0xeb, 0xa, 0x2b, + 0x21, 0xfa, 0x15, 0x3d, 0x15, 0xeb, 0xe1, 0x15, + 0xfa, 0xcb, 0xb, 0x60, 0x55, 0x2c, 0x27, 0x27, + 0x46, 0x28, 0x8d, 0x98, 0x82, 0x28, 0x43, 0x7d, + 0x82, 0x7, 0xa0, 0x46, 0x8d, 0x9f, 0x76, 0x93, + 0x82, 0x4e, 0x79, 0x98, 0x68, 0x68, 0x28, 0x8d, + 0x5e, 0x68, 0x1e, 0x76, 0x5e, 0x68, 0x8d, 0x98, + 0x8d, 0x37, 0x89, 0x8f, 0x74, 0xaa, 0xb4, 0xa, + 0x73, 0x73, 0x34, 0xfa, 0x1d, 0x36, 0x7f, 0x70, + 0x3b, 0x2b, 0x15, 0x3d, 0x3d, 0x15, 0xa, 0x9, + 0x41, 0x55, 0x7e, 0x7d, 0x6c, 0x5e, 0x8d, 0x76, + 0x5e, 0x68, 0x8f, 0xa7, 0x86, 0x68, 0x8b, 0x28, + 0x86, 0x5e, 0x98, 0x79, 0xa3, 0x68, 0x8b, 0x68, + 0xa3, 0x79, 0x8f, 0xab, 0x9f, 0x8b, 0x8b, 0x9f, + 0x5e, 0x93, 0x98, 0x9e, 0x5e, 0x98, 0x42, 0x34, + 0xf2, 0x34, 0x8f, 0x9c, 0x9f, 0x79, 0x98, 0x4e, + 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, 0x3f, 0x14, + 0x14, 0x14, 0x16, 0x16, 0x14, 0x15, 0x17, 0x16, + 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x16, 0x68, 0xa3, 0x0, 0xa3, 0xa3, 0x4e, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7f, 0x42, 0x54, 0xa, 0x54, 0x48, 0x36, 0x7f, + 0x48, 0x1d, 0x42, 0x48, 0x2b, 0x3f, 0x48, 0x54, + 0x41, 0x6a, 0x7e, 0xba, 0xc, 0x93, 0x62, 0x82, + 0x37, 0x93, 0x7e, 0x9c, 0x74, 0x91, 0xb0, 0x6e, + 0x54, 0x73, 0x54, 0x54, 0x39, 0x36, 0x4d, 0x58, + 0x67, 0x48, 0x70, 0x34, 0x34, 0x2a, 0x6e, 0xf9, + 0x5a, 0x83, 0x74, 0x5f, 0x9c, 0x62, 0x62, 0x82, + 0x98, 0x8f, 0x8d, 0x82, 0x9c, 0x8f, 0x7d, 0xa0, + 0xc8, 0x55, 0x76, 0x9c, 0x74, 0x6a, 0x58, 0x20, + 0x99, 0x54, 0x48, 0x7f, 0x7f, 0x99, 0x90, 0x85, + 0x99, 0x26, 0x31, 0x58, 0x99, 0x99, 0x7f, 0x4d, + 0x83, 0x7e, 0x82, 0x76, 0xb3, 0x60, 0x8d, 0x8d, + 0x62, 0x8f, 0x30, 0x46, 0x8f, 0x98, 0x8d, 0x8d, + 0x62, 0x82, 0x68, 0x79, 0x7d, 0x5f, 0x37, 0x8d, + 0x8b, 0x43, 0x79, 0x46, 0x8f, 0x93, 0x68, 0x8d, + 0x8f, 0xa8, 0xa7, 0x93, 0x8f, 0xaa, 0x30, 0x74, + 0x8f, 0x93, 0x76, 0x74, 0x7e, 0xa6, 0xbf, 0xa, + 0x73, 0xeb, 0xf2, 0xf2, 0x34, 0xeb, 0xfa, 0x1d, + 0x36, 0x70, 0x73, 0x2b, 0x21, 0x3b, 0xf2, 0x3d, + 0x34, 0x1d, 0x7f, 0x5d, 0x7e, 0x5f, 0x30, 0x4a, + 0x55, 0x37, 0x76, 0x8f, 0x62, 0xe, 0xaa, 0x8f, + 0x98, 0x76, 0x24, 0x62, 0x98, 0x32, 0x8d, 0x62, + 0x62, 0x37, 0x82, 0x8f, 0x79, 0x68, 0xe, 0x8b, + 0x8d, 0x68, 0x8d, 0x30, 0x46, 0x68, 0x82, 0x8b, + 0x8d, 0x2f, 0xaa, 0xaa, 0x9c, 0xaa, 0xb4, 0x73, + 0x73, 0x48, 0x73, 0xfa, 0x1d, 0x66, 0x7f, 0x73, + 0x73, 0xfa, 0x34, 0x15, 0x15, 0x3b, 0x15, 0x15, + 0x99, 0x6a, 0x7e, 0x93, 0x28, 0x1f, 0x93, 0x28, + 0x9e, 0x5e, 0x9c, 0x28, 0xa3, 0x68, 0x8d, 0x8d, + 0xfc, 0x8d, 0x98, 0x68, 0x4e, 0x68, 0x68, 0x68, + 0xa3, 0x68, 0x98, 0x68, 0x68, 0x68, 0x98, 0x68, + 0xa3, 0x93, 0x8b, 0xa3, 0x4e, 0x9c, 0x73, 0x34, + 0x34, 0x1d, 0x8b, 0x93, 0xa3, 0x98, 0xa3, 0xa3, + 0x79, 0x98, 0x98, 0x93, 0xb5, 0x16, 0x16, 0x16, + 0x16, 0x3d, 0x8d, 0x0, 0x0, 0x79, 0x82, 0xa, + 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x16, 0xa2, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x73, 0x73, 0x70, 0xfa, 0x23, 0x4d, 0x85, 0x63, + 0x63, 0x31, 0x36, 0x7f, 0x34, 0xf2, 0x15, 0x34, + 0x54, 0x83, 0x7e, 0x55, 0x27, 0x62, 0x62, 0x82, + 0x8d, 0x62, 0x55, 0x60, 0xa6, 0xb0, 0x97, 0x6e, + 0x1, 0x2a, 0x99, 0x63, 0x36, 0x36, 0x59, 0x85, + 0x9a, 0x99, 0x48, 0x34, 0x15, 0x34, 0x2a, 0x39, + 0x7f, 0x90, 0x7e, 0x76, 0x7d, 0x62, 0x7e, 0x82, + 0x9c, 0x8b, 0x93, 0xe, 0x2c, 0x74, 0x93, 0x5e, + 0x46, 0x55, 0x46, 0x82, 0x74, 0x6a, 0x90, 0xfd, + 0x54, 0xa, 0x99, 0x26, 0x39, 0x99, 0x85, 0x6b, + 0x6f, 0x4d, 0x31, 0x63, 0x90, 0x7f, 0x26, 0x3a, + 0x6f, 0xa6, 0x37, 0x76, 0x55, 0x62, 0x28, 0x5e, + 0x98, 0x46, 0x30, 0x62, 0x8b, 0x76, 0x6c, 0x37, + 0x30, 0x5f, 0x68, 0x86, 0x8d, 0x8d, 0x37, 0x8d, + 0x79, 0x79, 0x5e, 0x1f, 0x8b, 0x37, 0x6c, 0x8d, + 0x5f, 0x2f, 0x82, 0x8d, 0x93, 0x8d, 0x1f, 0x98, + 0x98, 0x6c, 0x28, 0x5f, 0x2c, 0xcc, 0xbf, 0x3, + 0xfa, 0xf5, 0x3d, 0x3d, 0x34, 0xeb, 0xf2, 0x34, + 0x48, 0x73, 0x73, 0x1, 0x34, 0x15, 0x15, 0x15, + 0x2e, 0x31, 0x20, 0x6a, 0x9c, 0x28, 0x28, 0x30, + 0x46, 0x6c, 0x7, 0x9c, 0x76, 0x37, 0x37, 0x8d, + 0x68, 0x68, 0x68, 0x1f, 0x5e, 0x68, 0x5e, 0x76, + 0x5e, 0x68, 0x5e, 0x76, 0x68, 0xa3, 0x5e, 0x8d, + 0x68, 0xa3, 0x68, 0x37, 0x5e, 0x5e, 0x5e, 0x37, + 0x5e, 0x37, 0xe, 0xb7, 0x76, 0xa7, 0x83, 0x54, + 0x34, 0x34, 0x1, 0x3d, 0x34, 0xeb, 0xeb, 0xeb, + 0xeb, 0x23, 0x2b, 0x3f, 0x23, 0x42, 0x1d, 0x48, + 0x39, 0x60, 0x76, 0x6c, 0x6c, 0x5e, 0x5e, 0x7, + 0x9f, 0x9e, 0x5e, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, + 0xa3, 0xa3, 0x68, 0xa3, 0x68, 0xa3, 0x5e, 0x9e, + 0x0, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0xa3, 0x9f, 0xb8, 0x9f, 0x9c, 0xfe, + 0x23, 0x98, 0x93, 0xa3, 0xa3, 0x4e, 0xa3, 0x0, + 0xa3, 0x93, 0x98, 0x7d, 0xf2, 0x3d, 0x22, 0x22, + 0x3b, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0xcb, 0x16, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x2a, 0x42, 0x4d, 0x7f, 0x21, 0x80, 0x63, 0x99, + 0x99, 0x36, 0x26, 0x54, 0xea, 0x7f, 0x42, 0x39, + 0x26, 0x6a, 0x74, 0xa7, 0x28, 0x1f, 0x8d, 0x5e, + 0x9f, 0x28, 0x82, 0xa0, 0xba, 0x60, 0x6a, 0x99, + 0x54, 0x1d, 0x59, 0x90, 0xf1, 0x48, 0x26, 0x6e, + 0xe6, 0xa, 0x6e, 0x54, 0x2a, 0x23, 0x31, 0x20, + 0x3a, 0x4a, 0x5f, 0x28, 0x6c, 0x37, 0x37, 0x28, + 0x7, 0x37, 0x5e, 0x5e, 0x28, 0x5e, 0x5e, 0x5e, + 0x5e, 0x76, 0x5e, 0x9f, 0xb7, 0x50, 0xbf, 0x5a, + 0x6e, 0xf9, 0x63, 0x4a, 0x58, 0x58, 0x58, 0x83, + 0x90, 0x6e, 0x7f, 0x7f, 0xa, 0xa, 0xfd, 0x1b, + 0x12, 0x5f, 0x9f, 0x68, 0x68, 0x9f, 0x5e, 0xa3, + 0x68, 0x7, 0x6c, 0x5e, 0x28, 0x8, 0x5e, 0x68, + 0x68, 0x68, 0xa3, 0x68, 0x68, 0x86, 0x5e, 0x4e, + 0x68, 0x9f, 0x7, 0xa3, 0x68, 0x7, 0x68, 0xa3, + 0x68, 0x86, 0x5e, 0x9e, 0x5e, 0xa3, 0x9f, 0x9f, + 0x6c, 0x7, 0xbd, 0x8, 0x28, 0xf3, 0xcc, 0xb, + 0xf9, 0x2a, 0x15, 0x21, 0x2b, 0x3d, 0x15, 0xf2, + 0x15, 0xeb, 0xee, 0x34, 0x54, 0x34, 0xfa, 0x1d, + 0x31, 0x1b, 0x3e, 0x60, 0xa7, 0xf7, 0xa0, 0x7, + 0x9f, 0x5e, 0x6c, 0x28, 0x5e, 0x68, 0x5e, 0x5e, + 0x68, 0xa3, 0x5e, 0x9e, 0x5e, 0xa3, 0x8, 0x7, + 0x9e, 0x5e, 0x9e, 0x5e, 0x68, 0x68, 0x68, 0x9f, + 0x5e, 0x68, 0x68, 0x7, 0x9f, 0xa3, 0x7, 0xa7, + 0x5e, 0xa3, 0x28, 0x37, 0x8, 0xf7, 0x50, 0x6e, + 0xa, 0x34, 0x15, 0xf2, 0x34, 0x3f, 0xfa, 0x3d, + 0x34, 0x48, 0x54, 0xfa, 0x23, 0xfe, 0x39, 0x54, + 0x99, 0x3e, 0x2f, 0xa0, 0x6c, 0x68, 0x68, 0x5e, + 0xa3, 0xa3, 0x4e, 0x68, 0xa3, 0xa3, 0x68, 0xa3, + 0xa3, 0x4e, 0x68, 0xa3, 0xa3, 0x4e, 0x68, 0xa3, + 0xa3, 0x68, 0x68, 0xa3, 0xa3, 0xa3, 0x68, 0x9f, + 0x7, 0x9f, 0xa3, 0xa3, 0x9f, 0xa3, 0x93, 0x98, + 0x23, 0x1a, 0x93, 0x98, 0xa3, 0x93, 0x98, 0x82, + 0x93, 0x93, 0x93, 0x1d, 0x16, 0x3b, 0x8d, 0x0, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x9f, 0x14, 0xff, + 0xff, 0x14, 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0xa3, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x26, 0x31, 0x31, 0x7f, 0x54, 0x39, 0x39, 0x48, + 0x54, 0x99, 0x63, 0x6e, 0xea, 0x67, 0x58, 0x5d, + 0x4a, 0x11, 0x12, 0x8, 0x7, 0x8, 0xa7, 0x6c, + 0xf7, 0x5e, 0x82, 0x5e, 0xe, 0x60, 0x6a, 0x83, + 0x54, 0x54, 0x23, 0x39, 0x73, 0x48, 0x36, 0x54, + 0x2a, 0x7f, 0x9a, 0x80, 0x6e, 0x48, 0x4d, 0x40, + 0x50, 0x50, 0x55, 0xe, 0xe, 0xa8, 0x76, 0x5e, + 0x28, 0x5f, 0x8d, 0x68, 0x82, 0x76, 0x37, 0x6c, + 0x6c, 0xb7, 0xa7, 0x8, 0xf0, 0xb, 0xa1, 0x97, + 0xea, 0x54, 0x26, 0x6f, 0x5d, 0x90, 0x3a, 0x26, + 0x26, 0x9, 0x7f, 0x99, 0x39, 0x54, 0x41, 0x60, + 0x62, 0x5f, 0xe, 0x37, 0x82, 0x1e, 0x7, 0xfc, + 0x12, 0xa0, 0x9f, 0x5e, 0x82, 0x1f, 0x37, 0x8d, + 0x8d, 0x8d, 0x32, 0x37, 0x8d, 0x28, 0x9f, 0x5e, + 0xfc, 0xfc, 0x9f, 0x5e, 0x98, 0x46, 0x1f, 0x98, + 0x8b, 0x82, 0x6c, 0xe, 0x30, 0x28, 0xdd, 0x37, + 0x46, 0x30, 0x1f, 0x93, 0x7d, 0xa8, 0xe5, 0xf9, + 0x39, 0x73, 0x1, 0x34, 0x3b, 0x15, 0x2b, 0x2a, + 0x1d, 0x22, 0x17, 0x3f, 0x42, 0x2a, 0xf2, 0x15, + 0xfa, 0x7f, 0x99, 0xb0, 0x6a, 0x12, 0x2f, 0x74, + 0x98, 0x1e, 0x1f, 0x62, 0x8d, 0x68, 0x5e, 0x9c, + 0x12, 0x5e, 0x86, 0x5f, 0x8d, 0xfc, 0x46, 0x98, + 0x79, 0x68, 0x82, 0x30, 0x82, 0x5e, 0x8d, 0x82, + 0xa7, 0x1e, 0x82, 0x7d, 0x8d, 0x32, 0x46, 0x7d, + 0x8d, 0x86, 0x7d, 0xaa, 0x7b, 0xa6, 0xc9, 0xa, + 0xfa, 0x34, 0x15, 0x73, 0x54, 0x1c, 0x48, 0x15, + 0x15, 0x48, 0x15, 0xf2, 0xf2, 0x15, 0x1, 0x73, + 0x6e, 0x3a, 0x6a, 0x8f, 0x68, 0x76, 0x8f, 0x8b, + 0x5e, 0x68, 0x8d, 0x5e, 0x7, 0x6c, 0x8b, 0x5e, + 0x68, 0x68, 0x8b, 0x32, 0xa3, 0x75, 0x8b, 0x68, + 0x68, 0x98, 0x8b, 0x98, 0x9f, 0x93, 0x8f, 0x68, + 0xa3, 0xa3, 0x98, 0x98, 0x93, 0x8b, 0x8b, 0x8f, + 0x3d, 0x16, 0x2e, 0x93, 0x7d, 0x93, 0x8b, 0x8b, + 0x93, 0x98, 0x98, 0x22, 0x22, 0x16, 0x79, 0x4e, + 0x4e, 0x76, 0x8d, 0x0, 0x5e, 0x8d, 0x17, 0x17, + 0x14, 0xff, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0x9f, 0x0, 0x0, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x39, 0x1c, 0x7f, 0x54, 0x70, 0x48, 0x42, 0x1d, + 0x42, 0x9a, 0x9a, 0x48, 0x70, 0x42, 0x99, 0x97, + 0x40, 0x58, 0x4a, 0xe, 0xb7, 0x5f, 0x8f, 0x38, + 0x46, 0x8f, 0x8b, 0x7d, 0x2f, 0x1b, 0x90, 0x99, + 0x70, 0x2a, 0xfa, 0x23, 0x2a, 0x7f, 0x63, 0x67, + 0x42, 0x67, 0x58, 0x66, 0x34, 0xfa, 0x23, 0x56, + 0x99, 0x97, 0x6a, 0x55, 0x62, 0x7e, 0x7d, 0x8d, + 0x46, 0x7e, 0x8b, 0x8d, 0x7d, 0xaa, 0x60, 0x46, + 0x9c, 0xaa, 0x9c, 0xe, 0x6a, 0x6a, 0x6f, 0x41, + 0x48, 0x34, 0x36, 0x63, 0x99, 0x54, 0x39, 0x1a, + 0x99, 0x99, 0x99, 0x3a, 0x26, 0xfe, 0x85, 0x81, + 0x94, 0x91, 0x60, 0x7d, 0x8f, 0xaa, 0xb7, 0x46, + 0x62, 0x7d, 0x28, 0x82, 0x8f, 0x62, 0x37, 0x98, + 0x8b, 0x93, 0xa7, 0x46, 0x8b, 0x93, 0x6c, 0x5e, + 0x62, 0x98, 0x5e, 0x98, 0x8b, 0x8b, 0x98, 0x8f, + 0x8f, 0x7d, 0xf3, 0x2c, 0x8f, 0x76, 0x6c, 0x93, + 0x8f, 0x46, 0x82, 0x8f, 0x94, 0xaa, 0xb, 0xa, + 0xa, 0xf2, 0xf2, 0xf2, 0x21, 0x3b, 0x34, 0x23, + 0x67, 0x1a, 0x2e, 0x3f, 0x48, 0x70, 0x16, 0x3d, + 0x15, 0x34, 0x54, 0x90, 0x91, 0x93, 0x7d, 0x8f, + 0x93, 0x82, 0x5e, 0x9c, 0x93, 0x5e, 0x37, 0xa8, + 0x5f, 0x5e, 0x76, 0x8b, 0x8d, 0x68, 0x79, 0x98, + 0x8d, 0x68, 0x8d, 0x74, 0xa7, 0x5e, 0x82, 0x9c, + 0x76, 0x5e, 0x8d, 0x98, 0x82, 0x68, 0x79, 0x8b, + 0x76, 0x5e, 0x9c, 0xb3, 0xbf, 0xbf, 0xcb, 0x73, + 0x1, 0x15, 0x15, 0xeb, 0x2b, 0x7f, 0x48, 0x15, + 0x34, 0x2a, 0xeb, 0x15, 0xee, 0xf2, 0x3d, 0x15, + 0x54, 0x5d, 0x81, 0x8f, 0x76, 0x79, 0x8b, 0x8b, + 0x6c, 0x6c, 0x82, 0x5e, 0x9f, 0x9f, 0x8d, 0x68, + 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x98, 0x68, + 0xa3, 0x68, 0x8b, 0x68, 0xa3, 0xa3, 0x79, 0x4e, + 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0x9c, 0x9c, 0x73, + 0x34, 0x3d, 0x8f, 0x8b, 0x8b, 0x8b, 0x98, 0x98, + 0x3f, 0x22, 0x22, 0x82, 0xf2, 0x3d, 0x3b, 0x4e, + 0x0, 0xa3, 0x68, 0x0, 0x0, 0x68, 0xff, 0x14, + 0xff, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xfa, 0xfa, 0x2a, 0x70, 0x7f, 0x63, 0x58, 0x59, + 0x59, 0x63, 0x71, 0x80, 0x48, 0x34, 0x54, 0x6e, + 0x5a, 0x90, 0x7e, 0x8f, 0x82, 0x7d, 0x8f, 0x98, + 0x8d, 0x8b, 0x8f, 0x9c, 0xa6, 0xaf, 0x6e, 0x34, + 0xfa, 0x54, 0x23, 0x23, 0x23, 0x67, 0x9a, 0x31, + 0x67, 0x23, 0x99, 0x54, 0x73, 0x34, 0x34, 0x2a, + 0x5a, 0x6a, 0x94, 0x46, 0x93, 0x8f, 0x93, 0x82, + 0x76, 0x74, 0x9c, 0x76, 0x93, 0xaa, 0x46, 0x8d, + 0x82, 0x8f, 0x76, 0x76, 0x74, 0xaa, 0xb0, 0x99, + 0x48, 0x73, 0x73, 0x54, 0x23, 0x7f, 0x67, 0x80, + 0x48, 0xfe, 0x31, 0x85, 0x85, 0x63, 0x99, 0x90, + 0x6a, 0xaa, 0xf3, 0x28, 0x93, 0x62, 0x5e, 0x8d, + 0x8d, 0x8d, 0x5e, 0x5e, 0x8d, 0x82, 0x6c, 0x76, + 0x93, 0x82, 0x6c, 0x5e, 0x8d, 0x8d, 0x68, 0x68, + 0x8d, 0x8d, 0x5e, 0x37, 0x98, 0x8d, 0x8, 0xa8, + 0x62, 0x82, 0x6c, 0x5e, 0x8d, 0x5e, 0x5e, 0x8d, + 0x8d, 0x8d, 0x6c, 0xa8, 0xaa, 0xc, 0xbf, 0xd0, + 0xa, 0x15, 0x15, 0x3b, 0x3b, 0x3d, 0x21, 0x48, + 0xf9, 0x54, 0x73, 0xfa, 0x34, 0xfa, 0x34, 0x34, + 0x2b, 0x21, 0x42, 0x6a, 0x74, 0x28, 0x6c, 0xa7, + 0xa7, 0x9f, 0x5e, 0xa0, 0x8, 0x28, 0x5e, 0x28, + 0x68, 0x5e, 0x68, 0x82, 0x28, 0x68, 0x68, 0x6c, + 0x6c, 0x86, 0x5e, 0x28, 0x6c, 0x5e, 0x5e, 0x5e, + 0x5e, 0x68, 0x68, 0x5e, 0x5e, 0x68, 0x68, 0x6c, + 0x7, 0x28, 0x6c, 0xa0, 0xf3, 0xf8, 0x5a, 0xfa, + 0x34, 0xeb, 0xf2, 0xf2, 0x15, 0xee, 0x34, 0x73, + 0xeb, 0xfa, 0xfa, 0xfa, 0xfa, 0x73, 0x15, 0x2b, + 0x48, 0x6f, 0x74, 0x93, 0x28, 0x6c, 0x82, 0x68, + 0x6c, 0x9f, 0x68, 0x5e, 0xa3, 0xa3, 0xa3, 0x68, + 0xa3, 0x5e, 0x86, 0x4e, 0xa3, 0x9f, 0x68, 0x68, + 0x4e, 0xa3, 0x68, 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, + 0x4e, 0x9f, 0xa3, 0xa3, 0xa3, 0xd3, 0x23, 0x23, + 0x48, 0x8b, 0x8b, 0x2e, 0x21, 0x93, 0x7d, 0xf2, + 0x3d, 0x16, 0x16, 0x16, 0xd7, 0xe6, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa3, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x6e, 0x7f, 0x2a, 0x48, 0x42, 0x63, 0x9a, 0x63, + 0x99, 0x7f, 0x99, 0x99, 0x6e, 0x54, 0x26, 0xfe, + 0x4a, 0x5f, 0x82, 0x9f, 0x5e, 0x1e, 0x76, 0x68, + 0x9f, 0xb8, 0xe, 0x6c, 0xdd, 0xcc, 0xe5, 0x5a, + 0xfa, 0x39, 0x54, 0x48, 0x21, 0x48, 0x39, 0x7f, + 0x6e, 0xa, 0x39, 0x54, 0x34, 0x48, 0x7f, 0x42, + 0x4d, 0x6a, 0xa0, 0x5e, 0x6c, 0xc, 0xf3, 0x28, + 0x68, 0xa7, 0x6c, 0xfc, 0xe, 0x37, 0x86, 0x5e, + 0x68, 0xe, 0x6c, 0x68, 0x8, 0x50, 0x3, 0xcb, + 0xcb, 0x7f, 0x5a, 0xfd, 0x36, 0x3c, 0x90, 0x97, + 0x6e, 0x54, 0xf1, 0xcb, 0x54, 0x9, 0x5a, 0xec, + 0x27, 0x37, 0x5e, 0x5e, 0xfc, 0x1f, 0x68, 0xa3, + 0x9e, 0x9f, 0xf3, 0xa0, 0x6c, 0x5e, 0x7, 0x28, + 0xfc, 0x5e, 0x86, 0x68, 0x68, 0x68, 0x68, 0x68, + 0x5e, 0xa3, 0x7, 0xf3, 0x37, 0x86, 0x5e, 0x6c, + 0x1f, 0x1f, 0x68, 0x68, 0x68, 0x9f, 0x1e, 0x7, + 0x9f, 0x5e, 0xb6, 0xdd, 0x2f, 0xa0, 0xcd, 0xbf, + 0x5a, 0x23, 0x21, 0x34, 0x70, 0xf2, 0x3b, 0xeb, + 0xeb, 0x2b, 0x34, 0x2a, 0xfa, 0x23, 0x23, 0x23, + 0x48, 0x1c, 0x36, 0x20, 0xa6, 0x28, 0x7, 0xba, + 0xf8, 0x5e, 0x5e, 0x28, 0x5e, 0x1f, 0x28, 0x5e, + 0x5e, 0x9e, 0x28, 0x2f, 0x28, 0x5e, 0xa3, 0xb6, + 0x8, 0x68, 0xa3, 0x68, 0x9f, 0x5e, 0x37, 0x8d, + 0x68, 0x68, 0x68, 0x37, 0xa0, 0x9f, 0x5e, 0x89, + 0x6c, 0xc, 0x8d, 0xa7, 0x28, 0xa0, 0x41, 0x54, + 0x34, 0x15, 0x15, 0x15, 0xf2, 0x15, 0xee, 0x15, + 0xeb, 0x15, 0x15, 0x1d, 0x54, 0xd8, 0x15, 0x15, + 0xeb, 0x5a, 0x6a, 0x94, 0x74, 0x74, 0x8b, 0x76, + 0x68, 0x68, 0x5e, 0x86, 0x68, 0xa3, 0x68, 0xa3, + 0x9f, 0xa3, 0x68, 0x68, 0xa3, 0xa3, 0x79, 0x68, + 0x4e, 0x4e, 0xa3, 0x68, 0xa3, 0xa3, 0xa3, 0xa3, + 0xa3, 0x9f, 0xa3, 0x4e, 0x9e, 0x5e, 0x98, 0x34, + 0x1d, 0x1d, 0x3f, 0x22, 0x16, 0x16, 0x3d, 0xf2, + 0x3d, 0x16, 0x3d, 0x3b, 0x8d, 0x79, 0x68, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0xa3, 0xff, 0x14, + 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x19, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x20, 0x66, 0x80, 0x36, 0x42, 0x26, 0x7f, 0x26, + 0x99, 0x48, 0x54, 0x54, 0x99, 0x99, 0x31, 0x3a, + 0x27, 0x1e, 0x37, 0x32, 0xe, 0x2c, 0xa7, 0x68, + 0x5e, 0xe, 0x2f, 0x76, 0xa7, 0xa8, 0xa6, 0x20, + 0x23, 0x23, 0x54, 0x34, 0xfa, 0x2a, 0xfa, 0xeb, + 0x9, 0x23, 0x23, 0x39, 0x48, 0x7f, 0x99, 0x20, + 0x4a, 0x11, 0xa6, 0x8, 0x76, 0x2c, 0x60, 0x82, + 0x5e, 0x82, 0x1f, 0x46, 0x46, 0x93, 0x82, 0x9f, + 0x37, 0x55, 0xba, 0xa0, 0xa7, 0x9b, 0xb, 0x6e, + 0x54, 0x99, 0x80, 0x26, 0x42, 0x26, 0x99, 0x3, + 0x7f, 0x54, 0x2a, 0x2a, 0x39, 0x99, 0x20, 0x20, + 0x4a, 0x46, 0x6c, 0x5e, 0x82, 0x7d, 0x8, 0x7, + 0x82, 0x82, 0x28, 0xe, 0x93, 0x8d, 0x68, 0x5e, + 0x98, 0x8d, 0x68, 0x5e, 0x8d, 0x8d, 0x5e, 0x6c, + 0x98, 0x8d, 0x28, 0x93, 0x98, 0x79, 0x9f, 0x82, + 0x93, 0x46, 0x5e, 0x37, 0x82, 0x68, 0x28, 0xa7, + 0x9c, 0x68, 0x5e, 0x9c, 0x8f, 0x9c, 0xa8, 0xb4, + 0xd8, 0x34, 0x15, 0x1, 0x73, 0x2a, 0x48, 0x48, + 0x21, 0x21, 0x1d, 0x21, 0x15, 0x15, 0x34, 0x73, + 0xeb, 0x48, 0x7f, 0x99, 0x97, 0x55, 0xa7, 0x74, + 0x8f, 0x5e, 0x82, 0x93, 0x93, 0x5e, 0x8d, 0x9c, + 0xa8, 0x7, 0x8d, 0x8f, 0x5f, 0x5e, 0x8d, 0x98, + 0x8d, 0x68, 0x8d, 0x93, 0x1e, 0x32, 0x82, 0x8b, + 0xa7, 0x6c, 0x82, 0x98, 0x8d, 0x5e, 0x93, 0x8b, + 0x82, 0x82, 0x62, 0x8f, 0xb3, 0xbf, 0xc9, 0x54, + 0xd8, 0x34, 0x34, 0x48, 0x42, 0x3f, 0x22, 0x22, + 0x2b, 0xf2, 0xee, 0x3d, 0x15, 0xf2, 0xee, 0xeb, + 0x2b, 0x54, 0x99, 0x95, 0x94, 0x94, 0x94, 0x8f, + 0x76, 0x76, 0x8b, 0x93, 0x5e, 0x7, 0x98, 0x68, + 0x4e, 0x68, 0x98, 0x68, 0x4e, 0x68, 0x8f, 0x68, + 0xa3, 0x5c, 0x8b, 0x68, 0xa3, 0x68, 0x98, 0xa3, + 0xa3, 0xa3, 0x98, 0xa3, 0xa3, 0x98, 0x74, 0x3d, + 0x3d, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3d, + 0x76, 0x82, 0x79, 0x4e, 0x0, 0x8d, 0x79, 0x0, + 0x0, 0x8d, 0x8d, 0x0, 0x68, 0x68, 0xff, 0x18, + 0x3d, 0x16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0xa3, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x19, 0x19, 0x19, 0xff, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x99, 0x70, 0x99, 0x7f, 0x54, 0x54, 0x39, 0x59, + 0x31, 0x4d, 0x48, 0x70, 0x48, 0x2a, 0x23, 0x1b, + 0x60, 0xaa, 0xaa, 0x76, 0x37, 0x8f, 0x74, 0x98, + 0x82, 0x8f, 0x8f, 0x93, 0x9c, 0xb0, 0xb4, 0x6e, + 0x54, 0x73, 0x34, 0x39, 0x7f, 0x7f, 0x48, 0x42, + 0x1a, 0x39, 0x34, 0x34, 0x73, 0xfa, 0x73, 0x99, + 0x6f, 0x6f, 0x83, 0x5f, 0x5f, 0x94, 0x94, 0x82, + 0x93, 0x62, 0x93, 0x8d, 0x93, 0x62, 0xaa, 0xa7, + 0x8b, 0x74, 0xaa, 0xe, 0x7e, 0x6a, 0x83, 0x7f, + 0x73, 0x2a, 0x54, 0xfa, 0x23, 0x39, 0x54, 0x54, + 0x26, 0x66, 0x99, 0x67, 0x36, 0x31, 0x5d, 0x6a, + 0x6a, 0x7e, 0x5f, 0xa8, 0x74, 0x8f, 0xa7, 0xf7, + 0x62, 0x98, 0x5e, 0x8d, 0x8f, 0x98, 0x5e, 0x82, + 0x8f, 0x8b, 0x5e, 0xae, 0x8f, 0x98, 0x8d, 0x8d, + 0x62, 0x62, 0x8d, 0x98, 0x8f, 0x93, 0xfc, 0x9c, + 0xaa, 0x93, 0x6c, 0xa8, 0x74, 0x8d, 0x68, 0x82, + 0x8b, 0x46, 0x76, 0x93, 0x74, 0x9c, 0x50, 0x5a, + 0x73, 0xeb, 0x15, 0x15, 0xeb, 0x1d, 0x63, 0x80, + 0x42, 0x36, 0x1d, 0x34, 0x34, 0x3d, 0xf2, 0xf2, + 0x3d, 0x34, 0x42, 0x63, 0x31, 0x4a, 0x7e, 0x7e, + 0x7d, 0x5e, 0x37, 0x62, 0x8b, 0x28, 0x82, 0x74, + 0x2c, 0xe, 0x82, 0x98, 0x8d, 0x5e, 0x1f, 0x8d, + 0x8d, 0x4e, 0x68, 0x5f, 0xa8, 0x7, 0x82, 0x98, + 0x46, 0x1f, 0x82, 0x93, 0x8d, 0x5e, 0x46, 0x8f, + 0x76, 0x6c, 0x9c, 0xaa, 0xb, 0xb4, 0xa, 0x73, + 0xeb, 0x15, 0x3f, 0x7f, 0x80, 0x99, 0x1d, 0x21, + 0x3f, 0x15, 0x3d, 0x15, 0xf2, 0x16, 0x16, 0x3d, + 0x15, 0x34, 0x48, 0x71, 0x81, 0x91, 0x91, 0x7e, + 0x74, 0x7, 0xab, 0x79, 0x9e, 0x5e, 0x86, 0x68, + 0x4e, 0x4e, 0x68, 0x68, 0x68, 0x4e, 0x5e, 0x68, + 0xa3, 0x6c, 0x9f, 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, + 0x4e, 0x4e, 0xa3, 0xa3, 0xa3, 0x7d, 0xf2, 0xf2, + 0x3d, 0x3d, 0x14, 0x14, 0x16, 0x16, 0x16, 0x16, + 0x82, 0x4e, 0x4e, 0x4e, 0x0, 0x8d, 0x0, 0x4e, + 0x0, 0x0, 0x8d, 0x0, 0x0, 0x68, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x73, 0x34, 0x54, 0x67, 0x9a, 0x26, 0x36, 0x31, + 0x31, 0x85, 0x99, 0x36, 0x70, 0x34, 0x34, 0x41, + 0x60, 0x60, 0x55, 0x46, 0x8d, 0x8f, 0x8f, 0x62, + 0x93, 0x8f, 0x8f, 0x7d, 0xa8, 0xaf, 0x6e, 0x54, + 0x54, 0x73, 0xfa, 0x48, 0x63, 0x85, 0x63, 0x36, + 0x42, 0x48, 0x34, 0xf2, 0xee, 0x15, 0x1, 0x7f, + 0x5d, 0x91, 0x55, 0x12, 0x62, 0x8f, 0x7d, 0x76, + 0x46, 0x55, 0xa8, 0xa0, 0x76, 0x93, 0x62, 0x46, + 0x8d, 0x8b, 0x98, 0xe, 0x6a, 0x6a, 0xb0, 0x9, + 0x7f, 0x54, 0x2a, 0x2a, 0x23, 0x67, 0x48, 0x48, + 0x99, 0x71, 0x85, 0x90, 0x4d, 0x4d, 0x83, 0x50, + 0x60, 0x55, 0x27, 0x2c, 0x9c, 0x93, 0x5e, 0x37, + 0x30, 0x8d, 0x68, 0x5e, 0x76, 0x38, 0x37, 0xa7, + 0x76, 0x8d, 0x6c, 0x30, 0x98, 0x8d, 0x68, 0x68, + 0x30, 0x98, 0x5e, 0x76, 0xa7, 0x1f, 0x12, 0x2c, + 0xa8, 0x82, 0x68, 0xfc, 0x46, 0x5e, 0x68, 0x68, + 0x8d, 0x1f, 0x82, 0xa7, 0xb7, 0xb7, 0xa1, 0x5a, + 0xa, 0x2a, 0x23, 0xfa, 0x34, 0x23, 0x9a, 0x99, + 0x54, 0x34, 0x21, 0x34, 0x73, 0xeb, 0x2b, 0x15, + 0xf2, 0x3b, 0x42, 0x58, 0x99, 0x58, 0x2f, 0x9c, + 0xa9, 0x7, 0x37, 0x46, 0xa7, 0x6c, 0x5e, 0x37, + 0x1f, 0x28, 0x68, 0x68, 0x5e, 0x28, 0x8d, 0x68, + 0x9f, 0x7, 0x9f, 0x37, 0x28, 0x6c, 0x68, 0x8d, + 0x5e, 0x37, 0x8d, 0x68, 0x5e, 0x9f, 0x68, 0x8d, + 0x6c, 0xb8, 0xa0, 0x9c, 0x60, 0x40, 0x99, 0xfe, + 0x34, 0x34, 0x2b, 0x23, 0x73, 0x73, 0x34, 0x2a, + 0x34, 0xeb, 0x34, 0x22, 0x1d, 0x15, 0x3b, 0x3f, + 0x2b, 0x15, 0x3b, 0x42, 0x85, 0x99, 0xb0, 0x7e, + 0x8f, 0x76, 0x5e, 0xa3, 0xa3, 0x68, 0x4e, 0x4e, + 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x9f, 0xa3, + 0x4e, 0xa2, 0x4e, 0x68, 0x0, 0x4e, 0xa3, 0x4e, + 0x4e, 0xa3, 0xa3, 0xa3, 0x9e, 0x93, 0xf2, 0xf2, + 0x34, 0x16, 0x16, 0x14, 0x16, 0x16, 0x14, 0x16, + 0x4e, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x20, 0x1d, 0x23, 0x63, 0x63, 0x67, 0x54, 0x1a, + 0x67, 0x80, 0xa, 0x6e, 0xea, 0xf1, 0x7f, 0x11, + 0xa7, 0x1f, 0x30, 0x82, 0x86, 0x76, 0x82, 0x37, + 0x1f, 0xa7, 0xa7, 0x7, 0xfc, 0x11, 0xb, 0x97, + 0x90, 0xfe, 0x48, 0x48, 0x80, 0x99, 0xe6, 0x6e, + 0x54, 0x2a, 0x34, 0x54, 0x23, 0x23, 0x1d, 0x4d, + 0x60, 0x5f, 0xa7, 0xe, 0x37, 0x6c, 0xb8, 0xb8, + 0x6c, 0x1e, 0xa7, 0x28, 0x5e, 0x82, 0x82, 0x5e, + 0x5e, 0x5e, 0x7, 0xf7, 0x2c, 0xbc, 0xbf, 0xb4, + 0x3, 0xfe, 0x26, 0x4d, 0x63, 0x5d, 0x4d, 0x48, + 0x42, 0x67, 0x7f, 0xa, 0xf1, 0x39, 0xd4, 0xd4, + 0xf3, 0x37, 0x37, 0x8d, 0x28, 0x5e, 0x5e, 0x5e, + 0x37, 0x5e, 0x9f, 0xb6, 0xb8, 0x5e, 0x5e, 0x9f, + 0x9f, 0x86, 0x5e, 0x8d, 0x5e, 0x79, 0x86, 0x5e, + 0x6c, 0x6c, 0x68, 0xb8, 0xdd, 0x6c, 0x5e, 0x32, + 0x5e, 0x68, 0x4e, 0x68, 0x68, 0x68, 0x4e, 0x9f, + 0x7, 0x6c, 0x6c, 0x6c, 0xf7, 0x6c, 0xe, 0xe9, + 0x7f, 0xcb, 0x26, 0x2a, 0x34, 0x2a, 0x99, 0x73, + 0xeb, 0x2a, 0xeb, 0xe1, 0xeb, 0xfb, 0x39, 0x1d, + 0x3b, 0x48, 0x42, 0x80, 0x66, 0x97, 0xaa, 0x74, + 0x2c, 0xc, 0x9c, 0x8d, 0x76, 0x82, 0x5e, 0x82, + 0x5e, 0x86, 0x5e, 0x9f, 0x7, 0xb8, 0x6c, 0x5e, + 0x6c, 0x9f, 0x68, 0x79, 0x9f, 0x5e, 0x5e, 0x68, + 0x86, 0x5e, 0x5e, 0x8d, 0x6c, 0x7, 0x6c, 0x5e, + 0x5e, 0x6c, 0x76, 0x9c, 0xa8, 0x2c, 0x41, 0x7f, + 0xeb, 0xeb, 0x34, 0xeb, 0x34, 0xe1, 0x15, 0x21, + 0x34, 0xfa, 0x34, 0x42, 0x36, 0x34, 0x3b, 0x21, + 0x15, 0x16, 0x3d, 0x48, 0x42, 0x7f, 0x9a, 0x94, + 0x8f, 0x8f, 0x8f, 0x98, 0x68, 0xa3, 0x68, 0xa3, + 0xa3, 0xa3, 0x9f, 0xa3, 0x4e, 0x68, 0x4e, 0x4e, + 0x68, 0x4e, 0xa3, 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, + 0xa3, 0xa3, 0x82, 0x93, 0x93, 0x93, 0x2e, 0x42, + 0x22, 0x16, 0xff, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x76, 0x0, 0x4e, 0x4e, 0x0, 0x4e, 0xa3, 0x4e, + 0x0, 0x4e, 0x68, 0x0, 0x0, 0xa3, 0xff, 0x14, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x75, + 0x0, 0x0, 0x0, + 0x6a, 0x58, 0x9a, 0x4d, 0x67, 0xe6, 0x34, 0x48, + 0x23, 0x73, 0x70, 0x99, 0x20, 0x97, 0x20, 0xf8, + 0xfc, 0x82, 0x76, 0x6c, 0x6c, 0x37, 0xc, 0x37, + 0x5e, 0x82, 0xe, 0xa7, 0x82, 0x74, 0x60, 0x1b, + 0x3c, 0x99, 0x54, 0x73, 0x23, 0x73, 0x70, 0x2a, + 0x99, 0x39, 0x2a, 0xf9, 0x26, 0x4d, 0x99, 0x26, + 0x1b, 0x27, 0xa9, 0xb7, 0x6c, 0xa7, 0xf3, 0xf3, + 0x37, 0x93, 0x76, 0x28, 0x37, 0x82, 0x82, 0x6c, + 0x37, 0x5f, 0xc, 0xba, 0xa6, 0x9d, 0x69, 0xe6, + 0x99, 0x9a, 0x85, 0x26, 0x36, 0x31, 0x99, 0x54, + 0x2a, 0x39, 0x39, 0x2a, 0x7f, 0x99, 0xfd, 0xb, + 0x27, 0x9c, 0x76, 0x76, 0x9c, 0x2f, 0x6c, 0x28, + 0xa9, 0x9c, 0xfc, 0xe, 0x46, 0x8d, 0x5e, 0x28, + 0x46, 0x46, 0x8d, 0x98, 0x62, 0x30, 0x46, 0xa7, + 0xc, 0x76, 0x5e, 0xfc, 0x46, 0x79, 0x68, 0x5e, + 0x46, 0x1f, 0x68, 0x82, 0x9c, 0x6c, 0x5e, 0x46, + 0x74, 0x76, 0x5e, 0x5f, 0x55, 0xe, 0x5f, 0xb0, + 0x3, 0x9, 0x21, 0x73, 0x73, 0x73, 0x23, 0x23, + 0x23, 0x2a, 0x23, 0x3d, 0x16, 0x3b, 0x1d, 0x54, + 0x34, 0x34, 0x48, 0x48, 0x54, 0x99, 0x5d, 0x5d, + 0x6b, 0x7e, 0x91, 0x94, 0x94, 0x55, 0x74, 0x8f, + 0x8b, 0x7, 0x8, 0x30, 0x5f, 0x28, 0x5e, 0x8f, + 0x46, 0x1f, 0x8d, 0x98, 0x8d, 0x6c, 0x2f, 0x93, + 0x7d, 0xa7, 0x9c, 0x7e, 0x62, 0x93, 0x8f, 0x8f, + 0x8d, 0x30, 0x5f, 0x7e, 0xaa, 0xb4, 0xa, 0xe6, + 0xeb, 0xeb, 0x34, 0x54, 0x21, 0x21, 0x48, 0x67, + 0x48, 0x34, 0x15, 0xfa, 0x73, 0x34, 0xf2, 0x15, + 0xf2, 0xeb, 0x34, 0x23, 0x1c, 0x36, 0x59, 0x81, + 0x91, 0x94, 0x91, 0x8f, 0x79, 0x68, 0x8b, 0x68, + 0x68, 0x68, 0x98, 0x68, 0xa3, 0xa3, 0x8b, 0x75, + 0x0, 0x68, 0x93, 0x7d, 0xa3, 0x98, 0x98, 0xa3, + 0xa3, 0x98, 0x8f, 0x8b, 0x8b, 0x8b, 0x3f, 0x16, + 0x14, 0x16, 0xff, 0x16, 0xff, 0x16, 0x14, 0x82, + 0x8d, 0x8d, 0x8d, 0x68, 0x4e, 0x79, 0x68, 0x8d, + 0x79, 0x68, 0x79, 0x68, 0x4e, 0x4e, 0xff, 0xff, + 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, + 0x14, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x19, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x90, 0x9a, 0x7f, 0x39, 0x39, 0x48, 0x70, 0x7f, + 0x42, 0x21, 0x21, 0x67, 0x90, 0x6e, 0xfd, 0x4a, + 0x2f, 0x46, 0xaa, 0xa8, 0x1e, 0x55, 0x8f, 0x9c, + 0x8b, 0x8f, 0x6a, 0x55, 0x9c, 0x6a, 0x90, 0x7f, + 0x6e, 0x54, 0x54, 0x54, 0x39, 0x1d, 0x21, 0x7f, + 0x63, 0x99, 0x34, 0x34, 0x21, 0x23, 0x48, 0x39, + 0x36, 0x5d, 0x6a, 0xa6, 0xa6, 0x55, 0x55, 0x46, + 0x93, 0x8f, 0x8b, 0x46, 0x62, 0x8f, 0x93, 0xb7, + 0xa8, 0x27, 0x55, 0xaa, 0x7e, 0x6a, 0x99, 0x48, + 0x7f, 0x9a, 0x6e, 0x6e, 0x39, 0x7f, 0x9, 0xa, + 0x54, 0xf9, 0x42, 0x42, 0x9a, 0x6f, 0x63, 0x3a, + 0x6a, 0x74, 0x7d, 0xa7, 0x60, 0x60, 0x46, 0xa7, + 0x74, 0x8f, 0x46, 0x46, 0x8f, 0x8b, 0x9f, 0x8d, + 0x55, 0x62, 0x93, 0x8f, 0x6a, 0x55, 0x30, 0x98, + 0x62, 0x98, 0x5e, 0x46, 0x62, 0x8d, 0x68, 0x79, + 0x8f, 0x5f, 0x8d, 0x82, 0x9c, 0x5f, 0x28, 0x93, + 0x8f, 0x8d, 0x5e, 0x7d, 0x55, 0xa8, 0xa8, 0xb4, + 0x73, 0xeb, 0x15, 0xde, 0x1, 0xfa, 0x23, 0x1d, + 0x1a, 0x48, 0x7f, 0x2b, 0x3d, 0x3d, 0x34, 0x3b, + 0x3d, 0x15, 0x15, 0xfa, 0x7f, 0x85, 0x71, 0x6b, + 0x81, 0x81, 0x91, 0x94, 0x91, 0xaa, 0x9c, 0x8f, + 0x9c, 0xa7, 0x1e, 0x98, 0x82, 0x5e, 0x8d, 0x8b, + 0x8b, 0x8d, 0x82, 0x93, 0x76, 0x7, 0xa8, 0x7d, + 0x82, 0x93, 0x8f, 0x94, 0x94, 0x98, 0x8b, 0x8f, + 0x8d, 0x28, 0xaa, 0xaa, 0xb0, 0x3, 0xa, 0xd8, + 0xf2, 0x3d, 0x15, 0x23, 0x21, 0x21, 0x54, 0x7f, + 0x48, 0x15, 0x34, 0xfa, 0xe1, 0xf2, 0x15, 0x15, + 0x3d, 0x16, 0x3d, 0x48, 0x1d, 0x1d, 0x1d, 0x4d, + 0x6b, 0x91, 0x91, 0x8f, 0x5e, 0x68, 0x68, 0x68, + 0x4e, 0x68, 0x68, 0x68, 0x4e, 0x68, 0x4e, 0xa3, + 0x4e, 0x4e, 0x5e, 0x9e, 0xa3, 0x4e, 0xa3, 0x4e, + 0xa3, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0x16, 0x16, + 0x16, 0x14, 0x16, 0xff, 0x14, 0x14, 0x14, 0x79, + 0x8d, 0x8d, 0x8d, 0x0, 0x0, 0x4e, 0x68, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7f, 0x73, 0x73, 0x23, 0x1d, 0x42, 0x4d, 0x63, + 0x31, 0x36, 0x1c, 0x67, 0x99, 0xfe, 0x99, 0xb, + 0x2f, 0x7d, 0x8f, 0x5f, 0x37, 0x8b, 0x8f, 0x76, + 0x89, 0x62, 0x7e, 0xaa, 0xaa, 0x7a, 0x99, 0x54, + 0x2a, 0xfa, 0x54, 0x7f, 0x31, 0x36, 0x36, 0x67, + 0x9a, 0x67, 0x48, 0x21, 0x34, 0x2b, 0x34, 0xfa, + 0x90, 0x6a, 0x62, 0xe, 0x60, 0x62, 0x62, 0x76, + 0x76, 0x89, 0x93, 0xf7, 0xa7, 0x93, 0x82, 0x28, + 0x1f, 0x8b, 0x93, 0x82, 0xaa, 0x6a, 0x6f, 0x6e, + 0x54, 0x99, 0x39, 0x54, 0x39, 0x39, 0x54, 0x7f, + 0x67, 0x9a, 0x26, 0xfe, 0x99, 0x6f, 0x6a, 0x52, + 0x60, 0xaa, 0x76, 0x37, 0xa8, 0x46, 0x5e, 0x5e, + 0x8d, 0x8d, 0x5e, 0x8d, 0x76, 0x8d, 0x32, 0x28, + 0xa6, 0xa8, 0xa7, 0x89, 0x8f, 0x46, 0x8d, 0x5e, + 0x8d, 0x68, 0xa3, 0xa3, 0x5e, 0x7, 0x9f, 0x68, + 0x68, 0x6c, 0x9f, 0x4e, 0x8d, 0x68, 0x68, 0x68, + 0x82, 0x6c, 0x5e, 0x28, 0xa8, 0xba, 0xbe, 0xd4, + 0xea, 0x34, 0x34, 0x15, 0x2b, 0xfa, 0xfa, 0x34, + 0x2b, 0x34, 0x2a, 0x34, 0x3d, 0x34, 0x15, 0x3b, + 0x3f, 0x15, 0x15, 0x15, 0x34, 0x7f, 0x9a, 0x90, + 0x6f, 0xb0, 0x83, 0x81, 0x7e, 0x5f, 0x5f, 0x7d, + 0x8d, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, + 0x68, 0x9f, 0x7, 0x68, 0x68, 0x6c, 0x28, 0x5e, + 0x5e, 0x76, 0x8f, 0x8f, 0x8f, 0x76, 0xa7, 0x76, + 0x28, 0x7, 0xb7, 0x2c, 0x2c, 0xb, 0x3, 0x34, + 0x15, 0xf2, 0x3d, 0xf2, 0x15, 0xf2, 0x15, 0x34, + 0x34, 0x54, 0x2a, 0x34, 0x48, 0x21, 0x1d, 0x70, + 0x3b, 0x3d, 0x16, 0x16, 0xf2, 0x3d, 0x15, 0x34, + 0x39, 0x6b, 0x91, 0x8f, 0x68, 0x68, 0x68, 0xa3, + 0xa3, 0x4e, 0x4e, 0x4e, 0x68, 0x4e, 0xa3, 0x9f, + 0xa3, 0x86, 0x0, 0xa3, 0x4e, 0xa3, 0xa3, 0xa3, + 0x98, 0x98, 0x8f, 0xf2, 0x3d, 0x16, 0x16, 0x16, + 0x16, 0x14, 0x14, 0x16, 0x16, 0x14, 0x14, 0x3b, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xf9, 0x48, 0x36, 0x99, 0x54, 0x23, 0x39, 0x9, + 0x99, 0x26, 0x23, 0xf4, 0xfd, 0x40, 0x3e, 0xe, + 0x28, 0x28, 0x28, 0x82, 0x86, 0x5e, 0x82, 0x8, + 0xa7, 0x76, 0xa7, 0xcd, 0xf3, 0x3e, 0x90, 0x7f, + 0x6e, 0x34, 0x23, 0xfe, 0x7f, 0x7f, 0x54, 0x2a, + 0x54, 0x9, 0x54, 0xa, 0xea, 0x23, 0x1d, 0x20, + 0x3e, 0x2f, 0x9c, 0xfc, 0x28, 0x5e, 0x5e, 0xb8, + 0xdd, 0xe, 0x5e, 0x5e, 0x68, 0x5e, 0xfc, 0x68, + 0x5e, 0x5e, 0x6c, 0xa0, 0x50, 0xbf, 0xb4, 0xe0, + 0xf1, 0x39, 0x3a, 0x3a, 0x90, 0x71, 0x4d, 0x31, + 0x26, 0x6e, 0xa, 0x54, 0x39, 0x7f, 0xa1, 0xc, + 0xf3, 0xe, 0xe, 0x28, 0x5e, 0x5e, 0x5e, 0x28, + 0xfc, 0x28, 0xa3, 0x86, 0x7, 0xdd, 0x28, 0x5e, + 0x37, 0x37, 0x1f, 0x12, 0x1f, 0x9f, 0x5e, 0xa3, + 0xfc, 0xdd, 0xa3, 0xa3, 0x9f, 0x9f, 0xfc, 0x68, + 0x86, 0x68, 0xa3, 0x75, 0x68, 0x4e, 0x4e, 0x68, + 0xa7, 0xba, 0x37, 0x6c, 0xa7, 0xf3, 0xf0, 0x1b, + 0xfd, 0x3, 0x2a, 0x34, 0x48, 0x2a, 0xeb, 0x15, + 0x15, 0xf5, 0xeb, 0x3b, 0x48, 0xa, 0x23, 0x1d, + 0x23, 0x54, 0x73, 0x15, 0x21, 0xfa, 0x2a, 0x54, + 0x99, 0x97, 0x3a, 0x6f, 0x6a, 0x7e, 0x74, 0x74, + 0x55, 0x37, 0x6c, 0x76, 0x82, 0x7, 0xb7, 0x6c, + 0x5e, 0x86, 0x6c, 0x1f, 0x6c, 0x5e, 0x8d, 0x93, + 0x62, 0x55, 0x6a, 0x5d, 0x8f, 0x5f, 0xf8, 0x9c, + 0x5e, 0x5e, 0x5f, 0x74, 0x4a, 0x50, 0x3, 0x73, + 0xf2, 0x3d, 0x15, 0x15, 0xf2, 0x3d, 0x15, 0x15, + 0x3b, 0x7f, 0x7f, 0x48, 0x1d, 0x1a, 0x48, 0x73, + 0x70, 0x3d, 0x3b, 0x16, 0x16, 0x16, 0x3d, 0x15, + 0x2b, 0x42, 0x91, 0x94, 0x8f, 0x8f, 0x8f, 0x8b, + 0x75, 0x68, 0x8b, 0x5e, 0x4e, 0xa3, 0x68, 0xa3, + 0xa3, 0xa3, 0x8d, 0x79, 0x98, 0x98, 0x8b, 0x8b, + 0x8b, 0x98, 0x8f, 0x16, 0x16, 0xff, 0x16, 0x16, + 0xff, 0x16, 0x14, 0x14, 0x16, 0xff, 0x14, 0x14, + 0x14, 0x8d, 0x79, 0x68, 0x0, 0x79, 0x68, 0x0, + 0x0, 0x68, 0x68, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x4d, 0x36, 0x42, 0x99, 0x7f, 0x54, 0x34, 0x15, + 0xde, 0x34, 0xc0, 0xf1, 0xed, 0x11, 0x9c, 0x1e, + 0x76, 0x1f, 0x2f, 0x6c, 0x6c, 0x5e, 0xa7, 0xa6, + 0x2c, 0x5f, 0x76, 0x5f, 0x12, 0x11, 0x4a, 0x97, + 0x6e, 0x7f, 0x1c, 0x54, 0x2a, 0x2a, 0x48, 0x48, + 0x15, 0x70, 0x54, 0x99, 0x7f, 0x1c, 0x36, 0x20, + 0x50, 0xaa, 0x55, 0x2c, 0xf3, 0xa7, 0x76, 0x28, + 0x5f, 0x46, 0x8d, 0x68, 0x5e, 0x93, 0x46, 0x1f, + 0xa7, 0x9c, 0x76, 0x2c, 0xb, 0xc9, 0xa, 0xf4, + 0x54, 0xfa, 0x42, 0x58, 0x6f, 0x85, 0x80, 0x39, + 0x6e, 0x23, 0x54, 0x39, 0xf9, 0x6e, 0x99, 0x60, + 0x7e, 0x7e, 0x30, 0x46, 0x7d, 0x9c, 0x6c, 0x37, + 0x55, 0xa0, 0x28, 0x82, 0x7d, 0x55, 0x74, 0x8b, + 0x8f, 0x9c, 0x30, 0x30, 0x7c, 0xb7, 0x7, 0x68, + 0x74, 0x2f, 0x68, 0x5e, 0x8d, 0x8d, 0x37, 0x79, + 0x98, 0x79, 0x68, 0x1e, 0x46, 0xa7, 0x6c, 0x93, + 0x8f, 0x62, 0x76, 0x8b, 0x62, 0x74, 0xa6, 0xe5, + 0x7f, 0x73, 0x73, 0x34, 0xfa, 0x2a, 0xfa, 0x34, + 0x1d, 0x23, 0x34, 0x17, 0x70, 0x2a, 0xeb, 0x15, + 0x2b, 0x34, 0x73, 0x34, 0x3f, 0x34, 0xfa, 0x1d, + 0x4d, 0x31, 0x4d, 0x4d, 0x6f, 0x6a, 0x6a, 0x6a, + 0x91, 0x91, 0xb3, 0x91, 0x8f, 0x76, 0x5f, 0x93, + 0x82, 0x68, 0x8d, 0x62, 0x98, 0x8d, 0x74, 0x91, + 0x94, 0x91, 0x90, 0xb0, 0x6a, 0x94, 0x7e, 0x8f, + 0x7d, 0x82, 0x74, 0x7e, 0x83, 0xaf, 0xa, 0x73, + 0xf2, 0x3b, 0x34, 0x2b, 0x23, 0x2e, 0x48, 0x3f, + 0x3b, 0x1d, 0x48, 0x34, 0xeb, 0x2b, 0x34, 0x1, + 0xeb, 0x3b, 0x15, 0x3b, 0x22, 0x22, 0x3f, 0x16, + 0x3d, 0x3b, 0x48, 0x7f, 0x91, 0x8f, 0x94, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, 0x68, 0x68, 0x8f, 0x98, + 0xa3, 0x8b, 0x8f, 0x8b, 0x8f, 0x8f, 0x8f, 0x8f, + 0x1d, 0x1d, 0x1d, 0x16, 0x16, 0x14, 0xff, 0x16, + 0xff, 0xff, 0x14, 0xff, 0xff, 0x16, 0x14, 0x3b, + 0x3b, 0x17, 0x8d, 0x79, 0x0, 0x68, 0x68, 0x4e, + 0x0, 0x79, 0x68, 0x68, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x16, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0x0, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x26, 0x42, 0x23, 0x54, 0xa, 0x2a, 0x2b, 0x15, + 0x15, 0x34, 0x21, 0x23, 0xf9, 0x5d, 0x7e, 0x89, + 0x76, 0x62, 0x8f, 0xa8, 0xa0, 0x62, 0x8f, 0x46, + 0x46, 0x8f, 0x8f, 0x89, 0x5f, 0x6a, 0x83, 0x99, + 0xa, 0xfa, 0x54, 0x54, 0x54, 0x23, 0x4d, 0x67, + 0x23, 0x34, 0x70, 0x42, 0x54, 0x34, 0x23, 0x54, + 0x99, 0x83, 0x7e, 0x5f, 0x5f, 0x74, 0x8f, 0x76, + 0x46, 0x8f, 0x8f, 0x8d, 0x9c, 0x8f, 0x8b, 0x8d, + 0xaa, 0xaa, 0x94, 0x5f, 0x83, 0x90, 0x4d, 0x42, + 0x23, 0x3f, 0x6e, 0x67, 0x99, 0x54, 0x99, 0x99, + 0x54, 0x54, 0x67, 0x58, 0x31, 0x67, 0x4d, 0x6b, + 0x6a, 0x7e, 0x93, 0x82, 0xaa, 0xb3, 0x37, 0x82, + 0x74, 0x8f, 0x5f, 0x93, 0x8f, 0x8f, 0x8f, 0x62, + 0x7e, 0xaa, 0xa0, 0x76, 0x8f, 0xa6, 0x6c, 0x82, + 0x8b, 0x82, 0x68, 0x79, 0x8b, 0x98, 0x8d, 0x8d, + 0x98, 0x9c, 0x5e, 0x8d, 0x98, 0x9c, 0x37, 0x8b, + 0x8f, 0x93, 0x82, 0x93, 0x8f, 0xa8, 0x50, 0xb4, + 0x9, 0xde, 0x1, 0xeb, 0x54, 0x54, 0x23, 0x1c, + 0x36, 0x36, 0x48, 0x3f, 0x22, 0x34, 0x3d, 0xf2, + 0x15, 0x15, 0x1, 0x34, 0x48, 0x23, 0x2a, 0x1d, + 0x1c, 0x4d, 0x80, 0x80, 0x31, 0x63, 0x85, 0x90, + 0x81, 0x91, 0x6b, 0x6a, 0x8f, 0x82, 0x76, 0x62, + 0x93, 0x82, 0x76, 0x9c, 0x93, 0x46, 0xaa, 0x6a, + 0x91, 0x91, 0x6a, 0x3a, 0x4a, 0x62, 0x98, 0x8b, + 0x46, 0x30, 0xaa, 0xb0, 0xb0, 0x3, 0xa, 0x34, + 0x3d, 0x70, 0x48, 0x34, 0x1d, 0x1c, 0x42, 0x48, + 0x48, 0x21, 0x15, 0x3d, 0xf2, 0x3f, 0xfa, 0x3d, + 0x3b, 0x48, 0x7f, 0x48, 0x23, 0x1d, 0x21, 0x3d, + 0x3d, 0x15, 0x3b, 0x70, 0x7f, 0x94, 0x94, 0x8f, + 0x8f, 0x98, 0x8f, 0x98, 0x4e, 0xa3, 0x98, 0x68, + 0x4e, 0xa3, 0x8b, 0x8f, 0x8b, 0x8b, 0x8f, 0x8b, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0xff, + 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xff, 0xff, + 0xff, 0x17, 0x17, 0x68, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x14, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x73, 0x7f, 0x48, 0x34, 0x34, 0x1d, 0x63, 0x7f, + 0x48, 0x36, 0x36, 0x20, 0x80, 0x6a, 0x7e, 0xaa, + 0xa0, 0x93, 0x8b, 0x46, 0xa7, 0x62, 0x8b, 0x93, + 0x5e, 0x7d, 0x7e, 0xa8, 0xb3, 0xb0, 0xb4, 0xa, + 0x73, 0xeb, 0x7f, 0x26, 0x39, 0x36, 0x3c, 0x58, + 0x99, 0x48, 0x48, 0x15, 0x1, 0x34, 0x54, 0x54, + 0x6e, 0x97, 0x7e, 0x76, 0x82, 0x62, 0x30, 0x8d, + 0x82, 0x8f, 0x93, 0x28, 0xa9, 0xaa, 0x7d, 0x5e, + 0x98, 0x7e, 0x9c, 0x7d, 0x74, 0x6a, 0x4d, 0x36, + 0x48, 0x48, 0xfa, 0x23, 0x23, 0x2a, 0x67, 0x9a, + 0x67, 0x23, 0x36, 0x63, 0x85, 0x80, 0x20, 0x58, + 0x6a, 0xa6, 0xa7, 0x5e, 0x46, 0x12, 0x37, 0x5e, + 0x8d, 0x82, 0x46, 0x30, 0x8f, 0x8f, 0xa7, 0x9c, + 0x27, 0x50, 0xb7, 0x28, 0x8d, 0x37, 0xfc, 0x5e, + 0x8d, 0x68, 0x68, 0xfc, 0x82, 0x5e, 0x7, 0x5e, + 0x46, 0xe, 0x9f, 0x68, 0x79, 0x5e, 0x1f, 0x46, + 0x93, 0x8d, 0x7, 0x37, 0x27, 0x2c, 0xc7, 0xbf, + 0x3, 0xe6, 0xeb, 0x34, 0x39, 0x7f, 0x2a, 0xf9, + 0x42, 0x99, 0x73, 0x34, 0x2a, 0xfa, 0x15, 0x3b, + 0x48, 0x23, 0x15, 0x34, 0x54, 0x6e, 0xeb, 0x70, + 0x48, 0x23, 0x73, 0x6e, 0x26, 0x36, 0x31, 0x9a, + 0x81, 0x91, 0x81, 0x5d, 0x7e, 0x82, 0x76, 0x9c, + 0xe, 0x1f, 0x6c, 0xa8, 0x9c, 0x76, 0x55, 0x91, + 0x94, 0x94, 0x50, 0x7f, 0x20, 0x2c, 0x37, 0xa0, + 0xa7, 0x12, 0x60, 0xb0, 0x40, 0xb0, 0x7f, 0x34, + 0x3b, 0x70, 0x34, 0x15, 0x34, 0x70, 0x2a, 0x73, + 0x34, 0x2b, 0x34, 0x21, 0x34, 0x7f, 0x42, 0x3b, + 0x3b, 0x3f, 0x70, 0x34, 0x15, 0xfa, 0x34, 0xf2, + 0x1, 0x15, 0x48, 0x2e, 0x36, 0x94, 0x94, 0x94, + 0x8f, 0x8b, 0x8f, 0x5e, 0xb8, 0x9f, 0xa3, 0x5e, + 0x9e, 0xa3, 0x98, 0x8b, 0x8f, 0x8b, 0x8f, 0xf2, + 0x16, 0x14, 0x14, 0x14, 0x16, 0xff, 0xff, 0x14, + 0x16, 0x14, 0x14, 0x14, 0xff, 0xff, 0x14, 0x14, + 0xff, 0xff, 0x15, 0x79, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x48, 0x67, 0x80, 0x48, 0x34, 0x42, 0x99, 0x6e, + 0xcb, 0xfd, 0xb, 0xbf, 0xcc, 0x5f, 0x5f, 0x12, + 0x28, 0x68, 0x8d, 0x68, 0x1e, 0x1f, 0x82, 0x5e, + 0x7, 0xa0, 0x30, 0x2c, 0xba, 0xc5, 0x6f, 0x26, + 0x2a, 0x34, 0x54, 0x54, 0x2a, 0x48, 0x67, 0x7f, + 0x54, 0x54, 0x73, 0x48, 0x34, 0x48, 0x67, 0x4d, + 0x26, 0x58, 0x5f, 0x76, 0x5e, 0x37, 0x2f, 0x37, + 0x7, 0xa0, 0x6c, 0xfc, 0x1f, 0x37, 0x86, 0x68, + 0x28, 0x30, 0x1f, 0x28, 0xa8, 0xb4, 0x5a, 0xcb, + 0xa, 0x6e, 0x5a, 0x20, 0x31, 0x36, 0x63, 0x83, + 0x90, 0x48, 0x54, 0x5a, 0x6e, 0xa, 0x41, 0x1b, + 0x27, 0xe, 0x28, 0x5e, 0x5e, 0x46, 0x5e, 0x5e, + 0x5e, 0x28, 0xa0, 0xa7, 0xfc, 0xb7, 0xdd, 0xfc, + 0x30, 0x38, 0x68, 0x68, 0x68, 0x5e, 0x68, 0x86, + 0xa3, 0x9f, 0x9f, 0x9f, 0x5e, 0x68, 0x9f, 0x5e, + 0x8d, 0x79, 0x68, 0x4e, 0x5e, 0x9e, 0x6c, 0x28, + 0x5e, 0x7, 0xb8, 0xf7, 0x5f, 0xa0, 0xf7, 0xf3, + 0x10, 0x99, 0xfa, 0x3f, 0x26, 0x39, 0xeb, 0x15, + 0xfa, 0xeb, 0x1, 0x34, 0x3f, 0x34, 0x2a, 0x34, + 0xfe, 0x42, 0x23, 0x2b, 0x48, 0xeb, 0x15, 0xeb, + 0x15, 0xf2, 0x1, 0x15, 0x21, 0xfe, 0x42, 0x4d, + 0x71, 0x5d, 0x81, 0x5d, 0x91, 0x74, 0xaa, 0xa6, + 0x7e, 0x62, 0x8f, 0x74, 0x8f, 0x74, 0x91, 0x91, + 0x6a, 0x50, 0xe5, 0x9, 0x41, 0x2c, 0xa7, 0xf3, + 0x37, 0x82, 0x74, 0x55, 0x6a, 0x83, 0x58, 0x48, + 0x70, 0x22, 0x22, 0xf2, 0x3d, 0x34, 0x15, 0x15, + 0x3f, 0x42, 0x48, 0x2b, 0x3f, 0x23, 0x42, 0x70, + 0x34, 0x34, 0x3d, 0x3d, 0xee, 0x3f, 0x2b, 0xf2, + 0x3d, 0x15, 0x15, 0x15, 0x3f, 0x3f, 0x4d, 0x91, + 0x91, 0x94, 0x8f, 0x8f, 0x99, 0x8f, 0x8f, 0x8f, + 0x8b, 0x8f, 0x8f, 0x8b, 0x8f, 0xf2, 0x16, 0x14, + 0x14, 0x14, 0x14, 0xff, 0xff, 0x16, 0x14, 0xff, + 0xff, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0x14, + 0xff, 0x18, 0x17, 0x68, 0x79, 0x68, 0x68, 0x0, + 0x0, 0x68, 0x68, 0x0, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x26, 0x4d, 0x4d, 0x48, 0x3b, 0x15, 0x34, 0x34, + 0xf9, 0xf4, 0x40, 0x2c, 0xf3, 0x28, 0x7d, 0x8d, + 0x82, 0x82, 0x82, 0x28, 0x6c, 0xc, 0xa7, 0xa7, + 0xdd, 0xa7, 0x1e, 0xa7, 0xe, 0x60, 0x5d, 0x85, + 0x7f, 0x21, 0x48, 0x23, 0xfa, 0xfa, 0x54, 0xfa, + 0x73, 0x73, 0x39, 0x48, 0x3f, 0x1d, 0x36, 0x58, + 0x71, 0x6f, 0xaa, 0x5f, 0xa7, 0xa5, 0x7d, 0x37, + 0x28, 0x5f, 0x82, 0x5e, 0x82, 0x98, 0x82, 0x5e, + 0x76, 0xaa, 0xaa, 0x74, 0x83, 0x41, 0x99, 0x99, + 0x54, 0x42, 0x3a, 0x6f, 0x58, 0x67, 0x39, 0x99, + 0x99, 0x73, 0x54, 0x2a, 0x2a, 0x54, 0x41, 0x6a, + 0x91, 0x62, 0xa7, 0x28, 0x93, 0x7d, 0xa8, 0x9c, + 0x62, 0x74, 0xa8, 0x89, 0x62, 0x30, 0x12, 0x8d, + 0x93, 0x8d, 0x5e, 0x5e, 0x98, 0x82, 0x7, 0x7, + 0x46, 0x9c, 0x8, 0x82, 0x98, 0x82, 0x28, 0x98, + 0x8b, 0x98, 0x5e, 0x76, 0x46, 0x76, 0xb8, 0xa8, + 0x62, 0x1f, 0x9f, 0x7d, 0x93, 0x76, 0x2c, 0x3e, + 0x83, 0x99, 0x73, 0x34, 0xfa, 0x54, 0xfa, 0x73, + 0x54, 0x15, 0x3d, 0x15, 0x70, 0x15, 0x3d, 0x34, + 0x48, 0x73, 0x73, 0x34, 0x15, 0x34, 0x2b, 0xf2, + 0x70, 0x3b, 0x3d, 0x16, 0x15, 0x15, 0x34, 0x2a, + 0x39, 0x67, 0x90, 0x90, 0x90, 0x5d, 0x58, 0x6b, + 0x94, 0x94, 0x81, 0x5d, 0x6a, 0x91, 0x91, 0x90, + 0x5a, 0x7f, 0x26, 0x41, 0xa1, 0x5f, 0x46, 0x7e, + 0x93, 0x76, 0x94, 0x6f, 0x99, 0x7f, 0x54, 0x73, + 0xeb, 0xfa, 0x21, 0x21, 0x48, 0x48, 0x22, 0x22, + 0x34, 0x48, 0xfa, 0xf2, 0x3d, 0x3f, 0x34, 0x34, + 0x34, 0x34, 0x21, 0x2b, 0x3f, 0x80, 0x48, 0x15, + 0x3d, 0x16, 0x3d, 0x3d, 0x14, 0x3d, 0x3b, 0x70, + 0x70, 0x67, 0x36, 0x36, 0x8f, 0x8f, 0x8f, 0x8f, + 0x2e, 0x1d, 0x8f, 0xf2, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x14, 0x14, 0x14, 0x14, 0xff, 0x14, 0x14, + 0x14, 0xff, 0x14, 0x18, 0xff, 0x14, 0xff, 0x14, + 0xff, 0xff, 0x14, 0x68, 0x68, 0x68, 0x79, 0x68, + 0x0, 0x68, 0x68, 0x68, 0x68, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7f, 0x42, 0x26, 0x54, 0x73, 0x73, 0x23, 0x23, + 0x39, 0x6f, 0x5b, 0x9c, 0x2f, 0x62, 0x8f, 0x93, + 0x37, 0x74, 0x55, 0x46, 0xa7, 0xb3, 0x8f, 0x30, + 0xe, 0x8f, 0x8f, 0x89, 0x55, 0x4a, 0x6f, 0x90, + 0x6e, 0x54, 0x2a, 0x23, 0x54, 0xa, 0x99, 0x1d, + 0x2b, 0x21, 0x80, 0x7f, 0xfa, 0x21, 0x3f, 0x80, + 0x99, 0x90, 0x5d, 0x27, 0x30, 0x94, 0x8f, 0x82, + 0x46, 0x62, 0x62, 0x82, 0x98, 0x74, 0x55, 0x46, + 0x7d, 0xaa, 0xaa, 0x55, 0x4a, 0x63, 0x90, 0x63, + 0x54, 0x23, 0x42, 0x99, 0x99, 0x6e, 0x23, 0x39, + 0x39, 0x7f, 0x7f, 0x66, 0x42, 0x23, 0x4d, 0x81, + 0x91, 0x7e, 0x27, 0x55, 0x94, 0x94, 0xa8, 0x27, + 0x6a, 0x91, 0x62, 0x62, 0x7e, 0x27, 0x30, 0x76, + 0x62, 0x98, 0x37, 0xe, 0x62, 0x76, 0x7, 0x5f, + 0x62, 0x46, 0x5e, 0x8d, 0x8b, 0x8b, 0x1f, 0x62, + 0x8f, 0x8f, 0x6c, 0xa0, 0x62, 0x82, 0x6c, 0xa7, + 0x8b, 0x46, 0x37, 0x82, 0x8f, 0x93, 0xf3, 0xb, + 0x5a, 0xe6, 0xeb, 0xfa, 0x2a, 0xfa, 0x54, 0x39, + 0x26, 0x36, 0x21, 0x3f, 0x34, 0x15, 0x3d, 0x15, + 0x15, 0xf2, 0xee, 0x34, 0x21, 0x1d, 0x48, 0x2a, + 0x48, 0x70, 0x15, 0x16, 0x15, 0x16, 0xf2, 0x15, + 0x15, 0x2b, 0x73, 0x7f, 0x3a, 0x31, 0x31, 0x71, + 0x81, 0x81, 0x81, 0x58, 0x85, 0x71, 0x85, 0x99, + 0xf9, 0xc9, 0xfd, 0x83, 0x5f, 0x28, 0x37, 0x8f, + 0x76, 0x28, 0x74, 0xb0, 0x7f, 0x73, 0x73, 0xee, + 0xeb, 0xeb, 0x34, 0x48, 0x39, 0x36, 0x1d, 0x22, + 0x2b, 0x2a, 0x2b, 0x15, 0x15, 0x16, 0x15, 0xf2, + 0xeb, 0x34, 0x15, 0x22, 0x48, 0x7f, 0x48, 0x3f, + 0x16, 0x16, 0x3d, 0x16, 0x16, 0x16, 0x3d, 0x3d, + 0x3b, 0x36, 0x2e, 0x2e, 0x42, 0x8f, 0x94, 0x8f, + 0x70, 0xf2, 0x3d, 0x16, 0x16, 0x16, 0x16, 0xff, + 0xff, 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, 0xff, + 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x17, 0x79, 0x68, 0x68, 0x68, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x16, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xfa, 0x34, 0x70, 0x73, 0xa, 0x2a, 0x20, 0x31, + 0x4a, 0x62, 0x62, 0x5c, 0x30, 0x5f, 0x94, 0x93, + 0xa7, 0xa6, 0x7e, 0x82, 0x82, 0x62, 0x8f, 0x62, + 0x46, 0x8b, 0x8f, 0x9c, 0x2c, 0xb4, 0x99, 0xa, + 0x73, 0xfa, 0xfa, 0xf9, 0x26, 0x80, 0x4d, 0x36, + 0x36, 0x1d, 0x48, 0x73, 0x3d, 0xf2, 0xf2, 0x73, + 0x54, 0x90, 0x6a, 0x62, 0x62, 0x8f, 0x93, 0x5e, + 0x28, 0x55, 0x9c, 0x5e, 0x98, 0x8f, 0x60, 0x46, + 0x46, 0x8f, 0x93, 0x46, 0x4a, 0x5d, 0x97, 0x90, + 0x67, 0x48, 0x2a, 0x54, 0x54, 0x54, 0x39, 0x2a, + 0x48, 0x99, 0x90, 0x9d, 0x3c, 0x42, 0x66, 0xb0, + 0x7e, 0x74, 0xa6, 0xa8, 0x74, 0x8f, 0x76, 0x5c, + 0x62, 0x8b, 0x82, 0x76, 0x93, 0x62, 0x5f, 0x7, + 0x76, 0x76, 0x28, 0x37, 0x8d, 0x8d, 0x68, 0x68, + 0x68, 0x68, 0x68, 0x5e, 0x82, 0x5e, 0x6c, 0xa8, + 0x82, 0x8d, 0x9f, 0x32, 0x8d, 0x68, 0x68, 0x68, + 0x5e, 0x8d, 0x5e, 0x6c, 0xa7, 0x6c, 0xdd, 0xbf, + 0xd4, 0x23, 0xfa, 0x34, 0xfa, 0xeb, 0x2a, 0x54, + 0x23, 0x39, 0x54, 0x34, 0xfa, 0xfa, 0xfa, 0x2b, + 0x15, 0x15, 0x3b, 0x34, 0xfa, 0x34, 0x34, 0x2a, + 0x34, 0x70, 0x3b, 0x3d, 0x3d, 0x17, 0x17, 0x15, + 0x15, 0x15, 0x3b, 0x2a, 0x23, 0x39, 0x67, 0x4d, + 0x9a, 0x6f, 0x81, 0x6f, 0x99, 0x58, 0x4a, 0x41, + 0x1b, 0x41, 0x41, 0x3e, 0xa0, 0x6c, 0x5e, 0x9f, + 0xb8, 0x7, 0xa8, 0x40, 0x5a, 0xd8, 0xfa, 0x15, + 0x15, 0xf2, 0xf2, 0xf2, 0xeb, 0xeb, 0x15, 0x15, + 0xeb, 0x2a, 0x15, 0x22, 0x48, 0x3f, 0x3b, 0x3b, + 0x3f, 0x15, 0x3d, 0x16, 0x3d, 0x34, 0x34, 0xf2, + 0xeb, 0x1, 0x3d, 0x15, 0x3b, 0x3d, 0x16, 0x16, + 0x3d, 0xf2, 0x16, 0xf2, 0x70, 0x3d, 0x3d, 0x3d, + 0x3d, 0x3d, 0x16, 0x16, 0x18, 0x14, 0xff, 0x14, + 0x16, 0xff, 0xff, 0x14, 0x14, 0xff, 0x14, 0xff, + 0x16, 0x14, 0x14, 0x14, 0xff, 0x14, 0xff, 0x14, + 0xff, 0xff, 0xff, 0xff, 0x68, 0x68, 0x68, 0x0, + 0x0, 0xa3, 0x0, 0x0, 0x0, 0xa3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x54, 0x23, 0x1, 0xfa, 0x23, 0xb, 0xe5, 0x40, + 0xe, 0x7, 0x6c, 0x6c, 0x8, 0xb7, 0x28, 0x5e, + 0x6c, 0x28, 0x28, 0x68, 0x9e, 0x5e, 0x76, 0x5e, + 0x5e, 0x7, 0xa0, 0x6c, 0xb7, 0xbf, 0x5a, 0x23, + 0x23, 0x54, 0x2a, 0x34, 0x23, 0x23, 0x39, 0x7f, + 0x54, 0x34, 0x34, 0x48, 0x48, 0x70, 0x34, 0x2b, + 0x42, 0x1b, 0x55, 0xe, 0x28, 0x28, 0x8, 0x9f, + 0x5e, 0x8, 0xf7, 0x8, 0x9f, 0x5e, 0x5e, 0x5e, + 0x68, 0xfc, 0x28, 0x8, 0xa0, 0xa1, 0xca, 0xc9, + 0x7f, 0x67, 0x7f, 0xfd, 0xfe, 0x4d, 0x31, 0x99, + 0x23, 0x23, 0x5a, 0xb4, 0x7f, 0x6e, 0x4, 0xb, + 0x2c, 0x5f, 0x37, 0x5c, 0x46, 0x5f, 0x37, 0x76, + 0x93, 0x76, 0xa0, 0xdd, 0x8, 0x9f, 0x9f, 0xdd, + 0xfc, 0x32, 0x9f, 0x5e, 0x68, 0xa3, 0x86, 0x5e, + 0xa3, 0x68, 0x9f, 0xb8, 0x6c, 0x68, 0x9f, 0x6c, + 0x28, 0x28, 0x68, 0xa3, 0x68, 0x9e, 0x5e, 0x28, + 0x5e, 0x5e, 0x9f, 0xb8, 0xf7, 0x6c, 0x8, 0xf3, + 0x50, 0x1b, 0xf9, 0x73, 0x2a, 0xfa, 0x34, 0x2a, + 0xeb, 0x73, 0xa, 0xea, 0x34, 0x39, 0x36, 0x67, + 0x7f, 0x48, 0x22, 0x3f, 0x34, 0xf2, 0x15, 0x3b, + 0x3d, 0x15, 0x73, 0x48, 0x34, 0x21, 0x22, 0x3f, + 0x73, 0x34, 0x3b, 0x2b, 0x34, 0x34, 0x34, 0x3b, + 0x73, 0x54, 0x99, 0x85, 0x41, 0x20, 0x1b, 0x1b, + 0x50, 0xc8, 0x60, 0x4a, 0xf3, 0x7, 0x5e, 0x76, + 0xa0, 0x12, 0x60, 0x6a, 0xb4, 0x6e, 0x23, 0x21, + 0x2a, 0xf2, 0x3d, 0x3d, 0xf2, 0x16, 0x16, 0xf2, + 0xee, 0x15, 0x15, 0x1d, 0x67, 0x7f, 0x1d, 0x22, + 0x15, 0xf2, 0x16, 0x3d, 0x15, 0x16, 0x16, 0x3d, + 0x34, 0x34, 0x17, 0x3b, 0x3b, 0x3d, 0x16, 0x3d, + 0x16, 0x16, 0x16, 0x3d, 0x3d, 0x14, 0x16, 0x16, + 0x3d, 0x16, 0x14, 0x14, 0x16, 0x14, 0x16, 0xff, + 0x16, 0xff, 0x14, 0x14, 0xff, 0x14, 0x14, 0x14, + 0x14, 0x14, 0xff, 0x14, 0x14, 0xff, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x16, 0x68, 0x68, 0x68, + 0x68, 0x68, 0x68, 0xa3, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x36, 0x41, 0x66, 0x42, 0xf9, 0x5a, 0x3, 0x40, + 0x2c, 0xf3, 0xf3, 0x5e, 0x5e, 0x5e, 0x37, 0x1e, + 0x28, 0x5e, 0x82, 0x37, 0xfc, 0xe, 0xa8, 0x76, + 0x6c, 0xa0, 0x2c, 0xe, 0x1e, 0x60, 0x83, 0x20, + 0x36, 0x23, 0x73, 0x34, 0x2a, 0x2b, 0x34, 0x34, + 0x70, 0x48, 0x34, 0xfa, 0x42, 0x99, 0x54, 0x48, + 0x36, 0x3a, 0x40, 0xa0, 0x76, 0xa0, 0xf8, 0x28, + 0x68, 0x76, 0x82, 0x1f, 0x1f, 0x46, 0x8d, 0x32, + 0xa7, 0x12, 0xc8, 0xcd, 0xa6, 0xaf, 0xea, 0xfa, + 0x6e, 0x90, 0x90, 0x4d, 0x36, 0x31, 0x90, 0xb4, + 0x99, 0x7f, 0x23, 0xfa, 0xf1, 0x7f, 0xf9, 0xf4, + 0x90, 0x91, 0x74, 0x8f, 0x91, 0x6a, 0x7e, 0xb3, + 0xaa, 0x94, 0x27, 0x3e, 0x74, 0x82, 0x5e, 0x5e, + 0x30, 0x46, 0x68, 0x68, 0x93, 0x46, 0x1f, 0xa0, + 0x76, 0x8d, 0xa3, 0xe, 0x46, 0x79, 0x68, 0x79, + 0x62, 0x46, 0x5e, 0x76, 0x9c, 0x82, 0xfc, 0x2f, + 0x74, 0x8d, 0x5e, 0x76, 0x55, 0x93, 0x28, 0x74, + 0x83, 0x41, 0x7f, 0x6e, 0xd8, 0x73, 0xfa, 0x34, + 0x2b, 0x23, 0x67, 0x1c, 0xfa, 0x34, 0x48, 0x6e, + 0xa, 0x2a, 0x70, 0x34, 0x2a, 0x34, 0x22, 0x34, + 0x15, 0x17, 0x48, 0x7f, 0x34, 0x15, 0x21, 0x73, + 0x1, 0x34, 0x34, 0x34, 0xeb, 0x15, 0x21, 0x21, + 0x15, 0x15, 0x2b, 0x54, 0x73, 0xea, 0x23, 0x41, + 0xe3, 0xbe, 0x60, 0x7e, 0x12, 0xa7, 0x76, 0x8f, + 0x62, 0x55, 0x91, 0x83, 0x54, 0x73, 0xeb, 0xeb, + 0xe6, 0xa, 0xf2, 0x48, 0xfa, 0x1, 0x17, 0x22, + 0x17, 0x16, 0x3d, 0x3b, 0x34, 0x34, 0x34, 0x15, + 0x3d, 0x3b, 0x3b, 0x3f, 0x3f, 0x3f, 0x3b, 0x3b, + 0x3b, 0x3d, 0x16, 0x16, 0x16, 0x3d, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x3d, 0x3d, 0x14, 0x16, + 0x14, 0x16, 0x14, 0x14, 0x14, 0xff, 0x16, 0x16, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, 0xff, + 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, 0x14, + 0xff, 0xff, 0xff, 0xff, 0x17, 0x16, 0x75, 0x4e, + 0x75, 0x4e, 0x4e, 0x4e, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x19, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x42, 0x99, 0x6e, 0x90, 0x41, 0xe5, 0xaf, 0x60, + 0x5f, 0x27, 0x62, 0x46, 0x8d, 0x98, 0x62, 0x62, + 0x8d, 0x7d, 0xaa, 0x9c, 0x1e, 0x55, 0x74, 0x62, + 0x76, 0x62, 0x7e, 0x62, 0x9c, 0x6a, 0x90, 0x23, + 0x23, 0x54, 0x54, 0x54, 0x39, 0x23, 0x23, 0x21, + 0x42, 0x67, 0xfa, 0x15, 0x48, 0x54, 0xa, 0x34, + 0x23, 0x26, 0x56, 0xc8, 0x5f, 0x74, 0x7e, 0x37, + 0x98, 0x8f, 0x8b, 0x8d, 0x98, 0x8f, 0x9c, 0xa7, + 0x5e, 0x7e, 0x60, 0xf3, 0x60, 0x6f, 0x99, 0x2a, + 0x48, 0x67, 0x69, 0x9, 0x42, 0x7f, 0x54, 0x6e, + 0x7f, 0x67, 0x26, 0x36, 0x67, 0x4d, 0x4d, 0x48, + 0x63, 0x81, 0x91, 0x91, 0x91, 0x81, 0x81, 0xb0, + 0x6a, 0x94, 0x46, 0x98, 0x62, 0x93, 0x8d, 0x5e, + 0x8b, 0x8b, 0x8d, 0x37, 0x74, 0x8b, 0x5e, 0x28, + 0x8f, 0x98, 0x68, 0x79, 0x8b, 0x8d, 0x68, 0x8d, + 0x7d, 0x98, 0x86, 0xa7, 0x74, 0x76, 0x82, 0x8d, + 0x8f, 0x79, 0x5e, 0x93, 0x8b, 0x7d, 0x76, 0xaa, + 0xaf, 0xb4, 0xc9, 0xa, 0xd8, 0xfa, 0x23, 0x1c, + 0x1c, 0x1c, 0x36, 0x39, 0x34, 0x34, 0x34, 0x73, + 0xee, 0x3d, 0x34, 0xfa, 0xeb, 0x34, 0x1a, 0x36, + 0x48, 0x3f, 0x1a, 0x1d, 0x34, 0x16, 0x16, 0x3d, + 0xee, 0xf2, 0x15, 0xeb, 0x15, 0x15, 0x1d, 0x1d, + 0x34, 0x34, 0x34, 0x34, 0xeb, 0xa, 0x26, 0xb, + 0xe3, 0xf0, 0x5f, 0x93, 0x82, 0x32, 0x76, 0x93, + 0xa7, 0xa8, 0xb3, 0xb4, 0xa, 0x73, 0xfa, 0x54, + 0xea, 0xe6, 0xa, 0xfe, 0xfd, 0xea, 0xfa, 0x21, + 0x34, 0x3d, 0x16, 0x15, 0xf2, 0x3d, 0x16, 0x3b, + 0x3b, 0xf2, 0x3b, 0x1d, 0x36, 0x3f, 0x3b, 0x3b, + 0x3d, 0xf2, 0x16, 0x3d, 0x16, 0x16, 0x16, 0xf2, + 0x3d, 0x16, 0x14, 0x3d, 0x16, 0x16, 0x14, 0x16, + 0x16, 0x16, 0x14, 0xff, 0x16, 0x14, 0xff, 0x14, + 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0xff, 0x14, 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, + 0xff, 0x17, 0xff, 0xff, 0xff, 0x16, 0xff, 0xa2, + 0x68, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa, 0xa, 0x6e, 0x90, 0x44, 0x3e, 0x6a, 0x74, + 0x76, 0x98, 0x8f, 0x93, 0x5e, 0x82, 0x9c, 0x93, + 0x5e, 0x5f, 0xaa, 0x89, 0x82, 0x8b, 0x8f, 0x93, + 0x76, 0x8b, 0x8f, 0x9c, 0x9c, 0xb0, 0xa, 0x54, + 0x34, 0x34, 0x73, 0x23, 0x4d, 0x58, 0x63, 0x36, + 0x36, 0x1c, 0x2b, 0x15, 0x15, 0xeb, 0xeb, 0x15, + 0x23, 0x90, 0x1b, 0x2c, 0x5f, 0x8f, 0x93, 0x5e, + 0x37, 0x93, 0xa7, 0x8, 0xa7, 0x93, 0x5f, 0xf7, + 0x76, 0x98, 0x82, 0x37, 0x2f, 0x6a, 0xb0, 0x7f, + 0x48, 0x66, 0x23, 0x34, 0x54, 0x7f, 0x70, 0x73, + 0x67, 0x71, 0x71, 0x58, 0x36, 0x31, 0x9a, 0x99, + 0x85, 0x91, 0x6a, 0xb0, 0x81, 0x94, 0x7e, 0x4a, + 0x27, 0x93, 0x5e, 0x5e, 0x82, 0x1f, 0x6c, 0x6c, + 0xa7, 0x76, 0x5e, 0x6c, 0x76, 0x8d, 0x5e, 0x86, + 0x28, 0x5e, 0xa3, 0x68, 0x5e, 0x5e, 0x28, 0x28, + 0xa0, 0x5e, 0xa3, 0x37, 0x46, 0x82, 0xa3, 0x8d, + 0x5e, 0xfc, 0x8d, 0x5e, 0xa7, 0xa7, 0xf7, 0xf0, + 0xbf, 0xb, 0xe3, 0xcb, 0xd8, 0xfa, 0x7f, 0x80, + 0x7f, 0x39, 0xf9, 0xf9, 0x2a, 0x73, 0xfa, 0x15, + 0x15, 0x3b, 0x42, 0x48, 0x15, 0x34, 0x23, 0x67, + 0x7f, 0x34, 0xfa, 0x34, 0xeb, 0x34, 0x2a, 0x15, + 0x17, 0x3d, 0x34, 0x34, 0xf2, 0xee, 0x34, 0x2a, + 0x15, 0xeb, 0xfa, 0xf9, 0x23, 0xf9, 0xb, 0x27, + 0xe, 0x38, 0x28, 0x5e, 0x9f, 0x9f, 0xfc, 0xe, + 0xa0, 0xba, 0xbf, 0x6e, 0x6e, 0x23, 0x39, 0x3a, + 0x41, 0x6e, 0x54, 0x5a, 0xbf, 0xd8, 0xeb, 0xeb, + 0x15, 0xeb, 0xeb, 0x34, 0x21, 0x15, 0x3b, 0x48, + 0x48, 0x3d, 0x3d, 0x2b, 0x23, 0x73, 0xee, 0x3d, + 0xf2, 0x3d, 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0x16, + 0xee, 0x16, 0x18, 0x14, 0x16, 0x16, 0x16, 0x16, + 0x3d, 0x16, 0x16, 0x16, 0x16, 0x14, 0x14, 0xff, + 0x14, 0xff, 0x14, 0x18, 0x14, 0x14, 0x18, 0xff, + 0x14, 0x14, 0xff, 0xff, 0x17, 0x14, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x4e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x23, 0xf9, 0x41, 0x2f, 0x37, 0x28, 0x28, 0x1e, + 0x9f, 0x5e, 0x9f, 0x6c, 0xfc, 0x5e, 0xdd, 0x9f, + 0x5e, 0xfc, 0x30, 0x5e, 0xa3, 0x86, 0x6c, 0xfc, + 0xe, 0x76, 0xb7, 0xb7, 0xf7, 0x50, 0x7f, 0xf9, + 0x48, 0x2b, 0x15, 0x2a, 0x63, 0x90, 0x99, 0x39, + 0x39, 0x73, 0x73, 0x73, 0xf1, 0x15, 0x15, 0x34, + 0x7f, 0x11, 0x40, 0x27, 0xe, 0x5e, 0x6c, 0xb8, + 0xf7, 0x12, 0xfc, 0x7, 0x9f, 0x5e, 0x1f, 0x1f, + 0x68, 0x9f, 0x6c, 0xf7, 0xf0, 0xa1, 0xcc, 0xbf, + 0xcb, 0xfe, 0x1c, 0x39, 0x9a, 0x58, 0x67, 0x1d, + 0x42, 0x85, 0xb0, 0xc9, 0x23, 0x23, 0xcb, 0x3, + 0x97, 0x6f, 0x4a, 0x4a, 0x91, 0x91, 0x2f, 0x11, + 0x27, 0x1e, 0x5e, 0x9f, 0xdd, 0xe, 0x28, 0x7, + 0x28, 0x28, 0x5e, 0x1f, 0x8d, 0x86, 0x68, 0xa3, + 0x28, 0x28, 0x5e, 0xa3, 0xb8, 0x8, 0xfc, 0x37, + 0x76, 0x86, 0x5e, 0x5e, 0x8d, 0x5e, 0x32, 0xa3, + 0x7, 0xa7, 0x6c, 0x6c, 0xc, 0xb7, 0x2c, 0x2c, + 0x2c, 0xa0, 0xc, 0x41, 0xa, 0xeb, 0xe6, 0x73, + 0x1, 0x15, 0xa, 0xe6, 0xa, 0xa, 0x23, 0x1c, + 0x21, 0x42, 0x80, 0x39, 0x15, 0x3b, 0x34, 0xeb, + 0xeb, 0xeb, 0x2a, 0x2a, 0x34, 0xea, 0xfe, 0x1c, + 0x22, 0x15, 0x34, 0x34, 0x15, 0x3d, 0xf2, 0xee, + 0x15, 0x15, 0xf1, 0xfd, 0x1b, 0x3e, 0x5f, 0x9c, + 0x28, 0xfc, 0x5e, 0x8d, 0x82, 0xb8, 0xa0, 0x74, + 0xa7, 0xf3, 0x6, 0x63, 0xfd, 0xf9, 0x3a, 0x60, + 0x60, 0xb, 0x6e, 0x3, 0xcb, 0xd8, 0xeb, 0xde, + 0xeb, 0xde, 0x15, 0x2b, 0x22, 0x3f, 0x2b, 0x70, + 0x70, 0x3d, 0x16, 0x3d, 0xf2, 0xf2, 0xee, 0x3d, + 0x15, 0xf2, 0x3d, 0x15, 0x15, 0x16, 0x16, 0x16, + 0x16, 0x16, 0xff, 0x16, 0x16, 0x16, 0x16, 0x16, + 0xf2, 0xf2, 0x16, 0xf2, 0x3d, 0x16, 0xff, 0x14, + 0x14, 0x14, 0xff, 0x14, 0xff, 0x14, 0xff, 0x16, + 0x17, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x18, 0x68, 0xa3, 0xa3, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x19, 0xff, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0x19, 0xff, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x1b, 0x5d, 0x5d, 0x46, 0x5e, 0x28, 0xa7, 0xa7, + 0x6c, 0x86, 0xa0, 0x6c, 0x37, 0x8d, 0x82, 0x75, + 0xa3, 0x9f, 0x46, 0x5e, 0x5e, 0x5e, 0xa7, 0xb7, + 0x5f, 0x9c, 0x2f, 0xa0, 0x2f, 0x6a, 0x90, 0x99, + 0x67, 0x36, 0x21, 0xfa, 0x7f, 0x7f, 0x54, 0x34, + 0xfa, 0xfa, 0x34, 0xfa, 0x23, 0x1d, 0x22, 0x54, + 0x20, 0x6a, 0x60, 0x2f, 0xa7, 0x82, 0x5f, 0xf7, + 0x28, 0x8f, 0x8d, 0x28, 0x82, 0x98, 0x98, 0x5e, + 0x76, 0x93, 0xa7, 0xba, 0xbf, 0xb4, 0xc0, 0xe6, + 0x23, 0x4d, 0x99, 0x26, 0x63, 0x31, 0x63, 0x67, + 0x99, 0x99, 0x54, 0x34, 0x48, 0x54, 0x34, 0x39, + 0x90, 0x6a, 0x6a, 0x58, 0x58, 0x6f, 0x60, 0xf0, + 0x40, 0xaa, 0x28, 0x9f, 0x5f, 0x46, 0x8d, 0x68, + 0x93, 0x93, 0x5e, 0x8d, 0x8b, 0x93, 0x68, 0x8d, + 0x9c, 0x89, 0x4e, 0x5e, 0x62, 0x8d, 0x8d, 0x8d, + 0x8f, 0x82, 0x86, 0x8d, 0x9c, 0x9c, 0x6c, 0x76, + 0xaa, 0xa8, 0x5e, 0x93, 0x55, 0x60, 0x2c, 0x55, + 0x7e, 0xa8, 0xc8, 0x50, 0x6e, 0x9, 0xe6, 0xeb, + 0x3d, 0x15, 0xfa, 0xeb, 0x34, 0x23, 0x42, 0x67, + 0x48, 0x54, 0xfa, 0x48, 0x34, 0xeb, 0xfa, 0x2b, + 0x21, 0x34, 0x48, 0x3f, 0x15, 0x3b, 0x21, 0x70, + 0x34, 0x3b, 0x1, 0x15, 0xf2, 0xeb, 0x15, 0x3f, + 0x34, 0x23, 0x90, 0x5d, 0xa6, 0xa9, 0x2f, 0x8f, + 0x7d, 0x6c, 0xa8, 0x93, 0x7d, 0x28, 0x74, 0x8f, + 0x8f, 0x60, 0x4a, 0x90, 0x26, 0x54, 0x66, 0x58, + 0x74, 0xba, 0xb4, 0x5a, 0xfd, 0xfd, 0x54, 0x70, + 0x34, 0xf2, 0xee, 0xf2, 0x3d, 0xf2, 0xf2, 0xeb, + 0xf2, 0xf2, 0xf2, 0x34, 0x15, 0x15, 0x3d, 0x3b, + 0x3d, 0x16, 0x16, 0x3d, 0x16, 0x16, 0x16, 0x14, + 0x14, 0xff, 0x16, 0x16, 0x16, 0x16, 0x16, 0xf2, + 0x15, 0xf2, 0x16, 0x16, 0x16, 0x16, 0xff, 0x14, + 0x18, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0xff, + 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0x14, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x4e, 0x4e, 0xa3, 0xa3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0x19, + 0xff, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x60, 0x55, 0x7e, 0x9c, 0x76, 0x76, 0x74, 0xa8, + 0x32, 0x76, 0x74, 0x76, 0x8d, 0x93, 0x8b, 0x46, + 0x68, 0x98, 0x9c, 0xa7, 0x6c, 0x46, 0xaa, 0xa8, + 0xa7, 0x62, 0x7e, 0x74, 0x74, 0x91, 0x7a, 0x99, + 0x48, 0x54, 0x73, 0x73, 0x73, 0x2a, 0xfa, 0x48, + 0x39, 0x34, 0x17, 0x15, 0xfa, 0x21, 0x54, 0xea, + 0xfd, 0x4a, 0x7e, 0xa8, 0x5f, 0x62, 0x62, 0x37, + 0x8d, 0x8f, 0x8f, 0x46, 0x46, 0x94, 0x8b, 0x76, + 0xa8, 0x55, 0x55, 0xba, 0x50, 0x6f, 0x54, 0x2a, + 0x7f, 0x99, 0x39, 0x39, 0x39, 0x67, 0x99, 0x6e, + 0x54, 0x54, 0x42, 0x42, 0x80, 0x80, 0x48, 0x23, + 0x67, 0x85, 0x90, 0x66, 0x4, 0xfd, 0x40, 0xa6, + 0xa6, 0x74, 0x1f, 0x1f, 0x8f, 0x98, 0x5e, 0x5e, + 0x74, 0x62, 0x8d, 0x8d, 0x9c, 0x74, 0x1f, 0x5e, + 0x7d, 0x93, 0x75, 0x1f, 0x62, 0x98, 0x68, 0x98, + 0x74, 0x55, 0x28, 0x7d, 0xaa, 0xb3, 0x1f, 0x46, + 0x62, 0x76, 0x5e, 0x7d, 0x27, 0x55, 0x55, 0xaa, + 0xaa, 0xa1, 0xbf, 0xa1, 0xb4, 0x3, 0xcb, 0x48, + 0x34, 0xa, 0x7f, 0x54, 0xfa, 0xfa, 0x54, 0x54, + 0xfa, 0xfa, 0xeb, 0xfa, 0x48, 0x70, 0x2a, 0x1a, + 0x42, 0x23, 0x7f, 0x54, 0x3d, 0x16, 0x15, 0xf2, + 0x34, 0x15, 0x15, 0x15, 0xf2, 0x15, 0x2a, 0x39, + 0x1c, 0xfe, 0x90, 0xac, 0x52, 0x2c, 0xa6, 0x74, + 0x5e, 0x5e, 0x28, 0x46, 0x46, 0x5e, 0x8d, 0x8b, + 0x7d, 0x11, 0x5a, 0x99, 0x6e, 0xe6, 0x7f, 0x35, + 0x82, 0x28, 0xa8, 0xaa, 0x27, 0x11, 0xaf, 0x5a, + 0x6e, 0xeb, 0x3d, 0x16, 0x16, 0x3d, 0xee, 0xf2, + 0xee, 0xf2, 0xf2, 0x34, 0x3b, 0x17, 0x3b, 0x3d, + 0x3d, 0x3d, 0x14, 0x16, 0x16, 0x16, 0x14, 0x16, + 0x16, 0x14, 0x16, 0xf2, 0xf2, 0x1d, 0x1d, 0xf2, + 0xd6, 0xf2, 0xee, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x14, 0xff, 0x14, 0x14, 0x14, 0xff, 0xff, + 0x14, 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, 0x14, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x2c, 0x9c, 0xaa, 0x60, 0xe, 0x98, 0x8b, 0x8d, + 0x5e, 0x1f, 0x62, 0x93, 0x82, 0x82, 0x62, 0x55, + 0x5f, 0x8d, 0x7d, 0xc, 0xfc, 0x30, 0x62, 0x8d, + 0x5e, 0x98, 0x62, 0x55, 0x74, 0xb3, 0x99, 0x54, + 0x34, 0x1, 0x73, 0xfa, 0x23, 0x1c, 0x1c, 0x67, + 0x67, 0x7f, 0x3b, 0x3d, 0xeb, 0xeb, 0xeb, 0x23, + 0xfd, 0x6a, 0x62, 0x76, 0x28, 0x8b, 0x62, 0x46, + 0x76, 0x8b, 0x98, 0x46, 0xa6, 0x74, 0x93, 0x76, + 0xc, 0x62, 0x46, 0x8d, 0x82, 0x6a, 0x3a, 0x39, + 0x54, 0x54, 0x54, 0x2a, 0x6e, 0xa, 0x54, 0x7f, + 0x99, 0x42, 0x26, 0x31, 0x85, 0x85, 0x67, 0x39, + 0x23, 0x7f, 0x26, 0x6e, 0xf9, 0xfd, 0x50, 0xe, + 0x5f, 0x76, 0x46, 0x46, 0x76, 0x76, 0x68, 0x5e, + 0x2f, 0xc, 0x6c, 0x86, 0x82, 0x46, 0x1f, 0x5e, + 0x8d, 0x86, 0x4e, 0x28, 0x8d, 0x76, 0x5e, 0x5e, + 0x5f, 0x2c, 0x6c, 0x5e, 0x82, 0x5e, 0x37, 0x8d, + 0x8d, 0x5e, 0x6c, 0x82, 0x2f, 0xba, 0xb7, 0x82, + 0xc, 0x50, 0xf8, 0x2c, 0xf3, 0xcc, 0xdb, 0xe6, + 0xfa, 0xf1, 0xcb, 0xa, 0x2a, 0xfa, 0xfa, 0xfa, + 0x23, 0x2a, 0xfa, 0x15, 0x34, 0x54, 0x48, 0x48, + 0x48, 0x48, 0xa, 0x34, 0x15, 0x3b, 0xf5, 0x15, + 0x15, 0x15, 0xf2, 0x16, 0x3d, 0xa, 0x3, 0xe5, + 0x11, 0xa1, 0xc5, 0xa0, 0xa7, 0x28, 0xe, 0x82, + 0x32, 0xa3, 0xa3, 0x68, 0x5e, 0x68, 0x5e, 0x6c, + 0x28, 0xf8, 0xd4, 0x3, 0x5a, 0x1b, 0x3e, 0x2f, + 0x9f, 0x9e, 0x6c, 0x28, 0x6c, 0x28, 0xbd, 0xd2, + 0xd3, 0xcb, 0xd8, 0xeb, 0xf2, 0x3d, 0x15, 0x15, + 0x16, 0x3d, 0x3d, 0xf2, 0x3d, 0x16, 0xf2, 0x3d, + 0xf2, 0x3d, 0x16, 0x16, 0x16, 0x14, 0x14, 0x16, + 0x14, 0xff, 0x16, 0xeb, 0xde, 0x1f, 0x82, 0xd6, + 0xd6, 0x4e, 0xa3, 0x34, 0x15, 0x16, 0xff, 0x16, + 0xff, 0xff, 0x14, 0x14, 0x18, 0xff, 0x14, 0x14, + 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x19, 0xff, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xb7, 0x28, 0x28, 0x76, 0x5e, 0x68, 0x68, 0xa3, + 0x68, 0x68, 0x37, 0x7, 0x9f, 0x5e, 0x28, 0xa0, + 0x5e, 0x68, 0x9f, 0xa3, 0x5e, 0x5e, 0x8d, 0x32, + 0x9f, 0x32, 0xa7, 0xb7, 0xba, 0xa6, 0x99, 0x6e, + 0xeb, 0x34, 0x34, 0x39, 0x23, 0x1c, 0x23, 0x23, + 0xa, 0x73, 0x34, 0xeb, 0x15, 0x21, 0x42, 0x90, + 0x12, 0x5f, 0x5e, 0x5e, 0xa3, 0x5e, 0x82, 0x6c, + 0x7, 0x28, 0x5e, 0x6c, 0xfc, 0x5e, 0x5e, 0xa3, + 0x68, 0x5e, 0x82, 0x6c, 0x7, 0xba, 0xa1, 0x3, + 0xe6, 0x54, 0x39, 0xfe, 0x26, 0x42, 0x1d, 0x31, + 0x99, 0x6e, 0x54, 0x42, 0x6e, 0x6e, 0x3, 0xf4, + 0xc9, 0x5a, 0xfd, 0x58, 0x4a, 0x60, 0x11, 0x5f, + 0x5e, 0x28, 0x5e, 0x68, 0x6c, 0xb8, 0x9f, 0x5e, + 0x28, 0x6c, 0x68, 0x68, 0xa3, 0x75, 0x4e, 0x5e, + 0xa3, 0x9f, 0x9f, 0x5e, 0x68, 0xb8, 0x7, 0x5e, + 0x76, 0x28, 0x68, 0x68, 0x5e, 0x68, 0xa3, 0x9e, + 0x5e, 0xb8, 0xb8, 0x6c, 0x37, 0xa0, 0xf7, 0x9f, + 0x6c, 0x6c, 0x68, 0xa7, 0xc, 0xbe, 0xd1, 0xa, + 0xe6, 0xe6, 0xe6, 0xde, 0xeb, 0xe6, 0xf1, 0x23, + 0x36, 0x1c, 0x2a, 0x15, 0x2b, 0x34, 0x15, 0x3d, + 0x15, 0xeb, 0xeb, 0x2b, 0x2b, 0x2a, 0x34, 0x22, + 0x2e, 0x21, 0x3b, 0x3b, 0x34, 0xa, 0xe0, 0xd0, + 0x50, 0xdd, 0xf3, 0xe, 0x28, 0x5e, 0x5e, 0x5e, + 0x5e, 0x28, 0x5e, 0x82, 0x68, 0x9f, 0xa0, 0xb3, + 0x9c, 0xaa, 0xb, 0xfd, 0x1b, 0x27, 0x46, 0x93, + 0x5e, 0x6c, 0xe, 0xa7, 0x9f, 0x5e, 0xa0, 0x3, + 0xe5, 0xbf, 0xcb, 0x73, 0xf2, 0x3b, 0x3f, 0x34, + 0xf2, 0x3d, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x3d, 0x3d, 0x3d, 0x16, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x3d, 0xee, 0xee, 0x93, 0x98, 0x82, + 0x4e, 0x4e, 0x8d, 0x4e, 0xa3, 0x15, 0x16, 0xff, + 0x16, 0xff, 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, + 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0xff, 0x4e, 0xa3, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, 0x19, 0x19, + 0x19, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x28, 0x28, 0x28, 0x5e, 0x68, 0x68, 0x5e, 0x6c, + 0x9f, 0x68, 0x5e, 0xf7, 0xf7, 0x28, 0x8d, 0x5e, + 0x86, 0x5e, 0x1e, 0x68, 0x5e, 0x5e, 0x82, 0x7, + 0x7, 0x1e, 0x82, 0xf7, 0xf8, 0x4a, 0x4a, 0x99, + 0x48, 0x2b, 0x21, 0x3f, 0xf2, 0x15, 0x34, 0x34, + 0xfa, 0xeb, 0xfa, 0x54, 0x54, 0xfe, 0x3a, 0x33, + 0x5f, 0x9c, 0x1f, 0xe, 0xba, 0x74, 0x82, 0x37, + 0xe, 0x12, 0x46, 0x86, 0x8d, 0x98, 0x46, 0xfc, + 0x8d, 0x9c, 0x76, 0xf7, 0x50, 0xb4, 0xf4, 0x5a, + 0x6e, 0x23, 0x42, 0x31, 0x71, 0x85, 0x67, 0xfe, + 0x39, 0x54, 0x34, 0x39, 0x54, 0xfa, 0xa, 0x41, + 0x90, 0xfd, 0x1b, 0x11, 0x46, 0x62, 0x76, 0x30, + 0x12, 0xae, 0x6c, 0x82, 0x7d, 0x12, 0x1f, 0x5e, + 0x93, 0x93, 0x37, 0x1f, 0x98, 0x82, 0x6c, 0x76, + 0x30, 0x2c, 0x6c, 0x8d, 0x98, 0x46, 0x1f, 0x98, + 0x8b, 0x98, 0x5e, 0x37, 0x30, 0x76, 0x9f, 0x82, + 0x9c, 0x2c, 0xe, 0x93, 0x8f, 0x82, 0xfc, 0x30, + 0x62, 0x76, 0x28, 0x9c, 0x60, 0xe9, 0xd4, 0xcb, + 0x54, 0xa, 0xa, 0x1, 0xfa, 0x73, 0x34, 0xfa, + 0x1c, 0x73, 0x73, 0x73, 0xeb, 0x34, 0x15, 0x2b, + 0x23, 0x34, 0xf5, 0xf2, 0x3b, 0x48, 0x70, 0x34, + 0x21, 0x34, 0x34, 0xfa, 0x7f, 0xfd, 0x20, 0x90, + 0x55, 0x37, 0x1e, 0x62, 0x93, 0x5e, 0x8d, 0x74, + 0x93, 0x46, 0x7d, 0x74, 0x76, 0x32, 0x62, 0x91, + 0x94, 0x94, 0x6a, 0x41, 0x20, 0x55, 0x8f, 0xaa, + 0xa7, 0xfc, 0x74, 0x74, 0x76, 0x5e, 0x8f, 0x27, + 0x27, 0x74, 0x99, 0x1, 0xf2, 0xf2, 0xf2, 0xf2, + 0x34, 0xf2, 0x3d, 0x16, 0x16, 0x15, 0x3d, 0x14, + 0x14, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3d, + 0xf2, 0xf2, 0x3f, 0x1d, 0x8d, 0x8d, 0x98, 0x98, + 0x8d, 0x8d, 0x98, 0x82, 0xb8, 0xf2, 0x16, 0x16, + 0x16, 0x14, 0x14, 0x14, 0x14, 0xff, 0x14, 0x14, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x16, 0x14, 0x14, 0x16, 0x68, 0x4e, + 0x0, 0xa3, 0x4e, 0x0, 0x0, 0xa3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x19, 0x19, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x37, 0x1f, 0x62, 0x9c, 0x6c, 0x82, 0x62, 0x2c, + 0x28, 0x8d, 0x8f, 0x46, 0x30, 0x46, 0x8b, 0x98, + 0x5e, 0x8d, 0x62, 0xa7, 0xb7, 0xa7, 0x8b, 0x2f, + 0x2f, 0x74, 0x8f, 0x62, 0x12, 0x1b, 0x31, 0x80, + 0x54, 0xfa, 0x3f, 0x15, 0x15, 0x15, 0x21, 0x15, + 0x34, 0xfa, 0x34, 0x34, 0x34, 0x23, 0x3a, 0x7e, + 0xaa, 0xaa, 0x94, 0x55, 0x2c, 0x7e, 0x8f, 0x82, + 0x30, 0x8f, 0x94, 0x8d, 0x8d, 0x62, 0x8f, 0x46, + 0x74, 0xaa, 0x8f, 0x46, 0x11, 0x41, 0x41, 0x63, + 0x8a, 0x34, 0x23, 0x99, 0x85, 0x99, 0x39, 0x48, + 0x23, 0x8a, 0x39, 0x3c, 0xfe, 0x39, 0x23, 0x69, + 0x9d, 0x69, 0x20, 0x33, 0x8e, 0xad, 0xa7, 0x28, + 0x62, 0x74, 0x28, 0x8d, 0x8f, 0x8f, 0x1e, 0x8d, + 0x93, 0x93, 0x37, 0x37, 0x46, 0x9c, 0x7, 0x89, + 0x98, 0x93, 0x5e, 0x8d, 0x98, 0x8d, 0x37, 0x82, + 0x8b, 0x7d, 0x6c, 0x28, 0x7d, 0xa7, 0x7, 0x5e, + 0x8b, 0x98, 0x68, 0x8d, 0x98, 0x93, 0x28, 0x82, + 0x93, 0x76, 0xb7, 0xa8, 0x74, 0x2c, 0xcc, 0x50, + 0x40, 0x13, 0xea, 0xfa, 0x2a, 0xfa, 0xfa, 0xeb, + 0x2a, 0xeb, 0xeb, 0xeb, 0xfa, 0x2b, 0x22, 0x21, + 0xfe, 0x1d, 0x3b, 0x3d, 0x34, 0xfa, 0xeb, 0xf5, + 0xfa, 0xfa, 0xea, 0xc9, 0x6, 0x10, 0x2f, 0x2f, + 0x9c, 0x28, 0x28, 0x89, 0x82, 0x5e, 0x6c, 0xa7, + 0x76, 0x5e, 0x76, 0x82, 0x82, 0x5e, 0x8d, 0x8f, + 0x8f, 0x74, 0x6a, 0x41, 0x11, 0xa7, 0x9c, 0xb3, + 0x28, 0x5e, 0x86, 0x82, 0x5e, 0x9f, 0x68, 0x7d, + 0x6c, 0x8, 0x3, 0x73, 0xeb, 0x16, 0x3d, 0xf2, + 0xee, 0xf2, 0xf2, 0x16, 0x16, 0x3b, 0x3b, 0x16, + 0x14, 0x16, 0x16, 0xff, 0x16, 0x16, 0x16, 0xee, + 0xf2, 0x98, 0x8d, 0x98, 0x4e, 0xa3, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0xd6, 0xde, 0x15, 0x14, + 0x16, 0x14, 0x17, 0x17, 0xff, 0x14, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x28, 0x37, 0x8b, 0xa7, 0xa0, 0x82, 0x8b, 0x8b, + 0x37, 0x8d, 0x8f, 0x8d, 0x82, 0x46, 0x93, 0x76, + 0x7, 0x37, 0x93, 0xa7, 0xf7, 0x8d, 0x98, 0x93, + 0x8d, 0x93, 0x8f, 0x9c, 0xc, 0x83, 0x41, 0xf4, + 0x34, 0xeb, 0xfa, 0x73, 0xeb, 0x21, 0x4d, 0x1a, + 0x48, 0x34, 0x34, 0x34, 0xfa, 0x48, 0x90, 0x44, + 0x2c, 0x60, 0x62, 0x5e, 0x8d, 0x89, 0x98, 0x8d, + 0x5e, 0x7d, 0x46, 0x82, 0xa7, 0x9c, 0x76, 0x79, + 0x93, 0x74, 0x7d, 0x82, 0xa7, 0x94, 0x7a, 0x5b, + 0x6e, 0x73, 0x34, 0x6e, 0x54, 0x73, 0x6e, 0x80, + 0x26, 0x1c, 0x58, 0x3a, 0x4c, 0xfd, 0x69, 0x20, + 0x20, 0x99, 0xaf, 0x5f, 0x9c, 0x2f, 0x6c, 0x5e, + 0x5e, 0x8d, 0x5e, 0x68, 0x76, 0x82, 0x5e, 0x5e, + 0x82, 0x28, 0x7, 0x5e, 0x68, 0x5e, 0x6c, 0x86, + 0x8d, 0x5e, 0x68, 0x5e, 0x68, 0x8d, 0x6c, 0x5e, + 0x8d, 0x6c, 0x7, 0x6c, 0x5e, 0x5e, 0x6c, 0x5e, + 0x82, 0x68, 0xa3, 0x5e, 0x5e, 0x6c, 0x7, 0x6c, + 0x37, 0x9f, 0xf7, 0x37, 0x82, 0x6c, 0x8, 0xe, + 0xe, 0xf3, 0x51, 0xcb, 0xea, 0xf4, 0x73, 0xe6, + 0x2a, 0xd8, 0xf5, 0xeb, 0xeb, 0xfa, 0xeb, 0x2b, + 0x1d, 0x39, 0xfa, 0x2b, 0x2b, 0x2b, 0x34, 0x34, + 0x34, 0x2a, 0xfb, 0x26, 0x11, 0xa7, 0x9f, 0x1e, + 0x6c, 0x28, 0x5e, 0x6c, 0x7, 0x86, 0x9f, 0x8, + 0x6c, 0x5e, 0x9f, 0x32, 0x28, 0x5e, 0x68, 0xa7, + 0xa8, 0x3e, 0x1b, 0xb4, 0xa1, 0x28, 0x6c, 0xe, + 0x9f, 0xa3, 0x68, 0xa3, 0x86, 0x32, 0x9f, 0x9f, + 0xbd, 0xbd, 0xfd, 0xd8, 0x73, 0xeb, 0xeb, 0x16, + 0x3d, 0x16, 0x16, 0x16, 0x16, 0xf2, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3d, 0x3d, + 0xf2, 0x1f, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x9f, 0x0, 0x4e, 0x0, + 0x16, 0xff, 0xff, 0xff, 0x14, 0xff, 0xff, 0xff, + 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, 0x14, 0xff, + 0xff, 0xff, 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7, 0x9f, 0x68, 0x5e, 0xfc, 0x5e, 0x68, 0x68, + 0x68, 0x6c, 0xfc, 0x6c, 0xb8, 0x8, 0x5e, 0x6c, + 0x8, 0xa3, 0x68, 0xa3, 0x5e, 0x28, 0x68, 0xa3, + 0x5e, 0x8, 0xf, 0xf3, 0xbe, 0xbf, 0xd4, 0xc0, + 0xeb, 0xeb, 0xfa, 0x15, 0x2b, 0xfa, 0x1d, 0x99, + 0x26, 0x9, 0x2a, 0x2a, 0x34, 0x88, 0x6a, 0x37, + 0xe, 0x12, 0x32, 0x68, 0x9f, 0x6c, 0xfc, 0x6c, + 0x7, 0xbd, 0xb8, 0xfc, 0xe, 0x28, 0x5e, 0x5e, + 0x5e, 0x1e, 0xfc, 0x5e, 0x6c, 0xb9, 0xbf, 0xe0, + 0xf4, 0x26, 0x8a, 0x26, 0x39, 0x23, 0x9a, 0x90, + 0x9a, 0x73, 0x26, 0x6, 0xbf, 0xcf, 0xcf, 0xfd, + 0x10, 0x50, 0x2f, 0x37, 0x28, 0xe, 0x28, 0x5e, + 0x68, 0x5e, 0xfc, 0xfc, 0x6c, 0x6c, 0xb8, 0x6c, + 0xfc, 0x37, 0x9f, 0x75, 0x5e, 0x5e, 0x1f, 0x68, + 0x5e, 0x68, 0x7, 0x8, 0x37, 0x9f, 0xb6, 0x6c, + 0x28, 0x1f, 0x68, 0x68, 0x5e, 0x5e, 0xfc, 0x1f, + 0x5e, 0x86, 0x9f, 0xb8, 0xfc, 0x28, 0x6c, 0x6c, + 0x37, 0x1f, 0x1f, 0x5e, 0x82, 0x32, 0xf7, 0xf3, + 0x29, 0xb9, 0xc5, 0xc3, 0xe3, 0xfd, 0x4, 0x5a, + 0x51, 0xfb, 0x2a, 0xfa, 0x34, 0x1, 0x2b, 0x2b, + 0xd8, 0xea, 0xea, 0x54, 0xea, 0xf1, 0xea, 0x2a, + 0x92, 0x13, 0x2d, 0x63, 0x60, 0x28, 0x6c, 0xa0, + 0x2f, 0x1f, 0x82, 0xa7, 0x82, 0x5e, 0x1f, 0x37, + 0x8d, 0x68, 0x68, 0x37, 0xa0, 0x28, 0xa7, 0xa6, + 0xb4, 0x1b, 0x20, 0x1b, 0x55, 0x6c, 0x1f, 0x62, + 0x32, 0x5e, 0x79, 0x38, 0xa0, 0xfc, 0x76, 0xa7, + 0xdd, 0x8, 0x27, 0x27, 0x5a, 0x41, 0x54, 0x34, + 0xf2, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x16, 0xee, 0xee, 0x16, 0xf2, 0xf2, 0x1d, 0x8b, + 0x93, 0x93, 0x79, 0x5e, 0x4e, 0xa3, 0x8d, 0x4e, + 0x4e, 0x0, 0x8d, 0x8d, 0x0, 0x4e, 0x82, 0x8d, + 0xff, 0x16, 0xff, 0x14, 0xff, 0xff, 0xff, 0x14, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x14, 0xff, 0xa3, 0x0, 0x0, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x68, 0x8d, 0x8d, 0x1f, 0x82, 0x93, 0x82, + 0x8, 0xa0, 0x30, 0x82, 0x6c, 0x28, 0x82, 0x1f, + 0x28, 0x5e, 0x8d, 0x32, 0x28, 0x1f, 0x82, 0x5e, + 0xb8, 0xa0, 0x55, 0x46, 0xa0, 0x29, 0x6d, 0x20, + 0x54, 0x34, 0x34, 0xfa, 0x15, 0xfa, 0xd8, 0x34, + 0xd8, 0xd8, 0xfa, 0x2a, 0x39, 0x31, 0x6a, 0x2f, + 0x30, 0x55, 0x46, 0x8d, 0x68, 0xae, 0x60, 0x76, + 0x43, 0x5f, 0x76, 0x28, 0x46, 0x98, 0x8d, 0x5e, + 0x8d, 0x62, 0xa7, 0x9f, 0xa7, 0xaf, 0x3, 0x4, + 0x54, 0x6e, 0x69, 0x63, 0x3c, 0xfd, 0x66, 0x63, + 0x6e, 0x2a, 0x2a, 0xf4, 0xf4, 0x88, 0xe3, 0x29, + 0x7e, 0x30, 0x82, 0x82, 0x8b, 0x8f, 0x76, 0x76, + 0x93, 0x9c, 0xa0, 0xa7, 0x98, 0x93, 0x37, 0x5e, + 0x98, 0x98, 0x68, 0x8d, 0x98, 0x98, 0x6c, 0x76, + 0x93, 0x8d, 0x7, 0xe, 0x8b, 0x8d, 0x5e, 0x82, + 0x98, 0x98, 0x68, 0x82, 0x8b, 0x82, 0x6c, 0xb7, + 0x74, 0x76, 0x8, 0x5f, 0x62, 0x82, 0x5e, 0x82, + 0x98, 0x8d, 0x5e, 0x9c, 0x8f, 0x89, 0xa0, 0xa5, + 0x60, 0xa8, 0xc, 0x50, 0x5b, 0x29, 0x3e, 0x6, + 0x7b, 0x72, 0xca, 0x8a, 0xf1, 0xe6, 0x2a, 0x34, + 0x73, 0x73, 0x73, 0xfa, 0xf1, 0xc9, 0xfa, 0x39, + 0x51, 0xa5, 0x44, 0xb2, 0x2c, 0xa7, 0x46, 0x8b, + 0x8b, 0x5e, 0x82, 0x8f, 0x98, 0x5e, 0x82, 0x62, + 0x9c, 0x5e, 0x82, 0x74, 0xa8, 0xa7, 0x62, 0x6a, + 0x6a, 0x6a, 0x99, 0x3a, 0x55, 0x46, 0x8b, 0x8b, + 0x7, 0xb6, 0x8b, 0x8f, 0x7d, 0x5e, 0x8b, 0x89, + 0x98, 0x68, 0x8b, 0x74, 0xb5, 0xd0, 0xcb, 0x73, + 0xde, 0xeb, 0xeb, 0xf2, 0x3d, 0x16, 0x16, 0x16, + 0x16, 0x16, 0x16, 0x16, 0xf2, 0x34, 0x62, 0x93, + 0x4e, 0xa3, 0x98, 0x8d, 0x4e, 0x4e, 0x8d, 0x8d, + 0x0, 0xa3, 0x8d, 0x4e, 0x0, 0x0, 0x8d, 0x68, + 0xde, 0x16, 0xff, 0x14, 0xff, 0x14, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, + 0x0, 0xa3, 0xa3, 0x0, 0x0, 0x4e, 0xa3, 0x0, + 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x0, 0x4e, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xff, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x8d, 0x98, 0x98, 0x82, 0x9c, 0x62, 0x8f, + 0xa7, 0xa9, 0x8f, 0x93, 0x76, 0x82, 0x8b, 0x8d, + 0x8d, 0x93, 0x93, 0x98, 0x5e, 0xa7, 0x9c, 0x93, + 0x28, 0x77, 0x62, 0x46, 0xa7, 0x52, 0xa5, 0x92, + 0xc9, 0xfa, 0xfa, 0x1, 0xfa, 0x15, 0x34, 0xfa, + 0x2a, 0x2a, 0xfa, 0xf1, 0x39, 0x66, 0x61, 0x74, + 0x5f, 0x94, 0xad, 0x1e, 0x76, 0x74, 0x7c, 0x68, + 0x8d, 0x8f, 0x98, 0x68, 0x68, 0x98, 0x7d, 0x76, + 0x93, 0x8f, 0x77, 0xa7, 0x5f, 0x7a, 0x25, 0x51, + 0x54, 0x26, 0x66, 0x66, 0x9a, 0x99, 0x39, 0x88, + 0x88, 0x9, 0x6e, 0xd, 0xd, 0x13, 0x10, 0xa7, + 0x89, 0x8f, 0x5c, 0x76, 0x98, 0x8f, 0xa7, 0xa0, + 0x7c, 0x8f, 0x28, 0x24, 0x93, 0x62, 0x8d, 0x5e, + 0x98, 0x98, 0x68, 0x6c, 0x93, 0x98, 0x7, 0xa0, + 0x46, 0x46, 0x5e, 0x5e, 0x93, 0x98, 0x28, 0x82, + 0x98, 0x8d, 0x5e, 0x6c, 0x74, 0x89, 0x37, 0x4f, + 0x93, 0x46, 0x5e, 0x82, 0x82, 0x8d, 0x5e, 0x37, + 0x93, 0x8d, 0x5e, 0xa9, 0x52, 0x5c, 0x76, 0x77, + 0x8f, 0x2f, 0xe, 0x55, 0x7c, 0x89, 0xb9, 0xaf, + 0x72, 0xc3, 0xd4, 0xca, 0x6e, 0xea, 0x6e, 0xf1, + 0x9, 0x6e, 0x26, 0xf1, 0x23, 0x54, 0xf1, 0x4, + 0x13, 0x10, 0xa0, 0xa5, 0xa9, 0x37, 0x1f, 0x98, + 0x76, 0x86, 0x1e, 0x62, 0x30, 0x5e, 0x76, 0x76, + 0xa0, 0x28, 0x82, 0x93, 0x76, 0xfc, 0x30, 0x6a, + 0x7e, 0xaa, 0x41, 0x4d, 0x58, 0xa0, 0x76, 0x76, + 0xa0, 0xa0, 0x93, 0x82, 0x86, 0xa3, 0x68, 0x5c, + 0x5e, 0xa3, 0x5e, 0x6c, 0xd2, 0xcb, 0xcb, 0xcb, + 0xcb, 0xd8, 0xeb, 0x15, 0xf2, 0xeb, 0xf2, 0xee, + 0x16, 0xee, 0xee, 0xf2, 0xf2, 0xf2, 0x23, 0xa3, + 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0xeb, 0x17, 0x14, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x14, 0xff, 0x16, 0x14, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0xa7, 0x9c, 0x8d, 0x6c, 0xe, 0x55, 0x62, + 0x5c, 0x38, 0x8f, 0x8d, 0x28, 0x5f, 0x89, 0x82, + 0x5e, 0xb8, 0x5f, 0x5e, 0x32, 0x28, 0x79, 0x8d, + 0x1e, 0x82, 0x89, 0x76, 0x6c, 0xa5, 0xbf, 0xc3, + 0xca, 0xc9, 0xa, 0x2a, 0xfa, 0x6e, 0x6e, 0x6e, + 0xf1, 0x6e, 0x54, 0x2a, 0x6e, 0x26, 0x51, 0x44, + 0x5f, 0x89, 0xa4, 0xe, 0x1e, 0x79, 0x8d, 0x68, + 0x5e, 0x38, 0x82, 0x28, 0x68, 0xa7, 0x2c, 0xe, + 0x43, 0x82, 0xa7, 0x75, 0x24, 0x74, 0xaa, 0xa5, + 0x51, 0x39, 0x6e, 0x26, 0x26, 0x6e, 0xdf, 0xea, + 0xf4, 0x69, 0xa1, 0x11, 0x2d, 0x5b, 0x24, 0x6c, + 0x5f, 0x76, 0xa0, 0xb7, 0xa7, 0x76, 0xf, 0xc, + 0x30, 0x82, 0x5e, 0x5e, 0x8d, 0x1f, 0x1e, 0x28, + 0x43, 0x28, 0x6c, 0x4f, 0x82, 0x28, 0x5e, 0x28, + 0x46, 0x1e, 0x5e, 0x5e, 0x43, 0x5e, 0xfc, 0x28, + 0x37, 0x5e, 0x6c, 0xf7, 0x29, 0x82, 0x6c, 0x5e, + 0x76, 0x28, 0x28, 0x82, 0x43, 0x5e, 0x5e, 0x24, + 0x43, 0xa3, 0x5e, 0x8, 0x1f, 0x5c, 0x5e, 0x43, + 0x76, 0x1f, 0x2f, 0x89, 0xae, 0xf7, 0xc, 0xc8, + 0xe9, 0x6d, 0x25, 0x72, 0xd, 0x5a, 0x41, 0xe9, + 0xd4, 0xd, 0x41, 0x4, 0x41, 0x51, 0x13, 0x13, + 0x72, 0x2c, 0xa7, 0x1e, 0x6c, 0xfc, 0x37, 0x28, + 0x68, 0x6c, 0x86, 0x46, 0xf3, 0x8, 0x5e, 0x5e, + 0x6c, 0x28, 0x5e, 0x86, 0xa3, 0x9e, 0x37, 0x3e, + 0xaf, 0xbf, 0x72, 0x4a, 0x1b, 0xa0, 0x5e, 0x9f, + 0x68, 0x68, 0x28, 0xa3, 0xa3, 0xa3, 0xa3, 0x68, + 0x9f, 0xb6, 0x9f, 0x9e, 0x9f, 0x7, 0x9f, 0x9c, + 0xdd, 0xd3, 0xde, 0x1, 0xeb, 0xde, 0x1, 0xf2, + 0xf2, 0xeb, 0xf2, 0x1d, 0x23, 0x1c, 0xa3, 0x4e, + 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0xb8, 0xe1, 0xff, 0xff, 0xff, 0x14, + 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x6c, 0x82, 0x5e, 0x32, 0x5e, 0x37, 0x30, + 0x1f, 0x68, 0x7, 0x6c, 0x24, 0xf3, 0x8, 0x5e, + 0x86, 0x6c, 0x37, 0x32, 0x75, 0xa2, 0x5e, 0x37, + 0x5e, 0x6c, 0x8, 0x8, 0x8, 0xbc, 0xe3, 0x5a, + 0xd, 0x5, 0xf4, 0x23, 0x3, 0x3, 0xd9, 0x4, + 0x39, 0x5a, 0xf4, 0xed, 0x39, 0x13, 0x53, 0x30, + 0x5e, 0x9f, 0x75, 0x75, 0x5e, 0x5e, 0x86, 0x86, + 0x68, 0x5e, 0x8, 0x8, 0x86, 0x32, 0xa7, 0x82, + 0x68, 0x75, 0x75, 0x6c, 0x43, 0xa0, 0xbc, 0xc5, + 0xd, 0x69, 0xf9, 0xf4, 0x26, 0x4d, 0xfd, 0x6e, + 0x88, 0xd, 0xf8, 0x4f, 0xe, 0x38, 0xc, 0xa0, + 0x6c, 0x24, 0x24, 0x28, 0x24, 0x37, 0x5e, 0x5e, + 0x5e, 0x5e, 0x5e, 0x6c, 0x37, 0x8d, 0x28, 0x8, + 0x76, 0x5e, 0x68, 0x28, 0x5e, 0x5e, 0x68, 0x68, + 0x32, 0x8d, 0x5e, 0x6c, 0x5e, 0x68, 0x9f, 0x7, + 0x28, 0x5e, 0x5e, 0x5e, 0x5c, 0x8d, 0x68, 0x75, + 0x8d, 0x43, 0x5e, 0x8, 0x6c, 0x7, 0x5e, 0x28, + 0x6c, 0x5e, 0x86, 0x68, 0x82, 0x5e, 0x75, 0x6c, + 0x37, 0x5e, 0x6c, 0xa0, 0xa0, 0x28, 0x6c, 0x5f, + 0x2f, 0x38, 0xa7, 0x2f, 0x87, 0xb, 0x41, 0xbb, + 0xbf, 0xda, 0xbb, 0xf0, 0xe4, 0x2c, 0xa4, 0x74, + 0x5f, 0x82, 0x6c, 0x37, 0x76, 0x5e, 0x32, 0x5e, + 0xb8, 0xb8, 0x5e, 0x76, 0x37, 0x6c, 0x5e, 0x5e, + 0x79, 0x9f, 0x5e, 0x76, 0x28, 0xb8, 0xaa, 0xaf, + 0x3, 0x3, 0x1b, 0x7d, 0x76, 0x68, 0x86, 0x82, + 0x68, 0x68, 0x5e, 0x79, 0x5e, 0xb8, 0x9f, 0x5e, + 0xa3, 0x9f, 0x9f, 0x68, 0x68, 0xa3, 0x5e, 0x93, + 0x9f, 0xd3, 0x1, 0xeb, 0xeb, 0xeb, 0xe1, 0xeb, + 0x23, 0xfb, 0x23, 0x79, 0xa3, 0x4e, 0x79, 0xa3, + 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0x0, + 0x0, 0xa3, 0x0, 0xff, 0xff, 0x16, 0xff, 0xff, + 0x16, 0x16, 0x14, 0x16, 0x18, 0x0, 0x68, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x86, 0x5e, 0x82, 0x43, 0x76, 0x82, 0xa7, 0x89, + 0x5e, 0xb8, 0xa7, 0x1f, 0x5e, 0x28, 0x76, 0x82, + 0x68, 0x6c, 0x98, 0x86, 0x75, 0x6c, 0x89, 0x28, + 0x5e, 0x28, 0xae, 0x76, 0x28, 0xa0, 0x29, 0x29, + 0x44, 0x3e, 0x4, 0x6e, 0x3, 0x5a, 0xf4, 0xf4, + 0x4, 0xdf, 0x88, 0x26, 0x35, 0x64, 0x62, 0x37, + 0x6c, 0x37, 0x76, 0x8, 0x5e, 0x76, 0xae, 0x8, + 0x43, 0x93, 0x7d, 0x76, 0x76, 0x84, 0x5c, 0x43, + 0x82, 0x5f, 0x37, 0x8, 0xa7, 0xab, 0x50, 0xd4, + 0x4, 0x97, 0x56, 0x56, 0x4c, 0x4c, 0x20, 0x92, + 0x26, 0x20, 0xe8, 0xbb, 0x87, 0x5f, 0x5f, 0x4f, + 0x46, 0x82, 0x82, 0x6c, 0x5c, 0x5c, 0x5e, 0x5e, + 0x89, 0x46, 0x6c, 0x8, 0xa9, 0x9c, 0xf, 0x5c, + 0x5f, 0x8d, 0x68, 0x82, 0x5c, 0x5c, 0x6c, 0x82, + 0x9c, 0x5f, 0x6c, 0x24, 0x5f, 0x5e, 0x5e, 0x5c, + 0x7d, 0x76, 0x5e, 0x82, 0x84, 0x5f, 0xf, 0x7c, + 0xab, 0x89, 0xf7, 0x46, 0x9c, 0x5e, 0x68, 0x5c, + 0x93, 0x43, 0x5e, 0x8d, 0x89, 0x24, 0x37, 0x5f, + 0x9c, 0xa7, 0xa7, 0x46, 0x55, 0x24, 0x8d, 0x89, + 0x84, 0x5c, 0xe, 0x77, 0x6d, 0xa5, 0xa5, 0x6d, + 0x6d, 0x50, 0x30, 0x7c, 0x33, 0x33, 0x33, 0x98, + 0x7d, 0x6c, 0x24, 0x30, 0x9c, 0x8, 0x76, 0x98, + 0x55, 0xe, 0x8d, 0x8b, 0x93, 0x5e, 0x1f, 0x62, + 0x98, 0x6c, 0xa7, 0x62, 0x27, 0xa5, 0x64, 0x8e, + 0x99, 0x39, 0x99, 0x91, 0x98, 0x5e, 0x93, 0x8f, + 0x76, 0x7, 0x9c, 0x8b, 0x93, 0xfc, 0x93, 0x8b, + 0x86, 0x5e, 0x8b, 0x8b, 0xa3, 0xa3, 0x93, 0x89, + 0x7d, 0xd0, 0xa, 0x42, 0xfe, 0x23, 0x42, 0x8b, + 0x98, 0x98, 0x98, 0x98, 0x4e, 0xa3, 0x93, 0x79, + 0x4e, 0x82, 0x82, 0x4e, 0x0, 0x4e, 0x79, 0x68, + 0x0, 0x0, 0x79, 0x68, 0x0, 0x0, 0xa7, 0x0, + 0x4e, 0x68, 0x68, 0x0, 0x68, 0x16, 0xff, 0xff, + 0x14, 0x34, 0xff, 0x68, 0xa2, 0xa3, 0x4e, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x19, 0x19, 0x19, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x19, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x6c, 0x7d, 0x89, 0x1e, 0xa7, 0xa8, 0x9c, + 0x28, 0x24, 0x77, 0x76, 0x5e, 0x8d, 0x7c, 0x38, + 0x28, 0x8d, 0x5c, 0x76, 0x28, 0xf, 0xa7, 0x76, + 0x5e, 0x82, 0x5f, 0x38, 0x5e, 0x93, 0x5c, 0x2f, + 0x33, 0x45, 0xd, 0xdf, 0xb, 0x69, 0x97, 0x26, + 0x1b, 0x53, 0x41, 0x4, 0x35, 0x47, 0x7d, 0x76, + 0x28, 0x7c, 0x5f, 0xc, 0x6c, 0x8d, 0x30, 0xf7, + 0x82, 0x98, 0x8d, 0x82, 0x2f, 0x89, 0x8f, 0x28, + 0x24, 0x93, 0xe, 0xa0, 0x5c, 0x5f, 0x8e, 0xe8, + 0x41, 0x92, 0x97, 0x92, 0x13, 0x13, 0x6, 0xda, + 0xb, 0x53, 0x6d, 0x29, 0xa9, 0x84, 0x37, 0x1f, + 0x7d, 0x5c, 0x82, 0x32, 0x93, 0x89, 0x43, 0x5e, + 0x89, 0x77, 0xa0, 0x37, 0x89, 0x7c, 0xf, 0x5c, + 0x46, 0x8d, 0xa3, 0x75, 0x7d, 0x89, 0x1e, 0x5c, + 0x7c, 0x7d, 0x24, 0x93, 0x8f, 0x8d, 0x68, 0x43, + 0x84, 0x89, 0x8d, 0x89, 0x74, 0x7c, 0x2c, 0x74, + 0xac, 0x7c, 0x37, 0x7d, 0x98, 0x8d, 0x5e, 0x98, + 0x84, 0x8d, 0x28, 0x98, 0x89, 0x76, 0xa7, 0xab, + 0x46, 0x76, 0x37, 0x46, 0x84, 0x5c, 0x43, 0x82, + 0x93, 0xa7, 0x24, 0x2f, 0x2c, 0xb7, 0xf7, 0x38, + 0x55, 0xa4, 0x8d, 0x9c, 0x8b, 0xe, 0x5c, 0x2f, + 0x7c, 0xa0, 0x76, 0x5c, 0x24, 0x28, 0x9f, 0x82, + 0x28, 0x8d, 0x5e, 0x82, 0x76, 0x6c, 0x28, 0x82, + 0x6c, 0x7, 0x28, 0x8d, 0x5c, 0xa7, 0x9c, 0x8e, + 0x5b, 0x69, 0x26, 0x7e, 0x5e, 0x9f, 0x28, 0x5e, + 0x9f, 0x9f, 0x6c, 0x86, 0x68, 0x5e, 0x4e, 0x68, + 0x4e, 0xa3, 0x68, 0x68, 0xa3, 0xa3, 0x9f, 0x5e, + 0x9e, 0xa3, 0x9f, 0xa2, 0xa3, 0xa2, 0x98, 0x93, + 0xa3, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x19, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x75, 0x6c, 0xa7, 0x46, 0x8d, 0x6c, 0x76, 0xa7, + 0x68, 0x6c, 0x5c, 0x82, 0x86, 0x5e, 0x76, 0x24, + 0x75, 0x5e, 0x76, 0x28, 0x5e, 0x82, 0x82, 0x82, + 0x68, 0x75, 0x43, 0xa7, 0x5e, 0x28, 0x89, 0xa0, + 0x24, 0xf7, 0x87, 0xbc, 0x87, 0x29, 0x64, 0x64, + 0x74, 0x64, 0x25, 0x88, 0x45, 0x9c, 0xa7, 0x4f, + 0x8, 0x82, 0x89, 0x76, 0x75, 0x82, 0x8d, 0x75, + 0x5e, 0x8d, 0x82, 0x8, 0xa7, 0x82, 0x76, 0x6c, + 0x24, 0x89, 0x82, 0x6c, 0x76, 0x82, 0x38, 0x3e, + 0x6, 0x97, 0xd, 0x5a, 0x51, 0x2d, 0xe8, 0x50, + 0xc8, 0xa4, 0x46, 0x24, 0x5c, 0x76, 0x75, 0x76, + 0x5c, 0x89, 0x5e, 0x5e, 0x37, 0xa7, 0x7, 0x5e, + 0x76, 0x8d, 0x68, 0x75, 0x8d, 0x8d, 0x5e, 0x5e, + 0x8d, 0x8d, 0x6c, 0x5e, 0x82, 0x37, 0xa0, 0x76, + 0x98, 0x82, 0x86, 0x5e, 0x8d, 0x68, 0x86, 0x8d, + 0x82, 0x5e, 0x7, 0x76, 0x76, 0x76, 0xa0, 0x38, + 0x62, 0x82, 0x5e, 0x8d, 0x8d, 0x32, 0x5e, 0x37, + 0x82, 0x5e, 0x6c, 0x28, 0x5e, 0x68, 0x5e, 0x5c, + 0x82, 0x28, 0x43, 0x82, 0x5e, 0x68, 0x6c, 0x6c, + 0x6c, 0x6c, 0x6c, 0x37, 0x37, 0x28, 0xa7, 0x82, + 0x43, 0x37, 0x28, 0x24, 0x76, 0xa7, 0x28, 0xa7, + 0xe, 0x37, 0x6c, 0x5e, 0x76, 0x43, 0x6c, 0x5e, + 0x5e, 0x9e, 0x9f, 0x6c, 0xb6, 0xb8, 0x8, 0x5e, + 0x86, 0x6c, 0x5e, 0x5e, 0x68, 0x9f, 0x24, 0x60, + 0x6d, 0xb4, 0xe9, 0x2f, 0x6c, 0x9f, 0x6c, 0xa3, + 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0x9e, 0xa3, + 0x4e, 0x4e, 0x7, 0xa3, 0x4e, 0xa3, 0xa3, 0x4e, + 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0xa3, 0xa3, + 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0x0, 0xa3, 0x4e, + 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x4e, 0x0, + 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xee, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x19, 0xff, 0x19, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xeb, 0xff, 0x0, + 0x0, 0x19, 0x19, 0x19, 0x0, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x37, 0x6c, 0x89, 0x5c, 0x6c, 0xf7, 0x1f, 0x82, + 0x5e, 0x6c, 0x28, 0xe, 0x6c, 0x86, 0x6c, 0x76, + 0x5e, 0x6c, 0x76, 0x82, 0x28, 0x28, 0x76, 0x76, + 0x5e, 0x5e, 0x76, 0xae, 0x6c, 0x6c, 0x24, 0x24, + 0x6c, 0x5e, 0xa7, 0x2c, 0x1f, 0x5f, 0x76, 0xa0, + 0xb7, 0x2f, 0xa6, 0xe9, 0xa5, 0x38, 0x5f, 0x5f, + 0x28, 0x82, 0x82, 0x75, 0x5e, 0x32, 0x93, 0x6c, + 0x7, 0xf, 0x24, 0xa0, 0x24, 0x43, 0x82, 0x82, + 0x43, 0x43, 0x82, 0x82, 0x7, 0x24, 0x24, 0xb7, + 0xda, 0xa5, 0x25, 0x2d, 0x35, 0x49, 0x45, 0x45, + 0x30, 0x8d, 0x1e, 0xa7, 0x76, 0x24, 0x6c, 0x24, + 0x24, 0x24, 0x8, 0x68, 0x68, 0x6c, 0x1e, 0x5e, + 0x5e, 0xa3, 0x5e, 0xa3, 0xfc, 0xa3, 0x9f, 0x86, + 0x5e, 0xfc, 0x28, 0x86, 0x9f, 0xa3, 0x86, 0x1e, + 0x5e, 0x4e, 0x5e, 0x86, 0xfc, 0xfc, 0x7, 0x9f, + 0x5e, 0x5e, 0xfc, 0x28, 0x5e, 0x68, 0x5e, 0x24, + 0x12, 0x5e, 0x68, 0x7, 0x28, 0xe, 0xdd, 0x7, + 0x5e, 0x5e, 0x5e, 0xfc, 0x8d, 0x5e, 0xa3, 0x6c, + 0x2f, 0x37, 0x6c, 0x8, 0x6c, 0x24, 0x28, 0x38, + 0x5c, 0x5e, 0x32, 0x89, 0x82, 0xfc, 0x5e, 0x82, + 0x82, 0x8, 0xa7, 0x7d, 0x89, 0x76, 0x24, 0x37, + 0x46, 0x1e, 0x5e, 0x82, 0x82, 0x32, 0x1e, 0x43, + 0x8d, 0x7, 0x8, 0x1e, 0x1f, 0x5e, 0x5e, 0x8d, + 0x28, 0x37, 0x28, 0x82, 0x76, 0xa7, 0x6d, 0x96, + 0x25, 0x25, 0xe, 0x24, 0x5e, 0x68, 0x9f, 0x9f, + 0x68, 0x9f, 0x9f, 0x1e, 0x86, 0xa3, 0x4e, 0x4e, + 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x4e, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x98, 0x4e, + 0xa2, 0x4e, 0x93, 0x4e, 0x4e, 0xa3, 0x79, 0x75, + 0x75, 0x79, 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x4e, 0x68, 0x0, 0x0, 0x68, 0x0, + 0x0, 0xa3, 0xa3, 0x0, 0x0, 0x0, 0x4e, 0xa3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x19, 0x19, 0x19, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x46, 0xae, 0xa9, 0x93, 0x9c, 0xe, 0x89, 0x89, + 0x76, 0x6c, 0x98, 0x7d, 0x8d, 0x5e, 0x82, 0x93, + 0x82, 0xe, 0xa9, 0x89, 0x76, 0x28, 0x5c, 0x89, + 0x76, 0x28, 0x82, 0x8d, 0x43, 0x37, 0x28, 0x89, + 0x5c, 0x24, 0x5f, 0x37, 0xae, 0x4f, 0x30, 0x8c, + 0x62, 0x37, 0x5e, 0x5c, 0x5e, 0x37, 0x8d, 0x43, + 0x76, 0x5c, 0x5f, 0x5f, 0xa7, 0x28, 0x8d, 0x8d, + 0x43, 0x28, 0x8d, 0x82, 0x5e, 0x5e, 0x5c, 0x5c, + 0x5e, 0xa0, 0xa7, 0xa0, 0xa0, 0x24, 0x37, 0x43, + 0x68, 0x32, 0x43, 0x32, 0x75, 0x76, 0x5e, 0x76, + 0x9c, 0x5f, 0x89, 0x43, 0xae, 0x5c, 0x37, 0x5e, + 0xae, 0x5c, 0x8d, 0x86, 0x79, 0x98, 0x46, 0x8d, + 0x98, 0x8d, 0x5e, 0x28, 0x46, 0x8d, 0x9f, 0x6c, + 0x8d, 0x8d, 0x5e, 0x8d, 0x79, 0x5e, 0x28, 0x46, + 0x98, 0x8d, 0x7, 0x7, 0x46, 0x8d, 0x28, 0x82, + 0x98, 0x9f, 0x82, 0x93, 0x8d, 0x82, 0x6c, 0x2c, + 0x55, 0x8d, 0x5e, 0x5f, 0x89, 0x46, 0x8d, 0x46, + 0x98, 0x8d, 0x4e, 0x98, 0x8d, 0x5e, 0x5e, 0xaa, + 0x77, 0x98, 0x5c, 0x74, 0x8f, 0x8d, 0x8d, 0x93, + 0x93, 0x43, 0x5e, 0x89, 0x82, 0x76, 0x24, 0x43, + 0x5e, 0x8, 0xa0, 0xa7, 0x5c, 0x28, 0x5e, 0x5c, + 0x8d, 0x5e, 0x28, 0x43, 0x82, 0xa7, 0x6c, 0x89, + 0x98, 0x68, 0x8d, 0x8f, 0x8f, 0x68, 0x76, 0x98, + 0x98, 0x68, 0xa7, 0x7d, 0x5c, 0x89, 0xab, 0x60, + 0x7a, 0x2d, 0x61, 0x74, 0x7d, 0x75, 0x9f, 0x93, + 0x8b, 0x8f, 0x98, 0x98, 0x98, 0x98, 0x86, 0xa3, + 0x98, 0xa3, 0xa3, 0x86, 0xa2, 0x4e, 0xa2, 0x98, + 0x8d, 0xa2, 0x0, 0x4e, 0x8d, 0x4e, 0x4e, 0x4e, + 0x79, 0xa2, 0x0, 0x79, 0x4e, 0xa2, 0x86, 0xa2, + 0xa2, 0xa2, 0x79, 0xa2, 0xa2, 0xa2, 0x75, 0x4e, + 0x4e, 0x68, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0xff, 0xff, 0xff, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x76, 0xa0, 0x2f, 0x46, 0x76, 0x6c, 0x82, 0x8d, + 0x5e, 0x5e, 0x28, 0x8d, 0x5e, 0x6c, 0x43, 0x5e, + 0x68, 0x5e, 0x76, 0x82, 0x5e, 0x5e, 0x76, 0x5e, + 0x68, 0x9f, 0x6c, 0x5e, 0x5e, 0x37, 0xa7, 0x76, + 0xa7, 0xf3, 0xc, 0x2f, 0x28, 0x68, 0x75, 0x5f, + 0x38, 0x5e, 0x75, 0x5c, 0x24, 0xe, 0xe, 0x9c, + 0xa7, 0xa7, 0x77, 0x62, 0x1f, 0x75, 0x6c, 0x5e, + 0x5c, 0x1e, 0x75, 0x8d, 0x5e, 0xf7, 0xf3, 0x24, + 0x5e, 0x28, 0xa7, 0xe, 0x38, 0x46, 0x82, 0x68, + 0x82, 0x43, 0x43, 0x75, 0xa7, 0xa7, 0x8, 0x2f, + 0x2c, 0xae, 0x37, 0x5e, 0xa0, 0x2f, 0x37, 0x5e, + 0x98, 0x82, 0x5e, 0x8d, 0x98, 0x8d, 0x82, 0x82, + 0x62, 0x93, 0x28, 0x82, 0x98, 0x8d, 0x28, 0x8d, + 0x8b, 0x98, 0x5e, 0x8d, 0x8b, 0x8d, 0x5e, 0xc, + 0x8f, 0x76, 0x6c, 0x5f, 0x98, 0x8d, 0x5e, 0x8d, + 0x8b, 0x79, 0x5e, 0x76, 0x9c, 0x46, 0x7, 0xa6, + 0xaa, 0x8d, 0x37, 0x93, 0x8b, 0x8d, 0x82, 0x93, + 0x98, 0x8d, 0x75, 0x93, 0x93, 0x8d, 0x28, 0xaa, + 0x74, 0x8d, 0x5c, 0x7d, 0x93, 0x75, 0x75, 0x5e, + 0x5c, 0x6c, 0x5e, 0x5f, 0x82, 0x24, 0x4f, 0x9c, + 0x93, 0x2f, 0xc, 0x9c, 0x7c, 0x62, 0x5c, 0x93, + 0x84, 0x98, 0x8d, 0x46, 0x93, 0x82, 0x7, 0x5f, + 0x62, 0x77, 0x2f, 0x7d, 0x8f, 0x8f, 0x46, 0x8e, + 0x8f, 0x82, 0x76, 0xa7, 0x5c, 0x89, 0x7d, 0x77, + 0x61, 0x2d, 0x45, 0x77, 0x89, 0x5e, 0x5e, 0x84, + 0x8f, 0x8d, 0x8b, 0x8b, 0x8b, 0x98, 0x86, 0x86, + 0x98, 0xa2, 0xa2, 0xa2, 0x79, 0x4e, 0x0, 0x8d, + 0x98, 0x86, 0x4e, 0x86, 0x79, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x32, 0x5e, 0xe, 0x12, 0x5e, 0x68, 0x7, 0x28, + 0xe, 0xb8, 0x7, 0x5e, 0x5e, 0x5e, 0xfc, 0x8d, + 0x6c, 0x9f, 0x6c, 0xe, 0x76, 0x6c, 0x7, 0x28, + 0x28, 0x28, 0x1f, 0x5c, 0x89, 0x28, 0x9c, 0x74, + 0x46, 0x5f, 0x46, 0x93, 0x5c, 0x75, 0x82, 0x62, + 0x62, 0x9c, 0xa7, 0x7d, 0x77, 0xa4, 0x44, 0x89, + 0x8d, 0x82, 0x5c, 0x62, 0x82, 0x75, 0x79, 0x46, + 0x46, 0x5f, 0x9c, 0x89, 0x76, 0xa7, 0x77, 0x7c, + 0x93, 0x82, 0x46, 0x98, 0x62, 0x89, 0x98, 0x89, + 0x46, 0xa9, 0x76, 0x5c, 0x5c, 0x89, 0xa7, 0x89, + 0x62, 0x43, 0x5e, 0x5c, 0x82, 0x5c, 0x89, 0x5c, + 0x89, 0x82, 0x28, 0xfc, 0x62, 0x8d, 0x6c, 0x28, + 0x46, 0x38, 0x28, 0x68, 0x79, 0x5e, 0xfc, 0x1f, + 0x8d, 0x8d, 0x5e, 0x7, 0x1f, 0x37, 0x6c, 0x6c, + 0x8d, 0x28, 0x1f, 0x5e, 0x86, 0x68, 0x68, 0x1f, + 0x46, 0x68, 0x5e, 0xb7, 0x2c, 0xe, 0x1e, 0x28, + 0x37, 0x5e, 0xfc, 0x46, 0x8d, 0x68, 0x68, 0x37, + 0x2c, 0x4e, 0x68, 0x6c, 0x37, 0x1f, 0x1f, 0x79, + 0x8d, 0x68, 0x28, 0x38, 0x38, 0x5e, 0x5e, 0x7, + 0x8, 0x43, 0x24, 0x5f, 0x5c, 0x76, 0xa7, 0x5f, + 0x84, 0x8d, 0x5c, 0x5c, 0x8b, 0x5c, 0x82, 0x5c, + 0x8b, 0x82, 0x5e, 0xa9, 0x5f, 0x8d, 0x6c, 0x89, + 0x98, 0x1f, 0x28, 0x98, 0x8d, 0x8d, 0x82, 0x38, + 0x5c, 0x5e, 0x9f, 0x5e, 0x43, 0x76, 0xa7, 0x2f, + 0x5b, 0x40, 0x45, 0x77, 0x28, 0x68, 0x86, 0x9f, + 0xa3, 0x68, 0xa3, 0x9f, 0x9e, 0x4e, 0x4e, 0x9e, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x4e, 0xa2, + 0xa2, 0xa3, 0xa2, 0x4e, 0x4e, 0xa2, 0x86, 0x86, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x19, 0x19, 0x19, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x6c, 0x2c, 0x55, 0x8d, 0x5e, 0x5f, 0x7d, + 0x46, 0x8d, 0x46, 0x98, 0x8d, 0x4e, 0x98, 0x8d, + 0x68, 0x75, 0xaa, 0x55, 0x98, 0x76, 0x74, 0x8f, + 0x8d, 0x82, 0x93, 0x7d, 0x76, 0xa7, 0x7c, 0x8e, + 0x84, 0x89, 0x5c, 0x8c, 0x82, 0x43, 0x89, 0x8c, + 0x77, 0x52, 0x78, 0x57, 0x46, 0x89, 0x46, 0x84, + 0x89, 0x43, 0x93, 0x8f, 0x8d, 0x28, 0x9c, 0x7c, + 0x5c, 0xa9, 0x5f, 0x62, 0x5c, 0x43, 0x98, 0x8f, + 0x8d, 0x5c, 0x8c, 0x7c, 0x9c, 0x89, 0x5f, 0x5c, + 0x5f, 0x5f, 0x5f, 0x93, 0x89, 0x30, 0x5c, 0x84, + 0x62, 0x5c, 0x30, 0x8f, 0x7d, 0x5c, 0x5c, 0x89, + 0x37, 0x76, 0x6c, 0x5e, 0x5e, 0x68, 0xa3, 0x86, + 0x5e, 0x5e, 0x68, 0xa3, 0x9e, 0x5e, 0x9f, 0x7, + 0x7, 0xa3, 0x9e, 0x5e, 0x28, 0x32, 0xa3, 0x9f, + 0x4e, 0x68, 0x86, 0x9f, 0x68, 0x68, 0x68, 0x6c, + 0x9f, 0x5e, 0x9e, 0x9f, 0x5e, 0x5e, 0x86, 0x5e, + 0x5e, 0x68, 0x68, 0x6c, 0x7, 0x5e, 0xa3, 0x28, + 0x46, 0x75, 0x68, 0x5e, 0x8d, 0x68, 0x68, 0x5e, + 0x28, 0x6c, 0x9f, 0x76, 0x4f, 0x24, 0x5e, 0x8d, + 0x89, 0x6c, 0x6c, 0x38, 0x82, 0x5e, 0x75, 0x8d, + 0x8d, 0x28, 0x76, 0x76, 0xa7, 0x5e, 0x9f, 0xf7, + 0xa7, 0x5e, 0x5e, 0x75, 0x32, 0x1e, 0x32, 0x32, + 0x68, 0xa2, 0x9f, 0x7, 0x9f, 0x5e, 0xb6, 0x7, + 0x6c, 0x68, 0x43, 0x5e, 0x75, 0x5e, 0x76, 0x5f, + 0x3e, 0x45, 0x45, 0x2f, 0x5f, 0x5e, 0x68, 0x68, + 0x9f, 0x8d, 0xa3, 0xa3, 0xa2, 0xa2, 0xa2, 0xa3, + 0xa2, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x4e, + 0x4e, 0xa2, 0x4e, 0x0, 0x4e, 0x86, 0x79, 0xa3, + 0xa2, 0x86, 0x8d, 0x75, 0xa2, 0x75, 0x75, 0x4e, + 0x4e, 0xa2, 0x0, 0x0, 0x0, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0xa3, 0x0, + 0x0, 0x0, 0xa3, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x46, 0x7, 0xa6, 0xaa, 0x8d, 0x37, 0x93, 0x8b, + 0x8d, 0x82, 0x93, 0x98, 0x8d, 0x75, 0x7d, 0x93, + 0x8d, 0x37, 0xad, 0x74, 0x82, 0x5c, 0x7d, 0x93, + 0x8d, 0x5e, 0x82, 0xa7, 0x5e, 0x5e, 0x76, 0x30, + 0x46, 0x6c, 0x89, 0x76, 0xa0, 0x4f, 0xae, 0x93, + 0x5c, 0x5f, 0x44, 0x8c, 0x46, 0x75, 0x98, 0x89, + 0x1e, 0x24, 0xa7, 0x89, 0x6c, 0xc, 0x2f, 0x82, + 0x5e, 0x5e, 0x82, 0x62, 0x37, 0x5e, 0x82, 0x76, + 0x24, 0x2f, 0x77, 0x5f, 0x5f, 0xa0, 0x12, 0x5c, + 0x28, 0x8d, 0x8d, 0x8d, 0x38, 0x89, 0x5c, 0xa7, + 0x93, 0x6c, 0x2f, 0x2f, 0x76, 0x6c, 0x76, 0xa7, + 0x38, 0x37, 0x5e, 0x68, 0x8d, 0x8d, 0x28, 0x68, + 0x98, 0x8d, 0x68, 0x6c, 0x5f, 0x79, 0x9f, 0x28, + 0x82, 0x1f, 0x5e, 0x5e, 0x98, 0x79, 0x68, 0xfc, + 0x8d, 0x8d, 0x68, 0x28, 0xa8, 0x37, 0x4e, 0x5e, + 0x98, 0x5e, 0xfc, 0x8d, 0x93, 0x82, 0x5e, 0x5f, + 0xaa, 0x82, 0x68, 0x8d, 0x2f, 0x2f, 0x1f, 0x8b, + 0x8f, 0x98, 0x79, 0x62, 0x98, 0x8d, 0x68, 0x9c, + 0x3e, 0xa9, 0xa7, 0x93, 0x8c, 0x1f, 0x28, 0x8d, + 0x98, 0x79, 0x68, 0x8d, 0x5c, 0x43, 0x5e, 0x6c, + 0x76, 0x43, 0xf7, 0xc, 0x5f, 0x6c, 0x6c, 0x43, + 0x38, 0x75, 0x32, 0x32, 0x8d, 0x75, 0x43, 0x82, + 0x76, 0xa3, 0x68, 0x76, 0xe, 0x28, 0x68, 0x5e, + 0x8d, 0x32, 0x5e, 0x5e, 0x68, 0x5e, 0x43, 0xae, + 0x87, 0x3e, 0x60, 0x2f, 0x89, 0x8d, 0x68, 0x93, + 0x98, 0x8d, 0x8d, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x8d, 0xa3, 0x0, 0x75, 0x8d, 0x86, 0x68, 0x75, + 0x75, 0x75, 0x4e, 0x79, 0x75, 0x4e, 0x0, 0x75, + 0x86, 0xa2, 0x0, 0x4e, 0xa3, 0xa2, 0xa2, 0x4e, + 0x86, 0x68, 0x98, 0xa2, 0xa2, 0xa2, 0x4e, 0x4e, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xe, 0x1e, 0x28, 0x37, 0x5e, 0xfc, 0x46, 0x8d, + 0x68, 0x68, 0x37, 0x2c, 0x4e, 0x68, 0x6c, 0x28, + 0x1f, 0x1f, 0x8d, 0x8d, 0x68, 0x28, 0x38, 0x38, + 0x5e, 0x5e, 0x6c, 0x28, 0x6c, 0x28, 0x7, 0x1f, + 0xe, 0x4f, 0x7, 0x28, 0x43, 0x1e, 0x5c, 0x76, + 0x76, 0x6c, 0x38, 0x93, 0x43, 0x8, 0x7, 0x24, + 0x30, 0x24, 0x28, 0x28, 0x86, 0x28, 0x75, 0x75, + 0x5e, 0x86, 0x28, 0x46, 0x43, 0x8, 0xb7, 0x28, + 0x24, 0x46, 0x37, 0x75, 0x5e, 0x43, 0x1f, 0x82, + 0x8d, 0x86, 0x6c, 0x24, 0x1f, 0xa4, 0xa7, 0xa8, + 0x24, 0x28, 0x28, 0xa7, 0x32, 0x24, 0x8, 0x43, + 0x5c, 0x46, 0x8d, 0x86, 0x8d, 0x98, 0x1e, 0x38, + 0x74, 0x79, 0x5e, 0x37, 0x30, 0x98, 0x68, 0x79, + 0x8b, 0x62, 0x1e, 0x8d, 0x98, 0x8d, 0x68, 0x46, + 0x5f, 0x82, 0x68, 0x68, 0x46, 0x46, 0x5e, 0x8d, + 0x98, 0x8d, 0x1f, 0x93, 0x74, 0x82, 0x5e, 0x2f, + 0x3e, 0xa7, 0x32, 0x8d, 0x62, 0x46, 0x46, 0x98, + 0x8f, 0x98, 0x8d, 0x30, 0x7d, 0xa7, 0x76, 0x74, + 0x44, 0x2f, 0x8d, 0x98, 0x8d, 0x43, 0x43, 0x5c, + 0x5c, 0x9f, 0xa3, 0x76, 0x82, 0x43, 0x28, 0x5c, + 0x9c, 0x8d, 0x5c, 0x93, 0x7d, 0x76, 0x75, 0x8d, + 0x8b, 0x5e, 0x5e, 0x89, 0x76, 0x5e, 0x32, 0x82, + 0x8d, 0x32, 0xa2, 0x82, 0x8d, 0x75, 0x68, 0x75, + 0x75, 0x68, 0x86, 0x86, 0x86, 0x68, 0x5e, 0xa7, + 0xa4, 0x29, 0x77, 0x5c, 0x89, 0x68, 0x68, 0x86, + 0x89, 0x5e, 0x76, 0x0, 0xa3, 0x4e, 0x4e, 0x9e, + 0x82, 0x75, 0x68, 0x98, 0x8d, 0xa2, 0x75, 0x75, + 0x8d, 0x0, 0xa3, 0x98, 0x86, 0xa2, 0x4e, 0x8d, + 0x75, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x4e, 0x86, 0xa3, 0x86, 0xa2, 0x4e, 0x4e, 0x4e, + 0xa2, 0x75, 0x68, 0x68, 0x0, 0x75, 0x75, 0x4e, + 0x0, 0x4e, 0x4e, 0x68, 0x0, 0x0, 0x68, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x68, 0x68, 0x5e, 0x68, 0x68, 0x6c, 0x7, + 0x5e, 0x9e, 0x28, 0x46, 0x75, 0x68, 0x5e, 0x8d, + 0x68, 0x68, 0x5e, 0x28, 0x6c, 0x5e, 0x76, 0x4f, + 0x24, 0x5e, 0x5e, 0x89, 0x43, 0x24, 0xa4, 0x7c, + 0x89, 0x2f, 0x93, 0x84, 0x82, 0x75, 0x82, 0x7c, + 0x7c, 0xf7, 0x9c, 0x52, 0x5f, 0xef, 0x29, 0x98, + 0x76, 0x75, 0x82, 0x76, 0x43, 0xa3, 0x8d, 0x8d, + 0x37, 0x37, 0xa9, 0xab, 0x89, 0xe, 0x44, 0x5c, + 0x76, 0x5e, 0x84, 0x89, 0x43, 0x76, 0x89, 0x82, + 0x37, 0x9c, 0x29, 0x5f, 0x7d, 0x62, 0x5c, 0x33, + 0x77, 0x76, 0xa7, 0x93, 0x93, 0x5f, 0x5c, 0x5c, + 0x89, 0x82, 0x5e, 0x68, 0x6c, 0x82, 0x5e, 0x68, + 0x28, 0x5e, 0x68, 0x68, 0x8d, 0x5e, 0x68, 0x4e, + 0x82, 0x5e, 0x68, 0x5e, 0x7, 0x6c, 0xa3, 0x28, + 0x5e, 0x68, 0xa3, 0x68, 0x68, 0x68, 0x68, 0xa3, + 0x6c, 0x7, 0x5e, 0x68, 0xa0, 0x8, 0x87, 0x73, + 0x41, 0xaf, 0x1, 0x73, 0x69, 0xd, 0xaf, 0x69, + 0x41, 0x73, 0x14, 0x3, 0x5a, 0x3, 0x2c, 0x8d, + 0x79, 0x32, 0x9f, 0x32, 0x5e, 0x68, 0x86, 0xb, + 0x51, 0x73, 0x51, 0x88, 0xa1, 0x75, 0x28, 0x5c, + 0x46, 0x5e, 0x82, 0x43, 0x5c, 0x5c, 0x43, 0x76, + 0x82, 0x75, 0x5e, 0x1f, 0x76, 0xa9, 0x54, 0x51, + 0x88, 0x16, 0x3, 0xd, 0xaf, 0xd, 0x51, 0xd, + 0xaf, 0xd, 0xa, 0x1, 0xa5, 0x51, 0xa7, 0x8, + 0x24, 0xa7, 0x37, 0x6c, 0x82, 0x8d, 0x8d, 0x98, + 0x76, 0x5e, 0x86, 0xa3, 0xa3, 0x9e, 0x4e, 0x3, + 0x6e, 0xaf, 0xa3, 0x75, 0x68, 0xa2, 0xa0, 0x76, + 0x75, 0xa2, 0x4e, 0xa2, 0x75, 0x86, 0x86, 0x68, + 0x68, 0x4e, 0x4e, 0xa2, 0x4e, 0x4e, 0x4e, 0xa2, + 0xb6, 0x68, 0x75, 0x86, 0x68, 0x68, 0x4e, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x5e, 0x5f, 0xaa, 0x82, 0x68, 0x8d, 0x2f, + 0x2f, 0x1f, 0x8b, 0x8f, 0x98, 0x79, 0x62, 0x98, + 0x8d, 0x68, 0x9c, 0x3e, 0xa9, 0xa7, 0x93, 0x8c, + 0x1e, 0x43, 0x98, 0x98, 0x5c, 0x28, 0x98, 0x8f, + 0x84, 0x46, 0x8e, 0x8f, 0x8d, 0x76, 0x77, 0x8e, + 0x33, 0xa5, 0xb1, 0x64, 0x33, 0x33, 0x62, 0x8f, + 0x8d, 0x75, 0x46, 0x62, 0x32, 0x68, 0x9c, 0x9c, + 0x30, 0x2f, 0x64, 0x7c, 0x8f, 0x7d, 0x33, 0x62, + 0x5e, 0x8d, 0x89, 0x74, 0x30, 0x93, 0xaa, 0xad, + 0x1f, 0x2f, 0x57, 0x8f, 0x76, 0x84, 0x7d, 0x62, + 0x47, 0x84, 0x5c, 0x8b, 0x93, 0x62, 0x30, 0x89, + 0x89, 0x5e, 0x5e, 0xfc, 0xf7, 0x68, 0x86, 0x5e, + 0x5e, 0x28, 0x68, 0xa3, 0x5e, 0x9f, 0xa3, 0xf, + 0x7, 0x9f, 0x68, 0x68, 0x37, 0x68, 0x5e, 0x68, + 0x68, 0x32, 0xa3, 0x68, 0x68, 0x9f, 0xa3, 0x37, + 0x8, 0x68, 0xa3, 0x5e, 0x5e, 0x1f, 0x24, 0x51, + 0x5e, 0x72, 0xb, 0xfc, 0x68, 0x9f, 0x9f, 0xa3, + 0x1f, 0x5e, 0xa3, 0x40, 0x51, 0x24, 0xb, 0x96, + 0x5e, 0x6c, 0x5e, 0x1e, 0x37, 0x8, 0xb, 0x87, + 0x88, 0x5e, 0x68, 0x8d, 0x40, 0x87, 0x28, 0x43, + 0x76, 0x75, 0x86, 0x6c, 0x24, 0xe, 0x5e, 0x5e, + 0x68, 0x5e, 0xa3, 0x75, 0x68, 0xae, 0x6, 0x75, + 0xa, 0xa4, 0x68, 0x4e, 0x68, 0x86, 0xa3, 0x86, + 0xa3, 0xa2, 0xa2, 0xa5, 0x50, 0x6d, 0xa0, 0x68, + 0x5e, 0x5e, 0x5e, 0x68, 0x82, 0x86, 0x8d, 0x89, + 0x86, 0xa2, 0xa2, 0x4e, 0x4e, 0x79, 0x4e, 0x6, + 0x50, 0xa4, 0xa3, 0xa2, 0x4e, 0xb4, 0xa4, 0x3, + 0x9f, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0xa0, 0x9f, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x75, 0x4e, 0x0, + 0x86, 0x79, 0x79, 0x75, 0x75, 0x75, 0x0, 0x4e, + 0x0, 0x75, 0xa2, 0x68, 0x0, 0xa3, 0x75, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x5e, 0x2f, 0x3e, 0xa7, 0x5e, 0x8d, 0x62, + 0x46, 0x46, 0x98, 0x8f, 0x98, 0x8d, 0x30, 0x7d, + 0xa7, 0x76, 0x74, 0x44, 0x2f, 0x8d, 0x98, 0x79, + 0x28, 0x43, 0x43, 0x5c, 0x6c, 0x86, 0x8d, 0x5c, + 0x8d, 0x75, 0x38, 0x7c, 0x82, 0xb6, 0xa7, 0x77, + 0x12, 0x5f, 0x2f, 0x93, 0x8d, 0x38, 0x93, 0x8d, + 0x86, 0x86, 0x6c, 0x37, 0x68, 0x68, 0x6c, 0x75, + 0x1e, 0x5c, 0x8d, 0x8d, 0x75, 0x1e, 0x46, 0x37, + 0x86, 0x76, 0xa7, 0x87, 0x28, 0x75, 0x75, 0x79, + 0x68, 0x37, 0x76, 0x75, 0x82, 0x5e, 0x76, 0x5f, + 0x5f, 0x5e, 0x5e, 0x76, 0x28, 0x43, 0x28, 0x6c, + 0x6c, 0x76, 0x68, 0xfc, 0x79, 0x75, 0x8d, 0x8d, + 0x98, 0x38, 0x43, 0x68, 0x9c, 0xf7, 0xfc, 0xf, + 0x82, 0x82, 0x68, 0x5e, 0x5c, 0x79, 0x68, 0x9f, + 0x98, 0xa7, 0x1e, 0x8d, 0x82, 0x37, 0x68, 0x28, + 0x46, 0x8d, 0x5e, 0x79, 0x93, 0x7d, 0x82, 0x6e, + 0x7c, 0x3, 0x24, 0x98, 0x89, 0x6c, 0x5e, 0x46, + 0x7d, 0x1e, 0x68, 0x8d, 0x84, 0x54, 0x7c, 0x99, + 0x64, 0xae, 0x8, 0x46, 0x7d, 0x8d, 0xaf, 0x51, + 0x7d, 0x5e, 0x5e, 0x8d, 0x8d, 0xa4, 0x4e, 0x8d, + 0xa7, 0x9e, 0x5e, 0x37, 0x82, 0x28, 0x68, 0x8d, + 0x5e, 0xa3, 0x68, 0x75, 0x8d, 0x68, 0x26, 0xa9, + 0x41, 0xa3, 0xa2, 0x75, 0xa3, 0x4e, 0xa3, 0x86, + 0xa3, 0xa3, 0xa3, 0xa4, 0x2c, 0x5a, 0xa3, 0x86, + 0x68, 0x68, 0x68, 0x5e, 0x68, 0xa2, 0x86, 0x82, + 0x8d, 0x0, 0x8d, 0x4e, 0x4e, 0x4e, 0x4e, 0x6, + 0x6, 0x0, 0x79, 0x75, 0xa2, 0x3, 0x89, 0x69, + 0x8, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0xb, 0x6, + 0x0, 0x9e, 0x9e, 0x4e, 0x0, 0xa2, 0x0, 0x4e, + 0x79, 0x68, 0x75, 0x0, 0x68, 0x68, 0x0, 0x0, + 0x4e, 0x0, 0x86, 0x0, 0x0, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8, 0x5e, 0x5e, 0x8d, 0x68, 0x68, 0x68, 0x79, + 0x68, 0x68, 0x8d, 0x8d, 0x5e, 0x86, 0x68, 0x28, + 0x7, 0x68, 0x8d, 0x79, 0x68, 0x9f, 0x68, 0x5e, + 0x32, 0xa3, 0x5e, 0x9f, 0xa3, 0x86, 0x9f, 0x9f, + 0x68, 0xb6, 0xb8, 0x6c, 0xa3, 0x28, 0x6c, 0x75, + 0x5e, 0x5e, 0x24, 0x24, 0x28, 0x86, 0x9f, 0xb6, + 0xa3, 0x86, 0x9f, 0x9f, 0x86, 0x4e, 0x68, 0x86, + 0xa2, 0x86, 0x6c, 0x43, 0xa3, 0x9f, 0x5e, 0xa0, + 0x6c, 0x5e, 0x6c, 0xa3, 0x86, 0xa3, 0x9f, 0x86, + 0xa3, 0x5e, 0x5e, 0xb8, 0xb8, 0x1e, 0x28, 0x6c, + 0x24, 0x28, 0xfc, 0x8, 0x5c, 0x82, 0x6c, 0xa7, + 0x46, 0x37, 0x6c, 0x75, 0x98, 0x98, 0x5e, 0x8d, + 0x89, 0x7c, 0x5e, 0x76, 0x89, 0x93, 0x5e, 0x82, + 0x8c, 0x8d, 0x8d, 0x82, 0x8b, 0x5c, 0x32, 0x8d, + 0x7d, 0x24, 0x68, 0x82, 0x89, 0x8d, 0x68, 0x8d, + 0x98, 0x8d, 0x9f, 0x8d, 0x93, 0x5c, 0x7, 0x88, + 0x7c, 0x88, 0x43, 0x93, 0x98, 0x5c, 0x5e, 0x98, + 0x98, 0x75, 0x5e, 0x43, 0x84, 0x50, 0x5a, 0x78, + 0x99, 0xa0, 0x8d, 0x5c, 0x82, 0x29, 0x2c, 0x69, + 0x8d, 0x68, 0x5e, 0xa7, 0x5f, 0x24, 0x79, 0x89, + 0x93, 0x5c, 0xf, 0x84, 0x8b, 0x8d, 0xa2, 0x98, + 0x38, 0x75, 0x86, 0x98, 0x32, 0x28, 0x5a, 0x5b, + 0xaa, 0x0, 0x75, 0x79, 0x75, 0xa2, 0xa3, 0x68, + 0xa2, 0x86, 0xa2, 0xc, 0x73, 0x9f, 0xa3, 0xa3, + 0x86, 0xa3, 0x68, 0x76, 0x82, 0x68, 0x86, 0x8d, + 0x8d, 0xa3, 0x8d, 0x4e, 0x4e, 0xa3, 0x4e, 0xa1, + 0x5, 0x4e, 0x75, 0x79, 0x75, 0x82, 0xaf, 0x3e, + 0x0, 0x4e, 0xa2, 0x4e, 0x4e, 0x0, 0xa0, 0xb, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x4e, + 0x0, 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x1f, 0x5e, 0x5e, 0x5e, 0x6c, 0xfc, 0x1e, 0x5e, + 0x9f, 0x9f, 0xa3, 0x1f, 0x5e, 0xa3, 0x5e, 0x5e, + 0xfc, 0xfc, 0x8d, 0x5e, 0x6c, 0x6c, 0x1e, 0x37, + 0x8, 0x5e, 0x32, 0x8d, 0x5e, 0x9f, 0x5e, 0x29, + 0x1e, 0x5e, 0x43, 0x8d, 0x1e, 0x24, 0x5c, 0x9c, + 0x5e, 0xa7, 0x50, 0x61, 0x43, 0x8d, 0x89, 0x38, + 0xe, 0x28, 0x79, 0x8d, 0x4e, 0xfc, 0x1e, 0x8d, + 0x5e, 0x86, 0x77, 0xf3, 0x24, 0x8d, 0x82, 0x5c, + 0x1e, 0x1e, 0x98, 0x79, 0x86, 0x32, 0x38, 0x24, + 0x9f, 0x8d, 0x7c, 0x87, 0x44, 0x7d, 0x7c, 0x8c, + 0x7d, 0x76, 0x38, 0x2f, 0x84, 0x8d, 0x8d, 0x5c, + 0x33, 0x93, 0x8d, 0x75, 0x82, 0x43, 0x28, 0x24, + 0x76, 0x82, 0x5e, 0x28, 0x46, 0x5e, 0x68, 0x8d, + 0x8d, 0x30, 0x82, 0x82, 0x76, 0xa7, 0x37, 0xe, + 0x89, 0x75, 0x86, 0x5e, 0x37, 0x1f, 0x86, 0x5e, + 0x75, 0x5e, 0xfc, 0x37, 0x76, 0xa7, 0x28, 0x3, + 0x55, 0x69, 0x5e, 0x8d, 0x8d, 0x1e, 0x5e, 0x82, + 0x75, 0x6c, 0x6c, 0x46, 0x5c, 0x6c, 0x34, 0x37, + 0x2b, 0x46, 0x5e, 0x8d, 0x8d, 0x52, 0xa5, 0x5a, + 0x5e, 0x5e, 0x68, 0x43, 0x28, 0x37, 0x68, 0x75, + 0x75, 0xa2, 0x75, 0x43, 0x75, 0x75, 0x4e, 0x32, + 0x37, 0x68, 0xa2, 0x68, 0x75, 0x86, 0xaf, 0x4f, + 0x87, 0x4e, 0xa2, 0xa2, 0x86, 0x4e, 0x4e, 0xa2, + 0xa3, 0xa3, 0xa2, 0x86, 0x1, 0x86, 0xa2, 0xa3, + 0xa2, 0x86, 0xa3, 0x82, 0x75, 0x98, 0x93, 0x98, + 0x9e, 0xa3, 0xa3, 0x0, 0x4e, 0x0, 0x4e, 0x6, + 0xb, 0x0, 0x4e, 0x0, 0x4e, 0x8, 0xa0, 0xa0, + 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x8, 0x5, + 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, + 0x4e, 0x68, 0x79, 0x4e, 0x0, 0x75, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7d, 0x8d, 0x93, 0x74, 0xa9, 0x24, 0x98, 0x89, + 0x1e, 0x5e, 0x46, 0x7d, 0x1f, 0x5e, 0x82, 0x8b, + 0x98, 0x89, 0x8f, 0x62, 0x5f, 0xa7, 0x46, 0x62, + 0x8d, 0x5e, 0x89, 0x93, 0x43, 0x32, 0x89, 0x93, + 0x98, 0x68, 0x93, 0x8b, 0x8d, 0x1e, 0x5f, 0x77, + 0xa7, 0x5c, 0xa5, 0x7a, 0x8f, 0x5e, 0x8f, 0x8f, + 0x98, 0x68, 0x98, 0x98, 0x5e, 0x68, 0x8f, 0x7c, + 0x6c, 0x82, 0x7c, 0x77, 0x5f, 0x93, 0x8f, 0x98, + 0x8d, 0x5c, 0x98, 0x89, 0x6c, 0x79, 0x8f, 0x9c, + 0xf7, 0x82, 0x8f, 0x8f, 0x5c, 0x8f, 0x89, 0x8c, + 0x62, 0x8d, 0x89, 0x84, 0x93, 0x5c, 0x5c, 0x8d, + 0x7d, 0x5c, 0x43, 0x9f, 0x76, 0x75, 0x5e, 0x76, + 0x82, 0x75, 0x75, 0x75, 0x5c, 0x82, 0x68, 0x5e, + 0x76, 0x24, 0x43, 0xa7, 0x5f, 0x93, 0x75, 0x82, + 0x82, 0x5e, 0x68, 0x75, 0x8d, 0x82, 0x6c, 0x5e, + 0x76, 0x43, 0x5e, 0x76, 0x24, 0x6c, 0x8d, 0x88, + 0x89, 0x51, 0x6c, 0x5c, 0x82, 0x43, 0x6c, 0x6c, + 0x76, 0x6c, 0x68, 0x8d, 0x82, 0x5e, 0x73, 0x8d, + 0x73, 0x82, 0x28, 0x3e, 0x34, 0x4, 0xa7, 0x51, + 0x5a, 0x51, 0x9f, 0x75, 0x75, 0x24, 0xa1, 0x73, + 0x5a, 0x51, 0x6, 0xd, 0xb4, 0x2, 0x6, 0x87, + 0x75, 0x4e, 0xa3, 0x5e, 0x68, 0xa3, 0x6, 0x52, + 0x4f, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0xa3, 0x86, + 0xa3, 0xa2, 0xa3, 0xa3, 0x68, 0x5e, 0xa3, 0x86, + 0x75, 0x86, 0x9f, 0x75, 0x9f, 0xa3, 0x28, 0x68, + 0xa3, 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0xa2, 0x6, + 0x6, 0xa2, 0x4e, 0xa2, 0x0, 0x9, 0xa0, 0x3, + 0x9f, 0x0, 0x0, 0xa0, 0x5a, 0x6, 0x9f, 0x5, + 0xb, 0x88, 0x4e, 0x4e, 0x0, 0x93, 0x4e, 0x4e, + 0x9e, 0x79, 0x75, 0x75, 0x79, 0x4e, 0x0, 0x0, + 0x0, 0x4e, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x89, 0x7, 0x82, 0x98, 0x5f, 0x28, 0x93, 0x93, + 0x8d, 0x5e, 0x93, 0x8b, 0x8d, 0x32, 0x82, 0x7d, + 0x76, 0xa7, 0x93, 0x8f, 0xa0, 0x82, 0x5c, 0x93, + 0x5e, 0x5e, 0x8d, 0x8d, 0x5e, 0x9f, 0x75, 0x75, + 0x8d, 0x5e, 0x28, 0x9c, 0x76, 0x68, 0xa7, 0xa4, + 0x24, 0x76, 0x62, 0x84, 0x82, 0x28, 0x46, 0x98, + 0x82, 0x86, 0x28, 0xa7, 0x28, 0x86, 0x79, 0x76, + 0xfc, 0x68, 0x8d, 0x82, 0x82, 0x28, 0x38, 0x46, + 0x5e, 0x5e, 0x76, 0xa0, 0xf7, 0x6c, 0x8d, 0x8d, + 0x5e, 0x28, 0x93, 0x8d, 0x28, 0x82, 0x8d, 0x46, + 0x38, 0x28, 0x5e, 0x75, 0x28, 0x24, 0xe, 0x24, + 0x28, 0x5e, 0x43, 0x24, 0x43, 0x75, 0x68, 0x68, + 0x1e, 0x1e, 0x86, 0x68, 0x82, 0x5e, 0xfc, 0x24, + 0xa0, 0x5e, 0x5e, 0x24, 0x33, 0x5c, 0x68, 0x5e, + 0x43, 0xfc, 0xf, 0x68, 0x6c, 0x7, 0x6c, 0x24, + 0x5f, 0x5e, 0x86, 0x6c, 0x5c, 0x46, 0x5e, 0x51, + 0x8d, 0x51, 0x24, 0x1f, 0x24, 0x8, 0x5e, 0x1e, + 0x5c, 0x32, 0xa2, 0x68, 0x68, 0x1e, 0x6e, 0xa6, + 0x5, 0x8, 0xf7, 0x2f, 0x26, 0x9, 0x2c, 0x34, + 0x41, 0x52, 0x28, 0x5c, 0xaf, 0xd, 0x72, 0xe, + 0xe, 0x68, 0x68, 0x79, 0x79, 0xfc, 0x2c, 0x41, + 0x88, 0x24, 0x68, 0x1e, 0x5e, 0x5e, 0x51, 0x2c, + 0x3e, 0x28, 0x86, 0x79, 0x68, 0xa2, 0x68, 0xa7, + 0x25, 0xa2, 0xa3, 0x75, 0x75, 0xa2, 0xa2, 0x75, + 0x68, 0x9f, 0x82, 0x98, 0x8f, 0x98, 0x98, 0x98, + 0x98, 0xa3, 0xa3, 0x98, 0xa2, 0xa3, 0xa3, 0xaf, + 0x6, 0x4e, 0x98, 0x79, 0xa3, 0x50, 0x8, 0x69, + 0x4e, 0x4e, 0x4e, 0x89, 0x6, 0x6, 0x9b, 0x6, + 0xa0, 0x50, 0xa2, 0x4e, 0x4e, 0x8d, 0x4e, 0x4e, + 0x4e, 0x75, 0x0, 0x4e, 0x86, 0x4e, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x6c, 0x7, 0x1e, 0x24, 0x5e, 0x5e, 0x5e, 0x5e, + 0x28, 0x5e, 0x5e, 0x5e, 0x6c, 0x6c, 0x28, 0x82, + 0x6c, 0x28, 0xfc, 0xf7, 0x43, 0x5e, 0x6c, 0x5c, + 0x37, 0x5e, 0x9f, 0x32, 0x5e, 0x28, 0x68, 0x7, + 0xb6, 0x9f, 0xe, 0x24, 0x6c, 0x86, 0x6c, 0x1f, + 0x46, 0x5e, 0x5e, 0x5e, 0x6c, 0x1e, 0x1f, 0xf7, + 0xb8, 0x9f, 0xfc, 0x1e, 0x68, 0x4e, 0xa3, 0x9e, + 0xfc, 0x37, 0x5e, 0xb6, 0xb8, 0xf7, 0x1f, 0x1e, + 0x6c, 0x9f, 0x86, 0x28, 0x1e, 0x86, 0x86, 0x5e, + 0xfc, 0x1e, 0x5e, 0x6c, 0xb8, 0x7, 0x8, 0x38, + 0x38, 0x37, 0x6c, 0x7, 0x24, 0xe, 0x5c, 0x24, + 0x5c, 0x5e, 0x5e, 0x5e, 0x46, 0x79, 0x86, 0x5e, + 0x8d, 0x46, 0x5e, 0x82, 0x89, 0x5f, 0x82, 0x46, + 0x93, 0x46, 0x8d, 0x82, 0x62, 0x93, 0x82, 0x8d, + 0xa7, 0xa7, 0x5e, 0x82, 0x5f, 0x43, 0x68, 0x8d, + 0x89, 0x8d, 0x5e, 0x82, 0x93, 0x76, 0xa7, 0x69, + 0xa9, 0xc9, 0xe, 0x93, 0x46, 0x37, 0x68, 0x79, + 0x98, 0x68, 0x75, 0x8d, 0x8d, 0x8, 0xf4, 0x6e, + 0x9b, 0xb7, 0x28, 0x7c, 0x98, 0x87, 0x87, 0x69, + 0x98, 0x5e, 0x43, 0x98, 0x99, 0x6, 0x92, 0x98, + 0x8f, 0x5e, 0x68, 0x8d, 0x8b, 0x8d, 0x8d, 0x98, + 0x97, 0x92, 0x86, 0x98, 0x8d, 0x5e, 0xd, 0xaa, + 0x78, 0x68, 0x4e, 0x64, 0xd, 0x6, 0x41, 0x97, + 0x3, 0xa3, 0xa2, 0x79, 0x4e, 0xa3, 0xa2, 0x79, + 0x86, 0xa2, 0x98, 0x84, 0x98, 0x98, 0x8b, 0x98, + 0x98, 0xa3, 0xa3, 0x98, 0xa3, 0x8, 0xa0, 0x88, + 0xb, 0x0, 0x8d, 0x98, 0x86, 0xa0, 0x4f, 0x41, + 0x4e, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x8, 0x6, + 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x32, 0x28, 0x82, 0x86, 0x5e, 0x5e, 0x5c, + 0x75, 0x6c, 0x6c, 0x8d, 0x1e, 0x5e, 0x8d, 0x89, + 0x37, 0x75, 0x5c, 0x93, 0x5c, 0x5e, 0x43, 0x7d, + 0x76, 0x76, 0x43, 0x76, 0xa7, 0x68, 0x8d, 0x5f, + 0x28, 0x75, 0x8d, 0x93, 0x8d, 0x5e, 0x82, 0x98, + 0x76, 0x76, 0x76, 0xae, 0xb7, 0xe, 0x93, 0x46, + 0x28, 0x68, 0x79, 0x98, 0x68, 0x75, 0x8d, 0x8d, + 0x6c, 0x37, 0x82, 0xa8, 0xc8, 0xf7, 0x62, 0x98, + 0x68, 0x8d, 0x8d, 0x98, 0x5e, 0x8d, 0x98, 0x98, + 0x6c, 0xa7, 0x8f, 0x74, 0x29, 0x60, 0x49, 0x8c, + 0x7d, 0x76, 0x8d, 0x7c, 0x9c, 0x5c, 0x82, 0x82, + 0x7c, 0x7d, 0x5e, 0x8d, 0x93, 0x93, 0xfc, 0x82, + 0x89, 0x9c, 0x79, 0x46, 0x8e, 0x94, 0x93, 0x98, + 0x8f, 0x7d, 0x82, 0x89, 0x94, 0xad, 0xe, 0x62, + 0x5b, 0x5f, 0x5e, 0x79, 0x7d, 0x46, 0x5e, 0x98, + 0x8f, 0x5e, 0x1f, 0x9c, 0x8f, 0xa7, 0xa7, 0x7f, + 0x52, 0x88, 0x37, 0x93, 0x8f, 0x5c, 0x5f, 0x98, + 0x98, 0x79, 0x1e, 0x46, 0x93, 0x6, 0x6d, 0x8a, + 0x33, 0xc, 0x76, 0x84, 0x8d, 0x52, 0xa5, 0x69, + 0x43, 0x9f, 0x5e, 0x43, 0xa4, 0x51, 0x51, 0x68, + 0x68, 0x86, 0xa3, 0x68, 0x68, 0x4e, 0x9f, 0x88, + 0xd, 0x5, 0x4e, 0xa3, 0x4e, 0xa3, 0x6, 0xa4, + 0x4f, 0x9f, 0x9, 0x2, 0x72, 0x5, 0x5a, 0x6, + 0x3, 0x6c, 0xa3, 0xa3, 0xa2, 0x0, 0x86, 0x4e, + 0xa2, 0x4e, 0x9e, 0xa3, 0x9f, 0xa3, 0x9f, 0xa3, + 0x4e, 0x8, 0xb4, 0xd8, 0x9, 0x6, 0xb, 0x51, + 0x6, 0x0, 0x4e, 0x0, 0x4e, 0xa0, 0xa0, 0xbb, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0xa0, 0x6, + 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x68, 0x68, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x37, 0x75, 0x75, 0x89, 0x5c, 0x6c, 0x8d, 0x84, + 0x93, 0x1e, 0x8d, 0x9c, 0x89, 0x79, 0x46, 0x8e, + 0x8c, 0x89, 0x7d, 0x8f, 0x74, 0x76, 0x7c, 0x8c, + 0x9c, 0x24, 0x7d, 0x64, 0x5c, 0x5e, 0x79, 0x62, + 0x46, 0x5e, 0x98, 0x8f, 0x76, 0x1e, 0x9c, 0x8f, + 0xa7, 0xa7, 0x74, 0x3e, 0xa9, 0x28, 0x93, 0x8f, + 0x46, 0x38, 0x8b, 0x8b, 0x79, 0xfc, 0x46, 0x93, + 0xa0, 0xa0, 0x62, 0x27, 0x29, 0x76, 0x8f, 0x98, + 0xf, 0x1f, 0x8f, 0x8b, 0x82, 0xa7, 0x62, 0x93, + 0xa7, 0x5f, 0x8f, 0x8f, 0x27, 0x7e, 0x57, 0x62, + 0x7d, 0x5c, 0x38, 0x62, 0x93, 0x89, 0x76, 0x98, + 0x30, 0x1f, 0x43, 0x86, 0xa7, 0xae, 0x12, 0x93, + 0x62, 0x8d, 0x5e, 0x1e, 0x62, 0x93, 0x8d, 0x8d, + 0x62, 0x55, 0x46, 0x82, 0xa8, 0xa6, 0x12, 0x30, + 0x46, 0x8d, 0x68, 0xf, 0x30, 0x46, 0x5e, 0x8d, + 0x76, 0xa7, 0x5f, 0x46, 0x9c, 0xc, 0xf7, 0x26, + 0x62, 0x69, 0x86, 0x8d, 0x93, 0x30, 0x1f, 0x8d, + 0x8d, 0x9f, 0x28, 0x46, 0x8d, 0x6e, 0x51, 0x89, + 0x30, 0x46, 0x5e, 0x8d, 0x8d, 0xa5, 0x3e, 0x69, + 0x1f, 0x5e, 0x68, 0x68, 0x28, 0x1e, 0x68, 0x68, + 0x68, 0x68, 0xf6, 0x40, 0xa5, 0x4, 0x73, 0xa4, + 0x26, 0x6, 0x68, 0xa3, 0xa3, 0x68, 0x41, 0x2c, + 0xa1, 0x88, 0x7, 0x68, 0x68, 0xa3, 0xa3, 0x6c, + 0x92, 0xa3, 0xa3, 0xa2, 0x86, 0xa2, 0xa3, 0x68, + 0xa2, 0xa3, 0x9f, 0x9f, 0x98, 0xa3, 0xa3, 0xa5, + 0x1, 0x3, 0xa7, 0xa2, 0x0, 0x4e, 0x0, 0x5, + 0xb, 0x0, 0x4e, 0x4e, 0x4e, 0xa0, 0xa0, 0x6, + 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x8, 0xb, + 0x4e, 0x79, 0xa3, 0x0, 0x0, 0x8d, 0x76, 0x0, + 0x68, 0x68, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x75, 0x68, 0x75, 0x1f, 0x1f, 0x5e, 0x5e, 0x24, + 0xae, 0xe, 0x93, 0x62, 0x8d, 0x5e, 0x1f, 0x62, + 0x89, 0x89, 0x89, 0x55, 0x55, 0x38, 0x82, 0xa9, + 0x87, 0x12, 0x38, 0x46, 0x82, 0x68, 0x28, 0x38, + 0x46, 0x5e, 0x8d, 0x76, 0xa7, 0x2f, 0x5c, 0x9c, + 0xf7, 0xf7, 0x38, 0x62, 0x82, 0x68, 0x8d, 0x93, + 0x33, 0x1f, 0x8d, 0x82, 0x6c, 0x28, 0x46, 0x82, + 0x75, 0x5e, 0x82, 0x30, 0x5f, 0x5e, 0x8d, 0x82, + 0x28, 0x46, 0x8d, 0x8d, 0x6c, 0x8, 0x38, 0x1f, + 0x5e, 0x5e, 0x8d, 0x5f, 0x38, 0x38, 0x46, 0x89, + 0x76, 0x6c, 0x24, 0xe, 0x5e, 0x6c, 0x86, 0x5e, + 0x8, 0xa7, 0x6c, 0x9e, 0x6c, 0x28, 0x68, 0x5e, + 0x86, 0x68, 0x5e, 0x5e, 0x1f, 0x28, 0x5e, 0x86, + 0xa7, 0x6c, 0x5e, 0x68, 0x6c, 0x5e, 0x68, 0x28, + 0x68, 0x5e, 0x68, 0x68, 0x28, 0xb6, 0x5e, 0x9f, + 0x6c, 0x28, 0x28, 0x5e, 0x8d, 0x68, 0x68, 0x51, + 0x8d, 0x5a, 0xb6, 0x5e, 0x5e, 0x7, 0xb8, 0x5e, + 0x68, 0xa3, 0x9f, 0x4e, 0xaf, 0x3, 0xa6, 0x68, + 0x5e, 0x5e, 0x7, 0x6c, 0x32, 0x87, 0xa5, 0x51, + 0x5c, 0x8d, 0x5e, 0x79, 0x98, 0x8d, 0x5e, 0x9b, + 0x97, 0xb, 0xa1, 0x96, 0x92, 0x5f, 0x68, 0x79, + 0x69, 0xaf, 0x75, 0x4e, 0x8d, 0x68, 0x5, 0xaa, + 0x1, 0x0, 0xa3, 0x8b, 0x68, 0x4e, 0x75, 0x98, + 0x86, 0x4e, 0x75, 0x98, 0x75, 0x4e, 0x68, 0x8b, + 0x68, 0x4e, 0x98, 0x8b, 0x8b, 0x82, 0x34, 0x3d, + 0x74, 0xa3, 0x79, 0x8b, 0xa3, 0x0, 0x4e, 0x69, + 0x6, 0x0, 0x68, 0x8d, 0x79, 0xa0, 0x60, 0x69, + 0x4e, 0x0, 0x8d, 0x68, 0x4e, 0x0, 0xa0, 0x5, + 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x8d, 0x0, 0x0, + 0x0, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa3, 0x9e, 0xa3, 0x9f, 0x8, 0x9f, 0xa2, 0x9f, + 0x43, 0x68, 0x5e, 0x68, 0x5e, 0x6c, 0x28, 0x38, + 0x24, 0x28, 0x5e, 0xae, 0x28, 0x28, 0x5e, 0x6c, + 0x5e, 0x86, 0x43, 0x86, 0x5e, 0x86, 0x68, 0x5e, + 0x9f, 0x5e, 0xa3, 0x5e, 0x5e, 0x6c, 0x68, 0x8d, + 0x5e, 0x68, 0x5e, 0x8d, 0x24, 0x7, 0x5e, 0x6c, + 0x8, 0x7, 0x6c, 0x32, 0xa3, 0x5e, 0x9e, 0x5e, + 0x9f, 0x5e, 0x5e, 0x5e, 0x5e, 0x7, 0x6c, 0x68, + 0x5e, 0x9f, 0x5e, 0x5e, 0x5e, 0x5e, 0x6c, 0x6c, + 0x5e, 0x8, 0x24, 0xfc, 0x8, 0x4f, 0xb7, 0xa0, + 0xf, 0x24, 0x28, 0x8d, 0x76, 0xa7, 0x1e, 0x28, + 0x8d, 0x37, 0x5e, 0x1e, 0x1e, 0x8d, 0x68, 0x68, + 0x82, 0xe, 0x9f, 0x5e, 0x9c, 0xa5, 0x12, 0x1e, + 0x89, 0x8d, 0x5e, 0x28, 0x5c, 0x37, 0x5e, 0x98, + 0x8c, 0x2f, 0xa0, 0x82, 0x93, 0x5e, 0x28, 0x1f, + 0x7d, 0x76, 0x5e, 0x84, 0x55, 0x33, 0xa7, 0x99, + 0x57, 0x6e, 0xf0, 0x55, 0x93, 0x5e, 0x5e, 0x46, + 0x30, 0x5e, 0x68, 0x7b, 0x3d, 0x25, 0xe, 0x9c, + 0x8b, 0x76, 0xc, 0x33, 0x62, 0x87, 0x52, 0x69, + 0x8f, 0x8d, 0x28, 0x8f, 0x8b, 0x77, 0x5a, 0x9b, + 0x9d, 0x72, 0xa5, 0x8d, 0x8d, 0x28, 0x86, 0x98, + 0x69, 0xaf, 0x68, 0x8b, 0x98, 0x68, 0x51, 0x5b, + 0x97, 0x68, 0x68, 0x98, 0x79, 0x68, 0x68, 0x8b, + 0x68, 0x4e, 0xa3, 0x98, 0x98, 0x4e, 0x4e, 0x8b, + 0xa3, 0x4e, 0x98, 0x98, 0x64, 0x73, 0x7f, 0x7c, + 0x9e, 0x4e, 0xa3, 0x8d, 0x4e, 0x4e, 0x4e, 0xb, + 0x72, 0x4e, 0x8d, 0x8d, 0x4e, 0xa0, 0x60, 0x69, + 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, 0x87, 0xaf, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x6c, 0x32, 0x5e, 0x8d, 0x75, 0x68, 0xfc, 0x1e, + 0x8d, 0x68, 0x68, 0x76, 0xe, 0x28, 0x6c, 0xab, + 0x6d, 0x27, 0x38, 0x98, 0x82, 0x5e, 0x37, 0x38, + 0x24, 0x5e, 0x98, 0x8c, 0x12, 0xa0, 0x8d, 0x98, + 0x5e, 0x5e, 0x1f, 0x93, 0x82, 0x5e, 0x93, 0x62, + 0x29, 0xa7, 0x8f, 0x7d, 0x29, 0xf8, 0x55, 0x8b, + 0x82, 0x28, 0x5f, 0x33, 0x6c, 0x6c, 0x82, 0x89, + 0x24, 0x2f, 0x9c, 0x8b, 0x76, 0xe, 0x33, 0x62, + 0x5e, 0x8d, 0x84, 0x7c, 0x2f, 0x5c, 0x8c, 0x7d, + 0x24, 0x87, 0x60, 0x7d, 0xac, 0x60, 0x49, 0x49, + 0x64, 0x7c, 0x76, 0x89, 0x7c, 0x62, 0x46, 0x89, + 0x98, 0x98, 0x82, 0x28, 0x93, 0x98, 0x5e, 0x8d, + 0x89, 0x60, 0xa0, 0x82, 0x89, 0x74, 0x2f, 0x84, + 0x62, 0x8d, 0xa2, 0x8d, 0x62, 0x9c, 0x37, 0x89, + 0x8c, 0x49, 0x2f, 0x93, 0x8c, 0x82, 0x75, 0x5c, + 0x74, 0x84, 0x82, 0x93, 0x74, 0x49, 0x6d, 0x8a, + 0x8f, 0x7f, 0x10, 0x74, 0x8b, 0x82, 0x5e, 0x8b, + 0x62, 0x8d, 0x51, 0x16, 0xac, 0x82, 0x2c, 0xaa, + 0x7d, 0x82, 0x43, 0x7d, 0x89, 0x45, 0x87, 0x69, + 0x8d, 0x43, 0xe, 0x37, 0x9b, 0xa1, 0xa0, 0x41, + 0x2f, 0x86, 0x68, 0xa3, 0x68, 0x68, 0x28, 0x5e, + 0x6, 0xe3, 0xa3, 0x28, 0xa3, 0x4e, 0x6, 0xa4, + 0xa4, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x68, + 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x68, 0x4e, 0x4e, + 0x4e, 0xa3, 0xa3, 0x9f, 0xa, 0x6, 0x8, 0x82, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0xbb, + 0x6, 0x0, 0x4e, 0x0, 0x0, 0x8, 0xa0, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x37, 0x28, 0x43, 0x8d, 0x98, 0x75, 0x1e, 0x7d, + 0x98, 0x5e, 0x79, 0x93, 0x45, 0xa4, 0x89, 0x74, + 0x64, 0x10, 0x62, 0x74, 0x89, 0xa3, 0x8d, 0x62, + 0xab, 0x37, 0x5c, 0x8f, 0x74, 0x38, 0x8d, 0x8f, + 0x98, 0x5e, 0x1f, 0x62, 0x93, 0x5e, 0x89, 0x84, + 0x7c, 0xa4, 0x9c, 0x8f, 0x9c, 0x2f, 0x7d, 0x84, + 0x89, 0x6c, 0x93, 0x74, 0x89, 0x28, 0x89, 0x84, + 0x82, 0xc, 0x7c, 0x89, 0x82, 0x37, 0x7d, 0x93, + 0x76, 0x76, 0x93, 0x89, 0x38, 0x5c, 0x77, 0x89, + 0x89, 0x5f, 0xaa, 0x7c, 0x7c, 0x8c, 0x8c, 0x2f, + 0x30, 0x5f, 0x5c, 0x76, 0x5c, 0x89, 0x89, 0x76, + 0x89, 0x93, 0x43, 0x68, 0x43, 0xae, 0x28, 0x6c, + 0x76, 0x82, 0x32, 0x5e, 0x8d, 0x8d, 0x32, 0x5e, + 0x8d, 0x98, 0x6c, 0x5e, 0x82, 0x24, 0xf7, 0x82, + 0x93, 0x8d, 0x5e, 0x5e, 0x8d, 0x5e, 0x68, 0x82, + 0x89, 0x5e, 0xb8, 0x9c, 0x76, 0x9c, 0xa0, 0x26, + 0x74, 0x69, 0x24, 0x9b, 0x53, 0x29, 0x6c, 0x3e, + 0xaf, 0x34, 0xb4, 0x24, 0x5e, 0x86, 0x5e, 0x82, + 0x82, 0x5e, 0x5e, 0x8d, 0x68, 0x2c, 0xa5, 0x5a, + 0x86, 0x68, 0x68, 0x28, 0xaf, 0x2c, 0x50, 0x68, + 0x9f, 0x5e, 0x4e, 0xa3, 0x68, 0x4e, 0xa3, 0x86, + 0xaf, 0xaf, 0x4e, 0x68, 0x68, 0xa3, 0x5, 0x4f, + 0x87, 0x4e, 0x4e, 0x68, 0xa3, 0x4e, 0xa3, 0xa3, + 0xa3, 0x4e, 0x68, 0x4e, 0x5f, 0x7, 0x68, 0x4e, + 0xa3, 0xa3, 0x79, 0x73, 0x9b, 0x4, 0xa3, 0x8d, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0xb, + 0x6, 0x0, 0x4e, 0x4e, 0x4e, 0xa0, 0x8, 0xb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x75, 0x68, 0x75, 0x79, 0x82, 0x68, 0x86, 0x75, + 0xa7, 0x7, 0x5e, 0x82, 0x82, 0x6c, 0x28, 0x5f, + 0xab, 0xa7, 0x37, 0x82, 0x5c, 0x6c, 0x5e, 0x8d, + 0x43, 0x7, 0x82, 0x82, 0x8d, 0x5e, 0x5e, 0x8d, + 0x5e, 0x6c, 0x75, 0x75, 0x5e, 0x8, 0x5e, 0x82, + 0x76, 0x28, 0xe, 0x5c, 0x82, 0x6c, 0x76, 0x82, + 0x6c, 0x28, 0x24, 0x82, 0x6c, 0x28, 0x37, 0x82, + 0x68, 0x5e, 0x82, 0x76, 0x6c, 0x6c, 0x82, 0x43, + 0x6c, 0x28, 0x76, 0x28, 0x5e, 0x28, 0x24, 0x37, + 0x5e, 0xa7, 0x5c, 0xa7, 0x29, 0x5f, 0x5f, 0xa7, + 0xa7, 0xf, 0x24, 0x24, 0x5e, 0x5e, 0x43, 0x28, + 0x24, 0x24, 0x9f, 0x5e, 0x6c, 0xe, 0x37, 0x5e, + 0x5e, 0x5e, 0x28, 0x86, 0xfc, 0x86, 0x6c, 0x86, + 0x6c, 0xfc, 0x5e, 0x86, 0x9f, 0x68, 0x5e, 0x1e, + 0x5e, 0xa3, 0x5e, 0x5e, 0xfc, 0x24, 0x7, 0x9f, + 0x6c, 0x6c, 0x24, 0x24, 0x5e, 0x5e, 0x6c, 0xf4, + 0x12, 0xb4, 0x5e, 0x8, 0xc, 0x5a, 0xca, 0x4, + 0xc, 0x5e, 0x5e, 0xfc, 0x8d, 0x5e, 0xa3, 0x6c, + 0xe, 0x43, 0x6c, 0xb8, 0x6c, 0xa5, 0x10, 0x88, + 0x37, 0x8d, 0x68, 0x97, 0x74, 0x26, 0x5e, 0x8d, + 0x79, 0x68, 0xa3, 0x37, 0x79, 0x68, 0xa3, 0x46, + 0x69, 0x51, 0x68, 0x68, 0x79, 0x68, 0xaf, 0x60, + 0x87, 0x4e, 0x4e, 0x68, 0x68, 0x4e, 0x68, 0x4e, + 0x75, 0x4e, 0x68, 0x98, 0x16, 0x4f, 0x4e, 0x7d, + 0x5e, 0xa3, 0x84, 0x73, 0x87, 0x5b, 0x98, 0x98, + 0x79, 0x4e, 0xa3, 0x79, 0x4e, 0x4e, 0x4e, 0x69, + 0x6, 0x0, 0x0, 0x8d, 0x8d, 0x2c, 0xaa, 0x51, + 0x4e, 0x0, 0x0, 0x68, 0x0, 0x0, 0xa0, 0x6, + 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa2, 0x9e, 0xa3, 0x28, 0x7, 0xb6, 0x86, 0x68, + 0x28, 0xfc, 0x5e, 0x6c, 0x9f, 0x28, 0x28, 0xe, + 0x28, 0x28, 0x5e, 0x28, 0x24, 0x28, 0x86, 0x9f, + 0x86, 0x28, 0xfc, 0x5e, 0x9f, 0x7, 0x5e, 0xfc, + 0xfc, 0x9f, 0x68, 0x5e, 0x5e, 0xf, 0x5e, 0x5e, + 0x5e, 0x7, 0xa0, 0x38, 0x6c, 0x6c, 0x8, 0x24, + 0x12, 0x8, 0x8, 0x6c, 0x5e, 0x28, 0x24, 0x82, + 0x9f, 0x9f, 0x6c, 0x24, 0x28, 0x6c, 0x8, 0x6c, + 0x28, 0x24, 0x24, 0x5e, 0x68, 0x5e, 0x24, 0x1f, + 0x8, 0x28, 0xa7, 0x24, 0x2f, 0xe, 0xa7, 0x24, + 0x76, 0x76, 0x24, 0x37, 0xa7, 0x24, 0x6c, 0x6c, + 0x24, 0xa7, 0x76, 0x5e, 0x5e, 0x93, 0x5c, 0x5e, + 0x8d, 0x8d, 0x5e, 0x28, 0xa7, 0x82, 0x9f, 0x6c, + 0x43, 0x8d, 0x5e, 0x75, 0x79, 0x5e, 0x28, 0x5c, + 0x82, 0x8d, 0x7, 0x8, 0x5f, 0x82, 0x28, 0x82, + 0x98, 0x5e, 0x5c, 0x89, 0x8d, 0x76, 0x8, 0x9, + 0x49, 0x69, 0x6c, 0x5f, 0x9c, 0x46, 0x8d, 0x46, + 0x98, 0x8d, 0x4e, 0x98, 0x8d, 0x5e, 0x5e, 0xaa, + 0x55, 0x98, 0x76, 0x57, 0x8f, 0x60, 0x9b, 0x69, + 0x84, 0x5e, 0x5e, 0x88, 0x5b, 0x7b, 0x37, 0x9c, + 0x8b, 0x68, 0x68, 0x98, 0x98, 0x68, 0x68, 0x98, + 0x99, 0x41, 0x86, 0x68, 0x98, 0x5e, 0x51, 0x2c, + 0xa8, 0x86, 0xa3, 0x8b, 0x68, 0x4e, 0x68, 0x68, + 0x68, 0xa3, 0xa3, 0x98, 0x3, 0xa1, 0x68, 0x98, + 0x98, 0x0, 0x83, 0x97, 0x69, 0x98, 0x98, 0x98, + 0x8d, 0x4e, 0x4e, 0x8d, 0x4e, 0x4e, 0x0, 0x69, + 0x72, 0x0, 0x4e, 0x4e, 0x0, 0xa0, 0x87, 0xd, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0xa0, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x7, 0xa2, 0x1e, 0x5c, 0x75, 0x86, 0x79, + 0x98, 0x46, 0x82, 0x84, 0x89, 0x8, 0x24, 0x7c, + 0x89, 0x6c, 0x5e, 0x98, 0x93, 0x76, 0x82, 0x98, + 0xa7, 0x28, 0xae, 0x98, 0x98, 0x6c, 0x6c, 0x93, + 0x98, 0x5e, 0x82, 0x98, 0x8d, 0x28, 0x89, 0x82, + 0x82, 0x7, 0x2f, 0x7d, 0x82, 0x6c, 0x89, 0x93, + 0x7d, 0x82, 0x5c, 0x84, 0x89, 0x5e, 0xa7, 0x89, + 0x28, 0x6c, 0x5f, 0x7c, 0x5c, 0x43, 0x89, 0x89, + 0x8d, 0x82, 0x89, 0x93, 0x24, 0x89, 0x9c, 0x5f, + 0x76, 0x5c, 0x9c, 0x5c, 0x89, 0x7c, 0x46, 0x5f, + 0x5c, 0x9c, 0x5f, 0x5f, 0x5c, 0x9c, 0x24, 0x5e, + 0x89, 0x93, 0x76, 0x28, 0x93, 0x93, 0x5c, 0xa7, + 0x62, 0x7c, 0xa7, 0x37, 0x5c, 0x89, 0x43, 0x75, + 0x98, 0x89, 0x43, 0x75, 0x93, 0x82, 0x6c, 0xe, + 0x8c, 0x76, 0x6c, 0x5f, 0x98, 0x5c, 0x6c, 0x8d, + 0x8b, 0x8d, 0x5e, 0x76, 0x9c, 0x30, 0x8, 0x6e, + 0xaa, 0x69, 0x24, 0x93, 0x8b, 0x8d, 0x82, 0x93, + 0x98, 0x8d, 0x75, 0x7d, 0x93, 0x8d, 0x37, 0xad, + 0x74, 0x82, 0x5c, 0x7d, 0x93, 0x87, 0x87, 0x51, + 0xa7, 0x86, 0x9f, 0xd, 0x50, 0x87, 0x9e, 0x68, + 0x68, 0x68, 0xa3, 0x4e, 0x75, 0x4e, 0x4e, 0x68, + 0xd, 0x6, 0xa3, 0x5e, 0x4e, 0xa2, 0x6, 0xa0, + 0xa0, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0xa1, 0x6, 0x7, 0x4e, + 0x0, 0x4e, 0xaf, 0xa4, 0x5, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x6, + 0x6, 0x0, 0x0, 0x0, 0x0, 0xa0, 0xa0, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xe8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x5e, 0x75, 0x8d, 0x79, 0x68, 0x75, 0x98, + 0x98, 0x82, 0x76, 0x55, 0x7c, 0xe, 0x76, 0x98, + 0x98, 0xa7, 0x76, 0x98, 0x8b, 0xa7, 0x24, 0x7d, + 0x84, 0x28, 0x24, 0x98, 0x7d, 0x82, 0x28, 0x98, + 0x98, 0x68, 0x28, 0x93, 0x98, 0x7, 0xa0, 0x7c, + 0x46, 0x6c, 0x24, 0x9c, 0x98, 0x28, 0x5c, 0x93, + 0x82, 0x28, 0xa7, 0x7c, 0x89, 0x28, 0xa9, 0x89, + 0x5c, 0x37, 0x89, 0x89, 0x82, 0x5c, 0x5c, 0x89, + 0x8d, 0x76, 0x7c, 0xa9, 0x24, 0x89, 0x9c, 0x5f, + 0x37, 0x5f, 0x89, 0x28, 0x8d, 0x9c, 0x9c, 0x5f, + 0x5f, 0x7c, 0x5f, 0x5f, 0x89, 0x7c, 0x82, 0x28, + 0x37, 0x7d, 0x5c, 0x43, 0x7d, 0x5f, 0x5f, 0x2f, + 0xab, 0x7c, 0x46, 0x43, 0x89, 0x82, 0x43, 0x43, + 0x79, 0x89, 0x75, 0x6c, 0x5c, 0x5c, 0x5e, 0x8, + 0x89, 0x5c, 0x1f, 0x5e, 0x5e, 0x75, 0x32, 0x1e, + 0x46, 0x32, 0x5e, 0xb7, 0x2c, 0xc, 0x24, 0x5a, + 0x37, 0x51, 0xfc, 0x46, 0x8d, 0x32, 0x68, 0x37, + 0x2c, 0x4e, 0x5e, 0x6c, 0x37, 0x1f, 0x1f, 0x8d, + 0x8d, 0x86, 0x28, 0x38, 0x12, 0x52, 0x87, 0x51, + 0xf7, 0x6c, 0xfc, 0x24, 0xa6, 0xa1, 0xa3, 0x4e, + 0xf, 0x4e, 0x4e, 0x68, 0x32, 0x68, 0xf, 0x5e, + 0x51, 0xaf, 0x4e, 0xfc, 0x5e, 0xa3, 0xb, 0xa0, + 0xa6, 0xa3, 0x68, 0xa3, 0xa3, 0xa3, 0xa3, 0x68, + 0xa3, 0x4e, 0x4e, 0xa3, 0x50, 0x9f, 0x9, 0x4e, + 0xa3, 0x9f, 0x92, 0x96, 0xa6, 0x6c, 0xa3, 0x8d, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x51, + 0xbb, 0x4e, 0x4e, 0x0, 0x0, 0xa0, 0x8, 0x6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa1, 0xa5, + 0x7, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x32, 0x32, 0xa3, 0x75, 0x75, 0x7, 0x1e, 0x46, + 0x8d, 0x28, 0x28, 0x46, 0x30, 0x28, 0x5e, 0x82, + 0x28, 0x24, 0xc, 0x76, 0x76, 0x28, 0xa0, 0x38, + 0x82, 0x5e, 0x5e, 0x8d, 0x1f, 0x1e, 0x5e, 0x5e, + 0x43, 0x6c, 0xc, 0x89, 0x5e, 0x5e, 0x6c, 0x38, + 0x1f, 0x5e, 0x5e, 0x43, 0x5e, 0xfc, 0xe, 0x37, + 0x5e, 0x5e, 0xa0, 0x2f, 0x43, 0x5e, 0x5e, 0x43, + 0x37, 0x37, 0x82, 0x5e, 0x5e, 0x5e, 0x5f, 0x37, + 0x86, 0x5e, 0x5e, 0x28, 0x43, 0x8d, 0x5e, 0x5e, + 0x43, 0x5c, 0x82, 0x6c, 0x6c, 0x82, 0x24, 0xf7, + 0x5c, 0x7d, 0x76, 0x5e, 0x6c, 0x82, 0x28, 0x68, + 0x82, 0x76, 0x6c, 0x8, 0x76, 0x76, 0x76, 0x28, + 0x24, 0x46, 0x82, 0x68, 0x75, 0x8d, 0x5e, 0x9f, + 0x28, 0x5e, 0x86, 0x6c, 0x28, 0x5e, 0x86, 0x5e, + 0x86, 0x5e, 0x5e, 0x9f, 0x75, 0x75, 0x68, 0x6c, + 0x6c, 0x5e, 0xa3, 0x5e, 0x5e, 0x5e, 0x68, 0x6e, + 0x5e, 0xaf, 0x68, 0x6c, 0x7, 0x5e, 0x86, 0x28, + 0x46, 0x75, 0x68, 0x5e, 0x8d, 0x68, 0x68, 0x5e, + 0x28, 0x6c, 0x5e, 0x76, 0xae, 0x51, 0xa4, 0x41, + 0x89, 0x43, 0x43, 0x5c, 0x7a, 0xd, 0x5f, 0x8d, + 0x8b, 0x32, 0x75, 0x8b, 0x8b, 0x28, 0x79, 0x83, + 0x6a, 0xa, 0x9e, 0x8b, 0x86, 0x9e, 0xb4, 0x68, + 0x34, 0x9f, 0x68, 0x98, 0x79, 0xa3, 0x4e, 0x98, + 0x68, 0x4e, 0x4e, 0x98, 0xa6, 0xa0, 0x6, 0x8c, + 0x82, 0xa3, 0x7d, 0x2b, 0x84, 0x4, 0x79, 0x98, + 0x8d, 0x4e, 0x4e, 0x8d, 0x4e, 0x4e, 0x8, 0x41, + 0xb, 0x7, 0x68, 0x68, 0x4e, 0xe8, 0xae, 0x6, + 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x8, 0x5, + 0xe8, 0x9f, 0x0, 0x9f, 0x5, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa2, 0x9f, 0xa3, 0x86, 0x68, 0xa3, 0x5e, 0x5e, + 0x5e, 0x9e, 0x68, 0x6c, 0x43, 0x5e, 0x9f, 0x68, + 0x28, 0x8, 0x8, 0x6c, 0x28, 0x68, 0x5e, 0x43, + 0x5e, 0x5e, 0x6c, 0x28, 0x82, 0x6c, 0x8, 0x76, + 0x5e, 0x68, 0x5e, 0x5e, 0x5e, 0x5e, 0x68, 0x32, + 0x82, 0x5e, 0x6c, 0x5e, 0x5e, 0x9f, 0x8, 0x6c, + 0x6c, 0x5e, 0x5e, 0x5c, 0x82, 0x68, 0x5e, 0x82, + 0x5e, 0x5e, 0x28, 0x6c, 0x6c, 0x5e, 0x28, 0x28, + 0x6c, 0x5e, 0x68, 0x5e, 0x68, 0x6c, 0x68, 0x6c, + 0x86, 0x5e, 0x24, 0x24, 0x9f, 0x6c, 0x68, 0x5e, + 0x1f, 0x28, 0xa3, 0x6c, 0x5e, 0x24, 0x24, 0x8, + 0x6c, 0x6c, 0x5e, 0xfc, 0x28, 0x5e, 0x5e, 0x5e, + 0x5f, 0x38, 0x5e, 0x5e, 0xa7, 0x43, 0x24, 0x8, + 0x6c, 0x43, 0x5e, 0x5e, 0x5c, 0x8d, 0x5e, 0x5e, + 0x28, 0x5c, 0x5e, 0x28, 0x4f, 0x28, 0xa3, 0x5e, + 0x89, 0x43, 0x28, 0x82, 0x93, 0x82, 0x5e, 0xee, + 0x96, 0x34, 0x5e, 0x8d, 0x2f, 0x2f, 0x1f, 0x84, + 0x8f, 0x98, 0x79, 0x62, 0x98, 0x8d, 0x68, 0x9c, + 0x3e, 0xa9, 0xa7, 0x93, 0x84, 0x73, 0x10, 0x73, + 0x98, 0x8d, 0x86, 0x8d, 0x93, 0xa4, 0x1, 0x88, + 0x8c, 0x86, 0x68, 0x98, 0x98, 0xab, 0x6e, 0x56, + 0x99, 0x6e, 0x2c, 0x68, 0x79, 0xa6, 0xb, 0x87, + 0x6, 0x1, 0xa1, 0x2c, 0xa8, 0xa0, 0xa0, 0x2c, + 0xa0, 0x2c, 0xa5, 0x51, 0x73, 0xa0, 0xf4, 0x9f, + 0x4e, 0x4e, 0x8d, 0xac, 0x2b, 0x6e, 0x73, 0x78, + 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x50, 0xd8, 0xa6, + 0x50, 0xbb, 0x4e, 0x68, 0x68, 0x2, 0xa0, 0x3, + 0x9f, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x9f, + 0xc8, 0xca, 0x2, 0xe8, 0x4e, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0xa3, 0x9f, 0x1e, 0x75, 0x86, 0x5e, 0x8d, + 0x8d, 0x28, 0x6c, 0x98, 0x82, 0x5e, 0x8, 0x5f, + 0x82, 0x75, 0x43, 0x5c, 0x5c, 0x5e, 0x5e, 0x89, + 0x5c, 0x6c, 0xf7, 0x89, 0x9c, 0xf, 0x37, 0x5f, + 0x8d, 0x68, 0x76, 0x5c, 0x43, 0x5e, 0x76, 0x9c, + 0x5c, 0x28, 0xa7, 0x5f, 0x82, 0x75, 0x82, 0x7d, + 0x76, 0x28, 0x8d, 0x84, 0x5f, 0x76, 0x7d, 0x7c, + 0x89, 0x28, 0x5f, 0x7c, 0x5e, 0x5e, 0x93, 0x46, + 0x82, 0x43, 0x8d, 0x76, 0x28, 0x5c, 0x5c, 0x6c, + 0x28, 0x76, 0x82, 0x76, 0x82, 0x8d, 0x76, 0x76, + 0x46, 0x93, 0x8d, 0x8, 0x8, 0x5f, 0x82, 0x28, + 0x76, 0x98, 0x5e, 0x82, 0x93, 0x8d, 0x82, 0x7, + 0x29, 0x7c, 0x8d, 0x5e, 0x38, 0x89, 0x1f, 0x8d, + 0x7d, 0x93, 0x8d, 0x86, 0x98, 0x8d, 0x86, 0x37, + 0xab, 0x46, 0x8d, 0x75, 0x7c, 0x93, 0x32, 0x8d, + 0x98, 0x8d, 0x1e, 0x82, 0x7c, 0x82, 0x5e, 0x53, + 0x25, 0xa6, 0x5e, 0x82, 0x7d, 0x46, 0x46, 0x98, + 0x8f, 0x98, 0x8d, 0x38, 0x93, 0xa7, 0x76, 0x74, + 0x60, 0x2f, 0x8d, 0x98, 0x8d, 0x44, 0xa6, 0x44, + 0x5c, 0x9f, 0xa2, 0x86, 0x5e, 0xfc, 0x68, 0x8, + 0x72, 0xb4, 0xd, 0x5a, 0x51, 0x6, 0x9f, 0x4e, + 0x29, 0xa4, 0x4e, 0x4e, 0x4e, 0xa3, 0xa4, 0xa4, + 0xa0, 0xa0, 0xa0, 0xa0, 0x52, 0xa0, 0xa4, 0xa0, + 0xa4, 0xa4, 0xa0, 0xf7, 0xb7, 0xa0, 0xa3, 0x4e, + 0x4e, 0x4e, 0x4e, 0x8d, 0x68, 0xa7, 0xa4, 0xa0, + 0xa0, 0xf7, 0xa0, 0xf7, 0xa0, 0x8, 0xa0, 0xa0, + 0xa0, 0x9f, 0x0, 0x0, 0x0, 0x5f, 0xa0, 0x8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x75, 0xa3, 0x86, 0x43, 0x1f, 0x79, 0x86, 0x8d, + 0x98, 0x1f, 0x46, 0x74, 0x79, 0x43, 0x37, 0x30, + 0x98, 0x5e, 0x43, 0x93, 0x93, 0x28, 0x5e, 0x89, + 0x5f, 0x24, 0x24, 0x89, 0x9c, 0x1f, 0x5c, 0x62, + 0x8d, 0xa2, 0x8d, 0x7d, 0x89, 0x37, 0x5c, 0x7c, + 0x74, 0x24, 0x8d, 0x8c, 0x82, 0x86, 0x43, 0x7d, + 0x5c, 0x82, 0x89, 0x7c, 0x9c, 0x2f, 0x77, 0x7c, + 0x5f, 0x76, 0x7d, 0x89, 0x82, 0x8d, 0x98, 0x89, + 0x8d, 0x46, 0x93, 0x76, 0x76, 0x89, 0x89, 0x37, + 0x82, 0x93, 0x98, 0x43, 0x5c, 0x98, 0x8d, 0x5e, + 0xf7, 0x8f, 0x76, 0x28, 0x5f, 0x98, 0x8d, 0x5e, + 0x8d, 0x98, 0x8d, 0x5e, 0x76, 0x9c, 0x46, 0x7, + 0x87, 0x77, 0x8d, 0x28, 0x82, 0x98, 0x8d, 0x75, + 0x89, 0x8d, 0x75, 0x75, 0xa7, 0x76, 0x75, 0x1e, + 0xa7, 0x76, 0x68, 0x43, 0x43, 0x8d, 0x75, 0x68, + 0x6c, 0x6c, 0x5e, 0x75, 0xa0, 0x28, 0x43, 0x6c, + 0x82, 0x68, 0x5e, 0x5e, 0x8d, 0x75, 0x68, 0x8d, + 0x8d, 0x5e, 0x68, 0x68, 0x28, 0x8, 0x68, 0x79, + 0x79, 0x68, 0x9f, 0x68, 0x5e, 0x68, 0xa3, 0x5e, + 0x9f, 0x5e, 0x86, 0x68, 0x68, 0x68, 0x68, 0xa3, + 0x68, 0xa3, 0x68, 0x68, 0x32, 0x9f, 0xa3, 0x75, + 0x68, 0x68, 0x68, 0x68, 0x75, 0x4e, 0xa3, 0x75, + 0x4e, 0x4e, 0xa3, 0x68, 0x9e, 0x4e, 0x4e, 0xa3, + 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0xa3, 0xa3, 0xb8, 0x82, 0x93, 0x8d, 0x79, 0x8d, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0xa3, 0xa2, 0x5e, 0x75, 0x86, 0x86, 0x6c, + 0x82, 0x5e, 0x68, 0x28, 0x5e, 0x68, 0x75, 0x89, + 0x43, 0x5e, 0xa3, 0x76, 0x24, 0xb6, 0x5e, 0x76, + 0x76, 0x68, 0x5e, 0x82, 0x8d, 0x68, 0x5e, 0x8d, + 0x8d, 0x6c, 0x5e, 0x82, 0x24, 0x8, 0x76, 0x93, + 0x8d, 0x68, 0x5e, 0x8d, 0x68, 0x86, 0x8d, 0x82, + 0x5e, 0x8, 0x76, 0x82, 0x43, 0xa7, 0x37, 0x46, + 0x76, 0x5e, 0x8d, 0x8d, 0x5e, 0x43, 0x43, 0x43, + 0x5e, 0x76, 0x1f, 0x6c, 0x68, 0x75, 0x5e, 0x1e, + 0x1e, 0x8d, 0x8d, 0x68, 0x8, 0x1e, 0x37, 0x6c, + 0x6c, 0x82, 0x37, 0xf, 0x5e, 0x68, 0x68, 0x68, + 0x1f, 0x46, 0x68, 0x5e, 0xb7, 0xc, 0x24, 0x43, + 0x28, 0x28, 0x68, 0x28, 0x46, 0x5e, 0x86, 0x5e, + 0x28, 0xc, 0xa2, 0x68, 0x28, 0x32, 0x28, 0x43, + 0x75, 0x75, 0xa3, 0x5e, 0x32, 0x6c, 0x9f, 0x6c, + 0x8, 0x6c, 0x9f, 0x5e, 0x28, 0x1f, 0x5e, 0x5e, + 0x43, 0x6c, 0x1e, 0xfc, 0x5e, 0x9f, 0x9f, 0xa3, + 0x1f, 0x68, 0xa3, 0x5e, 0x5e, 0xfc, 0xfc, 0x8d, + 0x32, 0x6c, 0x6c, 0x1e, 0x37, 0xf7, 0x5e, 0x68, + 0x43, 0x5e, 0xa3, 0x8d, 0x8b, 0x68, 0x68, 0x68, + 0x8b, 0x5e, 0xa3, 0x79, 0x93, 0x28, 0x5e, 0x79, + 0x8b, 0x68, 0xa3, 0x79, 0x79, 0xa3, 0xa3, 0x79, + 0x79, 0xa3, 0x4e, 0x98, 0x4e, 0x68, 0xa3, 0x68, + 0x68, 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x98, + 0x4e, 0x0, 0x68, 0x98, 0x98, 0x8d, 0x8d, 0x8d, + 0x4e, 0x4e, 0x0, 0x8d, 0x4e, 0x4e, 0x0, 0x68, + 0x0, 0x0, 0xa3, 0x4e, 0x0, 0x0, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa2, 0xa3, 0xa3, 0xb6, 0x9f, 0xa2, 0xfc, 0x8, + 0x86, 0x68, 0x5e, 0x5e, 0x28, 0x5e, 0x68, 0x6c, + 0x6c, 0x9f, 0x5e, 0x5e, 0x6c, 0x28, 0x5e, 0x5e, + 0x86, 0x68, 0xa3, 0xfc, 0x86, 0x9f, 0xa3, 0x5e, + 0xfc, 0x28, 0xa3, 0x6c, 0xa3, 0x68, 0x1f, 0x5e, + 0x4e, 0x5e, 0x68, 0xfc, 0xfc, 0x7, 0x6c, 0x5e, + 0x5e, 0xfc, 0x43, 0x5e, 0x32, 0x68, 0x24, 0x38, + 0x28, 0x5e, 0x6c, 0x6c, 0x24, 0x7, 0x7, 0x68, + 0x6c, 0x5e, 0x5e, 0x75, 0x9f, 0xa3, 0x5e, 0x6c, + 0x6c, 0x7, 0x9f, 0x86, 0x6c, 0x28, 0x6c, 0x86, + 0x5e, 0x4e, 0x68, 0x75, 0x9f, 0x68, 0x68, 0x68, + 0x6c, 0x6c, 0x5e, 0xa3, 0x9f, 0x75, 0x5e, 0x75, + 0x68, 0x43, 0x68, 0x68, 0x6c, 0x8, 0x5e, 0x9f, + 0x43, 0x5c, 0x75, 0x68, 0x43, 0x79, 0x68, 0x86, + 0x8d, 0x24, 0x37, 0x75, 0x82, 0xe, 0x5e, 0x43, + 0x5c, 0x8d, 0x32, 0x8d, 0x89, 0x7d, 0x82, 0x93, + 0x7c, 0xa9, 0xe, 0x98, 0x89, 0x28, 0x5e, 0x46, + 0x62, 0x1f, 0x5e, 0x8d, 0x8b, 0x98, 0x7d, 0x8f, + 0x62, 0xa9, 0x8, 0x30, 0x8f, 0x8d, 0x68, 0x8d, + 0x98, 0x43, 0xfc, 0x98, 0x98, 0x68, 0x68, 0x5e, + 0x98, 0x5e, 0x68, 0x68, 0x98, 0x46, 0x5e, 0x8b, + 0x98, 0x68, 0x68, 0x98, 0x98, 0x68, 0xa3, 0x98, + 0x98, 0x68, 0x68, 0x68, 0x75, 0x0, 0xa3, 0x98, + 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0xa3, + 0x4e, 0xa3, 0x98, 0x8d, 0x8d, 0x4e, 0x8d, 0x8d, + 0x4e, 0x0, 0x4e, 0x68, 0x68, 0x0, 0x0, 0x68, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5c, 0x75, 0x43, 0x5c, 0x76, 0x76, 0x43, 0x89, + 0x6c, 0x5e, 0x82, 0x5f, 0x37, 0x5e, 0x82, 0x89, + 0x5c, 0x5e, 0x32, 0x79, 0x98, 0x5c, 0x8d, 0x93, + 0x82, 0x5e, 0x28, 0x46, 0x82, 0x9f, 0x6c, 0x8d, + 0x8d, 0x5e, 0x8d, 0x79, 0x5e, 0x28, 0x46, 0x98, + 0x8d, 0x7, 0x7, 0x46, 0x8d, 0x28, 0x82, 0x98, + 0x5e, 0x82, 0x93, 0x8d, 0x76, 0x6c, 0x29, 0x74, + 0x76, 0x37, 0x5f, 0x93, 0x5c, 0x8d, 0x5c, 0x5c, + 0x82, 0x75, 0x8d, 0x75, 0x43, 0x5c, 0x89, 0x28, + 0x82, 0x82, 0x38, 0x5e, 0x75, 0x98, 0x79, 0x75, + 0xfc, 0x82, 0x8d, 0x68, 0x28, 0xa8, 0x37, 0xa2, + 0x5e, 0x98, 0x5e, 0xf, 0x8d, 0x93, 0x82, 0x5e, + 0x5f, 0x77, 0x82, 0x75, 0x8d, 0x2f, 0x2f, 0x1f, + 0x8b, 0x7d, 0x93, 0x5c, 0x55, 0x89, 0x82, 0x8d, + 0x7c, 0x77, 0x5f, 0x89, 0x98, 0x98, 0x1e, 0x1f, + 0x98, 0xa7, 0xa7, 0x46, 0x30, 0xa4, 0x43, 0x93, + 0x82, 0x43, 0x5e, 0x5c, 0x76, 0x6c, 0x5e, 0x43, + 0x9f, 0xf, 0x5e, 0xa3, 0x68, 0x68, 0xa3, 0x68, + 0x68, 0x4e, 0xa3, 0x68, 0x86, 0x68, 0x4e, 0xa3, + 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, 0x4e, 0xa3, + 0x4e, 0xa3, 0x9f, 0x4e, 0x4e, 0xa3, 0xa3, 0x86, + 0x4e, 0x0, 0x86, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, + 0x5e, 0x9e, 0x9f, 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, + 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x0, + 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x86, 0x86, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x7d, 0x76, 0x7d, 0x94, 0x9c, 0x24, 0x7d, 0x64, + 0x5f, 0x5e, 0x79, 0x7d, 0x5f, 0x43, 0x8d, 0x84, + 0x82, 0x43, 0x82, 0x8b, 0x82, 0x43, 0x82, 0x74, + 0x89, 0x28, 0x82, 0x98, 0x8d, 0x28, 0x8d, 0x8b, + 0x98, 0x5e, 0x8d, 0x8b, 0x8d, 0x68, 0xc, 0x8f, + 0x76, 0x6c, 0x5f, 0x98, 0x8d, 0x5e, 0x8d, 0x98, + 0x82, 0x5e, 0x76, 0x9c, 0x46, 0x8, 0x87, 0xab, + 0x82, 0x46, 0x93, 0x98, 0x8d, 0x82, 0x98, 0x89, + 0x5c, 0x5c, 0x5c, 0x82, 0x76, 0x38, 0x93, 0x5e, + 0x82, 0x93, 0x62, 0x5c, 0x8d, 0x98, 0x8d, 0x68, + 0x46, 0x5f, 0x82, 0x75, 0x68, 0x46, 0x46, 0x43, + 0x8d, 0x93, 0x8d, 0x1f, 0x93, 0x7c, 0x82, 0x5e, + 0x2f, 0x52, 0xa7, 0x5e, 0x8d, 0x7d, 0x46, 0x46, + 0x93, 0x7c, 0x89, 0x5c, 0x62, 0x89, 0x6c, 0x82, + 0x7d, 0x55, 0x1f, 0x8d, 0x8d, 0x5e, 0x28, 0x5c, + 0x8d, 0x32, 0x5e, 0x75, 0x38, 0x5c, 0x5e, 0x75, + 0x82, 0x28, 0x37, 0x5c, 0x5c, 0x5e, 0x68, 0x75, + 0x1e, 0x37, 0x68, 0x68, 0x68, 0x68, 0xfc, 0x37, + 0xa3, 0xa3, 0x9f, 0x68, 0x1e, 0x4e, 0x68, 0xa3, + 0xa3, 0x68, 0x75, 0x68, 0x4e, 0x68, 0x9f, 0x68, + 0x68, 0xa3, 0xa3, 0x4e, 0x68, 0xa3, 0xa3, 0xa2, + 0x86, 0x4e, 0xa3, 0x5e, 0xa2, 0xa2, 0x9f, 0x9f, + 0x98, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0xa3, 0xa3, + 0x0, 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x79, 0xa3, 0x0, + 0x4e, 0x8d, 0x82, 0x0, 0x68, 0x68, 0x0, 0x4e, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x30, 0x46, 0x43, 0xae, 0x87, 0x12, 0x38, 0x46, + 0x8d, 0x68, 0x37, 0x38, 0x46, 0x5e, 0x82, 0x89, + 0x76, 0x76, 0xf, 0x7d, 0x82, 0x28, 0x28, 0x46, + 0x30, 0x28, 0x68, 0x79, 0x5e, 0xfc, 0x1f, 0x8d, + 0x8d, 0x5e, 0x8, 0x1f, 0x37, 0x6c, 0x6c, 0x8d, + 0x37, 0x1e, 0x5e, 0x68, 0x68, 0x75, 0x1f, 0x46, + 0x68, 0x5e, 0xae, 0x29, 0x24, 0x43, 0x43, 0x37, + 0x43, 0xf, 0x46, 0x5c, 0x9, 0x14, 0xff, 0x16, + 0xd, 0x6c, 0x5e, 0x5e, 0x5e, 0x5c, 0x5e, 0x75, + 0xa3, 0x43, 0x43, 0x5e, 0x5e, 0x7, 0x6c, 0x9f, + 0x28, 0x5e, 0x5e, 0x86, 0x68, 0x68, 0x68, 0x68, + 0x86, 0x6c, 0xa4, 0x3, 0x68, 0xa0, 0x8, 0x5e, + 0x5e, 0x82, 0x68, 0x68, 0x5a, 0x77, 0x5e, 0x68, + 0x8d, 0x8d, 0x86, 0x68, 0x75, 0x28, 0x7, 0x68, + 0x75, 0x6c, 0xa7, 0xb, 0x88, 0x5, 0x51, 0x6c, + 0x5e, 0xa3, 0x68, 0x68, 0x75, 0x28, 0x8, 0xd, + 0x41, 0xa6, 0x6c, 0x75, 0x5c, 0x5f, 0x51, 0x92, + 0x7d, 0x8d, 0x5e, 0x8d, 0x5b, 0x51, 0xa1, 0x79, + 0x8d, 0x68, 0x68, 0x96, 0x69, 0x87, 0x75, 0x4e, + 0x8d, 0x68, 0xa3, 0x79, 0x68, 0xa3, 0xa1, 0x99, + 0x2c, 0x4e, 0x75, 0x98, 0x24, 0x6, 0x92, 0x84, + 0x75, 0x4e, 0x68, 0x5b, 0xaf, 0x50, 0x98, 0x8b, + 0x98, 0x8d, 0x98, 0x98, 0x69, 0xa3, 0x79, 0x98, + 0xa3, 0x0, 0x8, 0x88, 0x4e, 0x4e, 0x68, 0x8d, + 0x8d, 0x4e, 0x8d, 0x8d, 0x4e, 0x0, 0x8d, 0x68, + 0x4e, 0x0, 0x4e, 0x5e, 0xb4, 0x16, 0xff, 0x16, + 0x6, 0x8d, 0x0, 0x0, 0x0, 0x4e, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, + 0x0, 0x0, 0xc8, 0x5, 0x0, 0x0, 0x0, 0x5, + 0x7, 0xa5, 0xc8, 0x0, 0x5, 0x7, 0x0, 0xa, + 0x0, 0x7, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x6c, 0x68, 0x68, 0x6c, 0x5e, 0x86, 0x28, 0x68, + 0x68, 0x68, 0x68, 0x5e, 0x5e, 0x5e, 0x5e, 0x28, + 0x6c, 0x6c, 0x5e, 0x5e, 0x5e, 0xa3, 0x68, 0x75, + 0x5e, 0x86, 0xa3, 0xa3, 0x5e, 0x9f, 0x7, 0x7, + 0xa3, 0x9e, 0x5e, 0x28, 0x5e, 0xa3, 0x9f, 0x4e, + 0x68, 0x68, 0x9f, 0x68, 0x68, 0x86, 0x6c, 0x6c, + 0x5e, 0x86, 0x9f, 0x5e, 0x5e, 0x75, 0x5e, 0x43, + 0x5e, 0x6c, 0x6c, 0xee, 0x9, 0xa7, 0x5e, 0x2f, + 0x1, 0x51, 0x43, 0x75, 0x68, 0x5e, 0x9f, 0x5e, + 0xfc, 0xb6, 0x5e, 0x5e, 0x5e, 0x37, 0x68, 0x32, + 0x68, 0x75, 0x32, 0x86, 0x68, 0x75, 0x9f, 0x86, + 0x28, 0x8, 0x28, 0xae, 0x5e, 0x43, 0x1f, 0x5e, + 0x5e, 0x5e, 0x6c, 0x1e, 0x1, 0x87, 0x9f, 0x5e, + 0x5e, 0x1f, 0x6c, 0x34, 0x3e, 0x76, 0xf6, 0x2f, + 0x8d, 0x28, 0x9, 0x29, 0x5c, 0x43, 0x6c, 0x88, + 0x77, 0xfc, 0xe, 0x89, 0x93, 0x5c, 0x16, 0x73, + 0x88, 0x16, 0xaf, 0x8d, 0x5b, 0x16, 0x3, 0x8a, + 0x3d, 0x89, 0x6c, 0x9d, 0x16, 0x51, 0xd8, 0x8a, + 0x79, 0x28, 0x6e, 0x2b, 0x69, 0x16, 0x6d, 0x8b, + 0x98, 0x68, 0x5e, 0x98, 0x82, 0x16, 0x6e, 0x69, + 0x16, 0xaf, 0x86, 0x64, 0x16, 0xb4, 0x3, 0x3d, + 0x7d, 0x4e, 0xa5, 0x16, 0x5, 0x73, 0x8a, 0x98, + 0x98, 0xa3, 0x98, 0x6e, 0xff, 0x0, 0xa3, 0x8d, + 0x4e, 0x4e, 0xa0, 0x73, 0x4e, 0x4e, 0x8d, 0x8d, + 0x4e, 0x0, 0x8d, 0x8d, 0x4e, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x68, 0x1, 0xca, 0x9f, 0x0, 0x8, + 0xeb, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xb6, + 0x0, 0x0, 0x9, 0x3d, 0x0, 0x0, 0x0, 0x16, + 0x9e, 0x9f, 0x9f, 0x0, 0xa, 0xa0, 0x0, 0xff, + 0x0, 0x9e, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8d, 0x5e, 0x28, 0x46, 0x37, 0x5e, 0x98, 0x8f, + 0x2f, 0xa0, 0x8d, 0x98, 0x6c, 0x5e, 0x37, 0x7d, + 0x5c, 0x5e, 0x75, 0x8d, 0x82, 0x28, 0x5e, 0x98, + 0x82, 0x68, 0x6c, 0x5f, 0x8d, 0x5e, 0x28, 0x82, + 0x1f, 0x5e, 0x5e, 0x98, 0x79, 0x68, 0xfc, 0x82, + 0x8d, 0x68, 0x28, 0xa8, 0x37, 0xa2, 0x32, 0x98, + 0x5e, 0xf, 0x8d, 0x93, 0x82, 0x6c, 0x2f, 0xad, + 0x89, 0x28, 0x92, 0x1, 0x38, 0x1f, 0x98, 0x93, + 0xab, 0x2a, 0x46, 0x5c, 0x87, 0x69, 0xd, 0xe, + 0x5f, 0x76, 0x51, 0x76, 0xd, 0x41, 0x5c, 0x75, + 0xa1, 0x9b, 0xa7, 0x1e, 0xa9, 0x51, 0x2f, 0xa1, + 0x52, 0x92, 0xa9, 0x72, 0x79, 0x93, 0x7a, 0x69, + 0x78, 0x83, 0x6d, 0xe, 0x34, 0x61, 0xd, 0x51, + 0x60, 0x62, 0x41, 0x16, 0x6e, 0xac, 0x5c, 0x93, + 0x8f, 0x8a, 0xa7, 0x92, 0xf2, 0x3d, 0x88, 0x8d, + 0x8a, 0x89, 0xc, 0xa9, 0x89, 0x92, 0xa, 0x5c, + 0x98, 0x2f, 0x14, 0x82, 0x6e, 0x72, 0x1f, 0x24, + 0x6e, 0xb, 0xa3, 0x16, 0xa4, 0x68, 0x68, 0x3d, + 0xae, 0x24, 0x3d, 0x86, 0x0, 0x9f, 0x14, 0x28, + 0xa3, 0x4e, 0x4e, 0xa3, 0x50, 0x9, 0x0, 0x4e, + 0x9f, 0x14, 0x4e, 0x6e, 0xa5, 0x4e, 0x4e, 0x3, + 0xa1, 0x68, 0x16, 0x9f, 0x4e, 0x9e, 0x16, 0xa0, + 0xa2, 0x4e, 0xa5, 0xf5, 0xff, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0xa0, 0xa, 0xa0, 0xbb, 0xa5, 0x0, + 0x0, 0x6, 0x9e, 0x0, 0x0, 0xa0, 0xc8, 0x0, + 0x0, 0x0, 0xc8, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xcb, 0x0, 0x0, 0x0, 0xa0, 0xa1, 0xc8, + 0x9e, 0x0, 0x0, 0x9e, 0xe8, 0x6, 0xa3, 0x0, + 0x0, 0xa0, 0x8, 0xf3, 0xa0, 0x0, 0xa0, 0xa1, + 0xa0, 0xa0, 0x8, 0x0, 0x0, 0x9f, 0x6, 0xe8, + 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xc8, + 0x0, 0x0, 0x16, 0x2, 0xa0, 0x0, 0x9f, 0x1, + 0x0, 0xa0, 0xb8, 0x0, 0xd8, 0x8, 0x0, 0xff, + 0x0, 0x9f, 0xc8, 0x0, 0x0, 0x9f, 0x6, 0xa1, + 0x7, 0x0, 0x0, 0xc8, 0xa3, 0xc8, 0x6, 0x4e, + 0x9f, 0x6, 0xc8, 0x0, 0x0, 0x0, 0xa0, 0xa1, + 0xc8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8d, 0x4e, 0x8d, 0x62, 0x9c, 0x28, 0x7d, 0x8f, + 0x55, 0x2f, 0x98, 0x8f, 0x8d, 0x5e, 0x1f, 0x7d, + 0x5c, 0x8d, 0x32, 0x98, 0x93, 0x1f, 0x46, 0x74, + 0x79, 0x43, 0x37, 0x30, 0x98, 0x86, 0x8d, 0x8b, + 0x62, 0x1e, 0x8d, 0x98, 0x8d, 0x68, 0x46, 0x5f, + 0x82, 0x68, 0x75, 0x46, 0x46, 0x5e, 0x8d, 0x98, + 0x8d, 0x1f, 0x89, 0x7c, 0x82, 0x28, 0x5f, 0x44, + 0xa7, 0x82, 0x73, 0x97, 0x5c, 0x5c, 0x98, 0x8d, + 0x98, 0x82, 0x7d, 0x69, 0x16, 0x69, 0x73, 0x1, + 0x43, 0x93, 0xff, 0x1, 0x41, 0x73, 0x3d, 0x32, + 0x69, 0x73, 0x24, 0x68, 0x92, 0xf5, 0x9b, 0x16, + 0x34, 0x7b, 0x60, 0xd8, 0x8d, 0x7a, 0x14, 0x4, + 0x34, 0x16, 0x88, 0x82, 0x34, 0x16, 0x88, 0x88, + 0x14, 0x89, 0xa1, 0x16, 0x8a, 0x49, 0x6c, 0x76, + 0xab, 0x41, 0x8, 0x73, 0x82, 0x75, 0x51, 0xc, + 0xa8, 0x6d, 0x75, 0x82, 0x82, 0xa5, 0xa5, 0x8d, + 0x5e, 0x5e, 0x14, 0x6c, 0x16, 0xa7, 0x68, 0x5e, + 0xa6, 0x54, 0x6c, 0x16, 0x68, 0x68, 0x4e, 0x4, + 0x72, 0xa5, 0x2, 0x68, 0x68, 0x86, 0x1, 0xa7, + 0x68, 0xa3, 0xa3, 0xa3, 0x87, 0x4f, 0x4e, 0x68, + 0x9f, 0x14, 0x9e, 0x16, 0x6c, 0x4e, 0x68, 0xa4, + 0xa, 0xb6, 0x3d, 0x4e, 0xa3, 0x9e, 0x99, 0x69, + 0x93, 0x9f, 0x14, 0xab, 0xff, 0x4e, 0x4e, 0x4e, + 0x4e, 0x0, 0xa0, 0x16, 0x16, 0x6, 0x1, 0x3, + 0x4e, 0xd8, 0xa1, 0x4e, 0x0, 0x2, 0x6, 0x0, + 0x0, 0x0, 0xca, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc8, 0xee, 0x6, 0x2, + 0x1, 0x9e, 0x4e, 0x16, 0x3, 0xbb, 0x14, 0xf3, + 0x0, 0x6, 0x3d, 0xca, 0x8, 0xb7, 0x14, 0x6, + 0x2, 0xee, 0x6, 0x0, 0xb6, 0xee, 0x5, 0x5, + 0x16, 0x7, 0x0, 0x0, 0x0, 0x0, 0xf3, 0x3, + 0x0, 0xa0, 0xca, 0xa1, 0xbb, 0x0, 0xc8, 0x5, + 0x0, 0x6, 0x6, 0x0, 0x73, 0xa0, 0x0, 0xff, + 0x0, 0xa0, 0xa, 0x0, 0xa0, 0x16, 0x5, 0x6, + 0x16, 0xa0, 0x0, 0x73, 0xd8, 0x5, 0x2, 0x1, + 0x1, 0xa1, 0xeb, 0x6, 0x0, 0xa1, 0x1, 0x6, + 0x73, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8d, 0x6c, 0x5e, 0x79, 0x43, 0xdd, 0x82, 0x98, + 0x8d, 0x68, 0x5e, 0x8d, 0x5e, 0x32, 0x8d, 0x82, + 0x82, 0x6c, 0x5e, 0x6c, 0x82, 0x5e, 0x5e, 0x37, + 0x5e, 0x68, 0x68, 0x8d, 0x5e, 0x68, 0x4e, 0x82, + 0x5e, 0x68, 0x5e, 0x7, 0x6c, 0xa3, 0x28, 0x5e, + 0x68, 0xa3, 0x68, 0x68, 0x68, 0x68, 0x68, 0x6c, + 0x7, 0x5e, 0x5e, 0xa0, 0x28, 0x5e, 0x75, 0x82, + 0x75, 0x43, 0x34, 0x60, 0x75, 0x75, 0x43, 0x5c, + 0x6c, 0x75, 0x24, 0xff, 0xa0, 0x37, 0x75, 0x34, + 0x96, 0x82, 0xff, 0x45, 0x75, 0x76, 0xeb, 0x72, + 0x2c, 0xff, 0x76, 0x68, 0x1, 0x25, 0xa6, 0x16, + 0x75, 0x75, 0x87, 0x1, 0x76, 0x1, 0xa6, 0x28, + 0xa7, 0xf5, 0x51, 0x68, 0x34, 0x51, 0x1e, 0x5e, + 0xf5, 0xa6, 0x68, 0xeb, 0x53, 0x82, 0x5e, 0x6c, + 0x10, 0x53, 0xa1, 0x5a, 0x32, 0x75, 0x5e, 0xfc, + 0x8d, 0x51, 0xa3, 0x5e, 0xe, 0x1e, 0x6c, 0x7, + 0xc, 0x3d, 0x3, 0xf, 0xff, 0x8d, 0x68, 0x98, + 0x78, 0x1, 0x87, 0x34, 0x8d, 0x68, 0xa3, 0x51, + 0x41, 0x51, 0x5, 0x46, 0x98, 0x68, 0x73, 0x2c, + 0x79, 0x68, 0x68, 0x79, 0x68, 0x0, 0x4e, 0x24, + 0x1, 0x5, 0x68, 0xff, 0x75, 0x4e, 0x68, 0x9b, + 0x73, 0xa4, 0xd8, 0x7d, 0x5e, 0xa3, 0x69, 0x69, + 0x68, 0x2b, 0x97, 0x98, 0xff, 0x4e, 0xa3, 0x79, + 0x4e, 0x4e, 0xa0, 0x14, 0x9e, 0x0, 0x4e, 0x14, + 0x9c, 0x6d, 0xf5, 0x68, 0x9e, 0xff, 0x9e, 0x68, + 0x0, 0x0, 0x73, 0xa0, 0x4e, 0x0, 0xb4, 0xa, + 0xa, 0xa, 0x0, 0x4e, 0xee, 0x4e, 0x0, 0x0, + 0xa, 0xc8, 0xdf, 0x5, 0x0, 0x0, 0xa0, 0xee, + 0x0, 0xbb, 0xca, 0x0, 0x0, 0x1, 0x8, 0x0, + 0x0, 0x73, 0xbb, 0x0, 0xd8, 0xa0, 0x0, 0x0, + 0x6, 0xca, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xeb, + 0x0, 0xbb, 0xc8, 0x9e, 0x73, 0x0, 0x5, 0x4f, + 0x0, 0x6, 0xa1, 0x0, 0xa, 0x8, 0x0, 0xff, + 0x0, 0xa0, 0xa, 0x0, 0x8, 0xa0, 0x0, 0x0, + 0x6, 0xbb, 0x0, 0xde, 0x50, 0x0, 0x0, 0xff, + 0x9e, 0x0, 0xa0, 0xa, 0x0, 0xa, 0xb7, 0x0, + 0x0, 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xfc, 0x28, 0xa3, 0x9f, 0xa3, 0x68, 0x1f, 0x5e, + 0x4e, 0x5e, 0x68, 0xfc, 0xfc, 0x28, 0x6c, 0x5e, + 0x5e, 0x7, 0x1e, 0x6c, 0x68, 0x68, 0x6c, 0x43, + 0x28, 0x68, 0xa3, 0x5e, 0x9f, 0x86, 0x24, 0x7, + 0x9f, 0x68, 0x68, 0x37, 0x68, 0x5e, 0x68, 0x75, + 0x32, 0xa3, 0x68, 0x75, 0x6c, 0x86, 0x24, 0x28, + 0x5e, 0x86, 0x43, 0x43, 0x1e, 0x5e, 0x76, 0x37, + 0x24, 0x1f, 0x1, 0xa5, 0x9f, 0x5e, 0x5e, 0x1e, + 0x5e, 0x87, 0xa5, 0x73, 0x43, 0x1f, 0x8d, 0x51, + 0x51, 0x76, 0xff, 0x43, 0xa7, 0xa7, 0x69, 0x51, + 0x8d, 0x3d, 0xa1, 0x24, 0xff, 0x76, 0x60, 0xeb, + 0x5e, 0x76, 0xa6, 0x34, 0x76, 0xff, 0x28, 0x75, + 0x89, 0x69, 0x51, 0x28, 0x1, 0xaa, 0x82, 0x5e, + 0x1, 0x9b, 0x6c, 0xeb, 0x78, 0x82, 0x5e, 0x37, + 0xaa, 0x25, 0x9c, 0x73, 0x82, 0x82, 0xa5, 0x9c, + 0x5f, 0xb, 0x5e, 0xa9, 0x7c, 0x8d, 0x5c, 0x7f, + 0x14, 0x92, 0x8d, 0x8d, 0xff, 0x5e, 0x5e, 0x89, + 0x7a, 0x2b, 0xa6, 0x1, 0x98, 0x68, 0x68, 0x99, + 0x69, 0xaf, 0xaf, 0x98, 0x8b, 0x68, 0x34, 0x87, + 0x88, 0x73, 0x34, 0xc, 0x68, 0x5e, 0x5, 0xff, + 0x72, 0x4e, 0x68, 0xff, 0x68, 0xa3, 0xa3, 0x5b, + 0xeb, 0xa0, 0x73, 0x98, 0x98, 0x4e, 0x99, 0x99, + 0x69, 0x73, 0x98, 0x98, 0xff, 0x4e, 0x4e, 0x8d, + 0x4e, 0x4e, 0xa0, 0x73, 0x4e, 0x0, 0x4e, 0xd8, + 0x8, 0xa3, 0xff, 0x24, 0xa5, 0x1, 0x0, 0x4e, + 0x0, 0x0, 0xd8, 0xa4, 0x0, 0x0, 0x7, 0xa0, + 0xa0, 0xff, 0x0, 0xa0, 0x16, 0xa, 0xa, 0xa, + 0xee, 0x6, 0xa, 0xa0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x6, 0x6, 0x0, 0x0, 0xff, 0x0, 0x0, + 0x0, 0xbb, 0x6, 0x0, 0xff, 0xa, 0xa, 0xa, + 0x1, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x4e, 0x1, 0x9f, 0x0, 0xee, 0x4e, 0xd8, 0x4e, + 0x0, 0x6, 0x6, 0x0, 0xa, 0xa0, 0x0, 0xff, + 0x0, 0x8, 0xde, 0x0, 0x9e, 0x6, 0xa, 0xee, + 0x16, 0x6, 0x0, 0xa, 0xa0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x8, 0xa, 0x0, 0xf3, 0x16, 0x1, + 0x5, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8d, 0x68, 0x8d, 0x79, 0x5e, 0x28, 0x46, 0x98, + 0x8d, 0x7, 0x7, 0x46, 0x8d, 0x28, 0x76, 0x89, + 0x32, 0x75, 0x37, 0x8d, 0x8d, 0x5e, 0x82, 0x93, + 0x5c, 0x28, 0x32, 0x89, 0xc, 0xfc, 0x1e, 0x82, + 0x82, 0x68, 0x5e, 0x5c, 0x79, 0x86, 0x6c, 0x98, + 0xa7, 0x1e, 0x82, 0x82, 0x28, 0x5e, 0x76, 0x89, + 0x82, 0x5e, 0x8d, 0x89, 0x5c, 0x82, 0x89, 0x74, + 0xa9, 0x5c, 0x69, 0x7f, 0x37, 0x43, 0x82, 0x82, + 0x3e, 0x16, 0x60, 0x34, 0x8d, 0x82, 0x82, 0x88, + 0x51, 0xa7, 0xff, 0x82, 0x37, 0x46, 0x7f, 0xaf, + 0x5e, 0x72, 0x73, 0x41, 0x3, 0x75, 0xa5, 0xeb, + 0x24, 0x37, 0xa6, 0x73, 0x5e, 0xff, 0x2f, 0x28, + 0x82, 0x88, 0x51, 0x76, 0x34, 0x50, 0x8, 0x5e, + 0x34, 0x45, 0x5e, 0xeb, 0xa6, 0x75, 0x28, 0x89, + 0x5c, 0x6e, 0x6c, 0x69, 0x2a, 0x88, 0x34, 0x76, + 0x99, 0x9c, 0x43, 0x77, 0x7c, 0x89, 0xee, 0x88, + 0x9c, 0x8d, 0x75, 0x75, 0x16, 0xa7, 0x6c, 0xf7, + 0x72, 0x5a, 0x8, 0x3d, 0x68, 0x68, 0xa3, 0x5a, + 0x3e, 0xa5, 0x3, 0x68, 0x5e, 0x4e, 0xee, 0x6c, + 0xa7, 0x4f, 0xa0, 0xa3, 0xa3, 0x1, 0x51, 0xa2, + 0x4e, 0x4e, 0x4e, 0x3d, 0x8, 0xa3, 0x4e, 0xa5, + 0x5, 0x9f, 0x16, 0x0, 0x0, 0x4e, 0x3, 0xa5, + 0x73, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xa0, 0xd8, 0x0, 0x0, 0x0, 0x1, + 0x7, 0x0, 0xca, 0xa1, 0x2, 0xc8, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xb4, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0x8, 0x1, 0xb8, 0xa0, 0xb8, + 0xa0, 0x9e, 0xa, 0x8, 0x0, 0x0, 0x4e, 0x16, + 0x0, 0x6, 0xa1, 0x0, 0x0, 0xff, 0x9e, 0x0, + 0x0, 0x51, 0xbb, 0x0, 0xff, 0xa0, 0xa0, 0x8, + 0xb8, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xca, + 0xb7, 0xee, 0x0, 0x0, 0xca, 0x4f, 0x1, 0x0, + 0x0, 0xbb, 0x6, 0x0, 0xd8, 0xa0, 0x0, 0xff, + 0x0, 0xa0, 0xa, 0x0, 0xca, 0x2, 0x8, 0x4e, + 0x6, 0x6, 0x0, 0xa, 0x8, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xa0, 0xde, 0x0, 0x0, 0x0, 0x8, + 0xb4, 0x14, 0x9f, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x98, 0x5e, 0x8d, 0x8b, 0x8d, 0x68, 0xc, 0x8f, + 0x76, 0x6c, 0x5f, 0x98, 0x82, 0x5e, 0x82, 0x93, + 0x8d, 0x6c, 0x8d, 0x93, 0x89, 0x5e, 0xa7, 0x9c, + 0x7d, 0x5e, 0x76, 0x7d, 0x82, 0x5e, 0x82, 0x84, + 0x8d, 0x8d, 0x82, 0x98, 0x89, 0x32, 0x82, 0x7d, + 0x76, 0x5e, 0x82, 0x89, 0x8d, 0x75, 0x82, 0x98, + 0x43, 0x5e, 0x82, 0x89, 0xa7, 0x8, 0x9c, 0x7c, + 0x5c, 0x89, 0x9c, 0x14, 0x45, 0x43, 0x8d, 0x82, + 0xf5, 0x72, 0x76, 0x14, 0xa8, 0x89, 0x2f, 0x16, + 0x44, 0x8d, 0xff, 0xaf, 0x82, 0x2f, 0x16, 0x77, + 0x8d, 0xa7, 0xff, 0xf2, 0xb1, 0x5f, 0xa6, 0x73, + 0x8d, 0x89, 0x9b, 0xeb, 0x82, 0x73, 0x88, 0x76, + 0xa6, 0x14, 0x3, 0x24, 0x2b, 0x3e, 0x43, 0x6c, + 0x1, 0x45, 0x5e, 0x34, 0x45, 0x75, 0xfc, 0x5c, + 0x82, 0xa4, 0x6e, 0x28, 0x3e, 0xa8, 0x68, 0xa1, + 0x72, 0x1f, 0x1e, 0x8d, 0x8d, 0x25, 0xb4, 0x46, + 0x38, 0x43, 0x5e, 0x9f, 0x9, 0x51, 0x28, 0x28, + 0x73, 0xc, 0xa3, 0x16, 0x11, 0x4e, 0x9e, 0x16, + 0x6c, 0x24, 0x14, 0x28, 0x9f, 0xa4, 0x73, 0xfc, + 0x9f, 0xa3, 0x4e, 0x4e, 0x72, 0x6, 0x68, 0xa3, + 0xa3, 0xa3, 0x9e, 0x6e, 0x5, 0x4e, 0x4e, 0x73, + 0xa4, 0x4e, 0xee, 0x4f, 0xa3, 0x7, 0x3d, 0x89, + 0x68, 0xa3, 0xa3, 0x8d, 0xff, 0x0, 0x4e, 0x4e, + 0x4e, 0x4e, 0xa0, 0xff, 0x7, 0x4e, 0x8, 0x16, + 0x0, 0x0, 0x4f, 0xeb, 0xff, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xee, 0x7, 0x0, 0x0, 0x4e, + 0xeb, 0xff, 0x0, 0x0, 0x14, 0x7, 0x0, 0x4e, + 0x1, 0xa5, 0xbb, 0x9, 0x0, 0x0, 0xbb, 0xca, + 0x0, 0x6, 0x6, 0x0, 0x0, 0x2, 0x5, 0x0, + 0x8, 0x16, 0x6, 0x0, 0x2, 0xe8, 0x0, 0x0, + 0x5a, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa5, + 0x1, 0x5, 0x0, 0x0, 0xc8, 0x1, 0xca, 0x0, + 0x0, 0x6, 0xbb, 0x0, 0x73, 0x8, 0x0, 0xff, + 0x0, 0x8, 0xa, 0x0, 0x73, 0xb7, 0x0, 0x4e, + 0x1, 0xbb, 0x0, 0xa, 0xa0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x8, 0xa, 0x0, 0x16, 0x7, 0x0, + 0x0, 0x1, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x8d, 0x5e, 0x8, 0x1f, 0x37, 0x6c, 0x6c, 0x8d, + 0x28, 0x1f, 0x5e, 0x68, 0x75, 0x68, 0x1f, 0x38, + 0x43, 0x32, 0xa7, 0x24, 0x37, 0x1e, 0x37, 0x82, + 0x43, 0x6c, 0x24, 0x5c, 0x75, 0x68, 0x82, 0x89, + 0x76, 0x5e, 0x28, 0x89, 0x24, 0x37, 0x24, 0x89, + 0x5e, 0x68, 0x43, 0x46, 0x43, 0x86, 0x28, 0x76, + 0x28, 0x43, 0x28, 0x76, 0x28, 0x76, 0x24, 0x5f, + 0x82, 0x43, 0x8d, 0x52, 0x16, 0x1, 0x34, 0x14, + 0x88, 0x76, 0x5c, 0x96, 0xff, 0x1, 0x16, 0x69, + 0x8d, 0x93, 0xff, 0xf5, 0x34, 0xff, 0x54, 0x28, + 0x5c, 0x74, 0x73, 0x16, 0x75, 0x5c, 0xa6, 0x34, + 0x5c, 0x98, 0xa5, 0x73, 0x76, 0x7d, 0xeb, 0xff, + 0x16, 0x54, 0x5a, 0x43, 0x1, 0x9b, 0x28, 0x76, + 0x34, 0x9b, 0x75, 0x51, 0xff, 0x9b, 0x6c, 0x8, + 0x24, 0x37, 0xa4, 0x3, 0x88, 0x41, 0x5a, 0x6d, + 0x79, 0x75, 0x68, 0x5e, 0x28, 0xeb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5e, 0x7d, 0xf2, 0x1, 0x16, + 0x8a, 0x68, 0x68, 0xad, 0x14, 0x73, 0x14, 0x9d, + 0x8b, 0x28, 0x96, 0x14, 0x3b, 0x14, 0xa0, 0x8b, + 0x68, 0x4e, 0x4e, 0x86, 0x34, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4e, 0x84, 0x1, 0x1, 0x3d, 0x8a, + 0x68, 0x4e, 0x8, 0x14, 0x34, 0x14, 0x9d, 0x98, + 0x98, 0xa3, 0x79, 0x98, 0xff, 0x4e, 0x4e, 0x8d, + 0x4e, 0x4e, 0xa0, 0x1, 0x3d, 0xa, 0x14, 0xa6, + 0x4e, 0x0, 0x86, 0x14, 0xca, 0x0, 0x4e, 0x4e, + 0x0, 0x0, 0x4e, 0xb7, 0x16, 0x1, 0xa, 0xff, + 0xc8, 0x1, 0x0, 0x0, 0xa5, 0x1, 0xeb, 0x16, + 0xca, 0x0, 0x4e, 0x1, 0xee, 0xa, 0xee, 0xa3, + 0x0, 0x6, 0xbb, 0x0, 0x0, 0x4e, 0xd8, 0xff, + 0x3d, 0xca, 0x6, 0x0, 0x7, 0xee, 0xa, 0xee, + 0x1, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0xff, 0x4f, 0x0, 0x0, 0x4e, 0xff, 0xa5, 0x0, + 0x0, 0x6, 0x6, 0x0, 0xd8, 0xb8, 0x0, 0xff, + 0x0, 0xb8, 0x73, 0x0, 0xb7, 0x14, 0x73, 0xee, + 0x5, 0x3d, 0x7, 0xa, 0xa0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xb8, 0x73, 0x0, 0xc8, 0x16, 0xa, + 0xee, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x9e, 0x9e, 0x5e, 0x28, 0x5e, 0x9e, 0x5e, 0x0, + 0x68, 0x68, 0x9f, 0x68, 0x68, 0x75, 0x6c, 0x6c, + 0x82, 0x68, 0x9f, 0x76, 0x75, 0x5e, 0x5e, 0x5e, + 0x75, 0x68, 0x75, 0x24, 0x75, 0x9f, 0x5e, 0x5c, + 0x37, 0x43, 0x76, 0x76, 0x82, 0x75, 0x82, 0x43, + 0x28, 0x5e, 0x82, 0x6c, 0x76, 0x6c, 0x5e, 0x76, + 0x43, 0x5e, 0x76, 0x28, 0x28, 0x75, 0x5c, 0x89, + 0x6c, 0xa7, 0x43, 0x82, 0x76, 0xa6, 0x6d, 0x5f, + 0x5e, 0x82, 0x75, 0x6c, 0x38, 0x78, 0x9c, 0x75, + 0x82, 0x5c, 0xff, 0x82, 0x9b, 0xa8, 0xae, 0xe, + 0x38, 0x76, 0x6e, 0xb, 0x43, 0x38, 0x1f, 0x5e, + 0x8d, 0x82, 0x6c, 0x5f, 0x76, 0x9b, 0xa7, 0x24, + 0x5f, 0x54, 0x6d, 0x68, 0x8d, 0x8d, 0x38, 0x43, + 0x82, 0x8d, 0x5e, 0x24, 0xab, 0x8d, 0x86, 0x8d, + 0x5c, 0x2f, 0x1f, 0x98, 0x8b, 0x98, 0x8d, 0x46, + 0x98, 0x8d, 0x86, 0x9c, 0x87, 0xa9, 0xa7, 0x8d, + 0x84, 0x43, 0x43, 0x79, 0x98, 0x8d, 0x87, 0x5f, + 0x93, 0x5e, 0x68, 0x8d, 0x7d, 0x87, 0xa7, 0x98, + 0x98, 0x79, 0x68, 0xac, 0x6a, 0x5e, 0x68, 0x68, + 0x79, 0x68, 0x4e, 0x75, 0x4e, 0x86, 0x4e, 0x68, + 0x68, 0x4e, 0x4e, 0x68, 0x4e, 0xa8, 0xa0, 0x0, + 0x4e, 0x4e, 0xa3, 0x9f, 0xa0, 0x9f, 0x8d, 0x98, + 0x98, 0x8d, 0x8d, 0x8d, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x0, 0x4e, 0x68, 0x9e, 0xb8, 0x9f, 0x68, + 0x68, 0x0, 0x4e, 0x3d, 0xb6, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xa0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, 0x8, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0xb6, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x4e, 0x0, + 0x0, 0xca, 0xa5, 0x0, 0x0, 0x0, 0xa0, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xb8, 0x0, + 0x0, 0xb8, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb6, 0xb8, + 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x1f, 0x5e, 0x5e, 0x98, 0x79, 0x68, 0xfc, 0x82, + 0x8d, 0x68, 0x28, 0xa8, 0x37, 0xa2, 0x43, 0x93, + 0x5e, 0xfc, 0x82, 0x5c, 0x75, 0x5e, 0x76, 0x5f, + 0x82, 0x68, 0x75, 0xa7, 0x37, 0x1e, 0x46, 0x9c, + 0x82, 0x75, 0x5f, 0x84, 0x82, 0x68, 0x76, 0x5f, + 0xa7, 0x24, 0x8d, 0x5c, 0x28, 0x28, 0x46, 0x89, + 0x82, 0x68, 0x76, 0x89, 0x37, 0x82, 0x5c, 0xae, + 0xa4, 0x38, 0x2f, 0x5f, 0x76, 0x43, 0x1e, 0x24, + 0x89, 0x75, 0x68, 0x75, 0x37, 0x1f, 0x43, 0x68, + 0x82, 0x89, 0xff, 0x43, 0x76, 0x5e, 0x32, 0x5e, + 0x45, 0x88, 0x16, 0x76, 0x8d, 0x82, 0x6c, 0x75, + 0x75, 0x5e, 0x5e, 0x37, 0x37, 0x41, 0x1, 0xd, + 0x9, 0x14, 0x24, 0x75, 0x82, 0x75, 0x24, 0x76, + 0x89, 0x5e, 0x68, 0x24, 0x2f, 0x6c, 0x5e, 0x75, + 0x7d, 0x5c, 0x5c, 0x82, 0x84, 0x98, 0x8d, 0x38, + 0x89, 0xa7, 0x82, 0x7c, 0x44, 0x5f, 0x79, 0x98, + 0x8d, 0x1e, 0x43, 0x5c, 0x43, 0x9f, 0xa2, 0x68, + 0x5e, 0xfc, 0x68, 0x4e, 0x86, 0x4e, 0x86, 0x1e, + 0x4e, 0x68, 0x4e, 0x4e, 0xfc, 0x68, 0x4e, 0x4e, + 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, + 0x68, 0x4e, 0xa3, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x8d, + 0x68, 0x68, 0xa3, 0x4e, 0x0, 0x4e, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6d, 0x9, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x1, 0xbb, + 0x3, 0x16, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x62, 0x1e, 0x8d, 0x98, 0x8d, 0x68, 0x46, 0x5f, + 0x82, 0x68, 0x68, 0x46, 0x46, 0x5e, 0x8d, 0x98, + 0x8d, 0x1e, 0x5c, 0x7c, 0x8d, 0x5e, 0x24, 0x2f, + 0x5f, 0x5e, 0x8d, 0x84, 0x5f, 0x5c, 0x93, 0x84, + 0x93, 0x79, 0x46, 0x46, 0x89, 0x76, 0x89, 0x29, + 0x5f, 0x75, 0x93, 0x89, 0x1f, 0x37, 0x98, 0x89, + 0x5e, 0x5e, 0x93, 0x46, 0x43, 0x76, 0x89, 0x7c, + 0x29, 0x7c, 0x93, 0x93, 0x5c, 0x43, 0x8d, 0x82, + 0x75, 0x79, 0x6c, 0x68, 0x76, 0x76, 0xa7, 0x28, + 0x6c, 0x82, 0x51, 0x68, 0x28, 0x43, 0x5e, 0x75, + 0x9b, 0x51, 0x5f, 0x9f, 0x82, 0x8d, 0x68, 0x5e, + 0x28, 0x76, 0x68, 0x43, 0x8d, 0x82, 0x6d, 0x51, + 0xaf, 0x5c, 0x5e, 0x8, 0xa7, 0x6c, 0x5e, 0x68, + 0xc, 0x24, 0x5e, 0x5e, 0x82, 0x75, 0x68, 0x5e, + 0x8d, 0x32, 0x5e, 0x82, 0x82, 0x5e, 0x68, 0x68, + 0x28, 0x28, 0x68, 0x8d, 0x79, 0x32, 0x5e, 0x5e, + 0x5e, 0x75, 0xa3, 0x5e, 0x5e, 0x5e, 0xa3, 0x68, + 0x68, 0x68, 0x68, 0xa3, 0x68, 0xa3, 0x68, 0x68, + 0x5e, 0x9f, 0xa3, 0x75, 0x68, 0x68, 0x68, 0x68, + 0x75, 0x4e, 0xa3, 0x75, 0x4e, 0x4e, 0xa3, 0x68, + 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0xa3, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0xa3, 0xa3, 0xb8, 0x82, + 0x93, 0x8d, 0x79, 0x8d, 0x4e, 0x0, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa5, 0xe8, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x6, + 0xe8, 0x9e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x5e, 0x68, 0x68, 0x7, 0x6c, 0xa3, 0x28, 0x5e, + 0x68, 0xa3, 0x68, 0x68, 0x68, 0x68, 0x86, 0x6c, + 0x8, 0x5e, 0x68, 0xa7, 0x28, 0x5e, 0x5e, 0x89, + 0x5e, 0x75, 0x32, 0x89, 0x8d, 0x75, 0x8d, 0x8d, + 0x43, 0x68, 0x75, 0x5c, 0xa0, 0x5e, 0x82, 0x93, + 0x43, 0x5e, 0x5e, 0x76, 0x43, 0x5e, 0x5e, 0x76, + 0x8, 0x43, 0x28, 0x8d, 0x5e, 0x5e, 0x76, 0x28, + 0x28, 0x5e, 0x43, 0x43, 0x43, 0x6c, 0x5e, 0x68, + 0x68, 0x5e, 0x43, 0x6c, 0x6c, 0x6c, 0x5e, 0xf, + 0xe, 0x75, 0x75, 0x68, 0x5e, 0x37, 0x5e, 0x86, + 0x28, 0x5e, 0x5e, 0xe, 0x6c, 0x28, 0x75, 0x68, + 0x37, 0x5e, 0x75, 0x68, 0x75, 0x43, 0x5e, 0x76, + 0x5e, 0x6c, 0x6c, 0x37, 0x24, 0x5e, 0x86, 0x5e, + 0x5e, 0x5c, 0x5e, 0x5e, 0x75, 0x6c, 0xf, 0xfc, + 0x28, 0x9f, 0x9f, 0x86, 0x1f, 0x5e, 0xa3, 0x5e, + 0x5e, 0xfc, 0xfc, 0x8d, 0x5e, 0x6c, 0x5e, 0x1e, + 0x37, 0x8, 0x5e, 0x68, 0x32, 0x6c, 0x86, 0x8d, + 0x98, 0x68, 0x68, 0x68, 0x8b, 0x5e, 0xa3, 0x8d, + 0x93, 0x28, 0x5e, 0x79, 0x8b, 0x68, 0xa3, 0x79, + 0x79, 0xa3, 0xa3, 0x79, 0x79, 0xa3, 0x4e, 0x98, + 0x4e, 0x68, 0xa3, 0x68, 0x68, 0x4e, 0x4e, 0xa3, + 0xa3, 0x4e, 0x4e, 0x98, 0x4e, 0x0, 0x68, 0x98, + 0x98, 0x8d, 0x8d, 0x8d, 0x4e, 0x4e, 0x0, 0x8d, + 0x4e, 0x4e, 0x0, 0x68, 0x0, 0x0, 0xa3, 0x4e, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x9f, 0x68, 0x68, 0x37, 0x68, 0x5e, 0x86, 0x68, + 0x32, 0x9e, 0x68, 0x68, 0x9f, 0xa3, 0x28, 0x8, + 0x5e, 0xa3, 0x5e, 0x5e, 0xe, 0x5e, 0x5e, 0x5e, + 0x6c, 0x1e, 0xfc, 0x32, 0x5e, 0x9f, 0x86, 0x38, + 0x5e, 0x86, 0x5e, 0x28, 0x24, 0xf, 0x5c, 0x43, + 0x6c, 0x5e, 0xfc, 0x37, 0xa0, 0x6c, 0x5e, 0xf, + 0x24, 0x28, 0x8d, 0x82, 0x5e, 0xfc, 0x1f, 0x5e, + 0xa7, 0x7, 0xb8, 0x1f, 0x1f, 0x5f, 0x5e, 0x75, + 0x43, 0x1e, 0x1e, 0x32, 0x24, 0x82, 0x5e, 0x28, + 0x8d, 0x8d, 0x8d, 0x8d, 0x98, 0x30, 0x43, 0x5e, + 0x89, 0x5f, 0xfc, 0x1e, 0x82, 0x82, 0x86, 0x5e, + 0x46, 0x79, 0x68, 0x5e, 0x93, 0xa7, 0x1e, 0x82, + 0x76, 0x5c, 0x68, 0x43, 0x46, 0x8d, 0x68, 0x8d, + 0x93, 0x62, 0x82, 0x93, 0x74, 0xae, 0xe, 0x98, + 0x89, 0x37, 0x5e, 0x46, 0x62, 0x1f, 0x32, 0x8d, + 0x8b, 0x98, 0x7d, 0x8f, 0x62, 0xae, 0x8, 0x46, + 0x84, 0x8d, 0x5e, 0x8d, 0x98, 0x43, 0x1e, 0x98, + 0x98, 0x68, 0x68, 0x5e, 0x98, 0x5e, 0x68, 0x68, + 0x98, 0x46, 0x5e, 0x8b, 0x98, 0x68, 0x68, 0x98, + 0x98, 0x68, 0xa3, 0x98, 0x98, 0x68, 0x68, 0x68, + 0x75, 0x0, 0xa3, 0x98, 0x4e, 0x4e, 0x4e, 0xa3, + 0xa3, 0x4e, 0x4e, 0xa3, 0x4e, 0xa3, 0x98, 0x8d, + 0x8d, 0x4e, 0x8d, 0x8d, 0x4e, 0x0, 0x4e, 0x68, + 0x68, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x76, 0x76, 0xae, 0xb7, 0x24, 0x93, 0x5c, + 0x37, 0x5e, 0x79, 0x98, 0x68, 0x75, 0x8d, 0x8d, + 0x6c, 0x37, 0x82, 0xae, 0xc8, 0xf7, 0x62, 0x98, + 0x68, 0x82, 0x8d, 0x93, 0x5e, 0x8d, 0x98, 0x98, + 0x6c, 0xa7, 0x8f, 0x9c, 0x2f, 0x44, 0x77, 0x7d, + 0x93, 0x76, 0x82, 0x9c, 0x5f, 0x5c, 0x82, 0x82, + 0x7d, 0x89, 0x5e, 0x8d, 0x93, 0x93, 0x1e, 0x82, + 0x89, 0x9c, 0x8d, 0x5c, 0x57, 0x8f, 0x5c, 0x98, + 0x84, 0x93, 0x82, 0x89, 0x8c, 0xa9, 0x24, 0x7d, + 0x64, 0x5f, 0x5e, 0x79, 0x46, 0x5c, 0x5e, 0x93, + 0x84, 0x5e, 0x1e, 0x89, 0x84, 0xa7, 0xa7, 0x9c, + 0x52, 0xae, 0x28, 0x93, 0x84, 0x5c, 0x5c, 0x98, + 0x98, 0x8d, 0x28, 0x5c, 0x93, 0x8, 0xa0, 0x62, + 0x33, 0xc, 0x82, 0x93, 0x8d, 0x43, 0x5e, 0x82, + 0x5c, 0x5e, 0x5e, 0x5e, 0x6c, 0xfc, 0x68, 0xa3, + 0x68, 0x68, 0xa3, 0x68, 0x68, 0xa2, 0xa3, 0x68, + 0x68, 0x68, 0x4e, 0x9e, 0x4e, 0xa3, 0x4e, 0xa3, + 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0xa3, 0x9f, 0x4e, + 0x4e, 0xa3, 0xa3, 0x86, 0x4e, 0x0, 0x86, 0x4e, + 0x4e, 0x4e, 0xa3, 0xa3, 0x9f, 0xa3, 0x9f, 0xa3, + 0x4e, 0x4e, 0xa3, 0x4e, 0x0, 0x4e, 0x4e, 0x4e, + 0x4e, 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0xa3, 0xa3, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xa7, 0xa7, 0x74, 0x60, 0xa9, 0x37, 0x93, 0x8f, + 0x46, 0x46, 0x8b, 0x8b, 0x79, 0x1e, 0x46, 0x93, + 0xa0, 0xa0, 0x62, 0x27, 0x29, 0x82, 0x8f, 0x98, + 0x37, 0x1e, 0x8f, 0x98, 0x82, 0xa7, 0x62, 0x93, + 0xa7, 0x5f, 0x8f, 0x8f, 0x44, 0x8e, 0x4b, 0x62, + 0x7c, 0x82, 0x38, 0x62, 0x89, 0x89, 0x76, 0x8d, + 0x30, 0x38, 0x43, 0x86, 0xa7, 0xae, 0x12, 0x93, + 0x7c, 0x8d, 0x5e, 0x1f, 0x7d, 0x93, 0x8d, 0x8d, + 0x62, 0x55, 0x46, 0x82, 0xa9, 0xa6, 0x12, 0x38, + 0x46, 0x8d, 0x68, 0x37, 0x30, 0x46, 0x5e, 0x8d, + 0x76, 0xa7, 0x5f, 0x46, 0x9c, 0xc, 0xf7, 0x30, + 0x62, 0x82, 0x68, 0x8d, 0x93, 0x30, 0x1f, 0x8d, + 0x8d, 0x9f, 0x28, 0x46, 0x82, 0x75, 0x5e, 0x8d, + 0x38, 0x46, 0x5e, 0x75, 0x8d, 0x6c, 0x37, 0x5c, + 0x1e, 0x5e, 0x5e, 0x75, 0x28, 0x37, 0x68, 0x68, + 0x68, 0x68, 0xfc, 0x37, 0xa3, 0xa3, 0x9f, 0x68, + 0x1e, 0x4e, 0x68, 0xa3, 0xa3, 0x5e, 0x75, 0x68, + 0x4e, 0x68, 0x9f, 0x68, 0x68, 0xa3, 0xa3, 0x4e, + 0x68, 0xa3, 0xa3, 0xa2, 0x86, 0xa2, 0xa3, 0x5e, + 0xa2, 0xa2, 0x9f, 0x9f, 0x98, 0xa3, 0xa3, 0xa3, + 0xa3, 0x4e, 0xa3, 0xa3, 0x0, 0x4e, 0x4e, 0xa3, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0x0, 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x79, 0xa3, 0x0, 0x0, 0x75, 0x82, 0x0, + 0x86, 0x86, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0xc, 0x8, 0x38, 0x62, 0x82, 0x86, 0x8d, 0x93, + 0x30, 0x1f, 0x8d, 0x8d, 0x9f, 0x28, 0x46, 0x8d, + 0x68, 0x5e, 0x79, 0x30, 0x46, 0x9f, 0x8d, 0x8d, + 0x28, 0x46, 0x8d, 0x8d, 0x6c, 0x6c, 0x38, 0x1e, + 0x68, 0x86, 0x8d, 0x46, 0x38, 0x30, 0x46, 0x5c, + 0x76, 0x6c, 0x24, 0x24, 0x32, 0x6c, 0x86, 0x43, + 0x28, 0xa0, 0x5e, 0x9e, 0x6c, 0x28, 0x68, 0x5e, + 0x68, 0x86, 0x5e, 0x5e, 0x1f, 0x37, 0x5e, 0x68, + 0xa7, 0x6c, 0x5e, 0x68, 0x6c, 0x5e, 0x68, 0x28, + 0x86, 0x5e, 0x68, 0x68, 0x5e, 0x9f, 0x5e, 0xa3, + 0x6c, 0x6c, 0x28, 0x68, 0x8d, 0x68, 0x68, 0x32, + 0x8d, 0x28, 0x9f, 0x9f, 0x5e, 0x7, 0x7, 0x5e, + 0x68, 0xa3, 0x5e, 0x4e, 0x68, 0xa3, 0x68, 0x68, + 0x5e, 0x5e, 0x7, 0x6c, 0x75, 0x5e, 0x6c, 0x75, + 0x5c, 0x8d, 0x5e, 0x79, 0x98, 0x8d, 0x5e, 0x8d, + 0x98, 0x5e, 0x9f, 0x79, 0x8d, 0x68, 0x68, 0x79, + 0x98, 0x32, 0x75, 0x4e, 0x8d, 0x68, 0x9e, 0x79, + 0x68, 0x4e, 0xa3, 0x8b, 0x68, 0x4e, 0x75, 0x98, + 0x68, 0x4e, 0x75, 0x98, 0x75, 0x4e, 0x86, 0x8b, + 0x68, 0x4e, 0x98, 0x8b, 0x98, 0x79, 0x98, 0x98, + 0x79, 0xa2, 0x79, 0x98, 0xa3, 0x0, 0x4e, 0x8d, + 0x4e, 0x4e, 0x68, 0x8d, 0x8d, 0x4e, 0x8d, 0x8d, + 0x4e, 0x0, 0x8d, 0x68, 0x4e, 0x0, 0x4e, 0x86, + 0x4e, 0xa2, 0x4e, 0x4e, 0x4e, 0x79, 0x0, 0x0, + 0x0, 0x4e, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x68, 0x68, 0x32, 0x8d, 0x28, 0x9f, 0x5e, 0x9f, + 0x7, 0x7, 0x5e, 0x86, 0xa3, 0x9f, 0x4e, 0x86, + 0xa3, 0x68, 0x68, 0x5e, 0x32, 0xb6, 0x6c, 0x86, + 0x5e, 0x9f, 0x5e, 0x68, 0x68, 0x68, 0x5e, 0x5e, + 0x68, 0x7, 0x28, 0x28, 0x7, 0xb7, 0xb7, 0xa0, + 0xf, 0x24, 0x43, 0x79, 0x76, 0xa7, 0x1e, 0x5e, + 0x98, 0x82, 0x5e, 0xfc, 0x1e, 0x79, 0x86, 0x68, + 0x82, 0xe, 0x6c, 0x5e, 0x9c, 0xa6, 0x12, 0x1f, + 0x93, 0x8d, 0x5e, 0x28, 0x46, 0x37, 0x5e, 0x98, + 0x8f, 0x2f, 0xa0, 0x8d, 0x98, 0x5e, 0x5e, 0x1e, + 0x93, 0x82, 0x5e, 0x98, 0x62, 0x2f, 0xa7, 0x8f, + 0x62, 0xa8, 0xf0, 0x55, 0x98, 0x5e, 0x5e, 0x46, + 0x30, 0x5e, 0x86, 0x8d, 0x98, 0xfc, 0xe, 0x9c, + 0x8b, 0x76, 0xc, 0x33, 0x62, 0x32, 0x8d, 0x8d, + 0x8f, 0x8d, 0x28, 0x8f, 0x8b, 0x8d, 0x28, 0x98, + 0x8b, 0x5e, 0x9e, 0x8d, 0x8d, 0x28, 0x68, 0x98, + 0x8d, 0x68, 0x68, 0x8b, 0x98, 0x68, 0x5e, 0x98, + 0x79, 0x68, 0x68, 0x98, 0x79, 0x68, 0x68, 0x8b, + 0x68, 0x4e, 0xa3, 0x98, 0x98, 0x4e, 0x4e, 0x8b, + 0xa3, 0x4e, 0x98, 0x98, 0x98, 0xa3, 0x98, 0x7d, + 0x9e, 0x4e, 0xa3, 0x8d, 0x4e, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x8d, 0x8d, 0x4e, 0x0, 0x8d, 0x8d, + 0x4e, 0x0, 0x0, 0x79, 0x0, 0x0, 0x86, 0x68, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x2f, 0xa7, 0x8f, 0x62, 0xae, 0xf0, 0x33, 0x98, + 0x5e, 0x5e, 0x46, 0x30, 0x32, 0x68, 0x79, 0x98, + 0xfc, 0xe, 0x9c, 0x8b, 0x76, 0xc, 0x27, 0x62, + 0x5e, 0x8d, 0x8b, 0x62, 0x30, 0x5c, 0x8f, 0x98, + 0x1e, 0x44, 0x52, 0x62, 0xac, 0x60, 0x60, 0x5b, + 0x47, 0x5f, 0x76, 0x93, 0x84, 0x30, 0x30, 0x93, + 0x89, 0x98, 0x8d, 0x1e, 0x93, 0x98, 0x5e, 0x79, + 0x93, 0x60, 0xa0, 0x82, 0x7d, 0x74, 0x12, 0x62, + 0x62, 0x8d, 0x4e, 0x8d, 0x62, 0x9c, 0x37, 0x7d, + 0x8f, 0x55, 0x2f, 0x98, 0x8f, 0x8d, 0x68, 0x5c, + 0x62, 0x98, 0x8d, 0x93, 0x62, 0x55, 0xa6, 0xaa, + 0x8f, 0x74, 0x2f, 0x62, 0x8b, 0x8d, 0x5e, 0x8b, + 0x62, 0x8d, 0x5e, 0x98, 0x98, 0x82, 0x2c, 0xaa, + 0x7d, 0x82, 0x43, 0x7d, 0x89, 0x8d, 0x75, 0x8d, + 0x8d, 0x43, 0xe, 0x37, 0x8d, 0x5e, 0xa3, 0x28, + 0x37, 0x68, 0x68, 0xa3, 0x68, 0x68, 0x28, 0x5e, + 0x4e, 0x0, 0xa3, 0x28, 0xa3, 0x4e, 0x4e, 0xa3, + 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x68, + 0x4e, 0x4e, 0x4e, 0xa3, 0x4e, 0x68, 0x4e, 0x4e, + 0x4e, 0xa3, 0xa3, 0xa3, 0xa3, 0x4e, 0x9e, 0x82, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x77, 0x87, 0xad, 0x8f, 0x74, 0x2f, 0x62, 0x8b, + 0x8d, 0x5e, 0x8b, 0x62, 0x8d, 0x5e, 0x98, 0x98, + 0x82, 0x2c, 0xaa, 0x7d, 0x82, 0x37, 0x62, 0x8b, + 0x8d, 0x82, 0x98, 0x98, 0x46, 0x82, 0xaa, 0x93, + 0x82, 0xa8, 0xaa, 0x65, 0x8f, 0x94, 0x8c, 0x30, + 0x62, 0x5c, 0x8d, 0x82, 0x98, 0x98, 0x82, 0x5c, + 0x98, 0x93, 0x32, 0x86, 0x43, 0xa7, 0xb6, 0x9f, + 0x8d, 0x8d, 0x68, 0x86, 0x8d, 0x8d, 0x5e, 0x5e, + 0x8d, 0x8d, 0x6c, 0x5e, 0x79, 0x37, 0xb8, 0x82, + 0x98, 0x8d, 0x86, 0x5e, 0x8d, 0x68, 0x68, 0x8d, + 0x8d, 0x5e, 0x7, 0x76, 0x82, 0x76, 0xa0, 0x2f, + 0x62, 0x82, 0x5e, 0x79, 0x8d, 0x86, 0x5e, 0x37, + 0x8d, 0x5e, 0x6c, 0x28, 0x5e, 0x68, 0x5e, 0x82, + 0x82, 0x5e, 0x5e, 0x8d, 0x32, 0x68, 0x7, 0x28, + 0x9f, 0x86, 0x5e, 0x5e, 0x68, 0x68, 0xa3, 0x68, + 0x9f, 0x5e, 0x4e, 0xa3, 0x68, 0x4e, 0xa3, 0x86, + 0x68, 0x68, 0x4e, 0x68, 0x68, 0xa3, 0xa3, 0xa3, + 0x68, 0x4e, 0x4e, 0x68, 0xa3, 0x4e, 0xa3, 0xa3, + 0xa3, 0x4e, 0x68, 0x4e, 0x68, 0x0, 0x68, 0x4e, + 0xa3, 0xa3, 0x79, 0x9c, 0x93, 0xa3, 0xa3, 0x8d, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, 0x4e, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x43, 0x8, 0x2f, 0x62, 0x8d, 0x5e, 0x8d, 0x79, + 0x68, 0x9f, 0x37, 0x8d, 0x5e, 0x6c, 0x28, 0x5e, + 0x68, 0x5e, 0x82, 0x82, 0x5e, 0x5e, 0x8d, 0x32, + 0x86, 0x6c, 0xa7, 0x28, 0x5e, 0x5e, 0xf7, 0x28, + 0x68, 0x5e, 0x8d, 0x82, 0x46, 0x46, 0x5c, 0x89, + 0x5e, 0x86, 0xfc, 0xf, 0x32, 0x9f, 0x68, 0x5e, + 0x28, 0x8, 0x7, 0x86, 0x86, 0x5e, 0xfc, 0x75, + 0x32, 0x9e, 0x5e, 0xa3, 0xfc, 0x9e, 0x9f, 0xa3, + 0x5e, 0xfc, 0x28, 0xa3, 0x9f, 0xa3, 0x68, 0x1f, + 0x5e, 0x4e, 0x68, 0x86, 0xfc, 0x1e, 0x7, 0x9f, + 0x9f, 0x5e, 0xfc, 0x28, 0x68, 0x86, 0x5e, 0xe, + 0x12, 0x5e, 0x68, 0x7, 0x28, 0xe, 0xdd, 0x7, + 0x9f, 0x5e, 0x5e, 0xfc, 0x8d, 0x68, 0xa3, 0x6c, + 0xe, 0x43, 0x6c, 0xb8, 0x6c, 0x28, 0x28, 0xe, + 0x5c, 0x8d, 0x5e, 0x98, 0x98, 0x1f, 0x5e, 0x8d, + 0x79, 0x68, 0xa3, 0x37, 0x79, 0x68, 0xa3, 0x46, + 0x98, 0x68, 0x68, 0x68, 0x79, 0x68, 0x68, 0x79, + 0x68, 0x4e, 0x4e, 0x68, 0x68, 0x4e, 0x68, 0x4e, + 0x75, 0x4e, 0x68, 0x98, 0x68, 0xa3, 0x4e, 0x93, + 0x5e, 0xa3, 0x98, 0x8b, 0x68, 0x98, 0x98, 0x98, + 0x79, 0x4e, 0xa3, 0x79, 0x4e, 0x4e, 0x4e, 0x82, + 0x4e, 0x0, 0x0, 0x8d, 0x8d, 0x68, 0x79, 0x68, + 0x4e, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x86, 0x68, 0xe, 0xe, 0x5e, 0x86, 0x7, 0x28, + 0x24, 0xdd, 0x7, 0x68, 0x5e, 0x5e, 0xfc, 0x8d, + 0x5e, 0x9e, 0x6c, 0xe, 0x37, 0x6c, 0x7, 0x6c, + 0xfc, 0xe, 0xe, 0x5e, 0x86, 0x86, 0x1f, 0x1f, + 0x68, 0x5e, 0x76, 0x2c, 0x33, 0xe, 0x12, 0xae, + 0x89, 0x5e, 0xfc, 0x5c, 0x82, 0x5e, 0x8, 0x5e, + 0x5c, 0x5c, 0x79, 0x86, 0x79, 0x98, 0x46, 0x8d, + 0x98, 0x8d, 0x5e, 0x28, 0x46, 0x8d, 0x9f, 0x6c, + 0x8d, 0x8d, 0x5e, 0x8d, 0x79, 0x5e, 0x28, 0x46, + 0x98, 0x8d, 0x7, 0x7, 0x46, 0x8d, 0x6c, 0x8d, + 0x98, 0x68, 0x82, 0x93, 0x8d, 0x82, 0x6c, 0x2c, + 0x55, 0x8d, 0x5e, 0x5f, 0x89, 0x46, 0x8d, 0x46, + 0x98, 0x79, 0x4e, 0x98, 0x8d, 0x5e, 0x5e, 0xaa, + 0x55, 0x98, 0x76, 0x55, 0x8f, 0x79, 0x8d, 0x98, + 0x84, 0x5e, 0x32, 0x9c, 0x74, 0x62, 0x37, 0x9c, + 0x8b, 0x68, 0x68, 0x98, 0x98, 0x68, 0x68, 0x98, + 0x8b, 0x68, 0x68, 0x68, 0x98, 0x5e, 0x5e, 0x86, + 0x68, 0x68, 0xa3, 0x8b, 0x68, 0x4e, 0x68, 0x68, + 0x68, 0xa3, 0xa3, 0x98, 0x68, 0x4e, 0x68, 0x98, + 0x98, 0x4e, 0x98, 0x98, 0x98, 0x98, 0x98, 0x98, + 0x8d, 0x4e, 0x4e, 0x8d, 0x4e, 0x4e, 0x0, 0x8d, + 0x4e, 0x0, 0x4e, 0x4e, 0x0, 0x4e, 0x68, 0x68, + 0x0, 0x0, 0x0, 0x4e, 0x0, 0x0, 0x4e, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x82, 0x9f, 0x2c, 0x33, 0x8d, 0x9f, 0x5f, 0x7d, + 0x46, 0x8d, 0x46, 0x98, 0x8d, 0x4e, 0x98, 0x8d, + 0x9f, 0x32, 0xaa, 0x55, 0x98, 0x76, 0x64, 0x8f, + 0x8d, 0x98, 0x8f, 0x98, 0x5e, 0x8d, 0x98, 0x9c, + 0x68, 0x8d, 0x74, 0x60, 0x7e, 0x94, 0x8f, 0x57, + 0x62, 0x5c, 0x89, 0x89, 0x8b, 0x82, 0x76, 0x8d, + 0x93, 0x8d, 0x5e, 0x79, 0x98, 0x98, 0x82, 0x82, + 0x62, 0x93, 0x28, 0x82, 0x98, 0x8d, 0x28, 0x8d, + 0x8b, 0x98, 0x5e, 0x8d, 0x8b, 0x8d, 0x5e, 0xc, + 0x8f, 0x76, 0x6c, 0x5f, 0x98, 0x8d, 0x32, 0x8d, + 0x8b, 0x8d, 0x5e, 0x82, 0x9c, 0x46, 0x7, 0xa6, + 0xaa, 0x8d, 0x28, 0x93, 0x8b, 0x8d, 0x82, 0x98, + 0x98, 0x8d, 0x75, 0x93, 0x93, 0x8d, 0x37, 0xad, + 0x74, 0x82, 0x5c, 0x93, 0x93, 0x8d, 0x75, 0x5e, + 0xa7, 0x9f, 0x68, 0xf7, 0x6c, 0x86, 0xa3, 0x68, + 0x68, 0x68, 0xa3, 0x4e, 0x75, 0x4e, 0x4e, 0x68, + 0x5e, 0x4e, 0xa3, 0x5e, 0x4e, 0x9e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, + 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x0, 0x4e, 0xa3, 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, + 0x4e, 0x4e, 0x0, 0x4e, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + 0x46, 0xb6, 0x87, 0xad, 0x79, 0x43, 0x93, 0x98, + 0x8d, 0x82, 0x93, 0x98, 0x79, 0x75, 0x7d, 0x98, + 0x79, 0x37, 0xaa, 0x74, 0x82, 0x46, 0x62, 0x8f, + 0x8d, 0x8d, 0x98, 0x8f, 0x1e, 0x82, 0x9c, 0xa8, + 0x28, 0x37, 0x74, 0x55, 0x98, 0x8b, 0x93, 0x62, + 0x62, 0x5c, 0x8d, 0x8d, 0x8d, 0x5c, 0x28, 0x43, + 0x82, 0x8d, 0x5e, 0xfc, 0x46, 0x75, 0x28, 0x5e, + 0x46, 0x30, 0x28, 0x68, 0x79, 0x5e, 0xfc, 0x1f, + 0x8d, 0x8d, 0x5e, 0x8, 0x1f, 0x37, 0x6c, 0x9f, + 0x8d, 0x37, 0x1e, 0x5e, 0x68, 0x68, 0x68, 0x1f, + 0x46, 0x68, 0x68, 0xb7, 0x2c, 0xe, 0x1e, 0x28, + 0x37, 0x5e, 0xfc, 0x46, 0x8d, 0x68, 0x68, 0x37, + 0x2c, 0x4e, 0x68, 0x6c, 0x37, 0x1f, 0x1f, 0x8d, + 0x8d, 0x68, 0xfc, 0x38, 0x38, 0x5e, 0x5e, 0x6c, + 0xf7, 0x5e, 0xfc, 0x28, 0x68, 0x4e, 0xa3, 0x4e, + 0x1e, 0x4e, 0x4e, 0x68, 0x32, 0x68, 0xf, 0x32, + 0x9f, 0x86, 0x4e, 0xfc, 0x5e, 0xa3, 0x4e, 0x4e, + 0x68, 0xa3, 0x68, 0xa3, 0xa3, 0xa3, 0xa3, 0x68, + 0xa3, 0x4e, 0x4e, 0xa3, 0xa3, 0x4e, 0x4e, 0x4e, + 0xa3, 0x9f, 0x79, 0x8d, 0x32, 0xa3, 0xa3, 0x8d, + 0x4e, 0x0, 0x4e, 0x4e, 0x4e, 0x4e, 0x0, 0x4e, + 0x0, 0x4e, 0x4e, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + +static GClut savedimage0_clut = { 256, 0, -1, + 0xffffff, 0x292929, 0x525252, 0x5a5a5a, 0x636363, 0x737373, 0x7b7b7b, 0xcecece, + 0xcec6c6, 0x524a4a, 0x4a4242, 0x847373, 0xc6adad, 0x846b6b, 0xd6adad, 0xe7b5b5, + 0xbd8c8c, 0xb58484, 0xd69c9c, 0x946363, 0x100808, 0x422121, 0x211010, 0x521010, + 0x100000, 0xff0000, 0x8c3129, 0xad6b63, 0x843931, 0x732921, 0xefbdb5, 0xefb5ad, + 0x9c635a, 0x632921, 0x632118, 0x633931, 0xdebdb5, 0x94736b, 0x73524a, 0xd69484, + 0xe7c6bd, 0xc6a59c, 0x523931, 0x422921, 0xbda59c, 0xa57b6b, 0x943918, 0xd6ad9c, + 0xe7ad94, 0xad5a39, 0xf7d6c6, 0xdea58c, 0x423129, 0xbd846b, 0x944a29, 0xe7c6b5, + 0xe7b59c, 0x6b4a39, 0xad6b4a, 0x4a2918, 0xb56339, 0x312118, 0xad9484, 0x5a3118, + 0x9c8473, 0x846b5a, 0x844a21, 0xefceb5, 0xc6a58c, 0xb5947b, 0xe7bd9c, 0xde9c6b, + 0x634229, 0xcea584, 0xbd8c63, 0xefad73, 0xb57b4a, 0x9c6331, 0xfff7ef, 0xbdb5ad, + 0x9c948c, 0x736b63, 0xbda58c, 0xa58c73, 0x5a4a39, 0xd6ad84, 0x947352, 0xdead7b, + 0xb57b42, 0xad6b29, 0x6b635a, 0xc69c6b, 0xefcea5, 0xbd8c52, 0xefdec6, 0xd6bd9c, + 0xbda584, 0xad9473, 0xe7bd84, 0xa57331, 0xcead7b, 0xefbd73, 0x8c6b39, 0x846331, + 0xf7e7ce, 0x7b6b52, 0xcea55a, 0xce9c42, 0xded6c6, 0x9c9484, 0x5a5242, 0xad8c4a, + 0x524221, 0xbd9442, 0x8c8473, 0x4a4231, 0xd6bd84, 0xf7e7bd, 0xe7d6ad, 0xc6b58c, + 0xb5a57b, 0xffe7ad, 0xa5946b, 0x9c8c63, 0xdec68c, 0xe7ce8c, 0xdebd6b, 0x6b5a31, + 0x8c7331, 0xd6ad4a, 0xefdead, 0xa59463, 0xefd68c, 0xa58c42, 0xf7efd6, 0xb5ad94, + 0x6b634a, 0xe7d69c, 0x5a5239, 0xf7de8c, 0xe7ce7b, 0xf7e7ad, 0xdec673, 0xefd67b, + 0x94844a, 0xd6bd63, 0x8c8463, 0xefde94, 0xe7ce6b, 0xceb54a, 0x9c946b, 0x8c845a, + 0xf7e794, 0x736b42, 0x948439, 0xb5ad7b, 0xd6ce94, 0x9c945a, 0xefefe7, 0xdeded6, + 0xbdbdb5, 0x8c8c84, 0xf7f7e7, 0xefefde, 0xb5b5a5, 0xa5a594, 0xa5a58c, 0xcecead, + 0xbdbd9c, 0xc6c69c, 0xbdbd84, 0xcece8c, 0xc6c67b, 0xbdc68c, 0xbdc6a5, 0x7b8463, + 0x8c9c63, 0x9cad73, 0x94a56b, 0xa5b58c, 0x6b7363, 0xa5e79c, 0xd6ded6, 0xa5b5b5, + 0xb5c6ce, 0x9cadb5, 0x94a5ad, 0x7b848c, 0x8c9cad, 0x8cadce, 0x7b94b5, 0x63738c, + 0x394252, 0x7b94ce, 0x5a7bc6, 0x737b94, 0x425ab5, 0x7b84ad, 0x636b94, 0x737bb5, + 0x9c9ca5, 0x52525a, 0x5a5a63, 0x4a4a5a, 0x8484a5, 0x9c9cc6, 0x8484bd, 0x5a5a84, + 0x525284, 0x6363ad, 0x524a9c, 0x42398c, 0x6b638c, 0x7363ad, 0x42317b, 0x392963, + 0x39314a, 0x523984, 0x847b94, 0x634a8c, 0x9c84bd, 0xb5a5c6, 0x312142, 0x635273, + 0x52396b, 0x211031, 0x8c63ad, 0x84738c, 0x9c84a5, 0x7b6384, 0x42294a, 0x845294, + 0x948494, 0x8c7b8c, 0x523952, 0x312131, 0x946394, 0x6b396b, 0x211021, 0xc6a5bd, + 0xad7b9c, 0x5a314a, 0x291821, 0xb5a5ad, 0x5a4a52, 0x311821, 0xce9cad, 0xceb5bd, + 0xbd8c9c, 0x73394a, 0x4a2931, 0x7b394a, 0xe7b5bd, 0x84525a, 0x8c3942, 0x0 }; + +static struct _GImage savedimage0_base = { + it_index, + 15420,379,375,379, + (uint8 *) savedimage0_data, + &savedimage0_clut, + 0xffffffff +}; + +GImage savedimage = { 0, &savedimage0_base }; diff --git a/fontforge/savefontdlg.c b/fontforge/savefontdlg.c new file mode 100644 index 00000000..b4b94cf0 --- /dev/null +++ b/fontforge/savefontdlg.c @@ -0,0 +1,2774 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include "utype.h" +#include "ustring.h" +#include "gfile.h" +#include "gio.h" +#include "gresource.h" +#include "gicons.h" +#include +#include "psfont.h" + +#define CID_Family 2000 + +#define CID_OK 1001 +#define CID_PS_AFM 1002 +#define CID_PS_PFM 1003 +#define CID_PS_TFM 1004 +#define CID_PS_HintSubs 1005 +#define CID_PS_Flex 1006 +#define CID_PS_Hints 1007 +#define CID_PS_Restrict256 1008 +#define CID_PS_Round 1009 +#define CID_TTF_Hints 1101 +#define CID_TTF_FullPS 1102 +#define CID_TTF_AppleMode 1103 +#define CID_TTF_PfEdComments 1104 +#define CID_TTF_PfEdColors 1105 +#define CID_TTF_PfEd 1106 +#define CID_TTF_OpenTypeMode 1107 + + +struct gfc_data { + int done; + int sod_done; + int sod_which; + int sod_invoked; + int ret; + int family, familycnt; + GWindow gw; + GGadget *gfc; + GGadget *pstype; + GGadget *bmptype; + GGadget *bmpsizes; + GGadget *options; + int ps_flags; + int ttf_flags; + int otf_flags; + int psotb_flags; + SplineFont *sf; +}; + +#if __Mac +static char *extensions[] = { ".pfa", ".pfb", "", ".mult", ".pfa", ".pfb", ".pt3", ".ps", + ".cid", ".cff", ".cid.cff", + ".ttf", ".ttf", ".suit", ".dfont", ".otf", ".otf.dfont", ".otf", + ".otf.dfont", ".svg", NULL }; +static char *bitmapextensions[] = { ".*bdf", ".ttf", ".dfont", ".bmap", ".dfont", ".*fnt", ".otb", ".none", NULL }; +#else +static char *extensions[] = { ".pfa", ".pfb", ".bin", ".mult", ".pfa", ".pfb", ".pt3", ".ps", + ".cid", ".cff", ".cid.cff", + ".ttf", ".ttf", ".ttf.bin", ".dfont", ".otf", ".otf.dfont", ".otf", + ".otf.dfont", ".svg", NULL }; +static char *bitmapextensions[] = { ".*bdf", ".ttf", ".dfont", ".bmap.bin", ".*fnt", ".otb", ".none", NULL }; +#endif +static GTextInfo formattypes[] = { + { (unichar_t *) "PS Type 1 (Ascii)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PS Type 1 (Binary)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#if __Mac + { (unichar_t *) "PS Type 1 (Resource)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#else + { (unichar_t *) "PS Type 1 (MacBin)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#endif + { (unichar_t *) "PS Type 1 (Multiple)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PS Multiple Master(A)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PS Multiple Master(B)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PS Type 3", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PS Type 0", NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "PS CID", NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "CFF (Bare)", NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "CFF CID (Bare)", NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "True Type", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "True Type (Symbol)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#if __Mac + { (unichar_t *) "True Type (Resource)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#else + { (unichar_t *) "True Type (MacBin)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#endif + { (unichar_t *) "True Type (Mac dfont)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "Open Type (CFF)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "Open Type (Mac dfont)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "Open Type CID", NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "Open Type CID (dfont)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "SVG font", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_Nooutlinefont, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { NULL } +}; +static GTextInfo bitmaptypes[] = { + { (unichar_t *) "BDF", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "In TTF", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "sbits only (dfont)", NULL, 0, 0, NULL, NULL, 1, 0, 0, 0, 0, 0, 1 }, +#if __Mac + { (unichar_t *) "NFNT (Resource)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#else + { (unichar_t *) "NFNT (MacBin)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, +#endif +/* OS/X doesn't seem to support NFNTs, so there's no point in putting them in a dfont */ +/* { (unichar_t *) "NFNT (dfont)", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 },*/ + { (unichar_t *) "Win FNT", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) "OpenType Bitmap", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_Nobitmapfonts, NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1 }, + { NULL } +}; + +#if __Mac +int old_ttf_flags = ttf_flag_applemode; +int old_otf_flags = ttf_flag_applemode; +#else +int old_ttf_flags = ttf_flag_otmode; +int old_otf_flags = ttf_flag_otmode; +#endif +int old_ps_flags = ps_flag_afm|ps_flag_round; +int old_psotb_flags = ps_flag_afm; + +int oldformatstate = ff_pfb; +int oldbitmapstate = 0; +extern int alwaysgenapple, alwaysgenopentype; + +static const char *pfaeditflag = "SplineFontDB:"; + + +int32 *ParseBitmapSizes(GGadget *g,int msg,int *err) { + const unichar_t *val = _GGadgetGetTitle(g), *pt; unichar_t *end, *end2; + int i; + int32 *sizes; + + *err = false; + end2 = NULL; + for ( i=1, pt = val; (end = u_strchr(pt,',')) || (end2=u_strchr(pt,' ')); ++i ) { + if ( end!=NULL && end2!=NULL ) { + if ( end20 ) ++i; + if ( *end!=' ' && *end!=',' && *end!='\0' ) { + free(sizes); + ProtestR(msg); + *err = true; +return( NULL ); + } + while ( *end==' ' || *end==',' ) ++end; + pt = end; + } + sizes[i] = 0; +return( sizes ); +} + +static int WriteAfmFile(char *filename,SplineFont *sf, int formattype) { + char *buf = galloc(strlen(filename)+6), *pt, *pt2; + FILE *afm; + int ret; + unichar_t *temp; + int subtype = formattype; + + if ( (formattype==ff_mma || formattype==ff_mmb) && sf->mm!=NULL ) { + sf = sf->mm->normal; + subtype = ff_pfb; + } + + strcpy(buf,filename); + pt = strrchr(buf,'.'); + if ( pt!=NULL && (pt2=strrchr(buf,'/'))!=NULL && ptmm!=NULL ) { + MMSet *mm = sf->mm; + int i; + for ( i=0; iinstance_count; ++i ) { + sf = mm->instances[i]; + buf = galloc(strlen(filename)+strlen(sf->fontname)+4+1); + strcpy(buf,filename); + pt = strrchr(buf,'/'); + if ( pt==NULL ) pt = buf; + else ++pt; + strcpy(pt,sf->fontname); + strcat(pt,".afm"); + GProgressChangeLine2(temp=uc_copy(buf)); free(temp); + afm = fopen(buf,"w"); + free(buf); + if ( afm==NULL ) +return( false ); + ret = AfmSplineFont(afm,sf,subtype); + if ( fclose(afm)==-1 ) +return( false ); + if ( !ret ) +return( false ); + } + buf = galloc(strlen(filename)+8); + + strcpy(buf,filename); + pt = strrchr(buf,'.'); + if ( pt!=NULL && (pt2=strrchr(buf,'/'))!=NULL && ptsubfontcnt==0 && sf->encoding_name!=em_custom && !sf->compacted ) + encname = EncodingName(sf->encoding_name ); + if ( encname==NULL ) + fprintf( enc, "/%s-Enc [\n", sf->fontname ); + else + fprintf( enc, "/%s [\n", encname ); + for ( i=0; icharcnt && i<256; ++i ) { + if ( sf->chars[i]==NULL ) + fprintf( enc, " /.notdef" ); + else + fprintf( enc, " /%s", sf->chars[i]->name ); + if ( (i&0xf)==0 ) + fprintf( enc, "\t\t%% 0x%02x", i ); + putc('\n',enc); + } + while ( i<256 ) { + fprintf( enc, " /.notdef" ); + if ( (i&0xf0)==0 ) + fprintf( enc, "\t\t%% 0x%02x", i ); + putc('\n',enc); + ++i; + } + fprintf( enc, "] def\n" ); + + if ( fclose(enc)==-1 ) + ret = 0; +return( ret ); +} + +#ifndef FONTFORGE_CONFIG_WRITE_PFM +static +#endif +int WritePfmFile(char *filename,SplineFont *sf, int type0) { + char *buf = galloc(strlen(filename)+6), *pt, *pt2; + FILE *pfm; + int ret; + unichar_t *temp; + + strcpy(buf,filename); + pt = strrchr(buf,'.'); + if ( pt!=NULL && (pt2=strrchr(buf,'/'))!=NULL && pttype==et_controlevent && e->u.control.subtype == et_radiochanged ) { + GWindow gw = GGadgetGetWindow(g); + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GGadgetIsChecked(g)) { + int flags = (&d->ps_flags)[d->sod_which]; + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_HintSubs),true); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_Flex),true); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_HintSubs),!(flags&ps_flag_nohintsubs)); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_Flex),!(flags&ps_flag_noflex)); + } else { + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_HintSubs),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_Flex),false); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_HintSubs),false); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_Flex),false); + } + } +return( true ); +} + +static int sod_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct gfc_data *d = GDrawGetUserData(gw); + d->sod_done = true; + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("generate.html#Options"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(gw); + if ( GGadgetGetCid(event->u.control.g)==CID_OK ) { + if ( d->sod_which==0 ) { /* PostScript */ + d->ps_flags = 0; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_AFM)) ) + d->ps_flags |= ps_flag_afm; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_PFM)) ) + d->ps_flags |= ps_flag_pfm; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_TFM)) ) + d->ps_flags |= ps_flag_tfm; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_HintSubs)) ) + d->ps_flags |= ps_flag_nohintsubs; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Flex)) ) + d->ps_flags |= ps_flag_noflex; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Hints)) ) + d->ps_flags |= ps_flag_nohints; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Round)) ) + d->ps_flags |= ps_flag_round; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Restrict256)) ) + d->ps_flags |= ps_flag_restrict256; + } else if ( d->sod_which==1 ) { /* TrueType */ + d->ttf_flags = 0; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_Hints)) ) + d->ttf_flags |= ttf_flag_nohints; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_FullPS)) ) + d->ttf_flags |= ttf_flag_shortps; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_AppleMode)) ) + d->ttf_flags |= ttf_flag_applemode; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_OpenTypeMode)) ) + d->ttf_flags |= ttf_flag_otmode; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_PfEdComments)) ) + d->ttf_flags |= ttf_flag_pfed_comments; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_PfEdColors)) ) + d->ttf_flags |= ttf_flag_pfed_colors; + } else if ( d->sod_which==2 ) { /* OpenType */ + d->otf_flags = 0; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_FullPS)) ) + d->otf_flags |= ttf_flag_shortps; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_AppleMode)) ) + d->otf_flags |= ttf_flag_applemode; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_OpenTypeMode)) ) + d->otf_flags |= ttf_flag_otmode; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_PfEdComments)) ) + d->otf_flags |= ttf_flag_pfed_comments; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_PfEdColors)) ) + d->otf_flags |= ttf_flag_pfed_colors; + + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_AFM)) ) + d->otf_flags |= ps_flag_afm; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_HintSubs)) ) + d->otf_flags |= ps_flag_nohintsubs; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Flex)) ) + d->otf_flags |= ps_flag_noflex; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Hints)) ) + d->otf_flags |= ps_flag_nohints; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Round)) ) + d->otf_flags |= ps_flag_round; + } else { /* PS + OpenType Bitmap */ + d->ps_flags = d->psotb_flags = 0; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_AFM)) ) + d->psotb_flags = d->ps_flags |= ps_flag_afm; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_HintSubs)) ) + d->psotb_flags = d->ps_flags |= ps_flag_nohintsubs; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Flex)) ) + d->psotb_flags = d->ps_flags |= ps_flag_noflex; + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Hints)) ) + d->psotb_flags = d->ps_flags |= ps_flag_nohints; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_Round)) ) + d->psotb_flags = d->ps_flags |= ps_flag_round; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_PFM)) ) + d->psotb_flags = d->ps_flags |= ps_flag_pfm; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_PS_TFM)) ) + d->psotb_flags = d->ps_flags |= ps_flag_tfm; + + if ( !GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_FullPS)) ) + d->psotb_flags |= ttf_flag_shortps; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_PfEdComments)) ) + d->psotb_flags |= ttf_flag_pfed_comments; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TTF_PfEdColors)) ) + d->psotb_flags |= ttf_flag_pfed_colors; + } + d->sod_invoked = true; + } + d->sod_done = true; + } +return( true ); +} + +static void OptSetDefaults(GWindow gw,struct gfc_data *d,int which,int iscid) { + int flags = (&d->ps_flags)[which]; + int fs = GGadgetGetFirstListSelectedItem(d->pstype); + int bf = GGadgetGetFirstListSelectedItem(d->bmptype); + + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_Hints),!(flags&ps_flag_nohints)); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_HintSubs),!(flags&ps_flag_nohintsubs)); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_Flex),!(flags&ps_flag_noflex)); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_Restrict256),flags&ps_flag_restrict256); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_Round),flags&ps_flag_round); + + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_AFM),flags&ps_flag_afm); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_PFM),(flags&ps_flag_pfm) && !iscid); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_TFM),flags&ps_flag_tfm); + + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_Hints),!(flags&ttf_flag_nohints)); + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_FullPS),!(flags&ttf_flag_shortps)); + if ( which==0 || which==3 ) /* Postscript */ + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_AppleMode),false); + else if ( alwaysgenapple || + fs==ff_ttfmacbin || fs==ff_ttfdfont || fs==ff_otfdfont || + fs==ff_otfciddfont || d->family || (fs==ff_none && bf==bf_sfnt_dfont)) + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_AppleMode),true); + else + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_AppleMode),false); + if ( which==0 ) /* Postscript */ + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_OpenTypeMode),false); + else if ( (fs==ff_ttfmacbin || fs==ff_ttfdfont || fs==ff_otfdfont || + fs==ff_otfciddfont || d->family || (fs==ff_none && bf==bf_sfnt_dfont))) + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_OpenTypeMode),false); + else + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_OpenTypeMode),alwaysgenopentype); + + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_PfEdComments),flags&ttf_flag_pfed_comments); + GGadgetSetChecked(GWidgetGetControl(gw,CID_TTF_PfEdColors),flags&ttf_flag_pfed_colors); + + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_Hints),which!=1); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_HintSubs),which!=1); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_Flex),which!=1); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_Round),which!=1); + if ( which!=1 && (flags&ps_flag_nohints)) { + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_HintSubs),false); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_Flex),false); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_HintSubs),false); + GGadgetSetChecked(GWidgetGetControl(gw,CID_PS_Flex),false); + } + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_Restrict256),(which==0 || which==3) && !iscid); + + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_AFM),which!=1); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_PFM),which==0 || which==3); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_PS_TFM),which==0 || which==3); + + GGadgetSetEnabled(GWidgetGetControl(gw,CID_TTF_Hints),which==1); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_TTF_FullPS),which!=0); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_TTF_AppleMode),which!=0 && which!=3); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_TTF_OpenTypeMode),which!=0 && which!=3); + + GGadgetSetEnabled(GWidgetGetControl(gw,CID_TTF_PfEd),which!=0); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_TTF_PfEdComments),which!=0); + GGadgetSetEnabled(GWidgetGetControl(gw,CID_TTF_PfEdColors),which!=0); +} + +#define OPT_Width 230 +#define OPT_Height 191 + +static void SaveOptionsDlg(struct gfc_data *d,int which,int iscid) { + int flags; + int k,group,group2; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[23]; + GTextInfo label[23]; + GRect pos; + + d->sod_done = false; + d->sod_which = which; + flags = (&d->ps_flags)[which]; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<sod_done ) + GDrawProcessOneEvent(NULL); + GDrawDestroyWindow(gw); +} + +#if 0 +static int ad_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + int *done = GDrawGetUserData(gw); + *done = -1; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + int *done = GDrawGetUserData(gw); + if ( GGadgetGetCid(event->u.control.g)==1001 ) + *done = true; + else + *done = -1; + } +return( true ); +} + +static int AskDepth() { + GRect pos; + static GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[9]; + GTextInfo label[9]; + int done=false; + + if ( gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<type==et_close ) { + int *done = GDrawGetUserData(gw); + *done = -1; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + int *done = GDrawGetUserData(gw); + if ( GGadgetGetCid(event->u.control.g)==1001 ) + *done = true; + else + *done = -1; + } else if ( event->type==et_controlevent && event->u.control.subtype == et_textchanged && + GGadgetGetCid(event->u.control.g)==1003 ) { + GGadgetSetChecked(GWidgetGetControl(gw,1004),true); + } +return( true ); +} + +static int AskResolution(int bf) { + GRect pos; + static GWindow bdf_gw, fon_gw; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[10]; + GTextInfo label[10]; + int done=-3; + + if ( screen_display==NULL ) +return( -1 ); + + gw = bf==bf_bdf ? bdf_gw : fon_gw; + if ( gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1< Guess depending on pixel size of font */ + extern int ask_user_for_resolution; + + if ( ask_user_for_resolution ) { + GProgressPauseTimer(); + res = AskResolution(bf); + GProgressResumeTimer(); + if ( res==-2 ) +return( false ); + } + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + + for ( i=0; sizes[i]!=0; ++i ); + GProgressChangeStages(i); + for ( i=0; sizes[i]!=0; ++i ) { + buffer[0] = '\0'; + for ( bdf=sf->bitmaps; bdf!=NULL && + (bdf->pixelsize!=(sizes[i]&0xffff) || BDFDepth(bdf)!=(sizes[i]>>16)); + bdf=bdf->next ); + if ( bdf==NULL ) + sprintf(buffer,"Attempt to save a pixel size that has not been created (%d@%d)", sizes[i]&0xffff, sizes[i]>>16); + if ( buffer[0]!='\0' ) { + temp = uc_copy(buffer); + GWidgetPostNotice(temp,temp); + free(temp); + free(buf); +return( false ); + } + strcpy(buf,filename); + pt = strrchr(buf,'.'); + if ( pt!=NULL && (pt2=strrchr(buf,'/'))!=NULL && ptclut==NULL ) + sprintf( pt, "-%d%s", bdf->pixelsize, ext ); + else + sprintf( pt, "-%d@%d%s", bdf->pixelsize, BDFDepth(bdf), ext ); + + GProgressChangeLine2(temp=uc_copy(buf)); free(temp); + if ( bf==bf_bdf ) + BDFFontDump(buf,bdf,EncodingName(sf->encoding_name),res); + else + FONFontDump(buf,bdf,res); + GProgressNextStage(); + } + free(buf); +return( true ); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static int CheckIfTransparent(SplineFont *sf) { + /* Type3 doesn't support translucent fills */ + int i,j; + static int buts[3] = { _STR_Yes, _STR_Cancel, 0 }; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SplineChar *sc = sf->chars[i]; + for ( j=ly_fore; jlayer_cnt; ++j ) { + if ( sc->layers[i].fill_brush.opacity!=0 || sc->layers[i].stroke_pen.brush.opacity!=0 ) { + if ( GWidgetAskR(_STR_BadDrawingOperation,buts,0,1,_STR_Type3NotTrans)==1 ) +return( true ); + +return( false ); + } + } + } +return( false ); +} + +static int CheckIfImages(SplineFont *sf) { + /* SVG doesn't support images (that I can figure out anyway) */ + int i,j; + static int buts[3] = { _STR_Yes, _STR_Cancel, 0 }; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SplineChar *sc = sf->chars[i]; + for ( j=ly_fore; jlayer_cnt; ++j ) { + if ( sc->layers[i].fill_brush.opacity!=1.0 || sc->layers[i].stroke_pen.brush.opacity!=1.0 ) { + if ( GWidgetAskR(_STR_BadDrawingOperation,buts,0,1,_STR_SvgNoImages)==1 ) +return(true); + +return( false ); + } + } + } +return( false ); +} +#endif + +static char *SearchDirForWernerFile(char *dir,char *filename) { + char buffer[1025], buf2[200]; + FILE *file; + int good = false; + + if ( dir==NULL ) +return( NULL ); + + strcpy(buffer,dir); + strcat(buffer,"/"); + strcat(buffer,filename); + file = fopen(buffer,"r"); + if ( file==NULL ) +return( NULL ); + if ( fgets(buf2,sizeof(buf2),file)!=NULL && + strncmp(buf2,pfaeditflag,strlen(pfaeditflag))==0 ) + good = true; + fclose( file ); + if ( good ) +return( copy(buffer)); + +return( NULL ); +} + +static char *SearchNoLibsDirForWernerFile(char *dir,char *filename) { + char *ret; + + if ( dir==NULL || strstr(dir,"/.libs")==NULL ) +return( NULL ); + + dir = copy(dir); + *strstr(dir,"/.libs") = '\0'; + + ret = SearchDirForWernerFile(dir,filename); + free(dir); +return( ret ); +} + +static enum fchooserret GFileChooserFilterWernerSFDs(GGadget *g,GDirEntry *ent, + const unichar_t *dir) { + enum fchooserret ret = GFileChooserDefFilter(g,ent,dir); + char buf2[200]; + FILE *file; + + if ( ret==fc_show && !ent->isdir ) { + char *filename = galloc(u_strlen(dir)+u_strlen(ent->name)+5); + cu_strcpy(filename,dir); + strcat(filename,"/"); + cu_strcat(filename,ent->name); + file = fopen(filename,"r"); + if ( file==NULL ) + ret = fc_hide; + else { + if ( fgets(buf2,sizeof(buf2),file)==NULL || + strncmp(buf2,pfaeditflag,strlen(pfaeditflag))==0 ) + ret = fc_hide; + fclose(file); + } + free(filename); + } +return( ret ); +} + +static char *GetWernerSFDFile(SplineFont *sf) { + char *def=NULL, *ret; + char buffer[100]; + unichar_t ubuf[100], *uret; + int supl = sf->supplement; + + for ( supl = sf->supplement; suplsupplement+10 ; ++supl ) { + if ( screen_display==NULL ) { + if ( sf->subfontcnt!=0 ) { + sprintf(buffer,"%.40s-%.40s-%d.sfd", sf->cidregistry,sf->ordering,supl); + def = buffer; + } else if ( sf->encoding_name==em_big5 ) + def = "Big5.sfd"; + else if ( sf->encoding_name==em_big5hkscs ) + def = "Big5HKSCS.sfd"; + else if ( sf->encoding_name==em_sjis ) + def = "Sjis.sfd"; + else if ( sf->encoding_name==em_wansung ) + def = "Wansung.sfd"; + else if ( sf->encoding_name==em_johab ) + def = "Johab.sfd"; + else if ( sf->encoding_name==em_unicode ) + def = "Unicode.sfd"; + } + if ( def!=NULL ) { + ret = SearchDirForWernerFile(".",def); + if ( ret==NULL ) + ret = SearchDirForWernerFile(GResourceProgramDir,def); + if ( ret==NULL ) + ret = SearchNoLibsDirForWernerFile(GResourceProgramDir,def); +#ifdef SHAREDIR + if ( ret==NULL ) + ret = SearchDirForWernerFile(SHAREDIR,def); +#endif + if ( ret==NULL ) + ret = SearchDirForWernerFile(getPfaEditShareDir(),def); + if ( ret==NULL ) + ret = SearchDirForWernerFile("/usr/share/pfaedit",def); + if ( ret!=NULL ) +return( ret ); + } + if ( sf->subfontcnt!=0 ) + break; + } + + if ( screen_display==NULL ) +return( NULL ); + + /*if ( def==NULL )*/ + def = "*.sfd"; + uc_strcpy(ubuf,def); + uret = GWidgetOpenFile(GStringGetResource(_STR_FindMultipleMap,NULL),NULL,ubuf,NULL,GFileChooserFilterWernerSFDs); + ret = u2def_copy(uret); + free(uret); +return( ret ); +} + +static int32 *ParseWernerSFDFile(char *wernerfilename,SplineFont *sf,int *max,char ***_names) { + /* one entry for each char, >=1 => that subfont, 0=>not mapped, -1 => end of char mark */ + int cnt=0, subfilecnt=0, thusfar; + int k, warned = false; + uint32 r1,r2,i,modi; + SplineFont *_sf; + int32 *mapping; + FILE *file; + char buffer[200], *bpt; + char *end, *pt; + char *orig; + struct remap *map; + char **names; + int loop; + + file = fopen(wernerfilename,"r"); + if ( file==NULL ) { + GWidgetErrorR(_STR_NoSubFontDefinitionFile,_STR_NoSubFontDefinitionFile); +return( NULL ); + } + + k = 0; + do { + _sf = sf->subfontcnt==0 ? sf : sf->subfonts[k++]; + if ( _sf->charcnt>cnt ) cnt = _sf->charcnt; + } while ( ksubfontcnt ); + + mapping = gcalloc(cnt+1,sizeof(int32)); + memset(mapping,-1,(cnt+1)*sizeof(int32)); + mapping[cnt] = -2; + *max = 0; + + while ( fgets(buffer,sizeof(buffer),file)!=NULL ) + ++subfilecnt; + names = galloc((subfilecnt+1)*sizeof(char *)); + + rewind(file); + subfilecnt = 0; + while ( fgets(buffer,sizeof(buffer),file)!=NULL ) { + if ( strncmp(buffer,pfaeditflag,strlen(pfaeditflag))== 0 ) { + GWidgetErrorR(_STR_WrongSFDFile,_STR_BadSFDFile); + free(mapping); +return( NULL ); + } + pt=buffer+strlen(buffer)-1; + bpt = buffer; + if (( *pt!='\n' && *pt!='\r') || (pt>buffer && pt[-1]=='\\') || + (pt>buffer+1 && pt[-2]=='\\' && isspace(pt[-1])) ) { + bpt = copy(""); + forever { + loop = false; + if (( *pt!='\n' && *pt!='\r') || (pt>buffer && pt[-1]=='\\') || + (pt>buffer+1 && pt[-2]=='\\' && isspace(pt[-1])) ) + loop = true; + if ( *pt=='\n' || *pt=='\r') { + if ( pt[-1]=='\\' ) + pt[-1] = '\0'; + else if ( pt[-2]=='\\' ) + pt[-2] = '\0'; + } + bpt = grealloc(bpt,strlen(bpt)+strlen(buffer)+10); + strcat(bpt,buffer); + if ( !loop ) + break; + if ( fgets(buffer,sizeof(buffer),file)==NULL ) + break; + pt=buffer+strlen(buffer)-1; + } + } + if ( bpt[0]=='#' || bpt[0]=='\0' || isspace(bpt[0])) + continue; + for ( pt = bpt; !isspace(*pt); ++pt ); + if ( *pt=='\0' || *pt=='\r' || *pt=='\n' ) + continue; + names[subfilecnt] = copyn(bpt,pt-bpt); + if ( subfilecnt>*max ) *max = subfilecnt; + end = pt; + thusfar = 0; + while ( *end!='\0' ) { + while ( isspace(*end)) ++end; + if ( *end=='\0' ) + break; + orig = end; + r1 = strtoul(end,&end,0); + if ( orig==end ) + break; + while ( isspace(*end)) ++end; + if ( *end==':' ) { + if ( r1>=256 || r1<0) + fprintf( stderr, "Bad offset: %d for subfont %s\n", r1, names[subfilecnt]); + else + thusfar = r1; + r1 = strtoul(end+1,&end,0); + } + if ( *end=='_' || *end=='-' ) + r2 = strtoul(end+1,&end,0); + else + r2 = r1; + for ( i=r1; i<=r2; ++i ) { + modi = i; + if ( sf->remap!=NULL ) { + for ( map = sf->remap; map->infont!=-1; ++map ) { + if ( i>=map->firstenc && i<=map->lastenc ) { + modi = i-map->firstenc + map->infont; + break; + } + } + } + if ( modiencoding_name==em_unicode || sf->encoding_name==em_unicode4)) + /* Not a character anyway. just ignore it */; + else { + fprintf( stderr, "Warning: Encoding %d (%x) is mapped to at least two locations (%s@0x%02x and %s@0x%02x)\n Only one will be used here.\n", + i, i, names[subfilecnt], thusfar, names[(mapping[modi]>>8)], mapping[modi]&0xff ); + warned = true; + } + } + mapping[modi] = (subfilecnt<<8) | thusfar++; + } + } + } + if ( thusfar>256 ) + fprintf( stderr, "More that 256 entries in subfont %s\n", names[subfilecnt] ); + ++subfilecnt; + if ( bpt!=buffer ) + free(bpt); + } + names[subfilecnt]=NULL; + *_names = names; + fclose(file); +return( mapping ); +} + +static int SaveSubFont(SplineFont *sf,char *newname,int32 *sizes,int res, + int32 *mapping, int subfont, char **names) { + SplineFont temp; + SplineChar *chars[256], **newchars; + SplineFont *_sf; + int k, i, used, base, extras; + char *filename; + char *spt, *pt, buf[8]; + RefChar *ref; + int err = 0; + unichar_t *ufile; + + temp = *sf; + temp.encoding_name = em_none; + temp.charcnt = 256; + temp.chars = chars; + temp.bitmaps = NULL; + temp.subfonts = NULL; + temp.subfontcnt = 0; + temp.uniqueid = 0; + memset(chars,0,sizeof(chars)); + used = 0; + for ( i=0; mapping[i]!=-2; ++i ) if ( (mapping[i]>>8)==subfont ) { + k = 0; + do { + _sf = sf->subfontcnt==0 ? sf : sf->subfonts[k++]; + if ( i<_sf->charcnt && _sf->chars[i]!=NULL ) + break; + } while ( ksubfontcnt ); + if ( i<_sf->charcnt ) { + if ( _sf->chars[i]!=NULL ) { + _sf->chars[i]->parent = &temp; + _sf->chars[i]->enc = mapping[i]&0xff; + ++used; + } + chars[mapping[i]&0xff] = _sf->chars[i]; + } else + chars[mapping[i]&0xff] = NULL; + } + if ( used==0 ) +return( 0 ); + + /* check for any references to things outside this subfont and add them */ + /* as unencoded chars */ + /* We could just replace with splines, I suppose but that would make */ + /* korean fonts huge */ + forever { + extras = 0; + for ( i=0; ilayers[ly_fore].refs; ref!=NULL; ref=ref->next ) + if ( ref->sc->parent!=&temp ) + ++extras; + } + if ( extras == 0 ) + break; + newchars = gcalloc(temp.charcnt+extras,sizeof(SplineChar *)); + memcpy(newchars,temp.chars,temp.charcnt*sizeof(SplineChar *)); + if ( temp.chars!=chars ) free(temp.chars ); + base = temp.charcnt; + temp.chars = newchars; + extras = 0; + for ( i=0; ilayers[ly_fore].refs; ref!=NULL; ref=ref->next ) + if ( ref->sc->parent!=&temp ) { + temp.chars[base+extras] = ref->sc; + ref->sc->parent = &temp; + ref->sc->enc = base+extras++; + } + } + temp.charcnt += extras; /* this might be a slightly different value from that found before if some references get reused. N'importe */ + } + + filename = galloc(strlen(newname)+2+10); + strcpy(filename,newname); + pt = strrchr(filename,'.'); + spt = strrchr(filename,'/'); + if ( spt==NULL ) spt = filename; else ++spt; + if ( pt>spt ) + *pt = '\0'; + pt = strstr(spt,"%d"); + if ( pt==NULL ) + pt = strstr(spt,"%s"); + if ( pt==NULL ) + strcat(filename,names[subfont]); + else { + pt[0] = names[subfont][0]; + pt[1] = names[subfont][1]; + if ( names[subfont][2]!='\0' ) { + int l; + for ( l=strlen(pt); l>=2 ; --l ) + pt[l+1] = pt[l]; + pt[2] = names[subfont][2]; + } + } + temp.fontname = copy(spt); + temp.fullname = galloc(strlen(temp.fullname)+strlen(names[subfont])+3); + strcpy(temp.fullname,sf->fullname); + strcat(temp.fullname," "); + strcat(temp.fullname,names[subfont]); + strcat(spt,".pfb"); + GProgressChangeLine2(ufile=uc_copy(filename)); free(ufile); + + if ( sf->xuid!=NULL ) { + temp.xuid = galloc(strlen(sf->xuid)+strlen(buf)+5); + strcpy(temp.xuid,sf->xuid); + pt = temp.xuid + strlen( temp.xuid )-1; + while ( pt>temp.xuid && *pt==' ' ) --pt; + if ( *pt==']' ) --pt; + *pt = ' '; + strcpy(pt+1,buf); + strcat(pt,"]"); + } + + err = !WritePSFont(filename,&temp,ff_pfb,old_ps_flags); + if ( err ) + GWidgetErrorR(_STR_Savefailedtitle,_STR_Savefailedtitle); + if ( !err && (old_ps_flags&ps_flag_afm) && GProgressNextStage()) { + if ( !WriteAfmFile(filename,&temp,oldformatstate)) { + GWidgetErrorR(_STR_Afmfailedtitle,_STR_Afmfailedtitle); + err = true; + } + } + if ( !err && (old_ps_flags&ps_flag_tfm) ) { + if ( !WriteTfmFile(filename,&temp,oldformatstate)) { + GWidgetErrorR(_STR_Tfmfailedtitle,_STR_Tfmfailedtitle); + err = true; + } + } + /* ??? Bitmaps */ + if ( !GProgressNextStage()) + err = -1; + + /* The parent pointers on chars will be fixed up properly later */ + /* for now we just set them to NULL so future reference checks won't be confused */ + for ( i=0; iparent = NULL; + if ( temp.chars!=chars ) + free(temp.chars); + GlyphHashFree( &temp ); + free( temp.xuid ); + free( temp.fontname ); + free( temp.fullname ); + free( filename ); +return( err ); +} + +static void RestoreSF(SplineFont *sf) { + SplineFont *_sf; + int k, i; + + k = 0; + do { + _sf = sf->subfontcnt==0 ? sf : sf->subfonts[k++]; + for ( i=0; i<_sf->charcnt; ++i ) if ( _sf->chars[i]!=NULL ) { + _sf->chars[i]->parent = _sf; + _sf->chars[i]->enc = i; + } + } while ( ksubfontcnt ); +} + +/* ttf2tfm supports multiple sfd files. I do not. */ +static int WriteMultiplePSFont(SplineFont *sf,char *newname,int32 *sizes, + int res, char *wernerfilename) { + int err=0, tofree=false, max, filecnt; + int32 *mapping; + unichar_t *path; + int i; + char **names; + + if ( wernerfilename==NULL ) { + wernerfilename = GetWernerSFDFile(sf); + tofree = true; + } + if ( wernerfilename==NULL ) +return( 0 ); + mapping = ParseWernerSFDFile(wernerfilename,sf,&max,&names); + if ( tofree ) free(wernerfilename); + if ( mapping==NULL ) +return( 1 ); + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + + filecnt = 1; + if ( (old_ps_flags&ps_flag_afm) ) + filecnt = 2; +#if 0 + if ( oldbitmapstate==bf_bdf ) + ++filecnt; +#endif + path = def2u_copy(newname); + GProgressStartIndicator(10,GStringGetResource(_STR_SavingFont,NULL), + GStringGetResource(_STR_SavingMultiplePSFonts,NULL), + path,256,(max+1)*filecnt ); + free(path); + /*GProgressEnableStop(false);*/ + + for ( i=0; i<=max && !err; ++i ) + err = SaveSubFont(sf,newname,sizes,res,mapping,i,names); + RestoreSF(sf); + free(mapping); + for ( i=0; names[i]!=NULL; ++i ) free(names[i]); + free(names); + free( sizes ); + GProgressEndIndicator(); + if ( !err ) + SavePrefs(); +return( err ); +} + +static int _DoSave(SplineFont *sf,char *newname,int32 *sizes,int res) { + unichar_t *path; + int err=false; + int iscid = oldformatstate==ff_cid || oldformatstate==ff_cffcid || + oldformatstate==ff_otfcid || oldformatstate==ff_otfciddfont; + int flags = 0; + + if ( oldformatstate == ff_multiple ) +return( WriteMultiplePSFont(sf,newname,sizes,res,NULL)); + + if ( oldformatstate<=ff_cffcid ) + flags = old_ps_flags; + else if ( oldformatstate<=ff_ttfdfont ) + flags = old_ttf_flags; + else if ( oldformatstate!=ff_none ) + flags = old_otf_flags; + else + flags = old_ttf_flags; + if ( oldformatstate<=ff_cffcid && oldbitmapstate==bf_otb ) + flags = old_psotb_flags; + + path = def2u_copy(newname); + GProgressStartIndicator(10,GStringGetResource(_STR_SavingFont,NULL), + GStringGetResource(oldformatstate==ff_ttf || oldformatstate==ff_ttfsym || + oldformatstate==ff_ttfmacbin ?_STR_SavingTTFont: + oldformatstate==ff_otf || oldformatstate==ff_otfdfont ?_STR_SavingOpenTypeFont: + oldformatstate==ff_cid || oldformatstate==ff_cffcid || + oldformatstate==ff_otfcid || oldformatstate==ff_otfciddfont ?_STR_SavingCIDFont: + _STR_SavingPSFont,NULL), + path,sf->charcnt,1); + free(path); + /*GProgressEnableStop(false);*/ + if ( oldformatstate!=ff_none || + oldbitmapstate==bf_sfnt_dfont || + oldbitmapstate==bf_ttf ) { + int oerr = 0; + int bmap = oldbitmapstate; + if ( bmap==bf_otb ) bmap = bt_none; + switch ( oldformatstate ) { + case ff_mma: case ff_mmb: + sf = sf->mm->instances[0]; + case ff_pfa: case ff_pfb: case ff_ptype3: case ff_ptype0: + case ff_cid: +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sf->multilayer && CheckIfTransparent(sf)) +return( true ); +#endif + oerr = !WritePSFont(newname,sf,oldformatstate,flags); + break; + case ff_ttf: case ff_ttfsym: case ff_otf: case ff_otfcid: + case ff_cff: case ff_cffcid: + oerr = !WriteTTFFont(newname,sf,oldformatstate,sizes,bmap, + flags); + break; + case ff_pfbmacbin: + oerr = !WriteMacPSFont(newname,sf,oldformatstate,flags); + break; + case ff_ttfmacbin: case ff_ttfdfont: case ff_otfdfont: case ff_otfciddfont: + oerr = !WriteMacTTFFont(newname,sf,oldformatstate,sizes, + bmap,flags); + break; + case ff_svg: +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sf->multilayer && CheckIfImages(sf)) +return( true ); +#endif + oerr = !WriteSVGFont(newname,sf,oldformatstate,flags); + break; + case ff_none: /* only if bitmaps, an sfnt wrapper for bitmaps */ + if ( bmap==bf_sfnt_dfont ) + oerr = !WriteMacTTFFont(newname,sf,oldformatstate,sizes, + bmap,flags); + else if ( bmap==bf_ttf ) + oerr = !WriteTTFFont(newname,sf,oldformatstate,sizes,bmap, + flags); + break; + } + if ( oerr ) { + GWidgetErrorR(_STR_Savefailedtitle,_STR_Savefailedtitle); + err = true; + } + } + if ( !err && (flags&ps_flag_tfm) ) { + if ( !WriteTfmFile(newname,sf,oldformatstate)) { + GWidgetErrorR(_STR_Tfmfailedtitle,_STR_Tfmfailedtitle); + err = true; + } + } + if ( !err && (flags&ps_flag_afm) ) { + GProgressIncrementBy(-sf->charcnt); + if ( !WriteAfmFile(newname,sf,oldformatstate)) { + GWidgetErrorR(_STR_Afmfailedtitle,_STR_Afmfailedtitle); + err = true; + } + } + if ( !err && (flags&ps_flag_pfm) && !iscid ) { + GProgressChangeLine1R(_STR_SavingPFM); + GProgressIncrementBy(-sf->charcnt); + if ( !WritePfmFile(newname,sf,oldformatstate==ff_ptype0)) { + GWidgetErrorR(_STR_Pfmfailedtitle,_STR_Pfmfailedtitle); + err = true; + } + } + if ( oldbitmapstate==bf_otb ) { + char *temp = newname; + if ( newname[strlen(newname)-1]=='.' ) { + temp = galloc(strlen(newname)+8); + strcpy(temp,newname); + strcat(temp,"otb"); + } + if ( !WriteTTFFont(temp,sf,ff_none,sizes,bf_otb,flags) ) + err = true; + if ( temp!=newname ) + free(temp); + } else if ( (oldbitmapstate==bf_bdf || oldbitmapstate==bf_fon) && !err ) { + GProgressChangeLine1R(_STR_SavingBitmapFonts); + GProgressIncrementBy(-sf->charcnt); + if ( !WriteBitmaps(newname,sf,sizes,res,oldbitmapstate)) + err = true; + } else if ( (oldbitmapstate==bf_nfntmacbin /*|| oldbitmapstate==bf_nfntdfont*/) && + !err ) { + if ( !WriteMacBitmaps(newname,sf,sizes,false/*oldbitmapstate==bf_nfntdfont*/)) + err = true; + } + free( sizes ); + GProgressEndIndicator(); + if ( !err ) + SavePrefs(); +return( err ); +} + +static int32 *AllBitmapSizes(SplineFont *sf) { + int32 *sizes=NULL; + BDFFont *bdf; + int i,cnt; + + for ( i=0; i<2; ++i ) { + cnt = 0; + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( sizes!=NULL ) + sizes[cnt] = bdf->pixelsize | (BDFDepth(bdf)<<16); + ++cnt; + } + if ( i==1 ) + break; + sizes = galloc((cnt+1)*sizeof(int32)); + } + sizes[cnt] = 0; +return( sizes ); +} + +int GenerateScript(SplineFont *sf,char *filename,char *bitmaptype, int fmflags, + int res, char *subfontdefinition, struct sflist *sfs) { + int i; + static char *bitmaps[] = {"bdf", "ttf", "sbit", "bin", /*"dfont", */"fnt", "otb", NULL }; + int32 *sizes=NULL; + char *end = filename+strlen(filename); + struct sflist *sfi; + + if ( sf->bitmaps==NULL ) i = bf_none; + else if ( strmatch(bitmaptype,"otf")==0 ) i = bf_ttf; + else if ( strmatch(bitmaptype,"ms")==0 ) i = bf_ttf; + else if ( strmatch(bitmaptype,"apple")==0 ) i = bf_ttf; + else if ( strmatch(bitmaptype,"nfnt")==0 ) i = bf_nfntmacbin; + else for ( i=0; bitmaps[i]!=NULL; ++i ) { + if ( strmatch(bitmaptype,bitmaps[i])==0 ) + break; + } + oldbitmapstate = i; + + for ( i=0; extensions[i]!=NULL; ++i ) { + if ( strlen( extensions[i])>0 && + end-filename>=strlen(extensions[i]) && + strmatch(end-strlen(extensions[i]),extensions[i])==0 ) + break; + } + if ( end-filename>8 && strmatch(end-strlen(".ttf.bin"),".ttf.bin")==0 ) + i = ff_ttfmacbin; + else if ( end-filename>5 && strmatch(end-strlen(".suit"),".suit")==0 ) /* Different extensions for Mac/non Mac, support both always */ + i = ff_ttfmacbin; + else if ( end-filename>4 && strmatch(end-strlen(".bin"),".bin")==0 ) + i = ff_pfbmacbin; + else if ( end-filename>4 && strmatch(end-strlen(".res"),".res")==0 ) + i = ff_pfbmacbin; + else if ( end-filename>8 && strmatch(end-strlen(".sym.ttf"),".sym.ttf")==0 ) + i = ff_ttfsym; + else if ( end-filename>8 && strmatch(end-strlen(".cid.cff"),".cid.cff")==0 ) + i = ff_cffcid; + else if ( end-filename>7 && strmatch(end-strlen(".mm.pfa"),".mm.pfa")==0 ) + i = ff_mma; + else if ( end-filename>7 && strmatch(end-strlen(".mm.pfb"),".mm.pfb")==0 ) + i = ff_mmb; + if ( extensions[i]==NULL ) { + for ( i=0; bitmaps[i]!=NULL; ++i ) { + if ( end-filename>strlen(bitmaps[i]) && + strmatch(end-strlen(bitmaps[i]),bitmaps[i])==0 ) + break; + } + if ( *filename=='\0' || end[-1]=='.' ) + i = ff_none; + else if ( bitmaps[i]==NULL ) + i = ff_pfb; + else { + oldbitmapstate = i; + i = ff_none; + } + } + if ( i==ff_ptype3 && ( + (sf->encoding_name>=em_first2byte && sf->encoding_nameencoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax )) ) + i = ff_ptype0; + else if ( i==ff_ttfdfont && strmatch(end-strlen(".otf.dfont"),".otf.dfont")==0 ) + i = ff_otfdfont; + if ( sf->cidmaster!=NULL ) { + if ( i==ff_otf ) i = ff_otfcid; + else if ( i==ff_otfdfont ) i = ff_otfciddfont; + } + oldformatstate = i; + + if ( oldbitmapstate==bf_sfnt_dfont ) + oldformatstate = ff_none; + + if ( fmflags==-1 ) { + if ( alwaysgenapple && alwaysgenopentype ) { + old_otf_flags |= ttf_flag_applemode | ttf_flag_otmode; + old_ttf_flags |= ttf_flag_applemode | ttf_flag_otmode; + } else if ( alwaysgenapple ) { + old_otf_flags |= ttf_flag_applemode; + old_ttf_flags |= ttf_flag_applemode; + old_otf_flags &=~ttf_flag_otmode; + old_ttf_flags &=~ttf_flag_otmode; + } else if ( alwaysgenopentype ) { + old_otf_flags |= ttf_flag_otmode; + old_ttf_flags |= ttf_flag_otmode; + old_otf_flags &=~ttf_flag_applemode; + old_ttf_flags &=~ttf_flag_applemode; + } + if ( strmatch(bitmaptype,"apple")==0 || strmatch(bitmaptype,"sbit")==0 || + oldformatstate==ff_ttfmacbin || oldformatstate==ff_ttfdfont || + oldformatstate==ff_otfdfont || oldformatstate==ff_otfciddfont ) { + old_otf_flags |= ttf_flag_applemode; + old_ttf_flags |= ttf_flag_applemode; + old_otf_flags &=~ttf_flag_otmode; + old_ttf_flags &=~ttf_flag_otmode; + } else if ( strmatch(bitmaptype,"ms")==0 ) { + old_otf_flags |= ttf_flag_otmode; + old_ttf_flags |= ttf_flag_otmode; + old_otf_flags &=~ttf_flag_applemode; + old_ttf_flags &=~ttf_flag_applemode; + } + } else { + if ( oldformatstate<=ff_cffcid ) { + old_ps_flags = 0; + if ( fmflags&1 ) old_ps_flags |= ps_flag_afm; + if ( fmflags&2 ) old_ps_flags |= ps_flag_pfm; + if ( fmflags&0x10000 ) old_ps_flags |= ps_flag_tfm; + if ( fmflags&0x20000 ) old_ps_flags |= ps_flag_nohintsubs; + if ( fmflags&0x40000 ) old_ps_flags |= ps_flag_noflex; + if ( fmflags&0x80000 ) old_ps_flags |= ps_flag_nohints; + if ( fmflags&0x100000 ) old_ps_flags |= ps_flag_restrict256; + if ( fmflags&0x200000 ) old_ps_flags |= ps_flag_round; + if ( i==bf_otb ) { + if ( fmflags&4 ) old_ttf_flags |= ttf_flag_shortps; + if ( fmflags&0x20 ) old_ttf_flags |= ttf_flag_pfed_comments; + if ( fmflags&0x40 ) old_ttf_flags |= ttf_flag_pfed_colors; + } + } else if ( oldformatstate<=ff_ttfdfont || oldformatstate==ff_none ) { + old_ttf_flags = 0; + if ( fmflags&4 ) old_ttf_flags |= ttf_flag_shortps; + if ( fmflags&8 ) old_ttf_flags |= ttf_flag_nohints; + if ( fmflags&0x10 ) old_ttf_flags |= ttf_flag_applemode; + else old_ttf_flags |= ttf_flag_otmode; + if ( fmflags&0x20 ) old_ttf_flags |= ttf_flag_pfed_comments; + if ( fmflags&0x40 ) old_ttf_flags |= ttf_flag_pfed_colors; + if ( fmflags&0x80 ) old_ttf_flags |= ttf_flag_applemode|ttf_flag_otmode; + } else { + old_otf_flags = 0; + /* Applicable postscript flags */ + if ( fmflags&1 ) old_otf_flags |= ps_flag_afm; + if ( fmflags&2 ) old_otf_flags |= ps_flag_pfm; + if ( fmflags&0x20000 ) old_otf_flags |= ps_flag_nohintsubs; + if ( fmflags&0x40000 ) old_otf_flags |= ps_flag_noflex; + if ( fmflags&0x80000 ) old_otf_flags |= ps_flag_nohints; + /* Applicable truetype flags */ + if ( fmflags&4 ) old_otf_flags |= ttf_flag_shortps; + if ( fmflags&0x10 ) old_otf_flags |= ttf_flag_applemode; + else old_otf_flags |= ttf_flag_otmode; + if ( fmflags&0x20 ) old_otf_flags |= ttf_flag_pfed_comments; + if ( fmflags&0x40 ) old_otf_flags |= ttf_flag_pfed_colors; + if ( fmflags&0x80 ) old_otf_flags |= ttf_flag_applemode|ttf_flag_otmode; + } + } + + if ( oldbitmapstate!=bf_none ) { + if ( sfs!=NULL ) { + for ( sfi=sfs; sfi!=NULL; sfi=sfi->next ) + sfi->sizes = AllBitmapSizes(sfi->sf); + } else + sizes = AllBitmapSizes(sf); + } + + if ( sfs!=NULL ) { + int flags = 0; + if ( oldformatstate<=ff_cffcid ) + flags = old_ps_flags; + else if ( oldformatstate<=ff_ttfdfont ) + flags = old_ttf_flags; + else + flags = old_otf_flags; +return( WriteMacFamily(filename,sfs,oldformatstate,oldbitmapstate,flags)); + } + + if ( oldformatstate == ff_multiple ) +return( !WriteMultiplePSFont(sf,filename,sizes,res,subfontdefinition)); + + if ( oldformatstate>ff_cffcid ) { + if ( fmflags&1 ) + WriteAfmFile(filename,sf,oldformatstate); + if ( fmflags&2 ) + WritePfmFile(filename,sf,oldformatstate==ff_ptype0); + if ( fmflags&0x10000 ) + WriteTfmFile(filename,sf,oldformatstate); + } + +return( !_DoSave(sf,filename,sizes,res)); +} + +static void DoSave(struct gfc_data *d,unichar_t *path) { + int err=false; + char *temp; + int32 *sizes=NULL; + int iscid, i; + Encoding *item=NULL; + struct sflist *sfs=NULL, *cur; + static int buts[] = { _STR_Yes, _STR_No, 0 }; + static int psscalewarned=0, ttfscalewarned=0; + int flags; + + for ( i=d->sf->charcnt-1; i>=1; --i ) + if ( d->sf->chars[i]!=NULL && strcmp(d->sf->chars[i]->name,".notdef")==0 && + (d->sf->chars[i]->layers[ly_fore].splines!=NULL || d->sf->chars[i]->layers[ly_fore].refs!=NULL)) + break; + if ( i!=0 ) { + if ( GWidgetAskR(_STR_NotdefName,buts,0,1,_STR_NotdefChar,i)==1 ) +return; + } + + temp = u2def_copy(path); + oldformatstate = GGadgetGetFirstListSelectedItem(d->pstype); + iscid = oldformatstate==ff_cid || oldformatstate==ff_cffcid || + oldformatstate==ff_otfcid || oldformatstate==ff_otfciddfont; + if ( !iscid && (d->sf->cidmaster!=NULL || d->sf->subfontcnt>1)) { + if ( GWidgetAskR(_STR_NotCID,buts,0,1,_STR_NotCIDOk)==1 ) +return; + } + + if ( oldformatstate<=ff_cffcid || (oldformatstate>=ff_otf && oldformatstate<=ff_otfciddfont)) { + if ( d->sf->ascent+d->sf->descent!=1000 && !psscalewarned ) { + if ( GWidgetAskR(_STR_EmSizeBad,buts,0,1,_STR_PSEmSize1000, + d->sf->ascent+d->sf->descent)==1 ) +return; + psscalewarned = true; + } + } else if ( oldformatstate!=ff_none && oldformatstate!=ff_svg ) { + int val = d->sf->ascent+d->sf->descent; + int bit; + for ( bit=0x800000; bit!=0; bit>>=1 ) + if ( bit==val ) + break; + if ( bit==0 && !ttfscalewarned ) { + if ( GWidgetAskR(_STR_EmSizeBad,buts,0,1,_STR_TTFEmSize2,val)==1 ) +return; + ttfscalewarned = true; + } + } + + if ( d->sf->encoding_name>=em_base ) + for ( item=enclist; item!=NULL && item->enc_num!=d->sf->encoding_name; item=item->next ); + if ( ((oldformatstatesf->encoding_name>=em_first2byte && d->sf->encoding_namesf->encoding_name>=em_base && (item==NULL || item->char_cnt>256))) ) { + static int buts[3] = { _STR_Yes, _STR_Cancel, 0 }; + if ( GWidgetAskR(_STR_EncodingTooLarge,buts,0,1,_STR_TwoBEncIn1BFont)==1 ) +return; + } + + oldbitmapstate = GGadgetGetFirstListSelectedItem(d->bmptype); + if ( oldbitmapstate!=bf_none ) + sizes = ParseBitmapSizes(d->bmpsizes,_STR_PixelList,&err); + if ( err ) +return; + + if ( d->family ) { + for ( i=0; ifamilycnt; ++i ) { + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_Family+10*i)) ) { + cur = chunkalloc(sizeof(struct sflist)); + cur->next = sfs; + sfs = cur; + cur->sf = GGadgetGetUserData(GWidgetGetControl(d->gw,CID_Family+10*i)); + if ( oldbitmapstate!=bf_none ) + cur->sizes = ParseBitmapSizes(GWidgetGetControl(d->gw,CID_Family+10*i+1),_STR_PixelList,&err); + if ( err ) { + SfListFree(sfs); +return; + } + } + } + cur = chunkalloc(sizeof(struct sflist)); + cur->next = sfs; + sfs = cur; + cur->sf = d->sf; + cur->sizes = sizes; + } + + switch ( d->sod_which ) { + case 0: /* PostScript */ + flags = old_ps_flags = d->ps_flags; + break; + case 1: /* TrueType */ + flags = old_ttf_flags = d->ttf_flags; + if ( !d->sod_invoked ) { + if ( oldformatstate==ff_ttfmacbin || oldformatstate==ff_ttfdfont || d->family || + (oldformatstate==ff_none && oldbitmapstate==bf_sfnt_dfont)) + old_ttf_flags |= ttf_flag_applemode; + } + break; + case 2: /* OpenType */ + flags = old_otf_flags = d->otf_flags; + if ( !d->sod_invoked ) { + if ( oldformatstate==ff_otfdfont || oldformatstate==ff_otfciddfont || d->family || + (oldformatstate==ff_none && oldbitmapstate==bf_sfnt_dfont)) + old_ttf_flags |= ttf_flag_applemode; + } + break; + case 3: /* PostScript & OpenType bitmaps */ + old_ps_flags = d->ps_flags; + flags = old_psotb_flags = d->psotb_flags; + break; + } + + if ( !d->family ) + err = _DoSave(d->sf,temp,sizes,-1); + else + err = !WriteMacFamily(temp,sfs,oldformatstate,oldbitmapstate,flags); + + free(temp); + d->done = !err; + d->ret = !err; +} + +static void GFD_doesnt(GIOControl *gio) { + /* The filename the user chose doesn't exist, so everything is happy */ + struct gfc_data *d = gio->userdata; + DoSave(d,gio->path); + GFileChooserReplaceIO(d->gfc,NULL); +} + +static void GFD_exists(GIOControl *gio) { + /* The filename the user chose exists, ask user if s/he wants to overwrite */ + struct gfc_data *d = gio->userdata; + unichar_t buffer[200]; + const unichar_t *rcb[3]; unichar_t rcmn[2]; + + rcb[2]=NULL; + rcb[0] = GStringGetResource( _STR_Replace, &rcmn[0]); + rcb[1] = GStringGetResource( _STR_Cancel, &rcmn[1]); + + u_strcpy(buffer, GStringGetResource(_STR_Fileexistspre,NULL)); + u_strcat(buffer, u_GFileNameTail(gio->path)); + u_strcat(buffer, GStringGetResource(_STR_Fileexistspost,NULL)); + if ( GWidgetAsk(GStringGetResource(_STR_Fileexists,NULL),rcb,rcmn,0,1,buffer)==0 ) { + DoSave(d,gio->path); + } + GFileChooserReplaceIO(d->gfc,NULL); +} + +static void _GFD_SaveOk(struct gfc_data *d) { + unichar_t *ret = GGadgetGetTitle(d->gfc); + int formatstate = GGadgetGetFirstListSelectedItem(d->pstype); + + if ( formatstate!=ff_none ) /* are we actually generating an outline font? */ + GIOfileExists(GFileChooserReplaceIO(d->gfc, + GIOCreate(ret,d,GFD_exists,GFD_doesnt))); + else + GFD_doesnt(GIOCreate(ret,d,GFD_exists,GFD_doesnt)); /* No point in bugging the user if we aren't doing anything */ + free(ret); +} + +static int GFD_SaveOk(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + _GFD_SaveOk(d); + } +return( true ); +} + +static int GFD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + d->ret = false; + } +return( true ); +} + +static int GFD_Options(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + int fs = GGadgetGetFirstListSelectedItem(d->pstype); + int bf = GGadgetGetFirstListSelectedItem(d->bmptype); + int iscid = fs==ff_cid || fs==ff_cffcid || fs==ff_otfcid || fs==ff_otfciddfont; + int which; + if ( fs==ff_none ) + which = 1; /* Some bitmaps get stuffed int ttf files */ + else if ( fs<=ff_cffcid ) + which = 0; /* Postscript options */ + else if ( fs<=ff_ttfdfont ) + which = 1; /* truetype options */ + else + which = 2; /* opentype options */ + if ( bf == bf_otb && which==0 ) + which = 3; /* postscript options with opentype bitmap options */ + SaveOptionsDlg(d,which,iscid); + } +return( true ); +} + +static void GFD_dircreated(GIOControl *gio) { + struct gfc_data *d = gio->userdata; + unichar_t *dir = u_copy(gio->path); + + GFileChooserReplaceIO(d->gfc,NULL); + GFileChooserSetDir(d->gfc,dir); + free(dir); +} + +static void GFD_dircreatefailed(GIOControl *gio) { + /* We couldn't create the directory */ + struct gfc_data *d = gio->userdata; + unichar_t buffer[500]; + + u_strcpy(buffer, GStringGetResource(_STR_Couldntcreatedir,NULL)); + uc_strcat(buffer,": "); + u_strcat(buffer, u_GFileNameTail(gio->path)); + uc_strcat(buffer, ".\n"); + if ( gio->error!=NULL ) { + u_strcat(buffer,gio->error); + uc_strcat(buffer, "\n"); + } + if ( gio->status[0]!='\0' ) + u_strcat(buffer,gio->status); + GWidgetPostNotice(GStringGetResource(_STR_Couldntcreatedir,NULL),buffer); + GFileChooserReplaceIO(d->gfc,NULL); +} + +static int GFD_NewDir(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + unichar_t *newdir; + newdir = GWidgetAskStringR(_STR_Createdir,NULL,_STR_Dirname); + if ( newdir==NULL ) +return( true ); + if ( !u_GFileIsAbsolute(newdir)) { + unichar_t *temp = u_GFileAppendFile(GFileChooserGetDir(d->gfc),newdir,false); + free(newdir); + newdir = temp; + } + GIOmkDir(GFileChooserReplaceIO(d->gfc, + GIOCreate(newdir,d,GFD_dircreated,GFD_dircreatefailed))); + free(newdir); + } +return( true ); +} + +static void BitmapName(struct gfc_data *d) { + int bf = GGadgetGetFirstListSelectedItem(d->bmptype); + unichar_t *ret = GGadgetGetTitle(d->gfc); + unichar_t *dup, *pt, *tpt; + int format = GGadgetGetFirstListSelectedItem(d->pstype); + + if ( format!=ff_none ) +return; + + dup = galloc((u_strlen(ret)+30)*sizeof(unichar_t)); + u_strcpy(dup,ret); + free(ret); + pt = u_strrchr(dup,'.'); + tpt = u_strrchr(dup,'/'); + if ( ptgfc,dup); + free(dup); +} + +static int GFD_Format(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + unichar_t *pt, *dup, *tpt, *ret; + int format = GGadgetGetFirstListSelectedItem(d->pstype); + int len, bf; + static unichar_t nullstr[] = { 0 }; + GTextInfo **list; + SplineFont *temp; + + list = GGadgetGetList(d->bmptype,&len); + temp = d->sf->cidmaster ? d->sf->cidmaster : d->sf; + if ( format==ff_none ) { + if ( temp->bitmaps!=NULL ) { + list[bf_sfnt_dfont]->disabled = false; + list[bf_ttf]->disabled = false; + } + BitmapName(d); +return( true ); + } + + ret = GGadgetGetTitle(d->gfc); + dup = galloc((u_strlen(ret)+30)*sizeof(unichar_t)); + u_strcpy(dup,ret); + free(ret); + pt = u_strrchr(dup,'.'); + tpt = u_strrchr(dup,'/'); + if ( ptgfc,dup); + free(dup); + + if ( d->sf->cidmaster!=NULL ) { + if ( format!=ff_none && format != ff_cid && format != ff_cffcid && + format != ff_otfcid && format!=ff_otfciddfont ) { + GGadgetSetTitle(d->bmpsizes,nullstr); + } + } + + bf = GGadgetGetFirstListSelectedItem(d->bmptype); + list[bf_sfnt_dfont]->disabled = true; + if ( temp->bitmaps==NULL ) + /* Don't worry about what formats are possible, they're disabled */; + else if ( format!=ff_ttf && format!=ff_ttfsym && format!=ff_otf && + format!=ff_ttfdfont && format!=ff_otfdfont && format!=ff_otfciddfont && + format!=ff_otfcid && format!=ff_ttfmacbin && format!=ff_none ) { + /* If we're not in a ttf format then we can't output ttf bitmaps */ + if ( bf==bf_ttf || + bf==bf_nfntmacbin /*|| bf==bf_nfntdfont*/ ) + GGadgetSelectOneListItem(d->bmptype,bf_bdf); + if ( format==ff_pfbmacbin ) + GGadgetSelectOneListItem(d->bmptype,bf_nfntmacbin); + list[bf_ttf]->disabled = true; + bf = GGadgetGetFirstListSelectedItem(d->bmptype); + GGadgetSetEnabled(d->bmpsizes, format!=ff_multiple && bf!=bf_none ); /* We know there are bitmaps */ + } else { + list[bf_ttf]->disabled = false; + if ( bf==bf_none ) + /* Do nothing, always appropriate */; + else if ( format==ff_ttf || format==ff_ttfsym || format==ff_otf || + format==ff_otfcid ) + GGadgetSelectOneListItem(d->bmptype,bf_ttf); + } +#if __Mac + { GGadget *pulldown, *list, *tf; + /* The name of the postscript file is fixed and depends solely on */ + /* the font name. If the user tried to change it, the font would */ + /* not be found */ + /* See MakeMacPSName for a full description */ + GFileChooserGetChildren(d->gfc,&pulldown,&list,&tf); + GGadgetSetVisible(tf,format!=ff_pfbmacbin); + } +#endif + GGadgetSetEnabled(d->bmptype, format!=ff_multiple ); + } +return( true ); +} + +static int GFD_BitmapFormat(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + struct gfc_data *d = GDrawGetUserData(GGadgetGetWindow(g)); + /*int format = GGadgetGetFirstListSelectedItem(d->pstype);*/ + int bf = GGadgetGetFirstListSelectedItem(d->bmptype); + int i; + + GGadgetSetEnabled(d->bmpsizes,bf!=bf_none); + if ( d->family ) { + for ( i=0; ifamilycnt; ++i ) + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_Family+10*i+1), + bf!=bf_none); + } + BitmapName(d); + } +return( true ); +} + +static int e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct gfc_data *d = GDrawGetUserData(gw); + d->done = true; + d->ret = false; + } else if ( event->type == et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("generate.html"); +return( true ); + } else if ( (event->u.chr.keysym=='s' || event->u.chr.keysym=='g' || + event->u.chr.keysym=='G' ) && + (event->u.chr.state&ksm_control) ) { + _GFD_SaveOk(GDrawGetUserData(gw)); +return( true ); + } +return( false ); + } else if ( event->type == et_mousemove || + (event->type==et_mousedown && event->u.mouse.button==3 )) { + struct gfc_data *d = GDrawGetUserData(gw); + GFileChooserPopupCheck(d->gfc,event); + } else if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + struct gfc_data *d = GDrawGetUserData(gw); +return( GGadgetDispatchEvent((GGadget *) (d->gfc),event)); + } +return( true ); +} + +static unichar_t *BitmapList(SplineFont *sf) { + BDFFont *bdf; + int i; + char *cret, *pt; + unichar_t *uret; + + for ( bdf=sf->bitmaps, i=0; bdf!=NULL; bdf=bdf->next, ++i ); + pt = cret = galloc((i+1)*20); + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( pt!=cret ) *pt++ = ','; + if ( bdf->clut==NULL ) + sprintf( pt, "%d", bdf->pixelsize ); + else + sprintf( pt, "%d@%d", bdf->pixelsize, BDFDepth(bdf) ); + pt += strlen(pt); + } + *pt = '\0'; + uret = uc_copy(cret); + free(cret); +return( uret ); +} + +static unichar_t *uStyleName(SplineFont *sf) { + int stylecode = MacStyleCode(sf,NULL); + char buffer[200]; + + buffer[0]='\0'; + if ( stylecode&sf_bold ) + strcpy(buffer," Bold"); + if ( stylecode&sf_italic ) + strcat(buffer," Italic"); + if ( stylecode&sf_outline ) + strcat(buffer," Outline"); + if ( stylecode&sf_shadow ) + strcat(buffer," Shadow"); + if ( stylecode&sf_condense ) + strcat(buffer," Condensed"); + if ( stylecode&sf_extend ) + strcat(buffer," Extended"); + if ( buffer[0]=='\0' ) + strcpy(buffer," Plain"); +return( uc_copy(buffer+1)); +} + +int SFGenerateFont(SplineFont *sf,int family) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[16+2*48+2]; + GTextInfo label[16+2*48+2]; + struct gfc_data d; + GGadget *pulldown, *files, *tf; + int i, j, k, old, ofs, y; + int bs = GIntGetResource(_NUM_Buttonsize), bsbigger, totwid, spacing; + SplineFont *temp; + int wascompacted = sf->compacted; + int familycnt=0; + SplineFont *familysfs[48]; + uint16 psstyle; + + if ( (alwaysgenapple || family ) && alwaysgenopentype ) { + old_otf_flags |= ttf_flag_applemode | ttf_flag_otmode; + old_ttf_flags |= ttf_flag_applemode | ttf_flag_otmode; + } else if ( alwaysgenapple || family ) { + old_otf_flags |= ttf_flag_applemode; + old_ttf_flags |= ttf_flag_applemode; + old_otf_flags &=~ttf_flag_otmode; + old_ttf_flags &=~ttf_flag_otmode; + } else if ( alwaysgenopentype ) { + old_otf_flags |= ttf_flag_otmode; + old_ttf_flags |= ttf_flag_otmode; + old_otf_flags &=~ttf_flag_applemode; + old_ttf_flags &=~ttf_flag_applemode; + } + + if ( family ) { + /* I could just disable the menu item, but I think it's a bit confusing*/ + /* and I want people to know why they can't generate a family */ + FontView *fv; + SplineFont *dup=NULL, *badenc=NULL; + memset(familysfs,0,sizeof(familysfs)); + familysfs[0] = sf; + for ( fv=fv_list; fv!=NULL; fv=fv->next ) + if ( fv->sf!=sf && strcmp(fv->sf->familyname,sf->familyname)==0 ) { + MacStyleCode(fv->sf,&psstyle); + if ( familysfs[psstyle]==fv->sf ) + /* several windows may point to same font */; + else if ( familysfs[psstyle]!=NULL ) + dup = fv->sf; + else { + familysfs[psstyle] = fv->sf; + ++familycnt; + if ( fv->sf->encoding_name!=sf->encoding_name ) + badenc = fv->sf; + } + } + if ( MacStyleCode(sf,NULL)!=0 || familycnt==0 || sf->multilayer ) { + GWidgetErrorR(_STR_BadFamilyForMac,_STR_BadMacFamily); +return( 0 ); + } else if ( dup ) { + MacStyleCode(dup,&psstyle); + GWidgetErrorR(_STR_BadFamilyForMac,_STR_TwoFontsSameStyle, + dup->fontname, familysfs[psstyle]->fontname); +return( 0 ); + } else if ( badenc ) { + GWidgetErrorR(_STR_BadFamilyForMac,_STR_DifferentEncodings, + badenc->fontname, sf->fontname ); +return( 0 ); + } + } + + if ( wascompacted ) + SFUncompactFont(sf); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<totwid; totwid = bsbigger?4*bs+4*12:totwid; + spacing = (totwid-4*bs-2*12)/3; + pos.width = GDrawPointsToPixels(NULL,totwid); + if ( family ) + pos.height = GDrawPointsToPixels(NULL,285+13+26*familycnt); + else + pos.height = GDrawPointsToPixels(NULL,285); + gw = GDrawCreateTopWindow(NULL,&pos,e_h,&d,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + gcd[0].gd.pos.x = 12; gcd[0].gd.pos.y = 6; gcd[0].gd.pos.width = 100*totwid/GIntGetResource(_NUM_ScaleFactor)-24; gcd[0].gd.pos.height = 182; + gcd[0].gd.flags = gg_visible | gg_enabled; + gcd[0].creator = GFileChooserCreate; + + y = 252; + if ( family ) + y += 13 + 26*familycnt; + + gcd[1].gd.pos.x = 12; gcd[1].gd.pos.y = y-3; + gcd[1].gd.pos.width = -1; + gcd[1].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[1].text = (unichar_t *) _STR_Save; + label[1].text_in_resource = true; + gcd[1].gd.mnemonic = 'S'; + gcd[1].gd.label = &label[1]; + gcd[1].gd.handle_controlevent = GFD_SaveOk; + gcd[1].creator = GButtonCreate; + + gcd[2].gd.pos.x = -(spacing+bs)*100/GIntGetResource(_NUM_ScaleFactor)-12; gcd[2].gd.pos.y = y; + gcd[2].gd.pos.width = -1; + gcd[2].gd.flags = gg_visible | gg_enabled; + label[2].text = (unichar_t *) _STR_Filter; + label[2].text_in_resource = true; + gcd[2].gd.mnemonic = 'F'; + gcd[2].gd.label = &label[2]; + gcd[2].gd.handle_controlevent = GFileChooserFilterEh; + gcd[2].creator = GButtonCreate; + + gcd[3].gd.pos.x = -12; gcd[3].gd.pos.y = y; gcd[3].gd.pos.width = -1; gcd[3].gd.pos.height = 0; + gcd[3].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[3].text = (unichar_t *) _STR_Cancel; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.mnemonic = 'C'; + gcd[3].gd.handle_controlevent = GFD_Cancel; + gcd[3].creator = GButtonCreate; + + gcd[4].gd.pos.x = (spacing+bs)*100/GIntGetResource(_NUM_ScaleFactor)+12; gcd[4].gd.pos.y = y; gcd[4].gd.pos.width = -1; gcd[4].gd.pos.height = 0; + gcd[4].gd.flags = gg_visible | gg_enabled; + label[4].text = (unichar_t *) _STR_New; + label[4].text_in_resource = true; + label[4].image = &_GIcon_dir; + label[4].image_precedes = false; + gcd[4].gd.mnemonic = 'N'; + gcd[4].gd.label = &label[4]; + gcd[4].gd.handle_controlevent = GFD_NewDir; + gcd[4].creator = GButtonCreate; + + gcd[5].gd.pos.x = 12; gcd[5].gd.pos.y = 218; gcd[5].gd.pos.width = 0; gcd[5].gd.pos.height = 0; + gcd[5].gd.flags = gg_visible | gg_enabled; + label[5].text = (unichar_t *) _STR_Options; + label[5].text_in_resource = true; + gcd[5].gd.popup_msg = GStringGetResource(_STR_OptionsPopup,NULL); + gcd[5].gd.label = &label[5]; + gcd[5].gd.handle_controlevent = GFD_Options; + gcd[5].creator = GButtonCreate; + + gcd[6].gd.pos.x = 12; gcd[6].gd.pos.y = 190; gcd[6].gd.pos.width = 0; gcd[6].gd.pos.height = 0; + gcd[6].gd.flags = gg_visible | gg_enabled ; + gcd[6].gd.u.list = formattypes; + gcd[6].creator = GListButtonCreate; + for ( i=0; ionlybitmaps; + formattypes[ff_ptype0].disabled = sf->onlybitmaps || + ( sf->encoding_nameencoding_name>=em_base); + formattypes[ff_mma].disabled = formattypes[ff_mmb].disabled = + sf->mm==NULL || !MMValid(sf->mm,false); + formattypes[ff_cffcid].disabled = sf->cidmaster==NULL; + formattypes[ff_cid].disabled = sf->cidmaster==NULL; + formattypes[ff_otfcid].disabled = sf->cidmaster==NULL; + formattypes[ff_otfciddfont].disabled = sf->cidmaster==NULL; + ofs = oldformatstate; + if (( ofs==ff_ptype0 && formattypes[ff_ptype0].disabled ) || + ((ofs==ff_mma || ofs==ff_mmb) && sf->mm==NULL) || + ((ofs==ff_cid || ofs==ff_cffcid || ofs==ff_otfcid || ofs==ff_otfciddfont) && formattypes[ff_cid].disabled)) + ofs = ff_pfb; + else if ( (ofs!=ff_cid && ofs!=ff_cffcid && ofs!=ff_otfcid && ofs!=ff_otfciddfont) && sf->cidmaster!=NULL ) + ofs = ff_otfcid; + else if ( !formattypes[ff_mmb].disabled && ofs!=ff_mma ) + ofs = ff_mmb; + if ( sf->onlybitmaps ) + ofs = ff_none; + if ( sf->multilayer ) { + formattypes[ff_pfa].disabled = true; + formattypes[ff_pfb].disabled = true; + formattypes[ff_pfbmacbin].disabled = true; + formattypes[ff_mma].disabled = true; + formattypes[ff_mmb].disabled = true; + formattypes[ff_multiple].disabled = true; + formattypes[ff_ptype0].disabled = true; + formattypes[ff_cff].disabled = true; + formattypes[ff_cid].disabled = true; + formattypes[ff_ttf].disabled = true; + formattypes[ff_ttfsym].disabled = true; + formattypes[ff_ttfmacbin].disabled = true; + formattypes[ff_ttfdfont].disabled = true; + formattypes[ff_otfdfont].disabled = true; + formattypes[ff_otf].disabled = true; + formattypes[ff_otfcid].disabled = true; + formattypes[ff_cffcid].disabled = true; + if ( ofs!=ff_svg ) + ofs = ff_ptype3; + } + if ( family ) { + if ( ofs==ff_pfa || ofs==ff_pfb || ofs==ff_multiple || ofs==ff_ptype3 || + ofs==ff_ptype0 || ofs==ff_mma || ofs==ff_mmb ) + ofs = ff_pfbmacbin; + else if ( ofs==ff_cid || ofs==ff_otfcid || ofs==ff_cffcid ) + ofs = ff_otfciddfont; + else if ( ofs==ff_ttf || ofs==ff_ttfsym ) + ofs = ff_ttfmacbin; + else if ( ofs==ff_otf || ofs==ff_cff ) + ofs = ff_otfdfont; + formattypes[ff_pfa].disabled = true; + formattypes[ff_pfb].disabled = true; + formattypes[ff_mma].disabled = true; + formattypes[ff_mmb].disabled = true; + formattypes[ff_multiple].disabled = true; + formattypes[ff_ptype3].disabled = true; + formattypes[ff_ptype0].disabled = true; + formattypes[ff_ttf].disabled = true; + formattypes[ff_ttfsym].disabled = true; + formattypes[ff_otf].disabled = true; + formattypes[ff_otfcid].disabled = true; + formattypes[ff_cff].disabled = true; + formattypes[ff_cffcid].disabled = true; + formattypes[ff_svg].disabled = true; + } + for ( i=0; icidmaster ? sf->cidmaster : sf; + if ( temp->bitmaps==NULL ) { + old = bf_none; + bitmaptypes[bf_bdf].disabled = true; + bitmaptypes[bf_ttf].disabled = true; + bitmaptypes[bf_sfnt_dfont].disabled = true; + bitmaptypes[bf_nfntmacbin].disabled = true; + /*bitmaptypes[bf_nfntdfont].disabled = true;*/ + bitmaptypes[bf_fon].disabled = true; + bitmaptypes[bf_otb].disabled = true; + } else if ( ofs!=ff_none ) + bitmaptypes[bf_sfnt_dfont].disabled = true; + bitmaptypes[old].selected = true; + gcd[8].gd.label = &bitmaptypes[old]; + gcd[8].gd.handle_controlevent = GFD_BitmapFormat; + + gcd[9].gd.pos.x = gcd[8].gd.pos.x; gcd[9].gd.pos.y = 219; gcd[9].gd.pos.width = gcd[8].gd.pos.width; + gcd[9].gd.flags = gg_visible | gg_enabled; + if ( old==bf_none ) + gcd[9].gd.flags &= ~gg_enabled; + gcd[9].creator = GTextFieldCreate; + label[9].text = BitmapList(temp); + gcd[9].gd.label = &label[9]; + + k = 10; + if ( family ) { + y = 250; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = y; + gcd[k].gd.pos.width = totwid-5-5; + gcd[k].gd.flags = gg_visible | gg_enabled ; + gcd[k++].creator = GLineCreate; + y += 7; + + for ( i=0, j=1; ifontname); + label[k].text_is_1byte = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_Family+i*10; + gcd[k].data = familysfs[j]; + gcd[k].gd.popup_msg = uStyleName(familysfs[j]); + gcd[k++].creator = GCheckBoxCreate; + + gcd[k].gd.pos.x = gcd[8].gd.pos.x; gcd[k].gd.pos.y = y; gcd[k].gd.pos.width = gcd[8].gd.pos.width; + gcd[k].gd.flags = gg_visible | gg_enabled; + if ( old==bf_none ) + gcd[k].gd.flags &= ~gg_enabled; + temp = familysfs[j]->cidmaster ? familysfs[j]->cidmaster : familysfs[j]; + label[k].text = BitmapList(temp); + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_Family+i*10+1; + gcd[k].data = familysfs[j]; + gcd[k++].creator = GTextFieldCreate; + y+=26; + ++j; + } + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = y; + gcd[k].gd.pos.width = totwid-5-5; + gcd[k].gd.flags = gg_visible | gg_enabled ; + gcd[k++].creator = GLineCreate; + } + + GGadgetsCreate(gw,gcd); + GGadgetSetUserData(gcd[2].ret,gcd[0].ret); + free(label[9].text); + for ( i=11; icidmaster==NULL? sf->fontname:sf->cidmaster->fontname; + unichar_t *temp = galloc(sizeof(unichar_t)*(strlen(fn)+30)); + uc_strcpy(temp,fn); + uc_strcat(temp,extensions[ofs]!=NULL?extensions[ofs]:bitmapextensions[old]); + GGadgetSetTitle(gcd[0].ret,temp); + free(temp); + } + GFileChooserGetChildren(gcd[0].ret,&pulldown,&files,&tf); + GWidgetIndicateFocusGadget(tf); +#if __Mac + /* The name of the postscript file is fixed and depends solely on */ + /* the font name. If the user tried to change it, the font would */ + /* not be found */ + GGadgetSetVisible(tf,ofs!=ff_pfbmacbin); +#endif + + memset(&d,'\0',sizeof(d)); + d.sf = sf; + d.family = family; + d.familycnt = familycnt; + d.gfc = gcd[0].ret; + d.pstype = gcd[6].ret; + d.bmptype = gcd[8].ret; + d.bmpsizes = gcd[9].ret; + d.gw = gw; + + d.ps_flags = old_ps_flags; + d.ttf_flags = old_ttf_flags; + d.otf_flags = old_otf_flags; + d.psotb_flags = old_ps_flags | (old_psotb_flags&~ps_flag_mask); + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !d.done ) + GDrawProcessOneEvent(NULL); + if ( wascompacted ) { + FontView *fvs; + SFCompactFont(sf); + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) + GDrawRequestExpose(fvs->v,NULL,false); + } + GDrawDestroyWindow(gw); +return(d.ret); +} diff --git a/fontforge/scripting.c b/fontforge/scripting.c new file mode 100644 index 00000000..2d61d479 --- /dev/null +++ b/fontforge/scripting.c @@ -0,0 +1,5274 @@ +/* Copyright (C) 2002-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* Yet another interpreter */ + +#include "pfaeditui.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int verbose = -1; + +struct dictentry { + char *name; + Val val; +}; + +struct dictionary { + struct dictentry *entries; + int cnt, max; +}; + +static struct dictionary globals; + +typedef struct array { + int argc; + Val *vals; +} Array; + +#define TOK_MAX 100 +enum token_type { tt_name, tt_string, tt_number, tt_unicode, + tt_lparen, tt_rparen, tt_comma, tt_eos, /* eos is end of statement, semicolon, newline */ + tt_lbracket, tt_rbracket, + tt_minus, tt_plus, tt_not, tt_bitnot, tt_colon, + tt_mul, tt_div, tt_mod, tt_and, tt_or, tt_bitand, tt_bitor, tt_xor, + tt_eq, tt_ne, tt_gt, tt_lt, tt_ge, tt_le, + tt_assign, tt_pluseq, tt_minuseq, tt_muleq, tt_diveq, tt_modeq, + tt_incr, tt_decr, + + tt_if, tt_else, tt_elseif, tt_endif, tt_while, tt_foreach, tt_endloop, + tt_shift, tt_return, + + tt_eof, + + tt_error = -1 +}; + +typedef struct context { + struct context *caller; + Array a; /* args */ + Array **dontfree; + struct dictionary locals; + FILE *script; + unsigned int backedup: 1; + unsigned int donteval: 1; + unsigned int returned: 1; + char tok_text[TOK_MAX+1]; + enum token_type tok; + Val tok_val; + Val return_val; + Val trace; + Val argsval; + char *filename; + int lineno; + int ungotch; + FontView *curfv; + jmp_buf *err_env; +} Context; + +struct keywords { enum token_type tok; char *name; } keywords[] = { + { tt_if, "if" }, + { tt_else, "else" }, + { tt_elseif, "elseif" }, + { tt_endif, "endif" }, + { tt_while, "while" }, + { tt_foreach, "foreach" }, + { tt_endloop, "endloop" }, + { tt_shift, "shift" }, + { tt_return, "return" }, + { 0, NULL } +}; + +static const char *toknames[] = { + "name", "string", "number", "unicode id", + "lparen", "rparen", "comma", "end of statement", + "lbracket", "rbracket", + "minus", "plus", "logical not", "bitwise not", "colon", + "multiply", "divide", "mod", "logical and", "logical or", "bitwise and", "bitwise or", "bitwise xor", + "equal to", "not equal to", "greater than", "less than", "greater than or equal to", "less than or equal to", + "assignment", "plus equals", "minus equals", "mul equals", "div equals", "mod equals", + "increment", "decrement", + "if", "else", "elseif", "endif", "while", "foreach", "endloop", + "shift", "return", + "End Of File", + NULL }; + +static void arrayfree(Array *a) { + int i; + + for ( i=0; iargc; ++i ) { + if ( a->vals[i].type==v_str ) + free(a->vals[i].u.sval); + else if ( a->vals[i].type==v_arr ) + arrayfree(a->vals[i].u.aval); + } + free(a->vals); + free(a); +} + +static Array *arraycopy(Array *a) { + int i; + Array *c; + + c = galloc(sizeof(Array)); + c->argc = a->argc; + c->vals = galloc(c->argc*sizeof(Val)); + memcpy(c->vals,a->vals,c->argc*sizeof(Val)); + for ( i=0; iargc; ++i ) { + if ( a->vals[i].type==v_str ) + c->vals[i].u.sval = copy(a->vals[i].u.sval); + else if ( a->vals[i].type==v_arr ) + c->vals[i].u.aval = arraycopy(a->vals[i].u.aval); + } +return( c ); +} + +void DictionaryFree(struct dictionary *dica) { + int i; + + if ( dica==NULL ) +return; + + for ( i=0; icnt; ++i ) { + free(dica->entries[i].name ); + if ( dica->entries[i].val.type == v_str ) + free( dica->entries[i].val.u.sval ); + if ( dica->entries[i].val.type == v_arr ) + arrayfree( dica->entries[i].val.u.aval ); + } + free( dica->entries ); +} + +static int DicaLookup(struct dictionary *dica,char *name,Val *val) { + int i; + + if ( dica!=NULL && dica->entries!=NULL ) { + for ( i=0; icnt; ++i ) + if ( strcmp(dica->entries[i].name,name)==0 ) { + val->type = v_lval; + val->u.lval = &dica->entries[i].val; +return( true ); + } + } +return( false ); +} + +static void DicaNewEntry(struct dictionary *dica,char *name,Val *val) { + + if ( dica->entries==NULL ) { + dica->max = 10; + dica->entries = galloc(dica->max*sizeof(struct dictentry)); + } else if ( dica->cnt>=dica->max ) { + dica->max += 10; + dica->entries = grealloc(dica->entries,dica->max*sizeof(struct dictentry)); + } + dica->entries[dica->cnt].name = copy(name); + dica->entries[dica->cnt].val.type = v_void; + val->type = v_lval; + val->u.lval = &dica->entries[dica->cnt].val; + ++dica->cnt; +} + + +static void calldatafree(Context *c) { + int i; + + for ( i=1; ia.argc; ++i ) { /* child may have freed some args itself by shifting, but argc will reflect the proper values none the less */ + if ( c->a.vals[i].type == v_str ) + free( c->a.vals[i].u.sval ); + if ( c->a.vals[i].type == v_arrfree || (c->a.vals[i].type == v_arr && c->dontfree[i]!=c->a.vals[i].u.aval )) + arrayfree( c->a.vals[i].u.aval ); + } + DictionaryFree(&c->locals); + + if ( c->script!=NULL ) + fclose(c->script); +} + +static void traceback(Context *c) { + int cnt = 0; + while ( c!=NULL ) { + if ( cnt==1 ) printf( "Called from...\n" ); + if ( cnt>0 ) fprintf( stderr, " %s: %d\n", c->filename, c->lineno ); + calldatafree(c); + if ( c->err_env!=NULL ) + longjmp(*c->err_env,1); + c = c->caller; + ++cnt; + } + exit(1); +} + +static void showtoken(Context *c,enum token_type got) { + if ( got==tt_name || got==tt_string ) + fprintf( stderr, " \"%s\"\n", c->tok_text ); + else if ( got==tt_number ) + fprintf( stderr, " %d (0x%x)\n", c->tok_val.u.ival, c->tok_val.u.ival ); + else if ( got==tt_unicode ) + fprintf( stderr, " 0u%x\n", c->tok_val.u.ival ); + else + fprintf( stderr, "\n" ); + traceback(c); +} + +static void expect(Context *c,enum token_type expected, enum token_type got) { + if ( got!=expected ) { + fprintf( stderr, "%s: %d Expected %s, got %s", + c->filename, c->lineno, toknames[expected], toknames[got] ); + if ( screen_display!=NULL ) { + static unichar_t umsg[] = { '%','h','s',':',' ','%','d',' ','E','x','p','e','c','t','e','d',' ','%','h','s',',',' ','g','o','t',' ','%','h','s', 0 }; + GWidgetError(NULL,umsg,c->filename, c->lineno, toknames[expected], toknames[got] ); + } + showtoken(c,got); + } +} + +static void unexpected(Context *c,enum token_type got) { + fprintf( stderr, "%s: %d Unexpected %s found", + c->filename, c->lineno, toknames[got] ); + if ( screen_display!=NULL ) { + static unichar_t umsg[] = { '%','h','s',':',' ','%','d',' ','U','n','e','x','p','e','c','t','e','d',' ','%','h','s', 0 }; + GWidgetError(NULL,umsg,c->filename, c->lineno, toknames[got] ); + } + showtoken(c,got); +} + +static void error( Context *c, char *msg ) { + fprintf( stderr, "%s: %d %s\n", c->filename, c->lineno, msg ); + if ( screen_display!=NULL ) { + static unichar_t umsg[] = { '%','h','s',':',' ','%','d',' ','%','h','s', 0 }; + GWidgetError(NULL,umsg,c->filename, c->lineno, msg ); + } + traceback(c); +} + +static void errors( Context *c, char *msg, char *name) { + fprintf( stderr, "%s: %d %s: %s\n", c->filename, c->lineno, msg, name ); + if ( screen_display!=NULL ) { + static unichar_t umsg[] = { '%','h','s',':',' ','%','d',' ','%','h','s',':',' ','%','h','s', 0 }; + GWidgetError(NULL,umsg,c->filename, c->lineno, msg, name ); + } + traceback(c); +} + +static void dereflvalif(Val *val) { + if ( val->type == v_lval ) { + *val = *val->u.lval; + if ( val->type==v_str ) + val->u.sval = copy(val->u.sval); + } +} + +/* *************************** Built in Functions *************************** */ + +static void PrintVal(Val *val) { + int j; + + if ( val->type==v_str ) + printf( "%s", val->u.sval ); + else if ( val->type==v_arr ) { + putchar( '[' ); + if ( val->u.aval->argc>0 ) { + PrintVal(&val->u.aval->vals[0]); + for ( j=1; ju.aval->argc; ++j ) { + putchar(','); + PrintVal(&val->u.aval->vals[j]); + } + } + putchar( ']' ); + } else if ( val->type==v_int ) + printf( "%d", val->u.ival ); + else if ( val->type==v_unicode ) + printf( "0u%x", val->u.ival ); + else if ( val->type==v_void ) + printf( ""); + else + printf( ""); /* ANSI might thing this a trigraph */ +} + +static void bPrint(Context *c) { + int i; + + for ( i=1; ia.argc; ++i ) + PrintVal(&c->a.vals[i] ); + printf( "\n" ); + fflush(stdout); +} + +static void bError(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Expected string argument" ); + + error( c, c->a.vals[1].u.sval ); +} + +static void bPostNotice(Context *c) { + static const unichar_t format[] = { '%','.','2','0','0','h','s', '\0' }; + static const unichar_t notice[] = { 'A','t','t','e','n','t','i','o','n', '\0' }; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Expected string argument" ); + + if ( screen_display==NULL ) + fprintf(stderr,"%s\n", c->a.vals[1].u.sval ); + else + GWidgetPostNotice( notice, format, c->a.vals[1].u.sval ); +} + +static void bAskUser(Context *c) { + char *quest, *def=""; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || ( c->a.argc==3 && c->a.vals[2].type!=v_str) ) + error( c, "Expected string argument" ); + quest = c->a.vals[1].u.sval; + if ( c->a.argc==3 ) + def = c->a.vals[2].u.sval; + if ( screen_display==NULL ) { + char buffer[300]; + printf( "%s", quest ); + buffer[0] = '\0'; + c->return_val.type = v_str; + if ( fgets(buffer,sizeof(buffer),stdin)==NULL ) { + clearerr(stdin); + c->return_val.u.sval = copy(""); + } else if ( buffer[0]=='\0' ) + c->return_val.u.sval = copy(def); + else + c->return_val.u.sval = copy(buffer); + } else { + unichar_t *t1, *t2, *ret; + static unichar_t format[] = { '%','s', 0 }; + t1 = uc_copy(quest); + ret = GWidgetAskString(t1,t2=uc_copy(def),format, t1); + free(t1); + free(t2); + c->return_val.type = v_str; + c->return_val.u.sval = cu_copy(ret); + if ( ret==NULL ) + c->return_val.u.sval = copy(""); + else + free(ret); + } +} + +static void bArray(Context *c) { + int i; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_int ) + error( c, "Expected integer argument" ); + else if ( c->a.vals[1].u.ival<=0 ) + error( c, "Argument must be positive" ); + c->return_val.type = v_arrfree; + c->return_val.u.aval = galloc(sizeof(Array)); + c->return_val.u.aval->argc = c->a.vals[1].u.ival; + c->return_val.u.aval->vals = galloc(c->a.vals[1].u.ival*sizeof(Val)); + for ( i=0; ia.vals[1].u.ival; ++i ) + c->return_val.u.aval->vals[i].type = v_void; +} + +static void bSizeOf(Context *c) { + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + if ( c->a.vals[1].type!=v_arr && c->a.vals[1].type!=v_arrfree ) + error( c, "Expected array argument" ); + + c->return_val.type = v_int; + c->return_val.u.ival = c->a.vals[1].u.aval->argc; +} + +static void bStrlen(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type for argument" ); + + c->return_val.type = v_int; + c->return_val.u.ival = strlen( c->a.vals[1].u.sval ); +} + +static void bStrstr(Context *c) { + char *pt; + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str ) + error( c, "Bad type for argument" ); + + c->return_val.type = v_int; + pt = strstr(c->a.vals[1].u.sval,c->a.vals[2].u.sval); + c->return_val.u.ival = pt==NULL ? -1 : pt-c->a.vals[1].u.sval; +} + +static void bStrcasestr(Context *c) { + char *pt; + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str ) + error( c, "Bad type for argument" ); + + c->return_val.type = v_int; + pt = strstrmatch(c->a.vals[1].u.sval,c->a.vals[2].u.sval); + c->return_val.u.ival = pt==NULL ? -1 : pt-c->a.vals[1].u.sval; +} + +static void bStrrstr(Context *c) { + char *pt; + char *haystack, *needle; + int nlen; + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str ) + error( c, "Bad type for argument" ); + + c->return_val.type = v_int; + haystack = c->a.vals[1].u.sval; needle = c->a.vals[2].u.sval; + nlen = strlen( needle ); + for ( pt=haystack+strlen(haystack)-nlen; pt>=haystack; --pt ) + if ( strncmp(pt,needle,nlen)==0 ) + break; + c->return_val.u.ival = pt-haystack; +} + +static void bStrsub(Context *c) { + int start, end; + char *str; + + if ( c->a.argc!=3 && c->a.argc!=4 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_int || + (c->a.argc==4 && c->a.vals[3].type!=v_int)) + error( c, "Bad type for argument" ); + + str = c->a.vals[1].u.sval; + start = c->a.vals[2].u.ival; + end = c->a.argc==4? c->a.vals[3].u.ival : strlen(str); + if ( start<0 || start>strlen(str) || endstrlen(str) ) + error( c, "Arguments out of bounds" ); + c->return_val.type = v_str; + c->return_val.u.sval = copyn(str+start,end-start); +} + +static void bStrcasecmp(Context *c) { + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str ) + error( c, "Bad type for argument" ); + + c->return_val.type = v_int; + c->return_val.u.ival = strmatch(c->a.vals[1].u.sval,c->a.vals[2].u.sval); +} + +static void bStrtol(Context *c) { + int base = 10; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || (c->a.argc==3 && c->a.vals[2].type!=v_int) ) + error( c, "Bad type for argument" ); + else if ( c->a.argc==3 ) { + base = c->a.vals[2].u.ival; + if ( base<0 || base==1 || base>36 ) + error( c, "Argument out of bounds" ); + } + + c->return_val.type = v_int; + c->return_val.u.ival = strtol(c->a.vals[1].u.sval,NULL,base); +} + +static void bStrskipint(Context *c) { + int base = 10; + char *end; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || (c->a.argc==3 && c->a.vals[2].type!=v_int) ) + error( c, "Bad type for argument" ); + else if ( c->a.argc==3 ) { + base = c->a.vals[2].u.ival; + if ( base<0 || base==1 || base>36 ) + error( c, "Argument out of bounds" ); + } + + c->return_val.type = v_int; + strtol(c->a.vals[1].u.sval,&end,base); + c->return_val.u.ival = end-c->a.vals[1].u.sval; +} + +static void bGetPrefs(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type for argument" ); + if ( !GetPrefs(c->a.vals[1].u.sval,&c->return_val) ) + errors( c, "Unknown Preference variable", c->a.vals[1].u.sval ); +} + +static void bSetPrefs(Context *c) { + int ret; + + if ( c->a.argc!=3 && c->a.argc!=4 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str && (c->a.argc==4 && c->a.vals[3].type!=v_int) ) + error( c, "Bad type for argument" ); + if ( (ret=SetPrefs(c->a.vals[1].u.sval,&c->a.vals[2],c->a.argc==4?&c->a.vals[3]:NULL))==0 ) + errors( c, "Unknown Preference variable", c->a.vals[1].u.sval ); + else if ( ret==-1 ) + errors( c, "Bad type for preference variable", c->a.vals[1].u.sval); +} + +static void bUnicodeFromName(Context *c) { + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type for argument" ); + c->return_val.type = v_int; + c->return_val.u.ival = UniFromName(c->a.vals[1].u.sval); +} + +static void bChr(Context *c) { + char buf[2]; + char *temp; + int i; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type==v_int ) { + if ( c->a.vals[1].u.ival<-128 || c->a.vals[1].u.ival>255 ) + error( c, "Bad value for argument" ); + buf[0] = c->a.vals[1].u.ival; buf[1] = 0; + c->return_val.type = v_str; + c->return_val.u.sval = copy(buf); + } else if ( c->a.vals[1].type==v_arr || c->a.vals[1].type==v_arrfree ) { + Array *arr = c->a.vals[1].u.aval; + temp = galloc((arr->argc+1)*sizeof(char)); + for ( i=0; iargc; ++i ) { + if ( arr->vals[i].type!=v_int ) + error( c, "Bad type for argument" ); + else if ( c->a.vals[1].u.ival<-128 || c->a.vals[1].u.ival>255 ) + error( c, "Bad value for argument" ); + temp[i] = arr->vals[i].u.ival; + } + temp[i] = 0; + c->return_val.type = v_str; + c->return_val.u.sval = temp; + } else + error( c, "Bad type for argument" ); +} + +static void bUtf8(Context *c) { + int32 buf[2]; + int i; + int32 *temp; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type==v_int ) { + if ( c->a.vals[1].u.ival<0 || c->a.vals[1].u.ival>0x10ffff ) + error( c, "Bad value for argument" ); + buf[0] = c->a.vals[1].u.ival; buf[1] = 0; + c->return_val.type = v_str; + c->return_val.u.sval = u322utf8_copy(buf); + } else if ( c->a.vals[1].type==v_arr || c->a.vals[1].type==v_arrfree ) { + Array *arr = c->a.vals[1].u.aval; + temp = galloc((arr->argc+1)*sizeof(int32)); + for ( i=0; iargc; ++i ) { + if ( arr->vals[i].type!=v_int ) + error( c, "Bad type for argument" ); + else if ( arr->vals[i].u.ival<0 || arr->vals[i].u.ival>0x10ffff ) + error( c, "Bad value for argument" ); + temp[i] = arr->vals[i].u.ival; + } + temp[i] = 0; + c->return_val.type = v_str; + c->return_val.u.sval = u322utf8_copy(temp); + free(temp); + } else + error( c, "Bad type for argument" ); +} + +static void bOrd(Context *c) { + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments" ); + else if ( c->a.vals[1].type!=v_str || ( c->a.argc==3 && c->a.vals[1].type!=v_int )) + error( c, "Bad type for argument" ); + if ( c->a.argc==3 ) { + if ( c->a.vals[2].u.ival<0 || c->a.vals[2].u.ival>strlen( c->a.vals[1].u.sval )) + error( c, "Bad value for argument" ); + c->return_val.type = v_int; + c->return_val.u.ival = (uint8) c->a.vals[1].u.sval[c->a.vals[2].u.ival]; + } else { + int i, len = strlen(c->a.vals[1].u.sval); + c->return_val.type = v_arrfree; + c->return_val.u.aval = galloc(sizeof(Array)); + c->return_val.u.aval->argc = len; + c->return_val.u.aval->vals = galloc(len*sizeof(Val)); + for ( i=0; ireturn_val.u.aval->vals[i].type = v_int; + c->return_val.u.aval->vals[i].u.ival = (uint8) c->a.vals[1].u.sval[i]; + } + } +} + +/* **** File menu **** */ + +static void bQuit(Context *c) { + if ( verbose>0 ) putchar('\n'); + if ( c->a.argc==1 ) +exit(0); + if ( c->a.argc>2 ) + error( c, "Too many arguments" ); + else if ( c->a.vals[1].type!=v_int ) + error( c, "Expected integer argument" ); + else +exit(c->a.vals[1].u.ival ); +exit(1); +} + +static FontView *FVAppend(FontView *fv) { + /* Normally fontviews get added to the fv list when their windows are */ + /* created. but we don't create any windows here, so... */ + FontView *test; + + if ( fv_list==NULL ) fv_list = fv; + else { + for ( test = fv_list; test->next!=NULL; test=test->next ); + test->next = fv; + } +return( fv ); +} + +static char **GetFontNames(char *filename) { + FILE *foo = fopen(filename,"r"); + char **ret = NULL; + + if ( foo!=NULL ) { + /* Try to guess the file type from the first few characters... */ + int ch1 = getc(foo); + int ch2 = getc(foo); + int ch3 = getc(foo); + int ch4 = getc(foo); + int ch5, ch6; + fseek(foo, 98, SEEK_SET); + ch5 = getc(foo); + ch6 = getc(foo); + fclose(foo); + if (( ch1==0 && ch2==1 && ch3==0 && ch4==0 ) || + (ch1=='O' && ch2=='T' && ch3=='T' && ch4=='O') || + (ch1=='t' && ch2=='r' && ch3=='u' && ch4=='e') || + (ch1=='t' && ch2=='t' && ch3=='c' && ch4=='f') ) { + ret = NamesReadTTF(filename); + } else if (( ch1=='%' && ch2=='!' ) || + ( ch1==0x80 && ch2=='\01' ) ) { /* PFB header */ + ret = NamesReadPostscript(filename); + } else if ( ch1=='<' && ch2=='?' && (ch3=='x'||ch3=='X') && (ch4=='m'||ch4=='M') ) { + ret = NamesReadSVG(filename); + } else if ( ch1=='S' && ch2=='p' && ch3=='l' && ch4=='i' ) { + ret = NamesReadSFD(filename); + } else if ( ch1==1 && ch2==0 && ch3==4 ) { + ret = NamesReadCFF(filename); + } else /* Too hard to figure out a valid mark for a mac resource file */ + ret = NamesReadMacBinary(filename); + } +return( ret ); +} + +static void bFontsInFile(Context *c) { + char **ret; + int cnt; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "FontsInFile expects a filename" ); + ret = GetFontNames(c->a.vals[1].u.sval); + + cnt = 0; + if ( ret!=NULL ) for ( cnt=0; ret[cnt]!=NULL; ++cnt ); + c->return_val.type = v_arr; + c->return_val.u.aval = galloc(sizeof(Array)); + c->return_val.u.aval->argc = cnt; + c->return_val.u.aval->vals = galloc((cnt==0?1:cnt)*sizeof(Val)); + if ( ret!=NULL ) for ( cnt=0; ret[cnt]!=NULL; ++cnt ) { + c->return_val.u.aval->vals[cnt].type = v_str; + c->return_val.u.aval->vals[cnt].u.sval = ret[cnt]; + } + free(ret); +} + +static void bOpen(Context *c) { + SplineFont *sf; + int openflags=0; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Open expects a filename" ); + else if ( c->a.argc==3 ) { + if ( c->a.vals[2].type!=v_int ) + error( c, "Open expects an integer for second argument" ); + openflags = c->a.vals[2].u.ival; + } + sf = LoadSplineFont(c->a.vals[1].u.sval,openflags); + if ( sf==NULL ) + errors(c, "Failed to open", c->a.vals[1].u.sval); + if ( sf->fv!=NULL ) + /* All done */; + else if ( screen_display!=NULL ) + FontViewCreate(sf); + else + FVAppend(_FontViewCreate(sf)); + c->curfv = sf->fv; +} + +static void bNew(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + c->curfv = FVAppend(_FontViewCreate(SplineFontNew())); +} + +static void bClose(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + if ( fv_list==c->curfv ) + fv_list = c->curfv->next; + else { + FontView *n; + for ( n=fv_list; n->next!=c->curfv; n=n->next ); + n->next = c->curfv->next; + } + FontViewFree(c->curfv); + c->curfv = NULL; +} + +static void bSave(Context *c) { + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc>2 ) + error( c, "Wrong number of arguments"); + if ( c->a.argc==2 ) { + if ( c->a.vals[1].type!=v_str ) + error(c,"If an argument is given to Save it must be a filename"); + if ( !SFDWrite(c->a.vals[1].u.sval,sf)) + error(c,"Save As failed" ); + } else { + if ( sf->filename==NULL ) + error(c,"This font has no associated sfd file yet, you must specify a filename" ); + if ( !SFDWriteBak(sf) ) + error(c,"Save failed" ); + } +} + +static void bGenerate(Context *c) { + SplineFont *sf = c->curfv->sf; + char *bitmaptype = ""; + int fmflags = -1; + int res = -1; + char *subfontdirectory = NULL; + int wascompacted = sf->compacted; + + if ( c->a.argc!=2 && c->a.argc!=3 && c->a.argc!=4 && c->a.argc!=5 && c->a.argc!=6 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_str || + (c->a.argc>=3 && c->a.vals[2].type!=v_str ) || + (c->a.argc>=4 && c->a.vals[3].type!=v_int ) || + (c->a.argc>=5 && c->a.vals[4].type!=v_int ) || + (c->a.argc>=6 && c->a.vals[5].type!=v_str )) + error( c, "Bad type of argument"); + if ( c->a.argc>=3 ) + bitmaptype = c->a.vals[2].u.sval; + if ( c->a.argc>=4 ) + fmflags = c->a.vals[3].u.ival; + if ( c->a.argc>=5 ) + res = c->a.vals[4].u.ival; + if ( c->a.argc>=6 ) + subfontdirectory = c->a.vals[5].u.sval; + if ( wascompacted ) + SFUncompactFont(sf); + if ( !GenerateScript(sf,c->a.vals[1].u.sval,bitmaptype,fmflags,res,subfontdirectory,NULL) ) + error(c,"Save failed"); + if ( wascompacted ) + SFCompactFont(sf); +} + +static void bGenerateFamily(Context *c) { + SplineFont *sf = NULL; + char *bitmaptype = ""; + int fmflags = -1; + struct sflist *sfs, *cur; + Array *fonts; + FontView *fv; + int i; + uint16 psstyle; + SplineFont *styles[48]; + + memset(styles,0,sizeof(styles)); + if ( c->a.argc!=5 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || + c->a.vals[3].type!=v_int || + c->a.vals[4].type!=v_arr ) + error( c, "Bad type of argument"); + bitmaptype = c->a.vals[2].u.sval; + fmflags = c->a.vals[3].u.ival; + + fonts = c->a.vals[4].u.aval; + for ( i=0; iargc; ++i ) { + if ( fonts->vals[i].type!=v_str ) + error(c,"Values in the fontname array must be strings"); + for ( fv=fv_list; fv!=NULL; fv=fv->next ) if ( fv->sf!=sf ) + if ( strcmp(fonts->vals[i].u.sval,fv->sf->origname)==0 || + (fv->sf->filename!=NULL && strcmp(fonts->vals[i].u.sval,fv->sf->origname)==0 )) + break; + if ( fv==NULL ) + for ( fv=fv_list; fv!=NULL; fv=fv->next ) if ( fv->sf!=sf ) + if ( strcmp(fonts->vals[i].u.sval,fv->sf->fontname)==0 ) + break; + if ( fv==NULL ) { + fprintf( stderr, "%s\n", fonts->vals[i].u.sval ); + error( c, "The above font is not loaded" ); + } + if ( sf==NULL ) + sf = fv->sf; + if ( fv->sf->encoding_name!=sf->encoding_name ) { + fprintf( stderr, "%s and %s\n", fv->sf->filename, sf->filename ); + error( c, "The above fonts have different encodings" ); + } + if ( strcmp(fv->sf->familyname,sf->familyname)!=0 ) + fprintf( stderr, "Warning: %s has a different family name than does %s (GenerateFamily)\n", + fv->sf->fontname, sf->fontname ); + MacStyleCode(fv->sf,&psstyle); + if ( psstyle>=48 ) { + fprintf( stderr, "%s(%s)\n", fv->sf->origname, fv->sf->fontname ); + error( c, "A font can't be both Condensed and Expanded" ); + } else if ( styles[psstyle]==NULL || styles[psstyle]==fv->sf) + styles[psstyle] = fv->sf; + else { + fprintf( stderr, "%s(%s) and %s(%s) 0x%x\n", + styles[psstyle]->origname, styles[psstyle]->fontname, + fv->sf->origname, fv->sf->fontname, + psstyle ); + error( c, "Two array entries given with the same style (in the Mac's postscript style set)" ); + } + } + if ( styles[0]==NULL ) { + if ( MacStyleCode(c->curfv->sf,NULL)==0 && strcmp(c->curfv->sf->familyname,sf->familyname)!=0 ) + styles[0] = c->curfv->sf; + if ( styles[0]==NULL ) + error(c,"At least one of the specified fonts must have a plain style"); + } + sfs = NULL; + for ( i=47; i>=0; --i ) if ( styles[i]!=NULL ) { + cur = chunkalloc(sizeof(struct sflist)); + cur->next = sfs; + sfs = cur; + cur->sf = styles[i]; + } + + if ( !GenerateScript(sf,c->a.vals[1].u.sval,bitmaptype,fmflags,-1,NULL,sfs) ) + error(c,"Save failed"); + for ( cur=sfs; cur!=NULL; cur=sfs ) { + sfs = cur->next; + chunkfree(cur,sizeof(struct sflist)); + } +} + +static void bControlAfmLigatureOutput(Context *c) { + extern int lig_script, lig_lang, *lig_tags; + uint32 tags[2]; + int i,cnt; + char *str, *pt; + char temp[4]; + + if ( c->a.argc!=4 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || c->a.vals[3].type!=v_str ) + error( c, "Bad type of argument"); + for ( i=0; i<2; ++i ) { + str = c->a.vals[i+1].u.sval; + memset(temp,' ',4); + if ( *str ) { + temp[0] = *str; + if ( str[1] ) { + temp[1] = str[1]; + if ( str[2] ) { + temp[2] = str[2]; + if ( str[3] ) { + temp[3] = str[3]; + if ( str[4] ) + error(c,"Scripts/Languages are represented by strings which are at most 4 characters long"); + } + } + } + } + tags[i] = (temp[0]<<24)|(temp[1]<<16)|(temp[2]<<8)|temp[3]; + } + lig_script = tags[0]; lig_lang = tags[1]; + + pt = str = c->a.vals[3].u.sval; + cnt = 0; + while ( (pt=strchr(pt,','))!=NULL ) { + ++cnt; + ++pt; + } + if ( lig_tags!=NULL ) free(lig_tags); + lig_tags = galloc((cnt+2)*sizeof(uint32)); + i =0; + while ( *str ) { + memset(temp,' ',4); + if ( *str && *str!=',' ) { + temp[0] = *str; + if ( str[1] && str[1]!=',' ) { + temp[1] = str[1]; + if ( str[2] && str[2]!=',' ) { + temp[2] = str[2]; + if ( str[3] && str[3]!=',' ) { + temp[3] = str[3]; + if ( str[4] && str[4]!=',' ) + error(c,"Tags are represented by strings which are at most 4 characters long"); + } + } + } + } + if ( i<=cnt ) + lig_tags[i++] = (temp[0]<<24)|(temp[1]<<16)|(temp[2]<<8)|temp[3]; + else + GDrawIError("Bad ligature tag count"); + pt = strchr(str,','); + if ( pt==NULL ) + str += strlen(str); + else + str = pt+1; + } + lig_tags[i] = 0; +} + +static void Bitmapper(Context *c,int isavail) { + int32 *sizes; + int i; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_arr ) + error( c, "Bad type of argument"); + for ( i=0; ia.vals[1].u.aval->argc; ++i ) + if ( c->a.vals[1].u.aval->vals[i].type!=v_int || + c->a.vals[1].u.aval->vals[i].u.ival<=2 ) + error( c, "Bad type of array component"); + sizes = galloc((c->a.vals[1].u.aval->argc+1)*sizeof(int32)); + for ( i=0; ia.vals[1].u.aval->argc; ++i ) { + sizes[i] = c->a.vals[1].u.aval->vals[i].u.ival; + if ( (sizes[i]>>16)==0 ) + sizes[i] |= 0x10000; + } + sizes[i] = 0; + + if ( !BitmapControl(c->curfv,sizes,isavail) ) + error(c,"Bitmap operation failed"); /* Storage leak here longjmp avoids free */ + free(sizes); +} + +static void bBitmapsAvail(Context *c) { + Bitmapper(c,true); +} + +static void bBitmapsRegen(Context *c) { + Bitmapper(c,false); +} + +static void bImport(Context *c) { + char *ext, *filename; + int format, back, ok; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_str || (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error( c, "Bad type of argument"); + filename = GFileMakeAbsoluteName(c->a.vals[1].u.sval); + ext = strrchr(filename,'.'); + if ( ext==NULL ) { + int len = strlen(filename); + ext = filename+len-2; + if ( ext[0]!='p' || ext[1]!='k' ) + errors( c, "No extension in", filename); + } + back = 0; + if ( strmatch(ext,".bdf")==0 ) + format = fv_bdf; + else if ( strmatch(ext,".pcf")==0 ) + format = fv_pcf; + else if ( strmatch(ext,".ttf")==0 || strmatch(ext,".otf")==0 || strmatch(ext,".otb")==0 ) + format = fv_ttf; + else if ( strmatch(ext,"pk")==0 || strmatch(ext,".pk")==0 ) { + format = fv_pk; + back = 1; + } else if ( strmatch(ext,".eps")==0 || strmatch(ext,".ps")==0 || + strmatch(ext,".art")==0 ) { + if ( strchr(filename,'*')!=NULL ) + format = fv_epstemplate; + else + format = fv_eps; + } else if ( strmatch(ext,".svg")==0 ) { + if ( strchr(filename,'*')!=NULL ) + format = fv_svgtemplate; + else + format = fv_svg; + } else { + if ( strchr(filename,'*')!=NULL ) + format = fv_imgtemplate; + else + format = fv_image; + } + if ( c->a.argc==3 ) + back = c->a.vals[2].u.ival; + if ( format==fv_bdf ) + ok = FVImportBDF(c->curfv,filename,false, back); + else if ( format==fv_pcf ) + ok = FVImportBDF(c->curfv,filename,2, back); + else if ( format==fv_ttf ) + ok = FVImportMult(c->curfv,filename, back, bf_ttf); + else if ( format==fv_pk ) + ok = FVImportBDF(c->curfv,filename,true, back); + else if ( format==fv_image || format==fv_eps || format==fv_svg ) + ok = FVImportImages(c->curfv,filename,format); + else + ok = FVImportImageTemplate(c->curfv,filename,format); + free(filename); + if ( !ok ) + error(c,"Import failed" ); +} + +#ifdef FONTFORGE_CONFIG_WRITE_PFM +static void bWritePfm(Context *c) { + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type of argument"); + if ( !WritePfmFile(c->a.vals[1].u.sval,sf,0) ) + error(c,"Save failed"); +} +#endif + +static void bExport(Context *c) { + int format,i ; + BDFFont *bdf; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_str || (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error( c, "Bad type of arguments"); + if ( strmatch(c->a.vals[1].u.sval,"eps")==0 ) + format = 0; + else if ( strmatch(c->a.vals[1].u.sval,"fig")==0 ) + format = 1; + else if ( strmatch(c->a.vals[1].u.sval,"svg")==0 ) + format = 2; + else if ( strmatch(c->a.vals[1].u.sval,"pdf")==0 ) + format = 3; + else if ( strmatch(c->a.vals[1].u.sval,"xbm")==0 ) + format = 4; + else if ( strmatch(c->a.vals[1].u.sval,"bmp")==0 ) + format = 5; +#ifndef _NO_LIBPNG + else if ( strmatch(c->a.vals[1].u.sval,"png")==0 ) + format = 6; + else + error( c, "Bad format (first arg must be eps/fig/xbm/bmp/png)"); +#else + else + error( c, "Bad format (first arg must be eps/fig/xbm/bmp)"); +#endif + if (( format>=4 && c->a.argc!=3 ) || (format<4 && c->a.argc==3 )) + error( c, "Wrong number of arguments"); + bdf=NULL; + if ( format>=4 ) { + for ( bdf = c->curfv->sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + if (( BDFDepth(bdf)==1 && bdf->pixelsize==c->a.vals[2].u.ival) || + (bdf->pixelsize!=(c->a.vals[2].u.ival&0xffff) && + BDFDepth(bdf)==(c->a.vals[2].u.ival>>16)) ) + break; + if ( bdf==NULL ) + error(c, "No bitmap font matches the specified size"); + } + for ( i=0; icurfv->sf->charcnt; ++i ) + if ( SCWorthOutputting(c->curfv->sf->chars[i]) ) + ScriptExport(c->curfv->sf,bdf,format,i); +} + +static void bMergeKern(Context *c) { + int isafm; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type of arguments"); + isafm = strstrmatch(c->a.vals[1].u.sval,".afm")!=NULL; + if ( (isafm && !LoadKerningDataFromAfm(c->curfv->sf,c->a.vals[1].u.sval)) || + (!isafm && !LoadKerningDataFromTfm(c->curfv->sf,c->a.vals[1].u.sval)) ) + error( c, "Failed to find kern info in file" ); +} + +static void bPrintSetup(Context *c) { + + if ( c->a.argc!=2 && c->a.argc!=3 && c->a.argc!=5 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int ) + error( c, "Bad type for first argument"); + if ( c->a.argc>=3 && c->a.vals[2].type!=v_int ) + error( c, "Bad type for second argument"); + if ( c->a.argc==5 ) { + if ( c->a.vals[3].type!=v_int ) + error( c, "Bad type for third argument"); + if ( c->a.vals[4].type!=v_int ) + error( c, "Bad type for fourth argument"); + pagewidth = c->a.vals[3].u.ival; + pageheight = c->a.vals[4].u.ival; + } + printtype = c->a.vals[1].u.ival; + if ( c->a.argc>=3 && printtype==4 ) + printcommand = copy(c->a.vals[2].u.sval); + else if ( c->a.argc>=3 && (printtype==0 || printtype==1) ) + printlazyprinter = copy(c->a.vals[2].u.sval); +} + +static void bPrintFont(Context *c) { + int type, i; + int32 *pointsizes=NULL; + char *sample=NULL, *output=NULL; + + if ( c->a.argc!=2 && c->a.argc!=3 && c->a.argc!=4 && c->a.argc!=5 ) + error( c, "Wrong number of arguments"); + type = c->a.vals[1].u.ival; + if ( c->a.vals[1].type!=v_int || type<0 || type>3 ) + error( c, "Bad type for first argument"); + if ( c->a.argc>=3 ) { + if ( c->a.vals[2].type==v_int ) { + if ( c->a.vals[2].u.ival>0 ) { + pointsizes = gcalloc(2,sizeof(int32)); + pointsizes[0] = c->a.vals[2].u.ival; + } + } else if ( c->a.vals[2].type==v_arr ) { + Array *a = c->a.vals[2].u.aval; + pointsizes = galloc((a->argc+1)*sizeof(int32)); + for ( i=0; iargc; ++i ) { + if ( a->vals[i].type!=v_int ) + error( c, "Bad type for array contents"); + pointsizes[i] = a->vals[i].u.ival; + } + pointsizes[i] = 0; + } else + error( c, "Bad type for second argument"); + } + if ( c->a.argc>=4 ) { + if ( c->a.vals[3].type!=v_str ) + error( c, "Bad type for third argument"); + else if ( *c->a.vals[3].u.sval!='\0' ) + sample = c->a.vals[3].u.sval; + } + if ( c->a.argc>=5 ) { + if ( c->a.vals[4].type!=v_str ) + error( c, "Bad type for fourth argument"); + else if ( *c->a.vals[4].u.sval!='\0' ) + output = c->a.vals[4].u.sval; + } + ScriptPrint(c->curfv,type,pointsizes,sample,output); + free(pointsizes); +} + +/* **** Edit menu **** */ +static void doEdit(Context *c, int cmd) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,cmd); +} + +static void bCut(Context *c) { + doEdit(c,0); +} + +static void bCopy(Context *c) { + doEdit(c,1); +} + +static void bCopyReference(Context *c) { + doEdit(c,2); +} + +static void bCopyWidth(Context *c) { + doEdit(c,3); +} + +static void bCopyVWidth(Context *c) { + if ( c->curfv!=NULL && !c->curfv->sf->hasvmetrics ) + error(c,"Vertical metrics not enabled in this font"); + doEdit(c,10); +} + +static void bCopyLBearing(Context *c) { + doEdit(c,11); +} + +static void bCopyRBearing(Context *c) { + doEdit(c,12); +} + +static void bPaste(Context *c) { + doEdit(c,4); +} + +static void bPasteInto(Context *c) { + doEdit(c,9); +} + +static void bClear(Context *c) { + doEdit(c,5); +} + +static void bClearBackground(Context *c) { + doEdit(c,6); +} + +static void bCopyFgToBg(Context *c) { + doEdit(c,7); +} + +static void bUnlinkReference(Context *c) { + doEdit(c,8); +} + +static void bJoin(Context *c) { + doEdit(c,13); +} + +static void bSameGlyphAs(Context *c) { + doEdit(c,14); +} + +static void bSelectAll(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + memset(c->curfv->selected,1,c->curfv->sf->charcnt); +} + +static void bSelectNone(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + memset(c->curfv->selected,0,c->curfv->sf->charcnt); +} + +static int ParseCharIdent(Context *c, Val *val, int signal_error) { + SplineFont *sf = c->curfv->sf; + int bottom = -1; + + if ( val->type==v_int ) + bottom = val->u.ival; + else if ( val->type==v_unicode || val->type==v_str ) { + if ( val->type==v_unicode ) + bottom = SFFindChar(sf,val->u.ival,NULL); + else { + unichar_t *temp = uc_copy(val->u.sval); + bottom = NameToEncoding(sf,temp); + free(temp); + } + } else { + if ( signal_error ) + error( c, "Bad type for argument"); + else +return( -1 ); + } + if ( bottom==-1 ) { + if ( signal_error ) + error( c, "Character not found" ); +return( -1 ); + } else if ( bottom<0 || bottom>=sf->charcnt ) { + if ( signal_error ) + error( c, "Character is not in font" ); +return( -1 ); + } +return( bottom ); +} + +static int bDoSelect(Context *c, int signal_error) { + int top, bottom, i,j; + int any = false; + + if ( c->a.argc==2 && (c->a.vals[1].type==v_arr || c->a.vals[1].type==v_arrfree)) { + struct array *arr = c->a.vals[1].u.aval; + for ( i=0; iargc && icurfv->sf->charcnt; ++i ) { + if ( arr->vals[i].type!=v_int ) { + if ( signal_error ) + error(c,"Bad type within selection array"); + else +return( any ? -1 : -2 ); + } else if ( arr->vals[i].u.ival ) { + c->curfv->selected[i] = true; + ++any; + } + } +return( any ); + } + + for ( i=1; ia.argc; i+=2 ) { + bottom = ParseCharIdent(c,&c->a.vals[i],signal_error); + if ( i+1==c->a.argc ) + top = bottom; + else { + top = ParseCharIdent(c,&c->a.vals[i+1],signal_error); + } + if ( bottom==-1 || top==-1 ) /* an error occurred in parsing */ +return( any ? -1 : -2 ); + + if ( topcurfv->selected[j] = true; + ++any; + } + } +return( any ); +} + +static void bSelectMore(Context *c) { + if ( c->a.argc==1 ) + error( c, "SelectMore needs at least one argument"); + bDoSelect(c,true); +} + +static void bSelect(Context *c) { + memset(c->curfv->selected,0,c->curfv->sf->charcnt); + bDoSelect(c,true); +} + +static void bSelectIf(Context *c) { + memset(c->curfv->selected,0,c->curfv->sf->charcnt); + c->return_val.type = v_int; + c->return_val.u.ival = bDoSelect(c,false); +} + +static void bSelectByATT(Context *c) { + unichar_t *tags, *contents; + int type; + + if ( c->a.argc!=5 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || + c->a.vals[2].type!=v_str || c->a.vals[3].type!=v_str || + c->a.vals[4].type!=v_int ) + error(c,"Bad argument type"); + else if ( c->a.vals[4].u.ival<1 || c->a.vals[4].u.ival>3 ) + error(c,"Bad argument value"); + if ( c->a.vals[1].type==v_int ) + type = c->a.vals[1].u.ival; + else { + if ( strmatch(c->a.vals[1].u.sval,"Position")==0 ) + type = pst_position; + else if ( strmatch(c->a.vals[1].u.sval,"Pair")==0 ) + type = pst_pair; + else if ( strmatch(c->a.vals[1].u.sval,"Substitution")==0 ) + type = pst_substitution; + else if ( strmatch(c->a.vals[1].u.sval,"AltSubs")==0 ) + type = pst_alternate; + else if ( strmatch(c->a.vals[1].u.sval,"MultSubs")==0 ) + type = pst_multiple; + else if ( strmatch(c->a.vals[1].u.sval,"Ligature")==0 ) + type = pst_ligature; + else if ( strmatch(c->a.vals[1].u.sval,"LCaret")==0 ) + type = pst_lcaret; + else if ( strmatch(c->a.vals[1].u.sval,"Kern")==0 ) + type = pst_kerning; + else if ( strmatch(c->a.vals[1].u.sval,"VKern")==0 ) + type = pst_vkerning; + else if ( strmatch(c->a.vals[1].u.sval,"Anchor")==0 ) + type = pst_anchors; + } + tags = uc_copy(c->a.vals[2].u.sval); + contents = uc_copy(c->a.vals[3].u.sval); + c->return_val.type = v_int; + c->return_val.u.ival = FVParseSelectByPST(c->curfv,type,tags,contents, + c->a.vals[4].u.ival); + free(tags); + free(contents); +} + +/* **** Element Menu **** */ +#define em_unknown (em_none-3) +static void bReencode(Context *c) { + Encoding *item=NULL; + int i; + enum charset new_map = em_unknown; + FontView *fvs; + int force = 0; + static struct encdata { + int val; + char *name; + } encdata[] = { + { em_compacted, "compacted" }, + { em_custom, "custom" }, + { em_original, "original" }, + { em_iso8859_1, "iso8859-1" }, + { em_iso8859_1, "isolatin1" }, + { em_iso8859_1, "latin1" }, + { em_iso8859_2, "iso8859-2" }, + { em_iso8859_2, "latin2" }, + { em_iso8859_3, "iso8859-3" }, + { em_iso8859_3, "latin3" }, + { em_iso8859_4, "iso8859-4" }, + { em_iso8859_4, "latin4" }, + { em_iso8859_5, "iso8859-5" }, + { em_iso8859_5, "isocyrillic" }, + { em_iso8859_6, "iso8859-6" }, + { em_iso8859_6, "isoarabic" }, + { em_iso8859_7, "iso8859-7" }, + { em_iso8859_7, "isogreek" }, + { em_iso8859_8, "iso8859-8" }, + { em_iso8859_8, "isohebrew" }, + { em_iso8859_9, "iso8859-9" }, + { em_iso8859_9, "latin5" }, + { em_iso8859_10, "iso8859-10" }, + { em_iso8859_10, "latin6" }, + { em_iso8859_11, "isothai" }, + { em_iso8859_13, "iso8859-13" }, + { em_iso8859_13, "latin7" }, + { em_iso8859_14, "iso8859-14" }, + { em_iso8859_14, "latin8" }, + { em_iso8859_15, "iso8859-15" }, + { em_iso8859_15, "latin0" }, + { em_iso8859_15, "latin9" }, + { em_koi8_r, "koi8-r" }, + { em_koi8_r, "koi8r" }, + { em_jis201, "jis201" }, + { em_jis201, "jisx0201" }, + { em_adobestandard, "AdobeStandardEncoding" }, + { em_adobestandard, "Adobe" }, + { em_win, "win" }, + { em_win, "ansi" }, + { em_mac, "mac" }, + { em_symbol, "symbol" }, + { em_base, "TeX" }, + { em_ksc5601, "ksc5601" }, + { em_wansung, "wansung" }, + { em_big5, "big5" }, + { em_big5hkscs, "big5hkscs" }, + { em_johab, "johab" }, + { em_jis208, "jis208" }, + { em_jis208, "jisx0208" }, + { em_sjis, "sjis" }, + { em_jis212, "jis212" }, + { em_jis212, "jisx0212" }, + { em_jisgb, "gb2312packed" }, + { em_gb2312, "gb2312" }, + { em_unicode, "unicode" }, + { em_unicode4, "unicode4" }, + { em_unicode, "iso10646" }, + { em_unicode, "iso10646-1" }, + { em_unicode4, "ucs4" }, + { 0, NULL}}; + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || ( c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type"); + if ( c->a.argc==3 ) + force = c->a.vals[2].u.ival; + for ( i=0; encdata[i].name!=NULL; ++i ) + if ( strmatch(encdata[i].name,c->a.vals[1].u.sval)==0 ) { + new_map = encdata[i].val; + break; + } + if ( new_map == em_unknown ) { + for ( item=enclist; item!=NULL ; item=item->next ) + if ( strmatch(c->a.vals[1].u.sval,item->enc_name )==0 ) { + new_map = item->enc_num; + break; + } + } + if ( new_map==em_unknown && strstart(c->a.vals[1].u.sval,"unicode-plane-")!=NULL ) { + unsigned plane=0; + sscanf( c->a.vals[1].u.sval,"unicode-plane-%x", &plane ); + if ( plane==0 ) new_map = em_unicode; + else new_map = em_unicodeplanes+plane; + } + if ( new_map==em_unknown ) + errors(c,"Unknown encoding", c->a.vals[1].u.sval); + if ( force ) + SFForceEncoding(c->curfv->sf,new_map); + else + SFReencodeFont(c->curfv->sf,new_map); + for ( fvs=c->curfv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + free( fvs->selected ); + fvs->selected = gcalloc(fvs->sf->charcnt,1); + } + if ( screen_display!=NULL ) + FontViewReformatAll(c->curfv->sf); + c->curfv->sf->changed = true; + c->curfv->sf->changed_since_autosave = true; + c->curfv->sf->changed_since_xuidchanged = true; +} + +static void bSetCharCnt(Context *c) { + int oldcnt = c->curfv->sf->charcnt, i; + FontView *fvs; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + else if ( c->a.vals[1].u.ival<=0 && c->a.vals[1].u.ival>10*65536 ) + error(c,"Argument out of bounds"); + + if ( c->curfv->sf->charcnt==c->a.vals[1].u.ival ) +return; + + SFAddDelChars(c->curfv->sf,c->a.vals[1].u.ival); + for ( fvs=c->curfv->sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + fvs->selected = grealloc(fvs->selected,c->a.vals[1].u.ival); + for ( i=oldcnt; ia.vals[1].u.ival; ++i ) + fvs->selected[i] = false; + } + if ( screen_display!=NULL ) + FontViewReformatAll(c->curfv->sf); + c->curfv->sf->changed = true; + c->curfv->sf->changed_since_autosave = true; + c->curfv->sf->changed_since_xuidchanged = true; +} + +static void bLoadEncodingFile(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error(c,"Bad argument type"); + + ParseEncodingFile(c->a.vals[1].u.sval); + DumpPfaEditEncodings(); +} + +static void bSetFontOrder(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + else if ( c->a.vals[1].u.ival!=2 && c->a.vals[1].u.ival!=3 ) + error(c,"Order must be 2 or 3"); + + c->return_val.type = v_int; + c->return_val.u.ival = c->curfv->sf->order2?2:3; + + if ( c->a.vals[1].u.ival==(c->curfv->sf->order2?2:3)) + /* No Op */; + else { + if ( c->a.vals[1].u.ival==2 ) { + SFCloseAllInstrs(c->curfv->sf); + SFConvertToOrder2(c->curfv->sf); + } else + SFConvertToOrder3(c->curfv->sf); + } +} + +static void bSetFontHasVerticalMetrics(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + + c->return_val.type = v_int; + c->return_val.u.ival = c->curfv->sf->hasvmetrics; + + if ( c->curfv->sf->hasvmetrics!=(c->a.vals[1].u.ival!=0) && screen_display!=NULL ) + CVPaletteDeactivate(); + c->curfv->sf->hasvmetrics = (c->a.vals[1].u.ival!=0); +} + +static void _SetFontNames(Context *c,SplineFont *sf) { + int i; + + if ( c->a.argc==1 || c->a.argc>7 ) + error( c, "Wrong number of arguments"); + for ( i=1; ia.argc; ++i ) + if ( c->a.vals[i].type!=v_str ) + error(c,"Bad argument type"); + if ( *c->a.vals[1].u.sval!='\0' ) { + free(sf->fontname); + sf->fontname = copy(c->a.vals[1].u.sval); + } + if ( c->a.argc>2 && *c->a.vals[2].u.sval!='\0' ) { + free(sf->familyname); + sf->familyname = copy(c->a.vals[2].u.sval); + } + if ( c->a.argc>3 && *c->a.vals[3].u.sval!='\0' ) { + free(sf->fullname); + sf->fullname = copy(c->a.vals[3].u.sval); + } + if ( c->a.argc>4 && *c->a.vals[4].u.sval!='\0' ) { + free(sf->weight); + sf->weight = copy(c->a.vals[4].u.sval); + } + if ( c->a.argc>5 && *c->a.vals[5].u.sval!='\0' ) { + free(sf->copyright); + sf->copyright = copy(c->a.vals[5].u.sval); + } + if ( c->a.argc>6 && *c->a.vals[6].u.sval!='\0' ) { + free(sf->version); + sf->version = copy(c->a.vals[6].u.sval); + } +} + +static void bSetFontNames(Context *c) { + SplineFont *sf = c->curfv->sf; + _SetFontNames(c,sf); +} + +static void bSetTTFName(Context *c) { + SplineFont *sf = c->curfv->sf; + unichar_t *u; + int lang, strid; + struct ttflangname *prev, *ln; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( c->a.argc!=4 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int || + c->a.vals[3].type!=v_str ) + error(c,"Bad argument type"); + + lang = c->a.vals[1].u.ival; + strid = c->a.vals[2].u.ival; + if ( lang<0 || lang>0xffff ) + error(c,"Bad value for language"); + else if ( strid<0 || strid>=ttf_namemax ) + error(c,"Bad value for string id"); + + u = utf82u_copy(c->a.vals[3].u.sval); + if ( *u=='\0' ) { + free(u); + u = NULL; + } + + for ( ln = sf->names; ln!=NULL && ln->lang!=lang; ln = ln->next ); + if ( ln==NULL ) { + if ( u==NULL ) +return; + for ( prev = NULL, ln = sf->names; ln!=NULL && ln->langnext ); + ln = gcalloc(1,sizeof(struct ttflangname)); + ln->lang = lang; + if ( prev==NULL ) { ln->next = sf->names; sf->names = ln; } + else { ln->next = prev->next; prev->next = ln; } + } + free(ln->names[strid]); + ln->names[strid] = u; +} + +static void bGetTTFName(Context *c) { + SplineFont *sf = c->curfv->sf; + int lang, strid; + struct ttflangname *ln; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int ) + error(c,"Bad argument type"); + + lang = c->a.vals[1].u.ival; + strid = c->a.vals[2].u.ival; + if ( lang<0 || lang>0xffff ) + error(c,"Bad value for language"); + else if ( strid<0 || strid>=ttf_namemax ) + error(c,"Bad value for string id"); + + c->return_val.type = v_str; + + for ( ln = sf->names; ln!=NULL && ln->lang!=lang; ln = ln->next ); + if ( ln==NULL || ln->names[strid]==NULL ) + c->return_val.u.sval = copy(""); + else + c->return_val.u.sval = u2utf8_copy(ln->names[strid]); +} + +static void bSetItalicAngle(Context *c) { + int denom=1; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.argc==3 ) { + if ( c->a.vals[2].type!=v_int ) + error(c,"Bad argument type"); + denom=c->a.vals[2].u.ival; + } + if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + c->curfv->sf->italicangle = c->a.vals[1].u.ival/ (double) denom; +} + +static void bSetMacStyle(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type==v_int ) + c->curfv->sf->macstyle = c->a.vals[1].u.ival; + else if ( c->a.vals[1].type==v_str ) + c->curfv->sf->macstyle = _MacStyleCode(c->a.vals[1].u.sval,NULL,NULL); + else + error(c,"Bad argument type"); +} + +static void bSetPanose(Context *c) { + int i; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.argc==2 ) { + if ( c->a.vals[1].type!=v_arr || c->a.vals[1].type!=v_arrfree ) + error(c,"Bad argument type"); + if ( c->a.vals[1].u.aval->argc!=10 ) + error(c,"Wrong size of array"); + if ( c->a.vals[1].u.aval->vals[0].type!=v_int ) + error(c,"Bad argument sub-type"); + SFDefaultOS2Info(&c->curfv->sf->pfminfo,c->curfv->sf,c->curfv->sf->fontname); + for ( i=0; i<10; ++i ) { + if ( c->a.vals[1].u.aval->vals[i].type!=v_int ) + error(c,"Bad argument sub-type"); + c->curfv->sf->pfminfo.panose[i] = c->a.vals[1].u.aval->vals[i].u.ival; + } + } else if ( c->a.argc==3 ) { + if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int) + error(c,"Bad argument type"); + if ( c->a.vals[1].u.ival<0 || c->a.vals[1].u.ival>=10 ) + error(c,"Bad argument value must be between [0,9]"); + SFDefaultOS2Info(&c->curfv->sf->pfminfo,c->curfv->sf,c->curfv->sf->fontname); + c->curfv->sf->pfminfo.panose[c->a.vals[1].u.ival] = c->a.vals[2].u.ival; + } + c->curfv->sf->pfminfo.pfmset = true; + c->curfv->sf->changed = true; +} + +static void bSetUniqueID(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + c->curfv->sf->uniqueid = c->a.vals[1].u.ival; +} + +static void bSetTeXParams(Context *c) { + int i; + + for ( i=1; ia.argc; ++i ) + if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + switch ( c->a.vals[1].u.ival ) { + case 1: + if ( c->a.argc!=10 ) + error( c, "Wrong number of arguments"); + break; + case 2: + if ( c->a.argc!=25 ) + error( c, "Wrong number of arguments"); + break; + case 3: + if ( c->a.argc!=16 ) + error( c, "Wrong number of arguments"); + break; + default: + error(c, "Bad value for first argument, must be 1,2 or 3"); + break; + } + c->curfv->sf->texdata.type = c->a.vals[1].u.ival; + c->curfv->sf->texdata.designsize = c->a.vals[2].u.ival<<20; + /* slant is a percentage */ + c->curfv->sf->texdata.params[0] = ((double) c->a.vals[3].u.ival)*(1<<20)/100.0; + for ( i=1; ia.argc-3; ++i ) + c->curfv->sf->texdata.params[i] = ((double) c->a.vals[3+i].u.ival)*(1<<20)/ + (c->curfv->sf->ascent+c->curfv->sf->descent); +} + +static SplineChar *GetOneSelChar(Context *c) { + SplineFont *sf = c->curfv->sf; + int i, found = -1; + + for ( i=0; icharcnt; ++i ) if ( c->curfv->selected[i] ) { + if ( found==-1 ) + found = i; + else + error(c,"More than one character selected" ); + } + if ( found==-1 ) + error(c,"No characters selected" ); +return( SFMakeChar(sf,found)); +} + +static void bSetCharName(Context *c) { + SplineChar *sc; + char *name, *end; + int uni; + unichar_t *comment; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type"); + sc = GetOneSelChar(c); + uni = sc->unicodeenc; + name = c->a.vals[1].u.sval; + comment = u_copy(sc->comment); + + if ( c->a.argc!=3 || c->a.vals[2].u.ival==-1 ) { + if ( name[0]=='u' && name[1]=='n' && name[2]=='i' && strlen(name)==7 && + (uni = strtol(name+3,&end,16), *end=='\0')) + /* Good */; + else if ( name[0]=='u' && strlen(name)<=7 && + (uni = strtol(name+1,&end,16), *end=='\0')) + /* Good */; + else { + for ( uni=psunicodenames_cnt-1; uni>=0; --uni ) + if ( psunicodenames[uni]!=NULL && strcmp(name,psunicodenames[uni])==0 ) + break; + } + } + SCSetMetaData(sc,name,uni,comment); + SCLigDefault(sc); +} + +static void bSetUnicodeValue(Context *c) { + SplineChar *sc; + char *name; + int uni; + unichar_t *comment; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( (c->a.vals[1].type!=v_int && c->a.vals[1].type!=v_unicode) || + (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type"); + sc = GetOneSelChar(c); + uni = c->a.vals[1].u.ival; + name = copy(sc->name); + comment = u_copy(sc->comment); + + if ( c->a.argc!=3 || c->a.vals[2].u.ival ) { + free(name); + if ( uni>=0 && uni=32 && uni<0x7f ) || uni>=0xa1 ) { + char buf[12]; + if ( uni<0x10000 ) + sprintf( buf,"uni%04X", uni ); + else + sprintf( buf,"u%04X", uni ); + name = copy(buf); + } else + name = copy(".notdef"); + } + SCSetMetaData(sc,name,uni,comment); + SCLigDefault(sc); +} + +static void bSetCharColor(Context *c) { + SplineFont *sf = c->curfv->sf; + SplineChar *sc; + int i; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + for ( i=0; icharcnt; ++i ) if ( c->curfv->selected[i] ) { + sc = SFMakeChar(sf,i); + sc->color = c->a.vals[1].u.ival; + } + c->curfv->sf->changed = true; +} + +static void bSetCharComment(Context *c) { + SplineChar *sc; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error(c,"Bad argument type"); + sc = GetOneSelChar(c); + sc->comment = *c->a.vals[1].u.sval=='\0'?NULL:def2u_copy(c->a.vals[1].u.sval); + c->curfv->sf->changed = true; +} + +static void bApplySubstitution(Context *c) { + uint32 tags[3]; + int i; + + if ( c->a.argc!=4 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || + c->a.vals[3].type!=v_str ) + error(c,"Bad argument type"); + for ( i=0; i<3; ++i ) { + char *str = c->a.vals[i+1].u.sval; + char temp[4]; + memset(temp,' ',4); + if ( *str ) { + temp[0] = *str; + if ( str[1] ) { + temp[1] = str[1]; + if ( str[2] ) { + temp[2] = str[2]; + if ( str[3] ) { + temp[3] = str[3]; + if ( str[4] ) + error(c,"Tags/Scripts/Languages are represented by strings which are at most 4 characters long"); + } + } + } + } + tags[i] = (temp[0]<<24)|(temp[1]<<16)|(temp[2]<<8)|temp[3]; + } + FVApplySubstitution(c->curfv, tags[0], tags[1], tags[2]); +} + +static void bTransform(Context *c) { + real trans[6]; + BVTFunc bvts[1]; + + if ( c->a.argc!=7 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int || + c->a.vals[3].type!=v_int || c->a.vals[4].type!=v_int || + c->a.vals[5].type!=v_int || c->a.vals[6].type!=v_int ) + error(c,"Bad argument type in Transform"); + trans[0] = c->a.vals[1].u.ival/100.; + trans[1] = c->a.vals[2].u.ival/100.; + trans[2] = c->a.vals[3].u.ival/100.; + trans[3] = c->a.vals[4].u.ival/100.; + trans[4] = c->a.vals[5].u.ival/100.; + trans[5] = c->a.vals[6].u.ival/100.; + bvts[0].func = bvt_none; + FVTransFunc(c->curfv,trans,0,bvts,true); +} + +static void bHFlip(Context *c) { + real trans[6]; + int otype = 1; + BVTFunc bvts[2]; + + trans[0] = -1; trans[3] = 1; + trans[1] = trans[2] = trans[4] = trans[5] = 0; + if ( c->a.argc==1 ) + /* default to center of char for origin */; + else if ( c->a.argc==2 || c->a.argc==3 ) { + if ( c->a.vals[1].type!=v_int || ( c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type in HFlip"); + trans[4] = 2*c->a.vals[1].u.ival; + otype = 0; + } else + error( c, "Wrong number of arguments"); + bvts[0].func = bvt_fliph; + bvts[1].func = bvt_none; + FVTransFunc(c->curfv,trans,otype,bvts,true); +} + +static void bVFlip(Context *c) { + real trans[6]; + int otype = 1; + BVTFunc bvts[2]; + + trans[0] = 1; trans[3] = -1; + trans[1] = trans[2] = trans[4] = trans[5] = 0; + if ( c->a.argc==1 ) + /* default to center of char for origin */; + else if ( c->a.argc==2 || c->a.argc==3 ) { + if ( c->a.vals[1].type!=v_int || ( c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type in VFlip"); + if ( c->a.argc==2 ) + trans[5] = 2*c->a.vals[1].u.ival; + else + trans[5] = 2*c->a.vals[2].u.ival; + otype = 0; + } else + error( c, "Wrong number of arguments"); + bvts[0].func = bvt_flipv; + bvts[1].func = bvt_none; + FVTransFunc(c->curfv,trans,otype,bvts,true); +} + +static void bRotate(Context *c) { + real trans[6]; + int otype = 1; + BVTFunc bvts[2]; + double a; + + if ( c->a.argc==1 || c->a.argc==3 || c->a.argc>4 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || (c->a.argc==4 && + (c->a.vals[2].type!=v_int || c->a.vals[3].type!=v_int ))) + error(c,"Bad argument type in Rotate"); + if ( (c->a.vals[1].u.ival %= 360)<0 ) c->a.vals[1].u.ival += 360; + a = c->a.vals[1].u.ival *3.1415926535897932/180.; + trans[0] = trans[3] = cos(a); + trans[2] = -(trans[1] = sin(a)); + trans[4] = trans[5] = 0; + if ( c->a.argc==4 ) { + trans[4] = c->a.vals[2].u.ival-(trans[0]*c->a.vals[2].u.ival+trans[2]*c->a.vals[3].u.ival); + trans[5] = c->a.vals[3].u.ival-(trans[1]*c->a.vals[2].u.ival+trans[3]*c->a.vals[3].u.ival); + otype = 0; + } + bvts[0].func = bvt_none; + if ( c->a.vals[1].u.ival==90 ) + bvts[0].func = bvt_rotate90ccw; + else if ( c->a.vals[1].u.ival==180 ) + bvts[0].func = bvt_rotate180; + else if ( c->a.vals[1].u.ival==270 ) + bvts[0].func = bvt_rotate90cw; + bvts[1].func = bvt_none; + FVTransFunc(c->curfv,trans,otype,bvts,true); +} + +static void bScale(Context *c) { + real trans[6]; + int otype = 1; + BVTFunc bvts[2]; + double xfact, yfact; + int i; + /* Arguments: + 1 => same scale factor both directions, origin at center + 2 => different scale factors for each direction, origin at center + (scale factors are per cents) + 3 => same scale factor both directions, origin last two args + 4 => different scale factors for each direction, origin last two args + */ + + if ( c->a.argc==1 || c->a.argc>5 ) + error( c, "Wrong number of arguments"); + for ( i=1; ia.argc; ++i ) + if ( c->a.vals[i].type!=v_int ) + error(c,"Bad argument type in Scale"); + i = 1; + if ( c->a.argc&1 ) { + xfact = c->a.vals[1].u.ival/100.; + yfact = c->a.vals[2].u.ival/100.; + i = 3; + } else { + xfact = yfact = c->a.vals[1].u.ival/100.; + i = 2; + } + trans[0] = xfact; trans[3] = yfact; + trans[2] = trans[1] = 0; + trans[4] = trans[5] = 0; + if ( c->a.argc>i ) { + trans[4] = c->a.vals[i].u.ival-(trans[0]*c->a.vals[i].u.ival); + trans[5] = c->a.vals[i+1].u.ival-(trans[3]*c->a.vals[i+1].u.ival); + otype = 0; + } + bvts[0].func = bvt_none; + FVTransFunc(c->curfv,trans,otype,bvts,true); +} + +static void bSkew(Context *c) { + real trans[6]; + int otype = 1; + BVTFunc bvts[2]; + double a; + + if ( c->a.argc==1 || c->a.argc==3 || c->a.argc>4 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || (c->a.argc==4 && + (c->a.vals[2].type!=v_int || c->a.vals[3].type!=v_int ))) + error(c,"Bad argument type in Skew"); + if ( (c->a.vals[1].u.ival %= 360)<0 ) c->a.vals[1].u.ival += 360; + a = c->a.vals[1].u.ival *3.1415926535897932/180.; + trans[0] = trans[3] = 1; + trans[1] = 0; trans[2] = tan(a); + trans[4] = trans[5] = 0; + if ( c->a.argc==4 ) { + trans[4] = c->a.vals[2].u.ival-(trans[0]*c->a.vals[2].u.ival+trans[2]*c->a.vals[3].u.ival); + trans[5] = c->a.vals[3].u.ival-(trans[1]*c->a.vals[2].u.ival+trans[3]*c->a.vals[3].u.ival); + otype = 0; + } + skewselect(&bvts[0],trans[2]); + bvts[1].func = bvt_none; + FVTransFunc(c->curfv,trans,otype,bvts,true); +} + +static void bMove(Context *c) { + real trans[6]; + int otype = 1; + BVTFunc bvts[2]; + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int ) + error(c,"Bad argument type"); + trans[0] = trans[3] = 1; + trans[1] = trans[2] = 0; + trans[4] = c->a.vals[1].u.ival; trans[5] = c->a.vals[2].u.ival; + bvts[0].func = bvt_transmove; + bvts[0].x = trans[4]; bvts[0].y = trans[5]; + bvts[1].func = bvt_none; + FVTransFunc(c->curfv,trans,otype,bvts,true); +} + +static void bScaleToEm(Context *c) { + int i; + int ascent, descent; + + if ( c->a.argc!=3 && c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + for ( i=1; ia.argc; ++i ) + if ( c->a.vals[i].type!=v_int || c->a.vals[i].u.ival<0 || c->a.vals[i].u.ival>16384 ) + error(c,"Bad argument type"); + if ( c->a.argc==3 ) { + ascent = c->a.vals[1].u.ival; + descent = c->a.vals[2].u.ival; + } else { + ascent = rint(c->a.vals[1].u.ival* ((double) c->curfv->sf->ascent)/ + (c->curfv->sf->ascent+c->curfv->sf->descent)); + descent = c->a.vals[1].u.ival-ascent; + } + SFScaleToEm(c->curfv->sf,c->a.vals[1].u.ival,c->a.vals[2].u.ival); +} + +static void bNonLinearTransform(Context *c) { +#ifdef FONTFORGE_CONFIG_NONLINEAR + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str ) + error(c,"Bad argument type"); + if ( c->curfv->sf->order2 ) + error(c,"Can only be applied to cubic (PostScript) fonts"); + if ( !SFNLTrans(c->curfv,c->a.vals[1].u.sval,c->a.vals[2].u.sval)) + error(c,"Bad expression"); +#else + error(c,"The NonLinearTransform command is not enabled. Edit configure-pfaedit.h and define FONTFORGE_CONFIG_NONLINEAR and recompile everything" ); +#endif +} + +static void bExpandStroke(Context *c) { + StrokeInfo si; + /* Arguments: + 2 => stroke width (implied butt, round) + 4 => stroke width, line cap, line join + 5 => stroke width, caligraphic angle, thickness-numerator, thickness-denom + 6 => stroke width, line cap, line join, 0, kanou's flags + */ + + if ( c->a.argc!=2 && c->a.argc!=4 && c->a.argc!=5 && c->a.argc!=6 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || + (c->a.argc>=4 && c->a.vals[2].type!=v_int ) || + (c->a.argc>=4 && c->a.vals[3].type!=v_int ) || + (c->a.argc>=5 && c->a.vals[4].type!=v_int ) || + (c->a.argc>=6 && c->a.vals[5].type!=v_int )) + error(c,"Bad argument type"); + memset(&si,0,sizeof(si)); + si.radius = c->a.vals[1].u.ival/2.; + si.stroke_type = si_std; + if ( c->a.argc==2 ) { + si.join = lj_round; + si.cap = lc_butt; + } else if ( c->a.argc==4 ) { + si.cap = c->a.vals[2].u.ival; + si.join = c->a.vals[3].u.ival; + } else if ( c->a.argc==6 ) { + si.cap = c->a.vals[2].u.ival; + si.join = c->a.vals[3].u.ival; + if ( c->a.vals[4].u.ival!=0 ) + error(c,"If 5 arguments are given, the fourth must be zero"); + if ( c->a.vals[5].u.ival&1 ) + si.removeinternal = true; + else if ( c->a.vals[5].u.ival&2 ) + si.removeexternal = true; + if ( c->a.vals[5].u.ival&4 ) + si.removeoverlapifneeded = true; + } else { + si.stroke_type = si_caligraphic; + si.penangle = 3.1415926535897932*c->a.vals[2].u.ival/180; + si.ratio = c->a.vals[3].u.ival / (double) c->a.vals[4].u.ival; + } + FVStrokeItScript(c->curfv, &si); +} + +static void bOutline(Context *c) { + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + FVOutline(c->curfv,c->a.vals[1].u.ival); +} + +static void bInline(Context *c) { + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int ) + error(c,"Bad argument type"); + FVInline(c->curfv,c->a.vals[1].u.ival,c->a.vals[2].u.ival); +} + +static void bShadow(Context *c) { + /* Angle, outline width, shadow_len */ + + if ( c->a.argc!=4 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int || + c->a.vals[2].type!=v_int ) + error(c,"Bad argument type"); + FVShadow(c->curfv,c->a.vals[1].u.ival*3.1415926535897932/360., + c->a.vals[2].u.ival, c->a.vals[3].u.ival,false); +} + +static void bWireframe(Context *c) { + /* Angle, outline width, shadow_len */ + + if ( c->a.argc!=4 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int || + c->a.vals[2].type!=v_int ) + error(c,"Bad argument type"); + FVShadow(c->curfv,c->a.vals[1].u.ival*3.1415926535897932/360., + c->a.vals[2].u.ival, c->a.vals[3].u.ival,true); +} + +static void bRemoveOverlap(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,100); +} + +static void bOverlapIntersect(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,104); +} + +static void bFindIntersections(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,105); +} + +static void bSimplify(Context *c) { + static struct simplifyinfo smpl = { sf_normal,.75,.2,10 }; + smpl.err = (c->curfv->sf->ascent+c->curfv->sf->descent)/1000.; + smpl.linefixup = (c->curfv->sf->ascent+c->curfv->sf->descent)/500.; + + if ( c->a.argc>=3 && c->a.argc<=5 ) { + if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int ) + error( c, "Bad type for argument" ); + smpl.flags = c->a.vals[1].u.ival; + smpl.err = c->a.vals[2].u.ival; + if ( c->a.argc>=4 ) { + if ( c->a.vals[3].type!=v_int ) + error( c, "Bad type for argument" ); + smpl.tan_bounds = c->a.vals[3].u.ival/100.0; + if ( c->a.argc>=5 ) { + if ( c->a.vals[4].type!=v_int ) + error( c, "Bad type for argument" ); + smpl.linefixup = c->a.vals[4].u.ival; + } + } + } else if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + _FVSimplify(c->curfv,&smpl); +} + +static void bAddExtrema(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,102); +} + +static void bRoundToInt(Context *c) { + + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,103); +} + +static void bAutotrace(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVAutoTrace(c->curfv,false); +} + +static void bCorrectDirection(Context *c) { + int i; + SplineFont *sf = c->curfv->sf; + int changed, refchanged; + int checkrefs = true; + RefChar *ref; + SplineChar *sc; + + if ( c->a.argc!=1 && c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.argc==2 && c->a.vals[1].type!=v_int ) + error(c,"Bad argument type"); + else + checkrefs = c->a.vals[1].u.ival; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && c->curfv->selected[i] ) { + sc = sf->chars[i]; + changed = refchanged = false; + if ( checkrefs ) { + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]*ref->transform[3]<0 || + (ref->transform[0]==0 && ref->transform[1]*ref->transform[2]>0)) { + if ( !refchanged ) { + refchanged = true; + SCPreserveState(sc,false); + } + SCRefToSplines(sc,ref); + } + } + } + if ( !refchanged ) + SCPreserveState(sc,false); + sc->layers[ly_fore].splines = SplineSetsCorrect(sc->layers[ly_fore].splines,&changed); + if ( changed || refchanged ) + SCCharChangedUpdate(sc); + } +} + +static void bBuildComposit(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVBuildAccent(c->curfv,false); +} + +static void bBuildAccented(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVBuildAccent(c->curfv,true); +} + +static void bMergeFonts(Context *c) { + SplineFont *sf; + int openflags=0; + + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "MergeFonts expects a filename" ); + else if ( c->a.argc==3 ) { + if ( c->a.vals[2].type!=v_int ) + error( c, "MergeFonts expects an integer for second argument" ); + openflags = c->a.vals[2].u.ival; + } + sf = LoadSplineFont(c->a.vals[1].u.sval,openflags); + if ( sf==NULL ) + errors(c,"Can't find font", c->a.vals[1].u.sval); + MergeFont(c->curfv,sf); +} + +static void bAutoHint(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,200); +} + +static void bSubstitutionPoints(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,203); +} + +static void bAutoCounter(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,204); +} + +static void bDontAutoHint(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,205); +} + +static void bAutoInstr(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,202); +} + +static void bClearHints(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVFakeMenus(c->curfv,201); +} + +static void _AddHint(Context *c,int ish) { + int i, any; + int start, width; + SplineFont *sf = c->curfv->sf; + StemInfo *h; + + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int ) + error( c, "Bad argument type" ); + start = c->a.vals[1].u.ival; + width = c->a.vals[2].u.ival; + if ( width<=0 && width!=-20 && width!=-21 ) + error( c, "Bad hint width" ); + any = false; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && c->curfv->selected[i] ) { + SplineChar *sc = sf->chars[i]; + + h = chunkalloc(sizeof(StemInfo)); + h->start = start; + h->width = width; + if ( ish ) { + SCGuessHHintInstancesAndAdd(sc,h,0x80000000,0x80000000); + sc->hconflicts = StemListAnyConflicts(sc->hstem); + } else { + SCGuessVHintInstancesAndAdd(sc,h,0x80000000,0x80000000); + sc->vconflicts = StemListAnyConflicts(sc->vstem); + } + sc->manualhints = true; + SCClearHintMasks(sc,true); + SCOutOfDateBackground(sc); + SCUpdateAll(sc); + any = true; + } + if ( !any ) + fprintf(stderr, "Warning: No characters selected in AddHint(%d,%d,%d)\n", + ish, start, width); +} + +static void bAddHHint(Context *c) { + _AddHint(c,true); +} + +static void bAddVHint(Context *c) { + _AddHint(c,false); +} + +static void bClearCharCounterMasks(Context *c) { + SplineChar *sc; + + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + sc = GetOneSelChar(c); + free(sc->countermasks); + sc->countermasks = NULL; + sc->countermask_cnt = 0; +} + +static void bSetCharCounterMask(Context *c) { + SplineChar *sc; + int i; + HintMask *cm; + + if ( c->a.argc<3 ) + error( c, "Wrong number of arguments"); + for ( i=1; ia.argc; ++i ) + if ( c->a.vals[i].type!=v_int ) + error( c, "Bad argument type" ); + else if ( c->a.vals[i].u.ival<0 || c->a.vals[i].u.ival>=HntMax ) + error( c, "Bad argument value (must be between [0,96) )" ); + sc = GetOneSelChar(c); + if ( c->a.vals[1].u.ival>=sc->countermask_cnt ) { + if ( sc->countermask_cnt==0 ) { + sc->countermasks = gcalloc(c->a.vals[1].u.ival+10,sizeof(HintMask)); + sc->countermask_cnt = c->a.vals[1].u.ival+1; + } else { + sc->countermasks = grealloc(sc->countermasks, + (c->a.vals[1].u.ival+1)*sizeof(HintMask)); + memset(sc->countermasks+sc->countermask_cnt,0, + (c->a.vals[1].u.ival+1-sc->countermask_cnt)*sizeof(HintMask)); + sc->countermask_cnt = c->a.vals[1].u.ival+1; + } + } + cm = &sc->countermasks[c->a.vals[1].u.ival]; + memset(cm,0,sizeof(HintMask)); + for ( i=2; ia.argc; ++i ) + (*cm)[c->a.vals[i].u.ival>>3] |= (0x80>>(c->a.vals[i].u.ival&7)); +} + +static void bReplaceCharCounterMasks(Context *c) { + HintMask *cm; + SplineChar *sc; + int i,j,cnt; + Array *arr; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_arr ) + error( c, "Bad argument type" ); + arr = c->a.vals[1].u.aval; + cnt = arr->argc; + cm = gcalloc(cnt,sizeof(HintMask)); + for ( i=0; ivals[i].type!=v_arr || arr->vals[i].u.aval->argc>12 ) + error( c, "Argument must be array of array[12] of integers" ); + for ( j=0; jvals[i].u.aval->argc; ++j ) { + if ( arr->vals[i].u.aval->vals[j].type!=v_int ) + error( c, "Argument must be array of array[12] of integers" ); + cm[i][j] = arr->vals[i].u.aval->vals[j].u.ival&0xff; + } + } + + sc = GetOneSelChar(c); + free(sc->countermasks); + sc->countermask_cnt = cnt; + sc->countermasks = cm; +} + +static void bClearPrivateEntry(Context *c) { + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad argument type" ); + if ( c->curfv->sf->private!=NULL ) + PSDictRemoveEntry( c->curfv->sf->private,c->a.vals[1].u.sval); +} + +static void bChangePrivateEntry(Context *c) { + SplineFont *sf = c->curfv->sf; + if ( c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str ) + error( c, "Bad argument type" ); + if ( sf->private==NULL ) { + sf->private = gcalloc(1,sizeof(struct psdict)); + sf->private->cnt = 10; + sf->private->keys = gcalloc(10,sizeof(char *)); + sf->private->values = gcalloc(10,sizeof(char *)); + } + PSDictChangeEntry(sf->private,c->a.vals[1].u.sval,c->a.vals[2].u.sval); +} + +static void bGetPrivateEntry(Context *c) { + int i; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad argument type" ); + c->return_val.type = v_str; + if ( c->curfv->sf->private==NULL || + (i = PSDictFindEntry(c->curfv->sf->private,c->a.vals[1].u.sval))==-1 ) + c->return_val.u.sval = copy(""); + else + c->return_val.u.sval = copy(c->curfv->sf->private->values[i]); +} + +static void bSetWidth(Context *c) { + int incr = 0; + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type in SetWidth"); + if ( c->a.argc==3 ) + incr = c->a.vals[2].u.ival; + FVSetWidthScript(c->curfv,wt_width,c->a.vals[1].u.ival,incr); +} + +static void bSetVWidth(Context *c) { + int incr = 0; + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type in SetVWidth"); + if ( c->a.argc==3 ) + incr = c->a.vals[2].u.ival; + FVSetWidthScript(c->curfv,wt_vwidth,c->a.vals[1].u.ival,incr); +} + +static void bSetLBearing(Context *c) { + int incr = 0; + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type in SetLBearing"); + if ( c->a.argc==3 ) + incr = c->a.vals[2].u.ival; + FVSetWidthScript(c->curfv,wt_lbearing,c->a.vals[1].u.ival,incr); +} + +static void bSetRBearing(Context *c) { + int incr = 0; + if ( c->a.argc!=2 && c->a.argc!=3 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || (c->a.argc==3 && c->a.vals[2].type!=v_int )) + error(c,"Bad argument type in SetRBearing"); + if ( c->a.argc==3 ) + incr = c->a.vals[2].u.ival; + FVSetWidthScript(c->curfv,wt_rbearing,c->a.vals[1].u.ival,incr); +} + +static void bAutoWidth(Context *c) { + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc != 2 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int ) + error(c,"Bad argument type in AutoWidth"); + if ( !AutoWidthScript(sf,c->a.vals[1].u.ival)) + error(c,"No characters selected."); +} + +static void bAutoKern(Context *c) { + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc != 3 && c->a.argc != 4 ) + error( c, "Wrong number of arguments"); + if ( c->a.vals[1].type!=v_int || c->a.vals[2].type!=v_int || + (c->a.argc==4 && c->a.vals[3].type!=v_str)) + error(c,"Bad argument type"); + if ( !AutoKernScript(sf,c->a.vals[1].u.ival,c->a.vals[2].u.ival, + c->a.argc==4?c->a.vals[3].u.sval:NULL) ) + error(c,"No characters selected."); +} + +static void bCenterInWidth(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + FVMetricsCenter(c->curfv,true); +} + +static void _SetKern(Context *c,int isv) { + SplineFont *sf = c->curfv->sf; + SplineChar *sc1, *sc2; + int i, kern, ch2, sli; + KernPair *kp; + + if ( c->a.argc!=3 && c->a.argc!=4 ) + error( c, "Wrong number of arguments" ); + ch2 = ParseCharIdent(c,&c->a.vals[1],true); + if ( c->a.vals[2].type!=v_int ) + error(c,"Bad argument type"); + sli = -1; + if ( c->a.argc==4 ) { + if ( c->a.vals[3].type!=v_int ) + error(c,"Bad argument type"); + else + sli = c->a.vals[3].u.ival; + } + kern = c->a.vals[2].u.ival; + if ( kern!=0 ) + sc2 = SFMakeChar(sf,ch2); + else { + sc2 = sf->chars[ch2]; + if ( sc2==NULL ) +return; /* It already has a kern==0 with everything */ + } + + for ( i=0; icharcnt; ++i ) if ( c->curfv->selected[i] ) { + if ( kern!=0 ) + sc1 = SFMakeChar(sf,i); + else { + if ( (sc1 = sf->chars[i])==NULL ) + continue; + } + for ( kp = isv ? sc1->vkerns : sc1->kerns; kp!=NULL && kp->sc!=sc2; kp = kp->next ); + if ( kp==NULL && kern==0 ) + continue; + if ( !isv ) + MMKern(sc1->parent,sc1,sc2,kp==NULL?kern:kern-kp->off, + sli,kp); + if ( kp!=NULL ) { + kp->off = kern; + if ( sli!=-1 ) + kp->sli = sli; + } else { + kp = chunkalloc(sizeof(KernPair)); + if ( isv ) { + kp->next = sc1->vkerns; + sc1->vkerns = kp; + } else { + kp->next = sc1->kerns; + sc1->kerns = kp; + } + kp->sc = sc2; + kp->off = kern; + if ( sli!=-1 ) + kp->sli = sli; + else + kp->sli = SFAddScriptLangIndex(sc1->parent, + SCScriptFromUnicode(sc1),DEFAULT_LANG); + } + } +} + +static void bSetKern(Context *c) { + _SetKern(c,false); +} + +static void bSetVKern(Context *c) { + _SetKern(c,true); +} + +static void bClearAllKerns(Context *c) { + + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments" ); + FVRemoveKerns(c->curfv); +} + +static void bClearAllVKerns(Context *c) { + + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments" ); + FVRemoveVKerns(c->curfv); +} + +static void bVKernFromHKern(Context *c) { + + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments" ); + FVVKernFromHKern(c->curfv); +} + +/* **** MM menu **** */ + +static void bMMInstanceNames(Context *c) { + int i; + MMSet *mm = c->curfv->sf->mm; + + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + else if ( mm==NULL ) + error( c, "Not a multiple master font" ); + + c->return_val.type = v_arr; + c->return_val.u.aval = galloc(sizeof(Array)); + c->return_val.u.aval->argc = mm->instance_count; + c->return_val.u.aval->vals = galloc(mm->instance_count*sizeof(Val)); + for ( i=0; iinstance_count; ++i ) { + c->return_val.u.aval->vals[i].type = v_str; + c->return_val.u.aval->vals[i].u.sval = copy(mm->instances[i]->fontname); + } +} + +static void bMMWeightedName(Context *c) { + MMSet *mm = c->curfv->sf->mm; + + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + else if ( mm==NULL ) + error( c, "Not a multiple master font" ); + + c->return_val.type = v_str; + c->return_val.u.sval = copy(mm->normal->fontname); +} + +static void bMMChangeInstance(Context *c) { + int i; + MMSet *mm = c->curfv->sf->mm; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( mm==NULL ) + error( c, "Not a multiple master font" ); + else if ( c->a.vals[1].type==v_int ) { + if ( c->a.vals[1].u.ival==-1 ) + c->curfv->sf = mm->normal; + else if ( c->a.vals[1].u.ivalinstance_count ) + c->curfv->sf = mm->instances[ c->a.vals[1].u.ival ]; + else + error( c, "Mutilple Master instance index out of bounds" ); + } else if ( c->a.vals[1].type==v_str ) { + if ( strcmp( mm->normal->fontname,c->a.vals[1].u.sval )==0 ) + c->curfv->sf = mm->normal; + else { + for ( i=0; iinstance_count; ++i ) + if ( strcmp( mm->instances[i]->fontname,c->a.vals[1].u.sval )==0 ) { + c->curfv->sf = mm->instances[i]; + break; + } + if ( i==mm->instance_count ) + errors( c, "No instance named", c->a.vals[1].u.sval ); + } + } else + error( c, "Bad argument" ); +} + +/* **** CID menu **** */ + +static void bConvertToCID(Context *c) { + SplineFont *sf = c->curfv->sf; + struct cidmap *map; + + if ( c->a.argc!=4 ) + error( c, "Wrong number of arguments" ); + if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || c->a.vals[3].type!=v_int ) + error( c, "Bad argument type" ); + if ( sf->cidmaster!=NULL ) + errors( c, "Already a cid-keyed font", sf->cidmaster->fontname ); + map = FindCidMap( c->a.vals[1].u.sval, c->a.vals[2].u.sval, c->a.vals[3].u.ival, sf); + if ( map == NULL ) + error( c, "No cidmap matching given ROS" ); + MakeCIDMaster(sf, false, NULL, map); +} + +static void bConvertByCMap(Context *c) { + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + if ( c->a.vals[0].type!=v_str ) + error( c, "Bad argument type" ); + if ( sf->cidmaster!=NULL ) + errors( c, "Already a cid-keyed font", sf->cidmaster->fontname ); + MakeCIDMaster(sf, true, c->a.vals[1].u.sval, NULL); +} + +static void bCIDChangeSubFont(Context *c) { + SplineFont *sf = c->curfv->sf, *new; + int i; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments" ); + if ( c->a.vals[1].type!=v_str ) + error( c, "Bad argument type" ); + if ( sf->cidmaster==NULL ) + errors( c, "Not a cid-keyed font", sf->fontname ); + for ( i=0; icidmaster->subfontcnt; ++i ) + if ( strcmp(sf->cidmaster->subfonts[i]->fontname,c->a.vals[1].u.sval)==0 ) + break; + if ( i==sf->cidmaster->subfontcnt ) + errors( c, "Not in the current cid font", c->a.vals[1].u.sval ); + new = sf->cidmaster->subfonts[i]; + + if ( screen_display!=NULL ) { + MetricsView *mv, *mvnext; + for ( mv=c->curfv->metrics; mv!=NULL; mv = mvnext ) { + /* Don't bother trying to fix up metrics views, just not worth it */ + mvnext = mv->next; + GDrawDestroyWindow(mv->gw); + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } + if ( sf->charcnt!=new->charcnt ) { + FontView *fvs; + for ( fvs=sf->fv; fvs!=NULL; fvs=fvs->nextsame ) { + free(fvs->selected); + fvs->selected = gcalloc(new->charcnt,sizeof(char)); + } + } + c->curfv->sf = new; + if ( screen_display!=NULL ) { + FVSetTitle(c->curfv); + FontViewReformatAll(c->curfv->sf); + } +} + +static void bCIDSetFontNames(Context *c) { + SplineFont *sf = c->curfv->sf; + + if ( sf->cidmaster==NULL ) + errors( c, "Not a cid-keyed font", sf->fontname ); + _SetFontNames(c,sf->cidmaster); +} + +static void bCIDFlattenByCMap(Context *c) { + SplineFont *sf = c->curfv->sf; + + if ( sf->cidmaster==NULL ) + errors( c, "Not a cid-keyed font", sf->fontname ); + else if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Argument must be a filename"); + + SFFlattenByCMap(sf,c->a.vals[1].u.sval); +} + +/* **** Info routines **** */ + +static void bCharCnt(Context *c) { + if ( c->a.argc!=1 ) + error( c, "Wrong number of arguments"); + c->return_val.type = v_int; + c->return_val.u.ival = c->curfv->sf->charcnt; +} + +static void bInFont(Context *c) { + SplineFont *sf = c->curfv->sf; + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + c->return_val.type = v_int; + if ( c->a.vals[1].type==v_int ) + c->return_val.u.ival = c->a.vals[1].u.ival>=0 && c->a.vals[1].u.ivalcharcnt; + else if ( c->a.vals[1].type==v_unicode || c->a.vals[1].type==v_str ) { + int enc; + if ( c->a.vals[1].type==v_unicode ) + enc = SFFindChar(sf,c->a.vals[1].u.ival,NULL); + else { + unichar_t *temp = uc_copy(c->a.vals[1].u.sval); + enc = NameToEncoding(sf,temp); + free(temp); + } + c->return_val.u.ival = (enc!=-1); + } else + error( c, "Bad type of argument to InFont"); +} + +static void bWorthOutputting(Context *c) { + SplineFont *sf = c->curfv->sf; + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + c->return_val.type = v_int; + if ( c->a.vals[1].type==v_int ) + c->return_val.u.ival = c->a.vals[1].u.ival>=0 && + c->a.vals[1].u.ivalcharcnt && + SCWorthOutputting(sf->chars[c->a.vals[1].u.ival]); + else if ( c->a.vals[1].type==v_unicode || c->a.vals[1].type==v_str ) { + int enc; + if ( c->a.vals[1].type==v_unicode ) + enc = SFFindChar(sf,c->a.vals[1].u.ival,NULL); + else { + unichar_t *temp = uc_copy(c->a.vals[1].u.sval); + enc = NameToEncoding(sf,temp); + free(temp); + } + c->return_val.u.ival = enc!=-1 && SCWorthOutputting(sf->chars[enc]); + } else + error( c, "Bad type of argument to InFont"); +} + +static void bDefaultATT(Context *c) { + SplineFont *sf = c->curfv->sf; + char tag[4]; + char *str; + uint32 ftag; + int i; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type for argument"); + + memset(tag,' ',4); + str = c->a.vals[1].u.sval; + if ( *str ) { + tag[0] = *str; + if ( str[1] ) { + tag[1] = str[1]; + if ( str[2] ) { + tag[2] = str[2]; + if ( str[3] ) { + tag[3] = str[3]; + if ( str[4] ) + error(c,"Tags/Scripts/Languages are represented by strings which are at most 4 characters long"); + } + } + } + } + ftag = (tag[0]<<24)|(tag[1]<<16)|(tag[2]<<8)|tag[3]; + if ( strcmp(str,"*")) + ftag = 0; /* Everything */ + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && c->curfv->selected[i]) + SCTagDefault(sf->chars[i],ftag); +} + +static int32 ParseTag(Context *c,Val *tagstr) { + char tag[4]; + int feat,set; + char *str; + + memset(tag,' ',4); + str = tagstr->u.sval; + if ( *str=='<' ) { + if ( sscanf(str,"<%d,%d>", &feat, &set)!=2 ) + error(c,"Bad Apple feature/setting"); +return( (feat<<16) | set ); + } else if ( *str ) { + tag[0] = *str; + if ( str[1] ) { + tag[1] = str[1]; + if ( str[2] ) { + tag[2] = str[2]; + if ( str[3] ) { + tag[3] = str[3]; + if ( str[4] ) + error(c,"Tags/Scripts/Languages are represented by strings which are at most 4 characters long"); + } + } + } + } +return( (tag[0]<<24)|(tag[1]<<16)|(tag[2]<<8)|tag[3] ); +} + +static void bCheckForAnchorClass(Context *c) { + AnchorClass *t; + unichar_t *ustr; + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type for argument"); + + ustr = utf82u_copy( c->a.vals[1].u.sval ); + for ( t=sf->anchor; t!=NULL; t=t->next ) + if ( u_strcmp(ustr,t->name)==0 ) + break; + free(ustr); + c->return_val.type = v_int; + c->return_val.u.ival = ( t!=NULL ); +return; +} + +static void bAddAnchorClass(Context *c) { + AnchorClass *ac, *t; + unichar_t *ustr; + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc!=7 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || + c->a.vals[3].type!=v_str || c->a.vals[4].type!=v_str || + c->a.vals[5].type!=v_int || c->a.vals[6].type!=v_str ) + error( c, "Bad type for argument"); + + ac = chunkalloc(sizeof(AnchorClass)); + + ac->name = utf82u_copy( c->a.vals[1].u.sval ); + for ( t=sf->anchor; t!=NULL; t=t->next ) + if ( u_strcmp(ac->name,t->name)==0 ) + break; + if ( t!=NULL ) + errors(c,"This font already contains an anchor class with this name: ", c->a.vals[1].u.sval ); + + ac->feature_tag = ParseTag( c, &c->a.vals[4] ); + ac->flags = c->a.vals[5].u.ival; + if ( c->a.vals[5].u.ival == -1 ) + ac->flags = PSTDefaultFlags(ac->feature_tag,NULL); + + if ( strmatch(c->a.vals[2].u.sval,"default")==0 || strmatch(c->a.vals[2].u.sval,"mark")==0 ) + ac->type = act_mark; + else if ( strmatch(c->a.vals[2].u.sval,"mk-mk")==0 || strmatch(c->a.vals[2].u.sval,"mkmk")==0) + ac->type = act_mkmk; + else if ( strmatch(c->a.vals[2].u.sval,"cursive")==0 || strmatch(c->a.vals[2].u.sval,"curs")==0) + ac->type = act_curs; + else + errors(c,"Unknown type of anchor class. Must be one of \"default\", \"mk-mk\", or \"cursive\". ", c->a.vals[2].u.sval); + + ustr = uc_copy(c->a.vals[3].u.sval); + ac->script_lang_index = SFAddScriptLangRecord(sf,SRParse(ustr)); + free(ustr); + + ustr = utf82u_copy( c->a.vals[6].u.sval ); + if ( *ustr=='\0' || u_strcmp(ustr,ac->name)==0 ) + ac->merge_with = AnchorClassesNextMerge(sf->anchor); + else { + for ( t=sf->anchor; t!=NULL; t=t->next ) + if ( u_strcmp(ustr,t->name)==0 ) + break; + if ( t==NULL ) + errors(c,"Attempt to merge with unknown anchor class: ", c->a.vals[6].u.sval ); + ac->merge_with = t->merge_with; + } + ac->next = sf->anchor; + sf->anchor = ac; +} + +static void bRemoveAnchorClass(Context *c) { + AnchorClass *t; + unichar_t *name; + SplineFont *sf = c->curfv->sf; + + if ( c->a.argc!=2 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type for argument"); + + name = utf82u_copy( c->a.vals[1].u.sval ); + for ( t=sf->anchor; t!=NULL; t=t->next ) + if ( u_strcmp(name,t->name)==0 ) + break; + if ( t==NULL ) + errors(c,"This font does not contain an anchor class with this name: ", c->a.vals[1].u.sval ); + SFRemoveAnchorClass(sf,t); + free(name); +} + +static void bAddAnchorPoint(Context *c) { + AnchorClass *t; + unichar_t *name; + SplineFont *sf = c->curfv->sf; + int type; + SplineChar *sc; + AnchorPoint *ap; + int ligindex = 0; + + if ( c->a.argc<5 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || + c->a.vals[3].type!=v_int || c->a.vals[4].type!=v_int ) + error( c, "Bad type for argument"); + + name = utf82u_copy( c->a.vals[1].u.sval ); + for ( t=sf->anchor; t!=NULL; t=t->next ) + if ( u_strcmp(name,t->name)==0 ) + break; + if ( t==NULL ) + errors(c,"This font does not contain an anchor class with this name: ", c->a.vals[1].u.sval ); + free(name); + + if ( strmatch(c->a.vals[2].u.sval,"mark")==0 ) + type = at_mark; + else if ( strmatch(c->a.vals[2].u.sval,"basechar")==0 ) + type = at_basechar; + else if ( strmatch(c->a.vals[2].u.sval,"baselig")==0 ) + type = at_baselig; + else if ( strmatch(c->a.vals[2].u.sval,"basemark")==0 ) + type = at_basemark; + else if ( strmatch(c->a.vals[2].u.sval,"cursentry")==0 ) + type = at_centry; + else if ( strmatch(c->a.vals[2].u.sval,"cursexit")==0 ) + type = at_cexit; + else + errors(c,"Unknown type for anchor point: ", c->a.vals[2].u.sval ); + + if ( type== at_baselig ) { + if ( c->a.argc!=6 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[5].type!=v_int ) + error( c, "Bad type for argument"); + ligindex = c->a.vals[5].u.ival; + } else { + if ( c->a.argc!=5 ) + error( c, "Wrong number of arguments"); + } + + if (( type==at_baselig && t->type!=act_mark ) || + ( type==at_basechar && t->type!=act_mark ) || + ( type==at_basemark && t->type!=act_mkmk ) || + ( type==at_mark && !(t->type==act_mark || t->type==act_mkmk) ) || + ( (type==at_centry || type==at_cexit) && t->type!=act_curs )) + error(c,"Type of anchor class does not match type requested for anchor point" ); + + sc = GetOneSelChar(c); + for ( ap=sc->anchor; ap!=NULL; ap=ap->next ) { + if ( ap->anchor == t ) { + if ( type==at_centry || type==at_cexit ) { + if ( ap->type == type ) + break; + } else if ( type==at_baselig ) { + if ( ap->lig_index == ligindex ) + break; + } else + break; + } + } + if ( ap!=NULL ) + error(c,"This character already has an Anchor Point in the given anchor class" ); + + ap = chunkalloc(sizeof(AnchorPoint)); + ap->anchor = t; + ap->me.x = c->a.vals[3].u.ival; + ap->me.y = c->a.vals[4].u.ival; + ap->type = type; + ap->lig_index = ligindex; + ap->next = sc->anchor; + sc->anchor = ap; +} + +static void bAddATT(Context *c) { + SplineChar *sc; + PST temp, *pst; + unichar_t *ustr; + + memset(&temp,0,sizeof(temp)); + + if ( c->a.argc!=6 && c->a.argc!=9 && c->a.argc!=14 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || + c->a.vals[3].type!=v_str || c->a.vals[4].type!=v_int ) + error( c, "Bad type for argument"); + else if ( c->a.argc==6 && c->a.vals[5].type!=v_str ) + error( c, "Bad type for argument"); + else if ( c->a.argc==9 && ( c->a.vals[5].type!=v_int || + c->a.vals[6].type!=v_int || c->a.vals[7].type!=v_int || + c->a.vals[8].type!=v_int )) + error( c, "Bad type for argument"); + else if ( c->a.argc==14 && ( c->a.vals[5].type!=v_str || + c->a.vals[6].type!=v_int || c->a.vals[7].type!=v_int || + c->a.vals[8].type!=v_int || c->a.vals[9].type!=v_int || + c->a.vals[10].type!=v_int || c->a.vals[11].type!=v_int || + c->a.vals[12].type!=v_int || c->a.vals[13].type!=v_int )) + error( c, "Bad type for argument"); + + if ( strcmp(c->a.vals[1].u.sval,"Position")==0 ) { + temp.type = pst_position; + if (c->a.argc!=9 ) + error( c, "Wrong number of arguments"); + } else if ( strcmp(c->a.vals[1].u.sval,"Pair")==0 ) { + temp.type = pst_pair; + if (c->a.argc!=14 ) + error( c, "Wrong number of arguments"); + } else { + if (c->a.argc!=6 ) + error( c, "Wrong number of arguments"); + if ( strcmp(c->a.vals[1].u.sval,"Substitution")==0 ) + temp.type = pst_substitution; + else if ( strcmp(c->a.vals[1].u.sval,"AltSubs")==0 ) + temp.type = pst_alternate; + else if ( strcmp(c->a.vals[1].u.sval,"MultSubs")==0 ) + temp.type = pst_multiple; + else if ( strcmp(c->a.vals[1].u.sval,"Ligature")==0 ) + temp.type = pst_ligature; + else + errors(c,"Unknown tag", c->a.vals[1].u.sval); + } + + temp.tag = ParseTag( c,&c->a.vals[3] ); + temp.flags = c->a.vals[4].u.ival; + + sc = GetOneSelChar(c); + + if ( c->a.vals[4].u.ival == -1 ) + temp.flags = PSTDefaultFlags(temp.type,sc); + + ustr = uc_copy(c->a.vals[2].u.sval); + temp.script_lang_index = SFAddScriptLangRecord(sc->parent,SRParse(ustr)); + free(ustr); + + if ( temp.type==pst_position ) { + temp.u.pos.xoff = c->a.vals[5].u.ival; + temp.u.pos.yoff = c->a.vals[6].u.ival; + temp.u.pos.h_adv_off = c->a.vals[7].u.ival; + temp.u.pos.v_adv_off = c->a.vals[8].u.ival; + } else if ( temp.type==pst_pair ) { + temp.u.pair.paired = copy(c->a.vals[5].u.sval); + temp.u.pair.vr = chunkalloc(sizeof(struct vr [2])); + temp.u.pair.vr[0].xoff = c->a.vals[6].u.ival; + temp.u.pair.vr[0].yoff = c->a.vals[7].u.ival; + temp.u.pair.vr[0].h_adv_off = c->a.vals[8].u.ival; + temp.u.pair.vr[0].v_adv_off = c->a.vals[9].u.ival; + temp.u.pair.vr[1].xoff = c->a.vals[10].u.ival; + temp.u.pair.vr[1].yoff = c->a.vals[11].u.ival; + temp.u.pair.vr[1].h_adv_off = c->a.vals[12].u.ival; + temp.u.pair.vr[1].v_adv_off = c->a.vals[13].u.ival; + } else { + temp.u.subs.variant = copy(c->a.vals[5].u.sval); + if ( temp.type==pst_ligature ) + temp.u.lig.lig = sc; + } + pst = chunkalloc(sizeof(PST)); + *pst = temp; + pst->next = sc->possub; + sc->possub = pst; +} + +static void bRemoveATT(Context *c) { + SplineFont *sf = c->curfv->sf; + char tag[4]; + char *str; + uint32 ftag; + int i; + int type, sli; + struct script_record *sr; + PST *pst, *prev, *next; + + if ( c->a.argc!=4 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str || c->a.vals[2].type!=v_str || c->a.vals[3].type!=v_str ) + error( c, "Bad type for argument"); + + if ( strcmp(c->a.vals[1].u.sval,"Position")==0 ) + type = pst_position; + else if ( strcmp(c->a.vals[1].u.sval,"Pair")==0 ) + type = pst_pair; + else if ( strcmp(c->a.vals[1].u.sval,"Substitution")==0 ) + type = pst_substitution; + else if ( strcmp(c->a.vals[1].u.sval,"AltSubs")==0 ) + type = pst_alternate; + else if ( strcmp(c->a.vals[1].u.sval,"MultSubs")==0 ) + type = pst_multiple; + else if ( strcmp(c->a.vals[1].u.sval,"Ligature")==0 ) + type = pst_ligature; + else if ( strcmp(c->a.vals[1].u.sval,"*")==0 ) + type = -1; + else + errors(c,"Unknown tag", c->a.vals[1].u.sval); + + if ( strcmp(c->a.vals[2].u.sval,"*")==0 ) + sli = -1; + else { + unichar_t *utemp; + sr = SRParse(utemp = uc_copy(c->a.vals[2].u.sval)); + sli = SFFindScriptLangRecord(sf,sr); + ScriptRecordFree(sr); + free(utemp); + if ( sli==-1 ) /* Can't be any matches, that script record didn't exist */ +return; + } + + memset(tag,' ',4); + str = c->a.vals[3].u.sval; + if ( *str ) { + tag[0] = *str; + if ( str[1] ) { + tag[1] = str[1]; + if ( str[2] ) { + tag[2] = str[2]; + if ( str[3] ) { + tag[3] = str[3]; + if ( str[4] ) + error(c,"Tags/Scripts/Languages are represented by strings which are at most 4 characters long"); + } + } + } + } + ftag = (tag[0]<<24)|(tag[1]<<16)|(tag[2]<<8)|tag[3]; + if ( strcmp(str,"*")==0 ) + ftag = 0; /* Everything */ + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && c->curfv->selected[i]) { + for ( prev=NULL, pst = sf->chars[i]->possub; pst!=NULL; pst = next ) { + next = pst->next; + if ( (pst->type==type || type==-1 ) && + (pst->script_lang_index==sli || sli==-1 ) && + (pst->tag==ftag || ftag==0)) { + if ( prev==NULL ) + sf->chars[i]->possub = next; + else + prev->next = next; + pst->next = NULL; + PSTFree(pst); + } else + prev = pst; + } + } +} + +static void PosSubInfo(SplineChar *sc,Context *c) { + uint32 tags[3]; + int i; + enum possub_type type; + PST *pst; + + if ( c->a.vals[2].type!=v_str || c->a.vals[3].type!=v_str || c->a.vals[4].type!=v_str ) + error( c, "Bad type for argument"); + for ( i=0; i<3; ++i ) { + char *str = c->a.vals[i+2].u.sval; + char temp[4]; + memset(temp,' ',4); + if ( *str ) { + temp[0] = *str; + if ( str[1] ) { + temp[1] = str[1]; + if ( str[2] ) { + temp[2] = str[2]; + if ( str[3] ) { + temp[3] = str[3]; + if ( str[4] ) + error(c,"Tags/Scripts/Languages are represented by strings which are at most 4 characters long"); + } + } + } + } + tags[i] = (temp[0]<<24)|(temp[1]<<16)|(temp[2]<<8)|temp[3]; + } + + if ( strcmp(c->a.vals[1].u.sval,"Position")==0 ) + type = pst_position; + else if ( strcmp(c->a.vals[1].u.sval,"Pair")==0 ) + type = pst_pair; + else if ( strcmp(c->a.vals[1].u.sval,"Substitution")==0 ) + type = pst_substitution; + else if ( strcmp(c->a.vals[1].u.sval,"AltSubs")==0 ) + type = pst_alternate; + else if ( strcmp(c->a.vals[1].u.sval,"MultSubs")==0 ) + type = pst_multiple; + else if ( strcmp(c->a.vals[1].u.sval,"Ligature")==0 ) + type = pst_ligature; + else + errors(c,"Unknown tag", c->a.vals[1].u.sval); + + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == type && pst->tag==tags[2] && + ScriptLangMatch(c->curfv->sf->script_lang[pst->script_lang_index], + tags[0],tags[1])) + break; + } + + if ( type==pst_position || type==pst_pair ) { + c->return_val.type = v_int; + c->return_val.u.ival = (pst!=NULL); + } else { + c->return_val.type = v_str; + if ( pst==NULL ) + c->return_val.u.sval = copy(""); + else + c->return_val.u.sval = copy(pst->u.subs.variant); /* All other types have their strings in the same place in the union */ + } +} + +static void bCharInfo(Context *c) { + SplineFont *sf = c->curfv->sf; + SplineChar *sc; + DBounds b; + KernClass *kc; + int i; + + if ( c->a.argc!=2 && c->a.argc!=3 && c->a.argc!=5 ) + error( c, "Wrong number of arguments"); + else if ( c->a.vals[1].type!=v_str ) + error( c, "Bad type for argument"); + + sc = GetOneSelChar(c); + + c->return_val.type = v_int; + if ( c->a.argc==5 ) { + PosSubInfo(sc,c); + } else if ( c->a.argc==3 ) { + int ch2 = ParseCharIdent(c,&c->a.vals[2],true); + if ( strmatch( c->a.vals[1].u.sval,"Kern")==0 ) { + c->return_val.u.ival = 0; + if ( sf->chars[ch2]!=NULL ) { KernPair *kp; KernClass *kc; + for ( kp = sc->kerns; kp!=NULL && kp->sc!=sf->chars[ch2]; kp=kp->next ); + if ( kp!=NULL ) + c->return_val.u.ival = kp->off; + else { + for ( kc = sf->kerns; kc!=NULL; kc=kc->next ) { + if (( c->return_val.u.ival = KernClassContains(kc,sc->name,sf->chars[ch2]->name,true))!=0 ) + break; + } + } + } + } else if ( strmatch( c->a.vals[1].u.sval,"VKern")==0 ) { + c->return_val.u.ival = 0; + if ( sf->chars[ch2]!=NULL ) { KernPair *kp; + for ( kp = sc->vkerns; kp!=NULL && kp->sc!=sf->chars[ch2]; kp=kp->next ); + if ( kp!=NULL ) + c->return_val.u.ival = kp->off; + else { + for ( kc = sf->vkerns; kc!=NULL; kc=kc->next ) { + if (( c->return_val.u.ival = KernClassContains(kc,sc->name,sf->chars[ch2]->name,true))!=0 ) + break; + } + } + } + } else + errors(c,"Unknown tag", c->a.vals[1].u.sval); + } else { + if ( strmatch( c->a.vals[1].u.sval,"Name")==0 ) { + c->return_val.type = v_str; + c->return_val.u.sval = copy(sc->name); + } else if ( strmatch( c->a.vals[1].u.sval,"Unicode")==0 ) + c->return_val.u.ival = sc->unicodeenc; + else if ( strmatch( c->a.vals[1].u.sval,"Encoding")==0 ) + c->return_val.u.ival = sc->enc; + else if ( strmatch( c->a.vals[1].u.sval,"Width")==0 ) + c->return_val.u.ival = sc->width; + else if ( strmatch( c->a.vals[1].u.sval,"VWidth")==0 ) + c->return_val.u.ival = sc->vwidth; + else if ( strmatch( c->a.vals[1].u.sval,"Changed")==0 ) + c->return_val.u.ival = sc->changed; + else if ( strmatch( c->a.vals[1].u.sval,"DontAutoHint")==0 ) + c->return_val.u.ival = sc->manualhints; + else if ( strmatch( c->a.vals[1].u.sval,"Color")==0 ) + c->return_val.u.ival = sc->color; + else if ( strmatch( c->a.vals[1].u.sval,"GlyphIndex")==0 ) + c->return_val.u.ival = sc->orig_pos; + else if ( strmatch( c->a.vals[1].u.sval,"Comment")==0 ) { + c->return_val.type = v_str; + c->return_val.u.sval = sc->comment?u2def_copy(sc->comment):copy(""); + } else { + SplineCharFindBounds(sc,&b); + if ( strmatch( c->a.vals[1].u.sval,"LBearing")==0 ) + c->return_val.u.ival = b.minx; + else if ( strmatch( c->a.vals[1].u.sval,"RBearing")==0 ) + c->return_val.u.ival = sc->width-b.maxx; + else if ( strmatch( c->a.vals[1].u.sval,"BBox")==0 ) { + c->return_val.type = v_arr; + c->return_val.u.aval = galloc(sizeof(Array)); + c->return_val.u.aval->argc = 4; + c->return_val.u.aval->vals = galloc(4*sizeof(Val)); + for ( i=0; i<4; ++i ) + c->return_val.u.aval->vals[i].type = v_int; + c->return_val.u.aval->vals[0].u.ival = rint(b.minx); + c->return_val.u.aval->vals[1].u.ival = rint(b.miny); + c->return_val.u.aval->vals[2].u.ival = rint(b.maxx); + c->return_val.u.aval->vals[3].u.ival = rint(b.maxy); + } else + errors(c,"Unknown tag", c->a.vals[1].u.sval); + } + } +} + +static struct builtins { char *name; void (*func)(Context *); int nofontok; } builtins[] = { +/* Generic utilities */ + { "Print", bPrint, 1 }, + { "Error", bError, 1 }, + { "AskUser", bAskUser, 1 }, + { "PostNotice", bPostNotice, 1 }, + { "Array", bArray, 1 }, + { "SizeOf", bSizeOf, 1 }, + { "Strsub", bStrsub, 1 }, + { "Strlen", bStrlen, 1 }, + { "Strstr", bStrstr, 1 }, + { "Strrstr", bStrrstr, 1 }, + { "Strcasestr", bStrcasestr, 1 }, + { "Strcasecmp", bStrcasecmp, 1 }, + { "Strtol", bStrtol, 1 }, + { "Strskipint", bStrskipint, 1 }, + { "GetPref", bGetPrefs, 1 }, + { "SetPref", bSetPrefs, 1 }, + { "UnicodeFromName", bUnicodeFromName, 1 }, + { "Chr", bChr, 1 }, + { "Ord", bOrd, 1 }, + { "Utf8", bUtf8, 1 }, +/* File menu */ + { "Quit", bQuit, 1 }, + { "FontsInFile", bFontsInFile, 1 }, + { "Open", bOpen, 1 }, + { "New", bNew, 1 }, + { "Close", bClose }, + { "Save", bSave }, + { "Generate", bGenerate }, + { "GenerateFamily", bGenerateFamily }, + { "ControlAfmLigatureOutput", bControlAfmLigatureOutput }, +#ifdef FONTFORGE_CONFIG_WRITE_PFM + { "WritePfm", bWritePfm }, +#endif + { "Import", bImport }, + { "Export", bExport }, + { "MergeKern", bMergeKern }, + { "PrintSetup", bPrintSetup }, + { "PrintFont", bPrintFont }, +/* Edit Menu */ + { "Cut", bCut }, + { "Copy", bCopy }, + { "CopyReference", bCopyReference }, + { "CopyWidth", bCopyWidth }, + { "CopyVWidth", bCopyVWidth }, + { "CopyLBearing", bCopyLBearing }, + { "CopyRBearing", bCopyRBearing }, + { "Paste", bPaste }, + { "PasteInto", bPasteInto }, + { "SameGlyphAs", bSameGlyphAs }, + { "Clear", bClear }, + { "ClearBackground", bClearBackground }, + { "CopyFgToBg", bCopyFgToBg }, + { "UnlinkReference", bUnlinkReference }, + { "Join", bJoin }, + { "SelectAll", bSelectAll }, + { "SelectNone", bSelectNone }, + { "SelectMore", bSelectMore }, + { "Select", bSelect }, + { "SelectIf", bSelectIf }, + { "SelectByATT", bSelectByATT }, +/* Element Menu */ + { "Reencode", bReencode }, + { "SetCharCnt", bSetCharCnt }, + { "LoadEncodingFile", bLoadEncodingFile, 1 }, + { "SetFontOrder", bSetFontOrder }, + { "SetFontHasVerticalMetrics", bSetFontHasVerticalMetrics }, + { "SetFontNames", bSetFontNames }, + { "SetTTFName", bSetTTFName }, + { "GetTTFName", bGetTTFName }, + { "SetItalicAngle", bSetItalicAngle }, + { "SetMacStyle", bSetMacStyle }, + { "SetPanose", bSetPanose }, + { "SetUniqueID", bSetUniqueID }, + { "SetTeXParams", bSetTeXParams }, + { "SetCharName", bSetCharName }, + { "SetUnicodeValue", bSetUnicodeValue }, + { "SetCharColor", bSetCharColor }, + { "SetCharComment", bSetCharComment }, + { "BitmapsAvail", bBitmapsAvail }, + { "BitmapsRegen", bBitmapsRegen }, + { "ApplySubstitution", bApplySubstitution }, + { "Transform", bTransform }, + { "HFlip", bHFlip }, + { "VFlip", bVFlip }, + { "Rotate", bRotate }, + { "Scale", bScale }, + { "Skew", bSkew }, + { "Move", bMove }, + { "ScaleToEm", bScaleToEm }, + { "NonLinearTransform", bNonLinearTransform }, + { "ExpandStroke", bExpandStroke }, + { "Inline", bInline }, + { "Outline", bOutline }, + { "Shadow", bShadow }, + { "Wireframe", bWireframe }, + { "RemoveOverlap", bRemoveOverlap }, + { "OverlapIntersect", bOverlapIntersect }, + { "FindIntersections", bFindIntersections }, + { "Simplify", bSimplify }, + { "AddExtrema", bAddExtrema }, + { "RoundToInt", bRoundToInt }, + { "Autotrace", bAutotrace }, + { "CorrectDirection", bCorrectDirection }, + { "AddATT", bAddATT }, + { "DefaultATT", bDefaultATT }, + { "RemoveATT", bRemoveATT }, + { "CheckForAnchorClass", bCheckForAnchorClass }, + { "AddAnchorClass", bAddAnchorClass }, + { "RemoveAnchorClass", bRemoveAnchorClass }, + { "AddAnchorPoint", bAddAnchorPoint }, + { "BuildComposit", bBuildComposit }, + { "BuildAccented", bBuildAccented }, + { "MergeFonts", bMergeFonts }, +/* Menu */ + { "AutoHint", bAutoHint }, + { "bSubstitutionPoints", bSubstitutionPoints }, + { "bAutoCounter", bAutoCounter }, + { "bDontAutoHint", bDontAutoHint }, + { "AutoInstr", bAutoInstr }, + { "ClearHints", bClearHints }, + { "AddHHint", bAddHHint }, + { "AddVHint", bAddVHint }, + { "ClearCharCounterMasks", bClearCharCounterMasks }, + { "SetCharCounterMask", bSetCharCounterMask }, + { "ReplaceCharCounterMasks", bReplaceCharCounterMasks }, + { "ClearPrivateEntry", bClearPrivateEntry }, + { "ChangePrivateEntry", bChangePrivateEntry }, + { "GetPrivateEntry", bGetPrivateEntry }, + { "SetWidth", bSetWidth }, + { "SetVWidth", bSetVWidth }, + { "SetLBearing", bSetLBearing }, + { "SetRBearing", bSetRBearing }, + { "CenterInWidth", bCenterInWidth }, + { "AutoWidth", bAutoWidth }, + { "AutoKern", bAutoKern }, + { "SetKern", bSetKern }, + { "RemoveAllKerns", bClearAllKerns }, + { "SetVKern", bSetVKern }, + { "RemoveAllVKerns", bClearAllVKerns }, + { "VKernFromHKern", bVKernFromHKern }, +/* MM Menu */ + { "MMInstanceNames", bMMInstanceNames }, + { "MMWeightedName", bMMWeightedName }, + { "MMChangeInstance", bMMChangeInstance }, +/* CID Menu */ + { "ConvertToCID", bConvertToCID }, + { "ConvertByCMap", bConvertByCMap }, + { "CIDChangeSubFont", bCIDChangeSubFont }, + { "CIDSetFontNames", bCIDSetFontNames }, + { "CIDFlattenByCMap", bCIDFlattenByCMap }, +/* ***** */ + { "CharCnt", bCharCnt }, + { "InFont", bInFont }, + { "WorthOutputting", bWorthOutputting }, + { "CharInfo", bCharInfo }, + { NULL } +}; + +/* ******************************* Interpreter ****************************** */ + +static void expr(Context*,Val *val); +static void statement(Context*); + +static int cgetc(Context *c) { + int ch; + if ( c->ungotch ) { + ch = c->ungotch; + c->ungotch = 0; +return( ch ); + } + ch = getc(c->script); + if ( verbose>0 ) + putchar(ch); + if ( ch=='\r' ) { + int nch = getc(c->script); + if ( nch!='\n' ) + ungetc(nch,c->script); + else if ( verbose>0 ) + putchar('\n'); + ++c->lineno; + } else if ( ch=='\n' ) + ++c->lineno; +return( ch ); +} + +static void cungetc(int ch,Context *c) { + if ( c->ungotch ) + fprintf( stderr, "Internal error: Attempt to unget two characters\n" ); + c->ungotch = ch; +} + +static long ctell(Context *c) { + long pos = ftell(c->script); + if ( c->ungotch ) + --pos; +return( pos ); +} + +static void cseek(Context *c,long pos) { + fseek(c->script,pos,SEEK_SET); + c->ungotch = 0; + c->backedup = false; +} + +static enum token_type NextToken(Context *c) { + int ch; + enum token_type tok = tt_error; + + if ( c->backedup ) { + c->backedup = false; +return( c->tok ); + } + do { + ch = cgetc(c); + if ( isalpha(ch) || ch=='$' || ch=='_' || ch=='.' || ch=='@' ) { + char *pt = c->tok_text, *end = c->tok_text+TOK_MAX; + int toolong = false; + while ( (isalnum(ch) || ch=='$' || ch=='_' || ch=='.' || ch=='@' ) && pttok_text)==0 ) { + tok = keywords[i].tok; + break; + } + } + } else if ( isdigit(ch) ) { + int val=0; + tok = tt_number; + if ( ch!='0' ) { + while ( isdigit(ch)) { + val = 10*val+(ch-'0'); + ch = cgetc(c); + } + } else if ( isdigit(ch=cgetc(c)) ) { + while ( isdigit(ch) && ch<'8' ) { + val = 8*val+(ch-'0'); + ch = cgetc(c); + } + } else if ( ch=='X' || ch=='x' || ch=='u' || ch=='U' ) { + if ( ch=='u' || ch=='U' ) tok = tt_unicode; + ch = cgetc(c); + while ( isdigit(ch) || (ch>='a' && ch<='f') || (ch>='A'&&ch<='F')) { + if ( isdigit(ch)) + ch -= '0'; + else if ( ch>='a' && ch<='f' ) + ch += 10-'a'; + else + ch += 10-'A'; + val = 16*val+ch; + ch = cgetc(c); + } + } + cungetc(ch,c); + c->tok_val.u.ival = val; + c->tok_val.type = tok==tt_number ? v_int : v_unicode; + } else if ( ch=='\'' || ch=='"' ) { + int quote = ch; + char *pt = c->tok_text, *end = c->tok_text+TOK_MAX; + int toolong = false; + ch = cgetc(c); + while ( ch!=EOF && ch!='\r' && ch!='\n' && ch!=quote ) { + if ( ch=='\\' ) { + ch=cgetc(c); + if ( ch=='\n' || ch=='\r' ) { + cungetc(ch,c); + ch = '\\'; + } else if ( ch==EOF ) + ch = '\\'; + } + if ( pt': + tok = tt_gt; + ch=cgetc(c); + if ( ch=='=' ) + tok = tt_ge; + else + cungetc(ch,c); + break; + case '<': + tok = tt_lt; + ch=cgetc(c); + if ( ch=='=' ) + tok = tt_le; + else + cungetc(ch,c); + break; + default: + fprintf( stderr, "%s:%d Unexpected character %c (%d)\n", + c->filename, c->lineno, ch, ch); + traceback(c); + } + } while ( tok==tt_error ); + + c->tok = tok; +return( tok ); +} + +static void backuptok(Context *c) { + if ( c->backedup ) + fprintf( stderr, "%s:%d Internal Error: Attempt to back token twice\n", + c->filename, c->lineno ); + c->backedup = true; +} + +#define PE_ARG_MAX 25 + +static void docall(Context *c,char *name,Val *val) { + /* Be prepared for c->donteval */ + Val args[PE_ARG_MAX]; + Array *dontfree[PE_ARG_MAX]; + int i; + enum token_type tok; + Context sub; + + tok = NextToken(c); + dontfree[0] = NULL; + if ( tok==tt_rparen ) + i = 1; + else { + backuptok(c); + for ( i=1; tok!=tt_rparen; ++i ) { + if ( i>=PE_ARG_MAX ) + error(c,"Too many arguments"); + expr(c,&args[i]); + tok = NextToken(c); + if ( tok!=tt_comma ) + expect(c,tt_rparen,tok); + dontfree[i]=NULL; + } + } + + if ( !c->donteval ) { + args[0].type = v_str; + args[0].u.sval = name; + memset( &sub,0,sizeof(sub)); + sub.caller = c; + sub.a.vals = args; + sub.a.argc = i; + sub.return_val.type = v_void; + sub.filename = name; + sub.curfv = c->curfv; + sub.trace = c->trace; + sub.dontfree = dontfree; + for ( i=0; itrace.u.ival ) { + printf( "%s:%d Calling %s(", GFileNameTail(c->filename), c->lineno, + name ); + for ( i=1; i"); + else + printf( ""); /* ANSI might thing this a trigraph */ + } + printf(")\n"); + } + + for ( i=0; builtins[i].name!=NULL; ++i ) + if ( strcmp(builtins[i].name,name)==0 ) + break; + if ( builtins[i].name!=NULL ) { + if ( sub.curfv==NULL && !builtins[i].nofontok ) + error(&sub,"This command requires an active font"); + (builtins[i].func)(&sub); + } else { + if ( strchr(name,'/')==NULL && strchr(c->filename,'/')!=NULL ) { + char *pt; + sub.filename = galloc(strlen(c->filename)+strlen(name)+1); + strcpy(sub.filename,c->filename); + pt = strrchr(sub.filename,'/'); + strcpy(pt+1,name); + } + sub.script = fopen(sub.filename,"r"); + if ( sub.script==NULL ) + error(&sub, "No such script-file or buildin function"); + else { + sub.lineno = 1; + while ( !sub.returned && (tok = NextToken(&sub))!=tt_eof ) { + backuptok(&sub); + statement(&sub); + } + fclose(sub.script); sub.script = NULL; + } + if ( sub.filename!=name ) + free( sub.filename ); + } + c->curfv = sub.curfv; + } + calldatafree(&sub); + if ( val->type==v_str ) + free(val->u.sval); + *val = sub.return_val; +} + +static void handlename(Context *c,Val *val) { + char name[TOK_MAX+1]; + enum token_type tok; + int temp; + char *pt; + SplineFont *sf; + + strcpy(name,c->tok_text); + val->type = v_void; + tok = NextToken(c); + if ( tok==tt_lparen ) { + docall(c,name,val); + } else if ( c->donteval ) { + backuptok(c); + } else { + if ( *name=='$' ) { + if ( isdigit(name[1])) { + temp = 0; + for ( pt = name+1; isdigit(*pt); ++pt ) + temp = 10*temp+*pt-'0'; + if ( *pt=='\0' && tempa.argc ) { + val->type = v_lval; + val->u.lval = &c->a.vals[temp]; + } + } else if ( strcmp(name,"$argc")==0 || strcmp(name,"$#")==0 ) { + val->type = v_int; + val->u.ival = c->a.argc; + } else if ( strcmp(name,"$argv")==0 ) { + val->type = v_arr; + val->u.aval = &c->a; + } else if ( strcmp(name,"$curfont")==0 || strcmp(name,"$nextfont")==0 || + strcmp(name,"$firstfont")==0 ) { + if ( strcmp(name,"$firstfont")==0 ) { + if ( fv_list==NULL ) sf=NULL; + else sf = fv_list->sf; + } else { + if ( c->curfv==NULL ) error(c,"No current font"); + if ( strcmp(name,"$curfont")==0 ) + sf = c->curfv->sf; + else { + if ( c->curfv->next==NULL ) sf = NULL; + else sf = c->curfv->next->sf; + } + } + val->type = v_str; + val->u.sval = copy(sf==NULL?"": + sf->filename!=NULL?sf->filename:sf->origname); + } else if ( strcmp(name,"$mmcount")==0 ) { + if ( c->curfv==NULL ) error(c,"No current font"); + if ( c->curfv->sf->mm==NULL ) + val->u.ival = 0; + else + val->u.ival = c->curfv->sf->mm->instance_count; + val->type = v_int; + } else if ( strcmp(name,"$macstyle")==0 ) { + if ( c->curfv==NULL ) error(c,"No current font"); + val->u.ival = c->curfv->sf->macstyle; + val->type = v_int; + } else if ( strcmp(name,"$curcid")==0 || strcmp(name,"$nextcid")==0 || + strcmp(name,"$firstcid")==0 ) { + if ( c->curfv==NULL ) error(c,"No current font"); + if ( c->curfv->sf->cidmaster==NULL ) error(c,"Not a cid keyed font"); + if ( strcmp(name,"$firstcid")==0 ) { + sf = c->curfv->sf->cidmaster->subfonts[0]; + } else { + sf = c->curfv->sf; + if ( strcmp(name,"$nextcid")==0 ) { int i; + for ( i = 0; icidmaster->subfontcnt && + sf->cidmaster->subfonts[i]!=sf; ++i ); + if ( i>=sf->cidmaster->subfontcnt-1 ) + sf = NULL; /* No next */ + else + sf = sf->cidmaster->subfonts[i+1]; + } + } + val->type = v_str; + val->u.sval = copy(sf==NULL?"":sf->fontname); + } else if ( strcmp(name,"$fontname")==0 || strcmp(name,"$familyname")==0 || + strcmp(name,"$fullname")==0 || strcmp(name,"$weight")==0 || + strcmp(name,"$copyright")==0 || strcmp(name,"$filename")==0 || + strcmp(name,"$fontversion")==0 ) { + if ( c->curfv==NULL ) error(c,"No current font"); + val->type = v_str; + val->u.sval = copy(strcmp(name,"$fontname")==0?c->curfv->sf->fontname: + name[2]=='a'?c->curfv->sf->familyname: + name[2]=='u'?c->curfv->sf->fullname: + name[2]=='e'?c->curfv->sf->weight: + name[2]=='i'?c->curfv->sf->origname: + name[3]=='p'?c->curfv->sf->copyright: + c->curfv->sf->version); + } else if ( strcmp(name,"$cidfontname")==0 || strcmp(name,"$cidfamilyname")==0 || + strcmp(name,"$cidfullname")==0 || strcmp(name,"$cidweight")==0 || + strcmp(name,"$cidcopyright")==0 ) { + if ( c->curfv==NULL ) error(c,"No current font"); + val->type = v_str; + if ( c->curfv->sf->cidmaster==NULL ) + val->u.sval = copy(""); + else { + SplineFont *sf = c->curfv->sf->cidmaster; + val->u.sval = copy(strcmp(name,"$cidfontname")==0?sf->fontname: + name[5]=='a'?sf->familyname: + name[5]=='u'?sf->fullname: + name[5]=='e'?sf->weight: + sf->copyright); + } + } else if ( strcmp(name,"$italicangle")==0 ) { + if ( c->curfv==NULL ) error(c,"No current font"); + val->type = v_int; + val->u.ival = rint(c->curfv->sf->italicangle); + } else if ( strcmp(name,"$fontchanged")==0 ) { + if ( c->curfv==NULL ) error(c,"No current font"); + val->type = v_int; + val->u.ival = c->curfv->sf->changed; + } else if ( strcmp(name,"$bitmaps")==0 ) { + SplineFont *sf; + BDFFont *bdf; + int cnt; + if ( c->curfv==NULL ) error(c,"No current font"); + sf = c->curfv->sf; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + for ( cnt=0, bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) ++cnt; + val->type = v_arrfree; + val->u.aval = galloc(sizeof(Array)); + val->u.aval->argc = cnt; + val->u.aval->vals = galloc((cnt+1)*sizeof(Val)); + for ( cnt=0, bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next, ++cnt) { + val->u.aval->vals[cnt].type = v_int; + val->u.aval->vals[cnt].u.ival = bdf->pixelsize; + if ( bdf->clut!=NULL ) + val->u.aval->vals[cnt].u.ival |= BDFDepth(bdf)<<16; + } + } else if ( strcmp(name,"$panose")==0 ) { + SplineFont *sf; + struct pfminfo pfminfo; + int cnt; + if ( c->curfv==NULL ) error(c,"No current font"); + sf = c->curfv->sf; + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + val->type = v_arrfree; + val->u.aval = galloc(sizeof(Array)); + val->u.aval->argc = 10; + val->u.aval->vals = galloc((10+1)*sizeof(Val)); + SFDefaultOS2Info(&pfminfo,sf,sf->fontname); + for ( cnt=0; cnt<10; ++cnt ) { + val->u.aval->vals[cnt].type = v_int; + val->u.aval->vals[cnt].u.ival = pfminfo.panose[cnt]; + } + } else if ( strcmp(name,"$selection")==0 ) { + SplineFont *sf; + int i; + if ( c->curfv==NULL ) error(c,"No current font"); + sf = c->curfv->sf; + val->type = v_arrfree; + val->u.aval = galloc(sizeof(Array)); + val->u.aval->argc = sf->charcnt; + val->u.aval->vals = galloc((sf->charcnt+1)*sizeof(Val)); + for ( i=0; icharcnt; ++i) { + val->u.aval->vals[i].type = v_int; + val->u.aval->vals[i].u.ival = c->curfv->selected[i]; + } + } else if ( strcmp(name,"$trace")==0 ) { + val->type = v_lval; + val->u.lval = &c->trace; + } else if ( strcmp(name,"$version")==0 ) { + extern const char *source_version_str; + val->type = v_str; + val->u.sval = copy(source_version_str); + } else if ( GetPrefs(name+1,val)) { + /* Done */ + } + } else if ( *name=='@' ) { + if ( c->curfv==NULL ) error(c,"No current font"); + DicaLookup(c->curfv->fontvars,name,val); + } else if ( *name=='_' ) { + DicaLookup(&globals,name,val); + } else { + DicaLookup(&c->locals,name,val); + } + if ( tok==tt_assign && val->type==v_void && *name!='$' ) { + /* It's ok to create this as a new variable, we're going to assign to it */ + if ( *name=='@' ) { + if ( c->curfv->fontvars==NULL ) + c->curfv->fontvars = gcalloc(1,sizeof(struct dictionary)); + DicaNewEntry(c->curfv->fontvars,name,val); + } else if ( *name=='_' ) { + DicaNewEntry(&globals,name,val); + } else { + DicaNewEntry(&c->locals,name,val); + } + } + if ( val->type==v_void ) + errors(c, "Undefined variable", name); + backuptok(c); + } +} + +static void term(Context *c,Val *val) { + enum token_type tok = NextToken(c); + Val temp; + + if ( tok==tt_lparen ) { + expr(c,val); + tok = NextToken(c); + expect(c,tt_rparen,tok); + } else if ( tok==tt_number || tok==tt_unicode ) { + *val = c->tok_val; + } else if ( tok==tt_string ) { + val->type = v_str; + val->u.sval = copy( c->tok_text ); + } else if ( tok==tt_name ) { + handlename(c,val); + } else if ( tok==tt_minus || tok==tt_plus || tok==tt_not || tok==tt_bitnot ) { + term(c,val); + if ( !c->donteval ) { + dereflvalif(val); + if ( val->type!=v_int ) + error( c, "Invalid type in integer expression" ); + if ( tok==tt_minus ) + val->u.ival = -val->u.ival; + else if ( tok==tt_not ) + val->u.ival = !val->u.ival; + else if ( tok==tt_bitnot ) + val->u.ival = ~val->u.ival; + } + } else if ( tok==tt_incr || tok==tt_decr ) { + term(c,val); + if ( !c->donteval ) { + if ( val->type!=v_lval ) + error( c, "Expected lvalue" ); + if ( val->u.lval->type!=v_int && val->u.lval->type!=v_unicode ) + error( c, "Invalid type in integer expression" ); + if ( tok == tt_incr ) + ++val->u.lval->u.ival; + else + --val->u.lval->u.ival; + dereflvalif(val); + } + } else + expect(c,tt_name,tok); + + tok = NextToken(c); + while ( tok==tt_incr || tok==tt_decr || tok==tt_colon || tok==tt_lparen || tok==tt_lbracket ) { + if ( tok==tt_colon ) { + if ( c->donteval ) { + tok = NextToken(c); + expect(c,tt_name,tok); + } else { + dereflvalif(val); + if ( val->type!=v_str ) + error( c, "Invalid type in string expression" ); + else { + char *pt, *ept; + tok = NextToken(c); + expect(c,tt_name,tok); + if ( strcmp(c->tok_text,"h")==0 ) { + pt = strrchr(val->u.sval,'/'); + if ( pt!=NULL ) *pt = '\0'; + } else if ( strcmp(c->tok_text,"t")==0 ) { + pt = strrchr(val->u.sval,'/'); + if ( pt!=NULL ) { + char *ret = copy(pt+1); + free(val->u.sval); + val->u.sval = ret; + } + } else if ( strcmp(c->tok_text,"r")==0 ) { + pt = strrchr(val->u.sval,'/'); + if ( pt==NULL ) pt=val->u.sval; + ept = strrchr(pt,'.'); + if ( ept!=NULL ) *ept = '\0'; + } else if ( strcmp(c->tok_text,"e")==0 ) { + pt = strrchr(val->u.sval,'/'); + if ( pt==NULL ) pt=val->u.sval; + ept = strrchr(pt,'.'); + if ( ept!=NULL ) { + char *ret = copy(ept+1); + free(val->u.sval); + val->u.sval = ret; + } + } else + errors(c,"Unknown colon substitution", c->tok_text ); + } + } + } else if ( tok==tt_lparen ) { + if ( c->donteval ) { + docall(c,NULL,val); + } else { + dereflvalif(val); + if ( val->type!=v_str ) { + error(c,"Expected string to hold filename in procedure call"); + } else + docall(c,val->u.sval,val); + } + } else if ( tok==tt_lbracket ) { + expr(c,&temp); + tok = NextToken(c); + expect(c,tt_rbracket,tok); + if ( !c->donteval ) { + dereflvalif(&temp); + if ( val->type==v_lval && (val->u.lval->type==v_arr ||val->u.lval->type==v_arrfree)) + *val = *val->u.lval; + if ( val->type!=v_arr && val->type!=v_arrfree ) + error(c,"Array required"); + if (temp.type!=v_int ) + error(c,"Integer expression required in array"); + else if ( temp.u.ival<0 || temp.u.ival>=val->u.aval->argc ) + error(c,"Integer expression out of bounds in array"); + else if ( val->type==v_arrfree ) { + temp = val->u.aval->vals[temp.u.ival]; + arrayfree(val->u.aval); + *val = temp; + } else { + val->type = v_lval; + val->u.lval = &val->u.aval->vals[temp.u.ival]; + } + } + } else if ( !c->donteval ) { + Val temp; + if ( val->type!=v_lval ) + error( c, "Expected lvalue" ); + if ( val->u.lval->type!=v_int && val->u.lval->type!=v_unicode ) + error( c, "Invalid type in integer expression" ); + temp = *val->u.lval; + if ( tok == tt_incr ) + ++val->u.lval->u.ival; + else + --val->u.lval->u.ival; + *val = temp; + } + tok = NextToken(c); + } + backuptok(c); +} + +static void mul(Context *c,Val *val) { + Val other; + enum token_type tok; + + term(c,val); + tok = NextToken(c); + while ( tok==tt_mul || tok==tt_div || tok==tt_mod ) { + other.type = v_void; + term(c,&other); + if ( !c->donteval ) { + dereflvalif(val); + dereflvalif(&other); + if ( val->type!=v_int || other.type!=v_int ) + error( c, "Invalid type in integer expression" ); + else if ( (tok==tt_div || tok==tt_mod ) && other.u.ival==0 ) + error( c, "Division by zero" ); + else if ( tok==tt_mul ) + val->u.ival *= other.u.ival; + else if ( tok==tt_mod ) + val->u.ival %= other.u.ival; + else + val->u.ival /= other.u.ival; + } + tok = NextToken(c); + } + backuptok(c); +} + +static void add(Context *c,Val *val) { + Val other; + enum token_type tok; + + mul(c,val); + tok = NextToken(c); + while ( tok==tt_plus || tok==tt_minus ) { + other.type = v_void; + mul(c,&other); + if ( !c->donteval ) { + dereflvalif(val); + dereflvalif(&other); + if ( val->type==v_str && (other.type==v_str || other.type==v_int) && tok==tt_plus ) { + char *ret, *temp; + char buffer[10]; + if ( other.type == v_int ) { + sprintf(buffer,"%d", other.u.ival); + temp = buffer; + } else + temp = other.u.sval; + ret = galloc(strlen(val->u.sval)+strlen(temp)+1); + strcpy(ret,val->u.sval); + strcat(ret,temp); + if ( other.type==v_str ) free(other.u.sval); + free(val->u.sval); + val->u.sval = ret; + } else if ( (val->type!=v_int && val->type!=v_unicode) || (other.type!=v_int&&other.type!=v_unicode) ) + error( c, "Invalid type in integer expression" ); + else if ( tok==tt_plus ) + val->u.ival += other.u.ival; + else + val->u.ival -= other.u.ival; + } + tok = NextToken(c); + } + backuptok(c); +} + +static void comp(Context *c,Val *val) { + Val other; + int cmp; + enum token_type tok; + + add(c,val); + tok = NextToken(c); + while ( tok==tt_eq || tok==tt_ne || tok==tt_gt || tok==tt_lt || tok==tt_ge || tok==tt_le ) { + other.type = v_void; + add(c,&other); + if ( !c->donteval ) { + dereflvalif(val); + dereflvalif(&other); + if ( val->type==v_str && other.type==v_str ) { + cmp = strcmp(val->u.sval,other.u.sval); + free(val->u.sval); free(other.u.sval); + } else if (( val->type==v_int || val->type==v_unicode ) && + (other.type==v_int || other.type==v_unicode)) { + cmp = val->u.ival - other.u.ival; + } else + error( c, "Invalid type in integer expression" ); + val->type = v_int; + if ( tok==tt_eq ) val->u.ival = (cmp==0); + else if ( tok==tt_ne ) val->u.ival = (cmp!=0); + else if ( tok==tt_gt ) val->u.ival = (cmp>0); + else if ( tok==tt_lt ) val->u.ival = (cmp<0); + else if ( tok==tt_ge ) val->u.ival = (cmp>=0); + else if ( tok==tt_le ) val->u.ival = (cmp<=0); + } + tok = NextToken(c); + } + backuptok(c); +} + +static void _and(Context *c,Val *val) { + Val other; + int old = c->donteval; + enum token_type tok; + + comp(c,val); + tok = NextToken(c); + while ( tok==tt_and || tok==tt_bitand ) { + other.type = v_void; + if ( !c->donteval ) + dereflvalif(val); + if ( tok==tt_and && val->u.ival==0 ) + c->donteval = true; + comp(c,&other); + c->donteval = old; + if ( !old ) { + dereflvalif(&other); + if ( tok==tt_and && val->type==v_int && val->u.ival==0 ) + val->u.ival = 0; + else if ( val->type!=v_int || other.type!=v_int ) + error( c, "Invalid type in integer expression" ); + else if ( tok==tt_and ) + val->u.ival = val->u.ival && other.u.ival; + else + val->u.ival &= other.u.ival; + } + tok = NextToken(c); + } + backuptok(c); +} + +static void _or(Context *c,Val *val) { + Val other; + int old = c->donteval; + enum token_type tok; + + _and(c,val); + tok = NextToken(c); + while ( tok==tt_or || tok==tt_bitor || tok==tt_xor ) { + other.type = v_void; + if ( !c->donteval ) + dereflvalif(val); + if ( tok==tt_or && val->u.ival!=0 ) + c->donteval = true; + _and(c,&other); + c->donteval = old; + if ( !c->donteval ) { + dereflvalif(&other); + if ( tok==tt_or && val->type==v_int && val->u.ival!=0 ) + val->u.ival = 1; + else if ( val->type!=v_int || other.type!=v_int ) + error( c, "Invalid type in integer expression" ); + else if ( tok==tt_or ) + val->u.ival = val->u.ival || other.u.ival; + else if ( tok==tt_bitor ) + val->u.ival |= other.u.ival; + else + val->u.ival ^= other.u.ival; + } + tok = NextToken(c); + } + backuptok(c); +} + +static void assign(Context *c,Val *val) { + Val other; + enum token_type tok; + + _or(c,val); + tok = NextToken(c); + if ( tok==tt_assign || tok==tt_pluseq || tok==tt_minuseq || tok==tt_muleq || tok==tt_diveq || tok==tt_modeq ) { + other.type = v_void; + assign(c,&other); /* that's the evaluation order here */ + if ( !c->donteval ) { + dereflvalif(&other); + if ( val->type!=v_lval ) + error( c, "Expected lvalue" ); + else if ( other.type == v_void ) + error( c, "Void found on right side of assignment" ); + else if ( tok==tt_assign ) { + Val temp; + int argi; + temp = *val->u.lval; + *val->u.lval = other; + if ( other.type==v_arr ) + val->u.lval->u.aval = arraycopy(other.u.aval); + else if ( other.type==v_arrfree ) + val->u.lval->type = v_arr; + argi = val->u.lval-c->a.vals; + /* Have to free things after we copy them */ + if ( argi>=0 && argia.argc && temp.type==v_arr && + temp.u.aval==c->dontfree[argi] ) + c->dontfree[argi] = NULL; /* Don't free it */ + else if ( temp.type == v_arr ) + arrayfree(temp.u.aval); + else if ( temp.type == v_str ) + free( temp.u.sval); + } else if (( val->u.lval->type==v_int || val->u.lval->type==v_unicode ) && (other.type==v_int || other.type==v_unicode)) { + if ( tok==tt_pluseq ) val->u.lval->u.ival += other.u.ival; + else if ( tok==tt_minuseq ) val->u.lval->u.ival -= other.u.ival; + else if ( tok==tt_muleq ) val->u.lval->u.ival *= other.u.ival; + else if ( other.u.ival==0 ) + error(c,"Divide by zero"); + else if ( tok==tt_modeq ) val->u.lval->u.ival %= other.u.ival; + else val->u.lval->u.ival /= other.u.ival; + } else if ( tok==tt_pluseq && val->u.lval->type==v_str && + (other.type==v_str || other.type==v_int)) { + char *ret, *temp; + char buffer[10]; + if ( other.type == v_int ) { + sprintf(buffer,"%d", other.u.ival); + temp = buffer; + } else + temp = other.u.sval; + ret = galloc(strlen(val->u.lval->u.sval)+strlen(temp)+1); + strcpy(ret,val->u.lval->u.sval); + strcat(ret,temp); + if ( other.type==v_str ) free(other.u.sval); + free(val->u.lval->u.sval); + val->u.sval = ret; + } else + error( c, "Invalid types in assignment"); + } + } else + backuptok(c); +} + +static void expr(Context *c,Val *val) { + val->type = v_void; + assign(c,val); +} + +static void doforeach(Context *c) { + long here = ctell(c); + int lineno = c->lineno; + enum token_type tok; + int i, selsize; + char *sel; + int nest; + + if ( c->curfv==NULL ) + error(c,"foreach requires an active font"); + selsize = c->curfv->sf->charcnt; + sel = galloc(selsize); + memcpy(sel,c->curfv->selected,selsize); + memset(c->curfv->selected,0,selsize); + i = 0; + + while ( 1 ) { + while ( icurfv->sf->charcnt && !sel[i]) ++i; + if ( i>=selsize || i>=c->curfv->sf->charcnt ) + break; + c->curfv->selected[i] = true; + while ( (tok=NextToken(c))!=tt_endloop && tok!=tt_eof && !c->returned ) { + backuptok(c); + statement(c); + } + c->curfv->selected[i] = false; + if ( tok==tt_eof ) + error(c,"End of file found in foreach loop" ); + cseek(c,here); + c->lineno = lineno; + ++i; + } + + nest = 0; + while ( (tok=NextToken(c))!=tt_endloop || nest>0 ) { + if ( tok==tt_eof ) + error(c,"End of file found in foreach loop" ); + else if ( tok==tt_while ) ++nest; + else if ( tok==tt_foreach ) ++nest; + else if ( tok==tt_endloop ) --nest; + } + if ( selsize==c->curfv->sf->charcnt ) + memcpy(c->curfv->selected,sel,selsize); + free(sel); +} + +static void dowhile(Context *c) { + long here = ctell(c); + int lineno = c->lineno; + enum token_type tok; + Val val; + int nest; + + while ( 1 ) { + tok=NextToken(c); + expect(c,tt_lparen,tok); + val.type = v_void; + expr(c,&val); + tok=NextToken(c); + expect(c,tt_rparen,tok); + dereflvalif(&val); + if ( val.type!=v_int ) + error( c, "Expected integer expression in while condition"); + if ( val.u.ival==0 ) + break; + while ( (tok=NextToken(c))!=tt_endloop && tok!=tt_eof && !c->returned ) { + backuptok(c); + statement(c); + } + if ( tok==tt_eof ) + error(c,"End of file found in while loop" ); + cseek(c,here); + c->lineno = lineno; + } + + nest = 0; + while ( (tok=NextToken(c))!=tt_endloop || nest>0 ) { + if ( tok==tt_eof ) + error(c,"End of file found in while loop" ); + else if ( tok==tt_while ) ++nest; + else if ( tok==tt_foreach ) ++nest; + else if ( tok==tt_endloop ) --nest; + } +} + +static void doif(Context *c) { + enum token_type tok; + Val val; + int nest; + + while ( 1 ) { + tok=NextToken(c); + expect(c,tt_lparen,tok); + val.type = v_void; + expr(c,&val); + tok=NextToken(c); + expect(c,tt_rparen,tok); + dereflvalif(&val); + if ( val.type!=v_int ) + error( c, "Expected integer expression in if condition"); + if ( val.u.ival!=0 ) { + while ( (tok=NextToken(c))!=tt_endif && tok!=tt_eof && tok!=tt_else && tok!=tt_elseif && !c->returned ) { + backuptok(c); + statement(c); + } + if ( tok==tt_eof ) + error(c,"End of file found in if statement" ); + break; + } else { + nest = 0; + while ( ((tok=NextToken(c))!=tt_endif && tok!=tt_else && tok!=tt_elseif ) || nest>0 ) { + if ( tok==tt_eof ) + error(c,"End of file found in if statement" ); + else if ( tok==tt_if ) ++nest; + else if ( tok==tt_endif ) --nest; + } + if ( tok==tt_else ) { + while ( (tok=NextToken(c))!=tt_endif && tok!=tt_eof && !c->returned ) { + backuptok(c); + statement(c); + } + break; + } else if ( tok==tt_endif ) + break; + } + } + if ( c->returned ) +return; + if ( tok!=tt_endif && tok!=tt_eof ) { + nest = 0; + while ( (tok=NextToken(c))!=tt_endif || nest>0 ) { + if ( tok==tt_eof ) +return; + else if ( tok==tt_if ) ++nest; + else if ( tok==tt_endif ) --nest; + } + } +} + +static void doshift(Context *c) { + int i; + + if ( c->a.argc==1 ) + error(c,"Attempt to shift when there are no arguments left"); + if ( c->a.vals[1].type==v_str ) + free(c->a.vals[1].u.sval ); + if ( c->a.vals[1].type==v_arr && c->a.vals[1].u.aval != c->dontfree[1] ) + arrayfree(c->a.vals[1].u.aval ); + --c->a.argc; + for ( i=1; ia.argc ; ++i ) { + c->a.vals[i] = c->a.vals[i+1]; + c->dontfree[i] = c->dontfree[i+1]; + } +} + +static void statement(Context *c) { + enum token_type tok = NextToken(c); + Val val; + + if ( tok==tt_while ) + dowhile(c); + else if ( tok==tt_foreach ) + doforeach(c); + else if ( tok==tt_if ) + doif(c); + else if ( tok==tt_shift ) + doshift(c); + else if ( tok==tt_else || tok==tt_elseif || tok==tt_endif || tok==tt_endloop ) { + unexpected(c,tok); + } else if ( tok==tt_return ) { + tok = NextToken(c); + backuptok(c); + c->returned = true; + c->return_val.type = v_void; + if ( tok!=tt_eos ) { + expr(c,&c->return_val); + dereflvalif(&c->return_val); + if ( c->return_val.type==v_arr ) { + c->return_val.type = v_arrfree; + c->return_val.u.aval = arraycopy(c->return_val.u.aval); + } + } + } else if ( tok==tt_eos ) { + backuptok(c); + } else { + backuptok(c); + expr(c,&val); + if ( val.type == v_str ) + free( val.u.sval ); + } + tok = NextToken(c); + if ( tok!=tt_eos && tok!=tt_eof && !c->returned ) + error( c, "Unterminated statement" ); +} + +static FILE *CopyNonSeekableFile(FILE *former) { + int ch = '\n'; + FILE *temp = tmpfile(); + int istty = isatty(fileno(former)) && former==stdin; + + if ( temp==NULL ) +return( former ); + if ( istty ) + printf( "Type in your script file. Processing will not begin until all the script\n" ); + printf( " has been input (ie. until you have pressed ^D)\n" ); + while ( 1 ) { + if ( ch=='\n' && istty ) + printf( "> " ); + ch = getc(former); + if ( ch==EOF ) + break; + putc(ch,temp); + } + if ( istty ) + printf( "\n" ); + rewind(temp); +return( temp ); +} + +static void VerboseCheck(void) { + if ( verbose==-1 ) + verbose = getenv("FONTFORGE_VERBOSE")!=NULL; +} + +static void ProcessScript(int argc, char *argv[], FILE *script) { + int i,j; + Context c; + enum token_type tok; + + VerboseCheck(); + + i=1; + if ( script!=NULL ) { + if ( argc<2 || strcmp(argv[1],"-")!=0 ) + i = 0; + } else if ( strcmp(argv[1],"-nosplash")==0 || strcmp(argv[1],"--nosplash")==0 ) { + ++i; + if ( strcmp(argv[2],"-script")==0 || strcmp(argv[2],"--script")==0 ) + ++i; + } else if ( strcmp(argv[1],"-script")==0 || strcmp(argv[1],"--script")==0 ) + ++i; + memset( &c,0,sizeof(c)); + c.a.argc = argc-i; + c.a.vals = galloc(c.a.argc*sizeof(Val)); + c.dontfree = gcalloc(c.a.argc,sizeof(Array*)); + for ( j=i; j=3 && ( strcmp(argv[2],"-script")==0 || strcmp(argv[2],"--script")==0 )) + ProcessScript(argc, argv,NULL); + if ( access(argv[1],X_OK|R_OK)==0 ) { + FILE *temp = fopen(argv[1],"r"); + char buffer[200]; + if ( temp==NULL ) +return; + buffer[0] = '\0'; + fgets(buffer,sizeof(buffer),temp); + fclose(temp); + if ( buffer[0]=='#' && buffer[1]=='!' && + (strstr(buffer,"pfaedit")!=NULL || strstr(buffer,"fontforge")!=NULL )) + ProcessScript(argc, argv,NULL); + } + if ( strcmp(argv[1],"-")==0 ) /* Someone thought that, of course, "-" meant read from a script. I guess it makes no sense with anything else... */ + ProcessScript(argc, argv,stdin); +} + +#ifdef X_DISPLAY_MISSING +static void _doscriptusage(void) { + printf( "fontforge [options]\n" ); + printf( "\t-usage\t\t\t (displays this message, and exits)\n" ); + printf( "\t-help\t\t\t (displays this message, invokes a browser)\n\t\t\t\t (Using the BROWSER environment variable)\n" ); + printf( "\t-version\t\t (prints the version of fontforge and exits)\n" ); + printf( "\t-script scriptfile\t (executes scriptfile)\n" ); + printf( "\n" ); + printf( "If no scriptfile is given (or if it's \"-\") FontForge will read stdin\n" ); + printf( "FontForge will read postscript (pfa, pfb, ps, cid), opentype (otf),\n" ); + printf( "\ttruetype (ttf,ttc), macintosh resource fonts (dfont,bin,hqx),\n" ); + printf( "\tand bdf and pcf fonts. It will also read it's own format --\n" ); + printf( "\tsfd files.\n" ); + printf( "Any arguments after the script file will be passed to it.\n"); + printf( "If the first argument is an executable filename, and that file's first\n" ); + printf( "\tline contains \"fontforge\" then it will be treated as a scriptfile.\n\n" ); + printf( "For more information see:\n\thttp://fontforge.sourceforge.net/\n" ); + printf( "Send bug reports to:\tfontforge-devel@lists.sourceforge.net\n" ); +} + +static void doscriptusage(void) { + _doscriptusage(); +exit(0); +} + +static void doscripthelp(void) { + _doscriptusage(); + help("overview.html"); +exit(0); +} +#endif + +void CheckIsScript(int argc, char *argv[]) { + _CheckIsScript(argc, argv); +#ifdef X_DISPLAY_MISSING + if ( argc==2 ) { + char *pt = argv[1]; + if ( *pt=='-' && pt[1]=='-' ) ++pt; + if ( strcmp(pt,"-usage")==0 ) + doscriptusage(); + else if ( strcmp(pt,"-help")==0 ) + doscripthelp(); + else if ( strcmp(pt,"-version")==0 ) + doversion(); + } + ProcessScript(argc, argv,stdin); +#endif +} + +void ExecuteScriptFile(FontView *fv, char *filename) { + Context c; + Val argv[1]; + Array *dontfree[1]; + enum token_type tok; + jmp_buf env; + + VerboseCheck(); + + memset( &c,0,sizeof(c)); + c.a.argc = 1; + c.a.vals = argv; + c.dontfree = dontfree; + argv[0].type = v_str; + argv[0].u.sval = filename; + c.filename = filename; + c.return_val.type = v_void; + c.err_env = &env; + c.curfv = fv; + if ( setjmp(env)!=0 ) +return; /* Error return */ + + c.script = fopen(c.filename,"r"); + if ( c.script==NULL ) + error(&c, "No such file"); + else { + c.lineno = 1; + while ( !c.returned && (tok = NextToken(&c))!=tt_eof ) { + backuptok(&c); + statement(&c); + } + fclose(c.script); + } +} + +struct sd_data { + int done; + FontView *fv; + GWindow gw; + int oldh; +}; + +#define SD_Width 250 +#define SD_Height 270 +#define CID_Script 1001 +#define CID_Box 1002 +#define CID_OK 1003 +#define CID_Call 1004 +#define CID_Cancel 1005 + +static int SD_Call(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + static unichar_t filter[] = { '*',/*'.','p','e',*/ 0 }; + unichar_t *fn; + unichar_t *insert; + + fn = GWidgetOpenFile(GStringGetResource(_STR_CallScript,NULL), NULL, filter, NULL, NULL); + if ( fn==NULL ) +return(true); + insert = galloc((u_strlen(fn)+10)*sizeof(unichar_t)); + *insert = '"'; + u_strcpy(insert+1,fn); + uc_strcat(insert,"\"()"); + GTextFieldReplace(GWidgetGetControl(GGadgetGetWindow(g),CID_Script),insert); + free(insert); + free(fn); + } +return( true ); +} + +static int SD_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct sd_data *sd = GDrawGetUserData(GGadgetGetWindow(g)); + Context c; + Val args[1]; + Array *dontfree[1]; + jmp_buf env; + enum token_type tok; + + memset( &c,0,sizeof(c)); + memset( args,0,sizeof(args)); + memset( dontfree,0,sizeof(dontfree)); + c.a.argc = 1; + c.a.vals = args; + c.dontfree = dontfree; + c.filename = args[0].u.sval = "ScriptDlg"; + args[0].type = v_str; + c.return_val.type = v_void; + c.err_env = &env; + c.curfv = sd->fv; + if ( setjmp(env)!=0 ) +return( true ); /* Error return */ + + c.script = tmpfile(); + if ( c.script==NULL ) + error(&c, "Can't create temporary file"); + else { + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(sd->gw,CID_Script)); + while ( *ret ) { + /* There's a bug here. Filenames need to be converted to the local charset !!!! */ + putc(*ret,c.script); + ++ret; + } + rewind(c.script); + VerboseCheck(); + c.lineno = 1; + while ( !c.returned && (tok = NextToken(&c))!=tt_eof ) { + backuptok(&c); + statement(&c); + } + fclose(c.script); + sd->done = true; + } + } +return( true ); +} + +static void SD_DoCancel(struct sd_data *sd) { + sd->done = true; +} + +static int SD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SD_DoCancel( GDrawGetUserData(GGadgetGetWindow(g))); + } +return( true ); +} + +static int sd_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + SD_DoCancel( GDrawGetUserData(gw)); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("scripting.html"); +return( true ); + } +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } else if ( event->type == et_resize ) { + struct sd_data *sd = GDrawGetUserData(gw); + GRect newsize, gpos; + int space; + GDrawGetSize(gw,&newsize); + GGadgetGetSize(GWidgetGetControl(gw,CID_Script),&gpos); + space = sd->oldh - gpos.height; + GGadgetResize(GWidgetGetControl(gw,CID_Box),newsize.width-4,newsize.height-4); + GGadgetResize(GWidgetGetControl(gw,CID_Script),newsize.width-2*gpos.x,newsize.height-space); + GGadgetGetSize(GWidgetGetControl(gw,CID_Call),&gpos); + space = sd->oldh - gpos.y; + GGadgetMove(GWidgetGetControl(gw,CID_Call),gpos.x,newsize.height-space); + GGadgetGetSize(GWidgetGetControl(gw,CID_OK),&gpos); + space = sd->oldh - gpos.y; + GGadgetMove(GWidgetGetControl(gw,CID_OK),gpos.x,newsize.height-space); + GGadgetGetSize(GWidgetGetControl(gw,CID_Cancel),&gpos); + space = sd->oldh - gpos.y; + GGadgetMove(GWidgetGetControl(gw,CID_Cancel),gpos.x,newsize.height-space); + sd->oldh = newsize.height; + GDrawRequestExpose(gw,NULL,false); + } +return( true ); +} + +void ScriptDlg(FontView *fv) { + GRect pos; + static GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[10]; + GTextInfo label[10]; + struct sd_data sd; + FontView *list; + + memset(&sd,0,sizeof(sd)); + sd.fv = fv; + sd.oldh = pos.height = GDrawPointsToPixels(NULL,SD_Height); + + if ( gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict|wam_isdlg; + wattrs.event_masks = ~(1<next ) + GDrawRequestExpose(list->v,NULL,false); +} diff --git a/fontforge/sd.h b/fontforge/sd.h new file mode 100644 index 00000000..e7efe943 --- /dev/null +++ b/fontforge/sd.h @@ -0,0 +1,111 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SD_H +#define _SD_H + +/* All coordinates are in millimeters */ +/* they will be displayed to the user scaled by the units field of the design */ + +#include "splinefont.h" +#include "gdraw.h" + +typedef struct entpen { + Color col; + struct tile *tile; + float scale; + float opacity; +} Pen; + +typedef struct textunit { + unichar_t *text; + SplineFont *sf; + float size; /* in points */ + float kernafter; + Pen fill; + struct textunit *next; +} TextUnit; + +typedef struct entity { + enum entity_type { et_splines, et_text, et_image, et_group } type; + union { + struct filledsplines { + SplineSet *splines; + unsigned int isfillable: 1; /* All splinesets are closed */ + Pen fill, stroke; /* A value of 0xffffffff means do not fill or stroke */ + float stroke_width; + enum linejoin join; + enum linecap cap; + real transform[6]; /* The stroke may be quite different depending on the transformation (ie. ellipse not circle, rotated, etc) */ + } splines; + struct text { + TextUnit *text; + real transform[6]; + struct entity *bound; + } text; + struct image { + GImage *image; + real transform[6]; + } image; + struct group { + struct entity *group; + } group; + } u; + DBounds bb; + struct entity *next; +} Entity; + +typedef struct entlayer { + Entity *entities; + char *name; + unsigned int isvisible: 1; +} EntLayer; + +typedef struct tile { + Entity *tile; + struct tileinstance { real scale; GWindow pixmap; struct tileinstance *next; } + *instances; + char *name; +} Tile; + +typedef struct splinedesign { + int lcnt, lmax, active; + EntLayer *layers; + + real width, height; /* in millimeters */ + int16 hpages, vpages; + real pwidth, pheight; /* in millimeters */ + real units; /* if user wants to see things in */ + /* centimeters then units will be 10, if inches then 25.4, if points */ + /* then 25.4/72, if 1/1200" then 25.4/1200, etc. */ + struct dview *dvs; +} SplineDesign, Design; + +extern Entity *EntityInterpretPS(FILE *ps); +extern Entity *EntityInterpretSVG(char *filename,int em_size,int ascent); +extern SplinePointList *SplinesFromEntities(Entity *ent,int *flags); +extern void SCAppendEntityLayers(SplineChar *sc, Entity *ent); +#endif diff --git a/fontforge/search.c b/fontforge/search.c new file mode 100644 index 00000000..744ec6bb --- /dev/null +++ b/fontforge/search.c @@ -0,0 +1,1423 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "nomen.h" +#include +#include +#include +#include + +static SearchView *searcher=NULL; + +#define CID_Allow 1000 +#define CID_Flipping 1001 +#define CID_Scaling 1002 +#define CID_Rotating 1003 +#define CID_Selected 1004 +#define CID_Find 1005 +#define CID_FindAll 1006 +#define CID_Replace 1007 +#define CID_ReplaceAll 1008 +#define CID_Cancel 1009 + +static int CoordMatches(real real_off, real search_off, SearchView *s) { + real fudge; + if ( real_off >= search_off-s->fudge && real_off <= search_off+s->fudge ) +return( true ); + fudge = s->fudge_percent*search_off; + if ( fudge<0 ) fudge = -fudge; + if ( real_off >= search_off-fudge && real_off <= search_off+fudge ) +return( true ); +return( false ); +} + +static int BPMatches(BasePoint *sc_p1,BasePoint *sc_p2,BasePoint *p_p1,BasePoint *p_p2, + int flip,real rot, real scale,SearchView *s) { + real sxoff, syoff, pxoff, pyoff; + + sxoff = sc_p1->x-sc_p2->x; + syoff = sc_p1->y-sc_p2->y; + pxoff = p_p1->x-p_p2->x; + pyoff = p_p1->y-p_p2->y; + if ( flip&1 ) + sxoff = -sxoff; + if ( flip&2 ) + syoff = -syoff; + sxoff *= scale; + syoff *= scale; + if ( rot==0 ) +return( CoordMatches(sxoff,pxoff,s) && CoordMatches(syoff,pyoff,s)); + +return( CoordMatches(sxoff*s->matched_co+syoff*s->matched_si,pxoff,s) && + CoordMatches(-sxoff*s->matched_si+syoff*s->matched_co,pyoff,s) ); +} + +static int SPMatchesF(SplinePoint *sp, SearchView *s, SplineSet *path, int substring ) { + SplinePoint *sc_sp, *nsc_sp, *p_sp, *np_sp; + int flip, flipmax; + double rot, scale; + + s->matched_sp = sp; + for (sc_sp=sp, p_sp=path->first; ; ) { + if ( p_sp->next==NULL ) { + if ( substring || sc_sp->next==NULL ) { + s->last_sp = sc_sp; +return( true ); + } + break; + } + np_sp = p_sp->next->to; + if ( sc_sp->next==NULL ) + break; + nsc_sp = sc_sp->next->to; + if ( !CoordMatches(sc_sp->nextcp.x-sc_sp->me.x,p_sp->nextcp.x-p_sp->me.x,s) || + !CoordMatches(sc_sp->nextcp.y-sc_sp->me.y,p_sp->nextcp.y-p_sp->me.y,s) || + !CoordMatches(nsc_sp->me.x-sc_sp->me.x,np_sp->me.x-p_sp->me.x,s) || + !CoordMatches(nsc_sp->me.y-sc_sp->me.y,np_sp->me.y-p_sp->me.y,s) || + !CoordMatches(nsc_sp->prevcp.x-nsc_sp->me.x,np_sp->prevcp.x-np_sp->me.x,s) || + !CoordMatches(nsc_sp->prevcp.y-nsc_sp->me.y,np_sp->prevcp.y-np_sp->me.y,s) ) + break; + if ( np_sp==path->first ) { + if ( nsc_sp==sp ) { + s->last_sp = sp; +return( true ); + } + break; + } + sc_sp = nsc_sp; + p_sp = np_sp; + } + + if ( s->tryflips ) for ( flip=flip_x ; flip<=flip_xy; ++flip ) { + int xsign = (flip&1) ? -1 : 1, ysign = (flip&2) ? -1 : 1; + for (sc_sp=sp, p_sp=path->first; ; ) { + if ( p_sp->next==NULL ) { + if ( substring || sc_sp->next==NULL ) { + s->matched_flip = flip; + s->last_sp = sc_sp; +return( true ); + } else + break; + } + np_sp = p_sp->next->to; + if ( sc_sp->next==NULL ) + break; + nsc_sp = sc_sp->next->to; + if ( !CoordMatches(sc_sp->nextcp.x-sc_sp->me.x,xsign*(p_sp->nextcp.x-p_sp->me.x),s) || + !CoordMatches(sc_sp->nextcp.y-sc_sp->me.y,ysign*(p_sp->nextcp.y-p_sp->me.y),s) || + !CoordMatches(nsc_sp->me.x-sc_sp->me.x,xsign*(np_sp->me.x-p_sp->me.x),s) || + !CoordMatches(nsc_sp->me.y-sc_sp->me.y,ysign*(np_sp->me.y-p_sp->me.y),s) || + !CoordMatches(nsc_sp->prevcp.x-nsc_sp->me.x,xsign*(np_sp->prevcp.x-np_sp->me.x),s) || + !CoordMatches(nsc_sp->prevcp.y-nsc_sp->me.y,ysign*(np_sp->prevcp.y-np_sp->me.y),s) ) + break; + if ( np_sp==path->first ) { + if ( nsc_sp==sp ) { + s->matched_flip = flip; + s->last_sp = sp; +return( true ); + } else + break; + } + sc_sp = nsc_sp; + p_sp = np_sp; + } + } + + if ( s->tryrotate || s->tryscale ) { + if ( s->tryflips ) + flipmax = flip_xy; + else + flipmax = flip_none; + for ( flip=flip_none ; flipfirst; + np_sp = p_sp->next->to; /* if p_sp->next were NULL, we'd have returned by now */ + sc_sp = sp; + if ( sc_sp->next==NULL ) +return( false ); + nsc_sp = sc_sp->next->to; + if ( p_sp->me.x==np_sp->me.x && p_sp->me.y==np_sp->me.y ) +return( false ); + if ( sc_sp->me.x==nsc_sp->me.x && sc_sp->me.y==nsc_sp->me.y ) +return( false ); + if ( !s->tryrotate ) { + if ( p_sp->me.x==np_sp->me.x ) + scale = (np_sp->me.y-p_sp->me.y) / (nsc_sp->me.y-sc_sp->me.y); + else if ( p_sp->me.y==np_sp->me.y ) + scale = (np_sp->me.x-p_sp->me.x) / (nsc_sp->me.x-sc_sp->me.x); + else { + real yscale = (np_sp->me.y-p_sp->me.y) / (nsc_sp->me.y-sc_sp->me.y); + scale = (np_sp->me.x-p_sp->me.x) / (nsc_sp->me.x-sc_sp->me.x); + if ( scale<.99*yscale || scale>1.01*yscale ) + return( false ); + } + rot = 0; + } else { + int xsign = (flip&1)?-1:1, ysign=(flip&2)?-1:1; + rot = atan2(xsign*(nsc_sp->me.y-sc_sp->me.y),ysign*(nsc_sp->me.x-sc_sp->me.x)) - + atan2(np_sp->me.y-p_sp->me.y,np_sp->me.x-p_sp->me.x); + if ( !s->tryscale ) + scale = 1; + else + scale = sqrt( ((np_sp->me.y-p_sp->me.y)*(np_sp->me.y-p_sp->me.y) + + (np_sp->me.x-p_sp->me.x)*(np_sp->me.x-p_sp->me.x))/ + ((nsc_sp->me.y-sc_sp->me.y)*(nsc_sp->me.y-sc_sp->me.y) + + (nsc_sp->me.x-sc_sp->me.x)*(nsc_sp->me.x-sc_sp->me.x)) ); + } + if ( scale>-.00001 && scale<.00001 ) +return( false ); + s->matched_rot = rot; + if ( rot==0 ) + s->matched_co=1,s->matched_si=0; + else if ( rot>3.14159 && rot<3.141595 ) + s->matched_co=-1,s->matched_si=0; + else if ( rot>1.570793 && rot<1.570799 ) + s->matched_co=0,s->matched_si=1; + else if ( (rot>4.712386 && rot<4.712392 ) || + (rot<-1.570793 && rot>-1.570799 ) ) + s->matched_co=0,s->matched_si=-1; + else + s->matched_co = cos(rot), s->matched_si = sin(rot); + for (sc_sp=sp, p_sp=path->first; ; ) { + if ( p_sp->next==NULL ) { + if ( substring || sc_sp->next==NULL ) { + s->matched_flip = flip; + s->matched_rot = rot; + s->matched_scale = scale; + s->last_sp = sc_sp; +return( true ); + } else +return( false ); + } + np_sp = p_sp->next->to; + if ( sc_sp->next==NULL ) +return( false ); + nsc_sp = sc_sp->next->to; + if ( !BPMatches(&sc_sp->nextcp,&sc_sp->me,&p_sp->nextcp,&p_sp->me,flip,rot,scale,s) || + !BPMatches(&nsc_sp->me,&sc_sp->me,&np_sp->me,&p_sp->me,flip,rot,scale,s) || + !BPMatches(&nsc_sp->prevcp,&nsc_sp->me,&np_sp->prevcp,&np_sp->me,flip,rot,scale,s) ) +return( false ); + if ( np_sp==path->first ) { + if ( nsc_sp==sp ) { + s->matched_flip = flip; + s->matched_rot = rot; + s->matched_scale = scale; + s->last_sp = sp; +return( true ); + } else +return( false ); + } + sc_sp = nsc_sp; + p_sp = np_sp; + } + } + } +return( false ); +} + +static int SPMatchesO(SplinePoint *sp, SearchView *s, SplineSet *path) { + SplinePoint *sc_sp, *nsc_sp, *p_sp, *np_sp; + + s->matched_sp = sp; + if ( s->matched_rot==0 && s->matched_scale==1 && s->matched_flip==flip_none ) { + for (sc_sp=sp, p_sp=path->first; ; ) { + if ( p_sp->next==NULL ) +return( sc_sp->next==NULL ); + np_sp = p_sp->next->to; + if ( sc_sp->next==NULL ) +return( false ); + nsc_sp = sc_sp->next->to; + if ( !CoordMatches(sc_sp->nextcp.x-sc_sp->me.x,p_sp->nextcp.x-p_sp->me.x,s) || + !CoordMatches(sc_sp->nextcp.y-sc_sp->me.y,p_sp->nextcp.y-p_sp->me.y,s) || + !CoordMatches(nsc_sp->me.x-sc_sp->me.x,np_sp->me.x-p_sp->me.x,s) || + !CoordMatches(nsc_sp->me.y-sc_sp->me.y,np_sp->me.y-p_sp->me.y,s) || + !CoordMatches(nsc_sp->prevcp.x-nsc_sp->me.x,np_sp->prevcp.x-np_sp->me.x,s) || + !CoordMatches(nsc_sp->prevcp.y-nsc_sp->me.y,np_sp->prevcp.y-np_sp->me.y,s) ) +return( false ); + if ( np_sp==path->first ) +return( nsc_sp==sp ); + sc_sp = nsc_sp; + p_sp = np_sp; + } + } else if ( s->matched_rot==0 && s->matched_scale==1 ) { + int xsign = (s->matched_flip&1) ? -1 : 1, ysign = (s->matched_flip&2) ? -1 : 1; + for (sc_sp=sp, p_sp=path->first; ; ) { + if ( p_sp->next==NULL ) +return( sc_sp->next==NULL ); + np_sp = p_sp->next->to; + if ( sc_sp->next==NULL ) +return( false ); + nsc_sp = sc_sp->next->to; + if ( !CoordMatches(sc_sp->nextcp.x-sc_sp->me.x,xsign*(p_sp->nextcp.x-p_sp->me.x),s) || + !CoordMatches(sc_sp->nextcp.y-sc_sp->me.y,ysign*(p_sp->nextcp.y-p_sp->me.y),s) || + !CoordMatches(nsc_sp->me.x-sc_sp->me.x,xsign*(np_sp->me.x-p_sp->me.x),s) || + !CoordMatches(nsc_sp->me.y-sc_sp->me.y,ysign*(np_sp->me.y-p_sp->me.y),s) || + !CoordMatches(nsc_sp->prevcp.x-nsc_sp->me.x,xsign*(np_sp->prevcp.x-np_sp->me.x),s) || + !CoordMatches(nsc_sp->prevcp.y-nsc_sp->me.y,ysign*(np_sp->prevcp.y-np_sp->me.y),s) ) +return( false ); + if ( np_sp==path->first ) +return( nsc_sp==sp ); + sc_sp = nsc_sp; + p_sp = np_sp; + } + } else { + p_sp = path->first; + for (sc_sp=sp, p_sp=path->first; ; ) { + if ( p_sp->next==NULL ) +return( sc_sp->next==NULL ); + np_sp = p_sp->next->to; + if ( sc_sp->next==NULL ) +return( false ); + nsc_sp = sc_sp->next->to; + if ( !BPMatches(&sc_sp->nextcp,&sc_sp->me,&p_sp->nextcp,&p_sp->me, + s->matched_flip,s->matched_rot,s->matched_scale,s) || + !BPMatches(&nsc_sp->me,&sc_sp->me,&np_sp->me,&p_sp->me, + s->matched_flip,s->matched_rot,s->matched_scale,s) || + !BPMatches(&nsc_sp->prevcp,&nsc_sp->me,&np_sp->prevcp,&np_sp->me, + s->matched_flip,s->matched_rot,s->matched_scale,s) ) +return( false ); + if ( np_sp==path->first ) +return( nsc_sp==sp ); + sc_sp = nsc_sp; + p_sp = np_sp; + } + } +return( false ); +} + +static void SVBuildTrans(SearchView *s,real transform[6]) { + memset(transform,0,sizeof(real [6])); + transform[0] = transform[3] = 1; + if ( s->matched_flip&1 ) + transform[0] = -1; + if ( s->matched_flip&2 ) + transform[3] = -1; + transform[0] *= s->matched_scale; + transform[3] *= s->matched_scale; + transform[1] = -transform[0]*s->matched_si; + transform[0] *= s->matched_co; + transform[2] = transform[3]*s->matched_si; + transform[3] *= s->matched_co; + transform[4] = s->matched_x; + transform[5] = s->matched_y; +} + +static void SVFigureTranslation(SearchView *s,BasePoint *p,SplinePoint *sp) { + real transform[6]; + BasePoint res; + + SVBuildTrans(s,transform); + res.x = transform[0]*p->x + transform[2]*p->y + transform[4]; + res.y = transform[1]*p->x + transform[3]*p->y + transform[5]; + s->matched_x = sp->me.x - res.x; + s->matched_y = sp->me.y - res.y; +} + +static int SPMatches(SplinePoint *sp, SearchView *s, SplineSet *path, int oriented ) { + real transform[6]; + BasePoint *p, res; + if ( oriented ) { + SVBuildTrans(s,transform); + p = &path->first->me; + res.x = transform[0]*p->x + transform[2]*p->y + transform[4]; + res.y = transform[1]*p->x + transform[3]*p->y + transform[5]; + if ( sp->me.x>res.x+.01 || sp->me.xme.y>res.y+.01 || sp->me.yfirst->me,sp); +return( true ); + } +} + +/* We are given a single, unclosed path to match. It is a match if it */ +/* corresponds to any subset of a path in the character */ +static int SCMatchesIncomplete(SplineChar *sc,SearchView *s,int startafter) { + /* don't look in refs because we can't do a replace there */ + SplineSet *spl; + SplinePoint *sp; + + for ( spl=startafter?s->matched_spl:sc->layers[ly_fore].splines; spl!=NULL; spl=spl->next ) { + s->matched_spl = spl; + for ( sp=startafter?s->last_sp:spl->first; ; ) { + if ( SPMatchesF(sp,s,s->path,true)) { + SVFigureTranslation(s,&s->path->first->me,sp); +return( true ); + } else if ( s->tryreverse && SPMatchesF(sp,s,s->revpath,true)) { + SVFigureTranslation(s,&s->revpath->first->me,sp); + s->wasreversed = true; +return( true ); + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + startafter = false; + } +return( false ); +} + +/* We are given several paths/refs to match. We have a match if each path */ +/* matches a path in the character exactly, and each ref also. A searched for*/ +/* path can not match a subset of a path */ +static int SCMatchesFull(SplineChar *sc,SearchView *s) { + /* don't look in refs because we can't do a replace there */ + SplineSet *spl, *s_spl, *s_r_spl; + SplinePoint *sp; + RefChar *r, *s_r; + int i, first; + + s->matched_ss = s->matched_refs = 0; + for ( s_r = s->sc_srch.layers[ly_fore].refs; s_r!=NULL; s_r = s_r->next ) { + for ( r = sc->layers[ly_fore].refs, i=0; r!=NULL; r=r->next, ++i ) if ( !(s->matched_refs&(1<sc == s_r->sc ) /* I should check the transform to see if the tryflips (etc) flags would make this not a match */ + break; + } + if ( r==NULL ) +return( false ); + s->matched_refs |= 1<path, s_r_spl=s->revpath; s_spl!=NULL; s_spl=s_spl->next, s_r_spl = s_r_spl->next ) { + for ( spl=sc->layers[ly_fore].splines, i=0; spl!=NULL; spl=spl->next, ++i ) if ( !(s->matched_ss&(1<matched_spl = spl; + if ( spl->first!=spl->last ) { /* Open */ + if ( s_spl->first!=s_spl->last ) { + if ( SPMatches(spl->first,s,s_spl,1-first)) + break; + if ( s->tryreverse && SPMatches(spl->first,s,s_r_spl,1-first)) { + s->wasreversed = true; + break; + } + } + } else { + if ( s_spl->first==s_spl->last ) { + int found = false; + for ( sp=spl->first; ; ) { + if ( SPMatches(sp,s,s_spl,1-first)) { + found = true; + break; + } + if ( s->tryreverse && SPMatches(sp,s,s_r_spl,1-first)) { + s->wasreversed = found = true; + break; + } + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + if ( found ) + break; + } + } + } + if ( spl==NULL ) +return( false ); + s->matched_ss |= 1<x-shouldberel->x); + yoff = (shouldbe->y-shouldberel->y); + if ( s->matched_flip&1 ) + xoff=-xoff; + if ( s->matched_flip&2 ) + yoff =-yoff; + xoff *= s->matched_scale; + yoff *= s->matched_scale; + changeme->x = xoff*s->matched_co - yoff*s->matched_si + fudge->x + rel->x; + changeme->y = yoff*s->matched_co + xoff*s->matched_si + fudge->y + rel->y; +} + +static void AdjustAll(SplinePoint *change,BasePoint *rel, + BasePoint *shouldbe, BasePoint *shouldberel, + BasePoint *fudge, + SearchView *s) { + BasePoint old; + + old = change->me; + AdjustBP(&change->me,rel,shouldbe,shouldberel,fudge,s); + change->nextcp.x += change->me.x-old.x; change->nextcp.y += change->me.y-old.y; + change->prevcp.x += change->me.x-old.x; change->prevcp.y += change->me.y-old.y; +} + +static SplinePoint *RplInsertSP(SplinePoint *after,SplinePoint *rpl,SearchView *s, BasePoint *fudge) { + SplinePoint *new = chunkalloc(sizeof(SplinePoint)); + real transform[6]; + + SVBuildTrans(s,transform); + transform[4] += fudge->x; transform[5] += fudge->y; + new->me.x = transform[0]*rpl->me.x + transform[2]*rpl->me.y + transform[4]; + new->me.y = transform[1]*rpl->me.x + transform[3]*rpl->me.y + transform[5]; + new->prevcp.x = transform[0]*rpl->prevcp.x + transform[2]*rpl->prevcp.y + transform[4]; + new->prevcp.y = transform[1]*rpl->prevcp.x + transform[3]*rpl->prevcp.y + transform[5]; + new->nextcp.x = transform[0]*rpl->nextcp.x + transform[2]*rpl->nextcp.y + transform[4]; + new->nextcp.y = transform[1]*rpl->nextcp.x + transform[3]*rpl->nextcp.y + transform[5]; + new->pointtype = rpl->pointtype; + new->selected = true; + if ( after->next==NULL ) { + SplineMake(after,new,s->fv->sf->order2); + s->matched_spl->last = new; + } else { + SplinePoint *nsp = after->next->to; + after->next->to = new; + new->prev = after->next; + SplineRefigure(after->next); + SplineMake(new,nsp,s->fv->sf->order2); + } +return( new ); +} + +static void FudgeFigure(SplineChar *sc,SearchView *s,SplineSet *path,BasePoint *fudge) { + SplinePoint *search, *searchrel, *found, *foundrel; + real xoff, yoff; + + fudge->x = fudge->y = 0; + if ( path->first->prev!=NULL ) /* closed path, should end where it began */ +return; /* => no fudge */ + + foundrel = s->matched_sp; searchrel = path->first; + for ( found=foundrel, search=searchrel ; ; ) { + if ( found->next==NULL || search->next==NULL ) + break; + found = found->next->to; + search = search->next->to; + } + + xoff = (found->me.x-foundrel->me.x); + yoff = (found->me.y-foundrel->me.y); + if ( s->matched_flip&1 ) + xoff=-xoff; + if ( s->matched_flip&2 ) + yoff =-yoff; + xoff *= s->matched_scale; + yoff *= s->matched_scale; + fudge->x = xoff*s->matched_co + yoff*s->matched_si - (search->me.x-searchrel->me.x); + fudge->y = yoff*s->matched_co - xoff*s->matched_si - (search->me.y-searchrel->me.y); +} + +static void DoReplaceIncomplete(SplineChar *sc,SearchView *s) { + SplinePoint *sc_p, *nsc_p, *p_p, *np_p, *r_p, *nr_p; + BasePoint fudge; + SplineSet *path, *rpath; + real xoff, yoff, temp; + + if ( s->wasreversed ) { + path = s->revpath; + rpath = s->revreplace; + } else { + path = s->path; + rpath = s->replacepath; + } + + xoff = rpath->first->me.x-path->first->me.x; + yoff = rpath->first->me.y-path->first->me.y; + if ( s->matched_flip&1 ) + xoff=-xoff; + if ( s->matched_flip&2 ) + yoff =-yoff; + xoff *= s->matched_scale; + yoff *= s->matched_scale; + temp = xoff*s->matched_co - yoff*s->matched_si; + yoff = yoff*s->matched_co + xoff*s->matched_si; + xoff = temp; + + /* Total "fudge" amount should be spread evenly over each point */ + FudgeFigure(sc,s,path,&fudge); + if ( s->pointcnt!=s->rpointcnt ) + MinimumDistancesFree(sc->md); sc->md = NULL; + + for ( sc_p = s->matched_sp, p_p = path->first, r_p = rpath->first; ; ) { + if ( p_p->next==NULL && r_p->next==NULL ) { + s->last_sp = sc_p; +return; /* done */ + } else if ( p_p->next==NULL ) { + /* The search pattern is shorter that the replace pattern */ + /* Need to add some extra points */ + r_p = r_p->next->to; + sc_p = RplInsertSP(sc_p,r_p,s,&fudge); + } else if ( r_p->next==NULL ) { + /* The replace pattern is shorter than the search pattern */ + /* Need to remove some points */ + nsc_p = sc_p->next->to; + if ( nsc_p->next==NULL ) { + SplinePointFree(nsc_p); + SplineFree(sc_p->next); + sc_p->next = NULL; + s->matched_spl->last = sc_p; + s->last_sp = sc_p; +return; + } else { + nsc_p = nsc_p->next->to; + SplinePointFree(sc_p->next->to); + SplineFree(sc_p->next); + sc_p->next = nsc_p->prev; + nsc_p->prev->from = sc_p; + SplineRefigure(nsc_p->prev); + } + p_p = p_p->next->to; sc_p = nsc_p; + } else { + if ( sc_p->next==NULL ) { + GDrawIError("Unexpected point mismatch in replace"); +return; + } + np_p = p_p->next->to; nsc_p = sc_p->next->to; nr_p = r_p->next->to; + if ( p_p==path->first ) { + AdjustBP(&sc_p->nextcp,&sc_p->me,&r_p->nextcp,&r_p->me,&fudge,s); + if ( p_p->prev!=NULL ) + AdjustBP(&sc_p->prevcp,&sc_p->me,&r_p->prevcp,&r_p->me,&fudge,s); + sc_p->me.x += xoff; sc_p->me.y += yoff; + sc_p->nextcp.x += xoff; sc_p->nextcp.y += yoff; + sc_p->prevcp.x += xoff; sc_p->prevcp.y += yoff; + if ( sc_p->prev!=NULL ) + SplineRefigure(sc_p->prev); + } + if ( np_p==path->first ) +return; + if ( np_p->next!=NULL ) + AdjustBP(&nsc_p->nextcp,&nsc_p->me,&nr_p->nextcp,&nr_p->me,&fudge,s); + AdjustBP(&nsc_p->prevcp,&nsc_p->me,&nr_p->prevcp,&nr_p->me,&fudge,s); + AdjustAll(nsc_p,&sc_p->me,&nr_p->me,&r_p->me,&fudge,s); + nsc_p->pointtype = nr_p->pointtype; + if ( nsc_p->next!=NULL ) + SplineRefigure(nsc_p->next); + if ( nsc_p->prev!=NULL ) + SplineRefigure(nsc_p->prev); + p_p = np_p; sc_p = nsc_p; r_p = nr_p; + } + } +} + +static void DoReplaceFull(SplineChar *sc,SearchView *s) { + int i; + RefChar *r, *rnext, *new; + SplinePointList *spl, *snext, *sprev, *temp; + real transform[6], subtrans[6]; + SplinePoint *sp; + + /* first remove those bits that matched */ + for ( r = sc->layers[ly_fore].refs, i=0; r!=NULL; r=rnext, ++i ) { + rnext = r->next; + if ( s->matched_refs&(1<layers[ly_fore].splines, i=0; spl!=NULL; spl=snext, ++i ) { + snext = spl->next; + if ( s->matched_ss&(1<layers[ly_fore].splines = snext; + else + sprev->next = snext; + spl->next = NULL; + SplinePointListMDFree(sc,spl); + } else + sprev = spl; + } + + /* Then insert the replace stuff */ + SVBuildTrans(s,transform); + for ( r = s->sc_rpl.layers[ly_fore].refs; r!=NULL; r=r->next ) { + subtrans[0] = transform[0]*r->transform[0] + transform[1]*r->transform[2]; + subtrans[1] = transform[0]*r->transform[1] + transform[1]*r->transform[3]; + subtrans[2] = transform[2]*r->transform[0] + transform[3]*r->transform[2]; + subtrans[3] = transform[2]*r->transform[1] + transform[3]*r->transform[3]; + subtrans[4] = transform[4]*r->transform[0] + transform[5]*r->transform[2] + + r->transform[4]; + subtrans[5] = transform[4]*r->transform[1] + transform[5]*r->transform[3] + + r->transform[5]; + new = RefCharCreate(); + *new = *r; + memcpy(new->transform,subtrans,sizeof(subtrans)); + new->layers[ly_fore].splines = NULL; + new->next = sc->layers[ly_fore].refs; + new->selected = true; + sc->layers[ly_fore].refs = new; + SCReinstanciateRefChar(sc,new); + SCMakeDependent(sc,new->sc); + } + temp = SplinePointListTransform(SplinePointListCopy(s->sc_rpl.layers[ly_fore].splines),transform,true); + if ( sc->layers[ly_fore].splines==NULL ) + sc->layers[ly_fore].splines = temp; + else { + for ( spl=sc->layers[ly_fore].splines; spl->next!=NULL; spl = spl->next ); + spl->next = temp; + for ( ; temp!=NULL; temp=temp->next ) { + for ( sp=temp->first; ; ) { + sp->selected = true; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==temp->first ) + break; + } + } + } +} + +/* ************************************************************************** */ + +static void SVSelectSC(SearchView *sv) { + SplineChar *sc = sv->curchar; + SplinePointList *spl; + SplinePoint *sp; + RefChar *rf; + int i; + + /* Deselect all */; + for ( spl = sc->layers[ly_fore].splines; spl!=NULL; spl = spl->next ) { + for ( sp=spl->first ;; ) { + sp->selected = false; + if ( sp->next == NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + if ( rf->selected ) rf->selected = false; + + if ( sv->subpatternsearch ) { + spl = sv->matched_spl; + for ( sp = sv->matched_sp; ; ) { + sp->selected = true; + if ( sp->next == NULL || sp==sv->last_sp ) + break; + sp = sp->next->to; + /* Ok to wrap back to first */ + } + } else { + for ( rf=sc->layers[ly_fore].refs, i=0; rf!=NULL; rf=rf->next, ++i ) + if ( sv->matched_refs&(1<selected = true; + for ( spl = sc->layers[ly_fore].splines,i=0; spl!=NULL; spl = spl->next, ++i ) { + if ( sv->matched_ss&(1<first ;; ) { + sp->selected = true; + if ( sp->next == NULL ) + break; + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + } + } + } + SCUpdateAll(sc); + sc->changed_since_search = false; +} + +static void SVParseDlg(SearchView *sv) { + SplinePointList *spl; + + sv->tryreverse = true; + sv->tryflips = GGadgetIsChecked(GWidgetGetControl(sv->gw,CID_Flipping)); + sv->tryscale = GGadgetIsChecked(GWidgetGetControl(sv->gw,CID_Scaling)); + sv->tryrotate = GGadgetIsChecked(GWidgetGetControl(sv->gw,CID_Rotating)); + sv->onlyselected = GGadgetIsChecked(GWidgetGetControl(sv->gw,CID_Selected)); + + if ( sv->sc_srch.changed_since_autosave ) { + sv->path = sv->sc_srch.layers[ly_fore].splines; + SplinePointListsFree(sv->revpath); + sv->revpath = SplinePointListCopy(sv->path); + for ( spl=sv->revpath; spl!=NULL; spl=spl->next ) + spl = SplineSetReverse(spl); + sv->sc_srch.changed_since_autosave = false; + } + if ( sv->sc_rpl.changed_since_autosave ) { + sv->replacepath = sv->sc_rpl.layers[ly_fore].splines; + SplinePointListsFree(sv->revreplace); + sv->revreplace = SplinePointListCopy(sv->replacepath); + for ( spl=sv->revreplace; spl!=NULL; spl=spl->next ) + spl = SplineSetReverse(spl); + sv->sc_rpl.changed_since_autosave = false; + } + + /* Only do a sub pattern search if we have a single path and it is open */ + /* and there is either no replace pattern, or it is also a single open */ + /* path */ + sv->subpatternsearch = sv->path!=NULL && sv->path->next==NULL && + sv->path->first->prev==NULL && sv->sc_srch.layers[ly_fore].refs==NULL; + if ( sv->replacepath!=NULL && (sv->replacepath->next!=NULL || + sv->replacepath->first->prev!=NULL )) + sv->subpatternsearch = false; + else if ( sv->sc_rpl.layers[ly_fore].refs!=NULL ) + sv->subpatternsearch = false; + + if ( sv->subpatternsearch ) { + int i; + SplinePoint *sp; + for ( sp=sv->path->first, i=0; ; ) { + ++i; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } + sv->pointcnt = i; + if ( sv->replacepath!=NULL ) { + for ( sp=sv->replacepath->first, i=0; ; ) { + ++i; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + } + sv->rpointcnt = i; + } + } + sv->fudge = sv->tryrotate ? .01 : .001; + sv->fudge_percent = sv->tryrotate ? .01 : .001; +} + +static int SearchChar(SearchView *sv, int enc,int startafter) { + + sv->curchar = sv->fv->sf->chars[enc]; + + sv->wasreversed = false; + sv->matched_rot = 0; sv->matched_scale = 1; + sv->matched_co = 1; sv->matched_si = 0; + sv->matched_flip = flip_none; + sv->matched_refs = sv->matched_ss = 0; + sv->matched_x = sv->matched_y = 0; + + if ( sv->subpatternsearch ) +return( SCMatchesIncomplete(sv->curchar,sv,startafter)); + else +return( SCMatchesFull(sv->curchar,sv)); +} + +static void DoRpl(SearchView *sv) { + RefChar *r; + + /* Make sure we don't generate any self referential characters... */ + for ( r = sv->sc_rpl.layers[ly_fore].refs; r!=NULL; r=r->next ) { + if ( SCDependsOnSC(r->sc,sv->curchar)) +return; + } + + SCPreserveState(sv->curchar,false); + if ( sv->subpatternsearch ) + DoReplaceIncomplete(sv->curchar,sv); + else + DoReplaceFull(sv->curchar,sv); + SCCharChangedUpdate(sv->curchar); +} + +static int DoFindOne(SearchView *sv,int startafter) { + int i; + SplineChar *startcur = sv->curchar; + + /* It is possible that some idiot deleted the current character since */ + /* the last search... do some mild checks */ + if ( sv->curchar!=NULL && + sv->curchar->parent == sv->fv->sf && + sv->curchar->enc>=0 && sv->curchar->encfv->sf->charcnt && + sv->curchar==sv->fv->sf->chars[sv->curchar->enc] ) + /* Looks ok */; + else + sv->curchar=startcur=NULL; + + if ( !sv->subpatternsearch ) startafter = false; + + if ( sv->showsfindnext && sv->curchar!=NULL ) + i = sv->curchar->enc+1-startafter; + else { + startafter = false; + if ( !sv->onlyselected ) + i = 0; + else { + for ( i=0; ifv->sf->charcnt; ++i ) + if ( sv->fv->selected[i] && sv->fv->sf->chars[i]!=NULL ) + break; + } + } + + for ( ; ifv->sf->charcnt; ++i ) { + if (( !sv->onlyselected || sv->fv->selected[i]) && sv->fv->sf->chars[i]!=NULL ) + if ( SearchChar(sv,i,startafter) ) + break; + startafter = false; + } + if ( i>=sv->fv->sf->charcnt ) { + GWidgetPostNoticeR(_STR_NotFound,sv->showsfindnext?_STR_PatternNotFoundAgain:_STR_PatternNotFound,sv->fv->sf->fontname); + sv->curchar = startcur; + GGadgetSetTitle(GWidgetGetControl(sv->gw,CID_Find),GStringGetResource(_STR_Find,NULL)); + sv->showsfindnext = false; +return( false ); + } + SVSelectSC(sv); + if ( sv->lastcv!=NULL && sv->lastcv->sc==startcur && sv->lastcv->fv==sv->fv ) { + CVChangeSC(sv->lastcv,sv->curchar); + GDrawSetVisible(sv->lastcv->gw,true); + GDrawRaise(sv->lastcv->gw); + } else + sv->lastcv = CharViewCreate(sv->curchar,sv->fv); + GGadgetSetTitle(GWidgetGetControl(sv->gw,CID_Find),GStringGetResource(_STR_FindNext,NULL)); + sv->showsfindnext = true; +return( true ); +} + +static int SV_Find(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SearchView *sv = (SearchView *) GDrawGetUserData(GGadgetGetWindow(g)); + SVParseDlg(sv); + sv->findall = sv->replaceall = false; + DoFindOne(sv,false); + } +return( true ); +} + +static void DoFindAll(SearchView *sv) { + int i, any=0; + SplineChar *startcur = sv->curchar; + + for ( i=0; ifv->sf->charcnt; ++i ) { + if (( !sv->onlyselected || sv->fv->selected[i]) && sv->fv->sf->chars[i]!=NULL ) { + if ( (sv->fv->selected[i] = SearchChar(sv,i,false)) ) { + any = true; + if ( sv->replaceall ) { + do { + DoRpl(sv); + } while ( sv->subpatternsearch && SearchChar(sv,i,true)); + } + } + } else + sv->fv->selected[i] = false; + } + GDrawRequestExpose(sv->fv->v,NULL,false); + sv->curchar = startcur; + if ( !any ) + GWidgetPostNoticeR(_STR_NotFound,_STR_PatternNotFound,sv->fv->sf->fontname); +} + +static int SV_FindAll(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SearchView *sv = (SearchView *) GDrawGetUserData(GGadgetGetWindow(g)); + SVParseDlg(sv); + sv->findall = true; + sv->replaceall = false; + DoFindAll(sv); + } +return( true ); +} + +static int SV_RplFind(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SearchView *sv = (SearchView *) GDrawGetUserData(GGadgetGetWindow(g)); + RefChar *rf; + SVParseDlg(sv); + sv->findall = sv->replaceall = false; + for ( rf=sv->sc_rpl.layers[ly_fore].refs; rf!=NULL; rf = rf->next ) { + if ( SCDependsOnSC(rf->sc,sv->curchar)) { + GWidgetErrorR(_STR_SelfRef,_STR_AttemptSelfRef); +return( true ); + } + } + DoRpl(sv); + DoFindOne(sv,sv->subpatternsearch); + } +return( true ); +} + +static int SV_RplAll(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SearchView *sv = (SearchView *) GDrawGetUserData(GGadgetGetWindow(g)); + SVParseDlg(sv); + sv->findall = false; + sv->replaceall = true; + DoFindAll(sv); + } +return( true ); +} + +/* ************************************************************************** */ + +void SVMenuClose(GWindow gw,struct gmenuitem *mi,GEvent *e) { + GDrawSetVisible(gw,false); +} + +static int SV_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) + SVMenuClose(GGadgetGetWindow(g),NULL,e); +return( true ); +} + +static void SVResize(SearchView *sv, GEvent *event) { + GRect size; + int i, xoff, yoff; + int width, height; + + if ( !event->u.resize.sized ) +return; + + width = (event->u.resize.size.width-40)/2; + height = (event->u.resize.size.height-sv->cv_y-sv->button_height-8); + if ( width<70 || height<80 || event->u.resize.size.widthbutton_width+10 ) { + if ( width<70 ) width = 70; + width = 2*width+40; + if ( widthbutton_width+10 ) width = sv->button_width+10; + if ( height<80 ) height = 80; + height += sv->cv_y+sv->button_height+8; + GDrawResize(sv->gw,width,height); +return; + } + if ( width!=sv->cv_width || height!=sv->cv_height ) { + GDrawResize(sv->cv_srch.gw,width,height); + GDrawResize(sv->cv_rpl.gw,width,height); + sv->cv_width = width; sv->cv_height = height; + sv->rpl_x = 30+width; + GDrawMove(sv->cv_rpl.gw,sv->rpl_x,sv->cv_y); + } + + GGadgetGetSize(GWidgetGetControl(sv->gw,CID_Allow),&size); + yoff = event->u.resize.size.height-sv->button_height-size.y; + if ( yoff!=0 ) { + for ( i=CID_Allow; i<=CID_Cancel; ++i ) { + GGadgetGetSize(GWidgetGetControl(sv->gw,i),&size); + GGadgetMove(GWidgetGetControl(sv->gw,i),size.x,size.y+yoff); + } + } + xoff = (event->u.resize.size.width - sv->button_width)/2; + GGadgetGetSize(GWidgetGetControl(sv->gw,CID_Find),&size); + xoff -= size.x; + if ( xoff!=0 ) { + for ( i=CID_Find; i<=CID_Cancel; ++i ) { + GGadgetGetSize(GWidgetGetControl(sv->gw,i),&size); + GGadgetMove(GWidgetGetControl(sv->gw,i),size.x+xoff,size.y); + } + } + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + GDrawRequestExpose(sv->gw,NULL,false); +} + +void SVMakeActive(SearchView *sv,CharView *cv) { + GRect r; + if ( sv==NULL ) +return; + sv->cv_srch.inactive = sv->cv_rpl.inactive = true; + cv->inactive = false; + GDrawRequestExpose(sv->cv_srch.v,NULL,false); + GDrawRequestExpose(sv->cv_rpl.v,NULL,false); + GDrawGetSize(sv->gw,&r); + r.x = 0; + r.y = sv->mbh; + r.height = sv->fh+10; + GDrawRequestExpose(sv->gw,&r,false); +} + +void SVChar(SearchView *sv, GEvent *event) { + if ( event->u.chr.keysym==GK_Tab || event->u.chr.keysym==GK_BackTab ) + SVMakeActive(sv,sv->cv_srch.inactive ? &sv->cv_srch : &sv->cv_rpl); + else + CVChar(sv->cv_srch.inactive ? &sv->cv_rpl : &sv->cv_srch,event); +} + +static void SVDraw(SearchView *sv, GWindow pixmap, GEvent *event) { + GRect r; + + GDrawSetLineWidth(pixmap,0); + if ( sv->cv_srch.inactive ) + GDrawSetFont(pixmap,sv->plain); + else + GDrawSetFont(pixmap,sv->bold); + GDrawDrawText(pixmap,10,sv->mbh+5+sv->as, + GStringGetResource(_STR_SearchPattern,NULL),-1,NULL,0); + if ( sv->cv_rpl.inactive ) + GDrawSetFont(pixmap,sv->plain); + else + GDrawSetFont(pixmap,sv->bold); + GDrawDrawText(pixmap,sv->rpl_x,sv->mbh+5+sv->as, + GStringGetResource(_STR_ReplacePattern,NULL),-1,NULL,0); + r.x = 10-1; r.y=sv->cv_y-1; + r.width = sv->cv_width+1; r.height = sv->cv_height+1; + GDrawDrawRect(pixmap,&r,0); + r.x = sv->rpl_x-1; + GDrawDrawRect(pixmap,&r,0); +} + +static void SVCheck(SearchView *sv) { + int show = ( sv->sc_srch.layers[ly_fore].splines!=NULL || sv->sc_srch.layers[ly_fore].refs!=NULL ); + int showrplall=show, showrpl; + + if ( sv->sc_srch.changed_since_autosave && sv->showsfindnext ) { + GGadgetSetTitle(GWidgetGetControl(sv->gw,CID_Find),GStringGetResource(_STR_Find,NULL)); + sv->showsfindnext = false; + } + if ( showrplall ) { + if ( sv->sc_srch.layers[ly_fore].splines!=NULL && sv->sc_srch.layers[ly_fore].splines->next==NULL && + sv->sc_srch.layers[ly_fore].splines->first->prev==NULL && + sv->sc_rpl.layers[ly_fore].splines==NULL && sv->sc_rpl.layers[ly_fore].refs==NULL ) + showrplall = false; + } + showrpl = showrplall; + if ( !sv->showsfindnext || sv->curchar==NULL || sv->curchar->parent!=sv->fv->sf || + sv->curchar->enc<0 || sv->curchar->enc>=sv->fv->sf->charcnt || + sv->curchar!=sv->fv->sf->chars[sv->curchar->enc] || + sv->curchar->changed_since_search ) + showrpl = false; + + if ( sv->findenabled != show ) { + GGadgetSetEnabled(GWidgetGetControl(sv->gw,CID_Find),show); + GGadgetSetEnabled(GWidgetGetControl(sv->gw,CID_FindAll),show); + sv->findenabled = show; + } + if ( sv->rplallenabled != showrplall ) { + GGadgetSetEnabled(GWidgetGetControl(sv->gw,CID_ReplaceAll),showrplall); + sv->rplallenabled = showrplall; + } + if ( sv->rplenabled != showrpl ) { + GGadgetSetEnabled(GWidgetGetControl(sv->gw,CID_Replace),showrpl); + sv->rplenabled = showrpl; + } +} + +static void SearchViewFree(SearchView *sv) { + SplinePointListsFree(sv->sc_srch.layers[ly_fore].splines); + SplinePointListsFree(sv->sc_rpl.layers[ly_fore].splines); + RefCharsFree(sv->sc_srch.layers[ly_fore].refs); + RefCharsFree(sv->sc_rpl.layers[ly_fore].refs); + free(sv); +} + +static int sv_e_h(GWindow gw, GEvent *event) { + SearchView *sv = (SearchView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + SVDraw(sv,gw,event); + break; + case et_resize: + if ( event->u.resize.sized ) + SVResize(sv,event); + break; + case et_char: + SVChar(sv,event); + break; + case et_timer: + SVCheck(sv); + break; + case et_close: + SVMenuClose(gw,NULL,NULL); + break; + case et_create: + break; + case et_destroy: + SearchViewFree(sv); + break; + case et_map: + if ( event->u.map.is_visible ) + CVPaletteActivate(sv->cv_srch.inactive?&sv->cv_rpl:&sv->cv_srch); + else + CVPalettesHideIfMine(sv->cv_srch.inactive?&sv->cv_rpl:&sv->cv_srch); + sv->isvisible = event->u.map.is_visible; + break; + } +return( true ); +} + +static void SVSetTitle(SearchView *sv) { + unichar_t ubuf[150]; + u_sprintf(ubuf,GStringGetResource(_STR_FindIn,NULL),sv->fv->sf->fontname); + GDrawSetWindowTitles(sv->gw,ubuf,GStringGetResource(_STR_Find,NULL)); +} + +int SVAttachFV(FontView *fv,int ask_if_difficult) { + int i, doit, pos, any=0; + RefChar *r, *rnext, *rprev; + + if ( searcher==NULL ) +return( false ); + + if ( searcher->fv==fv ) +return( true ); + if ( searcher->fv!=NULL && searcher->fv->sf==fv->sf ) { + searcher->fv->sv = NULL; + fv->sv = searcher; + searcher->fv = fv; + SVSetTitle(searcher); + searcher->curchar = NULL; +return( true ); + } + + for ( doit=!ask_if_difficult; doit<=1; ++doit ) { + for ( i=0; i<2; ++i ) { + rprev = NULL; + for ( r = searcher->chars[i]->layers[ly_fore].refs; r!=NULL; r=rnext ) { + rnext = r->next; + pos = SFFindChar(fv->sf,r->sc->unicodeenc,r->sc->name); + if ( pos==-1 && !doit ) { + static int buttons[] = { _STR_Yes, _STR_Cancel, 0 }; + if ( ask_if_difficult==2 && !searcher->isvisible ) +return( false ); + if ( GWidgetAskR(_STR_BadReference,buttons,1,1, + _STR_BadRefInSearchRpl, + GStringGetResource(i==0?_STR_SearchPattern:_STR_ReplacePattern,NULL), + r->sc->name)==1 ) +return( false ); + } else if ( !doit ) + /* Do Nothing */; + else if ( pos==-1 ) { + if ( rprev==NULL ) + searcher->chars[i]->layers[ly_fore].refs = rnext; + else + rprev->next = rnext; + RefCharFree(r); + any = true; + } else { + /*SplinePointListsFree(r->layers[0].splines); r->layers[0].splines = NULL;*/ + r->local_enc = pos; + r->sc = fv->sf->chars[pos]; + SCReinstanciateRefChar(searcher->chars[i],r); + any = true; + rprev = r; + } + } + } + } + fv->sv = searcher; + searcher->fv = fv; + searcher->curchar = NULL; + if ( any ) { + GDrawRequestExpose(searcher->cv_srch.v,NULL,false); + GDrawRequestExpose(searcher->cv_rpl.v,NULL,false); + } + SVSetTitle(searcher); +return( true ); +} + +void SVDetachFV(FontView *fv) { + FontView *other; + + fv->sv = NULL; + if ( searcher==NULL || searcher->fv!=fv ) +return; + SVMenuClose(searcher->gw,NULL,NULL); + for ( other=fv_list; other!=NULL; other=other->next ) { + if ( other!=fv ) { + SVAttachFV(fv,false); +return; + } + } +} + +SearchView *SVCreate(FontView *fv) { + SearchView *sv; + GRect pos, size; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[12]; + GTextInfo label[12]; + FontRequest rq; + int as, ds, ld; + static unichar_t helv[] = { 'h', 'e', 'l', 'v', 'e', 't', 'i', 'c', 'a',',','c','a','l','i','b','a','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + + if ( searcher!=NULL ) { + if ( SVAttachFV(fv,true)) { + GDrawSetVisible(fv->sv->gw,true); + GDrawRaise(fv->sv->gw); +return( searcher ); + } else +return( NULL ); + } + + searcher = sv = gcalloc(1,sizeof(SearchView)); + + sv->sc_srch.enc = 0; sv->sc_srch.unicodeenc = -1; sv->sc_srch.name = "Search"; + sv->sc_rpl.enc = 1; sv->sc_rpl.unicodeenc = -1; sv->sc_rpl.name = "Replace"; + sv->chars[0] = &sv->sc_srch; + sv->chars[1] = &sv->sc_rpl; + sv->dummy_sf.chars = sv->chars; + sv->dummy_sf.charcnt = 2; + sv->dummy_sf.pfminfo.fstype = -1; + sv->dummy_sf.encoding_name = em_none; + sv->dummy_sf.fontname = sv->dummy_sf.fullname = sv->dummy_sf.familyname = "dummy"; + sv->dummy_sf.weight = "Medium"; + sv->dummy_sf.origname = "dummy"; + sv->dummy_sf.ascent = fv->sf->ascent; + sv->dummy_sf.descent = fv->sf->descent; + sv->sc_srch.width = sv->sc_srch.vwidth = sv->sc_rpl.vwidth = sv->sc_rpl.width = + sv->dummy_sf.ascent + sv->dummy_sf.descent; + sv->sc_srch.parent = sv->sc_rpl.parent = &sv->dummy_sf; + + sv->dummy_sf.fv = &sv->dummy_fv; + sv->dummy_fv.sf = &sv->dummy_sf; + sv->dummy_fv.selected = sv->sel; + sv->dummy_fv.cbw = sv->dummy_fv.cbh = default_fv_font_size+1; + sv->dummy_fv.magnify = 1; + + sv->fv = fv; + fv->sv = sv; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor/*|wam_icon*/; + wattrs.event_masks = -1; + wattrs.cursor = ct_pointer; + /*wattrs.icon = icon;*/ + pos.width = 600; + pos.height = 400; + pos.x = GGadgetScale(104)+6; + DefaultY(&pos); + sv->gw = gw = GDrawCreateTopWindow(NULL,&pos,sv_e_h,sv,&wattrs); + SVSetTitle(sv); + + memset(&rq,0,sizeof(rq)); + rq.family_name = helv; + rq.point_size = 12; + rq.weight = 400; + sv->plain = GDrawInstanciateFont(NULL,&rq); + rq.weight = 700; + sv->bold = GDrawInstanciateFont(NULL,&rq); + GDrawFontMetrics(sv->plain,&as,&ds,&ld); + sv->fh = as+ds; sv->as = as; + + SVCharViewInits(sv); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + label[0].text = (unichar_t *) _STR_Allow; + label[0].text_in_resource = true; + gcd[0].gd.label = &label[0]; + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = GDrawPixelsToPoints(NULL,sv->cv_y+sv->cv_height+8); + gcd[0].gd.flags = gg_enabled|gg_visible; + gcd[0].gd.cid = CID_Allow; + gcd[0].gd.popup_msg = GStringGetResource(_STR_AllowTransPopup,NULL); + gcd[0].creator = GLabelCreate; + + label[1].text = (unichar_t *) _STR_Flipping; + label[1].text_in_resource = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = 35; gcd[1].gd.pos.y = gcd[0].gd.pos.y-3; + gcd[1].gd.flags = gg_enabled|gg_visible|gg_cb_on; + gcd[1].gd.cid = CID_Flipping; + gcd[1].gd.popup_msg = GStringGetResource(_STR_AllowTransPopup,NULL); + gcd[1].creator = GCheckBoxCreate; + + label[2].text = (unichar_t *) _STR_Scaling; + label[2].text_in_resource = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = 100; gcd[2].gd.pos.y = gcd[1].gd.pos.y; + gcd[2].gd.flags = gg_enabled|gg_visible; + gcd[2].gd.cid = CID_Scaling; + gcd[2].gd.popup_msg = GStringGetResource(_STR_AllowTransPopup,NULL); + gcd[2].creator = GCheckBoxCreate; + + label[3].text = (unichar_t *) _STR_Rotating; + label[3].text_in_resource = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = 170; gcd[3].gd.pos.y = gcd[1].gd.pos.y; + gcd[3].gd.flags = gg_enabled|gg_visible; + gcd[3].gd.cid = CID_Rotating; + gcd[3].gd.popup_msg = GStringGetResource(_STR_AllowTransPopup,NULL); + gcd[3].creator = GCheckBoxCreate; + + label[4].text = (unichar_t *) _STR_SearchSelected; + label[4].text_in_resource = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.pos.x = 5; gcd[4].gd.pos.y = gcd[1].gd.pos.y+18; + gcd[4].gd.flags = gg_enabled|gg_visible; + gcd[4].gd.cid = CID_Selected; + gcd[4].gd.popup_msg = GStringGetResource(_STR_SearchSelectedPopup,NULL); + gcd[4].creator = GCheckBoxCreate; + + label[5].text = (unichar_t *) _STR_FindNext; /* Start with this to allow sufficient space */ + label[5].text_in_resource = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.pos.x = 5; gcd[5].gd.pos.y = gcd[4].gd.pos.y+24; + gcd[5].gd.flags = gg_visible|gg_but_default; + gcd[5].gd.cid = CID_Find; + gcd[5].gd.handle_controlevent = SV_Find; + gcd[5].creator = GButtonCreate; + + label[6].text = (unichar_t *) _STR_FindAll; + label[6].text_in_resource = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.pos.x = 0; gcd[6].gd.pos.y = gcd[5].gd.pos.y+3; + gcd[6].gd.flags = gg_visible; + gcd[6].gd.cid = CID_FindAll; + gcd[6].gd.handle_controlevent = SV_FindAll; + gcd[6].creator = GButtonCreate; + + label[7].text = (unichar_t *) _STR_Replace; + label[7].text_in_resource = true; + gcd[7].gd.label = &label[7]; + gcd[7].gd.pos.x = 0; gcd[7].gd.pos.y = gcd[6].gd.pos.y; + gcd[7].gd.flags = gg_visible; + gcd[7].gd.cid = CID_Replace; + gcd[7].gd.handle_controlevent = SV_RplFind; + gcd[7].creator = GButtonCreate; + + label[8].text = (unichar_t *) _STR_ReplaceAll; + label[8].text_in_resource = true; + gcd[8].gd.label = &label[8]; + gcd[8].gd.pos.x = 0; gcd[8].gd.pos.y = gcd[6].gd.pos.y; + gcd[8].gd.flags = gg_visible; + gcd[8].gd.cid = CID_ReplaceAll; + gcd[8].gd.handle_controlevent = SV_RplAll; + gcd[8].creator = GButtonCreate; + + label[9].text = (unichar_t *) _STR_Cancel; + label[9].text_in_resource = true; + gcd[9].gd.label = &label[9]; + gcd[9].gd.pos.x = 0; gcd[9].gd.pos.y = gcd[6].gd.pos.y; + gcd[9].gd.flags = gg_enabled|gg_visible|gg_but_cancel; + gcd[9].gd.cid = CID_Cancel; + gcd[9].gd.handle_controlevent = SV_Cancel; + gcd[9].creator = GButtonCreate; + + GGadgetsCreate(gw,gcd); + + GGadgetSetTitle(GWidgetGetControl(gw,CID_Find),GStringGetResource(_STR_Find,NULL)); + sv->showsfindnext = false; + GDrawRequestTimer(gw,1000,1000,NULL); + + GGadgetGetSize(GWidgetGetControl(gw,CID_Cancel),&size); + pos.height = size.y+size.height+13; + pos.width = size.x+size.width+5; + if ( sv->rpl_x+sv->cv_width+20 > pos.width ) + pos.width = sv->rpl_x+sv->cv_width+20; + GDrawResize(gw,pos.width,pos.height); + sv->button_height = pos.height-(sv->cv_y+sv->cv_height+8); + sv->button_width = size.x+size.width-5; + + GDrawSetVisible(sv->gw,true); +return( sv ); +} diff --git a/fontforge/sfd.c b/fontforge/sfd.c new file mode 100644 index 00000000..8b4a23cb --- /dev/null +++ b/fontforge/sfd.c @@ -0,0 +1,4028 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include "splinefont.h" +#include "gdraw.h" +#include "ustring.h" +#include +#include +#include +#include + +static const char *charset_names[] = { + "custom", + "iso8859_1", "iso8859_2", "iso8859_3", "iso8859_4", "iso8859_5", + "iso8859_6", "iso8859_7", "iso8859_8", "iso8859_9", "iso8859_10", + "iso8859_11", "iso8859_13", "iso8859_14", "iso8859_15", + "koi8_r", + "jis201", + "win", "mac", "symbol", "zapfding", "adobestandard", + "jis208", "jis212", "ksc5601", "gb2312", "big5", "big5hkscs", "johab", + "unicode", "unicode4", "sjis", "wansung", "gb2312pk", NULL}; + +static const char *unicode_interp_names[] = { "none", "adobe", "greek", + "japanese", "tradchinese", "simpchinese", "korean", NULL }; + +signed char inbase64[256] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, + -1, 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, -1, -1, -1, -1, -1, + -1, 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, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -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 void utf7_encode(FILE *sfd,long ch) { +static char base64[64] = { + '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', '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', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; + + putc(base64[(ch>>18)&0x3f],sfd); + putc(base64[(ch>>12)&0x3f],sfd); + putc(base64[(ch>>6)&0x3f],sfd); + putc(base64[ch&0x3f],sfd); +} + +static void SFDDumpUTF7Str(FILE *sfd, const unichar_t *str) { + int ch, prev_cnt=0, prev=0, in=0; + + putc('"',sfd); + if ( str!=NULL ) while ( (ch = *str++)!='\0' ) { + if ( ch<127 && ch!='\n' && ch!='\r' && ch!='\\' && ch!='~' && + ch!='+' && ch!='=' && ch!='"' ) { + if ( prev_cnt!=0 ) { + prev<<= (prev_cnt==1?16:8); + utf7_encode(sfd,prev); + prev_cnt=prev=0; + } + if ( in ) { + if ( inbase64[ch]!=-1 ) + putc('-',sfd); + in = 0; + } + putc(ch,sfd); + } else if ( ch=='+' && !in ) { + putc('+',sfd); + putc('-',sfd); + } else if ( prev_cnt== 0 ) { + if ( !in ) { + putc('+',sfd); + in = 1; + } + prev = ch; + prev_cnt = 2; /* 2 bytes */ + } else if ( prev_cnt==2 ) { + prev<<=8; + prev += (ch>>8)&0xff; + utf7_encode(sfd,prev); + prev = (ch&0xff); + prev_cnt=1; + } else { + prev<<=16; + prev |= ch; + utf7_encode(sfd,prev); + prev_cnt = prev = 0; + } + } + if ( prev_cnt==2 ) { + prev<<=8; + utf7_encode(sfd,prev); + } else if ( prev_cnt==1 ) { + prev<<=16; + utf7_encode(sfd,prev); + } + putc('"',sfd); + putc(' ',sfd); +} + +static unichar_t *SFDReadUTF7Str(FILE *sfd) { + int ch1, ch2, ch3, ch4, done; + unichar_t buffer[1024], *pt, *end = buffer+sizeof(buffer)/sizeof(unichar_t)-1; + int prev_cnt=0, prev=0, in=0; + + ch1 = getc(sfd); + while ( isspace(ch1) && ch1!='\n' && ch1!='\r') ch1 = getc(sfd); + if ( ch1=='\n' || ch1=='\r' ) + ungetc(ch1,sfd); + if ( ch1!='"' ) +return( NULL ); + pt = buffer; + while ( (ch1=getc(sfd))!=EOF && ch1!='"' ) { + done = 0; + if ( !done && !in ) { + if ( ch1=='+' ) { + ch1 = getc(sfd); + if ( ch1=='-' ) { + if ( pt>= 8; + prev_cnt = 1; + } else /* if ( prev_cnt == 1 ) */ { + ch1 |= (prev<<24); + prev = (ch1&0xffff); + ch1 >>= 16; + prev_cnt = 2; + } + done = true; + } + } + if ( done && ptsofar[enc->pos++] = ch; + if ( enc->pos==4 ) { + unsigned int val = (enc->sofar[0]<<24)|(enc->sofar[1]<<16)|(enc->sofar[2]<<8)|enc->sofar[3]; + if ( val==0 ) { + fputc('z',enc->sfd); + ++enc->ccnt; + } else { + int ch2, ch3, ch4, ch5; + ch5 = val%85; + val /= 85; + ch4 = val%85; + val /= 85; + ch3 = val%85; + val /= 85; + ch2 = val%85; + val /= 85; + fputc('!'+val,enc->sfd); + fputc('!'+ch2,enc->sfd); + fputc('!'+ch3,enc->sfd); + fputc('!'+ch4,enc->sfd); + fputc('!'+ch5,enc->sfd); + enc->ccnt += 5; + if ( enc->ccnt > 70 ) { fputc('\n',enc->sfd); enc->ccnt=0; } + } + enc->pos = 0; + } +} + +static void SFDEnc85EndEnc(struct enc85 *enc) { + int i; + int ch2, ch3, ch4, ch5; + unsigned val; + if ( enc->pos==0 ) +return; + for ( i=enc->pos; i<4; ++i ) + enc->sofar[i] = 0; + val = (enc->sofar[0]<<24)|(enc->sofar[1]<<16)|(enc->sofar[2]<<8)|enc->sofar[3]; + if ( val==0 ) { + fputc('z',enc->sfd); + } else { + ch5 = val%85; + val /= 85; + ch4 = val%85; + val /= 85; + ch3 = val%85; + val /= 85; + ch2 = val%85; + val /= 85; + fputc('!'+val,enc->sfd); + fputc('!'+ch2,enc->sfd); + fputc('!'+ch3,enc->sfd); + fputc('!'+ch4,enc->sfd); + fputc('!'+ch5,enc->sfd); + } + enc->pos = 0; +} + +static void SFDDumpHintMask(FILE *sfd,HintMask *hintmask) { + int i, j; + + for ( i=HntMax/8-1; i>0; --i ) + if ( (*hintmask)[i]!=0 ) + break; + for ( j=0; j<=i ; ++j ) { + if ( ((*hintmask)[j]>>4)<10 ) + putc('0'+((*hintmask)[j]>>4),sfd); + else + putc('a'-10+((*hintmask)[j]>>4),sfd); + if ( ((*hintmask)[j]&0xf)<10 ) + putc('0'+((*hintmask)[j]&0xf),sfd); + else + putc('a'-10+((*hintmask)[j]&0xf),sfd); + } +} + +static void SFDDumpSplineSet(FILE *sfd,SplineSet *spl) { + SplinePoint *first, *sp; + int order2 = spl->first->next==NULL || spl->first->next->order2; + + for ( ; spl!=NULL; spl=spl->next ) { + first = NULL; + for ( sp = spl->first; ; sp=sp->next->to ) { + if ( first==NULL ) + fprintf( sfd, "%g %g m ", sp->me.x, sp->me.y ); + else if ( sp->prev->islinear ) /* Don't use known linear here. save control points if there are any */ + fprintf( sfd, " %g %g l ", sp->me.x, sp->me.y ); + else + fprintf( sfd, " %g %g %g %g %g %g c ", + sp->prev->from->nextcp.x, sp->prev->from->nextcp.y, + sp->prevcp.x, sp->prevcp.y, + sp->me.x, sp->me.y ); + fprintf(sfd, "%d", sp->pointtype|(sp->selected<<2)| + (sp->nextcpdef<<3)|(sp->prevcpdef<<4)| + (sp->roundx<<5)|(sp->roundy<<6)| + (sp->ttfindex==0xffff?(1<<7):0) ); + if ( order2 ) { + if ( sp->ttfindex!=0xfffe && sp->nextcpindex!=0xfffe ) { + putc(',',sfd); + if ( sp->ttfindex==0xffff ) + fprintf(sfd,"-1"); + else if ( sp->ttfindex!=0xfffe ) + fprintf(sfd,"%d",sp->ttfindex); + if ( sp->nextcpindex==0xffff ) + fprintf(sfd,",-1"); + else if ( sp->nextcpindex!=0xfffe ) + fprintf(sfd,",%d",sp->nextcpindex); + } + } else { + if ( sp->hintmask!=NULL ) { + putc('x',sfd); + SFDDumpHintMask(sfd, sp->hintmask); + } + } + putc('\n',sfd); + if ( sp==first ) + break; + if ( first==NULL ) first = sp; + if ( sp->next==NULL ) + break; + } + } + fprintf( sfd, "EndSplineSet\n" ); +} + +static void SFDDumpMinimumDistances(FILE *sfd,SplineChar *sc) { + MinimumDistance *md = sc->md; + SplineSet *ss; + SplinePoint *sp; + int pt=0; + + if ( md==NULL ) +return; + for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + sp->ptindex = pt++; + if ( sp->next == NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + fprintf( sfd, "MinimumDistance: " ); + while ( md!=NULL ) { + fprintf( sfd, "%c%d,%d ", md->x?'x':'y', md->sp1?md->sp1->ptindex:-1, + md->sp2?md->sp2->ptindex:-1 ); + md = md->next; + } + fprintf( sfd, "\n" ); +} + +static void SFDDumpAnchorPoints(FILE *sfd,SplineChar *sc) { + AnchorPoint *ap; + + for ( ap = sc->anchor; ap!=NULL; ap=ap->next ) { + fprintf( sfd, "AnchorPoint: " ); + SFDDumpUTF7Str(sfd,ap->anchor->name); + fprintf( sfd, "%g %g %s %d\n", + ap->me.x, ap->me.y, + ap->type==at_centry ? "entry" : + ap->type==at_cexit ? "exit" : + ap->type==at_mark ? "mark" : + ap->type==at_basechar ? "basechar" : + ap->type==at_baselig ? "baselig" : "basemark", + ap->lig_index ); + } +} + +/* Run length encoding */ +/* We always start with a background pixel(1), each line is a series of counts */ +/* we alternate background/foreground. If we can't represent an entire run */ +/* as one count, then we can split it up into several smaller runs and put */ +/* 0 counts in between */ +/* counts 0-254 mean 0-254 pixels of the current color */ +/* count 255 means that the next two bytes (bigendian) provide a two byte count */ +/* count 255 0 n (n<255) means that the previous line should be repeated n+1 times */ +/* count 255 0 255 means 255 pixels of the current color */ +static uint8 *image2rle(struct _GImage *img, int *len) { + int max = img->height*img->bytes_per_line; + uint8 *rle, *pt, *end; + int cnt, set; + int i,j,k; + + *len = 0; + if ( img->image_type!=it_mono || img->bytes_per_line<5 ) +return( NULL ); + rle = gcalloc(max,sizeof(uint8)), pt = rle, end=rle+max-3; + + for ( i=0; iheight; ++i ) { + if ( i!=0 ) { + if ( memcmp(img->data+i*img->bytes_per_line, + img->data+(i-1)*img->bytes_per_line, img->bytes_per_line)== 0 ) { + for ( k=1; kheight-i; ++k ) { + if ( memcmp(img->data+(i+k)*img->bytes_per_line, + img->data+i*img->bytes_per_line, img->bytes_per_line)!= 0 ) + break; + } + i+=k; + while ( k>0 ) { + if ( pt>end ) { + free(rle); +return( NULL ); + } + *pt++ = 255; + *pt++ = 0; + *pt++ = k>254 ? 254 : k; + k -= 254; + } + if ( i>=img->height ) + break; + } + } + + set=1; cnt=0; j=0; + while ( jwidth ) { + for ( k=j; kwidth; ++k ) { + if (( set && !(img->data[i*img->bytes_per_line+(k>>3)]&(0x80>>(k&7))) ) || + ( !set && (img->data[i*img->bytes_per_line+(k>>3)]&(0x80>>(k&7))) )) + break; + } + cnt = k-j; + j=k; + do { + if ( pt>=end ) { + free(rle); +return( NULL ); + } + if ( cnt<=254 ) + *pt++ = cnt; + else { + *pt++ = 255; + if ( cnt>65535 ) { + *pt++ = 255; + *pt++ = 255; + *pt++ = 0; /* nothing of the other color, we've still got more of this one */ + } else { + *pt++ = cnt>>8; + *pt++ = cnt&0xff; + } + } + cnt -= 65535; + } while ( cnt>0 ); + set = 1-set; + } + } + *len = pt-rle; +return( rle ); +} + +static void SFDDumpImage(FILE *sfd,ImageList *img) { + GImage *image = img->image; + struct _GImage *base = image->list_len==0?image->u.image:image->u.images[0]; + struct enc85 enc; + int rlelen; + uint8 *rle; + int i; + + rle = image2rle(base,&rlelen); + fprintf(sfd, "Image: %d %d %d %d %d %x %g %g %g %g %d\n", + base->width, base->height, base->image_type, + base->image_type==it_true?3*base->width:base->bytes_per_line, + base->clut==NULL?0:base->clut->clut_len,base->trans, + img->xoff, img->yoff, img->xscale, img->yscale, rlelen ); + memset(&enc,'\0',sizeof(enc)); + enc.sfd = sfd; + if ( base->clut!=NULL ) { + for ( i=0; iclut->clut_len; ++i ) { + SFDEnc85(&enc,base->clut->clut[i]>>16); + SFDEnc85(&enc,(base->clut->clut[i]>>8)&0xff); + SFDEnc85(&enc,base->clut->clut[i]&0xff); + } + } + if ( rle!=NULL ) { + uint8 *pt=rle, *end=rle+rlelen; + while ( ptheight; ++i ) { + if ( base->image_type==it_true ) { + int *ipt = (int *) (base->data + i*base->bytes_per_line); + int *iend = (int *) (base->data + (i+1)*base->bytes_per_line); + while ( ipt>16); + SFDEnc85(&enc,(*ipt>>8)&0xff); + SFDEnc85(&enc,*ipt&0xff); + ++ipt; + } + } else { + uint8 *pt = (uint8 *) (base->data + i*base->bytes_per_line); + uint8 *end = (uint8 *) (base->data + (i+1)*base->bytes_per_line); + while ( ptnext ) { + fprintf(sfd, "%g %g", h->start,h->width ); + if ( h->ghost ) putc('G',sfd); + if ( h->where!=NULL ) { + putc('<',sfd); + for ( hi=h->where; hi!=NULL; hi=hi->next ) + fprintf(sfd, "%g %g%c", hi->begin, hi->end, hi->next?' ':'>'); + } + putc(h->next?' ':'\n',sfd); + } +} + +static void SFDDumpDHintList(FILE *sfd,char *key, DStemInfo *h) { + + if ( h==NULL ) +return; + fprintf(sfd, "%s", key ); + for ( ; h!=NULL; h=h->next ) { + fprintf(sfd, "%g %g %g %g %g %g %g %g", + h->leftedgetop.x, h->leftedgetop.y, + h->rightedgetop.x, h->rightedgetop.y, + h->leftedgebottom.x, h->leftedgebottom.y, + h->rightedgebottom.x, h->rightedgebottom.y ); + putc(h->next?' ':'\n',sfd); + } +} + +static void SFDDumpTtfInstrs(FILE *sfd,SplineChar *sc) { + struct enc85 enc; + int i; + + memset(&enc,'\0',sizeof(enc)); + enc.sfd = sfd; + + fprintf( sfd, "TtfInstrs: %d\n", sc->ttf_instrs_len ); + for ( i=0; ittf_instrs_len; ++i ) + SFDEnc85(&enc,sc->ttf_instrs[i]); + SFDEnc85EndEnc(&enc); + fprintf(sfd,"\nEndTtf\n" ); +} + +static void SFDDumpTtfTable(FILE *sfd,struct ttf_table *tab) { + struct enc85 enc; + int i; + + memset(&enc,'\0',sizeof(enc)); + enc.sfd = sfd; + + fprintf( sfd, "TtfTable: %c%c%c%c %d\n", + tab->tag>>24, (tab->tag>>16)&0xff, (tab->tag>>8)&0xff, tab->tag&0xff, + tab->len ); + for ( i=0; ilen; ++i ) + SFDEnc85(&enc,tab->data[i]); + SFDEnc85EndEnc(&enc); + fprintf(sfd,"\nEndTtf\n" ); +} + +static int SFDOmit(SplineChar *sc) { + if ( sc==NULL ) +return( true ); + if ( sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL && sc->anchor==NULL && + sc->layers[ly_back].splines==NULL && sc->layers[ly_back].images==NULL ) { + if ( strcmp(sc->name,".null")==0 || strcmp(sc->name,"nonmarkingreturn")==0 ) +return(true); + if ( !sc->widthset && sc->width==sc->parent->ascent+sc->parent->descent && + (strcmp(sc->name,".notdef")==0 || sc->enc==sc->unicodeenc || + strcmp(sc->name,".null")==0 || strcmp(sc->name,"nonmarkingreturn")==0 )) +return(true); + } +return( false ); +} + +static void SFDDumpRefs(FILE *sfd,RefChar *refs, char *name) { + RefChar *ref; + + for ( ref=refs; ref!=NULL; ref=ref->next ) if ( ref->sc!=NULL ) { + if ( ref->sc->enc==0 && ref->sc->layers[ly_fore].splines==NULL ) + fprintf( stderr, "Using a reference to character 0, removed. In %s\n", name); + else + fprintf(sfd, "Ref: %d %d %c %g %g %g %g %g %g\n", + ref->sc->enc, ref->sc->unicodeenc, + ref->selected?'S':'N', + ref->transform[0], ref->transform[1], ref->transform[2], + ref->transform[3], ref->transform[4], ref->transform[5]); + } +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static char *joins[] = { "miter", "round", "bevel", "inher", NULL }; +static char *caps[] = { "butt", "round", "square", "inher", NULL }; +#endif + +static void SFDDumpChar(FILE *sfd,SplineChar *sc) { + ImageList *img; + KernPair *kp; + PST *liga; + int i; + + fprintf(sfd, "StartChar: %s\n", sc->name ); + fprintf(sfd, "Encoding: %d %d %d\n", sc->enc, sc->unicodeenc, sc->orig_pos); + if ( sc->parent->compacted ) + fprintf(sfd, "OldEncoding: %d\n", sc->old_enc); + fprintf(sfd, "Width: %d\n", sc->width ); + if ( sc->vwidth!=sc->parent->ascent+sc->parent->descent ) + fprintf(sfd, "VWidth: %d\n", sc->vwidth ); + if ( sc->glyph_class!=0 ) + fprintf(sfd, "GlyphClass: %d\n", sc->glyph_class ); + if ( sc->changedsincelasthinted|| sc->manualhints || sc->widthset ) + fprintf(sfd, "Flags: %s%s%s%s\n", + sc->changedsincelasthinted?"H":"", + sc->manualhints?"M":"", + sc->widthset?"W":"", + sc->views!=NULL?"O":""); +#if HANYANG + if ( sc->compositionunit ) + fprintf( sfd, "CompositionUnit: %d %d\n", sc->jamo, sc->varient ); +#endif + SFDDumpHintList(sfd,"HStem: ", sc->hstem); + SFDDumpHintList(sfd,"VStem: ", sc->vstem); + SFDDumpDHintList(sfd,"DStem: ", sc->dstem); + if ( sc->countermask_cnt!=0 ) { + fprintf( sfd, "CounterMasks: %d", sc->countermask_cnt ); + for ( i=0; icountermask_cnt; ++i ) { + putc(' ',sfd); + SFDDumpHintMask(sfd,&sc->countermasks[i]); + } + putc('\n',sfd); + } + if ( sc->ttf_instrs_len!=0 ) + SFDDumpTtfInstrs(sfd,sc); + SFDDumpAnchorPoints(sfd,sc); + if ( sc->layers[ly_back].splines!=NULL ) { + fprintf(sfd, "Back\n" ); + SFDDumpSplineSet(sfd,sc->layers[ly_back].splines); + } + for ( img=sc->layers[ly_back].images; img!=NULL; img=img->next ) + SFDDumpImage(sfd,img); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer ) { + fprintf( sfd, "LayerCount: %d\n", sc->layer_cnt ); + for ( i=ly_fore; ilayer_cnt; ++i ) { + fprintf(sfd, "Layer: %d %d %d %d #%06x %g #%06x %g %g %s %s [%g %g %g %g]\n", + i, sc->layers[i].dofill, sc->layers[i].dostroke, sc->layers[i].fillfirst, + sc->layers[i].fill_brush.col, sc->layers[i].fill_brush.opacity, + sc->layers[i].stroke_pen.brush.col, sc->layers[i].stroke_pen.brush.opacity, + sc->layers[i].stroke_pen.width, joins[sc->layers[i].stroke_pen.linejoin], caps[sc->layers[i].stroke_pen.linecap], + sc->layers[i].stroke_pen.trans[0], sc->layers[i].stroke_pen.trans[1], + sc->layers[i].stroke_pen.trans[2], sc->layers[i].stroke_pen.trans[3] ); + for ( img=sc->layers[i].images; img!=NULL; img=img->next ) + SFDDumpImage(sfd,img); + if ( sc->layers[i].splines!=NULL ) { + fprintf(sfd, "SplineSet\n" ); + SFDDumpSplineSet(sfd,sc->layers[i].splines); + } + SFDDumpRefs(sfd,sc->layers[i].refs,sc->name); + } + } else +#endif + { + if ( sc->layers[ly_fore].splines!=NULL ) { + fprintf(sfd, "Fore\n" ); + SFDDumpSplineSet(sfd,sc->layers[ly_fore].splines); + SFDDumpMinimumDistances(sfd,sc); + } + SFDDumpRefs(sfd,sc->layers[ly_fore].refs,sc->name); + } + if ( sc->kerns!=NULL ) { + fprintf( sfd, "KernsSLIF:" ); + for ( kp = sc->kerns; kp!=NULL; kp=kp->next ) + if ( kp->off!=0 && !SFDOmit(kp->sc)) + fprintf( sfd, " %d %d %d %d", kp->sc->enc, kp->off, kp->sli, kp->flags ); + fprintf(sfd, "\n" ); + } + if ( sc->vkerns!=NULL ) { + fprintf( sfd, "VKernsSLIF:" ); + for ( kp = sc->vkerns; kp!=NULL; kp=kp->next ) + if ( kp->off!=0 && !SFDOmit(kp->sc)) + fprintf( sfd, " %d %d %d %d", kp->sc->enc, kp->off, kp->sli, kp->flags ); + fprintf(sfd, "\n" ); + } + for ( liga=sc->possub; liga!=NULL; liga=liga->next ) { + if (( liga->tag==0 && liga->type!=pst_lcaret) || liga->type==pst_null ) + /* Skip it */; + else { + static char *keywords[] = { "Null:", "Position:", "PairPos:", + "Substitution:", + "AlternateSubs:", "MultipleSubs:", "Ligature:", + "LCarets:", NULL }; + if ( liga->tag==0 ) liga->tag = CHR(' ',' ',' ',' '); + fprintf( sfd, "%s %d %d ", + keywords[liga->type], liga->flags, + liga->script_lang_index ); + if ( liga->macfeature ) + fprintf( sfd, "<%d,%d> ", + liga->tag>>16, + liga->tag&0xffff); + else + fprintf( sfd, "'%c%c%c%c' ", + liga->tag>>24, (liga->tag>>16)&0xff, + (liga->tag>>8)&0xff, liga->tag&0xff ); + if ( liga->type==pst_position ) + fprintf( sfd, "dx=%d dy=%d dh=%d dv=%d\n", + liga->u.pos.xoff, liga->u.pos.yoff, + liga->u.pos.h_adv_off, liga->u.pos.v_adv_off); + else if ( liga->type==pst_pair ) + fprintf( sfd, "%s dx=%d dy=%d dh=%d dv=%d | dx=%d dy=%d dh=%d dv=%d\n", + liga->u.pair.paired, + liga->u.pair.vr[0].xoff, liga->u.pair.vr[0].yoff, + liga->u.pair.vr[0].h_adv_off, liga->u.pair.vr[0].v_adv_off, + liga->u.pair.vr[1].xoff, liga->u.pair.vr[1].yoff, + liga->u.pair.vr[1].h_adv_off, liga->u.pair.vr[1].v_adv_off); + else if ( liga->type==pst_lcaret ) { + int i; + fprintf( sfd, "%d ", liga->u.lcaret.cnt ); + for ( i=0; iu.lcaret.cnt; ++i ) + fprintf( sfd, "%d ", liga->u.lcaret.carets[i] ); + fprintf( sfd, "\n" ); + } else + fprintf( sfd, "%s\n", liga->u.lig.components ); + } + } + if ( sc->comment!=NULL ) { + fprintf( sfd, "Comment: " ); + SFDDumpUTF7Str(sfd,sc->comment); + putc('\n',sfd); + } + if ( sc->color!=COLOR_DEFAULT ) + fprintf( sfd, "Colour: %x\n", sc->color ); + fprintf(sfd,"EndChar\n" ); +} + +static void SFDDumpBitmapChar(FILE *sfd,BDFChar *bfc) { + struct enc85 enc; + int i; + + fprintf(sfd, "BDFChar: %d %d %d %d %d %d\n", + bfc->enc, bfc->width, bfc->xmin, bfc->xmax, bfc->ymin, bfc->ymax ); + memset(&enc,'\0',sizeof(enc)); + enc.sfd = sfd; + for ( i=0; i<=bfc->ymax-bfc->ymin; ++i ) { + uint8 *pt = (uint8 *) (bfc->bitmap + i*bfc->bytes_per_line); + uint8 *end = pt + bfc->bytes_per_line; + while ( ptpixelsize, bdf->charcnt, + bdf->ascent, bdf->descent, BDFDepth(bdf), bdf->foundry?bdf->foundry:"" ); + for ( i=0; icharcnt; ++i ) { + if ( bdf->chars[i]!=NULL ) + SFDDumpBitmapChar(sfd,bdf->chars[i]); + GProgressNext(); + } + fprintf( sfd, "EndBitmapFont\n" ); +} + +static void SFDDumpPrivate(FILE *sfd,struct psdict *private) { + int i; + char *pt; + /* These guys should all be ascii text */ + fprintf( sfd, "BeginPrivate: %d\n", private->next ); + for ( i=0; inext ; ++i ) { + fprintf( sfd, "%s %d ", private->keys[i], strlen(private->values[i])); + for ( pt = private->values[i]; *pt; ++pt ) + putc(*pt,sfd); + putc('\n',sfd); + } + fprintf( sfd, "EndPrivate\n" ); +} + +static void SFDDumpLangName(FILE *sfd, struct ttflangname *ln) { + int i, end; + fprintf( sfd, "LangName: %d ", ln->lang ); + for ( end = ttf_namemax; end>0 && ln->names[end-1]==NULL; --end ); + for ( i=0; inames[i]); + putc('\n',sfd); +} + +static void putstring(FILE *sfd, char *header, char *body) { + fprintf( sfd, "%s", header ); + while ( *body ) { + if ( *body=='\n' || *body == '\\' || *body=='\r' ) { + putc('\\',sfd); + if ( *body=='\\' ) + putc('\\',sfd); + else { + putc('n',sfd); + if ( *body=='\r' && body[1]=='\n' ) + ++body; + } + } else + putc(*body,sfd); + ++body; + } + putc('\n',sfd); +} + +const char *EncName(int encname) { + static char buffer[40]; + + if ( encname>=em_unicodeplanes && encname<=em_unicodeplanesmax ) { + sprintf(buffer, "UnicodePlane%d", encname-em_unicodeplanes ); +return( buffer ); + } else if ( encname>=em_base ) { + Encoding *item; + for ( item = enclist; item!=NULL && item->enc_num!=encname; item = item->next ); + if ( item!=NULL ) +return( item->enc_name ); + + fprintf(stderr, "Unknown encoding %d\n", encname ); +return( NULL ); + } else if ( encname>=sizeof(charset_names)/sizeof(charset_names[0])-2 && + encname!=em_none ) { + fprintf(stderr, "Unknown encoding %d\n", encname ); +return( NULL ); + } else +return( charset_names[encname+1]); +} + +static void SFDDumpEncoding(FILE *sfd,int encname,char *keyword) { + const char *name = EncName(encname); + + if ( name==NULL && encname>=em_base ) + name = "custom"; + if ( name==NULL ) { + fprintf(sfd, "%s: %d\n", keyword, encname ); + } else + fprintf(sfd, "%s: %s\n", keyword, name ); +} + +static void SFDDumpMacName(FILE *sfd,struct macname *mn) { + char *pt; + + while ( mn!=NULL ) { + fprintf( sfd, "MacName: %d %d %d \"", mn->enc, mn->lang, strlen(mn->name) ); + for ( pt=mn->name; *pt; ++pt ) { + if ( *pt<' ' || *pt>=0x7f || *pt=='\\' || *pt=='"' ) + fprintf( sfd, "\\%03o", *(uint8 *) pt ); + else + putc(*pt,sfd); + } + fprintf( sfd, "\"\n" ); + mn = mn->next; + } +} + +void SFDDumpMacFeat(FILE *sfd,MacFeat *mf) { + struct macsetting *ms; + + if ( mf==NULL ) +return; + + while ( mf!=NULL ) { + if ( mf->featname!=NULL ) { + fprintf( sfd, "MacFeat: %d %d %d\n", mf->feature, mf->ismutex, mf->default_setting ); + SFDDumpMacName(sfd,mf->featname); + for ( ms=mf->settings; ms!=NULL; ms=ms->next ) { + if ( ms->setname!=NULL ) { + fprintf( sfd, "MacSetting: %d\n", ms->setting ); + SFDDumpMacName(sfd,ms->setname); + } + } + } + mf = mf->next; + } + fprintf( sfd,"EndMacFeatures\n" ); +} + +static void SFD_Dump(FILE *sfd,SplineFont *sf) { + int i, j, realcnt; + BDFFont *bdf; + struct ttflangname *ln; + struct table_ordering *ord; + struct ttf_table *tab; + KernClass *kc; + FPST *fpst; + ASM *sm; + int isv; + + fprintf(sfd, "FontName: %s\n", sf->fontname ); + if ( sf->fullname!=NULL ) + fprintf(sfd, "FullName: %s\n", sf->fullname ); + if ( sf->familyname!=NULL ) + fprintf(sfd, "FamilyName: %s\n", sf->familyname ); + if ( sf->weight!=NULL ) + fprintf(sfd, "Weight: %s\n", sf->weight ); + if ( sf->copyright!=NULL ) + putstring(sfd, "Copyright: ", sf->copyright ); + if ( sf->comments!=NULL ) + putstring(sfd, "Comments: ", sf->comments ); + if ( sf->version!=NULL ) + fprintf(sfd, "Version: %s\n", sf->version ); + fprintf(sfd, "ItalicAngle: %g\n", sf->italicangle ); + fprintf(sfd, "UnderlinePosition: %g\n", sf->upos ); + fprintf(sfd, "UnderlineWidth: %g\n", sf->uwidth ); + fprintf(sfd, "Ascent: %d\n", sf->ascent ); + fprintf(sfd, "Descent: %d\n", sf->descent ); + if ( sf->order2 ) + fprintf(sfd, "Order2: %d\n", sf->order2 ); + if ( sf->multilayer ) + fprintf(sfd, "MultiLayer: %d\n", sf->multilayer ); + if ( sf->hasvmetrics ) + fprintf(sfd, "VerticalOrigin: %d\n", sf->vertical_origin ); + if ( sf->changed_since_xuidchanged ) + fprintf(sfd, "NeedsXUIDChange: 1\n" ); + if ( sf->xuid!=NULL ) + fprintf(sfd, "XUID: %s\n", sf->xuid ); + if ( sf->uniqueid!=0 ) + fprintf(sfd, "UniqueID: %d\n", sf->uniqueid ); + if ( sf->pfminfo.fstype!=-1 ) + fprintf(sfd, "FSType: %d\n", sf->pfminfo.fstype ); + if ( sf->pfminfo.pfmset ) { + fprintf(sfd, "PfmFamily: %d\n", sf->pfminfo.pfmfamily ); + fprintf(sfd, "TTFWeight: %d\n", sf->pfminfo.weight ); + fprintf(sfd, "TTFWidth: %d\n", sf->pfminfo.width ); + fprintf(sfd, "Panose:" ); + for ( i=0; i<10; ++i ) + fprintf( sfd, " %d", sf->pfminfo.panose[i]); + putc('\n',sfd); + fprintf(sfd, "LineGap: %d\n", sf->pfminfo.linegap ); + fprintf(sfd, "VLineGap: %d\n", sf->pfminfo.vlinegap ); + /*putc('\n',sfd);*/ + } + if ( sf->pfminfo.os2_typoascent!=0 ) { + /*fprintf(sfd, "HheadAscent: %d\n", sf->pfminfo.hhead_ascent );*/ + /*fprintf(sfd, "HheadDescent: %d\n", sf->pfminfo.hhead_descent );*/ + fprintf(sfd, "OS2TypoAscent: %d\n", sf->pfminfo.os2_typoascent ); + fprintf(sfd, "OS2TypoDescent: %d\n", sf->pfminfo.os2_typodescent ); + fprintf(sfd, "OS2WinAscent: %d\n", sf->pfminfo.os2_winascent ); + fprintf(sfd, "OS2WinDescent: %d\n", sf->pfminfo.os2_windescent ); + } + if ( sf->macstyle!=-1 ) + fprintf(sfd, "MacStyle: %d\n", sf->macstyle ); + if ( sf->script_lang ) { + int i,j,k; + for ( i=0; sf->script_lang[i]!=NULL; ++i ); + fprintf(sfd, "ScriptLang: %d\n", i ); + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + for ( j=0; sf->script_lang[i][j].script!=0; ++j ); + fprintf( sfd, " %d ", j ); /* Script cnt */ + for ( j=0; sf->script_lang[i][j].script!=0; ++j ) { + for ( k=0; sf->script_lang[i][j].langs[k]!=0 ; ++k ); + fprintf( sfd, "%c%c%c%c %d ", + sf->script_lang[i][j].script>>24, + (sf->script_lang[i][j].script>>16)&0xff, + (sf->script_lang[i][j].script>>8)&0xff, + sf->script_lang[i][j].script&0xff, + k ); + for ( k=0; sf->script_lang[i][j].langs[k]!=0 ; ++k ) + fprintf( sfd, "%c%c%c%c ", + sf->script_lang[i][j].langs[k]>>24, + (sf->script_lang[i][j].langs[k]>>16)&0xff, + (sf->script_lang[i][j].langs[k]>>8)&0xff, + sf->script_lang[i][j].langs[k]&0xff ); + } + fprintf( sfd,"\n"); + } + } + for ( isv=0; isv<2; ++isv ) { + for ( kc=isv ? sf->vkerns : sf->kerns; kc!=NULL; kc = kc->next ) { + fprintf( sfd, "%s: %d %d %d %d\n", isv ? "VKernClass" : "KernClass", + kc->first_cnt, kc->second_cnt, kc->sli, kc->flags ); + for ( i=1; ifirst_cnt; ++i ) + fprintf( sfd, " %d %s\n", strlen(kc->firsts[i]), kc->firsts[i]); + for ( i=1; isecond_cnt; ++i ) + fprintf( sfd, " %d %s\n", strlen(kc->seconds[i]), kc->seconds[i]); + for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) + fprintf( sfd, " %d", kc->offsets[i]); + fprintf( sfd, "\n" ); + } + } + for ( fpst=sf->possub; fpst!=NULL; fpst=fpst->next ) { + static char *keywords[] = { "ContextPos:", "ContextSub:", "ChainPos:", "ChainSub:", "ReverseChain:", NULL }; + static char *formatkeys[] = { "glyph", "class", "coverage", "revcov", NULL }; + fprintf( sfd, "%s %s %d %d '%c%c%c%c' %d %d %d %d\n", + keywords[fpst->type-pst_contextpos], + formatkeys[fpst->format], + fpst->flags, + fpst->script_lang_index, + fpst->tag>>24, (fpst->tag>>16)&0xff, + (fpst->tag>>8)&0xff, fpst->tag&0xff, + fpst->nccnt, fpst->bccnt, fpst->fccnt, fpst->rule_cnt ); + for ( i=1; inccnt; ++i ) + fprintf( sfd, " Class: %d %s\n", strlen(fpst->nclass[i]), fpst->nclass[i]); + for ( i=1; ibccnt; ++i ) + fprintf( sfd, " BClass: %d %s\n", strlen(fpst->bclass[i]), fpst->bclass[i]); + for ( i=1; ifccnt; ++i ) + fprintf( sfd, " FClass: %d %s\n", strlen(fpst->fclass[i]), fpst->fclass[i]); + for ( i=0; irule_cnt; ++i ) { + switch ( fpst->format ) { + case pst_glyphs: + fprintf( sfd, " String: %d %s\n", strlen(fpst->rules[i].u.glyph.names), fpst->rules[i].u.glyph.names); + if ( fpst->rules[i].u.glyph.back!=NULL ) + fprintf( sfd, " BString: %d %s\n", strlen(fpst->rules[i].u.glyph.back), fpst->rules[i].u.glyph.back); + else + fprintf( sfd, " BString: 0\n"); + if ( fpst->rules[i].u.glyph.fore!=NULL ) + fprintf( sfd, " FString: %d %s\n", strlen(fpst->rules[i].u.glyph.fore), fpst->rules[i].u.glyph.fore); + else + fprintf( sfd, " FString: 0\n"); + break; + case pst_class: + fprintf( sfd, " %d %d %d\n ClsList:", fpst->rules[i].u.class.ncnt, fpst->rules[i].u.class.bcnt, fpst->rules[i].u.class.fcnt ); + for ( j=0; jrules[i].u.class.ncnt; ++j ) + fprintf( sfd, " %d", fpst->rules[i].u.class.nclasses[j]); + fprintf( sfd, "\n BClsList:" ); + for ( j=0; jrules[i].u.class.bcnt; ++j ) + fprintf( sfd, " %d", fpst->rules[i].u.class.bclasses[j]); + fprintf( sfd, "\n FClsList:" ); + for ( j=0; jrules[i].u.class.fcnt; ++j ) + fprintf( sfd, " %d", fpst->rules[i].u.class.fclasses[j]); + fprintf( sfd, "\n" ); + break; + case pst_coverage: + case pst_reversecoverage: + fprintf( sfd, " %d %d %d\n", fpst->rules[i].u.coverage.ncnt, fpst->rules[i].u.coverage.bcnt, fpst->rules[i].u.coverage.fcnt ); + for ( j=0; jrules[i].u.coverage.ncnt; ++j ) + fprintf( sfd, " Coverage: %d %s\n", strlen(fpst->rules[i].u.coverage.ncovers[j]), fpst->rules[i].u.coverage.ncovers[j]); + for ( j=0; jrules[i].u.coverage.bcnt; ++j ) + fprintf( sfd, " BCoverage: %d %s\n", strlen(fpst->rules[i].u.coverage.bcovers[j]), fpst->rules[i].u.coverage.bcovers[j]); + for ( j=0; jrules[i].u.coverage.fcnt; ++j ) + fprintf( sfd, " FCoverage: %d %s\n", strlen(fpst->rules[i].u.coverage.fcovers[j]), fpst->rules[i].u.coverage.fcovers[j]); + break; + } + switch ( fpst->format ) { + case pst_glyphs: + case pst_class: + case pst_coverage: + fprintf( sfd, " %d\n", fpst->rules[i].lookup_cnt ); + for ( j=0; jrules[i].lookup_cnt; ++j ) + fprintf( sfd, " SeqLookup: %d '%c%c%c%c'\n", + fpst->rules[i].lookups[j].seq, + fpst->rules[i].lookups[j].lookup_tag>>24, + (fpst->rules[i].lookups[j].lookup_tag>>16)&0xff, + (fpst->rules[i].lookups[j].lookup_tag>>8)&0xff, + (fpst->rules[i].lookups[j].lookup_tag)&0xff); + break; + case pst_reversecoverage: + fprintf( sfd, " Replace: %d %s\n", strlen(fpst->rules[i].u.rcoverage.replacements), fpst->rules[i].u.rcoverage.replacements); + break; + } + } + fprintf( sfd, "EndFPST\n" ); + } + for ( sm=sf->sm; sm!=NULL; sm=sm->next ) { + static char *keywords[] = { "MacIndic:", "MacContext:", "MacLigature:", "unused", "MacSimple:", "MacInsert:", + "unused", "unused", "unused", "unused", "unused", "unused", + "unused", "unused", "unused", "unused", "unused", "MacKern:", + NULL }; + fprintf( sfd, "%s %d,%d %d %d %d\n", + keywords[sm->type-asm_indic], + sm->feature, sm->setting, + sm->flags, + sm->class_cnt, sm->state_cnt ); + for ( i=4; iclass_cnt; ++i ) + fprintf( sfd, " Class: %d %s\n", strlen(sm->classes[i]), sm->classes[i]); + for ( i=0; iclass_cnt*sm->state_cnt; ++i ) { + fprintf( sfd, " %d %d ", sm->state[i].next_state, sm->state[i].flags ); + if ( sm->type==asm_context ) { + if ( sm->state[i].u.context.mark_tag==0 ) + fprintf(sfd,"~ "); + else + fprintf(sfd,"'%c%c%c%c' ", + sm->state[i].u.context.mark_tag>>24, + (sm->state[i].u.context.mark_tag>>16)&0xff, + (sm->state[i].u.context.mark_tag>>8)&0xff, + sm->state[i].u.context.mark_tag&0xff); + if ( sm->state[i].u.context.cur_tag==0 ) + fprintf(sfd,"~ "); + else + fprintf(sfd,"'%c%c%c%c' ", + sm->state[i].u.context.cur_tag>>24, + (sm->state[i].u.context.cur_tag>>16)&0xff, + (sm->state[i].u.context.cur_tag>>8)&0xff, + sm->state[i].u.context.cur_tag&0xff); + } else if ( sm->type == asm_insert ) { + if ( sm->state[i].u.insert.mark_ins==NULL ) + fprintf( sfd, "0 "); + else + fprintf( sfd, "%d %s ", strlen(sm->state[i].u.insert.mark_ins), + sm->state[i].u.insert.mark_ins ); + if ( sm->state[i].u.insert.cur_ins==NULL ) + fprintf( sfd, "0 "); + else + fprintf( sfd, "%d %s ", strlen(sm->state[i].u.insert.cur_ins), + sm->state[i].u.insert.cur_ins ); + } else if ( sm->type == asm_kern ) { + fprintf( sfd, "%d ", sm->state[i].u.kern.kcnt ); + for ( j=0; jstate[i].u.kern.kcnt; ++j ) + fprintf( sfd, "%d ", sm->state[i].u.kern.kerns[j]); + } + putc('\n',sfd); + } + fprintf( sfd, "EndASM\n" ); + } + SFDDumpMacFeat(sfd,sf->features); + if ( sf->gentags.tt_cur>0 ) { + fprintf( sfd, "GenTags: %d", sf->gentags.tt_cur ); + for ( i=0; igentags.tt_cur; ++i ) { + switch ( sf->gentags.tagtype[i].type ) { + case pst_position: fprintf(sfd," ps"); break; + case pst_pair: fprintf(sfd," pr"); break; + case pst_substitution: fprintf(sfd," sb"); break; + case pst_alternate: fprintf(sfd," as"); break; + case pst_multiple: fprintf(sfd," ms"); break; + case pst_ligature: fprintf(sfd," lg"); break; + case pst_anchors: fprintf(sfd," an"); break; + case pst_contextpos: fprintf(sfd," cp"); break; + case pst_contextsub: fprintf(sfd," cs"); break; + case pst_chainpos: fprintf(sfd," pc"); break; + case pst_chainsub: fprintf(sfd," sc"); break; + case pst_reversesub: fprintf(sfd," rs"); break; + case pst_null: fprintf(sfd," nl"); break; + } + fprintf(sfd,"'%c%c%c%c'", + sf->gentags.tagtype[i].tag>>24, + (sf->gentags.tagtype[i].tag>>16)&0xff, + (sf->gentags.tagtype[i].tag>>8)&0xff, + sf->gentags.tagtype[i].tag&0xff ); + } + putc('\n',sfd); + } + for ( ord = sf->orders; ord!=NULL ; ord = ord->next ) { + for ( i=0; ord->ordered_features[i]!=0; ++i ); + fprintf( sfd, "TableOrder: %c%c%c%c %d\n", + ord->table_tag>>24, (ord->table_tag>>16)&0xff, (ord->table_tag>>8)&0xff, ord->table_tag&0xff, + i ); + for ( i=0; ord->ordered_features[i]!=0; ++i ) + if ( (ord->ordered_features[i]>>24)<' ' || (ord->ordered_features[i]>>24)>=0x7f ) + fprintf( sfd, "\t<%d,%d>\n", ord->ordered_features[i]>>16, ord->ordered_features[i]&0xffff ); + else + fprintf( sfd, "\t'%c%c%c%c'\n", + ord->ordered_features[i]>>24, (ord->ordered_features[i]>>16)&0xff, (ord->ordered_features[i]>>8)&0xff, ord->ordered_features[i]&0xff ); + } + for ( tab = sf->ttf_tables; tab!=NULL ; tab = tab->next ) + SFDDumpTtfTable(sfd,tab); + for ( ln = sf->names; ln!=NULL; ln=ln->next ) + SFDDumpLangName(sfd,ln); + if ( sf->subfontcnt!=0 ) { + /* CID fonts have no encodings, they have registry info instead */ + fprintf(sfd, "Registry: %s\n", sf->cidregistry ); + fprintf(sfd, "Ordering: %s\n", sf->ordering ); + fprintf(sfd, "Supplement: %d\n", sf->supplement ); + fprintf(sfd, "CIDVersion: %g\n", sf->cidversion ); /* This is a number whereas "version" is a string */ + } else if ( sf->compacted ) { + fprintf(sfd, "Encoding: compacted\n" ); + SFDDumpEncoding(sfd,sf->old_encname,"OldEncoding"); + } else + SFDDumpEncoding(sfd,sf->encoding_name,"Encoding"); + fprintf( sfd, "UnicodeInterp: %s\n", unicode_interp_names[sf->uni_interp]); + + if ( sf->remap!=NULL ) { + struct remap *map; + int n; + for ( n=0,map = sf->remap; map->infont!=-1; ++n, ++map ); + fprintf( sfd, "RemapN: %d\n", n ); + for ( map = sf->remap; map->infont!=-1; ++map ) + fprintf(sfd, "Remap: %x %x %d\n", map->firstenc, map->lastenc, map->infont ); + } + if ( sf->display_size!=0 ) + fprintf( sfd, "DisplaySize: %d\n", sf->display_size ); + fprintf( sfd, "AntiAlias: %d\n", sf->display_antialias ); + fprintf( sfd, "FitToEm: %d\n", sf->display_bbsized ); + { + int rc, cc, te; + if ( (te = FVWinInfo(sf->fv,&cc,&rc))!= -1 ) + fprintf( sfd, "WinInfo: %d %d %d\n", te, cc, rc ); + else if ( sf->top_enc!=-1 ) + fprintf( sfd, "WinInfo: %d %d %d\n", sf->top_enc, sf->desired_col_cnt, + sf->desired_row_cnt); + } + if ( sf->onlybitmaps!=0 ) + fprintf( sfd, "OnlyBitmaps: %d\n", sf->onlybitmaps ); + if ( sf->private!=NULL ) + SFDDumpPrivate(sfd,sf->private); +#if HANYANG + if ( sf->rules!=NULL ) + SFDDumpCompositionRules(sfd,sf->rules); +#endif + if ( sf->grid.splines!=NULL ) { + fprintf(sfd, "Grid\n" ); + SFDDumpSplineSet(sfd,sf->grid.splines); + } + if ( sf->texdata.type!=tex_unset ) { + fprintf(sfd, "TeXData: %d %d", sf->texdata.type, sf->texdata.designsize ); + for ( i=0; i<22; ++i ) + fprintf(sfd, " %d", sf->texdata.params[i]); + putc('\n',sfd); + } + if ( sf->anchor!=NULL ) { + AnchorClass *an; + fprintf(sfd, "AnchorClass: "); + for ( an=sf->anchor; an!=NULL; an=an->next ) { + SFDDumpUTF7Str(sfd,an->name); + if ( an->feature_tag==0 ) + fprintf( sfd, "0 "); + else + fprintf( sfd, "%c%c%c%c ", + an->feature_tag>>24, (an->feature_tag>>16)&0xff, + (an->feature_tag>>8)&0xff, an->feature_tag&0xff ); + fprintf( sfd, "%d %d %d %d ", an->flags, an->script_lang_index, + an->merge_with, an->type ); + } + putc('\n',sfd); + } + + if ( sf->subfontcnt!=0 ) { + int max; + for ( i=max=0; isubfontcnt; ++i ) + if ( maxsubfonts[i]->charcnt ) + max = sf->subfonts[i]->charcnt; + fprintf(sfd, "BeginSubFonts: %d %d\n", sf->subfontcnt, max ); + for ( i=0; isubfontcnt; ++i ) + SFD_Dump(sfd,sf->subfonts[i]); + fprintf(sfd, "EndSubFonts\n" ); + } else { + if ( sf->cidmaster!=NULL ) + realcnt = -1; + else { + realcnt = 0; + for ( i=0; icharcnt; ++i ) if ( !SFDOmit(sf->chars[i]) ) + ++realcnt; + } + fprintf(sfd, "BeginChars: %d %d\n", sf->charcnt, realcnt ); + for ( i=0; icharcnt; ++i ) { + if ( !SFDOmit(sf->chars[i]) ) + SFDDumpChar(sfd,sf->chars[i]); + GProgressNext(); + } + fprintf(sfd, "EndChars\n" ); + } + + if ( sf->bitmaps!=NULL ) + GProgressChangeLine2R(_STR_SavingBitmaps); + for ( bdf = sf->bitmaps; bdf!=NULL; bdf=bdf->next ) + SFDDumpBitmapFont(sfd,bdf); + fprintf(sfd, sf->cidmaster==NULL?"EndSplineFont\n":"EndSubSplineFont\n" ); +} + +static void SFD_MMDump(FILE *sfd,SplineFont *sf) { + MMSet *mm = sf->mm; + int max, i, j; + + fprintf( sfd, "MMCounts: %d %d\n", mm->instance_count, mm->axis_count ); + fprintf( sfd, "MMAxis:" ); + for ( i=0; iaxis_count; ++i ) + fprintf( sfd, " %s", mm->axes[i]); + putc('\n',sfd); + fprintf( sfd, "MMPositions:" ); + for ( i=0; iaxis_count*mm->instance_count; ++i ) + fprintf( sfd, " %g", mm->positions[i]); + putc('\n',sfd); + fprintf( sfd, "MMWeights:" ); + for ( i=0; iinstance_count; ++i ) + fprintf( sfd, " %g", mm->defweights[i]); + putc('\n',sfd); + for ( i=0; iaxis_count; ++i ) { + fprintf( sfd, "MMAxisMap: %d %d", i, mm->axismaps[i].points ); + for ( j=0; jaxismaps[i].points; ++j ) + fprintf( sfd, " %g=>%g", mm->axismaps[i].blends[j], mm->axismaps[i].designs[j]); + fputc('\n',sfd); + } + fprintf( sfd, "MMCDV:\n" ); + fputs(mm->cdv,sfd); + fprintf( sfd, "\nEndMMSubroutine\n" ); + fprintf( sfd, "MMNDV:\n" ); + fputs(mm->ndv,sfd); + fprintf( sfd, "\nEndMMSubroutine\n" ); + + for ( i=max=0; iinstance_count; ++i ) + if ( maxinstances[i]->charcnt ) + max = mm->instances[i]->charcnt; + fprintf(sfd, "BeginMMFonts: %d %d\n", mm->instance_count+1, max ); + for ( i=0; iinstance_count; ++i ) + SFD_Dump(sfd,mm->instances[i]); + SFD_Dump(sfd,mm->normal); + fprintf(sfd, "EndMMFonts\n" ); +} + +static void SFDDump(FILE *sfd,SplineFont *sf) { + int i, realcnt; + BDFFont *bdf; + + realcnt = sf->charcnt; + if ( sf->subfontcnt!=0 ) { + for ( i=0; isubfontcnt; ++i ) + if ( realcntsubfonts[i]->charcnt ) + realcnt = sf->subfonts[i]->charcnt; + } + for ( i=0, bdf = sf->bitmaps; bdf!=NULL; bdf=bdf->next, ++i ); + GProgressStartIndicatorR(10,_STR_Saving,_STR_SavingDb,_STR_SavingOutlines, + realcnt,i+1); + GProgressEnableStop(false); + fprintf(sfd, "SplineFontDB: %.1f\n", 1.0 ); + if ( sf->mm != NULL ) + SFD_MMDump(sfd,sf->mm->normal); + else + SFD_Dump(sfd,sf); + GProgressEndIndicator(); +} + +int SFDWrite(char *filename,SplineFont *sf) { + FILE *sfd = fopen(filename,"w"); + char *oldloc; + + if ( sfd==NULL ) +return( 0 ); + oldloc = setlocale(LC_NUMERIC,"C"); + if ( sf->cidmaster!=NULL ) + sf=sf->cidmaster; + SFDDump(sfd,sf); + setlocale(LC_NUMERIC,oldloc); +return( !ferror(sfd) && fclose(sfd)==0 ); +} + +int SFDWriteBak(SplineFont *sf) { + char *buf/*, *pt, *bpt*/; + + if ( sf->cidmaster!=NULL ) + sf=sf->cidmaster; + buf = galloc(strlen(sf->filename)+10); +#if 1 + strcpy(buf,sf->filename); + strcat(buf,"~"); +#else + pt = strrchr(sf->filename,'.'); + if ( pt==NULL || ptfilename,'/')) + pt = sf->filename+strlen(sf->filename); + strcpy(buf,sf->filename); + bpt = buf + (pt-sf->filename); + *bpt++ = '~'; + strcpy(bpt,pt); +#endif + rename(sf->filename,buf); + free(buf); + +return( SFDWrite(sf->filename,sf)); +} + +/* ********************************* INPUT ********************************** */ + +static char *getquotedeol(FILE *sfd) { + char *pt, *str, *end; + int ch; + + pt = str = galloc(100); end = str+100; + while ( isspace(ch = getc(sfd)) && ch!='\r' && ch!='\n' ); + while ( ch!='\n' && ch!='\r' && ch!=EOF ) { + if ( ch=='\\' ) { + ch = getc(sfd); + if ( ch=='n' ) ch='\n'; + } + if ( pt>=end ) { + pt = grealloc(str,end-str+100); + end = pt+(end-str)+100; + str = pt; + pt = end-100; + } + *pt++ = ch; + ch = getc(sfd); + } + *pt='\0'; +return( str ); +} + +static int geteol(FILE *sfd, char *tokbuf) { + char *pt=tokbuf, *end = tokbuf+2000-2; int ch; + + while ( isspace(ch = getc(sfd)) && ch!='\r' && ch!='\n' ); + while ( ch!='\n' && ch!='\r' && ch!=EOF ) { + if ( pt='a' && ch<='f') || (ch>='A' && ch<='F')) { + if ( ptpos<0 ) { + while ( isspace(ch1=getc(dec->sfd))); + if ( ch1=='z' ) { + dec->sofar[0] = dec->sofar[1] = dec->sofar[2] = dec->sofar[3] = 0; + dec->pos = 3; + } else { + while ( isspace(ch2=getc(dec->sfd))); + while ( isspace(ch3=getc(dec->sfd))); + while ( isspace(ch4=getc(dec->sfd))); + while ( isspace(ch5=getc(dec->sfd))); + val = ((((ch1-'!')*85+ ch2-'!')*85 + ch3-'!')*85 + ch4-'!')*85 + ch5-'!'; + dec->sofar[3] = val>>24; + dec->sofar[2] = val>>16; + dec->sofar[1] = val>>8; + dec->sofar[0] = val; + dec->pos = 3; + } + } +return( dec->sofar[dec->pos--] ); +} + +static void rle2image(struct enc85 *dec,int rlelen,struct _GImage *base) { + uint8 *pt, *end; + int r,c,set, cnt, ch, ch2; + int i; + + r = c = 0; set = 1; pt = base->data; end = pt + base->bytes_per_line*base->height; + memset(base->data,0xff,end-pt); + while ( rlelen>0 ) { + if ( pt>=end ) { + fprintf( stderr, "IError: RLE failure\n" ); + while ( rlelen>0 ) { Dec85(dec); --rlelen; } + break; + } + ch = Dec85(dec); + --rlelen; + if ( ch==255 ) { + ch2 = Dec85(dec); + cnt = (ch2<<8) + Dec85(dec); + rlelen -= 2; + } else + cnt = ch; + if ( ch==255 && ch2==0 && cnt<255 ) { + /* Line duplication */ + for ( i=0; idata+(r-1)*base->bytes_per_line,base->bytes_per_line); + ++r; + pt += base->bytes_per_line; + } + set = 1; + } else { + if ( !set ) { + for ( i=0; i>3] &= ((~0x80)>>((c+i)&7)); + } + c += cnt; + set = 1-set; + if ( c>=base->width ) { + ++r; + pt += base->bytes_per_line; + c = 0; set = 1; + } + } + } +} + +static ImageList *SFDGetImage(FILE *sfd) { + /* We've read the image token */ + int width, height, image_type, bpl, clutlen, trans, rlelen; + struct _GImage *base; + GImage *image; + ImageList *img; + struct enc85 dec; + int i, ch; + + memset(&dec,'\0', sizeof(dec)); dec.pos = -1; + dec.sfd = sfd; + + getint(sfd,&width); + getint(sfd,&height); + getint(sfd,&image_type); + getint(sfd,&bpl); + getint(sfd,&clutlen); + gethex(sfd,&trans); + image = GImageCreate(image_type,width,height); + base = image->list_len==0?image->u.image:image->u.images[0]; + img = gcalloc(1,sizeof(ImageList)); + img->image = image; + getreal(sfd,&img->xoff); + getreal(sfd,&img->yoff); + getreal(sfd,&img->xscale); + getreal(sfd,&img->yscale); + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + ungetc(ch,sfd); + rlelen = 0; + if ( isdigit(ch)) + getint(sfd,&rlelen); + base->trans = trans; + if ( clutlen!=0 ) { + if ( base->clut==NULL ) + base->clut = gcalloc(1,sizeof(GClut)); + base->clut->clut_len = clutlen; + base->clut->trans_index = trans; + for ( i=0;iclut->clut[i] = (r<<16)|(g<<8)|b; + } + } + if ( rlelen!=0 ) { + rle2image(&dec,rlelen,base); + } else { + for ( i=0; idata + i*base->bytes_per_line); + int *iend = (int *) (base->data + (i+1)*base->bytes_per_line); + int r,g,b; + while ( iptdata + i*base->bytes_per_line); + uint8 *end = (uint8 *) (base->data + (i+1)*base->bytes_per_line); + while ( ptbb.minx = img->xoff; img->bb.maxy = img->yoff; + img->bb.maxx = img->xoff + GImageGetWidth(img->image)*img->xscale; + img->bb.miny = img->yoff - GImageGetHeight(img->image)*img->yscale; + /* In old sfd files I failed to recognize bitmap pngs as bitmap, so put */ + /* in a little check here that converts things which should be bitmap to */ + /* bitmap */ /* Eventually it can be removed as all old sfd files get */ + /* converted. 22/10/2002 */ + if ( base->image_type==it_index && base->clut!=NULL && base->clut->clut_len==2 ) + img->image = ImageAlterClut(img->image); +return( img ); +} + +static void SFDGetType1(FILE *sfd, SplineChar *sc) { + /* We've read the OrigType1 token (this is now obselete, but parse it in case there are any old sfds) */ + int len; + struct enc85 dec; + + memset(&dec,'\0', sizeof(dec)); dec.pos = -1; + dec.sfd = sfd; + + getint(sfd,&len); + while ( --len >= 0 ) + Dec85(&dec); +} + +static void SFDGetTtfInstrs(FILE *sfd, SplineChar *sc) { + /* We've read the TtfInstr token, it is followed by a byte count */ + /* and then the instructions in enc85 format */ + int i,len; + struct enc85 dec; + + memset(&dec,'\0', sizeof(dec)); dec.pos = -1; + dec.sfd = sfd; + + getint(sfd,&len); + sc->ttf_instrs = galloc(len); + sc->ttf_instrs_len = len; + for ( i=0; ittf_instrs[i] = Dec85(&dec); +} + +static struct ttf_table *SFDGetTtfTable(FILE *sfd, SplineFont *sf,struct ttf_table *lasttab) { + /* We've read the TtfTable token, it is followed by a tag and a byte count */ + /* and then the instructions in enc85 format */ + int i,len, ch; + struct enc85 dec; + struct ttf_table *tab = chunkalloc(sizeof(struct ttf_table)); + + memset(&dec,'\0', sizeof(dec)); dec.pos = -1; + dec.sfd = sfd; + + while ( (ch=getc(sfd))==' ' ); + tab->tag = (ch<<24)|(getc(sfd)<<16); + tab->tag |= getc(sfd)<<8; + tab->tag |= getc(sfd); + + getint(sfd,&len); + tab->data = galloc(len); + tab->len = len; + for ( i=0; idata[i] = Dec85(&dec); + + if ( lasttab==NULL ) + sf->ttf_tables = tab; + else + lasttab->next = tab; +return( tab ); +} + +static int SFDCloseCheck(SplinePointList *spl,int order2) { + if ( spl->first!=spl->last && + RealNear(spl->first->me.x,spl->last->me.x) && + RealNear(spl->first->me.y,spl->last->me.y)) { + SplinePoint *oldlast = spl->last; + spl->first->prevcp = oldlast->prevcp; + spl->first->noprevcp = false; + oldlast->prev->from->next = NULL; + spl->last = oldlast->prev->from; + chunkfree(oldlast->prev,sizeof(*oldlast)); + chunkfree(oldlast,sizeof(*oldlast)); + SplineMake(spl->last,spl->first,order2); + spl->last = spl->first; +return( true ); + } +return( false ); +} + +static void SFDGetHintMask(FILE *sfd,HintMask *hintmask) { + int nibble = 0, ch; + + memset(hintmask,0,sizeof(HintMask)); + forever { + ch = getc(sfd); + if ( isdigit(ch)) + ch -= '0'; + else if ( ch>='a' && ch<='f' ) + ch -= 'a'-10; + else if ( ch>='A' && ch<='F' ) + ch -= 'A'-10; + else { + ungetc(ch,sfd); + break; + } + if ( nibble<2*HntMax/8 ) + (*hintmask)[nibble>>1] |= ch<<(4*(1-(nibble&1))); + ++nibble; + } +} + +static SplineSet *SFDGetSplineSet(SplineFont *sf,FILE *sfd) { + SplinePointList *cur=NULL, *head=NULL; + BasePoint current; + real stack[100]; + int sp=0; + SplinePoint *pt; + int ch; + char tok[100]; + int ttfindex = 0; + + current.x = current.y = 0; + while ( 1 ) { + while ( getreal(sfd,&stack[sp])==1 ) + if ( sp<99 ) + ++sp; + while ( isspace(ch=getc(sfd))); + if ( ch=='E' || ch=='e' || ch==EOF ) + break; + pt = NULL; + if ( ch=='l' || ch=='m' ) { + if ( sp>=2 ) { + current.x = stack[sp-2]; + current.y = stack[sp-1]; + sp -= 2; + pt = chunkalloc(sizeof(SplinePoint)); + pt->me = current; + pt->noprevcp = true; pt->nonextcp = true; + if ( ch=='m' ) { + SplinePointList *spl = chunkalloc(sizeof(SplinePointList)); + spl->first = spl->last = pt; + if ( cur!=NULL ) { + if ( SFDCloseCheck(cur,sf->order2)) + --ttfindex; + cur->next = spl; + } else + head = spl; + cur = spl; + } else { + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + if ( cur->last->nextcpindex==0xfffe ) + cur->last->nextcpindex = 0xffff; + SplineMake(cur->last,pt,sf->order2); + cur->last = pt; + } + } + } else + sp = 0; + } else if ( ch=='c' ) { + if ( sp>=6 ) { + current.x = stack[sp-2]; + current.y = stack[sp-1]; + if ( cur!=NULL && cur->first!=NULL && (cur->first!=cur->last || cur->first->next==NULL) ) { + cur->last->nextcp.x = stack[sp-6]; + cur->last->nextcp.y = stack[sp-5]; + cur->last->nonextcp = false; + pt = chunkalloc(sizeof(SplinePoint)); + pt->prevcp.x = stack[sp-4]; + pt->prevcp.y = stack[sp-3]; + pt->me = current; + pt->nonextcp = true; + if ( cur->last->nextcpindex==0xfffe ) + cur->last->nextcpindex = ttfindex++; + else if ( cur->last->nextcpindex!=0xffff ) + ttfindex = cur->last->nextcpindex+1; + SplineMake(cur->last,pt,sf->order2); + cur->last = pt; + } + sp -= 6; + } else + sp = 0; + } + if ( pt!=NULL ) { + int val; + getint(sfd,&val); + pt->pointtype = (val&3); + pt->selected = val&4?1:0; + pt->nextcpdef = val&8?1:0; + pt->prevcpdef = val&0x10?1:0; + pt->roundx = val&0x20?1:0; + pt->roundy = val&0x40?1:0; + if ( val&0x80 ) + pt->ttfindex = 0xffff; + else + pt->ttfindex = ttfindex++; + pt->nextcpindex = 0xfffe; + ch = getc(sfd); + if ( ch=='x' ) { + pt->hintmask = chunkalloc(sizeof(HintMask)); + SFDGetHintMask(sfd,pt->hintmask); + } else if ( ch!=',' ) + ungetc(ch,sfd); + else { + ch = getc(sfd); + if ( ch==',' ) + pt->ttfindex = 0xfffe; + else { + ungetc(ch,sfd); + getint(sfd,&val); + pt->ttfindex = val; + getc(sfd); /* skip comma */ + if ( val!=-1 ) + ttfindex = val+1; + } + ch = getc(sfd); + if ( ch=='\r' || ch=='\n' ) + ungetc(ch,sfd); + else { + ungetc(ch,sfd); + getint(sfd,&val); + pt->nextcpindex = val; + if ( val!=-1 ) + ttfindex = val+1; + } + } + } + } + if ( cur!=NULL ) + SFDCloseCheck(cur,sf->order2); + getname(sfd,tok); +return( head ); +} + +static void SFDGetMinimumDistances(FILE *sfd, SplineChar *sc) { + SplineSet *ss; + SplinePoint *sp; + int pt,i, val, err; + int ch; + SplinePoint **mapping=NULL; + MinimumDistance *last, *md; + + for ( i=0; i<2; ++i ) { + pt = 0; + for ( ss = sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( mapping!=NULL ) mapping[pt] = sp; + pt++; + if ( sp->next == NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + if ( mapping==NULL ) + mapping = gcalloc(pt,sizeof(SplineChar *)); + } + + last = NULL; + for ( ch=getc(sfd); ch!=EOF && ch!='\n'; ch=getc(sfd)) { + err = false; + while ( isspace(ch) && ch!='\n' ) ch=getc(sfd); + if ( ch=='\n' ) + break; + md = chunkalloc(sizeof(MinimumDistance)); + if ( ch=='x' ) md->x = true; + getint(sfd,&val); + if ( val<-1 || val>=pt ) { + fprintf( stderr, "Internal Error: Minimum Distance specifies bad point (%d) in sfd file\n", val ); + err = true; + } else if ( val!=-1 ) { + md->sp1 = mapping[val]; + md->sp1->dontinterpolate = true; + } + ch = getc(sfd); + if ( ch!=',' ) { + fprintf( stderr, "Internal Error: Minimum Distance lacks a comma where expected\n" ); + err = true; + } + getint(sfd,&val); + if ( val<-1 || val>=pt ) { + fprintf( stderr, "Internal Error: Minimum Distance specifies bad point (%d) in sfd file\n", val ); + err = true; + } else if ( val!=-1 ) { + md->sp2 = mapping[val]; + md->sp2->dontinterpolate = true; + } + if ( !err ) { + if ( last==NULL ) + sc->md = md; + else + last->next = md; + last = md; + } else + chunkfree(md,sizeof(MinimumDistance)); + } + free(mapping); +} + +static HintInstance *SFDReadHintInstances(FILE *sfd, StemInfo *stem) { + HintInstance *head=NULL, *last=NULL, *cur; + real begin, end; + int ch; + + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + if ( ch=='G' ) { + stem->ghost = true; + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + } + if ( ch!='<' ) { + ungetc(ch,sfd); +return(NULL); + } + while ( getreal(sfd,&begin)==1 && getreal(sfd,&end)) { + cur = chunkalloc(sizeof(HintInstance)); + cur->begin = begin; + cur->end = end; + if ( head == NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + if ( ch!='>' ) + ungetc(ch,sfd); +return( head ); +} + +static StemInfo *SFDReadHints(FILE *sfd) { + StemInfo *head=NULL, *last=NULL, *cur; + real start, width; + + while ( getreal(sfd,&start)==1 && getreal(sfd,&width)) { + cur = chunkalloc(sizeof(StemInfo)); + cur->start = start; + cur->width = width; + cur->where = SFDReadHintInstances(sfd,cur); + if ( head == NULL ) + head = cur; + else + last->next = cur; + last = cur; + } +return( head ); +} + +static DStemInfo *SFDReadDHints(FILE *sfd) { + DStemInfo *head=NULL, *last=NULL, *cur; + DStemInfo d; + + memset(&d,'\0',sizeof(d)); + while ( getreal(sfd,&d.leftedgetop.x)==1 && getreal(sfd,&d.leftedgetop.y) && + getreal(sfd,&d.rightedgetop.x)==1 && getreal(sfd,&d.rightedgetop.y) && + getreal(sfd,&d.leftedgebottom.x)==1 && getreal(sfd,&d.leftedgebottom.y) && + getreal(sfd,&d.rightedgebottom.x)==1 && getreal(sfd,&d.rightedgebottom.y) ) { + cur = chunkalloc(sizeof(DStemInfo)); + *cur = d; + if ( head == NULL ) + head = cur; + else + last->next = cur; + last = cur; + } +return( head ); +} + +static AnchorPoint *SFDReadAnchorPoints(FILE *sfd,SplineChar *sc,AnchorPoint *lastap) { + AnchorPoint *ap = chunkalloc(sizeof(AnchorPoint)); + AnchorClass *an; + unichar_t *name; + char tok[200]; + + name = SFDReadUTF7Str(sfd); + for ( an=sc->parent->anchor; an!=NULL && u_strcmp(an->name,name)!=0; an=an->next ); + free(name); + ap->anchor = an; + getreal(sfd,&ap->me.x); + getreal(sfd,&ap->me.y); + ap->type = -1; + if ( getname(sfd,tok)==1 ) { + if ( strcmp(tok,"mark")==0 ) + ap->type = at_mark; + else if ( strcmp(tok,"basechar")==0 ) + ap->type = at_basechar; + else if ( strcmp(tok,"baselig")==0 ) + ap->type = at_baselig; + else if ( strcmp(tok,"basemark")==0 ) + ap->type = at_basemark; + else if ( strcmp(tok,"entry")==0 ) + ap->type = at_centry; + else if ( strcmp(tok,"exit")==0 ) + ap->type = at_cexit; + } + getint(sfd,&ap->lig_index); + if ( ap->anchor==NULL || ap->type==-1 ) { + chunkfree(ap,sizeof(AnchorPoint)); +return( lastap ); + } + if ( lastap==NULL ) + sc->anchor = ap; + else + lastap->next = ap; +return( ap ); +} + +static RefChar *SFDGetRef(FILE *sfd) { + RefChar *rf; + int enc=0, ch; + + rf = RefCharCreate(); + getint(sfd,&enc); + rf->local_enc = enc; + if ( getint(sfd,&enc)) + rf->unicode_enc = enc; + while ( isspace(ch=getc(sfd))); + if ( ch=='S' ) rf->selected = true; + getreal(sfd,&rf->transform[0]); + getreal(sfd,&rf->transform[1]); + getreal(sfd,&rf->transform[2]); + getreal(sfd,&rf->transform[3]); + getreal(sfd,&rf->transform[4]); + getreal(sfd,&rf->transform[5]); +return( rf ); +} + +/* I used to create multiple ligatures by putting ";" between them */ +/* that is the component string for "ffi" was "ff i ; f f i" */ +/* Now I want to have seperate ligature structures for each */ +static PST *LigaCreateFromOldStyleMultiple(PST *liga) { + char *pt; + PST *new, *last=liga; + while ( (pt = strrchr(liga->u.lig.components,';'))!=NULL ) { + new = chunkalloc(sizeof( PST )); + *new = *liga; + new->u.lig.components = copy(pt+1); + last->next = new; + last = new; + *pt = '\0'; + } +return( last ); +} + +#ifdef FONTFORGE_CONFIG_CVT_OLD_MAC_FEATURES +static struct { int feature, setting; uint32 tag; } formertags[] = { + { 1, 6, CHR('M','L','O','G') }, + { 1, 8, CHR('M','R','E','B') }, + { 1, 10, CHR('M','D','L','G') }, + { 1, 12, CHR('M','S','L','G') }, + { 1, 14, CHR('M','A','L','G') }, + { 8, 0, CHR('M','S','W','I') }, + { 8, 2, CHR('M','S','W','F') }, + { 8, 4, CHR('M','S','L','I') }, + { 8, 6, CHR('M','S','L','F') }, + { 8, 8, CHR('M','S','N','F') }, + { 22, 1, CHR('M','W','I','D') }, + { 27, 1, CHR('M','U','C','M') }, + { 103, 2, CHR('M','W','I','D') }, + { -1, -1, 0xffffffff }, +}; + +static void CvtOldMacFeature(PST *pst) { + int i; + + if ( pst->macfeature ) +return; + for ( i=0; formertags[i].feature!=-1 ; ++i ) { + if ( pst->tag == formertags[i].tag ) { + pst->macfeature = true; + pst->tag = (formertags[i].feature<<16) | formertags[i].setting; +return; + } + } +} +#endif + +static SplineChar *SFDGetChar(FILE *sfd,SplineFont *sf) { + SplineChar *sc; + char tok[2000], ch; + RefChar *lastr=NULL, *ref; + ImageList *lasti=NULL, *img; + AnchorPoint *lastap = NULL; + int isliga, ispos, issubs, ismult, islcar, ispair, temp, i; + PST *last = NULL; + uint32 script = 0; + int current_layer = ly_fore; + int multilayer = sf->multilayer; + + if ( getname(sfd,tok)!=1 ) +return( NULL ); + if ( strcmp(tok,"StartChar:")!=0 ) +return( NULL ); + if ( getname(sfd,tok)!=1 ) +return( NULL ); + + sc = SplineCharCreate(); + sc->name = copy(tok); + sc->vwidth = sf->ascent+sf->descent; + sc->parent = sf; + while ( 1 ) { + if ( getname(sfd,tok)!=1 ) { + SplineCharFree(sc); +return( NULL ); + } + if ( strmatch(tok,"Encoding:")==0 ) { + getint(sfd,&sc->enc); + getint(sfd,&sc->unicodeenc); + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + ungetc(ch,sfd); + if ( ch!='\n' && ch!='\r' ) { + getusint(sfd,&sc->orig_pos); + } + } else if ( strmatch(tok,"OldEncoding:")==0 ) { + getint(sfd,&sc->old_enc); + } else if ( strmatch(tok,"Script:")==0 ) { + /* Obsolete. But still used for parsing obsolete ligature/subs tags */ + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + if ( ch=='\n' || ch=='\r' ) + script = 0; + else { + script = ch<<24; + script |= (getc(sfd)<<16); + script |= (getc(sfd)<<8); + script |= getc(sfd); + } + } else if ( strmatch(tok,"Width:")==0 ) { + getsint(sfd,&sc->width); + } else if ( strmatch(tok,"VWidth:")==0 ) { + getsint(sfd,&sc->vwidth); + } else if ( strmatch(tok,"GlyphClass:")==0 ) { + getint(sfd,&temp); + sc->glyph_class = temp; + } else if ( strmatch(tok,"Flags:")==0 ) { + while ( isspace(ch=getc(sfd)) && ch!='\n' && ch!='\r'); + while ( ch!='\n' && ch!='\r' ) { + if ( ch=='H' ) sc->changedsincelasthinted=true; + else if ( ch=='M' ) sc->manualhints = true; + else if ( ch=='W' ) sc->widthset = true; + else if ( ch=='O' ) sc->wasopen = true; + ch = getc(sfd); + } +#if HANYANG + } else if ( strmatch(tok,"CompositionUnit:")==0 ) { + getsint(sfd,&sc->jamo); + getsint(sfd,&sc->varient); + sc->compositionunit = true; +#endif + } else if ( strmatch(tok,"HStem:")==0 ) { + sc->hstem = SFDReadHints(sfd); + SCGuessHHintInstancesList(sc); /* For reading in old .sfd files with no HintInstance data */ + sc->hconflicts = StemListAnyConflicts(sc->hstem); + } else if ( strmatch(tok,"VStem:")==0 ) { + sc->vstem = SFDReadHints(sfd); + SCGuessVHintInstancesList(sc); /* For reading in old .sfd files */ + sc->vconflicts = StemListAnyConflicts(sc->vstem); + } else if ( strmatch(tok,"DStem:")==0 ) { + sc->dstem = SFDReadDHints(sfd); + } else if ( strmatch(tok,"CounterMasks:")==0 ) { + getsint(sfd,&sc->countermask_cnt); + sc->countermasks = gcalloc(sc->countermask_cnt,sizeof(HintMask)); + for ( i=0; icountermask_cnt; ++i ) + SFDGetHintMask(sfd,&sc->countermasks[i]); + } else if ( strmatch(tok,"AnchorPoint:")==0 ) { + lastap = SFDReadAnchorPoints(sfd,sc,lastap); + } else if ( strmatch(tok,"Fore")==0 ) { + sc->layers[ly_fore].splines = SFDGetSplineSet(sf,sfd); + current_layer = ly_fore; + } else if ( strmatch(tok,"MinimumDistance:")==0 ) { + SFDGetMinimumDistances(sfd,sc); + } else if ( strmatch(tok,"Back")==0 ) { + sc->layers[ly_back].splines = SFDGetSplineSet(sf,sfd); + current_layer = ly_back; +#ifdef FONTFORGE_CONFIG_TYPE3 + } else if ( strmatch(tok,"LayerCount:")==0 ) { + getint(sfd,&temp); + if ( temp>sc->layer_cnt ) { + sc->layers = grealloc(sc->layers,temp*sizeof(Layer)); + memset(sc->layers+sc->layer_cnt,0,(temp-sc->layer_cnt)*sizeof(Layer)); + } + sc->layer_cnt = temp; + current_layer = ly_fore; + } else if ( strmatch(tok,"Layer:")==0 ) { + int layer, dofill, dostroke, fillfirst, fillcol, strokecol, linejoin, linecap; + real fillopacity, strokeopacity, strokewidth, trans[4]; + int i; + getint(sfd,&layer); + getint(sfd,&dofill); + getint(sfd,&dostroke); + getint(sfd,&fillfirst); + gethex(sfd,&fillcol); + getreal(sfd,&fillopacity); + gethex(sfd,&strokecol); + getreal(sfd,&strokeopacity); + getreal(sfd,&strokewidth); + getname(sfd,tok); + for ( i=0; joins[i]!=NULL; ++i ) + if ( strmatch(joins[i],tok)==0 ) + break; + if ( joins[i]==NULL ) --i; + linejoin = i; + getname(sfd,tok); + for ( i=0; caps[i]!=NULL; ++i ) + if ( strmatch(caps[i],tok)==0 ) + break; + if ( caps[i]==NULL ) --i; + linecap = i; + if ( layer>=sc->layer_cnt ) { + sc->layers = grealloc(sc->layers,(layer+1)*sizeof(Layer)); + memset(sc->layers+sc->layer_cnt,0,(layer+1-sc->layer_cnt)*sizeof(Layer)); + } + while ( (ch=getc(sfd))==' ' || ch=='[' ); + ungetc(ch,sfd); + getreal(sfd,&trans[0]); + getreal(sfd,&trans[1]); + getreal(sfd,&trans[2]); + getreal(sfd,&trans[3]); + current_layer = layer; + sc->layers[current_layer].dofill = dofill; + sc->layers[current_layer].dostroke = dostroke; + sc->layers[current_layer].fillfirst = fillfirst; + sc->layers[current_layer].fill_brush.col = fillcol; + sc->layers[current_layer].fill_brush.opacity = fillopacity; + sc->layers[current_layer].stroke_pen.brush.col = strokecol; + sc->layers[current_layer].stroke_pen.brush.opacity = strokeopacity; + sc->layers[current_layer].stroke_pen.width = strokewidth; + sc->layers[current_layer].stroke_pen.linejoin = linejoin; + sc->layers[current_layer].stroke_pen.linecap = linecap; + memcpy(sc->layers[current_layer].stroke_pen.trans,trans,sizeof(trans)); + lasti = NULL; + lastr = NULL; + } else if ( strmatch(tok,"SplineSet")==0 ) { + sc->layers[current_layer].splines = SFDGetSplineSet(sf,sfd); +#endif + } else if ( strmatch(tok,"Ref:")==0 ) { + if ( !multilayer ) current_layer = ly_fore; + ref = SFDGetRef(sfd); + if ( sc->layers[current_layer].refs==NULL ) + sc->layers[current_layer].refs = ref; + else + lastr->next = ref; + lastr = ref; + } else if ( strmatch(tok,"Image:")==0 ) { + if ( !multilayer ) current_layer = ly_back; + img = SFDGetImage(sfd); + if ( sc->layers[current_layer].images==NULL ) + sc->layers[current_layer].images = img; + else + lasti->next = img; + lasti = img; + } else if ( strmatch(tok,"OrigType1:")==0 ) { /* Accept, slurp, ignore contents */ + SFDGetType1(sfd,sc); + } else if ( strmatch(tok,"TtfInstrs:")==0 ) { + SFDGetTtfInstrs(sfd,sc); + } else if ( strmatch(tok,"Kerns:")==0 || + strmatch(tok,"KernsSLI:")==0 || + strmatch(tok,"KernsSLIF:")==0 || + strmatch(tok,"VKernsSLIF:")==0 ) { + KernPair *kp, *last=NULL; + int index, off, sli, flags=0; + int hassli = (strmatch(tok,"KernsSLI:")==0); + int isv = *tok=='V'; + if ( strmatch(tok,"KernsSLIF:")==0 ) hassli=2; + if ( strmatch(tok,"VKernsSLIF:")==0 ) hassli=2; + while ( (hassli==1 && fscanf(sfd,"%d %d %d", &index, &off, &sli )==3) || + (hassli==2 && fscanf(sfd,"%d %d %d %d", &index, &off, &sli, &flags )==4) || + (hassli==0 && fscanf(sfd,"%d %d", &index, &off )==2) ) { + if ( !hassli ) + sli = SFAddScriptLangIndex(sf, + script!=0?script:SCScriptFromUnicode(sc),DEFAULT_LANG); + if ( sli>=sf->sli_cnt && sli!=SLI_NESTED) { + static int complained=false; + if ( !complained ) + GDrawIError("'%s' in %s has a script index out of bounds: %d", + isv ? "vkrn" : "kern", + sc->name, sli ); + else + fprintf( stderr, "Internal Error: '%s' in %s has a script index out of bounds: %d", + isv ? "vkrn" : "kern", + sc->name, sli ); + sli = SFAddScriptLangIndex(sf, + SCScriptFromUnicode(sc),DEFAULT_LANG); + complained = true; + } + kp = chunkalloc(sizeof(KernPair)); + kp->sc = (SplineChar *) index; + kp->off = off; + kp->sli = sli; + kp->flags = flags; + kp->next = NULL; + if ( last != NULL ) + last->next = kp; + else if ( isv ) + sc->vkerns = kp; + else + sc->kerns = kp; + last = kp; + } + } else if ( (ispos = (strmatch(tok,"Position:")==0)) || + ( ispair = (strmatch(tok,"PairPos:")==0)) || + ( islcar = (strmatch(tok,"LCarets:")==0)) || + ( isliga = (strmatch(tok,"Ligature:")==0)) || + ( issubs = (strmatch(tok,"Substitution:")==0)) || + ( ismult = (strmatch(tok,"MultipleSubs:")==0)) || + strmatch(tok,"AlternateSubs:")==0 ) { + PST *liga = chunkalloc(sizeof(PST)); + if ( last==NULL ) + sc->possub = liga; + else + last->next = liga; + last = liga; + liga->type = ispos ? pst_position : + ispair ? pst_pair : + islcar ? pst_lcaret : + isliga ? pst_ligature : + issubs ? pst_substitution : + ismult ? pst_multiple : + pst_alternate; + liga->tag = CHR('l','i','g','a'); + liga->script_lang_index = 0xffff; + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + if ( isdigit(ch)) { + int temp; + ungetc(ch,sfd); + getint(sfd,&temp); + liga->flags = temp; + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + } else + liga->flags = PSTDefaultFlags(liga->type,sc); + if ( isdigit(ch)) { + ungetc(ch,sfd); + getusint(sfd,&liga->script_lang_index); + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + } else + liga->script_lang_index = SFAddScriptLangIndex(sf, + script!=0?script:SCScriptFromUnicode(sc),DEFAULT_LANG); + if ( ch=='\'' ) { + liga->tag = getc(sfd)<<24; + liga->tag |= getc(sfd)<<16; + liga->tag |= getc(sfd)<<8; + liga->tag |= getc(sfd); + getc(sfd); /* Final quote */ + } else if ( ch=='<' ) { + getint(sfd,&temp); + liga->tag = temp<<16; + getc(sfd); /* comma */ + getint(sfd,&temp); + liga->tag |= temp; + getc(sfd); /* close '>' */ + liga->macfeature = true; + } else + ungetc(ch,sfd); + if ( liga->script_lang_index>=sf->sli_cnt && liga->script_lang_index!=SLI_NESTED && + liga->type!=pst_lcaret ) { + static int complained=false; + if ( !complained ) + GDrawIError("'%c%c%c%c' in %s has a script index out of bounds: %d", + (liga->tag>>24), (liga->tag>>16)&0xff, (liga->tag>>8)&0xff, liga->tag&0xff, + sc->name, liga->script_lang_index ); + else + fprintf( stderr, "Internal Error: '%c%c%c%c' in %s has a script index out of bounds: %d\n", + (liga->tag>>24), (liga->tag>>16)&0xff, (liga->tag>>8)&0xff, liga->tag&0xff, + sc->name, liga->script_lang_index ); + liga->script_lang_index = SFAddScriptLangIndex(sf, + SCScriptFromUnicode(sc),DEFAULT_LANG); + complained = true; + } + if ( liga->type==pst_position ) + fscanf( sfd, " dx=%hd dy=%hd dh=%hd dv=%hd\n", + &liga->u.pos.xoff, &liga->u.pos.yoff, + &liga->u.pos.h_adv_off, &liga->u.pos.v_adv_off); + else if ( liga->type==pst_pair ) { + getname(sfd,tok); + liga->u.pair.paired = copy(tok); + liga->u.pair.vr = chunkalloc(sizeof(struct vr [2])); + fscanf( sfd, " dx=%hd dy=%hd dh=%hd dv=%hd | dx=%hd dy=%hd dh=%hd dv=%hd\n", + &liga->u.pair.vr[0].xoff, &liga->u.pair.vr[0].yoff, + &liga->u.pair.vr[0].h_adv_off, &liga->u.pair.vr[0].v_adv_off, + &liga->u.pair.vr[1].xoff, &liga->u.pair.vr[1].yoff, + &liga->u.pair.vr[1].h_adv_off, &liga->u.pair.vr[1].v_adv_off); + } else if ( liga->type==pst_lcaret ) { + int i; + fscanf( sfd, " %d", &liga->u.lcaret.cnt ); + liga->u.lcaret.carets = galloc(liga->u.lcaret.cnt*sizeof(int16)); + for ( i=0; iu.lcaret.cnt; ++i ) + fscanf( sfd, " %hd", &liga->u.lcaret.carets[i]); + geteol(sfd,tok); + } else { + geteol(sfd,tok); + liga->u.lig.components = copy(tok); /* it's in the same place for all formats */ + if ( isliga ) { + liga->u.lig.lig = sc; + last = LigaCreateFromOldStyleMultiple(liga); + } + } +#ifdef FONTFORGE_CONFIG_CVT_OLD_MAC_FEATURES + CvtOldMacFeature(liga); +#endif + } else if ( strmatch(tok,"Colour:")==0 ) { + int temp; + gethex(sfd,&temp); + sc->color = temp; + } else if ( strmatch(tok,"Comment:")==0 ) { + sc->comment = SFDReadUTF7Str(sfd); + } else if ( strmatch(tok,"EndChar")==0 ) { + if ( sc->enccharcnt ) + sf->chars[sc->enc] = sc; +#if 0 /* Auto recovery fails if we do this */ + else { + SplineCharFree(sc); + sc = NULL; + } +#endif +return( sc ); + } else { + geteol(sfd,tok); + } + } +} + +static int SFDGetBitmapChar(FILE *sfd,BDFFont *bdf) { + BDFChar *bfc; + struct enc85 dec; + int i; + + bfc = chunkalloc(sizeof(BDFChar)); + + if ( getint(sfd,&bfc->enc)!=1 || bfc->enc<0 ) +return( 0 ); + if ( getsint(sfd,&bfc->width)!=1 ) +return( 0 ); + if ( getsint(sfd,&bfc->xmin)!=1 ) +return( 0 ); + if ( getsint(sfd,&bfc->xmax)!=1 || bfc->xmaxxmin ) +return( 0 ); + if ( getsint(sfd,&bfc->ymin)!=1 ) +return( 0 ); + if ( getsint(sfd,&bfc->ymax)!=1 || bfc->ymaxymin ) +return( 0 ); + + bdf->chars[bfc->enc] = bfc; + bfc->sc = bdf->sf->chars[bfc->enc]; + if ( bdf->clut==NULL ) { + bfc->bytes_per_line = (bfc->xmax-bfc->xmin)/8 +1; + bfc->depth = 1; + } else { + bfc->bytes_per_line = bfc->xmax-bfc->xmin +1; + bfc->byte_data = true; + bfc->depth = bdf->clut->clut_len==4 ? 2 : bdf->clut->clut_len==16 ? 4 : 8; + } + bfc->bitmap = gcalloc((bfc->ymax-bfc->ymin+1)*bfc->bytes_per_line,sizeof(char)); + + memset(&dec,'\0', sizeof(dec)); dec.pos = -1; + dec.sfd = sfd; + for ( i=0; i<=bfc->ymax-bfc->ymin; ++i ) { + uint8 *pt = (uint8 *) (bfc->bitmap + i*bfc->bytes_per_line); + uint8 *end = (uint8 *) (bfc->bitmap + (i+1)*bfc->bytes_per_line); + while ( ptsc==NULL ) { + bdf->chars[bfc->enc] = NULL; + BDFCharFree(bfc); + } +return( 1 ); +} + +static int SFDGetBitmapFont(FILE *sfd,SplineFont *sf) { + BDFFont *bdf, *prev; + char tok[200]; + int pixelsize, ascent, descent, depth=1; + int ch; + + bdf = gcalloc(1,sizeof(BDFFont)); + bdf->encoding_name = sf->encoding_name; + + if ( getint(sfd,&pixelsize)!=1 || pixelsize<=0 ) +return( 0 ); + if ( getint(sfd,&bdf->charcnt)!=1 || bdf->charcnt<0 ) +return( 0 ); + if ( getint(sfd,&ascent)!=1 || ascent<0 ) +return( 0 ); + if ( getint(sfd,&descent)!=1 || descent<0 ) +return( 0 ); + if ( getint(sfd,&depth)!=1 ) + depth = 1; /* old sfds don't have a depth here */ + else if ( depth!=1 && depth!=2 && depth!=4 && depth!=8 ) +return( 0 ); + while ( (ch = getc(sfd))==' ' ); + ungetc(ch,sfd); /* old sfds don't have a foundry */ + if ( ch!='\n' && ch!='\r' ) { + getname(sfd,tok); + bdf->foundry = copy(tok); + } + bdf->pixelsize = pixelsize; + bdf->ascent = ascent; + bdf->descent = descent; + if ( depth!=1 ) + BDFClut(bdf,(1<<(depth/2))); + + if ( sf->bitmaps==NULL ) + sf->bitmaps = bdf; + else { + for ( prev=sf->bitmaps; prev->next!=NULL; prev=prev->next ); + prev->next = bdf; + } + bdf->sf = sf; + bdf->chars = gcalloc(bdf->charcnt,sizeof(BDFChar *)); + + while ( getname(sfd,tok)==1 ) { + if ( strcmp(tok,"BDFChar:")==0 ) + SFDGetBitmapChar(sfd,bdf); + else if ( strcmp(tok,"EndBitmapFont")==0 ) + break; + } +return( 1 ); +} + +static void SFDFixupRef(SplineChar *sc,RefChar *ref) { + RefChar *rf; + + for ( rf = ref->sc->layers[ly_fore].refs; rf!=NULL; rf=rf->next ) { + if ( rf->sc==sc ) { /* Huh? */ + ref->sc->layers[ly_fore].refs = NULL; + break; + } + if ( rf->layers[0].splines==NULL ) + SFDFixupRef(ref->sc,rf); + } + SCReinstanciateRefChar(sc,ref); + SCMakeDependent(sc,ref->sc); +} + +static void SFDFixupRefs(SplineFont *sf) { + int i, isv; + RefChar *refs, *rnext, *rprev; + /*int isautorecovery = sf->changed;*/ + KernPair *kp, *prev, *next; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + /* A changed character is one that has just been recovered */ + /* unchanged characters will already have been fixed up */ + /* Er... maybe not. If the character being recovered is refered to */ + /* by another character then we need to fix up that other char too*/ + /*if ( isautorecovery && !sf->chars[i]->changed )*/ + /*continue;*/ + rprev = NULL; + for ( refs = sf->chars[i]->layers[ly_fore].refs; refs!=NULL; refs=rnext ) { + rnext = refs->next; + if ( refs->local_enccharcnt ) + refs->sc = sf->chars[refs->local_enc]; + if ( refs->sc==NULL ) + refs->sc = SFMakeChar(sf,refs->local_enc); + if ( refs->sc!=NULL ) { + refs->unicode_enc = refs->sc->unicodeenc; + refs->adobe_enc = getAdobeEnc(refs->sc->name); + rprev = refs; + } else { + RefCharFree(refs); + if ( rprev!=NULL ) + rprev->next = rnext; + else + sf->chars[i]->layers[ly_fore].refs = rnext; + } + } + /*if ( isautorecovery && !sf->chars[i]->changed )*/ + /*continue;*/ + for ( isv=0; isv<2; ++isv ) { + for ( prev = NULL, kp=isv?sf->chars[i]->vkerns : sf->chars[i]->kerns; kp!=NULL; kp=next ) { + next = kp->next; + if ( ((int) (kp->sc))>=sf->charcnt ) { + fprintf( stderr, "Warning: Bad kerning information in glyph %s\n", sf->chars[i]->name ); + kp->sc = NULL; + } else + kp->sc = sf->chars[(int) (kp->sc)]; + if ( kp->sc!=NULL ) + prev = kp; + else{ + if ( prev!=NULL ) + prev->next = next; + else if ( isv ) + sf->chars[i]->vkerns = next; + else + sf->chars[i]->kerns = next; + chunkfree(kp,sizeof(KernPair)); + } + } + } + } + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( refs = sf->chars[i]->layers[ly_fore].refs; refs!=NULL; refs=refs->next ) { + SFDFixupRef(sf->chars[i],refs); + } + GProgressNext(); + } +} + +/* When we recover from an autosaved file we must be careful. If that file */ +/* contains a character that is refered to by another character then the */ +/* dependent list will contain a dead pointer without this routine. Similarly*/ +/* for kerning */ +/* We might have needed to do something for references except they've already */ +/* got a local encoding field and passing through SFDFixupRefs will much their*/ +/* SplineChar pointer */ +static void SFRemoveDependencies(SplineFont *sf) { + int i; + struct splinecharlist *dlist, *dnext; + KernPair *kp; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( dlist = sf->chars[i]->dependents; dlist!=NULL; dlist = dnext ) { + dnext = dlist->next; + chunkfree(dlist,sizeof(*dlist)); + } + sf->chars[i]->dependents = NULL; + for ( kp=sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) + kp->sc = (SplineChar *) (kp->sc->enc); + for ( kp=sf->chars[i]->vkerns; kp!=NULL; kp=kp->next ) + kp->sc = (SplineChar *) (kp->sc->enc); + } +} + +static void SFDGetPrivate(FILE *sfd,SplineFont *sf) { + int i, cnt, len; + char name[200]; + char *pt, *end; + + sf->private = gcalloc(1,sizeof(struct psdict)); + getint(sfd,&cnt); + sf->private->next = sf->private->cnt = cnt; + sf->private->values = gcalloc(cnt,sizeof(char *)); + sf->private->keys = gcalloc(cnt,sizeof(char *)); + for ( i=0; iprivate->keys[i] = copy(name); + getint(sfd,&len); + getc(sfd); /* skip space */ + pt = sf->private->values[i] = galloc(len+1); + for ( end = pt+len; ptlang); + for ( i=0; inames[i] = SFDReadUTF7Str(sfd); + if ( old==NULL ) +return( cur ); + for ( prev = old; prev->next !=NULL; prev = prev->next ); + prev->next = cur; +return( old ); +} + +static enum charset SFDGetEncoding(FILE *sfd, char *tok, SplineFont *sf) { + int encname = em_none; + int i; + + if ( !getint(sfd,&encname) ) { + Encoding *item; int val; + geteol(sfd,tok); + encname = em_none; + for ( i=0; charset_names[i]!=NULL; ++i ) + if ( strcmp(tok,charset_names[i])==0 ) { + encname = i-1; + break; + } + if ( charset_names[i]==NULL ) { + for ( item = enclist; item!=NULL && strcmp(item->enc_name,tok)!=0; item = item->next ); + if ( item!=NULL ) + encname = item->enc_num; + } + if ( encname == em_none && + sscanf(tok,"UnicodePlane%d",&val)==1 ) + encname = val+em_unicodeplanes; + if ( encname == em_none && strcmp(tok,"compacted")==0 ) { + encname = em_none; + sf->compacted = true; + } + } +return( encname ); +} + +static enum uni_interp SFDGetUniInterp(FILE *sfd, char *tok, SplineFont *sf) { + int uniinterp = ui_none; + int i; + + geteol(sfd,tok); + uniinterp = em_none; + for ( i=0; unicode_interp_names[i]!=NULL; ++i ) + if ( strcmp(tok,unicode_interp_names[i])==0 ) { + uniinterp = i; + break; + } + +return( uniinterp ); +} + +static int SFAddScriptIndex(SplineFont *sf,uint32 *scripts,int scnt) { + int i,j; + struct script_record *sr; + + if ( scnt==0 ) + scripts[scnt++] = CHR('l','a','t','n'); /* Need a default script preference */ + for ( i=0; iscripts[j] ) { + uint32 temp = scripts[i]; + scripts[i] = scripts[j]; + scripts[j] = temp; + } + } + + if ( sf->cidmaster ) sf = sf->cidmaster; + if ( sf->script_lang==NULL ) /* It's an old sfd file */ + sf->script_lang = gcalloc(1,sizeof(struct script_record *)); + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + sr = sf->script_lang[i]; + for ( j=0; sr[j].script!=0 && jscript_lang = grealloc(sf->script_lang,(i+2)*sizeof(struct script_record *)); + sf->script_lang[i+1] = NULL; + sr = sf->script_lang[i] = gcalloc(scnt+1,sizeof(struct script_record)); + for ( j = 0; jtype = strmatch(tok,"ContextPos:")==0 ? pst_contextpos : + strmatch(tok,"ContextSub:")==0 ? pst_contextsub : + strmatch(tok,"ChainPos:")==0 ? pst_chainpos : + strmatch(tok,"ChainSub:")==0 ? pst_chainsub : pst_reversesub; + getname(sfd,tok); + fpst->format = strmatch(tok,"glyph")==0 ? pst_glyphs : + strmatch(tok,"class")==0 ? pst_class : + strmatch(tok,"coverage")==0 ? pst_coverage : pst_reversecoverage; + fscanf(sfd, "%hu %hu", &fpst->flags, &fpst->script_lang_index ); + if ( fpst->script_lang_index>=sf->sli_cnt && fpst->script_lang_index!=SLI_NESTED ) { + static int complained=false; + if ( sf->sli_cnt==0 ) + GDrawIError("'%c%c%c%c' has a script index out of bounds: %d\nYou MUST fix this manually", + (fpst->tag>>24), (fpst->tag>>16)&0xff, (fpst->tag>>8)&0xff, fpst->tag&0xff, + fpst->script_lang_index ); + else if ( !complained ) + GDrawIError("'%c%c%c%c' has a script index out of bounds: %d", + (fpst->tag>>24), (fpst->tag>>16)&0xff, (fpst->tag>>8)&0xff, fpst->tag&0xff, + fpst->script_lang_index ); + else + fprintf( stderr, "Internal Error: '%c%c%c%c' has a script index out of bounds: %d\n", + (fpst->tag>>24), (fpst->tag>>16)&0xff, (fpst->tag>>8)&0xff, fpst->tag&0xff, + fpst->script_lang_index ); + if ( sf->sli_cnt!=0 ) + fpst->script_lang_index = sf->sli_cnt-1; + complained = true; + } + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + if ( ch=='\'' ) { + fpst->tag = getc(sfd)<<24; + fpst->tag |= getc(sfd)<<16; + fpst->tag |= getc(sfd)<<8; + fpst->tag |= getc(sfd); + getc(sfd); /* Final quote */ + } else + ungetc(ch,sfd); + fscanf(sfd, "%hu %hu %hu %hu", &fpst->nccnt, &fpst->bccnt, &fpst->fccnt, &fpst->rule_cnt ); + if ( fpst->nccnt!=0 || fpst->bccnt!=0 || fpst->fccnt!=0 ) { + fpst->nclass = galloc(fpst->nccnt*sizeof(char *)); + if ( fpst->nccnt!=0 ) fpst->nclass[0] = NULL; + if (fpst->nccnt!=0 ) fpst->nclass[0] = NULL; + if ( fpst->bccnt!=0 || fpst->fccnt!=0 ) { + fpst->bclass = galloc(fpst->bccnt*sizeof(char *)); + if (fpst->bccnt!=0 ) fpst->bclass[0] = NULL; + fpst->fclass = galloc(fpst->fccnt*sizeof(char *)); + if (fpst->fccnt!=0 ) fpst->fclass[0] = NULL; + } + } + + for ( j=0; j<3; ++j ) { + for ( i=1; i<(&fpst->nccnt)[j]; ++i ) { + getname(sfd,tok); + getint(sfd,&temp); + (&fpst->nclass)[j][i] = galloc(temp+1); (&fpst->nclass)[j][i][temp] = '\0'; + getc(sfd); /* skip space */ + fread((&fpst->nclass)[j][i],1,temp,sfd); + } + } + + fpst->rules = gcalloc(fpst->rule_cnt,sizeof(struct fpst_rule)); + for ( i=0; irule_cnt; ++i ) { + switch ( fpst->format ) { + case pst_glyphs: + for ( j=0; j<3; ++j ) { + getname(sfd,tok); + getint(sfd,&temp); + (&fpst->rules[i].u.glyph.names)[j] = galloc(temp+1); + (&fpst->rules[i].u.glyph.names)[j][temp] = '\0'; + getc(sfd); /* skip space */ + fread((&fpst->rules[i].u.glyph.names)[j],1,temp,sfd); + } + break; + case pst_class: + fscanf( sfd, "%d %d %d", &fpst->rules[i].u.class.ncnt, &fpst->rules[i].u.class.bcnt, &fpst->rules[i].u.class.fcnt ); + for ( j=0; j<3; ++j ) { + getname(sfd,tok); + (&fpst->rules[i].u.class.nclasses)[j] = galloc((&fpst->rules[i].u.class.ncnt)[j]*sizeof(uint16)); + for ( k=0; k<(&fpst->rules[i].u.class.ncnt)[j]; ++k ) { + getusint(sfd,&(&fpst->rules[i].u.class.nclasses)[j][k]); + } + } + break; + case pst_coverage: + case pst_reversecoverage: + fscanf( sfd, "%d %d %d", &fpst->rules[i].u.coverage.ncnt, &fpst->rules[i].u.coverage.bcnt, &fpst->rules[i].u.coverage.fcnt ); + for ( j=0; j<3; ++j ) { + (&fpst->rules[i].u.coverage.ncovers)[j] = galloc((&fpst->rules[i].u.coverage.ncnt)[j]*sizeof(char *)); + for ( k=0; k<(&fpst->rules[i].u.coverage.ncnt)[j]; ++k ) { + getname(sfd,tok); + getint(sfd,&temp); + (&fpst->rules[i].u.coverage.ncovers)[j][k] = galloc(temp+1); + (&fpst->rules[i].u.coverage.ncovers)[j][k][temp] = '\0'; + getc(sfd); /* skip space */ + fread((&fpst->rules[i].u.coverage.ncovers)[j][k],1,temp,sfd); + } + } + break; + } + switch ( fpst->format ) { + case pst_glyphs: + case pst_class: + case pst_coverage: + getint(sfd,&fpst->rules[i].lookup_cnt); + fpst->rules[i].lookups = galloc(fpst->rules[i].lookup_cnt*sizeof(struct seqlookup)); + for ( j=0; jrules[i].lookup_cnt; ++j ) { + getname(sfd,tok); + getint(sfd,&fpst->rules[i].lookups[j].seq); + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + if ( ch=='\'' ) { + fpst->rules[i].lookups[j].lookup_tag = getc(sfd)<<24; + fpst->rules[i].lookups[j].lookup_tag |= getc(sfd)<<16; + fpst->rules[i].lookups[j].lookup_tag |= getc(sfd)<<8; + fpst->rules[i].lookups[j].lookup_tag |= getc(sfd); + getc(sfd); /* Final quote */ + } else + ungetc(ch,sfd); + } + break; + case pst_reversecoverage: + getname(sfd,tok); + getint(sfd,&temp); + fpst->rules[i].u.rcoverage.replacements = galloc(temp+1); + fpst->rules[i].u.rcoverage.replacements[temp] = '\0'; + getc(sfd); /* skip space */ + fread(fpst->rules[i].u.rcoverage.replacements,1,temp,sfd); + break; + } + } + getname(sfd,tok); +} + +static uint32 ASM_ParseSubTag(FILE *sfd) { + uint32 tag; + int ch; + + while ( (ch=getc(sfd))==' ' ); + if ( ch!='\'' ) +return( 0 ); + + tag = getc(sfd)<<24; + tag |= getc(sfd)<<16; + tag |= getc(sfd)<<8; + tag |= getc(sfd); + getc(sfd); /* final quote */ +return( tag ); +} + +static void SFDParseStateMachine(FILE *sfd,SplineFont *sf,ASM *sm, char *tok) { + int i, temp; + + sm->type = strmatch(tok,"MacIndic:")==0 ? asm_indic : + strmatch(tok,"MacContext:")==0 ? asm_context : + strmatch(tok,"MacLigature:")==0 ? asm_lig : + strmatch(tok,"MacSimple:")==0 ? asm_simple : + strmatch(tok,"MacKern:")==0 ? asm_kern : asm_insert; + getusint(sfd,&sm->feature); + getc(sfd); /* Skip comma */ + getusint(sfd,&sm->setting); + getusint(sfd,&sm->flags); + getusint(sfd,&sm->class_cnt); + getusint(sfd,&sm->state_cnt); + + sm->classes = galloc(sm->class_cnt*sizeof(char *)); + sm->classes[0] = sm->classes[1] = sm->classes[2] = sm->classes[3] = NULL; + for ( i=4; iclass_cnt; ++i ) { + getname(sfd,tok); + getint(sfd,&temp); + sm->classes[i] = galloc(temp+1); sm->classes[i][temp] = '\0'; + getc(sfd); /* skip space */ + fread(sm->classes[i],1,temp,sfd); + } + + sm->state = galloc(sm->class_cnt*sm->state_cnt*sizeof(struct asm_state)); + for ( i=0; iclass_cnt*sm->state_cnt; ++i ) { + getusint(sfd,&sm->state[i].next_state); + getusint(sfd,&sm->state[i].flags); + if ( sm->type == asm_context ) { + sm->state[i].u.context.mark_tag = ASM_ParseSubTag(sfd); + sm->state[i].u.context.cur_tag = ASM_ParseSubTag(sfd); + } else if ( sm->type == asm_insert ) { + getint(sfd,&temp); + if ( temp==0 ) + sm->state[i].u.insert.mark_ins = NULL; + else { + sm->state[i].u.insert.mark_ins = galloc(temp+1); sm->state[i].u.insert.mark_ins[temp] = '\0'; + getc(sfd); /* skip space */ + fread(sm->state[i].u.insert.mark_ins,1,temp,sfd); + } + getint(sfd,&temp); + if ( temp==0 ) + sm->state[i].u.insert.cur_ins = NULL; + else { + sm->state[i].u.insert.cur_ins = galloc(temp+1); sm->state[i].u.insert.cur_ins[temp] = '\0'; + getc(sfd); /* skip space */ + fread(sm->state[i].u.insert.cur_ins,1,temp,sfd); + } + } else if ( sm->type == asm_kern ) { + int j; + getint(sfd,&sm->state[i].u.kern.kcnt); + if ( sm->state[i].u.kern.kcnt!=0 ) + sm->state[i].u.kern.kerns = galloc(sm->state[i].u.kern.kcnt*sizeof(int16)); + for ( j=0; jstate[i].u.kern.kcnt; ++j ) { + getint(sfd,&temp); + sm->state[i].u.kern.kerns[j] = temp; + } + } + } + getname(sfd,tok); /* EndASM */ +} + +static struct macname *SFDParseMacNames(FILE *sfd, char *tok) { + struct macname *head=NULL, *last=NULL, *cur; + int enc, lang, len; + char *pt; + int ch; + + while ( strcmp(tok,"MacName:")==0 ) { + cur = chunkalloc(sizeof(struct macname)); + if ( last==NULL ) + head = cur; + else + last->next = cur; + last = cur; + + getint(sfd,&enc); + getint(sfd,&lang); + getint(sfd,&len); + cur->enc = enc; + cur->lang = lang; + cur->name = pt = galloc(len+1); + + while ( (ch=getc(sfd))==' '); + if ( ch=='"' ) + ch = getc(sfd); + while ( ch!='"' && ch!=EOF && ptname+len ) { + if ( ch=='\\' ) { + *pt = (getc(sfd)-'0')<<6; + *pt |= (getc(sfd)-'0')<<3; + *pt |= (getc(sfd)-'0'); + } else + *pt++ = ch; + ch = getc(sfd); + } + *pt = '\0'; + getname(sfd,tok); + } +return( head ); +} + +MacFeat *SFDParseMacFeatures(FILE *sfd, char *tok) { + MacFeat *cur, *head=NULL, *last=NULL; + struct macsetting *slast, *scur; + int feat, ism, def, set; + + while ( strcmp(tok,"MacFeat:")==0 ) { + cur = chunkalloc(sizeof(MacFeat)); + if ( last==NULL ) + head = cur; + else + last->next = cur; + last = cur; + + getint(sfd,&feat); getint(sfd,&ism); getint(sfd, &def); + cur->feature = feat; cur->ismutex = ism; cur->default_setting = def; + getname(sfd,tok); + cur->featname = SFDParseMacNames(sfd,tok); + slast = NULL; + while ( strcmp(tok,"MacSetting:")==0 ) { + scur = chunkalloc(sizeof(struct macsetting)); + if ( slast==NULL ) + cur->settings = scur; + else + slast->next = scur; + slast = scur; + + getint(sfd,&set); + scur->setting = set; + getname(sfd,tok); + scur->setname = SFDParseMacNames(sfd,tok); + } + } +return( head ); +} + +static char *SFDParseMMSubroutine(FILE *sfd) { + char buffer[400], *sofar=gcalloc(1,1); + const char *endtok = "EndMMSubroutine"; + int len = 0, blen, first=true; + + while ( fgets(buffer,sizeof(buffer),sfd)!=NULL ) { + if ( strncmp(buffer,endtok,strlen(endtok))==0 ) + break; + if ( first ) { + first = false; + if ( strcmp(buffer,"\n")==0 ) + continue; + } + blen = strlen(buffer); + sofar = grealloc(sofar,len+blen+1); + strcpy(sofar+len,buffer); + len += blen; + } + if ( len>0 && sofar[len-1]=='\n' ) + sofar[len-1] = '\0'; +return( sofar ); +} + +static void SFDCleanupAnchorClasses(SplineFont *sf) { + AnchorClass *ac; + AnchorPoint *ap; + int i, j, scnt; +#define S_MAX 100 + uint32 scripts[S_MAX]; + int merge=0; + + for ( ac = sf->anchor; ac!=NULL; ac=ac->next ) { + if ( ac->script_lang_index==0xffff ) { + scnt = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( ap = sf->chars[i]->anchor; ap!=NULL && ap->anchor!=ac; ap=ap->next ); + if ( ap!=NULL && scntchars[i]); + if ( script==0 ) + continue; + for ( j=0; jscript_lang_index = SFAddScriptIndex(sf,scripts,scnt); + } + if ( ac->merge_with == 0xffff ) + ac->merge_with = ++merge; + } +#undef S_MAX +} + +enum uni_interp interp_from_encoding(enum charset enc,enum uni_interp interp) { + + switch ( enc ) { + case em_sjis: case em_jis208: case em_jis212: case em_jis201: + interp = ui_japanese; + break; + case em_big5: case em_big5hkscs: + interp = ui_trad_chinese; + break; + case em_johab: case em_wansung: case em_ksc5601: + interp = ui_korean; + break; + case em_jisgb: case em_gb2312: case em_gb18030: + interp = ui_simp_chinese; + break; + case em_iso8859_7: + interp = ui_greek; + break; + } +return( interp ); +} + +static void SFDCleanupFont(SplineFont *sf) { + SFDCleanupAnchorClasses(sf); + if ( sf->uni_interp==ui_unset ) + sf->uni_interp = interp_from_encoding(sf->encoding_name,ui_none); +} + +static SplineFont *SFD_GetFont(FILE *sfd,SplineFont *cidmaster,char *tok) { + SplineFont *sf; + SplineChar *sc; + int realcnt, i, eof, mappos=-1, ch, ch2, glyph; + struct table_ordering *lastord = NULL; + struct ttf_table *lastttf = NULL; + KernClass *lastkc=NULL, *kc, *lastvkc=NULL; + FPST *lastfp=NULL; + ASM *lastsm=NULL; + + sf = SplineFontEmpty(); + sf->cidmaster = cidmaster; + sf->uni_interp = ui_unset; + while ( 1 ) { + if ( (eof = getname(sfd,tok))!=1 ) { + if ( eof==-1 ) + break; + geteol(sfd,tok); + continue; + } + if ( strmatch(tok,"FontName:")==0 ) { + getname(sfd,tok); + sf->fontname = copy(tok); + } else if ( strmatch(tok,"FullName:")==0 ) { + geteol(sfd,tok); + sf->fullname = copy(tok); + } else if ( strmatch(tok,"FamilyName:")==0 ) { + geteol(sfd,tok); + sf->familyname = copy(tok); + } else if ( strmatch(tok,"Weight:")==0 ) { + getprotectedname(sfd,tok); + sf->weight = copy(tok); + } else if ( strmatch(tok,"Copyright:")==0 ) { + sf->copyright = getquotedeol(sfd); + } else if ( strmatch(tok,"Comments:")==0 ) { + sf->comments = getquotedeol(sfd); + } else if ( strmatch(tok,"Version:")==0 ) { + geteol(sfd,tok); + sf->version = copy(tok); + } else if ( strmatch(tok,"ItalicAngle:")==0 ) { + getreal(sfd,&sf->italicangle); + } else if ( strmatch(tok,"UnderlinePosition:")==0 ) { + getreal(sfd,&sf->upos); + } else if ( strmatch(tok,"UnderlineWidth:")==0 ) { + getreal(sfd,&sf->uwidth); + } else if ( strmatch(tok,"PfmFamily:")==0 ) { + int temp; + getint(sfd,&temp); + sf->pfminfo.pfmfamily = temp; + sf->pfminfo.pfmset = true; + } else if ( strmatch(tok,"LangName:")==0 ) { + sf->names = SFDGetLangName(sfd,sf->names); + } else if ( strmatch(tok,"PfmWeight:")==0 || strmatch(tok,"TTFWeight:")==0 ) { + getsint(sfd,&sf->pfminfo.weight); + sf->pfminfo.pfmset = true; + } else if ( strmatch(tok,"TTFWidth:")==0 ) { + getsint(sfd,&sf->pfminfo.width); + sf->pfminfo.pfmset = true; + } else if ( strmatch(tok,"Panose:")==0 ) { + int temp,i; + for ( i=0; i<10; ++i ) { + getint(sfd,&temp); + sf->pfminfo.panose[i] = temp; + } + sf->pfminfo.pfmset = true; + } else if ( strmatch(tok,"LineGap:")==0 ) { + getsint(sfd,&sf->pfminfo.linegap); + sf->pfminfo.pfmset = true; + } else if ( strmatch(tok,"VLineGap:")==0 ) { + getsint(sfd,&sf->pfminfo.vlinegap); + sf->pfminfo.pfmset = true; +#if 0 + } else if ( strmatch(tok,"HheadAscent:")==0 ) { + getsint(sfd,&sf->pfminfo.hhead_ascent); + } else if ( strmatch(tok,"HheadDescent:")==0 ) { + getsint(sfd,&sf->pfminfo.hhead_descent); +#endif + } else if ( strmatch(tok,"OS2TypoAscent:")==0 ) { + getsint(sfd,&sf->pfminfo.os2_typoascent); + } else if ( strmatch(tok,"OS2TypoDescent:")==0 ) { + getsint(sfd,&sf->pfminfo.os2_typodescent); + } else if ( strmatch(tok,"OS2WinAscent:")==0 ) { + getsint(sfd,&sf->pfminfo.os2_winascent); + } else if ( strmatch(tok,"OS2WinDescent:")==0 ) { + getsint(sfd,&sf->pfminfo.os2_windescent); + } else if ( strmatch(tok,"MacStyle:")==0 ) { + getsint(sfd,&sf->macstyle); + } else if ( strmatch(tok,"DisplaySize:")==0 ) { + getint(sfd,&sf->display_size); + } else if ( strmatch(tok,"TopEncoding:")==0 ) { /* Obsolete */ + getint(sfd,&sf->top_enc); + } else if ( strmatch(tok,"WinInfo:")==0 ) { + int temp1, temp2; + getint(sfd,&sf->top_enc); + getint(sfd,&temp1); + getint(sfd,&temp2); + if ( sf->top_enc<=0 ) sf->top_enc=-1; + if ( temp1<=0 ) temp1 = 16; + if ( temp2<=0 ) temp2 = 4; + sf->desired_col_cnt = temp1; + sf->desired_row_cnt = temp2; + } else if ( strmatch(tok,"AntiAlias:")==0 ) { + int temp; + getint(sfd,&temp); + sf->display_antialias = temp; + } else if ( strmatch(tok,"FitToEm:")==0 ) { + int temp; + getint(sfd,&temp); + sf->display_bbsized = temp; + } else if ( strmatch(tok,"OnlyBitmaps:")==0 ) { + int temp; + getint(sfd,&temp); + sf->onlybitmaps = temp; + } else if ( strmatch(tok,"Ascent:")==0 ) { + getint(sfd,&sf->ascent); + } else if ( strmatch(tok,"Descent:")==0 ) { + getint(sfd,&sf->descent); + } else if ( strmatch(tok,"Order2:")==0 ) { + int temp; + getint(sfd,&temp); + sf->order2 = temp; + } else if ( strmatch(tok,"MultiLayer:")==0 ) { + int temp; + getint(sfd,&temp); +#ifdef FONTFORGE_CONFIG_TYPE3 + sf->multilayer = temp; +#else + fprintf( stderr, "Warning: This version of FontForge does not contain extended type3/svg support\n needed for this font.\nReconfigure with --with-type3.\n" ); +#endif + } else if ( strmatch(tok,"NeedsXUIDChange:")==0 ) { + int temp; + getint(sfd,&temp); + sf->changed_since_xuidchanged = temp; + } else if ( strmatch(tok,"VerticalOrigin:")==0 ) { + getint(sfd,&sf->vertical_origin); + sf->hasvmetrics = true; + } else if ( strmatch(tok,"FSType:")==0 ) { + getsint(sfd,&sf->pfminfo.fstype); + } else if ( strmatch(tok,"UniqueID:")==0 ) { + getint(sfd,&sf->uniqueid); + } else if ( strmatch(tok,"XUID:")==0 ) { + geteol(sfd,tok); + sf->xuid = copy(tok); + } else if ( strmatch(tok,"Encoding:")==0 ) { + sf->encoding_name = SFDGetEncoding(sfd,tok,sf); + } else if ( strmatch(tok,"OldEncoding:")==0 ) { + sf->old_encname = SFDGetEncoding(sfd,tok,sf); + } else if ( strmatch(tok,"UnicodeInterp:")==0 ) { + sf->uni_interp = SFDGetUniInterp(sfd,tok,sf); + } else if ( strmatch(tok,"Registry:")==0 ) { + geteol(sfd,tok); + sf->cidregistry = copy(tok); + } else if ( strmatch(tok,"Ordering:")==0 ) { + geteol(sfd,tok); + sf->ordering = copy(tok); + } else if ( strmatch(tok,"Supplement:")==0 ) { + getint(sfd,&sf->supplement); + } else if ( strmatch(tok,"RemapN:")==0 ) { + int n; + getint(sfd,&n); + sf->remap = gcalloc(n+1,sizeof(struct remap)); + sf->remap[n].infont = -1; + mappos = 0; + } else if ( strmatch(tok,"Remap:")==0 ) { + int f, l, p; + gethex(sfd,&f); + gethex(sfd,&l); + getint(sfd,&p); + if ( sf->remap!=NULL && sf->remap[mappos].infont!=-1 ) { + sf->remap[mappos].firstenc = f; + sf->remap[mappos].lastenc = l; + sf->remap[mappos].infont = p; + mappos++; + } + } else if ( strmatch(tok,"CIDVersion:")==0 ) { + real temp; + getreal(sfd,&temp); + sf->cidversion = temp; + } else if ( strmatch(tok,"Grid")==0 ) { + sf->grid.splines = SFDGetSplineSet(sf,sfd); + } else if ( strmatch(tok,"ScriptLang:")==0 ) { + int i,j,k; + int imax, jmax, kmax; + getint(sfd,&imax); + sf->sli_cnt = imax; + sf->script_lang = galloc((imax+1)*sizeof(struct script_record *)); + sf->script_lang[imax] = NULL; + for ( i=0; iscript_lang[i] = galloc((jmax+1)*sizeof(struct script_record)); + sf->script_lang[i][jmax].script = 0; + for ( j=0; jscript_lang[i][j].script = ch<<24; + sf->script_lang[i][j].script |= getc(sfd)<<16; + sf->script_lang[i][j].script |= getc(sfd)<<8; + sf->script_lang[i][j].script |= getc(sfd); + getint(sfd,&kmax); + sf->script_lang[i][j].langs = galloc((kmax+1)*sizeof(uint32)); + sf->script_lang[i][j].langs[kmax] = 0; + for ( k=0; kscript_lang[i][j].langs[k] = ch<<24; + sf->script_lang[i][j].langs[k] |= getc(sfd)<<16; + sf->script_lang[i][j].langs[k] |= getc(sfd)<<8; + sf->script_lang[i][j].langs[k] |= getc(sfd); + } + } + } + } else if ( strmatch(tok,"KernClass:")==0 || strmatch(tok,"VKernClass:")==0 ) { + int temp; + int isv = tok[0]=='V'; + kc = chunkalloc(sizeof(KernClass)); + if ( !isv ) { + if ( lastkc==NULL ) + sf->kerns = kc; + else + lastkc->next = kc; + lastkc = kc; + } else { + if ( lastvkc==NULL ) + sf->vkerns = kc; + else + lastvkc->next = kc; + lastvkc = kc; + } + getint(sfd,&kc->first_cnt); + getint(sfd,&kc->second_cnt); + getint(sfd,&temp); kc->sli = temp; + getint(sfd,&temp); kc->flags = temp; + kc->firsts = galloc(kc->first_cnt*sizeof(char *)); + kc->seconds = galloc(kc->first_cnt*sizeof(char *)); + kc->offsets = galloc(kc->first_cnt*kc->second_cnt*sizeof(int16)); + kc->firsts[0] = NULL; + for ( i=1; ifirst_cnt; ++i ) { + getint(sfd,&temp); + kc->firsts[i] = galloc(temp+1); kc->firsts[i][temp] = '\0'; + getc(sfd); /* skip space */ + fread(kc->firsts[i],1,temp,sfd); + } + kc->seconds[0] = NULL; + for ( i=1; isecond_cnt; ++i ) { + getint(sfd,&temp); + kc->seconds[i] = galloc(temp+1); kc->seconds[i][temp] = '\0'; + getc(sfd); /* skip space */ + fread(kc->seconds[i],1,temp,sfd); + } + for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) { + getint(sfd,&temp); + kc->offsets[i] = temp; + } + } else if ( strmatch(tok,"ContextPos:")==0 || strmatch(tok,"ContextSub:")==0 || + strmatch(tok,"ChainPos:")==0 || strmatch(tok,"ChainSub:")==0 || + strmatch(tok,"ReverseChain:")==0 ) { + FPST *fpst = chunkalloc(sizeof(FPST)); + if ( lastfp==NULL ) + sf->possub = fpst; + else + lastfp->next = fpst; + lastfp = fpst; + SFDParseChainContext(sfd,sf,fpst,tok); + } else if ( strmatch(tok,"MacIndic:")==0 || strmatch(tok,"MacContext:")==0 || + strmatch(tok,"MacLigature:")==0 || strmatch(tok,"MacSimple:")==0 || + strmatch(tok,"MacKern:")==0 || strmatch(tok,"MacInsert:")==0 ) { + ASM *sm = chunkalloc(sizeof(ASM)); + if ( lastsm==NULL ) + sf->sm = sm; + else + lastsm->next = sm; + lastsm = sm; + SFDParseStateMachine(sfd,sf,sm,tok); + } else if ( strmatch(tok,"MacFeat:")==0 ) { + sf->features = SFDParseMacFeatures(sfd,tok); + } else if ( strmatch(tok,"TeXData:")==0 ) { + int temp; + getint(sfd,&temp); + sf->texdata.type = temp; + getint(sfd,&sf->texdata.designsize); + for ( i=0; i<22; ++i ) + getint(sfd,&sf->texdata.params[i]); + } else if ( strmatch(tok,"AnchorClass:")==0 ) { + unichar_t *name; + AnchorClass *lastan = NULL, *an; + while ( (name=SFDReadUTF7Str(sfd))!=NULL ) { + an = chunkalloc(sizeof(AnchorClass)); + an->name = name; + getname(sfd,tok); + if ( tok[0]=='0' && tok[1]=='\0' ) + an->feature_tag = 0; + else { + if ( tok[1]=='\0' ) { tok[1]=' '; tok[2] = 0; } + if ( tok[2]=='\0' ) { tok[2]=' '; tok[3] = 0; } + if ( tok[3]=='\0' ) { tok[3]=' '; tok[4] = 0; } + an->feature_tag = (tok[0]<<24) | (tok[1]<<16) | (tok[2]<<8) | tok[3]; + } + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + ungetc(ch,sfd); + if ( isdigit(ch)) { + int temp; + getint(sfd,&temp); + an->flags = temp; + } +#if 0 + else if ( an->feature_tag==CHR('c','u','r','s')) + an->flags = pst_ignorecombiningmarks; +#endif + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + ungetc(ch,sfd); + if ( isdigit(ch)) { + int temp; + getint(sfd,&temp); + an->script_lang_index = temp; + } else + an->script_lang_index = 0xffff; /* Will be fixed up later */ + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + ungetc(ch,sfd); + if ( isdigit(ch)) { + int temp; + getint(sfd,&temp); + an->merge_with = temp; + } else + an->merge_with = 0xffff; /* Will be fixed up later */ + while ( (ch=getc(sfd))==' ' || ch=='\t' ); + ungetc(ch,sfd); + if ( isdigit(ch)) { + int temp; + getint(sfd,&temp); + an->type = temp; + } else { + if ( an->feature_tag==CHR('c','u','r','s')) + an->type = act_curs; + else if ( an->feature_tag==CHR('m','k','m','k')) + an->type = act_mkmk; + else + an->type = act_mark; + } + if ( lastan==NULL ) + sf->anchor = an; + else + lastan->next = an; + lastan = an; + } + } else if ( strmatch(tok,"GenTags:")==0 ) { + int temp; uint32 tag; + getint(sfd,&temp); + sf->gentags.tt_cur = temp; + sf->gentags.tt_max = sf->gentags.tt_cur+10; + sf->gentags.tagtype = galloc(sf->gentags.tt_max*sizeof(struct tagtype)); + ch = getc(sfd); + i = 0; + while ( ch!='\n' ) { + while ( ch==' ' ) ch = getc(sfd); + if ( ch=='\n' || ch==EOF ) + break; + ch2 = getc(sfd); + if ( ch=='p' && ch2=='s' ) sf->gentags.tagtype[i].type = pst_position; + else if ( ch=='p' && ch2=='r' ) sf->gentags.tagtype[i].type = pst_pair; + else if ( ch=='s' && ch2=='b' ) sf->gentags.tagtype[i].type = pst_substitution; + else if ( ch=='a' && ch2=='s' ) sf->gentags.tagtype[i].type = pst_alternate; + else if ( ch=='m' && ch2=='s' ) sf->gentags.tagtype[i].type = pst_multiple; + else if ( ch=='l' && ch2=='g' ) sf->gentags.tagtype[i].type = pst_ligature; + else if ( ch=='a' && ch2=='n' ) sf->gentags.tagtype[i].type = pst_anchors; + else if ( ch=='c' && ch2=='p' ) sf->gentags.tagtype[i].type = pst_contextpos; + else if ( ch=='c' && ch2=='s' ) sf->gentags.tagtype[i].type = pst_contextsub; + else if ( ch=='p' && ch2=='c' ) sf->gentags.tagtype[i].type = pst_chainpos; + else if ( ch=='s' && ch2=='c' ) sf->gentags.tagtype[i].type = pst_chainsub; + else if ( ch=='r' && ch2=='s' ) sf->gentags.tagtype[i].type = pst_reversesub; + else if ( ch=='n' && ch2=='l' ) sf->gentags.tagtype[i].type = pst_null; + else ch2 = EOF; + (void) getc(sfd); + tag = getc(sfd)<<24; + tag |= getc(sfd)<<16; + tag |= getc(sfd)<<8; + tag |= getc(sfd); + (void) getc(sfd); + if ( ch2!=EOF ) + sf->gentags.tagtype[i++].tag = tag; + ch = getc(sfd); + } + } else if ( strmatch(tok,"TtfTable:")==0 ) { + lastttf = SFDGetTtfTable(sfd,sf,lastttf); + } else if ( strmatch(tok,"TableOrder:")==0 ) { + int temp; + struct table_ordering *ord; + while ((ch=getc(sfd))==' ' ); + ord = chunkalloc(sizeof(struct table_ordering)); + ord->table_tag = (ch<<24) | (getc(sfd)<<16); + ord->table_tag |= getc(sfd)<<8; + ord->table_tag |= getc(sfd); + getint(sfd,&temp); + ord->ordered_features = galloc((temp+1)*sizeof(uint32)); + ord->ordered_features[temp] = 0; + for ( i=0; iordered_features[i] = (ch<<24) | (getc(sfd)<<16); + ord->ordered_features[i] |= (getc(sfd)<<8); + ord->ordered_features[i] |= getc(sfd); + if ( (ch=getc(sfd))!='\'') ungetc(ch,sfd); + } else if ( ch=='<' ) { + int f,s; + fscanf(sfd,"%d,%d>", &f, &s ); + ord->ordered_features[i] = (f<<16)|s; + } + } + if ( lastord==NULL ) + sf->orders = ord; + else + lastord->next = ord; + lastord = ord; + } else if ( strmatch(tok,"BeginPrivate:")==0 ) { + SFDGetPrivate(sfd,sf); + } else if ( strmatch(tok,"BeginSubrs:")==0 ) { /* leave in so we don't croak on old sfd files */ + SFDGetSubrs(sfd,sf); + } else if ( strmatch(tok,"MMCounts:")==0 ) { + MMSet *mm = sf->mm = chunkalloc(sizeof(MMSet)); + getint(sfd,&mm->instance_count); + getint(sfd,&mm->axis_count); + mm->instances = galloc(mm->instance_count*sizeof(SplineFont *)); + mm->positions = galloc(mm->instance_count*mm->axis_count*sizeof(real)); + mm->defweights = galloc(mm->instance_count*sizeof(real)); + mm->axismaps = galloc(mm->axis_count*sizeof(struct axismap)); + } else if ( strmatch(tok,"MMAxis:")==0 ) { + MMSet *mm = sf->mm; + if ( mm!=NULL ) { + for ( i=0; iaxis_count; ++i ) { + getname(sfd,tok); + mm->axes[i] = copy(tok); + } + } + } else if ( strmatch(tok,"MMPositions:")==0 ) { + MMSet *mm = sf->mm; + if ( mm!=NULL ) { + for ( i=0; iaxis_count*mm->instance_count; ++i ) + getreal(sfd,&mm->positions[i]); + } + } else if ( strmatch(tok,"MMWeights:")==0 ) { + MMSet *mm = sf->mm; + if ( mm!=NULL ) { + for ( i=0; iinstance_count; ++i ) + getreal(sfd,&mm->defweights[i]); + } + } else if ( strmatch(tok,"MMAxisMap:")==0 ) { + MMSet *mm = sf->mm; + if ( mm!=NULL ) { + int index, points; + getint(sfd,&index); getint(sfd,&points); + mm->axismaps[index].points = points; + mm->axismaps[index].blends = galloc(points*sizeof(real)); + mm->axismaps[index].designs = galloc(points*sizeof(real)); + for ( i=0; iaxismaps[index].blends[i]); + while ( (ch=getc(sfd))!=EOF && isspace(ch)); + ungetc(ch,sfd); + if ( (ch=getc(sfd))!='=' ) + ungetc(ch,sfd); + else if ( (ch=getc(sfd))!='>' ) + ungetc(ch,sfd); + getreal(sfd,&mm->axismaps[index].designs[i]); + } + } + } else if ( strmatch(tok,"MMCDV:")==0 ) { + MMSet *mm = sf->mm; + if ( mm!=NULL ) + mm->cdv = SFDParseMMSubroutine(sfd); + } else if ( strmatch(tok,"MMNDV:")==0 ) { + MMSet *mm = sf->mm; + if ( mm!=NULL ) + mm->ndv = SFDParseMMSubroutine(sfd); + } else if ( strmatch(tok,"BeginMMFonts:")==0 ) { + int cnt; + getint(sfd,&cnt); + getint(sfd,&realcnt); + GProgressChangeStages(cnt); + GProgressChangeTotal(realcnt); + break; + } else if ( strmatch(tok,"BeginSubFonts:")==0 ) { + getint(sfd,&sf->subfontcnt); + sf->subfonts = gcalloc(sf->subfontcnt,sizeof(SplineFont *)); + getint(sfd,&realcnt); + GProgressChangeStages(2); + GProgressChangeTotal(realcnt); + break; + } else if ( strmatch(tok,"BeginChars:")==0 ) { + getint(sfd,&sf->charcnt); + if ( getint(sfd,&realcnt)!=1 ) { + GProgressChangeTotal(sf->charcnt); + } else if ( realcnt!=-1 ) { + GProgressChangeTotal(realcnt); + } + sf->chars = gcalloc(sf->charcnt,sizeof(SplineChar *)); + break; +#if HANYANG + } else if ( strmatch(tok,"BeginCompositionRules")==0 ) { + sf->rules = SFDReadCompositionRules(sfd); +#endif + } else { + /* If we don't understand it, skip it */ + geteol(sfd,tok); + } + } + + if ( sf->subfontcnt!=0 ) { + int max,k; + GProgressChangeStages(2*sf->subfontcnt); + for ( i=0; isubfontcnt; ++i ) { + if ( i!=0 ) + GProgressNextStage(); + sf->subfonts[i] = SFD_GetFont(sfd,sf,tok); + } + max = 0; + for ( i=0; isubfontcnt; ++i ) + if ( sf->subfonts[i]->charcnt>max ) max = sf->subfonts[i]->charcnt; + for ( k=0; ksubfontcnt; ++i ) + if ( ksubfonts[i]->charcnt && + sf->subfonts[i]->chars[k]!=NULL ) { + sf->subfonts[i]->chars[k]->orig_pos = k; + break; + } + } + } else if ( sf->mm!=NULL ) { + MMSet *mm = sf->mm; + GProgressChangeStages(2*(mm->instance_count+1)); + for ( i=0; iinstance_count; ++i ) { + if ( i!=0 ) + GProgressNextStage(); + mm->instances[i] = SFD_GetFont(sfd,NULL,tok); + mm->instances[i]->mm = mm; + } + GProgressNextStage(); + mm->normal = SFD_GetFont(sfd,NULL,tok); + mm->normal->mm = mm; + sf->mm = NULL; + SplineFontFree(sf); + sf = mm->normal; + } else { + glyph = 0; + while ( (sc = SFDGetChar(sfd,sf))!=NULL ) { + if ( sc->orig_pos==0xffff ) + sc->orig_pos = glyph++; + else + glyph = sc->orig_pos+1; + GProgressNext(); + } + GProgressNextStage(); + GProgressChangeLine2R(_STR_InterpretingGlyphs); + SFDFixupRefs(sf); + } + while ( getname(sfd,tok)==1 ) { + if ( strcmp(tok,"EndSplineFont")==0 || strcmp(tok,"EndSubSplineFont")==0 ) + break; + else if ( strcmp(tok,"BitmapFont:")==0 ) + SFDGetBitmapFont(sfd,sf); + } + SFDCleanupFont(sf); +return( sf ); +} + +static int SFDStartsCorrectly(FILE *sfd,char *tok) { + real dval; + int ch; + + if ( getname(sfd,tok)!=1 ) +return( false ); + if ( strcmp(tok,"SplineFontDB:")!=0 ) +return( false ); + if ( getreal(sfd,&dval)!=1 || (dval!=0 && dval!=1)) +return( false ); + ch = getc(sfd); ungetc(ch,sfd); + if ( ch!='\r' && ch!='\n' ) +return( false ); + +return( true ); +} + +SplineFont *SFDRead(char *filename) { + FILE *sfd = fopen(filename,"r"); + SplineFont *sf=NULL; + char *oldloc; + char tok[2000]; + + if ( sfd==NULL ) +return( NULL ); + oldloc = setlocale(LC_NUMERIC,"C"); + GProgressChangeStages(2); + if ( SFDStartsCorrectly(sfd,tok) ) + sf = SFD_GetFont(sfd,NULL,tok); + setlocale(LC_NUMERIC,oldloc); + if ( sf!=NULL ) { + sf->filename = copy(filename); + if ( sf->mm!=NULL ) { + int i; + for ( i=0; imm->instance_count; ++i ) + sf->mm->instances[i]->filename = copy(filename); + } + } + fclose(sfd); +return( sf ); +} + +SplineChar *SFDReadOneChar(char *filename,const char *name) { + FILE *sfd = fopen(filename,"r"); + SplineChar *sc=NULL; + char *oldloc; + char tok[2000]; + uint32 pos; + SplineFont sf; + + if ( sfd==NULL ) +return( NULL ); + oldloc = setlocale(LC_NUMERIC,"C"); + + memset(&sf,0,sizeof(sf)); + sf.ascent = 800; sf.descent = 200; + if ( SFDStartsCorrectly(sfd,tok) ) { + pos = ftell(sfd); + while ( getname(sfd,tok)!=-1 ) { + if ( strcmp(tok,"StartChar:")==0 ) { + if ( getname(sfd,tok)==1 && strcmp(tok,name)==0 ) { + fseek(sfd,pos,SEEK_SET); + sc = SFDGetChar(sfd,&sf); + break; + } + } else if ( strmatch(tok,"Order2:")==0 ) { + int order2; + getint(sfd,&order2); + sf.order2 = order2; + } else if ( strmatch(tok,"Ascent:")==0 ) { + getint(sfd,&sf.ascent); + } else if ( strmatch(tok,"Descent:")==0 ) { + getint(sfd,&sf.descent); + } + pos = ftell(sfd); + } + } + + setlocale(LC_NUMERIC,oldloc); + fclose(sfd); +return( sc ); +} + +static int ModSF(FILE *asfd,SplineFont *sf) { + int newmap, cnt, order2=0; + char tok[200]; + int i,k; + SplineChar *sc; + SplineFont *ssf; + SplineFont temp; + + if ( getname(asfd,tok)!=1 || strcmp(tok,"Encoding:")!=0 ) +return(false); + getint(asfd,&newmap); + if ( sf->encoding_name!=newmap ) + SFReencodeFont(sf,newmap); + if ( getname(asfd,tok)!=1 ) +return( false ); + if ( strcmp(tok,"Order2:")==0 ) { + getint(asfd,&order2); + if ( getname(asfd,tok)!=1 ) +return( false ); + } + if ( order2!=sf->order2 ) { + if ( order2 ) + SFConvertToOrder2(sf); + else + SFConvertToOrder3(sf); + } + if ( strcmp(tok,"BeginChars:")!=0 ) +return(false); + SFRemoveDependencies(sf); + + memset(&temp,0,sizeof(temp)); + temp.ascent = sf->ascent; temp.descent = sf->descent; + temp.order2 = sf->order2; + temp.multilayer = sf->multilayer; + + getint(asfd,&cnt); + if ( cnt>sf->charcnt ) { + sf->chars = grealloc(sf->chars,cnt*sizeof(SplineChar *)); + for ( i=sf->charcnt; ichars[i] = NULL; + } + while ( (sc = SFDGetChar(asfd,&temp))!=NULL ) { + ssf = sf; + for ( k=0; ksubfontcnt; ++k ) { + if ( sc->encsubfonts[k]->charcnt ) { + ssf = sf->subfonts[k]; + if ( SCWorthOutputting(ssf->chars[sc->enc])) + break; + } + } + if ( sc->enccharcnt ) { + if ( ssf->chars[sc->enc]!=NULL ) + SplineCharFree(ssf->chars[sc->enc]); + ssf->chars[sc->enc] = sc; + sc->parent = ssf; + sc->changed = true; + } + } + sf->changed = true; + SFDFixupRefs(sf); +return(true); +} + +static SplineFont *SlurpRecovery(FILE *asfd,char *tok,int sizetok) { + char *pt; int ch; + SplineFont *sf; + + ch=getc(asfd); + ungetc(ch,asfd); + if ( ch=='B' ) { + if ( getname(asfd,tok)!=1 ) +return(NULL); + if ( strcmp(tok,"Base:")!=0 ) +return(NULL); + while ( isspace(ch=getc(asfd)) && ch!=EOF && ch!='\n' ); + for ( pt=tok; ch!=EOF && ch!='\n'; ch = getc(asfd) ) + if ( ptonlybitmaps = false; + strcpy(tok,""); + } + if ( sf==NULL ) +return( NULL ); + + if ( !ModSF(asfd,sf)) { + SplineFontFree(sf); +return( NULL ); + } +return( sf ); +} + +SplineFont *SFRecoverFile(char *autosavename) { + FILE *asfd = fopen( autosavename,"r"); + SplineFont *ret; + char *oldloc; + char tok[1025]; + + if ( asfd==NULL ) +return(NULL); + oldloc = setlocale(LC_NUMERIC,"C"); + ret = SlurpRecovery(asfd,tok,sizeof(tok)); + if ( ret==NULL ) { + static int buts[] = { _STR_ForgetIt, _STR_TryAgain, 0 }; + if ( GWidgetAskR(_STR_RecoveryFailed,buts,0,1,_STR_RecoveryOfFailed,tok)==0 ) + unlink(autosavename); + } + setlocale(LC_NUMERIC,oldloc); + fclose(asfd); + if ( ret ) + ret->autosavename = copy(autosavename); +return( ret ); +} + +void SFAutoSave(SplineFont *sf) { + int i, k, max; + FILE *asfd; + char *oldloc; + SplineFont *ssf; + + if ( screen_display==NULL ) /* No autosaves when just scripting */ +return; + + if ( sf->cidmaster!=NULL ) sf=sf->cidmaster; + asfd = fopen(sf->autosavename,"w"); + if ( asfd==NULL ) +return; + + max = sf->charcnt; + for ( i=0; isubfontcnt; ++i ) + if ( sf->subfonts[i]->charcnt>max ) max = sf->subfonts[i]->charcnt; + + oldloc = setlocale(LC_NUMERIC,"C"); + if ( !sf->new && sf->origname!=NULL ) /* might be a new file */ + fprintf( asfd, "Base: %s\n", sf->origname ); + fprintf( asfd, "Encoding: %d\n", sf->encoding_name ); + if ( sf->order2 ) + fprintf( asfd, "Order2: %d\n", sf->order2 ); + fprintf( asfd, "BeginChars: %d\n", max ); + for ( i=0; isubfontcnt; ++k ) { + if ( isubfonts[k]->charcnt ) { + ssf = sf->subfonts[k]; + if ( SCWorthOutputting(ssf->chars[i])) + break; + } + } + if ( ssf->chars[i]!=NULL && ssf->chars[i]->changed ) + SFDDumpChar( asfd,ssf->chars[i]); + } + fprintf( asfd, "EndChars\n" ); + fprintf( asfd, "EndSplineFont\n" ); + fclose(asfd); + setlocale(LC_NUMERIC,oldloc); + sf->changed_since_autosave = false; +} + +void SFClearAutoSave(SplineFont *sf) { + int i; + SplineFont *ssf; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + sf->changed_since_autosave = false; + for ( i=0; isubfontcnt; ++i ) { + ssf = sf->subfonts[i]; + ssf->changed_since_autosave = false; + if ( ssf->autosavename!=NULL ) { + unlink( ssf->autosavename ); + free( ssf->autosavename ); + ssf->autosavename = NULL; + } + } + if ( sf->autosavename==NULL ) +return; + unlink(sf->autosavename); + free(sf->autosavename); + sf->autosavename = NULL; +} + +char **NamesReadSFD(char *filename) { + FILE *sfd = fopen(filename,"r"); + char *oldloc; + char tok[2000]; + char **ret; + int eof; + + if ( sfd==NULL ) +return( NULL ); + oldloc = setlocale(LC_NUMERIC,"C"); + if ( SFDStartsCorrectly(sfd,tok) ) { + while ( !feof(sfd)) { + if ( (eof = getname(sfd,tok))!=1 ) { + if ( eof==-1 ) + break; + geteol(sfd,tok); + continue; + } + if ( strmatch(tok,"FontName:")==0 ) { + getname(sfd,tok); + ret = galloc(2*sizeof(char*)); + ret[0] = copy(tok); + ret[1] = NULL; + break; + } + } + } + setlocale(LC_NUMERIC,oldloc); + fclose(sfd); +return( ret ); +} diff --git a/fontforge/sfddiff.1 b/fontforge/sfddiff.1 new file mode 100644 index 00000000..62e7d412 --- /dev/null +++ b/fontforge/sfddiff.1 @@ -0,0 +1,84 @@ +.\" Manual page for sfddiff by George Williams +.\" Copyright © 2000-2002 by George Williams. +.\" Re-edited to use standard -man macros by RPC Rodgers, 23 October 2002. +.TH SFDDIFF 1 "9 March 2002" +.SH NAME +.B sfddiff - compare or merge two pfaedit sfd font files +.SH SYNOPSIS +.B sfddiff +.RB [ \-help ] +.RB [ \-ignorehints ] +.RB [ \-merge +.IR outfile ] +.RB [ \-usage ] +.RB [ \-version ] +.I sfdfile1 +.I sfdfile2 +.SH DESCRIPTION +The program +.B sfddiff compares two +.IR pfaedit (1)-format +(sfd) files, +specified as command line arguments, +taking note of the following: +.TP +1) +The two fonts have different encodings. +.TP +2) +Characters are present in one font but not in the other. +.TP +3) +Characters are present in both fonts +but have different sets of outlines or references. +.TP +4) +The hints are different (optionally suppressible). +.SH OPTIONS +.TP +.B \-help +Provide a description with a list of the available options. +.TP +.B \-ignorehints +Suppress the reporting of hint differences. +.TP +.BI \-merge " outfile" +Store a merged version of the two fonts into the specified output file. +The merged data will contain everything from +.I sfdfile1 +as well as any characters present in +.I sfdfile2 +but not in +.RI sfdfile1 . +For any characters with different outlines or references, +the background of the the character will contain the splines from +.I sfdfile2 +(sadly, references can not be placed in the background). +.TP +.B \-usage +Display the usage description. +.TP +.B \-version +Display the current version +(a six digit string containing the date stamp of the source files). +.\" .SH ENVIRONMENT +.\" .SH FILES +.\" .SH EXAMPLES +.\" .SH DIAGNOSTICS +.SH "SEE ALSO" +.BR pfaedit (1) +.LP +The HTML version of the +.I pfaedit +manual at: +.TP +\fChttp://pfaedit.sourceforge.net/\fP +.\" .SH STANDARDS +.\" .SH HISTORY +.SH AUTHOR +Copyright (C) 2000-2002 by George Williams (gww@silcom.com). +Manual page heavily rewritten and modified to use standard +.IR \-man (5) +macros by R.P.C. Rodgers (rodgers@nlm.nih.gov), 23 October 2002. +.\" .SH BUGS +.\" end of file diff --git a/fontforge/sfddiff.c b/fontforge/sfddiff.c new file mode 100644 index 00000000..831fdc0c --- /dev/null +++ b/fontforge/sfddiff.c @@ -0,0 +1,487 @@ +/* Copyright (C) 2002-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include + +extern const char *source_modtime_str; + +void doversion(void) { + extern const char *source_version_str; + fprintf( stderr, "Copyright \251 2002 by George Williams.\n Executable based on sources from %s.\n", + source_modtime_str ); + + printf( "sfddiff %s\n", source_version_str ); +exit(0); +} + +static void dousage(void) { + printf( "sfddiff [options] sfdfile1 sfdfile2\n" ); + printf( "\t-version\t (prints the version of sfddiff and exits)\n" ); + printf( "\t-help\t\t (prints a brief help text and exits)\n" ); + printf( "\t-ignorehints\t (differences in hints don't count)\n" ); + printf( "\t-merge out\t (merges the two, with a background copy of diffs from\n" ); + printf( "\t\t\t font2))\n\n" ); + printf( "For more information see:\n\thttp://pfaedit.sourceforge.net/\n" ); + printf( "Send bug reports to:\tgww@silcom.com\n" ); +exit(0); +} + +static void dohelp(void) { + printf( "sfddiff -- compares two of pfaedit's sfd files.\n" ); + printf( " It notices what characters are present in one spline font database and not\n" ); + printf( " in the other. It notices which characters have different shapes, and which\n" ); + printf( " have different hints.\n\n" ); + dousage(); +} + +static SplineChar *FindName(SplineFont *sf,char *name, int guess) { + int i; + + if ( guess>=0 && guesscharcnt && sf->chars[guess]!=NULL && + strcmp(sf->chars[guess]->name,name)==0 ) +return( sf->chars[guess] ); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( strcmp(sf->chars[i]->name,name)==0 ) +return( sf->chars[i] ); + } +return( NULL ); +} + +static int StemDiff(StemInfo *h1, StemInfo *h2) { + while ( h1!=NULL && h2!=NULL ) { + if ( h1->start!=h2->start || h1->width!=h2->width ) +return( false ); + h1 = h1->next; h2 = h2->next; + } + if ( h1==NULL && h2==NULL ) +return( true ); + +return( false ); +} + +static int DStemDiff(DStemInfo *h1, DStemInfo *h2) { + while ( h1!=NULL && h2!=NULL ) { + if ( h1->leftedgetop.x!=h2->leftedgetop.x || + h1->leftedgetop.y!=h2->leftedgetop.y || + h1->leftedgebottom.x!=h2->leftedgebottom.x || + h1->leftedgebottom.y!=h2->leftedgebottom.y || + h1->rightedgetop.x!=h2->rightedgetop.x || + h1->rightedgetop.y!=h2->rightedgetop.y || + h1->rightedgebottom.x!=h2->rightedgebottom.x || + h1->rightedgebottom.y!=h2->rightedgebottom.y ) +return( false ); + h1 = h1->next; h2 = h2->next; + } + if ( h1==NULL && h2==NULL ) +return( true ); + +return( false ); +} + +static int MDDiff(MinimumDistance *h1, MinimumDistance *h2) { + while ( h1!=NULL && h2!=NULL ) { + if ( h1->sp1==NULL && h2->sp1==NULL ) + /* Ok so far */; + else if ( h1->sp1==NULL || h2->sp1==NULL ) +return( false ); + else if ( h1->sp1->me.x!=h2->sp1->me.x || h1->sp1->me.y!=h2->sp1->me.y ) +return( false ); + if ( h1->sp2==NULL && h2->sp2==NULL ) + /* Ok so far */; + else if ( h1->sp2==NULL || h2->sp2==NULL ) +return( false ); + else if ( h1->sp2->me.x!=h2->sp2->me.x || h1->sp2->me.y!=h2->sp2->me.y ) +return( false ); + if ( h1->x!=h2->x ) +return( false ); + h1 = h1->next; h2 = h2->next; + } + if ( h1==NULL && h2==NULL ) +return( true ); + +return( false ); +} + +static int HintDiff(SplineChar *sc1,SplineChar *sc2,int preverrs) { + if ( !StemDiff(sc1->hstem,sc2->hstem) || + !StemDiff(sc1->vstem,sc2->vstem) || + !DStemDiff(sc1->dstem,sc2->dstem) || + !MDDiff(sc1->md,sc2->md) ) { + if ( !preverrs ) printf( "Differences in Enc=%-5d U+%04X %s\n", + sc1->enc, sc1->unicodeenc, sc1->name ); + printf( "\tHints differ\n" ); +return( true ); + } +return( preverrs ); +} + +static RefChar *HasRef(SplineChar *sc,RefChar *r1) { + RefChar *r; + + /* First look for one with exactly the same transform */ + for ( r=sc->layers[ly_fore].refs; r!=NULL; r=r->next ) + if ( strcmp(r->sc->name,r1->sc->name)==0 && + r->transform[0]==r1->transform[0] && + r->transform[1]==r1->transform[1] && + r->transform[2]==r1->transform[2] && + r->transform[3]==r1->transform[3] && + r->transform[4]==r1->transform[4] && + r->transform[5]==r1->transform[5] ) +return( r ); + + /* If that fails try again with just same name */ + for ( r=sc->layers[ly_fore].refs; r!=NULL; r=r->next ) + if ( strcmp(r->sc->name,r1->sc->name)==0 ) +return( r ); + +return( NULL ); +} + +static int RefsDiff(SplineChar *sc1, SplineChar *sc2, int preverrs, int firstpass ) { + RefChar *r1, *r2; + + for ( r1=sc1->layers[ly_fore].refs; r1!=NULL; r1=r1->next ) { + r2 = HasRef(sc2,r1); + if ( r2==NULL ) { + if ( !preverrs ) printf( "Differences in Enc=%-5d U+%04X %s\n", + sc1->enc, sc1->unicodeenc, sc1->name ); + preverrs = true; + printf( "\tFont%d refers to Enc=%-5d U+%04X %s\n", + firstpass?1:2,r1->sc->enc, r1->sc->unicodeenc, r1->sc->name); + } else if ( firstpass && + (r1->transform[0]!=r2->transform[0] || + r1->transform[1]!=r2->transform[1] || + r1->transform[2]!=r2->transform[2] || + r1->transform[3]!=r2->transform[3] || + r1->transform[4]!=r2->transform[4] || + r1->transform[5]!=r2->transform[5] )) { + if ( !preverrs ) printf( "Differences in Enc=%-5d U+%04X %s\n", + sc1->enc, sc1->unicodeenc, sc1->name ); + preverrs = true; + printf( "\tDifferent transform in reference to Enc=%-5d U+%04X %s\n", + r1->sc->enc, r1->sc->unicodeenc, r1->sc->name); + printf( "\t\t[%g,%g,%g,%g,%g,%g] vs. [%g,%g,%g,%g,%g,%g]\n", + r1->transform[0], r1->transform[1], r1->transform[2], + r1->transform[3], r1->transform[4], r1->transform[5], + r2->transform[0], r2->transform[1], r2->transform[2], + r2->transform[3], r2->transform[4], r2->transform[5] ); + } + } +return( preverrs ); +} + +static int SSMatch(SplinePoint *first1, SplinePoint *first2) { + SplinePoint *sp1, *sp2; + + for ( sp1=first1, sp2=first2; ; ) { + if ( sp1->me.x!=sp2->me.x || + sp1->me.y!=sp2->me.y || + sp1->nextcp.x!=sp2->nextcp.x || + sp1->nextcp.y!=sp2->nextcp.y || + sp1->prevcp.x!=sp2->prevcp.x || + sp1->prevcp.y!=sp2->prevcp.y ) +return( false ); + if ( sp1->next==NULL && sp2->next==NULL ) +return( true ); + if ( sp1->next==NULL || sp2->next==NULL ) +return( false ); + sp1 = sp1->next->to; + sp2 = sp2->next->to; + if ( sp1==first1 && sp2==first2 ) +return( true ); + if ( sp1==first1 || sp2==first2 ) +return( false ); + } +} + +static int SSBackMatch(SplinePoint *first1, SplinePoint *first2) { + SplinePoint *sp1, *sp2; + + for ( sp1=first1, sp2=first2; ; ) { + if ( sp1->me.x!=sp2->me.x || + sp1->me.y!=sp2->me.y || + sp1->nextcp.x!=sp2->prevcp.x || + sp1->nextcp.y!=sp2->prevcp.y || + sp1->prevcp.x!=sp2->nextcp.x || + sp1->prevcp.y!=sp2->nextcp.y ) +return( false ); + if ( sp1->next==NULL && sp2->prev==NULL ) +return( true ); + if ( sp1->next==NULL || sp2->prev==NULL ) +return( false ); + sp1 = sp1->next->to; + sp2 = sp2->prev->from; + if ( sp1==first1 && sp2==first2 ) +return( true ); + if ( sp1==first1 || sp2==first2 ) +return( false ); + } +} + +static int SSSearchMatch(SplineSet *ss1,SplineSet *ss2) { + SplinePoint *sp2; + + for ( sp2 = ss2->first; ; ) { + if ( SSMatch(ss1->first,sp2) ) +return( 2 ); + else if ( SSBackMatch(ss1->first,sp2) ) +return( 3 ); + if ( sp2->next==NULL ) +return( 0 ); + sp2 = sp2->next->to; + if ( sp2==ss2->first ) +return( 0 ); + } +} + +static int SSsMatch(SplineSet *ss1,SplineSet *spl) { + int ret; + + while ( spl!=NULL ) { + if ( spl->first->ptindex==0 ) { + if ( SSMatch(ss1->first,spl->first)) { + spl->first->ptindex = 1; +return( 0 ); + } else if ( SSBackMatch(ss1->first,spl->first)) +return( 1 ); + ret = SSSearchMatch(ss1,spl); + if ( ret==2 || ret==3 ) +return( ret ); + } + spl = spl->next; + } +return( 4 ); +} + +static int SplineDiff(SplineChar *sc1,SplineChar *sc2,int preverrs) { + int cnt1, cnt2, diff; + SplineSet *ss1, *ss2; + + for ( ss1=sc1->layers[ly_fore].splines, cnt1=0; ss1!=NULL; ss1=ss1->next, ++cnt1 ); + for ( ss2=sc2->layers[ly_fore].splines, cnt2=0; ss2!=NULL; ss2=ss2->next, ++cnt2 ); + if ( cnt1!=cnt2 ) { + if ( !preverrs ) printf( "Differences in Enc=%-5d U+%04X %s\n", + sc1->enc, sc1->unicodeenc, sc1->name ); + printf( "\tDifferent number of contours\n" ); +return( true ); + } + for ( ss1=sc1->layers[ly_fore].splines; ss1!=NULL; ss1=ss1->next ) { + diff = SSsMatch(ss1,sc2->layers[ly_fore].splines); + if ( diff==0 ) + continue; /* same */ + else { + if ( !preverrs ) printf( "Differences in Enc=%-5d U+%04X %s\n", + sc1->enc, sc1->unicodeenc, sc1->name ); + if ( diff==1 ) + printf( "\tContour has changed direction\n" ); + else if ( diff==2 ) + printf( "\tContour has changed its start point\n" ); + else if ( diff==3 ) + printf( "\tContour has changed both its direction and its start point\n" ); + else + printf( "\tContours differ\n" ); +return( true ); + } + } +return( preverrs ); +} + +static void dodiff( SplineFont *sf1, SplineFont *sf2, int checkhints, + char *outfilename ) { + int i, any, adiff=0, extras, oldcnt; + SplineChar *sc, *sc1; + + if ( sf1->encoding_name != sf2->encoding_name ) { + printf( "The two fonts have different encodings\n" ); + adiff = 1; + } + if ( sf1->order2 != sf2->order2 ) { + printf( "The two fonts have spline orders\n" ); + adiff = 1; + } + if ( strcmp(sf1->fontname,sf2->fontname)!=0 || + strcmp(sf1->familyname,sf2->familyname)!=0 || + strcmp(sf1->fullname,sf2->fullname)!=0 ) { + printf( "The two fonts have different names\n" ); + ++adiff; + } + if ( strcmp(sf1->version,sf2->version)!=0 ) { + printf( "The two fonts have different versions\n" ); + ++adiff; + } + if ( strcmp(sf1->weight,sf2->weight)!=0 ) { + printf( "The two fonts have different weights\n" ); + ++adiff; + } + if ( sf1->copyright==NULL && sf2->copyright==NULL ) + /* Match */; + else if ( sf1->copyright==NULL || sf2->copyright==NULL || + strcmp(sf1->copyright,sf2->copyright)!=0 ) { + printf( "The two fonts have different copyrights\n" ); + ++adiff; + } + if ( sf1->comments==NULL && sf2->comments==NULL ) + /* Match */; + else if ( sf1->comments==NULL || sf2->comments==NULL || + strcmp(sf1->comments,sf2->comments)!=0 ) { + printf( "The two fonts have different comments\n" ); + ++adiff; + } + if ( !RealApprox(sf1->italicangle,sf2->italicangle) ) { + printf( "The two fonts have different italic angles\n" ); + ++adiff; + } + + /* Look for any char in sf1 not in sf2 */ + any = false; + for ( i=0; icharcnt; ++i ) if ( sf1->chars[i]!=NULL ) { + sc = FindName(sf2,sf1->chars[i]->name,i); + if ( sc==NULL ) { + ++adiff; + if ( !any ) + printf( "Characters in font1 not in font2\n" ); + any = true; + printf( "\tEnc=%-5d U+%04X %s\n", i, sf1->chars[i]->unicodeenc, + sf1->chars[i]->name ); + } + } + + /* Look for any char in sf2 not in sf1 */ + extras = 0; + any = false; + for ( i=0; icharcnt; ++i ) if ( sf2->chars[i]!=NULL ) { + sc = FindName(sf1,sf2->chars[i]->name,i); + if ( sc==NULL ) { + ++adiff; ++extras; + if ( !any ) + printf( "Characters in font2 not in font1\n" ); + any = true; + printf( "\tEnc=%-5d U+%04X %s\n", i, sf2->chars[i]->unicodeenc, + sf2->chars[i]->name ); + } + } + + /* Look for characters present in both which are different */ + for ( i=0; icharcnt; ++i ) if ( (sc1=sf1->chars[i])!=NULL ) { + sc = FindName(sf2,sc1->name,i); + if ( sc!=NULL ) { + any = RefsDiff(sc1,sc,false,true); + any = RefsDiff(sc,sc1,any,false); + any = SplineDiff(sc,sc1,any); + if ( checkhints ) { + HintDiff(sc1,sc,any); + } + if (! ( (sc->comment==NULL && sc1->comment==NULL) || + (sc->comment!=NULL && sc1->comment!=NULL && + u_strcmp(sc->comment,sc1->comment)==0) )) { + if ( !any ) printf( "Differences in Enc=%-5d U+%04X %s\n", + sc1->enc, sc1->unicodeenc, sc1->name ); + printf( "\tComments are different\n" ); + } + if ( any ) { + sc1->layers[ly_back].splines = sc->layers[ly_fore].splines; + ++adiff; + } + } + } + + if ( adiff!=0 && outfilename!=NULL ) { + if ( extras!=0 ) { + oldcnt = sf1->charcnt; + sf1->charcnt += extras; + sf1->chars = grealloc(sf1->chars,sf1->charcnt*sizeof(SplineChar *)); + for ( i=oldcnt; icharcnt; ++i ) + sf1->chars[i] = NULL; + extras = oldcnt; + for ( i=0; icharcnt; ++i ) if ( sf2->chars[i]!=NULL ) { + sc = FindName(sf1,sf2->chars[i]->name,i); + if ( sc==NULL ) { + if ( ichars[i]==NULL && + sf1->encoding_name == sf2->encoding_name ) { + sf1->chars[i] = sf2->chars[i]; + sf1->chars[i]->parent = sf1; + } else { + sf1->chars[extras] = sf2->chars[i]; + sf1->chars[extras]->enc = extras; + sf1->chars[extras++]->parent = sf1; + } + sf2->chars[i] = NULL; + } + } + } + if ( !SFDWrite(outfilename,sf1) ) + fprintf( stderr, "Failed to write output file: %s\n", outfilename ); + } +} + +int main(int argc, char **argv) { + SplineFont *sf[2]; + char *outfilename = NULL; + int checkhints = true; + int i, which=0; + char *pt; + +/* + fprintf( stderr, "Copyright \251 2002 by George Williams.\n Executable based on sources from %s.\n", + source_modtime_str ); +*/ + + for ( i=1; i + +#include "../gdraw/ggadgetP.h" +#include "ustring.h" +#include "utype.h" + +typedef struct fontdata { + SplineFont *sf; + enum sftf_fonttype fonttype; + int pixelsize; + int antialias; + BDFFont *bdf; + struct fontdata *next; + struct fontdata *depends_on; /* We use much of the ftc allocated for depends_on */ + /* Can't free depends_on until after we get freeed */ + struct _GImage base; + GImage gi; + GClut clut; + struct sfmaps *sfmap; +} FontData; + +typedef struct sftextarea { + GGadget g; + unsigned int cursor_on: 1; + unsigned int wordsel: 1; + unsigned int linesel: 1; + unsigned int listfield: 1; + unsigned int drag_and_drop: 1; + unsigned int has_dd_cursor: 1; + unsigned int hidden_cursor: 1; + unsigned int multi_line: 1; + unsigned int accepts_tabs: 1; + unsigned int accepts_returns: 1; + unsigned int wrap: 1; + unsigned int dobitext: 1; /* has at least one right to left character */ + unsigned int password: 1; + unsigned int dontdraw: 1; /* Used when the tf is part of a larger control, and the control determines when to draw the tf */ + uint8 fh; + uint8 as; + uint8 nw; /* Width of one character (an "n") */ + int16 xoff_left, loff_top; + int16 sel_start, sel_end, sel_base; + int16 sel_oldstart, sel_oldend, sel_oldbase; + int16 dd_cursor_pos; + unichar_t *text, *oldtext; + FontInstance *font; + GTimer *pressed; + GTimer *cursor; + GCursor old_cursor; + GScrollBar *hsb, *vsb; + int16 lcnt, lmax; + int32 *lines; /* offsets in text to the start of the nth line */ + GBiText bidata; + int32 bilen; /* allocated size of bidata */ + int16 xmax; + GIC *gic; + struct lineheights { int32 y; int16 as, fh; } *lineheights; + struct fontlist { + int start, end; /* starting and ending characters [start,end) */ + FontData *fd; + struct fontlist *next; + } *fontlist, *oldfontlist; + struct sfmaps { + SplineFont *sf; + int umax; + int *map; + struct sfmaps *next; + } *sfmaps; + FontData *generated; + void *cbcontext; + void (*changefontcallback)(void *,SplineFont *,enum sftf_fonttype,int size,int aa); + FontData *last_fd; +} SFTextArea; + +void SFTextAreaShow(GGadget *g,int pos); +void SFTextAreaSelect(GGadget *g,int start, int end); +void SFTextAreaReplace(GGadget *g,const unichar_t *txt); + +static GBox sftextarea_box = { /* Don't initialize here */ 0 }; +static int sftextarea_inited = false; +static FontInstance *sftextarea_font; + +static unichar_t nullstr[] = { 0 }, + newlinestr[] = { '\n', 0 }, tabstr[] = { '\t', 0 }; + +static int SFTextArea_Show(SFTextArea *st, int pos); +static void GTPositionGIC(SFTextArea *st); + +static void SFTextAreaChanged(SFTextArea *st,int src) { + GEvent e; + + e.type = et_controlevent; + e.w = st->g.base; + e.u.control.subtype = et_textchanged; + e.u.control.g = &st->g; + e.u.control.u.tf_changed.from_pulldown = src; + if ( st->g.handle_controlevent != NULL ) + (st->g.handle_controlevent)(&st->g,&e); + else + GDrawPostEvent(&e); +} + +static void SFTextAreaFocusChanged(SFTextArea *st,int gained) { + GEvent e; + + e.type = et_controlevent; + e.w = st->g.base; + e.u.control.subtype = et_textfocuschanged; + e.u.control.g = &st->g; + e.u.control.u.tf_focus.gained_focus = gained; + if ( st->g.handle_controlevent != NULL ) + (st->g.handle_controlevent)(&st->g,&e); + else + GDrawPostEvent(&e); +} + +static void SFTextAreaProcessBi(SFTextArea *st, int start_of_change) { + int i, pos; + unichar_t *pt, *end; + GBiText bi; + + if ( !st->dobitext ) + i = GDrawIsAllLeftToRight(st->text+start_of_change,-1); + else + i = GDrawIsAllLeftToRight(st->text,-1); + st->dobitext = (i!=1); + if ( st->dobitext ) { + int cnt = u_strlen(st->text); + if ( cnt>= st->bilen ) { + st->bilen = cnt + 50; + free(st->bidata.text); free(st->bidata.level); + free(st->bidata.override); free(st->bidata.type); + free(st->bidata.original); + ++st->bilen; + st->bidata.text = galloc(st->bilen*sizeof(unichar_t)); + st->bidata.level = galloc(st->bilen*sizeof(uint8)); + st->bidata.override = galloc(st->bilen*sizeof(uint8)); + st->bidata.type = galloc(st->bilen*sizeof(uint16)); + st->bidata.original = galloc(st->bilen*sizeof(unichar_t *)); + --st->bilen; + } + bi = st->bidata; + pt = st->text; + pos = 0; + st->bidata.interpret_arabic = false; + do { + end = u_strchr(pt,'\n'); + if ( end==NULL || !st->multi_line ) end = pt+u_strlen(pt); + else ++end; + bi.text = st->bidata.text+pos; + bi.level = st->bidata.level+pos; + bi.override = st->bidata.override+pos; + bi.type = st->bidata.type+pos; + bi.original = st->bidata.original+pos; + bi.base_right_to_left = GDrawIsAllLeftToRight(pt,end-pt)==-1; + GDrawBiText1(&bi,pt,end-pt); + if ( bi.interpret_arabic ) st->bidata.interpret_arabic = true; + pos += end-pt; + pt = end; + } while ( *pt!='\0' ); + st->bidata.len = cnt; + if ( !st->multi_line ) { + st->bidata.base_right_to_left = bi.base_right_to_left; + GDrawBiText2(&st->bidata,0,-1); + } + } +} +static int FDMap(FontData *fd,int uenc) { + /* given a unicode code point, find the encoding in this font */ + if ( fd->sf->encoding_name==em_unicode || fd->sf->encoding_name==em_unicode4 ) { + if ( fd->sf->chars[uenc]==NULL ) +return( -1 ); +return( uenc ); + } + + if ( uenc>fd->sfmap->umax ) +return( -1 ); +return( fd->sfmap->map[uenc] ); +} + +static int FDDrawChar(GWindow pixmap,FontData *fd,int enc,int x,int y,Color col) { + BDFChar *bdfc; + + if ( enc!=-1 && fd->bdf->chars[enc]==NULL ) + BDFPieceMeal(fd->bdf,enc); + if ( enc==-1 || (bdfc=fd->bdf->chars[enc])==NULL ) { + if ( col!=-1 ) { + GRect r; + r.x = x+1; r.width= fd->bdf->ascent/2-2; + r.height = (2*fd->bdf->ascent/3); r.y = y-r.height; + GDrawDrawRect(pixmap,&r,col); + } + x += fd->bdf->ascent/2; + } else { + if ( col!=-1 ) { + fd->clut.clut[1] = col; /* Only works for bitmaps */ + fd->base.clut->trans_index = 0; + fd->base.data = bdfc->bitmap; + fd->base.bytes_per_line = bdfc->bytes_per_line; + fd->base.width = bdfc->xmax-bdfc->xmin+1; + fd->base.height = bdfc->ymax-bdfc->ymin+1; + GDrawDrawImage(pixmap,&fd->gi,NULL,x+bdfc->xmin, y-bdfc->ymax); + fd->base.clut->trans_index = -1; + } + x += bdfc->width; + } +return( x ); +} + +static int STDrawText(SFTextArea *st,GWindow pixmap,int x,int y, + int pos, int len, Color col ) { + struct fontlist *fl, *sub; + int ch, npos; + + if ( len==-1 ) + len = u_strlen(st->text)-pos; + for ( fl=st->fontlist; fl!=NULL; fl=fl->next ) + if ( fl->start<=pos && fl->end>pos ) + break; + if ( fl==NULL ) +return(x); + + if ( !st->dobitext ) { + while ( len>0 ) { + if ( pos>=fl->end ) + fl = fl->next; + if ( fl==NULL ) + break; + if ( st->text[pos]!='\n' ) { + ch = FDMap(fl->fd,st->text[pos]); + x = FDDrawChar(pixmap,fl->fd,ch,x,y,col); + } + ++pos; + --len; + } + } else { + while ( len>0 ) { + npos = st->bidata.original[pos]-st->text; + for ( sub=fl; sub!=NULL; sub=sub->next ) + if ( sub->start<=pos && sub->end>pos ) + break; + if ( sub!=NULL && st->bidata.text[pos]!='\n') { + ch = FDMap(sub->fd,st->bidata.text[pos]); + x = FDDrawChar(pixmap,sub->fd,ch,x,y,col); + } + ++pos; + --len; + } + } +return( x ); +} + +static int STGetTextWidth(SFTextArea *st, int pos, int len ) { +return( STDrawText(st,NULL,0,-1,pos,len,-1)); +} + +static void STGetTextPtAfterPos(SFTextArea *st, unichar_t *pt, int cnt, int max, unichar_t **end ) { + unichar_t *last = pt+cnt; + int len; + + while ( pttext,1); + max -= len; + if ( max<0 ) { + *end = pt-1; +return; + } + ++pt; + } + *end = pt; +} + +static void STGetTextPtBeforePos(SFTextArea *st, unichar_t *pt, int cnt, int max, unichar_t **end ) { + unichar_t *last = pt+cnt; + int len; + + while ( pttext,1); + max -= len; + if ( max<0 ) { + *end = pt; +return; + } + ++pt; + } + *end = pt; +} + +static void SFFigureLineHeight(SFTextArea *st, int i) { + int as=0, ds=0; + int start, end; + struct fontlist *fl; + + if ( i<0 ) +return; + start = st->lines[i]; end = st->lines[i+1]; + for ( fl=st->fontlist; fl!=NULL && fl->endnext ); + for ( ; fl!=NULL; fl=fl->next ) { + if ( fl->fd->bdf->ascent>as ) + as = fl->fd->bdf->ascent; + if ( fl->fd->bdf->descent>ds ) + ds = fl->fd->bdf->descent; + if ( fl->end>=end ) + break; + } + if ( as+ds==0 ) { as = st->as; ds = st->fh-as; } + st->lineheights[i].fh = as+ds; + st->lineheights[i].as = as; + if ( i==0 ) + st->lineheights[i].y = 0; + else + st->lineheights[i].y = st->lineheights[i-1].y+st->lineheights[i-1].fh; +} + +static void SFTextAreaRefigureLines(SFTextArea *st, int start_of_change) { + int i, dobitext; + unichar_t *pt, *ept, *end, *temp; + + GDrawSetFont(st->g.base,st->font); + if ( st->lines==NULL ) { + st->lines = galloc(10*sizeof(int32)); + st->lineheights = galloc(10*sizeof(struct lineheights)); + st->lines[0] = 0; + st->lines[1] = -1; + st->lmax = 10; + st->lcnt = 1; + if ( st->vsb!=NULL ) + GScrollBarSetBounds(&st->vsb->g,0,st->lcnt-1,st->g.inner.height); + } + + SFTextAreaProcessBi(st,start_of_change); + + if ( !st->multi_line ) { + st->xmax = STGetTextWidth(st,0,-1); +return; + } + + for ( i=0; ilcnt && st->lines[i]wrap || st->fontlist==NULL ) { + if ( --i<0 ) i = 0; + pt = st->text+st->lines[i]; + while ( ( ept = u_strchr(pt,'\n'))!=NULL ) { + if ( i>=st->lmax ) { + st->lines = grealloc(st->lines,(st->lmax+=10)*sizeof(int32)); + st->lineheights = grealloc(st->lineheights,st->lmax*sizeof(struct lineheights)); + } + st->lines[i] = pt-st->text; + SFFigureLineHeight(st,i-1); + ++i; + pt = ept+1; + } + if ( i>=st->lmax ) { + st->lines = grealloc(st->lines,(st->lmax+=10)*sizeof(int32)); + st->lineheights = grealloc(st->lineheights,st->lmax*sizeof(struct lineheights)); + } + st->lines[i] = pt-st->text; + SFFigureLineHeight(st,i-1); + ++i; + } else { + if (( i -= 2 )<0 ) i = 0; + pt = st->text+st->lines[i]; + dobitext = st->dobitext; st->dobitext = false; /* Turn bitext processing of for eol computation */ + do { + if ( ( ept = u_strchr(pt,'\n'))==NULL ) + ept = pt+u_strlen(pt); + while ( pt<=ept ) { + STGetTextPtAfterPos(st,pt, ept-pt, st->g.inner.width, &end); + if ( end!=ept && !isbreakbetweenok(*end,end[1]) ) { + for ( temp=end; temp>pt && !isbreakbetweenok(*temp,temp[1]); --temp ); + if ( temp==pt ) + for ( temp=end; temp=st->lmax ) { + st->lines = grealloc(st->lines,(st->lmax+=10)*sizeof(int32)); + st->lineheights = grealloc(st->lineheights,st->lmax*sizeof(struct lineheights)); + } + st->lines[i] = pt-st->text; + SFFigureLineHeight(st,i-1); + ++i; + if ( *end=='\0' ) + goto break_2_loops; + pt = end+1; + } + } while ( *ept!='\0' ); + break_2_loops: + st->dobitext = dobitext; + } + if ( i>=2 ) + st->lineheights[i-1].y = st->lineheights[i-2].y+st->lineheights[i-2].fh; + else + st->lineheights[i-1].y = 0; + if ( st->lcnt!=i ) { int page; + st->lcnt = i; + if ( st->vsb!=NULL ) + GScrollBarSetBounds(&st->vsb->g,0,st->lineheights[i-1].y,st->g.inner.height); + for ( page=1; st->lcnt-page>=0 && st->lineheights[st->lcnt-1].y-st->lineheights[st->lcnt-page].y<=st->g.inner.height; + ++page ); + if ( st->loff_top > st->lcnt-page ) { + st->loff_top = st->lcnt-page; + if ( st->loff_top<0 ) st->loff_top = 0; + if ( st->vsb!=NULL ) + GScrollBarSetPos(&st->vsb->g,st->lineheights[st->loff_top].y); + } + } + if ( i>=st->lmax ) { + st->lines = grealloc(st->lines,(st->lmax+=10)*sizeof(int32)); + st->lineheights = grealloc(st->lineheights,st->lmax*sizeof(struct lineheights)); + } + st->lines[i++] = -1; + + st->xmax = 0; + for ( i=0; ilcnt; ++i ) { + int eol = st->lines[i+1]==-1?-1:st->lines[i+1]-st->lines[i]-1; + int wid = STGetTextWidth(st,st->lines[i],eol); + if ( wid>st->xmax ) + st->xmax = wid; + } + if ( st->hsb!=NULL ) { + GScrollBarSetBounds(&st->hsb->g,0,st->xmax,st->g.inner.width); + } + + if ( st->dobitext ) { + int end = -1, off; + for ( i=0; ilcnt; ++i ) { + if ( st->lines[i]>end ) { + unichar_t *ept = u_strchr(st->text+end+1,'\n'); + if ( ept==NULL ) ept = st->text+u_strlen(st->text); + st->bidata.base_right_to_left = GDrawIsAllLeftToRight(st->text+end+1,ept-st->text)==-1; + end = ept - st->text; + } + off = 0; + if ( st->text[st->lines[i+1]-1]=='\n' ) off=1; + GDrawBiText2(&st->bidata,st->lines[i],st->lines[i+1]-off); + } + } +} + +static void fontlistfree(struct fontlist *fl ) { + struct fontlist *nfl; + + for ( ; fl!=NULL; fl=nfl ) { + nfl = fl->next; + chunkfree(fl,sizeof(struct fontlist)); + } +} + +static struct fontlist *fontlistcopy(struct fontlist *fl ) { + struct fontlist *nfl, *nhead=NULL, *last=NULL; + + for ( ; fl!=NULL; fl=fl->next ) { + nfl = chunkalloc(sizeof(struct fontlist)); + *nfl = *fl; + if ( nhead == NULL ) + nhead = nfl; + else + last->next = nfl; + last = nfl; + } +return( nhead ); +} + +static void fontlistcheck(SFTextArea *st) { + struct fontlist *fl, *next; + + if ( st->fontlist==NULL ) +return; + for ( fl = st->fontlist; fl!=NULL; fl=next ) { + next = fl->next; + if ( next==NULL ) + break; + if ( fl->start>fl->end || fl->end!=next->start || next==fl || next->next==fl ) { + GDrawIError("FontList is corrupted" ); + fl->next = NULL; +return; + } + } +} + +static void fontlistmergecheck(SFTextArea *st) { + struct fontlist *fl, *next; + + if ( st->fontlist==NULL ) +return; + fontlistcheck(st); + for ( fl = st->fontlist; fl!=NULL; fl=next ) { + for ( next=fl->next; next!=NULL && next->fd==fl->fd ; next = fl->next ) { + fl->next = next->next; + fl->end = next->end; + chunkfree(next,sizeof(struct fontlist)); + } + } + fontlistcheck(st); +} + +static void SFTextAreaChangeFontList(SFTextArea *st,int rpllen) { + /* we are removing a chunk starting at st->sel_start going to st->sel_end */ + /* and replacing it with a chunk that is rpllen long */ + /* So we remove any chunks wholy within sel_start,sel_end and extend the */ + /* chunk at sel_start by rpllen */ + struct fontlist *fl, *next, *test; + int diff, checkmerge=true; + + fontlistfree(st->oldfontlist); + st->oldfontlist = fontlistcopy(st->fontlist); + + for ( fl=st->fontlist; fl!=NULL && st->sel_start>fl->end; fl=fl->next ); + if ( fl==NULL ) +return; + diff = rpllen - (st->sel_end-st->sel_start); + if ( fl->end>=st->sel_end ) { + fl->end += diff; + fl = fl->next; + } else { + fl->end = st->sel_start + rpllen; + for ( test=fl->next; test!=NULL && st->sel_end>=test->end; test=next ) { + next = test->next; + chunkfree(test,sizeof(struct fontlist)); + checkmerge=true; + } + fl->next = test; + if ( test!=NULL ) { + test->start = fl->end; + test->end -= diff; + fl = test->next; + } else + fl = NULL; + } + while ( fl!=NULL ) { + fl->start += diff; + fl->end += diff; + fl = fl->next; + } + if ( checkmerge ) + fontlistmergecheck(st); +} + +static void _SFTextAreaReplace(SFTextArea *st, const unichar_t *str) { + unichar_t *old = st->oldtext; + int rpllen = u_strlen(str); + unichar_t *new = galloc((u_strlen(st->text)-(st->sel_end-st->sel_start) + rpllen+1)*sizeof(unichar_t)); + + st->oldtext = st->text; + st->sel_oldstart = st->sel_start; + st->sel_oldend = st->sel_end; + st->sel_oldbase = st->sel_base; + SFTextAreaChangeFontList(st,rpllen); + + u_strncpy(new,st->text,st->sel_start); + u_strcpy(new+st->sel_start,str); + st->sel_start += rpllen; + u_strcpy(new+st->sel_start,st->text+st->sel_end); + st->text = new; + st->sel_end = st->sel_base = st->sel_start; + free(old); + + SFTextAreaRefigureLines(st,st->sel_oldstart); +} + +static void SFTextArea_Replace(SFTextArea *st, const unichar_t *str) { + _SFTextAreaReplace(st,str); + SFTextArea_Show(st,st->sel_start); +} + +static int SFTextAreaFindLine(SFTextArea *st, int pos) { + int i; + for ( i=0; st->lines[i+1]!=-1; ++i ) + if ( poslines[i+1]) + break; +return( i ); +} + +static unichar_t *SFTextAreaGetPtFromPos(SFTextArea *st,int i,int xpos) { + int ll, offset, len; + + ll = st->lines[i+1]; + if ( ll==-1 ) ll = st->lines[i]+u_strlen(st->text+st->lines[i]); + xpos -= st->g.inner.x-st->xoff_left; + for ( offset=st->lines[i]; offsettext+offset ); + } +return( st->text+offset ); +} + +static int SFTextAreaBiPosFromPos(SFTextArea *st,int i,int pos) { + int ll,j; + unichar_t *pt = st->text+pos; + + if ( !st->dobitext ) +return( pos ); + ll = st->lines[i+1]==-1?-1:st->lines[i+1]-st->lines[i]-1; + for ( j=st->lines[i]; jbidata.original[j] == pt ) +return( j ); + +return( pos ); +} + +static int SFTextAreaGetOffsetFromOffset(SFTextArea *st,int l, int sel) { + int i; + unichar_t *spt = st->text+sel; + int llen = st->lines[l+1]!=-1 ? st->lines[l+1]: u_strlen(st->text+st->lines[l])+st->lines[l]; + + if ( !st->dobitext ) +return( sel ); + for ( i=st->lines[l]; ibidata.original[i]!=spt; ++i ); +return( i ); +} + +static int SFTextArea_Show(SFTextArea *st, int pos) { + int i, ll, m, xoff, loff; + unichar_t *bitext = st->dobitext ? st->bidata.text:st->text; + int refresh=false, page; + + if ( pos < 0 ) pos = 0; + if ( pos > u_strlen(st->text)) pos = u_strlen(st->text); + i = SFTextAreaFindLine(st,pos); + + loff = st->loff_top; + if ( st->lineheights[st->lcnt-1].yg.inner.height ) + loff = 0; + if ( ilcnt-page>=0 && st->lineheights[st->lcnt-1].y-st->lineheights[st->lcnt-page].y<=st->g.inner.height; + ++page ); + if ( loff > st->lcnt-page ) + loff = st->lcnt-page; + if ( loff<0 ) loff = 0; + + xoff = st->xoff_left; + if ( st->lines[i+1]==-1 ) ll = -1; else ll = st->lines[i+1]-st->lines[i]-1; + if ( STGetTextWidth(st,st->lines[i],ll)< st->g.inner.width ) + xoff = 0; + else { + if ( st->dobitext ) { + bitext = st->bidata.text; + pos = SFTextAreaBiPosFromPos(st,i,pos); + } else + bitext = st->text; + m = STGetTextWidth(st,st->lines[i],pos-st->lines[i]); + if ( m < xoff ) + xoff = st->nw*(m/st->nw); + if ( m - xoff >= st->g.inner.width ) + xoff = st->nw * ((m-2*st->g.inner.width/3)/st->nw); + } + + if ( xoff!=st->xoff_left ) { + st->xoff_left = xoff; + if ( st->hsb!=NULL ) + GScrollBarSetPos(&st->hsb->g,xoff); + refresh = true; + } + if ( loff!=st->loff_top ) { + st->loff_top = loff; + if ( st->vsb!=NULL ) + GScrollBarSetPos(&st->vsb->g,st->lineheights[loff].y); + refresh = true; + } + GTPositionGIC(st); +return( refresh ); +} + +static void *genunicodedata(void *_gt,int32 *len) { + SFTextArea *st = _gt; + *len = st->sel_end-st->sel_start; +return( u_copyn(st->text+st->sel_start,st->sel_end-st->sel_start)); +} + +static void *genutf8data(void *_gt,int32 *len) { + GTextField *gt = _gt; + unichar_t *temp =u_copyn(gt->text+gt->sel_start,gt->sel_end-gt->sel_start); + char *ret = u2utf8_copy(temp); + free(temp); + *len = strlen(ret); +return( ret ); +} + +static void *ddgenunicodedata(void *_gt,int32 *len) { + void *temp = genunicodedata(_gt,len); + SFTextArea *st = _gt; + _SFTextAreaReplace(st,nullstr); + _ggadget_redraw(&st->g); +return( temp ); +} + +static void *genlocaldata(void *_gt,int32 *len) { + SFTextArea *st = _gt; + unichar_t *temp =u_copyn(st->text+st->sel_start,st->sel_end-st->sel_start); + char *ret = u2def_copy(temp); + free(temp); + *len = strlen(ret); +return( ret ); +} + +static void *ddgenlocaldata(void *_gt,int32 *len) { + void *temp = genlocaldata(_gt,len); + SFTextArea *st = _gt; + _SFTextAreaReplace(st,nullstr); + _ggadget_redraw(&st->g); +return( temp ); +} + +static void noop(void *_st) { +} + +static void SFTextAreaGrabPrimarySelection(SFTextArea *st) { + int ss = st->sel_start, se = st->sel_end; + + GDrawGrabSelection(st->g.base,sn_primary); + st->sel_start = ss; st->sel_end = se; + GDrawAddSelectionType(st->g.base,sn_primary,"text/plain;charset=ISO-10646-UCS-2",st,st->sel_end-st->sel_start, + sizeof(unichar_t), + genunicodedata,noop); + GDrawAddSelectionType(st->g.base,sn_primary,"UTF8_STRING",st,3*(st->sel_end-st->sel_start), + sizeof(unichar_t), + genutf8data,noop); + GDrawAddSelectionType(st->g.base,sn_primary,"STRING",st,st->sel_end-st->sel_start,sizeof(char), + genlocaldata,noop); +} + +static void SFTextAreaGrabDDSelection(SFTextArea *st) { + + GDrawGrabSelection(st->g.base,sn_drag_and_drop); + GDrawAddSelectionType(st->g.base,sn_drag_and_drop,"text/plain;charset=ISO-10646-UCS-2",st,st->sel_end-st->sel_start, + sizeof(unichar_t), + ddgenunicodedata,noop); + GDrawAddSelectionType(st->g.base,sn_drag_and_drop,"STRING",st,st->sel_end-st->sel_start,sizeof(char), + ddgenlocaldata,noop); +} + +static void SFTextAreaGrabSelection(SFTextArea *st, enum selnames sel ) { + + if ( st->sel_start!=st->sel_end ) { + unichar_t *temp; + char *ctemp; + GDrawGrabSelection(st->g.base,sel); + temp = u_copyn(st->text+st->sel_start,st->sel_end-st->sel_start); + ctemp = u2utf8_copy(temp); + GDrawAddSelectionType(st->g.base,sel,"text/plain;charset=ISO-10646-UCS-2",temp,u_strlen(temp),sizeof(unichar_t), + NULL,NULL); + GDrawAddSelectionType(st->g.base,sel,"UTF8_STRING",ctemp,strlen(ctemp),sizeof(char), + NULL,NULL); + GDrawAddSelectionType(st->g.base,sel,"STRING",u2def_copy(temp),u_strlen(temp),sizeof(char), + NULL,NULL); + } +} + +static int SFTextAreaSelBackword(unichar_t *text,int start) { + unichar_t ch = text[start-1]; + + if ( start==0 ) + /* Can't go back */; + else if ( isalnum(ch) || ch=='_' ) { + int i; + for ( i=start-1; i>=0 && (isalnum(text[i]) || text[i]=='_') ; --i ); + start = i+1; + } else { + int i; + for ( i=start-1; i>=0 && !isalnum(text[i]) && text[i]!='_' ; --i ); + start = i+1; + } +return( start ); +} + +static int SFTextAreaSelForeword(unichar_t *text,int end) { + unichar_t ch = text[end]; + + if ( ch=='\0' ) + /* Nothing */; + else if ( isalnum(ch) || ch=='_' ) { + int i; + for ( i=end; isalnum(text[i]) || text[i]=='_' ; ++i ); + end = i; + } else { + int i; + for ( i=end; !isalnum(text[i]) && text[i]!='_' && text[i]!='\0' ; ++i ); + end = i; + } +return( end ); +} + +static void SFTextAreaSelectWord(SFTextArea *st,int mid, int16 *start, int16 *end) { + unichar_t *text; + unichar_t ch = st->text[mid]; + + if ( st->dobitext ) { + text = st->bidata.text; + mid = SFTextAreaGetOffsetFromOffset(st,SFTextAreaFindLine(st,mid),mid); + } else + text = st->text; + ch = text[mid]; + + if ( ch=='\0' ) + *start = *end = mid; + else if ( isspace(ch) ) { + int i; + for ( i=mid; isspace(text[i]); ++i ); + *end = i; + for ( i=mid-1; i>=0 && isspace(text[i]) ; --i ); + *start = i+1; + } else if ( isalnum(ch) || ch=='_' ) { + int i; + for ( i=mid; isalnum(text[i]) || text[i]=='_' ; ++i ); + *end = i; + for ( i=mid-1; i>=0 && (isalnum(text[i]) || text[i]=='_') ; --i ); + *start = i+1; + } else { + int i; + for ( i=mid; !isalnum(text[i]) && text[i]!='_' && text[i]!='\0' ; ++i ); + *end = i; + for ( i=mid-1; i>=0 && !isalnum(text[i]) && text[i]!='_' ; --i ); + *start = i+1; + } + + if ( st->dobitext ) { + *start = st->bidata.original[*start]-st->text; + *end = st->bidata.original[*end]-st->text; + } +} + +static void SFTextAreaSelectWords(SFTextArea *st,int last) { + int16 ss, se; + SFTextAreaSelectWord(st,st->sel_base,&st->sel_start,&st->sel_end); + if ( last!=st->sel_base ) { + SFTextAreaSelectWord(st,last,&ss,&se); + if ( sssel_start ) st->sel_start = ss; + if ( se>st->sel_end ) st->sel_end = se; + } +} + +static void SFTextAreaPaste(SFTextArea *st,enum selnames sel) { + if ( GDrawSelectionHasType(st->g.base,sel,"Unicode") || + GDrawSelectionHasType(st->g.base,sel,"text/plain;charset=ISO-10646-UCS-2")) { + unichar_t *temp; + int32 len; + if ( GDrawSelectionHasType(st->g.base,sel,"Unicode") ) + temp = GDrawRequestSelection(st->g.base,sel,"Unicode",&len); + else + temp = GDrawRequestSelection(st->g.base,sel,"text/plain;charset=ISO-10646-UCS-2",&len); + if ( temp!=NULL ) + SFTextArea_Replace(st,temp); + free(temp); + } else if ( GDrawSelectionHasType(st->g.base,sel,"UTF8_STRING") || + GDrawSelectionHasType(st->g.base,sel,"text/plain;charset=UTF-8")) { + unichar_t *temp; char *ctemp; + int32 len; + if ( GDrawSelectionHasType(st->g.base,sel,"UTF8_STRING") ) + ctemp = GDrawRequestSelection(st->g.base,sel,"UTF8_STRING",&len); + else + ctemp = GDrawRequestSelection(st->g.base,sel,"text/plain;charset=UTF-8",&len); + if ( ctemp!=NULL ) { + temp = utf82u_copyn(ctemp,strlen(ctemp)); + SFTextArea_Replace(st,temp); + free(ctemp); free(temp); + } + } else if ( GDrawSelectionHasType(st->g.base,sel,"STRING")) { + unichar_t *temp; char *ctemp; + int32 len; + ctemp = GDrawRequestSelection(st->g.base,sel,"STRING",&len); + if ( ctemp!=NULL ) { + temp = def2u_copy(ctemp); + SFTextArea_Replace(st,temp); + free(ctemp); free(temp); + } + } +} + +static int sftextarea_editcmd(GGadget *g,enum editor_commands cmd) { + SFTextArea *st = (SFTextArea *) g; + + switch ( cmd ) { + case ec_selectall: + st->sel_start = 0; + st->sel_end = u_strlen(st->text); +return( true ); + case ec_clear: + SFTextArea_Replace(st,nullstr); +return( true ); + case ec_cut: + SFTextAreaGrabSelection(st,sn_clipboard); + SFTextArea_Replace(st,nullstr); +return( true ); + case ec_copy: + SFTextAreaGrabSelection(st,sn_clipboard); +return( true ); + case ec_paste: + SFTextAreaPaste(st,sn_clipboard); + SFTextArea_Show(st,st->sel_start); +return( true ); + case ec_undo: + if ( st->oldtext!=NULL ) { + unichar_t *temp = st->text; + struct fontlist *ofl = st->fontlist; + int16 s; + st->text = st->oldtext; st->oldtext = temp; + st->fontlist = st->oldfontlist; st->oldfontlist = ofl; + s = st->sel_start; st->sel_start = st->sel_oldstart; st->sel_oldstart = s; + s = st->sel_end; st->sel_end = st->sel_oldend; st->sel_oldend = s; + s = st->sel_base; st->sel_base = st->sel_oldbase; st->sel_oldbase = s; + SFTextAreaRefigureLines(st, 0); + SFTextArea_Show(st,st->sel_end); + } +return( true ); + case ec_redo: /* Hmm. not sure */ /* we don't do anything */ +return( true ); /* but probably best to return success */ + case ec_backword: + if ( st->sel_start==st->sel_end && st->sel_start!=0 ) { + if ( st->dobitext ) { + int sel = SFTextAreaGetOffsetFromOffset(st,SFTextAreaFindLine(st,st->sel_start),st->sel_start); + sel = SFTextAreaSelBackword(st->bidata.text,sel); + st->sel_start = st->bidata.original[sel]-st->text; + } else + st->sel_start = SFTextAreaSelBackword(st->text,st->sel_start); + } + SFTextArea_Replace(st,nullstr); +return( true ); + case ec_deleteword: + if ( st->sel_start==st->sel_end && st->sel_start!=0 ) + SFTextAreaSelectWord(st,st->sel_start,&st->sel_start,&st->sel_end); + SFTextArea_Replace(st,nullstr); +return( true ); + } +return( false ); +} + +static int _sftextarea_editcmd(GGadget *g,enum editor_commands cmd) { + if ( sftextarea_editcmd(g,cmd)) { + _ggadget_redraw(g); + GTPositionGIC((SFTextArea *) g); +return( true ); + } +return( false ); +} + +static int GTBackPos(SFTextArea *st,int pos, int ismeta) { + int newpos,sel; + + if ( ismeta && !st->dobitext ) + newpos = SFTextAreaSelBackword(st->text,pos); + else if ( ismeta ) { + sel = SFTextAreaGetOffsetFromOffset(st,SFTextAreaFindLine(st,pos),pos); + newpos = SFTextAreaSelBackword(st->bidata.text,sel); + newpos = st->bidata.original[newpos]-st->text; + } else if ( !st->dobitext ) + newpos = pos-1; + else { + sel = SFTextAreaGetOffsetFromOffset(st,SFTextAreaFindLine(st,pos),pos); + if ( sel!=0 ) --sel; + newpos = st->bidata.original[sel]-st->text; + } + if ( newpos==-1 ) newpos = pos; +return( newpos ); +} + +static int GTForePos(SFTextArea *st,int pos, int ismeta) { + int newpos=pos,sel; + + if ( ismeta && !st->dobitext ) + newpos = SFTextAreaSelForeword(st->text,pos); + else if ( ismeta ) { + sel = SFTextAreaGetOffsetFromOffset(st,SFTextAreaFindLine(st,pos),pos); + newpos = SFTextAreaSelForeword(st->bidata.text,sel); + newpos = st->bidata.original[newpos]-st->text; + } else if ( !st->dobitext ) { + if ( st->text[pos]!=0 ) + newpos = pos+1; + } else { + sel = SFTextAreaGetOffsetFromOffset(st,SFTextAreaFindLine(st,pos),pos); + if ( st->text[sel]!=0 ) + ++sel; + newpos = st->bidata.original[sel]-st->text; + } +return( newpos ); +} + +static unichar_t txt[] = { '*','.','t','x','t', '\0' }; +static unichar_t errort[] = { 'C','o','u','l','d',' ','n','o','t',' ','o','p','e','n', '\0' }; +static unichar_t error[] = { 'C','o','u','l','d',' ','n','o','t',' ','o','p','e','n',' ','%','.','1','0','0','h','s', '\0' }; + +static void SFTextAreaImport(SFTextArea *st) { + unichar_t *ret = GWidgetOpenFile(GStringGetResource(_STR_Open,NULL),NULL, + txt,NULL,NULL); + char *cret; + unichar_t *str; + + if ( ret==NULL ) +return; + cret = u2def_copy(ret); + free(ret); + str = _GGadgetFileToUString(cret,65536); + if ( str==NULL ) { + GWidgetError(errort,error,cret); + free(cret); +return; + } + free(cret); + SFTextArea_Replace(st,str); + free(str); +} + +static void SFTextAreaSave(SFTextArea *st) { + unichar_t *ret = GWidgetSaveAsFile(GStringGetResource(_STR_Save,NULL),NULL, + txt,NULL,NULL); + char *cret; + FILE *file; + unichar_t *pt; + + if ( ret==NULL ) +return; + cret = u2def_copy(ret); + free(ret); + file = fopen(cret,"w"); + if ( file==NULL ) { + GWidgetError(errort,error,cret); + free(cret); +return; + } + free(cret); + + putc(0xfeff>>8,file); /* Zero width something or other. Marks this as unicode */ + putc(0xfeff&0xff,file); + for ( pt = st->text ; *pt; ++pt ) { + putc(*pt>>8,file); + putc(*pt&0xff,file); + } + fclose(file); +} + +#define MID_Cut 1 +#define MID_Copy 2 +#define MID_Paste 3 + +#define MID_SelectAll 4 + +#define MID_Save 5 +#define MID_Import 6 + +#define MID_Undo 7 + +static SFTextArea *popup_kludge; + +static void SFTFPopupInvoked(GWindow v, GMenuItem *mi,GEvent *e) { + SFTextArea *st; + if ( popup_kludge==NULL ) +return; + st = popup_kludge; + popup_kludge = NULL; + switch ( mi->mid ) { + case MID_Undo: + sftextarea_editcmd(&st->g,ec_undo); + break; + case MID_Cut: + sftextarea_editcmd(&st->g,ec_cut); + break; + case MID_Copy: + sftextarea_editcmd(&st->g,ec_copy); + break; + case MID_Paste: + sftextarea_editcmd(&st->g,ec_paste); + break; + case MID_SelectAll: + sftextarea_editcmd(&st->g,ec_selectall); + break; + case MID_Save: + SFTextAreaSave(st); + break; + case MID_Import: + SFTextAreaImport(st); + break; + } +} + +static GMenuItem sftf_popuplist[] = { + { { (unichar_t *) _STR_Undo, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'U' }, 'Z', ksm_control, NULL, NULL, SFTFPopupInvoked, MID_Undo }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Cut, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 't' }, 'X', ksm_control, NULL, NULL, SFTFPopupInvoked, MID_Cut }, + { { (unichar_t *) _STR_Copy, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'C' }, 'C', ksm_control, NULL, NULL, SFTFPopupInvoked, MID_Copy }, + { { (unichar_t *) _STR_Paste, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'P' }, 'V', ksm_control, NULL, NULL, SFTFPopupInvoked, MID_Paste }, + { { NULL, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 1, 0, 0, }}, + { { (unichar_t *) _STR_Save, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'S', ksm_control, NULL, NULL, SFTFPopupInvoked, MID_Save }, + { { (unichar_t *) _STR_Import, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'I' }, 'I', ksm_control, NULL, NULL, SFTFPopupInvoked, MID_Import }, + { NULL } +}; + +static void SFTFPopupMenu(SFTextArea *st, GEvent *event) { + int no_sel = st->sel_start==st->sel_end; + sftf_popuplist[0].ti.disabled = st->oldtext==NULL; /* Undo */ + sftf_popuplist[2].ti.disabled = no_sel; /* Cut */ + sftf_popuplist[3].ti.disabled = no_sel; /* Copy */ + sftf_popuplist[4].ti.disabled = !GDrawSelectionHasType(st->g.base,sn_clipboard,"text/plain;charset=ISO-10646-UCS-2") && + !GDrawSelectionHasType(st->g.base,sn_clipboard,"UTF8_STRING") && + !GDrawSelectionHasType(st->g.base,sn_clipboard,"STRING"); + popup_kludge = st; + GMenuCreatePopupMenu(st->g.base,event, sftf_popuplist); +} + +static int SFTextAreaDoChange(SFTextArea *st, GEvent *event) { + int ss = st->sel_start, se = st->sel_end; + int pos, l, xpos, sel; + unichar_t *upt; + + if ( ( event->u.chr.state&(ksm_control|ksm_meta)) || + event->u.chr.chars[0]<' ' || event->u.chr.chars[0]==0x7f ) { + switch ( event->u.chr.keysym ) { + case GK_BackSpace: + if ( st->sel_start==st->sel_end ) { + if ( st->sel_start==0 ) +return( 2 ); + --st->sel_start; + } + SFTextArea_Replace(st,nullstr); +return( true ); + break; + case GK_Delete: + if ( st->sel_start==st->sel_end ) { + if ( st->text[st->sel_start]==0 ) +return( 2 ); + ++st->sel_end; + } + SFTextArea_Replace(st,nullstr); +return( true ); + break; + case GK_Left: case GK_KP_Left: + if ( st->sel_start==st->sel_end ) { + st->sel_start = GTBackPos(st,st->sel_start,event->u.chr.state&ksm_meta); + if ( !(event->u.chr.state&ksm_shift )) + st->sel_end = st->sel_start; + } else if ( event->u.chr.state&ksm_shift ) { + if ( st->sel_end==st->sel_base ) { + st->sel_start = GTBackPos(st,st->sel_start,event->u.chr.state&ksm_meta); + } else { + st->sel_end = GTBackPos(st,st->sel_end,event->u.chr.state&ksm_meta); + } + } else { + st->sel_end = st->sel_base = st->sel_start; + } + SFTextArea_Show(st,st->sel_start); +return( 2 ); + break; + case GK_Right: case GK_KP_Right: + if ( st->sel_start==st->sel_end ) { + st->sel_end = GTForePos(st,st->sel_start,event->u.chr.state&ksm_meta); + if ( !(event->u.chr.state&ksm_shift )) + st->sel_start = st->sel_end; + } else if ( event->u.chr.state&ksm_shift ) { + if ( st->sel_end==st->sel_base ) { + st->sel_start = GTForePos(st,st->sel_start,event->u.chr.state&ksm_meta); + } else { + st->sel_end = GTForePos(st,st->sel_end,event->u.chr.state&ksm_meta); + } + } else { + st->sel_start = st->sel_base = st->sel_end; + } + SFTextArea_Show(st,st->sel_start); +return( 2 ); + break; + case GK_Up: case GK_KP_Up: + if ( !st->multi_line ) + break; + if ( !( event->u.chr.state&ksm_shift ) && st->sel_start!=st->sel_end ) + st->sel_end = st->sel_base = st->sel_start; + else { + pos = st->sel_start; + if ( ( event->u.chr.state&ksm_shift ) && st->sel_start==st->sel_base ) + pos = st->sel_end; + l = SFTextAreaFindLine(st,st->sel_start); + sel = SFTextAreaGetOffsetFromOffset(st,l,st->sel_start); + xpos = STGetTextWidth(st,st->lines[l],sel-st->lines[l]); + if ( l!=0 ) + pos = SFTextAreaGetPtFromPos(st,l-1,xpos) - st->text; + if ( event->u.chr.state&ksm_shift ) { + if ( possel_base ) { + st->sel_start = pos; + st->sel_end = st->sel_base; + } else { + st->sel_start = st->sel_base; + st->sel_end = pos; + } + } else { + st->sel_start = st->sel_end = st->sel_base = pos; + } + } + SFTextArea_Show(st,st->sel_start); +return( 2 ); + break; + case GK_Down: case GK_KP_Down: + if ( !st->multi_line ) + break; + if ( !( event->u.chr.state&ksm_shift ) && st->sel_start!=st->sel_end ) + st->sel_end = st->sel_base = st->sel_end; + else { + pos = st->sel_start; + if ( ( event->u.chr.state&ksm_shift ) && st->sel_start==st->sel_base ) + pos = st->sel_end; + l = SFTextAreaFindLine(st,st->sel_start); + sel = SFTextAreaGetOffsetFromOffset(st,l,st->sel_start); + xpos = STGetTextWidth(st,st->lines[l],sel-st->lines[l]); + if ( llcnt-1 ) + pos = SFTextAreaGetPtFromPos(st,l+1,xpos) - st->text; + if ( event->u.chr.state&ksm_shift ) { + if ( possel_base ) { + st->sel_start = pos; + st->sel_end = st->sel_base; + } else { + st->sel_start = st->sel_base; + st->sel_end = pos; + } + } else { + st->sel_start = st->sel_end = st->sel_base = pos; + } + } + SFTextArea_Show(st,st->sel_start); +return( 2 ); + break; + case GK_Home: case GK_Begin: case GK_KP_Home: case GK_KP_Begin: + if ( !(event->u.chr.state&ksm_shift) ) { + st->sel_start = st->sel_base = st->sel_end = 0; + } else { + st->sel_start = 0; st->sel_end = st->sel_base; + } + SFTextArea_Show(st,st->sel_start); +return( 2 ); + break; + /* Move to eol. (if already at eol, move to next eol) */ + case 'E': case 'e': + if ( !( event->u.chr.state&ksm_control ) ) +return( false ); + upt = st->text+st->sel_base; + if ( *upt=='\n' ) + ++upt; + upt = u_strchr(upt,'\n'); + if ( upt==NULL ) upt=st->text+u_strlen(st->text); + if ( !(event->u.chr.state&ksm_shift) ) { + st->sel_start = st->sel_base = st->sel_end =upt-st->text; + } else { + st->sel_start = st->sel_base; st->sel_end = upt-st->text; + } + SFTextArea_Show(st,st->sel_start); +return( 2 ); + break; + case GK_End: case GK_KP_End: + if ( !(event->u.chr.state&ksm_shift) ) { + st->sel_start = st->sel_base = st->sel_end = u_strlen(st->text); + } else { + st->sel_start = st->sel_base; st->sel_end = u_strlen(st->text); + } + SFTextArea_Show(st,st->sel_start); +return( 2 ); + break; + case 'A': case 'a': + if ( event->u.chr.state&ksm_control ) { /* Select All */ + sftextarea_editcmd(&st->g,ec_selectall); +return( 2 ); + } + break; + case 'C': case 'c': + if ( event->u.chr.state&ksm_control ) { /* Copy */ + sftextarea_editcmd(&st->g,ec_copy); + } + break; + case 'V': case 'v': + if ( event->u.chr.state&ksm_control ) { /* Paste */ + sftextarea_editcmd(&st->g,ec_paste); + SFTextArea_Show(st,st->sel_start); +return( true ); + } + break; + case 'X': case 'x': + if ( event->u.chr.state&ksm_control ) { /* Cut */ + sftextarea_editcmd(&st->g,ec_cut); + SFTextArea_Show(st,st->sel_start); +return( true ); + } + break; + case 'Z': case 'z': /* Undo */ + if ( event->u.chr.state&ksm_control ) { + sftextarea_editcmd(&st->g,ec_undo); + SFTextArea_Show(st,st->sel_start); +return( true ); + } + break; + case 'D': case 'd': + if ( event->u.chr.state&ksm_control ) { /* delete word */ + sftextarea_editcmd(&st->g,ec_deleteword); + SFTextArea_Show(st,st->sel_start); +return( true ); + } + break; + case 'W': case 'w': + if ( event->u.chr.state&ksm_control ) { /* backword */ + sftextarea_editcmd(&st->g,ec_backword); + SFTextArea_Show(st,st->sel_start); +return( true ); + } + break; + case 'M': case 'm': case 'J': case 'j': + if ( !( event->u.chr.state&ksm_control ) ) +return( false ); + /* fall through into return case */ + case GK_Return: case GK_Linefeed: + if ( st->accepts_returns ) { + SFTextArea_Replace(st,newlinestr); +return( true ); + } + break; + case GK_Tab: + if ( st->accepts_tabs ) { + SFTextArea_Replace(st,tabstr); +return( true ); + } + break; + case 's': case 'S': + if ( !( event->u.chr.state&ksm_control ) ) +return( false ); + SFTextAreaSave(st); +return( 2 ); + break; + case 'I': case 'i': + if ( !( event->u.chr.state&ksm_control ) ) +return( false ); + SFTextAreaImport(st); +return( true ); + } + } else { + SFTextArea_Replace(st,event->u.chr.chars); +return( true ); + } + + if ( st->sel_start == st->sel_end ) + st->sel_base = st->sel_start; + if ( ss!=st->sel_start || se!=st->sel_end ) + SFTextAreaGrabPrimarySelection(st); +return( false ); +} + +static void gt_cursor_pos(SFTextArea *st, int *x, int *y, int *fh) { + int l, sel, ty; + + *x = -1; *y= -1; + GDrawSetFont(st->g.base,st->font); + l = SFTextAreaFindLine(st,st->sel_start); + ty = st->lineheights[l].y - st->lineheights[st->loff_top].y; + if ( ty<0 || ty>st->g.inner.height ) +return; + *y = ty; + *fh = st->lineheights[l].fh; + sel = SFTextAreaGetOffsetFromOffset(st,l,st->sel_start); + *x = STGetTextWidth(st,st->lines[l],sel-st->lines[l])- + st->xoff_left; +} + +static void GTPositionGIC(SFTextArea *st) { + int x,y,fh; + + if ( !st->g.has_focus || st->gic==NULL ) +return; + gt_cursor_pos(st,&x,&y,&fh); + if ( x<0 ) +return; + GDrawSetGIC(st->g.base,st->gic,st->g.inner.x+x,st->g.inner.y+y+st->as); +} + +static void gt_draw_cursor(GWindow pixmap, SFTextArea *st) { + GRect old; + int x, y, fh; + + if ( !st->cursor_on || st->sel_start != st->sel_end ) +return; + gt_cursor_pos(st,&x,&y,&fh); + + if ( x<0 || x>=st->g.inner.width ) +return; + GDrawPushClip(pixmap,&st->g.inner,&old); + GDrawSetXORMode(pixmap); + GDrawSetXORBase(pixmap,st->g.box->main_background!=COLOR_DEFAULT?st->g.box->main_background: + GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(pixmap)) ); + GDrawSetFont(pixmap,st->font); + GDrawSetLineWidth(pixmap,0); + GDrawDrawLine(pixmap,st->g.inner.x+x,st->g.inner.y+y, + st->g.inner.x+x,st->g.inner.y+y+fh, + st->g.box->main_foreground!=COLOR_DEFAULT?st->g.box->main_foreground: + GDrawGetDefaultForeground(GDrawGetDisplayOfWindow(pixmap)) ); + GDrawSetCopyMode(pixmap); + GDrawPopClip(pixmap,&old); +} + +static void SFTextAreaDrawDDCursor(SFTextArea *st, int pos) { + GRect old; + int x, y, l; + + l = SFTextAreaFindLine(st,pos); + y = st->lineheights[l].y - st->lineheights[st->loff_top].y; + if ( y<0 || y>st->g.inner.height ) +return; + pos = SFTextAreaGetOffsetFromOffset(st,l,pos); + x = STGetTextWidth(st,st->lines[l],pos-st->lines[l])- + st->xoff_left; + if ( x<0 || x>=st->g.inner.width ) +return; + + GDrawPushClip(st->g.base,&st->g.inner,&old); + GDrawSetXORMode(st->g.base); + GDrawSetXORBase(st->g.base,st->g.box->main_background!=COLOR_DEFAULT?st->g.box->main_background: + GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(st->g.base)) ); + GDrawSetFont(st->g.base,st->font); + GDrawSetLineWidth(st->g.base,0); + GDrawSetDashedLine(st->g.base,2,2,0); + GDrawDrawLine(st->g.base,st->g.inner.x+x,st->g.inner.y+y, + st->g.inner.x+x,st->g.inner.y+y+st->lineheights[l].fh, + st->g.box->main_foreground!=COLOR_DEFAULT?st->g.box->main_foreground: + GDrawGetDefaultForeground(GDrawGetDisplayOfWindow(st->g.base)) ); + GDrawSetCopyMode(st->g.base); + GDrawPopClip(st->g.base,&old); + GDrawSetDashedLine(st->g.base,0,0,0); + st->has_dd_cursor = !st->has_dd_cursor; + st->dd_cursor_pos = pos; +} + + +static void SFTextAreaDrawLineSel(GWindow pixmap, SFTextArea *st, int line, Color fg, Color sel ) { + GRect selr; + int s,e, y,llen,i,j, fh; + + y = st->g.inner.y+ st->lineheights[line].y-st->lineheights[st->loff_top].y; + fh = st->lineheights[line].fh; + selr = st->g.inner; selr.y = y; selr.height = fh; + if ( !st->g.has_focus ) --selr.height; + llen = st->lines[line+1]==-1? + u_strlen(st->text+st->lines[line])+st->lines[line]: + st->lines[line+1]; + s = st->sel_startlines[line]?st->lines[line]:st->sel_start; + e = st->sel_end>st->lines[line+1] && st->lines[line+1]!=-1?st->lines[line+1]-1: + st->sel_end; + + GDrawSetLineWidth(pixmap,0); + if ( !st->dobitext ) { + if ( st->sel_start>st->lines[line] ) + selr.x += STGetTextWidth(st,st->lines[line],st->sel_start-st->lines[line])- + st->xoff_left; + if ( st->sel_end <= st->lines[line+1] || st->lines[line+1]==-1 ) + selr.width = STGetTextWidth(st,st->lines[line],st->sel_end-st->lines[line])- + st->xoff_left - (selr.x-st->g.inner.x); + if ( st->g.has_focus ) + GDrawFillRect(pixmap,&selr,st->g.box->active_border); + else + GDrawDrawRect(pixmap,&selr,st->g.box->active_border); + if ( sel!=fg ) { + STDrawText(st,pixmap,selr.x,y+st->as, s,e-s, sel ); + } + } else { + /* in bidirectional text the selection can be all over the */ + /* place, so look for contiguous regions of text within the*/ + /* selection and draw them */ + for ( i=st->lines[line]; ibidata.original[i]-st->text >= s && + st->bidata.original[i]-st->text < e ) { + for ( j=i+1 ; jbidata.original[j]-st->text >= s && + st->bidata.original[j]-st->text < e; ++j ); + selr.x = STGetTextWidth(st,st->lines[line],i-st->lines[line])+ + st->g.inner.x - st->xoff_left; + selr.width = STGetTextWidth(st,i,j-i); + if ( st->g.has_focus ) + GDrawFillRect(pixmap,&selr,st->g.box->active_border); + else + GDrawDrawRect(pixmap,&selr,st->g.box->active_border); + if ( sel!=fg ) + STDrawText(st,pixmap,selr.x,y+st->as, i,j-i, sel ); + i = j-1; + } + } + } +} + +static int sftextarea_expose(GWindow pixmap, GGadget *g, GEvent *event) { + SFTextArea *st = (SFTextArea *) g; + GRect old1, old2, *r = &g->r; + Color fg,sel; + int y,ll,i; + unichar_t *bitext = st->dobitext ?st->bidata.text:st->text; + + if ( g->state == gs_invisible || st->dontdraw ) +return( false ); + + GDrawPushClip(pixmap,r,&old1); + + GBoxDrawBackground(pixmap,r,g->box, + g->state==gs_enabled? gs_pressedactive: g->state,false); + GBoxDrawBorder(pixmap,r,g->box,g->state,false); + + GDrawPushClip(pixmap,&g->inner,&old2); + GDrawSetFont(pixmap,st->font); + GDrawSetDither(NULL, false); /* on 8 bit displays we don't want any dithering */ + GDrawSetLineWidth(pixmap,0); + + fg = g->state==gs_disabled?g->box->disabled_foreground: + g->box->main_foreground==COLOR_DEFAULT?GDrawGetDefaultForeground(GDrawGetDisplayOfWindow(pixmap)): + g->box->main_foreground; + for ( i=st->loff_top; st->lines[i]!=-1; ++i ) { + /* there is an odd complication in drawing each line. */ + /* normally we draw the selection rectangle(s) and then draw the text */ + /* on top of that all in one go. But that doesn't work if the select */ + /* color is the same as the foreground color (bw displays). In that */ + /* case we draw the text first, draw the rectangles, and draw the text*/ + /* within the rectangles */ + y = g->inner.y+ st->lineheights[i].y-st->lineheights[st->loff_top].y; + if ( y>g->inner.y+g->inner.height || y>event->u.expose.rect.y+event->u.expose.rect.height ) + break; + if ( y+st->lineheights[i].fh<=event->u.expose.rect.y ) + continue; + sel = fg; + ll = st->lines[i+1]==-1?-1:st->lines[i+1]-st->lines[i]; + if ( st->sel_start != st->sel_end && st->sel_end>st->lines[i] && + (st->lines[i+1]==-1 || st->sel_startlines[i+1])) { + if ( g->box->active_border==fg ) { + sel = g->state==gs_disabled?g->box->disabled_background: + g->box->main_background==COLOR_DEFAULT?GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(pixmap)): + g->box->main_background; + STDrawText(st,pixmap,g->inner.x-st->xoff_left,y+st->lineheights[i].as, + st->lines[i],ll, fg ); + } + SFTextAreaDrawLineSel(pixmap,st,i,fg,sel); + } + if ( sel==fg ) { + if ( i!=0 && (*(bitext+st->lines[i]+ll-1)=='\n' || *(bitext+st->lines[i]+ll-1)=='\r' )) + --ll; + STDrawText(st,pixmap,g->inner.x-st->xoff_left,y+st->lineheights[i].as, + st->lines[i],ll, fg ); + } + } + + GDrawSetDither(NULL, true); + GDrawPopClip(pixmap,&old2); + GDrawPopClip(pixmap,&old1); + gt_draw_cursor(pixmap, st); +return( true ); +} + +static int SFTextAreaDoDrop(SFTextArea *st,GEvent *event,int endpos) { + + if ( st->has_dd_cursor ) + SFTextAreaDrawDDCursor(st,st->dd_cursor_pos); + + if ( event->type == et_mousemove ) { + if ( GGadgetInnerWithin(&st->g,event->u.mouse.x,event->u.mouse.y) ) { + if ( endpossel_start || endpos>=st->sel_end ) + SFTextAreaDrawDDCursor(st,endpos); + } else if ( !GGadgetWithin(&st->g,event->u.mouse.x,event->u.mouse.y) ) { + GDrawPostDragEvent(st->g.base,event,et_drag); + } + } else { + if ( GGadgetInnerWithin(&st->g,event->u.mouse.x,event->u.mouse.y) ) { + if ( endpos>=st->sel_start && endpossel_end ) { + st->sel_start = st->sel_end = endpos; + } else { + unichar_t *old=st->oldtext, *temp; + int pos=0; + if ( event->u.mouse.state&ksm_control ) { + temp = galloc((u_strlen(st->text)+st->sel_end-st->sel_start+1)*sizeof(unichar_t)); + memcpy(temp,st->text,endpos*sizeof(unichar_t)); + memcpy(temp+endpos,st->text+st->sel_start, + (st->sel_end-st->sel_start)*sizeof(unichar_t)); + u_strcpy(temp+endpos+st->sel_end-st->sel_start,st->text+endpos); + } else if ( endpos>=st->sel_end ) { + temp = u_copy(st->text); + memcpy(temp+st->sel_start,temp+st->sel_end, + (endpos-st->sel_end)*sizeof(unichar_t)); + memcpy(temp+endpos-(st->sel_end-st->sel_start), + st->text+st->sel_start,(st->sel_end-st->sel_start)*sizeof(unichar_t)); + pos = endpos; + } else /*if ( endpossel_start )*/ { + temp = u_copy(st->text); + memcpy(temp+endpos,st->text+st->sel_start, + (st->sel_end-st->sel_start)*sizeof(unichar_t)); + memcpy(temp+endpos+st->sel_end-st->sel_start,st->text+endpos, + (st->sel_start-endpos)*sizeof(unichar_t)); + pos = endpos+st->sel_end-st->sel_start; + } + st->oldtext = st->text; + st->sel_oldstart = st->sel_start; + st->sel_oldend = st->sel_end; + st->sel_oldbase = st->sel_base; + st->sel_start = st->sel_end = st->sel_end = pos; + st->text = temp; + free(old); + SFTextAreaRefigureLines(st, endpossel_oldstart?endpos:st->sel_oldstart); + } + } else if ( !GGadgetWithin(&st->g,event->u.mouse.x,event->u.mouse.y) ) { + /* Don't delete the selection until someone actually accepts the drop */ + /* Don't delete at all (copy not move) if control key is down */ + if ( ( event->u.mouse.state&ksm_control ) ) + SFTextAreaGrabSelection(st,sn_drag_and_drop); + else + SFTextAreaGrabDDSelection(st); + GDrawPostDragEvent(st->g.base,event,et_drop); + } + st->drag_and_drop = false; + GDrawSetCursor(st->g.base,st->old_cursor); + _ggadget_redraw(&st->g); + } +return( false ); +} + +static void STChangeCheck(SFTextArea *st) { + struct fontlist *fl; + + for ( fl=st->fontlist; fl!=NULL && fl->endsel_end; fl=fl->next ); + if ( fl==NULL || fl->fd==st->last_fd || st->changefontcallback==NULL ) +return; + (st->changefontcallback)(st->cbcontext,fl->fd->sf,fl->fd->fonttype,fl->fd->pixelsize,fl->fd->antialias); + st->last_fd = fl->fd; +} + +static int sftextarea_mouse(GGadget *g, GEvent *event) { + SFTextArea *st = (SFTextArea *) g; + unichar_t *end=NULL, *end1, *end2; + int i=0,ll; + unichar_t *bitext = st->dobitext ?st->bidata.text:st->text; + + if ( st->hidden_cursor ) { + GDrawSetCursor(st->g.base,st->old_cursor); + st->hidden_cursor = false; + _GWidget_ClearGrabGadget(g); + } + if ( !g->takes_input || (g->state!=gs_enabled && g->state!=gs_active && g->state!=gs_focused )) +return( false ); + if ( event->type == et_crossing ) +return( false ); + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) && + st->vsb!=NULL ) +return( GGadgetDispatchEvent(&st->vsb->g,event)); + + if ( st->pressed==NULL && event->type == et_mousemove && g->popup_msg!=NULL && + GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y)) + GGadgetPreparePopup(g->base,g->popup_msg); + + if ( event->type == et_mousedown && event->u.mouse.button==3 && + GGadgetWithin(g,event->u.mouse.x,event->u.mouse.y)) { + SFTFPopupMenu(st,event); +return( true ); + } + + if ( event->type == et_mousedown || st->pressed ) { + for ( i=st->loff_top; ilcnt-1 && + event->u.mouse.y-g->inner.y>=st->lineheights[i+1].y-st->lineheights[st->loff_top].y; + ++i ); + if ( i<0 ) i = 0; + if ( !st->multi_line ) i = 0; + if ( i>=st->lcnt ) + end = st->text+u_strlen(st->text); + else + end = SFTextAreaGetPtFromPos(st,i,event->u.mouse.x); + } + + if ( event->type == et_mousedown ) { + if ( i>=st->lcnt ) + end1 = end2 = end; + else { + ll = st->lines[i+1]==-1?-1:st->lines[i+1]-st->lines[i]-1; + STGetTextPtBeforePos(st,bitext+st->lines[i], ll, + event->u.mouse.x-g->inner.x+st->xoff_left, &end1); + STGetTextPtAfterPos(st,bitext+st->lines[i], ll, + event->u.mouse.x-g->inner.x+st->xoff_left, &end2); + if ( st->dobitext ) { + end1 = st->bidata.original[end1-st->bidata.text]; + end2 = st->bidata.original[end2-st->bidata.text]; + } + } + st->wordsel = st->linesel = false; + if ( event->u.mouse.button==1 && event->u.mouse.clicks>=3 ) { + st->sel_start = st->lines[i]; st->sel_end = st->lines[i+1]; + if ( st->sel_end==-1 ) st->sel_end = u_strlen(st->text); + st->wordsel = false; st->linesel = true; + } else if ( event->u.mouse.button==1 && event->u.mouse.clicks==2 ) { + st->sel_start = st->sel_end = st->sel_base = end-st->text; + st->wordsel = true; + SFTextAreaSelectWords(st,st->sel_base); + } else if ( end1-st->text>=st->sel_start && end2-st->textsel_end && + st->sel_start!=st->sel_end && + event->u.mouse.button==1 ) { + st->drag_and_drop = true; + if ( !st->hidden_cursor ) + st->old_cursor = GDrawGetCursor(st->g.base); + GDrawSetCursor(st->g.base,ct_draganddrop); + } else if ( event->u.mouse.button!=3 && !(event->u.mouse.state&ksm_shift) ) { + if ( event->u.mouse.button==1 ) + SFTextAreaGrabPrimarySelection(st); + st->sel_start = st->sel_end = st->sel_base = end-st->text; + } else if ( end-st->text>st->sel_base ) { + st->sel_start = st->sel_base; + st->sel_end = end-st->text; + } else { + st->sel_start = end-st->text; + st->sel_end = st->sel_base; + } + if ( st->pressed==NULL ) + st->pressed = GDrawRequestTimer(st->g.base,200,100,NULL); + if ( st->sel_start > u_strlen( st->text )) /* Ok to have selection at end, but beyond is an error */ + fprintf( stderr, "About to crash\n" ); + _ggadget_redraw(g); + if ( st->changefontcallback ) + STChangeCheck(st); +return( true ); + } else if ( st->pressed && (event->type == et_mousemove || event->type == et_mouseup )) { + int refresh = true; + + if ( st->drag_and_drop ) { + refresh = SFTextAreaDoDrop(st,event,end-st->text); + } else if ( st->linesel ) { + int j, e; + st->sel_start = st->lines[i]; st->sel_end = st->lines[i+1]; + if ( st->sel_end==-1 ) st->sel_end = u_strlen(st->text); + for ( j=0; st->lines[i+1]!=-1 && st->sel_base>=st->lines[i+1]; ++j ); + if ( st->sel_startlines[i] ) st->sel_start = st->lines[i]; + e = st->lines[j+1]==-1 ? u_strlen(st->text): st->lines[j+1]; + if ( e>st->sel_end ) st->sel_end = e; + } else if ( st->wordsel ) + SFTextAreaSelectWords(st,end-st->text); + else if ( event->u.mouse.button!=2 ) { + int e = end-st->text; + if ( e>st->sel_base ) { + st->sel_start = st->sel_base; st->sel_end = e; + } else { + st->sel_start = e; st->sel_end = st->sel_base; + } + } + if ( event->type==et_mouseup ) { + GDrawCancelTimer(st->pressed); st->pressed = NULL; + if ( event->u.mouse.button==2 ) + SFTextAreaPaste(st,sn_primary); + if ( st->sel_start==st->sel_end ) + SFTextArea_Show(st,st->sel_start); + } + if ( st->sel_end > u_strlen( st->text )) + fprintf( stderr, "About to crash\n" ); + if ( refresh ) + _ggadget_redraw(g); + if ( event->type==et_mouseup && st->changefontcallback ) + STChangeCheck(st); +return( true ); + } +return( false ); +} + +static int sftextarea_key(GGadget *g, GEvent *event) { + SFTextArea *st = (SFTextArea *) g; + int ret; + + if ( !g->takes_input || (g->state!=gs_enabled && g->state!=gs_active && g->state!=gs_focused )) +return( false ); + + if ( event->type == et_charup ) +return( false ); + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help || + (event->u.chr.keysym == GK_Return && !st->accepts_returns ) || + ( event->u.chr.keysym == GK_Tab && !st->accepts_tabs ) || + event->u.chr.keysym == GK_BackTab || event->u.chr.keysym == GK_Escape ) +return( false ); + + if ( !st->hidden_cursor ) { /* hide the mouse pointer */ + if ( !st->drag_and_drop ) + st->old_cursor = GDrawGetCursor(st->g.base); + GDrawSetCursor(g->base,ct_invisible); + st->hidden_cursor = true; + _GWidget_SetGrabGadget(g); /* so that we get the next mouse movement to turn the cursor on */ + } + if( st->cursor_on ) { /* undraw the blinky text cursor if it is drawn */ + gt_draw_cursor(g->base, st); + st->cursor_on = false; + } + + ret = SFTextAreaDoChange(st,event); + if ( st->changefontcallback ) + STChangeCheck(st); + switch ( ret ) { + case 2: + break; + case true: + SFTextAreaChanged(st,-1); + break; + case false: +return( false ); + } + _ggadget_redraw(g); +return( true ); +} + +static int sftextarea_focus(GGadget *g, GEvent *event) { + SFTextArea *st = (SFTextArea *) g; + if ( st->cursor!=NULL ) { + GDrawCancelTimer(st->cursor); + st->cursor = NULL; + st->cursor_on = false; + } + if ( st->hidden_cursor && !event->u.focus.gained_focus ) { + GDrawSetCursor(st->g.base,st->old_cursor); + st->hidden_cursor = false; + } + st->g.has_focus = event->u.focus.gained_focus; + if ( event->u.focus.gained_focus ) { + st->cursor = GDrawRequestTimer(st->g.base,400,400,NULL); + st->cursor_on = true; + if ( event->u.focus.mnemonic_focus != mf_normal ) + SFTextAreaSelect(&st->g,0,-1); + if ( st->gic!=NULL ) + GTPositionGIC(st); + } + _ggadget_redraw(g); + SFTextAreaFocusChanged(st,event->u.focus.gained_focus); +return( true ); +} + +static int sftextarea_timer(GGadget *g, GEvent *event) { + SFTextArea *st = (SFTextArea *) g; + + if ( !g->takes_input || (g->state!=gs_enabled && g->state!=gs_active && g->state!=gs_focused )) +return(false); + if ( st->cursor == event->u.timer.timer ) { + if ( st->cursor_on ) { + gt_draw_cursor(g->base, st); + st->cursor_on = false; + } else { + st->cursor_on = true; + gt_draw_cursor(g->base, st); + } +return( true ); + } + if ( st->pressed == event->u.timer.timer ) { + GEvent e; + GDrawSetFont(g->base,st->font); + GDrawGetPointerPosition(g->base,&e); + if ( (e.u.mouse.xr.x && st->xoff_left>0 ) || + (st->multi_line && e.u.mouse.yr.y && st->loff_top>0 ) || + ( e.u.mouse.x >= g->r.x + g->r.width && + st->xmax-st->xoff_left>g->inner.width ) || + ( e.u.mouse.y >= g->r.y + g->r.height && + st->lineheights[st->lcnt-1].y-st->lineheights[st->loff_top].y >= g->inner.height )) { + int l; + int xpos; unichar_t *end; + + for ( l=st->loff_top; llcnt-1 && e.u.mouse.y-g->inner.y>st->lineheights[l+1].y-st->lineheights[st->loff_top].y; + ++l ); + if ( e.u.mouse.yr.y && st->loff_top>0 ) + l = --st->loff_top; + else if ( e.u.mouse.y >= g->r.y + g->r.height && + st->lineheights[st->lcnt-1].y-st->lineheights[st->loff_top].y > g->inner.height ) { + ++st->loff_top; + ++l; + } else if ( lloff_top ) + l = st->loff_top; + else if ( st->lineheights[l].y>=st->lineheights[st->loff_top].y + g->inner.height ) { + for ( l = st->loff_top+1; st->lineheights[l].ylineheights[st->loff_top].y+g->inner.height; ++l ); + --l; + if ( l==st->loff_top ) ++l; + } + if ( l>=st->lcnt ) l = st->lcnt-1; + + xpos = e.u.mouse.x+st->xoff_left; + if ( e.u.mouse.xr.x && st->xoff_left>0 ) { + st->xoff_left -= st->nw; + xpos = g->inner.x + st->xoff_left; + } else if ( e.u.mouse.x >= g->r.x + g->r.width && + st->xmax-st->xoff_left>g->inner.width ) { + st->xoff_left += st->nw; + xpos = g->inner.x + st->xoff_left + g->inner.width; + } + + end = SFTextAreaGetPtFromPos(st,l,xpos); + if ( end-st->text > st->sel_base ) { + st->sel_start = st->sel_base; + st->sel_end = end-st->text; + } else { + st->sel_start = end-st->text; + st->sel_end = st->sel_base; + } + _ggadget_redraw(g); + if ( st->vsb!=NULL ) + GScrollBarSetPos(&st->vsb->g,st->lineheights[st->loff_top].y); + if ( st->hsb!=NULL ) + GScrollBarSetPos(&st->hsb->g,st->xoff_left); + } +return( true ); + } +return( false ); +} + +static int sftextarea_sel(GGadget *g, GEvent *event) { + SFTextArea *st = (SFTextArea *) g; + unichar_t *end; + int i; + + if ( event->type == et_selclear ) { + if ( event->u.selclear.sel==sn_primary && st->sel_start!=st->sel_end ) { +#if 0 /* Retain the drawn selection even if X says we don't own */ + /* the selection property. Otherwise we can't change the */ + /* fontsize (ie. must select the fontsize field) */ + st->sel_start = st->sel_end = st->sel_base; + _ggadget_redraw(g); +#endif +return( true ); + } +return( false ); + } + + if ( st->has_dd_cursor ) + SFTextAreaDrawDDCursor(st,st->dd_cursor_pos); + GDrawSetFont(g->base,st->font); + for ( i=st->loff_top ; ilcnt-1 && st->lineheights[i+1].y-st->lineheights[st->loff_top].y< + event->u.drag_drop.y-g->inner.y; ++i ); + if ( !st->multi_line ) i = 0; + if ( i>=st->lcnt ) + end = st->text+u_strlen(st->text); + else + end = SFTextAreaGetPtFromPos(st,i,event->u.drag_drop.x); + if ( event->type == et_drag ) { + SFTextAreaDrawDDCursor(st,end-st->text); + } else if ( event->type == et_dragout ) { + /* this event exists simply to clear the dd cursor line. We've done */ + /* that already */ + } else if ( event->type == et_drop ) { + st->sel_start = st->sel_end = st->sel_base = end-st->text; + SFTextAreaPaste(st,sn_drag_and_drop); + SFTextArea_Show(st,st->sel_start); + _ggadget_redraw(&st->g); + } else +return( false ); + +return( true ); +} + +static void sftextarea_destroy(GGadget *g) { + SFTextArea *st = (SFTextArea *) g; + struct sfmaps *m, *n; + FontData *fd, *nfd; + + if ( st==NULL ) +return; + + if ( st->vsb!=NULL ) + (st->vsb->g.funcs->destroy)(&st->vsb->g); + if ( st->hsb!=NULL ) + (st->hsb->g.funcs->destroy)(&st->hsb->g); + GDrawCancelTimer(st->pressed); + GDrawCancelTimer(st->cursor); + free(st->lines); + free(st->oldtext); + free(st->text); + free(st->bidata.text); + free(st->bidata.level); + free(st->bidata.override); + free(st->bidata.type); + free(st->bidata.original); + fontlistfree(st->fontlist); + fontlistfree(st->oldfontlist); + for ( m=st->sfmaps; m!=NULL; m=n ) { + n = m->next; + free(m->map); + chunkfree(m,sizeof(struct sfmaps)); + } + for ( fd=st->generated ; fd!=NULL; fd = nfd ) { + nfd = fd->next; + if ( fd->depends_on ) + fd->bdf->freetype_context = NULL; + if ( fd->fonttype!=sftf_bitmap ) /* If it's a bitmap font, we didn't create it (lives in sf) so we can't destroy it */ + BDFFontFree(fd->bdf); + free(fd); + } + _ggadget_destroy(g); +} + +static void SFTextAreaSetTitle(GGadget *g,const unichar_t *tit) { + SFTextArea *st = (SFTextArea *) g; + unichar_t *old = st->oldtext; + if ( u_strcmp(tit,st->text)==0 ) /* If it doesn't change anything, then don't trash undoes or selection */ +return; + st->oldtext = st->text; + st->sel_oldstart = st->sel_start; st->sel_oldend = st->sel_end; st->sel_oldbase = st->sel_base; + st->text = u_copy(tit); /* tit might be oldtext, so must copy before freeing */ + free(old); + st->sel_start = st->sel_end = st->sel_base = u_strlen(tit); + SFTextAreaRefigureLines(st,0); + SFTextArea_Show(st,st->sel_start); + _ggadget_redraw(g); +} + +static const unichar_t *_SFTextAreaGetTitle(GGadget *g) { + SFTextArea *st = (SFTextArea *) g; +return( st->text ); +} + +static void SFTextAreaSetFont(GGadget *g,FontInstance *new) { + SFTextArea *st = (SFTextArea *) g; + st->font = new; + SFTextAreaRefigureLines(st,0); +} + +static FontInstance *SFTextAreaGetFont(GGadget *g) { + SFTextArea *st = (SFTextArea *) g; +return( st->font ); +} + +void SFTextAreaShow(GGadget *g,int pos) { + SFTextArea *st = (SFTextArea *) g; + + SFTextArea_Show(st,pos); + _ggadget_redraw(g); +} + +void SFTextAreaSelect(GGadget *g,int start, int end) { + SFTextArea *st = (SFTextArea *) g; + + SFTextAreaGrabPrimarySelection(st); + if ( end<0 ) { + end = u_strlen(st->text); + if ( start<0 ) start = end; + } + if ( start>end ) { int temp = start; start = end; end = temp; } + if ( end>u_strlen(st->text)) end = u_strlen(st->text); + if ( start>u_strlen(st->text)) start = end; + else if ( start<0 ) start=0; + st->sel_start = st->sel_base = start; + st->sel_end = end; + _ggadget_redraw(g); /* Should be safe just to draw the textfield gadget, sbs won't have changed */ +} + +void SFTextAreaReplace(GGadget *g,const unichar_t *txt) { + SFTextArea *st = (SFTextArea *) g; + + SFTextArea_Replace(st,txt); + _ggadget_redraw(g); +} + +static void sftextarea_redraw(GGadget *g) { + SFTextArea *st = (SFTextArea *) g; + if ( st->vsb!=NULL ) + _ggadget_redraw((GGadget *) (st->vsb)); + if ( st->hsb!=NULL ) + _ggadget_redraw((GGadget *) (st->hsb)); + _ggadget_redraw(g); +} + +static void sftextarea_move(GGadget *g, int32 x, int32 y ) { + SFTextArea *st = (SFTextArea *) g; + if ( st->vsb!=NULL ) + _ggadget_move((GGadget *) (st->vsb),x+(st->vsb->g.r.x-g->r.x),y); + if ( st->hsb!=NULL ) + _ggadget_move((GGadget *) (st->hsb),x,y+(st->hsb->g.r.y-g->r.y)); + _ggadget_move(g,x,y); +} + +static void sftextarea_resize(GGadget *g, int32 width, int32 height ) { + SFTextArea *st = (SFTextArea *) g; + int gtwidth=width, gtheight=height, oldheight=0; + int l; + + if ( st->hsb!=NULL ) { + oldheight = st->hsb->g.r.y+st->hsb->g.r.height-g->r.y; + gtheight = height - (oldheight-g->r.height); + } + if ( st->vsb!=NULL ) { + int oldwidth = st->vsb->g.r.x+st->vsb->g.r.width-g->r.x; + gtwidth = width - (oldwidth-g->r.width); + _ggadget_move((GGadget *) (st->vsb),st->vsb->g.r.x+width-oldwidth,st->vsb->g.r.y); + _ggadget_resize((GGadget *) (st->vsb),st->vsb->g.r.width,gtheight); + } + if ( st->hsb!=NULL ) { + _ggadget_move((GGadget *) (st->hsb),st->hsb->g.r.y,st->hsb->g.r.y+height-oldheight); + _ggadget_resize((GGadget *) (st->hsb),gtwidth,st->hsb->g.r.height); + } + _ggadget_resize(g,gtwidth, gtheight); + SFTextAreaRefigureLines(st,0); + if ( st->vsb!=NULL ) { + GScrollBarSetBounds(&st->vsb->g,0,st->lineheights[st->lcnt-1].y,st->g.inner.height); + if ( st->loff_top>=st->lcnt ) + st->loff_top = st->lcnt-1; + for ( l = st->loff_top; l>=0 && st->lineheights[st->lcnt-1].y-st->lineheights[l].y<=st->g.inner.height; --l ); + ++l; + if ( l<0 ) l = 0; + if ( l!=st->loff_top ) { + st->loff_top = l; + GScrollBarSetPos(&st->vsb->g,st->lineheights[l].y); + _ggadget_redraw(&st->g); + } + } +} + +static GRect *sftextarea_getsize(GGadget *g, GRect *r ) { + SFTextArea *st = (SFTextArea *) g; + _ggadget_getsize(g,r); + if ( st->vsb!=NULL ) + r->width = st->vsb->g.r.x+st->vsb->g.r.width-g->r.x; + if ( st->hsb!=NULL ) + r->height = st->hsb->g.r.y+st->hsb->g.r.height-g->r.y; +return( r ); +} + +static void sftextarea_setvisible(GGadget *g, int visible ) { + SFTextArea *st = (SFTextArea *) g; + if ( st->vsb!=NULL ) _ggadget_setvisible(&st->vsb->g,visible); + if ( st->hsb!=NULL ) _ggadget_setvisible(&st->hsb->g,visible); + _ggadget_setvisible(g,visible); +} + +static void sftextarea_setenabled(GGadget *g, int enabled ) { + SFTextArea *st = (SFTextArea *) g; + if ( st->vsb!=NULL ) _ggadget_setenabled(&st->vsb->g,enabled); + if ( st->hsb!=NULL ) _ggadget_setenabled(&st->hsb->g,enabled); + _ggadget_setenabled(g,enabled); +} + +static int sftextarea_vscroll(GGadget *g, GEvent *event) { + enum sb sbt = event->u.control.u.sb.type; + SFTextArea *st = (SFTextArea *) (g->data); + int loff = st->loff_top; + int page; + + g = (GGadget *) st; + + if ( sbt==et_sb_top ) + loff = 0; + else if ( sbt==et_sb_bottom ) { + loff = st->lcnt; + } else if ( sbt==et_sb_up ) { + if ( st->loff_top!=0 ) loff = st->loff_top-1; else loff = 0; + } else if ( sbt==et_sb_down ) { + ++loff; + } else if ( sbt==et_sb_uppage ) { + for ( page=0; st->loff_top-page>=0 && st->lineheights[st->loff_top].y-st->lineheights[st->loff_top-page].y<=g->inner.height; + ++page ); + if ( page==0 ) page=1; + else if ( page>2 ) page-=1; + loff = st->loff_top - page; + } else if ( sbt==et_sb_downpage ) { + for ( page=0; st->loff_top+pagelcnt && st->lineheights[st->loff_top+page].y-st->lineheights[st->loff_top].y<=g->inner.height; + ++page ); + if ( page==0 ) page=1; + else if ( page>2 ) page-=1; + loff = st->loff_top + page; + } else /* if ( sbt==et_sb_thumb || sbt==et_sb_thumbrelease ) */ { + for ( loff = 0; lofflcnt && st->lineheights[loff].yu.control.u.sb.pos; ++loff ); + } + for ( page=1; st->lcnt-page>=0 && st->lineheights[st->lcnt-1].y-st->lineheights[st->lcnt-page].y<=g->inner.height; + ++page ); + --page; + if ( loff > st->lcnt-page ) + loff = st->lcnt - page; + if ( loff<0 ) loff = 0; + if ( loff!=st->loff_top ) { + st->loff_top = loff; + GScrollBarSetPos(&st->vsb->g,st->lineheights[loff].y); + _ggadget_redraw(&st->g); + } +return( true ); +} + +static int sftextarea_hscroll(GGadget *g, GEvent *event) { + enum sb sbt = event->u.control.u.sb.type; + SFTextArea *st = (SFTextArea *) (g->data); + int xoff = st->xoff_left; + + g = (GGadget *) st; + + if ( sbt==et_sb_top ) + xoff = 0; + else if ( sbt==et_sb_bottom ) { + xoff = st->xmax - st->g.inner.width; + if ( xoff<0 ) xoff = 0; + } else if ( sbt==et_sb_up ) { + if ( st->xoff_left>st->nw ) xoff = st->xoff_left-st->nw; else xoff = 0; + } else if ( sbt==et_sb_down ) { + if ( st->xoff_left + st->nw + st->g.inner.width >= st->xmax ) + xoff = st->xmax - st->g.inner.width; + else + xoff += st->nw; + } else if ( sbt==et_sb_uppage ) { + int page = (3*g->inner.width)/4; + xoff = st->xoff_left - page; + if ( xoff<0 ) xoff=0; + } else if ( sbt==et_sb_downpage ) { + int page = (3*g->inner.width)/4; + xoff = st->xoff_left + page; + if ( xoff + st->g.inner.width >= st->xmax ) + xoff = st->xmax - st->g.inner.width; + } else /* if ( sbt==et_sb_thumb || sbt==et_sb_thumbrelease ) */ { + xoff = event->u.control.u.sb.pos; + } + if ( xoff + st->g.inner.width >= st->xmax ) + xoff = st->xmax - st->g.inner.width; + if ( xoff<0 ) xoff = 0; + if ( st->xoff_left!=xoff ) { + st->xoff_left = xoff; + GScrollBarSetPos(&st->hsb->g,xoff); + _ggadget_redraw(&st->g); + } +return( true ); +} + +struct gfuncs sftextarea_funcs = { + 0, + sizeof(struct gfuncs), + + sftextarea_expose, + sftextarea_mouse, + sftextarea_key, + _sftextarea_editcmd, + sftextarea_focus, + sftextarea_timer, + sftextarea_sel, + + sftextarea_redraw, + sftextarea_move, + sftextarea_resize, + sftextarea_setvisible, + sftextarea_setenabled, + sftextarea_getsize, + _ggadget_getinnersize, + + sftextarea_destroy, + + SFTextAreaSetTitle, + _SFTextAreaGetTitle, + NULL, + NULL, + NULL, + SFTextAreaSetFont, + SFTextAreaGetFont +}; + +static void SFTextAreaInit() { + static unichar_t courier[] = { 'c', 'o', 'u', 'r', 'i', 'e', 'r', ',', 'm','o','n','o','s','p','a','c','e',',','c','l','e','a','r','l','y','u',',', 'u','n','i','f','o','n','t', '\0' }; + FontRequest rq; + + GGadgetInit(); + GDrawDecomposeFont(_ggadget_default_font,&rq); + rq.family_name = courier; + sftextarea_font = GDrawInstanciateFont(screen_display,&rq); + _GGadgetCopyDefaultBox(&sftextarea_box); + sftextarea_box.padding = 3; + sftextarea_box.flags = box_active_border_inner; + sftextarea_font = _GGadgetInitDefaultBox("SFTextArea.",&sftextarea_box,sftextarea_font); + sftextarea_inited = true; +} + +static void SFTextAreaAddVSb(SFTextArea *st) { + GGadgetData gd; + + memset(&gd,'\0',sizeof(gd)); + gd.pos.y = st->g.r.y; gd.pos.height = st->g.r.height; + gd.pos.width = GDrawPointsToPixels(st->g.base,_GScrollBar_Width); + gd.pos.x = st->g.r.x+st->g.r.width - gd.pos.width; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + gd.handle_controlevent = sftextarea_vscroll; + st->vsb = (GScrollBar *) GScrollBarCreate(st->g.base,&gd,st); + st->vsb->g.contained = true; + + gd.pos.width += GDrawPointsToPixels(st->g.base,1); + st->g.r.width -= gd.pos.width; + st->g.inner.width -= gd.pos.width; +} + +static void SFTextAreaAddHSb(SFTextArea *st) { + GGadgetData gd; + + memset(&gd,'\0',sizeof(gd)); + gd.pos.x = st->g.r.x; gd.pos.width = st->g.r.width; + gd.pos.height = GDrawPointsToPixels(st->g.base,_GScrollBar_Width); + gd.pos.y = st->g.r.y+st->g.r.height - gd.pos.height; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gd.handle_controlevent = sftextarea_hscroll; + st->hsb = (GScrollBar *) GScrollBarCreate(st->g.base,&gd,st); + st->hsb->g.contained = true; + + gd.pos.height += GDrawPointsToPixels(st->g.base,1); + st->g.r.height -= gd.pos.height; + st->g.inner.height -= gd.pos.height; + if ( st->vsb!=NULL ) { + st->vsb->g.r.height -= gd.pos.height; + st->vsb->g.inner.height -= gd.pos.height; + } +} + +static void SFTextAreaFit(SFTextArea *st) { + GTextBounds bounds; + int as=0, ds, ld, fh=0, width=0, temp; + GRect needed; + int extra=0; + + needed.x = needed.y = 0; + needed.width = needed.height = 1; + + { + FontInstance *old = GDrawSetFont(st->g.base,st->font); + width = GDrawGetTextBounds(st->g.base,st->text, -1, NULL, &bounds); + GDrawFontMetrics(st->font,&as, &ds, &ld); + if ( asfh = fh = as+ds; + st->as = as; + st->nw = 6; + GDrawSetFont(st->g.base,old); + } + + temp = GGadgetScale(GDrawPointsToPixels(st->g.base,80))+extra; + + if ( st->g.r.width==0 || st->g.r.height==0 ) { + int bp = GBoxBorderWidth(st->g.base,st->g.box); + needed.x = needed.y = 0; + needed.width = temp; + needed.height = st->multi_line? 4*fh:fh; + _ggadgetFigureSize(st->g.base,st->g.box,&needed,false); + if ( st->g.r.width==0 ) { + st->g.r.width = needed.width; + st->g.inner.width = temp-extra; + st->g.inner.x = st->g.r.x + (needed.width-temp)/2; + } else { + st->g.inner.x = st->g.r.x + bp; + st->g.inner.width = st->g.r.width - 2*bp; + } + if ( st->g.r.height==0 ) { + st->g.r.height = needed.height; + st->g.inner.height = st->multi_line? 4*fh:fh; + st->g.inner.y = st->g.r.y + (needed.height-st->g.inner.height)/2; + } else { + st->g.inner.y = st->g.r.y + bp; + st->g.inner.height = st->g.r.height - 2*bp; + } + if ( st->multi_line ) { + int sbadd = GDrawPointsToPixels(st->g.base,_GScrollBar_Width) + + GDrawPointsToPixels(st->g.base,1); + { + st->g.r.width += sbadd; + st->g.inner.width += sbadd; + } + if ( !st->wrap ) { + st->g.r.height += sbadd; + st->g.inner.height += sbadd; + } + } + } else { + int bp = GBoxBorderWidth(st->g.base,st->g.box); + st->g.inner = st->g.r; + st->g.inner.x += bp; st->g.inner.y += bp; + st->g.inner.width -= 2*bp-extra; st->g.inner.height -= 2*bp; + } + if ( st->multi_line ) { + SFTextAreaAddVSb(st); + if ( !st->wrap ) + SFTextAreaAddHSb(st); + } +} + +static SFTextArea *_SFTextAreaCreate(SFTextArea *st, struct gwindow *base, GGadgetData *gd,void *data, GBox *def) { + + if ( !sftextarea_inited ) + SFTextAreaInit(); + st->g.funcs = &sftextarea_funcs; + _GGadget_Create(&st->g,base,gd,data,def); + + st->g.takes_input = true; st->g.takes_keyboard = true; st->g.focusable = true; + if ( gd->label!=NULL ) { + if ( gd->label->text_in_resource ) + st->text = u_copy((unichar_t *) GStringGetResource((int) gd->label->text,&st->g.mnemonic)); + else if ( gd->label->text_is_1byte ) + st->text = /* def2u_*/ uc_copy((char *) gd->label->text); + else + st->text = u_copy(gd->label->text); + st->sel_start = st->sel_end = st->sel_base = u_strlen(st->text); + } + if ( st->text==NULL ) + st->text = gcalloc(1,sizeof(unichar_t)); + st->font = sftextarea_font; + if ( gd->label!=NULL && gd->label->font!=NULL ) + st->font = gd->label->font; + SFTextAreaFit(st); + _GGadget_FinalPosition(&st->g,base,gd); + SFTextAreaRefigureLines(st,0); + + if ( gd->flags & gg_group_end ) + _GGadgetCloseGroup(&st->g); + GWidgetIndicateFocusGadget(&st->g); + if ( gd->flags & gg_text_xim ) + st->gic = GDrawCreateInputContext(base,gic_overspot|gic_orlesser); +return( st ); +} + +GGadget *SFTextAreaCreate(struct gwindow *base, GGadgetData *gd,void *data) { + SFTextArea *st = gcalloc(1,sizeof(SFTextArea)); + st->multi_line = true; + st->accepts_returns = true; + st->wrap = true; + _SFTextAreaCreate(st,base,gd,data,&sftextarea_box); + +return( &st->g ); +} + +static struct sfmaps *SFMapOfSF(SFTextArea *st,SplineFont *sf) { + int i, umax; + struct sfmaps *sfmaps; + + if ( sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4 ) +return( NULL ); + + for ( sfmaps=st->sfmaps; sfmaps!=NULL; sfmaps=sfmaps->next ) + if ( sfmaps->sf==sf ) +return( sfmaps ); + + sfmaps = chunkalloc(sizeof(struct sfmaps)); + sfmaps->sf = sf; + sfmaps->next = st->sfmaps; + st->sfmaps = sfmaps; + umax = -1; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]->unicodeenc>umax ) + umax = sf->chars[i]->unicodeenc; + sfmaps->umax = umax; + if ( umax>=0 ) { + sfmaps->map = galloc((umax+1)*sizeof(int)); + memset(sfmaps->map,-1,(umax+1)*sizeof(int)); + } + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]->unicodeenc!=-1 ) + sfmaps->map[sf->chars[i]->unicodeenc] = i; +return( sfmaps ); +} + +static FontData *FindFontData(SFTextArea *st, SplineFont *sf, + enum sftf_fonttype fonttype, int size, int antialias) { + FontData *test, *ret; + BDFFont *bdf, *ok; + void *ftc; + + for ( test=st->generated; test!=NULL; test=test->next ) + if ( test->sf == sf && test->fonttype == fonttype && + test->pixelsize==size && test->antialias==antialias ) +return( test ); + + ret = gcalloc(1,sizeof(FontData)); + ret->sf = sf; + ret->fonttype = fonttype; + ret->pixelsize = size; + ret->antialias = antialias; + if ( fonttype==sftf_bitmap ) { + ok = NULL; + for ( bdf= sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + if ( bdf->pixelsize==size ) { + if (( !antialias && bdf->clut==NULL ) || + (antialias && bdf->clut!=NULL && bdf->clut->clut_len==256) ) { + ok = bdf; + break; + } + if ( antialias && bdf->clut!=NULL && + (ok==NULL || bdf->clut->clut_len>ok->clut->clut_len)) + ok = bdf; + } + } + if ( ok==NULL ) { + free(ret); +return( NULL ); + } + ret->bdf = ok; + } else if ( fonttype==sftf_pfaedit ) { + ret->bdf = SplineFontPieceMeal(sf,size,antialias,NULL); + } else if ( !hasFreeType() ) +return( NULL ); + else { + for ( test=st->generated; test!=NULL; test=test->next ) + if ( test->sf == sf && test->fonttype == fonttype ) + break; + ret->depends_on = test; + ftc = NULL; + if ( test ) + ftc = test->bdf->freetype_context; + if ( ftc==NULL ) { + int flags = fonttype==sftf_httf ? 0 : ttf_flag_nohints; + int ff = fonttype==sftf_pfb ? ff_pfb : + fonttype==sftf_ttf || fonttype==sftf_httf ? ff_ttf : + ff_otf; + ftc = _FreeTypeFontContext(sf,NULL,NULL,ff,flags,NULL); + } + if ( ftc==NULL ) { + free(ret); +return( NULL ); + } + ret->bdf = SplineFontPieceMeal(sf,size,antialias,ftc); + } + ret->sfmap = SFMapOfSF(st,sf); + if ( ret->bdf->clut ) { + ret->gi.u.image = &ret->base; + ret->base.image_type = it_index; + ret->base.clut = ret->bdf->clut; + ret->base.trans = 0; + } else { + memset(&ret->clut,'\0',sizeof(ret->clut)); + ret->gi.u.image = &ret->base; + ret->base.image_type = it_mono; + ret->base.clut = &ret->clut; + ret->clut.clut_len = 2; + ret->clut.clut[0] = GDrawGetDefaultBackground(NULL); + ret->base.trans = 0; + } + ret->next = st->generated; + st->generated = ret; +return( ret ); +} + +int SFTFSetFont(GGadget *g, int start, int end, SplineFont *sf, + enum sftf_fonttype fonttype, int size, int antialias) { + /* Sets the font for the region between start and end. If start==-1 it */ + /* means use the current selection (and ignore end). If end==-1 it means */ + /* strlen(g->text) */ + /* I'm not going to mess with making this undoable. Nor am I going to clear*/ + /* out the undoes. So if someone does an undo after this it will undo */ + /* two things. Tough. */ + SFTextArea *st = (SFTextArea *) g; + FontData *cur; + int len = u_strlen(st->text); + struct fontlist *new, *fl, *prev, *next; + + if ( st->generated==NULL ) { + start = 0; + end = len; + } else if ( start==-1 ) { + start = st->sel_start; + end = st->sel_end; + } else if ( end==-1 ) + end = len; + if ( end>len ) end = len; + if ( start<0 ) start = 0; + if ( start>end ) start = end; + + cur = FindFontData(st, sf, fonttype, size, antialias); + if ( cur==NULL ) +return( false ); + + new = chunkalloc(sizeof(struct fontlist)); + new->start = start; + new->end = end; + new->fd = cur; + + prev = next = NULL; + for ( fl=st->fontlist; fl!=NULL; fl=next ) { + next = fl->next; + if ( new->end>=fl->start && new->endend ) { + if ( new->end==fl->start ) + break; + next = chunkalloc(sizeof(struct fontlist)); + *next = *fl; + next->start = new->end; + fl->end = new->end; + } + if ( fl->start>=new->start && fl->end<=new->end ) { + chunkfree(fl,sizeof(struct fontlist)); + if ( prev==NULL ) + st->fontlist = next; + else + prev->next = next; + } else if ( new->start>fl->start && new->startend ) { + fl->end = new->start; + prev = fl; + } else if ( fl->end<=new->start ) { + prev = fl; + } else if ( fl->start>=new->end ) + break; + } + new->next = fl; + if ( prev==NULL ) + st->fontlist = new; + else + prev->next = new; + fontlistmergecheck(st); + SFTextAreaRefigureLines(st, start); + GDrawRequestExpose(g->base,&g->inner,false); + if ( st->changefontcallback != NULL ) + STChangeCheck(st); +return( true ); +} + +void SFTFRegisterCallback(GGadget *g, void *cbcontext, + void (*changefontcallback)(void *,SplineFont *,enum sftf_fonttype,int size,int aa)) { + SFTextArea *st = (SFTextArea *) g; + + st->cbcontext = cbcontext; + st->changefontcallback = changefontcallback; +} diff --git a/fontforge/showatt.c b/fontforge/showatt.c new file mode 100644 index 00000000..8e5b96b9 --- /dev/null +++ b/fontforge/showatt.c @@ -0,0 +1,2584 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +#include "ttf.h" + +extern int _GScrollBar_Width; + +/* This file contains routines to build a dialog showing GPOS/GSUB/morx */ +/* tables and their contents */ + +struct att_dlg; +struct node { + unsigned int open: 1; + unsigned int children_checked: 1; + unsigned int used: 1; + unsigned int macfeat: 1; + unsigned int monospace: 1; + uint16 cnt; + struct node *children, *parent; + void (*build)(struct node *,struct att_dlg *); + unichar_t *label; + uint32 tag; + union sak { + SplineChar *sc; + AnchorClass *ac; + KernClass *kc; + FPST *fpst; + ASM *sm; + int index; + } u; + int lpos; +}; + +struct att_dlg { + unsigned int done: 1; + struct node *tables; + int open_cnt, lines_page, off_top, off_left, page_width, bmargin; + int maxl; + SplineFont *sf; + GWindow gw,v; + GGadget *vsb, *hsb, *cancel; + int fh, as; + GFont *font, *monofont; + struct node *current; +}; + +static void BuildFPST(struct node *node,struct att_dlg *att); +static void BuildAnchorLists_(struct node *node,struct att_dlg *att); + +static void nodesfree(struct node *node) { + int i; + + if ( node==NULL ) +return; + for ( i=0; node[i].label!=NULL; ++i ) { + nodesfree(node[i].children); + free(node[i].label); + } + free(node); +} + +static int compare_tag(const void *_n1, const void *_n2) { + const struct node *n1 = _n1, *n2 = _n2; +return( n1->tag-n2->tag ); +} + +static void BuildMarkedLigatures(struct node *node,struct att_dlg *att) { + SplineChar *sc = node->u.sc; + AnchorClass *ac = node->parent->parent->u.ac, *ac2; + int classcnt, i, j, max, k; + AnchorPoint *ap; + unichar_t ubuf[60]; + + for ( ac2=ac, classcnt=0; ac2!=NULL && + ac2->feature_tag==ac->feature_tag && + ac2->script_lang_index == ac->script_lang_index && + ac2->merge_with == ac->merge_with ; ac2 = ac2->next ) + ++classcnt; + max=0; + for ( ap=sc->anchor; ap!=NULL ; ap=ap->next ) + if ( ap->lig_index>max ) + max = ap->lig_index; + node->children = gcalloc((classcnt*(max+1))+1,sizeof(struct node)); + for ( k=j=0; k<=max; ++k ) { + for ( i=0, ac2=ac; inext ) { + for ( ap=sc->anchor; ap!=NULL && (ap->type!=at_baselig || ap->anchor!=ac2 || ap->lig_index!=k); ap=ap->next ); + if ( ap!=NULL ) { + u_sprintf(ubuf,GStringGetResource(_STR_MarkLigComponentNamePos,NULL), + k, ac2->name, (int) ap->me.x, (int) ap->me.y ); + node->children[j].label = u_copy(ubuf); + node->children[j++].parent = node; + } + } + } + node->cnt = j; +} + +static void BuildMarkedChars(struct node *node,struct att_dlg *att) { + SplineChar *sc = node->u.sc; + AnchorClass *ac = node->parent->parent->u.ac, *ac2; + int classcnt, i, j; + AnchorPoint *ap; + unichar_t ubuf[60]; + + for ( ac2=ac, classcnt=0; ac2!=NULL && + ac2->feature_tag==ac->feature_tag && + ac2->script_lang_index == ac->script_lang_index && + ac2->merge_with == ac->merge_with ; ac2 = ac2->next ) + ++classcnt; + node->children = gcalloc(classcnt+1,sizeof(struct node)); + for ( i=j=0, ac2=ac; inext ) { + for ( ap=sc->anchor; ap!=NULL && (!(ap->type==at_basechar || ap->type==at_basemark) || ap->anchor!=ac2); ap=ap->next ); + if ( ap!=NULL ) { + u_sprintf(ubuf,GStringGetResource(_STR_MarkAnchorNamePos,NULL), ac2->name, + (int) ap->me.x, (int) ap->me.y ); + node->children[j].label = u_copy(ubuf); + node->children[j++].parent = node; + } + } + node->cnt = j; +} + +static void BuildBase(struct node *node,SplineChar **bases,enum anchor_type at, struct node *parent) { + int i; + + node->parent = parent; + node->label = u_copy(GStringGetResource(at==at_basechar?_STR_BaseCharacters: + at==at_baselig?_STR_BaseLigatures: + _STR_BaseMarks,NULL)); + for ( i=0; bases[i]!=NULL; ++i ); + if ( i==0 ) { + node->cnt = 1; + node->children = gcalloc(2,sizeof(struct node)); + node->children[0].label = u_copy(GStringGetResource(_STR_Empty,NULL)); + node->children[0].parent = node; + } else { + node->cnt = i; + node->children = gcalloc(i+1,sizeof(struct node)); + for ( i=0; bases[i]!=NULL; ++i ) { + node->children[i].label = uc_copy(bases[i]->name); + node->children[i].parent = node; + node->children[i].u.sc = bases[i]; + node->children[i].build = at==at_baselig?BuildMarkedLigatures:BuildMarkedChars; + } + } +} + +static void BuildMark(struct node *node,SplineChar **marks,AnchorClass *ac, struct node *parent) { + int i; + unichar_t ubuf[60]; + AnchorPoint *ap; + + node->parent = parent; + u_sprintf(ubuf,GStringGetResource(_STR_MarkClassS,NULL),ac->name); + node->label = u_copy(ubuf); + for ( i=0; marks[i]!=NULL; ++i ); + if ( i==0 ) { + node->cnt = 1; + node->children = gcalloc(2,sizeof(struct node)); + node->children[0].label = u_copy(GStringGetResource(_STR_Empty,NULL)); + node->children[0].parent = node; + } else { + node->cnt = i; + node->children = gcalloc(i+1,sizeof(struct node)); + for ( i=0; marks[i]!=NULL; ++i ) { + for ( ap=marks[i]->anchor; ap!=NULL && (ap->type!=at_mark || ap->anchor!=ac); ap=ap->next ); + u_sprintf(ubuf,GStringGetResource(_STR_MarkCharNamePos,NULL), marks[i]->name, + (int) ap->me.x, (int) ap->me.y ); + node->children[i].label = u_copy(ubuf); + node->children[i].parent = node; + } + } +} + +static void BuildAnchorLists(struct node *node,struct att_dlg *att,uint32 script) { + AnchorClass *ac = node->u.ac, *ac2; + int cnt, i, j, classcnt; + AnchorPoint *ap, *ent, *ext; + SplineChar **base, **lig, **mkmk, **entryexit; + SplineChar ***marks; + int *subcnts; + SplineFont *sf = att->sf; + unichar_t ubuf[60]; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + + if ( ac->type==act_curs ) { + entryexit = EntryExitDecompose(sf,ac); + if ( entryexit==NULL ) { + node->children = gcalloc(2,sizeof(struct node)); + node->cnt = 1; + node->children[0].label = u_copy(GStringGetResource(_STR_Empty,NULL)); + node->children[0].parent = node; + } else { + for ( cnt=0; entryexit[cnt]!=NULL; ++cnt ); + node->children = gcalloc(cnt+1,sizeof(struct node)); + for ( cnt=0; entryexit[cnt]!=NULL; ++cnt ) { + node->children[cnt].u.sc = entryexit[cnt]; + node->children[cnt].label = uc_copy(entryexit[cnt]->name); + node->children[cnt].parent = node; + for ( ent=ext=NULL, ap=entryexit[cnt]->anchor; ap!=NULL; ap=ap->next ) { + if ( ap->anchor==ac ) { + if ( ap->type == at_centry ) + ent = ap; + else if ( ap->type == at_cexit ) + ent = ap; + } + } + node->children[cnt].cnt = 1+(ent!=NULL)+(ext!=NULL); + node->children[cnt].children = gcalloc((1+(ent!=NULL)+(ext!=NULL)),sizeof(struct node)); + i = 0; + if ( ent!=NULL ) { + u_snprintf(ubuf,sizeof(ubuf)/sizeof(ubuf[0]), + GStringGetResource(_STR_Entry,NULL), + ent->me.x, ent->me.y); + node->children[cnt].children[i].label = u_copy(ubuf); + node->children[cnt].children[i].parent = &node->children[cnt]; + ++i; + } + if ( ext!=NULL ) { + u_snprintf(ubuf,sizeof(ubuf)/sizeof(ubuf[0]), + GStringGetResource(_STR_Exit,NULL), + ext->me.x, ext->me.y); + node->children[cnt].children[i].label = u_copy(ubuf); + node->children[cnt].children[i].parent = &node->children[cnt]; + ++i; + } + } + } + free(entryexit); + } else { + for ( ac2=ac, classcnt=0; ac2!=NULL ; ac2=ac2->next ) { + if ( ac2->feature_tag==ac->feature_tag && + ac2->script_lang_index == ac->script_lang_index && + ac2->merge_with == ac->merge_with ) { + ++classcnt; + ac2->matches = true; + } else + ac2->matches = false; + } + + marks = galloc(classcnt*sizeof(SplineChar **)); + subcnts = galloc(classcnt*sizeof(int)); + AnchorClassDecompose(sf,ac,classcnt,subcnts,marks,&base,&lig,&mkmk); + node->cnt = classcnt+(base!=NULL)+(lig!=NULL)+(mkmk!=NULL); + node->children = gcalloc(node->cnt+1,sizeof(struct node)); + i=0; + if ( base!=NULL ) + BuildBase(&node->children[i++],base,at_basechar,node); + if ( lig!=NULL ) + BuildBase(&node->children[i++],lig,at_baselig,node); + if ( mkmk!=NULL ) + BuildBase(&node->children[i++],mkmk,at_basemark,node); + for ( j=0, ac2=ac; jnext ) if ( marks[j]!=NULL ) + BuildMark(&node->children[i++],marks[j],ac2,node); + node->cnt = i; + for ( i=0; iparent->u.kc; + struct node *seconds; + int index=node->u.index,i,cnt, len; + char buf[32]; + unichar_t *name; + + for ( i=1,cnt=0; isecond_cnt; ++i ) + if ( kc->offsets[index*kc->second_cnt+i]!=0 && strlen(kc->seconds[i])!=0 ) + ++cnt; + + node->children = seconds = gcalloc(cnt+1,sizeof(struct node)); + node->cnt = cnt; + cnt = 0; + for ( i=1; isecond_cnt; ++i ) if ( kc->offsets[index*kc->second_cnt+i]!=0 && strlen(kc->seconds[i])!=0 ) { + sprintf( buf, "%d ", kc->offsets[index*kc->second_cnt+i]); + len = strlen(buf)+strlen(kc->seconds[i])+1; + name = galloc(len*sizeof(unichar_t)); + uc_strcpy(name,buf); + uc_strcat(name,kc->seconds[i]); + seconds[cnt].label = name; + seconds[cnt].parent = node; + seconds[cnt].build = NULL; + seconds[cnt++].u.index = i; + } +} + +static void BuildKC(struct node *node,struct att_dlg *att) { + KernClass *kc = node->u.kc; + struct node *firsts; + int i,j,cnt,cnt2; + + for ( i=1,cnt=0; ifirst_cnt; ++i ) { + for ( j=1,cnt2=0 ; jsecond_cnt; ++j ) { + if ( kc->offsets[i*kc->second_cnt+j]!=0 ) + ++cnt2; + } + if ( cnt2 && strlen(kc->firsts[i])>0 ) + ++cnt; + } + + node->children = firsts = gcalloc(cnt+1,sizeof(struct node)); + node->cnt = cnt; + for ( i=1,cnt=0; ifirst_cnt; ++i ) { + for ( j=1,cnt2=0 ; jsecond_cnt; ++j ) { + if ( kc->offsets[i*kc->second_cnt+j]!=0 ) + ++cnt2; + } + if ( cnt2==0 || strlen(kc->firsts[i])==0 ) + continue; + firsts[cnt].label = uc_copy(kc->firsts[i]); + firsts[cnt].parent = node; + firsts[cnt].build = BuildKC2; + firsts[cnt++].u.index = i; + } +} + +static int SLIMatches(SplineFont *sf, int sli, uint32 script, uint32 lang) { + struct script_record *sr; + int l,m; + + if ( sli==SLI_UNKNOWN ) +return( false ); + if ( sli==SLI_NESTED ) +return( script=='*' ); + + sr = sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 && sr[l].script!=script; ++l ); + if ( sr[l].script!=0 ) { + for ( m=0; sr[l].langs[m]!=0 && sr[l].langs[m]!=lang; ++m ); + if ( sr[l].langs[m]!=0 ) +return( true ); + } +return( false ); +} + +static void BuildKerns2(struct node *node,struct att_dlg *att, + uint32 script, uint32 lang,int isv) { + KernPair *kp = node->u.sc->kerns; + int i,j; + struct node *chars; + char buf[80]; + SplineFont *_sf = att->sf; + + for ( j=0; j<2; ++j ) { + for ( kp=isv ? node->u.sc->vkerns:node->u.sc->kerns, i=0; kp!=NULL; kp=kp->next ) { + if ( SLIMatches(_sf,kp->sli,script,lang) ) { + if ( j ) { + sprintf( buf, "%.40s %d", kp->sc->name, kp->off ); + chars[i].label = uc_copy(buf); + chars[i].parent = node; + } + ++i; + } + } + if ( j==0 ) { + node->children = chars = gcalloc(i+1,sizeof(struct node)); + node->cnt = i; + } + } +} + +static void BuildKerns2G(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->parent->parent->tag, lang = node->parent->parent->tag; + BuildKerns2(node,att,script,lang,false); +} + +static void BuildKerns2GV(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->parent->parent->tag, lang = node->parent->parent->tag; + BuildKerns2(node,att,script,lang,true); +} + +static void BuildKerns2M(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->tag, lang = DEFAULT_LANG; + BuildKerns2(node,att,script,lang,false); +} + +static void BuildKerns2MV(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->tag, lang = DEFAULT_LANG; + BuildKerns2(node,att,script,lang,true); +} + +static void BuildKerns(struct node *node,struct att_dlg *att,uint32 script,uint32 lang, + void (*build)(struct node *,struct att_dlg *),int isv) { + int i,k,j, tot; + SplineFont *_sf = att->sf, *sf; + struct node *chars; + KernPair *kp; + + for ( j=0; j<2; ++j ) { + tot = 0; + k=0; + do { + sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k++]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kp=isv ? sf->chars[i]->vkerns:sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) { + if ( SLIMatches(_sf,kp->sli,script,lang) ) { + if ( j ) { + chars[tot].u.sc = sf->chars[i]; + chars[tot].label = uc_copy(sf->chars[i]->name); + chars[tot].build = build; + chars[tot].parent = node; + } + ++tot; + break; + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + if ( tot==0 ) +return; + if ( !j ) { + node->children = chars = gcalloc(tot+1,sizeof(struct node)); + node->cnt = tot; + } + } +} + +static void BuildKernScript(struct node *node,struct att_dlg *att) { + BuildKerns(node,att,node->tag,DEFAULT_LANG,BuildKerns2M,false); +} + +static void BuildVKernScript(struct node *node,struct att_dlg *att) { + BuildKerns(node,att,node->tag,DEFAULT_LANG,BuildKerns2MV,true); +} + +static int PSTAllComponentsExist(SplineFont *sf,char *glyphnames ) { + char *start, *end, ch; + int ret; + + if ( glyphnames==NULL ) +return( false ); + for ( start=glyphnames; *start; start = end ) { + while ( *start==' ' ) ++start; + for ( end = start; *end!=' ' && *end!='\0'; ++end ); + ch = *end; *end = '\0'; + ret = SCWorthOutputting(SFGetCharDup(sf,-1,start)); + *end = ch; + if ( !ret ) +return( false ); + } +return( true ); +} + +static void BuildFeatures(struct node *node,struct att_dlg *att, + uint32 script, uint32 lang, uint32 tag, int ispos) { + int i,j,k, maxc, tot, maxl, len; + SplineFont *_sf = att->sf, *sf; + SplineChar *sc; + unichar_t *ubuf; + char buf[200]; + struct node *chars; + PST *pst; + + /* Build up the list of characters which use this GSUB/GPOS/morx feature */ + k=maxc=0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + if ( sf->charcnt>maxc ) maxc = sf->charcnt; + ++k; + } while ( k<_sf->subfontcnt ); + + chars = NULL; maxl = 0; + for ( j=0; j<2; ++j ) { + tot = 0; + for ( i=0; isubfonts==NULL ? _sf : _sf->subfonts[k]; + if ( sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++k; + } while ( k<_sf->subfontcnt ); + if ( sc!=NULL ) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) + if ( pst->tag==tag && pst->type!=pst_lcaret && + (( ispos && (pst->type==pst_position || pst->type==pst_pair)) || + (!ispos && (pst->type!=pst_position && pst->type!=pst_pair))) ) { + if ( SLIMatches(sf,pst->script_lang_index,script,lang)) { + if ( chars ) { + uc_strcpy(ubuf,sc->name); + if ( pst->type==pst_position ) { + sprintf(buf," dx=%d dy=%d dx_adv=%d dy_adv=%d", + pst->u.pos.xoff, pst->u.pos.yoff, + pst->u.pos.h_adv_off, pst->u.pos.v_adv_off ); + uc_strcat(ubuf,buf); + } else if ( pst->type==pst_pair ) { + sprintf(buf," %.50s dx=%d dy=%d dx_adv=%d dy_adv=%d | dx=%d dy=%d dx_adv=%d dy_adv=%d", + pst->u.pair.paired, + pst->u.pair.vr[0].xoff, pst->u.pair.vr[0].yoff, + pst->u.pair.vr[0].h_adv_off, pst->u.pair.vr[0].v_adv_off, + pst->u.pair.vr[1].xoff, pst->u.pair.vr[1].yoff, + pst->u.pair.vr[1].h_adv_off, pst->u.pair.vr[1].v_adv_off ); + uc_strcat(ubuf,buf); + } else { + if ( !PSTAllComponentsExist(_sf,pst->u.subs.variant )) + continue; + if ( pst->type==pst_ligature ) + uc_strcat(ubuf, " <= " ); + else + uc_strcat(ubuf, " => " ); + uc_strcat(ubuf,pst->u.subs.variant); + } + chars[tot].label = u_copy(ubuf); + chars[tot].parent = node; + } else { + if ( pst->type==pst_position ) + len = strlen(sc->name)+40; + else if ( pst->type==pst_pair ) + len = strlen(sc->name)+strlen(pst->u.pair.paired)+ + 100; + else + len = strlen(sc->name)+strlen(pst->u.subs.variant)+8; + if ( len>maxl ) maxl = len; + } + ++tot; + } + } + } + } + if ( tot==0 ) +return; + if ( chars==NULL ) { + ubuf = galloc(maxl*sizeof(unichar_t)); + chars = gcalloc(tot+1,sizeof(struct node)); + } + } + node->children = chars; + node->cnt = tot; + free(ubuf); +} + +static void BuildMorxFeatures(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->tag, lang = DEFAULT_LANG, feat=node->tag; + BuildFeatures(node,att, script,lang,feat,false); +} + +static void BuildMorxScript(struct node *node,struct att_dlg *att) { + uint32 script = node->tag, lang = DEFAULT_LANG; + int i,k,l,m, tot, max; + SplineFont *_sf = att->sf, *sf; + uint32 *feats; + FPST *fpst, **fpsts; + struct node *featnodes; + int feat, set; + SplineChar *sc; + PST *pst; + char buf[20]; + unichar_t *setname; + + /* Build up the list of features in this "script" entry in morx */ + k=tot=0; + max=30; + feats = galloc(max*sizeof(uint32)); + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) + if ( pst->type!=pst_position && pst->type!=pst_lcaret && + pst->type!=pst_pair && + pst->script_lang_index!=SLI_NESTED && + (pst->macfeature || + OTTagToMacFeature(pst->tag,&feat,&set))) { + int sli = pst->script_lang_index; + struct script_record *sr = _sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 && sr[l].script!=script; ++l ); + if ( sr[l].script!=0 ) { + for ( m=0; sr[l].langs[m]!=0 && sr[l].langs[m]!=lang; ++m ); + if ( sr[l].langs[m]!=0 ) { + for ( l=0; ltag; ++l ); + if ( l>=tot ) { + if ( tot>=max ) + feats = grealloc(feats,(max+=30)*sizeof(uint32)); + feats[tot++] = pst->tag; + } + } + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + + fpsts = NULL; + for ( fpst = _sf->possub; fpst!=NULL; fpst=fpst->next ) { + if ( _sf->sm==NULL && FPSTisMacable(_sf,fpst,true)) { + int sli = fpst->script_lang_index; + struct script_record *sr = _sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 && sr[l].script!=script; ++l ); + if ( sr[l].script!=0 ) { + for ( m=0; sr[l].langs[m]!=0 && sr[l].langs[m]!=lang; ++m ); + if ( sr[l].langs[m]!=0 ) { + if ( fpsts==NULL ) + fpsts = gcalloc(max,sizeof(FPST *)); + if ( tot>=max ) { + feats = grealloc(feats,(max+=30)*sizeof(uint32)); + fpsts = grealloc(fpsts,max*sizeof(FPST *)); + } + fpsts[tot] = fpst; + feats[tot++] = fpst->tag; + } + } + } + } + + featnodes = gcalloc(tot+1,sizeof(struct node)); + for ( i=0; i>16; + set = feats[i]&0xffff; + featnodes[i].macfeat = true; + } + setname = PickNameFromMacName(FindMacSettingName(sf,feat,set)); + if ( setname==NULL ) + setname = uc_copy(""); + featnodes[i].tag = (feat<<16)|set; + sprintf( buf, "<%d,%d> ", feat,set ); + featnodes[i].label = galloc((strlen(buf)+u_strlen(setname)+1)*sizeof(unichar_t)); + uc_strcpy(featnodes[i].label,buf); + u_strcat(featnodes[i].label,setname); + free(setname); + } + + qsort(featnodes,tot,sizeof(struct node),compare_tag); + for ( i=0; i>16,featnodes[i].tag&0xffff); + node->children = featnodes; + node->cnt = tot; +} + +static void BuildKerns_(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->parent->tag, lang = node->parent->tag; + BuildKerns(node,att,script,lang,BuildKerns2G,false); +} + +static void BuildKernsV_(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->parent->tag, lang = node->parent->tag; + BuildKerns(node,att,script,lang,BuildKerns2GV,true); +} + +static void BuildAnchorLists_(struct node *node,struct att_dlg *att) { + uint32 script = node->parent->parent->tag; + BuildAnchorLists(node,att,script); +} + +static void BuildFeature_(struct node *node,struct att_dlg *att) { + uint32 feat=node->tag; + FPST *fpst = node->parent->parent->u.fpst; + int isgpos = (fpst->type == pst_contextpos || fpst->type == pst_chainpos); + BuildFeatures(node,att, '*','*',feat,isgpos); +} + +static void BuildFeature__(struct node *node,struct att_dlg *att) { + uint32 feat=node->tag; + BuildFeatures(node,att, '*','*',feat,false); +} + +static void FigureBuild(struct node *node,uint32 tag,SplineFont *sf) { + FPST *fpst; + AnchorClass *ac; + + for ( fpst=sf->possub; fpst!=NULL && fpst->tag!=tag; fpst=fpst->next ); + if ( fpst!=NULL ) { + node->u.fpst = fpst; + node->build = BuildFPST; +return; + } + for ( ac=sf->anchor; ac!=NULL && ac->feature_tag!=tag; ac=ac->next ); + if ( ac!=NULL ) { + node->u.ac = ac; + node->build = BuildAnchorLists_; +return; + } + node->build = BuildFeature_; +} + +static void BuildFPSTRule(struct node *node,struct att_dlg *att) { + FPST *fpst = node->parent->u.fpst; + int index = node->u.index; + struct fpst_rule *r = &fpst->rules[index]; + int len, i, j; + struct node *lines; + char buf[200], *space, *pt, *start, *spt; + unichar_t *upt; + SplineFont *sf = att->sf; + + for ( i=0; i<2; ++i ) { + len = 0; + + switch ( fpst->format ) { + case pst_glyphs: + if ( r->u.glyph.back!=NULL && *r->u.glyph.back!='\0' ) { + if ( i ) { + sprintf(buf, "Backtrack Match: " ); + lines[len].label = galloc((strlen(buf)+strlen(r->u.glyph.back)+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + upt = lines[len].label+u_strlen(lines[len].label); + for ( pt=r->u.glyph.back+strlen(r->u.glyph.back); pt>r->u.glyph.back; pt=start ) { + for ( start = pt-1; start>=r->u.glyph.back&& *start!=' '; --start ); + for ( spt=start+1; sptu.glyph.names)+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,r->u.glyph.names); + lines[len].parent = node; + } + ++len; + if ( r->u.glyph.fore!=NULL && *r->u.glyph.fore!='\0' ) { + if ( i ) { + sprintf(buf, "Lookahead Match: " ); + lines[len].label = galloc((strlen(buf)+strlen(r->u.glyph.fore)+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,r->u.glyph.fore); + lines[len].parent = node; + } + ++len; + } + break; + case pst_class: + if ( r->u.class.bcnt!=0 ) { + if ( i ) { + space = pt = galloc(100+7*r->u.class.bcnt); + strcpy(space, r->u.class.bcnt==1 ? "Backtrack class: " : "Backtrack classes: " ); + pt += strlen(space); + for ( j=r->u.class.bcnt-1; j>=0; --j ) { + sprintf( pt, "%d ", r->u.class.bclasses[j] ); + pt += strlen( pt ); + lines[len].label = uc_copy(space); + lines[len].parent = node; + } + free(space); + } + ++len; + } + if ( i ) { + space = pt = galloc(100+7*r->u.class.ncnt); + strcpy(space, r->u.class.ncnt==1 ? "Class: " : "Classes: " ); + pt += strlen(space); + for ( j=0; ju.class.ncnt; ++j ) { + sprintf( pt, "%d ", r->u.class.nclasses[j] ); + pt += strlen( pt ); + lines[len].label = uc_copy(space); + lines[len].parent = node; + } + free(space); + } + ++len; + if ( r->u.class.fcnt!=0 ) { + if ( i ) { + space = pt = galloc(100+7*r->u.class.fcnt); + strcpy(space, r->u.class.fcnt==1 ? "Lookahead class: " : "Lookahead classes: " ); + pt += strlen(space); + for ( j=0; ju.class.fcnt; ++j ) { + sprintf( pt, "%d ", r->u.class.fclasses[j] ); + pt += strlen( pt ); + lines[len].label = uc_copy(space); + lines[len].parent = node; + } + free(space); + } + ++len; + } + break; + case pst_coverage: + case pst_reversecoverage: + for ( j=r->u.coverage.bcnt-1; j>=0; --j ) { + if ( i ) { + sprintf(buf, "Back coverage %d: ", -j-1); + lines[len].label = galloc((strlen(buf)+strlen(r->u.coverage.bcovers[j])+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,r->u.coverage.bcovers[j]); + lines[len].parent = node; + } + ++len; + } + for ( j=0; ju.coverage.ncnt; ++j ) { + if ( i ) { + sprintf(buf, "Coverage %d: ", j); + lines[len].label = galloc((strlen(buf)+strlen(r->u.coverage.ncovers[j])+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,r->u.coverage.ncovers[j]); + lines[len].parent = node; + } + ++len; + } + for ( j=0; ju.coverage.fcnt; ++j ) { + if ( i ) { + sprintf(buf, "Lookahead coverage %d: ", j+r->u.coverage.ncnt); + lines[len].label = galloc((strlen(buf)+strlen(r->u.coverage.fcovers[j])+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,r->u.coverage.fcovers[j]); + lines[len].parent = node; + } + ++len; + } + break; + } + switch ( fpst->format ) { + case pst_glyphs: + case pst_class: + case pst_coverage: + for ( j=0; jlookup_cnt; ++j ) { + if ( i ) { + sprintf(buf, "Apply at %d '%c%c%c%c'", r->lookups[j].seq, + r->lookups[j].lookup_tag>>24, (r->lookups[j].lookup_tag>>16)&0xff, + (r->lookups[j].lookup_tag>>8)&0xff, r->lookups[j].lookup_tag&0xff ); + lines[len].label = uc_copy(buf); + lines[len].parent = node; + lines[len].tag = r->lookups[j].lookup_tag; + FigureBuild(&lines[len],r->lookups[j].lookup_tag,sf); + } + ++len; + } + break; + case pst_reversecoverage: + if ( i ) { + sprintf(buf, "Replacement: " ); + lines[len].label = galloc((strlen(buf)+strlen(r->u.rcoverage.replacements)+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,r->u.rcoverage.replacements); + lines[len].parent = node; + } + ++len; + break; + } + if ( i==0 ) { + node->children = lines = gcalloc(len+1,sizeof(struct node)); + node->cnt = len; + } + } +} + +static void BuildFPST(struct node *node,struct att_dlg *att) { + FPST *fpst = node->u.fpst; + int len, i, j; + struct node *lines; + char buf[200]; + static char *type[] = { "Contextual Positioning", "Contextual Substitution", + "Chaining Positioning", "Chaining Substitution", + "Reverse Chaining Subs" }; + static char *format[] = { "glyphs", "classes", "coverage", "coverage" }; + + lines = NULL; + for ( i=0; i<2; ++i ) { + len = 0; + + if ( i ) { + sprintf(buf, "%s by %s", type[fpst->type-pst_contextpos], format[fpst->format]); + lines[len].label = uc_copy(buf); + lines[len].parent = node; + } + ++len; + if ( fpst->format==pst_class ) { + for ( j=1; jbccnt ; ++j ) { + if ( i ) { + sprintf(buf, "Backtrack class %d: ", j); + lines[len].label = galloc((strlen(buf)+strlen(fpst->bclass[j])+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,fpst->bclass[j]); + lines[len].parent = node; + } + ++len; + } + for ( j=1; jnccnt ; ++j ) { + if ( i ) { + sprintf(buf, "Class %d: ", j); + lines[len].label = galloc((strlen(buf)+strlen(fpst->nclass[j])+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,fpst->nclass[j]); + lines[len].parent = node; + } + ++len; + } + for ( j=1; jfccnt ; ++j ) { + if ( i ) { + sprintf(buf, "Lookahead class %d: ", j); + lines[len].label = galloc((strlen(buf)+strlen(fpst->fclass[j])+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,fpst->fclass[j]); + lines[len].parent = node; + } + ++len; + } + } + for ( j=0; jrule_cnt; ++j ) { + if ( i ) { + sprintf(buf, "Rule %d", j); + lines[len].label = uc_copy(buf); + lines[len].parent = node; + lines[len].u.index = j; + lines[len].build = BuildFPSTRule; + } + ++len; + } + if ( i==0 ) { + node->children = lines = gcalloc(len+1,sizeof(struct node)); + node->cnt = len; + } + } +} + +static void BuildASM(struct node *node,struct att_dlg *att) { + ASM *sm = node->u.sm; + int len, i, j, k, scnt = 0; + struct node *lines; + char buf[200], *space; + static char *type[] = { "Indic Reordering", "Contextual Substitution", + "Ligatures", "", "Simple Substitution", + "Glyph Insertion", "", "", "", + "", "", "","", + "", "", "", "", + "Kern by State" }; + uint32 *subs=NULL; + + if ( sm->type == asm_context ) { + subs = galloc(sm->class_cnt*sm->state_cnt*2*sizeof(uint32)); + for ( i=scnt=0; iclass_cnt*sm->state_cnt; ++i ) { + int tag; + tag = sm->state[i].u.context.mark_tag; + if ( tag!=0 ) { + for ( k=0; kstate[i].u.context.cur_tag; + if ( tag!=0 ) { + for ( k=0; kclass_cnt+40 ); + for ( i=0; i<2; ++i ) { + len = 0; + + if ( i ) { + lines[len].label = uc_copy(type[sm->type]); + lines[len].parent = node; + } + ++len; + for ( j=4; jclass_cnt ; ++j ) { + if ( i ) { + sprintf(buf, "Class %d: ", j); + lines[len].label = galloc((strlen(buf)+strlen(sm->classes[j])+1)*sizeof(unichar_t)); + uc_strcpy(lines[len].label,buf); + uc_strcat(lines[len].label,sm->classes[j]); + lines[len].parent = node; + } + ++len; + } + for ( j=0; jstate_cnt; ++j ) { + if ( i ) { + sprintf(space, "State %4d Next: ", j ); + for ( k=0; kclass_cnt; ++k ) + sprintf( space+strlen(space), "%5d", sm->state[j*sm->class_cnt+k].next_state ); + lines[len].label = uc_copy(space); + lines[len].parent = node; + lines[len].monospace = true; + } + ++len; + if ( i ) { + sprintf(space, "State %4d Flags:", j ); + for ( k=0; kclass_cnt; ++k ) + sprintf( space+strlen(space), " %04x", sm->state[j*sm->class_cnt+k].flags ); + lines[len].label = uc_copy(space); + lines[len].parent = node; + lines[len].monospace = true; + } + ++len; + if ( sm->type==asm_context ) { + if ( i ) { + sprintf(space, "State %4d Mark: ", j ); + for ( k=0; kclass_cnt; ++k ) + if ( sm->state[j*sm->class_cnt+k].u.context.mark_tag==0 ) + strcat(space," "); + else + sprintf( space+strlen(space), " %c%c%c%c", + sm->state[j*sm->class_cnt+k].u.context.mark_tag>>24, + (sm->state[j*sm->class_cnt+k].u.context.mark_tag>>16)&0xff, + (sm->state[j*sm->class_cnt+k].u.context.mark_tag>>8)&0xff, + sm->state[j*sm->class_cnt+k].u.context.mark_tag&0xff ); + lines[len].label = uc_copy(space); + lines[len].parent = node; + lines[len].monospace = true; + } + ++len; + if ( i ) { + sprintf(space, "State %4d Cur: ", j ); + for ( k=0; kclass_cnt; ++k ) + if ( sm->state[j*sm->class_cnt+k].u.context.cur_tag==0 ) + strcat(space," "); + else + sprintf( space+strlen(space), " %c%c%c%c", + sm->state[j*sm->class_cnt+k].u.context.cur_tag>>24, + (sm->state[j*sm->class_cnt+k].u.context.cur_tag>>16)&0xff, + (sm->state[j*sm->class_cnt+k].u.context.cur_tag>>8)&0xff, + sm->state[j*sm->class_cnt+k].u.context.cur_tag&0xff ); + lines[len].label = uc_copy(space); + lines[len].parent = node; + lines[len].monospace = true; + } + ++len; + } + } + for ( j=0; j>24, (subs[j]>>16)&0xff, + (subs[j]>>8)&0xff, subs[j]&0xff ); + lines[len].label = uc_copy(buf); + lines[len].parent = node; + lines[len].tag = subs[j]; + lines[len].build = BuildFeature__; + } + ++len; + } + if ( i==0 ) { + node->children = lines = gcalloc(len+1,sizeof(struct node)); + node->cnt = len; + } + } + free(space); + free(subs); +} + +static void BuildGSUBfeatures(struct node *node,struct att_dlg *att) { + int isgsub = node->parent->parent->parent->tag==CHR('G','S','U','B'); + uint32 script = node->parent->parent->tag, lang = node->parent->tag, feat=node->tag; + + BuildFeatures(node,att, script,lang,feat,!isgsub); +} + +static void BuildGSUBlang(struct node *node,struct att_dlg *att) { + int isgsub = node->parent->parent->tag==CHR('G','S','U','B'); + uint32 script = node->parent->tag, lang = node->tag; + int i,j,k,l, tot, max; + SplineFont *_sf = att->sf, *sf; + struct f { + uint32 feats; + union sak acs; + void (*build)(struct node *,struct att_dlg *); + } *f; + struct node *featnodes; + extern GTextInfo *pst_tags[]; + int haskerns=false, hasvkerns=false; + AnchorClass *ac, *ac2; + SplineChar *sc; + PST *pst; + KernPair *kp; + unichar_t ubuf[80]; + int isv; + KernClass *kc; + FPST *fpst; + + /* Build up the list of features in this lang entry of this script in GSUB/GPOS */ + k=tot=0; + max=30; + f = gcalloc(max,sizeof(struct f)); + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) + if ((isgsub && pst->type!=pst_position && pst->type!=pst_lcaret && + pst->type!=pst_pair) || + (!isgsub && (pst->type==pst_position || pst->type==pst_pair)) ) { + if ( SLIMatches(_sf,pst->script_lang_index,script,lang) && + !pst->macfeature ) { + for ( l=0; ltag; ++l ); + if ( l>=tot ) { + if ( tot>=max ) { + f = grealloc(f,(max+=30)*sizeof(struct f)); + memset(f+(max-30),0,30*sizeof(struct f)); + } + f[tot++].feats = pst->tag; + } + } + } + if ( !isgsub ) { + for ( isv=0; isv<2; ++isv ) { + if ( isv && hasvkerns ) + continue; + if ( !isv && haskerns ) + continue; + for ( kp=isv ? sc->vkerns : sc->kerns; kp!=NULL; kp=kp->next ) { + if ( SLIMatches(_sf,kp->sli,script,lang)) { + if ( tot>=max ) { + f = grealloc(f,(max+=30)*sizeof(struct f)); + memset(f+(max-30),0,30*sizeof(struct f)); + } + if ( isv ) { + f[tot].feats = CHR('v','k','r','n'); + f[tot++].build = BuildKernsV_; + hasvkerns = true; + } else { + f[tot].feats = CHR('k','e','r','n'); + f[tot++].build = BuildKerns_; + haskerns = true; + } + break; + } + } + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + if ( !isgsub ) { + AnchorClassOrder(_sf); + for ( ac=_sf->anchor; ac!=NULL; ac=ac->next ) + ac->processed = false; + for ( ac=_sf->anchor; ac!=NULL; ac = ac->next ) if ( !ac->processed ) { + if ( SLIMatches(_sf,ac->script_lang_index,script,lang) ) { + /* We expect to get multiple features with the same tag here */ + if ( tot>=max ) { + f = grealloc(f,(max+=30)*sizeof(struct f)); + memset(f+(max-30),0,30*sizeof(struct f)); + } + f[tot].acs.ac = ac; + f[tot].build = BuildAnchorLists_; + f[tot++].feats = ac->feature_tag; + } + /* These all get merged together into one feature */ + for ( ac2 = ac->next; ac2!=NULL ; ac2 = ac2->next ) { + if ( ac2->feature_tag==ac->feature_tag && + ac2->script_lang_index == ac->script_lang_index && + ac2->merge_with == ac->merge_with ) + ac2->processed = true; + } + } + for ( isv = 0; isv<2; ++isv ) { + for ( kc=isv ? _sf->vkerns : _sf->kerns; kc!=NULL; kc=kc->next ) { + if ( SLIMatches(_sf,kc->sli,script,lang) ) { + /* We expect to get multiple features with the same tag here */ + if ( tot>=max ) { + f = grealloc(f,(max+=30)*sizeof(struct f)); + memset(f+(max-30),0,30*sizeof(struct f)); + } + f[tot].acs.kc = kc; + f[tot].build = BuildKC; + f[tot++].feats = isv ? CHR('v','k','r','n') : CHR('k','e','r','n'); + } + } + } + } + + for ( fpst = _sf->possub; fpst!=NULL; fpst=fpst->next ) + if (( !isgsub && (fpst->type==pst_contextpos || fpst->type==pst_chainpos)) || + ( isgsub && (fpst->type==pst_contextsub || fpst->type==pst_chainsub || fpst->type==pst_reversesub ))) { + if ( SLIMatches(_sf,fpst->script_lang_index,script,lang)) { + /* We expect to get multiple features with the same tag here */ + if ( tot>=max ) { + f = grealloc(f,(max+=30)*sizeof(struct f)); + memset(f+(max-30),0,30*sizeof(struct f)); + } + f[tot].acs.fpst = fpst; + f[tot].build = BuildFPST; + f[tot++].feats = fpst->tag; + } + } + + featnodes = gcalloc(tot+1,sizeof(struct node)); + for ( i=0; i>24; + ubuf[2] = (featnodes[i].tag>>16)&0xff; + ubuf[3] = (featnodes[i].tag>>8)&0xff; + ubuf[4] = featnodes[i].tag&0xff; + ubuf[5] = '\''; + ubuf[6] = ' '; + if ( pst_tags[k]!=NULL ) + u_strcpy(ubuf+7,GStringGetResource((uint32) pst_tags[k][j].text,NULL)); + else + ubuf[7]='\0'; + } + featnodes[i].label = u_copy(ubuf); + } + + qsort(featnodes,tot,sizeof(struct node),compare_tag); + node->children = featnodes; + node->cnt = tot; +} + +static void BuildGSUBscript(struct node *node,struct att_dlg *att) { + SplineFont *sf = att->sf; + int lang_max; + int i,j,k,l; + struct node *langnodes; + extern GTextInfo languages[]; + unichar_t ubuf[100]; + + /* Build the list of languages that are used in this script */ + /* Don't bother to check whether they actually get used */ + for ( j=0; j<2; ++j ) { + lang_max = 0; + if ( sf->script_lang!=NULL ) + for ( i=0; sf->script_lang[i]!=NULL ; ++i ) { + for ( k=0; sf->script_lang[i][k].script!=0; ++k ) { + if ( sf->script_lang[i][k].script == node->tag ) { + for ( l=0; sf->script_lang[i][k].langs[l]!=0; ++l ) { + if ( j ) + langnodes[lang_max].tag = sf->script_lang[i][k].langs[l]; + ++lang_max; + } + } + } + } + if ( lang_max==0 ) +return; + if ( j==0 ) + langnodes = gcalloc(lang_max+1,sizeof(struct node)); + } + + qsort(langnodes,lang_max,sizeof(struct node),compare_tag); + + /* Remove duplicates */ + for ( i=j=0; i>24; + ubuf[2] = (langnodes[i].tag>>16)&0xff; + ubuf[3] = (langnodes[i].tag>>8)&0xff; + ubuf[4] = langnodes[i].tag&0xff; + ubuf[5] = '\''; + ubuf[6] = ' '; + if ( languages[j].text!=NULL ) { + u_strcpy(ubuf+7,GStringGetResource((uint32) languages[j].text,NULL)); + uc_strcat(ubuf," "); + } else + ubuf[7]='\0'; + u_strcat(ubuf,GStringGetResource(_STR_OTFLanguage,NULL)); + langnodes[i].label = u_copy(ubuf); + langnodes[i].build = BuildGSUBlang; + langnodes[i].parent = node; + } + node->children = langnodes; + node->cnt = i; +} + +static void BuildLCarets(struct node *node,struct att_dlg *att) { + SplineChar *sc = node->u.sc; + PST *pst; + int i,j; + char buffer[20]; + struct node *lcars; + + j = -1; + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) if ( pst->type==pst_lcaret ) { + for ( j=pst->u.lcaret.cnt-1; j>=0; --j ) + if ( pst->u.lcaret.carets[j]!=0 ) + goto break2; + } + break2: + if ( j==-1 ) +return; + ++j; + node->children = lcars = gcalloc(j+1,sizeof(struct node)); + node->cnt = j; + for ( j=i=0; ju.lcaret.cnt; ++j ) { + if ( pst->u.lcaret.carets[j]!=0 ) { + sprintf( buffer,"%d", pst->u.lcaret.carets[j] ); + lcars[i].parent = node; + lcars[i++].label = uc_copy(buffer); + } + } +} + +static void BuildLcar(struct node *node,struct att_dlg *att) { + SplineFont *sf, *_sf = att->sf; + struct node *glyphs; + int i,j,k,l, lcnt; + PST *pst; + + glyphs = NULL; + for ( k=0; k<2; ++k ) { + lcnt = 0; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_lcaret ) { + for ( j=pst->u.lcaret.cnt-1; j>=0; --j ) + if ( pst->u.lcaret.carets[j]!=0 ) + break; + if ( j!=-1 ) + break; + } + } + if ( pst!=NULL ) { + if ( glyphs!=NULL ) { + glyphs[lcnt].parent = node; + glyphs[lcnt].build = BuildLCarets; + glyphs[lcnt].u.sc = sf->chars[i]; + glyphs[lcnt].label = uc_copy(sf->chars[i]->name); + } + ++lcnt; + } + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( lcnt==0 ) + break; + if ( glyphs!=NULL ) + break; + node->children = glyphs = gcalloc(lcnt+1,sizeof(struct node)); + node->cnt = lcnt; + } +} + +static void BuildGdefs(struct node *node,struct att_dlg *att) { + SplineFont *sf, *_sf = att->sf; + int i, cmax, l,j, ccnt; + SplineChar *sc; + struct node *chars; + char buffer[100]; + + cmax = 0; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + if ( cmaxcharcnt ) cmax = sf->charcnt; + ++l; + } while ( l<_sf->subfontcnt ); + + chars = NULL; + for ( j=0; j<2; ++j ) { + ccnt = 0; + for ( i=0; isubfonts==NULL ? _sf : _sf->subfonts[l]; + if ( lcharcnt && sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( sc!=NULL && SCWorthOutputting(sc) ) { + if ( chars!=NULL ) { + int gdefc = gdefclass(sc); + sprintf(buffer,"%.70s %s", sc->name, + gdefc==0 ? "Not classified" : + gdefc==1 ? "Base" : + gdefc==2 ? "Ligature" : + gdefc==3 ? "Mark" : + "Componant" ); + chars[ccnt].parent = node; + chars[ccnt].label = uc_copy(buffer);; + } + ++ccnt; + } + } + if ( ccnt==0 ) + break; + if ( chars==NULL ) { + node->cnt = ccnt; + node->children = chars = gcalloc(ccnt+1,sizeof(struct node)); + } + } +} + +static void BuildGDEF(struct node *node,struct att_dlg *att) { + SplineFont *sf, *_sf = att->sf; + AnchorClass *ac; + PST *pst; + int l,j,i; + int gdef, lcar; + + for ( ac = _sf->anchor; ac!=NULL; ac=ac->next ) { + if ( ac->type==act_curs ) + break; + } + gdef = lcar = 0; + if ( ac!=NULL ) + gdef = 1; + l = 0; + pst = NULL; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_lcaret ) { + for ( j=pst->u.lcaret.cnt-1; j>=0; --j ) + if ( pst->u.lcaret.carets[j]!=0 ) { + lcar = 1; + break; + } + if ( j!=-1 ) + break; + } + } + if ( sf->chars[i]->glyph_class!=0 ) + gdef = 1; + } + ++l; + } while ( l<_sf->subfontcnt ); + + if ( gdef+lcar!=0 ) { + node->children = gcalloc(gdef+lcar+1,sizeof(struct node)); + node->cnt = gdef+lcar; + if ( gdef ) { + node->children[0].label = uc_copy("Glyph Definition Sub-Table"); + node->children[0].build = BuildGdefs; + node->children[0].parent = node; + } + if ( lcar ) { + node->children[gdef].label = uc_copy("Ligature Caret Sub-Table"); + node->children[gdef].build = BuildLcar; + node->children[gdef].parent = node; + } + } +} + +static void BuildOpticalBounds(struct node *node,struct att_dlg *att) { + SplineFont *sf, *_sf = att->sf; + int i, cmax, l,j, ccnt; + SplineChar *sc; + struct node *chars; + char buffer[200]; + PST *left, *right; + + cmax = 0; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + if ( cmaxcharcnt ) cmax = sf->charcnt; + ++l; + } while ( l<_sf->subfontcnt ); + + chars = NULL; + for ( j=0; j<2; ++j ) { + ccnt = 0; + for ( i=0; isubfonts==NULL ? _sf : _sf->subfonts[l]; + if ( icharcnt && sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( sc!=NULL && SCWorthOutputting(sc) && + haslrbounds(sc,&left,&right)) { + if ( chars!=NULL ) { + strncpy(buffer,sc->name,70); + if ( left!=NULL ) + sprintf(buffer+strlen(buffer), " Left Bound=%d", + left->u.pos.xoff ); + if ( right!=NULL ) + sprintf(buffer+strlen(buffer), " Right Bound=%d", + -right->u.pos.h_adv_off ); + chars[ccnt].parent = node; + chars[ccnt].label = uc_copy(buffer); + } + ++ccnt; + } + } + if ( ccnt==0 ) +return; + if ( chars==NULL ) { + node->children = chars = gcalloc(ccnt+1,sizeof(struct node)); + node->cnt = ccnt; + } + } +} + +static void BuildProperties(struct node *node,struct att_dlg *att) { + SplineFont *sf, *_sf = att->sf; + int i, cmax, l,j,k, ccnt; + SplineChar *sc; + struct node *chars; + uint16 *props; + char buffer[200]; + + cmax = 0; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + if ( cmaxcharcnt ) cmax = sf->charcnt; + ++l; + } while ( l<_sf->subfontcnt ); + + chars = NULL; props = NULL; + for ( j=0; j<2; ++j ) { + ccnt = 0; + for ( i=0; isubfonts==NULL ? _sf : _sf->subfonts[l]; + if ( icharcnt && sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( sc!=NULL ) { + if ( chars==NULL ) { + if ( SCWorthOutputting(sc)) + sc->ttf_glyph = ccnt++; + else + sc->ttf_glyph = -1; + } else if ( sc->ttf_glyph!=-1 ) { + int prop = props[sc->ttf_glyph], offset; + sprintf( buffer, "%.70s dir=%s", sc->name, + (prop&0x7f)==0 ? "Strong Left to Right": + (prop&0x7f)==1 ? "Strong Right to Left": + (prop&0x7f)==2 ? "Arabic Right to Left": + (prop&0x7f)==3 ? "European Number": + (prop&0x7f)==4 ? "European Number Seperator": + (prop&0x7f)==5 ? "European Number Terminator": + (prop&0x7f)==6 ? "Arabic Number": + (prop&0x7f)==7 ? "Common Number Seperator": + (prop&0x7f)==8 ? "Block Seperator": + (prop&0x7f)==9 ? "Segment Seperator": + (prop&0x7f)==10 ? "White Space": + (prop&0x7f)==11 ? "Neutral": + "" ); + if ( prop&0x8000 ) + strcat(buffer," Floating accent"); + if ( prop&0x4000 ) + strcat(buffer," Hang left"); + if ( prop&0x2000 ) + strcat(buffer," Hang right"); + if ( prop&0x80 ) + strcat(buffer," Attach right"); + if ( prop&0x1000 ) { + offset = (prop&0xf00)>>8; + if ( offset&0x8 ) + offset |= 0xfffffff0; + if ( offset>0 ) { + for ( k=i+offset; kcharcnt; ++k ) + if ( sf->chars[k]!=NULL && sf->chars[k]->ttf_glyph==sc->ttf_glyph+offset ) { + sprintf( buffer+strlen(buffer), " Mirror=%.30s", sf->chars[k]->name ); + break; + } + } else { + for ( k=i+offset; k>=0; --k ) + if ( sf->chars[k]!=NULL && sf->chars[k]->ttf_glyph==sc->ttf_glyph+offset ) { + sprintf( buffer+strlen(buffer), " Mirror=%.30s", sf->chars[k]->name ); + break; + } + } + } + chars[ccnt].parent = node; + chars[ccnt++].label = uc_copy(buffer); + } + } + } + if ( chars==NULL ) { + props = props_array(_sf,ccnt); + if ( props==NULL ) +return; + node->children = chars = gcalloc(ccnt+1,sizeof(struct node)); + } + node->cnt = ccnt; + } + free(props); +} + +static void BuildTable(struct node *node,struct att_dlg *att) { + SplineFont *sf, *_sf = att->sf; + int script_max; + int i,j,k,l; + struct node *scriptnodes; + extern GTextInfo scripts[]; + int isgsub = node->tag==CHR('G','S','U','B'), isgpos = node->tag==CHR('G','P','O','S'); + int ismorx = node->tag==CHR('m','o','r','x'), iskern = node->tag==CHR('k','e','r','n'); + int isvkern = node->tag==CHR('v','k','r','n'); + int feat, set; + SplineChar *sc; + PST *pst; + KernPair *kp; + unichar_t ubuf[120]; + char buf[32]; + unichar_t *setname; + AnchorClass *ac; + int isv; + FPST *fpst; + ASM *sm; + + /* Build the list of scripts that are mentioned in the font */ + for ( j=0; j<2; ++j ) { + script_max = 0; + if ( _sf->script_lang!=NULL ) + for ( i=0; _sf->script_lang[i]!=NULL ; ++i ) { + for ( k=0; _sf->script_lang[i][k].script!=0; ++k ) { + if ( j ) + scriptnodes[script_max].tag = _sf->script_lang[i][k].script; + ++script_max; + } + } + if ( script_max==0 ) +return; + if ( j==0 ) + scriptnodes = gcalloc(script_max+1,sizeof(struct node)); + } + + qsort(scriptnodes,script_max,sizeof(struct node),compare_tag); + + /* Remove duplicates */ + for ( i=j=0; isubfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) if ( pst->type!=pst_lcaret ) { + int relevant = false; + if ( pst->type == pst_position || pst->type==pst_pair ) + relevant = isgpos; + else if ( isgsub ) + relevant = !pst->macfeature; + else if ( ismorx ) + relevant = pst->macfeature || OTTagToMacFeature(pst->tag,&feat,&set); + if ( pst->script_lang_index==SLI_NESTED || pst->script_lang_index==SLI_UNKNOWN ) relevant = false; + if ( relevant ) { + int sli = pst->script_lang_index; + struct script_record *sr = _sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 ; ++l ) { + for ( j=0; jvkerns : sc->kerns; + if ( head!=NULL && ((iskern && !isv) || (isvkern && isv) || isgpos)) { + for ( kp = head; kp!=NULL; kp=kp->next ) { + int sli = kp->sli; + struct script_record *sr = _sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 ; ++l ) { + for ( j=0; jsubfontcnt ); + + if ( isgpos ) { + for ( isv=0; isv<2; ++isv ) { + KernClass *kc; + for ( kc = isv ? _sf->vkerns : _sf->kerns; kc!=NULL; kc=kc->next ) if ( kc->sli!=0xffff && kc->sli!=0xff ) { + int sli = kc->sli; + struct script_record *sr = _sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 ; ++l ) { + for ( j=0; janchor!=NULL ) { + for ( ac=_sf->anchor; ac!=NULL; ac=ac->next ) if ( ac->script_lang_index!=SLI_NESTED && ac->script_lang_index!=SLI_UNKNOWN ) { + int sli = ac->script_lang_index; + struct script_record *sr = _sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 ; ++l ) { + for ( j=0; jpossub; fpst!=NULL; fpst=fpst->next ) + if ((( isgpos && (fpst->type==pst_contextpos || fpst->type==pst_chainpos)) || + ( isgsub && (fpst->type==pst_contextsub || fpst->type==pst_chainsub || fpst->type==pst_reversesub )) || + ( ismorx && sf->sm==NULL && FPSTisMacable(sf,fpst,true))) && + fpst->script_lang_index!=SLI_NESTED && fpst->script_lang_index!=SLI_UNKNOWN ) { + int sli = fpst->script_lang_index; + struct script_record *sr = _sf->script_lang[sli]; + for ( l=0; sr[l].script!=0 ; ++l ) { + for ( j=0; j>24; + ubuf[2] = (scriptnodes[i].tag>>16)&0xff; + ubuf[3] = (scriptnodes[i].tag>>8)&0xff; + ubuf[4] = scriptnodes[i].tag&0xff; + ubuf[5] = '\''; + ubuf[6] = ' '; + if ( scripts[j].text!=NULL ) { + u_strcpy(ubuf+7,GStringGetResource((uint32) scripts[j].text,NULL)); + uc_strcat(ubuf," "); + } else + ubuf[7]='\0'; + u_strcat(ubuf,GStringGetResource(_STR_OTFScript,NULL)); + scriptnodes[i].label = u_copy(ubuf); + scriptnodes[i].build = iskern ? BuildKernScript : + isvkern ? BuildVKernScript : + ismorx ? BuildMorxScript : + BuildGSUBscript; + scriptnodes[i].parent = node; + } + + /* Sadly I have no script for the morx state machines */ + if ( ismorx && _sf->sm!=NULL ) { + for ( j=0, sm=_sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type!=asm_kern ) ++j; + scriptnodes = grealloc(scriptnodes,(i+j+1)*sizeof(scriptnodes[0])); + memset(scriptnodes+i,0,(j+1)*sizeof(scriptnodes[0])); + for ( j=0, sm=_sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type!=asm_kern ) { + scriptnodes[i+j].macfeat = true; + scriptnodes[i+j].parent = node; + scriptnodes[i+j].build = BuildASM; + scriptnodes[i+j].tag = (sm->feature<<16)|sm->setting; + scriptnodes[i+j].u.sm = sm; + + setname = PickNameFromMacName(FindMacSettingName(sf,sm->feature,sm->setting)); + if ( setname==NULL ) + setname = uc_copy(""); + sprintf( buf, "<%d,%d> ", sm->feature,sm->setting ); + scriptnodes[i+j].label = galloc((strlen(buf)+u_strlen(setname)+1)*sizeof(unichar_t)); + uc_strcpy(scriptnodes[i+j].label,buf); + u_strcat(scriptnodes[i+j].label,setname); + free(setname); + ++j; + } + qsort(scriptnodes+i,j,sizeof(struct node),compare_tag); + i += j; + } + + /* Nor have I a script for the kern state machines */ + if ( iskern && _sf->sm!=NULL ) { + for ( j=0, sm=_sf->sm; sm!=NULL; sm=sm->next, ++j ); + scriptnodes = grealloc(scriptnodes,(i+j+1)*sizeof(scriptnodes[0])); + memset(scriptnodes+i,0,(j+1)*sizeof(scriptnodes[0])); + for ( j=0, sm=_sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type==asm_kern ) { + scriptnodes[i+j].parent = node; + scriptnodes[i+j].build = BuildASM; + scriptnodes[i+j].u.sm = sm; + scriptnodes[i+j].label = uc_copy("Kern by State Machine"); + ++j; + } + qsort(scriptnodes+i,j,sizeof(struct node),compare_tag); + i += j; + } + node->children = scriptnodes; + node->cnt = i; +} + +static void BuildTop(struct att_dlg *att) { + SplineFont *sf, *_sf = att->sf; + int hasgsub=0, hasgpos=0, hasgdef=0; + int hasmorx=0, haskern=0, hasvkern=0, haslcar=0, hasprop=0, hasopbd=0; + int haskc=0, hasvkc=0; + int feat, set; + struct node *tables; + PST *pst; + SplineChar *sc; + int i,k,j; + AnchorClass *ac; + KernClass *kc; + FPST *fpst; + ASM *sm; + + k=0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + if (( sc->unicodeenc>=0x10800 && sc->unicodeenc<=0x103ff ) || + ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10fff && + isrighttoleft(sc->unicodeenc)) || + ScriptIsRightToLeft(SCScriptFromUnicode(sc)) ) { + hasprop = true; + } + if ( sc->glyph_class!=0 ) + hasgdef = true; + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_position ) { + hasgpos = true; + if ( pst->tag==CHR('l','f','b','d') || pst->tag==CHR('r','t','b','d') ) + hasopbd = true; + } else if ( pst->type == pst_pair ) { + hasgpos = true; + } else if ( pst->type == pst_lcaret ) { + for ( j=pst->u.lcaret.cnt-1; j>=0; --j ) + if ( pst->u.lcaret.carets[j]!=0 ) + break; + if ( j!=-1 ) + hasgdef = haslcar = true; + } else { + if ( !pst->macfeature ) + hasgsub = true; + if ( SLIHasDefault(sf,pst->script_lang_index) && + (pst->macfeature || + OTTagToMacFeature(pst->tag,&feat,&set))) + hasmorx = true; + } + } + if ( sc->kerns!=NULL && SCScriptFromUnicode(sc)!=DEFAULT_SCRIPT ) { + haskern = hasgpos = true; + SFAddScriptLangIndex(sf,SCScriptFromUnicode(sc),DEFAULT_LANG); + } + if ( sc->vkerns!=NULL && SCScriptFromUnicode(sc)!=DEFAULT_SCRIPT ) { + hasvkern = hasgpos = true; + SFAddScriptLangIndex(sf,SCScriptFromUnicode(sc),DEFAULT_LANG); + } + } + ++k; + } while ( k<_sf->subfontcnt ); + for ( kc = _sf->kerns; kc!=NULL; kc=kc->next ) + ++hasvkc; + for ( kc = _sf->vkerns; kc!=NULL; kc=kc->next ) + ++haskc; + if ( haskc || hasvkc ) + hasgpos = true; + if ( _sf->anchor!=NULL ) + hasgpos = true; + for ( ac = sf->anchor; ac!=NULL; ac=ac->next ) { + if ( ac->type==act_curs ) + break; + } + if ( ac!=NULL ) + hasgdef = true; + for ( fpst = sf->possub; fpst!=NULL; fpst=fpst->next ) { + if ( fpst->type == pst_contextpos || fpst->type == pst_chainpos ) + hasgpos = true; + else + hasgsub = true; + if ( sf->sm==NULL && FPSTisMacable(sf,fpst,true)) + hasmorx = true; + } + for ( sm=sf->sm; sm!=NULL; sm=sm->next ) { + if ( sm->type == asm_kern ) + haskern = true; + else + hasmorx = true; + } + + if ( hasgsub+hasgpos+hasgdef+hasmorx+haskern+haslcar+hasopbd+hasprop==0 ) { + tables = gcalloc(2,sizeof(struct node)); + tables[0].label = u_copy(GStringGetResource(_STR_NoAdvancedTypography,NULL)); + } else { + tables = gcalloc((hasgsub||hasgpos||hasgdef)+ + (hasmorx||haskern||haslcar||hasopbd||hasprop||hasvkern||haskc||hasvkc)+1,sizeof(struct node)); + i=0; + if ( hasgsub || hasgpos || hasgdef) { + tables[i].label = uc_copy("OpenType Tables"); + tables[i].children_checked = true; + tables[i].children = gcalloc(hasgsub+hasgpos+hasgdef+1,sizeof(struct node)); + tables[i].cnt = hasgsub + hasgpos + hasgdef; + if ( hasgdef ) { + tables[i].children[0].label = uc_copy("'GDEF' Glyph Definition Table"); + tables[i].children[0].tag = CHR('G','D','E','F'); + tables[i].children[0].build = BuildGDEF; + tables[i].children[0].parent = &tables[i]; + } + if ( hasgpos ) { + tables[i].children[hasgdef].label = uc_copy("'GPOS' Glyph Positioning Table"); + tables[i].children[hasgdef].tag = CHR('G','P','O','S'); + tables[i].children[hasgdef].build = BuildTable; + tables[i].children[hasgdef].parent = &tables[i]; + } + if ( hasgsub ) { + tables[i].children[hasgdef+hasgpos].label = uc_copy("'GSUB' Glyph Substitution Table"); + tables[i].children[hasgdef+hasgpos].tag = CHR('G','S','U','B'); + tables[i].children[hasgdef+hasgpos].build = BuildTable; + tables[i].children[hasgdef+hasgpos].parent = &tables[i]; + } + ++i; + } + if ( hasmorx || haskern || hasvkern || haslcar || hasopbd || hasprop ) { + int j = 0; + tables[i].label = u_copy(GStringGetResource(_STR_AppleAdvancedTypography,NULL)); + tables[i].children_checked = true; + tables[i].children = gcalloc(hasmorx+haskern+haslcar+hasopbd+hasprop+hasvkern+haskc+hasvkc+1,sizeof(struct node)); + tables[i].cnt = hasmorx+haskern+hasopbd+hasprop+haslcar+hasvkern+haskc+hasvkc; + if ( haskern ) { + tables[i].children[j].label = hasvkern||haskc||hasvkc ? + uc_copy("'kern' Horizontal Kerning Sub-Table") : + uc_copy("'kern' Horizontal Kerning Table"); + tables[i].children[j].tag = CHR('k','e','r','n'); + tables[i].children[j].build = BuildTable; + tables[i].children[j++].parent = &tables[i]; + } + for ( kc = _sf->kerns; kc!=NULL; kc=kc->next ) { + tables[i].children[j].label = uc_copy("'kern' Horizontal Kerning Class"); + tables[i].children[j].tag = CHR('k','e','r','n'); + tables[i].children[j].u.kc = kc; + tables[i].children[j].build = BuildKC; + tables[i].children[j++].parent = &tables[i]; + } + if ( hasvkern ) { + tables[i].children[j].label = haskern ? uc_copy("'kern' Vertical Kerning Sub-Table") : + uc_copy("'kern' Vertical Kerning Table"); + tables[i].children[j].tag = CHR('v','k','r','n'); + tables[i].children[j].build = BuildTable; + tables[i].children[j++].parent = &tables[i]; + } + for ( kc = _sf->vkerns; kc!=NULL; kc=kc->next ) { + tables[i].children[j].label = uc_copy("'kern' Vertical Kerning Class"); + tables[i].children[j].tag = CHR('k','e','r','n'); + tables[i].children[j].u.kc = kc; + tables[i].children[j].build = BuildKC; + tables[i].children[j++].parent = &tables[i]; + } + if ( haslcar ) { + tables[i].children[j].label = uc_copy("'lcar' Ligature Caret Table"); + tables[i].children[j].tag = CHR('l','c','a','r'); + tables[i].children[j].build = BuildLcar; + tables[i].children[j++].parent = &tables[i]; + } + if ( hasmorx ) { + tables[i].children[j].label = uc_copy("'morx' Glyph Extended Metamorphasis Table"); + tables[i].children[j].tag = CHR('m','o','r','x'); + tables[i].children[j].build = BuildTable; + tables[i].children[j++].parent = &tables[i]; + } + if ( hasopbd ) { + tables[i].children[j].label = uc_copy("'opbd' Optical Bounds Table"); + tables[i].children[j].tag = CHR('o','p','b','d'); + tables[i].children[j].build = BuildOpticalBounds; + tables[i].children[j++].parent = &tables[i]; + } + if ( hasprop ) { + tables[i].children[j].label = uc_copy("'prop' Glyph Properties Table"); + tables[i].children[j].tag = CHR('p','r','o','p'); + tables[i].children[j].build = BuildProperties; + tables[i].children[j++].parent = &tables[i]; + } + ++i; + } + } + + att->tables = tables; + att->current = tables; +} + +static int _SizeCnt(struct att_dlg *att,struct node *node, int lpos,int depth) { + int i, len; + + if ( node->monospace ) + GDrawSetFont(att->v,att->monofont); + node->lpos = lpos++; + len = 5+8*depth+ att->as + 5 + GDrawGetTextWidth(att->v,node->label,-1,NULL); + if ( len>att->maxl ) att->maxl = len; + if ( node->monospace ) + GDrawSetFont(att->v,att->font); + + if ( node->open ) { + if ( !node->children_checked && node->build!=NULL ) { + (node->build)(node,att); + node->children_checked = true; + } + for ( i=0; icnt; ++i ) + lpos = _SizeCnt(att,&node->children[i],lpos,depth+1); + } +return( lpos ); +} + +static int SizeCnt(struct att_dlg *att,struct node *node, int lpos) { + att->maxl = 0; + GDrawSetFont(att->v,att->font); + while ( node->label ) { + lpos = _SizeCnt(att,node,lpos,0); + ++node; + } + + GScrollBarSetBounds(att->vsb,0,lpos,att->lines_page); + GScrollBarSetBounds(att->hsb,0,att->maxl,att->page_width); + att->open_cnt = lpos; +return( lpos ); +} + +static struct node *NodeFindLPos(struct node *node,int lpos,int *depth) { + forever { + if ( node->lpos==lpos ) +return( node ); + if ( node[1].label!=NULL && node[1].lpos<=lpos ) + ++node; + else if ( node->children==NULL || !node->open ) +return( NULL ); + else { + node = node->children; + ++*depth; + } + } +} + +static struct node *NodeNext(struct node *node,int *depth) { + if ( node->open && node->children && node->children[0].label ) { + ++*depth; +return( node->children ); + } + forever { + if ( node[1].label ) +return( node+1 ); + node = node->parent; + --*depth; + if ( node==NULL ) +return( NULL ); + } +} + +static struct node *NodePrev(struct att_dlg *att, struct node *node,int *depth) { + while ( node->parent!=NULL && node==node->parent->children ) { + node = node->parent; + --*depth; + } + if ( node->parent==NULL && node==att->tables ) +return( NULL ); + --node; + while ( node->open ) { + node = &node->children[node->cnt-1]; + ++*depth; + } +return( node ); +} + +static void AttExpose(struct att_dlg *att,GWindow pixmap,GRect *rect) { + int depth, y; + struct node *node; + GRect r; + Color fg; + + GDrawFillRect(pixmap,rect,GDrawGetDefaultBackground(NULL)); + GDrawSetLineWidth(pixmap,0); + + r.height = r.width = att->as; + y = (rect->y/att->fh) * att->fh + att->as; + depth=0; + node = NodeFindLPos(att->tables,rect->y/att->fh+att->off_top,&depth); + GDrawSetFont(pixmap,att->font); + while ( node!=NULL ) { + r.y = y-att->as+1; + r.x = 5+8*depth - att->off_left; + fg = node==att->current ? 0xff0000 : 0x000000; + if ( node->build || node->children ) { + GDrawDrawRect(pixmap,&r,fg); + GDrawDrawLine(pixmap,r.x+2,r.y+att->as/2,r.x+att->as-2,r.y+att->as/2, + fg); + if ( !node->open ) + GDrawDrawLine(pixmap,r.x+att->as/2,r.y+2,r.x+att->as/2,r.y+att->as-2, + fg); + } + if ( node->monospace ) + GDrawSetFont(pixmap,att->monofont); + GDrawDrawText(pixmap,r.x+r.width+5,y,node->label,-1,NULL,fg); + if ( node->monospace ) + GDrawSetFont(pixmap,att->font); + node = NodeNext(node,&depth); + y += att->fh; + } +} + +static void ATTChangeCurrent(struct att_dlg *att,struct node *node) { + int oldl = att->current->lpos, newl; + GRect r; + if ( node==NULL ) +return; + newl = node->lpos; + att->current = node; + r.x =0; r.width = 3000; + if ( newloff_top || newl>=att->off_top+att->lines_page ) { + att->off_top = newl-att->lines_page/3; + if ( att->off_top<0 ) att->off_top = 0; + GScrollBarSetPos(att->vsb,att->off_top); + GDrawRequestExpose(att->v,NULL,false); + } else if ( newl==oldl+1 ) { + r.y = (oldl-att->off_top)*att->fh; r.height = 2*att->fh; + GDrawRequestExpose(att->v,&r,false); + } else if ( newl==oldl-1 ) { + r.y = (newl-att->off_top)*att->fh; r.height = 2*att->fh; + GDrawRequestExpose(att->v,&r,false); + } else { + r.y = (newl-att->off_top)*att->fh; r.height = att->fh; + GDrawRequestExpose(att->v,&r,false); + r.y = (oldl-att->off_top)*att->fh; r.height = att->fh; + GDrawRequestExpose(att->v,&r,false); + } +} + +static void pututf8(uint32 ch,FILE *file) { + if ( ch<0x80 ) + putc(ch,file); + else if ( ch<0x800 ) { + putc(0xc0 | (ch>>6), file); + putc(0x80 | (ch&0x3f), file); + } else { + putc( 0xe0 | (ch>>12),file ); + putc( 0x80 | ((ch>>6)&0x3f),file ); + putc( 0x80 | (ch&0x3f),file ); + } +} + +static unichar_t txt[] = { '*','.','t','x','t', '\0' }; +static void AttSave(struct att_dlg *att) { + unichar_t *ret = GWidgetSaveAsFile(GStringGetResource(_STR_Save,NULL),NULL, + txt,NULL,NULL); + char *cret; + FILE *file; + unichar_t *pt; + struct node *node; + int depth=0, d; + + if ( ret==NULL ) +return; + cret = u2def_copy(ret); + free(ret); + file = fopen(cret,"w"); + if ( file==NULL ) { + GWidgetErrorR(_STR_SaveFailed,_STR_SaveFailed,cret); + free(cret); +return; + } + free(cret); + + pututf8(0xfeff,file); /* Zero width something or other. Marks this as unicode, utf8 */ + node = NodeFindLPos(att->tables,0,&depth); + while ( node!=NULL ) { + d = depth; + while ( d>=4 ) { + pututf8('\t',file); + d -= 4; + } + while ( d>0 ) { + pututf8(' ',file); + pututf8(' ',file); + --d; + } + if ( !node->build && !node->children ) + pututf8(' ',file); + else if ( node->open ) + pututf8('-',file); + else + pututf8('+',file); + for ( pt=node->label; *pt; ++pt ) + pututf8(*pt,file); + pututf8('\n',file); + node = NodeNext(node,&depth); + } + fclose(file); +} + +static void AttSaveM(GWindow gw, GMenuItem *mi,GEvent *e) { + struct att_dlg *att = (struct att_dlg *) GDrawGetUserData(gw); + AttSave(att); +} + +static GMenuItem att_popuplist[] = { + { { (unichar_t *) _STR_Save, NULL, COLOR_DEFAULT, COLOR_DEFAULT, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 1, 0, 'S' }, 'S', ksm_control, NULL, NULL, AttSaveM }, + { NULL } +}; + +static void AttMouse(struct att_dlg *att,GEvent *event) { + int l, depth, cnt; + struct node *node; + GRect r; + + if ( event->type!=et_mouseup ) +return; + + l = (event->u.mouse.y/att->fh); + depth=0; + node = NodeFindLPos(att->tables,l+att->off_top,&depth); + ATTChangeCurrent(att,node); + if ( event->u.mouse.y > l*att->fh+att->as || + event->u.mouse.x<5+8*depth || + event->u.mouse.x>=5+8*depth+att->as || node==NULL ) +return; /* Not in +/- rectangle */ + node->open = !node->open; + + cnt = SizeCnt(att,att->tables,0); + + r.x = 0; r.width = 3000; + r.y = l*att->fh; r.height = 3000; + GDrawRequestExpose(att->v,&r,false); +} + +static void AttScroll(struct att_dlg *att,struct sbevent *sb) { + int newpos = att->off_top; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= att->lines_page; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += att->lines_page; + break; + case et_sb_bottom: + newpos = att->open_cnt-att->lines_page; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>att->open_cnt-att->lines_page ) + newpos = att->open_cnt-att->lines_page; + if ( newpos<0 ) newpos =0; + if ( newpos!=att->off_top ) { + int diff = newpos-att->off_top; + att->off_top = newpos; + GScrollBarSetPos(att->vsb,att->off_top); + GDrawScroll(att->v,NULL,0,diff*att->fh); + } +} + + +static void AttHScroll(struct att_dlg *att,struct sbevent *sb) { + int newpos = att->off_left; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= att->page_width; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += att->page_width; + break; + case et_sb_bottom: + newpos = att->maxl-att->page_width; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>att->maxl-att->page_width ) + newpos = att->maxl-att->page_width; + if ( newpos<0 ) newpos =0; + if ( newpos!=att->off_left ) { + int diff = newpos-att->off_left; + att->off_left = newpos; + GScrollBarSetPos(att->hsb,att->off_left); + GDrawScroll(att->v,NULL,-diff,0); + } +} + +static void AttResize(struct att_dlg *att,GEvent *event) { + GRect size, wsize; + int lcnt; + int sbsize = GDrawPointsToPixels(att->gw,_GScrollBar_Width); + + GDrawGetSize(att->gw,&size); + lcnt = (size.height-att->bmargin)/att->fh; + GGadgetResize(att->vsb,sbsize,lcnt*att->fh); + GGadgetMove(att->vsb,size.width-sbsize,0); + GGadgetResize(att->hsb,size.width-sbsize,sbsize); + GGadgetMove(att->hsb,0,lcnt*att->fh); + GDrawResize(att->v,size.width-sbsize,lcnt*att->fh); + att->page_width = size.width-sbsize; + att->lines_page = lcnt; + GScrollBarSetBounds(att->vsb,0,att->open_cnt,att->lines_page); + GScrollBarSetBounds(att->vsb,0,att->maxl,att->page_width); + + GGadgetGetSize(att->cancel,&wsize); + GGadgetMove(att->cancel,(size.width-wsize.width)/2,lcnt*att->fh+sbsize+5); + GDrawRequestExpose(att->v,NULL,true); + GDrawRequestExpose(att->gw,NULL,true); +} + +static int AttChar(struct att_dlg *att,GEvent *event) { + int depth = 0; + + switch (event->u.chr.keysym) { + case GK_F1: case GK_Help: + help("showatt.html"); +return( true ); + case GK_Return: case GK_KP_Enter: + att->current->open = !att->current->open; + + att->open_cnt = SizeCnt(att,att->tables,0); + GScrollBarSetBounds(att->vsb,0,att->open_cnt,att->lines_page); + + GDrawRequestExpose(att->v,NULL,false); +return( true ); + case GK_Down: case GK_KP_Down: + ATTChangeCurrent(att,NodeNext(att->current,&depth)); +return( true ); + case GK_Up: case GK_KP_Up: + ATTChangeCurrent(att,NodePrev(att,att->current,&depth)); +return( true ); + case GK_Left: case GK_KP_Left: + ATTChangeCurrent(att,att->current->parent); +return( true ); + case GK_Right: case GK_KP_Right: + if ( !att->current->open ) { + att->current->open = !att->current->open; + + att->open_cnt = SizeCnt(att,att->tables,0); + GScrollBarSetBounds(att->vsb,0,att->open_cnt,att->lines_page); + if ( att->current->children!=NULL ) + att->current = att->current->children; + + GDrawRequestExpose(att->v,NULL,false); + } else + ATTChangeCurrent(att,att->current->children); +return( true ); + case GK_Home: case GK_KP_Home: + ATTChangeCurrent(att,att->tables); +return( true ); + case GK_End: case GK_KP_End: + ATTChangeCurrent(att,NodeFindLPos(att->tables,att->open_cnt-1,&depth)); +return( true ); + case 'S': case 's': + if ( event->u.mouse.state&ksm_control ) + AttSave(att); +return( true ); + } +return( false ); +} + +static int attv_e_h(GWindow gw, GEvent *event) { + struct att_dlg *att = (struct att_dlg *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { +return( GGadgetDispatchEvent(att->vsb,event)); + } + + switch ( event->type ) { + case et_expose: + AttExpose(att,gw,&event->u.expose.rect); + break; + case et_char: +return( AttChar(att,event)); + case et_mousedown: + if ( event->u.mouse.button==3 ) + GMenuCreatePopupMenu(gw,event, att_popuplist); + break; + case et_mouseup: + AttMouse(att,event); + break; + } +return( true ); +} + +static int att_e_h(GWindow gw, GEvent *event) { + struct att_dlg *att = (struct att_dlg *) GDrawGetUserData(gw); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { +return( GGadgetDispatchEvent(att->vsb,event)); + } + + switch ( event->type ) { + case et_expose: + break; + case et_char: +return( AttChar(att,event)); + break; + case et_resize: + if ( event->u.resize.sized ) + AttResize(att,event); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + if ( event->u.control.g == att->vsb ) + AttScroll(att,&event->u.control.u.sb); + else + AttHScroll(att,&event->u.control.u.sb); + break; + case et_buttonactivate: + att->done = true; + break; + } + break; + case et_close: + att->done = true; + break; + } +return( true ); +} + +void ShowAtt(SplineFont *sf) { + struct att_dlg att; + GRect pos; + GWindowAttrs wattrs; + FontRequest rq; + static unichar_t helv[] = { 'h', 'e', 'l', 'v', 'e', 't', 'i', 'c', 'a',',','c','a','l','i','b','a','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + static unichar_t courier[] = { 'c', 'o', 'u', 'r', 'i', 'e', 'r', ',', 'm','o','n','o','s','p','a','c','e',',','c','l','e','a','r','l','y','u',',', 'u','n','i','f','o','n','t', '\0' }; + int as, ds, ld; + GGadgetCreateData gcd[5]; + GTextInfo label[4]; + int sbsize = GDrawPointsToPixels(NULL,_GScrollBar_Width); + + if ( sf->cidmaster ) sf = sf->cidmaster; + + memset( &att,0,sizeof(att)); + att.sf = sf; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + Simple *sim = GDrawGetUserData(GGadgetGetWindow(g)); + int badparse=false; + sim->flags = 0; + if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_Extrema)) ) + sim->flags = sf_ignoreextremum; + if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_Slopes)) ) + sim->flags |= sf_ignoreslopes; + if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_Smooth)) ) + sim->flags |= sf_smoothcurves; + if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_SmoothHV)) ) + sim->flags |= sf_choosehv; + if ( GGadgetIsChecked(GWidgetGetControl(GGadgetGetWindow(g),CID_FlattenBumps)) ) + sim->flags |= sf_forcelines; + sim->err = GetRealR(GGadgetGetWindow(g),CID_Error,_STR_ErrorLimit,&badparse); + if ( sim->flags&sf_smoothcurves ) + sim->tan_bounds= GetRealR(GGadgetGetWindow(g),CID_SmoothTan,_STR_Tangent,&badparse); + if ( sim->flags&sf_forcelines ) + sim->linefixup= GetRealR(GGadgetGetWindow(g),CID_FlattenBound,_STR_BumpSize,&badparse); + if ( badparse ) +return( true ); + olderr_rat = sim->err/sim->em_size; + oldextrema = (sim->flags&sf_ignoreextremum); + oldslopes = (sim->flags&sf_ignoreslopes); + oldsmooth = (sim->flags&sf_smoothcurves); + oldlinefix = (sim->flags&sf_forcelines); + if ( oldsmooth ) { + oldsmooth_tan = sim->tan_bounds; + oldsmoothhv = (sim->flags&sf_choosehv); + } + if ( oldlinefix ) + oldlinefixup_rat = sim->linefixup/sim->em_size; + + sim->done = true; + } +return( true ); +} + +static int Sim_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + Simple *sim = GDrawGetUserData(GGadgetGetWindow(g)); + sim->done = sim->cancelled = true; + } +return( true ); +} + +static int sim_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + Simple *sim = GDrawGetUserData(gw); + sim->done = sim->cancelled = true; + } else if ( event->type == et_char ) { +return( false ); + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } +return( true ); +} + +int SimplifyDlg(SplineFont *sf, struct simplifyinfo *smpl) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[18]; + GTextInfo label[18]; + Simple sim; + char buffer[12], buffer2[12], buffer3[12]; + + memset(&sim,0,sizeof(sim)); + sim.em_size = sf->ascent+sf->descent; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<order2 ) + gcd[6].gd.flags = gg_visible; + else { + gcd[6].gd.flags = gg_enabled|gg_visible; + if ( oldsmooth ) + gcd[6].gd.flags |= gg_cb_on; + } + gcd[6].gd.popup_msg = GStringGetResource(_STR_CurveSmoothingPopup,NULL); + gcd[6].gd.cid = CID_Smooth; + gcd[6].creator = GCheckBoxCreate; + + label[7].text = (unichar_t *) _STR_IfTan; + label[7].text_in_resource = true; + gcd[7].gd.label = &label[7]; + gcd[7].gd.pos.x = 20; gcd[7].gd.pos.y = gcd[6].gd.pos.y+24; + gcd[7].gd.flags = gg_enabled|gg_visible; + if ( sf->order2 ) gcd[7].gd.flags = gg_visible; + gcd[7].creator = GLabelCreate; + + sprintf( buffer2, "%.3g", oldsmooth_tan ); + label[8].text = (unichar_t *) buffer2; + label[8].text_is_1byte = true; + gcd[8].gd.label = &label[8]; + gcd[8].gd.pos.x = 94; gcd[8].gd.pos.y = gcd[7].gd.pos.y-6; + gcd[8].gd.pos.width = 40; + gcd[8].gd.flags = gg_enabled|gg_visible; + if ( sf->order2 ) gcd[8].gd.flags = gg_visible; + gcd[8].gd.cid = CID_SmoothTan; + gcd[8].creator = GTextFieldCreate; + + label[9].text = (unichar_t *) _STR_SnapToHV; + label[9].text_in_resource = true; + gcd[9].gd.label = &label[9]; + gcd[9].gd.pos.x = 17; gcd[9].gd.pos.y = gcd[8].gd.pos.y+24; + if ( sf->order2 ) + gcd[9].gd.flags = gg_visible; + else { + gcd[9].gd.flags = gg_enabled|gg_visible; + if ( oldsmoothhv ) + gcd[9].gd.flags |= gg_cb_on; + } + gcd[9].gd.popup_msg = GStringGetResource(_STR_SnapToHVPopup,NULL); + gcd[9].gd.cid = CID_SmoothHV; + gcd[9].creator = GCheckBoxCreate; + + label[10].text = (unichar_t *) _STR_FlattenBumps; + label[10].text_in_resource = true; + gcd[10].gd.label = &label[10]; + gcd[10].gd.pos.x = 8; gcd[10].gd.pos.y = gcd[9].gd.pos.y+14; + if ( sf->order2 ) + gcd[10].gd.flags = gg_visible; + else { + gcd[10].gd.flags = gg_enabled|gg_visible; + if ( oldlinefix ) + gcd[10].gd.flags |= gg_cb_on; + } + gcd[10].gd.popup_msg = GStringGetResource(_STR_FlattenBumpsPopup,NULL); + gcd[10].gd.cid = CID_FlattenBumps; + gcd[10].creator = GCheckBoxCreate; + + label[11].text = (unichar_t *) _STR_IfSmallerThan; + label[11].text_in_resource = true; + gcd[11].gd.label = &label[11]; + gcd[11].gd.pos.x = 20; gcd[11].gd.pos.y = gcd[10].gd.pos.y+24; + gcd[11].gd.flags = gg_enabled|gg_visible; + if ( sf->order2 ) gcd[11].gd.flags = gg_visible; + gcd[11].creator = GLabelCreate; + + sprintf( buffer3, "%.3g", oldlinefixup_rat*sim.em_size ); + label[12].text = (unichar_t *) buffer3; + label[12].text_is_1byte = true; + gcd[12].gd.label = &label[12]; + gcd[12].gd.pos.x = 90; gcd[12].gd.pos.y = gcd[11].gd.pos.y-6; + gcd[12].gd.pos.width = 40; + gcd[12].gd.flags = gg_enabled|gg_visible; + if ( sf->order2 ) gcd[12].gd.flags = gg_visible; + gcd[12].gd.cid = CID_FlattenBound; + gcd[12].creator = GTextFieldCreate; + + gcd[13].gd.pos.x = gcd[12].gd.pos.x+gcd[12].gd.pos.width+3; + gcd[13].gd.pos.y = gcd[11].gd.pos.y; + gcd[13].gd.flags = gg_visible | gg_enabled ; + if ( sf->order2 ) gcd[13].gd.flags = gg_visible; + label[13].text = (unichar_t *) _STR_EmUnits; + label[13].text_in_resource = true; + gcd[13].gd.label = &label[13]; + gcd[13].creator = GLabelCreate; + + + + + gcd[14].gd.pos.x = 20-3; gcd[14].gd.pos.y = gcd[13].gd.pos.y+30; + gcd[14].gd.pos.width = -1; gcd[14].gd.pos.height = 0; + gcd[14].gd.flags = gg_visible | gg_enabled | gg_but_default; + label[14].text = (unichar_t *) _STR_OK; + label[14].text_in_resource = true; + gcd[14].gd.mnemonic = 'O'; + gcd[14].gd.label = &label[14]; + gcd[14].gd.handle_controlevent = Sim_OK; + gcd[14].creator = GButtonCreate; + + gcd[15].gd.pos.x = -20; gcd[15].gd.pos.y = gcd[14].gd.pos.y+3; + gcd[15].gd.pos.width = -1; gcd[15].gd.pos.height = 0; + gcd[15].gd.flags = gg_visible | gg_enabled | gg_but_cancel; + label[15].text = (unichar_t *) _STR_Cancel; + label[15].text_in_resource = true; + gcd[15].gd.label = &label[15]; + gcd[15].gd.mnemonic = 'C'; + gcd[15].gd.handle_controlevent = Sim_Cancel; + gcd[15].creator = GButtonCreate; + + gcd[16].gd.pos.x = 2; gcd[16].gd.pos.y = 2; + gcd[16].gd.pos.width = pos.width-4; gcd[16].gd.pos.height = pos.height-4; + gcd[16].gd.flags = gg_enabled | gg_visible | gg_pos_in_pixels; + gcd[16].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + GWidgetIndicateFocusGadget(GWidgetGetControl(gw,CID_Error)); + GTextFieldSelect(GWidgetGetControl(gw,CID_Error),0,-1); + + GWidgetHidePalettes(); + GDrawSetVisible(gw,true); + while ( !sim.done ) + GDrawProcessOneEvent(NULL); + GDrawSetVisible(gw,false); + if ( sim.cancelled ) +return( false ); + + smpl->flags = sim.flags; + smpl->err = sim.err; + smpl->tan_bounds = sim.tan_bounds; + smpl->linefixup = sim.linefixup; +return( true ); +} diff --git a/fontforge/splashimage.c b/fontforge/splashimage.c new file mode 100644 index 00000000..c2b4ed48 --- /dev/null +++ b/fontforge/splashimage.c @@ -0,0 +1,18074 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "gdraw.h" + +static uint8 splashimage0_data[] = { + 0xa, 0x4d, 0x65, 0x65, 0x94, 0xab, 0x64, 0x94, + 0x76, 0x23, 0xa, 0xd1, 0x23, 0x23, 0x6d, 0x4d, + 0x78, 0x78, 0x94, 0x65, 0x24, 0x1, 0x67, 0x67, + 0x58, 0x41, 0x60, 0x43, 0xe8, 0x60, 0x59, 0xc9, + 0x22, 0x3f, 0x2c, 0xae, 0xa6, 0x1, 0xb3, 0x2f, + 0x8c, 0xb3, 0xc9, 0x7c, 0x2a, 0x48, 0x22, 0x7f, + 0x22, 0x3f, 0x91, 0x7f, 0xae, 0x5a, 0xae, 0x43, + 0x2a, 0xa8, 0x59, 0xae, 0xe8, 0x91, 0x1d, 0x1f, + 0x66, 0xbe, 0x94, 0x64, 0x8c, 0x8c, 0x2f, 0xe8, + 0x2a, 0x1d, 0x64, 0x52, 0x56, 0x92, 0x92, 0x3f, + 0xa8, 0x1d, 0x64, 0x52, 0x64, 0xac, 0xa, 0x6d, + 0xe3, 0xe3, 0x62, 0x4d, 0x61, 0xbe, 0x37, 0xbe, + 0xbe, 0x62, 0x78, 0xa, 0x23, 0xa, 0xa, 0x29, + 0x41, 0x8c, 0x8c, 0xb3, 0xa0, 0x5b, 0xe7, 0xd5, + 0x6a, 0xef, 0x1b, 0x63, 0x19, 0x7a, 0x87, 0x58, + 0xb3, 0xa6, 0x1, 0x1, 0xa8, 0xc3, 0x87, 0x87, + 0x60, 0x8c, 0xe3, 0xa, 0x62, 0xac, 0x62, 0x78, + 0x37, 0x78, 0x62, 0x4d, 0x66, 0x55, 0x6d, 0x78, + 0xb5, 0xe3, 0x4d, 0xa, 0xd1, 0xa, 0xa, 0x78, + 0x37, 0xa, 0xa, 0xa, 0x4d, 0xe3, 0x62, 0x29, + 0x29, 0xa, 0xa, 0x62, 0xa, 0xa, 0x78, 0xa, + 0x37, 0x4d, 0xd1, 0xa, 0xb5, 0xe3, 0x78, 0xa, + 0xa, 0x78, 0x62, 0xa, 0xa, 0x62, 0xac, 0x61, + 0x61, 0xac, 0x4d, 0xd1, 0xd1, 0x62, 0x23, 0x23, + 0xa, 0x23, 0x23, 0xd1, 0xd1, 0x23, 0xd1, 0xd1, + 0xa, 0xa, 0x29, 0xd1, 0xd1, 0xa, 0x62, 0x23, + 0x23, 0x23, 0x0, 0x23, 0xd1, 0x23, 0x23, 0x23, + 0xa, 0x62, 0x29, 0x62, 0xa, 0xa, 0x29, 0xe3, + 0x4d, 0x78, 0xa, 0xa, 0x23, 0xd1, 0x78, 0x62, + 0xa, 0xb5, 0x24, 0x4d, 0x62, 0xa, 0xb5, 0x62, + 0xa, 0x23, 0xd1, 0xa, 0xa, 0xa, 0x78, 0x6d, + 0xa, 0x62, 0x4d, 0x82, 0x76, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, 0xda, 0xda, + 0x3b, 0x8a, 0x45, 0xa4, 0x58, 0x41, 0xb5, 0x1c, + 0xa, 0x29, 0x29, 0x29, 0x29, 0x4d, 0xad, 0xc3, + 0xa4, 0x87, 0x78, 0xa, 0x23, 0x0, 0xa, 0x23, + 0x0, 0x23, 0x23, 0xa, 0x23, 0xa, 0x23, 0x29, + 0xa, 0xa, 0xa, 0x78, 0xd1, 0x23, 0x23, 0x23, + 0x0, 0x23, 0x0, 0xd1, 0xa, 0xa, 0x23, 0x23, + 0xd1, 0x23, 0x23, 0xd1, 0x23, 0x0, 0x23, 0x0, + 0xd1, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, 0x23, + 0x0, 0xa, 0xa, 0xa, 0x3b, 0x3b, 0x30, 0x1b, + 0x4a, 0xd7, 0xe5, 0x6a, 0xd5, 0xf5, 0x8e, 0x3a, + 0x27, 0x7d, 0x99, 0x3, 0x28, 0x6f, 0x6b, 0x6a, + 0x9c, 0xed, 0x32, 0x47, 0x27, 0x90, 0x26, 0x3, + 0x8b, 0x40, 0x7d, 0x6b, 0x8e, 0x81, 0x27, 0xc2, + 0x7d, 0xbd, 0x8e, 0x3, 0xa9, 0x88, 0x27, 0x35, + 0xa9, 0x40, 0xca, + 0xa, 0x37, 0x66, 0xa7, 0x9e, 0x60, 0xe8, 0x5a, + 0x58, 0x1c, 0xa, 0xd1, 0xa, 0x0, 0xa, 0xa, + 0x78, 0xac, 0xa8, 0xae, 0xa5, 0xc5, 0x77, 0xd9, + 0xe9, 0x2f, 0x50, 0x91, 0x52, 0x52, 0x3f, 0x22, + 0xd6, 0xd0, 0x43, 0x27, 0x35, 0xc5, 0x77, 0x35, + 0xc2, 0x5a, 0x50, 0xa9, 0xfb, 0x22, 0xeb, 0x25, + 0x83, 0x40, 0x40, 0x1e, 0x6b, 0x6b, 0xc8, 0x3d, + 0x43, 0x50, 0x3f, 0x3e, 0xd6, 0x56, 0x3f, 0xb8, + 0x1d, 0xd3, 0x64, 0x4e, 0x35, 0x77, 0x3e, 0x3e, + 0x8b, 0x4e, 0x3f, 0x60, 0xd6, 0xd6, 0xd6, 0xfb, + 0x25, 0x88, 0x2a, 0x91, 0x4e, 0xa8, 0x64, 0xd3, + 0xab, 0x8c, 0xb5, 0xe3, 0x82, 0xbe, 0x4d, 0xbe, + 0xbe, 0x78, 0x62, 0x16, 0x29, 0x23, 0x29, 0x62, + 0x62, 0x29, 0x62, 0x62, 0xe3, 0x8c, 0xa6, 0xae, + 0x77, 0xd5, 0x6e, 0x2, 0xa5, 0xae, 0xf1, 0x67, + 0x67, 0xac, 0xa, 0x4d, 0x66, 0x94, 0x4d, 0xd3, + 0x52, 0xd3, 0xac, 0xa, 0xac, 0xac, 0xb5, 0x6d, + 0xa, 0xa, 0xd1, 0x76, 0xac, 0xac, 0xac, 0x62, + 0x62, 0xac, 0xe3, 0xac, 0xac, 0x78, 0xa, 0xa, + 0x62, 0x76, 0x23, 0x0, 0x78, 0x4d, 0x29, 0xa, + 0x1c, 0x1c, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, + 0x6d, 0x76, 0xa, 0xa, 0x78, 0x78, 0xa, 0x62, + 0x4d, 0x78, 0x4d, 0x4d, 0x4d, 0x4d, 0x6d, 0x62, + 0x78, 0x76, 0xa, 0x23, 0x0, 0x23, 0xd1, 0x23, + 0xd1, 0xa, 0x23, 0xa, 0xa, 0x23, 0xd1, 0x0, + 0x62, 0x76, 0x23, 0xd1, 0xd1, 0xa, 0x23, 0x23, + 0x23, 0xa, 0x23, 0x23, 0xd1, 0x0, 0x0, 0x23, + 0x0, 0xd1, 0xd1, 0x23, 0xd1, 0xa, 0x78, 0x6d, + 0x62, 0xe3, 0x1c, 0xa, 0xa, 0xa, 0xa, 0xa, + 0x23, 0xa, 0x78, 0xa, 0xa, 0x76, 0xa, 0xa, + 0x23, 0xa, 0xd1, 0xa, 0xd1, 0xa, 0xa, 0xd1, + 0xa, 0x23, 0xd1, 0x76, 0x23, 0x34, 0x76, 0x23, + 0x23, 0x23, 0x0, 0x23, 0xa, 0x23, 0x62, 0xa, + 0x6d, 0x29, 0x62, 0x1c, 0xda, 0x58, 0x8c, 0x5, + 0x3b, 0x3b, 0x5, 0x58, 0x1c, 0xa, 0x76, 0x4d, + 0x4d, 0x37, 0x76, 0x23, 0x23, 0x0, 0x23, 0x23, + 0x23, 0x0, 0x23, 0xa, 0xa, 0xd1, 0x23, 0x23, + 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, 0x23, 0xa, + 0x0, 0x23, 0x23, 0xa, 0x23, 0xd1, 0x76, 0x23, + 0x23, 0x0, 0xd1, 0x76, 0x23, 0x0, 0x23, 0x16, + 0xd1, 0x0, 0x23, 0x23, 0xa, 0x23, 0x23, 0xa, + 0x29, 0xa, 0x29, 0x1c, 0x8a, 0x45, 0x45, 0x73, + 0xe, 0xd7, 0xd7, 0xe9, 0xd9, 0x6b, 0x8e, 0xe5, + 0x8f, 0x7d, 0xe5, 0xe5, 0x6c, 0x6c, 0xe5, 0x19, + 0x3a, 0xb9, 0xe0, 0x28, 0xfb, 0x9c, 0x9c, 0x4, + 0x9c, 0xca, 0x7d, 0x99, 0x47, 0xb9, 0x6b, 0xef, + 0xe8, 0x9b, 0x9c, 0x28, 0x27, 0x6b, 0x28, 0x4, + 0x7b, 0xcc, 0x9c, + 0x76, 0xac, 0x82, 0x24, 0x30, 0x2f, 0x2f, 0x1, + 0xd3, 0xa, 0xd1, 0xa, 0x23, 0x29, 0xa, 0xa, + 0x6d, 0x8c, 0x2f, 0x2d, 0x79, 0xf1, 0xd2, 0xa5, + 0x14, 0x49, 0xc3, 0xad, 0x2f, 0x4f, 0x8b, 0xe8, + 0x1b, 0x88, 0xa9, 0x77, 0x5d, 0x91, 0x3e, 0xef, + 0xef, 0xa9, 0x8b, 0xc2, 0x7d, 0x1e, 0x7b, 0xe5, + 0x6b, 0x7c, 0x6b, 0xd7, 0x3, 0x98, 0xe8, 0xd9, + 0xfb, 0x7c, 0x27, 0x8f, 0x1b, 0x7c, 0xd5, 0xa8, + 0x2f, 0x52, 0x59, 0x77, 0xa9, 0x3e, 0x7f, 0xd9, + 0x7e, 0x8b, 0xef, 0xe0, 0x25, 0x4f, 0x6b, 0x47, + 0x9d, 0xb, 0x2c, 0xa8, 0x91, 0x91, 0x2f, 0xa5, + 0x73, 0xe7, 0x96, 0x42, 0x2f, 0x24, 0xb5, 0x4d, + 0x4d, 0x4d, 0xb5, 0x78, 0x4d, 0x4d, 0xb5, 0x78, + 0x29, 0xa, 0xa, 0xa, 0xa, 0x1c, 0x1c, 0x8c, + 0x58, 0x41, 0x52, 0x8c, 0x2f, 0x8c, 0xf1, 0x2f, + 0x62, 0x62, 0x62, 0x29, 0xa, 0xa, 0xd1, 0xd1, + 0x76, 0x76, 0xd1, 0xa, 0xa, 0x29, 0x6, 0x8c, + 0xe3, 0x29, 0x29, 0x23, 0x78, 0xa, 0xd1, 0x23, + 0xa, 0xa, 0x5e, 0xe3, 0x5e, 0x78, 0x3b, 0x29, + 0x62, 0xa, 0xa, 0xa, 0xd1, 0xa, 0x23, 0x23, + 0xd1, 0xd1, 0xa, 0x6d, 0x4d, 0xa, 0x16, 0x78, + 0x76, 0x76, 0xa, 0x76, 0x62, 0xd1, 0x62, 0x6d, + 0x76, 0x29, 0x1c, 0x58, 0xd3, 0x29, 0x62, 0x29, + 0x62, 0x78, 0xd1, 0xd1, 0x23, 0x23, 0x23, 0x23, + 0xd1, 0xa, 0x29, 0xd1, 0x62, 0xd1, 0x23, 0x78, + 0x23, 0xd1, 0x23, 0x23, 0x23, 0x23, 0xa, 0xd1, + 0x76, 0xd1, 0xa, 0xa, 0xd1, 0x23, 0xa, 0x23, + 0xa, 0xa, 0xd1, 0xa, 0xa, 0xd1, 0x62, 0x78, + 0x62, 0x76, 0x78, 0xd1, 0x29, 0x76, 0x76, 0x23, + 0xa, 0xd1, 0x23, 0xa, 0x23, 0xd1, 0xd1, 0xd1, + 0x0, 0xd1, 0x0, 0xd1, 0x23, 0x76, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xa, 0xa, 0xa, 0xd1, 0x23, + 0xa, 0x78, 0x78, 0xa, 0x76, 0xa, 0xa, 0x1c, + 0xda, 0x3b, 0x1c, 0x6d, 0xe3, 0xd3, 0xe3, 0x62, + 0xa, 0x29, 0x37, 0xa, 0x62, 0x4d, 0x4d, 0x16, + 0xd1, 0xa, 0xa, 0xa, 0x23, 0x23, 0x23, 0xd1, + 0x23, 0xa, 0xd1, 0xd1, 0x6d, 0x78, 0xd1, 0x23, + 0x23, 0xd1, 0xa, 0x23, 0x23, 0xa, 0xd1, 0x23, + 0x23, 0x23, 0xa, 0xd1, 0xd1, 0x62, 0xd1, 0xd1, + 0x23, 0x23, 0x23, 0x23, 0x23, 0xa, 0xa, 0xd1, + 0xd1, 0x76, 0xa, 0xa, 0x23, 0x16, 0xa, 0xd1, + 0xa, 0xd1, 0xa, 0xa, 0xa, 0x1c, 0x8c, 0x68, + 0xe8, 0xca, 0x36, 0x32, 0x81, 0xdf, 0xdd, 0xdd, + 0xcc, 0x97, 0x99, 0x3, 0xfd, 0xfd, 0x1e, 0x40, + 0xdf, 0xf8, 0x9, 0xe4, 0xaf, 0xe4, 0xdd, 0x70, + 0x9a, 0xb4, 0x81, 0xdb, 0x51, 0x7, 0xf6, 0x81, + 0xfc, 0xe1, 0xf8, 0xc4, 0xe4, 0x8d, 0xcc, 0x81, + 0xe1, 0x57, 0xb0, + 0x67, 0x64, 0xa8, 0x67, 0x58, 0xe3, 0xe3, 0x41, + 0x4d, 0x6d, 0xa, 0xa, 0x1c, 0x8a, 0x6d, 0x30, + 0x5, 0x8c, 0xd3, 0x58, 0x67, 0x24, 0x67, 0xf1, + 0xf1, 0xf1, 0x2f, 0xf0, 0x6e, 0xc8, 0x9d, 0x6b, + 0x7c, 0x98, 0x2a, 0x2a, 0xe8, 0x7e, 0x88, 0x6b, + 0xfd, 0xc6, 0xd8, 0x6b, 0x6b, 0xe1, 0xd8, 0x47, + 0x6b, 0x7e, 0x98, 0xef, 0x3, 0x8b, 0x8b, 0x6b, + 0xf5, 0xe1, 0x1e, 0x47, 0x6b, 0x88, 0xdb, 0x77, + 0x7f, 0xb8, 0x3e, 0x27, 0x9d, 0x74, 0x90, 0x83, + 0x81, 0x81, 0x36, 0x6b, 0x1e, 0x8b, 0xa9, 0x40, + 0x75, 0x18, 0xeb, 0x8b, 0x40, 0x25, 0x8b, 0x27, + 0x27, 0x8b, 0x3a, 0x3a, 0x51, 0x91, 0x1d, 0x49, + 0x52, 0xb3, 0x52, 0x24, 0xe3, 0xb5, 0xbe, 0x37, + 0x29, 0x29, 0xa, 0x23, 0xa, 0xa, 0xb5, 0x4d, + 0xa, 0x1c, 0x41, 0xd3, 0x4d, 0xe3, 0xd3, 0xab, + 0x6d, 0xa, 0x78, 0x78, 0x76, 0x78, 0xa, 0xa, + 0xd1, 0xd1, 0x62, 0x76, 0x6d, 0x76, 0xac, 0x52, + 0x66, 0x5e, 0xbe, 0x61, 0x76, 0xa, 0x29, 0xa, + 0x76, 0x62, 0x37, 0x37, 0x4d, 0x78, 0xe3, 0x55, + 0x4d, 0x6d, 0x29, 0x37, 0x62, 0x62, 0xa, 0xd1, + 0xa, 0xa, 0xa, 0x62, 0xa, 0xa, 0x76, 0x4d, + 0x37, 0x4d, 0x82, 0x8c, 0xc3, 0x82, 0xb5, 0x82, + 0xbe, 0xe3, 0x5e, 0xac, 0x5e, 0xac, 0x6d, 0x61, + 0x61, 0xf2, 0x62, 0x78, 0xa, 0x6d, 0xa, 0xa, + 0xa, 0x76, 0x4d, 0x78, 0x76, 0xd1, 0xd1, 0x76, + 0x76, 0xa, 0x4d, 0xa, 0xd1, 0xa, 0xa, 0x76, + 0xa, 0x76, 0xd1, 0x76, 0x76, 0xd1, 0xa, 0x29, + 0x37, 0x4d, 0x4d, 0x82, 0x4d, 0x4d, 0x76, 0xd1, + 0xa, 0x62, 0xd1, 0xd1, 0xf2, 0x76, 0xd1, 0x29, + 0x4d, 0x37, 0x76, 0x29, 0x29, 0xd1, 0xd1, 0x23, + 0xd1, 0xa, 0x76, 0x78, 0x61, 0x61, 0x76, 0x78, + 0x62, 0xa, 0xd1, 0x29, 0x23, 0xa, 0xa, 0xd1, + 0x78, 0x76, 0xd1, 0x37, 0x37, 0x37, 0x37, 0x82, + 0x45, 0x68, 0xb5, 0x62, 0xa, 0x62, 0x78, 0x78, + 0x62, 0xf2, 0xa, 0x23, 0x4d, 0x65, 0x55, 0x82, + 0x87, 0x16, 0x76, 0xd1, 0xa, 0xa, 0xa, 0x23, + 0xd1, 0x76, 0xd1, 0x62, 0xa, 0x61, 0x76, 0xa, + 0xa, 0x23, 0x23, 0x23, 0x23, 0xd1, 0xd1, 0xa, + 0xa, 0x23, 0xd1, 0xd1, 0xd1, 0x76, 0x76, 0x23, + 0xa, 0x76, 0xa, 0xd1, 0xd1, 0xd1, 0xd1, 0x76, + 0x78, 0xa, 0x37, 0xa, 0xa, 0x16, 0x6d, 0xa, + 0x62, 0x62, 0x62, 0xa, 0xa, 0x29, 0x4d, 0x87, + 0x59, 0x27, 0xf5, 0x81, 0xdf, 0x39, 0x39, 0xf6, + 0x85, 0xe1, 0x8b, 0x4f, 0x8b, 0xf8, 0xce, 0x9c, + 0x90, 0xdf, 0xbd, 0x12, 0xb4, 0xce, 0x90, 0x90, + 0x74, 0xe1, 0xd8, 0x88, 0x88, 0xca, 0x1e, 0xde, + 0xdd, 0xc6, 0xca, 0x99, 0xbd, 0xe4, 0x84, 0xdf, + 0x39, 0x53, 0xc6, + 0x91, 0x91, 0xb8, 0xe8, 0xa6, 0x8c, 0x82, 0x62, + 0xa, 0x78, 0xa, 0xd1, 0x62, 0x6d, 0xb3, 0x42, + 0x2f, 0x49, 0x8c, 0x30, 0x8, 0x2f, 0x68, 0x8, + 0x79, 0xe9, 0xa5, 0xd2, 0xd5, 0x3a, 0x53, 0x9d, + 0x8b, 0x48, 0xdb, 0x8b, 0x8b, 0xf6, 0xc6, 0xd8, + 0xe1, 0xe1, 0x85, 0x84, 0x75, 0x53, 0xba, 0xd8, + 0x81, 0xcb, 0xdb, 0x90, 0x90, 0x9b, 0xfa, 0xc6, + 0xc6, 0xe1, 0x57, 0xd8, 0xf6, 0x53, 0xb, 0x18, + 0xf6, 0x40, 0x18, 0x74, 0x81, 0x4b, 0xe1, 0xe1, + 0xe1, 0xbc, 0xdb, 0xbc, 0x75, 0x57, 0xa2, 0xf6, + 0x70, 0x75, 0x9f, 0x81, 0xf6, 0x90, 0x40, 0x9f, + 0x75, 0x74, 0xb, 0xb, 0xdc, 0xdc, 0x91, 0xd6, + 0x5c, 0x4f, 0x7e, 0x4e, 0xc3, 0xc3, 0xab, 0x37, + 0x4d, 0x78, 0x76, 0xa, 0xa, 0x29, 0x55, 0x5e, + 0x78, 0x29, 0xa, 0x6d, 0x62, 0x62, 0xa, 0x78, + 0xd1, 0x62, 0xd1, 0xd1, 0x78, 0xa, 0xa, 0x62, + 0xa, 0xa, 0x29, 0x62, 0xa, 0xac, 0xa, 0x78, + 0x78, 0xac, 0x66, 0x61, 0x37, 0x29, 0x29, 0x82, + 0x62, 0x29, 0x6d, 0x78, 0x4d, 0xac, 0xbe, 0x37, + 0x37, 0x82, 0x1, 0xa7, 0xa, 0xa, 0x16, 0xa, + 0x23, 0xa, 0xa, 0xa, 0x62, 0xa, 0xa, 0x37, + 0x76, 0x1c, 0xb3, 0x7e, 0xe8, 0x59, 0xa4, 0xb3, + 0xbe, 0xd3, 0xe3, 0x6d, 0x76, 0xac, 0x37, 0xac, + 0x61, 0x37, 0x29, 0x65, 0x61, 0x37, 0x4d, 0x4d, + 0xa, 0x4d, 0x78, 0x37, 0x76, 0xd1, 0xd1, 0x37, + 0x76, 0xd1, 0x4d, 0x4d, 0x76, 0xd1, 0x78, 0x78, + 0x76, 0x78, 0x6d, 0x4d, 0xa, 0x76, 0x78, 0xb5, + 0x59, 0x5e, 0x87, 0x45, 0xbe, 0xe3, 0x4d, 0x78, + 0x62, 0xa, 0x76, 0x62, 0x29, 0x76, 0xa, 0xb5, + 0x24, 0x61, 0xa, 0x6d, 0x29, 0x62, 0xa, 0x62, + 0x29, 0xa, 0xa, 0x78, 0x78, 0x76, 0x78, 0xd1, + 0xa, 0x37, 0x78, 0x76, 0x62, 0x78, 0x78, 0xe3, + 0x29, 0x78, 0x37, 0xd1, 0xa, 0x4d, 0x37, 0x29, + 0xda, 0x87, 0xe3, 0x6d, 0x29, 0x78, 0xf2, 0x4d, + 0x78, 0x37, 0xd1, 0x23, 0x29, 0x55, 0x66, 0xbe, + 0x82, 0x6d, 0x37, 0xd1, 0x29, 0xd1, 0x62, 0x29, + 0xd1, 0xa, 0xd1, 0xa, 0xa, 0x4d, 0xa, 0x76, + 0xa, 0xd1, 0x23, 0x23, 0x23, 0xd1, 0xd1, 0xd1, + 0x78, 0x76, 0xd1, 0x23, 0x23, 0x23, 0xd1, 0xd1, + 0xd1, 0xa, 0x62, 0x23, 0xa, 0x29, 0xd1, 0x62, + 0xd1, 0x62, 0x76, 0x78, 0x78, 0x29, 0x4d, 0x76, + 0x78, 0x16, 0x76, 0xa, 0x78, 0xb5, 0x1c, 0xe3, + 0xad, 0xef, 0x47, 0x47, 0x71, 0xca, 0x6b, 0xa9, + 0x53, 0x81, 0x9c, 0x7d, 0x9c, 0x9c, 0x6c, 0x4, + 0xdf, 0x9c, 0x4, 0x8e, 0x57, 0x8e, 0x9c, 0x99, + 0x9f, 0x8e, 0x4, 0x6f, 0xca, 0x4, 0x47, 0x6c, + 0x8e, 0xb9, 0x9c, 0x9c, 0x26, 0xbc, 0xfd, 0x9c, + 0x7b, 0xdf, 0xbd, + 0xeb, 0x48, 0x5c, 0xfb, 0x77, 0xa5, 0x68, 0x3b, + 0x1c, 0x29, 0x29, 0x62, 0x29, 0x6d, 0x6, 0x5a, + 0xe, 0x60, 0xc3, 0x73, 0x1b, 0xa5, 0x2f, 0x30, + 0x30, 0x2f, 0x1, 0xd2, 0xd2, 0x5d, 0x7a, 0x3, + 0x9d, 0x8b, 0x88, 0x39, 0x90, 0x84, 0xc6, 0x75, + 0x90, 0x5c, 0x53, 0x9f, 0x81, 0xa2, 0xeb, 0x8b, + 0xc6, 0x81, 0xd8, 0x83, 0x7d, 0xd8, 0x9f, 0x9d, + 0x71, 0x18, 0xdb, 0x40, 0xd8, 0x84, 0xcb, 0x7d, + 0x40, 0x81, 0x75, 0x90, 0x39, 0x8b, 0x53, 0x53, + 0x57, 0x74, 0x48, 0x8b, 0x70, 0x81, 0x81, 0x39, + 0x39, 0x81, 0x1e, 0x9d, 0x90, 0x88, 0x7f, 0xdb, + 0x9f, 0x40, 0x88, 0x5c, 0x40, 0xd8, 0x8b, 0x8b, + 0x88, 0x7d, 0xa9, 0x98, 0x2a, 0x4e, 0xc3, 0x82, + 0x82, 0xbe, 0xa, 0x62, 0xa, 0x62, 0x4d, 0x4d, + 0x78, 0x29, 0x29, 0xa, 0x76, 0x62, 0x62, 0xd1, + 0xa, 0x62, 0x29, 0x76, 0xd1, 0xa, 0xa, 0xa, + 0x23, 0x29, 0xa, 0x78, 0xac, 0xe3, 0xe3, 0xda, + 0x29, 0x4d, 0xbe, 0xac, 0x76, 0x78, 0x78, 0xac, + 0x76, 0x82, 0x82, 0x8a, 0x82, 0xb3, 0x68, 0xb3, + 0x24, 0x87, 0xa6, 0x8c, 0x62, 0xa, 0xd1, 0xa, + 0xa, 0x23, 0xa, 0x62, 0xa, 0x16, 0x6d, 0x87, + 0x82, 0x82, 0xad, 0x43, 0x91, 0xa8, 0x59, 0x52, + 0x52, 0x87, 0xa6, 0xb3, 0x8c, 0xe3, 0x8c, 0x82, + 0x62, 0x78, 0x78, 0x61, 0xac, 0xac, 0x82, 0x61, + 0x1c, 0x61, 0x24, 0x8a, 0x4d, 0x76, 0x62, 0x76, + 0xa, 0x76, 0x4d, 0xa, 0xa, 0x76, 0x4d, 0xbe, + 0xbe, 0xb5, 0x65, 0xad, 0xb3, 0x1c, 0x87, 0x2f, + 0x67, 0xd3, 0xab, 0x65, 0xab, 0x8c, 0xab, 0xa7, + 0x58, 0x82, 0x82, 0xa0, 0x68, 0x4d, 0x4d, 0x6, + 0xb5, 0xac, 0xac, 0x4d, 0xe3, 0x4d, 0xb5, 0x58, + 0x5, 0x58, 0x6d, 0x29, 0x6d, 0x78, 0x78, 0x29, + 0x78, 0x78, 0x4d, 0x78, 0x82, 0x65, 0x1, 0xad, + 0x79, 0x2f, 0x82, 0xb5, 0x82, 0x6d, 0x29, 0x78, + 0x29, 0x62, 0x62, 0x29, 0x78, 0x29, 0x62, 0x29, + 0x6d, 0x3b, 0xa, 0xa, 0x62, 0x37, 0x78, 0x76, + 0x4d, 0x61, 0x37, 0xa, 0x5, 0x87, 0x29, 0x62, + 0xe3, 0x76, 0x29, 0x78, 0x62, 0xd1, 0x62, 0xa, + 0x62, 0x76, 0xa, 0x23, 0x16, 0x16, 0x76, 0x76, + 0x29, 0xa, 0xa, 0xa, 0x23, 0xd1, 0x62, 0x76, + 0xa, 0x76, 0xa, 0xa, 0x16, 0x5, 0x16, 0x78, + 0x4d, 0x29, 0x6d, 0xa, 0x4d, 0xe3, 0xe3, 0xe3, + 0x76, 0x78, 0x78, 0x62, 0x29, 0xa4, 0x45, 0xa4, + 0xa5, 0x27, 0xe5, 0x3a, 0x18, 0x81, 0x9c, 0x47, + 0x86, 0x9c, 0x6c, 0x6c, 0xfd, 0x47, 0xe5, 0x4, + 0x40, 0xfd, 0x4, 0x6f, 0x90, 0xce, 0x4, 0x32, + 0xe4, 0x9c, 0x4, 0x97, 0xfd, 0x3, 0x9b, 0x28, + 0x47, 0x3a, 0x9b, 0x4, 0xf8, 0xc4, 0x26, 0x97, + 0x12, 0xbf, 0xf3, + 0xe5, 0xc2, 0xd9, 0xa5, 0x2f, 0xd3, 0x4d, 0x1c, + 0xa, 0xa, 0x78, 0x8a, 0x30, 0xa0, 0x42, 0x63, + 0x19, 0x2, 0x41, 0x8a, 0x58, 0x41, 0x62, 0xa, + 0xb5, 0xd3, 0x58, 0xf1, 0xd2, 0x63, 0x19, 0x4a, + 0x11, 0x28, 0x6b, 0x27, 0xef, 0x18, 0xdb, 0xa9, + 0xef, 0x27, 0x27, 0xe5, 0x9c, 0xb9, 0x6b, 0x9c, + 0x9c, 0x2e, 0x9d, 0x3, 0xef, 0x8b, 0x98, 0xa9, + 0x47, 0x3, 0x6b, 0x47, 0x32, 0x81, 0x6f, 0xe5, + 0x1e, 0xd8, 0x3a, 0x5d, 0x27, 0x6b, 0x77, 0xef, + 0xfd, 0xfd, 0xe5, 0xe5, 0x36, 0xbd, 0x47, 0x47, + 0xd8, 0xd8, 0x3, 0xa9, 0x6b, 0x83, 0x3, 0x8f, + 0xd8, 0x2e, 0x4, 0x47, 0x2e, 0x1e, 0x9c, 0x3a, + 0x8b, 0xc8, 0x27, 0x91, 0x2a, 0x8b, 0xef, 0x77, + 0xe8, 0x77, 0x68, 0xb5, 0x29, 0x78, 0x4d, 0x4d, + 0x78, 0xa, 0xa, 0x78, 0x78, 0x8a, 0x6d, 0xb5, + 0x1c, 0x87, 0xe3, 0x78, 0xa, 0x23, 0xa, 0x76, + 0xa, 0xd1, 0xa, 0x62, 0xe3, 0xad, 0x73, 0xa8, + 0x1, 0x8c, 0x82, 0xac, 0x78, 0x29, 0xa, 0xa, + 0xa, 0x2f, 0x6e, 0xfb, 0x2a, 0xc5, 0xef, 0x7c, + 0xa5, 0xa5, 0x7a, 0xa7, 0xbe, 0xe3, 0x62, 0xa, + 0xd1, 0x62, 0x29, 0x4d, 0x4d, 0xda, 0x5b, 0xd4, + 0xa8, 0xa8, 0x3e, 0x7e, 0xa8, 0xa8, 0xe8, 0xeb, + 0x4e, 0x77, 0x8b, 0x40, 0x3e, 0x2c, 0xe8, 0x59, + 0x52, 0xd3, 0xbe, 0xbe, 0xbe, 0x82, 0xa8, 0x38, + 0x49, 0x52, 0xc9, 0x22, 0x2c, 0x24, 0x55, 0x82, + 0xbe, 0xb5, 0x24, 0x82, 0x29, 0xe3, 0x67, 0x4e, + 0xc7, 0x49, 0x4e, 0x5c, 0x77, 0x2c, 0x91, 0x3e, + 0x64, 0xa8, 0xa8, 0x7f, 0x4e, 0x49, 0x52, 0x4e, + 0xe8, 0x49, 0xb8, 0x59, 0x4e, 0x49, 0x1d, 0x49, + 0x52, 0x65, 0x24, 0x8c, 0x8c, 0x82, 0x87, 0xd4, + 0x77, 0x91, 0x52, 0x52, 0x65, 0x65, 0x1, 0x1, + 0x8c, 0x82, 0xbe, 0x2f, 0xe8, 0xb8, 0xa8, 0xd4, + 0x4f, 0x3f, 0x91, 0x1d, 0x52, 0x87, 0x94, 0xab, + 0x87, 0xb5, 0x4d, 0x82, 0x4d, 0x4d, 0x78, 0x4d, + 0x82, 0x4d, 0x37, 0xab, 0x82, 0xc3, 0x82, 0xc3, + 0x60, 0xc3, 0x82, 0xbe, 0xa7, 0x1f, 0x55, 0x82, + 0x65, 0x55, 0xab, 0x64, 0x64, 0xc3, 0xb3, 0x87, + 0x8c, 0x8c, 0xb5, 0x29, 0x5e, 0x61, 0x4d, 0xbe, + 0x37, 0x55, 0x61, 0x55, 0xab, 0x8c, 0x82, 0x55, + 0x82, 0x82, 0x6d, 0x29, 0x66, 0xa7, 0x1f, 0x94, + 0x52, 0x9e, 0xc3, 0xc3, 0x60, 0xe8, 0x60, 0x8c, + 0xb5, 0x82, 0x29, 0x78, 0xe3, 0xc3, 0xa8, 0x22, + 0x51, 0xf6, 0x39, 0xca, 0xc6, 0xaf, 0xe4, 0x9, + 0x90, 0xdf, 0xc0, 0x75, 0xdb, 0x88, 0x7d, 0xf6, + 0x75, 0x70, 0xc6, 0xdf, 0xdf, 0xc6, 0xb4, 0xbf, + 0xf9, 0x39, 0xde, 0xc6, 0xa2, 0xcb, 0x8b, 0x7d, + 0xca, 0xc6, 0x81, 0xe4, 0xf7, 0xdf, 0xf7, 0x95, + 0xbf, 0xcd, 0xe1, + 0x3, 0x3, 0xa9, 0x50, 0xd3, 0x76, 0x78, 0x62, + 0xa, 0xd1, 0x1c, 0x58, 0xd2, 0x63, 0x19, 0x19, + 0x19, 0xd2, 0x67, 0x41, 0x62, 0x62, 0x62, 0xe3, + 0xda, 0xa, 0x24, 0x30, 0xd2, 0x6e, 0xc5, 0xc5, + 0x4a, 0xa9, 0x98, 0x3e, 0x9d, 0xfb, 0x7e, 0x27, + 0xfd, 0xfa, 0xde, 0x47, 0xfd, 0xc6, 0x9b, 0x3, + 0x9d, 0x90, 0x51, 0x2a, 0x9d, 0x81, 0x83, 0x27, + 0x71, 0xc6, 0xe4, 0x36, 0x83, 0x84, 0xd8, 0x9d, + 0xd8, 0x8b, 0x2a, 0x98, 0x81, 0xe1, 0x1e, 0x83, + 0x99, 0xf3, 0xfd, 0xfd, 0x81, 0x90, 0x8b, 0x51, + 0xd8, 0x81, 0x39, 0x27, 0xd8, 0xb4, 0x9c, 0xf5, + 0x90, 0x81, 0xde, 0xd8, 0x84, 0xc6, 0x25, 0x98, + 0x51, 0x1e, 0x6b, 0x8b, 0x90, 0x81, 0xd8, 0x9f, + 0x88, 0x38, 0x4e, 0x64, 0x52, 0xab, 0x4d, 0x29, + 0x61, 0xe3, 0xe3, 0x78, 0x76, 0x82, 0x65, 0x94, + 0x94, 0x55, 0x65, 0x61, 0x66, 0x62, 0x37, 0x78, + 0x76, 0x82, 0x58, 0x6d, 0x82, 0x59, 0x2a, 0x91, + 0x56, 0xf, 0x52, 0xa7, 0x52, 0x65, 0x8c, 0xe3, + 0x24, 0x7a, 0x3a, 0x53, 0x88, 0x5c, 0x8b, 0x40, + 0xb, 0x91, 0x3f, 0xa6, 0xa7, 0x52, 0x8c, 0xd3, + 0x6d, 0x4d, 0x82, 0x82, 0x82, 0x87, 0x59, 0x22, + 0x22, 0x91, 0x51, 0x88, 0x7c, 0x25, 0xc8, 0xf6, + 0x7e, 0x4f, 0x9d, 0x75, 0x53, 0x80, 0x91, 0x22, + 0x22, 0x3f, 0x91, 0x60, 0x59, 0x60, 0xa9, 0x9f, + 0x22, 0x59, 0x91, 0x48, 0x3f, 0x1d, 0xf, 0x9e, + 0x59, 0xa8, 0xb8, 0x3e, 0xc7, 0xa6, 0x60, 0x8b, + 0x3e, 0xa8, 0xb8, 0x4f, 0x53, 0x48, 0x48, 0xeb, + 0x4f, 0x7e, 0x88, 0x9f, 0x9d, 0xe8, 0xb8, 0x2a, + 0x48, 0x1d, 0x1d, 0xb8, 0x22, 0x48, 0x48, 0xeb, + 0x88, 0xa5, 0xe8, 0xe8, 0xe8, 0x67, 0x8c, 0xb8, + 0x22, 0x1d, 0x1d, 0x3f, 0xa5, 0x3e, 0x91, 0x3e, + 0x7e, 0x4e, 0x5a, 0x48, 0x25, 0x2a, 0x3f, 0x3f, + 0x3e, 0x80, 0x91, 0x91, 0xe8, 0xe8, 0x4e, 0x3e, + 0x77, 0x7a, 0x82, 0xbe, 0xb5, 0xac, 0x76, 0xbe, + 0x37, 0x6d, 0x55, 0x49, 0x22, 0xc9, 0xd4, 0x27, + 0x9d, 0x7e, 0xa8, 0xab, 0xa7, 0xab, 0xab, 0xab, + 0x52, 0x9e, 0x4e, 0x3e, 0x2a, 0x8b, 0x4f, 0xe9, + 0xe8, 0x3e, 0x49, 0xd3, 0xab, 0x8c, 0x82, 0xab, + 0x52, 0xa8, 0x52, 0x52, 0x1d, 0x3e, 0x60, 0x1, + 0x49, 0x49, 0x52, 0xab, 0x52, 0x64, 0x52, 0x52, + 0xb8, 0x13, 0x27, 0x6b, 0x8b, 0x1e, 0x8b, 0xe8, + 0x52, 0x52, 0xd3, 0x4d, 0x82, 0xa8, 0x4e, 0x5c, + 0xd8, 0xc6, 0xf3, 0x12, 0x9, 0xb4, 0xce, 0xe4, + 0x9f, 0x40, 0xd8, 0x1e, 0xcb, 0x90, 0x9c, 0xce, + 0xe4, 0xe4, 0xf3, 0xbd, 0x81, 0xe1, 0x81, 0xe4, + 0x7, 0x40, 0xde, 0x81, 0x9b, 0x83, 0xc8, 0x9c, + 0x8e, 0xdd, 0xdd, 0xc4, 0xcc, 0xc6, 0x2e, 0xbd, + 0xbf, 0xf4, 0x75, + 0x27, 0x98, 0x48, 0x91, 0x52, 0xbe, 0x62, 0x62, + 0xd1, 0xa, 0x16, 0x67, 0xa5, 0xa5, 0xd5, 0xd4, + 0x1b, 0xc5, 0x50, 0x2f, 0x58, 0x8a, 0x8a, 0x62, + 0x41, 0x78, 0x6d, 0x8a, 0x2f, 0xf1, 0x5d, 0x2f, + 0x96, 0xe8, 0x91, 0xa9, 0x90, 0x18, 0x88, 0x83, + 0x81, 0xe1, 0x84, 0x90, 0x90, 0xd8, 0x74, 0x51, + 0x18, 0x39, 0x88, 0x40, 0xd8, 0xe1, 0x90, 0x99, + 0xf8, 0xe4, 0x85, 0x40, 0x18, 0x39, 0x74, 0xb, + 0x75, 0x90, 0x88, 0x8b, 0xc6, 0x84, 0xc6, 0x39, + 0x4b, 0xe4, 0xb0, 0x9f, 0x18, 0x39, 0x8b, 0x53, + 0x75, 0x81, 0x90, 0x7d, 0xfa, 0xe1, 0xe1, 0x90, + 0x39, 0x81, 0x84, 0x74, 0xcb, 0xf6, 0x7d, 0x53, + 0xf6, 0x81, 0x90, 0x39, 0x90, 0x84, 0x81, 0x74, + 0xeb, 0x38, 0x91, 0x92, 0x1d, 0x49, 0x87, 0x24, + 0xb3, 0x2f, 0x8c, 0xd3, 0x82, 0xd3, 0x55, 0x66, + 0x66, 0xb6, 0x55, 0x52, 0x52, 0x1d, 0x1, 0x24, + 0x24, 0x67, 0x60, 0x67, 0x1, 0xa8, 0x3e, 0x91, + 0x1d, 0x3f, 0x4e, 0x91, 0x2c, 0x91, 0x50, 0x60, + 0x67, 0xe8, 0x40, 0x53, 0xb, 0x7e, 0x8b, 0x53, + 0xb, 0xb, 0x7e, 0x7e, 0x2c, 0x91, 0x22, 0xa8, + 0x65, 0xab, 0xab, 0x52, 0xab, 0x49, 0x22, 0xa9, + 0x51, 0x51, 0x90, 0x90, 0x1e, 0x9d, 0x81, 0xc6, + 0x9d, 0xa9, 0xdb, 0x57, 0xa2, 0x80, 0xb, 0x88, + 0xdb, 0x2a, 0x18, 0x88, 0xfb, 0x7c, 0x8b, 0x9f, + 0x2a, 0x2c, 0xb8, 0x91, 0x91, 0x1d, 0x91, 0x7e, + 0xe8, 0x7c, 0xa9, 0x8b, 0x7c, 0x77, 0xe8, 0x8b, + 0x8b, 0x50, 0x3f, 0x7e, 0x9d, 0xdb, 0x18, 0x8b, + 0x8b, 0x6b, 0xd8, 0x81, 0xd8, 0xa9, 0x91, 0x3e, + 0x7f, 0x50, 0x91, 0xeb, 0xa9, 0x8b, 0x18, 0x9f, + 0x83, 0x27, 0x8b, 0xa9, 0x2a, 0x50, 0xa8, 0x91, + 0xb8, 0xa8, 0x2c, 0x3e, 0x35, 0x9d, 0x18, 0xdb, + 0x27, 0x27, 0x3e, 0x91, 0x8b, 0x8b, 0x98, 0x91, + 0x2a, 0x2a, 0x7f, 0x2a, 0x25, 0x27, 0x27, 0x77, + 0x5d, 0x5d, 0x64, 0xab, 0x24, 0x8c, 0x8c, 0x8c, + 0x8c, 0x8c, 0x8c, 0xb8, 0x7c, 0xeb, 0x13, 0x27, + 0x8b, 0xdb, 0x91, 0x49, 0x2c, 0xa8, 0x67, 0x67, + 0x21, 0x4e, 0x4e, 0xc2, 0x27, 0xc8, 0x8b, 0x5d, + 0x91, 0x48, 0x50, 0xa8, 0x49, 0xa8, 0x67, 0xa8, + 0x4e, 0xd6, 0x64, 0xa8, 0x3f, 0x48, 0x3e, 0x2c, + 0x1d, 0x91, 0x2c, 0xa8, 0x2c, 0x22, 0x60, 0x60, + 0x7f, 0xc8, 0x47, 0xe5, 0x9d, 0x18, 0x27, 0x5d, + 0x91, 0x49, 0xb3, 0x8c, 0x2f, 0x7a, 0xc5, 0xc2, + 0x39, 0x9c, 0x9c, 0x32, 0xbd, 0xc6, 0x32, 0xb1, + 0x9f, 0x9f, 0x47, 0x6f, 0xfd, 0xed, 0x4, 0x9c, + 0xb4, 0xdf, 0x4, 0x32, 0x81, 0x40, 0x83, 0xf5, + 0xc6, 0x36, 0x4, 0x6f, 0x1e, 0x4, 0x6f, 0x6c, + 0x4, 0x8e, 0x6b, 0x28, 0x32, 0xbd, 0xc8, 0xfd, + 0xdf, 0xe4, 0xbd, + 0x8b, 0xdb, 0x48, 0x22, 0xc9, 0x30, 0x58, 0x58, + 0x8a, 0x1c, 0xda, 0x41, 0x87, 0x24, 0x2f, 0x6e, + 0x63, 0x6e, 0x6e, 0x6e, 0x63, 0x89, 0x30, 0x8a, + 0x29, 0xd1, 0xd1, 0x76, 0x37, 0xac, 0xab, 0x8c, + 0x2f, 0x77, 0x27, 0x8b, 0x47, 0x6a, 0x7d, 0x9d, + 0x9d, 0xc6, 0x53, 0x51, 0x8b, 0x86, 0x9f, 0x90, + 0x90, 0x9c, 0x9c, 0xfd, 0xf8, 0xe4, 0x81, 0x18, + 0x9f, 0xe1, 0x57, 0x2a, 0x8b, 0xd8, 0xc6, 0x1e, + 0x9b, 0x81, 0x1e, 0x36, 0x7, 0xe1, 0x81, 0x40, + 0x9f, 0x75, 0xc6, 0xdb, 0xf6, 0xc6, 0x9c, 0xde, + 0x81, 0xb4, 0xde, 0x1e, 0x71, 0x84, 0xd8, 0xdb, + 0x51, 0xc6, 0xd8, 0xc6, 0x71, 0xe1, 0xfd, 0xbd, + 0x81, 0x7, 0x1e, 0x9d, 0xcf, 0x53, 0x1e, 0x98, + 0x48, 0x7f, 0x3e, 0x22, 0x7f, 0x88, 0xa3, 0xa5, + 0x2a, 0x3e, 0x5d, 0xa8, 0x49, 0x49, 0x67, 0xa6, + 0xa8, 0x4e, 0xa8, 0xa8, 0x1d, 0x91, 0x4e, 0x2c, + 0x2c, 0x2c, 0xa9, 0xe8, 0x4e, 0x4e, 0xe8, 0x77, + 0xfb, 0x27, 0x27, 0x3, 0x8b, 0xa9, 0x77, 0x27, + 0xe8, 0x91, 0x2a, 0x8b, 0x51, 0x2a, 0x9d, 0xd8, + 0x90, 0x27, 0x6b, 0xa9, 0x2a, 0x2c, 0x3e, 0x98, + 0x2c, 0x2c, 0x2c, 0x4e, 0x60, 0xe7, 0x27, 0xd8, + 0x1e, 0x47, 0x9b, 0xce, 0xde, 0x3, 0x74, 0xcf, + 0x1e, 0x2a, 0x18, 0x75, 0x83, 0x47, 0xf5, 0x71, + 0x1e, 0x3, 0x8b, 0xd8, 0x3, 0x5d, 0x98, 0x9d, + 0x27, 0xa9, 0x2a, 0x8b, 0x7c, 0xd9, 0x8b, 0x1e, + 0x3, 0xef, 0xa9, 0x8b, 0x15, 0x5d, 0x48, 0x2a, + 0x27, 0x27, 0x25, 0x3d, 0x6a, 0x7d, 0x90, 0x1e, + 0xe5, 0x47, 0x51, 0x51, 0x6b, 0x9b, 0xdb, 0x8b, + 0x27, 0x27, 0x1e, 0x47, 0x6f, 0x47, 0x90, 0x1e, + 0x47, 0x3, 0x51, 0x91, 0x5d, 0x7c, 0x51, 0xa9, + 0xd9, 0xd9, 0x27, 0x6b, 0xd7, 0x54, 0x8b, 0x2a, + 0x27, 0x9d, 0x51, 0x48, 0x4f, 0x8b, 0x83, 0x9b, + 0xe5, 0x6b, 0x7d, 0xd5, 0xd7, 0xe5, 0x5d, 0x2f, + 0x64, 0x60, 0x4e, 0x14, 0xc9, 0xc9, 0xc2, 0xd5, + 0xd5, 0xef, 0x89, 0xc9, 0x5d, 0x3e, 0xe8, 0x50, + 0x4e, 0x5c, 0xa9, 0xe8, 0xe8, 0x4f, 0xd9, 0x8f, + 0xe0, 0x27, 0xef, 0xd9, 0xa9, 0x1e, 0x15, 0x5d, + 0xe8, 0x4f, 0x27, 0xd5, 0x27, 0x8b, 0xd9, 0x6e, + 0xfb, 0x8b, 0x77, 0x7a, 0xa8, 0x91, 0x3e, 0xa5, + 0x3e, 0x5c, 0xd9, 0xef, 0x1e, 0x90, 0x6c, 0x6e, + 0x27, 0xd8, 0xe5, 0x3, 0x3e, 0x7e, 0xef, 0xef, + 0xfb, 0x3e, 0xd4, 0x6e, 0x6b, 0x9b, 0xe5, 0x8f, + 0x7d, 0x47, 0x4, 0x4, 0xc6, 0x83, 0x6f, 0x32, + 0xb1, 0x8e, 0x4, 0xe5, 0x99, 0x8e, 0x4, 0x93, + 0x90, 0x7c, 0x47, 0x32, 0x81, 0x8b, 0x6b, 0x9c, + 0xf3, 0x93, 0x4, 0x6f, 0x7d, 0x3, 0xd7, 0x9b, + 0x97, 0x1e, 0x27, 0x6b, 0x26, 0xaf, 0x93, 0x9c, + 0xed, 0xaf, 0xc0, + 0xe5, 0x6b, 0x7c, 0x77, 0x60, 0xd3, 0x24, 0x82, + 0xb5, 0x8a, 0x8, 0xf1, 0x42, 0x89, 0x63, 0x19, + 0x63, 0x42, 0x1b, 0x63, 0x63, 0xd2, 0x2f, 0x41, + 0x58, 0x82, 0x1c, 0x1c, 0xa, 0x62, 0x1c, 0x58, + 0x67, 0x2f, 0xe7, 0xd2, 0xd5, 0xd5, 0x77, 0x50, + 0x77, 0x83, 0x83, 0xef, 0x4, 0xfd, 0x39, 0xe5, + 0xe0, 0xde, 0xfd, 0x3a, 0x27, 0xd8, 0x4, 0x27, + 0x27, 0x83, 0x6b, 0xe5, 0x1e, 0xde, 0x6b, 0x27, + 0x36, 0xd8, 0x47, 0x3a, 0x3e, 0x8b, 0x47, 0x27, + 0x9d, 0x90, 0x7d, 0x47, 0xc6, 0xce, 0xff, 0x6b, + 0x8b, 0xd8, 0xfd, 0x3, 0x51, 0x88, 0xe5, 0x9c, + 0x1e, 0xde, 0x9c, 0x6b, 0x81, 0xde, 0x9c, 0x47, + 0xa9, 0x27, 0x3, 0x3, 0x2a, 0x88, 0x7d, 0x6b, + 0x75, 0x1e, 0xd7, 0x7d, 0x13, 0x98, 0x50, 0x7a, + 0x91, 0xb8, 0x77, 0x2a, 0x51, 0x2a, 0xd9, 0x7d, + 0x6b, 0x3, 0xef, 0x4f, 0x4e, 0x49, 0x64, 0xa8, + 0xb8, 0xb8, 0xd9, 0x1e, 0xd8, 0x47, 0xe5, 0x7d, + 0x83, 0x3, 0x6f, 0xfd, 0xdb, 0x3f, 0x3e, 0x9f, + 0x2a, 0xfb, 0xfb, 0x83, 0xd8, 0x9c, 0xe0, 0x1e, + 0x39, 0x3, 0x3, 0xa9, 0x98, 0x4e, 0x3e, 0x9f, + 0x18, 0x7c, 0x8b, 0x39, 0xca, 0x47, 0x8e, 0x81, + 0x83, 0x77, 0x3a, 0xe1, 0x9b, 0x27, 0xfb, 0x9c, + 0xed, 0x6f, 0xde, 0x81, 0xca, 0x47, 0x81, 0xe1, + 0x1e, 0xa9, 0x3e, 0x18, 0x9d, 0x27, 0x8b, 0x31, + 0x47, 0x47, 0xd8, 0x81, 0x6b, 0x27, 0x9f, 0x40, + 0x36, 0xa9, 0x7f, 0xa9, 0xfd, 0x1e, 0x1e, 0x7d, + 0x6b, 0x8e, 0xd8, 0xd8, 0xfd, 0x27, 0x51, 0xdb, + 0x9d, 0x9b, 0xa9, 0x8b, 0x47, 0x26, 0x81, 0x81, + 0x9c, 0xf5, 0xe4, 0xd8, 0x36, 0x1e, 0xa9, 0x2a, + 0x9d, 0xd8, 0x18, 0x8b, 0x6b, 0xd8, 0xc6, 0x81, + 0x1e, 0x83, 0x8b, 0x3a, 0x9d, 0x2e, 0x18, 0x7e, + 0x8b, 0x81, 0xf6, 0x40, 0x83, 0x81, 0x85, 0x36, + 0xfd, 0xc4, 0x8b, 0x98, 0xa9, 0x9d, 0x9d, 0xe8, + 0x77, 0x27, 0x83, 0x1e, 0x83, 0x83, 0x90, 0x9f, + 0x74, 0x75, 0x74, 0x7e, 0xd6, 0x53, 0x90, 0x40, + 0x6b, 0xd8, 0xe4, 0x71, 0x90, 0x90, 0x99, 0xd8, + 0xdb, 0x53, 0x90, 0x88, 0x88, 0xc6, 0xc6, 0xde, + 0x4b, 0x90, 0x81, 0xde, 0xc6, 0x7, 0x90, 0x8b, + 0xb, 0xdb, 0x40, 0x8b, 0x18, 0x9f, 0xc6, 0xc6, + 0x75, 0xc6, 0x81, 0xde, 0x57, 0xbc, 0x75, 0x81, + 0xf6, 0xf6, 0xc6, 0xd8, 0xd8, 0x90, 0xde, 0xe1, + 0xc6, 0xf6, 0x8b, 0x83, 0x9f, 0xdb, 0x74, 0xc6, + 0xd8, 0x75, 0xb4, 0xbf, 0xf4, 0xbf, 0x8d, 0xbb, + 0xb4, 0x84, 0x81, 0x4b, 0xf6, 0x74, 0x57, 0xe4, + 0xe4, 0xe1, 0xb4, 0xb4, 0xf4, 0xbf, 0xbf, 0xbf, + 0xf4, 0x9a, 0x9a, 0xe4, 0xc6, 0x53, 0x53, 0x18, + 0x81, 0xe4, 0xe4, 0xe4, 0xf4, 0xcd, 0x95, 0xbb, + 0xaf, 0xf4, 0x9a, + 0x9c, 0x6b, 0x4f, 0x50, 0x1, 0x8c, 0x66, 0x78, + 0x62, 0x30, 0xd2, 0x19, 0x19, 0x63, 0x19, 0xc2, + 0x19, 0x19, 0x1b, 0x89, 0x63, 0x89, 0x79, 0x67, + 0x24, 0x41, 0xa0, 0x67, 0x62, 0x1c, 0x58, 0x8, + 0x67, 0x2f, 0x1b, 0x2f, 0x5d, 0xc2, 0xef, 0xd5, + 0x8f, 0x6b, 0xde, 0x47, 0xfd, 0x81, 0x99, 0x7c, + 0x9d, 0xc6, 0xd8, 0x2a, 0x3e, 0xdf, 0x2e, 0xe0, + 0x1e, 0x39, 0x6b, 0x47, 0xd8, 0x84, 0xd8, 0xa9, + 0xdb, 0x40, 0x9d, 0x27, 0x7e, 0x7d, 0x9c, 0x7b, + 0x81, 0xc6, 0xca, 0x1e, 0xe1, 0x7, 0xde, 0x83, + 0xa9, 0xf6, 0xd8, 0x1e, 0x90, 0x39, 0x9c, 0xf3, + 0xce, 0xe1, 0x81, 0x83, 0x53, 0x74, 0xd8, 0xd8, + 0x98, 0x8b, 0x1e, 0x1e, 0xc6, 0xc6, 0x83, 0xd8, + 0xe1, 0xc6, 0xd8, 0x90, 0x51, 0x48, 0x88, 0x88, + 0x18, 0x5c, 0x90, 0xc6, 0xe1, 0x86, 0x83, 0x1e, + 0x57, 0x53, 0x9d, 0x9f, 0xeb, 0x48, 0x7e, 0x7c, + 0x25, 0x8b, 0x90, 0x81, 0xe1, 0x84, 0x81, 0x81, + 0x9d, 0x53, 0x51, 0x9f, 0x18, 0x88, 0x18, 0xc6, + 0x75, 0xc6, 0xed, 0xc6, 0x85, 0x57, 0x85, 0xe1, + 0x81, 0x98, 0xdb, 0xf6, 0xf6, 0x8b, 0x9f, 0xe1, + 0xe1, 0xc4, 0xc6, 0x84, 0xb2, 0xd8, 0x57, 0x84, + 0x70, 0x9f, 0x18, 0x84, 0x85, 0xc6, 0xc4, 0xc6, + 0xe4, 0xb4, 0xb4, 0xf4, 0x85, 0xe1, 0xbc, 0x75, + 0x84, 0xf6, 0x40, 0x75, 0xc6, 0xc6, 0xe1, 0x81, + 0xc6, 0xe1, 0x71, 0x57, 0xc6, 0xf6, 0x98, 0xa2, + 0xd8, 0xd8, 0xf6, 0x81, 0xe1, 0x84, 0xe1, 0xc6, + 0x81, 0xc6, 0x57, 0x74, 0x75, 0x75, 0x2a, 0xa2, + 0xf6, 0xe1, 0xe1, 0x81, 0xc6, 0x2e, 0xe1, 0x57, + 0xe1, 0x70, 0x57, 0xba, 0x57, 0x84, 0x70, 0xf6, + 0xc6, 0xc6, 0x84, 0xe1, 0xc6, 0xe1, 0xe1, 0x57, + 0x57, 0x70, 0x75, 0x51, 0xcb, 0x75, 0xe1, 0x84, + 0x4b, 0x90, 0x90, 0xd8, 0xc6, 0xe4, 0x7, 0xbc, + 0xba, 0x57, 0x75, 0x40, 0x2a, 0x90, 0x86, 0xd8, + 0xf5, 0x90, 0xf6, 0xf6, 0xbc, 0x75, 0x75, 0x53, + 0xb, 0x75, 0xc6, 0x1e, 0x8b, 0x90, 0x90, 0xc6, + 0xc6, 0xe1, 0xe1, 0x90, 0xdb, 0x74, 0x81, 0x9f, + 0x88, 0x18, 0x81, 0xd8, 0x81, 0xc6, 0x7, 0xd8, + 0x84, 0x84, 0x84, 0xf6, 0xdb, 0xcb, 0xd8, 0x54, + 0x18, 0x5c, 0x90, 0x1e, 0xce, 0x84, 0x84, 0x90, + 0x84, 0xbc, 0x71, 0xc6, 0xcb, 0x51, 0x9f, 0x81, + 0x84, 0xc6, 0x4b, 0xe4, 0xb0, 0xce, 0xd8, 0x83, + 0x18, 0xdb, 0xa9, 0x1e, 0xf6, 0x18, 0x83, 0xbd, + 0xce, 0xb4, 0x81, 0x4b, 0xe4, 0xe4, 0xc0, 0xce, + 0x90, 0xf6, 0xdb, 0xde, 0x75, 0x90, 0xca, 0xed, + 0xbf, 0xe4, 0xf8, 0xdf, 0x4b, 0xc6, 0xd8, 0xe1, + 0xc6, 0xf6, 0x18, 0xc6, 0xb4, 0xf9, 0x90, 0x7d, + 0xca, 0xcc, 0xb1, 0xf3, 0xf7, 0x4b, 0xc6, 0xd8, + 0xe1, 0xcc, 0xc6, + 0xd8, 0x9f, 0x7e, 0x91, 0xa8, 0xa7, 0x6d, 0x62, + 0x1c, 0x8c, 0xd2, 0x7d, 0xef, 0x19, 0xef, 0x5d, + 0xd2, 0x8f, 0xef, 0xd2, 0x6e, 0x19, 0xc5, 0x2f, + 0x58, 0x41, 0x2f, 0x67, 0xb5, 0x8a, 0x1, 0x49, + 0x49, 0x2f, 0xc5, 0x2f, 0x7a, 0x35, 0x3, 0x6b, + 0x6b, 0x1e, 0x1e, 0x9d, 0xc8, 0x81, 0x90, 0x53, + 0xdb, 0xf6, 0x84, 0x90, 0x6b, 0xd8, 0x2e, 0x81, + 0x81, 0x83, 0x1e, 0xd8, 0xcf, 0x9f, 0x81, 0xdb, + 0xeb, 0x53, 0x74, 0x9f, 0x90, 0x90, 0xe1, 0xe1, + 0x75, 0x7, 0xe1, 0xc6, 0xbc, 0xbc, 0x84, 0xc6, + 0xf6, 0xc6, 0x84, 0xe1, 0x84, 0x84, 0xb4, 0xe1, + 0xe1, 0xbc, 0xc6, 0x57, 0xcb, 0xba, 0x75, 0x9a, + 0x75, 0xfa, 0xe1, 0xc6, 0xe1, 0x84, 0xe1, 0xe1, + 0xbc, 0xbc, 0x9f, 0x84, 0x74, 0xa2, 0xa2, 0xf6, + 0x75, 0xc4, 0x71, 0xb0, 0x7, 0x57, 0x75, 0x75, + 0x57, 0xdb, 0x88, 0x75, 0xf6, 0x18, 0x90, 0xd8, + 0xf9, 0xc6, 0xd8, 0xe1, 0x70, 0x57, 0x71, 0xd8, + 0x75, 0xdb, 0x18, 0x75, 0x81, 0xd8, 0x90, 0xe1, + 0x85, 0xe1, 0xb4, 0xb4, 0xe1, 0xbc, 0x9f, 0xe1, + 0x7, 0x9f, 0x18, 0x75, 0xe1, 0x81, 0x81, 0x70, + 0xe1, 0xd8, 0x9f, 0x75, 0xd8, 0x53, 0xdb, 0x75, + 0xc6, 0xc8, 0xfc, 0x4b, 0xc6, 0xde, 0xb4, 0x9a, + 0xe4, 0xe1, 0x57, 0x7, 0xe4, 0xd8, 0xdb, 0xf6, + 0xc6, 0xd8, 0xd8, 0x81, 0xc6, 0x81, 0xe1, 0x7, + 0xe1, 0x75, 0xdb, 0xdb, 0xd8, 0xc6, 0xf6, 0x18, + 0xf9, 0xde, 0x81, 0xe1, 0xc6, 0x90, 0x9f, 0xbc, + 0xd8, 0xd8, 0x53, 0xdb, 0x1e, 0xd8, 0xf6, 0x90, + 0x90, 0xc4, 0x84, 0xde, 0xfd, 0x1e, 0x9f, 0x53, + 0xd8, 0xe1, 0x75, 0x18, 0x90, 0x81, 0xb4, 0x84, + 0x1e, 0xdf, 0xc6, 0xc6, 0xd8, 0xde, 0x75, 0x53, + 0xcf, 0xd8, 0xc6, 0x90, 0x39, 0x90, 0x84, 0xc6, + 0x90, 0x5c, 0x7d, 0x83, 0x9d, 0x84, 0x75, 0x51, + 0x88, 0x81, 0xd8, 0xfd, 0x31, 0x39, 0x1e, 0x7b, + 0x47, 0x8b, 0x7d, 0x8b, 0x98, 0x9f, 0xfa, 0x8b, + 0x13, 0x81, 0xde, 0x47, 0x6b, 0x7d, 0x6b, 0x4, + 0xfd, 0x9f, 0x90, 0xfb, 0x3e, 0x53, 0x1e, 0x6b, + 0x7d, 0x7d, 0x54, 0x4, 0xfd, 0xf9, 0x39, 0x6b, + 0x9d, 0x57, 0x3d, 0x7d, 0x4f, 0x8b, 0x47, 0x6f, + 0x6b, 0x7d, 0x6a, 0x4, 0x8e, 0x9f, 0x83, 0x6b, + 0x9d, 0xdb, 0x9d, 0x47, 0x8b, 0x7d, 0xfd, 0x4, + 0x2e, 0xf9, 0x7d, 0x9c, 0xde, 0x57, 0x3, 0x7d, + 0x31, 0x2a, 0xa9, 0xe5, 0x83, 0x7d, 0xe5, 0x6f, + 0xbd, 0xdd, 0x9c, 0x99, 0xf3, 0xe4, 0xfd, 0x86, + 0xca, 0x6b, 0x6b, 0x9c, 0xf3, 0x99, 0x7d, 0x9c, + 0xf3, 0xc0, 0x4, 0x9c, 0x99, 0xfd, 0x3a, 0xfd, + 0xf9, 0x99, 0x6b, 0x32, 0xe4, 0x93, 0x93, 0x7d, + 0x6b, 0xb1, 0xc0, 0xfd, 0xfd, 0xdf, 0x9c, 0xfd, + 0x2e, 0xbf, 0x8e, + 0x40, 0xd8, 0x40, 0x5c, 0xe8, 0x59, 0xa4, 0x6d, + 0x1c, 0x3b, 0x89, 0x77, 0x5d, 0xd5, 0x77, 0x2f, + 0x2f, 0x77, 0x19, 0x6e, 0x63, 0x19, 0xef, 0x6e, + 0x89, 0x89, 0x89, 0x24, 0xb5, 0x41, 0x2f, 0x1, + 0xab, 0x67, 0xfb, 0x1b, 0xe, 0x77, 0xc5, 0x77, + 0x5d, 0x3, 0x47, 0x77, 0x5d, 0x3, 0x47, 0xe5, + 0x27, 0x8b, 0x1e, 0x47, 0x47, 0x47, 0x6b, 0x35, + 0x3a, 0x3a, 0x3, 0xef, 0x7e, 0x8b, 0x6b, 0x47, + 0x6b, 0x8b, 0x88, 0x8b, 0x53, 0xcf, 0x9f, 0x18, + 0xa2, 0xdb, 0x75, 0x40, 0xf6, 0x18, 0xd8, 0xce, + 0xb4, 0x84, 0x90, 0x90, 0xc6, 0x57, 0xd8, 0x90, + 0xdb, 0x51, 0x9d, 0x9b, 0x81, 0x90, 0x39, 0xf8, + 0xc6, 0x85, 0x1e, 0x39, 0xf6, 0xcf, 0x9d, 0xd8, + 0x18, 0x88, 0x1e, 0xfa, 0xe1, 0xf9, 0x7d, 0x90, + 0x84, 0x9f, 0xfd, 0x90, 0x88, 0xdb, 0xa9, 0xc6, + 0x75, 0x5c, 0x8b, 0xde, 0xe1, 0x36, 0x1e, 0x39, + 0xd8, 0x9d, 0x9d, 0xd8, 0x39, 0x7f, 0x27, 0xd8, + 0xc6, 0x9c, 0x39, 0x1e, 0x81, 0x36, 0x47, 0x83, + 0x39, 0x47, 0x3d, 0x57, 0x81, 0x8b, 0x83, 0xc6, + 0xdd, 0x9c, 0x6f, 0x39, 0x1e, 0x9b, 0xfd, 0x9f, + 0x83, 0x27, 0xa9, 0x9d, 0xd8, 0x6b, 0x7d, 0x9c, + 0xf3, 0x6f, 0xfd, 0x90, 0x9c, 0x47, 0xd8, 0x57, + 0x1e, 0x6b, 0x8b, 0xf6, 0xfd, 0x4, 0x54, 0xca, + 0x47, 0x4, 0x7b, 0xd8, 0x83, 0x6b, 0x53, 0xb, + 0x9d, 0x6b, 0x7d, 0x8b, 0x47, 0x4, 0x7b, 0x39, + 0x6f, 0x47, 0xd8, 0xd8, 0x3, 0xef, 0x8b, 0x51, + 0x3, 0x47, 0x99, 0x6b, 0x47, 0x4, 0xce, 0x86, + 0x6b, 0x47, 0xd8, 0x3a, 0x3a, 0x8f, 0x39, 0x8b, + 0x47, 0x8e, 0xc6, 0x9c, 0x6f, 0x32, 0xe4, 0xde, + 0x47, 0x6b, 0xd8, 0x9d, 0x7c, 0xfd, 0x81, 0x99, + 0xe5, 0x32, 0x81, 0x26, 0xe5, 0x9c, 0x70, 0x1e, + 0x3a, 0x13, 0x7d, 0x7c, 0x25, 0xfd, 0x81, 0x9c, + 0xe5, 0x36, 0xbd, 0x47, 0x6c, 0x6b, 0xfd, 0x6c, + 0x98, 0xa9, 0x7d, 0x6b, 0xef, 0x1e, 0x1e, 0x9c, + 0x4, 0x32, 0x32, 0x6c, 0xef, 0x27, 0x27, 0xd7, + 0xa9, 0xa9, 0x83, 0xe5, 0xe5, 0xfd, 0x32, 0x6c, + 0xd7, 0x6b, 0x47, 0x6c, 0x3, 0xcf, 0x83, 0xe5, + 0x1e, 0x3a, 0x36, 0x6f, 0x9c, 0x1e, 0x32, 0x4, + 0x7b, 0x1e, 0x47, 0xe5, 0x47, 0x53, 0x3, 0x9c, + 0x32, 0xd8, 0x6f, 0x4, 0x9c, 0xde, 0x32, 0x4, + 0x12, 0xc6, 0x9d, 0xfd, 0xc6, 0xcb, 0x43, 0x47, + 0xed, 0x1e, 0xe5, 0x6c, 0xb1, 0x8e, 0x4, 0x4, + 0x2e, 0xc6, 0x3, 0x6f, 0xe4, 0xe1, 0x28, 0x93, + 0x12, 0xf3, 0x8e, 0x97, 0xbd, 0xce, 0x4, 0x97, + 0xdd, 0xfd, 0x47, 0x93, 0xf3, 0x12, 0x6f, 0x12, + 0x8d, 0xf3, 0x97, 0xbd, 0xe4, 0x26, 0xb9, 0x9b, + 0x3, 0xe1, 0xb9, 0xfd, 0x81, 0xe4, 0xf3, 0xf3, + 0xce, 0xe4, 0xc0, + 0xe5, 0x47, 0x1e, 0xa9, 0x59, 0x30, 0x67, 0x24, + 0xe3, 0xda, 0x89, 0x89, 0x42, 0x63, 0x63, 0x8, + 0x58, 0x8, 0x2, 0xf1, 0xf1, 0x89, 0x89, 0x19, + 0x63, 0x63, 0x63, 0x1b, 0x89, 0x89, 0x89, 0x58, + 0x8a, 0x41, 0x67, 0x41, 0x58, 0x8c, 0x30, 0xf1, + 0x2f, 0xe9, 0xd2, 0xc2, 0x6e, 0xd5, 0xd7, 0x4a, + 0x19, 0xc2, 0x6e, 0xd5, 0x5d, 0xa5, 0xe, 0xd2, + 0x42, 0xe9, 0x4a, 0xd5, 0x63, 0x63, 0xd7, 0x4a, + 0xe9, 0x5d, 0xa5, 0xa5, 0x2c, 0x91, 0x77, 0xef, + 0xfb, 0xf6, 0x36, 0x4, 0x1e, 0x9c, 0x4, 0x9c, + 0xd8, 0xcf, 0x6b, 0xe5, 0x40, 0xdb, 0x47, 0x4, + 0x7b, 0x1e, 0x4, 0x47, 0xde, 0x90, 0x47, 0x47, + 0x9d, 0xdb, 0xa9, 0x6b, 0x83, 0x90, 0x6b, 0x97, + 0x2e, 0xf3, 0x69, 0x32, 0x9, 0x9d, 0x3, 0x47, + 0x9f, 0x3a, 0xa9, 0xfd, 0x9c, 0x47, 0x4, 0xde, + 0xc6, 0x8d, 0x6f, 0x81, 0x85, 0x9b, 0xa9, 0x3, + 0xd8, 0x3, 0x27, 0x1e, 0x1e, 0x6f, 0x6f, 0x2e, + 0xce, 0x26, 0xfd, 0xd8, 0xde, 0x47, 0x3a, 0x40, + 0xde, 0x9b, 0x47, 0x71, 0xb9, 0xb1, 0x8e, 0xde, + 0xc6, 0x8e, 0xfd, 0x40, 0xd8, 0x3, 0x98, 0x18, + 0xd8, 0x9c, 0x36, 0x90, 0x7b, 0x47, 0xb1, 0xe4, + 0xde, 0x4, 0x9d, 0x53, 0xd8, 0xfd, 0x40, 0x9f, + 0xb1, 0x32, 0xf3, 0xe4, 0xde, 0x8e, 0xfd, 0xd8, + 0xd8, 0x4, 0x9d, 0x53, 0x9d, 0x47, 0x9f, 0xf6, + 0x1e, 0x26, 0x81, 0xce, 0x8d, 0x6f, 0xd8, 0x9f, + 0x9d, 0x1e, 0x9f, 0xdb, 0x8b, 0x9c, 0xc6, 0x81, + 0x9c, 0xb1, 0x81, 0xde, 0x8e, 0xfd, 0x81, 0xcf, + 0x3a, 0x1e, 0x81, 0x51, 0x8b, 0xff, 0x81, 0xbd, + 0xfd, 0xe1, 0xe4, 0xe1, 0x57, 0xe4, 0xe1, 0x57, + 0x53, 0x70, 0xb4, 0x85, 0xd8, 0xc6, 0xe4, 0xde, + 0xde, 0xc6, 0xb2, 0xc6, 0x74, 0x57, 0xe1, 0x9f, + 0x18, 0x83, 0x81, 0x81, 0x90, 0xe4, 0xb4, 0xb1, + 0x2e, 0x81, 0xc6, 0xd8, 0xdb, 0x53, 0x81, 0x9d, + 0x88, 0x9f, 0xb4, 0xce, 0xd8, 0x90, 0x81, 0x12, + 0xd8, 0x74, 0x90, 0x39, 0x8b, 0x2a, 0xd8, 0x6b, + 0x4f, 0x90, 0x70, 0x2e, 0xed, 0xf6, 0x39, 0x1e, + 0xd8, 0x53, 0x8b, 0x7d, 0x18, 0xf6, 0x81, 0x69, + 0x4b, 0x90, 0xc6, 0xb1, 0xe1, 0x7, 0x9d, 0x90, + 0xc6, 0xbc, 0xbc, 0x90, 0x90, 0x90, 0xde, 0xe4, + 0xe4, 0x86, 0xf9, 0xc6, 0xe4, 0x75, 0x74, 0x90, + 0x4b, 0xbc, 0x18, 0x84, 0x4b, 0x90, 0xc6, 0xce, + 0xe4, 0xce, 0x90, 0xdf, 0xe1, 0x75, 0xdb, 0x18, + 0x4b, 0xc6, 0xe1, 0xb4, 0xbf, 0x4b, 0x81, 0xbf, + 0xb4, 0xbf, 0xe1, 0x90, 0x81, 0xe1, 0x53, 0x53, + 0xf9, 0x4b, 0xc4, 0xb4, 0xaf, 0xdf, 0xdf, 0x86, + 0xb4, 0xb4, 0x7, 0xcb, 0x90, 0x81, 0xc6, 0x18, + 0xf6, 0xfa, 0xfc, 0xdf, 0xb4, 0xbf, 0xaf, 0x86, + 0xf9, 0xb4, 0xcd, + 0x47, 0x9b, 0x9d, 0x3e, 0x1, 0xa7, 0xd3, 0xb5, + 0xe3, 0x67, 0x63, 0x19, 0x19, 0xc2, 0x63, 0x63, + 0x42, 0x2d, 0xf1, 0x41, 0x8a, 0xd2, 0x19, 0x63, + 0x63, 0x63, 0x63, 0x19, 0x19, 0x19, 0x63, 0x63, + 0x67, 0x41, 0xa, 0x41, 0x41, 0x58, 0x58, 0x8, + 0x67, 0x42, 0x6e, 0x63, 0x63, 0xe9, 0x6e, 0xc2, + 0xd2, 0x79, 0xe9, 0xd2, 0x42, 0xa5, 0xe, 0x19, + 0xa5, 0xe9, 0xe, 0x19, 0xd5, 0xd5, 0xe, 0x19, + 0x5d, 0x2c, 0x2c, 0xa5, 0x50, 0x7f, 0x8b, 0x47, + 0x1e, 0xd8, 0xd8, 0x2e, 0xde, 0x7, 0xd8, 0xd8, + 0x9f, 0xcb, 0x9d, 0xd8, 0x81, 0x7, 0x81, 0xc6, + 0x8d, 0xe1, 0xd8, 0x83, 0xd8, 0xcf, 0xa9, 0xd8, + 0x40, 0xdb, 0xa9, 0x1e, 0xc6, 0x81, 0x90, 0x81, + 0xe1, 0xe1, 0x84, 0x75, 0x75, 0x9f, 0x2a, 0x40, + 0xf6, 0x18, 0x90, 0xe1, 0x84, 0x70, 0xc6, 0x4b, + 0xe1, 0x84, 0xbc, 0x57, 0xf6, 0x18, 0xdb, 0x75, + 0x84, 0x4b, 0x90, 0xc6, 0x84, 0xde, 0x2e, 0x90, + 0xd8, 0x81, 0x53, 0x57, 0x75, 0x90, 0x8b, 0xd8, + 0x84, 0xb2, 0xf9, 0x81, 0xe4, 0x8d, 0x7, 0x57, + 0xf6, 0xf6, 0x53, 0x53, 0x75, 0x6a, 0x39, 0x81, + 0xe1, 0xde, 0xc6, 0x90, 0xdf, 0x2e, 0xd8, 0x74, + 0xf6, 0x40, 0xf6, 0x74, 0x81, 0xbf, 0x4b, 0x4b, + 0x8d, 0xe4, 0xb4, 0x7, 0xf6, 0xe1, 0x57, 0xba, + 0x18, 0xf6, 0x6a, 0x9f, 0xc6, 0x70, 0xc6, 0x90, + 0x4b, 0x9, 0xe4, 0x57, 0xf6, 0x83, 0x75, 0x74, + 0xcb, 0x85, 0x6a, 0x90, 0xc6, 0xb4, 0x70, 0x4b, + 0x39, 0xe1, 0xe1, 0x7, 0x74, 0x90, 0x83, 0xcb, + 0x74, 0x75, 0x4b, 0x39, 0x99, 0x85, 0xb4, 0x85, + 0xf6, 0x4b, 0xb4, 0x57, 0xbc, 0x74, 0xf9, 0xb4, + 0xe1, 0xe1, 0xb4, 0x4b, 0x81, 0xb4, 0x9a, 0x9a, + 0x57, 0x18, 0xc6, 0xd8, 0x53, 0xd8, 0x4b, 0x4b, + 0x81, 0x70, 0xb4, 0xc6, 0x90, 0x90, 0xb4, 0xe1, + 0xbc, 0xa2, 0x8b, 0x81, 0x74, 0xf6, 0x84, 0xf5, + 0xdf, 0xe1, 0xce, 0x8d, 0x1e, 0x39, 0x6b, 0xd8, + 0xc8, 0x51, 0x8b, 0x7d, 0x83, 0x9f, 0xc6, 0x9c, + 0x7d, 0x83, 0xc6, 0x81, 0xc6, 0x51, 0x51, 0x1e, + 0xd8, 0xcb, 0x9f, 0x39, 0x99, 0xf9, 0xe1, 0xc6, + 0xdf, 0x39, 0x81, 0xc6, 0xe1, 0x53, 0xeb, 0x1e, + 0xe4, 0x81, 0xe1, 0xdf, 0x9c, 0x81, 0x81, 0xe4, + 0xb4, 0xb2, 0x8b, 0xd8, 0xe1, 0x57, 0x18, 0x90, + 0xce, 0x85, 0xc6, 0xb4, 0xfa, 0xdf, 0xde, 0x2e, + 0xe1, 0xde, 0x8b, 0xa9, 0xc6, 0xde, 0x1e, 0x83, + 0x9c, 0xc6, 0xe4, 0xe4, 0xe4, 0xc6, 0xf5, 0xb4, + 0x95, 0xe4, 0x18, 0xa9, 0xdf, 0xde, 0xfd, 0x83, + 0xdf, 0x6f, 0xc0, 0xc0, 0xb4, 0x81, 0x9c, 0x40, + 0x7, 0xc4, 0x1e, 0x18, 0x83, 0xdd, 0xb9, 0x8e, + 0x26, 0xc6, 0xc4, 0x93, 0xe4, 0xcc, 0xb4, 0xdd, + 0x40, 0xc6, 0xbd, + 0xc8, 0x6b, 0x8b, 0x22, 0x91, 0x49, 0x94, 0x4d, + 0x6d, 0xad, 0x77, 0xef, 0x19, 0x89, 0xef, 0x63, + 0xd2, 0xe9, 0x96, 0x8, 0x67, 0xd2, 0xef, 0xa5, + 0xe, 0x8f, 0xd5, 0x6e, 0x6e, 0x6e, 0x6e, 0x6e, + 0x79, 0x1, 0x8c, 0xb5, 0xe3, 0x8c, 0x67, 0x58, + 0x58, 0x5b, 0xd2, 0x79, 0xd2, 0x60, 0x2f, 0x42, + 0xa5, 0x50, 0xc5, 0x1b, 0xf0, 0x96, 0xe, 0xd2, + 0x2f, 0x89, 0x73, 0x6e, 0x5d, 0x3e, 0xa5, 0xf0, + 0x60, 0x91, 0x4e, 0xc5, 0xc5, 0x4f, 0x27, 0xfd, + 0x1e, 0x40, 0x88, 0x6b, 0xd8, 0x53, 0xdb, 0x90, + 0x39, 0x40, 0xd8, 0xce, 0x81, 0x90, 0x90, 0x70, + 0xc6, 0x57, 0x18, 0x39, 0xf6, 0x53, 0xdb, 0x90, + 0x7d, 0x8b, 0x47, 0x71, 0xb1, 0x4b, 0x39, 0x90, + 0xc6, 0xe1, 0xdb, 0xcb, 0x39, 0x18, 0xdb, 0xd8, + 0xd8, 0x90, 0x9c, 0xe1, 0xb4, 0xe1, 0x90, 0x18, + 0xc6, 0x57, 0xa2, 0xcb, 0x90, 0x90, 0xd8, 0x81, + 0xb4, 0x4b, 0x83, 0x81, 0x84, 0x81, 0x18, 0x88, + 0x8b, 0x81, 0xdb, 0x9f, 0x4b, 0x6b, 0x1e, 0xc6, + 0xce, 0xde, 0x54, 0x83, 0x70, 0x84, 0x57, 0xa2, + 0x18, 0x90, 0x9f, 0x57, 0xc6, 0x4b, 0x83, 0xd8, + 0x2e, 0xd8, 0x81, 0x8b, 0x8b, 0x2e, 0x40, 0xa2, + 0xf6, 0x83, 0x90, 0x70, 0xe4, 0x81, 0x9c, 0xdf, + 0x84, 0xde, 0xe1, 0xcb, 0x18, 0xd8, 0xf6, 0xcb, + 0xd8, 0xfd, 0xf5, 0xc6, 0xde, 0xde, 0x81, 0xdf, + 0xd8, 0x70, 0x84, 0x74, 0xdb, 0x83, 0x81, 0x75, + 0x81, 0xc6, 0xdf, 0xdf, 0xd8, 0xd8, 0x84, 0x8b, + 0x88, 0x90, 0xe1, 0x9f, 0xdb, 0x39, 0xf5, 0xc6, + 0xde, 0x81, 0xdf, 0xca, 0x1e, 0xde, 0xb0, 0x9a, + 0xdb, 0x40, 0xe1, 0x7, 0x18, 0x9f, 0xc6, 0xdd, + 0xb4, 0xb4, 0xb4, 0xc6, 0x1e, 0xc6, 0x7, 0xc6, + 0x9d, 0xdb, 0x81, 0xde, 0x1e, 0x75, 0xb4, 0x9c, + 0xb9, 0x70, 0xce, 0xce, 0x47, 0x9d, 0x75, 0xde, + 0x3, 0x40, 0xfc, 0xde, 0x8e, 0x70, 0xc6, 0xde, + 0x7b, 0x2e, 0xc6, 0x36, 0xfd, 0x8b, 0x27, 0x6f, + 0x47, 0xc8, 0x83, 0xe5, 0x47, 0x9c, 0x86, 0x6f, + 0xe5, 0x83, 0x40, 0x36, 0x9d, 0xdb, 0x2a, 0x6b, + 0x47, 0x1e, 0x90, 0x6f, 0x47, 0xde, 0xfd, 0xfd, + 0xfd, 0x40, 0x51, 0x1e, 0xd8, 0x9f, 0x8b, 0x47, + 0xbd, 0xe4, 0xdd, 0x7b, 0xf5, 0x70, 0xd8, 0x47, + 0xdd, 0x75, 0xa9, 0x3, 0x9c, 0xfa, 0xfd, 0x4, + 0xf3, 0xb4, 0xdd, 0x32, 0xde, 0xde, 0xfd, 0x3, + 0xf5, 0xfd, 0x27, 0xd5, 0xfd, 0xf8, 0x9c, 0x4, + 0xc0, 0xf3, 0x97, 0x97, 0xe4, 0xf3, 0x6f, 0xfd, + 0x81, 0xdd, 0x47, 0x47, 0x32, 0x6f, 0xe5, 0x4, + 0xbd, 0xf5, 0x4, 0x47, 0xc0, 0xbd, 0x47, 0x3a, + 0xd8, 0xdd, 0xe5, 0x47, 0xce, 0x6f, 0x97, 0x28, + 0x9c, 0xed, 0x8e, 0x97, 0xb9, 0xe1, 0x26, 0x93, + 0xd8, 0x2e, 0xc4, + 0x18, 0x8b, 0x7d, 0x27, 0xe8, 0xe8, 0x73, 0x5, + 0x30, 0x2, 0xa5, 0x42, 0xae, 0x2, 0xe, 0xe9, + 0x77, 0xa5, 0x96, 0x73, 0x63, 0x8f, 0x19, 0xc2, + 0x19, 0x6e, 0x77, 0x2f, 0x2f, 0x2f, 0xc5, 0x60, + 0xa5, 0x77, 0x6e, 0x89, 0x89, 0x42, 0x42, 0xf1, + 0xa0, 0x8c, 0x2f, 0x8c, 0x8c, 0xab, 0x65, 0xb3, + 0x79, 0xe7, 0x79, 0x89, 0x30, 0x8, 0x2f, 0x2f, + 0xd3, 0x5e, 0x58, 0x8c, 0xab, 0x49, 0x67, 0xa0, + 0xa6, 0xd2, 0xe, 0x63, 0x63, 0xe9, 0x5d, 0x77, + 0x77, 0x5d, 0xa5, 0xef, 0x8f, 0xd7, 0x7d, 0x6c, + 0xe5, 0x4, 0xe5, 0x47, 0x4, 0x47, 0xa9, 0x47, + 0x36, 0x27, 0x13, 0x3, 0x47, 0x6a, 0x6b, 0xe5, + 0x3, 0xd7, 0x8f, 0x3, 0x47, 0x47, 0x5d, 0x27, + 0xfd, 0x47, 0xd5, 0x6b, 0x47, 0x9c, 0x6c, 0x47, + 0x7b, 0xe5, 0x47, 0x9d, 0x70, 0xd8, 0x27, 0xa9, + 0xd8, 0xd8, 0x47, 0x1e, 0xc4, 0x8e, 0x47, 0x71, + 0xc6, 0xd8, 0x3, 0x51, 0x9f, 0xfd, 0x3, 0x8b, + 0x1e, 0x47, 0x4, 0x9c, 0xde, 0x9c, 0x4, 0xd8, + 0xc6, 0x4, 0x3, 0x51, 0x9d, 0xfd, 0x47, 0xd8, + 0x9c, 0x4, 0x8e, 0x81, 0xd8, 0x7b, 0x47, 0x40, + 0x9d, 0x47, 0x47, 0x88, 0x8b, 0x47, 0x9b, 0xd8, + 0xb1, 0x6f, 0x26, 0xd8, 0xd8, 0x47, 0xb1, 0xcf, + 0x53, 0xfd, 0x36, 0xf6, 0x1e, 0x4, 0xce, 0xde, + 0x8e, 0x6f, 0xb1, 0xd8, 0x3, 0x47, 0x32, 0x9f, + 0x9d, 0x1e, 0xde, 0xc6, 0x4, 0x9c, 0xbd, 0xe4, + 0xfd, 0x6f, 0xce, 0xd8, 0x3a, 0xc8, 0xd8, 0x9d, + 0x27, 0x47, 0x81, 0xfd, 0x9c, 0x4, 0x2e, 0xce, + 0x47, 0x36, 0xde, 0xd8, 0xa9, 0x3a, 0x81, 0x81, + 0x47, 0x36, 0xbf, 0x81, 0x4, 0x32, 0xb4, 0xde, + 0xfd, 0x9d, 0xc6, 0xd8, 0x3, 0xa9, 0xe1, 0x54, + 0x6f, 0xfd, 0xbd, 0x32, 0x4, 0xbd, 0xfa, 0xde, + 0x47, 0xcf, 0xd8, 0x32, 0x47, 0x1e, 0xd8, 0x6f, + 0xe0, 0x70, 0xde, 0x4, 0x47, 0x1e, 0xd8, 0x4, + 0x47, 0x51, 0x8b, 0xe5, 0x6f, 0xfd, 0x1e, 0xe5, + 0xd7, 0x47, 0x54, 0xe0, 0x6c, 0x27, 0xa9, 0x3, + 0x6c, 0x8b, 0x7e, 0xef, 0x6f, 0xde, 0x9c, 0x4, + 0x9c, 0x6b, 0x36, 0x4, 0x4, 0x9d, 0x2a, 0x3, + 0x4, 0xd8, 0x9d, 0x6b, 0x6f, 0x81, 0x32, 0x4, + 0x32, 0x4b, 0x47, 0x4, 0x32, 0xe1, 0x3a, 0x27, + 0xf5, 0xe4, 0x32, 0x6f, 0x99, 0xf8, 0x32, 0x93, + 0x12, 0xc6, 0x8b, 0xa9, 0xd8, 0x84, 0x8b, 0x7c, + 0x6b, 0x9c, 0x4, 0x4, 0x9c, 0x39, 0x6f, 0x97, + 0xbd, 0xe4, 0x1e, 0xa9, 0x81, 0xe4, 0x93, 0x97, + 0x99, 0xca, 0x97, 0x4, 0x93, 0x9c, 0x7d, 0x3, + 0x40, 0xde, 0x47, 0x27, 0x90, 0xf3, 0x97, 0xc0, + 0xc6, 0x99, 0x9c, 0x93, 0xbd, 0x97, 0x4, 0x6b, + 0x27, 0xcf, 0x97, 0x8e, 0x1e, 0xf9, 0x26, 0x93, + 0x12, 0xcd, 0xed, + 0xe5, 0xe5, 0x54, 0xd7, 0xe, 0xc7, 0x8c, 0x58, + 0x24, 0x30, 0x1b, 0x63, 0x1b, 0x63, 0x63, 0x89, + 0x1b, 0x42, 0x67, 0x8, 0xf1, 0x63, 0x63, 0x63, + 0x63, 0xf1, 0x63, 0x89, 0x63, 0x63, 0x42, 0x58, + 0x42, 0x63, 0x63, 0xd2, 0xd2, 0xf1, 0x67, 0x67, + 0x67, 0x58, 0x67, 0x68, 0x30, 0x67, 0x58, 0xb5, + 0x5, 0xb3, 0x2f, 0x67, 0xb3, 0x87, 0x24, 0x1c, + 0x6d, 0x8c, 0x8c, 0x30, 0x30, 0x30, 0x67, 0xd3, + 0x41, 0x2f, 0x2f, 0x2f, 0x79, 0x2f, 0x2f, 0x42, + 0x63, 0xd2, 0x63, 0x63, 0xc2, 0x6e, 0x4a, 0x11, + 0x19, 0xd5, 0xe9, 0xe, 0xd7, 0xd7, 0xd2, 0x4a, + 0xef, 0x4a, 0xd7, 0x11, 0xd7, 0x4a, 0xd5, 0xe, + 0xd7, 0xd5, 0x5d, 0x2, 0xd2, 0xd7, 0x19, 0x4a, + 0xd5, 0x4a, 0x4a, 0xd7, 0x4a, 0xd7, 0xc5, 0xa5, + 0xd7, 0xd7, 0xc5, 0x77, 0x6b, 0x6f, 0xd7, 0xe5, + 0xce, 0x7d, 0xd7, 0x47, 0x2e, 0x4, 0xef, 0x98, + 0x9f, 0x15, 0x27, 0xa9, 0x39, 0x7d, 0x47, 0x36, + 0xde, 0xe5, 0xef, 0x47, 0xd8, 0x4, 0x3, 0xdb, + 0x8b, 0xe0, 0x47, 0x9b, 0xf5, 0x9c, 0x4, 0x36, + 0x2e, 0x47, 0x47, 0xa9, 0x9f, 0xfd, 0x9b, 0xdb, + 0x2a, 0x6b, 0xfd, 0xde, 0xbd, 0x6f, 0x9c, 0x81, + 0x2e, 0x4, 0xfd, 0xdb, 0x2a, 0x3, 0xfd, 0xf6, + 0x90, 0x7d, 0xf3, 0xe4, 0xb4, 0x8e, 0xdf, 0x8b, + 0x3, 0x3, 0xfd, 0x9f, 0x51, 0x27, 0xce, 0x85, + 0xc6, 0xdf, 0x81, 0x85, 0xf3, 0xde, 0xc6, 0x90, + 0x88, 0x9d, 0xe1, 0x85, 0x8b, 0x39, 0xed, 0x85, + 0xce, 0xb9, 0x4b, 0x99, 0xbd, 0xfd, 0x84, 0xd8, + 0xa9, 0x51, 0x75, 0xe1, 0x1e, 0x83, 0xdf, 0xce, + 0x12, 0xde, 0xe4, 0xf9, 0x1e, 0x57, 0x57, 0xe1, + 0x40, 0xdb, 0x70, 0xe4, 0xde, 0xe1, 0x4b, 0x9c, + 0xf3, 0xd8, 0x81, 0x75, 0x39, 0x40, 0x57, 0xe1, + 0xbd, 0x9f, 0xdf, 0xde, 0xce, 0xbf, 0xe4, 0xf5, + 0x1e, 0xe1, 0xe1, 0xbd, 0x83, 0x2a, 0xa2, 0x81, + 0x2e, 0xd8, 0xf5, 0xf5, 0xf3, 0xbf, 0xe1, 0xca, + 0x7d, 0x9f, 0x53, 0x3, 0x1e, 0x88, 0x7c, 0x47, + 0xde, 0x81, 0x81, 0xdf, 0x81, 0xce, 0x7, 0xc6, + 0x99, 0x88, 0xdc, 0xdb, 0xd8, 0xe1, 0x90, 0x9c, + 0xe4, 0xf4, 0xb4, 0x81, 0xdf, 0x84, 0x57, 0xcf, + 0xe1, 0x4b, 0x40, 0x74, 0xb4, 0xbf, 0xe4, 0xed, + 0xbf, 0xb4, 0xb4, 0xe1, 0xb2, 0xce, 0x85, 0x57, + 0x84, 0xc6, 0x90, 0x90, 0xb4, 0xe4, 0xe4, 0xdf, + 0xce, 0xe4, 0xde, 0xd8, 0x81, 0xdf, 0x71, 0x57, + 0xe1, 0xbf, 0xe4, 0xdf, 0xe4, 0xf4, 0xb4, 0xf4, + 0x81, 0xf3, 0xbf, 0x7, 0xbc, 0xf9, 0x83, 0x88, + 0xf6, 0xe4, 0xbf, 0xe4, 0xe4, 0xe4, 0xbf, 0xb4, + 0xb4, 0x81, 0xdd, 0xe1, 0xbc, 0xe1, 0xfa, 0xdd, + 0xc4, 0x4b, 0xb4, 0xce, 0xe4, 0x12, 0xcc, 0xbf, + 0xbb, 0x8d, 0x9a, + 0x6b, 0xfd, 0x1e, 0x27, 0x60, 0x8c, 0xd3, 0x76, + 0xab, 0x67, 0x42, 0x89, 0x63, 0x4a, 0x4a, 0x19, + 0x19, 0x1b, 0x8, 0x30, 0x42, 0xf1, 0x67, 0x2, + 0x6e, 0x63, 0xe9, 0x1b, 0x63, 0x4a, 0x19, 0x63, + 0x89, 0x1b, 0x79, 0x79, 0x63, 0x2f, 0x41, 0x67, + 0x79, 0x79, 0x67, 0x73, 0x5b, 0x2f, 0x2f, 0xd3, + 0x58, 0xb3, 0x82, 0xd3, 0x1, 0x2f, 0x82, 0x82, + 0xe3, 0x49, 0x67, 0x42, 0xa0, 0xa6, 0x1, 0xe3, + 0xe3, 0x82, 0xd3, 0xd3, 0xf1, 0x79, 0xf1, 0x30, + 0x89, 0x6e, 0x63, 0x63, 0x1b, 0x42, 0xd2, 0x79, + 0x19, 0x4a, 0x2f, 0x63, 0x11, 0xe5, 0xd7, 0x4a, + 0x7d, 0x4a, 0xd7, 0xd7, 0xe5, 0x6e, 0x5a, 0x5d, + 0xd2, 0xd5, 0xe9, 0x2f, 0xd2, 0x8f, 0xd7, 0xd7, + 0x6e, 0xc2, 0x4a, 0xc5, 0xd7, 0xd7, 0xe7, 0x50, + 0x3, 0xd7, 0xd7, 0xe5, 0x6b, 0xe5, 0xe5, 0x6f, + 0xd8, 0x6a, 0x27, 0xdb, 0x9d, 0x9d, 0x3, 0xfb, + 0x9d, 0x28, 0xb1, 0x90, 0x6b, 0xca, 0x1e, 0x9f, + 0x9f, 0xfd, 0x6b, 0xa9, 0x9d, 0x71, 0xc8, 0x40, + 0x83, 0x9c, 0xde, 0xdd, 0xdd, 0x47, 0x47, 0x9f, + 0xcf, 0xd8, 0xd8, 0x51, 0xdb, 0x1e, 0xde, 0x81, + 0x83, 0x1e, 0xde, 0xe1, 0xc6, 0x36, 0x90, 0xc6, + 0xcf, 0x7, 0x57, 0x9f, 0x18, 0x81, 0xe4, 0xe1, + 0xe1, 0x81, 0xb4, 0xb4, 0x7, 0x57, 0xe1, 0x90, + 0xdb, 0x74, 0x84, 0x84, 0x90, 0x81, 0xb4, 0xf4, + 0xbf, 0xb4, 0xb4, 0xb4, 0x9a, 0x57, 0xe1, 0x84, + 0x53, 0x9f, 0xb4, 0xe1, 0xe4, 0x81, 0xb4, 0xb4, + 0x9a, 0xe1, 0xe1, 0x84, 0xbc, 0xba, 0x85, 0xe1, + 0xe1, 0xf6, 0xe1, 0x9a, 0xe1, 0xde, 0xc6, 0xe4, + 0xb4, 0x7, 0xe1, 0xc6, 0x75, 0x74, 0x57, 0xe1, + 0x84, 0xe1, 0xb4, 0xb4, 0xe4, 0xe4, 0xe1, 0xe4, + 0xe4, 0x57, 0x53, 0xd8, 0x81, 0xe1, 0xe1, 0xe1, + 0xc6, 0xe4, 0xb4, 0xce, 0x8d, 0xe1, 0x7, 0xe1, + 0xd8, 0x7, 0xba, 0xd8, 0xce, 0xd8, 0x9f, 0xde, + 0xe4, 0xe4, 0xb4, 0x81, 0xe4, 0xc6, 0x53, 0x18, + 0x1e, 0x98, 0xdb, 0x18, 0x54, 0xc4, 0x81, 0xde, + 0xde, 0xce, 0xc6, 0xde, 0xde, 0x7, 0xbc, 0x53, + 0x36, 0x75, 0x18, 0x8b, 0x81, 0xe4, 0xbf, 0xc6, + 0xb4, 0xb4, 0x85, 0x7, 0xe1, 0x85, 0xa2, 0x53, + 0xc6, 0xb4, 0xc6, 0xf8, 0xe4, 0xe4, 0xe4, 0xf3, + 0xe4, 0xb4, 0x81, 0xcf, 0x75, 0xe1, 0x84, 0xf6, + 0xb4, 0xf4, 0x12, 0xde, 0xe4, 0xc6, 0xde, 0xde, + 0xd8, 0xde, 0x9d, 0x98, 0x9d, 0xe4, 0xbd, 0xc4, + 0xc6, 0xc4, 0x93, 0x97, 0xf3, 0xc6, 0xc0, 0xe4, + 0x8d, 0xe4, 0x9c, 0x40, 0x18, 0xd8, 0x6f, 0x36, + 0x90, 0x81, 0xf3, 0xdd, 0xe4, 0xde, 0xf5, 0x81, + 0xbc, 0xe1, 0x8e, 0x1e, 0x18, 0xf5, 0xb9, 0x97, + 0x26, 0x2e, 0xed, 0x9c, 0xcc, 0xb4, 0xe4, 0xdd, + 0x81, 0x57, 0x75, + 0x6b, 0x9f, 0x53, 0x8b, 0x4e, 0xa7, 0x6d, 0x41, + 0x87, 0xb3, 0xc9, 0x89, 0x63, 0x19, 0xd7, 0x7d, + 0x6e, 0xd5, 0xe7, 0xd2, 0x19, 0xc5, 0x2f, 0xd2, + 0x63, 0x63, 0x79, 0x1b, 0x63, 0x8f, 0xef, 0x6e, + 0x19, 0xd2, 0xa5, 0x6e, 0x19, 0xd2, 0x30, 0x5, + 0xd2, 0x8f, 0xa8, 0x5b, 0x1b, 0x7a, 0x2c, 0x49, + 0x67, 0x87, 0x8c, 0x8c, 0x58, 0x1, 0x24, 0xe3, + 0xe3, 0x8c, 0x52, 0x67, 0x2f, 0xc3, 0xab, 0x6d, + 0x8c, 0x64, 0x87, 0xe3, 0x2f, 0xa5, 0x2f, 0x8a, + 0x2f, 0x5d, 0xf1, 0x79, 0x89, 0x2f, 0xa5, 0xa5, + 0xe, 0xe, 0x63, 0x63, 0xd7, 0xd7, 0xd5, 0x4a, + 0x4a, 0xd7, 0xd2, 0x5d, 0x77, 0xef, 0xa5, 0xf1, + 0xc5, 0xe, 0xe, 0x89, 0x42, 0xd5, 0xd5, 0xa5, + 0xd5, 0xe, 0x5d, 0x5d, 0x5d, 0xef, 0xd2, 0xd2, + 0xd5, 0xd5, 0x4a, 0xd7, 0xd5, 0xd7, 0x11, 0x3, + 0x3, 0x47, 0xef, 0x3e, 0xa9, 0x3, 0xd5, 0xef, + 0x47, 0x3, 0x47, 0x36, 0x1e, 0x1e, 0x3, 0x98, + 0xdb, 0x3a, 0xe5, 0xef, 0x3, 0x47, 0x47, 0x4, + 0x36, 0x47, 0x6c, 0x3, 0x3, 0x3, 0x6c, 0x3a, + 0x3e, 0x27, 0x47, 0x6b, 0x3, 0x47, 0x8e, 0xfd, + 0xfd, 0xfd, 0xfd, 0xfd, 0xcf, 0x9d, 0xfd, 0xd8, + 0x40, 0x28, 0xd8, 0x81, 0xdd, 0xde, 0xde, 0x81, + 0xde, 0xde, 0xde, 0x9a, 0xcf, 0x53, 0x84, 0x75, + 0xf6, 0x8b, 0x4b, 0xb4, 0xb4, 0xde, 0xe4, 0xb4, + 0xe1, 0x57, 0xe1, 0xe1, 0xcf, 0xdb, 0xe1, 0xe4, + 0x81, 0xbd, 0x81, 0xe1, 0xde, 0xde, 0xb4, 0x85, + 0xd8, 0xcf, 0x57, 0xe1, 0x9d, 0x88, 0xc6, 0xc6, + 0xde, 0xfd, 0xe4, 0x81, 0x8e, 0xde, 0xc6, 0xde, + 0xde, 0x9d, 0x57, 0xc6, 0x1e, 0xd8, 0x4b, 0xde, + 0x32, 0xde, 0xe4, 0xe4, 0xd8, 0xd8, 0x57, 0xd8, + 0xfd, 0x3a, 0x18, 0x36, 0x47, 0xde, 0xc6, 0xf5, + 0x6f, 0xde, 0x85, 0xd8, 0x4, 0x40, 0xcf, 0x40, + 0x4, 0x3, 0x8b, 0xfd, 0x6f, 0x26, 0x2e, 0x47, + 0x4, 0xbd, 0x57, 0xfd, 0x4, 0x8b, 0x98, 0xa9, + 0xe5, 0x6b, 0x4f, 0x7d, 0x9c, 0x32, 0xde, 0xe5, + 0x6b, 0x99, 0xd8, 0x3, 0x9c, 0x90, 0x88, 0x43, + 0x32, 0xbd, 0x1e, 0x7d, 0x99, 0xdd, 0xe4, 0xfd, + 0x1e, 0x90, 0x90, 0x3a, 0x9d, 0xe1, 0x90, 0x27, + 0xce, 0xbf, 0x32, 0x9c, 0xca, 0x81, 0x32, 0x47, + 0xd8, 0x81, 0x7c, 0x27, 0xd8, 0xb4, 0xc6, 0x99, + 0xdf, 0xe4, 0x32, 0x47, 0xca, 0x99, 0xe5, 0x3, + 0x3a, 0x3, 0xd9, 0xd9, 0x27, 0x6f, 0x4, 0x6c, + 0x7d, 0x4, 0x4, 0x4, 0x32, 0xf5, 0x6f, 0x8e, + 0x9f, 0xde, 0xe5, 0x7d, 0x6b, 0x9c, 0x4, 0x4, + 0x99, 0x99, 0x4, 0x8e, 0x57, 0xd8, 0x6b, 0x6b, + 0x18, 0xd8, 0x4, 0x6f, 0x99, 0x6f, 0x6f, 0x4, + 0x4, 0xf3, 0x7d, 0x6b, 0x97, 0x84, 0xd8, 0x9c, + 0xca, 0x90, 0x8e, + 0x1e, 0x98, 0x7c, 0x8b, 0xe8, 0xa8, 0x58, 0x5, + 0xa4, 0x30, 0x8, 0x1b, 0x42, 0x60, 0x50, 0xd5, + 0xef, 0xe5, 0xd5, 0x6e, 0xd5, 0x6e, 0x19, 0x63, + 0x6e, 0xd2, 0x2f, 0x42, 0x63, 0x5d, 0x49, 0xa5, + 0x6e, 0x4a, 0xd5, 0x19, 0x19, 0x4a, 0x63, 0x63, + 0x89, 0xd2, 0x2f, 0x2f, 0x6e, 0xa5, 0x1, 0x2f, + 0xe9, 0x96, 0x96, 0x5b, 0x5b, 0x73, 0x68, 0x58, + 0xda, 0x6d, 0x41, 0x24, 0x8c, 0x2f, 0x67, 0xd3, + 0xb3, 0xc7, 0xe9, 0xf1, 0xa0, 0xa6, 0x58, 0xa, + 0x41, 0xd3, 0xd3, 0xd3, 0x8c, 0xa5, 0x1, 0x67, + 0xf1, 0xe9, 0x63, 0xe9, 0xe, 0xd2, 0xe9, 0x2f, + 0x5d, 0xe, 0x2f, 0x58, 0x2f, 0x4a, 0xe7, 0x5a, + 0x2f, 0x42, 0x79, 0x2f, 0xe, 0x42, 0x5a, 0x2f, + 0xe9, 0x6e, 0x6e, 0x2f, 0x2f, 0xe9, 0xe, 0xe9, + 0xd2, 0x73, 0xa5, 0xa5, 0x5d, 0xe, 0xe, 0x2, + 0x5d, 0xd5, 0x4a, 0x19, 0xc2, 0xd5, 0x4a, 0xd5, + 0xd2, 0x6e, 0x6e, 0x5d, 0x5d, 0x77, 0xef, 0xc5, + 0x77, 0x4a, 0xd5, 0x4a, 0xd2, 0x6e, 0x6e, 0xd7, + 0xd7, 0x5d, 0xe, 0x2f, 0x2f, 0xd2, 0xd2, 0xd2, + 0x96, 0x19, 0x19, 0xd7, 0xd7, 0x4a, 0xd7, 0xd7, + 0x3a, 0x5d, 0xd7, 0xef, 0x77, 0xd5, 0xe5, 0x47, + 0xe5, 0xe5, 0x9c, 0xde, 0x47, 0x6c, 0x6b, 0x6b, + 0x3a, 0x3a, 0xfd, 0x81, 0x39, 0xe5, 0xf5, 0xce, + 0x1e, 0x6b, 0x39, 0xc6, 0xd8, 0x3, 0xd8, 0x90, + 0x1e, 0xfd, 0x81, 0xc6, 0x6f, 0xe5, 0xbd, 0xe4, + 0x8e, 0x4, 0x7d, 0x36, 0x47, 0x3a, 0x9d, 0xed, + 0x9c, 0x27, 0x1e, 0x81, 0xe0, 0x6b, 0x9c, 0xdd, + 0x47, 0xfd, 0x1e, 0x83, 0x4, 0x3, 0xcf, 0xd8, + 0x9c, 0x6b, 0x81, 0x2e, 0x4, 0x4, 0x99, 0x9c, + 0x4, 0xfd, 0xcf, 0x9d, 0xe5, 0x1e, 0x9f, 0x7b, + 0x6f, 0x6f, 0x9c, 0x4, 0x4, 0x4, 0x36, 0x27, + 0x4, 0xfd, 0x53, 0x9d, 0x6b, 0x39, 0x40, 0x9b, + 0x4, 0x6f, 0x39, 0x6c, 0x4, 0xfd, 0xfd, 0x27, + 0xe5, 0xfd, 0x74, 0x27, 0xe5, 0x6f, 0x6b, 0xd7, + 0x6c, 0x9c, 0x99, 0x7d, 0x6c, 0x7b, 0x9d, 0xa9, + 0xef, 0x99, 0x83, 0x4, 0x97, 0xdf, 0xf5, 0x4, + 0x97, 0xdd, 0x9c, 0x6b, 0x6b, 0xde, 0x71, 0x3a, + 0x9d, 0x99, 0xb1, 0x47, 0xb1, 0xbf, 0x9c, 0x6f, + 0x12, 0xf3, 0xbd, 0x47, 0x6b, 0xde, 0xdd, 0x3, + 0x1e, 0xed, 0x9c, 0x6f, 0xbd, 0xbf, 0xdd, 0x6f, + 0xde, 0xdd, 0x97, 0xfd, 0x9d, 0x6b, 0x9c, 0x47, + 0x83, 0xca, 0x9c, 0xe5, 0x9c, 0x97, 0x4, 0x9c, + 0x6f, 0xe5, 0x4, 0x4, 0xfd, 0xdf, 0x93, 0x93, + 0xc0, 0xce, 0x97, 0x9c, 0xf5, 0xf3, 0x4, 0x97, + 0xd8, 0x90, 0x93, 0xde, 0x9f, 0x4b, 0x9c, 0xf3, + 0xbf, 0xe4, 0x12, 0xf3, 0xdd, 0xfd, 0x8e, 0x4, + 0x26, 0xd8, 0x9b, 0x26, 0xce, 0xfa, 0xce, 0xb1, + 0xc0, 0xaf, 0xf3, + 0xe5, 0xef, 0x4f, 0xef, 0xd5, 0x2f, 0x24, 0x3b, + 0x58, 0x2f, 0x2f, 0xae, 0x42, 0x67, 0x30, 0x1b, + 0x4a, 0xe, 0xe, 0x19, 0x19, 0x6e, 0x63, 0x63, + 0x63, 0x42, 0xa5, 0x1b, 0x63, 0x8, 0x58, 0x89, + 0x63, 0xa5, 0x77, 0x63, 0x19, 0x19, 0x79, 0xd2, + 0x63, 0x1b, 0x1b, 0x1b, 0x19, 0xd2, 0x30, 0x89, + 0x19, 0xe, 0x2f, 0xf1, 0x63, 0x1b, 0x2f, 0x2f, + 0x2, 0x73, 0xa0, 0x8, 0x73, 0x67, 0xbe, 0x4d, + 0xb5, 0x67, 0x8c, 0x8c, 0x87, 0xda, 0xe3, 0xd3, + 0x1, 0x8c, 0xb5, 0x78, 0x41, 0x24, 0x1, 0x82, + 0x58, 0x67, 0x67, 0x2f, 0xd3, 0x8, 0x30, 0x8c, + 0xf1, 0x63, 0x8, 0x58, 0x8, 0x79, 0x2f, 0x8c, + 0x41, 0xb5, 0xd3, 0x8c, 0x2f, 0xae, 0x42, 0x42, + 0x63, 0x4a, 0xd2, 0x41, 0x30, 0x8, 0x67, 0x41, + 0x41, 0x41, 0x58, 0x58, 0x2f, 0xa5, 0x1b, 0x89, + 0x1b, 0x4a, 0xd7, 0x63, 0xae, 0x73, 0x79, 0xa5, + 0x2f, 0x2f, 0x63, 0xd2, 0xc5, 0x6e, 0x4a, 0xd5, + 0x6e, 0xd2, 0xe, 0x2d, 0x8c, 0x8, 0x1b, 0xd2, + 0xa5, 0xd2, 0xe9, 0x5b, 0x8, 0x79, 0x6e, 0x19, + 0x1b, 0x6e, 0x4a, 0x4a, 0xa5, 0x5d, 0xe9, 0xe, + 0x2d, 0xd2, 0x4a, 0xd7, 0x4a, 0x4a, 0xd7, 0x6c, + 0x4, 0x3, 0x47, 0xd8, 0xc8, 0x98, 0xc8, 0xfd, + 0x1e, 0x47, 0xbd, 0x81, 0xde, 0xde, 0x2e, 0x84, + 0xc6, 0x9d, 0x40, 0x57, 0xc8, 0xa9, 0x75, 0x81, + 0xde, 0xde, 0xe4, 0xe4, 0xb4, 0xde, 0xe1, 0xe4, + 0xd8, 0x3a, 0xdb, 0xc4, 0x1e, 0x9d, 0xc6, 0xce, + 0xbd, 0xbd, 0xe4, 0x9, 0x2e, 0xde, 0x75, 0xe1, + 0xbd, 0x53, 0x53, 0x81, 0x36, 0xd8, 0x90, 0xde, + 0xde, 0xde, 0xe1, 0xe1, 0x2e, 0x81, 0x57, 0xe1, + 0xd8, 0x9d, 0x53, 0xd8, 0xde, 0xbf, 0x8d, 0xb1, + 0xbd, 0xde, 0xb4, 0xd8, 0xde, 0xd8, 0xdb, 0x53, + 0xd8, 0xe1, 0xf6, 0xd8, 0xde, 0xb1, 0xe1, 0x81, + 0xde, 0x84, 0xd8, 0x9d, 0xd8, 0xd8, 0xdb, 0x40, + 0xd8, 0x81, 0x81, 0xfd, 0xde, 0xbd, 0x81, 0x1e, + 0x90, 0x81, 0x81, 0x53, 0x9f, 0xe1, 0x90, 0x18, + 0x71, 0x81, 0x84, 0x86, 0xfa, 0xbf, 0xb4, 0xe1, + 0xc6, 0x4b, 0x7, 0x53, 0x9f, 0xe1, 0xf6, 0x4b, + 0xe1, 0x95, 0xbf, 0x8d, 0xb4, 0xb4, 0xb4, 0xe1, + 0x57, 0x9a, 0x81, 0x7, 0x57, 0xe1, 0xc6, 0xc6, + 0xe4, 0xf4, 0xbf, 0x8d, 0xe1, 0xe1, 0xe1, 0xe1, + 0xbc, 0x75, 0xe1, 0xf6, 0x75, 0xb4, 0xbf, 0xc6, + 0x4b, 0xe1, 0xce, 0x9c, 0xf6, 0x8b, 0x86, 0xd8, + 0x53, 0x1e, 0x6c, 0x6f, 0xe1, 0xf4, 0xb4, 0xf4, + 0x4b, 0xbf, 0xbf, 0xbf, 0xe1, 0xf6, 0x90, 0x81, + 0xe1, 0xe4, 0xaf, 0xf9, 0x4b, 0xe4, 0xe4, 0xbb, + 0xb4, 0x4b, 0x81, 0xf4, 0xbc, 0x53, 0xdb, 0x40, + 0x90, 0xfa, 0x86, 0xaf, 0xcc, 0xf9, 0xcd, 0xbf, + 0xbf, 0xf4, 0xe1, + 0x7b, 0x1e, 0x8b, 0xa9, 0x5d, 0x1, 0xd3, 0xe3, + 0x82, 0xab, 0xa8, 0x79, 0x1b, 0x89, 0x1b, 0x19, + 0x19, 0xd2, 0xe9, 0x19, 0x63, 0xf1, 0x2f, 0x79, + 0x63, 0xd2, 0xd2, 0x63, 0x19, 0x63, 0xd2, 0x63, + 0x63, 0x79, 0xf1, 0x42, 0x6e, 0xd2, 0x2d, 0x63, + 0x4a, 0x4a, 0xd5, 0x4a, 0xd5, 0xd5, 0xd5, 0x19, + 0xd5, 0xd2, 0x2f, 0x67, 0xa5, 0xa5, 0x67, 0x79, + 0x6e, 0xd5, 0xd5, 0xd2, 0x1b, 0x14, 0xb5, 0x78, + 0xd1, 0x62, 0x1c, 0xa, 0xe3, 0x66, 0xa, 0xd3, + 0x52, 0x67, 0x8c, 0xd3, 0x8c, 0x8c, 0x24, 0x4d, + 0xe3, 0x1c, 0xb5, 0x4d, 0x41, 0x8c, 0x58, 0x67, + 0x73, 0xc9, 0x8, 0xa8, 0x67, 0x59, 0xd3, 0xac, + 0xa, 0x6, 0x3b, 0x58, 0x8, 0xd2, 0xd2, 0xd2, + 0xd9, 0x77, 0xa5, 0x2f, 0x67, 0x67, 0x8c, 0xb5, + 0xa, 0x1c, 0x6d, 0xb5, 0x8c, 0x8, 0x79, 0xa5, + 0xa5, 0xe7, 0xe9, 0x79, 0xa8, 0x8c, 0x8c, 0x41, + 0x2f, 0xd2, 0x63, 0xae, 0xd5, 0xd5, 0x4a, 0x77, + 0x5d, 0xf1, 0x2f, 0x8c, 0x8c, 0x67, 0xd2, 0xd2, + 0xe9, 0xd2, 0xd2, 0x67, 0x30, 0x30, 0x5b, 0xa5, + 0xa5, 0x2f, 0x2f, 0x42, 0x79, 0x79, 0x4a, 0x79, + 0xd2, 0x63, 0x4a, 0xd5, 0xd5, 0x4a, 0xd2, 0xef, + 0x3a, 0x98, 0x3a, 0x81, 0x9b, 0x9d, 0x1e, 0xbd, + 0xe1, 0xf8, 0xde, 0xe1, 0xe1, 0x57, 0x57, 0x75, + 0x40, 0xb, 0x53, 0xe1, 0xe1, 0xf6, 0xde, 0xb4, + 0xe4, 0xe1, 0xe1, 0xe1, 0xb4, 0x57, 0x74, 0xc6, + 0xf6, 0x18, 0x74, 0xe1, 0x84, 0x4b, 0xfa, 0x8d, + 0xe4, 0xde, 0xe1, 0xc6, 0xc6, 0x75, 0x74, 0x57, + 0x90, 0xf6, 0x75, 0xe1, 0x81, 0xdf, 0xfc, 0xd8, + 0xd8, 0xd8, 0xd8, 0x9d, 0xfd, 0xd8, 0xdb, 0x40, + 0x7b, 0x83, 0x83, 0x9c, 0xfd, 0xde, 0x90, 0x90, + 0xfd, 0xd8, 0x53, 0x51, 0x8b, 0x90, 0x40, 0x40, + 0xd8, 0x81, 0x81, 0xbd, 0xde, 0xde, 0x81, 0x18, + 0x9d, 0xd8, 0x40, 0x98, 0x8b, 0x39, 0x1e, 0x47, + 0x4, 0x8e, 0x83, 0xfd, 0xfd, 0x81, 0x75, 0x2a, + 0x7e, 0x90, 0x84, 0x8b, 0x90, 0x83, 0x7d, 0x9c, + 0xbd, 0xb4, 0x4b, 0x39, 0xd8, 0x9a, 0xb4, 0xdb, + 0x88, 0x39, 0xb2, 0x1e, 0xd8, 0x4b, 0xdf, 0xdf, + 0xe4, 0xbf, 0xb4, 0x9c, 0x18, 0xc6, 0xb4, 0xd8, + 0x18, 0x90, 0xdf, 0xb2, 0xc6, 0xb4, 0x4b, 0xdf, + 0xc6, 0x95, 0xf3, 0x36, 0x18, 0x90, 0xdd, 0xfd, + 0x81, 0xf9, 0x9c, 0xf3, 0xb4, 0xe4, 0xbd, 0x6f, + 0x7d, 0x9d, 0x47, 0x47, 0x2a, 0x7c, 0x39, 0xf3, + 0xbf, 0xdd, 0x99, 0x9c, 0xaf, 0x95, 0xf3, 0xc6, + 0x4b, 0x39, 0xfd, 0xc0, 0x7, 0x18, 0x9c, 0x9c, + 0xf3, 0xc6, 0xf5, 0x93, 0x99, 0xc0, 0x93, 0x12, + 0x4b, 0x51, 0x1e, 0xce, 0xb2, 0x9d, 0xc8, 0x6b, + 0x99, 0xce, 0x9, 0x32, 0xf3, 0x12, 0x2e, 0x26, + 0xc0, 0xcc, 0x1e, + 0xd8, 0x84, 0xdb, 0x3e, 0xb8, 0x94, 0x82, 0xb5, + 0x82, 0x82, 0xa6, 0xc2, 0x6e, 0xc5, 0xc2, 0x6e, + 0x6e, 0xef, 0xe, 0xc5, 0xd5, 0x5a, 0x42, 0x6e, + 0x19, 0xa5, 0xc5, 0xe9, 0x19, 0xc2, 0xef, 0xc2, + 0xef, 0x8f, 0xa5, 0xd2, 0x6e, 0xd2, 0x42, 0x63, + 0x4a, 0x6e, 0xd5, 0x6e, 0xef, 0xef, 0xef, 0x77, + 0xef, 0x6e, 0xa5, 0x42, 0x79, 0x2f, 0xb3, 0x42, + 0x6e, 0x77, 0xc5, 0xe7, 0xc9, 0x87, 0xa, 0xd1, + 0xd1, 0xd1, 0x23, 0xd1, 0xe3, 0x78, 0x62, 0x4d, + 0x6d, 0xab, 0xd3, 0x8c, 0xa7, 0x1, 0x82, 0x58, + 0x58, 0xe3, 0x1c, 0x1c, 0xb5, 0x6d, 0xe3, 0x4d, + 0x65, 0xc3, 0x52, 0x94, 0x55, 0x52, 0xbe, 0xb5, + 0xe3, 0x58, 0x58, 0x8, 0xa5, 0x6e, 0x2f, 0x67, + 0x59, 0xc9, 0x67, 0x49, 0x49, 0x49, 0x67, 0x8c, + 0x67, 0x8c, 0xa, 0xa, 0x4d, 0x6d, 0x1, 0xab, + 0xa8, 0xad, 0x8, 0x2f, 0x49, 0x1, 0xa0, 0x45, + 0x73, 0x6e, 0xe9, 0x2f, 0xe, 0x21, 0xd2, 0x5d, + 0xa8, 0x55, 0xe3, 0x82, 0xa7, 0x2f, 0xa5, 0x5b, + 0xf0, 0x1b, 0x2, 0x58, 0x8c, 0x1c, 0x82, 0xa7, + 0x52, 0x1, 0x68, 0xa0, 0x73, 0x63, 0xd2, 0xd2, + 0x8, 0x79, 0xa5, 0x5d, 0x8c, 0x2f, 0x2f, 0xe9, + 0xe9, 0x5d, 0xef, 0x6b, 0x27, 0x6b, 0xe5, 0x47, + 0xb1, 0x27, 0x8b, 0xd8, 0xd8, 0xa9, 0x51, 0x8b, + 0xd8, 0x9d, 0x40, 0x36, 0x90, 0x99, 0xd8, 0xdd, + 0xfd, 0x47, 0x83, 0x81, 0xd8, 0xc8, 0x9d, 0x90, + 0x99, 0x8e, 0xfd, 0xc6, 0x99, 0x7d, 0x81, 0xc6, + 0xde, 0xde, 0x18, 0x8b, 0xfd, 0xfd, 0x75, 0xc6, + 0x6b, 0xf5, 0x70, 0x2e, 0x32, 0x47, 0x35, 0x3, + 0x6c, 0xe5, 0x3a, 0x27, 0xe5, 0xe5, 0x3, 0xd7, + 0xd7, 0xe5, 0xe5, 0x6c, 0x6c, 0x6c, 0x27, 0x77, + 0x3, 0xe5, 0x27, 0x98, 0xef, 0x47, 0x36, 0x47, + 0x4, 0x6f, 0x32, 0x47, 0x47, 0x47, 0x3, 0x5d, + 0xc5, 0xef, 0x3, 0xef, 0xd5, 0xd7, 0xe5, 0x6c, + 0x6c, 0xe5, 0xd7, 0xd5, 0xef, 0x47, 0x3, 0xe8, + 0x77, 0x47, 0xce, 0x47, 0x9c, 0x9c, 0x99, 0x47, + 0x4, 0xbd, 0xde, 0x27, 0x8b, 0xc6, 0xb2, 0x1e, + 0x3, 0x9c, 0x7b, 0x4, 0x9c, 0xb1, 0x8e, 0x9c, + 0xfd, 0xc6, 0xdd, 0x47, 0x27, 0xd8, 0x32, 0x7b, + 0x8e, 0x2e, 0x93, 0x8e, 0xbd, 0xe4, 0xf5, 0x9c, + 0x1e, 0xc6, 0xf5, 0x9c, 0x3a, 0x1e, 0x32, 0x4, + 0x12, 0xf3, 0xf5, 0x9c, 0xdd, 0xe4, 0x4, 0xe5, + 0xa9, 0xe8, 0xef, 0xe5, 0x6b, 0x47, 0x9c, 0x6f, + 0xf3, 0x12, 0x4, 0x4, 0xc0, 0xe1, 0x32, 0x97, + 0xd8, 0x3a, 0x47, 0x4, 0xbd, 0xbd, 0x9c, 0x6f, + 0xc0, 0x93, 0x4, 0x6f, 0xde, 0xfd, 0x47, 0x7b, + 0xde, 0x9d, 0x47, 0x4, 0xf3, 0x6f, 0x26, 0x6c, + 0x6f, 0x93, 0x9c, 0x4, 0x93, 0xc0, 0x1e, 0xfd, + 0x93, 0xb4, 0x26, + 0x90, 0x8b, 0x18, 0xeb, 0xe8, 0x59, 0x67, 0x8c, + 0x1c, 0x8a, 0x30, 0xad, 0x8c, 0x67, 0xa6, 0xa6, + 0x96, 0xd5, 0xd5, 0xef, 0x4a, 0x19, 0x63, 0x4a, + 0x19, 0x42, 0x89, 0x42, 0xe, 0xa8, 0x60, 0xe7, + 0xe7, 0xd2, 0x6e, 0x19, 0x19, 0x4a, 0x4a, 0x63, + 0x19, 0xa5, 0xa5, 0x2f, 0x5b, 0x60, 0xe9, 0xa5, + 0xc5, 0x1b, 0x6e, 0x63, 0x63, 0x63, 0x89, 0x1b, + 0x42, 0x2f, 0x1, 0x8c, 0x8c, 0x6d, 0xd1, 0xd1, + 0x76, 0xd1, 0x23, 0xd1, 0x62, 0xb5, 0x1c, 0x1c, + 0x62, 0x6, 0x3b, 0xb5, 0x24, 0x24, 0xe3, 0x89, + 0x42, 0x42, 0x73, 0x73, 0x67, 0x58, 0x62, 0xa, + 0xd1, 0x5e, 0x37, 0x78, 0x61, 0x61, 0x4d, 0x58, + 0x79, 0xf1, 0x8, 0x8, 0x79, 0xa5, 0x8, 0x73, + 0x8, 0x79, 0xa6, 0x67, 0x2f, 0x5a, 0x8c, 0x58, + 0x2f, 0x2f, 0xa, 0x62, 0x62, 0xe3, 0x4d, 0x6d, + 0x24, 0x24, 0x24, 0x58, 0x67, 0x67, 0x67, 0x89, + 0x42, 0xd2, 0xd2, 0x6e, 0x79, 0x2f, 0xf1, 0xb3, + 0x8c, 0x24, 0xe3, 0x62, 0xb5, 0x8c, 0x2f, 0x8, + 0x8, 0x2f, 0x2f, 0x41, 0xe3, 0x29, 0x62, 0xa, + 0xa, 0x5e, 0x82, 0xb5, 0x41, 0x67, 0x67, 0x2f, + 0x30, 0xb5, 0x8c, 0x30, 0x5, 0x8c, 0x30, 0x24, + 0x2f, 0xd2, 0xd5, 0x11, 0x4a, 0x4a, 0x77, 0xc5, + 0xd5, 0x77, 0x77, 0xef, 0xe5, 0xe5, 0x6c, 0x47, + 0x4, 0xd7, 0x47, 0xfd, 0x6c, 0xd7, 0x3, 0x3, + 0x6c, 0xe5, 0x27, 0x1e, 0x6f, 0x4, 0x9c, 0x32, + 0x4, 0x4, 0xfd, 0xd8, 0x6c, 0xe5, 0x9d, 0x9d, + 0x47, 0x4, 0xfd, 0xde, 0x6f, 0xb1, 0xde, 0xde, + 0x9c, 0x6c, 0xd8, 0x3a, 0x3, 0xd7, 0x77, 0xa5, + 0xd7, 0xd7, 0xd7, 0x4a, 0x19, 0xd7, 0x4a, 0xd7, + 0xd7, 0x4a, 0x4a, 0x5d, 0xe, 0xd7, 0xd5, 0xe7, + 0x4a, 0x4a, 0xd5, 0x4a, 0xd7, 0x6c, 0x4, 0xd7, + 0xd7, 0xd7, 0x6c, 0x5d, 0xe7, 0x8f, 0xd7, 0xd5, + 0x11, 0xd7, 0x4a, 0xd5, 0x4a, 0xd7, 0xd7, 0xe, + 0x5d, 0xe, 0xe9, 0x5d, 0xa5, 0xd9, 0xe5, 0x11, + 0xe5, 0x32, 0xf5, 0xe5, 0x6c, 0xb9, 0xce, 0x3, + 0xa9, 0x74, 0xde, 0x47, 0x6b, 0x71, 0x9c, 0x4, + 0x9c, 0xbd, 0xbd, 0x6b, 0x47, 0xd8, 0xde, 0x4, + 0xa9, 0x40, 0xf5, 0x4, 0x26, 0xce, 0x9c, 0x6f, + 0x93, 0xde, 0xdd, 0x4, 0x1e, 0xd8, 0x97, 0x8e, + 0x9d, 0x90, 0x99, 0x6f, 0x93, 0xe4, 0xf3, 0x6f, + 0xf5, 0xe1, 0x32, 0x32, 0x9f, 0x53, 0x36, 0x4, + 0x47, 0x27, 0xd9, 0xe5, 0x9c, 0xf3, 0x4, 0x97, + 0xdf, 0xd8, 0x26, 0x93, 0xc6, 0x18, 0x39, 0xf3, + 0xe4, 0xf8, 0x32, 0x6f, 0x81, 0xde, 0x32, 0x32, + 0x81, 0x8b, 0x3, 0x8e, 0xbd, 0x9f, 0x7d, 0xf5, + 0xe4, 0xf3, 0x93, 0x93, 0x7d, 0xfd, 0xfd, 0x9b, + 0x26, 0x70, 0x40, 0x25, 0xde, 0xe4, 0x93, 0xed, + 0xf9, 0xce, 0xf3, + 0x4, 0x47, 0xd8, 0x27, 0xc5, 0xa5, 0x67, 0x8c, + 0x58, 0x30, 0x67, 0xb3, 0x58, 0x8c, 0x8, 0x68, + 0x58, 0x5a, 0x4a, 0x19, 0x63, 0x19, 0x4a, 0x63, + 0xd2, 0x19, 0x63, 0xd2, 0x63, 0x89, 0x1b, 0x19, + 0x79, 0xf1, 0x63, 0x6e, 0xd2, 0xe, 0xd5, 0xd2, + 0x79, 0x42, 0x19, 0x19, 0x42, 0x42, 0x19, 0x63, + 0xe, 0xf1, 0x79, 0x63, 0x63, 0x63, 0x63, 0x79, + 0x79, 0x42, 0x89, 0x89, 0x89, 0x8a, 0x1c, 0xa, + 0xa, 0xa, 0x1c, 0xa, 0xa, 0xe3, 0x8, 0x8, + 0xf1, 0x63, 0x89, 0x1b, 0x42, 0x30, 0x5, 0x42, + 0x79, 0x8c, 0x2f, 0x67, 0xd3, 0xe3, 0x78, 0x41, + 0x82, 0xe3, 0xa, 0x1c, 0x6d, 0x29, 0x6d, 0x30, + 0x2f, 0x1, 0x2f, 0x2f, 0x7a, 0x60, 0x1b, 0x19, + 0x4a, 0x4a, 0x1b, 0x89, 0x63, 0x8, 0x41, 0x5, + 0x41, 0xac, 0x62, 0xd1, 0xd3, 0xd3, 0xe3, 0x58, + 0xf1, 0x42, 0x67, 0x1c, 0x1c, 0x1c, 0xe3, 0x8c, + 0x2f, 0xa5, 0x2f, 0x19, 0x19, 0xd2, 0x6e, 0x5b, + 0xa0, 0x58, 0x62, 0x29, 0x8a, 0x5, 0x58, 0x8c, + 0x67, 0x67, 0x67, 0xb3, 0x67, 0xe3, 0x29, 0xa, + 0xa, 0xa, 0x1c, 0x76, 0xb5, 0x76, 0xa, 0xd1, + 0xd1, 0x76, 0x62, 0x41, 0x58, 0x30, 0x67, 0x41, + 0x5, 0xa0, 0x2f, 0x2f, 0xd2, 0x5d, 0x1, 0x2f, + 0xd2, 0x4a, 0x4a, 0xd5, 0xd5, 0xd5, 0x47, 0x71, + 0x47, 0xef, 0xe8, 0x3a, 0x47, 0xe5, 0x77, 0x4f, + 0xe5, 0xe5, 0xfd, 0xde, 0x47, 0x6b, 0xd8, 0x57, + 0xfd, 0x47, 0x2a, 0x2a, 0x1e, 0xfd, 0xd8, 0x90, + 0x99, 0x8e, 0xe1, 0xc6, 0x2e, 0x1e, 0xd8, 0xcf, + 0x9b, 0xfd, 0xdb, 0x2a, 0x19, 0x6c, 0x6c, 0xe5, + 0xd5, 0x19, 0x4a, 0x4a, 0xe, 0xd2, 0x42, 0x2f, + 0xd2, 0xe9, 0xe, 0x42, 0xe9, 0x6e, 0xd7, 0x4a, + 0xd2, 0x1b, 0x6e, 0xe9, 0x19, 0xd7, 0x3a, 0x50, + 0x5d, 0x11, 0x36, 0xe5, 0xe, 0xd5, 0xe5, 0xd7, + 0xd5, 0xc2, 0x1b, 0xa5, 0x5d, 0xe9, 0x6e, 0x2f, + 0x8, 0x2f, 0xd5, 0xc5, 0xa5, 0xd4, 0xd9, 0x1e, + 0x1e, 0x81, 0x90, 0x4f, 0xdb, 0xf6, 0xe1, 0x81, + 0x7d, 0xdf, 0xc6, 0xbf, 0xe4, 0x4b, 0xdf, 0x2e, + 0xd8, 0x75, 0xd8, 0x39, 0x88, 0x9f, 0xce, 0xf3, + 0x4b, 0xdf, 0x9, 0x9, 0x8d, 0xc6, 0xdf, 0xf5, + 0xf6, 0xbc, 0xe1, 0x86, 0x83, 0x81, 0xb4, 0xe4, + 0xe4, 0xdf, 0xdf, 0xf3, 0xf4, 0x9a, 0xb4, 0xdf, + 0x90, 0x53, 0xe1, 0xe4, 0x81, 0xdf, 0x1e, 0xde, + 0xde, 0x81, 0x7d, 0x9c, 0x81, 0x75, 0x7, 0x81, + 0xca, 0xf6, 0xe4, 0xbf, 0xf4, 0xfa, 0xf3, 0xb4, + 0xb4, 0xf4, 0xc6, 0x9c, 0xc6, 0xbc, 0x53, 0xe1, + 0x4b, 0xf5, 0xc6, 0xbf, 0xf4, 0xbf, 0xdf, 0xbd, + 0xbf, 0xf4, 0xe1, 0x90, 0xdf, 0x8b, 0x27, 0xa9, + 0x40, 0xc6, 0x81, 0xf5, 0xaf, 0xbb, 0xbb, 0xb1, + 0xc0, 0xe4, 0xb4, + 0xf5, 0x54, 0x8b, 0x8b, 0x5d, 0x2c, 0x49, 0x94, + 0xd3, 0x67, 0xa5, 0xc7, 0x8c, 0x58, 0x1b, 0x6e, + 0x89, 0x6e, 0xef, 0x19, 0x2f, 0xe9, 0x4a, 0x79, + 0x79, 0x6e, 0xd7, 0x4a, 0x4a, 0xd7, 0x4a, 0x4a, + 0x19, 0x1b, 0x63, 0xd2, 0x2f, 0xe9, 0xc2, 0xe, + 0x79, 0x42, 0xc2, 0x4a, 0xd5, 0x19, 0xc2, 0x19, + 0x42, 0x79, 0x89, 0x79, 0xf1, 0x2d, 0x63, 0xe, + 0x63, 0x19, 0x19, 0x19, 0x63, 0x2f, 0x8a, 0x29, + 0x23, 0xa, 0x62, 0xa, 0x62, 0x76, 0x8c, 0xa5, + 0x77, 0xef, 0x19, 0x19, 0xd5, 0x6e, 0xd2, 0xd2, + 0x8, 0x8c, 0x41, 0x8c, 0x78, 0xa, 0x29, 0xd3, + 0x52, 0xd3, 0xe3, 0x68, 0xb3, 0xd3, 0xe3, 0x67, + 0xb3, 0xe3, 0x8a, 0x2, 0xc5, 0xc7, 0xa5, 0x6e, + 0xef, 0xd7, 0x4a, 0xd5, 0x8f, 0xc7, 0x8, 0x8, + 0x58, 0x41, 0x1c, 0x8a, 0x58, 0xd3, 0x4d, 0x8c, + 0x7a, 0x50, 0x2f, 0x8c, 0x67, 0x8c, 0x58, 0xf1, + 0xc5, 0x60, 0x60, 0xd2, 0xd5, 0x19, 0x79, 0x5b, + 0x73, 0x2f, 0x1, 0x58, 0x68, 0x2f, 0x59, 0xb3, + 0x64, 0x8c, 0x65, 0x1, 0x1, 0x8c, 0x78, 0x62, + 0xa, 0x78, 0x78, 0x62, 0x76, 0xd1, 0x23, 0xd1, + 0xa, 0xa, 0xa, 0x4d, 0xac, 0xa, 0xd3, 0x5e, + 0xb5, 0x41, 0x58, 0x2f, 0x79, 0xf1, 0x8c, 0x58, + 0x8, 0xd2, 0xc5, 0xc5, 0x1b, 0xd5, 0x5d, 0x3a, + 0x3a, 0x77, 0xe8, 0x2a, 0x27, 0xef, 0x8f, 0x7d, + 0x6e, 0xd7, 0x47, 0x9d, 0x6b, 0x27, 0x8b, 0xdb, + 0x3, 0x47, 0x6b, 0x3, 0x9c, 0x7b, 0xce, 0x1e, + 0x6b, 0x9c, 0x84, 0x57, 0x9d, 0x9b, 0x8b, 0x53, + 0x9d, 0x47, 0x8e, 0x6b, 0xd7, 0xd7, 0xd7, 0xe9, + 0x42, 0x89, 0x2f, 0xa5, 0xa5, 0xf1, 0xa0, 0x68, + 0xf1, 0x63, 0x6e, 0x89, 0x30, 0x89, 0xd2, 0xa5, + 0x2f, 0xf1, 0x2f, 0x14, 0x79, 0xfb, 0x11, 0x6e, + 0x4a, 0xd5, 0xe5, 0x8f, 0x63, 0xd2, 0xef, 0xa5, + 0x2f, 0xe7, 0xd2, 0x2f, 0x8c, 0x79, 0x4a, 0x42, + 0x73, 0x42, 0x96, 0x42, 0xb3, 0x67, 0xd4, 0x27, + 0x2a, 0x8b, 0x6a, 0x47, 0x83, 0x81, 0xe4, 0xde, + 0xde, 0xdd, 0xe4, 0xde, 0xde, 0x75, 0x71, 0x81, + 0x40, 0x18, 0xc6, 0x9c, 0xf5, 0xce, 0x8d, 0x81, + 0xce, 0x81, 0xce, 0xf5, 0x81, 0x57, 0x81, 0xf5, + 0x81, 0xf6, 0x81, 0x93, 0xf3, 0xe4, 0xdd, 0xdd, + 0xdd, 0xb4, 0xde, 0xde, 0xc6, 0x74, 0x40, 0xf5, + 0xb1, 0x90, 0x97, 0x32, 0xdd, 0xe4, 0x32, 0x47, + 0x1e, 0x74, 0x3, 0x27, 0x1e, 0xcb, 0x8b, 0xc0, + 0x8d, 0xbf, 0xdd, 0xe4, 0xbf, 0xf4, 0x12, 0xc0, + 0xe4, 0xc6, 0x9d, 0xfd, 0xb1, 0x90, 0x27, 0x81, + 0xe4, 0xe4, 0x97, 0xdd, 0xe4, 0xe4, 0x8e, 0xbd, + 0x81, 0xd8, 0x8b, 0x9d, 0xb1, 0x9c, 0x8e, 0x6b, + 0x6b, 0xdd, 0x26, 0x97, 0xdd, 0xc6, 0xdd, 0x26, + 0xd8, 0xf7, 0xbd, + 0x85, 0x4b, 0x13, 0x48, 0x48, 0x91, 0x22, 0x55, + 0x6d, 0x64, 0x4e, 0x60, 0xa6, 0x58, 0xa5, 0x7c, + 0x77, 0x6c, 0xef, 0xc2, 0x1b, 0x6e, 0xe5, 0x19, + 0x2f, 0xe9, 0x19, 0xef, 0xef, 0xef, 0x6b, 0x8f, + 0xef, 0x11, 0xef, 0xd2, 0xf1, 0x42, 0xd5, 0x19, + 0x2f, 0x2f, 0x4a, 0xef, 0xd5, 0xef, 0xd5, 0xd2, + 0xa5, 0xa5, 0xd5, 0x1b, 0x73, 0x42, 0x19, 0x63, + 0x6e, 0x6e, 0x19, 0x4a, 0xa5, 0x2f, 0x30, 0x1c, + 0x29, 0xd1, 0x1c, 0x62, 0xa, 0x62, 0x62, 0x2f, + 0x2c, 0x60, 0xe7, 0xef, 0x63, 0x5d, 0xd5, 0xc2, + 0x73, 0x2f, 0xa0, 0x30, 0x8a, 0x62, 0xa, 0x62, + 0x66, 0x37, 0x24, 0xad, 0x52, 0x52, 0x2f, 0xe7, + 0x96, 0x5b, 0x73, 0x1b, 0x6e, 0xc3, 0x67, 0x6e, + 0x8f, 0xef, 0xd5, 0xd7, 0xd5, 0x77, 0x6e, 0x6e, + 0x1b, 0x73, 0x30, 0x8, 0xb3, 0xb5, 0x62, 0x82, + 0x49, 0x52, 0x49, 0xa8, 0x1b, 0xc9, 0xd2, 0x6e, + 0x6f, 0xd5, 0x42, 0x63, 0xd5, 0x5a, 0x67, 0x79, + 0xae, 0x2f, 0x2f, 0x79, 0x6e, 0x96, 0xc5, 0x73, + 0x5b, 0x8, 0x41, 0x6d, 0x6d, 0x76, 0x78, 0xa, + 0x76, 0x78, 0xa, 0xd1, 0xd1, 0xd1, 0x0, 0xd1, + 0x62, 0x62, 0xa, 0x78, 0x62, 0x62, 0x78, 0xd1, + 0x62, 0x78, 0x4d, 0x58, 0xa0, 0x8, 0x87, 0xb5, + 0x30, 0xf1, 0x2f, 0x8c, 0xa5, 0xe, 0xa5, 0x2c, + 0x77, 0x8f, 0x77, 0x6e, 0xd5, 0xd5, 0x6e, 0xc2, + 0x19, 0x19, 0xe9, 0x5d, 0xe9, 0xd7, 0xef, 0xc5, + 0xd5, 0xd7, 0xd7, 0x6c, 0xe0, 0xe5, 0xe5, 0x3, + 0x3, 0xe0, 0x3, 0x5d, 0x27, 0xd7, 0xd7, 0xd5, + 0xd5, 0xd7, 0xd7, 0xd7, 0x63, 0x4a, 0xe, 0xa5, + 0x2f, 0x5a, 0x8c, 0xd3, 0xd3, 0x68, 0x30, 0x68, + 0x30, 0x73, 0x42, 0x79, 0x8, 0x30, 0x8, 0x8c, + 0xd3, 0x67, 0xf1, 0xd3, 0x8c, 0x79, 0x63, 0x6e, + 0xe, 0xe, 0xe, 0xe9, 0x2f, 0xf1, 0x79, 0x2f, + 0x8c, 0x2f, 0x79, 0x2, 0x8c, 0x67, 0x79, 0xd2, + 0x2f, 0x8c, 0x30, 0x67, 0x24, 0x67, 0x79, 0xf0, + 0x96, 0xef, 0xe5, 0xe5, 0x6c, 0xf5, 0xf5, 0x6f, + 0x4, 0xf5, 0xdd, 0x6b, 0x83, 0x53, 0x1e, 0x4, + 0x6b, 0x99, 0xf5, 0x4, 0x4, 0xdf, 0x39, 0x4, + 0xfd, 0xd8, 0xfd, 0x9c, 0x7c, 0x18, 0x1e, 0x4, + 0x9c, 0x99, 0x69, 0x4, 0x97, 0xbd, 0xf5, 0x6f, + 0xfd, 0x57, 0x9d, 0x9c, 0x6b, 0x8b, 0x9c, 0x4, + 0x4, 0xf5, 0xe5, 0x4, 0xdd, 0xde, 0x3, 0xe5, + 0x7d, 0x98, 0x5d, 0xef, 0x6b, 0x7d, 0x9c, 0x4, + 0xf3, 0xbf, 0xf5, 0x6f, 0xaf, 0xbf, 0xfd, 0x8e, + 0x99, 0x83, 0xef, 0x47, 0x4, 0x9c, 0x7d, 0x6f, + 0xe4, 0xf3, 0x8e, 0x6b, 0xf5, 0x97, 0x3, 0x3, + 0xdf, 0x39, 0xe5, 0x4, 0x2e, 0x4, 0x6f, 0x8f, + 0x7d, 0x8e, 0x97, 0x4, 0x26, 0xca, 0xdf, 0x47, + 0x26, 0xb4, 0xc4, + 0x53, 0xd8, 0x90, 0x35, 0x2a, 0x7c, 0xe8, 0x1, + 0xb5, 0x58, 0xb3, 0x1, 0x1, 0xb5, 0x24, 0x67, + 0x2f, 0xd5, 0xd5, 0xd5, 0x4a, 0xd5, 0xef, 0xd5, + 0x1b, 0x63, 0x1b, 0xe9, 0x2f, 0x5d, 0xd5, 0xd2, + 0xe, 0xd5, 0xef, 0x6e, 0x63, 0x6e, 0x11, 0x6e, + 0x5a, 0x79, 0xd5, 0xc5, 0x2f, 0x79, 0xc2, 0xd5, + 0x77, 0xc5, 0x19, 0x63, 0x63, 0x63, 0x63, 0x63, + 0x79, 0xf1, 0x63, 0x79, 0x8c, 0xd3, 0xd3, 0x8a, + 0x1c, 0x62, 0x62, 0x8a, 0x1c, 0x1c, 0x8a, 0x6d, + 0xd3, 0xd3, 0x67, 0xe, 0x50, 0xc5, 0xc5, 0xc5, + 0xd2, 0xe, 0xd2, 0xf0, 0x58, 0xa, 0x29, 0x62, + 0x76, 0x62, 0x62, 0xd3, 0x65, 0xab, 0x67, 0x42, + 0x5d, 0xd2, 0x19, 0x19, 0x19, 0x2f, 0xf1, 0xd2, + 0xd2, 0xa5, 0xc5, 0x19, 0xd5, 0xe, 0xd2, 0x4a, + 0x6e, 0x19, 0x19, 0x63, 0x42, 0x30, 0x5, 0x8a, + 0x30, 0x24, 0x58, 0x2f, 0x77, 0xe9, 0xe, 0x4a, + 0xe5, 0xd5, 0xa5, 0xd2, 0xf0, 0x73, 0x67, 0x73, + 0xd2, 0x79, 0x2f, 0x1b, 0xd5, 0xd2, 0xe, 0x96, + 0xd2, 0x42, 0x58, 0x67, 0x5, 0x1c, 0xa, 0x29, + 0x62, 0x62, 0xa, 0x23, 0xd1, 0xd1, 0xd1, 0x23, + 0xa, 0xd1, 0x78, 0xa, 0xd1, 0xd1, 0xd1, 0xd1, + 0xa, 0xd1, 0xa, 0xa, 0xb5, 0x58, 0xb5, 0xfe, + 0xb5, 0xe3, 0x6d, 0x1c, 0xf1, 0xd2, 0x2f, 0xb3, + 0xd2, 0xd2, 0x2f, 0x2f, 0x67, 0x67, 0x2f, 0xab, + 0x2f, 0x73, 0xa0, 0x8, 0x63, 0x63, 0x4a, 0x1b, + 0x6e, 0x19, 0x63, 0x77, 0x5d, 0xe, 0xe, 0x5d, + 0x79, 0x4a, 0xd5, 0x1b, 0x19, 0x4a, 0x4a, 0x19, + 0xe, 0xd2, 0x4a, 0x2f, 0x2f, 0x67, 0xb3, 0x8c, + 0xd3, 0x1, 0x1c, 0xa, 0x78, 0x62, 0x76, 0x78, + 0x6d, 0xb5, 0x8c, 0xd3, 0xd3, 0xd3, 0x1c, 0x1c, + 0x41, 0x67, 0x67, 0x41, 0xa, 0x58, 0x2f, 0x2f, + 0x1, 0x67, 0x8c, 0xd3, 0x2f, 0x2f, 0x2f, 0x45, + 0x30, 0x8, 0x79, 0x2f, 0xb5, 0xb5, 0xd3, 0xd3, + 0xb5, 0xac, 0xb5, 0xe3, 0xe3, 0x8c, 0xf0, 0x5b, + 0x96, 0xc2, 0xe5, 0x6c, 0x6c, 0x7d, 0x7d, 0x6c, + 0xfd, 0x9d, 0x9c, 0x7d, 0x6f, 0x81, 0xc0, 0x97, + 0xe5, 0x7d, 0x32, 0x97, 0x97, 0x9f, 0x7d, 0x6f, + 0x1e, 0x9d, 0x1e, 0x6f, 0x99, 0xdf, 0xf3, 0x93, + 0xf3, 0x86, 0x6b, 0x4, 0x2e, 0x57, 0x3a, 0x6b, + 0x9c, 0xf6, 0x1e, 0x97, 0x9c, 0xdf, 0x93, 0x97, + 0x97, 0xce, 0x6b, 0x47, 0xb1, 0x57, 0x3, 0x27, + 0x7d, 0x6b, 0x6b, 0x6f, 0x93, 0xca, 0x9c, 0x93, + 0xbf, 0xbf, 0xd8, 0xf5, 0xe4, 0xe4, 0xd8, 0xc0, + 0xdf, 0x9c, 0x32, 0x93, 0xf3, 0xdf, 0x9c, 0x9c, + 0xe4, 0xde, 0x9d, 0xa9, 0xdf, 0xf3, 0xbd, 0xf3, + 0xe4, 0x9c, 0x9c, 0x69, 0xbd, 0x2e, 0x26, 0x6b, + 0x27, 0x81, 0xbd, 0x26, 0x71, 0xf8, 0x12, 0xf3, + 0xbd, 0xaf, 0xc0, + 0xe5, 0x8e, 0x2e, 0x4, 0x8f, 0xd9, 0x77, 0x1, + 0x82, 0x87, 0xa4, 0xda, 0xe3, 0x58, 0x6d, 0x68, + 0x30, 0x42, 0x63, 0xd5, 0x6e, 0xd2, 0x63, 0x19, + 0x19, 0x63, 0x63, 0x42, 0x89, 0x63, 0x19, 0x2f, + 0x8, 0xd2, 0xc2, 0x79, 0x2d, 0xd2, 0x6e, 0xd2, + 0xf1, 0xf1, 0x63, 0x1b, 0x73, 0x89, 0x63, 0x79, + 0x67, 0x67, 0x89, 0xe9, 0xd2, 0x79, 0x42, 0x30, + 0x8, 0xf1, 0xd2, 0x2f, 0x1c, 0x62, 0xd1, 0xd1, + 0x62, 0x62, 0x29, 0x62, 0x62, 0x41, 0x41, 0x8a, + 0x8a, 0x58, 0x42, 0x79, 0x67, 0x1, 0x2f, 0xf1, + 0x2f, 0x67, 0x8, 0x89, 0xd3, 0x41, 0x58, 0x5, + 0x1c, 0xa, 0x1c, 0x8a, 0x8a, 0x58, 0xd3, 0x8c, + 0x1, 0x2f, 0xd2, 0xe, 0xd5, 0x8f, 0x6e, 0x19, + 0x6e, 0x1b, 0x19, 0x63, 0xe9, 0x8, 0xf1, 0x19, + 0xd2, 0x2f, 0xe9, 0x19, 0x6e, 0x63, 0x63, 0x63, + 0x6e, 0x1b, 0x73, 0x1b, 0x8, 0xf1, 0xf1, 0xe9, + 0xd2, 0x2f, 0x2f, 0xd2, 0xd5, 0xd2, 0x1b, 0x19, + 0x4a, 0x6e, 0x73, 0xe, 0x6e, 0x2f, 0x67, 0x2f, + 0x5b, 0x2f, 0xf1, 0x2f, 0x2, 0xda, 0x8a, 0xda, + 0x3b, 0x1c, 0x1c, 0x62, 0xa, 0xa, 0x23, 0xa, + 0xd1, 0xd1, 0xa, 0xd1, 0x76, 0x62, 0xd1, 0x62, + 0x62, 0x62, 0xa, 0x62, 0xac, 0x76, 0xd1, 0x78, + 0xd1, 0x4d, 0xa, 0xa, 0x67, 0xa0, 0xa4, 0x58, + 0x30, 0x8c, 0xd3, 0xa, 0x76, 0x4d, 0xac, 0xd3, + 0xd3, 0xa4, 0xa0, 0x73, 0x79, 0xe9, 0xd2, 0x79, + 0x8, 0x42, 0x2f, 0x67, 0x2f, 0x42, 0x1b, 0xe9, + 0x63, 0xd5, 0x19, 0x6e, 0xd2, 0xe, 0xe, 0xf1, + 0x2f, 0x67, 0xd3, 0xd3, 0xd3, 0x41, 0xe3, 0x4d, + 0xa, 0x78, 0x76, 0xd1, 0xa, 0x23, 0xd1, 0xd1, + 0xd1, 0xa, 0xa, 0xd1, 0x62, 0xa, 0x4d, 0x76, + 0x6d, 0xd3, 0xe3, 0x62, 0xd1, 0xb5, 0x6d, 0xa, + 0xd3, 0xa, 0x78, 0x78, 0x5e, 0xac, 0x82, 0xb5, + 0xb5, 0x82, 0xab, 0xac, 0xa, 0x76, 0xd1, 0xd1, + 0xd1, 0xd1, 0x34, 0xd1, 0x76, 0x24, 0xa6, 0x73, + 0x96, 0xd4, 0x88, 0x90, 0x90, 0xdb, 0xf8, 0xbd, + 0xc6, 0xc6, 0xb4, 0xf3, 0xe4, 0xbf, 0xb4, 0x81, + 0xce, 0x75, 0x57, 0xe1, 0xc6, 0x7, 0xf6, 0xce, + 0xb4, 0xbf, 0xe4, 0xe4, 0xe4, 0xb4, 0xb0, 0x9a, + 0x8d, 0x57, 0x74, 0x75, 0xe1, 0xd8, 0x4b, 0xe4, + 0xbf, 0xb4, 0xe4, 0xe4, 0xe2, 0xb4, 0x7, 0xe1, + 0x8d, 0x7, 0x74, 0xe1, 0xb4, 0x81, 0xc6, 0xb1, + 0xe4, 0x81, 0x83, 0x90, 0x81, 0xbf, 0xe1, 0x7, + 0xf4, 0xb4, 0x9a, 0x9a, 0xbf, 0xe2, 0xbf, 0xbf, + 0xf4, 0xbf, 0xc6, 0xc6, 0x9a, 0xb4, 0x70, 0x74, + 0xe1, 0xc6, 0xe1, 0xe4, 0xbf, 0xf4, 0xb4, 0x95, + 0xf4, 0xb4, 0xb4, 0x53, 0x74, 0x81, 0x81, 0xd8, + 0x40, 0x81, 0xfa, 0xfa, 0xcd, 0xbf, 0xaf, 0xe4, + 0xcc, 0xcc, 0xbf, + 0xde, 0xde, 0xc6, 0xd8, 0x27, 0x3e, 0x4e, 0x52, + 0xd3, 0x82, 0x87, 0x68, 0x8, 0x73, 0x8, 0x58, + 0x79, 0x6e, 0xd5, 0xe7, 0xa5, 0x42, 0xd2, 0xe9, + 0x19, 0xd5, 0xd5, 0x4a, 0x4a, 0x11, 0xd7, 0x1b, + 0xf1, 0xd2, 0xd2, 0x8, 0x67, 0x60, 0xc5, 0xd2, + 0x79, 0x77, 0xd7, 0xd5, 0x63, 0xef, 0x8f, 0xa5, + 0x58, 0x67, 0x2, 0x8, 0x67, 0xf1, 0x2f, 0x89, + 0xa5, 0xd2, 0x79, 0x8, 0x6d, 0x8a, 0x8a, 0x62, + 0xa, 0xa, 0x6d, 0x62, 0xa, 0x58, 0x8c, 0x41, + 0xda, 0x2f, 0x1b, 0x6e, 0x1b, 0xf0, 0xf1, 0x8, + 0x67, 0x30, 0x2f, 0x14, 0x1c, 0x8a, 0xf1, 0x79, + 0x41, 0x1c, 0x67, 0x42, 0x2f, 0x8c, 0xd3, 0x24, + 0xd3, 0x58, 0x2f, 0xc5, 0x77, 0x72, 0xef, 0xd7, + 0x31, 0xef, 0x8f, 0xe5, 0xd5, 0xa5, 0x42, 0x77, + 0xa5, 0x67, 0x42, 0xd7, 0x6b, 0x77, 0xe5, 0x11, + 0xe5, 0xef, 0xef, 0xd7, 0x19, 0xc5, 0x2f, 0xe9, + 0x60, 0x67, 0xa5, 0xd5, 0x77, 0xe9, 0xd2, 0xfb, + 0xef, 0x6b, 0xd5, 0xc5, 0x77, 0x96, 0x8, 0x96, + 0xe7, 0xa6, 0x87, 0xa8, 0xa8, 0x8c, 0x58, 0x2f, + 0xb3, 0x6d, 0xd3, 0x8c, 0x24, 0x62, 0x62, 0xa, + 0xd1, 0x62, 0xd1, 0xa, 0xa, 0x62, 0xb5, 0x66, + 0x6d, 0xd3, 0xe3, 0x6, 0x76, 0x62, 0x78, 0xd1, + 0xd1, 0x23, 0xd1, 0xd1, 0xa, 0x29, 0xe3, 0x6d, + 0xac, 0x29, 0xa, 0x62, 0xa, 0xa, 0xd1, 0xa, + 0x62, 0x29, 0x82, 0x82, 0x1c, 0xb3, 0x2f, 0x8c, + 0xd3, 0x68, 0x67, 0x67, 0x8, 0xd2, 0x2f, 0xa6, + 0x73, 0xe7, 0x77, 0xa5, 0x67, 0x8c, 0x8c, 0x2f, + 0x8c, 0x58, 0x62, 0x62, 0x62, 0xa, 0xd1, 0xd1, + 0x23, 0x23, 0xa, 0xd1, 0xa, 0xd1, 0xd1, 0xa, + 0xa, 0x23, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xa, 0x78, 0xac, 0x78, 0x76, 0xd1, + 0xd1, 0x78, 0x76, 0xd1, 0xd1, 0x76, 0x76, 0x23, + 0xa, 0xa, 0x37, 0x76, 0xd1, 0xd1, 0x76, 0xd1, + 0x23, 0x23, 0x23, 0xd1, 0xd1, 0x78, 0x37, 0x82, + 0x64, 0xa8, 0x38, 0x4f, 0xca, 0xc6, 0xc6, 0xdf, + 0xca, 0x81, 0xc6, 0xdd, 0xbd, 0x90, 0x18, 0x9c, + 0x8e, 0x9f, 0x9f, 0x39, 0x90, 0xc6, 0xc0, 0xf5, + 0xf5, 0xdf, 0x81, 0x97, 0xdd, 0xe1, 0xcb, 0x83, + 0xb4, 0x85, 0xc6, 0x1e, 0xdf, 0xf9, 0xbd, 0x32, + 0xc0, 0xdf, 0x6b, 0xfd, 0xbf, 0x9a, 0x57, 0x88, + 0xdf, 0x85, 0xde, 0x12, 0xf9, 0x90, 0x9c, 0xfd, + 0xce, 0xd8, 0x3e, 0x77, 0xc4, 0xf3, 0xfd, 0x99, + 0x90, 0xf8, 0xf3, 0xf3, 0xe2, 0xf9, 0xdf, 0xc0, + 0xe4, 0xbf, 0x3, 0x88, 0x90, 0xbd, 0x32, 0x8e, + 0xdf, 0xdf, 0x93, 0xc0, 0x95, 0xcc, 0x99, 0x90, + 0xe1, 0xf3, 0x47, 0xa9, 0x27, 0x6f, 0x47, 0x4, + 0x8e, 0xc4, 0xf9, 0x9c, 0xf3, 0xbf, 0xbd, 0x8e, + 0xf5, 0xc6, 0x12, + 0xe1, 0xe1, 0xe1, 0x57, 0x51, 0xd6, 0x1d, 0x66, + 0x37, 0x4d, 0x82, 0x8c, 0x8, 0x96, 0x60, 0x87, + 0x1b, 0x77, 0xef, 0xe, 0xe, 0xa5, 0x77, 0x2f, + 0xa5, 0x8f, 0xef, 0xd5, 0xd5, 0xef, 0x6b, 0xef, + 0xe, 0x77, 0x6e, 0x7a, 0x8, 0x42, 0xa5, 0x2f, + 0x2f, 0xc2, 0xd5, 0xd5, 0xc5, 0xd5, 0x6e, 0xd2, + 0x2f, 0xf1, 0xc7, 0x8, 0x8, 0x2f, 0x6e, 0xf1, + 0x2f, 0x59, 0xa8, 0x67, 0x41, 0x41, 0x58, 0x8a, + 0x62, 0x41, 0x1c, 0x62, 0x62, 0x8c, 0x87, 0xd3, + 0xb5, 0x82, 0x2f, 0x7a, 0xa5, 0x7a, 0x2f, 0x42, + 0x79, 0x73, 0xae, 0xf1, 0x30, 0x30, 0x73, 0x67, + 0x41, 0x8a, 0x58, 0xa6, 0xa8, 0x49, 0x1, 0x24, + 0x5, 0x42, 0xe, 0x6e, 0x60, 0x2f, 0xd9, 0x77, + 0xc5, 0x77, 0xe9, 0xc5, 0xd9, 0x19, 0xe9, 0x19, + 0xe, 0x1b, 0x63, 0xd5, 0x77, 0x2f, 0x6e, 0xe5, + 0x3, 0xef, 0x77, 0xe8, 0xef, 0xd5, 0x8f, 0xd5, + 0xe9, 0x8, 0xae, 0xa5, 0x60, 0x2f, 0x2f, 0xa5, + 0xc5, 0xd5, 0x6e, 0x77, 0xc2, 0x89, 0x1b, 0x6e, + 0x6e, 0x67, 0x58, 0x87, 0xb3, 0xb5, 0x8c, 0x1, + 0x59, 0x82, 0x41, 0x67, 0x2f, 0xd3, 0x78, 0x4d, + 0x62, 0x62, 0x16, 0x62, 0xd1, 0xd1, 0x6d, 0x66, + 0x66, 0x82, 0xd3, 0x1, 0xd3, 0xb5, 0x4d, 0xa, + 0x23, 0x23, 0xd1, 0xd1, 0x78, 0xa, 0xa, 0x76, + 0x78, 0x29, 0xa, 0x78, 0xac, 0x62, 0x23, 0xd1, + 0xa, 0xa, 0xa, 0x6d, 0x6d, 0x4d, 0x6d, 0xd3, + 0x8c, 0xb3, 0xa4, 0x30, 0x5b, 0xa5, 0x67, 0x58, + 0x87, 0x67, 0x67, 0x8c, 0xd3, 0x6d, 0xbe, 0x82, + 0xd3, 0xbe, 0x29, 0x62, 0xa, 0xa, 0x23, 0xa, + 0x0, 0xd1, 0xa, 0xd1, 0xa, 0xa, 0xd1, 0xa, + 0x23, 0xd1, 0x23, 0x34, 0xa, 0xd1, 0x23, 0xd1, + 0x23, 0xd1, 0x23, 0x78, 0x78, 0x76, 0xd1, 0x76, + 0xd1, 0xb5, 0x78, 0xd1, 0xd1, 0xa, 0x23, 0xa, + 0xd1, 0xd1, 0xd1, 0x23, 0x23, 0xd1, 0x0, 0x23, + 0x23, 0xd1, 0x76, 0x23, 0xa, 0x29, 0x6d, 0x6d, + 0x65, 0xc3, 0xc9, 0x6e, 0x6b, 0xc4, 0xdd, 0x9c, + 0xe5, 0xca, 0x1e, 0x6f, 0x9c, 0x6b, 0x7c, 0x6c, + 0x4, 0xf3, 0x9c, 0x7d, 0x4, 0xf3, 0x93, 0x4, + 0x97, 0x9c, 0x1e, 0xfd, 0x8e, 0xd8, 0x9d, 0x47, + 0xf3, 0xf3, 0xdd, 0x4, 0x6f, 0x32, 0x8e, 0x6c, + 0x4, 0x86, 0x27, 0x3, 0xf3, 0xbf, 0xde, 0x9c, + 0x93, 0xe4, 0x32, 0x4, 0xf3, 0xdf, 0x1e, 0x3, + 0xd8, 0x1e, 0xa9, 0x77, 0x4, 0xbd, 0x4, 0x4, + 0x93, 0xe4, 0x93, 0x93, 0xe4, 0xe4, 0x4, 0x47, + 0xe1, 0xdd, 0x47, 0x3, 0x1e, 0x32, 0x4, 0x93, + 0xf3, 0xf5, 0x97, 0x8e, 0xe1, 0xc0, 0x4, 0xfd, + 0x9f, 0xce, 0x4, 0x4, 0x9c, 0x4, 0x97, 0x6c, + 0x4, 0xc0, 0x26, 0x4, 0x26, 0xc6, 0xb9, 0x4, + 0x8e, 0x2e, 0xf3, + 0xd8, 0x18, 0x90, 0x83, 0x8b, 0x35, 0xe8, 0x68, + 0x6d, 0x6d, 0x29, 0xb5, 0xe3, 0x55, 0xbe, 0x67, + 0xf1, 0xd2, 0x8f, 0x19, 0x19, 0x4a, 0x63, 0x1b, + 0x1b, 0x19, 0x77, 0x60, 0xa5, 0xe9, 0x60, 0xa5, + 0xe, 0xc5, 0xc5, 0x1b, 0x1b, 0x4a, 0x19, 0x1b, + 0x89, 0x89, 0x5a, 0xa8, 0x1, 0x2f, 0x59, 0x42, + 0x63, 0x89, 0x1b, 0x42, 0x89, 0x63, 0x63, 0x42, + 0x30, 0x3b, 0x8a, 0x62, 0xa, 0x8c, 0xab, 0x1c, + 0x58, 0x58, 0x67, 0x62, 0x16, 0x1c, 0xb5, 0x78, + 0x29, 0x1c, 0xda, 0x1a, 0x8c, 0x1b, 0x63, 0x63, + 0x1b, 0x63, 0x19, 0x63, 0x89, 0x89, 0x8, 0xf1, + 0x5, 0x58, 0x3b, 0xd3, 0xab, 0x87, 0xe7, 0xd2, + 0x1b, 0x63, 0x63, 0x19, 0x63, 0x63, 0x89, 0x2f, + 0x67, 0x2f, 0x42, 0x96, 0x2f, 0xa5, 0x63, 0x19, + 0x4a, 0x4a, 0x19, 0x4a, 0xd5, 0x6e, 0x19, 0x19, + 0xa5, 0x2f, 0x63, 0x6e, 0x5d, 0x77, 0x63, 0x63, + 0x63, 0x63, 0x63, 0x79, 0x79, 0x42, 0xf0, 0x8, + 0xa6, 0x8, 0x1b, 0x19, 0x19, 0x63, 0x63, 0x19, + 0xe, 0x1b, 0x42, 0x67, 0x58, 0x5, 0x89, 0xa0, + 0x2f, 0x41, 0x58, 0x2f, 0x67, 0x8c, 0xe3, 0xb5, + 0x1c, 0x1c, 0x1c, 0x1c, 0x62, 0xa, 0x1c, 0x5, + 0x58, 0xb5, 0x1c, 0x58, 0xd3, 0xd3, 0x76, 0x78, + 0x76, 0xa, 0x62, 0x62, 0xa, 0x62, 0xd1, 0xd1, + 0x76, 0x23, 0xd1, 0x62, 0x62, 0xa, 0xa, 0xa, + 0x76, 0x78, 0x76, 0x76, 0xd1, 0xa, 0x62, 0xe3, + 0x6, 0xac, 0xb5, 0xe3, 0xb5, 0xd3, 0xd3, 0xe3, + 0xbe, 0xb5, 0xbe, 0xd3, 0x4d, 0x78, 0x62, 0xac, + 0x37, 0x76, 0xd1, 0xd1, 0xd1, 0xa, 0xd1, 0xd1, + 0x23, 0x23, 0xd1, 0x76, 0x23, 0xd1, 0x23, 0xa, + 0xd1, 0xa, 0xa, 0x62, 0x29, 0x78, 0xd1, 0xd1, + 0xa, 0xa, 0x78, 0xd1, 0xd1, 0xd1, 0x76, 0xd1, + 0x78, 0xf2, 0x61, 0xd1, 0xa, 0xa, 0x23, 0x78, + 0xd1, 0xa, 0x78, 0xd1, 0xd1, 0xd1, 0xd1, 0xa, + 0xd1, 0x76, 0x76, 0xd1, 0xa, 0x4d, 0xbe, 0x82, + 0x45, 0x96, 0xc2, 0xc2, 0xe5, 0xfd, 0x9d, 0x47, + 0x4, 0x1e, 0x8b, 0x6b, 0x4, 0xb1, 0x9c, 0x97, + 0x97, 0x9c, 0x9, 0x9c, 0x97, 0x81, 0xd8, 0x47, + 0xc0, 0xe4, 0x1e, 0x32, 0xf3, 0xc0, 0xf3, 0x32, + 0x93, 0xe4, 0xbd, 0x8e, 0xde, 0xbd, 0x3, 0x27, + 0x4, 0xbd, 0x93, 0x32, 0x81, 0xe4, 0xf3, 0xf3, + 0xf3, 0xe4, 0x81, 0xfd, 0xde, 0xb4, 0xd8, 0x8b, + 0x90, 0xce, 0x9c, 0x9c, 0xdd, 0xc6, 0x9c, 0x32, + 0xdd, 0xaf, 0xb2, 0xd8, 0xc6, 0xbf, 0xc0, 0xde, + 0x4b, 0xe4, 0xf3, 0xce, 0xbd, 0x81, 0xca, 0xf5, + 0xe4, 0xe4, 0xde, 0x9f, 0xf6, 0xe1, 0xf3, 0xc0, + 0xe4, 0x81, 0x32, 0xf3, 0x2e, 0xbd, 0xdd, 0x9c, + 0xf5, 0x57, 0xc6, 0xf3, 0xe4, 0xf6, 0x7b, 0x93, + 0xf3, 0x95, 0xce, + 0x4, 0x9c, 0x9c, 0x47, 0xe5, 0xc5, 0xa5, 0x67, + 0x8a, 0x6d, 0x1c, 0x58, 0x67, 0xda, 0x8a, 0x30, + 0x89, 0x63, 0x6e, 0x19, 0x6e, 0x63, 0xe, 0x63, + 0x63, 0xd2, 0x1b, 0x42, 0x89, 0xd2, 0xa5, 0x30, + 0x63, 0x63, 0xd2, 0x79, 0x63, 0x19, 0x63, 0x19, + 0x63, 0xd2, 0x2, 0x1b, 0x89, 0x1b, 0xf1, 0x42, + 0x63, 0x63, 0xd2, 0xf1, 0x89, 0x42, 0x79, 0x1b, + 0x79, 0x8, 0x58, 0x8a, 0x1c, 0x8a, 0x41, 0x1c, + 0x1c, 0xd3, 0xb5, 0x62, 0x62, 0x41, 0x62, 0x41, + 0x30, 0x42, 0xf1, 0x30, 0x73, 0x89, 0x89, 0x79, + 0x2, 0x63, 0x2d, 0x79, 0x63, 0xd2, 0xf1, 0x89, + 0x63, 0x42, 0x2d, 0x8a, 0x8a, 0x8a, 0x2f, 0x2f, + 0xf1, 0x63, 0x63, 0xd2, 0x63, 0x63, 0x63, 0x63, + 0x89, 0x1b, 0x63, 0x2f, 0x2f, 0x8, 0x63, 0xd2, + 0x5d, 0x19, 0x4a, 0x8f, 0xef, 0x11, 0x4a, 0x4a, + 0xd5, 0x6e, 0x63, 0xe9, 0x2f, 0xf1, 0xe, 0x2f, + 0x2f, 0x79, 0xe9, 0x79, 0xd2, 0x63, 0x63, 0x4a, + 0x19, 0x63, 0x1b, 0x63, 0x79, 0x6e, 0x63, 0x2f, + 0xe9, 0x6e, 0x6e, 0xe, 0x6e, 0x1b, 0x63, 0x4a, + 0x19, 0x73, 0x73, 0x30, 0x24, 0xb5, 0xe3, 0x58, + 0x87, 0xa6, 0x67, 0x8, 0x87, 0x8a, 0x30, 0x73, + 0xe7, 0x67, 0x58, 0x41, 0x82, 0x4d, 0x62, 0x5e, + 0x78, 0xd1, 0x62, 0x4d, 0xe3, 0x78, 0x76, 0xa, + 0x23, 0x23, 0x23, 0xa, 0xa, 0xd1, 0x23, 0xa, + 0x23, 0xd1, 0x78, 0x29, 0x76, 0x23, 0x4d, 0xac, + 0x78, 0x78, 0xa, 0xa, 0xd1, 0xd1, 0xd1, 0x62, + 0x78, 0xd1, 0x76, 0x78, 0xa, 0xd1, 0x23, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0x76, 0xd1, 0xd1, 0x23, + 0xa, 0x23, 0x23, 0xa, 0xa, 0xd1, 0xa, 0xd1, + 0xd1, 0xa, 0xac, 0x78, 0xac, 0xe3, 0x76, 0x78, + 0x29, 0x62, 0x76, 0xa, 0x16, 0x34, 0x23, 0x0, + 0xd1, 0x23, 0xd1, 0xd1, 0x23, 0x23, 0xa, 0x16, + 0x29, 0x55, 0x5e, 0x4d, 0x76, 0xa, 0xd1, 0xd1, + 0xd1, 0xd1, 0x23, 0xd1, 0x23, 0x61, 0x66, 0xc3, + 0x59, 0xd4, 0xeb, 0x18, 0x90, 0x90, 0x39, 0x1e, + 0x8d, 0xe4, 0xf9, 0x39, 0xdf, 0xbf, 0xb4, 0xc6, + 0x90, 0x90, 0xf6, 0x75, 0xe1, 0xc6, 0x90, 0x81, + 0xbf, 0xbb, 0xb4, 0x4b, 0xdf, 0xbf, 0xbf, 0xe4, + 0xb4, 0x4b, 0x90, 0x74, 0xe1, 0xe4, 0x90, 0x7d, + 0xf5, 0xbf, 0xb4, 0x81, 0x4b, 0xdf, 0xaf, 0x7, + 0x7, 0xb4, 0x90, 0x90, 0xe1, 0xbb, 0xe1, 0xdf, + 0xf5, 0xe4, 0xe4, 0xe4, 0xe1, 0xdf, 0xdf, 0xf6, + 0xbc, 0xb4, 0x4b, 0xdf, 0xe4, 0xe2, 0xf4, 0xf4, + 0xf9, 0x81, 0x8d, 0x7, 0xbc, 0xf6, 0xdf, 0xdf, + 0xe1, 0xb4, 0xbf, 0xc6, 0xdf, 0xbf, 0xbf, 0xe4, + 0x4b, 0xdf, 0x2e, 0xe1, 0xbc, 0x57, 0x75, 0x83, + 0x99, 0x4b, 0xb4, 0xcd, 0xf7, 0x4b, 0xcc, 0xe4, + 0xbf, 0xbf, 0xb4, + 0x2e, 0xce, 0xbf, 0xd8, 0x27, 0x5d, 0xa8, 0xd3, + 0xd3, 0x5e, 0x1c, 0x30, 0xf0, 0x2f, 0xb5, 0x58, + 0xe9, 0x63, 0xc2, 0x19, 0x63, 0x2d, 0xf1, 0xd2, + 0xe9, 0xd5, 0x6e, 0x6e, 0x19, 0xef, 0xd5, 0x1b, + 0xe, 0x1b, 0x2f, 0x8, 0x6e, 0xe, 0xa5, 0x63, + 0x63, 0xd5, 0x19, 0x6e, 0x63, 0xef, 0xd5, 0x63, + 0xc2, 0xc5, 0x2f, 0x41, 0x79, 0x79, 0x2f, 0x8, + 0x42, 0xe, 0xe, 0x89, 0x73, 0x73, 0x67, 0x1c, + 0x1c, 0x1c, 0x62, 0x62, 0x62, 0x41, 0xd3, 0x58, + 0xa5, 0xef, 0xd5, 0xd2, 0xd2, 0x19, 0x19, 0xf1, + 0xd2, 0x63, 0xf1, 0x41, 0xf1, 0xd2, 0x63, 0x79, + 0x42, 0xe9, 0x42, 0x8, 0x8, 0x73, 0x30, 0x3b, + 0xf1, 0x19, 0x63, 0xf1, 0xa5, 0x6e, 0xd5, 0x4a, + 0x8f, 0xc2, 0x19, 0x1b, 0x73, 0x1b, 0x6e, 0xf0, + 0x2f, 0x5a, 0xd5, 0x50, 0xa5, 0xef, 0x6b, 0xe5, + 0xd5, 0x6b, 0xd5, 0xd5, 0x79, 0x6e, 0xd5, 0x79, + 0x21, 0x79, 0x63, 0xe9, 0xd2, 0xf0, 0x63, 0x8f, + 0xd5, 0x19, 0x1b, 0x1b, 0xa5, 0x63, 0xe, 0xa5, + 0xf1, 0x77, 0xef, 0xef, 0x77, 0x63, 0x6e, 0xef, + 0xef, 0x6e, 0x6e, 0xc2, 0x2f, 0x58, 0x30, 0x67, + 0x24, 0x8c, 0x67, 0xa6, 0x67, 0x82, 0xa4, 0x60, + 0x2c, 0x49, 0x2f, 0xb3, 0x8c, 0x6d, 0x1c, 0x4d, + 0x78, 0xa, 0x78, 0xa, 0x76, 0x62, 0x76, 0xa, + 0xd1, 0xd1, 0xd1, 0xa, 0x76, 0x23, 0xd1, 0x76, + 0x23, 0x23, 0x23, 0x62, 0x76, 0xd1, 0xd1, 0x76, + 0xd1, 0xd1, 0xa, 0x62, 0x62, 0xd1, 0xd1, 0xa, + 0xd1, 0xd1, 0xd1, 0x34, 0x23, 0xd1, 0x23, 0xa, + 0x23, 0x0, 0xa, 0x76, 0xd1, 0x23, 0xa, 0xa, + 0xa, 0xa, 0x23, 0xd1, 0x29, 0xa, 0xa, 0xa, + 0x62, 0x23, 0xa, 0x78, 0xa, 0xa, 0xd1, 0x23, + 0xd1, 0xd1, 0x76, 0xd1, 0xd1, 0xd1, 0xd1, 0xa, + 0xa, 0xd1, 0x23, 0x23, 0xd1, 0x0, 0x23, 0x62, + 0x76, 0xf2, 0x61, 0x66, 0x61, 0x37, 0x76, 0xd1, + 0xa, 0xd1, 0xd1, 0xd1, 0xa, 0x4d, 0x37, 0x4d, + 0xa8, 0xb8, 0x48, 0x88, 0xed, 0xdf, 0xf5, 0x32, + 0x9c, 0xdd, 0x81, 0xf5, 0x32, 0xc6, 0x57, 0x9d, + 0x83, 0x9c, 0x90, 0x1e, 0xce, 0x8d, 0xed, 0xf5, + 0xc0, 0xbf, 0xb4, 0xc0, 0x9c, 0xe4, 0xf3, 0xfd, + 0x1e, 0xdd, 0x9c, 0x32, 0x9c, 0xf3, 0xb1, 0x9c, + 0x32, 0xbd, 0xf3, 0xd8, 0xd8, 0xb4, 0xdd, 0x1e, + 0xc6, 0xe4, 0x12, 0x32, 0xf3, 0xb4, 0xbd, 0x32, + 0xde, 0xde, 0xde, 0x9d, 0x53, 0x90, 0x32, 0xf5, + 0x81, 0xb4, 0xc0, 0x93, 0xbf, 0x12, 0xf3, 0xf3, + 0x85, 0xc4, 0xb1, 0x9d, 0x51, 0xf6, 0x9c, 0x93, + 0xe4, 0xdd, 0xf3, 0x93, 0xe4, 0xc0, 0x93, 0x93, + 0xe1, 0xd8, 0x4, 0x47, 0x8b, 0x27, 0x27, 0x28, + 0x97, 0xe4, 0xdd, 0x97, 0x93, 0xaf, 0xb9, 0x97, + 0xed, 0xe4, 0xde, + 0xdf, 0xe4, 0xe1, 0x75, 0x2a, 0x64, 0x52, 0x6d, + 0xac, 0x62, 0x29, 0x87, 0xe7, 0xa8, 0x58, 0xa0, + 0xf0, 0xd2, 0x6e, 0x19, 0xd2, 0x8, 0x8c, 0xf1, + 0x6e, 0xef, 0xc5, 0xa5, 0xd5, 0xd5, 0xef, 0xd9, + 0x1b, 0x42, 0x59, 0xf1, 0x19, 0xc5, 0xf0, 0xe, + 0x19, 0xd7, 0xc5, 0x63, 0x1b, 0x31, 0x19, 0x77, + 0xe, 0xf0, 0x67, 0x30, 0x42, 0x1b, 0x5a, 0x30, + 0x73, 0x6e, 0xe9, 0x79, 0x63, 0x1b, 0xf1, 0x30, + 0x30, 0x5, 0x5, 0x8a, 0x8a, 0x8a, 0x41, 0xe3, + 0x2f, 0x77, 0x5d, 0x77, 0xd5, 0xd2, 0xd2, 0x79, + 0x63, 0x6e, 0xf1, 0x30, 0xf1, 0x2, 0xd2, 0x67, + 0x87, 0x8, 0x67, 0x67, 0x42, 0x1b, 0x89, 0x42, + 0xd2, 0x6e, 0x63, 0x42, 0x42, 0x63, 0x8f, 0xe9, + 0x60, 0x96, 0xa5, 0x7a, 0xd2, 0x8f, 0x19, 0x6e, + 0x1b, 0x63, 0x6e, 0x2f, 0x2f, 0xd2, 0xd5, 0x5d, + 0xa5, 0xd5, 0x6e, 0xc5, 0xc5, 0xd5, 0x6e, 0xe, + 0x1b, 0x19, 0x19, 0xe, 0x2f, 0x63, 0x63, 0xe9, + 0x77, 0xe9, 0x63, 0x1b, 0x42, 0x63, 0x63, 0x19, + 0x1b, 0xd2, 0x19, 0xc2, 0xa5, 0x63, 0x19, 0x8f, + 0x5d, 0xe9, 0x63, 0x19, 0x1b, 0x42, 0x1b, 0x1b, + 0x30, 0x5, 0xa0, 0x58, 0x8c, 0xb5, 0x67, 0xa8, + 0x49, 0x1, 0x5a, 0xad, 0xb3, 0x5, 0x5, 0x58, + 0x78, 0x78, 0xd1, 0xd1, 0x23, 0x0, 0xd1, 0x76, + 0xd1, 0xd1, 0xd1, 0x62, 0x23, 0x23, 0x23, 0xa, + 0x23, 0x23, 0x23, 0x23, 0xa, 0xd1, 0xd1, 0x76, + 0xd1, 0xd1, 0x62, 0xda, 0x29, 0x23, 0xa, 0xa, + 0x23, 0xd1, 0xd1, 0xd1, 0x23, 0x23, 0xd1, 0xa, + 0xa, 0x23, 0xa, 0x29, 0x29, 0x23, 0x76, 0xd1, + 0xd1, 0xd1, 0xa, 0x23, 0x76, 0x78, 0xa, 0x29, + 0x29, 0xd1, 0x23, 0xa, 0xd1, 0xd1, 0x23, 0xd1, + 0x23, 0x23, 0xd1, 0xd1, 0xd1, 0xd1, 0x23, 0x78, + 0x6d, 0xd1, 0xd1, 0x23, 0x23, 0x23, 0x23, 0xa, + 0xa, 0xd1, 0x76, 0x78, 0x41, 0x66, 0x76, 0xd1, + 0x29, 0xa, 0xd1, 0xa, 0x76, 0x4d, 0xe3, 0x82, + 0x59, 0x4f, 0x88, 0x27, 0x6c, 0x93, 0xde, 0x9c, + 0xe5, 0x9c, 0x8e, 0x3, 0xe5, 0xde, 0x3, 0xa9, + 0x6b, 0x9, 0xdd, 0x6f, 0x9c, 0xe4, 0xf3, 0x4, + 0x32, 0xdf, 0xbd, 0xfd, 0xfd, 0xc0, 0xf5, 0xe5, + 0x6c, 0x32, 0x97, 0x4, 0x6f, 0x9, 0x8e, 0x6c, + 0x3, 0x90, 0x6f, 0xd5, 0x1e, 0xe4, 0x12, 0x9c, + 0x9c, 0xe4, 0x93, 0x4, 0xbd, 0xdf, 0x36, 0x4, + 0xd8, 0xd8, 0x47, 0x7c, 0x9d, 0x81, 0x32, 0x4, + 0x9c, 0xf5, 0x97, 0x97, 0xc0, 0xfa, 0xf5, 0x32, + 0x9f, 0x9f, 0x9c, 0x7d, 0x8b, 0xff, 0x4, 0x93, + 0x81, 0xdf, 0x4, 0x97, 0xbd, 0xd8, 0x6f, 0x32, + 0xd8, 0x1e, 0x4, 0x4, 0x7d, 0xe5, 0x99, 0x6f, + 0x97, 0x12, 0x9c, 0x9c, 0xf3, 0xe1, 0xd8, 0x6f, + 0x9c, 0xf7, 0xed, + 0x8e, 0x9d, 0xdb, 0x1e, 0x27, 0x6e, 0xa6, 0xa0, + 0xda, 0x1c, 0xa, 0x1c, 0xd3, 0x24, 0xe3, 0xad, + 0xf0, 0xc5, 0x6e, 0xd5, 0x1b, 0x89, 0x89, 0x1b, + 0x19, 0x6e, 0x2f, 0xd2, 0x1b, 0xa5, 0x50, 0xa5, + 0x63, 0x96, 0xd2, 0x1b, 0x63, 0x63, 0x63, 0x63, + 0x6e, 0xd2, 0x2f, 0x79, 0xd2, 0x63, 0x67, 0x2, + 0x63, 0x42, 0x42, 0x42, 0x42, 0x42, 0x8, 0x30, + 0xa0, 0xf1, 0x67, 0x67, 0x1b, 0x63, 0x79, 0x79, + 0x79, 0x42, 0x42, 0x8, 0x89, 0x30, 0xda, 0xe3, + 0x2f, 0x2f, 0x66, 0xd3, 0x2f, 0xe9, 0xd2, 0xa5, + 0x63, 0x2, 0x63, 0x89, 0x2d, 0xd2, 0x67, 0x62, + 0xa, 0x62, 0x41, 0xd3, 0x2f, 0x63, 0x19, 0x63, + 0x19, 0x63, 0x63, 0x63, 0xd2, 0xe, 0x79, 0x41, + 0x8c, 0xd2, 0xf1, 0x2f, 0x2f, 0xd5, 0xd5, 0x2, + 0x4a, 0x4a, 0x19, 0x63, 0x42, 0x6e, 0x1b, 0x8, + 0x67, 0x73, 0x63, 0x79, 0xe9, 0x63, 0x63, 0x63, + 0xd2, 0x63, 0x6e, 0xd2, 0x2f, 0xf1, 0x63, 0x63, + 0xd2, 0x63, 0x19, 0x63, 0xd2, 0x89, 0x6e, 0x19, + 0x19, 0x6e, 0x63, 0x63, 0x89, 0x42, 0x19, 0xd2, + 0x8, 0xd2, 0x19, 0x63, 0xe, 0x63, 0x63, 0x19, + 0x63, 0x2, 0x63, 0x73, 0x87, 0x30, 0x8, 0x67, + 0xab, 0xd3, 0x67, 0xf1, 0x8c, 0x8a, 0x1c, 0x29, + 0xa, 0xd1, 0x23, 0x76, 0xd1, 0x23, 0xa, 0xd1, + 0xd1, 0x23, 0xa, 0xd1, 0xd1, 0x23, 0xa, 0xd1, + 0x23, 0x23, 0x23, 0xa, 0xa, 0x62, 0x62, 0x23, + 0xa, 0xd1, 0x23, 0x29, 0x4d, 0xa, 0x62, 0xa, + 0x23, 0x23, 0xd1, 0xd1, 0x23, 0x23, 0x0, 0xd1, + 0x62, 0xa, 0xd1, 0x78, 0xa, 0x23, 0xd1, 0xd1, + 0x78, 0xa, 0xa, 0x62, 0xa, 0xa, 0x78, 0x76, + 0xa, 0x23, 0xd1, 0xa, 0xa, 0xd1, 0x23, 0x76, + 0xd1, 0x23, 0x23, 0x23, 0xd1, 0xd1, 0x23, 0xd1, + 0x76, 0x23, 0x23, 0xd1, 0xa, 0x23, 0xd1, 0x78, + 0x76, 0x16, 0x29, 0xb5, 0x8c, 0xd3, 0x76, 0x76, + 0xa, 0x78, 0x76, 0x1c, 0x6d, 0xda, 0xb3, 0xc9, + 0x8f, 0xca, 0xdf, 0x7d, 0x9c, 0xdd, 0xde, 0x3, + 0xd9, 0x7d, 0x90, 0x27, 0x47, 0x99, 0x99, 0x6f, + 0x32, 0xf3, 0xc0, 0x99, 0xca, 0xe4, 0xb4, 0xd8, + 0x9d, 0x39, 0x32, 0x9c, 0xf3, 0xe4, 0xdf, 0x6f, + 0x32, 0xf3, 0xc0, 0x9c, 0x6b, 0xf5, 0xb1, 0x9d, + 0xa9, 0x39, 0xca, 0xf5, 0xf3, 0xbf, 0x81, 0xca, + 0xf5, 0xe4, 0xf3, 0xde, 0xd8, 0x1e, 0x9c, 0xfd, + 0x40, 0xf6, 0xca, 0x9c, 0xdd, 0xbf, 0xf3, 0xdd, + 0xca, 0xdf, 0xf3, 0xf3, 0x9a, 0xc6, 0xf5, 0xc0, + 0xbf, 0xe4, 0x9, 0x99, 0x9c, 0x8d, 0x12, 0xf3, + 0xc6, 0xf5, 0xf3, 0xf3, 0xe1, 0xe1, 0x9c, 0xdf, + 0xbf, 0xbb, 0xf3, 0x9c, 0x99, 0xca, 0x9c, 0x4, + 0xde, 0xe1, 0x40, 0x83, 0xb1, 0x8d, 0xe1, 0xdd, + 0xdf, 0xce, 0xbb, + 0x4, 0x6f, 0x83, 0x47, 0xd7, 0xd5, 0x2f, 0x87, + 0x6d, 0x6d, 0x62, 0xda, 0x8a, 0x1c, 0x58, 0xa0, + 0x19, 0xd2, 0x1b, 0x42, 0x63, 0x63, 0x63, 0x79, + 0x89, 0x63, 0xf1, 0xf1, 0x63, 0xf1, 0x67, 0x42, + 0x63, 0x2, 0x79, 0x73, 0x89, 0x63, 0xe9, 0x79, + 0x89, 0xf1, 0x30, 0xf1, 0x63, 0x1b, 0x67, 0x58, + 0xf1, 0xf1, 0x67, 0x67, 0x5, 0x8, 0x2f, 0x8c, + 0x2f, 0x5b, 0x30, 0x73, 0xd2, 0x79, 0x8c, 0x58, + 0x67, 0x67, 0x67, 0x8a, 0x67, 0xa4, 0x67, 0x58, + 0x2f, 0x49, 0xd3, 0xd1, 0x41, 0x8c, 0xd3, 0x8a, + 0x8, 0xf1, 0xf1, 0x41, 0x67, 0x58, 0xe3, 0xa, + 0x1c, 0x41, 0xa, 0x1c, 0x8, 0x63, 0xf1, 0x67, + 0xf1, 0x89, 0xf1, 0x67, 0x2f, 0x2f, 0x30, 0x30, + 0x42, 0x19, 0x63, 0x2f, 0x1b, 0x63, 0xa5, 0x21, + 0xa5, 0xc5, 0xd5, 0xd5, 0x6e, 0xd5, 0x4a, 0x19, + 0x6e, 0x4a, 0x63, 0x8, 0x8, 0x89, 0xd2, 0xf1, + 0x2f, 0x2f, 0x1b, 0x1b, 0xd2, 0xe9, 0x63, 0x89, + 0x1b, 0x6e, 0x19, 0x2d, 0x8, 0x73, 0x42, 0x79, + 0x79, 0x2d, 0x89, 0x19, 0xef, 0x19, 0x19, 0xe, + 0x19, 0x1b, 0x19, 0xa5, 0xf1, 0xf1, 0x1b, 0x6e, + 0xe9, 0xc5, 0xd5, 0xd2, 0x1b, 0x63, 0x6e, 0x1b, + 0x58, 0x8a, 0x8a, 0xd3, 0x1c, 0xa, 0x62, 0xa, + 0xd1, 0x62, 0xd3, 0x37, 0xa, 0x62, 0x3b, 0x6d, + 0x62, 0xa, 0x1c, 0xd1, 0xa, 0xd1, 0xd1, 0x23, + 0xd1, 0x23, 0xd1, 0xa, 0xd1, 0x23, 0xa, 0x76, + 0xd1, 0x23, 0x23, 0xa, 0x76, 0x23, 0x78, 0x76, + 0xd1, 0x76, 0xa, 0x76, 0xd1, 0x23, 0xd1, 0xd1, + 0x76, 0x37, 0x4d, 0x78, 0x23, 0xd1, 0xa, 0x61, + 0x76, 0xd1, 0x76, 0x37, 0x78, 0x78, 0x78, 0xbe, + 0x76, 0x23, 0x76, 0x23, 0x76, 0x23, 0xa, 0x61, + 0xf2, 0x23, 0x76, 0xa, 0x76, 0x76, 0x23, 0x76, + 0x76, 0x76, 0x23, 0x23, 0x34, 0xd1, 0x76, 0x61, + 0x55, 0x65, 0x55, 0x55, 0x1f, 0x1f, 0x66, 0x5e, + 0x76, 0x78, 0x78, 0x4d, 0xbe, 0x87, 0xd4, 0x8b, + 0xd8, 0xe1, 0x81, 0x40, 0x75, 0x70, 0xe1, 0xf6, + 0x90, 0xc4, 0xce, 0xc6, 0xe1, 0x9, 0xc6, 0xe4, + 0xe1, 0xf4, 0x8d, 0x75, 0x9f, 0xe1, 0xf4, 0xe1, + 0x81, 0xce, 0xe4, 0xbf, 0xbf, 0xb4, 0xe4, 0xdf, + 0x81, 0xe4, 0xbf, 0xd8, 0xe1, 0x8d, 0xbf, 0xe1, + 0xe4, 0x95, 0xc6, 0xbf, 0xb4, 0xbf, 0x95, 0xb4, + 0x9a, 0xb4, 0xf4, 0xe1, 0xe1, 0xc6, 0xbf, 0xf3, + 0xaf, 0xbb, 0xe4, 0xf3, 0xc6, 0x9a, 0xb4, 0x8d, + 0x57, 0x57, 0xb4, 0xaf, 0xf4, 0xb4, 0xe2, 0xbb, + 0xf4, 0xbf, 0xbf, 0xe4, 0xb4, 0x7, 0xe1, 0xaf, + 0xb4, 0xe1, 0xe4, 0xbb, 0xbf, 0xbf, 0xe4, 0xe4, + 0xbf, 0xe1, 0xc6, 0xc6, 0x7, 0x3a, 0xdb, 0x53, + 0xf9, 0xb2, 0x81, 0xcc, 0xaf, 0xcd, 0xf7, 0xaf, + 0xaf, 0xaf, 0xbf, + 0xbd, 0xdf, 0x39, 0x1e, 0x36, 0x3e, 0x49, 0xd3, + 0xe3, 0x78, 0xe3, 0xd3, 0xb3, 0x3b, 0x73, 0xc2, + 0xd5, 0xd5, 0x1b, 0x42, 0x79, 0x41, 0x58, 0x2f, + 0x96, 0x1b, 0x6e, 0xe9, 0x63, 0x6e, 0x5b, 0x42, + 0x2, 0x60, 0x1, 0xb3, 0x60, 0xa5, 0x4e, 0x60, + 0x1b, 0x96, 0x1b, 0x1b, 0x63, 0x63, 0x73, 0xa0, + 0x58, 0x41, 0x41, 0xb5, 0xe3, 0xb5, 0x5e, 0xd3, + 0x68, 0x68, 0x59, 0xc9, 0xfb, 0xc7, 0xd3, 0x62, + 0xa, 0xe3, 0xa, 0x62, 0x4d, 0x55, 0x6d, 0x94, + 0x49, 0x52, 0x4d, 0x62, 0xd3, 0x41, 0xd1, 0xa, + 0xa, 0x5e, 0x41, 0xa, 0xac, 0x5e, 0x62, 0x62, + 0xd3, 0x1, 0xd3, 0x58, 0xa5, 0xe9, 0x79, 0x30, + 0x8c, 0x8c, 0x24, 0xb5, 0x24, 0x2f, 0x87, 0x2f, + 0x77, 0xef, 0xef, 0xd5, 0x11, 0xef, 0xc2, 0x2f, + 0x2f, 0xc5, 0xa5, 0xa5, 0xef, 0xd7, 0xef, 0xef, + 0xd7, 0xe5, 0xd7, 0xe, 0xa5, 0xa5, 0x2f, 0x41, + 0x67, 0xa5, 0x89, 0xa5, 0x6e, 0xd2, 0x1b, 0x19, + 0x6e, 0xe, 0xd2, 0xd2, 0xf1, 0x2f, 0x1b, 0xf1, + 0x2f, 0xd2, 0x19, 0xef, 0xef, 0x6e, 0x11, 0xef, + 0xe9, 0xe9, 0xc5, 0x6e, 0xa5, 0xd2, 0x6e, 0xc5, + 0xd5, 0xe, 0xd5, 0xd5, 0xd5, 0x4a, 0xef, 0xd5, + 0x42, 0xa6, 0x67, 0x67, 0x58, 0x41, 0x5, 0x1c, + 0x29, 0x1c, 0xe3, 0xb5, 0x62, 0xa, 0xab, 0x52, + 0x29, 0x41, 0x82, 0xe3, 0x29, 0xa, 0x62, 0xd1, + 0xa, 0xa, 0xd1, 0x76, 0x23, 0x23, 0x76, 0x76, + 0x23, 0x23, 0xa, 0xd1, 0xf2, 0xa, 0xd1, 0x23, + 0x23, 0xd1, 0x78, 0x34, 0xd1, 0xd1, 0x23, 0x23, + 0xd1, 0xd1, 0x76, 0xa, 0xa, 0xa, 0x23, 0xd1, + 0xd1, 0xd1, 0x76, 0xf2, 0x76, 0x76, 0x55, 0x55, + 0x66, 0x37, 0x76, 0x76, 0xf2, 0xd1, 0x76, 0x34, + 0x76, 0x76, 0x76, 0xf2, 0x76, 0x76, 0x76, 0xf2, + 0x34, 0x23, 0x76, 0x76, 0x23, 0xd1, 0xf2, 0xf2, + 0x37, 0x61, 0x61, 0x17, 0x1f, 0x1f, 0x1d, 0x52, + 0xd3, 0x78, 0x78, 0x78, 0x4d, 0xab, 0xa8, 0xe8, + 0x7f, 0x9f, 0x84, 0x9f, 0x27, 0x83, 0x99, 0xb1, + 0x86, 0xf3, 0xc6, 0xca, 0x90, 0xe4, 0xc0, 0xfd, + 0x9d, 0xdf, 0xc6, 0x93, 0xde, 0xe4, 0x4b, 0xdf, + 0xc0, 0xbb, 0xbf, 0xdd, 0x90, 0xe1, 0xe4, 0xfd, + 0xa9, 0x39, 0xdf, 0x32, 0xf3, 0xb4, 0x81, 0xf5, + 0x81, 0xb4, 0x93, 0x4, 0x83, 0x9f, 0xc0, 0x93, + 0xe4, 0xe4, 0xdf, 0x32, 0xb1, 0x8d, 0x93, 0x9c, + 0x83, 0xd8, 0x4, 0x6f, 0x9d, 0x5c, 0x6b, 0x93, + 0xe4, 0xe4, 0xf5, 0x99, 0xe4, 0xbf, 0xf3, 0x93, + 0x4b, 0x90, 0xfd, 0x97, 0xde, 0x40, 0x7d, 0x9c, + 0xb4, 0xf3, 0x97, 0x9c, 0x99, 0xed, 0x4, 0x93, + 0x81, 0x25, 0x27, 0x9c, 0x3, 0x7c, 0x27, 0xc2, + 0x6a, 0xed, 0x93, 0x4, 0x32, 0xed, 0x8e, 0x97, + 0xc0, 0xbf, 0xde, + 0xe4, 0xe1, 0xf6, 0x53, 0x9d, 0x48, 0x52, 0xab, + 0xac, 0x76, 0x78, 0x82, 0x67, 0x58, 0x1b, 0xef, + 0xef, 0xef, 0xc5, 0x60, 0x96, 0x67, 0x58, 0x2f, + 0xa5, 0xe9, 0xd9, 0x19, 0xe, 0xc2, 0x79, 0xa5, + 0xa8, 0x67, 0x8c, 0x1, 0x67, 0xa8, 0x64, 0xc5, + 0xd2, 0xe, 0xa5, 0x1b, 0x1b, 0xd2, 0x2f, 0x8c, + 0x41, 0x41, 0xa, 0xb5, 0xd3, 0xa, 0x37, 0x6d, + 0x65, 0x87, 0xa7, 0xa8, 0xb8, 0x49, 0x66, 0xa, + 0x37, 0xe3, 0xd1, 0x62, 0x62, 0x29, 0x78, 0xac, + 0x65, 0xd3, 0xe3, 0x62, 0x1a, 0xac, 0xa, 0xa, + 0xac, 0x78, 0xa, 0xd1, 0x62, 0xa, 0x6d, 0x62, + 0x5e, 0x55, 0x24, 0x58, 0x2f, 0x50, 0x89, 0x8, + 0x2f, 0x49, 0x5e, 0x62, 0xb5, 0xd3, 0x82, 0xb5, + 0xc5, 0xc5, 0xd5, 0xc2, 0xef, 0xe5, 0xd5, 0x63, + 0xd2, 0xe, 0x42, 0xf1, 0x6e, 0xd5, 0xe, 0xa5, + 0xd5, 0xd5, 0xd5, 0xd5, 0x5d, 0x2f, 0x2, 0x73, + 0x42, 0x63, 0x1b, 0xf1, 0x42, 0x73, 0x8, 0xf1, + 0x2f, 0xa5, 0x2f, 0x42, 0x42, 0x79, 0x1b, 0x42, + 0xa0, 0x63, 0x6e, 0x6e, 0xd5, 0x6e, 0x63, 0xe, + 0xc5, 0x14, 0xf1, 0x6e, 0x6e, 0x6e, 0xd5, 0xd5, + 0x6e, 0x1b, 0x19, 0xd2, 0xe, 0xd2, 0xe9, 0x79, + 0xe9, 0x2f, 0x2f, 0xf0, 0x30, 0x73, 0x42, 0x58, + 0x1c, 0x29, 0x29, 0xe3, 0x41, 0xe3, 0xd3, 0x61, + 0xb5, 0x8, 0x8, 0x58, 0x41, 0x8a, 0x41, 0x41, + 0x1c, 0xa, 0x23, 0xa, 0x23, 0x0, 0x23, 0x23, + 0xa, 0x62, 0xb5, 0x76, 0x62, 0x16, 0xa, 0x76, + 0xd1, 0x23, 0xd1, 0x76, 0x76, 0x76, 0xa, 0xd1, + 0xa, 0xa, 0xb5, 0x5e, 0x76, 0xa, 0xd1, 0x76, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0x78, 0x55, 0x55, + 0xf2, 0x82, 0x61, 0x37, 0xf2, 0x78, 0xf2, 0xf2, + 0x76, 0x76, 0x76, 0x76, 0x23, 0x34, 0x37, 0x61, + 0xf2, 0x76, 0xa, 0xf2, 0x37, 0x78, 0xf2, 0xf2, + 0xf2, 0x76, 0x37, 0x55, 0x52, 0x59, 0xa5, 0x52, + 0xab, 0x66, 0x62, 0x6d, 0xb5, 0x24, 0x2f, 0x2f, + 0xd4, 0x83, 0x81, 0x36, 0xd7, 0x99, 0x99, 0x4, + 0x4, 0x8d, 0xf8, 0x6b, 0x27, 0xd8, 0xbd, 0x6f, + 0x6b, 0xca, 0xc4, 0x97, 0x97, 0xf3, 0xdf, 0x9c, + 0x93, 0xe4, 0x12, 0x97, 0x27, 0x9f, 0xce, 0x8e, + 0x47, 0x39, 0x6f, 0x6f, 0xf3, 0xe2, 0xf3, 0x9c, + 0xfd, 0xc4, 0x8e, 0x4, 0x6b, 0x83, 0x93, 0x4, + 0xc0, 0xbf, 0xc4, 0x6f, 0x93, 0x12, 0x32, 0x6f, + 0x6b, 0xa9, 0x3, 0x4, 0x47, 0x83, 0x9c, 0x97, + 0xc0, 0xe4, 0x97, 0x9c, 0xf3, 0xe4, 0x93, 0x93, + 0xdd, 0x8b, 0x3, 0x7b, 0xdd, 0x81, 0x6f, 0x97, + 0x12, 0xdd, 0x93, 0x93, 0x9c, 0xdd, 0x3, 0x32, + 0xdd, 0x9d, 0x3, 0x6c, 0x4, 0x6c, 0xe5, 0x99, + 0xca, 0xb1, 0xf3, 0x97, 0x93, 0xb1, 0x26, 0xfd, + 0xb9, 0x12, 0xcc, + 0x1e, 0x36, 0x9f, 0xdb, 0x88, 0xd4, 0x60, 0xa7, + 0x41, 0xac, 0x29, 0x1c, 0x58, 0xe3, 0x1, 0x2f, + 0x1b, 0x6e, 0xa5, 0xc5, 0xa5, 0x5b, 0x5b, 0x63, + 0x73, 0x8, 0x79, 0x79, 0x2f, 0x2f, 0x8c, 0x8c, + 0x82, 0x87, 0x87, 0x8c, 0xa6, 0x8, 0xa4, 0xa0, + 0x42, 0x2f, 0x67, 0x41, 0xb5, 0xd3, 0xab, 0xd3, + 0x82, 0xe3, 0xda, 0x41, 0xd3, 0xe3, 0x78, 0xa, + 0x76, 0x78, 0x76, 0x76, 0x61, 0x61, 0x76, 0xa, + 0x5e, 0x23, 0xd1, 0x1c, 0x6d, 0x1a, 0x76, 0xa, + 0x62, 0x4d, 0x4d, 0xac, 0x78, 0x76, 0x37, 0x78, + 0xd3, 0xb5, 0xd1, 0xd1, 0xa, 0xa, 0x62, 0xd1, + 0xd1, 0xd1, 0x62, 0xd3, 0xd3, 0xd3, 0xd3, 0x67, + 0xe7, 0x67, 0x41, 0x8a, 0x5, 0xe3, 0xe3, 0x41, + 0xb3, 0x65, 0x2f, 0xa5, 0xd5, 0xd5, 0x1b, 0x6e, + 0x4a, 0x4a, 0x19, 0x63, 0x6e, 0xd2, 0x2f, 0x8, + 0x42, 0x2f, 0x1, 0x2f, 0x63, 0x63, 0x89, 0x89, + 0x89, 0x63, 0x2, 0x42, 0x8, 0x58, 0x5, 0x67, + 0x5a, 0x2f, 0x5b, 0x89, 0x63, 0x63, 0x63, 0x89, + 0x42, 0xd2, 0xd2, 0x63, 0x63, 0x79, 0x2f, 0x2f, + 0x79, 0x89, 0x42, 0x8, 0x63, 0x1b, 0x4a, 0x4a, + 0xc2, 0xe, 0x79, 0x6e, 0x19, 0xe, 0xa6, 0x8, + 0x63, 0x63, 0x63, 0x89, 0x1b, 0x19, 0x4a, 0x79, + 0x8, 0x5, 0x8a, 0x8a, 0x41, 0xda, 0x8a, 0x1c, + 0x8a, 0x42, 0x79, 0x2f, 0x30, 0xf1, 0x41, 0x8c, + 0x67, 0x8a, 0x8a, 0x8a, 0xa, 0x16, 0xd1, 0xa, + 0xa, 0xa, 0x37, 0xa, 0xa, 0x29, 0x6d, 0xa, + 0xa, 0xd1, 0x29, 0xd1, 0xd1, 0xa, 0xd1, 0xd1, + 0x29, 0x62, 0x4d, 0x61, 0x76, 0xd1, 0x62, 0x76, + 0xd1, 0xd1, 0x78, 0x76, 0x76, 0x76, 0x61, 0x61, + 0x37, 0x61, 0xbe, 0x55, 0x55, 0x37, 0x61, 0x61, + 0x37, 0x4d, 0x76, 0xf2, 0xd1, 0x78, 0x61, 0x78, + 0x37, 0xf2, 0x37, 0x17, 0x17, 0x17, 0x17, 0xbe, + 0x37, 0x82, 0xc3, 0x60, 0x59, 0x4e, 0x50, 0x2c, + 0xd3, 0xac, 0xb5, 0xac, 0x82, 0x59, 0xd4, 0x8f, + 0x6b, 0xde, 0xe4, 0x8e, 0x8e, 0xde, 0xde, 0x4, + 0x9d, 0x81, 0xe4, 0xdd, 0x1e, 0xf8, 0xe4, 0x93, + 0x93, 0x12, 0xf3, 0x93, 0x97, 0xe4, 0xbf, 0xbd, + 0xd8, 0x7, 0xb4, 0xf3, 0xf3, 0xaf, 0xbb, 0xc0, + 0x69, 0xe4, 0xce, 0xc0, 0x93, 0xe1, 0xe4, 0xc0, + 0xc6, 0x74, 0xdd, 0x93, 0xf3, 0xbf, 0xb4, 0xc0, + 0x95, 0xbf, 0xf3, 0x12, 0xe4, 0x57, 0xde, 0xb1, + 0xde, 0x9f, 0x6b, 0x9c, 0xdd, 0xe4, 0xf3, 0xc0, + 0x95, 0xb4, 0x81, 0xc0, 0xe4, 0xe1, 0x81, 0xe4, + 0xbf, 0xce, 0xdd, 0xbd, 0xe4, 0xe4, 0xf3, 0xe4, + 0xaf, 0xe1, 0x71, 0xb2, 0xe4, 0xb4, 0xf6, 0xc6, + 0xbf, 0xce, 0xf3, 0xdd, 0x9c, 0xf5, 0x4, 0x26, + 0xbd, 0xcc, 0x86, 0xf8, 0x8d, 0xbf, 0xaf, 0x2e, + 0xaf, 0xbf, 0xbf, + 0x47, 0x4, 0x7b, 0x47, 0xe5, 0xd9, 0x4e, 0xab, + 0xd3, 0x29, 0x1c, 0x82, 0x58, 0x8a, 0x42, 0x42, + 0x1b, 0xd2, 0x77, 0xe9, 0xa5, 0xf0, 0x63, 0x89, + 0xa5, 0x63, 0x42, 0x67, 0x30, 0x67, 0x58, 0xd3, + 0x29, 0xe3, 0xda, 0xd3, 0x8c, 0x8c, 0x5, 0x58, + 0x8c, 0x8c, 0x58, 0x29, 0xa, 0x62, 0xd1, 0x78, + 0xa, 0x29, 0x29, 0x1c, 0xa, 0x76, 0xd1, 0x76, + 0xd1, 0x78, 0x78, 0x62, 0xd1, 0x34, 0xd1, 0xa, + 0x62, 0xa, 0xa, 0x4d, 0xd3, 0x4d, 0x62, 0x29, + 0x4d, 0x37, 0x76, 0x29, 0x62, 0xa, 0xd1, 0xd1, + 0x62, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0x62, + 0xa, 0xa, 0xa, 0x1c, 0x41, 0xb5, 0x1c, 0x62, + 0x5e, 0x78, 0x62, 0x67, 0xa8, 0x49, 0xb3, 0x79, + 0x1b, 0x2f, 0x8, 0x42, 0xd5, 0xe9, 0x2f, 0xd2, + 0xd5, 0xc5, 0xe, 0x4a, 0xd5, 0xd5, 0xd2, 0x19, + 0x8f, 0x19, 0x2, 0x89, 0x6e, 0x63, 0xf1, 0xf1, + 0xe9, 0xa5, 0xd2, 0xd2, 0xe7, 0x2f, 0x79, 0x73, + 0x1b, 0xd2, 0xf1, 0x42, 0x63, 0x2d, 0x58, 0x2f, + 0x79, 0xf1, 0x2f, 0x6e, 0x19, 0x6e, 0x19, 0x89, + 0x63, 0x63, 0x2f, 0x30, 0x2, 0x2f, 0x8c, 0x2f, + 0x6e, 0xd2, 0xa5, 0xd5, 0x19, 0x4a, 0x19, 0x63, + 0x19, 0xc2, 0x1b, 0xa5, 0x6e, 0xe5, 0x8b, 0x3e, + 0xd2, 0x19, 0x6e, 0x1b, 0x5b, 0x42, 0x79, 0x1b, + 0x1b, 0x63, 0x79, 0x67, 0x8, 0xd2, 0x2f, 0xa8, + 0xa5, 0xd2, 0xa5, 0xb3, 0x30, 0xa0, 0x58, 0xb5, + 0xa, 0x29, 0xa, 0xd1, 0x23, 0x78, 0x37, 0x78, + 0x29, 0x5, 0x87, 0x61, 0x4d, 0x62, 0x78, 0xac, + 0x78, 0x76, 0x76, 0x76, 0x76, 0x78, 0x37, 0x37, + 0x76, 0x29, 0x61, 0x4d, 0x61, 0x37, 0x61, 0x4d, + 0x61, 0x55, 0x55, 0xb6, 0x61, 0x17, 0xb6, 0xb6, + 0x65, 0x65, 0x17, 0x17, 0x61, 0x17, 0x66, 0x61, + 0x37, 0x61, 0xb7, 0xb6, 0x17, 0xb6, 0x56, 0xf, + 0xf, 0x1f, 0x9e, 0xb8, 0x91, 0x91, 0x92, 0xb6, + 0xac, 0x37, 0x4d, 0xac, 0xbe, 0x87, 0x4f, 0x8b, + 0xd8, 0x84, 0x4b, 0x90, 0xf6, 0x74, 0x85, 0x86, + 0x90, 0xdf, 0xe4, 0xe4, 0xbf, 0xc6, 0x4b, 0xe4, + 0xe4, 0x9a, 0xe4, 0xf9, 0xf6, 0x7, 0xbf, 0xbf, + 0xc6, 0xf9, 0x8d, 0xe4, 0xf4, 0xb4, 0xf4, 0x4b, + 0xf4, 0x9a, 0xf4, 0xb4, 0x4b, 0xc6, 0xf4, 0x9a, + 0xf4, 0xbf, 0xdf, 0xe4, 0xe2, 0xb4, 0xbf, 0xf9, + 0xfa, 0x7, 0x9a, 0xe4, 0xe4, 0x4b, 0xc6, 0xbf, + 0xbf, 0xb4, 0x90, 0x39, 0xce, 0xbf, 0x7, 0xc6, + 0x90, 0x74, 0x57, 0xb4, 0xb4, 0xe4, 0xdf, 0xf3, + 0x8d, 0xf4, 0x85, 0x90, 0x81, 0xe1, 0x57, 0xe1, + 0x4b, 0x90, 0x90, 0xe4, 0xbf, 0xbf, 0xdf, 0xdf, + 0xbb, 0xb4, 0xde, 0x8b, 0x7d, 0x90, 0x39, 0x3a, + 0xd8, 0x8d, 0xf9, 0xed, 0xaf, 0xf4, 0xbb, 0xcc, + 0xed, 0xcd, 0xbf, + 0xbd, 0x81, 0x4b, 0x1e, 0xc8, 0x8b, 0x91, 0x52, + 0xd3, 0x24, 0x8c, 0x82, 0x8, 0x30, 0xd2, 0x6e, + 0x4a, 0x4a, 0xe, 0xe9, 0x67, 0x60, 0xa5, 0xe7, + 0xf1, 0xd2, 0x63, 0x79, 0xf1, 0x73, 0xad, 0x58, + 0x78, 0x76, 0x62, 0x4d, 0x5e, 0x37, 0x5e, 0x4d, + 0x4d, 0xe3, 0xb3, 0x82, 0xd1, 0x62, 0xa, 0x62, + 0xd1, 0x78, 0x78, 0x62, 0x78, 0x76, 0x78, 0x76, + 0xa, 0x78, 0x29, 0x87, 0xb5, 0x62, 0xd1, 0x1c, + 0x4d, 0x78, 0x78, 0xa, 0xf2, 0x37, 0x5e, 0xab, + 0x94, 0x6d, 0x29, 0x87, 0xb5, 0x76, 0xd1, 0xd1, + 0x0, 0xd1, 0xd1, 0xd1, 0x76, 0xa, 0xd1, 0x62, + 0x4d, 0x78, 0x62, 0x6d, 0x4d, 0x5e, 0x76, 0xe3, + 0x62, 0x78, 0xb5, 0xbe, 0xab, 0x52, 0xa7, 0xc9, + 0xfb, 0x6e, 0xe9, 0x1b, 0x6e, 0xc9, 0x2f, 0xe9, + 0xef, 0x6e, 0x2f, 0xd2, 0xef, 0x7c, 0xe9, 0xc2, + 0xef, 0x6b, 0xd5, 0xe, 0xc5, 0xa5, 0x2f, 0xd2, + 0xe, 0x2f, 0x2f, 0xa5, 0xc5, 0xe8, 0x60, 0xc9, + 0xc9, 0x6e, 0xc5, 0xc5, 0x77, 0x73, 0x67, 0x30, + 0xe9, 0x79, 0x2f, 0xa5, 0xd9, 0xc5, 0xd2, 0x77, + 0x1b, 0xe7, 0x79, 0xa5, 0x6e, 0x79, 0x67, 0x2f, + 0xc2, 0xd5, 0xe, 0x6e, 0xef, 0x6e, 0xc5, 0x77, + 0x1b, 0xf0, 0x60, 0xa5, 0xd5, 0x19, 0xa5, 0xa6, + 0x6e, 0x4a, 0xd5, 0xe9, 0x1b, 0x1b, 0xd5, 0x77, + 0x6c, 0xe9, 0x79, 0x2f, 0x1b, 0x63, 0x42, 0xb3, + 0xf1, 0x63, 0x2f, 0xa8, 0x8c, 0x30, 0x1, 0xd3, + 0xd3, 0x24, 0x29, 0xa, 0xa, 0x29, 0x62, 0x76, + 0x16, 0x4d, 0x94, 0x61, 0x76, 0x76, 0x76, 0x78, + 0xa, 0xe3, 0x78, 0x29, 0x78, 0xd3, 0x55, 0x61, + 0x37, 0x65, 0x1f, 0xb6, 0x17, 0x17, 0x17, 0x52, + 0x94, 0xf, 0xf, 0xb6, 0x17, 0x1f, 0x92, 0x5f, + 0xf, 0x17, 0xb6, 0xf, 0x5f, 0x5f, 0xf, 0xb6, + 0x66, 0xb6, 0x5f, 0x5f, 0xf, 0xb6, 0x56, 0x5f, + 0xf, 0xb6, 0x9e, 0x9e, 0x1d, 0x91, 0x2c, 0x52, + 0x37, 0x6d, 0x6d, 0x4d, 0x4d, 0xa7, 0xc9, 0xef, + 0x27, 0x53, 0x90, 0x39, 0x1e, 0x1e, 0xbd, 0x93, + 0x9c, 0xf5, 0xf3, 0x93, 0xc0, 0x81, 0x9c, 0xf5, + 0xde, 0x74, 0xb4, 0xf5, 0xf5, 0xf3, 0xbf, 0xc0, + 0x93, 0xf5, 0xf3, 0x93, 0xf3, 0xb4, 0xc6, 0xf5, + 0xc0, 0x9a, 0xe1, 0xf3, 0xf3, 0xe4, 0xf3, 0xc0, + 0xe4, 0xf8, 0xf5, 0x93, 0xf3, 0x57, 0x57, 0xf5, + 0x12, 0xc6, 0xdd, 0x93, 0xb4, 0xdd, 0x32, 0xf3, + 0xbd, 0x70, 0x8b, 0x6b, 0x12, 0xb4, 0x1e, 0x8e, + 0xf5, 0xc0, 0xf5, 0x93, 0x12, 0xe2, 0x93, 0xf3, + 0xb4, 0xb4, 0x3, 0x6b, 0x93, 0xde, 0x6b, 0x4, + 0xf3, 0x93, 0x4, 0x93, 0xe4, 0xf3, 0x93, 0xfd, + 0xbf, 0xf3, 0x47, 0x27, 0xe5, 0x6c, 0x9c, 0xe5, + 0x9c, 0xb1, 0x12, 0x97, 0xf3, 0x95, 0xaf, 0xbd, + 0xb9, 0x95, 0x12, + 0xe4, 0x81, 0x39, 0x18, 0x8b, 0xa9, 0x22, 0x66, + 0xac, 0x4d, 0x8c, 0x8c, 0x87, 0xa6, 0x96, 0xd5, + 0xc2, 0xd5, 0x1b, 0xa6, 0xb3, 0xe9, 0x77, 0xc5, + 0xa6, 0x2f, 0x6e, 0xd2, 0x8, 0x2f, 0x8, 0x58, + 0x62, 0x62, 0xac, 0x4d, 0x76, 0x78, 0x6d, 0x78, + 0xa, 0xa, 0x82, 0x82, 0xa, 0x78, 0x16, 0x37, + 0xd1, 0x76, 0x76, 0x76, 0x76, 0xf2, 0x78, 0x4d, + 0x78, 0x76, 0xda, 0x65, 0x66, 0xbe, 0x4d, 0x82, + 0xf2, 0x37, 0x4d, 0xac, 0x76, 0x76, 0x78, 0xbe, + 0x5e, 0x4d, 0x16, 0xc3, 0xbe, 0x37, 0xd1, 0xd1, + 0x23, 0x23, 0xd1, 0xa, 0xa, 0xa, 0xd1, 0x23, + 0x78, 0x78, 0x78, 0xe3, 0x29, 0x1a, 0x62, 0x1c, + 0xd1, 0xd1, 0x78, 0xe3, 0x5e, 0x4d, 0xe3, 0xb3, + 0xa5, 0xa8, 0x2f, 0xa5, 0xc2, 0xe7, 0x63, 0x19, + 0xef, 0xc2, 0x63, 0xe, 0xe9, 0xa5, 0x2f, 0xc2, + 0x19, 0x77, 0xa5, 0xd5, 0x1b, 0x42, 0xd2, 0x63, + 0x63, 0x73, 0x58, 0x2f, 0xc5, 0xa8, 0x8c, 0xa6, + 0x5b, 0xa5, 0x2c, 0x5d, 0x96, 0x5b, 0x73, 0x42, + 0x19, 0x79, 0x30, 0x30, 0x63, 0xa5, 0x2f, 0x14, + 0x1b, 0x42, 0x21, 0xe7, 0xd5, 0x42, 0x89, 0x42, + 0x63, 0x19, 0xe9, 0xe, 0x1b, 0x5a, 0x2f, 0x2f, + 0x5a, 0x89, 0x1b, 0x1b, 0x19, 0x19, 0xd2, 0x89, + 0x19, 0x19, 0xd2, 0x2f, 0x96, 0xc5, 0x7a, 0x7a, + 0xd5, 0x19, 0x63, 0x63, 0x63, 0x19, 0x63, 0x42, + 0x42, 0x63, 0x67, 0xd3, 0x58, 0x8, 0x2f, 0x2f, + 0x67, 0x2f, 0x8c, 0xe3, 0x62, 0x16, 0x29, 0xa, + 0x34, 0xd1, 0x23, 0x76, 0x76, 0x23, 0xd1, 0xa, + 0x6d, 0x58, 0xda, 0xbe, 0xd3, 0x8c, 0xab, 0x66, + 0x55, 0x55, 0x17, 0x17, 0x66, 0x52, 0x65, 0xb7, + 0xf, 0x1d, 0x92, 0xb6, 0xb6, 0xf, 0xf, 0x5f, + 0xf, 0xf, 0xb6, 0x1d, 0xf, 0x5f, 0x92, 0x3f, + 0xf, 0xf, 0x92, 0x5f, 0xb6, 0xb6, 0xb6, 0xf, + 0x17, 0x1f, 0xa8, 0x60, 0x7a, 0xc5, 0xa5, 0x67, + 0x82, 0xb5, 0x6d, 0x29, 0x6d, 0x24, 0x60, 0xd5, + 0xef, 0x8b, 0x1e, 0x9c, 0x6c, 0x32, 0xf5, 0x4, + 0x4, 0x8e, 0xde, 0x6f, 0x9c, 0xd8, 0xde, 0x4, + 0x32, 0xd8, 0x12, 0x93, 0x93, 0xe4, 0x12, 0x97, + 0x93, 0xdd, 0xdd, 0x6f, 0x32, 0xc6, 0xdd, 0x93, + 0x12, 0xc6, 0xf3, 0x97, 0x93, 0xdd, 0xc0, 0x97, + 0x12, 0xb4, 0x40, 0x4, 0xbd, 0xe1, 0x1e, 0x93, + 0xf3, 0xe4, 0xf3, 0x97, 0xf3, 0x8d, 0xde, 0xfd, + 0xf5, 0x57, 0xa9, 0x3, 0x12, 0x81, 0x97, 0x97, + 0x12, 0xbd, 0x69, 0x93, 0x12, 0x12, 0x8e, 0x32, + 0xf3, 0x81, 0x3, 0x47, 0xce, 0x9c, 0x6f, 0x4, + 0x12, 0xf3, 0x93, 0x4, 0xdf, 0xdd, 0xfd, 0x9d, + 0xc6, 0x81, 0x47, 0x6b, 0x93, 0x97, 0x97, 0x9c, + 0x9c, 0xb1, 0xf3, 0x93, 0xdd, 0xce, 0xce, 0x8e, + 0xc8, 0xe4, 0xce, + 0x9d, 0x9d, 0x99, 0x27, 0x27, 0xd5, 0xc5, 0x58, + 0x6d, 0x29, 0xa, 0x4d, 0xb5, 0xb3, 0x8c, 0x2f, + 0x2f, 0xd2, 0x1b, 0x89, 0x73, 0x1b, 0x6e, 0xd2, + 0x89, 0x42, 0xf1, 0xd3, 0xd3, 0xd3, 0x4d, 0x78, + 0xe3, 0xd3, 0xbe, 0x82, 0x4d, 0xa, 0x1c, 0x29, + 0x23, 0xa, 0x78, 0x4d, 0xd1, 0x23, 0x76, 0x76, + 0xd1, 0x78, 0xe3, 0x1c, 0xa, 0xa, 0x29, 0x78, + 0x76, 0xd1, 0x76, 0x37, 0x76, 0x76, 0x37, 0x65, + 0x37, 0x4d, 0xe3, 0xc3, 0x29, 0x4d, 0x37, 0x37, + 0x78, 0x78, 0x4d, 0x4d, 0x76, 0xd1, 0xa, 0x16, + 0x23, 0x23, 0x16, 0x1c, 0xa, 0x23, 0xd1, 0x23, + 0x23, 0xa, 0xd1, 0xa, 0xa, 0xd1, 0xa, 0xd3, + 0xa, 0x29, 0xa, 0x1c, 0x62, 0xa, 0xa, 0xe3, + 0x82, 0xd3, 0x41, 0x2f, 0x2f, 0xf1, 0xd2, 0x6e, + 0xd5, 0x4a, 0x19, 0x19, 0x63, 0x5a, 0x2f, 0xf1, + 0xe7, 0x2f, 0x2f, 0x19, 0x63, 0x63, 0x63, 0xd2, + 0x63, 0x79, 0xf1, 0x2f, 0x79, 0x58, 0x67, 0x73, + 0x2, 0x67, 0x67, 0x42, 0x63, 0x63, 0x89, 0x1b, + 0x6e, 0x63, 0x42, 0xf1, 0x63, 0xf1, 0x8, 0x5a, + 0x79, 0x67, 0x67, 0x63, 0x4a, 0x63, 0x19, 0x63, + 0x63, 0x19, 0xd2, 0x2f, 0x79, 0xf1, 0x30, 0x67, + 0x42, 0x1b, 0x63, 0x63, 0x63, 0x89, 0x19, 0x6e, + 0x63, 0x63, 0x1b, 0x42, 0x1b, 0xa5, 0x58, 0x2f, + 0xd2, 0x63, 0x63, 0x6e, 0x63, 0x63, 0x63, 0x2f, + 0xf1, 0x63, 0x45, 0x30, 0x89, 0x63, 0x89, 0x89, + 0x73, 0x8, 0x41, 0xb5, 0xa, 0x62, 0x78, 0xd1, + 0xd1, 0xd1, 0x23, 0xd1, 0xd1, 0x23, 0xd1, 0x62, + 0x78, 0x82, 0x8c, 0xab, 0xab, 0x52, 0x1f, 0x1f, + 0x49, 0x1d, 0x56, 0x52, 0x52, 0x3f, 0xd0, 0x3c, + 0x1d, 0x5f, 0x92, 0xc, 0x5f, 0x5f, 0xb6, 0xf, + 0x5f, 0x92, 0x5f, 0xf, 0xf, 0x33, 0xd6, 0x80, + 0x5f, 0xf, 0xf, 0xf, 0x5f, 0xf, 0xf, 0x17, + 0x17, 0x52, 0x7e, 0x7c, 0xc2, 0x4e, 0xa3, 0x64, + 0x5e, 0x4d, 0x4d, 0x4d, 0xab, 0xa8, 0x2a, 0x6b, + 0x7d, 0xca, 0xc4, 0x32, 0xf5, 0x90, 0x99, 0x93, + 0x32, 0xd8, 0x9d, 0x99, 0x9c, 0xc6, 0xc0, 0xf3, + 0xdf, 0xdf, 0xe4, 0xc0, 0xf3, 0xb2, 0xf9, 0x6f, + 0x12, 0xc6, 0xc6, 0xf5, 0xca, 0xc6, 0xbf, 0x12, + 0xe4, 0x4b, 0xdf, 0xf3, 0x12, 0xb4, 0x75, 0xdf, + 0x81, 0xe1, 0xe1, 0x12, 0x81, 0xdf, 0xb4, 0xbf, + 0x95, 0xbf, 0xdf, 0x9c, 0xaf, 0xb4, 0xcf, 0x8b, + 0x90, 0xf8, 0x81, 0x81, 0xe4, 0x4b, 0x9c, 0xf3, + 0xbf, 0xbf, 0x81, 0x8b, 0xe2, 0xb4, 0xe1, 0x81, + 0xdf, 0xdf, 0xf3, 0xf3, 0xbb, 0xc6, 0xca, 0x99, + 0xe4, 0xbf, 0xe1, 0x18, 0x90, 0xe4, 0xe4, 0xc6, + 0xe4, 0x81, 0xb1, 0xf3, 0xe4, 0xc0, 0xb1, 0xca, + 0x7d, 0x90, 0xaf, 0xe4, 0xc6, 0xf9, 0xed, 0xaf, + 0xcc, 0xaf, 0xf7, + 0x27, 0x36, 0xd8, 0x47, 0xef, 0x77, 0xe9, 0x8c, + 0x41, 0x1c, 0x62, 0x1c, 0x41, 0x8c, 0x58, 0x5, + 0x30, 0x63, 0x63, 0x79, 0x42, 0x1b, 0x63, 0x6e, + 0x79, 0x2f, 0x8c, 0x62, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xa, 0xe3, 0xac, 0xac, 0x37, 0xac, 0xa, + 0xd1, 0xd1, 0xd1, 0x23, 0xd1, 0x76, 0xa, 0xd1, + 0xd1, 0xd1, 0x78, 0x78, 0xd1, 0x37, 0x61, 0xbe, + 0x37, 0x61, 0x55, 0x37, 0x37, 0xa, 0x76, 0x61, + 0x37, 0x29, 0x65, 0x9e, 0x1f, 0x1f, 0x1f, 0x66, + 0x37, 0x55, 0x66, 0x94, 0x4d, 0xd1, 0x23, 0x23, + 0xa, 0xd1, 0xa, 0xa, 0x23, 0xd1, 0xa, 0xa, + 0xd1, 0x23, 0xd1, 0xd1, 0xd1, 0xd1, 0x62, 0xd1, + 0x62, 0x41, 0x62, 0x1c, 0x76, 0x62, 0x41, 0x30, + 0x67, 0x5, 0x89, 0x8, 0x58, 0x58, 0x8, 0xd2, + 0x5d, 0x5d, 0xa5, 0x79, 0x6e, 0x6e, 0x63, 0x19, + 0x6e, 0x1b, 0x89, 0x63, 0xd5, 0x19, 0xd2, 0x8, + 0xf1, 0x67, 0x41, 0x8, 0xa6, 0x42, 0xd2, 0xd5, + 0x27, 0xe7, 0xa4, 0x79, 0x79, 0x2f, 0x67, 0x8, + 0x89, 0x42, 0x79, 0x2, 0x6e, 0x1b, 0x1b, 0x6e, + 0x6e, 0xf1, 0x30, 0x79, 0xd2, 0xd2, 0x79, 0xf1, + 0x6e, 0x4a, 0xd5, 0x6e, 0x6e, 0x1b, 0x73, 0x73, + 0xd2, 0x63, 0x42, 0x8, 0x89, 0x2, 0x79, 0xc5, + 0x6e, 0x89, 0x1b, 0x4a, 0xd5, 0x19, 0x1b, 0x1b, + 0xd5, 0x6e, 0xa5, 0xf1, 0xa5, 0xa5, 0x50, 0x2f, + 0xd2, 0x63, 0x63, 0x19, 0x19, 0x4a, 0x63, 0x1b, + 0xa6, 0x58, 0x62, 0xd1, 0x29, 0xe3, 0x62, 0x76, + 0x62, 0x61, 0x76, 0xa, 0x78, 0x29, 0x62, 0x62, + 0x62, 0xb5, 0x5e, 0x66, 0x52, 0x94, 0x9e, 0x33, + 0x91, 0xeb, 0x18, 0x18, 0x91, 0x80, 0x2b, 0x2b, + 0x92, 0xf, 0xf, 0x5f, 0xc, 0xc, 0x56, 0x56, + 0xf, 0xc, 0x92, 0x5f, 0xf, 0xf, 0x92, 0x2b, + 0xc, 0xf, 0x17, 0xf, 0xc, 0x5f, 0xf, 0xb7, + 0xb6, 0x56, 0x80, 0xb, 0x80, 0x1d, 0x1f, 0x61, + 0x76, 0x76, 0xf2, 0x78, 0xa7, 0x7f, 0x83, 0x90, + 0x83, 0xd8, 0x84, 0xc6, 0xe4, 0x9f, 0xf6, 0xe4, + 0xe4, 0xf4, 0xb4, 0xdf, 0x93, 0xe2, 0x95, 0x95, + 0xbf, 0xc6, 0xe1, 0xe4, 0xe4, 0x9a, 0xc6, 0xe4, + 0xe4, 0xf4, 0xbf, 0x9, 0xb4, 0xbf, 0xf4, 0xf4, + 0xe4, 0x9a, 0x57, 0x7, 0xf4, 0xf4, 0xb4, 0xc6, + 0xe4, 0xf4, 0xb4, 0xe2, 0xbf, 0xbb, 0x9a, 0xbf, + 0xbf, 0xbf, 0xe1, 0xe1, 0xb4, 0xf4, 0x9a, 0xe4, + 0xe4, 0xbf, 0xb4, 0xe4, 0xbf, 0xbf, 0xe1, 0x57, + 0xe4, 0xf4, 0x81, 0x9c, 0xaf, 0xbf, 0xe4, 0xc0, + 0xbf, 0xbf, 0xe4, 0x81, 0xe1, 0x8d, 0xde, 0xcf, + 0x75, 0xe4, 0xe4, 0xf8, 0xe4, 0xe4, 0xe4, 0xe4, + 0xbf, 0xbb, 0xdd, 0xd8, 0xbc, 0xd8, 0xce, 0x9c, + 0xc8, 0x81, 0xcc, 0xdd, 0x9, 0xbf, 0xaf, 0xbf, + 0xbf, 0xbf, 0xaf, + 0xca, 0xf8, 0xbd, 0xd8, 0xe8, 0xa8, 0x49, 0xd3, + 0xac, 0x37, 0x82, 0xda, 0xa0, 0x73, 0x1b, 0x63, + 0x6e, 0x63, 0xd5, 0x2f, 0x67, 0x5a, 0x73, 0x79, + 0x2f, 0x49, 0xf1, 0x58, 0xa, 0xd1, 0x23, 0xd1, + 0x23, 0xd1, 0xac, 0x78, 0x76, 0x76, 0xf2, 0x61, + 0x76, 0x37, 0x5e, 0x78, 0x62, 0xa, 0x4d, 0x76, + 0xa, 0x23, 0x76, 0x76, 0x76, 0xf2, 0x66, 0x61, + 0x17, 0x1f, 0xf, 0x9e, 0xb3, 0x82, 0x61, 0x61, + 0xbe, 0x66, 0x55, 0x17, 0xb6, 0x91, 0x5f, 0xb7, + 0x9e, 0x17, 0xf, 0x1d, 0x55, 0x29, 0x29, 0xa, + 0x29, 0x62, 0x23, 0x23, 0xa, 0x62, 0xb5, 0x37, + 0xd1, 0xa, 0x62, 0x23, 0xd1, 0xd1, 0xa, 0xa, + 0x62, 0x62, 0x78, 0x78, 0x62, 0x62, 0x41, 0xe7, + 0x2f, 0x89, 0x63, 0x19, 0x19, 0x42, 0x42, 0xa5, + 0x8c, 0x8, 0x2f, 0x6e, 0x77, 0xc5, 0xd5, 0xd5, + 0xd5, 0x19, 0x6e, 0xe, 0xd5, 0x6e, 0x79, 0x8c, + 0x8c, 0x41, 0x67, 0x79, 0xe, 0xd2, 0xd5, 0xd5, + 0x77, 0xd5, 0x42, 0x1, 0x67, 0x58, 0x30, 0x67, + 0x8, 0x8, 0xf1, 0xe, 0xc5, 0xa5, 0xc2, 0x4a, + 0x6e, 0x6e, 0x1b, 0x2f, 0xe9, 0x6e, 0x63, 0xd5, + 0xd5, 0x4a, 0x4a, 0x8f, 0xef, 0x63, 0x1b, 0x79, + 0x7a, 0xd2, 0xd2, 0xa5, 0xa5, 0x96, 0x73, 0xe, + 0xd2, 0x42, 0x7a, 0xd5, 0x6b, 0xd5, 0xd5, 0xd7, + 0xef, 0x19, 0x19, 0x6e, 0xd2, 0x42, 0x8, 0x8, + 0x1b, 0x63, 0xd2, 0x6e, 0xd5, 0xd2, 0xd5, 0x7a, + 0x1, 0xe3, 0x1c, 0x3b, 0x1c, 0x6d, 0xd1, 0xd1, + 0x76, 0x76, 0x78, 0x6d, 0x78, 0xf2, 0x76, 0x62, + 0x6d, 0x58, 0x4d, 0x58, 0x87, 0x68, 0xa6, 0x59, + 0x4e, 0x91, 0xa2, 0xcb, 0xea, 0x2b, 0x2b, 0x3c, + 0x3c, 0x92, 0x1d, 0xaa, 0x5f, 0xc, 0x92, 0x92, + 0x5f, 0xf, 0x5f, 0x5f, 0xaa, 0x5f, 0xf, 0x5f, + 0x5f, 0x5f, 0xf, 0xb6, 0xf, 0xf, 0x5f, 0x1d, + 0xf, 0xb6, 0x1d, 0x3f, 0x91, 0x1d, 0x1f, 0x61, + 0x76, 0x29, 0x78, 0x6d, 0x58, 0xc9, 0x5c, 0x1e, + 0x36, 0x9f, 0x18, 0x1e, 0xfd, 0xc4, 0xc6, 0xdd, + 0xf5, 0xe4, 0xbf, 0xc0, 0x93, 0xe1, 0xe1, 0xd8, + 0xc0, 0xbf, 0xe1, 0x9c, 0xce, 0x95, 0xe4, 0xf3, + 0xf3, 0xc6, 0xe4, 0x93, 0x12, 0xbf, 0xe1, 0x1e, + 0xc0, 0xb4, 0xc6, 0xdd, 0xdf, 0xe4, 0xe4, 0x93, + 0xc0, 0xbf, 0x4b, 0x9, 0xf3, 0xbf, 0xc6, 0x9d, + 0xc6, 0xe2, 0xb4, 0x93, 0xe4, 0x4b, 0xf3, 0x32, + 0xdd, 0xe4, 0x1e, 0x3, 0xbd, 0xbf, 0xf3, 0x83, + 0x83, 0xdf, 0x97, 0x4, 0x93, 0x12, 0x9c, 0x93, + 0xf3, 0xbf, 0xfd, 0x7c, 0x9d, 0xd8, 0x97, 0x6f, + 0xdf, 0xdf, 0x93, 0x32, 0xc0, 0xb4, 0x9c, 0x93, + 0xc6, 0xf3, 0x47, 0x27, 0x7e, 0x7d, 0x27, 0x6c, + 0x4, 0xed, 0xca, 0x9c, 0x93, 0xaf, 0x12, 0x93, + 0x1e, 0xc6, 0xdd, + 0x81, 0x81, 0xd8, 0x9f, 0x3e, 0xa8, 0x94, 0x76, + 0x76, 0x78, 0x4d, 0xe3, 0x89, 0x19, 0x4, 0xe5, + 0x6e, 0xd2, 0xd5, 0x89, 0x30, 0x67, 0xf0, 0x2f, + 0x2f, 0x2f, 0x60, 0x41, 0xa, 0xa, 0xa, 0x23, + 0xd1, 0x78, 0x76, 0x76, 0x76, 0x76, 0x76, 0xa, + 0x76, 0x37, 0xbe, 0xbe, 0x37, 0xbe, 0x66, 0x61, + 0x61, 0x37, 0x76, 0x76, 0x76, 0x61, 0x55, 0x66, + 0x55, 0xb6, 0xf, 0x9e, 0x9e, 0x1f, 0x55, 0x65, + 0x61, 0x17, 0xb6, 0x17, 0x1f, 0x1d, 0x5f, 0xf, + 0xa7, 0xb7, 0x17, 0x66, 0xac, 0x37, 0xa, 0x76, + 0x62, 0x76, 0xd1, 0xd1, 0x4d, 0xa, 0x76, 0x76, + 0xd1, 0xa, 0x62, 0x23, 0xd1, 0x23, 0xa, 0x78, + 0x78, 0xa, 0x62, 0x78, 0x1c, 0x62, 0x29, 0x8c, + 0x1, 0x1b, 0xd5, 0xd5, 0x19, 0x19, 0x63, 0x19, + 0x1b, 0x73, 0x1b, 0xd2, 0x2f, 0x79, 0x63, 0x6e, + 0x19, 0x6e, 0x63, 0xd2, 0xd2, 0x6e, 0xf1, 0x2f, + 0x41, 0x8a, 0x30, 0x79, 0xa5, 0xa5, 0xa5, 0x5a, + 0x2f, 0xd2, 0xa5, 0x2f, 0x8c, 0x30, 0x30, 0x89, + 0xf1, 0x41, 0x30, 0x5b, 0x14, 0x79, 0xd2, 0xd2, + 0xe9, 0x19, 0xe9, 0x79, 0xd2, 0x63, 0x6e, 0x63, + 0x4a, 0x6e, 0x19, 0x6e, 0xd2, 0x63, 0x63, 0x2f, + 0xae, 0x1b, 0x63, 0x1b, 0x1b, 0xd2, 0x89, 0x1b, + 0xe, 0x60, 0x67, 0xe7, 0xe, 0xe7, 0xd2, 0xd5, + 0xd5, 0x19, 0xef, 0x19, 0x4a, 0x63, 0x1b, 0x1b, + 0x1b, 0x63, 0x2f, 0x19, 0xe9, 0xe7, 0xae, 0xc5, + 0x2f, 0x58, 0xda, 0x73, 0x30, 0x1c, 0xd1, 0xa, + 0xa, 0x76, 0x1c, 0x58, 0x4d, 0xd1, 0xa, 0xa, + 0x41, 0x58, 0xe3, 0xda, 0x87, 0x8c, 0x67, 0x68, + 0x65, 0x64, 0x48, 0xa2, 0xdc, 0x2b, 0x33, 0x38, + 0x91, 0xc, 0x3c, 0xaa, 0xf, 0x5f, 0xc, 0xc, + 0x92, 0xb7, 0xb6, 0x5f, 0xc, 0xc, 0xf, 0xb7, + 0xb7, 0x5f, 0xc, 0xaa, 0xb6, 0xb6, 0xb6, 0x5f, + 0xb6, 0x17, 0x1f, 0xa8, 0x5d, 0x91, 0x52, 0x66, + 0xbe, 0x76, 0xe3, 0xb5, 0x68, 0x59, 0x60, 0x7c, + 0x47, 0x1e, 0x90, 0x7d, 0xe5, 0xc0, 0xe4, 0x93, + 0x6f, 0xf5, 0xc6, 0xc0, 0x97, 0xc6, 0x18, 0x6b, + 0x93, 0x95, 0xb4, 0xf5, 0xca, 0x12, 0xbf, 0x93, + 0x97, 0xdf, 0xf5, 0x47, 0xc0, 0xe4, 0xc4, 0x99, + 0x93, 0xbf, 0xf3, 0x97, 0x9c, 0xed, 0xf3, 0x93, + 0x12, 0xaf, 0x9c, 0x1e, 0xdd, 0xbf, 0xbf, 0xf5, + 0xf5, 0xe4, 0x12, 0x93, 0xf3, 0xdf, 0x32, 0x47, + 0xce, 0xe4, 0x6b, 0x7c, 0xd8, 0xe4, 0xf3, 0x9c, + 0x9c, 0x9c, 0x93, 0x4, 0x93, 0xc0, 0x99, 0x8e, + 0xd8, 0xde, 0x47, 0x27, 0x6b, 0xf3, 0x97, 0x93, + 0xdf, 0x99, 0x93, 0x32, 0xe4, 0xe4, 0x9c, 0x99, + 0xf8, 0xbd, 0x32, 0x47, 0x35, 0x6f, 0x6f, 0x4, + 0x4, 0xc4, 0xc4, 0x9c, 0x12, 0xbf, 0x95, 0xc0, + 0xed, 0xf6, 0xde, + 0xfd, 0xa9, 0x18, 0x83, 0x77, 0x2c, 0x8c, 0x6d, + 0x62, 0xa, 0x1c, 0x8a, 0x5, 0x2f, 0x77, 0xc5, + 0xe9, 0x79, 0x67, 0xf0, 0x63, 0x63, 0x1b, 0x67, + 0x68, 0x2f, 0xd3, 0xa, 0xd1, 0xa, 0x76, 0xd1, + 0xd1, 0x61, 0x76, 0x23, 0x23, 0x62, 0x37, 0x76, + 0xd1, 0x78, 0x4d, 0xac, 0xbe, 0xbe, 0x17, 0x66, + 0x65, 0x1d, 0x65, 0xc3, 0xad, 0xc3, 0x56, 0x94, + 0x55, 0x17, 0x17, 0xb7, 0xb6, 0xf, 0xf, 0xb6, + 0xb7, 0x1d, 0x5f, 0xf, 0xb7, 0xb7, 0xb6, 0x66, + 0x52, 0x55, 0x61, 0x37, 0x76, 0xd3, 0x76, 0x76, + 0x78, 0x6d, 0x8a, 0xa, 0xa, 0x23, 0x23, 0x0, + 0xd1, 0xa, 0xd1, 0x23, 0xa, 0xd1, 0xe3, 0xa, + 0x29, 0x1c, 0x5, 0x30, 0x41, 0x5, 0x5, 0x41, + 0x8a, 0x79, 0x6e, 0xe, 0xd2, 0x19, 0x19, 0x4a, + 0x4a, 0x63, 0x6e, 0x63, 0x89, 0x89, 0x63, 0xf1, + 0x79, 0xd2, 0x63, 0x1b, 0x73, 0x8, 0x8, 0xf1, + 0x2f, 0x5, 0x45, 0x8c, 0x8c, 0xd3, 0x1, 0x8c, + 0xd3, 0xd3, 0x2f, 0x2f, 0x8c, 0x41, 0x30, 0xf1, + 0x2f, 0xf1, 0xa0, 0x5, 0x8a, 0x58, 0x2f, 0x1b, + 0x30, 0x2f, 0xd2, 0x6e, 0x63, 0x89, 0x89, 0x6e, + 0x79, 0xd2, 0x63, 0x73, 0x8, 0x79, 0x63, 0x63, + 0x42, 0x96, 0x63, 0x63, 0x63, 0x89, 0x89, 0x5b, + 0x79, 0xf1, 0x89, 0x1b, 0xf0, 0x8, 0x79, 0x4a, + 0xd5, 0xa5, 0x6e, 0xd7, 0xd5, 0x4a, 0x19, 0x63, + 0x42, 0xe, 0x6e, 0x63, 0xa5, 0x2f, 0x2f, 0x79, + 0x2f, 0x58, 0x58, 0x67, 0x2f, 0x41, 0x1c, 0x1c, + 0x29, 0x8a, 0x58, 0x8, 0x8c, 0x16, 0x16, 0x62, + 0xa, 0x78, 0xa, 0xe3, 0xac, 0xd3, 0xab, 0x94, + 0xbe, 0x65, 0xb8, 0x18, 0xcb, 0xd0, 0x5c, 0x7f, + 0x80, 0x80, 0xc, 0xaa, 0xb6, 0xf, 0xc, 0xc, + 0x5f, 0xf, 0xb7, 0x56, 0x3c, 0xc, 0xaa, 0xb7, + 0xb7, 0x5f, 0xc, 0x5f, 0xb6, 0xb6, 0xf, 0x5f, + 0x1d, 0xf, 0x1f, 0xd4, 0x77, 0x3e, 0xf, 0x61, + 0x78, 0x78, 0xac, 0xbe, 0x68, 0xc9, 0x4f, 0x6b, + 0x4, 0xb4, 0xc6, 0x9c, 0x93, 0xe4, 0xb4, 0xdd, + 0x9c, 0xf3, 0xe1, 0xc6, 0x12, 0xce, 0xe4, 0xc0, + 0xc0, 0xb4, 0xf4, 0xb2, 0x12, 0xbf, 0x95, 0xe1, + 0xdd, 0xe4, 0xbf, 0x81, 0xe4, 0xbf, 0xbf, 0xf3, + 0xb4, 0x95, 0xe2, 0xdd, 0xe4, 0xbf, 0xe4, 0x57, + 0xe1, 0xf4, 0xc6, 0xe4, 0xbf, 0xbb, 0xbf, 0xbf, + 0x95, 0xaf, 0xf4, 0xe1, 0x7, 0xe4, 0xaf, 0x9f, + 0x75, 0xe4, 0xb4, 0xbd, 0xbf, 0xbf, 0xbf, 0xc0, + 0xbf, 0xbf, 0xc0, 0xf3, 0xe4, 0xbf, 0xaf, 0x81, + 0x75, 0xaf, 0x12, 0xc0, 0xb4, 0xb4, 0xe4, 0xe4, + 0xe4, 0xe4, 0xe4, 0xe1, 0xbc, 0xe4, 0xe4, 0xbf, + 0xbf, 0xbf, 0xe4, 0xe4, 0xe4, 0xe4, 0xb1, 0xed, + 0xcc, 0x7, 0xe1, 0xaf, 0xe4, 0xb4, 0xb4, 0xbf, + 0xbf, 0xbf, 0xbf, + 0x47, 0x6b, 0x6b, 0x47, 0xef, 0x50, 0x1, 0x8a, + 0x6d, 0x62, 0x6d, 0xd3, 0x30, 0x8a, 0x30, 0x42, + 0x63, 0x1b, 0xa0, 0x30, 0x89, 0x63, 0xd2, 0xf1, + 0xa0, 0x8c, 0xa, 0x23, 0x23, 0x62, 0x76, 0xd1, + 0xd1, 0xa, 0x78, 0xa, 0x62, 0x6d, 0xf2, 0x78, + 0x76, 0xac, 0xac, 0x61, 0x1, 0x65, 0x66, 0x55, + 0x59, 0x3c, 0x5f, 0x56, 0x56, 0x3f, 0x1d, 0x5f, + 0x5f, 0xb6, 0xb6, 0xb6, 0xaa, 0x92, 0xf, 0xb7, + 0x9e, 0x92, 0x5f, 0xc, 0xb6, 0x1f, 0x52, 0x52, + 0x52, 0x61, 0x61, 0x78, 0x62, 0x37, 0x76, 0xa, + 0x62, 0xa, 0x62, 0xa, 0xa, 0x29, 0x62, 0xd1, + 0xa, 0x29, 0xa, 0xa, 0xa, 0x62, 0x78, 0x41, + 0x5, 0x67, 0xa5, 0x79, 0x2f, 0x42, 0xd2, 0xd2, + 0x1b, 0x4a, 0xd7, 0x4a, 0xe, 0x4a, 0x4a, 0xa5, + 0x79, 0x63, 0x1b, 0x77, 0xd2, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x6e, 0xf1, 0xd3, 0xb5, 0xb5, 0xd3, + 0xd3, 0xd3, 0xd3, 0xd3, 0x66, 0x8c, 0x2f, 0x67, + 0x6d, 0x1c, 0xe3, 0xb5, 0xa, 0x62, 0xe3, 0xd3, + 0x64, 0x1, 0x2f, 0xa8, 0xd3, 0x67, 0x79, 0xe9, + 0x2f, 0x67, 0xf1, 0xa8, 0x2f, 0x67, 0xf1, 0xf1, + 0x2f, 0xf1, 0x63, 0x63, 0x63, 0x63, 0x63, 0x6e, + 0xd5, 0x63, 0x63, 0xef, 0xa5, 0x2f, 0x1b, 0xd2, + 0xa8, 0x2f, 0xc5, 0xef, 0xef, 0x4a, 0xd5, 0xef, + 0x77, 0x2f, 0xe7, 0xef, 0x77, 0x50, 0xe9, 0xe5, + 0xef, 0xef, 0xef, 0x19, 0x8f, 0xd2, 0x19, 0x6e, + 0xf1, 0x8c, 0x41, 0xb5, 0x6d, 0x4d, 0x24, 0x67, + 0xa5, 0xd2, 0xe9, 0x1b, 0x42, 0x67, 0xb5, 0x6d, + 0x62, 0x62, 0x6d, 0xac, 0x61, 0x61, 0x61, 0x55, + 0xa7, 0x52, 0xb7, 0x33, 0x33, 0x3c, 0x2b, 0x2b, + 0x2b, 0xc, 0xc, 0xc, 0x92, 0xaa, 0xb6, 0xaa, + 0xaa, 0x92, 0x5f, 0xf, 0xaa, 0x5f, 0xc, 0xc, + 0x5f, 0xb6, 0xf, 0xf, 0x5f, 0x5f, 0xf, 0xb7, + 0x56, 0x56, 0x91, 0x91, 0x48, 0x91, 0xb6, 0x5e, + 0x78, 0x76, 0x76, 0xb5, 0xc9, 0x83, 0x81, 0x81, + 0xf9, 0xb4, 0xb4, 0x9a, 0xb4, 0xb4, 0xf6, 0x75, + 0xbf, 0xb4, 0xe2, 0xc6, 0xbb, 0xbf, 0xf4, 0xf4, + 0xbf, 0xbf, 0xb4, 0x57, 0x85, 0xf4, 0x4b, 0xf6, + 0xbf, 0xbf, 0xb4, 0xe4, 0xc6, 0x95, 0xf4, 0xb4, + 0x9a, 0xf4, 0xf9, 0x57, 0x9a, 0xbf, 0x95, 0x81, + 0xbf, 0xb4, 0xbf, 0xbb, 0xcd, 0xf4, 0xbf, 0xbf, + 0x9a, 0xf4, 0xc6, 0x75, 0xb0, 0xf4, 0xe4, 0x8d, + 0xdf, 0xce, 0xb4, 0xe4, 0xe1, 0x4b, 0x4b, 0xb4, + 0x9a, 0x9a, 0xf4, 0xdf, 0xb4, 0xf4, 0xb4, 0xe4, + 0x4b, 0x4b, 0xf3, 0xe4, 0xe1, 0xe1, 0x4b, 0xf8, + 0x74, 0xe1, 0xb4, 0xf9, 0x4b, 0xe4, 0x12, 0xf3, + 0xbf, 0x4b, 0xdf, 0xe4, 0x57, 0xbc, 0xba, 0x39, + 0xca, 0xf6, 0xfa, 0xaf, 0xf7, 0xf7, 0xed, 0x12, + 0x12, 0xbb, 0xb4, + 0x81, 0xde, 0x84, 0x81, 0xa9, 0x49, 0x66, 0x66, + 0xa, 0x29, 0xa, 0xf1, 0x42, 0x19, 0x1b, 0x19, + 0x19, 0x63, 0x2f, 0x5, 0x8, 0x67, 0x49, 0x8c, + 0x8c, 0x61, 0x5e, 0xd1, 0x62, 0xa, 0x62, 0xd1, + 0xa, 0x78, 0xb5, 0x76, 0x78, 0x5e, 0x37, 0x4d, + 0x52, 0x1f, 0xf, 0x1f, 0x9e, 0xa8, 0x1f, 0x17, + 0x1d, 0x56, 0x5f, 0x5f, 0xf, 0x5f, 0x5f, 0x56, + 0xaa, 0xaa, 0x5f, 0xb7, 0xb7, 0xaa, 0xaa, 0x5f, + 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0xf, 0x52, 0x66, + 0x66, 0x65, 0x61, 0x76, 0x29, 0x82, 0xa, 0xa, + 0x62, 0x78, 0x78, 0x78, 0x4d, 0x5e, 0x29, 0xa, + 0xa, 0x8a, 0x41, 0xa, 0x1c, 0x8a, 0x41, 0x41, + 0x2f, 0x89, 0xa8, 0xa8, 0xa8, 0xa5, 0xd5, 0x19, + 0x31, 0xef, 0x8f, 0xd5, 0xef, 0xd7, 0x19, 0x2f, + 0x2f, 0x63, 0x63, 0x63, 0xe9, 0x6e, 0x63, 0x6e, + 0xef, 0xd2, 0x73, 0x8c, 0xa, 0xd1, 0xa, 0xa, + 0xa, 0x5e, 0x5e, 0x5e, 0x61, 0x55, 0x2f, 0x49, + 0xd3, 0x5e, 0x62, 0xd1, 0xa, 0x62, 0x62, 0x78, + 0x6d, 0x5e, 0xab, 0x52, 0x82, 0x87, 0xc3, 0xa8, + 0x82, 0x58, 0xa6, 0x41, 0x5e, 0xe3, 0x8, 0x2f, + 0x6, 0x8, 0x89, 0xe9, 0x63, 0x89, 0x42, 0x1b, + 0xd2, 0xa5, 0x63, 0xd5, 0xa5, 0x8, 0xe, 0xc5, + 0x2f, 0xad, 0x96, 0xd5, 0xef, 0xef, 0xd9, 0x1b, + 0xe, 0x2f, 0xa5, 0xef, 0xd9, 0xf0, 0x6e, 0xe5, + 0xef, 0x5d, 0xc5, 0xef, 0xef, 0xc5, 0x77, 0xef, + 0xc2, 0x2f, 0xf1, 0x8, 0x58, 0x6d, 0x87, 0x2f, + 0x77, 0x60, 0xa5, 0xf0, 0xae, 0x67, 0xd3, 0x58, + 0x58, 0x6d, 0x24, 0x58, 0x1c, 0x76, 0x4d, 0x65, + 0x8c, 0x94, 0x94, 0x55, 0xb6, 0xf, 0x5f, 0x3c, + 0x3c, 0xb6, 0xaa, 0x92, 0x2b, 0x92, 0xf, 0xb7, + 0xaa, 0xc, 0xc, 0x5f, 0xf, 0xf, 0xc, 0xc, + 0xc, 0xf, 0xb7, 0x5f, 0x3c, 0xc, 0x5f, 0xb6, + 0xb6, 0x1d, 0x92, 0x91, 0x4e, 0xa6, 0x52, 0xab, + 0xac, 0x4d, 0x78, 0xe3, 0x2f, 0x27, 0x1e, 0x9d, + 0x7d, 0x9c, 0xc6, 0x1e, 0xde, 0x81, 0xdf, 0x9c, + 0x12, 0xbf, 0xbf, 0xdf, 0x9c, 0xe2, 0xbb, 0xdd, + 0xdf, 0xdf, 0xc6, 0x40, 0xde, 0xe4, 0x4b, 0x93, + 0xc0, 0xf3, 0xc0, 0x93, 0x99, 0xed, 0x95, 0xfd, + 0x40, 0x4b, 0xdf, 0xbd, 0xdd, 0x95, 0xb4, 0x9c, + 0xc0, 0xbf, 0xb4, 0x93, 0xd8, 0xdf, 0xc0, 0xdd, + 0x81, 0xbf, 0xed, 0xf5, 0xf3, 0xb4, 0xc0, 0xb1, + 0x9c, 0x9, 0x32, 0x47, 0x9d, 0x90, 0x93, 0x8e, + 0xc6, 0xe4, 0xf5, 0x9c, 0xdf, 0x9, 0xf3, 0x97, + 0x93, 0x8e, 0x4, 0x9c, 0x9d, 0x3d, 0x99, 0x9c, + 0xc0, 0xe4, 0x93, 0x69, 0x9c, 0xf3, 0xf3, 0x93, + 0xc6, 0x90, 0x4, 0x8e, 0x74, 0xcb, 0x53, 0xca, + 0x6b, 0xce, 0xce, 0xc0, 0x93, 0xc0, 0x93, 0x97, + 0x93, 0xe4, 0xd8, + 0xc6, 0x75, 0x57, 0xdb, 0x91, 0x52, 0x94, 0xac, + 0x4d, 0xac, 0xe3, 0x8c, 0xd2, 0x6e, 0x11, 0x19, + 0x19, 0xe9, 0x67, 0x8, 0x89, 0x58, 0x6d, 0xa, + 0xa, 0x76, 0xd1, 0x23, 0x1c, 0xd3, 0xa, 0x23, + 0xa, 0xd1, 0x78, 0x76, 0x76, 0x78, 0x37, 0xac, + 0xb8, 0x91, 0x1d, 0xb7, 0xb7, 0xb7, 0x5f, 0x5f, + 0xf, 0xb6, 0xb7, 0x5f, 0xc, 0x92, 0x5f, 0xb7, + 0x56, 0x3c, 0xc, 0xf, 0xb7, 0xb6, 0x5f, 0x5f, + 0x5f, 0xf, 0xf, 0x52, 0xf, 0x1d, 0x52, 0x66, + 0xab, 0x82, 0x78, 0x76, 0x4d, 0x37, 0x78, 0xd1, + 0x62, 0xa, 0x29, 0x29, 0x78, 0xe3, 0x76, 0x62, + 0x29, 0x37, 0xa, 0x6d, 0x24, 0x8, 0x8, 0x58, + 0x5a, 0xe9, 0x73, 0x58, 0x8, 0xd2, 0xe, 0xd2, + 0xc5, 0x6e, 0xd5, 0xd5, 0x5d, 0xd5, 0x19, 0x1b, + 0x42, 0x19, 0x63, 0xf1, 0xf1, 0x79, 0xf1, 0x2f, + 0x67, 0xa6, 0xda, 0x1c, 0xa, 0x62, 0x23, 0xa, + 0x76, 0x78, 0xd1, 0x62, 0xa, 0x6d, 0xb5, 0x55, + 0xac, 0x76, 0x62, 0xa, 0xd1, 0xd1, 0xd1, 0xa, + 0x41, 0x62, 0xac, 0xb5, 0xac, 0x4d, 0x58, 0x94, + 0x78, 0x62, 0x58, 0x6d, 0x62, 0x8a, 0x89, 0x67, + 0x1c, 0x58, 0xf1, 0xf1, 0x67, 0x67, 0xa0, 0x42, + 0x79, 0xa5, 0x63, 0x19, 0x42, 0x63, 0x63, 0xd2, + 0x89, 0x67, 0x8, 0xa5, 0x2f, 0x2f, 0xa5, 0x6e, + 0xd2, 0x42, 0x63, 0x19, 0x63, 0x19, 0x19, 0xd7, + 0xc5, 0x67, 0xf0, 0xd5, 0xe9, 0x2f, 0xa5, 0x6e, + 0x89, 0x42, 0x63, 0xd2, 0x8, 0x8a, 0x30, 0x42, + 0x1b, 0x67, 0x58, 0xf1, 0xf1, 0x2f, 0x8c, 0x67, + 0xa6, 0x58, 0x87, 0x67, 0x5, 0x62, 0x62, 0xd1, + 0xd3, 0xd3, 0x66, 0x55, 0x55, 0x52, 0x5f, 0x2b, + 0xdc, 0x3f, 0x1d, 0xc, 0x3c, 0xc, 0xf, 0xf, + 0x5f, 0x5f, 0xc, 0xf, 0xb7, 0x56, 0xc, 0xc, + 0x3c, 0xaa, 0xf, 0xb6, 0x5f, 0xc, 0x5f, 0xb6, + 0x1f, 0x1f, 0xf, 0x3f, 0xa5, 0x22, 0x52, 0x94, + 0x65, 0x6d, 0x62, 0xda, 0x8, 0x6e, 0xef, 0x77, + 0xef, 0xb1, 0xe4, 0x97, 0x9c, 0xc0, 0xf3, 0x93, + 0x97, 0xe4, 0xbf, 0x97, 0x93, 0xc0, 0xbb, 0xb1, + 0x97, 0xc0, 0xe4, 0x32, 0x97, 0xe4, 0xc0, 0x97, + 0x93, 0xe4, 0x12, 0xfd, 0x47, 0xb4, 0xc0, 0x8e, + 0x32, 0xb4, 0xdd, 0x4, 0xc0, 0xf3, 0xf3, 0x97, + 0xff, 0xbf, 0xf3, 0x8e, 0x1e, 0xbb, 0xf3, 0x93, + 0x12, 0xbf, 0xf3, 0x93, 0xf3, 0xf4, 0x12, 0x32, + 0xfd, 0x57, 0x97, 0x32, 0x1e, 0xc4, 0x93, 0x93, + 0xdd, 0xe4, 0x93, 0x97, 0xf3, 0xb4, 0xdd, 0x6f, + 0xd8, 0xd8, 0x9c, 0x4, 0x9f, 0xbd, 0x9c, 0x93, + 0xe4, 0xe4, 0x9c, 0x93, 0x12, 0xb4, 0x97, 0x93, + 0xbf, 0x75, 0x32, 0xbd, 0xc6, 0xc6, 0xfc, 0xff, + 0x26, 0xf7, 0xe4, 0x8e, 0x93, 0xce, 0xe4, 0x8e, + 0x26, 0xe4, 0xe1, + 0x6b, 0x9d, 0x51, 0x51, 0xd4, 0x8c, 0x82, 0x82, + 0xe3, 0x76, 0xa, 0x1c, 0x2f, 0x79, 0xe9, 0xd2, + 0x89, 0x42, 0xf1, 0x79, 0x42, 0x45, 0x29, 0x29, + 0x29, 0x23, 0xa, 0xa, 0x78, 0x78, 0x78, 0xd1, + 0xa, 0xa, 0x78, 0x6d, 0x67, 0x68, 0x82, 0x94, + 0x3e, 0x48, 0x92, 0x17, 0xb6, 0xf, 0x5f, 0x5f, + 0x5f, 0xf, 0xb7, 0xf, 0x92, 0x3c, 0xaa, 0xf, + 0xf, 0x5f, 0xc, 0x5f, 0xb6, 0xb6, 0xb6, 0x5f, + 0x5f, 0x5f, 0x52, 0x94, 0x8c, 0x2f, 0x8c, 0x4d, + 0xf2, 0x76, 0x76, 0x76, 0x76, 0xa, 0x76, 0xd1, + 0x1c, 0x41, 0x41, 0x62, 0x1c, 0x1c, 0x78, 0x62, + 0xa, 0x29, 0x62, 0xb5, 0x8c, 0x1b, 0xe, 0x1b, + 0x89, 0x4a, 0x4a, 0x1b, 0x6e, 0x19, 0x19, 0x79, + 0xf1, 0x1b, 0xd2, 0xa5, 0x63, 0x19, 0x19, 0x63, + 0x19, 0x63, 0x63, 0x42, 0x67, 0x30, 0x58, 0xa, + 0xa, 0x62, 0xa, 0xd1, 0xa, 0x78, 0x62, 0x62, + 0x78, 0x76, 0x62, 0xd1, 0x62, 0x78, 0xd1, 0x78, + 0x62, 0x78, 0xa, 0xd1, 0xa, 0xa, 0x62, 0x62, + 0xe3, 0x29, 0x62, 0xe3, 0xa, 0xd1, 0x76, 0x76, + 0xa, 0xa, 0x62, 0xa, 0x62, 0x8a, 0x67, 0x30, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x8a, 0x30, 0x2f, + 0x8, 0x2f, 0x63, 0x4a, 0x63, 0x19, 0x19, 0x19, + 0xd5, 0x2f, 0xf1, 0x1b, 0x30, 0x30, 0x63, 0xa5, + 0x2f, 0xa5, 0x6e, 0x4a, 0x19, 0xd5, 0x4a, 0xef, + 0x6e, 0x1b, 0xd2, 0xef, 0x2f, 0x8, 0x63, 0x19, + 0x79, 0x79, 0xd2, 0xd5, 0x1b, 0xf1, 0x79, 0xe9, + 0xd2, 0x42, 0x42, 0xd2, 0x42, 0x67, 0x73, 0x79, + 0x87, 0xe3, 0x29, 0xe3, 0xb5, 0x62, 0x1c, 0x24, + 0x6d, 0xbe, 0x6d, 0x66, 0x8c, 0xa7, 0xb6, 0x56, + 0xdc, 0x2b, 0x3c, 0xc, 0x5f, 0x5f, 0xc, 0x5f, + 0xf, 0xf, 0xb6, 0xaa, 0x80, 0xb, 0x3c, 0xc, + 0x92, 0xc, 0x5f, 0xf, 0xf, 0xf, 0x5f, 0x1d, + 0x1f, 0x9e, 0xc3, 0xc9, 0x7c, 0x3e, 0x17, 0xac, + 0xac, 0x29, 0x37, 0x24, 0xa6, 0xc9, 0x7d, 0x6b, + 0x9c, 0x81, 0xc6, 0xca, 0xf3, 0xbf, 0xbf, 0xe4, + 0xdd, 0xe4, 0xe4, 0xf3, 0x81, 0xe4, 0xf9, 0x12, + 0xf3, 0xbf, 0xbf, 0xdf, 0xf5, 0xe4, 0xe4, 0xe4, + 0xb2, 0xc6, 0xc6, 0xdd, 0xe4, 0xbf, 0xb4, 0xdf, + 0xe4, 0xf4, 0x12, 0xf3, 0x1e, 0xb4, 0xb4, 0xe1, + 0x57, 0xe1, 0x81, 0x12, 0xe4, 0xbf, 0xbf, 0xb2, + 0xf9, 0xf4, 0xb4, 0xe2, 0xe1, 0xdf, 0xe4, 0xaf, + 0xe1, 0x84, 0x4b, 0xf5, 0xe4, 0xb4, 0xbf, 0xbf, + 0x4b, 0xf8, 0xe4, 0xe4, 0x7, 0xf6, 0x4b, 0xdd, + 0x81, 0xe1, 0x81, 0xdf, 0x9c, 0xb4, 0xbf, 0xf3, + 0xf8, 0xf6, 0x81, 0xbf, 0xbf, 0x9a, 0x4b, 0xdf, + 0xbf, 0xe4, 0xbf, 0xbf, 0xdf, 0xf8, 0xc6, 0x9, + 0xb4, 0xb4, 0x75, 0x90, 0xcc, 0xbf, 0xb4, 0xc6, + 0xdf, 0xf7, 0xbf, + 0xdd, 0x36, 0x83, 0x8b, 0x77, 0xa8, 0xab, 0x82, + 0x6d, 0xd1, 0x3b, 0x41, 0x8a, 0x8, 0x42, 0x63, + 0x63, 0xd2, 0xf1, 0x42, 0x42, 0xf1, 0x41, 0x8a, + 0x1c, 0xa, 0x23, 0xa, 0xa, 0xa, 0x62, 0xd1, + 0xa, 0x62, 0x62, 0x1c, 0x67, 0x4e, 0x3f, 0xf, + 0x91, 0x2b, 0x5f, 0x5f, 0x5f, 0x5f, 0xf, 0xf, + 0x5f, 0x3c, 0x92, 0x1d, 0x92, 0x3c, 0xc, 0xc, + 0xc, 0x5f, 0xf, 0x5f, 0x5f, 0x5f, 0xb7, 0xf, + 0xb6, 0x91, 0xf, 0xab, 0x24, 0x82, 0x82, 0x37, + 0x37, 0x76, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0x23, + 0x76, 0xac, 0xb5, 0xa, 0xe3, 0x66, 0x29, 0xa, + 0xda, 0xe3, 0x1c, 0x8a, 0xf1, 0x2f, 0x2f, 0x2, + 0xc2, 0x6e, 0xd5, 0x6e, 0x4a, 0xe5, 0xe5, 0x6e, + 0xd5, 0xd7, 0x6e, 0x8, 0x89, 0x63, 0xa5, 0xf1, + 0x67, 0x79, 0xf1, 0x8c, 0xd3, 0xab, 0xb5, 0xa, + 0x62, 0xb5, 0x6d, 0x62, 0x1c, 0x62, 0xd1, 0x76, + 0xa, 0xd1, 0xa, 0xd1, 0xd1, 0xa, 0xd1, 0x62, + 0xb5, 0x4d, 0x62, 0x78, 0x6d, 0xa, 0xa, 0x62, + 0xb5, 0xd3, 0x78, 0x62, 0x78, 0x62, 0x62, 0x62, + 0x29, 0x29, 0xd1, 0xd1, 0xa, 0xa, 0x41, 0x8c, + 0x6d, 0x8c, 0xd3, 0xb5, 0xb5, 0x8, 0xd2, 0x8, + 0x41, 0x5, 0xd2, 0x77, 0x6e, 0x2d, 0xa5, 0xc5, + 0xef, 0xd2, 0x6e, 0xc5, 0x96, 0x1b, 0xd5, 0x6e, + 0x73, 0x79, 0xe9, 0xc5, 0x5d, 0xc5, 0x77, 0xc5, + 0xd5, 0xef, 0x8f, 0x6a, 0x6e, 0x1b, 0xd5, 0xe5, + 0x1b, 0x1b, 0x2f, 0x79, 0x2f, 0xe7, 0xa5, 0xe8, + 0xc9, 0x6e, 0xef, 0xd7, 0x63, 0x1b, 0x5b, 0xc7, + 0x67, 0xe3, 0xe3, 0x1c, 0xb5, 0xda, 0x61, 0x17, + 0x66, 0x55, 0x17, 0xb6, 0xb6, 0xb6, 0x17, 0xb6, + 0xb6, 0x5f, 0xc, 0x5f, 0xb7, 0xaa, 0xc, 0xc, + 0x92, 0xb7, 0xb7, 0xaa, 0x2b, 0x2b, 0xc, 0xb7, + 0xf, 0xc, 0xc, 0xc, 0xf, 0xb7, 0x56, 0xc, + 0x92, 0xb8, 0x9e, 0xb8, 0x91, 0x91, 0x52, 0x66, + 0xf2, 0x76, 0x78, 0xbe, 0x87, 0x59, 0x4f, 0x83, + 0xd8, 0xe4, 0xb2, 0x90, 0x81, 0xbf, 0xf4, 0xb4, + 0x4b, 0xc6, 0xaf, 0xbb, 0xe4, 0x8d, 0x81, 0xc4, + 0xbf, 0xbf, 0xbf, 0x81, 0xde, 0xe4, 0xf4, 0xe4, + 0xe4, 0xf9, 0xbb, 0xbf, 0xe4, 0xf4, 0xe4, 0xdf, + 0xe4, 0x9a, 0xf4, 0xe1, 0x90, 0x4b, 0xf4, 0xe4, + 0xe4, 0xbf, 0xc6, 0xe4, 0xaf, 0xbf, 0xbf, 0xb4, + 0xb2, 0x7, 0xbf, 0xbf, 0xb4, 0xc6, 0xf3, 0xe4, + 0xbf, 0xe4, 0xdd, 0xc0, 0xe4, 0xb0, 0xe4, 0xc0, + 0x81, 0x9f, 0xe1, 0xc0, 0xb4, 0xe4, 0xbd, 0xc0, + 0xbf, 0xbf, 0xf3, 0xf5, 0xce, 0xe1, 0xe1, 0xb4, + 0x7, 0x8b, 0xd8, 0xbd, 0xbf, 0xb4, 0xe4, 0xc0, + 0xbf, 0xe4, 0xf3, 0xc0, 0xc6, 0x71, 0x57, 0x53, + 0xfd, 0xb4, 0xfa, 0xb9, 0xaf, 0xbf, 0xbf, 0xc0, + 0xcc, 0x12, 0xbf, + 0xe1, 0xf8, 0x90, 0x88, 0x3e, 0x49, 0x66, 0x61, + 0xa, 0xa, 0x5e, 0xab, 0x5b, 0x5b, 0x1b, 0xc2, + 0x63, 0x2f, 0x68, 0x67, 0x8c, 0xd3, 0x41, 0xd3, + 0x29, 0xa, 0xa, 0xb5, 0xb3, 0x87, 0xb5, 0xb5, + 0x1c, 0xb5, 0x4d, 0x4d, 0x61, 0x52, 0x5f, 0x5f, + 0x2b, 0xb, 0x80, 0xc, 0xc, 0xc, 0xb7, 0xf, + 0xaa, 0x2b, 0x2b, 0xc, 0xf, 0x92, 0xc, 0xc, + 0x5f, 0xb6, 0xb7, 0xf, 0x92, 0x3c, 0x92, 0x1f, + 0xb6, 0xf, 0xb6, 0x94, 0x82, 0x4d, 0x61, 0x76, + 0x37, 0x76, 0x23, 0xd1, 0x16, 0xd1, 0xd1, 0x23, + 0x23, 0xd1, 0x6, 0xb5, 0xac, 0x29, 0x1c, 0x41, + 0xb3, 0x5a, 0x87, 0x30, 0x5b, 0xa5, 0x5b, 0xf0, + 0xa5, 0xc5, 0xa5, 0xa5, 0x7d, 0xef, 0xef, 0xef, + 0xef, 0xe5, 0xef, 0x42, 0x79, 0xf1, 0x67, 0x41, + 0x41, 0x24, 0xe3, 0xb5, 0xab, 0x52, 0x5e, 0xa, + 0xb5, 0xd3, 0xe3, 0x62, 0x6d, 0x62, 0xa, 0x62, + 0xa, 0xd1, 0xd1, 0xd1, 0x78, 0x76, 0x62, 0xa, + 0x62, 0x4d, 0xa, 0x62, 0x76, 0x76, 0xa, 0x78, + 0x78, 0x78, 0x37, 0xd1, 0xa, 0x62, 0xa, 0xa, + 0x23, 0xa, 0xa, 0x23, 0xd1, 0xa, 0xa, 0x4d, + 0x6d, 0x5e, 0x37, 0xfe, 0xa, 0x41, 0x2f, 0x2f, + 0x41, 0x41, 0x58, 0xa5, 0x6e, 0x63, 0x1b, 0x1b, + 0xe, 0x63, 0x6e, 0xd2, 0x1b, 0x6e, 0x19, 0xef, + 0x6e, 0x63, 0xe, 0xd9, 0xf0, 0x63, 0xc2, 0x77, + 0x2f, 0x5a, 0xd5, 0xd5, 0xd5, 0x19, 0x4a, 0xd7, + 0xef, 0x19, 0x6e, 0xc2, 0x42, 0x1b, 0xc5, 0xe7, + 0xb3, 0xf1, 0x6e, 0xd2, 0xd2, 0x63, 0xf1, 0x2f, + 0x67, 0x58, 0x68, 0x24, 0x67, 0x67, 0xac, 0xac, + 0x4d, 0xbe, 0x55, 0x17, 0x52, 0x66, 0x66, 0x17, + 0x1f, 0x1d, 0xaa, 0xaa, 0x92, 0xc1, 0x80, 0xc, + 0xc, 0xaa, 0xf, 0xf, 0x5f, 0xaa, 0xc, 0xf, + 0x5f, 0xaa, 0xaa, 0xc, 0xf, 0x56, 0xf, 0xf, + 0xb6, 0x1f, 0x1f, 0x52, 0x1d, 0x92, 0x3f, 0x66, + 0xac, 0x76, 0x6d, 0x29, 0xb5, 0xb3, 0x1b, 0x27, + 0x27, 0xd8, 0xe4, 0x32, 0x1e, 0xc6, 0xe4, 0xf3, + 0x93, 0xc0, 0xbf, 0x93, 0x93, 0xe4, 0xf3, 0x32, + 0xfd, 0xc6, 0xaf, 0x93, 0x32, 0xe4, 0xc6, 0xf3, + 0x93, 0x8d, 0xf3, 0x93, 0xc0, 0xe4, 0xe4, 0x97, + 0xfd, 0x81, 0x8d, 0x93, 0xdd, 0xf3, 0x12, 0x93, + 0x12, 0xe4, 0xc0, 0x97, 0xbd, 0x7, 0xb4, 0x93, + 0xd8, 0x75, 0xdf, 0x97, 0xf3, 0xf4, 0xf3, 0x4, + 0xf5, 0xde, 0xfd, 0x4, 0xde, 0xcf, 0xfd, 0x8e, + 0xbd, 0xc6, 0xbd, 0x93, 0xc0, 0xb4, 0x93, 0x97, + 0xf3, 0xd8, 0x3, 0x4, 0x8e, 0x9f, 0x6b, 0x6f, + 0xc0, 0x2e, 0x4, 0x93, 0xf8, 0xb4, 0x93, 0x93, + 0xe4, 0xed, 0x47, 0x32, 0xf3, 0xfd, 0xb9, 0x6b, + 0x9c, 0xce, 0xc0, 0x97, 0x93, 0xcc, 0xb1, 0x97, + 0x93, 0xbd, 0x26, + 0x2e, 0x81, 0x18, 0x7a, 0x2c, 0x94, 0x5e, 0x76, + 0x78, 0x6d, 0xe3, 0xa7, 0x67, 0xf0, 0x1b, 0x19, + 0xd2, 0x42, 0x67, 0x8c, 0x1c, 0x6d, 0x41, 0x66, + 0x76, 0xa, 0x62, 0x24, 0xa8, 0x67, 0xc3, 0x55, + 0x55, 0x5e, 0x5e, 0xd3, 0x5e, 0x61, 0x49, 0x3e, + 0x48, 0x2a, 0xb, 0x2b, 0x92, 0x92, 0xb6, 0x1d, + 0x5f, 0xc, 0xc, 0xaa, 0x92, 0x3c, 0x80, 0x2b, + 0xc, 0x56, 0x56, 0xf, 0x5f, 0x92, 0xf, 0x17, + 0x66, 0x66, 0x55, 0x37, 0x78, 0x76, 0x76, 0x76, + 0x5e, 0xf2, 0x76, 0xd1, 0x29, 0xa, 0xd1, 0xd1, + 0x62, 0x62, 0x6d, 0xbe, 0xac, 0x29, 0x41, 0x24, + 0x67, 0x67, 0x58, 0xf1, 0xf1, 0x42, 0x63, 0x63, + 0xe, 0xd2, 0x2f, 0x8, 0xc5, 0xd2, 0xa5, 0xe, + 0x19, 0xd5, 0xe, 0x63, 0x2f, 0x41, 0x8a, 0x8a, + 0x8a, 0xa, 0x62, 0x62, 0xa, 0x76, 0x62, 0x62, + 0x62, 0xd3, 0xa, 0xe3, 0x58, 0x41, 0x1c, 0x1c, + 0x16, 0x6d, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0x6d, 0xac, 0xd1, 0xd1, 0x62, 0x62, 0xa, 0x62, + 0x62, 0xa, 0xa, 0x62, 0xd1, 0xa, 0xd1, 0xd1, + 0x23, 0xa, 0xd1, 0xd1, 0xa, 0xa, 0x29, 0x6d, + 0x4d, 0xa, 0xa, 0x29, 0x62, 0xa, 0xa, 0xa, + 0x1c, 0x41, 0x1, 0x8, 0x1b, 0x63, 0x63, 0x89, + 0x42, 0x6e, 0x1b, 0x8, 0x79, 0xd2, 0xe9, 0xe, + 0xe, 0x6e, 0xd5, 0x19, 0x19, 0x19, 0x19, 0x1b, + 0x79, 0x1b, 0x63, 0x79, 0xa5, 0x6e, 0x19, 0xd5, + 0x63, 0x19, 0x4a, 0x4a, 0x6e, 0x63, 0x6e, 0xa5, + 0x67, 0x8, 0xd2, 0x2f, 0x2f, 0x79, 0x79, 0x2f, + 0x73, 0x73, 0x42, 0x67, 0xb5, 0x87, 0x62, 0x76, + 0xac, 0xac, 0x66, 0x5e, 0x61, 0x5e, 0x61, 0x17, + 0x55, 0x59, 0x56, 0x92, 0x2b, 0xdc, 0xc, 0x5f, + 0x5f, 0x5f, 0xc, 0xb7, 0xf, 0x56, 0xaa, 0xc, + 0xc, 0x56, 0x56, 0xb7, 0xc, 0x5f, 0xf, 0x17, + 0x61, 0xbe, 0x1d, 0xa8, 0xa8, 0x3e, 0x98, 0x52, + 0xab, 0x37, 0x6d, 0xda, 0x82, 0x8c, 0x77, 0xfb, + 0xa5, 0x8b, 0x81, 0xdd, 0x4, 0xf5, 0xdf, 0x97, + 0x93, 0x12, 0xc6, 0x9c, 0x6b, 0xd8, 0xe4, 0x32, + 0x47, 0xf5, 0xc0, 0x93, 0x93, 0xc0, 0xdf, 0x99, + 0x93, 0xaf, 0xe4, 0x32, 0x83, 0x9f, 0xb1, 0x93, + 0x9c, 0xc6, 0xdf, 0x93, 0xf3, 0xe4, 0xe4, 0x9c, + 0x9c, 0x7, 0xde, 0x32, 0xfd, 0x40, 0xde, 0xf3, + 0xc0, 0xe4, 0x81, 0xf5, 0xf3, 0xbb, 0xce, 0x6f, + 0xca, 0x53, 0xfd, 0x32, 0xbd, 0x90, 0x99, 0x93, + 0xf3, 0xe4, 0x12, 0x99, 0xf3, 0xbb, 0xf3, 0x32, + 0xdf, 0x18, 0xa9, 0xfd, 0x2e, 0xc6, 0x39, 0x9c, + 0xe4, 0xb4, 0x93, 0xf5, 0xdf, 0xc0, 0xfd, 0xf3, + 0xe4, 0xd8, 0x99, 0x32, 0x8d, 0xf3, 0xf3, 0x9c, + 0x9c, 0xcc, 0x12, 0x12, 0xb1, 0xc6, 0xed, 0x9b, + 0xd8, 0xb4, 0xde, + 0x3, 0x36, 0x9d, 0x4e, 0x60, 0xb3, 0x58, 0x6d, + 0x62, 0x62, 0x6d, 0x5e, 0xe3, 0x67, 0x2f, 0x2f, + 0x2f, 0xd2, 0x19, 0x79, 0x89, 0x5, 0x3b, 0x8a, + 0xa, 0xa, 0xa, 0x62, 0x78, 0xac, 0xac, 0x78, + 0x37, 0x78, 0xe3, 0x82, 0xac, 0x24, 0x59, 0xc5, + 0xe8, 0xdb, 0x80, 0xf, 0xf, 0x5f, 0x5f, 0x3f, + 0x91, 0xc1, 0xd0, 0xdb, 0xd6, 0xdc, 0xd0, 0xc1, + 0xc, 0xc, 0x5f, 0xb6, 0x17, 0xb6, 0x52, 0x61, + 0x61, 0x61, 0x29, 0xbe, 0x78, 0x78, 0xd1, 0xd1, + 0xd1, 0xd1, 0x62, 0x62, 0x76, 0xd1, 0x1c, 0x1c, + 0x58, 0xd3, 0xb5, 0xda, 0x8, 0x2f, 0x30, 0x30, + 0xb3, 0xb5, 0x58, 0x42, 0x63, 0x63, 0x1b, 0x6e, + 0x19, 0x19, 0x63, 0x89, 0x6e, 0xc2, 0x79, 0x1b, + 0xe, 0x79, 0x8c, 0xf1, 0x2f, 0xb5, 0x41, 0x8a, + 0x58, 0x8a, 0x1c, 0x62, 0x62, 0xd1, 0xd1, 0x62, + 0x62, 0xa, 0x82, 0x41, 0x2f, 0xf1, 0x58, 0x5, + 0x45, 0x5, 0x62, 0xa, 0xd1, 0xa, 0xd1, 0x78, + 0x76, 0x76, 0x76, 0xd1, 0x29, 0xb5, 0xa, 0xd1, + 0x16, 0x1c, 0xd1, 0xd1, 0xa, 0x23, 0x23, 0xd1, + 0xd1, 0x23, 0x23, 0x23, 0xa, 0x1c, 0xe3, 0x78, + 0x16, 0xd1, 0xd1, 0xa, 0x62, 0x62, 0x62, 0x1c, + 0x8a, 0x41, 0x8c, 0x30, 0x73, 0x89, 0xd2, 0x2, + 0x42, 0x73, 0x73, 0x8, 0x89, 0x63, 0x79, 0x8c, + 0x2f, 0x63, 0x19, 0x19, 0x6e, 0x19, 0x19, 0x4a, + 0x19, 0x19, 0x63, 0x1b, 0x63, 0x19, 0x63, 0x2f, + 0xf1, 0x19, 0x8f, 0x77, 0xc5, 0x19, 0x63, 0xe7, + 0x42, 0x63, 0xa5, 0x8c, 0x5, 0x8, 0x63, 0xe, + 0x5a, 0x89, 0xd2, 0xf1, 0xd3, 0x6d, 0xda, 0xac, + 0x76, 0xac, 0x61, 0x61, 0x37, 0x66, 0x52, 0xb6, + 0x55, 0x55, 0x1f, 0x5f, 0x5f, 0xc, 0xb6, 0xb7, + 0x5f, 0xc, 0xc, 0xc, 0xb7, 0x56, 0xd, 0xc, + 0xc, 0xf, 0xb7, 0xb6, 0xc, 0xc, 0xf, 0xb6, + 0xb7, 0x9e, 0xe8, 0x88, 0x8b, 0x8b, 0xdb, 0x91, + 0x52, 0x61, 0x4d, 0xbe, 0x65, 0xa8, 0x8b, 0x83, + 0x6b, 0xdf, 0xbf, 0xb4, 0xe4, 0xb4, 0xc4, 0x12, + 0x81, 0xe1, 0xe4, 0xc6, 0xed, 0xe1, 0xcc, 0x12, + 0xf3, 0x81, 0xbf, 0xb4, 0x9, 0x95, 0xf9, 0xf3, + 0x81, 0x57, 0xe1, 0xe4, 0x81, 0xb4, 0xbf, 0xbf, + 0xbf, 0xbf, 0xdd, 0xe4, 0xf4, 0xf4, 0xe4, 0xc6, + 0xc6, 0x74, 0x75, 0xe4, 0xbf, 0xe4, 0xbf, 0xbf, + 0xe2, 0xf4, 0x95, 0xbf, 0xf4, 0x9a, 0xbc, 0xce, + 0xb2, 0xc6, 0xc6, 0xdd, 0xbb, 0xbf, 0x95, 0xf4, + 0xe4, 0xf4, 0xe1, 0xf3, 0x95, 0xf4, 0xe1, 0xe4, + 0xbf, 0xc6, 0x81, 0x8d, 0xbf, 0x95, 0xf3, 0xe4, + 0xbb, 0xe4, 0xc6, 0xc6, 0xe4, 0xbf, 0x85, 0xe1, + 0xaf, 0xcc, 0xe4, 0xe4, 0xe4, 0xbf, 0xcc, 0xdd, + 0xbd, 0xe4, 0xf4, 0x9a, 0x9a, 0xcc, 0xaf, 0xc6, + 0xe4, 0xbf, 0xbf, + 0x6b, 0x8e, 0xfd, 0xa9, 0xc9, 0x73, 0xb3, 0x24, + 0xe3, 0x6d, 0xe3, 0xa, 0x62, 0x62, 0x1c, 0x8a, + 0x58, 0x1, 0xc7, 0xe9, 0x79, 0xb3, 0xa4, 0x58, + 0xa, 0x23, 0x62, 0xd1, 0x62, 0xd1, 0xac, 0xac, + 0xd1, 0xd1, 0x61, 0xd3, 0xab, 0x52, 0x59, 0xa8, + 0x91, 0x5f, 0xc, 0xf, 0x17, 0x1f, 0x91, 0x48, + 0x48, 0x7f, 0xeb, 0xd0, 0x2b, 0x2b, 0x92, 0xf, + 0xb6, 0x5f, 0x5f, 0xf, 0x65, 0x17, 0x66, 0xab, + 0xd3, 0x76, 0x6d, 0x4d, 0x37, 0x76, 0xd1, 0xd1, + 0x76, 0x78, 0xa, 0x6d, 0xd1, 0xd1, 0x62, 0x6d, + 0xd3, 0xe3, 0x58, 0x30, 0x2f, 0x49, 0xf1, 0x63, + 0x42, 0x42, 0x42, 0x19, 0x4a, 0x6e, 0x79, 0x19, + 0x4a, 0xc5, 0xe, 0xe, 0x6e, 0xe9, 0x6e, 0x8f, + 0xd5, 0xe9, 0x2f, 0x30, 0x8a, 0xa, 0xa, 0xa, + 0x41, 0xd3, 0xa, 0xb5, 0xe3, 0x78, 0xa, 0x1c, + 0x87, 0x3b, 0xa, 0x29, 0x8a, 0x41, 0xd1, 0xa, + 0xa, 0x4d, 0x76, 0xd1, 0x62, 0xd1, 0xa, 0x29, + 0x6d, 0x29, 0x78, 0xa, 0x62, 0x78, 0xd1, 0xd1, + 0x16, 0x76, 0xd1, 0xd1, 0x16, 0xd1, 0xa, 0xa, + 0x62, 0xa, 0x23, 0x23, 0x23, 0xa, 0xa, 0xd1, + 0x78, 0xd1, 0x23, 0x29, 0x29, 0xa, 0x16, 0xa, + 0x41, 0xb5, 0xa, 0x6d, 0x24, 0x67, 0xab, 0x8c, + 0xc7, 0x1b, 0xd2, 0xef, 0xef, 0x8f, 0xc2, 0x42, + 0x42, 0x63, 0xd5, 0xc7, 0x6e, 0x19, 0xef, 0xc5, + 0xef, 0xef, 0xd5, 0xd7, 0xe5, 0xef, 0xef, 0xc2, + 0x1b, 0x19, 0x77, 0x67, 0x2f, 0xd5, 0x8f, 0x77, + 0x27, 0xef, 0x8f, 0x79, 0x1b, 0x63, 0xd5, 0xd5, + 0x2f, 0xe, 0xe7, 0xab, 0x6d, 0xb5, 0xd3, 0x78, + 0x78, 0x65, 0x1f, 0x55, 0x61, 0x55, 0x1f, 0xb6, + 0x17, 0x65, 0x17, 0xb6, 0xf, 0x92, 0xc1, 0x3c, + 0x2b, 0xc, 0x3c, 0xc, 0x5f, 0x5f, 0x5f, 0x92, + 0xc, 0x5f, 0x5f, 0xf, 0xaa, 0x5f, 0x5f, 0x1d, + 0xf, 0xb7, 0x38, 0x51, 0xdb, 0x80, 0x2b, 0x52, + 0x61, 0x34, 0xf2, 0x61, 0x61, 0x33, 0x7d, 0xc4, + 0xed, 0xe4, 0x9a, 0xc6, 0xe1, 0xe1, 0xb4, 0xb4, + 0xe1, 0xe1, 0xb4, 0xe4, 0xbf, 0xbf, 0xbf, 0xaf, + 0xbf, 0xf4, 0xb4, 0xe4, 0xc6, 0x57, 0xe1, 0xb4, + 0xe4, 0xc6, 0xe4, 0xe4, 0xf3, 0xf4, 0xbf, 0xbf, + 0xb4, 0x7, 0x7, 0xe1, 0xc6, 0x57, 0xe1, 0xb4, + 0xe4, 0x4b, 0xf5, 0xc0, 0xbf, 0xf4, 0xbf, 0xe4, + 0xbf, 0x9a, 0x57, 0x85, 0xbf, 0x4b, 0x9a, 0xb4, + 0xb4, 0xce, 0x4b, 0xed, 0xbb, 0xf4, 0x8d, 0xf8, + 0xe1, 0x75, 0x57, 0xe1, 0xbf, 0xbf, 0xb4, 0xe4, + 0xaf, 0xbf, 0xde, 0x90, 0xc6, 0xbf, 0xd8, 0x40, + 0xc6, 0x4b, 0xd8, 0xde, 0xbb, 0xe4, 0xdf, 0xf8, + 0xbf, 0xe4, 0xf3, 0x9c, 0x4b, 0xdf, 0xed, 0xc8, + 0x9f, 0xfa, 0xe4, 0xdf, 0x2e, 0xb4, 0xaf, 0x26, + 0xed, 0xf7, 0xaf, + 0x2e, 0xe1, 0xe1, 0xdb, 0x49, 0x64, 0x82, 0x5e, + 0x37, 0x5e, 0xa7, 0x24, 0xb5, 0x8a, 0x8a, 0x41, + 0x29, 0xb5, 0x58, 0x8c, 0x87, 0xe3, 0x87, 0x1, + 0xac, 0xa, 0x29, 0xe3, 0x76, 0x4d, 0xa7, 0x55, + 0x76, 0x76, 0xd1, 0x76, 0x61, 0x17, 0xf, 0x3f, + 0x5f, 0x2b, 0xc, 0x1d, 0xb6, 0x52, 0xb8, 0x7e, + 0xb, 0x80, 0x33, 0x92, 0x92, 0x5f, 0x5f, 0xf, + 0xf, 0xb7, 0x56, 0x1d, 0x52, 0x17, 0x55, 0xe3, + 0x76, 0x23, 0x76, 0x76, 0x76, 0x76, 0x76, 0xd1, + 0xd1, 0x78, 0x62, 0xb5, 0xd1, 0x62, 0xb5, 0x41, + 0x8a, 0xe3, 0x24, 0x5a, 0x67, 0xb3, 0xd2, 0x6e, + 0xd5, 0xef, 0x19, 0x19, 0xd7, 0x19, 0x6e, 0x6e, + 0xc5, 0x2f, 0x49, 0xa5, 0xe8, 0xa5, 0xe, 0xd7, + 0x8f, 0xe, 0xf1, 0x67, 0x41, 0xd1, 0xd1, 0xa, + 0xa, 0x76, 0x76, 0xe3, 0x66, 0x76, 0xa, 0x41, + 0x58, 0x41, 0xd1, 0x16, 0xa, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0x76, 0x78, 0xf2, 0x78, 0x82, + 0x68, 0xb3, 0x4d, 0x4d, 0x29, 0x78, 0xa, 0x23, + 0x62, 0x23, 0x62, 0xa, 0x16, 0x16, 0xa, 0x29, + 0x16, 0x16, 0x23, 0xa, 0x23, 0x23, 0xa, 0x23, + 0xd1, 0x23, 0x23, 0x23, 0x16, 0x16, 0x23, 0x29, + 0x3b, 0x8a, 0x29, 0x62, 0xb5, 0x1c, 0xe3, 0xe3, + 0x67, 0x79, 0xa5, 0xc5, 0x1b, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x4a, 0xd2, 0x63, 0x19, 0xa5, 0x60, + 0xe9, 0x19, 0xe9, 0xe, 0xd5, 0xd5, 0x4a, 0xd5, + 0x4a, 0xd5, 0x6e, 0x42, 0x1b, 0x19, 0xd5, 0x60, + 0x79, 0xc2, 0xd5, 0x77, 0x79, 0x1b, 0x6e, 0xe9, + 0x2f, 0xd2, 0xd2, 0x5, 0xe3, 0x3b, 0x1c, 0x1c, + 0x76, 0x6d, 0x1f, 0xac, 0x61, 0x61, 0x78, 0x66, + 0x61, 0x66, 0x55, 0x66, 0x65, 0x3f, 0x51, 0xb, + 0xc, 0xf, 0xb6, 0xc, 0x5f, 0xc, 0xf, 0xb7, + 0xb6, 0xc, 0xc, 0xaa, 0xf, 0xb7, 0x5f, 0xc, + 0xf, 0x1f, 0xb6, 0x49, 0x2c, 0x1d, 0x2c, 0x66, + 0x78, 0x78, 0x78, 0x78, 0x29, 0xb3, 0xc2, 0xe5, + 0x47, 0x40, 0xf6, 0x99, 0x6f, 0x81, 0xe4, 0x93, + 0x9c, 0xdf, 0x12, 0x93, 0x93, 0x81, 0xdf, 0xf5, + 0x93, 0x85, 0xe1, 0xdf, 0xca, 0xb2, 0x12, 0x93, + 0x93, 0xdf, 0xf3, 0x93, 0xf3, 0xe4, 0xc6, 0x83, + 0xdd, 0x75, 0xd8, 0xf5, 0xf5, 0xdf, 0xdd, 0x93, + 0x93, 0x81, 0xf5, 0x6f, 0x93, 0xbf, 0x57, 0x99, + 0xf5, 0xbf, 0xd8, 0x9c, 0x9c, 0xdf, 0x93, 0x4, + 0x93, 0xde, 0x6b, 0x27, 0xc0, 0xcc, 0x9d, 0xfd, + 0xf5, 0x81, 0x8e, 0x32, 0xc0, 0xc6, 0xf5, 0x93, + 0xdd, 0xdd, 0x47, 0x7c, 0x47, 0xc0, 0xfd, 0x4, + 0x9c, 0x9c, 0x6f, 0x93, 0xf3, 0xe4, 0x97, 0x6f, + 0xe4, 0xc0, 0x8e, 0x27, 0x7d, 0x9c, 0x6f, 0x6c, + 0x47, 0xce, 0xce, 0x9c, 0x93, 0xc0, 0xf3, 0x4, + 0x9c, 0xb9, 0x12, + 0xde, 0xd8, 0x8b, 0xd6, 0x52, 0x82, 0xe3, 0x76, + 0x37, 0xe3, 0x8, 0x67, 0xda, 0x58, 0x68, 0xda, + 0x1c, 0x58, 0x5a, 0x68, 0x8c, 0x8a, 0x58, 0xe3, + 0xa, 0x62, 0x8c, 0xd3, 0xac, 0x37, 0x55, 0xac, + 0x78, 0x78, 0x76, 0x23, 0x76, 0x61, 0x3f, 0xb, + 0x22, 0x92, 0xc1, 0x2b, 0x5f, 0xf, 0x1f, 0x56, + 0xc, 0xc, 0xc, 0x5f, 0xb7, 0xb7, 0x1d, 0x3f, + 0x1d, 0x17, 0xb7, 0x1, 0x66, 0x61, 0x37, 0x37, + 0x76, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x76, + 0xd1, 0x62, 0xa, 0xa, 0xa, 0x6d, 0x58, 0x8, + 0x30, 0xa4, 0x8, 0x2, 0xa6, 0x8c, 0x1b, 0x4a, + 0xd5, 0xd2, 0xe, 0x1b, 0x63, 0xe, 0xd2, 0x63, + 0x89, 0x30, 0x30, 0x8, 0x67, 0x2f, 0xd2, 0x63, + 0xe, 0xf1, 0x8a, 0x8a, 0x62, 0xd1, 0xa, 0x58, + 0x5, 0x1c, 0x1c, 0x62, 0x78, 0x62, 0xa, 0x78, + 0x6d, 0xa, 0xd1, 0xa, 0xd1, 0xa, 0xd1, 0x0, + 0xa, 0xd1, 0xd1, 0xd1, 0x78, 0x78, 0x78, 0x37, + 0x65, 0xbe, 0x66, 0x66, 0x55, 0x65, 0x3b, 0xda, + 0x5, 0x16, 0x29, 0xa, 0x78, 0x29, 0xa, 0xa, + 0x4d, 0x29, 0x29, 0x29, 0x16, 0x16, 0x16, 0x23, + 0xa, 0x16, 0x23, 0x23, 0x23, 0x23, 0x23, 0xa, + 0x1c, 0x8a, 0x16, 0xb5, 0x5, 0xa0, 0x1c, 0x1c, + 0x5, 0x67, 0x58, 0x8, 0x79, 0x6e, 0x63, 0x19, + 0x6e, 0x19, 0x19, 0x19, 0x19, 0x63, 0x1b, 0x2, + 0x63, 0x19, 0xd2, 0x2f, 0x63, 0x63, 0x19, 0x63, + 0x19, 0x63, 0x19, 0x19, 0x19, 0x19, 0x6e, 0x89, + 0x1b, 0x19, 0xd2, 0x67, 0x67, 0x42, 0x1b, 0x89, + 0x63, 0x63, 0x89, 0x73, 0x30, 0x30, 0x67, 0x58, + 0x29, 0x29, 0xd1, 0xf2, 0x34, 0xf2, 0x76, 0x76, + 0xd3, 0x66, 0xa7, 0xda, 0x61, 0x52, 0x48, 0x2b, + 0xc, 0x5f, 0xb7, 0xf, 0xc, 0xc, 0xaa, 0x56, + 0xb7, 0x5f, 0x3c, 0xc, 0xf, 0xb7, 0xf, 0x5f, + 0xf, 0x17, 0x9e, 0x9e, 0xa8, 0x60, 0xa5, 0x67, + 0x66, 0x37, 0x4d, 0x29, 0xbe, 0x87, 0x22, 0x6b, + 0x47, 0x9d, 0xd8, 0x9c, 0x6f, 0xdd, 0x95, 0x93, + 0x9c, 0xf3, 0xe4, 0x12, 0x93, 0xc6, 0xf6, 0x12, + 0x93, 0xe4, 0xb4, 0x12, 0x93, 0xce, 0xb4, 0x12, + 0x93, 0xe4, 0xf8, 0x93, 0x93, 0xe4, 0xe1, 0xf5, + 0xf3, 0xe1, 0xc6, 0xf3, 0xc0, 0xb4, 0x9, 0xc0, + 0xf3, 0xbf, 0xde, 0xde, 0xf3, 0xbf, 0xe1, 0xc0, + 0xc0, 0xbf, 0xc0, 0x93, 0xc0, 0xe4, 0xdd, 0x32, + 0x2e, 0xc6, 0xdb, 0x8b, 0xc6, 0xb4, 0xde, 0x9c, + 0xb4, 0xe4, 0xdd, 0x12, 0xe4, 0xbf, 0xc0, 0xd8, + 0xb4, 0xe4, 0xd8, 0xa9, 0xc4, 0xb4, 0xc0, 0xc0, + 0xf3, 0xb4, 0xf3, 0xf3, 0xbf, 0xbf, 0xdd, 0xd8, + 0xe1, 0xe4, 0xdd, 0x9d, 0xc4, 0xf3, 0xb1, 0xed, + 0xbd, 0xaf, 0xaf, 0x12, 0x12, 0xe4, 0xce, 0xdd, + 0x9b, 0x75, 0xb1, + 0x3a, 0xa9, 0x4f, 0x4e, 0x1, 0x1, 0xe3, 0xe3, + 0xb5, 0x58, 0x67, 0xd3, 0xb5, 0xa, 0x6d, 0x62, + 0x41, 0x2f, 0x1b, 0x1b, 0x73, 0x73, 0x42, 0x8, + 0x58, 0x1c, 0xac, 0xa, 0xd1, 0x76, 0x4d, 0x78, + 0x5e, 0xac, 0x4d, 0x6d, 0x37, 0x94, 0x91, 0x2a, + 0x3e, 0xb6, 0x3f, 0x5f, 0x5f, 0x5f, 0xf, 0x17, + 0xf, 0x3c, 0x3c, 0x92, 0xb7, 0xf, 0x5f, 0x1d, + 0x64, 0x61, 0x61, 0xe6, 0x61, 0x17, 0xf2, 0x37, + 0x34, 0xd1, 0xd1, 0x34, 0x23, 0xd1, 0xa, 0x23, + 0xa, 0x62, 0xa, 0x23, 0xa, 0xe3, 0x67, 0x63, + 0x19, 0x19, 0x63, 0x63, 0x89, 0x42, 0x63, 0x19, + 0xe9, 0x67, 0xf1, 0x63, 0x19, 0x63, 0x6e, 0x19, + 0x63, 0x89, 0x1b, 0x63, 0x89, 0x63, 0x6e, 0xd2, + 0xf1, 0x41, 0x41, 0xa, 0xa, 0xa, 0x58, 0xf1, + 0xf1, 0x67, 0x8a, 0x1c, 0xb5, 0x78, 0x76, 0xd1, + 0x23, 0xd1, 0x23, 0xd1, 0xd1, 0xa, 0x23, 0xa, + 0xd1, 0x29, 0x76, 0x37, 0x78, 0x76, 0x76, 0x76, + 0x37, 0x37, 0x37, 0x65, 0x9e, 0xad, 0x45, 0xa4, + 0xa0, 0x45, 0x6d, 0x76, 0x29, 0x6d, 0x29, 0x16, + 0x6d, 0x29, 0x4d, 0xb5, 0x5, 0x45, 0x3b, 0x16, + 0x1c, 0x16, 0x16, 0x23, 0xd1, 0x23, 0x23, 0xa, + 0xa, 0x29, 0x29, 0x8a, 0x5, 0x5, 0x8a, 0x1c, + 0x41, 0x58, 0xe3, 0x58, 0x8, 0xd2, 0x2f, 0xd2, + 0x4a, 0x19, 0xe9, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, + 0x4a, 0xd7, 0x6e, 0x1b, 0x6e, 0x19, 0xd2, 0xd2, + 0x4a, 0xd7, 0x8f, 0xd5, 0x19, 0x19, 0x19, 0xd5, + 0xd2, 0xd2, 0x6e, 0x73, 0x89, 0x1b, 0x79, 0xf1, + 0x89, 0x19, 0x63, 0x63, 0x67, 0x2f, 0x58, 0x87, + 0x8c, 0xd3, 0x78, 0xa, 0x76, 0x62, 0x78, 0xd1, + 0x76, 0x61, 0x55, 0x66, 0x66, 0x17, 0xb7, 0xf, + 0xc, 0x92, 0x3c, 0x80, 0xaa, 0x92, 0x3f, 0xc1, + 0x5f, 0xf, 0xf, 0x5f, 0x5f, 0x5f, 0xb6, 0xf, + 0xf, 0x1d, 0x1d, 0xa8, 0x59, 0xa3, 0x91, 0x52, + 0xac, 0x37, 0xbe, 0x61, 0x87, 0xa3, 0x88, 0x1e, + 0xed, 0xc6, 0xaf, 0xe2, 0xf3, 0xb4, 0xe1, 0xe4, + 0xc0, 0xaf, 0x9a, 0xc6, 0x9, 0xb4, 0xf4, 0xe4, + 0xe4, 0xc6, 0xbf, 0xbf, 0xb4, 0xbb, 0xe1, 0xf8, + 0xe4, 0xbf, 0x9a, 0xe4, 0xf8, 0xe4, 0xb4, 0xe4, + 0xe4, 0xe4, 0xe4, 0xe4, 0xbf, 0xf4, 0x9a, 0x75, + 0xbb, 0xf4, 0x9a, 0xbf, 0xe4, 0xf4, 0xf4, 0xbb, + 0xe2, 0xb4, 0xc6, 0xe1, 0xbf, 0xf4, 0xe1, 0x53, + 0x90, 0xc6, 0xe1, 0xc6, 0xb4, 0x4b, 0xc6, 0xbf, + 0xbf, 0xbf, 0xf4, 0xf6, 0xb4, 0x95, 0xb4, 0xe1, + 0xc6, 0xc6, 0x9, 0xe4, 0xbb, 0xbf, 0x90, 0x4b, + 0xb4, 0xe2, 0xf4, 0x75, 0xf6, 0xb4, 0xb4, 0xe1, + 0x8d, 0xf9, 0xc6, 0xe4, 0xbf, 0xbf, 0xbf, 0x4b, + 0xca, 0xe1, 0xf4, 0xaf, 0x9a, 0x75, 0xf9, 0xe4, + 0xbf, 0xcc, 0xcc, + 0xa9, 0x27, 0x9d, 0x2a, 0xa8, 0x1, 0x24, 0x78, + 0x4d, 0x82, 0xb3, 0xd3, 0xa, 0xa, 0x29, 0x41, + 0x41, 0x2f, 0x6e, 0x27, 0xc5, 0xd5, 0x77, 0x77, + 0xf1, 0x8c, 0x78, 0x78, 0x76, 0x37, 0x61, 0x37, + 0xf2, 0x37, 0x4d, 0x4d, 0x78, 0x52, 0x1d, 0x22, + 0x3e, 0x5f, 0x5f, 0xc, 0xc, 0xc, 0x5f, 0x5f, + 0xaa, 0xaa, 0x3c, 0x3c, 0x1d, 0xb6, 0xb6, 0x52, + 0x66, 0x66, 0x61, 0xf2, 0x78, 0x34, 0x76, 0xd1, + 0x76, 0x62, 0x76, 0xd1, 0xa, 0xa, 0xa, 0x78, + 0x62, 0xb5, 0xb5, 0x6d, 0x62, 0x8a, 0x89, 0xa5, + 0x19, 0x11, 0x4a, 0xe, 0xd5, 0xd5, 0x77, 0xef, + 0xd2, 0x1b, 0x19, 0x4a, 0xc2, 0xc5, 0x63, 0x63, + 0xe, 0xc5, 0xd2, 0xa5, 0xef, 0x6e, 0x79, 0x79, + 0x67, 0x41, 0x62, 0x62, 0x62, 0x62, 0x1c, 0x58, + 0x1, 0xd3, 0xa, 0xe3, 0x76, 0xd1, 0x0, 0x23, + 0x0, 0xd1, 0x23, 0x23, 0x0, 0x23, 0x23, 0x23, + 0xd1, 0x76, 0x61, 0x17, 0x17, 0x55, 0x61, 0x61, + 0xac, 0x61, 0xbe, 0x55, 0x56, 0x49, 0x1f, 0x1f, + 0x65, 0x55, 0x68, 0x82, 0x87, 0x5, 0x45, 0x5, + 0xad, 0x87, 0x16, 0xb5, 0x82, 0x82, 0x8a, 0x5e, + 0x37, 0x16, 0x1c, 0x1c, 0xb5, 0x1c, 0x16, 0xa, + 0x23, 0xa, 0xd1, 0xa, 0xa, 0x4d, 0xa, 0x76, + 0x6d, 0x8c, 0xb5, 0x2f, 0x79, 0x77, 0xa5, 0xf0, + 0x77, 0xd5, 0x60, 0xe, 0x8f, 0x3, 0x77, 0x6b, + 0xe5, 0xe5, 0xe5, 0xe5, 0xd7, 0x19, 0x6e, 0xc2, + 0xd5, 0xd5, 0x2f, 0xc7, 0xa5, 0x60, 0x7a, 0x77, + 0xef, 0xef, 0x63, 0x6e, 0x6e, 0x6e, 0xc2, 0x73, + 0x42, 0x96, 0x7a, 0xa8, 0x2f, 0x1, 0x65, 0x87, + 0x67, 0x8c, 0x82, 0x6d, 0x29, 0x76, 0x76, 0x76, + 0xf2, 0xf2, 0x61, 0x66, 0xb6, 0x1f, 0x17, 0x9e, + 0x33, 0x92, 0x80, 0xd, 0x56, 0xb7, 0x92, 0x2b, + 0xc, 0xb6, 0xb6, 0xf, 0x5f, 0xc, 0x5f, 0x9e, + 0xb7, 0xb7, 0x91, 0x48, 0xa8, 0x1f, 0x1f, 0x66, + 0xac, 0x37, 0x37, 0xab, 0x59, 0x8b, 0xed, 0xdf, + 0xca, 0x81, 0xe1, 0xe4, 0xe4, 0xf9, 0x9f, 0xc6, + 0xbf, 0xbf, 0xbf, 0xdf, 0xdf, 0xbf, 0xf4, 0xe4, + 0xdf, 0xdf, 0xc6, 0xe1, 0xe4, 0xbf, 0xf6, 0xdf, + 0xe2, 0xb4, 0xf4, 0x81, 0xdf, 0xc0, 0xe4, 0xdd, + 0xdd, 0x81, 0xf8, 0x9f, 0xbf, 0xb4, 0xe1, 0xf9, + 0xf8, 0xf4, 0xb4, 0xe4, 0x9, 0xc6, 0xbf, 0xe4, + 0xaf, 0xbf, 0x4b, 0x40, 0xc6, 0xbf, 0xc6, 0xf5, + 0xf5, 0x81, 0xbd, 0xde, 0xde, 0xc6, 0xf5, 0xde, + 0xb4, 0xbf, 0x81, 0x83, 0xdd, 0xbf, 0xe4, 0xc0, + 0xc6, 0xf5, 0x93, 0x93, 0xde, 0xc6, 0x99, 0x9d, + 0xbc, 0x8d, 0xdd, 0x81, 0xed, 0xb4, 0xb4, 0xf3, + 0x8d, 0xc6, 0x93, 0xc0, 0xe1, 0xe1, 0xe1, 0xf5, + 0x6b, 0xf6, 0xe4, 0xcc, 0xb1, 0xcc, 0xf3, 0x93, + 0xaf, 0xb4, 0xaf, + 0x4b, 0x81, 0x81, 0x3e, 0x1, 0x55, 0x37, 0x5e, + 0x4d, 0x61, 0x55, 0x55, 0x24, 0xd3, 0xb5, 0x82, + 0x87, 0x73, 0x77, 0x77, 0x77, 0x7a, 0x7f, 0xa9, + 0x48, 0xf, 0x52, 0x4d, 0xbe, 0xbe, 0xb6, 0x17, + 0x5e, 0x61, 0xf2, 0x76, 0x37, 0x55, 0x1f, 0x3f, + 0x48, 0x2b, 0x2b, 0x3c, 0xb8, 0x3c, 0xc, 0x2b, + 0x5f, 0xf, 0xf, 0x5f, 0xc, 0x5f, 0xb6, 0x66, + 0x55, 0x66, 0x66, 0xbe, 0x76, 0xd1, 0xd1, 0xa, + 0x76, 0xd1, 0xd1, 0xd1, 0x76, 0x4d, 0x29, 0x37, + 0xa, 0x82, 0x67, 0x41, 0x3b, 0x30, 0x1b, 0x6e, + 0xe, 0xc5, 0x77, 0x42, 0xa5, 0xef, 0xd5, 0xd5, + 0x6e, 0xc2, 0x11, 0xef, 0xef, 0x6e, 0xf0, 0x42, + 0x2f, 0x2f, 0xe7, 0x96, 0xd9, 0x19, 0x63, 0x79, + 0xa0, 0x5, 0x1c, 0x29, 0x62, 0x62, 0xa, 0xa, + 0x78, 0x78, 0x62, 0xd1, 0x76, 0x23, 0x23, 0xa, + 0xd1, 0x23, 0x23, 0x23, 0x23, 0x0, 0x0, 0x23, + 0xd1, 0x76, 0x55, 0xb6, 0xb6, 0x9e, 0x1f, 0xf, + 0xf, 0xb7, 0x55, 0x17, 0x17, 0x52, 0x66, 0x1f, + 0x17, 0x65, 0xc3, 0x59, 0xc3, 0x45, 0x45, 0xa4, + 0xb3, 0xb3, 0x87, 0x24, 0x55, 0x37, 0xe3, 0x82, + 0x82, 0x6d, 0x5, 0xa4, 0x5, 0x5, 0x5, 0x16, + 0x16, 0x29, 0xa, 0x23, 0xa, 0xd1, 0xa, 0x78, + 0x78, 0x29, 0xa, 0x24, 0x60, 0x60, 0x60, 0x96, + 0x77, 0xe, 0xd2, 0x4a, 0xd5, 0xe9, 0x2f, 0xe, + 0xef, 0x8f, 0x77, 0xd5, 0xd5, 0x19, 0x4a, 0xe5, + 0xd5, 0xd5, 0x1b, 0x42, 0x63, 0x2f, 0x8a, 0xf1, + 0x63, 0x63, 0xd2, 0xc2, 0x63, 0x2, 0x6e, 0x6e, + 0x79, 0x2f, 0x1b, 0x63, 0xd2, 0xf1, 0x58, 0x4d, + 0x24, 0x82, 0x78, 0xd1, 0x62, 0x78, 0xf2, 0x76, + 0xe3, 0x61, 0x5e, 0xac, 0xab, 0x17, 0x55, 0x65, + 0xb6, 0x1d, 0x5f, 0x92, 0x1d, 0x1d, 0x92, 0xc, + 0xf, 0xb6, 0xb6, 0xb7, 0xb7, 0xf, 0x5f, 0xf, + 0x1f, 0xb6, 0xaa, 0x1d, 0xa8, 0xab, 0x17, 0x62, + 0x37, 0x4d, 0x78, 0xe3, 0xb3, 0xd9, 0x83, 0x47, + 0x6f, 0xf5, 0xbc, 0x1e, 0x4, 0x93, 0x2e, 0x4, + 0x97, 0x12, 0xc0, 0x93, 0x4, 0xc0, 0xbf, 0x93, + 0x93, 0xdd, 0xde, 0xf5, 0x93, 0xbf, 0xbf, 0x93, + 0x69, 0xb4, 0x9, 0x97, 0x97, 0xbd, 0xde, 0x3, + 0x4, 0xdd, 0x32, 0x47, 0x97, 0xf3, 0xf3, 0x93, + 0x93, 0x95, 0xc0, 0x97, 0x93, 0xbf, 0xc0, 0xfd, + 0xdd, 0xbf, 0xf3, 0x4, 0x93, 0xbf, 0x32, 0x4, + 0x97, 0xdd, 0x1e, 0x3, 0x3, 0xdd, 0x97, 0x3, + 0x1e, 0xbf, 0xf3, 0x97, 0xf3, 0x95, 0xf5, 0x97, + 0xf3, 0xc0, 0x4, 0x3, 0x3a, 0xbd, 0x4, 0x6f, + 0x81, 0xc6, 0x93, 0x97, 0xf3, 0xf3, 0x93, 0x97, + 0xe4, 0xf3, 0x97, 0x4, 0xdb, 0x1e, 0x1e, 0x4, + 0x4, 0xb1, 0xc0, 0x4, 0x93, 0xaf, 0xf3, 0x97, + 0x32, 0xd8, 0x26, + 0x9c, 0x1e, 0x9d, 0x3e, 0x1, 0xd3, 0x4d, 0x76, + 0x78, 0xa, 0x76, 0xac, 0x58, 0x67, 0xd3, 0x3b, + 0x30, 0x60, 0x77, 0xef, 0xc5, 0x60, 0x4e, 0x27, + 0x98, 0x2c, 0x17, 0x61, 0xe3, 0x66, 0x52, 0x52, + 0x55, 0x37, 0x76, 0x76, 0x6d, 0xbe, 0x52, 0x59, + 0x35, 0x51, 0xdb, 0x51, 0xeb, 0x2b, 0xc, 0x3c, + 0xc, 0xf, 0xb6, 0xb6, 0x5f, 0xf, 0x17, 0x61, + 0x61, 0xbe, 0x61, 0x82, 0xbe, 0x37, 0x76, 0xa, + 0xd1, 0xd1, 0x76, 0x62, 0x78, 0x78, 0xac, 0x78, + 0x62, 0x8a, 0x8c, 0x41, 0x58, 0x1b, 0xd2, 0x4a, + 0xd5, 0xd5, 0xa5, 0x5a, 0x2f, 0xe9, 0x8f, 0x5a, + 0xa5, 0x6e, 0x63, 0x19, 0x6e, 0x63, 0x1b, 0x2f, + 0xf1, 0x63, 0x63, 0x89, 0x19, 0x1b, 0x2, 0xf1, + 0x58, 0x3b, 0x1c, 0xd1, 0xa, 0x62, 0x62, 0x62, + 0xd1, 0x23, 0xd1, 0xd1, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0xa, + 0xd1, 0x78, 0x8c, 0xa7, 0xb6, 0x1f, 0xb6, 0xb6, + 0xf, 0xf, 0x17, 0x17, 0x55, 0x65, 0xb3, 0xc3, + 0x9e, 0xc3, 0x45, 0x45, 0x68, 0x68, 0x68, 0xbe, + 0x82, 0x82, 0xda, 0x82, 0x82, 0x87, 0x45, 0x45, + 0x68, 0x8a, 0xda, 0x45, 0x8a, 0x6d, 0xda, 0x4d, + 0x29, 0x29, 0x16, 0x16, 0x16, 0x23, 0x23, 0x23, + 0x23, 0x29, 0x29, 0x62, 0xe3, 0x58, 0x8c, 0x2f, + 0x79, 0xe9, 0x19, 0xd7, 0x4a, 0x63, 0xd2, 0x19, + 0xd5, 0xd2, 0x42, 0xc2, 0x63, 0xd2, 0xd2, 0xd5, + 0xe, 0x63, 0x11, 0x63, 0x63, 0x1b, 0x8, 0x1b, + 0x89, 0x2, 0xf1, 0xd2, 0x63, 0x2d, 0x2, 0x19, + 0x63, 0x63, 0x19, 0x19, 0x19, 0x89, 0x8, 0x1c, + 0x1c, 0x1c, 0xa, 0x23, 0x23, 0xd1, 0x78, 0x78, + 0x5e, 0x61, 0x66, 0xbe, 0x66, 0x55, 0x55, 0xab, + 0x61, 0x17, 0xb6, 0x1d, 0x91, 0x1d, 0x5f, 0x56, + 0x56, 0x1d, 0xf, 0xb6, 0xf, 0xb7, 0xf, 0x5f, + 0xb6, 0xb6, 0x1f, 0x52, 0x2f, 0x2c, 0x52, 0xd3, + 0xe3, 0xbe, 0xbe, 0x8c, 0x30, 0xd4, 0x4f, 0x3a, + 0x4, 0xfd, 0x90, 0x6b, 0x6f, 0x69, 0xe4, 0x93, + 0x9c, 0x9c, 0xb4, 0x93, 0x97, 0xb4, 0xed, 0x47, + 0x97, 0xe4, 0xbf, 0x9c, 0x93, 0xe4, 0xe4, 0xc0, + 0x93, 0x81, 0xc0, 0xfd, 0xbd, 0xdd, 0x1e, 0x27, + 0x6f, 0xf3, 0xf3, 0x32, 0x9c, 0xdf, 0x8d, 0x12, + 0xc0, 0xbf, 0x4b, 0x1e, 0xc0, 0xf4, 0xbb, 0xd8, + 0xf5, 0xbf, 0xc0, 0xf3, 0xf3, 0x4b, 0xbd, 0xfd, + 0xd8, 0xc6, 0x27, 0x3e, 0x8b, 0x81, 0xce, 0x97, + 0xdf, 0x81, 0xbf, 0xc0, 0xb4, 0xbf, 0xf5, 0xf5, + 0x40, 0xe1, 0x9c, 0xfb, 0x88, 0x70, 0xf3, 0xf3, + 0xf8, 0xdf, 0x9c, 0x12, 0x95, 0xb4, 0xdf, 0xca, + 0x75, 0xe1, 0xf3, 0x2e, 0x39, 0x9c, 0x86, 0x93, + 0xc0, 0xaf, 0xf7, 0xed, 0xc0, 0xb4, 0xe1, 0xf3, + 0x9c, 0x9f, 0xd8, + 0x47, 0xa9, 0x98, 0x4e, 0x67, 0xd3, 0x4d, 0x62, + 0x29, 0x29, 0xa, 0x62, 0xb5, 0xe3, 0x82, 0x41, + 0x67, 0x2f, 0x5d, 0x4f, 0xd5, 0xd5, 0x6b, 0x6b, + 0xd5, 0xa8, 0xd3, 0x4d, 0x4d, 0x4d, 0x66, 0x52, + 0x94, 0xd3, 0xbe, 0x4d, 0x87, 0xc3, 0xa8, 0x7a, + 0x5d, 0x2a, 0x80, 0xb, 0x91, 0x3c, 0xc, 0xc, + 0x5f, 0x5f, 0xf, 0x17, 0x65, 0x17, 0xac, 0x61, + 0x37, 0xf2, 0x76, 0x76, 0x76, 0x37, 0xf2, 0x6d, + 0xd1, 0x29, 0x16, 0x62, 0x76, 0x29, 0x62, 0x62, + 0x1c, 0xa, 0x41, 0x41, 0x8, 0x63, 0x63, 0x63, + 0xd5, 0x6e, 0x19, 0x63, 0x63, 0x19, 0x6e, 0x8, + 0x8, 0x63, 0xd2, 0x2f, 0xa5, 0x19, 0x4a, 0x63, + 0x6e, 0x6e, 0x63, 0x19, 0x19, 0x89, 0x67, 0x58, + 0xe3, 0xd1, 0xd1, 0x23, 0xa, 0xd1, 0x41, 0x62, + 0xd1, 0xa, 0x23, 0x0, 0x23, 0x23, 0xd1, 0xd1, + 0x23, 0x23, 0x16, 0x23, 0x23, 0xa, 0xa, 0x37, + 0x78, 0xda, 0xc3, 0x9e, 0xf, 0x65, 0x1d, 0xb6, + 0xb6, 0x17, 0x17, 0xb6, 0x17, 0xc3, 0xad, 0x60, + 0xa8, 0xc3, 0x45, 0x65, 0xbe, 0x4d, 0xda, 0xda, + 0x29, 0x82, 0xa4, 0xa4, 0xa4, 0x45, 0x45, 0x45, + 0x58, 0x8a, 0x8a, 0x6d, 0x4d, 0x29, 0x6d, 0x3b, + 0xb5, 0x4d, 0x5, 0x5, 0x1c, 0xa, 0xa, 0x16, + 0xa, 0xa, 0x62, 0xa, 0xa, 0xa, 0xb5, 0x8c, + 0xab, 0x67, 0xae, 0xd5, 0x8f, 0x11, 0x4a, 0x19, + 0x6e, 0x6e, 0xd2, 0x4a, 0xd5, 0x2f, 0x2f, 0xc2, + 0xd5, 0x4a, 0x8f, 0xd5, 0x4a, 0x6e, 0x63, 0xe9, + 0xd2, 0x2f, 0x73, 0x1b, 0x63, 0xf1, 0x2f, 0xe9, + 0x19, 0x4a, 0xc2, 0xd5, 0xe9, 0x79, 0x67, 0x67, + 0x8a, 0x6d, 0xe3, 0x62, 0x1c, 0x29, 0x78, 0x62, + 0xac, 0x5e, 0x61, 0x37, 0x37, 0x82, 0x66, 0x52, + 0x52, 0x17, 0xb6, 0x1d, 0x48, 0x48, 0x92, 0x56, + 0x56, 0x5f, 0x5f, 0x92, 0xb7, 0xb6, 0xb7, 0x5f, + 0x92, 0x1d, 0x1f, 0x52, 0x7a, 0x3e, 0x1d, 0x61, + 0x4d, 0x94, 0xab, 0xa7, 0xad, 0x1b, 0x4f, 0x83, + 0xbd, 0xe4, 0x4b, 0x99, 0x9c, 0xe4, 0xaf, 0x8d, + 0xc0, 0xdf, 0xe1, 0xc6, 0xe4, 0xe4, 0xdf, 0xf3, + 0xc0, 0xbf, 0xbf, 0xaf, 0xdf, 0xbf, 0xe2, 0xe1, + 0xe1, 0xc6, 0xc6, 0xc6, 0xb4, 0xbf, 0xc6, 0xc4, + 0xf3, 0xb4, 0xbf, 0xe4, 0xdf, 0xdd, 0xe4, 0xc6, + 0x75, 0xb4, 0x81, 0xdd, 0xbf, 0xf4, 0xf4, 0xe4, + 0xc6, 0xbf, 0x95, 0xb4, 0x9a, 0x90, 0x81, 0x9f, + 0xcb, 0x70, 0xf9, 0x7d, 0xd8, 0xe4, 0xbb, 0xe4, + 0xc6, 0xc0, 0xf4, 0xb4, 0x9a, 0xe1, 0x81, 0xe4, + 0xe1, 0x7, 0xe4, 0xf5, 0x9c, 0xbf, 0xe2, 0xbf, + 0xf4, 0xc0, 0xb4, 0xb4, 0x85, 0x75, 0xb4, 0xb2, + 0xb4, 0xf4, 0xbf, 0xe4, 0xc6, 0x93, 0xcc, 0xce, + 0xb4, 0xf4, 0xe1, 0xb1, 0xe4, 0x7, 0x75, 0xb4, + 0xcd, 0xbf, 0xf4, + 0x36, 0x27, 0xe8, 0xd4, 0xa5, 0xab, 0xac, 0xe3, + 0xda, 0xe3, 0xe3, 0x4d, 0x78, 0x76, 0xd3, 0x24, + 0xa5, 0xd9, 0x7d, 0x8f, 0x6b, 0x9b, 0xd8, 0xdb, + 0x72, 0xc3, 0xbe, 0x76, 0x4d, 0x4d, 0x61, 0x8c, + 0x60, 0x49, 0x17, 0xbe, 0xc3, 0x64, 0x1d, 0x91, + 0x3f, 0x56, 0x5f, 0xc, 0x80, 0xc, 0xf, 0xb7, + 0x56, 0xc, 0x5f, 0xb6, 0x66, 0x66, 0x55, 0x5e, + 0x76, 0x78, 0x76, 0x23, 0xa, 0x76, 0x76, 0x37, + 0xa, 0xb5, 0x76, 0xa, 0x1c, 0x5, 0xbe, 0x62, + 0x8a, 0x30, 0xa0, 0x73, 0x42, 0x6e, 0xd5, 0xf1, + 0xc2, 0x4a, 0x11, 0x4a, 0xd7, 0x6e, 0x6e, 0x79, + 0xe, 0x19, 0x6e, 0x2f, 0xf0, 0x4a, 0x63, 0x4a, + 0xd9, 0x1b, 0x79, 0xa5, 0x5d, 0x2f, 0x58, 0x29, + 0x62, 0xd1, 0xa, 0xa, 0xd1, 0xa, 0xa, 0xa, + 0xd1, 0x23, 0x23, 0x23, 0x23, 0x16, 0x16, 0x29, + 0x29, 0x16, 0x16, 0x23, 0x34, 0xd1, 0x76, 0x76, + 0x37, 0x66, 0x65, 0xb7, 0x92, 0x92, 0x56, 0xb7, + 0x17, 0x17, 0x56, 0xf, 0x17, 0x65, 0xc3, 0x9e, + 0x5f, 0xaa, 0x9e, 0x9e, 0xc3, 0xc3, 0xad, 0xad, + 0x68, 0xda, 0x45, 0xa4, 0xc3, 0x82, 0x65, 0x87, + 0x61, 0x82, 0x87, 0x5, 0x5, 0x5, 0x45, 0x45, + 0x68, 0x29, 0x5, 0x68, 0x29, 0x23, 0xa, 0xd1, + 0xa, 0x62, 0xa, 0x29, 0x29, 0x78, 0x41, 0x58, + 0x67, 0x41, 0x8, 0xd5, 0xd5, 0x77, 0xe5, 0x6b, + 0xd5, 0xef, 0x11, 0x6b, 0xd5, 0xd2, 0x63, 0x19, + 0xd7, 0xd7, 0xef, 0xd7, 0xef, 0x50, 0x77, 0x8f, + 0x6e, 0xd2, 0xd5, 0x4a, 0x6e, 0x6e, 0x42, 0x63, + 0xc2, 0x2f, 0xa5, 0x6e, 0x6e, 0x2f, 0x60, 0xa5, + 0x73, 0x24, 0x29, 0x1c, 0xda, 0x1c, 0x76, 0x6d, + 0x5e, 0xf2, 0xac, 0xf2, 0x61, 0x61, 0xb6, 0xf, + 0x9e, 0x1f, 0x1f, 0x56, 0x38, 0x80, 0xc, 0x1d, + 0xf, 0xf, 0xf, 0xf, 0xf, 0xb6, 0xb7, 0xaa, + 0xc1, 0xc1, 0x1d, 0x1d, 0x91, 0x91, 0x1f, 0xac, + 0x76, 0xac, 0x61, 0xa7, 0xa5, 0x7d, 0x6b, 0xf5, + 0xd8, 0x81, 0xe4, 0x81, 0xb4, 0xb4, 0xb4, 0xe1, + 0xe4, 0xe4, 0xf4, 0xaf, 0xb4, 0xbf, 0xaf, 0xbf, + 0xb4, 0xbf, 0xbf, 0xe1, 0xb4, 0xaf, 0xb0, 0xc6, + 0xe4, 0xb4, 0xf4, 0xe4, 0xf3, 0xbf, 0xbf, 0xf3, + 0xe1, 0xe4, 0xe1, 0x75, 0xbc, 0xe1, 0xb4, 0xc6, + 0xe1, 0xbf, 0xbf, 0x12, 0x95, 0xbf, 0xbf, 0xe4, + 0xbf, 0xbf, 0xb4, 0xe1, 0x74, 0xe1, 0xe4, 0xbd, + 0x81, 0xc6, 0x32, 0x6f, 0xf3, 0x81, 0xc6, 0xde, + 0x57, 0x57, 0xe4, 0xc6, 0xe1, 0xb4, 0xe4, 0xf3, + 0xe4, 0x81, 0xc0, 0x93, 0xc0, 0xe1, 0x81, 0xf3, + 0x7, 0xe1, 0xc0, 0xf3, 0x4b, 0xce, 0xaf, 0xf3, + 0xbf, 0x95, 0xc6, 0xf3, 0xb4, 0xd8, 0x9d, 0x1e, + 0x99, 0xf8, 0xc6, 0xb1, 0x12, 0xc6, 0x4b, 0xdd, + 0x12, 0x95, 0xf7, + 0xbd, 0xd8, 0x5c, 0x4e, 0xa8, 0xab, 0x66, 0x4d, + 0xac, 0x61, 0x5e, 0x24, 0xb3, 0x87, 0xa6, 0xe7, + 0xef, 0x1e, 0x3d, 0x1e, 0xd8, 0x57, 0xba, 0x80, + 0x22, 0xa8, 0x52, 0xab, 0x8c, 0xc3, 0xc3, 0xc7, + 0x3e, 0x91, 0x66, 0x37, 0x61, 0xb6, 0x5f, 0x5f, + 0x92, 0x3f, 0x56, 0x92, 0xdc, 0xc1, 0x92, 0xb6, + 0xf, 0x1d, 0x5f, 0xb6, 0x17, 0x61, 0x61, 0xf2, + 0x37, 0x37, 0x37, 0x4d, 0x37, 0x4d, 0xa, 0xa, + 0xd1, 0xd1, 0x62, 0x78, 0x4d, 0x65, 0xab, 0x29, + 0x67, 0xe, 0x6e, 0xd2, 0x6e, 0xd5, 0xa5, 0x79, + 0xa5, 0x25, 0x77, 0xa5, 0x6e, 0xd5, 0x19, 0xc2, + 0xd5, 0x6b, 0xd5, 0x19, 0xd5, 0xef, 0xd5, 0xe, + 0xa5, 0xa5, 0x42, 0x8c, 0xd3, 0x58, 0x67, 0xd1, + 0x62, 0x6d, 0x29, 0xa, 0x23, 0x23, 0x23, 0xd1, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x16, 0x5, 0x5, + 0x1c, 0x1c, 0x16, 0x23, 0x23, 0x0, 0x23, 0x76, + 0x37, 0x55, 0xb8, 0x7f, 0x48, 0xd, 0xb, 0x3f, + 0xf, 0x17, 0xb6, 0xb6, 0x55, 0x55, 0xb6, 0x17, + 0x1f, 0x17, 0x59, 0x59, 0xc3, 0xad, 0xad, 0xad, + 0xc3, 0x1c, 0x68, 0x68, 0x82, 0x16, 0x87, 0x5, + 0x82, 0xbe, 0x45, 0x45, 0x45, 0x68, 0x5, 0x45, + 0x5, 0x6d, 0xda, 0xe3, 0x29, 0xa, 0x29, 0x62, + 0x23, 0x23, 0x23, 0x16, 0x62, 0x29, 0x1c, 0x68, + 0x8c, 0x67, 0xae, 0xd5, 0xc5, 0x2f, 0xc5, 0x77, + 0x60, 0x2f, 0xd5, 0x8f, 0xd5, 0xd5, 0x4a, 0xe5, + 0xd5, 0xef, 0x8f, 0xd5, 0xe, 0xf1, 0x1b, 0x19, + 0xe, 0xd2, 0xa5, 0x6e, 0x63, 0xd2, 0x79, 0xf1, + 0x1b, 0x79, 0x42, 0xd5, 0xe, 0xf1, 0x58, 0xc3, + 0x8c, 0xb5, 0x8a, 0x8a, 0x1c, 0x62, 0x78, 0xd3, + 0x82, 0x4d, 0xf2, 0x78, 0x76, 0x76, 0x76, 0x61, + 0x94, 0x94, 0x1f, 0xb6, 0xb7, 0x56, 0x3c, 0xc, + 0x5f, 0xf, 0xb6, 0xb7, 0x5f, 0x92, 0x5f, 0x1f, + 0x56, 0x91, 0x92, 0x3f, 0x1d, 0x1d, 0x17, 0xd3, + 0xac, 0x29, 0x78, 0x1c, 0x73, 0x8f, 0xe5, 0x3, + 0x7d, 0x1e, 0xc6, 0xd8, 0x47, 0xdf, 0x90, 0xf5, + 0x97, 0xc0, 0xb4, 0xdf, 0x99, 0xb4, 0xb4, 0xc0, + 0xfd, 0xdf, 0xc6, 0xdd, 0x32, 0xb4, 0xdf, 0x9c, + 0x93, 0x12, 0x12, 0x93, 0x6b, 0x81, 0xf3, 0xfd, + 0x3, 0x90, 0xdf, 0x32, 0xf5, 0xb4, 0x81, 0x99, + 0xf5, 0xbf, 0xc0, 0x93, 0xfd, 0x90, 0xed, 0x4, + 0xfd, 0xe1, 0x81, 0x9c, 0xdd, 0xe4, 0x93, 0x6f, + 0x99, 0xde, 0x97, 0x4, 0x3, 0x8b, 0x6f, 0x6f, + 0xfd, 0xc6, 0xf3, 0x9c, 0xe4, 0xe4, 0xf3, 0x93, + 0x9c, 0x83, 0x47, 0x97, 0xd8, 0x9d, 0x7d, 0x9c, + 0xf3, 0xb4, 0x93, 0x6f, 0x86, 0x12, 0x97, 0x97, + 0xc0, 0x90, 0x6b, 0x97, 0xd8, 0x40, 0x74, 0xef, + 0x99, 0xc4, 0x93, 0x97, 0x4, 0xed, 0x99, 0x4, + 0x93, 0xb4, 0xd8, + 0xd8, 0x1e, 0x51, 0x3f, 0xab, 0x37, 0x76, 0x78, + 0x29, 0x4d, 0xbe, 0x67, 0xe7, 0xe, 0x77, 0x27, + 0x27, 0xd8, 0xbc, 0x53, 0x9d, 0x9d, 0xb, 0x51, + 0x77, 0x4e, 0xab, 0x82, 0x82, 0x30, 0x60, 0x2c, + 0x2c, 0xb6, 0x66, 0x76, 0x55, 0x55, 0x1f, 0x1d, + 0x48, 0x51, 0x3c, 0x56, 0x33, 0x92, 0x5f, 0xf, + 0x1f, 0xb6, 0x17, 0x55, 0xb5, 0x4d, 0xf2, 0x76, + 0x23, 0xf2, 0x76, 0x78, 0xd1, 0x62, 0x5e, 0x76, + 0x78, 0x78, 0xa, 0xd1, 0x6d, 0x8c, 0x87, 0x8a, + 0x58, 0xd2, 0xe, 0x63, 0x63, 0x19, 0x63, 0x1b, + 0xd2, 0x6e, 0x1b, 0xf1, 0x63, 0xd5, 0xd2, 0xd2, + 0x1b, 0x63, 0x6e, 0xd2, 0xe9, 0xd2, 0x63, 0x63, + 0xd2, 0xa5, 0xf1, 0x41, 0xa, 0x62, 0x41, 0xa, + 0xd1, 0x62, 0x62, 0xd1, 0xd1, 0xa, 0xd1, 0xa, + 0x0, 0x23, 0x23, 0x23, 0x23, 0x1c, 0x3b, 0x1c, + 0x29, 0xa, 0xa, 0x23, 0x0, 0xa, 0xa, 0xd1, + 0x37, 0x65, 0xa5, 0x88, 0xb, 0x3f, 0x3c, 0xc, + 0xc, 0xf, 0xb6, 0x17, 0x17, 0xb7, 0xb7, 0x9e, + 0x37, 0x65, 0x60, 0x60, 0x65, 0x87, 0x68, 0x87, + 0x82, 0x82, 0x6d, 0x68, 0x8a, 0x5, 0xa0, 0x45, + 0x5, 0x5, 0x45, 0x5, 0x68, 0xb5, 0x87, 0xda, + 0xb5, 0xe3, 0x6d, 0x5, 0x45, 0x16, 0x3b, 0x16, + 0x16, 0x23, 0x23, 0xa, 0xa, 0x62, 0x62, 0x1c, + 0x5, 0x8, 0x79, 0xd5, 0x6e, 0x63, 0x6e, 0x6e, + 0x67, 0x67, 0x1b, 0xe, 0xd2, 0xd2, 0xd5, 0xd7, + 0xd5, 0x4a, 0x19, 0x19, 0x6e, 0x89, 0x63, 0x19, + 0xa5, 0x67, 0x67, 0x79, 0x6e, 0x79, 0x2f, 0x42, + 0x73, 0x1b, 0x63, 0x4a, 0x63, 0x42, 0x30, 0x58, + 0x8a, 0x1c, 0x41, 0x8c, 0xa, 0xa, 0x62, 0x58, + 0xb3, 0xe3, 0x82, 0xac, 0x4d, 0xa, 0x76, 0x29, + 0xe3, 0x55, 0xb6, 0x17, 0x9e, 0x38, 0x48, 0xc, + 0x92, 0xaa, 0xb7, 0xb6, 0x5f, 0xc, 0x5f, 0xb7, + 0x17, 0x52, 0x92, 0x91, 0x4e, 0xd4, 0x3f, 0x52, + 0xd3, 0x4d, 0x62, 0x1c, 0x8, 0xd5, 0xe5, 0x27, + 0xd5, 0x9c, 0xe4, 0x9c, 0x97, 0x9c, 0xdf, 0x93, + 0x93, 0xe4, 0xe2, 0xf5, 0xf5, 0xe4, 0xbb, 0xdd, + 0x32, 0xdf, 0x12, 0xc0, 0xf3, 0xbf, 0xbf, 0x9c, + 0xf3, 0xaf, 0x95, 0xde, 0x8b, 0xc6, 0xe4, 0xde, + 0x1e, 0xdf, 0xdf, 0xc0, 0xbf, 0xb4, 0xb4, 0xdf, + 0x81, 0xb0, 0xbf, 0xbd, 0xd8, 0xb2, 0xf3, 0x12, + 0xf3, 0x95, 0xbf, 0xf3, 0xc0, 0xb4, 0xb4, 0xbd, + 0xd8, 0x9f, 0x9b, 0x8e, 0x8b, 0x90, 0x9c, 0xc0, + 0xf3, 0xe4, 0xc6, 0xe4, 0xaf, 0xbf, 0xb4, 0xb4, + 0xe1, 0x53, 0x9f, 0xde, 0xc6, 0xe1, 0xf3, 0xe4, + 0xb4, 0xf4, 0xf3, 0x12, 0xe4, 0xe1, 0x26, 0xbd, + 0xe4, 0x57, 0xd8, 0xdd, 0xe4, 0xe1, 0x86, 0xcc, + 0xb1, 0xaf, 0xbf, 0xf3, 0x12, 0xf7, 0xe4, 0xe1, + 0xe4, 0xcc, 0xe1, + 0x27, 0x3, 0x91, 0x1d, 0xa7, 0xb5, 0x6d, 0x6d, + 0x4d, 0x76, 0x78, 0x82, 0x67, 0x2c, 0x91, 0x98, + 0x27, 0x47, 0x18, 0xa9, 0x47, 0x6b, 0x7d, 0x27, + 0xef, 0xa5, 0xab, 0x4d, 0xb5, 0xd3, 0x52, 0x8c, + 0x66, 0x61, 0x61, 0xac, 0xd3, 0xc3, 0xad, 0xc9, + 0x2a, 0xb, 0x2b, 0x5f, 0xf, 0xf, 0x5f, 0xb6, + 0x17, 0x5e, 0x55, 0x65, 0xab, 0xd3, 0x76, 0x23, + 0x76, 0xd1, 0xd1, 0xd1, 0xa, 0x62, 0x62, 0x62, + 0x41, 0x8a, 0x29, 0x8a, 0x30, 0xa0, 0x30, 0x58, + 0x67, 0x67, 0x58, 0x79, 0x63, 0x1b, 0x63, 0x6e, + 0x19, 0xc2, 0x19, 0x89, 0x19, 0x19, 0x63, 0x42, + 0x42, 0x1b, 0x79, 0x2f, 0x79, 0xe9, 0x19, 0x19, + 0x63, 0xd2, 0xf1, 0x58, 0x62, 0x62, 0xd1, 0x23, + 0x0, 0x23, 0x23, 0xa, 0xa, 0xa, 0xa, 0x34, + 0x23, 0x16, 0x6d, 0x16, 0x16, 0x29, 0x29, 0x29, + 0xa, 0x23, 0xd1, 0xd1, 0xd1, 0x29, 0x29, 0x4d, + 0x82, 0x52, 0x5d, 0xa9, 0x80, 0x92, 0xf, 0x5f, + 0xc, 0xb6, 0xb6, 0xb7, 0x17, 0x5f, 0xaa, 0x9e, + 0x65, 0xa7, 0x9e, 0x1d, 0x55, 0x61, 0x82, 0x82, + 0x82, 0xbe, 0x68, 0xa4, 0xa4, 0x45, 0xa0, 0xa0, + 0x45, 0x68, 0xb3, 0x87, 0x6d, 0x29, 0xe3, 0xda, + 0x29, 0x5, 0x45, 0x45, 0x5, 0x45, 0x3b, 0x5, + 0x16, 0x16, 0x16, 0x16, 0x1c, 0x62, 0x1c, 0xda, + 0x41, 0x2f, 0xa5, 0x8f, 0xd5, 0x4a, 0x4a, 0xd5, + 0x6e, 0x63, 0x63, 0xd5, 0x2f, 0x2f, 0x63, 0xd7, + 0x19, 0xd5, 0x4a, 0x4a, 0xd5, 0x4a, 0x6e, 0xef, + 0x6e, 0x89, 0x8, 0x79, 0x1b, 0x79, 0xd2, 0xef, + 0x79, 0x63, 0x6e, 0xd5, 0x6e, 0x63, 0x2f, 0x58, + 0x58, 0x30, 0x58, 0x87, 0xda, 0x62, 0x1c, 0x82, + 0xe3, 0x6d, 0x65, 0x66, 0x61, 0x78, 0xf2, 0xac, + 0x61, 0x66, 0xb6, 0xf, 0x3f, 0x13, 0x8b, 0xea, + 0x2b, 0x92, 0x5f, 0xf, 0xf, 0x5f, 0x5f, 0xf, + 0x1f, 0xb7, 0x38, 0xeb, 0x88, 0xdb, 0x22, 0xb6, + 0x66, 0x37, 0x61, 0xbe, 0x87, 0xd4, 0x8b, 0x83, + 0x90, 0xe1, 0xbf, 0xce, 0xb4, 0xc0, 0xbf, 0xbf, + 0xe1, 0xe1, 0xb4, 0xaf, 0xe1, 0xb4, 0xf4, 0xb4, + 0xbf, 0xbf, 0xbf, 0x44, 0x12, 0xbf, 0xb4, 0xe2, + 0xe1, 0x9a, 0xb4, 0xe1, 0x7, 0x84, 0xb4, 0xb4, + 0xe4, 0xb4, 0xf4, 0xb4, 0x9a, 0xb0, 0xf4, 0x9a, + 0x7, 0xbc, 0x9a, 0xce, 0xe4, 0xbf, 0xaf, 0xbf, + 0xbf, 0xf4, 0xb4, 0xbf, 0x9a, 0x9a, 0x7, 0xb4, + 0xe1, 0x74, 0x4b, 0x81, 0xe4, 0xe4, 0xbf, 0xe4, + 0xb4, 0xb4, 0xb4, 0xe2, 0xbf, 0x7, 0x75, 0xe4, + 0xe1, 0x75, 0xe1, 0xc6, 0xe4, 0xb4, 0x95, 0xf4, + 0xf4, 0x95, 0xe4, 0xbf, 0xb4, 0x9a, 0xbc, 0xc6, + 0xbf, 0xb4, 0xe4, 0xe4, 0x4b, 0xbf, 0xb4, 0xb4, + 0xb4, 0xaf, 0xf4, 0x75, 0xb4, 0xf4, 0x9a, 0xe1, + 0x86, 0xcd, 0xcd, + 0x1e, 0x1e, 0x51, 0x4e, 0xc7, 0x58, 0x87, 0x82, + 0xbe, 0xb5, 0xe3, 0x8c, 0x64, 0x67, 0xa5, 0xe8, + 0x9d, 0x1e, 0x84, 0xc6, 0xce, 0x36, 0x81, 0x9d, + 0x3a, 0x50, 0xd3, 0xac, 0x4d, 0x4d, 0xd3, 0x52, + 0x49, 0x1f, 0x52, 0x66, 0x65, 0x9e, 0x4e, 0x3f, + 0x2b, 0xc, 0x5f, 0x5f, 0xb6, 0x1d, 0xf, 0xb6, + 0x52, 0x66, 0x61, 0x37, 0x4d, 0xf2, 0x76, 0x23, + 0x23, 0xd1, 0x76, 0xa, 0x62, 0x4d, 0x4d, 0xb5, + 0xd3, 0x24, 0x29, 0x67, 0x42, 0xd2, 0xe, 0x1b, + 0x8, 0x42, 0x8, 0x42, 0x19, 0xd5, 0x2f, 0xc5, + 0xd5, 0xd5, 0xd5, 0xd5, 0xd5, 0x11, 0xd5, 0xd5, + 0xa5, 0xa5, 0x79, 0x73, 0xe, 0xd2, 0x6e, 0x19, + 0x79, 0x2f, 0x67, 0x41, 0xa, 0xa, 0xd1, 0x0, + 0x23, 0x23, 0x23, 0x23, 0x23, 0xd1, 0xd1, 0xd1, + 0x76, 0xa, 0x1c, 0x1c, 0x29, 0x4d, 0x6d, 0x6d, + 0xa, 0x76, 0x23, 0x23, 0x76, 0x76, 0xf2, 0xbe, + 0x55, 0x1f, 0x3f, 0xdc, 0x2b, 0x5f, 0x5f, 0xf, + 0xb6, 0xf, 0x5f, 0xf, 0xb7, 0xb7, 0xb6, 0xb6, + 0x17, 0xb6, 0xb6, 0xb6, 0x9e, 0x59, 0x59, 0x59, + 0x45, 0x45, 0xad, 0xbe, 0x82, 0x87, 0x65, 0xc3, + 0x65, 0x55, 0x82, 0xc3, 0x45, 0x45, 0x45, 0x45, + 0x5, 0x5, 0x5, 0x6d, 0x29, 0x16, 0x29, 0x6d, + 0x16, 0x6d, 0xb5, 0xd1, 0xa, 0x29, 0xda, 0xe3, + 0xb5, 0x8c, 0xc7, 0x2c, 0x50, 0x6e, 0x6b, 0x27, + 0xd5, 0xef, 0xd5, 0x6b, 0xd5, 0x63, 0xd5, 0xe5, + 0x77, 0xd5, 0xef, 0x5d, 0xa5, 0x77, 0xc5, 0xef, + 0xef, 0x19, 0x19, 0xd5, 0x19, 0x96, 0x1b, 0x79, + 0x2f, 0x79, 0xa5, 0x2f, 0x2f, 0xd2, 0xe9, 0xe9, + 0x73, 0x1b, 0x1b, 0x1b, 0xf1, 0x8a, 0x1c, 0xa, + 0xa, 0xd1, 0xf2, 0x61, 0xf2, 0x76, 0x61, 0x17, + 0x66, 0x61, 0x17, 0xf, 0x91, 0xb, 0xdc, 0x3c, + 0x5f, 0xc, 0xc, 0x5f, 0xf, 0xb6, 0xb7, 0xc, + 0x5f, 0x33, 0xc9, 0x38, 0x3e, 0x48, 0xb6, 0x52, + 0x5e, 0x76, 0x76, 0x4d, 0x65, 0x59, 0xd4, 0x83, + 0x36, 0xe4, 0xc6, 0x4b, 0xfa, 0xb4, 0xb4, 0xe4, + 0x40, 0xdf, 0xbf, 0xb4, 0xc0, 0xe4, 0xdf, 0xdf, + 0xbf, 0xf4, 0xb4, 0xbf, 0x90, 0xe1, 0xf4, 0xaf, + 0xc6, 0x4b, 0xc6, 0xb4, 0x8d, 0xe2, 0xbf, 0xdf, + 0xe4, 0xb4, 0xbb, 0xb4, 0x18, 0xdb, 0xe1, 0xe4, + 0xe4, 0xc6, 0x4b, 0xaf, 0xbf, 0xb4, 0xbf, 0xdf, + 0xdf, 0x70, 0xb4, 0xe4, 0xe1, 0x74, 0xc6, 0xde, + 0xbd, 0xb4, 0x9c, 0x6b, 0xc0, 0xb4, 0xe1, 0x32, + 0xf5, 0x9f, 0xe1, 0x12, 0xb4, 0xb4, 0xdf, 0xc0, + 0xe4, 0xe4, 0xdd, 0x99, 0x9c, 0xb4, 0xb2, 0x9, + 0xc6, 0x90, 0x90, 0xb4, 0xbf, 0xbf, 0xdf, 0xf5, + 0xe4, 0xf3, 0x32, 0x9c, 0xf5, 0x83, 0x83, 0x3d, + 0xfd, 0xcd, 0xfa, 0x83, 0xdd, 0xbf, 0xaf, 0x26, + 0x99, 0xcc, 0xc0, + 0xe4, 0x86, 0x8b, 0x5c, 0x49, 0xbe, 0xbe, 0x66, + 0x61, 0xbe, 0x49, 0xb8, 0x3e, 0x4f, 0x4f, 0x81, + 0xfa, 0xe1, 0xe1, 0x75, 0x57, 0x9a, 0x7, 0xdb, + 0x91, 0x56, 0x1f, 0x1, 0xe3, 0xb5, 0xc3, 0x4e, + 0x4e, 0x52, 0x55, 0x55, 0x66, 0x17, 0x91, 0x2b, + 0x5f, 0xaa, 0xaa, 0xc, 0x5f, 0x5f, 0xb6, 0x61, + 0x61, 0x61, 0x37, 0xf2, 0x76, 0xf2, 0x76, 0x76, + 0x37, 0xd1, 0xd1, 0x6d, 0x24, 0x4d, 0xe3, 0x6d, + 0xa, 0xbe, 0x8c, 0x67, 0x64, 0xa8, 0xd9, 0xd5, + 0xef, 0xef, 0x1b, 0xc2, 0xef, 0x6e, 0x14, 0xf0, + 0x96, 0xa5, 0x8c, 0xa5, 0x77, 0xfb, 0xa5, 0x63, + 0xd5, 0xd5, 0x1b, 0x1b, 0x63, 0x63, 0x63, 0x79, + 0x2f, 0x8c, 0xa, 0xa, 0xac, 0x76, 0xd1, 0x0, + 0x23, 0x0, 0x23, 0x23, 0x23, 0x0, 0x0, 0x23, + 0x29, 0x76, 0xa, 0x62, 0xd3, 0x4d, 0x37, 0xf2, + 0xf2, 0xd1, 0x0, 0x23, 0xd1, 0xf2, 0x37, 0x37, + 0x52, 0x9e, 0xb8, 0x5c, 0xd0, 0x2b, 0x5f, 0xb7, + 0xf, 0xf, 0x5f, 0xc, 0xb6, 0xf, 0xb6, 0x17, + 0x17, 0x17, 0x55, 0x17, 0x9e, 0x4f, 0x4e, 0xc9, + 0xc3, 0x87, 0x82, 0x55, 0x24, 0x82, 0xbe, 0x6d, + 0x65, 0x68, 0xad, 0x45, 0xa4, 0x5b, 0xa4, 0x45, + 0x5, 0xda, 0xda, 0x16, 0x16, 0x16, 0xda, 0x29, + 0xb5, 0x45, 0x58, 0x29, 0xa, 0x1c, 0x58, 0xd3, + 0x41, 0x5, 0xad, 0xb3, 0x8, 0x1b, 0xd5, 0xa5, + 0x5a, 0x6e, 0xd5, 0xef, 0x8f, 0x19, 0xd5, 0xd5, + 0x19, 0x19, 0xe, 0xf0, 0x67, 0xf0, 0x19, 0x77, + 0x2f, 0xd2, 0x63, 0xa5, 0xe, 0x63, 0x1b, 0x2f, + 0xf1, 0x42, 0x42, 0x42, 0x42, 0x63, 0x19, 0x19, + 0x63, 0x1b, 0x19, 0xe, 0x2f, 0x67, 0x8a, 0x1c, + 0xd1, 0x23, 0xd1, 0xd1, 0x23, 0x34, 0x76, 0x61, + 0xf2, 0x76, 0x66, 0x94, 0x52, 0x2c, 0x48, 0x91, + 0x92, 0x2b, 0x3c, 0xc, 0xf, 0xb7, 0x56, 0x56, + 0x52, 0x9e, 0x9e, 0xa8, 0xa8, 0x2c, 0x49, 0xab, + 0xf2, 0x78, 0xa, 0x78, 0x4d, 0x82, 0x2f, 0xd5, + 0xe5, 0x1e, 0x2e, 0xed, 0x47, 0xdd, 0xbf, 0x97, + 0x4, 0x93, 0xe4, 0x93, 0x32, 0xc0, 0xaf, 0x93, + 0x97, 0xf3, 0xf4, 0x93, 0x86, 0xb4, 0x12, 0x93, + 0x93, 0xc0, 0xc0, 0x93, 0x97, 0xe1, 0xe4, 0x97, + 0xff, 0x57, 0x85, 0x93, 0x32, 0x12, 0xe4, 0x97, + 0x93, 0xe4, 0x12, 0x97, 0xde, 0x57, 0x9d, 0x97, + 0xb1, 0x85, 0xde, 0x97, 0x93, 0xb4, 0xdd, 0x97, + 0x32, 0xde, 0x36, 0xe5, 0x8e, 0xd8, 0x9b, 0x47, + 0x93, 0xe4, 0xde, 0x97, 0xc0, 0xe4, 0x93, 0x4, + 0xf3, 0xdd, 0x47, 0x4, 0x69, 0xd8, 0x3d, 0x6f, + 0xc0, 0xbf, 0x93, 0x93, 0xe4, 0xe4, 0x32, 0x4, + 0xf3, 0xf8, 0x47, 0x4, 0x8e, 0xfd, 0xb9, 0x3, + 0x9c, 0xbd, 0xf3, 0x97, 0x93, 0xb1, 0xcc, 0x93, + 0x93, 0xaf, 0x12, + 0xde, 0x1e, 0x4f, 0xb8, 0x52, 0xd3, 0xac, 0x37, + 0xac, 0xbe, 0x50, 0x2a, 0x27, 0xfb, 0x7d, 0x40, + 0xfd, 0xde, 0xe1, 0x18, 0xa9, 0xc4, 0x75, 0xdb, + 0x91, 0x59, 0xa8, 0xab, 0xd3, 0x82, 0x68, 0xa8, + 0xa8, 0x94, 0xd3, 0xbe, 0x4d, 0xab, 0xb8, 0xdb, + 0x3f, 0x3f, 0x33, 0x91, 0xf, 0xb6, 0x66, 0x55, + 0x37, 0x61, 0xf2, 0x34, 0x23, 0x23, 0x76, 0x78, + 0x76, 0xd1, 0x23, 0xb5, 0x24, 0x5e, 0x6d, 0x6d, + 0x6d, 0xe3, 0x67, 0x67, 0x1, 0x67, 0xae, 0x6e, + 0x19, 0x6e, 0x19, 0x63, 0x4a, 0x19, 0x19, 0x63, + 0x89, 0xf1, 0x67, 0x42, 0x63, 0xe, 0x89, 0x63, + 0x63, 0x19, 0x19, 0x63, 0x6e, 0xf1, 0xf1, 0x8, + 0x1c, 0xb5, 0xa, 0x76, 0xd1, 0xd1, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x29, + 0x6d, 0x6d, 0xda, 0x29, 0x82, 0x37, 0x76, 0xd1, + 0x0, 0x23, 0x23, 0x23, 0xa, 0xf2, 0x4d, 0x82, + 0xb8, 0x7e, 0xe8, 0x27, 0x53, 0x80, 0xc, 0xf, + 0xf, 0xf, 0xf, 0xc, 0xc, 0xf, 0x17, 0x17, + 0x55, 0x55, 0x55, 0x65, 0x59, 0xb8, 0x56, 0x9e, + 0x82, 0xda, 0x4d, 0x82, 0x5, 0x87, 0xda, 0x6d, + 0x45, 0xa0, 0x45, 0xc3, 0x68, 0x5, 0x82, 0x8a, + 0x5, 0x3b, 0x82, 0x82, 0x3b, 0x45, 0x5, 0x3b, + 0x58, 0x5, 0x3b, 0xa, 0xa, 0xd1, 0xa, 0xa, + 0x41, 0xf1, 0xf1, 0xd2, 0x79, 0x63, 0xd2, 0xae, + 0x67, 0x63, 0x63, 0xa5, 0xf1, 0x63, 0x6e, 0xe, + 0x19, 0x6e, 0x4a, 0x63, 0x63, 0x19, 0x4a, 0xd2, + 0x8, 0x42, 0x2, 0xe7, 0x79, 0x63, 0x1b, 0x79, + 0x42, 0x63, 0x63, 0x19, 0x19, 0x19, 0x6e, 0xd2, + 0xf1, 0x63, 0xe9, 0x79, 0x58, 0x67, 0x67, 0x41, + 0x29, 0xa, 0x29, 0x4d, 0xd1, 0x23, 0xd1, 0xd1, + 0xa, 0x76, 0x4d, 0x55, 0xab, 0xa8, 0x7e, 0x51, + 0x48, 0xdc, 0xc1, 0x5f, 0x92, 0xf, 0xb7, 0xb6, + 0xb6, 0x1f, 0xa8, 0x60, 0x2c, 0x60, 0x2f, 0xab, + 0xd3, 0x76, 0x29, 0x16, 0x76, 0xb5, 0x5b, 0xd5, + 0x77, 0x8b, 0xc6, 0xdd, 0x32, 0x95, 0xc6, 0xc0, + 0x97, 0x12, 0x12, 0x93, 0x6f, 0x75, 0xb4, 0x12, + 0xf3, 0xe4, 0xaf, 0x12, 0xf3, 0xaf, 0x95, 0xf3, + 0xf3, 0xbf, 0xbf, 0xc0, 0x1e, 0x74, 0xe1, 0xdd, + 0xe4, 0xe1, 0xb4, 0xf3, 0xc0, 0x95, 0xbf, 0xed, + 0xf3, 0xe4, 0xe1, 0xdd, 0xfd, 0x74, 0x9f, 0xbd, + 0xf3, 0xbf, 0xc6, 0xbd, 0xf3, 0xbf, 0xe4, 0xde, + 0xde, 0x57, 0x9d, 0x47, 0x32, 0x18, 0x8b, 0x32, + 0xaf, 0xcc, 0xe4, 0xdf, 0xe4, 0xbf, 0xbf, 0xc0, + 0x86, 0xd8, 0xc8, 0x47, 0xe4, 0xb4, 0x6b, 0xf5, + 0x95, 0xbf, 0xb4, 0xe4, 0x4b, 0xe4, 0xde, 0xbd, + 0xe4, 0xf9, 0x83, 0xfd, 0xe4, 0xbf, 0xb1, 0xdf, + 0x99, 0xcc, 0xaf, 0xc0, 0xcc, 0xfa, 0xf8, 0xbd, + 0xc6, 0xb0, 0xcd, + 0x9d, 0x3, 0x2a, 0xb8, 0x52, 0x87, 0x87, 0x58, + 0x24, 0x8c, 0xe8, 0x27, 0xe5, 0xe5, 0x32, 0xfd, + 0x3a, 0xfd, 0x81, 0x90, 0x27, 0x36, 0x81, 0x47, + 0x77, 0x67, 0x1, 0xac, 0xac, 0x37, 0x82, 0xab, + 0xd3, 0xd3, 0xbe, 0xac, 0xbe, 0x87, 0xe8, 0x25, + 0x51, 0x80, 0x91, 0xb6, 0x94, 0x52, 0x66, 0x61, + 0x37, 0x76, 0x6d, 0x16, 0x76, 0x23, 0xd1, 0x78, + 0x78, 0x62, 0xa, 0xa, 0x78, 0xe3, 0xd3, 0x67, + 0x58, 0x58, 0x30, 0x1b, 0x89, 0x89, 0x89, 0x19, + 0x63, 0x2f, 0x42, 0x19, 0x6e, 0xd2, 0x63, 0xd5, + 0x19, 0x19, 0x63, 0x63, 0x19, 0x63, 0x1b, 0x63, + 0xa5, 0x67, 0xd2, 0xd2, 0x79, 0x2f, 0xf1, 0x30, + 0x58, 0x58, 0x8a, 0x1c, 0xa, 0x34, 0x23, 0x23, + 0x23, 0xd1, 0xd1, 0x23, 0x23, 0xa, 0x16, 0x5, + 0x45, 0x5, 0x3b, 0x3b, 0x4d, 0x76, 0x23, 0x23, + 0x34, 0x23, 0x23, 0x78, 0x61, 0x66, 0x55, 0x9e, + 0xb8, 0x88, 0x51, 0xdb, 0x80, 0xc, 0x5f, 0x5f, + 0x5f, 0x5f, 0xf, 0x5f, 0xaa, 0x5f, 0xf, 0x17, + 0x17, 0x61, 0x55, 0x61, 0x17, 0x17, 0x17, 0x17, + 0xbe, 0xab, 0xbe, 0x8a, 0x45, 0xa4, 0xa0, 0xa0, + 0xad, 0x68, 0x82, 0x82, 0x82, 0x87, 0xda, 0x16, + 0xda, 0xa4, 0x45, 0x5, 0xa0, 0x45, 0xa0, 0x68, + 0x45, 0x45, 0x3b, 0x16, 0x16, 0x1c, 0xa, 0x62, + 0xa, 0x67, 0x7a, 0x5d, 0xd4, 0xf0, 0x63, 0x6e, + 0x63, 0x19, 0x6e, 0x79, 0x42, 0xd2, 0x4a, 0xe9, + 0x19, 0x19, 0x4a, 0x4a, 0x19, 0x8f, 0xd5, 0x77, + 0xe, 0x63, 0xd2, 0x21, 0x79, 0x19, 0x19, 0xa5, + 0x79, 0x89, 0x63, 0xd5, 0xe, 0x63, 0x1b, 0x73, + 0x2f, 0x79, 0xd5, 0xe, 0x73, 0xf1, 0x2d, 0x8c, + 0x62, 0xd1, 0x29, 0x78, 0xa, 0x62, 0x23, 0x76, + 0x76, 0x78, 0x94, 0x66, 0x61, 0x59, 0x5c, 0xa2, + 0xb, 0xc, 0xaa, 0xb7, 0x5f, 0xc, 0xf, 0xb6, + 0x1f, 0x49, 0x22, 0x88, 0xe8, 0xc9, 0x60, 0x52, + 0xd3, 0x5e, 0x4d, 0x4d, 0xe3, 0x8c, 0x7a, 0x7d, + 0x7d, 0x39, 0xe4, 0xe4, 0x8d, 0xf9, 0xdf, 0xe4, + 0x12, 0xe1, 0xe1, 0x4b, 0x90, 0x75, 0xf4, 0xb4, + 0xe4, 0x4b, 0xbf, 0xbf, 0xbf, 0xf4, 0xbf, 0x4b, + 0xb4, 0x9a, 0x9a, 0xe4, 0xdf, 0xc6, 0xbf, 0xb4, + 0xf4, 0xb4, 0xe4, 0xbf, 0xbf, 0xf4, 0x9a, 0x9, + 0xe1, 0x7, 0x57, 0xe1, 0xb0, 0xdf, 0xe4, 0xbb, + 0xb4, 0xe2, 0xc6, 0x81, 0xe4, 0xe1, 0x57, 0x81, + 0x81, 0xf6, 0x18, 0xd8, 0x81, 0xc6, 0xdf, 0xe4, + 0xbf, 0xf4, 0xbf, 0xc6, 0xe4, 0xbf, 0x9a, 0xb4, + 0x8d, 0xdf, 0x90, 0xe1, 0xb4, 0xbf, 0xed, 0xc6, + 0xbf, 0xf4, 0xbb, 0x75, 0x81, 0xbf, 0x7, 0xc6, + 0xe4, 0x81, 0xed, 0xe4, 0xb4, 0xbf, 0xb4, 0xed, + 0x9c, 0xb4, 0xf4, 0xe4, 0x57, 0xfa, 0xf8, 0xf7, + 0xb0, 0xbf, 0xbf, + 0xdb, 0xd8, 0xf6, 0x3e, 0xb8, 0x59, 0xd4, 0xe8, + 0x60, 0xd4, 0xd4, 0x7f, 0x2a, 0x40, 0xe1, 0x81, + 0x8b, 0xd8, 0xb4, 0xb4, 0xbd, 0xd8, 0x4b, 0x8b, + 0x3e, 0x91, 0x94, 0x37, 0xd1, 0x78, 0xab, 0x67, + 0xab, 0x55, 0x1, 0x64, 0x67, 0xb8, 0x4f, 0x7e, + 0xea, 0xc, 0x5f, 0xb6, 0x17, 0x17, 0x17, 0x61, + 0x5e, 0xf2, 0x61, 0x37, 0xa, 0x29, 0x29, 0x29, + 0xd1, 0x62, 0x29, 0x6d, 0x62, 0x6d, 0x8a, 0x87, + 0xb3, 0x58, 0x1b, 0x19, 0xd5, 0x19, 0xef, 0xd5, + 0x1b, 0x1b, 0x63, 0x4a, 0xd2, 0x42, 0xd5, 0x4a, + 0xd7, 0xef, 0x1b, 0x42, 0x19, 0x5d, 0xa5, 0xd2, + 0x73, 0x89, 0x6e, 0x63, 0x1b, 0x67, 0x24, 0x8a, + 0x41, 0x24, 0x78, 0x62, 0xd1, 0x23, 0x23, 0x34, + 0x0, 0x0, 0x23, 0xa, 0x23, 0x23, 0x16, 0x3b, + 0x3b, 0x8a, 0x37, 0x76, 0x76, 0x23, 0x76, 0x23, + 0x23, 0x23, 0xa, 0x4d, 0x52, 0xb7, 0xb6, 0x1f, + 0xb8, 0x3c, 0xc, 0xc, 0x5f, 0xb7, 0xb6, 0x92, + 0x80, 0xc1, 0x56, 0x56, 0xc1, 0x80, 0xc, 0xf, + 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0x1f, 0x66, 0x55, + 0x65, 0x9e, 0x61, 0xbe, 0x65, 0x65, 0x52, 0x17, + 0x65, 0x65, 0x65, 0x65, 0xc3, 0xad, 0x45, 0x5, + 0xa4, 0x5b, 0x58, 0x87, 0x30, 0x68, 0x58, 0x65, + 0xc3, 0x45, 0x45, 0x3b, 0x5, 0x3b, 0x1c, 0xa, + 0x62, 0x1c, 0xd3, 0xa7, 0xc3, 0x60, 0xa5, 0xe8, + 0xef, 0x8f, 0xd5, 0x8f, 0x4a, 0xd5, 0xc2, 0x79, + 0x42, 0x4a, 0xef, 0xae, 0xd5, 0xef, 0xef, 0xd5, + 0x77, 0xd5, 0x4a, 0x6e, 0x19, 0x4a, 0xef, 0xa5, + 0x5b, 0x1b, 0x6e, 0x5d, 0x21, 0xd2, 0x96, 0xe9, + 0xd2, 0xc2, 0x19, 0xd5, 0x63, 0x1b, 0x8, 0xb5, + 0x29, 0xa, 0xa, 0xd1, 0xd1, 0x76, 0x76, 0x76, + 0xd1, 0x61, 0x52, 0x52, 0x61, 0x52, 0xa8, 0x80, + 0x92, 0xaa, 0xb6, 0xf, 0x5f, 0xaa, 0x92, 0x56, + 0xb6, 0xb7, 0x22, 0x2a, 0xa3, 0x49, 0xb7, 0x66, + 0xac, 0x76, 0x37, 0x78, 0x4d, 0xa8, 0x4f, 0x83, + 0x6f, 0x9c, 0xb4, 0xe4, 0x12, 0xb4, 0xe4, 0xe4, + 0xe4, 0xe1, 0xb4, 0xe4, 0xf3, 0x95, 0xb4, 0xe2, + 0xbf, 0x95, 0xaf, 0xbb, 0xbf, 0xb4, 0xb0, 0xe4, + 0xf3, 0x7, 0xb4, 0xc0, 0x4, 0xc0, 0xbf, 0xb4, + 0xf3, 0xb4, 0x95, 0xbf, 0xbf, 0x9a, 0x7, 0xdd, + 0xe4, 0xb4, 0xc6, 0xbd, 0xdd, 0xdd, 0xe4, 0xde, + 0x9, 0xe1, 0x9f, 0xde, 0xb4, 0xde, 0xfd, 0x4, + 0x6f, 0x4, 0x47, 0xe5, 0x7b, 0xdd, 0xc6, 0xdd, + 0xe4, 0xf4, 0xc6, 0x9d, 0xe4, 0xaf, 0xb4, 0xdd, + 0xe4, 0xe4, 0x32, 0x9c, 0xf5, 0xbd, 0x8e, 0x32, + 0x8d, 0xc6, 0x81, 0x1e, 0xe4, 0xe4, 0x93, 0x32, + 0x12, 0xe4, 0x93, 0x8e, 0xdd, 0xdd, 0xde, 0xde, + 0x9b, 0x84, 0x12, 0xed, 0x26, 0x95, 0xf3, 0x26, + 0xf3, 0xcc, 0xaf, + 0x90, 0xc6, 0x70, 0x51, 0xa8, 0xb8, 0x7e, 0x48, + 0x3c, 0x48, 0xfb, 0x31, 0x8b, 0xe1, 0x8d, 0xf4, + 0xc6, 0x86, 0xbf, 0xb0, 0x7, 0xf6, 0x90, 0x9f, + 0xb, 0x92, 0x1f, 0x61, 0x78, 0x82, 0xa8, 0x22, + 0x8a, 0x37, 0x66, 0x66, 0x66, 0xf, 0xb8, 0x48, + 0x2b, 0x5f, 0x5f, 0x1f, 0x61, 0x17, 0x66, 0x61, + 0x61, 0x78, 0x78, 0x4d, 0x76, 0xa, 0x37, 0xd3, + 0x4d, 0xe3, 0x1, 0x8, 0x41, 0x8a, 0x30, 0x8, + 0x30, 0x8, 0x89, 0xd5, 0xd5, 0xef, 0xe5, 0xef, + 0xd5, 0x19, 0xd5, 0x4a, 0xef, 0x6e, 0xd5, 0xef, + 0x77, 0x1, 0x2f, 0x1b, 0xd5, 0x77, 0x79, 0x63, + 0x63, 0x63, 0x19, 0x6e, 0x2, 0x30, 0xa, 0xa, + 0x62, 0x76, 0xd1, 0xd1, 0xd1, 0xd1, 0x76, 0x23, + 0x23, 0x23, 0x23, 0x16, 0x3b, 0x16, 0x23, 0x1c, + 0x37, 0x78, 0x23, 0x23, 0x0, 0x76, 0x23, 0x76, + 0x4d, 0x76, 0x37, 0x37, 0x1f, 0xb6, 0xb6, 0xf, + 0xf, 0x5f, 0x92, 0xc, 0xd, 0x38, 0x91, 0x3c, + 0xdc, 0xdc, 0x92, 0x5f, 0x92, 0x92, 0x5f, 0x5f, + 0xf, 0xf, 0xb6, 0xf, 0xb6, 0xb6, 0x17, 0x65, + 0xb7, 0x17, 0x37, 0x37, 0x37, 0x37, 0x37, 0x61, + 0xbe, 0xc3, 0x87, 0x9e, 0xad, 0x45, 0xa0, 0x68, + 0x45, 0x5, 0xda, 0x29, 0x82, 0x29, 0x29, 0x4d, + 0x5, 0x45, 0x45, 0x45, 0xa4, 0x45, 0x58, 0x1c, + 0x1c, 0x1c, 0xa, 0x62, 0xb5, 0x1a, 0xd3, 0x8c, + 0x42, 0xe, 0xd2, 0x8f, 0x4a, 0x4a, 0x19, 0x19, + 0x19, 0x19, 0xd5, 0x2f, 0x42, 0x19, 0xc5, 0xa5, + 0xd2, 0x19, 0x63, 0x19, 0x6e, 0x63, 0xd2, 0x2, + 0xf1, 0x63, 0x63, 0x1b, 0x89, 0x63, 0x6e, 0x2f, + 0x79, 0x89, 0x63, 0x19, 0x63, 0xf1, 0x30, 0x6d, + 0x62, 0x62, 0x29, 0xa, 0x29, 0xa, 0xd1, 0x23, + 0x76, 0xf2, 0xe6, 0x61, 0x61, 0xab, 0x55, 0x52, + 0x52, 0x1d, 0x92, 0xaa, 0xb7, 0x56, 0x56, 0x92, + 0x92, 0xb6, 0x1f, 0x1f, 0x52, 0x94, 0xab, 0xbe, + 0x78, 0xa, 0x76, 0x78, 0x76, 0x87, 0x96, 0xd5, + 0xe5, 0x32, 0xd8, 0xca, 0x6f, 0xf3, 0xf3, 0x93, + 0x9c, 0x9c, 0xe4, 0x93, 0x93, 0xce, 0x81, 0x69, + 0x97, 0xbf, 0xbf, 0x93, 0xed, 0xbf, 0xe4, 0x97, + 0x97, 0xdf, 0x81, 0x93, 0x93, 0xf3, 0xc6, 0x1e, + 0xc0, 0xbf, 0x75, 0x97, 0x4, 0xb4, 0xf3, 0x97, + 0x93, 0xe4, 0xf5, 0x6f, 0x93, 0xb4, 0x9d, 0x3, + 0x9c, 0xc6, 0x81, 0x47, 0x32, 0xdf, 0xe5, 0x6c, + 0x6c, 0xd7, 0xd5, 0x6e, 0xe5, 0xd8, 0x9d, 0x3, + 0xdf, 0xdd, 0xdd, 0x4, 0x12, 0xb4, 0xdf, 0x93, + 0xdd, 0xe4, 0xfd, 0xa9, 0x27, 0xbd, 0x6f, 0x3, + 0xdf, 0xdf, 0x93, 0x93, 0xe4, 0xe4, 0x93, 0x99, + 0xe4, 0xf3, 0x8e, 0x3a, 0x8b, 0x9c, 0xf5, 0x97, + 0x32, 0xf7, 0xf8, 0x9c, 0x93, 0xbf, 0x12, 0x97, + 0x9c, 0x90, 0xdd, + 0x9c, 0x36, 0xd8, 0xcb, 0x2c, 0xa8, 0x48, 0xb, + 0x3e, 0xeb, 0x90, 0xd8, 0x47, 0x9c, 0xb4, 0xf3, + 0x69, 0xfd, 0xe1, 0xe1, 0xfd, 0x51, 0xf6, 0x9f, + 0x3e, 0x1d, 0x52, 0x61, 0x62, 0x4d, 0x8c, 0xad, + 0x24, 0xac, 0x29, 0x37, 0x61, 0x52, 0x48, 0x2a, + 0x50, 0x1d, 0x52, 0x52, 0xd3, 0x5e, 0x61, 0x76, + 0x76, 0x76, 0x78, 0x62, 0xac, 0x62, 0x78, 0xa, + 0x78, 0x29, 0x58, 0x8, 0x30, 0x73, 0x42, 0xec, + 0x42, 0x89, 0x63, 0x63, 0xa5, 0xa5, 0x6e, 0x63, + 0xe, 0xe, 0x19, 0x6e, 0x19, 0xd5, 0x63, 0x63, + 0x1b, 0x58, 0x8, 0x89, 0x79, 0x2f, 0x42, 0x6e, + 0x89, 0x63, 0x2, 0x42, 0x79, 0xd3, 0xa, 0xa, + 0xd1, 0xd1, 0x23, 0xd1, 0xd1, 0x23, 0x23, 0x23, + 0x23, 0x0, 0x23, 0xd1, 0x29, 0x29, 0x29, 0xd1, + 0x16, 0xa, 0x23, 0x23, 0x76, 0x23, 0x23, 0xd1, + 0x37, 0x37, 0x66, 0x66, 0x17, 0xb6, 0x17, 0x5f, + 0x92, 0xc1, 0xaa, 0xaa, 0xb, 0xba, 0xdc, 0x3c, + 0x91, 0x2b, 0x5f, 0x5f, 0x5f, 0x56, 0xf, 0x92, + 0xc, 0xaa, 0xb6, 0x17, 0xb6, 0xb6, 0x1f, 0x17, + 0x1f, 0x1f, 0x55, 0x17, 0x65, 0x37, 0xf2, 0x82, + 0x65, 0x65, 0x82, 0x87, 0xa4, 0xad, 0xa6, 0xc3, + 0xb5, 0xda, 0xda, 0x82, 0xda, 0x45, 0x3b, 0x3b, + 0x45, 0xa0, 0x29, 0x1c, 0x3b, 0x5, 0x1c, 0xb5, + 0xe3, 0x41, 0x1c, 0x1c, 0x58, 0x58, 0x41, 0x1c, + 0x8, 0x42, 0x79, 0x79, 0x19, 0x63, 0x63, 0x19, + 0x19, 0x4a, 0x19, 0x1b, 0x63, 0x19, 0xe9, 0x8, + 0x63, 0x19, 0xe, 0xd2, 0x2f, 0xf1, 0x89, 0x1b, + 0x1b, 0x63, 0x63, 0x89, 0x89, 0x19, 0x6e, 0x1b, + 0x8, 0x42, 0x6e, 0xd2, 0x79, 0x2f, 0x58, 0x1c, + 0x5, 0xda, 0x1c, 0x29, 0x16, 0xa, 0xa, 0x23, + 0x0, 0x23, 0x0, 0x76, 0x1a, 0x61, 0x6, 0x65, + 0x52, 0x1d, 0x92, 0x92, 0xb7, 0xb7, 0xb6, 0x5f, + 0x5f, 0xf, 0xb6, 0x52, 0x52, 0x52, 0x52, 0xab, + 0x4d, 0x4d, 0x78, 0x78, 0x29, 0x82, 0x59, 0xef, + 0x47, 0xf5, 0x4b, 0x99, 0x93, 0xdd, 0xbf, 0xaf, + 0x9c, 0xdf, 0xb4, 0x12, 0x12, 0xe1, 0xf6, 0xce, + 0xbf, 0xee, 0xf4, 0x95, 0xdf, 0xbf, 0xbf, 0x12, + 0xf3, 0xf8, 0x2e, 0xde, 0x12, 0xb4, 0x75, 0x90, + 0x12, 0xb4, 0x95, 0xaf, 0xf3, 0xfa, 0xbf, 0xf3, + 0xf3, 0xbf, 0x90, 0xfd, 0xe4, 0xb4, 0x75, 0x40, + 0xdf, 0xe4, 0xe4, 0xdd, 0xf3, 0x71, 0xe5, 0xd7, + 0xd7, 0xd7, 0xc5, 0x7a, 0xef, 0xdd, 0x81, 0xfd, + 0x81, 0xe4, 0xe4, 0xbd, 0xbf, 0xbf, 0xc6, 0xe1, + 0xe1, 0xb4, 0xc4, 0xa9, 0x6b, 0xc6, 0xe4, 0xce, + 0xb4, 0xf8, 0xe4, 0xe4, 0xaf, 0xbb, 0xb4, 0xc4, + 0x7, 0xf4, 0xe4, 0x9f, 0xf6, 0xf3, 0xce, 0xaf, + 0xbf, 0xf4, 0xcc, 0xaf, 0xe4, 0xaf, 0xbb, 0xbf, + 0x81, 0x9f, 0xb0, + 0xfd, 0x3, 0x9f, 0x8b, 0xe8, 0x3e, 0x88, 0xfc, + 0x7c, 0x6b, 0xd8, 0xf3, 0x4, 0x47, 0xd8, 0xde, + 0x47, 0x3a, 0x40, 0x83, 0x3, 0x1e, 0xe1, 0x1e, + 0x4e, 0x8c, 0x66, 0xac, 0x78, 0x4d, 0x4d, 0x62, + 0xd3, 0x5e, 0xe3, 0x5e, 0x82, 0x59, 0x13, 0x27, + 0xe8, 0xa7, 0x52, 0x1, 0x66, 0x61, 0x76, 0x76, + 0x23, 0x29, 0x82, 0x29, 0xa, 0x23, 0xa, 0xd1, + 0xa, 0x1c, 0x41, 0x58, 0x8c, 0x2f, 0xe7, 0x89, + 0x1b, 0x4a, 0x4a, 0x4a, 0x1b, 0x1b, 0x4a, 0x63, + 0xf1, 0xf1, 0x42, 0xd2, 0xf1, 0xa5, 0xd2, 0x1b, + 0x89, 0x63, 0x63, 0x19, 0x63, 0x89, 0x89, 0x63, + 0xd2, 0x2f, 0x2f, 0x58, 0x41, 0x62, 0xa, 0x1c, + 0x62, 0xa, 0xd1, 0x62, 0xd1, 0x23, 0xa, 0xd1, + 0x29, 0x23, 0xa, 0x16, 0x29, 0x29, 0x16, 0xe3, + 0x6d, 0xd1, 0x23, 0xd1, 0x34, 0x76, 0xd1, 0x76, + 0x61, 0x61, 0x66, 0x17, 0xb7, 0x9e, 0x3f, 0x92, + 0x80, 0xb, 0xaa, 0x1d, 0x80, 0x2b, 0xc, 0x5f, + 0xf, 0x92, 0x2b, 0xc, 0x92, 0x33, 0x56, 0x92, + 0x80, 0x91, 0x17, 0xb6, 0xb6, 0x61, 0x17, 0x17, + 0xb6, 0x17, 0x17, 0xf, 0xf, 0x9e, 0xc3, 0x65, + 0x1d, 0x3f, 0xa7, 0x82, 0x65, 0x82, 0xe3, 0x87, + 0x82, 0x5, 0x68, 0x45, 0xad, 0xa4, 0x45, 0x5, + 0x5, 0x68, 0x41, 0x16, 0x8a, 0x1c, 0xa, 0x29, + 0xb5, 0x6d, 0xa, 0x1c, 0x58, 0x87, 0x6, 0x3b, + 0x2f, 0xa5, 0x2f, 0xa5, 0xd5, 0xd5, 0x5d, 0xd2, + 0xd5, 0x4a, 0xd5, 0x8f, 0xd7, 0xd5, 0x4a, 0x19, + 0xe9, 0x77, 0x19, 0x79, 0xf1, 0x1b, 0x73, 0xa5, + 0x19, 0x11, 0x4a, 0x6e, 0x19, 0x63, 0xd2, 0xe9, + 0x7a, 0x77, 0x77, 0xd2, 0xd2, 0x1b, 0x2f, 0x6d, + 0x41, 0x8c, 0x16, 0x8a, 0x62, 0x62, 0xa, 0x76, + 0x23, 0x0, 0xd1, 0xd1, 0xd1, 0x5e, 0x17, 0x65, + 0x52, 0xb7, 0x1d, 0x5f, 0xf, 0xf, 0xb6, 0xf, + 0xc, 0xb6, 0x17, 0x1f, 0x52, 0xb6, 0xf, 0x17, + 0xf2, 0xf2, 0x61, 0x37, 0xbe, 0x87, 0xc9, 0x8b, + 0xc6, 0xce, 0x95, 0xbf, 0xb4, 0x95, 0xbf, 0xbf, + 0xbf, 0xbf, 0x7, 0xe1, 0xb4, 0xb4, 0x85, 0x95, + 0xf4, 0xbf, 0xe2, 0xf4, 0xbf, 0xbf, 0x20, 0xf4, + 0xf4, 0xcd, 0x7, 0x75, 0xb4, 0xf4, 0xb4, 0xf4, + 0xb4, 0xe2, 0xbf, 0xbf, 0xf4, 0xf4, 0x95, 0x9a, + 0x9a, 0xf4, 0xe1, 0xe1, 0xf4, 0xb4, 0xb4, 0xe4, + 0xbf, 0xb4, 0xe4, 0xd8, 0xde, 0x8e, 0x3, 0x5d, + 0xa5, 0x4a, 0x63, 0xe, 0x3, 0x1e, 0xf5, 0x32, + 0xbd, 0xdd, 0xe4, 0xe4, 0x7, 0xbf, 0xbf, 0xe1, + 0xe1, 0xb4, 0xb4, 0xc6, 0xc6, 0xb4, 0xbf, 0x8d, + 0xb4, 0xf4, 0xbb, 0xaf, 0x7, 0xf4, 0xbf, 0xe1, + 0xe1, 0xb4, 0xbf, 0xb4, 0xbf, 0xbf, 0xcc, 0xbf, + 0xcc, 0xb4, 0xb4, 0xcc, 0xb4, 0x7, 0xe4, 0xbf, + 0xb4, 0xb4, 0xcd, + 0x81, 0xd8, 0x81, 0x81, 0xc6, 0xc6, 0xe1, 0xe1, + 0x81, 0xd8, 0x7, 0xb4, 0xd8, 0x51, 0x9f, 0xce, + 0xbf, 0xe1, 0xe1, 0x81, 0x81, 0xce, 0xe1, 0xc6, + 0x51, 0x49, 0x52, 0xac, 0xf2, 0x78, 0x78, 0x78, + 0x76, 0x61, 0x61, 0x82, 0xa4, 0xc9, 0x2a, 0x98, + 0x91, 0x1f, 0x17, 0xac, 0x61, 0x37, 0x37, 0x76, + 0xa, 0x82, 0x52, 0x66, 0xd1, 0x29, 0xe3, 0x62, + 0xb5, 0x58, 0xb3, 0x2f, 0x58, 0x42, 0xc5, 0x42, + 0x2f, 0xd9, 0xef, 0xd5, 0x8f, 0x8f, 0xef, 0x6e, + 0x63, 0x1b, 0xd2, 0xa5, 0x67, 0x2f, 0x19, 0xd5, + 0xe9, 0xd5, 0xd5, 0xe9, 0x6e, 0xa5, 0xf1, 0x67, + 0x79, 0x42, 0x8, 0x58, 0x62, 0xd1, 0x62, 0x78, + 0x76, 0x23, 0xd1, 0xd1, 0xd1, 0x23, 0x23, 0xa, + 0xa, 0x16, 0x16, 0x3b, 0x87, 0x16, 0xda, 0x78, + 0x76, 0x76, 0xd1, 0xd1, 0x76, 0x76, 0xf2, 0x61, + 0x61, 0x78, 0x52, 0x92, 0x3f, 0xd0, 0x80, 0x3c, + 0x2b, 0x80, 0xc, 0xc, 0x5f, 0xc, 0x3c, 0xc, + 0xc1, 0x8b, 0xd, 0x2b, 0x80, 0xb, 0x3c, 0xc, + 0xc, 0xc, 0xc, 0x5f, 0x5f, 0xb7, 0xb6, 0xb7, + 0xb6, 0x17, 0x65, 0xb6, 0xb7, 0xb6, 0xb6, 0xf, + 0xf, 0xf, 0x56, 0x56, 0x9e, 0xc3, 0x45, 0xad, + 0xad, 0xda, 0x6d, 0xa4, 0xc3, 0xda, 0xda, 0x5, + 0x6d, 0x82, 0x45, 0x45, 0x45, 0x45, 0x5, 0x45, + 0x3b, 0x29, 0x29, 0x1c, 0xe3, 0xb5, 0x1c, 0xe3, + 0x1, 0xa8, 0xa6, 0x1b, 0xe5, 0xef, 0xc2, 0x6e, + 0xef, 0xc5, 0x2f, 0xa5, 0xd5, 0xe5, 0xef, 0xd5, + 0xef, 0x6e, 0xd5, 0xd5, 0x4a, 0x19, 0x6e, 0x1b, + 0x1b, 0x79, 0xa5, 0xd5, 0x6e, 0xa5, 0xe9, 0xd5, + 0x8f, 0xe, 0x8f, 0x6e, 0x1b, 0x1b, 0x8, 0xa0, + 0x8a, 0x1c, 0x8c, 0xb5, 0xa, 0x6d, 0x6d, 0xa, + 0x29, 0xb5, 0x6d, 0x78, 0x76, 0x76, 0xf2, 0x37, + 0x61, 0x55, 0x17, 0xb7, 0xb6, 0x5f, 0xf, 0xb6, + 0xb6, 0xf, 0x92, 0x91, 0xa6, 0x94, 0x55, 0x61, + 0x76, 0x78, 0x76, 0x4d, 0xb3, 0x25, 0x90, 0x90, + 0x39, 0xdf, 0xbf, 0xe4, 0xc0, 0x4b, 0x75, 0xd8, + 0x12, 0xbf, 0xe4, 0xf5, 0xc0, 0xb4, 0xe2, 0xbf, + 0xb4, 0xdf, 0xbf, 0xb4, 0x12, 0xbf, 0x57, 0x40, + 0xf3, 0xe4, 0xe4, 0xf3, 0x81, 0xe4, 0xbf, 0xf3, + 0xb4, 0xe4, 0xc6, 0x81, 0xb4, 0xbf, 0xe1, 0x8b, + 0x12, 0xe4, 0xb4, 0xf3, 0xf3, 0xdf, 0xf3, 0x32, + 0x32, 0x8e, 0x47, 0x5d, 0xd5, 0xd7, 0xe, 0x79, + 0x2f, 0x2f, 0xe, 0xd5, 0xd2, 0x6e, 0xd5, 0xd5, + 0x6c, 0x4, 0x6c, 0x27, 0x9d, 0xde, 0xdd, 0x97, + 0x9c, 0x86, 0x97, 0x8e, 0xde, 0xc6, 0xca, 0x99, + 0xce, 0xbf, 0x12, 0x47, 0x39, 0xe4, 0xc0, 0x97, + 0xf3, 0x4b, 0x9c, 0x32, 0xb4, 0x81, 0xbd, 0x26, + 0x6b, 0x40, 0xd8, 0x97, 0x93, 0xdf, 0xed, 0x93, + 0x93, 0xaf, 0xdd, + 0xe4, 0xe4, 0xb4, 0xb4, 0xe1, 0xc6, 0xe1, 0xb4, + 0x84, 0x74, 0x53, 0xc6, 0xe1, 0x84, 0x84, 0x8d, + 0xe1, 0xe4, 0xb4, 0xe4, 0xb0, 0xe1, 0x74, 0x57, + 0x53, 0x91, 0xf, 0x61, 0x6d, 0x62, 0xa, 0x78, + 0x62, 0x76, 0x37, 0x76, 0x82, 0x55, 0xb6, 0x1d, + 0x52, 0x52, 0x55, 0x82, 0x6d, 0x82, 0x37, 0x76, + 0xd1, 0x76, 0xa, 0x4d, 0x78, 0xa, 0x78, 0x78, + 0x58, 0x2f, 0x6e, 0x1b, 0x63, 0xe, 0x6e, 0x63, + 0x67, 0x5b, 0xa6, 0x8c, 0xe9, 0xd5, 0x19, 0xc2, + 0x6e, 0xd5, 0x19, 0x4a, 0x1b, 0x1b, 0x6e, 0xd2, + 0x2f, 0xd2, 0x60, 0x2f, 0x2f, 0xe, 0xd2, 0xd2, + 0x89, 0x42, 0xf1, 0x67, 0x1c, 0xa, 0xd1, 0xd1, + 0xd1, 0xd1, 0x0, 0x23, 0x23, 0xd1, 0xa, 0x29, + 0x4d, 0x3b, 0x45, 0x3b, 0x8a, 0x29, 0xa, 0x23, + 0xd1, 0x76, 0x76, 0xf2, 0x76, 0x61, 0x94, 0xb6, + 0xf, 0x9e, 0x9e, 0xb7, 0xc, 0x2b, 0xc, 0xaa, + 0xf, 0x2b, 0x3c, 0x2b, 0xaa, 0x33, 0x38, 0xd0, + 0xdc, 0xdc, 0xd, 0x56, 0xc, 0xc, 0x2b, 0xc, + 0xf, 0x5f, 0x80, 0x2b, 0x92, 0x33, 0x38, 0xc1, + 0x5f, 0x5f, 0xb6, 0xb7, 0xb6, 0x17, 0x1f, 0x1d, + 0xb6, 0x1f, 0xc9, 0x7e, 0x22, 0xad, 0xad, 0x45, + 0x68, 0x58, 0x82, 0xda, 0x29, 0x16, 0x6d, 0x30, + 0xda, 0x3b, 0x45, 0x5, 0x89, 0xa0, 0x45, 0x5, + 0x45, 0x1c, 0x1c, 0x62, 0x62, 0xa, 0x62, 0x62, + 0xe3, 0xe3, 0xb5, 0xf1, 0xa5, 0x19, 0x4a, 0x4a, + 0x4a, 0x63, 0x63, 0x63, 0x19, 0xa5, 0x2f, 0x6e, + 0x63, 0x63, 0x6e, 0x19, 0x4a, 0x6e, 0x19, 0x19, + 0x1b, 0x8, 0x89, 0x6e, 0x19, 0x63, 0x73, 0xe9, + 0x19, 0x63, 0x63, 0x63, 0x89, 0x2, 0x2f, 0x42, + 0xf1, 0x58, 0xda, 0x8a, 0x1c, 0x62, 0xe3, 0xa, + 0x1c, 0x62, 0x78, 0x76, 0x62, 0x62, 0x76, 0xd3, + 0xd3, 0x37, 0x55, 0xab, 0xa8, 0x1d, 0x92, 0xb6, + 0xb6, 0xb6, 0xf, 0x1d, 0x66, 0x66, 0x66, 0xac, + 0x6d, 0x4d, 0x29, 0x29, 0x2f, 0x27, 0x1e, 0xfd, + 0x6f, 0xdf, 0xe1, 0x1e, 0x4, 0x93, 0xed, 0x93, + 0x4, 0xf3, 0xf3, 0x97, 0x6f, 0xf3, 0xaf, 0x97, + 0x97, 0xc0, 0x81, 0xfd, 0x8e, 0xc0, 0x81, 0x97, + 0x93, 0xc0, 0xbf, 0xf3, 0x93, 0xbf, 0x95, 0x32, + 0x32, 0xf3, 0xdd, 0xfd, 0xc0, 0xbf, 0xc0, 0x93, + 0x97, 0xe4, 0xf3, 0x32, 0x8e, 0xdd, 0xce, 0x47, + 0x3, 0x6c, 0x6c, 0x4a, 0x4a, 0xd5, 0x6e, 0x2f, + 0x24, 0x8c, 0xb3, 0x67, 0x2f, 0x5b, 0x63, 0xe, + 0xe, 0xd7, 0xd7, 0x4, 0x4, 0x32, 0x97, 0x97, + 0xb1, 0x9, 0x2e, 0x4, 0x3a, 0x40, 0xfd, 0x32, + 0xbd, 0xe4, 0x93, 0x93, 0xc0, 0xe4, 0xf3, 0x93, + 0xe4, 0xe4, 0x93, 0x32, 0x40, 0xd8, 0x9f, 0x9c, + 0x93, 0xbd, 0xce, 0x93, 0xf3, 0xaf, 0x12, 0x93, + 0x12, 0xbd, 0xe1, + 0x99, 0x32, 0xde, 0xbd, 0x6f, 0x35, 0x9f, 0xd8, + 0xfd, 0x3, 0x90, 0x90, 0x86, 0xf3, 0xb4, 0xe1, + 0xdf, 0xdf, 0x84, 0x81, 0x8e, 0x9d, 0xa9, 0x27, + 0x3, 0x50, 0x52, 0xab, 0xb5, 0x4d, 0x37, 0x4d, + 0xbe, 0xbe, 0x78, 0x76, 0x4d, 0x4d, 0xb5, 0x37, + 0xab, 0xd3, 0x66, 0xbe, 0x29, 0x87, 0x4d, 0xa, + 0xa, 0x78, 0x16, 0xe3, 0xd3, 0x76, 0x4d, 0x29, + 0x8a, 0xd2, 0x19, 0x63, 0x19, 0xf0, 0x19, 0xd2, + 0x42, 0x1b, 0x30, 0x45, 0xf1, 0x6e, 0x63, 0x1b, + 0x89, 0x63, 0x19, 0x19, 0x19, 0x63, 0x63, 0x79, + 0x79, 0x63, 0xf1, 0x30, 0x58, 0x63, 0x19, 0x19, + 0x89, 0xa0, 0x30, 0x58, 0x1c, 0x1c, 0x62, 0xd1, + 0xd1, 0xd1, 0x23, 0x0, 0x23, 0x34, 0x62, 0x4d, + 0x6d, 0x5, 0x45, 0x58, 0x6d, 0x4d, 0x76, 0x23, + 0x23, 0x23, 0x76, 0x76, 0x76, 0xbe, 0x67, 0x52, + 0x5f, 0x56, 0x1f, 0xb6, 0x92, 0xc, 0x3c, 0x92, + 0x91, 0xd0, 0xba, 0xdc, 0x3c, 0x33, 0x5c, 0xb, + 0x2b, 0x3c, 0x92, 0xaa, 0xaa, 0xc, 0x80, 0xc, + 0x1d, 0x3f, 0xb, 0xdc, 0x3c, 0x5f, 0x56, 0xaa, + 0xc, 0xc, 0x5f, 0xb7, 0xb6, 0x49, 0x2c, 0x48, + 0x92, 0x1d, 0xe8, 0x51, 0x22, 0xa8, 0x68, 0x68, + 0xbe, 0xb5, 0x8a, 0x87, 0xda, 0xda, 0x45, 0x45, + 0x45, 0x16, 0x3b, 0x45, 0x45, 0x45, 0x45, 0x45, + 0x3b, 0x16, 0xda, 0x16, 0x29, 0x6d, 0x62, 0x62, + 0x1c, 0x1c, 0x1c, 0x67, 0x79, 0x63, 0x19, 0xd7, + 0x4a, 0xd5, 0x4a, 0x4a, 0xd7, 0xe, 0xd2, 0xe, + 0x4a, 0xd2, 0xf1, 0x19, 0x4a, 0xd2, 0x2d, 0x19, + 0x19, 0xd2, 0x63, 0x19, 0x19, 0x19, 0x63, 0x79, + 0x19, 0x6e, 0x79, 0x42, 0x63, 0x79, 0x2, 0xd2, + 0x63, 0x89, 0x2, 0x67, 0x5, 0x1c, 0x62, 0x1c, + 0xb5, 0x78, 0x76, 0xd1, 0xd1, 0x78, 0xac, 0xac, + 0xd3, 0x66, 0x66, 0x52, 0xa8, 0x1d, 0x5f, 0xf, + 0xf, 0x17, 0x1d, 0x52, 0x2c, 0x2c, 0x52, 0x61, + 0x4d, 0xb5, 0xb5, 0x8c, 0x73, 0x27, 0x40, 0x9f, + 0xfd, 0xdd, 0xe1, 0x81, 0x12, 0xb4, 0xbf, 0xc0, + 0x93, 0xc0, 0xe4, 0xf3, 0x12, 0xb4, 0xe2, 0xf3, + 0xf3, 0xbf, 0xb4, 0xde, 0x93, 0xbf, 0x95, 0xc0, + 0xf3, 0x95, 0xbf, 0x12, 0xe4, 0xbf, 0xbf, 0xc6, + 0xe1, 0xf4, 0xb4, 0xc0, 0xe4, 0xbb, 0xbf, 0xb4, + 0xe4, 0xb4, 0xb4, 0xd8, 0x40, 0xe1, 0xde, 0x4, + 0x3, 0x4, 0xd7, 0xd7, 0xe, 0xf0, 0x73, 0x5, + 0xb5, 0xb5, 0x82, 0xe3, 0xb5, 0x8, 0x19, 0xc2, + 0xe, 0x19, 0x4a, 0x6c, 0x4, 0xde, 0xf5, 0x9, + 0x84, 0xe1, 0xc6, 0x9f, 0x51, 0x9f, 0x81, 0xc0, + 0xc6, 0x4b, 0xc6, 0xe4, 0xbf, 0xb4, 0xe2, 0xb2, + 0x70, 0x7, 0xbf, 0xe4, 0xf6, 0xd8, 0x9f, 0xc0, + 0xbf, 0xb4, 0xb4, 0xdf, 0xaf, 0xf4, 0x8d, 0xb4, + 0xfa, 0x75, 0x75, + 0x9c, 0x47, 0x9d, 0xfd, 0x4, 0xd7, 0x47, 0x9c, + 0x4, 0x6c, 0xde, 0xdd, 0x93, 0x32, 0xe1, 0xe1, + 0xfd, 0x36, 0xa2, 0xd8, 0x32, 0x4, 0x1e, 0x9b, + 0xd7, 0x77, 0x1, 0xab, 0xbe, 0x55, 0x5e, 0x4d, + 0x6d, 0x37, 0x78, 0x76, 0x8a, 0x82, 0x4d, 0x82, + 0x82, 0x66, 0x61, 0x76, 0x78, 0x4d, 0x76, 0x76, + 0x6d, 0x41, 0xbe, 0x82, 0xbe, 0xe3, 0xe3, 0x58, + 0x30, 0xe9, 0xd2, 0xa5, 0xe, 0x63, 0x79, 0x79, + 0x19, 0x4a, 0x19, 0x1b, 0x19, 0x19, 0x19, 0xf1, + 0x8, 0x63, 0xd2, 0x2f, 0xe9, 0x4a, 0x63, 0x6e, + 0x63, 0x4a, 0x19, 0x63, 0x63, 0x6e, 0x63, 0x79, + 0x8, 0x67, 0x41, 0x62, 0xa, 0x41, 0x67, 0x41, + 0x41, 0x58, 0x8a, 0xa, 0x23, 0x23, 0x0, 0x23, + 0x23, 0x6d, 0x3b, 0x78, 0x29, 0x29, 0x4d, 0xd1, + 0xa, 0x78, 0xbe, 0x37, 0x4d, 0x55, 0x64, 0xf, + 0x5f, 0x5f, 0x5f, 0x92, 0x5f, 0xb, 0xd0, 0x18, + 0xcb, 0xa2, 0xa2, 0x2b, 0x2b, 0x92, 0x3c, 0xc, + 0xc, 0x2b, 0x80, 0xc1, 0x3c, 0xd, 0xd0, 0xa2, + 0x80, 0x2b, 0xdc, 0xc1, 0xc, 0xc, 0x3c, 0x3c, + 0x92, 0xc, 0xc1, 0x48, 0x91, 0x22, 0xeb, 0xeb, + 0x48, 0x80, 0xdc, 0x3c, 0x56, 0xbe, 0x24, 0x87, + 0x82, 0x82, 0x45, 0x45, 0xa0, 0x45, 0x5, 0x45, + 0x5, 0x6d, 0x16, 0x5, 0x3b, 0x16, 0x5, 0x89, + 0x45, 0x1c, 0x3b, 0x68, 0xb5, 0x6d, 0xb5, 0x1c, + 0xe3, 0xe3, 0x29, 0x58, 0x87, 0x2f, 0xa5, 0xef, + 0xef, 0x5d, 0xc2, 0xd7, 0xd7, 0xd7, 0x8f, 0xd7, + 0x8f, 0x1b, 0x5a, 0x19, 0x4a, 0xe7, 0x79, 0xd5, + 0x4a, 0x4a, 0x19, 0x6e, 0xd5, 0x19, 0x5d, 0x19, + 0x63, 0xe, 0x8, 0xd2, 0x4a, 0x1b, 0xe9, 0x6e, + 0x4a, 0x19, 0xd5, 0xc9, 0xa0, 0x67, 0xe3, 0x4d, + 0xe3, 0xd1, 0xd1, 0x76, 0xd1, 0x78, 0x76, 0x61, + 0x61, 0x52, 0xf, 0xf, 0xb6, 0xb6, 0xf, 0x5f, + 0x92, 0x56, 0x17, 0xa8, 0x2a, 0x2a, 0x56, 0x66, + 0x82, 0x82, 0x94, 0x52, 0xa3, 0x5c, 0x88, 0x90, + 0xe4, 0xbb, 0xb4, 0x81, 0x81, 0xb4, 0xe2, 0xbf, + 0x4b, 0x4b, 0xe4, 0xe4, 0xe4, 0xbf, 0xdf, 0xc6, + 0xbf, 0x95, 0xbf, 0xc6, 0xdf, 0xbf, 0xe2, 0xf4, + 0x8d, 0xf9, 0xf8, 0xe1, 0xf4, 0xf4, 0xbb, 0xc6, + 0xe4, 0x95, 0xf4, 0xf4, 0x4b, 0xf8, 0xb4, 0x75, + 0xbc, 0x75, 0x4b, 0x81, 0xd8, 0xfa, 0xdd, 0x7b, + 0x6b, 0xe5, 0x3, 0xa5, 0x8c, 0x1, 0x82, 0x24, + 0xac, 0x82, 0x82, 0x6d, 0xda, 0x73, 0xd2, 0x73, + 0xb3, 0x96, 0x19, 0xd7, 0xe5, 0x9d, 0x39, 0x1e, + 0xf6, 0x75, 0xc6, 0x99, 0xca, 0x81, 0x12, 0xc0, + 0xf8, 0xdf, 0xdf, 0xf3, 0x9a, 0x57, 0xf9, 0xdf, + 0xb4, 0xb4, 0xe2, 0xf3, 0xdf, 0x9c, 0xed, 0xce, + 0xaf, 0xb4, 0xf6, 0x90, 0xe4, 0xb4, 0x75, 0x86, + 0xf8, 0xf7, 0xb4, + 0xde, 0x36, 0x8b, 0x83, 0xe5, 0x4, 0x32, 0x1e, + 0x6b, 0x36, 0x81, 0x85, 0xe4, 0xe1, 0x57, 0x75, + 0x8d, 0x84, 0x75, 0xc6, 0xe4, 0xb4, 0xe1, 0xc6, + 0x8b, 0x4e, 0x52, 0x66, 0x76, 0xac, 0x78, 0x76, + 0x78, 0x61, 0xf2, 0x61, 0x8c, 0xc3, 0x66, 0xd3, + 0x5e, 0x37, 0x78, 0x6d, 0x76, 0x76, 0x76, 0x23, + 0x4d, 0x82, 0xb5, 0xbe, 0xda, 0x82, 0x8c, 0x2f, + 0x79, 0xd5, 0xe9, 0xae, 0x19, 0xd5, 0xa5, 0x2f, + 0x1b, 0xd5, 0x11, 0x19, 0x19, 0x6e, 0xc2, 0x1b, + 0xd2, 0xd5, 0x89, 0x8, 0x42, 0x6e, 0xd5, 0xc5, + 0x6e, 0x19, 0xd7, 0xd7, 0xc5, 0x89, 0x8, 0x41, + 0x6, 0x67, 0x1c, 0x62, 0x1c, 0x2f, 0x79, 0x8c, + 0xb3, 0x68, 0x6d, 0xd1, 0x23, 0x23, 0x16, 0x29, + 0x29, 0xa0, 0x5, 0x1c, 0xd1, 0x29, 0xa, 0xa, + 0x78, 0x55, 0x17, 0xb6, 0xf, 0x5f, 0x1d, 0xb7, + 0x1d, 0x3c, 0xb, 0x80, 0x33, 0x56, 0xeb, 0xba, + 0x2b, 0xc, 0xaa, 0x56, 0x5f, 0x2b, 0x80, 0xc1, + 0x56, 0xc1, 0xba, 0xbc, 0x80, 0x5f, 0x38, 0x80, + 0x3c, 0xc, 0xc, 0x56, 0x92, 0x3c, 0xdc, 0xd0, + 0x33, 0x33, 0xeb, 0x18, 0xdc, 0x3c, 0x33, 0x3f, + 0xc, 0x2b, 0x92, 0x1d, 0x9e, 0x59, 0x2f, 0xe9, + 0x87, 0xda, 0xa4, 0xa4, 0xc3, 0x8a, 0xda, 0x68, + 0x82, 0x82, 0x82, 0xad, 0x45, 0x45, 0x30, 0xf0, + 0xa4, 0x29, 0x29, 0x4d, 0x4d, 0xa, 0x76, 0xa, + 0xa, 0x1c, 0x8c, 0xa5, 0xe9, 0x73, 0x63, 0xd7, + 0xd2, 0x2f, 0x8, 0x6e, 0xc5, 0x77, 0xef, 0x6b, + 0xef, 0xd5, 0xd5, 0x11, 0xef, 0x19, 0x19, 0xd5, + 0xd5, 0x63, 0x77, 0x6e, 0x1b, 0x79, 0x60, 0xe, + 0xc2, 0x1b, 0x63, 0x8f, 0xd7, 0x6e, 0x63, 0x6e, + 0xd2, 0xd2, 0x2f, 0xa8, 0x8, 0x82, 0x4d, 0xe3, + 0x67, 0x62, 0xa, 0x62, 0xd1, 0x62, 0xd1, 0x76, + 0x76, 0x61, 0x17, 0x52, 0x94, 0x17, 0xb6, 0x5f, + 0x1d, 0x1d, 0x59, 0xb8, 0xe8, 0x50, 0x52, 0x61, + 0x78, 0x37, 0x66, 0xab, 0xe9, 0x7d, 0x6f, 0xc4, + 0x7b, 0xb4, 0xbf, 0xdf, 0xc0, 0x8d, 0xbf, 0xe4, + 0xdd, 0xf3, 0xe4, 0xc0, 0x93, 0x12, 0xe4, 0x93, + 0x93, 0xb4, 0xbf, 0xdd, 0x1e, 0xb4, 0xb4, 0xb4, + 0xfd, 0xe4, 0xe4, 0xf3, 0xe4, 0xbb, 0xf4, 0xc0, + 0xf3, 0xcc, 0xb4, 0xde, 0x40, 0xe1, 0xcd, 0xfd, + 0xd8, 0xdd, 0xde, 0x6c, 0x6c, 0x4, 0x6c, 0xd7, + 0xd5, 0x5d, 0x2f, 0x58, 0x41, 0x29, 0x29, 0x1a, + 0x6d, 0x4d, 0x8a, 0xe3, 0x8a, 0x87, 0x30, 0xa4, + 0x58, 0x68, 0x5b, 0x1b, 0x63, 0xd5, 0xd7, 0x6c, + 0x4, 0x9c, 0x4, 0x4, 0x6f, 0x47, 0xe5, 0x4, + 0x32, 0x75, 0xff, 0x93, 0x81, 0xc6, 0xc0, 0x93, + 0xbf, 0xe4, 0x97, 0x4, 0x4, 0x6f, 0xfd, 0x28, + 0xe5, 0x26, 0x9f, 0x47, 0x97, 0xf7, 0xbf, 0xb1, + 0x93, 0xf3, 0xf3, + 0x81, 0xbd, 0x7d, 0x7d, 0xd7, 0x6c, 0x36, 0x8b, + 0x7d, 0x1e, 0x40, 0x75, 0xc6, 0xdf, 0x81, 0xcc, + 0xe4, 0xe4, 0xe1, 0xdf, 0xde, 0xe1, 0x57, 0xba, + 0x7f, 0x4e, 0x49, 0x66, 0x24, 0xe3, 0x4d, 0x78, + 0x76, 0x76, 0x76, 0xa, 0x4d, 0x37, 0x61, 0x66, + 0xac, 0xbe, 0x37, 0xb5, 0x29, 0x29, 0xa, 0xa, + 0x78, 0xe3, 0x6, 0xb5, 0x62, 0x29, 0x1c, 0x8, + 0xc2, 0xd5, 0xe, 0x19, 0xd5, 0xd5, 0x6e, 0x73, + 0x89, 0xe, 0xc5, 0x79, 0x5a, 0x1b, 0x42, 0x2, + 0x6e, 0x8f, 0xd5, 0x1b, 0x19, 0xd5, 0xd2, 0x79, + 0x42, 0x6e, 0x19, 0xa5, 0x50, 0xf1, 0x30, 0x58, + 0x58, 0x2f, 0x8, 0x8a, 0x8a, 0x58, 0x58, 0xac, + 0x78, 0xa, 0x76, 0x23, 0x23, 0x23, 0x16, 0x3b, + 0x45, 0xa4, 0xa0, 0x16, 0x23, 0xd1, 0xd1, 0x23, + 0x76, 0x37, 0x17, 0xb6, 0x1d, 0x5f, 0xb8, 0x4e, + 0x3f, 0x3c, 0xa2, 0xa2, 0x92, 0x92, 0x92, 0x2b, + 0xc, 0x92, 0xaa, 0x3f, 0x3c, 0xc, 0xd0, 0x18, + 0x91, 0x92, 0xdc, 0x2b, 0xc, 0x5f, 0xaa, 0x5f, + 0xc, 0xc, 0xc1, 0x48, 0x48, 0x80, 0xd0, 0xa2, + 0xb, 0x3c, 0x3c, 0xea, 0x2b, 0x91, 0x91, 0x91, + 0x22, 0x91, 0x91, 0x7f, 0x48, 0x60, 0xa5, 0xad, + 0x5, 0x37, 0x16, 0x16, 0x6d, 0x6d, 0x29, 0x5, + 0x82, 0x3b, 0x45, 0x45, 0x45, 0x45, 0x5, 0x45, + 0x58, 0x29, 0x1c, 0x3b, 0x29, 0xa, 0xa, 0x29, + 0x1c, 0x41, 0x58, 0x2f, 0x2f, 0x2d, 0x19, 0x8f, + 0x19, 0x63, 0x63, 0x8f, 0xe7, 0x30, 0xae, 0xd5, + 0xd2, 0x79, 0xe, 0xd5, 0x6e, 0x6e, 0xd2, 0xe9, + 0x63, 0x63, 0xd2, 0x19, 0xd2, 0x58, 0x30, 0x89, + 0x63, 0x63, 0x6e, 0x19, 0x19, 0x63, 0x63, 0x6e, + 0x4a, 0x63, 0x89, 0x1b, 0x42, 0x41, 0xa, 0x1c, + 0x41, 0x1c, 0xa, 0x62, 0xd1, 0x76, 0x76, 0xd1, + 0x78, 0x76, 0x76, 0xd3, 0xab, 0x49, 0x52, 0xb6, + 0x52, 0x1d, 0x1d, 0x1d, 0x52, 0x49, 0x94, 0xe3, + 0xb5, 0x6d, 0x29, 0x87, 0x1b, 0xd7, 0x1e, 0x47, + 0x6b, 0xf5, 0xe4, 0xde, 0x47, 0xdd, 0xdf, 0xed, + 0x4, 0xf3, 0xf3, 0x93, 0x6f, 0x93, 0xc0, 0x93, + 0x47, 0x1e, 0xc0, 0xf3, 0xfd, 0xe4, 0xe4, 0xc0, + 0x69, 0xe2, 0xb4, 0x12, 0xdd, 0xbf, 0x95, 0x32, + 0x9d, 0x9f, 0xc6, 0xf5, 0xfd, 0xe4, 0xe4, 0x93, + 0x6f, 0xf3, 0x8e, 0x4, 0xef, 0x77, 0xd5, 0xe, + 0x5d, 0x1, 0x2f, 0x30, 0x58, 0xd3, 0x58, 0x41, + 0x6d, 0x29, 0x4d, 0xa, 0xa, 0x4d, 0x29, 0xe3, + 0xb5, 0x41, 0xa4, 0x5b, 0xf0, 0x19, 0xd7, 0x6c, + 0xd7, 0x7d, 0xe5, 0x6c, 0x4, 0xa9, 0xd9, 0x7d, + 0x86, 0xdd, 0xf3, 0xf5, 0x9c, 0xc6, 0x93, 0x93, + 0xc0, 0x4b, 0x83, 0x97, 0x26, 0x3a, 0x3, 0x27, + 0x6a, 0xed, 0xce, 0x93, 0xf3, 0xc6, 0xc4, 0x32, + 0x93, 0xbb, 0xe1, + 0x6f, 0x6c, 0xd5, 0x4a, 0x4a, 0xd7, 0x77, 0x5d, + 0x4a, 0xd7, 0x6f, 0x36, 0x6f, 0x4, 0xf3, 0xe4, + 0x32, 0xff, 0xde, 0x9d, 0xfd, 0x97, 0x9f, 0x51, + 0xfb, 0xe8, 0x2c, 0xab, 0x82, 0x82, 0xb5, 0x62, + 0x62, 0xd1, 0x78, 0x76, 0x4d, 0x78, 0x78, 0x37, + 0x78, 0x78, 0x78, 0x82, 0x58, 0x58, 0x29, 0xa, + 0xa, 0xa, 0x78, 0xb5, 0x62, 0x1c, 0x8a, 0xf1, + 0x63, 0x1b, 0x6e, 0x63, 0x19, 0x19, 0x63, 0x63, + 0x79, 0xd2, 0x2f, 0x2f, 0x1b, 0x63, 0xf1, 0xf1, + 0x1b, 0x4a, 0xd5, 0x63, 0x63, 0x6e, 0x63, 0x79, + 0xf1, 0xe, 0x4a, 0x79, 0x89, 0xf1, 0x8, 0x8a, + 0x8a, 0x5, 0x30, 0x67, 0x1c, 0xb5, 0x29, 0x78, + 0x62, 0x78, 0x23, 0x23, 0xd1, 0xa, 0x16, 0x3b, + 0x8a, 0x3b, 0x87, 0x29, 0x29, 0xa, 0x76, 0x76, + 0x37, 0x66, 0xa8, 0xa7, 0x1f, 0x1d, 0x2c, 0x3e, + 0x91, 0x92, 0x3c, 0x2b, 0x2b, 0xc, 0xc, 0xaa, + 0xaa, 0xc, 0x80, 0xd0, 0xc1, 0xc, 0xb, 0xea, + 0x80, 0xc, 0x3c, 0xc, 0x92, 0x3c, 0x92, 0xaa, + 0xc1, 0x92, 0xb, 0xd0, 0xa2, 0x80, 0xd, 0xea, + 0x2b, 0x2b, 0xc, 0x1d, 0xdc, 0x22, 0x3e, 0x8b, + 0x18, 0x4e, 0x4e, 0x51, 0xdb, 0x50, 0xa7, 0xb3, + 0xe3, 0xac, 0xbe, 0x3b, 0x45, 0x3b, 0x5, 0x45, + 0xda, 0x16, 0x5, 0x3b, 0xda, 0xb5, 0x82, 0x82, + 0x8a, 0xda, 0x8a, 0x68, 0x45, 0x3b, 0x3b, 0x1c, + 0xe3, 0xd3, 0xa, 0x62, 0x58, 0x67, 0xe, 0x19, + 0xd5, 0x4a, 0x4a, 0xef, 0x6e, 0x73, 0x1b, 0x6e, + 0x2f, 0x67, 0x2f, 0xa5, 0xf1, 0xf1, 0xd2, 0xd2, + 0x19, 0xd5, 0x4a, 0xd5, 0x6e, 0x42, 0xa0, 0x73, + 0x42, 0x2f, 0x67, 0xa5, 0xe, 0xd5, 0x19, 0x63, + 0x19, 0x1b, 0x1b, 0x6e, 0x1b, 0x30, 0x8a, 0x30, + 0xb5, 0x62, 0x1c, 0xa, 0xa, 0xa, 0xa, 0x78, + 0xac, 0x78, 0x78, 0xd3, 0x1, 0x52, 0xf, 0xb6, + 0x94, 0xb6, 0x5f, 0x92, 0x1d, 0x52, 0xc3, 0xab, + 0xd3, 0x24, 0xe3, 0xa4, 0x96, 0x3, 0x36, 0xd8, + 0x27, 0xf5, 0xe4, 0xe4, 0xbd, 0xc6, 0xdf, 0xf3, + 0xf3, 0xb4, 0xe4, 0xdf, 0x9c, 0x12, 0x9, 0x70, + 0x9b, 0x99, 0xc6, 0x95, 0xc0, 0xbb, 0x4b, 0xdf, + 0xe4, 0xc0, 0xf4, 0x95, 0xfa, 0x57, 0xf4, 0xb4, + 0xbd, 0x81, 0x81, 0xbf, 0xbf, 0xf4, 0xb4, 0xdf, + 0xdd, 0x81, 0xde, 0x6c, 0x5d, 0xa5, 0xa5, 0xa5, + 0x2f, 0x1, 0x58, 0xb3, 0xb3, 0x1, 0x2f, 0x87, + 0xb5, 0xe3, 0xac, 0x76, 0x29, 0x62, 0x62, 0x62, + 0x4d, 0x82, 0x87, 0xa0, 0x73, 0x6e, 0x6e, 0x4a, + 0xef, 0x7c, 0x9d, 0xfd, 0xd8, 0x9f, 0x7d, 0x7d, + 0xc4, 0xf4, 0xb4, 0xe2, 0xf9, 0xe4, 0xb4, 0x95, + 0xf4, 0x75, 0x40, 0xc6, 0xbf, 0x8d, 0xf7, 0xdf, + 0xca, 0xed, 0xaf, 0xbf, 0xbf, 0xf7, 0xf8, 0x85, + 0x9a, 0xbf, 0xb0, + 0xef, 0xd7, 0x77, 0x50, 0xe9, 0x1b, 0x1b, 0x19, + 0xd7, 0x6c, 0x6f, 0xfd, 0x4, 0x4, 0xbd, 0x75, + 0x9b, 0x97, 0xe1, 0x81, 0x47, 0x47, 0x90, 0x83, + 0x3, 0x5d, 0x52, 0x66, 0x61, 0x78, 0xac, 0x4d, + 0x76, 0xa, 0x62, 0x78, 0x78, 0x62, 0xac, 0xd1, + 0xd1, 0x76, 0xa, 0x29, 0x29, 0x37, 0x78, 0x6d, + 0xe3, 0x62, 0x29, 0x5, 0xa0, 0xa0, 0x73, 0x1b, + 0x63, 0xd2, 0x2f, 0xa5, 0xd2, 0xa5, 0x6e, 0x6e, + 0xd2, 0x1b, 0x89, 0x89, 0x63, 0x63, 0xf1, 0x30, + 0x73, 0xd2, 0xa5, 0xd2, 0x79, 0xa5, 0x42, 0x63, + 0x63, 0x4a, 0x19, 0x1b, 0xf1, 0xf1, 0x41, 0xa, + 0xa, 0xd1, 0x41, 0x62, 0xd3, 0x78, 0x29, 0xa, + 0x62, 0xa, 0xd1, 0x23, 0x23, 0x16, 0x29, 0x6d, + 0x6d, 0xbe, 0x78, 0x76, 0x76, 0x76, 0x76, 0x6d, + 0x65, 0x1d, 0x91, 0xb8, 0x1f, 0x1d, 0xf, 0x91, + 0xc, 0x92, 0x56, 0xc1, 0x80, 0x3c, 0x3c, 0x33, + 0x3f, 0x92, 0x2b, 0xea, 0x92, 0xaa, 0x5f, 0xc, + 0x2b, 0xc, 0xaa, 0x33, 0xd, 0x2b, 0x80, 0x38, + 0x33, 0x56, 0x3c, 0x2b, 0x2b, 0x92, 0x56, 0xc1, + 0xdc, 0xdc, 0x80, 0x5c, 0x5c, 0x40, 0x74, 0xf6, + 0xd0, 0xa8, 0x91, 0x2b, 0x91, 0x1d, 0x94, 0x4d, + 0x4d, 0xe3, 0x82, 0xda, 0x45, 0x45, 0x5, 0xb3, + 0x65, 0x29, 0xda, 0xbe, 0x6d, 0x82, 0x87, 0xb3, + 0x82, 0xa4, 0xa0, 0xa0, 0x45, 0x45, 0x45, 0x8c, + 0xb5, 0x1c, 0x62, 0x41, 0xd3, 0x41, 0x2f, 0x7a, + 0xa5, 0x77, 0xd7, 0x6b, 0xef, 0xd5, 0xef, 0xef, + 0xc2, 0x89, 0x63, 0xf0, 0x2f, 0x67, 0xe9, 0xd5, + 0x19, 0xd5, 0xef, 0xe5, 0xef, 0x6e, 0xf0, 0x60, + 0xe7, 0x73, 0x73, 0x96, 0xe, 0xc2, 0xd5, 0xd5, + 0xd5, 0xd2, 0x6e, 0x4a, 0x63, 0x6e, 0x42, 0xa8, + 0x82, 0x62, 0x76, 0xd1, 0xd1, 0xa, 0xac, 0xac, + 0x61, 0x76, 0x37, 0x66, 0x52, 0xf, 0x5f, 0xf, + 0x1d, 0xa6, 0xb8, 0x38, 0x22, 0x3f, 0x52, 0x66, + 0x61, 0xac, 0x24, 0xab, 0x49, 0x2a, 0x75, 0xc6, + 0xed, 0xc6, 0xbf, 0xb4, 0xf4, 0xbf, 0x95, 0xaf, + 0x8d, 0xbb, 0xb4, 0xbf, 0xe1, 0xb4, 0xf4, 0xbf, + 0xb4, 0xe4, 0xb4, 0xe2, 0xe4, 0xbf, 0xf4, 0xbf, + 0x9a, 0x7, 0xf4, 0xf4, 0x85, 0xe1, 0x8d, 0xbf, + 0xbf, 0x95, 0xb4, 0xaf, 0xf4, 0xf4, 0xb4, 0xdd, + 0xde, 0xcf, 0x9d, 0xe5, 0x4a, 0xe, 0x73, 0xb3, + 0x30, 0xa7, 0xbe, 0x82, 0x82, 0x52, 0xab, 0x8c, + 0x87, 0x94, 0x82, 0x58, 0x5, 0xda, 0x1c, 0x16, + 0x29, 0x78, 0x4d, 0xb5, 0x8c, 0x1, 0x2f, 0xe, + 0x6b, 0x6b, 0x83, 0x90, 0xed, 0x81, 0x81, 0xf3, + 0xb4, 0xee, 0xbf, 0x12, 0xe4, 0xbf, 0x75, 0xe1, + 0xbf, 0xf4, 0xe4, 0xf3, 0x81, 0xaf, 0xe4, 0xb1, + 0xf3, 0xaf, 0x9a, 0x57, 0xb0, 0xaf, 0x8d, 0xc6, + 0x86, 0xbb, 0xbf, + 0xd5, 0x47, 0x3, 0xe9, 0xd4, 0x5b, 0x96, 0xef, + 0xd5, 0x6c, 0x6b, 0x6b, 0x47, 0xde, 0xe1, 0xe1, + 0x83, 0xbd, 0xe4, 0xb0, 0xbf, 0xd8, 0x83, 0x81, + 0x53, 0x48, 0x49, 0xa7, 0x4d, 0x76, 0xac, 0xd3, + 0xac, 0x61, 0x37, 0x37, 0xb5, 0x78, 0xa, 0x29, + 0xd1, 0xa, 0x16, 0xe3, 0x76, 0x78, 0x4d, 0x82, + 0xac, 0x76, 0x8a, 0x42, 0xd2, 0xd5, 0x19, 0x63, + 0x4a, 0xc5, 0xf1, 0x1b, 0x42, 0x2f, 0x2f, 0x19, + 0xd5, 0x6e, 0xe7, 0x63, 0x63, 0xe9, 0xd5, 0x1b, + 0x42, 0x42, 0xf1, 0x79, 0x6e, 0xc9, 0x67, 0x1b, + 0xef, 0xd5, 0x6e, 0x1b, 0x8, 0x8c, 0xd1, 0x62, + 0x1c, 0x1c, 0x8a, 0x8a, 0x8a, 0x37, 0xd1, 0xa, + 0x78, 0xa, 0x23, 0x23, 0x29, 0x16, 0x29, 0x3b, + 0x6d, 0x82, 0x29, 0xd1, 0x23, 0x23, 0x23, 0x78, + 0x55, 0xf, 0x92, 0x92, 0x1d, 0x5f, 0xaa, 0x3c, + 0x80, 0xc, 0xc1, 0xeb, 0xd0, 0x2b, 0x2b, 0x3c, + 0xaa, 0x5f, 0xc, 0xc, 0xc, 0x5f, 0x92, 0xc1, + 0xc1, 0x2b, 0x3c, 0x48, 0x48, 0x3c, 0x3c, 0x2b, + 0xaa, 0x5f, 0x5f, 0x3c, 0x3c, 0xd, 0xd0, 0x88, + 0x57, 0xcb, 0xa2, 0xcb, 0x75, 0xbc, 0xba, 0xea, + 0x80, 0x3c, 0x92, 0x3c, 0x22, 0x4e, 0x8c, 0x66, + 0xa, 0x16, 0xd1, 0x4d, 0x37, 0x6d, 0x65, 0x6d, + 0x82, 0xda, 0x16, 0x87, 0x45, 0x45, 0x45, 0x5, + 0x5, 0x5, 0x45, 0x24, 0x82, 0x87, 0x66, 0x55, + 0x24, 0xb5, 0x58, 0x1c, 0xe3, 0x8a, 0xf1, 0x42, + 0x42, 0xd2, 0xef, 0xc5, 0x50, 0xc5, 0xd5, 0x43, + 0xef, 0x8f, 0xd7, 0xe5, 0x63, 0x1b, 0x19, 0xd5, + 0xe9, 0xd2, 0xd5, 0x5d, 0xa5, 0xe9, 0x6e, 0xe9, + 0x96, 0x6e, 0xd5, 0x4a, 0x19, 0x19, 0xa5, 0xc9, + 0x2f, 0x8, 0x63, 0xe9, 0xe, 0x63, 0x8f, 0xe, + 0xa6, 0x1c, 0x62, 0xd1, 0xa, 0x62, 0x78, 0x76, + 0xd1, 0xd1, 0xf2, 0x61, 0x61, 0x94, 0xa8, 0x91, + 0x52, 0xb8, 0xd4, 0x7e, 0x91, 0x49, 0x66, 0x5e, + 0x78, 0x78, 0xa, 0xb5, 0xc3, 0xd4, 0x39, 0xf5, + 0xde, 0xf3, 0xb4, 0xf8, 0xf5, 0xbf, 0xbf, 0xb4, + 0x83, 0xd8, 0x95, 0xb4, 0xc0, 0xe4, 0x4b, 0x81, + 0xf3, 0x95, 0xbf, 0xbd, 0x90, 0x9f, 0xb4, 0xdd, + 0xde, 0xc6, 0xc6, 0xc6, 0xdd, 0xb4, 0xb4, 0xdd, + 0xc0, 0xe1, 0xb4, 0xde, 0x81, 0x53, 0xfd, 0x4, + 0x6c, 0xe5, 0xd5, 0xd5, 0x4a, 0x5d, 0x2f, 0x30, + 0xb3, 0xe3, 0xd3, 0xe3, 0xe3, 0x6d, 0x6d, 0x8c, + 0x2, 0xb3, 0xb5, 0x58, 0x30, 0x67, 0x8c, 0x8c, + 0xb5, 0xb5, 0x6d, 0xb5, 0x87, 0x8c, 0x24, 0x2f, + 0x6e, 0xe5, 0xe5, 0x7d, 0x7d, 0x1e, 0x9d, 0x3, + 0x99, 0x99, 0xca, 0x97, 0x12, 0xe4, 0x9c, 0x9c, + 0xf3, 0xe4, 0x93, 0x6f, 0x99, 0x99, 0xca, 0x3, + 0x47, 0x93, 0x4b, 0xca, 0x86, 0xbf, 0xc0, 0x32, + 0x9c, 0xdf, 0xcc, + 0x54, 0xe5, 0x27, 0x4f, 0x59, 0xa6, 0xc9, 0x60, + 0x50, 0xc5, 0x47, 0x47, 0x3, 0x32, 0x81, 0xe4, + 0xbd, 0xdd, 0xb4, 0x84, 0x81, 0xce, 0xe1, 0x9d, + 0x48, 0x91, 0x3f, 0x52, 0xd3, 0x4d, 0xda, 0x82, + 0x66, 0x4d, 0x76, 0xf2, 0x76, 0x76, 0x78, 0xda, + 0x78, 0xd1, 0x1c, 0x30, 0x5, 0x29, 0x29, 0x1c, + 0xb5, 0x6d, 0x41, 0x2f, 0x2f, 0xa5, 0xe9, 0xd5, + 0xd2, 0x6e, 0x1b, 0x2, 0x19, 0x42, 0xf1, 0x1b, + 0x63, 0x60, 0x2f, 0x79, 0xa5, 0x2f, 0x77, 0xd2, + 0x19, 0x8f, 0x1b, 0x63, 0x6e, 0xd5, 0xf0, 0xf1, + 0x89, 0xd2, 0x2, 0x79, 0xb3, 0xe3, 0x6d, 0x8a, + 0x8, 0x8, 0xa0, 0x45, 0x3b, 0x29, 0x23, 0x23, + 0xd1, 0x76, 0xd1, 0x0, 0x29, 0x29, 0xda, 0x45, + 0x45, 0x5, 0x1c, 0x16, 0x23, 0x23, 0x23, 0xd1, + 0x37, 0x55, 0x17, 0x91, 0x3f, 0x3c, 0x92, 0x38, + 0x5c, 0x80, 0x2b, 0x80, 0xc1, 0xb6, 0x92, 0xc, + 0xc, 0x5f, 0xb6, 0xaa, 0xd, 0xdc, 0x2b, 0xd, + 0xd, 0x3c, 0x80, 0x2b, 0x2b, 0x5f, 0x5f, 0x5f, + 0x3c, 0x5f, 0xb7, 0x33, 0x5c, 0xcb, 0x57, 0x7, + 0x57, 0xcb, 0xba, 0xba, 0xbc, 0x74, 0xb, 0x80, + 0xb, 0x48, 0x22, 0x33, 0xc9, 0x60, 0x1, 0xe3, + 0x78, 0x62, 0x29, 0x76, 0xa, 0x3b, 0x6d, 0xbe, + 0x29, 0x45, 0x45, 0x5, 0x45, 0x5, 0x45, 0x68, + 0x5, 0x5, 0x82, 0x82, 0x29, 0x3b, 0x29, 0x29, + 0x4d, 0x62, 0x41, 0x1c, 0xb5, 0x8a, 0x89, 0x4a, + 0x19, 0x4a, 0x19, 0xa5, 0x73, 0x42, 0x19, 0xe7, + 0xa5, 0x42, 0xd5, 0xd5, 0x6e, 0x4a, 0xd2, 0x63, + 0x63, 0x6e, 0x1b, 0x1b, 0x73, 0xf1, 0x63, 0x1b, + 0xf1, 0x1b, 0xd5, 0x4a, 0xe, 0x63, 0x89, 0x8, + 0x30, 0x89, 0x63, 0x63, 0x89, 0x6e, 0x19, 0x63, + 0xf1, 0x58, 0x1c, 0x29, 0x23, 0xa, 0xa, 0xa, + 0x23, 0x23, 0xa, 0xd1, 0x76, 0x4d, 0x67, 0x2f, + 0x1, 0xa8, 0x9e, 0x59, 0x52, 0x52, 0x52, 0xbe, + 0x76, 0x78, 0x76, 0x1c, 0xda, 0xc3, 0xd9, 0x6f, + 0x4, 0xfd, 0x81, 0x9c, 0x4, 0xce, 0x95, 0x93, + 0x9c, 0xf5, 0xbf, 0x93, 0x93, 0xf3, 0xed, 0x97, + 0x47, 0xd8, 0x7, 0xc4, 0x9c, 0xd8, 0xe4, 0x93, + 0x32, 0xdd, 0xc6, 0x93, 0xbd, 0xde, 0xc6, 0x93, + 0xfd, 0xcf, 0x75, 0xdd, 0x97, 0x9c, 0x4, 0x6c, + 0xd7, 0x4a, 0x1b, 0x42, 0x2f, 0x8c, 0xd3, 0x6d, + 0x82, 0x24, 0x24, 0x68, 0x30, 0x5, 0x5, 0x30, + 0x89, 0x2f, 0xe3, 0x82, 0x87, 0xab, 0x52, 0xab, + 0x87, 0x65, 0xa7, 0xa6, 0x73, 0xad, 0x8c, 0xa0, + 0x6e, 0x6b, 0x8f, 0xef, 0x6b, 0x40, 0x2a, 0x27, + 0x9c, 0xc0, 0x93, 0x93, 0xc0, 0xbf, 0x93, 0xf3, + 0xbf, 0xbf, 0xde, 0x9d, 0x1e, 0xf5, 0x1e, 0x9d, + 0x9b, 0xcd, 0xaf, 0x93, 0x12, 0xbf, 0xc0, 0x12, + 0xf3, 0xc0, 0xaf, + 0xd7, 0xef, 0x96, 0xa6, 0x58, 0x82, 0x2f, 0x67, + 0xb3, 0xd2, 0x4a, 0xd7, 0x6c, 0xe5, 0x9c, 0xf5, + 0x4, 0xb1, 0xc6, 0x90, 0x3, 0x3, 0xc6, 0x9d, + 0x4e, 0x22, 0x3e, 0x2c, 0xab, 0xb5, 0x58, 0xe3, + 0xd3, 0xac, 0x76, 0x76, 0xd1, 0xd1, 0xa, 0xb5, + 0x62, 0x62, 0x29, 0x8, 0xf1, 0x67, 0x8a, 0x8a, + 0x6d, 0x78, 0x58, 0x8, 0x30, 0x67, 0x63, 0x19, + 0x19, 0x42, 0x5b, 0x63, 0x19, 0x63, 0x19, 0x63, + 0x63, 0xf1, 0x89, 0x19, 0xf1, 0x2f, 0x2f, 0x1b, + 0x63, 0x19, 0x63, 0x63, 0x6e, 0x63, 0x79, 0x89, + 0x42, 0xf1, 0x42, 0x63, 0x67, 0x1c, 0xa, 0x41, + 0xf1, 0x79, 0xf1, 0x45, 0x1c, 0xa, 0x23, 0x23, + 0x23, 0x23, 0x62, 0x29, 0x1c, 0x16, 0xda, 0x45, + 0xa0, 0x58, 0x29, 0x29, 0xa, 0xd1, 0xa, 0x62, + 0x55, 0xbe, 0x1, 0x60, 0x51, 0xb, 0xeb, 0x38, + 0xeb, 0x2b, 0x80, 0x2b, 0x92, 0x56, 0x92, 0xc, + 0x80, 0xc, 0xf, 0xb8, 0xb, 0xb, 0x2b, 0x3c, + 0x33, 0x92, 0xc, 0xc, 0x92, 0x1d, 0x1d, 0x92, + 0x80, 0x3c, 0x56, 0x56, 0x5c, 0x57, 0x57, 0x57, + 0x7, 0xbc, 0xea, 0xb, 0xcb, 0x7, 0xa9, 0x53, + 0x9f, 0x40, 0xa9, 0x38, 0x59, 0x87, 0xac, 0xac, + 0x78, 0x76, 0x29, 0x4d, 0x29, 0x68, 0x68, 0xda, + 0xda, 0x45, 0x45, 0x3b, 0x45, 0x5, 0x5, 0xbe, + 0xda, 0x5, 0x5, 0x5, 0xa0, 0xa0, 0xda, 0x29, + 0x62, 0xa, 0x62, 0x1c, 0x1c, 0x8a, 0xf1, 0xd5, + 0xd5, 0xd5, 0x4a, 0x4a, 0xd5, 0x63, 0x4a, 0xe7, + 0x14, 0xf1, 0xd2, 0xc5, 0xe9, 0xd2, 0x19, 0xe9, + 0x6e, 0x19, 0x4a, 0x19, 0x63, 0x63, 0x63, 0x42, + 0xf1, 0x63, 0xd5, 0xef, 0xa5, 0xd2, 0x1b, 0x89, + 0xf1, 0x63, 0x19, 0x63, 0x63, 0x63, 0x6e, 0xd2, + 0x67, 0x41, 0x1c, 0x62, 0xa, 0x8a, 0xe3, 0xac, + 0x62, 0xa, 0xb5, 0x4d, 0xd1, 0x78, 0x8c, 0x49, + 0xd3, 0x52, 0x1d, 0x91, 0x91, 0x1d, 0x3f, 0x49, + 0xac, 0x62, 0x3b, 0x5, 0x68, 0x2f, 0x27, 0xfd, + 0xd8, 0xd8, 0xe4, 0xbf, 0xc0, 0xce, 0xb4, 0xbb, + 0xc0, 0xb4, 0xbf, 0xbf, 0xc0, 0xe4, 0xe1, 0xe1, + 0xdd, 0xf6, 0xe1, 0xbf, 0xbf, 0xe4, 0x95, 0xb4, + 0xe4, 0xb4, 0xe4, 0xe4, 0xb4, 0xe1, 0x7, 0xe4, + 0xe4, 0xc6, 0xe1, 0xde, 0xb4, 0xbd, 0x9c, 0xd7, + 0xd7, 0xd5, 0xa5, 0x2f, 0x8c, 0x6d, 0x4d, 0x62, + 0xb5, 0xbe, 0x24, 0x68, 0xa0, 0x8, 0xb3, 0xa4, + 0xa4, 0xb3, 0xd3, 0x41, 0x8c, 0x55, 0xab, 0xab, + 0x50, 0xa8, 0x52, 0xb8, 0x4f, 0xe8, 0xa8, 0xa4, + 0xc9, 0x4f, 0x98, 0x2a, 0xf6, 0x75, 0xf6, 0x4b, + 0xb4, 0xbb, 0xe4, 0xc6, 0xbb, 0xbf, 0xe2, 0x12, + 0xbb, 0xbb, 0x7, 0x9f, 0xc6, 0xb4, 0xcd, 0xc6, + 0xfc, 0xcc, 0xbf, 0xbf, 0xbb, 0xcc, 0xcc, 0xcc, + 0xb4, 0xf4, 0xbf, + 0xe7, 0xa5, 0x2f, 0x2f, 0x8c, 0x58, 0xd2, 0xc9, + 0x8, 0x89, 0x4a, 0x4a, 0x4a, 0xd5, 0xe5, 0x97, + 0x3, 0xfd, 0x81, 0x9c, 0x27, 0x1e, 0xde, 0xd8, + 0xe5, 0xd5, 0xa9, 0x3e, 0xab, 0x4d, 0x82, 0x5e, + 0x5e, 0xac, 0x78, 0x76, 0x16, 0x23, 0x16, 0x6d, + 0x62, 0x23, 0xa, 0x41, 0xd3, 0xa, 0x1c, 0x6d, + 0x62, 0x1c, 0x8, 0x63, 0x42, 0x89, 0x6e, 0x19, + 0xd2, 0x8, 0x30, 0x89, 0x77, 0xd2, 0x19, 0xd5, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x73, 0x89, 0x6e, + 0x63, 0xf1, 0xd2, 0x19, 0xd2, 0xa5, 0x79, 0x63, + 0x1b, 0x19, 0x63, 0x42, 0x30, 0x1c, 0xa, 0x1c, + 0x41, 0x49, 0xd3, 0x5e, 0x78, 0xa, 0x23, 0xa, + 0xa, 0x62, 0xd1, 0x16, 0x3b, 0x3b, 0x16, 0x1c, + 0xda, 0x78, 0xfe, 0xa, 0x23, 0xa, 0x76, 0xda, + 0xad, 0xad, 0x60, 0xe8, 0x2a, 0xb, 0x80, 0x2b, + 0x80, 0x2b, 0x2b, 0x2b, 0x3c, 0x91, 0x92, 0xc1, + 0xdc, 0x48, 0x92, 0x92, 0x80, 0x2b, 0xc, 0xc, + 0x5f, 0xc, 0xc, 0x3c, 0xdc, 0xd0, 0xc1, 0x2b, + 0xd, 0x33, 0x56, 0x56, 0x48, 0xea, 0xea, 0xea, + 0x57, 0x9a, 0xf6, 0xf6, 0x9a, 0xe1, 0x84, 0x7, + 0x57, 0xbc, 0xb, 0x91, 0x1d, 0x66, 0x37, 0x76, + 0x76, 0x78, 0x78, 0x1c, 0x68, 0xa0, 0x45, 0xda, + 0x87, 0xda, 0x29, 0x16, 0x16, 0x3b, 0x5, 0x16, + 0x68, 0xa0, 0xa0, 0x5b, 0xa4, 0x45, 0x5b, 0x68, + 0x58, 0x41, 0x62, 0xa, 0xac, 0xe3, 0x41, 0x2f, + 0x77, 0xd5, 0xd7, 0x6b, 0x11, 0xd5, 0xd5, 0xef, + 0x19, 0xe, 0x79, 0x67, 0x67, 0xe9, 0xe, 0x5d, + 0xc5, 0x4a, 0xd5, 0xef, 0x2, 0x1b, 0x6e, 0xa5, + 0xf1, 0xa5, 0xef, 0xef, 0x60, 0x1b, 0xd5, 0xd5, + 0xa5, 0x63, 0x6e, 0xd5, 0x6e, 0x6e, 0xc5, 0xc2, + 0xb3, 0x58, 0x8a, 0x16, 0xa, 0x37, 0xd3, 0xbe, + 0x78, 0x62, 0x4d, 0xa, 0x76, 0xb5, 0x94, 0x52, + 0xa7, 0x67, 0x7f, 0x18, 0xeb, 0x3f, 0x3f, 0x1d, + 0x66, 0x4d, 0xe3, 0xad, 0x8c, 0xb8, 0x88, 0xe1, + 0x4b, 0x90, 0xbf, 0xe2, 0xb4, 0xf4, 0x4b, 0xbf, + 0xe4, 0xbf, 0x9a, 0x4b, 0x4b, 0x75, 0xe1, 0xbf, + 0xb4, 0x4b, 0xb4, 0xaf, 0xbf, 0xbf, 0x9a, 0xf9, + 0xc6, 0xe1, 0x57, 0xe1, 0xe4, 0xe1, 0xbb, 0xe4, + 0xe4, 0xe4, 0xc6, 0xde, 0x7b, 0xd8, 0x3a, 0x1b, + 0x96, 0x2c, 0xab, 0x8c, 0x87, 0x6d, 0x1c, 0x8a, + 0x58, 0xbe, 0x6d, 0xe3, 0x8c, 0x52, 0x66, 0x82, + 0x1, 0x65, 0x8c, 0x67, 0xf1, 0xa0, 0xa4, 0x73, + 0xc2, 0x60, 0x52, 0x1, 0x3f, 0x2c, 0x52, 0x1, + 0xc9, 0xd4, 0x4f, 0x90, 0x81, 0xc6, 0x90, 0xdf, + 0xc6, 0xbf, 0xe4, 0xc6, 0xdf, 0xf8, 0xb4, 0xf7, + 0x8d, 0x86, 0xdf, 0xf3, 0xbf, 0xe4, 0x8d, 0xf8, + 0x99, 0x4b, 0xcc, 0xbf, 0x8d, 0xfa, 0x4b, 0xaf, + 0xcc, 0xbb, 0x95, + 0x7a, 0xa5, 0xfb, 0xe8, 0xe7, 0x1b, 0xef, 0xd5, + 0x63, 0x79, 0xc2, 0x19, 0x77, 0x3, 0x36, 0x81, + 0x1e, 0xc4, 0xb4, 0xb4, 0xe4, 0xc6, 0x84, 0xe1, + 0x40, 0xdb, 0x80, 0x1d, 0x66, 0xac, 0x66, 0x66, + 0x37, 0x61, 0xbe, 0xb5, 0x4d, 0xb5, 0xb3, 0x87, + 0x76, 0xa, 0x6d, 0x62, 0xd1, 0x76, 0x78, 0x62, + 0xa, 0xb5, 0x73, 0xd5, 0xd5, 0xd5, 0x19, 0xd5, + 0x1b, 0x42, 0x63, 0xe, 0x2f, 0x8, 0x6e, 0x4a, + 0x6e, 0x11, 0xe5, 0xef, 0xd5, 0xef, 0xef, 0x19, + 0xc5, 0x21, 0x42, 0x6e, 0xd2, 0x21, 0xa5, 0xef, + 0x8f, 0xc2, 0x79, 0xb3, 0x8a, 0xa, 0x1c, 0x8a, + 0x3b, 0x6d, 0x78, 0xd1, 0xd1, 0xd1, 0xd1, 0x23, + 0x23, 0x23, 0x23, 0x3b, 0x29, 0x4d, 0x4d, 0xb5, + 0xda, 0x29, 0x23, 0x23, 0xd1, 0x23, 0xa, 0x68, + 0x59, 0x4e, 0x1d, 0x1d, 0x33, 0x92, 0xc, 0xdc, + 0xa2, 0xa2, 0xc1, 0x2b, 0xa2, 0xa2, 0x2b, 0x56, + 0xaa, 0xc, 0xc, 0xc, 0x5f, 0xaa, 0x5f, 0x3c, + 0x2b, 0xd0, 0xc1, 0xc1, 0xd0, 0xba, 0x2b, 0xc, + 0x56, 0x56, 0xaa, 0xc, 0xea, 0x5c, 0x5c, 0xfa, + 0x9a, 0x86, 0x9a, 0x9a, 0x9a, 0x9a, 0x9a, 0xba, + 0xba, 0xdc, 0xb, 0x92, 0xb6, 0xab, 0x4d, 0x76, + 0xd1, 0xd1, 0x37, 0x29, 0x6d, 0x87, 0x82, 0xbe, + 0x61, 0xc3, 0xb3, 0x68, 0xa4, 0x30, 0x45, 0x3b, + 0x5, 0x45, 0xa4, 0x87, 0xad, 0xa4, 0x59, 0xb8, + 0x49, 0xc3, 0xe3, 0x62, 0x76, 0x1c, 0x41, 0x8c, + 0x8, 0xe, 0xd5, 0xfb, 0xc5, 0x6e, 0xc2, 0xef, + 0xd5, 0xc2, 0xc5, 0x8, 0x1b, 0x6e, 0x1b, 0x79, + 0x79, 0x63, 0xd5, 0x5d, 0x2f, 0x79, 0x73, 0x1b, + 0x63, 0x19, 0x19, 0x19, 0x63, 0x1b, 0x6e, 0xc5, + 0x8, 0x79, 0x73, 0xa5, 0x2f, 0x79, 0x1b, 0x1b, + 0x89, 0x1b, 0x42, 0x30, 0xa, 0xa, 0xa, 0xac, + 0x76, 0x76, 0x76, 0x76, 0x76, 0xe3, 0x94, 0xa4, + 0x73, 0xc9, 0x77, 0x9d, 0x2a, 0x2c, 0xb6, 0x66, + 0xac, 0x76, 0x78, 0x82, 0x8c, 0xc5, 0x6b, 0xfd, + 0x6b, 0x9c, 0xe4, 0xf3, 0x93, 0x90, 0x90, 0xf5, + 0x93, 0xde, 0xe1, 0x81, 0xf5, 0xbf, 0xbf, 0xdd, + 0xc0, 0xc0, 0xbd, 0xc0, 0x32, 0x81, 0xf6, 0x1e, + 0x32, 0xdd, 0xb4, 0xf3, 0x93, 0xf3, 0xf3, 0x32, + 0x4, 0x32, 0x47, 0x6c, 0x6c, 0x5d, 0x2f, 0x2f, + 0x8c, 0xd3, 0xd3, 0xab, 0x87, 0xda, 0x41, 0x67, + 0xf1, 0xd3, 0xe3, 0xe3, 0x4d, 0x4d, 0x29, 0x8a, + 0x82, 0x82, 0x67, 0x5a, 0x42, 0x1b, 0x42, 0xf1, + 0xd2, 0xe, 0x42, 0x2f, 0x5a, 0x67, 0x65, 0x8, + 0x6e, 0xef, 0xe5, 0x4, 0x9c, 0x32, 0x9c, 0x6c, + 0x47, 0x32, 0x4, 0xe5, 0x9c, 0xaf, 0x93, 0x97, + 0x12, 0xe4, 0x93, 0x97, 0xdd, 0xf3, 0xbd, 0x4, + 0x3, 0x9b, 0xb4, 0x26, 0x4, 0xcc, 0xc0, 0x93, + 0x93, 0xaf, 0xaf, + 0x96, 0x6e, 0x8f, 0x2a, 0xa8, 0xa6, 0xd4, 0x77, + 0x50, 0x2c, 0xc7, 0x96, 0x42, 0x77, 0x8e, 0xfd, + 0x39, 0x83, 0xce, 0xe4, 0xde, 0x1e, 0x39, 0x81, + 0x9f, 0x48, 0x91, 0x49, 0x94, 0xbe, 0x66, 0xac, + 0x76, 0x76, 0x76, 0x76, 0x76, 0x37, 0x61, 0x61, + 0x76, 0x4d, 0xa7, 0x8c, 0xb5, 0x68, 0x58, 0x6d, + 0x62, 0x8a, 0xa0, 0xd2, 0xa5, 0x7a, 0xe7, 0x96, + 0x1b, 0x63, 0x63, 0x6e, 0x1b, 0x42, 0x6e, 0x19, + 0x63, 0xe9, 0xa5, 0xd2, 0xa5, 0xa5, 0x79, 0x6e, + 0x6e, 0x63, 0x63, 0x19, 0x19, 0x63, 0xd2, 0x19, + 0xa5, 0x2f, 0x8c, 0x5, 0x41, 0x8a, 0x8a, 0x5, + 0x30, 0x45, 0x29, 0x76, 0xd1, 0x23, 0x23, 0x0, + 0x23, 0x23, 0x23, 0xb5, 0xda, 0x3b, 0x16, 0x45, + 0x45, 0x45, 0x16, 0xa, 0x23, 0x23, 0xd1, 0x4d, + 0x65, 0x55, 0x52, 0x52, 0x59, 0x7e, 0xd0, 0xa2, + 0x57, 0x57, 0xa2, 0xea, 0xb, 0x2b, 0xc, 0x5f, + 0xaa, 0x92, 0xc, 0xc, 0xc1, 0x38, 0x38, 0x2b, + 0xa2, 0xa2, 0x80, 0xaa, 0x3c, 0x2b, 0xc, 0x92, + 0x56, 0xb7, 0x33, 0x3c, 0xa2, 0xf6, 0xf9, 0x9a, + 0x9a, 0x9a, 0xd8, 0xd8, 0x57, 0xe1, 0x9b, 0x40, + 0x18, 0x3, 0xef, 0x50, 0x1, 0x58, 0x76, 0x76, + 0x23, 0xa, 0xa, 0x76, 0x37, 0x29, 0x6d, 0x4d, + 0x5, 0x5, 0xa4, 0x45, 0xa0, 0x45, 0xa0, 0x5, + 0x87, 0x68, 0x87, 0xda, 0xda, 0x45, 0x6d, 0x65, + 0x67, 0x2f, 0xe3, 0x62, 0x8a, 0x41, 0x1c, 0x41, + 0x73, 0x63, 0xd2, 0x73, 0x6e, 0x63, 0x19, 0xe9, + 0x6e, 0x19, 0x19, 0x42, 0x6e, 0x63, 0x63, 0x6e, + 0x79, 0xe9, 0x63, 0xf1, 0x89, 0x63, 0x63, 0x19, + 0x63, 0x4a, 0x63, 0x19, 0x6e, 0x2, 0x6e, 0x19, + 0x89, 0xf1, 0x42, 0xae, 0x89, 0x63, 0x63, 0x63, + 0x63, 0x63, 0x79, 0x67, 0xa, 0xa, 0x62, 0x23, + 0xd1, 0x62, 0xa, 0xa, 0xd1, 0x78, 0x5e, 0xd3, + 0x58, 0x8c, 0xa8, 0x1b, 0xa5, 0x2c, 0xb6, 0x61, + 0xa, 0x76, 0x62, 0xa, 0x82, 0x21, 0x7d, 0xe5, + 0x4, 0x32, 0xd8, 0x8e, 0x4, 0x4, 0xd8, 0x97, + 0x4, 0xf5, 0xb4, 0xc0, 0x93, 0xc0, 0xb4, 0xc0, + 0x97, 0xbd, 0xe1, 0x8e, 0x4, 0xde, 0x81, 0x93, + 0x4, 0x93, 0xc4, 0x93, 0x97, 0xf3, 0xd8, 0x3, + 0x28, 0x4, 0x3, 0xc5, 0xd5, 0x6e, 0xe, 0xf1, + 0x58, 0xb5, 0xe3, 0xb5, 0xe3, 0x6d, 0x82, 0xd3, + 0x1, 0x8c, 0x58, 0x58, 0x58, 0x5, 0x8a, 0x68, + 0x58, 0xe3, 0x6d, 0x8c, 0x8c, 0x2f, 0x79, 0x2f, + 0xa5, 0x6e, 0x6e, 0x19, 0x8f, 0x1b, 0x5b, 0x96, + 0xd5, 0x6b, 0x4, 0x27, 0x6b, 0xbd, 0x7b, 0x47, + 0x99, 0x99, 0x9c, 0x93, 0xf3, 0xf4, 0xaf, 0x9c, + 0xc0, 0xbf, 0xc0, 0xfd, 0x8b, 0x81, 0xdf, 0x26, + 0x7b, 0xc6, 0xed, 0x9c, 0x93, 0xaf, 0x95, 0x93, + 0xed, 0xc6, 0xbb, + 0xf0, 0x63, 0xd5, 0xd2, 0x67, 0x8c, 0x67, 0x67, + 0x58, 0x2f, 0xa6, 0x73, 0x96, 0x6e, 0xd7, 0xe5, + 0xd5, 0xe5, 0x8e, 0x32, 0x6c, 0x3, 0x47, 0x36, + 0xef, 0x3e, 0x7e, 0x59, 0xd3, 0xd3, 0x66, 0xd3, + 0x78, 0xa, 0xd1, 0x23, 0xd1, 0x78, 0x78, 0x78, + 0xa, 0xe3, 0x49, 0x8c, 0x1c, 0x2f, 0x2f, 0x87, + 0x8a, 0x58, 0x8, 0x8, 0x67, 0x73, 0x1b, 0x1b, + 0x1b, 0x63, 0x19, 0x19, 0x63, 0x19, 0x19, 0x4a, + 0x19, 0x63, 0xd2, 0x63, 0x67, 0x8, 0x63, 0x63, + 0x63, 0x63, 0x63, 0x6e, 0x19, 0x19, 0x6e, 0x63, + 0x63, 0x79, 0x8, 0x30, 0x8a, 0x41, 0x30, 0x42, + 0x89, 0x30, 0x29, 0x23, 0xa, 0xa, 0x23, 0x23, + 0x23, 0x23, 0x16, 0x5, 0x45, 0x5, 0x5, 0x5, + 0x5, 0x5, 0x16, 0xa, 0x23, 0xd1, 0xd1, 0xa, + 0xbe, 0x82, 0x87, 0xa8, 0x7f, 0x18, 0x75, 0xf6, + 0x57, 0x57, 0xba, 0x2b, 0x2b, 0xc, 0xc, 0x92, + 0x92, 0xc1, 0xc1, 0x3c, 0x80, 0xd0, 0xb, 0x80, + 0x2b, 0x2b, 0x80, 0xc, 0xc, 0xc, 0x3c, 0x3c, + 0xc1, 0x38, 0x38, 0x33, 0xd0, 0xcb, 0x7, 0x9a, + 0x75, 0xde, 0x8e, 0xcf, 0x74, 0x81, 0xfd, 0xd8, + 0x9b, 0x47, 0xd5, 0x2f, 0xab, 0xac, 0x37, 0xd1, + 0xd1, 0xd1, 0x62, 0x16, 0x16, 0xda, 0x3b, 0x45, + 0x45, 0x5, 0x6d, 0xda, 0x3b, 0x3b, 0x5, 0xbe, + 0x8a, 0xe3, 0x45, 0x45, 0xad, 0xa0, 0x45, 0xda, + 0x5, 0x58, 0x29, 0x62, 0x78, 0x78, 0x62, 0x41, + 0x2f, 0x79, 0xd2, 0x1b, 0x4a, 0x4a, 0x6e, 0xe9, + 0x6e, 0x19, 0xd2, 0x2f, 0x6e, 0xd2, 0x63, 0xe, + 0x6e, 0x6e, 0x19, 0x1b, 0x63, 0x19, 0x19, 0x4a, + 0x19, 0x63, 0x63, 0xd2, 0xd2, 0x79, 0x63, 0x19, + 0x19, 0x4a, 0x4a, 0x19, 0x1b, 0x19, 0x19, 0xd5, + 0xd2, 0xf1, 0x30, 0xa, 0xd1, 0x78, 0x61, 0x76, + 0xa, 0x24, 0x82, 0x78, 0xd1, 0x78, 0x78, 0x62, + 0xa, 0xbe, 0xa7, 0xa8, 0xe8, 0x91, 0x91, 0xa7, + 0x24, 0xbe, 0xbe, 0x65, 0x8a, 0xa6, 0xd4, 0x83, + 0xdd, 0xde, 0xf6, 0x39, 0x9c, 0xb4, 0xbf, 0x95, + 0x9c, 0xf5, 0xe4, 0xe4, 0xbf, 0xbf, 0x4b, 0x81, + 0xbf, 0xbf, 0xb4, 0x4b, 0xdf, 0x12, 0x95, 0xc0, + 0xf3, 0xb4, 0x81, 0xde, 0xde, 0xe4, 0x57, 0xa9, + 0x4, 0x26, 0x47, 0xd7, 0x6e, 0x1b, 0x42, 0x2f, + 0x8c, 0xe3, 0x4d, 0xe3, 0x6d, 0x4d, 0xe3, 0x6d, + 0x82, 0x67, 0x8, 0x8, 0x30, 0xa4, 0x5, 0x67, + 0x87, 0xd3, 0xe3, 0xda, 0xe3, 0x8c, 0x2f, 0x5b, + 0x96, 0xd9, 0x6b, 0xef, 0x27, 0x4f, 0xc9, 0xd4, + 0x2a, 0x40, 0x9b, 0x8b, 0x39, 0xe4, 0xe4, 0xbd, + 0x81, 0xdf, 0xca, 0xc0, 0x8d, 0xf4, 0xbf, 0x4b, + 0xbf, 0x95, 0xb4, 0xe4, 0x90, 0xdf, 0xdf, 0xce, + 0xaf, 0xbf, 0xcc, 0xdf, 0xaf, 0xf4, 0x8d, 0xcc, + 0xdf, 0x90, 0xe1, + 0xd2, 0x2f, 0x2f, 0xa5, 0x8, 0xb3, 0xb3, 0x58, + 0xa6, 0xec, 0x2f, 0x67, 0x2f, 0x96, 0xc5, 0xd5, + 0xd7, 0xd7, 0x3, 0x47, 0x6c, 0xe5, 0xe0, 0xde, + 0x47, 0x27, 0x2a, 0x91, 0xab, 0x55, 0x61, 0x37, + 0x78, 0x76, 0xa, 0xa, 0x78, 0x78, 0x29, 0x8a, + 0x29, 0x78, 0xd3, 0xac, 0x78, 0x24, 0x65, 0x94, + 0x8c, 0x1, 0x60, 0x5b, 0x5b, 0x1b, 0x4a, 0x19, + 0x2d, 0x79, 0x42, 0xd2, 0xa5, 0x4a, 0x11, 0x4a, + 0xd5, 0x4a, 0x4a, 0x19, 0x89, 0x89, 0x63, 0x19, + 0xd2, 0xf1, 0xf1, 0x79, 0x63, 0x2, 0x6e, 0x19, + 0x19, 0x63, 0x63, 0x63, 0x89, 0x30, 0x89, 0xf1, + 0x8c, 0xd3, 0x78, 0x23, 0x23, 0x34, 0xd1, 0xd1, + 0x23, 0x16, 0x3b, 0x30, 0x30, 0x5, 0x3b, 0xda, + 0x3b, 0x29, 0xa, 0x62, 0xd1, 0xa, 0x76, 0x82, + 0x87, 0xad, 0xa4, 0x22, 0x2a, 0xcb, 0xbc, 0xa2, + 0xba, 0xcb, 0xba, 0x2b, 0x3c, 0x33, 0xc1, 0xc, + 0x2b, 0xc1, 0x33, 0xf, 0xc, 0xb, 0x2b, 0x5f, + 0x5f, 0x3c, 0xc, 0x3c, 0x2b, 0x33, 0x38, 0xdc, + 0x48, 0xd0, 0x38, 0x33, 0x3c, 0xa2, 0x7, 0x57, + 0xcb, 0xc6, 0xc6, 0xe1, 0xe1, 0xe1, 0x81, 0xc6, + 0x9f, 0x3, 0x5d, 0x49, 0x82, 0x4d, 0x37, 0xd1, + 0xd1, 0x23, 0x29, 0xda, 0x21, 0x45, 0x45, 0x45, + 0x87, 0x87, 0x29, 0x29, 0x3b, 0x6d, 0x29, 0xda, + 0x68, 0x3b, 0x45, 0x5b, 0x5b, 0x5b, 0x5b, 0xad, + 0xad, 0x87, 0x29, 0x29, 0x62, 0x62, 0xb5, 0x58, + 0x24, 0x2f, 0xa8, 0xc9, 0x8f, 0xd7, 0xe5, 0x19, + 0x6e, 0x4a, 0x6e, 0x42, 0x63, 0x19, 0xe9, 0x5d, + 0x19, 0xd5, 0x11, 0xc2, 0x63, 0xd2, 0x4a, 0x11, + 0x6e, 0xa5, 0x8, 0x2f, 0x6e, 0x4a, 0xd5, 0xe7, + 0xef, 0xef, 0xef, 0xef, 0xc2, 0x63, 0xc5, 0xd5, + 0xd2, 0x8, 0x41, 0xa, 0xd1, 0x78, 0xf2, 0x78, + 0x62, 0x52, 0x52, 0xac, 0x76, 0x76, 0xd1, 0xd1, + 0xe3, 0x82, 0x65, 0x52, 0x7e, 0x51, 0x48, 0x1d, + 0x65, 0x37, 0x55, 0xa7, 0xc3, 0x59, 0xe8, 0x40, + 0xe1, 0xe4, 0xb4, 0xdf, 0xc0, 0xbf, 0xbf, 0xbf, + 0xbf, 0x81, 0xe4, 0x7, 0xbf, 0x95, 0xc6, 0xf3, + 0xbf, 0xbb, 0x20, 0xe4, 0x81, 0xbf, 0xbf, 0xb4, + 0xe4, 0xb4, 0xd8, 0xcf, 0xd8, 0xde, 0x47, 0x6b, + 0xe5, 0x4, 0x4, 0xef, 0x2f, 0x2f, 0x8c, 0xd3, + 0xab, 0x55, 0x82, 0x61, 0x82, 0xda, 0x5, 0xda, + 0x6d, 0x58, 0x8, 0x2f, 0x8c, 0x82, 0x1c, 0xd3, + 0xd3, 0xab, 0x8c, 0xb5, 0x87, 0x30, 0xd2, 0x63, + 0x1b, 0xc9, 0x8f, 0x5d, 0x2c, 0x49, 0x9e, 0xa8, + 0x3f, 0xcb, 0x86, 0x81, 0x81, 0xe4, 0xe4, 0xe4, + 0xde, 0x81, 0xdf, 0x12, 0x9a, 0xbf, 0xe2, 0xaf, + 0xe2, 0xb4, 0xbf, 0xf3, 0x81, 0xc0, 0xce, 0xe4, + 0xdd, 0xb4, 0xb4, 0xc0, 0xcc, 0x9a, 0x57, 0xce, + 0xf7, 0xe4, 0xe4, + 0x8, 0x67, 0x67, 0x45, 0x1b, 0xd2, 0x6e, 0xc9, + 0x5b, 0xf1, 0xa8, 0x1, 0x8c, 0x67, 0xa8, 0x77, + 0xe5, 0xe5, 0x83, 0xca, 0xb1, 0xde, 0xb4, 0xe1, + 0x39, 0x3e, 0x91, 0x52, 0x66, 0x61, 0x37, 0xf2, + 0x61, 0x61, 0xf2, 0x23, 0x62, 0x82, 0x49, 0x94, + 0x4d, 0xb5, 0xa, 0x76, 0x78, 0xac, 0x66, 0x4d, + 0x8c, 0x4e, 0xe8, 0x60, 0x73, 0xe, 0x6e, 0xd5, + 0x19, 0x1b, 0x73, 0x68, 0x8, 0xd2, 0x8f, 0x77, + 0x6e, 0xd7, 0xe5, 0xef, 0xd5, 0xd5, 0xd7, 0xd5, + 0xc2, 0x1b, 0x8, 0xb3, 0xb3, 0xe, 0xef, 0xd5, + 0x8f, 0x19, 0x79, 0x79, 0x2, 0x89, 0x42, 0x41, + 0xd3, 0xd1, 0x0, 0x23, 0x0, 0x0, 0xd1, 0xd1, + 0xa, 0x3b, 0x3b, 0xb5, 0xb3, 0xda, 0xda, 0x29, + 0x29, 0x16, 0x16, 0xa, 0x62, 0xa, 0x6d, 0x6d, + 0xa7, 0xc3, 0x59, 0x3f, 0x80, 0xba, 0xcb, 0xea, + 0xa2, 0x9a, 0x7, 0xba, 0xd0, 0xd0, 0x7f, 0x2b, + 0x3c, 0xc, 0x5f, 0xf, 0xc, 0x92, 0xc, 0x92, + 0x56, 0x48, 0xa2, 0x48, 0x3c, 0xd, 0xd, 0x3c, + 0xc, 0x2b, 0x5f, 0xb7, 0x1d, 0x48, 0xcb, 0xc6, + 0x9a, 0xf4, 0xe1, 0xe1, 0x57, 0x18, 0x3a, 0xa9, + 0x91, 0x2c, 0x1, 0xab, 0xac, 0x76, 0xd1, 0xd1, + 0x23, 0x23, 0xa, 0xda, 0x8c, 0x37, 0xda, 0x65, + 0x82, 0x82, 0x87, 0x45, 0xda, 0x3b, 0x3b, 0x45, + 0x45, 0x87, 0x4d, 0x68, 0xa4, 0x68, 0xa4, 0x5b, + 0x45, 0x68, 0x5, 0x3b, 0x16, 0x29, 0xa, 0x1c, + 0xb5, 0xd3, 0x24, 0x2f, 0xd2, 0x8f, 0xef, 0xe5, + 0x11, 0xd5, 0x19, 0xd5, 0xd5, 0x6e, 0xe9, 0x1b, + 0xe, 0xd5, 0x7a, 0xc2, 0xd2, 0x2d, 0x7a, 0x8f, + 0x4a, 0xc2, 0x6e, 0xc2, 0x6e, 0x19, 0xc5, 0xae, + 0x1b, 0x79, 0x72, 0xd5, 0x4a, 0x63, 0xd2, 0x19, + 0x19, 0x42, 0x58, 0x1c, 0x29, 0x29, 0xa, 0x78, + 0xa, 0x78, 0xf2, 0x76, 0xd1, 0x62, 0x23, 0xa, + 0x58, 0x87, 0x52, 0x2f, 0x6e, 0x77, 0x91, 0x61, + 0xac, 0x78, 0x6d, 0x65, 0xa6, 0xd5, 0x90, 0x9c, + 0xff, 0xf5, 0xb4, 0xbd, 0x4, 0x93, 0x90, 0x9d, + 0x4, 0x12, 0xb0, 0xd8, 0x8e, 0xf3, 0xf3, 0xc0, + 0x93, 0xf3, 0xb4, 0xc0, 0x32, 0xdd, 0xc6, 0x3, + 0x47, 0x97, 0x4, 0x6c, 0xe5, 0x6c, 0x4, 0xd7, + 0x19, 0xe, 0xae, 0x8c, 0xd3, 0xd3, 0xe3, 0xac, + 0xe3, 0x24, 0x59, 0x1, 0x82, 0x45, 0xa4, 0xb3, + 0x41, 0x82, 0x82, 0x5e, 0x6d, 0x6d, 0xb5, 0xa, + 0xac, 0x41, 0x58, 0x67, 0x68, 0x5b, 0x5b, 0x73, + 0xa5, 0x7a, 0xa5, 0x67, 0x8c, 0x1, 0x2f, 0x60, + 0x60, 0x4f, 0xfd, 0x9c, 0xdd, 0xde, 0x99, 0x6b, + 0x3a, 0x9f, 0x9c, 0x6f, 0x83, 0xc6, 0xf3, 0x97, + 0xf3, 0xe4, 0x9c, 0x4, 0xf3, 0xde, 0xde, 0x6f, + 0x6b, 0x83, 0x75, 0x97, 0x93, 0xed, 0xdf, 0x97, + 0x97, 0xc0, 0xce, + 0x1b, 0xd2, 0xa6, 0x8c, 0x2, 0x2f, 0x60, 0x2f, + 0xb3, 0x1, 0xab, 0x87, 0x2f, 0x73, 0xc9, 0xe, + 0x8f, 0x4a, 0xe5, 0xe5, 0x6c, 0x47, 0x9d, 0xd8, + 0x9d, 0xe8, 0x92, 0x1d, 0xab, 0x94, 0x5e, 0x76, + 0xa, 0x76, 0x76, 0x23, 0x76, 0x78, 0x61, 0x61, + 0xd3, 0x8c, 0xab, 0xe3, 0x3b, 0x58, 0xb5, 0x24, + 0x8c, 0xb3, 0x67, 0xb3, 0xf1, 0x63, 0x42, 0x7a, + 0x19, 0x4a, 0x19, 0x63, 0x42, 0x1b, 0x6e, 0xae, + 0x42, 0xd5, 0xef, 0xa5, 0x2, 0x6e, 0x19, 0x4a, + 0x4a, 0x11, 0x19, 0x1b, 0x42, 0x63, 0x63, 0x19, + 0xc2, 0x2, 0x67, 0x41, 0x58, 0xf1, 0xf1, 0x41, + 0x1c, 0x29, 0xa, 0x23, 0x23, 0x23, 0x0, 0x23, + 0x23, 0xa, 0x16, 0x78, 0x4d, 0xda, 0x5, 0x5, + 0x5, 0x45, 0x5, 0x29, 0xa, 0x62, 0x62, 0xa, + 0x4d, 0xab, 0x67, 0x2c, 0x22, 0xdb, 0x7, 0x7, + 0x9a, 0xcb, 0xcb, 0xa2, 0xdc, 0x2b, 0x2b, 0xc, + 0xc, 0x3c, 0xc, 0x92, 0x5f, 0x33, 0x38, 0x48, + 0x2b, 0x2b, 0xd, 0x3c, 0xc, 0x2b, 0x3c, 0xc, + 0xc, 0xc, 0x80, 0xd, 0xc1, 0x38, 0x4f, 0x4b, + 0xe1, 0xfd, 0x47, 0x3, 0x98, 0x5d, 0x5d, 0xa5, + 0x1, 0xab, 0x8c, 0xb3, 0xb5, 0xd1, 0xd1, 0x23, + 0x23, 0x23, 0xa, 0x16, 0x16, 0x4d, 0x29, 0x68, + 0x68, 0xda, 0xa4, 0x45, 0x5b, 0x30, 0x45, 0x5, + 0x45, 0x82, 0x3b, 0x5, 0xda, 0x16, 0x6d, 0x30, + 0x5b, 0x45, 0x3b, 0x45, 0x30, 0x1c, 0x62, 0x29, + 0x62, 0xa, 0xb5, 0x67, 0x1b, 0xae, 0x79, 0x6e, + 0x8f, 0x63, 0x63, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x63, 0x89, 0x79, 0xd2, 0x19, 0xf1, 0x67, 0x2f, + 0xe, 0x79, 0xd2, 0x6e, 0x1b, 0xd2, 0xd2, 0x79, + 0x1b, 0x42, 0xf1, 0x42, 0x19, 0x19, 0x63, 0x1b, + 0x89, 0xf1, 0x41, 0xa, 0x29, 0x16, 0xa, 0xa, + 0x6d, 0x6d, 0xa, 0xd1, 0xa, 0xd1, 0xd1, 0xd1, + 0x29, 0x87, 0xab, 0x2c, 0x2f, 0x2f, 0x49, 0x94, + 0xd3, 0x4d, 0x29, 0xe3, 0x5b, 0xe5, 0xde, 0x1e, + 0x6b, 0x9c, 0x81, 0x9d, 0x4, 0x6f, 0xca, 0x9c, + 0x4, 0xf3, 0xe4, 0xf5, 0x9c, 0xc0, 0xe4, 0x93, + 0x97, 0x99, 0xc0, 0x8e, 0xfd, 0xbd, 0xf3, 0x99, + 0x4, 0x4, 0x4, 0x6c, 0x4a, 0x4a, 0xd7, 0x5d, + 0x14, 0x67, 0x58, 0x41, 0xd3, 0x58, 0x68, 0x41, + 0x58, 0x2f, 0xc7, 0x8c, 0xd3, 0x8c, 0x8c, 0x6d, + 0xd3, 0x24, 0x87, 0xe3, 0x29, 0x58, 0x68, 0xda, + 0x1c, 0x1c, 0x8a, 0xd3, 0xb5, 0xe3, 0xc3, 0x67, + 0x1, 0x50, 0xc5, 0x5b, 0xc9, 0xc5, 0x8f, 0x8f, + 0x77, 0xd9, 0x1e, 0x93, 0xd8, 0x9f, 0x6b, 0x6b, + 0x40, 0xf6, 0xbd, 0xc0, 0x9c, 0xe4, 0xf3, 0x12, + 0xbf, 0xb4, 0xc0, 0xc0, 0xd8, 0x9f, 0x9f, 0x1e, + 0xff, 0xce, 0xb4, 0xaf, 0xc0, 0xbf, 0xc0, 0x12, + 0xf3, 0xbf, 0x7, + 0x5b, 0x1b, 0xf1, 0x58, 0x30, 0x67, 0x8c, 0x8c, + 0x2f, 0x1, 0x8c, 0xb3, 0x79, 0x63, 0xc2, 0x19, + 0x1b, 0x6e, 0x6e, 0x4a, 0xd7, 0x6c, 0x2a, 0xa9, + 0xe5, 0x3a, 0x91, 0x49, 0xc3, 0x1, 0xab, 0xac, + 0x4d, 0x78, 0x23, 0xd1, 0x23, 0x78, 0x76, 0x76, + 0x58, 0x67, 0x8c, 0xb5, 0x5, 0xa4, 0xab, 0xd3, + 0xd3, 0x68, 0xb3, 0x58, 0x30, 0x89, 0x42, 0x73, + 0x1b, 0x19, 0x4a, 0x63, 0x89, 0x1b, 0x19, 0x4a, + 0xe, 0x6e, 0x6e, 0x8, 0xf1, 0x63, 0x19, 0x19, + 0x4a, 0xd5, 0x4a, 0x6e, 0x89, 0x89, 0x6e, 0x19, + 0xd2, 0xe9, 0x58, 0xa, 0x1c, 0x67, 0xf1, 0x67, + 0x1c, 0x1c, 0x29, 0xa, 0xd1, 0x23, 0x23, 0x23, + 0xd1, 0x29, 0x29, 0x29, 0x16, 0x45, 0xa0, 0x30, + 0x3b, 0x45, 0x3b, 0x1c, 0xa, 0xa, 0x76, 0xd1, + 0xa, 0xe3, 0xd2, 0xa5, 0xd4, 0x88, 0xf6, 0x7, + 0x7, 0xcb, 0x5c, 0xd, 0x2b, 0x2b, 0x3c, 0x5f, + 0x56, 0x92, 0x48, 0xdc, 0xc, 0x33, 0xeb, 0x80, + 0x2b, 0x2b, 0xc1, 0xaa, 0x92, 0xc, 0x2b, 0x3c, + 0x56, 0xc1, 0xb, 0xcb, 0xb, 0x38, 0x4f, 0x83, + 0xe1, 0xd8, 0x47, 0x27, 0x91, 0x2c, 0xa5, 0xc5, + 0x2f, 0xb5, 0xe3, 0x58, 0x5e, 0x76, 0x23, 0xd1, + 0xa, 0xa, 0x29, 0x82, 0x6d, 0x16, 0xda, 0xa0, + 0x5, 0x16, 0x45, 0x45, 0xa0, 0xb3, 0x68, 0x5, + 0x68, 0x8a, 0x41, 0xa4, 0x45, 0x3b, 0x3b, 0xa0, + 0x8, 0xda, 0x3b, 0x3b, 0x1c, 0xa, 0x62, 0x6d, + 0x4d, 0x62, 0xe3, 0x2f, 0xd2, 0x79, 0x42, 0xd5, + 0x4a, 0xd2, 0x79, 0xe9, 0x19, 0x6e, 0x77, 0xef, + 0x6e, 0x63, 0xc2, 0x19, 0xd5, 0xd2, 0x58, 0x2, + 0xa5, 0x2f, 0x67, 0xa5, 0x63, 0xe9, 0x2f, 0xd2, + 0x19, 0x19, 0x19, 0x4a, 0x4a, 0x63, 0x63, 0x73, + 0x42, 0x67, 0xd3, 0x6d, 0x29, 0xd1, 0xd1, 0x76, + 0x87, 0x8c, 0x4d, 0x62, 0x62, 0xa, 0xa, 0xd1, + 0x4d, 0x55, 0x66, 0x52, 0x50, 0x4e, 0x3f, 0x1d, + 0xa7, 0x68, 0x87, 0x8c, 0xc9, 0x83, 0x84, 0xf6, + 0x90, 0xdf, 0x70, 0x9f, 0xb2, 0xb4, 0xe4, 0xe4, + 0xf3, 0xb4, 0xb4, 0xe2, 0x81, 0xe4, 0x9, 0xe1, + 0x81, 0xb4, 0xbf, 0xe4, 0xb4, 0x95, 0xcc, 0xe4, + 0xbd, 0xdd, 0x32, 0x47, 0x6c, 0x6c, 0xe9, 0xa5, + 0x2f, 0xb3, 0x8c, 0xb5, 0x8c, 0x5a, 0xe9, 0x8, + 0x2f, 0xe8, 0xeb, 0x49, 0x94, 0xa7, 0x94, 0xac, + 0x4d, 0xab, 0x87, 0x82, 0x82, 0xb3, 0xad, 0x5, + 0xb5, 0xda, 0x82, 0x1c, 0x6d, 0x58, 0x2f, 0x1, + 0x49, 0x4e, 0xfb, 0xd5, 0xfb, 0x27, 0x6b, 0x83, + 0x8b, 0x53, 0x81, 0xe1, 0x75, 0x75, 0xb4, 0xe4, + 0xe1, 0x9a, 0xbf, 0xe4, 0xbf, 0x95, 0xf4, 0xbf, + 0xbf, 0x9a, 0xb4, 0xbf, 0x9a, 0x75, 0x75, 0xe1, + 0xcc, 0xaf, 0xe2, 0xcc, 0xbf, 0xf4, 0xf4, 0xb4, + 0x95, 0xf4, 0x57, + 0xf0, 0x42, 0x2f, 0x2f, 0x89, 0x30, 0x68, 0x8, + 0x79, 0x2f, 0x58, 0x58, 0x1b, 0x63, 0xa5, 0xd2, + 0x5b, 0x73, 0xf1, 0x5d, 0xef, 0xe5, 0x31, 0x6b, + 0x47, 0x3, 0x3e, 0x1f, 0x1, 0x49, 0x52, 0x66, + 0xac, 0x37, 0x23, 0xd1, 0x1c, 0x1c, 0x1c, 0x6d, + 0x67, 0x67, 0xd3, 0x41, 0xe3, 0x24, 0x66, 0x6d, + 0x8c, 0x8, 0x73, 0xf1, 0x63, 0x4a, 0x63, 0x73, + 0x89, 0x63, 0x77, 0x79, 0xd2, 0x19, 0x11, 0xd7, + 0xd7, 0x19, 0x4a, 0x63, 0x6e, 0x19, 0x4a, 0xd2, + 0x1b, 0x19, 0x79, 0x2f, 0xf1, 0x63, 0x19, 0x19, + 0x19, 0xd2, 0x5, 0xa, 0xd1, 0x1c, 0x41, 0xa, + 0xa, 0xa, 0xd1, 0x34, 0xd1, 0xd1, 0x23, 0x23, + 0xa, 0x3b, 0x45, 0x3b, 0x3b, 0x5, 0x30, 0xda, + 0xd1, 0x29, 0x29, 0x76, 0x29, 0x76, 0x29, 0xa, + 0x29, 0x68, 0x1b, 0xc5, 0x27, 0x8b, 0x75, 0x74, + 0xea, 0xea, 0xd, 0x22, 0x80, 0x80, 0x48, 0xd0, + 0x91, 0xc, 0xea, 0x2b, 0x3c, 0x5f, 0x56, 0xc, + 0x3c, 0xc, 0x92, 0x92, 0x3c, 0x3c, 0xd0, 0xa2, + 0x80, 0x91, 0xb, 0xcb, 0xea, 0x3c, 0x7f, 0xc6, + 0x75, 0xf6, 0x1e, 0x1e, 0xfb, 0xe8, 0xe7, 0xd2, + 0xa6, 0x24, 0xe3, 0x4d, 0xd1, 0xd1, 0x23, 0x23, + 0x78, 0xa, 0x16, 0x45, 0x45, 0x5, 0x45, 0xa4, + 0xa4, 0x29, 0x16, 0x68, 0x87, 0xbe, 0x29, 0x68, + 0xad, 0x82, 0x45, 0x45, 0x45, 0xa0, 0x45, 0xa0, + 0x45, 0x29, 0x1c, 0x1c, 0x29, 0xa, 0x4d, 0xbe, + 0xb5, 0x1c, 0xb5, 0x60, 0x7c, 0xef, 0x8f, 0xd7, + 0x6a, 0xe7, 0x1b, 0x19, 0x19, 0xe7, 0xa5, 0xd5, + 0xef, 0x6e, 0x77, 0xef, 0xef, 0x19, 0xe9, 0xe, + 0x6e, 0x42, 0x30, 0x73, 0x19, 0x63, 0xa5, 0x6e, + 0xd5, 0x19, 0xef, 0xef, 0x77, 0xd5, 0x5d, 0x60, + 0x60, 0x58, 0x8a, 0xa, 0xa, 0xa, 0x23, 0x62, + 0xab, 0x52, 0x4d, 0x5e, 0x62, 0xa, 0xd1, 0xd1, + 0x78, 0xbe, 0xbe, 0xa7, 0xe8, 0x88, 0x91, 0x1d, + 0xd3, 0xc3, 0xab, 0x52, 0x7e, 0x88, 0xf6, 0xf6, + 0xe1, 0xe4, 0xb4, 0xfa, 0xf8, 0xb4, 0xbf, 0xaf, + 0xbf, 0xbf, 0xf4, 0xe1, 0xe1, 0xb4, 0xb4, 0xf9, + 0xe4, 0xe4, 0xbb, 0xe4, 0xc6, 0xb4, 0xbf, 0xc6, + 0xd8, 0x18, 0x6b, 0x7d, 0x5d, 0x27, 0x77, 0xc3, + 0x8c, 0x1, 0x24, 0xe3, 0x6d, 0xb3, 0x60, 0x2f, + 0x49, 0x4e, 0x7e, 0x22, 0x4e, 0x4e, 0x4e, 0xb3, + 0x82, 0x82, 0x55, 0x37, 0x78, 0x37, 0x82, 0xd3, + 0xac, 0xab, 0xda, 0x45, 0x30, 0x42, 0xe7, 0x8, + 0xc3, 0xc9, 0x77, 0x5d, 0x50, 0x4e, 0x5c, 0x27, + 0x8b, 0x18, 0x81, 0x40, 0xdf, 0xc6, 0xbf, 0xc4, + 0xe4, 0x4b, 0x81, 0xbf, 0xbb, 0xbb, 0xc6, 0x4b, + 0xe2, 0xb4, 0xbf, 0xb4, 0xf9, 0xdf, 0xf9, 0xaf, + 0xaf, 0xb4, 0xb0, 0xfa, 0xc6, 0xcc, 0x9a, 0x75, + 0x4b, 0xf9, 0xb4, + 0x8, 0xa6, 0x49, 0x4e, 0xd5, 0x19, 0x6e, 0xc2, + 0x96, 0x89, 0x58, 0x24, 0xa6, 0x67, 0x41, 0x2c, + 0xc2, 0xd4, 0x59, 0x7e, 0x83, 0x81, 0x84, 0xce, + 0x75, 0x9f, 0x91, 0x52, 0x52, 0x17, 0x17, 0x66, + 0x66, 0x61, 0x76, 0x76, 0x87, 0x68, 0x6d, 0xe3, + 0x24, 0x24, 0x8c, 0xac, 0x37, 0x37, 0x4d, 0x24, + 0x67, 0x6e, 0xd5, 0x4a, 0x1b, 0x19, 0xd5, 0x8f, + 0xe, 0xd5, 0x42, 0x8, 0x1b, 0x8f, 0x7a, 0x8f, + 0xef, 0xe5, 0xd5, 0x19, 0x6e, 0xc2, 0xef, 0x19, + 0xd2, 0xef, 0xe7, 0xf1, 0x79, 0xc2, 0x6e, 0xd2, + 0x79, 0x45, 0xe3, 0xa, 0xa, 0xb5, 0x6d, 0x78, + 0x62, 0xa, 0x62, 0x76, 0x23, 0x23, 0x0, 0x23, + 0x16, 0x68, 0x45, 0x5, 0x1c, 0xda, 0x1c, 0x16, + 0xa, 0xda, 0x16, 0x16, 0xa, 0x78, 0xd1, 0x23, + 0xda, 0x87, 0x30, 0xc9, 0x3e, 0x91, 0x53, 0x51, + 0x80, 0xd0, 0xcb, 0xcb, 0x5c, 0x5c, 0xcb, 0xbc, + 0x2b, 0xc, 0x92, 0xc, 0xc, 0xc, 0x92, 0xb7, + 0xb7, 0xc, 0xd0, 0xa2, 0x2b, 0x3c, 0xd, 0xb, + 0xb, 0x3c, 0xc, 0x3c, 0x92, 0x3c, 0xa2, 0x75, + 0xcb, 0x18, 0x90, 0xc8, 0x3e, 0x67, 0x68, 0x68, + 0x8c, 0x66, 0x4d, 0x76, 0x76, 0xd1, 0x23, 0x34, + 0x78, 0x4d, 0x6d, 0x58, 0x82, 0x82, 0xb5, 0x87, + 0x82, 0xbe, 0xbe, 0xda, 0x68, 0xda, 0x68, 0x73, + 0x68, 0x1c, 0x5, 0x45, 0x5, 0x3b, 0x4d, 0xe3, + 0xda, 0x5, 0x58, 0x45, 0xbe, 0xa, 0xa, 0x62, + 0xb5, 0x62, 0x78, 0xd3, 0x67, 0xa5, 0xd5, 0x8f, + 0x6e, 0x19, 0x19, 0xd5, 0x63, 0x1b, 0x1b, 0xe, + 0xa5, 0x8c, 0x67, 0xc9, 0x96, 0xe, 0x6e, 0xd2, + 0xe, 0x1b, 0x63, 0x19, 0x19, 0x1b, 0xf1, 0x73, + 0x1b, 0x2f, 0x2f, 0x2f, 0x73, 0x73, 0x42, 0x7a, + 0xd2, 0x42, 0x58, 0x3b, 0x58, 0x1c, 0xa, 0x23, + 0xa, 0x78, 0x78, 0xd1, 0x78, 0x4d, 0x76, 0x62, + 0x41, 0x67, 0xb3, 0x87, 0xa8, 0x7a, 0x1d, 0xd3, + 0x82, 0xbe, 0x55, 0xa8, 0x60, 0xd9, 0x7d, 0xb1, + 0x9c, 0x32, 0x8d, 0x99, 0x9c, 0xc0, 0xbf, 0xde, + 0x25, 0x7d, 0xc4, 0xf3, 0x97, 0xf3, 0xdf, 0x9c, + 0x4, 0x93, 0xf3, 0x9c, 0x47, 0x81, 0xe4, 0xfd, + 0xe8, 0xef, 0x19, 0x19, 0x4a, 0x6e, 0x42, 0x30, + 0x58, 0x8c, 0xd3, 0xe3, 0xb5, 0x24, 0x8c, 0xab, + 0x2f, 0xe9, 0xd9, 0xd5, 0xe5, 0x9d, 0x83, 0x77, + 0x8c, 0x65, 0x5e, 0x37, 0xa, 0xa, 0x78, 0xa, + 0xe3, 0xe3, 0x68, 0x30, 0x30, 0x42, 0x79, 0x42, + 0x79, 0x67, 0x2f, 0x79, 0x2f, 0x14, 0xf0, 0x4a, + 0xd7, 0x36, 0x6f, 0x4, 0x9c, 0xe4, 0x8e, 0x97, + 0x93, 0xdf, 0x32, 0x4, 0x12, 0xbf, 0xf8, 0x69, + 0xc0, 0xbf, 0x12, 0x12, 0xf3, 0x81, 0x81, 0x9b, + 0x9b, 0x12, 0xd8, 0x47, 0x97, 0xaf, 0xaf, 0x93, + 0x4, 0x12, 0xc0, + 0x42, 0x2f, 0xa6, 0x73, 0xe, 0xd2, 0xa5, 0x2f, + 0x68, 0xa6, 0x67, 0xa8, 0x2f, 0xa6, 0x8, 0x96, + 0xa5, 0x2f, 0xa8, 0xc9, 0x4f, 0x90, 0xe1, 0xdb, + 0x7f, 0x5c, 0x91, 0x1d, 0x52, 0xa8, 0x55, 0x5e, + 0x8c, 0x8c, 0x62, 0xa, 0x29, 0xab, 0xe3, 0xb5, + 0xd3, 0x37, 0x37, 0xb5, 0xd3, 0x58, 0xda, 0x87, + 0x8, 0xd2, 0xd2, 0xd2, 0x5b, 0x73, 0x6e, 0x19, + 0xe, 0x6e, 0x1b, 0x19, 0x63, 0x8f, 0x6e, 0x1b, + 0x6e, 0xe, 0xa5, 0xf1, 0x2, 0x42, 0x63, 0x63, + 0xe, 0x6e, 0x1b, 0x5b, 0x1b, 0x4a, 0x63, 0x8, + 0x58, 0xda, 0x1c, 0xa, 0xa, 0x37, 0xac, 0x78, + 0x78, 0x76, 0x62, 0x23, 0x23, 0x23, 0xa, 0xa, + 0xd1, 0x82, 0x1c, 0x29, 0x4d, 0x6d, 0xda, 0x3b, + 0x3b, 0x30, 0x45, 0x3b, 0x16, 0xa, 0x23, 0xa, + 0xd1, 0x78, 0xbe, 0x30, 0x2f, 0xa5, 0x8f, 0xd5, + 0x3, 0xcb, 0xbc, 0xcb, 0xd, 0x38, 0xdc, 0xea, + 0x2b, 0x2b, 0x5f, 0x56, 0xc, 0xc, 0x3c, 0x33, + 0x56, 0x56, 0x2b, 0xb, 0x80, 0x92, 0xaa, 0x3c, + 0xc, 0xc, 0xc, 0x33, 0x38, 0xd6, 0x27, 0x90, + 0x7d, 0x5c, 0x5d, 0x50, 0x49, 0xab, 0x4d, 0x4d, + 0x76, 0x76, 0x37, 0x76, 0x23, 0x23, 0xa, 0x4d, + 0xd1, 0x76, 0x29, 0x4d, 0x4d, 0x78, 0x4d, 0x78, + 0xf2, 0x37, 0xbe, 0x5, 0x45, 0x45, 0x3b, 0x30, + 0x30, 0x3b, 0x16, 0x29, 0x16, 0x29, 0x16, 0xda, + 0xda, 0x30, 0xa0, 0xa0, 0xda, 0x23, 0x16, 0x62, + 0x62, 0xa, 0xa, 0x62, 0x1c, 0x41, 0x8, 0x79, + 0xd2, 0x1b, 0x19, 0x4a, 0x19, 0x19, 0x19, 0xd2, + 0x63, 0x1b, 0x42, 0x42, 0xf1, 0xf1, 0x19, 0x19, + 0x19, 0x19, 0x63, 0x19, 0x19, 0x19, 0x2, 0x5a, + 0xf1, 0x73, 0x42, 0x1b, 0x42, 0x67, 0x30, 0x63, + 0x63, 0x42, 0xf1, 0x67, 0x8, 0x41, 0x62, 0x62, + 0x78, 0x23, 0xd1, 0xd1, 0xd1, 0xd1, 0x76, 0x78, + 0xb5, 0xe3, 0x65, 0x94, 0xa7, 0x64, 0x1d, 0x52, + 0xd3, 0x82, 0x24, 0xad, 0x6e, 0xe5, 0xc4, 0x9c, + 0x4, 0x47, 0xf3, 0xdd, 0x47, 0x32, 0xe4, 0x12, + 0x32, 0xc0, 0xf3, 0x12, 0x6f, 0x12, 0x12, 0x93, + 0x9c, 0xde, 0xb4, 0xdd, 0xfd, 0xde, 0xe4, 0x8e, + 0x6c, 0xe5, 0xd7, 0x4a, 0xa5, 0x2f, 0x41, 0x58, + 0x24, 0x8c, 0x8c, 0x58, 0x67, 0x2f, 0xb3, 0x30, + 0x73, 0xef, 0x1e, 0x6c, 0x47, 0xd8, 0x53, 0x98, + 0x91, 0x1d, 0x1f, 0x82, 0x24, 0x82, 0x37, 0x62, + 0x62, 0x8a, 0xb5, 0xe3, 0xb5, 0x24, 0x8c, 0x2f, + 0xf1, 0x2f, 0x5a, 0x5b, 0x5b, 0x8f, 0x8f, 0x9c, + 0x9c, 0x83, 0x9c, 0x97, 0xf3, 0x57, 0x9f, 0x9c, + 0xbf, 0xaf, 0xe4, 0xc0, 0xfa, 0xbf, 0xbf, 0xe4, + 0xbf, 0xf4, 0x81, 0xf3, 0xf4, 0x57, 0x57, 0x18, + 0x83, 0xb1, 0xbf, 0xc0, 0xc0, 0xcc, 0xf7, 0xcc, + 0x12, 0xbf, 0xb0, + 0x63, 0x42, 0xa0, 0xb3, 0x79, 0x2f, 0x2f, 0x1, + 0x87, 0x58, 0xf1, 0x2f, 0x96, 0x1b, 0x5b, 0xd2, + 0xd2, 0xa5, 0x8, 0x59, 0xe9, 0xe5, 0x40, 0x53, + 0xe8, 0xd9, 0x2a, 0x2c, 0x49, 0x1, 0x87, 0xe3, + 0xd3, 0xd3, 0xac, 0xd1, 0xd1, 0xac, 0x76, 0x76, + 0xac, 0xa, 0x62, 0x41, 0x41, 0x8c, 0x41, 0x30, + 0x58, 0x8, 0x89, 0xd2, 0x8, 0xa4, 0xf1, 0x63, + 0x19, 0x19, 0x1b, 0x19, 0x19, 0x19, 0x6e, 0x63, + 0x19, 0x19, 0xf1, 0x8, 0xf1, 0x42, 0x79, 0xe9, + 0x19, 0x19, 0x11, 0x89, 0x63, 0x63, 0x63, 0x42, + 0x30, 0x41, 0x29, 0x62, 0x23, 0x62, 0xa, 0xa, + 0xd3, 0xb5, 0xd1, 0x23, 0xd1, 0x34, 0x23, 0x23, + 0xa, 0x29, 0x82, 0x29, 0x16, 0xda, 0x45, 0x3b, + 0x45, 0x5, 0x5, 0x3b, 0x29, 0x76, 0xa, 0x76, + 0x23, 0xd1, 0xa, 0x4d, 0x30, 0x1b, 0xef, 0xd7, + 0x3, 0xb, 0xb, 0xb, 0x80, 0x92, 0xd, 0xd0, + 0xdc, 0x3c, 0x80, 0xd0, 0x80, 0xc, 0x3c, 0x92, + 0x56, 0x5f, 0xaa, 0xc, 0xc, 0x92, 0x5f, 0xaa, + 0xd, 0xc1, 0x3c, 0xeb, 0x5c, 0x22, 0x2a, 0x9d, + 0xf6, 0x98, 0x60, 0x67, 0xa7, 0x82, 0x4d, 0x78, + 0xd1, 0x23, 0x76, 0x23, 0x23, 0xd1, 0x76, 0x76, + 0x78, 0x78, 0x4d, 0xbe, 0x6d, 0x4d, 0x4d, 0x78, + 0x78, 0x62, 0x29, 0x29, 0x29, 0x29, 0x29, 0xda, + 0xda, 0xda, 0x82, 0xda, 0x5, 0x45, 0x3b, 0x5, + 0xbe, 0x87, 0xa4, 0x68, 0x29, 0x29, 0x29, 0xe3, + 0x29, 0x1c, 0x29, 0x1c, 0x62, 0x8a, 0x58, 0x8, + 0x2f, 0xf1, 0x63, 0xd5, 0xd5, 0x6e, 0x4a, 0xe, + 0x4a, 0x4a, 0x4a, 0x19, 0x63, 0x1b, 0x63, 0x19, + 0x63, 0xf1, 0x63, 0x2d, 0xe, 0xe, 0xe9, 0x60, + 0xf0, 0x5b, 0x1b, 0xd5, 0x6e, 0x89, 0x8, 0xf1, + 0xf1, 0x2f, 0x2f, 0x8c, 0x2f, 0x58, 0x58, 0xb3, + 0xab, 0x6d, 0x29, 0x1c, 0x29, 0x78, 0xd1, 0xd1, + 0x76, 0x37, 0x94, 0x1f, 0x1f, 0x9e, 0xb8, 0xb8, + 0x49, 0xb3, 0x68, 0xf0, 0xd9, 0x1e, 0xc6, 0x57, + 0x51, 0x8b, 0x84, 0xe4, 0xf5, 0xdf, 0xdf, 0xc6, + 0xe4, 0xbf, 0xbf, 0x81, 0x9c, 0xe4, 0x95, 0xce, + 0x9f, 0x90, 0xc6, 0xe4, 0xe4, 0xb4, 0xe4, 0x1e, + 0x4, 0x36, 0x47, 0xc5, 0xa6, 0x1, 0xd3, 0x82, + 0x24, 0x8c, 0x87, 0xf1, 0xd2, 0x79, 0xc5, 0xa6, + 0x96, 0xfb, 0x9d, 0xd8, 0xc8, 0x98, 0xdb, 0x18, + 0xeb, 0x3f, 0x56, 0x9e, 0x59, 0x91, 0x6, 0x4d, + 0xe3, 0x82, 0x4d, 0x6d, 0x6d, 0xe3, 0xb5, 0x30, + 0xe7, 0x6e, 0x60, 0x96, 0x96, 0xd9, 0x74, 0x47, + 0x39, 0x39, 0x8b, 0xde, 0x70, 0x75, 0x83, 0xdf, + 0xbf, 0xbf, 0xf4, 0xe4, 0xdf, 0xc6, 0xe2, 0xbf, + 0x95, 0xf4, 0xf6, 0x8d, 0xb4, 0xf4, 0xb4, 0xfa, + 0xfc, 0x4b, 0x95, 0xbf, 0xf4, 0xcc, 0xdf, 0xbf, + 0xbf, 0xbb, 0xb4, + 0xd2, 0xd2, 0x79, 0x67, 0xb3, 0x5b, 0xa0, 0x8, + 0x8, 0x41, 0x8, 0x42, 0x42, 0x79, 0xa5, 0xa5, + 0xa5, 0x5d, 0xe8, 0x7f, 0x27, 0x9c, 0x81, 0x1e, + 0x47, 0x47, 0x40, 0x91, 0x49, 0x2c, 0x52, 0xd3, + 0x55, 0x82, 0xb5, 0x3b, 0x29, 0xa, 0xa, 0xa, + 0xa, 0x29, 0x62, 0x6d, 0xe3, 0xac, 0x8c, 0x1, + 0x1, 0x30, 0xf0, 0x1b, 0x42, 0x42, 0x2f, 0x42, + 0xc2, 0xc5, 0xa5, 0x77, 0x63, 0x77, 0x6e, 0x4a, + 0x19, 0x4a, 0x19, 0x63, 0x63, 0x1b, 0xf1, 0x42, + 0x6e, 0xd2, 0x5a, 0x2d, 0x2, 0xc5, 0xd2, 0xd2, + 0xf1, 0x41, 0x1c, 0xa, 0xa, 0x62, 0x78, 0x62, + 0x62, 0xa, 0xd1, 0xd1, 0x23, 0x23, 0xd1, 0x16, + 0x16, 0x3b, 0xa4, 0x5, 0x45, 0x5, 0xda, 0x16, + 0x29, 0x4d, 0xbe, 0x78, 0x29, 0x78, 0x76, 0xd1, + 0xa, 0x23, 0xd1, 0x29, 0x5, 0x8, 0xa5, 0x4a, + 0x3, 0xb, 0x3c, 0xc1, 0xeb, 0xeb, 0xd0, 0x5c, + 0x5c, 0xd0, 0xb, 0x51, 0x80, 0x5f, 0xf, 0xc, + 0xc, 0x5f, 0x5f, 0xaa, 0xc1, 0xc, 0x92, 0xc1, + 0x38, 0x33, 0xc1, 0xb, 0xdc, 0x3c, 0x56, 0x48, + 0x53, 0x48, 0x1d, 0x64, 0xad, 0x58, 0xe3, 0xa, + 0xd1, 0x76, 0x76, 0xd1, 0x23, 0xd1, 0x76, 0x76, + 0x76, 0x37, 0x37, 0x55, 0x65, 0xc3, 0x55, 0x65, + 0x37, 0x76, 0x76, 0x78, 0xa, 0x29, 0x23, 0xa, + 0x4d, 0x45, 0xa0, 0x96, 0x45, 0x45, 0x45, 0x68, + 0x87, 0x3b, 0x29, 0x61, 0x82, 0x29, 0xe3, 0x55, + 0xa, 0xa, 0x41, 0x8c, 0x62, 0x6d, 0xa0, 0x1b, + 0xf0, 0x1b, 0x6e, 0xd4, 0x2f, 0xa5, 0x4a, 0xef, + 0xd7, 0xd7, 0xd7, 0xef, 0xd5, 0x1b, 0xd4, 0x79, + 0x60, 0xf1, 0xe, 0xe7, 0x21, 0x2f, 0xa5, 0xe7, + 0xc7, 0x5b, 0x1b, 0xd7, 0xef, 0xd2, 0x1b, 0x89, + 0x2f, 0x89, 0x63, 0x42, 0xa6, 0x24, 0x41, 0x60, + 0x1, 0x4d, 0x29, 0x37, 0xac, 0xa, 0xa, 0x62, + 0x78, 0x6d, 0x1, 0x59, 0xb8, 0xc9, 0x4f, 0x3e, + 0x2c, 0x8c, 0x59, 0x59, 0xb8, 0x53, 0x57, 0x9f, + 0x88, 0x39, 0xc6, 0xbf, 0xf3, 0x81, 0xdf, 0xf3, + 0xbf, 0xb4, 0xbf, 0xc6, 0xdf, 0xc6, 0xb4, 0xbb, + 0xc6, 0xdf, 0xdf, 0xe4, 0xbf, 0xbf, 0xe4, 0xca, + 0x3, 0x98, 0x98, 0x50, 0x14, 0x65, 0x87, 0x30, + 0x89, 0x68, 0xb3, 0x73, 0xe, 0x5d, 0xa8, 0xb3, + 0xb3, 0xb8, 0x98, 0x9d, 0x36, 0x83, 0x90, 0xd8, + 0x90, 0x8b, 0x91, 0x59, 0x3e, 0x5f, 0x1f, 0xac, + 0x4d, 0xbe, 0xbe, 0x87, 0x5, 0x68, 0xda, 0x58, + 0x79, 0xa5, 0x67, 0x24, 0x68, 0xb8, 0x3e, 0xa9, + 0x90, 0x39, 0x83, 0x9c, 0xf3, 0xb4, 0xf9, 0x9c, + 0xb4, 0xbf, 0xb4, 0xc0, 0xc0, 0xe4, 0xb4, 0x95, + 0xb4, 0xbf, 0xf8, 0xc0, 0x95, 0xbf, 0xbf, 0xe4, + 0xf3, 0xcc, 0xbf, 0xe4, 0xbd, 0xcc, 0xce, 0xce, + 0xbd, 0xaf, 0xaf, + 0x8c, 0x67, 0xe8, 0xa3, 0xc9, 0xf0, 0x96, 0xd9, + 0x77, 0x42, 0xa0, 0xb3, 0x1, 0x1, 0x5a, 0xb8, + 0xa8, 0xe8, 0x90, 0xc6, 0xc6, 0xf9, 0x40, 0x90, + 0x81, 0x9f, 0x53, 0x22, 0x52, 0x66, 0x52, 0x94, + 0x55, 0xd3, 0x87, 0xa6, 0x67, 0x6d, 0xda, 0x16, + 0x29, 0xd3, 0x4d, 0xb5, 0x24, 0x58, 0xa6, 0x96, + 0x2f, 0xad, 0x73, 0x63, 0xe, 0xd5, 0x1b, 0x89, + 0x6e, 0x77, 0x42, 0x42, 0x42, 0x67, 0x2f, 0x8f, + 0xd5, 0xd7, 0xd7, 0xd7, 0x19, 0x6e, 0xe, 0x1b, + 0x42, 0x50, 0x79, 0x1b, 0xe, 0xc5, 0xa5, 0x1b, + 0xd2, 0x8c, 0xa, 0xa, 0xd1, 0xb5, 0x5e, 0xe3, + 0xac, 0xf2, 0x76, 0x76, 0x0, 0x23, 0xd1, 0x23, + 0x45, 0xc3, 0xb3, 0x5, 0x5, 0x82, 0x82, 0x4d, + 0x16, 0x82, 0x29, 0x6d, 0xda, 0xbe, 0xd1, 0x23, + 0x23, 0xa, 0xd1, 0xa, 0x1c, 0x82, 0xb3, 0xe7, + 0x8f, 0xe8, 0xe8, 0xe8, 0x8b, 0xcb, 0x48, 0x33, + 0x33, 0x33, 0x3c, 0xc, 0xc, 0xf, 0xf, 0x92, + 0x3c, 0xc, 0x5f, 0x56, 0x3f, 0xc1, 0xc, 0xaa, + 0xaa, 0xb7, 0x92, 0x2b, 0x2b, 0xc1, 0x38, 0x88, + 0xf6, 0x8b, 0x2c, 0xd3, 0x4d, 0x29, 0x78, 0x76, + 0xd1, 0x76, 0x23, 0x23, 0x23, 0xa, 0xd1, 0xa, + 0x76, 0x78, 0x61, 0x61, 0x17, 0x17, 0x17, 0xb6, + 0x17, 0xb3, 0x29, 0xd1, 0x62, 0x29, 0x16, 0x23, + 0x16, 0x45, 0xa0, 0x87, 0x65, 0x5, 0x29, 0x82, + 0x82, 0x45, 0x45, 0x45, 0x45, 0x5, 0x3b, 0xda, + 0x6d, 0x1c, 0xb5, 0xb5, 0x78, 0x41, 0x8, 0x60, + 0xd2, 0x6e, 0xd5, 0x4a, 0x6e, 0x19, 0x4a, 0x19, + 0x4a, 0x4a, 0x4a, 0xe, 0xa5, 0xd2, 0x96, 0x73, + 0x8, 0x89, 0x63, 0x19, 0x1b, 0x1b, 0x1b, 0x42, + 0x67, 0x89, 0x6e, 0x77, 0xa5, 0xe, 0x19, 0x63, + 0x63, 0x63, 0x63, 0x63, 0x63, 0x89, 0x5, 0x8a, + 0x62, 0xd1, 0x78, 0x78, 0xd1, 0xd1, 0x41, 0xb5, + 0xe3, 0x24, 0xad, 0xa5, 0xa5, 0x60, 0x50, 0x2c, + 0xab, 0xab, 0x87, 0x2f, 0xa5, 0xef, 0x9c, 0xed, + 0x9c, 0x93, 0xe4, 0x9c, 0x97, 0x47, 0xdd, 0x12, + 0x97, 0x1e, 0xdd, 0x93, 0x4, 0x93, 0x81, 0x9c, + 0x97, 0xdd, 0xe4, 0x93, 0x97, 0x9d, 0x40, 0x47, + 0x5d, 0x2c, 0x1, 0x8, 0x5b, 0x89, 0x73, 0x89, + 0x63, 0x2f, 0xf1, 0x2f, 0x2f, 0x8c, 0xd3, 0x87, + 0x2f, 0xa8, 0x60, 0x8f, 0xe5, 0x4, 0x47, 0x6c, + 0x6b, 0x8b, 0x22, 0x50, 0x2c, 0x52, 0x66, 0x29, + 0x4d, 0x62, 0x6d, 0x58, 0xa0, 0x8, 0x67, 0x58, + 0x5, 0x87, 0x82, 0xe3, 0x87, 0xc3, 0x59, 0x7a, + 0xb1, 0xce, 0x97, 0xe5, 0x6b, 0x9, 0x97, 0x4, + 0x97, 0xed, 0xfd, 0x6f, 0x93, 0xe4, 0xc0, 0x9c, + 0xc0, 0xe4, 0x93, 0x97, 0xf5, 0xdf, 0xdd, 0x8e, + 0xfd, 0xb1, 0xce, 0x99, 0x47, 0xf3, 0xc0, 0x97, + 0x6f, 0x6f, 0x4, + 0xb3, 0x67, 0x42, 0xc5, 0x2f, 0x87, 0x5b, 0x2f, + 0x2f, 0x5a, 0xe7, 0x2f, 0xa6, 0x2f, 0xd9, 0xd9, + 0xe8, 0xae, 0x83, 0xd8, 0x32, 0xfd, 0x9c, 0x9b, + 0x3a, 0x3a, 0x27, 0xe8, 0x67, 0x8a, 0xb3, 0xb3, + 0x66, 0x4d, 0xbe, 0xe3, 0x55, 0x76, 0xd3, 0xd3, + 0x55, 0x55, 0x58, 0x89, 0x89, 0x5b, 0x1b, 0xd5, + 0x42, 0x8, 0x89, 0x6e, 0x79, 0x2c, 0xd2, 0x19, + 0x6e, 0x6e, 0x6e, 0x63, 0x63, 0x89, 0x89, 0x63, + 0x19, 0xe9, 0xc5, 0xd5, 0xd2, 0x2c, 0x79, 0x19, + 0x19, 0xd2, 0x63, 0x63, 0x63, 0x63, 0x42, 0xf1, + 0x58, 0xe3, 0xd1, 0xa, 0xd1, 0x78, 0xd3, 0xd3, + 0xd3, 0xa, 0xd1, 0x23, 0x0, 0x23, 0x23, 0x23, + 0x29, 0x6d, 0xa, 0x6d, 0x82, 0x29, 0x82, 0xda, + 0x5, 0x45, 0x3b, 0x3b, 0x3b, 0x29, 0x23, 0x23, + 0xa, 0x76, 0x23, 0xd1, 0xda, 0xb5, 0x5, 0x73, + 0x1b, 0xd5, 0xe9, 0xc5, 0xc5, 0x3e, 0x1d, 0x52, + 0x1d, 0xf, 0xf, 0x5f, 0xc1, 0xc1, 0x92, 0x5f, + 0xc1, 0xaa, 0xc, 0x5f, 0xaa, 0xb7, 0xaa, 0xc, + 0x5f, 0xaa, 0x56, 0x33, 0xd, 0x90, 0xe1, 0xc6, + 0xd8, 0xc5, 0x67, 0x66, 0x76, 0xa, 0xd1, 0x23, + 0x23, 0xd1, 0x34, 0xd1, 0x76, 0x16, 0x4d, 0x78, + 0x37, 0xbe, 0x4d, 0x37, 0x61, 0x65, 0x17, 0x55, + 0x55, 0x82, 0x4d, 0xd1, 0xa, 0x29, 0x16, 0xd1, + 0x29, 0x3b, 0x87, 0x4d, 0x6d, 0xda, 0x87, 0x24, + 0x87, 0x45, 0x5b, 0x30, 0xa4, 0x45, 0x45, 0x1c, + 0x78, 0x62, 0x78, 0x76, 0x62, 0x1c, 0x41, 0x58, + 0x67, 0x79, 0x6e, 0xd5, 0xd5, 0x19, 0x19, 0x19, + 0x63, 0x4a, 0x4a, 0xd2, 0x73, 0xf1, 0xd2, 0x79, + 0x30, 0xf0, 0x19, 0x63, 0x19, 0x63, 0x6e, 0x1b, + 0x89, 0xd2, 0x4a, 0x42, 0x2f, 0x79, 0x63, 0x63, + 0x79, 0x89, 0x89, 0x6e, 0xd2, 0xf1, 0xf1, 0x5, + 0x1c, 0x16, 0x29, 0x62, 0xd1, 0xd1, 0x78, 0x78, + 0xd3, 0x82, 0xb3, 0xc3, 0x1, 0x52, 0x2c, 0x52, + 0x94, 0xbe, 0x8c, 0x42, 0x6e, 0xd9, 0xca, 0x9c, + 0x4, 0xff, 0xd8, 0x99, 0xe5, 0x9d, 0xe4, 0xf3, + 0x6f, 0x99, 0xf3, 0x93, 0x4, 0x32, 0x99, 0xca, + 0x97, 0xd8, 0x57, 0x1e, 0x6b, 0x83, 0xd8, 0x47, + 0x19, 0x67, 0x87, 0x8, 0xd2, 0x2f, 0x67, 0xa0, + 0x5b, 0x2f, 0x1, 0x2f, 0x8, 0x87, 0x87, 0x79, + 0x1b, 0x5a, 0xc9, 0x6e, 0xe5, 0x36, 0x9d, 0x7c, + 0xef, 0xcb, 0xd6, 0x3e, 0x4f, 0xd4, 0xb3, 0x58, + 0x58, 0xb5, 0xa, 0x1c, 0x58, 0xab, 0xab, 0xb5, + 0x65, 0xa7, 0x87, 0xc3, 0xe8, 0xc2, 0xc2, 0x6b, + 0xde, 0xe1, 0xd8, 0x27, 0x7d, 0xde, 0xde, 0x9d, + 0x12, 0xdf, 0xf5, 0xc0, 0x12, 0xb4, 0xc6, 0x9c, + 0xe4, 0xbf, 0xf3, 0xf3, 0xf5, 0xf3, 0xc4, 0xc4, + 0xd8, 0xbf, 0xcc, 0xdf, 0xc0, 0xe4, 0xe4, 0xc0, + 0x26, 0x9c, 0xf3, + 0x42, 0x73, 0x5b, 0x73, 0x8c, 0x58, 0x8, 0x67, + 0x8c, 0x2f, 0x63, 0xd2, 0x42, 0x1b, 0x1b, 0x8f, + 0xd5, 0xd5, 0x47, 0x36, 0xe5, 0x3, 0xfd, 0xfd, + 0x77, 0xa5, 0xd5, 0xe, 0xe, 0x8, 0x30, 0xb3, + 0xb5, 0xe3, 0x29, 0xb5, 0x62, 0x29, 0x4d, 0xd3, + 0x24, 0x82, 0x89, 0x19, 0xd5, 0x63, 0x6e, 0xd4, + 0xa5, 0x8, 0x2, 0x6e, 0x2f, 0xda, 0x79, 0x63, + 0x19, 0x63, 0x19, 0x19, 0x19, 0x19, 0x6e, 0x63, + 0x63, 0xd2, 0xe9, 0x19, 0x79, 0x67, 0xf1, 0x19, + 0x19, 0x19, 0x6e, 0x89, 0x19, 0x63, 0xf1, 0x30, + 0x8a, 0xa, 0x23, 0xd1, 0x62, 0x78, 0xb5, 0x2f, + 0x67, 0xd3, 0xd1, 0xa, 0x23, 0x23, 0x23, 0x23, + 0x6d, 0x6d, 0x6d, 0xda, 0x68, 0x87, 0x82, 0x45, + 0x45, 0x30, 0x58, 0x5, 0x5, 0x29, 0xa, 0xd1, + 0x23, 0x23, 0x23, 0xa, 0x78, 0x6d, 0x87, 0xa4, + 0x5b, 0xd2, 0xe, 0x5d, 0xa5, 0xa1, 0x52, 0x52, + 0x3f, 0x1d, 0xb7, 0x2f, 0x5c, 0xa2, 0x2b, 0xaa, + 0x56, 0xaa, 0x5f, 0xc, 0x5f, 0x1f, 0xb7, 0xb6, + 0x92, 0x3c, 0xaa, 0x33, 0x5c, 0xcb, 0x75, 0x57, + 0x9f, 0x4e, 0x64, 0xd3, 0xac, 0x76, 0xd1, 0x23, + 0x76, 0xd1, 0x78, 0x76, 0xa, 0x6d, 0x37, 0x55, + 0x17, 0x55, 0x52, 0xbe, 0x52, 0x1d, 0xb7, 0x55, + 0x61, 0x1, 0x4d, 0x23, 0x76, 0x62, 0x62, 0x62, + 0x29, 0x82, 0x29, 0x6d, 0xda, 0xa0, 0x45, 0x16, + 0x3b, 0xa0, 0xa0, 0xb3, 0xa4, 0x45, 0x3b, 0x29, + 0xa, 0xa, 0x29, 0xa, 0xa, 0x62, 0x29, 0x41, + 0x87, 0x8, 0xe7, 0xe8, 0xe9, 0x1b, 0xc2, 0xd5, + 0xd5, 0xd5, 0x19, 0xe, 0x89, 0xf0, 0xe, 0x2f, + 0x58, 0xa0, 0x63, 0xe, 0x77, 0xe, 0x1b, 0x1b, + 0x63, 0xd5, 0x19, 0xd5, 0x73, 0x42, 0xd2, 0x2, + 0x67, 0x89, 0x63, 0x1b, 0x79, 0xa5, 0xa5, 0x2f, + 0x30, 0x1c, 0x41, 0x41, 0x62, 0xa, 0xd1, 0x62, + 0x76, 0x4d, 0x65, 0xa7, 0x1f, 0x1d, 0x3f, 0x49, + 0x65, 0x82, 0xb3, 0x96, 0x8f, 0x39, 0xca, 0xde, + 0xde, 0x57, 0xf6, 0x9c, 0x9c, 0xde, 0xb4, 0xbf, + 0xc0, 0xf5, 0xe4, 0xf3, 0xf3, 0xf8, 0xb2, 0x81, + 0xc6, 0x57, 0x57, 0xe1, 0x9c, 0xc6, 0xe1, 0x1e, + 0x27, 0x59, 0x8c, 0x67, 0x2f, 0x8c, 0x87, 0x30, + 0x8, 0x67, 0xa8, 0x5a, 0x5b, 0xb3, 0xc3, 0xd4, + 0x35, 0xe8, 0xd4, 0xfb, 0x83, 0x7, 0xdb, 0x88, + 0x39, 0x81, 0x9f, 0x74, 0x9d, 0x8b, 0xc5, 0x2, + 0x21, 0x58, 0x62, 0x29, 0xe3, 0x5e, 0xac, 0x5e, + 0x65, 0x65, 0x52, 0x22, 0x8b, 0x90, 0x83, 0x1e, + 0xe1, 0xb4, 0x75, 0x18, 0x90, 0x81, 0xb4, 0xe1, + 0xbf, 0xe4, 0xe4, 0xbf, 0xaf, 0xe2, 0xaf, 0xb4, + 0xbf, 0xbf, 0xbf, 0xe4, 0xe1, 0xe4, 0xe4, 0xbf, + 0xaf, 0xf4, 0xf4, 0xe4, 0xe4, 0xcc, 0x95, 0xbf, + 0xcc, 0x81, 0xce, + 0xa5, 0x2f, 0x30, 0xb3, 0x58, 0x5, 0xf1, 0x8, + 0xda, 0xf1, 0x63, 0x19, 0x7a, 0x96, 0x96, 0x27, + 0xc5, 0x3a, 0x1e, 0x39, 0xd5, 0x3, 0x1e, 0x36, + 0xe5, 0xd5, 0x6c, 0x77, 0xa5, 0x8c, 0x24, 0xd3, + 0xe3, 0xe3, 0xe3, 0xe3, 0x78, 0x1c, 0xe3, 0x4d, + 0xb5, 0x82, 0x2f, 0xa5, 0x7a, 0xa5, 0x1b, 0x63, + 0x5b, 0x2f, 0xe, 0x6e, 0xa6, 0x42, 0xd2, 0x19, + 0xd2, 0x1b, 0x19, 0x19, 0x4a, 0x4a, 0xd2, 0x19, + 0x63, 0x4a, 0xd5, 0x4a, 0x63, 0xf1, 0x42, 0x6e, + 0x19, 0x63, 0x19, 0x19, 0x19, 0x79, 0x67, 0x58, + 0x8a, 0xa, 0xd1, 0x62, 0x62, 0xd1, 0xa, 0x41, + 0xd3, 0x62, 0x23, 0x23, 0x23, 0x23, 0xa, 0x16, + 0x45, 0x45, 0x5, 0x45, 0xa0, 0x3b, 0x16, 0x3b, + 0x82, 0x24, 0x4d, 0x37, 0x6d, 0xa, 0x4d, 0xa, + 0x16, 0x23, 0x23, 0xd1, 0x78, 0xa, 0xa, 0x82, + 0x87, 0x41, 0x8c, 0x2f, 0xc9, 0xd4, 0xc7, 0x3e, + 0x7c, 0x88, 0xc7, 0xa1, 0x51, 0x48, 0xc, 0x5f, + 0xb6, 0x1f, 0x5f, 0x5f, 0xf, 0xb7, 0xb7, 0xf, + 0x3c, 0x80, 0x3f, 0x3f, 0x22, 0x74, 0x57, 0xba, + 0xdc, 0x1d, 0xab, 0x66, 0x37, 0x29, 0x4d, 0x78, + 0x76, 0xd1, 0x23, 0x76, 0xf2, 0xf2, 0x61, 0x66, + 0x17, 0x1f, 0x9e, 0x56, 0x3f, 0xeb, 0x7e, 0x49, + 0x52, 0x64, 0x66, 0x76, 0x76, 0x23, 0x23, 0x76, + 0x37, 0x82, 0x5, 0xda, 0xa4, 0xa0, 0xa4, 0xda, + 0x1c, 0x5, 0xda, 0x29, 0x82, 0xda, 0x6, 0x78, + 0x78, 0x6d, 0xa, 0x62, 0x62, 0x8a, 0x41, 0x82, + 0xd3, 0xa6, 0x21, 0xc3, 0x67, 0xf0, 0xd5, 0x77, + 0x35, 0x8f, 0xd5, 0xd9, 0xa5, 0x5d, 0xc5, 0x79, + 0x67, 0xf1, 0xc2, 0xd5, 0x1b, 0x6e, 0xd7, 0x8f, + 0x77, 0xd5, 0xe5, 0xef, 0x19, 0xe9, 0x6e, 0x1b, + 0x8, 0xf1, 0x63, 0x19, 0x2f, 0x42, 0xd5, 0x6e, + 0x79, 0xf1, 0x2f, 0x24, 0xac, 0x76, 0x76, 0xd1, + 0xd1, 0x37, 0x66, 0xa6, 0x1f, 0xb8, 0x22, 0x91, + 0xab, 0xab, 0x52, 0x59, 0x4f, 0x88, 0x53, 0xc6, + 0xe1, 0xc6, 0xe1, 0xb4, 0xb4, 0xe4, 0xb4, 0xbb, + 0xe4, 0xe1, 0x7, 0x7, 0x86, 0xe1, 0x74, 0x81, + 0xb4, 0xe1, 0xc6, 0xb4, 0xdd, 0xc6, 0x57, 0x18, + 0x3e, 0x2c, 0xa7, 0x87, 0xa0, 0x30, 0x67, 0x79, + 0x8, 0x1, 0xa6, 0x89, 0x2f, 0xab, 0x65, 0x9e, + 0x4f, 0x2a, 0x48, 0x51, 0x90, 0x18, 0x90, 0x86, + 0xbd, 0xc6, 0xd8, 0x1e, 0x1e, 0x3, 0x5d, 0x1, + 0x8c, 0xb5, 0x1c, 0x41, 0x58, 0x68, 0x87, 0x82, + 0x65, 0xa7, 0x87, 0xc9, 0x88, 0xd8, 0x75, 0x53, + 0xf6, 0xf9, 0x90, 0x83, 0xde, 0xc6, 0x81, 0x81, + 0xc6, 0xbf, 0xbf, 0xbf, 0x4b, 0xbf, 0xe4, 0xdd, + 0xbf, 0x95, 0xe4, 0xc0, 0xe4, 0xb4, 0xaf, 0x95, + 0x4b, 0xcc, 0xcc, 0xaf, 0xde, 0xc6, 0xf9, 0xb1, + 0xfd, 0xf5, 0x9c, + 0x49, 0x49, 0x4e, 0xc9, 0xc7, 0xd2, 0xd5, 0x6e, + 0x89, 0x73, 0xd9, 0xa9, 0x4e, 0xa8, 0x7f, 0x83, + 0x74, 0x18, 0x81, 0xbd, 0x1e, 0xdd, 0x81, 0xf8, + 0x1e, 0xa9, 0x91, 0x2c, 0x66, 0x5e, 0x61, 0x37, + 0x4d, 0xac, 0xab, 0x82, 0x29, 0xda, 0xb3, 0x87, + 0xb5, 0x8c, 0x67, 0x67, 0x67, 0xe7, 0x77, 0x6e, + 0xd5, 0x19, 0xd5, 0x8f, 0x19, 0x6e, 0xe, 0xe, + 0xe, 0x19, 0x11, 0x8f, 0xd5, 0x19, 0x6e, 0xc2, + 0x6e, 0xd5, 0xef, 0xef, 0x19, 0x6e, 0x63, 0x19, + 0x4a, 0x79, 0xc5, 0x63, 0x79, 0xa5, 0x79, 0x89, + 0x41, 0xa, 0xa, 0x8a, 0x41, 0xd3, 0x41, 0xd3, + 0x5e, 0xd1, 0x0, 0x23, 0x0, 0x23, 0x23, 0x3b, + 0x45, 0x45, 0x5, 0xda, 0x5, 0xda, 0x4d, 0x4d, + 0x4d, 0xd1, 0xa, 0x16, 0x76, 0x76, 0x62, 0x6d, + 0x16, 0xa, 0x23, 0xa, 0x23, 0xd1, 0x76, 0x78, + 0x4d, 0x4d, 0xe3, 0xb3, 0xe, 0x8f, 0xc5, 0x27, + 0x8b, 0x8b, 0x91, 0x91, 0x92, 0x92, 0xb7, 0xb6, + 0x5f, 0xf, 0xb6, 0xb6, 0x5f, 0x3c, 0x5f, 0xf, + 0xb7, 0x5f, 0xaa, 0xc, 0x80, 0xa2, 0xf6, 0xcb, + 0xa2, 0x22, 0x94, 0x61, 0x37, 0x76, 0x76, 0x37, + 0x76, 0x76, 0xd1, 0x37, 0xac, 0xbe, 0x82, 0x65, + 0x1d, 0xdc, 0x88, 0xc1, 0x56, 0x3c, 0x80, 0xc, + 0x5f, 0xf, 0x1f, 0x66, 0xf2, 0xf2, 0x76, 0x76, + 0x78, 0xf2, 0x78, 0x76, 0x29, 0x4d, 0x29, 0x6d, + 0x4d, 0x68, 0x5, 0x5, 0x45, 0xa0, 0xda, 0x16, + 0x62, 0xa, 0x76, 0x29, 0xa, 0xb5, 0x29, 0x4d, + 0x58, 0x60, 0x96, 0xa0, 0xa0, 0x63, 0x6e, 0x2f, + 0x8, 0x8, 0x2f, 0x67, 0x2f, 0x8, 0x4c, 0x89, + 0x63, 0x63, 0x4a, 0x6e, 0x1b, 0x19, 0xc2, 0x2f, + 0xd2, 0x96, 0x1b, 0xe, 0xe7, 0x42, 0x1b, 0x89, + 0x89, 0x63, 0x4a, 0x19, 0x89, 0x42, 0x63, 0xd2, + 0x58, 0xd3, 0x65, 0xac, 0x4d, 0x78, 0x76, 0xa, + 0x6d, 0x5e, 0x1, 0x2f, 0x1, 0xa7, 0x1f, 0x52, + 0xac, 0x4d, 0x82, 0x8c, 0x2f, 0x27, 0x1e, 0xde, + 0x7d, 0x99, 0xf8, 0x32, 0x4, 0x32, 0x88, 0xfd, + 0x9c, 0xde, 0x9f, 0x90, 0x7d, 0xaf, 0xc6, 0x93, + 0x9c, 0x99, 0xf5, 0x8e, 0x4, 0x9d, 0x48, 0x49, + 0x52, 0x6, 0xa7, 0xb3, 0xa0, 0x73, 0x1b, 0xd2, + 0x79, 0x30, 0x58, 0x8c, 0x6d, 0xd3, 0x24, 0x8c, + 0x60, 0xe8, 0x8b, 0x6b, 0xe5, 0x7d, 0xca, 0x6c, + 0x47, 0x2e, 0x27, 0x77, 0xa5, 0xd5, 0xa5, 0x1, + 0x58, 0xe3, 0x24, 0x2f, 0xad, 0xa0, 0xa0, 0x67, + 0x60, 0x60, 0x60, 0xa8, 0x7c, 0xbd, 0xc4, 0x47, + 0x47, 0x99, 0x9c, 0x4, 0x97, 0xde, 0x99, 0xe5, + 0xfd, 0x95, 0x32, 0x9c, 0x99, 0xc0, 0xf3, 0x97, + 0xc0, 0xb4, 0xf5, 0x4, 0x32, 0xc0, 0xdd, 0x97, + 0x6f, 0x83, 0xbd, 0x93, 0x4, 0xf5, 0xf5, 0x4, + 0x4, 0x4, 0x28, + 0xc3, 0x60, 0xd9, 0x50, 0x2f, 0xb3, 0xc9, 0xd2, + 0x7a, 0x2f, 0x59, 0xd4, 0xd4, 0xae, 0x8b, 0x81, + 0x39, 0x90, 0xc6, 0x81, 0xbd, 0x1e, 0x8b, 0x1e, + 0x3, 0x50, 0x2c, 0xab, 0xe3, 0x78, 0x78, 0x76, + 0x62, 0x4d, 0x78, 0x82, 0xa, 0x6d, 0x82, 0x24, + 0xb5, 0x67, 0x2f, 0x73, 0x73, 0x89, 0xd2, 0x19, + 0xe7, 0x96, 0xd4, 0x6e, 0xc5, 0xa5, 0x60, 0x89, + 0x1b, 0x19, 0x19, 0x19, 0x63, 0x1b, 0x6e, 0xd2, + 0x2f, 0x60, 0xf0, 0x6e, 0xd2, 0xc5, 0xa5, 0x4a, + 0xe, 0x19, 0x19, 0x63, 0x63, 0x42, 0x73, 0x8, + 0x58, 0x62, 0x23, 0xa, 0xac, 0xb5, 0xd3, 0xd3, + 0x76, 0xd1, 0x23, 0x23, 0x23, 0x23, 0x23, 0x16, + 0x16, 0x6d, 0x1c, 0x29, 0x6d, 0x82, 0x76, 0x4d, + 0x16, 0x29, 0xa, 0x78, 0xa, 0x23, 0xa, 0x29, + 0xd1, 0x23, 0x23, 0x23, 0x23, 0xa, 0x78, 0x37, + 0xe3, 0x4d, 0x6d, 0x58, 0x8, 0x2f, 0xa5, 0x60, + 0x50, 0xe8, 0x50, 0x2c, 0xb8, 0x59, 0xa6, 0x92, + 0x92, 0x92, 0xb6, 0xb6, 0xb7, 0x92, 0xc, 0x5f, + 0xf, 0xb7, 0xaa, 0x3c, 0xdc, 0xcb, 0xf6, 0x57, + 0x53, 0x91, 0xab, 0xac, 0x5e, 0x78, 0x78, 0x76, + 0x76, 0x76, 0x23, 0x4d, 0x66, 0x87, 0x68, 0xc3, + 0x1d, 0x80, 0x80, 0x92, 0xb7, 0x56, 0x3c, 0xc, + 0xc, 0x56, 0x9e, 0x9e, 0xb6, 0x52, 0x66, 0x78, + 0x37, 0x76, 0x76, 0xd1, 0x76, 0xd1, 0x29, 0x29, + 0x16, 0x65, 0x45, 0x5, 0x45, 0xa0, 0xa4, 0x16, + 0xa, 0x23, 0x23, 0x6d, 0x62, 0xa, 0x29, 0x6d, + 0x58, 0xf1, 0x1b, 0x5b, 0x89, 0x89, 0x63, 0x63, + 0x73, 0x68, 0x58, 0x58, 0x67, 0x42, 0x1b, 0x42, + 0x63, 0x63, 0x4a, 0x4a, 0x63, 0x63, 0x63, 0x19, + 0x89, 0x63, 0x63, 0x6e, 0x79, 0x63, 0x63, 0x89, + 0x63, 0x19, 0x4a, 0x4a, 0x63, 0xd2, 0xd2, 0x63, + 0xf1, 0x5, 0x58, 0x29, 0xd1, 0xd1, 0xd1, 0x76, + 0x6d, 0x4d, 0xab, 0xa8, 0x49, 0x52, 0x52, 0x52, + 0xac, 0xbe, 0x4d, 0x82, 0x8c, 0xd5, 0x1e, 0xdd, + 0x9c, 0xf5, 0x57, 0xd8, 0x4, 0x7b, 0x90, 0x97, + 0x97, 0x93, 0xc6, 0xc0, 0x97, 0xf3, 0xe4, 0xde, + 0x97, 0xf5, 0xd8, 0xfd, 0x47, 0xd8, 0x2a, 0x3e, + 0x2f, 0x8c, 0xb3, 0xb3, 0x8c, 0x30, 0x2f, 0x2f, + 0x2f, 0x67, 0x58, 0xb5, 0x82, 0x3b, 0x30, 0x96, + 0x1b, 0x27, 0x1e, 0x1e, 0x9c, 0xce, 0x2e, 0x9d, + 0x9d, 0xd8, 0x6b, 0x77, 0xd5, 0x4a, 0xe, 0x2f, + 0x41, 0xb5, 0xe3, 0x24, 0x1, 0x59, 0x60, 0x91, + 0x91, 0x51, 0x6b, 0x6b, 0x1e, 0xe4, 0xdd, 0x9c, + 0x12, 0xf3, 0xdd, 0xff, 0xd8, 0xc6, 0xde, 0xd8, + 0x9f, 0xe1, 0xe4, 0xf3, 0x95, 0xbf, 0xe4, 0x12, + 0xbf, 0xf4, 0xf3, 0xde, 0x57, 0xc6, 0xc6, 0xbd, + 0xcc, 0xe1, 0xe4, 0xce, 0xaf, 0x12, 0xaf, 0xf3, + 0x26, 0x1e, 0x9b, + 0xc9, 0x42, 0x77, 0x2f, 0x24, 0x68, 0x67, 0x2f, + 0x1, 0x1, 0xa6, 0x96, 0x6e, 0x8f, 0x47, 0x81, + 0x6b, 0x6b, 0xd8, 0xde, 0x6c, 0x77, 0xe8, 0x27, + 0x19, 0x50, 0x1, 0x8c, 0xda, 0xb5, 0xe3, 0x6d, + 0x1c, 0xe3, 0x6d, 0xda, 0x6d, 0x62, 0x4d, 0x6d, + 0x6, 0x8, 0x42, 0x6e, 0x5b, 0x63, 0x6e, 0x63, + 0x42, 0x42, 0x2f, 0x42, 0x2f, 0x2f, 0x42, 0x96, + 0x1b, 0x63, 0x19, 0x19, 0x63, 0x89, 0x1b, 0x63, + 0x30, 0x30, 0x89, 0x89, 0x79, 0xe9, 0x79, 0xd2, + 0xd2, 0x19, 0x19, 0x63, 0x63, 0x89, 0xa0, 0x67, + 0x41, 0xa, 0xa, 0xa, 0xa, 0x78, 0xd3, 0xd3, + 0x29, 0xa, 0x23, 0x23, 0x23, 0x23, 0x23, 0xa, + 0x62, 0x29, 0x29, 0x29, 0x6d, 0x29, 0x1c, 0x16, + 0xb5, 0xda, 0x29, 0x62, 0xa, 0xd1, 0x76, 0xa, + 0x78, 0x23, 0x23, 0x23, 0x23, 0x23, 0xd1, 0x78, + 0x78, 0x78, 0x6d, 0xe3, 0x24, 0x58, 0xa0, 0x8, + 0x1b, 0xef, 0xd9, 0x77, 0x7f, 0xd4, 0xc7, 0x52, + 0x5f, 0x5f, 0xb6, 0xb6, 0xb6, 0x5f, 0x5f, 0xb6, + 0xf, 0xb7, 0x33, 0xd, 0xdc, 0xcb, 0x74, 0x53, + 0x2b, 0x91, 0x66, 0x61, 0xbe, 0x61, 0x76, 0x78, + 0x76, 0x78, 0x23, 0x62, 0xac, 0x55, 0x87, 0x52, + 0xf, 0x5f, 0x2b, 0xc, 0x5f, 0x1d, 0xc1, 0xd, + 0x3c, 0x3c, 0x38, 0x33, 0xaa, 0xf, 0xb6, 0x55, + 0x55, 0x37, 0xf2, 0x23, 0x76, 0x78, 0xd1, 0x76, + 0x6d, 0x3b, 0x82, 0x68, 0x68, 0x8a, 0x68, 0x8a, + 0x4d, 0x62, 0xa, 0x76, 0x29, 0x62, 0x1c, 0x62, + 0xe3, 0x67, 0x2f, 0x67, 0x5b, 0x8, 0x42, 0xe, + 0xa5, 0x2f, 0x79, 0xa0, 0x89, 0x63, 0x63, 0xf1, + 0x63, 0x63, 0x1b, 0x6e, 0x4a, 0xc5, 0x6e, 0x11, + 0x4a, 0x4a, 0xd7, 0x8f, 0xe9, 0x19, 0xd5, 0xf1, + 0x89, 0x19, 0xe, 0x77, 0x4a, 0xa5, 0xd2, 0x63, + 0xd2, 0xd2, 0x1, 0xe3, 0x62, 0x23, 0xd1, 0x23, + 0x78, 0x61, 0x66, 0x17, 0xa8, 0x3f, 0x92, 0x1f, + 0x8a, 0x87, 0x82, 0x87, 0xa6, 0x6e, 0x40, 0x57, + 0xde, 0x84, 0xbc, 0x8b, 0x85, 0xe4, 0xbf, 0xe4, + 0xe4, 0xc6, 0xbb, 0xbf, 0xbf, 0xbf, 0x57, 0xbc, + 0x81, 0xe4, 0x75, 0xe1, 0x1e, 0xd8, 0xc6, 0x8b, + 0x7f, 0xc9, 0xb3, 0x8c, 0x1c, 0x8c, 0xab, 0xd3, + 0xd3, 0xd3, 0x1, 0x66, 0xe3, 0xa4, 0x1b, 0x27, + 0x1e, 0x1e, 0x90, 0x9f, 0x57, 0x9a, 0x7, 0x74, + 0x40, 0x90, 0x36, 0xd7, 0xd5, 0xae, 0xf0, 0x14, + 0x8c, 0xe3, 0x4d, 0x82, 0x24, 0xa8, 0x4f, 0x7f, + 0xcb, 0x90, 0xc4, 0xc6, 0xe4, 0xb4, 0xc6, 0xc6, + 0xe1, 0x9a, 0x9, 0x9f, 0x53, 0x70, 0xe4, 0xe1, + 0xf9, 0x4b, 0xb4, 0xb4, 0xbb, 0xbf, 0xbf, 0xbf, + 0xe1, 0xcc, 0xf4, 0xe1, 0x9f, 0x90, 0x9f, 0x2e, + 0xbf, 0xbf, 0xcc, 0xfa, 0xf7, 0xaf, 0xb4, 0xb4, + 0x90, 0x51, 0x53, + 0x4f, 0x2c, 0x60, 0x7a, 0x2f, 0x8c, 0x8c, 0xe3, + 0x58, 0x5b, 0xa4, 0x8, 0x6e, 0xe5, 0xd8, 0xc4, + 0x8e, 0x47, 0xcf, 0x9d, 0x47, 0x27, 0x27, 0x3, + 0xe5, 0xc5, 0xa8, 0xab, 0x4d, 0x4d, 0xac, 0xd3, + 0xd3, 0xd3, 0x24, 0xd3, 0xb5, 0xda, 0x8a, 0xb5, + 0x5, 0x42, 0x6e, 0x19, 0x19, 0x63, 0xa5, 0x63, + 0x63, 0xd2, 0x1b, 0xd2, 0x89, 0x19, 0xd5, 0x79, + 0xf1, 0x6e, 0x19, 0x19, 0x19, 0x4a, 0x2f, 0xf1, + 0x73, 0x63, 0x4a, 0x19, 0x63, 0x89, 0x19, 0xe9, + 0xf1, 0xe9, 0xe, 0x63, 0x63, 0xd2, 0xf1, 0x41, + 0x8a, 0x1c, 0x16, 0x8a, 0x6d, 0x1c, 0xd3, 0x1a, + 0x62, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0xa, + 0x3b, 0x45, 0x5, 0x3b, 0x76, 0x62, 0xd1, 0xa, + 0x78, 0x76, 0x23, 0x76, 0x76, 0x23, 0x76, 0x37, + 0xd1, 0x23, 0x23, 0xd1, 0x23, 0x23, 0xa, 0x23, + 0x76, 0x78, 0x4d, 0x76, 0x4d, 0x87, 0xa0, 0xf0, + 0xef, 0x8b, 0xfb, 0xe8, 0xdb, 0x91, 0xb6, 0xf, + 0xf, 0x5f, 0xf, 0xf, 0xb6, 0xf, 0xb7, 0x5f, + 0x5f, 0x5f, 0x33, 0x33, 0x2b, 0xba, 0xbc, 0xba, + 0x80, 0x5f, 0xf, 0x52, 0x1f, 0x37, 0x76, 0x76, + 0x76, 0x76, 0xd1, 0x76, 0x61, 0x61, 0x55, 0xf, + 0x56, 0x56, 0xd, 0xd, 0x80, 0x2b, 0xd, 0x38, + 0x80, 0x2b, 0xb, 0x92, 0x5f, 0xf, 0xb7, 0xb6, + 0xb6, 0x61, 0x61, 0x29, 0x4d, 0x76, 0x78, 0x16, + 0x4d, 0x37, 0x29, 0xbe, 0x37, 0x66, 0x37, 0x61, + 0x37, 0x37, 0xa, 0xa, 0x29, 0x1c, 0x29, 0x1c, + 0x3b, 0x41, 0x24, 0xa6, 0x96, 0xb3, 0xb3, 0x60, + 0x6e, 0xd5, 0xd4, 0x1b, 0x1b, 0x63, 0x63, 0x19, + 0x4a, 0x89, 0x2f, 0xa5, 0x8f, 0xef, 0xef, 0xc5, + 0xd5, 0x8f, 0xd7, 0x7d, 0x6e, 0x6e, 0x77, 0x42, + 0x63, 0xa5, 0xe9, 0x2f, 0xc5, 0x8f, 0xd5, 0xe8, + 0x1b, 0xe9, 0x2f, 0x24, 0x1c, 0x29, 0xa, 0xd1, + 0x78, 0x76, 0x61, 0x66, 0x64, 0x4f, 0x91, 0x1d, + 0x64, 0x87, 0x65, 0xa8, 0xa5, 0xd4, 0x4f, 0x53, + 0x81, 0xb4, 0x4b, 0x90, 0xca, 0xe4, 0xf4, 0xb4, + 0xc4, 0x39, 0x4b, 0xbc, 0x9a, 0xc6, 0xf6, 0x39, + 0xd8, 0xde, 0xe1, 0xc6, 0x99, 0xc6, 0x84, 0xdb, + 0x98, 0x4e, 0x52, 0xab, 0x8c, 0xa6, 0xb3, 0x82, + 0xe3, 0x24, 0xab, 0x5e, 0x8a, 0x68, 0xc9, 0x3e, + 0x3a, 0x9f, 0x90, 0x88, 0x9d, 0x86, 0xe1, 0x1e, + 0x7d, 0x47, 0x4, 0xd5, 0x5a, 0x1, 0xb3, 0x1, + 0xd3, 0xa7, 0x87, 0xa4, 0xa6, 0xc2, 0x39, 0x7b, + 0x99, 0x90, 0xde, 0xde, 0x81, 0x9a, 0xdf, 0x9c, + 0x9f, 0x84, 0xb4, 0xf5, 0x99, 0xf5, 0xe4, 0xf3, + 0x8d, 0x81, 0x81, 0xc0, 0xe4, 0xb4, 0xc6, 0xdf, + 0xc6, 0xe1, 0xe4, 0xf3, 0xf5, 0xdf, 0xc4, 0xed, + 0xc0, 0xbf, 0xf7, 0xce, 0xcc, 0xb4, 0x57, 0x26, + 0x86, 0x7d, 0xca, + 0xb, 0x91, 0x3f, 0x4e, 0x6e, 0xe, 0xe9, 0x30, + 0xa0, 0xf0, 0xb8, 0xa8, 0xd9, 0x88, 0xdb, 0x70, + 0xe1, 0xe1, 0xf6, 0x90, 0x90, 0xde, 0xc6, 0x81, + 0x7c, 0x4e, 0x49, 0x61, 0x76, 0xd1, 0x76, 0x61, + 0x52, 0x59, 0x52, 0x82, 0x68, 0x5b, 0x67, 0xb3, + 0x30, 0x96, 0xa5, 0x77, 0x6e, 0x6e, 0xa5, 0x59, + 0x79, 0x8f, 0xef, 0xd5, 0x1b, 0x1b, 0xd5, 0xe, + 0x42, 0x1b, 0xc9, 0xa5, 0x79, 0x8f, 0x21, 0x65, + 0x2f, 0xe, 0xe5, 0xef, 0xef, 0x19, 0x6e, 0xd2, + 0x42, 0xd2, 0xc2, 0xd2, 0x19, 0x19, 0x1b, 0x67, + 0x3b, 0x1c, 0x5, 0x67, 0x2f, 0xd3, 0x4d, 0xa, + 0x76, 0x34, 0x23, 0x0, 0x23, 0xd1, 0xa, 0x29, + 0x1c, 0x5, 0xda, 0x29, 0xa, 0xa, 0x29, 0x78, + 0x76, 0x37, 0x78, 0xf2, 0x76, 0x76, 0xf2, 0x66, + 0xf2, 0x34, 0x76, 0xa, 0xd1, 0xa, 0x78, 0xd1, + 0xd1, 0x78, 0x4d, 0x37, 0x76, 0x76, 0x58, 0xa6, + 0x50, 0x4e, 0x59, 0xa6, 0xf, 0xf, 0x2c, 0x1f, + 0xb6, 0xb7, 0x56, 0x5f, 0x5f, 0xb7, 0xb7, 0xf, + 0xc, 0xc, 0xaa, 0xb6, 0x56, 0x2b, 0xa2, 0x18, + 0x22, 0x9e, 0xae, 0x22, 0xf, 0x61, 0xf2, 0x37, + 0xf2, 0x76, 0x76, 0x37, 0x37, 0xbe, 0xc3, 0x7e, + 0x7f, 0x5c, 0x88, 0xcb, 0xea, 0x2b, 0x3c, 0xaa, + 0x92, 0xc, 0x2b, 0x92, 0x56, 0x9e, 0x64, 0x22, + 0x92, 0xb6, 0xf2, 0xf2, 0xf2, 0x76, 0xd1, 0x76, + 0x37, 0xbe, 0xe3, 0xb3, 0xc3, 0xc3, 0x6d, 0xda, + 0x82, 0x78, 0x23, 0x23, 0xa, 0xa, 0x78, 0x58, + 0x30, 0x5, 0x8, 0x1b, 0x1b, 0x5b, 0xa0, 0xa0, + 0x1b, 0x42, 0xf1, 0x63, 0x4a, 0x4a, 0xe9, 0x63, + 0x19, 0x6e, 0x1b, 0x89, 0x63, 0x19, 0x2f, 0x2f, + 0xe, 0x19, 0xe9, 0xe9, 0x63, 0x6e, 0x79, 0xe, + 0x19, 0x63, 0x4a, 0x1b, 0x63, 0x63, 0x2f, 0x67, + 0x89, 0x2f, 0x1, 0xd3, 0xb5, 0xd1, 0xa, 0x78, + 0x1c, 0xda, 0x4d, 0x4d, 0x58, 0xa5, 0x2f, 0xd3, + 0x37, 0xac, 0x66, 0xab, 0x1b, 0xd5, 0xca, 0x9c, + 0x6c, 0x93, 0xf3, 0xdf, 0x4, 0x93, 0x81, 0x9d, + 0x47, 0x9c, 0xde, 0x83, 0x4, 0x93, 0xdf, 0x4, + 0x4, 0x32, 0xdd, 0x8e, 0xfd, 0xde, 0xd8, 0x3e, + 0x2c, 0x60, 0x2f, 0x8c, 0x67, 0x89, 0x89, 0xa0, + 0x5, 0x5, 0x41, 0x4d, 0xbe, 0x82, 0x8c, 0x8c, + 0xa5, 0x6b, 0xb1, 0x4, 0x4, 0x9c, 0x32, 0xe5, + 0xd7, 0xd7, 0xd2, 0xa5, 0x8c, 0x8c, 0xa7, 0x82, + 0xab, 0xc3, 0xc2, 0x19, 0xd7, 0x6b, 0x4, 0x6f, + 0x47, 0x36, 0x32, 0x47, 0x3, 0x9f, 0xb1, 0x4, + 0xdd, 0xbd, 0x97, 0x4, 0x4, 0xbd, 0x32, 0x4, + 0x8e, 0xe1, 0x93, 0x97, 0xde, 0x81, 0x93, 0x97, + 0xc0, 0xe4, 0xf3, 0x93, 0xdd, 0xde, 0x2e, 0x97, + 0x6f, 0xf3, 0x70, 0x32, 0x97, 0xde, 0xdf, 0xff, + 0x93, 0x2e, 0xcd, + 0x83, 0x4f, 0x60, 0x59, 0xa5, 0xe, 0xf1, 0xa6, + 0xa4, 0xa6, 0xa8, 0x3e, 0x27, 0x8f, 0x7d, 0x1e, + 0x32, 0x32, 0xc6, 0xca, 0x6b, 0x4, 0xd8, 0x18, + 0x77, 0xa6, 0x24, 0x62, 0x29, 0x29, 0x29, 0x29, + 0x24, 0x8c, 0x65, 0x4d, 0xb5, 0x8c, 0x49, 0x1, + 0x2, 0x5b, 0x73, 0x79, 0x19, 0x19, 0x1b, 0x73, + 0x89, 0xd2, 0xa5, 0x79, 0x89, 0x6e, 0xe, 0xa5, + 0x79, 0x19, 0x1b, 0x63, 0x19, 0x6e, 0x42, 0x30, + 0x58, 0x42, 0x19, 0xd5, 0x19, 0xe, 0x63, 0xd2, + 0x19, 0x19, 0x4a, 0x63, 0x63, 0x19, 0x63, 0x67, + 0x1c, 0xa, 0x1c, 0x41, 0xd3, 0xd3, 0x5e, 0xe3, + 0xa, 0x62, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x78, 0xa, 0xd1, 0x23, 0x78, 0x29, 0x4d, + 0x78, 0x37, 0x87, 0x6d, 0x37, 0x37, 0x4d, 0x37, + 0x37, 0x78, 0x76, 0xd1, 0x78, 0x76, 0xa, 0x4d, + 0xd1, 0x29, 0x5, 0x16, 0x76, 0xa, 0x29, 0xac, + 0xac, 0xab, 0x1, 0x67, 0x52, 0x52, 0x67, 0x49, + 0x17, 0x1f, 0x1f, 0x1d, 0xf, 0xf, 0xf, 0xb6, + 0x5f, 0xaa, 0x5f, 0x56, 0x56, 0x3f, 0xeb, 0x4f, + 0x77, 0xc5, 0x77, 0xe8, 0x1f, 0x61, 0x37, 0x76, + 0x76, 0x76, 0x76, 0x37, 0x55, 0x82, 0x59, 0x5c, + 0xf6, 0xa2, 0xba, 0xbc, 0xea, 0x2b, 0x3c, 0x2b, + 0x80, 0xc, 0xc1, 0xdc, 0xdc, 0x3c, 0xc1, 0xd, + 0xaa, 0xb6, 0x61, 0x76, 0x23, 0x23, 0x76, 0x4d, + 0x82, 0x37, 0x87, 0xad, 0xad, 0xc3, 0xc3, 0x65, + 0x82, 0x76, 0xa, 0x23, 0xa, 0xa, 0x62, 0x58, + 0xf1, 0xf1, 0xf1, 0xc5, 0x89, 0x63, 0x89, 0x1b, + 0x63, 0x89, 0x79, 0xd2, 0x4a, 0xc2, 0xe, 0x1b, + 0x19, 0x19, 0x63, 0x1b, 0x63, 0x1b, 0x63, 0x42, + 0x6e, 0x63, 0x8, 0x1b, 0x19, 0xd2, 0x79, 0x1b, + 0x19, 0x19, 0x63, 0x19, 0x89, 0x63, 0x79, 0xf1, + 0x63, 0x79, 0x8c, 0x41, 0x62, 0xa, 0x23, 0xa, + 0x8a, 0x87, 0x52, 0xab, 0xc3, 0x87, 0xab, 0xac, + 0xe3, 0x76, 0x29, 0x8a, 0x2f, 0xe5, 0x1e, 0x8e, + 0x6b, 0x99, 0xbd, 0xd8, 0x47, 0x32, 0x90, 0x6b, + 0x47, 0x93, 0xf3, 0xca, 0x9c, 0xf5, 0xf3, 0x2e, + 0x4, 0x39, 0xdf, 0x9d, 0x3a, 0xd8, 0xd8, 0xfb, + 0xe, 0xd5, 0xe9, 0xd3, 0x24, 0x30, 0xf1, 0x2f, + 0xd3, 0x1c, 0xe3, 0x29, 0x1c, 0x67, 0x73, 0xad, + 0x96, 0xfd, 0xde, 0x32, 0x32, 0x83, 0xf5, 0x6c, + 0x77, 0x5d, 0xc5, 0x67, 0x1, 0xa8, 0x5a, 0xa6, + 0xb3, 0x60, 0x6b, 0x47, 0x47, 0x6b, 0x39, 0x47, + 0xc8, 0x74, 0xd8, 0x9c, 0xca, 0x81, 0x8d, 0xf3, + 0x99, 0x39, 0x9c, 0x97, 0x97, 0x57, 0x90, 0xdf, + 0xe1, 0x75, 0xf3, 0xf3, 0x81, 0xe4, 0x12, 0x12, + 0xe4, 0x4b, 0xdf, 0xc0, 0x7, 0xbc, 0xbc, 0x18, + 0xca, 0xdf, 0xe4, 0xbf, 0xc0, 0xed, 0xdf, 0xc0, + 0xc0, 0xbf, 0xb0, + 0x47, 0x6c, 0xa5, 0x2f, 0xa5, 0x2f, 0x8c, 0x24, + 0x8c, 0xa6, 0xa8, 0x3e, 0xd7, 0xe5, 0xe0, 0x8e, + 0x6f, 0x6f, 0xbd, 0x32, 0x6f, 0x47, 0x3a, 0x3e, + 0xe8, 0x2f, 0x24, 0xb5, 0xda, 0xda, 0x41, 0xb5, + 0x58, 0x58, 0x78, 0xa, 0xa, 0x62, 0xb5, 0x8c, + 0x42, 0x1b, 0x63, 0x63, 0x63, 0x63, 0x19, 0x63, + 0x89, 0x1b, 0x8, 0x58, 0x2, 0x63, 0xf1, 0x67, + 0x79, 0x63, 0x19, 0x4a, 0x19, 0x19, 0x63, 0xf1, + 0x8, 0x63, 0xae, 0x2f, 0xd2, 0x63, 0x6e, 0xd2, + 0xe9, 0x19, 0x4a, 0x4a, 0x19, 0x19, 0x89, 0x67, + 0x41, 0x62, 0x0, 0x76, 0x76, 0xe3, 0x5e, 0x61, + 0x76, 0x29, 0x16, 0xd1, 0x62, 0x23, 0x23, 0x0, + 0x23, 0xd1, 0xd1, 0xa, 0xd1, 0x78, 0x82, 0xab, + 0x61, 0x87, 0x9e, 0xab, 0x66, 0x66, 0xbe, 0x61, + 0x61, 0x37, 0x37, 0x37, 0x78, 0x78, 0x16, 0x4d, + 0x78, 0x16, 0x3b, 0x6d, 0xa, 0xa, 0xd1, 0xd1, + 0xd1, 0x4d, 0x67, 0x2f, 0x8c, 0x8c, 0xc3, 0x2f, + 0xf, 0xf, 0x1f, 0xb6, 0xf, 0x5f, 0x5f, 0x5f, + 0xb6, 0x56, 0xc1, 0x48, 0x80, 0x33, 0x38, 0xc9, + 0x2a, 0x2c, 0x5d, 0x72, 0x1d, 0x52, 0x94, 0x55, + 0x37, 0x37, 0x37, 0xbe, 0x55, 0x65, 0xc3, 0x4f, + 0xa2, 0xea, 0xea, 0xea, 0xea, 0x3c, 0x2b, 0xa2, + 0xea, 0xc1, 0x33, 0x18, 0xdc, 0x2b, 0x92, 0x56, + 0x9e, 0x1d, 0xb6, 0x61, 0x61, 0xf2, 0x78, 0xb5, + 0x1, 0xbe, 0x82, 0xc3, 0x9e, 0xaa, 0xb7, 0xb6, + 0x82, 0x78, 0xa, 0xa, 0xd1, 0xa, 0x62, 0xb5, + 0xf1, 0x41, 0x87, 0xa4, 0x96, 0x63, 0x79, 0xa5, + 0xc2, 0xf0, 0xc2, 0xef, 0x4a, 0x63, 0x73, 0x1b, + 0x19, 0xd2, 0xf1, 0x8, 0x5b, 0xf0, 0xc5, 0x7a, + 0x6e, 0x1b, 0x89, 0x63, 0x4a, 0x63, 0xf1, 0x89, + 0x6e, 0x63, 0x2d, 0xe9, 0xf0, 0x1b, 0xa5, 0x6e, + 0x19, 0xa5, 0x30, 0x41, 0x62, 0xa, 0x0, 0x23, + 0x29, 0x65, 0x52, 0xb6, 0x94, 0xc3, 0x65, 0x94, + 0xab, 0xe3, 0xda, 0xb5, 0xc9, 0x27, 0xd8, 0xf6, + 0x7d, 0xca, 0xc6, 0x7, 0xd8, 0x9c, 0xdf, 0xed, + 0xdd, 0xbf, 0x95, 0xed, 0xca, 0xdd, 0xbf, 0xe1, + 0x53, 0x39, 0xca, 0x81, 0xd8, 0xf8, 0xed, 0x6b, + 0xef, 0xef, 0x5d, 0x1, 0xb5, 0x87, 0x8c, 0xd3, + 0xb5, 0x82, 0x82, 0xe3, 0x8c, 0x60, 0xe8, 0xc2, + 0xc2, 0x90, 0xe1, 0xe1, 0xc6, 0x90, 0xd8, 0x3, + 0x98, 0x7f, 0xd4, 0x59, 0x59, 0x4e, 0xfb, 0x4f, + 0x60, 0xe9, 0x8b, 0xd8, 0xbc, 0xdb, 0x6b, 0x81, + 0xe1, 0x75, 0xe4, 0xf8, 0xdf, 0xce, 0xb4, 0xb4, + 0xc6, 0xdf, 0x70, 0xdd, 0xd8, 0x53, 0xf9, 0xdd, + 0xe4, 0x95, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xf3, + 0xe4, 0xe1, 0x81, 0xe4, 0x9a, 0x74, 0xbc, 0x75, + 0xdf, 0xce, 0xbf, 0xbf, 0xbf, 0xcc, 0xce, 0xf7, + 0xbb, 0xf4, 0x9a, + 0x6b, 0xe5, 0x98, 0x50, 0x2f, 0x1, 0x24, 0x24, + 0x8, 0x2f, 0x59, 0x5c, 0x6b, 0x47, 0xbd, 0xd8, + 0x6b, 0x6b, 0xd8, 0x53, 0x36, 0x47, 0x39, 0x88, + 0x3, 0xe9, 0xd3, 0x4d, 0xb5, 0x8c, 0x1, 0x61, + 0x37, 0xbe, 0xa, 0x6d, 0x8a, 0x62, 0x62, 0x41, + 0x5a, 0x63, 0xc5, 0x2f, 0x5b, 0x89, 0x63, 0x2, + 0x79, 0x89, 0x73, 0xa0, 0x63, 0x19, 0x42, 0x58, + 0xf1, 0x4a, 0xe, 0xe9, 0xe, 0x63, 0x19, 0x63, + 0xd2, 0xd5, 0x1b, 0x1b, 0x6e, 0x4a, 0x63, 0x79, + 0x79, 0xd2, 0x8f, 0x4a, 0xa5, 0x63, 0x89, 0x67, + 0x41, 0x1c, 0x29, 0x23, 0xd1, 0x78, 0x78, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0x76, 0x29, 0x23, 0x0, + 0x0, 0x23, 0xd1, 0xd1, 0x76, 0x4d, 0x59, 0x52, + 0x66, 0x17, 0x65, 0xf, 0x5f, 0x1d, 0x1f, 0x9e, + 0x52, 0xab, 0x49, 0xd3, 0x37, 0x37, 0xf2, 0x37, + 0x76, 0x76, 0x76, 0x76, 0xa, 0x76, 0x4d, 0x62, + 0xd1, 0x4d, 0x8c, 0x8c, 0xbe, 0x5e, 0xa7, 0x1d, + 0x5f, 0x92, 0xf, 0xb6, 0xb6, 0x5f, 0xc, 0xc1, + 0xb7, 0xb7, 0x91, 0xb, 0x2b, 0x92, 0x9e, 0x1d, + 0x92, 0x91, 0x91, 0x4e, 0x22, 0x4e, 0x4e, 0x4e, + 0x52, 0xbe, 0x29, 0x61, 0x66, 0x66, 0x1f, 0x7e, + 0x90, 0xa2, 0xba, 0xcb, 0xf6, 0x18, 0xcb, 0xcb, + 0x57, 0xdc, 0x3c, 0x2b, 0x2b, 0x3c, 0x92, 0xf, + 0xb7, 0xf, 0x92, 0x5f, 0xb6, 0x66, 0xbe, 0x65, + 0x9e, 0x37, 0x37, 0x17, 0x17, 0x1f, 0xf, 0xb7, + 0xc3, 0x55, 0x3b, 0x87, 0x29, 0x23, 0xa, 0x6d, + 0x6, 0xa, 0xe3, 0x87, 0xa6, 0x2f, 0x60, 0xc5, + 0x6e, 0xa5, 0x19, 0x6e, 0xd7, 0x19, 0x42, 0xe9, + 0xc5, 0x42, 0x68, 0x8, 0x73, 0x2f, 0x60, 0x19, + 0xd7, 0xd5, 0xd5, 0x8f, 0xef, 0xd5, 0xa5, 0xa5, + 0xd2, 0x1b, 0x8, 0x2f, 0x6e, 0x6e, 0x8f, 0x6b, + 0xd5, 0x19, 0x42, 0x67, 0x41, 0xa, 0xa, 0xa, + 0x78, 0x66, 0x66, 0x66, 0x52, 0xc3, 0x65, 0x65, + 0x82, 0x24, 0xe3, 0x24, 0x59, 0x7e, 0x40, 0xf6, + 0x18, 0xb2, 0xe4, 0xb4, 0x12, 0xe4, 0xe4, 0xe4, + 0xde, 0xde, 0xbf, 0xe1, 0x40, 0xe1, 0xf4, 0x70, + 0x90, 0x9c, 0xde, 0xde, 0x47, 0xfd, 0x4, 0xd7, + 0xc5, 0x5d, 0x60, 0xd3, 0xd3, 0x24, 0xb3, 0xb5, + 0xda, 0xa0, 0x8c, 0x6d, 0xd3, 0x67, 0xa3, 0xd9, + 0x27, 0x40, 0xe1, 0x4b, 0x71, 0x9f, 0x81, 0x8b, + 0xd9, 0x88, 0x5c, 0xa8, 0xb8, 0x22, 0x51, 0x25, + 0x48, 0x7a, 0xdb, 0x83, 0x90, 0x81, 0xc6, 0xbd, + 0xe4, 0xe4, 0xe4, 0x12, 0xf3, 0x8d, 0xe1, 0x81, + 0xc4, 0x9f, 0x9d, 0x1e, 0x9c, 0x81, 0x2e, 0x12, + 0xc0, 0xc6, 0xf3, 0x93, 0x93, 0xde, 0xd8, 0x9c, + 0xc0, 0xe4, 0x81, 0xf3, 0x81, 0xe4, 0xfa, 0xc0, + 0xf3, 0xaf, 0xaf, 0xe4, 0x12, 0xbf, 0xb0, 0x7, + 0x81, 0xb4, 0xb4, + 0x83, 0x1e, 0xa9, 0x7f, 0x4f, 0x96, 0x73, 0xc9, + 0x35, 0xfb, 0xd9, 0x4f, 0x81, 0xd8, 0xc6, 0x53, + 0x6b, 0x9c, 0x9a, 0xe1, 0x81, 0x81, 0x90, 0x1e, + 0xa9, 0x2c, 0xd3, 0x78, 0x4d, 0xa, 0x66, 0x52, + 0xe3, 0x82, 0x82, 0x82, 0x1, 0x58, 0x45, 0x30, + 0x1b, 0x6e, 0x2f, 0x30, 0x67, 0xc5, 0xd5, 0x6e, + 0xd2, 0x19, 0x42, 0x19, 0x19, 0xd5, 0x6e, 0xf1, + 0xf1, 0xe9, 0x60, 0xf1, 0x79, 0x19, 0x6e, 0xe9, + 0x6e, 0xd5, 0x19, 0x11, 0x19, 0x6e, 0x19, 0x1b, + 0xf1, 0xe7, 0xe7, 0x2f, 0xa5, 0xd2, 0xe9, 0x67, + 0xb3, 0x67, 0x1c, 0xd1, 0xa, 0x41, 0x78, 0xd1, + 0x23, 0xd1, 0x76, 0x23, 0x23, 0xd1, 0x23, 0x23, + 0x0, 0xa, 0xa, 0x78, 0x82, 0x66, 0x1f, 0x1f, + 0x17, 0x1d, 0x22, 0x48, 0x3c, 0x2b, 0xeb, 0x88, + 0xd6, 0x92, 0x91, 0x1d, 0x52, 0x66, 0x61, 0x37, + 0x76, 0x78, 0x76, 0x23, 0x76, 0xa, 0x76, 0x78, + 0xd1, 0x6d, 0xb5, 0xe3, 0xbe, 0x55, 0x66, 0x1f, + 0xb6, 0x5f, 0x92, 0x3f, 0x92, 0x92, 0x3c, 0xdc, + 0xc, 0xf, 0x5f, 0xc, 0xc, 0x92, 0x5f, 0xb6, + 0x65, 0x59, 0xd4, 0x27, 0x3, 0x27, 0x50, 0x3e, + 0x91, 0x1d, 0x1f, 0x52, 0x52, 0xa8, 0x7f, 0x40, + 0x9a, 0xe1, 0x9a, 0xfa, 0x86, 0xbc, 0xa2, 0xba, + 0xba, 0x2b, 0x3c, 0xc, 0x3c, 0x3c, 0x3c, 0x3c, + 0x48, 0x56, 0xf, 0xb7, 0xb7, 0xb6, 0xb6, 0xb6, + 0x17, 0x61, 0x66, 0x61, 0x87, 0x87, 0x87, 0xa8, + 0x2f, 0x82, 0x4d, 0x4d, 0xd1, 0x29, 0xa, 0x37, + 0xac, 0x6d, 0x58, 0x8, 0x42, 0x42, 0x73, 0x6e, + 0xe9, 0x8, 0xd2, 0xa5, 0x42, 0x79, 0x2, 0x89, + 0x1b, 0x1b, 0x1b, 0x63, 0x63, 0x73, 0x42, 0xd2, + 0xd5, 0x2f, 0xa5, 0xd2, 0x63, 0x19, 0x63, 0x42, + 0xd2, 0x1b, 0x5b, 0x1b, 0x19, 0x19, 0x1b, 0x1b, + 0xd2, 0xe9, 0x2f, 0x67, 0x41, 0xa, 0xa, 0xa, + 0x58, 0x58, 0xda, 0x82, 0x24, 0xd3, 0xac, 0x4d, + 0xf2, 0x78, 0x78, 0xe3, 0x1, 0xc9, 0x4f, 0x9c, + 0x9c, 0x4, 0xce, 0xca, 0x6b, 0x9c, 0xf3, 0xfd, + 0x27, 0x27, 0x81, 0x32, 0x47, 0x6f, 0x4b, 0x99, + 0x4, 0x4, 0x32, 0xe5, 0xef, 0xd5, 0xd7, 0xc5, + 0x2f, 0x1, 0x8c, 0x87, 0x67, 0x8, 0xa0, 0x45, + 0x45, 0x2f, 0x67, 0x41, 0x6d, 0x5e, 0x24, 0xf1, + 0xe9, 0xfb, 0x7d, 0x6b, 0x4, 0xb1, 0x1e, 0xd7, + 0xd4, 0x7f, 0x48, 0xb8, 0x59, 0xa8, 0x3e, 0xd5, + 0xd7, 0x27, 0x7d, 0xc2, 0x6f, 0xce, 0xde, 0x4, + 0x6b, 0x39, 0xd8, 0x4, 0xfd, 0x8b, 0x7d, 0x9c, + 0x97, 0xce, 0x32, 0xe5, 0xe5, 0x9c, 0x97, 0x4, + 0x97, 0x83, 0x27, 0x6c, 0x6c, 0xe5, 0xd5, 0xe5, + 0x6f, 0xf3, 0x93, 0x4, 0x6f, 0x99, 0x9c, 0x47, + 0x4, 0xc0, 0xcd, 0x83, 0x8e, 0xaf, 0xe4, 0x32, + 0x6f, 0xdf, 0xaf, + 0x47, 0xe5, 0x6b, 0xef, 0xd5, 0xe7, 0xc9, 0x59, + 0x4f, 0x27, 0x40, 0xdb, 0x8b, 0xfd, 0xd8, 0x81, + 0x86, 0x32, 0xc0, 0xe4, 0xde, 0xdd, 0x9b, 0x3a, + 0x50, 0x52, 0xe3, 0xb5, 0x24, 0x4d, 0x6d, 0x24, + 0xd3, 0xe3, 0x4d, 0x24, 0x62, 0xb5, 0x2f, 0x8, + 0x2f, 0xe9, 0x73, 0x42, 0x79, 0xe9, 0xe, 0x42, + 0x19, 0xd2, 0xe7, 0xe, 0x63, 0x19, 0x19, 0xd2, + 0xf1, 0x42, 0x42, 0x63, 0x1b, 0x19, 0x63, 0x42, + 0x63, 0x63, 0xe7, 0xd2, 0x19, 0x63, 0x19, 0x63, + 0x79, 0xa5, 0x73, 0x73, 0x42, 0x19, 0x2f, 0x58, + 0x6d, 0xb5, 0x62, 0x23, 0x23, 0xac, 0xac, 0xac, + 0xe3, 0xa, 0x62, 0x34, 0x23, 0x23, 0x23, 0x23, + 0x0, 0x23, 0x78, 0x4d, 0xbe, 0x1f, 0x9e, 0x59, + 0x22, 0xd0, 0xcb, 0xcb, 0x5c, 0xb, 0xdb, 0xdb, + 0x2b, 0x92, 0x1d, 0x52, 0xf, 0xf, 0x52, 0x66, + 0x37, 0x76, 0x76, 0xd1, 0xd1, 0x23, 0x76, 0x76, + 0x76, 0x4d, 0x61, 0x4d, 0x66, 0x55, 0xab, 0xad, + 0x9e, 0x1d, 0x92, 0x80, 0x2b, 0xaa, 0xf, 0xc, + 0xc, 0xc, 0x5f, 0xb7, 0x56, 0xc, 0x92, 0xa6, + 0x59, 0xad, 0x2f, 0xd2, 0x77, 0x5d, 0x2c, 0x4e, + 0x48, 0x91, 0x2c, 0x22, 0xd4, 0x88, 0xf6, 0x7, + 0x9a, 0xf6, 0xcb, 0xbc, 0x7, 0xbc, 0xea, 0xdc, + 0xd0, 0xea, 0x2b, 0x80, 0x38, 0x33, 0x92, 0x2b, + 0x2b, 0xaa, 0xb7, 0xb6, 0x5f, 0x5f, 0xf, 0xb6, + 0x17, 0x55, 0x55, 0x55, 0x82, 0x68, 0x82, 0x58, + 0x1, 0xe3, 0x16, 0xd1, 0x23, 0xd1, 0xd1, 0xa, + 0x62, 0x62, 0x67, 0x79, 0xd2, 0x19, 0x1b, 0x19, + 0xd2, 0x89, 0xf1, 0x8, 0xb3, 0x30, 0x1b, 0x19, + 0x63, 0x89, 0x63, 0x63, 0x4a, 0x19, 0x19, 0x6e, + 0xd2, 0xf1, 0x42, 0x63, 0x6e, 0x19, 0x19, 0x4a, + 0x19, 0x63, 0x89, 0x6e, 0x19, 0x19, 0x19, 0x42, + 0x8, 0xd2, 0xf1, 0x8c, 0x41, 0x1c, 0xa, 0xa, + 0x24, 0x67, 0x87, 0x82, 0xe3, 0xd3, 0x78, 0x4d, + 0x78, 0x62, 0x6d, 0x87, 0xf0, 0xc2, 0x7d, 0x6f, + 0x4, 0xb1, 0xb2, 0xf5, 0xd5, 0x1e, 0xe4, 0x32, + 0x47, 0x6b, 0xbd, 0x97, 0x97, 0x32, 0xdf, 0x9c, + 0x9c, 0x4, 0xfd, 0x9c, 0xd5, 0x60, 0xd5, 0x4a, + 0xa5, 0x67, 0x1c, 0xd3, 0x8c, 0x58, 0x58, 0x30, + 0x58, 0x8c, 0xab, 0xd3, 0x58, 0xda, 0x58, 0x96, + 0x27, 0x1e, 0xbd, 0xf5, 0x32, 0xe1, 0xd8, 0x27, + 0x7e, 0xb8, 0x48, 0x7c, 0xa9, 0x8b, 0x83, 0x4, + 0x6f, 0xb1, 0x9c, 0x6f, 0x9c, 0xe1, 0xd8, 0x2e, + 0xff, 0x40, 0x9f, 0x8e, 0xc0, 0xe4, 0xdd, 0x93, + 0xf3, 0xe4, 0xde, 0x6f, 0x9c, 0x83, 0x9d, 0xfd, + 0x97, 0x81, 0xfd, 0xe5, 0x9c, 0x32, 0x93, 0x6f, + 0xc0, 0x95, 0xb4, 0x97, 0xf3, 0xdd, 0xcc, 0xd8, + 0xd8, 0xaf, 0x95, 0xaf, 0xc0, 0xaf, 0xbf, 0xaf, + 0xaf, 0xaf, 0x95, + 0x6c, 0xd7, 0x6e, 0x1b, 0xe9, 0x2f, 0xa8, 0x49, + 0x59, 0x77, 0x83, 0xdb, 0x6b, 0xe5, 0xca, 0x8d, + 0x4, 0x4, 0xde, 0x39, 0x6b, 0x6c, 0xd8, 0x98, + 0x2c, 0xd3, 0x24, 0x8c, 0x82, 0xda, 0x30, 0x58, + 0xbe, 0x76, 0xa, 0x62, 0x78, 0x6d, 0x58, 0x8, + 0x67, 0x73, 0x89, 0x1b, 0x4a, 0x63, 0x63, 0x1b, + 0xd5, 0xa5, 0x2f, 0xf1, 0x42, 0x79, 0xe9, 0x63, + 0x1b, 0x63, 0x1b, 0x19, 0x4a, 0x4a, 0x19, 0x89, + 0x89, 0xf1, 0x2f, 0x42, 0x63, 0xe9, 0x63, 0x19, + 0x19, 0x63, 0x89, 0x89, 0x63, 0x19, 0xe9, 0x30, + 0xda, 0x1c, 0xa, 0x23, 0x23, 0xa, 0x37, 0x78, + 0xd3, 0xd3, 0xa, 0x23, 0x23, 0x34, 0xd1, 0x23, + 0x23, 0xa, 0x76, 0x55, 0xa8, 0x3f, 0x33, 0xd4, + 0x5c, 0xcb, 0x57, 0x57, 0xd0, 0x80, 0x2b, 0x2b, + 0x2b, 0x92, 0x3f, 0x4e, 0x48, 0x2b, 0xb6, 0x52, + 0x65, 0x66, 0xf2, 0x76, 0x23, 0x76, 0x76, 0x23, + 0x76, 0x78, 0x34, 0x78, 0x61, 0x24, 0x52, 0xc9, + 0xc9, 0x1d, 0xc, 0xc, 0xc, 0xf, 0xaa, 0x5f, + 0xc, 0xc, 0x5f, 0x56, 0x33, 0x3c, 0x92, 0x1d, + 0xa8, 0x52, 0x59, 0x50, 0x2a, 0xe8, 0x60, 0xe8, + 0x18, 0x18, 0x7f, 0x88, 0x18, 0xf6, 0x57, 0x7, + 0x9a, 0x7, 0xea, 0xea, 0xcb, 0x57, 0xa2, 0xd0, + 0x88, 0x57, 0xea, 0x3c, 0xd, 0x33, 0xaa, 0x3c, + 0xc, 0x5f, 0xb6, 0xb7, 0xb7, 0x5f, 0x5f, 0xb6, + 0x17, 0x66, 0x66, 0x61, 0x55, 0x82, 0xbe, 0x66, + 0x5e, 0x66, 0x78, 0x76, 0xa, 0xa, 0xa, 0xd1, + 0x1c, 0x1c, 0x8c, 0xa1, 0xe7, 0xd2, 0xd5, 0xc5, + 0xe7, 0x63, 0x6e, 0xe, 0x73, 0x67, 0x42, 0xd5, + 0xe, 0xd2, 0x19, 0xd7, 0xd7, 0x4a, 0xd7, 0x4a, + 0x19, 0x19, 0x19, 0xd5, 0x19, 0x4a, 0xd5, 0xd7, + 0x19, 0x1b, 0x19, 0x63, 0x79, 0x63, 0x19, 0x6e, + 0xd2, 0x63, 0x1b, 0xf1, 0x8c, 0xa, 0x23, 0xa, + 0x78, 0xac, 0x55, 0x66, 0xbe, 0x66, 0x55, 0x29, + 0xe3, 0x29, 0x4d, 0xad, 0x96, 0x7d, 0x83, 0x36, + 0xd8, 0x57, 0xe4, 0xb4, 0x81, 0x75, 0xe4, 0xe4, + 0xe4, 0x81, 0xe4, 0xe4, 0xe4, 0xe4, 0xce, 0xe4, + 0xd8, 0x53, 0x9f, 0xd8, 0xef, 0x7c, 0xd4, 0xe9, + 0x5b, 0xa6, 0x24, 0x1c, 0x41, 0xe3, 0xe3, 0x6d, + 0x41, 0xab, 0xa7, 0x68, 0x8, 0xa6, 0xc9, 0xd4, + 0x6b, 0xed, 0xe4, 0xb4, 0xb4, 0xbc, 0xba, 0x18, + 0x53, 0x48, 0x7f, 0x90, 0xd8, 0xb0, 0xc6, 0x81, + 0xd8, 0x7, 0xe1, 0xc6, 0xc6, 0xbc, 0x74, 0xc6, + 0xe4, 0xce, 0xe1, 0xc6, 0xb4, 0xbf, 0xe4, 0xe4, + 0xe4, 0xe1, 0x74, 0x9f, 0xc6, 0x75, 0x53, 0x90, + 0xde, 0xe4, 0xdd, 0x32, 0xca, 0x39, 0x81, 0xdd, + 0xb4, 0xb4, 0x75, 0x57, 0xb4, 0xaf, 0xe4, 0xe1, + 0xdf, 0xf7, 0xcc, 0xf4, 0xcd, 0xbb, 0xcc, 0xb4, + 0xe1, 0xf4, 0xbf, + 0xd7, 0xd7, 0x6e, 0x60, 0xa8, 0x67, 0x59, 0x7f, + 0x1b, 0x6b, 0xf7, 0x81, 0xf3, 0x6f, 0x9c, 0x26, + 0xfd, 0xfd, 0x9c, 0x40, 0xa9, 0xfd, 0xd8, 0xdb, + 0x49, 0xd3, 0xbe, 0xd3, 0xd3, 0xb5, 0xb3, 0x24, + 0x41, 0x66, 0x4d, 0x29, 0x16, 0x62, 0x8c, 0x2d, + 0xf0, 0x73, 0x89, 0x63, 0x6e, 0x19, 0xc2, 0x6e, + 0x79, 0x42, 0x1b, 0x19, 0x63, 0x1b, 0xa5, 0x63, + 0x63, 0xa5, 0x79, 0xc2, 0x4a, 0xef, 0xd7, 0x4a, + 0x63, 0x42, 0x1b, 0x6e, 0x19, 0x19, 0xd2, 0x6e, + 0x19, 0x19, 0xd2, 0x63, 0x63, 0xc5, 0xd2, 0xe, + 0x79, 0xb3, 0x29, 0x16, 0xd1, 0x62, 0x78, 0x76, + 0x61, 0x61, 0x76, 0xd1, 0xa, 0xd1, 0x23, 0x23, + 0x76, 0x78, 0x82, 0xc3, 0x7e, 0xd6, 0xeb, 0x5c, + 0xdb, 0xba, 0xba, 0xa2, 0xea, 0x80, 0x80, 0xdc, + 0xd0, 0xeb, 0x5c, 0x9f, 0xcb, 0x80, 0xc, 0xb6, + 0x17, 0x61, 0xf2, 0x76, 0x76, 0x76, 0x23, 0xa, + 0x16, 0x4d, 0x78, 0x78, 0x29, 0x5e, 0x1f, 0x3f, + 0x91, 0x3c, 0x3c, 0xc, 0x80, 0x3c, 0x92, 0x3c, + 0xd, 0x3c, 0x92, 0xc, 0x91, 0x92, 0x5f, 0xb6, + 0xb6, 0x17, 0x1f, 0x56, 0x38, 0x4f, 0x8b, 0xf6, + 0x75, 0x74, 0xf6, 0xbc, 0xbc, 0xbc, 0xba, 0xba, + 0x57, 0x7, 0xcb, 0xa2, 0x57, 0x40, 0xf6, 0x57, + 0xbc, 0xa2, 0x2b, 0x2b, 0x2b, 0xc, 0x92, 0xaa, + 0xaa, 0xc, 0x92, 0xb6, 0xb7, 0x56, 0xaa, 0x5f, + 0xf, 0x55, 0x17, 0x17, 0x61, 0x37, 0x61, 0x61, + 0x61, 0x82, 0xb3, 0x1c, 0x37, 0xa, 0x16, 0x8a, + 0xd3, 0xa, 0xb5, 0xac, 0xd3, 0xa5, 0xd5, 0xef, + 0xd5, 0x6e, 0x19, 0xd5, 0x6e, 0x1b, 0x89, 0xe, + 0xe9, 0x42, 0xc2, 0x8f, 0xa5, 0xe, 0xef, 0xef, + 0xe5, 0xd5, 0x19, 0xef, 0x4a, 0xd7, 0xd5, 0xef, + 0x79, 0x89, 0x6e, 0xe, 0x79, 0x42, 0xc5, 0xef, + 0x19, 0x19, 0x1b, 0x5a, 0xd3, 0x29, 0xa, 0x23, + 0x78, 0x76, 0x37, 0x1f, 0x17, 0xbe, 0x65, 0xc3, + 0xd3, 0x6d, 0x1a, 0xa4, 0x60, 0x98, 0xd8, 0xfa, + 0xf6, 0x18, 0xc6, 0xe4, 0xff, 0xdf, 0x90, 0x81, + 0xe4, 0xdd, 0x8d, 0xf9, 0xf6, 0x9f, 0x85, 0xe4, + 0x1e, 0x39, 0x39, 0x47, 0xe5, 0x5d, 0xb8, 0xad, + 0x30, 0x1, 0x8c, 0xd3, 0xb5, 0x29, 0xe3, 0xa0, + 0x8, 0x87, 0x82, 0x67, 0x2f, 0xa5, 0x59, 0x1b, + 0x7d, 0x81, 0xbc, 0xde, 0x81, 0xcb, 0x18, 0x4b, + 0xdf, 0x90, 0x39, 0x39, 0x9c, 0x81, 0xd8, 0x1e, + 0x39, 0x88, 0xdb, 0x3a, 0xde, 0x90, 0x90, 0xd8, + 0xaf, 0xbb, 0xbf, 0xdf, 0xdf, 0xe4, 0xe1, 0xde, + 0xdf, 0x90, 0xeb, 0xa9, 0xde, 0x81, 0xca, 0x7d, + 0x9c, 0x97, 0x47, 0xd5, 0xd9, 0x7d, 0x3, 0x3a, + 0xd8, 0xdf, 0x39, 0xf5, 0xe4, 0xbf, 0xcc, 0xf7, + 0xca, 0xdf, 0xaf, 0xc0, 0xc0, 0xf7, 0x81, 0xcc, + 0xd8, 0xb0, 0xcc, + 0x5d, 0xc5, 0xc8, 0x5c, 0x22, 0x4f, 0x7d, 0xdf, + 0xe1, 0x8d, 0xe4, 0xe1, 0x75, 0x85, 0x85, 0x75, + 0x53, 0xf6, 0xe1, 0xe1, 0x81, 0x81, 0xf6, 0x88, + 0xc7, 0xd3, 0x29, 0x76, 0x4d, 0x82, 0x94, 0x94, + 0x37, 0x37, 0xda, 0x87, 0xe3, 0x1c, 0x5, 0x89, + 0xd2, 0xf1, 0xf1, 0xd2, 0x79, 0x60, 0x6e, 0xef, + 0xc5, 0xa5, 0xd9, 0x6e, 0xc2, 0xd5, 0xf0, 0x6e, + 0x77, 0xae, 0x2f, 0x1b, 0xc5, 0x2c, 0x77, 0xef, + 0xd5, 0x6e, 0x1b, 0x1b, 0xd7, 0xef, 0x6e, 0x19, + 0xc2, 0xd2, 0x60, 0xe9, 0x6e, 0xa5, 0x6e, 0x6e, + 0x19, 0xa5, 0x87, 0x3b, 0x3b, 0x8a, 0x78, 0xd1, + 0x76, 0x76, 0x0, 0x23, 0xd1, 0x76, 0x76, 0x62, + 0xc3, 0xb6, 0x1f, 0x9e, 0x33, 0x33, 0xc, 0xb, + 0x80, 0x80, 0xd0, 0xcb, 0x7, 0x7, 0xcb, 0x5c, + 0xf6, 0xcb, 0xba, 0xba, 0xdc, 0x2b, 0x92, 0xb6, + 0xf, 0xb6, 0xf2, 0xf2, 0x76, 0x76, 0x76, 0xa, + 0xda, 0x82, 0x76, 0x37, 0x4d, 0x65, 0xa7, 0x49, + 0x7f, 0xa2, 0xd0, 0x38, 0x18, 0xb, 0x2b, 0xc, + 0x92, 0x56, 0xc, 0xc, 0xc, 0x5f, 0xb6, 0x17, + 0x55, 0x52, 0x55, 0x55, 0x59, 0xc2, 0x40, 0xdb, + 0xa2, 0x5c, 0xd6, 0x2b, 0xa2, 0xcb, 0xcb, 0x5c, + 0xf6, 0x9a, 0x9a, 0xcb, 0x5c, 0xcb, 0xbc, 0xea, + 0xea, 0x2b, 0xaa, 0x92, 0x3c, 0x2b, 0x3c, 0xb7, + 0x56, 0xeb, 0x2b, 0xc, 0x5f, 0xf, 0xb7, 0x5f, + 0x92, 0x5f, 0xb6, 0x61, 0x61, 0x65, 0x82, 0xf2, + 0x76, 0x76, 0x4d, 0x61, 0x76, 0x16, 0x6d, 0xa, + 0x4d, 0x8a, 0x8a, 0x1c, 0x29, 0x30, 0xe, 0x6e, + 0x5a, 0x1b, 0x63, 0x63, 0x79, 0x63, 0x42, 0x6e, + 0x89, 0x63, 0x19, 0x19, 0x73, 0x42, 0x19, 0xd5, + 0xa5, 0x6e, 0x4a, 0x6e, 0xe9, 0xe, 0x4a, 0x63, + 0x63, 0x19, 0x19, 0x1b, 0x89, 0xa4, 0xf1, 0x1b, + 0x2d, 0xf1, 0xf1, 0x58, 0x41, 0x78, 0x62, 0x16, + 0x29, 0x62, 0x58, 0xb3, 0xb5, 0x37, 0xac, 0xbe, + 0xac, 0xa, 0xda, 0x45, 0xa6, 0xd4, 0x83, 0xf5, + 0xe5, 0x9c, 0xbd, 0x69, 0x4, 0xe5, 0x6b, 0x9c, + 0x4, 0x3, 0xd8, 0x6f, 0xe5, 0x9c, 0xf5, 0x4, + 0x6c, 0x6c, 0xe5, 0x8f, 0x77, 0x2f, 0xd3, 0xb5, + 0x82, 0xd3, 0xd3, 0x58, 0x30, 0x30, 0x30, 0x42, + 0x96, 0x8, 0xb5, 0xe3, 0xe3, 0xd3, 0x1, 0x96, + 0xd7, 0xfd, 0x90, 0x4, 0x4, 0xc0, 0x2e, 0xe0, + 0x32, 0xde, 0xc6, 0x4, 0x4, 0xfd, 0x9d, 0x27, + 0xd7, 0x6f, 0x6a, 0xd7, 0x4, 0xc0, 0xf5, 0x4, + 0x93, 0xe4, 0x81, 0x47, 0x32, 0xf3, 0x8e, 0x47, + 0x32, 0x9, 0x9c, 0x4, 0x6c, 0x32, 0x6c, 0x6c, + 0x6c, 0xd5, 0x5d, 0xa5, 0xc5, 0xd7, 0xef, 0x8f, + 0x9c, 0xc0, 0xf5, 0x97, 0x93, 0xf3, 0xcc, 0x97, + 0x4, 0xdd, 0x95, 0x93, 0x32, 0xc0, 0xaf, 0x93, + 0x93, 0x12, 0xaf, + 0xd4, 0x1b, 0xd7, 0x40, 0x88, 0x7d, 0x7d, 0x81, + 0xe0, 0x36, 0xdf, 0x39, 0x8b, 0x1e, 0xb4, 0x84, + 0x39, 0x99, 0xdd, 0x81, 0xfd, 0x6a, 0x4f, 0x4f, + 0x2f, 0x1, 0xe3, 0x6d, 0x1c, 0x6d, 0x6d, 0xb3, + 0x82, 0xa, 0x1c, 0xe3, 0xa, 0x62, 0x30, 0x5b, + 0x67, 0x2f, 0x79, 0x1b, 0x89, 0x73, 0x89, 0x19, + 0x63, 0x73, 0xe9, 0x6e, 0x19, 0x63, 0xd2, 0x19, + 0x1b, 0x42, 0x79, 0x19, 0x19, 0x89, 0x42, 0x6e, + 0x19, 0x2f, 0x2f, 0x89, 0x6e, 0x63, 0xe9, 0x19, + 0x63, 0x19, 0x63, 0x19, 0x19, 0x63, 0x89, 0x6e, + 0xe, 0x67, 0x1c, 0x5, 0x8a, 0xb5, 0x62, 0xa, + 0x8a, 0xa, 0x23, 0x23, 0x23, 0x23, 0xa, 0x76, + 0x4d, 0xb6, 0xb6, 0x52, 0x17, 0x1d, 0xc, 0xdc, + 0xcb, 0x18, 0x90, 0x9a, 0x7, 0xf6, 0x74, 0xd0, + 0xd0, 0xea, 0xea, 0xea, 0xa2, 0xd0, 0x80, 0x80, + 0x91, 0xaa, 0x17, 0xf2, 0x76, 0x76, 0x23, 0xd1, + 0xbe, 0x37, 0x78, 0xbe, 0x87, 0x59, 0xc9, 0x4f, + 0x9f, 0xf6, 0xcb, 0xb, 0xa2, 0xea, 0x2b, 0xc, + 0x5f, 0x5f, 0x92, 0xc, 0xc, 0xc1, 0x1d, 0x1f, + 0x1f, 0x3f, 0x66, 0x55, 0x52, 0x3e, 0x72, 0x3c, + 0xb, 0x88, 0xd0, 0xc1, 0xd0, 0xf6, 0xcb, 0xcb, + 0xcb, 0x57, 0x57, 0xbc, 0xea, 0xcb, 0xba, 0x2b, + 0x2b, 0xd0, 0xd, 0x3c, 0x3c, 0xdc, 0xdc, 0x92, + 0x3f, 0x3c, 0x3c, 0xc, 0xaa, 0xf, 0xb6, 0xf, + 0xaa, 0xf, 0xb7, 0xb6, 0xbe, 0x65, 0x37, 0xbe, + 0x78, 0xa, 0xa, 0x23, 0x23, 0xd1, 0x78, 0x78, + 0xa, 0x8a, 0x2f, 0xb3, 0x41, 0x42, 0x63, 0x4a, + 0x63, 0x63, 0x19, 0xe9, 0x2f, 0x79, 0x19, 0x4a, + 0xd2, 0x4a, 0x4a, 0x19, 0x19, 0x6e, 0x4a, 0x4a, + 0x1b, 0xd2, 0x19, 0xe, 0x2f, 0x2d, 0x19, 0x19, + 0x63, 0x6e, 0x19, 0x19, 0xd2, 0xf1, 0xf1, 0x42, + 0x8, 0x2f, 0xf1, 0x2f, 0x41, 0xa, 0x6d, 0x1c, + 0x62, 0xa, 0x82, 0x82, 0x82, 0xac, 0xd3, 0xac, + 0x82, 0x4d, 0x4d, 0x58, 0xb3, 0x60, 0x7d, 0xff, + 0x6f, 0x32, 0x81, 0x9c, 0x9c, 0x3, 0x40, 0xde, + 0x6f, 0x6b, 0x9c, 0xb1, 0x4, 0x69, 0x81, 0x9c, + 0x9c, 0xfd, 0x3e, 0x98, 0xa5, 0x1, 0x8c, 0xa0, + 0x58, 0x41, 0x5, 0xf1, 0xf1, 0x2f, 0x30, 0xa6, + 0xa0, 0x2f, 0x8c, 0xab, 0x82, 0x87, 0xb3, 0xd5, + 0x6f, 0x9, 0xf9, 0x2e, 0x93, 0xb4, 0xe1, 0xd8, + 0x81, 0xde, 0x75, 0xd8, 0xde, 0xc6, 0x6b, 0x6f, + 0x26, 0xbd, 0xf5, 0x7d, 0x9c, 0xe4, 0xe4, 0xd8, + 0xde, 0xc6, 0x70, 0xd8, 0xbf, 0xbb, 0xc6, 0xf3, + 0xbf, 0xbf, 0xce, 0x1e, 0x83, 0x9c, 0x36, 0x3a, + 0xef, 0xef, 0xd4, 0x77, 0x6b, 0x9b, 0x8b, 0xd5, + 0xdf, 0xbf, 0xbf, 0xc6, 0x75, 0x4b, 0xdf, 0xbd, + 0xd8, 0xe1, 0xcc, 0xf7, 0xcc, 0xbf, 0xbf, 0xaf, + 0xaf, 0x86, 0x95, + 0x1b, 0xc2, 0xef, 0xca, 0xef, 0x6e, 0x6b, 0xde, + 0x3, 0x3, 0x9c, 0x81, 0x47, 0x47, 0xc0, 0xe4, + 0x7b, 0x6f, 0x8e, 0xde, 0x6c, 0xef, 0x6b, 0x77, + 0x2c, 0xab, 0xbe, 0xbe, 0xe3, 0x24, 0xad, 0xa0, + 0x87, 0xa, 0xa, 0x29, 0xa, 0xa, 0x58, 0xf1, + 0x2f, 0x2f, 0x1b, 0x63, 0x63, 0x63, 0x63, 0x19, + 0x19, 0x79, 0x1b, 0x19, 0x63, 0xf1, 0x63, 0xc2, + 0x63, 0x63, 0x19, 0x19, 0x19, 0x19, 0x63, 0x4a, + 0x63, 0x8, 0x5, 0x89, 0x79, 0xf1, 0x79, 0x19, + 0x19, 0xd5, 0x4a, 0x19, 0x19, 0x4a, 0x19, 0x19, + 0x6e, 0x8a, 0xd1, 0x1c, 0x8a, 0x62, 0x62, 0x41, + 0x58, 0x1c, 0xd1, 0x29, 0xa, 0x23, 0xd1, 0x76, + 0x78, 0x61, 0x17, 0x52, 0x1d, 0xaa, 0x56, 0xd0, + 0xcb, 0x4b, 0x9a, 0x85, 0x9a, 0x57, 0xa2, 0xea, + 0xdc, 0x2b, 0x2b, 0x80, 0x74, 0xbc, 0xa2, 0xd0, + 0xd0, 0x3c, 0xf, 0x66, 0x37, 0x34, 0x76, 0xd1, + 0x76, 0xf2, 0x78, 0x55, 0x65, 0xd4, 0x27, 0x83, + 0x57, 0x57, 0xba, 0xea, 0x2b, 0x2b, 0xc, 0xc, + 0x3c, 0x2b, 0xc, 0x3c, 0xb, 0xd0, 0x80, 0x92, + 0xb7, 0x1f, 0x1f, 0x52, 0x49, 0x91, 0x91, 0x80, + 0xb, 0x74, 0xcb, 0xeb, 0x5c, 0xa2, 0x85, 0x74, + 0xba, 0xd0, 0xd0, 0xea, 0x2b, 0xa2, 0xa2, 0xd, + 0xdc, 0xa2, 0x74, 0x80, 0x3c, 0xd, 0xdc, 0xc, + 0x2b, 0xc, 0xc, 0xaa, 0xc, 0xc, 0xf, 0xf, + 0xb6, 0xaa, 0x91, 0x3c, 0xb7, 0x17, 0x55, 0x66, + 0x61, 0xbe, 0x4d, 0xd1, 0xd1, 0xd1, 0x62, 0xa, + 0x29, 0xb5, 0x8c, 0x8c, 0x24, 0xa0, 0x96, 0x6e, + 0xd5, 0x4a, 0x4a, 0x79, 0x58, 0x79, 0x63, 0x8f, + 0xe9, 0xc2, 0xd7, 0xd7, 0xd5, 0x6e, 0x6e, 0x6e, + 0x77, 0x6e, 0xd7, 0xd5, 0x42, 0x42, 0x19, 0x63, + 0x79, 0x73, 0x89, 0x6e, 0xa5, 0x60, 0xa5, 0x96, + 0x42, 0xf0, 0xe, 0xa5, 0x87, 0x1c, 0x29, 0x62, + 0xa, 0x78, 0x82, 0x65, 0x94, 0x52, 0x17, 0x55, + 0xbe, 0x61, 0x82, 0x67, 0xa6, 0xa4, 0x4f, 0x90, + 0xdd, 0xd8, 0x7, 0x90, 0xca, 0x1e, 0x75, 0xe4, + 0xc4, 0x39, 0xdf, 0xe4, 0xbd, 0x81, 0x90, 0x83, + 0x9d, 0x53, 0xb, 0x3e, 0xc9, 0x59, 0xc7, 0x42, + 0x42, 0x8, 0x30, 0xf1, 0x2f, 0x58, 0x6, 0x87, + 0xb3, 0x8c, 0x52, 0x52, 0xad, 0xa4, 0xc9, 0x27, + 0xce, 0xc6, 0x4b, 0x99, 0xe4, 0xb4, 0x7, 0x74, + 0x90, 0xc6, 0xe1, 0xfa, 0xe4, 0x4b, 0xf5, 0xe4, + 0x81, 0xe4, 0x90, 0x4f, 0x7d, 0xe4, 0xe1, 0x75, + 0xed, 0xdf, 0xe4, 0xe4, 0x8d, 0xbf, 0xed, 0x81, + 0xe4, 0xe2, 0xb4, 0x18, 0x8b, 0x81, 0xd8, 0xa9, + 0x7c, 0x7d, 0xc2, 0x6b, 0x36, 0xf3, 0x90, 0x7d, + 0x1e, 0xb4, 0xb4, 0x74, 0x18, 0x90, 0xdf, 0xf7, + 0xce, 0xcc, 0x95, 0xc6, 0xc0, 0x95, 0xbf, 0xbb, + 0xcc, 0xf6, 0xb4, + 0x77, 0x77, 0x4f, 0x88, 0xa9, 0x98, 0x1e, 0x81, + 0x99, 0x9c, 0xce, 0xe4, 0xc0, 0xdd, 0xe4, 0xe4, + 0xde, 0x9d, 0xd8, 0xfc, 0x27, 0xa9, 0x9d, 0xa9, + 0x67, 0xe3, 0xe3, 0x62, 0x62, 0x4d, 0xb5, 0x58, + 0x65, 0x6d, 0xd1, 0xd1, 0xd1, 0x29, 0x24, 0xa8, + 0x8c, 0xf1, 0xf0, 0x19, 0x6e, 0x63, 0xe9, 0x1b, + 0x19, 0x19, 0xe, 0xd5, 0x42, 0x8, 0xd2, 0x6e, + 0xf1, 0x2d, 0x6e, 0xd5, 0x4a, 0xef, 0xd5, 0x11, + 0x63, 0x63, 0x89, 0x19, 0x42, 0x58, 0x8, 0x63, + 0x19, 0x77, 0x19, 0x6e, 0x63, 0xd2, 0x5d, 0x2, + 0x42, 0x30, 0x67, 0x30, 0x8a, 0x62, 0x62, 0x41, + 0xab, 0xd3, 0x76, 0x76, 0xa, 0x37, 0x66, 0xbe, + 0x55, 0x66, 0x17, 0x1d, 0xdb, 0xeb, 0x3f, 0x33, + 0x18, 0x7, 0x57, 0xbc, 0xcb, 0xa2, 0xba, 0xa2, + 0xa2, 0x5c, 0x5c, 0xcb, 0x9a, 0xbc, 0xa2, 0x80, + 0x3c, 0x2b, 0x5f, 0xf, 0x17, 0xbe, 0x37, 0xbe, + 0x65, 0xbe, 0x82, 0x94, 0x59, 0x88, 0x74, 0xba, + 0xba, 0xa2, 0xea, 0x2b, 0xc, 0xc1, 0x33, 0x3c, + 0x48, 0xa2, 0xeb, 0x92, 0x3c, 0xdc, 0x2b, 0xc, + 0xb6, 0xf, 0xf, 0x1d, 0x2b, 0xd0, 0x5c, 0x5c, + 0xa2, 0xcb, 0xbc, 0xc1, 0x56, 0xdc, 0xea, 0x2b, + 0x2b, 0xd, 0xd, 0x5c, 0xba, 0xcb, 0xcb, 0x5c, + 0xd, 0xba, 0x74, 0x2b, 0x5f, 0x56, 0xc, 0x3c, + 0xc, 0x92, 0x33, 0x56, 0x92, 0x3c, 0x3c, 0xf, + 0xb7, 0xaa, 0x80, 0xc, 0x5f, 0x17, 0x17, 0x17, + 0x17, 0x65, 0x8a, 0xa, 0x1c, 0x5, 0xda, 0x62, + 0xa, 0xa, 0x78, 0xe3, 0x4d, 0x24, 0xb3, 0xd4, + 0xef, 0xef, 0xef, 0x6e, 0x1b, 0x6e, 0xd5, 0x77, + 0x1b, 0x63, 0xef, 0x77, 0x72, 0xc5, 0xc2, 0x6e, + 0xd5, 0xd5, 0xd7, 0xd5, 0x6e, 0x1b, 0xe, 0xe, + 0xa4, 0x67, 0x6e, 0xa5, 0x7a, 0xe, 0x77, 0xc2, + 0x1b, 0xef, 0xef, 0xe9, 0x8c, 0xa, 0xd1, 0xd1, + 0xd1, 0xa, 0x66, 0x61, 0x61, 0x61, 0x17, 0x65, + 0x82, 0x82, 0x87, 0xa8, 0x73, 0x60, 0x4e, 0x90, + 0x81, 0xc6, 0x90, 0xdf, 0x6f, 0xde, 0xe4, 0xb4, + 0xf3, 0x32, 0xd8, 0x81, 0xde, 0x81, 0x51, 0x8b, + 0x1e, 0x83, 0x8b, 0x27, 0x77, 0x96, 0xe9, 0xc5, + 0x4a, 0x63, 0x2f, 0x67, 0x58, 0x41, 0x58, 0x87, + 0xe3, 0x82, 0x65, 0x87, 0x87, 0xb3, 0xd4, 0xfb, + 0x83, 0x81, 0x81, 0x9f, 0xc6, 0xb4, 0xe4, 0xc6, + 0xf3, 0xbf, 0xbf, 0x12, 0xf3, 0xce, 0xbd, 0xd8, + 0x9d, 0xd8, 0x88, 0x77, 0x3, 0x81, 0xf3, 0xf5, + 0xf3, 0xb4, 0xe4, 0xc0, 0xe4, 0xbf, 0x81, 0xd8, + 0x81, 0xb4, 0xc6, 0x9d, 0xca, 0x2e, 0x8e, 0x6a, + 0xe5, 0xef, 0x77, 0xd5, 0x3, 0x1e, 0x36, 0x47, + 0x40, 0xe1, 0xce, 0x9c, 0xdf, 0x9, 0xb1, 0x9, + 0x97, 0xcd, 0xaf, 0xcc, 0xc0, 0xaf, 0x95, 0xaf, + 0xdd, 0xc6, 0xb4, + 0x91, 0x3f, 0x38, 0x7d, 0x90, 0xf6, 0xe4, 0xe4, + 0xdf, 0x81, 0xe4, 0xbf, 0xb4, 0xe1, 0x90, 0xe1, + 0xc6, 0x53, 0x9f, 0x39, 0x6b, 0x1e, 0x1e, 0xa9, + 0xa6, 0xd3, 0xac, 0x4d, 0x62, 0xa, 0x37, 0x24, + 0x1, 0x8c, 0x24, 0x29, 0x1c, 0xa0, 0x2f, 0x42, + 0x73, 0x73, 0x42, 0x2, 0x79, 0x2f, 0xa5, 0x89, + 0x6e, 0x8f, 0xef, 0x19, 0xe, 0x1b, 0xe, 0x19, + 0x2, 0x30, 0xd2, 0xe, 0xa5, 0x2f, 0x5d, 0x6e, + 0xd5, 0x19, 0x4a, 0x19, 0xd2, 0x89, 0x1b, 0x6e, + 0xe, 0x2f, 0x5a, 0x96, 0xf1, 0x79, 0xa5, 0x63, + 0x1b, 0x89, 0x73, 0xf1, 0x30, 0x8a, 0x1c, 0xa, + 0xb5, 0x76, 0x76, 0xd1, 0x76, 0x37, 0x66, 0x52, + 0x1f, 0x9e, 0xb6, 0x92, 0x80, 0x2b, 0xaa, 0x56, + 0x48, 0xcb, 0xcb, 0xcb, 0x9a, 0xfa, 0x9a, 0x7, + 0xfa, 0xf6, 0xcb, 0xb, 0xba, 0xea, 0x2b, 0xc, + 0x56, 0x3c, 0xc, 0x5f, 0x92, 0xb6, 0x17, 0x17, + 0x9e, 0x9e, 0x68, 0x66, 0x1d, 0x98, 0xa2, 0xea, + 0xea, 0xcb, 0xa2, 0x2b, 0xdc, 0x7f, 0xeb, 0xea, + 0x2b, 0xea, 0x2b, 0x5f, 0x92, 0x3c, 0xc, 0xc, + 0x92, 0x91, 0x38, 0x48, 0xdc, 0xd0, 0x88, 0x48, + 0xb, 0x2b, 0x2b, 0x92, 0x5f, 0xaa, 0x3c, 0xc1, + 0x2b, 0xd, 0x13, 0x40, 0xcb, 0xcb, 0xa2, 0xdc, + 0xc, 0x2b, 0x2b, 0x2b, 0x92, 0x92, 0xd, 0xdc, + 0x2b, 0xdc, 0xd0, 0x3c, 0xc, 0xc, 0xc, 0x5f, + 0x5f, 0x92, 0xc, 0x92, 0x92, 0x1d, 0x52, 0x55, + 0x37, 0x55, 0x82, 0x82, 0x58, 0x8c, 0xd3, 0x62, + 0x62, 0x1c, 0x1c, 0x29, 0x1c, 0x8a, 0x6d, 0x58, + 0x79, 0x19, 0xc2, 0xd5, 0x19, 0x63, 0xc2, 0x4a, + 0x19, 0x19, 0x19, 0xd2, 0xf0, 0x63, 0x63, 0xa5, + 0x2, 0x6e, 0x63, 0xd2, 0xd2, 0xf1, 0x79, 0xe9, + 0x89, 0x1b, 0x63, 0x63, 0x1b, 0x89, 0x63, 0x2f, + 0x8, 0x79, 0x2f, 0x2f, 0xd3, 0xa, 0x62, 0x29, + 0x29, 0x4d, 0x82, 0x55, 0x4d, 0x61, 0xe3, 0x78, + 0x78, 0xa, 0x82, 0x24, 0x5a, 0x6e, 0x27, 0x9c, + 0xe5, 0x6f, 0xff, 0x32, 0x6c, 0x6c, 0x27, 0x47, + 0x4, 0x47, 0x18, 0xa9, 0xe5, 0x4, 0xde, 0x9c, + 0x6c, 0x6b, 0x7d, 0xef, 0x7a, 0xb3, 0x58, 0x2f, + 0x2f, 0xd2, 0x2f, 0x2f, 0x30, 0xa0, 0x89, 0x42, + 0xf1, 0x5, 0x8a, 0x6d, 0x29, 0xe3, 0x58, 0xa6, + 0xd9, 0x47, 0xde, 0x9c, 0x93, 0xc4, 0xc6, 0x93, + 0x97, 0xc0, 0xc6, 0x6b, 0xfd, 0xdd, 0xde, 0x27, + 0x6e, 0xe5, 0xd7, 0x6c, 0x4, 0x9c, 0x39, 0x4, + 0x97, 0xe4, 0x12, 0x9c, 0x9c, 0xf3, 0xc0, 0x47, + 0x47, 0x90, 0x93, 0x4, 0x4, 0xf5, 0x7d, 0x6e, + 0x77, 0x77, 0x6e, 0xa5, 0xa5, 0x7a, 0xd5, 0xd7, + 0x4, 0xf5, 0x99, 0x4, 0xc0, 0xc0, 0xaf, 0x9c, + 0xca, 0x6b, 0xe4, 0x12, 0x93, 0xcc, 0xc6, 0x93, + 0x97, 0xc0, 0xcd, + 0x59, 0x4e, 0x27, 0x83, 0xfd, 0x7b, 0xde, 0xe4, + 0xbd, 0xf5, 0xde, 0xe1, 0xde, 0x9d, 0x40, 0xde, + 0x32, 0x47, 0x81, 0xbd, 0x9c, 0x47, 0x9d, 0x27, + 0x2f, 0xd3, 0x6d, 0xda, 0x4d, 0x62, 0xa, 0xe3, + 0x4d, 0xab, 0x65, 0xac, 0xa, 0x58, 0x2f, 0x2, + 0x63, 0xf1, 0x2f, 0x42, 0xa0, 0x89, 0x79, 0x1b, + 0xf1, 0x1b, 0x6e, 0xd2, 0x63, 0x6e, 0xe, 0x63, + 0x63, 0x63, 0x63, 0x2, 0xf1, 0x2f, 0x1b, 0x63, + 0x63, 0x63, 0x4a, 0x63, 0x63, 0x63, 0x63, 0x63, + 0x63, 0x63, 0x19, 0x63, 0xf1, 0x8, 0x89, 0x63, + 0xd2, 0x8, 0x5, 0x30, 0x58, 0x8a, 0x41, 0xd3, + 0x78, 0x62, 0xa, 0x23, 0x76, 0x76, 0x66, 0xd3, + 0x52, 0x52, 0xb6, 0x1f, 0xf, 0xaa, 0xc, 0xc, + 0x80, 0xcb, 0xcb, 0x4b, 0x9a, 0x9a, 0x9a, 0x57, + 0x9a, 0xbc, 0xea, 0x2b, 0x2b, 0x3c, 0x3c, 0x2b, + 0x80, 0xd0, 0x33, 0xc, 0x92, 0xb6, 0x61, 0x66, + 0xb6, 0x1f, 0x52, 0x1d, 0x3f, 0xd0, 0xcb, 0xcb, + 0x74, 0x57, 0xd0, 0xc1, 0x3c, 0xea, 0xea, 0x2b, + 0xc, 0x3c, 0x80, 0x2b, 0xc, 0x3c, 0x33, 0xd6, + 0x80, 0xdb, 0x3e, 0xd, 0x92, 0x80, 0x80, 0x2b, + 0x92, 0xaa, 0xc1, 0x3c, 0x2b, 0x3c, 0x33, 0xd, + 0x3c, 0xea, 0xa2, 0xdc, 0x3c, 0x80, 0xea, 0x2b, + 0x3c, 0x3c, 0x33, 0xd, 0xea, 0x2b, 0xd0, 0x38, + 0xc1, 0x80, 0x2b, 0x2b, 0xc, 0xf, 0x5f, 0xc, + 0x3c, 0xc, 0x92, 0x33, 0xc1, 0x3f, 0x49, 0xa7, + 0x55, 0x37, 0xe3, 0xbe, 0x4d, 0xd3, 0xac, 0x29, + 0x1c, 0x58, 0x1c, 0x29, 0x45, 0x73, 0x73, 0x89, + 0x89, 0x63, 0xd2, 0x79, 0xa5, 0xd2, 0x79, 0x42, + 0x19, 0x19, 0x4a, 0x4a, 0x1b, 0x19, 0x19, 0x1b, + 0x63, 0x6e, 0x2f, 0x8, 0x79, 0x1b, 0xa5, 0x5b, + 0x89, 0x19, 0x63, 0x19, 0x63, 0x73, 0xf1, 0xf1, + 0x8, 0x2f, 0x58, 0x1c, 0xa, 0x62, 0xb5, 0x6d, + 0xb5, 0x87, 0x1, 0x52, 0xab, 0x4d, 0x4d, 0x76, + 0xd1, 0x62, 0x37, 0xbe, 0x8c, 0xd5, 0x1e, 0xde, + 0x6f, 0x7d, 0x9, 0xbd, 0x4, 0x47, 0x3e, 0x7c, + 0x47, 0x97, 0xde, 0xca, 0xe5, 0x9c, 0xb1, 0xbd, + 0x6c, 0x7d, 0xfb, 0x50, 0x2c, 0xb3, 0x58, 0x1c, + 0x24, 0x2f, 0x42, 0x2f, 0xb3, 0x30, 0x73, 0x2f, + 0xf1, 0x58, 0x58, 0xe3, 0x1c, 0x58, 0x5b, 0x96, + 0x7d, 0xbd, 0xbf, 0xf3, 0x93, 0xdf, 0xf3, 0xf3, + 0xfd, 0xe4, 0x81, 0x8b, 0x9d, 0xe4, 0xdd, 0xde, + 0x6f, 0x7d, 0x97, 0x9c, 0xc0, 0xdf, 0xdf, 0xf5, + 0x81, 0xbf, 0xbf, 0xf3, 0xed, 0x95, 0xbf, 0xf3, + 0xc0, 0xdf, 0x9c, 0x93, 0xb1, 0xd8, 0x99, 0x7e, + 0x72, 0x3e, 0x27, 0x8f, 0xd9, 0x6e, 0xef, 0x9c, + 0xc0, 0xb4, 0xf3, 0xc0, 0xb4, 0xe1, 0xe1, 0xdd, + 0x26, 0x1e, 0xbd, 0xbf, 0xaf, 0xbf, 0xe4, 0x12, + 0xc0, 0xe2, 0xbf, + 0x96, 0x6e, 0x47, 0x1e, 0x6f, 0xd7, 0x47, 0xce, + 0x4, 0x47, 0x9d, 0xdf, 0x9c, 0x4, 0x32, 0xde, + 0xe5, 0x6f, 0x8e, 0x32, 0x4, 0x8f, 0x50, 0x2c, + 0x1, 0xd3, 0x8c, 0x58, 0x6d, 0xac, 0xd3, 0x5e, + 0x62, 0x29, 0x4d, 0x62, 0xd1, 0x1c, 0xe3, 0x8, + 0x79, 0x63, 0x79, 0x63, 0x89, 0x89, 0x63, 0x63, + 0x42, 0x89, 0x1b, 0xf1, 0xf1, 0xd2, 0x63, 0x63, + 0x63, 0x19, 0x19, 0x19, 0x1b, 0x89, 0x63, 0x19, + 0x79, 0x63, 0xd2, 0xd2, 0xf1, 0x2d, 0x63, 0x63, + 0x6e, 0x63, 0x4a, 0x19, 0x1b, 0x42, 0x89, 0x1b, + 0x79, 0x41, 0x41, 0x8a, 0x62, 0x41, 0x67, 0x8c, + 0xd3, 0x29, 0x16, 0x29, 0x62, 0x62, 0x4d, 0x55, + 0x66, 0x61, 0xb6, 0x1f, 0x1f, 0x56, 0x80, 0x80, + 0xd, 0x5c, 0xf6, 0xf6, 0x7, 0x9a, 0x9a, 0xa2, + 0xa2, 0xbc, 0xea, 0x3c, 0xaa, 0x33, 0x18, 0xa2, + 0xea, 0xd0, 0x38, 0x56, 0x5f, 0xf, 0x17, 0x55, + 0x55, 0x66, 0xa8, 0x22, 0xb, 0x5c, 0xcb, 0xcb, + 0xbc, 0xea, 0xd, 0xaa, 0x5f, 0xc, 0x2b, 0xc, + 0x5f, 0x56, 0xd, 0x2b, 0xc, 0xc1, 0x38, 0x33, + 0xc, 0x2b, 0x3c, 0x1d, 0x1d, 0x5f, 0x2b, 0x92, + 0xaa, 0x56, 0x33, 0xd0, 0x2b, 0x2b, 0x33, 0x33, + 0x5f, 0xc, 0xea, 0x2b, 0x5f, 0xaa, 0x3c, 0x2b, + 0x2b, 0x3c, 0x33, 0xd, 0x80, 0x2b, 0xdc, 0xd, + 0x56, 0xc, 0x2b, 0xc, 0x5f, 0xb6, 0xb7, 0xc1, + 0x2b, 0x3c, 0xc1, 0x38, 0x48, 0x3c, 0x91, 0x56, + 0x64, 0x94, 0xab, 0x8c, 0x24, 0x29, 0x62, 0xd1, + 0x62, 0x41, 0xa, 0x1c, 0x8, 0x2f, 0x79, 0xd5, + 0xc2, 0x6e, 0x4a, 0x1b, 0x19, 0x63, 0x79, 0x67, + 0xf1, 0xe9, 0xd5, 0xc2, 0x6e, 0xe, 0x5d, 0xd5, + 0x63, 0x6e, 0xe, 0x42, 0x1b, 0x63, 0x1b, 0x73, + 0x63, 0x19, 0xd5, 0xc5, 0x19, 0x5b, 0x2f, 0xe7, + 0xe, 0x42, 0x2f, 0xd3, 0xa, 0xa, 0x4d, 0x4d, + 0x4d, 0x55, 0x52, 0xb6, 0x1f, 0x66, 0x17, 0x37, + 0x76, 0x29, 0x29, 0xb5, 0xa0, 0xfb, 0xd8, 0x81, + 0x81, 0xdf, 0x75, 0xbc, 0xc6, 0x81, 0x90, 0x1e, + 0xf3, 0xe4, 0x85, 0xc6, 0x81, 0xe4, 0xe1, 0x57, + 0xc6, 0xc6, 0xdb, 0x91, 0xa8, 0xc9, 0xad, 0x68, + 0x41, 0x5, 0x5a, 0x68, 0x62, 0xe3, 0x58, 0x8c, + 0x8c, 0x82, 0x82, 0x82, 0x82, 0xad, 0xd9, 0x39, + 0x9c, 0xe4, 0xbf, 0x95, 0xe1, 0xbf, 0xbf, 0xe1, + 0x57, 0xaf, 0xf4, 0xe1, 0x81, 0xb4, 0xbf, 0xe4, + 0xe4, 0xc6, 0xe1, 0xe1, 0xe1, 0xe1, 0xe4, 0xb4, + 0x7, 0xb4, 0xbf, 0xbf, 0xf4, 0xe2, 0xe2, 0xe4, + 0xb4, 0xe4, 0xbb, 0xb4, 0xbc, 0x74, 0xe1, 0x40, + 0xdb, 0x13, 0x90, 0x1e, 0xf5, 0xde, 0x9c, 0xdf, + 0xe4, 0xbf, 0xbf, 0xbf, 0x9a, 0x57, 0x57, 0x9, + 0xaf, 0xcd, 0xbf, 0xf4, 0xbf, 0xbf, 0xbf, 0xbf, + 0xbb, 0xbf, 0xf4, + 0xd9, 0xc5, 0x98, 0x9f, 0xd8, 0x27, 0x8b, 0x81, + 0x2e, 0xc0, 0xc4, 0xdf, 0xf3, 0xbd, 0xbd, 0xf3, + 0x9c, 0x6b, 0x40, 0x7, 0x97, 0x3a, 0x4e, 0x49, + 0xab, 0xd3, 0xbe, 0x4d, 0x1c, 0xe3, 0x66, 0x94, + 0xda, 0x1c, 0x29, 0xa, 0x29, 0x1c, 0xda, 0x58, + 0x42, 0xd5, 0xe, 0x1b, 0x89, 0x89, 0xe, 0x19, + 0x19, 0x19, 0x1b, 0xf1, 0x8, 0x89, 0x4a, 0x4a, + 0x6e, 0x8f, 0xd7, 0xd5, 0xe, 0x1b, 0xd5, 0xe9, + 0x63, 0xd5, 0x6e, 0x42, 0x73, 0x79, 0x6e, 0x6e, + 0xa5, 0x19, 0x11, 0x6e, 0x63, 0x6e, 0x89, 0x2, + 0x2f, 0xb3, 0x58, 0x29, 0x62, 0x1c, 0xc7, 0x1, + 0xa, 0x29, 0x29, 0xe3, 0xd3, 0x94, 0x66, 0xab, + 0x52, 0x52, 0x1d, 0x5f, 0x56, 0x5c, 0x18, 0xdc, + 0xdc, 0xd, 0xeb, 0xa2, 0xba, 0xf6, 0x9a, 0xcb, + 0xcb, 0xcb, 0xcb, 0xa2, 0x80, 0x51, 0xcb, 0xba, + 0x2b, 0xdc, 0x3c, 0xc, 0xc, 0xc, 0x3f, 0x3f, + 0x1d, 0x59, 0xae, 0x18, 0xcb, 0xa2, 0x53, 0xea, + 0x2b, 0x2b, 0xc, 0xaa, 0x92, 0x3c, 0xc1, 0xdc, + 0x3c, 0x91, 0xd0, 0xdc, 0xc, 0x3c, 0x56, 0x92, + 0xc, 0xc, 0xc, 0x3c, 0x92, 0x92, 0x80, 0xd, + 0x80, 0x3f, 0x48, 0xb, 0x2b, 0x3c, 0x2b, 0xc, + 0x3c, 0x2b, 0x3c, 0xdc, 0xd, 0x91, 0xd0, 0xa2, + 0xd0, 0xc, 0x80, 0xb, 0x2b, 0x3c, 0xc, 0x3c, + 0xc, 0x3c, 0xc, 0xb, 0x3c, 0x92, 0x3f, 0x48, + 0xdc, 0xc, 0x80, 0x91, 0x2b, 0x92, 0x92, 0x3f, + 0x59, 0xa8, 0xad, 0x8, 0xb3, 0xe3, 0xd1, 0xa, + 0x23, 0x6d, 0x62, 0x1c, 0x8c, 0x1, 0x49, 0xc5, + 0x8f, 0xd7, 0x8f, 0xe5, 0xef, 0xd5, 0x42, 0x68, + 0xa0, 0xa5, 0x52, 0x67, 0xa5, 0xe, 0xa5, 0xd2, + 0xd5, 0xd5, 0xd5, 0x19, 0x6e, 0x6e, 0xe7, 0x79, + 0x63, 0xd5, 0x60, 0x60, 0xa5, 0x63, 0x6e, 0xc9, + 0x1b, 0x6e, 0x7a, 0x58, 0x1c, 0x62, 0xd1, 0xd1, + 0x78, 0x76, 0x66, 0x17, 0x52, 0x49, 0x1f, 0x55, + 0x82, 0xda, 0x24, 0x8c, 0x73, 0xd9, 0x13, 0xdb, + 0xd8, 0xc6, 0xc6, 0xf6, 0x81, 0xe4, 0xbf, 0xbf, + 0xc6, 0x90, 0x4b, 0x57, 0x9d, 0xe1, 0xf6, 0xa2, + 0x90, 0x71, 0x81, 0x7f, 0xa8, 0xad, 0x2f, 0x67, + 0xda, 0x68, 0xb3, 0x6, 0x29, 0x41, 0x24, 0x82, + 0xb5, 0x24, 0x2f, 0xd3, 0x24, 0x8, 0xd9, 0x1e, + 0x9d, 0xc6, 0x4b, 0xf6, 0x9f, 0xe4, 0xb4, 0xe4, + 0x81, 0xbf, 0x8d, 0x2e, 0xf3, 0xc6, 0x4b, 0xde, + 0x9d, 0xbc, 0x90, 0x39, 0x88, 0xc6, 0xe4, 0xc0, + 0xdf, 0xdf, 0xbf, 0x12, 0xf3, 0x12, 0xf9, 0xf5, + 0xd8, 0xe1, 0xce, 0x9c, 0x39, 0x90, 0xc4, 0x32, + 0x6b, 0x5c, 0x4f, 0xe5, 0x47, 0x36, 0x6b, 0x7d, + 0x90, 0x75, 0xbf, 0x32, 0xdf, 0xdf, 0xdf, 0xce, + 0x93, 0xaf, 0xcc, 0x4b, 0xed, 0xaf, 0xbf, 0xdd, + 0xed, 0xdf, 0xb4, + 0x8b, 0x51, 0xb, 0x53, 0x84, 0xc6, 0xc6, 0x8d, + 0x84, 0xbf, 0xb4, 0xb4, 0xe4, 0xde, 0xfd, 0x9d, + 0xb4, 0xd8, 0x9f, 0xf6, 0x84, 0x71, 0x83, 0x7f, + 0x59, 0xb5, 0x4d, 0x78, 0x76, 0x37, 0x61, 0x61, + 0xbe, 0x82, 0x29, 0x37, 0xb5, 0x30, 0x8, 0x73, + 0x63, 0x19, 0xc5, 0x2f, 0x2f, 0x1b, 0xa5, 0x7a, + 0x8f, 0x6b, 0xef, 0xef, 0x19, 0x4a, 0xd7, 0x19, + 0x6e, 0xd5, 0x77, 0x2f, 0x2c, 0xd2, 0x77, 0x77, + 0x5d, 0x19, 0xef, 0x19, 0x19, 0x1b, 0xe, 0xe9, + 0xa5, 0x6e, 0xd5, 0x79, 0xf1, 0xef, 0xef, 0xe9, + 0x21, 0x89, 0xad, 0x58, 0x1c, 0x8a, 0x87, 0x94, + 0xac, 0x78, 0x78, 0x76, 0x61, 0x52, 0x4e, 0x4e, + 0x1d, 0x56, 0x38, 0x92, 0x92, 0x3c, 0x3c, 0x92, + 0xc, 0x2b, 0xa2, 0xdc, 0xd0, 0xcb, 0x9a, 0x9a, + 0x40, 0xcb, 0xcb, 0xd0, 0x2b, 0x2b, 0xea, 0x2b, + 0x2b, 0x2b, 0xd0, 0xdc, 0x80, 0xd, 0x51, 0xa2, + 0xb, 0xb, 0xd0, 0x48, 0x2b, 0x2b, 0x2b, 0xc, + 0xaa, 0xc, 0x2b, 0xdc, 0x2b, 0xd, 0xd, 0xd, + 0x3c, 0x2b, 0xc, 0xaa, 0x5f, 0xc, 0xc, 0xc, + 0xaa, 0xaa, 0xc1, 0xd0, 0x48, 0xc, 0xc1, 0xc1, + 0x3c, 0x2b, 0x2b, 0xc, 0xaa, 0x92, 0x80, 0xdc, + 0x2b, 0x5f, 0xd, 0xa2, 0xbc, 0xdc, 0x80, 0x33, + 0x3c, 0x2b, 0x3c, 0xc, 0xc, 0xaa, 0x80, 0xba, + 0xa2, 0xea, 0x33, 0xd, 0xd0, 0x80, 0x2b, 0xaa, + 0xb7, 0x3f, 0x91, 0x91, 0x4e, 0xa8, 0xa8, 0xe9, + 0x77, 0x2f, 0x8c, 0x24, 0x82, 0x29, 0x78, 0xa, + 0x1c, 0x29, 0x62, 0xb5, 0x30, 0x3b, 0x58, 0x8, + 0x19, 0x4a, 0xd2, 0x4a, 0x6e, 0x4a, 0xd2, 0xe9, + 0x1b, 0x89, 0x89, 0xa0, 0x1b, 0x42, 0x30, 0x79, + 0x63, 0x19, 0xe, 0xd2, 0x42, 0x89, 0xf1, 0x42, + 0x63, 0x1b, 0x73, 0x89, 0x63, 0x63, 0xa5, 0xe9, + 0x89, 0x63, 0x2f, 0x67, 0x41, 0xa, 0x16, 0x23, + 0xe3, 0x82, 0x82, 0xbe, 0x8c, 0x2f, 0x49, 0x66, + 0x61, 0xac, 0xd3, 0xab, 0x5a, 0x96, 0xd4, 0x7d, + 0x47, 0x97, 0x81, 0xdf, 0x9c, 0x97, 0xe4, 0xd8, + 0x3, 0x9c, 0x83, 0xa9, 0x27, 0x47, 0x99, 0x99, + 0x4, 0x4, 0x1e, 0x5d, 0x1, 0x8c, 0x24, 0xe3, + 0xa, 0x6d, 0xbe, 0x4d, 0xe3, 0x8, 0x5b, 0x5, + 0x58, 0x30, 0x67, 0x82, 0x29, 0x87, 0x96, 0xd5, + 0xa9, 0x3d, 0x9c, 0x9c, 0x6f, 0xdd, 0xbf, 0x93, + 0x9c, 0xf3, 0x12, 0x32, 0x3, 0x1e, 0xed, 0x47, + 0x3a, 0x8b, 0xca, 0xe5, 0x4, 0x81, 0xf3, 0x4, + 0x4, 0x12, 0xc0, 0x97, 0x97, 0xe1, 0xf5, 0x4, + 0x97, 0x12, 0xdd, 0x9c, 0x9c, 0xde, 0x32, 0x47, + 0x3, 0xa3, 0x77, 0xd5, 0xef, 0xe8, 0xe5, 0xe5, + 0x97, 0x12, 0xf3, 0x4, 0x93, 0xc0, 0xf3, 0x4, + 0x97, 0xf3, 0xe1, 0xb9, 0x97, 0xc0, 0xaf, 0x26, + 0x4, 0x12, 0xc0, + 0x6b, 0x6b, 0x5c, 0x39, 0x9c, 0x97, 0x2e, 0xfa, + 0x39, 0xf5, 0xd8, 0x57, 0xb1, 0xe5, 0xd9, 0x1e, + 0x9c, 0x32, 0x9c, 0x39, 0x6b, 0x47, 0x9f, 0x98, + 0xa8, 0x8c, 0x6d, 0xb5, 0x41, 0xb5, 0x29, 0xd1, + 0x1c, 0x41, 0x78, 0xa, 0x29, 0x30, 0xf1, 0x2f, + 0xd2, 0x1b, 0x73, 0x8, 0xf1, 0x63, 0x5b, 0xa6, + 0xf1, 0x63, 0xd2, 0xa5, 0x1b, 0x6e, 0xd5, 0x4a, + 0x19, 0x19, 0x63, 0x8, 0x45, 0x63, 0xa5, 0xa8, + 0x67, 0x1b, 0x19, 0x63, 0xd2, 0x63, 0x5b, 0x2f, + 0xf1, 0x63, 0x63, 0x89, 0x89, 0x63, 0xd5, 0xa5, + 0x68, 0x58, 0x8, 0x41, 0x62, 0x62, 0x1c, 0x29, + 0xe3, 0x76, 0x62, 0x78, 0xa, 0x58, 0xa5, 0xa5, + 0x49, 0x9e, 0x1d, 0xf, 0x5f, 0xc, 0x92, 0x56, + 0xaa, 0x80, 0xa2, 0xcb, 0x5c, 0x5c, 0xf6, 0x74, + 0xba, 0xd, 0xc1, 0x3c, 0x2b, 0x2b, 0xea, 0xd, + 0x48, 0xa2, 0xcb, 0xcb, 0xd0, 0xc1, 0x88, 0xba, + 0xdc, 0x2b, 0x3c, 0x1d, 0x92, 0x3c, 0x2b, 0xd, + 0x92, 0x33, 0xd0, 0xa2, 0x80, 0x3c, 0x3c, 0xc, + 0xc, 0xc, 0x3c, 0xaa, 0xb7, 0x3c, 0x2b, 0xd0, + 0xd, 0x3f, 0xb, 0xa2, 0xea, 0xc, 0x5f, 0xb7, + 0x92, 0x2b, 0x2b, 0xc1, 0xb8, 0x3c, 0x2b, 0xa2, + 0xba, 0x3c, 0xc1, 0xb, 0xea, 0x2b, 0xc, 0x3c, + 0x92, 0xc, 0x2b, 0x48, 0xd0, 0x38, 0xd, 0xbc, + 0xa2, 0xea, 0xc1, 0x48, 0x2b, 0xdc, 0xdc, 0x91, + 0x91, 0xc7, 0x7a, 0xe9, 0x6e, 0xe, 0xe9, 0xd2, + 0x79, 0x8c, 0xa, 0x78, 0x76, 0x4d, 0x78, 0xa, + 0x4d, 0xe3, 0xb5, 0x58, 0x42, 0x8, 0x30, 0x1b, + 0x19, 0xd2, 0x89, 0x19, 0xd5, 0x63, 0xd2, 0x63, + 0x19, 0x63, 0x63, 0x19, 0x19, 0x63, 0xf1, 0x42, + 0x6e, 0x6e, 0x2f, 0xa5, 0x63, 0x63, 0x63, 0xe9, + 0x19, 0x63, 0x63, 0x19, 0x6e, 0x19, 0x79, 0x2f, + 0x42, 0xe, 0xc5, 0x67, 0xb5, 0x62, 0xd1, 0x78, + 0xbe, 0xb3, 0xc3, 0xab, 0xa7, 0xa7, 0x94, 0x66, + 0x4d, 0x4d, 0x5e, 0x82, 0x67, 0x7d, 0xf5, 0xbd, + 0x9c, 0xf3, 0xce, 0xe4, 0x1e, 0xdd, 0x81, 0xd8, + 0x9d, 0x9c, 0xbf, 0x81, 0xfd, 0xb1, 0xf3, 0xbd, + 0x6f, 0x9b, 0xd8, 0x3e, 0x1, 0xab, 0x82, 0x4d, + 0x62, 0x6d, 0x29, 0x1c, 0xe3, 0x30, 0x73, 0x8, + 0x41, 0x8a, 0xb5, 0xe3, 0xe3, 0x1, 0xd4, 0x7d, + 0x6b, 0xd8, 0xb4, 0xf3, 0xf3, 0xe4, 0xb4, 0x9, + 0xde, 0x57, 0xe1, 0xdd, 0xd8, 0x57, 0xc6, 0xb1, + 0x1e, 0xc6, 0xc6, 0x9c, 0xc0, 0xe4, 0xc6, 0xf3, + 0xb4, 0xe1, 0xe1, 0xc0, 0xc6, 0xb4, 0xbf, 0xf3, + 0x81, 0xc6, 0xe4, 0xf3, 0xbd, 0xe1, 0x90, 0x90, + 0x53, 0x48, 0xeb, 0x27, 0xef, 0x83, 0xce, 0xc0, + 0xe4, 0xf4, 0xe4, 0xb4, 0xbf, 0x7, 0x9a, 0xbc, + 0x90, 0xc6, 0xb0, 0x8d, 0x12, 0xcc, 0xf7, 0xf7, + 0xaf, 0xbf, 0xbb, + 0x47, 0x6c, 0xe5, 0xca, 0x4, 0x4, 0xfd, 0x81, + 0x6b, 0xe5, 0xfd, 0x9d, 0x6f, 0x6c, 0x47, 0x7b, + 0x4, 0x4, 0x9c, 0x83, 0xef, 0x47, 0x98, 0x91, + 0x52, 0x61, 0x4d, 0x6d, 0xd3, 0x87, 0xe3, 0xa, + 0x76, 0x78, 0x78, 0x23, 0xa, 0x41, 0xd3, 0x8c, + 0x2f, 0x1b, 0x89, 0x42, 0x63, 0x89, 0x63, 0x42, + 0x42, 0x63, 0x2f, 0x58, 0xf1, 0x63, 0xe9, 0x63, + 0x63, 0xd5, 0x19, 0x63, 0x19, 0x19, 0xd2, 0x67, + 0x30, 0x63, 0x19, 0xd2, 0xa5, 0x1b, 0x63, 0xd2, + 0xd2, 0x19, 0x6e, 0x63, 0x6e, 0x19, 0x19, 0xa5, + 0x58, 0x58, 0xb3, 0xb5, 0xa, 0x76, 0x37, 0x37, + 0x6d, 0x4d, 0x6d, 0xa, 0x62, 0x87, 0x5a, 0x2f, + 0x52, 0x52, 0xb6, 0xb6, 0x92, 0x3c, 0xc1, 0x22, + 0xd6, 0xdc, 0xcb, 0xa2, 0xcb, 0xcb, 0xa2, 0xea, + 0x2b, 0x2b, 0x2b, 0xc1, 0x3c, 0xdc, 0xa2, 0xcb, + 0x40, 0x57, 0xcb, 0xbc, 0xea, 0x2b, 0x2b, 0x2b, + 0xc, 0xc, 0x2b, 0x80, 0x2b, 0xc, 0xdc, 0xcb, + 0x80, 0x2b, 0x2b, 0xdc, 0x2b, 0xc, 0xc, 0x3c, + 0xc, 0xc, 0xc, 0x48, 0xc1, 0x92, 0xc1, 0xa2, + 0xa2, 0x2b, 0x80, 0xdc, 0x2b, 0xc, 0x3c, 0x92, + 0x92, 0xaa, 0x3c, 0xa2, 0xa2, 0xdc, 0xea, 0x80, + 0xdc, 0xc, 0xc, 0x2b, 0xc, 0xc, 0x2b, 0x80, + 0x80, 0xea, 0xdc, 0xa2, 0xbc, 0xea, 0x2b, 0xdc, + 0xea, 0x2b, 0xc, 0x3c, 0xc, 0xc, 0x80, 0xdc, + 0x51, 0xa9, 0xe9, 0xc5, 0xe, 0xe9, 0x2f, 0xa8, + 0x87, 0x4d, 0xa, 0xa, 0x78, 0x76, 0x78, 0x78, + 0xa, 0xe3, 0x4d, 0x87, 0x59, 0xe7, 0xa5, 0x1b, + 0x1b, 0x1b, 0x6e, 0xef, 0xe5, 0xe, 0xa5, 0xd2, + 0xd5, 0xe7, 0xa5, 0x19, 0x6e, 0x6e, 0x79, 0x7a, + 0x6e, 0x63, 0x89, 0x63, 0x63, 0x63, 0xd2, 0x89, + 0x6e, 0xd5, 0x6e, 0x6e, 0x89, 0x1b, 0x1b, 0xae, + 0xa5, 0x6e, 0x59, 0xab, 0xb5, 0x78, 0xd1, 0xd1, + 0x29, 0x82, 0x94, 0xb6, 0x1f, 0x52, 0x52, 0x66, + 0x52, 0x82, 0x82, 0x82, 0xa6, 0x7d, 0x81, 0xb4, + 0x90, 0x4b, 0xbf, 0x7, 0x74, 0x81, 0x4b, 0x4b, + 0xe4, 0xe4, 0xce, 0x4b, 0x90, 0x4b, 0xb4, 0x9a, + 0xd8, 0xcb, 0x88, 0x3e, 0x2c, 0x8c, 0x87, 0xb5, + 0x1c, 0x41, 0xe3, 0x62, 0x29, 0xda, 0x67, 0x8c, + 0xe3, 0x6d, 0x82, 0x24, 0x24, 0xa8, 0x7f, 0x4f, + 0x7d, 0xc6, 0xe4, 0xe4, 0xe4, 0xf6, 0xc6, 0xe4, + 0x7, 0xbc, 0x4b, 0x4b, 0x81, 0x81, 0x8d, 0xce, + 0x4b, 0x90, 0xc6, 0xbd, 0xde, 0x75, 0x90, 0x81, + 0xe4, 0xe1, 0xf4, 0xc6, 0xc6, 0xe4, 0xf4, 0xbf, + 0xbf, 0xdf, 0x81, 0xc6, 0x84, 0x74, 0x18, 0x7d, + 0xd8, 0x18, 0x3, 0x7d, 0x7d, 0x7d, 0x81, 0xe4, + 0xbf, 0x4b, 0x90, 0x81, 0xbf, 0x9a, 0x57, 0x74, + 0xca, 0xdf, 0xcc, 0xbf, 0x95, 0xcc, 0xdf, 0xcc, + 0xc0, 0xbf, 0xcc, + 0x1e, 0x8e, 0xdd, 0xcf, 0xd8, 0x97, 0x9d, 0xf6, + 0x1e, 0x93, 0xf8, 0xfa, 0x32, 0x93, 0xf3, 0x8d, + 0xfd, 0x36, 0xd8, 0x53, 0x40, 0x9d, 0xeb, 0x49, + 0x52, 0x94, 0x78, 0x4d, 0x82, 0x2f, 0x67, 0x29, + 0x62, 0x62, 0x23, 0xa, 0xa, 0x1c, 0x6d, 0x58, + 0xd2, 0x19, 0x63, 0xd2, 0x1b, 0x19, 0x63, 0xd5, + 0x19, 0x19, 0x1b, 0xa0, 0x42, 0xd2, 0x2f, 0x2f, + 0xd2, 0xd5, 0xc5, 0x77, 0x19, 0xef, 0xd5, 0x79, + 0xf1, 0xc5, 0xc2, 0x63, 0xe, 0x19, 0xc2, 0xa5, + 0x42, 0x6e, 0x4a, 0x63, 0x63, 0x6e, 0xe7, 0x42, + 0x2f, 0x8c, 0x24, 0x29, 0x29, 0xd1, 0x76, 0xd1, + 0xd1, 0x76, 0x78, 0xa, 0x6d, 0xbe, 0x52, 0x17, + 0x1f, 0x92, 0x92, 0x56, 0x56, 0x3c, 0xa2, 0xa2, + 0xdc, 0x3c, 0xc1, 0xea, 0x2b, 0x2b, 0xc1, 0xd, + 0xd, 0x2b, 0xd0, 0xa2, 0xd, 0xd, 0xd0, 0xbc, + 0xba, 0x2b, 0x2b, 0x3c, 0xc, 0x3c, 0x3c, 0xc1, + 0xc1, 0xc, 0xdc, 0xa2, 0x80, 0x92, 0x3c, 0xdc, + 0x2b, 0xc, 0x92, 0x5f, 0xc, 0x3c, 0x2b, 0x48, + 0xd, 0xaa, 0x3c, 0xb, 0xb, 0x3c, 0xaa, 0x92, + 0x2b, 0xc, 0xc, 0x3c, 0xaa, 0x2b, 0xc, 0x80, + 0x38, 0x33, 0x92, 0xea, 0xba, 0x2b, 0xc, 0xaa, + 0xc, 0x3c, 0xc, 0x3c, 0xd, 0xd, 0x48, 0xea, + 0xcb, 0xd, 0x5f, 0x48, 0xea, 0x2b, 0xc, 0xaa, + 0x5f, 0x3c, 0xc, 0x2b, 0xd, 0x33, 0x92, 0x48, + 0x51, 0xe8, 0xa8, 0x52, 0xab, 0x2f, 0xd3, 0x66, + 0x65, 0x82, 0x82, 0x87, 0x37, 0x23, 0x62, 0xa, + 0x78, 0x78, 0x78, 0xa, 0xd3, 0xab, 0xa8, 0x59, + 0x96, 0x96, 0x6e, 0xe5, 0xe5, 0x19, 0x6e, 0xc2, + 0x6e, 0x67, 0x42, 0xe7, 0x6e, 0x2, 0xc5, 0xd5, + 0x19, 0x6e, 0x1b, 0x19, 0x19, 0x19, 0x1b, 0x73, + 0xf0, 0xe9, 0x2f, 0x60, 0xc9, 0x73, 0x1b, 0xd5, + 0x6e, 0x6e, 0x73, 0x30, 0x41, 0x41, 0xa, 0xa, + 0xd1, 0x76, 0x66, 0x1f, 0x1f, 0x65, 0x9e, 0xa8, + 0x2c, 0xa8, 0x87, 0x24, 0x1, 0xe8, 0x81, 0x75, + 0x18, 0x99, 0xe4, 0xbf, 0xc6, 0xde, 0xdf, 0x9c, + 0xbd, 0xce, 0x8d, 0x81, 0x8b, 0x53, 0xe1, 0x81, + 0x25, 0x5c, 0x27, 0xa9, 0x60, 0x1, 0x65, 0x3b, + 0xda, 0x41, 0x41, 0x1c, 0x1c, 0x6d, 0x82, 0x1c, + 0x6d, 0x82, 0x24, 0x82, 0x87, 0x60, 0xfb, 0x7d, + 0x6b, 0x40, 0xe1, 0xe4, 0xd8, 0x90, 0x81, 0xc0, + 0x81, 0xe1, 0xe4, 0xf5, 0xbd, 0xe4, 0xb4, 0xbd, + 0x47, 0xa9, 0x3a, 0xfd, 0x9c, 0x83, 0xca, 0x32, + 0xf3, 0xe4, 0x8d, 0xf3, 0xf3, 0xbf, 0xcc, 0xdd, + 0xdd, 0x90, 0x9f, 0x1e, 0xdd, 0xc6, 0x86, 0x4, + 0x6f, 0xdf, 0x47, 0x11, 0xd7, 0x47, 0x9d, 0x47, + 0xdd, 0xb4, 0x90, 0xdd, 0xb4, 0xbf, 0xb4, 0xdd, + 0x8e, 0xf3, 0xbf, 0xaf, 0xdd, 0xcc, 0xf3, 0xb9, + 0xb9, 0xaf, 0xbf, + 0x88, 0x81, 0xf6, 0xa2, 0xf6, 0x90, 0xdf, 0x70, + 0xe4, 0xe4, 0x81, 0x90, 0xc4, 0xce, 0xe1, 0xbc, + 0x18, 0x39, 0x9f, 0x53, 0x74, 0x83, 0x5c, 0xe8, + 0xa8, 0x94, 0x78, 0x37, 0x4d, 0x55, 0x52, 0x66, + 0x5e, 0x76, 0xa, 0xb5, 0x24, 0x8, 0x30, 0x42, + 0x89, 0x77, 0x60, 0x2f, 0x30, 0xa6, 0x2f, 0x77, + 0xe, 0xd5, 0x63, 0x19, 0xd5, 0x19, 0xe, 0x73, + 0x89, 0xe, 0xa8, 0x2f, 0x79, 0xa5, 0xe7, 0xa5, + 0x79, 0xc5, 0x1b, 0x1b, 0x19, 0x11, 0x19, 0x1b, + 0x73, 0x1b, 0xe9, 0x60, 0x79, 0xe, 0x1b, 0xd2, + 0x96, 0x42, 0xa0, 0x5, 0xda, 0xa, 0xd1, 0xd1, + 0xd1, 0x23, 0x23, 0xd1, 0x78, 0x61, 0x65, 0x65, + 0xf, 0x5f, 0x80, 0x33, 0x56, 0x56, 0x80, 0x2b, + 0xc, 0xaa, 0x56, 0x3c, 0xd0, 0x2b, 0xd, 0x5c, + 0xd, 0x2b, 0xea, 0xa2, 0x3c, 0x56, 0x2b, 0x2b, + 0x2b, 0xc, 0xaa, 0x33, 0x80, 0x3c, 0x2b, 0x38, + 0xb8, 0x56, 0x2b, 0xea, 0x2b, 0x5f, 0x5f, 0xc, + 0xc, 0xc, 0xc, 0x33, 0x48, 0x2b, 0x2b, 0xdc, + 0xd, 0x5f, 0xc, 0x2b, 0x2b, 0xc, 0xf, 0x92, + 0x80, 0xea, 0x2b, 0xd, 0xeb, 0x80, 0x2b, 0x2b, + 0x80, 0x92, 0x1d, 0xc, 0x2b, 0xc, 0x3c, 0xc1, + 0xeb, 0xdc, 0x2b, 0xdc, 0x5c, 0x48, 0x2b, 0x2b, + 0xea, 0x2b, 0x92, 0x3c, 0xc, 0xea, 0x3c, 0xc1, + 0x5c, 0x7f, 0xdc, 0xdc, 0xb, 0x7a, 0x49, 0x52, + 0x49, 0xab, 0x24, 0xd3, 0xac, 0xa, 0x76, 0x78, + 0x76, 0x29, 0x4d, 0x82, 0xa, 0x23, 0x23, 0x76, + 0xd1, 0xa, 0x8a, 0x8a, 0xda, 0xb5, 0x5, 0x68, + 0x68, 0x5b, 0x6e, 0x8f, 0xd5, 0x4a, 0x19, 0x19, + 0x19, 0x63, 0x63, 0x19, 0x6e, 0x42, 0x79, 0xd2, + 0x19, 0x63, 0x19, 0xd2, 0x79, 0x63, 0x1b, 0x79, + 0x2f, 0x42, 0x89, 0x63, 0x63, 0x1b, 0x42, 0xd2, + 0x63, 0x63, 0x63, 0x2f, 0xd3, 0xd3, 0x37, 0xa, + 0x62, 0x76, 0x4d, 0x82, 0x8c, 0x1, 0x52, 0x2c, + 0x52, 0x52, 0xab, 0xd3, 0xb3, 0x2f, 0x6b, 0x9c, + 0x9c, 0x97, 0xf3, 0x86, 0x4, 0x97, 0xce, 0xbd, + 0x3, 0x3, 0x71, 0xfd, 0xef, 0x9d, 0xdf, 0xfd, + 0xe5, 0x47, 0x27, 0xe7, 0x67, 0xd3, 0x4d, 0xb5, + 0x78, 0xa, 0x6d, 0xe3, 0x41, 0x8c, 0x5, 0x5, + 0x45, 0x30, 0x6d, 0x62, 0xb5, 0x58, 0x2f, 0x6e, + 0x11, 0x25, 0x25, 0x9c, 0x4, 0x32, 0xbd, 0x97, + 0x4, 0xf3, 0xe4, 0x93, 0x97, 0x57, 0x9d, 0x9c, + 0x4, 0x3, 0x88, 0xd5, 0xd7, 0x93, 0x93, 0x9c, + 0x97, 0xdf, 0xdd, 0x97, 0x93, 0x75, 0x9f, 0x47, + 0x97, 0xc6, 0x1e, 0x9c, 0x9c, 0xbd, 0x32, 0x4, + 0x4, 0x3, 0x77, 0xef, 0x6c, 0x3, 0x27, 0xef, + 0xb1, 0xe4, 0xf3, 0x97, 0xf5, 0x81, 0xf9, 0x8e, + 0x4, 0xc0, 0xe4, 0x90, 0xfd, 0x93, 0x95, 0xcc, + 0x8e, 0xbd, 0xaf, + 0x27, 0x47, 0xde, 0xd8, 0x9c, 0x6f, 0x97, 0xe4, + 0x8e, 0x97, 0x32, 0xd8, 0xa9, 0x47, 0xde, 0x9f, + 0x47, 0x47, 0xce, 0xed, 0x47, 0x47, 0x6b, 0xa9, + 0x2c, 0xd3, 0x78, 0x4d, 0x4d, 0x76, 0x76, 0x76, + 0x78, 0xd1, 0x1c, 0x8a, 0xf1, 0xf1, 0xf1, 0x8, + 0x67, 0xd2, 0x42, 0x2d, 0x8, 0x30, 0x67, 0x8, + 0x1b, 0x89, 0xa5, 0x6e, 0xd5, 0xd5, 0xd5, 0x63, + 0xd2, 0x63, 0x89, 0x89, 0x63, 0x1b, 0xf1, 0x42, + 0x19, 0x63, 0x42, 0x63, 0x63, 0x19, 0x19, 0x1b, + 0xd2, 0x5a, 0x42, 0x89, 0xc2, 0x19, 0xe, 0xd2, + 0x1b, 0x2, 0x67, 0x41, 0xb5, 0xa, 0xd1, 0xa, + 0xa, 0xd1, 0xd1, 0xa, 0x76, 0x76, 0x61, 0xbe, + 0x52, 0xf, 0x92, 0x92, 0x5f, 0xc, 0x3c, 0xc, + 0x3c, 0xc, 0x91, 0xd0, 0xd0, 0xdc, 0xa2, 0xdc, + 0x80, 0x92, 0x3c, 0x2b, 0x2b, 0xc, 0x5f, 0x3c, + 0xc1, 0x3c, 0xc, 0xd, 0xd, 0xc, 0xaa, 0x3c, + 0x92, 0x5f, 0x92, 0xc, 0xc, 0x3c, 0xc, 0x3c, + 0xd, 0x3c, 0x2b, 0x48, 0xb, 0x3c, 0xc, 0x2b, + 0xc, 0xc, 0xc, 0x5f, 0x3c, 0xc, 0x2b, 0x80, + 0xd0, 0xd, 0xd, 0xea, 0x48, 0x2b, 0xc, 0xc, + 0x3c, 0xc, 0xc, 0x3c, 0xc1, 0xd, 0x2b, 0xea, + 0xa2, 0xd, 0x3c, 0xc, 0xea, 0x2b, 0x92, 0xc, + 0x3c, 0xdc, 0x2b, 0x2b, 0xd0, 0xd, 0xd, 0xea, + 0xa2, 0xa2, 0xc1, 0xc, 0x3c, 0x1d, 0x52, 0xab, + 0xab, 0x1, 0x8c, 0xab, 0x24, 0x29, 0x16, 0x29, + 0x78, 0x62, 0x29, 0xa, 0x23, 0xa, 0x23, 0x78, + 0x62, 0x5, 0x42, 0xd2, 0xf1, 0x30, 0xa0, 0x45, + 0x58, 0x58, 0x42, 0xc2, 0x1b, 0xe, 0x19, 0x4a, + 0x4a, 0x6e, 0x19, 0x19, 0x4a, 0x19, 0x6e, 0x6e, + 0xe9, 0x79, 0x1b, 0x79, 0x8, 0x42, 0xe9, 0x19, + 0x19, 0x89, 0x89, 0x63, 0x19, 0x63, 0x79, 0x73, + 0x8, 0x79, 0xa5, 0x7a, 0x67, 0xb5, 0x29, 0xa, + 0x62, 0xd3, 0x87, 0x65, 0x94, 0x49, 0x64, 0x1d, + 0x52, 0x94, 0xab, 0x8c, 0x5a, 0xc9, 0xd9, 0x83, + 0x8e, 0xdd, 0xf4, 0xdf, 0x83, 0x9d, 0x8d, 0xde, + 0x3, 0x27, 0xdf, 0xbd, 0x93, 0xdd, 0x4b, 0x7d, + 0xfd, 0xfd, 0x3a, 0xe8, 0xa6, 0x82, 0xe3, 0x6d, + 0xe3, 0x6d, 0x29, 0x58, 0xf1, 0x2f, 0x67, 0xa0, + 0x5, 0x8c, 0xd3, 0x4d, 0x29, 0x1c, 0xb3, 0xd2, + 0xe5, 0x71, 0x90, 0xf5, 0xf3, 0xe4, 0xe4, 0xdd, + 0x39, 0x81, 0x57, 0xe1, 0xe4, 0x9f, 0x90, 0xf3, + 0xff, 0x81, 0xdf, 0x7d, 0x7d, 0xb2, 0xe4, 0xb1, + 0xdf, 0x90, 0x74, 0xc6, 0x95, 0xb4, 0x4b, 0xf3, + 0xbf, 0xbf, 0xce, 0xdf, 0x9c, 0x81, 0x81, 0xd8, + 0xde, 0x8b, 0x77, 0x3, 0x47, 0xb1, 0x81, 0xca, + 0xf8, 0xbf, 0xe4, 0xc0, 0xf8, 0xdf, 0xdf, 0xd8, + 0x9f, 0xb4, 0xcd, 0xed, 0xce, 0xbf, 0xe2, 0xbf, + 0xf7, 0xed, 0xe4, + 0xfd, 0x6c, 0x9c, 0x9c, 0x4, 0x4, 0x97, 0xde, + 0x3, 0x4, 0x8e, 0xd8, 0x8b, 0x6b, 0x83, 0x69, + 0x4, 0x97, 0x32, 0x81, 0x3, 0x47, 0x3, 0x98, + 0x49, 0xa7, 0xb5, 0x4d, 0x8c, 0x1c, 0x6d, 0x78, + 0x62, 0xa, 0x58, 0xe3, 0xd3, 0xd3, 0x2f, 0x2f, + 0x1, 0x2f, 0x42, 0x63, 0x63, 0x63, 0x45, 0x73, + 0x89, 0x42, 0x67, 0xf1, 0x79, 0x79, 0xe9, 0x63, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x63, 0x89, + 0x63, 0xf1, 0x67, 0xf1, 0x63, 0x79, 0x19, 0x4a, + 0x19, 0x2, 0x1b, 0x1b, 0x19, 0x4a, 0x19, 0x19, + 0x1b, 0x67, 0xd3, 0x62, 0xe3, 0x78, 0x23, 0x23, + 0xd1, 0xd1, 0x23, 0xa, 0xa, 0x76, 0x37, 0x37, + 0x66, 0x9e, 0xb7, 0x5f, 0xc, 0xc, 0x5f, 0x33, + 0xd, 0xdc, 0xdc, 0xd, 0x38, 0x5f, 0x2b, 0xea, + 0x2b, 0xc, 0xaa, 0x3c, 0x3c, 0x2b, 0xc, 0xd, + 0x38, 0x3c, 0x2b, 0x2b, 0x3c, 0xb7, 0x5f, 0x92, + 0xc, 0xc, 0xaa, 0xc1, 0xdc, 0xea, 0x3c, 0xc1, + 0x38, 0xc1, 0xc, 0x2b, 0x2b, 0x3c, 0xaa, 0x92, + 0x2b, 0xc, 0xc, 0x56, 0x33, 0x5c, 0x48, 0x2b, + 0xd, 0x33, 0x92, 0xc, 0x2b, 0x3c, 0x5f, 0x1d, + 0xc, 0x2b, 0x80, 0x3c, 0x33, 0xeb, 0xea, 0x2b, + 0xdc, 0xc1, 0xaa, 0xc, 0xc, 0x2b, 0xc, 0xaa, + 0x38, 0x18, 0xea, 0xdc, 0xd, 0x5c, 0xb, 0x2b, + 0x2b, 0x3c, 0xb6, 0x1d, 0x92, 0x91, 0x2c, 0xab, + 0x4d, 0x82, 0xd3, 0x61, 0x4d, 0x16, 0x1c, 0x6d, + 0x66, 0x29, 0x16, 0x23, 0xa, 0xa, 0x29, 0xa, + 0x78, 0x87, 0xe9, 0x77, 0x50, 0xb3, 0xa4, 0xa6, + 0xa4, 0x5b, 0x6e, 0x1b, 0xc9, 0x8, 0x19, 0xd5, + 0xd5, 0x73, 0x6e, 0xe5, 0xef, 0xd5, 0xd5, 0xc5, + 0xc2, 0x19, 0xd5, 0xd9, 0x73, 0x5a, 0xd2, 0xef, + 0xd5, 0x6e, 0x6e, 0x4a, 0x5d, 0xa5, 0x89, 0xf0, + 0x96, 0x96, 0xd5, 0x6e, 0x2f, 0xe3, 0xd1, 0xd1, + 0x37, 0x5e, 0x61, 0x55, 0x1f, 0x1d, 0x91, 0x48, + 0x91, 0x59, 0xc3, 0xa6, 0x5a, 0x59, 0xd4, 0x90, + 0xe1, 0x7, 0x9a, 0xc6, 0xd8, 0x74, 0xe1, 0xbf, + 0xe4, 0xdf, 0xe4, 0xe4, 0xbf, 0xe1, 0xc6, 0x90, + 0xd8, 0x53, 0x51, 0x2a, 0x67, 0xd3, 0x82, 0x58, + 0x3b, 0x16, 0x29, 0x8a, 0xa0, 0x67, 0xe3, 0x1c, + 0xda, 0x8c, 0xab, 0xe3, 0x58, 0x68, 0xad, 0xd9, + 0x6b, 0xed, 0x81, 0x81, 0xe4, 0xe1, 0x57, 0xe1, + 0xe4, 0xf6, 0x57, 0xe1, 0xbf, 0xe4, 0xe4, 0x9, + 0xb4, 0xc6, 0x81, 0x39, 0xca, 0x81, 0xbc, 0x75, + 0xce, 0xb4, 0xe1, 0x9a, 0xbf, 0xf4, 0xbf, 0xf3, + 0xbf, 0x8d, 0xe4, 0xfa, 0x81, 0xe4, 0x9f, 0x9d, + 0xde, 0x9c, 0xf5, 0x47, 0x47, 0x93, 0x32, 0x6f, + 0xf3, 0xbf, 0xbf, 0xe1, 0xb4, 0xb4, 0xe4, 0xf6, + 0x9f, 0xb4, 0xcd, 0xcc, 0xaf, 0xf4, 0xf4, 0xf4, + 0x95, 0xbb, 0xbf, + 0xbd, 0x6f, 0x9c, 0x39, 0x9d, 0xfd, 0xfd, 0x81, + 0x8b, 0x6b, 0x93, 0xfa, 0xf3, 0x9c, 0x39, 0x81, + 0x2e, 0xde, 0x81, 0x8b, 0x7c, 0x3a, 0x8b, 0xdb, + 0xa8, 0x94, 0x61, 0xab, 0x1, 0x8c, 0x87, 0x82, + 0x29, 0xa, 0xe3, 0xb5, 0x6d, 0xe3, 0x8c, 0x8, + 0xa5, 0x5b, 0x1b, 0x19, 0x19, 0x4a, 0x19, 0x1b, + 0x19, 0x6e, 0x42, 0x89, 0xa0, 0x67, 0x2f, 0x63, + 0x4a, 0xd7, 0xc2, 0x4a, 0x4a, 0x4a, 0xd5, 0x6e, + 0x79, 0x2f, 0x30, 0x89, 0x63, 0x19, 0x4a, 0x4a, + 0x4a, 0xd5, 0xf0, 0x5b, 0xc2, 0xef, 0x77, 0x6e, + 0x79, 0x5a, 0x30, 0xda, 0x8a, 0xa, 0x23, 0x23, + 0x76, 0x76, 0x0, 0x23, 0x78, 0x37, 0xbe, 0x55, + 0x61, 0xb6, 0xb7, 0x33, 0x80, 0x2b, 0xaa, 0x38, + 0xeb, 0xea, 0xc, 0xc, 0x56, 0x56, 0xc, 0x2b, + 0x3c, 0x3c, 0x56, 0xd, 0xa2, 0xd0, 0x2b, 0x92, + 0x33, 0xc, 0xc, 0xc, 0xc, 0xf, 0xf, 0x5f, + 0x3c, 0xc1, 0xc1, 0x38, 0xd0, 0xa2, 0x2b, 0x48, + 0x5f, 0xaa, 0x3c, 0xc, 0x2b, 0x3c, 0xaa, 0xc1, + 0x48, 0xd0, 0x80, 0x92, 0x38, 0xd0, 0xdc, 0x2b, + 0xc, 0x5f, 0x5f, 0xc, 0x2b, 0xd, 0xaa, 0x56, + 0xd, 0xd0, 0xdc, 0xc, 0x3f, 0x3c, 0xc, 0x3c, + 0x2b, 0x3c, 0x33, 0x92, 0xdc, 0xdc, 0xdc, 0xc1, + 0xd6, 0xbc, 0x53, 0x2b, 0x2b, 0x3c, 0xc, 0x3c, + 0xc, 0x3c, 0xc1, 0x3f, 0x48, 0xe8, 0xe9, 0x1, + 0x78, 0x78, 0x78, 0xf2, 0xf2, 0x37, 0x78, 0x82, + 0x61, 0x3b, 0x3b, 0x3b, 0xa, 0x23, 0x62, 0x76, + 0x78, 0xe3, 0x2c, 0x2c, 0x49, 0x82, 0x87, 0xc3, + 0x8, 0x96, 0xd5, 0xef, 0x6e, 0x63, 0xc2, 0xd9, + 0xa5, 0x2f, 0x6e, 0xc5, 0x5d, 0x5d, 0xef, 0xef, + 0xd5, 0xd5, 0xef, 0xef, 0xd2, 0x42, 0xe9, 0xc5, + 0x5d, 0xc5, 0x19, 0xef, 0x2f, 0x1b, 0xe, 0xd9, + 0x6e, 0xd5, 0xd9, 0x77, 0x2f, 0x8a, 0xa, 0xd1, + 0x78, 0x76, 0x37, 0xa7, 0x52, 0x1d, 0x7e, 0x18, + 0x88, 0x1b, 0xa6, 0xa0, 0xa6, 0x2f, 0x77, 0x1e, + 0xd8, 0xcb, 0xe1, 0xcc, 0xc0, 0xc6, 0xe4, 0xe4, + 0xf3, 0xdd, 0xe4, 0xbd, 0x81, 0x57, 0x74, 0xd8, + 0x1e, 0x88, 0x88, 0x27, 0x77, 0x1, 0x24, 0x68, + 0x5, 0x8a, 0x1c, 0x1c, 0xb5, 0xe3, 0x29, 0x41, + 0x30, 0x24, 0x82, 0x58, 0x8, 0x73, 0x5a, 0x1b, + 0x8f, 0xd8, 0x7, 0xd8, 0xce, 0x9f, 0xcb, 0xc6, + 0xc0, 0xbf, 0xf4, 0xc6, 0xdd, 0xbf, 0xe4, 0xde, + 0x36, 0x9d, 0xdb, 0xa9, 0x47, 0x81, 0x18, 0xf9, + 0x12, 0xf4, 0xbf, 0xc6, 0xc6, 0xbf, 0xe4, 0xde, + 0xde, 0x81, 0x40, 0x9d, 0x2e, 0xce, 0x9c, 0x6b, + 0x9c, 0x4, 0x4, 0xe5, 0x7d, 0x6f, 0x4, 0x4, + 0x8e, 0xdd, 0xdf, 0xfd, 0xdd, 0x95, 0xaf, 0xcc, + 0xca, 0xdf, 0xaf, 0xc0, 0x12, 0xc0, 0xf7, 0xcc, + 0xb9, 0xbd, 0xbf, + 0xbc, 0xd8, 0xd8, 0x90, 0x8b, 0x9d, 0xce, 0xe1, + 0xf3, 0xf3, 0xe4, 0xe4, 0x7, 0xc6, 0x81, 0xe4, + 0x57, 0x74, 0x9a, 0xc6, 0x81, 0xe1, 0xe1, 0xf6, + 0xb8, 0xab, 0xe3, 0x37, 0x61, 0x66, 0x61, 0x61, + 0x37, 0x37, 0xda, 0xa6, 0x2f, 0x8, 0x8, 0xe7, + 0x1b, 0xe7, 0x42, 0x6e, 0x79, 0x2f, 0x77, 0x6e, + 0xd5, 0xd5, 0xef, 0xef, 0x19, 0x1b, 0x63, 0x4a, + 0xd5, 0x77, 0x50, 0x19, 0x6e, 0x5d, 0xc5, 0x4a, + 0x19, 0x6e, 0xd2, 0x19, 0x63, 0x4a, 0xef, 0x19, + 0xd2, 0x2f, 0x8c, 0x42, 0x63, 0x79, 0x1b, 0xc2, + 0x4a, 0x19, 0x2, 0x63, 0x30, 0xa, 0x23, 0x23, + 0xd1, 0xd1, 0xd1, 0xa, 0x76, 0x37, 0x55, 0x65, + 0x9e, 0x56, 0x1d, 0x92, 0xd, 0x3c, 0xc, 0x2b, + 0x2b, 0xc, 0xc, 0x3c, 0x80, 0x80, 0x3c, 0xd, + 0xd0, 0xa2, 0x2b, 0xdc, 0xdc, 0x2b, 0x3c, 0xc, + 0xc, 0xc, 0xc, 0xc, 0xc, 0x92, 0xc, 0xaa, + 0x33, 0xdc, 0x2b, 0x2b, 0xdc, 0xc, 0xc, 0xc, + 0x3c, 0x3c, 0x2b, 0x3c, 0xd, 0xa2, 0xa2, 0x2b, + 0xd, 0xd, 0xc, 0xc, 0x3c, 0xc, 0x92, 0xaa, + 0x3c, 0x3c, 0xc, 0xaa, 0xd, 0xd0, 0xdc, 0x2b, + 0x3c, 0x92, 0x3c, 0x3c, 0xc, 0xc, 0x3c, 0x5f, + 0x2b, 0x48, 0xa2, 0x80, 0x92, 0xd0, 0xa2, 0x2b, + 0x2b, 0x2b, 0x3c, 0x2b, 0x2b, 0x48, 0xdc, 0xc1, + 0xc1, 0x2a, 0x27, 0x2a, 0x3e, 0xa6, 0x1, 0xd3, + 0x5e, 0x62, 0x76, 0x23, 0xa, 0x29, 0x3b, 0x6d, + 0x4d, 0x68, 0x30, 0x82, 0xa, 0x23, 0x16, 0x29, + 0x1c, 0x41, 0x8c, 0xb3, 0x82, 0xb5, 0x41, 0x29, + 0x5, 0x30, 0x19, 0xd5, 0x19, 0xd2, 0x63, 0x6e, + 0xc5, 0xc2, 0x19, 0xd9, 0xa5, 0x8, 0x6e, 0x63, + 0x79, 0xae, 0x1b, 0x6e, 0xa5, 0x2f, 0x42, 0x1b, + 0x42, 0xd2, 0x19, 0x19, 0x5b, 0x73, 0x63, 0xd5, + 0x4a, 0x19, 0x6e, 0x79, 0x58, 0xd3, 0xb5, 0x62, + 0xa, 0xd1, 0x24, 0x2f, 0xb3, 0x87, 0xe8, 0x8b, + 0x5d, 0x64, 0xab, 0xb3, 0x68, 0xc9, 0x27, 0x1e, + 0x9c, 0x7d, 0x81, 0xc0, 0x97, 0x9c, 0x99, 0x6f, + 0x4, 0xfd, 0x9d, 0x83, 0x7d, 0x6b, 0x9b, 0x32, + 0xd7, 0xe5, 0x7d, 0xd5, 0xa5, 0xab, 0xd3, 0x1c, + 0x82, 0xb5, 0xd3, 0x58, 0xa4, 0x45, 0x30, 0x89, + 0x1b, 0x58, 0x8a, 0x82, 0xb5, 0xd3, 0x58, 0xa6, + 0x1b, 0x6b, 0x1e, 0x47, 0x4, 0x9c, 0xdd, 0x32, + 0x93, 0xe4, 0xc6, 0xf5, 0x32, 0xf3, 0x57, 0xa9, + 0xef, 0x6b, 0xd5, 0xd7, 0x4, 0x9c, 0x99, 0x6f, + 0x93, 0xbf, 0xe4, 0x9c, 0xf5, 0xbf, 0xe1, 0x3, + 0x47, 0xca, 0x6f, 0x4, 0x4, 0xf3, 0x6f, 0xe5, + 0x6c, 0x4, 0x3, 0x5d, 0xc5, 0x6b, 0x26, 0x47, + 0x32, 0xe4, 0x93, 0x4, 0xc0, 0x12, 0xaf, 0x12, + 0x6f, 0xfd, 0xb4, 0xf3, 0x8e, 0xb2, 0xdf, 0xf3, + 0x32, 0x12, 0xbf, + 0x4f, 0x77, 0x6c, 0x6c, 0xe5, 0x7d, 0x6f, 0x9c, + 0x8e, 0x4, 0xb1, 0x90, 0x83, 0xa9, 0xde, 0xe1, + 0x83, 0x83, 0xc6, 0xb4, 0xde, 0x9c, 0x6b, 0x9d, + 0x5d, 0x52, 0xd3, 0xb5, 0x29, 0x4d, 0xac, 0x78, + 0xd1, 0xa, 0x8a, 0x67, 0x8, 0x2f, 0x5b, 0x5b, + 0x89, 0x2, 0x5a, 0x42, 0x30, 0x58, 0x8, 0xe, + 0x79, 0xf1, 0xc2, 0xd5, 0x19, 0x4a, 0x19, 0x6e, + 0x4a, 0x79, 0x42, 0x19, 0x63, 0x8, 0x42, 0x19, + 0x6e, 0x79, 0x89, 0x89, 0x63, 0x63, 0xd2, 0x42, + 0x5b, 0x30, 0x8, 0x42, 0x63, 0x73, 0x42, 0x63, + 0x19, 0x6e, 0x79, 0x73, 0x73, 0x8a, 0xd1, 0xd1, + 0xa, 0x23, 0xa, 0xa, 0xd1, 0x37, 0x37, 0xa7, + 0x49, 0x2b, 0x5f, 0x5f, 0xf, 0x5f, 0xc, 0x3c, + 0xc, 0x3c, 0x56, 0xc1, 0xcb, 0xa2, 0x2b, 0xc1, + 0x38, 0x2b, 0x2b, 0xc, 0xc, 0x5f, 0x3c, 0xc, + 0x80, 0xc1, 0xaa, 0x56, 0x80, 0x80, 0xc, 0x5f, + 0xb7, 0xaa, 0xc, 0xc, 0xc, 0xaa, 0xaa, 0x3c, + 0x2b, 0xa2, 0xd, 0x5f, 0xeb, 0xa2, 0xea, 0x3c, + 0xaa, 0xaa, 0x92, 0xc, 0x2b, 0x3c, 0x56, 0x92, + 0xdc, 0xea, 0xb, 0x1d, 0x56, 0x92, 0x2b, 0xc, + 0xc, 0xb6, 0xb7, 0xc, 0x2b, 0x48, 0x38, 0xc1, + 0x3c, 0xa2, 0xba, 0x2b, 0xaa, 0x5f, 0x80, 0xc, + 0xc, 0x3c, 0xd, 0xd, 0x80, 0xcb, 0xcb, 0x5c, + 0x38, 0xa9, 0x5d, 0x2c, 0x2c, 0x8c, 0xbe, 0x5e, + 0x61, 0x76, 0x78, 0x37, 0x29, 0x3b, 0xa4, 0x1c, + 0x29, 0x16, 0x8a, 0xa, 0x23, 0x23, 0xa, 0x1c, + 0x24, 0x67, 0x2f, 0x73, 0xb3, 0x5, 0x68, 0x3b, + 0x3b, 0x73, 0x6e, 0xef, 0x2f, 0x79, 0x6e, 0x4a, + 0x4a, 0x4a, 0xd5, 0x4a, 0x1b, 0x1b, 0x63, 0xe, + 0x8, 0x8, 0xf1, 0x42, 0x2f, 0xf1, 0x63, 0x4a, + 0x6e, 0x19, 0x19, 0x19, 0x1b, 0x5b, 0x96, 0x6e, + 0x19, 0x19, 0xd2, 0x79, 0x41, 0x41, 0x6d, 0x82, + 0x76, 0xa, 0xa7, 0x50, 0xa5, 0xa8, 0x91, 0x98, + 0x2c, 0xab, 0x5e, 0x24, 0x87, 0x60, 0x83, 0x81, + 0xf5, 0xdd, 0xe4, 0xe4, 0x26, 0xd8, 0x53, 0x81, + 0x32, 0xfd, 0x4b, 0xce, 0x9c, 0xc0, 0x8d, 0xde, + 0x7b, 0x1e, 0x3a, 0x98, 0x2c, 0xd3, 0xac, 0xb5, + 0x62, 0x62, 0x41, 0xa4, 0x30, 0x30, 0xa4, 0x30, + 0x73, 0xb3, 0x24, 0x82, 0xda, 0x1c, 0x82, 0x8, + 0x19, 0x9c, 0x81, 0x12, 0x32, 0xf3, 0xb4, 0xe4, + 0xe4, 0xbf, 0x9a, 0xbc, 0xe1, 0x9a, 0x2e, 0x1e, + 0xde, 0xbd, 0xde, 0xde, 0xce, 0xb4, 0x9, 0xe1, + 0xe4, 0xb4, 0x9a, 0xe1, 0xb4, 0x95, 0xe4, 0x81, + 0xbf, 0x95, 0xf3, 0xbd, 0xbd, 0xe4, 0xce, 0xd8, + 0xcf, 0x90, 0x8b, 0x88, 0x9f, 0xc4, 0xe4, 0xe4, + 0xbf, 0xbf, 0xbf, 0xbf, 0xb4, 0xb4, 0xe4, 0xe4, + 0xd8, 0xbc, 0xb4, 0xb4, 0xe4, 0xcc, 0xbf, 0xf4, + 0xcd, 0xcc, 0xf4, + 0xd9, 0xd5, 0xd7, 0x6c, 0xd7, 0x4a, 0x8f, 0x9c, + 0xe5, 0x3a, 0x6b, 0xca, 0x6b, 0x3, 0xde, 0xe4, + 0x99, 0x9c, 0xf3, 0xe4, 0x97, 0x47, 0x7d, 0xa9, + 0x5d, 0x49, 0x94, 0xd3, 0x82, 0xb5, 0xe3, 0x1c, + 0xa, 0x23, 0x29, 0x58, 0x41, 0xb5, 0x58, 0x89, + 0x42, 0x2f, 0xa5, 0x1b, 0x73, 0x30, 0x73, 0x63, + 0x79, 0x67, 0x42, 0x63, 0x6e, 0x6e, 0xef, 0xd5, + 0x4a, 0x4a, 0x19, 0x63, 0x63, 0x89, 0x63, 0x4a, + 0x63, 0x2f, 0x8, 0x89, 0xf1, 0x2f, 0x2f, 0x89, + 0x63, 0x1b, 0x2, 0x63, 0x63, 0x1b, 0x89, 0x63, + 0x63, 0xf1, 0x2f, 0x2f, 0x14, 0x8c, 0xd1, 0xd1, + 0xd1, 0xd1, 0x23, 0x23, 0xd1, 0x76, 0x78, 0x55, + 0x1f, 0x5f, 0xc, 0xc, 0x1d, 0xaa, 0xc, 0x2b, + 0xdc, 0xd, 0x3f, 0x3f, 0xa2, 0xba, 0x80, 0x92, + 0x92, 0x3c, 0x2b, 0x3c, 0x3c, 0xd6, 0x3c, 0x2b, + 0xdc, 0xdc, 0x3c, 0xaa, 0x3c, 0x2b, 0xc, 0x5f, + 0xaa, 0x92, 0xc, 0xc, 0x2b, 0xd, 0x91, 0x2b, + 0xdc, 0xa2, 0xb, 0x3c, 0x92, 0xea, 0x2b, 0xc, + 0xc, 0x56, 0x92, 0x3c, 0xc, 0xa2, 0x7f, 0x3c, + 0x2b, 0xdc, 0xc, 0x92, 0x5f, 0x5f, 0xc, 0xc, + 0x5f, 0x56, 0x56, 0x56, 0x3c, 0xdc, 0xa2, 0x48, + 0x3c, 0xea, 0x2b, 0x2b, 0x92, 0x92, 0x3c, 0x3c, + 0xea, 0xea, 0x53, 0x74, 0xa2, 0xcb, 0xbc, 0xba, + 0xb, 0x3c, 0xb, 0x91, 0xb6, 0x52, 0xac, 0x76, + 0x76, 0xf2, 0x76, 0x6d, 0x4d, 0x87, 0x68, 0xda, + 0x76, 0x29, 0x6d, 0x16, 0xa, 0xa, 0x1c, 0xb5, + 0xb5, 0x67, 0xf1, 0xa5, 0xc3, 0x68, 0x68, 0xa4, + 0x30, 0x1b, 0x19, 0xef, 0x60, 0x63, 0x4a, 0xd7, + 0xef, 0x4a, 0xd7, 0xd7, 0xe5, 0x6e, 0x19, 0xc5, + 0xa5, 0x60, 0xa5, 0xe9, 0x8, 0x1b, 0x4a, 0xd7, + 0x4a, 0x63, 0x6e, 0x6e, 0xc2, 0xf1, 0x60, 0xd4, + 0xd9, 0xd5, 0x77, 0xe9, 0x41, 0x62, 0x62, 0xe3, + 0x78, 0x78, 0x55, 0x1f, 0x1d, 0x1d, 0x91, 0x80, + 0xb8, 0xa7, 0xe3, 0xbe, 0xb5, 0x59, 0x4f, 0x81, + 0x81, 0x81, 0xe1, 0xc6, 0x81, 0x75, 0x9f, 0xe1, + 0x81, 0xf9, 0xc6, 0xb4, 0xb4, 0xe4, 0xc6, 0x4b, + 0xd8, 0xe1, 0xb, 0x91, 0x49, 0x8c, 0x41, 0x58, + 0x41, 0x1c, 0xda, 0xa0, 0x67, 0xe3, 0x58, 0x87, + 0x5, 0x8c, 0x6, 0xd3, 0xe3, 0x5, 0x5, 0x89, + 0x4a, 0x4, 0xde, 0xfd, 0xde, 0xe4, 0xf4, 0x57, + 0x4b, 0xb4, 0x9a, 0x75, 0xe1, 0xcd, 0x4b, 0xe4, + 0xde, 0xb4, 0xc6, 0x90, 0x90, 0xb4, 0xe1, 0xbc, + 0x75, 0x86, 0xb4, 0xb4, 0xb4, 0xbb, 0xbf, 0xf8, + 0xb4, 0xbb, 0xce, 0xd8, 0x90, 0xb4, 0xe4, 0x57, + 0x18, 0x90, 0x7d, 0x6a, 0xc6, 0xbf, 0xe4, 0xdf, + 0x81, 0xbf, 0xbf, 0xbf, 0xcb, 0x4b, 0x4b, 0xc6, + 0xc6, 0xc6, 0x9a, 0xfa, 0x4b, 0xbf, 0x95, 0xf4, + 0xf7, 0xcc, 0xcd, + 0x9c, 0xe5, 0xe5, 0x47, 0x6c, 0xef, 0x27, 0xc4, + 0xfd, 0x6b, 0xf5, 0xbd, 0xbd, 0xc0, 0xbf, 0xbf, + 0xce, 0xd8, 0x7, 0xb4, 0xe1, 0x40, 0x53, 0x9f, + 0x2a, 0x91, 0x49, 0xa7, 0x61, 0x4d, 0x6d, 0x82, + 0x16, 0xa, 0x62, 0xa, 0xd1, 0x8a, 0x1, 0xd2, + 0x19, 0x63, 0xd2, 0x19, 0x63, 0x19, 0x6e, 0x6e, + 0x6e, 0x8, 0xf1, 0x6e, 0x7a, 0x2f, 0xc5, 0x8f, + 0xe, 0x5d, 0xd5, 0xd7, 0xd7, 0x11, 0xc2, 0xe, + 0x63, 0x89, 0x2, 0x42, 0x63, 0x58, 0xf1, 0x63, + 0x4a, 0x4a, 0x4a, 0x19, 0x4a, 0xd5, 0xa5, 0x79, + 0x42, 0x79, 0x2f, 0xf1, 0xc3, 0x4d, 0xd1, 0x23, + 0x23, 0xd1, 0xa, 0xa, 0x62, 0x76, 0x61, 0x66, + 0xb6, 0xf, 0xaa, 0xc, 0x80, 0xa2, 0xd, 0x3c, + 0xdc, 0xb, 0x2b, 0xc, 0xc, 0x3c, 0x2b, 0x3c, + 0x3c, 0x3c, 0x3c, 0xd, 0xdc, 0xa2, 0x2b, 0x3c, + 0xc1, 0x2b, 0xc, 0x5f, 0xc, 0xc, 0xc, 0xc, + 0x92, 0xc1, 0xd, 0xc1, 0xdc, 0xa2, 0xba, 0xc, + 0x92, 0x2b, 0x2b, 0xc, 0xc, 0x3c, 0xc1, 0x3c, + 0x2b, 0xb, 0xd, 0x5f, 0x92, 0xea, 0xea, 0xc, + 0xc, 0xc, 0x5f, 0xc, 0x92, 0xaa, 0xaa, 0xf, + 0x92, 0x3c, 0x48, 0xaa, 0xaa, 0xc, 0xdc, 0xc, + 0xc, 0xaa, 0x3c, 0x3c, 0x2b, 0xdc, 0xd, 0x5c, + 0x5c, 0xcb, 0x57, 0xba, 0x2b, 0x3c, 0xea, 0x2b, + 0x2b, 0x2b, 0x38, 0x38, 0x22, 0xa8, 0xab, 0x76, + 0x76, 0x76, 0x23, 0x76, 0x76, 0xf2, 0x78, 0x37, + 0x37, 0x82, 0x5, 0x5, 0x3b, 0x3b, 0x29, 0x78, + 0x6d, 0xab, 0xd3, 0x66, 0x61, 0x5e, 0xb5, 0x67, + 0x96, 0x4a, 0xef, 0xef, 0x1b, 0x6e, 0x4a, 0xd5, + 0x19, 0xc2, 0x8f, 0xc5, 0x77, 0xe9, 0x77, 0xc9, + 0x6e, 0xe, 0x6e, 0xd5, 0x89, 0x63, 0x6e, 0x4a, + 0x4a, 0x1b, 0x8, 0x5b, 0xc7, 0x60, 0x1b, 0x96, + 0xd2, 0x6e, 0x77, 0x79, 0x67, 0x1c, 0x29, 0x76, + 0xd1, 0x62, 0x61, 0x55, 0x65, 0x22, 0x51, 0x5c, + 0xc9, 0xc3, 0x8c, 0x58, 0x5, 0xa4, 0xc9, 0x7e, + 0x47, 0x4, 0x9d, 0x39, 0x99, 0xdd, 0xbd, 0xbf, + 0xdf, 0x99, 0xdf, 0xe1, 0xde, 0xfd, 0xf6, 0x88, + 0x1e, 0x9b, 0x18, 0x7e, 0x59, 0x68, 0xb3, 0x67, + 0x30, 0x5, 0x58, 0x24, 0x8c, 0xb5, 0xb5, 0x6d, + 0x6d, 0x5e, 0x82, 0xd3, 0x87, 0x87, 0x8, 0xd2, + 0xd5, 0xe5, 0xe5, 0x27, 0x3, 0xde, 0x2e, 0x90, + 0xf5, 0xc6, 0xaf, 0xf3, 0xf3, 0x81, 0x9c, 0xfd, + 0xfd, 0xfd, 0xc8, 0xe8, 0x7c, 0xe1, 0xc0, 0xf5, + 0xf5, 0xf8, 0xb4, 0xc0, 0xb4, 0xbb, 0xc6, 0x6f, + 0xd8, 0xd8, 0x8e, 0x6b, 0xfb, 0x81, 0x2e, 0x97, + 0x9c, 0xca, 0x7d, 0x6f, 0xdd, 0xb4, 0xc0, 0x6f, + 0xd8, 0xe1, 0xe4, 0x32, 0x47, 0x99, 0xca, 0x97, + 0x4, 0x93, 0xcc, 0xed, 0x93, 0xcc, 0xbf, 0xc0, + 0x26, 0xc4, 0xcc, + 0xd8, 0x51, 0x7e, 0x4f, 0x27, 0x6b, 0x1e, 0x1e, + 0x90, 0xdf, 0xb4, 0xb4, 0xe4, 0xc6, 0xf6, 0x85, + 0x85, 0x9f, 0xcb, 0xcb, 0x4b, 0xe1, 0xe1, 0x84, + 0x5c, 0xa8, 0x52, 0x1f, 0x5e, 0xac, 0x61, 0x55, + 0x37, 0x78, 0x66, 0xab, 0x24, 0xda, 0x89, 0xd5, + 0x6e, 0x1b, 0x96, 0xa5, 0x2f, 0x60, 0x7a, 0xb3, + 0x89, 0xe9, 0xd5, 0xef, 0x63, 0x63, 0xd5, 0xd5, + 0xa5, 0x8, 0xd5, 0xef, 0xc5, 0x77, 0x77, 0xe9, + 0x1b, 0x63, 0xd5, 0x19, 0xd5, 0x5b, 0x89, 0x4a, + 0x6e, 0xd5, 0xc5, 0xe9, 0x6e, 0x77, 0x5d, 0x5a, + 0x89, 0x5b, 0x89, 0x42, 0x2f, 0xa, 0x0, 0x0, + 0x0, 0x23, 0xd1, 0x23, 0xa, 0x37, 0x52, 0x52, + 0x1f, 0x33, 0x33, 0x3c, 0xb, 0xb, 0x3c, 0xaa, + 0x5f, 0xc, 0x2b, 0xc, 0xb6, 0x33, 0x3c, 0x2b, + 0x80, 0xd, 0x38, 0xc1, 0x2b, 0xea, 0x3c, 0xf, + 0xaa, 0x5f, 0xc, 0xc, 0x5f, 0x56, 0x56, 0x92, + 0x2b, 0x80, 0xc1, 0x1f, 0x92, 0x2b, 0x2b, 0xc, + 0x5f, 0x5f, 0x80, 0x2b, 0xc, 0xd, 0x5c, 0xd, + 0x2b, 0xb, 0x2b, 0xaa, 0x56, 0xc, 0xc, 0xc, + 0x5f, 0xb7, 0x56, 0x3c, 0x2b, 0x3c, 0x33, 0x56, + 0xaa, 0xc, 0x2b, 0x92, 0x5f, 0x56, 0x92, 0x80, + 0x2b, 0xc1, 0x38, 0xeb, 0xdc, 0xb, 0x5c, 0x5c, + 0x48, 0xea, 0xea, 0xdc, 0xc, 0x1d, 0x22, 0xdb, + 0xd0, 0xdb, 0x4f, 0xd4, 0x60, 0xab, 0x76, 0xd1, + 0x23, 0xd1, 0x23, 0xa, 0x78, 0x78, 0x76, 0xa, + 0x16, 0x87, 0x29, 0x87, 0x16, 0x1c, 0xd1, 0x62, + 0xa, 0x58, 0x41, 0x62, 0x62, 0x1c, 0x1c, 0x8a, + 0xf1, 0x19, 0xd5, 0x6e, 0x19, 0x19, 0x63, 0x4a, + 0x19, 0x19, 0x19, 0x63, 0x6e, 0x63, 0x63, 0x79, + 0x1b, 0xd2, 0x63, 0x63, 0x63, 0x19, 0x63, 0x19, + 0x63, 0x42, 0x73, 0xa6, 0x5b, 0x1b, 0xef, 0xef, + 0xd2, 0xe9, 0xf1, 0x14, 0xd3, 0xe3, 0xac, 0xa, + 0xac, 0x29, 0xac, 0x29, 0x24, 0x60, 0x7f, 0x7e, + 0xa8, 0x87, 0x82, 0x82, 0x58, 0x5b, 0xe, 0x6e, + 0xd7, 0xd7, 0x6c, 0x6c, 0x6c, 0x6c, 0x6f, 0xfd, + 0x4, 0x6f, 0x9d, 0xc8, 0x47, 0x97, 0xbd, 0xfd, + 0x4, 0x4, 0xfd, 0x77, 0x8c, 0xd3, 0xd3, 0xac, + 0xb5, 0xe3, 0x6d, 0xb5, 0xda, 0x45, 0x30, 0xa0, + 0x58, 0xda, 0x58, 0x24, 0x62, 0x29, 0xb5, 0x24, + 0x2f, 0xe, 0xd5, 0xd5, 0x4a, 0xd7, 0x4, 0x4, + 0x4, 0xf3, 0x12, 0x97, 0x4, 0xbd, 0xde, 0xa9, + 0x5d, 0x9b, 0x9b, 0xe5, 0x9c, 0xf3, 0xdf, 0x97, + 0x93, 0x12, 0xbf, 0xc0, 0xf5, 0xbf, 0xb4, 0x93, + 0x47, 0x83, 0x6f, 0x4, 0x4, 0xf3, 0xdf, 0x9c, + 0x47, 0x81, 0xbd, 0x9c, 0x3, 0x81, 0xf3, 0x97, + 0x12, 0x12, 0xf5, 0x97, 0x93, 0x12, 0xbd, 0x93, + 0x9c, 0x1e, 0xe1, 0xf3, 0x93, 0xbd, 0x75, 0xc0, + 0xf3, 0xc0, 0xaf, + 0x36, 0xef, 0xc2, 0xc2, 0x6e, 0xd7, 0xe5, 0x6f, + 0xe5, 0xe5, 0xfd, 0xb4, 0x97, 0x47, 0x2a, 0xd8, + 0xf5, 0x4, 0xf5, 0x9c, 0x6f, 0x4, 0xde, 0xd8, + 0x9b, 0x60, 0x52, 0xab, 0xac, 0x78, 0x76, 0x4d, + 0x4d, 0xac, 0x94, 0x24, 0xb5, 0x30, 0x79, 0xe9, + 0x63, 0x1b, 0x2f, 0x8, 0x5, 0x30, 0x5b, 0xb3, + 0x67, 0x2f, 0xc5, 0xd5, 0x63, 0x19, 0x4a, 0xef, + 0x63, 0x63, 0xd2, 0x1b, 0x79, 0x1b, 0x19, 0xd2, + 0xf1, 0x1b, 0x63, 0x19, 0x4a, 0x63, 0x1b, 0xd2, + 0x6e, 0x19, 0x19, 0x19, 0x19, 0x89, 0x1b, 0xd2, + 0x8, 0x30, 0x42, 0xf1, 0x41, 0xa, 0xa, 0xa, + 0x23, 0x0, 0x23, 0x23, 0x62, 0x29, 0xd3, 0xab, + 0x1d, 0xb8, 0x3f, 0xc, 0xc, 0x80, 0xc, 0x5f, + 0xc, 0xc, 0xc1, 0x2b, 0x3c, 0x7f, 0xd0, 0x2b, + 0x2b, 0x80, 0x3f, 0x92, 0xc, 0xc, 0xc, 0x92, + 0x92, 0x92, 0xc1, 0x56, 0x3c, 0xc1, 0x22, 0xc, + 0x3c, 0xc, 0x5f, 0x5f, 0x5f, 0xc, 0x3c, 0x3c, + 0xc, 0x48, 0xd0, 0xd0, 0x80, 0x80, 0x80, 0x2b, + 0x3c, 0xc, 0xc, 0x5f, 0xc, 0x3c, 0xc1, 0xc1, + 0xc, 0xaa, 0x33, 0x33, 0x3c, 0xc, 0x92, 0x5f, + 0xb7, 0x5f, 0x92, 0x3c, 0x3c, 0x48, 0x2a, 0xd0, + 0xdc, 0x80, 0x51, 0xdb, 0x2b, 0x91, 0x48, 0xdc, + 0x2b, 0xea, 0xea, 0xba, 0xb, 0x80, 0x7e, 0x5c, + 0xcb, 0x98, 0xa9, 0x3e, 0x52, 0xac, 0x76, 0x76, + 0xd1, 0x78, 0xa, 0x16, 0xda, 0xda, 0x16, 0x16, + 0x16, 0x1c, 0x29, 0xd1, 0xa, 0x76, 0x23, 0x62, + 0x8a, 0x8c, 0x8c, 0x8a, 0x45, 0xa0, 0x58, 0x58, + 0x30, 0x6e, 0xd2, 0x8, 0x63, 0x19, 0x63, 0x63, + 0x19, 0x4a, 0x4a, 0x4a, 0x89, 0x6e, 0x63, 0x42, + 0x42, 0xf1, 0x2f, 0x2f, 0x89, 0x19, 0x19, 0x89, + 0x89, 0x63, 0x19, 0x63, 0x5b, 0x1b, 0x7d, 0xe5, + 0xe, 0x79, 0x67, 0xb5, 0x29, 0xe3, 0xac, 0x82, + 0xe3, 0x87, 0xab, 0x52, 0xb3, 0x59, 0xb8, 0x1d, + 0x52, 0x61, 0x4d, 0x4d, 0x58, 0x1b, 0x6a, 0x47, + 0xd9, 0xc2, 0xd5, 0xe5, 0x6c, 0x9c, 0x8b, 0xa9, + 0xfd, 0x26, 0x7, 0x90, 0xca, 0xf3, 0xe4, 0xde, + 0xbd, 0x90, 0x8b, 0x98, 0x94, 0xe3, 0x6d, 0xa, + 0x6d, 0xe3, 0x58, 0xe3, 0x3b, 0x30, 0x73, 0xf1, + 0x67, 0x30, 0xda, 0x4d, 0xa, 0x1c, 0x6d, 0x6d, + 0x58, 0xf1, 0xc2, 0x11, 0xd5, 0x7d, 0xca, 0xed, + 0xfd, 0xe4, 0xe4, 0x90, 0x40, 0xe1, 0x81, 0x9d, + 0x7d, 0x7d, 0xb2, 0xb1, 0xbd, 0xc6, 0xdf, 0xdd, + 0x85, 0xf4, 0xbf, 0x81, 0x81, 0xe4, 0xb4, 0xbf, + 0x81, 0x90, 0x99, 0x97, 0xfa, 0x9a, 0x81, 0x39, + 0x53, 0xdb, 0x7, 0xc6, 0x90, 0x81, 0xe2, 0x12, + 0xe2, 0xce, 0xdf, 0xf3, 0xb4, 0x9a, 0x7, 0x75, + 0xca, 0x6b, 0x75, 0xb4, 0xc0, 0xcd, 0x4b, 0xe4, + 0xaf, 0xe2, 0xbb, + 0x6b, 0xe5, 0xef, 0xa5, 0xd5, 0x4a, 0xd5, 0xd7, + 0xe5, 0xe5, 0xc8, 0xd8, 0x93, 0x4, 0x1e, 0xe4, + 0x93, 0x4, 0x2e, 0xc0, 0x32, 0x4, 0x3a, 0xc8, + 0x3, 0x50, 0x1d, 0x52, 0xe3, 0xda, 0x78, 0xa, + 0x23, 0xa, 0x62, 0x62, 0xa, 0x41, 0x2f, 0xa5, + 0x63, 0x63, 0x79, 0x42, 0x73, 0x89, 0x63, 0xf1, + 0x5, 0x67, 0x79, 0xe9, 0xf1, 0xd2, 0xe, 0xa5, + 0x6e, 0x63, 0x4a, 0x63, 0x6e, 0x63, 0xd5, 0x6e, + 0x8, 0x2, 0x63, 0xd2, 0xe9, 0x19, 0x79, 0x79, + 0x89, 0x19, 0xd5, 0x19, 0x63, 0x19, 0x63, 0x1b, + 0x67, 0x8a, 0x67, 0x41, 0x41, 0x62, 0x62, 0x23, + 0xd1, 0x23, 0x16, 0xd1, 0x62, 0x4d, 0x82, 0x52, + 0x91, 0x2b, 0x3c, 0x5f, 0xc, 0xc, 0x80, 0x2b, + 0x3c, 0xd, 0xd, 0x80, 0x2b, 0xa2, 0xdc, 0x92, + 0x92, 0x2b, 0xc, 0xc, 0x92, 0xaa, 0xc1, 0x2b, + 0x3c, 0xc1, 0x33, 0x56, 0xc, 0xc, 0x2b, 0x5f, + 0xf, 0x5f, 0x2b, 0xc, 0xc, 0x3c, 0x38, 0xd0, + 0xdc, 0xea, 0xd0, 0xd, 0xc, 0xc, 0x2b, 0x3c, + 0xc, 0xc, 0xc1, 0xdc, 0xea, 0x3c, 0x38, 0xd, + 0x3c, 0x2b, 0x3c, 0x56, 0x1f, 0x92, 0xc, 0x3c, + 0x92, 0x56, 0x38, 0x18, 0xa2, 0xdc, 0xd0, 0xdb, + 0xdc, 0x2b, 0x2b, 0x2b, 0xaa, 0x92, 0x3c, 0xa2, + 0xa2, 0xa2, 0xbc, 0x7, 0xa2, 0xea, 0xdc, 0x22, + 0x33, 0x91, 0x91, 0x2b, 0xf, 0x61, 0x76, 0x23, + 0x76, 0x76, 0xa, 0x16, 0x5, 0x58, 0x41, 0x3b, + 0xe3, 0x16, 0x78, 0x29, 0xa, 0x23, 0xd1, 0xa, + 0x8c, 0xa8, 0xa7, 0xab, 0x73, 0x7a, 0x60, 0x8, + 0x42, 0x63, 0xe9, 0x79, 0x6e, 0x63, 0xf1, 0x42, + 0x6e, 0x8f, 0xd5, 0xef, 0x6e, 0x63, 0x6e, 0x19, + 0x6e, 0x42, 0x5b, 0xf1, 0x63, 0x19, 0x1b, 0x89, + 0xd2, 0xe, 0x19, 0x77, 0xd9, 0xc2, 0x8f, 0xef, + 0xef, 0xd2, 0xa6, 0x8c, 0xe3, 0xe3, 0x5e, 0x6d, + 0x82, 0x1, 0xb6, 0x1d, 0x1d, 0x59, 0x56, 0x1d, + 0x52, 0x65, 0x4d, 0x37, 0x24, 0xc9, 0x9d, 0x90, + 0x5c, 0xd4, 0x4f, 0xdb, 0x9d, 0x1e, 0x39, 0x39, + 0xd8, 0xbf, 0xb4, 0xb2, 0xdf, 0x81, 0xb4, 0xe1, + 0x57, 0x90, 0x88, 0x91, 0x49, 0x82, 0x87, 0x6d, + 0xa, 0x1c, 0xda, 0x4d, 0x29, 0xe3, 0x30, 0x8c, + 0x8c, 0xab, 0x87, 0x82, 0x4d, 0xb5, 0x5, 0xa0, + 0x5, 0x67, 0xd2, 0xe, 0xe9, 0x42, 0x6b, 0xfd, + 0x46, 0x81, 0x81, 0xf5, 0xd8, 0xe4, 0xde, 0x81, + 0x6a, 0x86, 0x81, 0xde, 0xd8, 0x75, 0xf8, 0xc6, + 0xe1, 0x9a, 0xbf, 0xbf, 0x81, 0xaf, 0xbf, 0xbf, + 0xdd, 0xf5, 0x32, 0xde, 0x57, 0x74, 0x84, 0x90, + 0xf6, 0xcb, 0x84, 0xb4, 0xc6, 0xc6, 0xb4, 0xbf, + 0x95, 0xaf, 0xbf, 0xc0, 0xe1, 0xbc, 0x74, 0x75, + 0xed, 0xed, 0x9a, 0xcc, 0xbf, 0xbf, 0xe4, 0xaf, + 0xbf, 0xbf, 0xbf, + 0x7d, 0x27, 0x3a, 0x77, 0xd9, 0xe9, 0x50, 0xa9, + 0xfd, 0x32, 0xc4, 0x81, 0xdf, 0xf3, 0xbf, 0xbf, + 0xc6, 0x9c, 0xe1, 0x9a, 0xe1, 0xd8, 0x51, 0x51, + 0x8b, 0x51, 0x91, 0x1f, 0xa6, 0xb3, 0xd3, 0x29, + 0x23, 0x23, 0x23, 0xd1, 0x62, 0xe3, 0xd3, 0x1, + 0x79, 0x6e, 0xd5, 0xe, 0x5b, 0xf0, 0xef, 0x77, + 0x42, 0x89, 0x73, 0xa6, 0x67, 0xe, 0xd5, 0xa5, + 0xe9, 0xd5, 0xd5, 0xd5, 0xd5, 0x6e, 0xef, 0x5d, + 0x2f, 0x89, 0x6e, 0x42, 0xd2, 0xd5, 0xd7, 0x19, + 0x42, 0x89, 0x19, 0x4a, 0x4a, 0x6e, 0x96, 0x2f, + 0x41, 0x30, 0x8, 0x58, 0x62, 0x1c, 0x62, 0x34, + 0x23, 0xa, 0x1c, 0x1c, 0x5e, 0x4d, 0x55, 0x1f, + 0x5f, 0x3c, 0x3c, 0xaa, 0x56, 0x38, 0xd0, 0x2b, + 0x2b, 0xaa, 0xc1, 0x92, 0xc, 0xc, 0x2b, 0x56, + 0x5f, 0x3c, 0xdc, 0xdc, 0x5f, 0x33, 0xeb, 0x48, + 0xc, 0xc, 0xf, 0x1f, 0x5f, 0x92, 0xc, 0x5f, + 0xf, 0x5f, 0xc1, 0x80, 0xc, 0xb7, 0x33, 0x2b, + 0xc, 0xc, 0xc, 0x5f, 0xf, 0x92, 0x2b, 0x3c, + 0x3c, 0x56, 0xd0, 0xa2, 0xb, 0xc, 0xaa, 0x56, + 0x5f, 0x5f, 0x92, 0x1d, 0x1d, 0xc1, 0x48, 0x18, + 0x18, 0x5c, 0xa9, 0xcb, 0xcf, 0xba, 0xb, 0x48, + 0xdc, 0x2b, 0x80, 0x80, 0x48, 0x33, 0xeb, 0xcb, + 0xf6, 0x85, 0xbc, 0xbc, 0xea, 0x2b, 0xc, 0x92, + 0x56, 0x92, 0x91, 0x22, 0x65, 0x4d, 0xa, 0xd1, + 0x76, 0xd1, 0xd1, 0x29, 0x29, 0x78, 0x4d, 0x61, + 0x82, 0x87, 0x87, 0x45, 0xda, 0x16, 0xa, 0x62, + 0xe3, 0xd3, 0x5e, 0x4d, 0xa6, 0xa8, 0x49, 0xa5, + 0x19, 0x19, 0xd5, 0x19, 0x19, 0x63, 0x79, 0x73, + 0xd2, 0xd2, 0x2f, 0xa8, 0x89, 0x1b, 0xe9, 0xc5, + 0x4a, 0x19, 0x6e, 0x19, 0x1b, 0x63, 0xf1, 0x41, + 0xad, 0x2f, 0x2c, 0x2c, 0xef, 0x6e, 0xd5, 0xd5, + 0x19, 0x63, 0x89, 0x30, 0x1c, 0x6d, 0x78, 0x62, + 0x76, 0x61, 0x66, 0xb6, 0x52, 0xd4, 0xe8, 0x7e, + 0x4e, 0xa8, 0xab, 0x4d, 0x82, 0xa6, 0xe8, 0x91, + 0xb8, 0xd4, 0x38, 0xb8, 0x3e, 0x47, 0x8e, 0x6f, + 0x93, 0xf5, 0xb4, 0xdd, 0x8e, 0xdd, 0xc6, 0x57, + 0x43, 0x9d, 0x8b, 0x3e, 0x49, 0xa4, 0xa4, 0x29, + 0x1c, 0xda, 0x3b, 0x29, 0x29, 0x29, 0xe3, 0xbe, + 0xbe, 0x58, 0x68, 0xe3, 0x8a, 0xa4, 0xa0, 0xa0, + 0x67, 0x30, 0xa6, 0x5a, 0x2f, 0x42, 0x4a, 0xe5, + 0xef, 0x6b, 0x47, 0x97, 0x32, 0xbd, 0xde, 0x4, + 0xfd, 0x9d, 0xd8, 0x47, 0x27, 0x40, 0xde, 0xbd, + 0xdd, 0xc6, 0xe4, 0xc0, 0x93, 0xc0, 0xb4, 0x6f, + 0x4, 0x3a, 0x3, 0x47, 0xca, 0x9f, 0xc6, 0x93, + 0xf3, 0xc6, 0xc6, 0x93, 0xc0, 0x95, 0xbf, 0xaf, + 0xc0, 0xe1, 0xb4, 0x93, 0xdd, 0xc6, 0x90, 0x8e, + 0x97, 0x12, 0xe4, 0xce, 0x26, 0xc0, 0xaf, 0x12, + 0x93, 0xcc, 0x12, + 0x39, 0x27, 0x48, 0xd6, 0x8b, 0x1b, 0xd9, 0x6b, + 0xde, 0xbd, 0xb4, 0xe4, 0xe4, 0xe4, 0xe1, 0x7, + 0xc6, 0xf5, 0xf6, 0x57, 0xb4, 0xde, 0x90, 0x1e, + 0x9d, 0x9d, 0x4e, 0x94, 0x55, 0xab, 0x61, 0x76, + 0x29, 0x1c, 0x29, 0x29, 0x45, 0x89, 0x73, 0x30, + 0x89, 0x63, 0xe, 0x60, 0x89, 0x63, 0x6e, 0xa5, + 0xe, 0x19, 0x4a, 0x19, 0x6e, 0x19, 0xef, 0x5a, + 0x42, 0x6e, 0xd5, 0xc5, 0x79, 0x6e, 0xe9, 0x79, + 0xf1, 0x6e, 0x19, 0x1b, 0x4a, 0x11, 0xd5, 0xc5, + 0x2, 0x1b, 0x63, 0xd2, 0x79, 0xd5, 0x6e, 0x42, + 0xf1, 0x2d, 0x42, 0x73, 0x5, 0x8a, 0x1c, 0x62, + 0xa, 0x23, 0xd1, 0x76, 0x76, 0x5e, 0x87, 0x67, + 0x3f, 0x3f, 0xeb, 0xb, 0x92, 0x33, 0x3c, 0x3c, + 0xc, 0xc, 0x92, 0x3c, 0x3c, 0x2b, 0xdc, 0x80, + 0x3c, 0x2b, 0xd0, 0x2b, 0x2b, 0x3c, 0xc, 0xc, + 0xc, 0x92, 0x1d, 0xa8, 0x1d, 0x92, 0x91, 0x3f, + 0x92, 0x1d, 0x3c, 0x80, 0xc, 0xc, 0x5f, 0x5f, + 0x92, 0xc, 0x3c, 0x92, 0x1d, 0x5f, 0xd, 0xa2, + 0xea, 0xc, 0x2b, 0x2b, 0xc, 0xc, 0xb6, 0xf, + 0xf, 0x56, 0xa8, 0x6e, 0x27, 0x27, 0x3, 0xfd, + 0x9d, 0x98, 0x5d, 0x7a, 0x91, 0x91, 0x91, 0x48, + 0xa9, 0xae, 0x3e, 0x8b, 0xcb, 0xb, 0xd6, 0x5c, + 0xd0, 0xea, 0x91, 0x2b, 0x2b, 0x3c, 0x91, 0x48, + 0x2a, 0x7a, 0xa8, 0xad, 0xa6, 0xd3, 0xa, 0x62, + 0xa, 0xa, 0xd1, 0x78, 0x6d, 0x6d, 0x16, 0xda, + 0x45, 0x87, 0xda, 0x5, 0x87, 0x29, 0x62, 0x29, + 0x1c, 0xd1, 0x76, 0x58, 0xa0, 0x67, 0x68, 0x1b, + 0x19, 0x63, 0xd2, 0xe, 0x6e, 0xe9, 0x79, 0xa5, + 0xd2, 0x89, 0x30, 0x89, 0x63, 0x63, 0xf1, 0x63, + 0x19, 0x4a, 0x19, 0x6e, 0x89, 0x89, 0x2f, 0x67, + 0x8, 0x42, 0x73, 0x89, 0x63, 0x63, 0x63, 0xe7, + 0x79, 0x63, 0xf1, 0xd3, 0x1c, 0x29, 0xa, 0x62, + 0xe3, 0x41, 0x82, 0x41, 0xa6, 0xd5, 0x3, 0x98, + 0x2c, 0xab, 0xd3, 0xac, 0x82, 0x8, 0xc9, 0xc9, + 0xe7, 0xd5, 0xc2, 0xa6, 0x96, 0xd7, 0x6c, 0x4, + 0x3, 0xd5, 0xf5, 0xde, 0x3, 0x9c, 0x81, 0xca, + 0x6b, 0xe5, 0x8f, 0x2f, 0x8c, 0xd3, 0x6d, 0x78, + 0x6d, 0x4d, 0xb5, 0xe3, 0xd3, 0xb3, 0xa4, 0x5, + 0x5, 0x30, 0x67, 0x24, 0x1c, 0x6d, 0x8c, 0x1, + 0x55, 0xab, 0x8a, 0x30, 0x67, 0xae, 0x19, 0x6e, + 0x1b, 0x6e, 0x6c, 0xd7, 0x6c, 0x3, 0x1e, 0x6c, + 0xef, 0xa9, 0x6b, 0x7d, 0xe5, 0x81, 0xf3, 0x97, + 0x6f, 0xf5, 0xf3, 0x4, 0x32, 0xd8, 0x3, 0xe5, + 0x6c, 0xef, 0xe5, 0xd7, 0x7d, 0xdf, 0xf3, 0x97, + 0x32, 0x81, 0xf5, 0x93, 0xc0, 0x9a, 0xe1, 0x9c, + 0x81, 0xf4, 0x9, 0x97, 0x93, 0xca, 0x9c, 0xff, + 0x93, 0xc0, 0xcc, 0xdf, 0x26, 0xc0, 0xe2, 0x12, + 0x26, 0xed, 0xb1, + 0x9d, 0x6b, 0x7e, 0x4f, 0xef, 0xe5, 0xe5, 0x6b, + 0x7d, 0x6f, 0xff, 0x81, 0x32, 0x6f, 0x1e, 0x74, + 0x1e, 0x8e, 0xde, 0x81, 0x7b, 0x4, 0x7b, 0xd8, + 0x6b, 0x77, 0x2f, 0x87, 0x6d, 0xb5, 0x29, 0x23, + 0xd1, 0x29, 0xb5, 0x1c, 0x30, 0x42, 0x63, 0x63, + 0x6e, 0x79, 0x89, 0x67, 0xf1, 0x63, 0xa5, 0x67, + 0x89, 0x63, 0x6e, 0x63, 0x19, 0x63, 0x4a, 0x63, + 0x63, 0x63, 0xc5, 0x8, 0x73, 0x19, 0x19, 0xf1, + 0x73, 0x6e, 0x19, 0x19, 0x19, 0x1b, 0x1b, 0x79, + 0x2f, 0xd2, 0x1b, 0x89, 0xe, 0x63, 0x19, 0x2d, + 0x30, 0x89, 0x42, 0x2f, 0x41, 0x41, 0x29, 0x62, + 0xd1, 0x0, 0x23, 0xd1, 0xd1, 0xbe, 0x2f, 0x5a, + 0x49, 0x1d, 0xb8, 0x80, 0x2b, 0xc, 0x5f, 0xb7, + 0x1d, 0x92, 0x3c, 0x80, 0x92, 0xc1, 0xd0, 0xa2, + 0x2b, 0x5f, 0x92, 0x3c, 0x3c, 0xc, 0xc, 0xb8, + 0x56, 0x91, 0x3e, 0xe9, 0x2c, 0xf, 0x49, 0x91, + 0x91, 0xc, 0xf, 0x5f, 0x5f, 0xc, 0xc, 0x5f, + 0xf, 0x17, 0x2b, 0xdc, 0x3c, 0xf, 0x56, 0xc1, + 0xc, 0xc, 0xc, 0xf, 0xf, 0xf, 0xb6, 0x2c, + 0x56, 0x52, 0x60, 0xef, 0x3, 0x47, 0x3a, 0x3, + 0xa9, 0x2c, 0x52, 0x50, 0xa3, 0x60, 0xd2, 0xef, + 0xef, 0xd9, 0xd9, 0x9d, 0xba, 0xea, 0x92, 0x1d, + 0x3f, 0x91, 0x80, 0xd0, 0x18, 0xeb, 0x7f, 0x53, + 0x8b, 0x5d, 0x1, 0x24, 0x6d, 0xac, 0x6d, 0x37, + 0x6d, 0xa, 0x78, 0x87, 0x45, 0x5, 0xda, 0xda, + 0xa4, 0x82, 0x4d, 0x29, 0x4d, 0x78, 0xa, 0xa, + 0x6d, 0x62, 0x1c, 0x2f, 0xd2, 0x1b, 0x89, 0x19, + 0x19, 0xd2, 0x2f, 0x8c, 0x89, 0x42, 0xa5, 0x79, + 0x19, 0x89, 0x63, 0x4a, 0x4a, 0x19, 0x89, 0x6e, + 0x19, 0x19, 0xd2, 0x79, 0x89, 0x96, 0x2f, 0xf1, + 0xd2, 0x1b, 0x19, 0x6e, 0x4a, 0xe, 0xd5, 0x19, + 0x63, 0x79, 0x67, 0xd3, 0x62, 0x29, 0x62, 0xe3, + 0xd3, 0x5a, 0x67, 0xb5, 0x67, 0xa9, 0x53, 0x80, + 0x1d, 0x94, 0xac, 0x4d, 0xe3, 0xa4, 0xc9, 0x4f, + 0x6b, 0xd8, 0x83, 0x4f, 0x6e, 0x3, 0xde, 0xd8, + 0xa9, 0x83, 0xbd, 0xce, 0xbd, 0xbd, 0xc6, 0xf5, + 0x7b, 0x9b, 0x3a, 0x3e, 0x1, 0x82, 0xac, 0x62, + 0x29, 0x4d, 0x6d, 0x4d, 0xb5, 0x68, 0xa0, 0xa4, + 0x5, 0x8c, 0x67, 0xe3, 0x6d, 0x62, 0x4d, 0xb5, + 0x6d, 0x4d, 0x1c, 0x58, 0x68, 0x8, 0x96, 0x89, + 0x96, 0xc2, 0x8f, 0xd7, 0xd7, 0x8b, 0xd8, 0xfd, + 0xfd, 0x1e, 0x81, 0x9c, 0xde, 0xe4, 0xb4, 0xbf, + 0xf3, 0xe1, 0x57, 0x9, 0xb9, 0x57, 0x90, 0x4, + 0x4, 0x7b, 0x9c, 0x97, 0xf3, 0xe4, 0xb4, 0xbf, + 0xbf, 0x9a, 0x7, 0xe4, 0xbf, 0xb4, 0xf4, 0xbf, + 0xbf, 0xf4, 0xbf, 0xb0, 0x20, 0x8d, 0xaf, 0xe1, + 0xe1, 0xbf, 0xf4, 0xbf, 0xe2, 0xf4, 0xbf, 0xe2, + 0xbf, 0xbf, 0xbf, + 0x47, 0xe5, 0x77, 0xd4, 0xd5, 0x8f, 0xef, 0x7c, + 0xd9, 0x6b, 0x1e, 0x3d, 0xfd, 0x9c, 0x99, 0x1e, + 0x32, 0x4, 0x9c, 0xdf, 0x6b, 0x4, 0xb9, 0x9d, + 0x7e, 0x60, 0x2f, 0xa8, 0x2f, 0x41, 0x6d, 0xa, + 0xa, 0x29, 0x62, 0x62, 0x5, 0x42, 0xd2, 0x2, + 0xd2, 0x89, 0x89, 0x42, 0xd2, 0x63, 0x89, 0x8, + 0x63, 0x19, 0x79, 0xf1, 0x89, 0x63, 0x4a, 0xd2, + 0xe9, 0x63, 0x1b, 0x89, 0x63, 0x19, 0x6e, 0x42, + 0x42, 0x19, 0x19, 0xe9, 0xd2, 0x42, 0x42, 0x79, + 0x2, 0x6e, 0x19, 0x89, 0x63, 0x19, 0x63, 0xf1, + 0x67, 0x8, 0x67, 0x41, 0xa, 0xe3, 0x5e, 0x78, + 0xd1, 0xa, 0xa, 0xd1, 0x76, 0x82, 0x60, 0x2f, + 0x1, 0x1f, 0x1d, 0x92, 0x3c, 0xc, 0xaa, 0x56, + 0x56, 0x2b, 0xb, 0xd0, 0xc1, 0x56, 0x80, 0xb, + 0xc, 0xc, 0x56, 0x5f, 0xc, 0xc, 0x80, 0x7f, + 0x7f, 0x51, 0xa9, 0xa9, 0x91, 0x3f, 0xf, 0x91, + 0x5f, 0xc, 0xf, 0x1f, 0x5f, 0xc, 0xc, 0x3c, + 0x56, 0xaa, 0xc, 0x80, 0xc, 0x5f, 0xb6, 0xf, + 0x92, 0xc, 0xc, 0x56, 0x56, 0x92, 0x91, 0x48, + 0x38, 0x56, 0x9e, 0xe8, 0x8b, 0xa9, 0x5d, 0xa9, + 0x40, 0x48, 0x2c, 0xe9, 0x4f, 0xfb, 0xa9, 0x3a, + 0x8b, 0x88, 0x7f, 0xdb, 0xea, 0x2b, 0xc, 0x92, + 0x38, 0xeb, 0x53, 0x53, 0x18, 0x18, 0xba, 0xa2, + 0x98, 0x91, 0x52, 0xbe, 0x4d, 0xac, 0x4d, 0x4d, + 0x4d, 0x16, 0x6d, 0x82, 0x45, 0x45, 0xbe, 0x82, + 0xc3, 0x3b, 0x82, 0x16, 0x4d, 0x29, 0x4d, 0x6d, + 0x82, 0x29, 0xe3, 0x2f, 0xa5, 0xef, 0xd5, 0xe5, + 0x6b, 0x8f, 0x2f, 0x67, 0xe7, 0x2f, 0x42, 0xef, + 0xd5, 0x4a, 0x6e, 0xef, 0xef, 0x19, 0x6e, 0x19, + 0xef, 0x19, 0xd5, 0x7a, 0x2, 0x14, 0xa6, 0xd2, + 0x6e, 0x19, 0xc2, 0xe5, 0x8f, 0xd5, 0xd5, 0x8f, + 0xe, 0x42, 0x58, 0x29, 0x62, 0x76, 0x62, 0xd3, + 0x52, 0x2c, 0x49, 0x52, 0x9e, 0x22, 0x51, 0x80, + 0x91, 0x52, 0x55, 0x4d, 0x8a, 0xa6, 0xd4, 0x27, + 0x81, 0x75, 0xc6, 0x74, 0xd6, 0xcb, 0xf6, 0x4b, + 0x81, 0xc6, 0xf4, 0xb4, 0xf4, 0xb4, 0xf4, 0x8d, + 0xe1, 0xf6, 0x18, 0x91, 0x91, 0xa7, 0x6d, 0x62, + 0x4d, 0xe3, 0x1c, 0x29, 0x3b, 0x68, 0xa4, 0x68, + 0x24, 0x1c, 0x82, 0x82, 0xe3, 0x8c, 0x87, 0x68, + 0xb5, 0x8a, 0xe3, 0x4d, 0xb5, 0xe3, 0x68, 0xa6, + 0xf1, 0xae, 0x77, 0x6e, 0xd5, 0xef, 0x47, 0x4, + 0x6f, 0x1e, 0x36, 0xb1, 0x8e, 0xde, 0xe1, 0xde, + 0xe4, 0x7, 0x75, 0xc6, 0xed, 0x8e, 0x97, 0x4, + 0x6c, 0x6b, 0x83, 0x9c, 0xbd, 0x7, 0x57, 0xc6, + 0xb4, 0xb4, 0xe1, 0xbf, 0xbf, 0x95, 0xbf, 0xbf, + 0xe2, 0xbf, 0xf4, 0xbf, 0xbf, 0xf4, 0xe1, 0x74, + 0x40, 0x4b, 0xbf, 0xbb, 0x12, 0xbf, 0xcc, 0xaf, + 0xbf, 0xe2, 0xbf, + 0xe4, 0x9b, 0x27, 0x7e, 0x7a, 0x5d, 0x4e, 0x22, + 0x5c, 0x9c, 0xb4, 0xbf, 0xf4, 0xc0, 0xf3, 0xe4, + 0xdd, 0xdd, 0xe1, 0x9f, 0x40, 0xd8, 0x84, 0x53, + 0x2a, 0xe8, 0xa8, 0x52, 0xab, 0x68, 0xb3, 0x16, + 0x6d, 0x62, 0xd1, 0xa, 0xa, 0xb5, 0xab, 0x58, + 0xa5, 0x96, 0x6e, 0xd9, 0xe, 0x11, 0x19, 0xc2, + 0x19, 0x63, 0x79, 0x8, 0xf1, 0xc2, 0x77, 0xa5, + 0x19, 0xd5, 0x77, 0xd5, 0x63, 0xd5, 0x19, 0xe, + 0x79, 0xa5, 0xd2, 0x2f, 0xa5, 0xc5, 0xd5, 0xe7, + 0xc2, 0xef, 0xef, 0x19, 0x19, 0xd7, 0xd5, 0xd2, + 0x58, 0x8c, 0x8a, 0x1c, 0x1c, 0x8c, 0xac, 0x23, + 0x76, 0x76, 0x76, 0xd1, 0x78, 0x4d, 0x52, 0x1f, + 0x52, 0xb6, 0x56, 0x33, 0xc, 0x3c, 0xb, 0xdb, + 0x48, 0x2b, 0x48, 0xb, 0x2b, 0x5f, 0xc, 0xc, + 0x3c, 0xc, 0x3c, 0x7f, 0xdc, 0x3c, 0xdc, 0x53, + 0xa2, 0xb, 0xb, 0x91, 0x91, 0xf, 0x5f, 0x92, + 0x92, 0x5f, 0xc, 0x91, 0xc1, 0xc, 0xc, 0x2b, + 0x3c, 0xc, 0x92, 0xc, 0xc, 0x92, 0x5f, 0xb7, + 0x56, 0x5f, 0x5f, 0x3c, 0x48, 0x56, 0x5f, 0x92, + 0x2b, 0x5f, 0xb6, 0x56, 0x38, 0x5c, 0x7f, 0x18, + 0x35, 0x4e, 0xa8, 0xa5, 0x5d, 0x98, 0x91, 0x92, + 0x91, 0x48, 0x91, 0xb, 0x51, 0xb, 0xd0, 0xd6, + 0x18, 0xd0, 0x5c, 0xcb, 0x74, 0xba, 0xb, 0x92, + 0x92, 0x52, 0x55, 0x61, 0x61, 0x76, 0xd1, 0x4d, + 0x76, 0x78, 0xa, 0x4d, 0x37, 0x78, 0x29, 0xbe, + 0x82, 0x68, 0x45, 0x5a, 0x1, 0x29, 0x29, 0xe3, + 0xd3, 0x58, 0xe3, 0x37, 0xab, 0x1, 0x77, 0x6b, + 0xef, 0x6e, 0x6e, 0x6e, 0x19, 0x1b, 0x96, 0x6e, + 0x19, 0xa5, 0x2f, 0x7a, 0xc5, 0x7a, 0xd5, 0x77, + 0xc5, 0xef, 0x6e, 0xef, 0x77, 0x73, 0x67, 0xad, + 0x2f, 0x79, 0xe7, 0xd5, 0x19, 0x6e, 0xd7, 0xef, + 0xd5, 0xf0, 0xa0, 0x8a, 0x1c, 0xa, 0x78, 0x76, + 0xf2, 0x5e, 0x17, 0x66, 0xab, 0x59, 0x4f, 0x7e, + 0x50, 0x2f, 0x30, 0xda, 0x82, 0x8c, 0xa8, 0xe8, + 0x3e, 0x5c, 0xf6, 0xe1, 0x8b, 0x39, 0x7d, 0x39, + 0x9c, 0xbd, 0xb4, 0x4b, 0x39, 0x90, 0xe1, 0x84, + 0x9d, 0x7e, 0x88, 0x7e, 0x2c, 0x1, 0xd3, 0x29, + 0x5, 0x67, 0x58, 0x1c, 0x1c, 0xb5, 0x4d, 0xe3, + 0x6d, 0x4d, 0xda, 0xb5, 0xa0, 0x79, 0x73, 0xa0, + 0xa0, 0x58, 0xd3, 0x6d, 0x6d, 0x78, 0x6d, 0x6d, + 0x8c, 0x8c, 0xb3, 0x73, 0x1b, 0x4a, 0xd7, 0xd7, + 0xef, 0xc5, 0x5d, 0xe5, 0x6c, 0x47, 0x27, 0x6f, + 0x4, 0x32, 0x9c, 0xe5, 0xe5, 0x6c, 0x6c, 0xd7, + 0xd7, 0xc9, 0x60, 0xef, 0x47, 0xc6, 0x81, 0x99, + 0x9c, 0xb4, 0xb4, 0x93, 0xdf, 0xfa, 0x95, 0x12, + 0x12, 0xbf, 0x90, 0x47, 0x97, 0x97, 0x97, 0x9c, + 0x99, 0x9c, 0xaf, 0xc0, 0x93, 0x12, 0xf7, 0x12, + 0x93, 0xaf, 0xe2, + 0x75, 0x1e, 0x40, 0x48, 0x91, 0x7f, 0xd9, 0x8b, + 0xf5, 0xce, 0xe4, 0xc6, 0xe1, 0xdd, 0xe4, 0x9a, + 0x57, 0xc6, 0xe1, 0x74, 0x53, 0x90, 0x90, 0x18, + 0x27, 0x2a, 0x1, 0x94, 0xab, 0x82, 0x5e, 0x37, + 0xa, 0xa, 0xd1, 0x6d, 0x58, 0x67, 0x5, 0x89, + 0x63, 0xd2, 0x2f, 0xa5, 0x73, 0xe9, 0xd5, 0x8f, + 0xe, 0x6e, 0x1b, 0x6e, 0x63, 0x63, 0x6e, 0x89, + 0x42, 0x79, 0x2f, 0x42, 0xd2, 0xe7, 0x6e, 0xe, + 0xe9, 0xd2, 0x1b, 0x1b, 0x1b, 0x19, 0xc2, 0x2f, + 0x5b, 0xe9, 0x21, 0x79, 0x1b, 0xe, 0xd2, 0xd2, + 0xf1, 0x8, 0x30, 0x45, 0x5, 0x30, 0x6d, 0x62, + 0x76, 0x23, 0x0, 0x23, 0x62, 0x5e, 0x65, 0x8c, + 0xc7, 0xb8, 0x3e, 0xc5, 0x59, 0x3f, 0x91, 0xb, + 0x2b, 0xb6, 0xaa, 0x3c, 0x3c, 0x2b, 0x3c, 0x33, + 0x38, 0x80, 0xdc, 0xa2, 0xc1, 0x56, 0x92, 0x80, + 0xb, 0x92, 0x1d, 0xa8, 0x50, 0x50, 0x60, 0x60, + 0x60, 0x91, 0x92, 0x91, 0xc, 0xb6, 0xb6, 0x5f, + 0xc, 0xc, 0x5f, 0xf, 0xaa, 0xc, 0xc, 0xc, + 0x56, 0x1f, 0xf, 0xc, 0x2b, 0x5f, 0x1d, 0xb6, + 0x92, 0x92, 0x1d, 0x52, 0x59, 0x59, 0x5d, 0x72, + 0x59, 0x87, 0x87, 0x1, 0x52, 0xab, 0x6, 0x55, + 0x1f, 0xa1, 0x77, 0x27, 0x40, 0x7, 0x51, 0xb, + 0xea, 0xd6, 0x64, 0x91, 0x18, 0x18, 0x50, 0x49, + 0x52, 0x66, 0xd3, 0x61, 0xd1, 0x23, 0xd1, 0x76, + 0xa, 0x78, 0x29, 0x62, 0xa, 0x16, 0x6d, 0x82, + 0x29, 0xda, 0x45, 0x8, 0x87, 0xa, 0x1c, 0x1c, + 0x62, 0x1c, 0x1c, 0x1c, 0x1c, 0x58, 0x8, 0xd5, + 0xc2, 0x79, 0x63, 0x4a, 0xd5, 0x4a, 0x19, 0x1b, + 0x63, 0x6e, 0x6e, 0xd2, 0x1b, 0xf1, 0x1b, 0x19, + 0x19, 0x63, 0xc2, 0x6e, 0xa5, 0xd2, 0x1b, 0x8, + 0x67, 0x30, 0x89, 0x19, 0x11, 0x19, 0x19, 0x63, + 0x63, 0xf1, 0x45, 0xda, 0xa, 0x78, 0xd1, 0x78, + 0x62, 0x62, 0x4d, 0x58, 0x2f, 0x1b, 0xd9, 0x27, + 0x50, 0x67, 0xd3, 0x82, 0x8a, 0x58, 0xa5, 0xd5, + 0xef, 0xe5, 0x36, 0xde, 0x4, 0x9c, 0x9c, 0x86, + 0x4, 0x47, 0xde, 0xce, 0x47, 0xfd, 0xc6, 0xf3, + 0x47, 0x6b, 0x27, 0xe8, 0x7a, 0xd3, 0x5e, 0x29, + 0xb5, 0x4d, 0xa, 0xe3, 0x8a, 0x3b, 0xb5, 0x5, + 0x3b, 0x3b, 0x1c, 0x1c, 0x8a, 0x58, 0x8c, 0x8c, + 0x82, 0x24, 0x1c, 0x58, 0x58, 0xb5, 0xda, 0x6d, + 0xda, 0x6d, 0x1c, 0xda, 0x30, 0x42, 0xa5, 0xe, + 0x4a, 0xd2, 0xe9, 0xd5, 0xd7, 0xd7, 0x6c, 0x4, + 0x6c, 0x6c, 0x6c, 0xd7, 0xd7, 0xd7, 0x5d, 0xa5, + 0xd5, 0xc2, 0x77, 0xc2, 0x6f, 0xf3, 0xc0, 0x93, + 0x93, 0xaf, 0xbb, 0x12, 0x95, 0xbf, 0xbf, 0xde, + 0x12, 0xe2, 0xbf, 0x4, 0x97, 0x93, 0x8e, 0x4, + 0x97, 0x93, 0xc0, 0xaf, 0xd8, 0xcc, 0xc0, 0x12, + 0x12, 0x12, 0xbf, + 0x88, 0xe5, 0xd7, 0x31, 0xd9, 0xc2, 0x7d, 0xce, + 0x8e, 0x32, 0x8e, 0xf6, 0x3a, 0x47, 0xde, 0xe1, + 0x83, 0x6b, 0xbd, 0xe1, 0x36, 0x9c, 0x6b, 0x6b, + 0xef, 0xe9, 0x2f, 0x82, 0xbe, 0xac, 0x4d, 0xa, + 0x1c, 0x1c, 0x29, 0x41, 0x67, 0x8, 0x89, 0x89, + 0x89, 0xe9, 0x42, 0x42, 0x73, 0x89, 0xf1, 0x79, + 0x19, 0x63, 0x42, 0x63, 0x19, 0x63, 0x19, 0x63, + 0x89, 0x8, 0x30, 0x42, 0x1b, 0x1b, 0xf1, 0xd2, + 0x19, 0x63, 0x63, 0x89, 0x63, 0x19, 0x63, 0x63, + 0x8, 0x67, 0x67, 0x73, 0x19, 0x6e, 0x63, 0x89, + 0x63, 0x63, 0xf1, 0x89, 0x30, 0x67, 0x41, 0x34, + 0xd1, 0xa, 0x23, 0xd1, 0x78, 0x78, 0x4d, 0x87, + 0xe9, 0x5d, 0x2c, 0x2c, 0xa8, 0x1d, 0x92, 0x91, + 0xaa, 0x1d, 0xaa, 0xb8, 0xd0, 0x48, 0x3c, 0x38, + 0x38, 0xc, 0x3c, 0x2b, 0xc, 0xf, 0x1d, 0xc7, + 0x3e, 0x48, 0xa8, 0x87, 0x8, 0xf0, 0x2f, 0x7a, + 0x7a, 0x91, 0xf, 0xf, 0x5f, 0x5f, 0xf, 0x92, + 0xc1, 0xc, 0xc, 0x5f, 0x48, 0x80, 0xc, 0xc, + 0x5f, 0xf, 0xb6, 0xc, 0x5f, 0x92, 0x1d, 0x91, + 0xb, 0xb, 0x1d, 0x52, 0x55, 0x52, 0x52, 0xab, + 0xab, 0x55, 0x5e, 0x82, 0x82, 0x87, 0xb3, 0x66, + 0x82, 0xa6, 0x1b, 0x27, 0x71, 0x74, 0x98, 0x2b, + 0x2b, 0x91, 0x22, 0x48, 0x53, 0x40, 0x27, 0x50, + 0x49, 0xd3, 0x78, 0x0, 0x23, 0x76, 0x78, 0x78, + 0x78, 0x76, 0x16, 0x16, 0x16, 0x3b, 0x5, 0x45, + 0x82, 0x29, 0xda, 0x8c, 0xbe, 0x1c, 0x29, 0xd3, + 0xa, 0x41, 0x42, 0x5a, 0xd3, 0x58, 0x8, 0xd2, + 0xa5, 0x67, 0xe9, 0xe9, 0x50, 0xe9, 0x19, 0xd5, + 0x19, 0x19, 0x19, 0x19, 0xef, 0x63, 0x63, 0x6e, + 0xd5, 0xef, 0x8f, 0xe8, 0xe7, 0x60, 0x6e, 0x6e, + 0xe9, 0x63, 0x63, 0x6e, 0x4a, 0x19, 0x4a, 0xd5, + 0xd2, 0x41, 0xd3, 0x78, 0x76, 0xd1, 0x78, 0xd3, + 0xab, 0xd3, 0x87, 0xa0, 0xc9, 0x2a, 0x8b, 0xdb, + 0x49, 0x64, 0x29, 0x4d, 0xe3, 0xc3, 0xd4, 0x8b, + 0xf5, 0xde, 0x85, 0xf9, 0x1e, 0x53, 0x9f, 0xe1, + 0xd8, 0x8b, 0xe1, 0xe4, 0xf3, 0xe4, 0xe4, 0xc6, + 0x9, 0x2e, 0x75, 0x8b, 0x60, 0xab, 0xbe, 0xe3, + 0x4d, 0x62, 0x62, 0xda, 0x8, 0x8, 0xad, 0xa0, + 0xa4, 0xa4, 0xd3, 0xe3, 0xb5, 0x6d, 0x6d, 0xb5, + 0x67, 0x58, 0xb5, 0x58, 0x45, 0x8, 0x8c, 0xe3, + 0xda, 0xe3, 0xa, 0x1c, 0x5, 0x68, 0x8c, 0x2f, + 0xe, 0xd5, 0xe, 0x96, 0x19, 0xd7, 0xd7, 0xd7, + 0x4a, 0xe5, 0x77, 0x77, 0xd7, 0xd5, 0xc9, 0xa8, + 0x7c, 0x1e, 0x90, 0x7d, 0x99, 0x4b, 0xf4, 0x9a, + 0xb4, 0xb4, 0xc6, 0x9a, 0xbf, 0xe2, 0xf4, 0xbf, + 0xf4, 0xb4, 0xaf, 0xf4, 0xc6, 0xca, 0xca, 0x7b, + 0x70, 0x9, 0xf4, 0xfa, 0xdf, 0xbf, 0xaf, 0xbf, + 0xcc, 0xf7, 0xbb, + 0x1e, 0x6c, 0x4, 0x4, 0xd7, 0xe5, 0x6f, 0xc4, + 0xfd, 0xfd, 0xde, 0xf6, 0xdb, 0xc8, 0xde, 0xe4, + 0x81, 0x32, 0xe4, 0x8d, 0x7b, 0x47, 0x7b, 0x9d, + 0x98, 0x72, 0x2c, 0x52, 0xab, 0x82, 0x6d, 0x16, + 0x6d, 0x4d, 0xa, 0x62, 0x41, 0x8c, 0x79, 0x6e, + 0xd2, 0x42, 0x6e, 0x4a, 0x19, 0x19, 0x1b, 0x63, + 0x6e, 0x2f, 0x8, 0x19, 0x19, 0x63, 0x19, 0x63, + 0x79, 0xf1, 0x1b, 0x63, 0x19, 0x4a, 0x89, 0x1b, + 0x19, 0x6e, 0x8, 0x42, 0x63, 0x79, 0xc5, 0x19, + 0x1b, 0x42, 0x96, 0x1b, 0x63, 0x19, 0x63, 0xd2, + 0xd2, 0x67, 0x41, 0x67, 0x67, 0xd3, 0xd3, 0x41, + 0x1c, 0x1c, 0xd1, 0xa, 0xd1, 0x78, 0x4d, 0xb5, + 0x2c, 0x91, 0xf, 0x1d, 0x1d, 0x92, 0x92, 0x3f, + 0x38, 0x80, 0x92, 0xdc, 0x38, 0xc1, 0xc, 0x80, + 0x2b, 0xc, 0x5f, 0x5f, 0xc, 0x92, 0xc, 0xd6, + 0x13, 0x51, 0x4e, 0xa8, 0xa6, 0x68, 0x8c, 0x52, + 0x2c, 0x5f, 0x5f, 0x91, 0x92, 0x3c, 0xc, 0xc, + 0x33, 0xc1, 0xc, 0xc, 0xc, 0xc, 0x5f, 0xb6, + 0xc, 0xc, 0x5f, 0x5f, 0x33, 0x7f, 0x51, 0xcb, + 0xcb, 0xb, 0x3c, 0xb6, 0x17, 0x55, 0x55, 0x66, + 0x61, 0x5e, 0x61, 0x4d, 0x82, 0xad, 0x2f, 0x52, + 0x1f, 0x59, 0xd4, 0x22, 0xdb, 0x7, 0xdb, 0x3c, + 0x80, 0xa2, 0xcb, 0x74, 0x18, 0x13, 0x51, 0x98, + 0xf, 0x66, 0x61, 0x76, 0xd1, 0x76, 0xd1, 0x76, + 0xa, 0x16, 0x45, 0x87, 0x65, 0x45, 0x45, 0xc3, + 0x82, 0x87, 0xa4, 0x82, 0x76, 0x6d, 0x76, 0x78, + 0xa, 0xb5, 0x60, 0x4e, 0x52, 0x68, 0xa0, 0x1b, + 0xe7, 0x2f, 0x6e, 0xd2, 0xa5, 0x42, 0x8f, 0xef, + 0xe9, 0x1b, 0x8f, 0xd5, 0xef, 0xd5, 0xe, 0x1b, + 0xc5, 0xef, 0xef, 0xc5, 0xc9, 0x60, 0xd2, 0x6c, + 0x77, 0xa5, 0x96, 0x1b, 0xe9, 0xd5, 0x8f, 0xd5, + 0x2f, 0x58, 0x62, 0xa, 0xa, 0xa, 0x23, 0xd3, + 0x52, 0xac, 0x87, 0x9e, 0xa8, 0x91, 0xb, 0x80, + 0x1d, 0x66, 0x61, 0x6d, 0x6d, 0x8c, 0x59, 0x7d, + 0x81, 0xc6, 0x75, 0x90, 0x88, 0x18, 0x53, 0xe1, + 0xf9, 0x39, 0xdf, 0xbf, 0xbf, 0xbf, 0xf9, 0x86, + 0xde, 0x57, 0xba, 0xdc, 0xb8, 0x52, 0xab, 0x82, + 0x58, 0x4d, 0xa, 0xb5, 0x8, 0x2f, 0x1, 0x68, + 0xb3, 0x8c, 0x6, 0x24, 0xda, 0x3b, 0x1c, 0x58, + 0x89, 0x67, 0xb5, 0x29, 0x58, 0x8c, 0x5e, 0xac, + 0x82, 0xbe, 0xbe, 0x5e, 0x5, 0x5, 0x8a, 0x3b, + 0x42, 0xd2, 0x2f, 0x67, 0xf0, 0x19, 0xd5, 0x5d, + 0x6e, 0x1b, 0xe, 0xe9, 0x4a, 0x7d, 0xd4, 0x59, + 0xd9, 0x81, 0x9f, 0x8b, 0x7d, 0xf8, 0xe1, 0x57, + 0xe1, 0xc6, 0xaf, 0xbf, 0xbb, 0xe2, 0xb4, 0x4b, + 0xb4, 0xf4, 0xe2, 0xe1, 0x90, 0x99, 0x39, 0xca, + 0xc8, 0xc4, 0xf7, 0xf7, 0xc0, 0xe4, 0xbf, 0xbf, + 0xcc, 0xb1, 0xcc, + 0xde, 0x8e, 0x9c, 0x8b, 0x9d, 0x9d, 0xd8, 0xe1, + 0xf6, 0x9f, 0xe4, 0xe4, 0xe1, 0xe4, 0xc6, 0xe4, + 0xb4, 0x9a, 0xe1, 0xe1, 0x53, 0x51, 0xf6, 0x57, + 0x48, 0xb8, 0x4e, 0x4e, 0x2f, 0xb5, 0x58, 0x5, + 0x3b, 0xa, 0x62, 0xa, 0xd1, 0xe3, 0x67, 0x6e, + 0x19, 0x77, 0x1b, 0xef, 0xd5, 0xd5, 0xe5, 0x6e, + 0x6e, 0x2f, 0x42, 0x63, 0x63, 0xe9, 0x6e, 0xd5, + 0x19, 0xd2, 0x89, 0xc2, 0x4a, 0xef, 0xef, 0x6e, + 0x1b, 0x79, 0x2f, 0x42, 0xe, 0x7a, 0x2f, 0x6e, + 0x4a, 0xef, 0x6e, 0x1b, 0x63, 0x6e, 0x5d, 0x79, + 0x2f, 0x30, 0x8c, 0x58, 0x8, 0x1, 0x1c, 0x6d, + 0x41, 0xd3, 0x76, 0xd1, 0x29, 0xac, 0x94, 0x65, + 0x60, 0x3f, 0x91, 0x91, 0x51, 0x48, 0xaa, 0xa8, + 0x38, 0xb, 0xc, 0xc, 0xf, 0xf, 0x92, 0xc, + 0x3c, 0x5f, 0x56, 0x56, 0xeb, 0xb, 0xeb, 0x33, + 0x4e, 0xb8, 0x2c, 0x66, 0xd3, 0x82, 0x5e, 0xd3, + 0xa8, 0xc7, 0xb8, 0x1d, 0x48, 0xa2, 0x80, 0x5f, + 0x56, 0x56, 0x92, 0xc, 0xc, 0x5f, 0xf, 0xf, + 0x5f, 0xc1, 0xc, 0x56, 0x3f, 0x5c, 0xdb, 0xba, + 0xba, 0x80, 0x92, 0x5f, 0xf, 0x1d, 0x17, 0x61, + 0x76, 0x4d, 0x4d, 0x61, 0xac, 0x8c, 0x49, 0x52, + 0xf, 0xb7, 0x9e, 0x3f, 0xb, 0xf6, 0xf6, 0xcb, + 0x18, 0x40, 0x9d, 0x51, 0x3e, 0xb8, 0x2c, 0xb6, + 0x52, 0x61, 0xa, 0x23, 0x34, 0x16, 0x16, 0xd1, + 0xd1, 0x16, 0xda, 0xd3, 0xf2, 0xbe, 0x82, 0x82, + 0x65, 0xc3, 0x45, 0x87, 0x78, 0x62, 0x1c, 0xa, + 0xa, 0x29, 0xd3, 0xab, 0xd3, 0x58, 0x73, 0xc2, + 0xe9, 0x1b, 0x4a, 0x19, 0x19, 0x19, 0x63, 0x19, + 0x14, 0x5a, 0xef, 0xc5, 0x5d, 0x50, 0xc2, 0x1b, + 0x1b, 0x19, 0xd5, 0xd5, 0x6e, 0x89, 0x63, 0x8f, + 0x5a, 0x8c, 0x8, 0x89, 0xa5, 0x79, 0x63, 0x19, + 0x42, 0x8, 0x30, 0x8a, 0xa, 0xd1, 0xd1, 0x78, + 0x76, 0x76, 0x61, 0x4d, 0x55, 0x52, 0x7e, 0x7f, + 0xa8, 0x8c, 0x6, 0x6d, 0x3b, 0xb5, 0xa6, 0xef, + 0x47, 0x3, 0x40, 0x90, 0xf5, 0x8e, 0x4b, 0xe4, + 0x9, 0x9c, 0xc0, 0xe4, 0xc0, 0xde, 0xd8, 0xde, + 0x32, 0x9b, 0x51, 0x8b, 0x77, 0x2f, 0x65, 0xb3, + 0x5, 0x6d, 0x78, 0xda, 0xe3, 0x82, 0x4d, 0x4d, + 0xb5, 0x82, 0xbe, 0x87, 0xa0, 0x5, 0xa0, 0xa0, + 0x5b, 0xa0, 0xb5, 0x6, 0x6d, 0x1c, 0x62, 0x6d, + 0x8a, 0xac, 0x4d, 0x24, 0x58, 0x58, 0xda, 0x5, + 0x30, 0x30, 0x87, 0x58, 0x8, 0x73, 0x2f, 0x2f, + 0x6e, 0xe, 0x42, 0x73, 0x96, 0xd9, 0xd4, 0x60, + 0x60, 0x9f, 0x27, 0xa5, 0x6b, 0xbd, 0xdd, 0x9c, + 0x32, 0xbf, 0xbf, 0xc0, 0xbf, 0xbf, 0xbf, 0x93, + 0xdd, 0xbb, 0xe4, 0xfd, 0x6b, 0x12, 0x9c, 0x6f, + 0xca, 0xff, 0xaf, 0xf3, 0x4, 0xf3, 0xe4, 0xc0, + 0xb1, 0xde, 0xbf, + 0xd8, 0x3, 0xd9, 0x4f, 0x7e, 0x88, 0xc6, 0xe4, + 0xdf, 0x9c, 0xb4, 0xbf, 0xbf, 0x81, 0x81, 0xc6, + 0xe1, 0x53, 0x75, 0x90, 0x27, 0x8b, 0x9b, 0xd8, + 0x27, 0x50, 0xe8, 0x2a, 0x8c, 0xe3, 0x24, 0x24, + 0x4d, 0x29, 0xd3, 0x87, 0x8a, 0x1c, 0xf1, 0xd2, + 0x19, 0x79, 0x96, 0x4a, 0x4a, 0xfb, 0xc5, 0x19, + 0x19, 0x1b, 0x6e, 0x19, 0x4a, 0x19, 0x19, 0x19, + 0x19, 0xf1, 0x67, 0x1b, 0x63, 0x5d, 0xa5, 0x19, + 0x6e, 0x1b, 0x2, 0x19, 0x63, 0x42, 0x89, 0x63, + 0x63, 0xe, 0xf1, 0x73, 0x63, 0xd2, 0x2f, 0xa5, + 0x73, 0x73, 0x30, 0x30, 0x1b, 0x8, 0x1c, 0x62, + 0x62, 0x62, 0xd1, 0xd1, 0xd1, 0x4d, 0xd3, 0x2f, + 0xe, 0xc5, 0x6e, 0xc5, 0x27, 0x48, 0xf, 0xb6, + 0x1d, 0x92, 0x92, 0x1d, 0x1d, 0x56, 0x3f, 0x3c, + 0x48, 0xeb, 0x91, 0x91, 0x22, 0xb, 0x2c, 0x52, + 0xab, 0xab, 0x61, 0xe3, 0x37, 0x4d, 0x4d, 0xe3, + 0xb3, 0x73, 0x2f, 0xa8, 0x91, 0x92, 0x5f, 0xb6, + 0x5f, 0x5f, 0x5f, 0x92, 0xc, 0x92, 0xaa, 0x5f, + 0x92, 0xd, 0x2b, 0x5f, 0x1d, 0x80, 0xeb, 0x91, + 0x48, 0x48, 0xa3, 0x91, 0x3f, 0x4e, 0x2f, 0xab, + 0x4d, 0x37, 0xac, 0x78, 0x37, 0x37, 0xac, 0x66, + 0x8c, 0x60, 0xe7, 0xa5, 0x4f, 0x2a, 0x27, 0x3a, + 0x98, 0x98, 0x5d, 0x2c, 0x64, 0x1, 0x1, 0xd3, + 0x5e, 0x76, 0x76, 0x78, 0xd1, 0x16, 0x3b, 0x16, + 0x37, 0xa, 0x29, 0x29, 0x6d, 0x87, 0x68, 0xbe, + 0x82, 0x5, 0x68, 0x29, 0x29, 0x3b, 0xda, 0x1c, + 0x62, 0x1c, 0x41, 0x62, 0x8a, 0x58, 0xf1, 0xf1, + 0x2f, 0x1b, 0x19, 0xd5, 0x19, 0x63, 0x63, 0x63, + 0x79, 0xa5, 0xe, 0xa5, 0x2f, 0x8, 0x63, 0x19, + 0x19, 0x19, 0x19, 0x4a, 0x19, 0x63, 0x63, 0xd2, + 0x73, 0x67, 0xd2, 0xf0, 0x2f, 0x89, 0x63, 0x63, + 0xf1, 0x41, 0x3b, 0x1c, 0xd1, 0xd1, 0xa, 0x78, + 0xd1, 0xd1, 0x76, 0xb5, 0xbe, 0x87, 0xd4, 0x5d, + 0x2c, 0xd3, 0x82, 0x8a, 0xe3, 0x87, 0xe8, 0x6a, + 0xe5, 0x7d, 0xf5, 0xce, 0x69, 0x6f, 0xdf, 0x9c, + 0xb1, 0x93, 0x7, 0xd8, 0x9c, 0x47, 0x9f, 0xdd, + 0x9c, 0x9c, 0x83, 0x47, 0x3, 0xa8, 0xab, 0xb5, + 0x8a, 0x6d, 0x29, 0x82, 0x82, 0x58, 0xb5, 0x30, + 0x73, 0x58, 0x1c, 0xda, 0x67, 0x8c, 0xb5, 0xb5, + 0xe3, 0x82, 0xd3, 0x8c, 0x87, 0x5, 0xda, 0xda, + 0x8, 0x41, 0xa, 0x16, 0x29, 0x6d, 0x62, 0x62, + 0x6d, 0xb5, 0xe3, 0x8c, 0xa6, 0xa0, 0xa4, 0xa0, + 0x89, 0x2f, 0x1, 0x24, 0xc3, 0x60, 0x91, 0x2c, + 0x4e, 0x4f, 0x6f, 0x4, 0x6f, 0xf3, 0x4b, 0x6f, + 0x93, 0xbf, 0xbb, 0xbf, 0xe4, 0x95, 0xbf, 0xc6, + 0xb4, 0x95, 0xc6, 0x97, 0xf3, 0xb4, 0xaf, 0x7b, + 0xca, 0xca, 0xf7, 0x12, 0x12, 0xed, 0xdf, 0x7b, + 0xf3, 0xaf, 0xbf, + 0x27, 0x5d, 0xd5, 0xd7, 0xd5, 0xe5, 0x9c, 0xe4, + 0xc0, 0x4, 0xbd, 0xe4, 0xdd, 0x9d, 0xd8, 0xe4, + 0x1e, 0x6b, 0xde, 0xe4, 0x97, 0x4, 0x47, 0x8e, + 0xe5, 0xa5, 0xa5, 0x2f, 0xab, 0x4d, 0x5e, 0xac, + 0xe3, 0x5e, 0x1c, 0x8, 0x8, 0x67, 0xa0, 0xc2, + 0x19, 0xf1, 0x63, 0x4a, 0x19, 0x8, 0xe9, 0x4a, + 0x19, 0x42, 0x1b, 0x63, 0xd5, 0x19, 0x19, 0x19, + 0x19, 0xd2, 0x8, 0x63, 0x6e, 0x8, 0x63, 0x19, + 0x19, 0x63, 0x6e, 0x89, 0x19, 0x19, 0x63, 0x19, + 0x63, 0x1b, 0x79, 0x6e, 0x63, 0xf1, 0x8, 0x89, + 0x63, 0xf1, 0xb3, 0x30, 0x42, 0x67, 0xe3, 0xa, + 0x76, 0xd1, 0x23, 0xd1, 0x76, 0xa, 0x6d, 0x8, + 0xd2, 0xd5, 0x5d, 0x50, 0xa8, 0x3f, 0x91, 0x2c, + 0x17, 0x1d, 0x1d, 0x3f, 0x48, 0xb, 0x91, 0x3f, + 0x48, 0xb, 0x91, 0x52, 0x1d, 0x1d, 0x52, 0xab, + 0x49, 0x49, 0xd3, 0x76, 0x76, 0xa, 0x78, 0xa, + 0x82, 0xb3, 0x1, 0x52, 0x52, 0x5f, 0x1d, 0xf, + 0x92, 0x3c, 0xaa, 0xf, 0xb7, 0x3c, 0xc, 0x5f, + 0xaa, 0xaa, 0x5f, 0xc, 0xc, 0xc1, 0x5c, 0x88, + 0x74, 0x9f, 0x27, 0x2c, 0x56, 0xa8, 0x2c, 0xab, + 0x61, 0x37, 0x76, 0x76, 0x78, 0xac, 0x82, 0x82, + 0x1, 0xa5, 0x77, 0x64, 0x64, 0x59, 0x7a, 0x91, + 0x91, 0x91, 0x60, 0x60, 0x2c, 0x2f, 0x2f, 0x5e, + 0xf2, 0x4d, 0x78, 0xa, 0x23, 0x78, 0x29, 0x6d, + 0x37, 0x4d, 0xb5, 0x5, 0x87, 0x68, 0xa4, 0x5, + 0x16, 0xe3, 0x4d, 0x6d, 0xa, 0xd1, 0xa, 0x62, + 0xa, 0xd3, 0x8c, 0x62, 0x58, 0x73, 0xd2, 0x2f, + 0x30, 0x8, 0x19, 0xd5, 0x4a, 0xd2, 0x1b, 0x1b, + 0x19, 0x6e, 0x4a, 0x6e, 0x5b, 0x89, 0x63, 0x4a, + 0x7b, 0x4a, 0x4a, 0x11, 0x4a, 0x77, 0x6e, 0xf0, + 0x63, 0x63, 0xd5, 0xd5, 0x1b, 0x73, 0xd2, 0xd2, + 0x8c, 0x76, 0xa, 0xa, 0x78, 0x78, 0x66, 0x66, + 0x37, 0x76, 0xab, 0x52, 0x1, 0x65, 0xa8, 0x3f, + 0x52, 0x5e, 0x37, 0xac, 0xa7, 0xa8, 0x8b, 0xc6, + 0x90, 0x99, 0x81, 0xb4, 0xce, 0xe4, 0x90, 0x90, + 0xb4, 0x9, 0x9a, 0xc6, 0x81, 0x12, 0xbf, 0xe4, + 0xf3, 0xdf, 0x83, 0x9f, 0x9d, 0x2c, 0xa7, 0xab, + 0x4d, 0x78, 0xac, 0x5e, 0x87, 0x5, 0x45, 0x2f, + 0x2f, 0x68, 0x6d, 0x1c, 0xb5, 0x6, 0x4d, 0x1c, + 0x6d, 0xe3, 0x24, 0xb3, 0x30, 0x68, 0x68, 0x87, + 0x67, 0x8c, 0x62, 0x29, 0xa, 0x62, 0xa, 0xa, + 0x5e, 0x78, 0x29, 0x41, 0x58, 0xa4, 0x58, 0x58, + 0x87, 0x87, 0x82, 0x8c, 0x52, 0xa8, 0x59, 0xe8, + 0xf6, 0xc6, 0xe4, 0xb4, 0xb4, 0xf4, 0xaf, 0xe4, + 0xe4, 0xe2, 0xe2, 0xbf, 0xf4, 0xb4, 0xe2, 0xf4, + 0xf4, 0xe2, 0xb4, 0xaf, 0xf4, 0xf4, 0xb0, 0xcc, + 0x26, 0x40, 0x70, 0xbf, 0xf4, 0x95, 0xe4, 0xaf, + 0xbf, 0xbf, 0x95, + 0x7d, 0xc2, 0xd7, 0x9c, 0x4, 0x7d, 0x6f, 0x81, + 0xbd, 0x97, 0x2e, 0xc6, 0xde, 0x9d, 0xc4, 0xb4, + 0x9c, 0x7d, 0xde, 0xce, 0xde, 0x47, 0x7d, 0x8b, + 0x3, 0x2c, 0x91, 0x49, 0x94, 0x5e, 0x6d, 0x62, + 0x6d, 0x62, 0x1c, 0x67, 0x58, 0x8c, 0xb3, 0x5b, + 0x63, 0x79, 0xa5, 0xef, 0x1b, 0x1b, 0x19, 0xd5, + 0xa5, 0x79, 0x42, 0x6e, 0x63, 0xd2, 0xc2, 0xc2, + 0x4a, 0x4a, 0xd2, 0x19, 0x63, 0x89, 0x63, 0x63, + 0x63, 0xf1, 0x1b, 0x89, 0x19, 0x6e, 0x79, 0x1b, + 0x89, 0x63, 0xe, 0x19, 0x63, 0x8, 0xa0, 0x63, + 0xd2, 0x67, 0x58, 0x3b, 0x67, 0xab, 0xd3, 0xd3, + 0x61, 0xa, 0xd1, 0xd1, 0xd1, 0xd1, 0xb5, 0x5, + 0xa5, 0x5d, 0x4e, 0x1d, 0x52, 0x1d, 0x5f, 0x91, + 0x91, 0x38, 0xb8, 0x91, 0xb, 0xba, 0x80, 0x1d, + 0x3f, 0x92, 0x92, 0xf, 0x1d, 0xa7, 0x49, 0x52, + 0x2f, 0xa8, 0x55, 0x76, 0x76, 0x76, 0x76, 0x78, + 0x78, 0x4d, 0xd3, 0x66, 0xf, 0x56, 0x1f, 0x92, + 0xc, 0x2b, 0xaa, 0x1f, 0xb7, 0x92, 0x3c, 0xc, + 0xf, 0xb7, 0xaa, 0xc, 0x3c, 0xd0, 0x5c, 0x90, + 0x75, 0x75, 0x53, 0x91, 0xf, 0xf, 0x52, 0x66, + 0x17, 0x61, 0xf2, 0x76, 0x37, 0x37, 0xe3, 0xb5, + 0xc3, 0x2c, 0x2c, 0x49, 0x1f, 0x59, 0x1d, 0x1d, + 0x3c, 0x91, 0xd9, 0xe8, 0x98, 0x50, 0x2f, 0xe3, + 0x78, 0x78, 0xd1, 0x76, 0x23, 0x76, 0x76, 0x37, + 0x37, 0x6d, 0x5, 0xa4, 0x68, 0x68, 0xa4, 0xad, + 0x65, 0x24, 0x4d, 0x78, 0x6d, 0xa, 0xa, 0xa, + 0x62, 0x6d, 0x1, 0xb5, 0x58, 0xe7, 0xe8, 0x6e, + 0xf1, 0x8, 0x6e, 0xef, 0xe5, 0x6e, 0xc2, 0x6e, + 0xc2, 0x19, 0xd5, 0x6e, 0x6e, 0x2, 0xe, 0xef, + 0xe5, 0x19, 0x4a, 0xd7, 0xef, 0xc2, 0x4a, 0x7d, + 0x4a, 0xd5, 0xef, 0xe5, 0xef, 0xd2, 0xe9, 0xc7, + 0xd3, 0x62, 0xa, 0xa, 0x62, 0x76, 0x37, 0x66, + 0x76, 0xac, 0x52, 0xf, 0x1d, 0x49, 0x1d, 0x92, + 0xb6, 0xac, 0x4d, 0x82, 0x82, 0xa8, 0x88, 0x4b, + 0x81, 0x81, 0xe1, 0x7, 0x9a, 0x70, 0x75, 0xe1, + 0xe4, 0xbf, 0xb4, 0xf4, 0xbf, 0xc0, 0xe4, 0xb4, + 0xe4, 0xe4, 0x84, 0xa2, 0xdc, 0x91, 0x91, 0x52, + 0xab, 0xac, 0x78, 0x76, 0x6d, 0x4d, 0x8c, 0x8c, + 0x58, 0x87, 0xe3, 0x24, 0xb5, 0x58, 0x5, 0x67, + 0x41, 0xb5, 0xda, 0x5, 0x87, 0x29, 0xe3, 0xb5, + 0xe3, 0x6d, 0x1c, 0x62, 0x29, 0x1c, 0x1c, 0x29, + 0x62, 0xa, 0xa, 0x62, 0x29, 0xb5, 0xe3, 0x6d, + 0x82, 0x94, 0xa7, 0x67, 0xc7, 0x4f, 0x35, 0x6b, + 0x81, 0xb4, 0xb4, 0xe1, 0xc6, 0x9a, 0xbf, 0xb4, + 0x85, 0xb4, 0xbf, 0xbb, 0xaf, 0xe2, 0xbf, 0xbf, + 0xf4, 0xf4, 0xf4, 0xe2, 0xe1, 0x7, 0x74, 0xdd, + 0xed, 0xd8, 0xe4, 0xcc, 0xf7, 0xaf, 0xf4, 0xbf, + 0xb4, 0xe4, 0xcc, + 0x99, 0x7d, 0x3d, 0x84, 0x81, 0x8b, 0x8b, 0xc6, + 0xe4, 0xc6, 0xe1, 0xe4, 0xe4, 0xbf, 0xbf, 0xb4, + 0x86, 0xf5, 0xc6, 0x9a, 0xe1, 0x40, 0xb, 0x8b, + 0xd8, 0x51, 0x91, 0xb8, 0x52, 0xac, 0xbe, 0xa, + 0x6d, 0x62, 0x6d, 0x24, 0x5e, 0x6d, 0xab, 0x8c, + 0xe9, 0xd5, 0xd5, 0x8f, 0x6e, 0x6e, 0xef, 0xe5, + 0xd5, 0xc2, 0xd2, 0xd2, 0x2f, 0x2f, 0xc5, 0x8f, + 0x19, 0xd7, 0xe5, 0x11, 0xd5, 0x4a, 0x4a, 0x63, + 0x19, 0x89, 0xd2, 0xa5, 0x19, 0xd2, 0x19, 0x19, + 0x19, 0xd5, 0xd5, 0xd5, 0x19, 0x63, 0x63, 0xd2, + 0x79, 0x67, 0x5, 0x41, 0x58, 0x4d, 0xe3, 0x82, + 0x62, 0xd1, 0x23, 0xd1, 0xa, 0xa, 0x62, 0xd3, + 0x67, 0x60, 0xb8, 0x4e, 0xe8, 0x7f, 0x2a, 0xb, + 0xb, 0x18, 0xa9, 0x48, 0x80, 0x2b, 0x80, 0x91, + 0x91, 0x80, 0x48, 0x91, 0x2c, 0x2c, 0x52, 0x1, + 0x52, 0x66, 0x61, 0x76, 0x78, 0x76, 0x76, 0xa, + 0x78, 0x76, 0x4d, 0x24, 0x3f, 0x4e, 0x91, 0xf, + 0x5f, 0x5f, 0x5f, 0xf, 0xb6, 0xf, 0xc, 0xc, + 0x5f, 0x5f, 0x33, 0x33, 0xc1, 0xb, 0x74, 0x74, + 0xba, 0xea, 0x80, 0xc, 0x3f, 0x1d, 0x9e, 0x65, + 0x17, 0x78, 0x76, 0x76, 0xf2, 0x37, 0x37, 0x82, + 0x61, 0x55, 0x52, 0x1f, 0x49, 0x1d, 0x60, 0xc9, + 0xe8, 0x77, 0x5d, 0x50, 0x2c, 0xab, 0x66, 0x76, + 0x78, 0x76, 0x62, 0xa, 0x29, 0xa, 0x16, 0x16, + 0xda, 0x87, 0x5, 0x37, 0xbe, 0x6d, 0x6d, 0x68, + 0x65, 0x55, 0x78, 0xa, 0x6d, 0x8a, 0x29, 0x62, + 0x6d, 0xa, 0xe3, 0xe3, 0x41, 0x67, 0x60, 0xc5, + 0x6e, 0x19, 0x4a, 0xef, 0xd5, 0x6e, 0x4a, 0xa5, + 0x42, 0xd2, 0xe9, 0xa5, 0xe, 0x79, 0xa5, 0x6e, + 0x6e, 0x19, 0x8f, 0x19, 0x6e, 0x1b, 0x6e, 0x8f, + 0x4a, 0x6e, 0xe9, 0xc5, 0xd5, 0xe, 0x5a, 0x8c, + 0x29, 0x3b, 0x5, 0x6d, 0x62, 0xd1, 0xd1, 0xd1, + 0x78, 0xf2, 0xe6, 0x61, 0x66, 0xa8, 0x3f, 0xb8, + 0x59, 0x8c, 0xb5, 0x24, 0x58, 0x30, 0xd4, 0xa9, + 0xfd, 0x8e, 0xe1, 0xcb, 0x99, 0xbd, 0xf3, 0xe4, + 0xbd, 0xdf, 0xc6, 0x9, 0x93, 0x32, 0xc4, 0x9f, + 0xfd, 0xb1, 0xc6, 0xf6, 0x7d, 0x7c, 0x51, 0x4e, + 0x49, 0x82, 0x4d, 0x29, 0x78, 0x6d, 0xa, 0x4d, + 0x6d, 0xe3, 0x8c, 0x24, 0x58, 0x30, 0x30, 0x8, + 0x2f, 0x67, 0x8a, 0x24, 0xe3, 0x6d, 0x62, 0x6d, + 0x4d, 0x6d, 0x58, 0x8c, 0x41, 0x68, 0x5, 0x8a, + 0xb5, 0x62, 0x29, 0xa, 0x78, 0x78, 0x6d, 0xe3, + 0xbe, 0x6d, 0x67, 0x6e, 0x28, 0x36, 0x9c, 0x6f, + 0x47, 0xde, 0xe4, 0x47, 0x25, 0x4b, 0xe4, 0x93, + 0x93, 0xcd, 0xbb, 0x97, 0xbf, 0xbb, 0xe2, 0xb4, + 0xb4, 0xf4, 0xaf, 0x97, 0x47, 0x7d, 0x7c, 0x9c, + 0x4, 0x93, 0xaf, 0xed, 0x9c, 0x12, 0x12, 0x12, + 0x97, 0xdf, 0xce, + 0x81, 0x2a, 0xd6, 0x18, 0xf6, 0x83, 0xd8, 0xce, + 0xb4, 0xc6, 0xbf, 0xbf, 0xbf, 0xc0, 0xe1, 0xb4, + 0xb4, 0x7b, 0xcf, 0x84, 0x4b, 0x1e, 0xd8, 0x81, + 0x1e, 0x27, 0x2a, 0x91, 0x94, 0xb5, 0x37, 0x37, + 0x76, 0xb5, 0x87, 0x55, 0x4d, 0x8a, 0xa6, 0x8, + 0x42, 0x19, 0xd5, 0x6e, 0x2f, 0xd2, 0xa5, 0x79, + 0x1b, 0x63, 0x19, 0x19, 0x1b, 0x89, 0x19, 0xd5, + 0xd2, 0xa5, 0xd5, 0x19, 0x19, 0x11, 0x6e, 0x63, + 0x63, 0x19, 0x63, 0x63, 0x19, 0x1b, 0x1b, 0x19, + 0x6e, 0x79, 0x1b, 0x67, 0x8, 0x79, 0xe9, 0x1b, + 0x6e, 0x89, 0x89, 0x42, 0x42, 0x30, 0x5, 0x8a, + 0xa, 0xd1, 0xd1, 0xd1, 0xd1, 0x62, 0x41, 0x58, + 0x2f, 0x73, 0x89, 0xe, 0xd5, 0x27, 0x27, 0x2c, + 0x2c, 0xdb, 0xa9, 0x2c, 0x91, 0x3e, 0x3e, 0x77, + 0x77, 0x77, 0x73, 0x67, 0xa8, 0xab, 0xac, 0xd3, + 0x66, 0xf2, 0x76, 0x76, 0x76, 0x76, 0xd1, 0xa, + 0x76, 0x78, 0x78, 0x6d, 0xab, 0x1d, 0xb6, 0xb6, + 0xb6, 0xb6, 0x5f, 0xc, 0xc, 0x5f, 0x56, 0x33, + 0x5f, 0xc, 0x3c, 0xaa, 0x56, 0xb, 0xcb, 0xbc, + 0x2b, 0xaa, 0x22, 0x7a, 0x91, 0xa8, 0xc3, 0x87, + 0x61, 0x5e, 0x37, 0x76, 0x76, 0x76, 0x76, 0x76, + 0x37, 0x37, 0x24, 0xad, 0x2f, 0x2f, 0x7a, 0x5b, + 0x2f, 0x2f, 0x2f, 0x1, 0xd3, 0xe3, 0x78, 0xa, + 0x37, 0x78, 0x76, 0x29, 0x6d, 0xac, 0x41, 0x3b, + 0x29, 0x29, 0x78, 0x29, 0x16, 0x16, 0x78, 0xa, + 0x29, 0x78, 0x62, 0xd1, 0xda, 0x67, 0x62, 0x1c, + 0x1c, 0x1c, 0x1c, 0xb5, 0x1c, 0x8, 0x8, 0x8, + 0x19, 0xd5, 0x4a, 0x19, 0x1b, 0x1b, 0x2, 0x1b, + 0x19, 0x79, 0x42, 0x79, 0x6e, 0x4a, 0x63, 0x1b, + 0x63, 0x19, 0x19, 0x19, 0x96, 0x42, 0x79, 0xd2, + 0x19, 0x6e, 0x1b, 0x19, 0x19, 0x63, 0x21, 0x1c, + 0x62, 0x8a, 0x8a, 0x62, 0xa, 0xa, 0xd1, 0x62, + 0x78, 0x78, 0xe3, 0x76, 0x82, 0x21, 0xe8, 0x91, + 0xa7, 0xbe, 0x82, 0x8c, 0x2f, 0xf0, 0xd4, 0x7c, + 0x4, 0x4, 0xbd, 0xc6, 0xf5, 0x93, 0xe4, 0xbf, + 0x8e, 0x6f, 0x1e, 0xd8, 0xfd, 0x4, 0xdd, 0xf5, + 0x97, 0x32, 0xe4, 0xce, 0x6f, 0x9c, 0x9f, 0xb, + 0x52, 0xab, 0xab, 0x82, 0x82, 0xe3, 0x68, 0x5, + 0x8a, 0x5, 0x67, 0xb3, 0xb5, 0x1c, 0x5, 0x58, + 0xd3, 0x24, 0x82, 0x82, 0x82, 0x58, 0xa4, 0x58, + 0xb5, 0x62, 0xe3, 0xe3, 0xe3, 0x6d, 0xb5, 0x4d, + 0x37, 0x4d, 0x58, 0xe3, 0x6d, 0x62, 0xda, 0xe3, + 0x65, 0x58, 0x5a, 0xe5, 0x3, 0x7, 0x81, 0xf3, + 0xd8, 0x7, 0xbf, 0xdd, 0x93, 0xe4, 0xb4, 0x12, + 0xbb, 0xbf, 0xbf, 0xaf, 0xbf, 0x95, 0xe2, 0xbf, + 0x95, 0xf4, 0xe2, 0xbf, 0xc0, 0xbf, 0xf3, 0x93, + 0x93, 0xf3, 0xb4, 0xaf, 0xc0, 0xaf, 0x9a, 0xaf, + 0xc0, 0xc0, 0xbf, + 0x1e, 0x25, 0xe8, 0x5c, 0x9c, 0x6c, 0x4, 0xc6, + 0x9c, 0x6f, 0xdd, 0xe4, 0x93, 0x47, 0x27, 0xd8, + 0xbd, 0x6f, 0x1e, 0x4b, 0x99, 0x6f, 0x32, 0xfd, + 0xe5, 0xc2, 0x60, 0xab, 0xac, 0x78, 0x78, 0xa, + 0x4d, 0xe3, 0x2f, 0xac, 0x1c, 0x30, 0xf1, 0xf1, + 0x63, 0x63, 0x79, 0xf1, 0x2f, 0x73, 0x42, 0x73, + 0x73, 0x63, 0x63, 0x19, 0x4a, 0xd5, 0x19, 0x4a, + 0x19, 0x63, 0x1b, 0x2f, 0xf1, 0x63, 0x6e, 0x19, + 0x6e, 0x19, 0x19, 0x63, 0x19, 0x63, 0x63, 0x79, + 0xd2, 0x63, 0x1b, 0x8, 0x58, 0xa0, 0x63, 0x19, + 0xa5, 0x89, 0x63, 0x63, 0xd2, 0x79, 0x30, 0x41, + 0x62, 0xa, 0x23, 0xd1, 0x0, 0xa, 0x62, 0x41, + 0x58, 0x30, 0x73, 0x79, 0x5d, 0xe9, 0x77, 0x50, + 0x2c, 0x5d, 0x3, 0xd5, 0x6e, 0xef, 0xef, 0xd5, + 0x5d, 0x5a, 0x30, 0x1, 0x66, 0xd3, 0xd3, 0x55, + 0x37, 0x76, 0xd1, 0x76, 0x76, 0x23, 0x23, 0xf2, + 0xf2, 0x76, 0x76, 0x4d, 0x66, 0xb6, 0xb6, 0x1d, + 0xb6, 0xb7, 0xaa, 0x3c, 0x5f, 0x5f, 0x56, 0xf, + 0xc, 0xc, 0xc, 0x5f, 0x56, 0x2b, 0xa2, 0xcb, + 0x18, 0x5c, 0x38, 0x2a, 0x91, 0x1d, 0x65, 0xa7, + 0x65, 0x55, 0xbe, 0xbe, 0x66, 0x4d, 0x76, 0xa, + 0xa, 0x76, 0x76, 0x41, 0xf1, 0x1, 0x2f, 0xf1, + 0x2f, 0xab, 0xab, 0x2f, 0xe3, 0xd3, 0x4d, 0x76, + 0xd1, 0x76, 0x76, 0x62, 0x29, 0xa, 0x76, 0x29, + 0x78, 0x6d, 0x29, 0x5, 0x45, 0x45, 0x16, 0x16, + 0x16, 0xa, 0x23, 0xa, 0x62, 0xd3, 0x62, 0x41, + 0x8c, 0x8c, 0x8c, 0x58, 0x5b, 0x63, 0x63, 0x6e, + 0x19, 0x19, 0xe, 0xa5, 0x6e, 0x79, 0x79, 0xa5, + 0x19, 0x19, 0x4a, 0x4a, 0x4a, 0x4a, 0xd5, 0x4a, + 0x19, 0x63, 0xc5, 0xa5, 0xd2, 0x1b, 0xa5, 0xa5, + 0xd5, 0x19, 0x4a, 0xd5, 0x6e, 0xd2, 0x67, 0x1c, + 0xa, 0x62, 0xa, 0x62, 0x62, 0xd3, 0xbe, 0x6d, + 0xe3, 0x1, 0x17, 0x66, 0x82, 0xc3, 0xb8, 0x1d, + 0x66, 0x61, 0x61, 0x66, 0x67, 0x35, 0x1e, 0xc6, + 0x81, 0xfa, 0xb4, 0xb4, 0xb4, 0xb4, 0xf4, 0x7, + 0x57, 0xe4, 0xe4, 0xe1, 0x81, 0xc0, 0xb4, 0xbf, + 0xe4, 0xc6, 0xe4, 0xb4, 0xb0, 0x57, 0x74, 0x48, + 0x1d, 0x52, 0x87, 0x94, 0x4d, 0x87, 0xa4, 0x42, + 0x8, 0x30, 0xb3, 0xe3, 0xe3, 0xe3, 0x24, 0x82, + 0x55, 0x6d, 0x67, 0x5, 0x3b, 0x45, 0x30, 0x30, + 0x3b, 0x41, 0xe3, 0x78, 0x78, 0xa, 0xda, 0x6d, + 0x78, 0x4d, 0x67, 0x8c, 0xe3, 0xb5, 0xb3, 0xa4, + 0x64, 0x64, 0x4f, 0x25, 0x18, 0xf6, 0xb4, 0xb4, + 0xcc, 0xbf, 0xb4, 0xbf, 0xbf, 0xb0, 0xe4, 0xf4, + 0xbf, 0xbf, 0xe2, 0xe2, 0xbf, 0xe2, 0xf4, 0x44, + 0xe2, 0xe2, 0xf4, 0xb4, 0xe2, 0xf4, 0x9a, 0x7, + 0x4b, 0x4b, 0x75, 0xe1, 0xf4, 0xf4, 0xcc, 0xcc, + 0xbf, 0xf4, 0xe2, + 0xde, 0x6f, 0x99, 0x99, 0x9c, 0x4, 0x12, 0xb4, + 0x81, 0xbd, 0xd8, 0x7, 0xbd, 0x32, 0x90, 0x86, + 0x12, 0x93, 0xb4, 0xed, 0x9c, 0x8e, 0xd8, 0x9d, + 0x3, 0xd2, 0x50, 0x52, 0x82, 0x6d, 0xa, 0xa, + 0xa, 0x62, 0xa, 0x62, 0xe3, 0x41, 0x49, 0x1, + 0x79, 0x63, 0xd2, 0xa5, 0x42, 0x1b, 0x4a, 0x2f, + 0x89, 0x4a, 0x4a, 0x4a, 0xe, 0x4a, 0xd5, 0x5d, + 0x8f, 0xd7, 0x6e, 0x6e, 0x1b, 0x63, 0x19, 0x4a, + 0x19, 0x4a, 0x19, 0xe9, 0xd2, 0x6e, 0x6e, 0xa5, + 0x79, 0x19, 0xd5, 0x89, 0x89, 0x89, 0x63, 0x63, + 0x2f, 0x42, 0x63, 0x2f, 0x2f, 0xf1, 0xf1, 0x41, + 0x1c, 0xa, 0x16, 0x23, 0x23, 0x23, 0xa, 0x1c, + 0xe3, 0xb5, 0x30, 0x79, 0x8c, 0xe8, 0x9d, 0x35, + 0xfb, 0x51, 0x3, 0x3, 0x3a, 0x3a, 0x5d, 0x21, + 0x1, 0xab, 0xd3, 0x5e, 0xa, 0x61, 0x6d, 0x24, + 0x5e, 0x4d, 0xd1, 0xd1, 0x23, 0x76, 0x0, 0x23, + 0x76, 0x76, 0x78, 0x61, 0x66, 0xb6, 0x1f, 0xc1, + 0xc, 0x5f, 0xaa, 0xaa, 0xc, 0xc, 0xc, 0x5f, + 0x5f, 0x5f, 0xc, 0x80, 0xd, 0xd, 0x5c, 0xcb, + 0xcb, 0xdc, 0x48, 0xc1, 0x1d, 0xf, 0x66, 0x66, + 0x1f, 0x17, 0x65, 0x1f, 0x1f, 0x37, 0x76, 0x37, + 0x61, 0x37, 0x78, 0x82, 0x66, 0x66, 0xab, 0x2f, + 0xd2, 0x8c, 0x8c, 0x30, 0x58, 0x78, 0x76, 0x23, + 0x76, 0x23, 0x23, 0x78, 0x78, 0x78, 0xa, 0x16, + 0x87, 0x3b, 0x16, 0x45, 0x45, 0x45, 0x5, 0x5, + 0xda, 0x29, 0xa, 0x62, 0x62, 0xb5, 0xe3, 0xb5, + 0x24, 0x8c, 0x8c, 0xb3, 0x96, 0xe, 0xef, 0xd5, + 0x19, 0xd2, 0x42, 0xa5, 0x6e, 0x1b, 0xe7, 0xe9, + 0xd5, 0x4a, 0xd5, 0xe5, 0xef, 0xef, 0x8f, 0x5d, + 0xc5, 0x96, 0x73, 0x2f, 0xd5, 0x6e, 0x19, 0x1b, + 0x1b, 0x4a, 0xd5, 0x4a, 0x6e, 0x42, 0x67, 0x62, + 0x62, 0x8a, 0x62, 0x62, 0x62, 0xac, 0xac, 0x61, + 0xbe, 0x52, 0xb6, 0x1f, 0x52, 0xc3, 0x52, 0xb6, + 0xab, 0x24, 0x82, 0x29, 0x24, 0x77, 0xd8, 0xe1, + 0x4b, 0x99, 0xe4, 0x7, 0x57, 0xb4, 0x4b, 0xf6, + 0x81, 0xb4, 0xf4, 0x4b, 0x4b, 0xc6, 0xbf, 0xb4, + 0x75, 0xdf, 0x90, 0x84, 0x57, 0xc6, 0xf6, 0x7e, + 0x60, 0xe8, 0xe8, 0x1f, 0xbe, 0xbe, 0x8c, 0x8c, + 0x1, 0x1, 0x87, 0x82, 0xac, 0x24, 0xb3, 0x58, + 0x6d, 0x1c, 0x67, 0x58, 0xb5, 0x1c, 0x87, 0x8c, + 0xd3, 0x5e, 0x82, 0x82, 0x29, 0xda, 0x30, 0x5, + 0x29, 0xd1, 0x6d, 0x5e, 0x78, 0x4d, 0x87, 0xa8, + 0x64, 0x91, 0x40, 0x9c, 0x7d, 0xb4, 0xbf, 0xe4, + 0xc6, 0xdf, 0xf5, 0xde, 0xbd, 0x7, 0x7, 0x81, + 0xe4, 0xe2, 0xbb, 0xb4, 0xbf, 0xbf, 0xf4, 0xbf, + 0x95, 0x20, 0xbf, 0xbf, 0xb4, 0x7, 0x74, 0xa2, + 0xca, 0xca, 0xc6, 0xf7, 0x12, 0xaf, 0xf7, 0xf7, + 0xaf, 0xbb, 0xbf, + 0x4b, 0xf8, 0x9, 0xe4, 0xbf, 0xc6, 0x81, 0x75, + 0xb4, 0xb4, 0xe1, 0x9a, 0xb4, 0xbf, 0xbf, 0x8d, + 0x9a, 0x4b, 0xe1, 0xbc, 0x84, 0x75, 0xdb, 0xdb, + 0x77, 0xd5, 0x5d, 0x1d, 0x65, 0x68, 0x58, 0x6d, + 0x3b, 0x16, 0xa, 0xa, 0xe3, 0xa, 0x66, 0xab, + 0x2c, 0xd5, 0xef, 0xd5, 0x1b, 0x6e, 0x19, 0x6e, + 0xd2, 0x6b, 0x6b, 0x6e, 0xa5, 0x11, 0xef, 0x5d, + 0x5d, 0xef, 0x8f, 0x19, 0x6e, 0x6e, 0x19, 0xd2, + 0xe9, 0x63, 0xd2, 0x42, 0x2f, 0xd2, 0x19, 0x77, + 0x96, 0x6e, 0x4a, 0x4a, 0x19, 0x63, 0x89, 0xa5, + 0x2f, 0xf1, 0xd2, 0x73, 0x67, 0x1b, 0x6e, 0xf1, + 0x8a, 0xd1, 0x16, 0x29, 0xa, 0xd1, 0xa, 0xa, + 0x78, 0xe3, 0x67, 0x67, 0x8c, 0x77, 0x3, 0x3, + 0xe8, 0x4f, 0xe8, 0x5d, 0x49, 0x91, 0x52, 0x94, + 0x5e, 0x76, 0xac, 0x76, 0xd1, 0xa, 0xe3, 0x87, + 0xd3, 0x37, 0xa, 0x76, 0x76, 0x76, 0x23, 0x23, + 0x76, 0xf2, 0x37, 0x65, 0x17, 0x17, 0x9e, 0x3f, + 0xc, 0xc, 0x5f, 0xf, 0xf, 0x5f, 0xc, 0x5f, + 0xf, 0x56, 0x33, 0xa2, 0xa2, 0xdc, 0x33, 0x38, + 0xdc, 0x2b, 0xc, 0x5f, 0xb7, 0xb6, 0x94, 0x1d, + 0xb7, 0x37, 0x55, 0x60, 0xa8, 0x66, 0xf2, 0x37, + 0x61, 0x66, 0xac, 0x4d, 0x1, 0x82, 0x87, 0xf1, + 0x2f, 0x6d, 0x76, 0xd1, 0xd1, 0x23, 0x0, 0x0, + 0x23, 0xd1, 0x23, 0x29, 0xda, 0x3b, 0x16, 0x3b, + 0xa0, 0x29, 0x29, 0x3b, 0x68, 0x5, 0xbe, 0x6d, + 0x87, 0x4d, 0xa, 0x6d, 0xda, 0x62, 0x8a, 0x78, + 0x41, 0xe3, 0x24, 0xc3, 0x89, 0xc2, 0xd2, 0xa5, + 0x6e, 0x1b, 0x1b, 0x6e, 0x4a, 0x19, 0x89, 0x73, + 0x63, 0x63, 0x77, 0xc5, 0x1b, 0x6e, 0x2f, 0xe9, + 0x1b, 0x1b, 0x1b, 0x63, 0x63, 0x4a, 0x63, 0x89, + 0x96, 0x19, 0x4a, 0x4a, 0x63, 0x89, 0x8a, 0x1c, + 0x8a, 0x30, 0x8a, 0x62, 0x6d, 0x1c, 0xa, 0x76, + 0x76, 0x61, 0x66, 0x66, 0x94, 0xc3, 0xc9, 0x60, + 0x49, 0x2f, 0x58, 0x82, 0x87, 0xa5, 0x6b, 0x9d, + 0x7c, 0x6b, 0xde, 0xc6, 0x1e, 0x97, 0xe4, 0x81, + 0xf3, 0xdd, 0xe4, 0xc6, 0xf5, 0x93, 0xaf, 0xe1, + 0xc8, 0x83, 0xf3, 0x81, 0x69, 0xfd, 0x70, 0x83, + 0xe5, 0x27, 0xa9, 0x2c, 0xab, 0xac, 0xe3, 0xe3, + 0x66, 0xab, 0x87, 0x82, 0x82, 0xc3, 0xa0, 0xa4, + 0x8a, 0x1c, 0x58, 0xd3, 0xac, 0x6d, 0x29, 0x6d, + 0x76, 0x4d, 0xda, 0x29, 0xda, 0x8a, 0x30, 0x58, + 0x6d, 0x62, 0x62, 0x62, 0x78, 0xb5, 0x8c, 0x96, + 0xd9, 0x83, 0x81, 0x9c, 0x4, 0xb4, 0xaf, 0x97, + 0x4, 0xfd, 0xfd, 0x4, 0x6f, 0xe1, 0xf8, 0x97, + 0x97, 0xf4, 0xf4, 0xc0, 0x93, 0xbf, 0xbf, 0x97, + 0xe2, 0xbf, 0xb0, 0x97, 0x93, 0x9a, 0xc6, 0x90, + 0x4, 0x26, 0xaf, 0xc0, 0x93, 0xc0, 0x95, 0xc0, + 0xf3, 0xf3, 0x9a, + 0x39, 0xf5, 0x71, 0xbc, 0xe1, 0x81, 0x39, 0xc6, + 0xb4, 0xc0, 0x12, 0xf9, 0xdf, 0xbd, 0xb4, 0x57, + 0x90, 0x39, 0x9f, 0xa2, 0x9d, 0xe5, 0xd9, 0x1b, + 0xd5, 0xc2, 0x2f, 0xd3, 0xb5, 0xbe, 0x66, 0x5e, + 0xb5, 0x6d, 0xa, 0x1c, 0x8a, 0x58, 0x1c, 0x29, + 0x5, 0x63, 0xe, 0x79, 0xa5, 0x1b, 0x96, 0x2f, + 0x79, 0xc2, 0x19, 0x19, 0x4a, 0x8f, 0xd5, 0x1b, + 0x42, 0x19, 0xe7, 0x2f, 0x2f, 0x73, 0x1b, 0xd2, + 0xd2, 0xe, 0x19, 0x1b, 0x1b, 0x19, 0x4a, 0x1b, + 0x30, 0x1b, 0x19, 0xa5, 0x2f, 0x79, 0x1b, 0x63, + 0x63, 0x1b, 0x19, 0x63, 0x89, 0x63, 0x79, 0x67, + 0xd3, 0xd1, 0x23, 0x23, 0x0, 0xd1, 0xd1, 0x76, + 0x76, 0xe3, 0xa4, 0x45, 0x30, 0x5b, 0xa5, 0xd2, + 0x8c, 0xab, 0x8c, 0x8c, 0xd3, 0x66, 0xab, 0x24, + 0x6d, 0x4d, 0xac, 0x76, 0x23, 0x23, 0xd1, 0x78, + 0xd1, 0x76, 0x76, 0x0, 0x23, 0x0, 0x23, 0xd1, + 0x23, 0x76, 0x37, 0xab, 0x55, 0x66, 0xb6, 0xf, + 0x5f, 0xc, 0xc, 0x5f, 0x56, 0x5f, 0xc, 0x80, + 0xc1, 0x92, 0x92, 0xb, 0x2b, 0xc, 0x92, 0x92, + 0x3c, 0x80, 0x2b, 0x80, 0x33, 0xb7, 0x52, 0xc3, + 0x9e, 0xab, 0x55, 0xab, 0x52, 0x66, 0x4d, 0x78, + 0xf2, 0x37, 0x76, 0x82, 0x87, 0x3b, 0xda, 0x87, + 0xb5, 0xd1, 0x23, 0x23, 0x0, 0x0, 0x23, 0x0, + 0x0, 0x23, 0x23, 0x3b, 0x3b, 0x5, 0x3b, 0xda, + 0xda, 0x8a, 0x29, 0x29, 0x16, 0x76, 0xd1, 0xa, + 0x62, 0x23, 0xa, 0x8a, 0x58, 0x62, 0xe3, 0x62, + 0x41, 0xe3, 0x58, 0x2f, 0xd5, 0x19, 0x79, 0x63, + 0x4a, 0x63, 0x63, 0x6e, 0x19, 0x19, 0x63, 0x2f, + 0x2, 0x1b, 0x89, 0x5a, 0x63, 0xe, 0xd2, 0x96, + 0x63, 0x63, 0x19, 0x19, 0x63, 0x6e, 0x63, 0x2f, + 0xf1, 0x63, 0x19, 0x19, 0x6e, 0xf1, 0x1c, 0x62, + 0xa, 0x41, 0xb5, 0x62, 0xb5, 0x58, 0xe3, 0x4d, + 0xd3, 0xe3, 0x76, 0x78, 0xbe, 0xa5, 0x7c, 0x2a, + 0x49, 0x1, 0x82, 0xb5, 0x8c, 0x73, 0x6e, 0x27, + 0x27, 0x47, 0xde, 0x81, 0x32, 0x93, 0xbf, 0xaf, + 0xfd, 0x1e, 0xe4, 0xbd, 0x9d, 0xfd, 0xe4, 0x81, + 0x8e, 0x93, 0xe4, 0xdd, 0x9c, 0x26, 0xb9, 0xce, + 0x3a, 0x98, 0xb, 0x91, 0x3f, 0xa8, 0xa8, 0xc3, + 0xb5, 0x82, 0x55, 0xb5, 0x4d, 0x6d, 0x87, 0x58, + 0xd3, 0x24, 0x82, 0xe3, 0xe3, 0x58, 0x58, 0xda, + 0x62, 0x29, 0xb5, 0xb5, 0x62, 0x76, 0x6d, 0x4d, + 0x78, 0x6d, 0x82, 0x4d, 0xe3, 0xc3, 0xef, 0x8e, + 0xca, 0x90, 0x81, 0xb1, 0xf3, 0xe1, 0x75, 0x6f, + 0x97, 0xe1, 0x75, 0x4, 0x6f, 0xb4, 0xbf, 0xbb, + 0xee, 0xbf, 0xbf, 0x95, 0xbf, 0xbb, 0x9a, 0xaf, + 0xb4, 0xe2, 0xf4, 0xbf, 0xe2, 0xb4, 0xf9, 0xf7, + 0xaf, 0xbf, 0xf4, 0xe1, 0xc6, 0xaf, 0xf4, 0xe1, + 0xc6, 0x4b, 0xcc, + 0x40, 0x4, 0x6f, 0x81, 0xce, 0x9c, 0x97, 0xe4, + 0x93, 0x4, 0x93, 0x2e, 0xfd, 0x4, 0x1e, 0x53, + 0x8b, 0x6c, 0x47, 0x47, 0xe5, 0xd7, 0xd5, 0x19, + 0x42, 0x79, 0x8c, 0x6d, 0x62, 0x78, 0x78, 0x76, + 0xa, 0x16, 0x29, 0xe3, 0x67, 0x30, 0x8, 0x41, + 0x67, 0x79, 0x79, 0x2f, 0x2f, 0x79, 0x8, 0xb3, + 0xf1, 0x19, 0x6e, 0x4a, 0x19, 0x19, 0x19, 0x63, + 0x63, 0x63, 0x63, 0x67, 0x58, 0xf1, 0xe9, 0xf1, + 0x2f, 0x6e, 0x19, 0x19, 0x19, 0x6e, 0x19, 0x19, + 0x79, 0xf1, 0xd2, 0x8, 0x30, 0x63, 0x19, 0x63, + 0x63, 0x4a, 0x4a, 0x19, 0x6e, 0xa5, 0x30, 0x58, + 0x1c, 0xd1, 0x0, 0x23, 0x0, 0x23, 0xd1, 0x23, + 0xd1, 0xa, 0xb5, 0xe3, 0x29, 0xd3, 0x8c, 0xb3, + 0x67, 0x8c, 0x2f, 0x58, 0xd3, 0xd3, 0xe3, 0xb5, + 0x78, 0x76, 0x76, 0x23, 0x23, 0x23, 0xd1, 0xd1, + 0x23, 0x0, 0x0, 0x23, 0x0, 0x23, 0xd1, 0x76, + 0x23, 0x76, 0x76, 0x66, 0x17, 0xb6, 0xf, 0xf, + 0xb7, 0x1f, 0xc, 0x48, 0xb, 0xaa, 0x5f, 0x3c, + 0x2b, 0x5f, 0xc, 0x5f, 0xc, 0x92, 0x2b, 0xdc, + 0xd0, 0xd0, 0xd0, 0xa2, 0x3c, 0x52, 0xb6, 0x1f, + 0x1f, 0x1f, 0x52, 0x52, 0x65, 0x65, 0xab, 0x8a, + 0xbe, 0x78, 0x78, 0xa, 0x29, 0xa, 0x4d, 0x4d, + 0x23, 0x23, 0x23, 0x23, 0xd1, 0x0, 0x23, 0x23, + 0x23, 0x23, 0x16, 0x16, 0x24, 0x16, 0x29, 0x82, + 0x6d, 0x82, 0xbe, 0x82, 0x82, 0x62, 0x23, 0xd1, + 0x29, 0x29, 0xa, 0x62, 0xe3, 0x76, 0xa, 0xd3, + 0x61, 0x4d, 0x58, 0xd2, 0xd5, 0x6e, 0x89, 0xd5, + 0x19, 0x79, 0x2f, 0xa5, 0xe7, 0xd2, 0x5d, 0x50, + 0xa5, 0x1b, 0x89, 0x6e, 0xd5, 0x4a, 0x1b, 0x96, + 0x63, 0x19, 0x63, 0x5d, 0x60, 0x89, 0x6e, 0xc5, + 0x19, 0x19, 0x1b, 0x19, 0x63, 0xf1, 0x1c, 0x62, + 0x62, 0x62, 0x62, 0x78, 0xac, 0x61, 0x61, 0x66, + 0xb6, 0xb6, 0x94, 0xac, 0x65, 0x4e, 0x51, 0x48, + 0xf, 0x94, 0xac, 0x66, 0x8c, 0xc9, 0xd4, 0x7d, + 0x1e, 0xde, 0xe4, 0x4b, 0x39, 0xc6, 0xb4, 0x9a, + 0x74, 0x8b, 0xed, 0xf4, 0xe1, 0xb4, 0x81, 0xdf, + 0xe4, 0xbf, 0xbf, 0xbf, 0x90, 0x90, 0xe1, 0xe4, + 0x9f, 0xdb, 0x18, 0x88, 0x51, 0xeb, 0x7e, 0xd4, + 0x87, 0x94, 0x94, 0xac, 0x4d, 0xac, 0x4d, 0x37, + 0xac, 0x37, 0x82, 0x82, 0xb3, 0x67, 0xc7, 0x30, + 0xb5, 0x4d, 0x82, 0x4d, 0x78, 0x4d, 0x76, 0x78, + 0x76, 0x4d, 0x4d, 0x55, 0x1, 0x60, 0xf6, 0x70, + 0xb2, 0x81, 0x85, 0x8d, 0xf4, 0xe1, 0xc6, 0xc6, + 0xe4, 0xb4, 0xbf, 0xf3, 0xf5, 0xe4, 0xb4, 0xbf, + 0xbf, 0xbf, 0x75, 0x9a, 0xe2, 0x44, 0xf4, 0xf4, + 0xf4, 0xbb, 0xf4, 0x44, 0xf4, 0xf4, 0xcd, 0x9a, + 0x9a, 0xf4, 0xe2, 0xb0, 0xaf, 0xbf, 0xf4, 0x20, + 0xf7, 0xaf, 0xaf, + 0xd8, 0xf3, 0xc0, 0x81, 0xe4, 0xf3, 0xf3, 0xe4, + 0x81, 0x6f, 0x8e, 0x57, 0x9f, 0x1e, 0x83, 0x9f, + 0xd8, 0x7b, 0x32, 0x99, 0x8f, 0x4a, 0x19, 0xe7, + 0x8c, 0x5, 0x8c, 0x8c, 0xd3, 0x78, 0xa, 0x23, + 0xa, 0xa, 0x62, 0x29, 0x58, 0x41, 0x58, 0xd3, + 0x8c, 0x2f, 0x1b, 0x42, 0x42, 0x1b, 0x2f, 0x58, + 0x42, 0x19, 0x77, 0xe, 0x19, 0x4a, 0x4a, 0xd5, + 0xd2, 0xe9, 0x63, 0x89, 0x63, 0x63, 0x79, 0x67, + 0xa0, 0x63, 0x63, 0x6e, 0xd2, 0xd2, 0x19, 0x19, + 0xe9, 0xd2, 0xf0, 0x73, 0x89, 0x19, 0xd7, 0xa5, + 0x1b, 0x6e, 0xef, 0x19, 0xf1, 0x1, 0x87, 0xd3, + 0x1c, 0xd3, 0xa, 0xa, 0xa, 0x23, 0x23, 0x34, + 0xd1, 0xd1, 0x78, 0xd1, 0x62, 0x4d, 0x82, 0x68, + 0x30, 0x67, 0x2f, 0x2f, 0xa, 0x78, 0x78, 0x78, + 0x76, 0x76, 0x23, 0x76, 0x23, 0x76, 0x76, 0x23, + 0x0, 0x23, 0x23, 0x0, 0x23, 0x23, 0x34, 0x23, + 0x76, 0x76, 0x61, 0x17, 0x61, 0x5f, 0x5f, 0x33, + 0x33, 0x56, 0xaa, 0x80, 0x2b, 0x92, 0x1f, 0xf, + 0xc, 0x3c, 0xc, 0xaa, 0x33, 0x80, 0x2b, 0xa2, + 0xa2, 0x8b, 0xdc, 0xea, 0x91, 0xf, 0x1f, 0x17, + 0x17, 0xb6, 0xf, 0x9e, 0x38, 0x9e, 0x60, 0x22, + 0xa8, 0x4d, 0x78, 0xa, 0xa, 0x62, 0x76, 0x76, + 0x23, 0x0, 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, + 0x23, 0x16, 0x76, 0x62, 0x37, 0xd1, 0x4d, 0xbe, + 0x82, 0x37, 0x8c, 0x87, 0x87, 0x29, 0x23, 0xa, + 0xa, 0x29, 0xa, 0x62, 0x6d, 0xb5, 0xe3, 0x61, + 0xa, 0x6d, 0xad, 0xef, 0xef, 0xd5, 0x63, 0x6e, + 0x27, 0xe9, 0x79, 0xf1, 0xc5, 0x60, 0x2f, 0xd2, + 0x6e, 0x1b, 0x1b, 0x8f, 0xd7, 0xd7, 0xd5, 0x1b, + 0xa5, 0x19, 0xc2, 0xc5, 0xe7, 0x1b, 0x19, 0xd7, + 0xe5, 0xd5, 0xc2, 0x19, 0xf1, 0x2f, 0x1c, 0x29, + 0x62, 0xa, 0xa, 0x78, 0x5e, 0x37, 0x37, 0x66, + 0xb6, 0xb6, 0xb6, 0x61, 0x65, 0x49, 0x91, 0x91, + 0x1d, 0x94, 0x4d, 0x6d, 0xda, 0xad, 0xd4, 0x27, + 0x1e, 0xd8, 0xc6, 0xe4, 0x90, 0x9f, 0xbf, 0xb4, + 0xe1, 0x81, 0xe4, 0xb4, 0x95, 0xbf, 0xbf, 0xb4, + 0xdd, 0xf4, 0xb4, 0xf4, 0xc6, 0x9f, 0xe1, 0xb4, + 0xe1, 0x81, 0xc6, 0xc6, 0x8b, 0x9f, 0x88, 0xeb, + 0xa8, 0x1f, 0x1f, 0x65, 0x4d, 0x6d, 0x4d, 0x4d, + 0x78, 0xa, 0x76, 0x29, 0x58, 0xc3, 0x1, 0x87, + 0xe3, 0x4d, 0xac, 0xac, 0x4d, 0x4d, 0xb5, 0xac, + 0x29, 0x37, 0xbe, 0x5e, 0x24, 0x59, 0x18, 0x75, + 0xbf, 0xe1, 0x7, 0xc6, 0xe4, 0xb4, 0xbb, 0xf3, + 0xdd, 0xe4, 0xe4, 0x93, 0x93, 0xaf, 0xbf, 0xe2, + 0xbf, 0xf4, 0xf4, 0xbb, 0xf4, 0x95, 0xe2, 0xbf, + 0xf4, 0xe2, 0xf4, 0xbf, 0xf4, 0xf4, 0xbf, 0x75, + 0x9f, 0xcc, 0xbf, 0xbf, 0x12, 0x12, 0xcd, 0xaf, + 0x12, 0x12, 0xbf, + 0xbf, 0xbb, 0xbf, 0x4b, 0xf8, 0xe4, 0xf4, 0x75, + 0x8b, 0xdf, 0xe4, 0xb4, 0xce, 0xc6, 0x9c, 0x81, + 0xe4, 0xde, 0x9b, 0x27, 0xc7, 0x7a, 0x8c, 0x52, + 0xd3, 0x5e, 0x55, 0x52, 0x8c, 0xd3, 0x58, 0x29, + 0x8a, 0x41, 0xa, 0xa, 0x78, 0xa, 0xe3, 0x5e, + 0x52, 0x59, 0x60, 0xe8, 0xd9, 0xd5, 0xc5, 0x89, + 0x1b, 0x6e, 0xe9, 0x1b, 0xa5, 0x77, 0xc5, 0x5d, + 0xef, 0xe5, 0xef, 0x6e, 0x4a, 0xd5, 0x19, 0x63, + 0xf1, 0x2f, 0xa5, 0x79, 0x2d, 0x1b, 0xc5, 0x19, + 0xe, 0xe, 0xd2, 0x1b, 0x6e, 0x6e, 0x8f, 0x19, + 0x6e, 0xa5, 0xa5, 0xc7, 0x2f, 0x65, 0x6d, 0x6d, + 0x1c, 0x8c, 0x41, 0xa, 0xd1, 0xd1, 0xd1, 0xd1, + 0x0, 0x23, 0x23, 0x23, 0x23, 0x76, 0x78, 0xe3, + 0x82, 0xab, 0xab, 0x58, 0x6d, 0x29, 0x76, 0x76, + 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, 0x76, 0x76, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x78, 0x37, 0xf2, + 0x4d, 0x65, 0x17, 0x17, 0x17, 0xf, 0x92, 0x92, + 0x56, 0x56, 0x5f, 0x92, 0xc, 0x5f, 0x5f, 0x92, + 0x3c, 0x3c, 0xc, 0x48, 0xdb, 0xcb, 0xba, 0xba, + 0xbc, 0xa2, 0x2b, 0x2b, 0x3c, 0x1d, 0x1d, 0xf, + 0x65, 0xbe, 0x1f, 0xb7, 0x9e, 0x9e, 0xa8, 0x1d, + 0x52, 0xbe, 0x4d, 0xbe, 0xbe, 0x6d, 0x29, 0xa, + 0x34, 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, 0xa, + 0xa, 0x78, 0x4d, 0x6d, 0x29, 0x16, 0x3b, 0xda, + 0x4d, 0x4d, 0x4d, 0xbe, 0xf2, 0xa, 0x23, 0x76, + 0x76, 0x4d, 0x62, 0x58, 0xe3, 0x62, 0x78, 0x62, + 0x62, 0x1c, 0x2f, 0xe9, 0x77, 0xa5, 0x6e, 0xc2, + 0xe, 0x6e, 0x19, 0x4a, 0x6e, 0x6e, 0x63, 0x6e, + 0xe, 0x67, 0xf1, 0xe, 0xe9, 0xc5, 0x19, 0xe, + 0xd2, 0x63, 0x63, 0x6e, 0xd5, 0x19, 0x4a, 0xd5, + 0xd5, 0x6e, 0xd2, 0x2f, 0x8c, 0x6d, 0xa, 0x62, + 0x29, 0x6d, 0xb5, 0x58, 0x41, 0x78, 0xf2, 0x37, + 0x66, 0x61, 0x37, 0x61, 0x4d, 0x87, 0x38, 0x7e, + 0x4e, 0xd3, 0xb5, 0xda, 0x3b, 0x8c, 0xa6, 0x6e, + 0x27, 0x2a, 0x9d, 0xe4, 0x97, 0x32, 0xc6, 0xc6, + 0xf5, 0x32, 0xb4, 0xb4, 0xed, 0x1e, 0xe1, 0xc0, + 0x97, 0x9d, 0xdf, 0xe4, 0x32, 0x93, 0xe4, 0xc6, + 0x8e, 0xfd, 0x70, 0xde, 0x47, 0x3e, 0x48, 0x91, + 0x60, 0x49, 0x52, 0x66, 0x24, 0xd3, 0x4d, 0xa, + 0x16, 0x29, 0x62, 0xd1, 0x62, 0x76, 0x37, 0x37, + 0x78, 0x37, 0x37, 0x78, 0x29, 0x82, 0xd3, 0xe3, + 0xb5, 0xe3, 0xbe, 0x82, 0x67, 0x59, 0xc9, 0x6b, + 0x4, 0xe4, 0xb4, 0x97, 0x9c, 0xbf, 0x8d, 0x93, + 0x4, 0x1e, 0x7c, 0x3, 0x4, 0xbf, 0xbf, 0x4, + 0x97, 0xbb, 0xaf, 0x93, 0x93, 0xbf, 0xbb, 0x93, + 0xbf, 0x95, 0xe2, 0x8e, 0xbf, 0xe2, 0xbf, 0xbd, + 0x9c, 0x12, 0xaf, 0x12, 0x97, 0x93, 0xdf, 0xed, + 0x4, 0xf3, 0xbb, + 0xbf, 0xe4, 0xe4, 0xe4, 0x75, 0xde, 0xde, 0xe4, + 0x81, 0x93, 0xc0, 0xb0, 0xc6, 0x93, 0x97, 0x7b, + 0x6c, 0xef, 0xd7, 0xd5, 0x2f, 0x1, 0x87, 0x1c, + 0x82, 0xe3, 0x1c, 0x24, 0xd3, 0xd3, 0xb5, 0xa, + 0x8c, 0x24, 0xb5, 0xda, 0x1c, 0x78, 0x62, 0x6d, + 0xb5, 0x67, 0x64, 0xf1, 0x2f, 0x2f, 0xd2, 0x63, + 0x63, 0x79, 0x1b, 0x63, 0x63, 0x19, 0x1b, 0x42, + 0x6e, 0xef, 0x5d, 0xd2, 0x4a, 0x79, 0x77, 0x63, + 0xd2, 0x79, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x1b, + 0x63, 0x6e, 0x79, 0xf1, 0xd2, 0x2f, 0x7a, 0x63, + 0x63, 0x19, 0x63, 0x42, 0x89, 0x89, 0x58, 0x8a, + 0x8a, 0x6d, 0xa, 0x62, 0xd1, 0x23, 0x23, 0x23, + 0x23, 0xd1, 0x23, 0xd1, 0x23, 0x23, 0x23, 0xd1, + 0xd1, 0xa, 0x62, 0x76, 0xd1, 0x76, 0x76, 0x23, + 0x23, 0x23, 0x0, 0x0, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x0, 0xd1, 0x78, 0x4d, 0x87, + 0xad, 0x9e, 0x1d, 0xf, 0x17, 0x17, 0xb6, 0xf, + 0xb6, 0x5f, 0xf, 0x1f, 0xaa, 0x92, 0x3c, 0xc, + 0xd, 0x33, 0x3c, 0x2b, 0xea, 0xea, 0x3c, 0x3c, + 0xea, 0xcb, 0xea, 0xa2, 0xa2, 0xa2, 0x80, 0x2b, + 0x1d, 0xb7, 0x94, 0x52, 0x52, 0x55, 0x55, 0x55, + 0x37, 0x8c, 0x8c, 0x82, 0x3b, 0xda, 0x29, 0x76, + 0xa, 0x23, 0x23, 0x23, 0x23, 0x0, 0x23, 0xa, + 0xa, 0x29, 0x5, 0x58, 0xda, 0x45, 0x45, 0x3b, + 0x29, 0x29, 0x29, 0xa, 0x23, 0xa, 0xa, 0xa, + 0x23, 0xa, 0x62, 0xd3, 0x4d, 0x62, 0x1c, 0x8a, + 0x6d, 0x58, 0x89, 0x42, 0x5a, 0x2f, 0x63, 0x19, + 0xc5, 0x42, 0x1b, 0x19, 0x19, 0x19, 0x6e, 0x89, + 0x2f, 0x8, 0x42, 0x89, 0x89, 0xf1, 0x63, 0x19, + 0x19, 0x63, 0x1b, 0x4a, 0x19, 0x4a, 0x19, 0x8f, + 0x89, 0xd2, 0x63, 0xf1, 0x58, 0x29, 0xa, 0x62, + 0x62, 0xa, 0x1c, 0x87, 0xd3, 0x61, 0xac, 0x61, + 0x61, 0x37, 0x61, 0x4d, 0x61, 0x1c, 0xc3, 0xe8, + 0x2c, 0x94, 0xd3, 0x82, 0xd3, 0x8c, 0x60, 0x27, + 0x6b, 0x6b, 0xde, 0xe4, 0x93, 0x32, 0xdf, 0xdf, + 0x93, 0x32, 0xe1, 0xe4, 0x99, 0x3a, 0xc6, 0x12, + 0x93, 0x93, 0xf5, 0x12, 0x93, 0xf3, 0xe4, 0xdf, + 0x32, 0xd8, 0x9f, 0xd8, 0x47, 0x27, 0x8b, 0xc8, + 0x3, 0x2a, 0x49, 0xa7, 0x8c, 0xab, 0x66, 0x78, + 0x29, 0x4d, 0x4d, 0x4d, 0x1c, 0x24, 0xbe, 0xb5, + 0xb5, 0xb5, 0x78, 0x29, 0x82, 0xab, 0x55, 0x55, + 0xab, 0xa7, 0x49, 0x60, 0x3, 0xc6, 0x4b, 0xb1, + 0xf3, 0xf4, 0xbb, 0xe4, 0xe4, 0xb4, 0x9a, 0xe1, + 0xb4, 0x81, 0x1e, 0x4, 0x93, 0xbf, 0xaf, 0xb4, + 0xbf, 0xe2, 0x44, 0xbf, 0xf4, 0xaf, 0xf4, 0xaf, + 0xe2, 0xe2, 0xf4, 0xb4, 0xe2, 0x44, 0xf4, 0x95, + 0xaf, 0x12, 0xbf, 0xaf, 0xbb, 0x97, 0x95, 0xf4, + 0xbf, 0x97, 0xe2, + 0x18, 0x47, 0x32, 0xe4, 0xdd, 0x9c, 0x9c, 0xe4, + 0xf3, 0x97, 0x32, 0x90, 0x6b, 0x3, 0x6c, 0xd7, + 0xe9, 0xe9, 0x11, 0xd5, 0x63, 0x79, 0xa0, 0xa0, + 0x58, 0x58, 0xe3, 0x6, 0xb5, 0xd1, 0x76, 0xd1, + 0xac, 0xbe, 0xda, 0x5, 0x67, 0x1c, 0x29, 0x8a, + 0x41, 0x58, 0x8c, 0x8, 0x5a, 0x8, 0x30, 0x63, + 0x89, 0x63, 0x89, 0x6e, 0x19, 0x19, 0x63, 0x6e, + 0x63, 0xe9, 0x79, 0x1b, 0xd5, 0x79, 0x8, 0x79, + 0x63, 0x63, 0x1b, 0x89, 0x63, 0x4a, 0x4a, 0xd5, + 0x89, 0x30, 0x2f, 0x8, 0x1b, 0x42, 0x30, 0x89, + 0x19, 0x19, 0x19, 0x89, 0x89, 0x63, 0x2f, 0xf1, + 0x67, 0x1c, 0xa, 0x62, 0xd1, 0x23, 0x23, 0x23, + 0xa, 0xa, 0xd1, 0xa, 0x16, 0xd1, 0x23, 0x76, + 0x23, 0x0, 0x23, 0x23, 0xa, 0x76, 0xd1, 0x34, + 0x23, 0xd1, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x34, 0x23, 0x23, 0x23, 0xa, 0x78, 0x4d, 0x65, + 0xc3, 0x33, 0x92, 0x5f, 0x5f, 0xb6, 0x1f, 0xb6, + 0x1d, 0x3f, 0xc, 0xb7, 0x33, 0x48, 0xc, 0xc, + 0xc, 0x56, 0x5f, 0xc, 0x2b, 0xea, 0xc1, 0x3c, + 0xcb, 0x9a, 0xf6, 0x7, 0x57, 0xbc, 0xea, 0x3c, + 0x3c, 0xf, 0x17, 0xf, 0x1d, 0x49, 0x59, 0x8c, + 0x24, 0x5, 0xa0, 0xb5, 0x6d, 0x29, 0x29, 0x62, + 0x78, 0xa, 0x29, 0xa, 0x23, 0x16, 0x16, 0x23, + 0xa, 0x29, 0x5, 0x1c, 0x37, 0x16, 0x16, 0x6d, + 0x29, 0x4d, 0x6d, 0x6d, 0x62, 0xa, 0x16, 0xa, + 0xa, 0xd1, 0xd1, 0x62, 0x6d, 0x6d, 0x8a, 0xa7, + 0x49, 0x5a, 0xc5, 0x19, 0x4a, 0x1b, 0x63, 0xd5, + 0xa5, 0x67, 0x1b, 0x77, 0x5d, 0xc5, 0x19, 0x6e, + 0xe9, 0x6e, 0x4a, 0x4a, 0x63, 0x63, 0xd5, 0xd5, + 0xd7, 0x6e, 0x6e, 0xd5, 0xa5, 0xa5, 0xd5, 0xd5, + 0x6e, 0x63, 0x63, 0x1b, 0x58, 0x29, 0x29, 0xa, + 0xa, 0x62, 0x4d, 0x66, 0x52, 0x66, 0x52, 0xb6, + 0x52, 0x37, 0x55, 0x55, 0x65, 0xab, 0xa8, 0x91, + 0x1d, 0x52, 0x66, 0x61, 0x6d, 0xab, 0xe8, 0x83, + 0xd8, 0xdd, 0xe4, 0xbf, 0xe4, 0xe1, 0xe1, 0xbf, + 0xe1, 0x57, 0x57, 0xb4, 0xb4, 0xe4, 0xf4, 0xb4, + 0xbf, 0xbf, 0xb4, 0xe2, 0x95, 0xe1, 0x9a, 0xf4, + 0xb4, 0x75, 0x57, 0xc6, 0xe4, 0x81, 0x9a, 0xce, + 0x84, 0x57, 0x48, 0x49, 0x52, 0x94, 0xbe, 0x29, + 0xbe, 0x6d, 0xbe, 0x82, 0xad, 0xc9, 0x52, 0xc3, + 0xc3, 0x87, 0x24, 0xd3, 0x82, 0xab, 0xa7, 0x1, + 0x59, 0x8b, 0xf6, 0xf6, 0x4b, 0x9a, 0xb4, 0x9a, + 0xe2, 0xb4, 0x7, 0x57, 0x9a, 0xf4, 0xf4, 0xb0, + 0x8d, 0xbb, 0xb4, 0xf4, 0xb4, 0x44, 0xe2, 0xbf, + 0xe2, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, 0x44, 0xf4, + 0xf4, 0x44, 0xe2, 0xe2, 0xe2, 0xf4, 0xcc, 0xbf, + 0xf4, 0xb4, 0xf4, 0xf4, 0xbb, 0x93, 0xf3, 0xe2, + 0xaf, 0x97, 0x12, + 0x90, 0x9c, 0xf3, 0xbf, 0xf4, 0xc0, 0x9c, 0xc0, + 0xe4, 0xd8, 0xdd, 0x9c, 0x9d, 0x77, 0x6c, 0x6c, + 0x4a, 0x42, 0x79, 0xe9, 0x79, 0x67, 0xb3, 0xa6, + 0x1, 0x1, 0xab, 0xa7, 0xab, 0x4d, 0x76, 0x62, + 0x62, 0x62, 0x62, 0x41, 0xd3, 0xe3, 0x78, 0x6d, + 0xd3, 0xab, 0xa8, 0xe7, 0x73, 0x96, 0x89, 0x63, + 0x19, 0x79, 0x2f, 0x89, 0x4a, 0xe9, 0xd5, 0x19, + 0xd5, 0x6e, 0x19, 0xd5, 0x63, 0x19, 0x42, 0x63, + 0x19, 0x63, 0xf1, 0x42, 0x63, 0x5d, 0x5d, 0xd2, + 0x63, 0x96, 0xe7, 0x63, 0x19, 0x2, 0xa5, 0x63, + 0x6e, 0x4a, 0xc5, 0xd2, 0x1b, 0x7a, 0x2c, 0xa5, + 0x42, 0xa0, 0x5, 0x8a, 0x16, 0xa, 0x23, 0x23, + 0x34, 0xd1, 0xd1, 0x23, 0xa, 0xa, 0xa, 0x23, + 0x16, 0x23, 0x23, 0xa, 0xa, 0xa, 0xd1, 0xd1, + 0x23, 0x23, 0x34, 0x23, 0x23, 0x34, 0x76, 0x23, + 0xd1, 0xd1, 0x34, 0x76, 0x76, 0x78, 0x78, 0x66, + 0x52, 0x1d, 0xc, 0xc, 0x92, 0x3c, 0x56, 0x92, + 0xb8, 0xb, 0x3c, 0x92, 0x92, 0xc, 0xc, 0xc, + 0xc, 0x92, 0x3c, 0xc, 0xdc, 0xcb, 0xa2, 0xd0, + 0xcb, 0xcb, 0xcb, 0xbc, 0xba, 0x57, 0xea, 0x2b, + 0x3c, 0x92, 0x92, 0xb7, 0x33, 0x38, 0x7e, 0x59, + 0xc3, 0x68, 0x68, 0x82, 0x4d, 0x78, 0x29, 0xa, + 0xd1, 0xa, 0x16, 0x29, 0x16, 0x16, 0x45, 0x3b, + 0x29, 0x29, 0x3b, 0x76, 0xa, 0x62, 0x1c, 0x6d, + 0x37, 0x4d, 0x16, 0x4d, 0xd1, 0xa, 0x16, 0xa, + 0x23, 0x62, 0xa, 0xd1, 0xe3, 0xab, 0x5e, 0x66, + 0x55, 0x67, 0xd9, 0x6b, 0xe5, 0xe5, 0xd7, 0xd7, + 0xa5, 0x2f, 0x1b, 0xd5, 0x2f, 0xf1, 0xd5, 0xef, + 0x8f, 0x6e, 0x4a, 0xe5, 0xd5, 0x19, 0xd5, 0xc2, + 0x77, 0x72, 0xd5, 0xef, 0xd4, 0xe, 0xd5, 0xd5, + 0xd2, 0x63, 0x89, 0x73, 0xb3, 0xa, 0x62, 0xa, + 0x78, 0x78, 0x37, 0x66, 0x94, 0x66, 0x52, 0x1d, + 0xb6, 0x17, 0x66, 0x55, 0x66, 0x55, 0x64, 0x91, + 0xf, 0x66, 0x37, 0x4d, 0xbe, 0x82, 0x59, 0x7d, + 0x9c, 0xce, 0xe1, 0x4b, 0xdf, 0x9f, 0x57, 0xb4, + 0x81, 0x90, 0xf9, 0xe1, 0xf3, 0xe4, 0xc6, 0xdf, + 0xe4, 0xe4, 0x9a, 0xe1, 0xc6, 0x81, 0x75, 0xe4, + 0xe4, 0x81, 0xf9, 0xbd, 0xde, 0xe4, 0xb4, 0xe1, + 0xc6, 0x74, 0x80, 0x3c, 0xb8, 0xa8, 0xa8, 0x1, + 0xb3, 0xa7, 0xe3, 0xab, 0x60, 0x22, 0x1d, 0x1f, + 0xa7, 0x52, 0x1f, 0x49, 0xa8, 0x60, 0x59, 0x73, + 0xef, 0x1e, 0x90, 0x7d, 0x6f, 0xe4, 0x9a, 0x57, + 0xe1, 0xf9, 0xe1, 0xc6, 0xc6, 0xb4, 0xb4, 0xf9, + 0x8d, 0xaf, 0xbb, 0x9c, 0x7d, 0xe4, 0xb4, 0xb4, + 0xf4, 0xbb, 0xee, 0xb4, 0xbf, 0xe2, 0xf4, 0xbf, + 0xbf, 0xf4, 0xe2, 0xf4, 0xbf, 0xf4, 0xdf, 0xcc, + 0xf3, 0xf8, 0xbf, 0xdf, 0xf4, 0xe2, 0xe2, 0xe2, + 0xf4, 0xbf, 0x44, + 0xbf, 0xb4, 0xbf, 0xb4, 0xf4, 0x9a, 0xbf, 0xf4, + 0x57, 0x74, 0xde, 0xe4, 0x70, 0x47, 0x6c, 0xef, + 0xd7, 0xd2, 0x2f, 0x60, 0x6, 0x8c, 0x1, 0x60, + 0x2c, 0x52, 0xa8, 0x22, 0x49, 0xbe, 0x4d, 0x3b, + 0xa, 0x76, 0x16, 0x1c, 0x4d, 0xd1, 0xd1, 0x5e, + 0x61, 0x66, 0xb8, 0xd9, 0xd9, 0xd7, 0x8f, 0xef, + 0x6e, 0x2f, 0xb3, 0x42, 0x60, 0x60, 0x50, 0xef, + 0xd7, 0xef, 0xef, 0xd7, 0xd5, 0x19, 0xef, 0xc2, + 0x19, 0xa5, 0x2f, 0x42, 0x6e, 0x2f, 0xa8, 0xe, + 0x19, 0xd5, 0xef, 0x6e, 0x19, 0x6e, 0xe9, 0xd2, + 0x63, 0x79, 0xc7, 0x79, 0x63, 0x7a, 0xc5, 0x60, + 0x6e, 0xe, 0xd2, 0x87, 0x8a, 0xd1, 0x23, 0x23, + 0x0, 0x23, 0x23, 0x23, 0xa, 0x76, 0xd1, 0xa, + 0x1c, 0x3b, 0x29, 0xa, 0xa, 0xa, 0xa, 0x62, + 0xa, 0xa, 0x23, 0xa, 0x23, 0x76, 0x0, 0x23, + 0x23, 0xd1, 0x76, 0x76, 0x78, 0x37, 0x37, 0x94, + 0xa8, 0x48, 0xd, 0x33, 0xeb, 0x18, 0xd0, 0xc1, + 0x92, 0x33, 0xc, 0x5f, 0xc, 0x92, 0x1f, 0xaa, + 0xc, 0x48, 0xdc, 0xd, 0x5c, 0xcb, 0x9f, 0xea, + 0x2b, 0xc1, 0xd, 0x2b, 0xea, 0xbc, 0xba, 0x2b, + 0x2b, 0xb, 0xeb, 0x92, 0x56, 0xa8, 0x4e, 0x52, + 0x52, 0x24, 0x82, 0x6d, 0x29, 0x3b, 0x5, 0x16, + 0x16, 0x16, 0x3b, 0xa, 0xa, 0x3b, 0x1c, 0x82, + 0x29, 0x82, 0x82, 0xda, 0x16, 0x16, 0x5, 0x16, + 0xd1, 0xd1, 0xa, 0xa, 0x23, 0xa, 0xa, 0xd1, + 0xd1, 0x6d, 0x8a, 0xa, 0xa, 0xb5, 0x1c, 0x62, + 0x1c, 0x58, 0x1b, 0xd5, 0x77, 0xd2, 0xd5, 0xef, + 0xd2, 0x6e, 0x4a, 0x6e, 0x1b, 0x63, 0x19, 0x63, + 0xd5, 0x42, 0x63, 0xd5, 0xa5, 0xd2, 0x6e, 0x1b, + 0x42, 0x1b, 0xe, 0xd5, 0x63, 0x42, 0x6e, 0x19, + 0x19, 0x2f, 0x30, 0xe3, 0xa, 0xd1, 0x29, 0x82, + 0x29, 0xb5, 0xb3, 0x2f, 0x2f, 0xe3, 0x61, 0x52, + 0x52, 0x66, 0xbe, 0x61, 0x61, 0xab, 0xb8, 0x22, + 0x59, 0x82, 0xbe, 0x82, 0x4d, 0x29, 0x87, 0xd4, + 0xe5, 0x47, 0x9d, 0xf6, 0x9c, 0x9c, 0xdd, 0xe4, + 0x97, 0x6f, 0xf5, 0x12, 0x93, 0x32, 0xd8, 0x90, + 0x4, 0x8e, 0xd8, 0x81, 0x6f, 0x9c, 0xf3, 0xf3, + 0x97, 0x97, 0xf5, 0xd8, 0x93, 0xff, 0x57, 0x9d, + 0x6b, 0x1e, 0x18, 0x88, 0xd5, 0x7d, 0x7d, 0x7c, + 0xd5, 0xe9, 0x1, 0xab, 0xa8, 0x2c, 0x52, 0xa8, + 0x2f, 0xd4, 0x4f, 0x7c, 0x6b, 0x6b, 0x9c, 0xe5, + 0x6c, 0x4, 0x36, 0x27, 0xe5, 0x97, 0xc6, 0xfd, + 0x6f, 0x12, 0xb4, 0x97, 0x4, 0xb4, 0xbf, 0x9c, + 0x4, 0x12, 0xb1, 0x4, 0x47, 0x97, 0xf4, 0x97, + 0x97, 0xf4, 0xf4, 0x93, 0x93, 0xbf, 0xe2, 0x93, + 0x93, 0xf4, 0xbf, 0x69, 0x93, 0xbf, 0xb1, 0x93, + 0x97, 0x93, 0x95, 0xf3, 0xe2, 0xbf, 0xe2, 0xe2, + 0xf4, 0xf4, 0xf4, + 0xcc, 0xd8, 0x12, 0xdf, 0x4b, 0xd8, 0xc6, 0xc6, + 0x90, 0x99, 0x9c, 0x8e, 0x6c, 0xd5, 0x96, 0xa5, + 0xa5, 0x1, 0xa8, 0x1, 0x8c, 0x8c, 0x5a, 0x6e, + 0xa5, 0x8c, 0x67, 0x2c, 0x94, 0x78, 0xac, 0x37, + 0x76, 0xd1, 0x1a, 0x82, 0x29, 0x29, 0x6d, 0x6d, + 0xa, 0x6d, 0x87, 0xd2, 0xa5, 0x7a, 0xa5, 0x96, + 0x89, 0x42, 0x42, 0x63, 0x1b, 0x73, 0x1b, 0x19, + 0x6e, 0xa5, 0xe, 0x19, 0x4a, 0xd2, 0xa5, 0x1b, + 0x1b, 0x63, 0x19, 0x19, 0x63, 0x42, 0x73, 0x63, + 0x19, 0xd2, 0xf1, 0x73, 0x1b, 0xd2, 0x2f, 0xf1, + 0x63, 0x89, 0x63, 0x63, 0x63, 0x79, 0x8, 0x67, + 0x42, 0x8c, 0xd3, 0x29, 0xa, 0xa, 0x0, 0x23, + 0x23, 0x23, 0xd1, 0x62, 0x1c, 0x29, 0x76, 0xa, + 0x29, 0x6d, 0x78, 0x78, 0xa, 0x16, 0x62, 0x6d, + 0x3b, 0x45, 0x16, 0x16, 0xd1, 0x23, 0x23, 0x23, + 0xd1, 0xa, 0x23, 0x76, 0xbe, 0x65, 0xc3, 0xa8, + 0x13, 0xcb, 0x7e, 0xb8, 0x48, 0xdc, 0xb, 0x5f, + 0xb7, 0xb6, 0x92, 0xc, 0xc, 0xc1, 0x33, 0x3c, + 0xdc, 0xa2, 0xa2, 0x80, 0x91, 0xea, 0xea, 0x2b, + 0xc, 0xc1, 0x38, 0x18, 0xcb, 0xfa, 0x9a, 0xcb, + 0xba, 0xb, 0x2a, 0x91, 0x52, 0x1d, 0x52, 0xac, + 0x78, 0x4d, 0x16, 0x82, 0xda, 0x5, 0x45, 0x45, + 0x16, 0x3b, 0xda, 0xa, 0x23, 0x4d, 0x62, 0x78, + 0x4d, 0x87, 0x45, 0x5, 0xda, 0x5, 0x45, 0x16, + 0x23, 0x0, 0x23, 0xd1, 0x23, 0x23, 0xa, 0xa, + 0x62, 0xd1, 0x41, 0x41, 0x41, 0x5, 0x30, 0x58, + 0x8a, 0x58, 0x42, 0x79, 0x89, 0x1b, 0x19, 0x4a, + 0xe, 0x63, 0x19, 0x4a, 0x4a, 0x19, 0x4a, 0x4a, + 0xd2, 0xd2, 0xe9, 0x4a, 0xd2, 0xe, 0x19, 0x19, + 0x19, 0x63, 0x19, 0xd5, 0x4a, 0x63, 0xd2, 0x6e, + 0x79, 0x67, 0x8a, 0x62, 0xa, 0xa, 0xa, 0xd3, + 0xe3, 0x82, 0x1, 0x4e, 0x2c, 0x52, 0x52, 0xb6, + 0x61, 0x61, 0xf2, 0x4d, 0x29, 0xa7, 0xc9, 0x2a, + 0xe8, 0x52, 0xd3, 0xb5, 0x82, 0xbe, 0x49, 0xfb, + 0x47, 0xe5, 0x36, 0xf3, 0x97, 0x6f, 0xdd, 0x81, + 0x93, 0x32, 0xe1, 0x57, 0x9c, 0x32, 0xe1, 0xc6, + 0xc0, 0x93, 0x86, 0xc0, 0xf3, 0x12, 0xe4, 0xe4, + 0x8e, 0x12, 0xd8, 0x9f, 0xde, 0xde, 0xe1, 0x86, + 0x70, 0xde, 0x84, 0xc6, 0x36, 0xe1, 0x75, 0x53, + 0xdb, 0xdb, 0xc1, 0x91, 0xeb, 0x88, 0x4f, 0x27, + 0x83, 0x81, 0x70, 0x1e, 0xfd, 0xe4, 0xc6, 0x36, + 0x3, 0x1e, 0x81, 0x9d, 0x1e, 0xc6, 0xb4, 0x81, + 0xc0, 0xf4, 0xf4, 0xb4, 0xe4, 0xe4, 0xf4, 0xe1, + 0x57, 0x9a, 0xe4, 0x8e, 0xe4, 0xf4, 0xf4, 0xee, + 0xbb, 0xe2, 0xf4, 0xe2, 0xbb, 0xf4, 0xe2, 0xf4, + 0xf4, 0xe2, 0xe2, 0xf4, 0xbb, 0xe2, 0xbf, 0xaf, + 0xcc, 0xed, 0xcc, 0x95, 0xe2, 0xbb, 0xbb, 0xbf, + 0xe2, 0xbb, 0xbf, + 0x12, 0x47, 0x9c, 0x12, 0xf3, 0x97, 0x93, 0xc0, + 0x32, 0xe5, 0x6c, 0x6c, 0xd7, 0x5d, 0x2f, 0xb3, + 0xd3, 0xd3, 0xab, 0xb3, 0x30, 0x73, 0x1b, 0x4a, + 0xd2, 0x2f, 0xb3, 0xd3, 0xa, 0x78, 0x78, 0x23, + 0x23, 0x23, 0xa, 0x3b, 0x16, 0x1c, 0xda, 0x58, + 0x1c, 0xa, 0x41, 0x67, 0x2f, 0x8c, 0xf1, 0x1b, + 0x1b, 0x79, 0x63, 0x19, 0x19, 0x63, 0x19, 0x4a, + 0x4a, 0x63, 0xa5, 0xd2, 0x63, 0xf1, 0x79, 0xd2, + 0x19, 0x63, 0x19, 0xef, 0x19, 0x19, 0x63, 0x89, + 0x63, 0xd2, 0x2f, 0xf1, 0x42, 0x67, 0x67, 0xf1, + 0x42, 0xe9, 0x6e, 0x63, 0x19, 0x63, 0x2f, 0x67, + 0xf1, 0x67, 0x1c, 0x1c, 0x62, 0x23, 0x23, 0x23, + 0x23, 0xa, 0xd1, 0xa, 0x29, 0x3b, 0x29, 0x29, + 0xb5, 0x6d, 0x6d, 0x16, 0x3b, 0x1c, 0x29, 0x16, + 0x68, 0x45, 0x3b, 0x78, 0xa, 0x76, 0x23, 0xd1, + 0x78, 0x76, 0x78, 0x76, 0xbe, 0x1f, 0xa8, 0x3e, + 0x51, 0xdb, 0xba, 0x2b, 0x5f, 0x2b, 0x92, 0x92, + 0x92, 0x3c, 0xd, 0x92, 0x92, 0xb, 0xa2, 0x2b, + 0xc, 0x2b, 0xea, 0x2b, 0x2b, 0x2b, 0xdc, 0x2b, + 0x80, 0xa2, 0xcb, 0xf6, 0xcb, 0x9a, 0x9a, 0xbc, + 0x2b, 0x2b, 0x80, 0x91, 0x92, 0x91, 0xa8, 0x8c, + 0xbe, 0x4d, 0x78, 0xa, 0x16, 0x29, 0x29, 0x29, + 0x6d, 0x37, 0x62, 0x16, 0x16, 0x65, 0x68, 0xda, + 0x6d, 0xda, 0x87, 0x4d, 0x6d, 0x29, 0xa, 0xa, + 0xa, 0xa, 0x23, 0xa, 0xd1, 0x29, 0xa, 0xa, + 0xd1, 0xd1, 0x62, 0x1c, 0xe3, 0xd3, 0x8c, 0x87, + 0xe9, 0xa5, 0xef, 0x6e, 0x8f, 0x11, 0xd5, 0x6e, + 0xa5, 0x42, 0xe, 0xd5, 0xd5, 0xa5, 0xa5, 0xd2, + 0xc2, 0x6e, 0xd7, 0x8f, 0xc2, 0x19, 0xd5, 0xef, + 0x19, 0xa5, 0x79, 0xd5, 0x19, 0x63, 0x79, 0x1b, + 0x5b, 0x2f, 0x2f, 0x24, 0x29, 0xa, 0x62, 0xe3, + 0xb5, 0x66, 0x55, 0x1f, 0x1f, 0xf, 0xf, 0x17, + 0x17, 0x61, 0x55, 0x17, 0x55, 0xe3, 0x59, 0x3f, + 0x91, 0x66, 0x66, 0x61, 0xbe, 0xc3, 0x2a, 0x83, + 0x83, 0x7d, 0x90, 0xbf, 0xce, 0xc6, 0xf6, 0x18, + 0xc4, 0xe4, 0x75, 0xf6, 0x90, 0xf8, 0xf4, 0xf4, + 0xbf, 0xc6, 0x4b, 0xe4, 0xe4, 0xbf, 0xe1, 0xf6, + 0x90, 0xce, 0xb4, 0xc6, 0x4b, 0xdf, 0xc6, 0xbb, + 0xe4, 0xb4, 0xf9, 0x40, 0x75, 0xce, 0x9a, 0xa2, + 0x18, 0xf6, 0x75, 0x75, 0x75, 0x4b, 0x81, 0x84, + 0xe1, 0xb4, 0x7, 0x18, 0x53, 0x7, 0x7, 0x57, + 0x88, 0x7d, 0xc6, 0xce, 0xb4, 0x9, 0x4b, 0xe4, + 0x9a, 0x20, 0xf4, 0x70, 0x9f, 0xb4, 0x8d, 0xf4, + 0x84, 0xb2, 0x9c, 0xbf, 0xbf, 0xf4, 0xe2, 0xbf, + 0xf4, 0xf4, 0xe2, 0xf4, 0x9a, 0xf4, 0xf4, 0xe2, + 0xe2, 0xf4, 0xf4, 0xf4, 0x44, 0xe2, 0xf4, 0xcc, + 0xce, 0x1e, 0x75, 0xbf, 0xf4, 0x97, 0xbf, 0xf4, + 0xe2, 0xbf, 0x95, + 0xe4, 0xbd, 0xf3, 0xe4, 0xe4, 0x8d, 0xbd, 0xb4, + 0xbd, 0x47, 0x3, 0xd5, 0xd5, 0x2f, 0x2f, 0x2f, + 0x41, 0xe3, 0xd3, 0x67, 0xc3, 0x73, 0x73, 0xe9, + 0xe, 0x2f, 0xab, 0x61, 0x37, 0x76, 0xd1, 0xd1, + 0x23, 0x23, 0x23, 0xd1, 0xa, 0xd1, 0x29, 0x82, + 0xe3, 0x78, 0xab, 0xa8, 0xa6, 0x8, 0xc5, 0xd5, + 0xe7, 0x2f, 0x73, 0xc2, 0xd2, 0x6e, 0x19, 0xd5, + 0xd5, 0xd5, 0xef, 0x19, 0xd5, 0x42, 0x63, 0xd5, + 0x6e, 0x79, 0xd5, 0x6e, 0x6e, 0xd2, 0x5d, 0x5d, + 0x1b, 0x1b, 0xd2, 0x79, 0xd2, 0x41, 0x5, 0xf1, + 0x67, 0x8, 0xd2, 0x6e, 0xc2, 0xd2, 0xa5, 0x2f, + 0x2f, 0xa6, 0x30, 0x8, 0x8a, 0xa, 0x0, 0x23, + 0x23, 0x23, 0xd1, 0x76, 0xa, 0x6d, 0x82, 0xd3, + 0x8a, 0x3b, 0x45, 0x3b, 0x30, 0x87, 0xb5, 0xb5, + 0x8a, 0x82, 0xb5, 0x76, 0xf2, 0x76, 0xa, 0xb5, + 0xab, 0x65, 0x68, 0x4d, 0x52, 0x52, 0x52, 0x91, + 0x92, 0x48, 0x2b, 0x2b, 0xc, 0xaa, 0x38, 0xb8, + 0x2b, 0xdc, 0xdc, 0x56, 0xaa, 0x2b, 0x2b, 0xc, + 0x5f, 0xaa, 0x5f, 0x2b, 0x2b, 0xd0, 0xcb, 0xd0, + 0xba, 0xa2, 0xcb, 0xcb, 0xd, 0xcb, 0x7, 0xbc, + 0xb, 0x2b, 0xb, 0xdc, 0x48, 0x48, 0xae, 0xad, + 0x87, 0xab, 0x4d, 0xa, 0x76, 0x76, 0x78, 0x37, + 0x61, 0x55, 0x82, 0x87, 0xb3, 0x65, 0xa4, 0x45, + 0x82, 0xda, 0x29, 0x29, 0x78, 0x76, 0x76, 0xa, + 0x76, 0x76, 0xa, 0xa, 0x62, 0x58, 0x29, 0x62, + 0xd1, 0xd1, 0xd1, 0x1c, 0x6d, 0xe3, 0xe3, 0x24, + 0x42, 0xd9, 0xef, 0xd9, 0xef, 0xd5, 0xd7, 0x8f, + 0x6e, 0x73, 0x42, 0x72, 0xd2, 0xe7, 0xa5, 0xa4, + 0xe, 0x4a, 0x4a, 0xe5, 0xc2, 0x1b, 0x77, 0xef, + 0x6e, 0xa5, 0x2f, 0x6e, 0xd5, 0x19, 0x19, 0x73, + 0x30, 0x58, 0x2f, 0xab, 0x62, 0x6d, 0xa, 0xe3, + 0x4d, 0xd3, 0x66, 0x61, 0x66, 0x17, 0xf, 0xb6, + 0x17, 0x66, 0x17, 0x17, 0x55, 0x82, 0x1f, 0x1d, + 0xf, 0x66, 0x37, 0x78, 0x6d, 0x2f, 0x25, 0xf6, + 0x90, 0x7d, 0xf5, 0x75, 0xde, 0xde, 0x9f, 0x8b, + 0xde, 0xdd, 0xe1, 0xc6, 0xdf, 0xc0, 0x95, 0xbf, + 0xc0, 0x12, 0x81, 0x57, 0xd8, 0xcc, 0x9a, 0x90, + 0xbd, 0xf3, 0xbf, 0xbf, 0xb4, 0xdf, 0xe4, 0xe4, + 0xde, 0x8d, 0x70, 0x9f, 0x9d, 0xb4, 0xb4, 0x75, + 0xc8, 0x86, 0xbf, 0xe1, 0xdd, 0xde, 0xc6, 0x81, + 0x9f, 0x81, 0xe1, 0x9f, 0x9d, 0x81, 0xe1, 0xbd, + 0x6f, 0x6f, 0x32, 0x8e, 0x4, 0xdd, 0xc6, 0x6f, + 0xfd, 0x85, 0xcd, 0x32, 0xfd, 0xe1, 0x20, 0xb4, + 0x97, 0x93, 0x97, 0x97, 0x69, 0xbf, 0xf4, 0x93, + 0xbb, 0xf4, 0xf4, 0xbf, 0x8d, 0x44, 0xf3, 0x9, + 0xbb, 0xbb, 0x97, 0x93, 0xbf, 0x69, 0x4, 0x5b, + 0x32, 0x97, 0x97, 0x69, 0xf4, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0xf4, + 0xf9, 0xdf, 0xe4, 0xb4, 0xf4, 0xf9, 0x18, 0xe1, + 0xb0, 0xd8, 0x88, 0x4f, 0xd4, 0x6e, 0x79, 0x77, + 0xa6, 0xa0, 0x8c, 0xab, 0x1, 0x8c, 0xa7, 0xa7, + 0xab, 0xab, 0x55, 0x66, 0x4d, 0x5e, 0xac, 0x5e, + 0xd1, 0x23, 0x23, 0xa, 0xa, 0x29, 0x78, 0xf2, + 0x76, 0xb5, 0x52, 0x4e, 0xc9, 0xec, 0xa5, 0xd5, + 0xd2, 0x5b, 0x73, 0x96, 0xa6, 0x2f, 0xa5, 0xc9, + 0xa5, 0xc5, 0xef, 0xe5, 0x6e, 0x4a, 0x6e, 0x31, + 0xd5, 0xc5, 0x96, 0xa5, 0x2f, 0x7a, 0xe9, 0xd2, + 0x1b, 0x63, 0x19, 0x4a, 0x63, 0x1b, 0x89, 0x30, + 0x30, 0x73, 0xd2, 0xc5, 0xc5, 0xa5, 0xd2, 0x6e, + 0x6e, 0x1b, 0x63, 0x2, 0x2f, 0x3b, 0x16, 0xd1, + 0x23, 0xa, 0x78, 0x23, 0xd1, 0x78, 0x24, 0x67, + 0x30, 0x45, 0xa4, 0x5, 0x58, 0x87, 0xda, 0xda, + 0x37, 0x37, 0x4d, 0x78, 0xd1, 0xd1, 0x1c, 0x67, + 0x49, 0x2c, 0x60, 0x2f, 0x49, 0x1d, 0x2c, 0xa3, + 0x91, 0xd6, 0xa2, 0xdc, 0xdc, 0xeb, 0x38, 0xeb, + 0x2b, 0x48, 0x2b, 0x92, 0x5f, 0xc, 0x3c, 0xc, + 0xc, 0x56, 0x38, 0xcb, 0xcb, 0x74, 0xf6, 0x74, + 0xea, 0xea, 0xa2, 0xa2, 0x80, 0xa2, 0x57, 0x57, + 0x74, 0x74, 0x40, 0x9d, 0xdb, 0x2a, 0x77, 0x60, + 0xa7, 0x55, 0x37, 0x78, 0x78, 0xa, 0xa, 0x16, + 0xbe, 0xda, 0x76, 0x16, 0xda, 0x29, 0x1c, 0x37, + 0x16, 0x37, 0x4d, 0x76, 0xda, 0x78, 0xd1, 0xa, + 0x23, 0x23, 0x23, 0x23, 0xa, 0xa, 0xd1, 0xd1, + 0x62, 0xa, 0xa, 0x62, 0x8a, 0x5, 0x30, 0x30, + 0x42, 0x6e, 0xd2, 0xa5, 0xe9, 0xd2, 0x5d, 0xc5, + 0x6e, 0xd2, 0x1b, 0x63, 0x63, 0x63, 0x89, 0x30, + 0x73, 0xe9, 0x79, 0xe9, 0x1b, 0x79, 0x2f, 0xa5, + 0x6e, 0x19, 0x6e, 0x4a, 0x19, 0x19, 0x89, 0x8, + 0xa, 0xa, 0x62, 0x5e, 0xa, 0x41, 0xd3, 0xd3, + 0x87, 0x30, 0x52, 0x52, 0x55, 0x17, 0x17, 0x17, + 0x66, 0x61, 0x37, 0x61, 0x4d, 0xc3, 0x60, 0xb8, + 0x5a, 0x8c, 0xb5, 0x4d, 0x82, 0xc3, 0xd4, 0x7c, + 0x3, 0xe5, 0x1e, 0xdb, 0x27, 0x9c, 0xf3, 0xc0, + 0x32, 0x9c, 0xdd, 0xdd, 0x97, 0x97, 0xb4, 0x9f, + 0x9d, 0x9c, 0xdd, 0xc4, 0x6f, 0x9c, 0xe4, 0xf3, + 0x93, 0x93, 0xe1, 0xde, 0x36, 0x32, 0xf3, 0xd8, + 0x3, 0x32, 0xb0, 0xde, 0x6f, 0xde, 0xe4, 0xf3, + 0x69, 0x12, 0xb4, 0xde, 0x97, 0x8e, 0xe4, 0xd8, + 0x3, 0xc8, 0xe4, 0xb1, 0x6f, 0x4, 0x32, 0x6f, + 0x6c, 0x4, 0x4, 0xe5, 0x7c, 0x3, 0xe4, 0x97, + 0x6c, 0x9c, 0xb4, 0x4, 0x4, 0xbf, 0xbf, 0x97, + 0x4, 0x4, 0x4, 0x4, 0x4, 0x26, 0xbb, 0x93, + 0xb1, 0xbb, 0x20, 0x93, 0xb4, 0xaf, 0x44, 0xf4, + 0xbb, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, 0xb4, 0xa6, + 0xf, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, 0xf4, + 0xbf, 0xf4, 0xf4, + 0xf3, 0x32, 0xde, 0xb4, 0x9, 0x8e, 0x6b, 0x81, + 0xe4, 0xfd, 0x3, 0x7e, 0x59, 0xa6, 0x60, 0x2f, + 0xc3, 0x67, 0x8c, 0x1, 0x68, 0x8, 0x67, 0xb3, + 0xb5, 0xd3, 0x94, 0x61, 0xf2, 0x37, 0xac, 0x37, + 0x76, 0x23, 0xa, 0x23, 0xa, 0x29, 0x29, 0xa, + 0x23, 0xa, 0x66, 0x1, 0x2f, 0xf1, 0x2f, 0x2f, + 0xc5, 0x63, 0x1b, 0x1b, 0x89, 0x42, 0x1b, 0x79, + 0x79, 0x96, 0xd5, 0xd2, 0xe9, 0x63, 0x4a, 0xe, + 0xd2, 0x19, 0x19, 0x63, 0x1b, 0x89, 0x63, 0x6e, + 0x2, 0x89, 0x63, 0x2d, 0x79, 0x42, 0xd2, 0xf1, + 0x42, 0x63, 0x19, 0x19, 0x63, 0x89, 0x63, 0x19, + 0x63, 0x79, 0x89, 0x2f, 0xd3, 0xd1, 0xa, 0xa, + 0x23, 0xd1, 0x37, 0xa, 0xd1, 0xd1, 0x3b, 0x5, + 0x24, 0xb5, 0x58, 0xe3, 0x4d, 0xda, 0x5, 0x30, + 0x87, 0x3b, 0x3b, 0x3b, 0xa, 0xa, 0x16, 0x1c, + 0xd3, 0x1, 0x79, 0xf1, 0x2c, 0x91, 0x4f, 0x8f, + 0x9d, 0x9f, 0xcb, 0xd0, 0x80, 0x2b, 0xb, 0x2b, + 0xc, 0xc, 0x92, 0x2b, 0x3c, 0xc, 0xd, 0xd, + 0x3c, 0x2b, 0xd0, 0xd, 0xdc, 0x80, 0xba, 0xa2, + 0x2b, 0x2b, 0xa2, 0xbc, 0x57, 0xcb, 0xcb, 0xcb, + 0xf6, 0x74, 0x3, 0xd5, 0xa5, 0xa8, 0x1, 0x2f, + 0x1, 0x82, 0x37, 0x41, 0x41, 0xa, 0x62, 0x16, + 0x16, 0x6d, 0xa, 0xa, 0x6d, 0x29, 0xa, 0x29, + 0xda, 0x6d, 0x16, 0x3b, 0x3b, 0x1c, 0xa, 0x23, + 0x23, 0x23, 0x23, 0x34, 0xa, 0xa, 0xa, 0x62, + 0x23, 0xa, 0xa, 0x62, 0x5, 0x42, 0xe, 0x6e, + 0x19, 0xe, 0x2f, 0xf1, 0x63, 0x1b, 0x8, 0xf1, + 0x63, 0x19, 0x19, 0x19, 0x89, 0x1b, 0x79, 0xd2, + 0x6e, 0x42, 0x8, 0x67, 0x42, 0x63, 0x42, 0x30, + 0x1b, 0x4a, 0x19, 0x4a, 0x1b, 0xa0, 0x67, 0xd3, + 0x62, 0xa, 0xd1, 0xd1, 0x62, 0xd3, 0xab, 0x61, + 0x87, 0xa6, 0x49, 0x5f, 0xb6, 0x17, 0x17, 0xb7, + 0x17, 0x17, 0x61, 0x76, 0x4d, 0x8, 0x27, 0x8b, + 0x60, 0xc3, 0xbe, 0x82, 0x58, 0x45, 0xc9, 0x4f, + 0x27, 0x47, 0x9c, 0x83, 0x7d, 0x6f, 0xf3, 0xbf, + 0x9c, 0x99, 0x99, 0xf6, 0x9d, 0x9c, 0x81, 0x8b, + 0x9c, 0xf3, 0xbf, 0xb4, 0x9c, 0xed, 0xaf, 0x8d, + 0xde, 0xdd, 0xdf, 0x40, 0x40, 0xbd, 0xb4, 0xf8, + 0x9c, 0xc0, 0xbb, 0xbf, 0xbd, 0xdf, 0xf3, 0xe4, + 0xff, 0xe1, 0xb4, 0xed, 0xd8, 0xe4, 0xf4, 0xe4, + 0xdf, 0xc0, 0xbb, 0xe4, 0xe4, 0xe1, 0xdf, 0x36, + 0x3a, 0x3a, 0x75, 0x6b, 0x47, 0xce, 0xbf, 0xb4, + 0xe4, 0xc6, 0xb4, 0xc0, 0xb4, 0xe1, 0xb4, 0xc6, + 0xfd, 0xbc, 0x9a, 0xbf, 0x97, 0xbf, 0xe2, 0xf4, + 0xe2, 0xf4, 0xf4, 0xbf, 0x44, 0xe2, 0xbf, 0xf4, + 0xe2, 0xf4, 0xf4, 0xf4, 0x9a, 0x9a, 0xe4, 0x9a, + 0x9a, 0x4b, 0xbf, 0xe2, 0xbb, 0x97, 0xc0, 0xf4, + 0xe2, 0x93, 0x95, + 0xc0, 0x97, 0x47, 0x4b, 0xf3, 0x97, 0x32, 0xce, + 0xdf, 0x6b, 0x27, 0x91, 0x1, 0x65, 0xe3, 0x24, + 0x8c, 0x2f, 0x14, 0xa6, 0x5b, 0x89, 0x63, 0x79, + 0x58, 0x8a, 0x29, 0x62, 0xd1, 0x78, 0x76, 0x34, + 0x23, 0x0, 0xd1, 0x76, 0x16, 0x3b, 0x5, 0x41, + 0x1c, 0x1c, 0xa, 0xac, 0x1c, 0xa6, 0x2f, 0x2f, + 0x2f, 0xe, 0x19, 0x19, 0x19, 0x1b, 0x63, 0xd5, + 0x19, 0x19, 0x19, 0x2f, 0x8, 0xd2, 0xc2, 0xd2, + 0x79, 0x89, 0x19, 0x19, 0x63, 0x63, 0x63, 0x89, + 0xf1, 0x63, 0x63, 0xf1, 0x67, 0x67, 0x89, 0x79, + 0x8, 0x89, 0x19, 0x4a, 0xd5, 0x19, 0x63, 0xf1, + 0x2f, 0x79, 0x63, 0xf1, 0x41, 0x1c, 0x29, 0xa, + 0x23, 0xa, 0xa, 0x29, 0xd1, 0xa, 0x1c, 0x1c, + 0xb5, 0x24, 0x67, 0x30, 0x3b, 0xda, 0xa0, 0xa0, + 0xb3, 0x87, 0x58, 0x82, 0x29, 0x29, 0x87, 0x87, + 0x82, 0x8c, 0xd2, 0xd9, 0xd5, 0x4f, 0xd9, 0x47, + 0xc8, 0x98, 0xdc, 0x92, 0x92, 0x92, 0x2b, 0x80, + 0x92, 0xaa, 0xdc, 0xb, 0xea, 0x80, 0x33, 0x48, + 0xc, 0x3c, 0x2b, 0x92, 0xaa, 0x2b, 0xea, 0xcb, + 0xcb, 0x5c, 0x18, 0xf6, 0x57, 0x74, 0xd0, 0x5c, + 0xb, 0x80, 0x91, 0x2a, 0xae, 0x59, 0x60, 0xc5, + 0x77, 0x2c, 0xb5, 0x4d, 0x76, 0xd1, 0x23, 0x78, + 0x29, 0x6d, 0x76, 0x16, 0x87, 0x16, 0x16, 0x3b, + 0xa0, 0x87, 0x62, 0xa, 0x29, 0xd1, 0x23, 0x29, + 0x29, 0xa, 0xd1, 0x62, 0x6d, 0x29, 0xd1, 0xa, + 0x62, 0x62, 0x62, 0x1c, 0x41, 0x2f, 0xa5, 0x77, + 0xe5, 0x19, 0x6e, 0x6e, 0x4a, 0x19, 0x63, 0x42, + 0x19, 0x4a, 0xe9, 0x77, 0x6e, 0xd2, 0xa5, 0xc5, + 0xef, 0x6e, 0x1b, 0x6e, 0x19, 0x6e, 0xd2, 0x8, + 0xf0, 0x19, 0xe, 0xc5, 0x2, 0x73, 0x58, 0x66, + 0xb5, 0x8a, 0x8a, 0x1c, 0xda, 0x67, 0xd3, 0x78, + 0x37, 0x17, 0xb6, 0xf, 0xf, 0x17, 0x17, 0xb6, + 0xb6, 0x17, 0x55, 0x66, 0x82, 0xc9, 0x88, 0xb, + 0x3f, 0x52, 0x66, 0x66, 0x82, 0xa6, 0xc2, 0x6b, + 0xf3, 0xc6, 0xbf, 0xe4, 0x12, 0xc6, 0xf4, 0x9a, + 0x74, 0x81, 0x81, 0xe1, 0xe1, 0xe4, 0xb4, 0xe4, + 0xc0, 0xbf, 0xe2, 0xb4, 0xbf, 0xbf, 0xbf, 0xbf, + 0x57, 0xc6, 0xe4, 0xc6, 0xde, 0x9a, 0xb4, 0xe2, + 0xe4, 0xbf, 0xf4, 0xf4, 0xbf, 0xb4, 0xb4, 0xe2, + 0x8d, 0x9a, 0xf4, 0xbf, 0xbf, 0xe2, 0xf4, 0xf4, + 0xbf, 0xbf, 0xf4, 0xf4, 0xe1, 0x57, 0xe1, 0xe4, + 0x9f, 0xf6, 0x84, 0xb4, 0xbd, 0xf4, 0xb4, 0xe2, + 0xf4, 0x9a, 0xf4, 0xf4, 0x9a, 0x7, 0x9a, 0xf4, + 0xb4, 0xbb, 0xf4, 0xb4, 0xf4, 0xf4, 0xe2, 0xf4, + 0x44, 0xe2, 0x44, 0xbf, 0xe2, 0xbf, 0xbf, 0xbb, + 0xf4, 0xf4, 0x93, 0x95, 0x9a, 0x97, 0x4, 0x97, + 0x97, 0x4, 0x97, 0x97, 0xe2, 0x95, 0xbf, 0xe2, + 0xe2, 0x95, 0xe2, + 0xbf, 0xdd, 0xdd, 0xdf, 0xe4, 0xc0, 0x8d, 0xb4, + 0x4b, 0x7d, 0x98, 0x91, 0x49, 0x52, 0x65, 0x8c, + 0x67, 0x42, 0xe7, 0x67, 0xad, 0x1b, 0x79, 0x2c, + 0x8c, 0x6d, 0x4d, 0x61, 0x62, 0x66, 0xf2, 0x76, + 0x0, 0x0, 0x23, 0x23, 0x29, 0x3b, 0x24, 0x6, + 0x4d, 0x6d, 0x82, 0xac, 0x24, 0x14, 0x1b, 0x2f, + 0x73, 0x63, 0x8f, 0xe9, 0x2f, 0x96, 0x19, 0xd2, + 0xd5, 0x8f, 0xef, 0xe, 0x89, 0xe, 0xd7, 0xd2, + 0x2f, 0x79, 0x19, 0x6e, 0xe9, 0x63, 0x4a, 0xa5, + 0xa5, 0x2, 0xd5, 0x1b, 0x42, 0x89, 0x63, 0x79, + 0x30, 0xd2, 0x8f, 0x4a, 0xd2, 0x79, 0xc2, 0x1b, + 0x79, 0xe9, 0x63, 0xd2, 0x30, 0x8a, 0x1c, 0x23, + 0x23, 0xa, 0xd1, 0xa, 0xd1, 0x62, 0x65, 0xc3, + 0x87, 0x59, 0xd4, 0x73, 0x45, 0x3b, 0xa4, 0xa4, + 0xb5, 0x4d, 0x82, 0x4d, 0x4d, 0x82, 0x87, 0xad, + 0x30, 0xc9, 0xd9, 0x3a, 0x27, 0x51, 0x8b, 0x53, + 0xb, 0x2b, 0x3c, 0x3f, 0x3c, 0x80, 0xd0, 0xa2, + 0xdc, 0x80, 0xdc, 0x2a, 0x2b, 0xc, 0x92, 0xc, + 0xc, 0xc, 0x3c, 0x3c, 0xd, 0x2b, 0xd0, 0x57, + 0xf6, 0xcb, 0x74, 0x74, 0xbc, 0xea, 0xea, 0x80, + 0xdc, 0x2b, 0xdc, 0x18, 0x8b, 0x7c, 0x7c, 0x35, + 0xfb, 0x4e, 0xd3, 0x78, 0x76, 0x76, 0x23, 0x23, + 0x76, 0x78, 0x4d, 0x5, 0x45, 0x5, 0x6d, 0x3b, + 0xa4, 0x6d, 0x23, 0x23, 0xd1, 0x23, 0x0, 0xd1, + 0xd1, 0xa, 0xd1, 0x29, 0x1, 0xab, 0xa, 0x29, + 0x29, 0xe3, 0xa, 0x78, 0xb5, 0x8c, 0x67, 0xc5, + 0xe5, 0xef, 0x4a, 0xd7, 0xe5, 0x11, 0x19, 0xc2, + 0x4a, 0xd7, 0xa5, 0xe7, 0x8f, 0xd5, 0x7a, 0xa5, + 0xef, 0xd7, 0xd5, 0x8f, 0xc5, 0xc2, 0xd2, 0xa5, + 0x63, 0x19, 0x79, 0x2f, 0xa5, 0x8, 0x8c, 0x4d, + 0xb5, 0x8, 0x2f, 0x58, 0x87, 0xb3, 0x94, 0x37, + 0xac, 0x17, 0x17, 0x61, 0xb7, 0x1d, 0xb7, 0xb7, + 0x1f, 0x9e, 0x17, 0x66, 0x87, 0xc3, 0xb8, 0x2b, + 0xf, 0x52, 0x66, 0x4d, 0xe3, 0x5b, 0x6b, 0xc6, + 0x81, 0xd8, 0xc6, 0xe1, 0x57, 0xc6, 0x4b, 0x4b, + 0x9f, 0x9c, 0xb4, 0xe4, 0xf9, 0xdd, 0xbf, 0xf4, + 0xbd, 0xc6, 0xe4, 0xbf, 0xd8, 0xc6, 0xf4, 0xc6, + 0x90, 0xe4, 0xe4, 0xe4, 0xf3, 0xf8, 0xbf, 0xbf, + 0x12, 0xbf, 0xaf, 0xe4, 0xde, 0xe1, 0xe2, 0xb4, + 0xf8, 0xbf, 0xe2, 0xbf, 0xc0, 0xe4, 0xbf, 0xc0, + 0x12, 0xe4, 0xbf, 0xe4, 0xf8, 0x75, 0xb4, 0x32, + 0x6f, 0x6b, 0xde, 0x32, 0x4, 0xb4, 0xc6, 0x8e, + 0xe4, 0x9a, 0x7, 0xb4, 0x32, 0xbf, 0xf4, 0xc0, + 0x93, 0xb2, 0xb4, 0x93, 0x12, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0xc0, 0xf4, 0xe2, 0x97, 0xbb, + 0xe2, 0xf4, 0x93, 0xbf, 0xf4, 0x93, 0x4, 0x97, + 0x97, 0x97, 0x97, 0x93, 0xe2, 0x44, 0xbf, 0xe2, + 0xf4, 0x44, 0xf4, + 0xb4, 0xbf, 0xe4, 0xb4, 0xe4, 0xf4, 0xcc, 0x57, + 0x75, 0x9b, 0x18, 0xb, 0xd0, 0x7e, 0xd4, 0x59, + 0x73, 0x96, 0x96, 0x2f, 0x2f, 0x8, 0x49, 0x52, + 0x61, 0x5e, 0x61, 0x55, 0x55, 0x52, 0x52, 0x76, + 0x23, 0x23, 0x0, 0x0, 0x76, 0x76, 0x37, 0x78, + 0x78, 0xa7, 0xa8, 0x52, 0x87, 0x1b, 0xc5, 0xe, + 0xd2, 0x63, 0xd5, 0xa8, 0x67, 0x1b, 0xa5, 0xa5, + 0xc5, 0xd5, 0xef, 0xef, 0x6e, 0x4a, 0xe5, 0x8f, + 0xe, 0xe, 0xd5, 0x79, 0xe9, 0xa5, 0x19, 0xd2, + 0x79, 0xe, 0xd5, 0x19, 0x19, 0x4a, 0xd5, 0x42, + 0xf1, 0xe9, 0xd5, 0x7a, 0xa1, 0x79, 0xd5, 0x63, + 0xd2, 0xd2, 0xc2, 0xd2, 0xf1, 0x41, 0x6d, 0xd1, + 0xa, 0x23, 0xd1, 0xd1, 0xa, 0xa, 0x1, 0x2f, + 0x2f, 0x59, 0x59, 0xc9, 0x8, 0x8c, 0x87, 0x58, + 0x1c, 0x16, 0x29, 0x37, 0x37, 0x37, 0x87, 0xa0, + 0x42, 0xc9, 0xc9, 0xe9, 0xe8, 0x91, 0x91, 0x3e, + 0x1d, 0xb6, 0x3f, 0xa9, 0x18, 0xcb, 0xa2, 0xbc, + 0xba, 0x2b, 0x2b, 0x2b, 0xc, 0xc, 0xc, 0x3c, + 0xc, 0x3c, 0x3c, 0xa2, 0xa2, 0xa2, 0xc1, 0xd0, + 0xa2, 0xea, 0x2b, 0xea, 0x2b, 0x2b, 0x2b, 0xd0, + 0x18, 0x5c, 0x5c, 0xef, 0x3, 0x5d, 0x2f, 0xa6, + 0x7a, 0x64, 0xd3, 0xd3, 0xa, 0xd1, 0x23, 0xa, + 0x6d, 0xa, 0x16, 0x5, 0x5, 0x58, 0x4d, 0x4d, + 0x16, 0xa, 0x23, 0x23, 0x23, 0x0, 0xd1, 0x23, + 0xa, 0x78, 0xa, 0xd1, 0x37, 0x66, 0x78, 0xe3, + 0x24, 0x78, 0x62, 0x41, 0x30, 0xa4, 0x8, 0x1b, + 0xd5, 0x4a, 0xd2, 0xe, 0x1b, 0xd5, 0xd2, 0xd2, + 0x6e, 0x6e, 0x1b, 0x19, 0xd5, 0xd5, 0x1b, 0x1b, + 0x63, 0x4a, 0x63, 0xa5, 0x5a, 0x89, 0x42, 0x2f, + 0xe, 0x19, 0x89, 0x30, 0xf1, 0x2f, 0xa, 0x62, + 0xa, 0xb5, 0xd3, 0xac, 0xb5, 0xac, 0x37, 0xd3, + 0x1f, 0x59, 0x9e, 0x65, 0x1f, 0x92, 0x92, 0xf, + 0x1f, 0x55, 0x66, 0x52, 0xab, 0xc3, 0x59, 0xb8, + 0x2c, 0x49, 0x58, 0x6d, 0xe3, 0x2f, 0x8f, 0xd8, + 0xa9, 0xc2, 0x9c, 0xe4, 0x83, 0x47, 0x9c, 0x86, + 0x32, 0x32, 0xdd, 0xc6, 0x99, 0x47, 0xf3, 0xe4, + 0xfd, 0x3, 0x9c, 0xdf, 0x97, 0x97, 0xe4, 0xdf, + 0x9c, 0x93, 0x95, 0xf3, 0x4, 0x6b, 0xe4, 0xe4, + 0x32, 0x32, 0xc6, 0x9c, 0x97, 0xf3, 0xbf, 0xe4, + 0x97, 0xc0, 0x95, 0xbf, 0x97, 0xfd, 0xdf, 0xf3, + 0x97, 0xf3, 0xbf, 0xf8, 0x97, 0xf3, 0xbf, 0x4, + 0x6c, 0x7d, 0x47, 0x4, 0x4, 0x3, 0x1e, 0x4, + 0x4, 0xb4, 0x8d, 0x93, 0x9c, 0xbf, 0xf4, 0x97, + 0x97, 0xff, 0xa6, 0x97, 0x93, 0xf4, 0x8d, 0x93, + 0x93, 0xe2, 0xe2, 0x93, 0xf4, 0xbb, 0xe2, 0xe2, + 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0xf4, 0xbb, 0xf4, + 0xbb, 0x9a, 0xf4, 0xe2, 0xf4, 0xbf, 0xe2, 0xe2, + 0xf4, 0xf4, 0xe2, + 0xe1, 0xf5, 0xf3, 0xe1, 0xe1, 0x93, 0x90, 0x4b, + 0x36, 0x4, 0x9c, 0x90, 0x4f, 0x6b, 0x98, 0x3f, + 0xa8, 0xad, 0x5a, 0x67, 0x67, 0xb3, 0x58, 0x6d, + 0x76, 0xe3, 0x78, 0x37, 0xac, 0xab, 0xab, 0x5e, + 0x76, 0xa, 0x23, 0x23, 0xd1, 0x29, 0x62, 0xd1, + 0x6d, 0x1c, 0x65, 0x4d, 0xb5, 0x8c, 0x79, 0xa5, + 0x2d, 0x63, 0x63, 0x89, 0x1b, 0x63, 0xe, 0xa6, + 0x8, 0x6e, 0x4a, 0xe9, 0x63, 0xd5, 0xe, 0xe, + 0xe9, 0xe, 0xd5, 0x6e, 0x63, 0x19, 0x19, 0x42, + 0x8, 0x1b, 0xd2, 0x79, 0x79, 0x2, 0xd2, 0x1b, + 0x1b, 0x63, 0x6e, 0x89, 0x89, 0x89, 0x63, 0x63, + 0xf1, 0x8, 0x73, 0x67, 0x41, 0x8c, 0x58, 0x29, + 0xa, 0x29, 0x62, 0x23, 0xa, 0xa, 0x62, 0xe3, + 0x5e, 0x8a, 0xda, 0x5, 0x8c, 0x8c, 0x87, 0x45, + 0x45, 0x8a, 0x58, 0x29, 0xa, 0x23, 0xa, 0xb5, + 0x41, 0xd3, 0x3b, 0xa0, 0x79, 0x79, 0xa5, 0x1b, + 0x96, 0x14, 0x79, 0xd5, 0x3a, 0x48, 0x3c, 0x2b, + 0x2b, 0x2b, 0xc, 0xaa, 0xaa, 0x3c, 0x2b, 0xdc, + 0xd, 0x56, 0x92, 0xea, 0xba, 0x2b, 0xaa, 0x56, + 0x2b, 0x2b, 0xc, 0xdc, 0x5c, 0x5c, 0xeb, 0x51, + 0xcb, 0x5c, 0xa8, 0x7a, 0x5d, 0x67, 0xa7, 0x8c, + 0xb3, 0xab, 0xd3, 0x5e, 0x76, 0x23, 0x23, 0x29, + 0x3b, 0x16, 0x62, 0xa, 0x76, 0xa, 0xa, 0xa, + 0xa, 0x23, 0x23, 0xd1, 0x23, 0x23, 0xd1, 0xa, + 0x29, 0x62, 0xd1, 0xa, 0xa, 0x76, 0xd1, 0x78, + 0x4d, 0xa, 0x8a, 0x8, 0x77, 0x19, 0x4a, 0x19, + 0x4a, 0x19, 0x79, 0x5a, 0xf0, 0x79, 0x79, 0x63, + 0xd5, 0x19, 0x19, 0x4a, 0x4a, 0x4a, 0x19, 0x4a, + 0x6e, 0x4a, 0xd2, 0x5d, 0xd2, 0x63, 0x11, 0x19, + 0x19, 0x6e, 0x73, 0x30, 0x30, 0x8a, 0x62, 0xa, + 0x62, 0x1c, 0x78, 0x78, 0x78, 0x78, 0x6d, 0x55, + 0xa8, 0xeb, 0x38, 0x56, 0xb7, 0xf, 0x5f, 0xb7, + 0x17, 0x55, 0x55, 0x61, 0x24, 0x60, 0xe8, 0x7e, + 0x2c, 0x52, 0xac, 0x5e, 0x82, 0xb3, 0xe8, 0x8b, + 0x88, 0x83, 0xb4, 0xe4, 0xbd, 0xf3, 0xbb, 0xbf, + 0xdd, 0xde, 0xb4, 0x8d, 0xd8, 0x9d, 0xe4, 0xe4, + 0xdd, 0xde, 0xdd, 0xc0, 0x12, 0xf3, 0xe4, 0xb4, + 0xc0, 0xb4, 0xe4, 0xbf, 0xbd, 0xc6, 0xbf, 0xbf, + 0xf3, 0xe4, 0xbf, 0xaf, 0xe2, 0x12, 0xe2, 0xbb, + 0xe4, 0x7, 0x9a, 0xf4, 0xf3, 0xe4, 0x95, 0xbf, + 0xaf, 0x95, 0xe2, 0xbf, 0xbf, 0xf4, 0x9a, 0xaf, + 0x47, 0x3a, 0x53, 0x3, 0x32, 0xe1, 0xb4, 0xf4, + 0xbf, 0xf4, 0xe2, 0xbf, 0xaf, 0xf4, 0xbf, 0xb4, + 0xbf, 0x9a, 0x9a, 0xb0, 0xf4, 0xf4, 0xe2, 0xf4, + 0xe2, 0xf4, 0xe2, 0xf4, 0xf4, 0xe2, 0xbf, 0xf4, + 0xe2, 0xe2, 0x8d, 0xe2, 0xf4, 0x8d, 0x9a, 0x93, + 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0x93, 0xbb, 0xbf, + 0xe2, 0xbb, 0xbf, + 0x8b, 0x9c, 0x97, 0x81, 0xbd, 0x6f, 0x93, 0xf3, + 0x12, 0xb1, 0x4, 0x83, 0x3a, 0x5d, 0x2c, 0x52, + 0x65, 0x1, 0x8c, 0x1, 0xa6, 0x73, 0xa4, 0x5, + 0xb5, 0x62, 0x76, 0xd1, 0x4d, 0x76, 0x78, 0x62, + 0xa, 0xd1, 0x23, 0xd1, 0x76, 0x87, 0x3b, 0x3b, + 0x29, 0x58, 0xb5, 0xa, 0x6d, 0xb5, 0x87, 0x2f, + 0x79, 0x63, 0x19, 0x4a, 0x19, 0x19, 0x19, 0x5b, + 0x73, 0xf0, 0x19, 0x42, 0xd2, 0xe, 0x19, 0xe9, + 0xd2, 0x4a, 0x4a, 0x4a, 0x19, 0x4a, 0x4a, 0x63, + 0x89, 0xa5, 0x79, 0x41, 0x8, 0x1b, 0x19, 0x63, + 0x63, 0x4a, 0x4a, 0x19, 0x1b, 0x19, 0x63, 0x63, + 0x79, 0x30, 0x67, 0x5, 0x58, 0x67, 0x5a, 0x8a, + 0x29, 0x62, 0x29, 0x62, 0x62, 0x76, 0x4d, 0x62, + 0xe3, 0x8c, 0xa8, 0x8, 0x58, 0xad, 0xa0, 0xa4, + 0x5, 0xda, 0x41, 0x82, 0xd1, 0xa, 0xa, 0xa, + 0x29, 0x3b, 0x68, 0x42, 0x2f, 0xc2, 0xd5, 0xd5, + 0x77, 0x4e, 0x2c, 0x2c, 0x91, 0x92, 0xc, 0x80, + 0xc, 0x92, 0xc, 0xc1, 0xeb, 0x80, 0x3c, 0x80, + 0x2b, 0x2b, 0x2b, 0x3c, 0xc, 0xc, 0xc, 0x92, + 0xd, 0xd, 0x80, 0xd0, 0xa2, 0xa2, 0xea, 0x80, + 0xb, 0x80, 0x1d, 0x49, 0xa8, 0x59, 0x2f, 0x8, + 0x2f, 0xd3, 0x76, 0x76, 0x23, 0x23, 0x23, 0x76, + 0x37, 0x37, 0x29, 0x29, 0x16, 0x16, 0x23, 0x16, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0xa, 0x76, + 0x5e, 0x37, 0x62, 0x29, 0xac, 0xd1, 0xa, 0x1c, + 0xb5, 0x1c, 0xb5, 0x67, 0x5c, 0x77, 0x8f, 0x2a, + 0xd5, 0x8f, 0xd5, 0xd5, 0x8f, 0x6e, 0x42, 0xe, + 0x8f, 0xef, 0xd7, 0xd5, 0x77, 0xef, 0xef, 0xef, + 0xef, 0xef, 0xd5, 0x6e, 0xd5, 0xd5, 0x63, 0x6e, + 0x42, 0xf1, 0x8c, 0xe3, 0x5e, 0x4d, 0x62, 0x1c, + 0x58, 0x68, 0xda, 0xda, 0x58, 0xb5, 0xac, 0x4d, + 0x17, 0x1d, 0x91, 0x3c, 0x56, 0xb7, 0xb6, 0xb7, + 0xf, 0x1d, 0xa8, 0x87, 0x49, 0x3e, 0x91, 0x91, + 0xf, 0x52, 0x61, 0xac, 0x55, 0xc3, 0xd4, 0x4f, + 0x81, 0xc6, 0xe4, 0xbf, 0x4b, 0xe1, 0xf4, 0xb4, + 0x9a, 0x74, 0xc6, 0xe1, 0xe4, 0x81, 0xc6, 0x4b, + 0xb4, 0xbf, 0xf4, 0xb4, 0x4b, 0xdf, 0xb4, 0xb4, + 0xb4, 0x7, 0x4b, 0xe4, 0xbf, 0xb4, 0xbf, 0xbf, + 0x4b, 0xbb, 0xe2, 0xe2, 0xb4, 0xc6, 0x7, 0xf4, + 0xbf, 0x9a, 0xc6, 0x20, 0xf4, 0xf4, 0xf4, 0xe2, + 0xf4, 0xbf, 0xf4, 0xe2, 0xb4, 0x7, 0x57, 0x84, + 0xbf, 0x7, 0x75, 0x99, 0x6f, 0xbf, 0xe2, 0xf4, + 0x95, 0xbf, 0xb4, 0xf4, 0x8d, 0xe2, 0x7, 0x9a, + 0xf4, 0xe2, 0xe2, 0xe2, 0x95, 0xf4, 0xe2, 0x44, + 0xe2, 0xf4, 0x9a, 0xbb, 0xe2, 0xbf, 0x93, 0xbb, + 0xe2, 0xbb, 0x97, 0xbf, 0xe2, 0x93, 0x97, 0x93, + 0x12, 0x93, 0x93, 0xc0, 0xbf, 0x95, 0xbf, 0xe2, + 0xf4, 0x97, 0xe2, + 0x75, 0xde, 0xc0, 0xe4, 0xbf, 0xf3, 0xe4, 0xe4, + 0x85, 0x9b, 0xde, 0x57, 0xb, 0x7a, 0x4e, 0xa8, + 0xa8, 0xa7, 0x65, 0x8c, 0xa4, 0xa4, 0xc9, 0xb3, + 0x55, 0xac, 0x78, 0xac, 0xd3, 0xd3, 0x78, 0x76, + 0xa, 0x23, 0x23, 0xa, 0xa, 0x6d, 0xda, 0x41, + 0xe3, 0x58, 0xe3, 0x6d, 0xe3, 0xe3, 0x41, 0x67, + 0x42, 0x19, 0xd7, 0xef, 0x4a, 0xe9, 0xd5, 0xe9, + 0xa5, 0x77, 0x19, 0x6e, 0x19, 0x4a, 0x19, 0x89, + 0x63, 0xd5, 0xd7, 0xef, 0x4a, 0xe, 0xd5, 0xc2, + 0xd2, 0xa5, 0xe9, 0x73, 0x89, 0xef, 0x6e, 0xa5, + 0xd2, 0xc2, 0x19, 0xe7, 0xd2, 0x5d, 0xe9, 0x63, + 0x79, 0x79, 0xe9, 0x73, 0x30, 0x5b, 0x1, 0x58, + 0x62, 0xa, 0xa, 0x78, 0x62, 0x66, 0x55, 0x5e, + 0xe3, 0xc7, 0xe8, 0x60, 0xa6, 0xad, 0xa4, 0x87, + 0x82, 0xb5, 0x82, 0x4d, 0x23, 0xa, 0x29, 0x29, + 0x1c, 0x30, 0xf1, 0x79, 0x2f, 0xc9, 0x60, 0x5d, + 0x2c, 0x92, 0x1d, 0x1f, 0x1d, 0x92, 0xc, 0x3c, + 0x33, 0x56, 0xaa, 0x2b, 0xdc, 0x3c, 0xaa, 0x5f, + 0x3c, 0xc, 0xc, 0x5f, 0xaa, 0xc1, 0x3c, 0x2b, + 0xd, 0x38, 0xc1, 0x2b, 0xea, 0xea, 0x5f, 0x56, + 0x92, 0x92, 0x1d, 0x1d, 0x59, 0xc9, 0x42, 0xe7, + 0xf1, 0x82, 0x62, 0xd1, 0x23, 0x23, 0xa, 0x62, + 0xf2, 0x37, 0x6, 0x16, 0x3b, 0x3b, 0x3b, 0x16, + 0xa, 0x23, 0x23, 0x0, 0xd1, 0x23, 0xd1, 0x76, + 0x76, 0x76, 0x78, 0xbe, 0xd3, 0x78, 0x1c, 0x58, + 0xab, 0x24, 0x58, 0xa0, 0xc9, 0x60, 0xd2, 0xd5, + 0xd9, 0xc9, 0xe, 0xef, 0xe5, 0x8f, 0x1b, 0x1b, + 0xc5, 0xd5, 0x19, 0x77, 0xc9, 0xd5, 0xd5, 0xd7, + 0xe5, 0xc2, 0x63, 0x63, 0x4a, 0x19, 0x19, 0x1b, + 0xf1, 0x41, 0x1a, 0xa, 0x78, 0x76, 0xa, 0x24, + 0xa8, 0x2f, 0x68, 0x68, 0x87, 0xd3, 0x82, 0x37, + 0x65, 0x1f, 0xb8, 0xb8, 0x92, 0x9e, 0x9e, 0x56, + 0x1d, 0x92, 0xb8, 0x52, 0xa8, 0x2c, 0xd6, 0x91, + 0x1d, 0x66, 0x78, 0xbe, 0xa7, 0x9e, 0xd4, 0x7d, + 0x1e, 0xde, 0xe1, 0xc6, 0x39, 0x18, 0x84, 0xb4, + 0xe1, 0x83, 0x9c, 0xc0, 0xbd, 0x93, 0xf3, 0xdf, + 0xc0, 0xbd, 0xe1, 0xbf, 0xc4, 0x1e, 0xc6, 0xf4, + 0xe4, 0xdd, 0x81, 0x81, 0xf3, 0x12, 0xf4, 0xe4, + 0x9c, 0xbf, 0xbf, 0xf4, 0xc0, 0x81, 0xc6, 0xbf, + 0xf3, 0xbb, 0xf4, 0xc6, 0xc0, 0xbf, 0xe2, 0x8d, + 0xf3, 0xb4, 0x9a, 0xb4, 0x9, 0xc6, 0xfa, 0x4, + 0x4, 0x32, 0x32, 0x9c, 0x4, 0xbf, 0xb4, 0xb4, + 0x97, 0x97, 0x9a, 0x32, 0x93, 0xb4, 0xf4, 0x93, + 0x93, 0xf4, 0xf4, 0xbf, 0x93, 0xe2, 0xf4, 0xf4, + 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, 0x95, 0x32, 0x93, + 0xe2, 0xbf, 0x93, 0xf4, 0xe2, 0x93, 0x93, 0x93, + 0x20, 0x93, 0x8e, 0xf4, 0xe2, 0x44, 0xc0, 0xe2, + 0xe2, 0xe2, 0xe2, + 0xb4, 0xbf, 0xc6, 0x4b, 0xc6, 0xb4, 0xf4, 0x9a, + 0x74, 0x40, 0xc6, 0xfa, 0xf6, 0xf6, 0x39, 0x4f, + 0x7f, 0xa3, 0x1, 0x82, 0x94, 0x94, 0x52, 0x55, + 0x55, 0x61, 0x4d, 0xab, 0x49, 0xab, 0x82, 0xe3, + 0x4d, 0xa, 0xd1, 0xd1, 0xa, 0x78, 0x76, 0xf2, + 0x4d, 0x24, 0x6d, 0x8a, 0x58, 0x58, 0xb5, 0xda, + 0x8, 0xd2, 0xc5, 0x6e, 0x77, 0x2f, 0xa8, 0x60, + 0x6e, 0xa5, 0xc9, 0x1b, 0x6e, 0x4a, 0xd7, 0x11, + 0xc2, 0xd5, 0x77, 0xa5, 0xd2, 0xa5, 0x60, 0xd2, + 0x63, 0xd5, 0x6e, 0xf0, 0x5b, 0xc2, 0x19, 0x6e, + 0x63, 0x96, 0x49, 0x2f, 0x42, 0xe7, 0x42, 0x96, + 0x6e, 0x19, 0xef, 0x89, 0x89, 0x73, 0xf1, 0x58, + 0x29, 0xa, 0xa, 0xa, 0x6d, 0x5e, 0x61, 0xac, + 0x5e, 0x60, 0x3e, 0x7a, 0x73, 0xc3, 0x65, 0xe3, + 0x8a, 0x82, 0x4d, 0xa, 0x62, 0x78, 0x78, 0xa, + 0x1c, 0x58, 0x67, 0x2f, 0x5b, 0x68, 0x8c, 0x1, + 0x67, 0xb8, 0x52, 0xab, 0x49, 0x91, 0x3f, 0x1d, + 0x56, 0xb7, 0x5f, 0xc, 0xc, 0x5f, 0xf, 0xf, + 0x92, 0x3c, 0xc, 0xb7, 0xb7, 0x33, 0xc, 0xc, + 0x3c, 0xaa, 0xb7, 0xaa, 0xc, 0x5f, 0xf, 0x17, + 0x1f, 0x59, 0x60, 0x2f, 0x59, 0xc3, 0x5a, 0x1, + 0x1, 0xe3, 0xa, 0x23, 0x23, 0x23, 0x29, 0x62, + 0xa, 0x23, 0x3b, 0x87, 0x1c, 0xd1, 0x16, 0x23, + 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, 0xd1, 0xa, + 0xa, 0x62, 0x78, 0x29, 0x78, 0xa, 0x1c, 0x8c, + 0x52, 0x58, 0x89, 0x6e, 0x6e, 0x63, 0x6e, 0x11, + 0xc5, 0x2f, 0xa5, 0x63, 0xa5, 0xd2, 0x19, 0x42, + 0xa5, 0xd5, 0x63, 0x19, 0x19, 0x19, 0x4a, 0x4a, + 0x19, 0x19, 0x63, 0x19, 0xd5, 0xd2, 0x63, 0x8, + 0x8c, 0x8c, 0x1c, 0x1c, 0x29, 0xa, 0x1c, 0xd3, + 0xd3, 0x6d, 0x6d, 0xb5, 0xac, 0x37, 0x37, 0x65, + 0xb6, 0x9e, 0x33, 0x38, 0x38, 0xb8, 0xa8, 0x9e, + 0x1d, 0x52, 0x52, 0x52, 0x64, 0x2c, 0x3e, 0x51, + 0x50, 0xab, 0x82, 0x65, 0xa4, 0xa6, 0xc9, 0x27, + 0x47, 0x3a, 0x9d, 0x81, 0xb1, 0x47, 0xd8, 0xbf, + 0x93, 0x97, 0xbd, 0xb4, 0x6f, 0x4, 0xd8, 0xdd, + 0x8e, 0x47, 0x9f, 0xc0, 0x97, 0x4, 0xe4, 0xe4, + 0x93, 0xf3, 0xf3, 0xf3, 0x97, 0x8e, 0x57, 0xe4, + 0x97, 0x12, 0xe4, 0xb4, 0x93, 0x93, 0xbf, 0x12, + 0x93, 0xc0, 0xcd, 0x12, 0x93, 0xc0, 0x7, 0xe4, + 0x97, 0xe4, 0xb4, 0xdd, 0x97, 0xc0, 0x9, 0xfd, + 0x4, 0x47, 0xe5, 0x9b, 0x4, 0x32, 0x70, 0x47, + 0x97, 0xbb, 0xaf, 0x97, 0x69, 0xbf, 0x20, 0x93, + 0x93, 0xf4, 0xf4, 0x93, 0x93, 0xf4, 0xbb, 0x12, + 0x93, 0xf4, 0xe2, 0xc0, 0x44, 0xe2, 0xf4, 0xe2, + 0xbb, 0x44, 0xe2, 0xe2, 0xf4, 0xf4, 0xf4, 0xf4, + 0xe2, 0xf4, 0x12, 0xf4, 0x44, 0xe2, 0xe2, 0xe2, + 0xe2, 0x44, 0x44, + 0xe4, 0x97, 0x8e, 0xdd, 0x40, 0xfd, 0x32, 0xb4, + 0xf5, 0x4, 0x4, 0x4, 0x4, 0xe5, 0x47, 0x83, + 0x98, 0x91, 0xa8, 0xa8, 0x52, 0x8c, 0x82, 0x87, + 0xbe, 0x4d, 0x37, 0x82, 0x8c, 0xd3, 0xac, 0x4d, + 0x6d, 0x78, 0x76, 0x37, 0xd1, 0x37, 0xa, 0xd1, + 0xa, 0x76, 0x78, 0x62, 0x41, 0x62, 0x1c, 0x8a, + 0x58, 0x67, 0xa5, 0x63, 0x63, 0x1b, 0x42, 0x89, + 0x42, 0x79, 0x67, 0xae, 0x63, 0x63, 0xd5, 0x4a, + 0x63, 0xd2, 0xe9, 0x63, 0x63, 0x63, 0x67, 0x8, + 0x63, 0xd2, 0xf1, 0x89, 0x89, 0xf1, 0x79, 0x6e, + 0x19, 0xd2, 0x1b, 0x89, 0x63, 0x63, 0x42, 0x8, + 0xd2, 0xe9, 0xd2, 0xf1, 0x1b, 0xf1, 0x2f, 0xf1, + 0x30, 0x30, 0x5, 0xda, 0x58, 0x62, 0x76, 0x62, + 0x6d, 0xe3, 0xd3, 0xd3, 0x67, 0x67, 0x58, 0x58, + 0xa4, 0xa0, 0xda, 0x6d, 0x3b, 0x29, 0xd1, 0xa, + 0xa, 0xa, 0xa, 0x4d, 0x87, 0x8, 0x2f, 0xa4, + 0x96, 0x1b, 0x42, 0x2f, 0x8c, 0x1, 0x1a, 0x52, + 0x1f, 0xf, 0xf, 0xf, 0x5f, 0xc, 0x5f, 0xf, + 0x56, 0xaa, 0xaa, 0x5f, 0xaa, 0xaa, 0xf, 0xb6, + 0xf, 0xf, 0x5f, 0xf, 0xaa, 0x33, 0x1d, 0x64, + 0xa8, 0x59, 0xa0, 0x2f, 0x66, 0x41, 0xe3, 0x5e, + 0xac, 0xf2, 0x76, 0x23, 0xa, 0x16, 0x3b, 0x29, + 0xa, 0x3b, 0x3b, 0x29, 0xd1, 0x23, 0x0, 0x0, + 0x23, 0x23, 0x23, 0xa, 0xa, 0xa, 0x16, 0x1c, + 0x62, 0x62, 0x62, 0x62, 0x76, 0x78, 0x78, 0xac, + 0x6d, 0x68, 0x63, 0xd5, 0xd5, 0x19, 0x19, 0x19, + 0xe9, 0xf1, 0x63, 0x1b, 0xa5, 0xe, 0x63, 0x19, + 0x63, 0x6e, 0x63, 0x4a, 0x8f, 0x4a, 0x19, 0x19, + 0x1b, 0xd2, 0x19, 0x19, 0x42, 0x8, 0x2f, 0x67, + 0x41, 0x8a, 0x6d, 0xda, 0xd3, 0x29, 0xd3, 0xbe, + 0xac, 0xa, 0x78, 0xe3, 0x4d, 0x76, 0xe3, 0xb8, + 0x92, 0xaa, 0x33, 0x33, 0x56, 0x5f, 0x5f, 0x5f, + 0xb6, 0x52, 0x2c, 0x2c, 0xa8, 0x1, 0xc9, 0xfb, + 0x3e, 0x52, 0xab, 0xad, 0x68, 0xa8, 0x2a, 0x1e, + 0x1e, 0x27, 0xd8, 0xbb, 0xf3, 0xed, 0xc6, 0xdf, + 0x81, 0xc0, 0xe4, 0xc6, 0x99, 0x8b, 0x53, 0xe1, + 0xbd, 0xdf, 0x90, 0xc6, 0xf3, 0xe2, 0xe4, 0xf8, + 0xdf, 0x12, 0x9a, 0xb4, 0xc4, 0x83, 0xd8, 0xe4, + 0xf3, 0xe4, 0x81, 0x81, 0xc0, 0xbf, 0xe2, 0xb4, + 0xc6, 0xb4, 0x57, 0x7, 0x12, 0xbf, 0xc6, 0xbf, + 0xaf, 0xbb, 0xe2, 0xc6, 0xe4, 0xb4, 0xf4, 0xe1, + 0x7d, 0xc9, 0x88, 0xfd, 0x8e, 0x8d, 0xfa, 0xbb, + 0xbf, 0xf4, 0xe2, 0xbf, 0xaf, 0xe2, 0xf4, 0xf4, + 0xf4, 0x20, 0xf4, 0xf4, 0xf4, 0x44, 0xe2, 0xf4, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, 0xf4, + 0xe2, 0xf4, 0xf4, 0xe2, 0xf4, 0x12, 0xfd, 0x26, + 0xf4, 0xf4, 0x12, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0xe2, + 0x40, 0x3a, 0x4, 0xf3, 0xf3, 0x6f, 0x9c, 0xbd, + 0xf3, 0x4, 0x4, 0xe5, 0xd7, 0xd7, 0x9c, 0xd8, + 0xa9, 0xa5, 0x2a, 0x88, 0x2a, 0xc9, 0xc9, 0xc9, + 0x67, 0xb5, 0x78, 0x78, 0x4d, 0x76, 0x76, 0x76, + 0x76, 0x23, 0x23, 0x62, 0x62, 0xa, 0x62, 0x16, + 0x16, 0xa, 0xa, 0x29, 0x8a, 0x62, 0xa, 0x1c, + 0xd3, 0xb5, 0x68, 0x1b, 0x63, 0x19, 0x63, 0x63, + 0x63, 0x67, 0x41, 0x8, 0x63, 0x79, 0x2f, 0xe, + 0x19, 0x19, 0x6e, 0x42, 0x63, 0xe, 0x63, 0x89, + 0x63, 0x79, 0x67, 0xf1, 0x1b, 0x2d, 0x8, 0x79, + 0x63, 0x4a, 0x19, 0x1b, 0x89, 0x19, 0xd2, 0x79, + 0x1b, 0x73, 0x67, 0x8, 0x63, 0x19, 0x1b, 0x73, + 0xf1, 0x8, 0x8c, 0xe3, 0x24, 0x62, 0xa, 0xa, + 0x76, 0xa, 0xa, 0xa, 0x41, 0x49, 0x52, 0xb3, + 0x45, 0x73, 0x2f, 0x8c, 0x82, 0xa, 0x62, 0x62, + 0xd1, 0x23, 0xa, 0x62, 0xb5, 0x67, 0x67, 0x30, + 0xa0, 0x42, 0x5a, 0xab, 0x66, 0x66, 0x66, 0x17, + 0xf, 0x5f, 0xf, 0xb6, 0x1f, 0xaa, 0xc, 0x5f, + 0xb7, 0xb7, 0xf, 0x5f, 0x5f, 0xf, 0xf, 0xf, + 0xf, 0xc, 0xaa, 0xb6, 0xb6, 0x9e, 0x3f, 0x5f, + 0x1d, 0xa7, 0x65, 0xbe, 0xab, 0xa7, 0x8c, 0x62, + 0xd1, 0xd1, 0xd1, 0x23, 0x23, 0xa, 0x16, 0x78, + 0xa, 0x4d, 0x29, 0xa, 0x23, 0x23, 0x23, 0x23, + 0x23, 0xa, 0xa, 0xd1, 0x62, 0x29, 0xa, 0x4d, + 0x4d, 0x78, 0xb5, 0x29, 0x78, 0x29, 0xda, 0xda, + 0x58, 0x2f, 0xa5, 0xc5, 0x19, 0xc2, 0xc2, 0x6e, + 0x50, 0xc5, 0x19, 0x6e, 0x6e, 0xd5, 0x8f, 0xef, + 0x8f, 0x1b, 0x1b, 0xef, 0x77, 0xc5, 0x1b, 0x6e, + 0xe9, 0x1b, 0x63, 0x19, 0x42, 0x5, 0x8a, 0x58, + 0xa, 0x62, 0xa, 0xd3, 0x61, 0xd3, 0x66, 0x17, + 0x66, 0xd3, 0x87, 0x60, 0x87, 0xbe, 0x55, 0x1f, + 0x92, 0xf, 0xb7, 0x1f, 0xf, 0xaa, 0xc, 0x91, + 0xb8, 0xa8, 0x91, 0x48, 0xc7, 0xa7, 0x59, 0x7f, + 0x91, 0x52, 0x66, 0xa7, 0x59, 0xc9, 0x18, 0xc6, + 0x81, 0xdf, 0xc6, 0xb4, 0xbf, 0xb4, 0xe1, 0x81, + 0xe4, 0xe1, 0x7, 0xe1, 0x81, 0xf5, 0xe4, 0xb4, + 0xe4, 0xe4, 0xf3, 0xbf, 0xbf, 0xaf, 0xf4, 0xbf, + 0xbf, 0xbf, 0x9a, 0x9a, 0xb4, 0xe4, 0xcc, 0xaf, + 0xbf, 0x95, 0xe4, 0xb4, 0x95, 0xf4, 0x9a, 0x9a, + 0xbf, 0xbf, 0xf4, 0xf4, 0xe2, 0xb4, 0xbf, 0xbf, + 0xf4, 0xe2, 0xf4, 0xf4, 0xb4, 0xf4, 0x7, 0xbc, + 0x75, 0x93, 0xe4, 0xe1, 0xbf, 0xaf, 0xf4, 0xbf, + 0xbf, 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0x9a, + 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xbb, 0x93, 0x95, + 0xf4, 0xf4, 0x32, 0xe4, 0xf4, 0x93, 0x97, 0xbf, + 0x93, 0x93, 0x93, 0xc0, 0xe2, 0xf4, 0xc0, 0xe2, + 0xe2, 0xe2, 0xdd, + 0x90, 0x6b, 0xc0, 0xf4, 0xbf, 0xed, 0xdf, 0xc4, + 0xb4, 0xde, 0x1e, 0x7d, 0x7d, 0x53, 0x9f, 0x84, + 0x90, 0x39, 0x90, 0x85, 0xe1, 0x8b, 0x7f, 0xc9, + 0x1d, 0x52, 0x66, 0x66, 0x61, 0xf2, 0x76, 0x37, + 0x76, 0x23, 0x23, 0xd1, 0x37, 0x76, 0x76, 0x6d, + 0x37, 0xa, 0x62, 0xd1, 0x41, 0x6d, 0x29, 0xe3, + 0x1c, 0x41, 0x58, 0x8, 0x63, 0xd5, 0xd7, 0xd5, + 0x89, 0xf1, 0xa6, 0x63, 0xc2, 0x8, 0x8, 0xa5, + 0x19, 0xd5, 0xc5, 0x96, 0x1b, 0x79, 0x5d, 0xe9, + 0x63, 0xc2, 0x79, 0xe, 0x19, 0xf0, 0x8, 0x73, + 0x63, 0xd2, 0x50, 0x96, 0x1b, 0x77, 0x2c, 0xa5, + 0x6e, 0x1b, 0x5b, 0x1b, 0xef, 0xd5, 0xe9, 0x73, + 0xf0, 0x67, 0xd3, 0xa, 0x76, 0x62, 0x76, 0x62, + 0xe3, 0x6d, 0x78, 0xa, 0x62, 0x82, 0x55, 0xbe, + 0xc3, 0xa8, 0x49, 0xab, 0xe3, 0x82, 0x4d, 0x6d, + 0x16, 0x3b, 0xa, 0x23, 0xa, 0x62, 0xb5, 0x6d, + 0x8c, 0xc3, 0xab, 0xab, 0x66, 0x17, 0x17, 0x66, + 0xf, 0x5f, 0xb6, 0xb6, 0x17, 0xf, 0x5f, 0xb6, + 0xb6, 0xb6, 0xb6, 0xf, 0xb6, 0xf, 0xb6, 0xb6, + 0xf, 0x5f, 0x5f, 0xb6, 0xb6, 0xb6, 0xf, 0xf, + 0xf, 0x1f, 0x82, 0x87, 0xa7, 0x59, 0x87, 0x78, + 0xd1, 0x76, 0x34, 0x23, 0x23, 0x23, 0x23, 0xd1, + 0x78, 0x78, 0x29, 0xa, 0x23, 0x23, 0x16, 0x16, + 0x6d, 0xa, 0xd1, 0xd1, 0xd1, 0xd1, 0x76, 0xa, + 0x62, 0x4d, 0xe3, 0xe3, 0x6d, 0xb5, 0x8, 0x8, + 0xa6, 0x8, 0x1b, 0xc5, 0x77, 0x77, 0x6e, 0xe, + 0x7a, 0xe, 0x6e, 0x63, 0xc2, 0x19, 0x19, 0xef, + 0xd5, 0x7a, 0xe9, 0x19, 0x77, 0xe, 0x19, 0x19, + 0x63, 0x6e, 0x63, 0x6e, 0x42, 0x67, 0x8a, 0x1c, + 0xa, 0x76, 0x6d, 0x4d, 0x37, 0xac, 0x66, 0x52, + 0x66, 0x55, 0x52, 0xb8, 0x1d, 0x17, 0x66, 0xb6, + 0xf, 0xb6, 0xf, 0xf, 0xb7, 0x56, 0xaa, 0x7e, + 0x8b, 0x3e, 0xa8, 0x59, 0x52, 0x8c, 0x49, 0x91, + 0x52, 0x66, 0x82, 0x58, 0xc9, 0xd4, 0x88, 0x71, + 0xb1, 0x97, 0xdd, 0xe1, 0xdd, 0xde, 0x81, 0xe1, + 0xf3, 0xbd, 0x81, 0xdd, 0xdd, 0x93, 0xf3, 0xe4, + 0xf3, 0xf3, 0xe4, 0x7, 0xf3, 0x8d, 0xb4, 0xbf, + 0xe4, 0xf3, 0x95, 0xbf, 0xc0, 0xf3, 0xbf, 0xbf, + 0xdd, 0x12, 0xb4, 0xe1, 0x12, 0xf3, 0xe4, 0xe4, + 0xc0, 0xbb, 0x95, 0xbf, 0x12, 0xbf, 0xe2, 0xf4, + 0xc0, 0xaf, 0xf4, 0x9a, 0xb4, 0xe4, 0xe1, 0xfd, + 0x9c, 0x4, 0x97, 0x4, 0x9c, 0x8d, 0xe2, 0xb4, + 0xfd, 0xcc, 0xf4, 0x12, 0x93, 0xf4, 0xf4, 0xbb, + 0x93, 0x44, 0xf4, 0x12, 0x93, 0xf4, 0xe2, 0x97, + 0xf4, 0xf4, 0xe2, 0xf4, 0xb4, 0xe2, 0x97, 0xbb, + 0x44, 0xf4, 0x93, 0x93, 0xe2, 0x93, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x12, 0xe2, 0xe2, 0x12, 0xe2, + 0xe2, 0x44, 0xf3, + 0xb4, 0xdd, 0xb4, 0xe2, 0xf4, 0xb4, 0x81, 0xe4, + 0x9a, 0xbc, 0xcb, 0xdf, 0x9c, 0x81, 0xc6, 0xe4, + 0xb4, 0x81, 0xe1, 0xe1, 0x9a, 0xba, 0xc1, 0x91, + 0x91, 0xb6, 0x1f, 0x65, 0x65, 0x61, 0x62, 0x37, + 0x76, 0x23, 0x23, 0x0, 0xd1, 0x23, 0x76, 0xf2, + 0x76, 0x76, 0xa, 0x16, 0xa, 0x62, 0xfe, 0x1c, + 0xe3, 0xe3, 0xb5, 0x8c, 0xf1, 0x2f, 0xd5, 0x6e, + 0x4a, 0xd2, 0x19, 0x6e, 0x19, 0x63, 0x5b, 0x19, + 0x6e, 0xc5, 0x2f, 0x2f, 0x2f, 0xa8, 0x2f, 0xa5, + 0x4a, 0x19, 0x4a, 0x4a, 0xd5, 0x19, 0x89, 0x42, + 0x63, 0x79, 0x67, 0x67, 0x63, 0xa5, 0xa8, 0x2f, + 0x19, 0x4a, 0x4a, 0x4a, 0x63, 0x6e, 0xd2, 0xe9, + 0x2, 0x67, 0x1c, 0xa, 0xa, 0x23, 0x62, 0x78, + 0xe3, 0x24, 0x62, 0xa, 0x1c, 0x1c, 0xb5, 0x76, + 0xd3, 0xa7, 0x65, 0xbe, 0x68, 0x68, 0x3b, 0x16, + 0x3b, 0x5, 0x16, 0xa, 0x29, 0x76, 0xa, 0x76, + 0x4d, 0x8c, 0xd3, 0x5e, 0xab, 0x1, 0xab, 0x55, + 0x66, 0x52, 0x17, 0x66, 0x66, 0xb6, 0x17, 0xb6, + 0xf, 0xf, 0xb7, 0xb7, 0x5f, 0xb7, 0x5f, 0xb6, + 0xb6, 0xb6, 0xb6, 0x1f, 0x1f, 0x1f, 0x61, 0x17, + 0x66, 0x87, 0x8c, 0x82, 0x82, 0x82, 0x6d, 0xa, + 0x23, 0xa, 0x76, 0x0, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x76, 0xd1, 0x0, 0x23, 0xa, 0xd1, + 0xd1, 0xd1, 0xa, 0xa, 0x62, 0x76, 0xa, 0xa, + 0x78, 0x62, 0x1c, 0x29, 0xe3, 0xda, 0x30, 0x96, + 0xe7, 0xf1, 0x1b, 0x63, 0x1b, 0x1b, 0x19, 0x63, + 0x8, 0x30, 0x79, 0x63, 0x77, 0xa5, 0x2f, 0xd2, + 0xa5, 0xf1, 0x1b, 0x6e, 0x1b, 0x1b, 0x6e, 0x63, + 0xf1, 0x2f, 0xf1, 0xf1, 0x41, 0x41, 0xa, 0xa, + 0xa, 0x62, 0x41, 0x8a, 0x62, 0x76, 0x37, 0xac, + 0x61, 0x61, 0x66, 0x9e, 0xf, 0x1d, 0xb6, 0xb6, + 0xb6, 0xb6, 0x1d, 0x92, 0xb8, 0xb7, 0x56, 0xd6, + 0x98, 0x49, 0x52, 0x65, 0x82, 0x8c, 0xa8, 0x4e, + 0x59, 0x24, 0xb5, 0x68, 0x42, 0xc9, 0x6e, 0x27, + 0x47, 0x4, 0xfd, 0x40, 0x99, 0x9c, 0xdd, 0xe4, + 0x93, 0x6f, 0xf5, 0xe4, 0x97, 0x4, 0xc6, 0x90, + 0x6f, 0x4, 0xf8, 0x81, 0xc4, 0xdf, 0xb4, 0xaf, + 0x93, 0x93, 0xdf, 0x81, 0x93, 0x93, 0xbf, 0xc6, + 0x9c, 0x93, 0xe4, 0x81, 0x93, 0x9c, 0xe4, 0xf3, + 0x93, 0x93, 0xbf, 0xc6, 0x93, 0xc0, 0xb4, 0x85, + 0x4, 0xb4, 0xf4, 0xbf, 0x97, 0x93, 0x9c, 0x4, + 0x4, 0x4, 0x4, 0x5b, 0x5b, 0x32, 0xb4, 0xfd, + 0x4, 0x93, 0xbf, 0x97, 0x93, 0xbf, 0xe2, 0x97, + 0x93, 0xbb, 0xe2, 0x93, 0x69, 0xf4, 0xe2, 0x93, + 0x12, 0xe2, 0xe2, 0x12, 0xf4, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xf4, 0xe2, 0xf4, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, + 0x44, 0xe2, 0x44, + 0xf3, 0xfd, 0xfd, 0x81, 0xc6, 0x9d, 0x1e, 0xe4, + 0x81, 0x6b, 0x7b, 0xb4, 0x9, 0x6f, 0xf5, 0x81, + 0xde, 0x47, 0x9d, 0xf6, 0x90, 0x27, 0x2a, 0x18, + 0x4e, 0xa7, 0x66, 0x52, 0xab, 0xac, 0x37, 0xf2, + 0xd1, 0xd1, 0xa, 0xa, 0x23, 0xd1, 0x76, 0xd1, + 0xd1, 0xd1, 0x16, 0xd1, 0xa, 0xa, 0xd1, 0x62, + 0xd1, 0x62, 0xb5, 0x8, 0x8, 0x30, 0x1b, 0x19, + 0x63, 0x2f, 0x42, 0x1b, 0x1b, 0xf1, 0xd2, 0xa5, + 0xd5, 0x19, 0xe, 0x1b, 0x89, 0x89, 0x73, 0x63, + 0x63, 0x19, 0xc2, 0xd2, 0x42, 0xd2, 0x63, 0xe9, + 0x19, 0x6e, 0x1b, 0x89, 0x63, 0x42, 0x67, 0x8, + 0x19, 0xe, 0x79, 0x2f, 0xd2, 0x89, 0x63, 0x79, + 0xd2, 0x5b, 0x30, 0x5, 0x8a, 0x1c, 0xa, 0xa, + 0x62, 0x78, 0x62, 0xd1, 0x23, 0xa, 0xa, 0x41, + 0x67, 0x5b, 0x68, 0x30, 0x8, 0x2f, 0xe3, 0xbe, + 0x4d, 0x4d, 0x76, 0xa, 0x29, 0x6d, 0x78, 0x6d, + 0x58, 0x30, 0x5, 0x6d, 0x4d, 0x5e, 0x5e, 0x76, + 0xac, 0x61, 0x66, 0xd3, 0x52, 0x17, 0x55, 0x61, + 0x1f, 0x5f, 0x92, 0xb6, 0xb6, 0xb6, 0xb6, 0x17, + 0xb6, 0x17, 0x17, 0x17, 0x52, 0x17, 0x82, 0x87, + 0xbe, 0x8c, 0x8c, 0x37, 0xa, 0x76, 0xa, 0xd1, + 0xd1, 0x76, 0x76, 0xa, 0xa, 0xd1, 0xa, 0x0, + 0x0, 0x23, 0x0, 0x0, 0x0, 0x23, 0x23, 0xa, + 0xd1, 0x23, 0x62, 0xa, 0x16, 0x1c, 0x62, 0x62, + 0xa, 0xa, 0x62, 0xe3, 0xe3, 0xe3, 0x8c, 0x67, + 0xe7, 0x6e, 0x19, 0x63, 0x63, 0x4a, 0x19, 0x6e, + 0x42, 0x30, 0xf1, 0x42, 0xf1, 0x79, 0x89, 0x73, + 0xd2, 0x63, 0x19, 0x4a, 0x19, 0x63, 0x63, 0xd2, + 0x8, 0x8a, 0x8a, 0x23, 0xa, 0xd1, 0xa, 0xe3, + 0x62, 0x67, 0xf1, 0x2f, 0xd3, 0x76, 0x78, 0x61, + 0x76, 0x61, 0x37, 0x61, 0x65, 0x1f, 0xf, 0xb7, + 0x9e, 0xb7, 0xaa, 0x92, 0x3c, 0xf, 0xb7, 0x56, + 0x91, 0x1d, 0x52, 0x61, 0x37, 0x55, 0x60, 0x4f, + 0x4e, 0x94, 0x82, 0xb3, 0xc9, 0x1b, 0xe8, 0x8b, + 0x6f, 0x32, 0xd8, 0xc6, 0x81, 0xf3, 0xbf, 0xb4, + 0xe4, 0xf3, 0x81, 0xe1, 0xf3, 0xdd, 0xc6, 0xc6, + 0x81, 0xe4, 0xe4, 0xbf, 0xe4, 0xc0, 0x95, 0xbf, + 0xbb, 0xc0, 0xbf, 0x95, 0xbb, 0xbf, 0xf4, 0xbf, + 0xe4, 0xe2, 0xbf, 0xbf, 0xbf, 0xe4, 0xe4, 0xe2, + 0xbf, 0xf4, 0xe2, 0xf4, 0xb4, 0xe2, 0xf4, 0xf4, + 0xe2, 0x95, 0xe2, 0xbf, 0xe2, 0xbf, 0xf4, 0xb4, + 0xfd, 0xfd, 0xe1, 0xfd, 0xfd, 0x9a, 0xe2, 0xf4, + 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, + 0xf4, 0xe2, 0x44, 0xe2, 0x20, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0xf4, 0xf4, + 0xe2, 0xe2, 0xe2, 0xf4, 0x8d, 0x12, 0x69, 0x8d, + 0xf4, 0xf4, 0x12, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, + 0xe2, 0x44, 0xe2, + 0xe4, 0xfd, 0x3a, 0x99, 0xf5, 0x93, 0xdd, 0xe4, + 0xdf, 0x9c, 0x32, 0xe4, 0xf3, 0x9c, 0x7d, 0x1e, + 0x32, 0x36, 0x9d, 0x4b, 0x6b, 0x8e, 0x1e, 0xc6, + 0xa9, 0xa8, 0x94, 0x66, 0xac, 0x76, 0x76, 0x76, + 0x76, 0x76, 0x76, 0x76, 0x23, 0x23, 0x76, 0x37, + 0x16, 0xd1, 0xa, 0x23, 0x1c, 0xd1, 0x23, 0xd1, + 0x23, 0xa, 0x41, 0x5a, 0x42, 0x73, 0xe, 0x63, + 0x63, 0x1b, 0xf1, 0x79, 0xa5, 0x41, 0x67, 0x42, + 0x1b, 0x6e, 0xef, 0x4a, 0x4a, 0x63, 0x6e, 0x6e, + 0x6e, 0x19, 0xd2, 0x2, 0x79, 0xf1, 0xd2, 0x11, + 0x6e, 0x19, 0x4a, 0x4a, 0x6e, 0x4a, 0xf0, 0x67, + 0x2d, 0xd2, 0xa5, 0x2f, 0x1b, 0x19, 0x19, 0xc2, + 0x19, 0x4a, 0x4a, 0x89, 0x67, 0x5, 0x29, 0xa, + 0xa, 0xd1, 0xd1, 0xd1, 0xa, 0xa, 0xa, 0x8c, + 0x72, 0xe8, 0x59, 0xb3, 0x8c, 0x1, 0x82, 0xb5, + 0x4d, 0x16, 0x29, 0x29, 0x62, 0xa, 0x29, 0xda, + 0x58, 0x68, 0xda, 0xe3, 0xbe, 0x37, 0x76, 0x37, + 0xbe, 0xbe, 0x66, 0x61, 0x66, 0x17, 0x17, 0x55, + 0x17, 0x5f, 0x5f, 0xf, 0xb6, 0xb6, 0xb6, 0xb6, + 0x17, 0x17, 0x17, 0x17, 0xb6, 0x17, 0x66, 0x4d, + 0xbe, 0x4d, 0x78, 0x76, 0x78, 0x29, 0x23, 0xd1, + 0x16, 0xa, 0xd1, 0xa, 0xa, 0xd1, 0x23, 0x23, + 0x0, 0x23, 0x0, 0x0, 0x23, 0x23, 0x23, 0x23, + 0xa, 0xa, 0x62, 0x29, 0x78, 0xb5, 0x78, 0x76, + 0xd1, 0x37, 0x6d, 0xe3, 0xe3, 0x58, 0x68, 0xa6, + 0x42, 0xd7, 0xef, 0xe5, 0xe5, 0xef, 0xc5, 0xef, + 0xc5, 0xa5, 0xa5, 0x6e, 0x6e, 0xd9, 0x6e, 0xc5, + 0x2f, 0xe9, 0x6e, 0xd7, 0xef, 0x79, 0x2f, 0xf1, + 0x2f, 0x30, 0x41, 0xb5, 0xa, 0x62, 0x62, 0xe3, + 0x4d, 0x5e, 0x52, 0x52, 0x61, 0x52, 0xe6, 0x61, + 0x61, 0x65, 0x17, 0x1f, 0x66, 0x17, 0xb6, 0xf, + 0x5f, 0xf, 0xf, 0xf, 0xc, 0x5f, 0x92, 0xaa, + 0x33, 0x1d, 0xf, 0x52, 0x61, 0x24, 0x87, 0x1d, + 0x1d, 0x66, 0x17, 0x66, 0x87, 0xa5, 0x8b, 0x90, + 0xc4, 0x90, 0x4b, 0xe4, 0xbf, 0xbf, 0xbf, 0x9a, + 0x9a, 0xbf, 0xb4, 0xbc, 0x4b, 0xf4, 0xb4, 0xf4, + 0xbf, 0x95, 0xb4, 0xb4, 0xf4, 0xf4, 0xe2, 0x9a, + 0xe1, 0xbf, 0xf4, 0xe2, 0xaf, 0xbf, 0x95, 0xf4, + 0xf4, 0xbf, 0xb4, 0xbb, 0x95, 0xbf, 0xf4, 0x9a, + 0xe1, 0xe2, 0xf4, 0xf4, 0xf4, 0xbb, 0xf4, 0xf4, + 0xbb, 0xe2, 0xbf, 0xe2, 0x9a, 0xf4, 0xbf, 0x7, + 0x60, 0x39, 0xb4, 0xb4, 0xbf, 0xf4, 0xf4, 0xf4, + 0xf4, 0xe2, 0xe2, 0xf4, 0x9a, 0xe2, 0x44, 0xe2, + 0xf4, 0x20, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0x44, 0xe2, 0xe2, 0xf4, 0xe2, 0x93, 0x95, + 0x44, 0xe2, 0x93, 0xbd, 0xf4, 0x93, 0x93, 0x93, + 0xf4, 0x12, 0x93, 0x12, 0xe2, 0xe2, 0x12, 0xe2, + 0xe2, 0xe2, 0x12, + 0xb4, 0xc6, 0x81, 0xe4, 0xbf, 0xbf, 0xe4, 0xb4, + 0xb4, 0xfa, 0xe1, 0x7, 0xe1, 0xe1, 0x9f, 0xe1, + 0x8d, 0xce, 0xb4, 0xb4, 0xb4, 0xe1, 0x7, 0x75, + 0x57, 0x91, 0x1d, 0x94, 0x61, 0x78, 0xac, 0x76, + 0x76, 0xd1, 0xd1, 0x76, 0x23, 0x23, 0x37, 0x61, + 0x61, 0x37, 0x37, 0x82, 0x4d, 0x76, 0xa, 0x76, + 0xa, 0x62, 0x4d, 0xb3, 0xa8, 0x2f, 0xa5, 0x77, + 0xd2, 0x63, 0x77, 0xa5, 0x79, 0x67, 0x8, 0x6e, + 0xc5, 0xa5, 0xd9, 0x8f, 0xef, 0xd7, 0xef, 0xc5, + 0xd2, 0x4a, 0xd5, 0xe, 0xe9, 0x2f, 0x42, 0x6e, + 0x6e, 0xef, 0x27, 0xc5, 0xa5, 0xd5, 0x77, 0xc7, + 0xa5, 0x1b, 0x6e, 0x6e, 0x19, 0xef, 0xef, 0x6e, + 0x19, 0x11, 0x8f, 0x60, 0x8c, 0x8c, 0x76, 0x1c, + 0x37, 0xd1, 0xa, 0xa, 0xd1, 0x62, 0x62, 0xa, + 0xa8, 0x1d, 0xa8, 0x52, 0x55, 0x52, 0xa7, 0xb3, + 0x8c, 0x58, 0x3b, 0x3b, 0x29, 0x62, 0xa, 0x1c, + 0x4d, 0x4d, 0xbe, 0xb5, 0x61, 0x61, 0x37, 0x4d, + 0xbe, 0x17, 0xbe, 0x4d, 0x66, 0x61, 0x17, 0x1f, + 0x17, 0xb6, 0xf, 0x5f, 0xb6, 0xb6, 0x17, 0x17, + 0xb6, 0xf, 0xb6, 0x61, 0x61, 0x17, 0x61, 0x78, + 0x61, 0xf2, 0x76, 0xd1, 0x76, 0xbe, 0xda, 0x16, + 0x16, 0x29, 0xa, 0xd1, 0x23, 0x23, 0x23, 0x23, + 0x0, 0x23, 0x23, 0x23, 0xd1, 0x1c, 0xd1, 0xa, + 0x23, 0xa, 0x62, 0x76, 0x78, 0xd1, 0x4d, 0x78, + 0xa, 0xbe, 0xa7, 0x41, 0x45, 0xe7, 0x42, 0xf0, + 0x6e, 0x6e, 0xd5, 0xd5, 0xef, 0xd2, 0xe9, 0xc5, + 0xef, 0xe, 0x6e, 0xf0, 0x6e, 0x6e, 0xd5, 0xe, + 0xf0, 0x73, 0xd2, 0x8f, 0x19, 0xd2, 0x2f, 0xb3, + 0xb3, 0x8, 0x67, 0x41, 0xa, 0xa, 0xa, 0x6, + 0x78, 0xe3, 0x78, 0xac, 0xac, 0x61, 0x61, 0xe6, + 0x4d, 0xa8, 0xf, 0x5f, 0xb6, 0xb7, 0xb6, 0x1d, + 0xc, 0xc, 0xf, 0xf, 0x5f, 0xc, 0x92, 0xaa, + 0x38, 0x59, 0xb6, 0x52, 0x94, 0x82, 0xa7, 0x1f, + 0x66, 0x61, 0x76, 0x4d, 0x82, 0x5a, 0x6b, 0x90, + 0x99, 0x7d, 0x9c, 0x81, 0xdd, 0x93, 0xdf, 0x18, + 0xf8, 0x12, 0xb4, 0x9a, 0xdf, 0x9c, 0xb4, 0x20, + 0xf3, 0xdf, 0xdf, 0xf8, 0xbb, 0xc0, 0xb4, 0x4b, + 0xdf, 0x12, 0xe2, 0xb4, 0x12, 0x99, 0xb4, 0xaf, + 0x12, 0xb4, 0xbb, 0xed, 0x93, 0xe2, 0xe2, 0x95, + 0x93, 0xb4, 0xf4, 0x95, 0xbf, 0xb4, 0x8d, 0xaf, + 0xbf, 0xb4, 0xf4, 0xb4, 0x47, 0xe1, 0xb4, 0x97, + 0x4, 0x7d, 0x6f, 0x97, 0x4, 0xb4, 0xcc, 0x93, + 0x93, 0xf4, 0xf4, 0xe2, 0x93, 0xf4, 0xe2, 0xf4, + 0x93, 0x93, 0x12, 0x93, 0x93, 0xf4, 0x44, 0xf4, + 0x12, 0xf4, 0x44, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, + 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0xf3, 0x93, 0x93, + 0x12, 0x93, 0xf3, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0xbf, + 0xc6, 0xe4, 0xbb, 0xaf, 0xbf, 0xbf, 0x75, 0x9a, + 0xf4, 0x7, 0xbc, 0xcb, 0xf9, 0xe4, 0xe4, 0xe4, + 0xb4, 0x4b, 0xe1, 0x9a, 0xb4, 0xe1, 0xa2, 0xdc, + 0x51, 0x48, 0x91, 0xf, 0x65, 0x65, 0x66, 0x37, + 0x76, 0x76, 0x23, 0x23, 0x23, 0x23, 0xf2, 0x76, + 0x61, 0x66, 0x1f, 0x65, 0x82, 0x29, 0x3b, 0x6d, + 0xa, 0xd1, 0x78, 0x76, 0x5e, 0xd3, 0x49, 0xa7, + 0xa4, 0x2, 0x19, 0x63, 0x19, 0x89, 0x1b, 0xc2, + 0x6e, 0x1b, 0x6e, 0x96, 0x60, 0xa5, 0xef, 0x8f, + 0x19, 0xe, 0x19, 0x4a, 0x63, 0x89, 0x5b, 0x1b, + 0x2f, 0xf1, 0xd2, 0xe7, 0x67, 0x2f, 0xd5, 0x6e, + 0x6e, 0x1b, 0xc2, 0x4a, 0x4a, 0x19, 0x1b, 0x5b, + 0xa5, 0xe, 0x77, 0xf1, 0xb3, 0x82, 0x78, 0x41, + 0xb5, 0xa, 0xa, 0x29, 0x62, 0xd1, 0x78, 0x62, + 0xa, 0x61, 0x37, 0x5e, 0x61, 0x61, 0x8c, 0xf1, + 0x2d, 0x8, 0x30, 0x45, 0x29, 0x29, 0x29, 0x16, + 0xb5, 0x82, 0x6d, 0x82, 0x4d, 0x78, 0x6d, 0x8a, + 0x37, 0x61, 0x37, 0x37, 0x37, 0x61, 0x61, 0x61, + 0x17, 0x1f, 0x52, 0x1d, 0x5f, 0xf, 0x66, 0x17, + 0x61, 0x64, 0x17, 0x61, 0x61, 0x37, 0x78, 0x76, + 0x4d, 0xf2, 0x23, 0x23, 0xd1, 0x76, 0x29, 0x16, + 0x16, 0x62, 0x76, 0xd1, 0xd1, 0xa, 0xd1, 0x23, + 0x23, 0x23, 0xa, 0x23, 0xd1, 0x62, 0xa, 0xa, + 0x29, 0xa, 0xd1, 0xa, 0xb5, 0xda, 0x78, 0x62, + 0xe3, 0x24, 0xe3, 0x29, 0x30, 0x5a, 0x2, 0xd2, + 0x19, 0xc2, 0xe, 0x6e, 0x19, 0x63, 0x1b, 0x96, + 0x6e, 0x4a, 0x63, 0xf1, 0xe, 0x63, 0xf1, 0x5a, + 0x6e, 0x63, 0x89, 0x63, 0x19, 0x4a, 0x1b, 0x8a, + 0xa, 0x62, 0x6, 0xa, 0xa, 0xa, 0x78, 0xac, + 0x58, 0x41, 0xd3, 0x4d, 0x58, 0x55, 0x82, 0xf2, + 0x78, 0x17, 0x5f, 0xf, 0xf, 0xb6, 0xb6, 0x5f, + 0x92, 0x3c, 0x92, 0xf, 0x56, 0xc1, 0x3c, 0xaa, + 0xb8, 0xc3, 0x52, 0x66, 0xac, 0x65, 0xc3, 0xb8, + 0xa8, 0x1, 0x82, 0x6d, 0x6d, 0xa6, 0x8f, 0x3, + 0x3, 0xe5, 0x1e, 0x18, 0x3, 0x4, 0xc0, 0xc4, + 0x93, 0x97, 0xf3, 0xbf, 0x93, 0x93, 0xbf, 0xb4, + 0x9d, 0xff, 0xc0, 0xb4, 0xdd, 0x93, 0xbf, 0xbf, + 0x93, 0x93, 0xbf, 0xbf, 0x93, 0xc0, 0xbf, 0xb4, + 0xfd, 0xdd, 0xbf, 0xbf, 0x97, 0x12, 0x8d, 0xe2, + 0x97, 0x12, 0xbb, 0xbf, 0xc0, 0xbf, 0xe2, 0xbf, + 0x4, 0xb4, 0x95, 0xbf, 0x97, 0xbf, 0xb4, 0x97, + 0x4, 0x4, 0x97, 0x4, 0xfd, 0xfd, 0x20, 0x93, + 0x69, 0x95, 0xe2, 0xc0, 0x93, 0xf4, 0xe2, 0x12, + 0x93, 0xf4, 0xe2, 0x93, 0x93, 0x9, 0xe2, 0x95, + 0xf3, 0x44, 0x44, 0xe2, 0xf4, 0x44, 0xe2, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x12, 0x95, + 0xbf, 0xf4, 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0xe2, + 0x81, 0x32, 0xfd, 0x7, 0xb4, 0x9c, 0x6b, 0x81, + 0xe4, 0x97, 0x97, 0xdf, 0xdd, 0x97, 0x32, 0xe4, + 0xde, 0x9c, 0x83, 0x53, 0xd8, 0x4, 0x3, 0x6b, + 0x6b, 0x8f, 0x50, 0xab, 0xe3, 0x82, 0x17, 0x5e, + 0xd1, 0x23, 0x23, 0x34, 0x76, 0x23, 0xd1, 0x76, + 0x76, 0x82, 0x9e, 0x1f, 0x65, 0x3b, 0x87, 0x37, + 0xa, 0x62, 0x1c, 0xa, 0x62, 0xa, 0xe3, 0xd3, + 0x58, 0x58, 0xf1, 0x79, 0x63, 0x89, 0x1b, 0x79, + 0x79, 0x6e, 0x19, 0x1b, 0x42, 0x1b, 0x19, 0xe, + 0xa5, 0x14, 0x19, 0xd2, 0xd2, 0x63, 0xc2, 0xf1, + 0x42, 0x63, 0x19, 0x63, 0x1b, 0x1b, 0x19, 0x19, + 0x19, 0x63, 0x19, 0xe9, 0xd2, 0x2d, 0x63, 0x1b, + 0x89, 0x1b, 0x63, 0x63, 0x73, 0x58, 0x1c, 0x62, + 0xd1, 0xa, 0x23, 0xa, 0x62, 0xa, 0x62, 0x8a, + 0x1c, 0x29, 0x6d, 0x29, 0x29, 0x62, 0xa, 0x58, + 0x8c, 0xd3, 0xe3, 0x6d, 0x4d, 0x16, 0x3b, 0x5, + 0x5, 0xda, 0xda, 0x68, 0x82, 0x78, 0x76, 0x6d, + 0x37, 0xac, 0x37, 0x61, 0x37, 0xbe, 0x82, 0x8, + 0x60, 0x2c, 0x1d, 0x49, 0xb6, 0x1f, 0x17, 0xac, + 0x55, 0x61, 0x61, 0x61, 0xbe, 0x61, 0x4d, 0xda, + 0xda, 0xa, 0x76, 0xa, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0xa, 0x78, 0x76, 0xd1, 0x0, 0x23, + 0xd1, 0x23, 0xd1, 0xa, 0x23, 0x23, 0xd1, 0xd1, + 0x62, 0xd1, 0xa, 0xa, 0x2f, 0x2f, 0x58, 0x8a, + 0x45, 0xa0, 0xe3, 0x41, 0x67, 0x67, 0x8c, 0xd2, + 0x4a, 0x4a, 0x4a, 0x19, 0x4a, 0x4a, 0x19, 0xd5, + 0xd5, 0x19, 0x2f, 0x67, 0x19, 0xd2, 0x2f, 0x2f, + 0xe, 0x11, 0x19, 0x4a, 0x63, 0x89, 0x67, 0x41, + 0x62, 0xa, 0xa, 0x62, 0xa, 0x62, 0x78, 0x6d, + 0x2f, 0xa5, 0x1, 0x52, 0xc3, 0x65, 0xbe, 0x61, + 0x4d, 0x17, 0x17, 0xb7, 0xb7, 0x92, 0x56, 0xaa, + 0xd, 0xdc, 0x2b, 0xc, 0x5f, 0xf, 0xf, 0x5f, + 0x92, 0x1d, 0x52, 0x66, 0x29, 0x67, 0x7c, 0xa9, + 0x7e, 0xc9, 0x1, 0xd3, 0x58, 0xa0, 0xc2, 0x7e, + 0x51, 0x81, 0x70, 0x90, 0x39, 0x12, 0xe4, 0xbf, + 0xe4, 0xc6, 0xbf, 0x95, 0xcc, 0xb4, 0xbf, 0xf6, + 0xd8, 0xe4, 0xbb, 0xbf, 0xc6, 0xed, 0x95, 0xb4, + 0xbf, 0x95, 0xbf, 0xbf, 0xe1, 0xb4, 0xe2, 0xbf, + 0x4b, 0xbf, 0xe2, 0x95, 0xbf, 0xbf, 0xb4, 0xe2, + 0xbf, 0xe2, 0xe2, 0xbf, 0xf4, 0xf4, 0xe2, 0xf4, + 0xf4, 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, 0xe1, 0x7, + 0xbc, 0xf, 0x9a, 0xfa, 0x99, 0x9a, 0xf4, 0xf4, + 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0x44, 0xe2, 0xf4, + 0xe2, 0xe2, 0xe2, 0xe2, 0xc0, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0xe2, 0x44, 0xf4, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xf4, 0xf4, 0xbc, 0xdd, 0x93, + 0x9, 0xc0, 0x12, 0xe2, 0x44, 0xe2, 0xe2, 0x44, + 0x44, 0x44, 0xe2, + 0xe4, 0x8e, 0xde, 0xf6, 0xdd, 0xc0, 0x32, 0xe4, + 0x12, 0x93, 0x32, 0xe4, 0xbd, 0x97, 0xde, 0xbc, + 0x1e, 0x4, 0x32, 0xc6, 0x97, 0x97, 0xde, 0xde, + 0xfd, 0xef, 0x50, 0x66, 0x66, 0x5e, 0xbe, 0x34, + 0x23, 0x23, 0x76, 0xd1, 0xd1, 0x29, 0x78, 0x76, + 0x37, 0x87, 0x65, 0x17, 0x61, 0x61, 0x37, 0x76, + 0x76, 0xe3, 0x67, 0x8c, 0x6d, 0x1c, 0x62, 0x62, + 0x6d, 0xe3, 0x41, 0x41, 0x8c, 0xf1, 0xd2, 0x2f, + 0x42, 0x63, 0x19, 0x4a, 0x19, 0x4a, 0x6e, 0x19, + 0x2f, 0xf1, 0x6e, 0x79, 0x41, 0x2f, 0x8f, 0x6e, + 0xa5, 0xc2, 0xef, 0x4a, 0x4a, 0x19, 0xe9, 0x63, + 0xd2, 0xd2, 0x19, 0x63, 0x1b, 0x63, 0x4a, 0x19, + 0x89, 0x1b, 0x1b, 0x6e, 0xd2, 0x67, 0x58, 0x1c, + 0xa, 0x29, 0xd1, 0xa, 0xa, 0xd1, 0x62, 0xd3, + 0xe3, 0xe3, 0xe3, 0x87, 0x82, 0x6d, 0x78, 0xe3, + 0xa, 0x76, 0x78, 0x4d, 0xda, 0xda, 0x45, 0x45, + 0x30, 0xda, 0x3b, 0x5, 0x8a, 0x4d, 0x4d, 0xac, + 0x78, 0x78, 0x76, 0x76, 0x76, 0x76, 0x4d, 0xa6, + 0x22, 0x92, 0x3f, 0x1f, 0x17, 0x17, 0x66, 0x52, + 0x61, 0x61, 0xf2, 0x24, 0xa7, 0x61, 0x4d, 0x8a, + 0x82, 0x66, 0xac, 0xa, 0xa, 0xa, 0x23, 0x23, + 0x16, 0xa, 0xd1, 0x23, 0x76, 0x0, 0x23, 0x23, + 0xa, 0xa, 0xa, 0x29, 0xd1, 0x23, 0x23, 0x62, + 0xa, 0xa, 0x62, 0x29, 0xd3, 0xa7, 0x8c, 0xa6, + 0x96, 0x96, 0x5a, 0x60, 0x6e, 0x1b, 0x73, 0xe9, + 0xd7, 0xd7, 0xd5, 0x6e, 0x1b, 0xd5, 0xc5, 0xc5, + 0x8f, 0xc2, 0x79, 0xa5, 0xef, 0x8f, 0xa6, 0x2, + 0xc2, 0xd5, 0xe, 0xa5, 0xa6, 0xb3, 0xd3, 0xe3, + 0xd3, 0x29, 0x62, 0x37, 0x29, 0xe3, 0xb5, 0xac, + 0xd3, 0x52, 0x52, 0x1f, 0x17, 0x17, 0x17, 0xb6, + 0x17, 0xb7, 0x1f, 0xb6, 0x3f, 0x80, 0xdc, 0x2b, + 0x3c, 0x80, 0xc, 0xc, 0x5f, 0xf, 0xb7, 0x1d, + 0x92, 0xd6, 0x1d, 0x94, 0x65, 0x59, 0x7f, 0x18, + 0x48, 0xb7, 0x52, 0x66, 0x82, 0xad, 0x1b, 0x7d, + 0x90, 0xb4, 0xbf, 0xb4, 0xdf, 0xdf, 0xb4, 0xbb, + 0x7, 0xdf, 0xc6, 0xbf, 0xb4, 0xe4, 0xe4, 0x81, + 0xe4, 0xcd, 0xbf, 0xb4, 0xb4, 0xb2, 0xbf, 0xf4, + 0x9a, 0xc6, 0xc6, 0xbf, 0xb4, 0xf4, 0x95, 0xe2, + 0xb4, 0xf4, 0xbb, 0xf4, 0xaf, 0xbf, 0xbf, 0x95, + 0xe2, 0xbf, 0xbf, 0xf4, 0x8d, 0xe2, 0xe2, 0xf4, + 0xbb, 0xbf, 0xf4, 0xf4, 0xf4, 0x9a, 0x75, 0x7, + 0x1d, 0x92, 0x57, 0x9c, 0x93, 0xbf, 0xe2, 0xf4, + 0xf4, 0xe2, 0xf4, 0xe2, 0xe2, 0xf4, 0xf4, 0xf4, + 0xf4, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0x44, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, + 0xe2, 0xe2, 0x93, 0xe2, 0x44, 0xbf, 0x93, 0x93, + 0xf3, 0x12, 0xf3, 0x44, 0xe2, 0x44, 0x12, 0xe2, + 0xe2, 0x44, 0xbb, + 0xb4, 0xbf, 0xb4, 0x4b, 0xb4, 0xbf, 0xbf, 0xf4, + 0xaf, 0x4b, 0xb4, 0x9a, 0x9a, 0xb4, 0x81, 0xf6, + 0xe1, 0xbd, 0xbf, 0x4b, 0xdf, 0x81, 0xce, 0x9a, + 0x57, 0x3e, 0xb8, 0x52, 0xd3, 0xab, 0x55, 0xf2, + 0xd1, 0x76, 0x0, 0x23, 0x76, 0xa, 0xf2, 0x17, + 0xb6, 0x61, 0x17, 0x17, 0x61, 0x4d, 0x4d, 0x76, + 0xa, 0x62, 0xab, 0x66, 0xac, 0x76, 0x4d, 0x78, + 0xe3, 0xb5, 0x82, 0x1c, 0xa, 0x67, 0xa5, 0x2f, + 0x67, 0xf0, 0xd5, 0xef, 0xd2, 0x1b, 0x1b, 0xc2, + 0x5a, 0xd2, 0xc2, 0xc9, 0x8, 0x73, 0xe, 0x5d, + 0x2f, 0x1b, 0x19, 0xef, 0x77, 0xc5, 0xc2, 0x1b, + 0xa5, 0x6e, 0xef, 0x6e, 0x63, 0x6e, 0xd7, 0xd5, + 0x79, 0x96, 0x1b, 0x63, 0xf1, 0x2f, 0x2f, 0x5, + 0x5, 0x8a, 0x5, 0x29, 0xa, 0x23, 0xa, 0x62, + 0x4d, 0x76, 0x76, 0x4d, 0x66, 0x76, 0xe3, 0x82, + 0x78, 0x78, 0x62, 0x1c, 0x6d, 0x62, 0x1c, 0x3b, + 0x41, 0x4d, 0x4d, 0xda, 0x82, 0x24, 0x82, 0x87, + 0x6d, 0x78, 0x78, 0xd1, 0x76, 0x76, 0x4d, 0xc3, + 0x4e, 0x92, 0xf, 0xb6, 0x61, 0x17, 0x66, 0x17, + 0x65, 0x37, 0xbe, 0x24, 0x61, 0x37, 0x76, 0x37, + 0x66, 0x66, 0x5e, 0xd3, 0xbe, 0xa, 0x29, 0x29, + 0x29, 0x76, 0xa, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x34, 0x76, 0x23, 0x37, 0x24, 0xa, 0xa, 0x62, + 0x58, 0xa, 0x62, 0xa, 0x29, 0xbe, 0x24, 0x59, + 0xc2, 0xd9, 0xe9, 0x8f, 0x6b, 0x8f, 0x6e, 0x19, + 0xd5, 0xd5, 0xd2, 0x42, 0xc2, 0x19, 0xa5, 0x5d, + 0xd5, 0x6e, 0xc2, 0x8f, 0xef, 0xef, 0x1b, 0x42, + 0x63, 0x63, 0x63, 0x2f, 0x58, 0x41, 0x5e, 0x5e, + 0x5e, 0xa, 0xa, 0x6d, 0x41, 0x41, 0xe3, 0x4d, + 0xa, 0x5e, 0x5e, 0xf2, 0x61, 0x66, 0x17, 0xb6, + 0xf, 0xb7, 0xb7, 0xb6, 0x56, 0x80, 0x2b, 0x5f, + 0xc, 0x5f, 0xc, 0x5f, 0x5f, 0x1f, 0x56, 0xb8, + 0x91, 0x22, 0xa8, 0x52, 0xab, 0xc3, 0x4e, 0x91, + 0x5f, 0x52, 0x66, 0x61, 0x82, 0xad, 0xc2, 0x6b, + 0x47, 0x7b, 0xbd, 0xc6, 0xd8, 0x36, 0xdd, 0xe4, + 0xd8, 0xde, 0xb4, 0xe2, 0x81, 0xc0, 0xe4, 0xe4, + 0xf3, 0xde, 0xe4, 0xe2, 0xf3, 0xde, 0xe2, 0xb4, + 0xc6, 0xc0, 0xb4, 0xbf, 0x12, 0xe4, 0xf4, 0xb4, + 0x12, 0xc0, 0xbf, 0xbb, 0xc0, 0xdd, 0xbf, 0xbf, + 0xf3, 0x95, 0xe2, 0xbf, 0xee, 0xbf, 0x44, 0xaf, + 0xc0, 0xb4, 0xf4, 0x95, 0x93, 0xe1, 0x9a, 0x97, + 0xe0, 0xa6, 0x93, 0x97, 0x4, 0x93, 0xe2, 0x93, + 0x93, 0x20, 0xf4, 0xe2, 0x93, 0xe2, 0x44, 0x93, + 0x12, 0xf4, 0xe2, 0x93, 0x93, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, + 0x44, 0xe2, 0xf4, 0xe2, 0xf4, 0x93, 0xf3, 0xf3, + 0xe2, 0xf3, 0x12, 0xe2, 0x44, 0xe2, 0xe2, 0xbb, + 0x44, 0x44, 0xbf, + 0xb4, 0xbf, 0xbf, 0xc6, 0xbf, 0xbf, 0xbf, 0xb4, + 0xe1, 0xdf, 0xe4, 0x57, 0x9a, 0xb4, 0xc6, 0xe4, + 0xc0, 0xe4, 0xb4, 0x84, 0x90, 0xd8, 0x7, 0xba, + 0xa2, 0x22, 0xa8, 0x1f, 0x52, 0x1, 0xa8, 0x76, + 0x76, 0x23, 0xd1, 0x0, 0x23, 0x23, 0xf2, 0x17, + 0x17, 0x17, 0x17, 0x55, 0x17, 0x65, 0x8a, 0x16, + 0x37, 0x29, 0x4d, 0x76, 0xd1, 0xd1, 0x29, 0xac, + 0xac, 0xd3, 0x66, 0xe3, 0xe3, 0x8, 0x79, 0x73, + 0x8, 0x79, 0xa5, 0x60, 0x2f, 0x96, 0x1b, 0xa5, + 0xa5, 0x77, 0xd9, 0x6e, 0x63, 0x63, 0x6e, 0x1b, + 0x67, 0x2f, 0xe, 0xa5, 0x67, 0xa5, 0xd2, 0x1b, + 0x63, 0x19, 0xd5, 0x4a, 0x63, 0x63, 0xd5, 0x2, + 0x8, 0x2f, 0x89, 0x1b, 0x79, 0x42, 0x1b, 0x89, + 0x73, 0xa0, 0xf1, 0x5, 0x8a, 0xa, 0x62, 0xd1, + 0x76, 0x78, 0xa, 0x76, 0x78, 0xf2, 0x78, 0xd3, + 0x76, 0xa, 0x78, 0xd3, 0xa, 0x62, 0xa, 0x29, + 0x62, 0xa, 0x1c, 0x5, 0x68, 0x82, 0x87, 0x45, + 0x5, 0x1c, 0x4d, 0x78, 0x23, 0x76, 0xd1, 0xe3, + 0x9e, 0x1d, 0xb6, 0x52, 0x52, 0x17, 0x61, 0x66, + 0x82, 0x66, 0x5e, 0x6d, 0x4d, 0xa, 0x6d, 0x6d, + 0x61, 0xf2, 0x78, 0xe3, 0x82, 0x76, 0x23, 0x0, + 0xd1, 0xd1, 0x76, 0x23, 0x23, 0x0, 0x23, 0x23, + 0x0, 0x23, 0xa, 0xd1, 0xa, 0xb5, 0xa, 0x29, + 0xb5, 0x4d, 0x62, 0x41, 0x5, 0x5, 0x30, 0x1b, + 0x19, 0xa5, 0x60, 0xd2, 0xef, 0xd5, 0xd5, 0x4a, + 0x19, 0xd2, 0x79, 0x5a, 0xd2, 0xd5, 0xd2, 0x1b, + 0x4a, 0x19, 0x19, 0xc2, 0x1b, 0x1b, 0x63, 0x79, + 0x79, 0x1b, 0x42, 0x67, 0x67, 0x1c, 0xa, 0xd1, + 0xa, 0xa, 0x62, 0x62, 0xe3, 0xd3, 0xac, 0xe3, + 0xab, 0x82, 0x76, 0x5e, 0x66, 0x1f, 0x17, 0x17, + 0xb6, 0xf, 0x5f, 0x5f, 0x5f, 0xaa, 0x3c, 0xc, + 0xc, 0xc, 0xb6, 0xf, 0xf, 0x92, 0xd, 0x3f, + 0xb6, 0x52, 0x52, 0x55, 0xab, 0x87, 0xc9, 0x7f, + 0x91, 0xa8, 0xd3, 0x4d, 0x4d, 0x30, 0xa5, 0xe8, + 0xef, 0x27, 0x1e, 0xe4, 0xfd, 0xfd, 0xdf, 0xc6, + 0xf5, 0x4, 0xc0, 0xe4, 0x99, 0x97, 0xc0, 0xbf, + 0xfd, 0x3, 0x83, 0xc0, 0xdd, 0x97, 0x12, 0x4b, + 0x97, 0x97, 0x12, 0xe2, 0x97, 0x86, 0x95, 0xbf, + 0x93, 0xbf, 0xc6, 0xed, 0x97, 0x93, 0xe2, 0x95, + 0x93, 0xc0, 0xf4, 0xbf, 0xc0, 0xbf, 0xb4, 0xe2, + 0xf3, 0xb4, 0xbb, 0xaf, 0x97, 0x93, 0xb4, 0x97, + 0x4, 0x5b, 0x97, 0x97, 0x97, 0x69, 0x9a, 0x12, + 0x93, 0xf4, 0xe2, 0xf4, 0x93, 0x20, 0xe2, 0x12, + 0x93, 0x12, 0x12, 0x12, 0xc0, 0xe2, 0x44, 0xf4, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xe2, 0x44, + 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0x93, 0x32, 0x7, 0x75, 0xde, 0x8e, 0xc6, + 0xde, 0x93, 0x93, 0xb4, 0xc6, 0x93, 0x93, 0xbf, + 0xd8, 0x47, 0x4, 0xd8, 0x40, 0x47, 0x47, 0x40, + 0xa9, 0x77, 0x2f, 0x94, 0xd3, 0x8c, 0x24, 0xb5, + 0xd1, 0xd1, 0x23, 0x0, 0x23, 0xd1, 0x76, 0xd1, + 0x61, 0x66, 0xb7, 0xb6, 0xb6, 0xb6, 0x9e, 0x55, + 0x37, 0x4d, 0xbe, 0x82, 0x29, 0x29, 0x29, 0x6d, + 0x78, 0x78, 0xac, 0x62, 0x62, 0x41, 0x67, 0x2f, + 0x2f, 0x2f, 0x1b, 0x89, 0x89, 0x63, 0x63, 0xf1, + 0x41, 0x30, 0x2f, 0x79, 0x79, 0x6e, 0x19, 0x63, + 0x89, 0x1b, 0x63, 0x42, 0x89, 0x63, 0x19, 0x2d, + 0x2f, 0x6e, 0x42, 0x63, 0x63, 0x2f, 0x79, 0x89, + 0x63, 0x19, 0x19, 0x63, 0x89, 0x1b, 0x19, 0x63, + 0x67, 0x30, 0x5, 0x8a, 0x62, 0x62, 0x4d, 0x78, + 0x29, 0x16, 0xa, 0xa, 0x29, 0x62, 0x78, 0x62, + 0x62, 0xd1, 0x76, 0xd1, 0xd1, 0xb5, 0xb5, 0x29, + 0x62, 0xa, 0x29, 0x8c, 0x4d, 0x29, 0x4d, 0x82, + 0xac, 0xd3, 0x4d, 0x78, 0x78, 0x23, 0xac, 0x87, + 0x59, 0x59, 0xa6, 0xab, 0xd3, 0x5e, 0xac, 0x4d, + 0x5e, 0xac, 0x61, 0x4d, 0x82, 0x68, 0x30, 0x5a, + 0x67, 0x29, 0x78, 0x76, 0xd1, 0x23, 0x23, 0x0, + 0x23, 0x0, 0x23, 0x23, 0x23, 0x0, 0x23, 0xa, + 0xa, 0xa, 0xd1, 0x23, 0xa, 0xa, 0x23, 0xa, + 0xa, 0x1c, 0x58, 0x2, 0xd4, 0x96, 0x1b, 0x19, + 0x4a, 0xd2, 0xf1, 0xa6, 0xc9, 0xd5, 0x4a, 0x8f, + 0x6e, 0x73, 0x63, 0x4a, 0x4a, 0x4a, 0x5b, 0xc2, + 0x19, 0x4a, 0x63, 0xf1, 0x2f, 0xd2, 0x19, 0x6e, + 0x63, 0x89, 0x73, 0x30, 0x67, 0x58, 0xa, 0xa, + 0x23, 0xa, 0x62, 0x78, 0x37, 0xa, 0x78, 0xab, + 0x52, 0xa8, 0x8c, 0x55, 0xb6, 0x5f, 0xf, 0x61, + 0xb6, 0xb7, 0x5f, 0xc, 0x92, 0xc1, 0x48, 0xb, + 0xc, 0x5f, 0xf, 0xb6, 0xb7, 0x5f, 0x92, 0x5f, + 0xb6, 0x52, 0x61, 0x61, 0xab, 0x87, 0xad, 0x7f, + 0x2a, 0x91, 0x52, 0x5e, 0xe3, 0x1, 0x60, 0xc5, + 0x88, 0x27, 0x81, 0xce, 0x8d, 0xf3, 0xe4, 0xdf, + 0xc0, 0xc0, 0xbf, 0xbf, 0x81, 0xd8, 0xe1, 0xbf, + 0xc6, 0xc6, 0xf8, 0xbf, 0xbf, 0xbf, 0xe2, 0xaf, + 0xc6, 0xbf, 0x95, 0xe2, 0x95, 0xc6, 0xbf, 0xe2, + 0xbf, 0xbf, 0xf4, 0xaf, 0xe2, 0xbf, 0xe2, 0xf4, + 0xf4, 0xbb, 0xe2, 0xe2, 0xe2, 0xf4, 0xb4, 0xe2, + 0xbf, 0xf4, 0xe2, 0xf4, 0xf4, 0xbb, 0xe2, 0xf4, + 0xcd, 0xa6, 0xf, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0xf4, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x9, 0xc0, + 0xe2, 0xe2, 0x95, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x18, 0x99, 0xf3, 0xe1, 0xf8, 0x8e, 0x99, 0xe4, + 0xbf, 0x12, 0xf3, 0xdf, 0x6b, 0xfd, 0xde, 0x75, + 0xdb, 0x27, 0x9c, 0xb4, 0x2e, 0x7b, 0x31, 0x7d, + 0x27, 0x77, 0x2c, 0xd3, 0xbe, 0xac, 0xac, 0xac, + 0x34, 0x76, 0xd1, 0xa, 0x76, 0x4d, 0x76, 0x37, + 0x55, 0xb6, 0x92, 0x5f, 0xb6, 0x17, 0x17, 0x17, + 0x17, 0x55, 0x65, 0x87, 0x5, 0xa6, 0x8c, 0xe3, + 0xa, 0xa, 0xa, 0xa, 0xd1, 0xa, 0xa, 0x8c, + 0x2f, 0x79, 0x19, 0x19, 0x4a, 0x19, 0x19, 0x6e, + 0x8, 0x5, 0x41, 0x30, 0x79, 0x6e, 0x4a, 0x63, + 0x19, 0x4a, 0x6e, 0x6e, 0x1b, 0x6e, 0xd5, 0x1b, + 0x8, 0x2f, 0xd2, 0x79, 0xe9, 0xe, 0x6e, 0x63, + 0x4a, 0xd5, 0x19, 0x19, 0x1b, 0x6e, 0x6e, 0x2d, + 0x42, 0x79, 0x79, 0x8, 0x8a, 0xda, 0x82, 0x1c, + 0x16, 0x1c, 0xe3, 0xa, 0x76, 0x78, 0x78, 0xa, + 0x76, 0x4d, 0x76, 0xd1, 0xd1, 0xd1, 0x78, 0x78, + 0x78, 0x62, 0x6d, 0x4d, 0x78, 0x62, 0x62, 0x76, + 0x78, 0x76, 0x37, 0x78, 0xd1, 0x78, 0x61, 0x65, + 0x59, 0xb8, 0x1d, 0xf, 0x17, 0x37, 0x4d, 0xf2, + 0x4d, 0x37, 0x37, 0x4d, 0xbe, 0xab, 0x1, 0xa8, + 0x52, 0xac, 0x37, 0xf2, 0x76, 0x23, 0xd1, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0xd1, 0xd1, + 0xa, 0x23, 0xa, 0xa, 0xd1, 0x62, 0x29, 0x29, + 0x29, 0x1c, 0xb3, 0x1b, 0xd5, 0xd5, 0xd5, 0xe5, + 0x77, 0xd5, 0xa5, 0xa5, 0x6e, 0xef, 0xe5, 0x6b, + 0x8f, 0x6e, 0x6e, 0x6e, 0xc5, 0x77, 0x6e, 0xe7, + 0x5d, 0xd5, 0xd5, 0xc5, 0xc2, 0xc2, 0x19, 0xd5, + 0x79, 0x2f, 0xd3, 0x1c, 0x55, 0x37, 0x62, 0xd1, + 0xac, 0xa, 0x82, 0x68, 0xa6, 0x8c, 0xe3, 0xac, + 0x66, 0x17, 0x61, 0x17, 0xb6, 0xf, 0xf, 0x17, + 0xf, 0xb7, 0x33, 0xd, 0xdc, 0xb, 0x48, 0x3c, + 0xaa, 0x5f, 0xf, 0xf, 0xf, 0xf, 0xaa, 0x56, + 0x1d, 0xf, 0x94, 0x55, 0x82, 0x55, 0xa8, 0x7f, + 0x80, 0x91, 0xb6, 0x66, 0x55, 0x87, 0x59, 0x88, + 0xed, 0xc6, 0xb4, 0x8d, 0xe4, 0xbf, 0xe2, 0xb4, + 0xe4, 0x57, 0x7, 0x95, 0xbf, 0xb4, 0xb4, 0xb4, + 0xe4, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xb4, 0xe2, + 0x95, 0x9a, 0x9a, 0xf4, 0xbf, 0xaf, 0xe2, 0xf4, + 0xb4, 0xbb, 0xf4, 0xe2, 0x95, 0xf4, 0x9a, 0x20, + 0xf4, 0xe2, 0xf4, 0xf4, 0xbb, 0xe2, 0xe2, 0xe2, + 0xe2, 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, 0x9a, 0x9a, + 0xbf, 0x9a, 0x9a, 0xfa, 0xbf, 0x20, 0x44, 0xe2, + 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0x44, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x93, 0xe2, + 0xe2, 0xe2, 0x69, 0xe2, 0x44, 0xf4, 0xf3, 0xaf, + 0x95, 0xc0, 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0xe2, + 0xf6, 0xdf, 0xe4, 0xf4, 0xb4, 0xbf, 0xaf, 0xbf, + 0xe2, 0xb4, 0xbf, 0xb0, 0x9f, 0xbc, 0xb4, 0x9a, + 0x74, 0xc6, 0xce, 0xb4, 0x8d, 0xb4, 0xc6, 0x81, + 0xdb, 0x98, 0x2c, 0x94, 0x55, 0x66, 0xf2, 0x76, + 0xf2, 0x76, 0x76, 0xd1, 0xa, 0x37, 0x55, 0x55, + 0x17, 0x17, 0x5f, 0xf, 0xf, 0xb6, 0x17, 0x55, + 0x1f, 0xb6, 0x66, 0x82, 0x65, 0x1, 0x49, 0x55, + 0x4d, 0x78, 0xd1, 0xa, 0x1c, 0xd1, 0xe3, 0xa, + 0x30, 0xd2, 0xc5, 0x6e, 0xd5, 0xd5, 0x77, 0xc5, + 0x42, 0x2f, 0x2f, 0x30, 0x5a, 0x4a, 0xef, 0xd2, + 0xd5, 0xd5, 0x5d, 0xa5, 0xe, 0x77, 0x50, 0x77, + 0xd2, 0xc5, 0xa5, 0xe, 0x42, 0x6e, 0x19, 0x4a, + 0x19, 0xd5, 0xef, 0x6e, 0xc2, 0x79, 0x5d, 0x1b, + 0x63, 0x6e, 0x19, 0xe, 0x73, 0x30, 0x58, 0x41, + 0x8a, 0xe3, 0x4d, 0xd1, 0xd1, 0x76, 0x61, 0xf2, + 0x76, 0x1c, 0x78, 0xd1, 0xd1, 0xd1, 0xd1, 0x76, + 0xd1, 0x76, 0x76, 0x76, 0x76, 0x76, 0x78, 0x78, + 0x29, 0xda, 0x4d, 0x76, 0x78, 0x78, 0xf2, 0x66, + 0x56, 0x3f, 0x5f, 0xf, 0x17, 0x66, 0xac, 0xbe, + 0x4d, 0x76, 0x62, 0xa, 0x76, 0x78, 0x6d, 0x66, + 0x66, 0xac, 0xf2, 0xf2, 0x76, 0xd1, 0x23, 0xd1, + 0xd1, 0x29, 0x23, 0x23, 0xd1, 0xa, 0xd1, 0xd1, + 0xd1, 0xd1, 0xa, 0x37, 0x76, 0x29, 0x8a, 0x5, + 0x41, 0x8a, 0x30, 0x96, 0x7a, 0xa5, 0xef, 0xef, + 0xc5, 0x6e, 0x19, 0x19, 0xef, 0xef, 0xe5, 0xef, + 0xd7, 0x19, 0x1b, 0xe7, 0x60, 0x42, 0x63, 0xe, + 0xc9, 0x1b, 0x6e, 0xd5, 0xef, 0x19, 0x63, 0x89, + 0x2f, 0xd3, 0xa, 0xd1, 0x76, 0xd1, 0xd1, 0x37, + 0xf2, 0x76, 0x58, 0x60, 0xa5, 0x2f, 0x24, 0xe3, + 0x61, 0x37, 0x61, 0x17, 0x17, 0x17, 0xb6, 0xf, + 0x5f, 0xaa, 0x33, 0x5c, 0xb, 0x80, 0x2b, 0x5f, + 0xb7, 0xb6, 0x92, 0xc, 0xf, 0xb6, 0x9e, 0xb8, + 0x91, 0x52, 0x52, 0x65, 0x82, 0x1, 0xa8, 0x3e, + 0x91, 0xb6, 0x66, 0x37, 0xd3, 0x24, 0x59, 0x1b, + 0x83, 0x7b, 0xde, 0xc6, 0x90, 0x1e, 0xe1, 0xbb, + 0xe4, 0x83, 0x4b, 0xbf, 0xbf, 0xc0, 0xe4, 0xf9, + 0xf5, 0x12, 0x81, 0xb4, 0x81, 0x90, 0xbf, 0xbf, + 0xc0, 0xc0, 0x4b, 0x4b, 0xf3, 0x12, 0x95, 0xbf, + 0xdf, 0xb4, 0x8d, 0xb4, 0xb4, 0xc6, 0xc6, 0xbb, + 0xc0, 0xbf, 0xf4, 0xbf, 0xbf, 0xbf, 0xe2, 0x12, + 0xb4, 0x12, 0xf4, 0x20, 0x12, 0xbf, 0x9a, 0x32, + 0x4, 0x4, 0x97, 0x97, 0x97, 0x93, 0xf4, 0xf4, + 0x93, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0x12, + 0x93, 0xf4, 0x44, 0xe2, 0x12, 0xe2, 0xe2, 0xe2, + 0x12, 0xe2, 0x44, 0xf3, 0xe2, 0xe2, 0xe2, 0xf4, + 0xe2, 0xe2, 0x12, 0xe2, 0xe2, 0xe2, 0x95, 0xe2, + 0xe2, 0xbf, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0xaf, 0xe4, 0xbf, 0x95, 0xb4, 0xbb, 0xf4, + 0x7, 0x57, 0x9a, 0xb4, 0x9a, 0xc6, 0xc6, 0xf4, + 0xb4, 0xb4, 0x8d, 0x9a, 0x85, 0x57, 0x70, 0x7, + 0xb, 0x91, 0x1d, 0x1d, 0x49, 0x61, 0x6d, 0x78, + 0xa, 0x76, 0x23, 0x76, 0x76, 0x76, 0x37, 0x17, + 0xf, 0xf, 0xb6, 0xb7, 0x5f, 0xf, 0xf, 0x9e, + 0xb7, 0x61, 0x61, 0x61, 0x78, 0x61, 0x61, 0xac, + 0xd3, 0xac, 0xd1, 0x1c, 0x5, 0x5, 0xb5, 0x1c, + 0x41, 0xab, 0x2c, 0x2f, 0x79, 0xa5, 0x60, 0xc5, + 0x63, 0x6e, 0xd2, 0x5b, 0x89, 0xd5, 0xd5, 0xd5, + 0xd2, 0xa5, 0xb3, 0x67, 0x1b, 0xe, 0xc9, 0x2f, + 0xc2, 0xd5, 0x8f, 0x6e, 0x1b, 0x63, 0xe, 0x6e, + 0x63, 0x42, 0x60, 0x50, 0xa5, 0x6e, 0xc2, 0x5b, + 0x1b, 0x4a, 0xef, 0x4a, 0x19, 0x1b, 0x5a, 0x41, + 0x41, 0x58, 0x29, 0xd1, 0xa, 0x37, 0x61, 0xa, + 0xa, 0xda, 0xb5, 0xd1, 0x34, 0x76, 0x76, 0x76, + 0x76, 0xd1, 0x23, 0xd1, 0xa, 0x78, 0x6d, 0x78, + 0x78, 0x82, 0x6d, 0x76, 0x76, 0xd1, 0x76, 0x37, + 0x65, 0x4e, 0xa8, 0x52, 0x61, 0x4d, 0xe3, 0x4d, + 0xe3, 0x29, 0x29, 0x76, 0x76, 0xd1, 0x76, 0x76, + 0x76, 0x76, 0xd1, 0xd1, 0x23, 0x23, 0xa, 0xd1, + 0x23, 0xd1, 0xd1, 0xa, 0x23, 0xd1, 0xd1, 0xd1, + 0x23, 0x23, 0x78, 0x78, 0xa, 0x6d, 0x5, 0x2f, + 0x2f, 0xf1, 0x89, 0x1b, 0x1b, 0x1b, 0x19, 0x4a, + 0x6e, 0xe, 0x6e, 0xd5, 0xd7, 0xef, 0xd5, 0xd5, + 0x5d, 0xa5, 0xe, 0x73, 0x5b, 0x42, 0x6e, 0x19, + 0x63, 0x89, 0x63, 0x63, 0x19, 0x19, 0x1b, 0x30, + 0x1c, 0x62, 0x1c, 0x29, 0xd1, 0xd1, 0xa, 0x62, + 0x62, 0x78, 0xe3, 0x67, 0x2c, 0x94, 0xd3, 0x66, + 0x61, 0x17, 0xbe, 0x1f, 0xb6, 0xb6, 0xb7, 0x3f, + 0x92, 0x92, 0x3f, 0x3f, 0x5f, 0x91, 0xb6, 0xf, + 0xb7, 0xb7, 0x5f, 0x3c, 0x5f, 0xb7, 0x1f, 0x33, + 0x2c, 0x52, 0x55, 0x82, 0x37, 0xab, 0x49, 0x7f, + 0x7e, 0x49, 0x66, 0xe3, 0xe3, 0xb5, 0x82, 0xc9, + 0x6b, 0xe5, 0xd8, 0x81, 0x93, 0x6f, 0xdd, 0xbf, + 0x93, 0x4, 0xc0, 0xb4, 0xf3, 0x93, 0xe4, 0xb2, + 0x93, 0x4, 0xcf, 0xde, 0x93, 0x4, 0xb4, 0xbf, + 0xc0, 0x97, 0xc0, 0xf3, 0x93, 0x93, 0xbf, 0xaf, + 0x93, 0xc0, 0xb4, 0xbf, 0xc0, 0x97, 0xbf, 0xe2, + 0x97, 0xbb, 0xe2, 0xaf, 0x97, 0xbb, 0xf4, 0xe2, + 0x97, 0xe2, 0xbb, 0xe2, 0x93, 0xaf, 0xf4, 0x93, + 0x4, 0x93, 0x97, 0x97, 0x97, 0x93, 0x20, 0xf4, + 0x93, 0xf4, 0x44, 0xe2, 0x12, 0xe2, 0x44, 0x12, + 0x93, 0x95, 0x44, 0xf4, 0xc0, 0xe2, 0x44, 0x44, + 0xf3, 0x44, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0x8e, 0x93, 0xdf, 0x90, 0x47, 0x93, 0xe4, + 0xe1, 0x1e, 0xdd, 0xb4, 0xc6, 0x32, 0xf5, 0xdf, + 0x36, 0xfd, 0xfd, 0xc6, 0x8b, 0x35, 0x36, 0x81, + 0x27, 0xa8, 0xa7, 0x1, 0x1, 0xac, 0x76, 0x62, + 0xd1, 0x76, 0x23, 0xd1, 0x23, 0xa, 0xf2, 0x52, + 0x22, 0x1d, 0xb7, 0xb8, 0x92, 0xc, 0x5f, 0x17, + 0x17, 0xb6, 0x17, 0xbe, 0xbe, 0x37, 0x37, 0x76, + 0xa, 0x78, 0x78, 0x16, 0x67, 0x41, 0x62, 0xe3, + 0xe3, 0xe3, 0x87, 0xf1, 0x19, 0x6e, 0x42, 0xf1, + 0x63, 0xe9, 0x67, 0x8, 0x89, 0x42, 0xd2, 0x1b, + 0x19, 0x89, 0x63, 0x1b, 0x19, 0x19, 0x1b, 0xf1, + 0x89, 0x63, 0xe9, 0x79, 0x1b, 0x42, 0x2f, 0x79, + 0x63, 0x63, 0x1b, 0x89, 0x63, 0x63, 0x42, 0x2f, + 0x1b, 0x6e, 0x63, 0xe9, 0x63, 0x63, 0x1b, 0x79, + 0x89, 0x89, 0x58, 0x1c, 0x8a, 0x58, 0x62, 0xd1, + 0xa, 0x62, 0x78, 0x76, 0xa, 0xa, 0x76, 0x76, + 0x76, 0xd1, 0x76, 0x76, 0x76, 0x62, 0xd1, 0x76, + 0x76, 0x76, 0xa, 0x76, 0xd1, 0x29, 0x16, 0x58, + 0x2f, 0x77, 0xa5, 0xd3, 0x76, 0x76, 0x76, 0x76, + 0x76, 0x4d, 0x37, 0x76, 0x76, 0xd1, 0x1c, 0xa, + 0x62, 0x78, 0x76, 0xd1, 0x23, 0x23, 0xa, 0x23, + 0xa, 0x4d, 0x29, 0xa, 0x23, 0xa, 0x29, 0xa, + 0xa, 0x29, 0xa, 0xa, 0xa, 0xa, 0x41, 0x58, + 0x52, 0xa5, 0x6e, 0x4a, 0xd5, 0x19, 0x19, 0xd5, + 0x19, 0xe, 0x63, 0x19, 0xd5, 0x4a, 0x4a, 0x63, + 0xe, 0x1b, 0x19, 0x19, 0x19, 0x4a, 0x19, 0x4a, + 0x4a, 0x4a, 0x19, 0x19, 0x2, 0x67, 0xf1, 0x5, + 0x62, 0x62, 0x1c, 0x41, 0x1c, 0xd1, 0x62, 0x29, + 0xd1, 0xd1, 0x78, 0xac, 0x66, 0xd3, 0x52, 0x49, + 0x56, 0xb6, 0xb7, 0xb7, 0xb7, 0xb6, 0xb6, 0xf, + 0x5f, 0x5f, 0x92, 0x92, 0x5f, 0xb6, 0x5f, 0x3f, + 0x5f, 0xf, 0xb7, 0x56, 0xaa, 0x5f, 0xf, 0x1d, + 0xb7, 0x1f, 0x66, 0x66, 0x55, 0x55, 0xa8, 0x88, + 0x18, 0x91, 0x52, 0x55, 0x82, 0xe3, 0x8c, 0x77, + 0x83, 0x8b, 0xc6, 0xb4, 0xe4, 0xe4, 0xf4, 0x95, + 0xc6, 0xb4, 0x95, 0xf4, 0xb4, 0xc6, 0x9a, 0xb4, + 0xce, 0xe1, 0x4b, 0x8d, 0xbb, 0xbb, 0xbf, 0xf4, + 0xbf, 0xbf, 0xe2, 0xf4, 0xbf, 0xbf, 0xbb, 0xe2, + 0xf4, 0xe2, 0xf4, 0x44, 0xf4, 0xe2, 0xe2, 0xe2, + 0xf4, 0xe2, 0xf4, 0x9a, 0xe2, 0xe2, 0xf4, 0xf4, + 0xbf, 0xe2, 0x44, 0xbf, 0xe2, 0xe2, 0xe2, 0xf4, + 0xf4, 0xe4, 0xf4, 0x9a, 0xf4, 0xe2, 0xe2, 0xf4, + 0x44, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xbf, 0xbb, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x57, 0xc8, 0xfd, 0xe4, 0xce, 0xdd, 0x12, 0xbf, + 0xbf, 0xf3, 0xf3, 0xb4, 0xe4, 0x36, 0xd8, 0xce, + 0xb2, 0xa9, 0x40, 0xe4, 0xb4, 0x7b, 0x2e, 0xc6, + 0x3, 0xa5, 0x41, 0xbe, 0xac, 0x78, 0x78, 0x78, + 0xf2, 0xa, 0x78, 0x76, 0x29, 0x37, 0x82, 0x33, + 0x7f, 0x2b, 0x5f, 0x5f, 0x5f, 0xf, 0xf, 0xf, + 0xf, 0xb6, 0xb6, 0xb7, 0x9e, 0x65, 0x61, 0x82, + 0x29, 0x76, 0x62, 0xa, 0x78, 0xac, 0xf2, 0xa, + 0xd3, 0x24, 0x58, 0x2, 0x1b, 0x63, 0xe, 0x63, + 0x63, 0x8, 0x58, 0x58, 0x19, 0xd2, 0xa5, 0xd2, + 0xd5, 0x4a, 0xd7, 0xd5, 0x6e, 0x4a, 0xef, 0xe, + 0x19, 0x77, 0x2f, 0x67, 0x63, 0x6e, 0xe, 0xf0, + 0x19, 0x4a, 0x19, 0x19, 0x63, 0x63, 0xa5, 0x2f, + 0x2f, 0xe9, 0x2f, 0x8, 0xc2, 0xd7, 0xd5, 0x6e, + 0x1b, 0xc2, 0x2f, 0x87, 0x58, 0x68, 0x6d, 0x29, + 0x1c, 0x1c, 0x62, 0x29, 0x78, 0x4d, 0xa, 0x78, + 0x23, 0xd1, 0x76, 0xa, 0x76, 0x76, 0x76, 0xd1, + 0x76, 0xd1, 0x76, 0x76, 0x76, 0x62, 0x6d, 0x68, + 0xd4, 0xe8, 0x60, 0xd3, 0xac, 0x76, 0x76, 0xd1, + 0x76, 0x37, 0x76, 0xd1, 0xa, 0x62, 0xe3, 0x76, + 0xa, 0x76, 0xa, 0xd1, 0x76, 0x62, 0xa, 0x23, + 0x76, 0xa, 0xa, 0xa, 0xd1, 0x29, 0x62, 0x29, + 0x62, 0xa, 0x16, 0x62, 0x1c, 0x8a, 0x5, 0x67, + 0x30, 0x1b, 0xef, 0xd5, 0xfb, 0x1b, 0x1b, 0xc5, + 0x5d, 0x72, 0xc9, 0xc2, 0xe5, 0xe5, 0x8f, 0xd5, + 0xd5, 0x6e, 0x63, 0xd5, 0x8f, 0xe9, 0xc2, 0x6e, + 0xc5, 0x77, 0x63, 0x19, 0x96, 0x5, 0x8, 0x67, + 0xb5, 0xa, 0xa, 0x4d, 0x4d, 0x4d, 0x4d, 0xac, + 0x37, 0xa, 0xab, 0x67, 0xab, 0x5e, 0x52, 0x91, + 0x5f, 0xb6, 0x17, 0xb6, 0x1d, 0xc, 0x92, 0x56, + 0xb7, 0x92, 0x3c, 0xb, 0x3c, 0xb7, 0xb7, 0x3c, + 0x2b, 0xc, 0xb6, 0xb6, 0x5f, 0x5f, 0xc, 0x92, + 0x9e, 0x1f, 0x52, 0x52, 0x52, 0x55, 0xc3, 0x7f, + 0x51, 0x91, 0xb6, 0x55, 0x24, 0x82, 0x60, 0x88, + 0x90, 0xca, 0xdf, 0xbf, 0xbf, 0xe4, 0x4b, 0xf9, + 0xb4, 0xb4, 0x7, 0xe1, 0xdf, 0xdf, 0xe4, 0xbf, + 0xbb, 0xc6, 0xf8, 0xbf, 0xbb, 0xbf, 0xbf, 0x4b, + 0x81, 0xf4, 0xf4, 0x8d, 0xbf, 0xdf, 0xe2, 0xbf, + 0xf4, 0xf4, 0xb4, 0xaf, 0xbf, 0x44, 0xbf, 0x9a, + 0xbf, 0xbb, 0xf4, 0xf4, 0xe2, 0xbb, 0xf4, 0xf4, + 0x44, 0xf4, 0xe2, 0xf4, 0x8d, 0xe2, 0xf4, 0x9a, + 0x8d, 0x93, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, + 0xf4, 0x44, 0xe2, 0x44, 0xf4, 0xe2, 0x44, 0xe2, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0xe2, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x12, 0xf4, + 0x44, 0xe2, 0x12, 0x8d, 0x44, 0xbb, 0xbf, 0xe2, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, + 0xe1, 0x74, 0xe1, 0x95, 0xbf, 0xf4, 0xb4, 0x20, + 0xe2, 0xf4, 0x9a, 0xb4, 0x85, 0xbc, 0x7, 0x9a, + 0xe1, 0x90, 0x4b, 0xe1, 0x9a, 0xe1, 0xe1, 0xf6, + 0xdb, 0x91, 0x52, 0x65, 0x37, 0x76, 0x37, 0x37, + 0xf2, 0x76, 0x76, 0x37, 0x4d, 0x37, 0x66, 0x9e, + 0xb8, 0xaa, 0xc, 0xc, 0xf, 0xb6, 0xf, 0x5f, + 0x5f, 0xb6, 0xb6, 0x9e, 0x9e, 0x65, 0xb6, 0x55, + 0x55, 0x37, 0x76, 0x29, 0x78, 0x76, 0x78, 0x78, + 0x29, 0x8c, 0x87, 0xb3, 0xe7, 0x5d, 0x50, 0x72, + 0x42, 0x8, 0x58, 0x73, 0x6e, 0x1b, 0xa6, 0x6e, + 0x4a, 0xe5, 0x6a, 0x6e, 0xc2, 0x19, 0x5d, 0xa5, + 0xe, 0x89, 0x73, 0x96, 0xd2, 0xe, 0x60, 0x8, + 0x63, 0xd5, 0xd5, 0x77, 0x89, 0xf0, 0x5a, 0x67, + 0x42, 0xf0, 0x5b, 0x8, 0x6e, 0x19, 0xef, 0x6e, + 0x1b, 0x6e, 0xf1, 0x1, 0x87, 0x45, 0x1, 0xab, + 0x1, 0x8c, 0x24, 0x4d, 0x78, 0x78, 0x6d, 0x37, + 0x78, 0x76, 0x76, 0xac, 0x78, 0xa, 0x76, 0xd1, + 0xd1, 0xd1, 0xd1, 0x76, 0x23, 0xd1, 0x62, 0xd3, + 0x52, 0x2f, 0x1, 0xd3, 0x66, 0x61, 0xf2, 0x23, + 0x29, 0x4d, 0x76, 0xd1, 0xd1, 0x76, 0x78, 0x78, + 0xd1, 0x78, 0x76, 0xd1, 0xa, 0x41, 0x1c, 0xa, + 0xd1, 0x62, 0xa, 0xa, 0x23, 0xa, 0xa, 0x62, + 0xa, 0x62, 0x29, 0x62, 0x5, 0xf1, 0x63, 0x42, + 0x89, 0x6e, 0xd5, 0xae, 0x2f, 0xf1, 0x1b, 0x1b, + 0x49, 0x60, 0x96, 0x1b, 0x6e, 0xd5, 0x4a, 0x4a, + 0x1b, 0x96, 0x6e, 0x19, 0xe, 0x79, 0x42, 0xef, + 0xd2, 0x63, 0x19, 0x19, 0x89, 0x30, 0x8, 0x8c, + 0xa, 0xd1, 0xa, 0x76, 0x76, 0x78, 0x37, 0x37, + 0x76, 0x61, 0x67, 0x60, 0x59, 0x94, 0x17, 0x91, + 0x5f, 0x17, 0xb6, 0xb7, 0x5f, 0xc, 0x2b, 0xc1, + 0x38, 0x48, 0x2b, 0xdb, 0x3c, 0x1d, 0xf, 0x5f, + 0xc, 0x5f, 0x5f, 0x5f, 0x5f, 0x92, 0x3c, 0x3c, + 0x38, 0x60, 0x52, 0x1d, 0x52, 0xab, 0xab, 0xb8, + 0x98, 0xb6, 0x66, 0x5e, 0x76, 0x24, 0x60, 0x8f, + 0xe5, 0xe5, 0x32, 0xf8, 0xb4, 0x93, 0xd8, 0x83, + 0xdd, 0x93, 0xc6, 0xc6, 0xc0, 0x9c, 0x12, 0xe4, + 0x12, 0x97, 0xc0, 0xe4, 0xc0, 0x93, 0xb4, 0x9a, + 0x12, 0xf3, 0xbf, 0xbb, 0xc0, 0x93, 0xb4, 0x95, + 0xe2, 0xf3, 0xbf, 0xf4, 0xf3, 0xbf, 0xe2, 0xf4, + 0x97, 0xee, 0xe2, 0xaf, 0x93, 0xbb, 0xe2, 0xaf, + 0x93, 0x95, 0xe2, 0xbf, 0x69, 0x95, 0xe2, 0x93, + 0x69, 0x93, 0x12, 0x93, 0x93, 0x12, 0xf4, 0x12, + 0x93, 0x20, 0x44, 0xe2, 0x12, 0xe2, 0xe2, 0x95, + 0xc0, 0x12, 0xe2, 0x12, 0x12, 0xe2, 0x44, 0x12, + 0x95, 0xe2, 0x44, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, + 0xe2, 0xe2, 0xf3, 0x44, 0x44, 0x44, 0xe2, 0xe2, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x4b, 0x81, 0xe4, 0xbf, 0xf4, 0xbf, 0xdf, 0xc6, + 0xf4, 0x57, 0xbc, 0x4b, 0xdf, 0x90, 0xc6, 0xb4, + 0xbf, 0x99, 0xd8, 0xb4, 0x8d, 0xc6, 0xdb, 0x7f, + 0x3e, 0x2c, 0xab, 0x55, 0xb5, 0x6d, 0x4d, 0xab, + 0x76, 0x23, 0xa, 0x76, 0xd1, 0xa, 0x61, 0x52, + 0x9e, 0x3f, 0xc, 0xc, 0x92, 0xb7, 0xf, 0xc, + 0x92, 0xb6, 0x17, 0x17, 0xb6, 0xf, 0xf, 0x17, + 0xbe, 0xf2, 0x37, 0x8c, 0x5, 0x29, 0xa, 0x78, + 0xd1, 0xe3, 0xd3, 0xab, 0x6, 0xab, 0x49, 0x2f, + 0x42, 0x89, 0x1b, 0xe, 0x1b, 0x6e, 0x73, 0x19, + 0x6e, 0xd5, 0x7a, 0x1b, 0x1b, 0x1b, 0xa5, 0xe7, + 0x6e, 0x63, 0x1b, 0x63, 0x19, 0x19, 0x42, 0x67, + 0xd2, 0xc5, 0x60, 0x2f, 0x2f, 0x1b, 0x60, 0x5a, + 0x1b, 0x19, 0x42, 0x89, 0x63, 0x19, 0x19, 0xe, + 0x79, 0x42, 0xa6, 0x24, 0x8, 0xad, 0x87, 0xb3, + 0x8, 0x73, 0xb3, 0x29, 0xd1, 0xd1, 0x76, 0xac, + 0x78, 0x78, 0x78, 0x76, 0x76, 0x78, 0xd1, 0xa, + 0xd1, 0x76, 0x76, 0x23, 0x23, 0x23, 0x62, 0x5e, + 0xe3, 0x2f, 0xab, 0x94, 0x61, 0x5e, 0xf2, 0x78, + 0x6d, 0x1c, 0x29, 0xa, 0x23, 0x4d, 0x76, 0x76, + 0xd1, 0xa, 0xa, 0xd1, 0xd1, 0xd3, 0xa, 0x29, + 0xa, 0x29, 0x62, 0xa, 0x29, 0x1c, 0x29, 0xa, + 0xa, 0xa, 0x1c, 0x8a, 0x30, 0x42, 0x63, 0x19, + 0xd5, 0xe, 0x63, 0x1b, 0x79, 0x73, 0x1b, 0xf1, + 0x67, 0x67, 0x1b, 0x19, 0x4a, 0x4a, 0x6e, 0x63, + 0x79, 0x2f, 0x79, 0x1b, 0x63, 0x1b, 0x63, 0x19, + 0x63, 0x63, 0x6e, 0xd2, 0x2f, 0x41, 0xd3, 0xe3, + 0xa, 0x62, 0xa, 0x29, 0xa, 0x62, 0x62, 0x62, + 0x76, 0xa, 0xd3, 0x2c, 0x1d, 0xb6, 0x1f, 0xf, + 0xf, 0xb6, 0xb6, 0x56, 0x33, 0xeb, 0xd0, 0xa2, + 0x74, 0xba, 0x2b, 0x2b, 0x2b, 0xc, 0xc, 0x3c, + 0x2b, 0x3c, 0x3c, 0xc1, 0x51, 0xdc, 0x3c, 0x80, + 0xa9, 0x50, 0x52, 0x52, 0xab, 0x8c, 0x49, 0x91, + 0x4e, 0x8c, 0xd3, 0x61, 0x78, 0x6d, 0x68, 0xc2, + 0xe5, 0x6c, 0xfd, 0xcf, 0xfd, 0x4, 0xf5, 0xe1, + 0xf3, 0x6f, 0x12, 0xe4, 0xf3, 0x97, 0xf3, 0xc6, + 0x4, 0x97, 0xf3, 0xc6, 0x93, 0x69, 0xe4, 0xf4, + 0xf3, 0x12, 0xc6, 0xbf, 0x93, 0xc0, 0xee, 0xbf, + 0x97, 0x93, 0xaf, 0xb4, 0x93, 0x12, 0xb4, 0x95, + 0x93, 0xc0, 0xbf, 0x95, 0x97, 0xbf, 0xe2, 0xf4, + 0x32, 0x97, 0xe2, 0xe2, 0x97, 0xf4, 0xe2, 0x93, + 0x93, 0x93, 0xf4, 0x93, 0x26, 0xf4, 0xe2, 0xf4, + 0x12, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xf3, + 0xf3, 0xe2, 0x44, 0xf3, 0xf3, 0xe2, 0x44, 0x44, + 0xc0, 0x44, 0x44, 0xbb, 0x95, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x12, 0x93, 0x8e, 0xb4, 0xe4, 0xf5, 0x9d, 0xbb, + 0xb4, 0x9c, 0x97, 0xf3, 0x93, 0x4, 0x32, 0xe4, + 0xf3, 0x47, 0x3, 0xc6, 0xd8, 0x3, 0x2a, 0x7f, + 0x4e, 0xab, 0x66, 0xbe, 0x82, 0x6d, 0xac, 0xac, + 0x78, 0xd1, 0xa, 0x76, 0xd1, 0xd1, 0x37, 0xa8, + 0xe8, 0x3e, 0x3f, 0x3c, 0x48, 0x2c, 0xf, 0xf, + 0xf, 0xb6, 0xf, 0x17, 0xb6, 0x17, 0x17, 0x17, + 0x61, 0xbe, 0x4d, 0xda, 0x24, 0x62, 0x62, 0xa, + 0xd1, 0xd1, 0x62, 0x62, 0x62, 0x62, 0x41, 0x67, + 0x67, 0x41, 0x79, 0x2, 0x2, 0x63, 0x63, 0xe9, + 0x63, 0x63, 0x63, 0x19, 0x63, 0x2f, 0xa6, 0x89, + 0x63, 0xd2, 0xd2, 0xe9, 0xd2, 0x6e, 0xd2, 0xf1, + 0xe, 0x1b, 0x89, 0x63, 0x63, 0x1b, 0x2f, 0x30, + 0x1b, 0xd2, 0x2, 0x2f, 0xf1, 0x42, 0x63, 0xe9, + 0xe, 0x6e, 0x73, 0x89, 0x63, 0xd2, 0xa6, 0x87, + 0x8, 0xec, 0x8c, 0xe3, 0x78, 0xa, 0xa, 0xb5, + 0x24, 0xb5, 0x4d, 0x62, 0x78, 0x78, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0x23, 0xd1, 0xd1, 0xd1, 0x6d, + 0x30, 0xf1, 0xd3, 0x62, 0xd1, 0x23, 0x23, 0xd1, + 0xd1, 0x23, 0xd1, 0xa, 0xa, 0xe3, 0x62, 0x62, + 0xd1, 0x62, 0xd1, 0x23, 0x23, 0x23, 0xd1, 0x1c, + 0xe3, 0xa, 0x76, 0x3b, 0xb3, 0x79, 0x5b, 0x5, + 0x5, 0xa0, 0xa0, 0x30, 0x30, 0x2d, 0x42, 0x79, + 0xa5, 0xe, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x1b, + 0x30, 0x30, 0x79, 0x6e, 0x19, 0x2f, 0x79, 0x42, + 0x1b, 0x2, 0x89, 0x89, 0x1b, 0x19, 0x19, 0x19, + 0x1b, 0x30, 0x67, 0x41, 0x23, 0xa, 0xa, 0xd1, + 0x62, 0x41, 0x8c, 0xd3, 0x4d, 0x4d, 0x29, 0x78, + 0x78, 0x78, 0x5e, 0x61, 0x17, 0xb6, 0xf, 0xb6, + 0x9e, 0x5f, 0xc, 0x80, 0xcb, 0x5c, 0xba, 0xba, + 0x18, 0xea, 0x2b, 0x80, 0xdc, 0xdc, 0x48, 0xd0, + 0x38, 0x5c, 0xb, 0xa2, 0xa2, 0xd, 0x92, 0x91, + 0xb, 0x91, 0x1d, 0x52, 0x65, 0xa8, 0x3e, 0x88, + 0x88, 0x59, 0x52, 0xab, 0xbe, 0xe3, 0x58, 0x60, + 0x27, 0x9c, 0xd8, 0xf9, 0x99, 0x12, 0xf4, 0xbf, + 0xbf, 0x81, 0xdf, 0xaf, 0xe4, 0xf3, 0xb4, 0x90, + 0xc6, 0x12, 0xe4, 0xf4, 0xc6, 0xc4, 0x95, 0xaf, + 0xf4, 0xbf, 0xbf, 0xc6, 0xb4, 0xe2, 0x44, 0xf4, + 0xc6, 0xf4, 0xe2, 0xe2, 0xf4, 0xbb, 0xf4, 0xe2, + 0xe2, 0x44, 0xe2, 0xe2, 0xbf, 0xe2, 0xe2, 0xe2, + 0xf4, 0xe2, 0xbf, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, + 0xf4, 0x20, 0xe2, 0xf4, 0xdd, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0xde, 0x9d, 0x90, 0xe4, 0xc0, 0xbf, 0xb4, + 0xe4, 0x99, 0xbd, 0xbf, 0xe4, 0x32, 0x6b, 0xdf, + 0xdd, 0xce, 0x40, 0xcf, 0x39, 0x32, 0xc8, 0xc6, + 0x3e, 0x87, 0xac, 0xac, 0x78, 0x76, 0x37, 0x37, + 0x78, 0x76, 0x37, 0xa, 0x4d, 0x29, 0x55, 0x3f, + 0x51, 0x7e, 0x56, 0xf, 0x5f, 0x5f, 0x5f, 0xf, + 0xb6, 0xb7, 0x5f, 0x5f, 0xf, 0x9e, 0x17, 0xb6, + 0x17, 0x37, 0x29, 0x6d, 0x37, 0x76, 0x62, 0x76, + 0xd1, 0xa, 0x62, 0x62, 0x41, 0xa, 0x1c, 0x58, + 0x41, 0xa, 0x41, 0x8c, 0x58, 0x2f, 0xe, 0x4a, + 0x6e, 0x89, 0xc2, 0x4a, 0xd5, 0x89, 0xa0, 0x73, + 0x2d, 0x79, 0xf1, 0x42, 0xf1, 0xd2, 0x19, 0xe9, + 0x6e, 0x96, 0x63, 0x6e, 0x4a, 0xd5, 0xf0, 0x73, + 0xf1, 0x7a, 0x67, 0x42, 0x8, 0x8, 0x89, 0x19, + 0x4a, 0xd5, 0x6e, 0x1b, 0x19, 0x6e, 0xe, 0x73, + 0x1b, 0xe9, 0x87, 0x58, 0x24, 0xe3, 0x6d, 0x8c, + 0x60, 0x49, 0x4d, 0x76, 0xa, 0x76, 0x76, 0xa, + 0x76, 0xd1, 0xd1, 0x76, 0xd1, 0xd1, 0x78, 0xda, + 0x1, 0x64, 0x5e, 0xd1, 0x76, 0x76, 0xd1, 0xa, + 0xa, 0xd1, 0x78, 0xa, 0x6d, 0xab, 0x6d, 0x62, + 0x29, 0xd3, 0xa, 0xa, 0xa, 0xa, 0xa, 0x62, + 0xe3, 0x76, 0x29, 0xa, 0x8, 0xc2, 0x77, 0xc2, + 0x1b, 0xa5, 0xe7, 0x63, 0x63, 0x96, 0x5a, 0x42, + 0xe, 0xd7, 0x1b, 0xc5, 0x6e, 0xef, 0xa5, 0x7a, + 0xa6, 0x87, 0xf1, 0xd5, 0x6e, 0xc2, 0x5b, 0x67, + 0x2f, 0xd2, 0x1b, 0x19, 0xd5, 0x6e, 0xe9, 0xa5, + 0xa5, 0x58, 0x41, 0x6d, 0xa, 0xa, 0xa, 0x29, + 0x62, 0xb5, 0x94, 0x66, 0x78, 0xb5, 0xac, 0x61, + 0x62, 0xe3, 0xe3, 0xd3, 0x66, 0x94, 0xb6, 0x1d, + 0x1f, 0x1d, 0x92, 0x80, 0xa2, 0x53, 0xdc, 0x2b, + 0xbc, 0xcb, 0x18, 0xd0, 0x18, 0xd0, 0xeb, 0xb, + 0x7f, 0x33, 0x3c, 0x92, 0x3c, 0x91, 0x92, 0x92, + 0xd, 0x7f, 0xb8, 0x1f, 0xa7, 0x68, 0x48, 0xb, + 0xb, 0x2c, 0x52, 0x55, 0x4d, 0xe3, 0x30, 0xc9, + 0x4f, 0x6b, 0xc6, 0x8d, 0x9, 0xf3, 0xb4, 0xf4, + 0x9a, 0xbf, 0xbf, 0x7, 0xe1, 0xf4, 0xaf, 0xe4, + 0xe4, 0xbf, 0xbf, 0xf4, 0xbf, 0xb4, 0xb4, 0xe2, + 0xf4, 0xbf, 0xe2, 0xf4, 0xbf, 0xbf, 0xbf, 0xe2, + 0xaf, 0xbb, 0xf4, 0xf4, 0xf4, 0xbb, 0xe2, 0xe2, + 0xbf, 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, 0xbb, + 0xe2, 0xbb, 0x44, 0xbf, 0xe2, 0xf4, 0xf4, 0x12, + 0xfd, 0x32, 0xf4, 0xf4, 0x12, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0xb4, 0xe1, 0xdf, 0xb4, 0xf4, 0xbf, 0xe2, + 0xb4, 0xdf, 0xc6, 0x9a, 0xbf, 0xe4, 0x8b, 0x90, + 0xbb, 0xce, 0xb4, 0xc6, 0xed, 0x81, 0xe1, 0x75, + 0xdb, 0x49, 0x65, 0x37, 0x78, 0x78, 0x37, 0x61, + 0x37, 0x78, 0x61, 0x37, 0x37, 0x82, 0x64, 0x3f, + 0x80, 0x3c, 0xf, 0xb6, 0xf, 0x5f, 0xc, 0xf, + 0x17, 0x56, 0x92, 0x92, 0x5f, 0xb7, 0x17, 0xb6, + 0xf, 0xb6, 0x55, 0x55, 0x37, 0x76, 0xa, 0xa, + 0x23, 0xa, 0x62, 0xb5, 0xe3, 0xa, 0xe3, 0xab, + 0x66, 0xd3, 0x67, 0x67, 0x8c, 0x67, 0xe9, 0xd5, + 0x63, 0x1b, 0xef, 0x8f, 0xd5, 0x6e, 0x7a, 0x42, + 0x60, 0xe7, 0x1b, 0x6e, 0x1b, 0xf0, 0xe7, 0x4a, + 0x6e, 0x19, 0xc2, 0xef, 0xa5, 0x77, 0xd5, 0xd2, + 0x42, 0xc5, 0x1b, 0x63, 0x42, 0x8, 0x96, 0x19, + 0x6e, 0xd9, 0xc2, 0x63, 0xe9, 0xa5, 0xd5, 0x6e, + 0xd9, 0x77, 0x5a, 0x67, 0x30, 0x6d, 0x1c, 0x58, + 0x52, 0x52, 0xac, 0x78, 0x78, 0x37, 0x76, 0x37, + 0x4d, 0x76, 0x23, 0xd1, 0x23, 0xd1, 0xd1, 0xa, + 0x55, 0x66, 0x61, 0xa, 0xac, 0x37, 0x76, 0x16, + 0x8a, 0x29, 0x62, 0x29, 0x62, 0xb5, 0x6d, 0x62, + 0xa, 0x37, 0x76, 0xd1, 0x29, 0x62, 0x62, 0xa, + 0x1c, 0x1c, 0x1c, 0x8a, 0x67, 0x96, 0xa5, 0xa5, + 0xd2, 0x2f, 0x42, 0x6e, 0xd5, 0x19, 0x63, 0x63, + 0x1b, 0xd5, 0x6e, 0x96, 0x6e, 0x77, 0x2f, 0x67, + 0x60, 0x2f, 0xf1, 0x63, 0xd2, 0x6e, 0x89, 0x73, + 0x89, 0x42, 0xf1, 0x79, 0x6e, 0xd2, 0xf1, 0x67, + 0x2f, 0x67, 0x41, 0x1c, 0x1c, 0x8a, 0x6d, 0x62, + 0x78, 0x78, 0x78, 0xac, 0x78, 0x76, 0x37, 0x78, + 0x62, 0xd3, 0xd3, 0x94, 0xa7, 0x55, 0x52, 0xf, + 0xf, 0x1f, 0xb7, 0x56, 0xb, 0x88, 0x51, 0xd, + 0x5c, 0xcb, 0x18, 0x53, 0x5c, 0x7f, 0xb8, 0x3c, + 0x22, 0x1d, 0x1f, 0xb7, 0x56, 0x91, 0x4e, 0x3f, + 0x33, 0xd4, 0x60, 0x49, 0x8c, 0xad, 0x68, 0xb8, + 0x91, 0x52, 0x66, 0x5e, 0x76, 0x82, 0x5b, 0x6e, + 0xc2, 0xc2, 0x99, 0xc6, 0xdd, 0x9c, 0x12, 0xdf, + 0x40, 0xbd, 0xb4, 0xb4, 0xdf, 0xf5, 0xc0, 0xe4, + 0x93, 0x97, 0xdf, 0xb4, 0xc0, 0xc0, 0xbb, 0xf4, + 0x81, 0x12, 0x95, 0xf4, 0xf5, 0x93, 0xbb, 0xbf, + 0xbf, 0x12, 0xbb, 0xaf, 0xaf, 0x95, 0xe2, 0xe2, + 0xbf, 0xbf, 0xe2, 0xbb, 0xe2, 0x95, 0xe2, 0xbb, + 0x93, 0x95, 0xf4, 0xe2, 0x26, 0xe4, 0xf4, 0x93, + 0x97, 0x95, 0x93, 0x93, 0x93, 0x12, 0xe2, 0xf4, + 0x12, 0xe2, 0xe2, 0xe2, 0x9, 0xe2, 0x44, 0x44, + 0x12, 0x12, 0x95, 0x12, 0x95, 0xe2, 0x44, 0x44, + 0x95, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xaf, 0xb4, 0xbf, 0xbf, 0xbf, 0xbf, 0xcc, 0xf4, + 0xb4, 0xe4, 0xe1, 0xbc, 0xe1, 0xe4, 0xdd, 0xbf, + 0xbf, 0x8d, 0xbf, 0xb4, 0xc6, 0xde, 0xcf, 0x2b, + 0x91, 0x52, 0xab, 0x61, 0x82, 0x29, 0x87, 0x82, + 0x29, 0xd1, 0x76, 0x76, 0x76, 0xf2, 0x61, 0x17, + 0x5f, 0x1d, 0x5f, 0xf, 0x56, 0x5f, 0x56, 0xb6, + 0x56, 0x56, 0x56, 0x5f, 0x5f, 0x5f, 0xf, 0xf, + 0x17, 0xb6, 0x9e, 0x1f, 0x65, 0x68, 0xda, 0x16, + 0xd1, 0xa, 0xa, 0x78, 0xd1, 0x62, 0xa, 0x61, + 0x5e, 0x24, 0xa5, 0x5a, 0x79, 0x8, 0x73, 0x5a, + 0xf1, 0xf1, 0xe, 0xd2, 0x2f, 0xa5, 0x19, 0xe, + 0x1b, 0x1b, 0x1b, 0x6e, 0x63, 0x63, 0x1b, 0xc2, + 0xd2, 0x2f, 0x79, 0x6e, 0x2f, 0x2f, 0x6e, 0x4a, + 0x4a, 0x4a, 0x19, 0x63, 0x63, 0x63, 0x1b, 0x89, + 0x8, 0x2f, 0xd2, 0xd5, 0x6e, 0x1b, 0x1b, 0x19, + 0x4a, 0x6e, 0x1b, 0x5b, 0x73, 0x67, 0x5, 0x30, + 0xda, 0x82, 0x6d, 0x6d, 0x6d, 0xa, 0x6d, 0x6d, + 0xe3, 0xa, 0x62, 0x29, 0x78, 0x78, 0xa, 0x78, + 0x4d, 0x37, 0x78, 0xd3, 0x8c, 0x5e, 0x29, 0x8a, + 0x30, 0x58, 0x1c, 0x1c, 0x29, 0x5e, 0x29, 0x8a, + 0x16, 0xa, 0x23, 0xd1, 0x1c, 0xb5, 0x62, 0x29, + 0x45, 0x58, 0x67, 0x89, 0x89, 0x73, 0x8, 0x89, + 0x19, 0x63, 0x42, 0x1b, 0x19, 0x4a, 0x63, 0x63, + 0x42, 0x1b, 0xe7, 0xa5, 0x6e, 0x6e, 0x67, 0xb3, + 0x1b, 0x19, 0x42, 0x73, 0x8, 0xf1, 0xf1, 0x67, + 0x2f, 0xa4, 0x8c, 0x30, 0xf1, 0x42, 0x8c, 0xb5, + 0x41, 0x41, 0x41, 0x1c, 0x1c, 0x5, 0x41, 0x62, + 0x62, 0x1c, 0x29, 0x62, 0x4d, 0x29, 0x62, 0x23, + 0xd1, 0xa, 0xd3, 0xab, 0x17, 0x37, 0x52, 0x17, + 0x1d, 0x94, 0xa7, 0xa6, 0x3e, 0x27, 0x25, 0xd6, + 0x38, 0x4e, 0x98, 0x91, 0x3f, 0x9e, 0x52, 0x1d, + 0xf, 0x1d, 0x94, 0x52, 0x56, 0xe8, 0x91, 0x91, + 0x9e, 0x87, 0xa7, 0xab, 0xd3, 0x8c, 0x87, 0x59, + 0xa8, 0x2f, 0x8c, 0x4d, 0x62, 0x76, 0x58, 0x2f, + 0xa6, 0x6e, 0x7d, 0x9b, 0x9b, 0x6f, 0x32, 0x99, + 0x32, 0x97, 0x12, 0xe4, 0xc0, 0x9c, 0xe4, 0xe4, + 0xfd, 0x6f, 0x6f, 0x81, 0xfd, 0x97, 0xbf, 0xaf, + 0x93, 0x93, 0xbf, 0xbf, 0x93, 0x97, 0xbf, 0xbb, + 0xaf, 0x93, 0xb4, 0xb4, 0xbf, 0xbf, 0xbf, 0xf4, + 0x97, 0xbf, 0x44, 0xaf, 0xbb, 0xbf, 0xf4, 0xf4, + 0x93, 0xbf, 0xe2, 0x95, 0x93, 0x93, 0xe2, 0x93, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x12, 0xe2, 0xe2, + 0x12, 0xe2, 0xe2, 0x44, 0xf3, 0xe2, 0x44, 0xe2, + 0xe2, 0x44, 0xe2, 0xbf, 0xbf, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc6, 0xf5, 0x32, 0x57, 0xb4, 0x32, 0x6f, 0xf6, + 0x70, 0x97, 0x97, 0xdf, 0xca, 0x4, 0x93, 0xc0, + 0xe4, 0x99, 0x1e, 0xbc, 0xd8, 0x47, 0x77, 0x3f, + 0x49, 0x49, 0xd3, 0x4d, 0x6d, 0xda, 0x67, 0x8c, + 0x82, 0x37, 0x76, 0x23, 0x0, 0x29, 0x4d, 0x17, + 0x1f, 0xb8, 0x3c, 0x5f, 0x56, 0xb7, 0xb7, 0x5f, + 0x5f, 0xf, 0xb6, 0x17, 0xf, 0x92, 0x3c, 0x56, + 0xb7, 0x9e, 0xb8, 0x92, 0xb7, 0xc3, 0xc3, 0x61, + 0x23, 0xa, 0x16, 0x23, 0xa, 0xa, 0xe3, 0x62, + 0xa, 0x62, 0x41, 0x67, 0x41, 0x8c, 0x58, 0x30, + 0x2f, 0x2f, 0x63, 0x1b, 0x73, 0x89, 0x19, 0x4a, + 0xd2, 0x89, 0x63, 0xe, 0x79, 0x79, 0x1b, 0x89, + 0x89, 0x1b, 0x19, 0xd5, 0xa5, 0xf1, 0x19, 0x4a, + 0xd5, 0xe9, 0x63, 0x89, 0x2d, 0x79, 0xe, 0x19, + 0x1b, 0x63, 0x4a, 0x19, 0xe9, 0x89, 0x1b, 0x19, + 0x8f, 0xd2, 0x63, 0x1b, 0x79, 0x2f, 0x2, 0x1b, + 0xf0, 0xa0, 0x30, 0xa0, 0x41, 0xe3, 0x6d, 0x62, + 0x62, 0x4d, 0x4d, 0x82, 0xab, 0x4d, 0xe3, 0x67, + 0xa6, 0x58, 0xe3, 0xda, 0xda, 0xb5, 0xa, 0x29, + 0x62, 0xac, 0x1c, 0x58, 0x73, 0x24, 0x41, 0x8, + 0xa0, 0x8a, 0x1c, 0x8a, 0x8a, 0x37, 0x29, 0x8a, + 0xf1, 0x67, 0x79, 0x63, 0x4a, 0x4a, 0x19, 0x63, + 0x19, 0xd5, 0x89, 0x79, 0x63, 0xae, 0x67, 0xf1, + 0x6e, 0xd5, 0xe, 0x4a, 0x63, 0x6e, 0x1b, 0x63, + 0x19, 0xe, 0xf1, 0x41, 0x58, 0x1c, 0xd3, 0xb5, + 0x8a, 0x24, 0x6d, 0x2f, 0x42, 0xe9, 0x24, 0x1c, + 0x1c, 0x62, 0x62, 0x62, 0x62, 0x62, 0xa, 0x62, + 0xb5, 0x67, 0x82, 0x82, 0xc3, 0xb3, 0x1a, 0x78, + 0xd1, 0x76, 0x76, 0x78, 0x61, 0x66, 0x55, 0x17, + 0x1d, 0x2f, 0x49, 0x52, 0xb8, 0xa8, 0xa8, 0xf, + 0x1f, 0x1f, 0xb6, 0xf, 0xf, 0x52, 0x52, 0x1f, + 0x1f, 0x52, 0x52, 0xb7, 0x1f, 0x52, 0x1d, 0x5f, + 0xb6, 0x52, 0x17, 0x66, 0x61, 0xc3, 0xa6, 0x4e, + 0x7e, 0x4e, 0x3f, 0x52, 0xac, 0xb5, 0x58, 0xab, + 0xa8, 0x25, 0xd8, 0xcd, 0xb4, 0xe4, 0xe4, 0xbf, + 0xbf, 0xe4, 0xbf, 0xf4, 0x9a, 0x75, 0xf4, 0x9a, + 0xf6, 0xe1, 0xbf, 0xf4, 0xbf, 0xbf, 0xbb, 0xf4, + 0xe2, 0xaf, 0xe2, 0xe2, 0x95, 0xb4, 0xe2, 0xf4, + 0xb4, 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xf4, + 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe1, 0xc0, 0xb9, 0x57, 0xc6, 0xf3, 0xdd, 0xaf, + 0xaf, 0xf3, 0x93, 0xaf, 0x8d, 0xf3, 0xdd, 0x7, + 0x7, 0xdd, 0x81, 0x57, 0x9f, 0x93, 0xc8, 0x2a, + 0xa8, 0x67, 0xab, 0xac, 0x29, 0x4d, 0xbe, 0x61, + 0x4d, 0x78, 0xa, 0x23, 0xa, 0x76, 0x87, 0x55, + 0x52, 0x91, 0x2b, 0xc, 0xf, 0xf, 0xb6, 0xf, + 0x5f, 0x5f, 0xb6, 0xb6, 0xb6, 0x56, 0xc1, 0x56, + 0xb7, 0xb7, 0xaa, 0xf, 0x17, 0x17, 0x17, 0x55, + 0x76, 0x4d, 0x87, 0x16, 0x29, 0x6d, 0xb5, 0x62, + 0xa, 0xa, 0x62, 0x78, 0xa, 0xe3, 0x4d, 0x8c, + 0x8c, 0xf1, 0xc2, 0x63, 0x63, 0x63, 0xc2, 0x4a, + 0xd2, 0x2f, 0xd5, 0x1b, 0x2f, 0x2f, 0xe, 0x4a, + 0x63, 0xd2, 0x19, 0xd5, 0x6e, 0x6e, 0xef, 0x19, + 0x79, 0x2f, 0xd2, 0x4a, 0x63, 0xae, 0xc5, 0x8f, + 0xd5, 0xef, 0xc2, 0x19, 0x6e, 0xe9, 0xe7, 0x2, + 0x79, 0x60, 0x19, 0x6e, 0x79, 0xc7, 0x96, 0x4a, + 0xd5, 0xef, 0x96, 0x73, 0xa0, 0x67, 0x8c, 0x24, + 0x1c, 0x4d, 0xb5, 0x82, 0x6d, 0x94, 0x87, 0xc9, + 0xe8, 0x4e, 0x2f, 0xad, 0xc3, 0x8c, 0x16, 0x29, + 0x8a, 0x62, 0x41, 0xad, 0xa5, 0x1, 0xb5, 0xa0, + 0xd2, 0xa5, 0x41, 0x30, 0x30, 0x3b, 0x5, 0xf1, + 0x1b, 0xa6, 0xc9, 0xd5, 0xd7, 0xef, 0xc2, 0xd2, + 0xe, 0xe9, 0xa5, 0xa5, 0xc5, 0x89, 0x67, 0x73, + 0x8f, 0xd7, 0xd5, 0x19, 0xef, 0x6e, 0xd2, 0xa5, + 0xc5, 0xa5, 0x2f, 0x8c, 0x8c, 0x24, 0x82, 0x6d, + 0xe3, 0xda, 0x62, 0x1c, 0x94, 0x1, 0x66, 0xe3, + 0x29, 0xa, 0xd1, 0x62, 0x62, 0xd1, 0xd1, 0xa, + 0x78, 0xd3, 0xac, 0xb5, 0x8c, 0x65, 0x76, 0x76, + 0xd1, 0x78, 0x6d, 0xbe, 0x66, 0x64, 0xab, 0x52, + 0x52, 0x64, 0x52, 0x1f, 0x55, 0x94, 0x1f, 0xb6, + 0xb6, 0xab, 0x52, 0x55, 0x65, 0x1, 0x49, 0x52, + 0x17, 0x52, 0x52, 0x52, 0x52, 0x52, 0x55, 0x17, + 0xb6, 0x52, 0x52, 0x37, 0x76, 0x24, 0x1, 0x9e, + 0x9e, 0xb8, 0xb6, 0x52, 0x66, 0x4d, 0xa4, 0x45, + 0xc2, 0x6b, 0x95, 0x4b, 0xf9, 0xdf, 0xe4, 0xf4, + 0xe1, 0x90, 0x4b, 0xc6, 0xe1, 0xe1, 0xb4, 0x4b, + 0xc6, 0xbf, 0xe2, 0xf4, 0xe2, 0xf9, 0xe2, 0x44, + 0xbf, 0xb4, 0xbb, 0xf9, 0xce, 0xb4, 0xbf, 0x44, + 0x4b, 0xb4, 0xf4, 0x44, 0xe2, 0xbf, 0xf4, 0xbf, + 0xf4, 0xf4, 0xf4, 0xf4, 0xbb, 0xf4, 0xe2, 0xe2, + 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xf4, 0x8d, 0x12, + 0x12, 0xcc, 0xf4, 0xf4, 0x12, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x7, 0xb4, 0xb4, 0xe1, 0xf4, 0xf4, 0xb4, 0xf4, + 0xbf, 0xbf, 0xf4, 0xbf, 0x7, 0xf4, 0xb4, 0x75, + 0x7, 0xf4, 0xbf, 0xf4, 0xe4, 0xe1, 0xb2, 0xdb, + 0x91, 0x92, 0x6, 0xbe, 0x66, 0xbe, 0x61, 0xf2, + 0x78, 0x78, 0x76, 0xd1, 0xa, 0x37, 0x65, 0x1f, + 0x5f, 0x5f, 0xf, 0x5f, 0xb6, 0xf, 0xb6, 0xb6, + 0xb6, 0xb6, 0x92, 0xaa, 0xb6, 0xb7, 0xf, 0x1d, + 0x92, 0xb6, 0xb6, 0xb6, 0xbe, 0x1f, 0x17, 0x17, + 0x78, 0x76, 0x6d, 0xab, 0xbe, 0x4d, 0x82, 0x4d, + 0x62, 0x6d, 0xd3, 0x6d, 0xa, 0x76, 0xb5, 0x94, + 0x58, 0x67, 0xa5, 0xd2, 0xf1, 0x79, 0x89, 0x19, + 0xd2, 0x79, 0xe9, 0x63, 0x89, 0x79, 0x6e, 0x19, + 0xa5, 0xe7, 0x96, 0xa5, 0xe, 0x5d, 0x77, 0x1b, + 0x1b, 0xe, 0x77, 0xd5, 0xd2, 0xf1, 0x6e, 0xd5, + 0xe, 0xa5, 0xc9, 0x96, 0xd2, 0x50, 0x60, 0x1b, + 0x5b, 0x1b, 0xd5, 0xc2, 0x42, 0xa6, 0x1b, 0x4a, + 0x6e, 0x77, 0x60, 0xc9, 0x73, 0xe7, 0x60, 0xa6, + 0x45, 0x58, 0x58, 0x68, 0x24, 0x58, 0x82, 0x59, + 0xa3, 0x49, 0x49, 0x67, 0xad, 0xad, 0x41, 0x42, + 0x30, 0x8a, 0x5, 0x5b, 0xc7, 0x24, 0x58, 0xb3, + 0x60, 0x67, 0x8c, 0xa6, 0x96, 0xa0, 0x42, 0x63, + 0x19, 0x1b, 0x5b, 0x1b, 0x6e, 0x6e, 0xa5, 0x2f, + 0x73, 0x42, 0x5a, 0x2f, 0xc2, 0x96, 0x1b, 0x63, + 0x19, 0x4a, 0xd7, 0x4a, 0xd5, 0xd2, 0x2f, 0x2f, + 0x42, 0x1b, 0xf1, 0x2f, 0x8c, 0x58, 0xe3, 0x8a, + 0x68, 0x67, 0xa, 0x76, 0x37, 0x78, 0xa, 0xa, + 0x5e, 0x78, 0xd1, 0x1c, 0x30, 0x41, 0xa, 0x62, + 0x62, 0xb5, 0x78, 0x78, 0x78, 0x78, 0xd1, 0xd1, + 0xa, 0x29, 0x4d, 0xe3, 0xab, 0xab, 0x82, 0xbe, + 0x61, 0xd3, 0xab, 0x66, 0x55, 0x55, 0xe3, 0x52, + 0x52, 0x55, 0x82, 0xbe, 0x94, 0xab, 0x1, 0x94, + 0x55, 0x65, 0x66, 0x52, 0x94, 0x55, 0xbe, 0xd3, + 0x66, 0x94, 0xc3, 0x82, 0xb5, 0x24, 0x8c, 0x8c, + 0xab, 0xab, 0x66, 0x66, 0xbe, 0x8c, 0xad, 0x5b, + 0x6e, 0xd7, 0xb1, 0xc6, 0x6b, 0x47, 0xf3, 0xe4, + 0xde, 0x6b, 0x9c, 0xb4, 0xdd, 0x97, 0xc6, 0xc6, + 0xf5, 0x93, 0xbb, 0x95, 0xf3, 0x97, 0xe4, 0xaf, + 0x97, 0x97, 0xc6, 0x12, 0x97, 0x4, 0xbf, 0xf4, + 0x97, 0x95, 0xe2, 0xe2, 0xbf, 0xe1, 0xf4, 0xbb, + 0x93, 0xc0, 0xf4, 0xe2, 0x93, 0xbb, 0x44, 0xe2, + 0x93, 0xbb, 0xe2, 0xe2, 0x93, 0xbd, 0xf4, 0x93, + 0x93, 0x93, 0x20, 0xf3, 0x93, 0x12, 0xe2, 0xe2, + 0x12, 0xe2, 0xe2, 0xe2, 0x12, 0xe2, 0x44, 0x95, + 0xbf, 0xe2, 0x44, 0x95, 0xe2, 0x44, 0x44, 0xe2, + 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0xe2, 0xb4, 0x95, 0xf9, 0xbb, 0xbf, 0x9a, + 0xbc, 0x4b, 0xcc, 0x9a, 0x7, 0xe1, 0xdf, 0xc6, + 0xf4, 0xc0, 0xe4, 0x81, 0x4b, 0x81, 0x57, 0xb, + 0x91, 0x52, 0x55, 0x55, 0xd3, 0xab, 0xbe, 0x29, + 0x76, 0x78, 0x23, 0x0, 0x23, 0x37, 0x61, 0x52, + 0xb6, 0xf, 0x1f, 0x49, 0xb6, 0xb6, 0x2c, 0xb7, + 0x17, 0x52, 0xf, 0x5f, 0xf, 0x17, 0x17, 0xf, + 0x5f, 0x5f, 0xb6, 0x17, 0x17, 0x1d, 0x3f, 0x1f, + 0x78, 0x78, 0x76, 0x78, 0x61, 0x78, 0x76, 0xa, + 0xb5, 0x67, 0x67, 0x58, 0xda, 0xb5, 0xa, 0x62, + 0x34, 0xe3, 0x8c, 0xd3, 0x67, 0x2f, 0x42, 0x1b, + 0x6e, 0x19, 0x19, 0x63, 0x63, 0x6e, 0x63, 0xd2, + 0x30, 0x58, 0xb3, 0x8, 0x2f, 0x8, 0xf0, 0x1b, + 0x1b, 0x4a, 0x19, 0x4a, 0x6e, 0x1b, 0xe9, 0xd2, + 0x2f, 0x2f, 0x2f, 0xa0, 0x67, 0x42, 0x63, 0x63, + 0x1b, 0x63, 0x19, 0x4a, 0x19, 0x63, 0x1b, 0xd5, + 0xd2, 0xa5, 0x42, 0x89, 0x89, 0x1b, 0x1b, 0x19, + 0x89, 0xec, 0x73, 0x2f, 0x8, 0xb3, 0x24, 0x41, + 0x87, 0x65, 0xad, 0x96, 0x5b, 0x8, 0x42, 0x89, + 0x63, 0x89, 0x42, 0x42, 0x42, 0x30, 0x5, 0x30, + 0xa6, 0x24, 0xa0, 0x63, 0x1b, 0x63, 0x19, 0x19, + 0x6e, 0x63, 0x1b, 0xf1, 0xd2, 0xd2, 0x8, 0xf0, + 0x89, 0xf1, 0xf1, 0x1b, 0x1b, 0x63, 0x63, 0x63, + 0x6e, 0x19, 0x4a, 0x79, 0xe9, 0xd2, 0x2, 0x1b, + 0x63, 0x63, 0x79, 0x2f, 0x2f, 0x30, 0x8a, 0xd3, + 0x8c, 0x41, 0x1c, 0x62, 0xa, 0x62, 0xa, 0x78, + 0xa, 0x62, 0xa, 0x62, 0x58, 0xd3, 0xa, 0x62, + 0x78, 0x78, 0x29, 0x62, 0x29, 0xd1, 0xd1, 0x0, + 0xd1, 0x62, 0x76, 0x6d, 0xac, 0xac, 0x61, 0xbe, + 0xac, 0x4d, 0x61, 0x76, 0xbe, 0x82, 0x5e, 0x37, + 0x37, 0x55, 0x4d, 0x37, 0x61, 0x5e, 0xac, 0x4d, + 0x4d, 0x5e, 0x55, 0x82, 0x82, 0x82, 0xbe, 0x37, + 0x5e, 0x8c, 0xab, 0xd3, 0xbe, 0xe3, 0x24, 0x87, + 0xa8, 0x2f, 0xb3, 0x4d, 0x6d, 0xbe, 0x82, 0x58, + 0x1b, 0xef, 0x6f, 0x9, 0x8e, 0x3, 0x8e, 0xe4, + 0xdd, 0x97, 0x12, 0xbf, 0xc0, 0x93, 0xf3, 0xbf, + 0xc0, 0x69, 0xb4, 0xb4, 0xc0, 0x93, 0xbf, 0x95, + 0x93, 0x93, 0xc0, 0xbf, 0x97, 0x4, 0xaf, 0xbf, + 0xbf, 0xc0, 0xbf, 0xe2, 0x95, 0xe2, 0x95, 0xe2, + 0xbf, 0xbb, 0xe2, 0xe2, 0x95, 0xe2, 0xbf, 0xf4, + 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0x93, + 0x93, 0x93, 0x12, 0x12, 0x12, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0xbf, 0x44, 0x44, 0xe2, + 0xbb, 0xbb, 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x95, 0x97, 0x93, 0xde, 0x57, 0xfd, 0x8e, 0xe1, + 0xf6, 0x26, 0xb1, 0xf4, 0xb4, 0x93, 0xc0, 0xbf, + 0xf3, 0x32, 0x32, 0xc4, 0x51, 0x3, 0x47, 0x25, + 0x50, 0xab, 0xac, 0x29, 0x61, 0x82, 0x87, 0x6d, + 0xa, 0xa, 0xd1, 0xd1, 0xa, 0x76, 0x78, 0x37, + 0xab, 0xab, 0x2f, 0xa8, 0xa7, 0xd3, 0x1, 0x1, + 0xab, 0x66, 0x94, 0x52, 0x61, 0x17, 0x52, 0x56, + 0x52, 0xab, 0xaa, 0x3f, 0x52, 0x1f, 0xf, 0xb6, + 0x55, 0x61, 0x37, 0x78, 0x16, 0xa, 0x78, 0x62, + 0xac, 0xab, 0x2f, 0x8c, 0x67, 0x41, 0x62, 0xa, + 0x62, 0xa, 0xa, 0xd1, 0x41, 0x8, 0x79, 0x2f, + 0xf1, 0x63, 0x63, 0x6e, 0x63, 0xd2, 0xe9, 0x63, + 0x63, 0x42, 0x1b, 0x42, 0x30, 0x89, 0xe, 0x2f, + 0x2f, 0xd2, 0xe, 0xe9, 0x63, 0xd2, 0xa5, 0x1b, + 0x89, 0x63, 0x4a, 0x1b, 0x30, 0xf0, 0x63, 0xc2, + 0xd2, 0x19, 0x19, 0xc5, 0xd2, 0x63, 0xd2, 0x19, + 0x1b, 0x19, 0x4a, 0x4a, 0x1b, 0x1b, 0x1b, 0xe, + 0x2f, 0x2f, 0x2f, 0xad, 0x73, 0xa5, 0xe, 0x96, + 0xf0, 0xa0, 0xf0, 0x19, 0x2f, 0xa4, 0x30, 0xf1, + 0x2, 0xc5, 0x79, 0x79, 0x1b, 0x63, 0x19, 0x19, + 0x63, 0xa0, 0x89, 0x4a, 0x4a, 0xd5, 0x19, 0xa5, + 0x6e, 0x4a, 0x63, 0x89, 0x1b, 0x1b, 0x63, 0x63, + 0x19, 0x89, 0x30, 0x8, 0x2f, 0xf1, 0x7a, 0x60, + 0x79, 0x19, 0x6e, 0x19, 0x19, 0x63, 0x73, 0x19, + 0x4a, 0xd2, 0x8, 0x41, 0x29, 0xa, 0x62, 0xa, + 0xd3, 0x8c, 0x8c, 0x30, 0x8c, 0x1c, 0x62, 0x8a, + 0x62, 0xb5, 0x62, 0xd1, 0xa, 0x62, 0xd1, 0xd3, + 0xd3, 0x24, 0x3b, 0xda, 0xb5, 0xa, 0x23, 0x23, + 0x23, 0xd1, 0xd1, 0x76, 0xf2, 0x76, 0x76, 0x82, + 0xac, 0x37, 0x4d, 0x82, 0xac, 0xab, 0x78, 0x37, + 0xf2, 0x78, 0x37, 0x37, 0x76, 0xf2, 0x4d, 0x37, + 0x61, 0x5e, 0x82, 0x82, 0x24, 0x76, 0x78, 0xa, + 0x4d, 0xbe, 0x55, 0xab, 0xab, 0xab, 0x82, 0x59, + 0xd4, 0xe8, 0x4e, 0x1, 0x82, 0x24, 0x82, 0x30, + 0xd4, 0x4f, 0xdf, 0xf4, 0xf4, 0xe4, 0xf8, 0x4b, + 0xbf, 0xbf, 0xbf, 0xf4, 0x4b, 0x81, 0x9a, 0xe2, + 0xf4, 0xe4, 0x4b, 0xbf, 0xe2, 0xbf, 0xe2, 0x95, + 0xfc, 0xe2, 0xbf, 0xe2, 0xe2, 0x4b, 0xbf, 0xe2, + 0xe2, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, + 0xe2, 0xbf, 0xe2, 0xf4, 0xe2, 0xf4, 0xf4, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0x12, 0xbf, 0x9, 0xf4, 0xe2, 0x44, 0xe2, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xbf, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe1, 0x81, 0xdd, 0xb4, 0x75, 0xc6, 0x81, 0xe4, + 0xbf, 0xe4, 0xbb, 0x95, 0x4b, 0xe4, 0xe4, 0xf4, + 0xe1, 0x9d, 0xdd, 0x85, 0x57, 0x83, 0x83, 0x88, + 0x4e, 0xab, 0xe3, 0xd1, 0x76, 0x4d, 0x5e, 0xac, + 0x78, 0x76, 0x23, 0xa, 0x4d, 0x37, 0x29, 0xe3, + 0x29, 0xd3, 0x8c, 0x49, 0xab, 0xd3, 0xab, 0xab, + 0xab, 0xd3, 0xab, 0x64, 0x49, 0x52, 0x91, 0x3f, + 0x1f, 0x1f, 0xf, 0x92, 0xf, 0x1f, 0xb6, 0x1f, + 0xb6, 0x52, 0x65, 0xc3, 0x5, 0x68, 0x82, 0xa, + 0x62, 0xa, 0xa, 0x5e, 0x78, 0x5e, 0x76, 0xa, + 0xb5, 0xab, 0x66, 0xe3, 0x5, 0x8, 0xa8, 0xd3, + 0x3b, 0x8, 0x30, 0x2f, 0xf1, 0x79, 0xe9, 0x1b, + 0x63, 0x19, 0xd5, 0x19, 0x6e, 0x63, 0x77, 0x2f, + 0x8, 0x2f, 0x60, 0xa5, 0xd2, 0xef, 0xd5, 0x6e, + 0x6e, 0xd5, 0xd7, 0xef, 0xd2, 0x6e, 0xa5, 0x60, + 0xf1, 0x77, 0xa5, 0x60, 0xa5, 0x8f, 0xd7, 0xd5, + 0x1b, 0x6e, 0xef, 0xd5, 0x19, 0x6e, 0x96, 0x2f, + 0x5a, 0x73, 0xe7, 0x89, 0xa5, 0x1b, 0xef, 0xd5, + 0xc2, 0x5b, 0x1b, 0xe, 0x6e, 0xd2, 0x5b, 0xa6, + 0x2f, 0x1b, 0xd9, 0x19, 0x6e, 0xc2, 0x19, 0xd5, + 0x19, 0x6e, 0x6e, 0xc5, 0x8f, 0xe5, 0xd5, 0x6e, + 0x8f, 0xe5, 0xd7, 0xd5, 0xe, 0x6e, 0x1b, 0x63, + 0x77, 0xd2, 0x89, 0x67, 0x67, 0x79, 0x1b, 0x89, + 0xf0, 0x63, 0x19, 0xd5, 0x4a, 0x19, 0x5b, 0x89, + 0x5d, 0xa5, 0x79, 0xb3, 0x58, 0x62, 0x1c, 0xa, + 0x4d, 0x29, 0xb5, 0x8c, 0x52, 0x5e, 0x62, 0xe3, + 0x61, 0xa, 0xd1, 0x62, 0x62, 0xa, 0x1c, 0x58, + 0xac, 0x76, 0x1c, 0x29, 0x78, 0x76, 0xd1, 0xa, + 0xa, 0xd1, 0x23, 0x76, 0xd1, 0xd1, 0xd1, 0x78, + 0x5e, 0xf2, 0x78, 0xf2, 0x61, 0xac, 0xac, 0x37, + 0x37, 0x37, 0x76, 0x62, 0x76, 0x76, 0x76, 0x76, + 0x78, 0x76, 0x4d, 0xbe, 0x37, 0x4d, 0x37, 0x78, + 0x6d, 0x6d, 0xe3, 0x68, 0x1, 0x4d, 0x4d, 0x8c, + 0x60, 0x49, 0x52, 0x52, 0x55, 0x82, 0x1, 0xd4, + 0x7c, 0xe5, 0xf8, 0xaf, 0xf4, 0xbf, 0xbf, 0xbf, + 0xbf, 0xe4, 0xbf, 0xe2, 0xb4, 0xb4, 0xbf, 0xf4, + 0xbf, 0xbf, 0xbf, 0xbf, 0xf4, 0xbf, 0xf4, 0xbf, + 0xaf, 0x8d, 0x9a, 0xf4, 0xaf, 0xbf, 0xbf, 0xbf, + 0xbf, 0x95, 0xe2, 0xf4, 0xaf, 0xe2, 0xe2, 0xf4, + 0xbf, 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xf4, 0xf4, 0xbc, + 0xbd, 0x32, 0x12, 0xc0, 0x12, 0xe2, 0x44, 0xe2, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x75, 0x90, 0xb4, 0xb4, 0xb4, 0xb4, 0x4b, 0xc6, + 0xf4, 0xb4, 0xe2, 0xf9, 0x90, 0x9f, 0x8d, 0xb4, + 0xe1, 0x90, 0xc6, 0xf4, 0xe4, 0x70, 0x81, 0x4f, + 0x4e, 0x94, 0xe3, 0x6d, 0x4d, 0x78, 0x76, 0x37, + 0x76, 0x23, 0x76, 0x23, 0x61, 0xac, 0x82, 0x82, + 0xac, 0xac, 0x52, 0x52, 0x66, 0xbe, 0xac, 0x8c, + 0x1, 0x94, 0x65, 0xad, 0xb3, 0x94, 0x49, 0x1d, + 0x94, 0x52, 0xf, 0xf, 0xb6, 0x17, 0x52, 0x1f, + 0x49, 0x1f, 0x1f, 0xc3, 0x45, 0x87, 0xbe, 0x78, + 0xd1, 0x78, 0x76, 0x78, 0x76, 0x37, 0x37, 0xa, + 0x78, 0xac, 0x61, 0xa, 0x82, 0xa7, 0x52, 0xe3, + 0x30, 0x8, 0xb3, 0x41, 0x67, 0xc5, 0xc5, 0x79, + 0x1b, 0xd5, 0xd5, 0xd5, 0xc2, 0x6e, 0xa5, 0xa5, + 0x1b, 0x1b, 0xe9, 0xe9, 0xe9, 0xef, 0xe5, 0xc2, + 0x6e, 0xe5, 0x27, 0xc5, 0xd5, 0xd9, 0xe7, 0x60, + 0xe, 0x4a, 0xd9, 0x42, 0x2f, 0xd5, 0xef, 0xd5, + 0xd2, 0x6e, 0x6e, 0xa5, 0xd5, 0x6e, 0x6e, 0x1b, + 0x19, 0x6e, 0x6e, 0xe, 0xae, 0x6e, 0xd5, 0xc2, + 0x1b, 0x63, 0xe, 0xa5, 0xa5, 0xd5, 0xe, 0x1b, + 0x89, 0x63, 0xd5, 0xd5, 0x6e, 0x19, 0x19, 0xc5, + 0xc5, 0xef, 0x8f, 0xd2, 0xc2, 0xef, 0x8f, 0xd5, + 0xef, 0x8f, 0xd5, 0x4a, 0x6e, 0xc5, 0x63, 0xf1, + 0xa5, 0xd2, 0xe, 0xf1, 0xf1, 0x1b, 0x63, 0x63, + 0x19, 0x63, 0x63, 0x19, 0x79, 0x8, 0x42, 0x2f, + 0x2c, 0x79, 0x79, 0x2f, 0x67, 0x41, 0x8a, 0x8a, + 0x1c, 0x62, 0x29, 0x62, 0x37, 0x76, 0x78, 0x5e, + 0x61, 0x76, 0x6d, 0x30, 0x67, 0x8a, 0x8a, 0x58, + 0x66, 0x76, 0x62, 0x6d, 0x76, 0xd1, 0x23, 0x37, + 0x78, 0xd1, 0xd1, 0x76, 0xd1, 0xd1, 0x76, 0x76, + 0x76, 0x76, 0x76, 0x78, 0x76, 0x76, 0x76, 0x37, + 0x29, 0xf2, 0xd1, 0x29, 0x76, 0x23, 0x23, 0x76, + 0xa, 0x78, 0xf2, 0x76, 0xf2, 0x76, 0x37, 0xa, + 0x16, 0x8a, 0x87, 0xa0, 0x58, 0xb5, 0x78, 0xe3, + 0xc3, 0x1, 0x66, 0x61, 0x5e, 0xbe, 0x82, 0xc9, + 0xc2, 0xe5, 0xbd, 0xb4, 0xc6, 0xc0, 0xe4, 0xbf, + 0xc0, 0xdd, 0xb2, 0xbf, 0xbf, 0xc0, 0xe4, 0xf4, + 0xc0, 0x97, 0xbf, 0xbb, 0xbf, 0x97, 0xb4, 0xf4, + 0xaf, 0x32, 0xc6, 0xb4, 0xc0, 0x97, 0xbb, 0xf4, + 0xc0, 0x12, 0xf4, 0xf4, 0xc0, 0x12, 0xf4, 0x44, + 0x93, 0x44, 0xbf, 0xf4, 0xbb, 0xbb, 0xe2, 0xe2, + 0xf4, 0xf4, 0x44, 0xe2, 0x93, 0xe2, 0x44, 0xbb, + 0x93, 0x93, 0x12, 0x93, 0x12, 0xe2, 0xe2, 0x44, + 0x12, 0xe2, 0xe2, 0x44, 0xbb, 0x44, 0x44, 0xf4, + 0xe2, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0xe4, 0xe4, 0xbf, 0xf4, 0xe1, 0xdd, 0xe4, + 0x7, 0x57, 0xb4, 0xf4, 0xf8, 0x81, 0xe4, 0xbf, + 0xbf, 0xbd, 0xf3, 0xe4, 0xe1, 0xfd, 0x9d, 0xa9, + 0x2c, 0x66, 0xe3, 0x29, 0xac, 0x4d, 0x29, 0x29, + 0x29, 0x23, 0x23, 0xd1, 0xd1, 0x76, 0x76, 0x61, + 0x61, 0xac, 0x61, 0x55, 0x82, 0x4d, 0x4d, 0x58, + 0x68, 0x82, 0x37, 0xbe, 0x82, 0x61, 0x66, 0x66, + 0x1, 0xa7, 0xa7, 0x2f, 0x2f, 0x8c, 0x66, 0x65, + 0xab, 0x55, 0x17, 0x4d, 0x37, 0x37, 0xf2, 0x78, + 0x29, 0x68, 0xe3, 0x29, 0x45, 0x5, 0x62, 0x78, + 0xd1, 0xd1, 0xd1, 0xd1, 0xa, 0x37, 0x66, 0xd3, + 0x2f, 0x2f, 0x67, 0x41, 0xa0, 0xa5, 0x2f, 0x24, + 0xa5, 0xd2, 0xa5, 0x2f, 0x79, 0x63, 0xe, 0x1b, + 0x19, 0xd7, 0x4a, 0x63, 0x63, 0xc2, 0xe, 0xd2, + 0xa5, 0x19, 0xa5, 0x2f, 0xa5, 0xd5, 0xd5, 0xd2, + 0x1b, 0x19, 0x4a, 0x63, 0x6e, 0x19, 0xd4, 0xa5, + 0xe9, 0x6e, 0xe9, 0xa5, 0xa5, 0x63, 0x6e, 0x19, + 0x6e, 0x6e, 0x6e, 0x6e, 0x63, 0x19, 0xd2, 0x42, + 0x5a, 0x6e, 0x19, 0x6e, 0x1b, 0x6e, 0x19, 0x19, + 0x63, 0x19, 0x63, 0x5d, 0xd2, 0xe, 0xe7, 0x2f, + 0x2f, 0xe, 0x19, 0x63, 0x1b, 0x63, 0x4a, 0x4a, + 0x19, 0x19, 0x6e, 0x42, 0x21, 0x42, 0x63, 0x89, + 0x73, 0x96, 0x19, 0x19, 0x63, 0x63, 0x89, 0x6e, + 0x63, 0x42, 0x89, 0xf1, 0x41, 0x41, 0x89, 0x8, + 0x41, 0x8c, 0xf1, 0x2f, 0x41, 0x8a, 0x5, 0x5, + 0x41, 0xd1, 0xa, 0x62, 0xa, 0xd1, 0xd1, 0x78, + 0x23, 0xa, 0x62, 0x41, 0x41, 0x41, 0xb5, 0x82, + 0x6d, 0x76, 0x78, 0x78, 0x78, 0x78, 0x23, 0x76, + 0x76, 0x23, 0x76, 0xa, 0xf2, 0x76, 0x76, 0xac, + 0x78, 0x76, 0x78, 0x76, 0x23, 0x23, 0xd1, 0x76, + 0x76, 0xd1, 0xd1, 0x78, 0x76, 0x23, 0x23, 0xd1, + 0x76, 0x23, 0x23, 0x23, 0x76, 0xa, 0x76, 0x78, + 0x4d, 0x5e, 0x82, 0xb5, 0xac, 0x4d, 0x62, 0xbe, + 0xb3, 0x82, 0xbe, 0xe3, 0xe3, 0x5e, 0x82, 0xb3, + 0x6e, 0xe5, 0xfd, 0xc6, 0x99, 0x9c, 0x81, 0xbf, + 0xf3, 0x97, 0xc0, 0xbf, 0xe4, 0x93, 0xe4, 0x4b, + 0x93, 0x93, 0xbb, 0xaf, 0xb4, 0x93, 0xe4, 0xbf, + 0xbf, 0x93, 0xf5, 0xe4, 0x97, 0xc0, 0xbf, 0xbf, + 0x93, 0x93, 0x95, 0xf4, 0x93, 0x69, 0x95, 0xbf, + 0xbf, 0xaf, 0x44, 0xf4, 0x93, 0xe2, 0xe2, 0x44, + 0xf4, 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0xf4, 0x93, + 0x12, 0xf3, 0xe2, 0xf3, 0xf3, 0xe2, 0x44, 0xe2, + 0xbf, 0x95, 0x44, 0x44, 0xbf, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0x93, 0x32, 0xf8, 0x81, 0x9d, 0xfd, 0xdd, + 0xc6, 0x83, 0x93, 0xe4, 0xc0, 0x93, 0x6f, 0x81, + 0xc0, 0x47, 0xfd, 0x9c, 0x7d, 0x5d, 0x5d, 0x77, + 0x8c, 0xd3, 0x78, 0xe3, 0xd3, 0xac, 0x6, 0x16, + 0xd1, 0xa, 0x76, 0x23, 0x62, 0xd1, 0xd1, 0xd1, + 0x76, 0x78, 0x78, 0x4d, 0x4d, 0x61, 0x78, 0x6d, + 0x4d, 0x76, 0xd1, 0x78, 0x6d, 0x78, 0x76, 0x82, + 0x8, 0xf1, 0x87, 0x87, 0x8, 0xa7, 0xd3, 0xbe, + 0x37, 0x6, 0x82, 0x4d, 0xbe, 0x37, 0xa, 0x76, + 0x1c, 0xd3, 0x78, 0x29, 0x8a, 0x58, 0xbe, 0x29, + 0x29, 0x16, 0xa, 0x62, 0x16, 0x29, 0xa, 0xa, + 0x62, 0xd3, 0xb5, 0x6d, 0xa4, 0xad, 0x1, 0x1, + 0x2f, 0x73, 0xb3, 0x67, 0x89, 0x63, 0xa5, 0x2f, + 0x63, 0xd5, 0xd5, 0xa5, 0xd2, 0x1b, 0xe, 0xa5, + 0x19, 0xd5, 0x6e, 0x8, 0xe9, 0xe9, 0x2f, 0x30, + 0xf0, 0x1b, 0xa5, 0x50, 0xd2, 0x6e, 0x89, 0xd2, + 0xd2, 0x4a, 0x19, 0x73, 0x89, 0xd5, 0xd5, 0xa5, + 0xa5, 0x5b, 0x79, 0xa5, 0xc5, 0x63, 0x19, 0x1b, + 0x19, 0x19, 0x4a, 0x1b, 0x63, 0x4a, 0x4a, 0xe, + 0x63, 0x19, 0xe9, 0x79, 0x2f, 0x63, 0x19, 0x42, + 0x63, 0x4a, 0x19, 0x6e, 0x42, 0x73, 0x6e, 0xd2, + 0xa5, 0x63, 0x1b, 0x63, 0x6e, 0x19, 0x19, 0x1b, + 0xc5, 0x63, 0x63, 0x19, 0xf1, 0x8, 0x73, 0xf1, + 0x2c, 0x2f, 0xf1, 0x30, 0x58, 0xf1, 0x63, 0xf1, + 0x1c, 0xa, 0xa, 0x62, 0x41, 0xd1, 0xa, 0xb5, + 0xf2, 0x76, 0x1c, 0x1c, 0x62, 0x62, 0x29, 0xa, + 0xd1, 0x23, 0xa, 0x62, 0xa, 0xa, 0x5e, 0xe3, + 0x4d, 0x76, 0xa, 0x37, 0x76, 0xd1, 0xd1, 0x23, + 0xd1, 0x23, 0x23, 0xd1, 0x76, 0xd1, 0x76, 0x76, + 0x76, 0x23, 0xa, 0x29, 0xd1, 0xd1, 0x76, 0x23, + 0x23, 0x23, 0xa, 0x76, 0x76, 0x76, 0x76, 0x78, + 0x62, 0x23, 0x23, 0xa, 0x6d, 0x37, 0x76, 0x76, + 0xd1, 0x78, 0x4d, 0x76, 0x78, 0x78, 0x4d, 0x82, + 0x68, 0x87, 0x55, 0x65, 0x65, 0x29, 0x55, 0xa8, + 0x7c, 0x90, 0xe1, 0x95, 0xbf, 0xbf, 0xb4, 0xf4, + 0xf4, 0xf4, 0xb4, 0xf4, 0x95, 0x95, 0xf4, 0x9a, + 0xb4, 0xf4, 0xf4, 0xf4, 0xb4, 0xe2, 0xf4, 0xe2, + 0x95, 0xbf, 0xbb, 0xbb, 0xf4, 0xe2, 0xf4, 0xf4, + 0xe2, 0xf4, 0x44, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0x7, 0xd8, 0x81, 0xed, 0xd8, 0x81, 0xb4, + 0xe4, 0xf3, 0xe4, 0xf4, 0xbf, 0xdd, 0xf5, 0xe4, + 0xdd, 0x9d, 0x9f, 0xfa, 0xca, 0x27, 0x27, 0x9d, + 0x4e, 0xd3, 0x4d, 0x4d, 0xe3, 0x5e, 0x76, 0xd1, + 0xd1, 0xd1, 0x23, 0xd1, 0x76, 0x76, 0x76, 0xa, + 0x29, 0x76, 0x78, 0x76, 0xa, 0xd1, 0x76, 0x76, + 0x76, 0x76, 0x76, 0x76, 0x4d, 0x29, 0x78, 0xe3, + 0x87, 0xe3, 0xac, 0x4d, 0x6d, 0x37, 0x37, 0xac, + 0x4d, 0x4d, 0xbe, 0x61, 0x82, 0x82, 0x76, 0xa, + 0x29, 0xd1, 0x23, 0xa, 0x16, 0x78, 0xf2, 0x4d, + 0x82, 0x68, 0x4d, 0x3b, 0x5, 0x6d, 0x29, 0xa, + 0x62, 0xe3, 0xe3, 0xa, 0xbe, 0x6, 0x66, 0x6, + 0x60, 0xc7, 0x58, 0x2f, 0xd2, 0xd5, 0x6e, 0xf1, + 0x6e, 0xe5, 0x50, 0x2f, 0xe, 0xd5, 0xd5, 0xd5, + 0xe5, 0xe5, 0xe5, 0xd5, 0x6e, 0xd5, 0x1b, 0x67, + 0x2f, 0xa5, 0x5a, 0x67, 0xa5, 0xef, 0x8f, 0xc2, + 0x19, 0xef, 0xd7, 0x6e, 0xe, 0xd5, 0xc5, 0xa6, + 0x67, 0x60, 0x2f, 0x2f, 0xe9, 0xd5, 0xd5, 0x4a, + 0x4a, 0xd5, 0xd5, 0x63, 0x79, 0xc5, 0xe5, 0xa5, + 0xd5, 0xef, 0x19, 0x6e, 0x63, 0x8f, 0x4a, 0x19, + 0xd5, 0x8f, 0x4a, 0xd2, 0xf1, 0x79, 0x6e, 0x6e, + 0x6e, 0x63, 0x4a, 0x19, 0xd5, 0x63, 0x89, 0x19, + 0x6e, 0x6e, 0xe, 0x2, 0x67, 0x67, 0x8c, 0xd3, + 0x5e, 0xab, 0x67, 0x1, 0xd3, 0x1, 0x60, 0x2f, + 0xd3, 0xa, 0x62, 0x62, 0xd1, 0xa, 0xd1, 0xa, + 0x76, 0xa, 0x62, 0x76, 0x62, 0xd1, 0x29, 0xa, + 0x23, 0x0, 0xa, 0xa, 0x78, 0x78, 0x37, 0x76, + 0x76, 0xd1, 0xd1, 0x23, 0xd1, 0x76, 0xa, 0x76, + 0x76, 0xa, 0x23, 0x76, 0x76, 0xd1, 0xd1, 0x23, + 0x23, 0x23, 0x76, 0x23, 0x76, 0x23, 0xa, 0xd1, + 0x23, 0x23, 0xd1, 0xd1, 0x76, 0x76, 0x76, 0x76, + 0xd1, 0xd1, 0xd1, 0x78, 0x76, 0x76, 0x76, 0x78, + 0x76, 0xd1, 0x78, 0x78, 0x4d, 0x76, 0xd1, 0xbe, + 0x82, 0xe3, 0x37, 0x66, 0x66, 0x82, 0xa8, 0x7e, + 0x7d, 0x90, 0x86, 0xb4, 0x95, 0xe4, 0xe2, 0x95, + 0xbb, 0xbf, 0xbf, 0xf4, 0xf4, 0xbf, 0xf4, 0x95, + 0xbf, 0xbf, 0xaf, 0xb4, 0xe2, 0xb4, 0xf4, 0xf4, + 0xb4, 0xbb, 0xbb, 0x9a, 0x95, 0x95, 0xf4, 0xf4, + 0xf4, 0xbf, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, + 0xf4, 0xf4, 0x44, 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe4, 0xf3, 0x44, 0xe2, 0x12, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x9a, 0x7, 0xe1, 0xf4, 0xbf, 0xf4, 0xcc, 0xf4, + 0xf4, 0x95, 0xbf, 0xf4, 0xbf, 0x9a, 0xbc, 0x9a, + 0xf4, 0x9a, 0x75, 0xb4, 0xb4, 0xc6, 0x90, 0x18, + 0x22, 0xab, 0x4d, 0x82, 0x4d, 0x78, 0x76, 0x37, + 0x76, 0x23, 0x23, 0x23, 0x76, 0x76, 0xa, 0x4d, + 0x76, 0xd1, 0x76, 0x76, 0x76, 0xd1, 0xd1, 0xf2, + 0x76, 0x23, 0x76, 0x78, 0x78, 0xd1, 0x78, 0xbe, + 0xe3, 0x4d, 0x6d, 0x76, 0x78, 0x76, 0x78, 0x37, + 0x37, 0x76, 0x37, 0x4d, 0x4d, 0x4d, 0x76, 0x76, + 0x29, 0x76, 0xd1, 0xd1, 0x76, 0xa, 0x23, 0x76, + 0x6d, 0xbe, 0x82, 0x6d, 0xa4, 0xb3, 0x6d, 0x62, + 0x62, 0x62, 0x5e, 0xe3, 0x4d, 0x4d, 0xac, 0xac, + 0x8c, 0x49, 0x52, 0x2f, 0xa5, 0xd4, 0xef, 0xa5, + 0xe, 0x8f, 0xc9, 0x8, 0xd2, 0xc2, 0x5d, 0xae, + 0xc5, 0xef, 0xef, 0xc5, 0xa5, 0x77, 0xd4, 0x73, + 0x79, 0xe, 0x73, 0x67, 0x96, 0xef, 0xd5, 0xc5, + 0xa5, 0xd2, 0xd5, 0xc5, 0x7a, 0xe9, 0x6e, 0x1b, + 0x96, 0x6e, 0x73, 0x73, 0x1b, 0xd5, 0xd5, 0x4a, + 0xc5, 0x6e, 0xc2, 0xd2, 0xa5, 0xc5, 0x6e, 0xc2, + 0xe, 0xd5, 0x19, 0x19, 0x63, 0x1b, 0x19, 0x19, + 0xe, 0x5d, 0xc2, 0x63, 0x42, 0x7a, 0x63, 0x89, + 0x1b, 0x19, 0x19, 0x19, 0xe, 0xe9, 0x63, 0x2, + 0x79, 0x79, 0x1b, 0x42, 0x1b, 0x2f, 0x58, 0x62, + 0xa, 0xd1, 0xa, 0x78, 0x76, 0x6d, 0x58, 0xd3, + 0xa, 0x62, 0xb5, 0xa, 0xd1, 0x29, 0x62, 0xa, + 0xd1, 0xa, 0x23, 0xd1, 0x76, 0xd1, 0x23, 0x23, + 0xa, 0x23, 0xa, 0xd1, 0x76, 0x78, 0x76, 0xd1, + 0xd1, 0x23, 0xd1, 0xd1, 0xd1, 0x76, 0x76, 0x76, + 0x76, 0x76, 0x78, 0x23, 0x23, 0x23, 0xd1, 0xd1, + 0xd1, 0x23, 0x23, 0x23, 0xd1, 0x23, 0xd1, 0xa, + 0x76, 0xd1, 0xa, 0x76, 0xd1, 0x23, 0x76, 0x23, + 0x76, 0x76, 0xd1, 0xd1, 0xa, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0x62, 0x62, 0x78, 0xa, 0x78, 0xd1, + 0x76, 0x78, 0x37, 0x37, 0x5e, 0xab, 0xa8, 0x8b, + 0x39, 0xc2, 0x99, 0xb4, 0xb4, 0x93, 0xdd, 0xfc, + 0x12, 0x93, 0x95, 0xbf, 0x4b, 0xc0, 0xe4, 0xf4, + 0xc0, 0x97, 0x99, 0xbb, 0x97, 0x69, 0xaf, 0x75, + 0xff, 0x97, 0xb4, 0xb4, 0x93, 0x69, 0xe4, 0x20, + 0xc0, 0x93, 0x95, 0xbb, 0x97, 0x12, 0xe2, 0xf4, + 0x93, 0x93, 0xe2, 0xe2, 0x93, 0x93, 0xf4, 0x44, + 0x93, 0xe2, 0xe2, 0x44, 0x26, 0xe2, 0xe2, 0xb4, + 0x12, 0x12, 0x12, 0xf3, 0x95, 0xbf, 0x44, 0x44, + 0x95, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0x4b, 0xb4, 0xbb, 0xf4, 0xe4, 0xe1, 0xe1, + 0xbf, 0xb4, 0x7, 0x75, 0x4b, 0xde, 0x90, 0xb4, + 0xb4, 0x4b, 0x81, 0xf4, 0xb4, 0xd8, 0x2a, 0x22, + 0x3f, 0x52, 0xab, 0x66, 0x55, 0x82, 0xac, 0xbe, + 0xa, 0x23, 0xd1, 0x23, 0xd1, 0x23, 0x76, 0x37, + 0x76, 0x76, 0x76, 0x62, 0xd1, 0xd1, 0x23, 0x76, + 0x23, 0x23, 0x23, 0x76, 0x76, 0xd1, 0x76, 0xf2, + 0x37, 0x78, 0x4d, 0x61, 0x76, 0x76, 0x76, 0xd1, + 0xd1, 0x0, 0xd1, 0x23, 0xd1, 0x76, 0x76, 0x76, + 0x76, 0xa, 0x62, 0xa, 0x1c, 0x29, 0xd1, 0xa, + 0x78, 0x78, 0xa, 0x82, 0x5e, 0x4d, 0x1a, 0xb5, + 0xb5, 0xe3, 0x6d, 0xda, 0x41, 0x6d, 0x6d, 0x6d, + 0x78, 0xac, 0xe3, 0x5, 0x67, 0xa6, 0xa5, 0xd2, + 0x63, 0xe, 0x1b, 0x63, 0x19, 0x6e, 0x73, 0x73, + 0x42, 0xc2, 0x5d, 0x5d, 0x42, 0xe, 0x63, 0x19, + 0x63, 0x19, 0x1b, 0x89, 0x1b, 0x63, 0x63, 0x79, + 0x67, 0x8, 0xa5, 0xe, 0xa5, 0x6e, 0x89, 0x19, + 0x4a, 0x19, 0x63, 0x1b, 0x63, 0xd2, 0x19, 0xd5, + 0x60, 0x73, 0x42, 0x79, 0x42, 0x63, 0x1b, 0x1b, + 0x19, 0x63, 0x63, 0x63, 0x2d, 0xf1, 0x19, 0x19, + 0x6e, 0xd2, 0x19, 0x63, 0x63, 0x63, 0x63, 0x89, + 0x89, 0x63, 0x6e, 0x19, 0x42, 0x30, 0x8, 0x58, + 0x8a, 0xf1, 0x8, 0x30, 0xf1, 0xf1, 0x8a, 0x1c, + 0xa, 0x23, 0xd1, 0x23, 0x23, 0x23, 0xa, 0x76, + 0xd1, 0x62, 0xa, 0xd1, 0xa, 0x62, 0xa, 0x62, + 0xd1, 0xa, 0xa, 0x0, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x76, 0x76, 0xd1, 0xd1, 0xd1, 0x76, + 0xd1, 0xa, 0xd1, 0xd1, 0x78, 0xa, 0x76, 0x23, + 0x76, 0xd1, 0x76, 0x76, 0x23, 0xd1, 0x37, 0x76, + 0x76, 0x23, 0x0, 0x23, 0x0, 0x23, 0xa, 0xa, + 0x76, 0xd1, 0x76, 0xa, 0x76, 0xa, 0xd1, 0xd1, + 0xd1, 0xd1, 0xa, 0x78, 0x76, 0x78, 0x76, 0xd1, + 0xa, 0x23, 0xd1, 0xd1, 0x76, 0xd1, 0x76, 0x78, + 0x78, 0x78, 0x78, 0xe3, 0x82, 0x8c, 0x60, 0x90, + 0x9c, 0x69, 0xc0, 0x9a, 0xc4, 0x12, 0xb4, 0xe1, + 0xe4, 0x93, 0xe2, 0xbf, 0xaf, 0x12, 0xc0, 0xf4, + 0xbb, 0x93, 0x12, 0xb4, 0xde, 0x93, 0xbb, 0xbf, + 0xbf, 0x97, 0xbf, 0xbf, 0x93, 0x97, 0xbb, 0xe2, + 0xb4, 0xbf, 0xe2, 0xe2, 0x97, 0xbf, 0xe2, 0xe2, + 0x95, 0xe2, 0xe2, 0xe2, 0xee, 0xe2, 0xe2, 0xe2, + 0xf4, 0xf4, 0xe2, 0xe2, 0xf3, 0xe2, 0x44, 0xe2, + 0xf3, 0xbf, 0xbf, 0xbf, 0xbf, 0xbb, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x81, 0x93, 0x93, 0xe4, 0xe4, 0x8e, 0xa9, 0x75, + 0xf3, 0x97, 0x28, 0xdd, 0xf3, 0x97, 0x97, 0xdd, + 0xb4, 0x6f, 0xfd, 0x57, 0x81, 0x3, 0x4e, 0x1d, + 0x52, 0xab, 0x66, 0xac, 0x78, 0x29, 0xbe, 0xac, + 0x76, 0xa, 0xd1, 0x76, 0xd1, 0xd1, 0xd1, 0x76, + 0x76, 0x78, 0x4d, 0xac, 0x76, 0xd1, 0x23, 0xa, + 0x76, 0xd1, 0xd1, 0x23, 0x76, 0x76, 0x23, 0xd1, + 0x76, 0x78, 0xf2, 0x4d, 0x37, 0xd1, 0xd1, 0xa, + 0xd1, 0xd1, 0xd1, 0x76, 0xd1, 0x23, 0xd1, 0x78, + 0xd1, 0xa, 0x78, 0xac, 0xb5, 0x37, 0x29, 0x4d, + 0x78, 0x76, 0xe3, 0xbe, 0xe3, 0xe3, 0x78, 0xe3, + 0xac, 0x78, 0x76, 0x6d, 0x4d, 0x76, 0x78, 0x4d, + 0xe3, 0x41, 0x8c, 0xac, 0xb5, 0x1c, 0x58, 0x2f, + 0xe, 0xa5, 0xd2, 0x63, 0x79, 0x63, 0xe9, 0xc5, + 0xc5, 0x77, 0xc9, 0x1b, 0x63, 0xe, 0x2f, 0x6e, + 0x63, 0xd2, 0x6e, 0xe, 0x79, 0xa5, 0x19, 0x6e, + 0x1b, 0x63, 0x1b, 0x1b, 0x19, 0x6e, 0x79, 0xd2, + 0xd5, 0x77, 0x19, 0x63, 0xc5, 0x77, 0x8f, 0x63, + 0x19, 0x19, 0x79, 0x8, 0xf1, 0x96, 0xf1, 0x79, + 0xd2, 0xd2, 0xa5, 0x63, 0xd2, 0xd2, 0x6e, 0x1b, + 0x63, 0x6e, 0x63, 0xf1, 0x8, 0x8, 0xf1, 0xa5, + 0x79, 0x79, 0x8, 0x63, 0x19, 0x63, 0xd2, 0x30, + 0x73, 0x42, 0x58, 0x62, 0x41, 0x41, 0xa, 0x62, + 0xa, 0xd1, 0xd1, 0xd1, 0x29, 0x8a, 0x62, 0xd1, + 0xd1, 0x23, 0x0, 0xd1, 0x23, 0xd1, 0xa, 0xa, + 0x78, 0x37, 0x16, 0xd1, 0xa, 0xa, 0xd1, 0x34, + 0xa, 0xa, 0x78, 0xd1, 0xd1, 0xd1, 0x76, 0x76, + 0x23, 0x76, 0x78, 0x76, 0x78, 0x4d, 0x29, 0x4d, + 0xa, 0x76, 0xd1, 0xd1, 0xa, 0xa, 0x37, 0x76, + 0x76, 0x76, 0x5e, 0x37, 0x76, 0x29, 0x78, 0x4d, + 0x78, 0xa, 0x78, 0x76, 0xa, 0x6d, 0x37, 0x37, + 0x76, 0x29, 0xbe, 0x55, 0xb5, 0x4d, 0x82, 0xa, + 0x76, 0x4d, 0x4d, 0xd1, 0x62, 0x76, 0x6d, 0xbe, + 0x61, 0x8a, 0xb3, 0x52, 0xa8, 0x59, 0xd4, 0x48, + 0x57, 0xb4, 0x9a, 0x4b, 0x4b, 0xe4, 0xf4, 0xbf, + 0xbb, 0xe2, 0xb4, 0xe2, 0xbf, 0xbf, 0xf4, 0x75, + 0x7, 0xbf, 0xbf, 0xbb, 0xbf, 0xaf, 0xf4, 0xe2, + 0xf4, 0xb4, 0xbb, 0xb4, 0x9a, 0xf4, 0xf4, 0xf4, + 0xbb, 0xf4, 0xe2, 0xe2, 0x44, 0xf4, 0xbb, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, 0x44, 0xe2, + 0xe2, 0x44, 0x44, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0x44, 0x44, 0xc0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0x9, 0xcf, 0x57, 0xe1, 0xf3, 0xd8, 0xe1, + 0xf4, 0xc4, 0x12, 0xb4, 0xb4, 0xdd, 0x81, 0xe1, + 0xe4, 0xbd, 0x40, 0xcb, 0xf6, 0x1e, 0x40, 0x51, + 0xa8, 0x94, 0xac, 0x4d, 0x6d, 0x78, 0x76, 0x76, + 0x76, 0xd1, 0x76, 0x76, 0x23, 0x76, 0xd1, 0xd1, + 0x37, 0xd1, 0xbe, 0x66, 0x61, 0x78, 0x76, 0x76, + 0x76, 0x76, 0x76, 0xd1, 0xd1, 0x23, 0xd1, 0xa, + 0x76, 0x78, 0x78, 0x78, 0x76, 0x76, 0x37, 0x37, + 0x78, 0x78, 0x37, 0x4d, 0xac, 0x29, 0x6d, 0x78, + 0x23, 0xa, 0xa, 0xf2, 0x78, 0x37, 0x66, 0x66, + 0x82, 0x82, 0xc3, 0xa8, 0x1, 0x82, 0x82, 0x5e, + 0x76, 0xac, 0x76, 0x62, 0x78, 0x6d, 0x4d, 0xe3, + 0xb5, 0xbe, 0x24, 0x68, 0xe3, 0xe3, 0x6d, 0xa0, + 0x67, 0x1, 0xa8, 0xe9, 0x79, 0x60, 0xa5, 0x77, + 0xd5, 0x8f, 0x1b, 0x1b, 0xd5, 0x77, 0x5a, 0x42, + 0x60, 0x60, 0x72, 0xd5, 0xd2, 0x77, 0xa5, 0x19, + 0x63, 0xd5, 0xd9, 0x89, 0x1b, 0x6e, 0xa5, 0x63, + 0xa5, 0x60, 0xa5, 0xd2, 0x6e, 0xe, 0x1b, 0x63, + 0x4a, 0xc2, 0xe, 0x5b, 0x73, 0x2f, 0x67, 0x2f, + 0x79, 0x60, 0x60, 0xa5, 0x6e, 0xc5, 0x5a, 0x5b, + 0x89, 0xe9, 0x2, 0x8, 0x58, 0x58, 0x41, 0x67, + 0x79, 0x8, 0x58, 0x30, 0x6e, 0xc2, 0xd2, 0x1b, + 0x5b, 0xa5, 0x1, 0xa, 0x62, 0x62, 0xa, 0x62, + 0x62, 0x23, 0xa, 0xd1, 0xa, 0x41, 0x41, 0x23, + 0x23, 0x23, 0xd1, 0xa, 0x62, 0x78, 0xd1, 0xd1, + 0x76, 0x76, 0x5e, 0x6, 0xa, 0x76, 0xa, 0xd1, + 0x78, 0x76, 0x5e, 0x76, 0x78, 0x23, 0xd1, 0x78, + 0xd1, 0x78, 0x4d, 0x4d, 0x78, 0x76, 0xbe, 0xac, + 0xac, 0x4d, 0xa, 0x76, 0x37, 0xa, 0x4d, 0xd1, + 0x78, 0x76, 0x17, 0x17, 0x61, 0xbe, 0x55, 0x52, + 0x55, 0x24, 0xab, 0x4d, 0xbe, 0x87, 0x64, 0xbe, + 0x4d, 0x82, 0x1f, 0x1d, 0x1d, 0x52, 0x52, 0x52, + 0x65, 0x67, 0xb3, 0x82, 0x24, 0x82, 0xa7, 0x94, + 0x66, 0x8c, 0x52, 0x1d, 0x91, 0x77, 0xfb, 0x88, + 0xf6, 0xe4, 0xf4, 0xf4, 0xc6, 0xb4, 0xaf, 0xf4, + 0xf4, 0xbf, 0xe4, 0xf4, 0x7, 0xf4, 0xe2, 0xbf, + 0x9, 0xe4, 0xbf, 0x44, 0xbf, 0xb4, 0xbf, 0xf4, + 0x9a, 0xbf, 0xbb, 0xb4, 0x7, 0x9a, 0xf4, 0x20, + 0xf4, 0xbf, 0xe2, 0xf4, 0xf4, 0xbb, 0xe2, 0xf4, + 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe4, 0x12, 0x44, 0xbf, 0xe2, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0xe4, 0x57, 0xcb, 0x4b, 0xe1, 0x81, 0xaf, + 0xbf, 0x4b, 0xe4, 0xf4, 0xb4, 0xf4, 0x9f, 0x18, + 0x7, 0x9a, 0xe1, 0xf6, 0x90, 0x90, 0x84, 0x9f, + 0x7e, 0x87, 0xe3, 0x4d, 0x76, 0x78, 0x76, 0x76, + 0xd1, 0x76, 0x37, 0xf2, 0x76, 0xd1, 0x37, 0x29, + 0xf2, 0x78, 0x61, 0x55, 0x37, 0xf2, 0x76, 0xa, + 0xf2, 0x76, 0x76, 0x37, 0x76, 0xa, 0xa, 0x6d, + 0x4d, 0x5e, 0xac, 0x37, 0x78, 0x78, 0x37, 0x61, + 0x76, 0x78, 0x55, 0x94, 0xab, 0x61, 0x82, 0x61, + 0x78, 0x78, 0x4d, 0x37, 0x76, 0x76, 0x61, 0x61, + 0x61, 0x61, 0xc3, 0x64, 0x64, 0xab, 0x65, 0x4d, + 0x76, 0x78, 0x4d, 0xac, 0x78, 0x78, 0x78, 0x6d, + 0x4d, 0x76, 0x6d, 0x87, 0x8a, 0xe3, 0xda, 0x5, + 0x8c, 0x1c, 0x8c, 0x2f, 0x2f, 0x8c, 0xb3, 0x2f, + 0x60, 0xa5, 0xc2, 0x1b, 0xa5, 0xa5, 0x79, 0x1b, + 0xf1, 0x67, 0x2f, 0xd2, 0xc2, 0x79, 0x2f, 0x63, + 0xc2, 0xd5, 0x77, 0xf0, 0x42, 0xa5, 0xc5, 0x63, + 0xd2, 0x42, 0x2f, 0x63, 0x63, 0x1b, 0xd2, 0x1b, + 0x19, 0xe7, 0x60, 0x2, 0x73, 0x5a, 0x2f, 0x73, + 0xd2, 0x2f, 0x87, 0xb3, 0x2f, 0xc7, 0x87, 0x30, + 0x8, 0x2f, 0x8c, 0x67, 0x67, 0x58, 0x58, 0x89, + 0x42, 0x42, 0x41, 0x8a, 0x2, 0xc5, 0x2f, 0x73, + 0x8, 0x65, 0xd3, 0x1c, 0x58, 0x41, 0x62, 0xa, + 0xd1, 0x62, 0x62, 0xa, 0x23, 0xa, 0xa, 0xd1, + 0xa, 0xa, 0xa, 0xd1, 0x78, 0x76, 0xa, 0xa, + 0x62, 0x78, 0xac, 0x4d, 0x37, 0x4d, 0x76, 0x76, + 0x37, 0xbe, 0x4d, 0x78, 0x78, 0x62, 0x6d, 0x4d, + 0x78, 0x4d, 0xac, 0x4d, 0xac, 0x4d, 0x4d, 0x66, + 0xbe, 0xd3, 0xd3, 0xac, 0x82, 0x58, 0xe3, 0x37, + 0x4d, 0xac, 0x61, 0x66, 0x66, 0x8c, 0x49, 0x1d, + 0x3f, 0x60, 0xa8, 0x49, 0xa8, 0x8, 0xa8, 0x52, + 0xab, 0xab, 0x52, 0xb8, 0x1d, 0x2c, 0x4e, 0x22, + 0x4e, 0x77, 0x5d, 0x4e, 0x49, 0x67, 0x67, 0x64, + 0xbe, 0x24, 0x49, 0x1d, 0x3f, 0xc2, 0x47, 0x70, + 0xde, 0x93, 0xe4, 0xaf, 0xb4, 0x12, 0xbb, 0xf4, + 0x7, 0x12, 0xb4, 0xf4, 0x8d, 0x12, 0xbf, 0xbf, + 0xc0, 0x97, 0xbf, 0xe2, 0xf3, 0x97, 0xbb, 0xaf, + 0xfd, 0xfd, 0xbf, 0xf4, 0x97, 0x69, 0xbf, 0xe2, + 0xaf, 0x93, 0xf4, 0xf4, 0x93, 0x93, 0xf4, 0xe2, + 0x12, 0x69, 0xf4, 0xe2, 0x12, 0xf4, 0xe2, 0xe2, + 0xf3, 0xf4, 0x44, 0xe2, 0x12, 0x2e, 0x44, 0xbf, + 0xbf, 0x95, 0xe2, 0xe2, 0xf4, 0xe2, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0xf4, 0x44, 0x44, 0x44, + 0xf4, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0xdd, 0xdd, 0x81, 0x81, 0xdd, 0xde, 0xe1, + 0xe1, 0x86, 0xc4, 0xbc, 0xe1, 0xe1, 0x9c, 0xdf, + 0x81, 0xf3, 0x9, 0x81, 0xdf, 0x9c, 0xfd, 0x91, + 0x2c, 0xab, 0xbe, 0xac, 0x78, 0x6d, 0xb5, 0x76, + 0xa, 0x76, 0x76, 0x76, 0xd1, 0x76, 0x4d, 0x61, + 0x37, 0x78, 0xbe, 0x55, 0x55, 0x82, 0x82, 0x4d, + 0x76, 0x76, 0xd1, 0xd1, 0xd1, 0xd1, 0x4d, 0xf2, + 0x4d, 0x82, 0x87, 0x8a, 0x4d, 0xe3, 0xb3, 0xbe, + 0xa, 0x76, 0xf2, 0x61, 0x61, 0x61, 0x66, 0x61, + 0x37, 0x76, 0x82, 0x82, 0x4d, 0x76, 0xbe, 0x37, + 0x4d, 0x37, 0x82, 0x55, 0x55, 0xac, 0x66, 0x4d, + 0x37, 0x78, 0x1c, 0xb5, 0x29, 0x76, 0x29, 0xac, + 0xa, 0x78, 0xe3, 0xac, 0xbe, 0x5e, 0x29, 0x82, + 0xe3, 0x6d, 0x58, 0x5b, 0x58, 0x6, 0xb5, 0x8a, + 0x6, 0x8c, 0x67, 0x79, 0xa5, 0x1, 0x2f, 0x2, + 0xd2, 0x1b, 0x1b, 0x1b, 0x63, 0xf1, 0xb3, 0x79, + 0x2f, 0xab, 0x2f, 0x79, 0x79, 0x79, 0x79, 0x6e, + 0x63, 0x63, 0x6e, 0x89, 0x19, 0xd2, 0x8, 0x63, + 0xf1, 0x8c, 0x8c, 0x2f, 0x79, 0x2f, 0x8, 0x42, + 0x1b, 0x2f, 0x58, 0x5, 0x5, 0xb5, 0x6d, 0x8c, + 0x58, 0x41, 0x58, 0x8, 0x42, 0x42, 0xf1, 0x89, + 0x89, 0xf1, 0x41, 0x1c, 0x30, 0x58, 0x6d, 0x41, + 0x62, 0xe3, 0x62, 0x1c, 0x41, 0x8a, 0x62, 0x62, + 0x1c, 0x1c, 0x62, 0xd1, 0xd1, 0xa, 0xa, 0xd1, + 0xd1, 0xa, 0x23, 0xa, 0x1c, 0xda, 0xb5, 0x4d, + 0x82, 0x24, 0xb5, 0xbe, 0xb3, 0xb3, 0xe3, 0x1c, + 0x24, 0x67, 0xd3, 0xac, 0xbe, 0xb3, 0xa7, 0xb5, + 0xab, 0x65, 0x8c, 0xa7, 0x87, 0xb3, 0x87, 0x82, + 0xb3, 0xc5, 0x60, 0x52, 0x52, 0xc3, 0xa7, 0x52, + 0x52, 0xa8, 0xc3, 0xc3, 0x60, 0xd5, 0x27, 0x13, + 0x4f, 0x27, 0x27, 0x98, 0x3f, 0xa3, 0xc9, 0x2c, + 0x3f, 0xa5, 0xe8, 0x38, 0xe8, 0x8f, 0x47, 0x90, + 0x8b, 0x7d, 0x9d, 0xdb, 0x91, 0x22, 0x59, 0x59, + 0xb8, 0xe9, 0x25, 0xe8, 0xc9, 0x6c, 0x8e, 0xe4, + 0xdd, 0xf5, 0xc6, 0xb4, 0xe1, 0x93, 0xc0, 0xbf, + 0xc6, 0xc0, 0xf4, 0xbb, 0xe4, 0x93, 0xbf, 0xe2, + 0xb4, 0x93, 0xc6, 0xb4, 0xe1, 0xff, 0xbf, 0xf4, + 0x8e, 0x97, 0xbf, 0xe2, 0xf3, 0x93, 0xbf, 0xe2, + 0xf4, 0xbb, 0xf4, 0x20, 0x93, 0x8d, 0xe2, 0xf4, + 0xbf, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, + 0xf4, 0xe2, 0xe2, 0xe2, 0xf3, 0x44, 0x44, 0xe2, + 0xbf, 0xbf, 0xbb, 0xf4, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x2e, 0x4, 0x4, 0xde, 0xde, 0x32, 0x47, 0x40, + 0xb2, 0x93, 0x97, 0xc6, 0xc6, 0x93, 0x93, 0xb4, + 0xbd, 0x6f, 0x28, 0x57, 0xcf, 0x3, 0x77, 0x2c, + 0xab, 0x1, 0xd3, 0xac, 0x78, 0xda, 0x8a, 0x24, + 0x78, 0x76, 0xa, 0xd1, 0x6d, 0x76, 0x4d, 0x78, + 0x29, 0xd3, 0xa8, 0x17, 0x65, 0xb3, 0xad, 0x52, + 0x55, 0xac, 0x4d, 0x76, 0xa, 0xa, 0x4d, 0xa, + 0x78, 0xbe, 0x1, 0xa8, 0xa7, 0x82, 0xc3, 0x82, + 0x37, 0x78, 0xf2, 0x37, 0x37, 0x4d, 0x61, 0x61, + 0x78, 0x37, 0x9e, 0x8a, 0x55, 0x55, 0x55, 0x55, + 0x66, 0xab, 0x52, 0xa7, 0xbe, 0xab, 0x65, 0x55, + 0x6d, 0xac, 0x82, 0x59, 0x65, 0x94, 0x94, 0x55, + 0x24, 0xbe, 0xb5, 0xa7, 0xac, 0xe3, 0x4d, 0xb5, + 0x6d, 0x6d, 0x82, 0x58, 0x82, 0xe3, 0x41, 0x58, + 0xb5, 0xe3, 0x8, 0xf1, 0x8c, 0xe3, 0x41, 0x41, + 0x2f, 0xf1, 0xe9, 0x73, 0xd2, 0x50, 0x60, 0x42, + 0xb3, 0xd3, 0xb5, 0xd3, 0x8c, 0xd3, 0xda, 0xf1, + 0x79, 0x2f, 0xd2, 0x42, 0x1b, 0xc5, 0xa5, 0x63, + 0xd2, 0x30, 0x8, 0x30, 0x58, 0x24, 0x58, 0x8, + 0x2f, 0x1, 0xab, 0x2f, 0x89, 0xa4, 0x58, 0x67, + 0x30, 0x67, 0xe3, 0xd3, 0x8c, 0xd3, 0x41, 0x5, + 0x5, 0xd3, 0x1c, 0x8c, 0x8, 0xb3, 0x6d, 0x41, + 0x41, 0xe3, 0xa, 0x29, 0x62, 0x41, 0xd1, 0xd1, + 0xa, 0xa, 0xa, 0xd1, 0x29, 0xd1, 0x62, 0x62, + 0x62, 0xa, 0xa, 0xa, 0x62, 0xac, 0x61, 0xac, + 0x87, 0x59, 0xb8, 0x3e, 0x8b, 0x8b, 0xd4, 0x60, + 0x4e, 0x4e, 0x64, 0xab, 0x64, 0x1d, 0x3f, 0x3f, + 0x91, 0x4f, 0x7e, 0x4f, 0x25, 0x8b, 0x7e, 0xa5, + 0xe8, 0x8b, 0x3e, 0x1d, 0xb8, 0x4e, 0xeb, 0xeb, + 0xd0, 0x18, 0x8b, 0x83, 0x1e, 0xc6, 0xe1, 0x57, + 0xdb, 0xf6, 0x53, 0xdc, 0xb, 0x88, 0x8b, 0x18, + 0x18, 0x81, 0xe1, 0x90, 0xd8, 0xc6, 0xb4, 0x7, + 0x53, 0x53, 0x40, 0xcb, 0xa2, 0x75, 0x90, 0x9f, + 0xc6, 0xc6, 0xe1, 0x90, 0x83, 0xd8, 0x9a, 0x9a, + 0x7, 0x75, 0xbf, 0xe2, 0xf4, 0xf4, 0xf4, 0x95, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xb0, 0xb4, 0xf4, + 0x9a, 0x9a, 0x95, 0xf4, 0xe2, 0xf4, 0xe2, 0xf4, + 0xbf, 0xe2, 0xe2, 0xe2, 0xf4, 0xe1, 0x44, 0xe2, + 0xf4, 0xf4, 0xe2, 0xf4, 0xe2, 0x44, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xf4, 0xe2, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x1e, 0x99, 0x4, 0x9f, 0x57, 0xde, 0xf5, 0xd8, + 0xe4, 0xbf, 0xbb, 0xb4, 0x81, 0xf3, 0xdd, 0xe1, + 0x57, 0x6b, 0x9c, 0x9f, 0x9d, 0x36, 0x27, 0xd4, + 0xa8, 0x2f, 0xd3, 0x37, 0x78, 0x4d, 0x6d, 0xab, + 0x61, 0xac, 0x55, 0x55, 0xab, 0x52, 0xa8, 0xa7, + 0xbe, 0x65, 0xa8, 0x17, 0x55, 0x55, 0x52, 0xb7, + 0xf, 0x52, 0x52, 0x55, 0xbe, 0x65, 0x65, 0xa7, + 0xbe, 0xbe, 0x64, 0x17, 0x66, 0x55, 0x55, 0x55, + 0x66, 0x55, 0x1f, 0xc3, 0xa7, 0x64, 0xa8, 0xab, + 0x29, 0xbe, 0x55, 0xb6, 0x66, 0xb6, 0x1f, 0x9e, + 0xb8, 0x3f, 0x4e, 0x4e, 0xa8, 0x65, 0xa8, 0x49, + 0x66, 0x66, 0xa7, 0x1f, 0x1d, 0x1f, 0x1d, 0xb8, + 0xa8, 0x49, 0x59, 0x60, 0x1, 0x82, 0xbe, 0x4d, + 0x4d, 0x37, 0x62, 0xa, 0x62, 0x76, 0x82, 0x82, + 0x8a, 0x82, 0x60, 0x4e, 0xb3, 0x6d, 0x4d, 0xe3, + 0xac, 0x94, 0x67, 0x2f, 0xa8, 0x2c, 0x50, 0x7a, + 0x67, 0xe3, 0x1c, 0x58, 0xb5, 0xb5, 0x62, 0x6d, + 0xab, 0x37, 0xab, 0x67, 0x60, 0x77, 0xd5, 0xef, + 0xd5, 0xe9, 0x42, 0xd2, 0x1b, 0x58, 0x8c, 0x67, + 0xa6, 0x2f, 0x87, 0xc7, 0xd4, 0xe9, 0x1b, 0xd2, + 0x42, 0x5a, 0xe3, 0xa, 0xa, 0x62, 0x62, 0x62, + 0x24, 0xa, 0xa, 0xab, 0xa6, 0xa7, 0x1c, 0xe3, + 0x8c, 0x1a, 0xa, 0x23, 0xa, 0xa, 0xd1, 0xa, + 0x62, 0xd1, 0xa, 0x78, 0x1c, 0x6d, 0xa, 0x4d, + 0x4d, 0x4d, 0x4d, 0x29, 0x82, 0x24, 0x82, 0x1, + 0xa3, 0x27, 0xa9, 0x18, 0xf6, 0x84, 0x9f, 0x98, + 0x91, 0x7e, 0x60, 0xa8, 0x22, 0x7e, 0x22, 0x7f, + 0x8b, 0xf6, 0x90, 0x40, 0x74, 0x9d, 0x74, 0x2a, + 0xdc, 0x18, 0xdb, 0x7f, 0x2a, 0x6a, 0xd8, 0xf6, + 0xf6, 0xed, 0x81, 0xe1, 0x57, 0x7, 0xe1, 0xbc, + 0xa2, 0x74, 0x90, 0xf6, 0xf6, 0xed, 0xed, 0x7, + 0xc6, 0xc6, 0xc6, 0xbf, 0x57, 0x9f, 0x70, 0x75, + 0xcb, 0x9f, 0xe1, 0xe1, 0xe1, 0xe1, 0xe4, 0xf4, + 0xe1, 0x57, 0x75, 0x9a, 0xba, 0x53, 0x75, 0xb4, + 0xc6, 0xbf, 0xbf, 0xbf, 0xbf, 0xf4, 0xbb, 0xf4, + 0xbf, 0x9, 0xcc, 0xf4, 0xbf, 0x7, 0xf4, 0xbb, + 0xbf, 0xbf, 0xbf, 0xe2, 0x95, 0xf4, 0xf4, 0x20, + 0xf4, 0x8d, 0x9a, 0xf4, 0xf4, 0x85, 0xbf, 0x44, + 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, + 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x9d, 0x47, 0x9c, 0x4, 0x81, 0xe4, 0xe4, 0xcc, + 0xf4, 0xf4, 0xbf, 0xf4, 0xcc, 0xf4, 0xb4, 0x7, + 0x74, 0x4b, 0xc6, 0xb4, 0xe1, 0x81, 0x83, 0x88, + 0x4e, 0x1, 0x5e, 0xac, 0x76, 0x78, 0x78, 0x4d, + 0x61, 0x55, 0x52, 0x65, 0x1d, 0x3f, 0x7e, 0x4e, + 0x52, 0x52, 0x56, 0xab, 0xd3, 0x94, 0x52, 0x1f, + 0x52, 0x56, 0x1d, 0x1f, 0x61, 0x64, 0x3f, 0xa8, + 0x52, 0x55, 0x55, 0x55, 0x4d, 0x65, 0x1f, 0x55, + 0x66, 0xf, 0x3f, 0x7e, 0x91, 0x91, 0x80, 0x1d, + 0x52, 0x52, 0x1f, 0x1f, 0xa7, 0x49, 0x91, 0x2a, + 0x5c, 0xeb, 0x18, 0x18, 0x48, 0x3f, 0x1d, 0x3f, + 0x52, 0x52, 0x1d, 0xb8, 0xa8, 0x2c, 0x22, 0x7e, + 0x22, 0x3f, 0x91, 0x48, 0x3f, 0x1f, 0x52, 0x66, + 0x66, 0x5e, 0x4d, 0x78, 0x62, 0xa, 0x4d, 0x82, + 0xb5, 0x82, 0xb3, 0x59, 0xa7, 0xac, 0x5e, 0x4d, + 0x78, 0xe3, 0xa7, 0x8c, 0xd3, 0xd3, 0x8c, 0x67, + 0x67, 0xe3, 0x6d, 0xe3, 0xe3, 0xe3, 0xe3, 0x41, + 0x8a, 0x62, 0x1c, 0xd3, 0xab, 0x1, 0x60, 0x79, + 0xe7, 0x2f, 0xa5, 0xd2, 0x6e, 0x5b, 0x67, 0x2f, + 0x67, 0x58, 0x58, 0x8, 0x60, 0x2f, 0x2f, 0xf1, + 0x67, 0x67, 0xd3, 0xe3, 0x29, 0x62, 0x1c, 0x8a, + 0x1c, 0xa, 0xa, 0x29, 0xd3, 0x1c, 0xe3, 0xb5, + 0x4d, 0x78, 0xd1, 0xa, 0xd1, 0xd1, 0xa, 0x4d, + 0xa, 0x78, 0x62, 0x76, 0x78, 0xac, 0x4d, 0x4d, + 0x65, 0x82, 0x8c, 0x52, 0xa8, 0x59, 0xad, 0xc9, + 0x8b, 0x8b, 0xa9, 0x7c, 0x8b, 0xd8, 0x9d, 0x98, + 0x48, 0x8b, 0xd9, 0x25, 0x40, 0x83, 0xef, 0x7c, + 0x6a, 0x70, 0x9b, 0x9d, 0xdb, 0x8b, 0x47, 0x18, + 0x18, 0x8b, 0x31, 0x8b, 0x90, 0x1e, 0x47, 0x83, + 0x8b, 0x9c, 0x4, 0xd8, 0x53, 0x27, 0x47, 0x81, + 0x9f, 0x47, 0x6b, 0xca, 0x1e, 0x47, 0x4, 0xd8, + 0x40, 0x47, 0x7b, 0xe1, 0xbc, 0x8b, 0x7d, 0xc6, + 0x84, 0x8e, 0x32, 0x4b, 0xf5, 0xfd, 0xde, 0x9a, + 0x9f, 0x7e, 0x9d, 0x75, 0x40, 0xa9, 0x6b, 0xdf, + 0xdd, 0x97, 0xc0, 0x95, 0xfa, 0x97, 0xbf, 0xe2, + 0xb4, 0xfd, 0x9c, 0x95, 0xb4, 0x93, 0xbb, 0xb2, + 0x93, 0x97, 0xbb, 0xe2, 0xbb, 0x97, 0xbf, 0xe2, + 0x97, 0x97, 0xb4, 0xb4, 0x97, 0x93, 0xe2, 0xf4, + 0x93, 0x93, 0xf4, 0xf4, 0x93, 0x93, 0xf4, 0xf4, + 0x93, 0xc0, 0xf4, 0xf4, 0x12, 0xe2, 0x44, 0xe2, + 0x12, 0x12, 0x44, 0xe2, 0x95, 0xbf, 0x44, 0xbf, + 0xe2, 0xe2, 0x44, 0xf4, 0xf4, 0xe2, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, 0xe2, + 0xf4, 0x44, 0x44, 0x44, 0xf4, 0xe2, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc6, 0xdd, 0x4, 0xfd, 0xf5, 0xc0, 0xdd, 0xe4, + 0xb4, 0xfa, 0xe4, 0x9a, 0x57, 0xc6, 0xdd, 0xc6, + 0xc6, 0xde, 0xf3, 0xe1, 0x90, 0x3, 0x9d, 0x98, + 0x1d, 0x66, 0x4d, 0x78, 0x62, 0xe3, 0x6d, 0x4d, + 0x78, 0x4d, 0x55, 0x55, 0x52, 0x64, 0x51, 0xb, + 0x91, 0x1d, 0xa8, 0xb8, 0x59, 0xa8, 0x4e, 0x59, + 0x59, 0xb8, 0x7e, 0x1d, 0x52, 0x1f, 0x1d, 0xb8, + 0x3f, 0x49, 0xa8, 0x59, 0xa6, 0xae, 0x7e, 0x60, + 0xa8, 0xa7, 0x91, 0xdb, 0x22, 0x49, 0x1d, 0x1d, + 0xa8, 0x2c, 0x91, 0x4f, 0xd4, 0x4f, 0x90, 0x9f, + 0x9b, 0x8b, 0x51, 0x53, 0x48, 0x91, 0xb8, 0x4e, + 0xe8, 0x3e, 0x88, 0x39, 0xc2, 0xd9, 0x8b, 0x9d, + 0xe8, 0x4e, 0x1d, 0x3f, 0x2c, 0x91, 0x92, 0x65, + 0x8c, 0xbe, 0x94, 0xd3, 0x78, 0x6d, 0x82, 0x4d, + 0x4d, 0x62, 0x4d, 0x4d, 0x4d, 0xe3, 0x5e, 0xe3, + 0x62, 0x1c, 0x58, 0xe3, 0xa, 0x29, 0x62, 0x62, + 0xab, 0x78, 0xa, 0x29, 0x62, 0x62, 0x58, 0x30, + 0x58, 0x1c, 0x8a, 0x58, 0x62, 0x41, 0x8a, 0x5, + 0x58, 0x58, 0xf1, 0x42, 0x89, 0xd2, 0x1b, 0x89, + 0x42, 0xa0, 0xa0, 0x89, 0xf1, 0x30, 0x67, 0x8c, + 0x58, 0xa, 0x41, 0xe3, 0x1c, 0x29, 0x1c, 0x67, + 0x41, 0xa, 0xa, 0xd1, 0xa, 0x76, 0x62, 0x78, + 0x29, 0x62, 0xa, 0x78, 0xa, 0xd1, 0x29, 0xbe, + 0x55, 0x4d, 0xbe, 0x82, 0x24, 0xbe, 0x82, 0x1, + 0x9e, 0x52, 0x59, 0x6e, 0x8b, 0x88, 0xd9, 0x77, + 0xdb, 0x9d, 0x47, 0x7c, 0x2a, 0x1e, 0x47, 0x27, + 0x90, 0x99, 0xe5, 0x8e, 0xe1, 0x70, 0x9c, 0x9d, + 0x53, 0xd8, 0x47, 0x9d, 0x18, 0x47, 0x97, 0xb9, + 0x81, 0xdf, 0x9c, 0x8e, 0xd8, 0x36, 0x32, 0x1e, + 0xa9, 0xa9, 0x4, 0xde, 0x36, 0x9c, 0x32, 0xb1, + 0x81, 0x97, 0x9c, 0xf5, 0xde, 0x36, 0x97, 0xde, + 0x40, 0x9d, 0x2e, 0xb4, 0x84, 0x70, 0x9c, 0xe4, + 0xe4, 0xde, 0x32, 0xce, 0xd8, 0x9d, 0xd8, 0xb4, + 0x74, 0x8b, 0xd8, 0xb4, 0xe4, 0x97, 0x93, 0xe4, + 0x12, 0x8e, 0xb4, 0xf4, 0xbf, 0xdd, 0xcc, 0xbb, + 0xbf, 0x12, 0x95, 0xbf, 0xbf, 0x12, 0xf4, 0xbf, + 0xc0, 0xbf, 0xe1, 0xbf, 0xb4, 0xe1, 0xf4, 0xf4, + 0xbf, 0xee, 0xf4, 0xf4, 0xbf, 0xbf, 0xe2, 0x44, + 0x20, 0xf4, 0xf4, 0x44, 0xf4, 0xf4, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0x32, 0x4, 0x6f, 0x47, 0xfd, 0x32, 0xe4, + 0x57, 0x1e, 0xdd, 0xe4, 0xe4, 0xf3, 0x9c, 0xc0, + 0xbd, 0x97, 0x32, 0xc6, 0x88, 0x3e, 0x72, 0x49, + 0x66, 0xd3, 0x61, 0x4d, 0xd3, 0xd3, 0xc3, 0xc3, + 0x82, 0xab, 0xa8, 0xa8, 0x59, 0xb8, 0x3e, 0xcb, + 0x40, 0x7c, 0x25, 0x8b, 0x6b, 0x3, 0x9d, 0x8b, + 0xe8, 0x2c, 0x91, 0xa8, 0xa8, 0xa8, 0x7f, 0x88, + 0x8b, 0x25, 0x8b, 0x39, 0x6b, 0x9d, 0x40, 0x9f, + 0x4e, 0xb8, 0x80, 0x88, 0xa9, 0x7e, 0x88, 0x8b, + 0x83, 0x8b, 0xf6, 0xf6, 0x47, 0xd8, 0x57, 0xc6, + 0xfd, 0x53, 0xa2, 0x18, 0xc8, 0x9d, 0xf6, 0x90, + 0x9c, 0xd8, 0x70, 0xc6, 0x1e, 0x9f, 0x74, 0x40, + 0x3, 0x88, 0xeb, 0x88, 0x7c, 0x7c, 0x88, 0x22, + 0x52, 0x9e, 0x1d, 0x52, 0x55, 0xab, 0x94, 0x65, + 0xe3, 0x82, 0xe3, 0xe3, 0x82, 0x6d, 0x37, 0x6d, + 0xb5, 0xe3, 0x24, 0x78, 0xa, 0x6d, 0x4d, 0x4d, + 0x29, 0x62, 0x29, 0xa, 0xa, 0xa, 0xe3, 0xd3, + 0xb5, 0xa, 0xe3, 0xb5, 0x58, 0x67, 0x1b, 0x2, + 0x67, 0x30, 0x63, 0x19, 0x67, 0x30, 0xf1, 0xf1, + 0x2f, 0x2f, 0x79, 0x2f, 0xc7, 0x6e, 0xd2, 0x2f, + 0xb3, 0xe3, 0x29, 0xa, 0xa, 0x62, 0xa, 0x5e, + 0xd1, 0xa, 0xa, 0x4d, 0x4d, 0x62, 0x8a, 0x58, + 0xe3, 0x29, 0x8a, 0xe3, 0x37, 0xb5, 0xb5, 0x55, + 0xb7, 0x1d, 0x4e, 0x22, 0x7f, 0x4f, 0xd9, 0x13, + 0x5c, 0x4e, 0xd5, 0x18, 0x53, 0xf6, 0x90, 0x88, + 0xb, 0xf6, 0xc6, 0xe1, 0xe1, 0xe1, 0xfa, 0x84, + 0xe1, 0xe1, 0xe1, 0x57, 0xba, 0x9d, 0xc6, 0xe1, + 0xf6, 0x75, 0xe1, 0xe4, 0x9a, 0xb4, 0xb4, 0x9a, + 0xe1, 0xe1, 0xe1, 0xe1, 0x53, 0xa2, 0x84, 0xe4, + 0xe1, 0xe1, 0xc6, 0x8d, 0xb4, 0x85, 0x8d, 0x9a, + 0x75, 0xbc, 0x57, 0xe1, 0x57, 0xf6, 0x81, 0xe1, + 0xf4, 0xf4, 0xf4, 0xf4, 0xb4, 0xe1, 0xb4, 0xb4, + 0x7, 0xbc, 0x57, 0xf4, 0x9a, 0x75, 0x4b, 0x9a, + 0xf4, 0xbf, 0xf4, 0xf4, 0xf4, 0xe1, 0x9a, 0xf4, + 0x9a, 0xbc, 0x7, 0xe2, 0xf4, 0xf4, 0xf4, 0xf4, + 0xe2, 0xf4, 0xe2, 0xe2, 0xf4, 0x9a, 0x9a, 0xf4, + 0xf4, 0x9a, 0x9a, 0xf4, 0xf4, 0xe2, 0xf4, 0xe2, + 0xe2, 0xe2, 0xf4, 0xe2, 0xe2, 0xf4, 0x9a, 0xf4, + 0x44, 0xe2, 0xe2, 0xf4, 0xe2, 0x44, 0xe2, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0xe2, + 0x44, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe1, 0xd8, 0xde, 0x32, 0x3a, 0x57, 0xbf, 0x95, + 0xf4, 0x95, 0xbf, 0xbf, 0xbf, 0xbb, 0xbf, 0xf4, + 0xe1, 0x57, 0x84, 0xb4, 0x53, 0xdb, 0xeb, 0x38, + 0xb3, 0x65, 0xac, 0xac, 0x37, 0x66, 0x55, 0xb6, + 0x1d, 0x1d, 0xb8, 0x88, 0x40, 0xcb, 0x74, 0x84, + 0x75, 0x84, 0xe1, 0x70, 0x57, 0xdb, 0x53, 0xbc, + 0x18, 0xb, 0xb, 0xcb, 0x18, 0x18, 0xf6, 0xe1, + 0xe1, 0xc6, 0xe1, 0xe1, 0xc6, 0x53, 0xb, 0x53, + 0xcb, 0x51, 0xa2, 0xf6, 0xf6, 0xe1, 0x75, 0x70, + 0x75, 0x75, 0xbc, 0x57, 0x84, 0xbc, 0xa2, 0x57, + 0x9a, 0x9a, 0x9a, 0x85, 0x4b, 0x9a, 0x9a, 0x70, + 0xe4, 0x9a, 0xbc, 0xbc, 0xe1, 0x57, 0xcb, 0x18, + 0x4b, 0xe1, 0xe1, 0xe1, 0x84, 0xf6, 0xcb, 0x48, + 0x2c, 0x91, 0x1d, 0x1f, 0xab, 0x49, 0x56, 0x1f, + 0xc3, 0x59, 0x67, 0x1, 0x24, 0x24, 0xbe, 0xd3, + 0xbe, 0x4d, 0xac, 0x4d, 0x4d, 0x76, 0x6d, 0x61, + 0x4d, 0xda, 0x87, 0x62, 0x62, 0xa, 0x4d, 0xbe, + 0x24, 0x8c, 0x82, 0xe3, 0x82, 0x67, 0xc5, 0xd9, + 0x42, 0x73, 0x1b, 0x1b, 0x42, 0x89, 0x8, 0x30, + 0x24, 0x8c, 0x60, 0x49, 0x59, 0xc9, 0xd5, 0xe8, + 0x60, 0xb3, 0x3b, 0x6d, 0x62, 0x6d, 0x6d, 0x78, + 0xa, 0x29, 0x37, 0x94, 0x61, 0xe3, 0xa4, 0x4e, + 0x49, 0x49, 0x52, 0x65, 0x94, 0x24, 0x1, 0xa8, + 0x9e, 0xa8, 0x8b, 0x71, 0xc6, 0xf6, 0x39, 0x9f, + 0x53, 0xdb, 0x74, 0x88, 0xd6, 0x53, 0xe1, 0x57, + 0x88, 0x90, 0x90, 0xb4, 0xb4, 0xe1, 0x90, 0x90, + 0xbc, 0xbc, 0xd8, 0xf6, 0x88, 0x18, 0xde, 0xe4, + 0xb4, 0xdf, 0x4b, 0xb4, 0xb4, 0x9a, 0xc6, 0x4b, + 0x9f, 0x74, 0xe1, 0x81, 0xd8, 0x39, 0x81, 0xf4, + 0xb4, 0xb4, 0x81, 0xc6, 0xe1, 0x7, 0x57, 0x84, + 0x18, 0xdb, 0xf6, 0x9a, 0xe1, 0x90, 0xdf, 0xb4, + 0xbf, 0xbf, 0xe4, 0x4b, 0xe4, 0x57, 0xbc, 0x9a, + 0xf9, 0x8b, 0xc6, 0xf4, 0xb4, 0xe4, 0xdf, 0xc6, + 0xbf, 0xb4, 0xb4, 0xc6, 0x4b, 0xc6, 0xbc, 0xb4, + 0xe4, 0x81, 0xed, 0xf4, 0xf4, 0xbf, 0xe2, 0xbf, + 0xb4, 0xbf, 0x9a, 0x9a, 0xb4, 0x99, 0x75, 0x9a, + 0xee, 0xb4, 0xb4, 0xbf, 0xbb, 0xbb, 0xf4, 0xf4, + 0xbf, 0xbb, 0xf4, 0xf4, 0xf4, 0x97, 0xf4, 0xf4, + 0xe2, 0xbb, 0xf4, 0xf4, 0x93, 0xf4, 0xe2, 0xe2, + 0xf4, 0x44, 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, 0xe2, + 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xf4, 0x44, 0x44, 0xf4, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbc, 0x53, 0xde, 0xdd, 0xb4, 0xb0, 0xb4, 0xf4, + 0xbf, 0xf4, 0xe4, 0xb4, 0xb4, 0x9a, 0xb4, 0xb4, + 0x7, 0xcb, 0xf6, 0xbb, 0x7, 0xf6, 0xfb, 0xd4, + 0xb8, 0x1d, 0xab, 0x66, 0x37, 0x66, 0x66, 0x49, + 0x3f, 0xb8, 0x38, 0x8b, 0x75, 0x84, 0xe1, 0x4b, + 0x4b, 0xfa, 0x75, 0x9a, 0x7, 0xb, 0xa2, 0x3d, + 0x75, 0x9f, 0x18, 0x39, 0xd8, 0x81, 0xe1, 0xc6, + 0x90, 0xf6, 0x74, 0x75, 0x57, 0x18, 0x51, 0xf6, + 0xd8, 0x75, 0xf6, 0x90, 0x90, 0xe1, 0x75, 0xe1, + 0xf6, 0x18, 0xdc, 0x74, 0x84, 0xe1, 0x18, 0x90, + 0x81, 0xb4, 0xb4, 0x9a, 0xdf, 0x4b, 0x7, 0x7, + 0xc6, 0xc6, 0x18, 0xf6, 0xb2, 0x84, 0xe1, 0x90, + 0xdf, 0xe1, 0xe1, 0xe1, 0x4b, 0x8b, 0xa2, 0x48, + 0x3e, 0x7a, 0x91, 0xa8, 0x60, 0x3e, 0x48, 0x3f, + 0x59, 0x4f, 0x22, 0x3f, 0x49, 0x52, 0x52, 0xab, + 0xab, 0x8c, 0xac, 0x37, 0x4d, 0xd3, 0xbe, 0x4d, + 0x82, 0x87, 0x87, 0xab, 0x37, 0x1c, 0x5e, 0xbe, + 0x82, 0x8c, 0x87, 0x24, 0x82, 0xb3, 0x60, 0xa5, + 0xe7, 0x5b, 0x1b, 0x79, 0x79, 0x2, 0xf1, 0x2f, + 0x67, 0x5, 0xf1, 0x58, 0x8c, 0xc9, 0x77, 0x50, + 0xa8, 0x9e, 0x24, 0x55, 0xd3, 0x8c, 0x8c, 0x41, + 0xb5, 0xe3, 0x82, 0xd3, 0x37, 0x8a, 0xad, 0x4e, + 0x91, 0x3f, 0x2c, 0xa8, 0x2c, 0x50, 0x77, 0x77, + 0x3e, 0xa5, 0x3, 0x8e, 0xf6, 0x36, 0x6b, 0x83, + 0xb, 0x51, 0x47, 0x47, 0x40, 0xd8, 0x9c, 0xf5, + 0xc6, 0x1e, 0x4, 0x85, 0xe1, 0x57, 0x1e, 0x1e, + 0x53, 0x53, 0x9b, 0x7b, 0xd8, 0x7b, 0xfd, 0xbd, + 0xb4, 0x81, 0x9c, 0xbd, 0x7, 0x53, 0x47, 0x9c, + 0xd8, 0x9d, 0x97, 0xbd, 0xe4, 0x7b, 0x32, 0xe4, + 0xb4, 0xde, 0xfd, 0xdd, 0xe1, 0x51, 0x9d, 0x81, + 0xc6, 0xd8, 0x8e, 0xb4, 0xbf, 0x9c, 0x9c, 0xde, + 0xe4, 0xde, 0xfd, 0xe4, 0xc6, 0x9d, 0x9d, 0x8d, + 0xe4, 0x32, 0x32, 0xbf, 0xe4, 0xb1, 0x32, 0xe4, + 0xe4, 0x8e, 0x9d, 0xe1, 0xdd, 0x32, 0xfd, 0xb4, + 0x12, 0x4, 0x12, 0xbf, 0xbb, 0xc0, 0xe4, 0xb4, + 0xb4, 0x8e, 0x57, 0x7, 0xc6, 0x97, 0xb4, 0xbf, + 0xbf, 0x97, 0xaf, 0xe2, 0xbf, 0x12, 0xe2, 0xbf, + 0x93, 0x69, 0x95, 0xb4, 0x97, 0x97, 0x95, 0xe2, + 0x97, 0x93, 0xe2, 0xe2, 0x12, 0x93, 0xf4, 0xf4, + 0xc0, 0x93, 0xe2, 0x44, 0x12, 0x12, 0x44, 0x44, + 0x12, 0xe2, 0xe2, 0x44, 0x95, 0xe2, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0xe2, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0xf4, + 0xf4, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc6, 0x81, 0x32, 0xc0, 0xbf, 0xc0, 0x9c, 0xe4, + 0xb4, 0xd8, 0x32, 0xc6, 0x81, 0x90, 0x2e, 0xb4, + 0xb4, 0x9c, 0x86, 0xbf, 0xb0, 0x9d, 0x2a, 0x7f, + 0x91, 0x1d, 0x49, 0x49, 0x52, 0x87, 0x67, 0xe8, + 0x8b, 0xd5, 0x7d, 0x83, 0xde, 0xfd, 0x71, 0xe1, + 0x1e, 0x9d, 0xcb, 0x84, 0x81, 0x9c, 0x86, 0xb2, + 0x7b, 0x9c, 0xed, 0x1e, 0x47, 0x4, 0xcf, 0xbc, + 0x9c, 0x6b, 0x40, 0x81, 0xfd, 0x47, 0x9c, 0x69, + 0x9c, 0x4, 0xd8, 0x9f, 0x47, 0x1e, 0x53, 0xa2, + 0x1e, 0x6a, 0xf6, 0xc6, 0xfd, 0x26, 0xce, 0xce, + 0x97, 0xde, 0x7, 0x57, 0xfd, 0xbd, 0x75, 0x40, + 0xb1, 0xde, 0x81, 0x70, 0xff, 0xdd, 0xb4, 0x1e, + 0x8e, 0xde, 0xb4, 0x9d, 0x47, 0xde, 0x81, 0x9d, + 0x83, 0x1e, 0xd8, 0x6b, 0xe5, 0x7b, 0x9f, 0x4e, + 0x4e, 0x2a, 0x48, 0x3f, 0x7a, 0x7e, 0x3e, 0xe8, + 0x77, 0xc5, 0xa5, 0x1, 0x82, 0x87, 0xbe, 0xb5, + 0xb5, 0x55, 0x64, 0xa7, 0x8c, 0x60, 0xc2, 0x60, + 0x89, 0x96, 0xe7, 0x2f, 0xb3, 0x2f, 0x87, 0x1, + 0xd3, 0x8, 0x89, 0x2f, 0x2f, 0x1b, 0x63, 0x63, + 0x63, 0x89, 0x89, 0x30, 0x8c, 0x67, 0x50, 0x67, + 0x64, 0xa8, 0x60, 0xa8, 0xa8, 0x4e, 0x6e, 0xe, + 0x7a, 0x60, 0xe9, 0x2f, 0x24, 0x8c, 0x2f, 0x7a, + 0x1d, 0x7e, 0x8f, 0xd5, 0x83, 0x83, 0xd7, 0xe5, + 0x3, 0x9d, 0xe5, 0x47, 0xdb, 0xdb, 0x47, 0x47, + 0x90, 0x6b, 0x4, 0x8e, 0xde, 0xfd, 0x6b, 0x4, + 0xd8, 0x9d, 0x3, 0xfd, 0x9f, 0x53, 0x47, 0xce, + 0xb4, 0x81, 0x9c, 0xbd, 0x2e, 0x2e, 0x47, 0xce, + 0xc6, 0xcf, 0x47, 0xde, 0xe1, 0xca, 0x32, 0xce, + 0xc6, 0x32, 0x8e, 0xce, 0xb4, 0x2e, 0xfd, 0xe4, + 0x9a, 0x40, 0x40, 0xbd, 0xe1, 0xde, 0xf5, 0xe4, + 0xbf, 0xbd, 0xde, 0xb4, 0xb4, 0x71, 0xcf, 0xe1, + 0xe1, 0x1e, 0xd8, 0xb4, 0xb4, 0xbd, 0xde, 0xb4, + 0xb4, 0xbd, 0xde, 0xe1, 0x81, 0xfd, 0x9f, 0xe1, + 0xe4, 0x6f, 0x81, 0xbf, 0xbf, 0xe4, 0xdd, 0x81, + 0xb4, 0x32, 0xbf, 0x9a, 0xe1, 0xdd, 0x7, 0x9a, + 0xbb, 0xe4, 0xb4, 0xf4, 0xaf, 0xbf, 0xb4, 0xf4, + 0xbf, 0xbf, 0xf4, 0x9a, 0xaf, 0xbf, 0xf4, 0xf4, + 0xbb, 0x93, 0xf4, 0x20, 0x93, 0x93, 0xe2, 0xf4, + 0xf3, 0xe2, 0xe2, 0xe2, 0x20, 0xe2, 0xe2, 0xe2, + 0xf4, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0xdd, 0x97, 0xe4, 0xb4, 0xfd, 0xfd, 0xdd, + 0x9, 0xfd, 0xfd, 0xbf, 0x12, 0x93, 0x97, 0xf3, + 0xf3, 0x93, 0x32, 0xe4, 0x84, 0xa9, 0x22, 0xb, + 0xeb, 0x72, 0x48, 0xb, 0x3e, 0x3e, 0xa3, 0x5c, + 0x27, 0x3, 0x3a, 0xf6, 0x90, 0x27, 0x51, 0x75, + 0xbd, 0x32, 0x71, 0xc6, 0xce, 0x32, 0xde, 0xc6, + 0x9c, 0x4, 0x9d, 0x7, 0xde, 0x47, 0x8b, 0xc6, + 0xb1, 0x32, 0xde, 0x81, 0x6f, 0x97, 0xde, 0x84, + 0x36, 0x6b, 0x53, 0x53, 0x1e, 0x9b, 0xf6, 0xfa, + 0x9, 0xe4, 0xb4, 0xc6, 0x1e, 0x2e, 0xe1, 0x57, + 0xfd, 0xd8, 0x74, 0x90, 0x36, 0xbd, 0xb4, 0x4b, + 0x32, 0xbd, 0xe4, 0xde, 0x1e, 0xc6, 0xe1, 0xbc, + 0xde, 0xb4, 0x4b, 0xc6, 0xdd, 0xbd, 0xb4, 0x90, + 0x9c, 0xce, 0xb0, 0xd8, 0x1e, 0x90, 0xf6, 0xdb, + 0x51, 0x9f, 0x18, 0x7e, 0x83, 0xfa, 0xc6, 0xd8, + 0x88, 0x88, 0x18, 0x91, 0x91, 0x1d, 0xa8, 0xa8, + 0xa8, 0xe8, 0x4e, 0x59, 0x60, 0x8b, 0x9f, 0x7f, + 0xb8, 0xe8, 0x7f, 0x91, 0x3f, 0xb8, 0x59, 0xc3, + 0xa6, 0xc5, 0xa5, 0x8c, 0xda, 0x42, 0xc5, 0x5d, + 0xc7, 0x59, 0x59, 0xa8, 0x3f, 0x22, 0xe8, 0xd4, + 0xc7, 0x77, 0x8b, 0x2a, 0x59, 0x4e, 0x18, 0xdb, + 0x80, 0x48, 0x22, 0x7e, 0x3e, 0xa9, 0x83, 0x8b, + 0xfb, 0x6b, 0xd8, 0xe1, 0xc6, 0x53, 0x8b, 0xd8, + 0x53, 0xa2, 0x83, 0x7d, 0x90, 0x81, 0xce, 0x2e, + 0x90, 0x83, 0x2e, 0xb4, 0x7, 0xba, 0x88, 0x90, + 0x75, 0xdb, 0xfd, 0xf8, 0x90, 0x81, 0x2e, 0xe4, + 0x9a, 0xfa, 0xd8, 0xe4, 0x9a, 0xbc, 0x53, 0xdf, + 0x84, 0xe1, 0xb4, 0xb4, 0x4b, 0xdf, 0xe4, 0xb4, + 0xe4, 0xe1, 0x90, 0xe4, 0xf4, 0x9a, 0x75, 0xf9, + 0xc6, 0xb4, 0xb4, 0xb4, 0xb4, 0xc6, 0xc6, 0xf4, + 0xb4, 0x9a, 0x57, 0x75, 0x8d, 0x84, 0xf6, 0xe1, + 0xe4, 0xbf, 0xf4, 0xb4, 0xf4, 0xb4, 0x86, 0xb4, + 0xf4, 0xe4, 0x57, 0xc6, 0xc6, 0xbf, 0xcc, 0xf4, + 0xf4, 0xe4, 0xe4, 0xf4, 0xe2, 0xb4, 0xe1, 0xe1, + 0xe4, 0xb4, 0x9a, 0x7, 0xe1, 0xe4, 0xb4, 0x8d, + 0xb4, 0x95, 0xbf, 0xf4, 0xf4, 0xf4, 0xf4, 0x57, + 0x9a, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0x20, 0x44, + 0xe2, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0x9a, + 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0x44, 0xe2, 0xe2, + 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0xe2, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf4, 0x7, 0x57, 0xe1, 0xc6, 0xd8, 0xd8, 0xbf, + 0xe1, 0xdf, 0xdd, 0xbf, 0xf4, 0x9, 0x81, 0xc6, + 0xbf, 0x81, 0xcf, 0xe1, 0x4b, 0x18, 0x9f, 0xf6, + 0x75, 0x9f, 0x13, 0xf6, 0xf6, 0x98, 0x91, 0x38, + 0x4f, 0x98, 0xb, 0xcb, 0x90, 0x39, 0x4b, 0xf4, + 0xb4, 0xe1, 0x4b, 0x81, 0x8d, 0xe4, 0x57, 0xbc, + 0x90, 0x81, 0x57, 0x71, 0xb4, 0x4b, 0xf5, 0x84, + 0x85, 0xbd, 0x81, 0x90, 0xd8, 0x81, 0x57, 0xa2, + 0x83, 0x90, 0xc6, 0xf4, 0xb4, 0xe1, 0x81, 0xc6, + 0xe1, 0xe4, 0x7, 0x9f, 0x83, 0xc6, 0x75, 0xbc, + 0x84, 0x4b, 0xe4, 0xf4, 0xbb, 0xe4, 0xbf, 0xdf, + 0xb4, 0xbf, 0xf4, 0x57, 0xc6, 0xc6, 0xb4, 0xe1, + 0xe1, 0xbf, 0xdf, 0xb4, 0xbf, 0xbb, 0xb4, 0xc6, + 0xe1, 0xcd, 0xb4, 0x75, 0xf6, 0xc6, 0x84, 0x84, + 0x84, 0xb0, 0x86, 0xf5, 0xde, 0x9a, 0x9a, 0x18, + 0xb, 0x53, 0x53, 0xd0, 0x48, 0xeb, 0x4f, 0x8b, + 0x8b, 0x90, 0x90, 0xfb, 0x27, 0x9f, 0x57, 0x3e, + 0x91, 0xeb, 0x40, 0x8b, 0xb, 0x53, 0x4f, 0xd4, + 0xc2, 0x35, 0x7c, 0x2f, 0x1, 0xa8, 0x4e, 0xa7, + 0xd3, 0xa8, 0xc9, 0x7e, 0x88, 0x9f, 0x90, 0x90, + 0x9c, 0xd8, 0xc4, 0x9d, 0x22, 0x91, 0x2a, 0x18, + 0x51, 0x88, 0x6b, 0xe5, 0x47, 0xd8, 0xbd, 0x1e, + 0x1e, 0xd8, 0x57, 0x81, 0xbc, 0xb, 0x90, 0xc6, + 0x75, 0x75, 0xe1, 0xf8, 0xb4, 0xe4, 0xe1, 0xe4, + 0x84, 0x9f, 0x9f, 0xe1, 0x57, 0xa2, 0x8b, 0x70, + 0xe4, 0xe1, 0xde, 0xe4, 0xe4, 0xe1, 0x81, 0xe4, + 0xb4, 0xbc, 0x53, 0xc4, 0xe1, 0x7, 0x81, 0xb4, + 0xb4, 0xf4, 0xe4, 0xf4, 0x95, 0xc6, 0xd8, 0xb4, + 0xe4, 0xe1, 0x9f, 0xe1, 0xe4, 0xb4, 0xb4, 0x95, + 0xbf, 0xe4, 0xe4, 0xf4, 0x9a, 0xe4, 0x9f, 0x57, + 0xe1, 0xde, 0x9f, 0xc6, 0xe4, 0xb4, 0xe4, 0xbf, + 0xb4, 0xe4, 0xe4, 0xe1, 0xbf, 0xb4, 0x57, 0x57, + 0x8d, 0xe1, 0x81, 0xe4, 0x12, 0xf3, 0xe4, 0xbb, + 0xb4, 0xe4, 0xb4, 0x9a, 0xb4, 0xb4, 0x9a, 0x75, + 0xe1, 0xb4, 0xe4, 0xe4, 0x97, 0x97, 0x97, 0xe4, + 0x93, 0x97, 0xc0, 0x7, 0xe4, 0xb4, 0x9a, 0x9a, + 0xbf, 0xf4, 0xf4, 0x44, 0xbb, 0xbb, 0xf4, 0xf4, + 0xf4, 0xbf, 0xf4, 0x9a, 0xf4, 0xf4, 0xe2, 0xe2, + 0xf4, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xf4, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0x57, 0x74, 0xe1, 0xe4, 0xe4, 0xb4, 0xb4, + 0xbf, 0x81, 0xe4, 0xb4, 0xbf, 0xb4, 0xe1, 0xc6, + 0x8d, 0xb4, 0x75, 0xc6, 0xc6, 0xc6, 0xc6, 0xe1, + 0xc6, 0x81, 0x53, 0x53, 0xba, 0x80, 0x91, 0x22, + 0x8b, 0xf6, 0x75, 0x4b, 0xf9, 0xf5, 0xc6, 0xb4, + 0xe2, 0xe4, 0xe1, 0x57, 0xe1, 0xe1, 0x57, 0x74, + 0x81, 0xde, 0xe1, 0x9a, 0x84, 0x81, 0xfa, 0xe1, + 0xde, 0xde, 0xe1, 0xcb, 0xd8, 0xde, 0x81, 0xd8, + 0xc6, 0xce, 0xce, 0xb4, 0xde, 0xde, 0xde, 0xd8, + 0xd8, 0x8e, 0xd8, 0x8b, 0x1e, 0x32, 0xe1, 0x4b, + 0xb4, 0xe4, 0xbf, 0xb4, 0xb4, 0xe4, 0x9a, 0xe1, + 0x57, 0xb4, 0xb4, 0x75, 0xd8, 0xb4, 0xb4, 0xbf, + 0xe4, 0xe4, 0xaf, 0xc0, 0xde, 0xdd, 0x9a, 0xe1, + 0x9f, 0xe1, 0xf4, 0xe1, 0x1e, 0xe4, 0xb4, 0xb4, + 0xdd, 0xb4, 0xbf, 0xc6, 0xd8, 0xe1, 0x9a, 0xf6, + 0x51, 0x74, 0x75, 0x6b, 0x9d, 0xd8, 0x2e, 0x47, + 0x47, 0x9f, 0xd8, 0x9b, 0x98, 0x53, 0x74, 0x88, + 0xa9, 0x18, 0x90, 0x1e, 0x90, 0xf6, 0x51, 0xa5, + 0xc9, 0x3e, 0xe8, 0xc5, 0x2c, 0x1d, 0xa8, 0x87, + 0x5a, 0x60, 0xae, 0xe8, 0x27, 0x90, 0xfd, 0x4, + 0xd8, 0x53, 0x9d, 0x6b, 0xa9, 0x48, 0x27, 0x3, + 0x3, 0x11, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, 0xd7, + 0x47, 0x98, 0x27, 0x83, 0x9f, 0x74, 0x7b, 0x4, + 0xdf, 0x1e, 0x8e, 0x32, 0xde, 0xe1, 0x47, 0xfd, + 0xdd, 0x9f, 0xa9, 0x6b, 0xd8, 0x4b, 0x6f, 0x97, + 0xce, 0xf8, 0xfd, 0xfd, 0xe1, 0x9d, 0x3a, 0x36, + 0xbd, 0x9d, 0x3, 0x8e, 0xe4, 0xbd, 0x97, 0xbd, + 0xf4, 0xc6, 0xfd, 0xdd, 0xb4, 0xfd, 0x3a, 0x1e, + 0x81, 0xde, 0x4, 0xf3, 0xb4, 0xf5, 0x32, 0x95, + 0xf4, 0xdd, 0xfd, 0x81, 0xe4, 0xfd, 0x3, 0xfd, + 0xf5, 0x47, 0x4, 0xdd, 0xdd, 0x4, 0x32, 0xe4, + 0xb4, 0xde, 0xfd, 0x40, 0xe1, 0x93, 0x97, 0xd8, + 0xf8, 0x9c, 0x4, 0xbf, 0xe4, 0x97, 0x9c, 0x81, + 0xe1, 0x97, 0xfd, 0x74, 0x90, 0x4, 0x93, 0xb4, + 0xdd, 0x4, 0x4, 0x32, 0x4, 0x6c, 0x6c, 0xd7, + 0x6c, 0x4, 0x4, 0x4, 0x4, 0x4, 0x93, 0xb4, + 0xee, 0x97, 0xb4, 0xbf, 0xf4, 0x93, 0xe2, 0xf4, + 0xff, 0x97, 0xbb, 0xf4, 0x93, 0x93, 0x95, 0xe2, + 0x93, 0x93, 0xf4, 0xf4, 0x93, 0x12, 0xe2, 0xe2, + 0x9, 0xf3, 0xe2, 0x44, 0x12, 0x12, 0xe2, 0xe2, + 0x12, 0xe2, 0x44, 0x44, 0x44, 0xf4, 0x44, 0x44, + 0xe2, 0xf4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, + 0xf4, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf4, 0xde, 0xf5, 0xbd, 0xe4, 0xde, 0xde, 0x86, + 0xe4, 0xdd, 0x9d, 0x57, 0xb0, 0xbd, 0xf5, 0xe4, + 0xe4, 0x32, 0xdd, 0xb4, 0xbf, 0x93, 0xfd, 0xd8, + 0x81, 0xfd, 0x98, 0x80, 0xd, 0x4e, 0x22, 0xeb, + 0x90, 0x7b, 0x1e, 0xe1, 0xb4, 0xbd, 0xe1, 0x57, + 0x7, 0xde, 0x9f, 0xcb, 0xc6, 0x9c, 0x81, 0xc6, + 0xce, 0x32, 0xf5, 0x90, 0xfd, 0x97, 0xd8, 0x53, + 0x8b, 0x47, 0xff, 0xd8, 0x6f, 0x9c, 0x1e, 0xce, + 0x8e, 0x32, 0x2e, 0xd8, 0x3, 0x6c, 0x6c, 0x3a, + 0xef, 0x6c, 0x6c, 0xd7, 0xd7, 0x4, 0x9c, 0x81, + 0xde, 0xbd, 0xb4, 0xe1, 0x9d, 0x9c, 0xe4, 0x81, + 0x9b, 0xdf, 0x4b, 0x81, 0x93, 0x93, 0xb4, 0xdf, + 0x9c, 0xc0, 0xbf, 0xde, 0x3, 0x83, 0xb4, 0xbd, + 0xfd, 0xf3, 0x4b, 0x99, 0x97, 0xf3, 0xbf, 0xed, + 0x6b, 0x81, 0xb4, 0x32, 0x47, 0x83, 0x4b, 0x69, + 0x6f, 0xf3, 0x81, 0x6b, 0x47, 0xde, 0xde, 0x47, + 0x5d, 0x2a, 0x54, 0xd7, 0x6b, 0x90, 0x39, 0x6f, + 0x9c, 0xde, 0xf5, 0xe5, 0xfb, 0xdb, 0x91, 0xa8, + 0x49, 0xa8, 0xd4, 0xc5, 0x77, 0x38, 0xd4, 0x96, + 0x1b, 0xa9, 0xa9, 0x77, 0xc2, 0x2a, 0x3, 0x6c, + 0x9d, 0xdb, 0x7d, 0xe5, 0xfd, 0x1e, 0x15, 0x4a, + 0xd7, 0x8f, 0xe, 0x4a, 0x63, 0xd2, 0xe, 0xd7, + 0xd7, 0x27, 0xef, 0xe5, 0x9c, 0xdd, 0x4, 0x4, + 0x99, 0x8b, 0x3, 0x4, 0xde, 0x18, 0x7c, 0x47, + 0xde, 0x81, 0x97, 0x6f, 0xdf, 0xbd, 0x97, 0x32, + 0xde, 0x9d, 0x3a, 0xc8, 0xff, 0x9d, 0x3, 0x47, + 0xde, 0x32, 0x4, 0x32, 0xf3, 0xbd, 0xfd, 0xde, + 0xbf, 0x81, 0xa9, 0xd8, 0xe4, 0xf3, 0x47, 0x99, + 0xc0, 0x32, 0x32, 0xdd, 0xc6, 0xdd, 0xfd, 0xc6, + 0xb4, 0xde, 0x1e, 0xd8, 0xe4, 0xf3, 0x9c, 0xde, + 0xdd, 0x4, 0x6c, 0xfd, 0xdd, 0x8e, 0xfd, 0xcf, + 0xe1, 0x32, 0xfd, 0x90, 0xdd, 0x12, 0xc0, 0xbf, + 0xe4, 0x32, 0xbd, 0xbf, 0xe4, 0x97, 0x47, 0x8b, + 0xd8, 0xcc, 0xdd, 0xb4, 0xc6, 0x93, 0xb4, 0xb4, + 0xe4, 0x4, 0x93, 0xfd, 0x4, 0x6c, 0x6c, 0xd7, + 0xd7, 0x6c, 0x6c, 0x4, 0x6c, 0x4, 0x93, 0xe2, + 0xb4, 0xc0, 0x95, 0xb4, 0x9a, 0xf4, 0xbf, 0xf4, + 0xf4, 0xbf, 0x44, 0xe2, 0x44, 0xf4, 0xe2, 0xe2, + 0xf4, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe4, 0xf5, 0x93, 0xe4, 0xc0, 0xfd, 0x27, 0x9d, + 0x2e, 0x4, 0x4, 0xdf, 0x99, 0x97, 0x4, 0xf3, + 0xdd, 0x32, 0x9c, 0xe1, 0xdd, 0x8e, 0xc8, 0x51, + 0xc8, 0x6f, 0x47, 0x40, 0x88, 0xc2, 0x27, 0x9f, + 0xd8, 0x47, 0x8b, 0x53, 0x40, 0x36, 0x81, 0xf6, + 0x90, 0x32, 0xce, 0xe4, 0xde, 0xf5, 0xbd, 0x8d, + 0xde, 0x7b, 0xde, 0x8b, 0x1e, 0x26, 0xf7, 0xd8, + 0x6b, 0x9c, 0xf3, 0xbf, 0x32, 0x9c, 0xca, 0x1e, + 0xfd, 0xfd, 0xde, 0x3a, 0xef, 0xd7, 0xd7, 0x6c, + 0x4a, 0x6c, 0x6c, 0x6c, 0x6c, 0x6c, 0xfd, 0xd8, + 0x9d, 0xde, 0xb4, 0x75, 0x83, 0xdd, 0xbf, 0xe4, + 0xf3, 0xf3, 0xdf, 0xf3, 0xdd, 0xde, 0xbf, 0x81, + 0xd8, 0xe4, 0x44, 0xbf, 0xce, 0xdf, 0xbf, 0xf3, + 0xf3, 0xbf, 0xc6, 0xf3, 0xde, 0x7, 0xb4, 0xe1, + 0x83, 0xe1, 0xbf, 0xbf, 0xe4, 0xe4, 0x81, 0xbd, + 0xe4, 0xe1, 0xc6, 0x81, 0xd8, 0xba, 0x7, 0xde, + 0x8b, 0x8b, 0xd8, 0xde, 0xde, 0xe4, 0xaf, 0xf3, + 0xde, 0x7, 0x71, 0xde, 0x9f, 0xdb, 0xeb, 0x27, + 0x4f, 0x88, 0x8b, 0xfd, 0x90, 0x53, 0x48, 0x4f, + 0x48, 0x2b, 0x48, 0xdb, 0x40, 0x18, 0xd8, 0xde, + 0xce, 0xc6, 0xce, 0xd8, 0xe1, 0xb2, 0x36, 0x4, + 0x47, 0x5d, 0x5d, 0xe9, 0x63, 0x6e, 0x19, 0x4a, + 0x6c, 0x54, 0x36, 0xde, 0xe1, 0xe1, 0x57, 0x7, + 0xc6, 0x74, 0x53, 0x57, 0xe1, 0x95, 0xc6, 0xbf, + 0xf4, 0xb4, 0xe4, 0x84, 0xce, 0x9a, 0x57, 0x57, + 0xe1, 0xe1, 0x83, 0xd8, 0xe1, 0xde, 0x97, 0x8e, + 0xbd, 0xe4, 0xfd, 0xd8, 0xe1, 0x9a, 0xbc, 0x57, + 0xf4, 0xb4, 0xe1, 0xb4, 0xe1, 0xe4, 0xc6, 0xb4, + 0xb4, 0xb4, 0xe1, 0x57, 0xb4, 0xe4, 0x75, 0x7, + 0xb4, 0xbf, 0xb4, 0xe4, 0xe4, 0xdd, 0xde, 0xfd, + 0x28, 0x4, 0x9b, 0x3a, 0x84, 0xde, 0xde, 0xc6, + 0xb4, 0xb4, 0xe4, 0xbf, 0xf4, 0xbf, 0xb4, 0x9a, + 0xf4, 0xcd, 0xb4, 0xbc, 0x57, 0xb4, 0xf4, 0x9a, + 0xbf, 0xf4, 0xb4, 0xf4, 0xf4, 0xbb, 0xf4, 0x7, + 0x57, 0x97, 0x97, 0xfd, 0x3, 0xd7, 0x6c, 0x6c, + 0x6c, 0xd7, 0x6c, 0x97, 0x4, 0x4, 0x97, 0xe1, + 0x57, 0xb4, 0xf4, 0xf4, 0xf4, 0x20, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, 0xe2, 0xf4, + 0xf4, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf4, 0xbf, 0xe1, 0x57, 0xb4, 0xc6, 0xd8, 0xd8, + 0x8d, 0xb4, 0xbf, 0xbf, 0xbf, 0xe4, 0xb4, 0xb4, + 0xb4, 0xe4, 0xe1, 0xbc, 0x7, 0xbd, 0xe1, 0x81, + 0xcd, 0xe4, 0xfa, 0x84, 0xf6, 0x40, 0x53, 0xa2, + 0xba, 0xc6, 0x9f, 0x18, 0x9f, 0xbd, 0xe4, 0xb4, + 0xce, 0xb4, 0x8d, 0xf4, 0x9a, 0xb4, 0xb4, 0x85, + 0xbc, 0x8d, 0xe4, 0x81, 0xbf, 0xe4, 0x8d, 0xf4, + 0xaf, 0x8d, 0xe4, 0x7, 0x57, 0x84, 0x9, 0xbc, + 0x40, 0xd8, 0xbd, 0x7b, 0x6c, 0x6c, 0xe5, 0xd7, + 0xd7, 0x4a, 0x6c, 0xef, 0x77, 0x3, 0x47, 0x1e, + 0x9d, 0xc6, 0xbf, 0xb4, 0xf4, 0xbf, 0xf4, 0xe4, + 0xe4, 0xe4, 0xb4, 0xf4, 0x7, 0x9a, 0xf4, 0xf4, + 0xbf, 0xf4, 0xbf, 0xf4, 0xbb, 0xbf, 0xf4, 0xbb, + 0x9a, 0x7, 0xf4, 0xb4, 0x9a, 0x7, 0xe4, 0xe1, + 0xe4, 0xbf, 0xb4, 0xbb, 0xbf, 0xf4, 0xe4, 0xe1, + 0xe1, 0x9f, 0x84, 0xe4, 0x75, 0xf6, 0xf6, 0xc6, + 0xe4, 0xe4, 0xc6, 0xc6, 0xc6, 0xe1, 0xb4, 0xe1, + 0xe1, 0xa9, 0x9b, 0x47, 0xc6, 0x84, 0x84, 0x81, + 0xc6, 0x84, 0xc6, 0xf6, 0x18, 0xdc, 0x3f, 0xa3, + 0xdb, 0x3c, 0x48, 0x74, 0x84, 0x84, 0x84, 0x4b, + 0xe1, 0x84, 0x7, 0xd8, 0x47, 0x51, 0x5d, 0x3, + 0xd7, 0x5d, 0x67, 0xf1, 0xd2, 0x63, 0x6e, 0x63, + 0x6e, 0x27, 0x27, 0x3, 0xd8, 0xcb, 0xb, 0x75, + 0xe1, 0x84, 0x90, 0x90, 0xc6, 0xb4, 0xc0, 0xe4, + 0xc6, 0xf9, 0xbc, 0xbc, 0xe1, 0x75, 0x18, 0x9f, + 0xe4, 0xde, 0xfd, 0x4, 0x47, 0x4, 0x6c, 0x3, + 0x4, 0x8f, 0x3a, 0x3a, 0xfd, 0xfd, 0x47, 0x1e, + 0xb4, 0xe4, 0xf3, 0xe4, 0x4b, 0xdf, 0xde, 0x57, + 0x57, 0xc6, 0x8b, 0xcb, 0xe1, 0xe4, 0xde, 0x81, + 0x81, 0xdd, 0x8e, 0xde, 0xfd, 0x47, 0xd7, 0x3a, + 0x77, 0xd7, 0x19, 0x1b, 0xe5, 0xe5, 0x4, 0x4, + 0x9c, 0x97, 0x32, 0xe4, 0xe4, 0x12, 0xc6, 0x75, + 0x57, 0xde, 0xe4, 0x90, 0xdf, 0x32, 0xbd, 0xbf, + 0xb4, 0xb2, 0xb4, 0xbf, 0x57, 0xbd, 0xfd, 0x47, + 0x9b, 0xd7, 0x6c, 0xd7, 0x73, 0x73, 0xd7, 0xd7, + 0xf1, 0x30, 0xa0, 0x73, 0x14, 0xe0, 0x6c, 0xe5, + 0x6c, 0x4, 0x97, 0xc0, 0x12, 0x93, 0x95, 0xbb, + 0xe2, 0xf4, 0xf4, 0xf4, 0x8d, 0xf4, 0x44, 0xe2, + 0xe2, 0xf4, 0xe2, 0x44, 0xe2, 0xf4, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x95, 0xc0, 0xbb, 0xbf, 0x95, + 0x10, 0x10, 0x10, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0xe2, + 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x10, 0x10, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe4, 0xbf, 0x7, 0x75, 0xe1, 0xb4, 0xe1, 0xcc, + 0xb4, 0xb4, 0xe4, 0xb4, 0xbf, 0xe4, 0xc6, 0x74, + 0x9a, 0xb4, 0xe1, 0x75, 0x4b, 0xe1, 0xb4, 0xb4, + 0xb4, 0x85, 0x75, 0x74, 0xba, 0xa2, 0xb, 0x80, + 0x18, 0x9b, 0xd8, 0x1e, 0xfd, 0x97, 0x8e, 0x2e, + 0xb1, 0x32, 0xdd, 0x75, 0xbc, 0xe1, 0xe1, 0x57, + 0xf6, 0xce, 0xbf, 0xb4, 0xbf, 0xf8, 0x4b, 0xb4, + 0xe1, 0xde, 0xe1, 0x18, 0xdb, 0x9f, 0x84, 0xe1, + 0x83, 0x6b, 0x4, 0x4, 0xe5, 0xe5, 0xef, 0xc2, + 0xe9, 0xa5, 0xc5, 0x1b, 0xa5, 0xd5, 0xe5, 0x4, + 0x9c, 0x47, 0xdf, 0xb4, 0xc0, 0xe4, 0xf4, 0xcc, + 0xd8, 0xd8, 0xf4, 0xb4, 0x9f, 0xfa, 0xf4, 0xaf, + 0xb4, 0xbf, 0xfa, 0xe4, 0xdd, 0xbf, 0xe1, 0x4b, + 0x90, 0x57, 0xb4, 0xbf, 0xc6, 0x90, 0x4b, 0xf3, + 0x93, 0xbf, 0x86, 0xdf, 0xdd, 0x75, 0xe1, 0xdd, + 0x83, 0x40, 0xc6, 0xce, 0xbd, 0xf9, 0x99, 0x9c, + 0x32, 0xe4, 0xc6, 0xca, 0x99, 0x57, 0x75, 0x8e, + 0xfd, 0x27, 0xd7, 0x4, 0xb1, 0xe1, 0xc6, 0x1e, + 0x70, 0x75, 0x53, 0x8b, 0x4f, 0x22, 0xb8, 0xef, + 0x8b, 0x48, 0x7e, 0x8b, 0xfd, 0xed, 0xd8, 0x99, + 0xfd, 0x9f, 0x3a, 0xd5, 0x47, 0x77, 0xa5, 0x63, + 0xd5, 0xd2, 0x24, 0x41, 0x30, 0x79, 0x2f, 0x73, + 0x5b, 0x42, 0x7a, 0x77, 0xd7, 0x27, 0x6b, 0x4, + 0xce, 0xc6, 0xf5, 0x9c, 0xdf, 0xbd, 0x8e, 0x47, + 0xf8, 0xf5, 0x9d, 0x9d, 0xb4, 0x81, 0x6b, 0x6f, + 0xce, 0x8e, 0x6c, 0xd7, 0xd7, 0xd7, 0xe, 0x5d, + 0x6e, 0x19, 0x19, 0xd5, 0xd7, 0x6c, 0x6c, 0x4, + 0xdd, 0xdd, 0x97, 0xfd, 0x1e, 0x47, 0x4, 0x9d, + 0x9f, 0xde, 0x6b, 0xfd, 0xc6, 0x93, 0x4, 0x32, + 0xde, 0x97, 0x6c, 0x6c, 0x3, 0xd5, 0x4a, 0xd2, + 0xe, 0x4a, 0x6e, 0x1b, 0x6e, 0x4a, 0xd7, 0x6c, + 0xe5, 0x6c, 0x6c, 0xfd, 0xd8, 0x97, 0x97, 0xe4, + 0xc6, 0x32, 0x97, 0xf3, 0xdd, 0x4, 0x97, 0xb4, + 0xe4, 0x7b, 0xdd, 0x85, 0xcf, 0x6c, 0x6c, 0x6c, + 0x6c, 0x6c, 0x6c, 0x6e, 0x58, 0x58, 0x30, 0x58, + 0x41, 0x1c, 0xda, 0x41, 0xd3, 0x8, 0x6c, 0x4, + 0xe0, 0x4, 0x4, 0x4, 0x97, 0x4, 0x93, 0x44, + 0x69, 0x8e, 0xe2, 0xf4, 0x12, 0x93, 0xe2, 0xe2, + 0x93, 0x12, 0xe2, 0xe2, 0xe2, 0x12, 0xe2, 0x44, + 0xe2, 0x9, 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0xe2, + 0xbb, 0x95, 0xe2, 0xbb, 0xbf, 0x12, 0xbf, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbd, 0xbd, 0xf3, 0x81, 0xc6, 0xdd, 0xdd, 0xb4, + 0x75, 0xdf, 0x9c, 0x57, 0x57, 0x32, 0x1e, 0xca, + 0x81, 0xf3, 0x93, 0xe4, 0xdf, 0x9c, 0x32, 0xe1, + 0x57, 0x1e, 0x39, 0x18, 0xeb, 0xa9, 0x27, 0x27, + 0x47, 0xe5, 0x6c, 0xe5, 0xd7, 0xd5, 0xd7, 0x6c, + 0x3, 0x6c, 0x6c, 0x1e, 0x83, 0x9c, 0xbd, 0xb4, + 0xdf, 0x69, 0xf3, 0xdd, 0xde, 0x9c, 0xf5, 0xc6, + 0x9d, 0x3a, 0x1e, 0x39, 0x6b, 0x9c, 0x32, 0xfd, + 0xe5, 0x6c, 0x6c, 0xd7, 0x5d, 0x50, 0x73, 0x2f, + 0x2f, 0x2f, 0xa5, 0x5b, 0x5b, 0xc2, 0x4a, 0xd7, + 0xd7, 0xd7, 0xe5, 0x4, 0x6c, 0x9d, 0xc6, 0xdf, + 0x9c, 0x9c, 0x9, 0xf3, 0x97, 0xc0, 0xbf, 0xc0, + 0x93, 0xdd, 0x90, 0x93, 0x4, 0x9d, 0xc6, 0xdd, + 0x4, 0xf3, 0xe4, 0x12, 0x4, 0x93, 0xf3, 0x93, + 0x97, 0xde, 0xb2, 0x32, 0x8e, 0xd8, 0xc6, 0x93, + 0x9c, 0x93, 0xf3, 0x4, 0x4, 0x12, 0xf5, 0x97, + 0x8e, 0xd8, 0xdb, 0x4, 0x6f, 0x81, 0xdd, 0x97, + 0x4, 0x9c, 0x97, 0x4, 0x4, 0xe1, 0xd8, 0xfd, + 0xfd, 0x53, 0x2a, 0x3, 0x47, 0x1e, 0x47, 0xe5, + 0x36, 0xd8, 0x9d, 0xe5, 0x32, 0x57, 0x3a, 0x3, + 0x6f, 0xd8, 0x27, 0xd7, 0xd7, 0x4a, 0x4a, 0x6e, + 0xd2, 0x67, 0xb5, 0x1c, 0xe3, 0x6d, 0xd3, 0x1a, + 0xc9, 0x73, 0x5a, 0x6e, 0xd7, 0x6c, 0x6c, 0x4, + 0xde, 0xe1, 0x36, 0x3, 0xde, 0xde, 0x4, 0x47, + 0x12, 0xe4, 0x97, 0x8e, 0xe1, 0xde, 0x8e, 0xfd, + 0xfd, 0x4, 0xd7, 0xe9, 0xd5, 0x63, 0xa5, 0x2f, + 0x6e, 0x19, 0x11, 0x4a, 0x19, 0xd7, 0xd7, 0x4, + 0xfd, 0x8e, 0x4, 0x9d, 0xc4, 0xde, 0x97, 0x1e, + 0xe4, 0xdd, 0x93, 0xe4, 0xe4, 0xde, 0x97, 0xd8, + 0xd8, 0x47, 0x6c, 0xd5, 0xe9, 0x4a, 0xd5, 0x2d, + 0x2f, 0x1b, 0x63, 0x63, 0x42, 0x1b, 0x6e, 0x4a, + 0xa5, 0xd7, 0x6c, 0x8e, 0xd8, 0x93, 0xf3, 0xe4, + 0xb4, 0xdd, 0xdd, 0xe4, 0xe1, 0xfd, 0x8e, 0xe1, + 0xbc, 0x2e, 0xb4, 0xb4, 0xde, 0x6c, 0x6c, 0x6c, + 0xd7, 0x6e, 0x8, 0x2f, 0x41, 0xb5, 0x1c, 0x78, + 0x62, 0x62, 0x41, 0x1c, 0x62, 0x1c, 0x30, 0xd7, + 0x4, 0x6c, 0x4, 0x4, 0x97, 0x93, 0xf4, 0xe2, + 0xf4, 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xe2, 0xe2, 0xaf, 0xbf, 0xbf, 0xbf, 0x10, + 0x10, 0x0, 0x10, 0x10, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x32, 0x4, 0x6f, 0xde, 0xde, 0xde, 0x8e, 0x9f, + 0x9f, 0x9c, 0xff, 0xe1, 0xe1, 0x93, 0x93, 0xf3, + 0xf3, 0x97, 0x97, 0xde, 0xe1, 0x32, 0xfd, 0xf6, + 0x53, 0x9b, 0x7b, 0xe1, 0xd8, 0x6f, 0x6c, 0x4, + 0xe5, 0xd7, 0x4a, 0x4a, 0xd2, 0xd2, 0x4a, 0x4a, + 0x19, 0xd7, 0x6c, 0xb1, 0x32, 0x4, 0xbd, 0xbf, + 0xce, 0x97, 0xde, 0xc6, 0x9d, 0x9d, 0xde, 0xe4, + 0x1e, 0x9c, 0x69, 0xce, 0x97, 0x4, 0x36, 0x6f, + 0xd7, 0xd5, 0xd7, 0xc5, 0x8, 0x2f, 0x2f, 0x2f, + 0xb3, 0x8c, 0xa4, 0x73, 0x96, 0xc9, 0x89, 0x6e, + 0xe, 0x5d, 0xe5, 0x47, 0x47, 0x47, 0xce, 0xb4, + 0xdd, 0xf3, 0xbf, 0xb4, 0xf3, 0xcd, 0xf4, 0xe4, + 0xb4, 0x9f, 0xe1, 0xbf, 0xbd, 0x4b, 0xb4, 0xf3, + 0xdd, 0xe4, 0xc6, 0x81, 0xf3, 0xe4, 0xb4, 0xe4, + 0xf8, 0xe1, 0x70, 0xf3, 0xcc, 0xc6, 0xf8, 0xf3, + 0xf3, 0xaf, 0x9a, 0xdf, 0x2e, 0xe1, 0x57, 0xc6, + 0x81, 0xf6, 0xfa, 0xf3, 0xbf, 0xbf, 0xc6, 0xbd, + 0xf3, 0xe4, 0x84, 0xd8, 0x81, 0x75, 0x74, 0x84, + 0xbf, 0x57, 0xf6, 0x84, 0xb4, 0xe1, 0xe1, 0xb2, + 0xe4, 0x57, 0xdb, 0x40, 0x83, 0x83, 0x9f, 0xfd, + 0xde, 0x81, 0x6b, 0xd7, 0x19, 0xd2, 0x79, 0x67, + 0x58, 0xe3, 0xb5, 0x6d, 0x1c, 0x1c, 0x1c, 0x58, + 0x79, 0x67, 0x58, 0x89, 0x6b, 0x71, 0xfd, 0x9d, + 0x9f, 0x83, 0x40, 0x9f, 0x84, 0xe1, 0xdf, 0xb4, + 0xb4, 0xf4, 0xcd, 0x86, 0xd8, 0xe1, 0xd8, 0x3a, + 0xdb, 0x7c, 0xd2, 0xc2, 0x19, 0x63, 0x67, 0x30, + 0x79, 0xd2, 0xa5, 0x2f, 0x2f, 0x63, 0x4a, 0x3, + 0x9d, 0xc6, 0x9c, 0xc6, 0xb4, 0xe4, 0xe4, 0xf9, + 0xc6, 0xe1, 0xe4, 0xe1, 0x74, 0x83, 0xff, 0xb2, + 0xc8, 0x1e, 0x6b, 0x7d, 0xd7, 0x4a, 0xd2, 0x58, + 0x8c, 0x87, 0x8c, 0xab, 0x65, 0x30, 0x73, 0x89, + 0xd5, 0x4a, 0x6c, 0xe5, 0x9c, 0xdd, 0xde, 0xb4, + 0xe1, 0xe1, 0xb4, 0x9a, 0x57, 0x75, 0xdf, 0xdf, + 0xce, 0xe4, 0xe4, 0xde, 0x99, 0xe5, 0x6c, 0x6c, + 0x2f, 0xd3, 0x1c, 0xe3, 0xe3, 0x76, 0xe3, 0x29, + 0xa, 0x1c, 0xd3, 0x62, 0x62, 0xa, 0xe3, 0x78, + 0xa, 0x78, 0x30, 0xa0, 0x97, 0x97, 0x93, 0xf4, + 0xf4, 0xe2, 0xe2, 0x44, 0xe2, 0xf4, 0xe2, 0xe2, + 0x44, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0xe2, 0x44, + 0xc0, 0xbf, 0xbf, 0xf4, 0xe2, 0xe2, 0xbf, 0x10, + 0x0, 0x0, 0xe3, 0x10, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0xe2, 0x44, 0xe2, 0x0, 0x10, 0x10, 0x0, + 0x10, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbd, 0xfd, 0x32, 0xd8, 0x53, 0xe1, 0x81, 0x4b, + 0xe1, 0xe4, 0xbf, 0xbf, 0x4b, 0x95, 0xbb, 0x20, + 0x9a, 0x90, 0x81, 0xe1, 0x57, 0xe1, 0xc6, 0x90, + 0x4b, 0xc6, 0xbd, 0x84, 0x81, 0x47, 0xfd, 0x36, + 0x3a, 0xd2, 0x1b, 0xe, 0xd2, 0x6e, 0x4a, 0x6e, + 0x6e, 0x4a, 0x6c, 0x2e, 0xfd, 0x1e, 0xde, 0xe4, + 0x85, 0x9f, 0xf9, 0xdf, 0xc6, 0xc6, 0xb4, 0xce, + 0x90, 0x9c, 0x81, 0x8d, 0xd8, 0xa9, 0x35, 0x6b, + 0xd5, 0x5d, 0xe9, 0x96, 0x73, 0xa6, 0x7a, 0x1, + 0x82, 0xd3, 0x65, 0xab, 0x1, 0x8c, 0xc3, 0x73, + 0x96, 0xc5, 0x47, 0x7b, 0x6b, 0x9c, 0x2e, 0xe4, + 0xb4, 0x90, 0x90, 0xb4, 0xb4, 0x9a, 0x9a, 0x4b, + 0xe4, 0xbf, 0xb4, 0xf4, 0xc6, 0xdf, 0xe4, 0xb4, + 0xb4, 0xe1, 0xf6, 0xf8, 0xb4, 0xb4, 0x9a, 0xf4, + 0xc6, 0xbf, 0xb4, 0xf4, 0xbf, 0xc6, 0xdf, 0xe4, + 0xb4, 0xe1, 0x53, 0x90, 0xdf, 0xb4, 0xb4, 0xb4, + 0x81, 0xed, 0x95, 0xf4, 0xbf, 0xe4, 0xe1, 0x81, + 0xb4, 0x9a, 0xbc, 0xf9, 0xdf, 0xe4, 0xf4, 0xbf, + 0xb4, 0xb4, 0xc6, 0xf4, 0xb4, 0xf4, 0x75, 0xdb, + 0xe1, 0x7, 0x74, 0x9f, 0x90, 0x9c, 0x9c, 0x4, + 0x32, 0x47, 0x4a, 0xa5, 0x77, 0x2f, 0xd3, 0xe3, + 0x29, 0x62, 0x78, 0x5e, 0xe3, 0xda, 0xb5, 0x41, + 0x2f, 0x8, 0xda, 0xb3, 0x77, 0x27, 0xef, 0x27, + 0x1e, 0xf5, 0x32, 0xde, 0xb4, 0xc0, 0x9c, 0xde, + 0xe1, 0xe4, 0xde, 0x3a, 0x8b, 0x8e, 0x47, 0x25, + 0x63, 0x6e, 0x42, 0x79, 0xd2, 0x79, 0x30, 0xb5, + 0x30, 0x8c, 0xd3, 0x24, 0x87, 0x8, 0x2f, 0xd5, + 0xe5, 0x47, 0x4, 0xdd, 0xe4, 0xde, 0xdd, 0xd8, + 0x9f, 0xc4, 0xde, 0x71, 0x40, 0x47, 0x6f, 0x36, + 0x47, 0xd7, 0x4a, 0x63, 0xe, 0x2f, 0x2f, 0xd3, + 0xa, 0xbe, 0xb5, 0x41, 0xda, 0xe3, 0x58, 0x67, + 0x1b, 0x4a, 0x4a, 0xd7, 0xd7, 0x6c, 0x4, 0xfd, + 0xde, 0xfd, 0xde, 0xe4, 0xe4, 0xf3, 0xb1, 0xc0, + 0x2e, 0x4, 0x4, 0x4, 0xe5, 0x5d, 0x2f, 0x79, + 0x58, 0xd3, 0x29, 0x62, 0x62, 0x62, 0xd1, 0xd1, + 0x78, 0x62, 0x78, 0xa, 0x62, 0x62, 0x62, 0x62, + 0x62, 0x1c, 0x45, 0x30, 0x9c, 0x4, 0x97, 0x97, + 0x93, 0x93, 0xf4, 0xe2, 0xf4, 0x12, 0x44, 0xe2, + 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xf4, 0x12, 0x44, 0xe2, 0x12, 0x95, 0x12, 0x12, + 0x44, 0xf4, 0xbf, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x10, 0x0, 0x6d, 0xf4, 0x44, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0xe2, 0x44, + 0xe2, 0x44, 0x0, 0x0, 0x44, 0x10, 0x10, 0x10, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x3, 0x3, 0x47, 0xd8, 0x81, 0xd8, 0x9c, 0xc6, + 0xe4, 0xbf, 0xe4, 0xe4, 0xf9, 0xe1, 0xbf, 0xbf, + 0x57, 0x90, 0xdf, 0xe4, 0xe4, 0xce, 0xf5, 0x9c, + 0xde, 0xde, 0x8e, 0x70, 0x9d, 0x77, 0x6c, 0xd7, + 0xe, 0x42, 0x5b, 0x89, 0x63, 0x19, 0x6e, 0x1b, + 0x1b, 0x19, 0xd7, 0xe5, 0x47, 0x5d, 0x36, 0xde, + 0xd8, 0xfd, 0x9c, 0xbd, 0xde, 0xde, 0xe4, 0xb4, + 0xf5, 0x3, 0x36, 0xfd, 0xe5, 0x5d, 0x6e, 0xd5, + 0x11, 0xa5, 0x96, 0x96, 0xad, 0xa6, 0xa8, 0x67, + 0xd3, 0x4d, 0x6d, 0xe3, 0x6d, 0x82, 0x82, 0xb3, + 0xa6, 0x6e, 0xd5, 0xd7, 0xd7, 0x6c, 0x36, 0x97, + 0x8e, 0x90, 0x9f, 0x81, 0x12, 0x12, 0xe4, 0xe4, + 0xf3, 0xbf, 0xf4, 0xf3, 0xc0, 0xdd, 0xe1, 0xde, + 0xdd, 0xc6, 0xf6, 0xf5, 0x93, 0xe4, 0x20, 0x9, + 0x93, 0xc0, 0xbf, 0xbd, 0xc0, 0xf3, 0xe4, 0xde, + 0x32, 0xbd, 0xf6, 0xfd, 0x93, 0xe4, 0xbf, 0xc0, + 0x93, 0xc0, 0xe1, 0xdd, 0x8e, 0xe4, 0x9f, 0x9d, + 0xb1, 0xe4, 0xe1, 0x1e, 0x32, 0xe4, 0xe4, 0xde, + 0xb4, 0xf4, 0xe1, 0x9d, 0xde, 0xb4, 0xd8, 0x3, + 0xbd, 0xe4, 0xf5, 0x9c, 0x6c, 0x4, 0xe0, 0xd7, + 0xd7, 0xd7, 0xa5, 0x2f, 0x1, 0x67, 0x24, 0xe3, + 0xe3, 0x4d, 0x62, 0x4d, 0x6d, 0x1c, 0x62, 0x6d, + 0xb5, 0x58, 0x58, 0x8c, 0xa6, 0x1b, 0x19, 0xd7, + 0xd7, 0x4, 0x6c, 0x6c, 0x47, 0x9c, 0x6c, 0x3, + 0x9d, 0xfd, 0x4, 0xef, 0xef, 0xd7, 0xd7, 0x4a, + 0x4a, 0xd2, 0x8c, 0x41, 0x6d, 0xe3, 0xb5, 0x62, + 0xb5, 0xe3, 0x1c, 0x58, 0x68, 0xa0, 0x8, 0xf0, + 0x4a, 0xd7, 0x6c, 0x4, 0x3d, 0xfd, 0x4, 0x8e, + 0x9f, 0xfd, 0x6c, 0x9c, 0x36, 0x6c, 0xd7, 0xd7, + 0x19, 0xd5, 0xe, 0x2f, 0x8c, 0x24, 0x6d, 0x1c, + 0xb5, 0x82, 0xb5, 0x87, 0x68, 0x58, 0x82, 0xda, + 0x8, 0x2, 0xd2, 0xd5, 0xe, 0x5d, 0x4a, 0x6c, + 0x6c, 0x4, 0x4, 0xdd, 0xde, 0x4, 0x4, 0x2e, + 0x47, 0x6c, 0xd7, 0xd7, 0xd7, 0x2f, 0x67, 0xb3, + 0x58, 0xe3, 0x41, 0x62, 0xa, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0x62, 0xd1, 0xd1, 0x62, 0x62, 0xd1, + 0x29, 0x45, 0x45, 0x30, 0x45, 0x45, 0x97, 0x4, + 0x97, 0x97, 0x93, 0xf4, 0x12, 0x93, 0xe2, 0xe2, + 0x12, 0x12, 0xe2, 0xe2, 0x12, 0x12, 0xe2, 0xe2, + 0xc0, 0x12, 0x44, 0xf3, 0xbf, 0xc0, 0xbf, 0xe2, + 0x81, 0xd1, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x0, 0x44, 0x44, 0x44, + 0xf4, 0xe2, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x4a, 0xd7, 0x6c, 0x6c, 0x47, 0x4, 0x97, 0xc0, + 0xb4, 0xde, 0xdd, 0xb4, 0x57, 0x9d, 0xde, 0xb4, + 0xc6, 0x32, 0x32, 0xf3, 0x81, 0x9c, 0x4, 0x4, + 0x47, 0x3a, 0xe5, 0xd7, 0xd5, 0xc5, 0x4a, 0xc2, + 0x63, 0x96, 0x2f, 0x8c, 0x30, 0x8, 0x73, 0x42, + 0xa5, 0x2f, 0xc5, 0x19, 0x4a, 0x19, 0x6c, 0x6c, + 0x6c, 0x4, 0x4, 0xbd, 0xfd, 0x4, 0xfd, 0xde, + 0x47, 0xd7, 0x77, 0x19, 0x4a, 0x4a, 0xd5, 0xd2, + 0x79, 0x8, 0x8c, 0xb5, 0xe3, 0xb5, 0xab, 0xab, + 0x8c, 0x8c, 0xd3, 0x82, 0x87, 0x58, 0xbe, 0x6d, + 0x58, 0x14, 0xa5, 0xe9, 0x4a, 0xd7, 0x5d, 0xef, + 0x6c, 0x6c, 0xdd, 0xdd, 0x6f, 0xf3, 0xf3, 0xf3, + 0x93, 0x93, 0xe1, 0xde, 0x4, 0x32, 0x75, 0x1e, + 0x4, 0xbd, 0xe4, 0x93, 0x93, 0xf5, 0xf3, 0x93, + 0x97, 0xf3, 0x57, 0xfd, 0x6f, 0xc0, 0xc6, 0x97, + 0x9c, 0xf5, 0xc0, 0x4, 0x4, 0xdd, 0x81, 0xfd, + 0x93, 0xf3, 0x57, 0xa9, 0x32, 0xf3, 0xf3, 0x4, + 0x4, 0xdf, 0xde, 0x97, 0x8e, 0xe4, 0x57, 0xfd, + 0xd8, 0xcc, 0xe1, 0x9d, 0x1e, 0xe1, 0xce, 0x97, + 0xb1, 0xc6, 0x47, 0x6c, 0xd7, 0x6c, 0xd5, 0x5d, + 0x2f, 0x5d, 0x5d, 0x2f, 0x67, 0x30, 0x87, 0xab, + 0x82, 0xe3, 0x29, 0xa, 0x1c, 0x62, 0x29, 0x4d, + 0x78, 0x6d, 0x24, 0x5a, 0x89, 0x5b, 0x1b, 0x4a, + 0xd7, 0x6c, 0xd7, 0xd5, 0xa9, 0xfd, 0x4, 0xe5, + 0x7c, 0x6b, 0xd7, 0xd7, 0xd7, 0xd7, 0x19, 0xd2, + 0x79, 0x2f, 0xd3, 0x76, 0x62, 0x62, 0x62, 0x78, + 0x78, 0x78, 0x1c, 0x5, 0xf1, 0x2f, 0xa0, 0x73, + 0x42, 0xe, 0xd7, 0xe5, 0x8b, 0x27, 0x6c, 0xbd, + 0xe4, 0xf5, 0x6b, 0x4, 0x69, 0xd7, 0xd7, 0xe, + 0x14, 0x2f, 0x8c, 0x8c, 0xb5, 0xe3, 0x62, 0x62, + 0xd3, 0xe3, 0xda, 0xa4, 0xb3, 0xd3, 0xd3, 0x1c, + 0x3b, 0x41, 0x58, 0x79, 0x63, 0x1b, 0x6e, 0xd7, + 0x4, 0x4, 0x4, 0xdf, 0x9c, 0xfd, 0xfd, 0xbd, + 0x4, 0x3, 0xd5, 0x6c, 0xd7, 0x2f, 0x8c, 0x6d, + 0x1c, 0xe3, 0x62, 0x6d, 0xa, 0x62, 0xa, 0xa, + 0x62, 0xa, 0xd1, 0xd1, 0xa, 0xd1, 0xd1, 0x23, + 0xa, 0xa, 0x62, 0xa, 0x1c, 0xa, 0x62, 0x4, + 0x97, 0x93, 0x93, 0x12, 0xf4, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xc0, 0xbf, 0xbf, 0x12, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x4a, 0x4a, 0x6c, 0x4a, 0xd7, 0xd7, 0x4, 0xde, + 0x57, 0x9d, 0x6f, 0x9, 0xc6, 0xde, 0xf5, 0xdf, + 0xce, 0x93, 0x93, 0xdf, 0x99, 0xe5, 0x47, 0x32, + 0x3, 0x63, 0x63, 0x4a, 0x11, 0x19, 0x63, 0x73, + 0x5b, 0x8, 0x41, 0xb5, 0xb5, 0x4d, 0x1c, 0x8c, + 0x8, 0x8, 0x5b, 0x5b, 0x19, 0x4a, 0xd7, 0xe5, + 0xef, 0x6b, 0xfd, 0xe4, 0x8e, 0x27, 0x27, 0x9c, + 0x4, 0xd7, 0x4a, 0x11, 0x19, 0x4a, 0xe, 0x79, + 0x67, 0x82, 0x1c, 0x6d, 0xe3, 0x82, 0x6d, 0xe3, + 0x2f, 0x79, 0x1, 0xad, 0xa0, 0xa6, 0x1, 0x8c, + 0x24, 0x87, 0x67, 0x2f, 0xe, 0xd5, 0xef, 0xd5, + 0x6c, 0x93, 0x81, 0xbd, 0xf5, 0xf3, 0xb4, 0xb4, + 0xf3, 0xe4, 0x90, 0x1e, 0x2e, 0xf3, 0x95, 0xc6, + 0xf3, 0xe4, 0xbf, 0xe4, 0xc0, 0xdf, 0x9, 0xde, + 0x93, 0x12, 0xc6, 0x9c, 0xbb, 0xbf, 0xbf, 0xe4, + 0xf5, 0xdf, 0xb4, 0xbd, 0xde, 0xe4, 0x90, 0xb2, + 0xe4, 0xf4, 0x8d, 0xc4, 0x81, 0xf4, 0xf4, 0x8d, + 0xb4, 0xdf, 0xd8, 0xbd, 0x57, 0xb4, 0xb0, 0xf6, + 0xe1, 0xb4, 0xb4, 0xe4, 0xbf, 0xbb, 0xe4, 0x85, + 0x57, 0xe1, 0x1e, 0x3a, 0x9d, 0x9b, 0xd5, 0x79, + 0xf1, 0x8, 0xf1, 0x58, 0xd3, 0xb5, 0xda, 0xe3, + 0x5e, 0x82, 0xb5, 0x6d, 0xe3, 0xe3, 0xda, 0xb5, + 0x29, 0x1c, 0x41, 0x58, 0x24, 0x87, 0x73, 0x1b, + 0x5d, 0x3, 0xe5, 0x3, 0x8b, 0x81, 0xce, 0xd8, + 0x1e, 0x47, 0x6c, 0x4a, 0x8f, 0xa5, 0xe, 0x2f, + 0x8c, 0xab, 0xd3, 0xa, 0xd1, 0xa, 0xa, 0x29, + 0xa, 0xa, 0x62, 0x6d, 0xb5, 0xd3, 0xb5, 0x87, + 0xb3, 0xe9, 0xef, 0x47, 0xd8, 0xde, 0xe4, 0xe4, + 0xe4, 0x2e, 0x9, 0xfd, 0x9d, 0x5d, 0xe, 0x4a, + 0x5a, 0x67, 0x30, 0x30, 0xda, 0x6d, 0x62, 0x6d, + 0x6d, 0x62, 0xa, 0xd3, 0x55, 0xd3, 0xbe, 0x58, + 0xa4, 0xa4, 0x45, 0x5b, 0x1b, 0x1b, 0x19, 0xe5, + 0x47, 0x3, 0x3, 0xde, 0x9, 0x9b, 0xfd, 0xfd, + 0x97, 0xd7, 0xd7, 0xd5, 0xf1, 0x87, 0xa, 0x62, + 0x62, 0xd1, 0x62, 0xa, 0xe3, 0x1c, 0x62, 0xe3, + 0x3b, 0xda, 0xa, 0x62, 0xd1, 0xd1, 0xd1, 0x23, + 0x23, 0xd1, 0xd1, 0xd1, 0xa, 0x45, 0x3b, 0x30, + 0x45, 0x93, 0x93, 0x20, 0xe2, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0xe2, 0xe2, 0xc0, 0x95, 0xc0, 0x0, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe9, 0xa5, 0x4a, 0x19, 0xef, 0x3a, 0x47, 0xde, + 0xe4, 0x81, 0xb4, 0xbf, 0xbf, 0xb4, 0xb4, 0xce, + 0x8d, 0x9a, 0xe1, 0xb4, 0x90, 0x6b, 0x36, 0x9c, + 0x9c, 0xd7, 0x4a, 0xd7, 0x4a, 0x21, 0x79, 0xa4, + 0xa4, 0x82, 0xb5, 0xe3, 0xe3, 0xda, 0x6d, 0x58, + 0x42, 0x42, 0x8c, 0xb3, 0x5b, 0xe, 0x5d, 0xfd, + 0xfd, 0x3, 0x53, 0xc6, 0x81, 0x1e, 0xce, 0xde, + 0x9c, 0xd7, 0xd7, 0xd5, 0xe, 0x79, 0x1, 0x67, + 0x58, 0x24, 0x58, 0xda, 0x30, 0xa0, 0x58, 0x58, + 0x67, 0xa8, 0x1d, 0x49, 0xb3, 0xb3, 0x52, 0x52, + 0x67, 0x5a, 0xa6, 0xc9, 0x6e, 0xd5, 0x9c, 0x4, + 0x4, 0x9c, 0xde, 0xe1, 0xe4, 0xb4, 0xaf, 0xb4, + 0x95, 0xb4, 0xbf, 0xb4, 0xb4, 0xbf, 0xf4, 0xf4, + 0xb4, 0xbf, 0x9a, 0x7, 0xb4, 0xe2, 0xb4, 0xb4, + 0x8d, 0xb4, 0xf4, 0xbf, 0xbf, 0xf4, 0xe2, 0xb0, + 0xe1, 0xe4, 0xe1, 0x74, 0xe1, 0xbf, 0xbf, 0xe4, + 0xe4, 0x8d, 0xb4, 0xbf, 0xe4, 0xf4, 0xf4, 0xbc, + 0x57, 0x9a, 0x9a, 0x74, 0xd8, 0xb4, 0xb4, 0xe4, + 0xcd, 0xf4, 0xb4, 0xe4, 0xe4, 0xb4, 0xe1, 0x57, + 0xdb, 0x81, 0x36, 0x27, 0xef, 0xef, 0xd7, 0x11, + 0x1b, 0xa0, 0x8a, 0xb5, 0x4d, 0xa, 0x6d, 0x4d, + 0x4d, 0x6d, 0x58, 0x58, 0x82, 0x45, 0xa0, 0x30, + 0x41, 0xe3, 0xb5, 0x4d, 0x4d, 0x6d, 0x30, 0x5b, + 0x67, 0xa5, 0xd5, 0xd7, 0x47, 0x47, 0x6b, 0x47, + 0x36, 0x3, 0x4a, 0xe, 0xd2, 0xa5, 0xf1, 0x2f, + 0xd3, 0xe3, 0x78, 0x76, 0xd1, 0x23, 0x1c, 0xda, + 0xb5, 0x62, 0x62, 0x6d, 0x62, 0x76, 0xac, 0x58, + 0x65, 0xb3, 0x1b, 0x6b, 0xbd, 0xd8, 0xfd, 0x1e, + 0x1e, 0x3a, 0xd7, 0xd7, 0xef, 0xa5, 0x2f, 0xd2, + 0xd2, 0x8c, 0x24, 0x30, 0x87, 0xe3, 0xa, 0xb5, + 0xb5, 0xe3, 0xe3, 0x8c, 0x87, 0xb5, 0xb5, 0x5, + 0xf1, 0x8, 0x8c, 0xa4, 0x8, 0xf1, 0x2f, 0x6e, + 0xf0, 0xf0, 0x77, 0xd7, 0x6c, 0x6c, 0xd7, 0xd7, + 0xd7, 0xd7, 0x2f, 0x67, 0x82, 0xe3, 0xd1, 0xa, + 0xa, 0x29, 0x62, 0x1c, 0x58, 0x41, 0x62, 0x1c, + 0x6d, 0x41, 0x62, 0x62, 0xa, 0xd1, 0xd1, 0x23, + 0xa, 0xd1, 0x23, 0x23, 0xd1, 0xa, 0xa, 0x62, + 0x3b, 0x5, 0x93, 0x93, 0x93, 0x93, 0x9, 0xe2, + 0x12, 0x12, 0x12, 0x95, 0x12, 0xc0, 0x95, 0x12, + 0xf3, 0x12, 0x12, 0x57, 0xc0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0xa, 0xf4, 0xf4, + 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x87, 0x2f, 0xa5, 0xd5, 0x11, 0x8f, 0xd7, 0x4, + 0x9c, 0xde, 0x32, 0xb4, 0xe4, 0xe4, 0xb2, 0xb4, + 0xb4, 0xf6, 0xd8, 0xe4, 0xf3, 0x47, 0x6c, 0xe5, + 0xd7, 0xd7, 0x4a, 0x6e, 0xa5, 0x67, 0xb5, 0x24, + 0x24, 0xe3, 0x4d, 0x58, 0xa0, 0x67, 0x58, 0x45, + 0x30, 0x8, 0xb5, 0x58, 0xa4, 0x67, 0x2f, 0x77, + 0xe5, 0xe5, 0x83, 0x83, 0x9c, 0x6f, 0x4, 0x47, + 0xd7, 0x4a, 0xe, 0xe, 0xa5, 0x67, 0xd3, 0x1c, + 0xf1, 0xf1, 0xb3, 0x30, 0xa0, 0x42, 0xf1, 0x2f, + 0x8a, 0x8c, 0xab, 0x65, 0x67, 0x67, 0x8c, 0x8c, + 0x96, 0xd2, 0xa5, 0x96, 0x5b, 0x1b, 0xd5, 0xd5, + 0xd7, 0xd7, 0x27, 0x3, 0x4, 0x93, 0xe4, 0xc6, + 0xf5, 0xc0, 0xbf, 0xdd, 0x9c, 0xdf, 0xc6, 0xdd, + 0xde, 0x12, 0x81, 0x9f, 0x32, 0xf3, 0xe4, 0xf3, + 0xca, 0xb4, 0xb4, 0xf3, 0xc0, 0xf8, 0xf9, 0x9d, + 0x9d, 0xe4, 0xc6, 0x8b, 0x9c, 0xb4, 0xbf, 0xdd, + 0x93, 0xdf, 0xb4, 0xde, 0xfd, 0xe1, 0xf9, 0x8b, + 0x40, 0xe4, 0xb4, 0x9c, 0xca, 0xb4, 0xf3, 0x32, + 0x93, 0xc6, 0x81, 0xfd, 0xcf, 0xe1, 0x2e, 0x27, + 0x9b, 0xfd, 0xd7, 0xd7, 0xc2, 0x1b, 0x63, 0xf1, + 0x2f, 0x87, 0xb5, 0x62, 0x62, 0x76, 0xb5, 0x6d, + 0x29, 0x1c, 0x58, 0x58, 0x8a, 0x87, 0xa4, 0xb3, + 0xd3, 0xe3, 0x6d, 0xb5, 0x6d, 0x8a, 0xa4, 0xa0, + 0x68, 0xa0, 0x19, 0xd7, 0x4a, 0xd5, 0x1b, 0x4a, + 0xe, 0x5d, 0xe, 0x1b, 0xa6, 0x67, 0x79, 0x67, + 0x6d, 0xa, 0x1c, 0xa, 0xd1, 0xa, 0xa, 0xe3, + 0xbe, 0xb5, 0xd3, 0x24, 0x4d, 0x62, 0x4d, 0xe3, + 0x1c, 0xda, 0x30, 0xd5, 0x47, 0x9d, 0x8f, 0xe5, + 0x19, 0x77, 0xd5, 0xd7, 0x63, 0x73, 0x30, 0x79, + 0x67, 0xb5, 0x62, 0x1c, 0xb5, 0x41, 0x41, 0xda, + 0xe3, 0x8a, 0x41, 0x8, 0x30, 0xb5, 0x41, 0x8c, + 0x58, 0xb5, 0x6d, 0xb5, 0x58, 0x24, 0x8c, 0x8, + 0x5b, 0x5b, 0x1b, 0xd7, 0x4a, 0xd7, 0x4a, 0x89, + 0x79, 0x2f, 0x58, 0xb5, 0x6d, 0x78, 0x62, 0x62, + 0x6d, 0x8a, 0x29, 0x8a, 0x41, 0x58, 0x62, 0x62, + 0x1c, 0x62, 0x62, 0x62, 0x62, 0xa, 0xa, 0xd1, + 0x41, 0xd1, 0xd1, 0x23, 0xd1, 0x23, 0x23, 0xd1, + 0x62, 0x3b, 0x45, 0x69, 0x93, 0x93, 0x12, 0xe2, + 0xf3, 0xf3, 0xc0, 0xf3, 0x12, 0xc0, 0xf3, 0x95, + 0xc0, 0xbf, 0xbb, 0xf3, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x62, 0xe2, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0xe2, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x41, 0x1c, 0x67, 0x1b, 0x63, 0xd5, 0x6e, 0xef, + 0xe5, 0x6c, 0x4, 0xdd, 0xdf, 0x9d, 0x36, 0xde, + 0xde, 0x6f, 0x9c, 0x32, 0x4, 0xd7, 0xd5, 0x6e, + 0xc2, 0xd2, 0x2f, 0x2f, 0x58, 0xb5, 0x62, 0x8a, + 0x41, 0xa, 0x29, 0x58, 0xf1, 0x2f, 0xd3, 0x87, + 0x58, 0x87, 0xd3, 0x24, 0x5, 0x45, 0x30, 0x1b, + 0x4a, 0xd7, 0xef, 0xd9, 0xd7, 0xd7, 0xd7, 0xc5, + 0x1b, 0x5b, 0x2f, 0x2f, 0x89, 0xa4, 0x8a, 0x5, + 0xf1, 0x79, 0x24, 0x58, 0x30, 0x8, 0x8c, 0x41, + 0xd3, 0x58, 0xc3, 0x8, 0x1b, 0xd2, 0x8, 0x87, + 0x42, 0xe, 0x2f, 0x8c, 0xa6, 0x8, 0x2f, 0xa5, + 0xd5, 0x4a, 0x4a, 0xd7, 0x4, 0x4, 0xc0, 0x9c, + 0x4, 0x93, 0xe4, 0x9d, 0x3, 0x9c, 0x81, 0x1e, + 0xff, 0xf3, 0xc6, 0x93, 0x4, 0xf3, 0xf3, 0x93, + 0x6f, 0x12, 0xdd, 0xd8, 0xfd, 0x12, 0x9c, 0x9c, + 0x4, 0xf3, 0xb4, 0x93, 0x97, 0x12, 0xbf, 0xfd, + 0x1e, 0xdd, 0xde, 0x1e, 0x3a, 0xc6, 0xc6, 0x32, + 0xc0, 0xf4, 0xb4, 0x93, 0x32, 0xe4, 0xdd, 0xfd, + 0xfd, 0xd8, 0xf3, 0x8e, 0x1e, 0xb0, 0x93, 0x4, + 0x26, 0x47, 0xd7, 0x4a, 0x42, 0x8c, 0x67, 0xd3, + 0x5e, 0xe3, 0x82, 0x4d, 0x62, 0xda, 0xa0, 0x45, + 0x3b, 0x8a, 0x5, 0x58, 0xa, 0x29, 0xb5, 0x4d, + 0x4d, 0xe3, 0xda, 0xb5, 0x1c, 0xe3, 0xa0, 0xa0, + 0xa0, 0x30, 0xf1, 0x6e, 0x5d, 0x79, 0x63, 0x19, + 0x79, 0xa5, 0xd2, 0x1b, 0x73, 0xa4, 0x87, 0xda, + 0xa, 0xd1, 0xa, 0xd1, 0xd1, 0xd1, 0xa, 0xa, + 0x37, 0x82, 0x87, 0xa4, 0x87, 0x1c, 0x1c, 0x6d, + 0x62, 0x16, 0x58, 0xc5, 0x8b, 0x8b, 0x27, 0xe5, + 0x6c, 0xd7, 0x4a, 0xd5, 0xd2, 0x8, 0x58, 0x8c, + 0x41, 0x29, 0x62, 0x1c, 0x1c, 0xa, 0xe3, 0x67, + 0xa0, 0x58, 0x30, 0x30, 0xa0, 0x8a, 0xe3, 0x82, + 0xb5, 0x29, 0x5e, 0xb5, 0xe3, 0x29, 0x29, 0x87, + 0xa0, 0x73, 0x89, 0x6e, 0x4a, 0x4a, 0x2f, 0x8c, + 0x58, 0x41, 0xe3, 0x76, 0x62, 0x62, 0xd1, 0x6d, + 0x8a, 0x41, 0x41, 0x62, 0x41, 0xb5, 0xa, 0x62, + 0xa, 0x62, 0x23, 0x62, 0x62, 0x62, 0xd1, 0x62, + 0x62, 0xa, 0xd1, 0xd1, 0x23, 0xd1, 0x23, 0x23, + 0xd1, 0x3b, 0xd1, 0x8a, 0x12, 0xf3, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0x44, 0xbf, 0xc0, 0x44, 0xbf, + 0xc0, 0xbf, 0xc0, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0xd1, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0xe2, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x73, 0x5, 0x30, 0x2, 0xd2, 0x2f, 0x79, 0x19, + 0xe5, 0xe5, 0x3, 0xce, 0xe4, 0x12, 0x32, 0xe4, + 0xc0, 0x97, 0x6c, 0x6f, 0xe5, 0x4a, 0xa5, 0x42, + 0x89, 0x2f, 0x2f, 0x2f, 0x30, 0xda, 0x41, 0x30, + 0x30, 0x8a, 0x1c, 0x24, 0x58, 0x29, 0x4d, 0x1c, + 0x29, 0x6, 0xb5, 0x30, 0x73, 0x73, 0x30, 0x96, + 0x6e, 0x8f, 0x27, 0x43, 0x6b, 0xd7, 0xc5, 0x77, + 0xc2, 0x42, 0x5b, 0xa0, 0x73, 0xa0, 0x5, 0x8a, + 0x30, 0x58, 0x6, 0xd3, 0x8c, 0x24, 0xd3, 0x8c, + 0x1, 0x5a, 0x73, 0x96, 0x1b, 0x6e, 0xe9, 0xa6, + 0x67, 0x2f, 0x8c, 0x6d, 0x8c, 0x8c, 0x65, 0x2f, + 0xe, 0xd7, 0x9c, 0x9c, 0x4, 0xf5, 0xe4, 0xe1, + 0xfd, 0xe4, 0xe1, 0x75, 0x81, 0xe4, 0xb4, 0xb4, + 0xe4, 0xdd, 0xbb, 0xe4, 0xde, 0xdd, 0xf4, 0x7, + 0x57, 0xe4, 0xbf, 0x81, 0xbf, 0xf4, 0xbf, 0xaf, + 0x81, 0xbf, 0xbf, 0xbf, 0xe1, 0x9a, 0xbf, 0xe1, + 0x9f, 0xb4, 0xb4, 0xe1, 0xe4, 0xe2, 0xbf, 0xf4, + 0xe2, 0xf4, 0xf4, 0xb4, 0x57, 0x7, 0xb4, 0xe4, + 0xe1, 0xe1, 0xb4, 0xe4, 0xe1, 0x9a, 0xb4, 0x2e, + 0xd8, 0x40, 0xd5, 0x79, 0xe7, 0x94, 0x24, 0x29, + 0xa, 0xa, 0x4d, 0xa, 0xa, 0xe3, 0xa4, 0x67, + 0x58, 0xbe, 0x24, 0x82, 0x4d, 0xd3, 0x24, 0x6d, + 0x1c, 0xb5, 0xa0, 0x41, 0xa, 0x6d, 0x6d, 0xb5, + 0x82, 0xd3, 0x68, 0x73, 0x1b, 0x77, 0x4a, 0x6e, + 0x42, 0x8, 0x8, 0x2f, 0xb5, 0xac, 0x4d, 0x29, + 0xd1, 0x62, 0x62, 0x29, 0x16, 0x29, 0x62, 0x8a, + 0x1c, 0x29, 0x58, 0x87, 0xd3, 0xa, 0x78, 0x76, + 0x62, 0xb5, 0x2f, 0xfb, 0x7d, 0x7d, 0x54, 0x47, + 0xd7, 0x77, 0x2f, 0x2f, 0x2f, 0xab, 0xb5, 0xe3, + 0x1c, 0xe3, 0x41, 0x8, 0xa0, 0x3b, 0x30, 0x2f, + 0x1, 0x4d, 0x6d, 0x82, 0xe3, 0xd3, 0xd3, 0xd3, + 0x87, 0xda, 0x58, 0x5, 0x58, 0x1c, 0xa, 0x1c, + 0xe3, 0x8c, 0x58, 0xda, 0x58, 0x67, 0xd3, 0x8c, + 0x87, 0x1c, 0x29, 0x62, 0x29, 0x62, 0xa, 0x62, + 0x29, 0x62, 0xd1, 0x76, 0x78, 0x76, 0xe3, 0x41, + 0x41, 0x8a, 0x1c, 0x62, 0x1c, 0x62, 0x23, 0xd1, + 0x62, 0xd1, 0xd1, 0xd1, 0x23, 0xd1, 0xd1, 0xd1, + 0xa, 0x3b, 0x3b, 0x3b, 0x93, 0xf3, 0xe2, 0x44, + 0x9a, 0xe2, 0xe2, 0xe2, 0xc0, 0xbf, 0xc0, 0xf3, + 0xc0, 0xbf, 0x29, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x10, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0xe2, + 0xe2, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x0, 0x44, 0x44, 0x10, 0x10, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa5, 0x8, 0x58, 0x30, 0xa6, 0x8, 0x2f, 0xef, + 0x6b, 0x6b, 0x9c, 0x2e, 0xbf, 0xe4, 0xe4, 0xf9, + 0x81, 0xde, 0xd8, 0x9d, 0x7d, 0xe, 0x2f, 0x79, + 0x2f, 0x41, 0x58, 0x8, 0x2f, 0x8c, 0x24, 0x87, + 0xb3, 0x24, 0xab, 0x52, 0x55, 0xda, 0x58, 0x58, + 0x58, 0x6d, 0x1c, 0x87, 0x8, 0x8c, 0x8c, 0xc3, + 0xc9, 0xd9, 0x2a, 0xeb, 0x27, 0xef, 0x7d, 0x27, + 0x8f, 0x2f, 0x8c, 0xa7, 0x87, 0x58, 0x8c, 0x1, + 0x82, 0x68, 0x30, 0x67, 0xf1, 0x8, 0x87, 0xab, + 0x2c, 0x5a, 0x67, 0x59, 0xa6, 0x60, 0x2c, 0x1d, + 0xa6, 0xc3, 0xad, 0x2f, 0x5a, 0x8, 0x67, 0xa4, + 0x96, 0xd2, 0xa9, 0x9f, 0x4f, 0xdf, 0xc6, 0xe1, + 0xc6, 0xe4, 0xdf, 0xc6, 0xe4, 0xe4, 0xe4, 0x4b, + 0x90, 0xb4, 0xb4, 0x7, 0x74, 0x90, 0xb2, 0xe4, + 0x81, 0xbf, 0x95, 0xdf, 0xb4, 0xb4, 0xb4, 0xbf, + 0x90, 0x90, 0xb4, 0xb0, 0x57, 0x4b, 0x4b, 0xb4, + 0xc0, 0xbf, 0xbf, 0xdf, 0xdf, 0x8d, 0xf4, 0xbf, + 0x7, 0x57, 0xbf, 0xe1, 0xe1, 0x9a, 0xbf, 0x81, + 0xe4, 0xbf, 0xe4, 0x81, 0x83, 0x18, 0xd8, 0x47, + 0x98, 0x4e, 0xc9, 0x2f, 0x2f, 0x8c, 0x58, 0x3b, + 0x29, 0x6d, 0x41, 0x1c, 0x62, 0x4d, 0x1c, 0x78, + 0x5e, 0x4d, 0x24, 0xb5, 0x8c, 0x67, 0x8, 0x45, + 0x45, 0x8a, 0x58, 0x41, 0xa, 0x62, 0x62, 0x62, + 0x4d, 0x4d, 0xb3, 0x45, 0xa0, 0x6e, 0xd2, 0xd2, + 0x73, 0x87, 0x1c, 0x6d, 0x62, 0xd1, 0xd1, 0xd1, + 0xa, 0x76, 0x62, 0xda, 0x3b, 0x8a, 0x41, 0x58, + 0xb5, 0x29, 0x4d, 0x62, 0x29, 0xa, 0xa, 0xa, + 0x78, 0x41, 0x8, 0xd5, 0xef, 0x19, 0x4a, 0x77, + 0xa5, 0x2f, 0x8c, 0x82, 0xac, 0xe3, 0xac, 0x78, + 0x6d, 0xda, 0x8, 0x79, 0x8, 0x30, 0x87, 0x8c, + 0x8c, 0xb5, 0x62, 0xe3, 0x6d, 0x29, 0x6d, 0xda, + 0xe3, 0x3b, 0x58, 0x41, 0x67, 0x8a, 0x62, 0x29, + 0x6d, 0xa, 0x16, 0x41, 0xe3, 0xb5, 0xe3, 0xb5, + 0x82, 0x1c, 0x6d, 0xa, 0xe3, 0x62, 0x78, 0x78, + 0xa, 0x76, 0xa, 0x62, 0x62, 0x62, 0x62, 0x41, + 0x41, 0x8a, 0x1c, 0xd1, 0x62, 0xd1, 0xd1, 0xd1, + 0xd1, 0x23, 0x23, 0xd1, 0x23, 0x23, 0x23, 0x23, + 0x23, 0xd1, 0xa, 0xd1, 0xd1, 0x93, 0x12, 0xe2, + 0xf3, 0x12, 0x12, 0x10, 0x10, 0x10, 0xc0, 0x95, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, + 0x10, 0x10, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x0, 0x0, 0x10, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, + 0xd3, 0xd3, 0xd3, 0x87, 0xa4, 0x73, 0x42, 0xd5, + 0xc2, 0xc2, 0xe5, 0xf5, 0xe4, 0xdd, 0x90, 0x90, + 0xfd, 0x97, 0xef, 0xd5, 0x1b, 0x96, 0xd2, 0xe9, + 0x73, 0x58, 0x45, 0xb3, 0x8c, 0x6d, 0x4d, 0xa7, + 0x1c, 0x8c, 0x1, 0xc3, 0xa6, 0xa0, 0xa0, 0xf1, + 0x67, 0x58, 0x1c, 0x6d, 0xe3, 0x6d, 0xe3, 0x8c, + 0x30, 0xc5, 0xef, 0xef, 0x6b, 0xc2, 0xc2, 0xd4, + 0x7a, 0xab, 0x82, 0x6d, 0xac, 0xbe, 0xbe, 0x8c, + 0x87, 0x68, 0x5b, 0xa5, 0xe, 0x42, 0x68, 0x58, + 0x8c, 0x8c, 0x8c, 0x8c, 0xb3, 0x8c, 0xa8, 0xae, + 0xe9, 0x5b, 0x73, 0x42, 0xa5, 0x79, 0x2f, 0xad, + 0x2f, 0x2f, 0x60, 0x4f, 0x6e, 0x7d, 0xf3, 0xdd, + 0x97, 0x97, 0xf5, 0x9c, 0x4, 0xbd, 0xdd, 0xdd, + 0x27, 0xfd, 0xe4, 0xdd, 0xfd, 0x9c, 0xc0, 0xce, + 0x32, 0xc0, 0xc6, 0x93, 0x97, 0xe4, 0xf3, 0xde, + 0x27, 0x9d, 0xc6, 0x93, 0x32, 0xf3, 0xf3, 0x93, + 0x93, 0xc0, 0xbf, 0x93, 0x93, 0xf8, 0xc6, 0xdd, + 0x1e, 0xc6, 0xb4, 0x93, 0x93, 0xe4, 0xe4, 0x93, + 0x93, 0xe1, 0xde, 0x47, 0x3, 0x98, 0xa9, 0xd7, + 0xd5, 0xd2, 0x42, 0x67, 0xd3, 0xd3, 0x24, 0x6d, + 0xda, 0x5e, 0xd3, 0x82, 0x4d, 0x29, 0x4d, 0x6d, + 0x1c, 0xe3, 0x6d, 0x6d, 0x3b, 0x87, 0x87, 0x58, + 0xda, 0x62, 0xe3, 0x82, 0x29, 0x6d, 0xa, 0x62, + 0xa, 0x16, 0x62, 0x6d, 0x41, 0x67, 0x2f, 0x2f, + 0x8c, 0xb5, 0xac, 0x76, 0x29, 0x1c, 0xa, 0xa, + 0xa, 0xa, 0x76, 0xa, 0x76, 0x29, 0xb5, 0xbe, + 0x6d, 0xe3, 0xb5, 0x16, 0x1c, 0x16, 0x16, 0xd1, + 0x29, 0x1c, 0x58, 0x79, 0x4a, 0x63, 0x5d, 0x2f, + 0x2f, 0xb3, 0x24, 0xb5, 0x1c, 0x6d, 0xda, 0x62, + 0x29, 0x1c, 0x58, 0x8c, 0x8c, 0x8c, 0xd3, 0x1c, + 0x87, 0x58, 0x30, 0x5, 0x5, 0x1c, 0x3b, 0xda, + 0x6d, 0x62, 0x6d, 0x4d, 0x5e, 0x1c, 0xb5, 0xe3, + 0xe3, 0x3b, 0x3b, 0xda, 0x6d, 0x62, 0x62, 0x78, + 0xa, 0x62, 0x62, 0x76, 0x78, 0xb5, 0xb5, 0xe3, + 0x29, 0x1c, 0x16, 0x1c, 0x62, 0xa, 0x76, 0x62, + 0x62, 0x62, 0x62, 0xa, 0x62, 0xa, 0xa, 0x62, + 0xa, 0xa, 0xa, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x0, 0x23, 0xd1, 0x3b, 0x3b, 0x12, 0x44, + 0xf3, 0xf3, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, + 0x10, 0x10, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, + 0x6d, 0xda, 0x24, 0xe3, 0x58, 0x67, 0x2f, 0xd2, + 0x6e, 0x19, 0x6e, 0x3, 0xfd, 0x4, 0xef, 0xef, + 0xd7, 0xd7, 0xd7, 0xd5, 0x5a, 0xa6, 0x2f, 0x67, + 0xb3, 0x58, 0x82, 0xb5, 0x58, 0x58, 0x87, 0x87, + 0x8c, 0x8c, 0x67, 0x79, 0x89, 0x8, 0x8, 0x8c, + 0x41, 0x58, 0x58, 0xe3, 0xb5, 0xda, 0xda, 0xa0, + 0x8, 0xa5, 0x63, 0xd5, 0x19, 0xd2, 0xa5, 0x67, + 0x8c, 0x8c, 0x24, 0x8c, 0x24, 0xda, 0xa4, 0xa0, + 0x68, 0x8c, 0xb3, 0x2f, 0x2f, 0x2f, 0x8c, 0x8c, + 0x8c, 0x8, 0x73, 0x96, 0xe7, 0x73, 0xa6, 0x1b, + 0xe, 0x2f, 0xa6, 0x5b, 0xa8, 0x2f, 0x79, 0x2f, + 0x65, 0xa6, 0x96, 0x6e, 0xd7, 0x9c, 0xf3, 0x6f, + 0x47, 0x4, 0x93, 0x4, 0x9b, 0x6b, 0xce, 0xf5, + 0x6f, 0xdd, 0xe4, 0x86, 0x4, 0x93, 0xf3, 0x32, + 0x6f, 0x32, 0xe4, 0x93, 0x47, 0x9d, 0xc6, 0x32, + 0x4, 0xdd, 0xf3, 0x97, 0x4, 0xf3, 0xe4, 0x93, + 0x8e, 0x81, 0xb4, 0x93, 0x32, 0x2e, 0xe4, 0x32, + 0xf3, 0x12, 0xe4, 0x97, 0x8e, 0x81, 0xb4, 0x97, + 0xd8, 0xbc, 0x9d, 0x4, 0x6c, 0x6b, 0xef, 0xd5, + 0x11, 0xe, 0xd2, 0x58, 0xb5, 0x76, 0xa, 0x62, + 0x4d, 0x78, 0x4d, 0xe3, 0x67, 0xf1, 0x68, 0xa0, + 0x45, 0x5, 0x41, 0x1c, 0x1c, 0x6d, 0xa, 0x4d, + 0xe3, 0xe3, 0x78, 0x6d, 0x8a, 0x58, 0xb5, 0xd1, + 0x16, 0x29, 0xa, 0x62, 0x6d, 0xb5, 0xb5, 0xa, + 0xe3, 0xac, 0x37, 0x62, 0x6d, 0x8c, 0x24, 0x6d, + 0x3b, 0x1c, 0xa, 0x29, 0x62, 0x29, 0x4d, 0x78, + 0xe3, 0x58, 0x58, 0x58, 0x45, 0x5, 0x41, 0x6d, + 0x62, 0x62, 0x41, 0x67, 0xe9, 0xd2, 0x2f, 0x8c, + 0x87, 0xb3, 0x2f, 0xab, 0x87, 0x5, 0x41, 0xd3, + 0xe3, 0xe3, 0xb5, 0x5e, 0x6d, 0x24, 0x58, 0x8c, + 0x87, 0xa4, 0xf1, 0xd2, 0x8, 0x5, 0x8a, 0x62, + 0x6d, 0xe3, 0x6d, 0x6d, 0x62, 0x62, 0xd3, 0x82, + 0x4d, 0xb5, 0x58, 0xb5, 0x78, 0x62, 0x78, 0x78, + 0x62, 0x78, 0x62, 0x78, 0x78, 0x78, 0xe3, 0x41, + 0x29, 0x1c, 0x1c, 0x62, 0x62, 0xa, 0x62, 0xd1, + 0x62, 0xa, 0x62, 0xa, 0xd1, 0x23, 0xa, 0x41, + 0x62, 0xa, 0xa, 0x23, 0x23, 0x0, 0x23, 0x0, + 0x23, 0x0, 0x23, 0x3b, 0x3b, 0x3b, 0x16, 0xe2, + 0x44, 0x44, 0x10, 0x10, 0x10, 0x0, 0x16, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, + 0x10, 0x10, 0x44, 0x44, 0xe2, 0xe2, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, + 0xa0, 0xa0, 0xa0, 0x8c, 0xe3, 0xe3, 0x6d, 0x8c, + 0x2f, 0xa5, 0x4a, 0xd5, 0x6b, 0x6c, 0x4, 0x4, + 0xd7, 0x6e, 0xf0, 0x2f, 0x8c, 0x1c, 0xa, 0x29, + 0x6d, 0x41, 0x67, 0x8c, 0x68, 0xa0, 0xf0, 0xe9, + 0x42, 0x30, 0xa4, 0xb3, 0xd3, 0x8c, 0x24, 0x1c, + 0x24, 0x58, 0xf1, 0x79, 0xa0, 0xa0, 0xa0, 0x1b, + 0xa5, 0x1b, 0x89, 0x2f, 0x49, 0x2f, 0xa8, 0xa8, + 0xa7, 0x52, 0xe8, 0x7a, 0x60, 0xc9, 0xad, 0xa6, + 0x67, 0x8c, 0x8c, 0x87, 0x8c, 0xd3, 0x8c, 0xa8, + 0x1, 0xa6, 0x96, 0x4a, 0xef, 0xe, 0x5b, 0xf0, + 0x8, 0x67, 0x2f, 0x8, 0xb3, 0x1, 0x2f, 0xe9, + 0xa8, 0x8, 0xd4, 0xca, 0x9c, 0xe4, 0xc6, 0x39, + 0x27, 0x9d, 0xe1, 0xde, 0x6b, 0x99, 0xbd, 0xf3, + 0xf3, 0x81, 0xdf, 0xdf, 0xfd, 0x57, 0x9a, 0xc6, + 0x8b, 0x9f, 0x95, 0xbf, 0xc0, 0xdf, 0xdf, 0xe4, + 0xf3, 0xb4, 0xf4, 0xdf, 0xdf, 0x70, 0xf4, 0xe4, + 0x81, 0x40, 0x95, 0xbf, 0xbf, 0x95, 0x4b, 0x81, + 0xb4, 0xb4, 0xf4, 0x81, 0x90, 0xbc, 0x9a, 0xcc, + 0xe1, 0xd8, 0x1e, 0xfd, 0x9b, 0xd8, 0x35, 0x96, + 0x8, 0x2c, 0xab, 0xd3, 0x1a, 0x4d, 0x76, 0x6d, + 0x1c, 0x29, 0x29, 0xb5, 0x68, 0x1, 0x8c, 0x41, + 0x3b, 0x82, 0xab, 0xd3, 0x87, 0x82, 0x6d, 0x8a, + 0x30, 0x5, 0x29, 0x62, 0x6d, 0xd3, 0x78, 0xa, + 0x29, 0xa, 0x29, 0x29, 0x58, 0x1c, 0x6d, 0xd1, + 0xd1, 0xd1, 0x23, 0xa, 0x29, 0x6d, 0xac, 0x94, + 0x82, 0x29, 0xda, 0x6d, 0x5, 0xa4, 0x58, 0x62, + 0x1c, 0x8c, 0xd3, 0x62, 0xb5, 0x58, 0x24, 0xd3, + 0x55, 0x87, 0xb3, 0xa0, 0xe, 0xd2, 0x8, 0xb5, + 0xac, 0x82, 0xd3, 0x66, 0x24, 0x82, 0x82, 0xbe, + 0x1, 0xa4, 0x68, 0x5, 0xda, 0x30, 0xf1, 0xe3, + 0x29, 0x58, 0x8c, 0xab, 0xd3, 0x24, 0x58, 0x82, + 0x24, 0x5, 0x45, 0xda, 0x6d, 0xda, 0x6d, 0x78, + 0x78, 0x29, 0x78, 0x78, 0x78, 0x76, 0x4d, 0x55, + 0xbe, 0x8a, 0x8a, 0x82, 0x78, 0x78, 0xa, 0x62, + 0xd1, 0xd1, 0xd1, 0xd1, 0xa, 0x62, 0x1c, 0x29, + 0x62, 0x16, 0x1c, 0x1c, 0xd1, 0x23, 0xd1, 0xd1, + 0x23, 0x23, 0x23, 0x23, 0x34, 0x23, 0x23, 0xd1, + 0x23, 0x23, 0xd1, 0x3b, 0x16, 0x16, 0xf3, 0x44, + 0xe2, 0xe2, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x10, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x68, 0x30, 0x68, 0x1, 0x24, 0xe3, 0x8a, 0xe3, + 0x41, 0x42, 0xd5, 0xe5, 0x6b, 0xe5, 0x4, 0x15, + 0x27, 0xe7, 0x67, 0xab, 0xbe, 0x8a, 0x1c, 0x6d, + 0x29, 0x58, 0x8c, 0xab, 0x82, 0x68, 0xf0, 0x5d, + 0x2c, 0x2f, 0x67, 0x1, 0x87, 0x8, 0x42, 0x5b, + 0x58, 0x58, 0x42, 0xa5, 0x1, 0x68, 0x30, 0x67, + 0x1, 0x2f, 0x96, 0x59, 0x59, 0xc9, 0x7c, 0x88, + 0x4e, 0xa6, 0x7e, 0x51, 0x1d, 0xa8, 0xb8, 0x64, + 0x52, 0x68, 0xad, 0x59, 0xa6, 0xb3, 0xc9, 0xc5, + 0xc5, 0xb3, 0x89, 0xc5, 0x2c, 0x2f, 0xc9, 0xc9, + 0x5a, 0x2f, 0xc2, 0x1b, 0x96, 0xa6, 0x5b, 0xc5, + 0x67, 0xb3, 0xd4, 0x8b, 0xc6, 0xbc, 0xe1, 0xc6, + 0x1e, 0xd8, 0xc6, 0x2e, 0xbd, 0x12, 0xe4, 0xbf, + 0xe4, 0xe1, 0xe1, 0xdf, 0x81, 0x53, 0x75, 0xb4, + 0x81, 0xdd, 0xbf, 0xbf, 0xbf, 0xbf, 0xe4, 0xc0, + 0xb4, 0x84, 0x7, 0xe4, 0xc0, 0x9a, 0x95, 0xe4, + 0xc0, 0xbf, 0xbf, 0xe4, 0xc0, 0xb4, 0xe4, 0xf3, + 0xdd, 0x75, 0x57, 0xde, 0xdd, 0xe4, 0x81, 0xbd, + 0xb1, 0x97, 0x47, 0xe5, 0xd7, 0x5d, 0x2c, 0x8c, + 0x8c, 0xe3, 0xe3, 0x37, 0x82, 0x55, 0x82, 0x45, + 0x5b, 0xc3, 0xe3, 0xe3, 0x58, 0xe3, 0x5e, 0x6d, + 0x41, 0xe3, 0xb5, 0x82, 0xa0, 0x89, 0x45, 0x45, + 0xa0, 0x5, 0xb5, 0x6d, 0x62, 0x78, 0xa, 0x62, + 0xa, 0x62, 0xa, 0x29, 0xda, 0x87, 0x29, 0xd1, + 0x23, 0xa, 0x23, 0xd1, 0xd1, 0xa, 0x76, 0x4d, + 0x82, 0x58, 0x3b, 0xda, 0xa4, 0x45, 0x87, 0xe3, + 0xb5, 0xb5, 0x4d, 0x78, 0x29, 0xb5, 0x82, 0xa, + 0xb5, 0x8, 0x42, 0x8, 0xa0, 0xa6, 0xb3, 0xe3, + 0x4d, 0x82, 0xe3, 0x82, 0x82, 0xb3, 0xb3, 0x4d, + 0x24, 0x30, 0x2, 0xf1, 0x58, 0xa4, 0x5, 0xe3, + 0xe3, 0x1c, 0x8a, 0xb5, 0xb5, 0x5, 0x30, 0x41, + 0xe3, 0x58, 0x5, 0x8c, 0x82, 0xb5, 0x6d, 0x62, + 0x62, 0x29, 0x29, 0x62, 0x62, 0x62, 0xbe, 0x66, + 0x82, 0x82, 0x87, 0x94, 0xac, 0x76, 0x62, 0xd1, + 0xd1, 0xa, 0x62, 0x62, 0xd1, 0xd1, 0x62, 0x62, + 0xa, 0x62, 0x62, 0xd1, 0xd1, 0xd1, 0x23, 0x23, + 0x23, 0x23, 0xa, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x0, 0xd1, 0xd1, 0x23, 0xf3, 0x12, + 0x44, 0xc0, 0xbf, 0x10, 0x0, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0xe2, + 0x44, 0xe2, 0x44, 0xe2, 0x0, 0x10, 0x10, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x82, 0x58, 0x24, 0x55, 0x8c, 0x58, 0x8, 0x5, + 0x5, 0x89, 0x63, 0x4a, 0xd7, 0xd7, 0x6e, 0x5d, + 0x2c, 0x2f, 0xb3, 0xab, 0x82, 0x68, 0xa4, 0x5, + 0x5, 0x68, 0x87, 0xb5, 0x29, 0x68, 0x8, 0x1, + 0xab, 0x67, 0x79, 0x2f, 0xb3, 0xec, 0x1b, 0xd2, + 0x8, 0xa0, 0xa0, 0x58, 0xb5, 0xe3, 0xe3, 0xe3, + 0xd3, 0x68, 0x5b, 0x4f, 0xd4, 0xd4, 0x4f, 0x90, + 0x77, 0xa5, 0x77, 0x48, 0x49, 0x52, 0xa8, 0x1f, + 0x52, 0xc3, 0xc9, 0xd2, 0xd2, 0x2f, 0x60, 0x96, + 0x2f, 0x2f, 0x2f, 0x73, 0x8c, 0x8c, 0x79, 0xd2, + 0x89, 0x73, 0x1b, 0x6e, 0x6e, 0x42, 0x73, 0x5b, + 0x65, 0x1, 0x4e, 0x6b, 0x8b, 0x8b, 0xb4, 0xc0, + 0x97, 0x93, 0xdf, 0xf5, 0x32, 0x97, 0xe4, 0xdf, + 0x6b, 0x40, 0x75, 0xde, 0xfd, 0x39, 0xf9, 0xdd, + 0x93, 0xdd, 0xbf, 0xdf, 0x97, 0xdd, 0xe1, 0xde, + 0xfd, 0x40, 0xc6, 0x32, 0x93, 0xce, 0xdf, 0x93, + 0x93, 0xc0, 0xbf, 0x93, 0x32, 0xde, 0x57, 0x4, + 0x8e, 0x90, 0x90, 0xfd, 0x97, 0xe4, 0xbd, 0x4, + 0x4, 0x6c, 0xd7, 0xd5, 0xd2, 0x2f, 0xd3, 0x41, + 0x24, 0xd3, 0x62, 0xb5, 0x24, 0xab, 0x65, 0x68, + 0xc3, 0xb3, 0xab, 0xbe, 0xb5, 0x4d, 0x62, 0xe3, + 0x30, 0x58, 0xb5, 0xda, 0xa0, 0x42, 0x2f, 0x58, + 0x5, 0x5, 0xe3, 0xe3, 0x4d, 0x16, 0xa, 0xa, + 0x29, 0x29, 0xd1, 0x62, 0x29, 0x1c, 0xa, 0x78, + 0xa, 0xd1, 0xa, 0x62, 0x29, 0x29, 0xa, 0x29, + 0x6d, 0x41, 0xe3, 0x29, 0x3b, 0x68, 0x8c, 0xd3, + 0x5e, 0xb5, 0xda, 0xb5, 0x41, 0x30, 0x6d, 0x1c, + 0xda, 0x8, 0x2f, 0x8c, 0x87, 0x87, 0x1c, 0xd3, + 0xab, 0xc3, 0x68, 0x68, 0x67, 0xd2, 0x2f, 0xd3, + 0x29, 0x58, 0x8, 0x67, 0xb5, 0x82, 0xb5, 0xe3, + 0xd3, 0x24, 0x5, 0x3b, 0x8a, 0x8, 0x8, 0x1c, + 0x62, 0x3b, 0x6d, 0xb5, 0xe3, 0x4d, 0x4d, 0xa, + 0x62, 0xd3, 0x3b, 0x29, 0xa, 0xb5, 0x24, 0x82, + 0xbe, 0x4d, 0xab, 0x66, 0x66, 0xac, 0x4d, 0x4d, + 0x62, 0xa, 0x8a, 0x29, 0xd1, 0x62, 0x62, 0xa, + 0x23, 0xd1, 0xd1, 0x62, 0xa, 0x62, 0xa, 0xd1, + 0xd1, 0xd1, 0xa, 0xd1, 0x23, 0x0, 0x23, 0x23, + 0x0, 0x23, 0x23, 0x23, 0x16, 0x1c, 0xc0, 0x95, + 0xc0, 0xf3, 0x44, 0x10, 0x0, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0xe2, + 0xe2, 0xe2, 0xe2, 0x0, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x6d, 0x8, 0x8c, 0x29, 0x58, 0x42, 0x2, 0x2f, + 0x67, 0x30, 0x5b, 0xa5, 0x5d, 0xe, 0xd2, 0x8, + 0x67, 0x73, 0x2f, 0x82, 0x24, 0x68, 0x8, 0x2f, + 0x8c, 0x58, 0xda, 0xb5, 0x41, 0x67, 0xa0, 0xa4, + 0x58, 0x79, 0xd2, 0xf1, 0xa6, 0xa0, 0x73, 0x79, + 0x2f, 0x41, 0x58, 0xda, 0x8a, 0x41, 0x5, 0x4d, + 0x29, 0x58, 0x42, 0x3e, 0x4e, 0x59, 0xd4, 0x27, + 0x3e, 0x50, 0xfb, 0x4f, 0xd4, 0xe9, 0x27, 0xe8, + 0x87, 0x8c, 0x8, 0x50, 0xa8, 0x64, 0x58, 0x5a, + 0x8, 0x2f, 0x42, 0x5b, 0x30, 0x73, 0x63, 0x63, + 0x2f, 0xa6, 0xa6, 0x79, 0xa5, 0x49, 0x65, 0xb3, + 0xb3, 0xa8, 0x77, 0x6b, 0xe5, 0x6f, 0xe4, 0xf3, + 0x4, 0x6b, 0x4f, 0x9c, 0x4, 0x9d, 0xd8, 0x9c, + 0x9c, 0x9c, 0xdd, 0xf3, 0x6f, 0x99, 0xf5, 0x93, + 0x4, 0xd8, 0x9f, 0x99, 0x6f, 0xd8, 0x75, 0x93, + 0x6f, 0xf5, 0xde, 0x32, 0x93, 0x12, 0x9c, 0x6f, + 0x97, 0xde, 0x57, 0x97, 0xf3, 0xc0, 0xd8, 0x97, + 0x97, 0xf5, 0xf3, 0x97, 0x97, 0xe4, 0xfd, 0x6c, + 0x6c, 0xd7, 0x2f, 0x2f, 0x96, 0xa0, 0x8c, 0x8c, + 0x58, 0xb5, 0x4d, 0xe3, 0xbe, 0xbe, 0x82, 0xab, + 0xa7, 0x1f, 0x94, 0x82, 0x87, 0xda, 0x3b, 0x30, + 0x73, 0xa0, 0xe3, 0xb5, 0x58, 0x8c, 0xd3, 0x6d, + 0xb5, 0xe3, 0xe3, 0xb5, 0x58, 0x45, 0x29, 0x1c, + 0x58, 0x41, 0xa, 0xa, 0x62, 0x78, 0x78, 0x29, + 0x6d, 0x82, 0xbe, 0xb5, 0x87, 0x68, 0x16, 0x78, + 0xe3, 0x6d, 0x62, 0x78, 0x29, 0xa, 0xbe, 0x94, + 0x82, 0x68, 0x3b, 0xda, 0x58, 0xa0, 0x8a, 0x29, + 0x6d, 0x58, 0xe3, 0xb5, 0x4d, 0xe3, 0x82, 0x94, + 0xa8, 0x4f, 0xd9, 0xc2, 0xa9, 0x2a, 0x50, 0x8c, + 0xe3, 0xb5, 0xe3, 0xe3, 0xe3, 0x58, 0x24, 0xe3, + 0x24, 0x68, 0xa4, 0xa4, 0x58, 0x58, 0x8c, 0xb5, + 0x62, 0x6d, 0x6d, 0x6d, 0x4d, 0x8c, 0xc3, 0xe3, + 0xb5, 0x41, 0x68, 0x68, 0x8c, 0x94, 0xa5, 0xa8, + 0x1, 0x1, 0x52, 0x65, 0xab, 0xab, 0x8c, 0xab, + 0xbe, 0x6d, 0x6d, 0x29, 0xd1, 0xa, 0xd1, 0xa, + 0xd1, 0xd1, 0xa, 0xd1, 0xd1, 0xd1, 0xa, 0xa, + 0xd1, 0x23, 0x23, 0x34, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x0, 0x23, 0x23, 0xc0, 0x44, 0xe2, + 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0xe2, + 0x44, 0x44, 0x0, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa0, 0x79, 0x8, 0x41, 0xb5, 0x58, 0x67, 0x1c, + 0x41, 0x58, 0xb3, 0x2f, 0x42, 0x63, 0x6e, 0xf0, + 0x96, 0x96, 0x60, 0x82, 0x6d, 0xb5, 0x8c, 0xab, + 0xab, 0x8c, 0xb3, 0xc3, 0xb3, 0x73, 0x5b, 0x73, + 0xa0, 0x79, 0xd2, 0x2f, 0x24, 0x8c, 0x8c, 0x8c, + 0xd3, 0x8c, 0xf1, 0xa4, 0x30, 0x8, 0x30, 0x5, + 0xb5, 0x24, 0x52, 0xa8, 0x52, 0x2c, 0x7f, 0xd8, + 0x40, 0x8b, 0xd8, 0xd8, 0x1e, 0x1e, 0x1e, 0x18, + 0x50, 0x8c, 0x52, 0x8c, 0x65, 0x8c, 0x1, 0xc3, + 0xa6, 0x2f, 0x6e, 0xd5, 0x1b, 0x1b, 0xe, 0xe7, + 0x2f, 0x8c, 0xc3, 0x87, 0xab, 0xd3, 0x8c, 0xc3, + 0xa6, 0xd4, 0x90, 0xc6, 0xf3, 0xc6, 0xe1, 0xb4, + 0xc6, 0x53, 0xf6, 0x84, 0xe4, 0xc6, 0xcc, 0xbf, + 0xbf, 0xbf, 0xf4, 0xb4, 0xe4, 0xe1, 0x57, 0x7, + 0xbf, 0x75, 0x57, 0xb4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xbf, 0xb0, 0xc6, 0xb4, 0xb4, 0x7, 0xe1, + 0xb4, 0xe1, 0xe4, 0xf4, 0xb4, 0xf4, 0xbf, 0xe4, + 0xbf, 0xbf, 0x7, 0xc6, 0xe4, 0xe1, 0x53, 0x3, + 0xd7, 0x4a, 0xe, 0x63, 0x2f, 0xd3, 0xb5, 0xe3, + 0xe3, 0x4d, 0x4d, 0x55, 0x87, 0x21, 0xa6, 0x60, + 0x22, 0xa8, 0xa7, 0x66, 0x55, 0x82, 0x82, 0x4d, + 0x58, 0x8c, 0xe3, 0xe3, 0x82, 0xb3, 0x8a, 0xa0, + 0x89, 0x58, 0xe3, 0x1c, 0x5, 0x65, 0x1c, 0x4d, + 0x5e, 0x61, 0x37, 0x29, 0x65, 0x8c, 0x87, 0xc3, + 0x67, 0xa7, 0x82, 0xbe, 0x65, 0xa7, 0x61, 0x61, + 0x61, 0xbe, 0x3b, 0x1c, 0x41, 0x58, 0x1c, 0x8a, + 0x82, 0x8c, 0x29, 0xb5, 0x82, 0x82, 0xe3, 0xd3, + 0x94, 0x1c, 0xe3, 0x82, 0x8c, 0x87, 0xb5, 0x5, + 0x1b, 0x9f, 0x53, 0xdc, 0x80, 0x3f, 0x1d, 0xf, + 0x52, 0x64, 0xb3, 0x87, 0x68, 0x2f, 0x58, 0x6d, + 0x62, 0x29, 0xb5, 0xe3, 0x6d, 0x6d, 0x82, 0xa7, + 0x52, 0x1, 0xc3, 0xa4, 0x73, 0xd4, 0x2c, 0xab, + 0x6d, 0xe3, 0xac, 0xab, 0x52, 0x2c, 0xcb, 0xe1, + 0xe1, 0x47, 0x32, 0x99, 0x73, 0xc9, 0x49, 0x94, + 0x78, 0x78, 0xa, 0x76, 0xa, 0xd1, 0xa, 0xa, + 0xa, 0x1c, 0xa, 0xa, 0xd1, 0x23, 0x34, 0x23, + 0x23, 0x23, 0xd1, 0x23, 0xd1, 0x34, 0x23, 0x23, + 0x23, 0x23, 0x23, 0xd1, 0x1c, 0x44, 0xe2, 0x44, + 0x44, 0xe2, 0x10, 0x10, 0x0, 0x0, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0xe2, + 0x44, 0x0, 0x44, 0x44, 0x10, 0x0, 0x10, 0x0, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x8c, 0xb3, 0x8, 0x8c, 0x24, 0x24, 0x82, 0xda, + 0xb5, 0x58, 0x58, 0x87, 0xa6, 0x1b, 0xa5, 0x60, + 0x59, 0x64, 0xa8, 0x49, 0xa8, 0x49, 0x59, 0xa6, + 0xc3, 0x50, 0xa8, 0x52, 0xc3, 0xa4, 0x2f, 0xe7, + 0x67, 0x8c, 0xb3, 0x67, 0x1, 0x8c, 0xa6, 0x68, + 0x68, 0x8, 0x8, 0x87, 0x8c, 0x8c, 0x68, 0x1, + 0x52, 0x59, 0xb8, 0x4e, 0xc2, 0x88, 0x74, 0x86, + 0xf9, 0x39, 0xfa, 0x84, 0x70, 0x74, 0x8b, 0xf6, + 0xdc, 0x3f, 0x3f, 0x59, 0xc3, 0xa8, 0xc7, 0x64, + 0xb3, 0xad, 0xc9, 0x7a, 0xe9, 0x7a, 0xa8, 0x59, + 0x5a, 0x2f, 0x2c, 0x59, 0xa4, 0x30, 0x14, 0x64, + 0xb3, 0x59, 0x5c, 0xf6, 0xde, 0x75, 0x74, 0x4b, + 0xf9, 0xc6, 0xe1, 0xbf, 0xc6, 0x4b, 0xb4, 0xf4, + 0xbf, 0x9a, 0xcb, 0x57, 0xe1, 0xe1, 0x57, 0xe1, + 0x4b, 0x4b, 0xb4, 0xe4, 0xe4, 0xc6, 0x4b, 0xde, + 0xe4, 0xe4, 0xbc, 0xf6, 0x90, 0xb4, 0xe1, 0xb4, + 0x81, 0x4b, 0xe4, 0xbf, 0xbf, 0xcd, 0x86, 0x9f, + 0xcc, 0xf4, 0x57, 0x9f, 0x6b, 0xfd, 0x47, 0xd7, + 0x4a, 0x1b, 0x96, 0x2f, 0x87, 0x6d, 0x62, 0x6d, + 0x62, 0x76, 0x82, 0x87, 0x59, 0xd4, 0xfb, 0x27, + 0x6a, 0x4f, 0x67, 0x8c, 0x82, 0x5e, 0x4d, 0x29, + 0x78, 0x4d, 0x5e, 0x58, 0x68, 0x45, 0xa0, 0x42, + 0x79, 0x67, 0x8a, 0x29, 0x1c, 0x6d, 0xac, 0x76, + 0x37, 0x61, 0xab, 0xa8, 0x4e, 0xd4, 0x96, 0xa5, + 0xa3, 0x50, 0x1, 0xab, 0x55, 0x55, 0xbe, 0xac, + 0xbe, 0x37, 0x1c, 0x2f, 0x2f, 0xb3, 0x45, 0x8a, + 0xb5, 0x24, 0x78, 0x6d, 0x4d, 0x5e, 0x5e, 0xac, + 0xac, 0x4d, 0xda, 0x68, 0x64, 0x2f, 0xf0, 0x89, + 0x22, 0xa9, 0x27, 0xa9, 0x48, 0x3f, 0x49, 0x1d, + 0x1d, 0x9e, 0xc3, 0x5, 0xb3, 0x67, 0x8c, 0xb5, + 0x62, 0x6d, 0x6d, 0x29, 0x6d, 0xa, 0x6d, 0x65, + 0xa8, 0xc7, 0x96, 0x96, 0xd4, 0x60, 0x2f, 0x8c, + 0x41, 0x78, 0xe3, 0xe3, 0x2f, 0x6b, 0x9c, 0x8e, + 0x97, 0x97, 0x47, 0xfd, 0x6b, 0x1, 0xab, 0xab, + 0xd3, 0xac, 0x76, 0x76, 0xd1, 0x23, 0xd1, 0xa, + 0x62, 0xd1, 0xa, 0xd1, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0xd1, 0x23, + 0x0, 0x23, 0x23, 0x23, 0xf3, 0x44, 0xe2, 0x95, + 0x12, 0xbf, 0x10, 0x10, 0x10, 0x10, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x0, 0x10, 0x10, 0x10, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, + 0x10, 0x10, 0x0, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x24, 0x82, 0x8c, 0x8c, 0x52, 0x8c, 0x30, 0x45, + 0x73, 0xf1, 0x5, 0x8a, 0xa0, 0x67, 0x8c, 0x52, + 0x52, 0x9e, 0x64, 0xd6, 0x7f, 0x4f, 0xd9, 0x1b, + 0xd9, 0x7c, 0xc7, 0x68, 0x8c, 0xa7, 0xab, 0xab, + 0xab, 0xd3, 0x58, 0xa4, 0x73, 0xae, 0x1b, 0xa0, + 0xa0, 0x8, 0x67, 0xd3, 0x62, 0x29, 0xac, 0xd3, + 0x64, 0xa8, 0xd4, 0x4f, 0x6b, 0x6f, 0x9, 0xc6, + 0x39, 0x7d, 0xd8, 0xe1, 0x1e, 0xa9, 0x7e, 0x8b, + 0x83, 0x27, 0x5c, 0x4f, 0xc9, 0x60, 0xb8, 0xc7, + 0xb3, 0x87, 0x8c, 0x8c, 0x67, 0x2f, 0x67, 0xa6, + 0xa5, 0xd2, 0xc2, 0x89, 0x5b, 0x30, 0x8, 0xa6, + 0x1, 0x1, 0x60, 0x27, 0xe5, 0x9c, 0x90, 0x99, + 0x6f, 0x93, 0xe4, 0xf3, 0x97, 0x9c, 0xd8, 0x81, + 0x8e, 0x9d, 0x18, 0x8b, 0xf5, 0x12, 0xe4, 0xdf, + 0x6f, 0xf3, 0xe4, 0x32, 0x97, 0x32, 0x1e, 0xfd, + 0x47, 0xdd, 0xf6, 0x27, 0x9c, 0xc0, 0xb4, 0x93, + 0x9c, 0x9c, 0xdd, 0xfd, 0x32, 0xb2, 0x40, 0x2a, + 0x4, 0xdd, 0xfd, 0xd7, 0x4a, 0xd7, 0xd7, 0xd7, + 0xc2, 0x89, 0x68, 0xb5, 0xe3, 0xa, 0x62, 0x78, + 0x6d, 0x29, 0x41, 0x5a, 0xec, 0xd4, 0xe5, 0xe5, + 0x47, 0x9d, 0x5d, 0xa8, 0x49, 0xab, 0x82, 0xb5, + 0x76, 0x6d, 0x6d, 0xa4, 0x5, 0x45, 0xa4, 0x58, + 0x67, 0x8c, 0x41, 0x62, 0xb5, 0x4d, 0x6d, 0x1c, + 0x6d, 0x4d, 0xe3, 0x5a, 0xe8, 0x88, 0xd9, 0x7e, + 0x91, 0x91, 0x2c, 0xa8, 0x49, 0x49, 0x8c, 0xb5, + 0x4d, 0x78, 0x62, 0x58, 0x41, 0xd3, 0x82, 0x82, + 0x82, 0xe3, 0x1c, 0xb5, 0xe3, 0x4d, 0xb5, 0xda, + 0x29, 0x78, 0x29, 0x1c, 0x24, 0x1, 0xa5, 0x77, + 0x7f, 0x2a, 0xe5, 0x47, 0x40, 0x27, 0x60, 0xa8, + 0x4e, 0x1f, 0xab, 0x82, 0x24, 0x82, 0xd3, 0x29, + 0xb5, 0x4d, 0x16, 0xda, 0xda, 0x6d, 0x29, 0x1c, + 0x1, 0xa8, 0x2f, 0xfb, 0x9d, 0x2c, 0x14, 0xf1, + 0x2f, 0x58, 0x58, 0x5, 0x5b, 0x6c, 0x4, 0x32, + 0xe4, 0x47, 0x4, 0x32, 0xfd, 0xfd, 0x1, 0x7, + 0x39, 0x30, 0xd3, 0x29, 0x78, 0xd1, 0xd1, 0x23, + 0xd1, 0xd1, 0xd1, 0x23, 0xd1, 0xd1, 0x23, 0x23, + 0x34, 0x23, 0x23, 0x23, 0x23, 0x34, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x23, 0xf3, 0xc0, 0xf3, 0x44, + 0xbf, 0xbf, 0x44, 0x10, 0x10, 0x10, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x10, 0x0, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, + 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb5, 0x41, 0x1c, 0x67, 0xf1, 0x8, 0x5, 0x30, + 0x8, 0x67, 0x2f, 0x30, 0xb5, 0xe3, 0x82, 0x68, + 0x59, 0x42, 0xe, 0x25, 0x1e, 0xe5, 0xd7, 0x9c, + 0x3, 0x5d, 0x50, 0x60, 0x49, 0xab, 0xe3, 0xb5, + 0x58, 0x8, 0x58, 0x58, 0xf1, 0x79, 0xf1, 0x73, + 0x67, 0x24, 0x8c, 0x58, 0x58, 0xe3, 0xe3, 0xda, + 0xad, 0x19, 0xe5, 0x9c, 0x4, 0x6c, 0xfd, 0xd8, + 0x9c, 0xef, 0x8b, 0x81, 0x8e, 0x6f, 0x9c, 0xed, + 0x47, 0xe5, 0x3, 0x7e, 0xc5, 0x50, 0x2c, 0x2c, + 0xa8, 0x2f, 0xa6, 0xa0, 0x73, 0x63, 0xd2, 0x67, + 0x14, 0xf0, 0x2f, 0x2f, 0x2f, 0xa6, 0x1, 0x1, + 0xb3, 0x1b, 0x7d, 0xe5, 0xe5, 0xe5, 0x93, 0x93, + 0x4, 0x4, 0xe4, 0x8e, 0x4, 0x97, 0xf6, 0x9d, + 0x4, 0x32, 0x86, 0xf3, 0x93, 0xf3, 0xb4, 0xdd, + 0x93, 0xf3, 0xe1, 0x9d, 0x47, 0x93, 0xc6, 0xfd, + 0x4, 0xf3, 0xe4, 0x93, 0x93, 0x12, 0xdd, 0x32, + 0x32, 0x12, 0xbd, 0x9d, 0xfd, 0x70, 0xce, 0x47, + 0x47, 0xbd, 0xdd, 0x4, 0x6c, 0xd7, 0xe, 0x2f, + 0x2f, 0xd3, 0xd3, 0x4d, 0xac, 0x29, 0x8a, 0x41, + 0x8a, 0xda, 0xa4, 0x5b, 0x77, 0x27, 0x36, 0x3a, + 0x98, 0x8b, 0x8b, 0x3e, 0xb8, 0xd4, 0xc9, 0x67, + 0x8c, 0x68, 0x68, 0x5, 0x1a, 0x6d, 0x41, 0xb5, + 0xac, 0xb5, 0x58, 0x24, 0x82, 0xb3, 0x45, 0x68, + 0x65, 0xc3, 0xb3, 0x59, 0x91, 0x51, 0x6b, 0xa9, + 0xeb, 0x88, 0x7d, 0x27, 0x8b, 0x88, 0xd9, 0x59, + 0xab, 0xac, 0x76, 0x78, 0xa, 0x78, 0xb5, 0xac, + 0x5e, 0xe3, 0x58, 0xa0, 0x67, 0x1, 0x5, 0xda, + 0x4d, 0xa, 0x78, 0x29, 0xbe, 0xab, 0x7a, 0x1e, + 0x86, 0xd8, 0xca, 0x90, 0x70, 0xd8, 0x6b, 0x27, + 0x91, 0x1d, 0xa7, 0x8c, 0xa7, 0x66, 0xbe, 0x82, + 0x94, 0x6d, 0x82, 0x68, 0x68, 0x8c, 0x24, 0x87, + 0xb3, 0x52, 0xa8, 0x6b, 0xe1, 0x81, 0x35, 0x47, + 0xe5, 0xd7, 0x73, 0xad, 0x96, 0x4, 0xfd, 0xb4, + 0xb4, 0x6b, 0xfd, 0x9a, 0xbb, 0xf4, 0x85, 0xf4, + 0xf4, 0xf4, 0x9a, 0x66, 0x78, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0x23, + 0xd1, 0x34, 0x23, 0x23, 0x23, 0x0, 0x23, 0x0, + 0x23, 0x23, 0x23, 0xd1, 0x12, 0xe2, 0x44, 0x44, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x0, 0x10, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, + 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x42, 0xf1, 0x30, 0xa0, 0x30, 0x8c, 0xe3, 0xb5, + 0xe3, 0xd3, 0xd3, 0x67, 0x2f, 0xb3, 0xa0, 0x1b, + 0x25, 0x47, 0xef, 0x83, 0x90, 0x3, 0x36, 0xc4, + 0x9f, 0x13, 0x7e, 0x88, 0x7e, 0x4e, 0xc3, 0xa0, + 0xa0, 0xf1, 0x87, 0x67, 0x58, 0x8c, 0xd3, 0x8c, + 0x2f, 0x8c, 0x1c, 0x30, 0x89, 0x73, 0x2f, 0xa0, + 0x5b, 0xef, 0xd8, 0xe1, 0x2e, 0x8b, 0x51, 0xd8, + 0xdd, 0xde, 0x81, 0x4b, 0xdf, 0xde, 0xe4, 0xe1, + 0x81, 0x88, 0xb, 0x91, 0x7e, 0x22, 0x3f, 0xa8, + 0xa5, 0xd9, 0xfb, 0xd4, 0x96, 0x1b, 0x77, 0xa5, + 0x64, 0x67, 0xa7, 0x8c, 0xb3, 0x2f, 0x52, 0xb3, + 0x59, 0x6b, 0xc4, 0xfa, 0xca, 0x99, 0xd8, 0xe1, + 0xdd, 0xde, 0x90, 0xf6, 0xe4, 0xaf, 0xb4, 0x4b, + 0xfc, 0x8d, 0xbb, 0x8d, 0xbf, 0xbf, 0xe1, 0xbc, + 0xc6, 0xb4, 0xe1, 0x90, 0xdd, 0x95, 0xb4, 0xce, + 0xc6, 0x4b, 0xbf, 0xf4, 0xe4, 0xb4, 0x4b, 0x9f, + 0x84, 0xb4, 0xb4, 0x90, 0xdf, 0x8d, 0xce, 0xbf, + 0xc6, 0xdf, 0x83, 0x3, 0x3a, 0x5d, 0x2f, 0x58, + 0xac, 0xac, 0x62, 0x76, 0xa, 0x6d, 0x87, 0xd3, + 0xd3, 0x87, 0x59, 0x4e, 0xeb, 0x9f, 0x4b, 0x18, + 0x39, 0x70, 0x84, 0xc6, 0x90, 0x5c, 0x4f, 0x48, + 0x1d, 0x1f, 0x8c, 0x1c, 0xb5, 0xe3, 0x30, 0x68, + 0xe3, 0x1c, 0x24, 0x8c, 0xac, 0x55, 0xda, 0x9e, + 0x1d, 0x1d, 0x4e, 0xd4, 0x4f, 0x90, 0x81, 0xbd, + 0x4b, 0x9c, 0xc6, 0x81, 0x75, 0x53, 0x5c, 0x4e, + 0x56, 0x1d, 0xd3, 0x24, 0x29, 0x62, 0x1c, 0xda, + 0xe3, 0x76, 0x29, 0xb3, 0x64, 0x61, 0xd3, 0x82, + 0xbe, 0x4d, 0x29, 0x68, 0xad, 0x96, 0xc2, 0xd8, + 0xe1, 0x86, 0x83, 0xdf, 0xb4, 0x57, 0x74, 0xf6, + 0x88, 0x22, 0x4e, 0x4f, 0xe8, 0x87, 0x24, 0x82, + 0x94, 0x61, 0xac, 0x65, 0x52, 0x17, 0x52, 0x4e, + 0xd4, 0x7d, 0x6b, 0xe1, 0xe1, 0x9, 0x36, 0xfd, + 0x3, 0xab, 0xd3, 0x1, 0xc9, 0x7d, 0x7, 0x9a, + 0xf4, 0x32, 0xe4, 0xf4, 0xf4, 0xf4, 0xf4, 0xbf, + 0xbb, 0x9a, 0xf, 0xf, 0x61, 0x5e, 0x76, 0x4d, + 0x3b, 0x1c, 0xd1, 0x23, 0xa, 0x23, 0x23, 0x23, + 0x0, 0x23, 0x23, 0xd1, 0x0, 0x23, 0x23, 0x23, + 0x23, 0x1c, 0x16, 0x29, 0xbf, 0xf4, 0x44, 0x44, + 0x44, 0xbf, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x95, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xae, 0x79, 0x2f, 0xa6, 0x68, 0xe3, 0xe3, 0x58, + 0x87, 0x1c, 0xb5, 0x8c, 0xf1, 0x2f, 0xc9, 0xd4, + 0x99, 0xc6, 0x9f, 0xc4, 0x39, 0x88, 0x40, 0x70, + 0xb4, 0x90, 0x39, 0x90, 0xd8, 0x2a, 0x2c, 0x68, + 0xa6, 0x1, 0x8c, 0x49, 0xb3, 0x5, 0x8a, 0x8, + 0x1b, 0x8, 0x41, 0x87, 0x5b, 0xf1, 0x2c, 0x59, + 0xd4, 0x4f, 0x51, 0xf6, 0xc6, 0x6b, 0x6b, 0xc6, + 0xbf, 0xe4, 0xc6, 0xf5, 0x9c, 0xbd, 0x7, 0x75, + 0xd8, 0x39, 0x88, 0x40, 0x90, 0x8b, 0xe8, 0x59, + 0xc5, 0x27, 0x3e, 0x60, 0xc9, 0x5b, 0x2c, 0x2c, + 0xa8, 0x5b, 0x2f, 0x73, 0x1b, 0xd2, 0x5b, 0x67, + 0x60, 0x27, 0xf6, 0x53, 0x39, 0x99, 0x9f, 0xcb, + 0xe1, 0xe4, 0x81, 0x81, 0xaf, 0xbf, 0xaf, 0xe4, + 0xf5, 0xce, 0x8d, 0x9a, 0x9a, 0xc6, 0xe4, 0xe1, + 0xf8, 0xe4, 0xe4, 0x9c, 0xf5, 0xe2, 0xbf, 0x8d, + 0xbd, 0x81, 0xbf, 0x57, 0x57, 0xbb, 0xc6, 0xdd, + 0xde, 0xe4, 0xe4, 0xbd, 0xce, 0xb4, 0x8d, 0xde, + 0xd8, 0x90, 0x36, 0x5d, 0xa5, 0xe9, 0x2f, 0x24, + 0xb5, 0x29, 0x29, 0xa, 0x29, 0x6d, 0xe3, 0xa, + 0x4d, 0x82, 0x59, 0xd4, 0x88, 0x81, 0xd8, 0x9c, + 0xff, 0xc6, 0xff, 0x36, 0x8b, 0xdb, 0x98, 0x91, + 0x52, 0x66, 0xab, 0x82, 0x4d, 0x58, 0xa0, 0xa0, + 0x5, 0xda, 0xe3, 0xb5, 0xbe, 0x55, 0x94, 0x1d, + 0x1d, 0x91, 0x88, 0x6b, 0x1e, 0x81, 0xde, 0x8e, + 0xde, 0xc6, 0xfd, 0x36, 0x9f, 0xdb, 0x98, 0xa9, + 0x91, 0x1d, 0x8c, 0xb3, 0x8c, 0x29, 0xda, 0x45, + 0x1c, 0x29, 0x62, 0x62, 0xa, 0x62, 0x78, 0x4d, + 0x4d, 0x4d, 0x58, 0x96, 0xd4, 0x27, 0xe5, 0xf5, + 0xf8, 0xd8, 0x3, 0xfd, 0xc6, 0x1e, 0x1e, 0xce, + 0x81, 0x36, 0x47, 0x1e, 0x40, 0x50, 0x1, 0xa7, + 0x65, 0xe3, 0x82, 0xb5, 0x65, 0x65, 0x52, 0x88, + 0xfa, 0x4, 0x6f, 0x4, 0x8e, 0xd7, 0x5d, 0x49, + 0x1, 0xd3, 0xb5, 0x24, 0x7d, 0x4, 0x6f, 0xb4, + 0xbf, 0x4, 0x97, 0xb4, 0xbf, 0x93, 0x8e, 0x9a, + 0xf4, 0x32, 0xad, 0x9a, 0xb1, 0x30, 0x78, 0xa, + 0x6d, 0xa, 0x34, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x0, 0x0, 0x23, 0x23, 0x0, 0x0, + 0x0, 0x16, 0x16, 0xf3, 0xc0, 0x95, 0x12, 0x44, + 0xbf, 0x95, 0xe2, 0x44, 0xbf, 0xbb, 0xe2, 0x44, + 0xbf, 0xe2, 0x0, 0x10, 0x10, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x10, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, 0x10, + 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x67, 0x8c, 0xab, 0x87, 0x67, 0x58, 0x87, 0x8, + 0x73, 0x58, 0xda, 0x5, 0x2f, 0x8c, 0xb3, 0x6e, + 0x6b, 0x3, 0x8b, 0x8b, 0xed, 0x9c, 0xf5, 0x2e, + 0xe4, 0x9c, 0x47, 0xbd, 0x40, 0x50, 0x52, 0x82, + 0xb5, 0x1c, 0x8c, 0x67, 0xc9, 0x73, 0x30, 0x5b, + 0x89, 0x2f, 0x58, 0x58, 0x67, 0x58, 0x8c, 0x67, + 0xa5, 0xd5, 0x6b, 0xd8, 0x9c, 0x4, 0x9c, 0xbd, + 0xf5, 0x4, 0xbd, 0x1e, 0x8e, 0x32, 0x9d, 0x57, + 0x9c, 0x9c, 0xde, 0xd8, 0xfd, 0x4, 0x3, 0x77, + 0xe, 0xa5, 0xa8, 0x87, 0xa6, 0x1, 0x1, 0xa7, + 0x42, 0x63, 0xe, 0x6e, 0x63, 0x1b, 0xe7, 0x8c, + 0x5a, 0xd4, 0x88, 0xb, 0x27, 0x4, 0xde, 0x83, + 0x6f, 0x9c, 0xc0, 0xf3, 0x32, 0x93, 0xb4, 0xd8, + 0xfd, 0xaf, 0xf4, 0x81, 0xfd, 0xe4, 0xaf, 0x12, + 0x6f, 0x93, 0xe4, 0x93, 0x4, 0x86, 0xc4, 0x1e, + 0x47, 0xdd, 0xe4, 0x1e, 0x1e, 0xe4, 0xe4, 0x32, + 0x4, 0xdd, 0xdd, 0x4, 0x4, 0xbd, 0xde, 0x47, + 0xa9, 0x3, 0x47, 0xc5, 0x2f, 0x42, 0x5a, 0x8c, + 0x29, 0x6d, 0xda, 0x29, 0x78, 0xb5, 0x6d, 0xa, + 0x1c, 0x58, 0xa5, 0x19, 0xef, 0x99, 0x47, 0x6c, + 0x4, 0xd8, 0x6b, 0xef, 0x98, 0x48, 0x2a, 0x2c, + 0x52, 0x82, 0x58, 0xe3, 0x1c, 0x3b, 0x45, 0xa4, + 0x87, 0xe3, 0x82, 0x82, 0x82, 0x52, 0x60, 0x7a, + 0x60, 0xe8, 0x47, 0x4, 0x70, 0xde, 0x6b, 0x4, + 0xd8, 0xcf, 0x3, 0x6b, 0x35, 0x51, 0x3, 0xef, + 0xe8, 0x52, 0x87, 0x2f, 0xd3, 0x29, 0x6d, 0x1c, + 0x1c, 0x41, 0xb5, 0xb5, 0xda, 0x6d, 0xb5, 0x6d, + 0x78, 0x78, 0x16, 0x73, 0x8b, 0x83, 0x3, 0x6b, + 0x90, 0x9d, 0x47, 0x7b, 0xb2, 0x9c, 0x6f, 0x97, + 0x8d, 0x97, 0x27, 0x6b, 0x9d, 0x91, 0x2c, 0x49, + 0x9e, 0xb3, 0x67, 0xa3, 0x7a, 0xc3, 0xa6, 0x47, + 0x81, 0x4, 0xfd, 0x7d, 0x3, 0x4, 0x1, 0x1, + 0x1, 0x87, 0x24, 0x73, 0x8e, 0x4, 0x9c, 0xe4, + 0xaf, 0x97, 0x97, 0x9a, 0x8d, 0x93, 0x97, 0xf4, + 0xf4, 0x97, 0x32, 0xf4, 0xf4, 0x8e, 0xe3, 0x78, + 0xa, 0x62, 0xd1, 0xd1, 0x23, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, 0x23, + 0x0, 0x0, 0x16, 0x44, 0xc0, 0xbf, 0x95, 0x44, + 0x44, 0xbb, 0x44, 0x44, 0xbf, 0xbb, 0x44, 0x44, + 0xe2, 0xe1, 0x10, 0x0, 0x10, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, + 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x3b, 0xe3, 0x87, 0x2, 0x79, 0xb3, 0x68, 0x73, + 0x42, 0x2, 0x58, 0x58, 0x82, 0x82, 0x67, 0xa5, + 0x8f, 0x8f, 0xef, 0x32, 0x32, 0x4, 0x6f, 0x99, + 0xfd, 0xe0, 0x3, 0x3a, 0x8b, 0xc7, 0x8c, 0x8c, + 0xe3, 0xe3, 0xb5, 0x30, 0x79, 0x2, 0x2f, 0x68, + 0x67, 0xb3, 0x8c, 0x8c, 0x8c, 0x58, 0x8c, 0x5a, + 0x4a, 0xd7, 0xe5, 0x7d, 0xe5, 0x4, 0x4, 0xcf, + 0x6b, 0xe5, 0x3, 0x36, 0x9c, 0x4, 0x9c, 0x81, + 0x32, 0x4, 0xf3, 0x86, 0x6b, 0x6f, 0x3, 0x98, + 0xa5, 0x73, 0xc9, 0xa6, 0xd2, 0x1b, 0x58, 0xb3, + 0x79, 0x4a, 0x4a, 0xa5, 0x30, 0x2f, 0x67, 0x64, + 0x2f, 0x1b, 0x7d, 0x6b, 0xd7, 0x97, 0x9c, 0x39, + 0xe5, 0x93, 0xf3, 0xde, 0x47, 0x7d, 0xf3, 0xde, + 0xfd, 0xf5, 0x81, 0x1e, 0x93, 0xc0, 0xbf, 0xc4, + 0xca, 0xf5, 0xe4, 0xfd, 0x3, 0xca, 0xca, 0xfd, + 0xfd, 0xf3, 0xe4, 0xdf, 0x93, 0xf3, 0xbf, 0x32, + 0x4, 0x25, 0xb9, 0xfd, 0x3a, 0xd8, 0xf5, 0x6b, + 0x6c, 0x7b, 0x47, 0x6e, 0xad, 0x8c, 0xd3, 0xb5, + 0xa, 0x62, 0x78, 0x4d, 0xd3, 0x8c, 0xda, 0x3b, + 0x58, 0x73, 0xef, 0xe5, 0x6b, 0x8b, 0x1e, 0x6c, + 0x9d, 0x51, 0x4f, 0xe5, 0x6b, 0xd8, 0x83, 0x8f, + 0xc2, 0x60, 0x2f, 0xe3, 0x62, 0xa, 0x62, 0x29, + 0xac, 0xab, 0xc3, 0xad, 0xc9, 0x4f, 0x27, 0x6b, + 0x7d, 0x99, 0xbd, 0xde, 0xe4, 0x53, 0x8b, 0x1e, + 0x81, 0xd8, 0x1e, 0x6b, 0xca, 0x1e, 0xd7, 0x9b, + 0xa9, 0x2c, 0xab, 0xab, 0xa, 0x62, 0xd1, 0xa, + 0x62, 0xd3, 0x58, 0x30, 0x45, 0xda, 0x58, 0x58, + 0x29, 0x6d, 0xe3, 0x59, 0x88, 0x8b, 0x8b, 0xf5, + 0x9c, 0xf3, 0xbd, 0xb4, 0xce, 0xdf, 0x8e, 0xb4, + 0xce, 0x81, 0x51, 0x8b, 0x84, 0xf6, 0x18, 0x88, + 0x39, 0x83, 0x1e, 0xe1, 0x84, 0x1e, 0x47, 0x75, + 0xb0, 0xe1, 0x53, 0x88, 0x1e, 0x47, 0xfd, 0xfd, + 0x7d, 0x73, 0xc9, 0x7d, 0xe1, 0xe4, 0xb4, 0x9a, + 0xf4, 0xf4, 0xb4, 0x20, 0xb4, 0xb4, 0xf4, 0xf4, + 0xe2, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xac, 0x62, + 0x78, 0xa, 0xd1, 0xd1, 0x34, 0x23, 0x23, 0x34, + 0x23, 0xd1, 0x0, 0x23, 0x23, 0x23, 0x0, 0x0, + 0x23, 0x23, 0x23, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x10, 0x10, 0x10, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, + 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa0, 0xa4, 0xa0, 0xd2, 0x2f, 0x24, 0xb5, 0x58, + 0x67, 0x8c, 0xd3, 0x8c, 0x45, 0x5, 0x79, 0x4a, + 0x28, 0xe5, 0x7d, 0x9c, 0xed, 0x36, 0x3, 0x27, + 0x1e, 0x32, 0x9b, 0x90, 0x39, 0xc2, 0xc5, 0xa5, + 0x8, 0xda, 0xb5, 0x24, 0x8c, 0x8c, 0xd3, 0x82, + 0x87, 0x87, 0x67, 0x2f, 0x5b, 0xa0, 0x5b, 0xd9, + 0x6b, 0x4, 0x47, 0x9d, 0x1e, 0x36, 0x3, 0x53, + 0x90, 0x9c, 0x2e, 0xb1, 0xbd, 0x93, 0x9c, 0x81, + 0xf3, 0x2e, 0x8d, 0xf6, 0x40, 0x9c, 0xc6, 0xdb, + 0xfb, 0xe9, 0xc9, 0xc2, 0x6e, 0x6e, 0xa5, 0xa6, + 0x73, 0xe, 0xa5, 0x1, 0x8c, 0x1, 0x65, 0x49, + 0xd9, 0x6b, 0x9c, 0xc0, 0xde, 0xde, 0xce, 0xfa, + 0x90, 0xb4, 0xb4, 0xe1, 0x75, 0xe4, 0xbf, 0x95, + 0xbf, 0xbf, 0xe4, 0x12, 0xe2, 0xbb, 0xbf, 0x85, + 0xdb, 0xf8, 0xf4, 0x9a, 0xe1, 0x9, 0xc0, 0xe4, + 0xe4, 0xf4, 0xb4, 0xe4, 0x81, 0x9a, 0x9a, 0xe1, + 0x9f, 0xc6, 0xe4, 0xf3, 0x81, 0xe4, 0xe4, 0xdd, + 0x8d, 0x75, 0xc8, 0x5d, 0x8c, 0xd3, 0x37, 0xd1, + 0xa, 0x29, 0x62, 0x6d, 0xe3, 0x94, 0xc3, 0xb5, + 0x8c, 0xb8, 0x88, 0x8b, 0x8b, 0x53, 0x36, 0x81, + 0x81, 0x75, 0xe1, 0xc6, 0x84, 0xe1, 0xd8, 0x47, + 0xa9, 0x91, 0x52, 0xd3, 0x6d, 0xbe, 0x4d, 0x4d, + 0x6d, 0x87, 0x60, 0x22, 0xfb, 0xf6, 0x81, 0x84, + 0x84, 0xbc, 0x57, 0xe1, 0x9a, 0x7, 0xc6, 0xb4, + 0xb4, 0xe1, 0x81, 0x8d, 0x26, 0x7, 0x9f, 0x57, + 0x53, 0x91, 0x1d, 0x94, 0x37, 0xd1, 0xd1, 0x62, + 0x62, 0x29, 0x24, 0x87, 0x8c, 0xe3, 0x6d, 0xe3, + 0xe3, 0xab, 0x87, 0xd4, 0x7e, 0x90, 0xc6, 0xb4, + 0xf4, 0xbf, 0xc6, 0x9a, 0xf4, 0xb4, 0x57, 0x7, + 0x9a, 0x57, 0x75, 0x70, 0xb0, 0xe1, 0x84, 0xe1, + 0xb4, 0xb0, 0x7, 0x75, 0x9a, 0xe1, 0x75, 0xbc, + 0xc6, 0x9a, 0xce, 0x84, 0xb4, 0xe1, 0x83, 0xf6, + 0x74, 0x49, 0xab, 0x52, 0xcb, 0xbf, 0x9a, 0x9a, + 0xf4, 0xb4, 0xbf, 0xf4, 0xf4, 0xe2, 0xf4, 0xe2, + 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0x9e, + 0x78, 0x62, 0xd1, 0x23, 0xd1, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x0, 0x0, 0x0, 0x23, 0x23, + 0x23, 0x29, 0x16, 0xbf, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x10, 0x0, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, + 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x42, 0x73, 0x67, 0xa6, 0x67, 0x41, 0xe3, 0xe3, + 0x24, 0xb5, 0x58, 0x8, 0x8, 0x30, 0x5b, 0xe8, + 0x83, 0x1e, 0x1e, 0xdb, 0x81, 0x81, 0x9f, 0x75, + 0x9, 0xe4, 0xe1, 0x70, 0xe1, 0x1e, 0x2a, 0x2c, + 0x1, 0x58, 0xd3, 0x94, 0xe3, 0x82, 0xe3, 0x67, + 0x67, 0x41, 0x68, 0x59, 0x2f, 0x79, 0x96, 0x4e, + 0x2a, 0x9f, 0x90, 0xcb, 0x9f, 0x81, 0xc6, 0x4b, + 0x81, 0xbd, 0xbd, 0xc6, 0xe1, 0xe4, 0xb4, 0xe1, + 0x57, 0x85, 0xb4, 0xe1, 0x84, 0xc6, 0xc6, 0x90, + 0x3, 0x77, 0x59, 0x64, 0x49, 0x2f, 0x50, 0xa8, + 0xa6, 0x73, 0xf0, 0xa5, 0xa6, 0x87, 0x1, 0xc3, + 0xc5, 0x1e, 0xe1, 0xe1, 0x53, 0x9f, 0x9a, 0x85, + 0xf6, 0xe1, 0xf4, 0xb4, 0xe4, 0xb4, 0xbf, 0xbf, + 0xcc, 0xaf, 0xbf, 0xb4, 0xe1, 0xc6, 0xf4, 0xbf, + 0xb2, 0xb4, 0xbf, 0xbf, 0xb4, 0xf4, 0xf4, 0xbf, + 0xe1, 0x75, 0xbb, 0xe4, 0x9f, 0x74, 0x4b, 0xc6, + 0x81, 0xc6, 0xe4, 0xc6, 0xc6, 0xce, 0xc4, 0xde, + 0x9d, 0xdb, 0x91, 0x2c, 0x52, 0xab, 0x76, 0x4d, + 0x6d, 0xe3, 0xe3, 0xe3, 0x29, 0xbe, 0x78, 0x78, + 0x6d, 0x87, 0xc9, 0x27, 0x47, 0x90, 0x1e, 0x6b, + 0x39, 0x81, 0xce, 0x9c, 0x83, 0x35, 0x27, 0xef, + 0x5d, 0x2c, 0xab, 0x82, 0x24, 0x52, 0x52, 0x68, + 0x30, 0xd4, 0xe8, 0xc5, 0x27, 0xdb, 0x88, 0x1e, + 0xde, 0x84, 0x90, 0xdf, 0x86, 0xbf, 0xf3, 0xdd, + 0xc6, 0x4b, 0xfd, 0xd8, 0xd8, 0x9f, 0x48, 0x7c, + 0x18, 0x51, 0x2c, 0x24, 0x58, 0x1c, 0x62, 0x41, + 0x1c, 0x6d, 0x29, 0x4d, 0x29, 0x4d, 0x4d, 0x78, + 0xb5, 0x1, 0x60, 0xd5, 0x7d, 0x39, 0x32, 0xde, + 0xb4, 0xc6, 0x83, 0x40, 0xe4, 0xf3, 0xfd, 0xdf, + 0x81, 0x12, 0x4, 0xbd, 0xbf, 0xfc, 0x99, 0xfa, + 0xe1, 0xde, 0xfd, 0x18, 0xe1, 0xf3, 0x97, 0xc6, + 0x4b, 0xf5, 0x69, 0xdd, 0xc6, 0x8e, 0x73, 0x1, + 0xab, 0xab, 0x8c, 0xb3, 0x7d, 0x4, 0x97, 0x20, + 0xbf, 0x97, 0x97, 0xf4, 0xe2, 0x93, 0x93, 0x8d, + 0xf4, 0x93, 0x12, 0xf4, 0xe2, 0x32, 0x9, 0xdd, + 0xb1, 0x8a, 0xd1, 0x23, 0x23, 0x23, 0x0, 0x23, + 0x0, 0x23, 0x0, 0xd1, 0x23, 0x0, 0x0, 0x23, + 0x0, 0x0, 0x16, 0xc0, 0x95, 0xbf, 0x44, 0x44, + 0xbf, 0x95, 0x44, 0x44, 0xbf, 0x95, 0xf4, 0xe2, + 0xf4, 0xf4, 0xe2, 0x10, 0x0, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, + 0x0, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa6, 0x2f, 0x8c, 0x8c, 0xa4, 0x67, 0x8, 0x2f, + 0x45, 0x45, 0xa0, 0xf1, 0x67, 0x1, 0x8c, 0x67, + 0xe8, 0x6b, 0x3, 0x88, 0x39, 0x99, 0xde, 0xbd, + 0xb4, 0xf5, 0x99, 0x81, 0xfd, 0x5d, 0x50, 0xa7, + 0xab, 0xd3, 0x8c, 0x58, 0xb3, 0x45, 0xa0, 0x42, + 0x42, 0x58, 0x5, 0x58, 0x87, 0x8c, 0x67, 0x59, + 0xc9, 0xd5, 0x6f, 0x9b, 0x6f, 0x6b, 0x39, 0x81, + 0xde, 0x6f, 0x97, 0x8b, 0x8b, 0xfd, 0xf3, 0x75, + 0x83, 0x39, 0x9, 0xbf, 0x32, 0x9c, 0x7d, 0x39, + 0xc5, 0x2c, 0xab, 0xab, 0x8c, 0xab, 0x1, 0xa8, + 0x60, 0xc9, 0x73, 0x96, 0xa5, 0x67, 0xb3, 0xb3, + 0x2f, 0x27, 0x36, 0x1e, 0x3e, 0x7d, 0x81, 0x9, + 0x32, 0x12, 0xdf, 0x93, 0x97, 0xc0, 0xb4, 0xdf, + 0x27, 0xd8, 0xbf, 0xf3, 0x9c, 0x99, 0xdf, 0x93, + 0x4, 0xc0, 0xb4, 0xdf, 0x93, 0xdd, 0xcc, 0xbd, + 0x6b, 0x40, 0xc6, 0x93, 0x9c, 0x9c, 0xdf, 0x97, + 0x4, 0xbd, 0xbd, 0x99, 0xe5, 0xfd, 0xd8, 0x6c, + 0x77, 0x50, 0x49, 0x8c, 0xd3, 0xac, 0x6d, 0x1c, + 0xe3, 0xd3, 0x8c, 0xe3, 0x4d, 0x4d, 0xa, 0xa, + 0x1c, 0x68, 0x5b, 0x6e, 0x6c, 0x8e, 0x6f, 0xef, + 0xd5, 0xfd, 0x3, 0xd7, 0xd7, 0xa5, 0x5d, 0x4a, + 0x6e, 0xf1, 0x1, 0x24, 0x87, 0xa8, 0x49, 0xad, + 0xc9, 0xa8, 0x4e, 0x88, 0x47, 0x90, 0x27, 0x47, + 0xce, 0xb4, 0xb1, 0x6f, 0xf5, 0xbf, 0xfd, 0x97, + 0xbd, 0xd8, 0x3a, 0x3, 0x36, 0xd8, 0x27, 0x3, + 0x1e, 0xa9, 0x50, 0xab, 0x29, 0x62, 0xd3, 0x5e, + 0xd3, 0xb5, 0xe3, 0x29, 0x1c, 0x3b, 0xe3, 0x29, + 0xb5, 0x87, 0xc5, 0x6b, 0x1e, 0x9c, 0x47, 0xfd, + 0xb4, 0xdd, 0x47, 0x47, 0xe4, 0x32, 0x4, 0xc0, + 0xc6, 0x32, 0x97, 0xbd, 0xb4, 0x93, 0x6f, 0xd8, + 0x7, 0xde, 0x9c, 0x32, 0xb4, 0x32, 0x97, 0xdd, + 0xe4, 0x9c, 0x4, 0x36, 0x57, 0x4, 0xef, 0x8c, + 0x1, 0x5b, 0x6c, 0x9c, 0x93, 0x97, 0x97, 0xbb, + 0xf4, 0x97, 0x97, 0xbb, 0x8d, 0x69, 0x93, 0xf4, + 0xf4, 0x93, 0x93, 0xe2, 0xe2, 0x93, 0x93, 0xf4, + 0x46, 0xd1, 0x23, 0xd1, 0xd1, 0xd1, 0x23, 0x23, + 0x23, 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, + 0x23, 0x0, 0xbf, 0x44, 0xbb, 0xbf, 0x44, 0x44, + 0x44, 0xbb, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xf4, 0xf4, 0xf4, 0xe2, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb5, 0x87, 0xb3, 0x87, 0x87, 0x30, 0x1b, 0x79, + 0x73, 0xa0, 0xa0, 0x67, 0x41, 0x3b, 0x8a, 0x87, + 0x2f, 0xe, 0xd7, 0x6f, 0x7d, 0x6f, 0x6f, 0xde, + 0xdd, 0x4, 0xe5, 0x3a, 0x98, 0x77, 0x2f, 0x58, + 0x82, 0x6d, 0x67, 0x8, 0x68, 0x30, 0xa0, 0xf1, + 0x2f, 0xf1, 0x58, 0xb5, 0x8a, 0x87, 0x30, 0x1b, + 0x1b, 0x19, 0xe5, 0x32, 0x4, 0xd7, 0x4, 0xd8, + 0x3, 0x4, 0x4, 0x83, 0x9d, 0x4, 0x93, 0xe4, + 0xb1, 0x9c, 0x32, 0xdd, 0xfd, 0x4, 0x47, 0xa9, + 0x2c, 0x2f, 0xb3, 0x68, 0xb3, 0x24, 0xb3, 0x42, + 0x79, 0x87, 0x68, 0x2f, 0x64, 0x8c, 0x8c, 0xb3, + 0x2f, 0x77, 0x8e, 0x9c, 0x4, 0x9c, 0xc0, 0xf3, + 0x97, 0xc0, 0xf3, 0x12, 0x97, 0x9d, 0xde, 0xdd, + 0x9c, 0xc0, 0xe4, 0x12, 0x97, 0x93, 0xc0, 0xc0, + 0x4, 0x12, 0xf4, 0xc0, 0x8e, 0xd8, 0xe1, 0xc0, + 0x32, 0xdd, 0xf3, 0x32, 0x93, 0xc0, 0xc0, 0x97, + 0x97, 0xd8, 0xd8, 0x8e, 0x4, 0x18, 0x9d, 0x47, + 0x6c, 0xd5, 0x60, 0x8c, 0x82, 0x78, 0x78, 0xa, + 0x78, 0xac, 0x5e, 0x4d, 0x4d, 0x4d, 0x29, 0x5, + 0xa0, 0x5b, 0xd5, 0xe5, 0x4, 0xd8, 0x36, 0x4, + 0x6f, 0x9d, 0x3e, 0xd7, 0xd7, 0xd7, 0x4a, 0xe, + 0x6e, 0xa5, 0x87, 0xa7, 0xb3, 0x1d, 0x1d, 0x49, + 0xe8, 0x7f, 0x7f, 0x27, 0xc6, 0x84, 0xc0, 0xf3, + 0x8d, 0xe4, 0xde, 0x2e, 0xbf, 0xe1, 0xcf, 0x9d, + 0xd8, 0x81, 0x1e, 0xfd, 0xe1, 0x81, 0xfd, 0xfd, + 0xd8, 0x40, 0x50, 0xab, 0xe3, 0xb5, 0x4d, 0xac, + 0x24, 0x68, 0xb3, 0x5, 0x45, 0xa0, 0x58, 0x6d, + 0xe3, 0xb3, 0x60, 0x98, 0x57, 0x84, 0xc6, 0xf6, + 0xe1, 0xbf, 0xc0, 0xbf, 0xf4, 0xc6, 0xbd, 0xe4, + 0xb4, 0xbf, 0xde, 0x57, 0xe1, 0xbf, 0xe4, 0xb4, + 0xf4, 0xe4, 0xbf, 0xbf, 0xf4, 0xb4, 0xe4, 0x7, + 0x9a, 0xe4, 0xe1, 0x74, 0xcb, 0x47, 0x6c, 0x47, + 0xc9, 0xf0, 0xfd, 0xcc, 0xf4, 0xb4, 0xb4, 0x9a, + 0xb0, 0xf4, 0xf4, 0x9a, 0xf4, 0xf4, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, 0x44, 0xbc, + 0xd1, 0xd1, 0xd1, 0xd1, 0x0, 0x0, 0x23, 0x1c, + 0x23, 0x0, 0x23, 0x23, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x23, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xf4, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x10, 0x0, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa0, 0xa0, 0x73, 0x30, 0x41, 0x30, 0x67, 0x8c, + 0x8c, 0x5, 0x58, 0x41, 0x68, 0xf1, 0x89, 0x42, + 0xf0, 0x6e, 0xe5, 0x9c, 0xc6, 0xbd, 0x32, 0x75, + 0xc6, 0x32, 0x8e, 0xf6, 0x8b, 0xd5, 0x6e, 0x2f, + 0x67, 0x5, 0x45, 0x58, 0xd3, 0x41, 0x24, 0xd3, + 0xab, 0x67, 0xf1, 0x79, 0x68, 0xa0, 0x5b, 0xe, + 0x6b, 0x47, 0x1e, 0x40, 0x53, 0x36, 0xde, 0xf6, + 0x18, 0x1e, 0xbd, 0xbf, 0xb4, 0xf3, 0xc6, 0x95, + 0xe4, 0x26, 0xbf, 0xe4, 0xdb, 0x9d, 0xd8, 0x40, + 0x91, 0xa8, 0x1b, 0xef, 0xe, 0x8, 0x5b, 0xa6, + 0x1, 0xab, 0x1, 0x8c, 0x24, 0x8c, 0x2f, 0xd9, + 0x27, 0x7d, 0x90, 0xe4, 0xe4, 0xce, 0xf4, 0xb4, + 0x90, 0xbc, 0xf4, 0xe4, 0x75, 0xf6, 0xe1, 0xbf, + 0xbb, 0xbf, 0x81, 0xaf, 0x95, 0xb4, 0xf4, 0xbf, + 0xdf, 0x57, 0xb4, 0xf4, 0xb4, 0xc6, 0xbb, 0xbf, + 0xbb, 0xbf, 0xf4, 0xb4, 0xe4, 0x9a, 0x9a, 0xcc, + 0xd8, 0x90, 0x75, 0xb4, 0xb4, 0xc6, 0xf9, 0x90, + 0xd8, 0x53, 0x91, 0xa8, 0x24, 0x5e, 0x76, 0xb5, + 0x1c, 0x78, 0xd1, 0xa, 0x41, 0x76, 0x4d, 0xda, + 0x73, 0x7e, 0x53, 0xd8, 0x90, 0x5c, 0x53, 0x81, + 0x8d, 0x90, 0x7d, 0x6b, 0x47, 0x47, 0xc5, 0x42, + 0x59, 0x9e, 0x64, 0xa8, 0xb8, 0x59, 0x59, 0x4f, + 0x8b, 0x90, 0x90, 0x39, 0xc6, 0xbf, 0xf4, 0xe1, + 0xf9, 0x86, 0x57, 0x57, 0x9a, 0x9a, 0xfc, 0xd8, + 0xe4, 0xbf, 0xbf, 0x4b, 0x90, 0x84, 0x57, 0x53, + 0xea, 0x7e, 0x2c, 0x1, 0xd3, 0x58, 0x82, 0xb5, + 0x68, 0xf1, 0x67, 0xab, 0xc3, 0x87, 0x82, 0xd3, + 0xa7, 0xad, 0xd4, 0x4f, 0x70, 0xe1, 0xb4, 0x4b, + 0xc6, 0xbf, 0xbf, 0xb4, 0xe1, 0xdf, 0xed, 0x57, + 0x7, 0xb4, 0x4b, 0x4b, 0xe4, 0xf4, 0xaf, 0xbf, + 0x4b, 0xc6, 0xe4, 0x9a, 0x9a, 0xe1, 0x4b, 0x57, + 0x9a, 0x84, 0xb4, 0x4b, 0x32, 0x32, 0x4, 0x3, + 0xab, 0xc3, 0x4, 0x9a, 0x9a, 0xb4, 0xf4, 0xb4, + 0xf4, 0xbb, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, 0xe2, + 0xe2, 0x20, 0xf4, 0xf4, 0xf4, 0xf4, 0xb4, 0x58, + 0x76, 0xd1, 0xd1, 0x23, 0x23, 0x23, 0x23, 0x23, + 0x0, 0x23, 0x0, 0x23, 0x0, 0x23, 0x23, 0x29, + 0x16, 0xa, 0xbf, 0x44, 0x44, 0xbb, 0xbf, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xe2, 0xe2, 0xe2, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x30, 0x73, 0xa0, 0x67, 0x8c, 0x41, 0x3b, 0x1c, + 0x24, 0xf1, 0x42, 0x58, 0x87, 0xa0, 0xd2, 0x5d, + 0xe8, 0xd4, 0x39, 0x57, 0xbc, 0x7, 0x84, 0x90, + 0xd8, 0xb4, 0x84, 0xce, 0x39, 0x4f, 0x6e, 0x50, + 0x2f, 0x8c, 0x87, 0x87, 0x8c, 0x58, 0xa6, 0x87, + 0xb5, 0x58, 0x1b, 0xc5, 0x67, 0x30, 0xc9, 0xe8, + 0x3e, 0x98, 0x8b, 0x4f, 0x88, 0x9f, 0xce, 0x81, + 0x90, 0x99, 0xbf, 0xbf, 0xb4, 0xc6, 0xdf, 0x4b, + 0x7, 0xbc, 0xe1, 0x4b, 0x39, 0x47, 0x2e, 0xd8, + 0xe8, 0x64, 0xc9, 0xd5, 0x5d, 0x2f, 0x1, 0xc3, + 0x1, 0x8c, 0x8, 0x2f, 0xa4, 0xb3, 0x60, 0x6a, + 0xe5, 0x7d, 0x7d, 0xdf, 0xb4, 0xbc, 0x9a, 0xdf, + 0x81, 0x4b, 0xb4, 0xe2, 0xc6, 0xdf, 0xdf, 0x95, + 0xf3, 0xbf, 0x4b, 0xf5, 0xc0, 0x57, 0x57, 0xb4, + 0xdf, 0xdf, 0xf4, 0x95, 0xe4, 0xe4, 0xdf, 0xe4, + 0xe4, 0xe4, 0x85, 0xc6, 0xdf, 0x7, 0x57, 0xe4, + 0xc0, 0x9c, 0xdf, 0xdd, 0xde, 0xc6, 0x1e, 0x47, + 0x3, 0x3e, 0x1d, 0xab, 0x82, 0xe3, 0xe3, 0x58, + 0x30, 0xda, 0xd1, 0x16, 0x1c, 0x62, 0xd1, 0x62, + 0x82, 0x64, 0x91, 0xfb, 0x6b, 0x99, 0x1e, 0x32, + 0x9c, 0x32, 0xef, 0xd5, 0xd7, 0x5d, 0x2c, 0x8c, + 0xc3, 0x1f, 0x3f, 0x4e, 0x27, 0x39, 0x27, 0x6c, + 0x9b, 0x81, 0x81, 0x47, 0xdd, 0xb4, 0xd8, 0xdb, + 0x81, 0xf8, 0xd8, 0xd8, 0xe4, 0xe4, 0xf5, 0x8e, + 0xcc, 0xe4, 0xfd, 0x9d, 0x9d, 0x57, 0xdb, 0x91, + 0xb, 0x3e, 0xe9, 0xa6, 0x67, 0x30, 0xa0, 0xda, + 0x58, 0x67, 0xd3, 0xac, 0xac, 0xb5, 0x4d, 0x5e, + 0xc3, 0x96, 0x6e, 0x6b, 0xc6, 0xb4, 0x32, 0xde, + 0xde, 0xe4, 0x97, 0xd8, 0x9f, 0x81, 0x97, 0xbd, + 0xb4, 0xf3, 0x97, 0x93, 0xe4, 0x12, 0x93, 0xc6, + 0xe1, 0xde, 0x8e, 0xe1, 0x57, 0xc6, 0x93, 0xe4, + 0xb4, 0x32, 0x97, 0xe4, 0xd8, 0x4, 0x3, 0x8c, + 0xd3, 0x8c, 0x47, 0xbd, 0x9a, 0x32, 0x97, 0xb4, + 0xf4, 0x93, 0x93, 0xe2, 0xbf, 0x97, 0x93, 0xf4, + 0xe2, 0x12, 0x93, 0x44, 0xe2, 0x32, 0x93, 0x93, + 0x32, 0xd1, 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, + 0x0, 0x23, 0x23, 0x0, 0x0, 0x0, 0x0, 0x23, + 0xa, 0x0, 0xbf, 0x44, 0x95, 0xbf, 0xe2, 0xbb, + 0xbf, 0xbf, 0x95, 0x44, 0xf4, 0xf4, 0xf4, 0x44, + 0xe2, 0xf4, 0xf4, 0xf4, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x87, 0x68, 0x58, 0x8c, 0xab, 0x68, 0xa4, 0x58, + 0xa0, 0x89, 0x2, 0x58, 0xb5, 0xda, 0x67, 0xa8, + 0x2c, 0xd4, 0x6b, 0x9d, 0x53, 0x9c, 0xde, 0xf5, + 0xdf, 0x86, 0x32, 0xd8, 0x83, 0xe8, 0x2f, 0x1, + 0xab, 0x82, 0x87, 0x8c, 0xb3, 0x8, 0x42, 0x30, + 0x58, 0x67, 0x42, 0x2f, 0x8c, 0x82, 0xb3, 0x67, + 0x2c, 0x5d, 0x6b, 0xca, 0x47, 0x6f, 0x8e, 0xce, + 0x32, 0x6c, 0xdd, 0xe4, 0x81, 0x3a, 0x9c, 0xaf, + 0x1e, 0x1e, 0xde, 0xce, 0x6f, 0x6c, 0x47, 0xe5, + 0x79, 0x2f, 0x2f, 0xa5, 0x2f, 0x1, 0x67, 0x2f, + 0x8c, 0x67, 0x42, 0x63, 0x63, 0x8, 0x73, 0xef, + 0xef, 0x43, 0x3, 0xde, 0x47, 0x8b, 0xe1, 0xf3, + 0x32, 0x93, 0xb4, 0xf3, 0x97, 0x97, 0xce, 0xc0, + 0x93, 0xfd, 0x75, 0x93, 0x32, 0x1e, 0xe1, 0xc0, + 0x4, 0xf3, 0xb4, 0xdd, 0x97, 0xdd, 0xe4, 0xf3, + 0x32, 0x81, 0x57, 0xde, 0x4, 0xf3, 0xe4, 0x97, + 0x4, 0x93, 0xbd, 0x8e, 0x97, 0xfd, 0x9d, 0x3, + 0xc5, 0x2c, 0xd3, 0xd3, 0xbe, 0x82, 0x6d, 0x68, + 0xa0, 0x5, 0x1c, 0x29, 0x62, 0xd1, 0xd1, 0x29, + 0x4d, 0x24, 0x67, 0xe, 0x47, 0xbd, 0x32, 0xe5, + 0xe5, 0x6c, 0xd7, 0xd2, 0xa5, 0x2f, 0x8c, 0x8c, + 0x67, 0x64, 0xa8, 0xc5, 0x1e, 0x81, 0x6f, 0x47, + 0x47, 0xce, 0xfd, 0x3, 0x36, 0xc6, 0xf5, 0x28, + 0xdd, 0xe4, 0x93, 0x4, 0xdd, 0xe4, 0x32, 0x4, + 0xfd, 0xbd, 0x6f, 0xa9, 0x9d, 0x9d, 0x98, 0x2c, + 0x3e, 0xa9, 0x7a, 0x1, 0xc3, 0xb3, 0x8c, 0xd3, + 0x82, 0x82, 0x4d, 0x29, 0xe3, 0xe3, 0x62, 0x6d, + 0xb3, 0x1b, 0x9c, 0x47, 0xd8, 0x1e, 0x9c, 0x36, + 0xbc, 0xde, 0x6f, 0x32, 0xc6, 0xde, 0x97, 0x93, + 0x4b, 0xf3, 0x97, 0x12, 0xb4, 0x81, 0x9c, 0xde, + 0x57, 0xfd, 0x97, 0xc4, 0xb4, 0xe4, 0x97, 0xe4, + 0xb4, 0x32, 0x4, 0xe1, 0xbc, 0x6, 0xd3, 0x8c, + 0x41, 0x8c, 0x4, 0x32, 0xdd, 0x97, 0x97, 0xe2, + 0xbf, 0x93, 0x93, 0xf4, 0xf4, 0x26, 0xbd, 0xf4, + 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0x93, 0xf3, 0x8e, + 0xd1, 0xd1, 0x23, 0x34, 0x0, 0x23, 0x0, 0x23, + 0x23, 0x23, 0x0, 0x23, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0xe2, 0xbf, 0xbb, 0xbf, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0xf4, 0xf4, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x41, 0x68, 0x58, 0x1c, 0x68, 0x42, 0x42, 0x2d, + 0xa0, 0x73, 0x89, 0x67, 0x41, 0x1c, 0x1c, 0x1c, + 0xb3, 0xe, 0xd7, 0x32, 0x86, 0x9c, 0x4, 0x8e, + 0xde, 0x47, 0x6c, 0x15, 0x98, 0x2c, 0x2f, 0xe3, + 0xac, 0xb5, 0x58, 0x24, 0xb3, 0xa4, 0x73, 0x2d, + 0x67, 0x24, 0x68, 0x87, 0x24, 0xb5, 0x58, 0x87, + 0xc3, 0x1b, 0xe5, 0xf5, 0x7b, 0xe5, 0xe5, 0xde, + 0x47, 0x3a, 0xfd, 0xdf, 0xfd, 0xe5, 0x93, 0xe4, + 0xf5, 0xe5, 0x8e, 0xde, 0x4, 0x3, 0x77, 0x77, + 0x5d, 0x2f, 0x2f, 0x96, 0x30, 0xa6, 0x42, 0x79, + 0x67, 0x68, 0x8, 0xd2, 0xa5, 0x2f, 0xa6, 0x73, + 0x6e, 0xfb, 0x83, 0xf3, 0x6f, 0x6f, 0x81, 0xf3, + 0x93, 0x93, 0xf8, 0x81, 0x93, 0xde, 0xb4, 0x81, + 0x9c, 0x8e, 0x81, 0xbd, 0x93, 0xf5, 0xf9, 0xf3, + 0x93, 0x12, 0xe1, 0xf5, 0x32, 0xde, 0x57, 0x81, + 0x32, 0xde, 0xe4, 0xc0, 0xf3, 0xc0, 0x4b, 0xf5, + 0x93, 0xc0, 0x57, 0x9d, 0x6c, 0xfd, 0x3a, 0x27, + 0xd5, 0xa6, 0x6, 0xb5, 0x41, 0x78, 0x6d, 0xb5, + 0x8c, 0xd3, 0xd1, 0x62, 0x29, 0xa, 0x78, 0x1c, + 0x30, 0xa4, 0x5b, 0x8f, 0xfd, 0xde, 0x9b, 0x2a, + 0x27, 0x36, 0x3, 0x5d, 0x60, 0xc9, 0x59, 0xc9, + 0xc2, 0xd9, 0xd4, 0xd9, 0xd8, 0xce, 0xde, 0x9d, + 0x25, 0xdf, 0x81, 0x1e, 0xc6, 0x95, 0xdf, 0x32, + 0xf3, 0xbf, 0xf3, 0x99, 0xd8, 0xe4, 0xdd, 0x9d, + 0x9f, 0x83, 0x32, 0x4, 0xc6, 0x57, 0x2a, 0x91, + 0x3e, 0x98, 0x49, 0xd3, 0xa, 0x76, 0x78, 0x4d, + 0x29, 0x87, 0xda, 0xe3, 0xab, 0x67, 0x6d, 0x8a, + 0xa6, 0x27, 0x1e, 0xc4, 0xcb, 0x39, 0xb1, 0x8d, + 0xc6, 0xf8, 0xdf, 0xdf, 0xb4, 0xbf, 0xf3, 0xc6, + 0xdf, 0xde, 0xbf, 0xb4, 0x9a, 0x4b, 0x81, 0xe4, + 0xf4, 0xb4, 0xb4, 0xc6, 0xb4, 0xf4, 0xb4, 0xe2, + 0x75, 0xf6, 0xb4, 0xf4, 0x57, 0x49, 0x8c, 0x8c, + 0x73, 0x8e, 0x32, 0x32, 0xb4, 0xb4, 0xf4, 0xe2, + 0xf4, 0x8d, 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0xf4, + 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x2e, 0xde, 0xa, + 0xd1, 0xd1, 0x0, 0x0, 0x0, 0xd1, 0x23, 0x23, + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x8, 0x2, 0xf1, 0xda, 0x30, 0xf1, 0x2f, 0x8c, + 0xd3, 0x58, 0x30, 0x8c, 0x8c, 0x8c, 0x58, 0x45, + 0x1b, 0xe5, 0x7b, 0x2e, 0x83, 0xca, 0x32, 0xde, + 0x7, 0xa9, 0x7d, 0x39, 0x9d, 0x4f, 0xe7, 0xb3, + 0xda, 0x8a, 0x41, 0xb5, 0xe3, 0x24, 0xb3, 0x58, + 0x1, 0x8c, 0x87, 0xa4, 0x30, 0x8, 0x79, 0x73, + 0xf0, 0xef, 0xfd, 0x2e, 0xde, 0xa9, 0x39, 0xde, + 0x81, 0x9d, 0x1e, 0xdf, 0x9c, 0xc0, 0xbf, 0xbf, + 0xbd, 0x99, 0xd8, 0x81, 0x9d, 0x98, 0xc7, 0xe8, + 0x60, 0x60, 0x77, 0x1b, 0x96, 0x1b, 0xa5, 0xe9, + 0x2f, 0xe3, 0xb3, 0x1, 0x49, 0x49, 0xa8, 0xd4, + 0x7d, 0x1e, 0xe1, 0xb4, 0x81, 0xf5, 0xe2, 0xb4, + 0xe4, 0xe1, 0xf6, 0x81, 0xb4, 0xe4, 0xbf, 0x95, + 0x81, 0xce, 0xbf, 0xbf, 0x12, 0xc6, 0xc6, 0xf4, + 0xf4, 0x9a, 0x57, 0xf9, 0xb4, 0xf4, 0xb4, 0xbf, + 0xc6, 0xbf, 0xbf, 0xbb, 0xbf, 0xf4, 0xc6, 0xd8, + 0xe4, 0xb4, 0x75, 0x90, 0x9c, 0xe4, 0x84, 0x1e, + 0x27, 0x60, 0x1, 0xab, 0xd3, 0x4d, 0xb5, 0x78, + 0x62, 0x78, 0x78, 0xb5, 0x37, 0x62, 0x29, 0x8c, + 0xa6, 0x96, 0xd9, 0xa9, 0x75, 0x85, 0x74, 0x51, + 0x83, 0xc4, 0xf6, 0x88, 0x5c, 0xd4, 0xd4, 0x88, + 0x9f, 0xf6, 0x1e, 0x18, 0x7, 0x9a, 0x9a, 0xc6, + 0x81, 0xbd, 0xb4, 0xb4, 0xbf, 0xbf, 0xe4, 0xb4, + 0x9a, 0xf4, 0xb4, 0xe1, 0xf6, 0xb4, 0xbf, 0xe4, + 0x81, 0x81, 0xbd, 0xe4, 0x8d, 0x9a, 0x53, 0x91, + 0x2b, 0x91, 0x52, 0xd3, 0x6d, 0x62, 0x29, 0x6d, + 0x29, 0x82, 0xda, 0x8c, 0x94, 0xab, 0x24, 0x82, + 0x49, 0x2a, 0x75, 0x84, 0x75, 0xc6, 0xe4, 0xe4, + 0xf4, 0xbf, 0xe4, 0xaf, 0xf4, 0x9a, 0xf4, 0xb4, + 0x9a, 0x9a, 0xbf, 0xf4, 0xbb, 0xf4, 0xbf, 0xaf, + 0xf4, 0xb4, 0xf4, 0xb4, 0xbb, 0x9a, 0xe1, 0xb4, + 0x7, 0x7, 0xb4, 0xf4, 0x9a, 0x4, 0x8c, 0xac, + 0x94, 0x49, 0xe1, 0xf4, 0x9a, 0x9a, 0xf4, 0xf4, + 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0x46, 0xa, 0xd1, + 0xd1, 0x0, 0xd1, 0x23, 0x23, 0x0, 0x23, 0x0, + 0x23, 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, 0x23, + 0xa, 0x16, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x79, 0xa5, 0x79, 0x67, 0x8c, 0x8c, 0xd3, 0x41, + 0xe3, 0x1c, 0xe3, 0x1, 0xa8, 0x67, 0x5b, 0x4c, + 0xd9, 0x8b, 0xd8, 0x84, 0x75, 0x9f, 0xc6, 0xb4, + 0xe1, 0x90, 0x9c, 0xc4, 0xd8, 0x9d, 0x7c, 0x60, + 0x58, 0xb5, 0x58, 0xe3, 0xda, 0xe3, 0x82, 0xe3, + 0x87, 0x30, 0xb3, 0xb3, 0xc3, 0x2f, 0x5a, 0xa5, + 0xc5, 0x3e, 0xdb, 0xe1, 0xe1, 0xd8, 0x90, 0xe4, + 0xe4, 0xe4, 0xe4, 0xc0, 0xe4, 0xb4, 0xb4, 0xe2, + 0xce, 0x40, 0x18, 0x57, 0xd8, 0x83, 0x27, 0x4e, + 0x1, 0xc7, 0x6e, 0x77, 0x1b, 0x2f, 0xc7, 0x2c, + 0x2f, 0x1, 0x2f, 0x59, 0x67, 0xad, 0x77, 0xc5, + 0xfb, 0x1e, 0xc6, 0xe1, 0xe4, 0xe4, 0xbc, 0x7, + 0xb4, 0xbf, 0xe1, 0xc0, 0xf3, 0xb4, 0xf4, 0xf4, + 0xc0, 0x8d, 0xb4, 0x7, 0xbf, 0x8d, 0xbc, 0x9a, + 0xcc, 0xf4, 0xb4, 0xbb, 0xbf, 0xb4, 0xf4, 0xbf, + 0xc0, 0xb4, 0xbf, 0x7, 0xbf, 0xb4, 0x9a, 0x75, + 0xc6, 0xbf, 0xf4, 0xbd, 0xbd, 0xce, 0x81, 0x3a, + 0x5d, 0xa8, 0xbe, 0x82, 0xb5, 0x82, 0xd3, 0x1c, + 0xda, 0x6d, 0x3b, 0x78, 0xa, 0x76, 0x78, 0x6d, + 0x58, 0x60, 0x27, 0xe8, 0x8b, 0x4b, 0xc6, 0x1e, + 0x1e, 0xb4, 0xcb, 0x5c, 0x48, 0xb8, 0xe8, 0xb8, + 0x51, 0x9f, 0x8e, 0x1e, 0x83, 0xc6, 0x81, 0xde, + 0xde, 0xb4, 0xc6, 0x81, 0xe1, 0xb4, 0xc0, 0xde, + 0xf6, 0x85, 0xfa, 0xc0, 0xe4, 0xbf, 0x81, 0x97, + 0xe4, 0xbd, 0x97, 0x36, 0x53, 0x57, 0xa9, 0x91, + 0x91, 0x8c, 0xa8, 0x8c, 0x82, 0x8a, 0x3b, 0xb5, + 0xda, 0x29, 0x4d, 0x78, 0xbe, 0xbe, 0xb5, 0x1, + 0xc7, 0x7c, 0x6b, 0xdd, 0xb4, 0xe4, 0x8e, 0xf5, + 0x4b, 0xde, 0x32, 0xbd, 0x7, 0xf6, 0xdd, 0xb4, + 0xf4, 0xe4, 0xc0, 0xfa, 0x95, 0xbb, 0x93, 0xbf, + 0xc6, 0xe1, 0xfd, 0xbf, 0x9a, 0x75, 0xfd, 0xbf, + 0xbf, 0x93, 0x4, 0x32, 0x9c, 0x3, 0x8c, 0x41, + 0xb5, 0xac, 0x1, 0xb4, 0xf4, 0xf4, 0x69, 0xf4, + 0xf4, 0x93, 0x93, 0xf4, 0xf4, 0x69, 0x12, 0xf4, + 0xe2, 0x32, 0x36, 0x69, 0x93, 0x93, 0x8a, 0x1c, + 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0xa, 0xe2, 0x95, 0x44, 0xbf, 0x44, 0x44, + 0x95, 0xf4, 0xf4, 0xe2, 0xf4, 0xe2, 0x44, 0x44, + 0xe2, 0xe2, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb3, 0x8c, 0x67, 0x2f, 0x8c, 0x41, 0x5, 0xa0, + 0xa0, 0x8, 0x58, 0x58, 0xb3, 0x8c, 0x1, 0x67, + 0x60, 0xa5, 0x27, 0xcc, 0xc4, 0x83, 0x32, 0xdf, + 0xc6, 0x32, 0x47, 0x70, 0x8b, 0x5d, 0x49, 0x1, + 0x8c, 0xe3, 0x82, 0x5, 0xf1, 0x8, 0x8, 0xa4, + 0x30, 0x30, 0x58, 0xe3, 0xe3, 0xe3, 0x82, 0x2f, + 0xe7, 0xa5, 0xe8, 0x39, 0x9c, 0x4, 0x32, 0xce, + 0x9c, 0x9c, 0xfd, 0xe4, 0xc0, 0x47, 0x9d, 0x81, + 0x32, 0x4, 0x1e, 0x4b, 0x6b, 0x47, 0xef, 0xa5, + 0x67, 0xb3, 0x64, 0x49, 0x2f, 0x2f, 0xc3, 0xb3, + 0x79, 0x79, 0xa5, 0x5b, 0x5b, 0x73, 0x6e, 0xd5, + 0xd5, 0xd5, 0x7c, 0x8b, 0x47, 0x4, 0xc6, 0x99, + 0x6f, 0x93, 0xf3, 0xf3, 0x97, 0x99, 0xc0, 0xb4, + 0x93, 0x32, 0x9f, 0x18, 0x97, 0xf3, 0xbf, 0xc6, + 0x99, 0x81, 0xbf, 0x12, 0x93, 0xc0, 0x4b, 0xde, + 0x32, 0x12, 0x9a, 0x9d, 0x8e, 0xf3, 0xe4, 0xf3, + 0x6f, 0x99, 0x81, 0x8e, 0x4, 0xfd, 0xa9, 0x60, + 0x49, 0xab, 0x66, 0x37, 0x4d, 0xe3, 0x87, 0x58, + 0x24, 0xda, 0xb5, 0x82, 0x62, 0xa, 0x78, 0x29, + 0x29, 0x67, 0xd5, 0x4a, 0x6b, 0x99, 0x9c, 0x6c, + 0x47, 0x90, 0x4f, 0x50, 0x2c, 0xa3, 0xe8, 0xe8, + 0x4f, 0xdf, 0x7b, 0x4, 0x8e, 0xdf, 0x9c, 0x4, + 0xfd, 0xdd, 0xde, 0x6b, 0x40, 0xe1, 0xdd, 0x97, + 0x99, 0xf5, 0x93, 0x97, 0xf3, 0xe4, 0x99, 0x9c, + 0xde, 0xc6, 0x47, 0x6b, 0xa9, 0x40, 0x1e, 0x77, + 0xa5, 0xa8, 0x58, 0x58, 0xd3, 0xb5, 0xb5, 0x8a, + 0xe3, 0xe3, 0xb5, 0x6d, 0x6d, 0x4d, 0xac, 0xa6, + 0x8f, 0x6b, 0xe5, 0x9c, 0xe4, 0xe4, 0x97, 0x6f, + 0x90, 0x40, 0x4, 0x12, 0xb4, 0xdf, 0x97, 0xc0, + 0xbf, 0xe4, 0x97, 0xc0, 0xbf, 0xbf, 0xdd, 0xe4, + 0xb4, 0xf8, 0x97, 0x8d, 0xf4, 0xe4, 0x9c, 0xe4, + 0xf4, 0x93, 0x4, 0x8e, 0xfd, 0xab, 0xd3, 0xd3, + 0xe3, 0x24, 0x6b, 0xb4, 0xe2, 0xb4, 0x93, 0xf4, + 0xe2, 0x12, 0x69, 0xf4, 0xf4, 0x93, 0x26, 0xe2, + 0xe2, 0x12, 0x93, 0xc0, 0x12, 0x93, 0x3b, 0x23, + 0x23, 0x0, 0xd1, 0x0, 0x23, 0x0, 0x23, 0x0, + 0x23, 0x23, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x23, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xf4, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x58, 0x6d, 0x58, 0x8, 0x42, 0x30, 0xa0, 0x5b, + 0x89, 0x79, 0xf1, 0x58, 0x5, 0xb5, 0x8a, 0xb3, + 0x96, 0xc9, 0x6e, 0x9c, 0xde, 0x4, 0x6c, 0x9c, + 0x6b, 0x6c, 0x3, 0x36, 0xfb, 0xa8, 0xab, 0xd3, + 0x24, 0x24, 0xb5, 0x87, 0x42, 0x63, 0x79, 0x30, + 0x30, 0x58, 0x8c, 0xe3, 0x3b, 0xe3, 0xb5, 0x58, + 0x1b, 0xd5, 0xd7, 0x7d, 0x9c, 0x6c, 0xfd, 0xe4, + 0x9c, 0x27, 0xc8, 0x81, 0x32, 0x97, 0x9c, 0x9, + 0x32, 0x4, 0x32, 0x81, 0x6b, 0xef, 0x5d, 0x50, + 0xa6, 0x87, 0x1, 0xb3, 0x73, 0x1b, 0x2f, 0x8c, + 0xa6, 0xd2, 0xe, 0x42, 0xa6, 0x5b, 0x2f, 0x50, + 0xef, 0xe5, 0x27, 0x6b, 0x97, 0x4, 0xe4, 0xf8, + 0x97, 0x93, 0xe4, 0xde, 0x4, 0x6f, 0x81, 0x9f, + 0x97, 0x12, 0xc6, 0x9c, 0x93, 0x12, 0xb4, 0xe2, + 0x93, 0x12, 0xaf, 0xe4, 0x12, 0x12, 0x81, 0xd8, + 0x97, 0xf3, 0xb4, 0xf3, 0x93, 0x95, 0xf4, 0x12, + 0x93, 0x9c, 0xde, 0x9d, 0x3, 0x1e, 0xdb, 0x4e, + 0x1, 0x8c, 0xe3, 0x78, 0x62, 0x62, 0xe3, 0xe3, + 0x78, 0xe3, 0xe3, 0xac, 0x78, 0xb5, 0xda, 0x8a, + 0x3b, 0x73, 0xc2, 0xd7, 0x47, 0xde, 0xff, 0xfd, + 0xc8, 0x53, 0x53, 0x7f, 0x48, 0x18, 0x90, 0x47, + 0x1e, 0xb9, 0x12, 0x93, 0xf3, 0xe4, 0xde, 0x8e, + 0xcf, 0x7, 0xe4, 0xde, 0xc6, 0xbf, 0xb4, 0xf3, + 0xc0, 0xbf, 0xbf, 0xf3, 0xe4, 0x7, 0xe4, 0xbd, + 0x57, 0x57, 0x93, 0x32, 0xde, 0x81, 0xb9, 0x47, + 0xa9, 0x2c, 0x24, 0xe3, 0x76, 0x62, 0x62, 0xe3, + 0x82, 0x82, 0x87, 0xa4, 0x87, 0x82, 0xda, 0xad, + 0x27, 0xc6, 0xd8, 0xbf, 0x7, 0xbc, 0x81, 0xf3, + 0xe4, 0xb4, 0xb0, 0xbf, 0xb4, 0xf4, 0xbf, 0xbb, + 0xe2, 0xb4, 0xe4, 0xf4, 0xb4, 0x7, 0xb4, 0xb4, + 0xf4, 0xf4, 0xb4, 0xf4, 0xf4, 0xf4, 0xaf, 0xb4, + 0xf4, 0x9a, 0x7, 0x9a, 0x9a, 0x52, 0xab, 0xd3, + 0x4, 0x97, 0x32, 0xf4, 0xf4, 0xe2, 0x20, 0xe2, + 0xf4, 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xf4, 0xe2, 0xf4, 0xc0, 0xd1, 0xd1, 0x23, + 0x0, 0xd1, 0x0, 0x0, 0x23, 0x23, 0x0, 0x23, + 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa0, 0xa4, 0x58, 0x73, 0x1b, 0xf1, 0x67, 0x73, + 0x2f, 0x8c, 0x2f, 0x8c, 0x8c, 0x24, 0x87, 0xc9, + 0xef, 0x6b, 0x6f, 0x81, 0xe4, 0xde, 0xfd, 0xc4, + 0x9c, 0x9d, 0x9d, 0x9f, 0x1e, 0xe8, 0x60, 0xad, + 0x5b, 0x87, 0xda, 0xb5, 0x67, 0x67, 0x8c, 0x1, + 0x8c, 0x24, 0x58, 0x67, 0x73, 0xa0, 0x30, 0x30, + 0x6e, 0x6b, 0x36, 0x1e, 0xed, 0xd8, 0x53, 0x57, + 0xc6, 0xc6, 0x81, 0xd8, 0xe4, 0xbd, 0xe4, 0xce, + 0xbd, 0xde, 0xe1, 0x75, 0xd8, 0xc8, 0x91, 0x1d, + 0x2f, 0xf1, 0x73, 0xc9, 0x5b, 0x6e, 0xe9, 0xa6, + 0x8, 0x73, 0x2f, 0xab, 0x2f, 0x2f, 0x64, 0x22, + 0x27, 0xde, 0xce, 0xbf, 0xb4, 0xb4, 0xb4, 0xf4, + 0x95, 0xe4, 0xe1, 0xcf, 0xe1, 0xe4, 0xf4, 0xb4, + 0xe4, 0xbf, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, 0xf4, + 0xbf, 0xf4, 0xe2, 0x7, 0x9a, 0xe2, 0xf4, 0xf4, + 0xb4, 0xf4, 0xf4, 0xf4, 0xb4, 0xcc, 0xb4, 0xb4, + 0xe1, 0xbf, 0xf4, 0x75, 0xf6, 0x81, 0x81, 0x98, + 0x49, 0xc3, 0x87, 0x29, 0xa, 0xe3, 0x6d, 0x62, + 0xd1, 0x78, 0xa, 0xa, 0xa, 0x87, 0x30, 0x8, + 0x8, 0xf0, 0xd4, 0x39, 0x9f, 0x7, 0xe1, 0x9f, + 0x7f, 0x40, 0x4b, 0xc6, 0x4b, 0x4b, 0x84, 0xe4, + 0xe1, 0x9a, 0xc6, 0xb4, 0x7, 0x9a, 0xe4, 0xe1, + 0x4b, 0x4b, 0xbf, 0xbf, 0xb4, 0xf4, 0xe4, 0xb4, + 0xe2, 0xf4, 0xf4, 0x9a, 0x75, 0xbc, 0xf4, 0xe4, + 0xe4, 0x4b, 0xe4, 0xbf, 0x9a, 0xe1, 0x9f, 0x40, + 0x51, 0x2c, 0xd3, 0x6d, 0x78, 0x62, 0xe3, 0x68, + 0x82, 0xac, 0x87, 0x30, 0x67, 0xab, 0x87, 0xad, + 0x4f, 0xdb, 0x9f, 0x9a, 0xf9, 0x90, 0xfa, 0xb4, + 0xbb, 0xb4, 0xb4, 0xb4, 0x95, 0xf4, 0x9a, 0xf4, + 0x4b, 0x9a, 0x9a, 0xf4, 0xe2, 0xb4, 0xbf, 0xe2, + 0xf4, 0xf4, 0xf4, 0xcc, 0xbf, 0xf4, 0x7, 0xe2, + 0x9a, 0xc6, 0x9a, 0x9a, 0xf4, 0x59, 0xd3, 0xd3, + 0xfd, 0xe1, 0x8d, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0x44, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, 0x69, 0x32, + 0x12, 0x93, 0x12, 0x46, 0xa, 0xd1, 0x0, 0x0, + 0xd1, 0x0, 0x23, 0x23, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, + 0xa, 0xbf, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xe2, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x42, 0xd2, 0x2, 0x5b, 0x8, 0x58, 0x58, 0x2f, + 0x52, 0xe3, 0xd3, 0xf1, 0xe7, 0xb3, 0x68, 0xc9, + 0x39, 0x1e, 0xd8, 0xe1, 0xf9, 0xf6, 0x53, 0xe1, + 0xb4, 0x9f, 0x90, 0xf9, 0xc6, 0x3, 0xe8, 0x59, + 0x59, 0xb3, 0xd3, 0x58, 0x58, 0x41, 0xb5, 0x8c, + 0x89, 0x2f, 0x24, 0xa4, 0x42, 0xd2, 0x2f, 0x59, + 0xc9, 0x6e, 0xdb, 0x53, 0x81, 0xdf, 0x39, 0xc6, + 0xe4, 0xe4, 0xb0, 0xfa, 0xdf, 0xe4, 0xb0, 0x7, + 0xe1, 0x39, 0x18, 0xa2, 0x9b, 0x40, 0x7a, 0x49, + 0x42, 0xfb, 0xe7, 0x67, 0xc9, 0x73, 0x4e, 0x49, + 0x1, 0xb3, 0xb3, 0x58, 0x8, 0x1b, 0xa8, 0x59, + 0xfb, 0x1e, 0xc6, 0xc6, 0x99, 0xdf, 0xe4, 0x57, + 0xc6, 0xaf, 0xdf, 0x39, 0x97, 0xf3, 0xb4, 0xe2, + 0xdf, 0xc6, 0xbf, 0xcc, 0xe1, 0xf9, 0x4b, 0xb4, + 0xe1, 0xf4, 0xf4, 0xf9, 0x81, 0x12, 0xe2, 0xbb, + 0xdf, 0xc6, 0x95, 0xb4, 0xd8, 0xe1, 0xdf, 0x81, + 0xc0, 0xbf, 0xb4, 0xdf, 0x39, 0xde, 0x1e, 0x5d, + 0xab, 0xb5, 0x82, 0xac, 0xd3, 0xe3, 0x87, 0xb5, + 0x16, 0x4d, 0xb5, 0x62, 0xa, 0x1c, 0x8c, 0xd3, + 0x82, 0xc3, 0x96, 0xd9, 0xa9, 0x83, 0x81, 0x6a, + 0x6f, 0x9c, 0xde, 0xff, 0x70, 0x90, 0xdf, 0xbd, + 0xd8, 0x74, 0x90, 0x99, 0xf3, 0xe4, 0xdd, 0x9c, + 0x9c, 0xe4, 0xf3, 0x12, 0xf3, 0xb4, 0x81, 0xf3, + 0x9a, 0x57, 0xe1, 0xf5, 0x81, 0xe4, 0xdd, 0xf3, + 0xdf, 0x81, 0x93, 0x93, 0xd8, 0x53, 0x2a, 0x77, + 0x50, 0x94, 0xab, 0x87, 0xda, 0x6d, 0xda, 0x8, + 0x24, 0x62, 0x62, 0x24, 0xac, 0x78, 0xb5, 0xb3, + 0x96, 0xfb, 0x6b, 0x8e, 0xc6, 0xf5, 0x97, 0xc0, + 0x8d, 0xbf, 0xfd, 0xdd, 0xf4, 0xcc, 0xd8, 0xb2, + 0xc6, 0xc0, 0x93, 0xbb, 0xf4, 0xf8, 0x93, 0x12, + 0xe2, 0x95, 0x47, 0x8e, 0xbf, 0x69, 0x47, 0x85, + 0xb4, 0x93, 0x97, 0xb4, 0xe4, 0x4, 0x6, 0xb5, + 0xd3, 0x30, 0xd3, 0xfd, 0xf4, 0x32, 0x32, 0xe2, + 0xf4, 0x12, 0x93, 0xe2, 0xf4, 0x93, 0x93, 0x97, + 0x93, 0x93, 0x97, 0xa, 0xd1, 0x23, 0xd1, 0x0, + 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xbf, 0x95, 0x44, 0x95, 0xf4, 0xf4, 0x44, + 0xf4, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, + 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x2f, 0x2f, 0x1, 0x30, 0xa4, 0xb3, 0x8c, 0x79, + 0x73, 0x58, 0x41, 0x73, 0x2f, 0x8c, 0x58, 0xa0, + 0x1b, 0xef, 0x3e, 0x83, 0x39, 0x99, 0x47, 0xde, + 0xe4, 0xfd, 0xe5, 0x1e, 0xfd, 0x27, 0x2c, 0xb3, + 0x87, 0x87, 0x1, 0x67, 0x30, 0x30, 0x45, 0x73, + 0xd2, 0x2, 0x58, 0x58, 0xa6, 0x67, 0x24, 0xb3, + 0x96, 0x6e, 0x8f, 0x40, 0x36, 0x6f, 0x6f, 0xb1, + 0x12, 0x32, 0xdd, 0x81, 0x9c, 0x97, 0xd8, 0x53, + 0x1e, 0x9c, 0x36, 0xd8, 0x47, 0xe5, 0xa5, 0xb3, + 0x8, 0x2f, 0x8c, 0x1, 0xb3, 0x67, 0x8c, 0x1, + 0x2f, 0x96, 0x73, 0x5b, 0x42, 0xe, 0x73, 0x8, + 0x77, 0xe5, 0xfd, 0x9d, 0xef, 0x6f, 0x12, 0x81, + 0x32, 0x93, 0xc0, 0x93, 0x4, 0x93, 0xe4, 0xf3, + 0x9c, 0x93, 0xbf, 0x57, 0x9d, 0xf3, 0xe4, 0xb4, + 0x93, 0x12, 0xbb, 0xf3, 0x97, 0xf3, 0xbf, 0xf3, + 0x4, 0xc0, 0x95, 0xb1, 0x3, 0xf3, 0xf3, 0x93, + 0x97, 0xdd, 0xbf, 0xbd, 0x47, 0x47, 0x3, 0x60, + 0xd3, 0xb5, 0x4d, 0xac, 0xb5, 0x58, 0x68, 0x5, + 0x3b, 0x41, 0x8a, 0x29, 0x62, 0x62, 0x5e, 0x76, + 0xe3, 0x58, 0x1b, 0x19, 0xe5, 0x1e, 0xf5, 0x4, + 0xe0, 0x2e, 0xbd, 0x6f, 0xfd, 0x57, 0x70, 0x97, + 0xd8, 0x75, 0xdd, 0x4, 0x93, 0xe4, 0xbd, 0x4, + 0xaf, 0x12, 0xdd, 0x97, 0xdd, 0x7, 0xbd, 0x32, + 0x12, 0xe4, 0xf3, 0x93, 0xf3, 0xe4, 0xbd, 0x93, + 0xc0, 0xde, 0xfd, 0x9c, 0xd8, 0x51, 0xa9, 0xd5, + 0x2f, 0x8c, 0x6d, 0x58, 0x58, 0x41, 0x82, 0xb3, + 0xb5, 0xb5, 0x6d, 0xb5, 0xe3, 0x6d, 0x6d, 0x87, + 0x2f, 0x6e, 0xd7, 0x4, 0xb4, 0xdd, 0xfd, 0xde, + 0xb4, 0xe1, 0x1e, 0xdd, 0xb4, 0xbf, 0x93, 0xf3, + 0xbf, 0xc0, 0x93, 0x95, 0xbb, 0xbb, 0x93, 0xbb, + 0xcd, 0x95, 0x97, 0x95, 0xf4, 0xc0, 0x97, 0xbf, + 0xbf, 0x32, 0x97, 0xe4, 0xb4, 0x47, 0x3a, 0xd3, + 0xe3, 0x45, 0x30, 0x32, 0xf4, 0xf4, 0x12, 0xbb, + 0xe2, 0x93, 0x93, 0xf4, 0x12, 0x93, 0x93, 0x97, + 0x93, 0x93, 0x3b, 0x8a, 0xb1, 0x23, 0x0, 0x23, + 0x0, 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x9a, 0xbb, 0x44, 0x44, 0xf4, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xe2, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, + 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x29, 0xd3, 0x41, 0x8, 0x73, 0x30, 0x8, 0x42, + 0x42, 0x73, 0x30, 0x67, 0x67, 0xb5, 0xe3, 0x8c, + 0xae, 0xa5, 0xef, 0xfd, 0xc0, 0x4, 0x9c, 0xdd, + 0x1e, 0x47, 0xe5, 0x9d, 0x3, 0x77, 0x67, 0x8c, + 0xb3, 0x58, 0x58, 0x8, 0x42, 0x89, 0x8, 0x30, + 0xf1, 0x2f, 0x8c, 0x82, 0x58, 0xe3, 0x29, 0x8c, + 0xe, 0x4a, 0xe5, 0x9c, 0x32, 0x4, 0x97, 0xbd, + 0xde, 0x9c, 0xfd, 0x57, 0xfd, 0x97, 0xf5, 0xdf, + 0x32, 0x4, 0x93, 0x8e, 0x47, 0xd7, 0xc5, 0x2c, + 0x1, 0x87, 0x87, 0x58, 0x2f, 0xf0, 0xa6, 0x8, + 0xe7, 0x63, 0x79, 0x8, 0x67, 0xa6, 0x5a, 0x2c, + 0x7a, 0x27, 0x83, 0x83, 0x47, 0x97, 0xe4, 0x81, + 0x32, 0xc0, 0xe4, 0x8d, 0xfd, 0x9c, 0xe4, 0xdd, + 0xd8, 0xdd, 0x95, 0xc4, 0x93, 0xc0, 0xbb, 0xaf, + 0x93, 0xe4, 0xbf, 0xe2, 0xb9, 0xdd, 0xb4, 0xc0, + 0xbd, 0xe4, 0xbf, 0x12, 0xf5, 0xf3, 0xbf, 0xf3, + 0xde, 0x81, 0xb4, 0x81, 0x3a, 0xdb, 0x77, 0x59, + 0x1, 0xd3, 0x76, 0x6d, 0xe3, 0x24, 0x87, 0xb5, + 0x1c, 0x4d, 0x6d, 0xb5, 0x62, 0xb5, 0x6d, 0xda, + 0x58, 0x73, 0xef, 0x9c, 0x6b, 0x39, 0x1e, 0x47, + 0x2e, 0x57, 0xf6, 0xf5, 0x81, 0xe1, 0x81, 0xce, + 0xdf, 0xe4, 0xb4, 0xf3, 0xe4, 0x4b, 0x1e, 0x97, + 0xe4, 0xe1, 0xe4, 0xf5, 0xe4, 0xbf, 0xaf, 0xb4, + 0xbf, 0xb4, 0xb4, 0xf3, 0xbf, 0x9a, 0x9f, 0xd8, + 0xe4, 0x7, 0x81, 0x9c, 0x9c, 0xd8, 0xe5, 0xd7, + 0x2f, 0xe3, 0xac, 0x78, 0xb5, 0x37, 0x4d, 0xe3, + 0x1a, 0xd3, 0xd3, 0x87, 0x68, 0xda, 0x41, 0x5b, + 0x73, 0xc2, 0x7c, 0xd8, 0xb4, 0xe1, 0x74, 0xe1, + 0x4b, 0xbf, 0xb4, 0xbf, 0xe2, 0xbf, 0xbf, 0xe2, + 0xf4, 0x44, 0xe1, 0xb4, 0xf4, 0xe2, 0xb4, 0xf4, + 0x8d, 0xbf, 0xbf, 0xf4, 0xf4, 0xe2, 0xe4, 0xe1, + 0xf4, 0xf4, 0x9a, 0x7, 0xf4, 0xf4, 0x8e, 0xa6, + 0xa4, 0x45, 0x32, 0xf4, 0xe2, 0x20, 0xe2, 0xf4, + 0xe2, 0x44, 0xe2, 0xe2, 0xf3, 0x93, 0x93, 0x93, + 0x12, 0x3b, 0x3b, 0x16, 0x17, 0xd1, 0x0, 0xd1, + 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x23, + 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9a, 0xe2, 0x44, 0x44, 0xf4, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xe2, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, + 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x24, 0x8a, 0x58, 0xd2, 0xe7, 0xb3, 0xb3, 0xb3, + 0x2f, 0x67, 0xd3, 0x24, 0x58, 0x87, 0xb3, 0x60, + 0x6e, 0xd4, 0x7d, 0xdf, 0xe4, 0xf3, 0xd8, 0x90, + 0x90, 0xde, 0xc8, 0x51, 0x8b, 0xd4, 0xa5, 0x4e, + 0x60, 0x8c, 0xda, 0x68, 0x2f, 0x8c, 0x8c, 0xd3, + 0x82, 0x24, 0x8c, 0xab, 0xb3, 0xa4, 0x30, 0xf0, + 0x3, 0x47, 0x6a, 0x88, 0x90, 0xb1, 0x8d, 0xbc, + 0xf6, 0x9c, 0xbf, 0xe1, 0xcd, 0xbd, 0x4b, 0x81, + 0xe4, 0x8d, 0xce, 0xcb, 0x7c, 0x3a, 0x98, 0x91, + 0x64, 0x8, 0xad, 0xe9, 0xd2, 0xe, 0x73, 0x5b, + 0x42, 0xe7, 0x2f, 0x8c, 0x87, 0x24, 0x52, 0x22, + 0x88, 0x83, 0x99, 0xed, 0xde, 0xe4, 0xbf, 0xdf, + 0x90, 0xe1, 0xb4, 0xb0, 0xf6, 0x90, 0xc0, 0xf4, + 0xbf, 0xbf, 0xbf, 0xdf, 0xbb, 0xf4, 0x95, 0xbb, + 0x4b, 0xdf, 0xb4, 0xbf, 0xe1, 0xe1, 0x4b, 0xbf, + 0xb4, 0xe2, 0xb4, 0xdf, 0xdf, 0xb4, 0x9a, 0xb4, + 0x57, 0x18, 0x84, 0x85, 0xd8, 0x18, 0x4f, 0xd4, + 0x8c, 0x94, 0xbe, 0x6d, 0x6d, 0x82, 0x66, 0x29, + 0xac, 0x4d, 0x4d, 0x62, 0xe3, 0xd3, 0x82, 0x5, + 0xa0, 0xe8, 0x40, 0x9b, 0x8b, 0x7e, 0x88, 0xed, + 0xe1, 0xf6, 0x90, 0x81, 0xce, 0xb4, 0x8d, 0xce, + 0xc6, 0xe4, 0xb4, 0xf4, 0xb4, 0xcb, 0xf6, 0xe4, + 0xbf, 0xb4, 0xbf, 0xe4, 0xc0, 0xf4, 0xe2, 0xbf, + 0xbf, 0x4b, 0xb0, 0xb4, 0xf4, 0x7, 0xf6, 0xc6, + 0xb4, 0xe1, 0xc6, 0xde, 0xed, 0xd8, 0x3a, 0x5d, + 0x2f, 0xd3, 0x76, 0x62, 0x6d, 0xb5, 0xb5, 0x4d, + 0x4d, 0xd3, 0x8c, 0x8c, 0xb3, 0x87, 0x87, 0x2f, + 0xa9, 0x6b, 0x2a, 0xf6, 0xe1, 0xb4, 0xce, 0xb4, + 0x95, 0xbf, 0xbf, 0xb4, 0xf4, 0xbf, 0xc6, 0x9a, + 0xf4, 0xbf, 0x70, 0xb4, 0xbf, 0xf4, 0xf4, 0xf4, + 0xe2, 0xaf, 0xe2, 0xbf, 0xe2, 0xb4, 0xe1, 0x57, + 0x9a, 0xbf, 0xb4, 0xf4, 0xb4, 0xe4, 0x32, 0x8e, + 0xab, 0xa4, 0x8e, 0xf4, 0xf4, 0xf4, 0xf4, 0x9a, + 0xf4, 0x12, 0x93, 0x93, 0x93, 0x93, 0x93, 0xf3, + 0xdd, 0x3b, 0x23, 0xd1, 0x34, 0xd1, 0xd1, 0x0, + 0x0, 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0xf4, 0x44, 0x44, 0xe2, 0xf4, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0xe2, 0x44, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa6, 0x30, 0x8, 0x2f, 0x2c, 0x8c, 0x8c, 0xe3, + 0x24, 0xe3, 0xe3, 0xab, 0x65, 0xb3, 0x2f, 0xe8, + 0x8b, 0x7d, 0x7d, 0x9f, 0xc6, 0xc6, 0x9f, 0x8b, + 0xde, 0xd8, 0x1e, 0x81, 0x8b, 0x7d, 0xd9, 0x3e, + 0x50, 0x67, 0x58, 0xd3, 0x8c, 0x41, 0x58, 0x8c, + 0x24, 0xb5, 0x8c, 0x67, 0x58, 0x5, 0x73, 0xc9, + 0x2a, 0x1e, 0x1e, 0x88, 0x18, 0xd8, 0xdd, 0xe4, + 0xc6, 0xf3, 0xf3, 0xbf, 0xe4, 0xdd, 0xdf, 0xd8, + 0xbc, 0xd8, 0xe1, 0x9f, 0x3e, 0x7c, 0xb8, 0x67, + 0xc3, 0x8c, 0xc3, 0xa5, 0x77, 0x63, 0xc5, 0x2f, + 0xa6, 0x2f, 0x2f, 0xa6, 0xb3, 0x8c, 0x87, 0x7e, + 0x27, 0x47, 0x81, 0xbd, 0xdd, 0xfd, 0xbf, 0xe4, + 0x8b, 0x8b, 0xc6, 0xdd, 0xdd, 0x9c, 0xe4, 0xe4, + 0x12, 0xb4, 0xf4, 0xbf, 0xc0, 0xe1, 0xb4, 0xbf, + 0xd8, 0xd8, 0xb4, 0xe4, 0x12, 0xbf, 0xbf, 0xf3, + 0xc0, 0xe4, 0xe4, 0xce, 0x47, 0x53, 0x75, 0xbd, + 0x1e, 0xc6, 0xde, 0xfd, 0x1e, 0x1e, 0xa9, 0xa8, + 0x82, 0xbe, 0x78, 0x78, 0x4d, 0xbe, 0xab, 0xb5, + 0xda, 0x82, 0x6d, 0x62, 0x4d, 0xac, 0x37, 0x4d, + 0x6d, 0x52, 0x4e, 0x27, 0x6b, 0x8b, 0x7d, 0x7d, + 0xf5, 0xc6, 0xc0, 0x93, 0x9, 0xc6, 0xde, 0x8e, + 0xdd, 0x57, 0x9f, 0x9c, 0xce, 0xb4, 0xde, 0x32, + 0xdd, 0xe2, 0x12, 0x93, 0x95, 0xbb, 0xc6, 0x12, + 0xe4, 0xb4, 0x81, 0xde, 0xe4, 0xb4, 0xf3, 0x93, + 0xf3, 0x81, 0x7b, 0x4, 0x47, 0x3, 0x2c, 0xab, + 0xd3, 0xd3, 0xe3, 0x82, 0x5, 0xa0, 0x67, 0x41, + 0x1c, 0xb5, 0x6d, 0x62, 0x62, 0x6d, 0xab, 0x64, + 0x60, 0x6b, 0xe5, 0xff, 0xe1, 0xb4, 0x12, 0xde, + 0xb4, 0xbf, 0x4, 0xd8, 0x95, 0xbf, 0x97, 0xc6, + 0xbf, 0xb4, 0x93, 0xc0, 0xf4, 0xaf, 0x97, 0xbf, + 0xf4, 0x12, 0x4, 0xfd, 0xb4, 0x97, 0x97, 0xb4, + 0xb4, 0x32, 0x93, 0xbb, 0xb4, 0x93, 0x30, 0xe3, + 0x78, 0xe3, 0x4, 0xfd, 0x9a, 0x12, 0x93, 0xe2, + 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x8a, 0x23, + 0x23, 0x23, 0x23, 0xd1, 0xd1, 0x16, 0x16, 0xd1, + 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xbf, 0xf4, 0x44, 0xf4, 0xf4, 0xe2, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x67, 0x30, 0x8c, 0xab, 0x8c, 0x58, 0xa0, 0x67, + 0x58, 0x5, 0x30, 0x58, 0xb5, 0x8a, 0x58, 0x8c, + 0x60, 0xd5, 0xe5, 0xdb, 0x40, 0x32, 0x6f, 0xb1, + 0x81, 0x32, 0xd7, 0xfd, 0x47, 0xd7, 0x5d, 0x8c, + 0x8c, 0xd3, 0x8c, 0x8c, 0xb3, 0xa0, 0x73, 0x1b, + 0x8, 0x58, 0x41, 0xe3, 0xe3, 0x24, 0x1, 0xc3, + 0xa8, 0x77, 0x47, 0x1e, 0xfd, 0x9c, 0x6f, 0xce, + 0x93, 0x4, 0xf3, 0xbd, 0xfd, 0x4, 0x7b, 0x9f, + 0x51, 0x6b, 0xde, 0xfd, 0x47, 0xd5, 0x96, 0xc9, + 0x2f, 0x8c, 0x58, 0x67, 0x67, 0x2f, 0xa5, 0xd2, + 0x2f, 0xa6, 0x5b, 0x1b, 0x2f, 0x2f, 0x67, 0x73, + 0x77, 0xe5, 0xce, 0xde, 0x3a, 0x27, 0xc0, 0xf3, + 0x9c, 0x4, 0x99, 0xf5, 0x4, 0x93, 0xc0, 0xf3, + 0x6f, 0xdd, 0xbb, 0xc0, 0x8e, 0x1e, 0xc6, 0xf3, + 0x97, 0xcc, 0xf3, 0x9c, 0x4, 0x32, 0xbb, 0xf3, + 0x4, 0x9d, 0xd8, 0x8e, 0x4, 0x3, 0x99, 0x47, + 0x4, 0x32, 0xde, 0x47, 0xd7, 0xa9, 0x91, 0xab, + 0xd3, 0x37, 0xa, 0x76, 0xb5, 0xbe, 0x82, 0x5, + 0xa0, 0x41, 0xd3, 0xb5, 0xda, 0x1c, 0xa, 0x62, + 0xe3, 0x5, 0x67, 0x6e, 0xe5, 0x1e, 0xca, 0xd9, + 0x6b, 0x81, 0xde, 0x4, 0x9c, 0x90, 0x3, 0x4, + 0x93, 0xbd, 0x90, 0x6f, 0x93, 0xe4, 0xbd, 0x6f, + 0x6f, 0x81, 0xdd, 0x4, 0xc0, 0x95, 0x90, 0x97, + 0xf3, 0x95, 0xc0, 0x99, 0x9c, 0xbf, 0x9, 0x97, + 0xf3, 0x83, 0x3, 0x3, 0x9b, 0x3, 0x2c, 0xd3, + 0xd3, 0x58, 0xd3, 0x82, 0x5, 0x5a, 0x67, 0xd3, + 0x24, 0x82, 0xb5, 0x29, 0x29, 0x1c, 0x6d, 0x6d, + 0x2f, 0xef, 0xe5, 0xb1, 0xc6, 0xdf, 0x32, 0xc6, + 0xf4, 0xb4, 0xfd, 0xc6, 0xf4, 0x95, 0xc0, 0xf3, + 0x4b, 0xf3, 0x93, 0xbb, 0xe2, 0xbf, 0xbf, 0xbb, + 0xf4, 0xbf, 0x93, 0xbf, 0xbf, 0x95, 0x93, 0xb4, + 0xbb, 0x32, 0x69, 0xf4, 0xe2, 0xfd, 0xd3, 0xe3, + 0xe3, 0x5, 0x69, 0x32, 0xf4, 0x93, 0xf4, 0x20, + 0x12, 0x93, 0x93, 0x97, 0x46, 0xd1, 0xd1, 0xd1, + 0xd1, 0x62, 0xbd, 0x44, 0x44, 0xf3, 0x2e, 0xab, + 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xf4, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xd3, 0xd3, 0x41, 0x1c, 0x87, 0x73, 0xd2, 0x42, + 0x42, 0x5b, 0xa0, 0x67, 0xe3, 0x76, 0x6d, 0xb5, + 0x8c, 0xc5, 0xe5, 0x6b, 0x7d, 0x6f, 0x9c, 0xbd, + 0xf3, 0x6f, 0x6b, 0x27, 0xa9, 0x5d, 0x7a, 0x1, + 0xac, 0x41, 0x2f, 0x42, 0xa0, 0xa0, 0x89, 0xd2, + 0x79, 0x2f, 0x58, 0xb5, 0x6d, 0xe3, 0x24, 0xb3, + 0x67, 0xa5, 0xd7, 0xde, 0x8e, 0x6f, 0xe5, 0xbd, + 0xfd, 0x97, 0x32, 0x90, 0x8b, 0x47, 0x32, 0xb4, + 0x9c, 0x6b, 0x9c, 0xce, 0x47, 0x8f, 0xc5, 0x59, + 0x8c, 0xab, 0x2f, 0xa6, 0xb3, 0x2f, 0xd2, 0x19, + 0xd2, 0x73, 0x5b, 0x42, 0xa5, 0x67, 0xa6, 0x96, + 0xc5, 0xa9, 0x81, 0xde, 0x6b, 0x9c, 0xc6, 0xe4, + 0x93, 0x9c, 0x99, 0x9c, 0x97, 0xde, 0xe1, 0x81, + 0xca, 0x1e, 0xbf, 0xbf, 0xc0, 0xc0, 0xf8, 0xf3, + 0x93, 0x12, 0xe4, 0xdf, 0x97, 0x81, 0xe1, 0xc0, + 0x1e, 0x83, 0x69, 0xf3, 0x32, 0xf3, 0xdf, 0x93, + 0x93, 0x70, 0xc6, 0x1e, 0x8b, 0x48, 0x91, 0x49, + 0x82, 0x4d, 0x62, 0x62, 0xe3, 0xac, 0x78, 0xb5, + 0x58, 0xd3, 0xd3, 0xac, 0xb5, 0x4d, 0x6d, 0x6d, + 0x45, 0x5b, 0xc9, 0x8f, 0x9b, 0xc6, 0xc6, 0xca, + 0xf5, 0xe1, 0x57, 0x36, 0xde, 0x81, 0x81, 0xf3, + 0xe4, 0xbf, 0xbf, 0xdf, 0xe4, 0xbf, 0xe4, 0xde, + 0xe4, 0xbf, 0xe4, 0xde, 0xbf, 0xf4, 0xe4, 0xc0, + 0xbf, 0xf4, 0xbf, 0x81, 0xe4, 0xb4, 0xe4, 0x81, + 0xe4, 0x81, 0x90, 0x53, 0xde, 0xd8, 0x77, 0x8c, + 0xe3, 0xe3, 0xac, 0x62, 0xe3, 0x4d, 0xac, 0x5e, + 0x6d, 0x87, 0xe3, 0x8a, 0x68, 0x30, 0x5, 0x58, + 0xb3, 0x27, 0xde, 0x85, 0xe1, 0xe4, 0xe4, 0x7, + 0x9a, 0xf4, 0xb4, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, + 0xf4, 0xf4, 0xbb, 0xf4, 0xbb, 0x20, 0xb4, 0xf4, + 0x44, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0xf4, 0x9a, 0xbc, 0x9a, 0x36, 0xad, + 0x68, 0x32, 0x32, 0xf4, 0x20, 0xe2, 0xf4, 0x44, + 0x20, 0x97, 0x93, 0x8e, 0xa, 0x62, 0x3b, 0x3b, + 0x1c, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x52, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9a, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x87, 0x30, 0x73, 0x67, 0xda, 0xf1, 0x42, 0x2f, + 0x2f, 0xa0, 0xa6, 0x8c, 0xa7, 0x67, 0x30, 0xb3, + 0xa6, 0xd5, 0x47, 0xd8, 0x81, 0xf9, 0x12, 0xe4, + 0x9a, 0xc6, 0xbd, 0x9f, 0xdb, 0x27, 0xd5, 0x2f, + 0x8c, 0x5, 0x89, 0x79, 0x65, 0x58, 0xa6, 0x1, + 0x94, 0xab, 0x1, 0x8c, 0x24, 0x87, 0x5b, 0xc9, + 0x96, 0xd9, 0x1e, 0x81, 0xe1, 0x81, 0x81, 0x81, + 0x57, 0xc4, 0xe4, 0xce, 0xc6, 0xe4, 0xe4, 0xe4, + 0xb4, 0xde, 0x8d, 0xe1, 0xcf, 0x3e, 0x91, 0xa8, + 0x1, 0xc3, 0x42, 0x6e, 0x1b, 0x1b, 0x1b, 0x77, + 0xe9, 0x1, 0x67, 0x67, 0xab, 0xab, 0x59, 0xd4, + 0x39, 0x1e, 0x9a, 0xb4, 0xbf, 0xb4, 0xb4, 0xf4, + 0xb4, 0x7, 0xe1, 0xe4, 0xc6, 0x75, 0xe4, 0x95, + 0xbb, 0xbf, 0xf4, 0xbf, 0xbf, 0xbf, 0xb4, 0xe2, + 0xb4, 0x9a, 0x7, 0xbb, 0x95, 0x7, 0xbf, 0xf4, + 0xbf, 0xbf, 0xb4, 0xf4, 0xb4, 0xf4, 0x9a, 0x9a, + 0xe1, 0x57, 0xba, 0x75, 0x81, 0x18, 0x48, 0x4e, + 0xc3, 0x24, 0x4d, 0xda, 0xb5, 0x62, 0x29, 0x78, + 0x4d, 0x4d, 0xa, 0xe3, 0x8c, 0xb5, 0x82, 0x5, + 0x5b, 0xd4, 0xfb, 0x25, 0xd8, 0xf6, 0x9f, 0x57, + 0xb4, 0xe4, 0x85, 0x81, 0xce, 0xbf, 0xe4, 0xe4, + 0xbf, 0xf4, 0xb4, 0xf4, 0xb4, 0xf4, 0x75, 0x7, + 0xf4, 0xb4, 0xf4, 0xb4, 0xbf, 0xbf, 0xbb, 0xb4, + 0xb4, 0xbb, 0xbf, 0x7, 0xb4, 0xf4, 0x75, 0xd8, + 0xb4, 0xf4, 0xc6, 0x81, 0x75, 0xf6, 0x98, 0x8c, + 0xab, 0xe3, 0x29, 0x78, 0xe3, 0x8a, 0x82, 0x62, + 0x82, 0x58, 0x8c, 0x82, 0x87, 0xad, 0xb3, 0x8c, + 0x2f, 0xfb, 0x83, 0x9f, 0x84, 0xbf, 0xaf, 0xb4, + 0x20, 0xf4, 0xe2, 0xbb, 0xf4, 0xf4, 0x95, 0xf4, + 0xf4, 0xe2, 0xbf, 0xf4, 0xf4, 0x44, 0xbf, 0xf4, + 0xf4, 0x95, 0xbb, 0xf4, 0xf4, 0x20, 0xbb, 0x9a, + 0x7, 0x9a, 0xf4, 0xf4, 0x9a, 0xf4, 0x32, 0x7b, + 0x68, 0x45, 0x32, 0x93, 0xf4, 0x32, 0x93, 0xbd, + 0x32, 0x32, 0x32, 0x5, 0xd1, 0x1c, 0x69, 0x44, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x9a, 0x23, 0x0, + 0x0, 0x23, 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0xf4, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa6, 0x5b, 0x5b, 0x67, 0x8c, 0xb3, 0xb3, 0x58, + 0x8c, 0x2f, 0x42, 0x1, 0xa7, 0x8, 0x1b, 0x6e, + 0x6e, 0x5c, 0x39, 0x75, 0x7, 0x75, 0xd8, 0xe1, + 0xf6, 0xe4, 0xce, 0x2e, 0x83, 0x27, 0xd5, 0x77, + 0x8c, 0x8c, 0x68, 0xb3, 0xd3, 0x58, 0xa0, 0x8c, + 0x24, 0x67, 0x79, 0xf1, 0x1, 0x58, 0x73, 0xe8, + 0x2a, 0x98, 0x6b, 0x90, 0x90, 0x9d, 0xde, 0xe4, + 0xc6, 0x1e, 0xc0, 0xbb, 0xdd, 0xde, 0x81, 0xe1, + 0x84, 0x53, 0x71, 0x75, 0x5c, 0xa3, 0x3e, 0x7a, + 0x65, 0x8c, 0xa6, 0xe, 0x6e, 0xe7, 0x96, 0xa6, + 0xa6, 0x8c, 0x67, 0x2f, 0xb3, 0x8c, 0x60, 0x27, + 0x9c, 0x1e, 0x90, 0x81, 0xbd, 0x81, 0x75, 0x4b, + 0x39, 0x9f, 0xe1, 0xe4, 0xdd, 0xdf, 0x81, 0xc0, + 0xc0, 0xf3, 0xcd, 0x81, 0xf3, 0xc6, 0x9a, 0x8d, + 0xf9, 0x4b, 0x9a, 0x8d, 0x93, 0x9c, 0xdf, 0x93, + 0x97, 0xdd, 0xe1, 0x90, 0x99, 0xc6, 0x74, 0x81, + 0xf5, 0x99, 0xdf, 0x32, 0x7b, 0x9d, 0xb8, 0xc3, + 0xb3, 0xd3, 0xac, 0xe3, 0xb5, 0x29, 0xb5, 0x24, + 0x5, 0x3b, 0x16, 0x8a, 0x30, 0x24, 0x78, 0x29, + 0x82, 0x67, 0x2f, 0x5d, 0x8f, 0x39, 0x83, 0x47, + 0x32, 0x86, 0xdf, 0x9c, 0x12, 0xbb, 0xe4, 0xfd, + 0x39, 0xb4, 0xbf, 0x1e, 0xc0, 0x4b, 0x9c, 0x93, + 0xc0, 0xbf, 0xdd, 0x99, 0xdd, 0xe4, 0xbd, 0xbd, + 0xd8, 0xdf, 0xdd, 0x8e, 0xdd, 0xe4, 0xf5, 0x8e, + 0xc0, 0xbf, 0x7b, 0x3, 0x77, 0x98, 0x49, 0xab, + 0x82, 0xe3, 0x6d, 0xd3, 0x8c, 0xa4, 0x58, 0x29, + 0x6d, 0x58, 0x4d, 0x78, 0xa, 0x4d, 0xac, 0xd3, + 0x1, 0x96, 0xd5, 0x4, 0xb4, 0xe4, 0x4, 0x97, + 0xb4, 0xbf, 0x12, 0xb4, 0x7, 0x85, 0x97, 0xb4, + 0x95, 0xbf, 0x97, 0xb4, 0xf4, 0xaf, 0x97, 0xbf, + 0x95, 0x93, 0x97, 0x12, 0x9a, 0x32, 0x4, 0xbb, + 0x20, 0xf4, 0x93, 0x93, 0x97, 0x97, 0x97, 0x4, + 0xa, 0xa, 0x45, 0x32, 0x8e, 0x32, 0x97, 0x97, + 0x32, 0x93, 0x93, 0x3b, 0x3b, 0xd1, 0xc0, 0xe2, + 0xe2, 0x2e, 0xf3, 0x44, 0xe4, 0xf3, 0x29, 0x16, + 0x23, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x8d, 0x44, 0x44, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0x44, + 0x44, 0xe2, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb3, 0xa4, 0x67, 0x8c, 0x41, 0x58, 0x30, 0x5, + 0x30, 0x79, 0x79, 0x58, 0x41, 0x30, 0x2f, 0x7a, + 0xe8, 0x1b, 0x6e, 0x90, 0x53, 0x1e, 0x4, 0xca, + 0xf5, 0x4, 0x97, 0x8e, 0x83, 0xd4, 0xa5, 0x2f, + 0x41, 0x24, 0x82, 0x87, 0x24, 0x67, 0x42, 0x8, + 0x30, 0x8, 0x1b, 0x5a, 0xb5, 0x82, 0x68, 0x5a, + 0x2f, 0xa5, 0xef, 0x6b, 0x6f, 0xe5, 0x8e, 0xf3, + 0xf5, 0xe5, 0x97, 0xf3, 0x8e, 0x3, 0x27, 0x9c, + 0xfd, 0x3, 0xfd, 0x90, 0xef, 0xd5, 0xe, 0xc7, + 0x58, 0xe3, 0xa0, 0x42, 0x2f, 0x8c, 0xb3, 0x45, + 0x2f, 0x14, 0x2f, 0x96, 0xa6, 0xa4, 0xd2, 0x4a, + 0x6c, 0xd7, 0x27, 0x8e, 0x4, 0x3, 0x53, 0x9c, + 0x9c, 0x7b, 0xc6, 0xbd, 0x4, 0x9c, 0x81, 0x93, + 0x97, 0x32, 0xd8, 0xf5, 0x97, 0x97, 0xe1, 0x9, + 0x9c, 0x93, 0xb4, 0x93, 0x97, 0x97, 0x93, 0x4, + 0x4, 0xff, 0x18, 0x8b, 0x4, 0xde, 0xe1, 0x32, + 0x4, 0x9c, 0xce, 0x4, 0x6c, 0x3, 0x4e, 0x24, + 0xab, 0x76, 0x78, 0x78, 0xda, 0x1c, 0xe3, 0x87, + 0x8, 0x45, 0x45, 0x8a, 0x58, 0x41, 0xa, 0x62, + 0x29, 0xe3, 0x8c, 0xa5, 0xd7, 0x32, 0x8e, 0x4, + 0x32, 0xbd, 0xb4, 0xfd, 0x97, 0xe4, 0x81, 0x9d, + 0x1e, 0xe4, 0xde, 0x97, 0xc0, 0xbf, 0xc0, 0x93, + 0x12, 0xbf, 0xc0, 0x47, 0xd8, 0xe4, 0xbd, 0xfd, + 0xde, 0xb4, 0xf3, 0x93, 0xdd, 0xbf, 0xc0, 0x97, + 0xde, 0x8d, 0x36, 0x3a, 0x91, 0x91, 0x52, 0xd3, + 0x5e, 0x6d, 0x6d, 0x4d, 0xb5, 0x67, 0x58, 0x82, + 0xe3, 0x24, 0x4d, 0x4d, 0x76, 0x78, 0x62, 0x4d, + 0xb3, 0x6e, 0x4a, 0x4, 0x2e, 0xc0, 0x97, 0x97, + 0xe1, 0xe1, 0xdd, 0xe4, 0x9a, 0xe1, 0xc0, 0xbf, + 0xbf, 0xbf, 0xaf, 0xbf, 0xbf, 0xbf, 0x93, 0xaf, + 0xf4, 0xbf, 0x97, 0xaf, 0xf4, 0xf4, 0xc0, 0xe2, + 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0xfd, 0xfd, 0xd3, + 0xe3, 0x62, 0x4, 0x97, 0x97, 0x97, 0x93, 0x93, + 0x8a, 0x3b, 0x3b, 0xdd, 0xa, 0x62, 0x1c, 0xe2, + 0x44, 0xf4, 0xbb, 0x44, 0x44, 0xbf, 0x0, 0x23, + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x82, 0x1c, 0x24, 0x41, 0x67, 0x42, 0x1b, 0x89, + 0x89, 0x42, 0x63, 0xf1, 0x58, 0xe3, 0x8c, 0x1, + 0xa8, 0xe9, 0xe5, 0x4, 0xdd, 0x8e, 0x4, 0x93, + 0xf3, 0x97, 0x4, 0x36, 0xa9, 0x50, 0x1, 0xe3, + 0x82, 0x8c, 0x87, 0x87, 0x68, 0x8, 0x79, 0x89, + 0x8, 0x87, 0x2f, 0x8c, 0xd3, 0xe3, 0xb5, 0x8c, + 0xa8, 0xd5, 0x6c, 0x9c, 0x32, 0x4, 0x32, 0xdd, + 0xde, 0x47, 0xfd, 0xde, 0x32, 0x3, 0xf5, 0xc0, + 0xbd, 0x4, 0x2e, 0xde, 0x47, 0x3, 0x5d, 0x2f, + 0x58, 0xd3, 0xd3, 0x8c, 0x87, 0x67, 0x8, 0xf1, + 0x58, 0xad, 0x89, 0xd2, 0xd2, 0x42, 0x2f, 0xe7, + 0xd5, 0x3, 0x18, 0xc6, 0x32, 0x6f, 0xb4, 0xc0, + 0xf3, 0x12, 0xe4, 0xb4, 0xc0, 0xdd, 0xe1, 0xde, + 0x32, 0xdd, 0xe1, 0xe4, 0xf3, 0xf3, 0xbf, 0xbf, + 0xf3, 0xc0, 0xe4, 0x81, 0x93, 0xc0, 0x71, 0x9d, + 0x9c, 0xdd, 0xe1, 0xe4, 0xf3, 0xe4, 0xe4, 0xf3, + 0xf3, 0xf3, 0x85, 0x9d, 0x3, 0x40, 0x91, 0x1d, + 0xab, 0x4d, 0x29, 0x1c, 0x1c, 0x62, 0x3b, 0x58, + 0xc3, 0x8c, 0xd3, 0x82, 0xe3, 0x82, 0xb5, 0xe3, + 0x1c, 0xda, 0x30, 0xd5, 0x47, 0x81, 0xe1, 0xd8, + 0xd8, 0xe1, 0x2e, 0x9f, 0x75, 0xc6, 0xe4, 0xc6, + 0x95, 0xb4, 0xbf, 0xbd, 0xc6, 0xbf, 0xbf, 0x85, + 0xe1, 0xbf, 0xe4, 0xc6, 0xe1, 0xb4, 0xb4, 0xe4, + 0xe4, 0xbf, 0xbf, 0xe4, 0xe4, 0xbf, 0x95, 0xe1, + 0x57, 0x81, 0xe1, 0x9d, 0x18, 0x88, 0xa8, 0x82, + 0xb5, 0xac, 0x78, 0x76, 0x4d, 0x78, 0xb5, 0xd3, + 0xac, 0xbe, 0x82, 0x82, 0x82, 0xd3, 0x29, 0x1c, + 0x58, 0xc5, 0x47, 0x32, 0x81, 0xe1, 0xdd, 0xbf, + 0xe1, 0xb4, 0xb4, 0xb4, 0xf4, 0xf4, 0xf4, 0xbf, + 0xf4, 0xb4, 0xbf, 0xe2, 0xf4, 0xb0, 0x8d, 0xbf, + 0xe2, 0xf4, 0xbf, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, + 0xe2, 0x8d, 0xf4, 0xf4, 0xf4, 0xf, 0x87, 0x68, + 0x58, 0x97, 0x97, 0xad, 0xda, 0x69, 0x8e, 0xa, + 0x62, 0xd1, 0xd1, 0xd1, 0x17, 0x55, 0xe2, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0xf4, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x1, 0x67, 0x24, 0x58, 0x30, 0x42, 0x2, 0x42, + 0x2f, 0x67, 0x2f, 0x2f, 0x1, 0x8c, 0xa6, 0xad, + 0xd9, 0x1e, 0xde, 0xb4, 0xb4, 0xdf, 0xbd, 0xbf, + 0x9a, 0xbc, 0x90, 0xe1, 0xcb, 0x48, 0xb8, 0xa8, + 0x1c, 0xb3, 0x8c, 0x58, 0xda, 0x58, 0xb3, 0x67, + 0x1, 0xd3, 0xb3, 0xb3, 0xe3, 0x58, 0x67, 0x30, + 0x73, 0xef, 0x9f, 0xe4, 0x84, 0x40, 0x18, 0xc6, + 0xbf, 0xd8, 0xe1, 0x4b, 0x90, 0x81, 0xbf, 0xb4, + 0xb4, 0x90, 0xc6, 0xbf, 0x75, 0x98, 0x49, 0x52, + 0x64, 0x67, 0xa8, 0x59, 0xa0, 0x5b, 0xa5, 0xa5, + 0x1, 0x8c, 0x65, 0x52, 0x8c, 0x64, 0xa8, 0x38, + 0x7d, 0x81, 0xce, 0xb4, 0xf9, 0xdf, 0xbf, 0xf4, + 0xf4, 0x9a, 0x18, 0x9f, 0xe1, 0xe4, 0x7, 0xc6, + 0x4b, 0xe4, 0xbf, 0x95, 0xbf, 0xbf, 0xbf, 0xbf, + 0xe4, 0xf4, 0x57, 0x18, 0x81, 0xbf, 0xb4, 0xe1, + 0xdf, 0xdf, 0xbf, 0xaf, 0xbf, 0xb4, 0x4b, 0x7, + 0xb4, 0xb4, 0x7, 0xcb, 0x6b, 0x9f, 0xa2, 0x91, + 0xa8, 0x87, 0xda, 0xb5, 0x41, 0xa, 0x1c, 0xbe, + 0x6d, 0x1c, 0xb5, 0x24, 0x82, 0x87, 0x68, 0x87, + 0x58, 0xa4, 0xa0, 0xc9, 0xa9, 0x81, 0x75, 0xdb, + 0x88, 0xb4, 0xb4, 0xc6, 0xe4, 0xdf, 0xf8, 0xb4, + 0xb4, 0xf4, 0xc6, 0x83, 0xc6, 0xb4, 0xf4, 0x7, + 0x75, 0xbb, 0xf4, 0xb4, 0xb4, 0xe4, 0x81, 0xc0, + 0xbf, 0xbf, 0xaf, 0xc6, 0x9f, 0x9a, 0xe4, 0xb9, + 0xe1, 0x40, 0xf3, 0xd8, 0xc6, 0x9f, 0xc7, 0x8c, + 0xe3, 0x4d, 0x6d, 0x6d, 0xa, 0x29, 0x78, 0x4d, + 0x4d, 0x4d, 0x29, 0x5, 0x8c, 0x94, 0x4d, 0x29, + 0xbe, 0xa8, 0xd5, 0x6c, 0x47, 0x47, 0x97, 0xde, + 0xb4, 0xbf, 0xb4, 0xbf, 0xbf, 0xf4, 0xbb, 0x20, + 0xb4, 0xf4, 0xbb, 0xbf, 0xf4, 0xf4, 0xc0, 0xbb, + 0xe2, 0xe2, 0xf4, 0xbb, 0xf4, 0xf4, 0xf4, 0xf4, + 0xf4, 0x9a, 0xf4, 0xe2, 0xf4, 0xe4, 0x93, 0x1c, + 0x5, 0x5, 0x8a, 0x3b, 0xa, 0xd1, 0x62, 0xa, + 0x62, 0xd1, 0xa, 0x1c, 0x9, 0xc0, 0x95, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xf4, 0x0, 0x23, + 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x10, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc9, 0x5a, 0xf1, 0xa0, 0x30, 0xa6, 0x67, 0xa6, + 0x2f, 0x58, 0x8c, 0x8c, 0x2f, 0x2f, 0x5b, 0x96, + 0x7d, 0x81, 0x81, 0xce, 0x90, 0x8b, 0xd8, 0xe4, + 0xe4, 0x83, 0x83, 0xde, 0x36, 0x9d, 0xa9, 0xc9, + 0x68, 0x87, 0x8c, 0xb5, 0x82, 0x24, 0x6d, 0xbe, + 0x8c, 0x87, 0x87, 0xb3, 0x58, 0x67, 0x2f, 0xc9, + 0xc2, 0x4f, 0xa9, 0x75, 0xde, 0x8b, 0x27, 0xbd, + 0xe4, 0xce, 0xdf, 0x9c, 0x9c, 0x32, 0xde, 0xb4, + 0x81, 0x6b, 0xdb, 0x9f, 0xd8, 0x27, 0x4e, 0x1, + 0x8c, 0x2f, 0xf1, 0xa6, 0x30, 0xa6, 0x2f, 0x49, + 0x67, 0x8c, 0x24, 0x24, 0xb3, 0x2f, 0xc9, 0xc9, + 0xc2, 0x9c, 0xe1, 0xe4, 0x9, 0x8e, 0x75, 0x7, + 0xbd, 0xdd, 0xc6, 0x90, 0x32, 0xf3, 0xb4, 0xe4, + 0x93, 0xc0, 0xbb, 0xb4, 0xf3, 0xc0, 0xe4, 0xe1, + 0x93, 0xf3, 0xc6, 0x32, 0x93, 0xf3, 0xb4, 0xbd, + 0xb1, 0x9c, 0xe4, 0xc6, 0xde, 0xb4, 0xc6, 0xd8, + 0xfd, 0xb4, 0xb4, 0x36, 0x4, 0xfd, 0x9d, 0x2c, + 0x66, 0xb5, 0x4d, 0xac, 0xd3, 0x24, 0x58, 0x58, + 0xda, 0xda, 0x5, 0xda, 0x4d, 0x6d, 0xb5, 0xd3, + 0xac, 0x58, 0x67, 0x2f, 0x7a, 0x6b, 0xd8, 0x47, + 0x4, 0xe4, 0xdd, 0x32, 0x32, 0xe4, 0xf3, 0xfd, + 0x9d, 0x7, 0xf3, 0x4, 0x1e, 0xe4, 0xf3, 0x93, + 0x12, 0xbf, 0xc0, 0x32, 0x81, 0xe4, 0xdd, 0x97, + 0xd8, 0xe1, 0xdd, 0x93, 0xf3, 0xe4, 0x32, 0x97, + 0xdd, 0xbd, 0x9c, 0x4, 0x3a, 0x91, 0x49, 0x8c, + 0x66, 0xb5, 0xe3, 0x58, 0x30, 0x8a, 0x3b, 0x3b, + 0x6d, 0x78, 0x78, 0x62, 0x6d, 0x76, 0x76, 0x1a, + 0x6d, 0x8c, 0x2f, 0x11, 0x6c, 0x6c, 0xe0, 0x4, + 0xde, 0xde, 0x97, 0x32, 0xb4, 0x57, 0xf3, 0xbf, + 0xe2, 0xbb, 0x93, 0xbb, 0xe2, 0xbf, 0x4, 0xbf, + 0xf4, 0xed, 0x69, 0xaf, 0xf4, 0xbb, 0x93, 0xf4, + 0xf4, 0xf4, 0x93, 0xf4, 0xf4, 0x97, 0x47, 0x62, + 0x62, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0x62, + 0xde, 0xdd, 0x12, 0xe2, 0x44, 0xc0, 0xc0, 0x44, + 0x44, 0xf3, 0x12, 0x44, 0xbb, 0xbf, 0x0, 0x23, + 0xa, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0xf4, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x44, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x10, 0x10, 0x10, 0x0, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x2f, 0x41, 0x2f, 0x67, 0x8c, 0x8c, 0xb3, 0x89, + 0x5b, 0x73, 0x58, 0x41, 0x58, 0x24, 0x87, 0xd4, + 0x27, 0x3, 0x3, 0xde, 0x81, 0x4, 0x47, 0x93, + 0xdd, 0x4, 0x4, 0x32, 0xfd, 0x5d, 0x2c, 0x1, + 0x8c, 0xd3, 0xe3, 0xb3, 0x67, 0x67, 0x58, 0x30, + 0x45, 0xb3, 0xe3, 0xe3, 0xd3, 0x82, 0xd3, 0x2f, + 0xd2, 0xe9, 0xe, 0x1e, 0x1e, 0x6c, 0x6c, 0xbd, + 0x32, 0x9c, 0x32, 0xf3, 0x32, 0x6f, 0x3, 0xd8, + 0x97, 0x47, 0x3, 0x6a, 0xe5, 0xd5, 0x77, 0x67, + 0xd3, 0x24, 0x8c, 0x82, 0x87, 0xb3, 0x8c, 0x8c, + 0xa6, 0x5a, 0x2f, 0x8, 0xa0, 0x5b, 0x6e, 0xd5, + 0xd5, 0xe5, 0x1e, 0x9d, 0x47, 0x4, 0xd8, 0xf6, + 0x6f, 0x93, 0xe4, 0xf3, 0x4, 0x93, 0xb4, 0xbd, + 0x4, 0x97, 0xb4, 0x9d, 0x4, 0x93, 0x12, 0x12, + 0x6f, 0x6f, 0xc0, 0x93, 0x4, 0x32, 0x4b, 0xfd, + 0x3, 0x32, 0xe1, 0x9d, 0x47, 0xc0, 0xbf, 0xbd, + 0x97, 0xf5, 0x2e, 0x32, 0x47, 0xfd, 0x2a, 0xa8, + 0xd3, 0x4d, 0x4d, 0x29, 0x4d, 0x5, 0x42, 0xf1, + 0x30, 0xa0, 0x5, 0xb5, 0xe3, 0x62, 0x78, 0x78, + 0x62, 0xb5, 0x30, 0x42, 0xf0, 0xd9, 0xe5, 0xe5, + 0x8e, 0x2e, 0x81, 0x6f, 0x97, 0xc6, 0xdd, 0x47, + 0x8b, 0x90, 0xdd, 0x93, 0xf3, 0xe4, 0xdf, 0xf3, + 0xf3, 0xe2, 0xbf, 0x1e, 0x9d, 0x57, 0xbd, 0x93, + 0xf5, 0xdf, 0xdd, 0x32, 0xf3, 0xe4, 0x9c, 0x4, + 0xde, 0xe1, 0xfd, 0x3, 0x4e, 0x2c, 0xab, 0xd3, + 0xbe, 0x4d, 0x8a, 0x67, 0xf1, 0x2f, 0x5, 0xda, + 0x8a, 0x6d, 0x62, 0x29, 0xa, 0xa, 0xa, 0x62, + 0x6d, 0xe3, 0x58, 0x63, 0x4a, 0xd7, 0xd7, 0xe5, + 0x47, 0x57, 0xfd, 0xc0, 0xf4, 0xb4, 0xbf, 0xbf, + 0xe2, 0xe2, 0xbf, 0xbf, 0xbf, 0x44, 0xce, 0xbb, + 0xf4, 0xe1, 0xb4, 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, + 0xe2, 0x44, 0xf4, 0xf4, 0xf4, 0x8e, 0xa, 0x78, + 0x62, 0x62, 0x23, 0x23, 0xd1, 0x23, 0xd1, 0xd1, + 0xb1, 0xe2, 0xe2, 0xe2, 0x44, 0xf3, 0x44, 0xe2, + 0x44, 0x44, 0x12, 0x44, 0x44, 0xbf, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xd3, 0xe3, 0x8c, 0x8, 0x79, 0xa6, 0xa0, 0x5b, + 0x89, 0xd2, 0x2f, 0xa0, 0x41, 0xb5, 0xb5, 0x60, + 0x27, 0x27, 0x6b, 0xf5, 0xc0, 0x4, 0x4, 0x6f, + 0x32, 0x4, 0x4, 0x8e, 0x9d, 0x50, 0x1, 0x8c, + 0x8c, 0xd3, 0x82, 0x58, 0x42, 0xd2, 0x42, 0xa0, + 0x30, 0x58, 0x6, 0x76, 0xa, 0x6d, 0x5e, 0x67, + 0x6e, 0xe5, 0x6b, 0x39, 0x9c, 0x4, 0x8e, 0xde, + 0xf5, 0x6b, 0x9d, 0x9f, 0xde, 0x32, 0x9c, 0xf5, + 0xb1, 0x97, 0xf3, 0x40, 0x8f, 0xef, 0x5d, 0x64, + 0x67, 0x8c, 0x24, 0x24, 0x87, 0x8, 0x58, 0x58, + 0x2f, 0x63, 0xd2, 0xa5, 0x73, 0x73, 0x77, 0x98, + 0x27, 0x6b, 0x7d, 0x8b, 0xfd, 0x32, 0xb4, 0x81, + 0xca, 0xf3, 0xbf, 0xe4, 0xbd, 0x99, 0x81, 0xd8, + 0x2e, 0xf3, 0xe1, 0x99, 0x93, 0x12, 0xbf, 0xaf, + 0x99, 0x93, 0xe4, 0x2e, 0xd8, 0xdf, 0x39, 0x8b, + 0x9d, 0xdd, 0xbf, 0x4b, 0x9c, 0xe4, 0xbf, 0xbf, + 0xf3, 0xdf, 0xbd, 0x9b, 0xcf, 0x53, 0x3e, 0xa8, + 0xab, 0x24, 0x87, 0x82, 0xb5, 0x87, 0x2, 0x2f, + 0x8c, 0xb5, 0xda, 0xe3, 0xd3, 0x4d, 0xb5, 0x29, + 0xa, 0x1c, 0x30, 0x1b, 0x2f, 0x1b, 0x83, 0xfd, + 0xc8, 0x57, 0xf8, 0xf5, 0xd8, 0xe1, 0xe4, 0x81, + 0xdf, 0xc6, 0xbf, 0x95, 0xe4, 0xc6, 0xf3, 0xbf, + 0x9a, 0x7, 0xe1, 0x81, 0xc6, 0xe1, 0xbf, 0x12, + 0xe4, 0x81, 0xf3, 0xbf, 0xb4, 0xb4, 0xb4, 0xf3, + 0xe1, 0xbc, 0x9d, 0xfd, 0x27, 0xe8, 0x14, 0xad, + 0xe3, 0xe3, 0x6d, 0x87, 0xd3, 0xd3, 0xb5, 0x24, + 0xb5, 0xbe, 0xb5, 0xda, 0x5, 0x6d, 0x1c, 0x8a, + 0x1c, 0x29, 0x1c, 0x30, 0xd2, 0x2f, 0x5d, 0xe5, + 0x4, 0xde, 0xe4, 0xf4, 0xf4, 0xbf, 0xe2, 0x44, + 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0x9a, 0xf4, + 0xe2, 0xf4, 0xe2, 0xbb, 0x44, 0xe2, 0xe2, 0xe2, + 0xe2, 0xf4, 0xf4, 0xf4, 0xf4, 0x32, 0x78, 0xa, + 0xb5, 0xd1, 0xd1, 0x23, 0xd1, 0xd1, 0x23, 0xd1, + 0xe2, 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc9, 0x5, 0x68, 0x42, 0x42, 0x8, 0x8c, 0x45, + 0x8, 0xf1, 0xd3, 0x1, 0xa7, 0x65, 0x67, 0x4f, + 0xd8, 0xdf, 0x99, 0xbd, 0x8d, 0xbd, 0xdd, 0x81, + 0xdf, 0xd8, 0xd8, 0x57, 0x4b, 0x4f, 0x4e, 0xa5, + 0xe9, 0xad, 0x58, 0x58, 0xf1, 0x2f, 0x94, 0x1, + 0x8c, 0x24, 0xe3, 0x8c, 0x87, 0x68, 0x5, 0x73, + 0x27, 0x1e, 0xd8, 0x90, 0xc4, 0x70, 0xbc, 0xbc, + 0xe1, 0xdf, 0xd8, 0xc6, 0xce, 0xbd, 0xbd, 0x8d, + 0xce, 0xb4, 0x7, 0xf6, 0x8b, 0x98, 0x91, 0x2c, + 0x49, 0xa4, 0xa6, 0x73, 0x42, 0x6e, 0x73, 0x58, + 0x30, 0x8, 0x67, 0xab, 0x65, 0xb3, 0x3f, 0x3f, + 0x18, 0x81, 0x81, 0x69, 0xc6, 0xe4, 0xe4, 0x8d, + 0x81, 0xe4, 0x9a, 0x7, 0xbc, 0xe4, 0x9, 0x9a, + 0xe1, 0xbf, 0xb4, 0x12, 0xe4, 0xc0, 0xbf, 0xb4, + 0xe1, 0xe1, 0xe4, 0xbc, 0x74, 0x70, 0xe4, 0xe4, + 0xe4, 0x95, 0xe2, 0xbf, 0xbf, 0xbb, 0xe2, 0x9a, + 0x57, 0xe1, 0xe1, 0xe1, 0xf6, 0xe1, 0x90, 0xd6, + 0x67, 0x52, 0xa6, 0x24, 0xe3, 0x24, 0x2f, 0xd3, + 0xac, 0x24, 0xac, 0x37, 0x37, 0xc3, 0xb3, 0x5, + 0x1c, 0x58, 0x30, 0xf1, 0x5a, 0xa5, 0x3, 0x47, + 0x8b, 0x40, 0x36, 0xf3, 0xde, 0xdd, 0xe4, 0xdd, + 0xe4, 0xbf, 0xb4, 0xe1, 0x7, 0xbc, 0xe1, 0xe4, + 0xe1, 0x9a, 0xbf, 0xc0, 0xb4, 0xb4, 0xe4, 0xaf, + 0xbf, 0xb4, 0xe4, 0xdd, 0xe1, 0x57, 0xe1, 0xe4, + 0xb4, 0xe1, 0x70, 0xfd, 0x9d, 0x8b, 0x60, 0x67, + 0x6d, 0xac, 0xe3, 0x6d, 0xe3, 0x37, 0x6d, 0xda, + 0xe3, 0x82, 0xe3, 0x30, 0xa0, 0xb5, 0x1c, 0xda, + 0x6d, 0xa, 0x62, 0x58, 0x30, 0x67, 0x79, 0x6c, + 0x4, 0x4, 0x4, 0x93, 0x95, 0xf4, 0xbf, 0xf4, + 0xf4, 0xf4, 0x9a, 0xf4, 0xe2, 0xbb, 0xe2, 0x44, + 0xbf, 0xe2, 0xf4, 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, + 0xf4, 0xf4, 0x69, 0x32, 0x32, 0x32, 0x45, 0x30, + 0x3b, 0xd1, 0x0, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xde, 0x44, 0xe2, 0xe2, 0x44, 0xe2, 0xf4, 0xe2, + 0x44, 0xe2, 0xbf, 0x44, 0x44, 0xf4, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x0, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x12, + 0x44, 0x44, 0x44, + 0xef, 0x1b, 0x79, 0x73, 0x8, 0x6, 0xe3, 0x58, + 0x58, 0xd3, 0x41, 0x2f, 0xc9, 0x7a, 0xc9, 0x88, + 0x4b, 0xce, 0xde, 0xe1, 0xe1, 0x81, 0x40, 0x81, + 0xe4, 0xdd, 0x90, 0x9b, 0xdd, 0x47, 0x27, 0xd4, + 0x89, 0x2f, 0x8c, 0xd3, 0x87, 0xd3, 0x41, 0x24, + 0x2f, 0xb3, 0x24, 0xc3, 0xa6, 0x73, 0x2f, 0xa6, + 0xd4, 0x7d, 0xc8, 0x53, 0xe1, 0xd8, 0x18, 0x18, + 0x81, 0x32, 0xde, 0xc6, 0x81, 0xbd, 0xbd, 0xe1, + 0x81, 0x1e, 0x40, 0xdb, 0xa9, 0x77, 0xa8, 0x94, + 0x2f, 0x2, 0xd2, 0xa6, 0xa0, 0x89, 0x2f, 0x8c, + 0x24, 0xb3, 0xb3, 0x24, 0x67, 0x2f, 0x59, 0x4e, + 0x7d, 0xfd, 0xde, 0xde, 0xfd, 0x83, 0xe1, 0x81, + 0xc8, 0xfd, 0x4b, 0x90, 0xf5, 0xc0, 0xb4, 0xc6, + 0xf5, 0x9c, 0xf3, 0x93, 0x9c, 0x99, 0xf5, 0xd8, + 0x40, 0xde, 0xe4, 0x4b, 0xf5, 0xf3, 0xbf, 0xe4, + 0x86, 0xdf, 0xbf, 0xdd, 0xfd, 0xe1, 0xb4, 0xf5, + 0x47, 0xde, 0xe4, 0x1e, 0x6b, 0x90, 0xf5, 0x5d, + 0x49, 0x8c, 0xda, 0xd3, 0xd3, 0xd3, 0x87, 0x87, + 0x87, 0x24, 0x87, 0x62, 0xa, 0x1c, 0x5, 0x8c, + 0xe3, 0xe3, 0x58, 0x58, 0x8c, 0x2f, 0x6e, 0x6e, + 0x19, 0xe5, 0xd7, 0x6c, 0x6c, 0x6b, 0x47, 0x4, + 0x97, 0x57, 0x75, 0x99, 0x1e, 0xc6, 0xbd, 0x4, + 0xf5, 0xdf, 0xf3, 0x93, 0xdd, 0xe1, 0x83, 0x32, + 0x8e, 0xd8, 0xfd, 0xe5, 0x9c, 0x32, 0x4, 0x4, + 0xf3, 0xca, 0x1e, 0xe5, 0x3, 0x2c, 0xab, 0x94, + 0xac, 0x5e, 0xe3, 0x8c, 0xda, 0xda, 0x58, 0x8, + 0x58, 0xe3, 0x4d, 0x82, 0xd3, 0x6, 0x76, 0x29, + 0x78, 0x37, 0xb5, 0x87, 0xa4, 0xa0, 0x89, 0x4a, + 0xd7, 0x6c, 0xd7, 0x4, 0xc0, 0xbf, 0x97, 0xbf, + 0xbf, 0x95, 0xc0, 0xbb, 0xf4, 0xf4, 0x97, 0xaf, + 0x44, 0x95, 0xb1, 0x26, 0xf4, 0x93, 0x93, 0x20, + 0xf4, 0x93, 0x4, 0x97, 0x97, 0x97, 0x8a, 0x23, + 0x23, 0xd1, 0x0, 0xd1, 0x0, 0xd1, 0x23, 0xbd, + 0xf3, 0x12, 0x12, 0xbb, 0xe2, 0x12, 0x95, 0x12, + 0x12, 0xbf, 0xc0, 0x95, 0xe2, 0xe2, 0x0, 0x0, + 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x23, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x10, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe7, 0x2, 0x67, 0xb3, 0xb3, 0x58, 0x41, 0x67, + 0x30, 0xda, 0xda, 0x8, 0xe7, 0x1, 0x59, 0x6e, + 0x83, 0x9c, 0x3, 0x9d, 0xdf, 0x6b, 0x4, 0xfd, + 0x97, 0x4, 0xef, 0x6b, 0xfd, 0xef, 0xe7, 0x67, + 0x1, 0x8c, 0x8c, 0x8c, 0xb3, 0x5, 0x3b, 0x67, + 0x42, 0x2f, 0xe3, 0xe3, 0xda, 0x87, 0x58, 0xb3, + 0xa0, 0x6e, 0xef, 0xa9, 0xa9, 0x6b, 0x6b, 0x9c, + 0xb1, 0x4, 0x97, 0xf5, 0x9c, 0x4, 0x32, 0xcf, + 0x9d, 0x7d, 0x6b, 0x3, 0xd7, 0xd5, 0x2f, 0x58, + 0x67, 0x79, 0x8c, 0x1, 0xb3, 0x67, 0x8c, 0xab, + 0x8c, 0xc3, 0x30, 0x30, 0x79, 0xd2, 0x42, 0x96, + 0xd5, 0x47, 0x8e, 0xd8, 0x27, 0x27, 0x9c, 0xd8, + 0x47, 0x4, 0xf5, 0xf5, 0x4, 0x97, 0xb4, 0xdd, + 0x6b, 0x9c, 0x32, 0x4, 0xd5, 0x6b, 0x99, 0x93, + 0x9c, 0x93, 0xe4, 0x9c, 0x9c, 0xf3, 0xbf, 0x12, + 0x4, 0x1e, 0xf3, 0xdd, 0xfd, 0x1e, 0x81, 0x32, + 0x4, 0xf3, 0xe4, 0x8e, 0x6b, 0x9d, 0x9d, 0x2c, + 0xd3, 0xac, 0x4d, 0x61, 0xac, 0x82, 0x68, 0x5, + 0x45, 0x58, 0x67, 0x6d, 0x62, 0x62, 0xb5, 0x1c, + 0x62, 0x6d, 0x4d, 0x82, 0x67, 0xd2, 0x63, 0x63, + 0x4a, 0x4a, 0xd7, 0x6c, 0xd7, 0x3, 0xfd, 0x4, + 0xfd, 0xd8, 0xed, 0x93, 0xdd, 0xb4, 0xc0, 0x97, + 0x97, 0xf3, 0xdd, 0x32, 0xde, 0x57, 0x9d, 0x8e, + 0xdd, 0x32, 0x4, 0x6c, 0x6c, 0x93, 0x97, 0x4, + 0x12, 0x81, 0x3, 0x3, 0x5d, 0x1, 0xab, 0x66, + 0x78, 0x62, 0x4d, 0x87, 0xda, 0xda, 0x8c, 0x67, + 0x58, 0x29, 0xe3, 0x82, 0x37, 0x78, 0x6d, 0x4d, + 0x62, 0xa, 0x62, 0x58, 0x5, 0x5, 0x5, 0x73, + 0x19, 0xd7, 0xd7, 0x4, 0xb4, 0xbf, 0xee, 0xbf, + 0xe2, 0xbb, 0xbf, 0x95, 0xe2, 0xbf, 0xe2, 0xf4, + 0xe2, 0xe2, 0xb4, 0xf4, 0xf4, 0xe2, 0xf4, 0x44, + 0xf4, 0x97, 0x97, 0x97, 0x97, 0x97, 0xd1, 0xd1, + 0xd1, 0x23, 0xd1, 0x0, 0x23, 0x23, 0x23, 0x12, + 0xf3, 0xf3, 0xf3, 0x44, 0x44, 0xe2, 0xbf, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x67, 0xd3, 0xd3, 0x87, 0x5, 0x30, 0x73, 0x42, + 0x5b, 0xa0, 0xa4, 0x8, 0x2f, 0xa4, 0x2f, 0x4e, + 0x83, 0x7b, 0x4, 0x1e, 0x81, 0x97, 0x4, 0xbd, + 0x8e, 0x9c, 0xe5, 0x3, 0x3, 0x77, 0x2f, 0x8c, + 0x24, 0x1c, 0x8c, 0x67, 0x5b, 0xa0, 0xa0, 0x8, + 0x79, 0x8, 0x58, 0xda, 0xb5, 0x1c, 0xe3, 0x1c, + 0xa5, 0xef, 0x9c, 0x83, 0x27, 0x9c, 0x6f, 0xff, + 0x8d, 0x8e, 0x32, 0xf6, 0xd8, 0x32, 0xdd, 0x81, + 0xdf, 0x97, 0x26, 0xce, 0x3, 0x8f, 0xe, 0x1, + 0x8c, 0x2f, 0xb3, 0x8c, 0xb3, 0xb3, 0x8c, 0x67, + 0x8, 0x79, 0xa6, 0xa4, 0x2f, 0xc5, 0xef, 0x27, + 0x27, 0x3, 0xde, 0x81, 0x9d, 0x9c, 0xb4, 0x9, + 0xf3, 0xf3, 0xe4, 0xf3, 0x2e, 0xbd, 0xb4, 0xc6, + 0xa9, 0x9d, 0xd8, 0x26, 0x4, 0x9c, 0xf3, 0xe4, + 0xf3, 0xbf, 0xf4, 0xf4, 0xe4, 0x7, 0x9a, 0xbf, + 0xb4, 0xe1, 0xb4, 0xe2, 0xf3, 0xbf, 0xbf, 0xbf, + 0xdd, 0xe1, 0xce, 0x81, 0x9d, 0xdb, 0xb, 0x3f, + 0xa7, 0xe3, 0xe3, 0x29, 0x6d, 0x82, 0x82, 0xe3, + 0x6d, 0xb5, 0x24, 0xe3, 0x62, 0xe3, 0x4d, 0x1c, + 0x8a, 0x6d, 0x6d, 0x29, 0xb5, 0x67, 0x79, 0xa5, + 0xe, 0x5d, 0x77, 0x4a, 0xe5, 0x1e, 0x1e, 0x8e, + 0xaf, 0xce, 0x8d, 0xe4, 0xe4, 0xb4, 0xe4, 0xe4, + 0xbf, 0x9a, 0x7, 0xb4, 0xbf, 0xe1, 0xc6, 0xe4, + 0xe4, 0xde, 0x4, 0x4, 0x4, 0xde, 0xd8, 0xde, + 0x81, 0x57, 0x53, 0x8b, 0x8b, 0x4e, 0x49, 0xe3, + 0x6d, 0x76, 0x62, 0x78, 0x29, 0xa, 0x6d, 0xb5, + 0xe3, 0x8c, 0x24, 0xb5, 0x58, 0xda, 0x5, 0x41, + 0x1c, 0x62, 0xd1, 0xa, 0x76, 0x62, 0x6d, 0xb5, + 0xb3, 0x19, 0xd7, 0x4, 0xbf, 0xbf, 0xbf, 0xf4, + 0xf4, 0xe2, 0xe2, 0xe2, 0xbf, 0xe2, 0xf4, 0x9a, + 0xf4, 0xbb, 0x44, 0xf4, 0x44, 0xf4, 0xf4, 0xf4, + 0x93, 0x93, 0x4, 0xa, 0x62, 0xd1, 0xd1, 0x34, + 0xd1, 0x23, 0x23, 0xd1, 0x34, 0x23, 0x23, 0x1c, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc3, 0x58, 0xa0, 0x2f, 0x8c, 0x87, 0xb3, 0x8c, + 0x2f, 0xa6, 0x87, 0x64, 0x59, 0xe8, 0xfb, 0x90, + 0xc6, 0x81, 0xc6, 0xdd, 0xbf, 0xb4, 0xbd, 0x75, + 0xd8, 0xde, 0xd8, 0xa2, 0x18, 0x7c, 0xe9, 0x67, + 0x1, 0xe3, 0x68, 0xa4, 0x67, 0x67, 0x8c, 0x24, + 0x8c, 0x8c, 0x8c, 0xab, 0xa7, 0x68, 0x5, 0xc9, + 0xfb, 0x6b, 0x36, 0x4b, 0x81, 0xe4, 0x8d, 0xbc, + 0x74, 0x90, 0xe4, 0xe4, 0xbf, 0xe4, 0x4b, 0xe4, + 0xb4, 0x9, 0xe1, 0x9f, 0x98, 0x91, 0x2c, 0x1f, + 0x65, 0xb3, 0x96, 0x96, 0xe7, 0x63, 0x73, 0x5b, + 0xa6, 0x8c, 0xab, 0x8c, 0xb3, 0x67, 0x48, 0x40, + 0x8b, 0x90, 0x90, 0xc6, 0xce, 0xb4, 0xb4, 0xc6, + 0x4b, 0xc6, 0xf4, 0xbb, 0x57, 0xcb, 0xc6, 0xe4, + 0xc4, 0x81, 0xdf, 0x39, 0xdf, 0xb4, 0xb4, 0xbb, + 0x4b, 0x74, 0xf4, 0xf4, 0x9a, 0x9a, 0xdf, 0xbf, + 0xbf, 0xbf, 0xf4, 0xaf, 0xaf, 0xe2, 0xe2, 0xbf, + 0xd8, 0xdb, 0xc6, 0x84, 0xd8, 0x18, 0x5c, 0xd4, + 0x59, 0x49, 0x24, 0x6, 0x58, 0x24, 0x62, 0x4d, + 0x4d, 0x4d, 0x37, 0x1c, 0x58, 0xab, 0x87, 0x5, + 0x68, 0x8c, 0xd3, 0xb5, 0x3b, 0x82, 0x24, 0x8c, + 0x2f, 0xa5, 0x96, 0xe, 0xef, 0xe5, 0x47, 0x47, + 0x6b, 0x81, 0xe1, 0xde, 0xdd, 0x57, 0x53, 0xe1, + 0xe4, 0xbb, 0x84, 0xdf, 0xe1, 0xe4, 0x12, 0x32, + 0x6f, 0x6b, 0xd5, 0x6e, 0x4, 0x1e, 0x88, 0xfd, + 0xe4, 0xe4, 0x1e, 0x47, 0xd9, 0x2a, 0x49, 0xd3, + 0x78, 0x62, 0x29, 0x29, 0x78, 0x62, 0x6d, 0x6d, + 0x1c, 0x67, 0x67, 0x58, 0x5, 0x45, 0x58, 0xd3, + 0x41, 0x62, 0x16, 0xa, 0xa, 0xd1, 0x62, 0x6d, + 0x6d, 0x30, 0xd7, 0x6c, 0x4, 0x4, 0x4, 0x97, + 0xaf, 0xbf, 0x97, 0xb4, 0xe2, 0xf4, 0xbf, 0xf4, + 0xf4, 0xf4, 0x12, 0xc0, 0x93, 0x93, 0x97, 0x97, + 0x97, 0x93, 0x4, 0xd1, 0xd1, 0x0, 0xd1, 0xd1, + 0x0, 0xd1, 0x23, 0x23, 0xd1, 0x0, 0x23, 0x23, + 0x23, 0xf3, 0x12, 0x95, 0x44, 0x12, 0xbf, 0x44, + 0x44, 0xbf, 0x95, 0x44, 0x44, 0x57, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x73, 0x30, 0x30, 0x2f, 0x67, 0x8c, 0xe3, 0x4d, + 0x61, 0xe3, 0xd3, 0x65, 0x9e, 0x4f, 0xfd, 0xc6, + 0xde, 0xdf, 0x83, 0xe1, 0xe1, 0xe4, 0xd8, 0xa9, + 0x8b, 0x1e, 0xb9, 0x54, 0x39, 0x4f, 0xd9, 0xa5, + 0x1, 0x67, 0x68, 0x8c, 0x24, 0x24, 0x58, 0x58, + 0x4d, 0x41, 0x8c, 0x2f, 0x67, 0xa4, 0xa0, 0xc9, + 0x2a, 0x3, 0x6b, 0x8b, 0x18, 0xd8, 0xde, 0xc6, + 0x1e, 0x9c, 0xf3, 0xbf, 0xe4, 0x32, 0xf5, 0xdf, + 0xd8, 0xfd, 0xde, 0x25, 0x4e, 0x64, 0xab, 0x64, + 0x8c, 0x82, 0x30, 0x1b, 0xd2, 0xd2, 0xf1, 0xb3, + 0x1, 0x87, 0x8c, 0xb3, 0x68, 0x1, 0x2f, 0x27, + 0xe5, 0xe5, 0xca, 0x86, 0x8e, 0xfd, 0xe1, 0x81, + 0x6b, 0x9f, 0xb2, 0xdd, 0x8e, 0x6b, 0x47, 0x97, + 0x4, 0xfd, 0xca, 0x99, 0x47, 0xcf, 0x7, 0x9, + 0x47, 0x83, 0xcc, 0xe4, 0x12, 0xc0, 0x81, 0xc0, + 0x93, 0xaf, 0x95, 0x81, 0xf5, 0xd8, 0xe1, 0x32, + 0x4, 0x6f, 0xde, 0x97, 0x9c, 0x47, 0xa9, 0xb8, + 0x67, 0xd3, 0xd3, 0xb5, 0x82, 0x24, 0x82, 0xe3, + 0x5, 0x87, 0xb5, 0x16, 0x41, 0x24, 0x5e, 0x29, + 0xb5, 0xb5, 0xd3, 0xe3, 0x8a, 0xb5, 0x1c, 0x5, + 0x73, 0x5b, 0x73, 0x73, 0xe, 0xd5, 0xd5, 0xd5, + 0xd7, 0xd7, 0x3a, 0xd7, 0x4, 0xde, 0x1e, 0x32, + 0xdd, 0xbf, 0xc0, 0x9c, 0x93, 0xf3, 0x47, 0xd7, + 0x6c, 0xd7, 0xa5, 0x5d, 0xd5, 0x6c, 0xe5, 0x4, + 0x8e, 0xb1, 0x47, 0xe5, 0x77, 0x50, 0xab, 0xd3, + 0x78, 0x1c, 0xe3, 0xe3, 0x68, 0x45, 0x58, 0x8a, + 0x1c, 0x5, 0x58, 0xb5, 0xac, 0x6d, 0xb5, 0xac, + 0x5e, 0x1c, 0x29, 0x1c, 0x3b, 0x3b, 0x8a, 0xa, + 0x62, 0x1c, 0x58, 0x67, 0xd7, 0x4, 0xe0, 0x4, + 0x4, 0x4, 0x4, 0x4, 0xbb, 0x95, 0x4, 0x93, + 0xf4, 0x97, 0x4, 0x97, 0x4, 0x4, 0x4, 0x4, + 0x5, 0x5, 0x5, 0xd1, 0xd1, 0x23, 0x0, 0xd1, + 0x0, 0x0, 0x23, 0x0, 0x0, 0xd1, 0x23, 0x1c, + 0x1c, 0x16, 0xc0, 0xc0, 0x44, 0xbf, 0x95, 0xe2, + 0x44, 0x12, 0xbf, 0x95, 0x44, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x0, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa6, 0x30, 0x87, 0x8c, 0xab, 0x24, 0x6d, 0x6d, + 0x4d, 0xe3, 0xda, 0x65, 0xc3, 0x6e, 0xe5, 0x8e, + 0xde, 0x9c, 0x4, 0x9d, 0x9f, 0x9c, 0x4, 0xf5, + 0x9c, 0x4, 0x4, 0x26, 0x1e, 0xd5, 0x77, 0x2f, + 0xab, 0x82, 0x8c, 0x8c, 0x8c, 0x68, 0x73, 0x8, + 0x87, 0xb5, 0x41, 0x30, 0x8c, 0xe3, 0x87, 0x8c, + 0x2f, 0x77, 0xd7, 0x1e, 0x1e, 0x47, 0x4, 0x2e, + 0x9c, 0x4, 0x4, 0xc0, 0xfd, 0x4, 0x97, 0xc0, + 0x3, 0x3, 0x6c, 0x1e, 0x77, 0xa5, 0x73, 0x30, + 0x87, 0x8a, 0x1, 0x8, 0x2f, 0x8c, 0x2f, 0x2f, + 0x8c, 0x8c, 0x8, 0x1b, 0xf0, 0x8, 0x73, 0x19, + 0x8f, 0xe5, 0x69, 0xbd, 0x3, 0x3a, 0xc4, 0xdd, + 0x47, 0x4, 0x1e, 0xb1, 0x4, 0x4, 0x4, 0x6f, + 0xe5, 0x3, 0x9f, 0xde, 0x4, 0xa9, 0xe1, 0xce, + 0x97, 0xdd, 0xbf, 0xc0, 0x97, 0x93, 0xf3, 0x12, + 0x93, 0xfd, 0xb4, 0xf3, 0x93, 0xfd, 0x81, 0x97, + 0x4, 0x32, 0xdd, 0x32, 0x4, 0x9d, 0x98, 0x2c, + 0x8c, 0x61, 0xac, 0xbe, 0x8c, 0x8c, 0x87, 0xa4, + 0xa0, 0xa0, 0x58, 0x8a, 0x3b, 0xe3, 0x62, 0x78, + 0x6d, 0x4d, 0x5e, 0xe3, 0x58, 0x87, 0x24, 0x5, + 0xa4, 0x73, 0xf1, 0xf1, 0x89, 0x42, 0xd2, 0xa5, + 0x4a, 0xd7, 0x19, 0xd5, 0x4, 0xdd, 0xde, 0x6f, + 0x32, 0xbd, 0xde, 0xfd, 0x97, 0x9c, 0x3, 0xd5, + 0xd7, 0xd7, 0xd5, 0x96, 0xd9, 0x9c, 0x93, 0x97, + 0xf5, 0x99, 0x3, 0x5d, 0x5d, 0x49, 0xab, 0xb5, + 0xa, 0x41, 0x58, 0xe3, 0x5, 0xa4, 0x30, 0x58, + 0x58, 0xda, 0x29, 0x62, 0x78, 0x8a, 0x82, 0x62, + 0x1c, 0x58, 0x67, 0x58, 0x68, 0x5, 0xda, 0x62, + 0x62, 0x29, 0x1c, 0x41, 0x67, 0x6c, 0x6c, 0x4, + 0x4, 0x93, 0x4, 0x93, 0xe2, 0xf4, 0x93, 0x95, + 0xe2, 0xf4, 0x97, 0x4, 0x97, 0x97, 0x4, 0x97, + 0xd1, 0xa, 0xa, 0x23, 0xd1, 0xd1, 0xd1, 0x0, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x16, 0xbf, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x23, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xd3, 0x67, 0x58, 0xe3, 0xb5, 0x5, 0x42, 0x67, + 0x58, 0xa0, 0xa0, 0xc9, 0xf1, 0xd5, 0xe5, 0x3, + 0x9f, 0x32, 0x97, 0x9c, 0x9b, 0x6f, 0x97, 0x32, + 0xe4, 0x8e, 0xe5, 0x74, 0x3a, 0x5d, 0x2c, 0xab, + 0xd3, 0x6d, 0x67, 0xa6, 0xb3, 0xa0, 0x5b, 0x1b, + 0x2f, 0x58, 0x58, 0x37, 0x5e, 0xe3, 0x8c, 0x8c, + 0x1, 0xa5, 0xe5, 0xde, 0xb1, 0x6f, 0xca, 0xf3, + 0xdd, 0x4, 0x32, 0x81, 0xc8, 0x3, 0x8e, 0xe4, + 0x93, 0xe5, 0xfd, 0x7b, 0x47, 0xd5, 0x73, 0xa0, + 0x58, 0x58, 0x82, 0x87, 0x87, 0x24, 0x8, 0x79, + 0x8, 0x68, 0xa0, 0x42, 0xd2, 0xf1, 0xc9, 0x1b, + 0xef, 0xa9, 0xd8, 0xe4, 0x9c, 0x39, 0xc6, 0xe4, + 0xf3, 0xce, 0x9c, 0x99, 0x4, 0x4, 0xd8, 0xfd, + 0x7d, 0x7f, 0x53, 0xc6, 0xf3, 0x81, 0x4b, 0x8d, + 0xc0, 0xbf, 0x95, 0xfa, 0xbd, 0xe4, 0x7, 0xe4, + 0xf5, 0x90, 0xe1, 0x95, 0x12, 0xe4, 0xdf, 0xf5, + 0x32, 0xf3, 0x7, 0x81, 0x7d, 0x8b, 0x80, 0x91, + 0x49, 0x94, 0xbe, 0xb5, 0xb3, 0x67, 0x24, 0xc3, + 0x30, 0x2f, 0xd3, 0xb5, 0x24, 0x82, 0x6d, 0x1c, + 0x58, 0x87, 0x4d, 0xe3, 0x8c, 0x1, 0xac, 0x41, + 0x58, 0x87, 0xd3, 0x1, 0xa6, 0xa0, 0x5b, 0x79, + 0x4a, 0xd7, 0x4a, 0x6e, 0xe5, 0xbd, 0xde, 0xfd, + 0x90, 0xdf, 0xe1, 0x9d, 0xfd, 0xde, 0x6b, 0xd7, + 0x6c, 0x6c, 0x2a, 0x67, 0xc9, 0x25, 0x81, 0x9f, + 0xd8, 0x39, 0x43, 0x5d, 0x7e, 0x5d, 0x67, 0xe3, + 0x1c, 0x41, 0xe3, 0x29, 0xe3, 0x41, 0x24, 0xd3, + 0xb5, 0xe3, 0xe3, 0x3b, 0xe3, 0x67, 0x30, 0x1c, + 0x1c, 0x8a, 0x41, 0xb5, 0x4d, 0x82, 0xb5, 0x78, + 0xac, 0x1c, 0x58, 0x45, 0xa0, 0x6c, 0x6c, 0x6c, + 0x4, 0x97, 0x4, 0xb4, 0xbc, 0x9a, 0xf4, 0xb4, + 0xf4, 0xbb, 0x93, 0x97, 0x4, 0x97, 0x4, 0xa, + 0xd1, 0x23, 0x23, 0x23, 0xd1, 0x0, 0x0, 0x23, + 0x34, 0x23, 0x23, 0x23, 0x0, 0x0, 0x23, 0x23, + 0x0, 0x0, 0x29, 0x12, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x58, 0x8, 0xf1, 0x58, 0xe3, 0x30, 0x2f, 0x1, + 0x52, 0x59, 0x4e, 0x91, 0x48, 0x1e, 0x1e, 0x39, + 0x81, 0xbf, 0xc0, 0xbb, 0xdf, 0xdf, 0xdd, 0xe4, + 0x57, 0x9f, 0x99, 0x27, 0xdb, 0xd6, 0xc5, 0xa6, + 0x24, 0xe3, 0x8c, 0x8c, 0x24, 0x58, 0x8, 0x67, + 0x8c, 0x8c, 0x24, 0x58, 0xe3, 0x58, 0x8, 0x73, + 0xa6, 0x1b, 0x1e, 0x2e, 0x85, 0xb2, 0x83, 0xc6, + 0x57, 0x9f, 0xe1, 0x4b, 0xdf, 0xc4, 0xbf, 0xbf, + 0xc6, 0x99, 0xdf, 0x81, 0x9d, 0x2c, 0xa8, 0x52, + 0xab, 0x1, 0xa8, 0xc9, 0x5b, 0xa0, 0x42, 0x77, + 0xa5, 0x58, 0x8c, 0xa8, 0x1, 0xab, 0x60, 0xd4, + 0x7d, 0x83, 0xc6, 0xb4, 0xb4, 0x9c, 0xce, 0xb4, + 0x8d, 0x81, 0x9f, 0xd8, 0x86, 0x53, 0x74, 0xf9, + 0x99, 0x9c, 0xbf, 0xbf, 0xaf, 0xb4, 0xbf, 0xbf, + 0xf4, 0x9a, 0x9a, 0xe1, 0xe4, 0xb4, 0x9a, 0xe4, + 0xf3, 0xc0, 0xbf, 0xe2, 0xb4, 0xf4, 0xe1, 0xc6, + 0xe4, 0x7, 0xbc, 0xf6, 0x1e, 0x9f, 0xf6, 0x18, + 0x4f, 0x2f, 0x82, 0x8a, 0xa6, 0xb3, 0xbe, 0x4d, + 0x82, 0x5e, 0xac, 0xe3, 0x8a, 0xb5, 0x24, 0xe3, + 0xad, 0x30, 0x87, 0x1c, 0x58, 0xbe, 0x4d, 0x4d, + 0x4d, 0xa, 0x5e, 0x4d, 0xda, 0xad, 0x30, 0x73, + 0x63, 0xc2, 0x4a, 0x6e, 0xd7, 0x47, 0x3, 0xa9, + 0xe5, 0x6f, 0x4, 0x47, 0x4, 0x47, 0xd7, 0xd7, + 0xef, 0x2a, 0xb8, 0x8c, 0x60, 0x8b, 0xd8, 0x18, + 0xc4, 0xce, 0x47, 0x6b, 0xd5, 0x77, 0x1b, 0x58, + 0x41, 0x3b, 0x3b, 0x78, 0x62, 0xb5, 0x4d, 0x6d, + 0x8a, 0x30, 0x58, 0xb5, 0x8a, 0x68, 0x30, 0x41, + 0xb5, 0xe3, 0x62, 0x62, 0xa, 0x8a, 0xb5, 0x78, + 0xa, 0x6d, 0x6d, 0x6d, 0x8a, 0x8a, 0x73, 0xe5, + 0xd7, 0x6c, 0x4, 0x4, 0x14, 0x4, 0x4, 0x97, + 0x97, 0x4, 0x4, 0x97, 0x4, 0xa, 0xd1, 0xd1, + 0x23, 0x23, 0x23, 0x0, 0x0, 0xd1, 0x23, 0x0, + 0x0, 0x23, 0x23, 0x23, 0x23, 0x23, 0x0, 0x23, + 0x0, 0x23, 0x16, 0xbf, 0xc0, 0x95, 0xbf, 0x44, + 0x44, 0xbf, 0x95, 0x44, 0x44, 0x7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa6, 0x73, 0x73, 0x58, 0x1c, 0x6d, 0xe3, 0xe3, + 0xc3, 0x64, 0xe8, 0x8b, 0x18, 0x81, 0x7b, 0xc0, + 0xbd, 0xdd, 0xbd, 0xc6, 0x70, 0x40, 0xd8, 0x71, + 0x74, 0xd8, 0xed, 0xd8, 0x90, 0x25, 0x6e, 0xd2, + 0x67, 0x5, 0x58, 0x87, 0x82, 0x82, 0x8c, 0x82, + 0xd3, 0xd3, 0xb3, 0x58, 0x8a, 0x5, 0xa0, 0x1b, + 0x63, 0xe, 0x3, 0x1e, 0xd8, 0xa9, 0x8e, 0x81, + 0xc6, 0x1e, 0xbd, 0xe4, 0xdd, 0x93, 0xbd, 0xe4, + 0xde, 0x3, 0x3, 0x47, 0x77, 0xc7, 0x2f, 0x2f, + 0x8c, 0x30, 0x96, 0xd2, 0x1b, 0x8, 0xb3, 0x2f, + 0x2f, 0xd3, 0x8c, 0x24, 0x24, 0x8c, 0xc7, 0xd5, + 0xd7, 0x9c, 0xd8, 0x81, 0xb1, 0x8e, 0x9d, 0x36, + 0x9c, 0x47, 0x9d, 0x8e, 0x6f, 0xca, 0x39, 0x12, + 0x32, 0xc0, 0xe4, 0xb4, 0x93, 0xdd, 0x57, 0x57, + 0xf5, 0xfd, 0x75, 0xdd, 0x93, 0xdd, 0x81, 0x93, + 0x97, 0x93, 0xb4, 0xde, 0xf5, 0xde, 0xbc, 0x9d, + 0x9c, 0xdf, 0x84, 0x7b, 0x32, 0xde, 0x8b, 0x7c, + 0x77, 0x2f, 0xd3, 0xb5, 0x82, 0x8c, 0x82, 0xd3, + 0x8c, 0x6d, 0x62, 0x29, 0x41, 0x4d, 0x62, 0xb5, + 0x58, 0x24, 0xd3, 0xe3, 0x4d, 0xb5, 0x6d, 0x76, + 0x41, 0x1c, 0x62, 0xa, 0x29, 0x6d, 0xb5, 0x24, + 0xb3, 0x8, 0xa5, 0xa5, 0xa5, 0x6e, 0x1b, 0x19, + 0x6c, 0x6c, 0x4a, 0x6e, 0xd5, 0xd7, 0xd7, 0xa5, + 0xa8, 0x67, 0xa6, 0x60, 0x3e, 0x1e, 0x9c, 0xe5, + 0x32, 0xde, 0x6c, 0xd2, 0x2f, 0x67, 0x8c, 0xab, + 0x6d, 0x82, 0xda, 0xda, 0x58, 0x58, 0x3b, 0x3b, + 0xe3, 0x58, 0x82, 0x78, 0xa, 0x8a, 0xb5, 0xe3, + 0xe3, 0xe3, 0xda, 0x6d, 0x8a, 0xf1, 0x58, 0x29, + 0x62, 0xa, 0xa, 0x29, 0xd1, 0xa, 0x1c, 0x41, + 0x41, 0x8, 0xa0, 0xa0, 0x4, 0x4, 0x4, 0x4, + 0x45, 0x5, 0x4, 0xa, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0x23, 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, + 0x23, 0x0, 0x23, 0x0, 0x0, 0x23, 0x0, 0x23, + 0x0, 0x0, 0x23, 0xbf, 0xbb, 0xbf, 0xc0, 0x95, + 0x44, 0xbb, 0xbf, 0xbf, 0xbb, 0x9a, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x67, 0x30, 0xa6, 0x8c, 0xd3, 0xd3, 0x87, 0x87, + 0xb3, 0xc5, 0x8f, 0x9b, 0x83, 0x6f, 0x4, 0x32, + 0x81, 0x47, 0x6b, 0xf5, 0xd8, 0x3a, 0x4, 0x99, + 0x90, 0x4, 0x4, 0x7b, 0x6b, 0xc2, 0xe, 0xa5, + 0x8c, 0x8c, 0x24, 0x87, 0x8c, 0xab, 0x2f, 0x5, + 0x1c, 0x5, 0xf1, 0x67, 0x82, 0xda, 0x8a, 0xf1, + 0x2f, 0xa5, 0x6e, 0x7d, 0xca, 0x6c, 0x4, 0xdd, + 0x9c, 0x9c, 0x9c, 0xbd, 0x93, 0x47, 0x6b, 0x9c, + 0x8e, 0x3, 0x3, 0x6b, 0x6e, 0x42, 0xe9, 0x42, + 0x8c, 0x87, 0x30, 0x2f, 0x2f, 0x1, 0x87, 0xb3, + 0xb3, 0x67, 0x67, 0x5a, 0x30, 0x68, 0x73, 0x4a, + 0xd7, 0xe5, 0x7d, 0x6b, 0x6c, 0x6c, 0x9d, 0x7d, + 0xef, 0xd7, 0x6f, 0x9c, 0xe5, 0x7d, 0x99, 0xde, + 0x6f, 0x93, 0x81, 0x90, 0x9c, 0xde, 0x57, 0x1e, + 0x9c, 0x9c, 0xb4, 0xf3, 0x97, 0x97, 0xdf, 0x6f, + 0x4, 0x4, 0xe1, 0x9f, 0x6f, 0xdd, 0xe1, 0xd8, + 0x97, 0x9c, 0xc6, 0xbd, 0x4, 0xb1, 0x8b, 0x4e, + 0xa8, 0x94, 0xac, 0x82, 0x24, 0x82, 0x8c, 0xb3, + 0xa6, 0xa0, 0xda, 0x8a, 0xe3, 0x6d, 0x29, 0x6d, + 0x29, 0x78, 0x76, 0xe3, 0xda, 0x5, 0x58, 0x24, + 0x58, 0x41, 0x29, 0xa, 0x29, 0xa, 0x78, 0x29, + 0x6d, 0xb5, 0xd3, 0x67, 0xf0, 0x5b, 0x5b, 0x63, + 0x4a, 0x4a, 0x4a, 0x1b, 0xd2, 0x6e, 0xd2, 0x2f, + 0xc3, 0x64, 0x59, 0x77, 0x1e, 0xc6, 0xc6, 0x4, + 0x2e, 0x81, 0x47, 0x5d, 0x67, 0xd3, 0xd3, 0xa, + 0xac, 0xbe, 0xb5, 0x58, 0xb3, 0xa0, 0x5, 0x3b, + 0x1c, 0x24, 0xb5, 0x6d, 0x29, 0x78, 0x6d, 0xa, + 0xbe, 0xe3, 0x6d, 0x3b, 0x58, 0x67, 0x58, 0x8a, + 0xa, 0xa, 0x62, 0xd1, 0xd1, 0xd1, 0x62, 0x62, + 0x1c, 0xa0, 0x45, 0x45, 0x30, 0x4, 0x6c, 0x4, + 0x41, 0xa, 0x62, 0xd1, 0xd1, 0xd1, 0xd1, 0x0, + 0x0, 0xd1, 0xd1, 0x23, 0x23, 0x23, 0x23, 0x0, + 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x29, 0xc0, 0xbf, 0xbb, 0xbf, 0x44, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0xd1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x82, 0xe3, 0x41, 0xd3, 0xab, 0x87, 0xc9, 0xf0, + 0xc2, 0x9c, 0x6f, 0xed, 0xca, 0x1e, 0x6c, 0x32, + 0xd8, 0xa9, 0xe5, 0xbd, 0xce, 0x6f, 0x4, 0x9c, + 0xf5, 0x97, 0x4, 0xfd, 0x8b, 0x2c, 0x2f, 0xab, + 0xd3, 0x82, 0x1c, 0xc3, 0xa6, 0xf1, 0x73, 0xa0, + 0xa0, 0x5, 0x58, 0xd3, 0x62, 0x76, 0xa, 0xd3, + 0x8c, 0xa5, 0xd5, 0x9c, 0x9c, 0x4, 0x32, 0xb4, + 0x81, 0x6b, 0xfd, 0xe4, 0x93, 0x4, 0x27, 0x86, + 0x9c, 0x4, 0xb1, 0x9c, 0xd9, 0x6e, 0xa5, 0xe9, + 0x8, 0x58, 0x24, 0x8c, 0x8c, 0x8c, 0xb3, 0x24, + 0x58, 0x2f, 0xe9, 0xa5, 0x89, 0x30, 0x5a, 0x5d, + 0xe5, 0x47, 0xa9, 0x9d, 0x47, 0x4, 0x2e, 0x9c, + 0x9c, 0x97, 0xdd, 0xde, 0x69, 0x6f, 0x1e, 0x57, + 0xde, 0xde, 0xc6, 0xc4, 0xf3, 0xf3, 0xbf, 0xbf, + 0xbf, 0xbf, 0xbf, 0xe4, 0xdd, 0xe4, 0xe1, 0x9d, + 0xdd, 0xc0, 0xb4, 0xe4, 0xf3, 0xbf, 0xbf, 0xbf, + 0xe4, 0xf3, 0x8d, 0xe1, 0xd8, 0xe1, 0xcb, 0x91, + 0x3f, 0x87, 0x82, 0xb5, 0x82, 0x6d, 0x24, 0x8c, + 0x68, 0xb3, 0x8c, 0xb5, 0x82, 0x82, 0xe3, 0xe3, + 0x6d, 0x29, 0x1c, 0xe3, 0x82, 0xe3, 0xe3, 0x24, + 0xb5, 0x41, 0x1c, 0x62, 0xa, 0x29, 0x16, 0x6d, + 0x6d, 0x6d, 0x1c, 0x24, 0x68, 0xb3, 0x8, 0x73, + 0x2d, 0xe, 0xd5, 0xe, 0x2f, 0x1b, 0xc2, 0x60, + 0xd4, 0x60, 0x60, 0xfb, 0x9f, 0x84, 0xb4, 0xe1, + 0xbc, 0x57, 0x15, 0xe8, 0xa8, 0x94, 0x82, 0x4d, + 0x4d, 0x78, 0x78, 0xa, 0xac, 0xac, 0x4d, 0x29, + 0x37, 0x24, 0x29, 0xda, 0x58, 0x8a, 0x1c, 0x1c, + 0x8a, 0x4d, 0x62, 0xa, 0x62, 0xe3, 0xb5, 0x78, + 0x4d, 0x4d, 0x62, 0x16, 0x1c, 0x62, 0xa, 0xa, + 0x62, 0xa, 0xa, 0xa, 0x41, 0xa, 0x62, 0x62, + 0x62, 0x62, 0xd1, 0xd1, 0x23, 0x23, 0x0, 0x23, + 0xd1, 0x0, 0x0, 0x23, 0x23, 0x0, 0x23, 0x0, + 0x34, 0x23, 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xbf, 0xbf, 0x44, + 0x44, 0xf4, 0x44, 0x44, 0x44, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x8c, 0x87, 0x5e, 0x82, 0x87, 0x4e, 0xb8, 0xe8, + 0x90, 0x57, 0xe1, 0x85, 0x75, 0x53, 0xc6, 0xb4, + 0x84, 0xc6, 0xc6, 0xbb, 0xf4, 0xe4, 0xde, 0xe4, + 0xe4, 0x57, 0x9f, 0xe1, 0x53, 0x91, 0xa8, 0x87, + 0x87, 0x8c, 0x24, 0xb5, 0x87, 0x87, 0xb3, 0x67, + 0x8c, 0xb5, 0xe3, 0x58, 0x58, 0x41, 0xe3, 0xb5, + 0x30, 0x96, 0x6b, 0x90, 0x81, 0xc6, 0x75, 0xb4, + 0xb4, 0x75, 0xf6, 0x75, 0xb4, 0xb4, 0xe4, 0xe4, + 0xe4, 0xfa, 0xc6, 0x75, 0x9f, 0x3e, 0x49, 0x52, + 0x67, 0x8, 0x67, 0x59, 0xad, 0x73, 0x5b, 0x2f, + 0x68, 0x68, 0xa8, 0x2c, 0x67, 0x1, 0xa8, 0x4e, + 0x8b, 0x1e, 0x81, 0xed, 0x9c, 0x1e, 0x81, 0xde, + 0x97, 0xb9, 0x9f, 0x74, 0x75, 0xe1, 0x9a, 0xcb, + 0x4b, 0xe4, 0xb4, 0xb4, 0xbf, 0xf4, 0x95, 0xb4, + 0xf4, 0x95, 0x9a, 0xbc, 0xe1, 0xbf, 0xb4, 0xe1, + 0xc6, 0xc6, 0xb4, 0xbb, 0xbb, 0xf4, 0xb4, 0xc6, + 0xe4, 0xb4, 0x9a, 0xbc, 0xf6, 0xe1, 0x75, 0x18, + 0x7e, 0xd4, 0xc3, 0xd3, 0x24, 0xbe, 0xb5, 0x24, + 0xbe, 0xd3, 0xab, 0xa7, 0xb5, 0xb3, 0xa0, 0x8, + 0x67, 0x58, 0x3b, 0x8a, 0xe3, 0xa, 0x29, 0x1c, + 0x62, 0x4d, 0xd3, 0x58, 0xe3, 0x3b, 0x3b, 0x8a, + 0xd3, 0xe3, 0x1c, 0x6d, 0xe3, 0xb5, 0x6, 0x1c, + 0xd3, 0x8c, 0x2f, 0xd2, 0x60, 0xc9, 0xd4, 0xd4, + 0x7f, 0x51, 0x7c, 0xc2, 0x18, 0x57, 0xb4, 0xde, + 0x9f, 0x39, 0x27, 0xd5, 0x2c, 0x1, 0x87, 0xda, + 0x24, 0x78, 0x62, 0x62, 0x78, 0xa, 0xa, 0x76, + 0x78, 0x4d, 0x6d, 0x5, 0x8, 0x67, 0x5, 0x3b, + 0x4d, 0xa, 0xa, 0x62, 0x29, 0xd1, 0xd1, 0x62, + 0xe3, 0xe3, 0x29, 0x1c, 0x1c, 0xa, 0xa, 0x62, + 0xa, 0xa, 0xd1, 0x62, 0x62, 0xd1, 0xd1, 0xa, + 0x62, 0xd1, 0xd1, 0x23, 0xd1, 0x23, 0xd1, 0x0, + 0xd1, 0x0, 0x23, 0x23, 0x0, 0x23, 0x23, 0x23, + 0x23, 0x23, 0x0, 0x23, 0x23, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xbf, 0x95, 0xbf, + 0xbb, 0xbf, 0xbf, 0xf4, 0x44, 0x9a, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xa0, 0xc7, 0x5a, 0x30, 0xc3, 0xa8, 0x49, 0xe8, + 0x8b, 0x18, 0x18, 0xe4, 0xb4, 0xce, 0x81, 0xdf, + 0xc6, 0xe4, 0xdd, 0x81, 0x4b, 0x90, 0x9d, 0xde, + 0xe1, 0x9f, 0x8b, 0x90, 0xf8, 0x27, 0x77, 0xc9, + 0xa0, 0x87, 0xd3, 0xe3, 0x24, 0x1c, 0xe3, 0xe3, + 0x41, 0x58, 0xb5, 0x82, 0x30, 0x2f, 0x8c, 0x58, + 0xa0, 0x96, 0xe8, 0x9f, 0xde, 0x9f, 0x88, 0xc6, + 0xe4, 0xde, 0xde, 0xdf, 0xdf, 0x9c, 0xf3, 0xcd, + 0xd8, 0x39, 0x51, 0xa2, 0xa9, 0x50, 0xa7, 0x82, + 0x8c, 0xe9, 0xe9, 0x73, 0xa0, 0x5b, 0x79, 0x2c, + 0x2f, 0x67, 0x87, 0x82, 0x65, 0x67, 0xc3, 0x64, + 0xe9, 0xd7, 0x47, 0x4, 0xd7, 0xd5, 0xe5, 0x3a, + 0x3, 0x6c, 0x7d, 0xfb, 0x47, 0xbd, 0xe4, 0xe4, + 0xca, 0xf5, 0xbf, 0xb4, 0x32, 0xf5, 0xdf, 0x9f, + 0xde, 0xc0, 0xf4, 0x90, 0x9c, 0xc0, 0xbf, 0x12, + 0x6f, 0x9c, 0xb4, 0x2e, 0xfd, 0xdd, 0xf9, 0x6b, + 0x47, 0xf3, 0xe4, 0xde, 0x6b, 0x32, 0xc6, 0x47, + 0x77, 0xc7, 0x67, 0x1, 0x94, 0xd3, 0x82, 0xe3, + 0x6d, 0x87, 0x8, 0xa4, 0x82, 0xe3, 0x58, 0x1, + 0xab, 0x24, 0x41, 0xb5, 0x24, 0xe3, 0xda, 0xe3, + 0x29, 0x16, 0x58, 0x67, 0xe3, 0x6d, 0xda, 0xd3, + 0xac, 0xb5, 0xe3, 0xe3, 0x6d, 0x4d, 0xda, 0xda, + 0x6d, 0x6d, 0x1c, 0x8c, 0xd3, 0xa7, 0x87, 0x60, + 0x22, 0xb, 0x27, 0xe5, 0x39, 0xd8, 0xde, 0x4, + 0x6f, 0x6b, 0xd7, 0x77, 0x8c, 0xd3, 0xbe, 0xbe, + 0x55, 0xab, 0xa, 0x58, 0x82, 0x4d, 0x16, 0x3b, + 0x16, 0xa, 0x62, 0x1c, 0xe3, 0xb5, 0xb5, 0x29, + 0xa, 0x1c, 0x6d, 0x8a, 0x8a, 0x8a, 0x1c, 0x1c, + 0x1c, 0xa, 0xd1, 0xd1, 0xd1, 0x62, 0x23, 0xd1, + 0xd1, 0xd1, 0xd1, 0xa, 0x62, 0xa, 0x23, 0xd1, + 0x23, 0xd1, 0x23, 0x23, 0x23, 0x0, 0xd1, 0x34, + 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x0, 0x0, + 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xa, 0xaf, 0xe2, + 0xaf, 0xe2, 0xe2, 0xe2, 0x44, 0x9a, 0x0, 0x0, + 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x10, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x30, 0x2f, 0x1, 0xa5, 0x60, 0xb8, 0x50, 0x27, + 0x1e, 0x7d, 0x6f, 0xf5, 0x12, 0x93, 0x9c, 0x9c, + 0xf3, 0x8e, 0x3, 0x36, 0xf8, 0x6b, 0x47, 0x6f, + 0xde, 0x6f, 0xe5, 0x6f, 0xfd, 0xef, 0xa5, 0x87, + 0x68, 0x8c, 0x8c, 0x8c, 0xb3, 0x68, 0x87, 0xda, + 0x30, 0x8, 0x82, 0x6d, 0x58, 0x8c, 0xab, 0xe3, + 0x68, 0xa6, 0xae, 0x51, 0x1e, 0x47, 0xe5, 0x81, + 0x93, 0x4, 0x97, 0xf3, 0x32, 0x4, 0xfd, 0xd8, + 0x2e, 0xe5, 0x27, 0x88, 0x27, 0xc5, 0x2f, 0x24, + 0x58, 0x8, 0x2f, 0x8c, 0x30, 0x67, 0x8c, 0x1, + 0x67, 0x8, 0xa6, 0xa0, 0x8, 0x73, 0x73, 0x58, + 0x42, 0x4a, 0xd7, 0xd7, 0xd7, 0x4a, 0x4a, 0x5d, + 0xd5, 0x6c, 0xf5, 0x32, 0x9c, 0x32, 0xf3, 0x9, + 0x97, 0x97, 0xdd, 0x81, 0x47, 0x97, 0xce, 0xc6, + 0x4, 0x93, 0xbf, 0xc0, 0x97, 0xc0, 0xbf, 0xc0, + 0x8e, 0x93, 0xbf, 0xd8, 0x47, 0x2e, 0xdd, 0xaf, + 0x4, 0xc0, 0xe4, 0x32, 0x97, 0x8e, 0xde, 0x3, + 0x50, 0x2c, 0x64, 0xab, 0x66, 0x82, 0x68, 0xa4, + 0x68, 0xa4, 0xa0, 0xb3, 0xe3, 0xb5, 0x6, 0xd3, + 0xa, 0x62, 0xe3, 0x82, 0xbe, 0xe3, 0x45, 0xa0, + 0x58, 0x8a, 0x45, 0x5, 0xe3, 0xa, 0xa, 0x62, + 0xd1, 0x78, 0x6d, 0xbe, 0x4d, 0x4d, 0x5, 0x5, + 0xb5, 0xe3, 0xb5, 0x6, 0x6d, 0xab, 0xa6, 0x4e, + 0x22, 0x5c, 0x1e, 0x32, 0xce, 0xcc, 0xde, 0x32, + 0xd8, 0x9d, 0x3a, 0x2c, 0xab, 0xd3, 0x82, 0x58, + 0xa7, 0x55, 0xab, 0xad, 0x59, 0xa7, 0x82, 0xda, + 0xb5, 0x62, 0xa, 0x29, 0xfe, 0x5e, 0xa, 0x1c, + 0x1c, 0xa, 0x1c, 0x5, 0xa0, 0x8a, 0x1c, 0x1c, + 0x62, 0xa, 0xd1, 0xa, 0xd1, 0xd1, 0xd1, 0xa, + 0x62, 0xd1, 0x23, 0xa, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0x23, 0x23, 0x0, 0xd1, 0x23, 0x0, 0x23, + 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, 0x23, 0x23, + 0x0, 0x23, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x16, 0x0, 0x0, 0x0, 0xa, 0x0, 0xf4, + 0xbb, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xab, 0xab, 0x1, 0xe9, 0x27, 0x35, 0xd5, 0x47, + 0xde, 0x93, 0x4, 0x32, 0xe4, 0xdd, 0xfd, 0x97, + 0xe4, 0x1e, 0x3, 0x8e, 0xdd, 0x97, 0x4, 0xb1, + 0xde, 0x97, 0x4, 0xfd, 0xfd, 0x5d, 0xab, 0x58, + 0xe3, 0xb5, 0xd3, 0x87, 0x73, 0x1b, 0x42, 0xa0, + 0xa0, 0xa4, 0xb5, 0x6d, 0x29, 0xac, 0x5e, 0x4d, + 0x87, 0xa5, 0xd4, 0x8b, 0x1e, 0x4, 0x97, 0xe4, + 0xf8, 0x32, 0xd8, 0x75, 0xd8, 0x32, 0x1e, 0xf6, + 0xde, 0x93, 0xbd, 0x81, 0x83, 0x8f, 0x5d, 0x67, + 0x58, 0x5a, 0x58, 0xb5, 0x8c, 0x67, 0x41, 0xd3, + 0x8, 0x63, 0x63, 0x1b, 0xa0, 0x5b, 0x79, 0x2f, + 0xe9, 0xd7, 0xd5, 0x5d, 0x4a, 0x7b, 0xe5, 0xd9, + 0x7d, 0x32, 0xe4, 0xe4, 0xdd, 0xdf, 0xe1, 0xe1, + 0xd8, 0xde, 0xe4, 0xe1, 0xde, 0xaf, 0x8d, 0xbf, + 0xc6, 0x8d, 0xf4, 0xbf, 0xb4, 0xe4, 0xc6, 0xc6, + 0x9f, 0xb4, 0xf4, 0x81, 0xf5, 0xdd, 0xf4, 0xf3, + 0xe4, 0x4b, 0xf3, 0xce, 0xd8, 0xd8, 0xf6, 0x5c, + 0x91, 0x4e, 0x22, 0x52, 0x66, 0x82, 0x67, 0xf1, + 0x67, 0xb3, 0xc3, 0xc3, 0x24, 0xd3, 0x82, 0x6d, + 0x6d, 0x1c, 0x30, 0x58, 0x4d, 0xb5, 0x68, 0x8, + 0x67, 0xb5, 0x82, 0xb5, 0xac, 0xb5, 0x24, 0x29, + 0x29, 0x62, 0xe3, 0xe3, 0xa, 0x78, 0xb5, 0x24, + 0x4d, 0x4d, 0x82, 0xc3, 0x87, 0xc3, 0x4e, 0x7d, + 0x90, 0xca, 0xc6, 0xe4, 0xb4, 0x9a, 0x4b, 0x83, + 0x9f, 0xdb, 0x91, 0x1, 0x8c, 0x87, 0xb3, 0x96, + 0x60, 0x1, 0x8c, 0xa8, 0x91, 0x66, 0xac, 0x6d, + 0x4d, 0xac, 0x37, 0xe3, 0xda, 0x29, 0x1c, 0x58, + 0x58, 0x62, 0x62, 0x6d, 0x87, 0xd3, 0xa, 0xa, + 0x78, 0xa, 0x62, 0x62, 0xa, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0x23, 0x23, 0xd1, 0xd1, 0xd1, 0xd1, + 0x62, 0xd1, 0xd1, 0xd1, 0xd1, 0x23, 0x23, 0x0, + 0x23, 0x0, 0x23, 0x0, 0x23, 0x23, 0x0, 0x0, + 0x23, 0x23, 0x0, 0x0, 0x29, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x87, 0xc3, 0x60, 0x83, 0x81, 0xc6, 0x81, 0xdf, + 0xb4, 0xb4, 0x9a, 0xe1, 0x4b, 0xe1, 0x74, 0xb4, + 0xb4, 0x4b, 0x99, 0xe4, 0xf4, 0xaf, 0xe1, 0x4b, + 0x90, 0xde, 0xcf, 0x53, 0xf6, 0x7f, 0x67, 0xc3, + 0x58, 0x1c, 0x6d, 0x24, 0x42, 0x79, 0x2f, 0xb3, + 0xb3, 0x24, 0xd3, 0xd3, 0x65, 0x6d, 0x29, 0xb5, + 0x67, 0x4f, 0xe8, 0x7d, 0x90, 0xb4, 0x70, 0xbc, + 0xf6, 0x39, 0xf9, 0x57, 0x9a, 0xe4, 0xdf, 0xdf, + 0xb4, 0xb4, 0x85, 0xf6, 0x5c, 0x3e, 0x48, 0x91, + 0x52, 0xad, 0xa4, 0xb3, 0x2, 0x1b, 0x8, 0x5, + 0x30, 0xd2, 0x5d, 0x52, 0x87, 0x68, 0x52, 0x49, + 0xa5, 0xd2, 0xc2, 0x6e, 0xd7, 0xd7, 0x6b, 0x5c, + 0x7d, 0xdf, 0xcd, 0x9a, 0x74, 0x90, 0xc6, 0x7, + 0xc6, 0xc6, 0xe4, 0xdf, 0xf3, 0xbf, 0xbb, 0xf4, + 0xc6, 0xb2, 0xb4, 0xf4, 0xbc, 0x75, 0x4b, 0x81, + 0xde, 0xbf, 0xb4, 0xe4, 0xf3, 0xe4, 0xcc, 0xf4, + 0x75, 0xd8, 0x85, 0x84, 0x40, 0x53, 0x8b, 0x8b, + 0x8b, 0x9f, 0x40, 0x60, 0xab, 0xbe, 0x94, 0xd3, + 0x5e, 0x4d, 0xab, 0x94, 0xab, 0xab, 0x68, 0xa4, + 0xda, 0x30, 0xf1, 0xb3, 0x6d, 0x1c, 0xb5, 0xac, + 0xac, 0xbe, 0x24, 0x24, 0xe3, 0xa7, 0xa4, 0xa4, + 0x3b, 0x4d, 0xb5, 0xe3, 0x6d, 0x62, 0x78, 0x78, + 0x4d, 0x6d, 0x65, 0x59, 0xd4, 0x35, 0x1e, 0x9b, + 0xc6, 0xc6, 0xb4, 0xdd, 0xde, 0xbc, 0x9f, 0x47, + 0xd8, 0x88, 0xa3, 0x42, 0x59, 0xc3, 0x96, 0x27, + 0x27, 0x4e, 0x8c, 0x49, 0x52, 0x66, 0xac, 0x61, + 0x37, 0x61, 0x4d, 0x1c, 0x3b, 0x8a, 0x1c, 0x41, + 0x41, 0x62, 0xd1, 0x62, 0xa, 0x76, 0x76, 0x62, + 0x29, 0x78, 0x62, 0x6d, 0x29, 0xd1, 0xd1, 0xd1, + 0x23, 0xd1, 0x0, 0xd1, 0xd1, 0xd1, 0x23, 0xd1, + 0xa, 0xa, 0x23, 0x76, 0xa, 0xd1, 0x0, 0x23, + 0x23, 0x23, 0x0, 0x23, 0x0, 0x23, 0x0, 0xd1, + 0x29, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0xbb, 0xf4, 0xf4, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x10, 0x0, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x10, 0x0, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xd4, 0x6e, 0x6e, 0xf5, 0xe4, 0x81, 0x71, 0xd8, + 0xe1, 0xb4, 0x9f, 0xe1, 0x81, 0xf3, 0xbd, 0xe4, + 0xf4, 0xe4, 0xf5, 0xe4, 0xb4, 0xe4, 0xd8, 0x53, + 0x1e, 0x36, 0x6b, 0x9f, 0x83, 0xd5, 0xe7, 0x2f, + 0x21, 0xa0, 0x3b, 0x82, 0x67, 0x67, 0x8c, 0xe3, + 0x82, 0x82, 0xe3, 0x82, 0x68, 0x5, 0xda, 0x8c, + 0xc9, 0xef, 0x27, 0x6b, 0xd8, 0xbd, 0x1e, 0xf6, + 0xc6, 0x4, 0x12, 0xc6, 0xdd, 0x93, 0x93, 0xe4, + 0xde, 0x8e, 0xd8, 0xdb, 0x91, 0x2c, 0x94, 0x94, + 0x87, 0x73, 0x2f, 0xa6, 0x89, 0x89, 0x42, 0x8, + 0x2f, 0x2f, 0x8c, 0x1c, 0x58, 0x8c, 0xb5, 0xb3, + 0xa5, 0xd5, 0x8f, 0x1b, 0x1b, 0xd2, 0x27, 0x5c, + 0xe8, 0x3, 0xc6, 0xe1, 0x1e, 0xf5, 0xc0, 0xbf, + 0x32, 0x97, 0xe4, 0xc0, 0x97, 0x97, 0xbf, 0xf3, + 0x36, 0xb9, 0xe2, 0x9, 0x6f, 0xf3, 0xf3, 0xf3, + 0x4, 0xdd, 0xbf, 0xf3, 0xfd, 0xfd, 0xe1, 0xde, + 0x3, 0x9d, 0xb4, 0xb1, 0x6b, 0x27, 0x8b, 0x6b, + 0xe5, 0x9d, 0x51, 0x98, 0x1, 0x24, 0x94, 0x4d, + 0x62, 0x29, 0x82, 0xbe, 0xb5, 0x87, 0x30, 0x8, + 0x58, 0x8c, 0x82, 0x58, 0xe3, 0xac, 0x82, 0xb5, + 0xda, 0xb5, 0x58, 0x8a, 0x29, 0x6d, 0xda, 0x41, + 0xb5, 0x1c, 0xac, 0x4d, 0x78, 0x37, 0x29, 0x8a, + 0xe3, 0x87, 0xa5, 0x6e, 0xa9, 0x9d, 0x83, 0x4, + 0xff, 0x84, 0x9d, 0x32, 0x7b, 0xc6, 0x47, 0x4, + 0x4, 0x27, 0xd9, 0xe7, 0xa6, 0x8c, 0x5a, 0x1b, + 0x47, 0xdb, 0x2c, 0xa8, 0x59, 0x59, 0x8c, 0x41, + 0xb5, 0x78, 0x76, 0x76, 0x62, 0x78, 0x76, 0x37, + 0xa, 0x76, 0xa, 0xe3, 0x6d, 0x29, 0x62, 0x1c, + 0x62, 0xa, 0xd1, 0x62, 0xd1, 0xd1, 0xd1, 0x23, + 0x23, 0x0, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0x78, + 0x4d, 0x76, 0xa, 0xd1, 0xd1, 0xd1, 0x0, 0x23, + 0x0, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x0, + 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe2, 0xe2, 0xf4, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x10, + 0x0, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x27, 0x6b, 0xe5, 0xfd, 0xde, 0x2e, 0x47, 0x9d, + 0xe4, 0xde, 0x47, 0xde, 0xf3, 0x32, 0x97, 0xf5, + 0xe4, 0x93, 0xfd, 0xd8, 0xe1, 0xf5, 0x3, 0x9d, + 0xd8, 0x6f, 0xe5, 0x47, 0x47, 0xd7, 0x77, 0x2f, + 0x58, 0x8c, 0xd3, 0xd3, 0x24, 0x24, 0x82, 0x58, + 0xb3, 0xe3, 0x29, 0x29, 0x82, 0xda, 0x8c, 0xa7, + 0x59, 0xd9, 0xe5, 0x74, 0x1e, 0x6f, 0x6f, 0x81, + 0xf3, 0x4, 0x4, 0xf5, 0xf5, 0x6c, 0x97, 0xde, + 0x9d, 0x6b, 0x6b, 0x98, 0x2a, 0xc5, 0x8c, 0x24, + 0x67, 0x2f, 0xb3, 0xb3, 0xb3, 0x8, 0x2f, 0x1, + 0x8c, 0x8c, 0x30, 0x30, 0xf1, 0xf1, 0x58, 0x87, + 0x8, 0xd2, 0xa5, 0x5a, 0xa8, 0x59, 0xe8, 0xa9, + 0xa9, 0x47, 0xdf, 0xdf, 0x4, 0x93, 0xe4, 0xe4, + 0x47, 0x6f, 0xf3, 0xf3, 0xfd, 0x47, 0xdf, 0xe4, + 0x8e, 0xb1, 0xaf, 0xdf, 0x6f, 0x93, 0xbf, 0x93, + 0x47, 0x6b, 0xc6, 0x8e, 0x3, 0x3a, 0xdf, 0x9c, + 0x9c, 0xb9, 0x8d, 0x7b, 0x7d, 0x6b, 0x6b, 0x3, + 0x3, 0x48, 0x91, 0x3e, 0x2c, 0x49, 0x52, 0x87, + 0x6, 0xab, 0x67, 0x8c, 0x82, 0x82, 0x8c, 0x8c, + 0x82, 0x82, 0xbe, 0x82, 0x58, 0x41, 0x24, 0x45, + 0x30, 0x68, 0x67, 0x8c, 0xa, 0xa, 0x6d, 0x78, + 0xe3, 0x6d, 0x6d, 0x29, 0x78, 0x29, 0x24, 0xb3, + 0xa4, 0xad, 0xe9, 0x3, 0x25, 0x8b, 0xa9, 0x47, + 0xbd, 0xb4, 0xc6, 0xf5, 0x9c, 0xb4, 0xf3, 0x97, + 0x8e, 0x4f, 0xa8, 0x2f, 0x1, 0x94, 0x67, 0xd9, + 0x2e, 0xc6, 0x9d, 0x3, 0x7d, 0x4f, 0x72, 0xa8, + 0x1, 0xac, 0x62, 0xd1, 0xd1, 0x62, 0x76, 0x76, + 0x76, 0x78, 0x76, 0xe3, 0x1c, 0x16, 0x1c, 0x62, + 0x62, 0x62, 0x23, 0xd1, 0xd1, 0xd1, 0x23, 0xd1, + 0xd1, 0x23, 0xd1, 0xd1, 0x76, 0x5, 0x5, 0x76, + 0xb6, 0xa, 0x76, 0xd1, 0xd1, 0x23, 0xd1, 0xd1, + 0xd1, 0x23, 0x0, 0x23, 0x23, 0x23, 0x0, 0x0, + 0x23, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf4, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x27, 0x36, 0x3, 0x27, 0x83, 0x93, 0x97, 0xf3, + 0xce, 0xdf, 0x9c, 0x32, 0xbd, 0xb1, 0x9c, 0x6b, + 0x1e, 0xdd, 0x8e, 0x40, 0x4b, 0x99, 0x6f, 0xf3, + 0xe4, 0x69, 0x6f, 0x6b, 0x47, 0x3a, 0x2f, 0x8c, + 0xe3, 0x5e, 0xd3, 0x82, 0x68, 0xa4, 0xa4, 0x8, + 0x8, 0x67, 0x1c, 0x62, 0xac, 0xac, 0x6d, 0x87, + 0x59, 0xef, 0x6f, 0xde, 0x81, 0x97, 0x9c, 0x9c, + 0xde, 0x97, 0x93, 0x9c, 0xa9, 0x47, 0xb1, 0xde, + 0x40, 0x6f, 0x86, 0x12, 0xbd, 0xef, 0x96, 0xb3, + 0x8c, 0x8c, 0x8c, 0x24, 0x1, 0xd3, 0x8c, 0x67, + 0x2f, 0x30, 0xa6, 0x5b, 0xd2, 0xd2, 0x8, 0xb3, + 0x87, 0x67, 0xa6, 0x1, 0xc3, 0x59, 0x7e, 0x83, + 0x1e, 0xde, 0x9c, 0x86, 0xbd, 0xde, 0xbf, 0xe4, + 0x83, 0x40, 0xe1, 0xbf, 0xbd, 0x9c, 0xdf, 0xe4, + 0xf3, 0xbb, 0xe2, 0xc6, 0xf3, 0xde, 0xb4, 0xe4, + 0x1e, 0x25, 0xe1, 0xe4, 0xbd, 0xe4, 0x81, 0xf3, + 0xf3, 0xe4, 0xe1, 0xbd, 0x83, 0xdb, 0xcf, 0xbd, + 0x25, 0x2a, 0x88, 0x8b, 0x18, 0x48, 0x56, 0x94, + 0x82, 0x65, 0x52, 0xab, 0x24, 0x82, 0x82, 0x82, + 0x87, 0x24, 0x82, 0x4d, 0xe3, 0x8c, 0x58, 0x58, + 0x58, 0x58, 0xab, 0x41, 0x6d, 0x29, 0x4d, 0x29, + 0x29, 0x6d, 0x78, 0xa, 0x62, 0xab, 0x49, 0xb8, + 0x4f, 0x3e, 0x48, 0x9f, 0x36, 0xc6, 0x90, 0xdd, + 0xcd, 0xf4, 0xf4, 0xbb, 0xe4, 0xbf, 0xb4, 0xe1, + 0x81, 0x88, 0x3f, 0x49, 0xa8, 0xd4, 0xfb, 0x83, + 0x9a, 0xf4, 0x84, 0xc6, 0x84, 0x81, 0xba, 0x92, + 0xf, 0x52, 0x66, 0x4d, 0x76, 0x62, 0x29, 0x6d, + 0xa, 0x62, 0x62, 0xa, 0x62, 0xd1, 0xa, 0xa, + 0xa, 0x62, 0xd1, 0xd1, 0xd1, 0x23, 0x23, 0xd1, + 0x23, 0x0, 0xd1, 0x4d, 0x61, 0xdf, 0xde, 0xb6, + 0xb6, 0xe2, 0xf4, 0xb5, 0x6d, 0xd1, 0x0, 0xd1, + 0x0, 0x0, 0x23, 0x23, 0x0, 0x0, 0x23, 0x23, + 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x10, 0x0, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x53, 0x81, 0x81, 0xde, 0xe4, 0xbf, 0xaf, 0xf4, + 0xbf, 0xbf, 0x81, 0x7, 0x9a, 0xe4, 0x81, 0x9f, + 0xe4, 0xbf, 0xce, 0xf4, 0xe4, 0xe4, 0xf3, 0xe4, + 0xe4, 0xf7, 0xd8, 0x53, 0xdb, 0xa9, 0x2f, 0x1, + 0x5e, 0xe3, 0xe3, 0xb3, 0x87, 0x68, 0x68, 0x87, + 0xab, 0xd3, 0xe3, 0x4d, 0x4d, 0xda, 0x30, 0xa5, + 0x39, 0x54, 0xe4, 0xe4, 0xf4, 0xe4, 0xdd, 0xe1, + 0x57, 0xc6, 0xe4, 0xe1, 0x4b, 0x8d, 0xce, 0xf4, + 0xbf, 0xe4, 0xbd, 0xe1, 0x75, 0xdb, 0x3e, 0x49, + 0x94, 0x8c, 0xb3, 0xad, 0xa6, 0x30, 0x5, 0x5b, + 0x2f, 0x1, 0x8c, 0x30, 0x1, 0x1, 0x49, 0x64, + 0x64, 0xa8, 0x59, 0x1b, 0xd9, 0x27, 0x7c, 0x1e, + 0xb4, 0xc6, 0xb4, 0xbf, 0x84, 0xbc, 0xe1, 0xb4, + 0xc6, 0xe1, 0xbf, 0xbf, 0xf4, 0xaf, 0xe2, 0xce, + 0xf4, 0x9a, 0x9a, 0xb4, 0xbf, 0xbc, 0x75, 0xe4, + 0xde, 0xc6, 0xbf, 0xbf, 0xe4, 0xbf, 0xf4, 0xf4, + 0xce, 0xbc, 0xbc, 0xe1, 0x81, 0x9f, 0xf6, 0xe1, + 0xe1, 0xe1, 0x85, 0xd8, 0x40, 0xb, 0x92, 0x94, + 0x55, 0x55, 0x55, 0x61, 0xac, 0x94, 0x65, 0x68, + 0xa0, 0x68, 0x24, 0x6d, 0xb5, 0xe3, 0x4d, 0x62, + 0x4d, 0xbe, 0xac, 0x6d, 0xb5, 0x24, 0xe3, 0x5, + 0x45, 0xda, 0x1c, 0x29, 0xe3, 0xab, 0x1f, 0x1d, + 0xe8, 0xcb, 0x18, 0x90, 0xc6, 0xb4, 0xe4, 0xe4, + 0xe4, 0xb2, 0xce, 0xde, 0xbf, 0xb4, 0x9f, 0x3a, + 0xfd, 0x3, 0x4e, 0x59, 0xd4, 0x7d, 0x9c, 0x32, + 0x9, 0xe1, 0x90, 0xd8, 0xe1, 0x8d, 0x40, 0x49, + 0xb8, 0x91, 0x52, 0xd3, 0x78, 0x1c, 0x8a, 0xb5, + 0x78, 0x62, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0x62, 0x62, 0x62, 0x23, 0xa, 0xa, 0xd1, + 0xd1, 0xd1, 0x62, 0x76, 0xa, 0xb1, 0x93, 0xdd, + 0xe2, 0xe2, 0x12, 0xe2, 0xf4, 0x29, 0xd1, 0x0, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0xe2, 0xf4, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x10, 0x0, 0x10, 0x10, + 0x10, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc6, 0xc6, 0xc6, 0xb4, 0xbf, 0xbf, 0xb0, 0x85, + 0x9a, 0xbf, 0xe4, 0xf6, 0xf6, 0xc6, 0xc0, 0xce, + 0xbf, 0xb4, 0x81, 0xb4, 0xe4, 0xe4, 0xb1, 0x57, + 0x57, 0x81, 0xb1, 0xf6, 0x88, 0xd9, 0xc2, 0x2f, + 0x58, 0xb5, 0xda, 0x8a, 0xa, 0x6d, 0xe3, 0xe3, + 0x82, 0x6d, 0x82, 0x8c, 0x8c, 0xad, 0x96, 0x7d, + 0x1e, 0xfd, 0xed, 0x90, 0xdb, 0x47, 0xbd, 0x81, + 0x90, 0x39, 0xf5, 0xaf, 0xf3, 0x93, 0xf5, 0x4b, + 0xf3, 0xfd, 0xb9, 0x9f, 0x7f, 0x2c, 0x64, 0xa8, + 0x1, 0x87, 0x30, 0xf0, 0x63, 0xd2, 0x8, 0xa4, + 0xb3, 0x8c, 0xe3, 0xb3, 0x8c, 0x82, 0x64, 0x60, + 0xe7, 0x59, 0xd4, 0x4f, 0x9c, 0x9c, 0xde, 0xca, + 0x39, 0x9d, 0xe1, 0xbd, 0x7b, 0x39, 0xdf, 0xce, + 0xb1, 0x32, 0x81, 0xdf, 0x93, 0xde, 0xe1, 0x2e, + 0x99, 0x8b, 0xe1, 0xf3, 0x93, 0x9c, 0xdf, 0x93, + 0x97, 0x93, 0xe4, 0x81, 0x99, 0xde, 0x9a, 0xce, + 0xfd, 0x8b, 0x83, 0x32, 0x4, 0xbd, 0xf9, 0x99, + 0x6f, 0xde, 0x81, 0x36, 0x27, 0xd6, 0xb8, 0x52, + 0xb3, 0xab, 0xab, 0x6d, 0xbe, 0x41, 0xac, 0x82, + 0x68, 0x24, 0xd3, 0xab, 0x4d, 0xe3, 0x6d, 0x1c, + 0xb3, 0xe3, 0x78, 0x37, 0x1c, 0x58, 0x41, 0xe3, + 0x5, 0xe3, 0xe3, 0x82, 0x67, 0x59, 0xc9, 0xa5, + 0x6b, 0x81, 0x81, 0x6f, 0x32, 0xe4, 0xf3, 0x47, + 0x97, 0x86, 0x8e, 0x47, 0xde, 0xe4, 0x6f, 0xd7, + 0x6c, 0x6c, 0xd5, 0x60, 0xc9, 0x6b, 0x4, 0x3, + 0xd8, 0x4b, 0x47, 0x47, 0x70, 0xb4, 0x4, 0x7d, + 0x7d, 0x47, 0x2f, 0xac, 0x76, 0xa, 0x78, 0x78, + 0xb5, 0x78, 0xa, 0xd1, 0xa, 0x16, 0x62, 0x23, + 0x23, 0xd1, 0xd1, 0xd1, 0xa, 0x23, 0xd1, 0xa, + 0x76, 0xa, 0x8a, 0x5, 0xbd, 0x12, 0x93, 0x93, + 0xf3, 0xf3, 0x93, 0x8d, 0xbc, 0x78, 0xd1, 0xd1, + 0xd1, 0x23, 0x23, 0x23, 0x23, 0x0, 0x23, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0x23, 0x23, 0xa, 0xbf, 0xe2, + 0x44, 0xf4, 0xe2, 0x44, 0x44, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x10, 0x10, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x81, 0xdf, 0x9c, 0x36, 0xe1, 0xdd, 0x9c, 0x8b, + 0xc6, 0xf3, 0x4, 0xf5, 0x99, 0x9c, 0x32, 0x93, + 0xe4, 0x12, 0x6f, 0xd8, 0xcf, 0xd8, 0x97, 0x83, + 0x83, 0x47, 0x4, 0x9c, 0x39, 0xd4, 0xf0, 0xf1, + 0x8c, 0x82, 0x8a, 0x4d, 0x6d, 0x6d, 0xda, 0x6d, + 0xe3, 0xbe, 0xe3, 0xe3, 0xe3, 0x68, 0x96, 0xe5, + 0x3, 0x3, 0x6c, 0x6b, 0x8b, 0xe5, 0x4, 0xdd, + 0x99, 0x4, 0x6c, 0xc0, 0xf3, 0x6f, 0x4, 0xf5, + 0x47, 0x3, 0x4, 0xf5, 0x4f, 0xc7, 0x5a, 0x42, + 0x1, 0xe3, 0x87, 0x14, 0xd2, 0x2f, 0xb3, 0xb3, + 0x58, 0x8c, 0xb3, 0xec, 0xad, 0x58, 0x87, 0x14, + 0xc5, 0x14, 0xc9, 0x6b, 0x47, 0x3, 0xd8, 0xc6, + 0x9c, 0x47, 0xc6, 0xf3, 0x4, 0x4, 0xf9, 0x12, + 0x26, 0x69, 0x81, 0x81, 0x9c, 0xfd, 0x57, 0xb9, + 0x93, 0x32, 0xce, 0xf3, 0x93, 0xc0, 0x81, 0xce, + 0x97, 0x8e, 0xe1, 0xc6, 0x7b, 0xd8, 0x57, 0xe4, + 0x97, 0x69, 0x8d, 0x69, 0x93, 0x32, 0xb2, 0xce, + 0x32, 0xde, 0xcf, 0x9d, 0x47, 0x8b, 0x48, 0x7f, + 0xe8, 0x60, 0xa7, 0xe3, 0x82, 0x82, 0x82, 0x6d, + 0x65, 0x1a, 0x1a, 0x1a, 0xb5, 0x6d, 0x16, 0xda, + 0xa4, 0x5, 0x29, 0xa, 0xe3, 0x24, 0x62, 0x78, + 0xb5, 0x82, 0xa7, 0x64, 0x22, 0x7c, 0x83, 0x83, + 0x36, 0x81, 0xc6, 0x8e, 0xdd, 0xb4, 0xe1, 0xd8, + 0xde, 0xe4, 0xde, 0xdd, 0xbd, 0xe4, 0xf3, 0x4, + 0x4, 0x47, 0x8f, 0xc7, 0x4f, 0xd8, 0x36, 0x3a, + 0xfa, 0xb4, 0xbf, 0xbd, 0xe4, 0xb4, 0xb4, 0x7b, + 0xe1, 0x75, 0x49, 0xd3, 0xac, 0xd1, 0x62, 0x78, + 0x76, 0x78, 0x78, 0xd1, 0xa, 0x1c, 0x1c, 0xd1, + 0x23, 0xd1, 0xd1, 0x0, 0xd1, 0xd1, 0xd1, 0x76, + 0x76, 0x32, 0xf3, 0x93, 0xe2, 0xf4, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xb6, 0x61, 0x29, 0x23, + 0xd1, 0x23, 0x29, 0x29, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x23, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc6, 0xc4, 0x97, 0xd8, 0x9f, 0xbd, 0x97, 0x97, + 0x81, 0xf3, 0x4, 0xf3, 0xce, 0xf5, 0x32, 0xde, + 0x7, 0x81, 0x32, 0xd8, 0xf6, 0x12, 0x97, 0xb1, + 0xf3, 0x32, 0xe0, 0x36, 0x40, 0x77, 0x4e, 0x1, + 0xe3, 0x1a, 0x82, 0xe3, 0x82, 0x8a, 0xa0, 0x45, + 0xb3, 0xe3, 0xe3, 0x24, 0x6d, 0x58, 0xe7, 0x27, + 0x25, 0x27, 0x9c, 0xce, 0xf3, 0x8e, 0x93, 0xc0, + 0xe4, 0x7b, 0xf5, 0xbd, 0xd8, 0xfd, 0xde, 0xc0, + 0x32, 0x47, 0x8e, 0xce, 0xd8, 0xe0, 0x77, 0xc2, + 0x1, 0x24, 0xe3, 0x8c, 0xd3, 0x8c, 0x1, 0x8, + 0xa6, 0x68, 0x1b, 0x42, 0x1b, 0x4c, 0x59, 0x5a, + 0xd4, 0x2f, 0x50, 0x1e, 0x36, 0x83, 0xe1, 0xb4, + 0xce, 0x9, 0x85, 0xbf, 0x2e, 0xce, 0xe4, 0xe4, + 0xdd, 0xc6, 0x57, 0xce, 0xbf, 0xb4, 0x84, 0xaf, + 0x9, 0xe4, 0xbf, 0xb4, 0xbf, 0xf3, 0xe1, 0xe4, + 0xf3, 0xe1, 0x75, 0xe1, 0xe4, 0x85, 0xe1, 0x2e, + 0xce, 0xbf, 0xbb, 0xce, 0xb4, 0xe1, 0x57, 0xe1, + 0x81, 0x85, 0xf6, 0xc4, 0xce, 0xe1, 0x75, 0x90, + 0x90, 0x40, 0xa3, 0x1, 0x1f, 0x64, 0xe3, 0x65, + 0x82, 0xac, 0x4d, 0x37, 0xbe, 0x24, 0xb5, 0xb5, + 0x45, 0x58, 0x24, 0x1c, 0x1c, 0x6d, 0x4d, 0x82, + 0x6, 0x82, 0xad, 0x67, 0x4f, 0xd8, 0xe1, 0x81, + 0x85, 0xc6, 0xe4, 0xe1, 0x7, 0xb4, 0x9a, 0x75, + 0xe1, 0xb4, 0xb4, 0xb4, 0xc6, 0xe4, 0xb4, 0xd8, + 0x9d, 0x43, 0xd4, 0x2c, 0x3e, 0xc6, 0xe1, 0x90, + 0x8d, 0xf4, 0xb4, 0xf4, 0xb4, 0xb4, 0x9a, 0x9a, + 0xba, 0xba, 0x59, 0x55, 0xd3, 0xbe, 0xac, 0xd1, + 0x62, 0xd1, 0xd1, 0xd1, 0x23, 0xa, 0xd1, 0xd1, + 0xd1, 0x23, 0xd1, 0xd1, 0xd1, 0xd1, 0x62, 0x62, + 0x78, 0xdf, 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0x9a, 0x44, 0xe2, 0x44, + 0xd1, 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, 0x23, 0x0, + 0x0, 0x0, 0x23, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x57, 0x9a, 0xbf, 0xe4, 0x4b, 0xce, 0x8d, 0xbf, + 0xbf, 0xc6, 0x86, 0xe1, 0xbc, 0x75, 0xce, 0x84, + 0x75, 0x8d, 0xbf, 0xbb, 0x85, 0xc6, 0xbf, 0xf4, + 0xe4, 0x75, 0x4b, 0x18, 0xb, 0x91, 0xb8, 0x94, + 0x66, 0x37, 0xe3, 0x1c, 0x82, 0x24, 0x5, 0x14, + 0x1, 0xab, 0x82, 0x24, 0x24, 0x1, 0xd5, 0x81, + 0x90, 0x39, 0xe4, 0xbf, 0xb4, 0xe1, 0x4b, 0xe1, + 0x7, 0xba, 0xbc, 0xf9, 0x90, 0x81, 0xce, 0xb4, + 0xb4, 0xdf, 0xfa, 0xce, 0x84, 0xdb, 0x91, 0x64, + 0x64, 0xa1, 0x1, 0xa6, 0x68, 0x68, 0xa5, 0xe9, + 0x2d, 0x24, 0xa6, 0xd6, 0x80, 0x49, 0x92, 0x4c, + 0x4f, 0x7f, 0x54, 0x81, 0x81, 0x83, 0xc6, 0xe4, + 0xbf, 0xb4, 0x4b, 0x4b, 0x85, 0x84, 0xbc, 0xe1, + 0xf9, 0xc6, 0xb0, 0xbf, 0xe4, 0xe4, 0xdf, 0xbf, + 0xb4, 0xbf, 0x7, 0x75, 0x81, 0x9a, 0x7, 0xe1, + 0x81, 0xdf, 0xbf, 0x8d, 0xce, 0xb4, 0x4b, 0xdf, + 0xce, 0xf4, 0x9a, 0xbc, 0x86, 0xc6, 0xe1, 0x84, + 0xfa, 0x86, 0xdf, 0xe4, 0xdd, 0xe4, 0xf6, 0x18, + 0x8b, 0xdb, 0x80, 0x80, 0x60, 0x4c, 0xa8, 0xa8, + 0x2c, 0xc3, 0x41, 0x82, 0x82, 0x37, 0xb5, 0xac, + 0x66, 0xe3, 0x65, 0x52, 0x87, 0x9e, 0xa7, 0x24, + 0x4e, 0xae, 0xd4, 0xae, 0x25, 0xf8, 0xe1, 0x9f, + 0x83, 0xdf, 0xce, 0xd8, 0xdd, 0xe4, 0xdf, 0x81, + 0xf3, 0xb4, 0xb4, 0x81, 0x9f, 0xc6, 0xd8, 0xa9, + 0x2c, 0xd4, 0xc9, 0xd4, 0x6b, 0xe1, 0xdf, 0x9c, + 0xe4, 0xb4, 0xc0, 0x9c, 0x9f, 0x4b, 0x2e, 0xd8, + 0x74, 0x75, 0x7d, 0x7d, 0xa8, 0x60, 0x8c, 0xb5, + 0x78, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, 0xd1, + 0xd1, 0xd1, 0x76, 0x23, 0xa, 0xa, 0x5, 0x97, + 0x97, 0x32, 0xc0, 0x8d, 0xe2, 0xf4, 0x12, 0xe2, + 0xe2, 0x44, 0x12, 0xf3, 0x44, 0xe2, 0xbd, 0xbd, + 0x0, 0xd1, 0x0, 0x23, 0x0, 0x0, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x23, 0x0, 0xf4, 0x44, 0x44, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0x9, 0xf3, 0xf3, 0xdf, 0xbd, 0x32, 0xb1, + 0x75, 0x9f, 0x54, 0xb1, 0xe1, 0xfa, 0xbd, 0xdf, + 0xc6, 0xe4, 0x9, 0xcd, 0x81, 0xdf, 0x2e, 0xce, + 0xbc, 0x9d, 0x6b, 0x9c, 0x3d, 0x8b, 0x3e, 0x4c, + 0x65, 0x82, 0x82, 0x82, 0x29, 0x82, 0xe3, 0x24, + 0xe3, 0x94, 0x24, 0x24, 0x58, 0xec, 0xd5, 0x54, + 0x99, 0x6b, 0xf5, 0x69, 0xb4, 0x9d, 0x27, 0xde, + 0x81, 0x1e, 0xde, 0xc6, 0xf5, 0x93, 0xf3, 0xe4, + 0xf3, 0x6f, 0xd8, 0x85, 0xd8, 0x3e, 0xa8, 0xa8, + 0x8c, 0x1, 0x8, 0x1b, 0x96, 0x8, 0xf1, 0x42, + 0x1, 0x24, 0x41, 0x64, 0x9e, 0x67, 0x22, 0x8b, + 0xe5, 0x9c, 0xde, 0xbd, 0x97, 0x4, 0xde, 0xde, + 0x32, 0xfd, 0x9f, 0xd8, 0x69, 0x32, 0x81, 0x85, + 0x93, 0x32, 0xbf, 0x9, 0x69, 0xf3, 0x84, 0xff, + 0x32, 0x9, 0x7, 0x90, 0x97, 0x9, 0xb4, 0x9, + 0x93, 0x97, 0x8d, 0xce, 0x97, 0xbd, 0xe1, 0xcf, + 0x47, 0xde, 0x75, 0x1e, 0x9c, 0xce, 0xb4, 0xbd, + 0x69, 0x12, 0xce, 0xfd, 0x4, 0xff, 0x3d, 0x2a, + 0x27, 0x9d, 0x8b, 0x51, 0x8f, 0x8b, 0x2a, 0xd6, + 0xe9, 0x48, 0x1, 0x8c, 0x65, 0x6, 0xe3, 0x55, + 0x24, 0xab, 0x24, 0x82, 0x65, 0x52, 0x82, 0xa6, + 0x2f, 0x18, 0x25, 0x5d, 0x8b, 0x71, 0xf5, 0x4, + 0x97, 0xe4, 0xbd, 0x4, 0x93, 0xe4, 0xbd, 0x6f, + 0xfd, 0xb4, 0xdd, 0x47, 0x9d, 0xd8, 0x9c, 0xd5, + 0xd5, 0xd5, 0x2f, 0x96, 0x6b, 0xf5, 0x97, 0x97, + 0x57, 0x7, 0x97, 0x4, 0x7b, 0xe4, 0x97, 0x8e, + 0x93, 0x95, 0x97, 0x47, 0x46, 0x1d, 0x52, 0xd3, + 0x37, 0xac, 0x37, 0x78, 0xa, 0xd1, 0x23, 0xd1, + 0xd1, 0xd1, 0xd1, 0xd1, 0x78, 0xb5, 0x9c, 0x32, + 0xe2, 0xf4, 0x93, 0xf3, 0xe2, 0xe2, 0x12, 0x12, + 0x44, 0xf4, 0xf3, 0xe2, 0x44, 0x44, 0x12, 0x8d, + 0x61, 0xd1, 0x0, 0x23, 0x0, 0x23, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x44, 0xf4, 0xf4, 0x44, 0x44, 0xe2, 0xf4, 0x44, + 0x44, 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0xe2, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x0, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0x9, 0x69, 0x97, 0x2e, 0x36, 0x6f, 0x4, + 0xd8, 0x9d, 0x4, 0x8e, 0x2e, 0xbd, 0xb1, 0x69, + 0x9, 0x26, 0x97, 0x69, 0x70, 0xd8, 0xfd, 0x32, + 0xc6, 0x3, 0x9c, 0xf5, 0xd8, 0x27, 0xa9, 0x7a, + 0x49, 0x82, 0x82, 0xac, 0x4d, 0x4d, 0xe3, 0xe3, + 0xa7, 0x65, 0xb5, 0x65, 0xa6, 0x5a, 0xd9, 0x47, + 0x1e, 0x6c, 0x3, 0xf8, 0xde, 0x47, 0x47, 0xbb, + 0xc0, 0x4, 0x97, 0xbf, 0xbf, 0x97, 0x8e, 0xde, + 0xb1, 0x4, 0x3, 0xd8, 0x1e, 0x77, 0x4e, 0x2f, + 0x64, 0xa6, 0x5a, 0x21, 0x2d, 0x67, 0xb3, 0xa1, + 0xa8, 0x8c, 0x1, 0xc7, 0xa3, 0x5a, 0x13, 0xd8, + 0x7b, 0x4, 0x36, 0xde, 0xb1, 0x4, 0xc8, 0x3d, + 0x47, 0x4, 0x81, 0x1e, 0x32, 0x6f, 0x9, 0x2e, + 0x69, 0x97, 0x9, 0x70, 0xb1, 0x69, 0x57, 0x9f, + 0xf5, 0xf5, 0xe4, 0x70, 0x97, 0x69, 0xc6, 0xce, + 0x97, 0x9, 0xcd, 0xe1, 0x47, 0xff, 0xc6, 0x9f, + 0x8e, 0xf5, 0x85, 0xce, 0x2e, 0xdd, 0xce, 0xb2, + 0xb1, 0x12, 0xb4, 0x9d, 0x25, 0xf5, 0xde, 0x1e, + 0xe0, 0x54, 0x54, 0x54, 0x47, 0xfd, 0xa9, 0x3e, + 0x72, 0xd6, 0x3c, 0x49, 0x1, 0xa7, 0xb3, 0x24, + 0x64, 0xa1, 0xa1, 0x24, 0xb3, 0x24, 0x87, 0x64, + 0x4c, 0xfb, 0x40, 0x18, 0x3, 0x81, 0xdf, 0x93, + 0xbd, 0xbb, 0xed, 0x6f, 0xca, 0xe4, 0xde, 0xde, + 0x9f, 0xc6, 0xdd, 0x32, 0xde, 0x86, 0x99, 0xef, + 0xd7, 0x3, 0x60, 0x73, 0x1b, 0x9f, 0xff, 0xde, + 0x9f, 0x9f, 0x32, 0xbd, 0xbf, 0xf4, 0xbf, 0xc4, + 0xb4, 0xf4, 0xb4, 0xe1, 0x92, 0x52, 0x52, 0x52, + 0x52, 0x66, 0xac, 0x4d, 0x78, 0xac, 0xa, 0x76, + 0x23, 0x76, 0x76, 0x76, 0x78, 0x78, 0x68, 0xf4, + 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0x44, 0xf4, 0x44, + 0x44, 0x44, 0xbe, 0x29, 0x23, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x23, 0x0, 0xa, 0x23, + 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xce, 0xd8, 0x8e, 0x69, 0x70, 0x90, 0x54, 0x9c, + 0x9c, 0xdf, 0x4, 0x9, 0x81, 0x3d, 0x26, 0x9, + 0xb4, 0xcf, 0x28, 0x70, 0xbf, 0xc6, 0xc0, 0xc0, + 0x86, 0xce, 0x26, 0xb9, 0x85, 0xdb, 0x2c, 0x80, + 0x49, 0x64, 0x94, 0x24, 0x24, 0x1, 0x1, 0x87, + 0x24, 0xb3, 0x24, 0x24, 0x58, 0x67, 0xa3, 0x27, + 0x1e, 0xfd, 0x40, 0x90, 0xdf, 0xaf, 0x69, 0xbf, + 0x8d, 0x99, 0x2e, 0x70, 0xbf, 0xd8, 0x8b, 0x83, + 0xce, 0xce, 0xd8, 0x8d, 0x54, 0x1e, 0x3, 0xa9, + 0xa3, 0xb3, 0x8c, 0xa1, 0xa1, 0xa1, 0xa1, 0x64, + 0xa1, 0x72, 0xd6, 0x4f, 0xc2, 0x31, 0x54, 0x70, + 0xc8, 0x70, 0x15, 0x9f, 0xd8, 0xb9, 0xfa, 0x40, + 0x99, 0x9, 0xb0, 0xce, 0xb1, 0xed, 0xfa, 0x2e, + 0x70, 0x70, 0x84, 0x40, 0xbd, 0x70, 0xce, 0xb2, + 0xdf, 0xdf, 0xb4, 0x9, 0xce, 0xce, 0xfa, 0x75, + 0xf8, 0x8d, 0x85, 0x9f, 0x6a, 0xde, 0x70, 0xb0, + 0xde, 0xc6, 0xb2, 0xce, 0xbd, 0xcd, 0xb4, 0x1e, + 0xb2, 0xbb, 0xb4, 0x71, 0xf5, 0xc4, 0xe4, 0x2e, + 0xff, 0x81, 0x6a, 0xfd, 0xbc, 0x1e, 0xf6, 0x2a, + 0xd6, 0x3e, 0xae, 0xe8, 0xa3, 0xa6, 0x4e, 0x22, + 0x3f, 0xa3, 0xc9, 0xa8, 0xa3, 0xa3, 0x5a, 0x38, + 0xe8, 0x8b, 0xd8, 0xc6, 0x85, 0x4b, 0xb2, 0xc6, + 0xbf, 0xe1, 0x8d, 0xf5, 0x18, 0x75, 0xb4, 0xe4, + 0xe1, 0xc6, 0xb4, 0xbf, 0xf4, 0xf4, 0x81, 0x7c, + 0x50, 0x91, 0x7a, 0xd9, 0xd4, 0x9f, 0x8d, 0xb4, + 0xbf, 0xbf, 0xc6, 0xf4, 0xf4, 0xf4, 0xf4, 0xbf, + 0x9a, 0x7, 0x9a, 0xf4, 0x9a, 0x75, 0x9a, 0xfd, + 0xcb, 0xf, 0x61, 0xac, 0xac, 0x61, 0x5e, 0x78, + 0x78, 0x5e, 0x78, 0x5, 0x68, 0x68, 0xf4, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0x44, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0xbc, 0xf2, 0x0, 0x0, 0x0, 0x23, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x85, 0x84, 0xde, 0x85, 0x9, 0x2e, 0x81, 0x99, + 0x81, 0xe4, 0x70, 0x84, 0x81, 0x18, 0xd8, 0x70, + 0xf4, 0xe1, 0xb2, 0xe4, 0x9, 0xee, 0x85, 0xc6, + 0xe4, 0x84, 0x75, 0x57, 0x75, 0x3e, 0x80, 0xa8, + 0x4e, 0x2c, 0x64, 0x65, 0x49, 0x64, 0xaa, 0xa8, + 0xb3, 0x56, 0xb3, 0x64, 0xa6, 0xc9, 0x7f, 0x54, + 0xe4, 0x9a, 0x9, 0x9, 0xb4, 0xb4, 0x8d, 0xbb, + 0xbf, 0xe4, 0x57, 0x84, 0xbb, 0xf7, 0xd8, 0xbd, + 0xbf, 0x9, 0xaf, 0x70, 0xb2, 0xc8, 0x98, 0x80, + 0xa3, 0x2f, 0xb3, 0x9e, 0x59, 0x73, 0x59, 0xb3, + 0xa1, 0xb8, 0x13, 0x18, 0xf6, 0x54, 0x3d, 0xc8, + 0x84, 0x81, 0x3d, 0x71, 0xc6, 0x81, 0x8d, 0x8d, + 0x70, 0xce, 0xb4, 0xe1, 0xb2, 0xdd, 0xf8, 0x75, + 0x81, 0xe4, 0x8d, 0x85, 0x2e, 0xe4, 0x8d, 0x8d, + 0x9, 0xce, 0xb4, 0x84, 0x85, 0x8d, 0x85, 0x84, + 0xd8, 0x85, 0xb4, 0xb4, 0xde, 0x9, 0xe4, 0x9, + 0xf3, 0x70, 0xe4, 0xd8, 0x7, 0xe1, 0x85, 0xc6, + 0xe1, 0xb4, 0xbb, 0xee, 0xe4, 0xb4, 0xb4, 0x9a, + 0xb2, 0xb0, 0x85, 0x3d, 0x9f, 0xc6, 0xe1, 0x81, + 0x54, 0x54, 0xd8, 0x40, 0x35, 0xd6, 0x4e, 0xd6, + 0x2c, 0xd6, 0x48, 0x5c, 0xeb, 0x18, 0x18, 0x28, + 0x47, 0x2e, 0xb2, 0x81, 0xff, 0x70, 0xce, 0x70, + 0xbc, 0xbc, 0xb4, 0xde, 0x81, 0xe1, 0xe4, 0xe4, + 0xf3, 0xb4, 0xe4, 0xde, 0xc6, 0xbc, 0x3, 0x50, + 0x49, 0x49, 0xd4, 0x36, 0x2e, 0xb4, 0x95, 0xbd, + 0xbf, 0xbf, 0x8d, 0x12, 0x8d, 0xbc, 0x9a, 0xe4, + 0xf4, 0x9a, 0x9a, 0xb4, 0xbf, 0xf4, 0xb4, 0x32, + 0x9a, 0xf, 0x5e, 0x5e, 0x61, 0xac, 0xf2, 0xac, + 0x68, 0xc3, 0x68, 0xc0, 0xf4, 0xe2, 0xc0, 0xf4, + 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xf4, 0x44, + 0x44, 0xf4, 0x44, 0x0, 0x0, 0xd1, 0x0, 0x0, + 0xa, 0xa, 0x23, 0xa, 0x23, 0x44, 0xbf, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0xb4, 0x9, 0x85, 0xce, 0xde, 0x36, 0x2e, + 0xbd, 0xbc, 0x9f, 0x81, 0xce, 0xc6, 0xde, 0xdd, + 0xf4, 0x70, 0xb1, 0xee, 0xb4, 0xb0, 0xb9, 0x70, + 0x2e, 0x81, 0x9f, 0x70, 0x84, 0xc8, 0x40, 0x15, + 0x31, 0xfb, 0xa8, 0x1, 0xa1, 0xa8, 0x64, 0x64, + 0xa8, 0xa8, 0xa8, 0xa6, 0x1b, 0xef, 0x6f, 0xb2, + 0x70, 0xb2, 0xb2, 0x71, 0x70, 0xce, 0xc8, 0x57, + 0x70, 0x4, 0xf5, 0x81, 0xff, 0x26, 0xff, 0x70, + 0x2e, 0x28, 0xfa, 0xc8, 0x71, 0xc8, 0xeb, 0xa3, + 0x3f, 0xae, 0x2d, 0x4e, 0x1b, 0x1b, 0xc9, 0x4e, + 0x8, 0x4c, 0x7e, 0xb, 0x27, 0x54, 0x1e, 0x18, + 0xf5, 0x2e, 0xce, 0xf7, 0xc4, 0xff, 0xce, 0xb4, + 0x26, 0x81, 0xb2, 0x75, 0xd8, 0x36, 0xf5, 0x81, + 0x8e, 0xf3, 0xbf, 0xce, 0xff, 0xf8, 0x70, 0xbd, + 0xb9, 0x28, 0xb2, 0x71, 0x36, 0xce, 0xb4, 0xf8, + 0x26, 0xf8, 0x70, 0x69, 0x7b, 0x28, 0x81, 0x28, + 0x47, 0xfd, 0x90, 0x1e, 0xc4, 0xce, 0xbf, 0xb1, + 0x7b, 0xb2, 0x70, 0x9, 0x26, 0x81, 0xc4, 0x1e, + 0x36, 0xd8, 0x3d, 0x9c, 0x15, 0x86, 0xdd, 0x8e, + 0xb1, 0x81, 0x54, 0x15, 0xa9, 0x43, 0x51, 0x2a, + 0x3e, 0x2a, 0x15, 0x6f, 0x6b, 0x6a, 0x39, 0x26, + 0x28, 0xe1, 0x86, 0x1e, 0xc8, 0x75, 0x2e, 0x69, + 0x6b, 0x90, 0xf3, 0x97, 0x97, 0xe4, 0xdf, 0x9c, + 0x97, 0xe1, 0xd8, 0x9c, 0x7d, 0x51, 0xef, 0xe5, + 0xc7, 0x58, 0x2f, 0xd7, 0x97, 0xe4, 0x32, 0x4, + 0xde, 0x57, 0xfd, 0x97, 0x32, 0x4b, 0x32, 0x97, + 0x95, 0xe4, 0x97, 0x97, 0xf4, 0xf4, 0x32, 0x8e, + 0x7b, 0x1d, 0xab, 0x30, 0xad, 0x68, 0x30, 0x97, + 0xb1, 0x93, 0x93, 0x93, 0xe2, 0xf4, 0x97, 0x12, + 0xe2, 0xbd, 0xbd, 0xe2, 0x44, 0xe2, 0x12, 0x95, + 0x44, 0x44, 0x12, 0xbb, 0x44, 0x44, 0xd8, 0x44, + 0xe2, 0xbf, 0xbf, 0x44, 0xbf, 0xa, 0x0, 0x0, + 0x23, 0xb5, 0x0, 0xbf, 0xf4, 0xf4, 0xe2, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x10, 0x10, 0x10, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x10, 0x0, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb1, 0x70, 0x8e, 0x26, 0xf5, 0x84, 0x9d, 0x36, + 0x70, 0x1e, 0x15, 0xde, 0x70, 0x9, 0x28, 0x54, + 0xb2, 0xdd, 0xff, 0x2e, 0xf8, 0x54, 0xc8, 0x70, + 0x8d, 0xbd, 0x1e, 0xdf, 0x70, 0x32, 0x6f, 0x15, + 0x6a, 0x27, 0x4e, 0xa8, 0x22, 0x60, 0xae, 0x59, + 0xe8, 0xe8, 0xa3, 0xb8, 0x5c, 0x6b, 0xe0, 0xb9, + 0xc6, 0x1e, 0x9b, 0x90, 0xe1, 0x69, 0x54, 0x86, + 0xbd, 0x69, 0x93, 0x9, 0x54, 0xb1, 0xe0, 0xc6, + 0xb2, 0xc4, 0x1e, 0x9f, 0x1e, 0x36, 0x11, 0xeb, + 0x4c, 0x7a, 0x7a, 0x7a, 0xc9, 0x4c, 0xd6, 0x22, + 0x72, 0x7e, 0xfb, 0x25, 0xc8, 0x26, 0xc4, 0xfa, + 0x7b, 0xff, 0x9, 0xf7, 0x7b, 0xb1, 0x70, 0x85, + 0xb9, 0x15, 0x3d, 0x36, 0x8e, 0x36, 0xdf, 0xff, + 0x9c, 0xf3, 0xee, 0x9, 0x7b, 0x26, 0x81, 0x7b, + 0xfd, 0x28, 0x81, 0xb1, 0x8e, 0xf3, 0x95, 0xf7, + 0xe0, 0xb1, 0x9, 0x26, 0x47, 0x1e, 0x40, 0x47, + 0x28, 0xfd, 0x81, 0x7b, 0x32, 0x9, 0xe4, 0x97, + 0x7b, 0xc0, 0xb2, 0x69, 0x26, 0x2e, 0x3d, 0x1e, + 0x6f, 0xb9, 0xc6, 0xc4, 0x8e, 0x7b, 0xe4, 0x2e, + 0x32, 0x71, 0x54, 0x15, 0x18, 0x53, 0xf6, 0x54, + 0x6b, 0xf6, 0x26, 0xfd, 0x4, 0x86, 0x7b, 0x28, + 0x36, 0xc8, 0x84, 0xc4, 0xff, 0xc6, 0xe1, 0xce, + 0x81, 0xf3, 0xe4, 0xbd, 0xde, 0xe1, 0x81, 0xbd, + 0xe1, 0x57, 0x81, 0x12, 0xc4, 0xd8, 0xb9, 0xe5, + 0x8f, 0x14, 0xa6, 0xe5, 0xcd, 0x9a, 0xc6, 0xb4, + 0xb4, 0x9a, 0xe1, 0xaf, 0xbf, 0xb4, 0xe2, 0xbf, + 0xe2, 0xf4, 0xbf, 0xaf, 0xf4, 0xf4, 0x9a, 0x8d, + 0xf4, 0xf4, 0x9a, 0xf4, 0xf4, 0xf4, 0x32, 0x32, + 0xf4, 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x23, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x8d, 0xe1, 0x36, 0x81, 0xce, 0x84, 0x81, 0xb9, + 0xb0, 0x71, 0xff, 0x9, 0xbf, 0x8d, 0x70, 0x81, + 0x9, 0x9, 0xe1, 0xf8, 0x8d, 0xe4, 0xdd, 0x9, + 0xe4, 0xe4, 0xb1, 0x84, 0x2e, 0x70, 0x84, 0x3d, + 0x1e, 0x9f, 0xa9, 0x3e, 0x43, 0x40, 0xef, 0xef, + 0x54, 0x6b, 0xa5, 0xa8, 0x43, 0xc4, 0xc8, 0x9f, + 0x71, 0xb1, 0x36, 0x85, 0x9, 0xbd, 0x12, 0xe4, + 0xb4, 0x9, 0xde, 0x71, 0x36, 0xde, 0xde, 0x84, + 0xf5, 0x2e, 0x2e, 0x85, 0x2e, 0xce, 0x1e, 0x35, + 0xd6, 0x72, 0x60, 0x2f, 0xa3, 0xae, 0x7f, 0x3e, + 0x51, 0x15, 0x1e, 0x86, 0x8e, 0xbd, 0xe4, 0xde, + 0x36, 0xde, 0x85, 0x8d, 0x2e, 0xd8, 0xe1, 0x2e, + 0x2e, 0x9, 0xbf, 0xbf, 0x69, 0xf3, 0x8d, 0xce, + 0x9, 0xdd, 0xe1, 0xe4, 0xbd, 0xc6, 0xf6, 0x2e, + 0x69, 0x9, 0xbf, 0x8d, 0xdd, 0xbf, 0xbb, 0xf3, + 0x9, 0xce, 0x57, 0xde, 0xde, 0xff, 0xc8, 0x54, + 0x6f, 0xce, 0xe4, 0x12, 0xdd, 0xce, 0xb4, 0xb2, + 0x9, 0x85, 0x85, 0xc6, 0xe4, 0x8d, 0xce, 0x2e, + 0xce, 0xb2, 0x70, 0xdd, 0xb4, 0x9, 0x84, 0x84, + 0xe1, 0xe1, 0x85, 0x81, 0xc4, 0x75, 0x81, 0xce, + 0xde, 0x81, 0x70, 0x81, 0x84, 0xd8, 0x84, 0x28, + 0xdf, 0x71, 0x70, 0x70, 0xde, 0xf7, 0xb2, 0x8d, + 0xb4, 0xf4, 0x9a, 0xe1, 0x7, 0xbc, 0x75, 0xb4, + 0xbf, 0xe1, 0xb4, 0xe4, 0x9, 0x9a, 0x1e, 0x27, + 0x2a, 0xa8, 0x7e, 0x1e, 0x84, 0x85, 0x7, 0xbb, + 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0xf4, 0xf4, + 0xe2, 0xe2, 0x7, 0xf4, 0xe2, 0xf4, 0xf4, 0xe2, + 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0xf4, 0xf4, + 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, 0x44, 0xf4, 0xe2, + 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0xe2, 0x44, + 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x76, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x10, 0x0, 0x10, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0xac, 0x0, 0x44, + 0x44, 0x10, 0x10, 0x10, 0x44, 0x0, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb2, 0xe1, 0xb9, 0xc4, 0xb9, 0x1e, 0x81, 0xbd, + 0x8d, 0x70, 0xb2, 0x75, 0xde, 0x8d, 0xb9, 0xb9, + 0x70, 0x70, 0x2e, 0xb1, 0xde, 0xc6, 0xff, 0xff, + 0x8d, 0x8d, 0xfd, 0xc8, 0x84, 0x70, 0x1e, 0x71, + 0xf7, 0xb0, 0x71, 0x40, 0x86, 0x28, 0xc6, 0x57, + 0x3a, 0xf6, 0x35, 0xa5, 0x51, 0x54, 0x1e, 0x1e, + 0xfa, 0xce, 0xdd, 0x9, 0xce, 0xce, 0xb1, 0xe1, + 0x75, 0x81, 0x36, 0xf6, 0x71, 0x70, 0xbd, 0xce, + 0xb2, 0xf8, 0xce, 0x70, 0x84, 0xc6, 0x71, 0x53, + 0x48, 0x2a, 0xd6, 0x5c, 0xc2, 0x25, 0x7c, 0x35, + 0x54, 0xff, 0xf8, 0xfd, 0x84, 0x71, 0x2e, 0x71, + 0xf5, 0x1e, 0x71, 0x8d, 0xbf, 0xb2, 0x86, 0xb4, + 0x2e, 0xbb, 0xb4, 0xf4, 0x4b, 0xbb, 0x9a, 0xf4, + 0x85, 0x4b, 0xc6, 0xbb, 0x9a, 0xf4, 0xbf, 0xdf, + 0xce, 0xe2, 0xb4, 0xbf, 0x4b, 0xfa, 0x7, 0x9a, + 0x85, 0xb4, 0x4b, 0xc6, 0x8d, 0xbf, 0xb0, 0x54, + 0x39, 0xce, 0x8d, 0x84, 0xc6, 0x90, 0x74, 0x57, + 0xce, 0xb4, 0xb4, 0x86, 0xc0, 0xb4, 0xf4, 0xe1, + 0x54, 0x81, 0x70, 0x75, 0xe1, 0xfa, 0xc6, 0xdf, + 0xc4, 0xe4, 0x70, 0xb1, 0xce, 0x81, 0x70, 0xdd, + 0xce, 0x57, 0x1e, 0xf5, 0xb1, 0x81, 0x71, 0x81, + 0xf5, 0xed, 0x70, 0xdd, 0xbd, 0xce, 0xc6, 0xf7, + 0x12, 0x7, 0x75, 0xdf, 0xdf, 0xe4, 0xe4, 0xdd, + 0xc6, 0xb2, 0x81, 0xdd, 0xde, 0x75, 0x2a, 0x77, + 0xa5, 0x22, 0xf6, 0x71, 0x8d, 0xbb, 0x9a, 0x8d, + 0xbf, 0x9a, 0x9a, 0xfa, 0x95, 0xf4, 0xe2, 0xe2, + 0xe2, 0xf4, 0xe2, 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0x44, + 0xe2, 0x44, 0xe2, 0xe2, 0xf4, 0xe2, 0x93, 0x44, + 0xe2, 0xe2, 0x32, 0xe2, 0xe2, 0xf4, 0xf3, 0x12, + 0x95, 0xc0, 0xe2, 0xe2, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0xe2, 0xbf, 0x44, 0x44, 0xbf, 0x44, + 0x44, 0xf4, 0xf4, 0x44, 0x44, 0x44, 0xe2, 0xf4, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x10, 0x10, 0x10, 0x10, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x0, + 0x0, 0x10, 0x10, 0x10, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x28, 0x9d, 0x36, 0xff, 0x1e, 0x1e, 0x8e, 0x8e, + 0x2e, 0x70, 0xb1, 0xf5, 0xdd, 0x8d, 0x9, 0xdd, + 0xdd, 0x3d, 0xc8, 0x8e, 0x70, 0xd8, 0xc4, 0xde, + 0xc4, 0x70, 0xce, 0xdd, 0x70, 0xfa, 0x70, 0xff, + 0x81, 0x71, 0x1e, 0xfa, 0x9b, 0x74, 0x47, 0x6c, + 0x54, 0xc6, 0xce, 0xff, 0xce, 0xc4, 0x9, 0xce, + 0xde, 0xb9, 0x1e, 0xf5, 0x71, 0xc6, 0xf3, 0x12, + 0xf8, 0xc6, 0xdd, 0x70, 0x2e, 0xe4, 0xc4, 0xff, + 0x8d, 0x9f, 0x9b, 0x9f, 0x74, 0x54, 0x86, 0xb2, + 0xaf, 0xcc, 0xed, 0xce, 0xe4, 0xe4, 0x9, 0xde, + 0x36, 0x36, 0x84, 0x70, 0x3d, 0x86, 0x81, 0xb0, + 0x71, 0x81, 0x9, 0xbf, 0xaf, 0xf3, 0xc4, 0xc0, + 0x69, 0xf3, 0xb4, 0xc6, 0xf5, 0xf3, 0x9a, 0xe1, + 0xf3, 0xc0, 0x8d, 0xf3, 0xf3, 0xe4, 0xc6, 0xf5, + 0x93, 0x69, 0x57, 0x57, 0x9c, 0x9, 0xc6, 0xdd, + 0x69, 0xb4, 0xdd, 0x32, 0xf3, 0xce, 0xe1, 0x8b, + 0x6b, 0xf3, 0xb4, 0x1e, 0x26, 0xf5, 0xc0, 0xf5, + 0x93, 0xf3, 0xe2, 0x93, 0xf3, 0xb4, 0xe4, 0x3, + 0x6b, 0x93, 0xff, 0x15, 0x4, 0x12, 0x9, 0x32, + 0x8e, 0x70, 0x9, 0x8e, 0xbd, 0x84, 0x81, 0xde, + 0xbd, 0x71, 0x75, 0x9b, 0xb9, 0xb2, 0x70, 0xff, + 0xf3, 0xcd, 0xb2, 0x70, 0x9, 0x7, 0x71, 0x26, + 0x93, 0xb4, 0xc0, 0x4, 0x97, 0xb4, 0xde, 0x97, + 0x93, 0xe4, 0x84, 0x4, 0xb9, 0xb9, 0x36, 0x27, + 0x7f, 0x1b, 0xc2, 0x6b, 0x26, 0x8d, 0x8d, 0x26, + 0x4, 0x97, 0x97, 0x69, 0x97, 0x93, 0xf4, 0xf4, + 0x12, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0x93, + 0x12, 0xf4, 0x44, 0xe2, 0x12, 0xe2, 0xe2, 0xe2, + 0x12, 0xe2, 0x44, 0x95, 0xe2, 0xe2, 0x20, 0xf4, + 0xe2, 0xe2, 0x12, 0xe2, 0xe2, 0xe2, 0xaf, 0xe2, + 0xe2, 0x95, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xbf, 0x44, + 0x44, 0x44, 0xf4, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x0, 0x0, 0x0, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb2, 0x74, 0x54, 0xc4, 0x2e, 0x70, 0x2e, 0xce, + 0xb4, 0xb4, 0xb2, 0xdd, 0xce, 0xe1, 0xf7, 0xe4, + 0xb4, 0x70, 0xde, 0xbd, 0x2e, 0xb4, 0xce, 0xce, + 0xbf, 0x9a, 0xe1, 0x9, 0xce, 0xc6, 0x84, 0xfd, + 0x75, 0x18, 0x15, 0x40, 0xde, 0xbf, 0xe4, 0xdf, + 0xdf, 0x85, 0xbf, 0xff, 0xfa, 0x90, 0x90, 0x36, + 0xd8, 0x71, 0x3d, 0x6f, 0x81, 0x95, 0x70, 0x70, + 0xf7, 0xf8, 0xf3, 0xc0, 0xe4, 0x90, 0x18, 0x81, + 0x85, 0x70, 0x84, 0x1e, 0x99, 0xc4, 0xe4, 0xbf, + 0xbd, 0x70, 0xb1, 0x8d, 0x71, 0xd8, 0x75, 0x15, + 0x8b, 0x3d, 0xde, 0xce, 0xc8, 0x15, 0xf8, 0xce, + 0xb1, 0xbd, 0xce, 0xf3, 0x97, 0x93, 0xbd, 0xdd, + 0x6f, 0xb1, 0x81, 0xbd, 0x93, 0x12, 0xc6, 0xf3, + 0x97, 0x93, 0xe4, 0xf3, 0x97, 0x12, 0xb4, 0x40, + 0x4, 0x2e, 0xe1, 0x1e, 0x93, 0xf3, 0xe4, 0xf3, + 0x97, 0x12, 0xe4, 0xde, 0xfd, 0xf5, 0x57, 0xa9, + 0x3, 0xc0, 0x81, 0xb1, 0x69, 0xf3, 0xdd, 0x32, + 0x93, 0x12, 0x12, 0x8e, 0x32, 0xf3, 0x81, 0x3, + 0x47, 0xbd, 0xc4, 0x7b, 0x4, 0xf3, 0x95, 0xbd, + 0xb9, 0x70, 0x85, 0x28, 0xce, 0x36, 0x9f, 0x28, + 0xff, 0xf6, 0x9d, 0x36, 0x6f, 0xdf, 0x7b, 0xdd, + 0x4, 0x69, 0xdd, 0xc4, 0xe0, 0xbd, 0x70, 0x9b, + 0x9c, 0x54, 0x40, 0x6f, 0x4, 0x97, 0xf5, 0x6f, + 0x4, 0xce, 0xde, 0xd8, 0xff, 0x26, 0x8e, 0x47, + 0xfb, 0xe8, 0x35, 0x15, 0x26, 0xbd, 0xb0, 0x26, + 0x4, 0x93, 0x97, 0x97, 0x69, 0x93, 0xbb, 0xf4, + 0x93, 0x20, 0xe2, 0xe2, 0x12, 0xe2, 0x44, 0xf3, + 0x12, 0x95, 0x44, 0xf4, 0x12, 0xe2, 0x44, 0x44, + 0x12, 0x44, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x9, 0x85, 0x83, 0x39, 0xe4, 0x8d, 0x7, 0xc6, + 0x54, 0x9f, 0x57, 0xb4, 0x70, 0xe4, 0x4b, 0x9, + 0x85, 0xf4, 0x70, 0x90, 0xf8, 0x84, 0x57, 0xe1, + 0xc6, 0x81, 0x4b, 0x81, 0xde, 0x71, 0x28, 0x28, + 0x9c, 0x54, 0x28, 0xb1, 0xff, 0xe4, 0x69, 0x6c, + 0x54, 0xb9, 0x36, 0x8e, 0x3, 0x40, 0x25, 0x26, + 0x69, 0xbd, 0xc4, 0x6f, 0x26, 0xbf, 0x93, 0x8e, + 0xf5, 0x1e, 0xfd, 0x26, 0x84, 0x3d, 0x47, 0x6f, + 0x32, 0x70, 0x9c, 0xb1, 0x9c, 0x4, 0x69, 0xb1, + 0xc4, 0x3d, 0xff, 0x7b, 0x36, 0xb9, 0xb9, 0x28, + 0x99, 0x70, 0xce, 0xb2, 0xde, 0xff, 0xff, 0xff, + 0xb1, 0xce, 0xb2, 0xfa, 0xf5, 0xf3, 0xb2, 0xc6, + 0xf5, 0x99, 0xc6, 0xbf, 0xc0, 0xe4, 0xf9, 0xdf, + 0xf3, 0xf3, 0xb4, 0x75, 0xdf, 0x81, 0xe1, 0xe1, + 0xc0, 0x81, 0xdf, 0xb4, 0xbf, 0xbf, 0xbf, 0xdf, + 0x9c, 0xbf, 0xb4, 0xcf, 0x8b, 0x90, 0xf8, 0xb2, + 0x81, 0xe4, 0x4b, 0xf5, 0xf3, 0xbf, 0xbf, 0x81, + 0x8b, 0xe2, 0xb4, 0xe1, 0x81, 0xdf, 0xdf, 0xaf, + 0x69, 0xbb, 0xc6, 0xdf, 0x99, 0xf7, 0x70, 0xe1, + 0x75, 0x70, 0xfa, 0x1e, 0xff, 0x70, 0xc8, 0x28, + 0x4, 0xf7, 0xc4, 0xb1, 0x4, 0xb1, 0xce, 0xf5, + 0xb1, 0xf3, 0xe4, 0xc8, 0x36, 0xde, 0x70, 0xff, + 0x97, 0xf5, 0xed, 0x93, 0x69, 0x97, 0x9, 0x1e, + 0x36, 0x8d, 0xe1, 0xce, 0x70, 0xde, 0xfd, 0x15, + 0x7c, 0xe8, 0xfb, 0x15, 0x81, 0xb4, 0xbb, 0x8d, + 0xbb, 0x8d, 0xf4, 0xb0, 0xf4, 0xe2, 0xe2, 0xe2, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0xe2, 0xe2, + 0x20, 0xe2, 0x20, 0xe2, 0xe2, 0xe2, 0xee, 0xbb, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x10, 0x10, 0x10, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xce, 0x85, 0x8b, 0x6b, 0x69, 0xb4, 0xf5, 0x8e, + 0xf5, 0x9, 0xf5, 0x93, 0x69, 0xe2, 0x93, 0x69, + 0xb4, 0xe4, 0x3, 0x54, 0x69, 0xff, 0x54, 0x4, + 0xf3, 0x69, 0x32, 0xe0, 0xe1, 0xde, 0x28, 0xd7, + 0x26, 0xb1, 0x7b, 0x6f, 0xdd, 0xf8, 0x8e, 0x7b, + 0x3, 0x27, 0x27, 0x6b, 0x28, 0x7b, 0xf5, 0x7b, + 0xb1, 0xce, 0x4, 0x97, 0x69, 0xb2, 0x36, 0x8e, + 0x36, 0xc8, 0x3d, 0x6f, 0xff, 0xe4, 0x8e, 0x8e, + 0x93, 0x7b, 0x26, 0x28, 0xfd, 0x8e, 0x36, 0x1e, + 0x28, 0xd8, 0x36, 0x97, 0xb1, 0x99, 0xff, 0x32, + 0x6f, 0x7b, 0x54, 0xe0, 0xb1, 0xff, 0xff, 0xb9, + 0x36, 0x70, 0xe1, 0xb2, 0xb4, 0xb4, 0xf4, 0xbb, + 0x8d, 0xe4, 0xbb, 0xf4, 0xf4, 0x8d, 0x9a, 0x57, + 0x7, 0xf4, 0xf4, 0xb4, 0x81, 0xe4, 0xf4, 0xb4, + 0xe2, 0xbf, 0x95, 0x9a, 0xbf, 0xbf, 0xbf, 0xe1, + 0xe1, 0xb4, 0xf4, 0x9a, 0xe4, 0xe4, 0xbf, 0xb4, + 0xce, 0xbf, 0xbf, 0xe1, 0x57, 0xb4, 0xf4, 0xc6, + 0xf5, 0xaf, 0xbf, 0xe4, 0x36, 0x25, 0x74, 0x43, + 0x35, 0xa9, 0x18, 0x43, 0x3e, 0x9f, 0xce, 0xce, + 0xb1, 0xb2, 0xc6, 0x86, 0xff, 0x8d, 0xbf, 0x9, + 0x12, 0x81, 0x85, 0x84, 0x84, 0x2e, 0x8d, 0xc8, + 0x1e, 0x2e, 0xb0, 0xe4, 0xce, 0xed, 0xb4, 0x9, + 0x8d, 0xe2, 0x8d, 0x84, 0x8d, 0xb4, 0x9a, 0x75, + 0xe4, 0xc8, 0x8b, 0x8b, 0xa9, 0x43, 0x43, 0x2a, + 0x2d, 0xa3, 0xfb, 0x6b, 0xf5, 0xe4, 0xbb, 0x8d, + 0x9a, 0x12, 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xf4, + 0xf4, 0x44, 0xe2, 0xe2, 0xf4, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0x20, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x20, 0x9, 0xf4, + 0xe2, 0x20, 0xf3, 0x8d, 0xe2, 0xf3, 0xbf, 0xe2, + 0xe2, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0xf4, 0x44, + 0x44, 0x44, 0xf4, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf5, 0x57, 0xa9, 0x3, 0xc0, 0x81, 0x32, 0x97, + 0xf3, 0xdd, 0x32, 0x93, 0xf3, 0xaf, 0x8e, 0xb1, + 0xc0, 0x81, 0x3, 0x47, 0xb1, 0xc4, 0x7b, 0xb1, + 0xf3, 0x8d, 0xe4, 0x36, 0xe4, 0x85, 0x70, 0x54, + 0xf5, 0x70, 0xde, 0xbd, 0xc8, 0x74, 0x36, 0x26, + 0x7b, 0x3d, 0x8f, 0x7b, 0xc4, 0x9, 0x69, 0x26, + 0x4b, 0x71, 0xd8, 0xb9, 0xc6, 0x40, 0x6a, 0xbd, + 0x9, 0x70, 0xdd, 0x9c, 0xb2, 0xce, 0x69, 0x2e, + 0xfa, 0x25, 0x3, 0x28, 0x36, 0x9f, 0x6a, 0xf5, + 0xb2, 0x9, 0xf3, 0xf3, 0x54, 0x8e, 0xb9, 0xd8, + 0x32, 0x70, 0x90, 0x6b, 0xb9, 0x84, 0xe1, 0xfd, + 0xdf, 0x81, 0x9, 0x8d, 0x12, 0xaf, 0xb2, 0xe4, + 0x93, 0xf3, 0xbf, 0xe1, 0x1e, 0xc0, 0xb4, 0xc6, + 0xdd, 0xdf, 0xe4, 0xe4, 0x93, 0x12, 0xbf, 0x4b, + 0xbd, 0xc0, 0xbf, 0xc6, 0x9d, 0x81, 0xe2, 0xb4, + 0x93, 0xb4, 0xdf, 0xf3, 0x32, 0xbd, 0xb4, 0x1e, + 0x3, 0xbd, 0x95, 0xf3, 0x83, 0x83, 0xdf, 0x97, + 0x4, 0x93, 0xc0, 0x6f, 0x6, 0x0, 0x6, 0x1a, + 0x5e, 0x1a, 0x1a, 0x6, 0xb5, 0x25, 0xf7, 0xf3, + 0x69, 0x12, 0xbf, 0xb1, 0xb1, 0xf7, 0x70, 0x85, + 0xff, 0xf8, 0x15, 0x40, 0x3d, 0xe1, 0xb2, 0x70, + 0xdf, 0xce, 0xe4, 0xaf, 0xce, 0x12, 0xf7, 0xce, + 0x2e, 0xbb, 0xb0, 0x84, 0x40, 0xf8, 0xe4, 0xe4, + 0x9, 0x6, 0x0, 0x6, 0x94, 0x6, 0xe3, 0x1a, + 0x5e, 0xe6, 0xe8, 0x15, 0x8e, 0xdd, 0x95, 0x32, + 0x9, 0x97, 0x12, 0xe2, 0x44, 0xe2, 0xe2, 0xe2, + 0x12, 0xe2, 0xe2, 0x20, 0x12, 0x20, 0x20, 0xf3, + 0x95, 0x95, 0xe2, 0x12, 0x95, 0xe2, 0x44, 0x12, + 0xbb, 0xe2, 0x44, 0xe2, 0xf4, 0xe2, 0xee, 0x44, + 0x20, 0x20, 0x93, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x90, 0xf8, 0xc6, 0x81, 0xe4, 0x4b, 0x9c, 0xf3, + 0xbf, 0xbf, 0xb2, 0x8b, 0xe2, 0xb4, 0x85, 0x81, + 0xdf, 0xdf, 0xf3, 0xf3, 0xbf, 0xc6, 0x54, 0x99, + 0x70, 0xce, 0xe1, 0x71, 0x70, 0xc6, 0x70, 0xc4, + 0x90, 0x74, 0x75, 0xb2, 0xb2, 0xed, 0x36, 0x2e, + 0xde, 0xb2, 0x54, 0x7b, 0xb2, 0x71, 0x84, 0x1e, + 0xdf, 0x1e, 0x70, 0xe1, 0x8d, 0xc6, 0x9, 0xb4, + 0xe4, 0xbb, 0xf8, 0xc4, 0xb2, 0x75, 0x53, 0x71, + 0x54, 0xc4, 0x81, 0xe4, 0x85, 0x70, 0xed, 0xce, + 0x9, 0xbb, 0x84, 0x86, 0xc4, 0x15, 0x54, 0x9d, + 0x1e, 0xc6, 0x71, 0x81, 0xce, 0xb2, 0x71, 0x70, + 0xc4, 0x86, 0xf3, 0xbb, 0x93, 0x97, 0xdf, 0xf5, + 0x6f, 0xc0, 0xe4, 0x81, 0x99, 0x93, 0x95, 0xf3, + 0x97, 0x6f, 0xed, 0xc0, 0x93, 0x12, 0xbf, 0xf5, + 0x1e, 0xdd, 0xbf, 0xbf, 0xf5, 0xf5, 0xe4, 0xf3, + 0x93, 0xf3, 0xdf, 0x32, 0x47, 0xdd, 0xe4, 0x83, + 0x7c, 0xd8, 0xe4, 0xf3, 0x9c, 0x9c, 0xf5, 0x93, + 0x4, 0x93, 0xf3, 0x99, 0xe3, 0x0, 0x2e, 0x47, + 0x27, 0x54, 0x69, 0x69, 0xf3, 0xed, 0xb2, 0xf8, + 0xff, 0x9a, 0xbb, 0xde, 0xde, 0xf7, 0xde, 0x1e, + 0xb9, 0xdd, 0xce, 0x32, 0x8e, 0xff, 0x9, 0x9, + 0x69, 0xdd, 0xcd, 0xde, 0xde, 0x2e, 0xb4, 0x69, + 0xf3, 0xb4, 0xe2, 0x9, 0x12, 0x95, 0xbf, 0x9, + 0xaf, 0x6, 0x0, 0x20, 0xbb, 0xbb, 0x85, 0xd8, + 0x40, 0x40, 0x15, 0x81, 0xbd, 0xbb, 0xbb, 0xf4, + 0x32, 0x9a, 0x9, 0xe2, 0xf4, 0xe2, 0xe2, 0xf4, + 0xbd, 0x20, 0xee, 0x93, 0x12, 0xe2, 0x95, 0x95, + 0xf3, 0xe2, 0xee, 0x93, 0x20, 0xe2, 0xe2, 0x12, + 0x95, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0xe2, 0x20, 0xf4, 0xbb, 0x20, 0x44, 0xe2, 0xe2, + 0x20, 0x20, 0x20, 0x20, 0x44, 0xee, 0x12, 0xe2, + 0x44, 0xe2, 0xe2, 0xbb, 0x44, 0x44, 0x95, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb4, 0x95, 0xb4, 0xb4, 0xbf, 0xbf, 0xe1, 0x57, + 0xb4, 0xf4, 0xc6, 0x9c, 0xaf, 0xbf, 0xe4, 0xf3, + 0xbf, 0xbf, 0xe4, 0x81, 0xe1, 0xe4, 0x2e, 0x9d, + 0x71, 0xe4, 0xe4, 0xff, 0xb2, 0x1e, 0x40, 0x28, + 0xb9, 0x54, 0x8e, 0x4, 0xb1, 0xe4, 0x69, 0x47, + 0xf5, 0x75, 0x9b, 0x15, 0x28, 0x40, 0x8b, 0xb1, + 0x85, 0xf3, 0xb1, 0xb2, 0xe4, 0xf4, 0xf3, 0xdd, + 0x70, 0x81, 0xc8, 0x9b, 0xb9, 0x90, 0x25, 0xc4, + 0xe4, 0xce, 0x32, 0xb1, 0xf7, 0xff, 0x8e, 0xbd, + 0xb2, 0xfd, 0x25, 0x3d, 0x8e, 0x7b, 0xff, 0x1e, + 0x6b, 0xb2, 0xfd, 0x8e, 0x26, 0xf5, 0xed, 0xff, + 0x8e, 0xce, 0xce, 0xb4, 0x85, 0xdd, 0xb4, 0xbb, + 0xc6, 0xe4, 0xbf, 0xbf, 0xf3, 0xe4, 0xbf, 0xe2, + 0xdd, 0xe4, 0xbf, 0xe4, 0x57, 0xe1, 0xf4, 0xc6, + 0xb4, 0xbf, 0xf4, 0xaf, 0xbf, 0xbf, 0xaf, 0xf4, + 0xe1, 0x7, 0xe4, 0xbf, 0x9f, 0x75, 0xce, 0xe4, + 0xce, 0xbf, 0xbf, 0xaf, 0xc0, 0xbb, 0xaf, 0xf3, + 0xc0, 0x8d, 0xaf, 0x95, 0xe3, 0x0, 0xaf, 0xf3, + 0xc0, 0xe4, 0xb4, 0xe4, 0xe4, 0xb4, 0xbf, 0xb4, + 0x85, 0x85, 0x2e, 0x84, 0xb9, 0xcd, 0xc6, 0xff, + 0x7b, 0x9, 0xce, 0xb1, 0xf8, 0xc4, 0xde, 0x2e, + 0xce, 0xbb, 0xf7, 0xdf, 0xde, 0xbb, 0xbf, 0xce, + 0x9, 0x70, 0xee, 0xbf, 0xee, 0xee, 0xb4, 0x8d, + 0xbb, 0x6, 0x0, 0xf4, 0x20, 0xbf, 0x85, 0xd8, + 0x71, 0x36, 0x36, 0x85, 0xbd, 0x12, 0x93, 0x69, + 0x2e, 0x12, 0xf4, 0xf4, 0xe2, 0xf4, 0xe2, 0xe2, + 0x20, 0x95, 0xf4, 0x20, 0x20, 0xf4, 0xe2, 0x95, + 0x95, 0xe2, 0xe2, 0xe2, 0x20, 0xee, 0x20, 0xbb, + 0x20, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xf4, 0xe2, + 0x9a, 0x95, 0xee, 0xf4, 0xee, 0xee, 0xe2, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xdd, 0xb4, 0x1e, 0x3, 0xbd, 0xbf, 0xf3, 0x83, + 0x83, 0xdf, 0x97, 0x4, 0x93, 0xc0, 0x9c, 0x93, + 0x12, 0xbf, 0xfd, 0x43, 0x3d, 0xd8, 0x32, 0x7b, + 0xed, 0xf7, 0x93, 0x32, 0xce, 0xc6, 0x7b, 0x4, + 0x4, 0xc4, 0xe5, 0x4, 0xdd, 0xde, 0xc8, 0xe5, + 0x6a, 0xa9, 0xa9, 0xef, 0x54, 0x39, 0x9c, 0x4, + 0xf3, 0xbf, 0x9c, 0x9c, 0xdd, 0xbf, 0xb9, 0x8e, + 0x6a, 0x54, 0x11, 0x28, 0x97, 0x6f, 0x7d, 0x9c, + 0xe4, 0x9, 0x8e, 0x54, 0x9c, 0x8e, 0x3, 0x47, + 0x86, 0x39, 0x6f, 0x4, 0xbd, 0x26, 0x6f, 0x99, + 0x6a, 0x7b, 0xb1, 0xb1, 0x32, 0x99, 0x99, 0x26, + 0x2e, 0xbd, 0x8d, 0x4b, 0x1e, 0xbf, 0xbf, 0xb4, + 0xe4, 0x81, 0xbf, 0xf4, 0xe4, 0x9a, 0xf4, 0xfc, + 0x57, 0x9a, 0xbf, 0xbf, 0x81, 0xaf, 0xb4, 0xbf, + 0xbf, 0xcc, 0xf4, 0xbf, 0xbf, 0x9a, 0xf4, 0x81, + 0x75, 0xb0, 0xbb, 0xe4, 0x2e, 0xdf, 0x85, 0xe4, + 0xce, 0xe1, 0x4b, 0xf9, 0xb4, 0x9a, 0x9a, 0xf4, + 0xdf, 0xb4, 0xf4, 0xb0, 0x6, 0x0, 0x4b, 0xf3, + 0xe4, 0xe1, 0xe1, 0xfa, 0xff, 0x3d, 0xb4, 0xb4, + 0xf7, 0xf7, 0x8d, 0xdd, 0xdd, 0xbf, 0x70, 0x70, + 0xb2, 0x8d, 0x8d, 0x9a, 0xf5, 0x1e, 0xcd, 0xe4, + 0x8d, 0x8d, 0xbb, 0x9, 0xbf, 0x9, 0xbb, 0xaf, + 0xbf, 0xb4, 0xbf, 0xe2, 0xbf, 0xbf, 0xee, 0xbf, + 0xe2, 0x6, 0x0, 0xee, 0xf4, 0xbf, 0xb0, 0x9a, + 0x2e, 0xe4, 0xb0, 0x8d, 0xf3, 0xf4, 0x93, 0x26, + 0xbb, 0xe2, 0xf4, 0xe2, 0xe2, 0x12, 0xe2, 0x44, + 0xf4, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0x44, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x20, 0x44, 0x44, + 0xbf, 0x95, 0x12, 0x95, 0xee, 0x95, 0x44, 0xe2, + 0x44, 0x95, 0xee, 0xee, 0x44, 0xee, 0x95, 0x44, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbd, 0xe4, 0x83, 0x7c, 0xd8, 0xb4, 0xf3, 0x9c, + 0xf5, 0xdf, 0x93, 0x4, 0x93, 0xf3, 0xca, 0x8e, + 0xd8, 0xde, 0x47, 0x25, 0x54, 0x9, 0x97, 0x93, + 0xed, 0xb2, 0xf7, 0xff, 0x85, 0xb4, 0x12, 0xdd, + 0xb1, 0x9, 0x54, 0x36, 0x9, 0x7, 0xc8, 0x15, + 0x6a, 0x1e, 0x1e, 0x7b, 0x93, 0xdf, 0x7b, 0x12, + 0xbb, 0xbb, 0x84, 0xed, 0x8d, 0x9, 0x84, 0xaf, + 0xf8, 0xed, 0x69, 0xc0, 0x95, 0xed, 0x7b, 0xc4, + 0xbf, 0x2e, 0xc8, 0x3a, 0xfa, 0x95, 0x9, 0x12, + 0xbf, 0xc4, 0x81, 0x9, 0xbd, 0x8d, 0x2e, 0x28, + 0x47, 0x70, 0x8d, 0xbd, 0xb2, 0xde, 0xde, 0xe1, + 0x71, 0x70, 0xb0, 0xfa, 0x12, 0x9, 0xf3, 0x12, + 0x93, 0xdf, 0xf8, 0xbf, 0xfd, 0xf6, 0x86, 0xdf, + 0xbd, 0xbd, 0xbf, 0xce, 0xf5, 0xc0, 0xbf, 0xb4, + 0x93, 0x84, 0xdf, 0xf3, 0xdd, 0x81, 0xbf, 0xed, + 0xf5, 0xf3, 0xb4, 0xc0, 0x32, 0xf5, 0xce, 0xb1, + 0x47, 0xc8, 0x54, 0x93, 0xff, 0xf8, 0xe4, 0xf5, + 0x6f, 0xdf, 0xb4, 0xf3, 0x6, 0x0, 0xff, 0x4, + 0x6f, 0xc8, 0x71, 0x86, 0xc4, 0xaf, 0x8d, 0x9, + 0x93, 0xce, 0x70, 0xf3, 0xdd, 0x8d, 0xee, 0xf3, + 0x71, 0xf4, 0xe4, 0x81, 0x8d, 0x70, 0x9, 0xdd, + 0xe4, 0xbf, 0xbf, 0x9, 0x9, 0xbf, 0xbf, 0x12, + 0xbf, 0xee, 0xbb, 0xee, 0xee, 0x44, 0xf4, 0xee, + 0xbb, 0x94, 0x0, 0xee, 0xe2, 0xf4, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0x95, 0x8d, 0x20, 0xf4, 0xbd, + 0x12, 0xe2, 0x20, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, + 0xe2, 0xe2, 0x12, 0x95, 0xe2, 0x44, 0x20, 0x20, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, + 0x44, 0xf4, 0xf4, 0xe2, 0xe2, 0xf4, 0x44, 0xf4, + 0x12, 0x95, 0x20, 0xe2, 0x95, 0xee, 0xe2, 0x44, + 0xe2, 0x44, 0xee, 0x44, 0x44, 0xee, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x75, 0xe4, 0xe4, 0xdd, 0xbf, 0x95, 0xbf, 0xc0, + 0xbb, 0xaf, 0xc0, 0x12, 0xb4, 0xbb, 0x95, 0xc6, + 0x75, 0xbf, 0xf3, 0xc0, 0xe4, 0xb4, 0xb4, 0xb4, + 0xe4, 0xbf, 0x9, 0xb0, 0x8d, 0xbb, 0x9a, 0x8d, + 0x8d, 0x9a, 0x9f, 0x85, 0x8d, 0xc6, 0xb2, 0x8d, + 0xe4, 0xf8, 0x1e, 0x4b, 0xb2, 0xbb, 0x85, 0x9a, + 0xf4, 0x8d, 0x9a, 0x8d, 0xbb, 0xe2, 0xbb, 0xbb, + 0xf4, 0xbb, 0xb2, 0xf8, 0x8d, 0x8d, 0xb0, 0x74, + 0xb0, 0xb2, 0x85, 0xbf, 0x95, 0xf4, 0x8d, 0xbf, + 0xf4, 0x8d, 0xb4, 0xbc, 0x9f, 0x81, 0x81, 0x84, + 0x75, 0xf7, 0xfa, 0xf6, 0xb2, 0xce, 0x84, 0x84, + 0xf5, 0x81, 0x70, 0x95, 0xdd, 0x69, 0x70, 0xdd, + 0xb9, 0x28, 0xe4, 0x2e, 0xc4, 0x32, 0xb0, 0xce, + 0x4, 0xce, 0xdd, 0xf3, 0x32, 0x26, 0xce, 0xce, + 0x8e, 0x36, 0xbf, 0x8d, 0x26, 0xdd, 0xbf, 0xf3, + 0x93, 0xce, 0xb0, 0xdd, 0x32, 0xb9, 0x57, 0x36, + 0xfd, 0x28, 0x70, 0x32, 0x32, 0xce, 0xe4, 0x12, + 0x69, 0xee, 0xce, 0x70, 0xe3, 0x0, 0x84, 0x6f, + 0xe0, 0x9f, 0x9, 0x7b, 0x69, 0xce, 0xb4, 0xce, + 0x9, 0x85, 0xa3, 0x1a, 0x1a, 0x1a, 0xc7, 0xfd, + 0x26, 0x26, 0x86, 0x97, 0xe7, 0xab, 0x75, 0xb1, + 0x9c, 0xbf, 0xbb, 0xa5, 0x8d, 0xf8, 0x24, 0x6, + 0x6, 0xd3, 0x94, 0x6, 0x6, 0x72, 0xbb, 0xe2, + 0x20, 0x6, 0x0, 0xe2, 0xbb, 0xee, 0xee, 0xf4, + 0xf4, 0xf4, 0xbf, 0x2e, 0xf3, 0xf4, 0x9a, 0x14, + 0x6, 0x6, 0x6, 0x72, 0xf4, 0xf4, 0xe2, 0x44, + 0xe2, 0x52, 0xd3, 0x6, 0x6, 0x8c, 0x3e, 0x12, + 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0xf4, 0xd6, 0xd3, + 0x94, 0x1, 0xd6, 0x44, 0x44, 0xe2, 0x44, 0x57, + 0x1, 0xd3, 0x94, 0xd3, 0x94, 0xd3, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xdf, 0xb4, 0xe4, 0xe4, 0xe1, 0x4b, 0x4b, 0xb4, + 0x85, 0x9a, 0xf4, 0xdf, 0xb4, 0xf4, 0xb4, 0xce, + 0x4b, 0x86, 0xf3, 0xe4, 0xe1, 0x70, 0xed, 0xb2, + 0x3d, 0xb0, 0xe4, 0xf7, 0xb4, 0x8d, 0x85, 0x83, + 0xfa, 0x8d, 0x70, 0x95, 0x86, 0x4b, 0xf5, 0xb9, + 0x8d, 0x7, 0x2a, 0x43, 0xb2, 0xaf, 0xfd, 0x54, + 0x4b, 0xf8, 0x95, 0xf3, 0xe2, 0x4b, 0xdf, 0xaf, + 0x8d, 0xbf, 0x9d, 0x18, 0x90, 0x9, 0xbd, 0xb1, + 0xdf, 0xdf, 0xf3, 0xaf, 0xbf, 0xcc, 0xdf, 0xf6, + 0x85, 0xf3, 0x6f, 0x3a, 0x40, 0x6f, 0x28, 0xe0, + 0x7b, 0xff, 0x99, 0x6b, 0x97, 0xbd, 0x9, 0xc4, + 0x99, 0xff, 0x9, 0xf3, 0xdd, 0xf7, 0x81, 0x81, + 0x2e, 0xbd, 0x85, 0xb2, 0xf5, 0x9, 0xbb, 0x9, + 0xdd, 0x28, 0xe4, 0xce, 0xde, 0x84, 0xb2, 0x1e, + 0x2e, 0x9, 0xbf, 0x9, 0xc4, 0xf8, 0x8d, 0xe4, + 0x95, 0xe4, 0x4b, 0x70, 0xde, 0x84, 0x71, 0x15, + 0x6b, 0xce, 0xe4, 0x9, 0x9, 0xf8, 0xb2, 0xdd, + 0x9, 0xe1, 0x71, 0xf5, 0xe3, 0x0, 0xe1, 0x81, + 0x1e, 0xf5, 0xce, 0x9, 0xf3, 0xce, 0xb2, 0x70, + 0xc8, 0x5e, 0x1, 0xf7, 0xb2, 0x81, 0xa1, 0xac, + 0x70, 0x20, 0xbf, 0x81, 0x34, 0x34, 0x5e, 0xbf, + 0xc6, 0xbf, 0xee, 0x6, 0x9, 0xf4, 0xaf, 0xe2, + 0xbb, 0x1a, 0x1a, 0xf4, 0xbb, 0xe2, 0xe2, 0xe2, + 0xf4, 0x94, 0x0, 0xe2, 0xee, 0xbb, 0xe2, 0xf4, + 0x20, 0xbb, 0xf4, 0xf3, 0xf3, 0xfd, 0x5e, 0x49, + 0xf4, 0xf4, 0xf4, 0x49, 0x1a, 0xf4, 0xe2, 0xe2, + 0xe2, 0x0, 0x6, 0xe2, 0xe2, 0x9d, 0x34, 0xa8, + 0x44, 0x44, 0xe2, 0x44, 0x9a, 0x1a, 0x49, 0xf4, + 0xe2, 0x44, 0x2c, 0x49, 0x44, 0xe2, 0xe2, 0x52, + 0x0, 0x15, 0xee, 0xe2, 0xe2, 0x95, 0x44, 0x44, + 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x6f, 0xdd, 0xb1, 0x47, 0x3d, 0x54, 0x93, 0x8e, + 0xc6, 0xce, 0xf5, 0x6f, 0xdf, 0x2e, 0x9, 0x97, + 0x93, 0x26, 0x4, 0x9c, 0x3d, 0xc8, 0xdf, 0x7b, + 0x9, 0xb4, 0xb1, 0x32, 0xe4, 0x70, 0x2e, 0x7b, + 0xc0, 0x9, 0xdd, 0x4, 0x12, 0xdf, 0x28, 0x3, + 0xd8, 0x28, 0xa9, 0x43, 0x4, 0x8d, 0x4, 0x4, + 0x12, 0x8d, 0x93, 0x12, 0xb4, 0xbf, 0x97, 0x47, + 0x85, 0x9, 0x1e, 0x3, 0x1e, 0x69, 0x4, 0x93, + 0x95, 0xc4, 0x69, 0x26, 0xe1, 0xf3, 0x4, 0xfd, + 0x9f, 0xdd, 0x4, 0x4, 0xc4, 0x4, 0x32, 0x28, + 0xe0, 0x69, 0x2e, 0x7b, 0xb1, 0x26, 0xc4, 0x69, + 0x6f, 0xdd, 0x70, 0x9a, 0xb9, 0xc0, 0x70, 0xb2, + 0x69, 0x9, 0x95, 0x8d, 0x7b, 0xf3, 0xb0, 0x9, + 0xb9, 0x81, 0xb2, 0xd8, 0x1e, 0xb1, 0x8d, 0xb1, + 0xbd, 0x70, 0x8d, 0x95, 0x9, 0xdd, 0x9a, 0x70, + 0x2e, 0xce, 0x70, 0x2e, 0xc8, 0xc6, 0xe4, 0xff, + 0x26, 0xbd, 0xb2, 0xf8, 0x93, 0xde, 0xe1, 0xb2, + 0xb9, 0x70, 0xbf, 0xf3, 0x1a, 0x0, 0x5e, 0x6, + 0x6, 0x6, 0x1a, 0xe3, 0x1a, 0xc8, 0x70, 0x70, + 0x5e, 0x6, 0x8d, 0x9, 0xaf, 0x8d, 0x9, 0x6, + 0xac, 0xb4, 0xe2, 0xbf, 0x1a, 0xa9, 0x0, 0xa8, + 0xaf, 0xe2, 0xf4, 0x66, 0xbf, 0xf4, 0xe2, 0xaf, + 0xf4, 0x1a, 0xd3, 0xf4, 0xe2, 0xf4, 0xf4, 0xbb, + 0xe2, 0x6, 0x0, 0x1a, 0x66, 0xd3, 0x6, 0xd3, + 0xd3, 0x6, 0xc8, 0xbf, 0x9a, 0x5e, 0x6, 0x12, + 0xf4, 0x44, 0xe2, 0xe2, 0x6, 0x1a, 0xf4, 0x44, + 0xe2, 0x0, 0xd3, 0xe2, 0xe2, 0xe2, 0x18, 0x0, + 0x18, 0x44, 0x44, 0xe2, 0x1a, 0xd3, 0x44, 0xf4, + 0xe2, 0x93, 0xe2, 0x51, 0xe2, 0x93, 0xe2, 0xd3, + 0x0, 0x12, 0x95, 0xee, 0x12, 0xe2, 0x44, 0x44, + 0x44, 0xe2, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb9, 0x7, 0x93, 0xb1, 0x36, 0xc6, 0x69, 0x69, + 0x9, 0x8d, 0x32, 0x97, 0xc0, 0xe4, 0x9, 0x6f, + 0xb9, 0x71, 0x7b, 0x4, 0x75, 0xdd, 0x36, 0xb1, + 0xdd, 0x8d, 0xce, 0x69, 0xb4, 0xb4, 0xf3, 0x12, + 0x12, 0xe4, 0x81, 0xb9, 0xde, 0x8d, 0xd8, 0x40, + 0x54, 0xe4, 0x6f, 0x6f, 0x9, 0xc6, 0xc4, 0x32, + 0xdd, 0xbf, 0xb2, 0xd8, 0xc6, 0xbf, 0xc0, 0xde, + 0x4b, 0xe4, 0x12, 0x9, 0x9, 0xc6, 0x99, 0xc4, + 0xb4, 0xce, 0xde, 0x9f, 0xf6, 0xe1, 0xf3, 0xaf, + 0xb4, 0xc6, 0xb1, 0xdd, 0x2e, 0xdd, 0xdd, 0x9c, + 0x54, 0x71, 0xf7, 0x9, 0x70, 0x90, 0x54, 0x71, + 0x84, 0x2e, 0xb2, 0x86, 0x70, 0xbf, 0xbf, 0x8d, + 0x81, 0xed, 0xbb, 0xbf, 0x9, 0x85, 0x86, 0x86, + 0xc8, 0xe1, 0x8d, 0xf5, 0x6b, 0x7b, 0xbf, 0x8d, + 0xb2, 0xed, 0xfa, 0xbf, 0x9a, 0x7, 0xcd, 0x54, + 0x1e, 0x85, 0xbb, 0x85, 0x9c, 0xf5, 0xe4, 0x2e, + 0xce, 0xe1, 0xf5, 0xfa, 0x1e, 0x57, 0xe4, 0xfa, + 0xed, 0xe4, 0xe2, 0xbb, 0xd3, 0x0, 0x3e, 0x43, + 0x51, 0x2a, 0x2a, 0xfb, 0x4f, 0x70, 0x8d, 0x43, + 0x0, 0xfb, 0xc6, 0xc4, 0xf3, 0xc6, 0xce, 0x7f, + 0x0, 0x43, 0xbf, 0xc0, 0x6, 0x86, 0xb3, 0x0, + 0x27, 0xbf, 0x8d, 0xe3, 0xe4, 0xb4, 0xb4, 0xb4, + 0xc6, 0x6, 0x6, 0x12, 0xbf, 0xe2, 0xbb, 0xaf, + 0xbf, 0x94, 0x0, 0xa9, 0x27, 0x74, 0x74, 0x27, + 0x74, 0xa9, 0x9, 0x4, 0x77, 0x0, 0x77, 0x97, + 0x12, 0xf4, 0xf4, 0x12, 0xa9, 0x0, 0xa9, 0xf4, + 0xe2, 0x0, 0x6, 0x12, 0xf4, 0x44, 0x9f, 0x0, + 0xd6, 0xe2, 0xe2, 0x43, 0x0, 0x51, 0xf3, 0xe2, + 0x44, 0xf4, 0xf4, 0xe2, 0xe2, 0xf3, 0xe2, 0x94, + 0x0, 0xaf, 0xe2, 0xe2, 0xbf, 0xe2, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x70, 0xb2, 0xfa, 0x81, 0xb0, 0x70, 0x70, 0xce, + 0xf7, 0x70, 0x8d, 0xb2, 0x71, 0xc6, 0xf8, 0x8d, + 0x70, 0xc6, 0x86, 0xf6, 0xb2, 0xe4, 0x70, 0xc4, + 0xf8, 0xb0, 0xb0, 0x70, 0xf7, 0xf8, 0xbf, 0x7, + 0x7, 0x8d, 0x90, 0x54, 0xe1, 0xbf, 0xe1, 0xdf, + 0xc4, 0xb4, 0xe4, 0xe4, 0xe1, 0xdf, 0xdf, 0xf6, + 0xbc, 0xb4, 0xdf, 0xdf, 0xb4, 0xe2, 0xf4, 0xf4, + 0xdf, 0xc6, 0xe4, 0x7, 0xbc, 0xf6, 0xdf, 0xdf, + 0x85, 0xb4, 0xbb, 0xf8, 0xdf, 0xbf, 0xbf, 0xe4, + 0x86, 0x86, 0xbd, 0x84, 0xbc, 0x57, 0x71, 0x4b, + 0x99, 0xb2, 0x70, 0xe1, 0x71, 0x54, 0xed, 0xfa, + 0x36, 0xe4, 0x8d, 0xf8, 0xc4, 0xc0, 0xbf, 0xb4, + 0xf3, 0x9c, 0x85, 0x9, 0xb9, 0x1e, 0xbd, 0x86, + 0x69, 0xc4, 0xf3, 0xdd, 0xf5, 0x32, 0xce, 0x9, + 0xd8, 0xd8, 0x70, 0xbd, 0x28, 0xb2, 0xb4, 0x9, + 0xb1, 0xf3, 0xb4, 0xdd, 0x32, 0x70, 0xde, 0xde, + 0xc8, 0x53, 0x90, 0x26, 0xc4, 0x81, 0xb4, 0xc0, + 0x69, 0xbf, 0xaf, 0xf3, 0x6, 0x0, 0x81, 0x2e, + 0x9d, 0x18, 0x3d, 0xc4, 0x32, 0x9, 0xb4, 0xa8, + 0x0, 0x70, 0xb2, 0xf3, 0x4, 0xcf, 0x2e, 0x26, + 0x0, 0xa8, 0xbf, 0xf3, 0x6, 0x12, 0x2e, 0xfe, + 0xfe, 0x2e, 0xbf, 0x6, 0xf3, 0xb4, 0xbf, 0x12, + 0x97, 0x6, 0x94, 0x97, 0xbf, 0xe2, 0x95, 0x69, + 0xbb, 0x6, 0x0, 0xf3, 0xe2, 0x20, 0xe2, 0x12, + 0xbb, 0xf4, 0x12, 0x4, 0x2f, 0x0, 0xe0, 0x69, + 0x93, 0x20, 0xf4, 0x93, 0x9a, 0x0, 0x2c, 0x12, + 0xe2, 0x0, 0x6, 0x93, 0xbb, 0x44, 0x52, 0x34, + 0x85, 0x44, 0x44, 0xa8, 0x0, 0xf4, 0x44, 0x44, + 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xd3, + 0x0, 0xbb, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x70, 0x85, 0xb2, 0x2e, 0xbf, 0x8d, 0xf7, 0x70, + 0xce, 0x70, 0xb4, 0x12, 0xb2, 0x8d, 0xf3, 0x26, + 0xb2, 0x9, 0xff, 0x26, 0x7b, 0xe4, 0x2e, 0x7b, + 0x2e, 0xb9, 0xce, 0xb9, 0x84, 0x8d, 0xdd, 0x28, + 0xb2, 0xe4, 0xaf, 0x32, 0xc0, 0x8d, 0xdd, 0x32, + 0xde, 0x2e, 0xde, 0x9d, 0x53, 0x90, 0x69, 0xf5, + 0xc6, 0xb4, 0xc0, 0x93, 0xbf, 0xaf, 0x12, 0xf3, + 0xe1, 0x81, 0xbd, 0x9d, 0x51, 0xf6, 0x9c, 0x93, + 0xb4, 0xdd, 0x9, 0x93, 0xb4, 0xf3, 0x93, 0x93, + 0xe1, 0xd8, 0x4, 0x28, 0x8b, 0x6b, 0x25, 0xe0, + 0x26, 0xde, 0xbd, 0xfd, 0xc8, 0xc4, 0xbd, 0xb1, + 0x9c, 0x7b, 0xce, 0x12, 0xb1, 0x97, 0xdf, 0xe4, + 0xfd, 0xfd, 0xc0, 0xf5, 0xe5, 0x6c, 0x32, 0x97, + 0x4, 0x9c, 0xbd, 0x8e, 0x6c, 0x3, 0x83, 0x9c, + 0xef, 0x1e, 0xe4, 0xc0, 0x6f, 0xf5, 0xe4, 0x93, + 0x4, 0xbd, 0x86, 0x36, 0x4, 0xd8, 0xd8, 0x47, + 0x7c, 0xc8, 0xb2, 0x32, 0x4, 0xf5, 0xc4, 0x97, + 0x97, 0xc0, 0xc6, 0xf5, 0x6, 0x0, 0x9f, 0x6f, + 0x39, 0x40, 0x70, 0x4, 0xf3, 0xf7, 0x70, 0x6, + 0x0, 0x9a, 0x85, 0xce, 0xe1, 0x86, 0xce, 0xf4, + 0x0, 0x6, 0xf4, 0xbf, 0x6, 0xe2, 0xf4, 0x18, + 0x0, 0xa8, 0xe2, 0x6, 0xe2, 0xf4, 0xe2, 0xf4, + 0xe2, 0xd3, 0x94, 0xf4, 0xe2, 0xf4, 0x9a, 0xe2, + 0xe2, 0xd3, 0x0, 0xbb, 0xe2, 0x44, 0xbb, 0xe2, + 0xe2, 0xe2, 0xf4, 0xf4, 0x6, 0x0, 0x9a, 0xf4, + 0xe2, 0xe2, 0xf4, 0xe2, 0x44, 0x0, 0x94, 0xe2, + 0xe2, 0x0, 0xd3, 0x3e, 0xd3, 0x1a, 0x52, 0x57, + 0x44, 0x44, 0xe2, 0xd3, 0x0, 0x44, 0x44, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x94, + 0x0, 0x5e, 0x6, 0x94, 0xd3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb2, 0xbb, 0xbd, 0xff, 0xff, 0x9a, 0x9, 0x4, + 0xbd, 0x86, 0xdd, 0x26, 0xb9, 0x9, 0xc4, 0xe5, + 0xe0, 0x26, 0x26, 0xe0, 0x6f, 0xb9, 0x8e, 0xe0, + 0x9b, 0x4b, 0xc4, 0x15, 0xc4, 0x8d, 0xc0, 0x9c, + 0xf5, 0xe4, 0x93, 0x4, 0x2e, 0xdf, 0xfd, 0x4, + 0xd8, 0xd8, 0x47, 0x7c, 0x3d, 0x81, 0x32, 0x4, + 0x9c, 0xf5, 0x97, 0x97, 0xc0, 0x86, 0x86, 0x32, + 0x9f, 0x9f, 0x6f, 0x7d, 0x8b, 0xde, 0x4, 0x69, + 0x81, 0xdf, 0x4, 0xb1, 0xbd, 0xd8, 0x9c, 0x26, + 0xd8, 0x1e, 0x4, 0x4, 0x7d, 0xd7, 0xca, 0x9c, + 0xe0, 0xb1, 0x9c, 0x99, 0x4, 0x2e, 0xbd, 0xb1, + 0x99, 0xdf, 0xce, 0x8d, 0xd8, 0xc8, 0x39, 0x32, + 0x9c, 0xc0, 0xe4, 0x86, 0x6f, 0x32, 0xf3, 0xf3, + 0x6f, 0x6b, 0xf5, 0xbd, 0x9d, 0xa9, 0x39, 0x99, + 0xf5, 0xf3, 0x8d, 0x81, 0x99, 0xdf, 0x2e, 0xf3, + 0xb9, 0xd8, 0x1e, 0x9c, 0x36, 0x40, 0xf6, 0xca, + 0x9c, 0xb1, 0xbf, 0xc0, 0x32, 0x99, 0xdf, 0x69, + 0x69, 0x9a, 0xc6, 0x9c, 0x6, 0x0, 0xe4, 0x12, + 0x99, 0xf5, 0xcd, 0xf3, 0x9, 0x71, 0x81, 0x8c, + 0x0, 0xb4, 0x8d, 0xbf, 0xfa, 0xb2, 0xbb, 0xbf, + 0x0, 0x1, 0x4b, 0x81, 0x6, 0xf4, 0x8d, 0xbf, + 0x24, 0x0, 0x18, 0xd3, 0xf4, 0xb4, 0xaf, 0xbf, + 0xe2, 0x6, 0x6, 0xbb, 0xbf, 0xf4, 0xf4, 0xe2, + 0xbf, 0x6, 0x0, 0xe2, 0xbb, 0xe2, 0xf4, 0x9, + 0xe2, 0xf4, 0x9a, 0x9a, 0x1, 0x0, 0xf4, 0xf4, + 0xf4, 0x44, 0xf4, 0xf4, 0x44, 0x0, 0xa1, 0xf4, + 0xe2, 0x0, 0x94, 0xe1, 0x34, 0xe6, 0xe2, 0xe2, + 0x44, 0x44, 0xe2, 0x49, 0x0, 0x44, 0x44, 0xe2, + 0xe2, 0x12, 0xf4, 0x34, 0x64, 0x12, 0x2e, 0x94, + 0x0, 0xbb, 0xe2, 0xe2, 0xe2, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x9, 0x8d, 0x12, 0xed, 0xed, 0xe4, 0xb4, 0x84, + 0xc8, 0x6a, 0x32, 0x9c, 0x9, 0xce, 0xdf, 0x6f, + 0x26, 0xde, 0x26, 0x54, 0x6b, 0xf5, 0xff, 0x9d, + 0x18, 0x6b, 0x99, 0x7b, 0x9, 0xbf, 0xb2, 0x99, + 0x86, 0xe4, 0xc0, 0xde, 0x71, 0x1e, 0xf5, 0xfd, + 0x90, 0xf6, 0x99, 0x6f, 0x2e, 0x9, 0x9, 0x26, + 0x99, 0xf9, 0xdd, 0x9, 0xe1, 0x81, 0xf5, 0xdd, + 0xbf, 0x2e, 0xbd, 0x99, 0xf5, 0xe4, 0x9, 0x9, + 0xc6, 0xf5, 0xf3, 0xf3, 0x84, 0xd8, 0x9c, 0xdf, + 0xb4, 0x8d, 0xdd, 0xf5, 0x54, 0x99, 0x9c, 0xb9, + 0xb2, 0x84, 0x75, 0x86, 0xce, 0x85, 0x8d, 0xe4, + 0x71, 0xc8, 0x85, 0xbb, 0x85, 0xb2, 0x8d, 0xe4, + 0xbf, 0xbf, 0xb4, 0xb4, 0xdf, 0x81, 0xe4, 0x8d, + 0xd8, 0xe1, 0xe4, 0xbf, 0x84, 0x8d, 0xbf, 0xc6, + 0xbf, 0xce, 0xbf, 0x9, 0xe1, 0x9a, 0x70, 0xf4, + 0x84, 0x71, 0x81, 0xb4, 0x69, 0x8d, 0x9, 0xe4, + 0xbd, 0xc6, 0x9a, 0xb4, 0x85, 0x75, 0x57, 0xb4, + 0xbf, 0xf4, 0xb4, 0xe2, 0x6, 0x0, 0xbf, 0xbf, + 0x9, 0xe4, 0x7, 0xe1, 0x95, 0x70, 0xb2, 0x3e, + 0x0, 0x27, 0xe4, 0xc0, 0x69, 0xf3, 0xb4, 0x43, + 0x0, 0x3e, 0x9a, 0xc0, 0x6, 0xbb, 0xbf, 0x12, + 0x26, 0x34, 0x34, 0xfe, 0xf3, 0x95, 0xf4, 0xf3, + 0xbf, 0x94, 0xd3, 0x97, 0xbf, 0xe2, 0xaf, 0x93, + 0xbf, 0x94, 0x0, 0x93, 0xbf, 0xe2, 0xbb, 0x97, + 0x95, 0xe2, 0x93, 0x97, 0x77, 0x0, 0x15, 0x93, + 0x12, 0xf4, 0x12, 0x93, 0xa9, 0x0, 0x51, 0x12, + 0xe2, 0x0, 0xd3, 0xf3, 0xa5, 0x0, 0x14, 0xf3, + 0xe2, 0x44, 0xc0, 0x2a, 0x0, 0x74, 0xe2, 0xf4, + 0xe2, 0xf4, 0xe2, 0x0, 0xd3, 0x12, 0x44, 0xd3, + 0x0, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbb, 0xf4, 0xbf, 0x84, 0x75, 0x85, 0xf4, 0x9a, + 0xb2, 0xb4, 0x85, 0x9, 0x8d, 0x85, 0x70, 0x90, + 0xf5, 0x71, 0xce, 0x9b, 0x71, 0x70, 0x9, 0x85, + 0xce, 0xbb, 0xc6, 0xbf, 0x85, 0x8d, 0xbf, 0xce, + 0x9a, 0xb4, 0xf4, 0x9a, 0x70, 0xf7, 0xbf, 0x12, + 0x8d, 0xbf, 0xce, 0x9, 0xc6, 0x84, 0x70, 0x85, + 0x75, 0x57, 0x70, 0x8d, 0x8d, 0x85, 0xf4, 0xe4, + 0xb0, 0xe4, 0xe4, 0x70, 0x2e, 0x7, 0xb2, 0x8d, + 0x85, 0xe1, 0xb4, 0xb4, 0xb4, 0xb4, 0x70, 0x84, + 0xce, 0x75, 0xfa, 0xfa, 0x57, 0x74, 0x74, 0x74, + 0xdf, 0xfa, 0x70, 0xb1, 0x84, 0x36, 0xc6, 0xb2, + 0x9, 0x70, 0x70, 0xfa, 0xfa, 0x9, 0xbf, 0xbf, + 0xde, 0x54, 0x85, 0xb4, 0xfd, 0x18, 0x6a, 0xdf, + 0x32, 0x9, 0xce, 0xfa, 0xed, 0xc4, 0xe4, 0x69, + 0xe0, 0x90, 0x74, 0xdd, 0x32, 0x70, 0x70, 0xfc, + 0x26, 0x2e, 0x70, 0x32, 0x54, 0x6a, 0xc8, 0x4, + 0x54, 0x3, 0x5c, 0x6b, 0x69, 0x85, 0xce, 0xdf, + 0x99, 0x85, 0xbf, 0xf3, 0x6, 0x0, 0x90, 0xfd, + 0x97, 0xde, 0x40, 0x6a, 0x9c, 0x9, 0x9, 0x26, + 0x34, 0x1, 0x81, 0x4, 0x97, 0x69, 0xfa, 0x1, + 0x34, 0xb9, 0xf4, 0x12, 0x6, 0x81, 0xaf, 0x93, + 0x93, 0x43, 0x0, 0x0, 0x93, 0xbb, 0xb4, 0x93, + 0x12, 0x1a, 0x6, 0x93, 0x12, 0xbf, 0xbf, 0x97, + 0xbb, 0xd3, 0x0, 0x32, 0x97, 0xe2, 0xe2, 0x97, + 0xf4, 0xe2, 0x93, 0x93, 0x26, 0x34, 0x67, 0xe0, + 0xf4, 0xe2, 0xf4, 0x12, 0x49, 0x34, 0x8d, 0xe2, + 0xe2, 0x0, 0x6, 0xf3, 0xe2, 0xd3, 0x0, 0x3d, + 0xe2, 0x44, 0x44, 0xb1, 0x34, 0x1, 0xbb, 0xbb, + 0x44, 0x44, 0x44, 0x0, 0x94, 0x44, 0x44, 0x94, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x7, 0xcd, 0x70, 0x12, 0xe4, 0x8d, 0xf8, 0xdf, + 0xaf, 0xbf, 0xbf, 0xce, 0x8b, 0x71, 0x70, 0x9b, + 0x2a, 0x31, 0xfc, 0xb1, 0x69, 0xb0, 0xfa, 0x54, + 0x81, 0x85, 0x93, 0x4, 0x83, 0xf6, 0xf3, 0x93, + 0xce, 0x2e, 0xdf, 0x32, 0xbd, 0xb0, 0x32, 0x54, + 0x83, 0xd8, 0x4, 0x6f, 0x3d, 0x4f, 0x47, 0x97, + 0xbd, 0x70, 0x1e, 0x6a, 0x70, 0x85, 0xb1, 0x26, + 0x90, 0x90, 0xfd, 0x97, 0xde, 0x90, 0x39, 0x9c, + 0xce, 0x9, 0x26, 0x6f, 0x99, 0xf5, 0x8e, 0xff, + 0x28, 0x40, 0x27, 0xe5, 0x9b, 0x27, 0x15, 0x8f, + 0x6b, 0x6f, 0xb9, 0xb9, 0xf5, 0x9c, 0x9c, 0xc4, + 0x32, 0x32, 0x9, 0xed, 0x7b, 0x69, 0xce, 0x9, + 0x26, 0x25, 0x9f, 0x2e, 0x8e, 0x1e, 0x6a, 0x7b, + 0xf5, 0xf3, 0xe2, 0xf3, 0x6f, 0xfd, 0x81, 0x8e, + 0xe0, 0x6b, 0x54, 0x32, 0xe0, 0xbd, 0xbf, 0xf5, + 0x6f, 0x32, 0x69, 0x4, 0x54, 0xef, 0xa9, 0x3a, + 0x6c, 0x15, 0x6a, 0x54, 0x4, 0x9, 0x85, 0x4, + 0x9c, 0x9, 0xce, 0x93, 0x6, 0x0, 0x8b, 0x3, + 0x8e, 0xbd, 0xb2, 0x7b, 0xb1, 0xf7, 0x9, 0x69, + 0x27, 0x34, 0x4e, 0x81, 0xc0, 0xe4, 0x2a, 0x34, + 0x8b, 0xbf, 0xbf, 0xf4, 0x6, 0xbf, 0xc6, 0xb4, + 0x44, 0x44, 0x49, 0x0, 0xf4, 0xe2, 0xe2, 0xf4, + 0xf4, 0xd3, 0x94, 0xe2, 0xe2, 0xe2, 0xe2, 0xbf, + 0xe2, 0x94, 0x0, 0xf4, 0xe2, 0xbf, 0xe2, 0xe2, + 0xe2, 0xf4, 0xf4, 0xf4, 0xf4, 0x74, 0x34, 0x7a, + 0xe2, 0x44, 0xe2, 0x51, 0x34, 0x75, 0x44, 0x44, + 0x44, 0x0, 0xd3, 0x44, 0x44, 0xf4, 0x34, 0x1a, + 0x44, 0x44, 0x44, 0x44, 0x9f, 0x34, 0x51, 0x44, + 0x44, 0x44, 0x7, 0x0, 0xd3, 0x44, 0x44, 0xd3, + 0x0, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xb2, 0xf7, 0x70, 0xf3, 0x69, 0x95, 0xfa, 0x9c, + 0x93, 0xb4, 0xc0, 0x26, 0x27, 0x18, 0x8e, 0x28, + 0xef, 0x31, 0x54, 0xe5, 0xde, 0xbb, 0xce, 0x6f, + 0x36, 0x81, 0xb1, 0x4, 0x6f, 0x90, 0x93, 0x32, + 0x69, 0xce, 0xc4, 0x9c, 0x32, 0x2e, 0x26, 0x7b, + 0x47, 0x74, 0x9b, 0x4, 0x36, 0x54, 0x28, 0x4, + 0xde, 0x70, 0x7b, 0x54, 0xb9, 0x84, 0x26, 0x32, + 0xbd, 0x1e, 0x9b, 0x26, 0xbd, 0xff, 0x7b, 0x32, + 0xce, 0xb9, 0x32, 0x26, 0x1e, 0xb9, 0x3, 0x26, + 0xb9, 0x3, 0x47, 0x28, 0xe0, 0xd7, 0x28, 0x3d, + 0x6b, 0x28, 0x81, 0xde, 0x26, 0xb1, 0x32, 0xde, + 0xb1, 0x32, 0xce, 0xb4, 0x2e, 0x36, 0x84, 0x70, + 0x2e, 0x69, 0xce, 0x9, 0x9, 0xf3, 0xe4, 0xe4, + 0xdd, 0x69, 0x85, 0xe4, 0xdd, 0xf5, 0x74, 0xbd, + 0x32, 0x69, 0x9, 0xb0, 0x69, 0xe4, 0xbf, 0xbd, + 0x2e, 0x70, 0xbc, 0xfd, 0xde, 0x36, 0x74, 0x6a, + 0x54, 0x26, 0x2e, 0x69, 0xdd, 0xb4, 0xb4, 0xfa, + 0x69, 0x2e, 0x84, 0xc6, 0x6, 0x34, 0x2e, 0xdd, + 0xbd, 0xe4, 0xb4, 0xf3, 0x8d, 0xbf, 0x84, 0x7, + 0xb4, 0x15, 0x6, 0xab, 0xa3, 0x52, 0x6, 0x3d, + 0xce, 0xb4, 0xe2, 0xf4, 0x1, 0xe2, 0xf4, 0xbf, + 0xbf, 0xbf, 0x8d, 0x1a, 0xbf, 0xf4, 0xf4, 0xf4, + 0xbf, 0xd3, 0xd3, 0xbf, 0xf4, 0xe2, 0xf4, 0xf4, + 0xf4, 0xd3, 0x34, 0xe2, 0xbf, 0x44, 0xbb, 0xe2, + 0xf4, 0xf4, 0x12, 0xfd, 0x32, 0xf4, 0xc8, 0xd3, + 0x1, 0x72, 0x64, 0xd3, 0x75, 0x44, 0xe2, 0xe2, + 0xe2, 0x0, 0x52, 0xe2, 0xe2, 0xe2, 0x18, 0x0, + 0xd6, 0x44, 0x44, 0x44, 0x44, 0x57, 0xab, 0xd3, + 0xd6, 0x49, 0x94, 0x0, 0xd3, 0x44, 0x44, 0x51, + 0x34, 0x1a, 0xd3, 0xd3, 0xab, 0xa8, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x95, 0x95, 0xee, 0x12, 0x69, 0xbf, 0xbb, 0x9, + 0xd8, 0x7, 0xe4, 0xdd, 0xde, 0xde, 0xb2, 0xfd, + 0x47, 0x3d, 0x70, 0x2e, 0x26, 0xe1, 0x8d, 0xdd, + 0x70, 0x75, 0xe4, 0xbd, 0xdd, 0xe4, 0xb4, 0x9, + 0x70, 0x9a, 0x9, 0xbf, 0x2e, 0x7, 0xe4, 0x69, + 0xde, 0x71, 0xf5, 0xc4, 0xde, 0x70, 0xde, 0x2e, + 0x70, 0x75, 0x36, 0x2e, 0x70, 0x71, 0x81, 0xce, + 0x8d, 0xb0, 0xce, 0xde, 0xe1, 0xe1, 0xbd, 0xb2, + 0x85, 0x81, 0x84, 0x70, 0x70, 0xcd, 0x54, 0xed, + 0x70, 0x71, 0xfd, 0x36, 0x40, 0x1e, 0x36, 0x81, + 0x71, 0x81, 0x54, 0x81, 0x85, 0xde, 0x70, 0xc6, + 0x86, 0x1e, 0xe1, 0xb0, 0xb2, 0x1e, 0xfa, 0x85, + 0x85, 0x8d, 0x70, 0xb0, 0x81, 0xbb, 0x85, 0xbb, + 0x70, 0x86, 0x70, 0x8d, 0x9a, 0x8d, 0xdd, 0xfa, + 0xb4, 0xee, 0x70, 0x70, 0x4b, 0xc6, 0x57, 0xe1, + 0x70, 0xb2, 0x90, 0x86, 0xce, 0xe4, 0x81, 0x40, + 0x39, 0xe1, 0xe4, 0x57, 0xfa, 0x83, 0x18, 0x57, + 0x70, 0xb4, 0xce, 0x4b, 0x9, 0xb4, 0xf4, 0xe1, + 0x90, 0x81, 0x70, 0x57, 0x85, 0xfa, 0xc6, 0xf9, + 0xc4, 0x12, 0x8d, 0xe0, 0x27, 0x99, 0xe4, 0xf3, + 0x12, 0xbf, 0xf4, 0xb2, 0x12, 0xbb, 0xf4, 0xf5, + 0x93, 0xbf, 0xbb, 0xbf, 0xc0, 0xbb, 0x95, 0x12, + 0xbf, 0xe2, 0xe2, 0xbb, 0xbb, 0xe2, 0x95, 0xe2, + 0x12, 0xe2, 0xbf, 0x93, 0xbb, 0xf4, 0xe2, 0x26, + 0x8d, 0x20, 0x93, 0x97, 0xbb, 0x93, 0x93, 0x93, + 0x26, 0x9f, 0x9a, 0xc0, 0xe2, 0xe2, 0xe2, 0xbd, + 0xe2, 0x44, 0x44, 0x12, 0x12, 0xbb, 0x12, 0xbb, + 0xe2, 0x44, 0x44, 0xbf, 0x44, 0x44, 0x44, 0x8d, + 0x9f, 0x9a, 0xe2, 0x0, 0x94, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf4, 0x8d, 0xbb, 0xf8, 0x75, 0x9a, 0xbb, 0xbb, + 0xf8, 0x4b, 0xce, 0x70, 0x9a, 0x75, 0x71, 0x90, + 0x71, 0x71, 0xe4, 0xb2, 0x90, 0x81, 0xbf, 0x8d, + 0x8d, 0xf8, 0x86, 0x85, 0x8d, 0x57, 0x2e, 0x4b, + 0xfa, 0xe1, 0x8d, 0xe4, 0xe4, 0xdf, 0x70, 0xb4, + 0x8d, 0x7, 0xf6, 0x54, 0xe1, 0x84, 0x71, 0xfa, + 0x6b, 0x75, 0x71, 0x70, 0x85, 0xc6, 0xf9, 0xbd, + 0xb0, 0x8d, 0xd8, 0x4b, 0xc6, 0x84, 0x71, 0xe1, + 0xc6, 0x86, 0x81, 0xe4, 0x8d, 0x70, 0x81, 0x86, + 0x71, 0x71, 0x71, 0x1e, 0x54, 0x1e, 0x1e, 0x71, + 0xfd, 0x70, 0x81, 0x81, 0x71, 0x84, 0x71, 0xe1, + 0x75, 0x71, 0x85, 0xb4, 0xe4, 0x2e, 0xff, 0x9, + 0x9, 0x9, 0xce, 0xc6, 0x81, 0x2e, 0x9a, 0xe1, + 0xdd, 0xe4, 0x9, 0xbf, 0xaf, 0xe4, 0xf7, 0xc4, + 0xbd, 0x9, 0x7, 0x57, 0x1e, 0xbd, 0xc6, 0x2e, + 0x32, 0x70, 0x2e, 0x32, 0xbd, 0xde, 0x71, 0x43, + 0x6a, 0x2e, 0x70, 0x15, 0x28, 0xf5, 0xbd, 0xf5, + 0x69, 0xf3, 0xe2, 0x93, 0xf3, 0xb4, 0xe4, 0x3, + 0x6b, 0x93, 0xff, 0x15, 0x4, 0xf3, 0xf3, 0x32, + 0x8e, 0xe4, 0x9, 0xfd, 0x47, 0x6f, 0x81, 0xfd, + 0x97, 0xbf, 0xbf, 0x93, 0x93, 0x95, 0xbf, 0x93, + 0x97, 0xbf, 0xbf, 0xbf, 0x93, 0xb4, 0xe4, 0xbb, + 0xbf, 0xbf, 0xf4, 0x97, 0xbb, 0xe2, 0xbf, 0xbf, + 0xbf, 0xf4, 0xf4, 0x93, 0x95, 0xe2, 0xbf, 0x93, + 0x93, 0xe2, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0xf3, 0xe2, 0xe2, 0x12, 0xe2, 0xe2, 0x44, 0xf3, + 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0xe2, 0xbf, 0xbb, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x0, 0xd3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbf, 0x7, 0xbf, 0xf8, 0xf8, 0x9, 0xee, 0xaf, + 0x93, 0xf5, 0xbd, 0x26, 0xb9, 0x71, 0xfa, 0x9c, + 0xb1, 0x85, 0xde, 0x69, 0x97, 0xde, 0x2e, 0x97, + 0xb9, 0x75, 0x36, 0x69, 0xdd, 0xc6, 0xe1, 0xb1, + 0x69, 0xce, 0x9, 0x69, 0x69, 0xe1, 0x2e, 0xb1, + 0x9, 0xd8, 0x40, 0x7b, 0xdd, 0x70, 0xb9, 0x26, + 0x8e, 0x70, 0xff, 0x26, 0xde, 0x8d, 0xd8, 0x36, + 0x70, 0x71, 0x47, 0x1e, 0xce, 0x70, 0x8e, 0xb1, + 0x9, 0xbd, 0xfd, 0xb1, 0xff, 0x84, 0x36, 0x1e, + 0x70, 0xb2, 0xfd, 0x28, 0x8e, 0x36, 0xf5, 0x36, + 0x36, 0x28, 0x1e, 0x36, 0x36, 0x36, 0x84, 0xce, + 0xc4, 0x26, 0xff, 0xde, 0xb1, 0x8e, 0x8e, 0x81, + 0x6f, 0x36, 0x71, 0x81, 0xff, 0x26, 0x70, 0xaf, + 0xb1, 0xb1, 0x70, 0xdd, 0xdd, 0x69, 0x70, 0xf6, + 0xe0, 0xb9, 0x70, 0x1e, 0xb1, 0x32, 0x70, 0xf3, + 0x32, 0xf3, 0xce, 0xb2, 0x9b, 0x54, 0x57, 0x51, + 0x3, 0x32, 0xfa, 0x32, 0x97, 0x9, 0xbd, 0x26, + 0x93, 0xf3, 0xaf, 0x8e, 0xb1, 0xf3, 0x81, 0x3, + 0x28, 0xb1, 0xc4, 0x7b, 0x32, 0x12, 0xbb, 0x9, + 0x36, 0xb4, 0x9a, 0xf6, 0x84, 0xbf, 0xf4, 0xbf, + 0xbf, 0x95, 0xf4, 0xe2, 0xaf, 0xe2, 0xe2, 0x95, + 0xb4, 0xe2, 0xf4, 0xb4, 0xe2, 0xf4, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x0, 0xd3, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbb, 0x9a, 0x20, 0x95, 0x12, 0x8d, 0x12, 0x97, + 0x69, 0x2e, 0x2e, 0x54, 0x7b, 0x1e, 0xde, 0x26, + 0xb1, 0xb2, 0xbd, 0xb1, 0x97, 0x71, 0xd8, 0x7b, + 0x26, 0xb2, 0x86, 0x32, 0x7b, 0x9, 0xde, 0x69, + 0x69, 0x8d, 0x70, 0xb1, 0x69, 0x71, 0xc8, 0xf5, + 0xf5, 0xe1, 0x71, 0x26, 0x69, 0xc6, 0x26, 0xb1, + 0xbd, 0xb2, 0xb9, 0x28, 0x8e, 0x70, 0x36, 0x26, + 0xff, 0x70, 0xfd, 0x26, 0xce, 0xff, 0x7b, 0x26, + 0x9, 0xce, 0xfd, 0x47, 0xfa, 0xb9, 0xfd, 0x1e, + 0xf5, 0xf5, 0xff, 0x70, 0xdd, 0x28, 0xfd, 0x1e, + 0xf5, 0x9b, 0x15, 0xf5, 0x8e, 0x6f, 0xff, 0xe4, + 0xff, 0x7b, 0xff, 0xde, 0x8e, 0x28, 0x28, 0x15, + 0x47, 0x6f, 0x36, 0xb2, 0xb1, 0xb1, 0x70, 0xf8, + 0x93, 0xb1, 0x9, 0xc6, 0xf8, 0xff, 0x85, 0x71, + 0xde, 0x81, 0xc4, 0x70, 0xce, 0x9, 0xe4, 0xf5, + 0xc4, 0xbf, 0x85, 0xbc, 0x25, 0x83, 0x81, 0xf5, + 0x81, 0x85, 0x54, 0xf5, 0x9, 0x9, 0xbf, 0x81, + 0x8b, 0xe2, 0x85, 0x85, 0x81, 0xdf, 0xdf, 0xf3, + 0x3e, 0x72, 0xf8, 0xdf, 0x99, 0xb2, 0xce, 0x9a, + 0x75, 0xb2, 0xfa, 0xc6, 0xbf, 0xe2, 0xf4, 0xe2, + 0xfc, 0xe2, 0x44, 0xbf, 0xe4, 0xbf, 0xfc, 0xb4, + 0xb4, 0x95, 0xe2, 0x4b, 0xb4, 0xf4, 0xe2, 0xe2, + 0xbf, 0xf4, 0xbf, 0xf4, 0xf4, 0xf4, 0xf4, 0xbf, + 0xf4, 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, + 0xf4, 0x9a, 0x12, 0x12, 0xcd, 0xf4, 0xf4, 0x12, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x0, 0xd3, 0x44, 0x44, 0x44, + 0xf4, 0xe6, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xcd, 0xf7, 0xbf, 0x20, 0x95, 0xf7, 0xfa, 0xf5, + 0xf3, 0x81, 0x81, 0x9c, 0x6a, 0xc6, 0xb0, 0xb1, + 0x2e, 0xf6, 0xf6, 0xb9, 0xde, 0x81, 0xf6, 0x99, + 0xbd, 0x85, 0x2e, 0xdd, 0xed, 0x86, 0x85, 0xce, + 0x70, 0x70, 0x15, 0x2e, 0x2e, 0xb0, 0xb2, 0x54, + 0x86, 0x70, 0xce, 0xb2, 0x70, 0x86, 0x1e, 0x81, + 0xe4, 0xe1, 0x3d, 0x83, 0x2e, 0x2e, 0xb0, 0xb2, + 0xc6, 0xf8, 0xce, 0xdd, 0xb4, 0x70, 0x28, 0x81, + 0x8d, 0xe4, 0x84, 0x81, 0xb2, 0xdd, 0x9, 0x70, + 0x2e, 0x70, 0xbd, 0x85, 0x70, 0xce, 0x81, 0xf6, + 0x36, 0x8e, 0xbd, 0x85, 0x70, 0xde, 0xce, 0xb0, + 0x2e, 0x2e, 0xb2, 0x71, 0x84, 0xde, 0x70, 0x71, + 0x1e, 0x7b, 0xdd, 0x8d, 0x9, 0xdd, 0xb0, 0x85, + 0xb2, 0xbb, 0x8d, 0xb0, 0xc6, 0xb0, 0xbb, 0xb4, + 0x95, 0xe4, 0xb4, 0xb0, 0xbf, 0xbf, 0xbf, 0xe1, + 0x70, 0x2e, 0xf4, 0x9a, 0xe4, 0x70, 0xb4, 0x85, + 0xce, 0xbf, 0xbf, 0xe1, 0x57, 0xb4, 0xf4, 0xc6, + 0xf5, 0xaf, 0xbf, 0xe4, 0xf3, 0xbf, 0xbf, 0xce, + 0xa, 0x3d, 0x8d, 0x36, 0x1a, 0xa3, 0xe4, 0xce, + 0xb1, 0xb2, 0xb2, 0xc4, 0x93, 0xbf, 0xbf, 0x12, + 0x97, 0xe4, 0xaf, 0x97, 0x97, 0xc6, 0xc0, 0x97, + 0x4, 0xbf, 0xf4, 0x97, 0xbf, 0x44, 0xe2, 0xbb, + 0xe1, 0xf4, 0x95, 0x93, 0x12, 0x94, 0x9f, 0x93, + 0xbb, 0xe2, 0x44, 0x93, 0xbf, 0xe2, 0xe2, 0x93, + 0xbd, 0x20, 0x93, 0x93, 0x93, 0xf4, 0x12, 0x93, + 0x12, 0xf4, 0x64, 0x7a, 0xe2, 0xe2, 0xe2, 0x12, + 0xe2, 0x44, 0xbb, 0x95, 0xe2, 0x44, 0xbf, 0xe2, + 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x94, 0x7, + 0x44, 0x44, 0x44, 0x9f, 0x9a, 0x44, 0x44, 0x44, + 0x44, 0x52, 0x51, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe2, 0xb4, 0xb0, 0xbb, 0x8d, 0x8d, 0xb2, 0x8d, + 0xe4, 0xbb, 0x8d, 0xe4, 0x70, 0xe4, 0x9a, 0x8d, + 0x70, 0x71, 0xd8, 0xb2, 0x70, 0x8d, 0x8d, 0xce, + 0xce, 0xb4, 0x85, 0xb2, 0x9, 0xb2, 0x75, 0x81, + 0x8d, 0x8d, 0x85, 0x2e, 0xe4, 0x8d, 0x8d, 0x9, + 0xce, 0xb4, 0x84, 0x85, 0xb0, 0x85, 0x7, 0x71, + 0xe1, 0xb4, 0x70, 0xb2, 0xdd, 0xe4, 0x9, 0x9, + 0x70, 0xe4, 0x71, 0xe1, 0x70, 0xb0, 0xb2, 0x71, + 0x85, 0x8d, 0xbb, 0xce, 0x8d, 0xf8, 0x8d, 0x85, + 0xbf, 0xe4, 0xfa, 0x71, 0x9a, 0xe1, 0x8d, 0xce, + 0x86, 0x70, 0xbf, 0xe1, 0x85, 0x4b, 0xfa, 0x57, + 0x84, 0x70, 0x85, 0x86, 0xc6, 0xe4, 0xb4, 0xb4, + 0xfa, 0x54, 0xb4, 0x8d, 0xd8, 0xf7, 0xfa, 0x9f, + 0x84, 0xb2, 0xe4, 0xe4, 0xff, 0x9, 0x9, 0xf7, + 0x85, 0xff, 0x70, 0xc6, 0xc8, 0xc6, 0xbf, 0x70, + 0xb1, 0x70, 0xfa, 0xdd, 0x32, 0xbd, 0xe4, 0x1e, + 0xc8, 0xb1, 0x8d, 0x9, 0x83, 0x54, 0xdf, 0x97, + 0x4, 0x69, 0xc0, 0x9c, 0x69, 0xf3, 0xbb, 0x3a, + 0xfe, 0x9d, 0xd8, 0xc5, 0xa8, 0xed, 0xf7, 0x93, + 0x69, 0xc0, 0x8d, 0xdd, 0x69, 0xe4, 0xb4, 0xf3, + 0x93, 0xbf, 0xbf, 0x93, 0x93, 0xc0, 0xbf, 0x97, + 0x4, 0xee, 0xbf, 0xbf, 0xc0, 0xbf, 0xe2, 0x95, + 0xe2, 0xbf, 0x44, 0xbf, 0xbb, 0x6, 0x9f, 0xaf, + 0x44, 0xbf, 0xf4, 0xe2, 0xe2, 0x44, 0xf4, 0xf4, + 0xe2, 0xe2, 0x6, 0x67, 0x14, 0x14, 0x1, 0x36, + 0xe2, 0xa9, 0x72, 0x44, 0xe2, 0x44, 0xe2, 0x95, + 0x44, 0x44, 0xe2, 0xd3, 0x49, 0xd6, 0xd6, 0xd6, + 0x9f, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x94, 0x9f, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0xa9, 0xa8, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xee, 0xee, 0x8d, 0xf8, 0x9, 0xbb, 0x8d, 0xaf, + 0xf3, 0xc6, 0x70, 0x32, 0xdd, 0xce, 0x75, 0x1e, + 0xbd, 0xb4, 0xc6, 0xc4, 0xc4, 0xce, 0xb4, 0xb9, + 0x81, 0xb2, 0x3d, 0xfd, 0x9b, 0xfa, 0x81, 0x7b, + 0x69, 0xbf, 0xce, 0xf7, 0xf8, 0x70, 0xbd, 0x8e, + 0xf5, 0x84, 0xb2, 0x36, 0xe4, 0xe4, 0xf7, 0x8e, + 0xff, 0xb2, 0x69, 0x7b, 0x36, 0xb2, 0x28, 0x28, + 0xb9, 0xc6, 0x36, 0x28, 0x85, 0xe4, 0xdd, 0x9c, + 0xf7, 0xb1, 0x9, 0xbd, 0xb2, 0x81, 0xb1, 0xe1, + 0x84, 0x2e, 0xb1, 0xb9, 0x26, 0xdd, 0x70, 0xb2, + 0xc4, 0x32, 0xbd, 0xc8, 0x57, 0x1e, 0xbd, 0xc6, + 0xde, 0x69, 0xb4, 0xbd, 0x32, 0xf3, 0xde, 0x70, + 0x25, 0x54, 0x9, 0xcd, 0x1e, 0x26, 0xc4, 0x9, + 0x7b, 0x26, 0xce, 0x20, 0x93, 0xc0, 0xb4, 0xb2, + 0x3d, 0x7b, 0x12, 0xe4, 0x1e, 0x7b, 0xe4, 0xf3, + 0x69, 0x69, 0xfa, 0x69, 0x28, 0xbd, 0xce, 0x83, + 0x27, 0xd8, 0xce, 0x9, 0x6f, 0xf5, 0xf5, 0x69, + 0x4, 0x69, 0xf3, 0x99, 0xff, 0xd8, 0x26, 0x60, + 0x8c, 0x83, 0x9, 0x14, 0x14, 0xf8, 0xb2, 0xf8, + 0xb2, 0x85, 0xe2, 0xbf, 0xb4, 0xdf, 0xbf, 0xe2, + 0x95, 0xe2, 0x95, 0xf9, 0xe2, 0xbb, 0xe2, 0xe2, + 0x4b, 0xbf, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, 0xf4, + 0xe2, 0xe2, 0xe2, 0xe2, 0xbf, 0xd3, 0x74, 0xe2, + 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0xd3, 0x27, 0x95, 0x12, 0x74, 0xd3, + 0x44, 0xa3, 0xd6, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x94, 0x9f, 0xbb, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xd3, 0x9f, + 0x9a, 0xa8, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x9a, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x20, 0xe2, 0xbf, 0xb2, 0xfa, 0x12, 0xbb, 0x93, + 0x97, 0x86, 0xf5, 0x47, 0xf3, 0x70, 0xc4, 0xdf, + 0x32, 0xf3, 0xce, 0xff, 0xb1, 0x70, 0xbd, 0xb9, + 0x47, 0x75, 0xc6, 0xfd, 0x7b, 0x86, 0xff, 0x9c, + 0x9, 0xbb, 0x9, 0x7b, 0x8e, 0x81, 0xff, 0xb9, + 0x6f, 0x1e, 0xb1, 0x7b, 0x69, 0xbf, 0xb1, 0x7b, + 0xb1, 0xce, 0x26, 0x28, 0x7b, 0x3d, 0x47, 0x28, + 0xfd, 0xb2, 0x7b, 0xff, 0xde, 0x9, 0x93, 0xb1, + 0xce, 0xf5, 0x69, 0xde, 0xbd, 0xde, 0x26, 0xf5, + 0xce, 0x26, 0xb1, 0xce, 0xce, 0x97, 0x69, 0xce, + 0xf6, 0x4, 0xe1, 0xb2, 0x1e, 0x69, 0x69, 0xe4, + 0xdd, 0x97, 0xf3, 0xe4, 0xde, 0xfd, 0xf5, 0x7, + 0x18, 0x9b, 0x69, 0xf8, 0x69, 0xdd, 0xc0, 0x9, + 0xdd, 0x93, 0xaf, 0xaf, 0xd8, 0xce, 0x95, 0x81, + 0x84, 0xff, 0xbb, 0xce, 0xce, 0x9, 0xaf, 0xbb, + 0xe1, 0x84, 0xe4, 0x8d, 0x3d, 0x71, 0xb4, 0x70, + 0xce, 0x9, 0xb4, 0xe4, 0x69, 0xbf, 0xdd, 0x9, + 0xf3, 0xe4, 0xaf, 0xaf, 0x81, 0x75, 0xbf, 0x14, + 0xc5, 0xb4, 0xb4, 0xa3, 0xc7, 0xb4, 0xbb, 0xe4, + 0x40, 0x74, 0xbb, 0xbf, 0xbf, 0xbf, 0xbf, 0xf4, + 0xbf, 0xf4, 0xbf, 0xbb, 0xe4, 0x9a, 0xf4, 0xaf, + 0xbf, 0xbf, 0xbf, 0x40, 0x27, 0x9f, 0xf4, 0x95, + 0xe2, 0xe2, 0xf4, 0xbf, 0xf4, 0x6, 0x74, 0xbb, + 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xf4, 0xf4, 0x1a, 0xa9, 0x32, 0xf3, 0xc0, 0x0, + 0xe2, 0xd6, 0x72, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x94, 0x9f, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xd3, 0xbc, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x0, 0xf4, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbb, 0x8d, 0xe2, 0xf7, 0x12, 0xee, 0xbb, 0x85, + 0x9, 0xe4, 0xbf, 0xc6, 0xe4, 0xbf, 0xdd, 0x2e, + 0x70, 0xb4, 0xbb, 0xbd, 0x71, 0xe1, 0x85, 0x2e, + 0xbd, 0xbf, 0x9, 0x9, 0xf3, 0x9, 0xe4, 0xdd, + 0x9, 0xe1, 0xe4, 0x69, 0xb2, 0x9f, 0x2e, 0x32, + 0x9, 0xbb, 0x8d, 0xdd, 0x8d, 0xbf, 0x9, 0xbd, + 0x70, 0x84, 0x2e, 0x2e, 0xde, 0x71, 0xf5, 0xc4, + 0xde, 0xe4, 0xf3, 0xdd, 0xcd, 0x70, 0xce, 0x2e, + 0x70, 0xb2, 0xf5, 0xb2, 0xb0, 0x9, 0xce, 0x81, + 0xf8, 0xf3, 0xf3, 0xb4, 0x71, 0x86, 0x81, 0xe1, + 0xe1, 0x9, 0x81, 0x86, 0x85, 0xbf, 0x8d, 0xbf, + 0x86, 0xf5, 0xbf, 0xb4, 0xcf, 0x40, 0x1e, 0xf8, + 0x81, 0x81, 0x8d, 0xfa, 0xf5, 0x9, 0xbb, 0xcd, + 0x71, 0xf6, 0xe2, 0xb4, 0xb2, 0x70, 0xf8, 0xf7, + 0xbf, 0xdd, 0xbb, 0xe4, 0xf7, 0xc6, 0x8d, 0xb2, + 0x71, 0xe1, 0xbf, 0x70, 0x70, 0x86, 0x85, 0x85, + 0xce, 0x84, 0x86, 0x4b, 0xb4, 0x9a, 0x9a, 0xbb, + 0xdf, 0xb4, 0xf4, 0xe4, 0xe4, 0x4b, 0x86, 0x6, + 0x18, 0xe1, 0x2e, 0xa8, 0x66, 0xa3, 0xb2, 0x52, + 0x77, 0xfb, 0x52, 0xde, 0x97, 0x6, 0xa1, 0xa8, + 0xa5, 0xb4, 0xf4, 0x5e, 0x77, 0xc6, 0xe4, 0xc7, + 0x5e, 0xbb, 0x50, 0x8c, 0x27, 0x74, 0xb0, 0xc7, + 0x6, 0x2c, 0x2f, 0x93, 0xe2, 0x6, 0x74, 0x2e, + 0x49, 0xe2, 0xe2, 0xf4, 0x3e, 0xe2, 0x44, 0x93, + 0xe2, 0x44, 0xd3, 0xef, 0x93, 0xf3, 0x77, 0xab, + 0x44, 0xd6, 0xd3, 0x3e, 0xe2, 0xf4, 0x34, 0x40, + 0x44, 0x44, 0xf4, 0xd3, 0x9f, 0x44, 0xe2, 0xe2, + 0x44, 0x44, 0x44, 0x2c, 0xd6, 0xd6, 0xfe, 0x9f, + 0x9f, 0xd3, 0x44, 0xd6, 0xa8, 0xd3, 0xd6, 0x9a, + 0x44, 0x44, 0x1a, 0x9f, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe2, 0xe2, 0x8d, 0x9a, 0x9a, 0xf4, 0xfa, 0xf6, + 0xbf, 0xbf, 0xb4, 0xce, 0xc6, 0x8d, 0xb0, 0xb2, + 0xc6, 0x85, 0x70, 0x8d, 0xb2, 0xf8, 0xb4, 0xe4, + 0x8d, 0xb4, 0xf4, 0x86, 0xf4, 0x9a, 0xf4, 0xce, + 0x4b, 0xc6, 0xf4, 0xe1, 0xf4, 0xbf, 0xf5, 0xb4, + 0xee, 0xb4, 0xbf, 0x86, 0xfa, 0x7, 0xe1, 0xb4, + 0x85, 0x86, 0xb2, 0x70, 0x9, 0xb4, 0x86, 0x54, + 0xb2, 0x70, 0x85, 0xb2, 0xfa, 0x71, 0x71, 0x8d, + 0x85, 0xb4, 0x70, 0xe4, 0xb4, 0xf4, 0xb4, 0xb2, + 0x57, 0x84, 0xb0, 0xbb, 0x85, 0xc6, 0x70, 0x8d, + 0xb4, 0xe2, 0x9, 0xbf, 0x85, 0xbf, 0xbf, 0xbf, + 0xe1, 0xe1, 0xce, 0xbb, 0x85, 0xb4, 0xe4, 0x95, + 0xe4, 0xce, 0xbf, 0xbb, 0x84, 0x75, 0x70, 0xb4, + 0xb2, 0xc4, 0xaf, 0xbf, 0x70, 0xf3, 0xaf, 0x8d, + 0x69, 0x71, 0xc6, 0x9, 0xbd, 0x75, 0xe4, 0xf7, + 0x81, 0x9, 0xb4, 0xdd, 0xb1, 0x6f, 0xe4, 0x69, + 0x28, 0xc8, 0x54, 0x69, 0x8e, 0x81, 0xe4, 0xf5, + 0x9c, 0xdf, 0xe4, 0xc0, 0x97, 0x93, 0x8e, 0x6, + 0xe, 0x9d, 0xc8, 0xa8, 0x8, 0x12, 0x1, 0x7a, + 0x93, 0x70, 0x72, 0x67, 0x93, 0x6, 0x40, 0xe4, + 0x5e, 0x15, 0xbf, 0xa8, 0xfe, 0xf5, 0x9, 0x14, + 0x0, 0x95, 0xa3, 0x14, 0x93, 0x95, 0xf4, 0x14, + 0x14, 0xbf, 0xa8, 0xd6, 0x12, 0x94, 0x74, 0x93, + 0xa1, 0x9f, 0xe2, 0xf4, 0x7a, 0xe2, 0xe2, 0xf4, + 0xe2, 0xf4, 0x6, 0x49, 0x14, 0x2f, 0xa3, 0x26, + 0xe2, 0xd6, 0x72, 0xbf, 0xbf, 0x51, 0x50, 0x49, + 0x44, 0x44, 0x44, 0x94, 0xa8, 0xd6, 0xd6, 0xd6, + 0x9a, 0x44, 0x2c, 0xd6, 0x44, 0x44, 0x94, 0x9f, + 0x9f, 0xab, 0x44, 0x44, 0x9f, 0xd6, 0x44, 0x44, + 0x44, 0x44, 0xd3, 0x9f, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xff, 0xe4, 0xe4, 0x7b, 0x8d, 0x70, 0xce, 0xb9, + 0xe1, 0xb4, 0x9, 0x28, 0x81, 0xce, 0x9, 0xb9, + 0xde, 0xe4, 0x8d, 0x9, 0x69, 0xc4, 0x9, 0x32, + 0x9, 0xb4, 0xc6, 0xf5, 0x9, 0x9a, 0xe1, 0xf3, + 0xf3, 0xe4, 0xf3, 0xc0, 0xb4, 0xf8, 0xf5, 0x69, + 0x9, 0x57, 0x57, 0xc4, 0xf3, 0xc6, 0xdd, 0x69, + 0xb4, 0x9, 0xb1, 0x9, 0xde, 0x84, 0x3d, 0x54, + 0xde, 0x81, 0x1e, 0x8e, 0xff, 0x9, 0xb1, 0xde, + 0xbd, 0x9, 0xf3, 0x9, 0x70, 0x81, 0xb9, 0xce, + 0xb2, 0x2e, 0xdf, 0xe4, 0xe4, 0x93, 0xc0, 0x9, + 0x4b, 0xce, 0x9, 0xbf, 0xc6, 0x3d, 0xc4, 0xe2, + 0xb4, 0x69, 0x85, 0x86, 0xbd, 0xb1, 0xdd, 0xe4, + 0xf5, 0x3, 0xbd, 0xbf, 0xf3, 0x54, 0x90, 0xf5, + 0x4, 0x26, 0x32, 0x26, 0x6b, 0x26, 0xce, 0x9, + 0x8e, 0x83, 0x1e, 0x26, 0x97, 0xb1, 0xc6, 0xf5, + 0x69, 0x36, 0x75, 0x7b, 0x99, 0x15, 0xce, 0x26, + 0x9, 0x70, 0xf7, 0xff, 0xb2, 0x85, 0x85, 0xce, + 0xe1, 0x86, 0xb4, 0xf4, 0xbf, 0xbf, 0xf4, 0x6, + 0x8b, 0xe2, 0xf4, 0xa3, 0xa3, 0xbf, 0x34, 0xf4, + 0xe2, 0xf4, 0xe2, 0x34, 0xe2, 0xd3, 0x74, 0x3a, + 0x94, 0x8d, 0x9a, 0x72, 0xa8, 0xa9, 0xa9, 0x3d, + 0x0, 0x44, 0xa3, 0xd3, 0x72, 0x51, 0xf4, 0xa3, + 0xa3, 0x84, 0x6, 0xc8, 0xe2, 0x6, 0x74, 0xe2, + 0x9f, 0xa1, 0xe2, 0x51, 0x9a, 0x44, 0xe2, 0x44, + 0xe2, 0xe2, 0xd3, 0x9f, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0xd6, 0xd6, 0xe2, 0x44, 0x3e, 0xe2, 0x34, + 0xf4, 0xe2, 0xe2, 0xd3, 0x9f, 0xbb, 0xbb, 0xe2, + 0x44, 0x44, 0x34, 0xf4, 0x44, 0x44, 0xab, 0xbc, + 0x9f, 0x94, 0x44, 0x44, 0xbc, 0xd6, 0x44, 0x44, + 0x44, 0x44, 0xab, 0x9f, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x6f, 0x2e, 0x36, 0xe0, 0x9b, 0x1e, 0x7b, 0x15, + 0x7b, 0xe4, 0xc0, 0x28, 0x86, 0x70, 0x69, 0x26, + 0x69, 0xf7, 0xdd, 0xb1, 0x69, 0x2e, 0xbd, 0x9c, + 0x26, 0xc6, 0xbd, 0x93, 0xf3, 0xc6, 0xf3, 0x97, + 0x93, 0xe4, 0xf3, 0x97, 0x12, 0xb4, 0x40, 0x4, + 0x2e, 0xe1, 0x1e, 0x93, 0xf3, 0xe4, 0x69, 0x97, + 0x9, 0x2e, 0xff, 0xfd, 0xf5, 0x75, 0x3, 0x47, + 0x26, 0x81, 0x8e, 0xb1, 0x69, 0xce, 0xb1, 0xff, + 0xb1, 0xff, 0xdd, 0xbd, 0xde, 0xdf, 0x26, 0xce, + 0xbd, 0x26, 0x6f, 0xff, 0xc0, 0x93, 0xf3, 0xbf, + 0xf5, 0x1e, 0xce, 0xbf, 0x9, 0x86, 0x9c, 0xe4, + 0xdd, 0x69, 0x9, 0xdf, 0x32, 0x28, 0xbd, 0xce, + 0x83, 0x7c, 0xd8, 0xe4, 0xf3, 0x28, 0xf5, 0xf5, + 0x32, 0x36, 0x26, 0xb1, 0x99, 0x26, 0xe1, 0xbd, + 0x8e, 0x6b, 0x54, 0xf3, 0xf3, 0xe4, 0xf8, 0xf5, + 0xdd, 0x9, 0xb4, 0xf3, 0x86, 0xf5, 0xcd, 0xbd, + 0xdd, 0xb2, 0xb2, 0xf7, 0x7b, 0xe4, 0xb4, 0x9, + 0xc6, 0xb2, 0xbf, 0xbf, 0xbf, 0xbf, 0x4b, 0x1, + 0xa9, 0xf4, 0x9a, 0xa3, 0xa1, 0x44, 0x34, 0xf4, + 0xf4, 0xb4, 0xaf, 0x34, 0xe2, 0x6, 0xd6, 0xfe, + 0xbf, 0xf4, 0xf4, 0xd6, 0x8b, 0x49, 0xa3, 0xe2, + 0x0, 0xe2, 0xa3, 0x2c, 0xe2, 0xf4, 0x9a, 0x2c, + 0xa8, 0xe6, 0x7, 0xf4, 0xf4, 0xd3, 0x3a, 0xf4, + 0x44, 0xe6, 0xe1, 0xa3, 0xe2, 0x44, 0xe2, 0xe2, + 0xe2, 0xe2, 0xd3, 0x9f, 0x44, 0x44, 0xe2, 0xe2, + 0x44, 0xd6, 0xd6, 0xe2, 0xe2, 0xa5, 0xf4, 0xa1, + 0x51, 0x12, 0x2e, 0xd3, 0x74, 0x95, 0x44, 0xe2, + 0xe2, 0x44, 0x34, 0xf4, 0x44, 0x44, 0x94, 0x9f, + 0x9f, 0xd3, 0x44, 0x44, 0x9f, 0xd6, 0x44, 0x44, + 0x44, 0x44, 0x0, 0xf4, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x47, 0xf5, 0xb1, 0xc8, 0x18, 0x6a, 0x99, 0xf5, + 0xf3, 0x8d, 0x81, 0x99, 0xf5, 0xce, 0xdd, 0xb1, + 0x84, 0xc4, 0xfa, 0x7b, 0xce, 0xc6, 0x81, 0xf5, + 0x99, 0xc6, 0xbf, 0xc0, 0xce, 0x4b, 0xdf, 0xf3, + 0x12, 0xb4, 0x75, 0xdf, 0x81, 0xe1, 0xe1, 0xf3, + 0xc4, 0xdf, 0xb4, 0xbf, 0xbf, 0xbf, 0xdf, 0xc4, + 0x8d, 0x2e, 0xbc, 0x40, 0x1e, 0xf7, 0xc6, 0xc4, + 0x70, 0xdf, 0xc4, 0x9, 0xe4, 0x8d, 0xb2, 0x1e, + 0xee, 0x70, 0x85, 0xce, 0xf8, 0xde, 0x9, 0xbb, + 0x20, 0xce, 0x70, 0xcd, 0x85, 0x7, 0x84, 0x8d, + 0xb2, 0xce, 0x8d, 0xbb, 0x8d, 0xbf, 0x8d, 0x9, + 0xbb, 0x84, 0x7, 0xe4, 0xbf, 0x9f, 0x71, 0xe4, + 0xb4, 0xdd, 0xbf, 0xbf, 0x8d, 0xc0, 0xb4, 0x95, + 0xf3, 0xc0, 0x8d, 0xbf, 0x95, 0xc6, 0x84, 0x8d, + 0x9, 0xe1, 0xe1, 0xb4, 0xbf, 0xbb, 0x8d, 0xe2, + 0xbf, 0x8d, 0x8d, 0xbf, 0x2e, 0x85, 0x84, 0xe1, + 0xe4, 0x70, 0x70, 0x9, 0xff, 0x9, 0xe4, 0xc0, + 0xb1, 0xf3, 0xe4, 0xf3, 0x69, 0xb0, 0x9a, 0xc7, + 0xa3, 0xbf, 0x95, 0xc7, 0xc7, 0xe4, 0x1, 0x51, + 0xf3, 0xbf, 0x2a, 0x1, 0xbf, 0x94, 0x3a, 0xa8, + 0xd6, 0xe2, 0xaf, 0x14, 0xbb, 0xfe, 0x7a, 0x93, + 0x0, 0xe2, 0xa3, 0x14, 0xaf, 0xe2, 0x93, 0x14, + 0x14, 0x43, 0x41, 0x93, 0xc0, 0xd3, 0x27, 0x12, + 0xf4, 0x3e, 0xd3, 0x27, 0xe2, 0x44, 0x95, 0x12, + 0xf3, 0x44, 0x6, 0x27, 0xe2, 0x44, 0x12, 0xbb, + 0xe2, 0xd6, 0xd6, 0xf4, 0x18, 0xa8, 0xd6, 0x49, + 0x1a, 0x12, 0x44, 0x94, 0x9f, 0xe2, 0xe2, 0xe2, + 0x44, 0x44, 0x2c, 0xd6, 0x44, 0x44, 0xd3, 0x9f, + 0x9f, 0x94, 0x44, 0x44, 0x9f, 0xd6, 0x44, 0x44, + 0x44, 0xf4, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x85, 0xb4, 0xbf, 0xe1, 0x9, 0xbb, 0xb2, 0xbf, + 0xb4, 0xbf, 0xaf, 0x8d, 0x9a, 0x70, 0x8d, 0xb2, + 0x84, 0x84, 0x70, 0x9, 0xb0, 0xf4, 0xbf, 0x9, + 0xe4, 0xbf, 0xf4, 0xf4, 0xb4, 0x9a, 0x57, 0x7, + 0xf4, 0xf4, 0xb4, 0xc6, 0xe4, 0xf4, 0xb4, 0xe2, + 0x95, 0xbf, 0x9a, 0xbf, 0x9, 0xbf, 0xe1, 0x70, + 0xb4, 0xbf, 0x85, 0xce, 0xe4, 0x8d, 0x70, 0x70, + 0xe4, 0xde, 0x84, 0x57, 0xf8, 0x70, 0x70, 0xf7, + 0xbf, 0xce, 0xb2, 0xbf, 0xbb, 0xb4, 0x85, 0xb0, + 0x4b, 0x84, 0x9a, 0xe4, 0xb4, 0xc6, 0xbf, 0xb4, + 0x8d, 0xbf, 0xf7, 0xbb, 0xbf, 0xbf, 0x9a, 0xf4, + 0xc6, 0x75, 0xe4, 0xf4, 0x2e, 0x85, 0xdf, 0xb4, + 0xe4, 0xce, 0x85, 0xf9, 0xfa, 0xe4, 0xb0, 0x8d, + 0xe4, 0xdf, 0x70, 0x9, 0xde, 0x71, 0x39, 0x90, + 0x93, 0xe4, 0x2e, 0x81, 0x99, 0x70, 0x70, 0x9, + 0xf3, 0xfa, 0x54, 0xb9, 0x97, 0xde, 0x1e, 0x99, + 0x9c, 0xce, 0x9, 0x9, 0x4, 0xf7, 0xc4, 0x4, + 0x97, 0x9, 0x81, 0x93, 0x97, 0xe4, 0xf4, 0x27, + 0x8c, 0xc6, 0x95, 0x14, 0x14, 0x95, 0x70, 0x41, + 0x2, 0x2a, 0xab, 0x26, 0x12, 0x6, 0x8b, 0x32, + 0x5e, 0xfd, 0xbb, 0x14, 0xbf, 0xd6, 0x9a, 0x32, + 0x0, 0xe2, 0x51, 0x6, 0x72, 0x72, 0x26, 0x14, + 0x14, 0xf4, 0x8c, 0xc5, 0xf4, 0x2c, 0x1, 0xfd, + 0xe2, 0x8d, 0xd3, 0x44, 0xe2, 0xe2, 0xf3, 0x12, + 0xe2, 0x44, 0x6, 0x3a, 0xe2, 0x44, 0x44, 0x12, + 0x44, 0x50, 0xa3, 0xbb, 0xd6, 0x44, 0x44, 0xe2, + 0xfe, 0x9a, 0x44, 0x94, 0xa8, 0xd6, 0xd6, 0xd6, + 0x53, 0x44, 0xf4, 0x2c, 0xd6, 0xd6, 0xe6, 0x7, + 0x9f, 0xd3, 0x44, 0x44, 0x9f, 0xd6, 0x44, 0x44, + 0x44, 0x51, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf3, 0xb4, 0xc6, 0xf5, 0x81, 0xb4, 0x93, 0x4, + 0x83, 0x9f, 0xf3, 0x69, 0x2e, 0xe4, 0xf5, 0xc4, + 0xff, 0xb4, 0x9, 0xdd, 0xdd, 0xc6, 0xe4, 0x69, + 0x9, 0xb4, 0xe1, 0x28, 0xc0, 0xb4, 0xc6, 0xdd, + 0xdf, 0xe4, 0xe4, 0x93, 0xc0, 0xbf, 0x4b, 0xdd, + 0xf3, 0xbf, 0x81, 0x3d, 0xc6, 0xe2, 0xce, 0x69, + 0x70, 0x86, 0xf3, 0x32, 0xce, 0xde, 0x1e, 0x47, + 0x2e, 0xe1, 0xde, 0x54, 0x54, 0xf8, 0x69, 0xb1, + 0x69, 0xdd, 0xdf, 0xb1, 0xf3, 0x2e, 0x1e, 0x90, + 0x1e, 0x2e, 0xbd, 0xce, 0xce, 0xed, 0x9, 0xaf, + 0xb4, 0x93, 0x84, 0x86, 0x9, 0xce, 0xb2, 0xbf, + 0x81, 0xf5, 0x9, 0x70, 0xc0, 0xb1, 0xf5, 0xb1, + 0xb1, 0x28, 0xc8, 0x86, 0x97, 0x26, 0x70, 0xbd, + 0xf5, 0x47, 0x54, 0x84, 0x97, 0x26, 0xff, 0x7b, + 0x97, 0xff, 0xb2, 0xb9, 0x9c, 0xdd, 0x8d, 0x9, + 0x93, 0xdd, 0xf6, 0xc8, 0xb1, 0xe4, 0x70, 0xff, + 0xb1, 0xce, 0x8d, 0xdd, 0x69, 0x70, 0x1e, 0x81, + 0xf3, 0xb4, 0xf4, 0x81, 0xb2, 0xbf, 0xbb, 0xf4, + 0x34, 0x85, 0xf8, 0x8d, 0xe2, 0x44, 0xf4, 0xc6, + 0xc8, 0x71, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xbf, 0xe2, 0xe2, 0xe2, 0xf4, + 0xe2, 0x95, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, 0xf4, + 0xf4, 0xe2, 0xf4, 0xbd, 0xe2, 0x44, 0x44, 0xe2, + 0xe2, 0x9a, 0x51, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x1, 0x51, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf3, 0xe2, 0x12, 0x9c, 0xfd, 0x81, 0x8e, 0x4, + 0x6b, 0x83, 0x69, 0x4, 0x9, 0x8d, 0xf8, 0x7b, + 0xff, 0x9, 0xbf, 0x97, 0xb1, 0xdf, 0x28, 0x47, + 0xc0, 0x70, 0x81, 0x99, 0x93, 0xbf, 0xf3, 0x97, + 0x6f, 0xed, 0xf3, 0x93, 0xc0, 0xbf, 0xf5, 0x1e, + 0xdd, 0xbf, 0x8d, 0xc4, 0x9c, 0xb4, 0xf3, 0x93, + 0x9, 0x86, 0x26, 0x28, 0x2e, 0xde, 0x15, 0x25, + 0xfd, 0xde, 0xb1, 0xf5, 0xc4, 0xc4, 0x93, 0xb1, + 0x93, 0xbd, 0x6f, 0xde, 0xde, 0xde, 0x26, 0xb2, + 0xb2, 0x26, 0xdd, 0xdd, 0xdd, 0xb1, 0x26, 0xcd, + 0xce, 0xb9, 0x8e, 0x8d, 0x9, 0x8e, 0xce, 0x9, + 0xf3, 0x93, 0xdd, 0xb0, 0xdd, 0x32, 0xb9, 0x57, + 0xb9, 0x8e, 0x36, 0x70, 0x69, 0xb1, 0x70, 0x2e, + 0x69, 0xdd, 0x2e, 0x81, 0x7b, 0xff, 0x85, 0x2e, + 0x26, 0xce, 0x71, 0x70, 0xb1, 0x9, 0x70, 0xb2, + 0xce, 0xbf, 0x9, 0xce, 0xde, 0x70, 0xce, 0x9, + 0xe4, 0x9, 0xe1, 0xb2, 0x8d, 0xbf, 0xb4, 0xb4, + 0xe4, 0xaf, 0xf4, 0xbf, 0xe4, 0xe4, 0xe2, 0xf4, + 0xa8, 0x3e, 0xbb, 0xbb, 0xbf, 0xbb, 0xe2, 0xbf, + 0xbb, 0xf4, 0xf4, 0xf4, 0x95, 0xe2, 0xe2, 0x95, + 0xf4, 0xe2, 0xf4, 0xf4, 0xf4, 0xe2, 0xbf, 0xe2, + 0xbf, 0x44, 0xbf, 0xe2, 0xf4, 0xf4, 0x12, 0xfd, + 0x32, 0xf4, 0xf4, 0xf3, 0xe2, 0xe2, 0xe2, 0xe2, + 0xe2, 0x3e, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x9a, 0xe6, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x93, 0xe1, 0xe4, 0xc0, 0x81, 0x74, 0xdd, 0x93, + 0xf3, 0xbf, 0xe4, 0xf3, 0xe4, 0xdd, 0x9, 0xb1, + 0xce, 0x70, 0xe4, 0x85, 0xbd, 0x70, 0xe4, 0x81, + 0xce, 0x95, 0xbf, 0xf3, 0xe4, 0xbf, 0xe2, 0xdd, + 0xe4, 0xbf, 0xe4, 0x57, 0xe1, 0xf4, 0xc6, 0xce, + 0xbf, 0xf4, 0xaf, 0xbf, 0xbf, 0x8d, 0xbb, 0xe1, + 0x84, 0xe4, 0xb4, 0x3d, 0x71, 0xe4, 0xe4, 0xdd, + 0xce, 0xb2, 0xdd, 0xf3, 0xbf, 0x9, 0xce, 0x70, + 0x70, 0xe4, 0x8d, 0x70, 0x71, 0x81, 0x8d, 0x95, + 0x9, 0xdd, 0x81, 0xe4, 0xce, 0x2e, 0x84, 0x70, + 0x28, 0xb9, 0xe4, 0xbf, 0xe4, 0xc4, 0xf8, 0x8d, + 0xe4, 0xbf, 0xe4, 0x86, 0xb9, 0x2e, 0x84, 0xde, + 0x83, 0x15, 0xce, 0x2e, 0xdd, 0xdd, 0x81, 0xf7, + 0x9, 0x8d, 0x85, 0xfa, 0xdf, 0xce, 0x70, 0xe1, + 0xc6, 0x1e, 0x3d, 0xe1, 0x9, 0xe4, 0xe4, 0xfa, + 0x9, 0x85, 0xf4, 0x85, 0x1e, 0xc6, 0xb2, 0x7, + 0x85, 0xc6, 0xc6, 0x4b, 0xf8, 0x9, 0xbf, 0x69, + 0xb1, 0xdf, 0xe4, 0xf3, 0xc0, 0xbf, 0xf4, 0x81, + 0xb1, 0x70, 0xf4, 0xf5, 0x93, 0xbf, 0xbb, 0xbf, + 0xc0, 0xbb, 0x95, 0x12, 0xbf, 0xe2, 0xe2, 0xbf, + 0xbb, 0xe2, 0xbf, 0xe2, 0xaf, 0xe2, 0xbb, 0x93, + 0xbf, 0xf4, 0xe2, 0x8e, 0x9, 0xf4, 0x93, 0x97, + 0xbb, 0x93, 0x93, 0x93, 0xc0, 0xe2, 0xf4, 0x12, + 0xe2, 0x51, 0xe2, 0xdd, 0xe2, 0x44, 0x44, 0x12, + 0x12, 0x95, 0xc0, 0x95, 0xe2, 0x44, 0x44, 0x95, + 0x44, 0x44, 0x44, 0xe2, 0xe2, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xf4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x86, 0xc6, 0xf4, 0x9a, 0xf4, 0xbf, 0xdf, 0xe4, + 0xe2, 0xe4, 0xaf, 0x4b, 0x86, 0x71, 0x85, 0xe4, + 0x8d, 0x70, 0x86, 0x71, 0xbb, 0xbf, 0x70, 0x70, + 0xc6, 0xbf, 0xf4, 0xe4, 0x9a, 0xf4, 0xfc, 0x7, + 0x85, 0xbf, 0xbf, 0x81, 0xbf, 0xb4, 0xbf, 0x8d, + 0xcc, 0x8d, 0xbf, 0xbf, 0x85, 0x8d, 0x81, 0x71, + 0xb0, 0xbb, 0x2e, 0xf7, 0xfa, 0xe4, 0xce, 0xb2, + 0xb2, 0x4b, 0x86, 0xde, 0x9a, 0x85, 0xe4, 0xed, + 0xde, 0xbf, 0x2e, 0xbf, 0xb2, 0xed, 0x69, 0xb4, + 0x8d, 0xb9, 0x81, 0xde, 0xfd, 0x36, 0xb1, 0xe4, + 0xce, 0x9, 0x70, 0x9, 0x95, 0x9, 0xe4, 0x85, + 0x70, 0x2e, 0xce, 0x70, 0xde, 0x71, 0xc6, 0x85, + 0xff, 0x26, 0xce, 0x70, 0x70, 0xdd, 0xce, 0xde, + 0x70, 0x2e, 0x70, 0xd8, 0x8e, 0xf3, 0x70, 0xb2, + 0xb1, 0xf8, 0x9, 0x81, 0xb1, 0xdd, 0xbb, 0x69, + 0x9, 0x85, 0xb4, 0xc8, 0x28, 0xf3, 0xde, 0x1e, + 0x97, 0x12, 0x9, 0x69, 0xff, 0xdd, 0xb4, 0x26, + 0x28, 0x9c, 0xb2, 0xfd, 0x97, 0xbb, 0xbf, 0x93, + 0x93, 0xbb, 0xbf, 0x93, 0x97, 0xaf, 0xbb, 0xbf, + 0x93, 0xb4, 0xe4, 0xbf, 0x95, 0xbb, 0xf4, 0x97, + 0xbf, 0xe2, 0xbb, 0xbb, 0xbf, 0xf4, 0xf4, 0x93, + 0x95, 0xe2, 0xbf, 0x93, 0x93, 0xe2, 0x93, 0x93, + 0x93, 0x93, 0x93, 0x93, 0xc0, 0x44, 0xe2, 0xc0, + 0xe2, 0xe2, 0x44, 0x12, 0xe2, 0x44, 0xe2, 0xe2, + 0x44, 0x44, 0xbf, 0xbb, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc0, 0xe4, 0x12, 0x12, 0xe4, 0xc6, 0x9c, 0x93, + 0xf3, 0x57, 0x57, 0xf5, 0xc0, 0xc6, 0x2e, 0x32, + 0x70, 0x2e, 0xb2, 0x12, 0x9, 0x9, 0xce, 0xb1, + 0xf5, 0xf8, 0xb4, 0xfd, 0x15, 0x86, 0x4b, 0xce, + 0xbd, 0xbf, 0xce, 0xc4, 0xc0, 0xbf, 0x85, 0x97, + 0x84, 0xf5, 0xbd, 0xce, 0xb2, 0xbf, 0x81, 0x7b, + 0x9, 0xe4, 0x69, 0xb1, 0xff, 0xbd, 0x8e, 0x15, + 0xc8, 0x28, 0xb1, 0x8e, 0x81, 0xce, 0xde, 0xff, + 0xf7, 0xce, 0xf7, 0x9, 0xf3, 0xce, 0x2e, 0xc4, + 0xf5, 0xd8, 0x70, 0xce, 0x81, 0xdf, 0xb2, 0x9, + 0xe4, 0xb2, 0xf8, 0x81, 0xbf, 0x9a, 0x84, 0x70, + 0x86, 0xf5, 0x85, 0x8d, 0x2e, 0xc4, 0xf5, 0x2e, + 0xe4, 0xdd, 0x85, 0x81, 0xc4, 0x81, 0x7, 0x2e, + 0x81, 0xf5, 0x85, 0xe1, 0xb9, 0xbf, 0xc6, 0x26, + 0x2e, 0xbd, 0x84, 0x8e, 0xb1, 0xce, 0xaf, 0xff, + 0xdd, 0x9, 0xf8, 0x3d, 0x28, 0xbd, 0xc4, 0x7b, + 0x26, 0xbd, 0x12, 0x8d, 0xb2, 0xb4, 0xe1, 0xf6, + 0x85, 0xbf, 0xf4, 0x95, 0xbf, 0xbf, 0xf4, 0xe2, + 0x95, 0xe2, 0xe2, 0x95, 0xb4, 0xe2, 0xf4, 0xb4, + 0xe2, 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, 0x44, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xf4, 0x20, + 0xf4, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x93, 0xe4, 0xf3, 0x97, 0x12, 0x8d, 0x40, 0x4, + 0xbd, 0xe1, 0x1e, 0x93, 0xf3, 0x85, 0xbd, 0xb1, + 0xb1, 0x70, 0x9, 0x26, 0xff, 0x70, 0xb9, 0xfd, + 0x8e, 0xce, 0x2e, 0x7b, 0x9, 0x2e, 0xbd, 0x4, + 0xdd, 0xdd, 0x9, 0x32, 0xb1, 0xcd, 0xde, 0x8e, + 0xb2, 0xb4, 0xbd, 0x26, 0xdd, 0xbf, 0xf3, 0x69, + 0xf7, 0xe4, 0x2e, 0xb9, 0xfd, 0x71, 0x36, 0x28, + 0x7b, 0xde, 0xbd, 0x26, 0xc4, 0xf7, 0xf3, 0x12, + 0x9, 0xce, 0xc4, 0xde, 0xbd, 0xb9, 0xf5, 0xde, + 0x86, 0x32, 0x81, 0xdd, 0xde, 0x9c, 0x26, 0x9, + 0xf3, 0x84, 0x71, 0x70, 0xbd, 0xfd, 0x70, 0x85, + 0xdd, 0x26, 0x9, 0xb4, 0xdd, 0x2e, 0xff, 0x70, + 0x2e, 0x36, 0xbc, 0xfc, 0x26, 0x7b, 0xf7, 0x7, + 0xde, 0xff, 0xcd, 0xce, 0xce, 0x9, 0xc6, 0xf5, + 0xbd, 0x2e, 0x71, 0xc6, 0x40, 0xee, 0x8d, 0x85, + 0xb2, 0xed, 0xed, 0xdd, 0xf3, 0x9, 0x71, 0x86, + 0xdf, 0xb2, 0x70, 0x85, 0x71, 0x70, 0xed, 0xc6, + 0xbf, 0xe2, 0xbb, 0xe2, 0xf9, 0xe2, 0xe2, 0xbf, + 0xb4, 0xbf, 0xfc, 0xb4, 0xb4, 0xbf, 0xe2, 0x4b, + 0xb4, 0xf4, 0xe2, 0xe2, 0xbf, 0xf4, 0xbf, 0xf4, + 0xf4, 0xf4, 0xf4, 0xbb, 0xf4, 0xe2, 0xe2, 0xf4, + 0xf4, 0xe2, 0xe2, 0xe2, 0xf4, 0x9a, 0x12, 0x12, + 0xcd, 0xe2, 0xf4, 0x12, 0xe2, 0x44, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0xe2, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x12, 0xb4, 0x71, 0xdf, 0xf8, 0xe1, 0xe1, 0xc0, + 0x81, 0xdf, 0xb4, 0xbf, 0xbf, 0xaf, 0x86, 0x54, + 0xce, 0x9, 0x7, 0x36, 0x81, 0xb2, 0x81, 0xde, + 0xe4, 0x70, 0x81, 0xb2, 0x9, 0xbb, 0xce, 0xde, + 0xb2, 0x9, 0x70, 0xff, 0x71, 0x81, 0x36, 0x2e, + 0x9, 0xce, 0x70, 0x9c, 0x70, 0x8d, 0xde, 0xb9, + 0xb2, 0xf8, 0xde, 0x70, 0xe1, 0x71, 0xf5, 0x8e, + 0xbd, 0xce, 0xb1, 0xff, 0xed, 0xff, 0xc0, 0x70, + 0x85, 0xb2, 0xff, 0xdd, 0xb2, 0xff, 0x8e, 0xde, + 0xb1, 0xb1, 0xff, 0x9, 0xb1, 0x26, 0x9b, 0xfa, + 0x7b, 0x47, 0x36, 0xe1, 0x9, 0xff, 0xf8, 0xe4, + 0xdd, 0xb1, 0xb0, 0xed, 0xb9, 0xb1, 0x84, 0x84, + 0x8e, 0x15, 0xd8, 0xb2, 0x2e, 0x32, 0x70, 0x81, + 0xb1, 0xdd, 0xaf, 0x70, 0xb2, 0x9, 0xe1, 0xd8, + 0x71, 0x81, 0x9a, 0x81, 0xf5, 0xc0, 0xb4, 0xce, + 0xf3, 0xdd, 0x8d, 0xe4, 0xb2, 0x70, 0x70, 0x26, + 0xbc, 0x71, 0x8d, 0xe4, 0xb1, 0xb2, 0xb2, 0xc4, + 0x93, 0xbf, 0xbf, 0x12, 0x97, 0x8d, 0x12, 0x97, + 0x97, 0xc6, 0xc0, 0x97, 0x4, 0xbf, 0xf4, 0x97, + 0xbf, 0xe2, 0x44, 0xbf, 0x85, 0xf4, 0xbf, 0x93, + 0x12, 0xf4, 0xe2, 0x93, 0xbb, 0xe2, 0xe2, 0x93, + 0xbb, 0xe2, 0xe2, 0x93, 0x9, 0xf4, 0x93, 0x93, + 0x93, 0xf4, 0x12, 0x93, 0xc0, 0xe2, 0xe2, 0x12, + 0xe2, 0xe2, 0xe2, 0x12, 0xe2, 0x44, 0x95, 0xbf, + 0xe2, 0x44, 0xbf, 0xe2, 0x44, 0x44, 0xe2, 0xe2, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf4, 0xf4, 0x8d, 0xc6, 0xe4, 0xf4, 0xb4, 0xe2, + 0xbf, 0xbf, 0x9a, 0xbf, 0xbf, 0x9, 0x70, 0x70, + 0xce, 0x8d, 0x9a, 0xde, 0xdd, 0xb4, 0x70, 0xdd, + 0xbf, 0x95, 0xe4, 0x36, 0x9, 0x8d, 0x2e, 0x81, + 0xde, 0x70, 0xb9, 0xff, 0xdd, 0xbf, 0xce, 0xde, + 0x70, 0xb4, 0xdd, 0x84, 0x70, 0xe1, 0x70, 0x81, + 0x2e, 0x70, 0x2e, 0x81, 0x70, 0xdd, 0x70, 0xfd, + 0x84, 0x81, 0xb2, 0xf7, 0x2e, 0x84, 0xb2, 0x36, + 0xde, 0xde, 0x9, 0x85, 0xed, 0xff, 0x9, 0x9, + 0x12, 0xff, 0x1e, 0x1e, 0x1, 0x34, 0x0, 0xfe, + 0xa6, 0xb2, 0x9, 0xcd, 0xb2, 0xdf, 0xff, 0xe4, + 0xf3, 0xbd, 0x84, 0xf5, 0xff, 0x26, 0x75, 0x1e, + 0x54, 0xc4, 0xbf, 0xbf, 0xf3, 0xbd, 0xdf, 0x70, + 0x69, 0x9, 0x74, 0x1, 0x3d, 0xdd, 0xbf, 0x9, + 0xf5, 0x83, 0xdf, 0x69, 0x67, 0x47, 0x9, 0x9c, + 0x69, 0xdd, 0xbf, 0xfd, 0x25, 0xc8, 0x84, 0xdd, + 0x7b, 0xed, 0xc4, 0xa5, 0xa8, 0xc7, 0xa3, 0x36, + 0x32, 0xe4, 0xb4, 0xf3, 0x93, 0xaf, 0xb4, 0xa5, + 0x14, 0x15, 0xbf, 0x97, 0x4, 0x71, 0x4e, 0x7a, + 0xce, 0xbf, 0xe2, 0xaf, 0x9f, 0xa3, 0x51, 0xaf, + 0x95, 0xe2, 0xe2, 0x3e, 0xd6, 0x40, 0xf4, 0xe2, + 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, 0xbb, 0x7a, 0x14, + 0x27, 0x93, 0x12, 0x12, 0x85, 0xd6, 0x3e, 0xf4, + 0x44, 0x44, 0xe2, 0x40, 0x50, 0x51, 0xe2, 0xbb, + 0xbf, 0x44, 0xe2, 0xe2, 0xd6, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x7, 0xa3, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0xf4, 0x2c, 0x34, 0x0, 0xe6, + 0xd6, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xd3, 0x44, + 0x44, 0x44, 0xa9, 0x2c, 0x44, 0x44, 0x44, 0x2c, + 0x7, 0x51, 0xa9, 0x44, 0x2c, 0x7, 0x44, 0xd3, + 0x44, 0x7, 0xa3, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xdf, 0xe4, 0xe4, 0x93, 0xc0, 0xbb, 0x4b, 0xbd, + 0xc0, 0xbf, 0xc6, 0x9d, 0xfa, 0xee, 0x85, 0x69, + 0xb4, 0x86, 0xce, 0xce, 0x9, 0x8d, 0xb2, 0x47, + 0x70, 0xbf, 0x9, 0x81, 0xc6, 0x86, 0x7b, 0xfd, + 0xbd, 0xf3, 0xf5, 0x7b, 0xde, 0x9, 0x2e, 0x54, + 0x75, 0xc6, 0x9, 0xfd, 0x81, 0xf8, 0xff, 0x8e, + 0xdd, 0xbf, 0x81, 0xb1, 0xf5, 0x9, 0xff, 0x36, + 0x40, 0x54, 0x15, 0xfd, 0x2e, 0x70, 0x86, 0xf5, + 0x70, 0x95, 0x95, 0x9, 0x81, 0xdf, 0xde, 0x8d, + 0x9, 0xde, 0xc6, 0x5e, 0x8c, 0xc8, 0xe4, 0x3d, + 0x5e, 0xc7, 0x8d, 0x12, 0x9, 0xff, 0x70, 0x9, + 0x95, 0x2e, 0xe4, 0x81, 0x70, 0x9, 0xbf, 0xbf, + 0xb2, 0xb1, 0x70, 0xbd, 0x9, 0xf3, 0xfa, 0xb9, + 0x36, 0xdd, 0xde, 0x7c, 0xf6, 0xb9, 0x8d, 0x95, + 0x7b, 0xc4, 0xc4, 0x32, 0x6, 0x27, 0x9, 0x99, + 0xb1, 0xd8, 0xce, 0x1a, 0xe8, 0x54, 0xdd, 0x97, + 0x93, 0xfa, 0x8c, 0x15, 0x70, 0x8d, 0x8d, 0xa8, + 0x15, 0x4b, 0xbf, 0xe2, 0xbf, 0xbf, 0xfe, 0xab, + 0x72, 0xfe, 0x72, 0xe2, 0x88, 0xfe, 0x2c, 0x49, + 0x1a, 0x9a, 0xf4, 0x2a, 0xfe, 0x72, 0x94, 0xa1, + 0xbf, 0xe2, 0x49, 0xd3, 0xa3, 0xfe, 0x51, 0xe2, + 0x44, 0xe2, 0xe2, 0xe2, 0xf4, 0xfe, 0x49, 0x14, + 0xe6, 0xa3, 0xf4, 0x75, 0xfe, 0x2c, 0x49, 0x1a, + 0xf4, 0x44, 0x51, 0xfe, 0xd6, 0x94, 0xa8, 0x44, + 0x44, 0xbb, 0x44, 0x2c, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x9f, 0x94, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x1a, 0xa8, 0x9a, 0x44, 0x57, + 0x1a, 0xd6, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x1a, 0x7, + 0x44, 0x44, 0x52, 0xfe, 0x44, 0x44, 0x44, 0x34, + 0xf4, 0x9a, 0x9a, 0x44, 0x94, 0x9f, 0x44, 0x0, + 0x44, 0xf4, 0x57, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x9c, 0xed, 0xc0, 0x93, 0xf3, 0xbf, 0xf5, 0x1e, + 0xdd, 0xbf, 0xbb, 0xf5, 0xf5, 0xb4, 0xdd, 0x32, + 0x12, 0xfa, 0xb1, 0x6f, 0x9, 0xe4, 0xf5, 0x40, + 0x36, 0xe4, 0x12, 0x28, 0xf5, 0xc4, 0xb1, 0x32, + 0xb1, 0xf3, 0xc4, 0x7b, 0xb9, 0x2e, 0x8e, 0x15, + 0x1e, 0x9, 0x32, 0xb1, 0xfa, 0xf5, 0x69, 0x26, + 0xe4, 0xe4, 0x7b, 0xf5, 0x81, 0x2e, 0x2e, 0x28, + 0x8b, 0x6f, 0x7b, 0x26, 0x7b, 0xf7, 0xb1, 0xce, + 0xc0, 0x9, 0x70, 0xbb, 0x70, 0x26, 0xfd, 0xb2, + 0x71, 0xce, 0xe8, 0x6, 0xc6, 0x70, 0xce, 0xbf, + 0x28, 0x41, 0xb2, 0xb0, 0x27, 0xa3, 0x3e, 0xe4, + 0x71, 0x2e, 0x2c, 0x28, 0x72, 0x4e, 0x71, 0x2e, + 0xe8, 0x27, 0x85, 0x75, 0x40, 0x2c, 0x3d, 0x3e, + 0x35, 0x4e, 0x75, 0xe8, 0xf3, 0x95, 0x8b, 0x2c, + 0x27, 0x27, 0x3a, 0xdd, 0x6, 0x43, 0x7a, 0xa3, + 0x83, 0x75, 0x2a, 0xfe, 0x67, 0x1e, 0x8d, 0x9, + 0xb4, 0x1, 0x70, 0x3e, 0x5e, 0x5e, 0x2f, 0xbf, + 0x49, 0x70, 0xbb, 0xf4, 0xbf, 0x2a, 0xab, 0xbf, + 0xb4, 0x9f, 0x34, 0xaf, 0xa1, 0x2a, 0xbf, 0xbf, + 0xa1, 0x3e, 0xf4, 0xfe, 0xe1, 0xe2, 0xf4, 0xfe, + 0xc8, 0xe1, 0xfe, 0xf4, 0xe2, 0x84, 0x34, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0x2a, 0x52, 0xbc, 0xbd, + 0x9b, 0x34, 0xf3, 0x1, 0x51, 0x44, 0xe2, 0xa1, + 0x3e, 0x44, 0xe6, 0x9a, 0x44, 0x44, 0xfe, 0x7, + 0x44, 0x44, 0x74, 0x1a, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x9f, 0xd3, 0x9f, 0xd6, 0xa9, 0x44, + 0x44, 0xd6, 0x9a, 0x44, 0x44, 0x9f, 0xa9, 0x44, + 0x44, 0x44, 0x51, 0x94, 0x44, 0x44, 0x44, 0x44, + 0x9a, 0x1, 0x44, 0x44, 0x44, 0x9f, 0xd6, 0xa9, + 0xf4, 0x44, 0x44, 0xf4, 0x3e, 0xd6, 0x9a, 0x44, + 0x44, 0x9f, 0x9f, 0x74, 0x9f, 0x44, 0x9f, 0xd6, + 0x9f, 0x9f, 0x9f, 0x44, 0x44, 0x9a, 0xd6, 0x3e, + 0x9a, 0x44, 0x44, 0x44, 0x44, 0x44, 0xa3, 0x51, + 0x44, 0x44, 0x34, 0x1, 0x9f, 0x44, 0x9a, 0x1a, + 0x44, 0x9f, 0x9f, 0x44, 0x94, 0x9f, 0x44, 0x0, + 0x44, 0x9a, 0x51, 0x44, 0x44, 0x9a, 0xd6, 0xd6, + 0x7, 0x44, 0x44, 0xa9, 0x9a, 0xa9, 0xd6, 0xf4, + 0x9a, 0xd6, 0xa9, 0x44, 0x44, 0x44, 0x9f, 0xd6, + 0xa9, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xe4, 0xbf, 0xe4, 0x57, 0xe1, 0xf4, 0xc6, 0xe4, + 0xbb, 0xf4, 0xbf, 0xbf, 0x9, 0xbf, 0xf4, 0xe1, + 0x84, 0xe4, 0xbf, 0xc8, 0x71, 0x70, 0xe4, 0x2e, + 0x9, 0xbf, 0xce, 0xdd, 0xdd, 0x9, 0x9, 0x97, + 0x70, 0xbf, 0xe4, 0x81, 0xc8, 0x70, 0xb1, 0x26, + 0x70, 0xe4, 0xe4, 0xff, 0x70, 0xe4, 0xce, 0xe1, + 0xc8, 0x70, 0xde, 0xf3, 0x8d, 0xbd, 0x70, 0x71, + 0xde, 0xe4, 0xdd, 0xf7, 0xf7, 0xb9, 0x8d, 0xbf, + 0xbf, 0xe4, 0x70, 0x70, 0x84, 0xe1, 0x8d, 0xf9, + 0x1e, 0x9, 0x52, 0x2a, 0xe4, 0xc4, 0xe4, 0x8d, + 0xe4, 0x85, 0xe4, 0xa1, 0xfe, 0x2f, 0xab, 0xac, + 0x81, 0xce, 0x0, 0x6, 0xc7, 0xab, 0x5e, 0xe1, + 0x2c, 0xd3, 0x8d, 0xf5, 0x14, 0x6, 0x74, 0xfe, + 0x6, 0xae, 0x18, 0x6, 0xe4, 0x3e, 0x34, 0xa1, + 0xab, 0xfe, 0x2c, 0xbb, 0x1a, 0xe6, 0xa8, 0xa8, + 0x34, 0x99, 0x4e, 0xfe, 0x1, 0x9f, 0x70, 0xfa, + 0x15, 0xa3, 0x84, 0x8c, 0x70, 0xcd, 0x2c, 0xfd, + 0x15, 0x2a, 0xbf, 0xbf, 0x32, 0x27, 0x74, 0x12, + 0xdd, 0x1e, 0x34, 0x69, 0xfe, 0x71, 0xf4, 0xc0, + 0x43, 0x52, 0x84, 0xfe, 0x12, 0xf4, 0xe2, 0xa8, + 0x3e, 0x2a, 0x49, 0xbb, 0xbf, 0xe2, 0x1a, 0xc8, + 0xf4, 0x44, 0xe2, 0x93, 0x9d, 0x9f, 0x95, 0x93, + 0x4, 0x34, 0x12, 0xfe, 0xe1, 0xe2, 0x44, 0x43, + 0x52, 0x9a, 0xfe, 0xbf, 0x44, 0x44, 0xa8, 0x3e, + 0x44, 0xf4, 0x34, 0x75, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0xbc, 0x34, 0xe6, 0xd6, 0x1a, 0xa8, + 0x44, 0xd3, 0x3e, 0x44, 0x44, 0x1, 0xd6, 0x44, + 0x44, 0x44, 0xa8, 0x51, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xa9, 0xe6, 0xd6, 0x52, + 0x1a, 0xf4, 0xf4, 0x34, 0xa8, 0xd6, 0x34, 0x74, + 0x44, 0xd6, 0xe6, 0x49, 0x9f, 0x74, 0x34, 0xd6, + 0x1, 0xe6, 0xd6, 0x44, 0x7, 0xe6, 0x2c, 0x2c, + 0x34, 0x7, 0x44, 0x44, 0x44, 0x44, 0x53, 0xa8, + 0x44, 0xbc, 0xa8, 0x3e, 0xd6, 0x44, 0x51, 0xa3, + 0x44, 0xd6, 0xd6, 0x44, 0xd3, 0x9f, 0x44, 0x0, + 0x44, 0x9f, 0xd3, 0x44, 0x9f, 0x34, 0x2c, 0xd6, + 0x34, 0x9f, 0x44, 0x94, 0x94, 0x2c, 0x1d, 0x1a, + 0x1a, 0xd6, 0x1a, 0xd6, 0x44, 0xd6, 0x1a, 0xd6, + 0x94, 0xd3, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x9a, 0x95, 0xbf, 0x81, 0xbb, 0xb4, 0xbf, 0xbf, + 0xcc, 0xf4, 0xbf, 0xbf, 0x9a, 0xf4, 0x81, 0x75, + 0x85, 0xbb, 0xb4, 0xe4, 0x86, 0x70, 0xe4, 0xce, + 0x85, 0xfa, 0xdf, 0x85, 0x8d, 0x9a, 0xf4, 0xdf, + 0x70, 0xbf, 0xe4, 0xde, 0x54, 0x4b, 0xdd, 0x70, + 0xe1, 0x85, 0x86, 0x81, 0x74, 0x85, 0xe4, 0xfa, + 0x4b, 0x70, 0xdd, 0x9, 0xe4, 0x4b, 0xdf, 0xce, + 0xd8, 0x7, 0xbc, 0x54, 0xdf, 0x86, 0x70, 0xbf, + 0xce, 0xed, 0xed, 0x70, 0x71, 0xce, 0x8d, 0xfa, + 0x69, 0xf3, 0x6, 0x27, 0x93, 0x9c, 0xed, 0x85, + 0xfd, 0x3d, 0x54, 0x0, 0xb9, 0x9, 0xbf, 0x6, + 0xa5, 0xaf, 0x0, 0x51, 0x69, 0xfd, 0xe3, 0x7a, + 0x1e, 0x0, 0x70, 0xf8, 0xe6, 0xc5, 0xa9, 0xfe, + 0x32, 0x28, 0x27, 0x6, 0x47, 0x62, 0x7e, 0x93, + 0xff, 0xe3, 0x2f, 0xfa, 0x1a, 0xa8, 0xb4, 0xf3, + 0x5e, 0x27, 0x8e, 0x6, 0xe, 0xc8, 0xc8, 0x86, + 0xfb, 0x27, 0x18, 0x14, 0x69, 0x70, 0xfa, 0x93, + 0x93, 0x14, 0xbf, 0xe4, 0x93, 0xe4, 0xbf, 0x9, + 0xfd, 0x62, 0xa8, 0x97, 0x0, 0xaf, 0xbf, 0x93, + 0x27, 0x6, 0x74, 0x6, 0x93, 0xbb, 0xbf, 0xa3, + 0xc7, 0xd6, 0xa3, 0x93, 0xe2, 0xe2, 0x6, 0x74, + 0xf4, 0xe2, 0xe2, 0xf4, 0xe2, 0xf4, 0x93, 0x36, + 0x5e, 0x2f, 0xc0, 0x0, 0xe2, 0x44, 0xe2, 0x74, + 0x6, 0x9f, 0x94, 0xbb, 0x44, 0x44, 0xd6, 0xd6, + 0x44, 0x94, 0x3e, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x9f, 0x34, 0xf4, 0x44, 0xf4, 0x34, + 0x9a, 0x51, 0x1a, 0x44, 0xf4, 0x0, 0x9a, 0x44, + 0x44, 0x44, 0xd3, 0x9f, 0x44, 0x44, 0x2c, 0xd3, + 0xd3, 0xd3, 0x44, 0xf4, 0xe6, 0xf4, 0x44, 0x44, + 0xab, 0x51, 0x91, 0x2c, 0x44, 0x44, 0x9f, 0xe6, + 0x44, 0xd6, 0xa8, 0x44, 0x44, 0x1a, 0xbc, 0x44, + 0x44, 0xd3, 0xd6, 0x44, 0x94, 0x9f, 0x44, 0x44, + 0xd6, 0xa8, 0x44, 0x44, 0x44, 0x44, 0xf4, 0x1a, + 0x44, 0xd6, 0x51, 0x9a, 0xd3, 0x44, 0x2c, 0x18, + 0x44, 0xd6, 0xd6, 0x44, 0xd3, 0xbc, 0x44, 0x0, + 0x44, 0x9f, 0xab, 0x44, 0x9f, 0x9f, 0x44, 0x44, + 0xd6, 0xd6, 0x44, 0xd3, 0x3e, 0x44, 0x44, 0x0, + 0x9a, 0x44, 0x9f, 0xd3, 0x44, 0xd3, 0x53, 0x44, + 0x44, 0xd6, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x2e, 0xde, 0x2e, 0x3d, 0x53, 0x90, 0x32, 0xf5, + 0x81, 0xb4, 0xc0, 0x93, 0xbf, 0xaf, 0xf3, 0x9, + 0xe1, 0x81, 0xbd, 0x9f, 0xa9, 0x1e, 0x6f, 0x93, + 0xb4, 0xdd, 0xf3, 0x69, 0x2e, 0xf3, 0x93, 0x93, + 0xe1, 0xd8, 0x32, 0x28, 0x40, 0x40, 0x6b, 0xe0, + 0x26, 0xde, 0xce, 0x8e, 0x9b, 0xc4, 0xbd, 0x32, + 0xf5, 0x7b, 0xe4, 0xf3, 0x4, 0xdd, 0xed, 0xe4, + 0xfd, 0x36, 0x9, 0xc4, 0x28, 0xe0, 0x32, 0xb1, + 0x97, 0xf5, 0xdd, 0xff, 0xe0, 0x3, 0x4b, 0x28, + 0x6b, 0x36, 0x6, 0x27, 0xc4, 0xc4, 0xb4, 0xf3, + 0x4, 0x18, 0x13, 0x1a, 0x4, 0x71, 0xd8, 0xa1, + 0x1, 0xc8, 0x0, 0xb1, 0x4, 0xc4, 0xa8, 0x14, + 0xb1, 0x5e, 0xa5, 0x40, 0x0, 0x74, 0x3e, 0xe3, + 0x39, 0x15, 0x43, 0x6, 0x69, 0x0, 0x70, 0xdd, + 0xb2, 0x2c, 0xa3, 0xce, 0xe3, 0x4f, 0xe4, 0xf4, + 0x6, 0x27, 0xf4, 0x6, 0x18, 0xe2, 0xf4, 0x9, + 0x3d, 0x3e, 0xe1, 0x52, 0xe2, 0xf4, 0x18, 0xd8, + 0xe1, 0x3e, 0xe2, 0xf4, 0xe2, 0xf4, 0x7, 0x72, + 0x34, 0x48, 0xf4, 0xbf, 0x0, 0x44, 0x95, 0xe2, + 0x9d, 0x6, 0x74, 0x6, 0x8d, 0xf4, 0x9a, 0x2c, + 0x72, 0x72, 0x72, 0xe2, 0x44, 0xe2, 0xd3, 0x9f, + 0x2f, 0xd3, 0xab, 0x57, 0xe2, 0xf4, 0xd6, 0x34, + 0x3e, 0x44, 0xe2, 0x0, 0x44, 0x44, 0x44, 0x74, + 0xd3, 0x9f, 0xd3, 0xe2, 0xe2, 0x44, 0x72, 0xd6, + 0x72, 0x52, 0xee, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x9f, 0xd3, 0x44, 0x44, 0x44, 0x94, + 0xbc, 0xf4, 0x0, 0x9a, 0x51, 0x1a, 0x44, 0x44, + 0x44, 0x44, 0x94, 0x53, 0x44, 0x44, 0x57, 0x9f, + 0x9f, 0x0, 0x44, 0x9f, 0x34, 0xd3, 0xd3, 0xd3, + 0xe6, 0xd6, 0xab, 0x9f, 0x44, 0x44, 0x44, 0x0, + 0x44, 0xd6, 0xd6, 0x44, 0x44, 0x0, 0x44, 0x44, + 0x44, 0xd6, 0xd6, 0x44, 0x0, 0xd3, 0xab, 0xd3, + 0x1a, 0x94, 0x44, 0x44, 0x44, 0x44, 0x44, 0x1a, + 0xf4, 0x1a, 0x9a, 0x44, 0xe6, 0xf4, 0xd3, 0xf4, + 0x44, 0xd6, 0xd6, 0x44, 0x94, 0x9f, 0x44, 0x0, + 0x44, 0x9f, 0x94, 0x44, 0xf4, 0xd6, 0xd3, 0xe6, + 0x34, 0xd6, 0x44, 0xd3, 0x9f, 0x44, 0x44, 0x0, + 0x44, 0x44, 0xbc, 0xd3, 0x44, 0x18, 0x34, 0x1a, + 0x2c, 0x7, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xd8, 0xd8, 0x28, 0x7c, 0xc8, 0x81, 0x97, 0x4, + 0xf5, 0xf5, 0x97, 0x97, 0xc0, 0xfa, 0xf5, 0x32, + 0x9f, 0xc8, 0x9c, 0x7d, 0x40, 0x70, 0x4, 0x93, + 0x81, 0xdf, 0x4, 0xb1, 0xce, 0x71, 0x6f, 0x32, + 0xfd, 0x1e, 0x4, 0x4, 0x7d, 0xd7, 0xca, 0x6f, + 0x7b, 0xb1, 0xf5, 0x9c, 0xff, 0xbd, 0x2e, 0xdd, + 0xdf, 0xdf, 0xce, 0x8d, 0x84, 0x9d, 0x39, 0x32, + 0x6f, 0x9, 0xce, 0xdf, 0x6f, 0x32, 0xf3, 0x69, + 0x6f, 0x54, 0xc4, 0xdd, 0x9d, 0xa9, 0x6a, 0x99, + 0xf5, 0xf3, 0x7a, 0xa1, 0x99, 0xf5, 0xe4, 0x69, + 0x43, 0xfe, 0xc5, 0x1a, 0xfd, 0x40, 0xf6, 0xb3, + 0x60, 0xb1, 0x0, 0xc0, 0x32, 0x99, 0xa6, 0xc7, + 0x69, 0x48, 0x24, 0x60, 0x1, 0xbf, 0x27, 0x6, + 0x54, 0xf5, 0xa9, 0x6, 0x9, 0x0, 0x1e, 0xf7, + 0xed, 0xa1, 0xa3, 0x9, 0x1a, 0x35, 0xbf, 0xbb, + 0x6, 0x18, 0x86, 0x6, 0x74, 0xbb, 0x9a, 0xbb, + 0xdf, 0xa1, 0xbf, 0xa3, 0x49, 0xa8, 0xd3, 0xbf, + 0xd6, 0x71, 0x8d, 0xbf, 0xbf, 0x9a, 0x5e, 0x2f, + 0x85, 0xbb, 0xf4, 0xe2, 0xfe, 0x84, 0xf4, 0xe4, + 0x2a, 0x2f, 0x9f, 0xfe, 0x93, 0x20, 0xf4, 0x49, + 0xa9, 0x51, 0x49, 0xf4, 0x44, 0xe2, 0xfe, 0x9a, + 0x75, 0x9f, 0x9f, 0xbb, 0x8d, 0x1a, 0x2c, 0x8d, + 0x44, 0x44, 0xe2, 0xe6, 0x9a, 0x44, 0x44, 0x51, + 0x2f, 0x36, 0xfe, 0x44, 0xe2, 0x95, 0x1, 0x53, + 0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0x44, + 0x44, 0x44, 0x9f, 0xd3, 0x44, 0x44, 0x44, 0x1a, + 0x7, 0x44, 0xa8, 0x3e, 0x52, 0x51, 0x44, 0x44, + 0x44, 0x44, 0xd6, 0x2c, 0x44, 0x44, 0x44, 0x44, + 0x57, 0x0, 0x44, 0x9f, 0x1a, 0x9f, 0x9f, 0x9f, + 0xbc, 0x9a, 0x94, 0x9f, 0x44, 0x44, 0xf4, 0x34, + 0x44, 0xd6, 0xd6, 0x44, 0x44, 0x0, 0xf4, 0x44, + 0x44, 0x2c, 0xd6, 0x44, 0x0, 0x9f, 0x9f, 0x9f, + 0xbc, 0x57, 0x44, 0x44, 0x44, 0x44, 0x44, 0x49, + 0x74, 0xfe, 0x44, 0x44, 0xa8, 0x53, 0x1a, 0x44, + 0x44, 0xd6, 0x50, 0x44, 0xd3, 0x9f, 0x44, 0x0, + 0x44, 0x9f, 0xd3, 0x44, 0xa8, 0x1d, 0x9f, 0xf4, + 0xd6, 0xd6, 0x44, 0xd3, 0xbc, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x9f, 0xd3, 0x44, 0x44, 0x44, 0x9f, + 0xa3, 0x34, 0x9a, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xf6, 0x1e, 0x99, 0x6f, 0xce, 0x95, 0xf3, 0x69, + 0x99, 0xdf, 0xc0, 0xc0, 0x9a, 0xc6, 0x9c, 0xc0, + 0xbf, 0xe4, 0xf3, 0x99, 0xf5, 0xb4, 0xf3, 0xf3, + 0xc6, 0xf5, 0xf3, 0x12, 0xe1, 0xe1, 0xf5, 0xdf, + 0xbf, 0xbf, 0xc0, 0xf5, 0x54, 0x99, 0x6f, 0xb1, + 0xb9, 0xe1, 0x1e, 0x1e, 0xce, 0xe1, 0x8d, 0xce, + 0x75, 0xc8, 0x85, 0xf4, 0x85, 0xc6, 0x9, 0xb4, + 0x95, 0xbf, 0xb4, 0x9, 0xdf, 0x81, 0xe4, 0xbf, + 0xd8, 0x84, 0xe4, 0xbf, 0xe1, 0xb4, 0xbf, 0xb2, + 0xbf, 0xb4, 0x75, 0x34, 0x8b, 0xb0, 0xb4, 0x9a, + 0x5e, 0xd6, 0xc6, 0x34, 0x3d, 0xbf, 0x2e, 0xfe, + 0x36, 0xc6, 0x0, 0x72, 0xb4, 0xbc, 0xfe, 0x15, + 0x8d, 0x8d, 0x0, 0x1a, 0xa9, 0xf4, 0x18, 0xd3, + 0xe4, 0xe4, 0x51, 0x1a, 0x9, 0xab, 0xa1, 0x9, + 0x35, 0x34, 0xa3, 0x9, 0xd3, 0x27, 0xe4, 0x93, + 0x6, 0x18, 0xe1, 0x6, 0x43, 0xbf, 0xbb, 0xc0, + 0x93, 0x74, 0x2f, 0xe2, 0x9b, 0x40, 0xf4, 0xc5, + 0x3e, 0xe2, 0xf4, 0x97, 0xbf, 0x3e, 0xa3, 0x93, + 0xbf, 0xe2, 0x12, 0x69, 0x49, 0x4e, 0xbb, 0x32, + 0x6, 0x9f, 0x93, 0xfe, 0x27, 0x12, 0x26, 0xfe, + 0x26, 0x7, 0x34, 0x26, 0xf4, 0x9f, 0x94, 0xaf, + 0x44, 0xe2, 0xbf, 0x9, 0x7a, 0xd6, 0xaf, 0x12, + 0xe2, 0x44, 0xf3, 0x1, 0xd6, 0x44, 0xe2, 0x94, + 0x9f, 0xf4, 0xfe, 0x9f, 0xe2, 0x2e, 0xfe, 0xf4, + 0x44, 0xe2, 0xe2, 0xe2, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x9f, 0x0, 0x7, 0x44, 0x57, 0x34, + 0x44, 0x44, 0x53, 0x1a, 0x0, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x9a, 0xfe, 0x7, 0x44, 0x44, 0xf4, + 0x1a, 0x0, 0x44, 0x44, 0x34, 0x57, 0x44, 0xf4, + 0x1a, 0x51, 0x3e, 0x1, 0x44, 0x44, 0x3e, 0xa8, + 0x44, 0x50, 0xd6, 0x44, 0x44, 0x52, 0x2c, 0x44, + 0x9f, 0x34, 0xd6, 0x44, 0x52, 0x3e, 0x44, 0x44, + 0xa1, 0xa8, 0x44, 0x44, 0x44, 0x44, 0x44, 0x51, + 0x1a, 0x2c, 0x44, 0x44, 0x51, 0x1a, 0x49, 0x44, + 0x44, 0xd6, 0xd6, 0x44, 0x94, 0x9f, 0x44, 0x0, + 0x44, 0xbc, 0xd3, 0x44, 0xd3, 0x53, 0x44, 0xf4, + 0x1a, 0xd6, 0x44, 0x94, 0x9f, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x9f, 0x94, 0x44, 0x34, 0x7, 0x44, + 0x44, 0x1a, 0x7, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x8d, 0xbf, 0x8d, 0x12, 0xc6, 0x9a, 0xb4, 0xb4, + 0x57, 0x57, 0xb4, 0xbf, 0xf4, 0xb4, 0xe2, 0xbb, + 0xf4, 0xbf, 0xbf, 0xe4, 0xe4, 0x7, 0xe1, 0xbf, + 0xb4, 0xe1, 0xe4, 0xbf, 0xbf, 0xbf, 0xe4, 0xe4, + 0xbf, 0x84, 0xc6, 0xc6, 0xd8, 0x53, 0x53, 0x74, + 0x4b, 0x86, 0xf7, 0xdd, 0xce, 0x71, 0xf5, 0xf7, + 0x93, 0x2e, 0xb4, 0x86, 0xfa, 0xaf, 0x95, 0xbf, + 0xdd, 0x90, 0xe1, 0x8d, 0xfd, 0xa9, 0x39, 0xdf, + 0x32, 0xc0, 0xb4, 0xc6, 0xf5, 0x81, 0xb4, 0x93, + 0x4, 0x83, 0x9f, 0x3, 0xfe, 0x5e, 0x6, 0x34, + 0xa8, 0x69, 0xe4, 0xc5, 0x0, 0xb5, 0xfe, 0x2f, + 0x6f, 0x9d, 0x0, 0xa, 0x6, 0x34, 0x1, 0xf5, + 0x99, 0xe4, 0xab, 0xfe, 0x93, 0x4b, 0xe8, 0xb5, + 0x97, 0xff, 0x7f, 0x1a, 0x9c, 0xb9, 0x6, 0x0, + 0xfe, 0x8c, 0xa8, 0x4, 0x6, 0x27, 0x71, 0x93, + 0x6, 0xa9, 0xf4, 0x14, 0x0, 0xfb, 0xbb, 0x93, + 0xf3, 0xaf, 0x3d, 0x2f, 0x14, 0x14, 0xa8, 0x43, + 0x12, 0xb4, 0xbf, 0x93, 0xc0, 0x6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x32, 0xe0, 0x1a, 0x1a, 0xfe, + 0x49, 0xe2, 0x93, 0x3, 0x34, 0xd3, 0x34, 0xa5, + 0xf4, 0xe2, 0x2a, 0x34, 0xd3, 0x34, 0x75, 0xe2, + 0xe2, 0xe2, 0xf3, 0xf3, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0xb1, 0x1a, 0x1a, 0xfe, 0x1, + 0x44, 0x44, 0x57, 0x34, 0x94, 0x34, 0x51, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x0, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x9f, 0x1a, 0xfe, 0x94, 0x34, 0x18, + 0x44, 0x44, 0x44, 0x34, 0xa8, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x18, 0x34, 0x1a, 0xd3, 0x0, + 0x51, 0x1a, 0x44, 0x44, 0x51, 0xe6, 0x94, 0x34, + 0xa8, 0x44, 0xf4, 0x1a, 0xe6, 0x94, 0xe6, 0x9a, + 0x44, 0xd6, 0xd6, 0x44, 0x44, 0xf4, 0xab, 0x0, + 0xe6, 0xa8, 0xd6, 0x44, 0x7, 0xfe, 0xab, 0xe6, + 0x1a, 0xf4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x9a, + 0x0, 0x53, 0x44, 0x44, 0xf4, 0x0, 0x51, 0x44, + 0x44, 0xd6, 0xd6, 0x44, 0xd3, 0x9f, 0x44, 0x0, + 0x44, 0x9f, 0xd3, 0x44, 0x18, 0x34, 0xd3, 0xe6, + 0x2c, 0xe6, 0x57, 0xd3, 0x9f, 0x44, 0x44, 0x0, + 0x44, 0x44, 0x9f, 0xd3, 0x44, 0x51, 0x34, 0x94, + 0xfe, 0xa8, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x54, 0x84, 0x4, 0x6f, 0x9d, 0x5c, 0x6b, 0x93, + 0x8d, 0xe4, 0xf5, 0x99, 0xe4, 0xbf, 0x12, 0x93, + 0xf9, 0x90, 0xfd, 0x97, 0xde, 0x40, 0x7d, 0x6f, + 0xb4, 0xf3, 0x97, 0x6f, 0x99, 0xed, 0x4, 0x93, + 0xc6, 0x25, 0x25, 0x9c, 0x9b, 0x27, 0x27, 0x31, + 0x6a, 0x1e, 0x2e, 0xb1, 0xe0, 0x54, 0x9c, 0xc4, + 0x97, 0x97, 0x9, 0xed, 0x6f, 0x93, 0xb4, 0xc0, + 0x32, 0x27, 0x9f, 0xdd, 0x8e, 0x47, 0x39, 0x6f, + 0x6f, 0xf3, 0xe2, 0xf3, 0x6f, 0xfd, 0x81, 0x8e, + 0x4, 0x6b, 0x83, 0x93, 0x4, 0x3a, 0x8b, 0x1e, + 0x6f, 0x93, 0xf3, 0x32, 0x6b, 0xa5, 0x3e, 0x3, + 0x4, 0x47, 0x0, 0x6f, 0xef, 0x36, 0xe4, 0x97, + 0x6f, 0x12, 0x1, 0xa5, 0x93, 0xbd, 0x8b, 0x3, + 0x8e, 0x9, 0xc4, 0xc4, 0x4, 0x40, 0xb9, 0x69, + 0xf3, 0x1, 0x4e, 0x81, 0xf3, 0x8d, 0xf4, 0xc4, + 0xb2, 0x95, 0x95, 0xf4, 0xbf, 0xbb, 0xed, 0x8d, + 0xe2, 0x44, 0xf4, 0x81, 0xf4, 0xe2, 0xe2, 0xf4, + 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xbf, + 0xe2, 0xe2, 0xe2, 0xf4, 0xe2, 0xbf, 0x74, 0x71, + 0xe2, 0xf4, 0xf4, 0xf4, 0x9a, 0x15, 0x57, 0xbd, + 0xe2, 0x44, 0xe2, 0xe1, 0x74, 0xf4, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x9f, 0x57, 0x44, + 0x44, 0x44, 0x44, 0xf4, 0x9f, 0x9a, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0xf4, 0x9f, 0x9a, 0x44, + 0x44, 0x44, 0x44, 0xe6, 0x57, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x9f, 0x9f, 0xf4, + 0x44, 0x44, 0x44, 0x44, 0x44, 0xf4, 0xbc, 0x9a, + 0x44, 0x44, 0x44, 0x44, 0x57, 0xbc, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x7, 0xf4, 0x44, + 0x44, 0xa8, 0x51, 0x44, 0x44, 0x44, 0x9f, 0x57, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x9a, 0x9f, 0x44, + 0x44, 0xbc, 0xf4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x9a, 0x9f, + 0x57, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0x54, 0xa9, 0x3, 0x4, 0x28, 0x83, 0x6f, 0x97, + 0x12, 0xe4, 0x97, 0x6f, 0xc0, 0xe4, 0x93, 0x93, + 0xdd, 0x8b, 0x3, 0x8e, 0xbd, 0x81, 0x9c, 0x97, + 0xf3, 0xdd, 0x93, 0x93, 0x9c, 0xdd, 0x3, 0x32, + 0xdd, 0x9d, 0x3, 0x6c, 0x4, 0x6c, 0x28, 0x6f, + 0x9c, 0xff, 0xdd, 0xdd, 0x93, 0xdd, 0x69, 0xbd, + 0x69, 0xdd, 0xcd, 0xee, 0x9, 0x84, 0x7, 0xb4, + 0xf3, 0xf3, 0xbf, 0xbf, 0xf3, 0xc0, 0xe4, 0xe4, + 0xf3, 0x12, 0xe1, 0xe4, 0xc0, 0xc4, 0x74, 0xdd, + 0x93, 0xf3, 0xaf, 0xb4, 0xf3, 0xaf, 0xaf, 0xc0, + 0xf3, 0xe4, 0x57, 0x2e, 0xdd, 0xde, 0x9f, 0x83, + 0x6f, 0xce, 0x0, 0xf3, 0xf3, 0xbf, 0xb4, 0x81, + 0x27, 0xa8, 0xfe, 0x1e, 0xe4, 0xbf, 0x8d, 0xbd, + 0xbd, 0x8d, 0xe4, 0x9, 0xe4, 0x4e, 0xe6, 0x2f, + 0x49, 0x34, 0xb2, 0x85, 0xaf, 0xbf, 0xf4, 0xbf, + 0xb4, 0xb4, 0xe2, 0xf4, 0xbf, 0xe2, 0xf4, 0xbf, + 0xbf, 0x95, 0xe2, 0xbb, 0xbf, 0xf4, 0xf4, 0xf4, + 0xbf, 0xe2, 0xe2, 0xbf, 0xf4, 0xe2, 0xf4, 0xf4, + 0xf4, 0xe2, 0xbf, 0xe2, 0xbb, 0x44, 0xbf, 0xe2, + 0xf4, 0xf4, 0x12, 0xfd, 0x32, 0xf4, 0xf4, 0xf3, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, 0xe2, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x51, 0x52, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0xd6, 0x1a, 0xd6, + 0x49, 0x34, 0xf4, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xce, 0x9f, 0x54, 0x6f, 0xbd, 0x9, 0xc0, 0xf3, + 0xbf, 0xb4, 0xc4, 0x12, 0xe4, 0xe1, 0xc6, 0xe4, + 0xbb, 0xe4, 0xdd, 0xdd, 0xe4, 0xe4, 0xf3, 0xe4, + 0x95, 0xe1, 0x71, 0xb2, 0xe4, 0xb4, 0xf6, 0xc6, + 0xbf, 0xce, 0x69, 0xce, 0x9c, 0xdf, 0x26, 0x26, + 0xbd, 0xcc, 0xfa, 0xfa, 0xe4, 0xbf, 0xb0, 0xe4, + 0xfa, 0xc6, 0x7, 0xbb, 0xbf, 0xc6, 0x86, 0x8d, + 0xb4, 0xf4, 0xb4, 0xf4, 0x4b, 0xf4, 0x9a, 0xf4, + 0x9, 0xf9, 0xc6, 0xf4, 0x9a, 0xf4, 0xbf, 0xdf, + 0xe4, 0xe2, 0xb4, 0xbf, 0x4b, 0xfa, 0x7, 0x9a, + 0xb4, 0xb4, 0x4b, 0xc6, 0xbf, 0xbf, 0xb4, 0x83, + 0x39, 0x8d, 0xa3, 0x7, 0xc6, 0x90, 0x74, 0x57, + 0x18, 0x2c, 0x1e, 0x4b, 0xf3, 0xe4, 0xf4, 0xe1, + 0x90, 0x81, 0x70, 0x75, 0x85, 0xc6, 0x7f, 0xa6, + 0xc7, 0xde, 0xb4, 0x97, 0xb1, 0xdf, 0xe4, 0xf3, + 0xc0, 0xbf, 0xf4, 0x81, 0xc0, 0xbf, 0xf4, 0xf5, + 0x93, 0xbf, 0xbf, 0xbf, 0x12, 0xbf, 0x95, 0xc0, + 0x95, 0xe2, 0xe2, 0xbf, 0xbf, 0xe2, 0xbf, 0xe2, + 0xaf, 0xe2, 0x95, 0x93, 0xbf, 0xf4, 0xe2, 0x8e, + 0x8d, 0x20, 0x93, 0x69, 0xbb, 0x93, 0x93, 0x93, + 0x12, 0xe2, 0xf4, 0x12, 0xe2, 0xe2, 0x44, 0xdd, + 0xe2, 0x44, 0x44, 0x12, 0xf3, 0xbf, 0xc0, 0xbb, + 0xe2, 0x44, 0x44, 0xbb, 0x44, 0x44, 0x44, 0xe2, + 0xe2, 0x44, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0xa9, 0x3e, 0xf4, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x53, 0xd6, + 0x3e, 0xf4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xbb, 0x8d, 0x54, 0x39, 0xb4, 0xbf, 0x7, 0xc6, + 0x90, 0x74, 0x57, 0xb4, 0xb4, 0xe4, 0xdf, 0xf3, + 0xb4, 0xf4, 0xe1, 0x90, 0x81, 0xe1, 0x57, 0xe1, + 0x4b, 0x90, 0x90, 0xe4, 0xbf, 0xbf, 0xdf, 0xdf, + 0xbf, 0xb4, 0xde, 0x8b, 0x6a, 0x83, 0x39, 0x9d, + 0xb9, 0x9, 0x86, 0xc4, 0xff, 0x9, 0x75, 0xb4, + 0xf5, 0xc4, 0xf3, 0xbb, 0x12, 0x12, 0xf5, 0x12, + 0x93, 0xf3, 0xb4, 0xf8, 0xf5, 0xf3, 0x9a, 0xe1, + 0x12, 0xf3, 0xe4, 0xc0, 0xc0, 0xb4, 0xc6, 0xf5, + 0x93, 0xf3, 0x57, 0x57, 0xf5, 0xc0, 0xc6, 0xbd, + 0x93, 0xb4, 0xdd, 0x32, 0xf3, 0xdd, 0xe1, 0x8b, + 0x6b, 0xf3, 0xb4, 0x1e, 0x8e, 0x9c, 0xf3, 0x28, + 0x93, 0x12, 0xe2, 0x93, 0xf3, 0xb4, 0xe4, 0x3, + 0x6b, 0x93, 0xb9, 0x6b, 0x4, 0x12, 0xf3, 0x32, + 0x8e, 0xe4, 0xe4, 0xb9, 0x47, 0x6f, 0x81, 0xfd, + 0x97, 0xbb, 0xbf, 0x93, 0x93, 0x95, 0xbf, 0x93, + 0x97, 0xbf, 0xaf, 0xbf, 0x93, 0xb4, 0x8d, 0xbf, + 0xbb, 0xbb, 0xf4, 0x97, 0xbb, 0xe2, 0xbb, 0xbb, + 0xbf, 0xf4, 0xf4, 0x93, 0x95, 0xe2, 0x95, 0x93, + 0x93, 0xe2, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, + 0x12, 0xe2, 0xe2, 0x12, 0xe2, 0xe2, 0x44, 0xc0, + 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0xe2, 0xbf, 0xbb, + 0x44, 0x44, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xdd, 0x9a, 0x8b, 0x54, 0xf3, 0xb4, 0x1e, 0x8e, + 0xf5, 0xc0, 0xf5, 0x93, 0xf3, 0xe2, 0x93, 0xc0, + 0xb4, 0xe4, 0x3, 0x6b, 0x93, 0xde, 0x6b, 0x4, + 0xf3, 0x93, 0x4, 0x93, 0xe4, 0xc0, 0x69, 0xfd, + 0xbf, 0xf3, 0x47, 0x25, 0xe5, 0x6c, 0x6f, 0x28, + 0x9c, 0xff, 0xbd, 0xb1, 0x97, 0xbd, 0xe1, 0x69, + 0x69, 0xf3, 0xe4, 0x12, 0x69, 0x93, 0x9, 0xdd, + 0x9c, 0x32, 0xc6, 0xbd, 0x93, 0xf3, 0xc6, 0xf3, + 0x97, 0x93, 0xe4, 0x12, 0x97, 0x12, 0xb4, 0x40, + 0x4, 0xbd, 0xe1, 0x1e, 0x93, 0xf3, 0xe4, 0xf3, + 0x97, 0x12, 0xe4, 0xde, 0xfd, 0xf5, 0x57, 0xa9, + 0x3, 0x12, 0x81, 0x32, 0x97, 0xf3, 0xbd, 0x97, + 0x93, 0xf3, 0xaf, 0x26, 0x32, 0xc0, 0xc4, 0x3, + 0x28, 0xbd, 0xc4, 0x7b, 0x32, 0xf3, 0x95, 0x8d, + 0xff, 0x8d, 0x85, 0xf6, 0xe1, 0xbf, 0xf4, 0xbf, + 0xbf, 0xbf, 0xf4, 0xe2, 0x95, 0xe2, 0xe2, 0x95, + 0xb4, 0x44, 0xf4, 0xb4, 0xe2, 0xf4, 0xe2, 0xe2, + 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, 0xe2, + 0xf4, 0xf4, 0xe2, 0x44, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0xf4, 0xf4, 0x20, 0xe2, 0xe2, 0xe2, + 0xe2, 0xe2, 0x44, 0xe2, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, + 0xc4, 0x7, 0xa9, 0x3, 0x12, 0xb2, 0x32, 0x69, + 0xc0, 0xbd, 0x69, 0x93, 0x12, 0x12, 0x8e, 0x32, + 0xf3, 0x81, 0x3, 0x47, 0x9, 0xf5, 0x6f, 0x4, + 0x12, 0xf3, 0x93, 0x4, 0xdf, 0xdd, 0xfd, 0x9d, + 0xc6, 0x81, 0x47, 0x6b, 0x93, 0x97, 0x97, 0x6f, + 0x9c, 0xff, 0xce, 0x93, 0xf3, 0x7b, 0xed, 0x70, + 0xbd, 0xf3, 0xf8, 0x86, 0x9c, 0xc0, 0xc6, 0xb2, + 0xf5, 0x99, 0xc6, 0xbf, 0xc0, 0xe4, 0x4b, 0xdf, + 0x12, 0xf3, 0xe4, 0x75, 0xdf, 0x81, 0xe1, 0xe1, + 0xf3, 0x81, 0xdf, 0xb4, 0xbb, 0xbf, 0x95, 0xdf, + 0x9c, 0xbf, 0xb4, 0xcf, 0x8b, 0x90, 0xed, 0xc6, + 0x81, 0xe4, 0x4b, 0xf5, 0xf3, 0xbf, 0xbf, 0xb2, + 0x8b, 0xe2, 0xb4, 0xe1, 0x81, 0xdf, 0xdf, 0xf3, + 0x69, 0xbf, 0xc6, 0x99, 0x99, 0xb2, 0x70, 0xe1, + 0x75, 0x70, 0xfa, 0xb2, 0xbf, 0xe2, 0xf4, 0xe2, + 0xf9, 0xe2, 0xe2, 0xbf, 0xb4, 0xbb, 0xfc, 0xb4, + 0xb4, 0xbf, 0xe2, 0x4b, 0xb4, 0xf4, 0xe2, 0xe2, + 0xbb, 0xf4, 0x95, 0xf4, 0xf4, 0xf4, 0xf4, 0xbb, + 0xf4, 0xe2, 0xe2, 0xf4, 0xf4, 0xe2, 0xe2, 0xe2, + 0xf4, 0x9a, 0xc0, 0x12, 0xcd, 0xf4, 0xe2, 0x12, + 0xe2, 0x44, 0xe2, 0xe2, 0xe2, 0xe2, 0x44, 0xe2, + 0x44, 0xe2, 0xe2, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xe2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44 +}; + +static GClut splashimage0_clut = { 256, 0, -1, + 0x20202, 0x5a5243, 0x968e3a, 0xbebe86, 0xeed67b, 0x722a22, 0x3f392f, 0xced6ce, + 0x866232, 0xf4e4b5, 0x2a1a12, 0x7a96b6, 0x425ab6, 0x8e62ae, 0xae8e4b, 0x423a8e, + 0xfe0202, 0xceb64b, 0xf9eab5, 0xb78d9c, 0x79714d, 0xcbb494, 0x521212, 0x3a2a62, + 0xb5a7ae, 0xce9e42, 0x323130, 0xb67a42, 0x4a2a1a, 0x525286, 0xd6bd9e, 0x523a6a, + 0xfbf2c7, 0x8a6543, 0x84728a, 0x1a020a, 0x523a32, 0xbfa68d, 0xe8d697, 0xbea686, + 0xdcc28f, 0x421a1a, 0x9c948e, 0x5a7ac6, 0x6b7264, 0x967734, 0xe7dbb5, 0x726a42, + 0x864a22, 0xcb958d, 0xeede96, 0x865296, 0x11100f, 0xb29686, 0xd8c8a0, 0x321a32, + 0x966294, 0xd69e9e, 0xa6b68e, 0x612219, 0x6262ae, 0xc8bda4, 0x918f83, 0x68628e, + 0xc6aeae, 0x524222, 0xa67232, 0xab9e74, 0xfefefe, 0x903425, 0xa6e69e, 0xd5be85, + 0x8686a6, 0x5a5a5a, 0xd6ae4a, 0xe6b6be, 0x8f5e60, 0x3a222a, 0x867272, 0xb68686, + 0x7a8563, 0x9d9ea6, 0x4a4a5a, 0xa6b6b6, 0xdab49f, 0x422a4a, 0x624a8e, 0xc7cece, + 0x62422a, 0x86525a, 0x8e6a4a, 0xae5a3a, 0xae7a9e, 0x8e9e62, 0x2e2924, 0x424a9e, + 0x856959, 0x2f2242, 0x32221a, 0xbe9642, 0x584953, 0x5a324a, 0x3a324a, 0x6a5a33, + 0x723a32, 0xf5e49c, 0xdaa386, 0xd6ad86, 0xe6ce6a, 0x422222, 0xbe8e52, 0xe6be85, + 0xe9d4c1, 0xd6c9b8, 0x817c6a, 0x9e6232, 0xb7b6be, 0xcec6c6, 0x221222, 0xa69662, + 0x2a1a22, 0x96863a, 0x8e865a, 0xebc891, 0xb69686, 0xd69686, 0xa38285, 0x9e868e, + 0x727ab6, 0xe6c6b5, 0x4a2a32, 0xd5ae9e, 0xdad4bb, 0xe4dbc3, 0xe7b9b6, 0x623a32, + 0xb6969e, 0xae6a2a, 0x5a321a, 0xbda69d, 0x594a3a, 0xeae3ce, 0xe6ce96, 0xcf9e62, + 0xd6aeae, 0x62728e, 0x525aa6, 0xf6e696, 0x423b4b, 0xf8ebc2, 0xae6a4a, 0xf6de8e, + 0x8e9e8e, 0xe5ad96, 0xdeded6, 0xcbc991, 0xe8bd8d, 0xbebe9d, 0x6a3a6a, 0xbebeb8, + 0x964a2a, 0x655a50, 0x9e9ec6, 0x7b7167, 0x863a32, 0x928153, 0x72524a, 0x523a52, + 0x69625b, 0xa4a491, 0x524a9e, 0x494242, 0x322a32, 0x8e3a42, 0x987257, 0xfce6be, + 0xe8ded2, 0xf3d8a0, 0xe8ceb8, 0x6a4a3a, 0xeedece, 0x422a22, 0x42327a, 0x523a86, + 0x7a6286, 0xded5a7, 0x8eaece, 0xf5ebd2, 0xb6c6ce, 0xeedead, 0x422232, 0xf6e6ce, + 0xfee6ae, 0x7262ae, 0xbe8663, 0x723a4a, 0xe9c6a2, 0xa68e52, 0xe6c6be, 0x7e705e, + 0xc7c5a9, 0x9e625a, 0xe8a78e, 0xb6a6c6, 0xfad6ce, 0xf6d6ce, 0xf2d9b4, 0xa6c6b6, + 0x9e86be, 0x221212, 0xa68e42, 0x424233, 0xae6a62, 0xcea65b, 0x827d7f, 0xd6be62, + 0xceceae, 0xbe8e62, 0x622a22, 0x97a7af, 0x8686be, 0xf3deaa, 0xe7d6ac, 0xedb6ac, + 0xe7ce78, 0xded6c8, 0xfef6ed, 0x42322a, 0xeedec6, 0xdebe6a, 0x222222, 0x96864a, + 0x9c8571, 0x9e8652, 0x7a96ce, 0x9e86a6, 0xb1613f, 0xf2c5b1, 0xfeeece, 0xc5a664, + 0xae6a3a, 0x8e7232, 0x221232, 0xf6e6ad, 0xeeeede, 0xe6be9e, 0xceb6bc, 0xf5cec3, + 0xeec6b5, 0xeaaeb6, 0xe6bec5, 0xad917c, 0xe6acb2, 0xd7ce96, 0x1f1e19, 0xe8cea0 }; + +static struct _GImage splashimage0_base = { + it_index, + 15420,379,375,379, + (uint8 *) splashimage0_data, + &splashimage0_clut, + 0xffffffff +}; + +GImage splashimage = { 0, &splashimage0_base }; diff --git a/fontforge/splinefill.c b/fontforge/splinefill.c new file mode 100644 index 00000000..01e1c32b --- /dev/null +++ b/fontforge/splinefill.c @@ -0,0 +1,1757 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include "gdraw.h" +#include "splinefont.h" +#include "edgelist.h" + +static void HintsFree(Hints *h) { + Hints *hnext; + for ( ; h!=NULL; h = hnext ) { + hnext = h->next; + free(h); + } +} + +static void _FreeEdgeList(EdgeList *es) { + int i; + + /* edges will be NULL if the user tries to make an enormous bitmap */ + /* if the linear size is bigger than several thousand, we just */ + /* ignore the request */ + if ( es->edges!=NULL ) { + for ( i=0; icnt; ++i ) { + Edge *e, *next; + for ( e = es->edges[i]; e!=NULL; e = next ) { + next = e->esnext; + free(e); + } + es->edges[i] = NULL; + } + } +} + +void FreeEdges(EdgeList *es) { + _FreeEdgeList(es); + free(es->edges); + free(es->interesting); + HintsFree(es->hhints); + HintsFree(es->vhints); +} + +double IterateSplineSolve(Spline1D *sp, double tmin, double tmax, + double sought,double err) { + double t, low, high, test; + Spline1D temp; + int cnt; + + /* Now the closed form CubicSolver can have rounding errors so if we know */ + /* the spline to be monotonic, an iterative approach is more accurate */ + + temp = *sp; + temp.d -= sought; + + low = ((temp.a*tmin+temp.b)*tmin+temp.c)*tmin+temp.d; + high = ((temp.a*tmax+temp.b)*tmax+temp.c)*tmax+temp.d; + if ( low-err ) +return(tmin); + if ( high-err ) +return(tmax); + if (( low<0 && high>0 ) || + ( low>0 && high<0 )) { + + for ( cnt=0; cnt<1000; ++cnt ) { /* Avoid impossible error limits */ + t = (tmax+tmin)/2; + test = ((temp.a*t+temp.b)*t+temp.c)*t+temp.d; + if ( test>-err && test0 && test>0) ) + tmin=t; + else + tmax = t; + } +return( (tmax+tmin)/2 ); + } +return( -1 ); +} + +double TOfNextMajor(Edge *e, EdgeList *es, double sought_m ) { + /* We want to find t so that Mspline(t) = sought_m */ + /* the curve is monotonic */ + Spline1D *msp = &e->spline->splines[es->major]; + double new_t; + + if ( es->is_overlap ) { + + /* if we've adjusted the height then we won't be able to find it restricting */ + /* t between [0,1] as we do. So it's a special case. (this is to handle */ + /* hstem hints) */ + if ( e->max_adjusted && sought_m==e->mmax ) { + e->m_cur = sought_m; +return( e->up?1.0:0.0 ); + } + + new_t = IterateSplineSolve(msp,e->t_mmin,e->t_mmax,(sought_m+es->mmin)/es->scale,.001); + if ( new_t==-1 ) + GDrawIError( "No Solution"); + e->m_cur = (((msp->a*new_t + msp->b)*new_t+msp->c)*new_t + msp->d)*es->scale - es->mmin; +return( new_t ); + } else { + Spline *sp = e->spline; + + if ( sp->islinear ) { + new_t = e->t_cur + (sought_m-e->m_cur)/(es->scale * msp->c); + e->m_cur = (msp->c*new_t + msp->d)*es->scale - es->mmin; +return( new_t ); + } + /* if we have a spline that is nearly horizontal at its max. endpoint */ + /* then finding A value of t for which y has the right value isn't good */ + /* enough (at least not when finding intersections) */ + if ( sought_m+1>e->mmax ) { + e->m_cur = e->mmax; +return( e->t_mmax ); + } + + /* if we've adjusted the height then we won't be able to find it restricting */ + /* t between [0,1] as we do. So it's a special case. (this is to handle */ + /* hstem hints) */ + if ( e->max_adjusted && sought_m==e->mmax ) { + e->m_cur = sought_m; +return( e->up?1.0:0.0 ); + } + new_t = IterateSplineSolve(msp,e->t_mmin,e->t_mmax,(sought_m+es->mmin)/es->scale,.001); + if ( new_t==-1 ) + GDrawIError( "No Solution"); + e->m_cur = (((msp->a*new_t + msp->b)*new_t+msp->c)*new_t + msp->d)*es->scale - es->mmin; +return( new_t ); + } +} + +static int SlopeLess(Edge *e, Edge *p, int other) { + Spline1D *osp = &e->spline->splines[other]; + Spline1D *psp = &p->spline->splines[other]; + Spline1D *msp = &e->spline->splines[!other]; + Spline1D *qsp = &p->spline->splines[!other]; + real os = (3*osp->a*e->t_cur+2*osp->b)*e->t_cur+osp->c, + ps = (3*psp->a*p->t_cur+2*psp->b)*p->t_cur+psp->c; + real ms = (3*msp->a*e->t_cur+2*msp->b)*e->t_cur+msp->c, + qs = (3*qsp->a*p->t_cur+2*qsp->b)*p->t_cur+qsp->c; + if ( ms<.0001 && ms>-.0001 ) ms = 0; + if ( qs<.0001 && qs>-.0001 ) qs = 0; + if ( qs==0 ) { + if ( p->t_cur==1 ) { + qs = (3*qsp->a*.9999+2*qsp->b)*.9999+qsp->c; + ps = (3*psp->a*.9999+2*psp->b)*.9999+psp->c; + } else { + qs = (3*qsp->a*(p->t_cur+.0001)+2*qsp->b)*(p->t_cur+.0001)+qsp->c; + ps = (3*psp->a*(p->t_cur+.0001)+2*psp->b)*(p->t_cur+.0001)+psp->c; + } + } + if ( ms==0 ) { + if ( e->t_cur==1 ) { + ms = (3*msp->a*.9999+2*msp->b)*.9999+msp->c; + os = (3*osp->a*.9999+2*osp->b)*.9999+osp->c; + } else { + ms = (3*msp->a*(e->t_cur+.0001)+2*msp->b)*(e->t_cur+.0001)+msp->c; + os = (3*osp->a*(e->t_cur+.0001)+2*osp->b)*(e->t_cur+.0001)+osp->c; + } + } + if ( e->t_cur-e->tmin > e->tmax-e->t_cur ) { os = -os; ms = -ms; } + if ( p->t_cur-p->tmin > p->tmax-p->t_cur ) { ps = -ps; qs = -qs; } + if ( ms!=0 && qs!=0 ) { os /= ms; ps /= qs; } + else if ( ms==0 && qs==0 ) /* Do Nothing */; + else if ( (ms==0 && os>0) || (qs==0 && ps<0) ) /* Does this make sense? */ +return( false ); + else if ( (ms==0 && os<0) || (qs==0 && ps>0) ) /* Does this make sense? */ +return( true ); + + if ( os==ps || ms==0 || qs==0 ) +return( e->o_mmaxo_mmax ); + +return( ossplines[es->major], *osp = &sp->splines[es->other]; + + e = gcalloc(1,sizeof(Edge)); + e->spline = sp; + + m1 = ( ((msp->a*tmin+msp->b)*tmin+msp->c)*tmin + msp->d ) * es->scale; + m2 = ( ((msp->a*tmax+msp->b)*tmax+msp->c)*tmax + msp->d ) * es->scale; + if ( m1>m2 ) { + e->mmin = m2; + e->t_mmin = tmax; + e->mmax = m1; + e->t_mmax = tmin; + e->up = false; + } else { + e->mmax = m2; + e->t_mmax = tmax; + e->mmin = m1; + e->t_mmin = tmin; + e->up = true; + } + if ( RealNear(e->mmin,es->mmin)) e->mmin = es->mmin; + e->o_mmin = ( ((osp->a*e->t_mmin+osp->b)*e->t_mmin+osp->c)*e->t_mmin + osp->d ) * es->scale; + e->o_mmax = ( ((osp->a*e->t_mmax+osp->b)*e->t_mmax+osp->c)*e->t_mmax + osp->d ) * es->scale; + e->mmin -= es->mmin; e->mmax -= es->mmin; + e->t_cur = e->t_mmin; + e->o_cur = e->o_mmin; + e->m_cur = e->mmin; + e->last_opos = e->last_mpos = -2; + e->tmin = tmin; e->tmax = tmax; + + if ( e->mmin<0 || e->mmin>=e->mmax ) { + /*GDrawIError("Probably not serious, but we've got a zero length spline in AddEdge in %s",es->sc==NULL?:es->sc->name);*/ + free(e); +return; + } + + if ( es->sc!=NULL ) for ( hint=es->hhints; hint!=NULL; hint=hint->next ) { + if ( hint->adjustb ) { + if ( e->m_cur>hint->b1 && e->m_curb2 ) { + e->m_cur = e->mmin = hint->ab; + e->min_adjusted = true; + } else if ( e->mmax>hint->b1 && e->mmaxb2 ) { + e->mmax = hint->ab; + e->max_adjusted = true; + } + } else if ( hint->adjuste ) { + if ( e->m_cur>hint->e1 && e->m_cure2 ) { + e->m_cur = e->mmin = hint->ae; + e->min_adjusted = true; + } else if ( e->mmax>hint->e1 && e->mmaxe2 ) { + e->mmax = hint->ae; + e->max_adjusted = true; + } + } + } + + mpos = (int) ceil(e->m_cur); + if ( mpos>e->mmax ) { + free(e); +return; + } + + if ( e->m_cur!=ceil(e->m_cur) ) { + /* bring the new edge up to its first scan line */ + e->t_cur = TOfNextMajor(e,es,ceil(e->m_cur)); + e->o_cur = ( ((osp->a*e->t_cur+osp->b)*e->t_cur+osp->c)*e->t_cur + osp->d ) * es->scale; + } + + e->before = es->last; + if ( es->last!=NULL ) + es->last->after = e; + if ( es->last==NULL ) + es->splinesetfirst = e; + es->last = e; + + if ( es->edges[mpos]==NULL || e->o_curedges[mpos]->o_cur || + (e->o_cur==es->edges[mpos]->o_cur && SlopeLess(e,es->edges[mpos],es->other))) { + e->esnext = es->edges[mpos]; + es->edges[mpos] = e; + } else { + for ( pr=es->edges[mpos]; pr->esnext!=NULL && pr->esnext->o_curo_cur ; + pr = pr->esnext ); + /* When two splines share a vertex which is a local minimum, then */ + /* o_cur will be equal for both (to the vertex's o value) and so */ + /* the above code randomly picked one to go first. That screws up */ + /* the overlap code, which wants them properly ordered from the */ + /* start. so look at the end point, nope the end point isn't always */ + /* meaningful, look at the slope... */ + if ( pr->esnext!=NULL && pr->esnext->o_cur==e->o_cur && + SlopeLess(e,pr->esnext,es->other)) { + pr = pr->esnext; + } + e->esnext = pr->esnext; + pr->esnext = e; + } + if ( es->interesting ) { + /* Mark the other end of the spline as interesting */ + es->interesting[(int) ceil(e->mmax)]=1; + } +} + +static void AddMajorEdge(EdgeList *es, Spline *sp) { + Edge *e, *pr; + real m1; + Spline1D *msp = &sp->splines[es->major], *osp = &sp->splines[es->other]; + + e = gcalloc(1,sizeof(Edge)); + e->spline = sp; + + e->mmin = e->mmax = m1 = msp->d * es->scale - es->mmin; + e->t_mmin = 0; + e->t_mmax = 1; + e->up = false; + e->o_mmin = osp->d * es->scale; + e->o_mmax = ( osp->a + osp->b + osp->c + osp->d ) * es->scale; + if ( e->o_mmin == e->o_mmax ) { /* Just a point? */ + free(e); +return; + } + if ( e->mmin<0 ) + GDrawIError("Grg!"); + + if ( ceil(e->m_cur)>e->mmax ) { + free(e); +return; + } + + if ( es->majors==NULL || es->majors->mmin>=m1 ) { + e->esnext = es->majors; + es->majors = e; + } else { + for ( pr=es->majors; pr->esnext!=NULL && pr->esnext->mminesnext ); + e->esnext = pr->esnext; + pr->esnext = e; + } +} + +static void AddSpline(EdgeList *es, Spline *sp ) { + real t1=2, t2=2, t; + real b2_fourac; + real fm, tm; + Spline1D *msp = &sp->splines[es->major], *osp = &sp->splines[es->other]; + + /* Find the points of inflection on the curve discribing y behavior */ + if ( !RealNear(msp->a,0) ) { + /* cubic, possibly 2 inflections (possibly none) */ + b2_fourac = 4*msp->b*msp->b - 12*msp->a*msp->c; + if ( b2_fourac>=0 ) { + b2_fourac = sqrt(b2_fourac); + t1 = (-2*msp->b - b2_fourac) / (6*msp->a); + t2 = (-2*msp->b + b2_fourac) / (6*msp->a); + if ( t1>t2 ) { real temp = t1; t1 = t2; t2 = temp; } + else if ( t1==t2 ) t2 = 2.0; + + /* check for curves which have such a small slope they might */ + /* as well be horizontal */ + fm = es->major==1?sp->from->me.y:sp->from->me.x; + tm = es->major==1?sp->to->me.y:sp->to->me.x; + if ( fm==tm ) { + real m1, m2, d1, d2; + m1 = m2 = fm; + if ( t1>0 && t1<1 ) + m1 = ((msp->a*t1+msp->b)*t1+msp->c)*t1 + msp->d; + if ( t2>0 && t2<1 ) + m2 = ((msp->a*t2+msp->b)*t2+msp->c)*t2 + msp->d; + d1 = (m1-fm)*es->scale; + d2 = (m2-fm)*es->scale; + if ( d1>-.5 && d1<.5 && d2>-.5 && d2<.5 ) { + sp->ishorvert = true; + if ( es->genmajoredges ) + AddMajorEdge(es,sp); +return; /* Pretend it's horizontal, ignore it */ + } + } + } + } else if ( !RealNear(msp->b,0) ) { + /* Quadratic, at most one inflection */ + t1 = -msp->c/(2.0*msp->b); + } else if ( !RealNear(msp->c,0) ) { + /* linear, no points of inflection */ + } else { + sp->ishorvert = true; + if ( es->genmajoredges ) + AddMajorEdge(es,sp); +return; /* Horizontal line, ignore it */ + } + + if ( RealNear(t1,0)) t1=0; + if ( RealNear(t1,1)) t1=1; + if ( RealNear(t2,0)) t2=0; + if ( RealNear(t2,1)) t2=1; + if ( RealNear(t1,t2)) t2=2; + t=0; + if ( t1>0 && t1<1 ) { + AddEdge(es,sp,0,t1); + t = t1; + } + if ( t2>0 && t2<1 ) { + AddEdge(es,sp,t,t2); + t = t2; + } + AddEdge(es,sp,t,1.0); + if ( es->interesting ) { + /* Also store up points of inflection in X as interesting (we got the endpoints, just internals now)*/ + double ot1, ot2; + int mpos; + SplineFindExtrema(osp,&ot1,&ot2); + if ( ot1>0 && ot1<1 ) { + mpos = (int) ceil( ( ((msp->a*ot1+msp->b)*ot1+msp->c)*ot1+msp->d )*es->scale-es->mmin ); + es->interesting[mpos] = 1; + } + if ( ot2>0 && ot2<1 ) { + mpos = (int) ceil( ( ((msp->a*ot2+msp->b)*ot2+msp->c)*ot2+msp->d )*es->scale-es->mmin ); + es->interesting[mpos] = 1; + } + } +} + +void FindEdgesSplineSet(SplinePointList *spl, EdgeList *es) { + Spline *spline, *first; + + for ( ; spl!=NULL; spl = spl->next ) if ( spl->first->prev!=NULL && spl->first->prev->from!=spl->first ) { + first = NULL; + es->last = es->splinesetfirst = NULL; + /* Set so there is no previous point!!! */ + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + AddSpline(es,spline); + if ( first==NULL ) first = spline; + } + if ( es->last!=NULL ) { + es->splinesetfirst->before = es->last; + es->last->after = es->splinesetfirst; + } + } +} + +static void FindEdges(SplineChar *sc, EdgeList *es) { + RefChar *rf; + + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + FindEdgesSplineSet(rf->layers[0].splines,es); + + FindEdgesSplineSet(sc->layers[ly_fore].splines,es); +} + +Edge *ActiveEdgesInsertNew(EdgeList *es, Edge *active,int i) { + Edge *apt, *pr, *npt; + + for ( pr=NULL, apt=active, npt=es->edges[(int) i]; apt!=NULL && npt!=NULL; ) { + if ( npt->o_curo_cur ) { + npt->aenext = apt; + if ( pr==NULL ) + active = npt; + else + pr->aenext = npt; + pr = npt; + npt = npt->esnext; + } else { + pr = apt; + apt = apt->aenext; + } + } + while ( npt!=NULL ) { + npt->aenext = NULL; + if ( pr==NULL ) + active = npt; + else + pr->aenext = npt; + pr = npt; + npt = npt->esnext; + } +return( active ); +} + +Edge *ActiveEdgesRefigure(EdgeList *es, Edge *active,real i) { + Edge *apt, *pr; + int any; + + /* first remove any entry which doesn't intersect the new scan line */ + /* (ie. stopped on last line) */ + for ( pr=NULL, apt=active; apt!=NULL; apt = apt->aenext ) { + if ( apt->mmaxaenext; + else + pr->aenext = apt->aenext; + } else + pr = apt; + } + /* then move the active list to the next line */ + for ( apt=active; apt!=NULL; apt = apt->aenext ) { + Spline1D *osp = &apt->spline->splines[es->other]; + apt->t_cur = TOfNextMajor(apt,es,i); + apt->o_cur = ( ((osp->a*apt->t_cur+osp->b)*apt->t_cur+osp->c)*apt->t_cur + osp->d ) * es->scale; + } + /* reorder list */ + if ( active!=NULL ) { + any = true; + while ( any ) { + any = false; + for ( pr=NULL, apt=active; apt->aenext!=NULL; ) { + if ( apt->o_cur <= apt->aenext->o_cur ) { + /* still ordered */; + pr = apt; + apt = apt->aenext; + } else if ( pr==NULL ) { + active = apt->aenext; + apt->aenext = apt->aenext->aenext; + active->aenext = apt; + /* don't need to set any, since this reorder can't disorder the list */ + pr = active; + } else { + pr->aenext = apt->aenext; + apt->aenext = apt->aenext->aenext; + pr->aenext->aenext = apt; + any = true; + pr = pr->aenext; + } + } + } + } + /* Insert new nodes */ + active = ActiveEdgesInsertNew(es,active,i); +return( active ); +} + +Edge *ActiveEdgesFindStem(Edge *apt, Edge **prev, real i) { + int cnt=apt->up?1:-1; + Edge *pr, *e; + + for ( pr=apt, e=apt->aenext; e!=NULL && cnt!=0; pr=e, e=e->aenext ) { + if ( pr->up!=e->up ) + cnt += (e->up?1:-1); + else if ( (pr->before==e || pr->after==e ) && + (( pr->mmax==i && e->mmin==i ) || + ( pr->mmin==i && e->mmax==i )) ) + /* This just continues the line and doesn't change count */; + else + cnt += (e->up?1:-1); + } + /* color a horizontal line that comes out of the last vertex */ + if ( e!=NULL && (e->before==pr || e->after==pr) && + (( pr->mmax==i && e->mmin==i ) || + ( pr->mmin==i && e->mmax==i )) ) { + pr = e; + e = e->aenext; + } else if ( e!=NULL && ((pr->up && !e->up) || (!pr->up && e->up)) && + pr->spline!=e->spline && + ((pr->after==e && pr->spline->to->next!=NULL && + pr->spline->to->next!=e->spline && + pr->spline->to->next->to->next==e->spline ) || + (pr->before==e && pr->spline->from->prev!=NULL && + pr->spline->from->prev!=e->spline && + pr->spline->from->prev->from->prev!=e->spline )) && + ((pr->mmax == i && e->mmax==i ) || + (pr->mmin == i && e->mmin==i )) ) { + pr = e; + } + *prev = pr; +return( e ); +} + +static int isvstem(EdgeList *es,real stem,int *vval) { + Hints *hint; + + for ( hint=es->vhints; hint!=NULL ; hint=hint->next ) { + if ( stem>=hint->b1 && stem<=hint->b2 ) { + *vval = hint->ab; +return( true ); + } else if ( stem>=hint->e1 && stem<=hint->e2 ) { + *vval = hint->ae; +return( true ); + } + } +return( false ); +} + +static void FillChar(EdgeList *es) { + Edge *active=NULL, *apt, *pr, *e, *prev; + int i, k, end, width, oldk; + uint8 *bpt; + + for ( i=0; icnt; ++i ) { + active = ActiveEdgesRefigure(es,active,i); + + /* process scanline */ + bpt = es->bitmap+((es->cnt-1-i)*es->bytes_per_line); + for ( apt=active; apt!=NULL; ) { + e = ActiveEdgesFindStem(apt,&prev,i); + pr = prev; + width = rint(pr->o_cur-apt->o_cur); + if ( width<=0 ) width=1; + k=rint(apt->o_cur-es->omin); + end =rint(pr->o_cur-es->omin); + if ( end-k > width-1 ) { + int kval = -999999, eval= -999999; + if ( isvstem(es,apt->o_cur,&kval) ) + k = kval; + if ( isvstem(es,pr->o_cur,&eval)) + end = eval; + if ( end-k > width-1 ) { + if ( k!=kval && (end==eval || (apt->o_cur-es->omin)-k > end-(pr->o_cur-es->omin) )) + ++k; + else if ( end!=eval ) + --end; + } + } + oldk = k; + if ( apt->last_mpos==i-1 || pr->last_mpos==i-1 ) { + int lx1=apt->last_opos, lx2=pr->last_opos; + if ( apt->last_mpos!=i-1 ) lx1 = lx2; + else if ( pr->last_mpos!=i-1 ) lx2 = lx1; + if ( lx1>lx2 ) { int temp = lx1; lx1=lx2; lx2=temp; } + if ( lx2>3)+es->bytes_per_line] |= (1<<(7-(lx2&7))); + for ( ; lx2>3)] |= (1<<(7-(lx2&7))); + } else if ( lx1>end+1 ) { + int mid = (lx1+end)/2; + for ( ; lx1>3)+es->bytes_per_line] |= (1<<(7-(lx1&7))); + for ( ; lx1>3)] |= (1<<(7-(lx1&7))); + } + } + for ( ; k<=end; ++k ) + bpt[k>>3] |= (1<<(7-(k&7))); + apt->last_mpos = pr->last_mpos = i; + apt->last_opos = oldk; + pr->last_opos = end; + apt = e; + } + } +} + +static void InitializeHints(SplineChar *sc, EdgeList *es) { + Hints *hint, *last; + StemInfo *s; + real t1, t2; + int k,end,width; + + /* we only care about hstem hints, and only if they fail to cross a */ + /* vertical pixel boundary. If that happens, adjust either the top */ + /* or bottom position so that a boundary forcing is crossed. Any */ + /* vertexes at those points will be similarly adjusted later... */ + + last = NULL; es->hhints = NULL; + for ( s=sc->hstem; s!=NULL; s=s->next ) { + hint = gcalloc(1,sizeof(Hints)); + hint->base = s->start; hint->width = s->width; + if ( last==NULL ) es->hhints = hint; + else last->next = hint; + last = hint; + hint->adjuste = hint->adjustb = false; + t1 = hint->base*es->scale -es->mmin; + t2 = (hint->base+hint->width)*es->scale -es->mmin; + if ( floor(t1)==floor(t2) && t1!=floor(t1) && t2!=floor(t2) ) { + if ( t1 ceil(t2)-t2 ) { + hint->adjuste = true; + hint->ae = ceil(t2); + } else { + hint->adjustb = true; + hint->ab = floor(t1); + } + } else { + if ( t2-floor(t2) > ceil(t1)-t1 ) { + hint->adjustb = true; + hint->ab = ceil(t1); + } else { + hint->adjuste = true; + hint->ae = floor(t2); + } + } + } + hint->b1 = t1-.2; hint->b2 = t1 + .2; + hint->e1 = t2-.2; hint->e2 = t2 + .2; + } + + /* Nope. We care about vstems too now, but in a different case */ + last = NULL; es->vhints = NULL; + for ( s=sc->vstem; s!=NULL; s=s->next ) { + hint = gcalloc(1,sizeof(Hints)); + hint->base = s->start; hint->width = s->width; + if ( last==NULL ) es->vhints = hint; + else last->next = hint; + last = hint; + if ( hint->width<0 ) { + width = -rint(-hint->width*es->scale); + t1 = (hint->base+hint->width)*es->scale; + t2 = hint->base*es->scale; + } else { + width = rint(hint->width*es->scale); + t1 = hint->base*es->scale; + t2 = (hint->base+hint->width)*es->scale; + } + k = rint(t1-es->omin); end = rint(t2-es->omin); + if ( end-k > width-1 ) + if ( end-k > width-1 ) { + if ( (t1-es->omin)-k > end-(t2-es->omin) ) + ++k; + else + --end; + } + hint->ab = k; hint->ae = end; + hint->b1 = t1-.2; hint->b2 = t1 + .2; + hint->e1 = t2-.2; hint->e2 = t2 + .2; + } +} + +/* After a bitmap has been compressed, it's sizes may not comply with the */ +/* expectations for saving images */ +void BCRegularizeBitmap(BDFChar *bdfc) { + int bpl =(bdfc->xmax-bdfc->xmin)/8+1; + int i; + + if ( bdfc->bytes_per_line!=bpl ) { + uint8 *bitmap = galloc(bpl*(bdfc->ymax-bdfc->ymin+1)); + for ( i=0; i<=(bdfc->ymax-bdfc->ymin); ++i ) + memcpy(bitmap+i*bpl,bdfc->bitmap+i*bdfc->bytes_per_line,bpl); + free(bdfc->bitmap); + bdfc->bitmap= bitmap; + bdfc->bytes_per_line = bpl; + } +} + +void BCRegularizeGreymap(BDFChar *bdfc) { + int bpl = bdfc->xmax-bdfc->xmin+1; + int i; + + if ( bdfc->bytes_per_line!=bpl ) { + uint8 *bitmap = galloc(bpl*(bdfc->ymax-bdfc->ymin+1)); + for ( i=0; i<=(bdfc->ymax-bdfc->ymin); ++i ) + memcpy(bitmap+i*bpl,bdfc->bitmap+i*bdfc->bytes_per_line,bpl); + free(bdfc->bitmap); + bdfc->bitmap= bitmap; + bdfc->bytes_per_line = bpl; + } +} + +void BCCompressBitmap(BDFChar *bdfc) { + /* Now we may have allocated a bit more than we need to the bitmap */ + /* check to see if there are any unused rows or columns.... */ + int i,j,any, off, last; + + /* we can use the same code to lop off rows whether we deal with bytes or bits */ + for ( i=0; iymax-bdfc->ymin; ++i ) { + any = 0; + for ( j=0; jbytes_per_line; ++j ) + if ( bdfc->bitmap[i*bdfc->bytes_per_line+j]!=0 ) any = 1; + if ( any ) + break; + } + if ( i!=0 ) { + bdfc->ymax -= i; + memmove(bdfc->bitmap,bdfc->bitmap+i*bdfc->bytes_per_line,(bdfc->ymax-bdfc->ymin+1)*bdfc->bytes_per_line ); + } + + for ( i=bdfc->ymax-bdfc->ymin; i>0; --i ) { + any = 0; + for ( j=0; jbytes_per_line; ++j ) + if ( bdfc->bitmap[i*bdfc->bytes_per_line+j]!=0 ) any = 1; + if ( any ) + break; + } + if ( i!=bdfc->ymax-bdfc->ymin ) { + bdfc->ymin += bdfc->ymax-bdfc->ymin-i; + } + + if ( !bdfc->byte_data ) { + for ( j=0; jxmax-bdfc->xmin; ++j ) { + any = 0; + for ( i=0; iymax-bdfc->ymin+1; ++i ) + if ( bdfc->bitmap[i*bdfc->bytes_per_line+(j>>3)] & (1<<(7-(j&7))) ) + any = 1; + if ( any ) + break; + } + off = j; + if ( off/8>0 ) { + for ( i=0; iymax-bdfc->ymin+1; ++i ) { + memmove(bdfc->bitmap+i*bdfc->bytes_per_line, + bdfc->bitmap+i*bdfc->bytes_per_line+off/8, + bdfc->bytes_per_line-off/8); + memset(bdfc->bitmap+(i+1)*bdfc->bytes_per_line-off/8, + 0, off/8); + } + bdfc->xmin += off-off%8; + off %= 8; + } + if ( off!=0 ) { + for ( i=0; iymax-bdfc->ymin+1; ++i ) { + last = 0; + for ( j=bdfc->bytes_per_line-1; j>=0; --j ) { + int index = i*bdfc->bytes_per_line+j; + int temp = bdfc->bitmap[index]>>(8-off); + bdfc->bitmap[index] = (bdfc->bitmap[index]<xmin += off; + } + + for ( j=bdfc->xmax-bdfc->xmin; j>0; --j ) { + any = 0; + for ( i=0; iymax-bdfc->ymin+1; ++i ) + if ( bdfc->bitmap[i*bdfc->bytes_per_line+(j>>3)] & (1<<(7-(j&7))) ) + any = 1; + if ( any ) + break; + } + if ( j!=bdfc->xmax+bdfc->xmin ) { + bdfc->xmax -= bdfc->xmax-bdfc->xmin-j; + } + BCRegularizeBitmap(bdfc); + } else { + for ( j=0; jxmax-bdfc->xmin; ++j ) { + any = 0; + for ( i=0; iymax-bdfc->ymin+1; ++i ) + if ( bdfc->bitmap[i*bdfc->bytes_per_line+j] != 0 ) + any = 1; + if ( any ) + break; + } + off = j; + if ( off!=0 ) { + for ( i=0; iymax-bdfc->ymin+1; ++i ) { + memmove(bdfc->bitmap+i*bdfc->bytes_per_line, + bdfc->bitmap+i*bdfc->bytes_per_line+off, + bdfc->bytes_per_line-off); + memset(bdfc->bitmap+(i+1)*bdfc->bytes_per_line-off, + 0, off); + } + bdfc->xmin += off; + } + + for ( j=bdfc->xmax-bdfc->xmin; j>0; --j ) { + any = 0; + for ( i=0; iymax-bdfc->ymin+1; ++i ) + if ( bdfc->bitmap[i*bdfc->bytes_per_line+j] != 0 ) + any = 1; + if ( any ) + break; + } + if ( j!=bdfc->xmax+bdfc->xmin ) { + bdfc->xmax -= bdfc->xmax-bdfc->xmin-j; + } + BCRegularizeGreymap(bdfc); + } +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static void Bresenham(uint8 *bytemap,EdgeList *es,int x1,int x2,int y1,int y2, + int grey) { + int dx, dy, incr1, incr2, d, x, y; + int incr3; + int bytes_per_line = es->bytes_per_line<<3; + int ymax = es->cnt; + + /* We are guarenteed x1<=x2 */ + dx = x2-x1; + if ( (dy = y1-y2)<0 ) dy=-dy; + if ( dx>=dy ) { + d = 2 * dy - dx; + incr1 = 2*dy; + incr2 = 2*(dy-dx); + incr3 = y2>y1 ? 1 : -1; + x = x1; + y = y1; + if ( x>=0 && y>=0 && x=0 && y>=0 && xy2 ) { + incr1 = y1; y1 = y2; y2 = incr1; + incr1 = x1; x1 = x2; x2 = incr1; + } + d = 2 * dx - dy; + incr1 = 2*dx; + incr2 = 2*(dx-dy); + incr3 = x2>x1 ? 1 : -1; + x = x1; + y = y1; + if ( x>=0 && y>=0 && x=0 && y>=0 && xx - es->omin; + x2 = to->x - es->omin; + if ( (y1 = (es->cnt-1 - (from->y - es->mmin)))<0 ) y1=0; + if ( (y2 = (es->cnt-1 - (to->y - es->mmin)))<0 ) y2=0; + + if ( x1>x2 ) { + dx = x1; x1 = x2; x2 = dx; + dy = y1; y1 = y2; y2 = dy; + } + + if ( width>1 ) { + w2 = width/2; + dx = x2-x1; + if ( (dy = y1-y2)<0 ) dy=-dy; + if ( dy>2*dx ) { + x1 -= w2; x2 -= w2; + for ( i=0; i2*dy ) { + y1 -= w2; y2 -= w2; + for ( i=0; iy1 ) { + width *= 1.414; w2 = width/2; + x1-=w2/2; y1+=w2/2; x2-=w2/2; y2+=w2/2; + for ( i=0; 2*istroke_pen.brush.col!=COLOR_INHERITED ) + col = layer->stroke_pen.brush.col; + else if ( alt!=NULL && alt->stroke_pen.brush.col!=COLOR_INHERITED ) + col = alt->stroke_pen.brush.col; + else + col = 0x000000; + if ( layer->stroke_pen.width!=WIDTH_INHERITED ) + width = rint(layer->stroke_pen.width*layer->stroke_pen.trans[0]*es->scale); + else if ( alt!=NULL && alt->stroke_pen.width!=WIDTH_INHERITED ) + width = rint(alt->stroke_pen.width*alt->stroke_pen.trans[0]*es->scale); + else + width = 1; + grey = ( ((col>>16)&0xff)*3 + ((col>>8)&0xff)*6 + (col&0xff) )/ 10; + /* but our internal greymap convention is backwards */ + grey = 255-grey; + + for ( spl=layer->splines; spl!=NULL; spl=spl->next ) { + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + lap = SplineApproximate(spline,es->scale); + if ( lap->lines!=NULL ) { + for ( prev = lap->lines, line=prev->next; line!=NULL; prev = line, line=line->next ) + StrokeLine(bytemap,&prev->here,&line->here,es,grey,width); + } + if ( first == NULL ) first = spline; + } + } +} + +static void SetByteMapToGrey(uint8 *bytemap,EdgeList *es,Layer *layer,Layer *alt) { + uint32 col; + int grey,i,j; + uint8 *pt, *bpt; + + if ( layer->fill_brush.col!=COLOR_INHERITED ) + col = layer->fill_brush.col; + else if ( alt!=NULL && alt->fill_brush.col!=COLOR_INHERITED ) + col = alt->fill_brush.col; + else + col = 0x000000; + grey = ( ((col>>16)&0xff)*3 + ((col>>8)&0xff)*6 + (col&0xff) )/ 10; + /* but our internal greymap convention is backwards */ + grey = 255-grey; + + for ( i=0; icnt; ++i ) { + bpt = es->bitmap + i*es->bytes_per_line; + pt = bytemap + i*8*es->bytes_per_line; + for ( j=0; j<=8*es->bytes_per_line; ++j ) { + if ( bpt[j>>3]&(0x80>>(j&7)) ) + pt[j] = grey; + } + } +} + +static void FillImages(uint8 *bytemap,EdgeList *es,ImageList *img,Layer *layer,Layer *alt) { + uint32 fillcol, col; + int grey,i,j,x1,x2,y1,y2,jj,ii; + + if ( layer->fill_brush.col!=COLOR_INHERITED ) + fillcol = layer->fill_brush.col; + else if ( alt!=NULL && alt->fill_brush.col!=COLOR_INHERITED ) + fillcol = alt->fill_brush.col; + else + fillcol = 0x000000; + + while ( img!=NULL ) { + struct _GImage *base = img->image->list_len==0? + img->image->u.image:img->image->u.images[0]; + + y1 = es->cnt-1 - (img->yoff*es->scale - es->mmin); + y2 = es->cnt-1 - ((img->yoff-base->height*img->yscale)*es->scale -es->mmin); + x1 = img->xoff*es->scale - es->omin; + x2 = (img->xoff+base->width*img->xscale)*es->scale - es->omin; + if ( y1==y2 || x1==x2 ) /* too small to show */ + continue; + for ( i=0; i<=y2-y1; ++i ) { + if ( i+y1<0 || i+y1>=es->cnt ) /* Shouldn't happen, rounding errors might gives us off by 1s though */ + continue; + ii = i*base->height/(y2-y1); + for ( j=0; j=8*es->bytes_per_line ) + continue; + jj = j*base->width/(x2-x1); + if ( base->image_type==it_true ) + col = ((uint32 *) (base->data + ii*base->bytes_per_line))[jj]; + else if ( base->image_type==it_index ) { + col = (base->data + ii*base->bytes_per_line)[jj]; + col = base->clut->clut[col]; + } else if ( layer->dofill ) { /* Equivalent to imagemask */ + if ( !( (base->data + ii*base->bytes_per_line)[jj>>3]&(0x80>>(j&7)) ) ) + continue; /* transparent */ + col = fillcol; + } else { + int index = 0; + if ( (base->data + ii*base->bytes_per_line)[jj>>3]&(0x80>>(j&7)) ) + index = 1; + if ( base->clut!=NULL ) { + col = base->clut->clut[index]; + if ( col==0xb0b0b0 ) col = 0xffffff; + } else if ( index==1 ) + col = 0xffffff; + else + col = 0x000000; + } + grey = ( ((col>>16)&0xff)*3 + ((col>>8)&0xff)*6 + (col&0xff) )/ 10; + /* but our internal greymap convention is backwards */ + grey = 255-grey; + bytemap[(i+y1)*8*es->bytes_per_line + j+x1] = grey; + } + } + img = img->next; + } +} + +static void ProcessLayer(uint8 *bytemap,EdgeList *es,Layer *layer, + Layer *alt) { + ImageList *img; + + if ( !layer->fillfirst && layer->dostroke ) + StrokePaths(bytemap,es,layer,alt); + if ( layer->dofill ) { + memset(es->bitmap,0,es->cnt*es->bytes_per_line); + FindEdgesSplineSet(layer->splines,es); + FillChar(es); + SetByteMapToGrey(bytemap,es,layer,alt); + _FreeEdgeList(es); + } + for ( img = layer->images; img!=NULL; img=img->next ) + FillImages(bytemap,es,img,layer,alt); + if ( layer->fillfirst && layer->dostroke ) + StrokePaths(bytemap,es,layer,alt); +} + +static void FlattenBytemap(EdgeList *es,uint8 *bytemap) { + int i,j; + uint8 *bpt, *pt; + + memset(es->bitmap,0,es->cnt*es->bytes_per_line); + for ( i=0; icnt; ++i ) { + bpt = es->bitmap + i*es->bytes_per_line; + pt = bytemap + i*8*es->bytes_per_line; + for ( j=0; j<8*es->bytes_per_line; ++j ) + if ( pt[j]>=128 ) + bpt[j>>3] |= (0x80>>(j&7)); + } +} +#endif + +/* Yes, I really do want a double, even though it will almost always be an */ +/* integer value there are a few cases (fill pattern for charview) where */ +/* I need more precision and the pixelsize itself is largely irrelevant */ +/* (I care about the scale though) */ +static BDFChar *_SplineCharRasterize(SplineChar *sc, double pixelsize, int is_aa) { + EdgeList es; + DBounds b; + BDFChar *bdfc; + int depth = 0; + + if ( sc==NULL ) +return( NULL ); + memset(&es,'\0',sizeof(es)); + if ( sc==NULL ) { + es.mmin = es.mmax = es.omin = es.omax = 0; + es.bitmap = gcalloc(1,1); + es.bytes_per_line = 1; + is_aa = false; + } else { + SplineCharFindBounds(sc,&b); + es.scale = (pixelsize-.1) / (real) (sc->parent->ascent+sc->parent->descent); + es.mmin = floor(b.miny*es.scale); + es.mmax = ceil(b.maxy*es.scale); + es.omin = b.minx*es.scale; + es.omax = b.maxx*es.scale; + es.cnt = (int) (es.mmax-es.mmin) + 1; + if ( es.cnt<4000 && es.omax-es.omin<4000 && es.cnt>1 ) { + es.edges = gcalloc(es.cnt,sizeof(Edge *)); + es.sc = sc; + es.major = 1; es.other = 0; + es.bytes_per_line = ((int) ceil(es.omax-es.omin) + 8)/8; + es.bitmap = gcalloc(es.cnt*es.bytes_per_line,1); + + InitializeHints(sc,&es); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( sc->parent->multilayer ) { + uint8 *bytemap = gcalloc(es.cnt*es.bytes_per_line*8,1); + int layer, i; + RefChar *rf; + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + ProcessLayer(bytemap,&es,&sc->layers[layer],NULL); + + for ( rf=sc->layers[layer].refs; rf!=NULL; rf = rf->next ) { + for ( i=0; ilayer_cnt; ++i ) { + ProcessLayer(bytemap,&es,(Layer *) (&rf->layers[i]), + &sc->layers[layer]); + } + } + } + if ( is_aa ) { + depth = 8; + free(es.bitmap); + es.bitmap = bytemap; + } else { + depth = 0; + FlattenBytemap(&es,bytemap); + free(bytemap); + } + } else { +#else + { +#endif + FindEdges(sc,&es); + FillChar(&es); + depth = 0; + } + } else { + /* If they want a bitmap so enormous it threatens our memory */ + /* then just give 'em a blank. It's probably by mistake anyway */ + es.mmin = es.mmax = es.omin = es.omax = 0; + es.bitmap = gcalloc(1,1); + es.bytes_per_line = 1; + } + } + + bdfc = chunkalloc(sizeof(BDFChar)); + bdfc->sc = sc; + bdfc->xmin = rint(es.omin); + bdfc->ymin = es.mmin; + bdfc->xmax = (int) ceil(es.omax-es.omin) + bdfc->xmin; + bdfc->ymax = es.mmax; + if ( sc!=NULL ) { + bdfc->width = rint(sc->width*pixelsize / (real) (sc->parent->ascent+sc->parent->descent)); + bdfc->enc = sc->enc; + } + bdfc->bitmap = es.bitmap; + bdfc->depth = depth; + bdfc->bytes_per_line = es.bytes_per_line; +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( depth==8 ) { + bdfc->byte_data = true; + bdfc->bytes_per_line *= 8; + } +#endif + BCCompressBitmap(bdfc); + FreeEdges(&es); +return( bdfc ); +} + +BDFChar *SplineCharRasterize(SplineChar *sc, double pixelsize) { +return( _SplineCharRasterize(sc,pixelsize,false)); +} + +BDFFont *SplineFontToBDFHeader(SplineFont *_sf, int pixelsize, int indicate) { + BDFFont *bdf = gcalloc(1,sizeof(BDFFont)); + int i; + real scale; + char csize[10]; unichar_t size[30]; + unichar_t aa[200]; + int max; + SplineFont *sf; /* The complexity here is to pick the appropriate subfont of a CID font */ + + sf = _sf; + max = sf->charcnt; + for ( i=0; i<_sf->subfontcnt; ++i ) { + sf = _sf->subfonts[i]; + if ( sf->charcnt>max ) max = sf->charcnt; + } + scale = pixelsize / (real) (sf->ascent+sf->descent); + + if ( indicate ) { + sprintf(csize,"%d", pixelsize ); + uc_strcpy(size,csize); + u_strcat(size,GStringGetResource(_STR_Pixels,NULL)); + u_strcpy(aa,GStringGetResource(_STR_GenBitmap,NULL)); + if ( sf->fontname!=NULL ) { + uc_strcat(aa,": "); + uc_strncat(aa,sf->fontname,sizeof(aa)/sizeof(aa[0])-u_strlen(aa)); + aa[sizeof(aa)/sizeof(aa[0])-1] = '\0'; + } + GProgressStartIndicator(10,GStringGetResource(_STR_Rasterizing,NULL), + aa,size,sf->charcnt,1); + GProgressEnableStop(0); + } + bdf->sf = _sf; + bdf->charcnt = max; + bdf->pixelsize = pixelsize; + bdf->chars = galloc(max*sizeof(BDFChar *)); + bdf->ascent = rint(sf->ascent*scale); + bdf->descent = pixelsize-bdf->ascent; + bdf->encoding_name = sf->encoding_name; + bdf->res = -1; +return( bdf ); +} + +#if 0 +/* This code was an attempt to do better at rasterizing by making a big bitmap*/ +/* and shrinking it down. It did make curved edges look better, but it made */ +/* straight edges worse. So I don't think it's worth it. */ +static int countsquare(BDFChar *bc, int i, int j, int linear_scale) { + int ii,jj,jjj, cnt; + uint8 *bpt; + + cnt = 0; + for ( ii=0; iibc->ymax-bc->ymin ) + break; + bpt = bc->bitmap + (i*linear_scale+ii)*bc->bytes_per_line; + for ( jj=0; jjbc->xmax-bc->xmin ) + break; + if ( bpt[jjj>>3]& (1<<(7-(jjj&7))) ) + ++cnt; + } + } +return( cnt ); +} + +static int makesleftedge(BDFChar *bc, int i, int j, int linear_scale) { + int ii,jjj; + uint8 *bpt; + + for ( ii=0; iibc->ymax-bc->ymin ) +return( false ); + bpt = bc->bitmap + (i*linear_scale+ii)*bc->bytes_per_line; + jjj = j*linear_scale; + if ( !( bpt[jjj>>3]& (1<<(7-(jjj&7))) )) +return( false ); + } +return( true ); +} + +static int makesbottomedge(BDFChar *bc, int i, int j, int linear_scale) { + int jj,jjj; + uint8 *bpt; + + for ( jj=0; jjbc->xmax-bc->xmin ) +return( false ); + bpt = bc->bitmap + (i*linear_scale)*bc->bytes_per_line; + if ( !( bpt[jjj>>3]& (1<<(7-(jjj&7))) )) +return( false ); + } +return( true ); +} + +static int makesline(BDFChar *bc, int i, int j, int linear_scale) { + int ii,jj,jjj; + int across, any, alltop, allbottom; /* alltop is sometimes allleft, and allbottom allright */ + uint8 *bpt; + /* If we have a line that goes all the way across a square then we want */ + /* to turn on the pixel that corresponds to that square. Exception: */ + /* if that line is on an edge of the square, and the square adjacent to */ + /* it has more pixels, then let the adjacent square get the pixel */ + /* if two squares are essentially equal, choose the top one */ + + across = alltop = allbottom = true; + for ( ii=0; iibc->ymax-bc->ymin ) { + across = alltop = allbottom = false; + break; + } + bpt = bc->bitmap + (i*linear_scale+ii)*bc->bytes_per_line; + jjj = j*linear_scale; + if ( !( bpt[jjj>>3]& (1<<(7-(jjj&7))) )) + allbottom = 0; + jjj += linear_scale-1; + if ( jjj>bc->xmax-bc->xmin ) + alltop = false; + else if ( !( bpt[jjj>>3]& (1<<(7-(jjj&7))) )) + alltop = 0; + any = false; + for ( jj=0; jjbc->xmax-bc->xmin ) + break; + if ( bpt[jjj>>3]& (1<<(7-(jjj&7))) ) + any = true; + } + if ( !any ) + across = false; + } + if ( across ) { + if ( (!alltop && !allbottom ) || (alltop && allbottom)) +return( true ); + if ( allbottom ) { + if ( j==0 ) +return( true ); + if ( countsquare(bc,i,j-1,linear_scale)>=linear_scale*linear_scale/2 ) +return( false ); +return( true ); + } + if ( alltop ) { + if ( j==(bc->xmax-bc->xmin)/linear_scale ) +return( true ); + if ( countsquare(bc,i,j+1,linear_scale)>=linear_scale*linear_scale/2 ) +return( false ); + if ( makesleftedge(bc,i,j+1,linear_scale)) +return( false ); +return( true ); + } + } + + /* now the other dimension */ + across = alltop = allbottom = true; + for ( jj=0; jjbc->xmax-bc->xmin ) { + across = alltop = allbottom = false; + break; + } + bpt = bc->bitmap + (i*linear_scale)*bc->bytes_per_line; + if ( !( bpt[jjj>>3]& (1<<(7-(jjj&7))) )) + allbottom = 0; + if ( i*linear_scale + linear_scale-1>bc->ymax-bc->ymin ) + alltop = 0; + else { + bpt = bc->bitmap + (i*linear_scale+linear_scale-1)*bc->bytes_per_line; + if ( !( bpt[jjj>>3]& (1<<(7-(jjj&7))) )) + alltop = 0; + } + any = false; + for ( ii=0; iibc->xmax-bc->xmin ) + break; + bpt = bc->bitmap + (i*linear_scale+ii)*bc->bytes_per_line; + if ( bpt[jjj>>3]& (1<<(7-(jjj&7))) ) + any = true; + } + if ( !any ) + across = false; + } + if ( across ) { + if ( (!alltop && !allbottom ) || (alltop && allbottom)) +return( true ); + if ( allbottom ) { + if ( i==0 ) +return( true ); + if ( countsquare(bc,i-1,j,linear_scale)>=linear_scale*linear_scale/2 ) +return( false ); +return( true ); + } + if ( alltop ) { + if ( i==(bc->ymax-bc->ymin)/linear_scale ) +return( true ); + if ( countsquare(bc,i+1,j,linear_scale)>=linear_scale*linear_scale/2 ) +return( false ); + if ( makesbottomedge(bc,i+1,j,linear_scale)) +return( false ); +return( true ); + } + } + +return( false ); /* No line */ +} + +/* Make a much larger bitmap than we need, and then shrink it */ +static void BDFCShrinkBitmap(BDFChar *bc, int linear_scale) { + BDFChar new; + int i,j, mid = linear_scale*linear_scale/2; + int cnt; + uint8 *pt; + + if ( bc==NULL ) +return; + + memset(&new,'\0',sizeof(new)); + new.xmin = floor( ((real) bc->xmin)/linear_scale ); + new.ymin = floor( ((real) bc->ymin)/linear_scale ); + new.xmax = new.xmin + (bc->xmax-bc->xmin+linear_scale-1)/linear_scale; + new.ymax = new.ymin + (bc->ymax-bc->ymin+linear_scale-1)/linear_scale; + new.width = rint( ((real) bc->width)/linear_scale ); + + new.bytes_per_line = (new.xmax-new.xmin+1); + new.enc = bc->enc; + new.sc = bc->sc; + new.byte_data = true; + new.bitmap = gcalloc( (new.ymax-new.ymin+1) * new.bytes_per_line, sizeof(uint8)); + for ( i=0; i<=new.ymax-new.ymin; ++i ) { + pt = new.bitmap + i*new.bytes_per_line; + for ( j=0; j<=new.xmax-new.xmin; ++j ) { + cnt = countsquare(bc,i,j,linear_scale); + if ( cnt>=mid ) + pt[j>>3] |= (1<<(7-(j&7))); + else if ( cnt>=linear_scale && makesline(bc,i,j,linear_scale)) + pt[j>>3] |= (1<<(7-(j&7))); + } + } + free(bc->bitmap); + *bc = new; +} + +BDFChar *SplineCharSlowerRasterize(SplineChar *sc, int pixelsize) { + BDFChar *bc; + int linear_scale = 1; + + if ( pixelsize<=30 ) + linear_scale = 4; + else if ( pixelsize<=40 ) + linear_scale = 3; + else if ( pixelsize<=60 ) + linear_scale = 2; + + bc = SplineCharRasterize(sc,pixelsize*linear_scale); + if ( linear_scale==1 ) +return( bc ); + BDFCShrinkBitmap(bc,linear_scale); +return( bc ); +} + +BDFFont *SplineFontRasterize(SplineFont *_sf, int pixelsize, int indicate, int slower) { +#else +BDFFont *SplineFontRasterize(SplineFont *_sf, int pixelsize, int indicate) { +#endif + BDFFont *bdf = SplineFontToBDFHeader(_sf,pixelsize,indicate); + int i,k; + real scale; + SplineFont *sf=_sf; /* The complexity here is to pick the appropriate subfont of a CID font */ + + for ( i=0; icharcnt; ++i ) { + if ( _sf->subfontcnt!=0 ) { + for ( k=0; k<_sf->subfontcnt; ++k ) if ( _sf->subfonts[k]->charcnt>i ) { + sf = _sf->subfonts[k]; + if ( SCWorthOutputting(sf->chars[i])) + break; + } + scale = pixelsize / (real) (sf->ascent+sf->descent); + } +#if 0 + bdf->chars[i] = slower ? SplineCharSlowerRasterize(sf->chars[i],pixelsize): + SplineCharRasterize(sf->chars[i],pixelsize); +#else + bdf->chars[i] = SplineCharRasterize(sf->chars[i],pixelsize); +#endif + if ( indicate ) GProgressNext(); + } + if ( indicate ) GProgressEndIndicator(); +return( bdf ); +} + +static void BDFCAntiAlias(BDFChar *bc, int linear_scale) { + BDFChar new; + int i,j, max = linear_scale*linear_scale-1; + uint8 *bpt, *pt; + + if ( bc==NULL ) +return; + + memset(&new,'\0',sizeof(new)); + new.xmin = floor( ((real) bc->xmin)/linear_scale ); + new.ymin = floor( ((real) bc->ymin)/linear_scale ); + new.xmax = new.xmin + (bc->xmax-bc->xmin+linear_scale-1)/linear_scale; + new.ymax = new.ymin + (bc->ymax-bc->ymin+linear_scale-1)/linear_scale; + new.width = rint( ((real) bc->width)/linear_scale ); + + new.bytes_per_line = (new.xmax-new.xmin+1); + new.enc = bc->enc; + new.sc = bc->sc; + new.byte_data = true; + new.depth = max==3 ? 2 : max==15 ? 4 : 8; + new.bitmap = gcalloc( (new.ymax-new.ymin+1) * new.bytes_per_line, sizeof(uint8)); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( bc->depth>1 ) { + uint32 *sum = gcalloc(new.bytes_per_line,sizeof(uint32)); + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + bpt = bc->bitmap + i*bc->bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + sum[j/linear_scale] += bpt[j]; + } + if ( (i+1)%linear_scale==0 ) { + pt = new.bitmap + (i/linear_scale)*new.bytes_per_line; + for ( j=(bc->xmax-bc->xmin)/linear_scale-1; j>=0 ; --j ) { + int val = rint( (sum[j]+128)/255 ); + if ( val>max ) val = max; + pt[j] = val; + } + memset(sum,0,new.bytes_per_line*sizeof(uint32)); + } + } + } else { +#else + { +#endif + for ( i=0; i<=bc->ymax-bc->ymin; ++i ) { + bpt = bc->bitmap + i*bc->bytes_per_line; + pt = new.bitmap + (i/linear_scale)*new.bytes_per_line; + for ( j=0; j<=bc->xmax-bc->xmin; ++j ) { + if ( bpt[(j>>3)] & (1<<(7-(j&7))) ) + /* we can get values between 0..2^n we want values between 0..(2^n-1) */ + if ( pt[ j/linear_scale ]!=max ) + ++pt[ j/linear_scale ]; + } + } + } + free(bc->bitmap); + *bc = new; +} + +GClut *_BDFClut(int linear_scale) { + int scale = linear_scale*linear_scale, i; + Color bg = screen_display==NULL?0xffffff:GDrawGetDefaultBackground(NULL); + int bgr=COLOR_RED(bg), bgg=COLOR_GREEN(bg), bgb=COLOR_BLUE(bg); + GClut *clut; + + clut = gcalloc(1,sizeof(GClut)); + clut->clut_len = scale; + clut->is_grey = (bgr==bgg && bgb==bgr); + clut->trans_index = -1; + for ( i=0; iclut[i] = + COLOR_CREATE( bgr- (i*(bgr))/(scale-1), + bgg- (i*(bgg))/(scale-1), + bgb- (i*(bgb))/(scale-1)); + } + clut->clut[scale-1] = 0; /* avoid rounding errors */ +return( clut ); +} + +void BDFClut(BDFFont *bdf, int linear_scale) { + bdf->clut = _BDFClut(linear_scale); +} + +int BDFDepth(BDFFont *bdf) { + if ( bdf->clut==NULL ) +return( 1 ); + +return( bdf->clut->clut_len==256 ? 8 : + bdf->clut->clut_len==16 ? 4 : 2); +} + +BDFChar *SplineCharAntiAlias(SplineChar *sc, int pixelsize, int linear_scale) { + BDFChar *bc; + + bc = _SplineCharRasterize(sc,pixelsize*linear_scale,true); + if ( linear_scale!=1 ) + BDFCAntiAlias(bc,linear_scale); + BCCompressBitmap(bc); +return( bc ); +} + +BDFFont *SplineFontAntiAlias(SplineFont *_sf, int pixelsize, int linear_scale) { + BDFFont *bdf; + int i,k; + real scale; + char csize[10]; unichar_t size[30]; + unichar_t aa[200]; + int max; + SplineFont *sf; /* The complexity here is to pick the appropriate subfont of a CID font */ + + if ( linear_scale==1 ) +return( SplineFontRasterize(_sf,pixelsize,true)); + + bdf = gcalloc(1,sizeof(BDFFont)); + sf = _sf; + max = sf->charcnt; + for ( i=0; i<_sf->subfontcnt; ++i ) { + sf = _sf->subfonts[i]; + if ( sf->charcnt>max ) max = sf->charcnt; + } + scale = pixelsize / (real) (sf->ascent+sf->descent); + + sprintf(csize,"%d", pixelsize ); + uc_strcpy(size,csize); + u_strcat(size,GStringGetResource(_STR_Pixels,NULL)); + u_strcpy(aa,GStringGetResource(_STR_GenAntiAlias,NULL)); + if ( sf->fontname!=NULL ) { + uc_strcat(aa,": "); + uc_strncat(aa,sf->fontname,sizeof(aa)/sizeof(aa[0])-u_strlen(aa)); + aa[sizeof(aa)/sizeof(aa[0])-1] = '\0'; + } + GProgressStartIndicator(10,GStringGetResource(_STR_Rasterizing,NULL), + aa,size,sf->charcnt,1); + GProgressEnableStop(0); + + if ( linear_scale>16 ) linear_scale = 16; /* can't deal with more than 256 levels of grey */ + if ( linear_scale<=1 ) linear_scale = 2; + bdf->sf = _sf; + bdf->charcnt = max; + bdf->pixelsize = pixelsize; + bdf->chars = galloc(max*sizeof(BDFChar *)); + bdf->ascent = rint(sf->ascent*scale); + bdf->descent = pixelsize-bdf->ascent; + bdf->encoding_name = sf->encoding_name; + bdf->res = -1; + for ( i=0; isubfontcnt!=0 ) { + for ( k=0; k<_sf->subfontcnt; ++k ) if ( _sf->subfonts[k]->charcnt>i ) { + sf = _sf->subfonts[k]; + if ( SCWorthOutputting(sf->chars[i])) + break; + } + scale = pixelsize / (real) (sf->ascent+sf->descent); + } + bdf->chars[i] = SplineCharRasterize(sf->chars[i],pixelsize*linear_scale); + BDFCAntiAlias(bdf->chars[i],linear_scale); + GProgressNext(); + } + BDFClut(bdf,linear_scale); + GProgressEndIndicator(); +return( bdf ); +} + +BDFChar *BDFPieceMeal(BDFFont *bdf, int index) { + SplineChar *sc = bdf->sf->chars[index]; + + if ( sc==NULL ) +return(NULL); + if ( bdf->freetype_context ) + bdf->chars[index] = SplineCharFreeTypeRasterize(bdf->freetype_context, + sc->enc,bdf->truesize,bdf->clut?8:1); + else if ( bdf->clut ) + bdf->chars[index] = SplineCharAntiAlias(sc,bdf->truesize,4); + else + bdf->chars[index] = SplineCharRasterize(sc,bdf->truesize); +return( bdf->chars[index] ); +} + +/* Piecemeal fonts are only used as the display font in the fontview */ +/* as such they are simple fonts (ie. we only display the current cid subfont) */ +BDFFont *SplineFontPieceMeal(SplineFont *sf,int pixelsize,int flags,void *ftc) { + BDFFont *bdf = gcalloc(1,sizeof(BDFFont)); + real scale; + int truesize = pixelsize; + + if ( flags&pf_bbsized ) { + DBounds bb; + SplineFontQuickConservativeBounds(sf,&bb); + if ( bb.maxyascent ) bb.maxy = sf->ascent; + if ( bb.miny>-sf->descent ) bb.miny = -sf->descent; + /* Ignore absurd values */ + if ( bb.maxy>10*(sf->ascent+sf->descent) ) bb.maxy = 2*(sf->ascent+sf->descent); + if ( bb.maxx>10*(sf->ascent+sf->descent) ) bb.maxx = 2*(sf->ascent+sf->descent); + if ( bb.miny<-10*(sf->ascent+sf->descent) ) bb.miny = -2*(sf->ascent+sf->descent); + if ( bb.minx<-10*(sf->ascent+sf->descent) ) bb.minx = -2*(sf->ascent+sf->descent); + scale = pixelsize/ (real) (bb.maxy-bb.miny); + bdf->ascent = rint(bb.maxy*scale); + truesize = rint( (sf->ascent+sf->descent)*scale ); + } else { + scale = pixelsize / (real) (sf->ascent+sf->descent); + bdf->ascent = rint(sf->ascent*scale); + } + + bdf->sf = sf; + bdf->charcnt = sf->charcnt; + bdf->pixelsize = pixelsize; + bdf->chars = gcalloc(sf->charcnt,sizeof(BDFChar *)); + bdf->descent = pixelsize-bdf->ascent; + bdf->encoding_name = sf->encoding_name; + bdf->piecemeal = true; + bdf->bbsized = (flags&pf_bbsized)?1:0; + bdf->res = -1; + bdf->truesize = truesize; + bdf->freetype_context = ftc; + if ( ftc && (flags&pf_antialias) ) + BDFClut(bdf,16); + else if ( flags&pf_antialias ) + BDFClut(bdf,4); +return( bdf ); +} + +void BDFCharFree(BDFChar *bdfc) { + if ( bdfc==NULL ) +return; + free(bdfc->bitmap); + chunkfree(bdfc,sizeof(BDFChar)); +} + +void BDFFontFree(BDFFont *bdf) { + int i; + + if ( bdf==NULL ) +return; + for ( i=0; icharcnt; ++i ) + BDFCharFree(bdf->chars[i]); + free(bdf->chars); + if ( bdf->clut!=NULL ) + free(bdf->clut); + if ( bdf->freetype_context!=NULL ) + FreeTypeFreeContext(bdf->freetype_context); + free( bdf->foundry ); + free(bdf); +} diff --git a/fontforge/splinefont.h b/fontforge/splinefont.h new file mode 100644 index 00000000..cc5f377f --- /dev/null +++ b/fontforge/splinefont.h @@ -0,0 +1,1565 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _SPLINEFONT_H +#define _SPLINEFONT_H + +#include "basics.h" +#include "charset.h" + +#ifdef USE_DOUBLE +# define real double +#else +# define real float +#endif + +#define CHR(ch1,ch2,ch3,ch4) (((ch1)<<24)|((ch2)<<16)|((ch3)<<8)|(ch4)) + +#define MmMax 16 /* PS says at most this many instances for type1/2 mm fonts */ + +typedef struct val { + enum val_type { v_int, v_str, v_unicode, v_lval, v_arr, v_arrfree, + v_int32pt, v_int16pt, v_int8pt, v_void } type; + union { + int ival; + char *sval; + struct val *lval; + struct array *aval; + uint32 *u32ptval; + uint16 *u16ptval; + uint8 *u8ptval; + } u; +} Val; /* Used by scripting */ + +struct psdict { + int cnt, next; + char **keys; + char **values; +}; + +struct pschars { + int cnt, next; + char **keys; + uint8 **values; + int *lens; + int bias; /* for type2 strings */ +}; + +enum linejoin { + lj_miter, /* Extend lines until they meet */ + lj_round, /* circle centered at the join of expand radius */ + lj_bevel, /* Straight line between the ends of next and prev */ + lj_inherited +}; +enum linecap { + lc_butt, /* equiv to lj_bevel, straight line extends from one side to other */ + lc_round, /* semi-circle */ + lc_square, /* Extend lines by radius, then join them */ + lc_inherited +}; +#define COLOR_INHERITED 0xfffffffe +struct brush { + uint32 col; + /*void *pattern;*/ /* Don't know how to deal with these yet */ + /*void *gradient;*/ + float opacity; /* number between [0,1], only for svg */ +}; +#define WIDTH_INHERITED (-1) +struct pen { + struct brush brush; + uint8 linejoin; + uint8 linecap; + float width; + real trans[4]; +}; + +struct spline; +enum si_type { si_std, si_caligraphic, si_elipse, si_centerline }; +/* If you change this structure you may need to update MakeStrokeDlg +/* and cvpalettes.c both contain statically initialized StrokeInfos */ +typedef struct strokeinfo { + real radius; /* or major axis of pen */ + enum linejoin join; + enum linecap cap; + enum si_type stroke_type; + unsigned int toobigwarn: 1; + unsigned int removeinternal: 1; + unsigned int removeexternal: 1; + unsigned int removeoverlapifneeded: 1; + unsigned int gottoobig: 1; + unsigned int gottoobiglocal: 1; + real penangle; + real ratio; /* ratio of minor pen axis to major */ +/* For eplipse */ + real minorradius; +/* For freehand tool */ + real radius2; + int pressure1, pressure2; +/* End freehand tool */ + double c,s; + real xoff[8], yoff[8]; + void *data; + double (*factor)(void *data,struct spline *spline,real t); +} StrokeInfo; + +enum overlap_type { over_remove, over_intersect, over_exclude, over_findinter }; + +enum simpify_flags { sf_cleanup=-1, sf_normal=0, sf_ignoreslopes=1, + sf_ignoreextremum=2, sf_smoothcurves=4, sf_choosehv=8, + sf_forcelines=0x10 }; +struct simplifyinfo { + int flags; + double err; + double tan_bounds; + double linefixup; +}; + +typedef struct ipoint { + int x; + int y; +} IPoint; + +typedef struct basepoint { + real x; + real y; +} BasePoint; + +typedef struct tpoint { + real x; + real y; + real t; +} TPoint; + +typedef struct dbounds { + real minx, maxx; + real miny, maxy; +} DBounds; + +typedef struct bluedata { + real xheight, xheighttop; /* height of "x" and "o" (u,v,w,x,y,z) */ + real caph, caphtop; /* height of "I" and "O" */ + real base, basebelow; /* bottom of "I" and "O" */ + real ascent; /* height of "l" */ + real descent; /* depth of "p" */ + real numh, numhtop; /* height of "7" and "8" */ /* numbers with ascenders */ + int bluecnt; /* If the private dica contains bluevalues... */ + real blues[12][2]; /* 7 pairs from bluevalues, 5 from otherblues */ +} BlueData; + +typedef struct bdffloat { + int16 xmin,xmax,ymin,ymax; + int16 bytes_per_line; + unsigned int byte_data:1; + uint8 depth; + uint8 *bitmap; +} BDFFloat; + +/* OpenType does not document 'dflt' as a language, but we'll use it anyway. */ +/* we'll turn it into a default entry when we output it. */ +#define DEFAULT_LANG CHR('d','f','l','t') +#define DEFAULT_SCRIPT CHR('D','F','L','T') +#define REQUIRED_FEATURE CHR(' ','R','Q','D') + +#define SLI_UNKNOWN 0xffff +#define SLI_NESTED 0xfffe + +enum pst_flags { pst_r2l=1, pst_ignorebaseglyphs=2, pst_ignoreligatures=4, + pst_ignorecombiningmarks=8 }; +enum anchorclass_type { act_mark, /* act_mklg, */act_mkmk, act_curs }; +typedef struct anchorclass { + unichar_t *name; + uint32 feature_tag; + uint16 script_lang_index; + uint16 flags; + uint16 merge_with; + uint16 type; /* anchorclass_type */ + struct anchorclass *next; + uint8 processed, has_mark, matches; +} AnchorClass; + +enum anchor_type { at_mark, at_basechar, at_baselig, at_basemark, at_centry, at_cexit, at_max }; +typedef struct anchorpoint { + AnchorClass *anchor; + BasePoint me; + unsigned int type: 4; + unsigned int selected: 1; + unsigned int ticked: 1; + int lig_index; + struct anchorpoint *next; +} AnchorPoint; + +enum possub_type { pst_null, pst_position, pst_pair, + pst_substitution, pst_alternate, + pst_multiple, pst_ligature, + pst_lcaret /* must be pst_max-1, see charinfo.c*/, + pst_max, + /* These are not psts but are related so it's handly to have values for them */ + pst_kerning = pst_max, pst_vkerning, pst_anchors, + /* And these are fpsts */ + pst_contextpos, pst_contextsub, pst_chainpos, pst_chainsub, + pst_reversesub, fpst_max + }; +typedef struct generic_pst { + /* enum possub_type*/ unsigned int type: 7; + unsigned int macfeature: 1; /* tag should be interpretted as rather than 'abcd' */ + uint8 flags; + uint16 script_lang_index; /* 0xffff means none */ + uint32 tag; + struct generic_pst *next; + union { + struct vr { int16 xoff, yoff, h_adv_off, v_adv_off; } pos; + struct { char *paired; struct vr *vr; } pair; + struct { char *variant; } subs; + struct { char *components; } mult, alt; + struct { char *components; struct splinechar *lig; } lig; + struct { int16 *carets; int cnt; } lcaret; /* Ligature caret positions */ + } u; +} PST; + +typedef struct liglist { + PST *lig; + struct splinechar *first; /* First component */ + struct splinecharlist *components; /* Other than the first */ + struct liglist *next; + int ccnt; /* Component count. (includes first component) */ +} LigList; + +enum fpossub_format { pst_glyphs, pst_class, pst_coverage, + pst_reversecoverage, pst_formatmax }; + +typedef struct generic_fpst { + uint16 /*enum sfpossub_type*/ type; + uint16 /*enum sfpossub_format*/ format; + uint16 script_lang_index; + uint16 flags; + uint32 tag; + struct generic_fpst *next; + uint16 nccnt, bccnt, fccnt; + uint16 rule_cnt; + char **nclass, **bclass, **fclass; + struct fpst_rule { + union { + struct fpg { char *names, *back, *fore; } glyph; + struct fpc { int ncnt, bcnt, fcnt; uint16 *nclasses, *bclasses, *fclasses, *allclasses; } class; + struct fpv { int ncnt, bcnt, fcnt; char **ncovers, **bcovers, **fcovers; } coverage; + struct fpr { int always1, bcnt, fcnt; char **ncovers, **bcovers, **fcovers; char *replacements; } rcoverage; + } u; + int lookup_cnt; + struct seqlookup { + int seq; + uint32 lookup_tag; + } *lookups; + } *rules; + uint8 ticked; +} FPST; + +enum asm_type { asm_indic, asm_context, asm_lig, asm_simple=4, asm_insert, + asm_kern=0x11 }; +enum asm_flags { asm_vert=0x8000, asm_descending=0x4000, asm_always=0x2000 }; + +typedef struct generic_asm { /* Apple State Machine */ + struct generic_asm *next; + uint16 /*enum asm_type*/ type; + uint16 feature, setting; + uint16 flags; /* 0x8000=>vert, 0x4000=>r2l, 0x2000=>hor&vert */ + uint8 ticked; + + uint16 class_cnt, state_cnt; + char **classes; + struct asm_state { + uint16 next_state; + uint16 flags; + union { + struct { + uint32 mark_tag; /* for contextual glyph subs (tag of a nested lookup) */ + uint32 cur_tag; /* for contextual glyph subs */ + } context; + struct { + char *mark_ins; + char *cur_ins; + } insert; + struct { + int16 *kerns; + int kcnt; + } kern; + } u; + } *state; + uint32 opentype_tag; /* If converted from opentype */ +} ASM; +/* State Flags: + Indic: + 0x8000 mark current glyph as first in rearrangement + 0x4000 don't advance to next glyph + 0x2000 mark current glyph as last + 0x000f verb + 0 = no change 8 = AxCD => CDxA + 1 = Ax => xA 9 = AxCD => DCxA + 2 = xD => Dx a = ABxD => DxAB + 3 = AxD => DxA b = ABxD => DxBA + 4 = ABx => xAB c = ABxCD => CDxAB + 5 = ABx => xBA d = ABxCD => CDxBA + 6 = xCD => CDx e = ABxCD => DCxAB + 7 = xCD => DCx f = ABxCD => DCxBA + Contextual: + 0x8000 mark current glyph + 0x4000 don't advance to next glyph + Insert: + 0x8000 mark current glyph + 0x4000 don't advance to next glyph + 0x2000 current is Kashida like + 0x1000 mark is Kashida like + 0x0800 current insert before + 0x0400 mark insert before + 0x03e0 count of chars to be inserted at current (31 max) + 0x001f count of chars to be inserted at mark (31 max) + Kern: + 0x8000 add current glyph to kerning stack + 0x4000 don't advance to next glyph + 0x3fff value offset +*/ + +struct macname { + struct macname *next; + uint16 enc; /* Platform specific encoding. 0=>mac roman, 1=>sjis, 7=>russian */ + uint16 lang; /* Mac languages 0=>english, 1=>french, 2=>german */ + char *name; /* Not a unicode string, uninterpreted mac encoded string */ +}; + +typedef struct macfeat { + struct macfeat *next; + uint16 feature; + uint8 ismutex; + uint8 default_setting; /* Apple's docs say both that this is a byte and a short. It's a byte */ + uint16 strid; /* Temporary value, used when reading in */ + struct macname *featname; + struct macsetting { + struct macsetting *next; + uint16 setting; + uint16 strid; + struct macname *setname; + unsigned int initially_enabled: 1; + } *settings; +} MacFeat; + +typedef struct undoes { + struct undoes *next; + enum undotype { ut_none=0, ut_state, ut_tstate, ut_statehint, ut_statename, + ut_width, ut_vwidth, ut_lbearing, ut_rbearing, ut_possub, + ut_bitmap, ut_bitmapsel, ut_composit, ut_multiple, ut_layers, + ut_noop } undotype; + unsigned int was_modified: 1; + unsigned int was_order2: 1; + union { + struct { + int16 width, vwidth; + int16 lbearingchange; + int unicodeenc; /* only for ut_statename */ + char *charname; /* only for ut_statename */ + unichar_t *comment; /* only for ut_statename */ + PST *possub; /* only for ut_statename */ + struct splinepointlist *splines; + struct refchar *refs; + struct minimumdistance *md; +#ifdef FONTFORGE_CONFIG_TYPE3 + struct { /* In type3 we can have both at once */ +#else + union { +#endif + struct imagelist *images; + void *hints; /* ut_statehint, ut_statename */ + } u; + AnchorPoint *anchor; +#ifdef FONTFORGE_CONFIG_TYPE3 + struct brush fill_brush; + struct pen stroke_pen; + unsigned int dofill: 1; + unsigned int dostroke: 1; + unsigned int fillfirst: 1; +#endif + struct splinefont *copied_from; + } state; + int width; /* used by both ut_width and ut_vwidth */ + int lbearing; /* used by ut_lbearing */ + int rbearing; /* used by ut_rbearing */ + struct { + int16 width; /* width should be controled by postscript, but people don't like that */ + int16 xmin,xmax,ymin,ymax; + int16 bytes_per_line; + int16 pixelsize; + int16 depth; + uint8 *bitmap; + BDFFloat *selection; + } bmpstate; + struct { /* copy contains an outline state and a set of bitmap states */ + struct undoes *state; + struct undoes *bitmaps; + } composit; + struct { + struct undoes *mult; /* copy contains several sub copies (composits, or states or widths or...) */ + /* Also used for ut_layers, each sub copy is a state (first is ly_fore, next ly_fore+1...) */ + } multiple; + struct { + enum possub_type pst; + char **data; /* First 4 bytes is tag, then space then data */ + } possub; + uint8 *bitmap; + } u; +} Undoes; + +typedef struct bdfchar { + struct splinechar *sc; + int16 xmin,xmax,ymin,ymax; + int16 width; + int16 bytes_per_line; + uint8 *bitmap; + int enc; + struct bitmapview *views; + Undoes *undoes; + Undoes *redoes; + unsigned int changed: 1; + unsigned int byte_data: 1; /* for anti-aliased chars entries are grey-scale bytes not bw bits */ + unsigned int widthgroup: 1; /* for ttf bitmap output */ + uint8 depth; /* for ttf bitmap output */ + BDFFloat *selection; +} BDFChar; + +typedef struct bdffont { + struct splinefont *sf; + int charcnt; + BDFChar **chars; /* an array of charcnt entries */ + BDFChar **temp; /* Used by ReencodeFont routine */ + int16 pixelsize; + int16 ascent, descent; + unsigned int piecemeal: 1; + unsigned int bbsized: 1; + enum charset encoding_name; + struct bdffont *next; + struct clut *clut; + char *foundry; + int res; + void *freetype_context; + int truesize; /* for bbsized fonts */ +} BDFFont; + +#define HntMax 96 /* PS says at most 96 hints */ +typedef uint8 HintMask[HntMax/8]; + +enum pointtype { pt_curve, pt_corner, pt_tangent }; +typedef struct splinepoint { + BasePoint me; + BasePoint nextcp; /* control point */ + BasePoint prevcp; /* control point */ + unsigned int nonextcp:1; + unsigned int noprevcp:1; + unsigned int nextcpdef:1; + unsigned int prevcpdef:1; + unsigned int selected:1; /* for UI */ + unsigned int pointtype:2; + unsigned int isintersection: 1; + unsigned int flexy: 1; + unsigned int flexx: 1; + unsigned int roundx: 1; /* For true type hinting */ + unsigned int roundy: 1; /* For true type hinting */ + unsigned int dontinterpolate: 1; /* temporary in ttf output */ + unsigned int ticked: 1; + unsigned int watched: 1; + /* 1 bits left... */ + uint16 ptindex; /* Temporary value used by metafont routine */ + uint16 ttfindex; /* Truetype point index */ + /* Special values 0xffff => point implied by averaging control points */ + /* 0xfffe => point created with no real number */ + uint16 nextcpindex; /* Truetype point index */ + struct spline *next; + struct spline *prev; + HintMask *hintmask; +} SplinePoint; + +typedef struct linelist { + IPoint here; + struct linelist *next; + /* The first two fields are constant for the linelist, the next ones */ + /* refer to a particular screen. If some portion of the line from */ + /* this point to the next one is on the screen then set cvli_onscreen */ + /* if this point needs to be clipped then set cvli_clipped */ + /* asend and asstart are the actual screen locations where this point */ + /* intersects the clip edge. */ + enum { cvli_onscreen=0x1, cvli_clipped=0x2 } flags; + IPoint asend, asstart; +} LineList; + +typedef struct linearapprox { + real scale; + unsigned int oneline: 1; + unsigned int onepoint: 1; + unsigned int any: 1; /* refers to a particular screen */ + struct linelist *lines; + struct linearapprox *next; +} LinearApprox; + +typedef struct spline1d { + real a, b, c, d; +} Spline1D; + +typedef struct spline { + unsigned int islinear: 1; /* No control points */ + unsigned int isquadratic: 1; /* probably read in from ttf */ + unsigned int isticked: 1; + unsigned int isneeded: 1; /* Used in remove overlap */ + unsigned int isunneeded: 1; /* Used in remove overlap */ + unsigned int exclude: 1; /* Used in remove overlap varient: exclude */ + unsigned int ishorvert: 1; + unsigned int knowncurved: 1; /* We know that it curves */ + unsigned int knownlinear: 1; /* it might have control points, but still traces out a line */ + /* If neither knownlinear nor curved then we haven't checked */ + unsigned int order2: 1; /* It's a bezier curve with only one cp */ + unsigned int touched: 1; + unsigned int leftedge: 1; + unsigned int rightedge: 1; + SplinePoint *from, *to; + Spline1D splines[2]; /* splines[0] is the x spline, splines[1] is y */ + struct linearapprox *approx; + /* Posible optimizations: + Precalculate bounding box + Precalculate points of inflection + */ +} Spline; + +typedef struct splinepointlist { + SplinePoint *first, *last; + struct splinepointlist *next; +} SplinePointList, SplineSet; + +typedef struct imagelist { + struct gimage *image; + real xoff, yoff; /* position in character space of upper left corner of image */ + real xscale, yscale; /* scale to convert one pixel of image to one unit of character space */ + DBounds bb; + struct imagelist *next; + unsigned int selected: 1; +} ImageList; + +typedef struct refchar { + unsigned int checked: 1; + unsigned int selected: 1; + unsigned int point_match: 1; /* transform[4:5] are point indexes */ + /* and need to be converted to offsets*/ + /* after truetype readin */ + int16 adobe_enc; + int local_enc; + int unicode_enc; /* used by paste */ + real transform[6]; /* transformation matrix (first 2 rows of a 3x3 matrix, missing row is 0,0,1) */ +#ifdef FONTFORGE_CONFIG_TYPE3 + struct reflayer { + struct brush fill_brush; + struct pen stroke_pen; + unsigned int dofill: 1; + unsigned int dostroke: 1; + unsigned int fillfirst: 1; + SplinePointList *splines; + ImageList *images; + } *layers; +#else + struct reflayer { + SplinePointList *splines; + } layers[1]; +#endif + int layer_cnt; + struct refchar *next; + DBounds bb; + struct splinechar *sc; + BasePoint top; +} RefChar; + +typedef struct kernpair { + struct splinechar *sc; + int16 off; + uint16 sli, flags; + uint16 kcid; + struct kernpair *next; +} KernPair; + +typedef struct kernclass { + int first_cnt, second_cnt; /* Count of classes for first and second chars */ + char **firsts; /* list of a space seperated list of char names */ + char **seconds; /* one entry for each class. Entry 0 is null */ + /* and means everything not specified elsewhere */ + uint16 sli; + uint16 flags; + uint16 kcid; + int16 *offsets; /* array of first_cnt*second_cnt entries */ + struct kernclass *next; +} KernClass; + +/* Some stems may appear, disappear, reapear several times */ +/* Serif stems on I which appear at 0, disappear, reappear at top */ +/* Or the major vertical stems on H which disappear at the cross bar */ +typedef struct hintinstance { + real begin; /* location in the non-major direction*/ + real end; /* width/height in non-major direction*/ + unsigned int closed: 1; + short int counternumber; + struct hintinstance *next; +} HintInstance; + +enum hinttypes { ht_unspecified=0, ht_h, ht_v, ht_d }; +typedef real _MMArray[2][MmMax]; + +typedef struct steminfo { + struct steminfo *next; + unsigned int hinttype: 2; /* Only used by undoes */ + unsigned int ghost: 1; /* this is a ghost stem hint. As such truetype should ignore it, type2 output should negate it, and type1 should use as is */ + /* stored width will be either 20 or 21 */ + /* Type2 says: -20 is "width" of top edge, -21 is "width" of bottom edge, type1 accepts either */ + unsigned int haspointleft:1; + unsigned int haspointright:1; + unsigned int hasconflicts:1;/* Does this stem have conflicts within its cluster? */ + unsigned int used: 1; /* Temporary for counter hints or hint substitution */ + unsigned int tobeused: 1; /* Temporary for counter hints or hint substitution */ + unsigned int active: 1; /* Currently active hint in Review Hints dlg */ + /* displayed differently in char display */ + unsigned int enddone: 1; /* Used by ttf instructing, indicates a prev */ + /* hint had the same end as this one (so */ + /* the points on the end line have been */ + /* instructed already */ + unsigned int startdone: 1; /* Used by ttf instructing */ + unsigned int backwards: 1; /* If we think this hint is better done with a negative width */ + unsigned int reordered: 1; /* In AutoHinting. Means we changed the start of the hint, need to test for out of order */ + unsigned int pendingpt: 1; /* A pending stem creation, not a true stem */ + unsigned int linearedges: 1;/* If we have a nice rectangle then we aren't */ + /* interested in the orientation which is */ + /* wider than long */ + unsigned int bigsteminfo: 1;/* See following structure */ + int16 hintnumber; /* when dumping out hintmasks we need to know */ + /* what bit to set for this hint */ + union { + int mask; /* Mask of all references that use this hint */ + /* in type2 output */ + _MMArray *unblended /*[2][MmMax]*/; /* Used when reading in type1 mm hints */ + } u; + real start; /* location at which the stem starts */ + real width; /* or height */ + HintInstance *where; /* location(s) in the other coord */ +} StemInfo; + +typedef struct pointlist { struct pointlist *next; SplinePoint *sp; } PointList; +typedef struct bigsteminfo { + StemInfo s; + PointList *left, *right; +} BigStemInfo; + +typedef struct dsteminfo { + struct dsteminfo *next; /* First two fields match those in steminfo */ + unsigned int hinttype: 2; /* Only used by undoes */ + unsigned int used: 1; /* used only by tottf.c:gendinstrs, metafont.c to mark a hint that has been dealt with */ + unsigned int bigsteminfo: 1;/* See following structure */ + BasePoint leftedgetop, leftedgebottom, rightedgetop, rightedgebottom; /* this order is important in tottf.c: DStemInteresect */ +} DStemInfo; + +typedef struct bigdsteminfo { + DStemInfo s; + PointList *left, *right; +} BigDStemInfo; + +typedef struct minimumdistance { + /* If either point is NULL it will be assumed to mean either the origin */ + /* or the width point (depending on which is closer). This allows user */ + /* to control metrics... */ + SplinePoint *sp1, *sp2; + unsigned int x: 1; + unsigned int done: 1; + struct minimumdistance *next; +} MinimumDistance; + +typedef struct layer /* : reflayer */{ +#ifdef FONTFORGE_CONFIG_TYPE3 + struct brush fill_brush; + struct pen stroke_pen; + unsigned int dofill: 1; + unsigned int dostroke: 1; + unsigned int fillfirst: 1; +#endif + SplinePointList *splines; + ImageList *images; /* Only in background or type3 layer(s) */ + RefChar *refs; /* Only in foreground layer(s) */ + Undoes *undoes; + Undoes *redoes; +} Layer; + +enum layer_type { ly_grid= -1, ly_back=0, ly_fore=1 /* Possibly other foreground layers for multi-layered things */ }; + +typedef struct splinechar { + char *name; + int enc, unicodeenc, old_enc; + int16 width, vwidth; + int16 lsidebearing; /* only used when reading in a type1 font */ + /* Or an otf font where it is the subr number of a refered character */ + /* or a ttf font with vert metrics where it is the ymax value */ + /* or when generating morx where it is the mask of tables in which the glyph occurs */ + /* Always a temporary value */ + uint16 orig_pos; /* Original position in the glyph list */ + int ttf_glyph; /* only used when writing out a ttf or otf font */ +#ifdef FONTFORGE_CONFIG_TYPE3 + Layer *layers; /* layer[0] is background, layer[1-n] foreground */ +#else + Layer layers[2]; /* layer[0] is background, layer[1] foreground */ +#endif + int layer_cnt; + StemInfo *hstem; /* hstem hints have a vertical offset but run horizontally */ + StemInfo *vstem; /* vstem hints have a horizontal offset but run vertically */ + DStemInfo *dstem; /* diagonal hints for ttf */ + MinimumDistance *md; + struct charview *views; + struct charinfo *charinfo; + struct splinefont *parent; + unsigned int changed: 1; + unsigned int changedsincelasthinted: 1; + unsigned int manualhints: 1; + unsigned int ticked: 1; /* For reference character processing */ + unsigned int changed_since_autosave: 1; + unsigned int widthset: 1; /* needed so an emspace char doesn't disappear */ + unsigned int vconflicts: 1; /* Any hint overlaps in the vstem list? */ + unsigned int hconflicts: 1; /* Any hint overlaps in the hstem list? */ + unsigned int anyflexes: 1; + unsigned int searcherdummy: 1; + unsigned int changed_since_search: 1; + unsigned int wasopen: 1; + unsigned int namechanged: 1; + unsigned int blended: 1; /* An MM blended character */ + unsigned int unused_so_far: 1; + unsigned int glyph_class: 3; /* 0=> fontforge determines class automagically, else one more than the class value in gdef */ + /* 13 bits left */ +#if HANYANG + unsigned int compositionunit: 1; + int16 jamo, varient; +#endif + struct splinecharlist { struct splinechar *sc; struct splinecharlist *next;} *dependents; + /* The dependents list is a list of all characters which refenence*/ + /* the current character directly */ + KernPair *kerns; + KernPair *vkerns; + PST *possub; /* If we are a ligature then this tells us what */ + /* It may also contain a bunch of other stuff now */ + LigList *ligofme; /* If this is the first character of a ligature then this gives us the list of possible ones */ + /* this field must be regenerated before the font is saved */ + unichar_t *comment; + uint32 /*Color*/ color; + AnchorPoint *anchor; + uint8 *ttf_instrs; + int16 ttf_instrs_len; + int16 countermask_cnt; + HintMask *countermasks; +} SplineChar; + +enum ttfnames { ttf_copyright=0, ttf_family, ttf_subfamily, ttf_uniqueid, + ttf_fullname, ttf_version, ttf_postscriptname, ttf_trademark, + ttf_manufacturer, ttf_designer, ttf_descriptor, ttf_venderurl, + ttf_designerurl, ttf_license, ttf_licenseurl, ttf_idontknow, ttf_preffamilyname, + ttf_prefmodifiers, ttf_compatfull, ttf_sampletext, ttf_namemax }; +struct ttflangname { + int lang; + unichar_t *names[ttf_namemax]; + struct ttflangname *next; +}; + +struct remap { uint32 firstenc, lastenc; int32 infont; }; +enum uni_interp { ui_unset= -1, ui_none, ui_adobe, ui_greek, ui_japanese, + ui_trad_chinese, ui_simp_chinese, ui_korean }; + +typedef struct splinefont { + char *fontname, *fullname, *familyname, *weight; + char *copyright; + char *filename; + char *version; + real italicangle, upos, uwidth; /* In font info */ + int ascent, descent; + int vertical_origin; /* height of vertical origin in character coordinate system */ + int uniqueid; /* Not copied when reading in!!!! */ + int charcnt; + SplineChar **chars; + unsigned int changed: 1; + unsigned int changed_since_autosave: 1; + unsigned int changed_since_xuidchanged: 1; + unsigned int display_antialias: 1; + unsigned int display_bbsized: 1; + unsigned int dotlesswarn: 1; /* User warned that font doesn't have a dotless i character */ + unsigned int onlybitmaps: 1; /* it's a bdf editor, not a postscript editor */ + unsigned int serifcheck: 1; /* Have we checked to see if we have serifs? */ + unsigned int issans: 1; /* We have no serifs */ + unsigned int isserif: 1; /* We have serifs. If neither set then we don't know. */ + unsigned int hasvmetrics: 1; /* We've got vertical metric data and should output vhea/vmtx/VORG tables */ + unsigned int loading_cid_map: 1; + unsigned int dupnamewarn: 1; /* Warn about duplicate names when loading bdf font */ + unsigned int compacted: 1; /* Font is in a compacted glyph list */ + unsigned int encodingchanged: 1; /* Font's encoding has changed since it was loaded */ + unsigned int order2: 1; /* Font's data are order 2 bezier splines (truetype) rather than order 3 (postscript) */ + unsigned int multilayer: 1; /* only applies if TYPE3 is set, means this font can contain strokes & fills */ + /* I leave it in so as to avoid cluttering up code with #ifdefs */ + unsigned int new: 1; /* A new and unsaved font */ + struct fontview *fv; + enum charset encoding_name, old_encname; + enum uni_interp uni_interp; + Layer grid; + BDFFont *bitmaps; + char *origname; /* filename of font file (ie. if not an sfd) */ + char *autosavename; + int display_size; /* a val <0 => Generate our own images from splines, a value >0 => find a bdf font of that size */ + struct psdict *private; /* read in from type1 file or provided by user */ + char *xuid; + struct pfminfo { /* A misnomer now. OS/2 info would be more accurate, but that's stuff in here from all over ttf files */ + unsigned int pfmset: 1; + unsigned char pfmfamily; + int16 weight; + int16 width; + char panose[10]; + int16 fstype; + int16 linegap; + int16 vlinegap; + /*int16 hhead_ascent, hhead_descent;*/ + int16 os2_typoascent, os2_typodescent; + int16 os2_winascent, os2_windescent; + } pfminfo; + struct ttflangname *names; + char *cidregistry, *ordering; + int supplement; + int subfontcnt; + struct splinefont **subfonts; + struct splinefont *cidmaster; /* Top level cid font */ + float cidversion; +#if HANYANG + struct compositionrules *rules; +#endif + char *comments; + struct remap *remap; + int tempuniqueid; + int top_enc; + uint16 desired_row_cnt, desired_col_cnt; + AnchorClass *anchor; + struct glyphnamehash *glyphnames; + struct table_ordering { uint32 table_tag; uint32 *ordered_features; struct table_ordering *next; } *orders; + struct ttf_table { + uint32 tag; + int32 len, maxlen; + uint8 *data; + struct ttf_table *next; + } *ttf_tables; + /* We copy: fpgm, prep, cvt, maxp */ + struct instrdata *instr_dlgs; /* Pointer to all table and character instruction dlgs in this font */ + struct shortview *cvt_dlg; + /* Any GPOS/GSUB entry (PST, AnchorClass, kerns, FPST */ + /* Has an entry saying what scripts/languages it should appear it */ + /* Things like fractions will appear in almost all possible script/lang */ + /* combinations, while alphabetic ligatures will only live in one script */ + /* Rather than store the complete list of possibilities in each PST we */ + /* store all choices used here, and just store an index into this list */ + /* in the PST. All lists are terminated by a 0 entry */ + struct script_record { + uint32 script; + uint32 *langs; + } **script_lang; + struct kernclass *kerns, *vkerns; + struct kernclasslistdlg *kcld, *vkcld; + struct texdata { + enum { tex_unset, tex_text, tex_math, tex_mathext } type; + int32 designsize; + int32 params[22]; /* param[6] has different meanings in normal and math fonts */ + } texdata; + struct gentagtype { + uint16 tt_cur, tt_max; + struct tagtype { + enum possub_type type; + uint32 tag; + } *tagtype; + } gentags; + FPST *possub; + ASM *sm; /* asm is a keyword */ + MacFeat *features; + char *chosenname; /* Set for files with multiple fonts in them */ + struct mmset *mm; /* If part of a multiple master set */ + int16 macstyle; + int16 sli_cnt; +} SplineFont; + +/* I am going to simplify my life and not encourage intermediate designs */ +/* this means I can easily calculate ConvertDesignVector, and don't have */ +/* to bother the user with specifying it. */ +/* (NormalizeDesignVector is fairly basic and shouldn't need user help ever) */ +/* (As long as they want piecewise linear) */ +typedef struct mmset { + int axis_count; + char *axes[4]; + int instance_count; + SplineFont **instances; + SplineFont *normal; + real *positions; /* array[instance][axis] saying where each instance lies on each axis */ + real *defweights; /* array[instance] saying how much of each instance makes the normal font */ + struct axismap { + int points; /* size of the next two arrays */ + real *blends; /* between [0,1] ordered so that blend[0] original base char) */ + unsigned int ticked: 1; /* Used as a mark to mark */ +} AnchorPos; + +enum ttf_flags { ttf_flag_shortps = 1, ttf_flag_nohints = 2, + ttf_flag_applemode=4, + ttf_flag_pfed_comments=8, ttf_flag_pfed_colors=0x10, + ttf_flag_otmode=0x20 + }; +enum openflags { of_fstypepermitted=1 }; +enum ps_flags { ps_flag_nohintsubs = 0x10000, ps_flag_noflex=0x20000, + ps_flag_nohints = 0x40000, ps_flag_restrict256=0x80000, + ps_flag_afm = 0x100000, ps_flag_pfm = 0x200000, + ps_flag_tfm = 0x400000, + ps_flag_round = 0x800000, + ps_flag_mask = (ps_flag_nohintsubs|ps_flag_noflex| + ps_flag_afm|ps_flag_pfm|ps_flag_tfm|ps_flag_round) + }; + +struct fontdict; +struct pschars; +struct findsel; +struct charprocs; +enum charset; +struct enc; + +extern void *chunkalloc(int size); +extern void chunkfree(void *, int size); + +extern SplineFont *SplineFontFromPSFont(struct fontdict *fd); +extern int CheckAfmOfPostscript(SplineFont *sf,char *psname); +extern int LoadKerningDataFromAmfm(SplineFont *sf, char *filename); +extern int LoadKerningDataFromAfm(SplineFont *sf, char *filename); +extern int LoadKerningDataFromTfm(SplineFont *sf, char *filename); +extern int LoadKerningDataFromMacFOND(SplineFont *sf, char *filename); +extern int SFOneWidth(SplineFont *sf); +extern int CIDOneWidth(SplineFont *sf); +extern int SFOneHeight(SplineFont *sf); +extern int SFIsCJK(SplineFont *sf); +enum fontformat { ff_pfa, ff_pfb, ff_pfbmacbin, ff_multiple, ff_mma, ff_mmb, + ff_ptype3, ff_ptype0, ff_cid, ff_cff, ff_cffcid, + ff_ttf, ff_ttfsym, ff_ttfmacbin, ff_ttfdfont, ff_otf, ff_otfdfont, + ff_otfcid, ff_otfciddfont, ff_svg, ff_none }; +extern struct pschars *SplineFont2Chrs(SplineFont *sf, int iscjk, + struct pschars *subrs,int flags,enum fontformat format); +struct cidbytes; +struct fd2data; +struct ttfinfo; +struct alltabs; +struct growbuf; +extern int CvtPsStem3(struct growbuf *gb, SplineChar *scs[MmMax], int instance_count, + int ishstem, int round); +extern struct pschars *CID2Chrs(SplineFont *cidmaster,struct cidbytes *cidbytes,int flags); +extern struct pschars *SplineFont2Subrs2(SplineFont *sf,int flags); +extern struct pschars *SplineFont2Chrs2(SplineFont *sf, int nomwid, int defwid, + struct pschars *subrs,int flags/*, enum fontformat format*/); +extern struct pschars *CID2Chrs2(SplineFont *cidmaster,struct fd2data *fds,int flags); +enum bitmapformat { bf_bdf, bf_ttf, bf_sfnt_dfont, + bf_nfntmacbin, /*bf_nfntdfont, */bf_fon, bf_otb, bf_none }; +extern const char *GetAuthor(void); +extern SplineChar *SFFindExistingCharMac(SplineFont *,int unienc); +extern void SC_PSDump(void (*dumpchar)(int ch,void *data), void *data, + SplineChar *sc, int refs_to_splines, int pdfopers ); +extern int _WritePSFont(FILE *out,SplineFont *sf,enum fontformat format,int flags); +extern int WritePSFont(char *fontname,SplineFont *sf,enum fontformat format,int flags); +extern int WriteMacPSFont(char *fontname,SplineFont *sf,enum fontformat format,int flags); +extern int _WriteTTFFont(FILE *ttf,SplineFont *sf, enum fontformat format, + int32 *bsizes, enum bitmapformat bf,int flags); +extern int WriteTTFFont(char *fontname,SplineFont *sf, enum fontformat format, + int32 *bsizes, enum bitmapformat bf,int flags); +extern int WriteMacTTFFont(char *fontname,SplineFont *sf, enum fontformat format, + int32 *bsizes, enum bitmapformat bf,int flags); +extern int WriteMacBitmaps(char *filename,SplineFont *sf, int32 *sizes,int is_dfont); +extern int WriteMacFamily(char *filename,struct sflist *sfs,enum fontformat format, + enum bitmapformat bf,int flags); +extern int WriteSVGFont(char *fontname,SplineFont *sf,enum fontformat format,int flags); +extern void SfListFree(struct sflist *sfs); +extern struct ttflangname *TTFLangNamesCopy(struct ttflangname *old); +extern void TTF_PSDupsDefault(SplineFont *sf); +extern void DefaultTTFEnglishNames(struct ttflangname *dummy, SplineFont *sf); +extern void TeXDefaultParams(SplineFont *sf); +extern void OS2FigureCodePages(SplineFont *sf, uint32 CodePage[2]); +extern void SFDefaultOS2Info(struct pfminfo *pfminfo,SplineFont *sf,char *fontname); +extern void SFDefaultOS2Simple(struct pfminfo *pfminfo,SplineFont *sf); +extern int ScriptIsRightToLeft(uint32 script); +extern uint32 ScriptFromUnicode(int u,SplineFont *sf); +extern uint32 SCScriptFromUnicode(SplineChar *sc); +extern int SCRightToLeft(SplineChar *sc); +extern int SLIContainsR2L(SplineFont *sf,int sli); +extern void SFFindNearTop(SplineFont *); +extern void SFRestoreNearTop(SplineFont *); +extern int SFAddDelChars(SplineFont *sf, int nchars); +extern int SFForceEncoding(SplineFont *sf,enum charset new_map); +extern int SFReencodeFont(SplineFont *sf,enum charset new_map); +extern int SFCompactFont(SplineFont *sf); +extern int SFUncompactFont(SplineFont *sf); +extern int CountOfEncoding(enum charset encoding_name); +extern int SFMatchEncoding(SplineFont *sf,SplineFont *target); +extern char *SFGetModifiers(SplineFont *sf); +extern void SFSetFontName(SplineFont *sf, char *family, char *mods, char *full); +extern void ttfdumpbitmap(SplineFont *sf,struct alltabs *at,int32 *sizes); +extern void ttfdumpbitmapscaling(SplineFont *sf,struct alltabs *at,int32 *sizes); + +extern int RealNear(real a,real b); +extern int RealNearish(real a,real b); +extern int RealApprox(real a,real b); +extern int RealWithin(real a,real b,real fudge); + +extern void LineListFree(LineList *ll); +extern void LinearApproxFree(LinearApprox *la); +extern void SplineFree(Spline *spline); +extern SplinePoint *SplinePointCreate(real x, real y); +extern void SplinePointFree(SplinePoint *sp); +extern void SplinePointMDFree(SplineChar *sc,SplinePoint *sp); +extern void SplinePointsFree(SplinePointList *spl); +extern void SplinePointListFree(SplinePointList *spl); +extern void SplinePointListMDFree(SplineChar *sc,SplinePointList *spl); +extern void SplinePointListsFree(SplinePointList *head); +extern void RefCharFree(RefChar *ref); +extern void RefCharsFree(RefChar *ref); +extern void RefCharsFreeRef(RefChar *ref); +extern void UndoesFree(Undoes *undo); +extern void StemInfosFree(StemInfo *h); +extern void StemInfoFree(StemInfo *h); +extern void DStemInfosFree(DStemInfo *h); +extern void DStemInfoFree(DStemInfo *h); +extern void KernPairsFree(KernPair *kp); +extern void SCOrderAP(SplineChar *sc); +extern void AnchorPointsFree(AnchorPoint *kp); +extern AnchorPoint *AnchorPointsCopy(AnchorPoint *alist); +extern void SFRemoveAnchorClass(SplineFont *sf,AnchorClass *an); +extern int AnchorClassesNextMerge(AnchorClass *ac); +extern AnchorPoint *APAnchorClassMerge(AnchorPoint *anchors,AnchorClass *into,AnchorClass *from); +extern void AnchorClassMerge(SplineFont *sf,AnchorClass *into,AnchorClass *from); +extern void AnchorClassesFree(AnchorClass *kp); +extern void TableOrdersFree(struct table_ordering *ord); +extern void TtfTablesFree(struct ttf_table *tab); +extern AnchorClass *AnchorClassMatch(SplineChar *sc1,SplineChar *sc2, + AnchorClass *restrict_, AnchorPoint **_ap1,AnchorPoint **_ap2 ); +extern AnchorClass *AnchorClassMkMkMatch(SplineChar *sc1,SplineChar *sc2, + AnchorPoint **_ap1,AnchorPoint **_ap2 ); +extern AnchorClass *AnchorClassCursMatch(SplineChar *sc1,SplineChar *sc2, + AnchorPoint **_ap1,AnchorPoint **_ap2 ); +extern PST *SCFindPST(SplineChar *sc,int type,uint32 tag,int sli,int flags); +extern void SCInsertPST(SplineChar *sc,PST *new); +extern void PSTFree(PST *lig); +extern void PSTsFree(PST *lig); +extern uint16 PSTDefaultFlags(enum possub_type type,SplineChar *sc ); +extern int PSTContains(const char *components,const char *name); +extern int SCDefaultSLI(SplineFont *sf, SplineChar *default_script); +extern StemInfo *StemInfoCopy(StemInfo *h); +extern DStemInfo *DStemInfoCopy(DStemInfo *h); +extern MinimumDistance *MinimumDistanceCopy(MinimumDistance *h); +extern PST *PSTCopy(PST *base,SplineChar *sc,SplineFont *from); +extern SplineChar *SplineCharCopy(SplineChar *sc,SplineFont *into); +extern BDFChar *BDFCharCopy(BDFChar *bc); +extern void BitmapsCopy(SplineFont *to, SplineFont *from, int to_index, int from_index ); +extern struct gimage *ImageAlterClut(struct gimage *image); +extern void ImageListsFree(ImageList *imgs); +extern void TTFLangNamesFree(struct ttflangname *l); +extern void MinimumDistancesFree(MinimumDistance *md); +extern void LayerDefault(Layer *); +extern SplineChar *SplineCharCreate(void); +extern RefChar *RefCharCreate(void); +extern void ScriptRecordFree(struct script_record *sr); +extern void ScriptRecordListFree(struct script_record **script_lang); +extern KernClass *KernClassCopy(KernClass *kc); +extern void KernClassListFree(KernClass *kc); +extern int KernClassContains(KernClass *kc, char *name1, char *name2, int ordered ); +extern void FPSTFree(FPST *fpst); +extern void ASMFree(ASM *sm); +extern void MacNameListFree(struct macname *mn); +extern void MacSettingListFree(struct macsetting *ms); +extern void MacFeatListFree(MacFeat *mf); +extern void SplineCharListsFree(struct splinecharlist *dlist); +extern void SplineCharFreeContents(SplineChar *sc); +extern void SplineCharFree(SplineChar *sc); +extern void SplineFontFree(SplineFont *sf); +extern void MMSetFreeContents(MMSet *mm); +extern void MMSetFree(MMSet *mm); +extern void SFRemoveUndoes(SplineFont *sf,uint8 *selected); +extern void SplineRefigure3(Spline *spline); +extern void SplineRefigure(Spline *spline); +extern Spline *SplineMake3(SplinePoint *from, SplinePoint *to); +extern LinearApprox *SplineApproximate(Spline *spline, real scale); +extern int SplinePointListIsClockwise(SplineSet *spl); +extern void SplineSetFindBounds(SplinePointList *spl, DBounds *bounds); +extern void SplineCharFindBounds(SplineChar *sc,DBounds *bounds); +extern void SplineFontFindBounds(SplineFont *sf,DBounds *bounds); +extern void CIDFindBounds(SplineFont *sf,DBounds *bounds); +extern void SplineSetQuickBounds(SplineSet *ss,DBounds *b); +extern void SplineCharQuickBounds(SplineChar *sc, DBounds *b); +extern void SplineSetQuickConservativeBounds(SplineSet *ss,DBounds *b); +extern void SplineCharQuickConservativeBounds(SplineChar *sc, DBounds *b); +extern void SplineFontQuickConservativeBounds(SplineFont *sf,DBounds *b); +extern void SplinePointCatagorize(SplinePoint *sp); +extern int SplinePointIsACorner(SplinePoint *sp); +extern void SPLCatagorizePoints(SplinePointList *spl); +extern void SCCatagorizePoints(SplineChar *sc); +extern SplinePointList *SplinePointListCopy1(SplinePointList *spl); +extern SplinePointList *SplinePointListCopy(SplinePointList *base); +extern SplinePointList *SplinePointListCopySelected(SplinePointList *base); +extern ImageList *ImageListCopy(ImageList *cimg); +extern ImageList *ImageListTransform(ImageList *cimg,real transform[6]); +extern void ApTransform(AnchorPoint *ap, real transform[6]); +extern SplinePointList *SplinePointListTransform(SplinePointList *base, real transform[6], int allpoints ); +extern SplinePointList *SplinePointListShift(SplinePointList *base, real xoff, int allpoints ); +extern SplinePointList *SplinePointListRemoveSelected(SplineChar *sc,SplinePointList *base); +extern void SplinePointListSet(SplinePointList *tobase, SplinePointList *frombase); +extern void SplinePointListSelect(SplinePointList *spl,int sel); +extern void SCRefToSplines(SplineChar *sc,RefChar *rf); +extern void RefCharFindBounds(RefChar *rf); +extern void SCReinstanciateRefChar(SplineChar *sc,RefChar *rf); +extern void SCReinstanciateRef(SplineChar *sc,SplineChar *rsc); +extern void SFReinstanciateRefs(SplineFont *sf); +extern SplineChar *MakeDupRef(SplineChar *base, int local_enc, int uni_enc); +extern void SCRemoveDependent(SplineChar *dependent,RefChar *rf); +extern void SCRemoveLayerDependents(SplineChar *dependent,int layer); +extern void SCRemoveDependents(SplineChar *dependent); +extern RefChar *SCCanonicalRefs(SplineChar *sc, int isps); +extern int SCDependsOnSC(SplineChar *parent, SplineChar *child); +extern void BCCompressBitmap(BDFChar *bdfc); +extern void BCRegularizeBitmap(BDFChar *bdfc); +extern void BCRegularizeGreymap(BDFChar *bdfc); +extern void BCPasteInto(BDFChar *bc,BDFChar *rbc,int ixoff,int iyoff, int invert, int cleartoo); +extern void BCRotateCharForVert(BDFChar *bc,BDFChar *from, BDFFont *frombdf); +extern BDFChar *SplineCharRasterize(SplineChar *sc, double pixelsize); +extern BDFFont *SplineFontToBDFHeader(SplineFont *_sf, int pixelsize, int indicate); +extern BDFFont *SplineFontRasterize(SplineFont *sf, int pixelsize, int indicate); +extern BDFChar *SplineCharAntiAlias(SplineChar *sc, int pixelsize,int linear_scale); +extern BDFFont *SplineFontAntiAlias(SplineFont *sf, int pixelsize,int linear_scale); +extern struct clut *_BDFClut(int linear_scale); +extern void BDFClut(BDFFont *bdf, int linear_scale); +extern int BDFDepth(BDFFont *bdf); +extern BDFChar *BDFPieceMeal(BDFFont *bdf, int index); +enum piecemeal_flags { pf_antialias=1, pf_bbsized=2 }; +extern BDFFont *SplineFontPieceMeal(SplineFont *sf,int pixelsize,int flags,void *freetype_context); +extern BDFFont *BitmapFontScaleTo(BDFFont *old, int to); +extern void BDFCharFree(BDFChar *bdfc); +extern void BDFFontFree(BDFFont *bdf); +extern int BDFFontDump(char *filename,BDFFont *font, char *encodingname,int res); +extern int FONFontDump(char *filename,BDFFont *font, int res); +/* Two lines intersect in at most 1 point */ +/* Two quadratics intersect in at most 4 points */ +/* Two cubics intersect in at most 9 points */ /* Plus an extra space for a trailing -1 */ +extern int SplinesIntersect(Spline *s1, Spline *s2, BasePoint pts[9], + double t1s[10], double t2s[10]); +extern int CubicSolve(Spline1D *sp,double ts[3]); +extern double IterateSplineSolve(Spline1D *sp, double tmin, double tmax, double sought_y, double err); +extern double SplineSolve(Spline1D *sp, real tmin, real tmax, real sought_y, real err); +extern int SplineSolveFull(Spline1D *sp,double val, double ts[3]); +extern void SplineFindExtrema(Spline1D *sp, double *_t1, double *_t2 ); +extern int Spline2DFindExtrema(Spline *sp, double extrema[4] ); +extern int SplineAtInflection(Spline1D *sp, double t ); +extern int SplineAtMinMax(Spline1D *sp, double t ); +extern void SplineRemoveInflectionsTooClose(Spline1D *sp, double *_t1, double *_t2 ); +extern int NearSpline(struct findsel *fs, Spline *spline); +extern real SplineNearPoint(Spline *spline, BasePoint *bp, real fudge); +extern void SCMakeDependent(SplineChar *dependent,SplineChar *base); +extern SplinePoint *SplineBisect(Spline *spline, double t); +extern Spline *SplineSplit(Spline *spline, double ts[3]); +extern Spline *ApproximateSplineFromPoints(SplinePoint *from, SplinePoint *to, + TPoint *mid, int cnt,int order2); +extern Spline *ApproximateSplineFromPointsSlopes(SplinePoint *from, SplinePoint *to, + TPoint *mid, int cnt,int order2); +extern double SplineLength(Spline *spline); +extern int SplineIsLinear(Spline *spline); +extern int SplineIsLinearMake(Spline *spline); +extern int SplineInSplineSet(Spline *spline, SplineSet *spl); +extern int SSPointWithin(SplineSet *spl,BasePoint *pt); +extern SplineSet *SSRemoveZeroLengthSplines(SplineSet *base); +extern void SplineCharMerge(SplineChar *sc,SplineSet **head,int type); +extern void SplinePointListSimplify(SplineChar *sc,SplinePointList *spl, + struct simplifyinfo *smpl); +extern SplineSet *SplineCharSimplify(SplineChar *sc,SplineSet *head, + struct simplifyinfo *smpl); +extern SplineSet *SplineSetJoin(SplineSet *start,int doall,real fudge,int *changed); +extern Spline *SplineAddExtrema(Spline *s); +extern void SplineSetAddExtrema(SplineSet *ss,int between_selected); +extern void SplineCharAddExtrema(SplineSet *head,int between_selected); +extern SplineSet *SplineCharRemoveTiny(SplineChar *sc,SplineSet *head); +extern SplineFont *SplineFontNew(void); +extern char *GetNextUntitledName(void); +extern SplineFont *SplineFontEmpty(void); +extern SplineFont *SplineFontBlank(int enc,int charcnt); +extern void SFIncrementXUID(SplineFont *sf); +extern void SFRandomChangeXUID(SplineFont *sf); +extern SplineSet *SplineSetReverse(SplineSet *spl); +extern SplineSet *SplineSetsExtractOpen(SplineSet **tbase); +extern void SplineSetsInsertOpen(SplineSet **tbase,SplineSet *open); +extern SplineSet *SplineSetsCorrect(SplineSet *base,int *changed); +extern SplineSet *SplineSetsAntiCorrect(SplineSet *base); +extern SplineSet *SplineSetsDetectDir(SplineSet **_base, int *lastscan); +extern void SPAverageCps(SplinePoint *sp); +extern void SPWeightedAverageCps(SplinePoint *sp); +extern void SplineCharDefaultPrevCP(SplinePoint *base); +extern void SplineCharDefaultNextCP(SplinePoint *base); +extern void SplineCharTangentNextCP(SplinePoint *sp); +extern void SplineCharTangentPrevCP(SplinePoint *sp); +extern void SPSmoothJoint(SplinePoint *sp); +extern int PointListIsSelected(SplinePointList *spl); +extern void SplineSetsUntick(SplineSet *spl); +extern void SFOrderBitmapList(SplineFont *sf); +extern int KernThreshold(SplineFont *sf, int cnt); +extern real SFGuessItalicAngle(SplineFont *sf); +extern void SFHasSerifs(SplineFont *sf); + +extern SplinePoint *SplineTtfApprox(Spline *ps); +extern SplineSet *SSttfApprox(SplineSet *ss); +extern SplineSet *SplineSetsTTFApprox(SplineSet *ss); +extern SplineSet *SSPSApprox(SplineSet *ss); +extern SplineSet *SplineSetsPSApprox(SplineSet *ss); +extern SplineSet *SplineSetsConvertOrder(SplineSet *ss, int to_order2); +extern void SplineRefigure2(Spline *spline); +extern void SplineRefigureFixup(Spline *spline); +extern Spline *SplineMake2(SplinePoint *from, SplinePoint *to); +extern Spline *SplineMake(SplinePoint *from, SplinePoint *to, int order2); +extern Spline *SFSplineMake(SplineFont *sf,SplinePoint *from, SplinePoint *to); +extern void SCConvertToOrder2(SplineChar *sc); +extern void SFConvertToOrder2(SplineFont *sf); +extern void SCConvertToOrder3(SplineChar *sc); +extern void SFConvertToOrder3(SplineFont *sf); +extern void SCConvertOrder(SplineChar *sc, int to_order2); +extern void SplinePointPrevCPChanged2(SplinePoint *sp, int fixnext); +extern void SplinePointNextCPChanged2(SplinePoint *sp, int fixprev); +extern int IntersectLines(BasePoint *inter, + BasePoint *line1_1, BasePoint *line1_2, + BasePoint *line2_1, BasePoint *line2_2); +extern int IntersectLinesClip(BasePoint *inter, + BasePoint *line1_1, BasePoint *line1_2, + BasePoint *line2_1, BasePoint *line2_2); + +#if 0 +extern void SSBisectTurners(SplineSet *spl); +#endif +extern SplineSet *SplineSetStroke(SplineSet *spl,StrokeInfo *si,SplineChar *sc); +extern SplineSet *SSStroke(SplineSet *spl,StrokeInfo *si,SplineChar *sc); +extern SplineSet *SplineSetRemoveOverlap(SplineChar *sc,SplineSet *base,enum overlap_type); + +extern void FindBlues( SplineFont *sf, real blues[14], real otherblues[10]); +extern void QuickBlues(SplineFont *sf, BlueData *bd); +extern void FindHStems( SplineFont *sf, real snaps[12], real cnt[12]); +extern void FindVStems( SplineFont *sf, real snaps[12], real cnt[12]); +extern int SplineCharIsFlexible(SplineChar *sc); +extern void SCGuessHHintInstancesAndAdd(SplineChar *sc, StemInfo *stem, real guess1, real guess2); +extern void SCGuessVHintInstancesAndAdd(SplineChar *sc, StemInfo *stem, real guess1, real guess2); +extern void SCGuessHHintInstancesList(SplineChar *sc); +extern void SCGuessVHintInstancesList(SplineChar *sc); +extern real HIlen( StemInfo *stems); +extern real HIoverlap( HintInstance *mhi, HintInstance *thi); +extern int StemInfoAnyOverlaps(StemInfo *stems); +extern int StemListAnyConflicts(StemInfo *stems); +extern HintInstance *HICopyTrans(HintInstance *hi, real mul, real offset); +extern void MDAdd(SplineChar *sc, int x, SplinePoint *sp1, SplinePoint *sp2); +extern int SFNeedsAutoHint( SplineFont *_sf); +extern void SCAutoInstr( SplineChar *sc,BlueData *bd ); +extern void SCClearHintMasks(SplineChar *sc,int counterstoo); +extern void SCFigureCounterMasks(SplineChar *sc); +extern void SCFigureHintMasks(SplineChar *sc); +extern void SplineCharAutoHint( SplineChar *sc,int removeOverlaps); +extern void SplineFontAutoHint( SplineFont *sf); +extern StemInfo *HintCleanup(StemInfo *stem,int dosort,int instance_count); +extern int SplineFontIsFlexible(SplineFont *sf,int flags); +extern int SCWorthOutputting(SplineChar *sc); +extern SplineChar *SCDuplicate(SplineChar *sc); +extern int SCIsNotdef(SplineChar *sc,int isfixed); +extern int IsntBDFChar(BDFChar *bdfc); +extern int CIDWorthOutputting(SplineFont *cidmaster, int enc); /* Returns -1 on failure, font number on success */ +extern int AmfmSplineFont(FILE *afm, MMSet *mm,int formattype); +extern int AfmSplineFont(FILE *afm, SplineFont *sf,int formattype); +extern int PfmSplineFont(FILE *pfm, SplineFont *sf,int type0); +extern int TfmSplineFont(FILE *afm, SplineFont *sf,int formattype); +extern char *EncodingName(int map); +extern void SFLigaturePrepare(SplineFont *sf); +extern void SFLigatureCleanup(SplineFont *sf); +extern void SFKernPrepare(SplineFont *sf,int isv); +extern void SFKernCleanup(SplineFont *sf,int isv); +extern KernClass *SFFindKernClass(SplineFont *sf,SplineChar *first,SplineChar *last, + int *index,int allow_zero); +extern KernClass *SFFindVKernClass(SplineFont *sf,SplineChar *first,SplineChar *last, + int *index,int allow_zero); +extern int SCSetMetaData(SplineChar *sc,char *name,int unienc,const unichar_t *comment); + +enum uni_interp interp_from_encoding(enum charset enc,enum uni_interp interp); +extern const char *EncName(int encname); +extern void SFDDumpMacFeat(FILE *sfd,MacFeat *mf); +extern MacFeat *SFDParseMacFeatures(FILE *sfd, char *tok); +extern int SFDWrite(char *filename,SplineFont *sf); +extern int SFDWriteBak(SplineFont *sf); +extern SplineFont *SFDRead(char *filename); +extern SplineChar *SFDReadOneChar(char *filename,const char *name); +extern unichar_t *TTFGetFontName(FILE *ttf,int32 offset,int32 off2); +extern void TTFLoadBitmaps(FILE *ttf,struct ttfinfo *info, int onlyone); +enum ttfflags { ttf_onlystrikes=1, ttf_onlyonestrike=2, ttf_onlykerns=4, ttf_onlynames=8 }; +extern SplineFont *_SFReadTTF(FILE *ttf,int flags,char *filename); +extern SplineFont *SFReadTTF(char *filename,int flags); +extern SplineFont *SFReadSVG(char *filename,int flags); +extern SplineFont *_CFFParse(FILE *temp,int len,char *fontsetname); +extern SplineFont *CFFParse(char *filename); +extern SplineFont *SFReadMacBinary(char *filename,int flags); +extern SplineFont *SFReadWinFON(char *filename,int toback); +extern SplineFont *LoadSplineFont(char *filename,enum openflags); +extern SplineFont *ReadSplineFont(char *filename,enum openflags); /* Don't use this, use LoadSF instead */ +extern uint16 _MacStyleCode( char *styles, SplineFont *sf, uint16 *psstyle ); +extern uint16 MacStyleCode( SplineFont *sf, uint16 *psstyle ); +extern SplineFont *SFReadIkarus(char *fontname); +extern char **NamesReadSFD(char *filename); +extern char **NamesReadTTF(char *filename); +extern char **NamesReadCFF(char *filename); +extern char **NamesReadPostscript(char *filename); +extern char **_NamesReadPostscript(FILE *ps); +extern char **NamesReadSVG(char *filename); +extern char **NamesReadMacBinary(char *filename); + +extern const char *UnicodeRange(int unienc); +extern SplineChar *SCBuildDummy(SplineChar *dummy,SplineFont *sf,int i); +extern SplineChar *SFMakeChar(SplineFont *sf,int i); +extern char *AdobeLigatureFormat(char *name); +extern uint32 LigTagFromUnicode(int uni); +extern void SCLigDefault(SplineChar *sc); +extern void SCTagDefault(SplineChar *sc,uint32 tag); +extern void SCSuffixDefault(SplineChar *sc,uint32 tag,char *suffix,uint16 flags,uint16 sli); +extern void SCLigCaretCheck(SplineChar *sc,int clean); +extern BDFChar *BDFMakeChar(BDFFont *bdf,int i); + +extern void SCUndoSetLBearingChange(SplineChar *sc,int lb); +extern Undoes *SCPreserveLayer(SplineChar *sc,int layer,int dohints); +extern Undoes *SCPreserveState(SplineChar *sc,int dohints); +extern Undoes *SCPreserveBackground(SplineChar *sc); +extern Undoes *SCPreserveWidth(SplineChar *sc); +extern Undoes *SCPreserveVWidth(SplineChar *sc); +extern Undoes *BCPreserveState(BDFChar *bc); +extern void BCDoRedo(BDFChar *bc,struct fontview *fv); +extern void BCDoUndo(BDFChar *bc,struct fontview *fv); + +extern int SFIsCompositBuildable(SplineFont *sf,int unicodeenc,SplineChar *sc); +extern int SFIsSomethingBuildable(SplineFont *sf,SplineChar *sc,int onlyaccents); +extern int SFIsRotatable(SplineFont *sf,SplineChar *sc); +extern int SCMakeDotless(SplineFont *sf, SplineChar *dotless, int copybmp, int doit); +extern void SCBuildComposit(SplineFont *sf, SplineChar *sc, int copybmp, + struct fontview *fv); +extern const unichar_t *SFGetAlternate(SplineFont *sf, int base,SplineChar *sc,int nocheck); + +extern int getAdobeEnc(char *name); + +extern void SFSplinesFromLayers(SplineFont *sf); +extern SplineSet *SplinePointListInterpretSVG(char *filename,int em_size, int ascent); +extern SplinePointList *SplinePointListInterpretPS(FILE *ps); +extern void PSFontInterpretPS(FILE *ps,struct charprocs *cp); +extern struct enc *PSSlurpEncodings(FILE *file); +extern int EvaluatePS(char *str,real *stack,int size); +struct pscontext { + int is_type2; + int instance_count; + real blend_values[17]; + int blend_warn; +}; +extern int UnblendedCompare(real u1[MmMax], real u2[MmMax], int cnt); +extern SplineChar *PSCharStringToSplines(uint8 *type1, int len, struct pscontext *context, + struct pschars *subrs, struct pschars *gsubrs, const char *name); +extern void MatMultiply(real m1[6], real m2[6], real to[6]); + +extern int NameToEncoding(SplineFont *sf,const unichar_t *uname); +extern void GlyphHashFree(SplineFont *sf); +extern int SFFindChar(SplineFont *sf, int unienc, char *name ); +extern int SFCIDFindChar(SplineFont *sf, int unienc, char *name ); +extern SplineChar *SFGetChar(SplineFont *sf, int unienc, char *name ); +extern SplineChar *SFGetCharDup(SplineFont *sf, int unienc, char *name ); +extern SplineChar *SFGetOrMakeChar(SplineFont *sf, int unienc, char *name ); +extern int SFFindExistingChar(SplineFont *sf, int unienc, char *name ); +extern int SFCIDFindExistingChar(SplineFont *sf, int unienc, char *name ); +extern int SFHasCID(SplineFont *sf, int cid); + +extern char *getPfaEditDir(char *buffer); +extern void DoAutoSaves(void); +extern void CleanAutoRecovery(void); +extern int DoAutoRecovery(void); +extern SplineFont *SFRecoverFile(char *autosavename); +extern void SFAutoSave(SplineFont *sf); +extern void SFClearAutoSave(SplineFont *sf); + +extern void PSCharsFree(struct pschars *chrs); +extern void PSDictFree(struct psdict *chrs); +extern struct psdict *PSDictCopy(struct psdict *dict); +extern int PSDictFindEntry(struct psdict *dict, char *key); +extern char *PSDictHasEntry(struct psdict *dict, char *key); +extern int PSDictRemoveEntry(struct psdict *dict, char *key); +extern int PSDictChangeEntry(struct psdict *dict, char *key, char *newval); + +extern void SplineSetsRound2Int(SplineSet *spl); +extern void SplineSetsRound2Sixtyfourths(SplineSet *spl); +extern void SCRound2Int(SplineChar *sc); +extern int hascomposing(SplineFont *sf,int u,SplineChar *sc); +#if 0 +extern void SFFigureGrid(SplineFont *sf); +#endif +extern int FVWinInfo(struct fontview *,int *cc,int *rc); + +extern struct script_record *SRParse(const unichar_t *line); +extern int SFFindScriptLangRecord(SplineFont *sf,struct script_record *sr); +extern int SFAddScriptLangRecord(SplineFont *sf,struct script_record *sr); +extern int SFAddScriptLangIndex(SplineFont *sf,uint32 script,uint32 lang); +extern int ScriptLangMatch(struct script_record *sr,uint32 script,uint32 lang); +extern int SRMatch(struct script_record *sr1,struct script_record *sr2); + +struct cidmap; /* private structure to encoding.c */ +extern int CID2NameEnc(struct cidmap *map,int cid, char *buffer, int len); +extern int NameEnc2CID(struct cidmap *map,int enc, char *name); +extern int MaxCID(struct cidmap *map); +extern struct cidmap *FindCidMap(char *registry,char *ordering,int supplement, + SplineFont *sf); +extern void SFEncodeToMap(SplineFont *sf,struct cidmap *map); +extern struct cidmap *AskUserForCIDMap(SplineFont *sf); +extern SplineFont *CIDFlatten(SplineFont *cidmaster,SplineChar **chars,int charcnt); +extern void SFFlattenByCMap(SplineFont *sf,char *cmapname); +extern SplineFont *MakeCIDMaster(SplineFont *sf,int bycmap,char *cmapfilename,struct cidmap *cidmap); + +int getushort(FILE *ttf); +int32 getlong(FILE *ttf); +int get3byte(FILE *ttf); +real getfixed(FILE *ttf); +real get2dot14(FILE *ttf); +void putshort(FILE *file,int sval); +void putlong(FILE *file,int val); +void putfixed(FILE *file,real dval); +int ttfcopyfile(FILE *ttf, FILE *other, int pos); + +extern void SCCopyFgToBg(SplineChar *sc,int show); + +extern int hasFreeType(void); +extern int hasFreeTypeDebugger(void); +extern int hasFreeTypeByteCode(void); +extern void *_FreeTypeFontContext(SplineFont *sf,SplineChar *sc,struct fontview *fv, + enum fontformat ff,int flags,void *shared_ftc); +extern void *FreeTypeFontContext(SplineFont *sf,SplineChar *sc,struct fontview *fv); +extern BDFFont *SplineFontFreeTypeRasterize(void *freetypecontext,int pixelsize,int depth); +extern BDFChar *SplineCharFreeTypeRasterize(void *freetypecontext,int enc, + int pixelsize,int depth); +extern void FreeTypeFreeContext(void *freetypecontext); +extern SplineSet *FreeType_GridFitChar(void *single_glyph_context, + int enc, real ptsize, int dpi, int16 *width, SplineSet *splines); +extern struct freetype_raster *FreeType_GetRaster(void *single_glyph_context, + int enc, real ptsize, int dpi); +extern void FreeType_FreeRaster(struct freetype_raster *raster); + +extern int UniFromName(const char *name); +extern int uUniFromName(const unichar_t *name); + +extern void doversion(void); + +extern AnchorPos *AnchorPositioning(SplineChar *sc,unichar_t *ustr,SplineChar **sstr ); +extern void AnchorPosFree(AnchorPos *apos); + +extern int SFCloseAllInstrs(SplineFont *sf); +extern void SCMarkInstrDlgAsChanged(SplineChar *sc); +extern int SCNumberPoints(SplineChar *sc); + +int SFFigureDefWidth(SplineFont *sf, int *_nomwid); + +extern enum possub_type SFGTagUsed(struct gentagtype *gentags,uint32 tag); +extern uint32 SFGenerateNewFeatureTag(struct gentagtype *gentags,enum possub_type type,uint32 suggestion); +extern void SFFreeGenerateFeatureTag(struct gentagtype *gentags,uint32 tag); +extern int SFRemoveThisFeatureTag(SplineFont *sf, uint32 tag, int sli, int flags); +extern void RemoveGeneratedTagsAbove(SplineFont *sf, int old_top); +extern int SFRenameTheseFeatureTags(SplineFont *sf, uint32 tag, int sli, int flags, + uint32 totag, int tosli, int toflags, int ismac); +extern int SFCopyTheseFeaturesToSF(SplineFont *sf, uint32 tag, int sli, int flags, + SplineFont *tosf); +extern int SFRemoveUnusedNestedFeatures(SplineFont *sf); +extern int SFHasNestedLookupWithTag(SplineFont *sf,uint32 tag,int ispos); +extern int ClassesMatch(int cnt1,char **classes1,int cnt2,char **classes2); +extern FPST *FPSTGlyphToClass(FPST *fpst); + +extern ASM *ASMFromOpenTypeForms(SplineFont *sf,int sli,int flags); +extern ASM *ASMFromFPST(SplineFont *sf,FPST *fpst,int ordered); +extern struct sliflag { uint16 sli, flags; } *SFGetFormsList(SplineFont *sf,int test_dflt); +extern int SFAnyConvertableSM(SplineFont *sf); + +extern unichar_t *MacStrToUnicode(const char *str,int macenc,int maclang); +extern char *UnicodeToMacStr(const unichar_t *ustr,int macenc,int maclang); +extern uint8 MacEncFromMacLang(int maclang); +extern uint16 WinLangFromMac(int maclang); +extern uint16 WinLangToMac(int winlang); +extern int CanEncodingWinLangAsMac(int winlang); +extern int MacLangFromLocale(void); +extern unichar_t *PickNameFromMacName(struct macname *mn); +extern MacFeat *FindMacFeature(SplineFont *sf, int feat,MacFeat **secondary); +extern struct macsetting *FindMacSetting(SplineFont *sf, int feat, int set,struct macsetting **secondary); +extern struct macname *FindMacSettingName(SplineFont *sf, int feat, int set); + +extern int32 UniFromEnc(int enc, enum charset encname); +extern int32 EncFromUni(int32 uni, enum charset encname); +extern int32 EncFromSF(int32 uni, SplineFont *sf); + +extern void MatInverse(real into[6], real orig[6]); + +enum psstrokeflags { sf_toobigwarn=1, sf_removeoverlap=2, sf_handle_eraser=4, + sf_correctdir=8 }; +extern enum psstrokeflags PsStrokeFlagsDlg(void); + +extern char *MMAxisAbrev(char *axis_name); +extern char *MMMakeMasterFontname(MMSet *mm,int ipos,char **fullname); +extern char *MMGuessWeight(MMSet *mm,int ipos,char *def); +extern char *MMExtractNth(char *pt,int ipos); +extern char *MMExtractArrayNth(char *pt,int ipos); +extern int MMValid(MMSet *mm,int complain); +extern void MMKern(SplineFont *sf,SplineChar *first,SplineChar *second,int diff, + int sli,KernPair *oldkp); +extern int MMBlendChar(MMSet *mm, int enc); +extern int MMReblend(struct fontview *fv, MMSet *mm); + +# if HANYANG +extern void SFDDumpCompositionRules(FILE *sfd,struct compositionrules *rules); +extern struct compositionrules *SFDReadCompositionRules(FILE *sfd); +extern void SFModifyComposition(SplineFont *sf); +extern void SFBuildSyllables(SplineFont *sf); +# endif +#endif + diff --git a/fontforge/splineorder2.c b/fontforge/splineorder2.c new file mode 100644 index 00000000..fe747f2e --- /dev/null +++ b/fontforge/splineorder2.c @@ -0,0 +1,1156 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include +#include +#include + +/* This file contains utility routines for 2 order bezier splines (ie. truetype) */ +/* The most interesting thing */ +/* it does is to figure out a quadratic approximation to the cubic splines */ +/* that postscript uses. We do this by looking at each spline and running */ +/* from the end toward the beginning, checking approximately every emunit */ +/* There is only one quadratic spline possible for any given interval of the */ +/* cubic. The start and end points are the interval end points (obviously) */ +/* the control point is where the two slopes (at start and end) intersect. */ +/* If this spline is a close approximation to the cubic spline (doesn't */ +/* deviate from it by more than an emunit or so), then we use this interval */ +/* as one of our quadratic splines. */ +/* It may turn out that the "quadratic" spline above is actually linear. Well */ +/* that's ok. It may also turn out that we can't find a good approximation. */ +/* If that's true then just insert a linear segment for an emunit stretch. */ +/* (actually this failure mode may not be possible), but I'm not sure */ +/* Then we play the same trick for the rest of the cubic spline (if any) */ + +/* Does the quadratic spline in ttf approximate the cubic spline in ps */ +/* within one pixel between tmin and tmax (on ps. presumably ttf between 0&1 */ +/* dim is the dimension in which there is the greatest change */ +static int comparespline(Spline *ps, Spline *ttf, real tmin, real tmax, real err) { + int dim=0, other; + real dx, dy, ddim, dt, t; + real d, o; + real ttf_t, sq, val; + DBounds bb; + + /* Are all points on ttf near points on ps? */ + /* This doesn't answer that question, but rules out gross errors */ + bb.minx = bb.maxx = ps->from->me.x; bb.miny = bb.maxy = ps->from->me.y; + if ( ps->from->nextcp.x>bb.maxx ) bb.maxx = ps->from->nextcp.x; + else bb.minx = ps->from->nextcp.x; + if ( ps->from->nextcp.y>bb.maxy ) bb.maxy = ps->from->nextcp.y; + else bb.miny = ps->from->nextcp.y; + if ( ps->to->prevcp.x>bb.maxx ) bb.maxx = ps->to->prevcp.x; + else if ( ps->to->prevcp.xto->prevcp.x; + if ( ps->to->prevcp.y>bb.maxy ) bb.maxy = ps->to->prevcp.y; + else if ( ps->to->prevcp.yto->prevcp.y; + if ( ps->to->me.x>bb.maxx ) bb.maxx = ps->to->me.x; + else if ( ps->to->me.xto->me.x; + if ( ps->to->me.y>bb.maxy ) bb.maxy = ps->to->me.y; + else if ( ps->to->me.yto->me.y; + for ( t=.1; t<1; t+= .1 ) { + d = (ttf->splines[0].b*t+ttf->splines[0].c)*t+ttf->splines[0].d; + o = (ttf->splines[1].b*t+ttf->splines[1].c)*t+ttf->splines[1].d; + if ( dbb.maxx || obb.maxy ) +return( false ); + } + + /* Are all points on ps near points on ttf? */ + dx = ((ps->splines[0].a*tmax+ps->splines[0].b)*tmax+ps->splines[0].c)*tmax - + ((ps->splines[0].a*tmin+ps->splines[0].b)*tmin+ps->splines[0].c)*tmin ; + dy = ((ps->splines[1].a*tmax+ps->splines[1].b)*tmax+ps->splines[1].c)*tmax - + ((ps->splines[1].a*tmin+ps->splines[1].b)*tmin+ps->splines[1].c)*tmin ; + if ( dx<0 ) dx = -dx; + if ( dy<0 ) dy = -dy; + if ( dx>dy ) { + dim = 0; + ddim = dx; + } else { + dim = 1; + ddim = dy; + } + other = !dim; + + t = tmin; + dt = (tmax-tmin)/ddim; + for ( t=tmin; t<=tmax; t+= dt ) { + if ( t>tmax-dt/8. ) t = tmax; /* Avoid rounding errors */ + d = ((ps->splines[dim].a*t+ps->splines[dim].b)*t+ps->splines[dim].c)*t+ps->splines[dim].d; + o = ((ps->splines[other].a*t+ps->splines[other].b)*t+ps->splines[other].c)*t+ps->splines[other].d; + if ( ttf->splines[dim].b == 0 ) { + ttf_t = (d-ttf->splines[dim].d)/ttf->splines[dim].c; + } else { + sq = ttf->splines[dim].c*ttf->splines[dim].c - + 4*ttf->splines[dim].b*(ttf->splines[dim].d-d); + if ( sq<0 ) +return( false ); + sq = sqrt(sq); + ttf_t = (-ttf->splines[dim].c-sq)/(2*ttf->splines[dim].b); + if ( ttf_t>=0 && ttf_t<=1.0 ) { + val = (ttf->splines[other].b*ttf_t+ttf->splines[other].c)*ttf_t+ + ttf->splines[other].d; + if ( val>o-err && valsplines[dim].c+sq)/(2*ttf->splines[dim].b); + } + if ( ttf_t>=-0.0001 && ttf_t<=1.0001 ) { /* Optimizer gives us rounding errors */ + val = (ttf->splines[other].b*ttf_t+ttf->splines[other].c)*ttf_t+ + ttf->splines[other].d; + if ( val>o-err && valroundx = oldend->roundx; end->roundy = oldend->roundy; end->dontinterpolate = oldend->dontinterpolate; + x = oldend->me.x; y = oldend->me.y; /* Want it to compare exactly */ + } + end->ttfindex = 0xfffe; + end->nextcpindex = 0xfffe; + end->me.x = end->nextcp.x = x; + end->me.y = end->nextcp.y = y; + end->nonextcp = true; + + *new = *ttf; + new->from = start; start->next = new; + new->to = end; end->prev = new; + if ( new->splines[0].b==0 && new->splines[1].b==0 ) { + end->noprevcp = true; + end->prevcp.x = x; end->prevcp.y = y; + new->islinear = new->knownlinear = true; + } else { + end->prevcp.x = start->nextcp.x = ttf->splines[0].c/2+ttf->splines[0].d; + end->prevcp.y = start->nextcp.y = ttf->splines[1].c/2+ttf->splines[1].d; + start->nonextcp = end->noprevcp = false; + new->isquadratic = true; + } + new->order2 = true; +return( end ); +} + +static int buildtestquads(Spline *ttf,real xmin,real ymin,real cx,real cy, + real x,real y,real tmin,real t,real err,Spline *ps) { +#if 0 + BasePoint norm; + real sq; +#endif + + /* test the control points are reasonable */ + if ( xminx+.1 ) +return( false ); + } else { + if ( cxxmin+.1 ) +return( false ); + } + if ( yminy+.1 ) +return( false ); + } else { + if ( cyymin+.1 ) +return( false ); + } + + ttf->splines[0].d = xmin; + ttf->splines[0].c = 2*(cx-xmin); + ttf->splines[0].b = xmin+x-2*cx; + ttf->splines[1].d = ymin; + ttf->splines[1].c = 2*(cy-ymin); + ttf->splines[1].b = ymin+y-2*cy; + if ( comparespline(ps,ttf,tmin,t,err) ) +return( true ); + +#if 0 + /* In a few cases, the following code will find a match when the above */ + /* would not. We move the control point slightly along a vector normal */ + /* to the vector between the end-points. What I really want is along */ + /* a vector midway between the two slopes, but that's too hard to figure */ + sq = sqrt((x-xmin)*(x-xmin) + (y-ymin)*(y-ymin)); + norm.x = (ymin-y)/sq; norm.y = (x-xmin)/sq; + + ttf->splines[0].c += err*norm.x; + ttf->splines[0].b -= err*norm.x; + ttf->splines[1].c += err*norm.y; + ttf->splines[1].b -= err*norm.y; + if ( comparespline(ps,ttf,tmin,t,err) ) +return( true ); + + ttf->splines[0].c -= 2*err*norm.x; + ttf->splines[0].b += 2*err*norm.x; + ttf->splines[1].c -= 2*err*norm.y; + ttf->splines[1].b += 2*err*norm.y; + if ( comparespline(ps,ttf,tmin,t,err) ) +return( true ); + + ttf->splines[0].c = 2*(cx-xmin); + ttf->splines[0].b = xmin+x-2*cx; + ttf->splines[1].c = 2*(cy-ymin); + ttf->splines[1].b = ymin+y-2*cy; +#endif +return( false ); +} + +static SplinePoint *LinearSpline(Spline *ps,SplinePoint *start, real tmax) { + real x,y; + Spline *new = chunkalloc(sizeof(Spline)); + SplinePoint *end = chunkalloc(sizeof(SplinePoint)); + + x = ((ps->splines[0].a*tmax+ps->splines[0].b)*tmax+ps->splines[0].c)*tmax+ps->splines[0].d; + y = ((ps->splines[1].a*tmax+ps->splines[1].b)*tmax+ps->splines[1].c)*tmax+ps->splines[1].d; + if ( tmax==1 ) { + SplinePoint *oldend = ps->to; + end->roundx = oldend->roundx; end->roundy = oldend->roundy; end->dontinterpolate = oldend->dontinterpolate; + x = oldend->me.x; y = oldend->me.y; /* Want it to compare exactly */ + } + end->ttfindex = 0xfffe; + end->nextcpindex = 0xfffe; + end->me.x = end->nextcp.x = end->prevcp.x = x; + end->me.y = end->nextcp.y = end->prevcp.y = y; + end->nonextcp = end->noprevcp = start->nonextcp = true; + new->from = start; start->next = new; + new->to = end; end->prev = new; + new->splines[0].d = start->me.x; + new->splines[0].c = (x-start->me.x); + new->splines[1].d = start->me.y; + new->splines[1].c = (y-start->me.y); + new->order2 = true; +return( end ); +} + +static SplinePoint *LinearTest(Spline *ps,real tmin,real tmax, + real xmax,real ymax, SplinePoint *start) { + Spline ttf; + int dim=0, other; + real dx, dy, ddim, dt, t; + real d, o, val; + real ttf_t; + + memset(&ttf,'\0',sizeof(ttf)); + ttf.splines[0].d = start->me.x; + ttf.splines[0].c = (xmax-start->me.x); + ttf.splines[1].d = start->me.y; + ttf.splines[1].c = (ymax-start->me.y); + + if ( ( dx = xmax-start->me.x)<0 ) dx = -dx; + if ( ( dy = ymax-start->me.y)<0 ) dy = -dy; + if ( dx>dy ) { + dim = 0; + ddim = dx; + } else { + dim = 1; + ddim = dy; + } + other = !dim; + + dt = (tmax-tmin)/ddim; + for ( t=tmin; t<=tmax; t+= dt ) { + d = ((ps->splines[dim].a*t+ps->splines[dim].b)*t+ps->splines[dim].c)*t+ps->splines[dim].d; + o = ((ps->splines[other].a*t+ps->splines[other].b)*t+ps->splines[other].c)*t+ps->splines[other].d; + ttf_t = (d-ttf.splines[dim].d)/ttf.splines[dim].c; + val = ttf.splines[other].c*ttf_t+ ttf.splines[other].d; + if ( valo+1 ) +return( NULL ); + } +return( MakeQuadSpline(start,&ttf,xmax,ymax,tmax,ps->to)); +} + +static SplinePoint *_ttfapprox(Spline *ps,real tmin, real tmax, SplinePoint *start) { + int dim=0, other; + real dx, dy, ddim, dt, t, err; + real x,y, xmin, ymin; + real dxdtmin, dydtmin, dxdt, dydt; + SplinePoint *sp; + real cx, cy; + Spline ttf; + int cnt = -1, forceit, unforceable; + BasePoint end, rend, dend; + + if ( RealNearish(ps->splines[0].a,0) && RealNearish(ps->splines[1].a,0) ) { + /* Already Quadratic, just need to find the control point */ + /* Or linear, in which case we don't need to do much of anything */ + Spline *spline; + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = ps->to->me.x; sp->me.y = ps->to->me.y; + sp->roundx = ps->to->roundx; sp->roundy = ps->to->roundy; sp->dontinterpolate = ps->to->dontinterpolate; + sp->ttfindex = 0xfffe; + sp->nextcpindex = 0xfffe; + sp->nonextcp = true; + spline = chunkalloc(sizeof(Spline)); + spline->order2 = true; + spline->from = start; + spline->to = sp; + spline->splines[0] = ps->splines[0]; spline->splines[1] = ps->splines[1]; + start->next = sp->prev = spline; + if ( ps->knownlinear ) { + spline->islinear = spline->knownlinear = true; + start->nonextcp = sp->noprevcp = true; + start->nextcp = start->me; + sp->prevcp = sp->me; + } else { + start->nonextcp = sp->noprevcp = false; + start->nextcp.x = sp->prevcp.x = (ps->splines[0].c+2*ps->splines[0].d)/2; + start->nextcp.y = sp->prevcp.y = (ps->splines[1].c+2*ps->splines[1].d)/2; + } +return( sp ); + } + + rend.x = ((ps->splines[0].a*tmax+ps->splines[0].b)*tmax+ps->splines[0].c)*tmax + ps->splines[0].d; + rend.y = ((ps->splines[1].a*tmax+ps->splines[1].b)*tmax+ps->splines[1].c)*tmax + ps->splines[1].d; + end.x = rint( rend.x ); + end.y = rint( rend.y ); + dend.x = (3*ps->splines[0].a*tmax+2*ps->splines[0].b)*tmax+ps->splines[0].c; + dend.y = (3*ps->splines[1].a*tmax+2*ps->splines[1].b)*tmax+ps->splines[1].c; + memset(&ttf,'\0',sizeof(ttf)); + + tail_recursion: + ++cnt; + + xmin = start->me.x; + ymin = start->me.y; + dxdtmin = (3*ps->splines[0].a*tmin+2*ps->splines[0].b)*tmin + ps->splines[0].c; + dydtmin = (3*ps->splines[1].a*tmin+2*ps->splines[1].b)*tmin + ps->splines[1].c; + + dx = ((ps->splines[0].a*tmax+ps->splines[0].b)*tmax+ps->splines[0].c)*tmax - + ((ps->splines[0].a*tmin+ps->splines[0].b)*tmin+ps->splines[0].c)*tmin ; + dy = ((ps->splines[1].a*tmax+ps->splines[1].b)*tmax+ps->splines[1].c)*tmax - + ((ps->splines[1].a*tmin+ps->splines[1].b)*tmin+ps->splines[1].c)*tmin ; + if ( dx<0 ) dx = -dx; + if ( dy<0 ) dy = -dy; + if ( dx>dy ) { + dim = 0; + ddim = dx; + } else { + dim = 1; + ddim = dy; + } + other = !dim; + if (( err = ddim/3000 )<1 ) err = 1; + + if ( ddim<2 || + (dend.x==0 && rint(start->me.x)==end.x && dy<=10 && cnt!=0) || + (dend.y==0 && rint(start->me.y)==end.y && dx<=10 && cnt!=0) ) { + if ( cnt==0 || start->noprevcp ) +return( LinearSpline(ps,start,tmax)); + /* If the end point is very close to where we want to be, then just */ + /* pretend it's right */ + start->prev->splines[0].b += ps->to->me.x-start->me.x; + start->prev->splines[1].b += ps->to->me.y-start->me.y; + start->prevcp.x += rend.x-start->me.x; + start->prevcp.y += rend.y-start->me.y; + if ( start->prev!=NULL && !start->prev->from->nonextcp ) + start->prev->from->nextcp = start->prevcp; + start->me = rend; +return( start ); + } + + dt = (tmax-tmin)/ddim; + forceit = false; + force_end: + unforceable = false; + for ( t=tmax; t>tmin+dt/128; t-= dt ) { /* dt/128 is a hack to avoid rounding errors */ + x = ((ps->splines[0].a*t+ps->splines[0].b)*t+ps->splines[0].c)*t+ps->splines[0].d; + y = ((ps->splines[1].a*t+ps->splines[1].b)*t+ps->splines[1].c)*t+ps->splines[1].d; + dxdt = (3*ps->splines[0].a*t+2*ps->splines[0].b)*t + ps->splines[0].c; + dydt = (3*ps->splines[1].a*t+2*ps->splines[1].b)*t + ps->splines[1].c; + /* if the slopes are parallel at the ends there can be no bezier quadratic */ + /* (control point is where the splines intersect. But if they are */ + /* parallel and colinear then there is a line between 'em */ + if ( ( dxdtmin==0 && dxdt==0 ) || (dydtmin==0 && dydt==0) || + ( dxdt!=0 && dxdtmin!=0 && + RealNearish(dydt/dxdt,dydtmin/dxdtmin)) ) { + if (( dxdt==0 && x==xmin ) || (dydt==0 && y==ymin) || + (dxdt!=0 && x!=xmin && RealNearish(dydt/dxdt,(y-ymin)/(x-xmin))) ) { + if ( (sp = LinearTest(ps,tmin,t,x,y,start))!=NULL ) { + if ( t==tmax ) +return( sp ); + tmin = t; + start = sp; + goto tail_recursion; + } + } + continue; + } + if ( dxdt==0 ) + cx=x; + else if ( dxdtmin==0 ) + cx=xmin; + else + cx = -(ymin-(dydtmin/dxdtmin)*xmin-y+(dydt/dxdt)*x)/(dydtmin/dxdtmin-dydt/dxdt); + if ( dydt==0 ) + cy=y; + else if ( dydtmin==0 ) + cy=ymin; + else + cy = -(xmin-(dxdtmin/dydtmin)*ymin-x+(dxdt/dydt)*y)/(dxdtmin/dydtmin-dxdt/dydt); + if ( t==tmax && ((cy==y && cx==x) || (cy==ymin && cx==xmin)) ) + unforceable = true; + /* Make the quadratic spline from (xmin,ymin) through (cx,cy) to (x,y)*/ + if ( forceit || buildtestquads(&ttf,xmin,ymin,cx,cy,x,y,tmin,t,err,ps)) { + if ( !forceit && !unforceable && (rend.x-x)*(rend.x-x)+(rend.y-y)*(rend.y-y)<4*4 ) { + forceit = true; + goto force_end; + } + sp = MakeQuadSpline(start,&ttf,x,y,t,ps->to); + forceit = false; + if ( t==tmax ) +return( sp ); + tmin = t; + start = sp; + goto tail_recursion; + } + ttf.splines[0].d = xmin; + ttf.splines[0].c = x-xmin; + ttf.splines[0].b = 0; + ttf.splines[1].d = ymin; + ttf.splines[1].c = y-ymin; + ttf.splines[1].b = 0; + if ( comparespline(ps,&ttf,tmin,t,err) ) { + sp = LinearSpline(ps,start,t); + if ( t==tmax ) +return( sp ); + tmin = t; + start = sp; + goto tail_recursion; + } + } + tmin += dt; + start = LinearSpline(ps,start,tmin); + goto tail_recursion; +} + +static SplinePoint *ttfApprox(Spline *ps,real tmin, real tmax, SplinePoint *start) { +#if 0 +/* Hmm. With my algorithem, checking for points of inflection actually makes */ +/* things worse. It uses more points and the splines don't join as nicely */ + real inflect[2]; + int i=0; + /* no points of inflection in quad splines */ + + if ( ps->splines[0].a!=0 ) { + inflect[i] = -ps->splines[0].b/(3*ps->splines[0].a); + if ( inflect[i]>tmin && inflect[i]splines[1].a!=0 ) { + inflect[i] = -ps->splines[1].b/(3*ps->splines[1].a); + if ( inflect[i]>tmin && inflect[i]inflect[1] ) { + real temp = inflect[0]; + inflect[0] = inflect[1]; + inflect[1] = temp; + } + } + if ( i!=0 ) { + start = _ttfapprox(ps,tmin,inflect[0],start); + tmin = inflect[0]; + if ( i==2 ) { + start = _ttfapprox(ps,tmin,inflect[1],start); + tmin = inflect[1]; + } + } +#endif +return( _ttfapprox(ps,tmin,tmax,start)); +} + +SplinePoint *SplineTtfApprox(Spline *ps) { + SplinePoint *from; + from = chunkalloc(sizeof(SplinePoint)); + *from = *ps->from; + from->hintmask = NULL; + ttfApprox(ps,0,1,from); +return( from ); +} + +SplineSet *SSttfApprox(SplineSet *ss) { + SplineSet *ret = chunkalloc(sizeof(SplineSet)); + Spline *spline, *first; + + ret->first = chunkalloc(sizeof(SplinePoint)); + *ret->first = *ss->first; + ret->first->hintmask = NULL; + ret->last = ret->first; + + first = NULL; + for ( spline=ss->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + ret->last = ttfApprox(spline,0,1,ret->last); + if ( first==NULL ) first = spline; + } + if ( ss->first==ss->last ) { + if ( ret->last!=ret->first ) { + ret->first->prevcp = ret->last->prevcp; + ret->first->noprevcp = ret->last->noprevcp; + ret->first->prev = ret->last->prev; + ret->last->prev->to = ret->first; + SplinePointFree(ret->last); + ret->last = ret->first; + } + } +return( ret ); +} + +SplineSet *SplineSetsTTFApprox(SplineSet *ss) { + SplineSet *head=NULL, *last, *cur; + + while ( ss!=NULL ) { + cur = SSttfApprox(ss); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + ss = ss->next; + } +return( head ); +} + +SplineSet *SSPSApprox(SplineSet *ss) { + SplineSet *ret = chunkalloc(sizeof(SplineSet)); + Spline *spline, *first; + SplinePoint *to; + + ret->first = chunkalloc(sizeof(SplinePoint)); + *ret->first = *ss->first; + ret->first->hintmask = NULL; + ret->last = ret->first; + + first = NULL; + for ( spline=ss->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + to = chunkalloc(sizeof(SplinePoint)); + *to = *spline->to; + to->hintmask = NULL; + if ( !spline->knownlinear ) { + ret->last->nextcp.x = spline->splines[0].c/3 + ret->last->me.x; + ret->last->nextcp.y = spline->splines[1].c/3 + ret->last->me.y; + to->prevcp.x = ret->last->nextcp.x+ (spline->splines[0].b+spline->splines[0].c)/3; + to->prevcp.y = ret->last->nextcp.y+ (spline->splines[1].b+spline->splines[1].c)/3; + } + SplineMake3(ret->last,to); + ret->last = to; + if ( first==NULL ) first = spline; + } + if ( ss->first==ss->last ) { + if ( ret->last!=ret->first ) { + ret->first->prevcp = ret->last->prevcp; + ret->first->noprevcp = ret->last->noprevcp; + ret->first->prev = ret->last->prev; + ret->last->prev->to = ret->first; + SplinePointFree(ret->last); + ret->last = ret->first; + } + } +return( ret ); +} + +SplineSet *SplineSetsPSApprox(SplineSet *ss) { + SplineSet *head=NULL, *last, *cur; + + while ( ss!=NULL ) { + cur = SSPSApprox(ss); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + ss = ss->next; + } +return( head ); +} + +SplineSet *SplineSetsConvertOrder(SplineSet *ss, int to_order2) { + SplineSet *new; + + if ( to_order2 ) + new = SplineSetsTTFApprox(ss); + else + new = SplineSetsPSApprox(ss); + SplinePointListFree(ss); +return( new ); +} + +void SCConvertToOrder2(SplineChar *sc) { + SplineSet *new; + + if ( sc==NULL ) +return; + + new = SplineSetsTTFApprox(sc->layers[ly_fore].splines); + SplinePointListsFree(sc->layers[ly_fore].splines); + sc->layers[ly_fore].splines = new; + + new = SplineSetsTTFApprox(sc->layers[ly_back].splines); + SplinePointListsFree(sc->layers[ly_back].splines); + sc->layers[ly_back].splines = new; + + UndoesFree(sc->layers[ly_fore].undoes); UndoesFree(sc->layers[ly_back].undoes); + UndoesFree(sc->layers[ly_fore].redoes); UndoesFree(sc->layers[ly_back].redoes); + sc->layers[ly_fore].undoes = sc->layers[ly_back].undoes = NULL; + sc->layers[ly_fore].redoes = sc->layers[ly_back].redoes = NULL; + + MinimumDistancesFree(sc->md); sc->md = NULL; +} + +static void SCConvertRefs(SplineChar *sc) { + RefChar *rf; + + sc->ticked = true; + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf=rf->next ) { + if ( !rf->sc->ticked ) + SCConvertRefs(rf->sc); + SCReinstanciateRefChar(sc,rf); /* Conversion is done by reinstanciating */ + /* Since the base thing will have been converted, all we do is copy its data */ + } +} + +void SFConvertToOrder2(SplineFont *_sf) { + int i, k; + SplineSet *new; + SplineFont *sf; + + if ( _sf->cidmaster!=NULL ) _sf=_sf->cidmaster; + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SCConvertToOrder2(sf->chars[i]); + sf->chars[i]->ticked = false; + } + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && !sf->chars[i]->ticked ) + SCConvertRefs(sf->chars[i]); + + new = SplineSetsTTFApprox(sf->grid.splines); + SplinePointListsFree(sf->grid.splines); + sf->grid.splines = new; + + UndoesFree(sf->grid.undoes); UndoesFree(sf->grid.redoes); + sf->grid.undoes = sf->grid.redoes = NULL; + sf->order2 = true; + ++k; + } while ( k<_sf->subfontcnt ); + _sf->order2 = true; +} + +void SCConvertToOrder3(SplineChar *sc) { + SplineSet *new; + + new = SplineSetsPSApprox(sc->layers[ly_fore].splines); + SplinePointListsFree(sc->layers[ly_fore].splines); + sc->layers[ly_fore].splines = new; + + new = SplineSetsPSApprox(sc->layers[ly_back].splines); + SplinePointListsFree(sc->layers[ly_back].splines); + sc->layers[ly_back].splines = new; + + UndoesFree(sc->layers[ly_fore].undoes); UndoesFree(sc->layers[ly_back].undoes); + UndoesFree(sc->layers[ly_fore].redoes); UndoesFree(sc->layers[ly_back].redoes); + sc->layers[ly_fore].undoes = sc->layers[ly_back].undoes = NULL; + sc->layers[ly_fore].redoes = sc->layers[ly_back].redoes = NULL; + + MinimumDistancesFree(sc->md); sc->md = NULL; + + free(sc->ttf_instrs); + sc->ttf_instrs = NULL; sc->ttf_instrs_len = 0; + /* If this character has any cv's showing instructions then remove the instruction pane!!!!! */ +} + +void SCConvertOrder(SplineChar *sc, int to_order2) { + if ( to_order2 ) + SCConvertToOrder2(sc); + else + SCConvertToOrder3(sc); +} + +void SFConvertToOrder3(SplineFont *_sf) { + int i, k; + SplineSet *new; + SplineFont *sf; + + if ( _sf->cidmaster!=NULL ) _sf=_sf->cidmaster; + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SCConvertToOrder3(sf->chars[i]); + sf->chars[i]->ticked = false; + } + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && !sf->chars[i]->ticked ) + SCConvertRefs(sf->chars[i]); + + new = SplineSetsPSApprox(sf->grid.splines); + SplinePointListsFree(sf->grid.splines); + sf->grid.splines = new; + + UndoesFree(sf->grid.undoes); UndoesFree(sf->grid.redoes); + sf->grid.undoes = sf->grid.redoes = NULL; + + TtfTablesFree(sf->ttf_tables); + sf->ttf_tables = NULL; + + sf->order2 = false; + ++k; + } while ( k<_sf->subfontcnt ); + _sf->order2 = false; +} + +/* ************************************************************************** */ + +void SplineRefigure2(Spline *spline) { + SplinePoint *from = spline->from, *to = spline->to; + Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; + +#ifdef DEBUG + if ( RealNear(from->me.x,to->me.x) && RealNear(from->me.y,to->me.y)) + GDrawIError("Zero length spline created"); +#endif + + if ( from->nonextcp || to->noprevcp || + ( from->nextcp.x==from->me.x && from->nextcp.y == from->me.y ) || + ( to->prevcp.x==to->me.x && to->prevcp.y == to->me.y )) { + from->nonextcp = to->noprevcp = true; + from->nextcp = from->me; + to->prevcp = to->me; + } + + if ( from->nonextcp && to->noprevcp ) + /* Ok */; + else if ( from->nonextcp || to->noprevcp || from->nextcp.x!=to->prevcp.x || + from->nextcp.y!=to->prevcp.y ) { + if ( RealNear(from->nextcp.x,to->prevcp.x) && + RealNear(from->nextcp.y,to->prevcp.y)) { + from->nextcp.x = to->prevcp.x = (from->nextcp.x+to->prevcp.x)/2; + from->nextcp.y = to->prevcp.y = (from->nextcp.y+to->prevcp.y)/2; + } else + GDrawIError("Invalid 2nd order spline in SplineRefigure2" ); + } + + xsp->d = from->me.x; ysp->d = from->me.y; + if ( from->nonextcp && to->noprevcp ) { + spline->islinear = true; + xsp->c = to->me.x-from->me.x; + ysp->c = to->me.y-from->me.y; + xsp->a = xsp->b = 0; + ysp->a = ysp->b = 0; + } else { + /* from p. 393 (Operator Details, curveto) Postscript Lang. Ref. Man. (Red book) */ + xsp->c = 2*(from->nextcp.x-from->me.x); + ysp->c = 2*(from->nextcp.y-from->me.y); + xsp->b = to->me.x-from->me.x-xsp->c; + ysp->b = to->me.y-from->me.y-ysp->c; + xsp->a = 0; + ysp->a = 0; + if ( RealNear(xsp->c,0)) xsp->c=0; + if ( RealNear(ysp->c,0)) ysp->c=0; + if ( RealNear(xsp->b,0)) xsp->b=0; + if ( RealNear(ysp->b,0)) ysp->b=0; + spline->islinear = false; + if ( ysp->b==0 && xsp->b==0 ) + spline->islinear = true; /* This seems extremely unlikely... */ + } + if ( isnan(ysp->b) || isnan(xsp->b) ) + GDrawIError("NaN value in spline creation"); + LinearApproxFree(spline->approx); + spline->approx = NULL; + spline->knowncurved = false; + spline->knownlinear = spline->islinear; + SplineIsLinear(spline); + spline->isquadratic = !spline->knownlinear; + spline->order2 = true; +} + +void SplineRefigure(Spline *spline) { + if ( spline->order2 ) + SplineRefigure2(spline); + else + SplineRefigure3(spline); +} + +void SplineRefigureFixup(Spline *spline) { + SplinePoint *from, *to, *prev, *next; + BasePoint foff, toff, unit, new; + double len; + + if ( !spline->order2 ) { + SplineRefigure3(spline); +return; + } + from = spline->from; to = spline->to; + + unit.x = from->nextcp.x-from->me.x; + unit.y = from->nextcp.y-from->me.y; + len = sqrt(unit.x*unit.x + unit.y*unit.y); + if ( len!=0 ) + unit.x /= len; unit.y /= len; + + if ( from->nextcpdef && to->prevcpdef ) switch ( from->pointtype*3+to->pointtype ) { + case pt_corner*3+pt_corner: + case pt_corner*3+pt_tangent: + case pt_tangent*3+pt_corner: + case pt_tangent*3+pt_tangent: + from->nonextcp = to->noprevcp = true; + from->nextcp = from->me; + to->prevcp = to->me; + break; + case pt_curve*3+pt_curve: + case pt_curve*3+pt_corner: + case pt_corner*3+pt_curve: + case pt_tangent*3+pt_curve: + case pt_curve*3+pt_tangent: + if ( from->prev!=NULL && from->pointtype==pt_tangent ) { + prev = from->prev->from; + foff.x = prev->me.x; + foff.y = prev->me.y; + } else if ( from->prev!=NULL ) { + prev = from->prev->from; + foff.x = to->me.x-prev->me.x + from->me.x; + foff.y = to->me.y-prev->me.y + from->me.y; + } else { + foff.x = from->me.x + (to->me.x-from->me.x)-(to->me.y-from->me.y); + foff.y = from->me.y + (to->me.x-from->me.x)+(to->me.y-from->me.y); + } + if ( to->next!=NULL && to->pointtype==pt_tangent ) { + next = to->next->to; + toff.x = next->me.x; + toff.y = next->me.y; + } else if ( to->next!=NULL ) { + next = to->next->to; + toff.x = next->me.x-from->me.x + to->me.x; + toff.y = next->me.y-from->me.y + to->me.y; + } else { + toff.x = to->me.x + (to->me.x-from->me.x)+(to->me.y-from->me.y); + toff.y = to->me.y - (to->me.x-from->me.x)+(to->me.y-from->me.y); + } + if ( IntersectLinesClip(&from->nextcp,&foff,&from->me,&toff,&to->me)) { + from->nonextcp = to->noprevcp = false; + to->prevcp = from->nextcp; + if ( from->pointtype==pt_curve && !from->noprevcp && from->prev!=NULL ) { + prev = from->prev->from; + if ( IntersectLinesClip(&from->prevcp,&from->nextcp,&from->me,&prev->nextcp,&prev->me)) { + prev->nextcp = from->prevcp; + SplineRefigure2(from->prev); + } + } + if ( to->pointtype==pt_curve && !to->nonextcp && to->next!=NULL ) { + next = to->next->to; + if ( IntersectLinesClip(&to->nextcp,&to->prevcp,&to->me,&next->prevcp,&next->me)) { + next->prevcp = to->nextcp; + SplineRefigure(to->next); + } + } + } + break; + } else { + /* Can't set things arbetrarily here, but make sure they are consistant */ + if ( from->pointtype==pt_curve && !from->noprevcp && !from->nonextcp ) { + unit.x = from->nextcp.x-from->me.x; + unit.y = from->nextcp.y-from->me.y; + len = sqrt(unit.x*unit.x + unit.y*unit.y); + if ( len!=0 ) { + unit.x /= len; unit.y /= len; + len = sqrt((from->prevcp.x-from->me.x)*(from->prevcp.x-from->me.x) + (from->prevcp.y-from->me.y)*(from->prevcp.y-from->me.y)); + new.x = -len*unit.x + from->me.x; new.y = -len*unit.y + from->me.y; + if ( new.x-from->prevcp.x<-1 || new.x-from->prevcp.x>1 || + new.y-from->prevcp.y<-1 || new.y-from->prevcp.y>1 ) { + if ( from->prev!=NULL && (prev = from->prev->from)!=NULL && + IntersectLinesClip(&from->prevcp,&new,&from->me,&prev->nextcp,&prev->me)) { + prev->nextcp = from->prevcp; + SplineRefigure2(from->prev); + } else + from->prevcp = new; + } + } + } else if ( from->pointtype==pt_tangent ) { + if ( from->prev!=NULL ) { + prev = from->prev->from; + if ( !from->noprevcp && !prev->nonextcp && + IntersectLinesClip(&from->prevcp,&to->me,&from->me,&prev->nextcp,&prev->me)) { + prev->nextcp = from->prevcp; + SplineRefigure2(from->prev); + } + if ( !from->nonextcp && !to->noprevcp && + IntersectLinesClip(&from->nextcp,&prev->me,&from->me,&to->prevcp,&to->me)) + to->prevcp = from->nextcp; + } + } + if ( to->pointtype==pt_curve && !to->noprevcp && !to->nonextcp ) { + unit.x = to->prevcp.x-to->nextcp.x; + unit.y = to->prevcp.y-to->nextcp.y; + len = sqrt(unit.x*unit.x + unit.y*unit.y); + if ( len!=0 ) { + unit.x /= len; unit.y /= len; + len = sqrt((to->nextcp.x-to->me.x)*(to->nextcp.x-to->me.x) + (to->nextcp.y-to->me.y)*(to->nextcp.y-to->me.y)); + new.x = -len*unit.x + to->me.x; new.y = -len*unit.y + to->me.y; + if ( new.x-to->nextcp.x<-1 || new.x-to->nextcp.x>1 || + new.y-to->nextcp.y<-1 || new.y-to->nextcp.y>1 ) { + if ( to->next!=NULL && (next = to->next->to)!=NULL && + IntersectLinesClip(&to->nextcp,&new,&to->me,&next->prevcp,&next->me)) { + next->prevcp = to->nextcp; + SplineRefigure2(to->next); + } else + to->nextcp = new; + } + } + } else if ( to->pointtype==pt_tangent ) { + if ( to->next!=NULL ) { + next = to->next->to; + if ( !to->nonextcp && !next->noprevcp && + IntersectLinesClip(&to->nextcp,&from->me,&to->me,&next->prevcp,&next->me)) { + next->prevcp = to->nextcp; + SplineRefigure2(to->next); + } + if ( !from->nonextcp && !to->noprevcp && + IntersectLinesClip(&from->nextcp,&next->me,&to->me,&from->nextcp,&from->me)) + to->prevcp = from->nextcp; + } + } + } + if ( from->nonextcp && to->noprevcp ) + /* Ok */; + else if ( from->nonextcp || to->noprevcp ) { + from->nonextcp = to->noprevcp = true; + } else if (( from->nextcp.x==from->me.x && from->nextcp.y==from->me.y ) || + ( to->prevcp.x==to->me.x && to->prevcp.y==to->me.y ) ) { + from->nonextcp = to->noprevcp = true; + } else if ( from->nonextcp || to->noprevcp || from->nextcp.x!=to->prevcp.x || + from->nextcp.y!=to->prevcp.y ) { + if ( !IntersectLinesClip(&from->nextcp, + (from->pointtype==pt_tangent && from->prev!=NULL)?&from->prev->from->me:&from->nextcp, &from->me, + (to->pointtype==pt_tangent && to->next!=NULL)?&to->next->to->me:&to->prevcp, &to->me)) { + from->nextcp.x = (from->me.x+to->me.x)/2; + from->nextcp.y = (from->me.y+to->me.y)/2; + } + to->prevcp = from->nextcp; + if (( from->nextcp.x==from->me.x && from->nextcp.y==from->me.y ) || + ( to->prevcp.x==to->me.x && to->prevcp.y==to->me.y ) ) { + from->nonextcp = to->noprevcp = true; + from->nextcp = from->me; + to->prevcp = to->me; + } + } + SplineRefigure2(spline); +} + +Spline *SplineMake2(SplinePoint *from, SplinePoint *to) { + Spline *spline = chunkalloc(sizeof(Spline)); + + spline->from = from; spline->to = to; + from->next = to->prev = spline; + spline->order2 = true; + SplineRefigure2(spline); +return( spline ); +} + +Spline *SplineMake(SplinePoint *from, SplinePoint *to, int order2) { + if ( order2 ) +return( SplineMake2(from,to)); + else +return( SplineMake3(from,to)); +} + +int IntersectLines(BasePoint *inter, + BasePoint *line1_1, BasePoint *line1_2, + BasePoint *line2_1, BasePoint *line2_2) { + double s1, s2; + + if ( line1_1->x == line1_2->x ) { + inter->x = line1_1->x; + if ( line2_1->x == line2_2->x ) { + if ( line2_1->x!=line1_1->x ) +return( false ); /* Parallel vertical lines */ + inter->y = (line1_1->y+line2_1->y)/2; + } else + inter->y = line2_1->y + (inter->x-line2_1->x) * (line2_2->y - line2_1->y)/(line2_2->x - line2_1->x); +return( true ); + } else if ( line2_1->x == line2_2->x ) { + inter->x = line2_1->x; + inter->y = line1_1->y + (inter->x-line1_1->x) * (line1_2->y - line1_1->y)/(line1_2->x - line1_1->x); +return( true ); + } else { + s1 = (line1_2->y - line1_1->y)/(line1_2->x - line1_1->x); + s2 = (line2_2->y - line2_1->y)/(line2_2->x - line2_1->x); + if ( RealNear(s1,s2)) { + if ( !RealNear(line1_1->y + (line2_1->x-line1_1->x) * s1,line2_1->y)) +return( false ); + inter->x = (line1_2->x+line2_2->x)/2; + inter->y = (line1_2->y+line2_2->y)/2; + } else { + inter->x = (s1*line1_1->x - s2*line2_1->x - line1_1->y + line2_1->y)/(s1-s2); + inter->y = line1_1->y + (inter->x-line1_1->x) * s1; + } +return( true ); + } +} + +int IntersectLinesClip(BasePoint *inter, + BasePoint *line1_1, BasePoint *line1_2, + BasePoint *line2_1, BasePoint *line2_2) { + BasePoint old = *inter, unit; + double len, val; + + if ( !IntersectLines(inter,line1_1,line1_2,line2_1,line2_2)) +return( false ); + else { + unit.x = line2_2->x-line1_2->x; + unit.y = line2_2->y-line1_2->y; + len = sqrt(unit.x*unit.x + unit.y*unit.y); + if ( len==0 ) +return( false ); + else { + unit.x /= len; unit.y /= len; + val = unit.x*(inter->x-line1_2->x) + unit.y*(inter->y-line1_2->y); + if ( val<=0 || val>=len ) { + *inter = old; +return( false ); + } + } + } +return( true ); +} + +void SplinePointPrevCPChanged2(SplinePoint *sp, int fixnext) { + SplinePoint *p, *pp, *n; + BasePoint p_pcp, ncp; + + if ( sp->prev!=NULL ) { + p = sp->prev->from; + p->nextcp = sp->prevcp; + if ( sp->noprevcp ) { + p->nonextcp = true; + p->nextcp = p->me; + SplineRefigure2(sp->prev); + } else if ( p->pointtype==pt_curve && !p->noprevcp ) { + SplineRefigure2(sp->prev); + if ( p->prev==NULL ) { + double len1, len2; + len1 = sqrt((p->nextcp.x-p->me.x)*(p->nextcp.x-p->me.x) + + (p->nextcp.y-p->me.y)*(p->nextcp.y-p->me.y)); + len2 = sqrt((p->prevcp.x-p->me.x)*(p->prevcp.x-p->me.x) + + (p->prevcp.y-p->me.y)*(p->prevcp.y-p->me.y)); + len2 /= len1; + p->prevcp.x = len2 * (p->me.x-p->prevcp.x) + p->me.x; + p->prevcp.y = len2 * (p->me.y-p->prevcp.y) + p->me.y; + } else { + pp = p->prev->from; + /* Find the intersection (if any) of the lines between */ + /* pp->nextcp&pp->me with p->prevcp&p->me */ + if ( IntersectLines(&p_pcp,&pp->nextcp,&pp->me,&p->nextcp,&p->me)) { + double len = (pp->me.x-p->me.x)*(pp->me.x-p->me.x) + (pp->me.y-p->me.y)*(pp->me.y-p->me.y); + double d1 = (p_pcp.x-p->me.x)*(pp->me.x-p->me.x) + (p_pcp.y-p->me.y)*(pp->me.y-p->me.y); + double d2 = (p_pcp.x-pp->me.x)*(p->me.x-pp->me.x) + (p_pcp.y-pp->me.y)*(p->me.y-pp->me.y); + if ( d1>=0 && d1<=len && d2>=0 && d2<=len ) { + p->prevcp = pp->nextcp = p_pcp; + SplineRefigure2(p->prev); + } + } + } + } + } + + if ( fixnext && sp->pointtype==pt_curve && !sp->nonextcp && sp->next!=NULL ) { + n = sp->next->to; + if ( IntersectLines(&ncp,&sp->prevcp,&sp->me,&n->prevcp,&n->me)) { + double len = (n->me.x-sp->me.x)*(n->me.x-sp->me.x) + (n->me.y-sp->me.y)*(n->me.y-sp->me.y); + double d1 = (ncp.x-sp->me.x)*(n->me.x-sp->me.x) + (ncp.y-sp->me.y)*(n->me.y-sp->me.y); + double d2 = (ncp.x-n->me.x)*(sp->me.x-n->me.x) + (ncp.y-n->me.y)*(sp->me.y-n->me.y); + if ( d1>=0 && d1<=len && d2>=0 && d2<=len ) { + n->prevcp = ncp; + sp->nextcp = ncp; + SplineRefigure2(sp->next); + } + } + } +} + +void SplinePointNextCPChanged2(SplinePoint *sp, int fixprev) { + SplinePoint *p, *nn, *n; + BasePoint n_ncp, pcp; + + if ( sp->next!=NULL ) { + n = sp->next->to; + n->prevcp = sp->nextcp; + if ( sp->nonextcp ) { + n->noprevcp = true; + n->prevcp = n->me; + SplineRefigure2(sp->next); + } else if ( n->pointtype==pt_curve && !n->nonextcp ) { + SplineRefigure2(sp->next); + if ( n->next==NULL ) { + double len1, len2; + len1 = sqrt((n->prevcp.x-n->me.x)*(n->prevcp.x-n->me.x) + + (n->prevcp.y-n->me.y)*(n->prevcp.y-n->me.y)); + len2 = sqrt((n->nextcp.x-n->me.x)*(n->nextcp.x-n->me.x) + + (n->nextcp.y-n->me.y)*(n->nextcp.y-n->me.y)); + len2 /= len1; + n->nextcp.x = len2 * (n->me.x-n->nextcp.x) + n->me.x; + n->nextcp.y = len2 * (n->me.y-n->nextcp.y) + n->me.y; + } else { + nn = n->next->to; + /* Find the intersection (if any) of the lines between */ + /* nn->prevcp&nn->me with n->nextcp&.->me */ + if ( IntersectLines(&n_ncp,&nn->prevcp,&nn->me,&n->prevcp,&n->me)) { + double len = (nn->me.x-n->me.x)*(nn->me.x-n->me.x) + (nn->me.y-n->me.y)*(nn->me.y-n->me.y); + double d1 = (n_ncp.x-n->me.x)*(nn->me.x-n->me.x) + (n_ncp.y-n->me.y)*(nn->me.y-n->me.y); + double d2 = (n_ncp.x-nn->me.x)*(n->me.x-nn->me.x) + (n_ncp.y-nn->me.y)*(n->me.y-nn->me.y); + if ( d1>=0 && d1<=len && d2>=0 && d2<=len ) { + n->nextcp = nn->prevcp = n_ncp; + SplineRefigure2(n->next); + } + } + } + } + } + + if ( fixprev && sp->pointtype==pt_curve && !sp->noprevcp && sp->prev!=NULL ) { + p = sp->prev->from; + if ( IntersectLines(&pcp,&sp->nextcp,&sp->me,&p->nextcp,&p->me)) { + double len = (p->me.x-sp->me.x)*(p->me.x-sp->me.x) + (p->me.y-sp->me.y)*(p->me.y-sp->me.y); + double d1 = (pcp.x-sp->me.x)*(p->me.x-sp->me.x) + (pcp.y-sp->me.y)*(p->me.y-sp->me.y); + double d2 = (pcp.x-p->me.x)*(sp->me.x-p->me.x) + (pcp.y-p->me.y)*(sp->me.y-p->me.y); + if ( d1>=0 && d1<=len && d2>=0 && d2<=len ) { + p->nextcp = pcp; + sp->prevcp = pcp; + SplineRefigure2(sp->prev); + } + } + } +} diff --git a/fontforge/splineoverlap.c b/fontforge/splineoverlap.c new file mode 100644 index 00000000..0847491a --- /dev/null +++ b/fontforge/splineoverlap.c @@ -0,0 +1,2225 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include "splinefont.h" +#include "edgelist.h" +#include + +/*#define DEBUG 1*/ + +/* To deal with overlap: + Ignore any open splinesets + Find all intersections + Break splines into bits so that intersections only happen at verteces + Find all splines which are unneeded (if winding number>1 or <-1 inside em) + (have to do this both horizontally and vertically, else we miss + horizontal splines) + If any splineset is entirely unneeded remove it + (for instance the inner loop of an O would be unneeded if it went + the same direction as the outer) + If any splineset is entirely needed set it aside + So now all remaining splineset must be partly needed and partly unneeded, + which means that they all must intersect at least one other splineset. + So run through the list of intersections + At an intersection there should be only two needed splines emerging from it + (exception a figure 8. Should be an even number then. Pick two) + Tack these two together as the basis of a new splineset + Trace them around until we get to the next intersection. + Find another line at it and keep tracing until we get back to where we started. + New splineset. Remove these guys from consideration + Run through all intersections again + This time we free unused splines + Now free the old splineset headers (contents are already free) + Now merge all the bits we care about and return 'em +*/ +/* Beware of the self-intersecting spline (half a figure 8) */ + +typedef struct splinelist { + struct splinelist *next; + Spline *spline; +} SplineList; + +typedef struct splinetlist { + struct splinetlist *next; + Spline *spline; + double t; + struct intersection *inter; + unsigned int processed:1; +} SplineTList; + +typedef struct intersection { + struct intersection *next; + unsigned int processed: 1; + BasePoint intersection; + SplineList *splines; /* the splines intersecting here */ + SplineTList *oldsplines; +} IntersectionList; + +static void AddOldSplines(Spline *spline,double t,IntersectionList *il) { + SplineTList *new = gcalloc(1,sizeof(SplineTList)); + + new->spline = spline; + new->t = t; + new->inter = il; + new->next = il->oldsplines; + il->oldsplines = new; +} + +static IntersectionList *FindIntersectionAt(IntersectionList *old,double xpos,double ypos) { + IntersectionList *il; + const double err = 1.0 / 64.0; + + for ( il=old; il!=NULL; il=il->next ) { + if ( il->intersection.x-xpos>-err && il->intersection.x-xposintersection.y-ypos>-err && il->intersection.y-yposfrom->me.x-xpos>-.1 && lefts->from->me.x-xpos<.1 && + lefts->from->me.y-ypos>-.1 && lefts->from->me.y-ypos<.1 ) { + match = lefts->from; + lt = 0; + } else if ( lefts->to->me.x-xpos>-.1 && lefts->to->me.x-xpos<.1 && + lefts->to->me.y-ypos>-.1 && lefts->to->me.y-ypos<.1 ) { + match = lefts->to; + lt = 1; + } else if ( rights->from->me.x-xpos>-.1 && rights->from->me.x-xpos<.1 && + rights->from->me.y-ypos>-.1 && rights->from->me.y-ypos<.1 ) { + match = rights->from; + rt = 0; + } else if ( rights->to->me.x-xpos>-.1 && rights->to->me.x-xpos<.1 && + rights->to->me.y-ypos>-.1 && rights->to->me.y-ypos<.1 ) { + match = rights->to; + rt = 1; + } + + /* fixup some rounding errors */ + if ( match!=NULL ) { + if ( (match==lefts->from && match==rights->to) || + (match==lefts->to && match==rights->from)) /* Intersection is where it should be */ +return( old ); + xpos = match->me.x; + ypos = match->me.y; + } else { + if ( lefts->ishorvert ) { + if ( lefts->from->me.x==lefts->to->me.x ) + xpos = lefts->from->me.x; + if ( lefts->from->me.y==lefts->to->me.y ) + ypos = lefts->from->me.y; + } + if ( rights->ishorvert ) { + if ( rights->from->me.x==rights->to->me.x ) + xpos = rights->from->me.x; + if ( rights->from->me.y==rights->to->me.y ) + ypos = rights->from->me.y; + } + } + + for ( il=old; il!=NULL; il=il->next ) { + if ( il->intersection.x-xpos>-err && il->intersection.x-xposintersection.y-ypos>-err && il->intersection.y-yposoldsplines; sp!=NULL; sp=sp->next ) { + if ( sp->spline==lefts ) + lpresent = 1; + else if ( sp->spline==rights ) + rpresent = 1; + } + if ( !lpresent ) + AddOldSplines(lefts,lt,il); + if ( !rpresent ) + AddOldSplines(rights,rt,il); +return( old ); + } + } + +#ifdef DEBUG + printf( "Intersection at %g,%g\n", xpos, ypos); +#endif + il = gcalloc(1,sizeof(IntersectionList)); + il->intersection.x = xpos; il->intersection.y = ypos; + AddOldSplines(lefts,lt,il); + AddOldSplines(rights,rt,il); + if ( match!=NULL ) { + if ( match->prev!=lefts && match->prev!=rights ) + AddOldSplines(match->prev,1.0,il); + if ( match->next!=lefts && match->next!=rights ) + AddOldSplines(match->next,0,il); + } + il->next = old; +return( il ); +} + +static IntersectionList *IntersectionOf(Edge *wasleft,Edge *wasright, + IntersectionList *old, double mpos, EdgeList *es, double lastincr) { + /* first find the point of intersection. It's somewhere between oldt and t_cur */ + /* major coordinate value is somewhere between mpos-1 and mpos */ + double mtop, mbottom, xpos, ypos; + double ltop, lbottom, lt=-1, rtop, rbottom, rt=-1, locur, rocur=0, nrt=-1, nlt; + Spline1D *lsp, *rsp, *losp, *rosp; + + lsp = &wasleft->spline->splines[es->major]; + rsp = &wasright->spline->splines[es->major]; + losp = &wasleft->spline->splines[es->other]; + rosp = &wasright->spline->splines[es->other]; + ltop = wasleft->t_cur; lbottom = wasleft->oldt; + if ( wasleft->up ) { + if ( (ltop+=.001)>wasleft->t_mmax ) ltop = wasleft->t_mmax; + if ( (lbottom-=.001)t_mmin ) lbottom = wasleft->t_mmin; + } else { + if ( (ltop-=.001)t_mmax ) ltop = wasleft->t_mmax; + if ( (lbottom+=.001)>wasleft->t_mmin ) lbottom = wasleft->t_mmin; + } + rtop = wasright->t_cur; rbottom = wasright->oldt; + if ( wasright->up ) { + if ( (rtop+=.001)>wasright->t_mmax ) rtop = wasright->t_mmax; + if ( (rbottom-=.001)t_mmin ) rbottom = wasright->t_mmin; + } else { + if ( (rtop-=.001)t_mmax ) rtop = wasright->t_mmax; + if ( (rbottom+=.001)>wasright->t_mmin ) rbottom = wasright->t_mmin; + } + mbottom = (mpos-lastincr+es->mmin)/es->scale; mtop = (mpos+es->mmin)/es->scale; + locur = -1; + while ( 1 ) { + nlt = SplineSolve(lsp,lbottom,ltop,(mbottom+mtop)/2,.0001); + nrt = SplineSolve(rsp,rbottom,rtop,(mbottom+mtop)/2,.0001); + if ( nlt==-1 || nrt==-1 ) { + if ( locur!=-1 ) + break; + nlt = SplineSolve(lsp,lbottom,ltop,(mbottom+mtop)/2,.0001); + nrt = SplineSolve(rsp,rbottom,rtop,(mbottom+mtop)/2,.0001); /* Debug */ + GDrawIError("Request for an intersection out of range"); +return( old ); + } + lt = nlt; rt = nrt; + locur = ((losp->a*lt+losp->b)*lt+losp->c)*lt + losp->d ; + rocur = ((rosp->a*rt+rosp->b)*rt+rosp->c)*rt + rosp->d ; +#if 0 + if ( (oerr = locur/(1024*1024))<0 ) oerr= -oerr; + if ( oerr<.0001 ) oerr = .0001; + if ( ((locur-rocur)>-oerr && (locur-rocur)-.0001 && (locur-rocur)<.0001) || + mtop-mbottom<.0001 ) + break; + if ( locurmajor==1 ) { + ypos = (mtop+mbottom)/2; + xpos = (locur+rocur)/2; + } else { + xpos = (mtop+mbottom)/2; + ypos = (locur+rocur)/2; + } + + if (( wasleft->spline->to->next==wasright->spline && + RealNearish(xpos,wasleft->spline->to->me.x) && + RealNearish(ypos,wasleft->spline->to->me.y)) || + ( wasleft->spline->from->prev==wasright->spline && + RealNearish(xpos,wasleft->spline->from->me.x) && + RealNearish(ypos,wasleft->spline->from->me.y)) ) +return( old ); + +return( AddIntersection(old,wasleft->spline,wasright->spline,lt,rt,xpos,ypos)); +} + +#if 0 /* Shouldn't need this, Linear intersections should get it better? */ +static IntersectionList *MajorIntersectionOf(Edge *par_major,Edge *edge, + IntersectionList *old, double mpos, EdgeList *es) { + /* first find the point of intersection. It's somewhere between oldt and t_cur */ + /* major coordinate value is major->mmax (or mmin) */ + double et, opos, mt; + Spline1D *esp, *eosp; + double ypos, xpos; + + esp = &edge->spline->splines[es->major]; + eosp = &edge->spline->splines[es->other]; + et = SplineSolve(esp,edge->oldt,edge->t_cur,par_major->mmin+es->mmin,.0001); + opos = ( ((eosp->a*et + eosp->b)*et + eosp->c)*et + eosp->d ) * es->scale; + if (( oposo_mmin && oposo_mmax ) || + (opos>par_major->o_mmin && opos>par_major->o_mmax ) || et<0 || et>1 ) +return( old ); + + mt = (opos-par_major->o_mmin)/(par_major->o_mmax-par_major->o_mmin); + if ( es->major==1 ) { + ypos = par_major->mmin+es->mmin; + xpos = opos; + } else { + xpos = par_major->mmin+es->mmin; + ypos = opos; + } + xpos = rint(xpos*1024)/1024; + ypos = rint(ypos*1024)/1024; + + if (( edge->spline->to->next==par_major->spline && + RealNearish(xpos,edge->spline->to->me.x) && + RealNearish(ypos,edge->spline->to->me.y)) || + ( edge->spline->from->prev==par_major->spline && + RealNearish(xpos,edge->spline->from->me.x) && + RealNearish(ypos,edge->spline->from->me.y)) ) +return( old ); + +return( AddIntersection(old,edge->spline,par_major->spline,et,mt,xpos,ypos)); +} +#endif + +/* This routine is almost exactly the same as ActiveEdgesRefigure, except */ +/* that we preserve the old value of t each time through and call */ +static IntersectionList *_FindIntersections(EdgeList *es, IntersectionList *sofar) { + Edge *active=NULL, *apt, *pr; + double i, incr=1, lastincr,diff; + int any; + + for ( i=0; icnt; i+=incr ) { + if ( ( diff = i - floor(i+.00005))<0 ) diff=-diff; + if ( diff < .0001 ) + i = floor(i+.00005); + lastincr = incr; + incr = floor(i)+1-i; + + /* first remove any entry which doesn't intersect the new scan line */ + /* (ie. stopped on last line) */ + for ( pr=NULL, apt=active; apt!=NULL; apt = apt->aenext ) { + if ( apt->mmaxaenext; + else + pr->aenext = apt->aenext; + } else + pr = apt; + } + /* then move the active list to the next line */ + for ( apt=active; apt!=NULL; apt = apt->aenext ) { + Spline1D *osp = &apt->spline->splines[es->other]; + apt->oldt = apt->t_cur; + apt->t_cur = TOfNextMajor(apt,es,i); + apt->o_cur = ( ((osp->a*apt->t_cur+osp->b)*apt->t_cur+osp->c)*apt->t_cur + osp->d ) * es->scale; + } + /* reorder list */ + if ( active!=NULL ) { + any = true; + while ( any ) { + any = false; + for ( pr=NULL, apt=active; apt->aenext!=NULL; ) { + if ( apt->o_cur <= apt->aenext->o_cur ) { + /* still ordered */; + pr = apt; + apt = apt->aenext; + } else if ( pr==NULL ) { + sofar = IntersectionOf(apt,apt->aenext, sofar, i, es, lastincr); + active = apt->aenext; + apt->aenext = apt->aenext->aenext; + active->aenext = apt; + /* don't need to set any, since this reorder can't disorder the list */ + pr = active; + } else { + sofar = IntersectionOf(apt,apt->aenext, sofar, i, es, lastincr); + pr->aenext = apt->aenext; + apt->aenext = apt->aenext->aenext; + pr->aenext->aenext = apt; + any = true; + pr = pr->aenext; + } + } + } +#if 0 + while ( es->majors!=NULL && es->majors->mmax<=i ) { + pr = es->majors; + for ( apt=active; apt!=NULL; apt=apt->aenext ) + sofar = MajorIntersectionOf(pr,apt,sofar,i,es); + es->majors = pr->esnext; + pr->esnext = es->majorhold; + es->majorhold = pr; + } +#endif + } + /* Insert new nodes */ + if ( i==floor(i) ) + active = ActiveEdgesInsertNew(es,active,i); + + /* If any spline ends soon, adjust the increment so we get one last look at it */ + for ( apt=active; apt!=NULL; apt = apt->aenext ) { + if ( apt->mmaxmmax>i+.0002) + incr = apt->mmax-i-.0001; + } + } +return( sofar ); +} + +#if 0 +static int IsHorVertSpline(Spline *sp) { + int major; + Spline1D *msp; + double fm, tm; + /* Check for splines that are very close to being horizontal or vertical */ + /* we shall just pretend that they are lines.... */ + + for ( major=0; major<2; ++major ) { + fm = major==1?sp->from->me.y:sp->from->me.x; + tm = major==1?sp->to->me.y:sp->to->me.x; + msp = &sp->splines[major]; + if ( fm==tm && !RealNear(msp->a,0) ) { + double m1, m2, d1, d2, t1, t2; + double b2_fourac = 4*msp->b*msp->b - 12*msp->a*msp->c; + if ( b2_fourac>=0 ) { + b2_fourac = sqrt(b2_fourac); + t1 = (-2*msp->b - b2_fourac) / (6*msp->a); + t2 = (-2*msp->b + b2_fourac) / (6*msp->a); + if ( t1>t2 ) { double temp = t1; t1 = t2; t2 = temp; } + else if ( t1==t2 ) t2 = 2.0; + + m1 = m2 = fm; + if ( t1>0 && t1<1 ) + m1 = ((msp->a*t1+msp->b)*t1+msp->c)*t1 + msp->d; + if ( t2>0 && t2<1 ) + m2 = ((msp->a*t2+msp->b)*t2+msp->c)*t2 + msp->d; + d1 = (m1-fm); + d2 = (m2-fm); + if ( d1>-1 && d1<1 && d2>-1 && d2<1 ) +return( true ); + } + } + } +return( false ); +} +#endif + +static IntersectionList *FindLinearIntersections(SplineSet *spl, IntersectionList *sofar) { + SplineSet *ss; + Spline *first, *sp, *first2, *sp2; + BasePoint pts[9]; + double t1s[10], t2s[10]; + int i; + /* This used only to work if both splines were lines. Now it works if */ + /* at least one of the splines is a line */ + + for ( ; spl!=NULL; spl = spl->next ) if ( spl->first->prev!=NULL ) { + first = NULL; + for ( sp = spl->first->next; sp!=NULL && sp!=first; sp=sp->to->next ) { + if ( first==NULL ) first = sp; + for ( ss=spl; ss!=NULL; ss = ss->next ) { + if ( ss==spl ) { + first2 = first; + sp2 = sp->to->next; + } else { + first2 = NULL; + sp2 = ss->first->next; + } + for ( ; sp2!=NULL && sp2!=first2; sp2 = sp2->to->next ) { + if (( sp->islinear || sp2->islinear ) && + SplinesIntersect(sp,sp2,pts,t1s,t2s)>0 ) { + for ( i=0; i<4 && t1s[i]!=-1; ++i ) + if ( (t1s[i]>.001 && t1s[i]<.999) || (t2s[i]>.001 && t2s[i]<.999)) + sofar = AddIntersection(sofar,sp,sp2,t1s[i],t2s[i], + pts[i].x,pts[i].y); + } + if ( first2==NULL ) first2 = sp2; + } + } + } + } +return( sofar ); +} + +static IntersectionList *FindThisVertextIntersections(SplineSet *spl, + SplinePoint *sp, IntersectionList *ilist) { + Spline *spline, *first; + double t, xpos, ypos; + + for ( ; spl!=NULL ; spl=spl->next ) if ( spl->first->prev!=NULL ) { + first = NULL; + for ( spline=spl->first->next; spline!=NULL && spline!=first; spline = spline->to->next ) { + if ( spline->from!=sp && spline->to!=sp && + !((sp->me.xfrom->me.x && sp->me.xfrom->nextcp.x && + sp->me.xto->me.x && sp->me.xto->prevcp.x ) || + (sp->me.x>spline->from->me.x && sp->me.x>spline->from->nextcp.x && + sp->me.x>spline->to->me.x && sp->me.x>spline->to->prevcp.x ) || + (sp->me.yfrom->me.y && sp->me.yfrom->nextcp.y && + sp->me.yto->me.y && sp->me.yto->prevcp.y ) || + (sp->me.y>spline->from->me.y && sp->me.y>spline->from->nextcp.y && + sp->me.y>spline->to->me.y && sp->me.y>spline->to->prevcp.y ))) { + /* If we get here then sp is within the convex hull of the spline */ + /* Actually it's within a bounding box that includes the hull */ + if (( t = SplineNearPoint(spline,&sp->me,1./128.))!=-1 ) { + /* if we get here there's a real intersection */ + xpos = ((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t + spline->splines[0].d; + ypos = ((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t + spline->splines[1].d; + ilist = AddIntersection(ilist,spline,sp->prev, + t,1,xpos,ypos); + } + } + if ( first==NULL ) first = spline; + } + } +return( ilist ); +} + +static IntersectionList *FindVertexIntersections(SplineSet *ss, + IntersectionList *ilist) { + SplinePoint *sp; + SplineSet *spl; + + for ( spl=ss; spl!=NULL ; spl=spl->next ) if ( spl->first->prev!=NULL ) { + for ( sp=spl->first; ; ) { + ilist = FindThisVertextIntersections(ss,sp,ilist); + sp = sp->next->to; /* paths are all closed */ + if ( sp==spl->first ) + break; + } + } +return( ilist ); +} + +struct tllist { SplineTList *tl; struct tllist *next; }; +static struct tllist *AddTList(struct tllist *sofar, SplineTList *this) { + struct tllist *cur, *test, *prev; + + cur = galloc(sizeof(struct tllist)); + cur->next = NULL; + cur->tl = this; + if ( sofar==NULL ) +return( cur ); + prev = NULL; + for ( test=sofar; test!=NULL && test->tl->tt; prev=test, test = test->next ); + cur->next = test; + if ( prev==NULL ) +return( cur ); + prev->next = cur; +return( sofar ); +} + +static void AddSplines(IntersectionList *il,Spline *s1,Spline *s2) { + SplineList *sl1, *sl2; + sl1 = galloc(sizeof(SplineList)); + sl2 = galloc(sizeof(SplineList)); + sl1->spline = s1; sl2->spline = s2; + sl1->next = sl2; + sl2->next = il->splines; + il->splines = sl1; +} + +#if 0 +static void AddSpline(IntersectionList *il,Spline *s) { + SplineList *sl1; + sl1 = galloc(sizeof(SplineList)); + sl1->spline = s; + sl1->next = il->splines; + il->splines = sl1; +} +#endif + +static void ChangeSpline(IntersectionList *il,Spline *new,Spline *old) { + /* Spline old just got broken into two pieces (one of which is new) */ + /* need to change any reference to the old spline into ones to the new */ + SplineList *sl; + + if ( il==NULL ) +return; + + for ( sl = il->splines; sl!=NULL; sl = sl->next ) + if ( sl->spline == old ) { + sl->spline = new; + break; + } +} + +static void ChangeAndCleanSpline(IntersectionList *il,Spline *new,Spline *old) { + /* Spline old just got broken into two pieces (one of which is new) */ + /* need to change any reference to the old spline into ones to the new */ + SplineList *sl, *prev, *next; + int sawnew; + + while ( il!=NULL ) { + sawnew = false; + prev = NULL; + for ( sl = il->splines; sl!=NULL; sl = next ) { + next = sl->next; + if ( sawnew && (sl->spline==old || sl->spline==new) ) { + prev->next = next; + free(sl); + } else { + if ( sl->spline == old ) { + sl->spline = new; + sawnew = true; + } else if ( sl->spline==new ) + sawnew = true; + prev = sl; + } + } + il = il->next; + } +} + +static void DoIntersections(SplineChar *sc,SplineTList *me,IntersectionList *ilist) { + struct tllist *base = NULL, *cur, *cnext; + SplineTList *tsp; + double tbase, t; + SplinePoint *to, *sp; + IntersectionList *prev; + Spline *lastspline=NULL; + BasePoint test; + int atfrom, atto; + + while ( ilist!=NULL ) { + for ( tsp=ilist->oldsplines; tsp!=NULL; tsp=tsp->next ) { + if ( tsp->spline == me->spline ) + base = AddTList(base,tsp); + } + ilist = ilist->next; + } + + tbase = 0; + lastspline = me->spline; + to = me->spline->to; /* The spline will change as we bisect*/ + /* it, but the end point remains fixed and we can */ + /* use that to figure out what spline we should be*/ + /* splitting now */ + prev = NULL; + for ( cur=base; cur!=NULL; cur=cnext ) { + cnext = cur->next; + if ( tbase==cur->tl->t ) + /* That's ok, I guess */; + /* Seem to get a lot of zero length splines, especially at the */ + /* endpoints. Should be ok just to ignore them */ + else if ( tbase>=1 ) { + GDrawIError( "Bad value for tbase in %s", sc==NULL?"": sc->name ); + break; + } else { + t = (cur->tl->t-tbase)/(1.0-tbase); +#if 0 + test.x = ((to->prev->splines[0].a*t+to->prev->splines[0].b)*t+to->prev->splines[0].c)*t + to->prev->splines[0].d; + test.y = ((to->prev->splines[1].a*t+to->prev->splines[1].b)*t+to->prev->splines[1].c)*t + to->prev->splines[1].d; +#else + test = cur->tl->inter->intersection; +#endif + atfrom = ( to->prev->from->me.x>test.x-.005 && to->prev->from->me.xprev->from->me.y>test.y-.005 && to->prev->from->me.yme.x>test.x-.005 && to->me.xme.y>test.y-.005 && to->me.ytl->t<.5 )) { + /* if the intersection occurs at an end point then we don't need */ + /* to cut the spline in two */ + sp = to->prev->from; + t = 0; + } else if ( atto ) { + sp = to; + t = 1; + } else { + SplineBisect(to->prev,t); + sp = to->prev->from; + } + sp->isintersection = true; + sp->nextcp.x += cur->tl->inter->intersection.x-sp->me.x; + sp->prevcp.x += cur->tl->inter->intersection.x-sp->me.x; + sp->nextcp.y += cur->tl->inter->intersection.y-sp->me.y; + sp->prevcp.y += cur->tl->inter->intersection.y-sp->me.y; + sp->me = cur->tl->inter->intersection; /* might be slightly different due to rounding. I want it exact */ + SplineRefigure(sp->prev); /* Again fix up any marginal diffs */ + SplineRefigure(sp->next); + if ( t==0 || t==1 ) { + AddSplines(cur->tl->inter,sp->prev,sp->next); + } else { + AddSplines(cur->tl->inter,sp->prev,sp->next); + ChangeSpline(prev,sp->prev,lastspline); + } + lastspline = sp->next; + } + tbase = cur->tl->t; + cur->tl->processed = true; + prev = cur->tl->inter; + free(cur); + } +} + +static void CleanupSplines(IntersectionList *ilist,IntersectionList *ilbase) { + SplineList *sl1, *sl2, *prev, *next; + + /* Suppose we have two splines which are essentially coincident */ + /* We will probably get some rounding errors when calculating the */ + /* intersections. These will lead to more intersections, and so forth */ + /* So try to even out any rounding errors that might lead to problems */ + for ( sl1 = ilist->splines; sl1!=NULL; sl1=sl1->next ) { + for ( sl2 = sl1->next; sl2!=NULL ; sl2 = sl2->next ) { + if ( sl2->spline->from->me.x==sl1->spline->from->me.x && + sl2->spline->from->me.y==sl1->spline->from->me.y ) { + if ( RealWithin(sl2->spline->from->nextcp.x,sl1->spline->from->nextcp.x,.1) && + RealWithin(sl2->spline->from->nextcp.y,sl1->spline->from->nextcp.y,.1)) { + sl2->spline->from->nextcp = sl1->spline->from->nextcp; + if ( sl2->spline->order2 ) sl2->spline->to->prevcp = sl2->spline->from->nextcp; + SplineRefigure(sl2->spline); + } + } else if ( sl2->spline->from->me.x==sl1->spline->to->me.x && + sl2->spline->from->me.y==sl1->spline->to->me.y ) { + if ( RealWithin(sl2->spline->from->nextcp.x,sl1->spline->to->prevcp.x,.1) && + RealWithin(sl2->spline->from->nextcp.y,sl1->spline->to->prevcp.y,.1)) { + sl2->spline->from->nextcp = sl1->spline->to->prevcp; + if ( sl2->spline->order2 ) sl2->spline->to->prevcp = sl2->spline->from->nextcp; + SplineRefigure(sl2->spline); + } + } else if ( sl2->spline->to->me.x==sl1->spline->from->me.x && + sl2->spline->to->me.y==sl1->spline->from->me.y ) { + if ( RealWithin(sl2->spline->to->prevcp.x,sl1->spline->from->nextcp.x,.1) && + RealWithin(sl2->spline->to->prevcp.y,sl1->spline->from->nextcp.y,.1)) { + sl2->spline->to->prevcp = sl1->spline->from->nextcp; + if ( sl2->spline->order2 ) sl2->spline->from->nextcp = sl2->spline->to->prevcp; + SplineRefigure(sl2->spline); + } + } else if ( sl2->spline->to->me.x==sl1->spline->to->me.x && + sl2->spline->to->me.y==sl1->spline->to->me.y ) { + if ( RealWithin(sl2->spline->to->prevcp.x,sl1->spline->to->prevcp.x,.1) && + RealWithin(sl2->spline->to->prevcp.y,sl1->spline->to->prevcp.y,.1)) { + sl2->spline->to->prevcp = sl1->spline->to->prevcp; + if ( sl2->spline->order2 ) sl2->spline->from->nextcp = sl2->spline->to->prevcp; + SplineRefigure(sl2->spline); + } + } + } + } + +/* if we have a T shape and the ends of the vertical stem are on the horizontal*/ +/* then we will get two copies of the line that connects the end of the vert */ +/* stem (one from the vert stem, and one from the horizontal stem) we need to*/ +/* merge these two splines into one */ +return; /* But it seems we don't need it at all now */ + + for ( sl1 = ilist->splines; sl1!=NULL; sl1=sl1->next ) { + prev = sl1; + for ( sl2 = sl1->next; sl2!=NULL ; sl2 = next ) { + next = sl2->next; + if (( sl2->spline->from->me.x==sl1->spline->from->me.x && sl2->spline->from->me.y==sl1->spline->from->me.y && + sl2->spline->to->me.x==sl1->spline->to->me.x && sl2->spline->to->me.y==sl1->spline->to->me.y ) || + ( sl2->spline->from->me.x==sl1->spline->to->me.x && sl2->spline->from->me.y==sl1->spline->to->me.y && + sl2->spline->to->me.x==sl1->spline->from->me.x && sl2->spline->to->me.y==sl1->spline->from->me.y )) { + prev->next = next; + ChangeAndCleanSpline(ilbase,sl1->spline,sl2->spline); + SplineFree(sl2->spline); + free(sl2); + } else + prev = sl2; + } + } +} + +/* Put the intersections onto the splines. We couldn't do this earlier because*/ +/* that would have meant freeing the old splines while we were still using */ +/* them to find more intersections. */ +/* Things are complex here because one spline may have several intersections */ +/* (think of a plus sign) and we must do them all at once... */ +static void InsertIntersections(SplineChar *sc,IntersectionList *ilist) { + SplineTList *tsp, *tnext; + IntersectionList *ilbase = ilist; + + while ( ilist!=NULL ) { +#ifdef DEBUG + printf( "Inter=(%g,%g)\n", ilist->intersection.x, ilist->intersection.y ); +#endif + for ( tsp=ilist->oldsplines; tsp!=NULL; tsp=tsp->next ) { +#ifdef DEBUG + printf( "\t(%g,%g) -> (%g,%g) %g\n", + tsp->spline->from->me.x, tsp->spline->from->me.y, + tsp->spline->to->me.x, tsp->spline->to->me.y, + tsp->t ); +#endif + if ( !tsp->processed ) + DoIntersections(sc,tsp,ilist); + } +#ifdef DEBUG + { SplineList *sl; printf(" --\n" ); + for ( sl=ilist->splines; sl!=NULL; sl=sl->next ) + if ( sl->spline->from->me.x==ilist->intersection.x && sl->spline->from->me.y==ilist->intersection.y ) + printf( "\t-> (%g,%g)\n", sl->spline->to->me.x, sl->spline->to->me.y ); + else if ( sl->spline->to->me.x==ilist->intersection.x && sl->spline->to->me.y==ilist->intersection.y ) + printf( "\t-> (%g,%g)\n", sl->spline->from->me.x, sl->spline->from->me.y ); + else + printf( "\t-> spline (%g,%g) -> (%g,%g) not at intersection, should be\n", + sl->spline->from->me.x, sl->spline->from->me.y, + sl->spline->to->me.x, sl->spline->to->me.y ); + } +#endif + for ( tsp=ilist->oldsplines; tsp!=NULL; tsp=tnext ) { + tnext = tsp->next; + free(tsp); + } + ilist->oldsplines = NULL; + CleanupSplines(ilist,ilbase); + ilist = ilist->next; + } +} + +static IntersectionList *SplineSetFindIntersections(SplineChar *sc,SplineSet *base) { + EdgeList es; + DBounds b; + IntersectionList *ilist= NULL; + + /* We miss intersections where the end-point of a spline is on */ + /* another spline. Check for them first */ + ilist = FindVertexIntersections(base,ilist); + + /* We can find linear intersections exactly, so let's do so */ + /* Do this early so we'll store the exact position, otherwise it might */ + /* be an approximation */ + ilist = FindLinearIntersections(base,ilist); + + SplineSetFindBounds(base,&b); + memset(&es,'\0',sizeof(es)); + es.scale = 1.0; + es.mmin = floor(b.miny*es.scale); + es.mmax = ceil(b.maxy*es.scale); + es.omin = b.minx*es.scale; + es.omax = b.maxx*es.scale; + es.cnt = (int) (es.mmax-es.mmin) + 1; + es.edges = gcalloc(es.cnt,sizeof(Edge *)); + es.interesting = gcalloc(es.cnt,sizeof(char)); + es.sc = NULL; + es.major = 1; es.other = 0; + es.genmajoredges = true; + es.is_overlap = true; + FindEdgesSplineSet(base,&es); + ilist = _FindIntersections(&es,ilist); + FreeEdges(&es); + + /* Have to check both directions, else we lose horizontal line intersections */ + es.mmin = floor(b.minx*es.scale); + es.mmax = ceil(b.maxx*es.scale); + es.omin = b.miny*es.scale; + es.omax = b.maxy*es.scale; + es.cnt = (int) (es.mmax-es.mmin) + 1; + es.edges = gcalloc(es.cnt,sizeof(Edge *)); + es.interesting = gcalloc(es.cnt,sizeof(char)); + es.major = 0; es.other = 1; + es.majors = NULL; + es.genmajoredges = true; + FindEdgesSplineSet(base,&es); + ilist = _FindIntersections(&es,ilist); + FreeEdges(&es); + + InsertIntersections(sc,ilist); +return( ilist ); +} + +static int bottomcmp(const void *_e1, const void *_e2) { + const EI *e1 = *(EI *const *) _e1, *e2 = *(EI *const *) _e2; + const double min1 = e1->coordmin[e1->major], min2 = e2->coordmin[e1->major]; + + if ( min1==min2 ) { + double tmmin1, tmmax1, tmmin2, tmmax2; + double o1, o2; + int other = !e1->major; + Spline1D *o; + if ( e1->up ) { tmmin1 = e1->tmin; tmmax1 = e1->tmax; } + else { tmmin1 = e1->tmax; tmmax1 = e1->tmin; } + if ( e2->up ) { tmmin2 = e2->tmin; tmmax2 = e2->tmax; } + else { tmmin2 = e2->tmax; tmmax2 = e2->tmin; } + o = &e1->spline->splines[other]; + o1 = ((o->a*tmmin1+o->b)*tmmin1+o->c)*tmmin1+o->d; + o = &e2->spline->splines[other]; + o2 = ((o->a*tmmin2+o->b)*tmmin2+o->c)*tmmin2+o->d; + if ( o1>o2 ) +return( 1 ); + else if ( o2spline->splines[other]; + o1 = ((o->a*tmmax1+o->b)*tmmax1+o->c)*tmmax1+o->d; + o = &e2->spline->splines[other]; + o2 = ((o->a*tmmax2+o->b)*tmmax2+o->c)*tmmax2+o->d; + if ( o1>o2 ) +return( 1 ); + else if ( o2 min2 ) +return( 1 ); + else +return( -1 ); +} + +static int topcmp(const void *_e1, const void *_e2) { + const EI *e1 = *(EI *const *) _e1, *e2 = *(EI *const *) _e2; + const double max1 = e1->coordmax[e1->major], max2 = e2->coordmax[e1->major]; + +return( ( max1>max2 ) ? 1 : ( max1cnt; ++i ) { + for ( e=el->ordered[i]; e!=NULL; e=e->ordered ) + ++ecnt; + } + el->bottoms = galloc((ecnt+1)*sizeof(EI *)); + el->tops = galloc((ecnt+1)*sizeof(EI *)); + for ( i=ecnt=0; icnt; ++i ) { + for ( e=el->ordered[i]; e!=NULL; e=e->ordered ) { + if ( e->coordmin[major]!=e->coordmax[major] ) { + el->bottoms[ecnt] = el->tops[ecnt] = e; + ++ecnt; + } + e->major = major; + } + } + el->bottoms[ecnt] = el->tops[ecnt] = NULL; + qsort(el->bottoms,ecnt,sizeof(EI *),bottomcmp); + qsort(el->tops,ecnt,sizeof(EI *),topcmp); +} + +static int ExactlySame(EI *e1,EI *e2) { + if ( e1==e2 ) +return( true ); + + if ( e1->spline->from->me.x==e2->spline->from->me.x && e1->spline->from->me.y==e2->spline->from->me.y && + e1->spline->to->me.x==e2->spline->to->me.x && e1->spline->to->me.y==e2->spline->to->me.y && + e1->spline->from->nonextcp && e2->spline->from->nonextcp && + e1->spline->to->noprevcp && e2->spline->to->noprevcp ) +return( true ); + /* And in reverse... */ + if ( e1->spline->from->me.x==e2->spline->to->me.x && e1->spline->from->me.y==e2->spline->to->me.y && + e1->spline->to->me.x==e2->spline->from->me.x && e1->spline->to->me.y==e2->spline->from->me.y && + e1->spline->from->nonextcp && e2->spline->to->nonextcp && + e1->spline->to->noprevcp && e2->spline->from->noprevcp ) +return( true ); + +return( false ); +} + +static EI *CountDuplicates(SplineChar *sc,enum overlap_type ot, + EI *apt,int *_cnt, int *_ecnt) { + int cnt = *_cnt, tot, etot, c; + EI *test, *needed=NULL, *notunneeded=NULL; + + /* If we have two (or more) tangent splines then they will add 2 to the */ + /* count. But they need to be treated carefully. One of them will always */ + /* have to go, but the other might be needed. And if we get the wrong one*/ + /* ... */ + tot = c = etot = 0; + for ( test=apt; test!=NULL && ExactlySame(apt,test); test=test->aenext ) { + if ( test->spline->isneeded ) needed = test; + if ( !test->spline->isunneeded ) notunneeded = test; + if ( ot==over_exclude && test->spline->exclude ) + etot += test->up?1:-1; + else + tot += test->up?1:-1; + ++c; + } + if ( ot == over_remove ) { + if (( cnt==0 && tot==0 ) || /* The two (or more) lines cancel out */ + (cnt!=0 && cnt+tot!=0)) { /* Normal case of internal lines */ +#if DEBUG + if ( needed!=NULL && !needed->spline->isunneeded ) + GDrawIError( c==1? + "A spline is both needed and unneeded in CountDuplicates#1 in %s": + "A set of tangent splines is both needed and unneeded in CountDuplicates#1 in %s", + sc!=NULL?sc->name:""); +#endif + for ( test=apt; test!=NULL && ExactlySame(apt,test); test=test->aenext ) + test->spline->isunneeded = true; + } else /* if (( cnt==0 && tot!=0 ) || (cnt!=0 && cnt+tot==0))*/ { +#if DEBUG + if ( needed ) + /* Already done */; + else if ( notunneeded==NULL ) + GDrawIError( c==1? + "A spline is both needed and unneeded in CountDuplicates#2 in %s": + "A set of tangent splines is both needed and unneeded in CountDuplicates#2 in %s", + sc!=NULL?sc->name:""); +#endif + for ( test=apt; test!=NULL && ExactlySame(apt,test); test=test->aenext ) { + test->spline->isunneeded = true; + test->spline->isneeded = false; + } + apt->spline->isunneeded = false; + apt->spline->isneeded = true; + } + } else if ( ot == over_intersect ) { + if (( cnt>-2 && cnt<2 && cnt+tot>-2 && cnt+tot<2 ) || + ((cnt<=-2 || cnt>=2) && (cnt+tot<=-2 || cnt+tot>=2))) { + for ( test=apt; test!=NULL && ExactlySame(apt,test); test=test->aenext ) + test->spline->isunneeded = true; + } else /* if ((cnt>-2 && cnt<2 && (cnt+tot<=-2 || cnt+tot>=2)) || + ((cnt<=-2 || cnt>=2) && cnt+tot>-2 && cnt+tot<2 ))*/ { + for ( test=apt; test!=NULL && ExactlySame(apt,test); test=test->aenext ) { + test->spline->isunneeded = true; + test->spline->isneeded = false; + } + apt->spline->isunneeded = false; + apt->spline->isneeded = true; + } + } else if ( ot == over_exclude ) { + int ecnt = *_ecnt; + if ( ( ecnt!=0 && ecnt+etot!=0 ) || + ( cnt==0 && tot==0 ) || + ( cnt!=0 && cnt+tot!=0 && ecnt==0 && etot==0 ) ) { +#if DEBUG + if ( needed!=NULL && !needed->spline->isunneeded ) + GDrawIError( c==1? + "A spline is both needed and unneeded in CountDuplicates#3 in %s": + "A set of tangent splines is both needed and unneeded in CountDuplicates#3 in %s", + sc!=NULL?sc->name:""); +#endif + for ( test=apt; test!=NULL && ExactlySame(apt,test); test=test->aenext ) + test->spline->isunneeded = true; + } else { +#if DEBUG + if ( needed ) + /* Already done */; + else if ( notunneeded==NULL ) + GDrawIError( c==1? + "A spline is both needed and unneeded in CountDuplicates#4 in %s": + "A set of tangent splines is both needed and unneeded in CountDuplicates#4 in %s", + sc!=NULL?sc->name:""); +#endif + for ( test=apt; test!=NULL && ExactlySame(apt,test); test=test->aenext ) { + test->spline->isunneeded = true; + test->spline->isneeded = false; + } + apt->spline->isunneeded = false; + apt->spline->isneeded = true; + } + *_ecnt += etot; + } + *_cnt += tot; +return( test ); +} + +static void _FindNeeded(SplineChar *sc,EIList *el, int major) { + EI *active=NULL, *apt, *e, *npt, *pr; + int bpos=0, tpos=0, cnt, ecnt; + double pos, npos; + int other = !major, subchange; + + el->major = major; + ELOrder(el,major); + ELCarefullOrder(el,major); + + while ( el->bottoms[bpos]!=NULL || el->tops[tpos]!=NULL ) { + /* Figure out the next point of interest */ + if ( el->tops[tpos]==NULL ) + pos = el->bottoms[bpos]->coordmin[major]; + else if ( el->bottoms[bpos]==NULL ) + pos = el->tops[tpos]->coordmax[major]; + else + pos = el->tops[tpos]->coordmax[major]<=el->bottoms[bpos]->coordmin[major] ? + el->tops[tpos]->coordmax[major] : + el->bottoms[bpos]->coordmin[major]; +/* Much of this loop is a reworking of EIActiveEdgesRefigure, changed */ +/* to support a non-integral approach. This works because there should be */ +/* no crossings */ + /* Then remove anything that ends here */ + if ( el->tops[tpos]!=NULL && pos==el->tops[tpos]->coordmax[major] ) { + for ( pr=NULL, apt=active; apt!=NULL; apt = apt->aenext ) { + if ( apt->coordmax[major]==pos ) { + if ( pr==NULL ) + active = apt->aenext; + else + pr->aenext = apt->aenext; + } else + pr = apt; + } + while ( el->tops[tpos]!=NULL && pos==el->tops[tpos]->coordmax[major]) + ++tpos; + } + /* then move the active list to the next line */ + for ( apt=active; apt!=NULL; apt = apt->aenext ) { + Spline1D *osp = &apt->spline->splines[other]; + apt->tcur = EITOfNextMajor(apt,el,pos); + apt->ocur = ( ((osp->a*apt->tcur+osp->b)*apt->tcur+osp->c)*apt->tcur + osp->d ); + } + active = EIActiveListReorder(active,&subchange); + if ( subchange ) + GDrawIError("There should be no crossovers in _FindNeeded in %s", sc!=NULL?sc->name:""); + while ( el->bottoms[bpos]!=NULL && pos==el->bottoms[bpos]->coordmin[major] ) { + Spline1D *osp; + npt = el->bottoms[bpos++]; + osp = &npt->spline->splines[other]; + npt->tcur = npt->up?0:1; + npt->ocur = ( ((osp->a*npt->tcur+osp->b)*npt->tcur+osp->c)*npt->tcur + osp->d ); + for ( pr=NULL, apt=active; apt!=NULL && npt!=NULL; ) { + if ( npt->ocurocur ) { + npt->aenext = apt; + if ( pr==NULL ) + active = npt; + else + pr->aenext = npt; + npt = NULL; + break; + } else { + pr = apt; + apt = apt->aenext; + } + } + if ( npt!=NULL ) { + if ( pr==NULL ) + active = npt; + else + pr->aenext = npt; + npt->aenext = NULL; + } + } +/* End of EIActiveEdgesRefigure */ +/* Now for the part of the routine which actually does something... */ + if ( el->tops[tpos]==NULL && el->bottoms[bpos]==NULL) + break; + if ( el->tops[tpos]==NULL ) + npos = el->bottoms[bpos]->coordmin[major]; + else if ( el->bottoms[bpos]==NULL ) + npos = el->tops[tpos]->coordmax[major]; + else + npos = el->tops[tpos]->coordmax[major]<=el->bottoms[bpos]->coordmin[major] ? + el->tops[tpos]->coordmax[major] : + el->bottoms[bpos]->coordmin[major]; + pos = (npos+pos)/2; + for ( apt=active; apt!=NULL; apt = apt->aenext ) { + Spline1D *osp = &apt->spline->splines[other]; + apt->tcur = EITOfNextMajor(apt,el,pos); + apt->ocur = ( ((osp->a*apt->tcur+osp->b)*apt->tcur+osp->c)*apt->tcur + osp->d ); + } + active = EIActiveListReorder(active,&subchange); + for ( apt=active; apt!=NULL; apt = e ) { + ecnt = cnt = 0; + e = CountDuplicates(sc,el->ot,apt,&cnt,&ecnt); + for ( ; e!=NULL && (cnt!=0 || ecnt!=0); ) { + e = CountDuplicates(sc,el->ot,e,&cnt,&ecnt); + } + } + } + free(el->ordered); + free(el->ends); + free(el->bottoms); + free(el->tops); +} + +static void SSExcludeSet(SplineSet *base) { + int selected; + SplinePoint *sp; + Spline *s, *first; + + while ( base!=NULL ) { + selected = false; + for ( sp=base->first ; ; ) { + if ( sp->selected ) { + selected = true; + break; + } + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==base->first ) + break; + } + first = NULL; + for ( s = base->first->next; s!=NULL && s!=first ; s = s->to->next ) { + if ( first==NULL ) first = s; + s->exclude = selected; + } + base = base->next; + } +} + +static void SplineSetFindNeeded(SplineChar *realsc,SplineSet *base,enum overlap_type ot) { + EIList el; + SplineChar sc; +#ifdef FONTFORGE_CONFIG_TYPE3 + Layer layers[2]; +#endif + + memset(&sc,'\0',sizeof(sc)); +#ifdef FONTFORGE_CONFIG_TYPE3 + memset(layers,0,sizeof(layers)); + sc.layers = layers; +#endif + sc.layer_cnt = 2; + sc.layers[ly_fore].splines = base; + sc.name = realsc->name; + + memset(&el,'\0',sizeof(el)); + el.leavetiny = true; + ELFindEdges(&sc, &el); + el.ot = ot; + if ( ot==over_exclude ) + SSExcludeSet(base); + + _FindNeeded(realsc,&el,1); + + /* Have to check both directions, else we lose horizontal line intersections */ + _FindNeeded(realsc,&el,0); + + ElFreeEI(&el); +} + +/* Ok. If we're going to refigure things we've got to make sure that each */ +/* spline segment at the intersection is disconnected from whatever spline */ +/* segment it was originally connected to. As we do that we have to create */ +/* new (temporary) end points for one of them (since the spline point is */ +/* where the connection happens) */ +/* It's also possible to have a spline where both end points are at the */ +/* intersection (figure 8 again) */ +static void ILDisconnect(IntersectionList *ilist) { + SplineList *sl; + SplinePoint *sp; + + while ( ilist!=NULL ) { + for ( sl = ilist->splines; sl!=NULL; sl=sl->next ) { + if ( sl->spline->from->me.x == ilist->intersection.x && + sl->spline->from->me.y == ilist->intersection.y ) { + if ( sl->spline->from->prev!=sl->spline && sl->spline->from->prev != NULL ) { + sp = chunkalloc(sizeof(SplinePoint)); + *sp = *sl->spline->from; + sp->hintmask = NULL; + sl->spline->from->prev = NULL; + sp->next = NULL; + sp->prev->to = sp; + } + } + if ( sl->spline->to->me.x == ilist->intersection.x && + sl->spline->to->me.y == ilist->intersection.y ) { + if ( sl->spline->to->next!=sl->spline && sl->spline->to->next != NULL ) { + sp = chunkalloc(sizeof(SplinePoint)); + *sp = *sl->spline->to; + sp->hintmask = NULL; + sl->spline->to->next = NULL; + sp->prev = NULL; + sp->next->from = sp; + } + } + } + ilist = ilist->next; + } +} + +static void SplinesMergeLists(SplineChar *sc,Spline *before, Spline *after) { + + if ( !RealNearish(before->to->me.x,after->from->me.x) || + !RealNearish(before->to->me.y,after->from->me.y) ) + GDrawIError("Attempt to merge two splines which don't meet in %s", + sc!=NULL?sc->name:""); + if ( before->to->next!=NULL || after->from->prev!=NULL ) + GDrawIError("Attempt to merge two splines which are already attached to stuff in %s", + sc!=NULL?sc->name:""); + before->to->nextcp = after->from->nextcp; + before->to->nonextcp = after->from->nonextcp; + before->to->nextcpdef = after->from->nextcpdef; + before->to->next = after; + SplinePointFree(after->from); + after->from = before->to; + SplinePointCatagorize(before->to); +} + +static SplineSet *SplineSetCreate(SplineChar *sc,SplinePoint *from, SplinePoint *to) { + SplineSet *spl; + + if ( from->prev!=NULL || to->next!=NULL ) + GDrawIError("Attempt to create a splineset from two points not at end in %s", + sc!=NULL?sc->name:""); + if ( from->me.x != to->me.x || from->me.y!=to->me.y ) + GDrawIError("Attempt to create a splineset from two points which aren't at the same place in %s", + sc!=NULL?sc->name:""); + if ( /*from->next->isticked ||*/ !from->next->isneeded || /*to->prev->isticked ||*/ + !to->prev->isneeded ) + GDrawIError("Bad choice of splines in SplineSetCreate in %s", + sc!=NULL?sc->name:""); + from->next->isticked = to->prev->isticked = true; + SplinesMergeLists(sc,to->prev,from->next); + spl = chunkalloc(sizeof(SplineSet)); + spl->first = spl->last = to; +return( spl ); +} + +/* We're about to free this spline, but it connects to some intersection */ +/* so we've got to remove it from the intersection first */ +static void ILRemoveSplineFrom(SplineChar *sc,IntersectionList *il,BasePoint *ival,Spline *spline) { + SplineList *sl, *slprev; + + while ( il!=NULL && (il->intersection.x!=ival->x || il->intersection.y!=ival->y)) + il = il->next; + if ( il==NULL ) + GDrawIError("Couldn't find intersection in ILRemoveSplineFrom in %s", + sc!=NULL?sc->name:""); + else { + slprev = NULL; + for ( sl = il->splines; sl!=NULL && sl->spline!=spline; slprev = sl, sl = sl->next ); + if ( sl==NULL ) + GDrawIError("Couldn't find spline in ILRemoveSplineFrom in %s", + sc!=NULL?sc->name:""); + else { + if ( slprev==NULL ) + il->splines = sl->next; + else + slprev->next = sl->next; + free(sl); + } + } +} + +static void SplineListFree(SplineChar *sc,SplineList *sl,IntersectionList *ilist) { + Spline *spline, *snext; + + if ( sl->spline->from->me.x==ilist->intersection.x && + sl->spline->from->me.y==ilist->intersection.y ) { + SplinePointFree(sl->spline->from); + for ( spline = sl->spline; spline !=NULL; spline = snext ) { + snext = spline->to->next; + if ( spline->isneeded || !spline->isunneeded ) + GDrawIError("Spline which is needed (or not unneeded) when about to be freed in %s", + sc!=NULL?sc->name:""); + if ( spline->to->isintersection ) + ILRemoveSplineFrom(sc,ilist,&spline->to->me,spline); + SplinePointFree(spline->to); + SplineFree(spline); + } + } else if ( sl->spline->to->me.x==ilist->intersection.x && + sl->spline->to->me.y==ilist->intersection.y ) { + SplinePointFree(sl->spline->to); + for ( spline = sl->spline; spline !=NULL; spline = snext ) { + snext = spline->from->prev; + if ( spline->isneeded || !spline->isunneeded ) + GDrawIError("Spline which is needed (or not unneeded) when about to be freed in %s", + sc!=NULL?sc->name:""); + if ( spline->from->isintersection ) + ILRemoveSplineFrom(sc,ilist,&spline->from->me,spline); + SplinePointFree(spline->from); + SplineFree(spline); + } + } else + GDrawIError( "Couldn't identify intersection in SplineListFree in %s", + sc!=NULL?sc->name:""); + free(sl); +} + +static void ILFreeUnusedSplines(SplineChar *sc,IntersectionList *ilist) { + SplineList *sl, *prev, *snext; + + while ( ilist!=NULL ) { + prev = NULL; + for ( sl=ilist->splines; sl!=NULL; sl=snext ) { + snext = sl->next; + if ( sl->spline->isunneeded ) { + if ( sl->spline->isneeded ) + GDrawIError("Spline which is both needed and unneeded in ILFreeUnusedSplines in %s", + sc!=NULL?sc->name:""); + if ( prev==NULL ) + ilist->splines = snext; + else + prev->next = snext; + SplineListFree(sc,sl,ilist); /* This might free snext */ + snext = (prev==NULL)?ilist->splines:prev->next; + } else { + if ( !sl->spline->isneeded ) + GDrawIError("Spline which is neither needed nor unneeded in ILFreeUnusedSplines in %s", + sc!=NULL?sc->name:""); + prev = sl; + } + } + if ( ilist->splines==NULL ) ilist->processed = true; + ilist = ilist->next; + } +} + +static void ReverseSplines(Spline *last) { + Spline *first; + SplinePointList spl; + + spl.last = last->to; + for ( first=last; first->from->prev!=NULL ; first = first->from->prev ); + spl.first = first->from; + SplineSetReverse(&spl); +} + +static int SimpleReturn(Spline *spline, IntersectionList *curpos, IntersectionList *start) { + if ( spline->from->me.x==curpos->intersection.x && spline->from->me.y==curpos->intersection.y ) { + while ( spline->to->next!=NULL ) spline = spline->to->next; +return( spline->to->me.x==start->intersection.x && spline->to->me.y==start->intersection.y ); + } else { + while ( spline->from->prev!=NULL ) spline = spline->from->prev; +return( spline->from->me.x==start->intersection.x && spline->from->me.y==start->intersection.y ); + } +} + +static SplineSet *ILRemoveTwoTrack(SplineChar *sc,IntersectionList *inter, IntersectionList *ilist) { + Spline *good1=NULL, *good2=NULL, *cur, *last; + SplineList *sl; + IntersectionList *il; + + for ( sl=inter->splines; sl!=NULL; sl=sl->next ) { + if ( sl->spline->isneeded && !sl->spline->isticked ) { + if ( good1==NULL ) { + good1 = sl->spline; + if ( good1->from->me.x == good1->to->me.x && good1->from->me.y==good1->to->me.y ) { + /* this spline stops and ends at the intersection point */ + /* so makes a complete loop by itself */ +return( SplineSetCreate(sc,good1->from,good1->to)); + } + } else { + good2 = sl->spline; + break; + } + } + } + if ( good1==NULL ) +return( NULL ); + else if ( good2==NULL ) { + GDrawIError( "Single needed spline at an intersection in %s", + sc!=NULL?sc->name:""); +return( NULL ); + } + good1->isticked = true; /*good2->isticked=true;*/ + if ( good1->to->me.x==inter->intersection.x && good1->to->me.y==inter->intersection.y ) + ReverseSplines(good1); + cur = good1; + while ( 1 ) { + for ( last=cur; last->to->next!=NULL; last=last->to->next) { + if ( last->isunneeded || !last->isneeded ) + GDrawIError( "Spline unneeded (or not needed) when it should have been in %s", + sc!=NULL?sc->name:""); + } + last->isticked = true; + if ( last->to->me.x == inter->intersection.x && last->to->me.y == inter->intersection.y ) { + /* Done, we've looped back, might not be to good2 though. That doesn't */ + /* matter the point (before) was to make sure there was somewhere */ + /* return to */ +return( SplineSetCreate(sc,good1->from,last->to)); + } + for ( il = ilist; il!=NULL; il=il->next ) { + if ( last->to->me.x == il->intersection.x && last->to->me.y == il->intersection.y ) + break; + } + cur = NULL; + if ( il!=NULL ) { + for ( sl=il->splines; sl!=NULL; sl=sl->next ) { + /* if there is a splineset which returns to our start without */ + /* going through other intersections then pick it */ + if ( sl->spline->isneeded && !sl->spline->isticked && + SimpleReturn(sl->spline,il,inter)) { + cur = sl->spline; + break; + } + } + if ( cur==NULL ) { + /* otherwise just pick anything. It'll return eventually */ + for ( sl=il->splines; sl!=NULL; sl=sl->next ) { + if ( sl->spline->isneeded && !sl->spline->isticked ) { + cur = sl->spline; + break; + } + } + } + } + if ( cur==NULL ) { + SplinePointList *spl; + GDrawIError("Found an intersection with no exit in %s", + sc!=NULL?sc->name:""); + spl = chunkalloc(sizeof(SplinePointList)); + spl->first = good1->from; spl->last = last->to; +return( spl ); + } + cur->isticked = true; + if ( RealNearish(cur->to->me.x,last->to->me.x) && + RealNearish(cur->to->me.y,last->to->me.y) ) + ReverseSplines(cur); + SplinesMergeLists(sc,last,cur); + } +} + +static SplineSet *SSRebuild(SplineChar *sc,IntersectionList *ilist) { + SplineSet *head=NULL, *last=NULL, *cur; + IntersectionList *il; + SplineList *sl; + + /* Look for any simple closed loops first. Not really needed, but I think */ + /* results are better if we do this */ + for ( il=ilist; il!=NULL; il=il->next ) { + for ( sl=il->splines; sl!=NULL; sl=sl->next ) { + if ( sl->spline->isneeded && !sl->spline->isticked ) { + Spline *s = sl->spline; + if ( s->from->me.x == s->to->me.x && s->from->me.y==s->to->me.y ) { + cur = SplineSetCreate(sc,s->from,s->to); + if ( head==NULL ) + head=cur; + else + last->next = cur; + last = cur; + } + } + } + } + + while ( ilist!=NULL ) { + if ( !ilist->processed ) { + /* An intersection may have no needed splines at it (entirely internal) */ + /* In almost all cases an intersection will only have two splines */ + /* rarely we will get a self-intersecting spline (figure 8) where */ + /* we have more than 2 needed paths. There better be an even number */ + /* I don't think it matters which ones we pick */ + while ( (cur=ILRemoveTwoTrack(sc,ilist,ilist->next))) { + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } + ilist->processed = true; + } + ilist = ilist->next; + } +return( head ); +} + +static void IListCheck(SplinePoint *sp,IntersectionList *ilist) { + /* We're freeing the splineset that this point is on */ + /* but it happens to be one of our intersection points, so we need */ + /* the intersection to know that it's just lost the two splines attached */ + /* to the point */ + SplineList *sl, *snext, *prev; + + while ( ilist!=NULL ) { + if ( ilist->intersection.x==sp->me.x && ilist->intersection.y==sp->me.y ) { + prev = NULL; + for ( sl = ilist->splines; sl!=NULL; sl = snext ) { + snext = sl->next; + if ( sl->spline==sp->prev || sl->spline==sp->next ) { + if ( prev==NULL ) + ilist->splines = snext; + else + prev->next = snext; + free(sl); + } else + prev = sl; + } + break; + } + ilist = ilist->next; + } +} + +/* If there are any splineset where all the splines are marked unneeded then */ +/* we can just free them now and reduce complexity later */ +static SplineSet *SSRemoveAllUnneeded(SplineChar *sc, + SplineSet *base, IntersectionList *ilist) { + SplineSet *spl, *prev, *snext; + Spline *spline, *first; + int allunneeded; + SplinePoint *sp, *firstsp; + + for ( spl = base, prev=NULL; spl!=NULL; spl = snext ) if ( spl->first->prev!=NULL ) { + snext = spl->next; + first = NULL; + allunneeded = true; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = spline->to->next ) { + if ( !spline->isunneeded ) { + allunneeded = false; + break; + } + if ( spline->isneeded ) + GDrawIError("Spline both needed and unneeded in SSRemoveAllUnneeded in %s", + sc!=NULL?sc->name:""); + if ( first==NULL ) first=spline; + } + if ( allunneeded ) { + firstsp = NULL; + for ( sp = spl->first; sp!=NULL && sp!=firstsp; sp=sp->next->to ) { + if ( sp->isintersection ) + IListCheck(sp,ilist); + if ( firstsp==NULL ) firstsp = sp; + } + if ( prev==NULL ) + base = snext; + else + prev->next = snext; + spl->next = NULL; + SplinePointListFree(spl); + } else + prev = spl; + } +return( base ); +} + +static SplineSet *SSRemoveAllNeeded(SplineChar *sc,SplineSet **base, IntersectionList *ilist) { + SplineSet *spl, *prev, *snext, *head=NULL, *last=NULL; + Spline *spline, *first; + int allneeded; + + for ( spl = *base, prev=NULL; spl!=NULL; spl = snext ) { + snext = spl->next; + if ( spl->first->prev!=NULL ) { + first = NULL; + allneeded = !spl->first->isintersection; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = spline->to->next ) { + if ( !spline->isneeded || spline->to->isintersection ) { + allneeded = false; + break; + } + if ( first==NULL ) first=spline; + } + if ( allneeded ) { + if ( prev==NULL ) + *base = snext; + else + prev->next = snext; + spl->next = NULL; + if ( head==NULL ) + head = spl; + else + last->next = spl; + last = spl; + for ( spline = spl->first->next; spline!=NULL && !spline->isticked; spline = spline->to->next ) { + spline->isticked = true; + if ( spline->to->isintersection ) + GDrawIError("Spline in a fully-needed splineset has an intersection in SSRemoveAllNeeded in %s", + sc!=NULL?sc->name:""); + } + } else + prev = spl; + } + } +return( head ); +} + +/* We rotated the character's splineset so that the current spline at the */ +/* current point is parallel to the x-axis. Then we are only interested in */ +/* splines which intersect the vertical line through the current point */ + +static int IsInteresting(Spline *s,double tmin,double tmax,BasePoint *me) { + Spline1D *s1 = &s->splines[0]; + double xtmin = ((s1->a*tmin+s1->b)*tmin+s1->c)*tmin+s1->d; + double xtmax = ((s1->a*tmax+s1->b)*tmax+s1->c)*tmax+s1->d; + double t, test; + + if (( xtminx && xtmaxx ) || ( xtmin>me->x && xtmax>me->x )) +return( false ); + if ( xtmin!=me->x && xtmax!=me->x ) +return( true ); + if ( xtmin==me->x ) { + if ( tmin>0 ) { + if ( (t = tmin-.0001)<0 ) t=0; + } else { + s1 = &s->from->prev->splines[0]; + t = .9999; + } + test = ((s1->a*t+s1->b)*t+s1->c)*t+s1->d; + if (( testxtmin && xtmax>xtmin )) +return( false ); /* Point of inflection */ + } else { + if ( tmax<1 ) { + if ( (t = tmax+.0001)>1 ) t=1; + } else { + s1 = &s->to->next->splines[0]; + t = .0001; + } + if (( testxtmax && xtmin>xtmax )) +return( false ); /* Point of inflection */ + } +return( true ); +} + +static int SameSplines(Spline *s1,Spline *s2) { + if ( s1==s2 ) +return( true ); + if ( s1==NULL || s2==NULL ) +return( false ); + if ( s1->from->me.x==s2->from->me.x && s1->from->me.y==s2->from->me.y && + s1->from->nextcp.x==s2->from->nextcp.x && s1->from->nextcp.y==s2->from->nextcp.y && + s1->to->prevcp.x==s2->to->prevcp.x && s1->to->prevcp.y==s2->to->prevcp.y && + s1->to->me.x==s2->to->me.x && s1->to->me.y==s2->to->me.y ) +return( true ); + +return( false ); +} + +static int CountCrossings(SplineSet *spl,BasePoint *pt,double me_t, Spline *exceptme) { + Spline *s, *first; + double ts[4], t, y, xmin, xmax; + int i, bcnt; + + ts[0] = 0; + bcnt = 0; + while ( spl!=NULL ) { + if ( spl->first->prev!=NULL ) { + first = NULL; + for ( s=spl->first->next ; s!=first ; s = s->to->next ) if ( !SameSplines(s,exceptme) ) { + SplineFindExtrema(&s->splines[0],&ts[1],&ts[2]); + if ( ts[1]==-1 ) ts[1] = 1; + else if ( ts[2]==-1 ) ts[2] = 1; + else ts[3] = 1; + for ( i=0; ts[i]!=1; ++i ) { + if ( IsInteresting(s,ts[i], ts[i+1], pt)) { + t = SplineSolve(&s->splines[0],ts[i],ts[i+1], pt->x, .0001); + if ( t==-1 ) /* can't happen */ +return( -1 ); + if ( t==ts[i] || t==ts[i+1] ) /* Things get too complicated at the ends of splines */ +return( -1 ); + y = ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d; + if ( y==pt->y ) + /* Ignore anything coincident */; + else if ( yy ) { + xmin = ((s->splines[0].a*ts[i]+s->splines[0].b)*ts[i]+s->splines[0].c)*ts[i]+s->splines[0].d; + xmax = ((s->splines[0].a*ts[i+1]+s->splines[0].b)*ts[i+1]+s->splines[0].c)*ts[i+1]+s->splines[0].d; + if ( xmax>xmin ) + ++bcnt; + else + --bcnt; + } + } + } + if ( first==NULL ) + first = s; + } + } + spl = spl->next; + } + if ( bcnt!=0 && exceptme!=NULL ) { + ts[0] = me_t-.01; ts[1] = me_t+.01; + s = exceptme; + xmin = ((s->splines[0].a*ts[0]+s->splines[0].b)*ts[0]+s->splines[0].c)*ts[0]+s->splines[0].d; + xmax = ((s->splines[0].a*ts[1]+s->splines[0].b)*ts[1]+s->splines[0].c)*ts[1]+s->splines[0].d; + if ( xmax>xmin ) + ++bcnt; + else + --bcnt; + } +return( bcnt<0 ? -bcnt : bcnt ); +} + +static Spline *FindMe(SplineSet *spl,real trans[6],Spline *s) { + SplinePoint to, from; + Spline *test, *first; + + to.me.x = rint(1024*(s->to->me.x*trans[0] + s->to->me.y*trans[2]))/1024; + to.me.y = rint(1024*(s->to->me.x*trans[1] + s->to->me.y*trans[3]))/1024; + to.prevcp.x = rint(1024*(s->to->prevcp.x*trans[0] + s->to->prevcp.y*trans[2]))/1024; + to.prevcp.y = rint(1024*(s->to->prevcp.x*trans[1] + s->to->prevcp.y*trans[3]))/1024; + from.me.x = rint(1024*(s->from->me.x*trans[0] + s->from->me.y*trans[2]))/1024; + from.me.y = rint(1024*(s->from->me.x*trans[1] + s->from->me.y*trans[3]))/1024; + from.nextcp.x = rint(1024*(s->from->nextcp.x*trans[0] + s->from->nextcp.y*trans[2]))/1024; + from.nextcp.y = rint(1024*(s->from->nextcp.x*trans[1] + s->from->nextcp.y*trans[3]))/1024; + + while ( spl!=NULL ) { + if ( spl->first->prev!=NULL ) { + first = NULL; + for ( test = spl->first->next; test!=first ; test=test->to->next ) { + if ( first==NULL ) first = test; + if ( RealNear(test->from->me.x,from.me.x) && + RealNear(test->from->me.y,from.me.y) && + RealNear(test->from->nextcp.x,from.nextcp.x) && + RealNear(test->from->nextcp.y,from.nextcp.y) && + RealNear(test->to->prevcp.x,to.prevcp.x) && + RealNear(test->to->prevcp.y,to.prevcp.y) && + RealNear(test->to->me.x,to.me.x) && + RealNear(test->to->me.y,to.me.y) ) +return( test ); + } + } + spl = spl->next; + } + GDrawIError("Failed to find transformed spline" ); +return( NULL ); +} + +static int IsExternalEdge(Spline *s,double t,SplineSet *base ) { + SplineSet *altered=NULL; + double theta; + double slopex, slopey; + BasePoint here, rpt; + int cnt; + real trans[6]; + + slopex = (3*s->splines[0].a*t+2*s->splines[0].b)*t+s->splines[0].c; + slopey = (3*s->splines[1].a*t+2*s->splines[1].b)*t+s->splines[1].c; + here.x = ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d; + here.y = ((s->splines[1].a*t+s->splines[1].b)*t+s->splines[1].c)*t+s->splines[1].d; + if ( slopex==0 && slopey==0 ) +return( -1 ); + theta = atan2(slopey,slopex); + + trans[0] = trans[3] = cos(theta); + trans[2] = sin(theta); + trans[1] = -trans[2]; + trans[4] = trans[5] = 0; + altered = SplinePointListTransform(SplinePointListCopy(base),trans,true); + rpt.x = rint(1024*(here.x*trans[0] + here.y*trans[2]))/1024; + rpt.y = rint(1024*(here.x*trans[1] + here.y*trans[3]))/1024; + cnt = CountCrossings(altered,&rpt,t,FindMe(altered,trans,s)); + SplinePointListsFree(altered); +return( cnt==-1 ? -1 : cnt==0 ); +} + +static void ForceAllnu(SplinePoint *csp,SplinePoint *nsp,int isneeded) { + Spline *s; + + for ( s=csp->next ; ; s = s->to->next ) { + s->isneeded = isneeded; + s->isunneeded = !isneeded; + if ( s->to == nsp ) + break; + } +} + +static int PathIsGood(Spline *s) { + /* Are all splines on this path either needed or unneeded, but never both? */ + int isn = s->isneeded; + + forever { + if ( s->isneeded && s->isunneeded ) +return( false ); + if ( !s->isneeded && !s->isunneeded ) +return( false ); + if ( s->isneeded!=isn ) +return( false ); + if ( s->to->isintersection ) +return( true ); + s = s->to->next; + } +} + +static int CountGoodNeededPaths(IntersectionList *il,Spline *ignoreme) { + int cnt=0; + SplineList *l; + + for ( l=il->splines; l!=NULL; l=l->next ) if ( l->spline!=ignoreme ) { + if ( !PathIsGood(l->spline)) +return( -1 ); + else if ( l->spline->isneeded ) + ++cnt; + } +return( cnt ); +} + +static int AllIntersectionsEven(IntersectionList *ilist) { + IntersectionList *il; + int cnt; + + for ( il=ilist; il!=NULL; il=il->next ) { + cnt = CountGoodNeededPaths(il,NULL); + if ( cnt==-1 || (cnt&1)) +return( false ); + } +return( true ); +} + +static void ForceAllSame(SplinePoint *csp,SplinePoint *nsp,SplineChar *sc, + SplineSet * base, IntersectionList *ilist) { + int ncnt, ucnt; + int cntc, cntn; + Spline *s; + IntersectionList *cil, *nil; + int i, div; + + ncnt = ucnt = 0; + for ( s=csp->next ; ; s = s->to->next ) { + if ( s->isneeded ) ++ncnt; + if ( s->isunneeded ) ++ucnt; + if ( s->to == nsp ) + break; + } + if ( (ncnt==0 || ucnt==0 ) && ncnt!=ucnt ) +return; + if ( csp->isintersection ) { /* This might be false if we are dealing with an entire contour */ + cil = FindIntersectionAt(ilist,csp->me.x,csp->me.y); + nil = FindIntersectionAt(ilist,nsp->me.x,nsp->me.y); + if ( cil==NULL || nil==NULL ) + GDrawIError("Failed to find intersection"); + else if ( cil==nil ) { + /* Can't guess whether this path is needed or unneeded. Since */ + /* it starts and ends at the same point, either way will work */ + } else { + cntc = CountGoodNeededPaths(cil,csp->next); + cntn = CountGoodNeededPaths(nil,nsp->prev); + if ( cntc==-1 || cntc==-1 ) + /* Can't tell */; + else if ( (cntc&1)==0 && (cntn&1)==0 ) + ForceAllnu(csp,nsp,0); /* Both intersections have an */ + /* even number of paths (ignoring this one) so adding this*/ + /* one would make an uneven number, which would be wrong */ + else if ( (cntc&1)==1 && (cntn&1)==1 ) + ForceAllnu(csp,nsp,1); + } + } + + for ( div=3; div<20; div += 2 ) { + ncnt = ucnt = 0; + for ( s=csp->next ; ; s = s->to->next ) { + for ( i=1; i<=div; ++i ) { + int isee = IsExternalEdge(s,i/((double) (div+1)),base); + if ( isee==-1 ) + goto tryagain; + if ( isee ) + ++ncnt; + else + ++ucnt; + } + if ( s->to == nsp ) + break; + } + if ( ncnt>=2*ucnt ) { + ForceAllnu(csp,nsp,1); +return; + } else if ( ucnt>=2*ncnt ) { + ForceAllnu(csp,nsp,0); +return; + } + tryagain:; + } + GDrawIError("Couldn't guess needed/unneeded in ForceAllSame"); +} + +static void RefigureNeeded(SplineSet *base) { + int i; + SplineSet *spl; + Spline *s, *first; + + for ( spl=base; spl!=NULL; spl=spl->next ) if ( spl->first->prev!=NULL ) { + first = NULL; + for ( s = spl->first->next; s!=first; s = s->to->next ) { + if ( first==NULL ) first = s; + for ( i=1; i<5; ++i ) { + int isee = IsExternalEdge(s,i/5.,base); + if ( isee==1 ) + s->isneeded = true; + else if ( isee==0 ) + s->isunneeded = true; + } + } + } +} + +static int AllSame(SplinePoint *csp,SplinePoint *nsp) { + int ncnt, ucnt; + Spline *s; + + ncnt = ucnt = 0; + for ( s=csp->next ; ; s = s->to->next ) { + if ( !s->isneeded && !s->isunneeded ) +return( false ); + if ( s->isneeded ) ++ncnt; + if ( s->isunneeded ) ++ucnt; + if ( s->to == nsp ) + break; + } +return(ncnt==0 || ucnt==0 ); +} + +static void CleanupNeededUn(SplineChar *sc,SplineSet *base, IntersectionList *ilist) { + SplineSet *spl; + SplinePoint *sp, *csp, *nsp; + int i, anyproblems; + /* First check if we have any inconsistant paths (both needed & unneeded) */ + /* If not, return */ + /* If so, do a slower method of calculating the needed bits, and then */ + /* check the conflicting paths more closely */ + /* (we refigure all the needed bits, not just the conflicting ones because*/ + /* we sometimes miss a conflict) */ + + for ( i=0; i<2; ++i ) { + for ( spl=base; spl!=NULL; spl = spl->next ) if ( spl->first->prev!=NULL ) { + for ( sp = spl->first; !sp->isintersection ; ) { + sp = sp->next->to; + if ( sp==spl->first ) + break; + } + for ( csp = sp; ; ) { + for ( nsp = csp->next->to; !nsp->isintersection && nsp!=sp; nsp = nsp->next->to ); + if ( i==0 ) { + anyproblems = !AllSame(csp,nsp); + if ( anyproblems ) + goto break_out; + } else { + ForceAllSame(csp,nsp,sc,base,ilist); + } + if ( nsp==sp ) + break; + csp = nsp; + } + } + break_out: + if ( i==0 ) { + if ( !anyproblems && AllIntersectionsEven(ilist)) +return; + RefigureNeeded(base); + } + } +} + +static void SSValidate(SplineChar *sc,SplineSet *spl) { + Spline *spline, *first; + + for ( ;spl!=NULL; spl=spl->next ) if ( spl->first->prev!=NULL ) { + first = NULL; + for ( spline=spl->first->next; spline!=first && spline!=NULL; spline = spline->to->next ) { + if ( spline->isneeded ^ spline->isunneeded ) + /* Exactly one is set, that's good */; + else { + if ( spline->isneeded ) + GDrawIError( "Spline is both needed and unneeded in SSValidate\n(%g,%g)->(%g,%g) in %s", + spline->from->me.x, spline->from->me.y, + spline->to->me.x, spline->to->me.y, + sc!=NULL?sc->name:""); + else + GDrawIError( "Spline is neither needed nor unneeded in SSValidate\n(%g,%g)->(%g,%g) in %s", + spline->from->me.x, spline->from->me.y, + spline->to->me.x, spline->to->me.y, + sc!=NULL?sc->name:""); + /*spline->isunneeded = !spline->isunneeded;*/ + } + if ( first==NULL ) first = spline; + } + } +} + +static void ILFree(IntersectionList *il) { + IntersectionList *inext; + + while ( il!=NULL ) { + inext = il->next; + free(il); + il = inext; + } +} + +/* Now it is possible that we might have two splines that go between the same */ +/* two points (example: a horizontal bar and a vertical bar where the top of */ +/* the hbar is coincident with the top of the vbar. then that section will be*/ +/* represented by two splines). If this happens then findneeded can get all */ +/* confused and may find one first when going horizontally, the other first */ +/* when going vertically and mark both as needed and unneeded. That's bad. So*/ +/* here we go looking for duplicate splines and cleaning them up so that only*/ +/* one is needed and all others are unneeded */ +static void RemoveDuplicates(IntersectionList *ilist) { + SplineList *sl, *sl2; + while ( ilist!=NULL ) { + for ( sl=ilist->splines; sl!=NULL; sl=sl->next ) { + for ( sl2=sl->next; sl2!=NULL; sl2=sl2->next ) if ( sl2->spline!=sl->spline ) { + if ( sl->spline->splines[0].a==sl2->spline->splines[0].a && + sl->spline->splines[0].b==sl2->spline->splines[0].b && + sl->spline->splines[0].c==sl2->spline->splines[0].c && + sl->spline->splines[0].d==sl2->spline->splines[0].d && + sl->spline->splines[1].a==sl2->spline->splines[1].a && + sl->spline->splines[1].b==sl2->spline->splines[1].b && + sl->spline->splines[1].c==sl2->spline->splines[1].c && + sl->spline->splines[1].d==sl2->spline->splines[1].d ) { + if ( sl->spline->isneeded || sl2->spline->isneeded ) { + sl->spline->isneeded = true; + sl2->spline->isneeded = false; + sl->spline->isunneeded = false; + sl2->spline->isunneeded = true; + } + } + } + } + ilist = ilist->next; + } +} + +/* We will also, occasionally, get a little spur stiking out with 0 width */ +/* where a spline runs from an intersection, A, to point B, and then back */ +/* from B to A */ +static SplineSet *RemoveBacktracks(SplineChar *sc,SplineSet *base, IntersectionList *ilist) { + SplineSet *spl, *prev, *next; + Spline *s, *first, *n; + SplinePoint *f, *t, *m; + + prev = NULL; + for ( spl=base, first=NULL; spl!=NULL; spl=next ) { + next = spl->next; + first = NULL; + for ( s=spl->first->next; s!=NULL && s!=first; s=n ) { + if ( first==NULL ) first=s; + n = s->to->next; + f = s->from; t = n->to; m = s->to; + if ( n!=s && f->me.x==t->me.x && f->me.y==t->me.y && + f->nextcp.x==t->nextcp.x && f->nextcp.y==t->prevcp.y && + m->nextcp.x==m->prevcp.x && m->nextcp.y==m->prevcp.y ) { + if ( m->isintersection ) { + ILRemoveSplineFrom(sc,ilist,&m->me,s); + ILRemoveSplineFrom(sc,ilist,&m->me,n); + } + if ( f->isintersection ) + ILRemoveSplineFrom(sc,ilist,&f->me,s); + if ( t->isintersection ) + ILRemoveSplineFrom(sc,ilist,&t->me,n); + if ( f==t ) { + SplinePointListFree(spl); + if ( prev==NULL ) + base = next; + else + prev->next = next; + spl=NULL; + break; + } + SplinePointFree(m); + n=n->to->next; + if ( first==s || first==s->to->next ) first = NULL; + SplineFree(s->to->next); + SplineFree(s); + n->from = f; + f->nextcp = t->nextcp; + f->next = n; + SplinePointFree(t); + if ( spl->first==t || spl->first==m ) spl->first = f; + if ( spl->last==t || spl->last==m ) spl->last = f; + first = NULL; /* If we have a spur of two segments, we might need to go through the list again */ + } else if ( f->me.x==m->me.x && f->me.y==m->me.y && + f->nonextcp && m->noprevcp ) { + /* Remove zero length splines too */ + if ( s==first ) first = NULL; + f->next = n; + f->nextcp = m->nextcp; + f->nonextcp = m->nonextcp; + f->nextcpdef = m->nextcpdef; + n->from = f; + if ( f->isintersection ) + ILRemoveSplineFrom(sc,ilist,&f->me,s); + if ( f==m ) { + SplinePointListFree(spl); + if ( prev==NULL ) + base = next; + else + prev->next = next; + spl=NULL; + break; + } + SplineFree(s); + SplinePointFree(m); + if ( m==spl->first ) spl->first = f; + if ( m==spl->last ) spl->last = f; + } + } + if ( spl!=NULL ) + prev = spl; + } +return(base); +} + +#ifdef DEBUG +static void ShowIntersections(IntersectionList *ilist) { + IntersectionList *il; for ( il=ilist; il!=NULL; il=il->next ) { + printf( "Inter=(%g,%g)\n", il->intersection.x, il->intersection.y ); + { SplineList *sl; printf(" --\n" ); + for ( sl=il->splines; sl!=NULL; sl=sl->next ) { + if ( sl->spline->from->me.x==ilist->intersection.x && sl->spline->from->me.y==ilist->intersection.y ) + printf( "\t-> (%g,%g)", sl->spline->to->me.x, sl->spline->to->me.y ); + else + printf( "\t-> (%g,%g)", sl->spline->from->me.x, sl->spline->from->me.y ); + printf( "%s%s\n", sl->spline->isneeded?" needed":"", sl->spline->isunneeded?" un":"" ); + } + }}} +#endif + +/* Various operations that could be tried to make life easier: + Round to int + Insert extreme points + bring points that are close together on top of one another + ?Correct Direction? But that alters semantics +*/ +SplineSet *SplineSetRemoveOverlap(SplineChar *sc, SplineSet *base,enum overlap_type ot) { + SplineSet *needed, *tbase, *new, *next; + IntersectionList *ilist; + int changed = false; + SplineSet *open; + + SplineSetsUntick(base); + + tbase = base; + /*tbase = SplineCharSimplify(sc,tbase,sf_cleanup,1.0/64.0,0);*/ + open = SplineSetsExtractOpen(&tbase); + base = tbase; + if ( ot==over_findinter ) { + ilist = SplineSetFindIntersections(sc,base); + ILFree(ilist); + needed = base; + } else { + SplineSetsRound2Sixtyfourths(base); + base = SplineCharRemoveTiny(sc,base); + ilist = SplineSetFindIntersections(sc,base); + base = RemoveBacktracks(sc,base,ilist); + SplineSetFindNeeded(sc,base,ot); + RemoveDuplicates(ilist); + CleanupNeededUn(sc,base,ilist); +#ifdef DEBUG + ShowIntersections(ilist); +#endif + SSValidate(sc,base); + base = SSRemoveAllUnneeded(sc,base,ilist); +#ifdef DEBUG + ShowIntersections(ilist); +#endif + SSValidate(sc,base); + tbase = base; + needed = SSRemoveAllNeeded(sc,&tbase,ilist); + base = tbase; + /*SSValidate(sc,base);*/ + ILDisconnect(ilist); + ILFreeUnusedSplines(sc,ilist); + new = SSRebuild(sc,ilist); + + /* Here all splines will be either used or freed, but the old SS headers */ + /* will still exist */ + while ( base!=NULL ) { + next = base->next; + chunkfree(base,sizeof(SplinePointList)); + base = next; + } + ILFree(ilist); + + if ( needed==NULL ) + needed=new; + else if ( needed!=NULL ) { + for ( next=needed; next->next!=NULL; next = next->next ); + next->next = new; + } + SplineSetsCorrect(needed,&changed); /* Make sure it's all pointing the right way */ + } + if ( open==NULL ) + open=needed; + else if ( needed!=NULL ) { + for ( next=open; next->next!=NULL; next = next->next ); + next->next = needed; + } +return( open ); +} diff --git a/fontforge/splinerefigure.c b/fontforge/splinerefigure.c new file mode 100644 index 00000000..1cbede8b --- /dev/null +++ b/fontforge/splinerefigure.c @@ -0,0 +1,98 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include "splinefont.h" + +/* The slight errors introduced by the optimizer turn out to have nasty */ +/* side effects. An error on the order of 7e-8 in splines[1].b caused */ +/* the rasterizer to have kaniptions */ +void SplineRefigure3(Spline *spline) { + SplinePoint *from = spline->from, *to = spline->to; + Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; + +#ifdef DEBUG + if ( RealNear(from->me.x,to->me.x) && RealNear(from->me.y,to->me.y)) + GDrawIError("Zero length spline created"); +#endif + xsp->d = from->me.x; ysp->d = from->me.y; + if ( from->nonextcp ) from->nextcp = from->me; + else if ( from->nextcp.x==from->me.x && from->nextcp.y == from->me.y ) from->nonextcp = true; + if ( to->noprevcp ) to->prevcp = to->me; + else if ( to->prevcp.x==to->me.x && to->prevcp.y == to->me.y ) to->noprevcp = true; + if ( from->nonextcp && to->noprevcp ) { + spline->islinear = true; + xsp->c = to->me.x-from->me.x; + ysp->c = to->me.y-from->me.y; + xsp->a = xsp->b = 0; + ysp->a = ysp->b = 0; + } else { + /* from p. 393 (Operator Details, curveto) Postscript Lang. Ref. Man. (Red book) */ + xsp->c = 3*(from->nextcp.x-from->me.x); + ysp->c = 3*(from->nextcp.y-from->me.y); + xsp->b = 3*(to->prevcp.x-from->nextcp.x)-xsp->c; + ysp->b = 3*(to->prevcp.y-from->nextcp.y)-ysp->c; + xsp->a = to->me.x-from->me.x-xsp->c-xsp->b; + ysp->a = to->me.y-from->me.y-ysp->c-ysp->b; + if ( RealNear(xsp->c,0)) xsp->c=0; + if ( RealNear(ysp->c,0)) ysp->c=0; + if ( RealNear(xsp->b,0)) xsp->b=0; + if ( RealNear(ysp->b,0)) ysp->b=0; + if ( RealNear(xsp->a,0)) xsp->a=0; + if ( RealNear(ysp->a,0)) ysp->a=0; + spline->islinear = false; + if ( ysp->a==0 && xsp->a==0 && ysp->b==0 && xsp->b==0 ) + spline->islinear = true; /* This seems extremely unlikely... */ + } + if ( isnan(ysp->a) || isnan(xsp->a) ) + GDrawIError("NaN value in spline creation"); + LinearApproxFree(spline->approx); + spline->approx = NULL; + spline->knowncurved = false; + spline->knownlinear = spline->islinear; + SplineIsLinear(spline); + spline->isquadratic = false; + if ( !spline->knownlinear && xsp->a==0 && ysp->a==0 ) + spline->isquadratic = true; /* Only likely if we read in a TTF */ + spline->order2 = false; + +#if 0 + _SplineRefigure3(&s); +# define RealNear(a,b) ((a)==(b)) + + if ( !RealNear(spline->splines[0].a,s.splines[0].a) || + !RealNear(spline->splines[0].b,s.splines[0].b) || + !RealNear(spline->splines[0].c,s.splines[0].c) || + !RealNear(spline->splines[0].d,s.splines[0].d) || + !RealNear(spline->splines[1].a,s.splines[1].a) || + !RealNear(spline->splines[1].b,s.splines[1].b) || + !RealNear(spline->splines[1].c,s.splines[1].c) || + !RealNear(spline->splines[1].d,s.splines[1].d) ) + fprintf( stderr, "error\n" ); +#endif +} diff --git a/fontforge/splinesave.c b/fontforge/splinesave.c new file mode 100644 index 00000000..34eadb84 --- /dev/null +++ b/fontforge/splinesave.c @@ -0,0 +1,2851 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include "splinefont.h" +#include "psfont.h" +#include +#include +#include +#include + +/* Let's talk about references. */ +/* If we are doing Type1 output, then the obvious way of doing them is seac */ +/* but that's so limitting. It only works for exactly two characters both */ +/* of which are in Adobe's Standard Enc. Only translations allowed. Only */ +/* one reference may be translated and the width of the char must match */ +/* that of the non-translated reference */ +/* The first extension we can make is to allow a single character reference */ +/* by making the other character be a space */ +/* But if we want to do more than that we must use subrs. If we have two */ +/* refs in subrs then we can do translations by preceding the subr calls by */ +/* appropriate rmovetos. Actually the specs say that only one rmoveto should */ +/* precede a path, so that means we can't allow the subroutines to position */ +/* themselves, they must just assume that they are called with the current */ +/* position correct for the first point. But then we need to know where the */ +/* first point should be placed, so we allocate a BasePoint to hold that info*/ +/* and store it into the "keys" array (which the subrs don't use). Similarly */ +/* we need to know where the subr will leave us, so we actually allocate 2 */ +/* BasePoints, one containing the start point, one the end point */ +/* But that's still not good enough, hints are defined in such a way that */ +/* they are not relocateable. So our subrs can't include any hint definitions*/ +/* (or if they do then that subr can't be translated at all). So hints must */ +/* be set outside the subrs, and the subrs can't be for chars that need hint */ +/* substitution. Unless... The subr will never be relocated. */ +/* So we generate two types of reference subrs, one containing no hints, the*/ +/* other containing all the hints, stems and flexes. The first type may be */ +/* translated, the second cannot */ +/* Type2 doesn't allow any seacs */ +/* So everything must go in subrs. We have a slightly different problem here:*/ +/* hintmasks need to know exactly how many stem hints there are in the char */ +/* so we can't include any hintmask operators inside a subr (unless we */ +/* guarantee that all invocations of that subr are done with the same number */ +/* of hints in the character). This again means that no char with hint subs- */ +/* titutions may be put in a subr. UNLESS all the other references in a */ +/* refering character contain no hints */ + +typedef struct growbuf { + unsigned char *pt; + unsigned char *base; + unsigned char *end; +} GrowBuf; + +static void GrowBuffer(GrowBuf *gb) { + if ( gb->base==NULL ) { + gb->base = gb->pt = galloc(200); + gb->end = gb->base + 200; + } else { + int len = (gb->end-gb->base) + 400; + int off = gb->pt-gb->base; + gb->base = grealloc(gb->base,len); + gb->end = gb->base + len; + gb->pt = gb->base+off; + } +} + +static int NumberHints(SplineChar *scs[MmMax], int instance_count) { + int i,j, cnt=-1; + StemInfo *s; + + for ( j=0; jhstem, i=0; s!=NULL; s=s->next ) { + if ( ihintnumber = i++; + else + s->hintnumber = -1; + } + for ( s=scs[j]->vstem; s!=NULL; s=s->next ) { + if ( ihintnumber = i++; + else + s->hintnumber = -1; + } + if ( cnt==-1 ) + cnt = i; + else if ( cnt!=i ) + GDrawIError("MM font with different hint counts"); + } +return( i ); +} + +void RefCharsFreeRef(RefChar *ref) { + RefChar *rnext; + + while ( ref!=NULL ) { + rnext = ref->next; + /* don't free the splines */ +#ifdef FONTFORGE_CONFIG_TYPE3 + free(ref->layers); +#endif + chunkfree(ref,sizeof(RefChar)); + ref = rnext; + } +} + +/* ************************************************************************** */ +/* ********************** Type1 PostScript CharStrings ********************** */ +/* ************************************************************************** */ + +struct mhlist { + uint8 mask[12]; + int subr; + struct mhlist *next; +}; + +struct hintdb { + uint8 mask[12]; + int cnt; /* number of hints */ + struct mhlist *sublist; + struct pschars *subrs; + /*SplineChar *sc;*/ + SplineChar **scs; + int instance_count; + unsigned int iscjk: 1; /* If cjk then don't do stem3 hints */ + /* Will be done with counters instead */ + /* actually, most of the time we can't use stem3s, only if those three*/ + /* stems are always active and there are no other stems !(h/v)hasoverlap*/ + unsigned int noconflicts: 1; + int cursub; /* Current subr number */ + BasePoint current; +}; + +static real myround( real pos, int round ) { + if ( round ) +return( rint( pos )); + else +return( rint( pos*100. )/100. ); +} + +static void AddNumber(GrowBuf *gb, real pos, int round) { + int dodiv = 0; + int val; + unsigned char *str; + + if ( gb->pt+8>=gb->end ) + GrowBuffer(gb); + + pos = rint(100*pos)/100; + + if ( !round && pos!=floor(pos)) { + pos *= 100; + dodiv = true; + } + str = gb->pt; + val = rint(pos); + if ( pos>=-107 && pos<=107 ) + *str++ = val+139; + else if ( pos>=108 && pos<=1131 ) { + val -= 108; + *str++ = (val>>8)+247; + *str++ = val&0xff; + } else if ( pos>=-1131 && pos<=-108 ) { + val = -val; + val -= 108; + *str++ = (val>>8)+251; + *str++ = val&0xff; + } else { + *str++ = '\377'; + *str++ = (val>>24)&0xff; + *str++ = (val>>16)&0xff; + *str++ = (val>>8)&0xff; + *str++ = val&0xff; + } + if ( dodiv ) { + *str++ = 100+139; /* 100 */ + *str++ = 12; /* div (byte1) */ + *str++ = 12; /* div (byte2) */ + } + gb->pt = str; +} + +/* When doing a multiple master font we have multiple instances of the same data */ +/* which must all be added, and then a call made to the appropriate blend routine */ +/* This is complicated because all the data may not fit on the stack so we */ +/* may need to make multiple calls */ +static void AddData(GrowBuf *gb, real data[MmMax][6], int instances, int num_coords, + int round) { + int allsame = true, alls[6]; + int i,j, chunk,min,max,subr; + + for ( j=0; jnum_coords ) max = num_coords; + while ( max-1>min && alls[max-1] ) + --max; + if ( max-min==5 ) max=min+4; + if ( minpt+1>=gb->end ) + GrowBuffer(gb); + *gb->pt++ = 10; /* callsubr */ + min = j; + } + } +} + +int CvtPsStem3(GrowBuf *gb, SplineChar *scs[MmMax], int instance_count, + int ishstem, int round) { + StemInfo *h1, *h2, *h3; + StemInfo _h1, _h2, _h3; + real data[MmMax][6]; + int i; + real off; + + for ( i=0; ihconflicts) || (!ishstem && scs[i]->vconflicts)) +return( false ); + h1 = ishstem ? scs[i]->hstem : scs[i]->vstem; + if ( h1==NULL || (h2 = h1->next)==NULL || (h3=h2->next)==NULL ) +return( false ); + if ( h3->next!=NULL ) +return( false ); + off = ishstem ? 0 : scs[i]->lsidebearing; + if ( h1->width<0 ) { + _h1 = *h1; + _h1.start += _h1.width; + _h1.width = -_h1.width; + h1 = &_h1; + } + if ( h2->width<0 ) { + _h2 = *h2; + _h2.start += _h2.width; + _h2.width = -_h2.width; + h2 = &_h2; + } + if ( h3->width<0 ) { + _h3 = *h3; + _h3.start += _h3.width; + _h3.width = -_h3.width; + h3 = &_h3; + } + + if ( h1->start>h2->start ) { + StemInfo *ht = h1; h1 = h2; h2 = ht; + } + if ( h1->start>h3->start ) { + StemInfo *ht = h1; h1 = h3; h3 = ht; + } + if ( h2->start>h3->start ) { + StemInfo *ht = h2; h2 = h3; h3 = ht; + } + if ( h1->width != h3->width ) +return( false ); + if ( (h2->start+h2->width/2) - (h1->start+h1->width/2) != + (h3->start+h3->width/2) - (h2->start+h2->width/2) ) +return( false ); + data[i][0] = h1->start-off; + data[i][1] = h1->width; + data[i][2] = h2->start-off; + data[i][3] = h2->width; + data[i][4] = h3->start-off; + data[i][5] = h3->width; + } + if ( gb==NULL ) +return( true ); + AddData(gb,data,instance_count,6,round); + if ( gb->pt+3>=gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 12; + *(gb->pt)++ = ishstem?2:1; /* h/v stem3 */ +return( true ); +} + +static void CvtPsHints(GrowBuf *gb, SplineChar *scs[MmMax], int instance_count, + int ishstem, int round, int iscjk, real *offsets ) { + StemInfo *hs[MmMax]; + real data[MmMax][6]; + int i; + real off; + + for ( i=0; ihstem : scs[i]->vstem; + + if ( hs[0]!=NULL && hs[0]->next!=NULL && hs[0]->next->next!=NULL && + hs[0]->next->next->next==NULL ) + if ( !iscjk && CvtPsStem3(gb, scs, instance_count, ishstem, round)) +return; + + while ( hs[0]!=NULL ) { + for ( i=0; ilsidebearing; + if ( hs[i]->backwards ) { + data[i][0] = hs[i]->start-off+hs[i]->width; + data[i][1] = -hs[i]->width; + } else { + data[i][0] = hs[i]->start-off; + data[i][1] = hs[i]->width; + } + } + AddData(gb,data,instance_count,2,round); + if ( gb->pt+1>=gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = ishstem?1:3; /* h/v stem */ + for ( i=0; inext; + } +} + +static void CvtPsMasked(GrowBuf *gb,SplineChar *scs[MmMax], int instance_count, + int ishstem, int round, uint8 mask[12] ) { + StemInfo *hs[MmMax]; + real data[MmMax][6], off; + int i; + + for ( i=0; ihstem : scs[i]->vstem; + + while ( hs[0]!=NULL ) { + if ( hs[0]->hintnumber!=-1 && + (mask[hs[0]->hintnumber>>3]&(0x80>>(hs[0]->hintnumber&7))) ) { + for ( i=0; ilsidebearing; + if ( hs[i]->backwards ) { + data[i][0] = hs[i]->start-off+hs[i]->width; + data[i][1] = -hs[i]->width; + } else { + data[i][0] = hs[i]->start-off; + data[i][1] = hs[i]->width; + } + } + AddData(gb,data,instance_count,2,round); + if ( gb->pt+1>=gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = ishstem?1:3; /* h/v stem */ + } + for ( i=0; inext; + } +} + +static int FigureCounters(StemInfo *stems,real *hints,int base,real offset, + int countermask_cnt, HintMask *counters) { + StemInfo *h; + int pos = base+1, subbase, cnt=0; + real last = offset; + int i; + + for ( i=0; inext ) { + if ( h->hintnumber!=-1 && (counters[i][h->hintnumber>>3]&(0x80>>(h->hintnumber&7))) ) { + hints[pos++] = h->start-last; + hints[pos++] = h->width; + last = h->start+h->width; + } + } + if ( pos!=subbase ) { + hints[pos-2] += hints[pos-1]; + hints[pos-1] = -hints[pos-1]; /* Mark end of group */ + last = offset; /* Each new group starts at 0 or lbearing */ + ++cnt; + } + } + hints[base] = cnt; +return( pos ); +} + +static void CounterHints1(GrowBuf *gb, SplineChar *sc, int round) { + real hints[HntMax*2+2]; /* At most 96 hints, no hint used more than once */ + int pos, i, j; + + if ( sc->countermask_cnt==0 ) +return; + + pos = FigureCounters(sc->hstem,hints,0,0,sc->countermask_cnt, + sc->countermasks); + /* Adobe's docs (T1_Supp.pdf, section 2.4) say these should be offset from*/ + /* the left side bearing. The example (T1_Supp.pdf, 2.6) shows them offset*/ + /* from 0. I've no idea which is correct, so I'll follow the words, think-*/ + /* that the lbearing might have been set to 0 even though it shouldn't */ + /* have been. */ + pos = FigureCounters(sc->vstem,hints,pos,sc->lsidebearing,sc->countermask_cnt, + sc->countermasks); + if ( pos==2 ) /* => no counters, one byte to say 0 h counters, one byte for 0 v counters */ +return; + for ( i=pos; i>22; i-=22 ) { + for ( j=i-22; jpt+2>=gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 12; + *(gb->pt)++ = 16; /* CallOtherSubr */ + } + for ( j=0; jpt+2>=gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 12; + *(gb->pt)++ = 16; /* CallOtherSubr */ +} + +static void SubrsCheck(struct pschars *subrs) { + /* 1 3 callother pop callsubr */ + + if ( subrs->next>=subrs->cnt ) { + subrs->cnt += 100; + subrs->values = grealloc(subrs->values,subrs->cnt*sizeof(uint8 *)); + subrs->lens = grealloc(subrs->lens,subrs->cnt*sizeof(int)); + if ( subrs->keys!=NULL ) { + int i; + subrs->keys = grealloc(subrs->keys,subrs->cnt*sizeof(char *)); + for ( i=subrs->cnt-100; icnt; ++i ) + subrs->keys[i] = NULL; + } + } +} + +/* Does the hintmask we need already exist in a subroutine? if so return that */ +/* subr. Else build a new subr with the hints we need. Note we can only use */ +/* *stem3 commands if there are no conflicts in that coordinate, it isn't cjk*/ +/* and all the other conditions are met */ +static int FindOrBuildHintSubr(struct hintdb *hdb, uint8 mask[12], int round) { + struct mhlist *mh; + GrowBuf gb; + int i; + + for ( mh=hdb->sublist; mh!=NULL; mh=mh->next ) { + if ( memcmp(mask,mh->mask,sizeof(mask))==0 ) +return( mh->subr ); + /* If we find a subr for which we have all the bits set (with extras */ + /* since we didn't match) then it is safe to replace the old subr */ + /* with ours. This will save use one subr entry, and maybe a call */ + for ( i=0; i<12; ++i ) + if ( (mh->mask[i]&mask[i])!=mh->mask[i] ) + break; + if ( i==12 ) + break; + } + SubrsCheck(hdb->subrs); + + memset(&gb,0,sizeof(gb)); + if ( !hdb->scs[0]->hconflicts ) + CvtPsHints(&gb,hdb->scs,hdb->instance_count,true,round,hdb->iscjk,NULL); + else + CvtPsMasked(&gb,hdb->scs,hdb->instance_count,true,round,mask); + if ( !hdb->scs[0]->vconflicts ) + CvtPsHints(&gb,hdb->scs,hdb->instance_count,false,round,hdb->iscjk,NULL); + else + CvtPsMasked(&gb,hdb->scs,hdb->instance_count,false,round,mask); + if ( gb.pt+1 >= gb.end ) + GrowBuffer(&gb); + *gb.pt++ = 11; /* return */ + + /* Replace an old subroutine */ + if ( mh!=NULL ) { + free( hdb->subrs->values[mh->subr]); + hdb->subrs->values[mh->subr] = (uint8 *) copyn((char *) gb.base,gb.pt-gb.base); + hdb->subrs->lens[mh->subr] = gb.pt-gb.base; + } else { + hdb->subrs->values[hdb->subrs->next] = (uint8 *) copyn((char *) gb.base,gb.pt-gb.base); + hdb->subrs->lens[hdb->subrs->next] = gb.pt-gb.base; + + mh = gcalloc(1,sizeof(struct mhlist)); + memcpy(mh->mask,mask,sizeof(mh->mask)); + mh->subr = hdb->subrs->next++; + mh->next = hdb->sublist; + hdb->sublist = mh; + } + free(gb.base); + +return( mh->subr ); +} + +static int BuildTranslatedHintSubr(struct pschars *subrs, SplineChar *scs[MmMax], + RefChar *refs[MmMax], int instance_count, int round) { + GrowBuf gb; + real offsets[MmMax]; + SplineChar *rscs[MmMax]; + int j; + + memset(&gb,0,sizeof(gb)); + for ( j=0; jtransform[5]; + rscs[j] = refs[j]->sc; + } + CvtPsHints(&gb,rscs,instance_count,true,round,true,offsets); + /* I claim to be cjk to avoid getting h/vstem3 */ + /* which are illegal in hint replacement */ + for ( j=0; jlsidebearing-refs[j]->transform[4]; + CvtPsHints(&gb,rscs,instance_count,false,round,true,offsets); + if ( gb.pt+1 >= gb.end ) + GrowBuffer(&gb); + *gb.pt++ = 11; /* return */ + + SubrsCheck(subrs); + subrs->values[subrs->next] = (uint8 *) copyn((char *) gb.base,gb.pt-gb.base); + subrs->lens[subrs->next] = gb.pt-gb.base; + free(gb.base); +return( subrs->next++ ); +} + +static void HintSetup(GrowBuf *gb,struct hintdb *hdb, SplinePoint *to, + int round ) { + int s; + int i; + + if ( to->hintmask==NULL ) +return; + if ( hdb->scs[0]->hstem==NULL && hdb->scs[0]->vstem==NULL ) /* Hints are turned off. Hint mask still remains though */ +return; + for ( i=0; ihintmask[i]!=0 ) + break; + if ( i==HntMax/8 ) /* Empty mask */ +return; + + s = FindOrBuildHintSubr(hdb,*to->hintmask,round); + memcpy(hdb->mask,*to->hintmask,sizeof(HintMask)); + if ( hdb->cursub == s ) { /* If we were able to redefine */ +return; /* the subroutine currently */ + } /* active then we are done */ + + AddNumber(gb,s,round); + AddNumber(gb,4,round); /* subr 4 is (my) magic subr that does the hint subs call */ + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *gb->pt++ = 10; /* callsubr */ + hdb->cursub = s; +} + +static void _moveto(GrowBuf *gb,BasePoint *current,BasePoint *to,int instance_count, + int line, int round, struct hintdb *hdb) { + BasePoint temp[MmMax]; + int i, samex, samey; + real data[MmMax][6]; + + if ( gb->pt+18 >= gb->end ) + GrowBuffer(gb); + +#if 0 + if ( current->x==to->x && current->y==to->y ) { + /* we're already here */ /* Yes, but sometimes a move is required anyway */ + } else +#endif + for ( i=0; ipt)++ = line ? 7 : 4; /* v move/line to */ + } else if ( samey ) { + for ( i=0; ipt)++ = line ? 6 : 22; /* h move/line to */ + } else { + for ( i=0; ipt)++ = line ? 5 : 21; /* r move/line to */ + } + for ( i=0; ito,round); + for ( i=0; ito->me; + _moveto(gb,current,to,instance_count,line,round,hdb); +} + +static void splmoveto(GrowBuf *gb,BasePoint *current,SplineSet *spl[MmMax], + int instance_count, int line, int round, struct hintdb *hdb) { + BasePoint to[MmMax]; + int i; + + if ( hdb!=NULL ) HintSetup(gb,hdb,spl[0]->first,round); + for ( i=0; ifirst->me; + _moveto(gb,current,to,instance_count,line,round,hdb); +} + +static void refmoveto(GrowBuf *gb,BasePoint *current,BasePoint startstop[MmMax*2], + int instance_count, int line, int round, struct hintdb *hdb, RefChar *refs[MmMax]) { + BasePoint to[MmMax]; + int i; + + for ( i=0; itransform[4]; + to[i].y += refs[i]->transform[5]; + } + } + _moveto(gb,current,to,instance_count,line,round,hdb); +} + +static void curveto(GrowBuf *gb,BasePoint *current,Spline *splines[MmMax],int instance_count, + int round, struct hintdb *hdb) { + BasePoint temp1[MmMax], temp2[MmMax], temp3[MmMax], *c0[MmMax], *c1[MmMax], *s1[MmMax]; + real data[MmMax][6]; + int i, op, opcnt; + int vh, hv; + + if ( hdb!=NULL ) HintSetup(gb,hdb,splines[0]->to,round); + + if ( gb->pt+50 >= gb->end ) + GrowBuffer(gb); + + vh = hv = true; + for ( i=0; ifrom->nextcp; + c1[i] = &splines[i]->to->prevcp; + s1[i] = &splines[i]->to->me; + temp1[i].x = myround(c0[i]->x,round); + temp1[i].y = myround(c0[i]->y,round); + c0[i] = &temp1[i]; + temp2[i].x = myround(c1[i]->x,round); + temp2[i].y = myround(c1[i]->y,round); + c1[i] = &temp2[i]; + temp3[i].x = myround(s1[i]->x,round); + temp3[i].y = myround(s1[i]->y,round); + s1[i] = &temp3[i]; + if ( current[i].x != c0[i]->x || c1[i]->y!=s1[i]->y ) vh = false; + if ( current[i].y != c0[i]->y || c1[i]->x!=s1[i]->x ) hv = false; + } + if ( vh ) { + for ( i=0; iy-current[i].y; + data[i][1] = c1[i]->x-c0[i]->x; + data[i][2] = c1[i]->y-c0[i]->y; + data[i][3] = s1[i]->x-c1[i]->x; + } + op = 30; /* vhcurveto */ + opcnt = 4; + } else if ( hv ) { + for ( i=0; ix-current[i].x; + data[i][1] = c1[i]->x-c0[i]->x; + data[i][2] = c1[i]->y-c0[i]->y; + data[i][3] = s1[i]->y-c1[i]->y; + } + op = 31; /* hvcurveto */ + opcnt = 4; + } else { + for ( i=0; ix-current[i].x; + data[i][1] = c0[i]->y-current[i].y; + data[i][2] = c1[i]->x-c0[i]->x; + data[i][3] = c1[i]->y-c0[i]->y; + data[i][4] = s1[i]->x-c1[i]->x; + data[i][5] = s1[i]->y-c1[i]->y; + } + op = 8; /* rrcurveto */ + opcnt=6; + } + AddData(gb,data,instance_count,opcnt,false); + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = op; + + for ( i=0; ito->flexx && !splines[i]->to->flexy ) +return( false ); + if (( x && splines[i]->to->flexy ) || ( y && splines[i]->to->flexx )) +return( false ); + x = splines[i]->to->flexx; + y = splines[i]->to->flexy; + } +return( true ); +} + +static void flexto(GrowBuf *gb,BasePoint current[MmMax],Spline *pspline[MmMax], + int instance_count,int round, struct hintdb *hdb) { + BasePoint *c0, *c1, *mid, *end; + Spline *nspline; + BasePoint offsets[MmMax][8]; + int i,j; + BasePoint temp1, temp2, temp3, temp; + real data[MmMax][6]; + + for ( j=0; jfrom->nextcp; + c1 = &pspline[j]->to->prevcp; + mid = &pspline[j]->to->me; + + temp1.x = myround(c0->x,round); + temp1.y = myround(c0->y,round); + c0 = &temp1; + temp2.x = myround(c1->x,round); + temp2.y = myround(c1->y,round); + c1 = &temp2; + temp.x = myround(mid->x,round); + temp.y = myround(mid->y,round); + mid = &temp; +/* reference point is same level as current point */ + if ( current[j].y==pspline[j]->to->next->to->me.y ) { + offsets[j][0].x = mid->x-current[j].x; offsets[j][0].y = 0; + offsets[j][1].x = c0->x-mid->x; offsets[j][1].y = c0->y-current[j].y; + } else { + offsets[j][0].x = 0; offsets[j][0].y = mid->y-current[j].y; + offsets[j][1].x = c0->x-current[j].x; offsets[j][1].y = c0->y-mid->y; + } + offsets[j][2].x = c1->x-c0->x; offsets[j][2].y = c1->y-c0->y; + offsets[j][3].x = mid->x-c1->x; offsets[j][3].y = mid->y-c1->y; + nspline = pspline[j]->to->next; + c0 = &nspline->from->nextcp; + c1 = &nspline->to->prevcp; + end = &nspline->to->me; + + temp1.x = myround(c0->x,round); + temp1.y = myround(c0->y,round); + c0 = &temp1; + temp2.x = myround(c1->x,round); + temp2.y = myround(c1->y,round); + c1 = &temp2; + temp3.x = myround(end->x,round); + temp3.y = myround(end->y,round); + end = &temp3; + + offsets[j][4].x = c0->x-mid->x; offsets[j][4].y = c0->y-mid->y; + offsets[j][5].x = c1->x-c0->x; offsets[j][5].y = c1->y-c0->y; + offsets[j][6].x = end->x-c1->x; offsets[j][6].y = end->y-c1->y; + offsets[j][7].x = end->x; offsets[j][7].y = end->y; + current[j] = *end; + } + + if ( hdb!=NULL ) + HintSetup(gb,hdb,pspline[0]->to->next->to,round); + + if ( gb->pt+2 >= gb->end ) + GrowBuffer(gb); + + *(gb->pt)++ = 1+139; /* 1 */ + *(gb->pt)++ = 10; /* callsubr */ + for ( i=0; i<7; ++i ) { + if ( gb->pt+20 >= gb->end ) + GrowBuffer(gb); + for ( j=0; jpt)++ = 21; /* rmoveto */ + *(gb->pt)++ = 2+139; /* 2 */ + *(gb->pt)++ = 10; /* callsubr */ + } + if ( gb->pt+20 >= gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 50+139; /* 50, .50 pixels */ + for ( j=0; jpt)++ = 0+139; /* 0 */ + *(gb->pt)++ = 10; /* callsubr */ + + *current = *end; +} + +static void CvtPsSplineSet(GrowBuf *gb, SplineChar *scs[MmMax], int instance_count, + BasePoint current[MmMax], + int round, struct hintdb *hdb, BasePoint *start, int is_order2 ) { + Spline *spline[MmMax], *first; + SplinePointList *spl[MmMax]; + SplinePointList temp[MmMax], *freeme=NULL; + int init=true; + int i; + + if ( is_order2 ) { + freeme = spl[0] = SplineSetsPSApprox(scs[0]->layers[ly_fore].splines); + instance_count = 1; + } else { + for ( i=0; ilayers[ly_fore].splines; + } + while ( spl[0]!=NULL ) { + first = NULL; + for ( i=0; ifirst->flexy || spl[0]->first->flexx ) { + /* can't handle a flex (mid) point as the first point. rotate the */ + /* list by one, this is possible because only closed paths have */ + /* points marked as flex, and because we can't have two flex mid- */ + /* points in a row */ + for ( i = 0; ifirst->next->to; + spl[i] = &temp[i]; + } + } + if ( start==NULL || !init ) + splmoveto(gb,current,spl,instance_count,false,round,hdb); + else { + for ( i=0; ifirst->me; + init = false; + } + for ( i=0; ifirst->next; + while ( spline[0]!=NULL && spline[0]!=first ) { + if ( first==NULL ) first = spline[0]; + if ( SplinesAreFlexible(spline,instance_count) ) { + flexto(gb,current,spline,instance_count,round,hdb); /* does two adjacent splines */ + for ( i=0; ito->next; + } else if ( spline[0]->knownlinear && spline[0]->to==spl[0]->first ) { + /* We can finish this off with the closepath */ + break; + } else if ( spline[0]->knownlinear ) + moveto(gb,current,spline,instance_count,true,round,hdb); + else + curveto(gb,current,spline,instance_count,round,hdb); + for ( i=0; ito->next; + } + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 9; /* closepath */ + for ( i=0; inext; + } + } + SplinePointListFree(freeme); +} + +static void CvtPsRSplineSet(GrowBuf *gb, SplineChar *scs[MmMax], int instance_count, + BasePoint *current, + int round, struct hintdb *hdb, BasePoint *startend, int is_order2 ) { + RefChar *refs[MmMax]; + SplineChar *rscs[MmMax]; + int i; + + for ( i=0; ilayers[ly_fore].refs; + while ( refs[0]!=NULL ) { + for ( i=0; isc; + refs[i] = refs[i]->next; + } + CvtPsSplineSet(gb,rscs,instance_count,current,round,hdb,startend,scs[0]->parent->order2); + } +} + +static RefChar *IsRefable(RefChar *ref, int isps, real transform[6], RefChar *sofar) { + real trans[6]; + RefChar *sub; +#ifdef FONTFORGE_CONFIG_TYPE3 + struct reflayer *rl; +#endif + + trans[0] = ref->transform[0]*transform[0] + + ref->transform[1]*transform[2]; + trans[1] = ref->transform[0]*transform[1] + + ref->transform[1]*transform[3]; + trans[2] = ref->transform[2]*transform[0] + + ref->transform[3]*transform[2]; + trans[3] = ref->transform[2]*transform[1] + + ref->transform[3]*transform[3]; + trans[4] = ref->transform[4]*transform[0] + + ref->transform[5]*transform[2] + + transform[4]; + trans[5] = ref->transform[4]*transform[1] + + ref->transform[5]*transform[3] + + transform[5]; + + if (( isps==1 && ref->adobe_enc!=-1 ) || + (/*isps!=1 &&*/ (ref->sc->layers[ly_fore].splines!=NULL || ref->sc->layers[ly_fore].refs==NULL))) { + /* If we're in postscript mode and the character we are refering to */ + /* has an adobe encoding then we are done. */ + /* In TrueType mode, if the character has no refs itself then we are */ + /* done, but if it has splines as well as refs we are also done */ + /* because it will have to be dumped out as splines */ + /* Type2 PS (opentype) is the same as truetype here */ + /* Now that I allow refs to be subrs in type1, it also uses the ttf test */ + sub = RefCharCreate(); +#ifdef FONTFORGE_CONFIG_TYPE3 + rl = sub->layers; + *sub = *ref; + sub->layers = rl; + *rl = ref->layers[0]; +#else + *sub = *ref; +#endif + sub->next = sofar; + /*sub->layers[0].splines = NULL;*/ + memcpy(sub->transform,trans,sizeof(trans)); +return( sub ); + } else if ( /* isps &&*/ ( ref->sc->layers[ly_fore].refs==NULL || ref->sc->layers[ly_fore].splines!=NULL) ) { + RefCharsFreeRef(sofar); +return( NULL ); + } + for ( sub=ref->sc->layers[ly_fore].refs; sub!=NULL; sub=sub->next ) { + sofar = IsRefable(sub,isps,trans, sofar); + if ( sofar==NULL ) +return( NULL ); + } +return( sofar ); +} + +static RefChar *reverserefs(RefChar *cur) { + RefChar *n, *p; + + p = NULL; + while ( cur!=NULL ) { + n = cur->next; + cur->next = p; + p = cur; + cur = n; + } +return( p ); +} + +/* Postscript can only make refs to things which are in the Adobe encoding */ +/* Suppose Cyrillic A with breve consists of two refs, one to cyrillic A and */ +/* one to nospacebreve (neither in adobe). But if cyrillic A was just a ref */ +/* to A, and if nospacebreve was a ref to breve (both in adobe), then by going*/ +/* one more level of indirection we can use refs in the font. */ +/* Apple's docs say TrueType only allows refs to things which are themselves */ +/* simple (ie. contain no refs). So if we use the above example we'd still */ +/* end up with A and breve. I'm told that modern TT doesn't have this */ +/* restriction, but it won't hurt to do things this way */ +/* They way I do Type2 postscript I can have as many refs as I like, they */ +/* can only have translations (no scale, skew, rotation), they can't be */ +/* refs themselves. They can't use hintmask commands inside */ +/* I'm going to do something similar for Type1s now (use seac if I can, else */ +/* use a subr if I can) */ +RefChar *SCCanonicalRefs(SplineChar *sc, int isps) { + RefChar *ret = NULL, *ref; + real noop[6]; + + /* Neither allows mixing splines and refs */ + if ( sc->layers[ly_fore].splines!=NULL ) +return(NULL); + noop[0] = noop[3] = 1.0; noop[2]=noop[1]=noop[4]=noop[5] = 0; + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + ret = IsRefable(ref,isps,noop, ret); + if ( ret==NULL ) +return( NULL ); + } + + /* Postscript can only reference things which are translations, no other */ + /* transformations are allowed. Check for that too. */ + /* My current approach to Type2 fonts requires that the refs have no */ + /* conflicts */ + /* TrueType can only reference things where the elements of the transform-*/ + /* ation matrix are less than 2 (and arbetrary translations) */ + for ( ref=ret; ref!=NULL; ref=ref->next ) { + if ( isps ) { + if ( ref->transform[0]!=1 || ref->transform[3]!=1 || + ref->transform[1]!=0 || ref->transform[2]!=0 ) + break; + if ( isps==2 && (/*ref->sc->hconflicts || ref->sc->vconflicts ||*/ + ref->sc->lsidebearing == 0x7fff)) + break; + } else { + if ( ref->transform[0]>=2 || ref->transform[0]<=-2 || + ref->transform[1]>=2 || ref->transform[1]<=-2 || + ref->transform[2]>=2 || ref->transform[2]<=-2 || + ref->transform[3]>=2 || ref->transform[3]<=-2 ) + break; + } + } + if ( ref!=NULL ) { + RefCharsFreeRef(ret); +return( NULL ); + } +return( reverserefs(ret) ); +} + +static int TrySubrRefs(GrowBuf *gb, struct pschars *subrs, SplineChar *scs[MmMax], + int instance_count, int round, int self) { + RefChar *refs[MmMax], rtemp[MmMax]; + BasePoint current[MmMax], *bp; + DBounds sb, rb; + int j; + + for ( j=0; jlayers[ly_fore].refs; + for ( r=scs[j]->layers[ly_fore].refs; r!=NULL; r=r->next ) { + if ( r->sc->hconflicts || r->sc->vconflicts || r->sc->anyflexes ) + SplineCharFindBounds(r->sc,&rb); + if ( r->sc->ttf_glyph==0x7fff || + (( r->sc->hconflicts || r->sc->vconflicts || r->sc->anyflexes ) && + (r->transform[4]!=0 || r->transform[5]!=0 || + current[j].x!=rb.minx))) { +return( false ); + } + } + } + } + + /* ok, we should be able to turn it into a series of subr calls */ + /* we need to establish hints for each subr (and remember they may be */ + /* translated from those normally used by the character) */ + /* Exception: If a reffed char has hint conflicts (and it isn't translated) */ + /* then its hints are built in */ + /* Then we need to do an rmoveto to do the appropriate translation */ + while ( refs[0]!=NULL ) { + if ( refs[0]->sc->hconflicts || refs[0]->sc->vconflicts || refs[0]->sc->anyflexes ) + /* Hints already done */; + else if ( refs[0]->sc->hstem!=NULL || refs[0]->sc->vstem!=NULL ) { + int s = BuildTranslatedHintSubr(subrs,scs,refs,instance_count,round); + AddNumber(gb,s,round); + AddNumber(gb,4,round); /* subr 4 is (my) magic subr that does the hint subs call */ + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *gb->pt++ = 10; /* callsubr */ + + } + if ( gb->pt+20>=gb->end ) + GrowBuffer(gb); + bp = (BasePoint *) (subrs->keys[refs[0]->sc->ttf_glyph]); + refmoveto(gb,current,bp,instance_count,false,round,NULL,refs); + AddNumber(gb,refs[0]->sc->ttf_glyph,round); + *gb->pt++ = 10; /* callsubr */ + for ( j=0; jtransform[4] + bp[2*j+1].x; current[j].y = refs[j]->transform[5]+bp[2*j+1].y; + refs[j] = refs[j]->next; + } + } + +return( true ); +} + +static int IsPSRefable(SplineChar *sc) { + RefChar *ref; + + if ( sc->layers[ly_fore].refs==NULL || sc->layers[ly_fore].splines!=NULL ) +return( false ); + + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]!=1 || + ref->transform[1]!=0 || + ref->transform[2]!=0 || + ref->transform[3]!=1 ) +return( false ); + } +return( true ); +} + +static RefChar *RefFindAdobe(RefChar *r, RefChar *t) { + *t = *r; + while ( t->adobe_enc==-1 && t->sc->layers[ly_fore].refs!=NULL && t->sc->layers[ly_fore].refs->next==NULL && + t->sc->layers[ly_fore].refs->transform[0]==1.0 && + t->sc->layers[ly_fore].refs->transform[1]==0.0 && + t->sc->layers[ly_fore].refs->transform[2]==0.0 && + t->sc->layers[ly_fore].refs->transform[3]==1.0 ) { + t->transform[4] += t->sc->layers[ly_fore].refs->transform[4]; + t->transform[5] += t->sc->layers[ly_fore].refs->transform[5]; + t->adobe_enc = t->sc->layers[ly_fore].refs->adobe_enc; + t->local_enc = t->sc->layers[ly_fore].refs->local_enc; + t->sc = t->sc->layers[ly_fore].refs->sc; + } +return( t ); +} + +static int IsSeacable(GrowBuf *gb, struct pschars *subrs, SplineChar *scs[MmMax], + int instance_count, int round, int iscjk) { + /* can be at most two chars in a seac (actually must be exactly 2, but */ + /* I'll put in a space if there's only one */ + RefChar *r1, *r2, *rt, *refs; + RefChar space, t1, t2; + DBounds b; + int i, j, swap; + real data[MmMax][6]; + + if ( scs[0]->ttf_glyph!=0x7fff ) +return( TrySubrRefs(gb,subrs,scs,instance_count,round,true)); + + for ( j=0 ; jlayers[ly_fore].refs; + if ( refs==NULL ) +return( false ); + + r1 = refs; + if ((r2 = r1->next)==NULL ) { + r2 = &space; + memset(r2,'\0',sizeof(space)); + space.adobe_enc = ' '; + space.transform[0] = space.transform[3] = 1.0; + for ( i=0; iparent->charcnt; ++i ) + if ( scs[0]->parent->chars[i]!=NULL && + strcmp(scs[0]->parent->chars[i]->name,"space")==0 ) + break; + if ( i==scs[0]->parent->charcnt ) + r2 = NULL; /* No space???? */ + else { + space.sc = scs[0]->parent->chars[i]; + if ( space.sc->layers[ly_fore].splines!=NULL || space.sc->layers[ly_fore].refs!=NULL ) + r2 = NULL; + } + } else if ( r2->next!=NULL ) + r2 = NULL; + + /* check for something like "AcyrillicBreve" which has a ref to Acyril */ + /* (which doesn't have an adobe enc) which in turn has a ref to A (which */ + /* does) */ + if ( r2!=NULL ) { + if ( r1->adobe_enc==-1 ) + r1 = RefFindAdobe(r1,&t1); + if ( r2->adobe_enc==-1 ) + r2 = RefFindAdobe(r2,&t2); + } + +/* CID fonts have no encodings. So we can't use seac to reference characters */ +/* in them. The other requirements are just those of seac */ + if ( (iscjk&0x100) || r2==NULL || + r1->adobe_enc==-1 || + r2->adobe_enc==-1 || + ((r1->transform[4]!=0 || r1->transform[5]!=0 || r1->sc->width!=scs[0]->width ) && + (r2->transform[4]!=0 || r2->transform[5]!=0 || r2->sc->width!=scs[0]->width)) ) +return( TrySubrRefs(gb,subrs,scs,instance_count,round,false)); + + swap = false; + if ( r1->transform[4]!=0 || r1->transform[5]!=0 ) { + rt = r1; r1 = r2; r2 = rt; + swap = !swap; + } + if ( r1->sc->width!=scs[0]->width && r2->sc->width==scs[0]->width && + r2->transform[4]==0 && r2->transform[5]==0 ) { + rt = r1; r1 = r2; r2 = rt; + swap = !swap; + } + if ( r1->sc->width!=scs[0]->width || r1->transform[4]!=0 || r1->transform[5]!=0 ) +return( false ); + + for ( j=0; jparent->chars[r2->sc->enc]; + RefChar *r3, t3; + + SplineCharFindBounds(r2sc,&b); + if ( scs[j]->layers[ly_fore].refs!=NULL && scs[j]->layers[ly_fore].refs->next==NULL ) + r3 = r2; /* Space, not offset */ + else if ( swap ) + r3 = RefFindAdobe(scs[j]->layers[ly_fore].refs,&t3); + else + r3 = RefFindAdobe(scs[j]->layers[ly_fore].refs->next,&t3); + + b.minx = myround(b.minx,round); + data[j][0] = b.minx; + data[j][1] = r3->transform[4] + b.minx-scs[j]->lsidebearing; + data[j][2] = r3->transform[5]; + } + AddData(gb,data,instance_count,3,round); + AddNumber(gb,r1->adobe_enc,round); + AddNumber(gb,r2->adobe_enc,round); + if ( gb->pt+2>gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 12; + *(gb->pt)++ = 6; /* seac 12,6 */ + +return( true ); +} + +static int _SCNeedsSubsPts(SplineChar *sc) { + RefChar *ref; + + if ( sc->hstem==NULL && sc->vstem==NULL ) +return( false ); + + if ( sc->layers[ly_fore].splines!=NULL ) +return( sc->layers[ly_fore].splines->first->hintmask==NULL ); + + for ( ref = sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + if ( ref->layers[0].splines!=NULL ) +return( ref->layers[0].splines->first->hintmask==NULL ); + +return( false ); /* It's empty. that's easy. */ +} + +static int SCNeedsSubsPts(SplineChar *sc,enum fontformat format) { + if ( (format!=ff_mma && format!=ff_mmb) || sc->parent->mm==NULL ) { + if ( !sc->hconflicts && !sc->vconflicts ) +return( false ); /* No conflicts, no swap-over points needed */ +return( _SCNeedsSubsPts(sc)); + } else { + MMSet *mm = sc->parent->mm; + int i; + for ( i=0; iinstance_count; ++i ) if ( sc->encinstances[i]->charcnt ) { + if ( _SCNeedsSubsPts(mm->instances[i]->chars[sc->enc]) ) +return( true ); + } +return( false ); + } +} + +static unsigned char *SplineChar2PS(SplineChar *sc,int *len,int round,int iscjk, + struct pschars *subrs,BasePoint *startend,int flags,enum fontformat format) { + DBounds b; + GrowBuf gb; + BasePoint current[MmMax]; + unsigned char *ret; + struct hintdb hintdb, *hdb=NULL; + StemInfo *oldh[MmMax], *oldv[MmMax]; + int hc[MmMax], vc[MmMax]; + int instance_count, i; + SplineChar *scs[MmMax]; + real data[MmMax][6]; + MMSet *mm = sc->parent->mm; + + if ( !(flags&ps_flag_nohints) && SCNeedsSubsPts(sc,format)) + SCFigureHintMasks(sc); + + if ( (format==ff_mma || format==ff_mmb) && mm!=NULL ) { + instance_count = mm->instance_count; + if ( instance_count>16 ) + instance_count = 16; + for ( i=0; iinstances[i]->chars[sc->enc]; + } else { + instance_count = 1; + scs[0] = sc; + mm = NULL; + } + + if ( flags&ps_flag_nohints ) { + for ( i=0; ihstem; oldv[i] = scs[i]->vstem; + hc[i] = scs[i]->hconflicts; vc[i] = scs[i]->vconflicts; + scs[i]->hstem = NULL; scs[i]->vstem = NULL; + scs[i]->hconflicts = false; scs[i]->vconflicts = false; + } + } + + memset(&gb,'\0',sizeof(gb)); + memset(current,'\0',sizeof(current)); + for ( i=0; ilsidebearing = current[i].x = round?rint(b.minx):b.minx; + data[i][0] = b.minx; + data[i][1] = scs[i]->width; + } + if ( startend==NULL ) { + AddData(&gb,data,instance_count,2,round); + *gb.pt++ = 13; /* hsbw, lbearing & width */ + } + NumberHints(scs,instance_count); + + if ( IsSeacable(&gb,subrs,scs,instance_count,round,iscjk)) { + /* All Done */; + /* All should share the same refs, so all should be seac-able if one is */ + } else { + iscjk &= ~0x100; + hdb = NULL; + if ( sc->ttf_glyph==0x7fff || ( !scs[0]->hconflicts && !scs[0]->vconflicts && !sc->anyflexes )) { + if ( iscjk && instance_count==1 ) + CounterHints1(&gb,sc,round); /* Must come immediately after hsbw */ + if ( !scs[0]->vconflicts && !scs[0]->hconflicts && instance_count==1 ) { + CvtPsHints(&gb,scs,instance_count,true,round,iscjk,NULL); + CvtPsHints(&gb,scs,instance_count,false,round,iscjk,NULL); + } else { + memset(&hintdb,0,sizeof(hintdb)); + hintdb.subrs = subrs; hintdb.iscjk = iscjk; hintdb.scs = scs; + hintdb.instance_count = instance_count; + hdb = &hintdb; + } + } + if ( sc->ttf_glyph==0x7fff ) { + CvtPsSplineSet(&gb,scs,instance_count,current,round,hdb,startend,sc->parent->order2); + CvtPsRSplineSet(&gb,scs,instance_count,current,round,hdb,NULL,sc->parent->order2); + } else { + refmoveto(&gb,current,(BasePoint *) (subrs->keys[sc->ttf_glyph]), + instance_count,false,round,NULL,NULL); + AddNumber(&gb,sc->ttf_glyph,round); + if ( gb.pt+1>=gb.end ) + GrowBuffer(&gb); + *gb.pt++ = 10; + } + } + if ( gb.pt+1>=gb.end ) + GrowBuffer(&gb); + *gb.pt++ = startend==NULL ? 14 : 11; /* endchar / return */ + ret = (unsigned char *) copyn((char *) gb.base,gb.pt-gb.base); + *len = gb.pt-gb.base; + if ( hdb!=NULL ) { + struct mhlist *mh, *mhnext; + for ( mh=hdb->sublist; mh!=NULL; mh=mhnext ) { + mhnext = mh->next; + free(mh); + } + } + free(gb.base); + if ( startend!=NULL ) + for ( i=0; ihstem = oldh[i]; scs[i]->vstem = oldv[i] = scs[i]->vstem; + scs[i]->hconflicts = hc[i]; scs[i]->vconflicts = vc[i]; + } + } +return( ret ); +} + +static void CvtSimpleHints(GrowBuf *gb, SplineChar *sc,BasePoint *startend, + int round, enum fontformat format) { + MMSet *mm = sc->parent->mm; + int i,instance_count; + SplineChar *scs[MmMax]; + BasePoint current[MmMax]; + + if ( (format==ff_mma || format==ff_mmb) && mm!=NULL ) { + instance_count = mm->instance_count; + if ( instance_count>16 ) + instance_count = 16; + for ( i=0; iinstances[i]->chars[sc->enc]; + } else { + instance_count = 1; + scs[0] = sc; + mm = NULL; + } + memset(current,0,instance_count*sizeof(BasePoint)); + CvtPsSplineSet(gb,scs,instance_count,current,round,NULL,startend, + sc->parent->order2); + for ( i=0; iparent->cidmaster!=NULL; + + for ( d=sc->dependents; d!=NULL; d = d->next ) { + if ( d->sc->layers[ly_fore].splines!=NULL ) /* I won't deal with things with both splines and refs. */ + continue; /* skip it */ + for ( r=d->sc->layers[ly_fore].refs; r!=NULL; r=r->next ) { + if ( r->transform[0]!=1 || r->transform[1]!=0 || + r->transform[2]!=0 || r->transform[3]!=1 ) + break; /* Can't deal with it either way */ + } + if ( r!=NULL ) /* Bad transform matrix */ + continue; /* Can't handle either way, skip */ + + for ( r=d->sc->layers[ly_fore].refs; r!=NULL; r=r->next ) { + if ( iscid || r->adobe_enc==-1 ) +return( false ); /* not seacable, but could go in subr */ + } + r = d->sc->layers[ly_fore].refs; + if ( r->next!=NULL && r->next->next!=NULL ) +return( false ); /* seac only takes 2 chars */ + if ( r->next!=NULL && + ((r->transform[4]!=0 || r->transform[5]!=0 || r->sc->width!=d->sc->width) && + (r->next->transform[4]!=0 || r->next->transform[5]!=0 || r->next->sc->width!=d->sc->width))) +return( false ); /* seac only allows one to be translated, and the untranslated one must have the right width */ + if ( r->next==NULL && + (r->transform[4]!=0 || r->transform[5]!=0 || r->sc->width!=d->sc->width)) +return( false ); + } + /* Either always can be represented by seac, or sometimes by neither */ +return( true ); +} + +/* normally we can't put a character with hint conflicts into a subroutine */ +/* (because when we would have to invoke the hints within the subr and */ +/* hints are expressed as absolute positions, so if the char has been */ +/* translated we can't do the hints right). BUT if the character is not */ +/* translated, and if it has the right lbearing, then the hints in the */ +/* ref will match those in the character and we can use a subroutine for */ +/* both */ +/* If at least one ref fits our requirements then return true */ +/* The same reasoning applies to flex hints. There are absolute expressions */ +/* in them too. */ +static int SpecialCaseConflicts(SplineChar *sc) { + struct splinecharlist *d; + RefChar *r; + DBounds sb, db; + + SplineCharFindBounds(sc,&sb); + for ( d=sc->dependents; d!=NULL; d = d->next ) { + SplineCharFindBounds(d->sc,&db); + if ( db.minx != sb.minx ) + continue; + for ( r=d->sc->layers[ly_fore].refs; r!=NULL; r=r->next ) + if ( r->sc == sc && r->transform[4]==0 && r->transform[5]==0 ) +return( true ); + } +return( false ); +} + +static void SplineFont2Subrs1(SplineFont *sf,int round, int iscjk, + struct pschars *subrs,int flags,enum fontformat format) { + int i,j,cnt, anydone; + SplineChar *sc; + uint8 *temp; + int len; + GrowBuf gb; + MMSet *mm = (format==ff_mma || format==ff_mmb) ? sf->mm : NULL; + int instance_count = mm!=NULL ? mm->instance_count : 1; + + for ( i=cnt=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) + sc->ttf_glyph = 0x7fff; + anydone = true; + while ( anydone ) { + anydone = false; + for ( i=cnt=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + if ( !SCWorthOutputting(sc) || sc!=SCDuplicate(sc) || sc->ttf_glyph!=0x7fff ) + continue; + /* Put the */ + /* character into a subr if it is referenced by other characters */ + if ( (sc->dependents!=NULL && + ((!sc->hconflicts && !sc->vconflicts && !sc->anyflexes) || + SpecialCaseConflicts(sc)) && + !AlwaysSeacable(sc))) { + BasePoint *bp; + RefChar *r; + + for ( r=sc->layers[ly_fore].refs; r!=NULL; r=r->next ) + if ( r->sc->ttf_glyph==0x7fff ) + break; + if ( r!=NULL ) /* Contains a reference to something which is not in a sub itself */ + continue; + + bp = gcalloc(2*instance_count,sizeof(BasePoint)); + /* This contains the start and stop points of the splinesets */ + /* we need this later when we invoke the subrs */ + + /* None of the generated subrs starts with a moveto operator */ + /* The invoker is expected to move to the appropriate place */ + if ( sc->hconflicts || sc->vconflicts || sc->anyflexes ) { + temp = SplineChar2PS(sc,&len,round,iscjk,subrs,bp,flags,format); + } else { + memset(&gb,'\0',sizeof(gb)); + for ( j=0; j=gb.end ) + GrowBuffer(&gb); + *gb.pt++ = 11; /* return */ + temp = (unsigned char *) copyn((char *) gb.base,gb.pt-gb.base); + len = gb.pt-gb.base; + free(gb.base); + } + + SubrsCheck(subrs); + subrs->values[subrs->next] = temp; + subrs->lens[subrs->next] = len; + if ( subrs->keys==NULL ) + subrs->keys = gcalloc(subrs->cnt,sizeof(char *)); + subrs->keys[subrs->next] = (void *) bp; + sc->ttf_glyph = subrs->next++; + anydone = true; + } + } + } +} + +int SFOneWidth(SplineFont *sf) { + int width, i; + + width = -2; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) && + (strcmp(sf->chars[i]->name,".notdef")!=0 || sf->chars[i]->layers[ly_fore].splines!=NULL)) { + /* Only trust the width of notdef if it's got some content */ + /* (at least as far as fixed pitch determination goes) */ + if ( width==-2 ) width = sf->chars[i]->width; + else if ( width!=sf->chars[i]->width ) { + width = -1; + break; + } + } +return(width); +} + +int CIDOneWidth(SplineFont *_sf) { + int width, i; + int k; + SplineFont *sf; + + if ( _sf->cidmaster!=NULL ) _sf = _sf->cidmaster; + width = -2; + k=0; + do { + sf = _sf->subfonts==NULL? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) && + (strcmp(sf->chars[i]->name,".notdef")!=0 || sf->chars[i]->layers[ly_fore].splines!=NULL)) { + /* Only trust the width of notdef if it's got some content */ + /* (at least as far as fixed pitch determination goes) */ + if ( width==-2 ) width = sf->chars[i]->width; + else if ( width!=sf->chars[i]->width ) { + width = -1; + break; + } + } + ++k; + } while ( k<_sf->subfontcnt ); +return(width); +} + +int SFOneHeight(SplineFont *sf) { + int width, i; + + if ( !sf->hasvmetrics ) +return( sf->ascent+sf->descent ); + + width = -2; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) && + (strcmp(sf->chars[i]->name,".notdef")!=0 || sf->chars[i]->layers[ly_fore].splines!=NULL)) { + /* Only trust the width of notdef if it's got some content */ + /* (at least as far as fixed pitch determination goes) */ + if ( width==-2 ) width = sf->chars[i]->vwidth; + else if ( width!=sf->chars[i]->vwidth ) { + width = -1; + break; + } + } +return(width); +} + +int SFIsCJK(SplineFont *sf) { + char *val; + + if ( (val = PSDictHasEntry(sf->private,"LanguageGroup"))!=NULL ) +return( strtol(val,NULL,10)); + + if ( sf->encoding_name>=em_first2byte && sf->encoding_nameencoding_name==em_sjis || sf->encoding_name==em_wansung || + sf->encoding_name==em_jisgb ) +return( true ); + if ( (sf->encoding_name==em_unicode || sf->encoding_name==em_unicode4) && + sf->charcnt>0x3000 && + SCWorthOutputting(sf->chars[0x3000]) && + !SCWorthOutputting(sf->chars['A']) ) +return( true ); + if ( sf->encoding_name==em_unicodeplanes+2 /* SIP */ ) +return( true ); + if ( sf->encoding_name==em_none ) { + /* If it's in a CID font and it doesn't contain alphabetics, then */ + /* it's assumed to be CJK */ + if ( sf->cidmaster!=NULL ) +return( !SCWorthOutputting(SFGetChar(sf,'A',NULL)) && + !SCWorthOutputting(SFGetChar(sf,0x391,NULL)) && /* Alpha */ + !SCWorthOutputting(SFGetChar(sf,0x410,NULL)) && /* Cyrillic A */ + !SCWorthOutputting(SFGetChar(sf,-1,"uni0041.hw")) ); /* Halfwidth A, non standard name, from my cidmap */ + } + +return( false ); +} + +struct pschars *SplineFont2Chrs(SplineFont *sf, int iscjk, + struct pschars *subrs,int flags, enum fontformat format) { + struct pschars *chrs = gcalloc(1,sizeof(struct pschars)); + int i, cnt, instance_count; + int fixed; + int zero_is_notdef; + MMSet *mm = sf->mm; + real data[MmMax][6]; + GrowBuf gb; + int round = (flags&ps_flag_round)? true : false; + + if ( (format==ff_mma || format==ff_mmb) && mm!=NULL ) { + instance_count = mm->instance_count; + sf = mm->instances[0]; + fixed = 0; + for ( i=0; iinstances[i]); + if ( fixed==-1 ) + break; + } + if ( fixed==-1 ) { + for ( i=0; iinstances[i]->ascent+mm->instances[i]->descent; + } + } else { + data[0][0] = fixed = SFOneWidth(sf); + if ( fixed == -1 ) + data[0][0] = sf->ascent+sf->descent; + instance_count = 1; + } + + cnt = 0; + for ( i=0; icharcnt; ++i ) +#if HANYANG + if ( sf->chars[i]!=NULL && sf->chars[i]->compositionunit ) + /* Don't count it */; + else +#endif + if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]==SCDuplicate(sf->chars[i])) + ++cnt; +/* only honor the width on .notdef in non-fixed pitch fonts (or ones where there is an actual outline in notdef) */ + zero_is_notdef = SCIsNotdef(sf->chars[0],fixed); + if ( !zero_is_notdef ) + ++cnt; /* one notdef entry */ + + chrs->cnt = cnt; + chrs->keys = galloc(cnt*sizeof(char *)); + chrs->lens = galloc(cnt*sizeof(int)); + chrs->values = galloc(cnt*sizeof(unsigned char *)); + + SplineFont2Subrs1(sf,round,iscjk,subrs,flags,format); + + i = cnt = 0; + chrs->keys[0] = copy(".notdef"); + if ( zero_is_notdef ) { + chrs->values[0] = SplineChar2PS(sf->chars[0],&chrs->lens[0],round,iscjk, + subrs,NULL,flags,format); + i = 1; + } else { + memset(&gb,'\0',sizeof(gb)); + GrowBuffer(&gb); + *gb.pt++ = '\213'; /* 0 */ /* left side bearing */ + AddData(&gb,data,instance_count,1,round); + if ( gb.pt+4>gb.end ) + GrowBuffer(&gb); + *gb.pt++ = '\015'; /* hsbw */ + *gb.pt++ = '\016'; /* endchar */ + *gb.pt = '\0'; + chrs->values[0] = (unsigned char *) copyn((char *) gb.base,gb.pt-gb.base); /* 0 hsbw endchar */ + chrs->lens[0] = gb.pt-gb.base; + i = 0; + if ( sf->chars[0]!=NULL && strcmp(sf->chars[0]->name,".notdef")==0 ) + i = 1; + } + cnt = 1; + for ( ; icharcnt; ++i ) { +#if HANYANG + if ( sf->chars[i]!=NULL && sf->chars[i]->compositionunit ) + /* don't output it, should be in a subroutine */; + else +#endif + if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]==SCDuplicate(sf->chars[i])) { + chrs->keys[cnt] = copy(sf->chars[i]->name); + chrs->values[cnt] = SplineChar2PS(sf->chars[i],&chrs->lens[cnt], + round,iscjk,subrs,NULL,flags,format); + ++cnt; + } + if ( !GProgressNext()) { + PSCharsFree(chrs); +return( NULL ); + } + } + chrs->next = cnt; + if ( chrs->next>chrs->cnt ) + GDrawIError("Character estimate failed, about to die..." ); +return( chrs ); +} + +struct pschars *CID2Chrs(SplineFont *cidmaster,struct cidbytes *cidbytes,int flags) { + struct pschars *chrs = gcalloc(1,sizeof(struct pschars)); + int i, cnt, cid; + char notdefentry[20]; + SplineFont *sf = NULL; + struct fddata *fd; + int round = (flags&ps_flag_round)? true : false; + /* I don't support mm cid files. I don't think adobe does either */ + + cnt = 0; + for ( i=0; isubfontcnt; ++i ) + if ( cntsubfonts[i]->charcnt ) + cnt = cidmaster->subfonts[i]->charcnt; + cidbytes->cidcnt = cnt; + + for ( i=0; isubfontcnt; ++i ) { + sf = cidmaster->subfonts[i]; + fd = &cidbytes->fds[i]; + SplineFont2Subrs1(sf,round,fd->iscjk|0x100,fd->subrs,flags,ff_cid); + } + + chrs->cnt = cnt; + chrs->lens = galloc(cnt*sizeof(int)); + chrs->values = galloc(cnt*sizeof(unsigned char *)); + cidbytes->fdind = galloc(cnt*sizeof(unsigned char *)); + + for ( cid = 0; cidsubfontcnt; ++i ) { + sf = cidmaster->subfonts[i]; + if ( cidcharcnt && SCWorthOutputting(sf->chars[cid]) ) + break; + } + if ( cid!=0 && i==cidmaster->subfontcnt ) { + chrs->lens[cid] = 0; + chrs->values[cid] = NULL; + cidbytes->fdind[cid] = -1; /* that's what Adobe uses */ + } else if ( i==cidmaster->subfontcnt ) { + /* Must have something for .notdef */ + /* sf corresponds to cidmaster->subfontcnt-1, generally the kanji font */ + int w = sf->ascent+sf->descent; char *pt = notdefentry; + *pt++ = '\213'; /* 0 */ + if ( w>=-107 && w<=107 ) + *pt++ = w+139; + else if ( w>=108 && w<=1131 ) { + w -= 108; + *pt++ = (w>>8)+247; + *pt++ = w&0xff; + } else if ( w>=-1131 && w<=-108 ) { + w = -w; + w -= 108; + *pt++ = (w>>8)+251; + *pt++ = w&0xff; + } else { + *pt++ = '\377'; + *pt++ = (w>>24)&0xff; + *pt++ = (w>>16)&0xff; + *pt++ = (w>>8)&0xff; + *pt++ = w&0xff; + } + *pt++ = '\015'; /* hsbw */ + *pt++ = '\016'; /* endchar */ + *pt = '\0'; + chrs->values[0] = (unsigned char *) copyn(notdefentry,pt-notdefentry); /* 0 hsbw endchar */ + chrs->lens[0] = pt-notdefentry; + cidbytes->fdind[0] = cidmaster->subfontcnt-1; + } else { + fd = &cidbytes->fds[i]; + cidbytes->fdind[cid] = i; + chrs->values[cid] = SplineChar2PS(sf->chars[cid],&chrs->lens[cid], + round,fd->iscjk|0x100,fd->subrs,NULL,flags,ff_cid); + } + if ( !GProgressNext()) { + PSCharsFree(chrs); +return( NULL ); + } + } + chrs->next = cid; +return( chrs ); +} + +/* ************************************************************************** */ +/* ********************** Type2 PostScript CharStrings ********************** */ +/* ************************************************************************** */ + +#if 0 +static int real_warn = false; +#endif + +static real myround2(real pos, int round) { + if ( round ) +return( rint(pos)); + +return( rint(65536*pos)/65536 ); +} + +static void AddNumber2(GrowBuf *gb, real pos, int round) { + int val; + unsigned char *str; + + if ( gb->pt+5>=gb->end ) + GrowBuffer(gb); + + pos = rint(65536*pos)/65536; + if ( round ) + pos = rint(pos); + if ( pos>65535 || pos<-65536 ) { + fprintf( stderr, "Number out of range: %g in type2 output (must be [-65536,65535])\n", + pos ); + if ( pos>0 ) pos = 65535; else pos = -65536; + } + + str = gb->pt; + if ( pos!=floor(pos )) { +#if 0 + if ( !real_warn ) { + GWidgetPostNoticeR(_STR_NotIntegral,_STR_TryRoundToInt); + real_warn = true; + } +#endif + + val = pos*65536; +#ifdef PSFixed_Is_TTF /* The type2 spec is contradictory. It says this is a */ + /* two's complement number, but it also says it is a */ + /* Fixed, which in truetype is not two's complement */ + /* (mantisa is always unsigned) */ + if ( val<0 ) { + int mant = (-val)&0xffff; + val = (val&0xffff0000) | mant; + } +#endif + *str++ = '\377'; + *str++ = (val>>24)&0xff; + *str++ = (val>>16)&0xff; + *str++ = (val>>8)&0xff; + *str++ = val&0xff; + } else { + val = rint(pos); + if ( pos>=-107 && pos<=107 ) + *str++ = val+139; + else if ( pos>=108 && pos<=1131 ) { + val -= 108; + *str++ = (val>>8)+247; + *str++ = val&0xff; + } else if ( pos>=-1131 && pos<=-108 ) { + val = -val; + val -= 108; + *str++ = (val>>8)+251; + *str++ = val&0xff; + } else { + *str++ = 28; + *str++ = (val>>8)&0xff; + *str++ = val&0xff; + } + } + gb->pt = str; +} + +static void AddMask2(GrowBuf *gb,uint8 mask[12],int cnt, int oper) { + int i; + + if ( gb->pt+1+((cnt+7)>>3)>=gb->end ) + GrowBuffer(gb); + *gb->pt++ = oper; /* hintmask,cntrmask */ + for ( i=0; i< ((cnt+7)>>3); ++i ) + *gb->pt++ = mask[i]; +} + +static void CounterHints2(GrowBuf *gb, SplineChar *sc, int hcnt) { + int i; + + for ( i=0; icountermask_cnt; ++i ) + AddMask2(gb,sc->countermasks[i],hcnt,20); /* cntrmask */ +} + +static int HintSetup2(GrowBuf *gb,struct hintdb *hdb, SplinePoint *to ) { + + /* We might get a point with a hintmask in a glyph with no conflicts */ + /* (ie. the initial point when we return to it at the end of the splineset*/ + /* in that case hdb->cnt will be 0 and we should ignore it */ + /* components in subroutines depend on not having any hintmasks */ + if ( to->hintmask==NULL || hdb->cnt==0 ) +return( false ); + + if ( memcmp(hdb->mask,*to->hintmask,(hdb->cnt+7)/8)==0 ) +return( false ); + + AddMask2(gb,*to->hintmask,hdb->cnt,19); /* hintmask */ + memcpy(hdb->mask,*to->hintmask,sizeof(HintMask)); +return( true ); +} + +static void moveto2(GrowBuf *gb,struct hintdb *hdb,SplinePoint *to, int round) { + BasePoint temp, *tom; + + if ( gb->pt+18 >= gb->end ) + GrowBuffer(gb); + + HintSetup2(gb,hdb,to); + tom = &to->me; + if ( round ) { + temp.x = rint(tom->x); + temp.y = rint(tom->y); + tom = &temp; + } +#if 0 + if ( hdb->current.x==tom->x && hdb->current.y==tom->y ) { + /* we're already here */ + /* Yes, but a move is required anyway at char start */ + } else +#endif + if ( hdb->current.x==tom->x ) { + AddNumber2(gb,tom->y-hdb->current.y,round); + *(gb->pt)++ = 4; /* v move to */ + } else if ( hdb->current.y==tom->y ) { + AddNumber2(gb,tom->x-hdb->current.x,round); + *(gb->pt)++ = 22; /* h move to */ + } else { + AddNumber2(gb,tom->x-hdb->current.x,round); + AddNumber2(gb,tom->y-hdb->current.y,round); + *(gb->pt)++ = 21; /* r move to */ + } + hdb->current = *tom; +} + +static Spline *lineto2(GrowBuf *gb,struct hintdb *hdb,Spline *spline, Spline *done, int round) { + int cnt, hv, hvcnt; + Spline *test, *lastgood, *lasthvgood; + BasePoint temp1, temp2, *tom, *fromm; + int donehm; + + for ( test=spline, cnt=0; test->knownlinear && cnt<15; ) { + ++cnt; + lastgood = test; + test = test->to->next; + if ( test==done || test==NULL ) + break; + } + + HintSetup2(gb,hdb,spline->to); + + hv = -1; hvcnt=1; lasthvgood = NULL; + if ( spline->from->me.x==spline->to->me.x ) + hv = 1; /* Vertical */ + else if ( spline->from->me.y==spline->to->me.y ) + hv = 0; /* Horizontal */ + donehm = true; + if ( hv!=-1 ) { + lasthvgood = spline; hvcnt = 1; + if ( cnt!=1 ) { + for ( test=spline->to->next; test!=NULL ; test = test->to->next ) { + fromm = &test->from->me; + if ( round ) { + temp2.x = rint(fromm->x); + temp2.y = rint(fromm->y); + fromm = &temp2; + } + tom = &test->to->me; + if ( round ) { + temp1.x = rint(tom->x); + temp1.y = rint(tom->y); + tom = &temp1; + } + if ( hv==1 && tom->y==fromm->y ) + hv = 0; + else if ( hv==0 && tom->x==fromm->x ) + hv = 1; + else + break; + lasthvgood = test; + ++hvcnt; + if ( test==lastgood ) + break; + } + } + donehm = true; + if ( hvcnt==cnt || hvcnt>=2 ) { + /* It's more efficient to do some h/v linetos */ + for ( test=spline; ; test = test->to->next ) { + if ( !donehm && test->to->hintmask!=NULL ) + break; + donehm = false; + fromm = &test->from->me; + if ( round ) { + temp2.x = rint(fromm->x); + temp2.y = rint(fromm->y); + fromm = &temp2; + } + tom = &test->to->me; + if ( round ) { + temp1.x = rint(tom->x); + temp1.y = rint(tom->y); + tom = &temp1; + } + if ( fromm->x==tom->x ) + AddNumber2(gb,tom->y-fromm->y,round); + else + AddNumber2(gb,tom->x-fromm->x,round); + hdb->current = *tom; + if ( test==lasthvgood ) { + test = test->to->next; + break; + } + } + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = spline->from->me.x==spline->to->me.x? 7 : 6; +return( test ); + } + } + + for ( test=spline; test!=NULL; test = test->to->next ) { + if ( !donehm && test->to->hintmask!=NULL ) + break; + donehm = false; + fromm = &test->from->me; + if ( round ) { + temp2.x = rint(fromm->x); + temp2.y = rint(fromm->y); + fromm = &temp2; + } + tom = &test->to->me; + if ( round ) { + temp1.x = rint(tom->x); + temp1.y = rint(tom->y); + tom = &temp1; + } + AddNumber2(gb,tom->x-fromm->x,round); + AddNumber2(gb,tom->y-fromm->y,round); + hdb->current = *tom; + if ( test==lastgood ) { + test = test->to->next; + break; + } + } + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 5; /* r line to */ +return( test ); +} + +static Spline *curveto2(GrowBuf *gb,struct hintdb *hdb,Spline *spline, Spline *done, int round) { + int cnt=0, hv; + Spline *first; + BasePoint start; + int donehm; + + HintSetup2(gb,hdb,spline->to); + + hv = -1; + if ( hdb->current.x==myround2(spline->from->nextcp.x,round) && + myround2(spline->to->prevcp.y,round)==myround2(spline->to->me.y,round) ) + hv = 1; + else if ( hdb->current.y==myround2(spline->from->nextcp.y,round) && + myround2(spline->to->prevcp.x,round)==myround2(spline->to->me.x,round) ) + hv = 0; + donehm = true; + if ( hv!=-1 ) { + first = spline; start = hdb->current; + while ( + (hv==1 && hdb->current.x==myround2(spline->from->nextcp.x,round) && + myround2(spline->to->prevcp.y,round)==myround2(spline->to->me.y,round) ) || + (hv==0 && hdb->current.y==myround2(spline->from->nextcp.y,round) && + myround2(spline->to->prevcp.x,round)==myround2(spline->to->me.x,round) ) ) { + if ( !donehm && spline->to->hintmask!=NULL ) + break; + donehm = false; + if ( hv==1 ) { + AddNumber2(gb,myround2(spline->from->nextcp.y,round)-hdb->current.y,round); + AddNumber2(gb,myround2(spline->to->prevcp.x,round)-myround2(spline->from->nextcp.x,round),round); + AddNumber2(gb,myround2(spline->to->prevcp.y,round)-myround2(spline->from->nextcp.y,round),round); + AddNumber2(gb,myround2(spline->to->me.x,round)-myround2(spline->to->prevcp.x,round),round); + hv = 0; + } else { + AddNumber2(gb,myround2(spline->from->nextcp.x,round)-hdb->current.x,round); + AddNumber2(gb,myround2(spline->to->prevcp.x,round)-myround2(spline->from->nextcp.x,round),round); + AddNumber2(gb,myround2(spline->to->prevcp.y,round)-myround2(spline->from->nextcp.y,round),round); + AddNumber2(gb,myround2(spline->to->me.y,round)-myround2(spline->to->prevcp.y,round),round); + hv = 1; + } + hdb->current.x = myround2(spline->to->me.x,round); + hdb->current.y = myround2(spline->to->me.y,round); + ++cnt; + spline = spline->to->next; + if ( spline==done || spline==NULL || cnt>9 || spline->knownlinear ) + break; + } + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = ( start.x==myround2(first->from->nextcp.x,round) && myround2(first->to->prevcp.y,round)==myround2(first->to->me.y,round) )? + 30:31; /* vhcurveto:hvcurveto */ +return( spline ); + } + while ( cnt<6 ) { + if ( !donehm && spline->to->hintmask!=NULL ) + break; + donehm = false; + hv = -1; + if ( hdb->current.x==myround2(spline->from->nextcp.x,round) && + myround2(spline->to->prevcp.y,round)==myround2(spline->to->me.y,round) && + spline->to->next!=NULL && + myround2(spline->to->me.y,round)==myround2(spline->to->nextcp.y,round) && + myround2(spline->to->next->to->prevcp.x,round)==myround2(spline->to->next->to->me.x,round) ) + break; + else if ( hdb->current.y==myround2(spline->from->nextcp.y,round) && + myround2(spline->to->prevcp.x,round)==myround2(spline->to->me.x,round) && + spline->to->next!=NULL && + myround2(spline->to->me.x,round)==myround2(spline->to->nextcp.x,round) && + myround2(spline->to->next->to->prevcp.y,round)==myround2(spline->to->next->to->me.y,round) ) + break; + AddNumber2(gb,myround2(spline->from->nextcp.x,round)-hdb->current.x,round); + AddNumber2(gb,myround2(spline->from->nextcp.y,round)-hdb->current.y,round); + AddNumber2(gb,myround2(spline->to->prevcp.x,round)-myround2(spline->from->nextcp.x,round),round); + AddNumber2(gb,myround2(spline->to->prevcp.y,round)-myround2(spline->from->nextcp.y,round),round); + AddNumber2(gb,myround2(spline->to->me.x,round)-myround2(spline->to->prevcp.x,round),round); + AddNumber2(gb,myround2(spline->to->me.y,round)-myround2(spline->to->prevcp.y,round),round); + hdb->current.x = myround2(spline->to->me.x,round); + hdb->current.y = myround2(spline->to->me.y,round); + ++cnt; + spline = spline->to->next; + if ( spline==done || spline==NULL || spline->knownlinear ) + break; + } + if ( gb->pt+1 >= gb->end ) + GrowBuffer(gb); + *(gb->pt)++ = 8; /* rrcurveto */ +return( spline ); +} + +static void flexto2(GrowBuf *gb,struct hintdb *hdb,Spline *pspline,int round) { + BasePoint *c0, *c1, *mid, *end, *nc0, *nc1; + Spline *nspline; + + c0 = &pspline->from->nextcp; + c1 = &pspline->to->prevcp; + mid = &pspline->to->me; + nspline = pspline->to->next; + nc0 = &nspline->from->nextcp; + nc1 = &nspline->to->prevcp; + end = &nspline->to->me; + + HintSetup2(gb,hdb,nspline->to); + + if ( myround2(c0->y,round)==hdb->current.y && myround2(nc1->y,round)==hdb->current.y && + myround2(end->y,round)==hdb->current.y && + myround2(c1->y,round)==myround2(mid->y,round) && myround2(nc0->y,round)==myround2(mid->y,round) ) { + if ( gb->pt+7*6+2 >= gb->end ) + GrowBuffer(gb); + AddNumber2(gb,myround2(c0->x,round)-hdb->current.x,round); + AddNumber2(gb,myround2(c1->x,round)-myround2(c0->x,round),round); + AddNumber2(gb,myround2(c1->y,round)-myround2(c0->y,round),round); + AddNumber2(gb,myround2(mid->x,round)-myround2(c1->x,round),round); + AddNumber2(gb,myround2(nc0->x,round)-myround2(mid->x,round),round); + AddNumber2(gb,myround2(nc1->x,round)-myround2(nc0->x,round),round); + AddNumber2(gb,myround2(end->x,round)-myround2(nc1->x,round),round); + *gb->pt++ = 12; *gb->pt++ = 34; /* hflex */ + } else { + if ( gb->pt+11*6+2 >= gb->end ) + GrowBuffer(gb); + AddNumber2(gb,myround2(c0->x,round)-hdb->current.x,round); + AddNumber2(gb,myround2(c0->y,round)-hdb->current.y,round); + AddNumber2(gb,myround2(c1->x,round)-myround2(c0->x,round),round); + AddNumber2(gb,myround2(c1->y,round)-myround2(c0->y,round),round); + AddNumber2(gb,myround2(mid->x,round)-myround2(c1->x,round),round); + AddNumber2(gb,myround2(mid->y,round)-myround2(c1->y,round),round); + AddNumber2(gb,myround2(nc0->x,round)-myround2(mid->x,round),round); + AddNumber2(gb,myround2(nc0->y,round)-myround2(mid->y,round),round); + AddNumber2(gb,myround2(nc1->x,round)-myround2(nc0->x,round),round); + AddNumber2(gb,myround2(nc1->y,round)-myround2(nc0->y,round),round); + if ( hdb->current.y==myround2(end->y,round) ) + AddNumber2(gb,myround2(end->x,round)-myround2(nc1->x,round),round); + else + AddNumber2(gb,myround2(end->y,round)-myround2(nc1->y,round),round); + *gb->pt++ = 12; *gb->pt++ = 37; /* flex1 */ + } + + hdb->current = *end; +} + +static void CvtPsSplineSet2(GrowBuf *gb, SplinePointList *spl, + struct hintdb *hdb, BasePoint *start,int is_order2,int round) { + Spline *spline, *first; + SplinePointList temp, *freeme = NULL; + int init = true; + + if ( is_order2 ) + freeme = spl = SplineSetsPSApprox(spl); + for ( ; spl!=NULL; spl = spl->next ) { + first = NULL; + SplineSetReverse(spl); + /* For some reason fontographer reads its spline in in the reverse */ + /* order from that I use. I'm not sure how they do that. The result */ + /* being that what I call clockwise they call counter. Oh well. */ + /* If I reverse the splinesets after reading them in, and then again*/ + /* when saving them out, all should be well */ + if ( spl->first->flexy || spl->first->flexx ) { + /* can't handle a flex (mid) point as the first point. rotate the */ + /* list by one, this is possible because only closed paths have */ + /* points marked as flex, and because we can't have two flex mid- */ + /* points in a row */ + temp = *spl; + temp.first = temp.last = spl->first->next->to; + spl = &temp; + } + if ( start==NULL || !init ) + moveto2(gb,hdb,spl->first,round); + else { + hdb->current = *start = spl->first->me; + init = false; + } + for ( spline = spl->first->next; spline!=NULL && spline!=first; ) { + if ( first==NULL ) first = spline; + if ( spline->to->flexx || spline->to->flexy ) { + flexto2(gb,hdb,spline,round); /* does two adjacent splines */ + spline = spline->to->next->to->next; + } else if ( spline->knownlinear ) + spline = lineto2(gb,hdb,spline,first,round); + else + spline = curveto2(gb,hdb,spline,first,round); + } + SplineSetReverse(spl); + /* Of course, I have to Reverse again to get back to my convention after*/ + /* saving */ + } + SplinePointListFree(freeme); +} + +static StemInfo *OrderHints(StemInfo *mh, StemInfo *h, real offset, real otheroffset, int mask) { + StemInfo *prev, *new, *test; + + while ( h!=NULL ) { + prev = NULL; + for ( test=mh; test!=NULL && (h->start+offset>test->start || + (h->start+offset==test->start && h->widthwidth)); test=test->next ) + prev = test; + if ( test!=NULL && test->start==h->start+offset && test->width==h->width ) + test->u.mask |= mask; /* Actually a bit */ + else { + new = chunkalloc(sizeof(StemInfo)); + new->next = test; + new->start = h->start+offset; + new->width = h->width; + new->where = HICopyTrans(h->where,1,otheroffset); + new->u.mask = mask; + if ( prev==NULL ) + mh = new; + else + prev->next = new; + } + h = h->next; + } +return( mh ); +} + +static void DumpHints(GrowBuf *gb,StemInfo *h,int oper,int midoper,int round) { + real last = 0, cur; + int cnt; + + if ( h==NULL ) +return; + cnt = 0; + while ( h!=NULL && h->hintnumber!=-1 ) { + /* Type2 hints do not support negative widths except in the case of */ + /* ghost (now called edge) hints */ + if ( cnt>24-1 ) { /* stack max = 48 numbers, => 24 hints, leave a bit of slop for the width */ + if ( gb->pt+1>=gb->end ) + GrowBuffer(gb); + *gb->pt++ = midoper; + cnt = 0; + } + cur = myround2(h->start,round) + myround2(h->width,round); + if ( h->width<0 ) { + AddNumber2(gb,cur-last,round); + AddNumber2(gb,-myround2(h->width,round),round); + cur -= myround2(h->width,round); + } else if ( h->ghost ) { + if ( h->width==20 ) { + AddNumber2(gb,myround2(h->start,round)-last+20,round); + AddNumber2(gb,-20,round); + cur = myround2(h->start,round); + } else { + AddNumber2(gb,myround2(h->start,round)-last,round); + AddNumber2(gb,-21,round); + cur = myround2(h->start,round)-21; + } + } else { + AddNumber2(gb,myround2(h->start,round)-last,round); + AddNumber2(gb,myround2(h->width,round),round); + } + last = cur; + h = h->next; + ++cnt; + } + if ( oper!=-1 ) { + if ( gb->pt+1>=gb->end ) + GrowBuffer(gb); + *gb->pt++ = oper; + } +} + +static void DumpHintMasked(GrowBuf *gb,RefChar *cur,StemInfo *h,StemInfo *v) { + uint8 masks[12]; + int cnt; + + if ( h==NULL && v==NULL ) + GDrawIError("hintmask invoked when there are no hints"); + memset(masks,'\0',sizeof(masks)); + cnt = 0; + while ( h!=NULL && h->hintnumber>=0 ) { + if ( h->u.mask&cur->adobe_enc ) + masks[h->hintnumber>>3] |= 0x80>>(h->hintnumber&7); + h = h->next; ++cnt; + } + while ( v!=NULL && v->hintnumber>=0 ) { + if ( v->u.mask&cur->adobe_enc ) + masks[v->hintnumber>>3] |= 0x80>>(v->hintnumber&7); + v = v->next; ++cnt; + } + AddMask2(gb,masks,cnt,19); /* hintmask */ +} + +static void ExpandRefList2(GrowBuf *gb, SplineChar *sc, RefChar *refs, RefChar *unsafe, + struct pschars *subrs, int round) { + RefChar *r; + int hsccnt=0; + BasePoint current, *bpt; + StemInfo *h=NULL, *v=NULL, *s; + int cnt; + /* The only refs I deal with have no hint conflicts within them */ + /* Unless unsafe is set. In which case it will contain conflicts and */ + /* none of the other refs will contain any hints at all */ + + memset(¤t,'\0',sizeof(current)); + + if ( unsafe!=NULL ) { + /* All the hints live in this one reference, and its subroutine */ + /* contains them and it has its own rmoveto */ + if ( unsafe->sc->lsidebearing==0x7fff ) + GDrawIError("Attempt to reference an unreferenceable glyph %s", unsafe->sc->name ); + AddNumber2(gb,unsafe->sc->lsidebearing,round); + if ( gb->pt+1>=gb->end ) + GrowBuffer(gb); + *gb->pt++ = 10; /* callsubr */ + hsccnt = 0; + bpt = (BasePoint *) (subrs->keys[unsafe->sc->lsidebearing+subrs->bias]); + current = bpt[1]; + } else { + for ( r=refs; r!=NULL; r=r->next ) + if ( r->sc->hstem!=NULL || r->sc->vstem!=NULL ) + r->adobe_enc = 1<adobe_enc = 0; + + for ( r=refs, h=v=NULL; r!=NULL; r=r->next ) { + h = OrderHints(h,r->sc->hstem,r->transform[5],r->transform[4],r->adobe_enc); + v = OrderHints(v,r->sc->vstem,r->transform[4],r->transform[5],r->adobe_enc); + } + for ( s=h, cnt=0; s!=NULL; s=s->next, ++cnt ) + s->hintnumber = cnt>=HntMax?-1:cnt; + for ( s=v, cnt=0; s!=NULL; s=s->next, ++cnt ) + s->hintnumber = cnt>=HntMax?-1:cnt; + + if ( h!=NULL ) + DumpHints(gb,h,hsccnt>1?18:1,hsccnt>1?18:1,round); /* hstemhm/hstem */ + if ( v!=NULL ) + DumpHints(gb,v, hsccnt<=1 ? 3:-1, hsccnt<=1 ? 3:23,round); /* vstem */ + CounterHints2(gb,sc,cnt); /* Precedes first hintmask */ + } + + for ( r=refs; r!=NULL; r=r->next ) if ( r!=unsafe ) { + if ( hsccnt>1 ) + DumpHintMasked(gb,r,h,v); + /* Translate from end of last character to where this one should */ + /* start (we must have one moveto operator to start off, none */ + /* in the subr) */ + bpt = (BasePoint *) (subrs->keys[r->sc->lsidebearing+subrs->bias]); + if ( current.x!=bpt[0].x+r->transform[4] ) + AddNumber2(gb,bpt[0].x+r->transform[4]-current.x,round); + if ( current.y!=bpt[0].y+r->transform[5] || current.x==bpt[0].x+r->transform[4] ) + AddNumber2(gb,bpt[0].y+r->transform[5]-current.y,round); + if ( gb->pt+1>=gb->end ) + GrowBuffer(gb); + *gb->pt++ = current.x==bpt[0].x+r->transform[4]?4: /* vmoveto */ + current.y==bpt[0].y+r->transform[5]?22: /* hmoveto */ + 21; /* rmoveto */ + if ( r->sc->lsidebearing==0x7fff ) + GDrawIError("Attempt to reference an unreferenceable glyph %s", r->sc->name ); + AddNumber2(gb,r->sc->lsidebearing,round); + if ( gb->pt+1>=gb->end ) + GrowBuffer(gb); + *gb->pt++ = 10; /* callsubr */ + current.x = bpt[1].x+r->transform[4]; + current.y = bpt[1].y+r->transform[5]; + } + StemInfosFree(h); StemInfosFree(v); +} + +static int IsRefable2(GrowBuf *gb, SplineChar *sc, struct pschars *subrs,int round) { + RefChar *refs, *r, *unsafe=NULL; + int allsafe=true, unsafecnt=0, allwithouthints=true, ret; + + refs = SCCanonicalRefs(sc,2); + if ( refs==NULL ) +return( false ); + for ( r=refs; r!=NULL; r=r->next ) { + if ( r->sc->hconflicts || r->sc->vconflicts ) { + ++unsafecnt; + allsafe = false; + unsafe = r; + } else if ( r->sc->hstem!=NULL || r->sc->vstem!=NULL ) + allwithouthints = false; + } + if ( allsafe || ( unsafecnt==1 && allwithouthints )) { + ExpandRefList2(gb,sc,refs,unsafe,subrs,round); + ret = true; + } else + ret = false; + RefCharsFreeRef(refs); +return( ret ); +} + +static unsigned char *SplineChar2PSOutline2(SplineChar *sc,int *len, + BasePoint *startend, int flags ) { + GrowBuf gb; + struct hintdb hdb; + RefChar *rf; + unsigned char *ret; + StemInfo *oldh, *oldv; + int hc, vc; + SplineChar *scs[MmMax]; + int round = (flags&ps_flag_round)? true : false; + + if ( flags&ps_flag_nohints ) { + oldh = sc->hstem; oldv = sc->vstem; + hc = sc->hconflicts; vc = sc->vconflicts; + sc->hstem = NULL; sc->vstem = NULL; + sc->hconflicts = false; sc->vconflicts = false; + } + + memset(&gb,'\0',sizeof(gb)); + memset(&hdb,'\0',sizeof(hdb)); + scs[0] = sc; + hdb.scs = scs; + + CvtPsSplineSet2(&gb,sc->layers[ly_fore].splines,&hdb,startend,sc->parent->order2,round); + for ( rf = sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + CvtPsSplineSet2(&gb,rf->layers[0].splines,&hdb,NULL,sc->parent->order2,round); + if ( gb.pt+1>=gb.end ) + GrowBuffer(&gb); + *gb.pt++ = 11; /* return */ + ret = (unsigned char *) copyn((char *) gb.base,gb.pt-gb.base); + *len = gb.pt-gb.base; + free(gb.base); + startend[1] = hdb.current; + if ( flags&ps_flag_nohints ) { + sc->hstem = oldh; sc->vstem = oldv; + sc->hconflicts = hc; sc->vconflicts = vc; + } +return( ret ); +} + +static unsigned char *SplineChar2PS2(SplineChar *sc,int *len, int nomwid, + int defwid, struct pschars *subrs, BasePoint *startend, int flags ) { + GrowBuf gb; + RefChar *rf; + unsigned char *ret; + struct hintdb hdb; + StemInfo *oldh, *oldv; + int hc, vc; + SplineChar *scs[MmMax]; + int round = (flags&ps_flag_round)? true : false; + + if ( autohint_before_generate && sc->changedsincelasthinted && + !sc->manualhints && !(flags&ps_flag_nohints)) + SplineCharAutoHint(sc,true); + if ( !(flags&ps_flag_nohints) && SCNeedsSubsPts(sc,ff_otf)) + SCFigureHintMasks(sc); + + if ( flags&ps_flag_nohints ) { + oldh = sc->hstem; oldv = sc->vstem; + hc = sc->hconflicts; vc = sc->vconflicts; + sc->hstem = NULL; sc->vstem = NULL; + sc->hconflicts = false; sc->vconflicts = false; + } + + memset(&gb,'\0',sizeof(gb)); + + GrowBuffer(&gb); + if ( startend==NULL ) { + /* store the width on the stack */ + if ( sc->width==defwid ) + /* Don't need to do anything for the width */; + else + AddNumber2(&gb,sc->width-nomwid,round); + } + if ( IsRefable2(&gb,sc,subrs,round)) + /* All Done */; + else if ( startend==NULL && sc->lsidebearing!=0x7fff ) { + RefChar refs; + memset(&refs,'\0',sizeof(refs)); + refs.sc = sc; + refs.transform[0] = refs.transform[3] = 1.0; + ExpandRefList2(&gb,sc,&refs,sc->hconflicts||sc->vconflicts?&refs:NULL,subrs,round); + } else { + memset(&hdb,'\0',sizeof(hdb)); + hdb.scs = scs; + scs[0] = sc; + hdb.noconflicts = !sc->hconflicts && !sc->vconflicts; + hdb.cnt = NumberHints(hdb.scs,1); + DumpHints(&gb,sc->hstem,sc->hconflicts?18:1,sc->hconflicts?18:1,round); + DumpHints(&gb,sc->vstem,sc->vconflicts || sc->hconflicts?-1:3,sc->vconflicts || sc->hconflicts?23:3,round); + CounterHints2(&gb, sc, hdb.cnt ); + CvtPsSplineSet2(&gb,sc->layers[ly_fore].splines,&hdb,NULL,sc->parent->order2,round); + for ( rf = sc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) + CvtPsSplineSet2(&gb,rf->layers[0].splines,&hdb,NULL,sc->parent->order2,round); + } + if ( gb.pt+1>=gb.end ) + GrowBuffer(&gb); + *gb.pt++ = startend==NULL?14:11; /* endchar / return */ + if ( startend!=NULL ) + startend[1] = hdb.current; + ret = (unsigned char *) copyn((char *) gb.base,gb.pt-gb.base); + *len = gb.pt-gb.base; + free(gb.base); + if ( flags&ps_flag_nohints ) { + sc->hstem = oldh; sc->vstem = oldv; + sc->hconflicts = hc; sc->vconflicts = vc; + } +return( ret ); +} + +/* This char has hint conflicts. Check to see if we can put it into a subr */ +/* in spite of that. If there is at least one dependent character which: */ +/* refers to us without translating us */ +/* and all its other refs contain no hints at all */ +static int Type2SpecialCase(SplineChar *sc) { + struct splinecharlist *d; + RefChar *r; + + for ( d=sc->dependents; d!=NULL; d=d->next ) { + for ( r=d->sc->layers[ly_fore].refs; r!=NULL; r = r->next ) { + if ( autohint_before_generate && r->sc!=NULL && + r->sc->changedsincelasthinted && !r->sc->manualhints ) + SplineCharAutoHint(r->sc,true); + if ( r->transform[0]!=1 || r->transform[1]!=0 || + r->transform[2]!=0 || r->transform[3]!=1 ) + break; + if ( r->sc!=sc && (r->sc->hstem!=NULL || r->sc->vstem!=NULL)) + break; + if ( r->sc==sc && (r->transform[4]!=0 || r->transform[5]!=0)) + break; + } + if ( r==NULL ) +return( true ); + } +return( false ); +} + +struct pschars *SplineFont2Subrs2(SplineFont *sf,int flags) { + struct pschars *subrs = gcalloc(1,sizeof(struct pschars)); + int i,cnt; + SplineChar *sc; + + /*real_warn = false;*/ + + /* We don't allow refs to refs. It confuses the hintmask operators */ + /* instead we track down to the base ref */ + for ( i=cnt=0; icharcnt; ++i ) { + sc = sf->chars[i]; + if ( autohint_before_generate && sc!=NULL && + sc->changedsincelasthinted && !sc->manualhints && + !(flags&ps_flag_nohints)) + SplineCharAutoHint(sc,true); + if ( sc==NULL || sc!=SCDuplicate(sc)) + /* Do Nothing */; + else if ( SCWorthOutputting(sc) && + (( sc->layers[ly_fore].refs==NULL && sc->dependents!=NULL && + ( (!sc->hconflicts && !sc->vconflicts) || + Type2SpecialCase(sc)) ) )) { + /* Put the */ + /* character into a subr if it is referenced by other characters */ + ++cnt; + sc->lsidebearing = 0; /* anything other than 0x7fff */ + } else + sc->lsidebearing = 0x7fff; + } + + subrs->cnt = cnt; + if ( cnt==0 ) +return( subrs); + subrs->lens = galloc(cnt*sizeof(int)); + subrs->values = galloc(cnt*sizeof(unsigned char *)); + subrs->keys = galloc(cnt*sizeof(BasePoint *)); + subrs->bias = cnt<1240 ? 107 : + cnt<33900 ? 1131 : 32768; + + for ( i=cnt=0; icharcnt; ++i ) { + sc = sf->chars[i]; + if ( sc==NULL || sc!=SCDuplicate(sc)) + /* Do Nothing */; + else if ( sc->lsidebearing!=0x7fff ) { + subrs->keys[cnt] = gcalloc(2,sizeof(BasePoint)); + if (( !sc->hconflicts && !sc->vconflicts ) || (flags&ps_flag_nohints)) + subrs->values[cnt] = SplineChar2PSOutline2(sc,&subrs->lens[cnt], + (BasePoint *) (subrs->keys[cnt]),flags); + else + subrs->values[cnt] = SplineChar2PS2(sc,&subrs->lens[cnt],0,0, + subrs,(BasePoint *) (subrs->keys[cnt]),flags); + sc->lsidebearing = cnt++ - subrs->bias; + } + if ( !GProgressNext()) { + PSCharsFree(subrs); +return( NULL ); + } + } + subrs->next = cnt; +return( subrs ); +} + +struct pschars *SplineFont2Chrs2(SplineFont *sf, int nomwid, int defwid, + struct pschars *subrs,int flags) { + struct pschars *chrs = gcalloc(1,sizeof(struct pschars)); + int i, cnt; + char notdefentry[20]; + SplineChar *sc; + int fixed = SFOneWidth(sf), notdefwidth; + int zero_is_notdef; + + /* real_warn = false; */ /* Should have been done by SplineFont2Subrs2 */ + + notdefwidth = fixed; + if ( notdefwidth==-1 ) notdefwidth = sf->ascent+sf->descent; + + cnt = 0; + for ( i=0; icharcnt; ++i ) { + sc = sf->chars[i]; +#if HANYANG + if ( sc!=NULL && sc->compositionunit ) + /* don't output it, should be in a subroutine */; + else +#endif + if ( SCWorthOutputting(sc) && sc==SCDuplicate(sc)) + ++cnt; + } +/* only honor the width on .notdef in non-fixed pitch fonts (or ones where there is an actual outline in notdef) */ + zero_is_notdef = SCIsNotdef(sf->chars[0],fixed); + if ( !zero_is_notdef ) + ++cnt; /* one notdef entry */ + chrs->cnt = cnt; + chrs->lens = galloc(cnt*sizeof(int)); + chrs->values = galloc(cnt*sizeof(unsigned char *)); + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->ttf_glyph = -1; +/* only honour the width on .notdef in non-fixed pitch fonts (or ones where there is an actual outline in notdef) */ + if ( zero_is_notdef ) { + chrs->values[0] = SplineChar2PS2(sf->chars[0],&chrs->lens[0],nomwid,defwid,subrs,NULL,flags); + sf->chars[0]->ttf_glyph = 0; + i = 1; + } else { + char *pt = notdefentry; + if ( notdefwidth==defwid ) + /* Don't need to specify it */; + else { + notdefwidth -= nomwid; + if ( notdefwidth>=-107 && notdefwidth<=107 ) + *pt++ = notdefwidth+139; + else if ( notdefwidth>=108 && notdefwidth<=1131 ) { + notdefwidth -= 108; + *pt++ = (notdefwidth>>8)+247; + *pt++ = notdefwidth&0xff; + } else if ( notdefwidth>=-1131 && notdefwidth<=-108 ) { + notdefwidth = -notdefwidth; + notdefwidth -= 108; + *pt++ = (notdefwidth>>8)+251; + *pt++ = notdefwidth&0xff; + } else { + *pt++ = 28; + *pt++ = (notdefwidth>>8)&0xff; + *pt++ = notdefwidth&0xff; + } + } + *pt++ = '\016'; /* endchar */ + *pt = '\0'; + chrs->values[0] = (unsigned char *) copyn(notdefentry,pt-notdefentry); /* 0 hsbw endchar */ + chrs->lens[0] = pt-notdefentry; + i = 0; + } + cnt = 1; + for ( ; icharcnt; ++i ) { + sc = sf->chars[i]; +#if 0 && HANYANG /* Too many places know the glyph cnt, can't refigure it here at the end */ + if ( sc!=NULL && sc->compositionunit ) + /* don't output it, should be in a subroutine */; + else +#endif + if ( SCWorthOutputting(sc) && sc==SCDuplicate(sc)) { + chrs->values[cnt] = SplineChar2PS2(sc,&chrs->lens[cnt],nomwid,defwid,subrs,NULL,flags); + sf->chars[i]->ttf_glyph = cnt++; + } + if ( !GProgressNext()) { + PSCharsFree(chrs); +return( NULL ); + } + } + chrs->next = cnt; +return( chrs ); +} + +struct pschars *CID2Chrs2(SplineFont *cidmaster,struct fd2data *fds,int flags) { + struct pschars *chrs = gcalloc(1,sizeof(struct pschars)); + int i, cnt, cid, max; + char notdefentry[20]; + SplineChar *sc; + SplineFont *sf = NULL; + /* In a cid-keyed font, cid 0 is defined to be .notdef so there are no */ + /* special worries. If it is defined we use it. If it is not defined */ + /* we add it. */ + + /* real_warn = false; */ + + max = 0; + for ( i=0; isubfontcnt; ++i ) + if ( maxsubfonts[i]->charcnt ) + max = cidmaster->subfonts[i]->charcnt; + cnt = 1; /* for .notdef */ + for ( cid = 1; cidsubfontcnt; ++i ) { + sf = cidmaster->subfonts[i]; + if ( cidcharcnt && SCWorthOutputting(sf->chars[cid])) { + ++cnt; + break; + } + } + } + + chrs->cnt = cnt; + chrs->lens = galloc(cnt*sizeof(int)); + chrs->values = galloc(cnt*sizeof(unsigned char *)); + + for ( i=0; isubfontcnt; ++i ) { + sf = cidmaster->subfonts[i]; + for ( cid=0; cidcharcnt; ++cid ) if ( sf->chars[cid]!=NULL ) + sf->chars[cid]->ttf_glyph = -1; + } + + for ( cid = cnt = 0; cidsubfontcnt; ++i ) { + sf = cidmaster->subfonts[i]; + if ( cidcharcnt && SCWorthOutputting(sf->chars[cid]) ) + break; + } + if ( cid!=0 && i==cidmaster->subfontcnt ) { + /* Do nothing */; + } else if ( i==cidmaster->subfontcnt ) { + /* They didn't define CID 0 */ + /* Place it in the final subfont (which is what sf points to) */ + int w = sf->ascent+sf->descent; char *pt = notdefentry; + --i; + if ( w==fds[i].defwid ) + /* Don't need to specify it */; + else { + w -= fds[i].nomwid; + if ( w>=-107 && w<=107 ) + *pt++ = w+139; + else if ( w>=108 && w<=1131 ) { + w -= 108; + *pt++ = (w>>8)+247; + *pt++ = w&0xff; + } else if ( w>=-1131 && w<=-108 ) { + w = -w; + w -= 108; + *pt++ = (w>>8)+251; + *pt++ = w&0xff; + } else { + *pt++ = 28; + *pt++ = (w>>8)&0xff; + *pt++ = w&0xff; + } + } + *pt++ = '\016'; /* endchar */ + *pt = '\0'; + chrs->values[0] = (unsigned char *) copyn(notdefentry,pt-notdefentry); /* 0 hsbw endchar */ + chrs->lens[0] = pt-notdefentry; + ++cnt; +#if 0 && HANYANG /* Too much stuff knows the glyph cnt, can't refigure it here at the end */ + } else if ( sf->chars[cid]->compositionunit ) { + /* don't output it, should be in a subroutine */; +#endif + } else { + sc = sf->chars[cid]; + chrs->values[cnt] = SplineChar2PS2(sc,&chrs->lens[cnt], + fds[i].nomwid,fds[i].defwid,fds[i].subrs,NULL,flags); + sc->ttf_glyph = cnt++; + } + GProgressNext(); + } + chrs->next = cnt; +return( chrs ); +} diff --git a/fontforge/splinesaveafm.c b/fontforge/splinesaveafm.c new file mode 100644 index 00000000..d603871a --- /dev/null +++ b/fontforge/splinesaveafm.c @@ -0,0 +1,2094 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include "splinefont.h" +#include +#include +#include +#include + +extern char *zapfnomen[]; +extern short zapfwx[]; +extern short zapfbb[][4]; +extern char zapfexists[]; + +int lig_script = CHR('*',' ',' ',' '); +int lig_lang = DEFAULT_LANG; +int *lig_tags=NULL; + +#define SPECIAL_TEMPORARY_LIGATURE_TAG 1 + /* This is a special tag value which I use internally. It is not a valid */ + /* feature tag (not 4 ascii characters) so there should be no confusion */ + /* When generating an afm file and I'm given the ligatures "ffi->f f i" */ + /* "ff->f f" then generate the third ligature "ffi->ff i" on a temporary */ + /* basis. AFM files can't deal with three character ligatures */ + +static void *mygets(FILE *file,char *buffer,int size) { + char *end = buffer+size-1; + char *pt = buffer; + int ch; + + while ( (ch=getc(file))!=EOF && ch!='\r' && ch!='\n' && ptkerns; kp!=NULL && kp->sc!=sc2; kp = kp->next ); + if ( kp!=NULL ) + kp->off = off; + else if ( off!=0 ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = sc2; + kp->off = off; + kp->sli = SFAddScriptLangIndex(sc1->parent, + SCScriptFromUnicode(sc1),DEFAULT_LANG); + if ( isv ) { + kp->next = sc1->vkerns; + sc1->vkerns = kp; + } else { + kp->next = sc1->kerns; + sc1->kerns = kp; + } + } + } +} + +int LoadKerningDataFromAfm(SplineFont *sf, char *filename) { + FILE *file = fopen(filename,"r"); + char buffer[200], *pt, *ept, ch; + SplineChar *sc1, *sc2; + int off; + char name[44], second[44], lig[44]; + PST *liga; + + if ( file==NULL ) +return( 0 ); + GProgressChangeLine2R(_STR_ReadingAFM); + while ( mygets(file,buffer,sizeof(buffer))!=NULL ) { + if ( strncmp(buffer,"KPX",3)==0 || strncmp(buffer,"KPY",3)==0 ) { + int isv = strncmp(buffer,"KPY",3)==0; + for ( pt=buffer+3; isspace(*pt); ++pt); + for ( ept = pt; *ept!='\0' && !isspace(*ept); ++ept ); + ch = *ept; *ept = '\0'; + sc1 = SFGetChar(sf,-1,pt); + *ept = ch; + for ( pt=ept; isspace(*pt); ++pt); + for ( ept = pt; *ept!='\0' && !isspace(*ept); ++ept ); + ch = *ept; *ept = '\0'; + sc2 = SFGetChar(sf,-1,pt); + *ept = ch; + off = strtol(ept,NULL,10); + KPInsert(sc1,sc2,off,isv); + } else if ( sscanf( buffer, "C %*d ; WX %*d ; N %40s ; B %*d %*d %*d %*d ; L %40s %40s", + name, second, lig)==3 ) { + sc1 = SFGetChar(sf,-1,lig); + sc2 = SFGetChar(sf,-1,name); + if ( sc2==NULL ) + sc2 = SFGetChar(sf,-1,second); + if ( sc1!=NULL ) { + sprintf( buffer, "%s %s", name, second); + for ( liga=sc1->possub; liga!=NULL; liga=liga->next ) { + if ( liga->type == pst_ligature && strcmp(liga->u.lig.components,buffer)==0 ) + break; + } + if ( liga==NULL ) { + liga = chunkalloc(sizeof(PST)); + liga->tag = CHR('l','i','g','a'); + liga->script_lang_index = SFAddScriptLangIndex(sf, + SCScriptFromUnicode(sc2),DEFAULT_LANG); + liga->type = pst_ligature; + liga->next = sc1->possub; + sc1->possub = liga; + liga->u.lig.lig = sc1; + liga->u.lig.components = copy( buffer ); + } + } + } + } + fclose(file); +return( 1 ); +} + +static void CheckMMAfmFile(SplineFont *sf,char *amfm_filename,char *fontname) { + /* the afm file should be in the same directory as the amfm file */ + /* with the fontname as the filename */ + char *temp, *pt; + + free(sf->fontname); + sf->fontname = copy(fontname); + + temp = galloc(strlen(amfm_filename)+strlen(fontname)+strlen(".afm")+1); + strcpy(temp, amfm_filename); + pt = strrchr(temp,'/'); + if ( pt==NULL ) pt = temp; + else ++pt; + strcpy(pt,fontname); + pt += strlen(pt); + strcpy(pt,".afm"); + if ( !LoadKerningDataFromAfm(sf,temp) ) { + strcpy(pt,".AFM"); + LoadKerningDataFromAfm(sf,temp); + } + free(temp); +} + +int LoadKerningDataFromAmfm(SplineFont *sf, char *filename) { + FILE *file=NULL; + char buffer[280], *pt, lastname[256]; + int index, i; + MMSet *mm = sf->mm; + + if ( mm!=NULL ) + file = fopen(filename,"r"); + pt = strstrmatch(filename,".amfm"); + if ( pt!=NULL ) { + char *afmname = copy(filename); + strcpy(afmname+(pt-filename),isupper(pt[1])?".AFM":".afm"); + LoadKerningDataFromAfm(mm->normal,afmname); + free(afmname); + } + if ( file==NULL ) +return( 0 ); + + GProgressChangeLine2R(_STR_ReadingAFM); + while ( fgets(buffer,sizeof(buffer),file)!=NULL ) { + if ( strstrmatch(buffer,"StartMaster")!=NULL ) + break; + } + index = -1; lastname[0] = '\0'; + while ( fgets(buffer,sizeof(buffer),file)!=NULL ) { + if ( strstrmatch(buffer,"EndMaster")!=NULL ) { + if ( lastname[0]!='\0' && index!=-1 && indexinstance_count ) + CheckMMAfmFile(mm->instances[index],filename,lastname); + index = -1; lastname[0] = '\0'; + } else if ( sscanf(buffer,"FontName %256s", lastname )== 1 ) { + /* Do Nothing, all done */ + } else if ( (pt = strstr(buffer,"WeightVector"))!=NULL ) { + pt += strlen("WeightVector"); + while ( *pt==' ' || *pt=='[' ) ++pt; + i = 0; + while ( *pt!=']' && *pt!='\0' ) { + if ( *pt=='0' ) + ++i; + else if ( *pt=='1' ) { + index = i; + break; + } + ++pt; + } + } + } + fclose(file); +return( true ); +} + +int CheckAfmOfPostscript(SplineFont *sf,char *psname) { + char *new, *pt; + int ret; + int wasuc=false; + + new = galloc(strlen(psname)+6); + strcpy(new,psname); + pt = strrchr(new,'.'); + if ( pt==NULL ) pt = new+strlen(new); + else wasuc = isupper(pt[1]); + + if ( sf->mm!=NULL ) { + strcpy(pt,wasuc?".AMFM":".amfm"); + if ( !LoadKerningDataFromAmfm(sf,new)) { + strcpy(pt,wasuc?".amfm":".AMFM"); + ret = LoadKerningDataFromAmfm(sf,new); + } else + ret = true; + /* The above routine reads from the afm file if one exist */ + } else { + strcpy(pt,wasuc?".AFM":".afm"); + if ( !LoadKerningDataFromAfm(sf,new)) { + strcpy(pt,wasuc?".afm":".AFM"); + ret = LoadKerningDataFromAfm(sf,new); + } else + ret = true; + } + free(new); +return( ret ); +} + +static void SubsNew(SplineChar *to,enum possub_type type,int tag,char *components, + SplineChar *default_script) { + PST *pst; + + pst = chunkalloc(sizeof(PST)); + pst->type = type; + pst->script_lang_index = SCDefaultSLI(to->parent,default_script); + pst->tag = tag; + pst->u.alt.components = components; + if ( type == pst_ligature ) + pst->u.lig.lig = to; + SCInsertPST(to,pst); +} + +static void PosNew(SplineChar *to,int tag,int dx, int dy, int dh, int dv) { + PST *pst; + + pst = chunkalloc(sizeof(PST)); + pst->type = pst_position; + pst->script_lang_index = SCDefaultSLI(to->parent,to); + pst->tag = tag; + pst->u.pos.xoff = dx; + pst->u.pos.yoff = dy; + pst->u.pos.h_adv_off = dh; + pst->u.pos.v_adv_off = dv; + SCInsertPST(to,pst); +} + +static void LigatureNew(SplineChar *sc3,SplineChar *sc1,SplineChar *sc2) { + char *components = galloc(strlen(sc1->name)+strlen(sc2->name)+2); + strcpy(components,sc1->name); + strcat(components," "); + strcpy(components,sc2->name); + SubsNew(sc3,pst_ligature,CHR('l','i','g','a'),components,sc1); +} + +static void tfmDoLigKern(SplineFont *sf, int enc, int lk_index, + uint8 *ligkerntab, uint8 *kerntab) { + int enc2, k_index; + SplineChar *sc1, *sc2, *sc3; + real off; + + if ( enc>=sf->charcnt || (sc1=sf->chars[enc])==NULL ) +return; + + while ( 1 ) { + enc2 = ligkerntab[lk_index*4+1]; + if ( enc2>=sf->charcnt || (sc2=sf->chars[enc2])==NULL ) + /* Not much we can do. can't kern to a non-existant char */; + else if ( ligkerntab[lk_index*4+2]>=128 ) { + k_index = ((ligkerntab[lk_index*4+2]-128)*256+ligkerntab[lk_index*4+3])*4; + off = (sf->ascent+sf->descent) * + ((kerntab[k_index]<<24) + (kerntab[k_index+1]<<16) + + (kerntab[k_index+2]<<8) + kerntab[k_index+3])/ + (double) 0x100000; + /* printf( "%s(%d) %s(%d) -> %g\n", sc1->name, sc1->enc, sc2->name, sc2->enc, off); */ + KPInsert(sc1,sc2,off,false); + } else if ( ligkerntab[lk_index*4+2]==0 && + ligkerntab[lk_index*4+3]charcnt && + (sc3=sf->chars[ligkerntab[lk_index*4+3]])!=NULL ) { + LigatureNew(sc3,sc1,sc2); + } + if ( ligkerntab[lk_index*4]>=128 ) + break; + lk_index += ligkerntab[lk_index*4] + 1; + } +} + +static void tfmDoCharList(SplineFont *sf,int i,int *charlist) { + int used[256], ucnt, len, was; + char *components; + + if ( i>=sf->charcnt || sf->chars[i]==NULL ) +return; + + ucnt = 0, len=0; + while ( i!=-1 ) { + if ( icharcnt && sf->chars[i]!=NULL ) { + used[ucnt++] = i; + len += strlen(sf->chars[i]->name)+1; + } + was = i; + i = charlist[i]; + charlist[was] = -1; + } + if ( ucnt<=1 ) +return; + + components = galloc(len+1); components[0] = '\0'; + for ( i=1; ichars[used[i]]->name); + if ( i!=ucnt-1 ) + strcat(components," "); + } + SubsNew(sf->chars[used[0]],pst_alternate,CHR('T','C','H','L'),components, + sf->chars[used[0]]); +} + +static void tfmDoExten(SplineFont *sf,int i,uint8 *ext) { + int j, len, k; + char *names[4], *components; + + if ( i>=sf->charcnt || sf->chars[i]==NULL ) +return; + + names[0] = names[1] = names[2] = names[3] = ".notdef"; + for ( j=len=0; j<4; ++j ) { + k = ext[j]; + if ( kcharcnt && sf->chars[k]!=NULL ) + names[j] = sf->chars[k]->name; + len += strlen(names[j])+1; + } + components = galloc(len); components[0] = '\0'; + for ( j=0; j<4; ++j ) { + strcat(components,names[j]); + if ( j!=3 ) + strcat(components," "); + } + SubsNew(sf->chars[i],pst_multiple,CHR('T','E','X','L'),components, + sf->chars[i]); +} + +static void tfmDoItalicCor(SplineFont *sf,int i,uint8 *ic) { + int cor = (ic[0]<<24)|(ic[1]<<16)|(ic[2]<<8)|ic[3]; + + if ( i>=sf->charcnt || sf->chars[i]==NULL ) +return; + + PosNew(sf->chars[i],CHR('I','T','L','C'),0,0, + ((double)cor)*(sf->ascent+sf->descent)/(1<<20),0); +} + +int LoadKerningDataFromTfm(SplineFont *sf, char *filename) { + FILE *file = fopen(filename,"rb"); + int i, tag, left, ictag; + uint8 *ligkerntab, *kerntab, *ext, *ictab; + int head_len, first, last, width_size, height_size, depth_size, italic_size, + ligkern_size, kern_size, esize, param_size; + int charlist[256], ept[256]; + + if ( file==NULL ) +return( 0 ); + /* file length = */ getushort(file); + head_len = getushort(file); + first = getushort(file); + last = getushort(file); + width_size = getushort(file); + height_size = getushort(file); + depth_size = getushort(file); + italic_size = getushort(file); + ligkern_size = getushort(file); + kern_size = getushort(file); + esize = getushort(file); + param_size = getushort(file); + if ( first-1>last || last>=256 ) { + fclose(file); +return( 0 ); + } + kerntab = gcalloc(kern_size,sizeof(int32)); + ligkerntab = gcalloc(ligkern_size,sizeof(int32)); + ext = gcalloc(esize,sizeof(int32)); + ictab = gcalloc(italic_size,sizeof(int32)); + fseek( file,(6+1)*sizeof(int32),SEEK_SET); + sf->texdata.designsize = getlong(file); + fseek( file, + (6+head_len+(last-first+1)+width_size+height_size+depth_size)*sizeof(int32), + SEEK_SET); + fread( ictab,1,italic_size*sizeof(int32),file); + fread( ligkerntab,1,ligkern_size*sizeof(int32),file); + fread( kerntab,1,kern_size*sizeof(int32),file); + fread( ext,1,esize*sizeof(int32),file); + for ( i=0; i<22 && itexdata.params[i] = getlong(file); + if ( param_size==22 ) sf->texdata.type = tex_math; + else if ( param_size==13 ) sf->texdata.type = tex_mathext; + else if ( param_size>=7 ) sf->texdata.type = tex_text; + + memset(charlist,-1,sizeof(charlist)); + memset(ept,-1,sizeof(ept)); + + fseek( file, (6+head_len)*sizeof(int32), SEEK_SET); + for ( i=first; i<=last; ++i ) { + /* width = */ getc(file); + /* height<<4 | depth indeces = */ getc( file ); + ictag = getc(file); + tag = (ictag&3); + ictag>>=2; + left = getc(file); + if ( tag==1 ) + tfmDoLigKern(sf,i,left,ligkerntab,kerntab); + else if ( tag==2 ) + charlist[i] = left; + else if ( tag==3 ) + tfmDoExten(sf,i,ext+left); + if ( ictag!=0 ) + tfmDoItalicCor(sf,i,ictab+ictag); + } + + for ( i=first; i<=last; ++i ) { + if ( charlist[i]!=-1 ) + tfmDoCharList(sf,i,charlist); + } + + free( ligkerntab); free(kerntab); free(ext); free(ictab); + fclose(file); +return( 1 ); +} + +char *EncodingName(int map) { + + if ( map>=em_unicodeplanes && map<=em_unicodeplanesmax ) { + static char space[40]; + /* What is the proper encoding for a font consisting of SMP? */ + /* I'm guessing at ISO10646-2, but who knows */ + sprintf( space, "ISO10646-%d", map-em_unicodeplanes+1 ); +return( space ); + } + + switch ( map ) { + case em_adobestandard: +return( "AdobeStandardEncoding" ); + case em_iso8859_1: +return( "ISOLatin1Encoding" ); + case em_iso8859_2: +return( "ISO8859-2" ); + case em_iso8859_3: +return( "ISO8859-3" ); + case em_iso8859_4: +return( "ISO8859-4" ); + case em_iso8859_5: +return( "ISO8859-5" ); + case em_iso8859_6: +return( "ISO8859-6" ); + case em_iso8859_7: +return( "ISO8859-7" ); + case em_iso8859_8: +return( "ISO8859-8" ); + case em_iso8859_9: +return( "ISO8859-9" ); + case em_iso8859_10: +return( "ISO8859-10" ); + case em_iso8859_11: +return( "ISO8859-11" ); + case em_iso8859_13: +return( "ISO8859-13" ); + case em_iso8859_14: +return( "ISO8859-14" ); + case em_iso8859_15: +return( "ISO8859-15" ); + case em_unicode: case em_unicode4: +return( "ISO10646-1" ); + case em_mac: +return( "MacRoman" ); + case em_win: +return( "WinRoman" ); + case em_koi8_r: +return( "KOI8R" ); + case em_jis208: case em_sjis: +return( "JISX0208.1997" ); + case em_jis212: +return( "JISX0212.1990" ); + case em_ksc5601: case em_wansung: +return( "KSC5601.1992" ); + case em_gb2312: case em_jisgb: +return( "GB2312.1980" ); + case em_big5: +return( "BIG5" ); /* 2002? */ + case em_big5hkscs: +return( "BIG5HKSCS.2001" ); + case em_johab: +return( "Johab" ); + default: + if ( map>=em_base ) { + Encoding *item; + for ( item=enclist; item!=NULL && item->enc_num!=map; item=item->next ); + if ( item!=NULL ) +return( item->enc_name ); + } +return( "FontSpecific" ); + } +} + +static int ScriptLangMatchLigOuts(PST *lig,SplineFont *sf) { + int i,j; + struct script_record *sr; + + if ( lig_tags==NULL ) { + lig_tags = gcalloc(3,sizeof(uint32)); + lig_tags[0] = CHR('l','i','g','a'); + lig_tags[1] = CHR('r','l','i','g'); + lig_tags[2] = 0; + } + + if ( lig->tag==SPECIAL_TEMPORARY_LIGATURE_TAG ) /* Special hack for the temporary 2 character intermediate ligatures we generate. We've already decided to output them */ +return( true ); + + for ( i=0; lig_tags[i]!=0 && lig_tags[i]!=lig->tag; ++i ); + if ( lig_tags[i]==0 ) +return( false ); + + if ( sf->cidmaster!=NULL ) sf=sf->cidmaster; + + if ( sf->script_lang==NULL ) { + GDrawIError("How can there be ligatures with no script/lang list?"); +return( lig_script==CHR('*',' ',' ',' ') && lig_lang==CHR('*',' ',' ',' ') ); + } + + sr = sf->script_lang[lig->script_lang_index]; + for ( i=0; sr[i].script!=0; ++i ) { + if ( sr[i].script==lig_script || lig_script==CHR('*',' ',' ',' ')) { + for ( j=0; sr[i].langs[j]!=0; ++j ) { + if ( sr[i].langs[j]==lig_lang || lig_lang==CHR('*',' ',' ',' ')) +return( true ); + } + if ( lig_script!=CHR('*',' ',' ',' ') ) +return( false ); + } + } +return( false ); +} + +static void AfmLigOut(FILE *afm, SplineChar *sc) { + LigList *ll; + PST *lig; + char *pt, *eos; + + for ( ll=sc->ligofme; ll!=NULL; ll=ll->next ) { + lig = ll->lig; + if ( !ScriptLangMatchLigOuts(lig,sc->parent)) + continue; + pt = strchr(lig->u.lig.components,' '); + eos = strrchr(lig->u.lig.components,' '); + if ( pt!=NULL && eos==pt ) + /* AFM files don't seem to support 3 (or more) letter combos */ + fprintf( afm, " L %s %s ;", pt+1, lig->u.lig.lig->name ); + } +} + +static void AfmSplineCharX(FILE *afm, SplineChar *sc, int enc) { + DBounds b; + int em = (sc->parent->ascent+sc->parent->descent); + + sc = SCDuplicate(sc); + + SplineCharFindBounds(sc,&b); + /*fprintf( afm, "CX <%04x> ; WX %d ; N %s ; B %d %d %d %d ;",*/ + fprintf( afm, "C %d ; WX %d ; ", enc, sc->width*1000/em ); + if ( sc->parent->hasvmetrics ) + fprintf( afm, "WY %d ; ", sc->vwidth*1000/em ); + fprintf( afm, "N %s ; B %d %d %d %d ;", + sc->name, + (int) floor(b.minx*1000/em), (int) floor(b.miny*1000/em), + (int) ceil(b.maxx*1000/em), (int) ceil(b.maxy*1000/em) ); + if (sc->ligofme!=NULL) + AfmLigOut(afm,sc); + putc('\n',afm); + GProgressNext(); +} + +static void AfmZapfCharX(FILE *afm, int zi) { + + /*fprintf( afm, "CX <%04x> ; WX %d ; N %s ; B %d %d %d %d ;\n",*/ + fprintf( afm, "C %d ; WX %d ; N %s ; B %d %d %d %d ;\n", + 0x2700+zi, zapfwx[zi], zapfnomen[zi], + zapfbb[zi][0], zapfbb[zi][1], zapfbb[zi][2], zapfbb[zi][3]); +} + +static void AfmSplineChar(FILE *afm, SplineChar *sc, int enc) { + DBounds b; + int em = (sc->parent->ascent+sc->parent->descent); + + sc = SCDuplicate(sc); + + SplineCharFindBounds(sc,&b); + fprintf( afm, "C %d ; WX %d ; ", enc, sc->width*1000/em ); + if ( sc->parent->hasvmetrics ) + fprintf( afm, "WY %d ; ", sc->vwidth*1000/em ); + fprintf( afm, "N %s ; B %d %d %d %d ;", + sc->name, + (int) floor(b.minx*1000/em), (int) floor(b.miny*1000/em), + (int) ceil(b.maxx*1000/em), (int) ceil(b.maxy*1000/em) ); + if (sc->ligofme!=NULL) + AfmLigOut(afm,sc); + putc('\n',afm); + GProgressNext(); +} + +static void AfmCIDChar(FILE *afm, SplineChar *sc, int enc) { + DBounds b; + int em = (sc->parent->ascent+sc->parent->descent); + + SplineCharFindBounds(sc,&b); + fprintf( afm, "C -1 ; WX %d ; ", sc->width*1000/em ); + if ( sc->parent->hasvmetrics ) + fprintf( afm, "WY %d ; ", sc->vwidth*1000/em ); + fprintf( afm, "N %d ; B %d %d %d %d ;", + enc, + (int) floor(b.minx*1000/em), (int) floor(b.miny*1000/em), + (int) ceil(b.maxx*1000/em), (int) ceil(b.maxy*1000/em) ); + putc('\n',afm); + GProgressNext(); +} + +static int anykerns(SplineFont *sf,int isv) { + int i, cnt = 0; + KernPair *kp; + + for ( i=0; icharcnt; ++i ) { + if ( sf->chars[i]!=NULL && strcmp(sf->chars[i]->name,".notdef")!=0 ) { + for ( kp = isv ? sf->chars[i]->vkerns : sf->chars[i]->kerns; kp!=NULL; kp = kp->next ) + if ( kp->off!=0 && strcmp(kp->sc->name,".notdef")!=0 ) + ++cnt; + } + } +return( cnt ); +} + +static void AfmKernPairs(FILE *afm, SplineChar *sc, int isv) { + KernPair *kp; + int em = (sc->parent->ascent+sc->parent->descent); + + if ( strcmp(sc->name,".notdef")==0 ) +return; + + for ( kp = isv ? sc->vkerns : sc->kerns; kp!=NULL; kp=kp->next ) { + if ( strcmp(kp->sc->name,".notdef")!=0 && kp->off!=0 ) { + if ( isv ) + fprintf( afm, "KPY %s %s %d\n", sc->name, kp->sc->name, kp->off*1000/em ); + else + fprintf( afm, "KPX %s %s %d\n", sc->name, kp->sc->name, kp->off*1000/em ); + } + } +} + +/* Look for character duplicates, such as might be generated by having the same */ +/* glyph at two encoding slots */ +/* I think it is ok if something depends on this character, because the */ +/* code that handles references will automatically unwrap it down to be base */ +SplineChar *SCDuplicate(SplineChar *sc) { + SplineChar *matched = sc; + + if ( sc==NULL || sc->parent->cidmaster!=NULL ) +return( sc ); /* Can't do this in CID keyed fonts */ + + while ( sc->layers[ly_fore].refs!=NULL && sc->layers[ly_fore].refs->next==NULL && + sc->layers[ly_fore].refs->transform[0]==1 && sc->layers[ly_fore].refs->transform[1]==0 && + sc->layers[ly_fore].refs->transform[2]==0 && sc->layers[ly_fore].refs->transform[3]==1 && + sc->layers[ly_fore].refs->transform[4]==0 && sc->layers[ly_fore].refs->transform[5]==0 ) { + char *basename = sc->layers[ly_fore].refs->sc->name; + int len = strlen(basename); + if ( strncmp(sc->name,basename,len)==0 && + (sc->name[len]=='.' || sc->name[len]=='\0')) + matched = sc->layers[ly_fore].refs->sc; + sc = sc->layers[ly_fore].refs->sc; + } +return( matched ); +} + +int SCIsNotdef(SplineChar *sc,int fixed) { +return( sc!=NULL && sc->enc==0 && sc->layers[ly_fore].refs==NULL && strcmp(sc->name,".notdef")==0 && + (sc->layers[ly_fore].splines!=NULL || (sc->widthset && fixed==-1) || + (sc->width!=sc->parent->ascent+sc->parent->descent && fixed==-1 ) || + (sc->width==fixed && fixed!=-1 && sc->widthset))); +} + +int SCWorthOutputting(SplineChar *sc) { +return( sc!=NULL && + ( sc->layers[ly_fore].splines!=NULL || sc->layers[ly_fore].refs!=NULL || sc->widthset || sc->anchor!=NULL || +#if HANYANG + sc->compositionunit || +#endif + sc->dependents!=NULL || + sc->width!=sc->parent->ascent+sc->parent->descent ) && + ( strcmp(sc->name,".notdef")!=0 || sc->enc==0) && + ( (strcmp(sc->name,".null")!=0 && strcmp(sc->name,"glyph1")!=0 && + strcmp(sc->name,"nonmarkingreturn")!=0 && strcmp(sc->name,"glyph2")!=0) || + sc->layers[ly_fore].splines!=NULL || sc->dependents!=NULL || sc->layers[ly_fore].refs!=NULL ) ); +} + +int CIDWorthOutputting(SplineFont *cidmaster, int enc) { + int i; + + if ( enc<0 ) +return( -1 ); + + if ( cidmaster->subfontcnt==0 ) +return( enc>=cidmaster->charcnt?-1:SCWorthOutputting(cidmaster->chars[enc])?0:-1 ); + + for ( i=0; isubfontcnt; ++i ) + if ( encsubfonts[i]->charcnt && + SCWorthOutputting(cidmaster->subfonts[i]->chars[enc])) +return( i ); + +return( -1 ); +} + +static void AfmSplineFontHeader(FILE *afm, SplineFont *sf, int formattype) { + DBounds b; + real width; + int i, j, cnt, max; + int caph, xh, ash, dsh; + int iscid = ( formattype==ff_cid || formattype==ff_otfcid ); + int ismm = ( formattype==ff_mma || formattype==ff_mmb ); + time_t now; + SplineChar *sc; + int em = (sf->ascent+sf->descent); + + if ( iscid && sf->cidmaster!=NULL ) sf = sf->cidmaster; + + max = sf->charcnt; + if ( iscid ) { + max = 0; + for ( i=0; isubfontcnt; ++i ) + if ( sf->subfonts[i]->charcnt>max ) + max = sf->subfonts[i]->charcnt; + } + caph = xh = ash = dsh = 0; cnt = 0; + for ( i=0; isubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) { + sc = sf->subfonts[j]->chars[i]; + break; + } + } else + sc = sf->chars[i]; + if ( sc!=NULL ) { + if ( sc->unicodeenc=='I' || sc->unicodeenc=='x' || + sc->unicodeenc=='p' || sc->unicodeenc=='l' || + sc->unicodeenc==0x399 || sc->unicodeenc==0x3c7 || + sc->unicodeenc==0x3c1 || + sc->unicodeenc==0x406 || sc->unicodeenc==0x445 || + sc->unicodeenc==0x440 ) { + SplineCharFindBounds(sc,&b); + if ( sc->unicodeenc=='I' ) + caph = b.maxy; + else if ( caph==0 && (sc->unicodeenc==0x399 || sc->unicodeenc==0x406)) + caph = b.maxy; + else if ( sc->unicodeenc=='x' ) + xh = b.maxy; + else if ( xh==0 && (sc->unicodeenc==0x3c7 || sc->unicodeenc==0x445)) + xh = b.maxy; + else if ( sc->unicodeenc=='l' ) /* can't find a good equivalent in greek/cyrillic */ + ash = b.maxy; + else if ( sc->unicodeenc=='p' ) + dsh = b.miny; + else if ( dsh==0 && (sc->unicodeenc==0x3c1 || sc->unicodeenc==0x440)) + dsh = b.miny; + } + if ( SCWorthOutputting(sc) || (iscid && i==0 && sc!=NULL)) + ++cnt; + } + } + + fprintf( afm, ismm ? "StarMasterFontMetrics 4.0\n" : + iscid ? "StartFontMetrics 4.1\n" : + "StartFontMetrics 2.0\n" ); + fprintf( afm, "Comment Generated by pfaedit\n" ); + time(&now); + fprintf(afm,"Comment Creation Date: %s", ctime(&now)); + fprintf( afm, "FontName %s\n", sf->fontname ); + if ( sf->fullname!=NULL ) fprintf( afm, "FullName %s\n", sf->fullname ); + if ( sf->familyname!=NULL ) fprintf( afm, "FamilyName %s\n", sf->familyname ); + if ( sf->weight!=NULL ) fprintf( afm, "Weight %s\n", sf->weight ); + /* AFM lines are limitted to 256 characters and US ASCII */ + if ( sf->copyright!=NULL ) { + char *pt, *start, *p; + for ( pt=start=sf->copyright; *pt && pt-start<200 && *pt!='\n'; ++pt ); + fprintf( afm, "Notice (" ); + for ( p=start; p=' ' && *p<0x7f)) + putc(*p,afm); + fprintf( afm, ")\n" ); + while ( *pt ) { + start = pt; + if ( *start=='\n' ) ++start; + for ( pt=start; *pt && pt-start<200 && *pt!='\n'; ++pt ); + fprintf( afm, "Comment " ); + for ( p=start; p=' ' && *p<0x7f)) + putc(*p,afm); + fprintf( afm, "\n" ); + } + } + if ( iscid ) { + fprintf( afm, "Characters %d\n", cnt ); + fprintf( afm, "Version %g\n", sf->cidversion ); + fprintf( afm, "CharacterSet %s-%s-%d\n", sf->cidregistry, sf->ordering, sf->supplement ); + fprintf( afm, "IsBaseFont true\n" ); + fprintf( afm, "IsCIDFont true\n" ); + } + fprintf( afm, "ItalicAngle %g\n", sf->italicangle ); + width = CIDOneWidth(sf); + fprintf( afm, "IsFixedPitch %s\n", width==-1?"false":"true" ); + fprintf( afm, "UnderlinePosition %g\n", sf->upos ); + fprintf( afm, "UnderlineThickness %g\n", sf->uwidth ); + if ( !iscid ) { + if ( sf->version!=NULL ) fprintf( afm, "Version %s\n", sf->version ); + fprintf( afm, "EncodingScheme %s\n", EncodingName(sf->encoding_name)); + } + if ( iscid ) CIDFindBounds(sf,&b); else SplineFontFindBounds(sf,&b); + fprintf( afm, "FontBBox %d %d %d %d\n", + (int) floor(b.minx*1000/em), (int) floor(b.miny*1000/em), + (int) ceil(b.maxx*1000/em), (int) ceil(b.maxy*1000/em) ); + if ( caph!=0 ) + fprintf( afm, "CapHeight %d\n", caph*1000/em ); + if ( xh!=0 ) + fprintf( afm, "XHeight %d\n", xh*1000/em ); + if ( ash!=0 ) + fprintf( afm, "Ascender %d\n", ash*1000/em ); + if ( dsh!=0 ) + fprintf( afm, "Descender %d\n", dsh*1000/em ); +} + +static void LigatureClosure(SplineFont *sf); + +int AfmSplineFont(FILE *afm, SplineFont *sf, int formattype) { + int i, j, cnt, max, vcnt; + int type0 = ( formattype==ff_ptype0 ); + int encmax=!type0?256:65536; + int anyzapf; + int iscid = ( formattype==ff_cid || formattype==ff_otfcid ); + SplineChar *sc; + + SFLigaturePrepare(sf); + LigatureClosure(sf); /* Convert 3 character ligs to a set of two character ones when possible */ + SFKernPrepare(sf,false); /* Undoes kern classes */ + SFKernPrepare(sf,true); + + if ( iscid && sf->cidmaster!=NULL ) sf = sf->cidmaster; + + AfmSplineFontHeader(afm,sf,formattype); + + max = sf->charcnt; + if ( iscid ) { + max = 0; + for ( i=0; isubfontcnt; ++i ) + if ( sf->subfonts[i]->charcnt>max ) + max = sf->subfonts[i]->charcnt; + } + cnt = 0; + for ( i=0; isubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) { + sc = sf->subfonts[j]->chars[i]; + break; + } + } else + sc = sf->chars[i]; + if ( SCWorthOutputting(sc) || (iscid && i==0 && sc!=NULL)) + ++cnt; + } + + anyzapf = false; + if ( type0 && (sf->encoding_name==em_unicode || + sf->encoding_name==em_unicode4)) { + for ( i=0x2700; icharcnt && ichars[i]) ) + anyzapf = true; + if ( !anyzapf ) + for ( i=0; i<0xc0; ++i ) + if ( zapfexists[i]) + ++cnt; + } + + fprintf( afm, "StartCharMetrics %d\n", cnt ); + if ( iscid ) { + for ( i=0; isubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) { + sc = sf->subfonts[j]->chars[i]; + break; + } + if ( SCWorthOutputting(sc) || (i==0 && sc!=NULL) ) + AfmCIDChar(afm, sc, i); + } + } else if ( type0 && sf->encoding_name>=em_jis208 && sf->encoding_name<=em_gb2312 ) { + for ( i=0; icharcnt && ichars[i]) ) { + AfmSplineCharX(afm,sf->chars[i],i); + } + } else if ( type0 ) { + for ( i=0; icharcnt && ichars[i]) ) { + AfmSplineCharX(afm,sf->chars[i],i); + } + if ( !anyzapf ) { + for ( i=0; i<0xc0; ++i ) if ( zapfexists[i] ) + AfmZapfCharX(afm,i); + i += 0x2700; + } + for ( ; icharcnt && ichars[i]) ) { + AfmSplineCharX(afm,sf->chars[i],i); + } + } else { + for ( i=0; icharcnt && ichars[i]) ) { + AfmSplineChar(afm,sf->chars[i],i); + } + } + for ( ; icharcnt ; ++i ) + if ( SCWorthOutputting(sf->chars[i]) ) { + AfmSplineChar(afm,sf->chars[i],-1); + } + fprintf( afm, "EndCharMetrics\n" ); + vcnt = anykerns(sf,true); + if ( (cnt = anykerns(sf,false))>0 || vcnt>0 ) { + fprintf( afm, "StartKernData\n" ); + if ( cnt>0 ) { + fprintf( afm, "StartKernPairs%s %d\n", vcnt==0?"":"0", cnt ); + for ( i=0; icharcnt ; ++i ) + if ( SCWorthOutputting(sf->chars[i]) ) { + AfmKernPairs(afm,sf->chars[i],false); + } + fprintf( afm, "EndKernPairs\n" ); + } + if ( vcnt>0 ) { + fprintf( afm, "StartKernPairs1 %d\n", vcnt ); + for ( i=0; icharcnt ; ++i ) + if ( SCWorthOutputting(sf->chars[i]) ) { + AfmKernPairs(afm,sf->chars[i],true); + } + fprintf( afm, "EndKernPairs\n" ); + } + fprintf( afm, "EndKernData\n" ); + } + fprintf( afm, "EndFontMetrics\n" ); + + SFLigatureCleanup(sf); + SFKernCleanup(sf,false); + SFKernCleanup(sf,true); + +return( !ferror(afm)); +} + +int AmfmSplineFont(FILE *amfm, MMSet *mm, int formattype) { + int i,j; + + AfmSplineFontHeader(amfm,mm->normal,formattype); + fprintf( amfm, "Masters %d\n", mm->instance_count ); + fprintf( amfm, "Axes %d\n", mm->axis_count ); + + fprintf( amfm, "WeightVector [%g", mm->defweights[0] ); + for ( i=1; iinstance_count; ++i ) + fprintf( amfm, " %g", mm->defweights[i]); + fprintf( amfm, "]\n" ); + + fprintf( amfm, "BlendDesignPositions [" ); + for ( i=0; iinstance_count; ++i ) { + fprintf(amfm, "[%g", mm->positions[i*mm->axis_count+0]); + for ( j=1; jaxis_count; ++j ) + fprintf( amfm, " %g", mm->positions[i*mm->axis_count+j]); + fprintf(amfm, i==mm->instance_count-1 ? "]" : "] " ); + } + fprintf( amfm, "]\n" ); + + fprintf( amfm, "BlendDesignMap [" ); + for ( i=0; iaxis_count; ++i ) { + putc('[',amfm); + for ( j=0; jaxismaps[j].points; ++j ) + fprintf(amfm, "[%g %g]", mm->axismaps[i].designs[j], mm->axismaps[i].blends[j]); + fprintf(amfm, i==mm->axis_count-1 ? "]" : "] " ); + } + fprintf( amfm, "]\n" ); + + fprintf( amfm, "BlendAxisTypes [/%s", mm->axes[0] ); + for ( j=1; jaxis_count; ++j ) + fprintf( amfm, " /%s", mm->axes[j]); + fprintf( amfm, "]\n" ); + + for ( i=0; iaxis_count; ++i ) { + fprintf( amfm, "StartAxis\n" ); + fprintf( amfm, "AxisType %s\n", mm->axes[i] ); + fprintf( amfm, "AxisLabel %s\n", MMAxisAbrev(mm->axes[i]) ); + fprintf( amfm, "EndAxis\n" ); + } + + for ( i=0; iinstance_count; ++i ) { + fprintf( amfm, "StartMaster\n" ); + fprintf( amfm, "FontName %s\n", mm->instances[i]->fontname ); + if ( mm->instances[i]->fullname!=NULL ) + fprintf( amfm, "FullName %s\n", mm->instances[i]->fullname ); + if ( mm->instances[i]->familyname!=NULL ) + fprintf( amfm, "FamilyName %s\n", mm->instances[i]->familyname ); + if ( mm->instances[i]->version!=NULL ) + fprintf( amfm, "Version %s\n", mm->instances[i]->version ); + fprintf( amfm, "WeightVector [%d", i==0 ); + for ( j=1; jinstance_count; ++j ) + fprintf( amfm, " %d", i==j ); + fprintf( amfm, "]\n" ); + fprintf( amfm, "EndMaster\n" ); + } + fprintf( amfm, "EndMasterFontMetrics\n" ); +return( !ferror(amfm)); +} + +void SFLigatureCleanup(SplineFont *sf) { + LigList *l, *next; + struct splinecharlist *scl, *sclnext; + int j; + + for ( j=0; jcharcnt; ++j ) if ( sf->chars[j]!=NULL ) { + for ( l = sf->chars[j]->ligofme; l!=NULL; l = next ) { + next = l->next; + for ( scl = l->components; scl!=NULL; scl = sclnext ) { + sclnext = scl->next; + chunkfree(scl,sizeof(struct splinecharlist)); + } + if ( l->lig->tag==SPECIAL_TEMPORARY_LIGATURE_TAG ) { + free(l->lig->u.lig.components); + chunkfree(l->lig,sizeof(PST)); + } + free( l ); + } + sf->chars[j]->ligofme = NULL; + } +} + +void SFLigaturePrepare(SplineFont *sf) { + PST *lig; + LigList *ll; + int i,j,k,ch; + char *pt, *ligstart; + SplineChar *sc, *tsc; + struct splinecharlist *head, *last; + int ccnt, lcnt, lmax=20; + LigList **all = galloc(lmax*sizeof(LigList *)); + + /* First clear out any old stuff */ + for ( j=0; jcharcnt; ++j ) if ( sf->chars[j]!=NULL ) + sf->chars[j]->ligofme = NULL; + + /* Attach all the ligatures to the first character of their components */ + /* Figure out what the components are, and if they all exist */ + /* we're only interested in the lig if all components are worth outputting */ + for ( i=0 ; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->possub!=NULL ) { + for ( lig = sf->chars[i]->possub; lig!=NULL; lig=lig->next ) if ( lig->type==pst_ligature ) { + ligstart = lig->u.lig.components; + last = head = NULL; sc = NULL; + for ( pt = ligstart; *pt!='\0'; ) { + char *start = pt; + for ( ; *pt!='\0' && *pt!=' '; ++pt ); + ch = *pt; *pt = '\0'; + tsc = SFGetCharDup(sf,-1,start); + *pt = ch; + if ( tsc!=NULL ) { + if ( !SCWorthOutputting(tsc)) { + sc = NULL; + break; + } + if ( sc==NULL ) { + sc = tsc; + ccnt = 1; + } else { + struct splinecharlist *cur = chunkalloc(sizeof(struct splinecharlist)); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + cur->sc = tsc; + cur->next = NULL; + ++ccnt; + } + } else { + sc = NULL; + break; + } + while ( *pt==' ' ) ++pt; + } + if ( sc!=NULL ) { + ll = galloc(sizeof(LigList)); + ll->lig = lig; + ll->next = sc->ligofme; + ll->first = sc; + ll->components = head; + ll->ccnt = ccnt; + sc->ligofme = ll; + } else { + while ( head!=NULL ) { + last = head->next; + chunkfree(head,sizeof(*head)); + head = last; + } + } + } + } + for ( i=0 ; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL && sc->ligofme!=NULL ) { + for ( ll=sc->ligofme, lcnt=0; ll!=NULL; ll=ll->next, ++lcnt ); + /* Finally, order the list so that the longest ligatures are first */ + if ( lcnt>1 ) { + if ( lcnt>=lmax ) + all = grealloc(all,(lmax=lcnt+30)*sizeof(LigList *)); + for ( ll=sc->ligofme, k=0; ll!=NULL; ll=ll->next, ++k ) + all[k] = ll; + for ( k=0; kccntccnt ) { + ll = all[k]; + all[k] = all[j]; + all[j] = ll; + } + sc->ligofme = all[0]; + for ( k=0; knext = all[k+1]; + all[k]->next = NULL; + } + } + free( all ); +} + +static void LigatureClosure(SplineFont *sf) { + /* AFM files can only deal with 2 character ligatures */ + /* Look for any three character ligatures (like ffi) which can be made up */ + /* of a two character ligature and their final letter (like "ff" and "i")*/ + /* I'm not going to bother with 4 character ligatures which could be made */ + /* of 2+1+1 because that doesn't happen in latin that I know of, and arabic */ + /* really should be using a type2 font */ + int i; + LigList *l, *l2, *l3; + PST *lig; + SplineChar *sc, *sublig; + + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( l=sc->ligofme; l!=NULL; l=l->next ) if ( ScriptLangMatchLigOuts(l->lig,sf)) { + if ( l->ccnt==3 ) { + /* we've got a 3 character ligature */ + for ( l2=l->next; l2!=NULL; l2=l2->next ) { + if ( l2->lig->tag==l->lig->tag && l2->lig->script_lang_index==l->lig->script_lang_index && + l2->ccnt == 2 && l2->components->sc==l->components->sc ) { + /* We've found a two character sub ligature */ + sublig = l2->lig->u.lig.lig; + for ( l3=sublig->ligofme; l3!=NULL; l3=l3->next ) { + if ( l3->ccnt==2 && l3->components->sc==l->components->next->sc && + ScriptLangMatchLigOuts(l3->lig,sf)) + break; + } + if ( l3!=NULL ) /* The ligature we want to add already exists */ + break; + lig = chunkalloc(sizeof(PST)); + *lig = *l->lig; + lig->tag = SPECIAL_TEMPORARY_LIGATURE_TAG; + lig->next = NULL; + lig->u.lig.components = galloc(strlen(sublig->name)+ + strlen(l->components->next->sc->name)+ + 2); + sprintf(lig->u.lig.components,"%s %s",sublig->name, + l->components->next->sc->name); + l3 = galloc(sizeof(LigList)); + l3->lig = lig; + l3->next = sublig->ligofme; + l3->first = sublig; + l3->ccnt = 2; + sublig->ligofme = l3; + l3->components = chunkalloc(sizeof(struct splinecharlist)); + l3->components->sc = l->components->next->sc; + break; + } + } + } + } + } +} + +void SFKernCleanup(SplineFont *sf,int isv) { + int i; + KernPair *kp, *p, *n; + + if ( (!isv && sf->kerns==NULL) || (isv && sf->vkerns==NULL) ) /* can't have gotten messed up */ +return; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( kp = isv ? sf->chars[i]->vkerns : sf->chars[i]->kerns, p=NULL; kp!=NULL; kp = n ) { + n = kp->next; + if ( kp->kcid!=0 ) { + if ( p!=NULL ) + p->next = n; + else if ( isv ) + sf->chars[i]->vkerns = n; + else + sf->chars[i]->kerns = n; + chunkfree(kp,sizeof(*kp)); + } else + p = kp; + } + } +} + +static void KCSfree(SplineChar ***scs,int cnt) { + int i; + for ( i=1; ikerns; kp!=NULL; kp=kp->next ) + if ( kp->sc == second ) + break; + if ( kp==NULL ) { + kp = chunkalloc(sizeof(KernPair)); + kp->sc = second; + kp->off = offset; + kp->sli = sli; + kp->flags = flags; + kp->kcid = kcid; + if ( isv ) { + kp->next = first->vkerns; + first->vkerns = kp; + } else { + kp->next = first->kerns; + first->kerns = kp; + } + } +} + +void SFKernPrepare(SplineFont *sf,int isv) { + KernClass *kc, *head= isv ? sf->vkerns : sf->kerns; + SplineChar ***first, ***last; + int i, j, k, l; + + for ( kc = head, i=0; kc!=NULL; kc = kc->next ) + kc->kcid = ++i; + for ( kc = head; kc!=NULL; kc = kc->next ) { + first = KernClassToSC(sf,kc->firsts,kc->first_cnt); + last = KernClassToSC(sf,kc->seconds,kc->second_cnt); + for ( i=1; ifirst_cnt; ++i ) for ( j=1; jsecond_cnt; ++j ) { + if ( kc->offsets[i*kc->second_cnt+j]!=0 ) { + for ( k=0; first[i][k]!=NULL; ++k ) + for ( l=0; last[j][l]!=NULL; ++l ) + AddTempKP(first[i][k],last[j][l], + kc->offsets[i*kc->second_cnt+j], + kc->sli,kc->flags, kc->kcid,isv); + } + } + KCSfree(first,kc->first_cnt); + KCSfree(last,kc->second_cnt); + } +} + +static void putlshort(short val,FILE *pfm) { + putc(val&0xff,pfm); + putc(val>>8,pfm); +} + +static void putlint(int val,FILE *pfm) { + putc(val&0xff,pfm); + putc((val>>8)&0xff,pfm); + putc((val>>16)&0xff,pfm); + putc((val>>24)&0xff,pfm); +} + +int PfmSplineFont(FILE *pfm, SplineFont *sf, int type0) { + int caph=0, xh=0, ash=0, dsh=0, cnt=0, first=-1, samewid=-1, maxwid= -1, last=0, wid=0, ymax=0, ymin=0; + int kerncnt=0, spacepos=0x20; + int i; + char *pt; + KernPair *kp; + /* my docs imply that pfm files can only handle 1byte fonts */ + /* Ah, but Adobe's technical note 5178.PFM.PDF gives the two byte format */ + long size, devname, facename, extmetrics, exttable, driverinfo, kernpairs, pos; + DBounds b; + int style; + + SFKernPrepare(sf,false); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]!=NULL && sf->chars[i]->unicodeenc==' ' ) + spacepos = i; + if ( SCWorthOutputting(sf->chars[i]) ) { + ++cnt; + if ( sf->chars[i]->unicodeenc=='I' || sf->chars[i]->unicodeenc=='x' || + sf->chars[i]->unicodeenc=='H' || sf->chars[i]->unicodeenc=='d' || + sf->chars[i]->unicodeenc=='p' || sf->chars[i]->unicodeenc=='l' ) { + SplineCharFindBounds(sf->chars[i],&b); + if ( ymaxb.miny ) ymin = b.miny; + if ( sf->chars[i]->unicodeenc=='I' || sf->chars[i]->unicodeenc=='H' ) + caph = b.maxy; + else if ( sf->chars[i]->unicodeenc=='x' ) + xh = b.maxy; + else if ( sf->chars[i]->unicodeenc=='d' || sf->chars[i]->unicodeenc=='l' ) + ash = b.maxy; + else + dsh = b.miny; + } + if ( samewid==-1 ) + samewid = sf->chars[i]->width; + else if ( samewid!=sf->chars[i]->width ) + samewid = -2; + if ( maxwidchars[i]->width ) + maxwid = sf->chars[i]->width; + if ( first==-1 ) + first = i; + wid += sf->chars[i]->width; + last = i; + if ( i<256 ) for ( kp=sf->chars[i]->kerns; kp!=NULL; kp = kp->next ) + if ( kp->sc->enc<256 ) + ++kerncnt; + } + } + if ( spaceposlast ) last = spacepos; + if ( cnt!=0 ) wid /= cnt; + if ( kerncnt>=512 ) kerncnt = 512; + + SFDefaultOS2Info(&sf->pfminfo,sf,sf->fontname); + + putlshort(0x100,pfm); /* format version number */ + size = ftell(pfm); + putlint(-1,pfm); /* file size, fill in later */ + i=0; + if ( sf->copyright!=NULL ) for ( pt=sf->copyright; *pt && i<60; ++i, ++pt ) + putc(*pt,pfm); + for ( ; i<60; ++i ) + putc(' ',pfm); + putlshort(0x81,pfm); /* type flags */ + putlshort(10,pfm); /* point size, not really meaningful */ + putlshort(300,pfm); /* vert resolution */ + putlshort(300,pfm); /* hor resolution */ + putlshort(ymax,pfm); /* ascent (Adobe says the "ascent" is the max high in the font's bounding box) */ + if ( caph==0 ) caph = ash; + if ( ymax-ymin>=sf->ascent+sf->descent ) + putlshort(0,pfm); /* Adobe says so */ + else + putlshort(sf->ascent+sf->descent-(ymax-ymin),pfm); /* Internal leading */ + putlshort(196*(sf->ascent+sf->descent)/1000,pfm); /* External leading, Adobe says 196 */ + style = MacStyleCode(sf,NULL); + putc(style&sf_italic?1:0,pfm); /* is italic */ + putc(0,pfm); /* underline */ + putc(0,pfm); /* strikeout */ + putlshort(sf->pfminfo.weight,pfm); /* weight */ + if ( sf->encoding_name==em_jis208 || sf->encoding_name==em_jis212 || + sf->encoding_name==em_sjis || + (sf->cidmaster!=NULL && strnmatch(sf->cidmaster->ordering,"Japan",5)==0 )) + putc(128,pfm); + else if ( sf->encoding_name==em_ksc5601 || sf->encoding_name==em_johab || + sf->encoding_name==em_wansung || + (sf->cidmaster!=NULL && strnmatch(sf->cidmaster->ordering,"Korea",5)==0 )) + putc(129,pfm); + else if ( sf->encoding_name==em_big5 || sf->encoding_name==em_big5hkscs || + (sf->cidmaster!=NULL && strnmatch(sf->cidmaster->ordering,"CNS",3)==0 )) + putc(136,pfm); + else if ( sf->encoding_name==em_gb2312 || sf->encoding_name==em_jisgb || + (sf->cidmaster!=NULL && strnmatch(sf->cidmaster->ordering,"GB",2)==0 )) + putc(134,pfm); + else + putc(sf->encoding_name==em_symbol?2:0,pfm); /* charset. I'm always saying windows roman (ANSI) or symbol because I don't know the other choices */ + putlshort(/*samewid<0?sf->ascent+sf->descent:samewid*/0,pfm); /* width */ + putlshort(sf->ascent+sf->descent,pfm); /* height */ + putc(sf->pfminfo.pfmfamily,pfm); /* family */ + putlshort(wid,pfm); /* average width, Docs say "Width of "X", but that's wrong */ + putlshort(maxwid,pfm); /* max width */ + + if ( first>255 ) first=last = 0; + else if ( last>255 ) { first=32; last = 255;}/* Yes, even for 2 byte fonts we do this (Adobe says so)*/ + putc(first,pfm); /* first char */ + putc(last,pfm); + if ( spacepos>=first && spacepos<=last ) { + putc(spacepos-first,pfm); /* default char */ + putc(spacepos-first,pfm); /* wordbreak */ + } else { + putc(0,pfm); /* default character. I set to space */ + putc(0,pfm); /* word break character. I set to space */ + } + putlshort(0,pfm); /* width bytes. Not meaningful for ps */ + + devname = ftell(pfm); + putlint(-1,pfm); /* offset to device name, fill in later */ + facename = ftell(pfm); + putlint(-1,pfm); /* offset to face name, fill in later */ + putlint(0,pfm); /* bits pointer. not used */ + putlint(0,pfm); /* bits offset. not used */ + +/* No width table */ + +/* extensions */ + putlshort(0x1e,pfm); /* size of extensions table */ + extmetrics = ftell(pfm); + putlint(-1,pfm); /* extent metrics. fill in later */ + exttable = ftell(pfm); + putlint(-1,pfm); /* extent table. fill in later */ + putlint(0,pfm); /* origin table. not used */ + kernpairs = ftell(pfm); + putlint(kerncnt==0?0:-1,pfm); /* kern pairs. fill in later */ + putlint(0,pfm); /* kern track. I don't understand it so I'm leaving it out */ + driverinfo = ftell(pfm); + putlint(-1,pfm); /* driver info. fill in later */ + putlint(0,pfm); /* reserved. mbz */ + +/* devicename */ + pos = ftell(pfm); + fseek(pfm,devname,SEEK_SET); + putlint(pos,pfm); + fseek(pfm,pos,SEEK_SET); + for ( pt="Postscript"/*"\273PostScript\253"*/; *pt; ++pt ) + putc(*pt,pfm); + putc('\0',pfm); + +/* facename */ + pos = ftell(pfm); + fseek(pfm,facename,SEEK_SET); + putlint(pos,pfm); + fseek(pfm,pos,SEEK_SET); + if ( sf->familyname!=NULL ) { + for ( pt=sf->familyname; *pt; ++pt ) + putc(*pt,pfm); + } else { + for ( pt=sf->fontname; *pt; ++pt ) + putc(*pt,pfm); + } + putc('\0',pfm); + +/* extmetrics */ + pos = ftell(pfm); + fseek(pfm,extmetrics,SEEK_SET); + putlint(pos,pfm); + fseek(pfm,pos,SEEK_SET); + putlshort(0x34,pfm); /* size */ + putlshort(240,pfm); /* 12 point in twentieths of a point */ + putlshort(0,pfm); /* any orientation */ + putlshort(sf->ascent+sf->descent,pfm); /* master height */ + putlshort(3,pfm); /* min scale */ + putlshort(1000,pfm); /* max scale */ + putlshort(sf->ascent+sf->descent,pfm); /* master units */ + putlshort(caph,pfm); /* cap height */ + putlshort(xh,pfm); /* x height */ + putlshort(ash,pfm); /* lower case ascent height */ + putlshort(-dsh,pfm); /* lower case descent height */ + putlshort((int) (10*sf->italicangle),pfm); /* italic angle */ + putlshort(-xh,pfm); /* super script */ + putlshort(xh/2,pfm); /* sub script */ + putlshort(2*(sf->ascent+sf->descent)/3,pfm); /* super size */ + putlshort(2*(sf->ascent+sf->descent)/3,pfm); /* sub size */ + putlshort(-sf->upos,pfm); /* underline pos */ + putlshort(sf->uwidth,pfm); /* underline width */ + putlshort(-sf->upos,pfm); /* real underline pos */ + putlshort(-sf->upos+2*sf->uwidth,pfm); /* real underline second line pos */ + putlshort(sf->uwidth,pfm); /* underline width */ + putlshort(sf->uwidth,pfm); /* underline width */ + putlshort((xh+sf->uwidth)/2,pfm); /* strike out top */ + putlshort(sf->uwidth,pfm); /* strike out width */ + putlshort(kerncnt,pfm); /* number of kerning pairs <= 512 */ + putlshort(0,pfm); /* kerning tracks <= 16 */ + +/* extent table */ + pos = ftell(pfm); + fseek(pfm,exttable,SEEK_SET); + putlint(pos,pfm); + fseek(pfm,pos,SEEK_SET); + for ( i=first; i<=last; ++i ) + if ( sf->chars[i]==NULL ) + putlshort(0,pfm); + else + putlshort(sf->chars[i]->width,pfm); + +/* driver info */ /* == ps font name */ + pos = ftell(pfm); + fseek(pfm,driverinfo,SEEK_SET); + putlint(pos,pfm); + fseek(pfm,pos,SEEK_SET); + for ( pt=sf->fontname; *pt; ++pt ) + putc(*pt,pfm); + putc('\0',pfm); + +/* kern pairs */ + if ( kerncnt!=0 ) { + pos = ftell(pfm); + fseek(pfm,kernpairs,SEEK_SET); + putlint(pos,pfm); + fseek(pfm,pos,SEEK_SET); + putlshort(kerncnt,pfm); /* number of kerning pairs <= 512 */ + kerncnt = 0; + for ( i=first; ichars[i]!=NULL ) { + if ( SCWorthOutputting(sf->chars[i]) ) { + for ( kp=sf->chars[i]->kerns; kp!=NULL; kp = kp->next ) + if ( kp->sc->enc<256 && kerncnt<512 ) { + putc(i,pfm); + putc(kp->sc->enc,pfm); + putlshort(kp->off,pfm); + ++kerncnt; + } + } + } + } + +/* kern track */ + /* I'm ignoring this */ + +/* file size */ + pos = ftell(pfm); + fseek(pfm,size,SEEK_SET); + putlint(pos,pfm); + + SFKernCleanup(sf,false); + +return( !ferror(pfm)); +} + +typedef uint32 fix_word; + +struct tfm_header { + uint32 checksum; /* don't know how to calculate this, use 0 to ignore it */ + fix_word design_size; /* in points (10<<20 seems to be default) */ + char encoding[40]; /* first byte is length, rest are a string that names the encoding */ + /* ASCII, TeX text, TeX math extension, XEROX, GRAPHIC, UNSPECIFIED */ + char family[20]; /* Font Family, preceded by a length byte */ + uint8 seven_bit_safe_flag; + uint8 ignored[2]; + uint8 face; /* 0=>roman, 1=>italic */ + /* 4=>light, 0=>medium, 2=>bold */ + /* 6=>condensed, 0=>regular, 12=>extended */ +}; + +struct tfm_params { + fix_word slant; /* -sin(italic_angle) (a small positive number) */ + fix_word space; /* inter-word spacing (advance width of space) */ + fix_word space_stretch; /* inter-word glue stretching */ + /* About 1/2 space for cmr */ + fix_word space_shrink; /* inter-word glue shrinking */ + /* About 1/3 space for cmr */ + fix_word x_height; + fix_word quad; /* == 1.0 */ + fix_word extra_space; /* added at end of sentences */ + /* same as space_shrink for cmr */ +/* tex math and tex math extension have extra parameters. They are not */ +/* explained (page 7) */ +}; +struct ligkern { + uint8 skip; + uint8 other_char; + uint8 op; + uint8 remainder; + struct ligkern *next; +}; + +static struct ligkern *TfmAddKern(KernPair *kp,struct ligkern *last,double *kerns, + int *_kcnt) { + struct ligkern *new = gcalloc(1,sizeof(struct ligkern)); + int i; + + new->other_char = kp->sc->enc; + for ( i=*_kcnt-1; i>=0 ; --i ) + if ( kerns[i] == kp->off ) + break; + if ( i<0 ) { + i = (*_kcnt)++; + kerns[i] = kp->off; + } + new->remainder = i&0xff; + new->op = 128 + (i>>8); + new->next = last; +return( new ); +} + +static struct ligkern *TfmAddLiga(LigList *l,struct ligkern *last) { + struct ligkern *new; + + if ( l->lig->u.lig.lig->enc>=256 ) +return( last ); + if ( l->components==NULL || l->components->sc->enc>=256 || l->components->next!=NULL ) +return( last ); + new = gcalloc(1,sizeof(struct ligkern)); + new->other_char = l->components->sc->enc; + new->remainder = l->lig->u.lig.lig->enc; + new->next = last; + new->op = 0*4 + 0*2 + 0; + /* delete next char, delete current char, start over and check the resultant ligature for more ligs */ +return( new ); +} + +static void FindCharlists(SplineFont *sf,int *charlistindex) { + PST *pst; + int i, last, ch; + char *pt, *end; + SplineChar *sc; + + memset(charlistindex,-1,257*sizeof(int)); + for ( i=0; i<256 && icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i])) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) + if ( pst->type == pst_alternate && pst->tag==CHR('T','C','H','L')) + break; + if ( pst!=NULL ) { + last = i; + for ( pt=pst->u.alt.components; *pt; pt = end ) { + end = strchr(pt,' '); + if ( end==NULL ) + end = pt+strlen(pt); + ch = *end; + *end = '\0'; + sc = SFGetCharDup(sf,-1,pt); + *end = ch; + while ( *end==' ' ) ++end; + if ( sc!=NULL && sc->enc<256 ) { + charlistindex[last] = sc->enc; + last = sc->enc; + } + } + } + } +} + +static int FindExtensions(SplineFont *sf,int *extensions,int *extenindex) { + PST *pst; + int i, ecnt=0, ch; + char *pt, *end; + int founds[4], fcnt; + SplineChar *sc; + + memset(extenindex,-1,257*sizeof(int)); + for ( i=0; i<256 && icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i])) { + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) + if ( pst->type == pst_multiple && pst->tag==CHR('T','E','X','L')) + break; + if ( pst!=NULL ) { + fcnt = 0; + founds[0] = founds[1] = founds[2] = founds[3] = 0; + for ( pt=pst->u.alt.components; *pt; pt = end ) { + end = strchr(pt,' '); + if ( end==NULL ) + end = pt+strlen(pt); + ch = *end; + *end = '\0'; + sc = SFGetCharDup(sf,-1,pt); + *end = ch; + while ( *end==' ' ) ++end; + if ( sc!=NULL && sc->enc<256 ) { + if ( fcnt<4 ) + founds[fcnt++] = sc->enc; + } else + founds[fcnt++] = 0; + } + if ( fcnt==1 ) { + founds[3] = founds[0]; + founds[0] = 0; + } + if ( fcnt>0 ) { + extenindex[i] = ecnt; + extensions[ecnt++] = (founds[0]<<24) | + (founds[1]<<16) | + (founds[2]<<8) | + founds[3]; + } + } + } +return( ecnt ); +} + +static int CoalesceValues(double *values,int max,int *index) { + int i,j,k,top, offpos,diff; + int backindex[257]; + double off, test; + double topvalues[257], totvalues[257]; + int cnt[257]; + + values[256] = 0; + for ( i=0; i<257; ++i ) + backindex[i] = i; + + /* sort */ + for ( i=0; i<256; ++i ) for ( j=i+1; j<257; ++j ) { + if ( values[i]>values[j] ) { + int l = backindex[i]; + double val = values[i]; + backindex[i] = backindex[j]; + values[i] = values[j]; + backindex[j] = l; + values[j] = val; + } + } + for ( i=0; i<257; ++i ) + index[backindex[i]] = i; + top = 257; + for ( i=0; ii+1 ) { + int diff = j-i-1; + for ( k=i+1; k+diff=j ) + index[k] -= diff; + else if ( index[k]>i ) + index[k] = i; + } + top -= diff; + } + cnt[i] = j-i; + } + if ( top<=max ) +return( top ); + + for ( i=0; imax ) { + off = fabs(topvalues[0]-values[1]); + offpos = 0; + for ( i=1; ioffpos ) + index[k] -= diff; + } + top -= diff; + } + values[0] = 0; + for ( i=1; itexdata.type!=tex_unset ) +return; + + spacew = rint(.33*(1<<20)); /* 1/3 em for a space seems like a reasonable size */ + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->unicodeenc==' ' ) { + spacew = rint((sf->chars[i]->width<<20)/(sf->ascent+sf->descent)); + break; + } + QuickBlues(sf,&bd); + + memset(sf->texdata.params,0,sizeof(sf->texdata.params)); + sf->texdata.designsize = 10<<20; /* Default to 10pt */ + sf->texdata.params[0] = rint( -sin(sf->italicangle)*(1<<20) ); /* slant */ + sf->texdata.params[1] = spacew; /* space */ + sf->texdata.params[2] = rint(spacew/2); /* stretch_space */ + sf->texdata.params[3] = rint(spacew/3); /* shrink space */ + if ( bd.xheight>0 ) + sf->texdata.params[4] = rint((((double) bd.xheight)*(1<<20))/(sf->ascent+sf->descent)); + sf->texdata.params[5] = 1<<20; /* quad */ + sf->texdata.params[6] = rint(spacew/3); /* extra space after sentence period */ + + /* Let's provide some vaguely reasonable defaults for math fonts */ + /* I'll ignore math ext fonts */ + /* hmm. TeX math fonts have space, stretch, shrink set to 0 */ + sf->texdata.params[7] = rint(.747*(1<<20)); + sf->texdata.params[8] = rint(.424*(1<<20)); + sf->texdata.params[9] = rint(.474*(1<<20)); + sf->texdata.params[10] = rint(.756*(1<<20)); + sf->texdata.params[11] = rint(.375*(1<<20)); + sf->texdata.params[12] = rint(.413*(1<<20)); + sf->texdata.params[13] = rint(.363*(1<<20)); + sf->texdata.params[14] = rint(.289*(1<<20)); + sf->texdata.params[15] = rint(.15*(1<<20)); + sf->texdata.params[16] = rint(.309*(1<<20)); + sf->texdata.params[17] = rint(.386*(1<<20)); + sf->texdata.params[18] = rint(.05*(1<<20)); + sf->texdata.params[19] = rint(2.39*(1<<20)); + sf->texdata.params[20] = rint(1.01*(1<<20)); + sf->texdata.params[21] = rint(.25*(1<<20)); +} + +int TfmSplineFont(FILE *tfm, SplineFont *sf, int formattype) { + struct tfm_header header; + char *full=NULL, *encname; + int i; + DBounds b; + struct ligkern *ligkerns[256], *lk; + double widths[257], heights[257], depths[257], italics[257]; + uint8 tags[256], lkindex[256]; + int former[256]; + int charlistindex[257], extensions[257], extenindex[257]; + int widthindex[257], heightindex[257], depthindex[257], italicindex[257]; + double *kerns; + int widcnt, hcnt, dcnt, icnt, kcnt, lkcnt, pcnt, ecnt; + int first, last; + KernPair *kp; + LigList *l; + int style, any; + uint32 *lkarray; + PST *pst; + char *familyname; + + SFLigaturePrepare(sf); + LigatureClosure(sf); /* Convert 3 character ligs to a set of two character ones when possible */ + SFKernPrepare(sf,false); /* Undoes kern classes */ + TeXDefaultParams(sf); + + memset(&header,0,sizeof(header)); + header.checksum = 0; /* don't check checksum (I don't know how to calculate it) */ + header.design_size = sf->texdata.designsize; + encname=NULL; + if ( sf->subfontcnt==0 && sf->encoding_name!=em_custom && !sf->compacted ) + encname = EncodingName(sf->encoding_name ); + if ( encname==NULL ) { + full = galloc(strlen(sf->fontname)+10); + strcpy(full,sf->fontname); + strcat(full,"-Enc"); + encname = full; + } + header.encoding[0] = strlen(encname); + if ( header.encoding[0]>39 ) { + header.encoding[0] = 39; + memcpy(header.encoding+1,encname,39); + } else + strcpy(header.encoding+1,encname); + if ( full ) free(full); + + familyname = sf->cidmaster ? sf->cidmaster->familyname : sf->familyname; + header.family[0] = strlen(familyname); + if ( header.family[0]>19 ) { + header.family[0] = 19; + memcpy(header.family+1,familyname,19); + } else + strcpy(header.family+1,familyname); + for ( i=128; icharcnt && i<256; ++i ) + if ( SCWorthOutputting(sf->chars[i])) + break; + if ( i>=sf->charcnt || i>=256 ) + header.seven_bit_safe_flag = true; + style = MacStyleCode(sf,NULL); + if ( style&sf_italic ) + header.face = 1; + if ( style&sf_bold ) + header.face+=2; + else if ( strstrmatch(sf->fontname,"Ligh") || + strstrmatch(sf->fontname,"Thin") || + strstrmatch(sf->fontname,"Maigre") || + strstrmatch(sf->fontname,"Mager") ) + header.face += 4; + if ( style&sf_condense ) + header.face += 6; + else if ( style&sf_extend ) + header.face += 12; + + pcnt = sf->texdata.type==tex_math ? 22 : sf->texdata.type==tex_mathext ? 13 : 7; + + memset(widths,0,sizeof(widths)); + memset(heights,0,sizeof(heights)); + memset(depths,0,sizeof(depths)); + memset(italics,0,sizeof(italics)); + memset(tags,0,sizeof(tags)); + first = last = -1; + for ( i=0; i<256 && icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i])) { + SplineCharFindBounds(sf->chars[i],&b); + widths[i] = sf->chars[i]->width; + if ( b.maxy>0 ) + heights[i] = b.maxy; + if ( b.miny<0 ) + depths[i] = -b.miny; + if ( (pst=SCFindPST(sf->chars[i],pst_position,CHR('I','T','L','C'),-1,-1))!=NULL ) + italics[i] = pst->u.pos.h_adv_off; + else if ( (style&sf_italic) && b.maxx>sf->chars[i]->width ) + italics[i] = (b.maxx-sf->chars[i]->width) + + (sf->ascent+sf->descent)/16.0; + /* With a 1/16 em white space after it */ + if ( first==-1 ) first = i; + last = i; + } + widcnt = CoalesceValues(widths,256,widthindex); + hcnt = CoalesceValues(heights,16,heightindex); + dcnt = CoalesceValues(depths,16,depthindex); + icnt = CoalesceValues(italics,16,italicindex); + if ( last==-1 ) { first = 1; last = 0; } + + FindCharlists(sf,charlistindex); + ecnt = FindExtensions(sf,extensions,extenindex); + + kcnt = 0; + for ( i=0; i<256 && icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i])) { + SplineChar *sc = sf->chars[i]; + for ( kp=sc->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc->enc<256 ) ++kcnt; + } + kerns = NULL; + if ( kcnt!=0 ) + kerns = galloc(kcnt*sizeof(double)); + kcnt = lkcnt = 0; + memset(ligkerns,0,sizeof(ligkerns)); + for ( i=0; i<256 && icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i])) { + SplineChar *sc = sf->chars[i]; + for ( kp=sc->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sc->enc<256 ) + ligkerns[i] = TfmAddKern(kp,ligkerns[i],kerns,&kcnt); + for ( l=sc->ligofme; l!=NULL; l=l->next ) + ligkerns[i] = TfmAddLiga(l,ligkerns[i]); + if ( ligkerns[i]!=NULL ) { + tags[i] = 1; + for ( lk=ligkerns[i]; lk!=NULL; lk=lk->next ) + ++lkcnt; + } + if ( extenindex[i]!=-1 ) + tags[i] = 3; + else if ( charlistindex[i]!=-1 ) + tags[i] = 2; + } + lkarray = galloc(lkcnt*sizeof(uint32)); + memset(former,-1,sizeof(former)); + memset(lkindex,0,sizeof(lkindex)); + lkcnt = 0; + do { + any = false; + for ( i=0; i<256; ++i ) if ( ligkerns[i]!=NULL ) { + lk = ligkerns[i]; + ligkerns[i] = lk->next; + if ( former[i]!=-1 ) + lkarray[former[i]] |= (lkcnt-former[i]-1)<<24; + else + lkindex[i] = lkcnt; + former[i] = lkcnt; + lkarray[lkcnt++] = ((lk->next==NULL?128:0)<<24) | + (lk->other_char<<16) | + (lk->op<<8) | + lk->remainder; + free( lk ); + any = true; + } + } while ( any ); + +/* Now output the file */ + /* Table of contents */ + putshort(tfm, + 6+ /* Table of contents size */ + 18 + /* header size */ + (last-first+1) + /* Per glyph data */ + widcnt + /* entries in the width table */ + hcnt + /* entries in the height table */ + dcnt + /* entries in the depth table */ + icnt + /* entries in the italic correction table */ + lkcnt + /* entries in the lig/kern table */ + kcnt + /* entries in the kern table */ + ecnt + /* No extensible characters here */ + pcnt); /* font parameter words */ + putshort(tfm,18); + putshort(tfm,first); + putshort(tfm,last); + putshort(tfm,widcnt); + putshort(tfm,hcnt); + putshort(tfm,dcnt); + putshort(tfm,icnt); + putshort(tfm,lkcnt); + putshort(tfm,kcnt); + putshort(tfm,ecnt); + putshort(tfm,pcnt); + /* header */ + putlong(tfm,header.checksum); + putlong(tfm,header.design_size); + fwrite(header.encoding,1,sizeof(header.encoding),tfm); + fwrite(header.family,1,sizeof(header.family),tfm); + fwrite(&header.seven_bit_safe_flag,1,4,tfm); + /* per-glyph data */ + for ( i=first; i<=last ; ++i ) { + if ( SCWorthOutputting(sf->chars[i])) { + putc(widthindex[i],tfm); + putc((heightindex[i]<<4)|depthindex[i],tfm); + putc((italicindex[i]<<2)|tags[i],tfm); + putc(tags[i]==0?0 : + tags[i]==1?lkindex[i] : + tags[i]==2?charlistindex[i] : + extenindex[i],tfm); + } else { + putlong(tfm,0); + } + } + /* width table */ + for ( i=0; iascent+sf->descent)); + /* height table */ + for ( i=0; iascent+sf->descent)); + /* depth table */ + for ( i=0; iascent+sf->descent)); + /* italic correction table */ + for ( i=0; iascent+sf->descent)); + /* lig/kern table */ + for ( i=0; iascent+sf->descent)); + /* extensible table */ + for ( i=0; itexdata.params[i]); + + SFLigatureCleanup(sf); + SFKernCleanup(sf,false); + +return( !ferror(tfm)); +} diff --git a/fontforge/splinestroke.c b/fontforge/splinestroke.c new file mode 100644 index 00000000..59a68f05 --- /dev/null +++ b/fontforge/splinestroke.c @@ -0,0 +1,1760 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include "splinefont.h" +#include +#include + +#define PI 3.1415926535897932 + +typedef struct joininfo { + SplinePoint *from, *to; + real tprev; + real tnext; + BasePoint inter; +} JointPoint; + + +static real SplineAngle(Spline *spline,real t) { + Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; + real xslope = (3*xsp->a*t+2*xsp->b)*t + xsp->c; + real yslope = (3*ysp->a*t+2*ysp->b)*t + ysp->c; + + if ( xslope==0 && yslope==0 ) { + real faket = (t>.5) ? t-.01 : t+.01; + xslope = (3*xsp->a*faket+2*xsp->b)*faket + xsp->c; + yslope = (3*ysp->a*faket+2*ysp->b)*faket + ysp->c; + } + if ( spline->knownlinear || ( xslope==0 && yslope==0 )) { + xslope = spline->to->me.x-spline->from->me.x; + yslope = spline->to->me.y-spline->from->me.y; + } +return( atan2(yslope,xslope) ); +} + +static int PenCorner(double lineangle,StrokeInfo *si) { + + if ( ( lineangle>=si->penangle && lineangle<=si->penangle+PI/2 ) || + ( lineangle+2*PI>=si->penangle && lineangle+2*PI<=si->penangle+PI/2 ) || + ( lineangle-2*PI>=si->penangle && lineangle-2*PI<=si->penangle+PI/2 ) ) { +return( 0 ); + } else if ( ( lineangle>=si->penangle+PI/2 && lineangle<=si->penangle+PI ) || + ( lineangle+2*PI>=si->penangle+PI/2 && lineangle+2*PI<=si->penangle+PI ) || + ( lineangle-2*PI>=si->penangle+PI/2 && lineangle-2*PI<=si->penangle+PI ) ) { +return( 1 ); + } else if ( ( lineangle>=si->penangle+PI && lineangle<=si->penangle+3*PI/2 ) || + ( lineangle+2*PI>=si->penangle+PI && lineangle+2*PI<=si->penangle+3*PI/2 ) || + ( lineangle-2*PI>=si->penangle+PI && lineangle-2*PI<=si->penangle+3*PI/2 ) ) { +return( 2 ); + } else { +return( 3 ); + } +} + +/* the plus point is where we go when we rotate the line's direction by +90degrees */ +/* and then move radius in that direction. minus is when we rotate -90 and */ +/* then move */ /* counter-clockwise */ +static double SplineExpand(Spline *spline,real t,real toff, StrokeInfo *si, + BasePoint *plus, BasePoint *minus) { + Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; + BasePoint base; + double lineangle, c,s, factor = 1.0; + + if ( si->factor!=NULL ) + factor = (si->factor)(si->data,spline,t); + + base.x = ((xsp->a*t+xsp->b)*t+xsp->c)*t + xsp->d; + base.y = ((ysp->a*t+ysp->b)*t+ysp->c)*t + ysp->d; + + lineangle = SplineAngle(spline,t+toff); + if ( si->stroke_type != si_caligraphic ) { + c = si->radius*factor*cos(lineangle+PI/2); + s = si->radius*factor*sin(lineangle+PI/2); + plus->y = base.y+s; + plus->x = base.x+c; + minus->y = base.y-s; + minus->x = base.x-c; + } else { + int corner = PenCorner(lineangle,si); + plus->x = base.x + factor*si->xoff[corner]; + plus->y = base.y + factor*si->yoff[corner]; + corner += 2; + minus->x = base.x + factor*si->xoff[corner]; + minus->y = base.y + factor*si->yoff[corner]; + } +return( lineangle ); +} + +static SplinePoint *makequartercircle(real x, real y, real radius, + real xmul, real ymul,SplinePoint *prev) { + SplinePoint *here = SplinePointCreate(x,y); + + if ( xmul==0 ) { + here->nextcp.x = here->prevcp.x = x; + here->nextcp.y = y + .552*ymul*radius; + here->prevcp.y = y - .552*ymul*radius; + } else { + here->nextcp.y = here->prevcp.y = y; + here->nextcp.x = x + .552*xmul*radius; + here->prevcp.x = x - .552*xmul*radius; + } + here->nonextcp = here->noprevcp = false; + if ( prev!=NULL ) + SplineMake3(prev,here); +return( here ); +} + +static SplinePoint *makeline(SplinePoint *prev, real x, real y) { + SplinePoint *here = SplinePointCreate(x,y); + here->pointtype = pt_corner; + if ( prev!=NULL ) + SplineMake3(prev,here); +return( here ); +} + +static void SinglePointStroke(SplinePoint *base, StrokeInfo *si, SplinePoint **_plus, SplinePoint **_minus) { + SplinePoint *plus, *cur; + + /* A single point, is kind of dull. + For a caligraphic pen, it's just a copy of the pen + For a linecap of lc_butt it's still a point + For a linecap of lc_round it's a circle + For a linecap of lc_square it should be a square... + but how does one orient that square? probably a circle is best + here too + */ + /* We don't have a spline, so don't try guessing factor */ + if ( si->stroke_type == si_caligraphic ) { + plus = SplinePointCreate(base->me.x+si->xoff[0],base->me.y+si->yoff[0]); + plus->pointtype = pt_corner; + cur = makeline(plus,base->me.x+si->xoff[1],base->me.y+si->yoff[1]); + cur = makeline(cur,base->me.x+si->xoff[2],base->me.y+si->yoff[2]); + cur = makeline(cur,base->me.x+si->xoff[3],base->me.y+si->yoff[3]); + SplineMake3(cur,plus); + *_plus = *_minus = plus; + } else if ( si->cap!=lc_butt ) { + plus = makequartercircle(base->me.x-si->radius,base->me.y,si->radius,0,1,NULL); + cur = makequartercircle(base->me.x,base->me.y+si->radius,si->radius,1,0,plus); + cur = makequartercircle(base->me.x+si->radius,base->me.y,si->radius,0,-1,cur); + cur = makequartercircle(base->me.x,base->me.y-si->radius,si->radius,-1,0,cur); + SplineMake3(cur,plus); + *_plus = *_minus = plus; + } else { + *_plus = *_minus = cur = chunkalloc(sizeof(SplinePoint)); + *cur = *base; + cur->hintmask = NULL; + } +} + +static SplinePoint *StrokeEnd(SplinePoint *base, StrokeInfo *si, int isstart, + SplinePoint **_to) { + BasePoint junk; + SplinePoint *mid1, *mid2, *cur, *from, *to; + real c,s; + real angle; + real sign; + real factor = si->factor==NULL ? 1.0 : + base->next!=NULL ? (si->factor)(si->data,base->next,0) : + base->prev!=NULL ? (si->factor)(si->data,base->prev,1) : + 1.0; + + from = chunkalloc(sizeof(SplinePoint)); + to = chunkalloc(sizeof(SplinePoint)); + from->nonextcp = to->nonextcp = from->noprevcp = to->noprevcp = true; + from->pointtype = pt_corner; to->pointtype = pt_corner; + if ( isstart ) + angle = SplineExpand(base->next,0,0,si,&from->me,&to->me)+ PI; + else + angle = SplineExpand(base->prev,1,0,si,&to->me,&from->me); + if ( si->stroke_type == si_caligraphic ) { + int corner; + corner = PenCorner(angle,si); + cur = makeline(from,base->me.x+factor*si->xoff[corner+1],base->me.y+factor*si->yoff[corner+1]); + SplineMake3(cur,to); + } else { + if ( isstart ) { + SplineIsLinearMake(base->next); + angle = SplineExpand(base->next,0,0,si,&junk,&junk)+ PI; + sign = -1; + } else { + SplineIsLinearMake(base->prev); + angle = SplineExpand(base->prev,1,0,si,&junk,&junk); + sign = -1; + } + if ( si->cap==lc_butt ) { + SplineMake3(from,to); /* draw a line between */ + } else if ( si->cap==lc_square ) { + mid1 = SplinePointCreate( + from->me.x+ sign*(from->me.y-base->me.y), + from->me.y- sign*(from->me.x-base->me.x)); + mid2 = SplinePointCreate( + to->me.x+ sign*(from->me.y-base->me.y), + to->me.y- sign*(from->me.x-base->me.x)); + mid1->pointtype = pt_corner; mid2->pointtype = pt_corner; + SplineMake3(from,mid1); + SplineMake3(mid1,mid2); + SplineMake3(mid2,to); + } else if ( si->cap==lc_round ) { + mid1 = chunkalloc(sizeof(SplinePoint)); + mid1->me.x = base->me.x+ sign*(from->me.y-base->me.y); + mid1->me.y = base->me.y- sign*(from->me.x-base->me.x); + mid1->pointtype = pt_curve; + c = .552*si->radius*factor*cos(angle); + s = .552*si->radius*factor*sin(angle); + from->nextcp.x = from->me.x + c; + from->nextcp.y = from->me.y + s; + from->nonextcp = false; + to->prevcp.x = to->me.x +c; + to->prevcp.y = to->me.y +s; + to->noprevcp = false; + mid1->prevcp.x = mid1->me.x - sign*s; + mid1->prevcp.y = mid1->me.y + sign*c; + mid1->nextcp.x = mid1->me.x + sign*s; + mid1->nextcp.y = mid1->me.y - sign*c; + SplineMake3(from,mid1); + SplineMake3(mid1,to); + } + } + SplinePointCatagorize(to); + SplinePointCatagorize(from); + *_to = to; +return( from ); +} + +/* Is this the inner intersection or the outer one (the inner one is on both splines) */ +/* the outer one is beyond both */ +static int Intersect_Lines(BasePoint *inter,BasePoint *p1,real sx1, real sy1, + BasePoint *p2, real sx2, real sy2, real radius) { + real t1/*,t2*/; + real denom; + + denom = (sx1*sy2-sx2*sy1); + if ( denom>-.0001 && denom<.0001 ) { + /* Lines are parallel. Might be coincident, might not */ + t1 = 10000; + } else { + /* t2 = (sy1*(p2->x-p1->x)-sx1*(p2->y-p1->y))/denom;*/ + t1 = (sy2*(p2->x-p1->x)-sx2*(p2->y-p1->y))/denom; + } + if ( t1>1000 || t1<-1000 ) { + denom = sqrt(sx1*sx1 + sy1*sy1)/radius; + inter->x = (p1->x+p2->x)/2 + sx1/denom; + inter->y = (p1->y+p2->y)/2 + sy1/denom; +return( -1 ); + } else { + inter->x = p1->x + t1*sx1; + inter->y = p1->y + t1*sy1; +return( t1<=0 ); /* if t1 < 0 then the intersection point is actually */ + /* on both of the spline segments. if it isn't then */ + /* it will be on the continuation of the spline */ + /* but beyond its endpoint... */ + } +} + +static double CircleCpDist(double angle) { + /* To draw an arc of length angle on a unit circle, the control points */ + /* should be this far from their base points. Determined empirically, */ + /* fit by least squares */ + + if ( angle<0 ) angle = -angle; + while ( angle>2*PI ) angle -= 2*PI; + if ( angle>PI ) angle = 2*PI-angle; +return( ((0.0115445*angle - 0.0111987)*angle + 0.357114)*angle ); +} + +static SplinePoint *ChordMid(double angle,BasePoint *center,BasePoint *from, + double *_cpratio) { + BasePoint off, new; + double s,c,cpratio; + SplinePoint *sp; + + if ( angle<0 ) angle = -angle; + while ( angle>2*PI ) angle -= 2*PI; + if ( angle>PI ) angle = 2*PI-angle; + angle /= 2; + + off.x = from->x-center->x; + off.y = from->y-center->y; + s = sin(angle); c = cos(angle); + new.x = c*off.x - s*off.y; + new.y = s*off.x + c*off.y; + sp = SplinePointCreate(new.x+center->x,new.y+center->y); + + *_cpratio = cpratio = CircleCpDist(angle); + new.x *= cpratio; new.y *= cpratio; /* new is a vector of length radius pointing perp to the direction of the cps */ + /* We need to multiply by cp ratio and rotate 90 degrees */ + sp->prevcp.x = sp->me.x + new.y; + sp->prevcp.y = sp->me.y - new.x; + sp->nextcp.x = sp->me.x - new.y; + sp->nextcp.y = sp->me.y + new.x; + sp->nonextcp = sp->noprevcp = false; +return( sp ); +} + +static void MakeJoints(SplinePoint *from,SplinePoint *to,StrokeInfo *si, + BasePoint *inter, BasePoint *center, + int incr,double pangle, double nangle, real factor) { + SplinePoint *mid; + int cstart, cend, i; + + if ( si->stroke_type == si_caligraphic ) { + cstart = PenCorner(pangle,si); + cend = PenCorner(nangle,si); + if ( cstart==cend ) { + /* same as a miter join */ + mid = SplinePointCreate(inter->x,inter->y); + mid->pointtype = pt_corner; + SplineMake3(from,mid); + SplineMake3(mid,to); + } else { + if ( incr<0 ) { + if ((cstart += 2)>=4 ) cstart -= 4; + if ((cend += 2)>=4 ) cend -= 4; + incr = 1; /* Why??? */ + } + if ( incr>0 && cstart>cend ) + cend += 4; + else if ( incr<0 && cstartx+factor*si->xoff[i],center->y+factor*si->yoff[i]); + i += incr; + } + SplineMake3(mid,to); + } + } else if ( si->join==lj_bevel ) { + SplineMake3(from,to); + } else if ( si->join == lj_miter ) { + mid = SplinePointCreate(inter->x,inter->y); + mid->pointtype = pt_corner; + SplineMake3(from,mid); + SplineMake3(mid,to); + } else { + double cplen = CircleCpDist(nangle-pangle); + mid = NULL; + if ( cplen>.6 ) { + /* If angle of the arc is more than about 90 degrees a cubic */ + /* spline is noticeably different from a circle's arc */ + /* So add an extra point to help things out */ + mid = ChordMid(nangle-pangle,center,&from->me,&cplen); + } + cplen *= si->radius*factor; + from->pointtype = to->pointtype = pt_curve; + from->nextcp.x = from->me.x-cplen*cos(nangle); + from->nextcp.y = from->me.y-cplen*sin(nangle); + to->prevcp.x = to->me.x+cplen*cos(pangle); + to->prevcp.y = to->me.y+cplen*sin(pangle); + from->nonextcp = false; to->noprevcp = false; + if ( mid==NULL ) + SplineMake3(from,to); + else { + SplineMake3(from,mid); + SplineMake3(mid,to); + } + } +} + +static int OnEdge(BasePoint *plus,BasePoint *minus,Spline *sp, double t, + double heret, Spline *hsp, + StrokeInfo *si, double *_ppt, double *_pmt, double *_mpt, double *_mmt) { + double rsq = si->radius*si->radius; + double tt, xdiff, ydiff, loopdiff; + double pptval= -1, pmtval= -1, mptval= -1, mmtval = -1; + BasePoint here, test; + + here.x = ((hsp->splines[0].a*heret+hsp->splines[0].b)*heret+hsp->splines[0].c)*heret+hsp->splines[0].d; + here.y = ((hsp->splines[1].a*heret+hsp->splines[1].b)*heret+hsp->splines[1].c)*heret+hsp->splines[1].d; + + if ( (xdiff = sp->to->me.x-sp->from->me.x)<0 ) xdiff = -xdiff; + if ( (ydiff = sp->to->me.y-sp->from->me.y)<0 ) ydiff = -ydiff; + loopdiff = (xdiff+ydiff==0) ? 2 : 1.0/(4*(xdiff+ydiff)/si->radius); + + if ( _ppt!=NULL ) { + for ( tt = t+loopdiff; tt<=1 ; tt += loopdiff ) { + test.x = ((sp->splines[0].a*tt+sp->splines[0].b)*tt+sp->splines[0].c)*tt+sp->splines[0].d; + test.y = ((sp->splines[1].a*tt+sp->splines[1].b)*tt+sp->splines[1].c)*tt+sp->splines[1].d; + if ( (test.x-here.x)*(test.x-here.x)+(test.y-here.y)*(test.y-here.y)> 2*rsq ) + break; + if ( (plus->x-test.x)*(plus->x-test.x)+(plus->y-test.y)*(plus->y-test.y)<= rsq ) + pptval = tt; + if ( (minus->x-test.x)*(minus->x-test.x)+(minus->y-test.y)*(minus->y-test.y)<= rsq ) + pmtval = tt; + } + *_ppt = pptval; *_pmt = pmtval; + } + + if ( _mmt!=NULL ) { + for ( tt = t-loopdiff; tt>=0 ; tt -= loopdiff ) { + test.x = ((sp->splines[0].a*tt+sp->splines[0].b)*tt+sp->splines[0].c)*tt+sp->splines[0].d; + test.y = ((sp->splines[1].a*tt+sp->splines[1].b)*tt+sp->splines[1].c)*tt+sp->splines[1].d; + if ( (test.x-here.x)*(test.x-here.x)+(test.y-here.y)*(test.y-here.y)> 2*rsq ) + break; + if ( (plus->x-test.x)*(plus->x-test.x)+(plus->y-test.y)*(plus->y-test.y)< rsq ) + mptval = tt; + if ( (minus->x-test.x)*(minus->x-test.x)+(minus->y-test.y)*(minus->y-test.y)< rsq ) + mmtval = tt; + } + *_mmt = mmtval; *_mpt = mptval; + } + +return( pptval!=-1 || mmtval!=-1 || pmtval!=-1 || mptval==-1 ); +} + +#define BasePtDistance(pt1, pt2) sqrt(((pt1)->x-(pt2)->x)*((pt1)->x-(pt2)->x) + ((pt1)->y-(pt2)->y)*((pt1)->y-(pt2)->y)) + +#if 0 +static int PointToSplineLessThan(BasePoint *test,Spline *against,real radius) { + BasePoint here; + double t; + double xdiff,ydiff, delta; + + if ( BasePtDistance(test,&against->from->me)<=radius+.01 ) +return( true ); + if ( BasePtDistance(test,&against->to->me)<=radius+.01 ) +return( true ); + if ( (xdiff = against->from->me.x-against->to->me.x)<0 ) xdiff = -xdiff; + if ( (ydiff = against->from->me.y-against->to->me.y)<0 ) ydiff = -ydiff; + delta = radius/(2*(xdiff+ydiff)); + if ( delta<.0625 ) delta = .0625; + for ( t=delta; t<.99999 ; t+=delta ) { + here.x = ((against->splines[0].a*t+against->splines[0].b)*t+against->splines[0].c)*t+against->splines[0].d; + here.y = ((against->splines[1].a*t+against->splines[1].b)*t+against->splines[1].c)*t+against->splines[1].d; + if ( BasePtDistance(test,&here)<=radius ) +return( true ); + } +return( false ); +} + +static int EntirelyWithin(SplinePoint *start,Spline *s,int dir,real radius) { + /* Return whether every point along the splines starting at start is */ + /* within radius of some point along the spline s */ + Spline *test = dir ? start->next : start->prev; + BasePoint here; + double t; + + while ( test!=NULL ) { + if ( !PointToSplineLessThan(&test->from->me,s,radius) || + !PointToSplineLessThan(&test->to->me,s,radius)) +return( false ); + for ( t=.125; t<.99999 ; t+=.125 ) { + here.x = ((test->splines[0].a*t+test->splines[0].b)*t+test->splines[0].c)*t+test->splines[0].d; + here.y = ((test->splines[1].a*t+test->splines[1].b)*t+test->splines[1].c)*t+test->splines[1].d; + if ( !PointToSplineLessThan(&test->to->me,s,radius)) +return( false ); + } + if ( dir ) test = test->to->next; + else test = test->from->prev; + } +return( true ); +} +#endif + +static SplinePoint *MergeSplinePoint(SplinePoint *sp1,SplinePoint *sp2) { + /* sp1 and sp2 should be close together, use their average for the */ + /* new position, get rid of one, and add its spline to the other */ + /* sp1->next==NULL, sp2->prev==NULL */ + double offx, offy; + + offx = (sp1->me.x-sp2->me.x)/2; + offy = (sp1->me.y-sp2->me.y)/2; + sp1->me.x -= offx; sp1->prevcp.x -= offx; + sp1->me.y -= offy; sp1->prevcp.y -= offy; + sp1->nextcp.x = sp2->nextcp.x + offx; + sp1->nextcp.y = sp2->nextcp.y + offy; + sp1->nonextcp = sp2->nonextcp; + sp1->next = sp2->next; + SplinePointFree(sp2); + if ( sp1->next!=NULL ) + sp1->next->from = sp1; + SplinePointCatagorize(sp1); + if ( sp1->prev!=NULL ) + SplineRefigure(sp1->prev); + if ( sp1->next!=NULL ) + SplineRefigure(sp1->next); +return( sp1 ); +} + +static void MSP(SplinePoint *sp1,SplinePoint **sp2, SplinePoint **sp2alt) { + int same2 = *sp2==*sp2alt; + + *sp2 = MergeSplinePoint(sp1,*sp2); + if ( same2 ) + *sp2alt = *sp2; +} + +static SplinePoint *SplineMaybeBisect(Spline *s,double t) { + /* Things get very confused if I have a splineset with just a single point */ + SplinePoint *temp, *sp; + + if ( t<.0001 ) { + temp = chunkalloc(sizeof(SplinePoint)); + sp = s->from; + *temp = *sp; + temp->hintmask = NULL; + temp->next->from = temp; + sp->next = NULL; + sp->nextcp = sp->me; + sp->nonextcp = true; + temp->prevcp = temp->me; + temp->noprevcp = true; + SplineMake3(sp,temp); +return( temp ); + } else if ( t>.9999 ) { + temp = chunkalloc(sizeof(SplinePoint)); + sp = s->to; + *temp = *sp; + temp->hintmask = NULL; + temp->prev->to = temp; + sp->prev = NULL; + sp->prevcp = sp->me; + sp->noprevcp = true; + temp->nextcp = temp->me; + temp->nonextcp = true; + SplineMake3(temp,sp); +return( temp ); + } + +return( SplineBisect(s,t)); +} + +static void SplineFreeBetween(SplinePoint *from,SplinePoint *to,int freefrom,int freeto) { + Spline *s; + + if ( from==to ) { + if ( freefrom && freeto ) + SplinePointFree(from); +return; + } + + while ( from!=to && from!=NULL ) { + s = from->next; + if ( freefrom ) + SplinePointFree(from); + else + from->next = NULL; + if ( s==NULL ) +return; + freefrom = true; + from = s->to; + SplineFree(s); + } + if ( freeto ) + SplinePointFree(to); + else + to->prev = NULL; +} + +static void SplineFreeForeward(SplinePoint *from) { + Spline *s; + + while ( from!=NULL ) { + s = from->next; + SplinePointFree(from); + if ( s==NULL ) +return; + from = s->to; + SplineFree(s); + } +} + +static void SplineFreeBackward(SplinePoint *to) { + Spline *s; + + while ( to!=NULL ) { + s = to->prev; + SplinePointFree(to); + if ( s==NULL ) +return; + to = s->from; + SplineFree(s); + } +} + +static SplinePoint *SplineCopyAfter(SplinePoint *from,SplinePoint **end) { + SplinePoint *head, *last; + + last = head = chunkalloc(sizeof(SplinePoint)); + *head = *from; + head->hintmask = NULL; + head->prev = NULL; + while ( from->next!=NULL ) { + last->next = chunkalloc(sizeof(Spline)); + *last->next = *from->next; + last->next->from = last; + last->next->to = chunkalloc(sizeof(SplinePoint)); + *last->next->to = *from->next->to; + last->next->to->hintmask = NULL; + last->next->to->prev = last->next; + last = last->next->to; + from = from->next->to; + } + *end = last; +return( head ); +} + +static SplinePoint *SplineCopyBefore(SplinePoint *to,SplinePoint **end) { + SplinePoint *head, *last; + + last = head = chunkalloc(sizeof(SplinePoint)); + *head = *to; + head->hintmask = NULL; + head->next = NULL; + while ( to->prev!=NULL ) { + last->prev = chunkalloc(sizeof(Spline)); + *last->prev = *to->prev; + last->prev->to = last; + last->prev->from = chunkalloc(sizeof(SplinePoint)); + *last->prev->from = *to->prev->from; + last->prev->from->hintmask = NULL; + last->prev->from->next = last->prev; + last = last->prev->from; + to = to->prev->from; + } + *end = last; +return( head ); +} + +static SplinePoint *Intersect_Splines(SplinePoint *from,SplinePoint *to, + SplinePoint **ret) { + Spline *test1, *test2; + BasePoint pts[9]; + double t1s[9], t2s[9]; + + for ( test1=from->next; test1!=NULL; test1=test1->to->next ) { + for ( test2=to->prev; test2!=NULL; test2=test2->from->prev ) { + if ( SplinesIntersect(test1,test2,pts,t1s,t2s)>0 ) { + *ret = SplineMaybeBisect(test2,t2s[0]); +return( SplineMaybeBisect(test1,t1s[0])); + } + } + } + *ret = NULL; +return( NULL ); +} + +struct strokedspline { + Spline *s; + SplinePoint *plusfrom, *plusto, *origplusfrom; + SplinePoint *minusfrom, *minusto, *origminusto; + int8 plusskip, minusskip; /* If this spline is so small that it is totally within the region stroked by an adjacent spline */ + int8 pinnerto, minnerto; /* to and from as defined on original spline s */ + BasePoint minterto, pinterto; + double nangle, pangle; + struct strokedspline *next, *prev; +}; + +static void StrokeEndComplete(struct strokedspline *cur,StrokeInfo *si,int isstart) { + SplinePoint *edgestart, *edgeend, *curat, *edgeat; + struct strokedspline *lastp, *lastm; + + if ( isstart ) { + edgestart = StrokeEnd(cur->s->from,si,true,&edgeend); + for ( lastp=cur; lastp!=NULL && lastp->plusskip ; lastp=lastp->next ); + for ( lastm=cur; lastm!=NULL && lastm->minusskip ; lastm=lastm->next ); + if ( lastm==cur ) + MSP(edgeend,&cur->minusfrom,&cur->minusto); + else { + curat = Intersect_Splines(lastm->minusfrom,edgeend,&edgeat); + if ( curat!=NULL ) { + SplineFreeBetween(lastm->minusfrom,curat,true,false); + SplineFreeBetween(edgeat,edgeend,false,true); + } else + MSP(edgeend,&lastm->minusfrom,&lastm->minusto); + } + if ( lastp==cur ) + MergeSplinePoint(cur->plusto,edgestart); + else { + edgeat = Intersect_Splines(edgestart,lastp->plusto,&curat); + if ( curat!=NULL ) { + SplineFreeBetween(curat,lastp->plusto,false,true); + SplineFreeBetween(edgestart,edgeat,true,false); + } else + MergeSplinePoint(lastp->plusto,edgestart); + } + } else { + edgestart = StrokeEnd(cur->s->to,si,false,&edgeend); + for ( lastp=cur; lastp!=NULL && lastp->plusskip ; lastp=lastp->prev ); + for ( lastm=cur; lastm!=NULL && lastm->minusskip ; lastm=lastm->prev ); + if ( lastp==cur ) + MSP(edgeend,&cur->plusfrom,&cur->plusto); + else { + curat = Intersect_Splines(lastp->plusfrom,edgeend,&edgeat); + if ( curat!=NULL ) { + SplineFreeBetween(lastp->plusfrom,curat,true,false); + lastp->plusfrom = curat; + SplineFreeBetween(edgeat,edgeend,false,true); + lastp->plusfrom = MergeSplinePoint(edgeat,curat); + } else + MSP(edgeend,&lastp->plusfrom,&lastp->plusto); + } + if ( lastm==cur ) + MergeSplinePoint(cur->minusto,edgestart); + else { + edgeat = Intersect_Splines(edgestart,lastm->minusto,&curat); + if ( curat!=NULL ) { + SplineFreeBetween(curat,lastm->minusto,false,true); + lastm->minusto = curat; + SplineFreeBetween(edgestart,edgeat,true,false); + MergeSplinePoint(lastm->minusto,edgeat); + } else + MergeSplinePoint(lastm->minusto,edgestart); + } + } +} + +static void StrokedSplineFree(struct strokedspline *head) { + struct strokedspline *next, *cur=head; + + while ( cur!=NULL ) { + next = cur->next; + chunkfree(cur,sizeof(*cur)); + cur = next; + if ( cur==head ) + break; + } +} + +static int DoIntersect_Splines(struct strokedspline *before, + struct strokedspline *after, int doplus,StrokeInfo *si,SplineChar *sc, + int force_connect ) { + SplinePoint *beforeat, *afterat; + int ret = true; + int toobig = false; + + if ( doplus ) { + beforeat = Intersect_Splines(before->plusfrom,after->plusto,&afterat); + if ( beforeat!=NULL ) { + after->origplusfrom = after->plusfrom; + after->plusto = SplineCopyBefore(afterat,&after->plusfrom); + SplineFreeBetween(before->plusfrom,beforeat,true/*free before->plusfrom*/,false/* keep beforeat */); + before->plusfrom = beforeat; + } else if ( before->origplusfrom!=NULL && + (beforeat = Intersect_Splines(before->origplusfrom,after->plusto,&afterat))!=NULL ) { + toobig = true; + after->origplusfrom = after->plusfrom; + after->plusto = SplineCopyBefore(afterat,&after->plusfrom); + SplineFreeBetween(before->plusfrom,before->plusto,true/*free plusfrom*/,false); + before->plusfrom = SplinePointCreate(afterat->me.x,afterat->me.y); + before->plusfrom->nextcp = before->plusfrom->me; + before->plusfrom->nonextcp = true; + SplineMake3(before->plusfrom,before->plusto); /* This line goes backwards */ +#if 0 /* This introduces lots of bugs, it gets invoked when it */ + /* shouldn't, and I can't figure out how to distinguish */ + } else if ( EntirelyWithin(before->plusfrom,after->s,true,si->radius) ) { + /* the splines at before are all within radius units of the original */ + /* after spline. This means that they will make no contribution */ + /* to the outline. */ + if ( before->prev!=NULL && before->prev!=after ) + ret = DoIntersect_Splines(before->prev,after,doplus,si,sc); + before->plusskip = true; + toobig = ret; + } else if ( EntirelyWithin(after->plusto,before->s,false,si->radius) ) { + /* the splines at after are entirely within radius units of the original */ + if ( after->next!=NULL && after->next!=before ) + ret = DoIntersect_Splines(before,after->next,doplus,si,sc); + after->plusskip = true; + toobig = ret; +#endif + } else { + /* No intersection everything can stay as it is */ + if ( force_connect && BasePtDistance(&after->plusto->me,&before->plusfrom->me)>3 ) { + beforeat = SplinePointCreate(after->plusto->me.x,after->plusto->me.y); + SplineMake3(beforeat,before->plusfrom); + before->plusfrom = beforeat; + toobig = true; + } + ret = false; + } + if ( before->origplusfrom!=NULL ) + SplineFreeForeward(before->origplusfrom); + before->origplusfrom = NULL; + } else { + afterat = Intersect_Splines(after->minusfrom,before->minusto,&beforeat); + if ( afterat!=NULL ) { + after->origminusto = after->minusto; + after->minusfrom = SplineCopyAfter(afterat,&after->minusto); + SplineFreeBetween(beforeat,before->minusto,false/*keep beforeat*/,true); + before->minusto = beforeat; + } else if ( before->origminusto!=NULL && + (afterat = Intersect_Splines(after->minusfrom,before->origminusto,&beforeat))!=NULL ) { + toobig = true; + after->origminusto = after->minusto; + after->minusfrom = SplineCopyAfter(afterat,&after->minusto); + SplineFreeBetween(before->minusfrom,before->minusto,false/*keep minusfrom*/,true); + before->minusto = SplinePointCreate(afterat->me.x,afterat->me.y); + before->minusfrom->nextcp = before->minusfrom->me; + before->minusfrom->nonextcp = true; + SplineMake3(before->minusfrom,before->minusto); /* This line goes backwards */ +#if 0 /* This introduces lots of bugs, it gets invoked when it */ + /* shouldn't, and I can't figure out how to distinguish */ + } else if ( EntirelyWithin(before->minusto,after->s,false,si->radius) ) { + /* the splines at before are all within radius units of the original */ + /* after spline. This means that they will make no contribution */ + /* to the outline. */ + ret = false; + if ( before->prev!=NULL && before->prev!=after && before->prev!=after->next ) + ret = DoIntersect_Splines(before->prev,after,doplus,si,sc); + before->minusskip = true; + toobig = ret; + } else if ( EntirelyWithin(after->minusfrom,before->s,true,si->radius) ) { + /* the splines at after are entirely within radius units of the original */ + ret = false; + if ( after->next!=NULL && after->next!=before && before->prev!=after->next ) + ret = DoIntersect_Splines(before,after->next,doplus,si,sc); + after->minusskip = true; + toobig = ret; +#endif + } else { + /* No intersection everything can stay as it is */ + if ( force_connect && BasePtDistance(&after->minusfrom->me,&before->minusto->me)>3 ) { + beforeat = SplinePointCreate(after->minusfrom->me.x,after->minusfrom->me.y); + SplineMake3(before->minusto,beforeat); + before->minusto = beforeat; + toobig = true; + } + ret = false; + } + if ( before->origminusto!=NULL ) + SplineFreeBackward(before->origminusto); + before->origminusto = NULL; + } + if ( toobig ) { + si->gottoobig = si->gottoobiglocal = true; + if ( !si->toobigwarn ) { + si->toobigwarn = true; + GWidgetErrorR( _STR_BadStroke, _STR_StrokeWidthTooBig, + sc==NULL?"": sc->name ); + } + } +return( ret ); +} + +/* Plus joins run from prev to next, minus joins run from next to prev */ +/* This makes plus joins clockwise and minus joins counter */ +static void StrokeJoint(SplinePoint *base,StrokeInfo *si, + struct strokedspline *before,struct strokedspline *after, + SplineChar *sc) { + BasePoint nplus, nminus, pplus,pminus; + double nangle, pangle; + int pinner, minner; +#if 0 + double pt, mt; + double tt, xdiff, ydiff; +#endif + + before->pangle = pangle = SplineExpand(base->prev,1,0,si,&pplus,&pminus); + before->nangle = nangle = SplineExpand(base->next,0,0,si,&nplus,&nminus); + + if ( RealWithin(pangle,nangle,.1) || RealWithin(pangle+2*PI,nangle,.1) || + RealWithin(pangle,nangle+2*PI,.1)) { + /* If the two splines are tangent at the base, then everything is */ + /* simple, there is no join, things match up perfectly */ + /* Um. No. If there is a sharp bend or a corner nearby then it may */ + /* have the same effect as a corner, in extreme cases the entire */ + /* spline may be eaten up */ + /* Actually, that's probably done best in Remove Overlap. If we try */ + /* to do it here, we unlease lots of potentials for bugs in other */ + /* cases */ + +#if 0 + if ( (xdiff = base->me.x-base->prev->from->me.x)<0 ) xdiff = -xdiff; + if ( (ydiff = base->me.y-base->prev->from->me.y)<0 ) ydiff = -ydiff; + if ( xdiff+ydiff==0 ) xdiff = 1; + tt = si->radius/(2*(xdiff+ydiff)); + if ( tt>.2 ) tt = .2; + OnEdge(&pplus,&pminus,base->next,0,1.0-tt,base->prev, + si,&pt,&mt,NULL,NULL); + if ( pt!=-1 ) + DoIntersect_Splines(before,after,true,si,sc,true); + else { + if ( (xdiff = base->me.x-base->next->to->me.x)<0 ) xdiff = -xdiff; + if ( (ydiff = base->me.y-base->next->to->me.y)<0 ) ydiff = -ydiff; + tt = si->radius/(2*(xdiff+ydiff)); + if ( tt>.2 ) tt = .2; + OnEdge(&nplus,&nminus,base->prev,1.,tt,base->next, + si,NULL,NULL,&pt,&mt); + if ( mt!=-1 ) + DoIntersect_Splines(before,after,false,si,sc,true); + } +#endif + before->pinnerto = before->minnerto = -1; + } else { + pinner = Intersect_Lines(&before->pinterto,&pplus, + 3*base->prev->splines[0].a+2*base->prev->splines[0].b+base->prev->splines[0].c, + 3*base->prev->splines[1].a+2*base->prev->splines[1].b+base->prev->splines[1].c, + &nplus, + base->next->splines[0].c, + base->next->splines[1].c,si->radius); + minner = Intersect_Lines(&before->minterto,&pminus, + 3*base->prev->splines[0].a+2*base->prev->splines[0].b+base->prev->splines[0].c, + 3*base->prev->splines[1].a+2*base->prev->splines[1].b+base->prev->splines[1].c, + &nminus, + base->next->splines[0].c, + base->next->splines[1].c,si->radius); + if ( pinner==-1 && minner!=-1 ) + pinner = !minner; + before->pinnerto = pinner; before->minnerto = (pinner!=-1?!pinner:-1); + if ( pinner==1 ) { + DoIntersect_Splines(before,after,true,si,sc,true); + } else if ( pinner==0 ) { + DoIntersect_Splines(before,after,false,si,sc,true); + } else { /* splines are parallel, but moving in same dir */ + if ( DoIntersect_Splines(before,after,true,si,sc,false)) { + before->pinnerto = 1; + before->minnerto = 0; + } else { + if ( DoIntersect_Splines(before,after,false,si,sc,true)) { + before->pinnerto = 0; + before->minnerto = 1; + } else + DoIntersect_Splines(before,after,true,si,sc,true); + } + } + } +} + +static int SplineSolveForPen(Spline *s,StrokeInfo *si,double *ts,int *pinners, + double tstart,double tend) { + /* Find all the places at which the spline has the same slope as one of the */ + /* edges of the pen. There can be at most 8 (we get four quadratics) */ + double a, b, c, sq, t1, t2; + int i, cnt=0, j; + Spline1D *xsp = &s->splines[0], *ysp = &s->splines[1]; + BasePoint pp, pm, np, nm, testp, testm; + + ts[cnt++] = tstart; + for ( i=0; i<2; ++i ) { + if ( i==0 ) { + a = 3*(ysp->a*si->c-xsp->a*si->s); + b = 2*(ysp->b*si->c-xsp->b*si->s); + c = ysp->c*si->c-xsp->c*si->s; + } else if ( i==1 ) { + a = 3*(-ysp->a*si->c-xsp->a*si->s); + b = 2*(-ysp->b*si->c-xsp->b*si->s); + c = -ysp->c*si->c-xsp->c*si->s; +#if 0 /* These two are just the negatives of the first two and as such have the same roots */ + } else if ( i==2 ) { + a = 3*(-ysp->a*si->c+xsp->a*si->s); + b = 2*(-ysp->b*si->c+xsp->b*si->s); + c = -ysp->c*si->c+xsp->c*si->s; + } else { + a = 3*(ysp->a*si->c+xsp->a*si->s); + b = 2*(ysp->b*si->c+xsp->b*si->s); + c = ysp->c*si->c+xsp->c*si->s; +#endif + } + sq = b*b-4*a*c; + if ( sq==0 ) { + t1 = -b/(2*a); + t2 = -1; + } else if ( sq>0 ) { + sq = sqrt(sq); + t1 = (-b+sq)/(2*a); + t2 = (-b-sq)/(2*a); + } else + t1 = t2 = -1; + if ( t1>tstart && t1tstart && t2ts[j] ) { + double temp = ts[i]; + ts[i] = ts[j]; + ts[j] = temp; + } + /* Figure which side is inner */ + for ( i=1; i 0 ); + } +return( cnt ); +} + +#if 0 +static void SplineSetFixRidiculous(SplineSet *ss) { + /* Make sure we don't have any splines with ridiculous control points */ + /* No control point, when projected onto the vector between the two */ + /* end points should be far beyond either of the end points... */ + Spline *s, *first; + double vx, vy, test, end; + int unreasonable; + + first = NULL; + for ( s=ss->first->next; s!=NULL && s!=first; s = s->to->next ) { + if ( first==NULL ) first = s; + vx = s->to->me.x-s->from->me.x; vy = s->to->me.y-s->from->me.y; + end = vx*vx + vy*vy; + unreasonable = false; + test = vx*(s->from->nextcp.x-s->from->me.x) + + vy*(s->from->nextcp.y-s->from->me.y); + if ( test<-2*end || test>2*end ) { + s->from->nextcp = s->from->me; + s->from->nonextcp = true; + unreasonable = true; + } + test = vx*(s->to->prevcp.x-s->from->me.x) + + vy*(s->to->prevcp.y-s->from->me.y); + if ( test<-2*end || test>2*end ) { + s->to->prevcp = s->to->me; + s->to->noprevcp = true; + unreasonable = true; + } + if ( unreasonable ) + SplineRefigure(s); + } +} +#endif + +static void SplineSetFixCPs(SplineSet *ss) { + SplinePoint *sp; + + for ( sp=ss->first; ; ) { + SPWeightedAverageCps(sp); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + SPLCatagorizePoints(ss); +} + +static SplineSet *SSFixupOverlap(StrokeInfo *si,SplineChar *sc, + SplineSet *ssplus,SplineSet *ssminus) { + ssplus->next = ssminus; + ssplus = SplineSetRemoveOverlap(sc,ssplus,over_remove); + if ( si->removeinternal || si->removeexternal ) { + SplineSet *prev, *spl, *next; + prev = NULL; + for ( spl=ssplus; spl!=NULL; spl = next ) { + int clock = SplinePointListIsClockwise(spl); + next = spl->next; + if (( !clock && si->removeinternal ) || ( clock && si->removeexternal )) { + SplinePointListFree(spl); + if ( prev==NULL ) + ssplus = next; + else + prev->next = next; + } else + prev = spl; + } + } +return( ssplus ); +} + +static SplinePoint *SPNew(SplinePoint *base,BasePoint *pos,BasePoint *cp,int isnext) { + SplinePoint *sp = SplinePointCreate(pos->x,pos->y); + sp->pointtype = base->pointtype; + if ( isnext ) { + sp->nextcp.x = pos->x + (cp->x-base->me.x); + sp->nextcp.y = pos->y + (cp->y-base->me.y); + sp->nonextcp = (sp->nextcp.x==pos->x) && (sp->nextcp.y==pos->y); + } else { + sp->prevcp.x = pos->x + (cp->x-base->me.x); + sp->prevcp.y = pos->y + (cp->y-base->me.y); + sp->noprevcp = (sp->prevcp.x==pos->x) && (sp->prevcp.y==pos->y); + } +return( sp ); +} + +static void NormalizeT(TPoint *mids,int cnt,double tbase,double tend) { + int i; + + for ( i=0; isplines[0]; + off.x = sp->me.x - ( ((s1->a*t+s1->b)*t+s1->c)*t+s1->d ); + s1 = &spline->splines[1]; + off.y = sp->me.y - ( ((s1->a*t+s1->b)*t+s1->c)*t+s1->d ); + + if ( isnext ) { + double s = (1.0-t); + /* We want to renormalize the spline so that it runs from [t,1] and */ + /* then figure what the control point at t should be */ + s1 = &spline->splines[0]; + temp.splines[0].d = s1->d + t*(s1->c + t*(s1->b + t*s1->a)); + temp.splines[0].c = s*(s1->c + t*(2*s1->b + 3*s1->a*t)); + temp.splines[0].b = s*s*(s1->b+3*s1->a*t); +#if 0 + temp.splines[0].a = s*s*s*s1->a; +#endif + s1 = &spline->splines[1]; + temp.splines[1].d = s1->d + t*(s1->c + t*(s1->b + t*s1->a)); + temp.splines[1].c = s*(s1->c + t*(2*s1->b + 3*s1->a*t)); + temp.splines[1].b = s*s*(s1->b+3*s1->a*t); +#if 0 + temp.splines[1].a = s*s*s*s1->a; +#endif + if ( spline->order2 ) { + sp->nextcp.x = temp.splines[0].d + temp.splines[0].c/2 + off.x; + sp->nextcp.y = temp.splines[1].d + temp.splines[1].c/2 + off.y; + } else { + sp->nextcp.x = temp.splines[0].d + temp.splines[0].c/3 + off.x; + sp->nextcp.y = temp.splines[1].d + temp.splines[1].c/3 + off.y; + } + sp->nonextcp = false; + } else { + /* We want to renormalize the spline so that it runs from [0,t] and */ + /* then figure what the control point at t should be */ + temp = *spline; + temp.splines[0].c *= t; temp.splines[1].c *= t; + tn = t*t; + temp.splines[0].b *= tn; temp.splines[1].b *= tn; +#if 0 + tn *= t; + temp.splines[0].a *= tn; temp.splines[1].a *= tn; +#endif + if ( spline->order2 ) { + sp->prevcp.x = temp.splines[0].d + temp.splines[0].c/2 + off.x; + sp->prevcp.y = temp.splines[1].d + temp.splines[1].c/2 + off.y; + } else { + sp->prevcp.x = temp.splines[0].d + (2*temp.splines[0].c+temp.splines[0].b)/3 + off.x; + sp->prevcp.y = temp.splines[1].d + (2*temp.splines[1].c+temp.splines[1].b)/3 + off.y; + } + sp->noprevcp = false; + } +} + +static void SPFigurePlusCP(SplinePoint *sp,double t,Spline *spline,int isnext) { + SplinePoint dummy; + + /* Plus splines run in the oposite direction */ + dummy = *sp; + SPFigureCP(&dummy,t,spline,!isnext); + if ( isnext ) { + sp->nextcp = dummy.prevcp; + sp->nonextcp = false; + } else { + sp->prevcp = dummy.nextcp; + sp->noprevcp = true; + } +} + +#define Approx 10 + +static struct strokedspline *_SplineSetApprox(SplineSet *spl,StrokeInfo *si,SplineChar *sc) { + struct strokedspline *head=NULL, *last=NULL, *cur; + int max=Approx; + TPoint *pmids=galloc(max*sizeof(TPoint)), *mmids=galloc(max*sizeof(TPoint)); + uint8 *knots=galloc(max); + BasePoint pto, mto, pfrom, mfrom; + double approx, xdiff, ydiff, loopdiff; + Spline *spline, *first; + int i,j,k; + SplinePoint *p_to, *m_to, *p_from, *m_from; + int cnt, anyknots; + double ts[9]; + BasePoint m,p,temp; + double mt1, pt1, mt2, pt2; + int pinners[10]; + int mwascovered, pwascovered; + enum knot_type { kt_knot=1, kt_pgood=2, kt_mgood=4 }; + int toobig; + + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = spline->to->next ) { + cur = chunkalloc(sizeof(struct strokedspline)); + if ( last==NULL ) + head = cur; + else { + last->next = cur; + cur->prev = last; + } + last = cur; + cur->s = spline; + SplineIsLinearMake(spline); + SplineExpand(spline,0,0,si,&pto,&mfrom); + SplineExpand(spline,1,0,si,&pfrom,&mto); + cur->minusfrom = SPNew(spline->from,&mfrom,&spline->from->nextcp,true); + cur->plusto = SPNew(spline->from,&pto,&spline->from->nextcp,false); + cur->minusto = SPNew(spline->to,&mto,&spline->to->prevcp,false); + cur->plusfrom = SPNew(spline->to,&pfrom,&spline->to->prevcp,true); + + if ( si->stroke_type == si_caligraphic ) { + /* At each t where the spline is tangent to one of the pen-angles */ + /* we need to figure out which side is inner and which is outer */ + /* the outer side gets a copy of the appropriate pen side (with corner points tangent) */ + /* the inner side is going to be a single corner point at the */ + /* intersection of the splines from the two corners */ + /* And if (god help us) we've got a point of inflection here then */ + /* we get half the pen on each side */ + /* I ignore the case of a point of inflection, and I don't */ + /* find the real intersection point, I just guess that it is */ + /* near the mid point of the pen */ + cnt = SplineSolveForPen(spline,si,ts,pinners+1,0,1); + p_to = m_to = NULL; + for ( j=1; jplusto; m_from = cur->minusfrom; + } else if ( pinners[j-1] ) { + p_to = p_from; + SplineExpand(spline,ts[j-1],(ts[j-1]-ts[j-2])/20.,si,&p,&m); + m_from = SplinePointCreate(m.x,m.y); + m_from->pointtype = pt_tangent; + SplineMake3(m_to,m_from); + } else { + m_from = m_to; + SplineExpand(spline,ts[j-1],(ts[j-1]-ts[j-2])/20.,si,&p,&m); + p_to = SplinePointCreate(p.x,p.y); + p_to->pointtype = pt_tangent; + SplineMake3(p_to,p_from); + } + if ( j==cnt-1 ) { + p_from = cur->plusfrom; + m_to = cur->minusto; + } else if ( pinners[j] ) { + SplineExpand(spline,ts[j],(ts[j+1]-ts[j-1])/20.,si,&p,&m); + SplineExpand(spline,ts[j],-(ts[j+1]-ts[j-1])/20.,si,&temp,&m); + p_from = SplinePointCreate((p.x+temp.x)/2,(p.y+temp.y)/2); + p_from->pointtype = pt_corner; + m_to = SplinePointCreate(m.x,m.y); + m_to->pointtype = pt_tangent; + } else { + SplineExpand(spline,ts[j],(ts[j+1]-ts[j-1])/20.,si,&p,&m); + SplineExpand(spline,ts[j],-(ts[j+1]-ts[j-1])/20.,si,&p,&temp); + p_from = SplinePointCreate(p.x,p.y); + p_from->pointtype = pt_tangent; + m_to = SplinePointCreate((m.x+temp.x)/2,(m.y+temp.y)/2); + m_to->pointtype = pt_corner; + } + ApproximateSplineFromPoints(p_from,p_to,pmids,Approx,false); + ApproximateSplineFromPoints(m_from,m_to,mmids,Approx,false); + if ( m_from!=cur->minusfrom && m_from->pointtype!=pt_corner ) + m_from->pointtype = pt_tangent; + } + } else { + /* Figure out where the curve starts to bend sharply, and add */ + /* New points there. I used to strip out the curve where it */ + /* overlapped itself, but I think that's better done by remove */ + /* overlap rather than here */ + if ( (xdiff = spline->to->me.x-spline->from->me.x)<0 ) xdiff = -xdiff; + if ( (ydiff = spline->to->me.y-spline->from->me.y)<0 ) ydiff = -ydiff; + loopdiff = (xdiff+ydiff==0) ? .1 : 1.0/(4*(xdiff+ydiff)/si->radius); + approx = rint(1.0/loopdiff); + if ( approx<0 || approx>3000 ) approx=3000; + if ( approx>max ) { + max = approx+10; + pmids = grealloc(pmids,max*sizeof(TPoint)); + mmids = grealloc(mmids,max*sizeof(TPoint)); + knots = grealloc(knots,max); + } + + mwascovered = pwascovered = false; + toobig = false; + for ( i=0; igottoobig = si->gottoobiglocal = true; + if ( !si->toobigwarn ) { + si->toobigwarn = true; + GWidgetErrorR( _STR_BadStroke, _STR_StrokeWidthTooBig, + sc==NULL?"": sc->name ); + } + } + + /* Look for any sharp bends, they give us problems which are */ + /* eased by creating a new point. */ + if ( !anyknots ) { + double radius = si->radius; + si->radius *= 2; + mwascovered = pwascovered = false; + for ( i=0; iradius = radius; + } + + p_to = cur->plusto; + m_from = cur->minusfrom; + for ( i=j=0; i0 && (knots[i-1]&kt_mgood) ) { + if ( i+1pointtype = pt_corner; + if ( j!=0 ) + SPFigureCP(m_from,(j)/(approx+1),spline,true); + SPFigureCP(m_to,(i+1)/(approx+1),spline,false); + NormalizeT(mmids+j,i-j,j==0?0:mmids[j-1].t,mmids[i].t); + ApproximateSplineFromPointsSlopes(m_from,m_to,mmids+j,i-j,false); + m_from = m_to; + } + + if ( i>0 && (knots[i-1]&kt_pgood) ) { + if ( i+1pointtype = pt_corner; + if ( j!=0 ) /* Really should use mmids[].t, pmids[].t is backwards */ + SPFigurePlusCP(p_to,j/(approx+1),spline,false); + SPFigurePlusCP(p_from,(i+1)/(approx+1),spline,true); + NormalizeT(pmids+j,i-j,pmids[i].t,j==0?1.0:pmids[j-1].t); + ApproximateSplineFromPointsSlopes(p_from,p_to,pmids+j,i-j,false); + p_to = p_from; + } + + j=i+1; + } + } + + if ( j!=0 ) { + NormalizeT(pmids+j,i-j,0.0,pmids[j-1].t); + NormalizeT(mmids+j,i-j,mmids[j-1].t,1.0); + SPFigureCP(m_from,(j)/(approx+1),spline,true); + SPFigurePlusCP(p_to,(j)/(approx+1),spline,false); + } + ApproximateSplineFromPointsSlopes(cur->plusfrom,p_to,pmids+j,i-j,false); + ApproximateSplineFromPointsSlopes(m_from,cur->minusto,mmids+j,i-j,false); + } + if ( spline->to->next==NULL ) { + /* Done */ + break; + } + if ( first==NULL ) first = spline; + } + if ( spline==first ) { + head->prev = last; + last->next = head; + } + free(mmids); free(pmids); free(knots); +return( head ); +} + +static void SPLCheckValidity(SplineSet *ss) { + SplinePoint *sp, *nsp; + + for ( sp=ss->first; ; sp = nsp ) { + if ( sp->next==NULL ) + break; + nsp = sp->next->to; + if ( nsp->prev != sp->next || sp->next->from!=sp ) + GDrawIError("Bad SPL"); + if ( nsp==ss->first ) + break; + } + + for ( sp=ss->last; ; sp = nsp ) { + if ( sp->prev==NULL ) + break; + nsp = sp->prev->from; + if ( nsp->next != sp->prev || sp->prev->to!=sp ) + GDrawIError("Bad SPL"); + if ( nsp==ss->last ) + break; + } +} + +static SplineSet *_SplineSetStroke(SplineSet *spl,StrokeInfo *si,SplineChar *sc) { + SplineSet *ssplus, *ssminus; + int reversed = false; + struct strokedspline *head, *cur, *first, *lastp, *lastm; + + si->gottoobiglocal = false; + + if ( spl->first->next==NULL || spl->first->next->to==spl->first ) { + /* Only one point in the SplineSet. */ + ssplus = chunkalloc(sizeof(SplineSet)); + SinglePointStroke(spl->first,si,&ssplus->first,&ssplus->last); +return( ssplus ); + } + + SplineSetAddExtrema(spl,false); + + if ( spl->first==spl->last && spl->first->next!=NULL ) { + /* My routine gets screwed up by counter-clockwise triangles */ + if ( !SplinePointListIsClockwise(spl)) { + reversed = true; + SplineSetReverse(spl); + } + } + + head = cur = _SplineSetApprox(spl,si,sc); + + first = NULL; + for ( cur=head; cur!=NULL && cur!=first; cur=cur->next ) { + if ( first==NULL ) first = cur; + if ( cur->s->to->next!=NULL ) + StrokeJoint(cur->s->to,si,cur,cur->next,sc); + } + + /* Finish off intersections, before doing joins */ + if ( spl->first->prev==NULL ) { + StrokeEndComplete(head,si,true); + for ( cur=head; cur->next!=NULL; cur=cur->next ); + StrokeEndComplete(cur,si,false); + } + + lastp = lastm = head; + if ( lastp->plusskip ) lastp = NULL; + if ( lastm->minusskip ) lastm = NULL; + + first = NULL; + for ( cur=head; cur!=NULL && cur!=first; cur=cur->next ) { + real factor = si->factor==NULL ? 1.0 : (si->factor)(si->data,cur->s,1.0); + if ( first==NULL ) first = cur; + + if ( cur->s->to->next!=NULL ) { + if ( !cur->plusskip ) lastp = cur; + if ( lastp!=NULL && !cur->next->plusskip ) { + if ( cur->pinnerto==-1 ) + MSP(cur->next->plusto,&lastp->plusfrom,&lastp->plusto); + else if ( cur->pinnerto ) + MSP(cur->next->plusto,&lastp->plusfrom,&lastp->plusto); + else if ( cur==lastp ) + MakeJoints(cur->next->plusto,cur->plusfrom,si,&cur->pinterto, + &cur->s->to->me,-1,cur->pangle,cur->nangle,factor); + else + GDrawIError("Lastp not cur" ); + } + if ( !cur->minusskip ) lastm = cur; + if ( lastm!=NULL && !cur->next->minusskip ) { + if ( cur->minnerto==-1 ) + MSP(lastm->minusto,&cur->next->minusfrom,&cur->next->minusto); + else if ( cur->minnerto ) + MSP(lastm->minusto,&cur->next->minusfrom,&cur->next->minusto); + else if ( cur==lastm ) + MakeJoints(lastm->minusto,cur->next->minusfrom,si,&cur->minterto, + &cur->s->to->me,1,PI+cur->nangle,PI+cur->pangle,factor); + else + GDrawIError("Lastm not cur"); + } + } + } + + for ( cur=head; cur!=NULL && cur->plusskip; ) { cur=cur->next; if ( cur==head ) cur=NULL; } + if ( cur!=NULL ) { + ssplus = chunkalloc(sizeof(SplineSet)); + ssplus->first = ssplus->last = cur->plusfrom; + SplineSetFixCPs(ssplus); + SPLCheckValidity(ssplus); + } else + /* It is possible to have a contour completely swallowed by the pen */ + ssplus = NULL; + for ( cur=head; cur!=NULL && cur->minusskip; ) { cur=cur->next; if ( cur==head ) cur=NULL; } + if ( spl->first==spl->last && cur!=NULL ) { + ssminus = chunkalloc(sizeof(SplineSet)); + ssminus->first = ssminus->last = cur->minusfrom; + SPLCheckValidity(ssminus); + /*SplineSetFixRidiculous(ssplus); SplineSetFixRidiculous(ssminus);*/ + SplineSetFixCPs(ssminus); + if ( reversed ) { + SplineSet *temp = ssplus; + ssplus = ssminus; + ssminus = temp; + } + /* I can't always detect an overlap, so let's always do the remove */ + /* Sigh, no. That is still too dangerous */ + /* Note: SSFixupOverlap will remove internal/external as needed */ + if ( si->removeoverlapifneeded && si->gottoobiglocal && ssplus!=NULL ) + ssplus = SSFixupOverlap(si,sc,ssplus,ssminus); + else if ( si->removeinternal && ssplus!=NULL ) { + SplinePointListFree(ssminus); + SplineSetReverse(ssplus); + } else if ( si->removeexternal ) { + SplinePointListFree(ssplus); + ssplus = ssminus; + } else { + SplineSetReverse(ssminus); + if ( ssplus != NULL ) { + SplineSetReverse(ssplus); + ssplus->next = ssminus; + } else + ssplus = ssminus; + /* I used to do a splineset correct dir here on both, but */ + /* that doesn't work always if a contour self intersects */ + /* I think it should always be correct */ + } + if ( reversed ) /* restore original, just in case we want it */ + SplineSetReverse(spl); + } else if ( si->stroke_type==si_std || si->stroke_type==si_elipse ) + SplineSetReverse(ssplus); + StrokedSplineFree(head); +return( ssplus ); +} + +#if 0 +static void BisectTurners(SplineSet *spl) { + Spline *first, *s, *next; + double len,lenf,lent, dott,dotf; + + /* Also if we have a spline which turns through about 180 degrees */ + /* our approximations degrade. So bisect any such splines */ + first = NULL; + for ( s = spl->first->next; s!=NULL && s!=first; s=next ) { + next = s->to->next; + if ( first==NULL ) first = s; + len = sqrt( (s->from->me.x-s->to->me.x)*(s->from->me.x-s->to->me.x) + + (s->from->me.y-s->to->me.y)*(s->from->me.y-s->to->me.y) ); + lenf= sqrt( (s->from->me.x-s->from->nextcp.x)*(s->from->me.x-s->from->nextcp.x) + + (s->from->me.y-s->from->nextcp.y)*(s->from->me.y-s->from->nextcp.y) ); + dotf = ((s->from->me.x-s->to->me.x)*(s->from->me.x-s->from->nextcp.x) + + (s->from->me.y-s->to->me.y)*(s->from->me.y-s->from->nextcp.y))/ + (len*lenf); + lent= sqrt( (s->to->prevcp.x-s->to->me.x)*(s->to->prevcp.x-s->to->me.x) + + (s->to->prevcp.y-s->to->me.y)*(s->to->prevcp.y-s->to->me.y) ); + dott = ((s->from->me.x-s->to->me.x)*(s->to->prevcp.x-s->to->me.x) + + (s->from->me.y-s->to->me.y)*(s->to->prevcp.y-s->to->me.y))/ + (len*lent); + dotf = acos(dotf); dott = acos(dott); + if ( dotf+dott > PI/2 ) + SplineBisect(s,.5); + } +} + +void SSBisectTurners(SplineSet *spl) { + while ( spl!=NULL ) { + BisectTurners(spl); + spl = spl->next; + } +} +#endif + +static SplineSet *SSRemoveUTurns(SplineSet *base) { + /* My stroking algorithem gets confused by sharp turns. For example */ + /* if we have a spline which is all in a line, but the control points */ + /* are such that it doubles back on itself ( "* + * +", ie. cps */ + /* outside of the points) then things get very unhappy */ + SplineSet *spl= base; + Spline *first, *s, *next; + double dx,dy, offx,offy, diff; + int linear; + + first = NULL; + for ( s = spl->first->next; s!=NULL && s!=first; s=s->to->next ) { + if ( first==NULL ) first = s; + dx = s->to->me.x-s->from->me.x; + dy = s->to->me.y-s->from->me.y; + offx = s->from->nextcp.x-s->from->me.x; + offy = s->from->nextcp.y-s->from->me.y; + if ( offx*dx + offy*dy<0 ) { + diff = offx*dy-offy*dx; + linear = ( diff<1 && diff>-1 ); + if ( offx<0 ) offx = -offx; + if ( offy<0 ) offy = -offy; + if ( offx+offy<1 || linear ) { + s->from->nextcp = s->from->me; + s->from->nonextcp = true; + if ( s->from->pointtype == pt_curve ) + s->from->pointtype = pt_corner; + if ( s->order2 ) { + s->to->prevcp = s->to->me; + s->to->noprevcp = true; + if ( s->to->pointtype==pt_curve ) + s->to->pointtype = pt_corner; + } + SplineRefigure(s); + } + } + offx = s->to->me.x-s->to->prevcp.x; + offy = s->to->me.y-s->to->prevcp.y; + if ( offx*dx + offy*dy<0 ) { + diff = offx*dy-offy*dx; + linear = ( diff<1 && diff>-1 ); + if ( offx<0 ) offx = -offx; + if ( offy<0 ) offy = -offy; + if ( offx+offy<1 || linear ) { + s->to->prevcp = s->to->me; + s->to->noprevcp = true; + if ( s->to->pointtype==pt_curve ) + s->to->pointtype = pt_corner; + if ( s->order2 ) { + s->from->nextcp = s->from->me; + s->from->nonextcp = true; + if ( s->from->pointtype == pt_curve ) + s->from->pointtype = pt_corner; + } + SplineRefigure(s); + } + } + } + + /* Zero length splines are bad too */ + /* As are splines of length .000003 */ + first = NULL; + for ( s = spl->first->next; s!=NULL && s!=first; s=next ) { + if ( first==NULL ) first = s; + next = s->to->next; + if ( s->from->nonextcp && s->to->noprevcp && + s->from->me.x >= s->to->me.x-.1 && s->from->me.x <= s->to->me.x+.1 && + s->from->me.y >= s->to->me.y-.1 && s->from->me.y <= s->to->me.y+.1 ) { + s->from->next = next; + if ( next!=NULL ) { + s->from->nextcp = next->from->nextcp; + s->from->nonextcp = next->from->nonextcp; + s->from->nextcpdef = next->from->nextcpdef; + next->from = s->from; + } + SplinePointCatagorize(s->from); + if ( spl->last == s->to ) { + if ( next==NULL ) + spl->last = s->from; + else + spl->first = spl->last = s->from; + } + SplinePointFree(s->to); + SplineFree(s); + if ( first==s ) first = NULL; + } + } + +#if 0 + BisectTurners(spl); +#endif +return( base ); +} + +SplineSet *SplineSetStroke(SplineSet *spl,StrokeInfo *si,SplineChar *sc) { + SplineSet *ret, *temp; + + if ( si->radius==0 ) + si->radius=1; + if ( si->stroke_type == si_elipse ) { + real trans[6], factor; + StrokeInfo si2; + trans[0] = trans[3] = si->c; + trans[1] = -si->s; + trans[2] = si->s; + trans[4] = trans[5] = 0; + factor = si->radius/si->minorradius; + trans[0] *= factor; trans[1] *= factor; + temp = SplinePointListCopy(spl); +#if 0 + BisectTurners(temp); +#endif + temp = SplinePointListTransform(temp,trans,true); + si2 = *si; + si2.stroke_type = si_std; + ret = SplineSetStroke(temp,&si2,sc); + SplinePointListFree(temp); + trans[0] = trans[3] = si->c; + trans[1] = si->s; + trans[2] = -si->s; + trans[4] = trans[5] = 0; + factor = si->minorradius/si->radius; + trans[0] *= factor; trans[2] *= factor; + ret = SplinePointListTransform(ret,trans,true); + } else + ret = _SplineSetStroke(SSRemoveUTurns(spl),si,sc); +return( ret ); +} + + /* for angles between [penangle,penangle+90] use (-r,t/2) rotated by penangle */ + /* [penangle+90,penangle+180] use (-r,-t/2) */ + /* [penangle+180,penangle+270] use (r,-t/2) */ + /* [penangle+270,penangle] use (r,t/2) */ + +SplineSet *SSStroke(SplineSet *spl,StrokeInfo *si,SplineChar *sc) { + SplineSet *head=NULL, *last=NULL, *cur; + /*int was_clock = true;*/ + + for ( ; spl!=NULL; spl = spl->next ) { +#if 0 + if ( si->removeinternal || si->removeexternal ) + was_clock = SplinePointListIsClockwise(spl); +#endif + cur = SplineSetStroke(spl,si,sc); + if ( head==NULL ) + head = cur; + else + last->next = cur; +#if 0 + if ( was_clock==0 ) /* there'd better be only one spl in cur */ + SplineSetReverse(cur); +#endif + while ( cur->next!=NULL ) cur = cur->next; + last = cur; + } +return( head ); +} diff --git a/fontforge/splineutil.c b/fontforge/splineutil.c new file mode 100644 index 00000000..d946ecd3 --- /dev/null +++ b/fontforge/splineutil.c @@ -0,0 +1,4117 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include "psfont.h" +#include "ustring.h" +#include "utype.h" +#include "views.h" /* for FindSel structure */ + +/*#define DEBUG 1*/ + +typedef struct quartic { + double a,b,c,d,e; +} Quartic; + +/* In an attempt to make allocation more efficient I just keep preallocated */ +/* lists of certain common sizes. It doesn't seem to make much difference */ +/* when allocating stuff, but does when freeing. If the extra complexity */ +/* is bad then put: +/* #define chunkalloc(size) gcalloc(1,size) +/* #define chunkfree(item,size) free(item) +/* into splinefont.h after (or instead of) the definition of chunkalloc()*/ + +#ifndef chunkalloc +#define ALLOC_CHUNK 100 /* Number of small chunks to malloc at a time */ +#define CHUNK_MAX 40 /* Maximum size (in chunk units) that we are prepared to allocate */ + /* The size of our data structures */ +# define CHUNK_UNIT sizeof(void *) /* will vary with the word size of */ + /* the machine. if pointers are 64 bits*/ + /* we may need twice as much space as for 32 bits */ + +#ifdef FLAG +#undef FLAG +#define FLAG 0xbadcafe +#endif + +#ifdef CHUNKDEBUG +static int chunkdebug = 0; /* When this is set we never free anything, insuring that each chunk is unique */ +#endif + +#if ALLOC_CHUNK>1 +struct chunk { struct chunk *next; }; +struct chunk2 { struct chunk2 *next; int flag; }; +static struct chunk *chunklists[CHUNK_MAX] = { 0 }; +#endif + +#if defined(FLAG) && ALLOC_CHUNK>1 +void chunktest(void) { + int i; + struct chunk2 *c; + + for ( i=2; inext ) + if ( c->flag!=FLAG ) { + fprintf( stderr, "Chunk memory list has been corrupted\n" ); + abort(); + } +} +#endif + +void *chunkalloc(int size) { +# if ALLOC_CHUNK<=1 +return( gcalloc(1,size)); +# else + struct chunk *item; + int index; + + if ( (size&(CHUNK_UNIT-1)) || size>=CHUNK_MAX*CHUNK_UNIT || size<=sizeof(struct chunk)) { + fprintf( stderr, "Attempt to allocate something of size %d\n", size ); +return( gcalloc(1,size)); + } +#ifdef FLAG + chunktest(); +#endif + index = (size+CHUNK_UNIT-1)/CHUNK_UNIT; + if ( chunklists[index]==NULL ) { + char *pt, *end; + pt = galloc(ALLOC_CHUNK*size); + chunklists[index] = (struct chunk *) pt; + end = pt+(ALLOC_CHUNK-1)*size; + while ( ptnext = (struct chunk *) (pt + size); +#ifdef FLAG + ((struct chunk2 *) pt)->flag = FLAG; +#endif + pt += size; + } + ((struct chunk *) pt)->next = NULL; +#ifdef FLAG + ((struct chunk2 *) pt)->flag = FLAG; +#endif + } + item = chunklists[index]; + chunklists[index] = item->next; + memset(item,'\0',size); +return( item ); +# endif +} + +void chunkfree(void *item,int size) { + int index = (size+CHUNK_UNIT-1)/CHUNK_UNIT; +#ifdef CHUNKDEBUG + if ( chunkdebug ) +return; +#endif +# if ALLOC_CHUNK<=1 + free(item); +# else + if ( item==NULL ) +return; + if ( (size&(CHUNK_UNIT-1)) || size>=CHUNK_MAX*CHUNK_UNIT || size<=sizeof(struct chunk)) { + fprintf( stderr, "Attempt to free something of size %d\n", size ); + free(item); + } else { +#ifdef LOCAL_DEBUG + if ( (char *) (chunklists[index]) == (char *) item || + ( ((char *) (chunklists[index]))<(char *) item && + ((char *) (chunklists[index]))+size>(char *) item) || + ( ((char *) (chunklists[index]))>(char *) item && + ((char *) (chunklists[index]))<((char *) item)+size)) + GDrawIError( "Memory mixup. Chunk list is wrong!!!" ); +#endif + ((struct chunk *) item)->next = chunklists[index]; +# ifdef FLAG + if ( size>=sizeof(struct chunk2)) + ((struct chunk2 *) item)->flag = FLAG; +# endif + chunklists[index] = (struct chunk *) item; + } +# ifdef FLAG + chunktest(); +# endif +# endif +} +#endif + +void LineListFree(LineList *ll) { + LineList *next; + + while ( ll!=NULL ) { + next = ll->next; + chunkfree(ll,sizeof(LineList)); + ll = next; + } +} + +void LinearApproxFree(LinearApprox *la) { + LinearApprox *next; + + while ( la!=NULL ) { + next = la->next; + LineListFree(la->lines); + chunkfree(la,sizeof(LinearApprox)); + la = next; + } +} + +void SplineFree(Spline *spline) { + LinearApproxFree(spline->approx); + chunkfree(spline,sizeof(Spline)); +} + +SplinePoint *SplinePointCreate(real x, real y) { + SplinePoint *sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = x; sp->me.y = y; + sp->nextcp = sp->prevcp = sp->me; + sp->nonextcp = sp->noprevcp = true; + sp->nextcpdef = sp->prevcpdef = false; + sp->ttfindex = sp->nextcpindex = 0xfffe; +return( sp ); +} + +Spline *SplineMake3(SplinePoint *from, SplinePoint *to) { + Spline *spline = chunkalloc(sizeof(Spline)); + + spline->from = from; spline->to = to; + from->next = to->prev = spline; + SplineRefigure3(spline); +return( spline ); +} + +void SplinePointFree(SplinePoint *sp) { + chunkfree(sp->hintmask,sizeof(HintMask)); + chunkfree(sp,sizeof(SplinePoint)); +} + +void SplinePointMDFree(SplineChar *sc, SplinePoint *sp) { + MinimumDistance *md, *prev, *next; + + if ( sc!=NULL ) { + prev = NULL; + for ( md = sc->md; md!=NULL; md = next ) { + next = md->next; + if ( md->sp1==sp || md->sp2==sp ) { + if ( prev==NULL ) + sc->md = next; + else + prev->next = next; + chunkfree(md,sizeof(MinimumDistance)); + } else + prev = md; + } + } + + chunkfree(sp->hintmask,sizeof(HintMask)); + chunkfree(sp,sizeof(SplinePoint)); +} + +void SplinePointsFree(SplinePointList *spl) { + Spline *first, *spline, *next; + int nonext; + + if ( spl==NULL ) +return; + nonext = spl->first->next==NULL; + if ( spl->first!=NULL ) { + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = next ) { + next = spline->to->next; + SplinePointFree(spline->to); + SplineFree(spline); + if ( first==NULL ) first = spline; + } + if ( spl->last!=spl->first || nonext ) + SplinePointFree(spl->first); + } +} + +void SplinePointListFree(SplinePointList *spl) { + Spline *first, *spline, *next; + int nonext; + + if ( spl==NULL ) +return; + if ( spl->first!=NULL ) { + nonext = spl->first->next==NULL; + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = next ) { + next = spline->to->next; + SplinePointFree(spline->to); + SplineFree(spline); + if ( first==NULL ) first = spline; + } + if ( spl->last!=spl->first || nonext ) + SplinePointFree(spl->first); + } + chunkfree(spl,sizeof(SplinePointList)); +} + +void SplinePointListMDFree(SplineChar *sc,SplinePointList *spl) { + Spline *first, *spline, *next; + int same; + + if ( spl==NULL ) +return; + if ( spl->first!=NULL ) { + first = NULL; + same = ( spl->first->next == spl->first->prev ); + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline = next ) { + next = spline->to->next; + SplinePointMDFree(sc,spline->to); + SplineFree(spline); + if ( first==NULL ) first = spline; + } + if ( !same && ( spl->last!=spl->first || spl->first->next==NULL )) + SplinePointMDFree(sc,spl->first); + } + chunkfree(spl,sizeof(SplinePointList)); +} + +void SplinePointListsFree(SplinePointList *head) { + SplinePointList *spl, *next; + + for ( spl=head; spl!=NULL; spl=next ) { + next = spl->next; + SplinePointListFree(spl); + } +} + +void ImageListsFree(ImageList *imgs) { + ImageList *inext; + + while ( imgs!=NULL ) { + inext = imgs->next; + chunkfree(imgs,sizeof(ImageList)); + imgs = inext; + } +} + +void RefCharFree(RefChar *ref) { +#ifdef FONTFORGE_CONFIG_TYPE3 + int i; + + if ( ref==NULL ) +return; + for ( i=0; ilayer_cnt; ++i ) { + SplinePointListsFree(ref->layers[i].splines); + ImageListsFree(ref->layers[i].images); + } + free(ref->layers); +#else + if ( ref==NULL ) +return; + SplinePointListsFree(ref->layers[0].splines); +#endif + chunkfree(ref,sizeof(RefChar)); +} + +RefChar *RefCharCreate(void) { + RefChar *ref = chunkalloc(sizeof(RefChar)); +#ifdef FONTFORGE_CONFIG_TYPE3 + ref->layers = gcalloc(1,sizeof(struct reflayer)); + ref->layers[0].fill_brush.opacity = ref->layers[0].stroke_pen.brush.opacity = 1.0; + ref->layers[0].fill_brush.col = ref->layers[0].stroke_pen.brush.col = COLOR_INHERITED; + ref->layers[0].stroke_pen.width = WIDTH_INHERITED; + ref->layers[0].stroke_pen.linecap = lc_inherited; + ref->layers[0].stroke_pen.linejoin = lj_inherited; + ref->layers[0].dofill = true; +#endif + ref->layer_cnt = 1; +return( ref ); +} + +void RefCharsFree(RefChar *ref) { + RefChar *rnext; + + while ( ref!=NULL ) { + rnext = ref->next; + RefCharFree(ref); + ref = rnext; + } +} + +static double SolveCubic(double a, double b, double c, double d, double err, double t0) { + /* find t between t0 and .5 where at^3+bt^2+ct+d == +/- err */ + double t, val, offset; + int first; + + offset=a; + if ( a<0 ) offset = -a; + if ( b<0 ) offset -= b; else offset += b; + if ( c<0 ) offset -= c; else offset += c; + offset += 1; /* Make sure it isn't 0 */ + offset = err/(10.*offset); + if ( offset<.00001 ) offset = .00001; else if ( offset>.01 ) offset = .01; + + first = 1; + for ( t=t0+offset; t<.5; t += offset ) { + val = ((a*t+b)*t+c)*t+d; + if ( val>=err || val<=-err ) + break; + first = 0; + } + if ( !first ) + t -= offset; + if ( t>.5 ) t=.5; + +return( t ); +} + +static double SolveCubicBack(double a, double b, double c, double d, double err, double t0) { + /* find t between .5 and t0 where at^3+bt^2+ct+d == +/- err */ + double t, val, offset; + int first; + + offset=a; + if ( a<0 ) offset = -a; + if ( b<0 ) offset -= b; else offset += b; + if ( c<0 ) offset -= c; else offset += c; + offset += 1; /* Make sure it isn't 0 */ + offset = err/(10.*offset); + if ( offset<.00001 ) offset = .00001; else if ( offset>.01 ) offset = .01; + + first = 1; + for ( t=t0-offset; t>.5; t -= offset ) { + val = ((a*t+b)*t+c)*t+d; + if ( val>=err || val<=-err ) + break; + first = 0; + } + if ( !first ) + t -= offset; + if ( t<.5 ) t=.5; + +return( t ); +} + +/* Remove line segments which are just one point long */ +/* Merge colinear line segments */ +/* Merge two segments each of which involves a single pixel change in one dimension (cut corners) */ +static void SimplifyLineList(LineList *prev) { + LineList *next, *lines; + + if ( prev->next==NULL ) +return; + lines = prev->next; + while ( (next = lines->next)!=NULL ) { + if ( (prev->here.x==lines->here.x && prev->here.y == lines->here.y ) || + ( prev->here.x==lines->here.x && lines->here.x==next->here.x ) || + ( prev->here.y==lines->here.y && lines->here.y==next->here.y ) || + (( prev->here.x==next->here.x+1 || prev->here.x==next->here.x-1 ) && + ( prev->here.y==next->here.y+1 || prev->here.y==next->here.y-1 )) ) { + lines->here = next->here; + lines->next = next->next; + chunkfree(next,sizeof(*next)); + } else { + prev = lines; + lines = next; + } + } + if ( prev!=NULL && + prev->here.x==lines->here.x && prev->here.y == lines->here.y ) { + prev->next = lines->next; + chunkfree(lines,sizeof(*lines)); + lines = prev->next; + } + + if ( lines!=NULL ) while ( (next = lines->next)!=NULL ) { + if ( prev->here.x!=next->here.x ) { + double slope = (next->here.y-prev->here.y) / (double) (next->here.x-prev->here.x); + double inter = prev->here.y - slope*prev->here.x; + int y = rint(lines->here.x*slope + inter); + if ( y == lines->here.y ) { + lines->here = next->here; + lines->next = next->next; + chunkfree(next,sizeof(*next)); + } else + lines = next; + } else + lines = next; + } +} + +LinearApprox *SplineApproximate(Spline *spline, real scale) { + LinearApprox *test; + LineList *cur, *last=NULL, *prev; + double tx,ty,t; + double slpx, slpy; + double intx, inty; + + for ( test = spline->approx; test!=NULL && test->scale!=scale; test = test->next ); + if ( test!=NULL ) +return( test ); + + test = chunkalloc(sizeof(LinearApprox)); + test->scale = scale; + test->next = spline->approx; + spline->approx = test; + + cur = chunkalloc(sizeof(LineList) ); + cur->here.x = rint(spline->from->me.x*scale); + cur->here.y = rint(spline->from->me.y*scale); + test->lines = last = cur; + if ( spline->knownlinear ) { + cur = chunkalloc(sizeof(LineList) ); + cur->here.x = rint(spline->to->me.x*scale); + cur->here.y = rint(spline->to->me.y*scale); + last->next = cur; + } else { + /* find t so that (xt,yt) is a half pixel off from (cx*t+dx,cy*t+dy) */ + /* min t of scale*(ax*t^3+bx*t^2)==.5, scale*(ay*t^3+by*t^2)==.5 */ + /* I do this from both ends in. this is because I miss essential */ + /* symmetry if I go from one end to the other. */ + /* first start at 0 and go to .5, the first linear approximation is easy */ + /* it's just the function itself ignoring higher orders, so the error*/ + /* is just the higher orders */ + tx = SolveCubic(spline->splines[0].a,spline->splines[0].b,0,0,.5/scale,0); + ty = SolveCubic(spline->splines[1].a,spline->splines[1].b,0,0,.5/scale,0); + t = (txhere.x = rint( (((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t + spline->splines[0].d)*scale ); + cur->here.y = rint( (((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t + spline->splines[1].d)*scale ); + last->next = cur; + last = cur; + while ( t<.5 ) { + slpx = (3*spline->splines[0].a*t+2*spline->splines[0].b)*t+spline->splines[0].c; + slpy = (3*spline->splines[1].a*t+2*spline->splines[1].b)*t+spline->splines[1].c; + intx = ((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c-slpx)*t + spline->splines[0].d; + inty = ((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c-slpy)*t + spline->splines[1].d; + tx = SolveCubic(spline->splines[0].a,spline->splines[0].b,spline->splines[0].c-slpx,spline->splines[0].d-intx,.5/scale,t); + ty = SolveCubic(spline->splines[1].a,spline->splines[1].b,spline->splines[1].c-slpy,spline->splines[1].d-inty,.5/scale,t); + t = (txhere.x = rint( (((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t + spline->splines[0].d)*scale ); + cur->here.y = rint( (((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t + spline->splines[1].d)*scale ); + last->next = cur; + last = cur; + } + + /* Now start at t=1 and work back to t=.5 */ + prev = NULL; + cur = chunkalloc(sizeof(LineList) ); + cur->here.x = rint(spline->to->me.x*scale); + cur->here.y = rint(spline->to->me.y*scale); + prev = cur; + t=1.0; + while ( 1 ) { + slpx = (3*spline->splines[0].a*t+2*spline->splines[0].b)*t+spline->splines[0].c; + slpy = (3*spline->splines[1].a*t+2*spline->splines[1].b)*t+spline->splines[1].c; + intx = ((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c-slpx)*t + spline->splines[0].d; + inty = ((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c-slpy)*t + spline->splines[1].d; + tx = SolveCubicBack(spline->splines[0].a,spline->splines[0].b,spline->splines[0].c-slpx,spline->splines[0].d-intx,.5/scale,t); + ty = SolveCubicBack(spline->splines[1].a,spline->splines[1].b,spline->splines[1].c-slpy,spline->splines[1].d-inty,.5/scale,t); + t = (tx>ty)?tx:ty; + cur = chunkalloc(sizeof(LineList) ); + cur->here.x = rint( (((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t + spline->splines[0].d)*scale ); + cur->here.y = rint( (((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t + spline->splines[1].d)*scale ); + cur->next = prev; + prev = cur; + if ( t<=.5 ) + break; + } + last->next = cur; + SimplifyLineList(test->lines); + } + if ( test->lines->next==NULL ) { + test->oneline = 1; + test->onepoint = 1; + } else if ( test->lines->next->next == NULL ) { + test->oneline = 1; + } +return( test ); +} + +static void SplineFindBounds(Spline *sp, DBounds *bounds) { + real t, b2_fourac, v; + real min, max; + Spline1D *sp1; + int i; + + /* first try the end points */ + for ( i=0; i<2; ++i ) { + sp1 = &sp->splines[i]; + if ( i==0 ) { + if ( sp->to->me.xminx ) bounds->minx = sp->to->me.x; + if ( sp->to->me.x>bounds->maxx ) bounds->maxx = sp->to->me.x; + min = bounds->minx; max = bounds->maxx; + } else { + if ( sp->to->me.yminy ) bounds->miny = sp->to->me.y; + if ( sp->to->me.y>bounds->maxy ) bounds->maxy = sp->to->me.y; + min = bounds->miny; max = bounds->maxy; + } + + /* then try the extrema of the spline (assuming they are between t=(0,1) */ + if ( sp1->a!=0 ) { + b2_fourac = 4*sp1->b*sp1->b - 12*sp1->a*sp1->c; + if ( b2_fourac>=0 ) { + b2_fourac = sqrt(b2_fourac); + t = (-2*sp1->b + b2_fourac) / (6*sp1->a); + if ( t>0 && t<1 ) { + v = ((sp1->a*t+sp1->b)*t+sp1->c)*t + sp1->d; + if ( vmax ) max = v; + } + t = (-2*sp1->b - b2_fourac) / (6*sp1->a); + if ( t>0 && t<1 ) { + v = ((sp1->a*t+sp1->b)*t+sp1->c)*t + sp1->d; + if ( vmax ) max = v; + } + } + } else if ( sp1->b!=0 ) { + t = -sp1->c/(2.0*sp1->b); + if ( t>0 && t<1 ) { + v = (sp1->b*t+sp1->c)*t + sp1->d; + if ( vmax ) max = v; + } + } + if ( i==0 ) { + bounds->minx = min; bounds->maxx = max; + } else { + bounds->miny = min; bounds->maxy = max; + } + } +} + +static void _SplineSetFindBounds(SplinePointList *spl, DBounds *bounds) { + Spline *spline, *first; + /* Ignore contours consisting of a single point (used for hinting, anchors */ + /* for mark to base, etc. */ + + for ( ; spl!=NULL; spl = spl->next ) if ( spl->first->next!=NULL && spl->first->next->to != spl->first ) { + first = NULL; + if ( bounds->minx==0 && bounds->maxx==0 && bounds->miny==0 && bounds->maxy == 0 ) { + bounds->minx = bounds->maxx = spl->first->me.x; + bounds->miny = bounds->maxy = spl->first->me.y; + } else { + if ( spl->first->me.xminx ) bounds->minx = spl->first->me.x; + if ( spl->first->me.x>bounds->maxx ) bounds->maxx = spl->first->me.x; + if ( spl->first->me.yminy ) bounds->miny = spl->first->me.y; + if ( spl->first->me.y>bounds->maxy ) bounds->maxy = spl->first->me.y; + } + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + SplineFindBounds(spline,bounds); + if ( first==NULL ) first = spline; + } + } +} + +void SplineSetFindBounds(SplinePointList *spl, DBounds *bounds) { + memset(bounds,'\0',sizeof(*bounds)); + _SplineSetFindBounds(spl,bounds); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static void _ImageFindBounds(ImageList *img,DBounds *bounds) { + if ( bounds->minx==0 && bounds->maxx==0 && bounds->miny==0 && bounds->maxy == 0 ) + *bounds = img->bb; + else if ( img->bb.minx!=0 || img->bb.maxx != 0 || img->bb.maxy != 0 || img->bb.miny!=0 ) { + if ( img->bb.minx < bounds->minx ) bounds->minx = img->bb.minx; + if ( img->bb.miny < bounds->miny ) bounds->miny = img->bb.miny; + if ( img->bb.maxx > bounds->maxx ) bounds->maxx = img->bb.maxx; + if ( img->bb.maxy > bounds->maxy ) bounds->maxy = img->bb.maxy; + } +} +#endif + +void SplineCharFindBounds(SplineChar *sc,DBounds *bounds) { + RefChar *rf; + int i; +#ifdef FONTFORGE_CONFIG_TYPE3 + ImageList *img; + real extra=0,e; +#endif + + /* a char with no splines (ie. a space) must have an lbearing of 0 */ + bounds->minx = bounds->maxx = 0; + bounds->miny = bounds->maxy = 0; + + for ( i=ly_fore; ilayer_cnt; ++i ) { + for ( rf=sc->layers[i].refs; rf!=NULL; rf = rf->next ) { + if ( bounds->minx==0 && bounds->maxx==0 && bounds->miny==0 && bounds->maxy == 0 ) + *bounds = rf->bb; + else if ( rf->bb.minx!=0 || rf->bb.maxx != 0 || rf->bb.maxy != 0 || rf->bb.miny!=0 ) { + if ( rf->bb.minx < bounds->minx ) bounds->minx = rf->bb.minx; + if ( rf->bb.miny < bounds->miny ) bounds->miny = rf->bb.miny; + if ( rf->bb.maxx > bounds->maxx ) bounds->maxx = rf->bb.maxx; + if ( rf->bb.maxy > bounds->maxy ) bounds->maxy = rf->bb.maxy; + } + } + _SplineSetFindBounds(sc->layers[i].splines,bounds); +#ifdef FONTFORGE_CONFIG_TYPE3 + for ( img=sc->layers[i].images; img!=NULL; img=img->next ) + _ImageFindBounds(img,bounds); + if ( sc->layers[i].dostroke ) { + if ( sc->layers[i].stroke_pen.width!=WIDTH_INHERITED ) + e = sc->layers[i].stroke_pen.width*sc->layers[i].stroke_pen.trans[0]; + else + e = sc->layers[i].stroke_pen.trans[0]; + if ( e>extra ) extra = e; + } +#endif + } +#ifdef FONTFORGE_CONFIG_TYPE3 + bounds->minx -= extra; bounds->miny -= extra; + bounds->maxx += extra; bounds->maxy += extra; +#endif +} + +void SplineFontFindBounds(SplineFont *sf,DBounds *bounds) { + RefChar *rf; + int i, k; +#ifdef FONTFORGE_CONFIG_TYPE3 + real extra=0,e; + ImageList *img; +#endif + + bounds->minx = bounds->maxx = 0; + bounds->miny = bounds->maxy = 0; + + for ( i = 0; icharcnt; ++i ) { + SplineChar *sc = sf->chars[i]; + if ( sc!=NULL ) { + for ( k=ly_fore; klayer_cnt; ++k ) { + for ( rf=sc->layers[k].refs; rf!=NULL; rf = rf->next ) { + if ( bounds->minx==0 && bounds->maxx==0 && bounds->miny==0 && bounds->maxy == 0 ) + *bounds = rf->bb; + else if ( rf->bb.minx!=0 || rf->bb.maxx != 0 || rf->bb.maxy != 0 || rf->bb.miny!=0 ) { + if ( rf->bb.minx < bounds->minx ) bounds->minx = rf->bb.minx; + if ( rf->bb.miny < bounds->miny ) bounds->miny = rf->bb.miny; + if ( rf->bb.maxx > bounds->maxx ) bounds->maxx = rf->bb.maxx; + if ( rf->bb.maxy > bounds->maxy ) bounds->maxy = rf->bb.maxy; + } + } + + _SplineSetFindBounds(sc->layers[k].splines,bounds); +#ifdef FONTFORGE_CONFIG_TYPE3 + for ( img=sc->layers[k].images; img!=NULL; img=img->next ) + _ImageFindBounds(img,bounds); + if ( sc->layers[k].dostroke ) { + if ( sc->layers[k].stroke_pen.width!=WIDTH_INHERITED ) + e = sc->layers[k].stroke_pen.width*sc->layers[k].stroke_pen.trans[0]; + else + e = sc->layers[k].stroke_pen.trans[0]; + if ( e>extra ) extra = e; + } +#endif + } + } + } +#ifdef FONTFORGE_CONFIG_TYPE3 + bounds->minx -= extra; bounds->miny -= extra; + bounds->maxx += extra; bounds->maxy += extra; +#endif +} + +void CIDFindBounds(SplineFont *cidmaster,DBounds *bounds) { + SplineFont *sf; + int i; + DBounds b; + real factor; + + sf = cidmaster->subfonts[0]; + SplineFontFindBounds(sf,bounds); + factor = 1000.0/(sf->ascent+sf->descent); + bounds->maxx *= factor; bounds->minx *= factor; bounds->miny *= factor; bounds->maxy *= factor; + for ( i=1; isubfontcnt; ++i ) { + sf = cidmaster->subfonts[i]; + SplineFontFindBounds(sf,&b); + factor = 1000.0/(sf->ascent+sf->descent); + b.maxx *= factor; b.minx *= factor; b.miny *= factor; b.maxy *= factor; + if ( b.maxx>bounds->maxx ) bounds->maxx = b.maxx; + if ( b.maxy>bounds->maxy ) bounds->maxy = b.maxy; + if ( b.minyminy ) bounds->miny = b.miny; + if ( b.minxminx ) bounds->minx = b.minx; + } +} + +static void _SplineSetFindTop(SplineSet *ss,BasePoint *top) { + SplinePoint *sp; + + for ( ; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->me.y > top->y ) *top = sp->me; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } +} + +#ifndef FONTFORGE_CONFIG_TYPE3 +static void SplineSetFindTop(SplineSet *ss,BasePoint *top) { + + top->y = -1e10; + _SplineSetFindTop(ss,top); + if ( top->y < -65536 ) top->y = top->x = 0; +} +#endif + +void SplineSetQuickBounds(SplineSet *ss,DBounds *b) { + SplinePoint *sp; + + b->minx = b->miny = 1e10; + b->maxx = b->maxy = -1e10; + for ( ; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->me.y < b->miny ) b->miny = sp->me.y; + if ( sp->me.x < b->minx ) b->minx = sp->me.x; + if ( sp->me.y > b->maxy ) b->maxy = sp->me.y; + if ( sp->me.x > b->maxx ) b->maxx = sp->me.x; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + if ( b->minx>65536 ) b->minx = 0; + if ( b->miny>65536 ) b->miny = 0; + if ( b->maxx<-65536 ) b->maxx = 0; + if ( b->maxy<-65536 ) b->maxy = 0; +} + +void SplineCharQuickBounds(SplineChar *sc, DBounds *b) { + RefChar *ref; + int i; + + for ( i=ly_fore; ilayer_cnt; ++i ) { + SplineSetQuickBounds(sc->layers[i].splines,b); + for ( ref = sc->layers[i].refs; ref!=NULL; ref = ref->next ) { + /*SplineSetQuickBounds(ref->layers[0].splines,&temp);*/ + if ( b->minx==0 && b->maxx==0 && b->miny==0 && b->maxy == 0 ) + *b = ref->bb; + else if ( ref->bb.minx!=0 || ref->bb.maxx != 0 || ref->bb.maxy != 0 || ref->bb.miny!=0 ) { + if ( ref->bb.minx < b->minx ) b->minx = ref->bb.minx; + if ( ref->bb.miny < b->miny ) b->miny = ref->bb.miny; + if ( ref->bb.maxx > b->maxx ) b->maxx = ref->bb.maxx; + if ( ref->bb.maxy > b->maxy ) b->maxy = ref->bb.maxy; + } + } + } +} + +void SplineSetQuickConservativeBounds(SplineSet *ss,DBounds *b) { + SplinePoint *sp; + + b->minx = b->miny = 1e10; + b->maxx = b->maxy = -1e10; + for ( ; ss!=NULL; ss=ss->next ) { + for ( sp=ss->first; ; ) { + if ( sp->me.y < b->miny ) b->miny = sp->me.y; + if ( sp->me.x < b->minx ) b->minx = sp->me.x; + if ( sp->me.y > b->maxy ) b->maxy = sp->me.y; + if ( sp->me.x > b->maxx ) b->maxx = sp->me.x; + if ( sp->nextcp.y < b->miny ) b->miny = sp->nextcp.y; + if ( sp->nextcp.x < b->minx ) b->minx = sp->nextcp.x; + if ( sp->nextcp.y > b->maxy ) b->maxy = sp->nextcp.y; + if ( sp->nextcp.x > b->maxx ) b->maxx = sp->nextcp.x; + if ( sp->prevcp.y < b->miny ) b->miny = sp->prevcp.y; + if ( sp->prevcp.x < b->minx ) b->minx = sp->prevcp.x; + if ( sp->prevcp.y > b->maxy ) b->maxy = sp->prevcp.y; + if ( sp->prevcp.x > b->maxx ) b->maxx = sp->prevcp.x; + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } + } + if ( b->minx>65536 ) b->minx = 0; + if ( b->miny>65536 ) b->miny = 0; + if ( b->maxx<-65536 ) b->maxx = 0; + if ( b->maxy<-65536 ) b->maxy = 0; +} + +void SplineCharQuickConservativeBounds(SplineChar *sc, DBounds *b) { + RefChar *ref; + int i; + + for ( i=ly_fore; ilayer_cnt; ++i ) { + SplineSetQuickConservativeBounds(sc->layers[i].splines,b); + for ( ref = sc->layers[i].refs; ref!=NULL; ref = ref->next ) { + /*SplineSetQuickConservativeBounds(ref->layers[0].splines,&temp);*/ + if ( b->minx==0 && b->maxx==0 && b->miny==0 && b->maxy == 0 ) + *b = ref->bb; + else if ( ref->bb.minx!=0 || ref->bb.maxx != 0 || ref->bb.maxy != 0 || ref->bb.miny!=0 ) { + if ( ref->bb.minx < b->minx ) b->minx = ref->bb.minx; + if ( ref->bb.miny < b->miny ) b->miny = ref->bb.miny; + if ( ref->bb.maxx > b->maxx ) b->maxx = ref->bb.maxx; + if ( ref->bb.maxy > b->maxy ) b->maxy = ref->bb.maxy; + } + } + } +} + +void SplineFontQuickConservativeBounds(SplineFont *sf,DBounds *b) { + DBounds bb; + int i; + + b->minx = b->miny = 1e10; + b->maxx = b->maxy = -1e10; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SplineCharQuickConservativeBounds(sf->chars[i],&bb); + if ( bb.minx < b->minx ) b->minx = bb.minx; + if ( bb.miny < b->miny ) b->miny = bb.miny; + if ( bb.maxx > b->maxx ) b->maxx = bb.maxx; + if ( bb.maxy > b->maxy ) b->maxy = bb.maxy; + } + if ( b->minx>65536 ) b->minx = 0; + if ( b->miny>65536 ) b->miny = 0; + if ( b->maxx<-65536 ) b->maxx = 0; + if ( b->maxy<-65536 ) b->maxy = 0; +} + +void SplinePointCatagorize(SplinePoint *sp) { + + sp->pointtype = pt_corner; + if ( sp->next==NULL && sp->prev==NULL ) + ; + else if ( (sp->next!=NULL && sp->next->to->me.x==sp->me.x && sp->next->to->me.y==sp->me.y) || + (sp->prev!=NULL && sp->prev->from->me.x==sp->me.x && sp->prev->from->me.y==sp->me.y )) + ; + else if ( sp->next==NULL ) { + sp->pointtype = sp->noprevcp ? pt_corner : pt_curve; + } else if ( sp->prev==NULL ) { + sp->pointtype = sp->nonextcp ? pt_corner : pt_curve; + } else if ( sp->nonextcp && sp->noprevcp ) { + ; + } else if ( !sp->nonextcp && !sp->noprevcp ) { + if ( sp->nextcp.y==sp->prevcp.y && sp->nextcp.y==sp->me.y ) { + if ( (sp->nextcp.x-sp->me.x<0 && sp->me.x-sp->prevcp.x<0) || + (sp->nextcp.x-sp->me.x>0 && sp->me.x-sp->prevcp.x>0)) + sp->pointtype = pt_curve; + } else if ( sp->nextcp.x!=sp->prevcp.x ) { + real slope = (sp->nextcp.y-sp->prevcp.y)/(sp->nextcp.x-sp->prevcp.x); + real y = slope*(sp->me.x-sp->prevcp.x) + sp->prevcp.y - sp->me.y; + if ( y<1 && y>-1 ) + sp->pointtype = pt_curve; + else if ( sp->nextcp.y!=sp->prevcp.y ) { + real x; + slope = (sp->nextcp.x-sp->prevcp.x)/(sp->nextcp.y-sp->prevcp.y); + x = slope*(sp->me.y-sp->prevcp.y) + sp->prevcp.x - sp->me.x; + if ( x<1 && x>-1 ) + sp->pointtype = pt_curve; + } else if ( sp->me.y == sp->nextcp.y ) + sp->pointtype = pt_curve; + } else if ( sp->me.x == sp->nextcp.x ) + sp->pointtype = pt_curve; + } else if ( sp->nonextcp && (sp->me.x!=sp->next->to->me.x || sp->me.y!=sp->next->to->me.y)) { + if ( sp->next->to->me.x!=sp->prevcp.x ) { + real slope = (sp->next->to->me.y-sp->prevcp.y)/(sp->next->to->me.x-sp->prevcp.x); + real y = slope*(sp->me.x-sp->prevcp.x) + sp->prevcp.y - sp->me.y; + if ( y<1 && y>-1 ) + sp->pointtype = pt_tangent; + } else if ( sp->me.x == sp->prevcp.x ) + sp->pointtype = pt_tangent; + } else if ( sp->noprevcp && (sp->me.x!=sp->prev->from->me.x || sp->me.y!=sp->prev->from->me.y)) { + if ( sp->nextcp.x!=sp->prev->from->me.x ) { + real slope = (sp->nextcp.y-sp->prev->from->me.y)/(sp->nextcp.x-sp->prev->from->me.x); + real y = slope*(sp->me.x-sp->prev->from->me.x) + sp->prev->from->me.y - sp->me.y; + if ( y<1 && y>-1 ) + sp->pointtype = pt_tangent; + } else if ( sp->me.x == sp->nextcp.x ) + sp->pointtype = pt_tangent; + } +} + +int SplinePointIsACorner(SplinePoint *sp) { + enum pointtype old = sp->pointtype, new; + + SplinePointCatagorize(sp); + new = sp->pointtype; + sp->pointtype = old; +return( new==pt_corner ); +} + +void SPLCatagorizePoints(SplinePointList *spl) { + Spline *spline, *first, *last=NULL; + + for ( ; spl!=NULL; spl = spl->next ) { + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + SplinePointCatagorize(spline->from); + last = spline; + if ( first==NULL ) first = spline; + } + if ( spline==NULL && last!=NULL ) + SplinePointCatagorize(last->to); + } +} + +void SCCatagorizePoints(SplineChar *sc) { +#ifdef FONTFORGE_CONFIG_TYPE3 + int i; + for ( i=ly_fore; ilayer_cnt; ++i ) + SPLCatagorizePoints(sc->layers[i].splines); +#else + SPLCatagorizePoints(sc->layers[ly_fore].splines); +#endif +} + +static int CharsNotInEncoding(FontDict *fd) { + int i, cnt, j; + + for ( i=cnt=0; ichars->cnt; ++i ) { + if ( fd->chars->keys[i]!=NULL ) { + for ( j=0; j<256; ++j ) + if ( fd->encoding[j]!=NULL && + strcmp(fd->encoding[j],fd->chars->keys[i])==0 ) + break; + if ( j==256 ) + ++cnt; + } + } + /* And for type 3 fonts... */ + if ( fd->charprocs!=NULL ) for ( i=0; icharprocs->cnt; ++i ) { + if ( fd->charprocs->keys[i]!=NULL ) { + for ( j=0; j<256; ++j ) + if ( fd->encoding[j]!=NULL && + strcmp(fd->encoding[j],fd->charprocs->keys[i])==0 ) + break; + if ( j==256 ) + ++cnt; + } + } +return( cnt ); +} + +static int LookupCharString(char *encname,struct pschars *chars) { + int k; + + for ( k=0; kcnt; ++k ) { + if ( chars->keys[k]!=NULL ) + if ( strcmp(encname,chars->keys[k])==0 ) +return( k ); + } +return( -1 ); +} + +SplinePointList *SplinePointListCopy1(SplinePointList *spl) { + SplinePointList *cur; + SplinePoint *pt, *cpt, *first; + Spline *spline; + + cur = chunkalloc(sizeof(SplinePointList)); + + first = NULL; + for ( pt=spl->first; pt!=NULL && pt!=first; pt = pt->next->to ) { + cpt = chunkalloc(sizeof(SplinePoint)); + *cpt = *pt; + if ( pt->hintmask!=NULL ) { + cpt->hintmask = chunkalloc(sizeof(HintMask)); + memcpy(cpt->hintmask,pt->hintmask,sizeof(HintMask)); + } + cpt->next = cpt->prev = NULL; + if ( cur->first==NULL ) + cur->first = cur->last = cpt; + else { + spline = chunkalloc(sizeof(Spline)); + *spline = *pt->prev; + spline->from = cur->last; + cur->last->next = spline; + cpt->prev = spline; + spline->to = cpt; + spline->approx = NULL; + cur->last = cpt; + } + if ( pt->next==NULL ) + break; + if ( first==NULL ) first = pt; + } + if ( pt==first ) { + cpt = cur->first; + spline = chunkalloc(sizeof(Spline)); + *spline = *pt->prev; + spline->from = cur->last; + cur->last->next = spline; + cpt->prev = spline; + spline->to = cpt; + spline->approx = NULL; + cur->last = cpt; + } +return( cur ); +} + +/* If this routine is called we are guarenteed that: + at least one point on the splineset is selected + not all points on the splineset are selected +*/ +static SplinePointList *SplinePointListCopySelected1(SplinePointList *spl) { + SplinePointList *head=NULL, *last=NULL, *cur; + SplinePoint *cpt, *first, *start; + Spline *spline; + + start = spl->first; + if ( spl->first==spl->last ) { + /* If it's a circle and the start point is selected then we don't know*/ + /* where that selection began (and we have to keep it with the things*/ + /* that precede it when we make the new splinesets), so loop until we*/ + /* find something unselected */ + while ( start->selected ) + start = start->next->to; + } + first = NULL; + while ( start != NULL && start!=first ) { + while ( start!=NULL && start!=first && !start->selected ) { + if ( first==NULL ) first = start; + if ( start->next==NULL ) { + start = NULL; + break; + } + start = start->next->to; + } + if ( start==NULL || start==first ) + break; + cur = chunkalloc(sizeof(SplinePointList)); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + + while ( start!=NULL && start->selected && start!=first ) { + cpt = chunkalloc(sizeof(SplinePoint)); + *cpt = *start; + cpt->hintmask = NULL; + cpt->next = cpt->prev = NULL; + if ( cur->first==NULL ) + cur->first = cur->last = cpt; + else { + spline = chunkalloc(sizeof(Spline)); + *spline = *start->prev; + spline->from = cur->last; + cur->last->next = spline; + cpt->prev = spline; + spline->to = cpt; + spline->approx = NULL; + cur->last = cpt; + } + if ( first==NULL ) first = start; + if ( start->next==NULL ) { + start = NULL; + break; + } + start = start->next->to; + } + } +return( head ); +} + +SplinePointList *SplinePointListCopy(SplinePointList *base) { + SplinePointList *head=NULL, *last=NULL, *cur; + + for ( ; base!=NULL; base = base->next ) { + cur = SplinePointListCopy1(base); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + } +return( head ); +} + +SplinePointList *SplinePointListCopySelected(SplinePointList *base) { + SplinePointList *head=NULL, *last=NULL, *cur=NULL; + SplinePoint *pt, *first; + int anysel, allsel; + + for ( ; base!=NULL; base = base->next ) { + anysel = false; allsel = true; + first = NULL; + for ( pt=base->first; pt!=NULL && pt!=first; pt = pt->next->to ) { + if ( pt->selected ) anysel = true; + else allsel = false; + if ( first==NULL ) first = pt; + if ( pt->next==NULL ) + break; + } + if ( allsel ) + cur = SplinePointListCopy1(base); + else if ( anysel ) + cur = SplinePointListCopySelected1(base); + if ( anysel ) { + if ( head==NULL ) + head = cur; + else + last->next = cur; + for ( last = cur; last->next ; last = last->next ); + } + } +return( head ); +} + +static SplinePointList *SplinePointListSplit(SplineChar *sc,SplinePointList *spl) { + SplinePointList *head=NULL, *last=NULL, *cur; + SplinePoint *first, *start, *next; + + start = spl->first; + if ( spl->first==spl->last ) { + /* If it's a circle and the start point isnt selected then we don't know*/ + /* where that selection began (and we have to keep it with the things*/ + /* that precede it when we make the new splinesets), so loop until we*/ + /* find something selected */ + while ( !start->selected ) + start = start->next->to; + } + first = NULL; + while ( start != NULL && start!=first ) { + while ( start!=NULL && start!=first && start->selected ) { + if ( first==NULL ) first = start; + if ( start->prev!=NULL ) { + start->prev->from->next = NULL; + SplineFree(start->prev); + } + if ( start->next!=NULL ) { + next = start->next->to; + next->prev = NULL; + SplineFree(start->next); + } else + next = NULL; + SplinePointMDFree(sc,start); + start = next; + } + if ( start==NULL || start==first ) + break; + if ( head==NULL ) { + head = cur = spl; + spl->first = spl->last = NULL; + } else { + cur = chunkalloc(sizeof(SplinePointList)); + last->next = cur; + } + last = cur; + + while ( start!=NULL && !start->selected && start!=first ) { + if ( cur->first==NULL ) + cur->first = start; + cur->last = start; + if ( start->next!=NULL ) { + next = start->next->to; + if ( next->selected ) { + SplineFree(start->next); + start->next = NULL; + next->prev = NULL; + } + } else + next = NULL; + if ( first==NULL ) first = start; + start = next; + } + } +return( last ); +} + +SplinePointList *SplinePointListRemoveSelected(SplineChar *sc,SplinePointList *base) { + SplinePointList *head=NULL, *last=NULL, *next; + SplinePoint *pt, *first; + int anysel, allsel; + + for ( ; base!=NULL; base = next ) { + next = base->next; + anysel = false; allsel = true; + first = NULL; + for ( pt=base->first; pt!=NULL && pt!=first; pt = pt->next->to ) { + if ( pt->selected ) anysel = true; + else allsel = false; + if ( first==NULL ) first = pt; + if ( pt->next==NULL ) + break; + } + if ( allsel ) { + SplinePointListMDFree(sc,base); + continue; + } + if ( head==NULL ) + head = base; + else + last->next = base; + last = base; + if ( anysel ) + last = SplinePointListSplit(sc,base); + } + if ( last!=NULL ) last->next = NULL; +return( head ); +} + +ImageList *ImageListCopy(ImageList *cimg) { + ImageList *head=NULL, *last=NULL, *new; + + for ( ; cimg!=NULL; cimg=cimg->next ) { + new = chunkalloc(sizeof(ImageList)); + *new = *cimg; + new->next = NULL; + if ( last==NULL ) + head = last = new; + else { + last->next = new; + last = new; + } + } +return( head ); +} + +ImageList *ImageListTransform(ImageList *img, real transform[6]) { + ImageList *head = img; + + /* Don't support rotating, flipping or skewing images */; + if ( transform[0]!=0 && transform[3]!=0 ) { + while ( img!=NULL ) { + double x = img->xoff; + img->xoff = transform[0]*x + transform[2]*img->yoff + transform[4]; + img->yoff = transform[1]*x + transform[3]*img->yoff + transform[5]; + if (( img->xscale *= transform[0])<0 ) { + img->xoff += img->xscale * + (img->image->list_len==0?img->image->u.image:img->image->u.images[0])->width; + img->xscale = -img->xscale; + } + if (( img->yscale *= transform[3])<0 ) { + img->yoff += img->yscale * + (img->image->list_len==0?img->image->u.image:img->image->u.images[0])->height; + img->yscale = -img->yscale; + } + img->bb.minx = img->xoff; img->bb.maxy = img->yoff; + img->bb.maxx = img->xoff + GImageGetWidth(img->image)*img->xscale; + img->bb.miny = img->yoff - GImageGetHeight(img->image)*img->yscale; + img = img->next; + } + } +return( head ); +} + +void ApTransform(AnchorPoint *ap, real transform[6]) { + BasePoint p; + p.x = transform[0]*ap->me.x + transform[2]*ap->me.y + transform[4]; + p.y = transform[1]*ap->me.x + transform[3]*ap->me.y + transform[5]; + ap->me.x = rint(1024*p.x)/1024; + ap->me.y = rint(1024*p.y)/1024; +} + +static void TransformPoint(SplinePoint *sp, real transform[6]) { + BasePoint p; + p.x = transform[0]*sp->me.x + transform[2]*sp->me.y + transform[4]; + p.y = transform[1]*sp->me.x + transform[3]*sp->me.y + transform[5]; + p.x = rint(1024*p.x)/1024; + p.y = rint(1024*p.y)/1024; + sp->me = p; + if ( !sp->nonextcp ) { + p.x = transform[0]*sp->nextcp.x + transform[2]*sp->nextcp.y + transform[4]; + p.y = transform[1]*sp->nextcp.x + transform[3]*sp->nextcp.y + transform[5]; + p.x = rint(1024*p.x)/1024; + p.y = rint(1024*p.y)/1024; + sp->nextcp = p; + } else + sp->nextcp = sp->me; + if ( !sp->noprevcp ) { + p.x = transform[0]*sp->prevcp.x + transform[2]*sp->prevcp.y + transform[4]; + p.y = transform[1]*sp->prevcp.x + transform[3]*sp->prevcp.y + transform[5]; + p.x = rint(1024*p.x)/1024; + p.y = rint(1024*p.y)/1024; + sp->prevcp = p; + } else + sp->prevcp = sp->me; +} + +SplinePointList *SplinePointListTransform(SplinePointList *base, real transform[6], int allpoints ) { + Spline *spline, *first; + SplinePointList *spl; + SplinePoint *spt, *pfirst; + int allsel, anysel, alldone=true; + + for ( spl = base; spl!=NULL; spl = spl->next ) { + pfirst = NULL; + allsel = true; anysel=false; + for ( spt = spl->first ; spt!=pfirst; spt = spt->next->to ) { + if ( pfirst==NULL ) pfirst = spt; + if ( allpoints || spt->selected ) { + TransformPoint(spt,transform); + anysel = true; + } else + allsel = alldone = false; + if ( spt->next==NULL ) + break; + } + if ( !anysel ) /* This splineset had no selected points it's unchanged */ + continue; + /* if we changed all the points then the control points are right */ + /* otherwise those near the edges may be wonky, fix 'em up */ + /* Figuring out where the edges of the selection are is difficult */ + /* so let's just tweak all points, it shouldn't matter */ + /* It does matter. Let's tweak all default points */ + if ( !allpoints && !allsel && spl->first->next!=NULL && !spl->first->next->order2 ) { + pfirst = NULL; + for ( spt = spl->first ; spt!=pfirst; spt = spt->next->to ) { + if ( pfirst==NULL ) pfirst = spt; + if ( spt->prev!=NULL && spt->prevcpdef ) + SplineCharDefaultPrevCP(spt); + if ( spt->next==NULL ) + break; + if ( spt->nextcpdef ) + SplineCharDefaultNextCP(spt); + } + } + first = NULL; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( !alldone ) SplineRefigureFixup(spline); else SplineRefigure(spline); + if ( first==NULL ) first = spline; + } + } +return( base ); +} + +SplinePointList *SplinePointListShift(SplinePointList *base,real xoff,int allpoints ) { + real transform[6]; + if ( xoff==0 ) +return( base ); + transform[0] = transform[3] = 1; + transform[1] = transform[2] = transform[5] = 0; + transform[4] = xoff; +return( SplinePointListTransform(base,transform,allpoints)); +} + +void SplinePointListSelect(SplinePointList *spl,int sel) { + Spline *spline, *first, *last; + + for ( ; spl!=NULL; spl = spl->next ) { + first = NULL; last = NULL; + spl->first->selected = sel; + for ( spline = spl->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + spline->to->selected = sel; + if ( first==NULL ) first = spline; + } + } +} + +void SCMakeDependent(SplineChar *dependent,SplineChar *base) { + struct splinecharlist *dlist; + + if ( dependent->searcherdummy ) +return; + + for ( dlist=base->dependents; dlist!=NULL && dlist->sc!=dependent; dlist = dlist->next); + if ( dlist==NULL ) { + dlist = chunkalloc(sizeof(struct splinecharlist)); + dlist->sc = dependent; + dlist->next = base->dependents; + base->dependents = dlist; + } +} + +static void InstanciateReference(SplineFont *sf, RefChar *topref, RefChar *refs, + real transform[6], SplineChar *dsc) { + real trans[6]; + RefChar *rf; + SplineChar *rsc; + SplinePointList *spl, *new; + int i; + + if ( !refs->checked ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + if ( strcmp(sf->chars[i]->name,AdobeStandardEncoding[refs->adobe_enc])==0 ) + break; + if ( i!=sf->charcnt && !sf->chars[i]->ticked ) { + refs->checked = true; + refs->sc = rsc = sf->chars[i]; + refs->local_enc = rsc->enc; + SCMakeDependent(dsc,rsc); + } else { + fprintf( stderr, "Couldn't find referenced character \"%s\" in %s\n", + AdobeStandardEncoding[refs->adobe_enc], dsc->name); +return; + } + } else if ( refs->sc->ticked ) +return; + + rsc = refs->sc; + rsc->ticked = true; + + for ( rf=rsc->layers[ly_fore].refs; rf!=NULL; rf = rf->next ) { + trans[0] = rf->transform[0]*transform[0] + + rf->transform[1]*transform[2]; + trans[1] = rf->transform[0]*transform[1] + + rf->transform[1]*transform[3]; + trans[2] = rf->transform[2]*transform[0] + + rf->transform[3]*transform[2]; + trans[3] = rf->transform[2]*transform[1] + + rf->transform[3]*transform[3]; + trans[4] = rf->transform[4]*transform[0] + + rf->transform[5]*transform[2] + + transform[4]; + trans[5] = rf->transform[4]*transform[1] + + rf->transform[5]*transform[3] + + transform[5]; + InstanciateReference(sf,topref,rf,trans,rsc); + } + rsc->ticked = false; + + new = SplinePointListTransform(SplinePointListCopy(rsc->layers[ly_fore].splines),transform,true); + if ( new!=NULL ) { + for ( spl = new; spl->next!=NULL; spl = spl->next ); + spl->next = topref->layers[0].splines; + topref->layers[0].splines = new; + } +} + +static char *copyparse(char *str) { + char *ret, *rpt; + int ch,i; + + if ( str==NULL ) +return( str ); + + rpt=ret=galloc(strlen(str)+1); + while ( *str ) { + if ( *str=='\\' ) { + ++str; + if ( *str=='n' ) ch = '\n'; + else if ( *str=='r' ) ch = '\r'; + else if ( *str=='t' ) ch = '\t'; + else if ( *str=='b' ) ch = '\b'; + else if ( *str=='f' ) ch = '\f'; + else if ( *str=='\\' ) ch = '\\'; + else if ( *str=='(' ) ch = '('; + else if ( *str==')' ) ch = ')'; + else if ( *str>='0' && *str<='7' ) { + for ( i=ch = 0; i<3 && *str>='0' && *str<='7'; ++i ) + ch = (ch<<3) + *str++-'0'; + --str; + } else + ch = *str; + ++str; + *rpt++ = ch; + } else + *rpt++ = *str++; + } + *rpt = '\0'; +return(ret); +} + +static void SplineFontMetaData(SplineFont *sf,struct fontdict *fd) { + int em; + int i; + + sf->fontname = copy(fd->cidfontname?fd->cidfontname:fd->fontname); + sf->display_size = -default_fv_font_size; + sf->display_antialias = default_fv_antialias; + if ( fd->fontinfo!=NULL ) { + if ( sf->fontname==NULL && fd->fontinfo->fullname!=NULL ) { char *from, *to; + sf->fontname = copy(fd->fontinfo->fullname); + for ( from=to=sf->fontname; *from; ++from ) + if ( *from!=' ' ) *to++ = *from; + *to ='\0'; + } + if ( sf->fontname==NULL ) sf->fontname = copy(fd->fontinfo->familyname); + sf->fullname = copyparse(fd->fontinfo->fullname); + sf->familyname = copyparse(fd->fontinfo->familyname); + sf->weight = copyparse(fd->fontinfo->weight); + sf->version = copyparse(fd->fontinfo->version); + sf->copyright = copyparse(fd->fontinfo->notice); + sf->italicangle = fd->fontinfo->italicangle; + sf->upos = fd->fontinfo->underlineposition; + sf->uwidth = fd->fontinfo->underlinethickness; + sf->ascent = fd->fontinfo->ascent; + sf->descent = fd->fontinfo->descent; + } + if ( sf->uniqueid==0 ) sf->uniqueid = fd->uniqueid; + if ( sf->fontname==NULL ) sf->fontname = GetNextUntitledName(); + if ( sf->fullname==NULL ) sf->fullname = copy(sf->fontname); + if ( sf->familyname==NULL ) sf->familyname = copy(sf->fontname); + if ( sf->weight==NULL ) sf->weight = copy("Medium"); + sf->cidversion = fd->cidversion; + for ( i=19; i>=0 && fd->xuid[i]==0; --i ); + if ( i>=0 ) { + int j; char *pt; + sf->xuid = galloc(2+20*(i+1)); + pt = sf->xuid; + *pt++ = '['; + for ( j=0; j<=i; ++j ) { + sprintf(pt,"%d ", fd->xuid[j]); + pt += strlen(pt); + } + pt[-1] = ']'; + } + /*sf->wasbinary = fd->wasbinary;*/ + sf->encoding_name = fd->encoding_name; + if ( fd->fontmatrix[0]==0 ) + em = 1000; + else + em = rint(1/fd->fontmatrix[0]); + if ( sf->ascent==0 && sf->descent!=0 ) + sf->ascent = em-sf->descent; + else if ( fd->fontbb[3]-fd->fontbb[1]==em ) { + if ( sf->ascent==0 ) sf->ascent = fd->fontbb[3]; + if ( sf->descent==0 ) sf->descent = fd->fontbb[1]; + } else if ( sf->ascent==0 ) + sf->ascent = 8*em/10; + sf->descent = em-sf->ascent; + + sf->private = fd->private->private; fd->private->private = NULL; + PSDictRemoveEntry(sf->private, "OtherSubrs"); + + sf->cidregistry = copy(fd->registry); + sf->ordering = copy(fd->ordering); + sf->supplement = fd->supplement; + sf->pfminfo.fstype = fd->fontinfo->fstype; + if ( sf->ordering!=NULL ) { + if ( strnmatch(sf->ordering,"Japan",5)==0 ) + sf->uni_interp = ui_japanese; + else if ( strnmatch(sf->ordering,"Korea",5)==0 ) + sf->uni_interp = ui_korean; + else if ( strnmatch(sf->ordering,"CNS",3)==0 ) + sf->uni_interp = ui_trad_chinese; + else if ( strnmatch(sf->ordering,"GB",2)==0 ) + sf->uni_interp = ui_simp_chinese; + } +} + +/* Adobe has (it seems to me) misnamed the greek letters so that "mu" actually*/ +/* refers to the micro sign. Similar problems for Delta and Omega. When I get*/ +/* a mu character I generate things named mu, uni00B5 and uni03BC. So here I */ +/* check for instances where both mu and uni00B5 (which both map to 0xb5) I */ +/* remove one of them */ +static void CleanupGreekNames(FontDict *fd) { + static char *namepairs[3][2] = {{ "mu", "uni00B5" /* 3bc */ }, + { "Delta", "uni0394" /* 2206 */ }, + { "Omega", "uni03A9" /* 2126 */ }}; + int i,j,k; + struct pschars *chars = fd->chars; + char *namei, *namej; + + for ( i=0; icnt; ++i ) if ( (namei=chars->keys[i])!=NULL ) { + for ( k=0; k<3; ++k ) + if ( strcmp(namei,namepairs[k][0])==0 ) { + for ( j=0; jcnt; ++j ) if ( (namej=chars->keys[j])!=NULL ) { + if ( strcmp(namej,namepairs[k][1])==0 ) { + if ( i>j ) --i; + free(chars->keys[j]); + free(chars->values[j]); + for ( k=j; kcnt-1; ++k ) { + chars->keys[k] = chars->keys[k+1]; + chars->values[k] = chars->values[k+1]; + chars->lens[k] = chars->lens[k+1]; + } + chars->keys[k] = NULL; chars->values[k] = NULL; chars->lens[k] = 0; + break; + } + } + } + } +} + +SplineChar *MakeDupRef(SplineChar *base, int local_enc, int uni_enc) { + SplineChar *sc = SplineCharCreate(); + + sc->enc = local_enc; + sc->unicodeenc = uni_enc; + sc->width = base->width; + sc->vwidth = base->vwidth; + sc->name = copy(base->name); + sc->parent = base->parent; + + /* Used not to bother for spaces, but SCDuplicate depends on the ref */ + /*if ( dup->sc->layers[ly_fore].refs!=NULL || dup->sc->layers[ly_fore].splines!=NULL )*/ { + RefChar *ref = RefCharCreate(); + sc->layers[ly_fore].refs = ref; + ref->sc = base; + ref->local_enc = base->enc; + ref->unicode_enc = base->unicodeenc; + ref->adobe_enc = getAdobeEnc(base->name); + ref->transform[0] = ref->transform[3] = 1; + SCReinstanciateRefChar(sc,ref); + SCMakeDependent(sc,base); + ref->checked = true; + } +return( sc ); +} + +static SplineChar *DuplicateNameReference(SplineFont *sf,char **encoding,int encindex) { + SplineChar *sc = NULL; + int i; + + for ( i=0; ichars[i],encindex,-1); +return( sc ); +} + +static void TransByFontMatrix(SplineFont *sf,real fontmatrix[6]) { + real trans[6]; + int em = sf->ascent+sf->descent, i; + SplineChar *sc; + RefChar *refs; + + if ( fontmatrix[0]==fontmatrix[3] && + fontmatrix[1]==0 && fontmatrix[2]==0 && + fontmatrix[4]==0 && fontmatrix[5]==0 ) +return; /* It's just the expected matrix */ + + trans[0] = 1; + if ( fontmatrix[0]==fontmatrix[3] ) trans[3] = 1; + else trans[3] = rint(fontmatrix[3]*em); + trans[1] = fontmatrix[1]*em; + trans[2] = fontmatrix[2]*em; + trans[4] = rint(fontmatrix[4]*em); + trans[5] = rint(fontmatrix[5]*em); + + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + SplinePointListTransform(sc->layers[ly_fore].splines,trans,true); + for ( refs=sc->layers[ly_fore].refs; refs!=NULL; refs=refs->next ) { + /* Just scale the offsets. we'll do all the base characters */ + double temp = refs->transform[4]*trans[0] + + refs->transform[5]*trans[2] + + /*transform[4]*/0; + refs->transform[5] = refs->transform[4]*trans[1] + + refs->transform[5]*trans[3] + + /*transform[5]*/0; + refs->transform[4] = temp; + } + sc->changedsincelasthinted = true; + sc->manualhints = false; + } + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( refs=sc->layers[ly_fore].refs; refs!=NULL; refs=refs->next ) + SCReinstanciateRefChar(sc,refs); + } +} + +static void SFInstanciateRefs(SplineFont *sf) { + int i, layer; + RefChar *refs, *next, *pr; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->ticked = false; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SplineChar *sc = sf->chars[i]; + + for ( layer=ly_fore; layerlayer_cnt; ++layer ) { + for ( pr=NULL, refs = sc->layers[layer].refs; refs!=NULL; refs=next ) { + next = refs->next; + sc->ticked = true; + InstanciateReference(sf, refs, refs, refs->transform,sc); + if ( refs->sc!=NULL ) { + SplineSetFindBounds(refs->layers[0].splines,&refs->bb); + sc->ticked = false; + pr = refs; + } else { + /* In some mal-formed postscript fonts we can have a reference */ + /* to a character that is not actually in the font. I even */ + /* generated one by mistake once... */ + if ( pr==NULL ) + sc->layers[layer].refs = next; + else + pr->next = next; + } + } + } + } +} + +static void SplineFontFromType1(SplineFont *sf, FontDict *fd, struct pscontext *pscontext) { + int i, j, isnotdef; + RefChar *refs, *next; + char **encoding; + int istype2 = fd->fonttype==2; /* Easy enough to deal with even though it will never happen... */ + uint8 *used = gcalloc(fd->charprocs->next!=0?fd->charprocs->next:fd->chars->next,sizeof(uint8)); + + CleanupGreekNames(fd); + if ( istype2 ) + fd->private->subrs->bias = fd->private->subrs->cnt<1240 ? 107 : + fd->private->subrs->cnt<33900 ? 1131 : 32768; + sf->charcnt = 256+CharsNotInEncoding(fd); + encoding = gcalloc(sf->charcnt,sizeof(char *)); + sf->chars = gcalloc(sf->charcnt,sizeof(SplineChar *)); + for ( i=0; i<256; ++i ) + encoding[i] = copy(fd->encoding[i]); + if ( sf->charcnt>256 ) { + int k, j; + for ( k=0; kchars->cnt; ++k ) { + if ( fd->chars->keys[k]!=NULL ) { + for ( j=0; j<256; ++j ) + if ( fd->encoding[j]!=NULL && + strcmp(fd->encoding[j],fd->chars->keys[k])==0 ) + break; + if ( j==256 ) + encoding[i++] = copy(fd->chars->keys[k]); + } + } + /* And for type3s */ + for ( k=0; kcharprocs->cnt; ++k ) { + if ( fd->charprocs->keys[k]!=NULL ) { + for ( j=0; j<256; ++j ) + if ( fd->encoding[j]!=NULL && + strcmp(fd->encoding[j],fd->charprocs->keys[k])==0 ) + break; + if ( j==256 ) + encoding[i++] = copy(fd->charprocs->keys[k]); + } + } + } + for ( i=0; icharcnt; ++i ) if ( encoding[i]==NULL ) + encoding[i] = copy(".notdef"); + for ( i=0; icharcnt; ++i ) { + int k= -1, k2=-1; + k = LookupCharString(encoding[i],fd->chars); + isnotdef = false; + if ( k==-1 ) { + k = k2 = LookupCharString(encoding[i],(struct pschars *) (fd->charprocs)); + isnotdef = (k==-1); + if ( k==-1 ) + k = LookupCharString(".notdef",fd->chars); + if ( k==-1 ) + k = k2 = LookupCharString(".notdef",(struct pschars *) (fd->charprocs)); + } + if ( k==-1 ) { + /* 0 500 hsbw endchar */ + sf->chars[i] = PSCharStringToSplines((uint8 *) "\213\370\210\015\016",5,pscontext,fd->private->subrs,NULL,".notdef"); + sf->chars[i]->width = sf->ascent+sf->descent; + } else if ( used[k] && !isnotdef && strcmp(encoding[i],".notdef")!=0 ) { + sf->chars[i] = DuplicateNameReference(sf,encoding,i); + } else if ( k2==-1 ) { + sf->chars[i] = PSCharStringToSplines(fd->chars->values[k],fd->chars->lens[k], + pscontext,fd->private->subrs,NULL,encoding[i]); + used[k] = true; + } else { + if ( fd->charprocs->values[k]->unicodeenc==-2 ) + sf->chars[i] = fd->charprocs->values[k]; + else + sf->chars[i] = SplineCharCopy(fd->charprocs->values[k],sf); + if ( sf->chars[i]!=NULL ) + sf->chars[i]->changed = false; + used[k] = true; + } + sf->chars[i]->orig_pos = k; + sf->chars[i]->vwidth = sf->ascent+sf->descent; + sf->chars[i]->enc = i; + sf->chars[i]->unicodeenc = UniFromName(encoding[i]); + sf->chars[i]->parent = sf; + SCLigDefault(sf->chars[i]); /* Also reads from AFM file, but it probably doesn't exist */ + GProgressNext(); + } + SFInstanciateRefs(sf); + if ( fd->metrics!=NULL ) { + for ( i=0; imetrics->next; ++i ) { + int width = strtol(fd->metrics->values[i],NULL,10); + for ( j=sf->charcnt-1; j>=0; --j ) { + if ( sf->chars[j]!=NULL && sf->chars[j]->name!=NULL && + strcmp(fd->metrics->keys[i],sf->chars[j]->name)==0 ) { + sf->chars[j]->width = width; + break; + } + } + } + } + for ( i=0; icharcnt; ++i ) for ( refs = sf->chars[i]->layers[ly_fore].refs; refs!=NULL; refs=next ) { + next = refs->next; + if ( refs->adobe_enc==' ' && refs->layers[0].splines==NULL ) { + /* When I have a link to a single character I will save out a */ + /* seac to that character and a space (since I can only make */ + /* real char links), so if we find a space link, get rid of*/ + /* it. It's an artifact */ + SCRefToSplines(sf->chars[i],refs); + } + } + for( i=0; icharcnt; ++i ) + free(encoding[i]); + free(encoding); + free(used); + /* sometimes (some apple oblique fonts) the fontmatrix is not just a */ + /* formality, it acutally contains a skew. So be ready */ + if ( fd->fontmatrix[0]!=0 ) + TransByFontMatrix(sf,fd->fontmatrix); +#ifdef FONTFORGE_CONFIG_TYPE3 + if ( fd->charprocs->cnt!=0 ) + sf->multilayer = true; +#endif +} + +static SplineFont *SplineFontFromMMType1(SplineFont *sf, FontDict *fd, struct pscontext *pscontext) { + char *pt, *end; + MMSet *mm; + int ipos, apos, ppos, item, i; + real blends[12]; /* At most twelve points/axis in a blenddesignmap */ + real designs[12]; + + if ( fd->weightvector==NULL || fd->fontinfo->blenddesignpositions==NULL || + fd->fontinfo->blenddesignmap==NULL || fd->fontinfo->blendaxistypes==NULL ) { + GWidgetErrorR(_STR_BadMM,_STR_BadMM); + SplineFontFree(sf); +return( NULL ); + } + + mm = chunkalloc(sizeof(MMSet)); + + pt = fd->weightvector; + while ( *pt==' ' || *pt=='[' ) ++pt; + while ( *pt!=']' && *pt!='\0' ) { + pscontext->blend_values[ pscontext->instance_count ] = + strtod(pt,&end); + if ( pt==end ) + break; + ++(pscontext->instance_count); + if ( pscontext->instance_count>=sizeof(pscontext->blend_values)/sizeof(pscontext->blend_values[0])) { + fprintf( stderr, "Multiple master font with more than 16 instances\n" ); + break; + } + for ( pt = end; *pt==' '; ++pt ); + } + + mm->instance_count = pscontext->instance_count; + mm->instances = galloc(pscontext->instance_count*sizeof(SplineFont *)); + mm->defweights = galloc(mm->instance_count*sizeof(real)); + memcpy(mm->defweights,pscontext->blend_values,mm->instance_count*sizeof(real)); + mm->normal = sf; + SplineFontFromType1(mm->normal,fd,pscontext); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->blended = true; + sf->mm = mm; + + pt = fd->fontinfo->blendaxistypes; + while ( *pt==' ' || *pt=='[' ) ++pt; + while ( *pt!=']' && *pt!='\0' ) { + if ( *pt=='/' ) ++pt; + for ( end=pt; *end!=' ' && *end!=']' && *end!='\0'; ++end ); + if ( pt==end ) + break; + if ( mm->axis_count>=sizeof(mm->axes)/sizeof(mm->axes[0])) { + fprintf( stderr, "Multiple master font with more than 4 axes\n" ); + break; + } + mm->axes[ mm->axis_count++ ] = copyn( pt,end-pt ); + for ( pt = end; *pt==' '; ++pt ); + } + + if ( mm->instance_count < (1<axis_count) ) + GWidgetErrorR(_STR_BadMM,_STR_MMTooFewMasters,mm->instance_count,1<axis_count,mm->axis_count); + else if ( mm->instance_count > (1<axis_count) ) + GWidgetErrorR(_STR_BadMM,_STR_MMHasInstances,mm->instance_count,1<axis_count,mm->axis_count); + mm->positions = gcalloc(mm->axis_count*mm->instance_count,sizeof(real)); + pt = fd->fontinfo->blenddesignpositions; + while ( *pt==' ' ) ++pt; + if ( *pt=='[' ) ++pt; + ipos = 0; + while ( *pt!=']' && *pt!='\0' ) { + while ( *pt==' ' ) ++pt; + if ( *pt==']' || *pt=='\0' ) + break; + if ( ipos>=mm->instance_count ) + break; + if ( *pt=='[' ) { + ++pt; + apos=0; + while ( *pt!=']' && *pt!='\0' ) { + if ( apos>=mm->axis_count ) { + fprintf( stderr, "Too many axis positions specified in /BlendDesignPositions.\n" ); + break; + } + mm->positions[ipos*mm->axis_count+apos] = + strtod(pt,&end); + if ( pt==end ) + break; + ++apos; + for ( pt = end; *pt==' '; ++pt ); + } + if ( *pt==']' ) ++pt; + ++ipos; + } else + ++pt; + } + + mm->axismaps = gcalloc(mm->axis_count,sizeof(struct axismap)); + pt = fd->fontinfo->blenddesignmap; + while ( *pt==' ' ) ++pt; + if ( *pt=='[' ) ++pt; + apos = 0; + while ( *pt!=']' && *pt!='\0' ) { + while ( *pt==' ' ) ++pt; + if ( *pt==']' || *pt=='\0' ) + break; + if ( apos>=mm->axis_count ) + break; + if ( *pt=='[' ) { + ++pt; + ppos=0; + while ( *pt!=']' && *pt!='\0' ) { + if ( ppos>=12 ) { + fprintf( stderr, "Too many mapping data points specified in /BlendDesignMap for axis %s.\n", mm->axes[apos] ); + break; + } + while ( *pt==' ' ) ++pt; + if ( *pt=='[' ) { + ++pt; + designs[ppos] = strtod(pt,&end); + blends[ppos] = strtod(end,&end); + if ( blends[ppos]<0 || blends[ppos]>1 ) { + fprintf( stderr, "Bad value for blend in /BlendDesignMap for axis %s.\n", mm->axes[apos] ); + if ( blends[ppos]<0 ) blends[ppos] = 0; + if ( blends[ppos]>1 ) blends[ppos] = 1; + } + pt = end; + while ( *pt!=']' && *pt!='\0' ) ++pt; + ppos ++; + } + ++pt; + while ( *pt==' ' ) ++pt; + } + if ( *pt==']' ) ++pt; + if ( ppos<2 ) + fprintf( stderr, "Bad few values in /BlendDesignMap for axis %s.\n", mm->axes[apos] ); + mm->axismaps[apos].points = ppos; + mm->axismaps[apos].blends = galloc(ppos*sizeof(real)); + mm->axismaps[apos].designs = galloc(ppos*sizeof(real)); + memcpy(mm->axismaps[apos].blends,blends,ppos*sizeof(real)); + memcpy(mm->axismaps[apos].designs,designs,ppos*sizeof(real)); + ++apos; + } else + ++pt; + } + + mm->cdv = copy(fd->cdv); + mm->ndv = copy(fd->ndv); + + /* Now figure out the master designs, being careful to interpolate */ + /* BlueValues, ForceBold, UnderlinePosition etc. We need to copy private */ + /* generate a font name */ + for ( ipos = 0; iposinstance_count; ++ipos ) { + free(fd->fontname); + free(fd->fontinfo->fullname); + fd->fontname = MMMakeMasterFontname(mm,ipos,&fd->fontinfo->fullname); + fd->fontinfo->weight = MMGuessWeight(mm,ipos,fd->fontinfo->weight); + if ( fd->blendfontinfo!=NULL ) { + for ( item=0; item<3; ++item ) { + static char *names[] = { "ItalicAngle", "UnderlinePosition", "UnderlineThickness" }; + pt = PSDictHasEntry(fd->blendfontinfo,names[item]); + if ( pt!=NULL ) { + pt = MMExtractNth(pt,ipos); + if ( pt!=NULL ) { + double val = strtod(pt,NULL); + free(pt); + switch ( item ) { + case 0: fd->fontinfo->italicangle = val; break; + case 1: fd->fontinfo->underlineposition = val; break; + case 2: fd->fontinfo->underlinethickness = val; break; + } + } + } + } + } + fd->private->private = PSDictCopy(sf->private); + if ( fd->blendprivate!=NULL ) { + static char *arrnames[] = { "BlueValues", "OtherBlues", "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW", "StemSnapH", "StemSnapV", NULL }; + static char *scalarnames[] = { "ForceBold", "BlueFuzz", "BlueScale", "BlueShift", NULL }; + for ( item=0; scalarnames[item]!=NULL; ++item ) { + pt = PSDictHasEntry(fd->blendprivate,scalarnames[item]); + if ( pt!=NULL ) { + pt = MMExtractNth(pt,ipos); + PSDictChangeEntry(fd->private->private,scalarnames[item],pt); + free(pt); + } + } + for ( item=0; arrnames[item]!=NULL; ++item ) { + pt = PSDictHasEntry(fd->blendprivate,arrnames[item]); + if ( pt!=NULL ) { + pt = MMExtractArrayNth(pt,ipos); + PSDictChangeEntry(fd->private->private,arrnames[item],pt); + free(pt); + } + } + } + for ( item=0; iteminstance_count; ++item ) + pscontext->blend_values[item] = 0; + pscontext->blend_values[ipos] = 1; + + mm->instances[ipos] = SplineFontEmpty(); + SplineFontMetaData(mm->instances[ipos],fd); + SplineFontFromType1(mm->instances[ipos],fd,pscontext); + mm->instances[ipos]->mm = mm; + } +return( sf ); +} + +static SplineFont *SplineFontFromCIDType1(SplineFont *sf, FontDict *fd, + struct pscontext *pscontext) { + int i,j, bad, uni; + SplineChar **chars; + char buffer[100]; + struct cidmap *map; + + bad = 0x80000000; + for ( i=0; ifdcnt; ++i ) + if ( fd->fds[i]->fonttype!=1 && fd->fds[i]->fonttype!=2 ) + bad = fd->fds[i]->fonttype; + if ( bad!=0x80000000 || fd->cidfonttype!=0 ) { + fprintf(stderr,"Could not parse a CID font, " ); + if ( fd->cidfonttype!=0 ) + fprintf( stderr, "unexpected CIDFontType %d ", fd->cidfonttype ); + if ( bad!=0x80000000 ) + fprintf( stderr, "unexpected fonttype %d", bad ); + fprintf( stderr,"\n"); + SplineFontFree(sf); +return( NULL ); + } + if ( fd->cidstrs==NULL || fd->cidcnt==0 ) { + fprintf( stderr, "CID format doesn't contain what we expected it to.\n" ); + SplineFontFree(sf); +return( NULL ); + } + + sf->subfontcnt = fd->fdcnt; + sf->subfonts = galloc((sf->subfontcnt+1)*sizeof(SplineFont *)); + for ( i=0; ifdcnt; ++i ) { + sf->subfonts[i] = SplineFontEmpty(); + SplineFontMetaData(sf->subfonts[i],fd->fds[i]); + sf->subfonts[i]->cidmaster = sf; + sf->subfonts[i]->uni_interp = sf->uni_interp; + if ( fd->fds[i]->fonttype==2 ) + fd->fds[i]->private->subrs->bias = + fd->fds[i]->private->subrs->cnt<1240 ? 107 : + fd->fds[i]->private->subrs->cnt<33900 ? 1131 : 32768; + } + + map = FindCidMap(sf->cidregistry,sf->ordering,sf->supplement,sf); + + chars = gcalloc(fd->cidcnt,sizeof(SplineChar *)); + for ( i=0; icidcnt; ++i ) if ( fd->cidlens[i]>0 ) { + j = fd->cidfds[i]; /* We get font indexes of 255 for non-existant chars */ + uni = CID2NameEnc(map,i,buffer,sizeof(buffer)); + pscontext->is_type2 = fd->fds[j]->fonttype==2; + chars[i] = PSCharStringToSplines(fd->cidstrs[i],fd->cidlens[i], + pscontext,fd->fds[j]->private->subrs, + NULL,buffer); + chars[i]->vwidth = sf->subfonts[j]->ascent+sf->subfonts[j]->descent; + chars[i]->unicodeenc = uni; + chars[i]->enc = i; + chars[i]->orig_pos = i; + /* There better not be any references (seac's) because we have no */ + /* encoding on which to base any fixups */ + if ( chars[i]->layers[ly_fore].refs!=NULL ) + GDrawIError( "Reference found in CID font. Can't fix it up"); + chars[i]->enc = i; + sf->subfonts[j]->charcnt = i+1; + GProgressNext(); + } + for ( i=0; ifdcnt; ++i ) + sf->subfonts[i]->chars = gcalloc(sf->subfonts[i]->charcnt,sizeof(SplineChar *)); + for ( i=0; icidcnt; ++i ) if ( chars[i]!=NULL ) { + j = fd->cidfds[i]; + if ( jsubfontcnt ) { + sf->subfonts[j]->chars[i] = chars[i]; + chars[i]->parent = sf->subfonts[j]; + } + } + free(chars); +return( sf ); +} + +SplineFont *SplineFontFromPSFont(FontDict *fd) { + SplineFont *sf = SplineFontEmpty(); + struct pscontext pscontext; + + memset(&pscontext,0,sizeof(pscontext)); + pscontext.is_type2 = fd->fonttype==2; + + SplineFontMetaData(sf,fd); + if ( fd->wascff ) { + SplineFontFree(sf); + sf = fd->sf; + } else if ( fd->fdcnt!=0 ) + sf = SplineFontFromCIDType1(sf,fd,&pscontext); + else if ( fd->weightvector!=NULL ) + SplineFontFromMMType1(sf,fd,&pscontext); + else + SplineFontFromType1(sf,fd,&pscontext); + if ( loaded_fonts_same_as_new && new_fonts_are_order2 ) + SFConvertToOrder2(sf); +return( sf ); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static void LayerToRefLayer(struct reflayer *rl,Layer *layer) { + rl->fill_brush = layer->fill_brush; + rl->stroke_pen = layer->stroke_pen; + rl->dofill = layer->dofill; + rl->dostroke = layer->dostroke; + rl->fillfirst = layer->fillfirst; +} +#endif + +void RefCharFindBounds(RefChar *rf) { +#ifdef FONTFORGE_CONFIG_TYPE3 + int i; + SplineChar *rsc = rf->sc; + real extra=0,e; + + memset(&rf->bb,'\0',sizeof(rf->bb)); + rf->top.y = -1e10; + for ( i=0; ilayer_cnt; ++i ) { + _SplineSetFindBounds(rf->layers[i].splines,&rf->bb); + _SplineSetFindTop(rf->layers[i].splines,&rf->top); + if ( rsc->layers[i].dostroke ) { + if ( rf->layers[i].stroke_pen.width!=WIDTH_INHERITED ) + e = rf->layers[i].stroke_pen.width*rf->layers[i].stroke_pen.trans[0]; + else + e = rf->layers[i].stroke_pen.trans[0]; + if ( e>extra ) extra = e; + } + } + if ( rf->top.y < -65536 ) rf->top.y = rf->top.x = 0; + rf->bb.minx -= extra; rf->bb.miny -= extra; + rf->bb.maxx += extra; rf->bb.maxy += extra; +#else + SplineSetFindBounds(rf->layers[0].splines,&rf->bb); + SplineSetFindTop(rf->layers[0].splines,&rf->top); +#endif +} + +void SCReinstanciateRefChar(SplineChar *sc,RefChar *rf) { + SplinePointList *spl, *new; + RefChar *refs; +#ifdef FONTFORGE_CONFIG_TYPE3 + int i,j; + SplineChar *rsc = rf->sc; + real extra=0,e; + + for ( i=0; ilayer_cnt; ++i ) + SplinePointListsFree(rf->layers[0].splines); + free( rf->layers ); + rf->layers = NULL; + rf->layer_cnt = 0; + if ( rsc==NULL ) +return; + /* Can be called before sc->parent is set, but only when reading a ttf */ + /* file which won't be multilayer */ + if ( sc->parent!=NULL && sc->parent->multilayer ) { + int cnt = 0; + RefChar *subref; + for ( i=ly_fore; ilayer_cnt; ++i ) { + if ( rsc->layers[i].splines!=NULL || rsc->layers[i].images!=NULL ) + ++cnt; + for ( subref=rsc->layers[i].refs; subref!=NULL; subref=subref->next ) + cnt += subref->layer_cnt; + } + + rf->layer_cnt = cnt; + rf->layers = gcalloc(cnt,sizeof(struct reflayer)); + cnt = 0; + for ( i=ly_fore; ilayer_cnt; ++i ) { + if ( rsc->layers[i].splines!=NULL || rsc->layers[i].images!=NULL ) { + rf->layers[cnt].splines = + SplinePointListTransform( + SplinePointListCopy(rsc->layers[i].splines),rf->transform,true); + rf->layers[cnt].images = + ImageListTransform( + ImageListCopy(rsc->layers[i].images),rf->transform); + LayerToRefLayer(&rf->layers[cnt],&rsc->layers[i]); + ++cnt; + } + for ( subref=rsc->layers[i].refs; subref!=NULL; subref=subref->next ) { + for ( j=0; jlayer_cnt; ++j ) if ( subref->layers[j].images!=NULL || subref->layers[j].splines!=NULL ) { + rf->layers[cnt] = subref->layers[j]; + rf->layers[cnt].splines = + SplinePointListTransform( + SplinePointListCopy(subref->layers[j].splines),rf->transform,true); + rf->layers[cnt].images = + ImageListTransform( + ImageListCopy(subref->layers[j].images),rf->transform); + ++cnt; + } + } + } + + memset(&rf->bb,'\0',sizeof(rf->bb)); + rf->top.y = -1e10; + for ( i=0; ilayer_cnt; ++i ) { + _SplineSetFindBounds(rf->layers[i].splines,&rf->bb); + _SplineSetFindTop(rf->layers[i].splines,&rf->top); + if ( rsc->layers[i].dostroke ) { + if ( rf->layers[i].stroke_pen.width!=WIDTH_INHERITED ) + e = rf->layers[i].stroke_pen.width*rf->layers[i].stroke_pen.trans[0]; + else + e = rf->layers[i].stroke_pen.trans[0]; + if ( e>extra ) extra = e; + } + } + if ( rf->top.y < -65536 ) rf->top.y = rf->top.x = 0; + rf->bb.minx -= extra; rf->bb.miny -= extra; + rf->bb.maxx += extra; rf->bb.maxy += extra; + } else { + rf->layers = gcalloc(1,sizeof(struct reflayer)); + rf->layer_cnt = 1; + rf->layers[0].dofill = true; +#else + SplinePointListsFree(rf->layers[0].splines); + rf->layers[0].splines = NULL; + if ( rf->sc==NULL ) +return; + { +#endif + new = SplinePointListTransform(SplinePointListCopy(rf->sc->layers[ly_fore].splines),rf->transform,true); + if ( new!=NULL ) { + for ( spl = new; spl->next!=NULL; spl = spl->next ); + spl->next = rf->layers[0].splines; + rf->layers[0].splines = new; + } + for ( refs = rf->sc->layers[ly_fore].refs; refs!=NULL; refs = refs->next ) { + new = SplinePointListTransform(SplinePointListCopy(refs->layers[0].splines),rf->transform,true); + if ( new!=NULL ) { + for ( spl = new; spl->next!=NULL; spl = spl->next ); + spl->next = rf->layers[0].splines; + rf->layers[0].splines = new; + } + } + } + RefCharFindBounds(rf); +} + +static void _SFReinstanciateRefs(SplineFont *sf) { + int i, undone, undoable, j, cnt; + RefChar *ref; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->ticked = false; + + undone = true; + cnt = 0; + while ( undone && cnt<200) { + undone = false; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + undoable = false; + for ( j=0; jchars[i]->layer_cnt; ++j ) { + for ( ref=sf->chars[i]->layers[j].refs; ref!=NULL; ref=ref->next ) { + if ( !ref->sc->ticked ) + undoable = true; + } + } + if ( undoable ) + undone = true; + else { + for ( j=0; jchars[i]->layer_cnt; ++j ) { + for ( ref=sf->chars[i]->layers[j].refs; ref!=NULL; ref=ref->next ) + SCReinstanciateRefChar(sf->chars[i],ref); + } + sf->chars[i]->ticked = true; + } + } + ++cnt; + } +} + +void SFReinstanciateRefs(SplineFont *sf) { + int i; + + if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) { + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + for ( i=0; isubfontcnt; ++i ) + _SFReinstanciateRefs(sf->subfonts[i]); + } else + _SFReinstanciateRefs(sf); +} + +void SCReinstanciateRef(SplineChar *sc,SplineChar *rsc) { + RefChar *rf; + + for ( rf=sc->layers[ly_fore].refs; rf!=NULL; rf=rf->next ) if ( rf->sc==rsc ) { + SCReinstanciateRefChar(sc,rf); + } +} + +void SCRemoveDependent(SplineChar *dependent,RefChar *rf) { + struct splinecharlist *dlist, *pd; + RefChar *prev; + + if ( dependent->layers[ly_fore].refs==rf ) + dependent->layers[ly_fore].refs = rf->next; + else { + for ( prev = dependent->layers[ly_fore].refs; prev->next!=rf; prev=prev->next ); + prev->next = rf->next; + } + /* Check for multiple dependencies (colon has two refs to period) */ + /* if there are none, then remove dependent from ref->sc's dependents list */ + for ( prev = dependent->layers[ly_fore].refs; prev!=NULL && (prev==rf || prev->sc!=rf->sc); prev = prev->next ); + if ( prev==NULL ) { + dlist = rf->sc->dependents; + if ( dlist==NULL ) + /* Do nothing */; + else if ( dlist->sc==dependent ) { + rf->sc->dependents = dlist->next; + } else { + for ( pd=dlist, dlist = pd->next; dlist!=NULL && dlist->sc!=dependent; pd=dlist, dlist = pd->next ); + if ( dlist!=NULL ) + pd->next = dlist->next; + } + chunkfree(dlist,sizeof(struct splinecharlist)); + } + RefCharFree(rf); +} + +void SCRemoveLayerDependents(SplineChar *dependent,int layer) { + RefChar *rf, *next; + + for ( rf=dependent->layers[layer].refs; rf!=NULL; rf=next ) { + next = rf->next; + SCRemoveDependent(dependent,rf); + } + dependent->layers[layer].refs = NULL; +} + +void SCRemoveDependents(SplineChar *dependent) { + int layer; + + for ( layer=ly_fore; layerlayer_cnt; ++layer ) + SCRemoveLayerDependents(dependent,layer); +} + +void SCRefToSplines(SplineChar *sc,RefChar *rf) { + SplineSet *spl; +#ifdef FONTFORGE_CONFIG_TYPE3 + int layer; + + if ( sc->parent->multilayer ) { + sc->layers = grealloc(sc->layers,(sc->layer_cnt+rf->layer_cnt)*sizeof(Layer)); + for ( layer = 0; layerlayer_cnt; ++layer ) { + LayerDefault(&sc->layers[sc->layer_cnt+layer]); + sc->layers[sc->layer_cnt+layer].splines = rf->layers[layer].splines; + rf->layers[layer].splines = NULL; + sc->layers[sc->layer_cnt+layer].images = rf->layers[layer].images; + rf->layers[layer].images = NULL; + sc->layers[sc->layer_cnt+layer].refs = NULL; + sc->layers[sc->layer_cnt+layer].undoes = NULL; + sc->layers[sc->layer_cnt+layer].redoes = NULL; + sc->layers[sc->layer_cnt+layer].fill_brush = rf->layers[layer].fill_brush; + sc->layers[sc->layer_cnt+layer].stroke_pen = rf->layers[layer].stroke_pen; + sc->layers[sc->layer_cnt+layer].dofill = rf->layers[layer].dofill; + sc->layers[sc->layer_cnt+layer].dostroke = rf->layers[layer].dostroke; + sc->layers[sc->layer_cnt+layer].fillfirst = rf->layers[layer].fillfirst; + } + SCMoreLayers(sc); + } else { +#else + { +#endif + if ( (spl = rf->layers[0].splines)!=NULL ) { + while ( spl->next!=NULL ) + spl = spl->next; + spl->next = sc->layers[ly_fore].splines; + sc->layers[ly_fore].splines = rf->layers[0].splines; + rf->layers[0].splines = NULL; + } + } + SCRemoveDependent(sc,rf); +} + +/* This returns all real solutions, even those out of bounds */ +/* I use -999999 as an error flag, since we're really only interested in */ +/* solns near 0 and 1 that should be ok. -1 is perhaps a little too close */ +static int _CubicSolve(Spline1D *sp,double ts[3]) { + double d, xN, yN, delta2, temp, delta, h, t2, t3, theta; + int i=0; + + ts[0] = ts[1] = ts[2] = -999999; + if ( sp->a!=0 ) { + /* http://www.m-a.org.uk/eb/mg/mg077ch.pdf */ + /* this nifty solution to the cubic neatly avoids complex arithmatic */ + xN = -sp->b/(3*sp->a); + yN = ((sp->a*xN + sp->b)*xN+sp->c)*xN + sp->d; + + delta2 = (sp->b*sp->b-3*sp->a*sp->c)/(9*sp->a*sp->a); + if ( RealNear(delta2,0) ) delta2 = 0; + + /* the descriminant is yN^2-h^2, but delta might be <0 so avoid using h */ + d = yN*yN - 4*sp->a*sp->a*delta2*delta2*delta2; + if ( ((yN>.01 || yN<-.01) && RealNear(d/yN,0)) || ((yN<=.01 && yN>=-.01) && RealNear(d,0)) ) + d = 0; + if ( d>0 ) { + temp = sqrt(d); + t2 = (-yN-temp)/(2*sp->a); + t2 = (t2==0) ? 0 : (t2<0) ? -pow(-t2,1./3.) : pow(t2,1./3.); + t3 = (-yN+temp)/(2*sp->a); + t3 = t3==0 ? 0 : (t3<0) ? -pow(-t3,1./3.) : pow(t3,1./3.); + ts[0] = xN + t2 + t3; + } else if ( d<0 ) { + if ( delta2>=0 ) { + delta = sqrt(delta2); + h = 2*sp->a*delta2*delta; + temp = -yN/h; + if ( temp>=-1.0001 && temp<=1.0001 ) { + if ( temp<-1 ) temp = -1; else if ( temp>1 ) temp = 1; + theta = acos(temp)/3; + ts[i++] = xN+2*delta*cos(theta); + ts[i++] = xN+2*delta*cos(2.0943951+theta); + ts[i++] = xN+2*delta*cos(4.1887902+theta); + } + } + } else if ( /* d==0 && */ delta2!=0 ) { + delta = yN/(2*sp->a); + delta = delta==0 ? 0 : delta>0 ? pow(delta,1./3.) : -pow(-delta,1./3.); + ts[i++] = xN + delta; /* this root twice, but that's irrelevant to me */ + ts[i++] = xN - 2*delta; + } else if ( /* d==0 && */ delta2==0 ) { + if ( xN>=-0.0001 && xN<=1.0001 ) ts[0] = xN; + } + } else if ( sp->b!=0 ) { + double d = sp->c*sp->c-4*sp->b*sp->d; + if ( RealNear(d,0)) d=0; + if ( d<0 ) +return(false); /* All roots imaginary */ + d = sqrt(d); + ts[0] = (-sp->c-d)/(2*sp->b); + ts[1] = (-sp->c+d)/(2*sp->b); + } else if ( sp->c!=0 ) { + ts[0] = -sp->d/sp->c; + } else { + /* If it's a point then either everything is a solution, or nothing */ + } +return( ts[0]!=-1 ); +} + +int CubicSolve(Spline1D *sp,double ts[3]) { + double t; + /* This routine gives us all solutions between [0,1] with -1 as an error flag */ + + if ( !_CubicSolve(sp,ts)) +return( false ); + if (ts[0]>1.0001 || ts[0]<-.0001 ) ts[0] = -1; + else if ( ts[0]<0 ) ts[0] = 0; else if ( ts[0]>1 ) ts[0] = 1; + if (ts[1]>1.0001 || ts[1]<-.0001 ) ts[1] = -1; + else if ( ts[1]<0 ) ts[1] = 0; else if ( ts[1]>1 ) ts[1] = 1; + if (ts[2]>1.0001 || ts[2]<-.0001 ) ts[2] = -1; + else if ( ts[2]<0 ) ts[2] = 0; else if ( ts[2]>1 ) ts[2] = 1; + if ( ts[1]==-1 ) { ts[1] = ts[2]; ts[2] = -1;} + if ( ts[0]==-1 ) { ts[0] = ts[1]; ts[1] = ts[2]; ts[2] = -1; } + if ( ts[0]==-1 ) +return( false ); + if ( ts[0]>ts[2] && ts[2]!=-1 ) { + t = ts[0]; ts[0] = ts[2]; ts[2] = t; + } + if ( ts[0]>ts[1] && ts[1]!=-1 ) { + t = ts[0]; ts[0] = ts[1]; ts[1] = t; + } + if ( ts[1]>ts[2] && ts[2]!=-1 ) { + t = ts[1]; ts[1] = ts[2]; ts[2] = t; + } +return( true ); +} + +static int QuarticSolve(Quartic *q,double ts[4]) { + Quartic work; + Spline1D sp; + double zs[3]; + double sq, a, b, c, d, e, f; + int i; + + work.a = 1; + work.b = 0; + work.c = (q->c-3*q->b*q->b/(8*q->a))/q->a; + work.d = (q->b*q->b*q->b/(8*q->a*q->a) - q->b*q->c/(2*q->a) + q->d)/q->a; + work.e = (-3*q->b*q->b*q->b*q->b/(256*q->a*q->a*q->a) + (q->b*q->b*q->c)/(16*q->a*q->a) - + q->b*q->d/(4*q->a) + q->e)/q->a; + + if ( RealNear(work.e,0)) + work.e = 0; + if ( work.e<0 ) /* I hope this means no real roots, my cubic solver doesn't deal with complex coef */ +return( -1 ); + sq = sqrt(work.e); + sp.a = 8; + sp.b = 24*sq-4*work.c; + sp.c = 16*work.e-8*sq*work.c; + sp.d = -work.d*work.d; + if ( !_CubicSolve(&sp,zs) ) +return( -1 ); + a=2*sq-work.c+2*zs[0]; + b= -work.d; + c= zs[0]*(zs[0]+2*sq); + if ( RealNear(c,0)) + c = 0; + if ( c<0 ) +return( -1 ); + if ( !RealNear(b*b-4*a*c,0) ) + GDrawIError("Failure in quartic"); + + b = -sqrt(a); + c = sq+zs[0]-sqrt(c); + a = 1; + i = 0; + f = q->b/(4*q->a); + if ( b*b-4*c>= 0 ) { + sq = sqrt(b*b-4*c); + ts[i++] = (-b+sq)/2-f; + if ( sq!=0 ) + ts[i++] = (-b-sq)/2-f; + } + /* Now the a,b,c polynomial above must be offset by f before it can */ + /* represent the roots of q */ + c += f*f + b*f; + b += 2*f; + + /* Now divide the original spline by this quadratic, and we will get */ + /* another quadratic with the other two roots */ + d = q->a; + work.b = q->b-d*b; + work.c = q->c-d*c; + e = work.b; + work.c -= e*b; + work.d = q->d-e*c; + f = work.c; + if ( !RealNear(work.d-f*b,0) || !RealNear(q->e-f*c,0)) + GDrawIError("Polynomial division failed"); + if ( e*e-4*d*f >= 0 ) { + sq = sqrt(e*e-4*d*f); + ts[i++] = (-e+sq)/(2*d); + if ( sq!=0 ) + ts[i++] = (-e-sq)/(2*d); + } + while ( i<4 ) ts[i++] = -1; + for ( i=0; i<4 && ts[i]!=-1; ++i ) { + if ( ts[i]<-.001 || ts[i]>1.001 ) ts[i]=-1; + else if ( ts[i]<0 ) ts[i] = 0; else if ( ts[i]>1 ) ts[i] = 1; + } + if ( ts[2]==-1 ) { ts[2]= ts[3]; ts[3] = -1; } + if ( ts[1]==-1 ) { ts[1]= ts[2]; ts[2] = ts[3]; ts[3] = -1; } + if ( ts[0]==-1 ) { ts[0]= ts[1]; ts[1]= ts[2]; ts[2] = ts[3]; ts[3] = -1; } +return( ts[0]!=-1 ); +} + +double SplineSolve(Spline1D *sp, real tmin, real tmax, real sought,real err) { + /* We want to find t so that spline(t) = sought */ + /* the curve must be monotonic */ + /* returns t which is near sought or -1 */ + Spline1D temp; + double ts[3]; + int i; + double t; + + temp = *sp; + temp.d -= sought; + CubicSolve(&temp,ts); + if ( tmax=tmin && ts[i]<=tmax ) +return( ts[i] ); + +return( -1 ); +} + +void SplineFindExtrema(Spline1D *sp, double *_t1, double *_t2 ) { + double t1= -1, t2= -1; + double b2_fourac; + + /* Find the extreme points on the curve */ + /* Set to -1 if there are none or if they are outside the range [0,1] */ + /* Order them so that t1a!=0 ) { + /* cubic, possibly 2 extrema (possibly none) */ + b2_fourac = 4*sp->b*sp->b - 12*sp->a*sp->c; + if ( b2_fourac>=0 ) { + b2_fourac = sqrt(b2_fourac); + t1 = (-2*sp->b - b2_fourac) / (6*sp->a); + t2 = (-2*sp->b + b2_fourac) / (6*sp->a); + if ( t1>t2 ) { double temp = t1; t1 = t2; t2 = temp; } + else if ( t1==t2 ) t2 = -1; + if ( RealNear(t1,0)) t1=0; else if ( RealNear(t1,1)) t1=1; + if ( RealNear(t2,0)) t2=0; else if ( RealNear(t2,1)) t2=1; + if ( t2<=0 || t2>=1 ) t2 = -1; + if ( t1<=0 || t1>=1 ) { t1 = t2; t2 = -1; } + } + } else if ( sp->b!=0 ) { + /* Quadratic, at most one extremum */ + t1 = -sp->c/(2.0*sp->b); + if ( t1<=0 || t1>=1 ) t1 = -1; + } else /*if ( sp->c!=0 )*/ { + /* linear, no extrema */ + } + *_t1 = t1; *_t2 = t2; +} + +int SplineAtInflection(Spline1D *sp, double t ) { + /* It's a point of inflection if d sp/dt==0 and d2 sp/dt^2==0 */ +return ( RealNear( (3*sp->a*t + 2*sp->b)*t + sp->c,0) && + RealNear( 6*sp->a*t + 2*sp->b, 0)); +} + +int SplineAtMinMax(Spline1D *sp, double t ) { + /* It's a point of inflection if d sp/dt==0 and d2 sp/dt^2!=0 */ +return ( RealNear( (3*sp->a*t + 2*sp->b)*t + sp->c,0) && + !RealNear( 6*sp->a*t + 2*sp->b, 0)); +} + +int Spline2DFindExtrema(Spline *sp, double extrema[4] ) { + int i,j; + + SplineFindExtrema(&sp->splines[0],&extrema[0],&extrema[1]); + SplineFindExtrema(&sp->splines[1],&extrema[2],&extrema[3]); + + for ( i=0; i<3; ++i ) for ( j=i+1; j<4; ++j ) { + if ( (extrema[i]==-1 && extrema[j]!=-1) || extrema[i]>extrema[j] ) { + double temp = extrema[i]; + extrema[i] = extrema[j]; + extrema[j] = temp; + } + } + for ( i=j=0; i<3 && extrema[i]!=-1; ++i ) { + if ( extrema[i]==extrema[i+1] ) { + for ( j=i+1; j<3; ++j ) + extrema[j] = extrema[j+1]; + extrema[3] = -1; + } + } + for ( i=0; i<4 && extrema[i]!=-1; ++i ); +return( i ); +} + +/* Ok, if the above routine finds a point of inflection that less than 1 unit */ +/* from an endpoint or another point of inflection, then many things are */ +/* just going to skip over it, and other things will be confused by this */ +/* so just remove it. It should be so close the difference won't matter */ +void SplineRemoveInflectionsTooClose(Spline1D *sp, double *_t1, double *_t2 ) { + double last, test; + double t1= *_t1, t2 = *_t2; + + if ( t1>t2 && t2!=-1 ) { + t1 = t2; + t2 = *_t1; + } + last = sp->d; + if ( t1!=-1 ) { + test = ((sp->a*t1+sp->b)*t1+sp->c)*t1+sp->d; + if ( (test-last)*(test-last)<1 ) + t1 = -1; + else + last = test; + } + if ( t2!=-1 ) { + test = ((sp->a*t2+sp->b)*t2+sp->c)*t2+sp->d; + if ( (test-last)*(test-last)<1 ) + t2 = -1; + else + last = test; + } + test = sp->a+sp->b+sp->c+sp->d; + if ( (test-last)*(test-last)<1 ) { + if ( t2!=-1 ) + t2 = -1; + else if ( t1!=-1 ) + t1 = -1; + else + /* Well we should just remove the whole spline? */; + } + *_t1 = t1; *_t2 = t2; +} + +int SplineSolveFull(Spline1D *sp,double val, double ts[3]) { + Spline1D temp; + + temp = *sp; + temp.d -= val; + CubicSolve(&temp,ts); +return( ts[0]!=-1 ); +} + +#if 0 +static int CheckEndpoint(BasePoint *end,Spline *s,int te,BasePoint *pts, + real *tarray,real *ts,int soln) { + double t; + int i; + + for ( i=0; ix==pts[i].x && end->y==pts[i].y ) +return( soln ); + + t = SplineNearPoint(s,end,.01); + if ( t<=0 || t>=1 ) /* If both splines are at end points then it's a join not an intersection */ +return( soln ); + tarray[soln] = te; + ts[soln] = t; + pts[soln] = *end; +return( soln+1 ); +} +#endif + +static int AddPoint(double x,double y,double t,double s,BasePoint *pts, + double t1s[3],double t2s[3], int soln) { + int i; + + for ( i=0; i1.0001 ) +return( soln ); + if ( s<0 ) s=0; else if ( s>1 ) s=1; + + x = (s2->splines[0].b*s+s2->splines[0].c)*s+s2->splines[0].d; + y = (s2->splines[1].b*s+s2->splines[1].c)*s+s2->splines[1].d; + + for ( i=0; isplines[0].c*s1->splines[0].c-4*s1->splines[0].a*(s1->splines[0].d-x); + if ( RealNear(d,0)) d = 0; + if ( d<0 ) +return( soln ); + t = (-s1->splines[0].c-d)/(2*s1->splines[0].b); + if ( t>-.0001 && t<1.0001 ) { + if ( t<=0 ) {t=0; x=s1->from->me.x; y = s1->from->me.y; } + else if ( t>=1 ) { t=1; x=s1->to->me.x; y = s1->to->me.y; } + if ( RealNear(y, (s1->splines[1].b*t+s1->splines[1].c)*t+s1->splines[1].d ) ) +return( AddPoint(x,y,t,s,pts,t1s,t2s,soln)); + } + t = (-s1->splines[0].c+d)/(2*s1->splines[0].b); + if ( t>-.0001 && t<1.0001 ) { + if ( t<=0 ) {t=0; x=s1->from->me.x; y = s1->from->me.y; } + else if ( t>=1 ) { t=1; x=s1->to->me.x; y = s1->to->me.y; } + if ( RealNear(y, (s1->splines[1].b*t+s1->splines[1].c)*t+s1->splines[1].d) ) +return( AddPoint(x,y,t,s,pts,t1s,t2s,soln)); + } +return( soln ); +} + +static void IterateSolve(Spline1D *sp,double ts[3]) { + /* The closed form solution has too many rounding errors for my taste... */ + int i,j; + + ts[0] = ts[1] = ts[2] = -1; + + if ( sp->a!=0 ) { + double e[4]; + e[0] = 0; e[1] = e[2] = e[3] = 1.0; + SplineFindExtrema(sp,&e[1],&e[2]); + if ( e[1]==-1 ) e[1] = 1; + if ( e[2]==-1 ) e[2] = 1; + for ( i=j=0; i<3; ++i ) { + ts[j] = IterateSplineSolve(sp,e[i],e[i+1],0,.0001); + if ( ts[j]!=-1 ) ++j; + if ( e[i+1]==1.0 ) + break; + } + } else if ( sp->b!=0 ) { + double b2_4ac = sp->c*sp->c - 4*sp->b*sp->d; + if ( b2_4ac>=0 ) { + b2_4ac = sqrt(b2_4ac); + ts[0] = (-sp->c-b2_4ac)/(2*sp->b); + ts[1] = (-sp->c+b2_4ac)/(2*sp->b); + if ( ts[0]>ts[1] ) { double t = ts[0]; ts[0] = ts[1]; ts[1] = t; } + } + } else if ( sp->c!=0 ) { + ts[0] = -sp->d/sp->c; + } else + /* No solutions, or all solutions */; + + for ( i=j=0; i<3; ++i ) + if ( ts[i]>=0 && ts[i]<=1 ) + ts[j++] = ts[i]; + for ( ; j<3; ++j ) + ts[j] = -1; +} + +static double ISolveWithin(Spline1D *sp,double val,double tlow, double thigh) { + Spline1D temp; + double ts[3]; + int i; + + temp = *sp; + temp.d -= val; + IterateSolve(&temp,ts); + if ( tlow=tlow && ts[i]<=thigh ) +return( ts[i] ); + } else { + for ( i=0; i<3; ++i ) + if ( ts[i]>=thigh && ts[i]<=tlow ) +return( ts[i] ); + } +return( -1 ); +} + +static int ICAddInter(int cnt,BasePoint *foundpos,double *foundt1,double *foundt2, + Spline *s1,Spline *s2,double t1,double t2) { + foundt1[cnt] = t1; + foundt2[cnt] = t2; + foundpos[cnt].x = ((s1->splines[0].a*t1+s1->splines[0].b)*t1+ + s1->splines[0].c)*t1+s1->splines[0].d; + foundpos[cnt].y = ((s1->splines[1].a*t1+s1->splines[1].b)*t1+ + s1->splines[1].c)*t1+s1->splines[1].d; +return( cnt+1 ); +} + +static int ICBinarySearch(int cnt,BasePoint *foundpos,double *foundt1,double *foundt2, + int other, + Spline *s1,Spline *s2,double t1low,double t1high,double t2low,double t2high) { + int major; + double t1, t2; + double o1o, o2o, o1n, o2n, m; + + major = !other; + o1o = ((s1->splines[other].a*t1low+s1->splines[other].b)*t1low+ + s1->splines[other].c)*t1low+s1->splines[other].d; + o2o = ((s2->splines[other].a*t2low+s2->splines[other].b)*t2low+ + s2->splines[other].c)*t2low+s2->splines[other].d; + forever { + t1 = (t1low+t1high)/2; + m = ((s1->splines[major].a*t1+s1->splines[major].b)*t1+ + s1->splines[major].c)*t1+s1->splines[major].d; + t2 = ISolveWithin(&s2->splines[major],m,t2low,t2high); + if ( t2==-1 ) +return( cnt ); + + o1n = ((s1->splines[other].a*t1+s1->splines[other].b)*t1+ + s1->splines[other].c)*t1+s1->splines[other].d; + o2n = ((s2->splines[other].a*t2+s2->splines[other].b)*t2+ + s2->splines[other].c)*t2+s2->splines[other].d; + if (( o1n-o2n<.001 && o1n-o2n>-.001) || + (t1-t1low<.0001 && t1-t1low>-.0001)) +return( ICAddInter(cnt,foundpos,foundt1,foundt2,s1,s2,t1,t2)); + if ( (o1o>o2o && o1no2n)) { + t1high = t1; + t2high = t2; + } else { + t1low = t1; + t2low = t2; + } + } +} + +static int CubicsIntersect(Spline *s1,double lowt1,double hight1,BasePoint *min1,BasePoint *max1, + Spline *s2,double lowt2,double hight2,BasePoint *min2,BasePoint *max2, + BasePoint *foundpos,double *foundt1,double *foundt2) { + int major, other; + BasePoint max, min; + double t1max, t1min, t2max, t2min, t1, t2, t1diff, oldt2; + double o1o, o2o, o1n, o2n, m; + int cnt=0; + + if ( (min.x = min1->x)x ) min.x = min2->x; + if ( (min.y = min1->y)y ) min.y = min2->y; + if ( (max.x = max1->x)>max2->x ) max.x = max2->x; + if ( (max.y = max1->y)>max2->y ) max.y = max2->y; + if ( max.x max.y-min.y ) + major = 0; + else + major = 1; + other = 1-major; + + t1max = ISolveWithin(&s1->splines[major],(&max.x)[major],lowt1,hight1); + t1min = ISolveWithin(&s1->splines[major],(&min.x)[major],lowt1,hight1); + t2max = ISolveWithin(&s2->splines[major],(&max.x)[major],lowt2,hight2); + t2min = ISolveWithin(&s2->splines[major],(&min.x)[major],lowt2,hight2); + t1diff = (t1max-t1min)/64.0; + if ( t1diff==0 ) +return( 0 ); + + t1 = t1min; t2 = t2min; + o1o = ((s1->splines[other].a*t1+s1->splines[other].b)*t1+ + s1->splines[other].c)*t1+s1->splines[other].d; + o2o = ((s2->splines[other].a*t2+s2->splines[other].b)*t2+ + s2->splines[other].c)*t2+s2->splines[other].d; + if ( o1o==o2o ) + cnt = ICAddInter(cnt,foundpos,foundt1,foundt2,s1,s2,t1,t2); + forever { + t1 += t1diff; + if (( t1max>t1min && t1>=t1max ) || (t1maxsplines[major].a*t1+s1->splines[major].b)*t1+ + s1->splines[major].c)*t1+s1->splines[major].d; + oldt2 = t2; + t2 = ISolveWithin(&s2->splines[major],m,lowt2,hight2); + if ( t2==-1 ) + continue; + + o1n = ((s1->splines[other].a*t1+s1->splines[other].b)*t1+ + s1->splines[other].c)*t1+s1->splines[other].d; + o2n = ((s2->splines[other].a*t2+s2->splines[other].b)*t2+ + s2->splines[other].c)*t2+s2->splines[other].d; + if ( o1n==o2n ) + cnt = ICAddInter(cnt,foundpos,foundt1,foundt2,s1,s2,t1,t2); + if ( (o1o>o2o && o1no2n)) + cnt = ICBinarySearch(cnt,foundpos,foundt1,foundt2,other, + s1,s2,t1-t1diff,t1,oldt2,t2); + o1o = o1n; o2o = o2n; + } +return( cnt ); +} + +/* returns 0=>no intersection, 1=>at least one, location in pts, t1s, t2s */ +/* -1 => We couldn't figure it out in a closed form, have to do a numerical */ +/* approximation */ +int SplinesIntersect(Spline *s1, Spline *s2, BasePoint pts[9], + double t1s[10], double t2s[10]) { /* One extra for a trailing -1 */ + BasePoint min1, max1, min2, max2; + int soln = 0; + double x,y,s,t; + double d; + int i,j,found; + Spline1D spline, temp; + Quartic quad; + double tempts[4]; /* 3 solns for cubics, 4 for quartics */ + double extrema1[6], extrema2[6]; + int ecnt1, ecnt2; + + if ( s1->splines[0].a == s2->splines[0].a && + s1->splines[0].b == s2->splines[0].b && + s1->splines[0].c == s2->splines[0].c && + s1->splines[0].d == s2->splines[0].d && + s1->splines[1].a == s2->splines[1].a && + s1->splines[1].b == s2->splines[1].b && + s1->splines[1].c == s2->splines[1].c && + s1->splines[1].d == s2->splines[1].d ) +return( -1 ); /* Same spline. Intersects everywhere */ + + t1s[0] = t1s[1] = t1s[2] = t1s[3] = -1; + t2s[0] = t2s[1] = t2s[2] = t2s[3] = -1; + + min1 = s1->from->me; max1 = min1; + min2 = s2->from->me; max2 = min2; + if ( s1->from->nextcp.x>max1.x ) max1.x = s1->from->nextcp.x; + else if ( s1->from->nextcp.xfrom->nextcp.x; + if ( s1->from->nextcp.y>max1.y ) max1.y = s1->from->nextcp.y; + else if ( s1->from->nextcp.yfrom->nextcp.y; + if ( s1->to->prevcp.x>max1.x ) max1.x = s1->to->prevcp.x; + else if ( s1->to->prevcp.xto->prevcp.x; + if ( s1->to->prevcp.y>max1.y ) max1.y = s1->to->prevcp.y; + else if ( s1->to->prevcp.yto->prevcp.y; + if ( s1->to->me.x>max1.x ) max1.x = s1->to->me.x; + else if ( s1->to->me.xto->me.x; + if ( s1->to->me.y>max1.y ) max1.y = s1->to->me.y; + else if ( s1->to->me.yto->me.y; + + if ( s2->from->nextcp.x>max2.x ) max2.x = s2->from->nextcp.x; + else if ( s2->from->nextcp.xfrom->nextcp.x; + if ( s2->from->nextcp.y>max2.y ) max2.y = s2->from->nextcp.y; + else if ( s2->from->nextcp.yfrom->nextcp.y; + if ( s2->to->prevcp.x>max2.x ) max2.x = s2->to->prevcp.x; + else if ( s2->to->prevcp.xto->prevcp.x; + if ( s2->to->prevcp.y>max2.y ) max2.y = s2->to->prevcp.y; + else if ( s2->to->prevcp.yto->prevcp.y; + if ( s2->to->me.x>max2.x ) max2.x = s2->to->me.x; + else if ( s2->to->me.xto->me.x; + if ( s2->to->me.y>max2.y ) max2.y = s2->to->me.y; + else if ( s2->to->me.yto->me.y; + if ( min1.x>max2.x || min2.x>max1.x || min1.y>max2.y || min2.y>max1.y ) +return( false ); /* no intersection of bounding boxes */ + + /* Ignore splines which are just a point */ + if ( s1->knownlinear && s1->splines[0].c==0 && s1->splines[1].c==0 ) +return( false ); + if ( s2->knownlinear && s2->splines[0].c==0 && s2->splines[1].c==0 ) +return( false ); + + if ( s1->knownlinear ) + /* Do Nothing */; + else if ( s2->knownlinear || (!s1->isquadratic && s2->isquadratic)) { + Spline *stemp = s1; + double *ts = t1s; + t1s = t2s; t2s = ts; + s1 = s2; s2 = stemp; + } + +#if 0 + soln = CheckEndpoint(&s1->from->me,s2,0,pts,t1s,t2s,soln); + soln = CheckEndpoint(&s1->to->me,s2,1,pts,t1s,t2s,soln); + soln = CheckEndpoint(&s2->from->me,s1,0,pts,t2s,t1s,soln); + soln = CheckEndpoint(&s2->to->me,s1,1,pts,t2s,t1s,soln); +#endif + + if ( s1->knownlinear ) { + spline.d = s1->splines[1].c*(s2->splines[0].d-s1->splines[0].d)- + s1->splines[0].c*(s2->splines[1].d-s1->splines[1].d); + spline.c = s1->splines[1].c*s2->splines[0].c - s1->splines[0].c*s2->splines[1].c; + spline.b = s1->splines[1].c*s2->splines[0].b - s1->splines[0].c*s2->splines[1].b; + spline.a = s1->splines[1].c*s2->splines[0].a - s1->splines[0].c*s2->splines[1].a; + IterateSolve(&spline,tempts); + if ( tempts[0]==-1 ) +return( false ); + for ( i = 0; i<3 && tempts[i]!=-1; ++i ) { + x = ((s2->splines[0].a*tempts[i]+s2->splines[0].b)*tempts[i]+ + s2->splines[0].c)*tempts[i]+s2->splines[0].d; + y = ((s2->splines[1].a*tempts[i]+s2->splines[1].b)*tempts[i]+ + s2->splines[1].c)*tempts[i]+s2->splines[1].d; + if ( s1->splines[0].c!=0 ) + t = (x-s1->splines[0].d)/s1->splines[0].c; + else + t = (y-s1->splines[1].d)/s1->splines[1].c; + if ( t<-.001 || t>1.001 ) + continue; + if ( t<=0 ) {t=0; x=s1->from->me.x; y = s1->from->me.y; } + else if ( t>=1 ) { t=1; x=s1->to->me.x; y = s1->to->me.y; } + if ( s1->from->me.x==s1->to->me.x ) /* Avoid rounding errors */ + x = s1->from->me.x; /* on hor/vert lines */ + else if ( s1->from->me.y==s1->to->me.y ) + y = s1->from->me.y; + if ( s2->knownlinear ) { + if ( s2->from->me.x==s2->to->me.x ) + x = s2->from->me.x; + else if ( s2->from->me.y==s2->to->me.y ) + y = s2->from->me.y; + } + soln = AddPoint(x,y,t,tempts[i],pts,t1s,t2s,soln); + } +return( soln!=0 ); + } else if ( s1->isquadratic && s2->isquadratic ) { + temp.a = 0; + temp.b = s1->splines[1].b*s2->splines[0].b - s1->splines[0].b*s2->splines[1].b; + temp.c = s1->splines[1].b*s2->splines[0].c - s1->splines[0].b*s2->splines[1].c; + temp.d = s1->splines[1].b*(s2->splines[0].d-s1->splines[0].d) - + s1->splines[0].b*(s2->splines[1].d-s1->splines[1].d); + d = s1->splines[1].b*s1->splines[0].c - s1->splines[0].b*s1->splines[1].c; + if ( RealNear(d,0)) d=0; + if ( d!=0 ) { + temp.b /= d; temp.c /= d; temp.d /= d; + /* At this point t= temp.b*s^2 + temp.c*s + temp.d */ + /* We substitute this back into one of our equations and get a */ + /* quartic in s */ + quad.a = s1->splines[0].b*temp.b*temp.b; + quad.b = s1->splines[0].b*2*temp.b*temp.c; + quad.c = s1->splines[0].b*(2*temp.b*temp.d+temp.c*temp.c); + quad.d = s1->splines[0].b*2*temp.d*temp.c; + quad.e = s1->splines[0].b*temp.d*temp.d; + quad.b+= s1->splines[0].c*temp.b; + quad.c+= s1->splines[0].c*temp.c; + quad.d+= s1->splines[0].c*temp.d; + quad.e+= s1->splines[0].d; + quad.e-= s2->splines[0].d; + quad.d-= s2->splines[0].c; + quad.c-= s2->splines[0].b; + if ( QuarticSolve(&quad,tempts)==-1 ) +return( -1 ); + for ( i=0; i<4 && tempts[i]!=-999999; ++i ) + soln = AddQuadraticSoln(tempts[i],s1,s2,pts,t1s,t2s,soln); + } else { + d = temp.c*temp.c-4*temp.b*temp.c; + if ( RealNear(d,0)) d = 0; + if ( d<0 ) +return( soln!=0 ); + d = sqrt(d); + s = (-temp.c-d)/(2*temp.b); + soln = AddQuadraticSoln(s,s1,s2,pts,t1s,t2s,soln); + s = (-temp.c+d)/(2*temp.b); + soln = AddQuadraticSoln(s,s1,s2,pts,t1s,t2s,soln); + } +return( soln!=0 ); + } + /* if one of the splines is quadratic then we can get an expression */ + /* relating c*t+d to poly(s^3), and substituting this back we get */ + /* a poly of degree 6 in s which could be solved iteratively */ + /* however mixed quadratics and cubics are unlikely */ + + /* but if both splines are degree 3, the t is expressed as the sqrt of */ + /* a third degree poly, which must be substituted into a cubic, and */ + /* then squared to get rid of the sqrts leaving us with an ?18? degree */ + /* poly. Ick. */ + + /* So let's do it the hard way... we break the splines into little bits */ + /* where they are monotonic in both dimensions, then check these for */ + /* possible intersections */ + extrema1[0] = extrema2[0] = 0; + ecnt1 = Spline2DFindExtrema(s1,extrema1+1); + ecnt2 = Spline2DFindExtrema(s2,extrema2+1); + extrema1[++ecnt1] = 1.0; + extrema2[++ecnt2] = 1.0; + found=0; + for ( i=0; isplines[0].a*extrema1[i]+s1->splines[0].b)*extrema1[i]+ + s1->splines[0].c)*extrema1[i]+s1->splines[0].d; + min1.y = ((s1->splines[1].a*extrema1[i]+s1->splines[1].b)*extrema1[i]+ + s1->splines[1].c)*extrema1[i]+s1->splines[1].d; + max1.x = ((s1->splines[0].a*extrema1[i+1]+s1->splines[0].b)*extrema1[i+1]+ + s1->splines[0].c)*extrema1[i+1]+s1->splines[0].d; + max1.y = ((s1->splines[1].a*extrema1[i+1]+s1->splines[1].b)*extrema1[i+1]+ + s1->splines[1].c)*extrema1[i+1]+s1->splines[1].d; + if ( max1.xsplines[0].a*extrema2[j]+s2->splines[0].b)*extrema2[j]+ + s2->splines[0].c)*extrema2[j]+s2->splines[0].d; + min2.y = ((s2->splines[1].a*extrema2[j]+s2->splines[1].b)*extrema2[j]+ + s2->splines[1].c)*extrema2[j]+s2->splines[1].d; + max2.x = ((s2->splines[0].a*extrema2[j+1]+s2->splines[0].b)*extrema2[j+1]+ + s2->splines[0].c)*extrema2[j+1]+s2->splines[0].d; + max2.y = ((s2->splines[1].a*extrema2[j+1]+s2->splines[1].b)*extrema2[j+1]+ + s2->splines[1].c)*extrema2[j+1]+s2->splines[1].d; + if ( max2.xmax2.x || min2.x>max1.x || min1.y>max2.y || min2.y>max1.y ) + /* No possible intersection */; + else + found += CubicsIntersect(s1,extrema1[i],extrema1[i+1],&min1,&max1, + s2,extrema2[j],extrema2[j+1],&min2,&max2, + &pts[found],&t1s[found],&t2s[found]); + } + } + t1s[found] = t2s[found] = -1; +return( found!=0 ); +} + +static int XSolve(Spline *spline,real tmin, real tmax,FindSel *fs) { + Spline1D *yspline = &spline->splines[1], *xspline = &spline->splines[0]; + double t,x,y; + + fs->p->t = t = SplineSolve(xspline,tmin,tmax,fs->p->cx,.001); + if ( t>=0 && t<=1 ) { + y = ((yspline->a*t+yspline->b)*t+yspline->c)*t + yspline->d; + if ( fs->ylyh>y ) +return( true ); + } + /* Although we know that globaly there's more x change, locally there */ + /* maybe more y change */ + fs->p->t = t = SplineSolve(yspline,tmin,tmax,fs->p->cy,.001); + if ( t>=0 && t<=1 ) { + x = ((xspline->a*t+xspline->b)*t+xspline->c)*t + xspline->d; + if ( fs->xlxh>x ) +return( true ); + } +return( false ); +} + +static int YSolve(Spline *spline,real tmin, real tmax,FindSel *fs) { + Spline1D *yspline = &spline->splines[1], *xspline = &spline->splines[0]; + double t,x,y; + + fs->p->t = t = SplineSolve(yspline,tmin,tmax,fs->p->cy,.001); + if ( t>=0 && t<=1 ) { + x = ((xspline->a*t+xspline->b)*t+xspline->c)*t + xspline->d; + if ( fs->xlxh>x ) +return( true ); + } + /* Although we know that globaly there's more y change, locally there */ + /* maybe more x change */ + fs->p->t = t = SplineSolve(xspline,tmin,tmax,fs->p->cx,.001); + if ( t>=0 && t<=1 ) { + y = ((yspline->a*t+yspline->b)*t+yspline->c)*t + yspline->d; + if ( fs->ylyh>y ) +return( true ); + } +return( false ); +} + +static int NearXSpline(FindSel *fs, Spline *spline) { + /* If we get here we've checked the bounding box and we're in it */ + /* the y spline is a horizontal line */ + /* the x spline is not linear */ + double t,y; + Spline1D *yspline = &spline->splines[1], *xspline = &spline->splines[0]; + + if ( xspline->a!=0 ) { + double t1, t2, tbase; + SplineFindExtrema(xspline,&t1,&t2); + tbase = 0; + if ( t1!=-1 ) { + if ( XSolve(spline,0,t1,fs)) +return( true ); + tbase = t1; + } + if ( t2!=-1 ) { + if ( XSolve(spline,tbase,t2,fs)) +return( true ); + tbase = t2; + } + if ( XSolve(spline,tbase,1.0,fs)) +return( true ); + } else if ( xspline->b!=0 ) { + double root = xspline->c*xspline->c - 4*xspline->b*(xspline->d-fs->p->cx); + if ( root < 0 ) +return( false ); + root = sqrt(root); + fs->p->t = t = (-xspline->c + root)/(2*xspline->b); + if ( t>=0 && t<=1 ) { + y = ((yspline->a*t+yspline->b)*t+yspline->c)*t + yspline->d; + if ( fs->ylyh>y ) +return( true ); + } + fs->p->t = t = (-xspline->c - root)/(2*xspline->b); + if ( t>=0 && t<=1 ) { + y = ((yspline->a*t+yspline->b)*t+yspline->c)*t + yspline->d; + if ( fs->ylyh>y ) +return( true ); + } + } else /* xspline->c can't be 0 because dx>dy => dx!=0 => xspline->c!=0 */ { + fs->p->t = t = (fs->p->cx-xspline->d)/xspline->c; + y = ((yspline->a*t+yspline->b)*t+yspline->c)*t + yspline->d; + if ( fs->ylyh>y ) +return( true ); + } +return( false ); +} + +int NearSpline(FindSel *fs, Spline *spline) { + double t,x,y; + Spline1D *yspline = &spline->splines[1], *xspline = &spline->splines[0]; + double dx, dy; + + if (( dx = spline->to->me.x-spline->from->me.x)<0 ) dx = -dx; + if (( dy = spline->to->me.y-spline->from->me.y)<0 ) dy = -dy; + + if ( spline->knownlinear ) { + if ( fs->xl > spline->from->me.x && fs->xl > spline->to->me.x ) +return( false ); + if ( fs->xh < spline->from->me.x && fs->xh < spline->to->me.x ) +return( false ); + if ( fs->yl > spline->from->me.y && fs->yl > spline->to->me.y ) +return( false ); + if ( fs->yh < spline->from->me.y && fs->yh < spline->to->me.y ) +return( false ); + if ( xspline->c==0 && yspline->c==0 ) /* It's a point. */ +return( true ); + if ( dy>dx ) { + t = (fs->p->cy-yspline->d)/yspline->c; + fs->p->t = t; + x = xspline->c*t + xspline->d; + if ( fs->xlxh>x && t>=0 && t<=1 ) +return( true ); + } else { + t = (fs->p->cx-xspline->d)/xspline->c; + fs->p->t = t; + y = yspline->c*t + yspline->d; + if ( fs->ylyh>y && t>=0 && t<=1 ) +return( true ); + } +return( false ); + } else { + if ( fs->xl > spline->from->me.x && fs->xl > spline->to->me.x && + fs->xl > spline->from->nextcp.x && fs->xl > spline->to->prevcp.x ) +return( false ); + if ( fs->xh < spline->from->me.x && fs->xh < spline->to->me.x && + fs->xh < spline->from->nextcp.x && fs->xh < spline->to->prevcp.x ) +return( false ); + if ( fs->yl > spline->from->me.y && fs->yl > spline->to->me.y && + fs->yl > spline->from->nextcp.y && fs->yl > spline->to->prevcp.y ) +return( false ); + if ( fs->yh < spline->from->me.y && fs->yh < spline->to->me.y && + fs->yh < spline->from->nextcp.y && fs->yh < spline->to->prevcp.y ) +return( false ); + + if ( dx>dy ) +return( NearXSpline(fs,spline)); + else if ( yspline->a == 0 && yspline->b == 0 ) { + fs->p->t = t = (fs->p->cy-yspline->d)/yspline->c; + x = ((xspline->a*t+xspline->b)*t+xspline->c)*t + xspline->d; + if ( fs->xlxh>x && t>=0 && t<=1 ) +return( true ); + } else if ( yspline->a==0 ) { + double root = yspline->c*yspline->c - 4*yspline->b*(yspline->d-fs->p->cy); + if ( root < 0 ) +return( false ); + root = sqrt(root); + fs->p->t = t = (-yspline->c + root)/(2*yspline->b); + x = ((xspline->a*t+xspline->b)*t+xspline->c)*t + xspline->d; + if ( fs->xlxh>x && t>0 && t<1 ) +return( true ); + fs->p->t = t = (-yspline->c - root)/(2*yspline->b); + x = ((xspline->a*t+xspline->b)*t+xspline->c)*t + xspline->d; + if ( fs->xlxh>x && t>=0 && t<=1 ) +return( true ); + } else { + double t1, t2, tbase; + SplineFindExtrema(yspline,&t1,&t2); + tbase = 0; + if ( t1!=-1 ) { + if ( YSolve(spline,0,t1,fs)) +return( true ); + tbase = t1; + } + if ( t2!=-1 ) { + if ( YSolve(spline,tbase,t2,fs)) +return( true ); + tbase = t2; + } + if ( YSolve(spline,tbase,1.0,fs)) +return( true ); + } + } +return( false ); +} + +real SplineNearPoint(Spline *spline, BasePoint *bp, real fudge) { + PressedOn p; + FindSel fs; + + memset(&fs,'\0',sizeof(fs)); + memset(&p,'\0',sizeof(p)); + fs.p = &p; + p.cx = bp->x; + p.cy = bp->y; + fs.fudge = fudge; + fs.xl = p.cx-fudge; + fs.xh = p.cx+fudge; + fs.yl = p.cy-fudge; + fs.yh = p.cy+fudge; + if ( !NearSpline(&fs,spline)) +return( -1 ); + +return( p.t ); +} + +static int SplinePrevMinMax(Spline *s,int up) { + const double t = .9999; + double y; + int pup; + + s = s->from->prev; + while ( s->from->me.y==s->to->me.y && s->islinear ) + s = s->from->prev; + y = ((s->splines[1].a*t + s->splines[1].b)*t + s->splines[1].c)*t + s->splines[1].d; + pup = s->to->me.y > y; +return( pup!=up ); +} + +static int SplineNextMinMax(Spline *s,int up) { + const double t = .0001; + double y; + int nup; + + s = s->to->next; + while ( s->from->me.y==s->to->me.y && s->islinear ) + s = s->to->next; + y = ((s->splines[1].a*t + s->splines[1].b)*t + s->splines[1].c)*t + s->splines[1].d; + nup = y > s->from->me.y; +return( nup!=up ); +} + +static int Crossings(Spline *s,BasePoint *pt) { + double ext[4]; + int i, cnt=0; + double yi, yi1, t, x; + + ext[0] = 0; ext[3] = 1.0; + SplineFindExtrema(&s->splines[1],&ext[1],&ext[2]); + if ( ext[2]!=-1 && SplineAtInflection(&s->splines[1],ext[2])) ext[2]=-1; + if ( ext[1]!=-1 && SplineAtInflection(&s->splines[1],ext[1])) {ext[1] = ext[2]; ext[2]=-1;} + if ( ext[1]==-1 ) ext[1] = 1.0; + else if ( ext[2]==-1 ) ext[2] = 1.0; + yi = s->splines[1].d; + for ( i=0; ext[i]!=1.0; ++i, yi=yi1 ) { + yi1 = ((s->splines[1].a*ext[i+1]+s->splines[1].b)*ext[i+1]+s->splines[1].c)*ext[i+1]+s->splines[1].d; + if ( yi==yi1 ) + continue; /* Ignore horizontal lines */ + if ( (yi>yi1 && (pt->yy>yi)) || + (yiyy>yi1)) ) + continue; + t = IterateSplineSolve(&s->splines[1],ext[i],ext[i+1],pt->y,.0001); + if ( t==-1 ) + continue; + x = ((s->splines[0].a*t+s->splines[0].b)*t+s->splines[0].c)*t+s->splines[0].d; + if ( x>=pt->x ) /* Things on the edge are not inside */ + continue; + if (( ext[i]!=0 && RealApprox(t,ext[i]) && SplineAtMinMax(&s->splines[1],ext[i]) ) || + ( ext[i+1]!=1 && RealApprox(t,ext[i+1]) && SplineAtMinMax(&s->splines[1],ext[i+1]) )) + continue; /* Min/Max points don't add to count */ + if (( RealApprox(t,0) && SplinePrevMinMax(s,yi1>yi) ) || + ( RealApprox(t,1) && SplineNextMinMax(s,yi1>yi) )) + continue; /* ditto */ + if ( pt->y==yi1 ) /* Not a min/max. prev/next spline continues same direction */ + continue; /* If it's at an endpoint we don't want to count it twice */ + /* So only add to count at start endpoint, never at final */ + if ( yi1>yi ) + ++cnt; + else + --cnt; + } +return( cnt ); +} + +/* Return whether this point is within the set of contours in spl */ +/* Draw a line from [-infinity,pt.y] to [pt.x,pt.y] and count contour crossings */ +int SSPointWithin(SplineSet *spl,BasePoint *pt) { + int cnt=0; + Spline *s, *first; + + while ( spl!=NULL ) { + if ( spl->first->prev!=NULL ) { + first = NULL; + for ( s = spl->first->next; s!=first; s=s->to->next ) { + if ( first==NULL ) first = s; + if (( s->from->me.x>pt->x && s->from->nextcp.x>pt->x && + s->to->me.x>pt->x && s->to->prevcp.x>pt->x) || + ( s->from->me.y>pt->y && s->from->nextcp.y>pt->y && + s->to->me.y>pt->y && s->to->prevcp.y>pt->y) || + ( s->from->me.yy && s->from->nextcp.yy && + s->to->me.yy && s->to->prevcp.yy)) + continue; + cnt += Crossings(s,pt); + } + } + spl = spl->next; + } +return( cnt!=0 ); +} + +void StemInfoFree(StemInfo *h) { + HintInstance *hi, *n; + + for ( hi=h->where; hi!=NULL; hi=n ) { + n = hi->next; + chunkfree(hi,sizeof(HintInstance)); + } + chunkfree(h,sizeof(StemInfo)); +} + +void StemInfosFree(StemInfo *h) { + StemInfo *hnext; + HintInstance *hi, *n; + + for ( ; h!=NULL; h = hnext ) { + for ( hi=h->where; hi!=NULL; hi=n ) { + n = hi->next; + chunkfree(hi,sizeof(HintInstance)); + } + hnext = h->next; + chunkfree(h,sizeof(StemInfo)); + } +} + +void DStemInfoFree(DStemInfo *h) { + + free(h); +} + +void DStemInfosFree(DStemInfo *h) { + DStemInfo *hnext; + + for ( ; h!=NULL; h = hnext ) { + hnext = h->next; + chunkfree(h,sizeof(DStemInfo)); + } +} + +StemInfo *StemInfoCopy(StemInfo *h) { + StemInfo *head=NULL, *last=NULL, *cur; + HintInstance *hilast, *hicur, *hi; + + for ( ; h!=NULL; h = h->next ) { + cur = chunkalloc(sizeof(StemInfo)); + *cur = *h; + cur->next = NULL; + if ( head==NULL ) + head = last = cur; + else { + last->next = cur; + last = cur; + } + cur->where = hilast = NULL; + for ( hi=h->where; hi!=NULL; hi=hi->next ) { + hicur = chunkalloc(sizeof(StemInfo)); + *hicur = *hi; + hicur->next = NULL; + if ( hilast==NULL ) + cur->where = hilast = hicur; + else { + hilast->next = hicur; + hilast = hicur; + } + } + } +return( head ); +} + +DStemInfo *DStemInfoCopy(DStemInfo *h) { + DStemInfo *head=NULL, *last=NULL, *cur; + + for ( ; h!=NULL; h = h->next ) { + cur = chunkalloc(sizeof(DStemInfo)); + *cur = *h; + cur->next = NULL; + if ( head==NULL ) + head = last = cur; + else { + last->next = cur; + last = cur; + } + } +return( head ); +} + +MinimumDistance *MinimumDistanceCopy(MinimumDistance *md) { + MinimumDistance *head=NULL, *last=NULL, *cur; + + for ( ; md!=NULL; md = md->next ) { + cur = chunkalloc(sizeof(DStemInfo)); + *cur = *md; + cur->next = NULL; + if ( head==NULL ) + head = last = cur; + else { + last->next = cur; + last = cur; + } + } +return( head ); +} + +static int KCFindName(char *name, char **classnames, int cnt ) { + int i; + char *pt, *end, ch; + + for ( i=1; ikerns; kc!=NULL; kc=kc->next ) { + f = KCFindName(first->name,kc->firsts,kc->first_cnt); + l = KCFindName(last->name,kc->seconds,kc->second_cnt); + if ( f!=0 && l!=0 ) { + if ( i || kc->offsets[f*kc->second_cnt+l]!=0 ) { + *index = f*kc->second_cnt+l; +return( kc ); + } + } + } + } +return( NULL ); +} + +KernClass *SFFindVKernClass(SplineFont *sf,SplineChar *first,SplineChar *last, + int *index,int allow_zero) { + int i,f,l; + KernClass *kc; + + for ( i=0; i<=allow_zero; ++i ) { + for ( kc=sf->vkerns; kc!=NULL; kc=kc->next ) { + f = KCFindName(first->name,kc->firsts,kc->first_cnt); + l = KCFindName(last->name,kc->seconds,kc->second_cnt); + if ( f!=0 && l!=0 ) { + if ( i || kc->offsets[f*kc->second_cnt+l]!=0 ) { + *index = f*kc->second_cnt+l; +return( kc ); + } + } + } + } +return( NULL ); +} + +void KernPairsFree(KernPair *kp) { + KernPair *knext; + for ( ; kp!=NULL; kp = knext ) { + knext = kp->next; + chunkfree(kp,sizeof(KernPair)); + } +} + +static AnchorPoint *AnchorPointsRemoveName(AnchorPoint *alist,AnchorClass *an) { + AnchorPoint *prev=NULL, *ap, *next; + + for ( ap=alist; ap!=NULL; ap=next ) { + next = ap->next; + if ( ap->anchor == an ) { + if ( prev==NULL ) + alist = next; + else + prev->next = next; + chunkfree(ap,sizeof(AnchorPoint)); + if ( ap->type==at_mark || ap->type==at_basechar || ap->type==at_basemark ) + next = NULL; /* Names only occur once, unless it's a ligature or cursive */ + } else + prev = ap; + } +return( alist ); +} + +static void SCRemoveAnchorClass(SplineChar *sc,AnchorClass *an) { + Undoes *test; + + if ( sc==NULL ) +return; + sc->anchor = AnchorPointsRemoveName(sc->anchor,an); + for ( test = sc->layers[ly_fore].undoes; test!=NULL; test=test->next ) + if ( test->undotype==ut_state || test->undotype==ut_tstate || + test->undotype==ut_statehint || test->undotype==ut_statename ) + test->u.state.anchor = AnchorPointsRemoveName(test->u.state.anchor,an); + for ( test = sc->layers[ly_fore].redoes; test!=NULL; test=test->next ) + if ( test->undotype==ut_state || test->undotype==ut_tstate || + test->undotype==ut_statehint || test->undotype==ut_statename ) + test->u.state.anchor = AnchorPointsRemoveName(test->u.state.anchor,an); +} + +void SFRemoveAnchorClass(SplineFont *sf,AnchorClass *an) { + int i; + AnchorClass *prev, *test; + + PasteRemoveAnchorClass(sf,an); + + for ( i=0; icharcnt; ++i ) + SCRemoveAnchorClass(sf->chars[i],an); + prev = NULL; + for ( test=sf->anchor; test!=NULL; test=test->next ) { + if ( test==an ) { + if ( prev==NULL ) + sf->anchor = test->next; + else + prev->next = test->next; + chunkfree(test,sizeof(AnchorClass)); + break; + } else + prev = test; + } +} + +AnchorPoint *APAnchorClassMerge(AnchorPoint *anchors,AnchorClass *into,AnchorClass *from) { + AnchorPoint *api=NULL, *prev, *ap, *next; + + prev = NULL; + for ( ap=anchors; ap!=NULL; ap=next ) { + next = ap->next; + if ( ap->anchor==from ) { + for ( api=anchors; api!=NULL; api=api->next ) { + if ( api->anchor==into && + (api->type!=at_baselig || ap->type!=at_baselig || api->lig_index==ap->lig_index)) + break; + } + if ( api==NULL && into!=NULL ) { + ap->anchor = into; + prev = ap; + } else { + if ( prev==NULL ) + anchors = next; + else + prev->next = next; + chunkfree(ap,sizeof(AnchorPoint)); + } + } else + prev = ap; + } +return( anchors ); +} + +void AnchorClassMerge(SplineFont *sf,AnchorClass *into,AnchorClass *from) { + int i; + + if ( into==from ) +return; + PasteAnchorClassMerge(sf,into,from); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + SplineChar *sc = sf->chars[i]; + + sc->anchor = APAnchorClassMerge(sc->anchor,into,from); + } +} + +AnchorPoint *AnchorPointsCopy(AnchorPoint *alist) { + AnchorPoint *head=NULL, *last, *ap; + + while ( alist!=NULL ) { + ap = chunkalloc(sizeof(AnchorPoint)); + *ap = *alist; + if ( head==NULL ) + head = ap; + else + last->next = ap; + last = ap; + alist = alist->next; + } +return( head ); +} + +void AnchorPointsFree(AnchorPoint *ap) { + AnchorPoint *anext; + for ( ; ap!=NULL; ap = anext ) { + anext = ap->next; + chunkfree(ap,sizeof(AnchorPoint)); + } +} + +void PSTFree(PST *pst) { + PST *pnext; + for ( ; pst!=NULL; pst = pnext ) { + pnext = pst->next; + if ( pst->type==pst_lcaret ) + free(pst->u.lcaret.carets); + else if ( pst->type==pst_pair ) { + free(pst->u.pair.paired); + chunkfree(pst->u.pair.vr,sizeof(struct vr [2])); + } else if ( pst->type!=pst_position ) + free(pst->u.subs.variant); + chunkfree(pst,sizeof(PST)); + } +} + +void MinimumDistancesFree(MinimumDistance *md) { + MinimumDistance *next; + + while ( md!=NULL ) { + next = md->next; + chunkfree(md,sizeof(MinimumDistance)); + md = next; + } +} + +void TTFLangNamesFree(struct ttflangname *l) { + struct ttflangname *next; + int i; + + while ( l!=NULL ) { + next = l->next; + for ( i=0; inames[i]); + free(l); + l = next; + } +} + +void LayerDefault(Layer *layer) { + memset(layer,0,sizeof(Layer)); +#ifdef FONTFORGE_CONFIG_TYPE3 + layer->fill_brush.opacity = layer->stroke_pen.brush.opacity = 1.0; + layer->fill_brush.col = layer->stroke_pen.brush.col = COLOR_INHERITED; + layer->stroke_pen.width = WIDTH_INHERITED; + layer->stroke_pen.linecap = lc_inherited; + layer->stroke_pen.linejoin = lj_inherited; + layer->dofill = true; + layer->fillfirst = true; + layer->stroke_pen.trans[0] = layer->stroke_pen.trans[3] = 1.0; + layer->stroke_pen.trans[1] = layer->stroke_pen.trans[2] = 0.0; +#endif +} + +SplineChar *SplineCharCreate(void) { + SplineChar *sc = chunkalloc(sizeof(SplineChar)); + sc->color = COLOR_DEFAULT; + sc->orig_pos = 0xffff; + sc->unicodeenc = -1; + sc->layer_cnt = 2; +#ifdef FONTFORGE_CONFIG_TYPE3 + sc->layers = gcalloc(2,sizeof(Layer)); + LayerDefault(&sc->layers[0]); + LayerDefault(&sc->layers[1]); +#endif +return( sc ); +} + +void SplineCharListsFree(struct splinecharlist *dlist) { + struct splinecharlist *dnext; + for ( ; dlist!=NULL; dlist = dnext ) { + dnext = dlist->next; + chunkfree(dlist,sizeof(struct splinecharlist)); + } +} + +void SplineCharFreeContents(SplineChar *sc) { + int i; + + if ( sc==NULL ) +return; + free(sc->name); + for ( i=0; ilayer_cnt; ++i ) { + SplinePointListsFree(sc->layers[i].splines); + RefCharsFree(sc->layers[i].refs); + ImageListsFree(sc->layers[i].images); + /* image garbage collection????!!!! */ + UndoesFree(sc->layers[i].undoes); + UndoesFree(sc->layers[i].redoes); + } + StemInfosFree(sc->hstem); + StemInfosFree(sc->vstem); + DStemInfosFree(sc->dstem); + MinimumDistancesFree(sc->md); + KernPairsFree(sc->kerns); + KernPairsFree(sc->vkerns); + AnchorPointsFree(sc->anchor); + SplineCharListsFree(sc->dependents); + PSTFree(sc->possub); + free(sc->ttf_instrs); + free(sc->countermasks); +#ifdef FONTFORGE_CONFIG_TYPE3 + free(sc->layers); +#endif +} + +void SplineCharFree(SplineChar *sc) { + + if ( sc==NULL ) +return; + SplineCharFreeContents(sc); + chunkfree(sc,sizeof(SplineChar)); +} + +void AnchorClassesFree(AnchorClass *an) { + AnchorClass *anext; + for ( ; an!=NULL; an = anext ) { + anext = an->next; + chunkfree(an,sizeof(AnchorClass)); + } +} + +void TableOrdersFree(struct table_ordering *ord) { + struct table_ordering *onext; + for ( ; ord!=NULL; ord = onext ) { + onext = ord->next; + free(ord->ordered_features); + chunkfree(ord,sizeof(struct table_ordering)); + } +} + +void TtfTablesFree(struct ttf_table *tab) { + struct ttf_table *next; + + for ( ; tab!=NULL; tab = next ) { + next = tab->next; + free(tab->data); + chunkfree(tab,sizeof(struct ttf_table)); + } +} + +void ScriptRecordFree(struct script_record *sr) { + int i; + + for ( i=0; sr[i].script!=0; ++i ) + free( sr[i].langs ); + free( sr ); +} + +void ScriptRecordListFree(struct script_record **script_lang) { + int i; + + if ( script_lang==NULL ) +return; + for ( i=0; script_lang[i]!=NULL; ++i ) + ScriptRecordFree(script_lang[i]); + free( script_lang ); +} + +KernClass *KernClassCopy(KernClass *kc) { + KernClass *new; + int i; + + if ( kc==NULL ) +return( NULL ); + new = chunkalloc(sizeof(KernClass)); + *new = *kc; + new->firsts = galloc(new->first_cnt*sizeof(char *)); + new->seconds = galloc(new->second_cnt*sizeof(char *)); + new->offsets = galloc(new->first_cnt*new->second_cnt*sizeof(int16)); + memcpy(new->offsets,kc->offsets, new->first_cnt*new->second_cnt*sizeof(int16)); + for ( i=0; ifirst_cnt; ++i ) + new->firsts[i] = copy(kc->firsts[i]); + for ( i=0; isecond_cnt; ++i ) + new->seconds[i] = copy(kc->seconds[i]); + new->next = NULL; +return( new ); +} + +void KernClassListFree(KernClass *kc) { + int i; + KernClass *n; + + while ( kc ) { + for ( i=1; ifirst_cnt; ++i ) + free(kc->firsts[i]); + for ( i=1; isecond_cnt; ++i ) + free(kc->seconds[i]); + free(kc->firsts); + free(kc->seconds); + free(kc->offsets); + n = kc->next; + chunkfree(kc,sizeof(KernClass)); + kc = n; + } +} + +void MacNameListFree(struct macname *mn) { + struct macname *next; + + while ( mn!=NULL ) { + next = mn->next; + free(mn->name); + chunkfree(mn,sizeof(struct macname)); + mn = next; + } +} + +void MacSettingListFree(struct macsetting *ms) { + struct macsetting *next; + + while ( ms!=NULL ) { + next = ms->next; + MacNameListFree(ms->setname); + chunkfree(ms,sizeof(struct macsetting)); + ms = next; + } +} + +void MacFeatListFree(MacFeat *mf) { + MacFeat *next; + + while ( mf!=NULL ) { + next = mf->next; + MacNameListFree(mf->featname); + MacSettingListFree(mf->settings); + chunkfree(mf,sizeof(MacFeat)); + mf = next; + } +} + +void ASMFree(ASM *sm) { + ASM *next; + int i; + + while ( sm!=NULL ) { + next = sm->next; + if ( sm->type==asm_insert ) { + for ( i=0; iclass_cnt*sm->state_cnt; ++i ) { + free( sm->state[i].u.insert.mark_ins ); + free( sm->state[i].u.insert.cur_ins ); + } + } else if ( sm->type==asm_kern ) { + for ( i=0; iclass_cnt*sm->state_cnt; ++i ) { + free( sm->state[i].u.kern.kerns ); + } + } + for ( i=4; iclass_cnt; ++i ) + free(sm->classes[i]); + free(sm->state); + free(sm->classes); + chunkfree(sm,sizeof(ASM)); + sm = next; + } +} + +void SplineFontFree(SplineFont *sf) { + int i; + BDFFont *bdf, *bnext; + + if ( sf==NULL ) +return; + if ( sf->mm!=NULL ) { + MMSetFree(sf->mm); +return; + } + PasteRemoveSFAnchors(sf); + for ( bdf = sf->bitmaps; bdf!=NULL; bdf = bnext ) { + bnext = bdf->next; + BDFFontFree(bdf); + } + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + SplineCharFree(sf->chars[i]); + free(sf->chars); + free(sf->fontname); + free(sf->fullname); + free(sf->familyname); + free(sf->weight); + free(sf->copyright); + free(sf->filename); + free(sf->origname); + free(sf->autosavename); + free(sf->version); + free(sf->xuid); + free(sf->cidregistry); + free(sf->ordering); + SplinePointListsFree(sf->grid.splines); + AnchorClassesFree(sf->anchor); + TableOrdersFree(sf->orders); + TtfTablesFree(sf->ttf_tables); + UndoesFree(sf->grid.undoes); + UndoesFree(sf->grid.redoes); + PSDictFree(sf->private); + TTFLangNamesFree(sf->names); + for ( i=0; isubfontcnt; ++i ) + SplineFontFree(sf->subfonts[i]); + free(sf->subfonts); + free(sf->remap); + GlyphHashFree(sf); + ScriptRecordListFree(sf->script_lang); + KernClassListFree(sf->kerns); + KernClassListFree(sf->vkerns); + FPSTFree(sf->possub); + ASMFree(sf->sm); + free(sf->gentags.tagtype); + free(sf); +} + +void MMSetFreeContents(MMSet *mm) { + int i; + + free(mm->instances); + + free(mm->positions); + free(mm->defweights); + + for ( i=0; iaxis_count; ++i ) { + free(mm->axes[i]); + free(mm->axismaps[i].blends); + free(mm->axismaps[i].designs); + } + free(mm->axismaps); + free(mm->cdv); + free(mm->ndv); +} + +void MMSetFree(MMSet *mm) { + int i; + + for ( i=0; iinstance_count; ++i ) { + mm->instances[i]->mm = NULL; + SplineFontFree(mm->instances[i]); + } + mm->normal->mm = NULL; + SplineFontFree(mm->normal); + MMSetFreeContents(mm); + + chunkfree(mm,sizeof(*mm)); +} diff --git a/fontforge/splineutil2.c b/fontforge/splineutil2.c new file mode 100644 index 00000000..fae7c27a --- /dev/null +++ b/fontforge/splineutil2.c @@ -0,0 +1,2800 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include "ustring.h" +#include "chardata.h" +#include +#include + +/*#define DEBUG 1*/ + +int RealNear(real a,real b) { + real d; + +#ifdef USE_DOUBLE + if ( a==0 ) +return( b>-1e-8 && b<1e-8 ); + if ( b==0 ) +return( a>-1e-8 && a<1e-8 ); + + d = a/(1024*1024.); + if ( d<0 ) d = -d; +return( b>a-d && b-1e-5 && b<1e-5 ); + if ( b==0 ) +return( a>-1e-5 && a<1e-5 ); + + d = a/(1024*64.); + if ( d<0 ) d = -d; +return( b>a-d && b-.001 ) +return( true ); +return( false ); +} + +int RealApprox(real a,real b) { + + if ( a==0 ) { + if ( b<.0001 && b>-.0001 ) +return( true ); + } else if ( b==0 ) { + if ( a<.0001 && a>-.0001 ) +return( true ); + } else { + a /= b; + if ( a>=.95 && a<=1.05 ) +return( true ); + } +return( false ); +} + +int RealWithin(real a,real b,real fudge) { + +return( b>=a-fudge && b<=a+fudge ); +} + +int SplineIsLinear(Spline *spline) { + double t1,t2; + int ret; + + if ( spline->knownlinear ) +return( true ); + if ( spline->knowncurved ) +return( false ); + + if ( spline->splines[0].a==0 && spline->splines[0].b==0 && + spline->splines[1].a==0 && spline->splines[1].b==0 ) +return( true ); + + /* Something is linear if the control points lie on the line between the */ + /* two base points */ + + /* Vertical lines */ + if ( RealNear(spline->from->me.x,spline->to->me.x) ) { + ret = RealNear(spline->from->me.x,spline->from->nextcp.x) && + RealNear(spline->from->me.x,spline->to->prevcp.x) && + ((spline->from->nextcp.y >= spline->from->me.y && + spline->from->nextcp.y <= spline->to->prevcp.y && + spline->to->prevcp.y <= spline->to->me.y ) || + (spline->from->nextcp.y <= spline->from->me.y && + spline->from->nextcp.y >= spline->to->prevcp.y && + spline->to->prevcp.y >= spline->to->me.y )); + /* Horizontal lines */ + } else if ( RealNear(spline->from->me.y,spline->to->me.y) ) { + ret = RealNear(spline->from->me.y,spline->from->nextcp.y) && + RealNear(spline->from->me.y,spline->to->prevcp.y) && + ((spline->from->nextcp.x >= spline->from->me.x && + spline->from->nextcp.x <= spline->to->prevcp.x && + spline->to->prevcp.x <= spline->to->me.x) || + (spline->from->nextcp.x <= spline->from->me.x && + spline->from->nextcp.x >= spline->to->prevcp.x && + spline->to->prevcp.x >= spline->to->me.x)); + } else { + ret = true; + t1 = (spline->from->nextcp.y-spline->from->me.y)/(spline->to->me.y-spline->from->me.y); + if ( t1<0 || t1>1.0 ) + ret = false; + else { + t2 = (spline->from->nextcp.x-spline->from->me.x)/(spline->to->me.x-spline->from->me.x); + if ( t2<0 || t2>1.0 ) + ret = false; + ret = RealApprox(t1,t2); + } + if ( ret ) { + t1 = (spline->to->me.y-spline->to->prevcp.y)/(spline->to->me.y-spline->from->me.y); + if ( t1<0 || t1>1.0 ) + ret = false; + else { + t2 = (spline->to->me.x-spline->to->prevcp.x)/(spline->to->me.x-spline->from->me.x); + if ( t2<0 || t2>1.0 ) + ret = false; + else + ret = RealApprox(t1,t2); + } + } + } + spline->knowncurved = !ret; + spline->knownlinear = ret; + if ( ret ) { + /* A few places that if the spline is knownlinear then its splines[?] */ + /* are linear. So give the linear version and not that suggested by */ + /* the control points */ + spline->splines[0].a = spline->splines[0].b = 0; + spline->splines[0].d = spline->from->me.x; + spline->splines[0].c = spline->to->me.x-spline->from->me.x; + spline->splines[1].a = spline->splines[1].b = 0; + spline->splines[1].d = spline->from->me.y; + spline->splines[1].c = spline->to->me.y-spline->from->me.y; + } +return( ret ); +} + +int SplineIsLinearMake(Spline *spline) { + + if ( spline->islinear ) +return( true ); + if ( SplineIsLinear(spline)) { + spline->islinear = spline->from->nonextcp = spline->to->noprevcp = true; + spline->from->nextcp = spline->from->me; + if ( spline->from->nonextcp && spline->from->noprevcp ) + spline->from->pointtype = pt_corner; + else if ( spline->from->pointtype == pt_curve ) + spline->from->pointtype = pt_tangent; + spline->to->prevcp = spline->to->me; + if ( spline->to->nonextcp && spline->to->noprevcp ) + spline->to->pointtype = pt_corner; + else if ( spline->to->pointtype == pt_curve ) + spline->to->pointtype = pt_tangent; + SplineRefigure(spline); + } +return( spline->islinear ); +} + +typedef struct spline1 { + Spline1D sp; + real s0, s1; + real c0, c1; +} Spline1; + +static void FigureSpline1(Spline1 *sp1,double t0, double t1, Spline1D *sp ) { + double s = (t1-t0); + if ( sp->a==0 && sp->b==0 ) { + sp1->sp.d = sp->d + t0*sp->c; + sp1->sp.c = s*sp->c; + sp1->sp.b = sp1->sp.a = 0; + } else { + sp1->sp.d = sp->d + t0*(sp->c + t0*(sp->b + t0*sp->a)); + sp1->sp.c = s*(sp->c + t0*(2*sp->b + 3*sp->a*t0)); + sp1->sp.b = s*s*(sp->b+3*sp->a*t0); + sp1->sp.a = s*s*s*sp->a; +#if 0 /* Got invoked once on a perfectly good spline */ + sp1->s1 = sp1->sp.a+sp1->sp.b+sp1->sp.c+sp1->sp.d; + if ( ((sp1->s1>.001 || sp1->s1<-.001) && !RealNear((double) sp1->sp.a+sp1->sp.b+sp1->sp.c+sp1->sp.d,sp1->s1)) || + !RealNear(sp1->sp.d,sp1->s0)) + GDrawIError( "Created spline does not work in FigureSpline1"); +#endif + } + sp1->c0 = sp1->sp.c/3 + sp1->sp.d; + sp1->c1 = sp1->c0 + (sp1->sp.b+sp1->sp.c)/3; +} + +SplinePoint *SplineBisect(Spline *spline, double t) { + Spline1 xstart, xend; + Spline1 ystart, yend; + Spline *spline1, *spline2; + SplinePoint *mid; + SplinePoint *old0, *old1; + Spline1D *xsp = &spline->splines[0], *ysp = &spline->splines[1]; + int order2 = spline->order2; + +#ifdef DEBUG + if ( t<=1e-3 || t>=1-1e-3 ) + GDrawIError("Bisection to create a zero length spline"); +#endif + xstart.s0 = xsp->d; ystart.s0 = ysp->d; + xend.s1 = (double) xsp->a+xsp->b+xsp->c+xsp->d; + yend.s1 = (double) ysp->a+ysp->b+ysp->c+ysp->d; + xstart.s1 = xend.s0 = ((xsp->a*t+xsp->b)*t+xsp->c)*t + xsp->d; + ystart.s1 = yend.s0 = ((ysp->a*t+ysp->b)*t+ysp->c)*t + ysp->d; + FigureSpline1(&xstart,0,t,xsp); + FigureSpline1(&xend,t,1,xsp); + FigureSpline1(&ystart,0,t,ysp); + FigureSpline1(¥d,t,1,ysp); + + mid = chunkalloc(sizeof(SplinePoint)); + mid->me.x = xstart.s1; mid->me.y = ystart.s1; + if ( order2 ) { + mid->nextcp.x = xend.sp.d + xend.sp.c/2; + mid->nextcp.y = yend.sp.d + yend.sp.c/2; + mid->prevcp.x = xstart.sp.d + xstart.sp.c/2; + mid->prevcp.y = ystart.sp.d + ystart.sp.c/2; + } else { + mid->nextcp.x = xend.c0; mid->nextcp.y = yend.c0; + mid->prevcp.x = xstart.c1; mid->prevcp.y = ystart.c1; + } + if ( mid->me.x==mid->nextcp.x && mid->me.y==mid->nextcp.y ) + mid->nonextcp = true; + if ( mid->me.x==mid->prevcp.x && mid->me.y==mid->prevcp.y ) + mid->noprevcp = true; + + old0 = spline->from; old1 = spline->to; + if ( order2 ) { + old0->nextcp = mid->prevcp; + old1->prevcp = mid->nextcp; + } else { + old0->nextcp.x = xstart.c0; old0->nextcp.y = ystart.c0; + old1->prevcp.x = xend.c1; old1->prevcp.y = yend.c1; + } + old0->nonextcp = (old0->nextcp.x==old0->me.x && old0->nextcp.y==old0->me.y); + old1->noprevcp = (old1->prevcp.x==old1->me.x && old1->prevcp.y==old1->me.y); + old0->nextcpdef = false; + old1->prevcpdef = false; + SplineFree(spline); + + spline1 = chunkalloc(sizeof(Spline)); + spline1->splines[0] = xstart.sp; spline1->splines[1] = ystart.sp; + spline1->from = old0; + spline1->to = mid; + spline1->order2 = order2; + old0->next = spline1; + mid->prev = spline1; + if ( SplineIsLinear(spline1)) { + spline1->islinear = spline1->from->nonextcp = spline1->to->noprevcp = true; + spline1->from->nextcp = spline1->from->me; + spline1->to->prevcp = spline1->to->me; + } + SplineRefigure(spline1); + + spline2 = chunkalloc(sizeof(Spline)); + spline2->splines[0] = xend.sp; spline2->splines[1] = xend.sp; + spline2->from = mid; + spline2->to = old1; + spline2->order2 = order2; + mid->next = spline2; + old1->prev = spline2; + if ( SplineIsLinear(spline2)) { + spline2->islinear = spline2->from->nonextcp = spline2->to->noprevcp = true; + spline2->from->nextcp = spline2->from->me; + spline2->to->prevcp = spline2->to->me; + } + SplineRefigure(spline2); +return( mid ); +} + +Spline *SplineSplit(Spline *spline, double ts[3]) { + /* Split the current spline in up to 3 places */ + Spline1 splines[2][4]; + int i,cnt; + double base; + SplinePoint *last, *sp; + Spline *new; + int order2 = spline->order2; + + memset(splines,0,sizeof(splines)); + base=0; + for ( i=cnt=0; i<3 && ts[i]!=-1; ++i ) { + if ( base>1-1e-3 ) /* Avoid tiny splines */ + break; + else if ( basesplines[0]); + FigureSpline1(&splines[1][cnt++],base,ts[i],&spline->splines[1]); + base = ts[i]; + } + } + if ( base==0 ) +return( spline ); + + FigureSpline1(&splines[0][cnt],base,1.0,&spline->splines[0]); + FigureSpline1(&splines[1][cnt],base,1.0,&spline->splines[1]); + + last = spline->from; + for ( i=0; i<=cnt; ++i ) { + if ( order2 ) { + last->nextcp.x = splines[0][i].sp.d+splines[0][i].sp.c/2; + last->nextcp.y = splines[1][i].sp.d+splines[1][i].sp.c/2; + } else { + last->nextcp.x = splines[0][i].c0; + last->nextcp.y = splines[1][i].c0; + } + if ( i==cnt ) + sp = spline->to; + else { + sp = chunkalloc(sizeof(SplinePoint)); + sp->me.x = splines[0][i+1].sp.d; + sp->me.y = splines[1][i+1].sp.d; + } + if ( order2 ) { + sp->prevcp = last->nextcp; + SplineMake2(last,sp); + } else { + sp->prevcp.x = splines[0][i].c1; + sp->prevcp.y = splines[1][i].c1; + SplineMake3(last,sp); + } + last = sp; + } + + new = spline->from->next; + SplineFree(spline); +return( new ); +} + +static Spline *IsLinearApprox(SplinePoint *from, SplinePoint *to, + TPoint *mid, int cnt) { + double vx, vy, slope; + int i; + + vx = to->me.x-from->me.x; vy = to->me.y-from->me.y; + if ( vx==0 && vy==0 ) { + for ( i=0; ime.x || mid[i].y != from->me.y ) +return( NULL ); + } else if ( fabs(vx)>fabs(vy) ) { + slope = vy/vx; + for ( i=0; ime.y+slope*(mid[i].x-from->me.x)) ) +return( NULL ); + } else { + slope = vx/vy; + for ( i=0; ime.x+slope*(mid[i].y-from->me.y)) ) +return( NULL ); + } + from->nonextcp = to->noprevcp = true; +return( SplineMake3(from,to) ); +} + +#if 0 +static void CleanupDir(BasePoint *newcp,BasePoint *oldcp,BasePoint *base) { + double orig, new; + orig = atan2(oldcp->y-base->y,oldcp->x-base->x); + new = atan2(newcp->y-base->y,newcp->x-base->x); + if ( !RealNearish(orig,new)) { + double c = cos(orig), s = sin(orig); + /*double len = sqrt((newcp->x-base->x)*(newcp->x-base->x) + (newcp->y-base->y)*(newcp->y-base->y));*/ + /* use dot product rather than length */ + double len; + if ( c<1e-6 && c>-1e-6 ) { c=0; if ( s<0 ) s=-1; else s=1; } + if ( s<1e-6 && s>-1e-6 ) { s=0; if ( c<0 ) c=-1; else c=1; } + len = (newcp->x-base->x)*c + (newcp->y-base->y)*s; + newcp->x = len*c; newcp->y = len*s; + if ( newcp->x*(oldcp->x-base->x) + newcp->y*(oldcp->y-base->y)<0 ) { + GDrawIError( "Control points in wrong direction" ); + newcp->x = -newcp->x; newcp->y = -newcp->y; + } + newcp->x += base->x; newcp->y += base->y; + } +} +#endif + +/* Least squares tells us that: + | S(xi*ti^3) | | S(ti^6) S(ti^5) S(ti^4) S(ti^3) | | a | + | S(xi*ti^2) | = | S(ti^5) S(ti^4) S(ti^3) S(ti^2) | * | b | + | S(xi*ti) | | S(ti^4) S(ti^3) S(ti^2) S(ti) | | c | + | S(xi) | | S(ti^3) S(ti^2) S(ti) n | | d | + and the definition of a spline tells us: + | x1 | = | 1 1 1 1 | * (a b c d) + | x0 | = | 0 0 0 1 | * (a b c d) +So we're a bit over specified. Let's use the last two lines of least squares +and the 2 from the spline defn. So d==x0. Now we've got three unknowns +and only three equations... + +For order2 splines we've got + | S(xi*ti^2) | | S(ti^4) S(ti^3) S(ti^2) | | b | + | S(xi*ti) | = | S(ti^3) S(ti^2) S(ti) | * | c | + | S(xi) | | S(ti^2) S(ti) n | | d | + and the definition of a spline tells us: + | x1 | = | 1 1 1 | * (b c d) + | x0 | = | 0 0 1 | * (b c d) +=> + d = x0 + b+c = x1-x0 + S(ti^2)*b + S(ti)*c = S(xi)-n*x0 + S(ti^2)*b + S(ti)*(x1-x0-b) = S(xi)-n*x0 + [ S(ti^2)-S(ti) ]*b = S(xi)-S(ti)*(x1-x0) - n*x0 +*/ +static int _ApproximateSplineFromPoints(SplinePoint *from, SplinePoint *to, + TPoint *mid, int cnt, BasePoint *nextcp, BasePoint *prevcp, + int order2) { + double tt, ttn; + int i, j, ret; + double vx[3], vy[3], m[3][3]; + double ts[7], xts[4], yts[4]; + BasePoint nres, pres; + int nrescnt=0, prescnt=0; + double nmin, nmax, pmin, pmax, test; + double bx, by, cx, cy; + + memset(&nres,0,sizeof(nres)); memset(&pres,0,sizeof(pres)); + + /* Add the initial and end points */ + ts[0] = 2; for ( i=1; i<7; ++i ) ts[i] = 1; + xts[0] = from->me.x+to->me.x; yts[0] = from->me.y+to->me.y; + xts[3] = xts[2] = xts[1] = to->me.x; yts[3] = yts[2] = yts[1] = to->me.y; + nmin = pmin = 0; nmax = pmax = (to->me.x-from->me.x)*(to->me.x-from->me.x)+(to->me.y-from->me.y)*(to->me.y-from->me.y); + for ( i=0; ime.x)*(to->me.x-from->me.x) + (mid[i].y-from->me.y)*(to->me.y-from->me.y); + if ( testnmax ) nmax=test; + test = (mid[i].x-to->me.x)*(from->me.x-to->me.x) + (mid[i].y-to->me.y)*(from->me.y-to->me.y); + if ( testpmax ) pmax=test; + } + pmin *= 1.2; pmax *= 1.2; nmin *= 1.2; nmax *= 1.2; + + for ( j=0; j<3; ++j ) { + if ( order2 ) { + if ( RealNear(ts[j+2],ts[j+1]) ) + continue; + /* This produces really bad results!!!! But I don't see what I can do to improve it */ + bx = (xts[j]-ts[j+1]*(to->me.x-from->me.x) - ts[j]*from->me.x) / (ts[j+2]-ts[j+1]); + by = (yts[j]-ts[j+1]*(to->me.y-from->me.y) - ts[j]*from->me.y) / (ts[j+2]-ts[j+1]); + cx = to->me.x-from->me.x-bx; + cy = to->me.y-from->me.y-by; + + nextcp->x = from->me.x + cx/2; + nextcp->y = from->me.y + cy/2; + *prevcp = *nextcp; + } else { + vx[0] = xts[j+1]-ts[j+1]*from->me.x; + vx[1] = xts[j]-ts[j]*from->me.x; + vx[2] = to->me.x-from->me.x; /* always use the defn of spline */ + + vy[0] = yts[j+1]-ts[j+1]*from->me.y; + vy[1] = yts[j]-ts[j]*from->me.y; + vy[2] = to->me.y-from->me.y; + + m[0][0] = ts[j+4]; m[0][1] = ts[j+3]; m[0][2] = ts[j+2]; + m[1][0] = ts[j+3]; m[1][1] = ts[j+2]; m[1][2] = ts[j+1]; + m[2][0] = 1; m[2][1] = 1; m[2][2] = 1; + + /* Remove a terms from rows 0 and 1 */ + vx[0] -= ts[j+4]*vx[2]; + vy[0] -= ts[j+4]*vy[2]; + m[0][0] = 0; m[0][1] -= ts[j+4]; m[0][2] -= ts[j+4]; + vx[1] -= ts[j+3]*vx[2]; + vy[1] -= ts[j+3]*vy[2]; + m[1][0] = 0; m[1][1] -= ts[j+3]; m[1][2] -= ts[j+3]; + + if ( fabs(m[1][1])x = from->me.x + vx[0]/3; + nextcp->y = from->me.y + vy[0]/3; + prevcp->x = nextcp->x + (vx[0]+vx[1])/3; + prevcp->y = nextcp->y + (vy[0]+vy[1])/3; + } + + test = (nextcp->x-from->me.x)*(to->me.x-from->me.x) + + (nextcp->y-from->me.y)*(to->me.y-from->me.y); + if ( test>=nmin && test<=nmax ) { + nres.x += nextcp->x; nres.y += nextcp->y; + ++nrescnt; + } + test = (prevcp->x-to->me.x)*(from->me.x-to->me.x) + + (prevcp->y-to->me.y)*(from->me.y-to->me.y); + if ( test>=pmin && test<=pmax ) { + pres.x += prevcp->x; pres.y += prevcp->y; + ++prescnt; + } + if ( nrescnt==1 && prescnt==1 ) + break; + } + + ret = 0; + if ( nrescnt>0 ) { + ret |= 1; + nextcp->x = nres.x/nrescnt; + nextcp->y = nres.y/nrescnt; + } else + *nextcp = from->nextcp; + if ( prescnt>0 ) { + ret |= 2; + prevcp->x = pres.x/prescnt; + prevcp->y = pres.y/prescnt; + } else + *prevcp = to->prevcp; +return( ret ); +} + +/* Find a spline which best approximates the list of intermediate points we */ +/* are given. No attempt is made to fix the slopes */ +Spline *ApproximateSplineFromPoints(SplinePoint *from, SplinePoint *to, + TPoint *mid, int cnt, int order2) { + int ret; + Spline *spline; + BasePoint nextcp, prevcp; + + if ( (spline = IsLinearApprox(from,to,mid,cnt))!=NULL ) +return( spline ); + + ret = _ApproximateSplineFromPoints(from,to,mid,cnt,&nextcp,&prevcp,order2); + + if ( ret&1 ) { + from->nextcp = nextcp; + from->nonextcp = false; + } else { + from->nextcp = from->me; + from->nonextcp = true; + } + if ( ret&2 ) { + to->prevcp = prevcp; + to->noprevcp = false; + } else { + to->prevcp = to->me; + to->noprevcp = true; + } + spline = SplineMake3(from,to); + if ( SplineIsLinear(spline)) { + spline->islinear = from->nonextcp = to->noprevcp = true; + spline->from->nextcp = spline->from->me; + spline->to->prevcp = spline->to->me; + SplineRefigure(spline); + } +return( spline ); +} + +static double ClosestSplineSolve(Spline1D *sp,double sought,double close_to_t) { + /* We want to find t so that spline(t) = sought */ + /* find the value which is closest to close_to_t */ + /* on error return closetot */ + Spline1D temp; + double ts[3]; + int i; + double t, best, test; + + temp = *sp; + temp.d -= sought; + CubicSolve(&temp,ts); + best = 9e20; t= close_to_t; + for ( i=0; i<3; ++i ) if ( ts[i]!=-1 ) { + if ( (test=ts[i]-close_to_t)<0 ) test = -test; + if ( testnonextcp && ( from->nextcp.x==from->me.x || from->nextcp.y==from->me.y)) || + (!to->noprevcp && ( to->prevcp.x==to->me.x || to->prevcp.y==to->me.y)) ) + /* Preserve the slope */; + else if ( ((from->pointtype == pt_corner && from->nonextcp) || + (from->pointtype == pt_tangent && + ((from->nonextcp && from->noprevcp) || !from->noprevcp))) && + ((to->pointtype == pt_corner && to->noprevcp) || + (to->pointtype == pt_tangent && + ((to->nonextcp && to->noprevcp) || !to->nonextcp))) ) { + from->pointtype = to->pointtype = pt_corner; +return( ApproximateSplineFromPoints(from,to,mid,cnt,order2) ); + } + + /* If we are going to honour the slopes of a quadratic spline, there is */ + /* only one possibility */ + if ( order2 ) { + if ( from->nonextcp || to->noprevcp || + !IntersectLines(&nextcp,&from->nextcp,&from->me,&to->prevcp,&to->me) ) { + from->nonextcp = to->noprevcp = true; + from->nextcp = from->me; + to->prevcp = to->me; + } else { + /* If the slopes don't intersect then use a line */ + from->nextcp = to->prevcp = nextcp; + } +return( SplineMake2(from,to)); + } + + tounit.x = to->prevcp.x-to->me.x; tounit.y = to->prevcp.y-to->me.y; + tlen = sqrt(tounit.x*tounit.x + tounit.y*tounit.y); + fromunit.x = from->nextcp.x-from->me.x; fromunit.y = from->nextcp.y-from->me.y; + flen = sqrt(fromunit.x*fromunit.x + fromunit.y*fromunit.y); + if ( tlen==0 || flen==0 ) { + if ( from->next!=NULL ) + temp = *from->next; + else { + memset(&temp,0,sizeof(temp)); + temp.from = from; temp.to = to; + SplineRefigure(&temp); + from->next = to->prev = NULL; + } + } + if ( tlen==0 ) { + if ( to->pointtype==pt_curve && to->next && !to->nonextcp ) { + tounit.x = to->me.x-to->nextcp.x; tounit.y = to->me.y-to->nextcp.y; + } else { + tounit.x = -( (3*temp.splines[0].a*.9999+2*temp.splines[0].b)*.9999+temp.splines[0].c ); + tounit.y = -( (3*temp.splines[1].a*.9999+2*temp.splines[1].b)*.9999+temp.splines[1].c ); + } + tlen = sqrt(tounit.x*tounit.x + tounit.y*tounit.y); + } + tounit.x /= tlen; tounit.y /= tlen; + + if ( flen==0 ) { + if ( from->pointtype==pt_curve && from->prev && !from->noprevcp ) { + fromunit.x = from->me.x-from->prevcp.x; fromunit.y = from->me.y-from->prevcp.y; + } else { + fromunit.x = -( (3*temp.splines[0].a*.0001+2*temp.splines[0].b)*.0001+temp.splines[0].c ); + fromunit.y = -( (3*temp.splines[1].a*.0001+2*temp.splines[1].b)*.0001+temp.splines[1].c ); + } + flen = sqrt(fromunit.x*fromunit.x + fromunit.y*fromunit.y); + } + fromunit.x /= flen; fromunit.y /= flen; + + spline = ApproximateSplineFromPoints(from,to,mid,cnt,order2); + prevcp = to->prevcp; nextcp = to->nextcp; + + /* Hack to preserve some kind of slope here */ + if ( from->nonextcp && flen!=0 ) { + from->nextcp.x += fromunit.x * flen/10.0; + from->nextcp.y += fromunit.y * flen/10.0; + from->nonextcp = false; + } + if ( to->noprevcp && flen!=0 ) { + to->prevcp.x += tounit.x * tlen/10.0; + to->prevcp.y += tounit.y * tlen/10.0; + to->noprevcp = false; + } + + tlen = (to->prevcp.x-to->me.x)*tounit.x + (to->prevcp.y-to->me.y)*tounit.y; + flen = (from->nextcp.x-from->me.x)*fromunit.x + (from->nextcp.y-from->me.y)*fromunit.y; + f2len = (to->prevcp.x-to->me.x-tlen*tounit.x)*fromunit.x + + (to->prevcp.y-to->me.y-tlen*tounit.y)*fromunit.y; + t2len = (from->nextcp.x-from->me.x-flen*fromunit.x)*tounit.x + + (from->nextcp.y-from->me.y-flen*fromunit.y)*tounit.y; + tlen += t2len; flen += f2len; + + to->prevcp.x = to->me.x + tlen*tounit.x; to->prevcp.y = to->me.y + tlen*tounit.y; + len = (from->nextcp.x-from->me.x)*fromunit.x + (from->nextcp.y-from->me.y)*fromunit.y; + from->nextcp.x = from->me.x + len*fromunit.x; from->nextcp.y = from->me.y + len*fromunit.y; + SplineRefigure(spline); + + if ( (xdiff = to->me.x-from->me.x)<0 ) xdiff = -xdiff; + if ( (ydiff = to->me.y-from->me.y)<0 ) ydiff = -ydiff; + + for ( i=0; i2*xdiff ) { + t = ClosestSplineSolve(&spline->splines[1],mid[i].y,mid[i].t); + } else if ( xdiff>2*ydiff ) { + t = ClosestSplineSolve(&spline->splines[0],mid[i].x,mid[i].t); + } else { + t = (ClosestSplineSolve(&spline->splines[1],mid[i].y,mid[i].t) + + ClosestSplineSolve(&spline->splines[0],mid[i].x,mid[i].t))/2; + } + mid[i].t = t; + mid[i].x -= ((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t + spline->splines[0].d; + mid[i].y -= ((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t + spline->splines[1].d; + } + + memset(&ff,0,sizeof(ff)); memset(&ft,0,sizeof(ft)); + _ApproximateSplineFromPoints(&ff,&ft,mid,cnt,&nextcp,&prevcp,order2); + + len = prevcp.x*tounit.x + prevcp.y*tounit.y; + to->prevcp.x += len*tounit.x; to->prevcp.y += len*tounit.y; + len = nextcp.x*fromunit.x + nextcp.y*fromunit.y; + from->nextcp.x += len*fromunit.x; from->nextcp.y += len*fromunit.y; + SplineRefigure(spline); +return( spline ); +} + + /* calculating the actual length of a spline is hard, this gives a very */ + /* rough (but quick) approximation */ +static double SplineLenApprox(Spline *spline) { + double len, slen, temp; + + if ( (temp = spline->to->me.x-spline->from->me.x)<0 ) temp = -temp; + len = temp; + if ( (temp = spline->to->me.y-spline->from->me.y)<0 ) temp = -temp; + len += temp; + if ( !spline->to->noprevcp || !spline->from->nonextcp ) { + if ( (temp = spline->from->nextcp.x-spline->from->me.x)<0 ) temp = -temp; + slen = temp; + if ( (temp = spline->from->nextcp.y-spline->from->me.y)<0 ) temp = -temp; + slen += temp; + if ( (temp = spline->to->prevcp.x-spline->from->nextcp.x)<0 ) temp = -temp; + slen += temp; + if ( (temp = spline->to->prevcp.y-spline->from->nextcp.y)<0 ) temp = -temp; + slen += temp; + if ( (temp = spline->to->me.x-spline->to->prevcp.x)<0 ) temp = -temp; + slen += temp; + if ( (temp = spline->to->me.y-spline->to->prevcp.y)<0 ) temp = -temp; + slen += temp; + len = (len + slen)/2; + } +return( len ); +} + +double SplineLength(Spline *spline) { + /* I ignore the constant term. It's just an unneeded addition */ + double len, t; + double lastx = 0, lasty = 0; + double curx, cury; + + len = 0; + for ( t=1.0/128; t<=1.0001 ; t+=1.0/128 ) { + curx = ((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t; + cury = ((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t; + len += sqrt( (curx-lastx)*(curx-lastx) + (cury-lasty)*(cury-lasty) ); + lastx = curx; lasty = cury; + } +return( len ); +} + +static TPoint *SplinesFigureTPsBetween(SplinePoint *from, SplinePoint *to, + int *tot) { + int cnt, i, j; + double len, slen, lbase; + SplinePoint *np; + TPoint *tp; + + cnt = 0; len = 0; + for ( np = from->next->to; ; np = np->next->to ) { + ++cnt; + len += SplineLenApprox(np->prev); + if ( np==to ) + break; + } + +#if 0 + extras = fcp = tcp = 0; + if ( from->pointtype!=pt_corner && !from->nonextcp ) { + extras += 4*cnt; + fcp = 1; + } + if ( to->pointtype!=pt_corner && !to->noprevcp ) { + extras += 4*cnt; + tcp = 1; + } + tp = galloc((4*(cnt+1)+extras)*sizeof(TPoint)); i = 0; +#endif + + tp = galloc(10*(cnt+1)*sizeof(TPoint)); i = 0; + if ( len==0 ) { + for ( ; i<=10*cnt; ++i ) { + tp[i].t = i/(10.0*cnt); + tp[i].x = from->me.x; + tp[i].y = from->me.y; + } + } else { + lbase = 0; + for ( np = from->next->to; ; np = np->next->to ) { + slen = SplineLenApprox(np->prev); + for ( j=0; j<10; ++j ) { + double t = j/10.0; + tp[i].t = (lbase+ t*slen)/len; + tp[i].x = ((np->prev->splines[0].a*t+np->prev->splines[0].b)*t+np->prev->splines[0].c)*t + np->prev->splines[0].d; + tp[i++].y = ((np->prev->splines[1].a*t+np->prev->splines[1].b)*t+np->prev->splines[1].c)*t + np->prev->splines[1].d; + } + lbase += slen; + if ( np==to ) + break; + } + } + +#if 0 + /* for curved and tangent points we need the slope at the end points to */ + /* be the same as it was before. So we add a point near the start of the */ + /* from spline and weight it heavily */ + if ( fcp ) { + np = from->next->to; + temp = (np->me.x-np->prev->from->me.x); + if ( temp<0 ) temp = -temp; + slen = temp; + temp = (np->me.y-np->prev->from->me.y); + if ( temp<0 ) temp = -temp; + slen += temp; + t = .05; + tp[i].t = (t*slen)/len; + tp[i].x = ((np->prev->splines[0].a*t+np->prev->splines[0].b)*t+np->prev->splines[0].c)*t + np->prev->splines[0].d; + tp[i].y = ((np->prev->splines[1].a*t+np->prev->splines[1].b)*t+np->prev->splines[1].c)*t + np->prev->splines[1].d; + for ( j=1; j<4*cnt; ++j ) + tp[i+j] = tp[i]; + i += j; + } + if ( tcp ) { + np = to; + temp = (np->me.x-np->prev->from->me.x); + if ( temp<0 ) temp = -temp; + slen = temp; + temp = (np->me.y-np->prev->from->me.y); + if ( temp<0 ) temp = -temp; + slen += temp; + t = .95; + tp[i].t = (t*slen)/len; + tp[i].x = ((np->prev->splines[0].a*t+np->prev->splines[0].b)*t+np->prev->splines[0].c)*t + np->prev->splines[0].d; + tp[i].y = ((np->prev->splines[1].a*t+np->prev->splines[1].b)*t+np->prev->splines[1].c)*t + np->prev->splines[1].d; + for ( j=1; j<4*cnt; ++j ) + tp[i+j] = tp[i]; + i += j; + } +#endif + *tot = i; + +return( tp ); +} + +static void FixupCurveTanPoints(SplinePoint *from,SplinePoint *to, + BasePoint *fncp, BasePoint *tpcp) { + + /* if the control points don't match the point types then change the */ + /* point types. I used to try changing the point types, but the results */ + /* weren't good */ + if ( from->pointtype!=pt_corner && !from->nonextcp ) { + fncp->x -= from->me.x; fncp->y -= from->me.y; + if ( fncp->x==0 && fncp->y==0 ) { + if ( from->pointtype == pt_tangent && from->prev!=NULL ) { + fncp->x = from->me.x-from->prev->from->me.x; + fncp->y = from->me.y-from->prev->from->me.y; + } else if ( from->pointtype == pt_curve && !from->noprevcp ) { + fncp->x = from->me.x-from->prevcp.x; + fncp->y = from->me.y-from->prevcp.y; + } + } + if ( fncp->x!=0 || fncp->y!=0 ) { + if ( !RealNear(atan2(fncp->y,fncp->x), + atan2(from->nextcp.y-from->me.y,from->nextcp.x-from->me.x)) ) + from->pointtype = pt_corner; + } + } + if ( to->pointtype!=pt_corner && !to->noprevcp ) { + tpcp->x -= to->me.x; tpcp->y -= to->me.y; + if ( tpcp->x==0 && tpcp->y==0 ) { + if ( to->pointtype == pt_tangent && to->next!=NULL ) { + tpcp->x = to->me.x-to->next->to->me.x; + tpcp->y = to->me.y-to->next->to->me.y; + } else if ( to->pointtype == pt_curve && !to->nonextcp ) { + tpcp->x = to->me.x-to->nextcp.x; + tpcp->y = to->me.y-to->nextcp.y; + } + } + if ( tpcp->x!=0 || tpcp->y!=0 ) { + if ( !RealNear(atan2(tpcp->y,tpcp->x), + atan2(to->prevcp.y-to->me.y,to->prevcp.x-to->me.x)) ) + to->pointtype = pt_corner; + } + } + if ( from->pointtype==pt_tangent ) + SplineCharTangentPrevCP(from); + if ( to->pointtype==pt_tangent ) + SplineCharTangentNextCP(to); +} + +static void SplinesRemoveBetween(SplineChar *sc, SplinePoint *from, SplinePoint *to,int type) { + int tot; + TPoint *tp; + SplinePoint *np, oldfrom; + Spline *sp; + BasePoint fncp, tpcp; + int order2 = from->next->order2; + + oldfrom = *from; + tp = SplinesFigureTPsBetween(from,to,&tot); + fncp = from->nextcp; tpcp = to->prevcp; + + if ( type==1 ) + ApproximateSplineFromPointsSlopes(from,to,tp,tot-1,order2); + else + ApproximateSplineFromPoints(from,to,tp,tot-1,order2); + + /* Have to do the frees after the approximation because the approx */ + /* uses the splines to determine slopes */ + for ( sp = oldfrom.next; ; ) { + np = sp->to; + SplineFree(sp); + if ( np==to ) + break; + sp = np->next; + SplinePointMDFree(sc,np); + } + if ( type==0 && !order2 ) + FixupCurveTanPoints(from,to,&fncp,&tpcp); + free(tp); + + SplinePointCatagorize(from); + SplinePointCatagorize(to); +} + +static void RemoveZeroLengthSplines(SplineSet *spl, int onlyselected) { + SplinePoint *curp, *next, *prev; + + for ( curp = spl->first, prev=NULL; curp!=NULL ; curp=next ) { + next = NULL; + if ( curp->next!=NULL ) + next = curp->next->to; + if ( curp==next ) /* Once we've worked a contour down to a single point we can't do anything more here. Someone else will have to free the contour */ +return; + /* Zero length splines give us NaNs */ + if ( curp!=NULL && (curp->selected || !onlyselected) && + ((curp->prev!=NULL && curp->me.x==curp->prev->from->me.x && curp->me.y==curp->prev->from->me.y ) || + (curp->next!=NULL && curp->me.x==curp->next->to->me.x && curp->me.y==curp->next->to->me.y ))) { + if ( curp->prev!=NULL && curp->me.x==curp->prev->from->me.x && curp->me.y==curp->prev->from->me.y ) { + SplinePoint *other = curp->prev->from; + other->nextcp = curp->nextcp; + other->nonextcp = curp->nonextcp; + other->nextcpdef = curp->nextcpdef; + other->next = curp->next; + if ( curp->next!=NULL ) other->next->from = other; + SplineFree(curp->prev); + } else { + SplinePoint *other = next; + other->prevcp = curp->prevcp; + other->noprevcp = curp->noprevcp; + other->prevcpdef = curp->prevcpdef; + other->prev = curp->prev; + if ( curp->prev!=NULL ) other->prev->to = other; + SplineFree(curp->next); + } + SplinePointFree(curp); + if ( spl->first==curp ) { + spl->first = next; + if ( spl->last==curp ) + spl->last = next; + } else if ( spl->last==curp ) + spl->last = prev; + } else + prev = curp; + if ( next==spl->first ) + break; + } +} + +SplineSet *SSRemoveZeroLengthSplines(SplineSet *base) { + SplineSet *spl, *prev, *next; + + for ( prev = NULL, spl=base; spl!=NULL; spl=next ) { + next = spl->next; + if ( spl->first->next!=NULL && spl->first->next->to==spl->first && + spl->first->nonextcp && spl->first->noprevcp ) { + if ( prev==NULL ) + base = next; + else + prev->next = next; + spl->next = NULL; + SplinePointListFree(spl); + } else { + RemoveZeroLengthSplines(spl,false); + prev = spl; + } + } +return( base ); +} + +static SplinePointList *SplinePointListMerge(SplineChar *sc, SplinePointList *spl,int type) { + Spline *spline, *first; + SplinePoint *nextp, *curp, *selectme; + int all; + + /* If the entire splineset is selected, it should merge into oblivion */ + first = NULL; + all = spl->first->selected; + for ( spline = spl->first->next; spline!=NULL && spline!=first && all; spline=spline->to->next ) { + if ( !spline->to->selected ) all = false; + if ( first==NULL ) first = spline; + } + if ( spl->first->next!=NULL && spl->first->next->to==spl->first && + spl->first->nonextcp && spl->first->noprevcp ) + all = true; /* Merge away any splines which are just dots */ + if ( all ) +return( NULL ); /* Some one else should free it and reorder the spline set list */ + RemoveZeroLengthSplines(spl,true); + + if ( spl->first!=spl->last ) { + /* If the spline isn't closed, then any selected points at the ends */ + /* get deleted */ + while ( spl->first->selected ) { + nextp = spl->first->next->to; + SplineFree(spl->first->next); + SplinePointMDFree(sc,spl->first); + spl->first = nextp; + nextp->prev = NULL; + } + while ( spl->last->selected ) { + nextp = spl->last->prev->from; + SplineFree(spl->last->prev); + SplinePointMDFree(sc,spl->last); + spl->last = nextp; + nextp->next = NULL; + } + } else { + while ( spl->first->selected ) { + spl->first = spl->first->next->to; + spl->last = spl->first; + } + } + + /* when we get here spl->first is not selected */ + if ( spl->first->selected ) GDrawIError( "spl->first is selected in SplinePointListMerge"); + curp = spl->first; + selectme = NULL; + while ( 1 ) { + while ( !curp->selected ) { + if ( curp->next==NULL ) + curp = NULL; + else + curp = curp->next->to; + if ( curp==spl->first || curp==NULL ) + break; + } + if ( curp==NULL || !curp->selected ) + break; + for ( nextp=curp->next->to; nextp->selected; nextp = nextp->next->to ); + /* we don't need to check for the end of the splineset here because */ + /* we know that spl->last is not selected */ + SplinesRemoveBetween(sc,curp->prev->from,nextp,type); + curp = nextp; + selectme = nextp; + } + if ( selectme!=NULL ) selectme->selected = true; +return( spl ); +} + +void SplineCharMerge(SplineChar *sc,SplineSet **head,int type) { + SplineSet *spl, *prev=NULL, *next; + + for ( spl = *head; spl!=NULL; spl = next ) { + next = spl->next; + if ( SplinePointListMerge(sc,spl,type)==NULL ) { + if ( prev==NULL ) + *head = next; + else + prev->next = next; + chunkfree(spl,sizeof(*spl)); + } else + prev = spl; + } +} + +/* Almost exactly the same as SplinesRemoveBetween, but this one is conditional */ +/* the intermediate points/splines are removed only if we have a good match */ +/* used for simplify */ +static int SplinesRemoveBetweenMaybe(SplineChar *sc, + SplinePoint *from, SplinePoint *to, int flags, double err) { + int i,tot; + SplinePoint *afterfrom, *sp, *next; + TPoint *tp, *tp2; + BasePoint test; + int good; + BasePoint fncp, tpcp, fncp2, tpcp2; + int fpt, tpt; + int order2 = from->next->order2; + + afterfrom = from->next->to; + fncp = from->nextcp; tpcp = to->prevcp; + fpt = from->pointtype; tpt = to->pointtype; + + if ( afterfrom==to || from==to ) +return( false ); + + tp = SplinesFigureTPsBetween(from,to,&tot); + tp2 = galloc((tot+1)*sizeof(TPoint)); + memcpy(tp2,tp,tot*sizeof(TPoint)); + + if ( !(flags&sf_ignoreslopes) ) + ApproximateSplineFromPointsSlopes(from,to,tp,tot-1,order2); + else { + ApproximateSplineFromPoints(from,to,tp,tot-1,order2); + FixupCurveTanPoints(from,to,&fncp2,&tpcp2); + } + + i = tot; + + good = true; + while ( --i>0 && good ) { + /* tp[0] is the same as from (easier to include it), but the SplineNear*/ + /* routine will sometimes reject the end-points of the spline */ + /* so just don't check it */ + test.x = tp2[i].x; test.y = tp2[i].y; + good = SplineNearPoint(from->next,&test,err)!= -1; + } + + free(tp); + free(tp2); + if ( good ) { + SplineFree(afterfrom->prev); + for ( sp=afterfrom; sp!=to; sp=next ) { + next = sp->next->to; + SplineFree(sp->next); + SplinePointMDFree(sc,sp); + } + SplinePointCatagorize(from); + SplinePointCatagorize(to); + } else { + SplineFree(from->next); + from->next = afterfrom->prev; + from->nextcp = fncp; + from->nonextcp = ( fncp.x==from->me.x && fncp.y==from->me.y); + from->pointtype = fpt; + for ( sp=afterfrom; sp->next->to!=to; sp=sp->next->to ); + to->prev = sp->next; + to->prevcp = tpcp; + to->noprevcp = ( tpcp.x==to->me.x && tpcp.y==to->me.y); + to->pointtype = tpt; + } +return( good ); +} + +/* A wrapper to the previous routine to handle some extra checking for a */ +/* common case */ +static int SplinesRemoveMidMaybe(SplineChar *sc,SplinePoint *mid, int flags, double err) { + SplinePoint *from, *to; + BasePoint fncp, tpcp, fncp2, tpcp2; + int fpt, tpt; + + if ( mid->prev==NULL || mid->next==NULL ) +return( false ); + + from = mid->prev->from; to = mid->next->to; + + /* Retain points which are horizontal or vertical, because postscript says*/ + /* type1 fonts should always have a point at the extrema (except for small*/ + /* things like serifs), and the extrema occur at horizontal/vertical points*/ + if ( flags&sf_ignoreextremum ) + /* Don't treat exterma specially, can remove them too */; + else if ( (!mid->nonextcp && (mid->nextcp.x==mid->me.x || mid->nextcp.y==mid->me.y)) || + (!mid->noprevcp && (mid->prevcp.x==mid->me.x || mid->prevcp.y==mid->me.y)) ) { + double x=mid->me.x, y=mid->me.y; + if (( mid->nextcp.x==x && mid->prevcp.x==x && + to->me.x==x && to->prevcp.x==x && + from->me.x==x && from->nextcp.x==x ) || + ( mid->nextcp.y==y && mid->prevcp.y==y && + to->me.y==y && to->prevcp.y==y && + from->me.y==y && from->nextcp.y==y )) + /* On the other hand a point in the middle of a straight */ + /* horizontal/vertical line may still be removed with impunity */ + ; + else +return( false ); + } + + fncp2 = fncp = from->nextcp; tpcp2 = tpcp = to->prevcp; + fpt = from->pointtype; tpt = to->pointtype; + + /* if from or to is a tangent then we can only remove mid if it's on the */ + /* line between them */ + if (( from->pointtype==pt_tangent && !from->noprevcp) || + ( to->pointtype==pt_tangent && !to->nonextcp)) { + if ( from->me.x==to->me.x ) { + if ( mid->me.x!=to->me.x ) +return( false ); + } else if ( !RealNear((from->me.y-to->me.y)/(from->me.x-to->me.x), + (mid->me.y-to->me.y)/(mid->me.x-to->me.x)) ) +return( false ); + } +return ( SplinesRemoveBetweenMaybe(sc,from,to,flags,err)); +} + +static void SPLForceLines(SplineChar *sc,SplineSet *ss,double bump_size) { + Spline *s, *first=NULL; + SplinePoint *sp; + int any; + BasePoint unit; + double len, minlen = (sc->parent->ascent+sc->parent->descent)/20.0; + double diff, xoff, yoff, len2; + + for ( s = ss->first->next; s!=NULL && s!=first; s=s->to->next ) { + if ( first==NULL ) first = s; + if ( s->knownlinear ) { + unit.x = s->to->me.x-s->from->me.x; + unit.y = s->to->me.y-s->from->me.y; + len = sqrt(unit.x*unit.x + unit.y*unit.y); + if ( lenfrom->prev!=NULL ) { + sp = s->from->prev->from; + len2 = sqrt((sp->me.x-s->from->me.x)*(sp->me.x-s->from->me.x) + (sp->me.y-s->from->me.y)*(sp->me.y-s->from->me.y)); + diff = (sp->me.x-s->from->me.x)*unit.y - (sp->me.y-s->from->me.y)*unit.x; + if ( len2me.x -= xoff; sp->me.y -= yoff; + sp->prevcp.x -= xoff; sp->prevcp.y -= yoff; + sp->nextcp = sp->me; sp->nonextcp = true; + if ( sp->next==first ) first = NULL; + SplineFree(sp->next); + if ( s->from==ss->first ) { + if ( ss->first==ss->last ) ss->last = sp; + ss->first = sp; + } + SplinePointMDFree(sc,s->from); + sp->next = s; s->from = sp; + SplineRefigure(s); + if ( sp->prev!=NULL ) + SplineRefigure(sp->prev); + sp->pointtype = pt_corner; + any = true; + } + } + if ( s->to->next!=NULL ) { + sp = s->to->next->to; + /* If the next spline is a longer line than we are, then don't */ + /* merge it to us, rather merge us into it next time through the loop */ + /* Hmm. Don't merge out the bump in general if the "bump" is longer than we are */ + len2 = sqrt((sp->me.x-s->to->me.x)*(sp->me.x-s->to->me.x) + (sp->me.y-s->to->me.y)*(sp->me.y-s->to->me.y)); + diff = (sp->me.x-s->to->me.x)*unit.y - (sp->me.y-s->to->me.y)*unit.x; + if ( len2me.x -= xoff; sp->me.y -= yoff; + sp->nextcp.x -= xoff; sp->nextcp.y -= yoff; + sp->prevcp = sp->me; sp->noprevcp = true; + if ( sp->prev==first ) first = NULL; + SplineFree(sp->prev); + if ( s->to==ss->last ) { + if ( ss->first==ss->last ) ss->first = sp; + ss->last = sp; + } + SplinePointMDFree(sc,s->to); + sp->prev = s; s->to = sp; + SplineRefigure(s); + if ( sp->next!=NULL ) + SplineRefigure(sp->next); + sp->pointtype = pt_corner; + any = true; + } + } + } while ( any ); + } + } +} + +static int SPLSmoothControlPoints(SplineSet *ss,double tan_bounds,int vert_check) { + SplinePoint *sp; + /* If a point has control points, and if those cps are in nearly the same */ + /* direction (within tan_bounds) then adjust them so that they are in the*/ + /* same direction */ + BasePoint unit, unit2; + double len, len2, para, norm, tn; + int changed=false, found; + + for ( sp = ss->first; ; ) { + if (( !sp->nonextcp && !sp->noprevcp && sp->pointtype==pt_corner ) || + ((sp->pointtype==pt_corner || sp->pointtype==pt_curve) && + (( !sp->nonextcp && sp->noprevcp && sp->prev!=NULL && sp->prev->knownlinear ) || + ( !sp->noprevcp && sp->nonextcp && sp->next!=NULL && sp->next->knownlinear )))) { + BasePoint *next = sp->nonextcp ? &sp->next->to->me : &sp->nextcp; + BasePoint *prev = sp->noprevcp ? &sp->prev->to->me : &sp->prevcp; + unit.x = next->x-sp->me.x; + unit.y = next->y-sp->me.y; + len = sqrt(unit.x*unit.x + unit.y*unit.y); + unit.x /= len; unit.y /= len; + para = (sp->me.x-prev->x)*unit.x + (sp->me.y-prev->y)*unit.y; + norm = (sp->me.x-prev->x)*unit.y - (sp->me.y-prev->y)*unit.x; + if ( para==0 ) + tn = 1000; + else + tn = norm/para; + if ( tn<0 ) tn = -tn; + if ( tn0 ) { + found = 0; + unit2.x = sp->me.x-sp->prevcp.x; + unit2.y = sp->me.y-sp->prevcp.y; + len2 = sqrt(unit2.x*unit2.x + unit2.y*unit2.y); + unit2.x /= len2; unit2.y /= len2; + if ( vert_check ) { + if ( fabs(unit.x)>fabs(unit.y) ) { + /* Closer to horizontal */ + if ( (unit.y<=0 && unit2.y>=0) || (unit.y>=0 && unit2.y<=0) ) { + unit2.x = unit2.x<0 ? -1 : 1; unit2.y = 0; + found = 1; + } + } else { + if ( (unit.x<=0 && unit2.x>=0) || (unit.x>=0 && unit2.x<=0) ) { + unit2.y = unit2.y<0 ? -1 : 1; unit2.x = 0; + found = 1; + } + } + } + /* If we're next to a line, we must extend the line. No choice */ + if ( sp->nonextcp ) { + if ( lennoprevcp ) { + if ( len2nextcp.x = sp->me.x + len*unit2.x; + sp->nextcp.y = sp->me.y + len*unit2.y; + sp->prevcp.x = sp->me.x - len2*unit2.x; + sp->prevcp.y = sp->me.y - len2*unit2.y; + sp->pointtype = pt_curve; + if ( sp->prev ) + SplineRefigure(sp->prev); + if ( sp->next ) + SplineRefigure(sp->next); + changed = true; + } + } + nextpt: + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==ss->first ) + break; + } +return( changed ); +} + +/* Cleanup just turns splines with control points which happen to trace out */ +/* lines into simple lines */ +void SplinePointListSimplify(SplineChar *sc,SplinePointList *spl, + struct simplifyinfo *smpl) { + SplinePoint *first, *next, *sp, *nsp; + + if ( spl==NULL ) +return; + + RemoveZeroLengthSplines(spl,false); + if ( spl->first->next!=NULL && spl->first->next->to==spl->first && + spl->first->nonextcp && spl->first->noprevcp ) +return; /* Ignore any splines which are just dots */ + + if ( smpl->flags!=sf_cleanup && (smpl->flags&sf_forcelines)) + SPLForceLines(sc,spl,smpl->linefixup); + + if ( smpl->flags!=sf_cleanup && spl->first->prev!=NULL && spl->first->prev!=spl->first->next ) { + /* first thing to try is to remove everything between two extrema */ + /* We do this even if they checked ignore extrema. After this pass */ + /* we'll come back and check every point individually */ + for ( sp = spl->first; ; ) { + if ( sp->next==NULL ) + break; + if ( sp->pointtype==pt_curve && !sp->nonextcp && + (sp->nextcp.x == sp->me.x || sp->nextcp.y==sp->me.y)) { + /* sp is an extremum */ + for ( nsp=sp->next->to; nsp!=sp; nsp = nsp->next->to ) { + if ( nsp->pointtype!=pt_curve || nsp->next==NULL ) + break; + if ( !nsp->nonextcp && + ((nsp->nextcp.x-nsp->me.x)*(sp->nextcp.x-sp->me.x) + + (nsp->nextcp.y-nsp->me.y)*(sp->nextcp.y-sp->me.y))<=0 ) + break; + if ( !nsp->noprevcp && + ((nsp->me.x-nsp->prevcp.x)*(sp->nextcp.x-sp->me.x) + + (nsp->me.y-nsp->prevcp.y)*(sp->nextcp.y-sp->me.y))<=0 ) + break; + if ( nsp->pointtype==pt_curve && !nsp->nonextcp && + (nsp->nextcp.x == nsp->me.x || nsp->nextcp.y==nsp->me.y)) + break; + } + /* nsp is something we don't want to remove */ + if ( nsp==sp ) + break; + if ( SplinesRemoveBetweenMaybe(sc,sp,nsp,smpl->flags,smpl->err)) { + if ( spl->last==spl->first ) + spl->last = spl->first = sp; /* We know this point didn't get removed */ + sp = nsp; + } else + sp = sp->next->to; + } else + sp = sp->next->to; + if ( sp == spl->first ) + break; + } + + while ( 1 ) { + first = spl->first->prev->from; + if ( first->prev == first->next ) +return; + if ( !SplinesRemoveMidMaybe(sc,spl->first,smpl->flags,smpl->err)) + break; + if ( spl->first==spl->last ) + spl->last = first; + spl->first = first; + } + } + + /* Special case checks for paths containing only one point */ + /* else we get lots of nans (or only two points) */ + if ( spl->first->next == NULL ) +return; + for ( sp = spl->first->next->to; sp!=spl->last && sp->next!=NULL; sp = next ) { + SplineIsLinearMake(sp->prev); /* First see if we can turn it*/ + /* into a line, then try to merge two splines */ + next = sp->next->to; + if ( sp->prev == sp->next || + (sp->next!=NULL && sp->next->to->next!=NULL && + sp->next->to->next->to == sp )) +return; + if ( smpl->flags!=sf_cleanup ) + SplinesRemoveMidMaybe(sc,sp,smpl->flags,smpl->err); + else { + while ( sp->me.x==next->me.x && sp->me.y==next->me.y && + sp->nextcp.x>sp->me.x-1 && sp->nextcp.xme.x+1 && + sp->nextcp.y>sp->me.y-1 && sp->nextcp.yme.y+1 && + next->prevcp.x>next->me.x-1 && next->prevcp.xme.x+1 && + next->prevcp.y>next->me.y-1 && next->prevcp.yme.y+1 ) { + SplineFree(sp->next); + sp->next = next->next; + if ( sp->next!=NULL ) + sp->next->from = sp; + sp->nextcp = next->nextcp; + sp->nonextcp = next->nonextcp; + sp->nextcpdef = next->nextcpdef; + SplinePointMDFree(sc,next); + if ( sp->next!=NULL ) + next = sp->next->to; + else { + next = NULL; + break; + } + } + if ( next==NULL ) + break; + } + } + if ( smpl->flags!=sf_cleanup && (smpl->flags&sf_smoothcurves)) + SPLSmoothControlPoints(spl,smpl->tan_bounds,smpl->flags&sf_choosehv); +} + +/* cleanup may be: -1 => lines become lines, 0 => simplify & retain slopes, 1=> simplify and discard slopes, 2=>discard extrema */ +SplineSet *SplineCharSimplify(SplineChar *sc,SplineSet *head, + struct simplifyinfo *smpl) { + SplineSet *spl, *prev, *snext; + int anysel=0; + + for ( spl = head; spl!=NULL && !anysel; spl = spl->next ) { + anysel = PointListIsSelected(spl); + } + + prev = NULL; + for ( spl = head; spl!=NULL; spl = snext ) { + snext = spl->next; + if ( !anysel || PointListIsSelected(spl)) { + SplinePointListSimplify(sc,spl,smpl); + /* remove any singleton points */ + if ( spl->first->prev==spl->first->next && + (spl->first->prev==NULL || + (spl->first->noprevcp && spl->first->nonextcp))) { + if ( prev==NULL ) + head = snext; + else + prev->next = snext; + spl->next = NULL; + SplinePointListMDFree(sc,spl); + } else + prev = spl; + } + } +return( head ); +} + +static int SplineSetMakeLoop(SplineSet *spl,real fudge) { + if ( spl->first!=spl->last && + (spl->first->me.x >= spl->last->me.x-fudge && + spl->first->me.x <= spl->last->me.x+fudge && + spl->first->me.y >= spl->last->me.y-fudge && + spl->first->me.y <= spl->last->me.y+fudge )) { + spl->first->prev = spl->last->prev; + spl->first->prev->to = spl->first; + spl->first->prevcp = spl->last->prevcp; + spl->first->noprevcp = spl->last->noprevcp; + spl->first->prevcpdef = spl->last->prevcpdef; + SplinePointFree(spl->last); + spl->last = spl->first; +return( true ); + } +return( false ); +} + +SplineSet *SplineSetJoin(SplineSet *start,int doall,real fudge,int *changed) { + SplineSet *spl, *spl2, *prev; + + *changed = false; + for ( spl=start; spl!=NULL; spl=spl->next ) { + if ( spl->first->prev==NULL && + (doall || PointListIsSelected(spl)) ) { + if ( SplineSetMakeLoop(spl,fudge) ) { + *changed = true; + } else { + prev = NULL; + for ( spl2=start ; spl2!=NULL; prev = spl2, spl2=spl2->next ) if ( spl2!=spl ) { + if (!( spl->first->me.x >= spl2->last->me.x-fudge && + spl->first->me.x <= spl2->last->me.x+fudge && + spl->first->me.y >= spl2->last->me.y-fudge && + spl->first->me.y <= spl2->last->me.y+fudge )) { + if (( spl->last->me.x >= spl2->last->me.x-fudge && + spl->last->me.x <= spl2->last->me.x+fudge && + spl->last->me.y >= spl2->last->me.y-fudge && + spl->last->me.y <= spl2->last->me.y+fudge ) || + ( spl->last->me.x >= spl2->first->me.x-fudge && + spl->last->me.x <= spl2->first->me.x+fudge && + spl->last->me.y >= spl2->first->me.y-fudge && + spl->last->me.y <= spl2->first->me.y+fudge )) + SplineSetReverse(spl); + } + if ( spl->first->me.x >= spl2->first->me.x-fudge && + spl->first->me.x <= spl2->first->me.x+fudge && + spl->first->me.y >= spl2->first->me.y-fudge && + spl->first->me.y <= spl2->first->me.y+fudge ) + SplineSetReverse(spl2); + if ( spl->first->me.x >= spl2->last->me.x-fudge && + spl->first->me.x <= spl2->last->me.x+fudge && + spl->first->me.y >= spl2->last->me.y-fudge && + spl->first->me.y <= spl2->last->me.y+fudge ) { + spl->first->prev = spl2->last->prev; + spl->first->prev->to = spl->first; + spl->first->prevcp = spl2->last->prevcp; + spl->first->noprevcp = spl2->last->noprevcp; + spl->first->prevcpdef = spl2->last->prevcpdef; + SplinePointFree(spl2->last); + spl->first = spl2->first; + spl2->first = spl2->last = NULL; + if ( prev!=NULL ) + prev->next = spl2->next; + else + start = spl2->next; + chunkfree(spl2,sizeof(SplineSet)); + SplineSetMakeLoop(spl,fudge); + *changed = true; + break; + } + } + } + } + } +return(start); +} + +SplineSet *SplineCharRemoveTiny(SplineChar *sc,SplineSet *head) { + SplineSet *spl, *snext, *pr; + Spline *spline, *next, *first; + const double err = 1.0/64.0; + + for ( spl = head, pr=NULL; spl!=NULL; spl = snext ) { + first = NULL; + for ( spline=spl->first->next; spline!=NULL && spline!=first; spline=next ) { + next = spline->to->next; + if ( spline->from->me.x-spline->to->me.x>-err && spline->from->me.x-spline->to->me.xfrom->me.y-spline->to->me.y>-err && spline->from->me.y-spline->to->me.yfrom->nonextcp || spline->to->noprevcp) && + spline->from->prev!=NULL ) { + if ( spline->from==spline->to ) + break; + if ( spl->last==spline->from ) spl->last = NULL; + if ( spl->first==spline->from ) spl->first = NULL; + if ( first==spline->from->prev ) first=NULL; + /*SplinesRemoveBetween(sc,spline->from->prev->from,spline->to);*/ + spline->to->prevcp = spline->from->prevcp; + spline->to->noprevcp = spline->from->noprevcp; + spline->to->prevcpdef = spline->from->prevcpdef; + spline->from->prev->to = spline->to; + spline->to->prev = spline->from->prev; + SplineRefigure(spline->from->prev); + SplinePointFree(spline->from); + SplineFree(spline); + if ( first==NULL ) first = next->from->prev; + if ( spl->first==NULL ) spl->first = next->from; + if ( spl->last==NULL ) spl->last = next->from; + } else { + if ( first==NULL ) first = spline; + } + } + snext = spl->next; + if ( spl->first->next==spl->first->prev ) { + spl->next = NULL; + SplinePointListMDFree(sc,spl); + if ( pr==NULL ) + head = snext; + else + pr->next = snext; + } else + pr = spl; + } +return( head ); +} + +Spline *SplineAddExtrema(Spline *s) { + /* First find the extrema, if any */ + double t[4], min; + int p, i,j; + SplinePoint *sp; + + forever { + if ( s->islinear ) +return(s); + p = 0; + if ( s->splines[0].a!=0 ) { + double d = 4*s->splines[0].b*s->splines[0].b-4*3*s->splines[0].a*s->splines[0].c; + if ( d>0 ) { + d = sqrt(d); + t[p++] = (-2*s->splines[0].b+d)/(2*3*s->splines[0].a); + t[p++] = (-2*s->splines[0].b-d)/(2*3*s->splines[0].a); + } + } else if ( s->splines[0].b!=0 ) + t[p++] = -s->splines[0].c/(2*s->splines[0].b); + if ( s->splines[1].a!=0 ) { + double d = 4*s->splines[1].b*s->splines[1].b-4*3*s->splines[1].a*s->splines[1].c; + if ( d>0 ) { + d = sqrt(d); + t[p++] = (-2*s->splines[1].b+d)/(2*3*s->splines[1].a); + t[p++] = (-2*s->splines[1].b-d)/(2*3*s->splines[1].a); + } + } else if ( s->splines[1].b!=0 ) + t[p++] = -s->splines[1].c/(2*s->splines[1].b); + + /* Throw out any t values which are not between 0 and 1 */ + /* (we do a little fudging near the endpoints so we don't get confused */ + /* by rounding errors) */ + for ( i=0; i.9999 ) { + --p; + for ( j=i; jnext; + /* Don't try to use any other computed t values, it is easier to */ + /* recompute them than to try and figure out what they map to on the */ + /* new spline */ + } +} + +void SplineSetAddExtrema(SplineSet *ss,int between_selected) { + Spline *s, *first; + + first = NULL; + for ( s = ss->first->next; s!=NULL && s!=first; s = s->to->next ) { + if ( first==NULL ) first = s; + if ( !between_selected || (s->from->selected && s->to->selected)) + s = SplineAddExtrema(s); + } +} + +void SplineCharAddExtrema(SplineSet *head,int between_selected) { + SplineSet *ss; + + for ( ss=head; ss!=NULL; ss=ss->next ) { + SplineSetAddExtrema(ss,between_selected); + } +} + +char *GetNextUntitledName(void) { + static int untitled_cnt=1; + char buffer[80]; + + sprintf( buffer, "Untitled%d", untitled_cnt++ ); +return( copy(buffer)); +} + +SplineFont *SplineFontEmpty(void) { + SplineFont *sf; + sf = gcalloc(1,sizeof(SplineFont)); + sf->pfminfo.fstype = -1; + sf->encoding_name = em_none; + sf->top_enc = -1; + sf->macstyle = -1; + sf->desired_row_cnt = 4; sf->desired_col_cnt = 16; + sf->display_antialias = default_fv_antialias; + sf->display_bbsized = default_fv_bbsized; + sf->display_size = -default_fv_font_size; +return( sf ); +} + +SplineFont *SplineFontBlank(int encoding_name,int charcnt) { + SplineFont *sf; + char buffer[200]; + time_t now; + struct tm *tm; + extern int greeknames; + const char *author = GetAuthor(); + + sf = SplineFontEmpty(); + sf->fontname = GetNextUntitledName(); + sf->fullname = copy(sf->fontname); + sf->familyname = copy(sf->fontname); + sprintf( buffer, "%s.sfd", sf->fontname); + sf->origname = copy(buffer); + sf->weight = copy("Medium"); + if ( author!=NULL ) + sprintf( buffer, "Created by %.50s with PfaEdit 1.0 (http://pfaedit.sf.net)", author ); + else + strcpy( buffer, "Created with PfaEdit 1.0 (http://pfaedit.sf.net)" ); + sf->copyright = copy(buffer); + if ( xuid!=NULL ) { + sf->xuid = galloc(strlen(xuid)+20); + sprintf(sf->xuid,"[%s %d]", xuid, (rand()&0xffffff)); + } + time(&now); + tm = localtime(&now); + sprintf( buffer, "%d-%d-%d: Created.", tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday ); + sf->comments = copy(buffer); + sf->version = copy("001.000"); + sf->ascent = rint(new_em_size*.8); sf->descent = new_em_size-sf->ascent; + sf->upos = -rint(new_em_size*.1); sf->uwidth = rint(new_em_size*.05); /* defaults for cff */ + sf->charcnt = charcnt; + sf->chars = gcalloc(charcnt,sizeof(SplineChar *)); + sf->encoding_name = encoding_name; + sf->uni_interp = interp_from_encoding(encoding_name,greeknames ? ui_greek : ui_none); + sf->pfminfo.fstype = -1; + sf->order2 = false; +return( sf ); +} + +/* see also SFReencodeFont in fontinfo.c */ +SplineFont *SplineFontNew(void) { + SplineFont *sf; + /* Create an ISO 8859-1 (Latin1) font, actually whatever default_encoding is */ + int enclen=256; + Encoding *item=NULL; + + if ( default_encoding>=em_base ) { + for ( item=enclist; item!=NULL && item->enc_num!=default_encoding; item=item->next ); + if ( item==NULL ) + default_encoding = em_iso8859_1; + } + if ( default_encoding==em_adobestandard ) { + } else if ( default_encoding==em_iso8859_1 ) { + } else if ( default_encoding==em_unicode ) { + enclen = 65536; + } else if ( default_encoding==em_unicode4 ) { + enclen = unicode4_size; + } else if ( default_encoding>=em_unicodeplanes && default_encoding<=em_unicodeplanesmax ) { + enclen = 65536; + } else if ( default_encoding==em_jis208 ) { + enclen = 65536; + } else if ( default_encoding==em_jis212 ) { + enclen = 65536; + } else if ( default_encoding==em_ksc5601 ) { + enclen = 65536; + } else if ( default_encoding==em_gb2312 ) { + enclen = 65536; + } else if ( default_encoding==em_big5 ) { + enclen = 65536; + } else if ( default_encoding==em_big5hkscs ) { + enclen = 65536; + } else if ( default_encoding==em_johab ) { + enclen = 65536; + } else if ( default_encoding==em_wansung ) { + enclen = 65536; + } else if ( default_encoding==em_jisgb ) { + enclen = 65536; + } else if ( default_encoding==em_sjis ) { + enclen = 65536; + } else if ( item!=NULL ) { + enclen = item->char_cnt; + } else + ; + + sf = SplineFontBlank(default_encoding,enclen); + sf->onlybitmaps = true; + sf->new = true; +#if 0 + for ( i=0; ichars[i] = SplineCharCreate(); + sc->vwidth = sf->ascent+sf->descent; + if ( default_encoding>=em_unicodeplanes && default_encoding<=em_unicodeplanesmax ) + uenc = i+ ((default_encoding-em_unicodeplanes)<<16); + else if ( table==NULL ) + uenc = i; + else if ( tlen==94*94 ) { + if ( i<0x2121 || i>0x7e7e || (i&0xff)<0x21 || (i&0xff)>0x7e ) + uenc = -1; + else + uenc = table[((i>>8)-0x21)*94+((i&0xff)-0x21)]; + } else if ( tlen==0x10000-0xa100 || tlen == 0x10000-0x8400 ) { + uenc = ( i<160 )?i : -1; /* deal with single byte encoding of big5 */ + } else if ( tlen==257 ) { /* sjis */ + if ( i<0x80 ) uenc = i; + else if ( i>=0xa1 && i<=0xdf ) + uenc = unicode_from_jis201[i]; + else uenc = -1; + } else + uenc = table[i]; + sc->enc = i; + sc->unicodeenc = uenc; + name = uenc<=0?".notdef":psunicodenames[uenc]; + if ( uenc==-1 && item!=NULL && item->psnames!=NULL && item->psnames[i]!=NULL ) + name = item->psnames[i]; + if ( name==NULL ) { + if ( uenc==0xa0 ) + name = "nonbreakingspace"; + else if ( uenc==0x2d ) + name = "hyphen-minus"; + else if ( uenc==0xad ) + name = "softhyphen"; + else if ( uenc<32 || (uenc>0x7e && uenc<0xa0)) + name = ".notdef"; + else { + if ( uenc<0x10000 ) + sprintf(buf,"uni%04X", uenc ); + else + sprintf(buf,"u%04X", uenc ); + name = buf; + } + } + sc->name = copy(name); + sc->width = sf->ascent+sf->descent; + sc->lsidebearing = 0; + sc->parent = sf; + SCLigDefault(sc); + } +#endif + sf->order2 = new_fonts_are_order2; +return( sf ); +} + +static void SFChangeXUID(SplineFont *sf, int random) { + char *pt, *new, *npt; + int val; + + if ( sf->xuid==NULL ) +return; + pt = strrchr(sf->xuid,' '); + if ( pt==NULL ) + pt = strchr(sf->xuid,'['); + if ( pt==NULL ) + pt = sf->xuid; + else + ++pt; + if ( random ) + val = rand()&0xffffff; + else { + val = strtol(pt,NULL,10); + val = (val+1)&0xffffff; + } + + new = galloc(pt-sf->xuid+12); + strncpy(new,sf->xuid,pt-sf->xuid); + npt = new + (pt-sf->xuid); + if ( npt==new ) *npt++ = '['; + sprintf(npt, "%d]", val ); + free(sf->xuid); sf->xuid = new; + sf->changed = true; + sf->changed_since_xuidchanged = false; +} + +void SFIncrementXUID(SplineFont *sf) { + SFChangeXUID(sf,false); +} + +void SFRandomChangeXUID(SplineFont *sf) { + SFChangeXUID(sf,true); +} + +void SPWeightedAverageCps(SplinePoint *sp) { + double pangle, nangle, angle, plen, nlen, c, s; + if ( sp->noprevcp || sp->nonextcp ) + /*SPAverageCps(sp)*/; /* Expand Stroke wants this case to hold still */ + else if ( sp->pointtype==pt_curve && sp->prev && sp->next ) { + pangle = atan2(sp->me.y-sp->prevcp.y,sp->me.x-sp->prevcp.x); + nangle = atan2(sp->nextcp.y-sp->me.y,sp->nextcp.x-sp->me.x); + if ( pangle<0 && nangle>0 && nangle-pangle>=3.1415926 ) + pangle += 2*3.1415926535897932; + else if ( pangle>0 && nangle<0 && pangle-nangle>=3.1415926 ) + nangle += 2*3.1415926535897932; + plen = sqrt((sp->me.y-sp->prevcp.y)*(sp->me.y-sp->prevcp.y) + + (sp->me.x-sp->prevcp.x)*(sp->me.x-sp->prevcp.x)); + nlen = sqrt((sp->nextcp.y-sp->me.y)*(sp->nextcp.y-sp->me.y) + + (sp->nextcp.x-sp->me.x)*(sp->nextcp.x-sp->me.x)); + if ( plen+nlen==0 ) + angle = (nangle+pangle)/2; + else + angle = (plen*pangle + nlen*nangle)/(plen+nlen); + plen = -plen; + c = cos(angle); s=sin(angle); + sp->nextcp.x = c*nlen + sp->me.x; + sp->nextcp.y = s*nlen + sp->me.y; + sp->prevcp.x = c*plen + sp->me.x; + sp->prevcp.y = s*plen + sp->me.y; + SplineRefigure(sp->prev); + SplineRefigure(sp->next); + } else + SPAverageCps(sp); +} + +void SPAverageCps(SplinePoint *sp) { + double pangle, nangle, angle, plen, nlen, c, s; + if ( sp->pointtype==pt_curve && sp->prev && sp->next ) { + if ( sp->noprevcp ) + pangle = atan2(sp->me.y-sp->prev->from->me.y,sp->me.x-sp->prev->from->me.x); + else + pangle = atan2(sp->me.y-sp->prevcp.y,sp->me.x-sp->prevcp.x); + if ( sp->nonextcp ) + nangle = atan2(sp->next->to->me.y-sp->me.y,sp->next->to->me.x-sp->me.x); + else + nangle = atan2(sp->nextcp.y-sp->me.y,sp->nextcp.x-sp->me.x); + if ( pangle<0 && nangle>0 && nangle-pangle>=3.1415926 ) + pangle += 2*3.1415926535897932; + else if ( pangle>0 && nangle<0 && pangle-nangle>=3.1415926 ) + nangle += 2*3.1415926535897932; + angle = (nangle+pangle)/2; + plen = -sqrt((sp->me.y-sp->prevcp.y)*(sp->me.y-sp->prevcp.y) + + (sp->me.x-sp->prevcp.x)*(sp->me.x-sp->prevcp.x)); + nlen = sqrt((sp->nextcp.y-sp->me.y)*(sp->nextcp.y-sp->me.y) + + (sp->nextcp.x-sp->me.x)*(sp->nextcp.x-sp->me.x)); + c = cos(angle); s=sin(angle); + sp->nextcp.x = c*nlen + sp->me.x; + sp->nextcp.y = s*nlen + sp->me.y; + sp->prevcp.x = c*plen + sp->me.x; + sp->prevcp.y = s*plen + sp->me.y; + SplineRefigure(sp->prev); + SplineRefigure(sp->next); + } else if ( sp->pointtype==pt_tangent && sp->prev && sp->next ) { + if ( !sp->noprevcp ) { + nangle = atan2(sp->next->to->me.y-sp->me.y,sp->next->to->me.x-sp->me.x); + plen = -sqrt((sp->me.y-sp->prevcp.y)*(sp->me.y-sp->prevcp.y) + + (sp->me.x-sp->prevcp.x)*(sp->me.x-sp->prevcp.x)); + c = cos(nangle); s=sin(nangle); + sp->prevcp.x = c*plen + sp->me.x; + sp->prevcp.y = s*plen + sp->me.y; + SplineRefigure(sp->prev); + } + if ( !sp->nonextcp ) { + pangle = atan2(sp->me.y-sp->prev->from->me.y,sp->me.x-sp->prev->from->me.x); + nlen = sqrt((sp->nextcp.y-sp->me.y)*(sp->nextcp.y-sp->me.y) + + (sp->nextcp.x-sp->me.x)*(sp->nextcp.x-sp->me.x)); + c = cos(pangle); s=sin(pangle); + sp->nextcp.x = c*nlen + sp->me.x; + sp->nextcp.y = s*nlen + sp->me.y; + SplineRefigure(sp->next); + } + } +} + +void SplineCharTangentNextCP(SplinePoint *sp) { + double angle, len; + BasePoint *bp; + + if ( sp->prev==NULL ) +return; + bp = &sp->prev->from->me; + + angle = atan2(sp->me.y-bp->y,sp->me.x-bp->x); + len = sqrt((sp->nextcp.y-sp->me.y)*(sp->nextcp.y-sp->me.y) + (sp->nextcp.x-sp->me.x)*(sp->nextcp.x-sp->me.x)); + sp->nextcp.x = sp->me.x + len*cos(angle); + sp->nextcp.y = sp->me.y + len*sin(angle); + sp->nextcp.x = rint(sp->nextcp.x*1024)/1024; + sp->nextcp.y = rint(sp->nextcp.y*1024)/1024; + if ( sp->next!=NULL && sp->next->order2 ) + sp->next->from->prevcp = sp->nextcp; +} + +void SplineCharTangentPrevCP(SplinePoint *sp) { + double angle, len; + BasePoint *bp; + + if ( sp->next==NULL ) +return; + bp = &sp->next->to->me; + + angle = atan2(sp->me.y-bp->y,sp->me.x-bp->x); + len = sqrt((sp->prevcp.y-sp->me.y)*(sp->prevcp.y-sp->me.y) + (sp->prevcp.x-sp->me.x)*(sp->prevcp.x-sp->me.x)); + sp->prevcp.x = sp->me.x + len*cos(angle); + sp->prevcp.y = sp->me.y + len*sin(angle); + sp->prevcp.x = rint(sp->prevcp.x*1024)/1024; + sp->prevcp.y = rint(sp->prevcp.y*1024)/1024; + if ( sp->prev!=NULL && sp->prev->order2 ) + sp->prev->from->nextcp = sp->prevcp; +} + +#define NICE_PROPORTION .39 +void SplineCharDefaultNextCP(SplinePoint *base) { + SplinePoint *prev=NULL, *next; + double len; + double angle, pangle, plen, ca; + + if ( base->next==NULL ) +return; + if ( base->next->order2 ) { + SplineRefigureFixup(base->next); +return; + } + if ( !base->nextcpdef ) { + if ( base->pointtype==pt_tangent ) + SplineCharTangentNextCP(base); +return; + } + next = base->next->to; + if ( base->prev!=NULL ) + prev = base->prev->from; + + len = NICE_PROPORTION * sqrt((base->me.x-next->me.x)*(base->me.x-next->me.x) + + (base->me.y-next->me.y)*(base->me.y-next->me.y)); + angle = atan2( base->me.y-next->me.y , base->me.x-next->me.x ); + base->nonextcp = false; + + if ( base->pointtype == pt_curve ) { + if ( prev!=NULL && (base->prevcpdef || base->noprevcp)) { + pangle = atan2( prev->me.y-base->me.y , prev->me.x-base->me.x ); + if ( pangle<0 && angle>0 && angle-pangle>=3.1415926 ) + pangle += 2*3.1415926535897932; + else if ( pangle>0 && angle<0 && pangle-angle>=3.1415926 ) + angle += 2*3.1415926535897932; + angle = (angle+pangle)/2; + plen = sqrt((base->prevcp.x-base->me.x)*(base->prevcp.x-base->me.x) + + (base->prevcp.y-base->me.y)*(base->prevcp.y-base->me.y)); + ca = cos(angle); + if ( fabs(ca) > fabs(sin(angle)) ) + if (( ca>0 && base->me.x>prev->me.x ) || (ca<0 && base->me.xme.x)) + angle += 3.1415926535897932; + base->prevcp.x = base->me.x + plen*cos(angle); + base->prevcp.y = base->me.y + plen*sin(angle); + SplineRefigureFixup(base->prev); + } else if ( prev!=NULL ) { + /* The prev control point is fixed. So we've got to use the same */ + /* angle it uses */ + angle = atan2( base->prevcp.y-base->me.y , base->prevcp.x-base->me.x ); + } + } else if ( base->pointtype == pt_corner ) { + if ( next->pointtype != pt_curve ) { + base->nonextcp = true; + } + } else /* tangent */ { + if ( next->pointtype != pt_curve ) { + base->nonextcp = true; + } else { + if ( prev!=NULL ) { + if ( !base->noprevcp ) { + plen = sqrt((base->prevcp.x-base->me.x)*(base->prevcp.x-base->me.x) + + (base->prevcp.y-base->me.y)*(base->prevcp.y-base->me.y)); + base->prevcp.x = base->me.x + plen*cos(angle); + base->prevcp.y = base->me.y + plen*sin(angle); + SplineRefigureFixup(base->prev); + } + angle = atan2( prev->me.y-base->me.y , prev->me.x-base->me.x ); + } + } + } + if ( base->nonextcp ) + base->nextcp = base->me; + else { + base->nextcp.x = base->me.x - len*cos(angle); + base->nextcp.y = base->me.y - len*sin(angle); + base->nextcp.x = rint(base->nextcp.x*1024)/1024; + base->nextcp.y = rint(base->nextcp.y*1024)/1024; + if ( base->next != NULL ) + SplineRefigureFixup(base->next); + } +} + +void SplineCharDefaultPrevCP(SplinePoint *base) { + SplinePoint *next=NULL, *prev; + double len, nlen; + double angle, nangle, ca; + + if ( base->prev==NULL ) +return; + if ( base->prev->order2 ) { + SplineRefigureFixup(base->prev); +return; + } + if ( !base->prevcpdef ) { + if ( base->pointtype==pt_tangent ) + SplineCharTangentPrevCP(base); +return; + } + prev = base->prev->from; + if ( base->next!=NULL ) + next = base->next->to; + + len = NICE_PROPORTION * sqrt((base->me.x-prev->me.x)*(base->me.x-prev->me.x) + + (base->me.y-prev->me.y)*(base->me.y-prev->me.y)); + angle = atan2( base->me.y-prev->me.y , base->me.x-prev->me.x ); + base->noprevcp = false; + + if ( base->pointtype == pt_curve ) { + if ( next!=NULL && (base->nextcpdef || base->nonextcp)) { + nangle = atan2( next->me.y-base->me.y , next->me.x-base->me.x ); + if ( nangle<0 && angle>0 && angle-nangle>=3.1415926 ) + nangle += 2*3.1415926535897932; + else if ( nangle>0 && angle<0 && nangle-angle>=3.1415926 ) + angle += 2*3.1415926535897932; + angle = (angle+nangle)/2; + nlen = sqrt((base->nextcp.x-base->me.x)*(base->nextcp.x-base->me.x) + + (base->nextcp.y-base->me.y)*(base->nextcp.y-base->me.y)); + ca = cos(angle); + if ( fabs(ca) > fabs(sin(angle)) ) + if (( ca>0 && base->me.x>next->me.x ) || (ca<0 && base->me.xme.x)) + angle += 3.1415926535897932; + base->nextcp.x = base->me.x + nlen*cos(angle); + base->nextcp.y = base->me.y + nlen*sin(angle); + SplineRefigureFixup(base->next); + } else if ( next!=NULL ) { + /* The next control point is fixed. So we got to use the same */ + /* angle it uses */ + angle = atan2( base->nextcp.y-base->me.y , base->nextcp.x-base->me.x ); + } + } else if ( base->pointtype == pt_corner ) { + if ( prev->pointtype != pt_curve ) { + base->noprevcp = true; + } + } else /* tangent */ { + if ( prev->pointtype != pt_curve ) { + base->noprevcp = true; + } else { + if ( next!=NULL ) { + if ( !base->nonextcp ) { + nlen = sqrt((base->nextcp.x-base->me.x)*(base->nextcp.x-base->me.x) + + (base->nextcp.y-base->me.y)*(base->nextcp.y-base->me.y)); + base->nextcp.x = base->me.x + nlen*cos(angle); + base->nextcp.y = base->me.y + nlen*sin(angle); + SplineRefigureFixup(base->next); + } + angle = atan2( next->me.y-base->me.y , next->me.x-base->me.x ); + } + } + } + if ( base->noprevcp ) + base->prevcp = base->me; + else { + base->prevcp.x = base->me.x - len*cos(angle); + base->prevcp.y = base->me.y - len*sin(angle); + base->prevcp.x = rint(base->prevcp.x*1024)/1024; + base->prevcp.y = rint(base->prevcp.y*1024)/1024; + if ( base->prev!=NULL ) + SplineRefigureFixup(base->prev); + } +} + +void SPSmoothJoint(SplinePoint *sp) { + BasePoint unitn, unitp; + double len, dot, dotn, dotp; + if ( sp->prev==NULL || sp->next==NULL || sp->pointtype==pt_corner ) +return; + + if ( sp->pointtype==pt_curve && !sp->nonextcp && !sp->noprevcp ) { + unitn.x = sp->nextcp.x-sp->me.x; + unitn.y = sp->nextcp.y-sp->me.y; + len = sqrt(unitn.x*unitn.x + unitn.y*unitn.y); + if ( len==0 ) +return; + unitn.x /= len; unitn.y /= len; + unitp.x = sp->me.x - sp->prevcp.x; + unitp.y = sp->me.y - sp->prevcp.y; + len = sqrt(unitp.x*unitp.x + unitp.y*unitp.y); + if ( len==0 ) +return; + unitp.x /= len; unitp.y /= len; + dotn = unitp.y*(sp->nextcp.x-sp->me.x) - unitp.x*(sp->nextcp.y-sp->me.y); + dotp = unitn.y*(sp->me.x - sp->prevcp.x) - unitn.x*(sp->me.y - sp->prevcp.y); + sp->nextcp.x -= dotn*unitp.y/2; + sp->nextcp.y -= -dotn*unitp.x/2; + sp->prevcp.x += dotp*unitn.y/2; + sp->prevcp.y += -dotp*unitn.x/2; + SplineRefigure(sp->prev); SplineRefigure(sp->next); + } + if ( sp->pointtype==pt_tangent && !sp->nonextcp ) { + unitp.x = sp->me.x - sp->prev->from->me.x; + unitp.y = sp->me.y - sp->prev->from->me.y; + len = sqrt(unitp.x*unitp.x + unitp.y*unitp.y); + if ( len!=0 ) { + unitp.x /= len; unitp.y /= len; + dot = unitp.y*(sp->nextcp.x-sp->me.x) - unitp.x*(sp->nextcp.y-sp->me.y); + sp->nextcp.x -= dot*unitp.y; + sp->nextcp.y -= -dot*unitp.x; + SplineRefigure(sp->next); + } + } + if ( sp->pointtype==pt_tangent && !sp->noprevcp ) { + unitn.x = sp->nextcp.x-sp->me.x; + unitn.y = sp->nextcp.y-sp->me.y; + len = sqrt(unitn.x*unitn.x + unitn.y*unitn.y); + if ( len!=0 ) { + unitn.x /= len; unitn.y /= len; + dot = unitn.y*(sp->me.x-sp->prevcp.x) - unitn.x*(sp->me.y-sp->prevcp.y); + sp->prevcp.x += dot*unitn.y; + sp->prevcp.y += -dot*unitn.x; + SplineRefigure(sp->prev); + } + } +} + +void SplinePointListSet(SplinePointList *tobase, SplinePointList *frombase) { + SplinePoint *tsp, *first, *fsp; + Spline *tspline, *firstsp, *fspline; + + for ( ; tobase!=NULL && frombase!=NULL; tobase = tobase->next , frombase=frombase->next ) { + first = NULL; + for ( tsp = tobase->first, fsp=frombase->first; tsp!=first; tsp=tsp->next->to, fsp=fsp->next->to ) { + tsp->me = fsp->me; + tsp->nextcp = fsp->nextcp; + tsp->prevcp = fsp->prevcp; + tsp->noprevcp = fsp->noprevcp; + tsp->nonextcp = fsp->nonextcp; + if ( first==NULL ) first = tsp; + if ( tsp->next==NULL ) + break; + } + firstsp = NULL; + for ( tspline = tobase->first->next, fspline=frombase->first->next; + tspline!=NULL && tspline!=firstsp; + tspline=tspline->to->next, fspline=fspline->to->next ) { + tspline->splines[0] = fspline->splines[0]; + tspline->splines[1] = fspline->splines[1]; + LinearApproxFree(tspline->approx); + tspline->approx = NULL; + if ( firstsp==NULL ) firstsp = tspline; + } + } +} + +int PointListIsSelected(SplinePointList *spl) { + int anypoints = 0; + Spline *spline, *first; + + first = NULL; + if ( spl->first->selected ) anypoints = true; + for ( spline=spl->first->next; spline!=NULL && spline!=first && !anypoints; spline = spline->to->next ) { + if ( spline->to->selected ) anypoints = true; + if ( first == NULL ) first = spline; + } +return( anypoints ); +} + +SplineSet *SplineSetReverse(SplineSet *spl) { + Spline *spline, *first, *next; + BasePoint tp; + SplinePoint *temp; + int bool; + /* reverse the splineset so that what was the start point becomes the end */ + /* and vice versa. This entails reversing every individual spline, and */ + /* each point */ + + first = NULL; + spline = spl->first->next; + if ( spline==NULL ) +return( spl ); /* Only one point, reversal is meaningless */ + + tp = spline->from->nextcp; + spline->from->nextcp = spline->from->prevcp; + spline->from->prevcp = tp; + bool = spline->from->nonextcp; + spline->from->nonextcp = spline->from->noprevcp; + spline->from->noprevcp = bool; + bool = spline->from->nextcpdef; + spline->from->nextcpdef = spline->from->prevcpdef; + spline->from->prevcpdef = bool; + + for ( ; spline!=NULL && spline!=first; spline=next ) { + next = spline->to->next; + + if ( spline->to!=spl->first ) { /* On a closed spline don't want to reverse the first point twice */ + tp = spline->to->nextcp; + spline->to->nextcp = spline->to->prevcp; + spline->to->prevcp = tp; + bool = spline->to->nonextcp; + spline->to->nonextcp = spline->to->noprevcp; + spline->to->noprevcp = bool; + bool = spline->to->nextcpdef; + spline->to->nextcpdef = spline->to->prevcpdef; + spline->to->prevcpdef = bool; + } + + temp = spline->to; + spline->to = spline->from; + spline->from = temp; + spline->from->next = spline; + spline->to->prev = spline; + SplineRefigure(spline); + if ( first==NULL ) first = spline; + } + + if ( spl->first!=spl->last ) { + temp = spl->first; + spl->first = spl->last; + spl->last = temp; + spl->first->prev = NULL; + spl->last->next = NULL; + } +return( spl ); +} + +void SplineSetsUntick(SplineSet *spl) { + Spline *spline, *first; + + while ( spl!=NULL ) { + first = NULL; + spl->first->isintersection = false; + for ( spline=spl->first->next; spline!=first && spline!=NULL; spline = spline->to->next ) { + spline->isticked = false; + spline->isneeded = false; + spline->isunneeded = false; + spline->ishorvert = false; + spline->to->isintersection = false; + if ( first==NULL ) first = spline; + } + spl = spl->next; + } +} + +static void SplineSetTick(SplineSet *spl) { + Spline *spline, *first; + + first = NULL; + for ( spline=spl->first->next; spline!=first && spline!=NULL; spline = spline->to->next ) { + spline->isticked = true; + if ( first==NULL ) first = spline; + } +} + +static SplineSet *SplineSetOfSpline(SplineSet *spl,Spline *search) { + Spline *spline, *first; + + while ( spl!=NULL ) { + first = NULL; + for ( spline=spl->first->next; spline!=first && spline!=NULL; spline = spline->to->next ) { + if ( spline==search ) +return( spl ); + if ( first==NULL ) first = spline; + } + spl = spl->next; + } +return( NULL ); +} + +int SplineInSplineSet(Spline *spline, SplineSet *spl) { + Spline *first, *s; + + first = NULL; + for ( s = spl->first->next; s!=NULL && s!=first; s = s->to->next ) { + if ( s==spline ) +return( true ); + if ( first==NULL ) first = s; + } +return( false ); +} + +#include "edgelist.h" + +static void EdgeListReverse(EdgeList *es, SplineSet *spl) { + int i; + + if ( es->edges!=NULL ) { + for ( i=0; icnt; ++i ) { + Edge *e; + for ( e = es->edges[i]; e!=NULL; e = e->esnext ) { + if ( SplineInSplineSet(e->spline,spl)) { + e->up = !e->up; + e->t_mmin = 1-e->t_mmin; + e->t_mmax = 1-e->t_mmax; + e->t_cur = 1-e->t_cur; + } + } + } + } +} + +static int SSCheck(SplineSet *base,Edge *active, int up, EdgeList *es,int *changed) { + SplineSet *spl; + if ( active->spline->isticked ) +return( 0 ); + spl = SplineSetOfSpline(base,active->spline); + if ( active->up!=up ) { + SplineSetReverse(spl); + *changed = true; + EdgeListReverse(es,spl); + } + SplineSetTick(spl); +return( 1 ); +} + +SplineSet *SplineSetsExtractOpen(SplineSet **tbase) { + SplineSet *spl, *openhead=NULL, *openlast=NULL, *prev=NULL, *snext; + + for ( spl= *tbase; spl!=NULL; spl = snext ) { + snext = spl->next; + if ( spl->first->prev==NULL ) { + if ( prev==NULL ) + *tbase = snext; + else + prev->next = snext; + if ( openhead==NULL ) + openhead = spl; + else + openlast->next = spl; + openlast = spl; + spl->next = NULL; + } else + prev = spl; + } +return( openhead ); +} + +void SplineSetsInsertOpen(SplineSet **tbase,SplineSet *open) { + SplineSet *e, *p, *spl, *next; + + for ( p=NULL, spl=*tbase, e=open; e!=NULL; e = next ) { + next = e->next; + while ( spl!=NULL && spl->first->ttfindexfirst->ttfindex ) { + p = spl; + spl = spl->next; + } + if ( p==NULL ) + *tbase = e; + else + p->next = e; + e->next = spl; + p = e; + } +} + +/* The idea behind SplineSetsCorrect is simple. However there are many splinesets */ +/* where it is impossible, so bear in mind that this only works for nice */ +/* splines. Figure 8's, interesecting splines all cause problems */ +/* The outermost spline should be clockwise (up), the next splineset we find */ +/* should be down, if it isn't reverse it (if it's already been dealt with */ +/* then ignore it) */ +SplineSet *SplineSetsCorrect(SplineSet *base,int *changed) { + SplineSet *spl; + int sscnt, check_cnt; + EdgeList es; + DBounds b; + Edge *active=NULL, *apt, *pr, *e; + int i, winding; + SplineSet *tbase; + + *changed = false; + + tbase = base; + + SplineSetsUntick(base); + for (sscnt=0,spl=base; spl!=NULL; spl=spl->next, ++sscnt ); + + SplineSetFindBounds(base,&b); + memset(&es,'\0',sizeof(es)); + es.scale = 1.0; + es.mmin = floor(b.miny*es.scale); + es.mmax = ceil(b.maxy*es.scale); + es.omin = b.minx*es.scale; + es.omax = b.maxx*es.scale; + +/* Give up if we are given unreasonable values (ie. if rounding errors might screw us up) */ + if ( es.mmin<1e5 && es.mmax>-1e5 && es.omin<1e5 && es.omax>-1e5 ) { + es.cnt = (int) (es.mmax-es.mmin) + 1; + es.edges = gcalloc(es.cnt,sizeof(Edge *)); + es.interesting = gcalloc(es.cnt,sizeof(char)); + es.sc = NULL; + es.major = 1; es.other = 0; + FindEdgesSplineSet(base,&es); + + check_cnt = 0; + for ( i=0; i0 && es.interesting[i-1]) && !(i>0 && es.edges[i-1]!=NULL) && + !(iup?1:-1; + for ( pr=apt, e=apt->aenext; e!=NULL && winding!=0; pr=e, e=e->aenext ) { + if ( !e->spline->isticked ) + check_cnt += SSCheck(base,e,winding<0,&es,changed); + if ( pr->up!=e->up ) + winding += (e->up?1:-1); + else if ( (pr->before==e || pr->after==e ) && + (( pr->mmax==i && e->mmin==i ) || + ( pr->mmin==i && e->mmax==i )) ) + /* This just continues the line and doesn't change count */; + else + winding += (e->up?1:-1); + } + /* color a horizontal line that comes out of the last vertex */ + if ( e!=NULL && (e->before==pr || e->after==pr) && + (( pr->mmax==i && e->mmin==i ) || + ( pr->mmin==i && e->mmax==i )) ) { + pr = e; + e = e->aenext; + } + } + } + FreeEdges(&es); + } +return( base ); +} + +SplineSet *SplineSetsAntiCorrect(SplineSet *base) { + int changed; + SplineSet *spl; + + SplineSetsCorrect(base,&changed); + for ( spl = base; spl!=NULL; spl = spl->next ) + SplineSetReverse(spl); +return( base ); +} + +/* This is exactly the same as SplineSetsCorrect, but instead of correcting */ +/* problems we merely search for them and if we find any return the first */ +SplineSet *SplineSetsDetectDir(SplineSet **_base,int *_lastscan) { + SplineSet *ret, *base; + EIList el; + EI *active=NULL, *apt, *pr, *e; + int i, winding,change,waschange; + int lastscan = *_lastscan; + SplineChar dummy; +#ifdef FONTFORGE_CONFIG_TYPE3 + Layer layers[2]; +#endif + + base = *_base; + + memset(&el,'\0',sizeof(el)); + memset(&dummy,'\0',sizeof(dummy)); +#ifdef FONTFORGE_CONFIG_TYPE3 + memset(layers,0,sizeof(layers)); + dummy.layers = layers; +#endif + dummy.layer_cnt = 2; + dummy.layers[ly_fore].splines = base; + ELFindEdges(&dummy,&el); + el.major = 1; + ELOrder(&el,el.major); + + ret = NULL; + waschange = false; + for ( i=0; iaenext->aenext; + continue; + } + if ( !apt->up ) { + ret = SplineSetOfSpline(base,active->spline); + break; + } + winding = apt->up?1:-1; + for ( pr=apt, e=apt->aenext; e!=NULL && winding!=0; pr=e, e=e->aenext ) { + if ( EISkipExtremum(e,i+el.low,1)) { + e = e->aenext; + continue; + } + if ( pr->up!=e->up ) { + if ( (winding<=0 && !e->up) || (winding>0 && e->up )) { + ret = SplineSetOfSpline(base,active->spline); + break; + } + winding += (e->up?1:-1); + } else if ( EISameLine(pr,e,i+el.low,1) ) + /* This just continues the line and doesn't change count */; + else { + if ( (winding<=0 && !e->up) || (winding>0 && e->up )) { + ret = SplineSetOfSpline(base,active->spline); + break; + } + winding += (e->up?1:-1); + } + } + } + } + free(el.ordered); + free(el.ends); + ElFreeEI(&el); + *_base = base; + *_lastscan = i; +return( ret ); +} + +int SplinePointListIsClockwise(SplineSet *spl) { + EIList el; + EI *active=NULL, *apt, *e; + int i, change,waschange; + SplineChar dummy; + SplineSet *next; + int ret = -1, maybe=-1; +#ifdef FONTFORGE_CONFIG_TYPE3 + Layer layers[2]; +#endif + + if ( spl->first!=spl->last || spl->first->next == NULL ) +return( -1 ); /* Open paths, (open paths with only one point are a special case) */ + + memset(&el,'\0',sizeof(el)); + memset(&dummy,'\0',sizeof(dummy)); +#ifdef FONTFORGE_CONFIG_TYPE3 + memset(layers,0,sizeof(layers)); + dummy.layers = layers; +#endif + dummy.layer_cnt = 2; + dummy.layers[ly_fore].splines = spl; + next = spl->next; spl->next = NULL; + ELFindEdges(&dummy,&el); + el.major = 1; + ELOrder(&el,el.major); + + waschange = false; + for ( i=0; iup; + continue; /* Just too hard to get the edges sorted when we are at a start vertex */ + } + waschange = change; + for ( apt=active; apt!=NULL && ret==-1; apt = e) { + if ( EISkipExtremum(apt,i+el.low,1)) { + e = apt->aenext->aenext; + continue; + } + ret = apt->up; + break; + } + } + free(el.ordered); + free(el.ends); + ElFreeEI(&el); + spl->next = next; + if ( ret==-1 ) + ret = maybe; +return( ret ); +} + +#if 0 +void SFFigureGrid(SplineFont *sf) { + /* Look for any horizontal/vertical lines in the grid splineset */ + int hsnaps[40], hcnt=0, vsnaps[40], vcnt=0, i; + SplineSet *ss; + Spline *s, *first; + + for ( ss = sf->gridsplines; ss!=NULL; ss=ss->next ) { + first = NULL; + for ( s=ss->first->next; s!=NULL && s!=first; s=s->to->next ) { + if ( s->knownlinear ) { + if ( s->from->me.x==s->to->me.x && hcnt<40 ) + hsnaps[hcnt++] = s->from->me.x; + if ( s->from->me.y==s->to->me.y && vcnt<40 ) + vsnaps[vcnt++] = s->from->me.y; + } + if ( first==NULL ) first = s; + } + } + + if ( sf->hsnaps!=NULL ) { + for ( i=0; ihsnaps[i]==hsnaps[i]; ++i ); + if ( i!=hcnt || sf->hsnaps[i]!=0x80000000 ) { + free( sf->hsnaps ); + sf->hsnaps = NULL; + } + } + if ( sf->vsnaps!=NULL ) { + for ( i=0; ivsnaps[i]==vsnaps[i]; ++i ); + if ( i!=vcnt || sf->vsnaps[i]!=0x80000000 ) { + free( sf->vsnaps ); + sf->vsnaps = NULL; + } + } + + if ( hcnt!=0 && sf->hsnaps==NULL ) { + sf->hsnaps = galloc((hcnt+1)*sizeof(int)); + memcpy(sf->hsnaps,hsnaps,hcnt*sizeof(int)); + sf->hsnaps[hcnt] = 0x80000000; + } + if ( vcnt!=0 && sf->vsnaps==NULL ) { + sf->vsnaps = galloc((vcnt+1)*sizeof(int)); + memcpy(sf->vsnaps,vsnaps,vcnt*sizeof(int)); + sf->vsnaps[vcnt] = 0x80000000; + } +} +#endif diff --git a/fontforge/stamp.c b/fontforge/stamp.c new file mode 100644 index 00000000..828bed05 --- /dev/null +++ b/fontforge/stamp.c @@ -0,0 +1,5 @@ +#include + +const time_t source_modtime = 1078254177; +const char *source_modtime_str = "11:02 2-Mar-2004"; +const char *source_version_str = "20040302"; diff --git a/fontforge/stamper.c b/fontforge/stamper.c new file mode 100644 index 00000000..a476bb83 --- /dev/null +++ b/fontforge/stamper.c @@ -0,0 +1,20 @@ +#include +#include + +static const char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", + "Aug", "Sep", "Oct", "Nov", "Dec", NULL }; +int main() { + time_t now; + struct tm *tm; + + time(&now); + tm = localtime(&now); + printf( "#include \n\n" ); + printf( "const time_t source_modtime = %ld;\n", now); + printf( "const char *source_modtime_str = \"%02d:%02d %d-%s-%d\";\n", + tm->tm_hour, tm->tm_min, + tm->tm_mday, months[tm->tm_mon], tm->tm_year+1900 ); + printf( "const char *source_version_str = \"%04d%02d%02d\";\n", + tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday ); +return( 0 ); +} diff --git a/fontforge/start.c b/fontforge/start.c new file mode 100644 index 00000000..6ee84cb9 --- /dev/null +++ b/fontforge/start.c @@ -0,0 +1,475 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "gfile.h" +#include "gresource.h" +#include +#include +#include +#include +#include +#if !defined(_NO_LIBUNINAMESLIST) && !defined(_STATIC_LIBUNINAMESLIST) && !defined(NODYNAMIC) +# include +#endif + +unsigned short unicode_from_adobestd[256]; +struct lconv localeinfo; +char *coord_sep = ","; /* Not part of locale data */ +const struct unicode_nameannot * const *const *_UnicodeNameAnnot = NULL; + +static void initadobeenc(void) { + int i,j; + + for ( i=0; i<0x100; ++i ) { + if ( strcmp(AdobeStandardEncoding[i],".notdef")==0 ) + unicode_from_adobestd[i] = 0xfffd; + else { + j = UniFromName(AdobeStandardEncoding[i]); + if ( j==-1 ) j = 0xfffd; + unicode_from_adobestd[i] = j; + } + } +} + +static void inituninameannot(void) { +#if _NO_LIBUNINAMESLIST + _UnicodeNameAnnot = NULL; +#elif defined(_STATIC_LIBUNINAMESLIST) || defined(NODYNAMIC) + extern const struct unicode_nameannot * const * const UnicodeNameAnnot[]; + _UnicodeNameAnnot = UnicodeNameAnnot; +#else + DL_CONST void *libuninames=NULL; +# ifdef LIBDIR + libuninames = dlopen( LIBDIR "/libuninameslist" SO_EXT,RTLD_LAZY); +# endif + if ( libuninames==NULL ) + libuninames = dlopen( "libuninameslist" SO_EXT,RTLD_LAZY); + if ( libuninames!=NULL ) + _UnicodeNameAnnot = dlsym(libuninames,"UnicodeNameAnnot"); +#endif +} + +void doversion(void) { + extern const char *source_version_str; + printf( "pfaedit %s\n", source_version_str ); +exit(0); +} + +static void _dousage(void) { + printf( "fontforge [options] [fontfiles]\n" ); + printf( "\t-new\t\t\t (creates a new font)\n" ); +#if HANYANG + printf( "\t-newkorean\t\t (creates a new korean font)\n" ); +#endif + printf( "\t-recover none|auto|clean (control error recovery)\n" ); + printf( "\t-nosplash\t\t (no splash screen)\n" ); + printf( "\t-display display-name\t (sets the X display)\n" ); + printf( "\t-depth val\t\t (sets the display depth if possible)\n" ); + printf( "\t-vc val\t\t\t (sets the visual class if possible)\n" ); + printf( "\t-cmap current|copy|private\t (sets the type of colormap)\n" ); + printf( "\t-sync\t\t\t (syncs the display, debugging)\n" ); + printf( "\t-keyboard ibm|mac|sun|ppc (generates appropriate hotkeys in menus)\n" ); +#if MyMemory + printf( "\t-memory\t\t\t (turns on memory checks, debugging)\n" ); +#endif + printf( "\t-usage\t\t\t (displays this message, and exits)\n" ); + printf( "\t-help\t\t\t (displays this message, invokes a browser)\n\t\t\t\t (Using the BROWSER environment variable)\n" ); + printf( "\t-version\t\t (prints the version of fontforge and exits)\n" ); + printf( "\t-script scriptfile\t (executes scriptfile)\n" ); + printf( "\t\tmust be the first option. All others passed to scriptfile.\n" ); + printf( "\n" ); + printf( "FontForge will read postscript (pfa, pfb, ps, cid), opentype (otf),\n" ); + printf( "\ttruetype (ttf,ttc), macintosh resource fonts (dfont,bin,hqx),\n" ); + printf( "\tand bdf and pcf fonts. It will also read it's own format --\n" ); + printf( "\tsfd files.\n" ); + printf( "If no fontfiles are specified (and -new is not either and there's nothing\n" ); + printf( "\tto recover) then fontforge will produce an open font dlg.\n" ); + printf( "If a scriptfile is specified then FontForge will not open the X display\n" ); + printf( "\tnor will it process any additional arguments. It will execute the\n" ); + printf( "\tscriptfile and give it any remaining arguments\n" ); + printf( "If the first argument is an executable filename, and that file's first\n" ); + printf( "\tline contains \"fontforge\" then it will be treated as a scriptfile.\n\n" ); + printf( "For more information see:\n\thttp://fontforge.sourceforge.net/\n" ); + printf( "Send bug reports to:\tfontforge-devel@lists.sourceforge.net\n" ); +} + +static void dousage(void) { + _dousage(); +exit(0); +} + +static void dohelp(void) { + _dousage(); + help("overview.html"); +exit(0); +} + +static void initrand(void) { + struct timeval tv; + + gettimeofday(&tv,NULL); + srand(tv.tv_usec); +} + +static void BuildCharHook(GDisplay *gd) { + GWidgetCreateInsChar(); +} + +static void InsCharHook(GDisplay *gd,unichar_t ch) { + GInsCharSetChar(ch); +} + +extern GImage splashimage; +static GWindow splashw; +static GTimer *autosave_timer, *splasht; +static GFont *splash_font, *splash_italic; +static int as,fh, linecnt; +static unichar_t msg[350]; +static unichar_t *lines[20], *is, *ie; + +struct delayed_event { + void *data; + void (*func)(void *); +}; + +void ShowAboutScreen(void) { + static int first=1; + + if ( first ) { + GDrawResize(splashw,splashimage.u.image->width,splashimage.u.image->height+linecnt*fh); + first = false; + } + if ( splasht!=NULL ) + GDrawCancelTimer(splasht); + splasht=NULL; + GDrawSetVisible(splashw,true); +} + +static void SplashLayout() { + unichar_t *start, *pt, *lastspace; + extern const char *source_modtime_str; + extern const char *source_version_str; + + uc_strcpy(msg, "When my father finished his book on Renaissance printing (The Craft of Printing and the Publication of Shakespeare's Works) he told me that I would have to write the chapter on computer typography. This is my attempt to do so."); + + GDrawSetFont(splashw,splash_font); + linecnt = 0; + lines[linecnt++] = msg-1; + for ( start = msg; *start!='\0'; start = pt ) { + lastspace = NULL; + for ( pt=start; ; ++pt ) { + if ( *pt==' ' || *pt=='\0' ) { + if ( GDrawGetTextWidth(splashw,start,pt-start,NULL)width-10 ) + lastspace = pt; + else + break; + if ( *pt=='\0' ) + break; + } + } + if ( lastspace!=NULL ) + pt = lastspace; + lines[linecnt++] = pt; + if ( *pt ) ++pt; + } + uc_strcpy(pt, " FontForge used to be named PfaEdit."); + pt += u_strlen(pt); + lines[linecnt++] = pt; + uc_strcpy(pt," Version: ");; + uc_strcat(pt,source_modtime_str); + uc_strcat(pt," ("); + uc_strcat(pt,source_version_str); + uc_strcat(pt,")"); + lines[linecnt++] = pt+u_strlen(pt); + lines[linecnt] = NULL; + is = u_strchr(msg,'('); + ie = u_strchr(msg,')'); +} + +void DelayEvent(void (*func)(void *), void *data) { + struct delayed_event *info = gcalloc(1,sizeof(struct delayed_event)); + + info->data = data; + info->func = func; + GDrawRequestTimer(splashw,100,0,info); +} + +static void DoDelayedEvents(GEvent *event) { + GTimer *t = event->u.timer.timer; + struct delayed_event *info = (struct delayed_event *) (event->u.timer.userdata); + + if ( info!=NULL ) { + (info->func)(info->data); + free(info); + } + GDrawCancelTimer(t); +} + +static int splash_e_h(GWindow gw, GEvent *event) { + static int splash_cnt; + GRect old; + int i, y, x; + static int foolishness[] = { + _STR_FreePress, + _STR_FreePress, + _STR_GaudiamusLigature, + _STR_GaudiamusLigature, + _STR_InTheBeginning, + _STR_LovelyFonts + }; + + if ( event->type == et_expose ) { + GDrawPushClip(gw,&event->u.expose.rect,&old); + GDrawDrawImage(gw,&splashimage,NULL,0,0); + GDrawSetFont(gw,splash_font); + y = splashimage.u.image->height + as + fh/2; + for ( i=1; i=lines[i-1]+1 && is=lines[i-1]+1 && ietype == et_map ) { + splash_cnt = 0; + } else if ( event->type == et_timer && event->u.timer.timer==autosave_timer ) { + DoAutoSaves(); + } else if ( event->type == et_timer && event->u.timer.timer==splasht ) { + if ( ++splash_cnt==1 ) + GDrawResize(gw,splashimage.u.image->width,splashimage.u.image->height-17); + else if ( splash_cnt==2 ) + GDrawResize(gw,splashimage.u.image->width,splashimage.u.image->height); + else if ( splash_cnt>=7 ) { + GGadgetEndPopup(); + GDrawSetVisible(gw,false); + GDrawCancelTimer(splasht); + splasht = NULL; + } + } else if ( event->type == et_timer ) { + DoDelayedEvents(event); + } else if ( event->type==et_char || event->type==et_mousedown || + event->type==et_close ) { + GGadgetEndPopup(); + GDrawSetVisible(gw,false); + } else if ( event->type==et_mousemove ) { + GGadgetPreparePopupR(gw,foolishness[rand()%(sizeof(foolishness)/sizeof(foolishness[0]))] ); + } +return( true ); +} + +static void AddR(char *prog, char *name, char *val ) { + char *full = galloc(strlen(name)+strlen(val)+4); + strcpy(full,name); + strcat(full,": "); + strcat(full,val); + GResourceAddResourceString(full,prog); +} + +int main( int argc, char **argv ) { + int i; + GRect pos; + GWindowAttrs wattrs; + extern const char *source_modtime_str; + int splash = 1; + int any; + char *display = NULL; + int recover=1; + FontRequest rq; + static unichar_t times[] = { 't', 'i', 'm', 'e', 's',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + int ds, ld; + int next_recent=0; + + fprintf( stderr, "Copyright (c) 2000-2004 by George Williams.\n Executable based on sources from %s.\n", + source_modtime_str ); + fprintf( stderr, "FontForge used to be named PfaEdit.\n" ); + setlocale(LC_ALL,""); + localeinfo = *localeconv(); + coord_sep = ","; + if ( *localeinfo.decimal_point=='.' ) coord_sep=","; + else if ( *localeinfo.decimal_point!='.' ) coord_sep=" "; + GResourceAddResourceString(NULL,argv[0]); + LoadPrefs(); + initadobeenc(); + inituninameannot(); + initrand(); + CheckIsScript(argc,argv); /* Will run the script and exit if it is a script */ + + for ( i=1; iwidth; + pos.height = splashimage.u.image->height-54; + splashw = GDrawCreateTopWindow(NULL,&pos,splash_e_h,NULL,&wattrs); + memset(&rq,0,sizeof(rq)); + rq.family_name = times; + rq.point_size = 12; + rq.weight = 400; + splash_font = GDrawInstanciateFont(NULL,&rq); + rq.style = fs_italic; + splash_italic = GDrawInstanciateFont(NULL,&rq); + GDrawSetFont(splashw,splash_font); + GDrawFontMetrics(splash_font,&as,&ds,&ld); + fh = as+ds+ld; + SplashLayout(); + if ( splash ) { + GDrawSetVisible(splashw,true); + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + GDrawProcessPendingEvents(NULL); + splasht = GDrawRequestTimer(splashw,1000,1000,NULL); + } + autosave_timer=GDrawRequestTimer(splashw,60*1000,30*1000,NULL); + + GDrawProcessPendingEvents(NULL); + GDrawSetBuildCharHooks(BuildCharHook,InsCharHook); + + any = 0; + if ( recover==-1 ) + CleanAutoRecovery(); + else if ( recover ) + any = DoAutoRecovery(); + + for ( i=1; i +#include +#include +#include + +#define CID_New 300 +#define CID_Edit 301 +#define CID_Delete 302 +#define CID_Classes 305 + +#define CID_FeatSet 306 + +#define CID_Ok 307 +#define CID_Cancel 308 + +#define CID_Line1 309 +#define CID_Line2 310 +#define CID_Group 311 +#define CID_Group2 312 + +#define CID_Set 313 +#define CID_Select 314 +#define CID_GlyphList 315 +#define CID_Next 316 +#define CID_Prev 317 + +#define CID_RightToLeft 318 +#define CID_VertOnly 319 + +#define SMD_WIDTH 350 +#define SMD_HEIGHT 400 +#define SMD_CANCELDROP 32 +#define SMD_DIRDROP 88 + +#define CID_NextState 400 +#define CID_Flag4000 401 +#define CID_Flag8000 402 +#define CID_Flag2000 403 +#define CID_Flag1000 404 +#define CID_Flag0800 405 +#define CID_Flag0400 406 +#define CID_IndicVerb 407 +#define CID_InsCur 408 +#define CID_InsMark 409 +#define CID_TagCur 410 +#define CID_TagMark 411 +#define CID_Kerns 412 +#define CID_StateClass 413 + +#define CID_Up 420 +#define CID_Down 421 +#define CID_Left 422 +#define CID_Right 423 + +#define SMDE_WIDTH 200 +#define SMDE_HEIGHT (SMD_DIRDROP+200) + +extern int _GScrollBar_Width; + +typedef struct statemachinedlg { + GWindow gw, cw, editgw; + int state_cnt, class_cnt, index; + struct asm_state *states; + GGadget *hsb, *vsb; + ASM *sm; + SplineFont *sf; + struct gfi_data *d; + int isnew; + GFont *font; + int fh, as; + int stateh, statew; + int xstart, ystart; /* This is where the headers start */ + int xstart2, ystart2; /* This is where the data start */ + int width, height; + int offleft, offtop; + int canceldrop, sbdrop; + GTextInfo *mactags; + int isedit; + int st_pos; + int edit_done, edit_ok; +} SMD; + +static int SMD_SBReset(SMD *smd); +static void SMD_HShow(SMD *smd,int pos); + +static char *indicverbs[2][16] = { + { "", "Ax", "xD", "AxD", "ABx", "ABx", "xCD", "xCD", + "AxCD", "AxCD", "ABxD", "ABxD", "ABxCD", "ABxCD", "ABxCD", "ABxCD" }, + { "", "xA", "Dx", "DxA", "xAB", "xBA", "CDx", "DCx", + "CDxA", "DCxA", "DxAB", "DxBA", "CDxAB", "CDxBA", "DCxAB", "DCxBA" }}; + +static void StatesFree(struct asm_state *old,int old_class_cnt,int old_state_cnt, + enum asm_type type) { + int i, j; + + if ( type==asm_insert ) { + for ( i=0; iu.insert.mark_ins); + free(this->u.insert.cur_ins); + } + } + } else if ( type==asm_kern ) { + for ( i=0; iu.kern.kerns); + } + } + } + free(old); +} + +static struct asm_state *StateCopy(struct asm_state *old,int old_class_cnt,int old_state_cnt, + int new_class_cnt,int new_state_cnt, enum asm_type type,int freeold) { + struct asm_state *new = gcalloc(new_class_cnt*new_state_cnt,sizeof(struct asm_state)); + int i,j; + int minclass = new_class_cntu.insert.mark_ins = copy(this->u.insert.mark_ins); + this->u.insert.cur_ins = copy(this->u.insert.cur_ins); + } + } else if ( type==asm_kern ) { + for ( j=0; ju.kern.kcnt*sizeof(int16)); + memcpy(temp,this->u.kern.kerns,this->u.kern.kcnt*sizeof(int16)); + this->u.kern.kerns = temp; + } + } + } + for ( ; iclass_cnt; ++i ) + if ( removethese[i]->selected ) + ++remove_cnt; + if ( remove_cnt==0 ) +return; + + new = gcalloc((smd->class_cnt-remove_cnt)*smd->state_cnt,sizeof(struct asm_state)); + for ( i=0; istate_cnt ; ++i ) { + for ( j=k=0; jclass_cnt; ++j ) { + if ( !removethese[j]->selected ) + new[i*(smd->class_cnt-remove_cnt)+k++] = smd->states[i*smd->class_cnt+j]; + else if ( smd->sm->type==asm_insert ) { + free(smd->states[i*smd->class_cnt+j].u.insert.mark_ins); + free(smd->states[i*smd->class_cnt+j].u.insert.cur_ins); + } else if ( smd->sm->type==asm_kern ) { + free(smd->states[i*smd->class_cnt+j].u.kern.kerns); + } + } + } + + free(smd->states); + smd->states = new; + smd->class_cnt -= remove_cnt; +} + +static int FindMaxReachableStateCnt(SMD *smd) { + int max_reachable = 1; + int i, j, ns; + + for ( i=0; i<=max_reachable && istate_cnt; ++i ) { + for ( j=0; jclass_cnt; ++j ) { + ns = smd->states[i*smd->class_cnt+j].next_state; + if ( ns>max_reachable ) + max_reachable = ns; + } + } +return( max_reachable+1 ); /* The count is one more than the max */ +} + +/* ************************************************************************** */ +/* *************** Routines to test conversion from OpenType **************** */ +/* ************************************************************************** */ + +static int ValidSubs(SplineFont *sf,uint32 tag ) { + int i, any=false; + PST *pst; + + for ( i = 0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( pst=sf->chars[i]->possub; pst!=NULL && pst->tag!=tag; pst=pst->next ); + if ( pst!=NULL && pst->script_lang_index==SLI_NESTED ) { + if ( pst->type==pst_substitution ) + any = true; + else +return( false ); + } + } +return( any ); +} + +static void TreeFree(struct contexttree *tree) { + int i; + for ( i=0; ibranch_cnt; ++i ) + TreeFree(tree->branches[i].branch); + + free( tree->branches ); + free( tree->rules ); + chunkfree( tree,sizeof(*tree) ); +} + +static int TreeLabelState(struct contexttree *tree, int snum) { + int i; + + if ( tree->branch_cnt==0 && tree->ends_here!=NULL ) { + tree->state = 0; +return( snum ); + } + + tree->state = snum++; + for ( i=0; ibranch_cnt; ++i ) + snum = TreeLabelState(tree->branches[i].branch,snum); + tree->next_state = snum; + +return( snum ); +} + +static uint32 RuleHasSubsHere(struct fpst_rule *rule,int depth) { + int i,j; + + if ( depthu.class.bcnt ) +return( 0 ); + depth -= rule->u.class.bcnt; + if ( depth>=rule->u.class.ncnt ) +return( 0 ); + for ( i=0; ilookup_cnt; ++i ) { + if ( rule->lookups[i].seq==depth ) { + /* It is possible to have two substitutions applied at the same */ + /* location. I can't deal with that here */ + for ( j=i+1; jlookup_cnt; ++j ) { + if ( rule->lookups[j].seq==depth ) +return( 0xffffffff ); + } +return( rule->lookups[i].lookup_tag ); + } + } + +return( 0 ); +} + +static uint32 RulesAllSameSubsAt(struct contexttree *me,int pos) { + int i; + uint32 tag=0x01, newtag; /* Can't use 0 as an "unused" flag because it is perfectly valid for there to be no substititution. But then all rules must have no subs */ + + for ( i=0; irule_cnt; ++i ) { + newtag = RuleHasSubsHere(me->rules[i].rule,pos); + if ( tag==0x01 ) + tag=newtag; + else if ( newtag!=tag ) +return( 0xffffffff ); + } +return( tag ); +} + +static int TreeFollowBranches(SplineFont *sf,struct contexttree *me,int pending_pos) { + int i, j; + + me->pending_pos = pending_pos; + if ( me->ends_here!=NULL ) { + /* If any rule ends here then we have to be able to apply all current */ + /* and pending substitutions */ + if ( pending_pos!=-1 ) { + me->applymarkedsubs = RulesAllSameSubsAt(me,pending_pos); + if ( me->applymarkedsubs==0xffffffff ) +return( false ); + if ( !ValidSubs(sf,me->applymarkedsubs)) +return( false ); + } + me->applycursubs = RulesAllSameSubsAt(me,me->depth); + if ( me->applycursubs==0xffffffff ) +return( false ); + if ( me->applycursubs!=0 && !ValidSubs(sf,me->applycursubs)) +return( false ); + for ( i=0; ibranch_cnt; ++i ) { + if ( !TreeFollowBranches(sf,me->branches[i].branch,-1)) +return( false ); + } + } else { + for ( i=0; ibranch_cnt; ++i ) { + for ( j=0; jrule_cnt; ++j ) + if ( me->rules[j].branch==me->branches[i].branch && + RuleHasSubsHere(me->rules[j].rule,me->depth)) + break; + if ( jrule_cnt ) { + if ( pending_pos==-1 ) { + pending_pos = me->pending_pos = me->depth; + me->markme = true; + } else +return( false ); + } + if ( !TreeFollowBranches(sf,me->branches[i].branch,pending_pos)) +return( false ); + } + } + +return( true ); +} + +static struct contexttree *_FPST2Tree(FPST *fpst,struct contexttree *parent,int class) { + struct contexttree *me = chunkalloc(sizeof(struct contexttree)); + int i, rcnt, ccnt, k, thisclass; + uint16 *classes; + + if ( fpst!=NULL ) { + me->depth = -1; + me->rule_cnt = fpst->rule_cnt; + me->rules = gcalloc(me->rule_cnt,sizeof(struct ct_subs)); + for ( i=0; irule_cnt; ++i ) + me->rules[i].rule = &fpst->rules[i]; + me->parent = NULL; + } else { + me->depth = parent->depth+1; + for ( i=rcnt=0; irule_cnt; ++i ) + if ( parent->rules[i].rule->u.class.allclasses[me->depth] == class ) + ++rcnt; + me->rule_cnt = rcnt; + me->rules = gcalloc(me->rule_cnt,sizeof(struct ct_subs)); + for ( i=rcnt=0; irule_cnt; ++i ) + if ( parent->rules[i].rule->u.class.allclasses[me->depth] == class ) + me->rules[rcnt++].rule = parent->rules[i].rule; + me->parent = parent; + } + classes = galloc(me->rule_cnt*sizeof(uint16)); + for ( i=ccnt=0; irule_cnt; ++i ) { + thisclass = me->rules[i].thisclassnum = me->rules[i].rule->u.class.allclasses[me->depth+1]; + if ( thisclass==0xffff ) { + if ( me->ends_here==NULL ) + me->ends_here = me->rules[i].rule; + } else { + for ( k=0; kbranch_cnt = ccnt; + me->branches = gcalloc(ccnt,sizeof(struct ct_branch)); + for ( i=0; ibranches[i].classnum = classes[i]; + for ( i=0; ibranches[i].branch = _FPST2Tree(NULL,me,classes[i]); + for ( k=0; krule_cnt; ++k ) + if ( classes[i]==me->rules[k].thisclassnum ) + me->rules[k].branch = me->branches[i].branch; + } + free(classes ); +return( me ); +} + +static void FPSTBuildAllClasses(FPST *fpst) { + int i, off,j; + + for ( i=0; irule_cnt; ++i ) { + fpst->rules[i].u.class.allclasses = galloc((fpst->rules[i].u.class.bcnt+ + fpst->rules[i].u.class.ncnt+ + fpst->rules[i].u.class.fcnt+ + 1)*sizeof(uint16)); + off = fpst->rules[i].u.class.bcnt; + for ( j=0; jrules[i].u.class.allclasses[j] = fpst->rules[i].u.class.bclasses[off-1-j]; + for ( j=0; jrules[i].u.class.ncnt; ++j ) + fpst->rules[i].u.class.allclasses[off+j] = fpst->rules[i].u.class.nclasses[j]; + off += j; + for ( j=0; jrules[i].u.class.fcnt; ++j ) + fpst->rules[i].u.class.allclasses[off+j] = fpst->rules[i].u.class.fclasses[j]; + fpst->rules[i].u.class.allclasses[off+j] = 0xffff; /* End of rule marker */ + } +} + +static void FPSTFreeAllClasses(FPST *fpst) { + int i; + + for ( i=0; irule_cnt; ++i ) { + free( fpst->rules[i].u.class.allclasses ); + fpst->rules[i].u.class.allclasses = NULL; + } +} + +static struct contexttree *FPST2Tree(SplineFont *sf,FPST *fpst) { + struct contexttree *ret; + + if ( fpst->format != pst_class ) +return( NULL ); + + /* I could check for subclasses rather than ClassesMatch, but then I'd have */ + /* to make sure that class 0 was used (if at all) consistently */ + if ( (fpst->bccnt!=0 && !ClassesMatch(fpst->bccnt,fpst->bclass,fpst->nccnt,fpst->nclass)) || + (fpst->fccnt!=0 && !ClassesMatch(fpst->fccnt,fpst->fclass,fpst->nccnt,fpst->nclass))) +return( NULL ); + + FPSTBuildAllClasses(fpst); + + ret = _FPST2Tree(fpst,NULL,0); + + if ( !TreeFollowBranches(sf,ret,-1) ) { + TreeFree(ret); + ret = NULL; + } + + FPSTFreeAllClasses(fpst); + + TreeLabelState(ret,1); /* actually, it's states 0&1, but this will do */ + +return( ret ); +} + +static struct contexttree *TreeNext(struct contexttree *cur) { + struct contexttree *p; + int i; + + if ( cur->branch_cnt!=0 ) +return( cur->branches[0].branch ); + else { + forever { + p = cur->parent; + if ( p==NULL ) +return( NULL ); + for ( i=0; ibranch_cnt; ++i ) { + if ( p->branches[i].branch==cur ) { + ++i; + break; + } + } + if ( ibranch_cnt ) +return( p->branches[i].branch ); + cur = p; + } + } +} + +int FPSTisMacable(SplineFont *sf, FPST *fpst, int checktag) { + int i; + int featureType, featureSetting; + struct contexttree *ret; + + if ( fpst->type!=pst_contextsub && fpst->type!=pst_chainsub ) +return( false ); + if ( !SLIHasDefault(sf,fpst->script_lang_index)) +return( false ); + if ( checktag && !OTTagToMacFeature(fpst->tag,&featureType,&featureSetting) ) +return( false ); + + if ( fpst->format == pst_glyphs ) { + FPST *tempfpst = FPSTGlyphToClass(fpst); + ret = FPST2Tree(sf, tempfpst); + FPSTFree(tempfpst); + TreeFree(ret); +return( ret!=NULL ); + } else if ( fpst->format == pst_class ) { + ret = FPST2Tree(sf, fpst); + TreeFree(ret); +return( ret!=NULL ); + } else if ( fpst->format != pst_coverage ) +return( false ); + + for ( i=0; irule_cnt; ++i ) { + if ( fpst->rules[i].u.coverage.ncnt+ + fpst->rules[i].u.coverage.bcnt+ + fpst->rules[i].u.coverage.fcnt>=10 ) +return( false ); /* Let's not make a state machine this complicated */ + + if ( fpst->rules[i].lookup_cnt==2 ) { + switch ( fpst->format ) { + case pst_coverage: + /* Second substitution must be on the final glyph */ + if ( fpst->rules[i].u.coverage.fcnt!=0 || + fpst->rules[i].lookups[0].seq==fpst->rules[i].lookups[1].seq || + (fpst->rules[i].lookups[0].seq!=fpst->rules[i].u.coverage.ncnt-1 && + fpst->rules[i].lookups[1].seq!=fpst->rules[i].u.coverage.ncnt-1) ) +return( false ); + break; + default: +return( false ); + } + if ( !ValidSubs(sf,fpst->rules[i].lookups[1].lookup_tag) ) +return( false ); + + } else if ( fpst->rules[i].lookup_cnt!=1 ) +return( false ); + if ( !ValidSubs(sf,fpst->rules[i].lookups[0].lookup_tag) ) +return( false ); + } + +return( fpst->rule_cnt>0 ); +} + +/* ************************************************************************** */ +/* *************** Conversion from OpenType Context/Chaining **************** */ +/* ************************************************************************** */ + + /* ********************** From Forms ********************** */ +static int IsMarkChar( SplineChar *sc ) { + AnchorPoint *ap; + + ap=sc->anchor; + while ( ap!=NULL && (ap->type==at_centry || ap->type==at_cexit) ) + ap = ap->next; + if ( ap!=NULL && (ap->type==at_mark || ap->type==at_basemark) ) +return( true ); + +return( false ); +} + +static char *GlyphListToNames(SplineChar **classglyphs) { + int i, len; + char *ret, *pt; + + for ( i=len=0; classglyphs[i]!=NULL; ++i ) + len += strlen(classglyphs[i]->name)+1; + ret = pt = galloc(len+1); + for ( i=0; classglyphs[i]!=NULL; ++i ) { + strcpy(pt,classglyphs[i]->name); + pt += strlen(pt); + *pt++ = ' '; + } + if ( pt>ret ) + pt[-1] = '\0'; + else + *ret = '\0'; +return( ret ); +} + +static char *BuildMarkClass(SplineFont *sf) { + SplineChar *sc, **markglyphs; + int i, mg; + char *ret; + + mg = 0; + markglyphs = galloc(sf->charcnt*sizeof(SplineChar *)); + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + if ( IsMarkChar(sc)) { + markglyphs[mg++] = sc; + } + } + markglyphs[mg] = NULL; + ret = GlyphListToNames(markglyphs); + free(markglyphs); +return(ret); +} + +static char *BuildClassNames(SplineChar **glyphs,uint16 *map, int classnum) { + int i, len; + char *ret, *pt; + + for ( i=len=0; glyphs[i]!=NULL; ++i ) { + if ( map[i]==classnum ) + len += strlen(glyphs[i]->name)+1; + } + ret = pt = galloc(len+1); + for ( i=len=0; glyphs[i]!=NULL; ++i ) { + if ( map[i]==classnum ) { + strcpy(pt,glyphs[i]->name); + pt += strlen(pt); + *pt++ = ' '; + } + } + if ( pt>ret ) + pt[-1] = '\0'; + else + *ret = '\0'; +return( ret ); +} + +static void BuildNestedFormSubs(SplineFont *sf,SplineChar **glyphs, + SplineChar **forms[4], uint32 tags[4], int flags) { + int any[4]; + int i,j; + + memset(any,0,sizeof(any)); + for ( i=0; glyphs[i]!=NULL; ++i ) { + for ( j=0; j<4; ++j ) + if ( forms[j][i]) + any[j] = true; + } + + memset(tags,0,4*sizeof(uint32)); + for ( j=0; j<4; ++j ) if ( any[j] ) + tags[j] = SFGenerateNewFeatureTag(&sf->gentags,pst_substitution,0); + + for ( i=0; glyphs[i]!=NULL; ++i ) { + for ( j=0; j<4; ++j ) { + if ( forms[j][i]!=NULL ) { + if ( glyphs[i]!=forms[j][i] ) + glyphs[i]->possub = AddSubs(glyphs[i]->possub,tags[j],forms[j][i]->name, + flags,SLI_NESTED,NULL); + if ( j==2 && forms[1][i]!=NULL ) /* Final must be prepared to convert both base chars and medial chars */ + forms[1][i]->possub = AddSubs(forms[1][i]->possub,tags[j],forms[j][i]->name,flags, + SLI_NESTED,NULL); + else if ( j==3 && forms[0][i]!=NULL ) /* Isolated must convert both base and initial chars */ + forms[0][i]->possub = AddSubs(forms[0][i]->possub,tags[j],forms[j][i]->name,flags, + SLI_NESTED,NULL); + } + } + } +} + +ASM *ASMFromOpenTypeForms(SplineFont *sf,int sli,int flags) { + int i, gcnt, f, any, which, cg, mg, ng; + SplineChar *sc, *rsc, **glyphs, **classglyphs, **markglyphs; + SplineChar **forms[4]; + PST *pst; + uint32 script; + uint32 tags[4]; + int found; + ASM *sm; + + glyphs = galloc(sf->charcnt*sizeof(SplineChar *)); + classglyphs = galloc(sf->charcnt*sizeof(SplineChar *)); + markglyphs = galloc(sf->charcnt*sizeof(SplineChar *)); + for ( i=0; i<4; ++i ) + forms[i] = gcalloc(sf->charcnt,sizeof(SplineChar *)); + + gcnt = 0; + for ( f=0; f<4; ++f) forms[f][gcnt] = NULL; + found = 0; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + any = false; + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) if ( pst->script_lang_index==sli && pst->flags==flags ) { + if ( pst->tag==CHR('i','n','i','t')) which = 0; + else if ( pst->tag==CHR('m','e','d','i')) which = 1; + else if ( pst->tag==CHR('f','i','n','a')) which = 2; + else if ( pst->tag==CHR('i','s','o','l')) which = 3; + else + continue; + found |= 1<u.subs.variant); + forms[which][gcnt] = rsc; + any = true; + } + if ( any ) { + /* Currently I transform all isolated chars to initial first */ + /* so if the isolated char, is just the char unchanged, I have to change it back */ + /* Similarly for medial & final */ + if ( forms[0][gcnt]!=NULL && forms[3][gcnt]==NULL ) forms[3][gcnt] = sc; + if ( forms[1][gcnt]!=NULL && forms[2][gcnt]==NULL ) forms[2][gcnt] = sc; + glyphs[gcnt++] = sc; + for ( f=0; f<4; ++f) forms[f][gcnt] = NULL; + } + } + glyphs[gcnt] = NULL; + if ( gcnt==0 ) { + for ( f=0; f<4; ++f) free(forms[f]); free(glyphs); +return( NULL ); + } + script =SCScriptFromUnicode(glyphs[0]); + + sm = chunkalloc(sizeof(ASM)); + sm->type = asm_context; + sm->flags = (flags&pst_r2l) ? asm_descending : 0; + sm->opentype_tag = (found&1) ? CHR('i','n','i','t') : + (found&2) ? CHR('m','e','d','i') : + (found&4) ? CHR('f','i','n','a') : + CHR('i','s','o','l'); + /* Only one (or two) classes of any importance: Letter in this script */ + /* might already be formed. Might be a lig. Might be normal */ + /* Oh, if ignoremarks is true, then combining marks merit a class of their own */ + sm->class_cnt = (flags&pst_ignorecombiningmarks) ? 6 : 5; + sm->classes = gcalloc(sm->class_cnt,sizeof(char *)); + + cg = mg = ng = 0; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + if ( (flags&pst_ignorecombiningmarks) && IsMarkChar(sc)) { + markglyphs[mg++] = sc; + if ( sc==glyphs[ng]) ++ng; + } else if ( sc==glyphs[ng] ) { + classglyphs[cg++] = sc; + ++ng; + } else if ( SCScriptFromUnicode(sc)==script ) + classglyphs[cg++] = sc; + } + classglyphs[cg] = NULL; + sm->classes[4] = GlyphListToNames(classglyphs); + if ( flags&pst_ignorecombiningmarks ) { + markglyphs[mg] = NULL; + sm->classes[5] = GlyphListToNames(markglyphs); + } + free(classglyphs); free(markglyphs); + + BuildNestedFormSubs(sf,glyphs,forms,tags,flags); + free(glyphs); + for ( i=0; i<4; ++i ) free(forms[i]); + + /* State 0,1 are start states */ + /* State 2 means we have found one interesting letter, transformed current to 'init' and marked it (in case we need to make it isolated) */ + /* State 3 means we have found two interesting letters, transformed current to 'medi' and marked (in case we need to make it final) */ + sm->state_cnt = 4; + sm->state = gcalloc(sm->state_cnt*sm->class_cnt,sizeof(struct asm_state)); + + sm->state[4].next_state = 2; + sm->state[4].flags = 0x8000; + sm->state[4].u.context.cur_tag = tags[0]; /* Initial */ + + sm->state[sm->class_cnt+4] = sm->state[4]; + + for ( i=0; i<4; ++i ) { + sm->state[2*sm->class_cnt+i].next_state = 0; + sm->state[2*sm->class_cnt+i].u.context.mark_tag = tags[3];/* Isolated */ + } + + sm->state[2*sm->class_cnt+4].next_state = 3; + sm->state[2*sm->class_cnt+4].flags = 0x8000; + sm->state[2*sm->class_cnt+4].u.context.cur_tag = tags[1]; /* Medial */ + + for ( i=0; i<4; ++i ) { + sm->state[3*sm->class_cnt+i].next_state = 0; + sm->state[3*sm->class_cnt+i].u.context.mark_tag = tags[2];/* Final */ + } + + sm->state[3*sm->class_cnt+4] = sm->state[2*sm->class_cnt+4]; + + /* Deleted glyph retains same state, just eats the glyph */ + for ( i=0; istate_cnt; ++i ) { + int pos = i*sm->class_cnt+2, mpos = i*sm->class_cnt+5; + sm->state[pos].next_state = i; + sm->state[pos].flags = 0; + sm->state[pos].u.context.cur_tag = 0; + sm->state[pos].u.context.mark_tag = 0; + /* same for ignored marks */ + if ( flags&pst_ignorecombiningmarks ) + sm->state[mpos].next_state = i; + } + +return( sm ); +} + + /* ********************** From Coverage FPST ********************** */ +static SplineChar **morx_cg_FigureClasses(SplineChar ***tables,int match_len, + int ***classes, int *cc, uint16 **mp, int *gc, + FPST *fpst,SplineFont *sf,int ordered) { + int i,j,k, mask, max, class_cnt, gcnt, gtot; + SplineChar ***temp, *sc, **glyphs, **gall; + uint16 *map; + int *nc; + int *next; + /* For each glyph used, figure out what coverage tables it gets used in */ + /* then all the glyphs which get used in the same set of coverage tables */ + /* can form one class */ + + if ( match_len>10 ) /* would need too much space to figure out */ +return( NULL ); + + gtot = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + sf->chars[i]->lsidebearing = 1; + if ( !ordered ) + sf->chars[i]->ttf_glyph = gtot++; + else + gtot = sf->chars[i]->ttf_glyph+1; + } + + max=0; + for ( i=0; imax ) max=k; + } + next = gcalloc(1<chars[i]!=NULL ) { + sf->chars[i]->lsidebearing = 0; + sf->chars[i]->ticked = false; + } + for ( i=0; ilsidebearing |= 1<ticked ) { + mask = sc->lsidebearing; + if ( next[mask]==0 ) + temp[mask] = galloc(max*sizeof(SplineChar *)); + temp[mask][next[mask]++] = sc; + sc->ticked = true; + } + } + + gall = gcalloc(gtot+1,sizeof(SplineChar *)); + class_cnt = gcnt = 0; + for ( i=0; i<(1<ttf_glyph] = temp[i][k]; + temp[i][k]->lsidebearing = class_cnt; + } + ++class_cnt; + gcnt += next[i]; + free(temp[i]); + } + } + if ( fpst->flags & pst_ignorecombiningmarks ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + if ( sf->chars[i]->lsidebearing==0 && IsMarkChar(sf->chars[i])) { + sf->chars[i]->lsidebearing = class_cnt; + ++gcnt; + } + } + ++class_cnt; /* Add a class for the marks so we can ignore them */ + } + *cc = class_cnt+4; + glyphs = galloc((gcnt+1)*sizeof(SplineChar *)); + map = galloc((gcnt+1)*sizeof(uint16)); + gcnt = 0; + for ( i=0; ilsidebearing+4; /* there are 4 standard classes, so our first class starts at 4 */ + } + glyphs[gcnt] = NULL; + free(gall); + free(temp); + *gc = gcnt; + *mp = map; + + nc = gcalloc(match_len,sizeof(int)); + *classes = galloc((match_len+1)*sizeof(int *)); + for ( i=0; irules[0]; + int subspos = r->u.coverage.bcnt+r->lookups[0].seq, hasfinal = false; + int substag = r->lookups[0].lookup_tag, finaltag=-1; + uint16 *map; + ASM *sm; + + /* In one very specific case we can support two substitutions */ + if ( r->lookup_cnt==2 ) { + hasfinal = true; + if ( r->lookups[0].seq==r->u.coverage.ncnt-1 ) { + finaltag = substag; + subspos = r->u.coverage.bcnt+r->lookups[1].seq; + substag = r->lookups[1].lookup_tag; + } else + finaltag = r->lookups[1].lookup_tag; + } + + tables = galloc((r->u.coverage.ncnt+r->u.coverage.bcnt+r->u.coverage.fcnt+1)*sizeof(SplineChar **)); + for ( j=0, i=r->u.coverage.bcnt-1; i>=0; --i, ++j ) + tables[j] = SFGlyphsFromNames(sf,r->u.coverage.bcovers[i]); + for ( i=0; iu.coverage.ncnt; ++i, ++j ) + tables[j] = SFGlyphsFromNames(sf,r->u.coverage.ncovers[i]); + for ( i=0; iu.coverage.fcnt; ++i, ++j ) + tables[j] = SFGlyphsFromNames(sf,r->u.coverage.fcovers[i]); + tables[j] = NULL; + match_len = j; + + for ( i=0; itype = asm_context; + sm->flags = (fpst->flags&pst_r2l) ? asm_descending : 0; + sm->class_cnt = class_cnt; + sm->classes = galloc(class_cnt*sizeof(char *)); + sm->classes[0] = sm->classes[1] = sm->classes[2] = sm->classes[3] = NULL; + for ( i=4; iclasses[i] = BuildClassNames(glyphs,map,i); + free(glyphs); free(map); + + /* Now build the state machine */ + /* we have match_len+1 states (there are 2 initial states) */ + /* we transition from the initial state to our first state when we get */ + /* any class which makes up the first coverage table. From the first */ + /* to the second on any class which makes up the second ... */ + sm->state_cnt = match_len+1; + sm->state = gcalloc(sm->state_cnt*sm->class_cnt,sizeof(struct asm_state)); + for ( j=0; jclass_cnt; + for ( i=0; istate[off+i].next_state = j+2; + if ( j==match_len-1 ) { + sm->state[off+i].next_state = 0; + sm->state[off+i].flags = 0x4000; + if ( subspos==j ) + sm->state[off+i].u.context.cur_tag = substag; + else { + sm->state[off+i].u.context.mark_tag = substag; + sm->state[off+i].u.context.cur_tag = finaltag; + } + } else if ( subspos==j ) + sm->state[off+i].flags = 0x8000; + } else if ( i==2 || ((fpst->flags&pst_ignorecombiningmarks) && i==class_cnt-1 ) ) + sm->state[off+i].next_state = j+1; /* Deleted glyph is a noop */ + else if ( j!=0 ) + sm->state[off+i].flags = 0x4000; /* Don't eat the current glyph, go back to state 0 and see if it will start the sequence over again */ + } + } + /* Class 0 and class 1 should be the same. We only filled in class 1 above*/ + memcpy(sm->state,sm->state+sm->class_cnt,sm->class_cnt*sizeof(struct asm_state)); +return( sm ); +} + + /* ********************** From Class FPST ********************** */ +static void SMSetState(struct asm_state *trans,struct contexttree *cur,int class) { + int i; + + for ( i=0; ibranch_cnt; ++i ) { + if ( cur->branches[i].classnum==class ) { + trans->next_state = cur->branches[i].branch->state; + trans->flags = cur->branches[i].branch->state!=0 + ? cur->branches[i].branch->markme?0x8000:0x0000 + : cur->branches[i].branch->markme?0xc000:0x4000; + trans->u.context.mark_tag = cur->branches[i].branch->applymarkedsubs; + trans->u.context.cur_tag = cur->branches[i].branch->applycursubs; +return; + } + } + + if ( cur->ends_here!=NULL ) { + trans->next_state = 0; + trans->flags = 0x4000; + trans->u.context.mark_tag = cur->applymarkedsubs; + trans->u.context.cur_tag = cur->applycursubs; + } else + trans->next_state = 0; +} + +static struct asm_state *AnyActiveSubstrings(struct contexttree *tree, + struct contexttree *cur,int class, struct asm_state *trans, int classcnt) { + struct fpc *any = &cur->rules[0].rule->u.class; + int i,rc,j, b; + + for ( i=1; i<=cur->depth; ++i ) { + for ( rc=0; rcrule_cnt; ++rc ) { + struct fpc *r = &tree->rules[rc].rule->u.class; + int ok = true; + for ( j=0; j<=cur->depth-i; ++j ) { + if ( any->allclasses[j+i]!=r->allclasses[j] ) { + ok = false; + break; + } + } + if ( ok && r->allclasses[j]==class ) { + struct contexttree *sub = tree; + for ( j=0; j<=cur->depth-i; ++j ) { + for ( b=0; bbranch_cnt; ++b ) { + if ( sub->branches[b].classnum==r->allclasses[j] ) { + sub = sub->branches[b].branch; + break; + } + } + } + if ( trans[sub->state*classcnt+class+3].next_state!=0 && + (sub->pending_pos+i == cur->pending_pos || + sub->pending_pos == -1 )) +return( &trans[sub->state*classcnt+class+3] ); + } + } + } +return( &trans[class+3] ); +} + +static ASM *ASMFromClassFPST(SplineFont *sf,FPST *fpst, struct contexttree *tree) { + ASM *sm; + struct contexttree *cur; + int i; + + sm = chunkalloc(sizeof(ASM)); + sm->type = asm_context; + sm->flags = (fpst->flags&pst_r2l) ? asm_descending : 0; + /* mac class sets have four magic classes, opentype sets only have one */ + sm->class_cnt = (fpst->flags&pst_ignorecombiningmarks) ? fpst->nccnt+4 : fpst->nccnt+3; + sm->classes = galloc(sm->class_cnt*sizeof(char *)); + sm->classes[0] = sm->classes[1] = sm->classes[2] = sm->classes[3] = NULL; + for ( i=1; inccnt; ++i ) + sm->classes[i+3] = copy(fpst->nclass[i]); + if ( fpst->flags&pst_ignorecombiningmarks ) + sm->classes[sm->class_cnt-1] = BuildMarkClass(sf); + + /* Now build the state machine */ + sm->state_cnt = tree->next_state; + sm->state = gcalloc(sm->state_cnt*sm->class_cnt,sizeof(struct asm_state)); + for ( cur=tree; cur!=NULL; cur = TreeNext(cur)) if ( cur->state!=0 ) { + int off = cur->state*sm->class_cnt; + + SMSetState(&sm->state[off+1],cur,0); /* Out of bounds state */ + sm->state[off+2].next_state = cur->state; /* Deleted glyph gets eaten and ignored */ + if ( fpst->flags&pst_ignorecombiningmarks ) + sm->state[off+sm->class_cnt-1].next_state = cur->state; /* As do ignored marks */ + for ( i=1; inccnt; ++i ) + SMSetState(&sm->state[off+i+3],cur,i); + } + /* Class 0 and class 1 should be the same. We only filled in class 1 above*/ + memcpy(sm->state,sm->state+sm->class_cnt,sm->class_cnt*sizeof(struct asm_state)); + /* Do a sort of transitive closure on states, so if we are looking for */ + /* either "abcd" or "bce", don't lose the "bce" inside "abce" */ + FPSTBuildAllClasses(fpst); + for ( cur = tree; cur!=NULL; cur = TreeNext(cur)) if ( cur->state>1 ) { + int off = cur->state*sm->class_cnt; + for ( i=1; inccnt; ++i ) if ( sm->state[off+3+i].next_state==0 ) + sm->state[off+3+i] = *AnyActiveSubstrings(tree,cur,i, sm->state,sm->class_cnt); + } + FPSTFreeAllClasses(fpst); +return( sm ); +} + +ASM *ASMFromFPST(SplineFont *sf,FPST *fpst,int ordered) { + FPST *tempfpst=fpst; + struct contexttree *tree=NULL; + ASM *sm; + + if ( fpst->format==pst_glyphs ) + tempfpst = FPSTGlyphToClass( fpst ); + if ( tempfpst->format==pst_coverage ) +return( ASMFromCoverageFPST(sf,fpst,ordered)); + + tree = FPST2Tree(sf, tempfpst); + if ( tree!=NULL ) { + sm = ASMFromClassFPST(sf,tempfpst,tree); + TreeFree(tree); + } else + sm = NULL; + if ( tempfpst!=fpst ) + FPSTFree(tempfpst); + sm->opentype_tag = fpst->tag; +return( sm ); +} + +/* ************************************************************************** */ +/* ************************* Opentype conversion dlg ************************ */ +/* ************************************************************************** */ +struct cvt_dlg { + int done; + ASM *ret; + GGadget *list; + SplineFont *sf; +}; + +#define CID_Convert 100 + +struct fs_dlg { + int done, ok; + int feature, setting; + GTextInfo *mactags; +}; + +/*#define CID_FeatSet 306*/ + +struct sliflag *SFGetFormsList(SplineFont *sf,int test_dflt) { + struct sliflag *sliflags; + int cur, max; + int i,j,k; + SplineChar *sc; + PST *pst; + SplineFont *_sf; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + _sf = sf; + cur = 0; max = 10; + sliflags = galloc(11*sizeof(struct sliflag)); + + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->script_lang_index==SLI_NESTED ) + continue; + if ( test_dflt && !SLIHasDefault(sf,pst->script_lang_index)) + continue; + if ( pst->tag==CHR('i','n','i','t') || + pst->tag==CHR('m','e','d','i') || + pst->tag==CHR('f','i','n','a') || + pst->tag==CHR('i','s','o','l') ) { + for ( j=0; jscript_lang_index && + sliflags[j].flags==pst->flags ) + break; + if ( j>=cur ) { + if ( cur>=max ) + sliflags = grealloc(sliflags,((max+=10)+1)*sizeof(struct sliflag)); + sliflags[cur].sli = pst->script_lang_index; + sliflags[cur++].flags = pst->flags; + } + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + if ( cur==0 ) { + free(sliflags); +return( NULL ); + } + sliflags[cur].sli = 0xffff; sliflags[cur].flags = 0xffff; +return( sliflags ); +} + +/* A quick check to see if there is any opentype thing which is LIKELY to be */ +/* convertable to an apple contextual glyph substitution state machine */ +int SFAnyConvertableSM(SplineFont *sf) { + int i,k; + SplineChar *sc; + PST *pst; + SplineFont *_sf; + FPST *fpst; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + _sf = sf; + + for ( fpst=sf->possub; fpst!=NULL; fpst = fpst->next ) + if ( fpst->type==pst_contextsub || fpst->type==pst_chainsub ) +return( true ); + + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->script_lang_index==SLI_NESTED ) + continue; + if ( pst->tag==CHR('i','n','i','t') || + pst->tag==CHR('m','e','d','i') || + pst->tag==CHR('f','i','n','a') || + pst->tag==CHR('i','s','o','l') ) +return( true ); + } + } + ++k; + } while ( k<_sf->subfontcnt ); +return( false ); +} + +static GTextInfo *ConvertableItems(SplineFont *sf) { + int max=10, cur=0; + GTextInfo *ret = gcalloc((max+1),sizeof(GTextInfo)); + struct sliflag *sliflags = SFGetFormsList(sf,false); + FPST *fpst; + int i; + static int types[] = { pst_contextsub, pst_chainsub }; + static const unichar_t nullstr[] = { 0 }; + char buffer[100]; + + if ( sliflags!=NULL ) { + for ( i=0; sliflags[i].sli!=0xffff; ++i ) { + sprintf( buffer, "Forms (init,medi,fina,isol) %c%c%c%c %d", + sliflags[i].flags&pst_r2l ? 'r':' ', + sliflags[i].flags&pst_ignorebaseglyphs ? 'b':' ', + sliflags[i].flags&pst_ignoreligatures ? 'l':' ', + sliflags[i].flags&pst_ignorecombiningmarks ? 'm':' ', + sliflags[i].sli ); + if ( cur>=max ) { + ret = grealloc(ret,((max+=10)+1)*sizeof(GTextInfo)); + memset(ret+max,0,11*sizeof(GTextInfo)); + } + ret[cur].text = uc_copy(buffer); + ret[cur].checked = true; + ret[cur++].userdata = (void *) (intpt) ((sliflags[i].sli<<16)|sliflags[i].flags); + } + free(sliflags); + } + + for ( i=0; i<2; ++i ) { + if ( cur>=max ) { + ret = grealloc(ret,((max+=10)+1)*sizeof(GTextInfo)); + memset(ret+max,0,11*sizeof(GTextInfo)); + } + ret[cur].disabled = true; + ret[cur++].line = true; + + for ( fpst=sf->possub; fpst!=NULL; fpst = fpst->next ) if ( fpst->type==types[i] ) { + if ( cur>=max ) { + ret = grealloc(ret,((max+=10)+1)*sizeof(GTextInfo)); + memset(ret+max,0,11*sizeof(GTextInfo)); + } + ret[cur].text = ClassName(nullstr,fpst->tag,fpst->flags, + fpst->script_lang_index, -1, -1,false); + ret[cur].checked = false; + ret[cur].disabled = !FPSTisMacable(sf,fpst,false); + ret[cur++].userdata = (void *) fpst; + } + } + if ( cur==0 ) { + free(ret); +return( NULL ); + } +return( ret ); +} + +static int fs_e_h(GWindow gw, GEvent *e) { + if ( e->type==et_close ) { + struct fs_dlg *d = GDrawGetUserData(gw); + d->done = true; + } else if ( e->type == et_char ) { +return( false ); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct fs_dlg *d = GDrawGetUserData(gw); + if ( (d->ok = GGadgetGetCid(e->u.control.g)) ) { + unichar_t *end; + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(gw,CID_FeatSet)); + if ( *ret=='<' ) ++ret; + d->feature = u_strtol(ret,&end,10); + for ( ; isspace(*end); ++end ); + d->setting = u_strtol(end+1,&end,10); + for ( ; isspace(*end); ++end ); + if ( *end=='>' ) ++end; + for ( ; isspace(*end); ++end ); + if ( *end!='\0' ) { + GWidgetErrorR(_STR_BadFeatureSetting,_STR_BadFeatureSetting); +return( true ); + } + } + d->done = true; + } else if ( e->type==et_controlevent && e->u.control.subtype == et_textchanged ) { + if ( e->u.control.u.tf_changed.from_pulldown!=-1 ) { + struct fs_dlg *d = GDrawGetUserData(gw); + uint32 tag = (uint32) d->mactags[e->u.control.u.tf_changed.from_pulldown].userdata; + unichar_t ubuf[20]; + char buf[20]; + /* If they select something from the pulldown, don't show the human */ + /* readable form, instead show the numeric feature/setting */ + sprintf( buf,"<%d,%d>", tag>>16, tag&0xffff ); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(e->u.control.g,ubuf); + } + } +return( true ); +} + +static int GetFeatureSetting(SplineFont *sf, unichar_t *text, + int *feature,int *setting) { + struct fs_dlg d; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + int k; + + memset(&d,0,sizeof(d)); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<list,&len); + int feature,setting; + + for ( i=0; iselected && !ti[i]->disabled ) { + if ( !GetFeatureSetting(d->sf,ti[i]->text,&feature,&setting) ) + continue; + if ( ti[i]->checked ) { + uint32 val = (intpt) ti[i]->userdata; + sm = ASMFromOpenTypeForms(d->sf,val>>16,val&0xffff); + } else { + sm = ASMFromFPST(d->sf,(FPST *) (ti[i]->userdata),false); + } + sm->feature = feature; sm->setting = setting; + if ( d->ret==NULL ) + d->ret = sm; + else + last->next = sm; + last = sm; + } + d->done = true; +} + +static int SMCVT_Convert(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct cvt_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + _SMCVT_Convert(d); + } +return( true ); +} + +static int SMCVT_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct cvt_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + } +return( true ); +} + +static int SMCVT_Selected(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + GGadgetSetEnabled(GWidgetGetControl(GGadgetGetWindow(g),CID_Convert), + GGadgetGetFirstListSelectedItem(g)>=0); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + struct cvt_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + _SMCVT_Convert(d); + } +return( true ); +} + +static int cvt_e_h(GWindow gw, GEvent *e) { + if ( e->type==et_close ) { + struct cvt_dlg *d = GDrawGetUserData(gw); + d->done = true; + } else if ( e->type == et_char ) { +return( false ); + } +return( true ); +} + +ASM *SMConvertDlg(SplineFont *sf) { + GTextInfo *cvts = ConvertableItems(sf); + struct cvt_dlg d; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[8]; + GTextInfo label[8]; + int k; + + if ( cvts==NULL ) { + GWidgetErrorR(_STR_NothingToConvert,_STR_NothingToConvert); +return( NULL ); + } + + memset(&d,0,sizeof(d)); + d.sf = sf; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1< xA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "xD => Dx", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "AxD => DxA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABx => xAB", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABx => xBA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "xCD => CDx", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "xCD => DCx", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "AxCD => CDxA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "AxCD => DCxA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABxD => DxAB", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABxD => DxBA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABxCD => CDxAB", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABxCD => CDxBA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABxCD => DCxAB", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { (unichar_t *) "ABxCD => DCxBA", NULL, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 1}, + { NULL } +}; + +static char *copy_count(GWindow gw,int cid,int *cnt) { + const unichar_t *u = _GGadgetGetTitle(GWidgetGetControl(gw,cid)), *upt; + char *ret, *pt; + int c; + + while ( *u==' ' ) ++u; + if ( *u=='\0' ) { + *cnt = 0; +return( NULL ); + } + + ret = pt = galloc(u_strlen(u)+1); + c = 0; + for ( upt=u; *upt; ) { + if ( *upt==' ' ) { + while ( *upt==' ' ) ++upt; + if ( *upt!='\0' ) { + ++c; + *pt++ = ' '; + } + } else + *pt++ = *upt++; + } + *pt = '\0'; + *cnt = c+1; +return( ret ); +} + +static void SMD_Fillup(SMD *smd) { + int state = smd->st_pos/smd->class_cnt; + int class = smd->st_pos%smd->class_cnt; + struct asm_state *this = &smd->states[smd->st_pos]; + unichar_t buffer[100], *temp; + char buf[100]; + int j; + GGadget *list = GWidgetGetControl( smd->gw, CID_Classes ); + GTextInfo *ti = GGadgetGetListItem(list,class); + + u_snprintf(buffer,sizeof(buffer)/sizeof(buffer[0]), + GStringGetResource(_STR_StateClass,NULL), state, ti->text ); + GGadgetSetTitle(GWidgetGetControl(smd->editgw,CID_StateClass),buffer); + sprintf(buf,"%d", this->next_state ); + uc_strcpy(buffer,buf); + GGadgetSetTitle(GWidgetGetControl(smd->editgw,CID_NextState),buffer); + + GGadgetSetChecked(GWidgetGetControl(smd->editgw,CID_Flag4000), + this->flags&0x4000?0:1); + GGadgetSetChecked(GWidgetGetControl(smd->editgw,CID_Flag8000), + this->flags&0x8000?1:0); + if ( smd->sm->type==asm_indic ) { + GGadgetSetChecked(GWidgetGetControl(smd->editgw,CID_Flag2000), + this->flags&0x2000?1:0); + GGadgetSelectOneListItem(GWidgetGetControl(smd->editgw,CID_IndicVerb), + this->flags&0xf); + } else if ( smd->sm->type==asm_insert ) { + GGadgetSetChecked(GWidgetGetControl(smd->editgw,CID_Flag2000), + this->flags&0x2000?1:0); + GGadgetSetChecked(GWidgetGetControl(smd->editgw,CID_Flag1000), + this->flags&0x1000?1:0); + GGadgetSetChecked(GWidgetGetControl(smd->editgw,CID_Flag0800), + this->flags&0x0800?1:0); + GGadgetSetChecked(GWidgetGetControl(smd->editgw,CID_Flag0400), + this->flags&0x0400?1:0); + temp = uc_copy(this->u.insert.mark_ins); + buffer[0]='\0'; + GGadgetSetTitle(GWidgetGetControl(smd->editgw,CID_InsMark),temp==NULL?buffer:temp); + free(temp); + temp = uc_copy(this->u.insert.cur_ins); + buffer[0]='\0'; + GGadgetSetTitle(GWidgetGetControl(smd->editgw,CID_InsCur),temp==NULL?buffer:temp); + free(temp); + } else if ( smd->sm->type==asm_kern ) { + buf[0] = '\0'; + for ( j=0; ju.kern.kcnt; ++j ) + sprintf( buf+strlen(buf), "%d ", this->u.kern.kerns[j]); + if ( buf[0]!='\0' && buf[strlen(buf)-1]==' ' ) + buf[strlen(buf)-1] = '\0'; + uc_strcpy(buffer,buf); + GGadgetSetTitle(GWidgetGetControl(smd->editgw,CID_Kerns),buffer); + } else { + buffer[0] = this->u.context.mark_tag>>24; + buffer[1] = (this->u.context.mark_tag>>16)&0xff; + buffer[2] = (this->u.context.mark_tag>>8)&0xff; + buffer[3] = (this->u.context.mark_tag)&0xff; + buffer[4] = 0; + GGadgetSetTitle(GWidgetGetControl(smd->editgw,CID_TagMark),buffer); + buffer[0] = this->u.context.cur_tag>>24; + buffer[1] = (this->u.context.cur_tag>>16)&0xff; + buffer[2] = (this->u.context.cur_tag>>8)&0xff; + buffer[3] = (this->u.context.cur_tag)&0xff; + buffer[4] = 0; + GGadgetSetTitle(GWidgetGetControl(smd->editgw,CID_TagCur),buffer); + } + + GGadgetSetEnabled(GWidgetGetControl(smd->editgw,CID_Up), state!=0 ); + GGadgetSetEnabled(GWidgetGetControl(smd->editgw,CID_Left), class!=0 ); + GGadgetSetEnabled(GWidgetGetControl(smd->editgw,CID_Right), classclass_cnt-1 ); + GGadgetSetEnabled(GWidgetGetControl(smd->editgw,CID_Down), statestate_cnt-1 ); +} + +static int SMD_DoChange(SMD *smd) { + struct asm_state *this = &smd->states[smd->st_pos]; + int err=false, ns, flags, cnt; + char *mins, *cins; + uint32 mtag, ctag; + const unichar_t *ret; + unichar_t *end; + int16 kbuf[9]; + int kerns; + int oddcomplain=false; + + ns = GetIntR(smd->editgw,CID_NextState,_STR_NextState,&err); + if ( err ) +return( false ); + flags = 0; + if ( !GGadgetIsChecked(GWidgetGetControl(smd->editgw,CID_Flag4000)) ) flags |= 0x4000; + if ( GGadgetIsChecked(GWidgetGetControl(smd->editgw,CID_Flag8000)) ) flags |= 0x8000; + if ( smd->sm->type==asm_indic ) { + if ( GGadgetIsChecked(GWidgetGetControl(smd->editgw,CID_Flag2000)) ) flags |= 0x2000; + flags |= GGadgetGetFirstListSelectedItem(GWidgetGetControl(smd->editgw,CID_IndicVerb)); + this->next_state = ns; + this->flags = flags; + } else if ( smd->sm->type==asm_kern ) { + ret = _GGadgetGetTitle(GWidgetGetControl(smd->editgw,CID_Kerns)); + kerns=0; + while ( *ret!='\0' ) { + while ( *ret==' ' ) ++ret; + if ( *ret=='\0' ) + break; + kbuf[kerns] = u_strtol(ret,&end,10); + if ( end==ret ) { + ProtestR(_STR_KernValues); +return( false ); + } else if ( kerns>=8 ) { + GWidgetErrorR(_STR_TooManyKerns,_STR_AtMost8Kerns); +return( false ); + } else if ( kbuf[kerns]&1 ) { + kbuf[kerns] &= ~1; + if ( !oddcomplain ) + GWidgetPostNoticeR(_STR_KernsMustBeEven,_STR_KernsMustBeEven); + oddcomplain = true; + } + ++kerns; + ret = end; + } + this->next_state = ns; + this->flags = flags; + free(this->u.kern.kerns); + this->u.kern.kcnt = kerns; + if ( kerns==0 ) + this->u.kern.kerns = NULL; + else { + this->u.kern.kerns = galloc(kerns*sizeof(int16)); + memcpy(this->u.kern.kerns,kbuf,kerns*sizeof(int16)); + } + } else if ( smd->sm->type==asm_context ) { + mtag = ctag = 0; + ret = _GGadgetGetTitle(GWidgetGetControl(smd->editgw,CID_TagMark)); + if ( *ret=='\0' ) + /* That's ok */; + else if ( u_strlen(ret)!=4 ) { + GWidgetErrorR(_STR_TagMustBe4,_STR_TagMustBe4); +return( false ); + } else + mtag = (ret[0]<<24)|(ret[1]<<16)|(ret[2]<<8)|ret[3]; + ret = _GGadgetGetTitle(GWidgetGetControl(smd->editgw,CID_TagCur)); + if ( *ret=='\0' ) + /* That's ok */; + else if ( u_strlen(ret)!=4 ) { + GWidgetErrorR(_STR_TagMustBe4,_STR_TagMustBe4); +return( false ); + } else + ctag = (ret[0]<<24)|(ret[1]<<16)|(ret[2]<<8)|ret[3]; + this->next_state = ns; + this->flags = flags; + this->u.context.mark_tag = mtag; + this->u.context.cur_tag = ctag; + } else { + if ( GGadgetIsChecked(GWidgetGetControl(smd->editgw,CID_Flag2000)) ) flags |= 0x2000; + if ( GGadgetIsChecked(GWidgetGetControl(smd->editgw,CID_Flag1000)) ) flags |= 0x1000; + if ( GGadgetIsChecked(GWidgetGetControl(smd->editgw,CID_Flag0800)) ) flags |= 0x0800; + if ( GGadgetIsChecked(GWidgetGetControl(smd->editgw,CID_Flag0400)) ) flags |= 0x0400; + + if ( !CCD_NameListCheck(smd->sf,GGadgetGetTitle(GWidgetGetControl(smd->editgw,CID_InsMark)),false,_STR_MissingGlyphName)) +return( false ); + + mins = copy_count(smd->editgw,CID_InsMark,&cnt); + if ( cnt>31 ) { + GWidgetErrorR(_STR_TooManyGlyphs,_STR_AtMost31Glyphs); + free(mins); +return( false ); + } + flags |= cnt<<5; + + if ( !CCD_NameListCheck(smd->sf,GGadgetGetTitle(GWidgetGetControl(smd->editgw,CID_InsCur)),false,_STR_MissingGlyphName)) +return( false ); + cins = copy_count(smd->editgw,CID_InsCur,&cnt); + if ( cnt>31 ) { + GWidgetErrorR(_STR_TooManyGlyphs,_STR_AtMost31Glyphs); + free(mins); + free(cins); +return( false ); + } + flags |= cnt; + this->next_state = ns; + this->flags = flags; + free(this->u.insert.mark_ins); + free(this->u.insert.cur_ins); + this->u.insert.mark_ins = mins; + this->u.insert.cur_ins = cins; + } + + /* Show changes in main window */ + GDrawRequestExpose(smd->gw,NULL,false); +return( true ); +} + +static int SMDE_Arrow(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + int state = smd->st_pos/smd->class_cnt; + int class = smd->st_pos%smd->class_cnt; + switch( GGadgetGetCid(g)) { + case CID_Up: + if ( state!=0 ) --state; + break; + case CID_Left: + if ( class!=0 ) --class; + break; + case CID_Right: + if ( classclass_cnt-1 ) ++class; + break; + case CID_Down: + if ( statestate_cnt-1 ) ++state; + break; + } + if ( state!=smd->st_pos/smd->class_cnt || class!=smd->st_pos%smd->class_cnt ) { + if ( SMD_DoChange(smd)) { + smd->st_pos = state*smd->class_cnt+class; + SMD_Fillup(smd); + } + } + } +return( true ); +} + +static int smdedit_e_h(GWindow gw, GEvent *event) { + SMD *smd = GDrawGetUserData(gw); + + switch ( event->type ) { + case et_close: + smd->edit_done = true; + smd->edit_ok = false; + break; + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("statemachine.html#EditTransition"); +return( true ); + } else if ( event->u.chr.keysym == GK_Escape ) { + smd->edit_done = true; +return( true ); + } else if ( event->u.chr.chars[0] == '\r' ) { + smd->edit_done = SMD_DoChange(smd); +return( true ); + } +return( false ); + case et_controlevent: + switch( event->u.control.subtype ) { + case et_buttonactivate: + if ( GGadgetGetCid(event->u.control.g)==CID_Ok ) + smd->edit_done = SMD_DoChange(smd); + else + smd->edit_done = true; + break; + } + break; + } +return( true ); +} + +static void SMD_EditState(SMD *smd) { + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[23]; + GTextInfo label[23]; + GRect pos; + int k, listk, new_cnt; + unichar_t stateclass[100]; + + smd->edit_done = false; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<editgw = gw = GDrawCreateTopWindow(NULL,&pos,smdedit_e_h,smd,&wattrs); + + memset(gcd,0,sizeof(gcd)); + memset(label,0,sizeof(label)); + k = 0; listk = -1; + + u_snprintf(stateclass,sizeof(stateclass)/sizeof(stateclass[0]), + GStringGetResource(_STR_StateClass,NULL), 999, + GStringGetResource(_STR_MacEverythingElse,NULL)); + label[k].text = stateclass; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 5; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_StateClass; + gcd[k++].creator = GLabelCreate; + + label[k].text = (unichar_t *) _STR_NextState; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+13+4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = 80; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_NextState; + gcd[k++].creator = GTextFieldCreate; + + label[k].text = (unichar_t *) _STR_AdvanceToNextGlyph; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+24; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Flag4000; + gcd[k++].creator = GCheckBoxCreate; + + label[k].text = (unichar_t *) (smd->sm->type==asm_kern?_STR_PushCurrentGlyph: + smd->sm->type!=asm_indic?_STR_MarkCurrentGlyph: + _STR_MarkCurrentGlyphAsFirst); + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+16; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Flag8000; + gcd[k++].creator = GCheckBoxCreate; + + if ( smd->sm->type==asm_indic ) { + label[k].text = (unichar_t *) _STR_MarkCurrentGlyphAsLast; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+16; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Flag2000; + gcd[k++].creator = GCheckBoxCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+24; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.u.list = indicverbs_list; + gcd[k].gd.cid = CID_IndicVerb; + gcd[k++].creator = GListButtonCreate; + } else if ( smd->sm->type==asm_insert ) { + label[k].text = (unichar_t *) _STR_CurrentGlyphIsKashida; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+16; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Flag2000; + gcd[k++].creator = GCheckBoxCreate; + + label[k].text = (unichar_t *) _STR_MarkedGlyphIsKashida; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+16; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Flag1000; + gcd[k++].creator = GCheckBoxCreate; + + label[k].text = (unichar_t *) _STR_InsertBeforeCurrentGlyph; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+16; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Flag0800; + gcd[k++].creator = GCheckBoxCreate; + + label[k].text = (unichar_t *) _STR_InsertBeforeMarkedGlyph; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+16; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Flag0400; + gcd[k++].creator = GCheckBoxCreate; + + label[k].text = (unichar_t *) _STR_MarkInsert; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+26; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = gcd[2].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_InsMark; + gcd[k++].creator = GTextFieldCreate; + + label[k].text = (unichar_t *) _STR_CurrentInsert; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+30; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = gcd[2].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_InsCur; + gcd[k++].creator = GTextFieldCreate; + } else if ( smd->sm->type==asm_kern ) { + label[k].text = (unichar_t *) _STR_KernValues; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+26; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = gcd[2].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Kerns; + gcd[k++].creator = GTextFieldCreate; + } else { + label[k].text = (unichar_t *) _STR_MarkSubs; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+26; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + listk = k; + gcd[k].gd.pos.x = gcd[2].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_TagMark; + gcd[k++].creator = GListFieldCreate; + + label[k].text = (unichar_t *) _STR_CurrentSubs; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+30; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = gcd[2].gd.pos.x; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_TagCur; + gcd[k].gd.u.list = gcd[k-2].gd.u.list; + gcd[k++].creator = GListFieldCreate; + } + + label[k].text = (unichar_t *) _STR_UpArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = (SMDE_WIDTH-GIntGetResource(_NUM_Buttonsize)*100/GIntGetResource(_NUM_ScaleFactor))/2; + gcd[k].gd.pos.y = SMDE_HEIGHT-SMD_DIRDROP; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled; + gcd[k].gd.cid = CID_Up; + gcd[k].gd.handle_controlevent = SMDE_Arrow; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_LeftArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = SMDE_HEIGHT-SMD_DIRDROP+13; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled; + gcd[k].gd.cid = CID_Left; + gcd[k].gd.handle_controlevent = SMDE_Arrow; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_RightArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = -10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled; + gcd[k].gd.cid = CID_Right; + gcd[k].gd.handle_controlevent = SMDE_Arrow; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_DownArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-3].gd.pos.x; gcd[k].gd.pos.y = SMDE_HEIGHT-SMD_DIRDROP+26; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled; + gcd[k].gd.cid = CID_Down; + gcd[k].gd.handle_controlevent = SMDE_Arrow; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_OK; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.y = SMDE_HEIGHT-SMD_CANCELDROP-3; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled | gg_but_default; + gcd[k].gd.cid = CID_Ok; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Cancel; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = -30; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled | gg_but_cancel; + gcd[k].gd.cid = CID_Cancel; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 2; gcd[k].gd.pos.y = 2; + gcd[k].gd.pos.width = pos.width-4; + gcd[k].gd.pos.height = pos.height-4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k++].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + + if ( listk!=-1 ) { + GGadgetSetList(gcd[listk].ret, + SFGenTagListFromType(&smd->sf->gentags,pst_substitution),false); + GGadgetSetList(gcd[listk+2].ret, + SFGenTagListFromType(&smd->sf->gentags,pst_substitution),false); + } + + SMD_Fillup(smd); + + GDrawSetVisible(gw,true); + + smd->edit_done = false; + while ( !smd->edit_done ) + GDrawProcessOneEvent(NULL); + + new_cnt = FindMaxReachableStateCnt(smd); + if ( new_cnt!=smd->state_cnt ) { + smd->states = StateCopy(smd->states,smd->class_cnt,smd->state_cnt, + smd->class_cnt,new_cnt, + smd->sm->type,true); + smd->state_cnt = new_cnt; + SMD_SBReset(smd); + GDrawRequestExpose(smd->gw,NULL,false); + } + smd->st_pos = -1; + GDrawDestroyWindow(gw); +return; +} + +/* ************************************************************************** */ +/* **************************** Edit/Add a Class **************************** */ +/* ************************************************************************** */ + +static int SMD_ToSelection(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(smd->gw,CID_GlyphList)); + SplineFont *sf = smd->sf; + FontView *fv = sf->fv; + const unichar_t *end; + int pos, found=-1; + char *nm; + + GDrawSetVisible(fv->gw,true); + GDrawRaise(fv->gw); + memset(fv->selected,0,sf->charcnt); + while ( *ret ) { + end = u_strchr(ret,' '); + if ( end==NULL ) end = ret+u_strlen(ret); + nm = cu_copybetween(ret,end); + for ( ret = end; isspace(*ret); ++ret); + if (( pos = SFFindChar(sf,-1,nm))!=-1 ) { + if ( found==-1 ) found = pos; + fv->selected[pos] = true; + } + free(nm); + } + + if ( found!=-1 ) + FVScrollToChar(fv,found); + GDrawRequestExpose(fv->v,NULL,false); + } +return( true ); +} + +static int SMD_FromSelection(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + SplineFont *sf = smd->sf; + FontView *fv = sf->fv; + unichar_t *vals, *pt; + int i, len, max; + SplineChar *sc; + + for ( i=len=max=0; icharcnt; ++i ) if ( fv->selected[i]) { + sc = SFMakeChar(sf,i); + len += strlen(sc->name)+1; + if ( fv->selected[i]>max ) max = fv->selected[i]; + } + pt = vals = galloc((len+1)*sizeof(unichar_t)); + *pt = '\0'; + /* in a class the order of selection is irrelevant */ + for ( i=0; icharcnt; ++i ) if ( fv->selected[i] ) { + uc_strcpy(pt,sf->chars[i]->name); + pt += u_strlen(pt); + *pt++ = ' '; + } + if ( pt>vals ) pt[-1]='\0'; + + GGadgetSetTitle(GWidgetGetControl(smd->gw,CID_GlyphList),vals); + } +return( true ); +} + +static int SMD_Prev(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + GDrawSetVisible(smd->cw,false); + } +return( true ); +} + +static unichar_t *AddClass(int class_num,const unichar_t *text,int freetext) { + unichar_t buf[40]; + unichar_t *ret; + + u_snprintf(buf,sizeof(buf)/sizeof(buf[0]), + GStringGetResource(_STR_Class_d,NULL),class_num); + ret = galloc((u_strlen(buf)+u_strlen(text)+4)*sizeof(unichar_t)); + u_strcpy(ret,buf); + uc_strcat(ret,": "); + u_strcat(ret,text); + if ( freetext ) + free((unichar_t *) text); +return( ret ); +} + +static int SMD_Next(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(smd->gw,CID_GlyphList)); + unichar_t *temp; + GGadget *list = GWidgetGetControl( smd->gw, CID_Classes ); + int32 len; + + if ( !CCD_NameListCheck(smd->sf,ret,true,_STR_BadClass) || + CCD_InvalidClassList(ret,list,smd->isedit)) +return( true ); + + if ( smd->isedit ) { + int cn = GGadgetGetFirstListSelectedItem(list); + temp = AddClass(cn,ret,false); + GListChangeLine(list,cn,temp); + } else { + GGadgetGetList(list,&len); + temp = AddClass(len,ret,false); + GListAppendLine(list,temp,false); + smd->states = StateCopy(smd->states,smd->class_cnt,smd->state_cnt, + smd->class_cnt+1,smd->state_cnt, + smd->sm->type,true); + ++smd->class_cnt; + SMD_SBReset(smd); + } + GDrawSetVisible(smd->cw,false); /* This will give us an expose so we needed ask for one */ + free(temp); + } +return( true ); +} + +static void _SMD_DoEditNew(SMD *smd,int isedit) { + static unichar_t nullstr[] = { 0 }; + unichar_t *upt; + + smd->isedit = isedit; + if ( isedit ) { + GTextInfo *selected = GGadgetGetListItemSelected(GWidgetGetControl( + smd->gw, CID_Classes)); + if ( selected==NULL ) +return; + upt = uc_strstr(selected->text,": "); + if ( upt==NULL ) upt = selected->text; + else upt += 2; + GGadgetSetTitle(GWidgetGetControl(smd->cw,CID_GlyphList),upt); + } else { + GGadgetSetTitle(GWidgetGetControl(smd->cw,CID_GlyphList),nullstr); + } + GDrawSetVisible(smd->cw,true); +} + +/* ************************************************************************** */ +/* ****************************** Main Dialog ******************************* */ +/* ************************************************************************** */ + +static void _SMD_EnableButtons(SMD *smd) { + GGadget *list = GWidgetGetControl(smd->gw,CID_Classes); + int32 i, len, j; + GTextInfo **ti; + + ti = GGadgetGetList(list,&len); + i = GGadgetGetFirstListSelectedItem(list); + GGadgetSetEnabled(GWidgetGetControl(smd->gw,CID_Delete),i>=4); + for ( j=i+1; jselected ) + break; + GGadgetSetEnabled(GWidgetGetControl(smd->gw,CID_Edit),i>=4 && j==len); +} + +static void SMD_GListDelSelected(GGadget *list) { + int len, i,j; + GTextInfo **old, **new; + unichar_t *upt; + + old = GGadgetGetList(list,&len); + new = gcalloc(len+1,sizeof(GTextInfo *)); + for ( i=j=0; iselected ) { + new[j] = galloc(sizeof(GTextInfo)); + *new[j] = *old[i]; + upt = uc_strstr(new[j]->text,": "); + if ( upt==NULL ) upt = new[j]->text; else upt += 2; + new[j]->text = AddClass(j,upt,false); + ++j; + } + new[j] = gcalloc(1,sizeof(GTextInfo)); + GGadgetSetList(list,new,false); +} + +static int SMD_Delete(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + GGadget *list = GWidgetGetControl(smd->gw,CID_Classes); + int32 len; + + StateRemoveClasses(smd,GGadgetGetList(list,&len)); + SMD_GListDelSelected(list); + _SMD_EnableButtons(smd); + SMD_SBReset(smd); + GDrawRequestExpose(smd->gw,NULL,false); + } +return( true ); +} + +static int SMD_Edit(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + if ( GGadgetGetFirstListSelectedItem(GWidgetGetControl(smd->gw,CID_Classes))>0 ) + _SMD_DoEditNew(smd,true); + } +return( true ); +} + +static int SMD_New(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + _SMD_DoEditNew(smd,false); + } +return( true ); +} + +static int SMD_ClassSelected(GGadget *g, GEvent *e) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + _SMD_EnableButtons(smd); + SMD_HShow(smd,GGadgetGetFirstListSelectedItem(g)); + } else if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + if ( GGadgetGetFirstListSelectedItem(g)>0 ) + _SMD_DoEditNew(smd,true); + } +return( true ); +} + +static void _SMD_Finish(SMD *smd, int success) { + + GDrawDestroyWindow(smd->gw); + + GFI_FinishSMNew(smd->d,smd->sm,success,smd->isnew); + GFI_SMDEnd(smd->d); + + GTextInfoListFree(smd->mactags); + free(smd); +} + +static void _SMD_Cancel(SMD *smd) { + + StatesFree(smd->states,smd->state_cnt,smd->class_cnt,smd->sm->type); + _SMD_Finish(smd,false); +} + +static int SMD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + + if ( GDrawIsVisible(smd->cw)) +return( SMD_Prev(g,e)); + + _SMD_Cancel(smd); + } +return( true ); +} + +static int SMD_Ok(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + SMD *smd = GDrawGetUserData(GGadgetGetWindow(g)); + const unichar_t *ret = _GGadgetGetTitle(GWidgetGetControl(smd->gw,CID_FeatSet)); + unichar_t *end; + int feat, set, i; + int32 len; + GTextInfo **ti = GGadgetGetList(GWidgetGetControl(smd->gw,CID_Classes),&len); + ASM *sm = smd->sm; + unichar_t *upt; + + if ( GDrawIsVisible(smd->cw)) +return( SMD_Next(g,e)); + + if ( *ret=='<' ) + ++ret; + feat = u_strtol(ret,&end,10); + if ( *end==',' && ( set = u_strtol(end+1,&end,10), *end=='>' || *end=='\0')) { + sm->feature = feat; + sm->setting = set; + } else if ( sm->type==asm_kern ) { /* Kerns don't get feature/settings */ + sm->feature = sm->setting = 0xffff; + } else { + GWidgetErrorR(_STR_BadFeatureSetting,_STR_BadFeatureSetting); +return( true ); + } + + for ( i=4; iclass_cnt; ++i ) + free(sm->classes[i]); + free(sm->classes); + sm->classes = galloc(smd->class_cnt*sizeof(char *)); + sm->classes[0] = sm->classes[1] = sm->classes[2] = sm->classes[3] = NULL; + sm->class_cnt = smd->class_cnt; + for ( i=4; iclass_cnt; ++i ) { + upt = uc_strstr(ti[i]->text,": "); + if ( upt==NULL ) upt = ti[i]->text; else upt += 2; + sm->classes[i] = cu_copy(upt); + } + + StatesFree(sm->state,sm->state_cnt,sm->class_cnt, + sm->type); + sm->state_cnt = smd->state_cnt; + sm->state = smd->states; + sm->flags = (sm->flags & ~0xc000) | + (GGadgetIsChecked(GWidgetGetControl(smd->gw,CID_RightToLeft))?0x4000:0) | + (GGadgetIsChecked(GWidgetGetControl(smd->gw,CID_VertOnly))?0x8000:0); + _SMD_Finish(smd,true); + } +return( true ); +} + +static void SMD_Mouse(SMD *smd,GEvent *event) { + static unichar_t space[100]; + unichar_t *upt; + char buf[30]; + int32 len; + GTextInfo **ti; + int pos = ((event->u.mouse.y-smd->ystart2)/smd->stateh+smd->offtop) * smd->class_cnt + + (event->u.mouse.x-smd->xstart2)/smd->statew + smd->offleft; + + GGadgetEndPopup(); + + if (( event->type==et_mouseup || event->type==et_mousedown ) && + (event->u.mouse.button==4 || event->u.mouse.button==5) ) { + GGadgetDispatchEvent(smd->vsb,event); +return; + } + + if ( event->u.mouse.xxstart || event->u.mouse.x>smd->xstart2+smd->width || + event->u.mouse.yystart || event->u.mouse.y>smd->ystart2+smd->height ) +return; + + if ( event->type==et_mousemove ) { + int c = (event->u.mouse.x - smd->xstart2)/smd->statew + smd->offleft; + int s = (event->u.mouse.y - smd->ystart2)/smd->stateh + smd->offtop; + space[0] = '\0'; + if ( event->u.mouse.y>=smd->ystart2 && sstate_cnt ) { + sprintf( buf, "State %d\n", s ); + uc_strcpy(space,buf); + } + if ( event->u.mouse.x>=smd->xstart2 && cclass_cnt ) { + sprintf( buf, "Class %d\n", c ); + uc_strcat(space,buf); + ti = GGadgetGetList(GWidgetGetControl(smd->gw,CID_Classes),&len); + len = u_strlen(space); + upt = uc_strstr(ti[c]->text,": "); + if ( upt==NULL ) upt = ti[c]->text; + else upt += 2; + u_strncpy(space+len,upt,(sizeof(space)/sizeof(space[0]))-1 - len); + } else if ( event->u.mouse.xxstart2 ) { + if ( s==0 ) + u_strcat(space,GStringGetResource(_STR_StartOfInput,NULL)); + else if ( s==1 ) + u_strcat(space,GStringGetResource(_STR_StartOfLine,NULL)); + } + if ( space[0]=='\0' ) +return; + if ( space[u_strlen(space)-1]=='\n' ) + space[u_strlen(space)-1]='\0'; + GGadgetPreparePopup(smd->gw,space); + } else if ( event->u.mouse.xxstart2 || event->u.mouse.yystart2 ) +return; + else if ( event->type==et_mousedown ) + smd->st_pos = pos; + else if ( event->type==et_mouseup ) { + if ( pos==smd->st_pos ) + SMD_EditState(smd); + } +} + +static void SMD_Expose(SMD *smd,GWindow pixmap,GEvent *event) { + GRect *area = &event->u.expose.rect; + GRect rect; + GRect clip,old1,old2; + int len, off, i, j, x, y, kddd=false; + unichar_t ubuf[8]; + char buf[100]; + + if ( area->y+area->heightystart ) +return; + if ( area->y>smd->ystart2+smd->height ) +return; + + GDrawPushClip(pixmap,area,&old1); + GDrawSetFont(pixmap,smd->font); + GDrawSetLineWidth(pixmap,0); + rect.x = smd->xstart; rect.y = smd->ystart; + rect.width = smd->width+(smd->xstart2-smd->xstart); + rect.height = smd->height+(smd->ystart2-smd->ystart); + clip = rect; + GDrawPushClip(pixmap,&clip,&old2); + for ( i=0 ; smd->offtop+i<=smd->state_cnt && (i-1)*smd->statehheight; ++i ) { + GDrawDrawLine(pixmap,smd->xstart,smd->ystart2+i*smd->stateh,smd->xstart+rect.width,smd->ystart2+i*smd->stateh, + 0x808080); + if ( i+smd->offtopstate_cnt ) { + sprintf( buf, i+smd->offtop<100 ? "St%d" : "%d", i+smd->offtop ); + len = strlen( buf ); + off = (smd->stateh-len*smd->fh)/2; + for ( j=0; jxstart+3,smd->ystart2+i*smd->stateh+off+j*smd->fh+smd->as, + ubuf,1,NULL,0xff0000); + } + } + } + for ( i=0 ; smd->offleft+i<=smd->class_cnt && (i-1)*smd->statewwidth; ++i ) { + GDrawDrawLine(pixmap,smd->xstart2+i*smd->statew,smd->ystart,smd->xstart2+i*smd->statew,smd->ystart+rect.height, + 0x808080); + if ( i+smd->offleftclass_cnt ) { + uc_strcpy(ubuf,"Class"); + GDrawDrawText(pixmap,smd->xstart2+i*smd->statew+1,smd->ystart+smd->as+1, + ubuf,-1,NULL,0xff0000); + sprintf( buf, "%d", i+smd->offleft ); + uc_strcpy(ubuf,buf); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,smd->xstart2+i*smd->statew+(smd->statew-len)/2,smd->ystart+smd->fh+smd->as+1, + ubuf,-1,NULL,0xff0000); + } + } + + for ( i=0 ; smd->offtop+istate_cnt && (i-1)*smd->statehheight; ++i ) { + y = smd->ystart2+i*smd->stateh; + if ( y>area->y+area->height ) + break; + if ( y+smd->statehy ) + continue; + for ( j=0 ; smd->offleft+jclass_cnt && (j-1)*smd->statewwidth; ++j ) { + struct asm_state *this = &smd->states[(i+smd->offtop)*smd->class_cnt+j+smd->offleft]; + x = smd->xstart2+j*smd->statew; + if ( x>area->x+area->width ) + break; + if ( x+smd->statewx ) + continue; + + sprintf( buf, "%d", this->next_state ); + uc_strcpy(ubuf,buf); + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,x+(smd->statew-len)/2,y+smd->as+1, + ubuf,-1,NULL,0x000000); + + ubuf[0] = (this->flags&0x8000)? 'M' : ' '; + if ( smd->sm->type==asm_kern && (this->flags&0x8000)) + ubuf[0] = 'P'; + ubuf[1] = (this->flags&0x4000)? ' ' : 'A'; + ubuf[2] = '\0'; + if ( smd->sm->type==asm_indic ) { + ubuf[2] = (this->flags&0x2000) ? 'L' : ' '; + ubuf[3] = '\0'; + } + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,x+(smd->statew-len)/2,y+smd->fh+smd->as+1, + ubuf,-1,NULL,0x000000); + + ubuf[0]='\0'; + if ( smd->sm->type==asm_indic ) { + uc_strcpy(ubuf,indicverbs[0][this->flags&0xf]); + } else if ( smd->sm->type==asm_context ) { + ubuf[0] = this->u.context.mark_tag>>24; + ubuf[1] = (this->u.context.mark_tag>>16)&0xff; + ubuf[2] = (this->u.context.mark_tag>>8)&0xff; + ubuf[3] = this->u.context.mark_tag&0xff; + ubuf[4] = 0; + } else if ( smd->sm->type==asm_insert ) { + ubuf[0] = '\0'; + if ( this->u.insert.mark_ins!=NULL ) + uc_strncpy(ubuf,this->u.insert.mark_ins,5); + } else { /* kern */ + if ( this->u.kern.kerns!=NULL ) { + int j; + buf[0] = '\0'; + for ( j=0; ju.kern.kcnt; ++j ) + sprintf(buf+strlen(buf),"%d ", this->u.kern.kerns[j]); + kddd = ( strlen(buf)>5 ); + buf[5] = '\0'; + uc_strcpy(ubuf,buf); + } else + kddd = false; + } + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,x+(smd->statew-len)/2,y+2*smd->fh+smd->as+1, + ubuf,-1,NULL,0x000000); + + if ( smd->sm->type==asm_indic ) { + uc_strcpy(ubuf,indicverbs[1][this->flags&0xf]); + } else if ( smd->sm->type==asm_context ) { + ubuf[0] = this->u.context.cur_tag>>24; + ubuf[1] = (this->u.context.cur_tag>>16)&0xff; + ubuf[2] = (this->u.context.cur_tag>>8)&0xff; + ubuf[3] = this->u.context.cur_tag&0xff; + ubuf[4] = 0; + } else if ( smd->sm->type==asm_insert ) { + ubuf[0] = '\0'; + if ( this->u.insert.cur_ins!=NULL ) + uc_strncpy(ubuf,this->u.insert.cur_ins,5); + } else { /* kern */ + if ( kddd ) uc_strcpy(ubuf,"..."); + else ubuf[0] = '\0'; + } + len = GDrawGetTextWidth(pixmap,ubuf,-1,NULL); + GDrawDrawText(pixmap,x+(smd->statew-len)/2,y+3*smd->fh+smd->as+1, + ubuf,-1,NULL,0x000000); + } + } + + GDrawDrawLine(pixmap,smd->xstart,smd->ystart2,smd->xstart+rect.width,smd->ystart2, + 0x000000); + GDrawDrawLine(pixmap,smd->xstart2,smd->ystart,smd->xstart2,smd->ystart+rect.height, + 0x000000); + GDrawPopClip(pixmap,&old2); + GDrawPopClip(pixmap,&old1); + GDrawDrawRect(pixmap,&rect,0x000000); + rect.y += rect.height; + rect.x += rect.width; + LogoExpose(pixmap,event,&rect,dm_fore); +} + +static int SMD_SBReset(SMD *smd) { + int oldtop = smd->offtop, oldleft = smd->offleft; + + GScrollBarSetBounds(smd->vsb,0,smd->state_cnt, smd->height/smd->stateh); + GScrollBarSetBounds(smd->hsb,0,smd->class_cnt, smd->width/smd->statew); + if ( smd->offtop + (smd->height/smd->stateh) >= smd->state_cnt ) + smd->offtop = smd->state_cnt - (smd->height/smd->stateh); + if ( smd->offtop < 0 ) smd->offtop = 0; + if ( smd->offleft + (smd->width/smd->statew) >= smd->class_cnt ) + smd->offleft = smd->class_cnt - (smd->width/smd->statew); + if ( smd->offleft < 0 ) smd->offleft = 0; + GScrollBarSetPos(smd->vsb,smd->offtop); + GScrollBarSetPos(smd->hsb,smd->offleft); + +return( oldtop!=smd->offtop || oldleft!=smd->offleft ); +} + +static void SMD_HShow(SMD *smd, int pos) { + if ( pos<0 || pos>=smd->class_cnt ) +return; +#if 0 + if ( pos>=smd->offleft && posoffleft+(smd->width/smd->statew) ) +return; /* Already visible */ +#endif + --pos; /* One line of context */ + if ( pos + (smd->width/smd->statew) >= smd->class_cnt ) + pos = smd->class_cnt - (smd->width/smd->statew); + if ( pos < 0 ) pos = 0; + smd->offleft = pos; + GScrollBarSetPos(smd->hsb,pos); + GDrawRequestExpose(smd->gw,NULL,false); +} + +static void SMD_HScroll(SMD *smd,struct sbevent *sb) { + int newpos = smd->offleft; + GRect rect; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + if ( smd->width/smd->statew == 1 ) + --newpos; + else + newpos -= smd->width/smd->statew - 1; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + if ( smd->width/smd->statew == 1 ) + ++newpos; + else + newpos += smd->width/smd->statew - 1; + break; + case et_sb_bottom: + newpos = smd->class_cnt - (smd->width/smd->statew); + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos + (smd->width/smd->statew) >= smd->class_cnt ) + newpos = smd->class_cnt - (smd->width/smd->statew); + if ( newpos < 0 ) newpos = 0; + if ( newpos!=smd->offleft ) { + int diff = newpos-smd->offleft; + smd->offleft = newpos; + GScrollBarSetPos(smd->hsb,newpos); + rect.x = smd->xstart2+1; rect.y = smd->ystart; + rect.width = smd->width-1; + rect.height = smd->height+(smd->ystart2-smd->ystart); + GDrawScroll(smd->gw,&rect,-diff*smd->statew,0); + } +} + +static void SMD_VScroll(SMD *smd,struct sbevent *sb) { + int newpos = smd->offtop; + GRect rect; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + if ( smd->height/smd->stateh == 1 ) + --newpos; + else + newpos -= smd->height/smd->stateh - 1; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + if ( smd->height/smd->stateh == 1 ) + ++newpos; + else + newpos += smd->height/smd->stateh - 1; + break; + case et_sb_bottom: + newpos = smd->state_cnt - (smd->height/smd->stateh); + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos + (smd->height/smd->stateh) >= smd->state_cnt ) + newpos = smd->state_cnt - (smd->height/smd->stateh); + if ( newpos < 0 ) newpos = 0; + if ( newpos!=smd->offtop ) { + int diff = newpos-smd->offtop; + smd->offtop = newpos; + GScrollBarSetPos(smd->vsb,newpos); + rect.x = smd->xstart; rect.y = smd->ystart2+1; + rect.width = smd->width+(smd->xstart2-smd->xstart); + rect.height = smd->height-1; + GDrawScroll(smd->gw,&rect,0,diff*smd->stateh); + } +} + +static int subsmd_e_h(GWindow gw, GEvent *event) { + SMD *smd = GDrawGetUserData(gw); + + switch ( event->type ) { + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("statemachine.html#EditClass"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + _SMD_Cancel(smd); + else + MenuExit(NULL,NULL,NULL); +return( true ); + } +return( false ); + } +return( true ); +} + +static int smd_e_h(GWindow gw, GEvent *event) { + SMD *smd = GDrawGetUserData(gw); + + switch ( event->type ) { + case et_close: + _SMD_Cancel(smd); + break; + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("statemachine.html"); +return( true ); + } else if ( event->u.chr.keysym=='q' && (event->u.chr.state&ksm_control)) { + if ( event->u.chr.state&ksm_shift ) + _SMD_Cancel(smd); + else + MenuExit(NULL,NULL,NULL); +return( true ); + } +return( false ); + case et_expose: + SMD_Expose(smd,gw,event); + break; + case et_resize: { + int blen = GDrawPointsToPixels(NULL,GIntGetResource(_NUM_Buttonsize)); + GRect wsize, csize; + + GDrawGetSize(smd->gw,&wsize); + GDrawResize(smd->cw,wsize.width,wsize.height); + GGadgetResize(GWidgetGetControl(smd->gw,CID_Group),wsize.width-4,wsize.height-4); + GGadgetResize(GWidgetGetControl(smd->gw,CID_Group2),wsize.width-4,wsize.height-4); + GGadgetResize(GWidgetGetControl(smd->gw,CID_Line1),wsize.width-20,1); + GGadgetResize(GWidgetGetControl(smd->gw,CID_Line2),wsize.width-20,1); + + GGadgetGetSize(GWidgetGetControl(smd->gw,CID_Ok),&csize); + GGadgetMove(GWidgetGetControl(smd->gw,CID_Ok),csize.x,wsize.height-smd->canceldrop-3); + GGadgetMove(GWidgetGetControl(smd->cw,CID_Prev),csize.x+3,wsize.height-smd->canceldrop); + GGadgetGetSize(GWidgetGetControl(smd->gw,CID_Cancel),&csize); + GGadgetMove(GWidgetGetControl(smd->gw,CID_Cancel),wsize.width-blen-30,wsize.height-smd->canceldrop); + GGadgetMove(GWidgetGetControl(smd->gw,CID_Next),wsize.width-blen-33,wsize.height-smd->canceldrop-3); + + GGadgetGetSize(GWidgetGetControl(smd->gw,CID_Classes),&csize); + GGadgetResize(GWidgetGetControl(smd->gw,CID_Classes),wsize.width-GDrawPointsToPixels(NULL,10),csize.height); + GGadgetResize(GWidgetGetControl(smd->gw,CID_GlyphList),wsize.width-GDrawPointsToPixels(NULL,10),csize.height); + + GGadgetGetSize(smd->hsb,&csize); + smd->width = wsize.width-csize.height-smd->xstart2-5; + GGadgetResize(smd->hsb,smd->width,csize.height); + GGadgetMove(smd->hsb,smd->xstart2,wsize.height-smd->sbdrop-csize.height); + GGadgetGetSize(smd->vsb,&csize); + smd->height = wsize.height-smd->sbdrop-smd->ystart2-csize.width; + GGadgetResize(smd->vsb,csize.width,wsize.height-smd->sbdrop-smd->ystart2-csize.width); + GGadgetMove(smd->vsb,wsize.width-csize.width-5,smd->ystart2); + SMD_SBReset(smd); + + GDrawRequestExpose(smd->gw,NULL,false); + } break; + case et_mouseup: case et_mousemove: case et_mousedown: + SMD_Mouse(smd,event); + break; + case et_controlevent: + switch( event->u.control.subtype ) { + case et_textchanged: + if ( event->u.control.u.tf_changed.from_pulldown!=-1 ) { + uint32 tag = (uint32) smd->mactags[event->u.control.u.tf_changed.from_pulldown].userdata; + unichar_t ubuf[20]; + char buf[20]; + /* If they select something from the pulldown, don't show the human */ + /* readable form, instead show the numeric feature/setting */ + sprintf( buf,"<%d,%d>", tag>>16, tag&0xffff ); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(event->u.control.g,ubuf); + } + break; + case et_scrollbarchange: + if ( event->u.control.g == smd->hsb ) + SMD_HScroll(smd,&event->u.control.u.sb); + else + SMD_VScroll(smd,&event->u.control.u.sb); + break; + } + break; +#if 0 + case et_drop: + smd_Drop(GDrawGetUserData(gw),event); + break; +#endif + } +return( true ); +} + +SMD *StateMachineEdit(SplineFont *sf,ASM *sm,struct gfi_data *d) { + static int titles[2][3] = { + { _STR_EditIndic, _STR_EditContextSub, _STR_EditInsert }, + { _STR_NewIndic, _STR_NewContextSub, _STR_NewInsert }}; + SMD *smd = gcalloc(1,sizeof(SMD)); + GRect pos, subpos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[20]; + GTextInfo label[20]; + int k, vk; + int blen = GIntGetResource(_NUM_Buttonsize); + const int space = 7; + static unichar_t courier[] = { 'c', 'o', 'u', 'r', 'i', 'e', 'r', ',', 'm','o','n','o','s','p','a','c','e',',','c','l','e','a','r','l','y','u',',', 'u','n','i','f','o','n','t', '\0' }; + int as, ds, ld, sbsize; + FontRequest rq; + static unichar_t statew[] = { '1', '2', '3', '4', '5', 0 }; + char buf[20]; + unichar_t ubuf[20]; + + smd->sf = sf; + smd->sm = sm; + smd->d = d; + smd->isnew = (sm->class_cnt==0); + if ( smd->isnew ) { + smd->class_cnt = 4; /* 4 built in classes */ + smd->state_cnt = 2; /* 2 built in states */ + smd->states = gcalloc(smd->class_cnt*smd->state_cnt,sizeof(struct asm_state)); + smd->states[1*4+2].next_state = 1; /* deleted glyph is a noop */ + } else { + smd->class_cnt = sm->class_cnt; + smd->state_cnt = sm->state_cnt; + smd->states = StateCopy(sm->state,sm->class_cnt,sm->state_cnt, + smd->class_cnt,smd->state_cnt,sm->type,false); + } + smd->index = sm->type==asm_indic ? 0 : sm->type==asm_context ? 1 : 2; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<isnew][smd->index],NULL); + pos.x = pos.y = 0; + pos.width =GDrawPointsToPixels(NULL,GGadgetScale(SMD_WIDTH)); + pos.height = GDrawPointsToPixels(NULL,SMD_HEIGHT); + smd->gw = gw = GDrawCreateTopWindow(NULL,&pos,smd_e_h,smd,&wattrs); + + memset(gcd,0,sizeof(gcd)); + memset(label,0,sizeof(label)); + k = 0; + + label[k].text = (unichar_t *) _STR_FeatureSetting; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 5; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + if ( !smd->isnew ) { + sprintf(buf,"<%d,%d>", sm->feature, sm->setting ); + uc_strcpy(ubuf,buf); + label[k].text = ubuf; + gcd[k].gd.label = &label[k]; + } + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+14; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.u.list = smd->mactags = AddMacFeatures(NULL,pst_max,sf); + gcd[k].gd.cid = CID_FeatSet; + gcd[k++].creator = GListFieldCreate; + + label[k].text = (unichar_t *) _STR_RightToLeft; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 150; gcd[k].gd.pos.y = 5; + gcd[k].gd.flags = gg_enabled|gg_visible | (sm->flags&0x4000?gg_cb_on:0); + gcd[k].gd.cid = CID_RightToLeft; + gcd[k++].creator = GCheckBoxCreate; + if ( smd->sm->type == asm_kern ) { + gcd[k-1].gd.flags = gg_enabled; /* I'm not sure why kerning doesn't have an r2l bit */ + gcd[k-2].gd.flags = gg_enabled; + gcd[k-3].gd.flags = gg_enabled; + } + + label[k].text = (unichar_t *) _STR_VerticalOnly; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 150; gcd[k].gd.pos.y = 5+16; + gcd[k].gd.flags = gg_enabled|gg_visible | (sm->flags&0x8000?gg_cb_on:0); + gcd[k].gd.cid = CID_VertOnly; + gcd[k++].creator = GCheckBoxCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = GDrawPointsToPixels(gw,gcd[k-3].gd.pos.y+27); + gcd[k].gd.pos.width = pos.width-20; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k].gd.cid = CID_Line1; + gcd[k++].creator = GLineCreate; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = GDrawPixelsToPoints(gw,gcd[k-1].gd.pos.y)+5; + gcd[k].gd.pos.width = SMD_WIDTH-10; + gcd[k].gd.pos.height = 8*12+10; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_list_multiplesel; + gcd[k].gd.handle_controlevent = SMD_ClassSelected; + gcd[k].gd.cid = CID_Classes; + gcd[k++].creator = GListCreate; + + label[k].text = (unichar_t *) _STR_New; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+gcd[k-1].gd.pos.height+10; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = SMD_New; + gcd[k].gd.cid = CID_New; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Edit; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = SMD_Edit; + gcd[k].gd.cid = CID_Edit; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Delete; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = gcd[k-1].gd.pos.x+blen+space; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible; + gcd[k].gd.handle_controlevent = SMD_Delete; + gcd[k].gd.cid = CID_Delete; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = GDrawPointsToPixels(gw,gcd[k-1].gd.pos.y+28); + gcd[k].gd.pos.width = pos.width-20; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k].gd.cid = CID_Line2; + gcd[k++].creator = GLineCreate; + + smd->canceldrop = GDrawPointsToPixels(gw,SMD_CANCELDROP); + smd->sbdrop = smd->canceldrop+GDrawPointsToPixels(gw,7); + + vk = k; + gcd[k].gd.pos.width = sbsize = GDrawPointsToPixels(gw,_GScrollBar_Width); + gcd[k].gd.pos.x = pos.width-sbsize; + gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+8; + gcd[k].gd.pos.height = pos.height-gcd[k].gd.pos.y-sbsize-smd->sbdrop; + gcd[k].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + gcd[k++].creator = GScrollBarCreate; + smd->height = gcd[k-1].gd.pos.height; + smd->ystart = gcd[k-1].gd.pos.y; + + gcd[k].gd.pos.height = sbsize; + gcd[k].gd.pos.y = pos.height-sbsize-8; + gcd[k].gd.pos.x = 4; + gcd[k].gd.pos.width = pos.width-sbsize; + gcd[k].gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels; + gcd[k++].creator = GScrollBarCreate; + smd->width = gcd[k-1].gd.pos.width; + smd->xstart = 5; + + label[k].text = (unichar_t *) _STR_OK; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 30-3; gcd[k].gd.pos.y = SMD_HEIGHT-SMD_CANCELDROP-3; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled | gg_but_default; + gcd[k].gd.handle_controlevent = SMD_Ok; + gcd[k].gd.cid = CID_Ok; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Cancel; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = -30; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+3; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled | gg_but_cancel; + gcd[k].gd.handle_controlevent = SMD_Cancel; + gcd[k].gd.cid = CID_Cancel; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 2; gcd[k].gd.pos.y = 2; + gcd[k].gd.pos.width = pos.width-4; + gcd[k].gd.pos.height = pos.height-4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k].gd.cid = CID_Group; + gcd[k++].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + smd->vsb = gcd[vk].ret; + smd->hsb = gcd[vk+1].ret; + + { + GGadget *list = GWidgetGetControl(smd->gw,CID_Classes); + GListAppendLine(list,GStringGetResource(_STR_EndOfText,NULL),false); + GListAppendLine(list,GStringGetResource(_STR_MacEverythingElse,NULL),false); + GListAppendLine(list,GStringGetResource(_STR_DeletedGlyph,NULL),false); + GListAppendLine(list,GStringGetResource(_STR_EndOfLine,NULL),false); + for ( k=4; kclass_cnt; ++k ) { + unichar_t *temp = AddClass(k,uc_copy(sm->classes[k]),true); + GListAppendLine(list,temp,false); + free(temp); + } + } + + wattrs.mask = wam_events; + subpos = pos; subpos.x = subpos.y = 0; + smd->cw = GWidgetCreateSubWindow(smd->gw,&subpos,subsmd_e_h,smd,&wattrs); + + memset(gcd,0,sizeof(gcd)); + memset(label,0,sizeof(label)); + k = 0; + + label[k].text = (unichar_t *) _STR_Set; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 5; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SetGlyphsFromSelectionPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = SMD_FromSelection; + gcd[k].gd.cid = CID_Set; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_Select_nom; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 70; gcd[k].gd.pos.y = 5; + gcd[k].gd.pos.width = -1; + gcd[k].gd.popup_msg = GStringGetResource(_STR_SelectFromGlyphsPopup,NULL); + gcd[k].gd.flags = gg_visible | gg_enabled; + gcd[k].gd.handle_controlevent = SMD_ToSelection; + gcd[k].gd.cid = CID_Select; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = 30; + gcd[k].gd.pos.width = SMD_WIDTH-25; gcd[k].gd.pos.height = 8*13+4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_textarea_wrap; + gcd[k].gd.cid = CID_GlyphList; + gcd[k++].creator = GTextAreaCreate; + + label[k].text = (unichar_t *) _STR_PrevArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 30; gcd[k].gd.pos.y = SMD_HEIGHT-SMD_CANCELDROP; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled /*| gg_but_cancel*/; + gcd[k].gd.handle_controlevent = SMD_Prev; + gcd[k].gd.cid = CID_Prev; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_NextArrow; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = -30+3; gcd[k].gd.pos.y = SMD_HEIGHT-SMD_CANCELDROP; + gcd[k].gd.pos.width = -1; + gcd[k].gd.flags = gg_visible|gg_enabled /*| gg_but_default*/; + gcd[k].gd.handle_controlevent = SMD_Next; + gcd[k].gd.cid = CID_Next; + gcd[k++].creator = GButtonCreate; + + gcd[k].gd.pos.x = 2; gcd[k].gd.pos.y = 2; + gcd[k].gd.pos.width = pos.width-4; + gcd[k].gd.pos.height = pos.height-4; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_pos_in_pixels; + gcd[k].gd.cid = CID_Group2; + gcd[k++].creator = GGroupCreate; + + GGadgetsCreate(smd->cw,gcd); + + + memset(&rq,'\0',sizeof(rq)); + rq.point_size = 12; + rq.weight = 400; + rq.family_name = courier; + smd->font = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawFontMetrics(smd->font,&as,&ds,&ld); + smd->fh = as+ds; smd->as = as; + GDrawSetFont(gw,smd->font); + + smd->stateh = 4*smd->fh+3; + smd->statew = GDrawGetTextWidth(gw,statew,-1,NULL)+3; + smd->xstart2 = smd->xstart+smd->statew/2; + smd->ystart2 = smd->ystart+2*smd->fh+1; + + GDrawSetVisible(gw,true); + +return( smd ); +} + +void SMD_Close(SMD *smd) { + _SMD_Cancel(smd); +} diff --git a/fontforge/svg.c b/fontforge/svg.c new file mode 100644 index 00000000..b1cf2196 --- /dev/null +++ b/fontforge/svg.c @@ -0,0 +1,2649 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "sd.h" + +/* ************************************************************************** */ +/* **************************** SVG Output **************************** */ +/* ************************************************************************** */ + +static void latin1ToUtf8Out(FILE *file,char *str) { + /* beware of characters above 0x80, also &, <, > (things that are magic for xml) */ + while ( *str ) { + if ( *str=='&' || *str=='<' || *str=='>' || (*str&0x80) ) + fprintf( file, "&#%d;", (uint8) *str); + else + putc(*str,file); + ++str; + } +} + +static int svg_outfontheader(FILE *file, SplineFont *sf) { + int defwid = SFFigureDefWidth(sf,NULL); + struct pfminfo info; + static const char *condexp[] = { "squinchy", "ultra-condensed", "extra-condensed", + "condensed", "semi-condensed", "normal", "semi-expanded", "expanded", + "extra-expanded", "ultra-expanded", "broad" }; + DBounds bb; + BlueData bd; + char *hash, *hasv, ch; + int minu, maxu, i; + time_t now; + const char *author = GetAuthor(); + + SFDefaultOS2Info(&info,sf,sf->fontname); + SplineFontFindBounds(sf,&bb); + QuickBlues(sf,&bd); + + fprintf( file, "\n" ); + fprintf( file, "\n" ); + if ( sf->comments!=NULL ) { + fprintf( file, "\n" ); + } + fprintf( file, "\n" ); + time(&now); + fprintf( file, "\nCreated by FontForge at %s", ctime(&now) ); + if ( author!=NULL ) + fprintf(file," By %s\n", author); + else + fprintf(file,"\n" ); + if ( sf->copyright!=NULL ) { + latin1ToUtf8Out(file,sf->copyright); + putc('\n',file); + } + fprintf( file, "\n" ); + fprintf( file, "\n" ); + fprintf( file, "fontname, defwid ); + if ( sf->hasvmetrics ) + fprintf( file, "vert-adv-y=\"%d\" ", sf->ascent+sf->descent ); + putc('>',file); putc('\n',file); + fprintf( file, " familyname ); + fprintf( file, " font-weigth=\"%d\"\n", info.weight ); + if ( strstrmatch(sf->fontname,"obli") || strstrmatch(sf->fontname,"slanted") ) + fprintf( file, " font-style=\"oblique\"\n" ); + else if ( MacStyleCode(sf,NULL)&sf_italic ) + fprintf( file, " font-style=\"italic\"\n" ); + if ( strstrmatch(sf->fontname,"small") || strstrmatch(sf->fontname,"cap") ) + fprintf( file, " font-variant=small-caps\n" ); + fprintf( file, " font-stretch=\"%s\"\n", condexp[info.width]); + fprintf( file, " units-per-em=\"%d\"\n", sf->ascent+sf->descent ); + fprintf( file, " panose-1=\"%d %d %d %d %d %d %d %d %d %d\"\n", info.panose[0], + info.panose[1], info.panose[2], info.panose[3], info.panose[4], info.panose[5], + info.panose[6], info.panose[7], info.panose[8], info.panose[9]); + fprintf( file, " ascent=\"%d\"\n", sf->ascent ); + fprintf( file, " descent=\"%d\"\n", -sf->descent ); + fprintf( file, " x-height=\"%g\"\n", bd.xheight ); + fprintf( file, " cap-height=\"%g\"\n", bd.caph ); + fprintf( file, " bbox=\"%g %g %g %g\"\n", bb.minx, bb.miny, bb.maxx, bb.maxy ); + fprintf( file, " underline-thickness=\"%g\"\n", sf->uwidth ); + fprintf( file, " underline-position=\"%g\"\n", sf->upos ); + if ( sf->italicangle!=0 ) + fprintf(file, " slope=\"%g\"\n", sf->italicangle ); + hash = PSDictHasEntry(sf->private,"StdHW"); + hasv = PSDictHasEntry(sf->private,"StdVW"); + if ( hash!=NULL ) { + if ( *hash=='[' ) ++hash; + ch = hash[strlen(hash)-1]; + if ( ch==']' ) hash[strlen(hash)-1] = '\0'; + fprintf(file, " stemh=\"%s\"\n", hash ); + if ( ch==']' ) hash[strlen(hash)] = ch; + } + if ( hasv!=NULL ) { + if ( *hasv=='[' ) ++hasv; + ch = hasv[strlen(hasv)-1]; + if ( ch==']' ) hasv[strlen(hasv)-1] = '\0'; + fprintf(file, " stemv=\"%s\"\n", hasv ); + if ( ch==']' ) hasv[strlen(hasv)] = ch; + } + minu = 0x7fffff; maxu = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->unicodeenc>0 ) { + if ( sf->chars[i]->unicodeencchars[i]->unicodeenc; + if ( sf->chars[i]->unicodeenc>maxu ) maxu = sf->chars[i]->unicodeenc; + } + if ( maxu!=0 ) + fprintf(file, " unicode-range=\"U+%04X-U+%04X\"\n", minu, maxu ); + fprintf( file, " />\n" ); +return( defwid ); +} + +static int svg_pathdump(FILE *file, SplineSet *spl, int lineout) { + BasePoint last; + char buffer[60]; + int closed=false; + Spline *sp, *first; + /* as I see it there is nothing to be gained by optimizing out the */ + /* command characters, since they just have to be replaced by spaces */ + /* so I don't bother to */ + + last.x = last.y = 0; + while ( spl!=NULL ) { + sprintf( buffer, "M%g %g", spl->first->me.x, spl->first->me.y ); + if ( lineout+strlen(buffer)>=255 ) { putc('\n',file); lineout = 0; } + fputs( buffer,file ); + lineout += strlen( buffer ); + last = spl->first->me; + closed = false; + + first = NULL; + for ( sp = spl->first->next; sp!=NULL && sp!=first; sp = sp->to->next ) { + if ( first==NULL ) first=sp; + if ( sp->knownlinear ) { + if ( sp->to->me.x==sp->from->me.x ) + sprintf( buffer,"v%g", sp->to->me.y-last.y ); + else if ( sp->to->me.y==sp->from->me.y ) + sprintf( buffer,"h%g", sp->to->me.x-last.x ); + else if ( sp->to->next==first ) { + strcpy( buffer, "z"); + closed = true; + } else + sprintf( buffer,"l%g %g", sp->to->me.x-last.x, sp->to->me.y-last.y ); + } else if ( sp->order2 ) { + if ( sp->from->prev!=NULL && sp->from!=spl->first && + sp->from->me.x-sp->from->prevcp.x == sp->from->nextcp.x-sp->from->me.x && + sp->from->me.y-sp->from->prevcp.y == sp->from->nextcp.y-sp->from->me.y ) + sprintf( buffer,"t%g %g", sp->to->me.x-last.x, sp->to->me.y-last.y ); + else + sprintf( buffer,"q%g %g %g %g", + sp->to->prevcp.x-last.x, sp->to->prevcp.y-last.y, + sp->to->me.x-last.x,sp->to->me.y-last.y); + } else { + if ( sp->from->prev!=NULL && sp->from!=spl->first && + sp->from->me.x-sp->from->prevcp.x == sp->from->nextcp.x-sp->from->me.x && + sp->from->me.y-sp->from->prevcp.y == sp->from->nextcp.y-sp->from->me.y ) + sprintf( buffer,"s%g %g %g %g", + sp->to->prevcp.x-last.x, sp->to->prevcp.y-last.y, + sp->to->me.x-last.x,sp->to->me.y-last.y); + else + sprintf( buffer,"c%g %g %g %g %g %g", + sp->from->nextcp.x-last.x, sp->from->nextcp.y-last.y, + sp->to->prevcp.x-last.x, sp->to->prevcp.y-last.y, + sp->to->me.x-last.x,sp->to->me.y-last.y); + } + if ( lineout+strlen(buffer)>=255 ) { putc('\n',file); lineout = 0; } + fputs( buffer,file ); + lineout += strlen( buffer ); + last = sp->to->me; + } + if ( !closed ) { + if ( lineout>=254 ) { putc('\n',file); lineout=0; } + putc('z',file); + ++lineout; + } + spl = spl->next; + } +return( lineout ); +} + +#ifdef FONTFORGE_CONFIG_TYPE3 +static void svg_dumpstroke(FILE *file, struct pen *cpen, struct pen *fallback) { + static char *joins[] = { "miter", "round", "bevel", "inherit", NULL }; + static char *caps[] = { "butt", "round", "square", "inherit", NULL }; + struct pen pen; + + pen = *cpen; + if ( fallback!=NULL ) { + if ( pen.brush.col == COLOR_INHERITED ) pen.brush.col = fallback->brush.col; + if ( pen.brush.opacity <0 ) pen.brush.opacity = fallback->brush.opacity; + if ( pen.width == WIDTH_INHERITED ) pen.width = fallback->width; + if ( pen.linecap == lc_inherited ) pen.linecap = fallback->linecap; + if ( pen.linejoin == lj_inherited ) pen.linejoin = fallback->linejoin; + } + + if ( pen.brush.col!=COLOR_INHERITED ) + fprintf( file, "stroke=\"#%02x%02x%02x\" ", + COLOR_RED(pen.brush.col), COLOR_GREEN(pen.brush.col), COLOR_BLUE(pen.brush.col)); + else + fprintf( file, "stroke=\"currentColor\" " ); + if ( pen.brush.opacity>=0 ) + fprintf( file, "stroke-opacity=\"%g\" ", pen.brush.opacity); + if ( pen.width!=WIDTH_INHERITED ) + fprintf( file, "stroke-width=\"%g\" ", pen.width ); + if ( pen.linecap!=lc_inherited ) + fprintf( file, "stroke-linecap=\"%s\" ", caps[pen.linecap] ); + if ( pen.linejoin!=lc_inherited ) + fprintf( file, "stroke-linejoin=\"%s\" ", joins[pen.linejoin] ); +/* the current transformation matrix will not affect the fill, but it will */ +/* affect the way stroke looks. So we must include it here. BUT the spline */ +/* set has already been transformed, so we must apply the inverse transform */ +/* to the splineset before outputting it, so that applying the transform */ +/* will give us the splines we desire. */ + if ( pen.trans[0]!=1.0 || pen.trans[3]!=1.0 || pen.trans[1]!=0 || pen.trans[2]!=0 ) + fprintf( file, "transform=\"matrix(%g, %g, %g, %g, 0, 0)\" ", + pen.trans[0], pen.trans[1], pen.trans[2], pen.trans[3] ); +} + +static void svg_dumpfill(FILE *file, struct brush *cbrush, struct brush *fallback) { + struct brush brush; + + brush = *cbrush; + if ( fallback!=NULL ) { + if ( brush.col==COLOR_INHERITED ) brush.col = fallback->col; + if ( brush.opacity<0 ) brush.opacity = fallback->opacity; + } + + if ( brush.col!=COLOR_INHERITED ) + fprintf( file, "fill=\"#%02x%02x%02x\" ", + COLOR_RED(brush.col), COLOR_GREEN(brush.col), COLOR_BLUE(brush.col)); + else + fprintf( file, "fill=\"currentColor\" " ); + if ( brush.opacity>=0 ) + fprintf( file, "fill-opacity=\"%g\" ", brush.opacity); +} + +static SplineSet *TransBy(SplineSet *ss, real trans[4] ) { + real inversetrans[6], transform[6]; + + if ( trans[0]==1.0 && trans[3]==1.0 && trans[1]==0 && trans[2]==0 ) +return( ss ); + memcpy(transform,trans,4*sizeof(real)); + transform[4] = transform[5] = 0; + MatInverse(inversetrans,transform); +return( SplinePointListTransform(SplinePointListCopy( + ss),inversetrans,true)); +} +#endif + +static void svg_scpathdump(FILE *file, SplineChar *sc) { + int i,j; + RefChar *ref; + int lineout, any; +#ifdef FONTFORGE_CONFIG_TYPE3 + SplineSet *transed; +#endif + + any = false; + for ( i=ly_fore; ilayer_cnt && !any; ++i ) { + any = sc->layers[i].splines!=NULL; + for ( ref=sc->layers[i].refs ; ref!=NULL && !any; ref = ref->next ) + for ( j=0; jlayer_cnt && !any; ++j ) + any = ref->layers[j].splines!=NULL; + } + if ( !any ) { + /* I think a space is represented by leaving out the d (path) entirely*/ + /* rather than having d="" */ + fputs(" />\n",file); + } else if ( !sc->parent->multilayer ) { + fprintf( file,"d=\""); + lineout = svg_pathdump(file,sc->layers[ly_fore].splines,3); + for ( ref= sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) + lineout = svg_pathdump(file,ref->layers[0].splines,lineout); + if ( lineout>=255-4 ) putc('\n',file ); + putc('"',file); + fputs(" />\n",file); + } else { + putc('>',file); +#ifdef FONTFORGE_CONFIG_TYPE3 + for ( i=ly_fore; ilayer_cnt && !any; ++i ) { + if ( sc->layers[i].splines!=NULL ) { + fprintf(file, " layers[i].splines; + if ( sc->layers[i].dostroke ) { + svg_dumpstroke(file,&sc->layers[i].stroke_pen,NULL); + transed = TransBy(transed,sc->layers[i].stroke_pen.trans); + } + if ( sc->layers[i].dofill ) + svg_dumpfill(file,&sc->layers[i].fill_brush,NULL); + fprintf( file, ">\n" ); + fprintf(file, " \n" ); + if ( transed!=sc->layers[i].splines ) + SplinePointListsFree(transed); + fprintf(file, " \n" ); + } + for ( ref=sc->layers[i].refs ; ref!=NULL && !any; ref = ref->next ) { + for ( j=0; jlayer_cnt && !any; ++j ) if ( ref->layers[j].splines!=NULL ) { + fprintf(file, " layers[j].splines; + if ( ref->layers[j].dostroke ) { + svg_dumpstroke(file,&ref->layers[j].stroke_pen,&sc->layers[i].stroke_pen); + transed = TransBy(transed,ref->layers[j].stroke_pen.trans); + } + if ( ref->layers[j].dofill ) + svg_dumpfill(file,&ref->layers[j].fill_brush,&sc->layers[i].fill_brush); + fprintf( file, ">\n" ); + fprintf(file, " \n" ); + if ( transed!=ref->layers[j].splines ) + SplinePointListsFree(transed); + fprintf(file, " \n" ); + } + } + } +#endif + fputs(" \n",file); + } +} + +static int LigCnt(SplineFont *sf,PST *lig,int32 *univals,int max) { + char *pt, *end; + int c=0; + SplineChar *sc; + + if ( lig->type!=pst_ligature ) +return( 0 ); + else if ( lig->tag!=CHR('l','i','g','a') && lig->tag!=CHR('r','l','i','g')) +return( 0 ); + pt = lig->u.lig.components; + forever { + end = strchr(pt,' '); + if ( end!=NULL ) *end='\0'; + sc = SFGetCharDup(sf,-1,pt); + if ( end!=NULL ) *end=' '; + if ( sc==NULL || sc->unicodeenc==-1 ) +return( 0 ); + if ( c>=max ) +return( 0 ); + univals[c++] = sc->unicodeenc; + if ( end==NULL ) +return( c ); + pt = end+1; + while ( *pt==' ' ) ++pt; + } +} + +static PST *HasLigature(SplineChar *sc) { + PST *pst, *best=NULL; + int bestc=0,c; + int32 univals[50]; + + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_ligature ) { + c = LigCnt(sc->parent,pst,univals,sizeof(univals)/sizeof(univals[0])); + if ( c>1 && c>bestc ) { + c = bestc; + best = pst; + } + } + } +return( best ); +} + +static void svg_scdump(FILE *file, SplineChar *sc,int defwid) { + PST *best=NULL; + const unichar_t *alt; + int32 univals[50]; + int i, c, uni; + + best = HasLigature(sc); + if ( sc->comment!=NULL ) { + char *temp = u2utf8_copy(sc->comment); + fprintf( file, "\n\n",temp ); + free(temp); + } + fprintf(file," name ); + if ( best!=NULL ) { + c = LigCnt(sc->parent,best,univals,sizeof(univals)/sizeof(univals[0])); + fputs("unicode=\"",file); + for ( i=0; i='A' && univals[i]<'z' ) + putc(univals[i],file); + else + fprintf(file,"&#x%x;",univals[i]); + fputs("\" ",file); + } else if ( sc->unicodeenc!=-1 ) { + if ( sc->unicodeenc>=32 && sc->unicodeenc<127 && + sc->unicodeenc!='"' && sc->unicodeenc!='&' && + sc->unicodeenc!='<' && sc->unicodeenc!='>' ) + fprintf( file, "unicode=\"%c\" ", sc->unicodeenc); + else if ( sc->unicodeenc<0x10000 && + ( isarabisolated(sc->unicodeenc) || isarabinitial(sc->unicodeenc) || isarabmedial(sc->unicodeenc) || isarabfinal(sc->unicodeenc) ) && + unicode_alternates[sc->unicodeenc>>8]!=NULL && + (alt = unicode_alternates[sc->unicodeenc>>8][uni&0xff])!=NULL && + alt[1]=='\0' ) + /* For arabic forms use the base representation in the 0600 block */ + fprintf( file, "unicode=\"&#x%x;\" ", alt[0]); + else + fprintf( file, "unicode=\"&#x%x;\" ", sc->unicodeenc); + } + if ( sc->width!=defwid ) + fprintf( file, "horiz-adv-x=\"%d\" ", sc->width ); + if ( sc->parent->hasvmetrics && sc->vwidth!=sc->parent->ascent+sc->parent->descent ) + fprintf( file, "vert-adv-y=\"%d\" ", sc->vwidth ); + if ( strstr(sc->name,".vert")!=NULL || strstr(sc->name,".vrt2")!=NULL ) + fprintf( file, "orientation=\"v\" " ); + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10000 ) { + if ( isarabinitial(sc->unicodeenc)) + fprintf( file,"arabic-form=initial " ); + else if ( isarabmedial(sc->unicodeenc)) + fprintf( file,"arabic-form=medial "); + else if ( isarabfinal(sc->unicodeenc)) + fprintf( file,"arabic-form=final "); + else if ( isarabisolated(sc->unicodeenc)) + fprintf( file,"arabic-form=isolated "); + } + putc('\n',file); + svg_scpathdump(file,sc); +} + +static void svg_notdefdump(FILE *file, SplineFont *sf,int defwid) { + + if ( SCWorthOutputting(sf->chars[0]) && SCIsNotdef(sf->chars[0],-1 )) { + SplineChar *sc = sf->chars[0]; + + fprintf(file, "width!=defwid ) + fprintf( file, "horiz-adv-x=\"%d\" ", sc->width ); + if ( sc->parent->hasvmetrics && sc->vwidth!=sc->parent->ascent+sc->parent->descent ) + fprintf( file, "vert-adv-y=\"%d\" ", sc->vwidth ); + putc('\n',file); + svg_scpathdump(file,sc); + } else { + /* We'll let both the horiz and vert advances default to the values */ + /* specified by the font, and I think a space is done by omitting */ + /* d (the path) altogether */ + fprintf(file," \n"); /* Is this a blank space? */ + } +} + +static void fputkerns( FILE *file, char *names) { + while ( *names ) { + if ( *names==' ' ) { + putc(',',file); + while ( names[1]==' ' ) ++names; + } else + putc(*names,file); + ++names; + } +} + +static void svg_dumpkerns(FILE *file,SplineFont *sf,int isv) { + int i,j; + KernPair *kp; + KernClass *kc; + + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) ) { + for ( kp = isv ? sf->chars[i]->vkerns : sf->chars[i]->kerns; + kp!=NULL; kp = kp->next ) + if ( kp->off!=0 && SCWorthOutputting(kp->sc)) { + fprintf( file, isv ? " chars[i]->unicodeenc==-1 || HasLigature(sf->chars[i])) + fprintf( file, "g1=\"%s\" ", sf->chars[i]->name ); + else if ( sf->chars[i]->unicodeenc>='A' && sf->chars[i]->unicodeenc<='z' ) + fprintf( file, "u1=\"%c\" ", sf->chars[i]->unicodeenc ); + else + fprintf( file, "u1=\"&#x%x;\" ", sf->chars[i]->unicodeenc ); + if ( kp->sc->unicodeenc==-1 || HasLigature(kp->sc)) + fprintf( file, "g2=\"%s\" ", kp->sc->name ); + else if ( kp->sc->unicodeenc>='A' && kp->sc->unicodeenc<='z' ) + fprintf( file, "u2=\"%c\" ", kp->sc->unicodeenc ); + else + fprintf( file, "u2=\"&#x%x;\" ", kp->sc->unicodeenc ); + fprintf( file, "k=\"%d\" />\n", -kp->off ); + } + } + + for ( kc=isv ? sf->vkerns : sf->kerns; kc!=NULL; kc=kc->next ) { + for ( i=1; ifirst_cnt; ++i ) for ( j=1; jsecond_cnt; ++j ) { + if ( kc->offsets[i*kc->first_cnt+j]!=0 ) { + fprintf( file, isv ? " firsts[i]); + fprintf( file, "\"\n\tg2=\"" ); + fputkerns( file, kc->seconds[j]); + fprintf( file, "\"\n\tk=\"%d\" />\n", + -kc->offsets[i*kc->first_cnt+j]); + } + } + } +} + +static void svg_outfonttrailer(FILE *file,SplineFont *sf) { + fprintf(file," \n"); + fprintf(file,"\n" ); +} + +static void svg_sfdump(FILE *file,SplineFont *sf) { + int defwid, i; + char *oldloc; + + oldloc = setlocale(LC_NUMERIC,"C"); + + defwid = svg_outfontheader(file,sf); + svg_notdefdump(file,sf,defwid); + + /* Ligatures must be output before their initial components */ + for ( i=0; icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) && HasLigature(sf->chars[i])) + svg_scdump(file, sf->chars[i],defwid); + } + /* And formed arabic before unformed */ + for ( i=0; icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) && !HasLigature(sf->chars[i]) && + sf->chars[i]->unicodeenc!=-1 && sf->chars[i]->unicodeenc<0x10000 && + (isarabinitial(sf->chars[i]->unicodeenc) || + isarabmedial(sf->chars[i]->unicodeenc) || + isarabfinal(sf->chars[i]->unicodeenc) || + isarabisolated(sf->chars[i]->unicodeenc))) + svg_scdump(file, sf->chars[i],defwid); + } + for ( i=0; icharcnt; ++i ) { + if ( i==0 && SCIsNotdef(sf->chars[i],-1 )) + continue; + if ( SCWorthOutputting(sf->chars[i]) && !HasLigature(sf->chars[i]) && + (sf->chars[i]->unicodeenc==-1 || sf->chars[i]->unicodeenc>=0x10000 || + !(isarabinitial(sf->chars[i]->unicodeenc) || + isarabmedial(sf->chars[i]->unicodeenc) || + isarabfinal(sf->chars[i]->unicodeenc) || + isarabisolated(sf->chars[i]->unicodeenc)))) + svg_scdump(file, sf->chars[i],defwid); + } + svg_dumpkerns(file,sf,false); + svg_dumpkerns(file,sf,true); + svg_outfonttrailer(file,sf); + setlocale(LC_NUMERIC,oldloc); +} + +int WriteSVGFont(char *fontname,SplineFont *sf,enum fontformat format,int flags) { + FILE *file; + int ret; + + if (( file=fopen(fontname,"w+"))==NULL ) +return( 0 ); + svg_sfdump(file,sf); + ret = true; + if ( ferror(file)) + ret = false; + if ( fclose(file)==-1 ) +return( 0 ); +return( ret ); +} + +int _ExportSVG(FILE *svg,SplineChar *sc) { + char *oldloc; + int em_size; + + oldloc = setlocale(LC_NUMERIC,"C"); + fprintf(svg, "\n" ); + fprintf(svg, "\n" ); + em_size = sc->parent->ascent+sc->parent->descent; + fprintf(svg, "\n", + -sc->parent->descent, em_size, em_size, + sc->parent->ascent ); + fprintf(svg, " \n" ); + fprintf(svg, " \n", sc->width ); + fprintf(svg, " \n" ); + fprintf(svg, " \n", + sc->width, sc->width ); + fprintf(svg, " \n\n" ); + fprintf(svg, " \n" ); + + setlocale(LC_NUMERIC,oldloc); +return( !ferror(svg)); +} + +/* ************************************************************************** */ +/* ***************************** SVG Input **************************** */ +/* ************************************************************************** */ + +#if _NO_LIBXML +SplineFont *SFReadSVG(char *filename, int flags) { +return( NULL ); +} + +char **NamesReadSVG(char *filename) { +return( NULL ); +} + +SplineSet *SplinePointListInterpretSVG(char *filename,int em_size,int ascent) { +return( NULL ); +} +#else + +#include + +/* Ok, this complication is here because: */ +/* 1) I want to be able to deal with static libraries on some systems */ +/* 2) If I've got a dynamic library and I compile up an executable */ +/* I want it to run on systems without libxml2 */ +/* So one case boils down to linking against the standard names, while the */ +/* other does the link at run time if it's possible */ + +# if defined(_STATIC_LIBXML) || defined(NODYNAMIC) + +#define _xmlParseFile xmlParseFile +#define _xmlDocGetRootElement xmlDocGetRootElement +#define _xmlFreeDoc xmlFreeDoc +#ifdef __CygWin +# define _xmlFree free +/* Nasty kludge, but xmlFree doesn't work on cygwin (or I can't get it to) */ +#else +# define _xmlFree xmlFree +#endif +#define _xmlStrcmp xmlStrcmp +#define _xmlGetProp xmlGetProp + +static int libxml_init_base() { +return( true ); +} +# else +# include + +static DL_CONST void *libxml; +static xmlDocPtr (*_xmlParseFile)(const char *filename); +static xmlNodePtr (*_xmlDocGetRootElement)(xmlDocPtr doc); +static void (*_xmlFreeDoc)(xmlDocPtr doc); +static void (*_xmlFree)(void *); +static int (*_xmlStrcmp)(const xmlChar *,const xmlChar *); +static xmlChar *(*_xmlGetProp)(xmlNodePtr,const xmlChar *); + +static int libxml_init_base() { + static int xmltested = false; + + if ( xmltested ) +return( libxml!=NULL ); + + libxml = dlopen("libxml2" SO_EXT,RTLD_LAZY); + xmltested = true; + if ( libxml==NULL ) +return( false ); + + _xmlParseFile = (xmlDocPtr (*)(const char *)) dlsym(libxml,"xmlParseFile"); + _xmlDocGetRootElement = (xmlNodePtr (*)(xmlDocPtr )) dlsym(libxml,"xmlDocGetRootElement"); + _xmlFreeDoc = (void (*)(xmlDocPtr)) dlsym(libxml,"xmlFreeDoc"); + /* xmlFree is done differently for threaded and non-threaded libraries. */ + /* I hope this gets both right... */ + if ( dlsym(libxml,"__xmlFree")) { + xmlFreeFunc *(*foo)(void) = (xmlFreeFunc *(*)(void)) dlsym(libxml,"__xmlFree"); + _xmlFree = *(*foo)(); + } else { + xmlFreeFunc *foo = dlsym(libxml,"xmlFree"); + _xmlFree = *foo; + } + _xmlStrcmp = (int (*)(const xmlChar *,const xmlChar *)) dlsym(libxml,"xmlStrcmp"); + _xmlGetProp = (xmlChar *(*)(xmlNodePtr,const xmlChar *)) dlsym(libxml,"xmlGetProp"); + if ( _xmlParseFile==NULL || _xmlDocGetRootElement==NULL || _xmlFree==NULL ) { + libxml = NULL; +return( false ); + } + +return( true ); +} +# endif + +/* Find a node with the given id */ +static xmlNodePtr XmlFindID(xmlNodePtr xml, char *name) { + xmlChar *id; + xmlNodePtr child, ret; + + id = _xmlGetProp(xml,(xmlChar *) "id"); + if ( id!=NULL && _xmlStrcmp(id,(xmlChar *) name)==0 ) { + _xmlFree(id); +return( xml ); + } + if ( id!=NULL ) + _xmlFree(id); + + for ( child = xml->children; child!=NULL; child=child->next ) { + ret = XmlFindID(child,name); + if ( ret!=NULL ) +return( ret ); + } +return( NULL ); +} + +/* We want to look for "font" nodes within "svg" nodes. Since "svg" nodes may */ +/* be embedded within another xml/html document there may be several of them */ +/* and there may be several fonts within each */ +static int _FindSVGFontNodes(xmlNodePtr node,xmlNodePtr *fonts,int cnt, int max, + char *nodename) { + if ( _xmlStrcmp(node->name,(const xmlChar *) nodename)==0 ) { + if ( strcmp(nodename,"svg")==0 ) + nodename = "font"; + else { + fonts[cnt++] = node; + if ( cnt>=max ) +return( cnt ); + } + } + + for ( node=node->children; node!=NULL; node=node->next ) { + cnt = _FindSVGFontNodes(node,fonts,cnt,max,nodename); + if ( cnt>=max ) +return( cnt ); + } +return( cnt ); +} + +static xmlNodePtr *FindSVGFontNodes(xmlDocPtr doc) { + xmlNodePtr *fonts=NULL; + int cnt; + + fonts = gcalloc(100,sizeof(xmlNodePtr)); /* If the file has more than 100 fonts in it then it's foolish to expect the user to pick out one, so let's limit ourselves to 100 */ + cnt = _FindSVGFontNodes(_xmlDocGetRootElement(doc),fonts,0,100,"svg"); + if ( cnt==0 ) { + free(fonts); +return( NULL ); + } +return( fonts ); +} + +static xmlNodePtr SVGPickFont(xmlNodePtr *fonts,char *filename) { + int cnt; + unichar_t **names; + xmlChar *name; + char *pt, *lparen; + int choice; + + for ( cnt=0; fonts[cnt]!=NULL; ++cnt); + names = galloc((cnt+1)*sizeof(unichar_t *)); + for ( cnt=0; fonts[cnt]!=NULL; ++cnt) { + name = _xmlGetProp(fonts[cnt],(xmlChar *) "id"); + if ( name==NULL ) { + names[cnt] = uc_copy("nameless-font"); + } else { + names[cnt] = utf82u_copy((char *) name); + _xmlFree(name); + } + } + names[cnt] = NULL; + + choice = -1; + pt = strrchr(filename,'/'); + if ( pt==NULL ) pt = filename; + if ( (lparen = strchr(pt,'('))!=NULL && strchr(lparen,')')!=NULL ) { + char *find = copy(lparen+1); + pt = strchr(find,')'); + if ( pt!=NULL ) *pt='\0'; + for ( choice=cnt-1; choice>=0; --choice ) + if ( uc_strcmp(names[choice],find)==0 ) + break; + if ( choice==-1 ) { + char *fn = copy(filename); + fn[lparen-filename] = '\0'; + GWidgetErrorR(_STR_NotInCollection,_STR_FontNotInCollection,find,fn); + free(fn); + } + free(find); + } else if ( screen_display==NULL ) + choice = 0; + else + choice = GWidgetChoicesR(_STR_PickFont,(const unichar_t **) names,cnt,0,_STR_MultipleFontsPick); + for ( cnt=0; names[cnt]!=NULL; ++cnt ) + free(names[cnt]); + free(names); + if ( choice!=-1 ) +return( fonts[choice] ); + +return( NULL ); +} + +#define PI 3.1415926535897932 + +/* I don't see where the spec says that the seperator between numbers is */ +/* comma or whitespace (both is ok too) */ +/* But the style sheet spec says it, so I probably just missed it */ +static char *skipcomma(char *pt) { + while ( isspace(*pt))++pt; + if ( *pt==',' ) ++pt; +return( pt ); +} + +static void SVGTraceArc(SplineSet *cur,BasePoint *current, + double x,double y,double rx,double ry,double axisrot, + int large_arc,int sweep) { + double cosr, sinr; + double x1p, y1p; + double lambda, factor; + double cxp, cyp, cx, cy; + double tmpx, tmpy, t2x, t2y; + double startangle, delta, a; + SplinePoint *final, *sp; + BasePoint arcp[4], prevcp[4], nextcp[4], firstcp[2]; + int i, j, ia, firstia; + static double sines[] = { 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1 }; + static double cosines[]={ 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0 }; + + final = SplinePointCreate(x,y); + if ( rx < 0 ) rx = -rx; + if ( ry < 0 ) ry = -ry; + if ( rx!=0 && ry!=0 ) { + /* Page 647 in the SVG 1.1 spec describes how to do this */ + /* This is Appendix F (Implementation notes) section 6.5 */ + cosr = cos(axisrot); sinr = sin(axisrot); + x1p = cosr*(current->x-x)/2 + sinr*(current->y-y)/2; + y1p =-sinr*(current->x-x)/2 + cosr*(current->y-y)/2; + /* Correct for bad radii */ + lambda = x1p*x1p/(rx*rx) + y1p*y1p/(ry*ry); + if ( lambda>1 ) { + lambda = sqrt(lambda); + rx *= lambda; + ry *= lambda; + } + factor = rx*rx*ry*ry - rx*rx*y1p*y1p - ry*ry*x1p*x1p; + if ( RealNear(factor,0)) + factor = 0; /* Avoid rounding errors that lead to small negative values */ + else + factor = sqrt(factor/(rx*rx*y1p*y1p+ry*ry*x1p*x1p)); + if ( large_arc==sweep ) + factor = -factor; + cxp = factor*(rx*y1p)/ry; + cyp =-factor*(ry*x1p)/rx; + cx = cosr*cxp - sinr*cyp + (current->x+x)/2; + cy = sinr*cxp + cosr*cyp + (current->y+y)/2; + + tmpx = (x1p-cxp)/rx; tmpy = (y1p-cyp)/ry; + startangle = acos(tmpx/sqrt(tmpx*tmpx+tmpy*tmpy)); + if ( tmpy<0 ) + startangle = -startangle; + t2x = (-x1p-cxp)/rx; t2y = (-y1p-cyp)/ry; + delta = acos((tmpx*t2x+tmpy*t2y)/ + sqrt((tmpx*tmpx+tmpy*tmpy)*(t2x*t2x+t2y*t2y))); + if ( tmpx*t2y-tmpy*t2x<0 ) + delta = -delta; + if ( sweep==0 && delta>0 ) + delta -= 2*PI; + if ( sweep && delta<0 ) + delta += 2*PI; + + if ( delta>0 ) { + i = 0; + ia = firstia = floor(startangle/(PI/2))+1; + for ( a=ia*(PI/2), ia+=4; astartangle+delta && !RealNear(a,startangle+delta); a -= PI/2, ++i, --ia ) { + t2x = rx*cosines[ia]; t2y = ry*sines[ia]; + arcp[i].x = cosr*t2x - sinr*t2y + cx; + arcp[i].y = sinr*t2x + cosr*t2y + cy; + if ( t2x==0 ) { + t2x = rx*cosines[ia+1]; t2y = 0; + } else { + t2x = 0; t2y = ry*sines[ia+1]; + } + prevcp[i].x = arcp[i].x + .552*(cosr*t2x - sinr*t2y); + prevcp[i].y = arcp[i].y + .552*(sinr*t2x + cosr*t2y); + nextcp[i].x = arcp[i].x - .552*(cosr*t2x - sinr*t2y); + nextcp[i].y = arcp[i].y - .552*(sinr*t2x + cosr*t2y); + } + } + if ( i!=0 ) { + double firsta=firstia*PI/2; + double d = (firsta-startangle)/2; + double th = startangle+d; + double hypot = 1/cos(d); + BasePoint temp; + t2x = rx*cos(th)*hypot; t2y = ry*sin(th)*hypot; + temp.x = cosr*t2x - sinr*t2y + cx; + temp.y = sinr*t2x + cosr*t2y + cy; + firstcp[0].x = cur->last->me.x + .552*(temp.x-cur->last->me.x); + firstcp[0].y = cur->last->me.y + .552*(temp.y-cur->last->me.y); + firstcp[1].x = arcp[0].x + .552*(temp.x-arcp[0].x); + firstcp[1].y = arcp[0].y + .552*(temp.y-arcp[0].y); + } + for ( j=0; jprevcp = prevcp[j]; + cur->last->nextcp = nextcp[j-1]; + } else { + sp->prevcp = firstcp[1]; + cur->last->nextcp = firstcp[0]; + } + sp->noprevcp = cur->last->nonextcp = false; + SplineMake(cur->last,sp,false); + cur->last = sp; + } + { double hypot, c, s; + BasePoint temp; + if ( i==0 ) { + double th = startangle+delta/2; + hypot = 1.0/cos(delta/2); + c = cos(th); s=sin(th); + } else { + double lasta = delta<0 ? a+PI/2 : a-PI/2; + double d = (startangle+delta-lasta); + double th = lasta+d/2; + hypot = 1.0/cos(d/2); + c = cos(th); s=sin(th); + } + t2x = rx*c*hypot; t2y = ry*s*hypot; + temp.x = cosr*t2x - sinr*t2y + cx; + temp.y = sinr*t2x + cosr*t2y + cy; + cur->last->nextcp.x = cur->last->me.x + .552*(temp.x-cur->last->me.x); + cur->last->nextcp.y = cur->last->me.y + .552*(temp.y-cur->last->me.y); + final->prevcp.x = final->me.x + .552*(temp.x-final->me.x); + final->prevcp.y = final->me.y + .552*(temp.y-final->me.y); + cur->last->nonextcp = final->noprevcp = false; + } + } + *current = final->me; + SplineMake(cur->last,final,false); + cur->last = final; +} + +static SplineSet *SVGParsePath(xmlChar *path) { + BasePoint current; + SplineSet *head=NULL, *last=NULL, *cur=NULL; + SplinePoint *sp; + int type = 'M'; + double x1,x2,x,y1,y2,y,rx,ry,axisrot; + int large_arc,sweep; + int order2 = 0; + char *end; + + current.x = current.y = 0; + + while ( *path ) { + while ( *path==' ' ) ++path; + while ( isalpha(*path)) + type = *path++; + if ( *path=='\0' && type!='z' && type!='Z' ) + break; + if ( type=='m' || type=='M' ) { + if ( cur!=NULL && cur->last!=cur->first ) { + if ( RealNear(cur->last->me.x,cur->first->me.x) && + RealNear(cur->last->me.y,cur->first->me.y) ) { + cur->first->prevcp = cur->last->prevcp; + cur->first->noprevcp = cur->last->noprevcp; + cur->first->prev = cur->last->prev; + cur->first->prev->to = cur->first; + SplinePointFree(cur->last); + } else + SplineMake(cur->last,cur->first,order2); + cur->last = cur->first; + } + x = strtod((char *) path,&end); + end = skipcomma(end); + y = strtod(end,&end); + if ( type=='m' ) { + x += current.x; y += current.y; + } + sp = SplinePointCreate(x,y); + current = sp->me; + cur = chunkalloc(sizeof(SplineSet)); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + cur->first = cur->last = sp; + } else if ( type=='z' || type=='Z' ) { + if ( cur!=NULL && cur->last!=cur->first ) { + if ( RealNear(cur->last->me.x,cur->first->me.x) && + RealNear(cur->last->me.y,cur->first->me.y) ) { + cur->first->prevcp = cur->last->prevcp; + cur->first->noprevcp = cur->last->noprevcp; + cur->first->prev = cur->last->prev; + cur->first->prev->to = cur->first; + SplinePointFree(cur->last); + } else + SplineMake(cur->last,cur->first,order2); + cur->last = cur->first; + current = cur->first->me; + } + type = ' '; + end = (char *) path; + } else { + if ( cur==NULL ) { + sp = SplinePointCreate(current.x,current.y); + cur = chunkalloc(sizeof(SplineSet)); + if ( head==NULL ) + head = cur; + else + last->next = cur; + last = cur; + cur->first = cur->last = sp; + } + switch ( type ) { + case 'l': case'L': + x = strtod((char *) path,&end); + end = skipcomma(end); + y = strtod(end,&end); + if ( type=='l' ) { + x += current.x; y += current.y; + } + sp = SplinePointCreate(x,y); + current = sp->me; + SplineMake(cur->last,sp,order2); + cur->last = sp; + break; + case 'h': case'H': + x = strtod((char *) path,&end); + y = current.y; + if ( type=='h' ) { + x += current.x; + } + sp = SplinePointCreate(x,y); + current = sp->me; + SplineMake(cur->last,sp,order2); + cur->last = sp; + break; + case 'v': case 'V': + x = current.x; + y = strtod((char *) path,&end); + if ( type=='v' ) { + y += current.y; + } + sp = SplinePointCreate(x,y); + current = sp->me; + SplineMake(cur->last,sp,order2); + cur->last = sp; + break; + case 'c': case 'C': + x1 = strtod((char *) path,&end); + end = skipcomma(end); + y1 = strtod(end,&end); + end = skipcomma(end); + x2 = strtod(end,&end); + end = skipcomma(end); + y2 = strtod(end,&end); + end = skipcomma(end); + x = strtod(end,&end); + end = skipcomma(end); + y = strtod(end,&end); + if ( type=='c' ) { + x1 += current.x; y1 += current.y; + x2 += current.x; y2 += current.y; + x += current.x; y += current.y; + } + sp = SplinePointCreate(x,y); + sp->prevcp.x = x2; sp->prevcp.y = y2; sp->noprevcp = false; + cur->last->nextcp.x = x1; cur->last->nextcp.y = y1; cur->last->nonextcp = false; + current = sp->me; + SplineMake(cur->last,sp,false); + cur->last = sp; + break; + case 's': case 'S': + x1 = 2*cur->last->me.x - cur->last->prevcp.x; + y1 = 2*cur->last->me.y - cur->last->prevcp.y; + x2 = strtod((char *) path,&end); + end = skipcomma(end); + y2 = strtod(end,&end); + end = skipcomma(end); + x = strtod(end,&end); + end = skipcomma(end); + y = strtod(end,&end); + if ( type=='s' ) { + x2 += current.x; y2 += current.y; + x += current.x; y += current.y; + } + sp = SplinePointCreate(x,y); + sp->prevcp.x = x2; sp->prevcp.y = y2; sp->noprevcp = false; + cur->last->nextcp.x = x1; cur->last->nextcp.y = y1; cur->last->nonextcp = false; + current = sp->me; + SplineMake(cur->last,sp,false); + cur->last = sp; + break; + case 'Q': case 'q': + x1 = strtod((char *) path,&end); + end = skipcomma(end); + y1 = strtod(end,&end); + end = skipcomma(end); + x = strtod(end,&end); + end = skipcomma(end); + y = strtod(end,&end); + if ( type=='q' ) { + x1 += current.x; y1 += current.y; + x += current.x; y += current.y; + } + sp = SplinePointCreate(x,y); + sp->prevcp.x = x1; sp->prevcp.y = y1; sp->noprevcp = false; + cur->last->nextcp.x = x1; cur->last->nextcp.y = y1; cur->last->nonextcp = false; + current = sp->me; + SplineMake(cur->last,sp,true); + cur->last = sp; + order2 = true; + break; + case 'T': case 't': + x = strtod((char *) path,&end); + end = skipcomma(end); + y = strtod(end,&end); + if ( type=='q' ) { + x += current.x; y += current.y; + } + x1 = 2*cur->last->me.x - cur->last->prevcp.x; + y1 = 2*cur->last->me.y - cur->last->prevcp.y; + sp = SplinePointCreate(x,y); + sp->prevcp.x = x1; sp->prevcp.y = y1; sp->noprevcp = false; + cur->last->nextcp.x = x1; cur->last->nextcp.y = y1; cur->last->nonextcp = false; + current = sp->me; + SplineMake(cur->last,sp,true); + cur->last = sp; + order2 = true; + break; + case 'A': case 'a': + rx = strtod((char *) path,&end); + end = skipcomma(end); + ry = strtod(end,&end); + end = skipcomma(end); + axisrot = strtod(end,&end)*3.1415926535897932/180; + end = skipcomma(end); + large_arc = strtol(end,&end,10); + end = skipcomma(end); + sweep = strtol(end,&end,10); + end = skipcomma(end); + x = strtod(end,&end); + end = skipcomma(end); + y = strtod(end,&end); + if ( type=='a' ) { + x += current.x; y += current.y; + } + if ( x!=current.x || y!=current.y ) + SVGTraceArc(cur,¤t,x,y,rx,ry,axisrot,large_arc,sweep); + break; + default: + fprintf(stderr,"Unknown type '%c' found in path specification\n", type ); + break; + } + } + path = (xmlChar *) skipcomma(end); + } +return( head ); +} + +static SplineSet *SVGParseRect(xmlNodePtr rect) { + /* x,y,width,height,rx,ry */ + double x,y,width,height,rx,ry; + char *num; + SplinePoint *sp; + SplineSet *cur; + + num = (char *) _xmlGetProp(rect,(xmlChar *) "x"); + if ( num!=NULL ) { + x = strtod((char *) num,NULL); + _xmlFree(num); + } else + x = 0; + num = (char *) _xmlGetProp(rect,(xmlChar *) "width"); + if ( num!=NULL ) { + width = strtod((char *) num,NULL); + _xmlFree(num); + } else +return( NULL ); + num = (char *) _xmlGetProp(rect,(xmlChar *) "y"); + if ( num!=NULL ) { + y = strtod((char *) num,NULL); + _xmlFree(num); + } else + y = 0; + num = (char *) _xmlGetProp(rect,(xmlChar *) "height"); + if ( num!=NULL ) { + height = strtod((char *) num,NULL); + _xmlFree(num); + } else +return( NULL ); + + rx = ry = 0; + num = (char *) _xmlGetProp(rect,(xmlChar *) "rx"); + if ( num!=NULL ) { + ry = rx = strtod((char *) num,NULL); + _xmlFree(num); + } + num = (char *) _xmlGetProp(rect,(xmlChar *) "ry"); + if ( num!=NULL ) { + ry = strtod((char *) num,NULL); + if ( rx==0 ) ry = rx; + _xmlFree(num); + } + + if ( 2*rx>width ) rx = width/2; + if ( 2*ry>height ) ry = height/2; + + cur = chunkalloc(sizeof(SplineSet)); + if ( rx==0 ) { + cur->first = SplinePointCreate(x,y+height); + cur->last = SplinePointCreate(x+width,y+height); + SplineMake(cur->first,cur->last,true); + sp = SplinePointCreate(x+width,y); + SplineMake(cur->last,sp,true); + cur->last = sp; + sp = SplinePointCreate(x,y); + SplineMake(cur->last,sp,true); + SplineMake(sp,cur->first,true); + cur->last = cur->first; +return( cur ); + } else { + cur->first = SplinePointCreate(x,y+height-ry); + cur->last = SplinePointCreate(x+rx,y+height); + cur->first->nextcp.x = x; cur->first->nextcp.y = y+height; + cur->last->prevcp = cur->first->nextcp; + cur->first->nonextcp = cur->last->noprevcp = false; + SplineMake(cur->first,cur->last,false); + if ( rx<2*width ) { + sp = SplinePointCreate(x+width-rx,y+height); + SplineMake(cur->last,sp,true); + cur->last = sp; + } + sp = SplinePointCreate(x+width,y+height-ry); + sp->prevcp.x = x+width; sp->prevcp.y = y+height; + cur->last->nextcp = sp->prevcp; + cur->last->nonextcp = sp->noprevcp = false; + SplineMake(cur->last,sp,false); + cur->last = sp; + if ( ry<2*height ) { + sp = SplinePointCreate(x+width,y+ry); + SplineMake(cur->last,sp,false); + cur->last = sp; + } + sp = SplinePointCreate(x+width-rx,y); + sp->prevcp.x = x+width; sp->prevcp.y = y; + cur->last->nextcp = sp->prevcp; + cur->last->nonextcp = sp->noprevcp = false; + SplineMake(cur->last,sp,false); + cur->last = sp; + if ( rx<2*width ) { + sp = SplinePointCreate(x+rx,y); + SplineMake(cur->last,sp,false); + cur->last = sp; + } + cur->last->nextcp.x = x; cur->last->nextcp.y = y; + cur->last->nonextcp = false; + if ( ry>=2*height ) { + cur->first->prevcp = cur->last->nextcp; + cur->first->noprevcp = false; + } else { + sp = SplinePointCreate(x,y+ry); + sp->prevcp = cur->last->nextcp; + sp->noprevcp = false; + SplineMake(cur->last,sp,false); + cur->last = sp; + } + SplineMake(cur->last,cur->first,false); + cur->first = cur->last; +return( cur ); + } +} + +static SplineSet *SVGParseLine(xmlNodePtr line) { + /* x1,y1, x2,y2 */ + double x,y, x2,y2; + char *num; + SplinePoint *sp1, *sp2; + SplineSet *cur; + + num = (char *) _xmlGetProp(line,(xmlChar *) "x1"); + if ( num!=NULL ) { + x = strtod((char *) num,NULL); + _xmlFree(num); + } else + x = 0; + num = (char *) _xmlGetProp(line,(xmlChar *) "x2"); + if ( num!=NULL ) { + x2 = strtod((char *) num,NULL); + _xmlFree(num); + } else + x2 = 0; + num = (char *) _xmlGetProp(line,(xmlChar *) "y1"); + if ( num!=NULL ) { + y = strtod((char *) num,NULL); + _xmlFree(num); + } else + y = 0; + num = (char *) _xmlGetProp(line,(xmlChar *) "y2"); + if ( num!=NULL ) { + y2 = strtod((char *) num,NULL); + _xmlFree(num); + } else + y2 = 0; + + sp1 = SplinePointCreate(x,y); + sp2 = SplinePointCreate(x2,y2); + SplineMake(sp1,sp2,false); + cur = chunkalloc(sizeof(SplineSet)); + cur->first = sp1; + cur->last = sp2; +return( cur ); +} + +static SplineSet *SVGParseEllipse(xmlNodePtr ellipse, int iscircle) { + /* cx,cy,rx,ry */ + /* cx,cy,r */ + double cx,cy,rx,ry; + char *num; + SplinePoint *sp; + SplineSet *cur; + + num = (char *) _xmlGetProp(ellipse,(xmlChar *) "cx"); + if ( num!=NULL ) { + cx = strtod((char *) num,NULL); + _xmlFree(num); + } else + cx = 0; + num = (char *) _xmlGetProp(ellipse,(xmlChar *) "cy"); + if ( num!=NULL ) { + cy = strtod((char *) num,NULL); + _xmlFree(num); + } else + cy = 0; + if ( iscircle ) { + num = (char *) _xmlGetProp(ellipse,(xmlChar *) "r"); + if ( num!=NULL ) { + rx = ry = strtod((char *) num,NULL); + _xmlFree(num); + } else +return( NULL ); + } else { + num = (char *) _xmlGetProp(ellipse,(xmlChar *) "rx"); + if ( num!=NULL ) { + rx = strtod((char *) num,NULL); + _xmlFree(num); + } else +return( NULL ); + num = (char *) _xmlGetProp(ellipse,(xmlChar *) "ry"); + if ( num!=NULL ) { + ry = strtod((char *) num,NULL); + _xmlFree(num); + } else +return( NULL ); + } + if ( rx<0 ) rx = -rx; + if ( ry<0 ) ry = -ry; + + cur = chunkalloc(sizeof(SplineSet)); + cur->first = SplinePointCreate(cx-rx,cy); + cur->last = SplinePointCreate(cx,cy+ry); + cur->first->nextcp.x = cx-rx; cur->first->nextcp.y = cy+ry; + cur->last->prevcp = cur->first->nextcp; + cur->first->noprevcp = cur->first->nonextcp = false; + cur->last->noprevcp = cur->last->nonextcp = false; + SplineMake(cur->first,cur->last,true); + sp = SplinePointCreate(cx+rx,cy); + sp->prevcp.x = cx+rx; sp->prevcp.y = cy+ry; + sp->nextcp.x = cx+rx; sp->nextcp.y = cy-ry; + sp->nonextcp = sp->noprevcp = false; + cur->last->nextcp = sp->prevcp; + SplineMake(cur->last,sp,true); + cur->last = sp; + sp = SplinePointCreate(cx,cy-ry); + sp->prevcp = cur->last->nextcp; + sp->nextcp.x = cx-rx; sp->nextcp.y = cy-ry; + sp->nonextcp = sp->noprevcp = false; + cur->first->prevcp = sp->nextcp; + SplineMake(cur->last,sp,true); + SplineMake(sp,cur->first,true); + cur->last = cur->first; +return( cur ); +} + +static SplineSet *SVGParsePoly(xmlNodePtr poly, int isgon) { + /* points */ + double x,y; + char *pts, *end; + SplinePoint *sp; + SplineSet *cur; + + pts = (char *) _xmlGetProp(poly,(xmlChar *) "points"); + if ( pts==NULL ) +return( NULL ); + + x = strtod(pts,&end); + if ( *end!=',' ) { + _xmlFree(pts); +return( NULL ); + } + y = strtod(end+1,&end); + while ( isspace(*end)) ++end; + + cur = chunkalloc(sizeof(SplineSet)); + cur->first = cur->last = SplinePointCreate(x,y); + while ( *end ) { + x = strtod(end,&end); + if ( *end!=',' ) { + _xmlFree(pts); + SplinePointListFree(cur); +return( NULL ); + } + y = strtod(end+1,&end); + while ( isspace(*end)) ++end; + sp = SplinePointCreate(x,y); + SplineMake(cur->last,sp,false); + cur->last = sp; + } + if ( isgon ) { + if ( RealNear(cur->last->me.x,cur->first->me.x) && + RealNear(cur->last->me.y,cur->first->me.y) ) { + cur->first->prev = cur->last->prev; + cur->first->prev->to = cur->first; + SplinePointFree(cur->last); + } else + SplineMake(cur->last,cur->first,false); + cur->last = cur->first; + } +return( cur ); +} + +struct svg_state { + double linewidth; + int dofill, dostroke; + uint32 fillcol, strokecol; + float fillopacity, strokeopacity; + int isvisible; + enum linecap lc; + enum linejoin lj; + real transform[6]; +}; + +static void SVGFigureTransform(struct svg_state *st,char *name) { + real trans[6], res[6]; + double a, cx,cy; + char *pt, *paren, *end; + /* matrix(a,b,c,d,e,f) + rotate(theta[,cx,cy]) + scale(sx[,sy]) + translate(x,y) + skewX(theta) + skewY(theta) + */ + + for ( pt = (char *)name; isspace(*pt); ++pt ); + while ( *pt ) { + paren = strchr(pt,'('); + if ( paren==NULL ) + break; + if ( strncmp(pt,"matrix",paren-pt)==0 ) { + trans[0] = strtod(paren+1,&end); + trans[1] = strtod(skipcomma(end),&end); + trans[2] = strtod(skipcomma(end),&end); + trans[3] = strtod(skipcomma(end),&end); + trans[4] = strtod(skipcomma(end),&end); + trans[5] = strtod(skipcomma(end),&end); + } else if ( strncmp(pt,"rotate",paren-pt)==0 ) { + trans[4] = trans[5] = 0; + a = strtod(paren+1,&end)*3.1415926535897932/180; + trans[0] = trans[3] = cos(a); + trans[1] = sin(a); + trans[2] = -trans[1]; + while ( isspace(*end)) ++end; + if ( *end!=')' ) { + cx = strtod(skipcomma(end),&end); + cy = strtod(skipcomma(end),&end); + res[0] = res[3] = 1; + res[1] = res[2] = 0; + res[4] = cx; res[5] = cy; + MatMultiply(res,trans,res); + trans[0] = trans[3] = 1; + trans[1] = trans[2] = 0; + trans[4] = -cx; trans[5] = -cy; + MatMultiply(res,trans,res); + memcpy(trans,res,sizeof(res)); + } + } else if ( strncmp(pt,"scale",paren-pt)==0 ) { + trans[1] = trans[2] = trans[4] = trans[5] = 0; + trans[0] = trans[3] = strtod(paren+1,&end); + while ( isspace(*end)) ++end; + if ( *end!=')' ) + trans[3] = strtod(skipcomma(end),&end); + } else if ( strncmp(pt,"translate",paren-pt)==0 ) { + trans[0] = trans[3] = 1; + trans[1] = trans[2] = trans[5] = 0; + trans[4] = strtod(paren+1,&end); + while ( isspace(*end)) ++end; + if ( *end!=')' ) + trans[5] = strtod(skipcomma(end),&end); + } else if ( strncmp(pt,"skewX",paren-pt)==0 ) { + trans[0] = trans[3] = 1; + trans[1] = trans[2] = trans[4] = trans[5] = 0; + trans[2] = tan(strtod(paren+1,&end)*3.1415926535897932/180); + } else if ( strncmp(pt,"skewY",paren-pt)==0 ) { + trans[0] = trans[3] = 1; + trans[1] = trans[2] = trans[4] = trans[5] = 0; + trans[1] = tan(strtod(paren+1,&end)*3.1415926535897932/180); + } else + break; + while ( isspace(*end)) ++end; + if ( *end!=')') + break; + MatMultiply(trans,st->transform,st->transform); + pt = end+1; + while ( isspace(*pt)) ++pt; + } +} + +static void SVGuseTransform(struct svg_state *st,xmlNodePtr use, xmlNodePtr symbol) { + double x,y,uwid,uheight,swid,sheight; + char *num, *end; + real trans[6]; + + num = (char *) _xmlGetProp(use,(xmlChar *) "x"); + if ( num!=NULL ) { + x = strtod((char *) num,NULL); + _xmlFree(num); + } else + x = 0; + num = (char *) _xmlGetProp(use,(xmlChar *) "y"); + if ( num!=NULL ) { + y = strtod((char *) num,NULL); + _xmlFree(num); + } else + y = 0; + if ( x!=0 || y!=0 ) { + trans[0] = trans[3] = 1; + trans[1] = trans[2] = 0; + trans[4] = x; trans[5] = y; + MatMultiply(trans,st->transform,st->transform); + } + num = (char *) _xmlGetProp(use,(xmlChar *) "width"); + if ( num!=NULL ) { + uwid = strtod((char *) num,NULL); + _xmlFree(num); + } else + uwid = 0; + num = (char *) _xmlGetProp(use,(xmlChar *) "height"); + if ( num!=NULL ) { + uheight = strtod((char *) num,NULL); + _xmlFree(num); + } else + uheight = 0; + num = (char *) _xmlGetProp(symbol,(xmlChar *) "viewBox"); + if ( num!=NULL ) { + x = strtod((char *) num,&end); + y = strtod((char *) end+1,&end); + swid = strtod((char *) end+1,&end); + sheight = strtod((char *) end+1,&end); + _xmlFree(num); + } else +return; + if ( uwid != 0 || uheight != 0 ) { + trans[0] = trans[3] = 1; + trans[1] = trans[2] = trans[4] = trans[5] = 0; + if ( uwid != 0 && swid!=0 ) trans[0] = uwid/swid; + if ( uheight != 0 && sheight!=0 ) trans[3] = uheight/sheight; + MatMultiply(trans,st->transform,st->transform); + } +} + +static int xmlParseColor(xmlChar *name,uint32 *color) { + int doit, i; + static struct { char *name; uint32 col; } stdcols[] = { + { "red", 0xff0000 }, + { "green", 0x008000 }, + { "blue", 0x0000ff }, + { "cyan", 0x00ffff }, + { "magenta", 0xff00ff }, + { "yellow", 0xffff00 }, + { "black", 0x000000 }, + { "darkgray", 0x404040 }, + { "darkgrey", 0x404040 }, + { "gray", 0x808080 }, + { "grey", 0x808080 }, + { "lightgray", 0xc0c0c0 }, + { "lightgrey", 0xc0c0c0 }, + { "white", 0xffffff }, + { "maroon", 0x800000 }, + { "olive", 0x808000 }, + { "navy", 0x000080 }, + { "purple", 0x800080 }, + { "lime", 0x00ff00 }, + { "aqua", 0x00ffff }, + { "teal", 0x008080 }, + { "fuchsia", 0xff0080 }, + { "silver", 0xc0c0c0 }, + { NULL }}; + + doit = _xmlStrcmp(name,(xmlChar *) "none")!=0; + if ( doit ) { + for ( i=0; stdcols[i].name!=NULL; ++i ) + if ( _xmlStrcmp(name,(xmlChar *) stdcols[i].name)==0 ) + break; + if ( stdcols[i].name!=NULL ) + *color = stdcols[i].col; + else if ( _xmlStrcmp(name,(xmlChar *) "currentColor")==0 ) + *color = COLOR_INHERITED; + else if ( name[0]=='#' ) { + unsigned int temp; + sscanf( (char *) name, "#%x", &temp ); + if ( strlen( (char *) name)==4 ) { + *color = (((temp&0xf00)*0x11)<<8) | + (((temp&0x0f0)*0x11)<<4) | + (((temp&0x00f)*0x11) ); + } else if ( strlen( (char *) name)==7 ) { + *color = temp; + } else + *color = COLOR_INHERITED; + } else if ( strncmp( (char *) name, "rgb(",4)==0 ) { + float r,g,b; + sscanf((char *)name + 4, "%g,%g,%g", &r, &g, &b ); + if ( strchr((char *) name,'.')!=NULL ) { + if ( r>=1 ) r = 1; else if ( r<0 ) r=0; + if ( g>=1 ) g = 1; else if ( g<0 ) g=0; + if ( b>=1 ) b = 1; else if ( b<0 ) b=0; + *color = ( ((int) rint(r*255))<<16 ) | + ( ((int) rint(g*255))<<8 ) | + ( ((int) rint(b*255)) ); + } else { + if ( r>=255 ) r = 255; else if ( r<0 ) r=0; + if ( g>=255 ) g = 255; else if ( g<0 ) g=0; + if ( b>=255 ) b = 255; else if ( b<0 ) b=0; + *color = ( ((int) r)<<16 ) | + ( ((int) g)<<8 ) | + ( ((int) b) ); + } + } else { + fprintf( stderr, "Failed to parse color %s\n", (char *) name ); + *color = COLOR_INHERITED; + } + } +return( doit ); +} + +static Entity *EntityCreate(SplinePointList *head,struct svg_state *state) { + Entity *ent = gcalloc(1,sizeof(Entity)); + ent->type = et_splines; + ent->u.splines.splines = head; + ent->u.splines.cap = state->lc; + ent->u.splines.join = state->lj; + ent->u.splines.stroke_width = state->linewidth; + ent->u.splines.fill.col = state->dofill ? state->fillcol : state->dostroke ? 0xffffffff : COLOR_INHERITED; + ent->u.splines.stroke.col = state->dostroke ? state->strokecol : 0xffffffff; + ent->u.splines.fill.opacity = state->fillopacity; + ent->u.splines.stroke.opacity = state->strokeopacity; + memcpy(ent->u.splines.transform,state->transform,6*sizeof(real)); +return( ent ); +} + +static Entity *_SVGParseSVG(xmlNodePtr svg, xmlNodePtr top, + struct svg_state *inherit) { + struct svg_state st; + xmlChar *name; + xmlNodePtr kid; + Entity *ehead, *elast, *eret; + SplineSet *head; + int treat_symbol_as_g = false; + + if ( svg==NULL ) +return( NULL ); + + st = *inherit; + tail_recurse: + name = _xmlGetProp(svg,(xmlChar *) "display"); + if ( name!=NULL ) { + int hide = _xmlStrcmp(name,(xmlChar *) "none")==0; + _xmlFree(name); + if ( hide ) +return( NULL ); + } + name = _xmlGetProp(svg,(xmlChar *) "visibility"); + if ( name!=NULL ) { + st.isvisible = _xmlStrcmp(name,(xmlChar *) "hidden")!=0 && + _xmlStrcmp(name,(xmlChar *) "colapse")!=0; + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "fill"); + if ( name!=NULL ) { + st.dofill = xmlParseColor(name,&st.fillcol); + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "fill-opacity"); + if ( name!=NULL ) { + st.strokeopacity = strtod((char *)name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "stroke"); + if ( name!=NULL ) { + st.dostroke = xmlParseColor(name,&st.strokecol); + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "stroke-opacity"); + if ( name!=NULL ) { + st.strokeopacity = strtod((char *)name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "stroke-width"); + if ( name!=NULL ) { + st.linewidth = strtod((char *)name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "stroke-linecap"); + if ( name!=NULL ) { + st.lc = _xmlStrcmp(name,(xmlChar *) "butt") ? lc_butt : + _xmlStrcmp(name,(xmlChar *) "round") ? lc_round : + lc_square; + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "stroke-linejoin"); + if ( name!=NULL ) { + st.lc = _xmlStrcmp(name,(xmlChar *) "miter") ? lj_miter : + _xmlStrcmp(name,(xmlChar *) "round") ? lj_round : + lj_bevel; + _xmlFree(name); + } + name = _xmlGetProp(svg,(xmlChar *) "transform"); + if ( name!=NULL ) { + SVGFigureTransform(&st,(char *) name); + _xmlFree(name); + } + + if ( (treat_symbol_as_g && _xmlStrcmp(svg->name,(xmlChar *) "symbol")==0) || + _xmlStrcmp(svg->name,(xmlChar *) "svg")==0 || + _xmlStrcmp(svg->name,(xmlChar *) "g")==0 ) { + ehead = elast = NULL; + for ( kid = svg->children; kid!=NULL; kid=kid->next ) { + eret = _SVGParseSVG(kid,top,&st); + if ( eret!=NULL ) { + if ( elast==NULL ) + ehead = eret; + else + elast->next = eret; + while ( eret->next!=NULL ) eret = eret->next; + elast = eret; + } + } +return( ehead ); + } else if ( _xmlStrcmp(svg->name,(xmlChar *) "use")==0 ) { + name = _xmlGetProp(svg,(xmlChar *) "href"); + kid = NULL; + if ( name!=NULL && *name=='#' ) { /* Within this file */ + kid = XmlFindID(top,(char *) name+1); + treat_symbol_as_g = true; + } + SVGuseTransform(&st,svg,kid); + svg = kid; + if ( name!=NULL ) + _xmlFree(name); + if ( svg!=NULL ) + goto tail_recurse; +return( NULL ); + } + + if ( !st.isvisible ) +return( NULL ); + + /* basic shapes */ + head = NULL; + if ( _xmlStrcmp(svg->name,(xmlChar *) "path")==0 ) { + name = _xmlGetProp(svg,(xmlChar *) "d"); + if ( name!=NULL ) { + head = SVGParsePath(name); + _xmlFree(name); + } + } else if ( _xmlStrcmp(svg->name,(xmlChar *) "rect")==0 ) { + head = SVGParseRect(svg); /* x,y,width,height,rx,ry */ + } else if ( _xmlStrcmp(svg->name,(xmlChar *) "circle")==0 ) { + head = SVGParseEllipse(svg,true); /* cx,cy, r */ + } else if ( _xmlStrcmp(svg->name,(xmlChar *) "ellipse")==0 ) { + head = SVGParseEllipse(svg,false); /* cx,cy, rx,ry */ + } else if ( _xmlStrcmp(svg->name,(xmlChar *) "line")==0 ) { + head = SVGParseLine(svg); /* x1,y1, x2,y2 */ + } else if ( _xmlStrcmp(svg->name,(xmlChar *) "polyline")==0 ) { + head = SVGParsePoly(svg,0); /* points */ + } else if ( _xmlStrcmp(svg->name,(xmlChar *) "polygon")==0 ) { + head = SVGParsePoly(svg,1); /* points */ + } else +return( NULL ); + if ( head==NULL ) +return( NULL ); + + SPLCatagorizePoints(head); + +return( EntityCreate(SplinePointListTransform(head,st.transform,true), + &st)); +} + +static Entity *SVGParseSVG(xmlNodePtr svg,int em_size,int ascent) { + struct svg_state st; + char *num, *end; + double x,y,swidth,sheight,width=1,height=1; + + memset(&st,0,sizeof(st)); + st.lc = lc_inherited; + st.lj = lj_inherited; + st.linewidth = WIDTH_INHERITED; + st.fillcol = COLOR_INHERITED; + st.strokecol = COLOR_INHERITED; + st.isvisible = true; + st.transform[0] = 1; + st.transform[3] = -1; /* The SVG coord system has y increasing down */ + /* Font coords have y increasing up */ + st.transform[5] = ascent; + st.strokeopacity = st.fillopacity = 1.0; + + num = (char *) _xmlGetProp(svg,(xmlChar *) "width"); + if ( num!=NULL ) { + width = strtod(num,NULL); + _xmlFree(num); + } + num = (char *) _xmlGetProp(svg,(xmlChar *) "height"); + if ( num!=NULL ) { + height = strtod(num,NULL); + _xmlFree(num); + } + if ( height<=0 ) height = 1; + if ( width<=0 ) width = 1; + num = (char *) _xmlGetProp(svg,(xmlChar *) "viewBox"); + if ( num!=NULL ) { + x = strtod((char *) num,&end); + y = strtod((char *) end+1,&end); + swidth = strtod((char *) end+1,&end); + sheight = strtod((char *) end+1,&end); + _xmlFree(num); + if ( width>height ) { + if ( swidth!=0 ) st.transform[0] *= em_size/swidth; + if ( sheight!=0 ) st.transform[3] *= em_size/(sheight*width/height); + } else { + if ( swidth!=0 ) st.transform[0] *= em_size/(swidth*height/width); + if ( sheight!=0 ) st.transform[3] *= em_size/sheight; + } + } +return( _SVGParseSVG(svg,svg,&st)); +} + +static void SVGParseGlyphBody(SplineChar *sc, xmlNodePtr glyph,int *flags) { + xmlChar *path; + + path = _xmlGetProp(glyph,(xmlChar *) "d"); + if ( path!=NULL ) { + sc->layers[ly_fore].splines = SVGParsePath(path); + _xmlFree(path); + } else { + Entity *ent = SVGParseSVG(glyph,sc->parent->ascent+sc->parent->descent, + sc->parent->ascent); +#ifdef FONTFORGE_CONFIG_TYPE3 + sc->layer_cnt = 1; + SCAppendEntityLayers(sc,ent); + if ( sc->layer_cnt==1 ) ++sc->layer_cnt; + sc->parent->multilayer = true; +#else + sc->layers[ly_fore].splines = SplinesFromEntities(ent,flags); +#endif + } +} + +static SplineChar *SVGParseGlyphArgs(xmlNodePtr glyph,int defh, int defv) { + SplineChar *sc = SplineCharCreate(); + xmlChar *name, *form, *glyphname, *unicode, *orientation; + int32 *u; + char buffer[100]; + + name = _xmlGetProp(glyph,(xmlChar *) "horiz-adv-x"); + if ( name!=NULL ) { + sc->width = strtod((char *) name,NULL); + _xmlFree(name); + } else + sc->width = defh; + name = _xmlGetProp(glyph,(xmlChar *) "vert-adv-y"); + if ( name!=NULL ) { + sc->vwidth = strtod((char *) name,NULL); + _xmlFree(name); + } else + sc->vwidth = defv; + name = _xmlGetProp(glyph,(xmlChar *) "vert-adv-y"); + if ( name!=NULL ) { + sc->vwidth = strtod((char *) name,NULL); + _xmlFree(name); + } else + sc->vwidth = defv; + + form = _xmlGetProp(glyph,(xmlChar *) "arabic-form"); + unicode = _xmlGetProp(glyph,(xmlChar *) "unicode"); + glyphname = _xmlGetProp(glyph,(xmlChar *) "glyph-name"); + orientation = _xmlGetProp(glyph,(xmlChar *) "orientation"); + if ( unicode!=NULL ) { + u = utf82u32_copy((char *) unicode); + _xmlFree(unicode); + if ( u[1]=='\0' ) { + sc->unicodeenc = u[0]; + if ( form!=NULL && u[0]>=0x600 && u[0]<=0x6ff ) { + if ( _xmlStrcmp(form,(xmlChar *) "initial")==0 ) + sc->unicodeenc = ArabicForms[u[0]-0x600].initial; + else if ( _xmlStrcmp(form,(xmlChar *) "medial")==0 ) + sc->unicodeenc = ArabicForms[u[0]-0x600].medial; + else if ( _xmlStrcmp(form,(xmlChar *) "final")==0 ) + sc->unicodeenc = ArabicForms[u[0]-0x600].final; + else if ( _xmlStrcmp(form,(xmlChar *) "isolated")==0 ) + sc->unicodeenc = ArabicForms[u[0]-0x600].isolated; + } + } + free(u); + } + if ( glyphname!=NULL ) { + if ( sc->unicodeenc==-1 ) + sc->unicodeenc = UniFromName((char *) glyphname); + sc->name = copy((char *) glyphname); + _xmlFree(glyphname); + } else if ( orientation!=NULL && *orientation=='v' && sc->unicodeenc!=-1 ) { + if ( sc->unicodeenc<0x10000 ) + sprintf( buffer, "uni%04X.vert", sc->unicodeenc ); + else + sprintf( buffer, "u%04X.vert", sc->unicodeenc ); + sc->name = copy( buffer ); + } + /* we finish off defaulting the glyph name in the parseglyph routine */ + if ( form!=NULL ) + _xmlFree(form); + if ( orientation!=NULL ) + _xmlFree(orientation); +return( sc ); +} + +static SplineChar *SVGParseMissing(SplineFont *sf,xmlNodePtr notdef,int defh, int defv, int enc, int *flags) { + SplineChar *sc = SVGParseGlyphArgs(notdef,defh,defv); + sc->parent = sf; sc->enc = enc; + sc->name = copy(".notdef"); + sc->unicodeenc = 0; + SVGParseGlyphBody(sc,notdef,flags); +return( sc ); +} + +static SplineChar *SVGParseGlyph(SplineFont *sf,xmlNodePtr glyph,int defh, int defv, int enc, int *flags) { + char buffer[40]; + SplineChar *sc = SVGParseGlyphArgs(glyph,defh,defv); + sc->parent = sf; sc->enc = enc; + if ( sc->name==NULL ) { + if ( sc->unicodeenc==-1 ) + sprintf( buffer, "glyph%d", enc); + else if ( sc->unicodeenc>=0x10000 ) + sprintf( buffer, "u%04X", sc->unicodeenc ); + else if ( psunicodenames[sc->unicodeenc]!=NULL ) + strcpy(buffer,psunicodenames[sc->unicodeenc]); + else + sprintf( buffer, "uni%04X", sc->unicodeenc ); + sc->name = copy(buffer); + } + SVGParseGlyphBody(sc,glyph,flags); +return( sc ); +} + +static PST *AddLig(PST *last,uint32 tag,char *components,SplineChar *first) { + PST *lig = chunkalloc(sizeof(PST)); + lig->tag = tag; + lig->flags = PSTDefaultFlags(pst_ligature,first); + lig->type = pst_ligature; + lig->script_lang_index = SFAddScriptLangIndex(first->parent, + SCScriptFromUnicode(first),DEFAULT_LANG); + lig->next = last; + lig->u.lig.components = copy(components); +return( lig ); +} + +static void SVGLigatureFixupCheck(SplineChar *sc,xmlNodePtr glyph) { + xmlChar *unicode; + int32 *u; + int len, len2; + SplineChar **chars, *any = NULL; + char *comp, *pt; + + unicode = _xmlGetProp(glyph,(xmlChar *) "unicode"); + if ( unicode!=NULL ) { + u = utf82u32_copy((char *) unicode); + _xmlFree(unicode); + if ( u[1]!='\0' ) { + for ( len=0; u[len]!=0; ++len ); + chars = galloc(len*sizeof(SplineChar *)); + for ( len=len2=0; u[len]!=0; ++len ) { + chars[len] = SFGetChar(sc->parent,u[len],NULL); + if ( chars[len]==NULL ) + len2 += 9; + else { + len2 += strlen(chars[len]->name); + if ( any==NULL ) any = chars[len]; + } + } + if ( any==NULL ) any=sc; + comp = pt = galloc(len2+1); + *pt = '\0'; + for ( len=0; u[len]!=0; ++len ) { + if ( chars[len]!=NULL ) + strcpy(pt,chars[len]->name); + else if ( u[len]<0x10000 ) + sprintf(pt,"uni%04X", u[len]); + else + sprintf(pt,"u%04X", u[len]); + pt += strlen(pt); + if ( u[len+1]!='\0' ) + *pt++ = ' '; + } + sc->possub = AddLig(sc->possub,CHR('l','i','g','a'),comp,any); + /* Understand the unicode latin ligatures. There are too many */ + /* arabic ones */ + if ( u[0]=='f' ) { + if ( u[1]=='f' && u[2]==0 ) + sc->unicodeenc = 0xfb00; + else if ( u[1]=='i' && u[2]==0 ) + sc->unicodeenc = 0xfb01; + else if ( u[1]=='l' && u[2]==0 ) + sc->unicodeenc = 0xfb02; + else if ( u[1]=='f' && u[2]=='i' && u[3]==0 ) + sc->unicodeenc = 0xfb03; + else if ( u[1]=='f' && u[2]=='l' && u[3]==0 ) + sc->unicodeenc = 0xfb04; + else if ( u[1]=='t' && u[2]==0 ) + sc->unicodeenc = 0xfb05; + } else if ( u[0]=='s' && u[1]=='t' && u[2]==0 ) + sc->unicodeenc = 0xfb06; + if ( strncmp(sc->name,"glyph",5)==0 && isdigit(sc->name[5])) { + /* It's a default name, we can do better */ + free(sc->name); + sc->name = copy(comp); + for ( pt = sc->name; *pt; ++pt ) + if ( *pt==' ' ) *pt = '_'; + } + } + } +} + +static char *SVGGetNames(SplineFont *sf,xmlChar *g,xmlChar *utf8,SplineChar **sc) { + int32 *u=NULL; + char *names; + int len, i, ch; + SplineChar *temp; + char *pt, *gpt; + + *sc = NULL; + len = 0; + if ( utf8!=NULL ) { + u = utf82u32_copy((char *) utf8); + for ( i=0; u[i]!=0; ++i ) { + temp = SFGetChar(sf,u[i],NULL); + if ( temp!=NULL ) { + if ( *sc==NULL ) *sc = temp; + len = strlen(temp->name)+1; + } + } + } + names = pt = galloc(len+(g!=NULL?strlen((char *)g):0)+1); + if ( utf8!=NULL ) { + for ( i=0; u[i]!=0; ++i ) { + temp = SFGetChar(sf,u[i],NULL); + if ( temp!=NULL ) { + strcpy(pt,temp->name); + pt += strlen( pt ); + *pt++ = ' '; + } + } + free(u); + } + if ( g!=NULL ) { + for ( gpt=(char *) g; *gpt; ) { + if ( *gpt==',' || isspace(*gpt)) { + while ( *gpt==',' || isspace(*gpt)) ++gpt; + *pt++ = ' '; + } else { + *pt++ = *gpt++; + } + } + if ( *sc==NULL ) { + for ( gpt = (char *) g; *gpt!='\0' && *gpt!=',' && !isspace(*gpt); ++gpt ); + ch = *gpt; *gpt = '\0'; + *sc = SFGetChar(sf,-1,(char *) g); + *gpt = ch; + } + } + if ( pt>names && pt[-1]==' ' ) --pt; + *pt = '\0'; +return( names ); +} + +static void SVGParseKern(SplineFont *sf,xmlNodePtr kern,int isv) { + xmlChar *k, *g1, *u1, *g2, *u2; + double off; + char *c1, *c2; + SplineChar *sc1, *sc2; + + k = _xmlGetProp(kern,(xmlChar *) "k"); + if ( k==NULL ) +return; + off = -strtod((char *)k, NULL); + _xmlFree(k); + if ( off==0 ) +return; + + g1 = _xmlGetProp(kern,(xmlChar *) "g1"); + u1 = _xmlGetProp(kern,(xmlChar *) "u1"); + if ( g1==NULL && u1==NULL ) +return; + c1 = SVGGetNames(sf,g1,u1,&sc1); + if ( g1!=NULL ) _xmlFree(g1); + if ( u1!=NULL ) _xmlFree(u1); + + g2 = _xmlGetProp(kern,(xmlChar *) "g2"); + u2 = _xmlGetProp(kern,(xmlChar *) "u2"); + if ( g2==NULL && u2==NULL ) { + free(c1); +return; + } + c2 = SVGGetNames(sf,g2,u2,&sc2); + if ( g2!=NULL ) _xmlFree(g2); + if ( u2!=NULL ) _xmlFree(u2); + + if ( strchr(c1,' ')==NULL && strchr(c2,' ')==NULL ) { + KernPair *kp = chunkalloc(sizeof(KernPair)); + kp->sc = sc2; + kp->off = off; + if ( isv ) { + kp->next = sc1->vkerns; + sc1->vkerns = kp; + } else { + kp->next = sc1->kerns; + sc1->kerns = kp; + } + free(c1); free(c2); + } else { + KernClass *kc = chunkalloc(sizeof(KernClass)); + if ( isv ) { + kc->next = sf->vkerns; + sf->vkerns = kc; + } else { + kc->next = sf->kerns; + sf->kerns = kc; + } + kc->first_cnt = kc->second_cnt = 2; + kc->firsts = gcalloc(2,sizeof(char *)); + kc->firsts[1] = c1; + kc->seconds = gcalloc(2,sizeof(char *)); + kc->seconds[1] = c2; + kc->offsets = gcalloc(4,sizeof(int16)); + kc->offsets[3] = off; + kc->flags = ((sc1!=NULL && SCRightToLeft(sc1)) || + (sc1==NULL && sc2!=NULL && SCRightToLeft(sc2)))? pst_r2l : 0; + if ( sc1!=NULL || sc2!=NULL ) + kc->sli = SCDefaultSLI(sf,sc1!=NULL ? sc1 : sc2 ); + } +} + +static SplineFont *SVGParseFont(xmlNodePtr font) { + int cnt, flags = -1; + xmlNodePtr kids; + int defh=0, defv=0; + xmlChar *name; + SplineFont *sf; + + sf = SplineFontEmpty(); + name = _xmlGetProp(font,(xmlChar *) "horiz-adv-x"); + if ( name!=NULL ) { + defh = strtod((char *) name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(font,(xmlChar *) "vert-adv-y"); + if ( name!=NULL ) { + defv = strtod((char *) name,NULL); + _xmlFree(name); + sf->hasvmetrics = true; + } + name = _xmlGetProp(font,(xmlChar *) "id"); + if ( name!=NULL ) { + sf->fontname = copy( (char *) name); + _xmlFree(name); + } + + cnt = 0; + for ( kids = font->children; kids!=NULL; kids=kids->next ) { + int ascent=0, descent=0; + if ( _xmlStrcmp(kids->name,(const xmlChar *) "font-face")==0 ) { + name = _xmlGetProp(kids,(xmlChar *) "units-per-em"); + if ( name!=NULL ) { + int val = rint(strtod((char *) name,NULL)); + _xmlFree(name); + if ( val<0 ) val = 0; + sf->ascent = val*800/1000; + sf->descent = val - sf->ascent; + if ( defv==0 ) defv = val; + if ( defh==0 ) defh = val; + SFDefaultOS2Simple(&sf->pfminfo,sf); + } else { + fprintf( stderr, "This font does not specify units-per-em\n" ); + SplineFontFree(sf); +return( NULL ); + } + name = _xmlGetProp(kids,(xmlChar *) "font-family"); + if ( name!=NULL ) { + if ( strchr((char *) name,',')!=NULL ) + *strchr((char *) name,',') ='\0'; + sf->familyname = copy( (char *) name); + _xmlFree(name); + } + name = _xmlGetProp(kids,(xmlChar *) "font-weight"); + if ( name!=NULL ) { + if ( strnmatch((char *) name,"normal",6)==0 ) { + sf->pfminfo.weight = 400; + sf->weight = copy("Regular"); + sf->pfminfo.panose[2] = 5; + } else if ( strnmatch((char *) name,"bold",4)==0 ) { + sf->pfminfo.weight = 700; + sf->weight = copy("Bold"); + sf->pfminfo.panose[2] = 8; + } else { + sf->pfminfo.weight = strtod((char *) name,NULL); + if ( sf->pfminfo.weight <= 100 ) { + sf->weight = copy("Thin"); + sf->pfminfo.panose[2] = 2; + } else if ( sf->pfminfo.weight <= 200 ) { + sf->weight = copy("Extra-Light"); + sf->pfminfo.panose[2] = 3; + } else if ( sf->pfminfo.weight <= 300 ) { + sf->weight = copy("Light"); + sf->pfminfo.panose[2] = 4; + } else if ( sf->pfminfo.weight <= 400 ) { + sf->weight = copy("Regular"); + sf->pfminfo.panose[2] = 5; + } else if ( sf->pfminfo.weight <= 500 ) { + sf->weight = copy("Medium"); + sf->pfminfo.panose[2] = 6; + } else if ( sf->pfminfo.weight <= 600 ) { + sf->weight = copy("DemiBold"); + sf->pfminfo.panose[2] = 7; + } else if ( sf->pfminfo.weight <= 700 ) { + sf->weight = copy("Bold"); + sf->pfminfo.panose[2] = 8; + } else if ( sf->pfminfo.weight <= 800 ) { + sf->weight = copy("Heavy"); + sf->pfminfo.panose[2] = 9; + } else { + sf->weight = copy("Black"); + sf->pfminfo.panose[2] = 10; + } + } + _xmlFree(name); + } + name = _xmlGetProp(kids,(xmlChar *) "font-stretch"); + if ( name!=NULL ) { + if ( strnmatch((char *) name,"normal",6)==0 ) { + sf->pfminfo.panose[3] = 3; + sf->pfminfo.width = 5; + } else if ( strmatch((char *) name,"ultra-condensed")==0 ) { + sf->pfminfo.panose[3] = 8; + sf->pfminfo.width = 1; + } else if ( strmatch((char *) name,"extra-condensed")==0 ) { + sf->pfminfo.panose[3] = 8; + sf->pfminfo.width = 2; + } else if ( strmatch((char *) name,"condensed")==0 ) { + sf->pfminfo.panose[3] = 6; + sf->pfminfo.width = 3; + } else if ( strmatch((char *) name,"semi-condensed")==0 ) { + sf->pfminfo.panose[3] = 6; + sf->pfminfo.width = 4; + } else if ( strmatch((char *) name,"ultra-expanded")==0 ) { + sf->pfminfo.panose[3] = 7; + sf->pfminfo.width = 9; + } else if ( strmatch((char *) name,"extra-expanded")==0 ) { + sf->pfminfo.panose[3] = 7; + sf->pfminfo.width = 8; + } else if ( strmatch((char *) name,"expanded")==0 ) { + sf->pfminfo.panose[3] = 5; + sf->pfminfo.width = 7; + } else if ( strmatch((char *) name,"semi-expanded")==0 ) { + sf->pfminfo.panose[3] = 5; + sf->pfminfo.width = 6; + } + _xmlFree(name); + } + name = _xmlGetProp(kids,(xmlChar *) "panose-1"); + if ( name!=NULL ) { + char *pt, *end; + int i; + for ( i=0, pt=(char *) name; i<10 && *pt; pt = end, ++i ) { + sf->pfminfo.panose[i] = strtol(pt,&end,10); + } + } + name = _xmlGetProp(kids,(xmlChar *) "slope"); + if ( name!=NULL ) { + sf->italicangle = strtod((char *) name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(kids,(xmlChar *) "underline-position"); + if ( name!=NULL ) { + sf->upos = strtod((char *) name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(kids,(xmlChar *) "underline-thickness"); + if ( name!=NULL ) { + sf->uwidth = strtod((char *) name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(kids,(xmlChar *) "ascent"); + if ( name!=NULL ) { + ascent = strtod((char *) name,NULL); + _xmlFree(name); + } + name = _xmlGetProp(kids,(xmlChar *) "descent"); + if ( name!=NULL ) { + descent = strtod((char *) name,NULL); + _xmlFree(name); + } + if ( ascent-descent==sf->ascent+sf->descent ) { + sf->ascent = ascent; + sf->descent = -descent; + } + sf->pfminfo.pfmset = true; + } else if ( _xmlStrcmp(kids->name,(const xmlChar *) "glyph")==0 || + _xmlStrcmp(kids->name,(const xmlChar *) "missing-glyph")==0 ) + ++cnt; + } + if ( sf->descent==0 ) { + fprintf( stderr, "This font does not specify font-face\n" ); + SplineFontFree(sf); +return( NULL ); + } + if ( sf->weight==NULL ) + sf->weight = copy("Regular"); + if ( sf->fontname==NULL && sf->familyname==NULL ) + sf->fontname = GetNextUntitledName(); + if ( sf->familyname==NULL ) + sf->familyname = copy(sf->fontname); + if ( sf->fontname==NULL ) + sf->fontname = copy(sf->familyname); + sf->fullname = copy(sf->fontname); + + GProgressChangeTotal(cnt); + sf->charcnt = cnt; + sf->chars = galloc(cnt*sizeof(SplineChar *)); + sf->encoding_name = em_original; + + cnt = 0; + for ( kids = font->children; kids!=NULL; kids=kids->next ) { + if ( _xmlStrcmp(kids->name,(const xmlChar *) "missing-glyph")==0 ) { + sf->chars[cnt] = SVGParseMissing(sf,kids,defh,defv,cnt,&flags); + cnt++; + GProgressNext(); + } else if ( _xmlStrcmp(kids->name,(const xmlChar *) "glyph")==0 ) { + sf->chars[cnt] = SVGParseGlyph(sf,kids,defh,defv,cnt,&flags); + cnt++; + GProgressNext(); + } + } + cnt = 0; + for ( kids = font->children; kids!=NULL; kids=kids->next ) { + if ( _xmlStrcmp(kids->name,(const xmlChar *) "hkern")==0 ) { + SVGParseKern(sf,kids,false); + } else if ( _xmlStrcmp(kids->name,(const xmlChar *) "vkern")==0 ) { + SVGParseKern(sf,kids,true); + } else if ( _xmlStrcmp(kids->name,(const xmlChar *) "glyph")==0 ) { + SVGLigatureFixupCheck(sf->chars[cnt++],kids); + } else if ( _xmlStrcmp(kids->name,(const xmlChar *) "missing-glyph")==0 ) { + ++cnt; + } + } + +return( sf ); +} + +static int SPLFindOrder(SplineSet *ss) { + Spline *s, *first; + + while ( ss!=NULL ) { + first = NULL; + for ( s = ss->first->next; s!=NULL && s!=first ; s = s->to->next ) { + if ( first==NULL ) first = s; + if ( !s->knownlinear ) +return( s->order2 ); + } + ss = ss->next; + } +return( -1 ); +} + +static int EntFindOrder(Entity *ent) { + int ret; + + while ( ent!=NULL ) { + ret = SPLFindOrder(ent->u.splines.splines); + if ( ret!=-1 ) +return( ret ); + ent = ent->next; + } +return( -1 ); +} + +static int SFFindOrder(SplineFont *sf) { + int i, ret; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + ret = SPLFindOrder(sf->chars[i]->layers[ly_fore].splines); + if ( ret!=-1 ) +return( ret ); + } +return( 0 ); +} + +static void SPLSetOrder(SplineSet *ss,int order2) { + Spline *s, *first; + SplinePoint *from, *to; + + while ( ss!=NULL ) { + first = NULL; + for ( s = ss->first->next; s!=NULL && s!=first ; s = s->to->next ) { + if ( first==NULL ) first = s; + if ( s->order2!=order2 ) { + if ( s->knownlinear ) { + s->from->nextcp = s->from->me; + s->to->prevcp = s->to->me; + s->from->nonextcp = s->to->noprevcp = true; + s->order2 = order2; + } else if ( order2 ) { + from = SplineTtfApprox(s); + s->from->nextcp = from->nextcp; + s->from->nonextcp = from->nonextcp; + s->from->next = from->next; + from->next->from = s->from; + SplinePointFree(from); + for ( to = s->from->next->to; to->next!=NULL; to=to->next->to ); + s->to->prevcp = to->prevcp; + s->to->noprevcp = to->noprevcp; + s->to->prev = to->prev; + to->prev->to = s->to; + SplinePointFree(to); + to = s->to; + from = s->from; + SplineFree(s); + if ( first==s ) first = from->next; + s = to->prev; + } else { + s->from->nextcp.x = s->splines[0].c/3 + s->from->me.x; + s->from->nextcp.y = s->splines[1].c/3 + s->from->me.y; + s->to->prevcp.x = s->from->nextcp.x+ (s->splines[0].b+s->splines[0].c)/3; + s->to->prevcp.y = s->from->nextcp.y+ (s->splines[1].b+s->splines[1].c)/3; + s->order2 = false; + SplineRefigure(s); + } + } + } + ss = ss->next; + } +} + +static void EntSetOrder(Entity *ent,int order2) { + while ( ent!=NULL ) { + SPLSetOrder(ent->u.splines.splines,order2); + ent = ent->next; + } +} + +static void SFSetOrder(SplineFont *sf,int order2) { + int i,j; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( j=ly_fore; jchars[i]->layer_cnt; ++j ) + SPLSetOrder(sf->chars[i]->layers[j].splines,order2); + } +} + +SplineFont *SFReadSVG(char *filename, int flags) { + xmlNodePtr *fonts, font; + xmlDocPtr doc; + SplineFont *sf; + char *temp=filename, *pt, *lparen; + char *oldloc; + char *chosenname = NULL; + + if ( !libxml_init_base()) { + fprintf( stderr, "Can't find libxml2.\n" ); +return( NULL ); + } + + pt = strrchr(filename,'/'); + if ( pt==NULL ) pt = filename; + if ( (lparen=strchr(pt,'('))!=NULL && strchr(lparen,')')!=NULL ) { + temp = copy(filename); + pt = temp + (lparen-filename); + *pt = '\0'; + } + + doc = _xmlParseFile(temp); + if ( temp!=filename ) free(temp); + if ( doc==NULL ) { + /* Can I get an error message from libxml? */ +return( NULL ); + } + + fonts = FindSVGFontNodes(doc); + if ( fonts==NULL || fonts[0]==NULL ) { + fprintf( stderr, "This file contains no SVG fonts.\n" ); + _xmlFreeDoc(doc); +return( NULL ); + } + font = fonts[0]; + if ( fonts[1]!=NULL ) { + xmlChar *name; + font = SVGPickFont(fonts,filename); + name = _xmlGetProp(font,(xmlChar *) "id"); + if ( name!=NULL ) { + chosenname = cu_copy(utf82u_copy((char *) name)); + _xmlFree(name); + } + } + free(fonts); + oldloc = setlocale(LC_NUMERIC,"C"); + sf = SVGParseFont(font); + setlocale(LC_NUMERIC,oldloc); + _xmlFreeDoc(doc); + + if ( sf!=NULL ) { + sf->order2 = SFFindOrder(sf); + SFSetOrder(sf,sf->order2); + sf->chosenname = chosenname; + } +return( sf ); +} + +char **NamesReadSVG(char *filename) { + xmlNodePtr *fonts; + xmlDocPtr doc; + char **ret=NULL; + unichar_t *utemp; + int cnt; + xmlChar *name; + + if ( !libxml_init_base()) { + fprintf( stderr, "Can't find libxml2.\n" ); +return( NULL ); + } + + doc = _xmlParseFile(filename); + if ( doc==NULL ) { + /* Can I get an error message from libxml? */ +return( NULL ); + } + + fonts = FindSVGFontNodes(doc); + if ( fonts==NULL || fonts[0]==NULL ) { + _xmlFreeDoc(doc); +return( NULL ); + } + + for ( cnt=0; fonts[cnt]!=NULL; ++cnt); + ret = galloc((cnt+1)*sizeof(char *)); + for ( cnt=0; fonts[cnt]!=NULL; ++cnt) { + name = _xmlGetProp(fonts[cnt],(xmlChar *) "id"); + if ( name==NULL ) { + ret[cnt] = copy("nameless-font"); + } else { + utemp = utf82u_copy((char *) name); + ret[cnt] = cu_copy(utemp); + free(utemp); + _xmlFree(name); + } + } + ret[cnt] = NULL; + + free(fonts); + _xmlFreeDoc(doc); + +return( ret ); +} + +Entity *EntityInterpretSVG(char *filename,int em_size,int ascent) { + xmlDocPtr doc; + xmlNodePtr top; + char *oldloc; + Entity *ret; + int order2; + + if ( !libxml_init_base()) { + fprintf( stderr, "Can't find libxml2.\n" ); +return( NULL ); + } + doc = _xmlParseFile(filename); + if ( doc==NULL ) { + /* Can I get an error message from libxml???? */ +return( NULL ); + } + + top = _xmlDocGetRootElement(doc); + if ( _xmlStrcmp(top->name,(xmlChar *) "svg")!=0 ) { + fprintf( stderr, "%s does not contain an element at the top\n", filename); + _xmlFreeDoc(doc); +return( NULL ); + } + + oldloc = setlocale(LC_NUMERIC,"C"); + ret = SVGParseSVG(top,em_size,ascent); + setlocale(LC_NUMERIC,oldloc); + _xmlFreeDoc(doc); + + if ( loaded_fonts_same_as_new ) + order2 = new_fonts_are_order2; + else + order2 = EntFindOrder(ret); + if ( order2==-1 ) order2 = 0; + EntSetOrder(ret,order2); + +return( ret ); +} + +SplineSet *SplinePointListInterpretSVG(char *filename,int em_size,int ascent) { + Entity *ret = EntityInterpretSVG(filename, em_size, ascent); + int flags = -1; +return( SplinesFromEntities(ret,&flags)); +} +#endif diff --git a/fontforge/threaddummy.c b/fontforge/threaddummy.c new file mode 100644 index 00000000..ade90ac9 --- /dev/null +++ b/fontforge/threaddummy.c @@ -0,0 +1,4 @@ +#include +void pthread_create() { + printf( "You are about to die! attempt to use pthreads in something not linked\n with them\n" ); +} diff --git a/fontforge/tilepath.c b/fontforge/tilepath.c new file mode 100644 index 00000000..fe4f1758 --- /dev/null +++ b/fontforge/tilepath.c @@ -0,0 +1,897 @@ +/* Copyright (C) 2002-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include + +#ifdef FONTFORGE_CONFIG_TILEPATH +/* Given a path and a splineset */ +/* Treat the splineset as a tile and lay it down on the path until we reach the*/ +/* end of the path */ +/* More precisely, find the length of the path */ +/* Find the height of the tile */ +/* We'll need length/height tiles */ +/* For each tile */ +/* For a point on the central (in x) axis of the tile */ +/* Use its y-position to figure out how far along the path we are ( y-pos/length ) */ +/* Then this point should be moved to exactly that point */ +/* For a point off the central axis */ +/* Perform the above calculation, and */ +/* Find the normal vector to the path */ +/* Our new location should be: */ +/* the location found above + our xoffset * (normal vector) */ +/* Do that for a lot of points on each spline of the tile and then */ +/* use approximate spline from points to find the new splines */ +/* Complications: */ +/* There may not be an integral number of tiles, so we must be prepared to truncate some splines */ + +typedef struct tiledata { + SplineSet *basetile; /* Moved so that ymin==0, and x is adjusted */ + /* about the x-axis as implied by tilepos */ + SplineSet *tileset; /* As many copies of the basetile as we are */ + /* going to need. Each successive one bb.ymax */ + /* higher than the last */ + SplineSet *result; /* Final result after transformation */ + DBounds bb; /* Of the basetile */ + + SplineSet *path; + double plength; /* Length of path */ + int pcnt; /* Number of splines in path */ + int nsamples; + struct tdsample { + real dx, dy; /* offset from path->first->me */ + real c,s; /* cos/sin of normal vector pointing right of path */ + } *samples; /* an array of [nsamples+1] actually */ + int njoins; + struct jsample { + real dx, dy; + real c1,s1; + real c2,s2; + real sofar; + } *joins; /* an array of [pcnt or pcnt-1], one of each join */ + + enum tilepos { tp_left, tp_center, tp_right } tilepos; + enum tilescale { ts_tile, ts_tilescale, ts_scale } tilescale; + /* ts_scale means that we scale the one tile until it height is the same */ + /* as plength */ + /* ts_tile means that we lay down as many tiles as we need so that */ + /* n*tile-height == plength. Note: n need not be an integer, so we */ + /* may be an incomplete tile => incomplete splines (a spline may even */ + /* get cut so that it becomes two splines) */ + /* ts_tilescale means that we find n = floor(plength/tile-height) and */ + /* scale = plength/(n*tile-height). We scale the tile by "scale", and */ + /* then lay down n of them */ + + int doallpaths; +} TD; + +static int TDMakeSamples(TD *td) { + Spline *spline, *first; + double len, slen, sofar, t, toff, dt_per_sample; + int i,end, base, pcnt; + double sx, sy, angle; + + first = NULL; len = 0; pcnt = 0; + for ( spline=td->path->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( first==NULL ) first = spline; + len += SplineLength(spline); + ++pcnt; + } + if ( len==0 ) +return( false ); + td->plength = len; + td->pcnt = pcnt; + + td->nsamples = ceil(len)+10; + td->samples = galloc((td->nsamples+1)*sizeof(struct tdsample)); + td->joins = galloc(td->pcnt*sizeof(struct jsample)); + + i = 0; pcnt = 0; + first = NULL; sofar = 0; + for ( spline=td->path->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( first==NULL ) first = spline; + slen = SplineLength(spline); + /* I'm assuming that length is approximately linear in t */ + toff = (i - td->nsamples*sofar/len)/slen; + base = i; + end = floor(td->nsamples*(sofar+slen)/len); + dt_per_sample = end==i?1:(1.0-toff)/(end-i); + if ( spline->to->next==NULL || spline->to->next==first ) + end = td->nsamples; + while ( i<=end ) { + t = toff + (i-base)*dt_per_sample; + if ( i==td->nsamples || t>1 ) t = 1; + td->samples[i].dx = ((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t + spline->splines[0].d /*- + td->path->first->me.x*/; + td->samples[i].dy = ((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t + spline->splines[1].d /*- + td->path->first->me.y*/; + sx = (3*spline->splines[0].a*t+2*spline->splines[0].b)*t+spline->splines[0].c; + sy = (3*spline->splines[1].a*t+2*spline->splines[1].b)*t+spline->splines[1].c; + if ( sx==0 && sy==0 ) { + sx = spline->to->me.x - spline->from->me.x; + sy = spline->to->me.y - spline->from->me.y; + } + angle = atan2(sy,sx) - 3.1415926535897932/2; + td->samples[i].c = cos(angle); + td->samples[i].s = sin(angle); + if ( td->samples[i].s>-.00001 && td->samples[i].s<.00001 ) { td->samples[i].s=0; td->samples[i].c = ( td->samples[i].c>0 )? 1 : -1; } + if ( td->samples[i].c>-.00001 && td->samples[i].c<.00001 ) { td->samples[i].c=0; td->samples[i].s = ( td->samples[i].s>0 )? 1 : -1; } + ++i; + } + sofar += slen; + if (( pcntpcnt-1 || td->path->first==td->path->last ) && + !((spline->to->pointtype==pt_curve && !spline->to->nonextcp && !spline->to->noprevcp) || + (spline->to->pointtype==pt_tangent && spline->to->nonextcp+spline->to->noprevcp==1 )) ) { + /* We aren't interested in joins where the two splines are tangent */ + Spline *next = spline->to->next; + td->joins[pcnt].sofar = sofar; + td->joins[pcnt].dx = spline->to->me.x; + td->joins[pcnt].dy = spline->to->me.y; + /* there are two normals at a join, one for each spline */ + /* it should bisect the normal vectors of the two splines */ + sx = next->splines[0].c; sy = next->splines[1].c; + angle = atan2(sy,sx) - 3.1415926535897932/2; + td->joins[pcnt].c1 = cos(angle); + td->joins[pcnt].s1 = sin(angle); + if ( td->joins[pcnt].s1>-.00001 && td->joins[pcnt].s1<.00001 ) { td->joins[pcnt].s1=0; td->joins[pcnt].c1 = ( td->joins[pcnt].c1>0 )? 1 : -1; } + if ( td->joins[pcnt].c1>-.00001 && td->joins[pcnt].c1<.00001 ) { td->joins[pcnt].c1=0; td->joins[pcnt].s1 = ( td->joins[pcnt].s1>0 )? 1 : -1; } + + sx = (3*spline->splines[0].a+2*spline->splines[0].b)+spline->splines[0].c; + sy = (3*spline->splines[1].a+2*spline->splines[1].b)+spline->splines[1].c; + angle = atan2(sy,sx) - 3.1415926535897932/2; + td->joins[pcnt].c2 = cos(angle); + td->joins[pcnt].s2 = sin(angle); + if ( td->joins[pcnt].s2>-.00001 && td->joins[pcnt].s2<.00001 ) { td->joins[pcnt].s2=0; td->joins[pcnt].c2 = ( td->joins[pcnt].c2>0 )? 1 : -1; } + if ( td->joins[pcnt].c2>-.00001 && td->joins[pcnt].c2<.00001 ) { td->joins[pcnt].c2=0; td->joins[pcnt].s2 = ( td->joins[pcnt].s2>0 )? 1 : -1; } + ++pcnt; + } + } + td->njoins = pcnt; + if ( i!=td->nsamples+1 ) + GDrawIError("Sample failure %d is not %d", i, td->samples+1 ); +return( true ); +} + +static void TDAddPoints(TD *td) { + /* Insert additional points in the tileset roughly at the locations */ + /* corresponding to the ends of the splines in the path */ + SplineSet *spl; + Spline *spline, *first, *tsp; + double len; + double ts[3]; + + first = NULL; len = 0; + for ( spline=td->path->first->next; spline!=NULL && spline!=first; spline=spline->to->next ) { + if ( first==NULL ) first = spline; + if ( spline->to->next==NULL || spline->to->next==first ) + break; + len += SplineLength(spline); + + for ( spl=td->tileset; spl!=NULL; spl=spl->next ) { + for ( tsp=spl->first->next; tsp!=NULL ; tsp = tsp->to->next ) { + if ( RealApprox(tsp->to->me.y,len) || RealApprox(tsp->from->me.y,len)) + /* Do Nothing, already broken here */; + else if ( (tsp->to->me.y>len || tsp->to->prevcp.y>len || tsp->from->me.y>len || tsp->from->nextcp.y>len) && + (tsp->to->me.yto->prevcp.yfrom->me.yfrom->nextcp.ysplines[1],len,ts) ) + SplineBisect(tsp,ts[0]); + if ( tsp->to == spl->first ) + break; + } + } + } +} + +static void SplineSplitAtY(Spline *spline,real y) { + double ts[3]; + SplinePoint *last; + + if ( spline->from->me.y<=y && spline->from->nextcp.y<=y && + spline->to->me.y<=y && spline->to->prevcp.y<=y ) +return; + if ( spline->from->me.y>=y && spline->from->nextcp.y>=y && + spline->to->me.y>=y && spline->to->prevcp.y>=y ) +return; + + + if ( !SplineSolveFull(&spline->splines[1],y,ts) ) +return; + + last = spline->to; + spline = SplineSplit(spline,ts); + while ( spline->to!=last ) { + if ( spline->to->me.y!=y ) { + real diff = y-spline->to->me.y; + spline->to->me.y = y; + spline->to->prevcp.y += diff; + spline->to->nextcp.y += diff; + SplineRefigure(spline); SplineRefigure(spline->to->next); + } + spline = spline->to->next; + } +} + +static void SplinesRemoveBetween( Spline *spline, Spline *beyond, SplineSet *spl ) { + Spline *next; + + while ( spline!=NULL && spline!=beyond ) { + next = spline->to->next; + if ( spline->from!=spl->last && spline->from!=spl->first ) + SplinePointFree(spline->from); + SplineFree(spline); + spline = next; + } +} + +static SplineSet *SplinePointListTruncateAtY(SplineSet *spl,real y) { + SplineSet *prev=NULL, *ss=spl, *nprev, *snext, *ns; + Spline *spline, *next; + + for ( ; spl!=NULL; spl = spl->next ) { + for ( spline=spl->first->next ; spline!=NULL; spline = next ) { + next = spline->to->next; + SplineSplitAtY(spline,y); + if ( next==NULL || next->from == spl->last ) + break; + } + } + + prev = NULL; + y += 1/128.0; /* Small fudge factor for rounding errors */ + for ( spl=ss; spl!=NULL; spl = snext ) { + snext = spl->next; + nprev = spl; + for ( spline=spl->first->next ; spline!=NULL ; spline = next ) { + next = spline->to->next; + if ( spline->from->me.y<=y && spline->from->nextcp.y<=y && + spline->to->me.y<=y && spline->to->prevcp.y<=y ) { + if ( spline->to==spl->first ) + break; + else + continue; + } + /* Remove this spline */ + while ( next!=NULL && next->from!=spl->first && + (next->from->me.y>y || next->from->nextcp.y>y || + next->to->me.y>y || next->to->prevcp.y>y) ) + next = next->to->next; + if ( next==NULL || next->from==spl->first ) { + /* The area to be removed continues to the end of splineset */ + if ( spline==spl->first->next ) { + /* Remove entire splineset */ + if ( prev==NULL ) + ss = snext; + else + prev->next = snext; + SplinePointListFree(spl); + nprev = prev; + break; + } + spl->last = spline->from; + spline->from->next = NULL; + spl->first->prev = NULL; + SplinesRemoveBetween(spline,next,spl); + break; + } else { + if ( spline==spl->first->next ) { + /* Remove everything before next */ + next->from->prev = NULL; + spl->first->next = NULL; + spl->first = next->from; + } else if ( spl->first==spl->last ) { + /* rotate splineset so break is at start and end. */ + spl->last = spline->from; + spl->first = next->from; + next->from->prev = NULL; + spline->from->next = NULL; + } else { + /* Split into two splinesets and remove all between */ + ns = chunkalloc(sizeof(SplineSet)); + ns->first = next->from; + ns->last = spl->last; + spl->last = spline->from; + spline->from->next = NULL; + spl->first->prev = NULL; + next->from->prev = NULL; + ns->last->next = NULL; + ns->next = spl->next; + spl->next = ns->next; + nprev = ns; + } + SplinesRemoveBetween(spline,next,spl); + spl = nprev; + } + } + prev = nprev; + } +return( ss ); +} + +static SplineSet *SplinePointListMerge(SplineSet *old,SplineSet *new) { + /* Merge the new splineset into the old looking for any endpoints */ + /* common to both, and if any are found, merging them */ + SplineSet *test1, *next; + SplineSet *oldold = old; + + while ( new!=NULL ) { + next = new->next; + if ( new->first!=new->last ) { + for ( test1=oldold; test1!=NULL; test1=test1->next ) { + if ( test1->first!=test1->last && + ((test1->first->me.x==new->first->me.x && test1->first->me.y==new->first->me.y) || + (test1->last->me.x==new->first->me.x && test1->last->me.y==new->first->me.y) || + (test1->first->me.x==new->last->me.x && test1->first->me.y==new->last->me.y) || + (test1->last->me.x==new->last->me.x && test1->last->me.y==new->last->me.y)) ) + break; + } + if ( test1!=NULL ) { + if ((test1->first->me.x==new->first->me.x && test1->first->me.y==new->first->me.y) || + (test1->last->me.x==new->last->me.x && test1->last->me.y==new->last->me.y)) + SplineSetReverse(new); + if ( test1->last->me.x==new->first->me.x && test1->last->me.y==new->first->me.y ) { + test1->last->nextcp = new->first->nextcp; + test1->last->nonextcp = new->first->nonextcp; + test1->last->nextcpdef = new->first->nextcpdef; + test1->last->next = new->first->next; + new->first->next->from = test1->last; + test1->last = new->last; + SplinePointFree(new->first); + new->first = new->last = NULL; + SplinePointListFree(new); + if ( test1->last->me.x == test1->first->me.x && + test1->last->me.y == test1->first->me.y ) { + test1->first->prevcp = test1->last->prevcp; + test1->first->noprevcp = test1->last->noprevcp; + test1->first->prevcpdef = test1->last->prevcpdef; + test1->last->prev->to = test1->first; + SplinePointFree(test1->last); + test1->last = test1->first; + } + } else { + test1->first->prevcp = new->last->prevcp; + test1->first->noprevcp = new->last->noprevcp; + test1->first->prevcpdef = new->last->prevcpdef; + test1->first->prev = new->last->prev; + new->last->prev->to = test1->first; + test1->first = new->first; + SplinePointFree(new->last); + new->first = new->last = NULL; + SplinePointListFree(new); + } + new = next; + continue; + } + } + new->next = old; + old = new; + new = next; + } +return( old ); +} + +static void TileLine(TD *td) { + int tilecnt=1, i; + double scale=1, y; + real trans[6]; + SplineSet *new; + + switch ( td->tilescale ) { + case ts_tile: + tilecnt = ceil( td->plength/td->bb.maxy ); + break; + case ts_scale: + scale = td->plength/td->bb.maxy ; + break; + case ts_tilescale: + scale = td->plength/td->bb.maxy ; + tilecnt = floor( scale ); + if ( tilecnt==0 ) + tilecnt = 1; + else if ( scale-tilecnt>.707 ) + ++tilecnt; + scale = td->plength/(tilecnt*td->bb.maxy); + break; + } + + y = 0; + trans[0] = 1; trans[3] = scale; /* Only scale y */ + trans[1] = trans[2] = trans[4] = trans[5] = 0; + for ( i=0; ibasetile); + trans[5] = y; + new = SplinePointListTransform(new,trans,true); + if ( i==tilecnt-1 && scale==1 ) + new = SplinePointListTruncateAtY(new,td->plength); + td->tileset = SplinePointListMerge(td->tileset,new); + y += td->bb.maxy*scale; + } + if ( td->pcnt>1 ) { + /* If there are fewer tiles than there are spline elements, then we */ + /* may not be able to do a good job approximating (suppose the path */ + /* draws a circle, but there is just one tile, a straight line. */ + /* without some extra points in the middle of that line there is no */ + /* way to make a circle). So here we add some extra breaks */ + /* Actually, it's worse than that. If the transition isn't smooth */ + /* then we'll always want those extra points... */ + TDAddPoints(td); + } +} + +static void AdjustPoint(TD *td,Spline *spline,double t,TPoint *to) { + double x, y; + double pos; + int low; + double dx, dy, c, s; + int i; + + to->t = t; + + x = ((spline->splines[0].a*t+spline->splines[0].b)*t+spline->splines[0].c)*t + spline->splines[0].d; + y = ((spline->splines[1].a*t+spline->splines[1].b)*t+spline->splines[1].c)*t + spline->splines[1].d; + + for ( i=td->pcnt-2; i>=0; --i ) + if ( RealNearish(y,td->joins[i].sofar) ) + break; + if ( i>=0 ) { + double x1,y1, x2, y2, dx1, dx2, dy1, dy2; + x1 = td->joins[i].dx + td->joins[i].c1*x; + y1 = td->joins[i].dy + td->joins[i].s1*x; + dx1 = -td->joins[i].s1; + dy1 = td->joins[i].c1; + + x2 = td->joins[i].dx + td->joins[i].c2*x; + y2 = td->joins[i].dy + td->joins[i].s2*x; + dx2 = -td->joins[i].s2; + dy2 = td->joins[i].c2; + /* there are two lines at a join and I need to find the intersection */ + if ( dy2>-.00001 && dy2<.00001 ) { + to->y = y2; + if ( dy1>-.00001 && dy1<.00001 ) /* essentially parallel */ + to->x = x2; + else + to->x = x1 + dx1*(y2-y1)/dy1; + } else { + double s=(dy1*dx2/dy2-dx1); + if ( s>-.00001 && s<.00001 ) { /* essentially parallel */ + to->x = x1; to->y = y1; + } else { + double t1 = (x1-x2- dx2/dy2*(y1-y2))/s; + to->x = x1 + dx1*t1; + to->y = y1 + dy1*t1; + } + } + } else { + pos = y/td->plength; + if ( pos<0 ) pos=0; /* should not happen */ + if ( pos>1 ) pos = 1; + + pos *= td->nsamples; + low = floor(pos); + pos -= low; + + if ( pos==0 || low==td->nsamples ) { + dx = td->samples[low].dx; + dy = td->samples[low].dy; + c = td->samples[low].c; + s = td->samples[low].s; + } else { + dx = (td->samples[low].dx*(1-pos) + td->samples[low+1].dx*pos); + dy = (td->samples[low].dy*(1-pos) + td->samples[low+1].dy*pos); + c = (td->samples[low].c*(1-pos) + td->samples[low+1].c*pos); + s = (td->samples[low].s*(1-pos) + td->samples[low+1].s*pos); + } + + to->x = dx + c*x; + to->y = dy + s*x; + } +} + +static SplinePoint *TDMakePoint(TD *td,Spline *old,real t) { + TPoint tp; + SplinePoint *new; + + AdjustPoint(td,old,t,&tp); + new = chunkalloc(sizeof(SplinePoint)); + new->me.x = tp.x; new->me.y = tp.y; + new->nextcp = new->me; + new->prevcp = new->me; + new->nonextcp = new->noprevcp = true; + new->nextcpdef = new->prevcpdef = false; +return( new ); +} + +static Spline *AdjustSpline(TD *td,Spline *old,SplinePoint *newfrom,SplinePoint *newto, + int order2) { + TPoint tps[15]; + int i; + double t; + + if ( newfrom==NULL ) + newfrom = TDMakePoint(td,old,0); + if ( newto==NULL ) + newto = TDMakePoint(td,old,1); + for ( i=1, t=1/16.0; i<16; ++i, t+= 1/16.0 ) + AdjustPoint(td,old,t,&tps[i-1]); +return( ApproximateSplineFromPoints(newfrom,newto,tps,15, order2) ); +} + +static void AdjustSplineSet(TD *td,int order2) { + SplineSet *spl, *last=NULL, *new; + Spline *spline, *s; + SplinePoint *lastsp, *nextsp, *sp; + + if ( td->result!=NULL ) + for ( last=td->result ; last->next!=NULL; last = last->next ); + + for ( spl=td->tileset; spl!=NULL; spl=spl->next ) { + new = chunkalloc(sizeof(SplineSet)); + if ( last==NULL ) + td->result = new; + else + last->next = new; + last = new; + new->first = lastsp = TDMakePoint(td,spl->first->next,0); + nextsp = NULL; + for ( spline=spl->first->next; spline!=NULL; spline=spline->to->next ) { + if ( spline->to==spl->first ) + nextsp = new->first; + s = AdjustSpline(td,spline,lastsp,nextsp,order2); + lastsp = s->to; + if ( nextsp!=NULL ) + break; + } + if ( lastsp!=new->first && + RealNearish(lastsp->me.x,new->first->me.x) && + RealNearish(lastsp->me.y,new->first->me.y) ) { + new->first->prev = lastsp->prev; + new->first->prevcp = lastsp->prevcp; + new->first->noprevcp = lastsp->noprevcp; + new->first->prevcpdef = lastsp->prevcpdef; + lastsp->prev->to = new->first; + new->last = new->first; + SplinePointFree(lastsp); + } else + new->last = lastsp; + + for ( sp = new->first; sp!=NULL; ) { + SplinePointCatagorize(sp); + if ( sp->next==NULL ) + break; + sp = sp->next->to; + if ( sp==new->first ) + break; + } + } +} + +static void TileSplineSets(TD *td,SplineSet **head,int order2) { + SplineSet *prev=NULL, *spl, *next; + + for ( spl = *head; spl!=NULL; spl = next ) { + next = spl->next; + if ( td->doallpaths || PointListIsSelected(spl)) { + if ( prev==NULL ) + *head = next; + else + prev->next = next; + td->path = spl; + if ( TDMakeSamples(td)) { + TileLine(td); + AdjustSplineSet(td,order2); + free( td->samples ); + free( td->joins ); + SplinePointListsFree(td->tileset); + } + SplinePointListFree(td->path); + td->path = td->tileset = NULL; + } else + prev = spl; + } + if ( *head==NULL ) + *head = td->result; + else { + for ( spl= *head; spl->next!=NULL; spl = spl->next ); + spl->next = td->result; + } +} + +static void TileIt(SplineSet **head,SplineSet *tile, + enum tilepos tilepos, enum tilescale tilescale, + int doall,int order2) { + TD td; + real trans[6]; + + memset(&td,0,sizeof(td)); + td.tilepos = tilepos; + td.tilescale = tilescale; + td.doallpaths = doall; + + td.basetile = tile; + SplineSetFindBounds(tile,&td.bb); + trans[0] = trans[3] = 1; + trans[1] = trans[2] = 0; + trans[5] = td.bb.miny; + trans[4] = -td.bb.minx; + if ( tilepos==tp_center ) + trans[4] -= (td.bb.maxx-td.bb.minx)/2; + else if ( tilepos==tp_left ) + trans[4] = -td.bb.maxx; + if ( trans[4]!=0 || trans[5]!=0 ) + SplinePointListTransform(tile,trans,true); + SplineSetFindBounds(tile,&td.bb); + + TileSplineSets(&td,head,order2); +} + +static enum tilepos tilepos=tp_center; +static enum tilescale tilescale=ts_tilescale; + +#define CID_Center 1001 +#define CID_Left 1002 +#define CID_Right 1003 +#define CID_Tile 1011 +#define CID_TileScale 1012 +#define CID_Scale 1013 + +struct tiledlg { + int done; + int cancelled; +}; + +static int TD_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct tiledlg *d = GDrawGetUserData(gw); + d->done = true; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_Center)) ) + tilepos = tp_center; + else if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_Left)) ) + tilepos = tp_left; + else + tilepos = tp_right; + if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_Tile)) ) + tilescale = ts_tile; + else if ( GGadgetIsChecked(GWidgetGetControl(gw,CID_TileScale)) ) + tilescale = ts_tilescale; + else + tilescale = ts_scale; + } +return( true ); +} + +static int TD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + GWindow gw = GGadgetGetWindow(g); + struct tiledlg *d = GDrawGetUserData(gw); + d->done = d->cancelled = true; + } +return( true ); +} + +static int td_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + struct tiledlg *d = GDrawGetUserData(gw); + d->done = d->cancelled = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("tilepath.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +static int TileAsk(void) { + struct tiledlg d; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[10]; + GTextInfo label[10]; + + memset(&d,0,sizeof(d)); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_restrict; + wattrs.event_masks = ~(1<layerheads[cv->drawmode]->splines,tile, tilepos,tilescale, !anypoints,cv->sc->parent->order2); + CVCharChangedUpdate(cv); + SplinePointListsFree(tile); + cv->lastselpt = NULL; +} + +void SCTile(SplineChar *sc) { + SplineSet *tile = ClipBoardToSplineSet(); + + if ( tile==NULL ) +return; + + if ( sc->layers[ly_fore].splines==NULL ) +return; + + if ( !TileAsk()) +return; + + tile = SplinePointListCopy(tile); + SCPreserveState(sc,false); + TileIt(&sc->layers[ly_fore].splines,tile, tilepos,tilescale, true, sc->parent->order2); + SCCharChangedUpdate(sc); + SplinePointListsFree(tile); +} + +void FVTile(FontView *fv) { + SplineSet *tile = ClipBoardToSplineSet(); + SplineChar *sc; + int i; + + if ( tile==NULL ) +return; + + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && (sc=fv->sf->chars[i])!=NULL && sc->layers[ly_fore].splines!=NULL ) + break; + if ( i==fv->sf->charcnt ) +return; + + if ( !TileAsk()) +return; + + tile = SplinePointListCopy(tile); + for ( i=0; isf->charcnt; ++i ) + if ( fv->selected[i] && (sc=fv->sf->chars[i])!=NULL && sc->layers[ly_fore].splines!=NULL ) { + SCPreserveState(sc,false); + TileIt(&sc->layers[ly_fore].splines,tile, tilepos,tilescale, true, fv->sf->order2); + SCCharChangedUpdate(sc); + } + SplinePointListsFree(tile); +} +#endif /* FONTFORGE_CONFIG_TILEPATH */ diff --git a/fontforge/tottf.c b/fontforge/tottf.c new file mode 100644 index 00000000..ccf70ad5 --- /dev/null +++ b/fontforge/tottf.c @@ -0,0 +1,5195 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __CygWin + #include + #include + #include +#endif + +#include "ttf.h" + +int glyph_2_name_map=0; + +/* This file produces a ttf file given a splinefont. */ + +/* ************************************************************************** */ + +/* Required tables: + cmap encoding + head header data + hhea more header data + hmtx horizontal metrics (widths, lsidebearing) + maxp various maxima in the font + name various names associated with the font + post postscript names and other stuff +Required by windows but not mac + OS/2 bleah. +Required for TrueType + loca pointers to the glyphs + glyf character shapes +Required for OpenType (Postscript) + CFF A complete postscript CFF font here with all its internal tables +Required for bitmaps + bdat/EBDT bitmap data + bloc/EBLC pointers to bitmaps + bhed for apple bitmap only fonts, replaces head +Optional for bitmaps + EBSC bitmap scaling table (used in windows "bitmap-only" fonts) +"Advanced Typograpy" + Apple + feat (mapping between morx features and 'name' names) + kern (if data are present) + lcar (ligature caret, if data present) + morx (substitutions, if data present) + prop (glyph properties, if data present) + opbd (optical bounds, if data present) + OpenType + GPOS (opentype, if kern,anchor data are present) + GSUB (opentype, if ligature (other subs) data are present) + GDEF (opentype, if anchor data are present) +additional tables + cvt for hinting + gasp to control when things should be hinted + fpgm for hinting (currently only copied and dumped verbatim) + prep for hinting (currently only copied and dumped verbatim) + +*/ + +const char *ttfstandardnames[258] = { +".notdef", +".null", +"nonmarkingreturn", +"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", +"mu", +"partialdiff", +"summation", +"product", +"pi", +"integral", +"ordfeminine", +"ordmasculine", +"Omega", +"ae", +"oslash", +"questiondown", +"exclamdown", +"logicalnot", +"radical", +"florin", +"approxequal", +"Delta", +"guillemotleft", +"guillemotright", +"ellipsis", +"nonbreakingspace", +"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", +"Lslash", +"lslash", +"Scaron", +"scaron", +"Zcaron", +"zcaron", +"brokenbar", +"Eth", +"eth", +"Yacute", +"yacute", +"Thorn", +"thorn", +"minus", +"multiply", +"onesuperior", +"twosuperior", +"threesuperior", +"onehalf", +"onequarter", +"threequarters", +"franc", +"Gbreve", +"gbreve", +"Idotaccent", +"Scedilla", +"scedilla", +"Cacute", +"cacute", +"Ccaron", +"ccaron", +"dcroat" +}; + +static int uniranges[][3] = { + { 0x20, 0x7e, 0 }, /* Basic Latin */ + { 0xa0, 0xff, 1 }, /* Latin-1 Supplement */ + { 0x100, 0x17f, 2 }, /* Latin Extended-A */ + { 0x180, 0x24f, 3 }, /* Latin Extended-B */ + { 0x250, 0x2af, 4 }, /* IPA Extensions */ + { 0x2b0, 0x2ff, 5 }, /* Spacing Modifier Letters */ + { 0x300, 0x36f, 6 }, /* Combining Diacritical Marks */ + { 0x370, 0x3ff, 7 }, /* Greek */ + { 0x400, 0x52f, 9 }, /* Cyrillic / Cyrillic Supplement */ + { 0x530, 0x58f, 10 }, /* Armenian */ + { 0x590, 0x5ff, 11 }, /* Hebrew */ + { 0x600, 0x6ff, 13 }, /* Arabic */ + { 0x700, 0x74f, 71 }, /* Syriac */ + { 0x780, 0x7bf, 72 }, /* Thaana */ + { 0x900, 0x97f, 15 }, /* Devanagari */ + { 0x980, 0x9ff, 16 }, /* Bengali */ + { 0xa00, 0xa7f, 17 }, /* Gurmukhi */ + { 0xa80, 0xaff, 18 }, /* Gujarati */ + { 0xb00, 0xb7f, 19 }, /* Oriya */ + { 0xb80, 0xbff, 20 }, /* Tamil */ + { 0xc00, 0xc7f, 21 }, /* Telugu */ + { 0xc80, 0xcff, 22 }, /* Kannada */ + { 0xd00, 0xd7f, 23 }, /* Malayalam */ + { 0xd80, 0xdff, 73 }, /* Sinhala */ + { 0xe00, 0xe7f, 24 }, /* Thai */ + { 0xe80, 0xeff, 25 }, /* Lao */ + { 0xf00, 0xfbf, 70 }, /* Tibetan */ + { 0x1000, 0x109f, 74 }, /* Myanmar */ + { 0x10a0, 0x10ff, 26 }, /* Georgian */ + { 0x1100, 0x11ff, 28 }, /* Hangul Jamo */ + { 0x1200, 0x137f, 75 }, /* Ethiopic */ + { 0x13a0, 0x13ff, 76 }, /* Cherokee */ + { 0x1400, 0x167f, 77 }, /* Unified Canadian Aboriginal Symbols */ + { 0x1680, 0x169f, 78 }, /* Ogham */ + { 0x16a0, 0x16ff, 79 }, /* Runic */ + { 0x1700, 0x177f, 84 }, /* Tagalog / Harunoo / Buhid / Tagbanwa */ + { 0x1780, 0x17ff, 80 }, /* Khmer */ + { 0x1800, 0x18af, 81 }, /* Mongolian */ + /* { 0x1900, 0x194f, }, Limbu */ + /* { 0x1950, 0x197f, }, Tai le */ + /* { 0x19e0, 0x19ff, }, Khmer Symbols */ + /* { 0x1d00, 0x1d7f, }, Phonetic Extensions */ + { 0x1e00, 0x1eff, 29 }, /* Latin Extended Additional */ + { 0x1f00, 0x1fff, 30 }, /* Greek Extended */ + { 0x2000, 0x206f, 31 }, /* General Punctuation */ + { 0x2070, 0x209f, 32 }, /* Superscripts and Subscripts */ + { 0x20a0, 0x20cf, 33 }, /* Currency Symbols */ + { 0x20d0, 0x20ff, 34 }, /* Combining Marks for Symbols */ + { 0x2100, 0x214f, 35 }, /* Letterlike Symbols */ + { 0x2150, 0x218f, 36 }, /* Number Forms */ + { 0x2190, 0x21ff, 37 }, /* Arrows */ + { 0x2200, 0x22ff, 38 }, /* Mathematical Operators */ + { 0x2300, 0x237f, 39 }, /* Miscellaneous Technical */ + { 0x2400, 0x243f, 40 }, /* Control Pictures */ + { 0x2440, 0x245f, 41 }, /* Optical Character Recognition */ + { 0x2460, 0x24ff, 42 }, /* Enclosed Alphanumerics */ + { 0x2500, 0x257f, 43 }, /* Box Drawing */ + { 0x2580, 0x259f, 44 }, /* Block Elements */ + { 0x25a0, 0x25ff, 45 }, /* Geometric Shapes */ + { 0x2600, 0x267f, 46 }, /* Miscellaneous Symbols */ + { 0x2700, 0x27bf, 47 }, /* Dingbats */ + { 0x27c0, 0x27ef, 38 }, /* Miscellaneous Mathematical Symbols-A */ + { 0x27f0, 0x27ff, 37 }, /* Supplementary Arrows-A */ + { 0x2800, 0x28ff, 82 }, /* Braille Patterns */ + { 0x2900, 0x297f, 37 }, /* Supplementary Arrows-B */ + { 0x2980, 0x2aff, 38 }, /* Miscellaneous Mathematical Symbols-B / + Supplemental Mathematical Operators */ + { 0x2e80, 0x2fff, 59 }, /* CJK Radicals Supplement / Kangxi Radicals / + Ideographic Description Characters */ + { 0x3000, 0x303f, 48 }, /* CJK Symbols and Punctuation */ + { 0x3040, 0x309f, 49 }, /* Hiragana */ + { 0x30a0, 0x30ff, 50 }, /* Katakana */ + { 0x3100, 0x312f, 51 }, /* Bopomofo */ + { 0x3130, 0x318f, 52 }, /* Hangul Compatibility Jamo */ + { 0x3190, 0x319f, 59 }, /* Kanbun */ + { 0x31a0, 0x31bf, 51 }, /* Bopomofo Extended */ + { 0x31f0, 0x31ff, 50 }, /* Katakana Phonetic Extensions */ + { 0x3200, 0x32ff, 54 }, /* Enclosed CJK Letters and Months */ + { 0x3300, 0x33ff, 55 }, /* CJK compatability */ + { 0x3400, 0x4dbf, 59 }, /* CJK Unified Ideographs Extension A */ + /* { 0x4dc0, 0x4dff, }, Yijing Hexagram Symbols */ + { 0x4e00, 0x9fff, 59 }, /* CJK Unified Ideographs */ + { 0xa000, 0xa4cf, 81 }, /* Yi Syllables / Yi Radicals */ + { 0xac00, 0xd7af, 56 }, /* Hangul */ + { 0xe000, 0xf8ff, 60 }, /* Private Use Area */ + + { 0xf900, 0xfaff, 61 }, /* CJK Compatibility Ideographs */ + /* 12 ideographs in The IBM 32 Compatibility Additions are CJK unified + ideographs despite their names: see The Unicode Standard 4.0, p.475 */ + { 0xfa0e, 0xfa0f, 59 }, + { 0xfa10, 0xfa10, 61 }, + { 0xfa11, 0xfa11, 59 }, + { 0xfa12, 0xfa12, 61 }, + { 0xfa13, 0xfa14, 59 }, + { 0xfa15, 0xfa1e, 61 }, + { 0xfa1f, 0xfa1f, 59 }, + { 0xfa20, 0xfa20, 61 }, + { 0xfa21, 0xfa21, 59 }, + { 0xfa22, 0xfa22, 61 }, + { 0xfa23, 0xfa24, 59 }, + { 0xfa25, 0xfa26, 61 }, + { 0xfa27, 0xfa29, 59 }, + { 0xfa2a, 0xfaff, 61 }, /* CJK Compatibility Ideographs */ + + { 0xfb00, 0xfb4f, 62 }, /* Alphabetic Presentation Forms */ + { 0xfb50, 0xfdff, 63 }, /* Arabic Presentation Forms-A */ + { 0xfe00, 0xfe0f, 91 }, /* Variation Selectors */ + { 0xfe20, 0xfe2f, 64 }, /* Combining Half Marks */ + { 0xfe30, 0xfe4f, 65 }, /* CJK Compatibility Forms */ + { 0xfe50, 0xfe6f, 66 }, /* Small Form Variants */ + { 0xfe70, 0xfeef, 67 }, /* Arabic Presentation Forms-B */ + { 0xff00, 0xffef, 68 }, /* Halfwidth and Fullwidth Forms */ + { 0xfff0, 0xffff, 69 }, /* Specials */ + + /* { 0x10000, 0x1007f, }, Linear B Syllabary */ + /* { 0x10080, 0x100ff, }, Linear B Ideograms */ + /* { 0x10100, 0x1013f, }, Aegean Numbers */ + { 0x10300, 0x1032f, 85 }, /* Old Italic */ + { 0x10330, 0x1034f, 86 }, /* Gothic */ + { 0x10400, 0x1044f, 87 }, /* Deseret */ + /* { 0x10450, 0x1047f, }, Shavian */ + /* { 0x10480, 0x104af, }, Osmanya */ + /* { 0x10800, 0x1083f, }, Cypriot Syllabary */ + { 0x1d000, 0x1d1ff, 88 }, /* Byzantine Musical Symbols / Musical Symbols */ + /* { 0x1d300, 0x1d35f, }, Tai Xuan Jing Symbols */ + { 0x1d400, 0x1d7ff, 89 }, /* Mathematical Alphanumeric Symbols */ + { 0x20000, 0x2a6df, 59 }, /* CJK Unified Ideographs Extension B */ + { 0x2f800, 0x2fa1f, 61 }, /* CJK Compatibility Ideographs Supplement */ + { 0xe0000, 0xe007f, 92 }, /* Tags */ + { 0xe0100, 0xe01ef, 91 }, /* Variation Selectors Supplement */ + { 0xf0000, 0xffffd, 90 }, /* Supplementary Private Use Area-A */ + { 0x100000, 0x10fffd, 90 }, /* Supplementary Private Use Area-B */ +}; + +static int32 getuint32(FILE *ttf) { + int ch1 = getc(ttf); + int ch2 = getc(ttf); + int ch3 = getc(ttf); + int ch4 = getc(ttf); + if ( ch4==EOF ) +return( EOF ); +return( (ch1<<24)|(ch2<<16)|(ch3<<8)|ch4 ); +} + +void putshort(FILE *file,int sval) { + putc((sval>>8)&0xff,file); + putc(sval&0xff,file); +} + +void putlong(FILE *file,int val) { + putc((val>>24)&0xff,file); + putc((val>>16)&0xff,file); + putc((val>>8)&0xff,file); + putc(val&0xff,file); +} +#define dumpabsoffset putlong + +static void dumpoffset(FILE *file,int offsize,int val) { + if ( offsize==1 ) + putc(val,file); + else if ( offsize==2 ) + putshort(file,val); + else if ( offsize==3 ) { + putc((val>>16)&0xff,file); + putc((val>>8)&0xff,file); + putc(val&0xff,file); + } else + putlong(file,val); +} + +static void put2d14(FILE *file,real dval) { + int val; + int mant; + + val = floor(dval); + mant = floor(16384.*(dval-val)); + val = (val<<14) | mant; + putshort(file,val); +} + +void putfixed(FILE *file,real dval) { + int val; + int mant; + + val = floor(dval); + mant = floor(65536.*(dval-val)); + val = (val<<16) | mant; + putlong(file,val); +} + +int ttfcopyfile(FILE *ttf, FILE *other, int pos) { + int ch; + int ret = 1; + + if ( ferror(ttf) || ferror(other)) { + GDrawIError("Disk error of some nature. Perhaps no space on device?\nGenerated font will be unusable" ); + } else if ( pos!=ftell(ttf)) { + GDrawIError("File Offset wrong for ttf table, %d expected %d", ftell(ttf), pos ); + } + rewind(other); + while (( ch = getc(other))!=EOF ) + putc(ch,ttf); + if ( ferror(other)) ret = 0; + if ( fclose(other)) ret = 0; +return( ret ); +} + +static void FigureFullMetricsEnd(SplineFont *sf,struct glyphinfo *gi) { + /* We can reduce the size of the width array by removing a run at the end */ + /* of the same width. So start at the end, find the width of the last */ + /* character we'll output, then run backwards as long as we've got the */ + /* same width */ + /* (do same thing for vertical metrics too */ + int i,j, maxc, lasti, lastv; + int width, vwidth; + + maxc = sf->charcnt; + for ( j=0; jsubfontcnt; ++j ) + if ( sf->subfonts[j]->charcnt>maxc ) maxc = sf->subfonts[j]->charcnt; + if ( sf->subfontcnt==0 ) { + for ( i=maxc-1; i>0; --i ) + if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]->ttf_glyph!=-1 && + sf->chars[i]==SCDuplicate(sf->chars[i])) + break; + } else { + for ( i=maxc-1; i>0; --i ) { + for ( j=0; jsubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) + break; + if ( jsubfontcnt && SCWorthOutputting(sf->subfonts[j]->chars[i]) && + sf->subfonts[j]->chars[i]->ttf_glyph!=-1 ) + break; /* no duplicates in cid font */ + } + } + + if ( i>0 ) { + lasti = lastv = i; + if ( sf->subfontcnt==0 ) { + width = sf->chars[i]->width; + vwidth = sf->chars[i]->vwidth; + for ( --i; i>0; --i ) { + if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]==SCDuplicate(sf->chars[i])) { + if ( sf->chars[i]->width!=width ) + break; + else + lasti = i; + } + } + gi->lasthwidth = lasti; + if ( sf->hasvmetrics ) { + for ( i=lastv-1; i>0; --i ) { + if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]==SCDuplicate(sf->chars[i])) { + if ( sf->chars[i]->vwidth!=vwidth ) + break; + else + lastv = i; + } + } + gi->lastvwidth = lastv; + } + } else { + width = sf->subfonts[j]->chars[i]->width; + vwidth = sf->subfonts[j]->chars[i]->vwidth; + for ( --i; i>0; --i ) { + for ( j=0; jsubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) + break; + if ( jsubfontcnt && SCWorthOutputting(sf->subfonts[j]->chars[i])) { + if ( sf->subfonts[j]->chars[i]->width!=width ) + break; + else + lasti = i; + } + } + gi->lasthwidth = lasti; + if ( sf->hasvmetrics ) { + for ( i=lastv-1; i>0; --i ) { + for ( j=0; jsubfontcnt; ++j ) + if ( isubfonts[j]->charcnt && sf->subfonts[j]->chars[i]!=NULL ) + break; + if ( jsubfontcnt && SCWorthOutputting(sf->subfonts[j]->chars[i])) { + if ( sf->subfonts[j]->chars[i]->vwidth!=vwidth ) + break; + else + lastv = i; + } + } + gi->lastvwidth = lastv; + } + } + } +} + +static void dumpghstruct(struct glyphinfo *gi,struct glyphhead *gh) { + + putshort(gi->glyphs,gh->numContours); + putshort(gi->glyphs,gh->xmin); + putshort(gi->glyphs,gh->ymin); + putshort(gi->glyphs,gh->xmax); + putshort(gi->glyphs,gh->ymax); + if ( gh->xminxmin ) gi->xmin = gh->xmin; + if ( gh->yminymin ) gi->ymin = gh->ymin; + if ( gh->xmax>gi->xmax ) gi->xmax = gh->xmax; + if ( gh->ymax>gi->ymax ) gi->ymax = gh->ymax; +} + +static void ttfdumpmetrics(SplineChar *sc,struct glyphinfo *gi,DBounds *b) { + + if ( sc->enc<=gi->lasthwidth ) + putshort(gi->hmtx,sc->width); + putshort(gi->hmtx,b->minx); + if ( sc->parent->hasvmetrics ) { + if ( sc->enc<=gi->lastvwidth ) + putshort(gi->vmtx,sc->vwidth); + putshort(gi->vmtx,sc->parent->vertical_origin-b->maxy); + } + if ( sc->enc==gi->lasthwidth ) + gi->hfullcnt = sc->ttf_glyph+1; + if ( sc->enc==gi->lastvwidth ) + gi->vfullcnt = sc->ttf_glyph+1; +} + +static SplineSet *SCttfApprox(SplineChar *sc) { + SplineSet *head=NULL, *last, *ss, *tss; + RefChar *ref; + + for ( ss=sc->layers[ly_fore].splines; ss!=NULL; ss=ss->next ) { + tss = sc->parent->order2 ? SplinePointListCopy1(ss) : SSttfApprox(ss); + if ( head==NULL ) head = tss; + else last->next = tss; + last = tss; + } + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + for ( ss=ref->layers[0].splines; ss!=NULL; ss=ss->next ) { + tss = sc->parent->order2 ? SplinePointListCopy1(ss) : SSttfApprox(ss); + if ( head==NULL ) head = tss; + else last->next = tss; + last = tss; + } + } +return( head ); +} + +static int BadCount(SplineSet *ttfss) { + SplinePoint *sp, *first=NULL; + int cnt=0, starts_with_cp; + SplineSet *ss; + + for ( ss = ttfss ; ss!=NULL; ss=ss->next ) { + starts_with_cp = (ss->first->ttfindex == cnt+1 || ss->first->ttfindex==0xffff) && + !ss->first->noprevcp; + + for ( sp=ss->first; sp!=first ; ) { + if ( sp->ttfindex==0xfffe ) +return( true ); + else if ( sp->ttfindex!=0xffff ) { + if ( cnt!=sp->ttfindex ) +return( true ); + cnt = sp->ttfindex+1; + } else if ( sp==ss->first || sp->nonextcp || sp->noprevcp || + (sp->dontinterpolate || sp->roundx || sp->roundy) || + (sp->prevcp.x+sp->nextcp.x)/2!=sp->me.x || + (sp->prevcp.y+sp->nextcp.y)/2!=sp->me.y ) { +return( true ); + } + if ( !sp->nonextcp ) ++cnt; + if ( sp->next==NULL ) + break; + if ( first==NULL ) first = sp; + sp = sp->next->to; + } + + if ( starts_with_cp ) /* We'll have counted it twice */ + --cnt; + } +return( false ); +} + +int SSPointCnt(SplineSet *ss,int startcnt, int has_instrs) { + SplinePoint *sp, *first=NULL; + int cnt; + + for ( sp=ss->first, cnt=startcnt; sp!=first ; ) { + if ( has_instrs && sp->ttfindex!=0xffff && sp->ttfindex!=0xfffe ) { + cnt = sp->ttfindex+1; + } else if ( (!has_instrs || sp->ttfindex==0xfffe) && + ( sp==ss->first || sp->nonextcp || sp->noprevcp || + (sp->dontinterpolate || sp->roundx || sp->roundy) || + (sp->prevcp.x+sp->nextcp.x)/2!=sp->me.x || + (sp->prevcp.y+sp->nextcp.y)/2!=sp->me.y )) { + ++cnt; + } + if ( has_instrs && sp->nextcpindex!=0xffff && sp->nextcpindex!=0xfffe ) { + if ( sp->nextcpindex!=startcnt ) + cnt = sp->nextcpindex+1; + } else if ( !sp->nonextcp ) + ++cnt; + if ( sp->next==NULL ) + break; + if ( first==NULL ) first = sp; + sp = sp->next->to; + } + +return( cnt ); +} + +#define _On_Curve 1 +#define _X_Short 2 +#define _Y_Short 4 +#define _Repeat 8 +#define _X_Same 0x10 +#define _Y_Same 0x20 + +int SSAddPoints(SplineSet *ss,int ptcnt,BasePoint *bp, char *flags, + int has_instrs) { + SplinePoint *sp, *first, *nextsp; + int startcnt = ptcnt; + + if ( has_instrs && ss->first->prev!=NULL && + ss->first->prev->from->nextcpindex==startcnt ) { + if ( flags!=NULL ) flags[ptcnt] = 0; + bp[ptcnt].x = rint(ss->first->prevcp.x); + bp[ptcnt++].y = rint(ss->first->prevcp.y); + } else if ( has_instrs && ss->first->ttfindex!=ptcnt && ss->first->ttfindex!=0xfffe ) + GDrawIError("Unexpected point count in SSAddPoints" ); + + first = NULL; + for ( sp=ss->first; sp!=first ; ) { + if ( has_instrs && sp->ttfindex!=0xffff ) { + if ( flags!=NULL ) flags[ptcnt] = _On_Curve; + bp[ptcnt].x = rint(sp->me.x); + bp[ptcnt].y = rint(sp->me.y); + sp->ttfindex = ptcnt++; + } else if ( !has_instrs && + ( sp==ss->first || sp->nonextcp || sp->noprevcp || + (sp->dontinterpolate || sp->roundx || sp->roundy) || + (sp->prevcp.x+sp->nextcp.x)/2!=sp->me.x || + (sp->prevcp.y+sp->nextcp.y)/2!=sp->me.y )) { + /* If an on curve point is midway between two off curve points*/ + /* it may be omitted and will be interpolated on read in */ + if ( flags!=NULL ) flags[ptcnt] = _On_Curve; + bp[ptcnt].x = rint(sp->me.x); + bp[ptcnt].y = rint(sp->me.y); + sp->ttfindex = ptcnt++; + } + nextsp = sp->next!=NULL ? sp->next->to : NULL; + if ( has_instrs && sp->nextcpindex == startcnt ) + /* This control point is actually our first point, not our last */ + break; + if ( (has_instrs && sp->nextcpindex !=0xffff && sp->nextcpindex!=0xfffe ) || + (has_instrs && !sp->nonextcp && sp->nextcpindex==0xfffe ) || + (!has_instrs && !sp->nonextcp )) { + if ( flags!=NULL ) flags[ptcnt] = 0; + bp[ptcnt].x = rint(sp->nextcp.x); + bp[ptcnt++].y = rint(sp->nextcp.y); + } + if ( nextsp==NULL ) + break; + if ( first==NULL ) first = sp; + sp = nextsp; + } +return( ptcnt ); +} + +static void dumppointarrays(struct glyphinfo *gi,BasePoint *bp, char *fs, int pc) { + BasePoint last; + int i,flags; + int lastflag, flagcnt; + + if ( gi->maxp->maxPointsmaxp->maxPoints = pc; + + /* flags */ + last.x = last.y = 0; + lastflag = -1; flagcnt = 0; + for ( i=0; i-256 && bp[i].x-last.x<255 ) { + flags |= _X_Short; + if ( bp[i].x>=last.x ) + flags |= _X_Same; /* In this context it means positive */ + } + if ( last.y==bp[i].y ) + flags |= _Y_Same; + else if ( bp[i].y-last.y>-256 && bp[i].y-last.y<255 ) { + flags |= _Y_Short; + if ( bp[i].y>=last.y ) + flags |= _Y_Same; /* In this context it means positive */ + } + last = bp[i]; + if ( lastflag==-1 ) { + lastflag = flags; + flagcnt = 0; + } else if ( flags!=lastflag ) { + if ( flagcnt!=0 ) + lastflag |= _Repeat; + putc(lastflag,gi->glyphs); + if ( flagcnt!=0 ) + putc(flagcnt,gi->glyphs); + lastflag = flags; + flagcnt = 0; + } else { + if ( ++flagcnt == 255 ) { + putc(lastflag|_Repeat,gi->glyphs); + putc(255,gi->glyphs); + lastflag = -1; + flagcnt = 0; + } + } + } + if ( lastflag!=-1 ) { + if ( flagcnt!=0 ) + lastflag |= _Repeat; + putc(lastflag,gi->glyphs); + if ( flagcnt!=0 ) + putc(flagcnt,gi->glyphs); + } + + /* xcoords */ + last.x = 0; + for ( i=0; i-256 && bp[i].x-last.x<255 ) { + if ( bp[i].x>=last.x ) + putc(bp[i].x-last.x,gi->glyphs); + else + putc(last.x-bp[i].x,gi->glyphs); + } else + putshort(gi->glyphs,bp[i].x-last.x); + last.x = bp[i].x; + } + /* ycoords */ + last.y = 0; + for ( i=0; i-256 && bp[i].y-last.y<255 ) { + if ( bp[i].y>=last.y ) + putc(bp[i].y-last.y,gi->glyphs); + else + putc(last.y-bp[i].y,gi->glyphs); + } else + putshort(gi->glyphs,bp[i].y-last.y); + last.y = bp[i].y; + } + if ( ftell(gi->glyphs)&1 ) /* Pad the file so that the next glyph */ + putc('\0',gi->glyphs); /* on a word boundary */ +} + +static void dumpinstrs(struct glyphinfo *gi,uint8 *instrs,int cnt) { + int i; + + if ( (gi->flags&ttf_flag_nohints) ) { + putshort(gi->glyphs,0); +return; + } + /* Do we ever want to call AutoHint and AutoInst here? I think not. */ + + if ( gi->maxp->maxglyphInstrmaxp->maxglyphInstr=cnt; + putshort(gi->glyphs,cnt); + for ( i=0; iglyphs ); +} + +static void dumpmissingglyph(SplineFont *sf,struct glyphinfo *gi,int fixedwidth) { + struct glyphhead gh; + BasePoint bp[10]; + uint8 instrs[50]; + int stemcvt, stem; + + gi->loca[gi->next_glyph++] = ftell(gi->glyphs); + gi->maxp->maxContours = 2; + + gh.numContours = 2; + gh.ymin = 0; + gh.ymax = 2*(sf->ascent+sf->descent)/3; + gh.xmax = (sf->ascent+sf->descent)/3; + gh.xmin = stem = gh.xmax/10; + gh.xmax += stem; + if ( gh.ymax>sf->ascent ) gh.ymax = sf->ascent; + dumpghstruct(gi,&gh); + + stemcvt = TTF_getcvtval(gi->sf,stem); + + bp[0].x = stem; bp[0].y = 0; + bp[1].x = stem; bp[1].y = gh.ymax; + bp[2].x = gh.xmax; bp[2].y = gh.ymax; + bp[3].x = gh.xmax; bp[3].y = 0; + + bp[4].x = 2*stem; bp[4].y = stem; + bp[5].x = gh.xmax-stem; bp[5].y = stem; + bp[6].x = gh.xmax-stem; bp[6].y = gh.ymax-stem; + bp[7].x = 2*stem; bp[7].y = gh.ymax-stem; + + instrs[0] = 0xb1; /* Pushb, 2byte */ + instrs[1] = 1; /* Point 1 */ + instrs[2] = 0; /* Point 0 */ + instrs[3] = 0x2f; /* MDAP, rounded (pt0) */ + instrs[4] = 0x3c; /* ALIGNRP, (pt1 same pos as pt0)*/ + instrs[5] = 0xb2; /* Pushb, 3byte */ + instrs[6] = 7; /* Point 7 */ + instrs[7] = 4; /* Point 4 */ + instrs[8] = stemcvt; /* CVT entry for our stem width */ + instrs[9] = 0xe0+0x0d; /* MIRP, don't set rp0, minimum, rounded, black */ + instrs[10] = 0x32; /* SHP[rp2] (pt7 same pos as pt4) */ + instrs[11] = 0xb1; /* Pushb, 2byte */ + instrs[12] = 6; /* Point 6 */ + instrs[13] = 5; /* Point 5 */ + instrs[14] = 0xc0+0x1c; /* MDRP, set rp0, minimum, rounded, grey */ + instrs[15] = 0x3c; /* ALIGNRP, (pt6 same pos as pt5)*/ + instrs[16] = 0xb2; /* Pushb, 3byte */ + instrs[17] = 3; /* Point 3 */ + instrs[18] = 2; /* Point 2 */ + instrs[19] = stemcvt; /* CVT entry for our stem width */ + instrs[20] = 0xe0+0x0d; /* MIRP, dont set rp0, minimum, rounded, black */ + instrs[21] = 0x32; /* SHP[rp2] (pt3 same pos as pt2) */ + + instrs[22] = 0x00; /* SVTCA, y axis */ + + instrs[23] = 0xb1; /* Pushb, 2byte */ + instrs[24] = 3; /* Point 3 */ + instrs[25] = 0; /* Point 0 */ + instrs[26] = 0x2f; /* MDAP, rounded */ + instrs[27] = 0x3c; /* ALIGNRP, (pt3 same height as pt0)*/ + instrs[28] = 0xb2; /* Pushb, 3byte */ + instrs[29] = 5; /* Point 5 */ + instrs[30] = 4; /* Point 4 */ + instrs[31] = stemcvt; /* CVT entry for our stem width */ + instrs[32] = 0xe0+0x0d; /* MIRP, don't set rp0, minimum, rounded, black */ + instrs[33] = 0x32; /* SHP[rp2] (pt5 same height as pt4) */ + instrs[34] = 0xb2; /* Pushb, 3byte */ + instrs[35] = 7; /* Point 7 */ + instrs[36] = 6; /* Point 6 */ + instrs[37] = TTF_getcvtval(gi->sf,bp[6].y); /* CVT entry for top height */ + instrs[38] = 0xe0+0x1c; /* MIRP, set rp0, minimum, rounded, grey */ + instrs[39] = 0x3c; /* ALIGNRP (pt7 same height as pt6) */ + instrs[40] = 0xb2; /* Pushb, 3byte */ + instrs[41] = 1; /* Point 1 */ + instrs[42] = 2; /* Point 2 */ + instrs[43] = stemcvt; /* CVT entry for our stem width */ + instrs[44] = 0xe0+0x0d; /* MIRP, dont set rp0, minimum, rounded, black */ + instrs[45] = 0x32; /* SHP[rp2] (pt1 same height as pt2) */ + + /* We've touched all points in all dimensions */ + /* Don't need any IUP */ + + /* end contours array */ + putshort(gi->glyphs,4-1); + putshort(gi->glyphs,8-1); + /* instruction length&instructions */ + dumpinstrs(gi,instrs,46); + + dumppointarrays(gi,bp,NULL,8); + + if ( fixedwidth==-1 ) + putshort(gi->hmtx,gh.xmax + 2*stem); + else + putshort(gi->hmtx,fixedwidth); + putshort(gi->hmtx,stem); + if ( sf->hasvmetrics ) { + putshort(gi->vmtx,sf->ascent+sf->descent); + putshort(gi->vmtx,sf->vertical_origin-gh.ymax); + } +} + +static void dumpblankglyph(struct glyphinfo *gi,SplineFont *sf,int fixedwidth) { + int advance = gi->next_glyph==1?0:fixedwidth==-1?(sf->ascent+sf->descent)/3: + fixedwidth; + /* For reasons quite obscure to me, glyph 1 has an advance width of 0 */ + /* even in a mono-spaced font like CourierNew.ttf */ + + /* These don't get a glyph header, because there are no contours */ + gi->loca[gi->next_glyph++] = ftell(gi->glyphs); + putshort(gi->hmtx,advance); + putshort(gi->hmtx,0); + if ( sf->hasvmetrics ) { + putshort(gi->vmtx,gi->next_glyph==2?0:(sf->ascent+sf->descent)); + putshort(gi->vmtx,0); + } +} + +static void dumpspace(SplineChar *sc, struct glyphinfo *gi) { + /* These don't get a glyph header, because there are no contours */ + DBounds b; + gi->loca[gi->next_glyph++] = ftell(gi->glyphs); + memset(&b,0,sizeof(b)); + ttfdumpmetrics(sc,gi,&b); +} + +static int IsTTFRefable(SplineChar *sc) { + RefChar *ref; + + if ( sc->layers[ly_fore].refs==NULL || sc->layers[ly_fore].splines!=NULL ) +return( false ); + + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]<-2 || ref->transform[0]>1.999939 || + ref->transform[1]<-2 || ref->transform[1]>1.999939 || + ref->transform[2]<-2 || ref->transform[2]>1.999939 || + ref->transform[3]<-2 || ref->transform[3]>1.999939 ) +return( false ); + } +return( true ); +} + +static int RefDepth(RefChar *ref) { + int rd, temp; + SplineChar *sc = ref->sc; + + if ( sc->layers[ly_fore].refs==NULL || sc->layers[ly_fore].splines!=NULL ) +return( 1 ); + rd = 0; + for ( ref = sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next ) { + if ( ref->transform[0]>=-2 || ref->transform[0]<=1.999939 || + ref->transform[1]>=-2 || ref->transform[1]<=1.999939 || + ref->transform[2]>=-2 || ref->transform[2]<=1.999939 || + ref->transform[3]>=-2 || ref->transform[3]<=1.999939 ) { + temp = RefDepth(ref); + if ( temp>rd ) rd = temp; + } + } +return( rd+1 ); +} + +static void dumpcomposite(SplineChar *sc, struct glyphinfo *gi) { + struct glyphhead gh; + DBounds bb; + int i, ptcnt, ctcnt, flags, sptcnt, rd; + SplineSet *ss; + RefChar *ref; + +#if 0 + if ( autohint_before_generate && sc->changedsincelasthinted && + !sc->manualhints ) + if ( !(gi->flags&ttf_flag_nohints) ) + SplineCharAutoHint(sc,true); +#endif + + gi->loca[gi->next_glyph++] = ftell(gi->glyphs); + + SplineCharFindBounds(sc,&bb); + gh.numContours = -1; + gh.xmin = floor(bb.minx); gh.ymin = floor(bb.miny); + gh.xmax = ceil(bb.maxx); gh.ymax = ceil(bb.maxy); + dumpghstruct(gi,&gh); + + i=ptcnt=ctcnt=0; + for ( ref=sc->layers[ly_fore].refs; ref!=NULL; ref=ref->next, ++i ) { + if ( ref->sc->ttf_glyph==-1 ) { + /*if ( sc->layers[ly_fore].refs->next==NULL || any )*/ + continue; + } + flags = (1<<1)|(1<<2)|(1<<12); /* Args are always values for me */ + /* Always round args to grid */ + /* There is some very strange stuff wrongly-documented on the apple*/ + /* site about how these should be interpretted when there are */ + /* scale factors, or rotations */ + /* That description does not match the behavior of their rasterizer*/ + /* I've reverse engineered something else (see parsettf.c) */ + /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */ + /* Adobe says that setting bit 12 means that this will not happen */ + /* Apple doesn't mention bit 12 though...(but they do support it) */ +/* if we want a mac style scaled composite then + flags = (1<<1)|(1<<2)|(1<<11); + and if we want an ambiguous composite... + flags = (1<<1)|(1<<2); +*/ + if ( ref->next!=NULL ) + flags |= (1<<5); /* More components */ + else if ( sc->ttf_instrs_len!=0 ) /* Composits also inherit instructions */ + flags |= (1<<8); /* Instructions appear after last ref */ + if ( ref->transform[1]!=0 || ref->transform[2]!=0 ) + flags |= (1<<7); /* Need a full matrix */ + else if ( ref->transform[0]!=ref->transform[3] ) + flags |= (1<<6); /* different xy scales */ + else if ( ref->transform[0]!=1. ) + flags |= (1<<3); /* xy scale is same */ + if ( ref->transform[4]<-128 || ref->transform[4]>127 || + ref->transform[5]<-128 || ref->transform[5]>127 ) + flags |= (1<<0); + putshort(gi->glyphs,flags); + putshort(gi->glyphs,ref->sc->ttf_glyph==-1?0:ref->sc->ttf_glyph); + if ( flags&(1<<0) ) { + putshort(gi->glyphs,(short)ref->transform[4]); + putshort(gi->glyphs,(short)ref->transform[5]); + } else { + putc((char) (ref->transform[4]),gi->glyphs); + putc((char) (ref->transform[5]),gi->glyphs); + } + if ( flags&(1<<7) ) { + put2d14(gi->glyphs,ref->transform[0]); + put2d14(gi->glyphs,ref->transform[1]); + put2d14(gi->glyphs,ref->transform[2]); + put2d14(gi->glyphs,ref->transform[3]); + } else if ( flags&(1<<6) ) { + put2d14(gi->glyphs,ref->transform[0]); + put2d14(gi->glyphs,ref->transform[3]); + } else if ( flags&(1<<3) ) { + put2d14(gi->glyphs,ref->transform[0]); + } + for ( ss=ref->layers[0].splines, sptcnt=0; ss!=NULL ; ss=ss->next ) { + ++ctcnt; + sptcnt = SSPointCnt(ss,sptcnt,ref->sc->ttf_instrs_len!=0 || gi->has_instrs ); + } + ptcnt += sptcnt; + rd = RefDepth(ref); + if ( rd>gi->maxp->maxcomponentdepth ) + gi->maxp->maxcomponentdepth = rd; + } + + if ( sc->ttf_instrs_len!=0 ) + dumpinstrs(gi,sc->ttf_instrs,sc->ttf_instrs_len); + + if ( gi->maxp->maxnumcomponentsmaxp->maxnumcomponents = i; + if ( gi->maxp->maxCompositPtsmaxp->maxCompositPts=ptcnt; + if ( gi->maxp->maxCompositCtrsmaxp->maxCompositCtrs=ctcnt; + + ttfdumpmetrics(sc,gi,&bb); + if ( ftell(gi->glyphs)&1 ) /* Pad the file so that the next glyph */ + putc('\0',gi->glyphs); /* on a word boundary, can only happen if odd number of instrs */ +} + +static void dumpglyph(SplineChar *sc, struct glyphinfo *gi) { + struct glyphhead gh; + DBounds bb; + SplineSet *ss, *ttfss; + int contourcnt, ptcnt, origptcnt; + BasePoint *bp; + char *fs; + int use_ptcnt = sc->ttf_instrs!=NULL || gi->has_instrs; + +/* I haven't seen this documented, but ttf rasterizers are unhappy with a */ +/* glyph that consists of a single point. Glyphs containing two single points*/ +/* are ok, glyphs with a single point and anything else are ok, glyphs with */ +/* a line are ok. But a single point is not ok. Dunno why */ + if (( sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL ) || + ( sc->layers[ly_fore].refs==NULL && + (sc->layers[ly_fore].splines->first->next==NULL || + sc->layers[ly_fore].splines->first->next->to == sc->layers[ly_fore].splines->first) && + sc->layers[ly_fore].splines->next==NULL) ) { + dumpspace(sc,gi); +return; + } + + gi->loca[gi->next_glyph++] = ftell(gi->glyphs); + + if ( sc->ttf_instrs!=NULL ) + initforinstrs(sc); + + contourcnt = ptcnt = 0; + ttfss = SCttfApprox(sc); + if ( sc->ttf_instrs==NULL && gi->has_instrs ) + use_ptcnt = !BadCount(ttfss); + for ( ss=ttfss; ss!=NULL; ss=ss->next ) { + ++contourcnt; + ptcnt = SSPointCnt(ss,ptcnt,use_ptcnt); + } + origptcnt = ptcnt; + + SplineCharFindBounds(sc,&bb); + /* MicroSoft's font validator has a bug. It only looks at the points */ + /* when calculating the bounding box, and complains when I look at */ + /* the splines for internal extrema. I presume it does this because */ + /* all the extrema are supposed to be points (and it complains about */ + /* that error too), but it would lead to rasterization problems if */ + /* we did what they want */ + gh.numContours = contourcnt; + gh.xmin = floor(bb.minx); gh.ymin = floor(bb.miny); + gh.xmax = ceil(bb.maxx); gh.ymax = ceil(bb.maxy); + dumpghstruct(gi,&gh); + if ( contourcnt>gi->maxp->maxContours ) gi->maxp->maxContours = contourcnt; + if ( ptcnt>gi->maxp->maxPoints ) gi->maxp->maxPoints = ptcnt; + + bp = galloc(ptcnt*sizeof(BasePoint)); + fs = galloc(ptcnt); + ptcnt = contourcnt = 0; + for ( ss=ttfss; ss!=NULL; ss=ss->next ) { + ptcnt = SSAddPoints(ss,ptcnt,bp,fs,use_ptcnt); + putshort(gi->glyphs,ptcnt-1); + } + if ( ptcnt!=origptcnt ) + GDrawIError( "Point count wrong calculated=%d, actual=%d in %.20s", origptcnt, ptcnt, sc->name ); + + dumpinstrs(gi,sc->ttf_instrs,sc->ttf_instrs_len); + + dumppointarrays(gi,bp,fs,ptcnt); + SplinePointListsFree(ttfss); + free(bp); + free(fs); + + ttfdumpmetrics(sc,gi,&bb); +} + +static int AssignTTFGlyph(SplineFont *sf,int32 *bsizes) { + int i, tg, j; + BDFFont *bdf; + + tg = 3; + /* The first three glyphs are magic, glyph 0 might appear in the font */ + /* but glyph 1,2 never do (they correspond to NUL and CR respectively) */ + /* We generate them automagically */ + + for ( bdf = sf->bitmaps; bdf!=NULL; bdf=bdf->next ) { + for ( j=0; bsizes[j]!=0 && ((bsizes[j]&0xffff)!=bdf->pixelsize || (bsizes[j]>>16)!=BDFDepth(bdf)); ++j ); + if ( bsizes[j]==0 ) + continue; + for ( i=0; icharcnt; ++i ) if ( !IsntBDFChar(bdf->chars[i]) ) + sf->chars[i]->ttf_glyph = 0; + } + /* If we are to use glyph 0, then it will already have the right ttf_glyph*/ + /* (0), while if we aren't to use it, it again will be right (-1) */ + for ( i=1; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph==0 ) + sf->chars[i]->ttf_glyph = tg++; +return( tg ); +} + +static void ReplaceChar(SplineFont *sf, int into, int from) { + BDFFont *bdf; + + if ( into==from ) +return; + + sf->chars[into] = sf->chars[from]; + sf->chars[from] = NULL; + sf->chars[into]->enc = into; + for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next ) if ( bdf->chars[from]!=NULL ) { + bdf->chars[into] = bdf->chars[from]; + bdf->chars[from] = NULL; + bdf->chars[into]->enc = into; + } +} + +static int dumpglyphs(SplineFont *sf,struct glyphinfo *gi) { + int i, cnt, has1, has2; + int fixed = gi->fixed_width; + SplineChar *sc; + + GProgressChangeStages(2+gi->strikecnt); + QuickBlues(sf,&gi->bd); + /*FindBlues(sf,gi->blues,NULL);*/ + GProgressNextStage(); + + if ( gi->onlybitmaps ) + cnt = AssignTTFGlyph(sf,gi->bsizes); + else { + if ( sf->chars[1]==NULL || sf->chars[2]==NULL ) { + for ( i=0; icharcnt; ++i ) { + if ( sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + if ( sc->orig_pos==1 && sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL ) { + ReplaceChar(sf,1,i); + if ( sf->chars[2]!=NULL ) + break; + } else if ( sc->orig_pos==2 && sc->layers[ly_fore].splines==NULL && sc->layers[ly_fore].refs==NULL ) { + ReplaceChar(sf,2,i); + if ( sf->chars[1]!=NULL ) + break; + } + } + } + } + has1 = ( sf->chars[1]!=NULL && sf->chars[1]->orig_pos==1 ); + has2 = ( sf->chars[2]!=NULL && sf->chars[2]->orig_pos==2 ); + i=0, cnt=0; + if ( SCIsNotdef(sf->chars[0],fixed) ) + sf->chars[i++]->ttf_glyph = cnt++; + if (( sf->chars[0]==NULL || sf->chars[0]->ttf_glyph==0 ) && has1 ) { + sf->chars[1]->ttf_glyph = cnt++; + i = 2; + if ( has2 ) { + sf->chars[2]->ttf_glyph = cnt++; + i = 3; + } + } else + has1 = has2 = false; + for ( cnt=3; icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]==SCDuplicate(sf->chars[i])) + sf->chars[i]->ttf_glyph = cnt++; + } + + gi->maxp->numGlyphs = cnt; + gi->loca = galloc((gi->maxp->numGlyphs+1)*sizeof(uint32)); + gi->next_glyph = 0; + gi->glyphs = tmpfile(); + gi->hmtx = tmpfile(); + if ( sf->hasvmetrics ) + gi->vmtx = tmpfile(); + FigureFullMetricsEnd(sf,gi); + + i = 0; + if ( SCIsNotdef(sf->chars[0],fixed) && !gi->onlybitmaps ) + dumpglyph(sf->chars[i++],gi); + else + dumpmissingglyph(sf,gi,fixed); + if ( fixed!=-1 ) { + gi->lasthwidth = 3; + gi->hfullcnt = 3; + } + if ( !has1 ) + dumpblankglyph(gi,sf,fixed); /* I'm not sure exactly why but there seem */ + if ( !has2 ) + dumpblankglyph(gi,sf,fixed); /* to be a couple of blank glyphs at the start*/ + /* One is for NUL and one for CR I think... but why? */ + for ( cnt=0; icharcnt; ++i ) { + if ( gi->onlybitmaps ) { + if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph>0 ) + dumpspace(sf->chars[i],gi); + } else { + if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph>0 ) { + if ( IsTTFRefable(sf->chars[i]) ) + dumpcomposite(sf->chars[i],gi); + else + dumpglyph(sf->chars[i],gi); + } + } + if ( !GProgressNext()) +return( false ); + } + + /* extra location entry points to end of last glyph */ + gi->loca[gi->next_glyph] = ftell(gi->glyphs); + /* Microsoft's Font Validator wants the last loca entry to point into the */ + /* glyph table. I think that's an error on their part, but it's so easy */ + /* to fix, I might as well */ + putlong(gi->glyphs,0); + gi->glyph_len = ftell(gi->glyphs); + gi->hmtxlen = ftell(gi->hmtx); + /* pad out to four bytes */ + if ( gi->hmtxlen&2 ) putshort(gi->hmtx,0); + if ( gi->loca[gi->next_glyph]&3 ) { + for ( i=4-(gi->loca[gi->next_glyph]&3); i>0; --i ) + putc('\0',gi->glyphs); + } + if ( sf->hasvmetrics ) { + gi->vmtxlen = ftell(gi->vmtx); + if ( gi->vmtxlen&2 ) putshort(gi->vmtx,0); + } +return( true ); +} + +/* Generate a null glyf and loca table for X opentype bitmaps */ +static int dumpnoglyphs(SplineFont *sf,struct glyphinfo *gi) { + + gi->glyphs = tmpfile(); + gi->glyph_len = 0; + /* loca gets built in dummyloca */ +return( true ); +} + +/* Standard names for cff */ +extern const char *cffnames[]; +extern const int nStdStrings; + +static int storesid(struct alltabs *at,char *str) { + int i; + FILE *news; + char *pt; + long pos; + + if ( str!=NULL ) { /* NULL is the magic string at end of array */ + for ( i=0; cffnames[i]!=NULL; ++i ) { + if ( strcmp(cffnames[i],str)==0 ) +return( i ); + } + } + + pos = ftell(at->sidf)+1; + if ( pos>=65536 && !at->sidlongoffset ) { + at->sidlongoffset = true; + news = tmpfile(); + rewind(at->sidh); + for ( i=0; isidcnt; ++i ) + putlong(news,getushort(at->sidh)); + fclose(at->sidh); + at->sidh = news; + } + if ( at->sidlongoffset ) + putlong(at->sidh,pos); + else + putshort(at->sidh,pos); + + if ( str!=NULL ) { + for ( pt=str; *pt; ++pt ) + putc(*pt,at->sidf); + } +return( at->sidcnt++ + nStdStrings ); +} + +static void dumpint(FILE *cfff,int num) { + + if ( num>=-107 && num<=107 ) + putc(num+139,cfff); + else if ( num>=108 && num<=1131 ) { + num -= 108; + putc((num>>8)+247,cfff); + putc(num&0xff,cfff); + } else if ( num>=-1131 && num<=-108 ) { + num = -num; + num -= 108; + putc((num>>8)+251,cfff); + putc(num&0xff,cfff); + } else if ( num>=-32768 && num<32768 ) { + putc(28,cfff); + putc(num>>8,cfff); + putc(num&0xff,cfff); + } else { /* In dict data we have 4 byte ints, in type2 strings we don't */ + putc(29,cfff); + putc((num>>24)&0xff,cfff); + putc((num>>16)&0xff,cfff); + putc((num>>8)&0xff,cfff); + putc(num&0xff,cfff); + } +} + +static void dumpdbl(FILE *cfff,double d) { + if ( d-rint(d)>-.00001 && d-rint(d)<.00001 ) + dumpint(cfff,(int) d); + else { + /* The type2 strings have a fixed format, but the dict data does not */ + char buffer[20], *pt; + int sofar,n,odd; + sprintf( buffer, "%g", d); + sofar = 0; odd=true; + putc(30,cfff); /* Start a double */ + for ( pt=buffer; *pt; ++pt ) { + if ( isdigit(*pt) ) + n = *pt-'0'; + else if ( *pt=='.' ) + n = 0xa; + else if ( *pt=='-' ) + n = 0xe; + else if (( *pt=='E' || *pt=='e') && pt[1]=='-' ) { + n = 0xc; + ++pt; + } else if ( *pt=='E' || *pt=='e') + n = 0xb; + if ( odd ) { + sofar = n<<4; + odd = false; + } else { + putc(sofar|n,cfff); + sofar=0; + odd = true; + } + } + if ( sofar==0 ) + putc(0xff,cfff); + else + putc(sofar|0xf,cfff); + } +} + +static void dumpoper(FILE *cfff,int oper ) { + if ( oper!=-1 ) { + if ( oper>=256 ) + putc(oper>>8,cfff); + putc(oper&0xff,cfff); + } +} + +static void dumpdbloper(FILE *cfff,double d, int oper ) { + dumpdbl(cfff,d); + dumpoper(cfff,oper); +} + +static void dumpintoper(FILE *cfff,int v, int oper ) { + dumpint(cfff,v); + dumpoper(cfff,oper); +} + +static void dumpsizedint(FILE *cfff,int big,int num, int oper ) { + if ( big ) { + putc(29,cfff); + putc((num>>24)&0xff,cfff); + putc((num>>16)&0xff,cfff); + putc((num>>8)&0xff,cfff); + putc(num&0xff,cfff); + } else { + putc(28,cfff); + putc(num>>8,cfff); + putc(num&0xff,cfff); + } + dumpoper(cfff,oper); +} + +static void dumpsid(FILE *cfff,struct alltabs *at,char *str,int oper) { + if ( str==NULL ) +return; + dumpint(cfff,storesid(at,str)); + dumpoper(cfff,oper); +} + +static void DumpStrDouble(char *pt,FILE *cfff,int oper) { + real d = strtod(pt,NULL); + dumpdbloper(cfff,d,oper); +} + +static void DumpDblArray(real *arr,int n,FILE *cfff, int oper) { + int mi,i; + + for ( mi=n-1; mi>=0 && arr[mi]==0; --mi ); + if ( mi<0 ) +return; + dumpdbl(cfff,arr[0]); + for ( i=1; i<=mi; ++i ) + dumpdbl(cfff,arr[i]-arr[i-1]); + dumpoper(cfff,oper); +} + +static void DumpStrArray(char *pt,FILE *cfff,int oper) { + real d, last=0; + char *end; + + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) +return; + if ( *pt=='[' ) ++pt; + while ( *pt==' ' ) ++pt; + while ( *pt!=']' && *pt!='\0' ) { + d = strtod(pt,&end); + if ( pt==end ) /* User screwed up. Should be a number */ + break; + dumpdbl(cfff,d-last); + last = d; + pt = end; + while ( *pt==' ' ) ++pt; + } + dumpoper(cfff,oper); +} + +static void dumpcffheader(SplineFont *sf,FILE *cfff) { + putc('\1',cfff); /* Major version: 1 */ + putc('\0',cfff); /* Minor version: 0 */ + putc('\4',cfff); /* Header size in bytes */ + putc('\4',cfff); /* Absolute Offset size. */ + /* I don't think there are any absolute offsets that aren't encoded */ + /* in a dict as numbers (ie. inherently variable sized items) */ +} + +static void dumpcffnames(SplineFont *sf,FILE *cfff) { + char *pt; + + putshort(cfff,1); /* One font name */ + putc('\1',cfff); /* Offset size */ + putc('\1',cfff); /* Offset to first name */ + putc('\1'+strlen(sf->fontname),cfff); + for ( pt=sf->fontname; *pt; ++pt ) + putc(*pt,cfff); +} + +static void dumpcffcharset(SplineFont *sf,struct alltabs *at) { + int i; + + at->gn_sid = gcalloc(sf->charcnt,sizeof(uint32)); + putc(0,at->charset); + /* I always use a format 0 charset. ie. an array of SIDs in random order */ + + /* First element must be ".notdef" and is omitted */ + /* So if glyph 0 isn't notdef do something special */ + if ( !SCIsNotdef(sf->chars[0],at->gi.fixed_width) && SCWorthOutputting(sf->chars[0]) ) + putshort(at->charset,storesid(at,sf->chars[0]->name)); + + for ( i=1; icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i]) ) { + at->gn_sid[i] = storesid(at,sf->chars[i]->name); + putshort(at->charset,at->gn_sid[i]); + } +} + +static void dumpcffcidset(SplineFont *sf,struct alltabs *at) { + int cid, k, max=0, start; + + putc(2,at->charset); + + for ( k=0; ksubfontcnt; ++k ) + if ( sf->subfonts[k]->charcnt>max ) max = sf->subfonts[k]->charcnt; + + start = -1; /* Glyph 0 always maps to CID 0, and is omitted */ + for ( cid = 1; cidsubfontcnt; ++k ) { + if ( cidsubfonts[k]->charcnt && + SCWorthOutputting(sf->subfonts[k]->chars[cid]) ) + break; + } + if ( k==sf->subfontcnt ) { + if ( start!=-1 ) { + putshort(at->charset,start); + putshort(at->charset,cid-1-start); /* Count of glyphs in range excluding first */ + start = -1; + } + } else { + if ( start==-1 ) start = cid; + } + } + if ( start!=-1 ) { + putshort(at->charset,start); + putshort(at->charset,cid-1-start); /* Count of glyphs in range excluding first */ + } +} + +static void dumpcfffdselect(SplineFont *sf,struct alltabs *at) { + int cid, k, max=0, lastfd, cnt; + int gid; + + putc(3,at->fdselect); + putshort(at->fdselect,0); /* number of ranges, fill in later */ + + for ( k=0; ksubfontcnt; ++k ) + if ( sf->subfonts[k]->charcnt>max ) max = sf->subfonts[k]->charcnt; + + for ( k=0; ksubfontcnt; ++k ) + if ( SCWorthOutputting(sf->subfonts[k]->chars[0])) + break; + if ( k==sf->subfontcnt ) --k; /* If CID 0 not defined, put it in last font */ + putshort(at->fdselect,0); + putc(k,at->fdselect); + lastfd = k; + cnt = 1; + for ( cid = gid = 1; cidsubfontcnt; ++k ) { + if ( cidsubfonts[k]->charcnt && + SCWorthOutputting(sf->subfonts[k]->chars[cid]) ) + break; + } + if ( k==sf->subfontcnt ) + /* Doesn't map to a glyph, irrelevant */; + else { + if ( k!=lastfd ) { + putshort(at->fdselect,gid); + putc(k,at->fdselect); + lastfd = k; + ++cnt; + } + ++gid; + } + } + putshort(at->fdselect,gid); + fseek(at->fdselect,1,SEEK_SET); + putshort(at->fdselect,cnt); + fseek(at->fdselect,0,SEEK_END); +} + +static void dumpcffencoding(SplineFont *sf,struct alltabs *at) { + int i,j, last, anydups; + uint32 start_pos = ftell(at->encoding); + SplineChar *sc; + + putc(0,at->encoding); + /* I always use a format 0 encoding. ie. an array of glyph indexes */ + putc(0xff,at->encoding); /* fixup later */ + + last = -1; + anydups = 0; + for ( i=0; i<256 && icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + if ( sc != SCDuplicate(sc) ) { + ++anydups; + } else if ( sc->ttf_glyph!=-1 && sc->ttf_glyph>last ) { + if ( sc->ttf_glyph>=255 ) + break; + for ( j=last+1; jttf_glyph && j<255; ++j ) + putc(0,at->encoding); + putc(i,at->encoding); + last = sc->ttf_glyph; + } + } + if ( anydups ) { + fseek(at->encoding,start_pos,SEEK_SET); + putc(0x80,at->encoding); + putc(last+1,at->encoding); + fseek(at->encoding,0,SEEK_END); + putc(anydups,at->encoding); + for ( i=0; i<256 && icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + if ( sc != SCDuplicate(sc) ) { + putc(i,at->encoding); + putshort(at->encoding,at->gn_sid[SCDuplicate(sc)->enc]); + } + } + } else { + fseek(at->encoding,start_pos+1,SEEK_SET); + putc(last+1,at->encoding); + fseek(at->encoding,0,SEEK_END); + } + free( at->gn_sid ); + at->gn_sid = NULL; +} + +static void _dumpcffstrings(FILE *file, struct pschars *strs) { + int i, len, offsize; + + /* First figure out the offset size */ + len = 1; + for ( i=0; inext; ++i ) + len += strs->lens[i]; + + /* Then output the index size and offsets */ + putshort( file, strs->next ); + if ( strs->next!=0 ) { + offsize = len<=255?1:len<=65535?2:len<=0xffffff?3:4; + putc(offsize,file); + len = 1; + for ( i=0; inext; ++i ) { + dumpoffset(file,offsize,len); + len += strs->lens[i]; + } + dumpoffset(file,offsize,len); + + /* last of all the strings */ + for ( i=0; inext; ++i ) { + uint8 *pt = strs->values[i], *end = pt+strs->lens[i]; + while ( ptcharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i]) ) { + if ( maxwchars[i]->width ) maxw = sf->chars[i]->width; + if ( sameval == 0x8000000 ) + sameval = sf->chars[i]->width; + else if ( sameval!=sf->chars[i]->width ) + allsame = false; + } + if ( allsame ) { + nomwid = defwid = sameval; + } else { + ++maxw; + if ( maxw>65535 ) maxw = 3*(sf->ascent+sf->descent); + widths = gcalloc(maxw,sizeof(uint16)); + cumwid = gcalloc(maxw,sizeof(uint32)); + defwid = 0; cnt=0; + for ( i=0; icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i]) && + sf->chars[i]->width>=0 && + sf->chars[i]->widthchars[i]->width] > cnt ) { + defwid = sf->chars[i]->width; + cnt = widths[defwid]; + } + widths[defwid] = 0; + for ( i=0; i=0 && i+jprivate:at->fds[subfont].private; + int mi,i; + real bluevalues[14], otherblues[10]; + real snapcnt[12]; + real stemsnaph[12], stemsnapv[12]; + real stdhw[1], stdvw[1]; + int hasblue=0, hash=0, hasv=0, bs; + int nomwid, defwid; + + /* The private dict is not in an index, so no index header. Just the data */ + + defwid = SFFigureDefWidth(sf,&nomwid); + dumpintoper(private,defwid,20); /* Default Width */ + if ( subfont==-1 ) + at->defwid = defwid; + else + at->fds[subfont].defwid = defwid; + dumpintoper(private,nomwid,21); /* Nominative Width */ + if ( subfont==-1 ) + at->nomwid = nomwid; + else + at->fds[subfont].nomwid = nomwid; + + bs = SplineFontIsFlexible(sf,at->gi.flags); + hasblue = PSDictHasEntry(sf->private,"BlueValues")!=NULL; + hash = PSDictHasEntry(sf->private,"StdHW")!=NULL; + hasv = PSDictHasEntry(sf->private,"StdVW")!=NULL; + GProgressChangeStages(2+autohint_before_generate+!hasblue); + if ( autohint_before_generate ) { + GProgressChangeLine1R(_STR_AutoHintingFont); + SplineFontAutoHint(sf); + GProgressNextStage(); + } + + if ( !hasblue ) { + FindBlues(sf,bluevalues,otherblues); + GProgressNextStage(); + } + + stdhw[0] = stdvw[0] = 0; + if ( !hash ) { + FindHStems(sf,stemsnaph,snapcnt); + mi = -1; + for ( i=0; stemsnaph[i]!=0 && i<12; ++i ) + if ( mi==-1 ) mi = i; + else if ( snapcnt[i]>snapcnt[mi] ) mi = i; + if ( mi!=-1 ) stdhw[0] = stemsnaph[mi]; + } + + if ( !hasv ) { + FindVStems(sf,stemsnapv,snapcnt); + mi = -1; + for ( i=0; stemsnapv[i]!=0 && i<12; ++i ) + if ( mi==-1 ) mi = i; + else if ( snapcnt[i]>snapcnt[mi] ) mi = i; + if ( mi!=-1 ) stdvw[0] = stemsnapv[mi]; + } + GProgressChangeLine1R(_STR_SavingOpenTypeFont); + + if ( hasblue ) + DumpStrArray(PSDictHasEntry(sf->private,"BlueValues"),private,6); + else + DumpDblArray(bluevalues,sizeof(bluevalues)/sizeof(bluevalues[0]),private,6); + if ( (pt=PSDictHasEntry(sf->private,"OtherBlues"))!=NULL ) + DumpStrArray(pt,private,7); + else if ( !hasblue ) + DumpDblArray(otherblues,sizeof(otherblues)/sizeof(otherblues[0]),private,7); + if ( (pt=PSDictHasEntry(sf->private,"FamilyBlues"))!=NULL ) + DumpStrArray(pt,private,8); + if ( (pt=PSDictHasEntry(sf->private,"FamilyOtherBlues"))!=NULL ) + DumpStrArray(pt,private,9); + if ( (pt=PSDictHasEntry(sf->private,"BlueScale"))!=NULL ) + DumpStrDouble(pt,private,(12<<8)+9); + if ( (pt=PSDictHasEntry(sf->private,"BlueShift"))!=NULL ) + DumpStrDouble(pt,private,(12<<8)+10); + else + dumpintoper(private,bs,(12<<8)+10); + if ( (pt=PSDictHasEntry(sf->private,"BlueFuzz"))!=NULL ) + DumpStrDouble(pt,private,(12<<8)+11); + if ( hash ) { + DumpStrDouble(PSDictHasEntry(sf->private,"StdHW"),private,10); + if ( (pt=PSDictHasEntry(sf->private,"StemSnapH"))!=NULL ) + DumpStrArray(pt,private,(12<<8)|12); + } else { + if ( stdhw[0]!=0 ) + dumpdbloper(private,stdhw[0],10); + DumpDblArray(stemsnaph,sizeof(stemsnaph)/sizeof(stemsnaph[0]),private,(12<<8)|12); + } + if ( hasv ) { + DumpStrDouble(PSDictHasEntry(sf->private,"StdVW"),private,11); + if ( (pt=PSDictHasEntry(sf->private,"StemSnapV"))!=NULL ) + DumpStrArray(pt,private,(12<<8)|13); + } else { + if ( stdvw[0]!=0 ) + dumpdbloper(private,stdvw[0],11); + DumpDblArray(stemsnapv,sizeof(stemsnapv)/sizeof(stemsnapv[0]),private,(12<<8)|13); + } + if ( (pt=PSDictHasEntry(sf->private,"ForceBold"))!=NULL ) { + dumpintoper(private,*pt=='t'||*pt=='T',(12<<8)|14); + } else if ( sf->weight!=NULL && + (strstrmatch(sf->weight,"Bold")!=NULL || + strstrmatch(sf->weight,"Demi")!=NULL || + strstrmatch(sf->weight,"Fett")!=NULL || + strstrmatch(sf->weight,"Gras")!=NULL || + strstrmatch(sf->weight,"Heavy")!=NULL || + strstrmatch(sf->weight,"Black")!=NULL)) + dumpintoper(private,1,(12<<8)|14); + if ( (pt=PSDictHasEntry(sf->private,"LanguageGroup"))!=NULL ) + DumpStrDouble(pt,private,(12<<8)+17); + else if ( sf->encoding_name>=em_first2byte && sf->encoding_nameprivate,"ExpansionFactor"))!=NULL ) + DumpStrDouble(pt,private,(12<<8)+18); + if ( subrcnt!=0 ) + dumpsizedint(private,false,ftell(private)+3+1,19); /* Subrs */ + + if ( subfont==-1 ) + at->privatelen = ftell(private); + else + at->fds[subfont].privatelen = ftell(private); +} + +/* When we exit this the topdict is not complete, we still need to fill in */ +/* values for charset,encoding,charstrings and private. Then we need to go */ +/* back and fill in the table length (at lenpos) */ +static void dumpcfftopdict(SplineFont *sf,struct alltabs *at) { + char *pt, *end; + FILE *cfff = at->cfff; + DBounds b; + + putshort(cfff,1); /* One top dict */ + putc('\2',cfff); /* Offset size */ + putshort(cfff,1); /* Offset to topdict */ + at->lenpos = ftell(cfff); + putshort(cfff,0); /* placeholder for final position (final offset in index points beyond last element) */ + dumpsid(cfff,at,sf->version,0); + dumpsid(cfff,at,sf->copyright,1); + dumpsid(cfff,at,sf->fullname?sf->fullname:sf->fontname,2); + dumpsid(cfff,at,sf->familyname,3); + dumpsid(cfff,at,sf->weight,4); + if ( at->gi.fixed_width!=-1 ) dumpintoper(cfff,1,(12<<8)|1); + if ( sf->italicangle!=0 ) dumpdbloper(cfff,sf->italicangle,(12<<8)|2); + if ( sf->upos!=-100 ) dumpdbloper(cfff,sf->upos,(12<<8)|3); + if ( sf->uwidth!=50 ) dumpdbloper(cfff,sf->uwidth,(12<<8)|4); + /* We'll never set painttype */ + /* We'll never set CharstringType */ + if ( sf->ascent+sf->descent!=1000 ) { + dumpdbl(cfff,1.0/(sf->ascent+sf->descent)); + dumpint(cfff,0); + dumpint(cfff,0); + dumpdbl(cfff,1.0/(sf->ascent+sf->descent)); + dumpint(cfff,0); + dumpintoper(cfff,0,(12<<8)|7); + } + if ( sf->uniqueid!=-1 ) + dumpintoper(cfff, sf->uniqueid?sf->uniqueid:4000000 + (rand()&0x3ffff), 13 ); + SplineFontFindBounds(sf,&b); + at->gi.xmin = b.minx; + at->gi.ymin = b.miny; + at->gi.xmax = b.maxx; + at->gi.ymax = b.maxy; + dumpdbl(cfff,floor(b.minx)); + dumpdbl(cfff,floor(b.miny)); + dumpdbl(cfff,ceil(b.maxx)); + dumpdbloper(cfff,ceil(b.maxy),5); + /* We'll never set StrokeWidth */ + if ( sf->xuid!=NULL ) { + pt = sf->xuid; if ( *pt=='[' ) ++pt; + while ( *pt && *pt!=']' ) { + dumpint(cfff,strtol(pt,&end,10)); + for ( pt = end; *pt==' '; ++pt ); + } + putc(14,cfff); + if ( sf->changed_since_xuidchanged ) + SFIncrementXUID(sf); + } + /* Offset to charset (oper=15) needed here */ + /* Offset to encoding (oper=16) needed here (not for CID )*/ + /* Offset to charstrings (oper=17) needed here */ + /* Length of, and Offset to private (oper=18) needed here (not for CID )*/ +} + +static int dumpcffdict(SplineFont *sf,struct alltabs *at) { + FILE *fdarray = at->fdarray; + int pstart; + /* according to the PSRef Man v3, only fontname, fontmatrix and private */ + /* appear in this dictionary */ + + dumpsid(fdarray,at,sf->fontname,(12<<8)|38); + if ( sf->ascent+sf->descent!=1000 ) { + dumpdbl(fdarray,1.0/(sf->ascent+sf->descent)); + dumpint(fdarray,0); + dumpint(fdarray,0); + dumpdbl(fdarray,1.0/(sf->ascent+sf->descent)); + dumpint(fdarray,0); + dumpintoper(fdarray,0,(12<<8)|7); + } + pstart = ftell(fdarray); + dumpsizedint(fdarray,false,0,-1); /* private length */ + dumpsizedint(fdarray,true,0,18); /* private offset */ +return( pstart ); +} + +static void dumpcffdictindex(SplineFont *sf,struct alltabs *at) { + int i; + int pos; + + putshort(at->fdarray,sf->subfontcnt); + putc('\2',at->fdarray); /* DICTs aren't very big, and there are at most 255 */ + putshort(at->fdarray,1); /* Offset to first dict */ + for ( i=0; isubfontcnt; ++i ) + putshort(at->fdarray,0); /* Dump offset placeholders (note there's one extra to mark the end) */ + pos = ftell(at->fdarray)-1; + for ( i=0; isubfontcnt; ++i ) { + at->fds[i].fillindictmark = dumpcffdict(sf->subfonts[i],at); + at->fds[i].eodictmark = ftell(at->fdarray); + if ( at->fds[i].eodictmark>65536 ) + GDrawIError("The DICT INDEX got too big, result won't work"); + } + fseek(at->fdarray,2*sizeof(short)+sizeof(char),SEEK_SET); + for ( i=0; isubfontcnt; ++i ) + putshort(at->fdarray,at->fds[i].eodictmark-pos); + fseek(at->fdarray,0,SEEK_END); +} + +static void dumpcffcidtopdict(SplineFont *sf,struct alltabs *at) { + char *pt, *end; + FILE *cfff = at->cfff; + DBounds b; + int cidcnt=0, k; + + for ( k=0; ksubfontcnt; ++k ) + if ( sf->subfonts[k]->charcnt>cidcnt ) cidcnt = sf->subfonts[k]->charcnt; + + putshort(cfff,1); /* One top dict */ + putc('\2',cfff); /* Offset size */ + putshort(cfff,1); /* Offset to topdict */ + at->lenpos = ftell(cfff); + putshort(cfff,0); /* placeholder for final position */ + dumpsid(cfff,at,sf->cidregistry,-1); + dumpsid(cfff,at,sf->ordering,-1); + dumpintoper(cfff,sf->supplement,(12<<8)|30); /* ROS operator must be first */ + dumpdbloper(cfff,sf->cidversion,(12<<8)|31); + dumpintoper(cfff,cidcnt,(12<<8)|34); + dumpintoper(cfff, sf->uniqueid?sf->uniqueid:4000000 + (rand()&0x3ffff), (12<<8)|35 ); + + dumpsid(cfff,at,sf->copyright,1); + dumpsid(cfff,at,sf->fullname?sf->fullname:sf->fontname,2); + dumpsid(cfff,at,sf->familyname,3); + dumpsid(cfff,at,sf->weight,4); + /* FontMatrix (identity here, real ones in sub fonts)*/ + /* Actually there is no fontmatrix in the adobe cid font I'm looking at */ + /* which means it should default to [.001...] but it doesn't so the */ + /* docs aren't completely accurate */ + /* I now see I've no idea what the FontMatrix means in a CID keyed font */ + /* it seems to be ignored everywhere */ +#if 0 + dumpdbl(cfff,1.0); + dumpint(cfff,0); + dumpint(cfff,0); + dumpdbl(cfff,1.0); + dumpint(cfff,0); + dumpintoper(cfff,0,(12<<8)|7); +#endif + + CIDFindBounds(sf,&b); + at->gi.xmin = b.minx; + at->gi.ymin = b.miny; + at->gi.xmax = b.maxx; + at->gi.ymax = b.maxy; + dumpdbl(cfff,floor(b.minx)); + dumpdbl(cfff,floor(b.miny)); + dumpdbl(cfff,ceil(b.maxx)); + dumpdbloper(cfff,ceil(b.maxy),5); + /* We'll never set StrokeWidth */ + if ( sf->xuid!=NULL ) { + pt = sf->xuid; if ( *pt=='[' ) ++pt; + while ( *pt && *pt!=']' ) { + dumpint(cfff,strtol(pt,&end,10)); + for ( pt = end; *pt==' '; ++pt ); + } + putc(14,cfff); + if ( sf->changed_since_xuidchanged ) + SFIncrementXUID(sf); + } + dumpint(cfff,0); /* Docs say a private dict is required and they don't specifically omit CID top dicts */ + dumpintoper(cfff,0,18); /* But they do say it can be zero */ + /* Offset to charset (oper=15) needed here */ + /* Offset to charstrings (oper=17) needed here */ + /* Offset to FDArray (oper=12,36) needed here */ + /* Offset to FDSelect (oper=12,37) needed here */ +} + +static void finishup(SplineFont *sf,struct alltabs *at) { + int strlen, shlen, glen,enclen,csetlen,cstrlen,prvlen; + int base, eotop, strhead; + int output_enc = ( at->format==ff_cff && sf->encoding_name!=em_adobestandard ); + + storesid(at,NULL); /* end the strings index */ + strlen = ftell(at->sidf) + (shlen = ftell(at->sidh)); + glen = sizeof(short); /* Single entry: 0, no globals */ + enclen = ftell(at->encoding); + csetlen = ftell(at->charset); + cstrlen = ftell(at->charstrings); + prvlen = ftell(at->private); + base = ftell(at->cfff); + if ( base+6*3+strlen+glen+enclen+csetlen+cstrlen+prvlen > 32767 ) { + at->cfflongoffset = true; + base += 5*5+4; + } else + base += 5*3+4; + strhead = 2+(at->sidcnt>1); + base += strhead; + + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen,15); /* Charset */ + if ( output_enc ) /* encoding offset */ + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen+csetlen,16); /* encoding offset */ + else { + dumpsizedint(at->cfff,at->cfflongoffset,0,16); + enclen = 0; + } + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen+csetlen+enclen,17);/* charstrings */ + dumpsizedint(at->cfff,at->cfflongoffset,at->privatelen,-1); + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen+csetlen+enclen+cstrlen,18); /* private size */ + eotop = base-strhead-at->lenpos-1; + if ( at->cfflongoffset ) { + fseek(at->cfff,3,SEEK_SET); + putc(4,at->cfff); + } + fseek(at->cfff,at->lenpos,SEEK_SET); + putshort(at->cfff,eotop); + fseek(at->cfff,0,SEEK_END); + + /* String Index */ + putshort(at->cfff,at->sidcnt-1); + if ( at->sidcnt!=1 ) { /* Everybody gets an added NULL */ + putc(at->sidlongoffset?4:2,at->cfff); + if ( !ttfcopyfile(at->cfff,at->sidh,base)) at->error = true; + if ( !ttfcopyfile(at->cfff,at->sidf,base+shlen)) at->error = true; + } + + /* Global Subrs */ + putshort(at->cfff,0); + + /* Charset */ + if ( !ttfcopyfile(at->cfff,at->charset,base+strlen+glen)) at->error = true; + + /* Encoding */ + if ( !ttfcopyfile(at->cfff,at->encoding,base+strlen+glen+csetlen)) at->error = true; + + /* Char Strings */ + if ( !ttfcopyfile(at->cfff,at->charstrings,base+strlen+glen+csetlen+enclen)) at->error = true; + + /* Private & Subrs */ + if ( !ttfcopyfile(at->cfff,at->private,base+strlen+glen+csetlen+enclen+cstrlen)) at->error = true; +} + +static void finishupcid(SplineFont *sf,struct alltabs *at) { + int strlen, shlen, glen,csetlen,cstrlen,fdsellen,fdarrlen,prvlen; + int base, eotop, strhead; + int i; + + storesid(at,NULL); /* end the strings index */ + strlen = ftell(at->sidf) + (shlen = ftell(at->sidh)); + glen = sizeof(short); /* Single entry: 0, no globals */ + /* No encodings */ + csetlen = ftell(at->charset); + fdsellen = ftell(at->fdselect); + cstrlen = ftell(at->charstrings); + fdarrlen = ftell(at->fdarray); + base = ftell(at->cfff); + + at->cfflongoffset = true; + base += 5*4+4+2; /* two of the opers below are two byte opers */ + strhead = 2+(at->sidcnt>1); + base += strhead; + + prvlen = 0; + for ( i=0; isubfontcnt; ++i ) { + fseek(at->fdarray,at->fds[i].fillindictmark,SEEK_SET); + dumpsizedint(at->fdarray,false,at->fds[i].privatelen,-1); /* Private len */ + dumpsizedint(at->fdarray,true,base+strlen+glen+csetlen+fdsellen+cstrlen+fdarrlen+prvlen,18); /* Private offset */ + prvlen += ftell(at->fds[i].private); /* private & subrs */ + } + + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen,15); /* charset */ + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen+csetlen,(12<<8)|37); /* fdselect */ + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen+csetlen+fdsellen,17); /* charstrings */ + dumpsizedint(at->cfff,at->cfflongoffset,base+strlen+glen+csetlen+fdsellen+cstrlen,(12<<8)|36); /* fdarray */ + eotop = base-strhead-at->lenpos-1; + fseek(at->cfff,at->lenpos,SEEK_SET); + putshort(at->cfff,eotop); + fseek(at->cfff,0,SEEK_END); + + /* String Index */ + putshort(at->cfff,at->sidcnt-1); + if ( at->sidcnt!=1 ) { /* Everybody gets an added NULL */ + putc(at->sidlongoffset?4:2,at->cfff); + if ( !ttfcopyfile(at->cfff,at->sidh,base)) at->error = true; + if ( !ttfcopyfile(at->cfff,at->sidf,base+shlen)) at->error = true; + } + + /* Global Subrs */ + putshort(at->cfff,0); + + /* Charset */ + if ( !ttfcopyfile(at->cfff,at->charset,base+strlen+glen)) at->error = true; + + /* FDSelect */ + if ( !ttfcopyfile(at->cfff,at->fdselect,base+strlen+glen+csetlen)) at->error = true; + + /* Char Strings */ + if ( !ttfcopyfile(at->cfff,at->charstrings,base+strlen+glen+csetlen+fdsellen)) at->error = true; + + /* FDArray (DICT Index) */ + if ( !ttfcopyfile(at->cfff,at->fdarray,base+strlen+glen+csetlen+fdsellen+cstrlen)) at->error = true; + + /* Private & Subrs */ + prvlen = 0; + for ( i=0; isubfontcnt; ++i ) { + int temp = ftell(at->fds[i].private); + if ( !ttfcopyfile(at->cfff,at->fds[i].private, + base+strlen+glen+csetlen+fdsellen+cstrlen+fdarrlen+prvlen)) at->error = true; + prvlen += temp; + } + + free(at->fds); +} + +static int dumpcffhmtx(struct alltabs *at,SplineFont *sf,int bitmaps) { + DBounds b; + SplineChar *sc; + int i,cnt; + int dovmetrics = sf->hasvmetrics; + int width = at->gi.fixed_width; + + at->gi.hmtx = tmpfile(); + if ( dovmetrics ) + at->gi.vmtx = tmpfile(); + FigureFullMetricsEnd(sf,&at->gi); + if ( SCIsNotdef(sf->chars[0],width)) { + putshort(at->gi.hmtx,sf->chars[0]->width); + SplineCharFindBounds(sf->chars[0],&b); + putshort(at->gi.hmtx,b.minx); + if ( dovmetrics ) { + putshort(at->gi.vmtx,sf->chars[0]->vwidth); + putshort(at->gi.vmtx,sf->vertical_origin-b.miny); + } + i = 1; + } else { + i = 0; + putshort(at->gi.hmtx,width==-1?sf->ascent+sf->descent:width); + putshort(at->gi.hmtx,0); + if ( dovmetrics ) { + putshort(at->gi.vmtx,sf->ascent+sf->descent); + putshort(at->gi.vmtx,0); + } + } + cnt = 1; + if ( bitmaps ) { + if ( width==-1 ) width = (sf->ascent+sf->descent)/3; + putshort(at->gi.hmtx,width); + putshort(at->gi.hmtx,0); + if ( dovmetrics ) { + putshort(at->gi.vmtx,sf->ascent+sf->descent); + putshort(at->gi.vmtx,0); + } + putshort(at->gi.hmtx,width); + putshort(at->gi.hmtx,0); + if ( dovmetrics ) { + putshort(at->gi.vmtx,sf->ascent+sf->descent); + putshort(at->gi.vmtx,0); + } + cnt = 3; + } + i=1; + if ( !SCIsNotdef(sf->chars[0],width) ) + i = 0; + for ( ; icharcnt; ++i ) { + sc = sf->chars[i]; + if ( SCWorthOutputting(sc)) { + if ( i<=at->gi.lasthwidth ) + putshort(at->gi.hmtx,sc->width); + SplineCharFindBounds(sc,&b); + putshort(at->gi.hmtx,b.minx); + if ( dovmetrics ) { + if ( i<=at->gi.lasthwidth ) + putshort(at->gi.vmtx,sc->vwidth); + putshort(at->gi.vmtx,sf->vertical_origin-b.maxy); + } + ++cnt; + if ( i==at->gi.lasthwidth ) + at->gi.hfullcnt = cnt; + if ( i==at->gi.lastvwidth ) + at->gi.vfullcnt = cnt; + } + } + at->gi.hmtxlen = ftell(at->gi.hmtx); + if ( at->gi.hmtxlen&2 ) putshort(at->gi.hmtx,0); + if ( dovmetrics ) { + at->gi.vmtxlen = ftell(at->gi.vmtx); + if ( at->gi.vmtxlen&2 ) putshort(at->gi.vmtx,0); + } + + at->gi.maxp->numGlyphs = cnt; +return( true ); +} + +static void dumpcffcidhmtx(struct alltabs *at,SplineFont *_sf) { + DBounds b; + SplineChar *sc; + int cid,i,cnt=0,max; + SplineFont *sf; + int dovmetrics = _sf->hasvmetrics; + + at->gi.hmtx = tmpfile(); + if ( dovmetrics ) + at->gi.vmtx = tmpfile(); + FigureFullMetricsEnd(_sf,&at->gi); + + max = 0; + for ( i=0; i<_sf->subfontcnt; ++i ) + if ( max<_sf->subfonts[i]->charcnt ) + max = _sf->subfonts[i]->charcnt; + for ( cid = 0; cidsubfontcnt; ++i ) { + sf = _sf->subfonts[i]; + if ( cidcharcnt && SCWorthOutputting(sf->chars[cid])) + break; + } + if ( i!=_sf->subfontcnt ) { + sc = sf->chars[cid]; + if ( cid<=at->gi.lasthwidth ) + putshort(at->gi.hmtx,sc->width); + SplineCharFindBounds(sc,&b); + putshort(at->gi.hmtx,b.minx); + if ( dovmetrics ) { + if ( cid<=at->gi.lasthwidth ) + putshort(at->gi.vmtx,sc->vwidth); + putshort(at->gi.vmtx,sf->vertical_origin-b.maxy); + } + ++cnt; + if ( cid==at->gi.lasthwidth ) + at->gi.hfullcnt = cnt; + if ( cid==at->gi.lastvwidth ) + at->gi.vfullcnt = cnt; + } else if ( cid==0 /*&& i==_sf->subfontcnt*/ ) { + /* Create a dummy entry for .notdef */ + putshort(at->gi.hmtx,sf->ascent+sf->descent); + putshort(at->gi.hmtx,0); + ++cnt; + if ( dovmetrics ) { + putshort(at->gi.vmtx,sf->ascent+sf->descent); + putshort(at->gi.vmtx,0); + } + } + } + at->gi.hmtxlen = ftell(at->gi.hmtx); + if ( at->gi.hmtxlen&2 ) putshort(at->gi.hmtx,0); + if ( dovmetrics ) { + at->gi.vmtxlen = ftell(at->gi.vmtx); + if ( at->gi.vmtxlen&2 ) putshort(at->gi.vmtx,0); + } + + at->gi.maxp->numGlyphs = cnt; +} + +static int dumptype2glyphs(SplineFont *sf,struct alltabs *at) { + int i; + struct pschars *subrs; + + at->cfff = tmpfile(); + at->sidf = tmpfile(); + at->sidh = tmpfile(); + at->charset = tmpfile(); + at->encoding = tmpfile(); + at->private = tmpfile(); + + dumpcffheader(sf,at->cfff); + dumpcffnames(sf,at->cfff); + dumpcffcharset(sf,at); + GProgressChangeStages(2+at->gi.strikecnt); + if ((subrs = SplineFont2Subrs2(sf,at->gi.flags))==NULL ) +return( false ); + dumpcffprivate(sf,at,-1,subrs->next); + if ( subrs->next!=0 ) + _dumpcffstrings(at->private,subrs); + GProgressNextStage(); + at->charstrings = dumpcffstrings(SplineFont2Chrs2(sf,at->nomwid,at->defwid,subrs,at->gi.flags)); + PSCharsFree(subrs); + if ( at->charstrings == NULL ) +return( false ); + if ( at->format==ff_cff && sf->encoding_name!=em_adobestandard ) + dumpcffencoding(sf,at); /* Do this after we've assigned glyph ids */ + dumpcfftopdict(sf,at); + finishup(sf,at); + + at->cfflen = ftell(at->cfff); + if ( at->cfflen&3 ) { + for ( i=4-(at->cfflen&3); i>0; --i ) + putc('\0',at->cfff); + } + + if ( at->format!=ff_cff ) + dumpcffhmtx(at,sf,false); +return( true ); +} + +static int dumpcidglyphs(SplineFont *sf,struct alltabs *at) { + int i; + + at->cfff = tmpfile(); + at->sidf = tmpfile(); + at->sidh = tmpfile(); + at->charset = tmpfile(); + at->fdselect = tmpfile(); + at->fdarray = tmpfile(); + + at->fds = gcalloc(sf->subfontcnt,sizeof(struct fd2data)); + for ( i=0; isubfontcnt; ++i ) { + at->fds[i].private = tmpfile(); + if ( (at->fds[i].subrs = SplineFont2Subrs2(sf->subfonts[i],at->gi.flags))==NULL ) +return( false ); + dumpcffprivate(sf->subfonts[i],at,i,at->fds[i].subrs->next); + if ( at->fds[i].subrs->next!=0 ) + _dumpcffstrings(at->fds[i].private,at->fds[i].subrs); + } + + dumpcffheader(sf,at->cfff); + dumpcffnames(sf,at->cfff); + dumpcffcidset(sf,at); + dumpcfffdselect(sf,at); + dumpcffdictindex(sf,at); + if ( (at->charstrings = dumpcffstrings(CID2Chrs2(sf,at->fds,at->gi.flags)))==NULL ) +return( false ); + for ( i=0; isubfontcnt; ++i ) + PSCharsFree(at->fds[i].subrs); + dumpcffcidtopdict(sf,at); + finishupcid(sf,at); + + at->cfflen = ftell(at->cfff); + if ( at->cfflen&3 ) { + for ( i=4-(at->cfflen&3); i>0; --i ) + putc('\0',at->cfff); + } + + if ( at->format!=ff_cffcid ) + dumpcffcidhmtx(at,sf); +return( true ); +} + +static int AnyWidthMDs(SplineFont *sf) { + int i; + MinimumDistance *md; + + if ( sf->subfontcnt!=0 ) { + for ( i=0; isubfontcnt; ++i ) + if ( AnyWidthMDs(sf->subfonts[i])) +return( true ); + } else { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( md=sf->chars[i]->md; md!=NULL; md = md->next ) + if ( md->sp2==NULL ) +return( true ); + } + } +return( false ); +} + +static void sethead(struct head *head,SplineFont *_sf) { + time_t now; + uint32 now1904[4]; + uint32 year[2]; + int i, lr, rl, j; + SplineFont *sf = _sf; + + head->version = 0x00010000; + if ( _sf->subfontcnt!=0 ) { + int val, mant; + val = floor(_sf->cidversion); + mant = floor(65536.*(_sf->cidversion-val)); + head->revision = (val<<16) | mant; + } else if ( _sf->version!=NULL ) { + char *pt=_sf->version; + double dval; + int val, mant; + while ( *pt && !isdigit(*pt) && *pt!='.' ) ++pt; + if ( *pt ) { + dval = strtod(pt,NULL); + val = floor(dval); + mant = floor(65536.*(dval-val)); + head->revision = (val<<16) | mant; + } + } + head->checksumAdj = 0; + head->magicNum = 0x5f0f3cf5; + head->flags = 3; + if ( AnyWidthMDs(_sf)) + head->flags = 0x13; /* baseline at 0, lsbline at 0, instructions change metrics */ + head->emunits = sf->ascent+sf->descent; + head->macstyle = MacStyleCode(sf,NULL); + head->lowestreadable = 8; + head->locais32 = 1; + lr = rl = 0; + j = 0; + do { + sf = ( _sf->subfontcnt==0 ) ? _sf : _sf->subfonts[j]; + for ( i=0; icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) ) { + int uni = sf->chars[i]->unicodeenc ; + if ( SCRightToLeft(sf->chars[i]) ) + rl = 1; + else if (( uni!=-1 && uni<0x10000 && islefttoright(uni)) || + (uni>=0x10300 && uni<0x107ff)) + lr = 1; + } + } + ++j; + } while ( j<_sf->subfontcnt ); + sf = _sf; + /* I assume we've always got some neutrals (spaces, punctuation) */ + if ( lr && rl ) + head->dirhint = 0; + else if ( rl ) + head->dirhint = -2; + else + head->dirhint = 2; + if ( rl ) + head->flags |= (1<<9); /* Apple documents this */ + /* if there are any indic characters, set bit 10 */ + + time(&now); /* seconds since 1970, need to convert to seconds since 1904 */ + now1904[0] = now1904[1] = now1904[2] = now1904[3] = 0; + year[0] = 60*60*24*365; + year[1] = year[0]>>16; year[0] &= 0xffff; + for ( i=4; i<70; ++i ) { + now1904[3] += year[0]; + now1904[2] += year[1]; + if ( (i&3)==0 ) + now1904[3] += 60*60*24; + now1904[2] += now1904[3]>>16; + now1904[3] &= 0xffff; + now1904[1] += now1904[2]>>16; + now1904[2] &= 0xffff; + } + now1904[3] += now&0xffff; + now1904[2] += now>>16; + now1904[2] += now1904[3]>>16; + now1904[3] &= 0xffff; + now1904[1] += now1904[2]>>16; + now1904[2] &= 0xffff; + head->modtime[1] = head->createtime[1] = (now1904[2]<<16)|now1904[3]; + head->modtime[0] = head->createtime[0] = (now1904[0]<<16)|now1904[1]; +} + +static void sethhead(struct hhead *hhead,struct hhead *vhead,struct alltabs *at, SplineFont *_sf) { + int i, width, rbearing, height, bbearing; + int ymax, ymin, xmax, xmin, off; + SplineFont *sf=NULL; + DBounds bb; + int j; + /* Might as well fill in the vhead even if we don't use it */ + /* we just won't dump it out if we don't want it */ + + width = 0x80000000; rbearing = 0x7fffffff; height = 0x80000000; bbearing=0x7fffffff; + xmax = ymax = 0x80000000; xmin = ymin = 0x7fffffff; + j=0; + do { + sf = ( _sf->subfontcnt==0 ) ? _sf : _sf->subfonts[j]; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i])) { /* I don't check for duplicates here. Shouldn't matter, they are duplicates, won't change things */ + SplineCharFindBounds(sf->chars[i],&bb); + if ( sf->chars[i]->width>width ) width = sf->chars[i]->width; + if ( sf->chars[i]->vwidth>height ) height = sf->chars[i]->vwidth; + if ( sf->chars[i]->width-bb.maxx < rbearing ) rbearing = sf->chars[i]->width-bb.maxx; + if ( sf->chars[i]->vwidth-bb.maxy < bbearing ) bbearing = sf->chars[i]->vwidth-bb.maxy; + if ( bb.maxy > ymax ) ymax = bb.maxy; + if ( bb.miny < ymin ) ymin = bb.miny; + if ( bb.maxx > xmax ) xmax = bb.maxx; + if ( bb.minx < xmin ) xmin = bb.minx; + } + ++j; + } while ( j<_sf->subfontcnt ); + + if ( ymax==0 && ymin==0 ) { + /* this can happen in a bitmap only font */ + ymax = sf->ascent; + ymin = -sf->descent; + } + hhead->version = 0x00010000; + hhead->ascender = ymax; + hhead->descender = ymin; + hhead->linegap = _sf->pfminfo.linegap; + + vhead->version = 0x00011000; + off = (_sf->ascent+_sf->descent)/2; + vhead->ascender = xmax-off; + vhead->descender = xmin-off; + vhead->linegap = _sf->pfminfo.linegap; + + at->isfixed = at->gi.fixed_width!=-1; + hhead->maxwidth = width; + hhead->minlsb = at->head.xmin; + hhead->minrsb = rbearing; + /* Apple's ftxvalidator says the the min sidebearing should be 0 even if it isn't */ + if ( hhead->minlsb>0 ) hhead->minlsb = 0; + if ( hhead->minrsb>0 ) hhead->minrsb = 0; + hhead->maxextent = at->head.xmax; + hhead->caretSlopeRise = 1; + + vhead->maxwidth = height; + vhead->minlsb = at->head.ymin; + vhead->minrsb = bbearing; + vhead->maxextent = at->head.ymax; + vhead->caretSlopeRise = 1; + + hhead->numMetrics = at->gi.hfullcnt; + vhead->numMetrics = at->gi.vfullcnt; +} + +static void setvorg(struct vorg *vorg, SplineFont *sf) { + vorg->majorVersion = 1; + vorg->minorVersion = 0; + vorg->defaultVertOriginY = sf->vertical_origin; + vorg->numVertOriginYMetrics = 0; +} + +static void OS2WeightCheck(struct pfminfo *pfminfo,char *weight) { + if ( weight==NULL ) { + /* default it */ + } else if ( strstrmatch(weight,"medi")!=NULL ) { + pfminfo->weight = 500; + pfminfo->panose[2] = 6; + } else if ( strstrmatch(weight,"demi")!=NULL || + strstrmatch(weight,"halb")!=NULL || + (strstrmatch(weight,"semi")!=NULL && + strstrmatch(weight,"bold")!=NULL) ) { + pfminfo->weight = 600; + pfminfo->panose[2] = 7; + } else if ( strstrmatch(weight,"bold")!=NULL || + strstrmatch(weight,"fett")!=NULL || + strstrmatch(weight,"gras")!=NULL ) { + pfminfo->weight = 700; + pfminfo->panose[2] = 8; + } else if ( strstrmatch(weight,"heavy")!=NULL ) { + pfminfo->weight = 800; + pfminfo->panose[2] = 9; + } else if ( strstrmatch(weight,"black")!=NULL ) { + pfminfo->weight = 900; + pfminfo->panose[2] = 10; + } else if ( strstrmatch(weight,"nord")!=NULL ) { + pfminfo->weight = 950; + pfminfo->panose[2] = 11; + } else if ( strstrmatch(weight,"thin")!=NULL ) { + pfminfo->weight = 100; + pfminfo->panose[2] = 2; + } else if ( strstrmatch(weight,"extra")!=NULL || + strstrmatch(weight,"light")!=NULL ) { + pfminfo->weight = 200; + pfminfo->panose[2] = 3; + } else if ( strstrmatch(weight,"light")!=NULL ) { + pfminfo->weight = 300; + pfminfo->panose[2] = 4; + } +} + +void SFDefaultOS2Simple(struct pfminfo *pfminfo,SplineFont *sf) { + pfminfo->pfmfamily = 0x11; + pfminfo->panose[0] = 2; + pfminfo->weight = 400; + pfminfo->panose[2] = 5; + pfminfo->width = 5; + pfminfo->panose[3] = 3; + + if ( sf->subfonts!=NULL ) sf = sf->subfonts[0]; + pfminfo->linegap = pfminfo->vlinegap = + rint(.09*(sf->ascent+sf->descent)); +} + +void SFDefaultOS2Info(struct pfminfo *pfminfo,SplineFont *_sf,char *fontname) { + int samewid= -1; + SplineFont *sf; + char *weight = _sf->cidmaster==NULL ? _sf->weight : _sf->cidmaster->weight; + + if ( _sf->pfminfo.pfmset ) { + if ( pfminfo!=&_sf->pfminfo ) + *pfminfo = _sf->pfminfo; + } else { + memset(pfminfo,'\0',sizeof(*pfminfo)); + SFDefaultOS2Simple(pfminfo,_sf); + samewid = CIDOneWidth(_sf); + sf = _sf; + + pfminfo->pfmfamily = 0x10; + if ( samewid>0 ) + pfminfo->pfmfamily = 0x30; + else if ( strstrmatch(fontname,"sans")!=NULL ) + pfminfo->pfmfamily = 0x20; + else if ( strstrmatch(fontname,"script")!=NULL ) { + pfminfo->pfmfamily = 0x40; + pfminfo->panose[0] = 3; + } + if ( samewid==-1 ) + pfminfo->pfmfamily |= 0x1; /* Else it assumes monospace */ + +/* urw uses 4 character abreviations */ + if ( weight!=NULL ) + OS2WeightCheck(pfminfo,weight); + OS2WeightCheck(pfminfo,fontname); + + if ( strstrmatch(fontname,"ultra")!=NULL && + strstrmatch(fontname,"condensed")!=NULL ) { + pfminfo->width = 1; + pfminfo->panose[3] = 8; + } else if ( strstrmatch(fontname,"extra")!=NULL && + strstrmatch(fontname,"condensed")!=NULL ) { + pfminfo->width = 2; + pfminfo->panose[3] = 8; + } else if ( strstrmatch(fontname,"semi")!=NULL && + strstrmatch(fontname,"condensed")!=NULL ) { + pfminfo->width = 4; + pfminfo->panose[3] = 6; + } else if ( strstrmatch(fontname,"condensed")!=NULL || + strstrmatch(fontname,"narrow")!=NULL ) { + pfminfo->width = 3; + pfminfo->panose[3] = 6; + } else if ( strstrmatch(fontname,"ultra")!=NULL && + strstrmatch(fontname,"expanded")!=NULL ) { + pfminfo->width = 9; + pfminfo->panose[3] = 7; + } else if ( strstrmatch(fontname,"extra")!=NULL && + strstrmatch(fontname,"expanded")!=NULL ) { + pfminfo->width = 8; + pfminfo->panose[3] = 7; + } else if ( strstrmatch(fontname,"semi")!=NULL && + strstrmatch(fontname,"expanded")!=NULL ) { + pfminfo->width = 6; + pfminfo->panose[3] = 5; + } else if ( strstrmatch(fontname,"expanded")!=NULL ) { + pfminfo->width = 7; + pfminfo->panose[3] = 5; + } + if ( samewid>0 ) + pfminfo->panose[3] = 9; + } +} + +void OS2FigureCodePages(SplineFont *sf, uint32 CodePage[2]) { + SplineFont *_sf; + int i, k; + + CodePage[0] = CodePage[1] = 0; + if ( sf->encoding_name==em_iso8859_1 || sf->encoding_name==em_iso8859_15 || + sf->encoding_name==em_win ) + CodePage[0] |= 1<<0; /* latin1 */ + else if ( sf->encoding_name==em_iso8859_2 ) + CodePage[0] |= 1<<1; /* latin2 */ + else if ( sf->encoding_name==em_iso8859_9 ) + CodePage[0] |= 1<<4; /* turkish */ + else if ( sf->encoding_name==em_iso8859_4 ) + CodePage[0] |= 1<<7; /* baltic */ + else if ( sf->encoding_name==em_iso8859_5 || sf->encoding_name==em_koi8_r ) + CodePage[0] |= 1<<2; /* cyrillic */ + else if ( sf->encoding_name==em_iso8859_7 ) + CodePage[0] |= 1<<3; /* greek */ + else if ( sf->encoding_name==em_iso8859_8 ) + CodePage[0] |= 1<<5; /* hebrew */ + else if ( sf->encoding_name==em_iso8859_6 ) + CodePage[0] |= 1<<6; /* arabic */ + else if ( sf->encoding_name==em_iso8859_11 ) + CodePage[0] |= 1<<16; /* thai */ + else if ( sf->encoding_name==em_jis201 || sf->encoding_name==em_jis208 || + sf->encoding_name==em_jis212 || sf->encoding_name==em_sjis ) + CodePage[0] |= 1<<17; /* japanese */ + else if ( sf->encoding_name==em_gb2312 || sf->encoding_name==em_jisgb ) + CodePage[0] |= 1<<18; /* simplified chinese */ + else if ( sf->encoding_name==em_ksc5601 || sf->encoding_name==em_wansung ) + CodePage[0] |= 1<<19; /* korean wansung */ + else if ( sf->encoding_name==em_big5 || sf->encoding_name==em_big5hkscs ) + CodePage[0] |= 1<<20; /* traditional chinese */ + else if ( sf->encoding_name==em_johab ) + CodePage[0] |= 1<<21; /* korean johab */ + else if ( sf->encoding_name==em_mac ) + CodePage[0] |= 1<<29; /* mac */ + else if ( sf->encoding_name==em_symbol ) + CodePage[0] |= 1<<31; /* symbol */ + + k=0; _sf = sf; + do { + sf = ( _sf->subfontcnt==0 ) ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]->unicodeenc=='A' ) + CodePage[1] |= 1<<31; /* US (Ascii I assume) */ + else if ( sf->chars[i]->unicodeenc==0xde ) { + CodePage[0] |= 1<<0; /* latin1 */ + CodePage[1] |= 1<<30; /* WE/Latin1 */ + } else if ( sf->chars[i]->unicodeenc==0xc3 ) + CodePage[1] |= 1<<18; /* MS-DOS Nordic */ + else if ( sf->chars[i]->unicodeenc==0xe9 ) + CodePage[1] |= 1<<20; /* MS-DOS Canadian French */ + else if ( sf->chars[i]->unicodeenc==0xf5 ) + CodePage[1] |= 1<<23; /* MS-DOS Portuguese */ + else if ( sf->chars[i]->unicodeenc==0xfe ) + CodePage[1] |= 1<<22; /* MS-DOS Icelandic */ + else if ( sf->chars[i]->unicodeenc==0x13d ) { + CodePage[0] |= 1<<1; /* latin2 */ + CodePage[1] |= 1<<26; /* latin2 */ + } else if ( sf->chars[i]->unicodeenc==0x411 ) { + CodePage[0] |= 1<<2; /* cyrillic */ + CodePage[1] |= 1<<17; /* MS DOS Russian */ + CodePage[1] |= 1<<25; /* IBM Cyrillic */ + } else if ( sf->chars[i]->unicodeenc==0x386 ) { + CodePage[0] |= 1<<3; /* greek */ + CodePage[1] |= 1<<16; /* IBM Greek */ + CodePage[1] |= 1<<28; /* Greek, former 437 G */ + } else if ( sf->chars[i]->unicodeenc==0x130 ) { + CodePage[0] |= 1<<4; /* turkish */ + CodePage[1] |= 1<<24; /* IBM turkish */ + } else if ( sf->chars[i]->unicodeenc==0x5d0 ) { + CodePage[0] |= 1<<5; /* hebrew */ + CodePage[1] |= 1<<21; /* hebrew */ + } else if ( sf->chars[i]->unicodeenc==0x631 ) { + CodePage[0] |= 1<<6; /* arabic */ + CodePage[1] |= 1<<19; /* arabic */ + CodePage[1] |= 1<<29; /* arabic; ASMO 708 */ + } else if ( sf->chars[i]->unicodeenc==0x157 ) { + CodePage[0] |= 1<<7; /* baltic */ + CodePage[1] |= 1<<27; /* baltic */ + } else if ( sf->chars[i]->unicodeenc==0xe45 ) + CodePage[0] |= 1<<16; /* thai */ + else if ( sf->chars[i]->unicodeenc==0x30a8 ) + CodePage[0] |= 1<<17; /* japanese */ + else if ( sf->chars[i]->unicodeenc==0x3105 ) + CodePage[0] |= 1<<18; /* simplified chinese */ + else if ( sf->chars[i]->unicodeenc==0x3131 ) + CodePage[0] |= 1<<19; /* korean wansung */ + else if ( sf->chars[i]->unicodeenc==0xacf4 ) + CodePage[0] |= 1<<21; /* korean Johab */ + else if ( sf->chars[i]->unicodeenc==0x21d4 ) + CodePage[0] |= 1<<31; /* symbol */ + } + ++k; + } while ( k<_sf->subfontcnt ); + + if ( CodePage[0]==0 ) + CodePage[0] |= 1; +} + +static void WinBB(SplineFont *_sf,uint16 *winascent,uint16 *windescent,struct alltabs *at) { + /* The windows ascent/descent is calculated on the ymin/max of the */ + /* glyphs in the so called ANSI character set. I'm going to pretend */ + /* that's Latin1 with a few additions */ + int i,k; + int first = true; + DBounds b, c; + + if ( _sf->cidmaster!=NULL ) + _sf = _sf->cidmaster; + if ( _sf->subfontcnt==0 ) { + for ( i=0; i<_sf->charcnt; ++i ) if ( SCWorthOutputting(_sf->chars[i]) ) { + SplineChar *sc = _sf->chars[i]; + int uni = sc->unicodeenc; + if ( uni < 0x100 || uni == 0x20ac || uni == 0x192 || uni==0x2020 || + uni == 0x160 || uni == 0x160 || uni==0x178 ) { + SplineCharQuickBounds(sc,&c); + if ( first ) { + b = c; + first = false; + } else { + if ( c.minyb.maxy ) c.maxy = b.maxy; + } + } + } + } else { + for ( k=0; k<_sf->subfontcnt; ++i ) { + SplineFont *sf = _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i])) { + int uni = sf->chars[i]->unicodeenc; + if ( uni < 0x100 || uni == 0x20ac || uni == 0x192 || uni==0x2020 || + uni == 0x160 || uni == 0x160 || uni==0x178 ) { + SplineCharQuickBounds(sf->chars[i],&c); + if ( first ) { + b = c; + first = false; + } else { + if ( c.minyb.maxy ) c.maxy = b.maxy; + } + } + } + } + } + if ( first ) { /* No characters in range */ + *winascent = at->head.ymax; + *windescent = -at->head.ymin; /* Should be positive */ + } else { + *winascent = rint(c.maxy); + *windescent = -rint(c.miny); /* Should be positive */ + } +} + +static void setos2(struct os2 *os2,struct alltabs *at, SplineFont *_sf, + enum fontformat format) { + int i,j,cnt1,cnt2,first,last,avg1,avg2,k; + SplineFont *sf = _sf; + char *pt; + + os2->version = 1; + os2->weightClass = sf->pfminfo.weight; + os2->widthClass = sf->pfminfo.width; + os2->fstype = 0x8; + if ( sf->pfminfo.fstype!=-1 ) + os2->fstype = sf->pfminfo.fstype; + os2->ysupYSize = os2->ysubYSize = .7*(sf->ascent+sf->descent); + os2->ysupXSize = os2->ysubXSize = .65*(sf->ascent+sf->descent); + os2->ysubYOff = .14*(sf->ascent+sf->descent); + os2->ysubXOff = os2->ysupXOff = 0; + os2->ysupYOff = .48*(sf->ascent+sf->descent); + os2->yStrikeoutSize = 102*(sf->ascent+sf->descent)/2048; + os2->yStrikeoutPos = 530*(sf->ascent+sf->descent)/2048; + os2->fsSel = (at->head.macstyle&1?32:0)|(at->head.macstyle&2?1:0); + if ( sf->fullname!=NULL && strstrmatch(sf->fullname,"outline")!=NULL ) + os2->fsSel |= 8; + if ( os2->fsSel==0 ) os2->fsSel = 64; /* Regular */ + if ( sf->pfminfo.os2_typoascent!=0 ) { + os2->ascender = sf->pfminfo.os2_typoascent; + os2->descender = sf->pfminfo.os2_typodescent; + } else { +/* David Lemon @Adobe.COM +1) The sTypoAscender and sTypoDescender values should sum to 2048 in +a 2048-unit font. They indicate the position of the em square +relative to the baseline. +GWW: Nope, sTypoAscender-sTypoDescender == EmSize + +2) The usWinAscent and usWinDescent values represent the maximum +height and depth of specific glyphs within the font, and some +applications will treat them as the top and bottom of the font +bounding box. (the "ANSI" glyphs) +*/ + os2->ascender = sf->ascent; + os2->descender = -sf->descent; /* Should be neg */ + } + WinBB(sf,&os2->winascent,&os2->windescent,at); + os2->linegap = sf->pfminfo.linegap; + + avg1 = avg2 = last = 0; first = 0x10000; + cnt1 = cnt2 = 0; + k = 0; + do { + sf = ( _sf->subfontcnt==0 ) ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) { + if ( SCWorthOutputting(sf->chars[i]) && + !SCIsNotdef(sf->chars[i],-1) && + sf->chars[i]->unicodeenc!=-1 ) { + if ( sf->chars[i]->unicodeenc > 0xffff ) + os2->unicoderange[57>>5] |= (1<<(57&31)); + for ( j=0; jchars[i]->unicodeenc>=uniranges[j][0] && + sf->chars[i]->unicodeenc<=uniranges[j][1] ) { + int bit = uniranges[j][2]; + os2->unicoderange[bit>>5] |= (1<<(bit&31)); + break; + } + if ( sf->chars[i]->unicodeencchars[i]->unicodeenc; + if ( sf->chars[i]->unicodeenc>last ) last = sf->chars[i]->unicodeenc; + if ( sf->chars[i]->width!=0 ) { + avg2 += sf->chars[i]->width; ++cnt2; + } + if ( sf->chars[i]->unicodeenc==' ' || + (sf->chars[i]->unicodeenc>='a' && sf->chars[i]->unicodeenc<='z')) { + avg1 += sf->chars[i]->width; ++cnt1; + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + if ( format==ff_ttfsym ) /* MS Symbol font has this set to zero. Does it matter? */ + memset(os2->unicoderange,0,sizeof(os2->unicoderange)); + sf = _sf; + + if ( TTFFoundry!=NULL ) + strncpy(os2->achVendID,TTFFoundry,4); + else + memcpy(os2->achVendID,"PfEd",4); + for ( pt=os2->achVendID; ptachVendID && *pt!='\0'; ++pt ); + while ( ptachVendID ) *pt++ = ' '; /* Pad with spaces not NUL */ + + os2->avgCharWid = 500; + /*if ( cnt1==27 ) + os2->avgCharWid = avg1/cnt1; + else*/ if ( cnt2!=0 ) + os2->avgCharWid = avg2/cnt2; + memcpy(os2->panose,sf->pfminfo.panose,sizeof(os2->panose)); + if ( format==ff_ttfsym ) { + os2->ulCodePage[0] = 0x80000000; + os2->ulCodePage[1] = 0; + first = 255; last = 0; + if ( sf->chars!=NULL && SCWorthOutputting(sf->chars[0]) && + sf->chars[0]->ttf_glyph!=-1 && + !SCIsNotdef(sf->chars[0],at->gi.fixed_width) ) + first = 0; + for ( i=1; icharcnt && i<255; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + if ( ilast ) last = i; + } + os2->firstcharindex = 0xf000 + first; + os2->lastcharindex = 0xf000 + last; + } else { + os2->firstcharindex = first; + os2->lastcharindex = last; + OS2FigureCodePages(sf, os2->ulCodePage); + if ( os2->ulCodePage[0]==0 ) + os2->ulCodePage[0] |= 1; + } + + if ( format==ff_otf || format==ff_otfcid ) { + BlueData bd; + + QuickBlues(sf,&bd); /* This handles cid fonts properly */ + os2->version = 2; /* current version is 3, I don't see how it differs from 2 */ + os2->xHeight = bd.xheight; + os2->capHeight = bd.caph; + os2->defChar = ' '; + os2->breakChar = ' '; + os2->maxContext = 1; /* Kerning will set this to 2, ligature to whatever */ + } +} + +static void redoloca(struct alltabs *at) { + int i; + + at->loca = tmpfile(); + if ( at->head.locais32 ) { + for ( i=0; i<=at->maxp.numGlyphs; ++i ) + putlong(at->loca,at->gi.loca[i]); + at->localen = sizeof(int32)*(at->maxp.numGlyphs+1); + } else { + for ( i=0; i<=at->maxp.numGlyphs; ++i ) + putshort(at->loca,at->gi.loca[i]/2); + at->localen = sizeof(int16)*(at->maxp.numGlyphs+1); + if ( ftell(at->loca)&2 ) + putshort(at->loca,0); + } + free(at->gi.loca); +} + +static void dummyloca(struct alltabs *at) { + + at->loca = tmpfile(); + if ( at->head.locais32 ) { + putlong(at->loca,0); + at->localen = sizeof(int32); + } else { + putshort(at->loca,0); + at->localen = sizeof(int16); + putshort(at->loca,0); /* pad it */ + } +} + +static void redohead(struct alltabs *at) { + at->headf = tmpfile(); + + putlong(at->headf,at->head.version); + putlong(at->headf,at->head.revision); + putlong(at->headf,at->head.checksumAdj); + putlong(at->headf,at->head.magicNum); + putshort(at->headf,at->head.flags); + putshort(at->headf,at->head.emunits); + putlong(at->headf,at->head.createtime[0]); + putlong(at->headf,at->head.createtime[1]); + putlong(at->headf,at->head.modtime[0]); + putlong(at->headf,at->head.modtime[1]); + putshort(at->headf,at->head.xmin); + putshort(at->headf,at->head.ymin); + putshort(at->headf,at->head.xmax); + putshort(at->headf,at->head.ymax); + putshort(at->headf,at->head.macstyle); + putshort(at->headf,at->head.lowestreadable); + putshort(at->headf,at->head.dirhint); + putshort(at->headf,at->head.locais32); + putshort(at->headf,at->head.glyphformat); + + at->headlen = ftell(at->headf); + if ( (at->headlen&2)!=0 ) + putshort(at->headf,0); +} + +static void redohhead(struct alltabs *at,int isv) { + int i; + struct hhead *head; + FILE *f; + + if ( !isv ) { + f = at->hheadf = tmpfile(); + head = &at->hhead; + } else { + f = at->vheadf = tmpfile(); + head = &at->vhead; + } + + putlong(f,head->version); + putshort(f,head->ascender); + putshort(f,head->descender); + putshort(f,head->linegap); + putshort(f,head->maxwidth); + putshort(f,head->minlsb); + putshort(f,head->minrsb); + putshort(f,head->maxextent); + putshort(f,head->caretSlopeRise); + putshort(f,head->caretSlopeRun); + for ( i=0; i<5; ++i ) + putshort(f,head->mbz[i]); + putshort(f,head->metricformat); + putshort(f,head->numMetrics); + + if ( !isv ) { + at->hheadlen = ftell(f); + if ( (at->hheadlen&2)!=0 ) + putshort(f,0); + } else { + at->vheadlen = ftell(f); + if ( (at->vheadlen&2)!=0 ) + putshort(f,0); + } +} + +static void redovorg(struct alltabs *at) { + + at->vorgf = tmpfile(); + putshort(at->vorgf,at->vorg.majorVersion); + putshort(at->vorgf,at->vorg.minorVersion); + putshort(at->vorgf,at->vorg.defaultVertOriginY); + putshort(at->vorgf,at->vorg.numVertOriginYMetrics); + + at->vorglen = ftell(at->vorgf); + if ( (at->vorglen&2)!=0 ) + putshort(at->vorgf,0); +} + +static void redomaxp(struct alltabs *at,enum fontformat format) { + at->maxpf = tmpfile(); + + putlong(at->maxpf,at->maxp.version); + putshort(at->maxpf,at->maxp.numGlyphs); + if ( format!=ff_otf && format!=ff_otfcid ) { + putshort(at->maxpf,at->maxp.maxPoints); + putshort(at->maxpf,at->maxp.maxContours); + putshort(at->maxpf,at->maxp.maxCompositPts); + putshort(at->maxpf,at->maxp.maxCompositCtrs); + putshort(at->maxpf,at->maxp.maxZones); + putshort(at->maxpf,at->maxp.maxTwilightPts); + putshort(at->maxpf,at->maxp.maxStorage); + putshort(at->maxpf,at->maxp.maxFDEFs); + putshort(at->maxpf,at->maxp.maxIDEFs); + putshort(at->maxpf,at->maxp.maxStack); + putshort(at->maxpf,at->maxp.maxglyphInstr); + putshort(at->maxpf,at->maxp.maxnumcomponents); + putshort(at->maxpf,at->maxp.maxcomponentdepth); + } + + at->maxplen = ftell(at->maxpf); + if ( (at->maxplen&2)!=0 ) + putshort(at->maxpf,0); +} + +static void redoos2(struct alltabs *at) { + int i; + at->os2f = tmpfile(); + + putshort(at->os2f,at->os2.version); + putshort(at->os2f,at->os2.avgCharWid); + putshort(at->os2f,at->os2.weightClass); + putshort(at->os2f,at->os2.widthClass); + putshort(at->os2f,at->os2.fstype); + putshort(at->os2f,at->os2.ysubXSize); + putshort(at->os2f,at->os2.ysubYSize); + putshort(at->os2f,at->os2.ysubXOff); + putshort(at->os2f,at->os2.ysubYOff); + putshort(at->os2f,at->os2.ysupXSize); + putshort(at->os2f,at->os2.ysupYSize); + putshort(at->os2f,at->os2.ysupXOff); + putshort(at->os2f,at->os2.ysupYOff); + putshort(at->os2f,at->os2.yStrikeoutSize); + putshort(at->os2f,at->os2.yStrikeoutPos); + putshort(at->os2f,at->os2.sFamilyClass); + for ( i=0; i<10; ++i ) + putc(at->os2.panose[i],at->os2f); + for ( i=0; i<4; ++i ) + putlong(at->os2f,at->os2.unicoderange[i]); + for ( i=0; i<4; ++i ) + putc(at->os2.achVendID[i],at->os2f); + putshort(at->os2f,at->os2.fsSel); + putshort(at->os2f,at->os2.firstcharindex); + putshort(at->os2f,at->os2.lastcharindex); + putshort(at->os2f,at->os2.ascender); + putshort(at->os2f,at->os2.descender); + putshort(at->os2f,at->os2.linegap); + putshort(at->os2f,at->os2.winascent); + putshort(at->os2f,at->os2.windescent); + putlong(at->os2f,at->os2.ulCodePage[0]); + putlong(at->os2f,at->os2.ulCodePage[1]); + + if ( at->os2.version>=2 ) { + putshort(at->os2f,at->os2.xHeight); + putshort(at->os2f,at->os2.capHeight); + putshort(at->os2f,at->os2.defChar); + putshort(at->os2f,at->os2.breakChar); + putshort(at->os2f,at->os2.maxContext); + } + + at->os2len = ftell(at->os2f); + if ( (at->os2len&2)!=0 ) + putshort(at->os2f,0); +} + +static void dumpgasp(struct alltabs *at) { + + at->gaspf = tmpfile(); + putshort(at->gaspf,0); /* Version number */ + putshort(at->gaspf,1); /* One range */ + putshort(at->gaspf,0xffff); /* Upper bound on pixels/em for this range */ + putshort(at->gaspf,0x2); /* Grey scale, no gridfitting */ + /* No hints, so no grids to fit */ + at->gasplen = ftell(at->gaspf); + /* This table is always 32 bit aligned */ +} + +static void dumpmacstr(FILE *file,unichar_t *str) { + int ch; + unsigned char *table; + + do { + ch = *str++; + if ( ch==0 ) + putc('\0',file); + else if ( (ch>>8)>=mac_from_unicode.first && (ch>>8)<=mac_from_unicode.last && + (table = mac_from_unicode.table[(ch>>8)-mac_from_unicode.first])!=NULL && + table[ch&0xff]!=0 ) + putc(table[ch&0xff],file); + else + putc('?',file); /* if we were to omit an unencoded char all our position calculations would be off */ + } while ( ch!='\0' ); +} + +static void dumpstr(FILE *file,char *str) { + do { + putc(*str,file); + } while ( *str++!='\0' ); +} + +#if 0 +static void dumpc2ustr(FILE *file,char *str) { + do { + putc('\0',file); + putc(*str,file); + } while ( *str++!='\0' ); +} +#endif + +static void dumpustr(FILE *file,unichar_t *str) { + do { + putc(*str>>8,file); + putc(*str&0xff,file); + } while ( *str++!='\0' ); +} + +static void dumppstr(FILE *file,char *str) { + putc(strlen(str),file); + fwrite(str,sizeof(char),strlen(str),file); +} + +#if 0 +/* Languages on the mac presumably imply an encoding, but that encoding is not*/ +/* listed in the language table in the name table docs. I think it is safe to*/ +/* guess that these first 10 languages all use the MacRoman encoding that */ +/* is designed for western europe. I could handle that... */ +/* The complexities of locale (british vs american english) don't seem to be */ +/* present on the mac */ +/* I don't think I'll make use of this table for the mac though... */ +static struct { int mslang, maclang, enc, used; } mactrans[] = { + { 0x09, 0, em_mac }, /* English */ + { 0x0c, 1, em_mac }, /* French */ + { 0x07, 2, em_mac }, /* German */ + { 0x10, 3, em_mac }, /* Italian */ + { 0x13, 4, em_mac }, /* Dutch */ + { 0x1d, 5, em_mac }, /* Swedish */ + { 0x0a, 6, em_mac }, /* Spanish */ + { 0x06, 7, em_mac }, /* Danish */ + { 0x16, 8, em_mac }, /* Portuguese */ + { 0x14, 9, em_mac }, /* Norwegian */ + { 0 }}; +#endif + +/* Oh. If the encoding is symbol (platform=3, specific=0) then Windows won't */ +/* accept the font unless the name table also has entries for (3,0). I'm not */ +/* sure if this is the case for the CJK encodings (docs don't mention that) */ +/* but let's do it just in case */ +void DefaultTTFEnglishNames(struct ttflangname *dummy, SplineFont *sf) { + time_t now; + struct tm *tm; + char buffer[200]; + + if ( dummy->names[ttf_copyright]==NULL || *dummy->names[ttf_copyright]=='\0' ) + dummy->names[ttf_copyright] = uc_copy(sf->copyright); + if ( dummy->names[ttf_family]==NULL || *dummy->names[ttf_family]=='\0' ) + dummy->names[ttf_family] = uc_copy(sf->familyname); + if ( dummy->names[ttf_subfamily]==NULL || *dummy->names[ttf_subfamily]=='\0' ) + dummy->names[ttf_subfamily] = uc_copy(SFGetModifiers(sf)); + if ( dummy->names[ttf_uniqueid]==NULL || *dummy->names[ttf_uniqueid]=='\0' ) { + time(&now); + tm = localtime(&now); + sprintf( buffer, "%s : %s : %d-%d-%d", + BDFFoundry?BDFFoundry:TTFFoundry?TTFFoundry:"FontForge 1.0", + sf->fullname!=NULL?sf->fullname:sf->fontname, + tm->tm_mday, tm->tm_mon, tm->tm_year+1900 ); + dummy->names[ttf_uniqueid] = uc_copy(buffer); + } + if ( dummy->names[ttf_fullname]==NULL || *dummy->names[ttf_fullname]=='\0' ) + dummy->names[ttf_fullname] = uc_copy(sf->fullname); + if ( dummy->names[ttf_version]==NULL || *dummy->names[ttf_version]=='\0' ) { + if ( sf->subfontcnt!=0 ) + sprintf( buffer, "Version %f ", sf->cidversion ); + else if ( sf->version!=NULL ) + sprintf(buffer,"Version %.20s ", sf->version); + else + strcpy(buffer,"Version 1.0" ); + dummy->names[ttf_version] = uc_copy(buffer); + } + if ( dummy->names[ttf_postscriptname]==NULL || *dummy->names[ttf_postscriptname]=='\0' ) + dummy->names[ttf_postscriptname] = uc_copy(sf->fontname); +} + +struct macname2 { + uint16 enc; /* Platform specific encoding. 0=>mac roman, 1=>sjis, 7=>russian */ + uint16 lang; /* Mac languages 0=>english, 1=>french, 2=>german */ + uint16 strid; + char *name; /* Not a unicode string, uninterpreted mac encoded string */ +}; + +static int compmacname(const void *_mn1, const void *_mn2) { + const struct macname2 *mn1 = _mn1, *mn2 = _mn2; + + if ( mn1->enc!=mn2->enc ) +return( mn1->enc - mn2->enc ); + if ( mn1->lang!=mn2->lang ) +return( mn1->lang - mn2->lang ); + +return( mn1->strid-mn2->strid ); +} + +static int ATOrderFeatures(struct alltabs *at) { + int i, cnt; + struct macname *mn, *smn; + + for ( i=cnt=0; at->feat_name[i].strid!=0; ++i ) { + for ( mn=at->feat_name[i].mn; mn!=NULL; mn=mn->next ) + ++cnt; + for ( mn=at->feat_name[i].smn; mn!=NULL; mn=mn->next ) + ++cnt; + } + at->ordered_feat = galloc((cnt+1)*sizeof(struct macname2)); + for ( i=cnt=0; at->feat_name[i].strid!=0; ++i ) { + for ( mn=at->feat_name[i].mn; mn!=NULL; mn=mn->next ) { + at->ordered_feat[cnt].enc = mn->enc; + at->ordered_feat[cnt].lang = mn->lang; + at->ordered_feat[cnt].strid = at->feat_name[i].strid; + at->ordered_feat[cnt++].name = mn->name; + } + for ( smn=at->feat_name[i].smn; smn!=NULL; smn=smn->next ) { + for ( mn=at->feat_name[i].mn; mn!=NULL; mn=mn->next ) { + if ( smn->enc == mn->enc && smn->lang==mn->lang ) + break; + } + if ( mn!=NULL ) + continue; + at->ordered_feat[cnt].enc = smn->enc; + at->ordered_feat[cnt].lang = smn->lang; + at->ordered_feat[cnt].strid = at->feat_name[i].strid; + at->ordered_feat[cnt++].name = smn->name; + } + } + memset(&at->ordered_feat[cnt],0,sizeof(struct macname2)); + qsort(at->ordered_feat,cnt,sizeof(struct macname2),compmacname); +return( cnt ); +} + +/* There's an inconsistancy here. Apple's docs say there most be only one */ +/* nameid==6 and that name must be ascii (presumably plat=1, spec=0, lang=0) */ +/* The opentype docs say there must be two (psl=1,0,0 & psl=3,1,0x409) any */ +/* others are to be ignored */ +/* A representative from Apple says they will change their spec to accept */ +/* the opentype version */ +/* If we are generating both ot and apple then set as per apple, I think apple */ +/* fails to load the font if their conventions aren't followed, but I don't */ +/* think windows does */ +/* Undocumented fact: Windows insists on having a UniqueID string 3,1 */ +static void dumpnames(struct alltabs *at, SplineFont *sf,enum fontformat format) { + int pos=0,i,j,feat_pos; + struct ttflangname dummy, *cur, *useng; + int strcnt=0, cnt=0; + int posses[ttf_namemax]; + int maxlen, len, enc, specific, macenc; + char *space; + int extra=0, lang; + char *temp; + + if ( sf->encoding_name==em_ksc5601 || sf->encoding_name==em_wansung || + sf->encoding_name==em_jis208 || sf->encoding_name==em_sjis || + sf->encoding_name==em_big5 || sf->encoding_name==em_big5hkscs || + sf->encoding_name==em_johab || + sf->encoding_name==em_jisgb || sf->encoding_name==em_gb2312 || + format == ff_ttfsym ) + extra = 1; + memset(&dummy,'\0',sizeof(dummy)); + useng = NULL; + for ( cur=sf->names; cur!=NULL; cur=cur->next ) { + if ( cur->lang!=0x409 ) { + for ( i=0; inames[i]!=NULL ) { + strcnt += extra+1; + if ( at->applemode && CanEncodingWinLangAsMac(cur->lang)) + ++strcnt; + } + } else { + dummy = *cur; + useng = cur; + } + } + DefaultTTFEnglishNames(&dummy, sf); + for ( i=0; iapplemode ) ++strcnt; /* Apple insists there only be 1 */ + else strcnt+=3+extra; + } + /* once of mac roman encoding, once for mac unicode and once for windows unicode 409 */ + + /* The examples I've seen of the feature table only contain platform==mac */ + /* so I'm not including apple unicode */ + if ( at->feat_name!=NULL ) + strcnt += ATOrderFeatures(at); + + at->name = tmpfile(); + putshort(at->name,0); /* format */ + putshort(at->name,strcnt); /* numrec */ + putshort(at->name,(3+strcnt*6)*sizeof(int16)); /* offset to strings */ + for ( i=0; iapplemode ) + /* No output, but increment the string table point none the less */ + pos += 2*u_strlen(dummy.names[i])+2; + else { + putshort(at->name,0); /* apple unicode */ + putshort(at->name,3); /* 3 => Unicode 2.0 semantics */ /* 0 ("default") is also a reasonable value */ + putshort(at->name,0); /* */ + putshort(at->name,i); + putshort(at->name,2*u_strlen(dummy.names[i])); + putshort(at->name,pos); + posses[i] = pos; + pos += 2*u_strlen(dummy.names[i])+2; + ++cnt; + } + } + for ( i=0; iname,1); /* apple */ + putshort(at->name,0); /* Roman alphabet */ + putshort(at->name,0); /* English */ + putshort(at->name,i); + putshort(at->name,u_strlen(dummy.names[i])); + putshort(at->name,pos); + pos += u_strlen(dummy.names[i])+1; + ++cnt; + } + feat_pos = 0; + if ( at->ordered_feat!=NULL ) { + while ( at->ordered_feat[feat_pos].enc==0 && at->ordered_feat[feat_pos].lang==0 ) { + putshort(at->name,1); /* apple */ + putshort(at->name,0); /* Roman alphabet */ + putshort(at->name,0); /* English */ + putshort(at->name,at->ordered_feat[feat_pos].strid); + putshort(at->name,strlen(at->ordered_feat[feat_pos].name)); + putshort(at->name,pos); + pos += strlen(at->ordered_feat[feat_pos].name)+1; + ++feat_pos; + ++cnt; + } + } + if ( at->applemode ) { + for ( macenc=0; macenc<33; ++macenc ) { + for ( lang=1; lang<255; ++lang ) { + if ( MacEncFromMacLang(lang)==macenc ) { /* Have to order my mac language code now */ + for ( cur=sf->names; cur!=NULL; cur=cur->next ) + if ( cur->lang!=0x409 && CanEncodingWinLangAsMac(cur->lang) && + WinLangToMac(cur->lang)==lang ) { + for ( i=0; inames[i]!=NULL ) { + putshort(at->name,1); /* Apple platform */ + putshort(at->name,macenc); /* apple script */ + putshort(at->name,lang); /* apple language code */ + putshort(at->name,i); + temp = UnicodeToMacStr(cur->names[i],MacEncFromMacLang(lang),lang); + putshort(at->name,strlen(temp)); + putshort(at->name,pos); + pos += strlen(temp)+1; + free(temp); + ++cnt; + } + } + } + if ( at->ordered_feat!=NULL ) { + while ( at->ordered_feat[feat_pos].enc==macenc && at->ordered_feat[feat_pos].lang==lang ) { + putshort(at->name,1); /* apple */ + putshort(at->name,macenc); + putshort(at->name,lang); + putshort(at->name,at->ordered_feat[feat_pos].strid); + putshort(at->name,strlen(at->ordered_feat[feat_pos].name)); + putshort(at->name,pos); + pos += strlen(at->ordered_feat[feat_pos].name)+1; + ++feat_pos; + ++cnt; + } + } + } + } + } + if ( format==ff_ttfsym ) { + for ( i=0; iapplemode) ) { + putshort(at->name,3); /* MS platform */ + putshort(at->name,0); + putshort(at->name,0x0409); /* american english language */ + putshort(at->name,i); + putshort(at->name,2*u_strlen(dummy.names[i])); + putshort(at->name,posses[i]); + ++cnt; + } + + for ( cur=sf->names; cur!=NULL; cur=cur->next ) if ( cur->lang!=0x409 ) { + for ( i=0; inames[i]!=NULL ) { + putshort(at->name,3); /* MS platform */ + putshort(at->name,0); /* not symbol */ + putshort(at->name,cur->lang);/* american english language */ + putshort(at->name,i); + putshort(at->name,2*u_strlen(cur->names[i])); + putshort(at->name,pos); + pos += 2*u_strlen(cur->names[i])+2; + ++cnt; + } + } + } + + maxlen = 0; + for ( cur=sf->names; cur!=NULL; cur=cur->next ) if ( cur->lang<0x409 ) { + for ( i=0; inames[i]!=NULL ) { + putshort(at->name,3); /* MS platform */ + putshort(at->name,1); /* unicode */ + putshort(at->name,cur->lang); + putshort(at->name,i); + len = u_strlen(cur->names[i]); + if ( len>maxlen ) maxlen = len; + putshort(at->name,2*len); + putshort(at->name,pos); + pos += 2*u_strlen(cur->names[i])+2; + ++cnt; + } + } + for ( i=0; iapplemode) ) { + putshort(at->name,3); /* MS platform */ + putshort(at->name,1); + putshort(at->name,0x0409); /* american english language */ + putshort(at->name,i); + len = u_strlen(dummy.names[i]); + if ( len>maxlen ) maxlen = len; + putshort(at->name,2*len); + putshort(at->name,posses[i]); + ++cnt; + } + for ( cur=sf->names; cur!=NULL; cur=cur->next ) if ( cur->lang>0x409 ) { + for ( i=0; inames[i]!=NULL ) { + putshort(at->name,3); /* MS platform */ + putshort(at->name,1); /* unicode */ + putshort(at->name,cur->lang); + putshort(at->name,i); + len = u_strlen(cur->names[i]); + if ( len>maxlen ) maxlen = len; + putshort(at->name,2*len); + putshort(at->name,pos); + pos += 2*u_strlen(cur->names[i])+2; + ++cnt; + } + } + + enc = em_unicode; space = NULL; + if ( sf->encoding_name==em_ksc5601 || sf->encoding_name==em_wansung || + sf->encoding_name==em_jis208 || sf->encoding_name==em_sjis || + sf->encoding_name==em_big5 || sf->encoding_name==em_big5hkscs || + sf->encoding_name==em_johab || + sf->encoding_name==em_gb2312 || sf->encoding_name==em_jisgb ) { + specific = sf->encoding_name==em_ksc5601 ? 5 : /* Wansung, korean */ + sf->encoding_name==em_wansung ? 5 : /* Wansung, korean */ + sf->encoding_name==em_jis208 ? 2 : /* SJIS */ + sf->encoding_name==em_sjis ? 2 : /* SJIS */ + sf->encoding_name==em_gb2312 ? 3 : /* packed gb2312, don't know the real name */ + sf->encoding_name==em_jisgb ? 3 : /* packed gb2312, don't know the real name */ + sf->encoding_name==em_big5 ? 4 : /* Big5, traditional Chinese */ + sf->encoding_name==em_big5hkscs ? 4 : + /* sf->encoding_name==em_johab*/ 6; /* Korean */ + enc = sf->encoding_name==em_ksc5601 ? e_wansung : /* Wansung, korean */ + sf->encoding_name==em_wansung ? e_wansung : /* Wansung, korean */ + sf->encoding_name==em_jis208 ? e_sjis : /* SJIS */ + sf->encoding_name==em_sjis ? e_sjis : /* SJIS */ + sf->encoding_name==em_gb2312 ? e_jisgb : /* packed gb2312, don't know the real name */ + sf->encoding_name==em_jisgb ? e_jisgb : /* packed gb2312, don't know the real name */ + sf->encoding_name==em_big5 ? e_big5 : /* Big5, traditional Chinese */ + sf->encoding_name==em_big5hkscs ? e_big5hkscs : + /* sf->encoding_name==em_johab*/ e_johab; /* Korean */ + maxlen = 3*maxlen+10; + space = galloc(maxlen); + for ( i=0; iapplemode) ) { + putshort(at->name,3); /* MS platform */ + putshort(at->name,specific); + putshort(at->name,0x0409); /* american english language */ + putshort(at->name,i); + putshort(at->name,strlen(u2encoding_strncpy(space,dummy.names[i],maxlen,enc))); + putshort(at->name,pos); + pos += strlen(space)+1; + ++cnt; + } + for ( cur=sf->names; cur!=NULL; cur=cur->next ) if ( cur->lang!=0x409 ) { + for ( i=0; inames[i]!=NULL ) { + putshort(at->name,3); /* MS platform */ + putshort(at->name,specific); + putshort(at->name,cur->lang); + putshort(at->name,i); + putshort(at->name,strlen(u2encoding_strncpy(space,cur->names[i],maxlen,enc))); + putshort(at->name,pos); + pos += strlen(space)+1; + ++cnt; + } + } + } + if ( cnt!=strcnt ) + fprintf(stderr, "String count wrong in 'name' table, is %d should be %d\n", cnt, strcnt ); + if ( ftell(at->name)!=(3+strcnt*6)*sizeof(int16) ) + fprintf(stderr, "Table offset wrong in 'name' table, is %ld should be %d\n", ftell(at->name), (int) (3+strcnt*6)*sizeof(short) ); + + for ( i=0; iname,dummy.names[i]); + for ( i=0; iname,dummy.names[i]); + feat_pos = 0; + if ( at->ordered_feat!=NULL ) { + while ( at->ordered_feat[feat_pos].enc==0 && at->ordered_feat[feat_pos].lang==0 ) + dumpstr(at->name,at->ordered_feat[feat_pos++].name); + } + if ( at->applemode ) { + for ( macenc=0; macenc<33; ++macenc ) { + for ( lang=1; lang<255; ++lang ) if ( MacEncFromMacLang(lang)==macenc ) { /* Have to order my mac language code now */ + for ( cur=sf->names; cur!=NULL; cur=cur->next ) + if ( cur->lang!=0x409 && CanEncodingWinLangAsMac(cur->lang) && + WinLangToMac(cur->lang)==lang ) { + for ( i=0; inames[i]!=NULL ) { + temp = UnicodeToMacStr(cur->names[i],MacEncFromMacLang(lang),lang); + dumpstr(at->name,temp); + free(temp); + } + } + if ( at->ordered_feat!=NULL ) { + while ( at->ordered_feat[feat_pos].enc==macenc && at->ordered_feat[feat_pos].lang==lang ) + dumpstr(at->name,at->ordered_feat[feat_pos++].name); + } + } + } + } + if ( format==ff_ttfsym ) { + for ( cur=sf->names; cur!=NULL; cur=cur->next ) if ( cur->lang!=0x409 ) + for ( i=0; inames[i]!=NULL ) + dumpustr(at->name,cur->names[i]); + } + for ( cur=sf->names; cur!=NULL; cur=cur->next ) if ( cur->lang!=0x409 ) + for ( i=0; inames[i]!=NULL ) + dumpustr(at->name,cur->names[i]); + if ( enc!=em_unicode ) { + for ( i=0; iname,u2encoding_strncpy(space,dummy.names[i],maxlen,enc)); + for ( cur=sf->names; cur!=NULL; cur=cur->next ) if ( cur->lang!=0x409 ) + for ( i=0; inames[i]!=NULL ) + dumpstr(at->name,u2encoding_strncpy(space,cur->names[i],maxlen,enc)); + free(space); + } + at->namelen = ftell(at->name); + if ( (at->namelen&3)!=0 ) + for ( j= 4-(at->namelen&3); j>0; --j ) + putc('\0',at->name); + for ( i=0; inames[i] ) + free( dummy.names[i]); + free( at->feat_name ); + free( at->ordered_feat ); +} + +static void dumppost(struct alltabs *at, SplineFont *sf, enum fontformat format) { + int pos, i,j, shouldbe; + int shorttable = (format==ff_otf || format==ff_otfcid || + (at->gi.flags&ttf_flag_shortps)); + uint32 here; + + at->post = tmpfile(); + + putlong(at->post,shorttable?0x00030000:0x00020000); /* formattype */ + putfixed(at->post,sf->italicangle); + putshort(at->post,sf->upos); + putshort(at->post,sf->uwidth); + putlong(at->post,at->isfixed); + putlong(at->post,0); /* no idea about memory */ + putlong(at->post,0); /* no idea about memory */ + putlong(at->post,0); /* no idea about memory */ + putlong(at->post,0); /* no idea about memory */ + if ( !shorttable ) { + here = ftell(at->post); + putshort(at->post,at->maxp.numGlyphs); + + shouldbe = 0; + for ( i=0, pos=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + while ( sf->chars[i]->ttf_glyph>shouldbe ) { + if ( shouldbe==0 ) + putshort(at->post,0); /* glyph 0 is named .notdef */ + else if ( shouldbe==1 ) + putshort(at->post,1); /* glyphs 1&2 are tab and cr */ + else if ( shouldbe==2 ) + putshort(at->post,2); /* or something */ + else + putshort(at->post,0); + ++shouldbe; + } + if ( strcmp(sf->chars[i]->name,".notdef")==0 ) + putshort(at->post,0); + else { + for ( j=0; j<258; ++j ) + if ( strcmp(sf->chars[i]->name,ttfstandardnames[j])==0 ) + break; + if ( j!=258 ) + putshort(at->post,j); + else { + putshort(at->post,pos+258); + ++pos; + } + } + ++shouldbe; + } + if ( shouldbe!=at->maxp.numGlyphs ) { + fseek(at->post,here,SEEK_SET); + putshort(at->post,shouldbe); + fseek(at->post,0,SEEK_END); + } + if ( pos!=0 ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + if ( strcmp(sf->chars[i]->name,".notdef")==0 ) + /* Do Nothing */; + else { + for ( j=0; j<258; ++j ) + if ( strcmp(sf->chars[i]->name,ttfstandardnames[j])==0 ) + break; + if ( j!=258 ) + /* Do Nothing */; + else + dumppstr(at->post,sf->chars[i]->name); + } + } + } + } + at->postlen = ftell(at->post); + if ( (at->postlen&3)!=0 ) + for ( j= 4-(at->postlen&3); j>0; --j ) + putc('\0',at->post); +} + +static FILE *Needs816Enc(SplineFont *sf,int *tlen) { + int i, j, complained, pos, k, subheadindex, jj; + uint16 table[256]; + struct subhead subheads[128]; + uint16 *glyphs; + uint16 tempglyphs[256]; + int base, lbase, basebound, subheadcnt, planesize, plane0size; + int base2, base2bound; + FILE *sub; + + *tlen = 0; + if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) +return( NULL ); + if ( sf->encoding_name!=em_big5 && sf->encoding_name!=em_big5hkscs && + sf->encoding_name!=em_johab && + sf->encoding_name!=em_jisgb && + sf->encoding_name!=em_sjis && sf->encoding_name!=em_wansung ) +return( NULL ); + + base2 = -1; base2bound = -2; + if ( sf->encoding_name==em_big5 ) { + base = 0xa1; + basebound = 0xf9; /* wcl-02.ttf's cmap claims to go up to fc, but everything after f9 is invalid (according to what I know of big5, f9 should be the end) */ + subheadcnt = basebound-base+1; + lbase = 0x40; + planesize = 191; + } else if ( sf->encoding_name==em_big5hkscs ) { + base = 0x81; + basebound = 0xfe; + subheadcnt = basebound-base+1; + lbase = 0x40; + planesize = 191; + } else if ( sf->encoding_name==em_wansung || sf->encoding_name==em_jisgb ) { + base = 0xa1; + basebound = 0xfd; + lbase = 0xa1; + subheadcnt = basebound-base+1; + planesize = 0xfe - lbase +1; + } else if ( sf->encoding_name==em_johab ) { + base = 0x84; + basebound = 0xf9; + lbase = 0x31; + subheadcnt = basebound-base+1; + planesize = 0xfe -0x31+1; /* Stupid gcc bug, thinks 0xfe- is ambiguous (exponant) */ + } else if ( sf->encoding_name==em_sjis ) { + base = 129; + basebound = 159; + lbase = 64; + planesize = 252 - lbase +1; + base2 = 0xe0; + /* SJIS supports "user defined characters" between 0xf040 and 0xfcfc */ + /* there probably won't be any, but allow space for them if there are*/ + for ( base2bound=0xfc00; base2bound>0xefff; --base2bound ) + if ( base2boundcharcnt && SCWorthOutputting(sf->chars[base2bound])) + break; + base2bound >>= 8; + subheadcnt = basebound-base + 1 + base2bound-base2 + 1; + } else { + fprintf( stderr, "Unsupported 8/16 encoding %d\n", sf->encoding_name ); +return( NULL ); + } + plane0size = base2==-1? base : base2; + i=0; + if ( base2!=-1 ) { + for ( i=basebound; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && (i==0 || (i==13 && sf->chars[i]->ttf_glyph==2))) + continue; /* Ignore .notdef, nonmarking return */ + else if ( SCWorthOutputting(sf->chars[i])) + break; + if ( i==base2 || i==sf->charcnt ) + i = 0; + } + if ( i==0 ) { + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && (i==0 || (i==13 && sf->chars[i]->ttf_glyph==2))) + continue; + else if ( SCWorthOutputting(sf->chars[i])) + break; + } +#if 0 + if ( i==base || i==sf->charcnt ) +return( NULL ); /* Doesn't have the single byte entries */ + /* Can use the normal 16 bit encoding scheme */ + /* Always do an 8/16, and we'll do a unicode table too now... */ +#endif + + if ( base2!=-1 ) { + for ( i=base; i<=basebound && icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i])) { + GWidgetErrorR(_STR_BadEncoding,_STR_ExtraneousSingleByte,i); + break; + } + if ( i==basebound+1 ) + for ( i=base2; i<256 && icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i])) { + GWidgetErrorR(_STR_BadEncoding,_STR_ExtraneousSingleByte,i); + break; + } + } else { + for ( i=base; i<256 && icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i])) { + GWidgetErrorR(_STR_BadEncoding,_STR_ExtraneousSingleByte,i); + break; + } + } + for ( i=256; i<(base<<8) && icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i])) { + GWidgetErrorR(_STR_BadEncoding,_STR_OutOfEncoding,i); + break; + } + if ( i==(base<<8) && base2==-1 ) + for ( i=((basebound+1)<<8); i<0x10000 && icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i])) { + GWidgetErrorR(_STR_BadEncoding,_STR_OutOfEncoding,i); + break; + } + + memset(table,'\0',sizeof(table)); + for ( i=base; i<=basebound; ++i ) + table[i] = 8*(i-base+1); + for ( i=base2; i<=base2bound; ++i ) + table[i] = 8*(i-base2+basebound-base+1+1); + memset(subheads,'\0',sizeof(subheads)); + subheads[0].first = 0; subheads[0].cnt = plane0size; + for ( i=1; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && SCDuplicate(sf->chars[i])->ttf_glyph!=-1) + glyphs[i] = SCDuplicate(sf->chars[i])->ttf_glyph; + + pos = 1; + + complained = false; + subheadindex = 1; + for ( jj=0; jj<2 || (base2==-1 && jj<1); ++jj ) + for ( j=((jj==0?base:base2)<<8); j<=((jj==0?basebound:base2bound)<<8); j+= 0x100 ) { + for ( i=0; ichars[i+j])) { + GWidgetErrorR(_STR_BadEncoding,_STR_NotNormallyEncoded,i+j); + complained = true; + } + if ( sf->encoding_name==em_big5 ) { + /* big5 has a gap here. Does johab? */ + for ( i=0x7f; i<0xa1; ++i ) + if ( !complained && SCWorthOutputting(sf->chars[i+j])) { + GWidgetErrorR(_STR_BadEncoding,_STR_NotNormallyEncoded,i+j); + complained = true; + } + } + memset(tempglyphs,0,sizeof(tempglyphs)); + for ( i=0; ichars[j+lbase+i]!=NULL && SCDuplicate(sf->chars[j+lbase+i])->ttf_glyph!=-1 ) + tempglyphs[i] = SCDuplicate(sf->chars[j+lbase+i])->ttf_glyph; + for ( i=1; iencoding_name==em_unicode4 ) { + for ( i=0x10000; icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i])) + break; + } else if ( sf->encoding_name>=em_unicodeplanes && sf->encoding_name<=em_unicodeplanesmax ) { + for ( i=0; icharcnt; ++i ) + if ( SCWorthOutputting(sf->chars[i])) + break; + } else +return( NULL ); + if ( i>=sf->charcnt ) +return(NULL); + + format12 = tmpfile(); + if ( format12==NULL ) +return( NULL ); + + putshort(format12,12); /* Subtable format */ + putshort(format12,0); /* padding */ + putlong(format12,0); /* Length, we'll come back to this */ + putlong(format12,0); /* language */ + putlong(format12,0); /* Number of groups, we'll come back to this */ + + group = 0; + for ( i=0; icharcnt; ++i ) if ( SCWorthOutputting(sf->chars[i]) && sf->chars[i]->unicodeenc!=-1 ) { + sc = SCDuplicate(sf->chars[i]); + for ( j=i+1; jcharcnt && SCWorthOutputting(sf->chars[j]) && + sf->chars[j]->unicodeenc!=-1 && + SCDuplicate(sf->chars[j])->ttf_glyph==sc->ttf_glyph+j-i; ++j ); + --j; + putlong(format12,i); /* start char code */ + putlong(format12,j); /* end char code */ + putlong(format12,sc->ttf_glyph); + ++group; + i=j; /* move to the start of the next group */ + } + *ucs4len = ftell(format12); + fseek(format12,4,SEEK_SET); + putlong(format12,*ucs4len); /* Length, I said we'd come back to it */ + putlong(format12,0); /* language */ + putlong(format12,group); /* Number of groups */ + rewind( format12 ); +return( format12 ); +} + +static int figureencoding(SplineFont *sf,int i) { + /* We used to be able to generate a format 4 table for various cjk encodings */ + /* (if they didn't have any single byte characters). Now we always generate */ + /* a format2 (8/16) table for cjk AND a format 4 (unicode) table. So this */ + /* routine is now just used in a unicode context no matter what the font's */ + /* encoding might be */ + if ( sf->chars[i]->unicodeenc>=65536 ) /* format 4 doesn't support 4byte encodings, we have an additional format 12 table for that */ +return( -1 ); + +return( sf->chars[i]->unicodeenc ); +} + +static void dumpcmap(struct alltabs *at, SplineFont *_sf,enum fontformat format) { + uint16 *sfind = NULL; + int i,j,k,l,charcnt,enccnt, issmall; + int segcnt, cnt=0, delta, rpos; + struct cmapseg { uint16 start, end; uint16 delta; uint16 rangeoff; } *cmapseg; + uint16 *ranges; + uint16 table[256]; + SplineFont *sf = _sf; + SplineChar *sc, notdef, nonmarkingreturn; + int alreadyprivate = false; +#ifdef FONTFORGE_CONFIG_TYPE3 + Layer layers[2]; +#endif + + if ( sf->subfontcnt==0 && format!=ff_ttfsym) { + for ( i=sf->charcnt-1; i>0 ; --i ) + if ( sf->chars[i]!=NULL && sf->chars[i]->unicodeenc!=-1 ) + break; + if ( i==0 ) { + if ( sf->charcnt<=256 ) { + static int buts[] = { _STR_Yes, _STR_No, 0 }; + if ( GWidgetAskR(_STR_NoEncodedChars,buts,0,1,_STR_NoUnicodeEncodingUseSymbol)==0 ) + format = ff_ttfsym; + } else + GWidgetErrorR(_STR_NoEncodedChars,_STR_NoUnicodeEncoding); + } + } + +#ifdef FONTFORGE_CONFIG_TYPE3 + memset(layers,0,sizeof(layers)); +#endif + if ( sf->subfontcnt==0 && sf->chars[0]==NULL ) { /* Encode the default notdef char at 0 */ + memset(¬def,0,sizeof(notdef)); + notdef.unicodeenc = -1; + notdef.name = ".notdef"; + notdef.parent = sf; + sf->chars[0] = ¬def; + notdef.layer_cnt = 2; +#ifdef FONTFORGE_CONFIG_TYPE3 + notdef.layers = layers; +#endif + } + if ( sf->subfontcnt==0 && sf->chars[13]==NULL && !at->isotf ) { /* Encode the default notdef char at 0 */ + memset(&nonmarkingreturn,0,sizeof(notdef)); + nonmarkingreturn.unicodeenc = 13; + nonmarkingreturn.name = "nonmarkingreturn"; + nonmarkingreturn.parent = sf; + nonmarkingreturn.ttf_glyph = 2; + nonmarkingreturn.layer_cnt = 2; +#ifdef FONTFORGE_CONFIG_TYPE3 + nonmarkingreturn.layers = layers; +#endif + sf->chars[13] = &nonmarkingreturn; + } + + at->cmap = tmpfile(); + + /* MacRoman encoding table */ /* Not going to bother with making this work for cid fonts */ + /* I now see that Apple doesn't restrict us to format 0 sub-tables (as */ + /* the docs imply) but instead also uses format 6 tables. Wildly in- */ + /* appropriate as they are for 2byte encodings, but Apple uses them */ + /* for one byte ones too */ + memset(table,'\0',sizeof(table)); + for ( i=0; i<256 ; ++i ) { + sc = SCDuplicate(SFFindExistingCharMac(sf,unicode_from_mac[i])); + if ( sc!=NULL && sc->ttf_glyph!=-1 ) + table[i] = sc->ttf_glyph; + } + table[0] = table[8] = table[13] = table[29] = 1; + table[9] = table[32]==0 ? 1 : table[32]; + + if ( format==ff_ttfsym ) { + int acnt=0, pcnt=0; + int space = table[9]; + for ( i=0; icharcnt; ++i ) { + if ( sf->chars[i]!=¬def && sf->chars[i]!=&nonmarkingreturn && + sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 && + !SCIsNotdef(sf->chars[i],at->gi.fixed_width) && i<=0xffff ) { + if ( i>=0xf000 && i<=0xf0ff ) + ++acnt; + else if ( i>=0x20 && i<=0xff ) + ++pcnt; + } + } + alreadyprivate = acnt>pcnt; + memset(table,'\0',sizeof(table)); + if ( !alreadyprivate ) { + for ( i=0; icharcnt && i<256; ++i ) { + sc = SCDuplicate(sf->chars[i]); + if ( sc!=NULL && sc->ttf_glyph!=-1 && sc->ttf_glyph<256 ) + table[sf->chars[i]->enc] = sc->ttf_glyph; + } + } else { + for ( i=0xf000; i<=0xf0ff && icharcnt; ++i ) { + sc = SCDuplicate(sf->chars[i]); + if ( sc!=NULL && sc->ttf_glyph!=-1 && + sc->ttf_glyph<256 ) + table[sf->chars[i]->enc-0xf000] = sc->ttf_glyph; + } + } + table[0] = table[8] = table[13] = table[29] = 1; + table[9] = space; + /* if the user has read in a ttf symbol file then it will already have */ + /* the right private use encoding, and we don't want to mess it up. */ + /* The alreadyprivate flag should detect this case */ + if ( !alreadyprivate ) { + for ( i=0; icharcnt && i<256; ++i ) { + if ( sf->chars[i]!=¬def && sf->chars[i]!=&nonmarkingreturn && + sf->chars[i]!=NULL && !SCIsNotdef(sf->chars[i],at->gi.fixed_width)) { + sf->chars[i]->enc = sf->chars[i]->unicodeenc; + sf->chars[i]->unicodeenc = 0xf000 + i; + } + } + for ( ; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + sf->chars[i]->enc = sf->chars[i]->unicodeenc; + sf->chars[i]->unicodeenc = -1; + } + } + } + + { + uint32 *avail = galloc(65536*sizeof(uint32)); + int ucs4len=0, cjklen=0; + FILE *format12 = NeedsUCS4Table(sf,&ucs4len); + FILE *format2 = Needs816Enc(sf,&cjklen); + int hasmac; + long ucs4pos, mspos, cjkpos; + memset(avail,0xff,65536*sizeof(uint32)); + if ( _sf->subfontcnt!=0 ) sfind = gcalloc(65536,sizeof(uint16)); + charcnt = _sf->charcnt; + if ( _sf->subfontcnt!=0 ) { + for ( k=0; k<_sf->subfontcnt; ++k ) + if ( _sf->subfonts[k]->charcnt > charcnt ) + charcnt = _sf->subfonts[k]->charcnt; + } + for ( i=0; isubfontcnt==0 ) ? _sf : _sf->subfonts[k]; + if ( icharcnt && + sf->chars[i]!=NULL && SCDuplicate(sf->chars[i])->ttf_glyph!=-1 && + (l = figureencoding(sf,i))!=-1 ) { + avail[l] = i; + if ( sfind!=NULL ) sfind[l] = k; + ++cnt; + break; + } + ++k; + } while ( k<_sf->subfontcnt ); + } + + j = -1; + for ( i=segcnt=0; i<65536; ++i ) { + if ( avail[i]!=0xffffffff && j==-1 ) { + j=i; + ++segcnt; + } else if ( j!=-1 && avail[i]==0xffffffff ) + j = -1; + } + cmapseg = gcalloc(segcnt+1,sizeof(struct cmapseg)); + ranges = galloc(cnt*sizeof(int16)); + j = -1; + for ( i=segcnt=0; i<65536; ++i ) { + if ( avail[i]!=0xffffffff && j==-1 ) { + j=i; + cmapseg[segcnt].start = j; + ++segcnt; + } else if ( j!=-1 && avail[i]==0xffffffff ) { + cmapseg[segcnt-1].end = i-1; + j = -1; + } + } + if ( j!=-1 ) + cmapseg[segcnt-1].end = i-1; + /* create a dummy segment to mark the end of the table */ + cmapseg[segcnt].start = cmapseg[segcnt].end = 0xffff; + cmapseg[segcnt++].delta = 1; + rpos = 0; + for ( i=0; ichars[l] : _sf->subfonts[sfind[cmapseg[i].start]]->chars[l]; + delta = sc->ttf_glyph-cmapseg[i].start; + for ( j=cmapseg[i].start; j<=cmapseg[i].end; ++j ) { + l = avail[j]; + sc = sfind==NULL ? _sf->chars[l] : _sf->subfonts[sfind[j]]->chars[l]; + sc = SCDuplicate(sc); + if ( delta != sc->ttf_glyph-j ) + break; + } + if ( j>cmapseg[i].end ) + cmapseg[i].delta = delta; + else { + cmapseg[i].rangeoff = (rpos + (segcnt-i)) * sizeof(int16); + for ( j=cmapseg[i].start; j<=cmapseg[i].end; ++j ) { + l = avail[j]; + sc = sfind==NULL ? _sf->chars[l] : _sf->subfonts[sfind[j]]->chars[l]; + sc = SCDuplicate(sc); + ranges[rpos++] = sc->ttf_glyph; + } + } + } + free(avail); + if ( _sf->subfontcnt!=0 ) free(sfind); + + /* Two/Three/Four encoding table pointers, one for ms, one for mac */ + /* usually one for mac big, just a copy of ms */ + /* plus we may have a format12 encoding for ucs4, mac doesn't support */ + /* plus we may have a format2 encoding for cjk, sometimes I know the codes for the mac... */ + hasmac = 1; + enccnt = 3; + if ( format12!=NULL ) + enccnt = 4; + else if ( format==ff_ttfsym ) { + enccnt = 2; + hasmac = 0; + } else if ( format2!=NULL ) { + if ( sf->encoding_name==em_johab ) { + enccnt=4; + } else { + enccnt=5; + hasmac=3; + } + } + putshort(at->cmap,0); /* version */ + putshort(at->cmap,enccnt); /* num tables */ + + mspos = 2*sizeof(uint16)+enccnt*(2*sizeof(uint16)+sizeof(uint32)); + ucs4pos = mspos+(8+4*segcnt+rpos)*sizeof(int16); + cjkpos = ucs4pos+ucs4len; + if ( hasmac&1 ) { + /* big mac table, just a copy of the ms table */ + putshort(at->cmap,0); /* mac unicode platform */ + putshort(at->cmap,3); /* Unicode 2.0 */ + putlong(at->cmap,mspos); + } + putshort(at->cmap,1); /* mac platform */ + putshort(at->cmap,0); /* plat specific enc, script=roman */ + /* Even the symbol font on the mac claims a mac roman encoding */ + /* although it actually contains a symbol encoding. There is an*/ + /* "RSymbol" language listed for Mac (specific=8) but it isn't used*/ + putlong(at->cmap,ucs4pos+ucs4len); /* offset from tab start to sub tab start */ + if ( format2!=NULL && (hasmac&2) ) { + /* big mac table, just a copy of the ms table */ + putshort(at->cmap,1); /* mac platform */ + putshort(at->cmap, + sf->encoding_name==em_jis208? 1 : /* SJIS */ + sf->encoding_name==em_sjis? 1 : /* SJIS */ + sf->encoding_name==em_ksc5601? 3 : /* Korean */ + sf->encoding_name==em_wansung? 3 : /* Korean */ + sf->encoding_name==em_jisgb? 25 : /* Simplified Chinese */ + 2 ); /* Big5 */ + putlong(at->cmap,cjkpos); + } + + putshort(at->cmap,3); /* ms platform */ + putshort(at->cmap, /* plat specific enc */ + format==ff_ttfsym ? 0 : + 1 ); /* Unicode */ + putlong(at->cmap,mspos); /* offset from tab start to sub tab start */ + + if ( format2!=NULL ) { + putshort(at->cmap,3); /* ms platform */ + putshort(at->cmap, /* plat specific enc */ + sf->encoding_name==em_ksc5601 ? 5 : /* Wansung, korean */ + sf->encoding_name==em_wansung ? 5 : /* Wansung, korean */ + sf->encoding_name==em_jis208 ? 2 : /* SJIS */ + sf->encoding_name==em_sjis ? 2 : /* SJIS */ + sf->encoding_name==em_gb2312 ? 3 : /* PRC Chinese */ + sf->encoding_name==em_jisgb ? 3 : /* PRC Chinese */ + sf->encoding_name==em_big5 ? 4 : /* Big5, traditional Chinese */ + sf->encoding_name==em_big5hkscs ? 4 : + /*sf->encoding_name==em_johab ?*/ 6);/* Korean */ + putlong(at->cmap,cjkpos); /* offset from tab start to sub tab start */ + } + + if ( format12!=NULL ) { + putshort(at->cmap,3); /* ms platform */ + putshort(at->cmap,10); /* plat specific enc, ucs4 */ + putlong(at->cmap,ucs4pos); /* offset from tab start to sub tab start */ + } + + putshort(at->cmap,4); /* format */ + putshort(at->cmap,(8+4*segcnt+rpos)*sizeof(int16)); + putshort(at->cmap,0); /* language/version */ + putshort(at->cmap,2*segcnt); /* segcnt */ + for ( j=0,i=1; i<=segcnt; i<<=1, ++j ); + putshort(at->cmap,i); /* 2*2^floor(log2(segcnt)) */ + putshort(at->cmap,j-1); + putshort(at->cmap,2*segcnt-i); + for ( i=0; icmap,cmapseg[i].end); + putshort(at->cmap,0); + for ( i=0; icmap,cmapseg[i].start); + for ( i=0; icmap,cmapseg[i].delta); + for ( i=0; icmap,cmapseg[i].rangeoff); + for ( i=0; icmap,ranges[i]); + free(ranges); + free(cmapseg); + + if ( format12!=NULL ) { + if ( !ttfcopyfile(at->cmap,format12,ucs4pos)) at->error = true; + } + if ( format2!=NULL ) { + if ( !ttfcopyfile(at->cmap,format2,cjkpos)) at->error = true; + } + } + + /* Mac table */ + issmall = true; + for ( i=0; i<256; ++i ) + if ( table[i]>=256 ) { + issmall = false; + break; + } + if ( issmall ) { + putshort(at->cmap,0); /* format */ + putshort(at->cmap,262); /* length = 256bytes + 6 header bytes */ + putshort(at->cmap,0); /* language = english */ + for ( i=0; i<256; ++i ) + putc(table[i],at->cmap); + } else { + putshort(at->cmap,6); /* format 6 */ + putshort(at->cmap,522); /* length = 256short +10 header bytes */ + putshort(at->cmap,0); /* language = english */ + putshort(at->cmap,0); /* first code */ + putshort(at->cmap,256); /* entry count */ + for ( i=0; i<256; ++i ) + putshort(at->cmap,table[i]); + } + + at->cmaplen = ftell(at->cmap); + if ( (at->cmaplen&2)!=0 ) + putshort(at->cmap,0); + + if ( format==ff_ttfsym ) { + if ( !alreadyprivate ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=¬def && sf->chars[i]!=&nonmarkingreturn && sf->chars[i]!=NULL ) { + sf->chars[i]->unicodeenc = sf->chars[i]->enc; + sf->chars[i]->enc = i; + } + } + } + if ( sf->subfontcnt==0 && sf->chars[0]==¬def ) + sf->chars[0] = NULL; + if ( sf->subfontcnt==0 && sf->chars[13]==&nonmarkingreturn ) + sf->chars[13] = NULL; +} + +static int32 filecheck(FILE *file) { + uint32 sum = 0, chunk; + + rewind(file); + while ( 1 ) { + chunk = getuint32(file); + if ( feof(file)) + break; + sum += chunk; + } +return( sum ); +} + +static void AbortTTF(struct alltabs *at, SplineFont *sf) { + int i; + + if ( at->loca!=NULL ) + fclose(at->loca); + if ( at->name!=NULL ) + fclose(at->name); + if ( at->post!=NULL ) + fclose(at->post); + if ( at->gpos!=NULL ) + fclose(at->gpos); + if ( at->gsub!=NULL ) + fclose(at->gsub); + if ( at->gdef!=NULL ) + fclose(at->gdef); + if ( at->kern!=NULL ) + fclose(at->kern); + if ( at->cmap!=NULL ) + fclose(at->cmap); + if ( at->headf!=NULL ) + fclose(at->headf); + if ( at->hheadf!=NULL ) + fclose(at->hheadf); + if ( at->maxpf!=NULL ) + fclose(at->maxpf); + if ( at->os2f!=NULL ) + fclose(at->os2f); + if ( at->cvtf!=NULL ) + fclose(at->cvtf); + if ( at->vheadf!=NULL ) + fclose(at->vheadf); + if ( at->vorgf!=NULL ) + fclose(at->vorgf); + if ( at->cfff!=NULL ) + fclose(at->cfff); + + if ( at->gi.glyphs!=NULL ) + fclose(at->gi.glyphs); + if ( at->gi.hmtx!=NULL ) + fclose(at->gi.hmtx); + if ( at->gi.vmtx!=NULL ) + fclose(at->gi.vmtx); + if ( at->fpgmf!=NULL ) + fclose(at->fpgmf); + if ( at->prepf!=NULL ) + fclose(at->prepf); + if ( at->gaspf!=NULL ) + fclose(at->gaspf); + + if ( at->sidf!=NULL ) + fclose(at->sidf); + if ( at->sidh!=NULL ) + fclose(at->sidh); + if ( at->charset!=NULL ) + fclose(at->charset); + if ( at->encoding!=NULL ) + fclose(at->encoding); + if ( at->private!=NULL ) + fclose(at->private); + if ( at->charstrings!=NULL ) + fclose(at->charstrings); + if ( at->fdselect!=NULL ) + fclose(at->fdselect); + if ( at->fdarray!=NULL ) + fclose(at->fdarray); + if ( at->bdat!=NULL ) + fclose(at->bdat); + if ( at->bloc!=NULL ) + fclose(at->bloc); + if ( at->ebsc!=NULL ) + fclose(at->ebsc); + + if ( at->prop!=NULL ) + fclose(at->prop); + if ( at->opbd!=NULL ) + fclose(at->opbd); + if ( at->acnt!=NULL ) + fclose(at->acnt); + if ( at->lcar!=NULL ) + fclose(at->lcar); + if ( at->feat!=NULL ) + fclose(at->feat); + if ( at->morx!=NULL ) + fclose(at->morx); + + if ( at->pfed!=NULL ) + fclose(at->pfed); + + for ( i=0; isubfontcnt; ++i ) { + if ( at->fds[i].private!=NULL ) + fclose(at->fds[i].private); + } + if ( at->fds!=NULL ) + free( at->fds ); +} + +static int SFHasInstructions(SplineFont *sf) { + int i; + + if ( sf->subfontcnt!=0 ) +return( false ); /* Truetype doesn't support cid keyed fonts */ + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + if ( sf->chars[i]->ttf_instrs!=NULL ) +return( true ); + } +return( false ); +} + +static void MaxpFromTable(struct alltabs *at,struct ttf_table *maxp ) { + if ( maxp==NULL || maxp->len<13*sizeof(uint16) ) +return; + /* We can figure out the others ourselves, but these depend on the contents */ + /* of uninterpretted tables */ + at->maxp.maxZones = memushort(maxp->data,7*sizeof(uint16)); + at->maxp.maxTwilightPts = memushort(maxp->data,8*sizeof(uint16)); + at->maxp.maxStorage = memushort(maxp->data,9*sizeof(uint16)); + at->maxp.maxFDEFs = memushort(maxp->data,10*sizeof(uint16)); + at->maxp.maxIDEFs = memushort(maxp->data,11*sizeof(uint16)); + at->maxp.maxStack = memushort(maxp->data,12*sizeof(uint16)); +} + +static FILE *dumpstoredtable(SplineFont *sf,uint32 tag,int *len) { + struct ttf_table *tab = SFFindTable(sf,tag); + FILE *out; + + if ( tab==NULL ) { + *len = 0; +return( NULL ); + } + + out = tmpfile(); + fwrite(tab->data,1,tab->len,out); + if ( (tab->len&1)) + putc('\0',out); + if ( (tab->len+1)&2 ) + putshort(out,0); + *len = tab->len; +return( out ); +} + +static void SFDummyUpCIDs(SplineFont *sf) { + int i,k,max; + + max = 0; + for ( k=0; ksubfontcnt; ++k ) + if ( sf->subfonts[k]->charcnt>max ) max = sf->subfonts[k]->charcnt; + if ( max == 0 ) +return; + + sf->chars = gcalloc(max,sizeof(SplineChar *)); + sf->charcnt = max; + for ( k=0; ksubfontcnt; ++k ) + for ( i=0; isubfonts[k]->charcnt; ++i ) if ( sf->subfonts[k]->chars[i]!=NULL ) + sf->chars[i] = sf->subfonts[k]->chars[i]; +} + +static int tcomp(const void *_t1, const void *_t2) { + struct taboff *t1 = *((struct taboff **) _t1), *t2 = *((struct taboff **) _t2); +return( t1->orderingval - t2->orderingval ); +} + +static int initTables(struct alltabs *at, SplineFont *sf,enum fontformat format, + int32 *bsizes, enum bitmapformat bf,int flags) { + int i, j, aborted, ebdtpos, eblcpos, offset; + BDFFont *bdf; + + if ( sf->encoding_name == em_symbol && format==ff_ttf ) + format = ff_ttfsym; + + SFDefaultOS2Info(&sf->pfminfo,sf,sf->fontname); + + at->gi.xmin = at->gi.ymin = 15000; + at->gi.sf = sf; + if ( bf!=bf_ttf && bf!=bf_sfnt_dfont && bf!=bf_otb ) + bsizes = NULL; + if ( bsizes!=NULL ) { + for ( i=j=0; bsizes[i]!=0; ++i ) { + for ( bdf=sf->bitmaps; bdf!=NULL && (bdf->pixelsize!=(bsizes[i]&0xffff) || BDFDepth(bdf)!=(bsizes[i]>>16)); bdf=bdf->next ); + if ( bdf!=NULL ) + bsizes[j++] = bsizes[i]; + } + bsizes[j] = 0; + for ( i=0; bsizes[i]!=0; ++i ); + at->gi.strikecnt = i; + if ( i==0 ) bsizes=NULL; + } + + at->maxp.version = 0x00010000; + if ( format==ff_otf || format==ff_otfcid || (format==ff_none && at->applemode) ) + at->maxp.version = 0x00005000; + at->maxp.maxnumcomponents = 0; + at->maxp.maxcomponentdepth = 0; + at->maxp.maxZones = 2; /* 1 would probably do, don't use twilight */ + at->maxp.maxFDEFs = 1; /* Not even 1 */ + at->maxp.maxStorage = 1; /* Not even 1 */ + at->maxp.maxStack = 64; /* A guess, it's probably more like 8 */ + if ( format==ff_otf || format==ff_otfcid || (format==ff_none && at->applemode) ) + at->maxp.version = 0x00005000; + else + MaxpFromTable(at,SFFindTable(sf,CHR('m','a','x','p'))); + at->gi.maxp = &at->maxp; + if ( format==ff_otf ) + aborted = !dumptype2glyphs(sf,at); + else if ( format==ff_otfcid ) + aborted = !dumpcidglyphs(sf,at); + else if ( format==ff_none && at->applemode ) { + AssignTTFGlyph(sf,bsizes); + aborted = !dumpcffhmtx(at,sf,true); + } else if ( format==ff_none && at->otbbitmaps ) { + AssignTTFGlyph(sf,bsizes); + aborted = !dumpcffhmtx(at,sf,true); + dumpnoglyphs(sf,&at->gi); + } else if ( format==ff_none && at->msbitmaps ) { + aborted = !dumpglyphs(sf,&at->gi); + } else { + struct ttf_table *tab; + /* There's a typo in Adobe's docs, and the instructions in these tables*/ + /* need to be included in the max glyph instruction length */ + if ( (tab = SFFindTable(sf,CHR('f','p','g','m'))) != NULL ) { + at->maxp.maxglyphInstr = tab->len; + at->gi.has_instrs = true; + } + if ( (tab = SFFindTable(sf,CHR('p','r','e','p'))) != NULL ) { + if ( at->maxp.maxglyphInstr < tab->len ) + at->maxp.maxglyphInstr = tab->len; + at->gi.has_instrs = true; + } + at->gi.has_instrs = (SFFindTable(sf,CHR('f','p','g','m')) != NULL || + SFFindTable(sf,CHR('p','r','e','p')) != NULL); + /* if format==ff_none the following will put out lots of space glyphs */ + aborted = !dumpglyphs(sf,&at->gi); + } + if ( bsizes!=NULL && !aborted ) + ttfdumpbitmap(sf,at,bsizes); + if ( bsizes!=NULL && format==ff_none && !at->applemode ) + ttfdumpbitmapscaling(sf,at,bsizes); + if ( aborted ) { + AbortTTF(at,sf); +return( false ); + } + + if ( at->gi.xmin==15000 ) at->gi.xmin = 0; + if ( at->gi.ymin==15000 ) at->gi.ymin = 0; + if ( bsizes!=NULL && format==ff_none ) { + if ( sf->ascent >at->gi.ymax ) at->gi.ymax = sf->ascent; + if ( -sf->descentgi.ymin ) at->gi.ymin = -sf->descent; + } + at->head.xmin = at->gi.xmin; + at->head.ymin = at->gi.ymin; + at->head.xmax = at->gi.xmax; + at->head.ymax = at->gi.ymax; + + sethead(&at->head,sf); + sethhead(&at->hhead,&at->vhead,at,sf); + setvorg(&at->vorg,sf); + setos2(&at->os2,at,sf,format); /* should precede kern/ligature output */ + if ( at->gi.glyph_len<0x20000 ) + at->head.locais32 = 0; + if ( format==ff_none && at->otbbitmaps ) + dummyloca(at); + else if ( format!=ff_otf && format!=ff_otfcid && (format!=ff_none || (bsizes!=NULL && !at->applemode && at->opentypemode)) ) + redoloca(at); + redohead(at); + redohhead(at,false); + if ( sf->hasvmetrics ) { + redohhead(at,true); + redovorg(at); /* I know, VORG is only meaningful in a otf font and I dump it out in ttf too. Well, it will help ME read the font back in, and it won't bother anyone else. So there. */ + } + redomaxp(at,format); + + if (( at->opentypemode || at->applemode ) && sf->subfonts!=NULL ) + SFDummyUpCIDs(sf); /* The advanced typography stuff is easier if we ignore the seperate fonts of a cid keyed fonts and treat it as flat */ + if ( at->opentypemode ) { + otf_orderlangs(sf); + otf_dumpgpos(at,sf); + otf_dumpgsub(at,sf); + otf_dumpgdef(at,sf); + } + if ( at->applemode ) { + aat_dumpacnt(at,sf); /* Placeholder for now */ + ttf_dumpkerns(at,sf); + aat_dumplcar(at,sf); + aat_dumpmorx(at,sf); /* Sets the feat table too */ + aat_dumpopbd(at,sf); + aat_dumpprop(at,sf); + } + if (( at->opentypemode || at->applemode ) && sf->subfonts!=NULL ) { + free(sf->chars); sf->chars = NULL; + sf->charcnt = 0; + } + if ( !at->applemode && !at->opentypemode ) + ttf_dumpkerns(at,sf); /* everybody supports a mimimal kern table */ + + dumpnames(at,sf,format); /* Must be after dumpmorx which may create extra names */ + redoos2(at); + if ( format!=ff_otf && format!=ff_otfcid && format!=ff_none ) { + if ( !SFHasInstructions(sf)) + dumpgasp(at); + at->fpgmf = dumpstoredtable(sf,CHR('f','p','g','m'),&at->fpgmlen); + at->prepf = dumpstoredtable(sf,CHR('p','r','e','p'),&at->preplen); + at->cvtf = dumpstoredtable(sf,CHR('c','v','t',' '),&at->cvtlen); + } + dumppost(at,sf,format); + dumpcmap(at,sf,format); + + pfed_dump(at,sf); + + if ( format==ff_otf || format==ff_otfcid ) { + at->tabdir.version = CHR('O','T','T','O'); + } else if ( at->applemode && !at->opentypemode ) { + at->tabdir.version = CHR('t','r','u','e'); + } else { + at->tabdir.version = 0x00010000; + } + + i = 0; + + if ( format==ff_otf || format==ff_otfcid ) { + at->tabdir.tabs[i].tag = CHR('C','F','F',' '); + at->tabdir.tabs[i].length = at->cfflen; + at->tabdir.tabs[i++].data = at->cfff; + } + + if ( at->bdat!=NULL && at->opentypemode ) { + ebdtpos = i; + at->tabdir.tabs[i].tag = CHR('E','B','D','T'); + at->tabdir.tabs[i].length = at->bdatlen; + at->tabdir.tabs[i++].data = at->bdat; + } + + if ( at->bloc!=NULL && at->opentypemode ) { + eblcpos = i; + at->tabdir.tabs[i].tag = CHR('E','B','L','C'); + at->tabdir.tabs[i].data = at->bloc; + at->tabdir.tabs[i++].length = at->bloclen; + } + + if ( at->ebsc!=NULL ) { + at->tabdir.tabs[i].tag = CHR('E','B','S','C'); + at->tabdir.tabs[i].data = at->ebsc; + at->tabdir.tabs[i++].length = at->ebsclen; + } + + if ( at->gdef!=NULL ) { + at->tabdir.tabs[i].tag = CHR('G','D','E','F'); + at->tabdir.tabs[i].data = at->gdef; + at->tabdir.tabs[i++].length = at->gdeflen; + } + + if ( at->gpos!=NULL ) { + at->tabdir.tabs[i].tag = CHR('G','P','O','S'); + at->tabdir.tabs[i].data = at->gpos; + at->tabdir.tabs[i++].length = at->gposlen; + } + + if ( at->gsub!=NULL ) { + at->tabdir.tabs[i].tag = CHR('G','S','U','B'); + at->tabdir.tabs[i].data = at->gsub; + at->tabdir.tabs[i++].length = at->gsublen; + } + + at->tabdir.tabs[i].tag = CHR('O','S','/','2'); + at->tabdir.tabs[i].data = at->os2f; + at->tabdir.tabs[i++].length = at->os2len; + + if ( at->pfed!=NULL ) { + at->tabdir.tabs[i].tag = CHR('P','f','E','d'); + at->tabdir.tabs[i].data = at->pfed; + at->tabdir.tabs[i++].length = at->pfedlen; + } + + if ( at->vorgf!=NULL ) { + at->tabdir.tabs[i].tag = CHR('V','O','R','G'); + at->tabdir.tabs[i].data = at->vorgf; + at->tabdir.tabs[i++].length = at->vorglen; + } + + if ( at->acnt!=NULL ) { + at->tabdir.tabs[i].tag = CHR('a','c','n','t'); + at->tabdir.tabs[i].data = at->acnt; + at->tabdir.tabs[i++].length = at->acntlen; + } + + if ( at->bdat!=NULL && at->applemode ) { + at->tabdir.tabs[i].tag = CHR('b','d','a','t'); + if ( !at->opentypemode ) { + at->tabdir.tabs[i].data = at->bdat; + at->tabdir.tabs[i++].length = at->bdatlen; + } else { + at->tabdir.tabs[i].data = NULL; + at->tabdir.tabs[i].dup_of = ebdtpos; + at->tabdir.tabs[i++].length = at->tabdir.tabs[ebdtpos].length; + } + } + + if ( format==ff_none && at->applemode ) { + /* Bitmap only fonts get a bhed table rather than a head */ + at->tabdir.tabs[i].tag = CHR('b','h','e','d'); + at->tabdir.tabs[i].data = at->headf; + at->tabdir.tabs[i++].length = at->headlen; + } + + if ( at->bloc!=NULL && at->applemode ) { + at->tabdir.tabs[i].tag = CHR('b','l','o','c'); + if ( !at->opentypemode ) { + at->tabdir.tabs[i].data = at->bloc; + at->tabdir.tabs[i++].length = at->bloclen; + } else { + at->tabdir.tabs[i].data = NULL; + at->tabdir.tabs[i].dup_of = eblcpos; + at->tabdir.tabs[i++].length = at->tabdir.tabs[eblcpos].length; + } + } + + at->tabdir.tabs[i].tag = CHR('c','m','a','p'); + at->tabdir.tabs[i].data = at->cmap; + at->tabdir.tabs[i++].length = at->cmaplen; + + if ( format!=ff_otf && format!=ff_otfcid && format!=ff_none ) { + if ( at->cvtf!=NULL ) { + at->tabdir.tabs[i].tag = CHR('c','v','t',' '); + at->tabdir.tabs[i].data = at->cvtf; + at->tabdir.tabs[i++].length = at->cvtlen; + } + } + + if ( at->feat!=NULL ) { + at->tabdir.tabs[i].tag = CHR('f','e','a','t'); + at->tabdir.tabs[i].data = at->feat; + at->tabdir.tabs[i++].length = at->featlen; + } + + if ( at->fpgmf!=NULL ) { + at->tabdir.tabs[i].tag = CHR('f','p','g','m'); + at->tabdir.tabs[i].data = at->fpgmf; + at->tabdir.tabs[i++].length = at->fpgmlen; + } + + if ( at->gaspf!=NULL ) { + at->tabdir.tabs[i].tag = CHR('g','a','s','p'); + at->tabdir.tabs[i].data = at->gaspf; + at->tabdir.tabs[i++].length = at->gasplen; + } + + if ( at->gi.glyphs!=NULL ) { + at->tabdir.tabs[i].tag = CHR('g','l','y','f'); + at->tabdir.tabs[i].data = at->gi.glyphs; + at->tabdir.tabs[i++].length = at->gi.glyph_len; + } + + if ( format!=ff_none || !at->applemode ) { + at->tabdir.tabs[i].tag = CHR('h','e','a','d'); + at->tabdir.tabs[i].data = at->headf; + at->tabdir.tabs[i++].length = at->headlen; + } + + at->tabdir.tabs[i].tag = CHR('h','h','e','a'); + at->tabdir.tabs[i].data = at->hheadf; + at->tabdir.tabs[i++].length = at->hheadlen; + + at->tabdir.tabs[i].tag = CHR('h','m','t','x'); + at->tabdir.tabs[i].data = at->gi.hmtx; + at->tabdir.tabs[i++].length = at->gi.hmtxlen; + + if ( at->kern!=NULL ) { + at->tabdir.tabs[i].tag = CHR('k','e','r','n'); + at->tabdir.tabs[i].data = at->kern; + at->tabdir.tabs[i++].length = at->kernlen; + } + + if ( at->lcar!=NULL ) { + at->tabdir.tabs[i].tag = CHR('l','c','a','r'); + at->tabdir.tabs[i].data = at->lcar; + at->tabdir.tabs[i++].length = at->lcarlen; + } + + if ( at->loca!=NULL ) { + at->tabdir.tabs[i].tag = CHR('l','o','c','a'); + at->tabdir.tabs[i].data = at->loca; + at->tabdir.tabs[i++].length = at->localen; + } + + at->tabdir.tabs[i].tag = CHR('m','a','x','p'); + at->tabdir.tabs[i].data = at->maxpf; + at->tabdir.tabs[i++].length = at->maxplen; + + if ( at->morx!=NULL ) { + at->tabdir.tabs[i].tag = CHR('m','o','r','x'); + at->tabdir.tabs[i].data = at->morx; + at->tabdir.tabs[i++].length = at->morxlen; + } + + at->tabdir.tabs[i].tag = CHR('n','a','m','e'); + at->tabdir.tabs[i].data = at->name; + at->tabdir.tabs[i++].length = at->namelen; + + if ( at->opbd!=NULL ) { + at->tabdir.tabs[i].tag = CHR('o','p','b','d'); + at->tabdir.tabs[i].data = at->opbd; + at->tabdir.tabs[i++].length = at->opbdlen; + } + + at->tabdir.tabs[i].tag = CHR('p','o','s','t'); + at->tabdir.tabs[i].data = at->post; + at->tabdir.tabs[i++].length = at->postlen; + + if ( format!=ff_otf && format!=ff_otfcid && format!=ff_none ) { + if ( at->prepf!=NULL ) { + at->tabdir.tabs[i].tag = CHR('p','r','e','p'); + at->tabdir.tabs[i].data = at->prepf; + at->tabdir.tabs[i++].length = at->preplen; + } + } + + if ( at->prop!=NULL ) { + at->tabdir.tabs[i].tag = CHR('p','r','o','p'); + at->tabdir.tabs[i].data = at->prop; + at->tabdir.tabs[i++].length = at->proplen; + } + + if ( at->vheadf!=NULL ) { + at->tabdir.tabs[i].tag = CHR('v','h','e','a'); + at->tabdir.tabs[i].data = at->vheadf; + at->tabdir.tabs[i++].length = at->vheadlen; + + at->tabdir.tabs[i].tag = CHR('v','m','t','x'); + at->tabdir.tabs[i].data = at->gi.vmtx; + at->tabdir.tabs[i++].length = at->gi.vmtxlen; + } + if ( i>=MAX_TAB ) + GDrawIError("Miscalculation of number of tables needed. Up sizeof tabs array in struct tabdir in ttf.h" ); + + at->tabdir.numtab = i; + at->tabdir.searchRange = (i<16?8:i<32?16:i<64?32:64)*16; + at->tabdir.entrySel = (i<16?3:i<32?4:i<64?5:6); + at->tabdir.rangeShift = at->tabdir.numtab*16-at->tabdir.searchRange; + for ( i=0; itabdir.numtab; ++i ) { + struct taboff *tab = &at->tabdir.tabs[i]; + at->tabdir.ordered[i] = tab; + /* This is the ordering of tables in ARIAL. I've no idea why it makes a */ +/* difference to order them, time to do a seek seems likely to be small, but */ +/* other people make a big thing about ordering them so I'll do it. */ +/* I got bored after glyph. Adobe follows the same scheme for their otf fonts */ +/* so at least the world is consistant */ +/* On the other hand, MS Font validator has a different idea. Oh well */ + tab->orderingval = tab->tag==CHR('h','e','a','d')? 1 : + tab->tag==CHR('h','h','e','a')? 2 : + tab->tag==CHR('m','a','x','p')? 3 : + tab->tag==CHR('O','S','/','2')? 4 : + tab->tag==CHR('g','a','s','p')? 5 : + tab->tag==CHR('n','a','m','e')? 6 : + tab->tag==CHR('c','m','a','p')? 7 : + tab->tag==CHR('l','o','c','a')? 8 : + tab->tag==CHR('C','F','F',' ')? 8 : + tab->tag==CHR('L','T','S','H')? 9 : + tab->tag==CHR('V','D','M','X')? 10 : + tab->tag==CHR('p','r','e','p')? 11 : + tab->tag==CHR('f','p','g','m')? 12 : + tab->tag==CHR('c','v','t',' ')? 13 : + tab->tag==CHR('h','m','t','x')? 14 : + tab->tag==CHR('h','m','d','x')? 15 : + tab->tag==CHR('g','l','y','f')? 16 : + tab->tag==CHR('G','D','E','F')? 17 : + tab->tag==CHR('G','S','U','B')? 18 : + tab->tag==CHR('G','P','O','S')? 19 : + 20; + } + + qsort(at->tabdir.ordered,at->tabdir.numtab,sizeof(struct taboff *),tcomp); + + offset = sizeof(int32)+4*sizeof(int16) + at->tabdir.numtab*4*sizeof(int32); + for ( i=0; itabdir.numtab; ++i ) if ( at->tabdir.ordered[i]->data!=NULL ) { + at->tabdir.ordered[i]->offset = offset; + offset += ((at->tabdir.ordered[i]->length+3)>>2)<<2; + at->tabdir.ordered[i]->checksum = filecheck(at->tabdir.ordered[i]->data); + } + for ( i=0; itabdir.numtab; ++i ) if ( at->tabdir.ordered[i]->data==NULL ) { + struct taboff *tab = &at->tabdir.tabs[at->tabdir.ordered[i]->dup_of]; + at->tabdir.ordered[i]->offset = tab->offset; + at->tabdir.ordered[i]->checksum = tab->checksum; + } +return( true ); +} + +static void dumpttf(FILE *ttf,struct alltabs *at, enum fontformat format) { + int32 checksum; + int i, head_index=-1; + /* I can't use fwrite because I (may) have to byte swap everything */ + + putlong(ttf,at->tabdir.version); + putshort(ttf,at->tabdir.numtab); + putshort(ttf,at->tabdir.searchRange); + putshort(ttf,at->tabdir.entrySel); + putshort(ttf,at->tabdir.rangeShift); + for ( i=0; itabdir.numtab; ++i ) { + if ( at->tabdir.tabs[i].tag==CHR('h','e','a','d') || at->tabdir.tabs[i].tag==CHR('b','h','e','d') ) + head_index = i; + putlong(ttf,at->tabdir.tabs[i].tag); + putlong(ttf,at->tabdir.tabs[i].checksum); + putlong(ttf,at->tabdir.tabs[i].offset); + putlong(ttf,at->tabdir.tabs[i].length); + } + + for ( i=0; itabdir.numtab; ++i ) if ( at->tabdir.ordered[i]->data!=NULL ) + if ( !ttfcopyfile(ttf,at->tabdir.ordered[i]->data,at->tabdir.ordered[i]->offset)) + at->error = true; + + checksum = filecheck(ttf); + checksum = 0xb1b0afba-checksum; + if ( head_index!=-1 ) + fseek(ttf,at->tabdir.tabs[head_index].offset+2*sizeof(int32),SEEK_SET); + putlong(ttf,checksum); + + /* ttfcopyfile closed all the files (except ttf) */ +} + +static void DumpGlyphToNameMap(char *fontname,SplineFont *sf) { + char *d, *e; + char *newname = galloc(strlen(fontname)+10); + FILE *file; + int i,k,max; + SplineChar *sc; + + strcpy(newname,fontname); + d = strrchr(newname,'/'); + if ( d==NULL ) d=newname; + e = strrchr(d,'.'); + if ( e==NULL ) e = newname+strlen(newname); + strcpy(e,".g2n"); + + file = fopen(newname,"wb"); + if ( file==NULL ) { + fprintf(stderr, "Failed to open glyph to name map file for writing: %s\n", newname ); + free(newname); +return; + } + + if ( sf->subfontcnt==0 ) + max = sf->charcnt; + else { + for ( k=max=0; ksubfontcnt; ++k ) + if ( sf->subfonts[k]->charcnt > max ) + max = sf->subfonts[k]->charcnt; + } + for ( i=0; isubfontcnt==0 ) + sc = sf->chars[i]; + else { + for ( k=0; ksubfontcnt; ++k ) if ( isubfonts[k]->charcnt ) + if ( (sc=sf->subfonts[k]->chars[i])!=NULL ) + break; + } + if ( sc!=NULL && sc->ttf_glyph!=-1 ) { + fprintf( file, "GLYPHID %d\tPSNAME %s", sc->ttf_glyph, sc->name ); + if ( sc->unicodeenc!=-1 ) + fprintf( file, "\tUNICODE %04X", sc->unicodeenc ); + putc('\n',file); + } + } + fclose(file); + free(newname); +} + +static int dumpcff(struct alltabs *at,SplineFont *sf,enum fontformat format, + FILE *cff) { + int ret; + + if ( format==ff_cff ) + ret = dumptype2glyphs(sf,at); + else + ret = dumpcidglyphs(sf,at); + + if ( !ret ) + at->error = true; + else if ( !ttfcopyfile(cff,at->cfff,0)) + at->error = true; +return( !at->error ); +} + +int _WriteTTFFont(FILE *ttf,SplineFont *sf,enum fontformat format, + int32 *bsizes, enum bitmapformat bf,int flags) { + struct alltabs at; + char *oldloc; + int i; + + oldloc = setlocale(LC_NUMERIC,"C"); /* TrueType probably doesn't need this, but OpenType does for floats in dictionaries */ + if ( format==ff_otfcid || format== ff_cffcid ) { + if ( sf->cidmaster ) sf = sf->cidmaster; + } else { + if ( sf->subfontcnt!=0 ) sf = sf->subfonts[0]; + } + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->ttf_glyph = -1; + + memset(&at,'\0',sizeof(struct alltabs)); + at.gi.flags = flags; + at.applemode = (flags&ttf_flag_applemode)?1:0; + at.opentypemode = (flags&ttf_flag_otmode)?1:0; + at.msbitmaps = bsizes!=NULL && !at.applemode && at.opentypemode; + at.otbbitmaps = bsizes!=NULL && bf==bf_otb; + at.gi.onlybitmaps = format==ff_none; + at.gi.bsizes = bsizes; + at.gi.fixed_width = CIDOneWidth(sf); + at.isotf = format==ff_otf || format==ff_otfcid; + at.format = format; + + if ( format==ff_cff || format==ff_cffcid ) { + dumpcff(&at,sf,format,ttf); + } else { + if ( initTables(&at,sf,format,bsizes,bf,flags)) + dumpttf(ttf,&at,format); + } + setlocale(LC_NUMERIC,oldloc); + if ( at.error || ferror(ttf)) +return( 0 ); + +#ifdef __CygWin + /* Modern versions of windows want the execute bit set on a ttf file */ + /* I've no idea what this corresponds to in windows, nor any idea on */ + /* how to set it from the windows UI, but this seems to work */ + { + struct stat buf; + fstat(fileno(ttf),&buf); + fchmod(fileno(ttf),S_IXUSR | buf.st_mode ); + } +#endif + +return( 1 ); +} + +int WriteTTFFont(char *fontname,SplineFont *sf,enum fontformat format, + int32 *bsizes, enum bitmapformat bf,int flags) { + FILE *ttf; + int ret; + + if (( ttf=fopen(fontname,"wb+"))==NULL ) +return( 0 ); + ret = _WriteTTFFont(ttf,sf,format,bsizes,bf,flags); + if ( ret && glyph_2_name_map ) + DumpGlyphToNameMap(fontname,sf); + if ( fclose(ttf)==-1 ) +return( 0 ); +return( ret ); +} + +/* Fontograpgher also generates: fpgm, hdmx, prep */ diff --git a/fontforge/tottfaat.c b/fontforge/tottfaat.c new file mode 100644 index 00000000..1cd75991 --- /dev/null +++ b/fontforge/tottfaat.c @@ -0,0 +1,2013 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include + +#include "ttf.h" + +/* This file contains routines to create some of the Apple Advanced Typography Tables */ +/* (or GX fonts) */ + +/* ************************************************************************** */ +/* ************************* The 'acnt' table ************************* */ +/* ************************************************************************** */ + +void aat_dumpacnt(struct alltabs *at, SplineFont *sf) { +} + +/* ************************************************************************** */ +/* ************************* The 'kern' table ************************* */ +/* ************************************************************************** */ + + +/* Apple's docs imply that kerning info is always provided left to right, even*/ +/* for right to left scripts. If that be so then we need code in here to reverse */ +/* the order of the characters for right to left since pfaedit's convention */ +/* is to follow writing order rather than to go left to right */ + + +static void DumpKernClass(FILE *file, uint16 *class,int cnt,int add,int mul) { + int i, first=-1, last; + + for ( i=0; iscript_lang[sli]; + + for ( i=0; sr[i].script!=0; ++i ) + for ( j=0; sr[i].langs[j]!=0; ++j ) + if ( sr[i].langs[j]==DEFAULT_LANG ) +return( true ); + +return( false ); +} + +static int morx_dumpASM(FILE *temp,ASM *sm, struct alltabs *at, SplineFont *sf ); + +void ttf_dumpkerns(struct alltabs *at, SplineFont *sf) { + int i, cnt, vcnt, j, k, m, kccnt=0, vkccnt=0, ksm=0, c, mh, mv; + KernPair *kp; + KernClass *kc; + ASM *sm; + uint16 *glnum, *offsets; + int version; + int isv; + +#if 0 + /* I'm told that at most 2048 kern pairs are allowed in a ttf font */ + /* ... but can't find any data to back up that claim */ + threshold = KernThreshold(sf,2048); +#endif + + cnt = mh = vcnt = mv = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + j = 0; + for ( kp = sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) + if ( kp->off!=0 ) + ++cnt, ++j; + if ( j>mh ) mh=j; + j=0; + for ( kp = sf->chars[i]->vkerns; kp!=NULL; kp=kp->next ) + if ( kp->off!=0 ) + ++vcnt, ++j; + if ( j>mv ) mv=j; + } + if ( at->applemode ) { /* if we aren't outputting Apple's extensions to kerning (by classes, and by state machine) then don't check for those extensions */ + for ( kc=sf->kerns; kc!=NULL; kc = kc->next ) if ( SLIHasDefault(sf,kc->sli) ) + ++kccnt; + for ( kc=sf->vkerns; kc!=NULL; kc = kc->next ) if ( SLIHasDefault(sf,kc->sli) ) + ++vkccnt; + for ( sm=sf->sm; sm!=NULL; sm=sm->next ) + if ( sm->type == asm_kern ) + ++ksm; + } + if ( cnt==0 && kccnt==0 && vcnt==0 && vkccnt==0 && ksm==0 ) +return; + + /* Old kerning format (version 0) uses 16 bit quantities */ + /* Apple's new format (version 0x00010000) uses 32 bit quantities */ + at->kern = tmpfile(); + if ( kccnt==0 && vkccnt==0 && ksm==0 ) { + /* MS does not support format 1,2,3 kern sub-tables so if we have them */ + /* we might as well admit that this table is for apple only and use */ + /* the new format apple recommends. Otherwise, use the old format */ + putshort(at->kern,0); /* version */ + putshort(at->kern,(cnt!=0)+(vcnt!=0)); /* number of subtables */ + version = 0; + } else { + putlong(at->kern,0x00010000); + putlong(at->kern,kccnt+vkccnt+(cnt!=0)+(vcnt!=0)+ksm); + version = 1; + } + for ( isv=0; isv<2; ++isv ) { + c = isv ? vcnt : cnt; + m = isv ? mv : mh; + if ( c!=0 ) { + if ( version==0 ) { + putshort(at->kern,0); /* subtable version */ + putshort(at->kern,(7+3*c)*sizeof(uint16)); /* subtable length */ + putshort(at->kern,!isv); /* coverage, flags=hor/vert&format=0 */ + } else { + putlong(at->kern,(8+3*c)*sizeof(uint16)); /* subtable length */ + /* Apple's new format has a completely different coverage format */ + putshort(at->kern,isv?0x8000:0);/* format 0, horizontal/vertical flags (coverage) */ + putshort(at->kern,0); /* tuple index, whatever that means */ + } + putshort(at->kern,c); + for ( i=1,j=0; i<=c; i<<=1, ++j ); + i>>=1; --j; + putshort(at->kern,i*6); /* binary search headers */ + putshort(at->kern,j); + putshort(at->kern,6*(i-c)); + + glnum = galloc(m*sizeof(uint16)); + offsets = galloc(m*sizeof(uint16)); + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + m = 0; + for ( kp = isv ? sf->chars[i]->vkerns : sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) { + if ( kp->off!=0 ) { + /* order the pairs */ + for ( j=0; jsc->ttf_glyphj; --k ) { + glnum[k] = glnum[k-1]; + offsets[k] = offsets[k-1]; + } + glnum[j] = kp->sc->ttf_glyph; + offsets[j] = kp->off; + ++m; + } + } + for ( j=0; jkern,sf->chars[i]->ttf_glyph); + putshort(at->kern,glnum[j]); + putshort(at->kern,offsets[j]); + } + } + free(offsets); + free(glnum); + } + } + + for ( isv=0; isv<2; ++isv ) { + for ( kc=isv ? sf->vkerns : sf->kerns; kc!=NULL; kc=kc->next ) if ( SLIHasDefault(sf,kc->sli) ) { + /* If we are here, we must be using version 1 */ + uint32 len_pos = ftell(at->kern), pos; + uint16 *class1, *class2; + + putlong(at->kern,0); /* subtable length */ + putshort(at->kern,isv?0x8002:2); /* format 2, horizontal/vertical flags (coverage) */ + putshort(at->kern,0); /* tuple index, whatever that means */ + + putshort(at->kern,sizeof(uint16)*kc->second_cnt); + putshort(at->kern,0); /* left classes */ + putshort(at->kern,0); /* right classes */ + putshort(at->kern,16); /* Offset to array, next byte */ + for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) + putshort(at->kern,kc->offsets[i]); + + pos = ftell(at->kern); + fseek(at->kern,len_pos+10,SEEK_SET); + putshort(at->kern,pos-len_pos); + fseek(at->kern,pos,SEEK_SET); + class1 = ClassesFromNames(sf,kc->firsts,kc->first_cnt,at->maxp.numGlyphs,NULL); + DumpKernClass(at->kern,class1,at->maxp.numGlyphs,16,sizeof(uint16)*kc->second_cnt); + free(class1); + + pos = ftell(at->kern); + fseek(at->kern,len_pos+12,SEEK_SET); + putshort(at->kern,pos-len_pos); + fseek(at->kern,pos,SEEK_SET); + class2 = ClassesFromNames(sf,kc->seconds,kc->second_cnt,at->maxp.numGlyphs,NULL); + DumpKernClass(at->kern,class2,at->maxp.numGlyphs,0,sizeof(uint16)); + free(class2); + + pos = ftell(at->kern); + fseek(at->kern,len_pos,SEEK_SET); + putlong(at->kern,pos-len_pos); + fseek(at->kern,pos,SEEK_SET); + } + } + + if ( ksm!=0 ) { + for ( sm=sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type == asm_kern ) { + uint32 len_pos = ftell(at->kern), pos; + + putlong(at->kern,0); /* subtable length */ + putshort(at->kern,(sm->flags&0x8000)?0x8001:1); /* format 2, horizontal/vertical flags (coverage) */ + putshort(at->kern,0); /* tuple index, whatever that means */ + morx_dumpASM(at->kern,sm,at,sf); + + pos = ftell(at->kern); + fseek(at->kern,len_pos,SEEK_SET); + putlong(at->kern,pos-len_pos); + fseek(at->kern,pos,SEEK_SET); + } + } + + at->kernlen = ftell(at->kern); + if ( at->kernlen&2 ) + putshort(at->kern,0); /* pad it */ +} + +/* ************************************************************************** */ +/* ************************* The 'lcar' table ************************* */ +/* ************************************************************************** */ + +static PST *haslcaret(SplineChar *sc) { + PST *pst; int j; + + for ( pst=sc->possub; pst!=NULL && pst->type!=pst_lcaret; pst=pst->next ); + if ( pst!=NULL ) { + for ( j=pst->u.lcaret.cnt-1; j>=0 && pst->u.lcaret.carets[j]==0; --j ); + if ( j==-1 ) + pst = NULL; + } +return( pst ); +} + +void aat_dumplcar(struct alltabs *at, SplineFont *sf) { + int i, j, k, l, seg_cnt, tot, last, offset; + PST *pst; + FILE *lcar=NULL; + /* We do four passes. The first just calculates how much space we will need */ + /* the second provides the top-level lookup table structure */ + /* the third provides the arrays of offsets needed for type 4 lookup tables */ + /* the fourth provides the actual data on the ligature carets */ + + for ( k=0; k<4; ++k ) { + for ( i=seg_cnt=tot=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 && + (pst = haslcaret(sf->chars[i]))!=NULL ) { + if ( k==1 ) + tot = 0; + else if ( k==2 ) { + putshort(lcar,offset); + offset += 2 + 2*pst->u.lcaret.cnt; + } else if ( k==3 ) { + putshort(lcar,pst->u.lcaret.cnt); + for ( l=0; lu.lcaret.cnt; ++l ) + putshort(lcar,pst->u.lcaret.carets[l]); + } + last = i; + for ( j=i+1, ++tot; jcharcnt; ++j ) if ( sf->chars[j]!=NULL && sf->chars[j]->ttf_glyph!=-1 ) { + if ( (pst = haslcaret(sf->chars[j]))== NULL ) + break; + ++tot; + last = j; + if ( k==2 ) { + putshort(lcar,offset); + offset += 2 + 2*pst->u.lcaret.cnt; + } else if ( k==3 ) { + putshort(lcar,pst->u.lcaret.cnt); + for ( l=0; lu.lcaret.cnt; ++l ) + putshort(lcar,pst->u.lcaret.carets[l]); + } + } + if ( k==1 ) { + putshort(lcar,sf->chars[last]->ttf_glyph); + putshort(lcar,sf->chars[i]->ttf_glyph); + putshort(lcar,offset); + offset += 2*tot; + } + ++seg_cnt; + i = j-1; + } + if ( k==0 ) { + if ( seg_cnt==0 ) +return; + lcar = tmpfile(); + putlong(lcar, 0x00010000); /* version */ + putshort(lcar,0); /* data are distances (not points) */ + + putshort(lcar,4); /* Lookup table format 4 */ + /* Binary search header */ + putshort(lcar,6); /* Entry size */ + putshort(lcar,seg_cnt); /* Number of segments */ + for ( j=0,l=1; l<=seg_cnt; l<<=1, ++j ); + --j; l>>=1; + putshort(lcar,6*l); + putshort(lcar,j); + putshort(lcar,6*(seg_cnt-l)); + offset = 4+7*2 + seg_cnt*6 + 6; + } else if ( k==1 ) { /* flag entry */ + putshort(lcar,0xffff); + putshort(lcar,0xffff); + putshort(lcar,0); + } + } + at->lcar = lcar; + at->lcarlen = ftell(at->lcar); + if ( at->lcarlen&2 ) + putshort(at->lcar,0); +} + +/* ************************************************************************** */ +/* ************************* The 'morx' table ************************* */ +/* ************************* (and 'feat') ************************* */ +/* ************************************************************************** */ + +/* I'm also going to break ligatures up into seperate sub-tables depending on */ +/* script, so again there may be multiple tags */ +/* (only the default language will be used) */ +struct feature { + uint32 otftag; + int16 featureType, featureSetting; + MacFeat *mf, *smf; + struct macsetting *ms, *sms; + unsigned int vertOnly: 1; + unsigned int r2l: 1; /* I think this is the "descending" flag */ + unsigned int needsOff: 1; + unsigned int singleMutex: 1; + uint8 subtable_type; + int chain; + int32 flag, offFlags; + uint32 feature_start; + uint32 feature_len; /* Does not include header yet */ + struct feature *next; +}; + +static struct feature *featureFromTag(SplineFont *sf, uint32 tag); + +static void morxfeaturesfree(struct feature *features) { + struct feature *n; + + for ( ; features!=NULL; features=n ) { + n = features->next; + chunkfree( features,sizeof(*features) ); + } +} + +static void mort_classes(FILE *temp,SplineFont *sf) { + int first, last, i, cnt; + /* Mort tables just have a trimmed byte array for the classes */ + + for ( first=0; firstcharcnt; ++first ) if ( sf->chars[first]!=NULL && sf->chars[first]->lsidebearing!=1 ) + break; + for ( last=sf->charcnt-1; last>first; --last ) if ( sf->chars[last]!=NULL && sf->chars[last]->lsidebearing!=1 ) + break; + cnt = 0; + for ( i=first; i<=last; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) + ++cnt; + + putshort(temp,sf->chars[first]->ttf_glyph); + putshort(temp,cnt); + for ( i=first; i<=last; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) + putc(sf->chars[i]->lsidebearing,temp); + if ( cnt&1 ) + putc(1,temp); /* Pad to a word boundary */ +} + +static void morx_lookupmap(FILE *temp,SplineChar **glyphs,uint16 *maps,int gcnt) { + int i, j, k, l, seg_cnt, tot, last, offset; + /* We do four passes. The first just calculates how much space we will need (if any) */ + /* the second provides the top-level lookup table structure */ + /* the third provides the arrays of offsets needed for type 4 lookup tables */ + + for ( k=0; k<3; ++k ) { + for ( i=seg_cnt=tot=0; ittf_glyph==glyphs[i]->ttf_glyph+j-i; ++j ) { + ++tot; + last = j; + if ( k==2 ) { + putshort(temp,maps[j]); + } + } + if ( k==1 ) { + putshort(temp,glyphs[last]->ttf_glyph); + putshort(temp,glyphs[i]->ttf_glyph); + putshort(temp,offset); + offset += 2*tot; + } + ++seg_cnt; + i = j-1; + } + if ( k==0 ) { + putshort(temp,4); /* Lookup table format 4 */ + /* Binary search header */ + putshort(temp,6); /* Entry size */ + putshort(temp,seg_cnt); /* Number of segments */ + for ( j=0,l=1; l<=seg_cnt; l<<=1, ++j ); + --j; l>>=1; + putshort(temp,6*l); + putshort(temp,j); + putshort(temp,6*(seg_cnt-l)); + if ( seg_cnt==0 ) +return; + offset = 6*2 + seg_cnt*6 + 6; + } else if ( k==1 ) { /* flag entry */ + putshort(temp,0xffff); + putshort(temp,0xffff); + putshort(temp,0); + } + } +} + +static void morx_dumpSubsFeature(FILE *temp,SplineChar **glyphs,uint16 *maps,int gcnt) { + morx_lookupmap(temp,glyphs,maps,gcnt); +} + +static int HasDefaultLang(SplineFont *sf,PST *lig,uint32 script) { + int i, j; + struct script_record *sr; + + if ( lig->script_lang_index==SLI_NESTED ) +return( false ); + + if ( sf->cidmaster ) sf = sf->cidmaster; + sr = sf->script_lang[lig->script_lang_index]; + for ( i=0; sr[i].script!=0; ++i ) { + if ( script==0 || script==sr[i].script ) { + for ( j=0; sr[i].langs[j]!=0; ++j ) + if ( sr[i].langs[j]==DEFAULT_LANG ) +return( true ); + if ( script!=0 ) +return( false ); + } + } +return( false ); +} + +static struct feature *aat_dumpmorx_substitutions(struct alltabs *at, SplineFont *sf, + FILE *temp, struct feature *features) { + int i, max, cnt, j, k, gcnt; + uint32 *subtags; + int ft, fs; + SplineChar *sc, *msc, **glyphs; + uint16 *maps; + struct feature *cur; + PST *pst; + + max = 30; cnt = 0; + subtags = galloc(max*sizeof(uint32)); + + for ( i=0; icharcnt; ++i ) if ( (sc = sf->chars[i])!=NULL && sc->ttf_glyph!=-1) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) if ( pst->type == pst_substitution ) { + /* Arabic forms (marked by 'isol') are done with a contextual glyph */ + /* substitution subtable (cursive connection) */ + if ( !HasDefaultLang(sf,pst,0) ) + continue; + if ( pst->tag!=CHR('i','s','o','l') && + pst->type!=pst_position && + pst->type!=pst_pair && + pst->type!=pst_lcaret && + (pst->macfeature || OTTagToMacFeature(pst->tag,&ft,&fs))) { + for ( j=cnt-1; j>=0 && subtags[j]!=pst->tag; --j ); + if ( j<0 ) { + if ( cnt>=max ) + subtags = grealloc(subtags,(max+=30)*sizeof(uint32)); + subtags[cnt++] = pst->tag; + } + } + } + } + + if ( cnt!=0 ) { + for ( j=0; jcharcnt; ++i ) if ( (sc = sf->chars[i])!=NULL && sc->ttf_glyph!=-1) { + for ( pst=sc->possub; pst!=NULL && + (pst->tag!=subtags[j] || !HasDefaultLang(sf,pst,0) || + pst->type==pst_position || pst->type==pst_pair || + pst->type==pst_lcaret); pst=pst->next ); + if ( pst!=NULL ) { + if ( k==1 ) { + msc = SFGetCharDup(sf,-1,pst->u.subs.variant); + glyphs[gcnt] = sc; + if ( msc!=NULL && msc->ttf_glyph!=-1 ) { + maps[gcnt++] = msc->ttf_glyph; + } else if ( msc==NULL && + strcmp(pst->u.subs.variant,MAC_DELETED_GLYPH_NAME)==0 ) { + maps[gcnt++] = 0xffff; + } + } else + ++gcnt; + } + } + if ( k==0 ) { + if ( gcnt==0 ) + break; + glyphs = galloc((gcnt+1)*sizeof(SplineChar *)); + maps = galloc((gcnt+1)*sizeof(uint16)); + } else { + glyphs[gcnt] = NULL; maps[gcnt] = 0; + } + } + if ( gcnt==0 ) + continue; + cur = featureFromTag(sf,subtags[j]); + cur->next = features; + features = cur; + cur->subtable_type = 4; + cur->feature_start = ftell(temp); + morx_dumpSubsFeature(temp,glyphs,maps,gcnt); + if ( (ftell(temp)-cur->feature_start)&1 ) + putc('\0',temp); + if ( (ftell(temp)-cur->feature_start)&2 ) + putshort(temp,0); + cur->feature_len = ftell(temp)-cur->feature_start; + free(glyphs); free(maps); + } + } + free(subtags); +return( features); +} + +static LigList *LigListMatchOtfTag(SplineFont *sf,LigList *ligs,uint32 tag) { + LigList *l; + + for ( l=ligs; l!=NULL; l=l->next ) + if ( l->lig->tag == tag && HasDefaultLang(sf,l->lig,0)) +return( l ); +return( NULL ); +} + +static int IsMarkChar( SplineChar *sc ) { + AnchorPoint *ap; + + ap=sc->anchor; + while ( ap!=NULL && (ap->type==at_centry || ap->type==at_cexit) ) + ap = ap->next; + if ( ap!=NULL && (ap->type==at_mark || ap->type==at_basemark) ) +return( true ); + +return( false ); +} + +struct transition { uint16 next_state, dontconsume, ismark, trans_ent; LigList *l; }; +struct trans_entries { uint16 next_state, flags, act_index; LigList *l; }; +static void morx_dumpLigaFeature(FILE *temp,SplineChar **glyphs,int gcnt, + uint32 otf_tag, struct alltabs *at, SplineFont *sf, + int ignoremarks) { + LigList *l; + struct splinecharlist *comp; + uint16 *used = gcalloc(at->maxp.numGlyphs,sizeof(uint16)); + SplineChar **cglyphs; + uint16 *map; + int i,j,k,class, state_max, state_cnt, base, last; + uint32 start; + struct transition **states; + struct trans_entries *trans; + int trans_cnt; + int maxccnt=0; + int acnt, lcnt, charcnt; + uint32 *actions; + uint16 *components, *lig_glyphs; + uint32 here; + struct splinecharlist *scl; + int anymarks; + + /* figure out the classes (one for each character used to make a lig) */ + for ( i=0; ittf_glyph] = true; + for ( l=glyphs[i]->ligofme; l!=NULL; l=l->next ) if ( l->lig->tag==otf_tag ) { + for ( comp = l->components; comp!=NULL; comp=comp->next ) + used[comp->sc->ttf_glyph] = true; + } + } + class = 4; + for ( i=0; imaxp.numGlyphs; ++i ) if ( used[i] ) + used[i] = class++; + anymarks = false; + charcnt = class; + if ( ignoremarks ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + if ( IsMarkChar(sf->chars[i])) { + anymarks = true; + ++charcnt; + used[sf->chars[i]->ttf_glyph] = class; + } + } + if ( anymarks ) + ++class; + } + cglyphs = galloc((charcnt+1)*sizeof(SplineChar *)); + map = galloc((charcnt+1)*sizeof(uint16)); + j=0; + for ( i=k=0; imaxp.numGlyphs; ++i ) if ( used[i] ) { + for ( ; jcharcnt; ++j ) + if ( sf->chars[j]!=NULL && sf->chars[j]->ttf_glyph==i ) + break; + if ( jcharcnt ) { + cglyphs[k] = sf->chars[j]; + map[k++] = used[i]; + } + } + cglyphs[k] = NULL; + + start = ftell(temp); + putlong(temp,class); + putlong(temp,7*sizeof(uint32)); + putlong(temp,0); /* Fill in later */ + putlong(temp,0); + putlong(temp,0); + putlong(temp,0); + putlong(temp,0); + morx_lookupmap(temp,cglyphs,map,k); /* dump the class lookup table */ + free( cglyphs ); free( map ); + here = ftell(temp); + fseek(temp,start+2*sizeof(uint32),SEEK_SET); + putlong(temp,here-start); /* Point to start of state arrays */ + fseek(temp,0,SEEK_END); + + /* Now build the state machine */ + /* Note: the ligofme list is so ordered that the longest ligatures come first */ + /* we will depend on that in the case of "ffl", "ffi", "ff" */ + state_max = 40; state_cnt = 2; + states = galloc(state_max*sizeof(struct transition *)); + states[0] = gcalloc(class,sizeof(struct transition)); /* Initial state */ + states[1] = gcalloc(class,sizeof(struct transition)); /* other Initial state */ + for ( i=0; i=state_max ) + states = grealloc(states,(state_max += 40)*sizeof(struct transition *)); + base = state_cnt; + states[0][used[glyphs[i]->ttf_glyph]].next_state = state_cnt; + states[1][used[glyphs[i]->ttf_glyph]].next_state = state_cnt; + states[state_cnt++] = gcalloc(class,sizeof(struct transition)); + for ( l=glyphs[i]->ligofme; l!=NULL; l=l->next ) if ( l->lig->tag==otf_tag ) { + if ( l->ccnt > maxccnt ) maxccnt = l->ccnt; + last = base; + for ( comp = l->components; comp!=NULL; comp=comp->next ) { + if ( states[last][used[comp->sc->ttf_glyph]].next_state==0 ) { + if ( comp->next==NULL ) + states[last][used[comp->sc->ttf_glyph]].l = l; + else { + states[last][used[comp->sc->ttf_glyph]].next_state = state_cnt; + if ( state_cnt>=state_max ) + states = grealloc(states,(state_max += 40)*sizeof(struct transition *)); + last = state_cnt; + states[state_cnt++] = gcalloc(class,sizeof(struct transition)); + } + } else { + last = states[last][used[comp->sc->ttf_glyph]].next_state; + if ( comp->next==NULL ) { + /* this is where we depend on the ordering */ + for ( j=0; jfl & s+t->st. */ + /* Suppose we get input "fst" */ + /* Now the state machine we've built so far will go to the f branch, see */ + /* the "s" and go back to state 0 */ + /* Obviously that's wrong, we've lost the st. So either we go back to 0 */ + /* but don't advance the glyph, or we take the transition from state 0 */ + /* and copy it to here. The second is easier for me just now */ + for ( i=2; ilig->u.lig.lig->ttf_glyph; + /* component Glyphs get popped off the stack in the reverse order */ + /* so we must built our tables backwards */ + components[acnt+trans[i].l->ccnt-1] = lcnt; + actions[acnt+trans[i].l->ccnt-1] = 0x80000000 | + ((acnt+trans[i].l->ccnt-1 - trans[i].l->first->ttf_glyph)&0x3fffffff); + for ( scl=trans[i].l->components,j=trans[i].l->ccnt-2; scl!=NULL; scl=scl->next, --j ) { + components[acnt+j] = 0; + actions[acnt+j] = (acnt+j - scl->sc->ttf_glyph)&0x3fffffff; + } + trans[i].act_index = acnt; + ++lcnt; + acnt += trans[i].l->ccnt; + } + + /* Now we know how big all the tables will be. Dump out their locations */ + here = ftell(temp); + fseek(temp,start+3*sizeof(uint32),SEEK_SET); + putlong(temp,here-start); /* Point to start of entry array */ + putlong(temp,here-start+6*trans_cnt); /* Point to start of actions */ + putlong(temp,here-start+6*trans_cnt+4*acnt);/* Point to start of components */ + putlong(temp,here-start+6*trans_cnt+6*acnt);/* Point to start of ligatures */ + fseek(temp,0,SEEK_END); + + /* Now dump the transitions */ + for ( i=0; icharcnt; ++i ) if ( (sc = sf->chars[i])!=NULL && sc->ttf_glyph!=-1) { + for ( l=sc->ligofme; l!=NULL; l=l->next ) { + if ( HasDefaultLang(sf,l->lig,0) && + (l->lig->macfeature || OTTagToMacFeature(l->lig->tag,&ft,&fs))) { + for ( j=cnt-1; j>=0 && ligtags[j]!=l->lig->tag; --j ); + if ( j<0 ) { + if ( cnt>=max ) + ligtags = grealloc(ligtags,(max+=30)*sizeof(uint32)); + ligtags[cnt++] = l->lig->tag; + } + } + } + } + if ( cnt==0 ) { + free( ligtags ); + SFLigatureCleanup(sf); +return( features); + } + + glyphs = galloc((at->maxp.numGlyphs+1)*sizeof(SplineChar *)); + for ( j=0; jcharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->ticked = false; + for ( i=0; icharcnt; ++i ) + if ( (sc=sf->chars[i])!=NULL && !sc->ticked && + (l = LigListMatchOtfTag(sf,sc->ligofme,ligtags[j]))!=NULL ) { + uint32 script = SCScriptFromUnicode(sc); + int ignoremarks = l->lig->flags & pst_ignorecombiningmarks ? 1 : 0 ; + for ( k=i, gcnt=0; kcharcnt; ++k ) + if ( (ssc=sf->chars[k])!=NULL && !ssc->ticked && + SCScriptFromUnicode(ssc) == script && + LigListMatchOtfTag(sf,ssc->ligofme,ligtags[j])) { + glyphs[gcnt++] = ssc; + ssc->ticked = true; + } + glyphs[gcnt] = NULL; + cur = featureFromTag(sf,ligtags[j]); + cur->next = features; + features = cur; + cur->subtable_type = 2; /* ligature */ + cur->feature_start = ftell(temp); + morx_dumpLigaFeature(temp,glyphs,gcnt,ligtags[j],at,sf,ignoremarks); + if ( (ftell(temp)-cur->feature_start)&1 ) + putc('\0',temp); + if ( (ftell(temp)-cur->feature_start)&2 ) + putshort(temp,0); + cur->feature_len = ftell(temp)-cur->feature_start; + cur->r2l = SCRightToLeft(sc); + } + } + + free(glyphs); + free(ligtags); + SFLigatureCleanup(sf); +return( features); +} + +static void morx_dumpnestedsubs(FILE *temp,SplineFont *sf,uint32 tag) { + int i, j, gcnt; + PST *pst; + SplineChar **glyphs, *sc; + uint16 *map; + + for ( j=0; j<2; ++j ) { + gcnt = 0; + for ( i = 0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( pst=sf->chars[i]->possub; + pst!=NULL && (pst->tag!=tag || pst->script_lang_index!=SLI_NESTED); + pst=pst->next ); + if ( pst!=NULL && pst->type==pst_substitution && + (sc=SFGetCharDup(sf,-1,pst->u.subs.variant))!=NULL && + sc->ttf_glyph!=-1 ) { + if ( j ) { + glyphs[gcnt] = sf->chars[i]; + map[gcnt] = sc->ttf_glyph; + } + ++gcnt; + } + } + if ( !j ) { + glyphs = galloc((gcnt+1)*sizeof(SplineChar *)); + map = galloc(gcnt*sizeof(uint16)); + glyphs[gcnt] = NULL; + } + } + morx_lookupmap(temp,glyphs,map,gcnt); + free(glyphs); + free(map); +} + +static uint16 *NamesToGlyphs(SplineFont *sf,char *names,uint16 *cnt) { + char *pt, *start; + int c, ch; + uint16 *ret; + SplineChar *sc; + + for ( c=0, pt=names; *pt; ++pt ) + if ( *pt==' ' ) ++c; + ret = galloc((c+1)*sizeof(uint16)); + + for ( c=0, pt=names; *pt; ) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + start = pt; + while ( *pt!=' ' && *pt!='\0' ) ++pt; + ch = *pt; *pt='\0'; + sc = SFGetCharDup(sf,-1,start); + *pt = ch; + if ( sc!=NULL && sc->ttf_glyph!=-1 ) + ret[c++] = sc->ttf_glyph; + } + *cnt = c; +return( ret ); +} + +static int morx_dumpASM(FILE *temp,ASM *sm, struct alltabs *at, SplineFont *sf ) { + int i, j, k, gcnt, ch; + char *pt, *end; + uint16 *map; + SplineChar **glyphs, *sc; + int stcnt, tcnt; + struct ins { char *names; uint16 len,pos; uint16 *glyphs; } *subsins=NULL; + uint32 *substags=NULL; + uint32 start, here, substable_pos, state_offset; + struct transdata { uint16 transition, mark_index, cur_index; } *transdata; + struct trans { uint16 ns, flags, mi, ci; } *trans; + int ismort = sm->type == asm_kern; + FILE *kernvalues; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) + sf->chars[i]->lsidebearing = 1; + + gcnt = 0; + for ( i=4; iclass_cnt; ++i ) { + for ( pt = sm->classes[i]; ; pt=end ) { + while ( *pt==' ' ) ++pt; + if ( *pt=='\0' ) + break; + for ( end=pt; *end!='\0' && *end!=' '; ++end ); + ch = *end; *end = '\0'; + sc = SFGetCharDup(sf,-1,pt); + *end = ch; + if ( sc!=NULL ) { + sc->lsidebearing = i; + ++gcnt; + } + } + } + glyphs = galloc((gcnt+1)*sizeof(SplineChar *)); + map = galloc((gcnt+1)*sizeof(uint16)); + gcnt = 0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->lsidebearing!=1 ) { + glyphs[gcnt] = sf->chars[i]; + map[gcnt++] = sf->chars[i]->lsidebearing; + } + glyphs[gcnt] = NULL; + + /* Give each subs tab an index into the mac's substitution lookups */ + transdata = gcalloc(sm->state_cnt*sm->class_cnt,sizeof(struct transdata)); + stcnt = 0; + substags = NULL; subsins = NULL; + if ( sm->type==asm_context ) { + substags = galloc(2*sm->state_cnt*sm->class_cnt*sizeof(uint32)); + for ( j=0; jstate_cnt*sm->class_cnt; ++j ) { + struct asm_state *this = &sm->state[j]; + transdata[j].mark_index = transdata[j].cur_index = 0xffff; + if ( this->u.context.mark_tag!=0 ) { + for ( i=0; iu.context.mark_tag ) + break; + if ( i==stcnt ) + substags[stcnt++] = this->u.context.mark_tag; + transdata[j].mark_index = i; + } + if ( this->u.context.cur_tag!=0 ) { + for ( i=0; iu.context.cur_tag ) + break; + if ( i==stcnt ) + substags[stcnt++] = this->u.context.cur_tag; + transdata[j].cur_index = i; + } + } + } else if ( sm->type==asm_insert ) { + subsins = galloc(2*sm->state_cnt*sm->class_cnt*sizeof(struct ins)); + for ( j=0; jstate_cnt*sm->class_cnt; ++j ) { + struct asm_state *this = &sm->state[j]; + transdata[j].mark_index = transdata[j].cur_index = 0xffff; + if ( this->u.insert.mark_ins!=0 ) { + for ( i=0; iu.insert.mark_ins)==0 ) + break; + if ( i==stcnt ) { + subsins[stcnt].pos = stcnt==0 ? 0 : subsins[stcnt-1].pos + + subsins[stcnt-1].len; + subsins[stcnt].names = this->u.insert.mark_ins; + subsins[stcnt].glyphs = NamesToGlyphs(sf,subsins[stcnt].names,&subsins[stcnt].len); + ++stcnt; + } + transdata[j].mark_index = subsins[i].pos; + } + if ( this->u.insert.cur_ins!=0 ) { + for ( i=0; iu.insert.cur_ins)==0 ) + break; + if ( i==stcnt ) { + subsins[stcnt].pos = stcnt==0 ? 0 : subsins[stcnt-1].pos + + subsins[stcnt-1].len; + subsins[stcnt].names = this->u.insert.cur_ins; + subsins[stcnt].glyphs = NamesToGlyphs(sf,subsins[stcnt].names,&subsins[stcnt].len); + ++stcnt; + } + transdata[j].cur_index = subsins[i].pos; + } + } + } else if ( sm->type==asm_kern ) { + int off=0; + kernvalues = tmpfile(); + for ( j=0; jstate_cnt*sm->class_cnt; ++j ) { + struct asm_state *this = &sm->state[j]; + transdata[j].mark_index = 0xffff; + if ( this->u.kern.kcnt!=0 ) { + for ( k=0; kstate[k].u.kern.kcnt==this->u.kern.kcnt && + memcmp(sm->state[k].u.kern.kerns,this->u.kern.kerns, + this->u.kern.kcnt*sizeof(int16))==0 ) + break; + if ( k!=j ) + transdata[j].mark_index = transdata[k].mark_index; + else { + transdata[j].mark_index = off; + off += this->u.kern.kcnt*sizeof(int16); + /* kerning values must be output backwards */ + for ( k=this->u.kern.kcnt-1; k>=1; --k ) + putshort(kernvalues,this->u.kern.kerns[k]&~1); + /* And the last one must be odd */ + putshort(kernvalues,this->u.kern.kerns[0]|1); + } + } + } + } + + trans = galloc(sm->state_cnt*sm->class_cnt*sizeof(struct trans)); + tcnt = 0; + for ( j=0; jstate_cnt*sm->class_cnt; ++j ) { + struct asm_state *this = &sm->state[j]; + for ( i=0; inext_state && trans[i].flags==this->flags && + trans[i].mi==transdata[j].mark_index && + trans[i].ci==transdata[j].cur_index ) + break; + if ( i==tcnt ) { + trans[tcnt].ns = this->next_state; + trans[tcnt].flags = this->flags; + trans[tcnt].mi = transdata[j].mark_index; + trans[tcnt++].ci = transdata[j].cur_index; + } + transdata[j].transition = i; + } + + + /* Output the header */ + start = ftell(temp); + if ( ismort /* old format still used for kerning */ ) { + putshort(temp,sm->class_cnt); + putshort(temp,5*sizeof(uint16)); /* class offset */ + putshort(temp,0); /* state offset */ + putshort(temp,0); /* transition entry offset */ + putshort(temp,0); /* kerning values offset */ + mort_classes(temp,sf); /* dump the class table */ + } else { + putlong(temp,sm->class_cnt); + if ( sm->type==asm_indic ) { + putlong(temp,4*sizeof(uint32)); /* class offset */ + putlong(temp,0); /* state offset */ + putlong(temp,0); /* transition entry offset */ + } else { + putlong(temp,5*sizeof(uint32)); /* class offset */ + putlong(temp,0); /* state offset */ + putlong(temp,0); /* transition entry offset */ + putlong(temp,0); /* substitution/insertion table offset */ + } + morx_lookupmap(temp,glyphs,map,gcnt);/* dump the class lookup table */ + } + free(glyphs); free(map); + + + state_offset = ftell(temp)-start; + if ( ismort ) { + fseek(temp,start+2*sizeof(uint16),SEEK_SET); + putshort(temp,state_offset); /* Point to start of state arrays */ + } else { + fseek(temp,start+2*sizeof(uint32),SEEK_SET); + putlong(temp,state_offset); /* Point to start of state arrays */ + } + fseek(temp,0,SEEK_END); + + if ( ismort ) { + for ( j=0; jstate_cnt*sm->class_cnt; ++j ) + putc(transdata[j].transition,temp); + if ( ftell(temp)&1 ) + putc(0,temp); /* Pad to a word boundry */ + } else { + for ( j=0; jstate_cnt*sm->class_cnt; ++j ) + putshort(temp,transdata[j].transition); + } + free(transdata); + + here = ftell(temp); + if ( ismort ) { + fseek(temp,start+3*sizeof(uint16),SEEK_SET); + putshort(temp,here-start); /* Point to start of transition arrays */ + } else { + fseek(temp,start+3*sizeof(uint32),SEEK_SET); + putlong(temp,here-start); /* Point to start of transition arrays */ + } + fseek(temp,0,SEEK_END); + + /* Now the transitions */ + if ( sm->type==asm_kern ) { + substable_pos = here+tcnt*2*sizeof(int16); + for ( i=0; iclass_cnt+state_offset); + if ( trans[i].mi!=0xffff ) + trans[i].flags |= substable_pos-start+trans[i].mi; + putshort(temp,trans[i].flags); + } + } else { + for ( i=0; itype!=asm_indic && sm->type!=asm_kern ) { + putshort(temp,trans[i].mi ); + putshort(temp,trans[i].ci ); + } + } + } + free(trans); + + if ( sm->type==asm_context ) { + substable_pos = ftell(temp); + fseek(temp,start+4*sizeof(uint32),SEEK_SET); + putlong(temp,substable_pos-start); /* Point to start of substitution lookup offsets */ + fseek(temp,0,SEEK_END); + + /* And finally the substitutions */ + for ( i=0; itype==asm_insert ) { + substable_pos = ftell(temp); + fseek(temp,start+4*sizeof(uint32),SEEK_SET); + putlong(temp,substable_pos-start); /* Point to start of insertions */ + fseek(temp,0,SEEK_END); + + for ( i=0; itype==asm_kern ) { + if ( substable_pos!=ftell(temp) ) + fprintf(stderr, "Internal Error: Kern Values table in wrong place.\n" ); + fseek(temp,start+4*sizeof(uint16),SEEK_SET); + putshort(temp,substable_pos-start); /* Point to start of insertions */ + fseek(temp,0,SEEK_END); + if ( !ttfcopyfile(temp,kernvalues,substable_pos)) at->error = true; + } +return( true ); +} + +static struct feature *aat_dumpmorx_asm(struct alltabs *at, SplineFont *sf, + FILE *temp, struct feature *features) { + ASM *sm; + struct feature *cur; + + for ( sm = sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type!=asm_kern ) { + cur = chunkalloc(sizeof(struct feature)); + if ( sm->opentype_tag==0 ) + cur->otftag = (sm->feature<<16)|sm->setting; + else + cur->otftag = sm->opentype_tag; + cur->featureType = sm->feature; + cur->featureSetting = sm->setting; + cur->mf = FindMacFeature(sf,cur->featureType,&cur->smf); + cur->ms = FindMacSetting(sf,cur->featureType,cur->featureSetting,&cur->sms); + cur->needsOff = cur->mf!=NULL && !cur->mf->ismutex; + cur->vertOnly = sm->flags&0x8000?1:0; + cur->r2l = sm->flags&0x4000?1:0; + cur->subtable_type = sm->type; /* contextual glyph subs */ + cur->feature_start = ftell(temp); + if ( morx_dumpASM(temp,sm,at,sf)) { + cur->next = features; + features = cur; + if ( (ftell(temp)-cur->feature_start)&1 ) + putc('\0',temp); + if ( (ftell(temp)-cur->feature_start)&2 ) + putshort(temp,0); + cur->feature_len = ftell(temp)-cur->feature_start; + } else + chunkfree(cur,sizeof(struct feature)); + } +return( features); +} + +static struct feature *aat_dumpmorx_cvtopentype(struct alltabs *at, SplineFont *sf, + FILE *temp, struct feature *features) { + FPST *fpst; + ASM *sm, *last=NULL; + int genbase; + struct sliflag *sliflags; + int featureType, featureSetting; + int i; + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + genbase = sf->gentags.tt_cur; + + for ( fpst=sf->possub; fpst!=NULL; fpst=fpst->next ) { + if ( FPSTisMacable(sf,fpst,true)) { + sm = ASMFromFPST(sf,fpst,true); + if ( sm!=NULL ) { + OTTagToMacFeature(fpst->tag,&featureType,&featureSetting); + sm->feature = featureType; sm->setting = featureSetting; + if ( last==NULL ) + sf->sm = sm; + else + last->next = sm; + last = sm; + } + } + } + + if ( OTTagToMacFeature(CHR('i','s','o','l'),&featureType,&featureSetting) ) { + sliflags = SFGetFormsList(sf,true); + if ( sliflags!=NULL ) { + for ( i=0; sliflags[i].sli!=0xffff; ++i ) { + sm = ASMFromOpenTypeForms(sf,sliflags[i].sli,sliflags[i].flags); + if ( sm!=NULL ) { + sm->feature = featureType; sm->setting = featureSetting; + if ( last==NULL ) + sf->sm = sm; + else + last->next = sm; + last = sm; + } + } + } + } + + features = aat_dumpmorx_asm(at,sf,temp,features); + ASMFree(sf->sm); sf->sm = NULL; + RemoveGeneratedTagsAbove(sf,genbase); + free(sliflags); +return( features ); +} + +static struct feature *featuresOrderByType(struct feature *features) { + struct feature *f, **all; + int i, j, cnt, saw_default; + + for ( cnt=0, f=features; f!=NULL; f=f->next, ++cnt ); + if ( cnt==1 ) { + if ( !features->needsOff ) + features->singleMutex = true; +return( features ); + } + all = galloc(cnt*sizeof(struct feature *)); + for ( i=0, f=features; f!=NULL; f=f->next, ++i ) + all[i] = f; + for ( i=0; ifeatureType>all[j]->featureType || + (all[i]->featureType==all[j]->featureType && all[i]->featureSetting>all[j]->featureSetting )) { + f = all[i]; + all[i] = all[j]; + all[j] = f; + } + } + for ( i=0; imf!=NULL && all[i]->mf->ismutex && !all[i]->needsOff ) { + /* mutexes with just 2 choices don't always follow the rule that 0 is off */ + if (i==cnt-1 || all[i]->featureType!=all[i+1]->featureType ) + all[i]->singleMutex = true; + saw_default = false; + j=i; + while ( ifeatureType==all[j]->featureType ) { + if ( all[i]->featureSetting==0 ) saw_default = true; + ++i; + } + if ( i!=j ) --i; + if ( !saw_default ) + all[i]->singleMutex = true; + } else { + j=i; + while ( ifeatureType==all[j]->featureType ) + ++i; + if ( i!=j ) --i; + } + } + for ( i=0; inext = all[i+1]; + all[cnt-1]->next = NULL; + features = all[0]; + free( all ); +return( features ); +} + +static void aat_dumpfeat(struct alltabs *at, SplineFont *sf, struct feature *feature) { + int scnt, fcnt, cnt; + struct feature *f, *n, *p; + int k; + uint32 offset; + int strid = 256; + int fn=0; + MacFeat *mf, *smf; + struct macsetting *ms, *sms; + /* Dump the 'feat' table which is a connection between morx features and */ + /* the name table */ + /* We do three passes. The first just calculates how much space we will need */ + /* the second provides names for the feature types */ + /* and the third provides names for the feature settings */ + /* As we fill up the feat table we also create an array of strings */ + /* (strid, char *pointer) which will be used by the 'name' table to */ + /* give names to the features and their settings */ + /* The mac documentation says that the features should be sorted by feature type */ + /* This is a lie. Features should appear in the same order they appear */ + /* in the morx table, otherwise WorldText goes blooie */ + + if ( feature==NULL ) +return; + /*feature = reversefeatures(feature);*/ + + fcnt = scnt = 0; + for ( k=0; k<3; ++k ) { + for ( f=feature; f!=NULL; f=n ) { + cnt=1; + if ( k!=2 ) { + p = f; + for ( n=f->next; n!=NULL && n->featureType==f->featureType; n = n->next ) { + if ( p->featureSetting!=n->featureSetting ) { + ++cnt; + p = n; + } + } + } else { + p = f; + for ( n=f; n!=NULL && n->featureType==f->featureType; n = n->next ) { + if ( n==f || p->featureSetting!=n->featureSetting ) { + if (( n->ms!=NULL && n->ms->setname!=NULL ) || + ( n->sms!=NULL && n->sms->setname!=NULL)) { + at->feat_name[fn].mn = n->ms!=NULL ? n->ms->setname : NULL; + at->feat_name[fn].smn = n->sms!=NULL ? n->sms->setname : NULL; + at->feat_name[fn++].strid = strid; + } + putshort(at->feat,n->featureSetting); + putshort(at->feat,strid++); + p = n; + } + } + } + if ( k==0 ) { + ++fcnt; + scnt += cnt; + } else if ( k==1 ) { + if ( (f->mf!=NULL && f->mf->featname!=NULL) || (f->smf!=NULL && f->smf->featname!=NULL) ) { + at->feat_name[fn].mn = f->mf!=NULL ? f->mf->featname : NULL; + at->feat_name[fn].smn = f->smf!=NULL ? f->smf->featname : NULL; + at->feat_name[fn++].strid = strid; + } + putshort(at->feat,f->featureType); + putshort(at->feat,cnt); + putlong(at->feat,offset); + putshort(at->feat,f->mf!=NULL && f->mf->ismutex?(0xc000|f->mf->default_setting): + 0); + putshort(at->feat,strid++); + offset += 4*cnt; + } + } + if ( k==0 ) { + ++fcnt; /* Add one for "All Typographic Features" */ + ++scnt; /* Add one for All Features */ + at->feat = tmpfile(); + at->feat_name = galloc((fcnt+scnt+1)*sizeof(struct feat_name)); + putlong(at->feat,0x00010000); + putshort(at->feat,fcnt); + putshort(at->feat,0); + putlong(at->feat,0); + offset = 12 /* header */ + fcnt*12; + } else if ( k==1 ) { + /* FeatureName entry for All Typographics */ + mf = FindMacFeature(sf,0,&smf); + if ( (mf!=NULL && mf->featname!=NULL) || (smf!=NULL && smf->featname!=NULL)) { + at->feat_name[fn].mn = mf!=NULL ? mf->featname : NULL; + at->feat_name[fn].smn = smf!=NULL ? smf->featname : NULL; + at->feat_name[fn++].strid = strid; + } + putshort(at->feat,0); + putshort(at->feat,1); + putlong(at->feat,offset); + putshort(at->feat,0x0000); /* non exclusive */ + putshort(at->feat,strid++); + offset += 1*4; /* (1 setting, 4 bytes) All Features */ + } else if ( k==2 ) { + /* Setting Name Array for All Typographic Features */ + ms = FindMacSetting(sf,0,0,&sms); + if ( (ms!=NULL && ms->setname!=NULL) || (sms!=NULL && sms->setname!=NULL)) { + at->feat_name[fn].mn = ms!=NULL ? ms->setname: NULL; + at->feat_name[fn].smn = sms!=NULL ? sms->setname: NULL; + at->feat_name[fn++].strid = strid; + } + putshort(at->feat,0); + putshort(at->feat,strid++); + } + } + memset( &at->feat_name[fn],0,sizeof(struct feat_name)); + at->featlen = ftell(at->feat); + if ( at->featlen&2 ) + putshort(at->feat,0); +} + +static int featuresAssignFlagsChains(struct feature *feature) { + int bit=0, cnt, chain = 0; + struct feature *f, *n, *p; + + if ( feature==NULL ) +return( 0 ); + + for ( f=feature; f!=NULL; f=n ) { + cnt=0; + p = f; + for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->next ) { + if ( n->featureSetting != p->featureSetting ) { + ++cnt; + p = n; + } + } + if ( bit+cnt>=32 ) { + ++chain; + bit = 0; + } + for ( n=f; n!=NULL && n->featureType==f->featureType; ) { + p = n; + while ( n!=NULL && n->featureType==p->featureType && + n->featureSetting == p->featureSetting ) { + n->flag = 1<chain = chain; + n = n->next; + } + ++bit; + } + } + for ( f=feature; f!=NULL; f=n ) { + if ( f->mf!=NULL && f->mf->ismutex ) { + int offFlags = 0; + for ( n=f; n!=NULL && f->featureType==n->featureType; n=n->next ) + offFlags |= n->flag; + for ( n=f; n!=NULL && f->featureType==n->featureType; n=n->next ) + n->offFlags = offFlags; + } else if ( f->next!=NULL && (f->featureSetting&1)==0 && + f->next->featureType==f->featureType && + f->next->featureSetting==f->featureSetting+1 ) { + n = f->next; + f->offFlags = n->flag; + n->offFlags = f->flag; + n = n->next; + } else { + f->offFlags = 0; + n = f->next; + } + } +return( chain+1 ); +} + +static void morxDumpChain(struct alltabs *at,struct feature *features,int chain, + FILE *temp,struct table_ordering *ord) { + uint32 def_flags=0; + struct feature *f, *n; + int subcnt=0, scnt=0; + uint32 chain_start, end; + char *buf; + int len, tot, cnt; + struct feature *all[32], *ftemp; + int i,j; + + for ( f=features, cnt=0; f!=NULL; f=n ) { + if ( f->chain==chain ) { + for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->next ) { + all[cnt++] = n; + ++subcnt; + if ( n->ms!=NULL && n->ms->initially_enabled ) + def_flags |= n->flag; + ++scnt; + if ( n->needsOff ) { + ++scnt; + if ( n->next!=NULL && n->next->featureSetting==n->featureSetting+1 ) + n = n->next; + } else if ( n->singleMutex ) + ++scnt; + } + } else + n = f->next; + } + + if ( cnt>32 ) GDrawIError("Too many features in chain"); + for ( i=0; iotftag,ord,true)>TTFFeatureIndex(all[j]->otftag,ord,true)) { + ftemp = all[i]; + all[i] = all[j]; + all[j] = ftemp; + } + } + + /* Chain header */ + chain_start = ftell(at->morx); + putlong(at->morx,def_flags); + putlong(at->morx,0); /* Fix up length later */ + putlong(at->morx,scnt+2); /* extra for All Typo features */ + putlong(at->morx,subcnt); /* subtable cnt */ + + /* Features */ + for ( f=features; f!=NULL; f=n ) { + if ( f->chain==chain ) { + for ( n=f; n!=NULL && n->featureType==f->featureType; n=n->next ) { + putshort(at->morx,n->featureType); + putshort(at->morx,n->featureSetting); + putlong(at->morx,n->flag); + putlong(at->morx,n->flag | ~n->offFlags); + if ( n->needsOff ) { + putshort(at->morx,n->featureType); + putshort(at->morx,n->featureSetting+1); + putlong(at->morx,0); + putlong(at->morx,~n->offFlags); + } else if ( n->singleMutex ) { + putshort(at->morx,n->featureType); + putshort(at->morx,n->featureSetting==0?1:0); + putlong(at->morx,0); + putlong(at->morx,~n->offFlags); + } + if ( n->needsOff && n->next!=NULL && n->featureSetting+1==n->next->featureSetting ) + n = n->next; + } + } else + n = f->next; + } + putshort(at->morx,0); /* All Typo Features */ + putshort(at->morx,0); /* All Features */ + putlong(at->morx,0xffffffff); /* enable */ + putlong(at->morx,0xffffffff); /* disable */ + putshort(at->morx,0); /* All Typo Features */ + putshort(at->morx,1); /* No Features */ + putlong(at->morx,0); /* enable */ + putlong(at->morx,0); /* disable */ + + buf = galloc(16*1024); + /* Subtables */ + /* Ordered by tag */ + for ( i=0; ichain==chain ) { + putlong(at->morx,f->feature_len+12); /* Size of header needs to be added */ + putlong(at->morx,(f->vertOnly?0x80000000:f->r2l?0x40000000:0) | f->subtable_type); + putlong(at->morx,f->flag); + tot = f->feature_len; + fseek(temp, f->feature_start, SEEK_SET); + while ( tot!=0 ) { + len = tot; + if ( len>16*1024 ) len = 16*1024; + len = fread(buf,1,len,temp); + len = fwrite(buf,1,len,at->morx); + if ( len<=0 ) { + fprintf( stderr, "Disk error\n" ); + break; + } + tot -= len; + } + } + free(buf); + + /* Pad chain to a multiple of four */ + if ( (ftell(at->morx)-chain_start)&1 ) + putc('\0',at->morx); + if ( (ftell(at->morx)-chain_start)&2 ) + putshort(at->morx,0); + end = ftell(at->morx); + fseek(at->morx,chain_start+4,SEEK_SET); + putlong(at->morx,end-chain_start); + fseek(at->morx,0,SEEK_END); +} + +void aat_dumpmorx(struct alltabs *at, SplineFont *sf) { + FILE *temp = tmpfile(); + struct feature *features = NULL; + int nchains, i; + struct table_ordering *ord; + + features = aat_dumpmorx_substitutions(at,sf,temp,features); + features = aat_dumpmorx_ligatures(at,sf,temp,features); + if ( sf->sm!=NULL ) + features = aat_dumpmorx_asm(at,sf,temp,features); + else + features = aat_dumpmorx_cvtopentype(at,sf,temp,features); + if ( features==NULL ) { + fclose(temp); +return; + } + features = featuresOrderByType(features); + aat_dumpfeat(at, sf, features); + nchains = featuresAssignFlagsChains(features); + + at->morx = tmpfile(); + putlong(at->morx,0x00020000); + putlong(at->morx,nchains); + for ( ord = sf->orders; ord!=NULL && ord->table_tag!=CHR('G','S','U','B'); ord = ord->next ); + for ( i=0; imorxlen = ftell(at->morx); + if ( at->morxlen&1 ) + putc('\0',at->morx); + if ( (at->morxlen+1)&2 ) + putshort(at->morx,0); +} + +/* ************************************************************************** */ +/* ************************* The 'opbd' table ************************* */ +/* ************************************************************************** */ + + +int haslrbounds(SplineChar *sc, PST **left, PST **right) { + PST *pst; + + *left = *right = NULL; + for ( pst=sc->possub; pst!=NULL ; pst=pst->next ) { + if ( pst->type == pst_position ) { + if ( pst->tag==CHR('l','f','b','d') ) { + *left = pst; + if ( *right ) +return( true ); + } else if ( pst->tag==CHR('r','t','b','d') ) { + *right = pst; + if ( *left ) +return( true ); + } + } + } +return( *left!=NULL || *right!=NULL ); +} + +void aat_dumpopbd(struct alltabs *at, SplineFont *_sf) { + int i, j, k, l, cmax, seg_cnt, tot, last, offset; + PST *left, *right; + FILE *opbd=NULL; + /* We do four passes. The first just calculates how much space we will need (if any) */ + /* the second provides the top-level lookup table structure */ + /* the third provides the arrays of offsets needed for type 4 lookup tables */ + /* the fourth provides the actual data on the optical bounds */ + SplineFont *sf; + SplineChar *sc; + + cmax = 0; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + if ( cmaxcharcnt ) cmax = sf->charcnt; + ++l; + } while ( l<_sf->subfontcnt ); + + for ( k=0; k<4; ++k ) { + for ( i=seg_cnt=tot=0; isubfonts==NULL ? _sf : _sf->subfonts[l]; + if ( icharcnt && sf->chars[l]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( sc!=NULL && sc->ttf_glyph!=-1 && haslrbounds(sc,&left,&right) ) { + if ( k==1 ) + tot = 0; + else if ( k==2 ) { + putshort(opbd,offset); + offset += 8; + } else if ( k==3 ) { + putshort(opbd,left!=NULL?left->u.pos.xoff:0); + putshort(opbd,0); /* top */ + putshort(opbd,right!=NULL?-right->u.pos.h_adv_off:0); + putshort(opbd,0); /* bottom */ + } + for ( j=i+1, ++tot; jcharcnt; ++j ) if ( sf->chars[j]!=NULL && sf->chars[j]->ttf_glyph!=-1 ) { + if ( !haslrbounds(sf->chars[j],&left,&right) ) + break; + ++tot; + last = j; + if ( k==2 ) { + putshort(opbd,offset); + offset += 8; + } else if ( k==3 ) { + putshort(opbd,left!=NULL?left->u.pos.xoff:0); + putshort(opbd,0); /* top */ + putshort(opbd,right!=NULL?-right->u.pos.h_adv_off:0); + putshort(opbd,0); /* bottom */ + } + } + if ( k==1 ) { + putshort(opbd,sf->chars[last]->ttf_glyph); + putshort(opbd,sf->chars[i]->ttf_glyph); + putshort(opbd,offset); + offset += 2*tot; + } + ++seg_cnt; + i = j-1; + } + } + if ( k==0 ) { + if ( seg_cnt==0 ) +return; + opbd = tmpfile(); + putlong(opbd, 0x00010000); /* version */ + putshort(opbd,0); /* data are distances (not points) */ + + putshort(opbd,4); /* Lookup table format 4 */ + /* Binary search header */ + putshort(opbd,6); /* Entry size */ + putshort(opbd,seg_cnt); /* Number of segments */ + for ( j=0,l=1; l<=seg_cnt; l<<=1, ++j ); + --j; l>>=1; + putshort(opbd,6*l); + putshort(opbd,j); + putshort(opbd,6*(seg_cnt-l)); + offset = 6*2 + seg_cnt*6 + 6; + } else if ( k==1 ) { /* flag entry */ + putshort(opbd,0xffff); + putshort(opbd,0xffff); + putshort(opbd,0); + } + } + at->opbd = opbd; + at->opbdlen = ftell(at->opbd); + if ( at->opbdlen&2 ) + putshort(at->opbd,0); +} + +/* ************************************************************************** */ +/* ************************* The 'prop' table ************************* */ +/* ************************************************************************** */ + +uint16 *props_array(SplineFont *_sf,int numGlyphs) { + uint16 *props; + int i; + SplineChar *sc, *bsc; + int dir, isfloat, isbracket, offset, doit=false; + AnchorPoint *ap; + PST *pst; + SplineFont *sf; + int l,cmax; + + props = gcalloc(numGlyphs+1,sizeof(uint16)); + props[numGlyphs] = -1; + + cmax = 0; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + if ( cmaxcharcnt ) cmax = sf->charcnt; + ++l; + } while ( l<_sf->subfontcnt ); + + for ( i=0; isubfonts==NULL ? _sf : _sf->subfonts[l]; + if ( icharcnt && sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( sc!=NULL && sc->ttf_glyph!=-1 ) { + dir = 0; + if ( sc->unicodeenc>=0x10300 && sc->unicodeenc<=0x103ff ) + dir = 0; + else if ( sc->unicodeenc>=0x10800 && sc->unicodeenc<=0x103ff ) + dir = 1; + else if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10fff ) { + if ( iseuronumeric(sc->unicodeenc) ) + dir = 3; + else if ( iseuronumsep(sc->unicodeenc)) + dir = 4; + else if ( iseuronumterm(sc->unicodeenc)) + dir = 5; + else if ( isarabnumeric(sc->unicodeenc)) + dir = 6; + else if ( iscommonsep(sc->unicodeenc)) + dir = 7; + else if ( isspace(sc->unicodeenc)) + dir = 10; + else if ( islefttoright(sc->unicodeenc) ) + dir = 0; + else if ( isrighttoleft(sc->unicodeenc) ) + dir = 1; + else if ( SCScriptFromUnicode(sc)==CHR('a','r','a','b') ) + dir = 2; + else if ( SCScriptFromUnicode(sc)==CHR('h','e','b','r') ) + dir = 1; + else + dir = 11; /* Other neutrals */ + /* Not dealing with unicode 3 classes */ + /* nor block seperator/ segment seperator */ + } else if ( SCScriptFromUnicode(sc)==CHR('a','r','a','b') ) + dir = 2; + else if ( SCScriptFromUnicode(sc)==CHR('h','e','b','r') ) + dir = 1; + + if ( dir==1 || dir==2 ) doit = true; + isfloat = false; + if ( sc->width==0 && + ((sc->anchor!=NULL && sc->anchor->type==at_mark) || + (sc->unicodeenc!=-1 && sc->unicodeenc<0x10000 && iscombining(sc->unicodeenc)))) + isfloat = doit = true; + isbracket = offset = 0; + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10000 && tomirror(sc->unicodeenc)!=0 ) { + bsc = SFGetCharDup(sf,tomirror(sc->unicodeenc),NULL); + if ( bsc!=NULL && bsc->ttf_glyph-sc->ttf_glyph>-8 && bsc->ttf_glyph-sc->ttf_glyph<8 ) { + isbracket = true; + offset = bsc->ttf_glyph-sc->ttf_glyph; + } + } + if ( !isbracket ) { + for ( pst=sc->possub; pst!=NULL && pst->tag!=CHR('r','t','l','a'); pst=pst->next ); + if ( pst!=NULL && pst->type==pst_substitution && + (bsc=SFGetCharDup(sf,-1,pst->u.subs.variant))!=NULL && + bsc->ttf_glyph!=-1 && bsc->ttf_glyph-sc->ttf_glyph>-8 && bsc->ttf_glyph-sc->ttf_glyph<8 ) { + isbracket = true; + offset = bsc->ttf_glyph-sc->ttf_glyph; + doit = true; + } + } + if ( SCRightToLeft(sc) ) { + /* Apple docs say attached right. So for r2l scripts we look for */ + /* a cursive entry, and for l2r a cursive exit */ + for ( ap=sc->anchor; ap!=NULL && ap->type!=at_centry; ap=ap->next ); + } else { + for ( ap=sc->anchor; ap!=NULL && ap->type!=at_cexit; ap=ap->next ); + } + props[sc->ttf_glyph] = dir | + (isfloat ? 0x8000 : 0 ) | + (isbracket ? 0x1000 : 0 ) | + (ap!=NULL ? 0x80 : 0 ) | + ((offset&0xf)<<8); + /* not dealing with */ + /* hang left 0x4000 */ + /* hang right 0x2000 */ + } + } + + if ( !doit ) { + free(props); +return( NULL ); + } + +return( props ); +} + +void aat_dumpprop(struct alltabs *at, SplineFont *sf) { + uint16 *props = props_array(sf,at->maxp.numGlyphs); + uint32 bin_srch_header; + int i, j, cnt; + + if ( props==NULL ) +return; + + at->prop = tmpfile(); + putlong(at->prop,0x00020000); + putshort(at->prop,1); /* Lookup data */ + putshort(at->prop,0); /* default property is simple l2r */ + putshort(at->prop,2); /* lookup format 2 => segment single value */ + /* Binsearch header */ + bin_srch_header = ftell(at->prop); + putshort(at->prop,6); /* Entry size */ + putshort(at->prop,0); /* fill in later */ + putshort(at->prop,0); + putshort(at->prop,0); + putshort(at->prop,0); + + cnt = 0; + for ( i=0; imaxp.numGlyphs; ++i ) { + while ( imaxp.numGlyphs && props[i]==0 ) ++i; /* skip default entries */ + if ( i>=at->maxp.numGlyphs ) + break; + for ( j=i+1; jmaxp.numGlyphs && props[j]==props[i]; ++j ); + putshort(at->prop,j-1); + putshort(at->prop,i); + putshort(at->prop,props[i]); + i = j-1; + ++cnt; + } + putshort(at->prop,0xffff); /* Final eof marker */ + putshort(at->prop,0xffff); + putshort(at->prop,0x0000); + + fseek(at->prop,bin_srch_header,SEEK_SET); + putshort(at->prop,6); /* Entry size */ + putshort(at->prop,cnt); /* Number of segments */ + for ( j=0,i=1; i<=cnt; i<<=1, ++j ); + --j; i>>=1; + putshort(at->prop,6*i); + putshort(at->prop,j); + putshort(at->prop,6*(cnt-i)); + + fseek(at->prop,0,SEEK_END); + at->proplen = ftell(at->prop); + if ( at->proplen&2 ) + putshort(at->prop,0); + free(props); +} + +/* ************************************************************************** */ +/* ************************* utility routines ************************* */ +/* ************************************************************************** */ + +uint32 MacFeatureToOTTag(int featureType,int featureSetting) { + int i; + struct macsettingname *msn = user_macfeat_otftag ? user_macfeat_otftag : macfeat_otftag; + + for ( i=0; msn[i].otf_tag!=0; ++i ) + if ( msn[i].mac_feature_type == featureType && + msn[i].mac_feature_setting == featureSetting ) +return( msn[i].otf_tag ); + +return( 0 ); +} + +int OTTagToMacFeature(uint32 tag, int *featureType,int *featureSetting) { + int i; + struct macsettingname *msn = user_macfeat_otftag ? user_macfeat_otftag : macfeat_otftag; + + for ( i=0; msn[i].otf_tag!=0; ++i ) + if ( msn[i].otf_tag == tag ) { + *featureType = msn[i].mac_feature_type; + *featureSetting = msn[i].mac_feature_setting; +return( true ); + } + + *featureType = 0; + *featureSetting = 0; +return( false ); +} + +static struct feature *featureFromTag(SplineFont *sf, uint32 tag ) { + int i; + struct feature *feat; + struct macsettingname *msn = user_macfeat_otftag ? user_macfeat_otftag : macfeat_otftag; + + for ( i=0; msn[i].otf_tag!=0; ++i ) + if ( msn[i].otf_tag == tag ) + break; + + feat = chunkalloc(sizeof(struct feature)); + feat->otftag = tag; + if ( msn[i].otf_tag!=0 ) { + feat->featureType = msn[i].mac_feature_type; + feat->featureSetting = msn[i].mac_feature_setting; + } else { + feat->featureType = tag>>16; + feat->featureSetting = tag & 0xffff; + } + feat->mf = FindMacFeature(sf,feat->featureType,&feat->smf); + feat->ms = FindMacSetting(sf,feat->featureType,feat->featureSetting,&feat->sms); + feat->needsOff = feat->mf!=NULL && !feat->mf->ismutex; + feat->vertOnly = tag==CHR('v','r','t','2') || tag==CHR('v','k','n','a'); +return( feat ); +} diff --git a/fontforge/tottfgpos.c b/fontforge/tottfgpos.c new file mode 100644 index 00000000..88be6dd4 --- /dev/null +++ b/fontforge/tottfgpos.c @@ -0,0 +1,3764 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include + +int coverageformatsallowed=3; + +#include "ttf.h" + +/* This file contains routines to create the otf gpos and gsub tables and their */ +/* attendant subtables */ + +struct lookup { + /*int script;*/ + uint32 feature_tag; + int lookup_type; + int lookup_cnt; + uint32 offset, len; + struct lookup *next; + struct lookup *feature_next; + uint16 flags; + int script_lang_index; +}; + +struct postponedlookup { + uint32 feature_tag; + int lookup_cnt; + struct postponedlookup *next; +}; + +/* Undocumented fact: Only one feature with a given tag allowed per script/lang */ +/* So if we have multiple lookups with the same tag they must be merged into */ +/* one feature with many lookups */ +struct feature { + uint32 feature_tag; + int lcnt; + struct lookup **lookups; + struct sl { uint32 script, lang; struct sl *next; } *sl; /* More than one script/lang may use this feature */ + int feature_cnt; + struct feature *feature_next; +}; + +struct tagflaglang { + uint32 tag; + uint16 flags; + int script_lang_index; +}; + +/* scripts (for opentype) that I understand */ + +static uint32 scripts[][15] = { +/* Arabic */ { CHR('a','r','a','b'), 0x0600, 0x06ff, 0xfb50, 0xfdff, 0xfe70, 0xfeff }, +/* Armenian */ { CHR('a','r','m','n'), 0x0530, 0x058f, 0xfb13, 0xfb17 }, +/* Bengali */ { CHR('b','e','n','g'), 0x0980, 0x09ff }, +/* Bliss symb */{ CHR('b','l','i','s'), 0x12200, 0x124ff }, +/* Bopomofo */ { CHR('b','o','p','o'), 0x3100, 0x312f, 0x31a0, 0x31bf }, +/* Braille */ { CHR('b','r','a','i'), 0x2800, 0x28ff }, +/* Buhid */ { CHR('b','u','h','d'), 0x1740, 0x1753 }, +/* Byzantine M*/{ CHR('b','y','z','m'), 0x1d000, 0x1d0ff }, +/* Canadian Syl*/{CHR('c','a','n','s'), 0x1400, 0x167f }, +/* Cherokee */ { CHR('c','h','e','r'), 0x13a0, 0x13ff }, +/* Cirth */ { CHR('c','i','r','t'), 0x12080, 0x120ff }, +/* Cypriot */ { CHR('c','p','m','n'), 0x10800, 0x1083f }, +/* Cyrillic */ { CHR('c','y','r','l'), 0x0500, 0x052f }, +/* Deseret */ { CHR('d','s','r','t'), 0x10400, 0x1044f }, +/* Devanagari */{ CHR('d','e','v','a'), 0x0900, 0x097f }, +/* Ethiopic */ { CHR('e','t','h','i'), 0x1200, 0x139f }, +/* Georgian */ { CHR('g','e','o','r'), 0x1080, 0x10ff }, +/* Gothic */ { CHR('g','o','t','h'), 0x10330, 0x1034a }, +/* Greek */ { CHR('g','r','e','k'), 0x0370, 0x03ff, 0x1f00, 0x1fff }, +/* Gujarati */ { CHR('g','u','j','r'), 0x0a80, 0x0aff }, +/* Gurmukhi */ { CHR('g','u','r','u'), 0x0a00, 0x0a7f }, +/* Hangul */ { CHR('h','a','n','g'), 0xac00, 0xd7af, 0x3130, 0x319f, 0xffa0, 0xff9f }, +/* Hanunoo */ { CHR('h','a','n','o'), 0x1720, 0x1734 }, + /* I'm not sure what the difference is between the 'hang' tag and the 'jamo' */ + /* tag. 'Jamo' is said to be the precomposed forms, but what's 'hang'? */ +/* CJKIdeogra */{ CHR('h','a','n','i'), 0x3300, 0x9fff, 0xf900, 0xfaff, 0x020000, 0x02ffff }, +/* Hebrew */ { CHR('h','e','b','r'), 0x0590, 0x05ff, 0xfb1e, 0xfb4ff }, +#if 0 /* Hiragana used to have its own tag, but has since been merged with katakana */ +/* Hiragana */ { CHR('h','i','r','a'), 0x3040, 0x309f }, +#endif +/* Old Italic */{ CHR('i','t','a','l'), 0x10300, 0x1031e }, +/* Hangul Jamo*/{ CHR('j','a','m','o'), 0x1100, 0x11ff, 0x3130, 0x319f, 0xffa0, 0xffdf }, +/* Katakana */ { CHR('k','a','n','a'), 0x3040, 0x30ff, 0xff60, 0xff9f }, +/* Khmer */ { CHR('k','h','m','r'), 0x1780, 0x17ff }, +/* Kannada */ { CHR('k','n','d','a'), 0x0c80, 0x0cff }, +/* Kharosthi */ { CHR('k','h','a','r'), 0x10a00, 0x10a5f }, +/* Latin */ { CHR('l','a','t','n'), 0x0041, 0x005a, 0x0061, 0x007a, + 0x00c0, 0x02af, 0x1d00, 0x1eff, 0xfb00, 0xfb0f, 0xff00, 0xff5f, 0, 0 }, +/* Lao */ { CHR('l','a','o',' '), 0x0e80, 0x0eff }, +/* Limbu */ { CHR('l','i','m','b'), 0x1900, 0x194f }, /* Not in ISO 15924 !!!!!, just guessing */ +/* Linear A */ { CHR('l','i','n','a'), 0x10180, 0x102cf }, +/* Linear B */ { CHR('l','i','n','b'), 0x10000, 0x100fa }, +/* Malayalam */ { CHR('m','l','y','m'), 0x0d00, 0x0d7f }, +/* Mongolian */ { CHR('m','o','n','g'), 0x1800, 0x18af }, +/* Myanmar */ { CHR('m','y','m','r'), 0x1000, 0x107f }, +/* Ogham */ { CHR('o','g','a','m'), 0x1680, 0x169f }, +/* Oriya */ { CHR('o','r','y','a'), 0x0b00, 0x0b7f }, +/* Osmanya */ { CHR('o','s','m','a'), 0x10480, 0x104a9 }, +/* Old Permic */{ CHR('p','e','r','m'), 0x10350, 0x1037f }, +/* Pollard */ { CHR('p','l','r','d'), 0x104b0, 0x104d9 }, +/* Runic */ { CHR('r','u','n','r'), 0x16a0, 0x16ff }, +/* Shavian */ { CHR('s','h','a','w'), 0x10450, 0x1047f }, +/* Sinhala */ { CHR('s','i','n','h'), 0x0d80, 0x0dff }, +/* Syriac */ { CHR('s','y','r','c'), 0x0700, 0x074f }, +/* Tagalog */ { CHR('t','a','g','l'), 0x1700, 0x1714 }, +/* Tagbanwa */ { CHR('t','a','g','b'), 0x1760, 0x1773 }, +/* Tai Le */ { CHR('t','a','i','l'), 0x1950, 0x1974 }, +/* Tamil */ { CHR('t','a','m','l'), 0x0b80, 0x0bff }, +/* Telugu */ { CHR('t','e','l','u'), 0x0c00, 0x0c7f }, +/* Tengwar */ { CHR('t','e','n','g'), 0x12000, 0x1207f }, +/* Thaana */ { CHR('t','h','a','a'), 0x0780, 0x07bf }, +/* Thai */ { CHR('t','h','a','i'), 0x0e00, 0x0e7f }, +/* Tibetan */ { CHR('t','i','b','t'), 0x0f00, 0x0fff }, +/* Ugaritic */ { CHR('u','g','r','t'), 0x10380, 0x1039d }, +/* Yi */ { CHR('y','i',' ',' '), 0xa000, 0xa73f }, + { 0 } +}; + +int ScriptIsRightToLeft(uint32 script) { + if ( script==CHR('a','r','a','b') || script==CHR('h','e','b','r') || + script==CHR('c','p','m','n') || script==CHR('k','h','a','r') ) +return( true ); + +return( false ); +} + +uint32 ScriptFromUnicode(int u,SplineFont *sf) { + int s, k; + int enc; + + if ( u!=-1 ) { + for ( s=0; scripts[s][0]!=0; ++s ) { + for ( k=1; scripts[s][k+1]!=0; k += 2 ) + if ( u>=scripts[s][k] && u<=scripts[s][k+1] ) + break; + if ( scripts[s][k+1]!=0 ) + break; + } + if ( scripts[s][0]!=0 ) +return( scripts[s][0] ); + } + + if ( sf==NULL ) +return( 0 ); + enc = sf->encoding_name; + if ( sf->cidmaster!=NULL || sf->subfontcnt!=0 ) { + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( strmatch(sf->ordering,"Identity")==0 ) +return( 0 ); + else if ( strmatch(sf->ordering,"Korean")==0 ) +return( CHR('h','a','n','g')); + else +return( CHR('h','a','n','i') ); + } + +#if 0 + if ( enc==em_jis208 || enc==em_jis212 || enc==em_gb2312 || enc==em_big5 || + enc == em_big5hkscs || enc==em_sjis || enc==em_jisgb ) +return( CHR('h','a','n','i') ); + else if ( enc==em_ksc5601 || enc==em_johab || enc==em_wansung ) +return( CHR('j','a','m','o') ); + else if ( enc==em_iso8859_11 ) +return( CHR('t','h','a','i')); + else if ( enc==em_iso8859_8 ) +return( CHR('h','e','b','r')); + else if ( enc==em_iso8859_7 ) +return( CHR('g','r','e','k')); + else if ( enc==em_iso8859_6 ) +return( CHR('a','r','a','b')); + else if ( enc==em_iso8859_5 || enc==em_koi8_r ) +return( CHR('c','y','r','l')); + else if ( enc==em_jis201 ) +return( CHR('k','a','n','a')); + else if ( (enc>=em_iso8859_1 && enc<=em_iso8859_15 ) || enc==em_mac || + enc==em_win || enc==em_adobestandard ) +return( CHR('l','a','t','n')); +#endif + +return( DEFAULT_SCRIPT ); +} + +uint32 SCScriptFromUnicode(SplineChar *sc) { + char *pt; + PST *pst; + SplineFont *sf; + int i; unsigned uni; + + if ( sc==NULL ) +return( DEFAULT_SCRIPT ); + + sf = sc->parent; + if ( sc->unicodeenc!=-1 ) +return( ScriptFromUnicode( sc->unicodeenc,sf )); + + for ( pt=sc->name; *pt!='\0' && *pt!='_' && *pt!='.'; ++pt ); + if ( *pt!='\0' ) { + char *str = copyn(sc->name,pt-sc->name); + int uni = UniFromName(str); + free(str); + if ( uni!=-1 ) +return( ScriptFromUnicode( uni,sf )); + } + /* Adobe ligature uniXXXXXXXX */ + if ( strncmp(sc->name,"uni",3)==0 && sscanf(sc->name+3,"%4x", &uni)==1 ) +return( ScriptFromUnicode( uni,sf )); + + if ( sf==NULL ) +return( DEFAULT_SCRIPT ); + + if ( sf->cidmaster ) sf=sf->cidmaster; + for ( i=0; i<2; ++i ) { + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->script_lang_index!=SLI_UNKNOWN && + pst->type!=pst_lcaret && + pst->script_lang_index!=SLI_NESTED && + (i==1 || sf->script_lang[pst->script_lang_index][1].script==0 )) +return( sf->script_lang[pst->script_lang_index]->script ); + } + } +return( ScriptFromUnicode( sc->unicodeenc,sf )); +} + +int SCRightToLeft(SplineChar *sc) { + + if ( sc->unicodeenc>=0x10800 && sc->unicodeenc<=0x10fff ) +return( true ); /* Supplemental Multilingual Plane, RTL scripts */ + if ( sc->unicodeenc!=-1 && sc->unicodeenc<0x10000 ) +return( isrighttoleft(sc->unicodeenc )); + +return( ScriptIsRightToLeft(SCScriptFromUnicode(sc))); +} + +int SLIContainsR2L(SplineFont *sf,int sli) { + struct script_record *sr; + + if ( sf->cidmaster!=NULL ) + sf = sf->cidmaster; + sr = sf->script_lang[sli]; +return( ScriptIsRightToLeft(sr[0].script) ); +} + +static KernPair *KernListMatch(KernPair *kerns,int sli) { + KernPair *kp; + + for ( kp=kerns; kp!=NULL; kp=kp->next ) + if ( kp->sli == sli ) +return( kp ); +return( NULL ); +} + +static LigList *LigListMatchTag(LigList *ligs,struct tagflaglang *tfl) { + LigList *l; + + for ( l=ligs; l!=NULL; l=l->next ) + if ( l->lig->tag == tfl->tag && l->lig->flags==tfl->flags && + l->lig->script_lang_index == tfl->script_lang_index ) +return( l ); +return( NULL ); +} + +static int AllToBeOutput(LigList *lig) { + struct splinecharlist *cmp; + + if ( lig->lig->u.lig.lig->ttf_glyph==-1 || + lig->first->ttf_glyph==-1 ) +return( 0 ); + for ( cmp=lig->components; cmp!=NULL; cmp=cmp->next ) + if ( cmp->sc->ttf_glyph==-1 ) +return( 0 ); +return( true ); +} + +static PST *PosSubMatchTag(PST *pst,struct tagflaglang *tfl,enum possub_type type) { + + for ( ; pst!=NULL; pst=pst->next ) + if ( pst->tag == tfl->tag && pst->type==type && pst->flags==tfl->flags && + pst->script_lang_index == tfl->script_lang_index ) +return( pst ); +return( NULL ); +} + +static void GlyphMapFree(SplineChar ***map) { + int i; + + if ( map==NULL ) +return; + for ( i=0; map[i]!=NULL; ++i ) + free(map[i]); + free(map); +} + +static SplineChar **FindSubs(SplineChar *sc,struct tagflaglang *tfl, enum possub_type type) { + SplineChar *space[30]; + int cnt=0; + char *pt, *start; + SplineChar *subssc, **ret; + PST *pst; + + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->tag == tfl->tag && pst->flags==tfl->flags && + pst->script_lang_index == tfl->script_lang_index && pst->type==type ) { + pt = pst->u.subs.variant; + while ( 1 ) { + while ( *pt==' ' ) ++pt; + start = pt; + pt = strchr(start,' '); + if ( pt!=NULL ) + *pt = '\0'; + subssc = SFGetCharDup(sc->parent,-1,start); + if ( subssc!=NULL && subssc->ttf_glyph!=-1 && + cntsubfontcnt==0 ) ? sf : sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) + if ( SCWorthOutputting(sc=sub->chars[i]) && + SCDuplicate(sc)==sc && sc->ttf_glyph!=-1 && + ((iskern==1 && KernListMatch(sc->kerns,sli)) || + (iskern==2 && KernListMatch(sc->vkerns,sli)) || + (!iskern && LigListMatchTag(sc->ligofme,ligtag) && AllToBeOutput(sc->ligofme)) )) { + if ( glyphs!=NULL ) glyphs[cnt] = sc; + ++cnt; + } + ++k; + } while ( ksubfontcnt ); + if ( glyphs==NULL ) { + if ( cnt==0 ) +return( NULL ); + glyphs = galloc((cnt+1)*sizeof(SplineChar *)); + } + } + glyphs[cnt] = NULL; +return( glyphs ); +} + +static SplineChar **generateGlyphTypeList(SplineFont *sf, enum possub_type type, + struct tagflaglang *tfl, SplineChar ****map) { + int cnt; + SplineFont *sub; + SplineChar *sc; + int k,i,j; + SplineChar **glyphs=NULL, ***maps=NULL; + + for ( j=0; j<2; ++j ) { + k = 0; + cnt = 0; + do { + sub = ( sf->subfontcnt==0 ) ? sf : sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) + if ( SCWorthOutputting(sc=sub->chars[i]) && + SCDuplicate(sc)==sc && + PosSubMatchTag(sc->possub,tfl,type) ) { + if ( glyphs!=NULL ) { + glyphs[cnt] = sc; + if ( type==pst_substitution || type==pst_alternate || type==pst_multiple ) { + maps[cnt] = FindSubs(sc,tfl,type); + if ( maps[cnt]==NULL ) + --cnt; /* Couldn't find anything, toss it */ + } + } + ++cnt; + sc->ticked = true; + } + ++k; + } while ( ksubfontcnt ); + if ( glyphs==NULL ) { + if ( cnt==0 ) +return( NULL ); + glyphs = galloc((cnt+1)*sizeof(SplineChar *)); + if ( type==pst_substitution || type==pst_alternate || type==pst_multiple ) + maps = galloc((cnt+1)*sizeof(SplineChar **)); + } + } + glyphs[cnt] = NULL; + if ( maps!=NULL ) + maps[cnt] = NULL; + if ( cnt==0 ) { + free(glyphs); + GlyphMapFree(maps); + glyphs = NULL; maps = NULL; + } + *map = maps; +return( glyphs ); +} + +void AnchorClassDecompose(SplineFont *sf,AnchorClass *_ac, int classcnt, int *subcnts, + SplineChar ***marks,SplineChar ***base, + SplineChar ***lig,SplineChar ***mkmk) { + /* Run through the font finding all characters with this anchor class */ + /* (and the cnt-1 classes after it) */ + /* and distributing in the four possible anchor types */ + int i,j,k; + struct sclist { int cnt; SplineChar **glyphs; } heads[at_max]; + AnchorPoint *test; + AnchorClass *ac; + + memset(heads,0,sizeof(heads)); + memset(subcnts,0,classcnt*sizeof(int)); + memset(marks,0,classcnt*sizeof(SplineChar **)); + for ( j=0; j<2; ++j ) { + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( ac = _ac, k=0; knext ) if ( ac->matches ) { + for ( test=sf->chars[i]->anchor; test!=NULL && test->anchor!=ac; test=test->next ); + if ( test==NULL ) + /* Do Nothing */; + else if ( test->type==at_mark ) { + if ( j ) + marks[k][subcnts[k]] = sf->chars[i]; + ++subcnts[k]; + break; + } else if ( test->type!=at_centry && test->type!=at_cexit ) { + if ( heads[test->type].glyphs!=NULL ) + heads[test->type].glyphs[heads[test->type].cnt] = sf->chars[i]; + ++heads[test->type].cnt; + break; + } + ++k; + } + } + if ( j==1 ) + break; + for ( i=0; i<4; ++i ) + if ( heads[i].cnt!=0 ) { + heads[i].glyphs = galloc((heads[i].cnt+1)*sizeof(SplineChar *)); + heads[i].glyphs[heads[i].cnt] = NULL; + heads[i].cnt = 0; + } + for ( k=0; kcharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( test=sf->chars[i]->anchor; test!=NULL && test->anchor!=ac; test=test->next ); + if ( test!=NULL && (test->type==at_centry || test->type==at_cexit )) { + if ( array!=NULL ) + array[cnt] = sf->chars[i]; + ++cnt; + } + } + if ( cnt==0 ) +return( NULL ); + if ( j==1 ) + break; + array = galloc((cnt+1)*sizeof(SplineChar *)); + array[cnt] = NULL; + } +return( array ); +} + +static SplineChar **GlyphsOfScript(SplineChar **base,int first) { + int cnt, k; + SplineChar **glyphs; + uint32 script = SCScriptFromUnicode(base[first]); + + glyphs = NULL; + while ( 1 ) { + cnt = 1; + for ( k=first+1; base[k]!=NULL; ++k ) if ( script==SCScriptFromUnicode(base[k]) ) { + if ( glyphs!=NULL ) { + glyphs[cnt] = base[k]; + base[k]->ticked = true; + } + ++cnt; + } + if ( glyphs!=NULL ) + break; + glyphs = galloc((cnt+1)*sizeof(SplineChar *)); + glyphs[0] = base[first]; + glyphs[cnt] = NULL; + } +return( glyphs ); +} + +static void AnchorGuessContext(SplineFont *sf,struct alltabs *at) { + int i; + int maxbase=0, maxmark=0, basec, markc; + AnchorPoint *ap; + int hascursive = 0; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i] ) { + basec = markc = 0; + for ( ap = sf->chars[i]->anchor; ap!=NULL; ap=ap->next ) + if ( ap->type==at_basemark ) + ++markc; + else if ( ap->type==at_basechar || ap->type==at_baselig ) + ++basec; + else if ( ap->type==at_centry ) + hascursive = true; + if ( basec>maxbase ) maxbase = basec; + if ( markc>maxmark ) maxmark = markc; + } + + if ( maxbase*(maxmark+1)>at->os2.maxContext ) + at->os2.maxContext = maxbase*(maxmark+1); + if ( hascursive && at->os2.maxContext<2 ) + at->os2.maxContext=2; +} + +static void dumpcoveragetable(FILE *gpos,SplineChar **glyphs) { + int i, last = -2, range_cnt=0, start; + /* the glyph list should already be sorted */ + /* figure out whether it is better (smaller) to use an array of glyph ids */ + /* or a set of glyph id ranges */ + + for ( i=0; glyphs[i]!=NULL; ++i ) { + if ( glyphs[i]->ttf_glyph<=last ) + GDrawIError("Glyphs must be ordered when creating coverage table"); + if ( glyphs[i]->ttf_glyph!=last+1 ) + ++range_cnt; + last = glyphs[i]->ttf_glyph; + } + /* I think Windows will only accept format 2 coverage tables? */ + if ( !(coverageformatsallowed&2) || ((coverageformatsallowed&1) && i<=3*range_cnt )) { + /* We use less space with a list of glyphs than with a set of ranges */ + putshort(gpos,1); /* Coverage format=1 => glyph list */ + putshort(gpos,i); /* count of glyphs */ + for ( i=0; glyphs[i]!=NULL; ++i ) + putshort(gpos,glyphs[i]->ttf_glyph); /* array of glyph IDs */ + } else { + putshort(gpos,2); /* Coverage format=2 => range list */ + putshort(gpos,range_cnt); /* count of ranges */ + last = -2; start = -2; /* start is a index in our glyph array, last is ttf_glyph */ + for ( i=0; glyphs[i]!=NULL; ++i ) { + if ( glyphs[i]->ttf_glyph!=last+1 ) { + if ( last!=-2 ) { + putshort(gpos,glyphs[start]->ttf_glyph); /* start glyph ID */ + putshort(gpos,last); /* end glyph ID */ + putshort(gpos,start); /* coverage index of start glyph */ + } + start = i; + } + last = glyphs[i]->ttf_glyph; + } + if ( last!=-2 ) { + putshort(gpos,glyphs[start]->ttf_glyph); /* start glyph ID */ + putshort(gpos,last); /* end glyph ID */ + putshort(gpos,start); /* coverage index of start glyph */ + } + } +} + +SplineChar **SFGlyphsFromNames(SplineFont *sf,char *names) { + int cnt, ch; + char *pt, *end; + SplineChar *sc, **glyphs; + + cnt = 0; + for ( pt = names; *pt; pt = end+1 ) { + ++cnt; + end = strchr(pt,' '); + if ( end==NULL ) + break; + } + + glyphs = galloc((cnt+1)*sizeof(SplineChar *)); + cnt = 0; + for ( pt = names; *pt; pt = end+1 ) { + end = strchr(pt,' '); + if ( end==NULL ) + end = pt+strlen(pt); + ch = *end; + *end = '\0'; + sc = SFGetCharDup(sf,-1,pt); + if ( sc!=NULL && sc->ttf_glyph!=-1 ) + glyphs[cnt++] = sc; + *end = ch; + if ( ch=='\0' ) + break; + } + glyphs[cnt] = NULL; +return( glyphs ); +} + +static SplineChar **OrderedGlyphsFromNames(SplineFont *sf,char *names) { + SplineChar **glyphs = SFGlyphsFromNames(sf,names); + int i,j; + + if ( glyphs==NULL || glyphs[0]==NULL ) +return( glyphs ); + + for ( i=0; glyphs[i+1]!=NULL; ++i ) for ( j=i+1; glyphs[j]!=NULL; ++j ) { + if ( glyphs[i]->ttf_glyph > glyphs[j]->ttf_glyph ) { + SplineChar *sc = glyphs[i]; + glyphs[i] = glyphs[j]; + glyphs[j] = sc; + } + } +return( glyphs ); +} + +static void dumpgposkerndata(FILE *gpos,SplineFont *sf,int sli, + struct alltabs *at,int isv) { + int32 coverage_pos, next_val_pos, here; + int cnt, i, pcnt, max=100, j,k; + int *seconds = galloc(max*sizeof(int)); + int *changes = galloc(max*sizeof(int)); + int16 *offsets=NULL; + SplineChar **glyphs; + KernPair *kp; + uint32 script = sf->script_lang[sli][0].script; + int isr2l = ScriptIsRightToLeft(script); + + glyphs = generateGlyphList(sf,isv+1,sli,NULL); + cnt=0; + if ( glyphs!=NULL ) { + for ( ; glyphs[cnt]!=NULL; ++cnt ); + if ( at->os2.maxContext<2 ) + at->os2.maxContext = 2; + } + + putshort(gpos,1); /* format 1 of the pair adjustment subtable */ + coverage_pos = ftell(gpos); + putshort(gpos,0); /* offset to coverage table */ + if ( isv ) { + /* As far as I know there is no "bottom to top" writing direction */ + putshort(gpos,0x0008); /* Alter YAdvance of first character */ + putshort(gpos,0x0000); /* leave second char alone */ + } else if ( isr2l ) { + /* Right to left kerns modify the second character's width */ + /* this doesn't make sense to me, but who am I to argue */ + putshort(gpos,0x0000); /* leave first char alone */ + putshort(gpos,0x0005); /* Alter RSideBearing & XAdvance of second character */ + } else { + putshort(gpos,0x0004); /* Alter XAdvance of first character */ + putshort(gpos,0x0000); /* leave second char alone */ + } + putshort(gpos,cnt); + next_val_pos = ftell(gpos); + if ( glyphs!=NULL ) + offsets = galloc(cnt*sizeof(int16)); + for ( i=0; ivkerns : glyphs[i]->kerns; kp!=NULL; kp=kp->next ) + if ( kp->sli==sli ) ++pcnt; + putshort(gpos,pcnt); + if ( pcnt>=max ) { + max = pcnt+100; + seconds = grealloc(seconds,max*sizeof(int)); + changes = grealloc(changes,max*sizeof(int)); + } + for ( pcnt = 0, kp = isv ? glyphs[i]->vkerns : glyphs[i]->kerns; kp!=NULL; kp=kp->next ) { + if ( kp->sli==sli ) { + seconds[pcnt] = kp->sc->ttf_glyph; + changes[pcnt++] = kp->off; + } + } + for ( j=0; jttf_glyph!=-1 ) { + class[sc->ttf_glyph] = i; + if ( gs!=NULL ) + gs[sc->ttf_glyph] = sc; + } + *end = ch; + if ( ch=='\0' ) + break; + } + } +return( class ); +} + +static SplineChar **GlyphsFromClasses(SplineChar **gs, int numGlyphs) { + int i, cnt; + SplineChar **glyphs; + + for ( i=cnt=0; ilast-first+1+2 || first==-1 ) { + if ( first==-1 ) first = last = 0; + putshort(gpos,1); /* Format 1, list of all posibilities */ + putshort(gpos,first); + putshort(gpos,last-first+1); + for ( i=first; i<=last ; ++i ) + putshort(gpos,class[i]); + } else { + putshort(gpos,2); /* Format 2, series of ranges */ + putshort(gpos,ranges); + for ( i=0; iscript_lang[kc->sli][0].script; + uint16 *class1, *class2; + SplineChar **glyphs; + int i; + + putshort(gpos,2); /* format 2 of the pair adjustment subtable */ + putshort(gpos,0); /* offset to coverage table */ + if ( isv ) { + /* As far as I know there is no "bottom to top" writing direction */ + putshort(gpos,0x0008); /* Alter YAdvance of first character */ + putshort(gpos,0x0000); /* leave second char alone */ + } else if ( ScriptIsRightToLeft(script) ) { + /* Right to left kerns modify the second character's width */ + /* this doesn't make sense to me, but who am I to argue */ + putshort(gpos,0x0000); /* leave first char alone */ + putshort(gpos,0x0005); /* Alter RSideBearing & XAdvance of second character */ + } else { + putshort(gpos,0x0004); /* Alter XAdvance of first character */ + putshort(gpos,0x0000); /* leave second char alone */ + } + class1 = ClassesFromNames(sf,kc->firsts,kc->first_cnt,at->maxp.numGlyphs,&glyphs); + glyphs = GlyphsFromClasses(glyphs,at->maxp.numGlyphs); + class2 = ClassesFromNames(sf,kc->seconds,kc->second_cnt,at->maxp.numGlyphs,NULL); + putshort(gpos,0); /* offset to first glyph classes */ + putshort(gpos,0); /* offset to second glyph classes */ + putshort(gpos,kc->first_cnt); + putshort(gpos,kc->second_cnt); + for ( i=0; ifirst_cnt*kc->second_cnt; ++i ) { + if ( !isv && ScriptIsRightToLeft(script) ) + putshort(gpos,kc->offsets[i]); + putshort(gpos,kc->offsets[i]); + } + + pos = ftell(gpos); + fseek(gpos,begin_off+4*sizeof(uint16),SEEK_SET); + putshort(gpos,pos-begin_off); + fseek(gpos,pos,SEEK_SET); + DumpClass(gpos,class1,at->maxp.numGlyphs); + + pos = ftell(gpos); + fseek(gpos,begin_off+5*sizeof(uint16),SEEK_SET); + putshort(gpos,pos-begin_off); + fseek(gpos,pos,SEEK_SET); + DumpClass(gpos,class2,at->maxp.numGlyphs); + + pos = ftell(gpos); + fseek(gpos,begin_off+sizeof(uint16),SEEK_SET); + putshort(gpos,pos-begin_off); + fseek(gpos,pos,SEEK_SET); + dumpcoveragetable(gpos,glyphs); + + free(glyphs); + free(class1); + free(class2); +} + +static struct lookup *dumpgposCursiveAttach(FILE *gpos,AnchorClass *ac, + SplineFont *sf, struct lookup *lookups) { + struct lookup *new; + SplineChar **entryexit = EntryExitDecompose(sf,ac), **glyphs; + int i,cnt, offset,j; + AnchorPoint *ap, *entry, *exit; + uint32 coverage_offset; + + if ( entryexit==NULL ) +return( lookups ); + + for ( i=0; entryexit[i]!=NULL; ++i ) + entryexit[i]->ticked = false; + for ( i=0; entryexit[i]!=NULL; ++i ) if ( !entryexit[i]->ticked ) { + glyphs = GlyphsOfScript(entryexit,i); + for ( cnt=0; glyphs[cnt]!=NULL; ++cnt ); + new = chunkalloc(sizeof(struct lookup)); + new->feature_tag = ac->feature_tag; + new->flags = ac->flags; + new->script_lang_index = ac->script_lang_index; + new->lookup_type = 3; /* Cursive positioning */ + new->offset = ftell(gpos); + new->next = lookups; + lookups = new; + + putshort(gpos,1); /* format 1 for this subtable */ + putshort(gpos,0); /* Fill in later, offset to coverage table */ + putshort(gpos,cnt); /* number of glyphs */ + + offset = 6+2*2*cnt; + for ( j=0; janchor; ap!=NULL; ap=ap->next ) { + if ( ap->anchor==ac && ap->type==at_centry ) entry = ap; + if ( ap->anchor==ac && ap->type==at_cexit ) exit = ap; + } + if ( entry!=NULL ) { + putshort(gpos,offset); + offset += 6; + } else + putshort(gpos,0); + if ( exit!=NULL ) { + putshort(gpos,offset); + offset += 6; + } else + putshort(gpos,0); + } + for ( j=0; janchor; ap!=NULL; ap=ap->next ) { + if ( ap->anchor==ac && ap->type==at_centry ) entry = ap; + if ( ap->anchor==ac && ap->type==at_cexit ) exit = ap; + } + if ( entry!=NULL ) { + putshort(gpos,1); /* Anchor format 1 */ + putshort(gpos,entry->me.x); /* X coord of attachment */ + putshort(gpos,entry->me.y); /* Y coord of attachment */ + } + if ( exit!=NULL ) { + putshort(gpos,1); /* Anchor format 1 */ + putshort(gpos,exit->me.x); /* X coord of attachment */ + putshort(gpos,exit->me.y); /* Y coord of attachment */ + } + } + coverage_offset = ftell(gpos); + dumpcoveragetable(gpos,glyphs); + fseek(gpos,new->offset+2,SEEK_SET); + putshort(gpos,coverage_offset-new->offset); + fseek(gpos,0,SEEK_END); + new->len = ftell(gpos)-new->offset; + } +return( lookups ); +} + +static int orderglyph(const void *_sc1,const void *_sc2) { + SplineChar * const *sc1 = _sc1, * const *sc2 = _sc2; + +return( (*sc1)->ttf_glyph - (*sc2)->ttf_glyph ); +} + +static SplineChar **allmarkglyphs(SplineChar ***glyphlist, int classcnt) { + SplineChar **glyphs; + int i, tot, k; + + if ( classcnt==1 ) +return( glyphlist[0]); + + for ( i=tot=0; ifeature_tag = _ac->feature_tag; + new->flags = _ac->flags; + new->script_lang_index = _ac->script_lang_index; + new->lookup_type = 3+at; /* One of the "mark to *" types 4,5,6 */ + new->offset = ftell(gpos); + new->next = lookups; + lookups = new; + + putshort(gpos,1); /* format 1 for this subtable */ + putshort(gpos,0); /* Fill in later, offset to mark coverage table */ + putshort(gpos,0); /* Fill in later, offset to base coverage table */ + putshort(gpos,classcnt); + putshort(gpos,0); /* Fill in later, offset to mark array */ + putshort(gpos,12); /* Offset to base array */ + /* Base array */ + putshort(gpos,cnt); /* Number of entries in array */ + if ( at==at_basechar || at==at_basemark ) { + offset = 2; + for ( l=0; l<3; ++l ) { + for ( j=0; jnext ) { + for ( ap=base[j]->anchor; ap!=NULL && ap->anchor!=ac; ap=ap->next ); + if ( ap!=NULL ) switch ( l ) { + case 0: + offset += 2; + break; + case 1: + putshort(gpos,offset); + offset += 6; + break; + case 2: + putshort(gpos,1); /* Anchor format 1 */ + putshort(gpos,ap->me.x); /* X coord of attachment */ + putshort(gpos,ap->me.y); /* Y coord of attachment */ + break; + } + } + } + } + } else { + offset = 2+2*cnt; + suboffset = 0; + max = 0; + for ( j=0; janchor; ap!=NULL ; ap=ap->next ) + for ( k=0, ac=_ac; knext ) { + if ( ap->anchor==ac ) { + if ( ap->lig_index>pos ) pos = ap->lig_index; + ++tot; + } + } + if ( pos>max ) max = pos; + offset += 2+(pos+1)*classcnt*2+tot*6; + /* 2 for component count, for each component an offset to an offset to an anchor record */ + } + ++max; + aps = galloc((classcnt*max)*sizeof(AnchorPoint *)); + for ( j=0; janchor; ap!=NULL ; ap=ap->next ) + for ( k=0, ac=_ac; knext ) { + if ( ap->anchor==ac ) { + if ( ap->lig_index>pos ) pos = ap->lig_index; + aps[k*max+ap->lig_index] = ap; + } + } + ++pos; + putshort(gpos,pos); + offset = 2+2*pos*classcnt; + for ( l=0; lme.x); /* X coord of attachment */ + putshort(gpos,aps[k*max+l]->me.y); /* Y coord of attachment */ + } + } + } + } + free(aps); + } + coverage_offset = ftell(gpos); + fseek(gpos,lookups->offset+4,SEEK_SET); + putshort(gpos,coverage_offset-lookups->offset); + fseek(gpos,0,SEEK_END); + dumpcoveragetable(gpos,base); + + /* We tried sharing the mark table, (among all these sub-tables) but */ + /* that doesn't work because we need to be able to reorder the sub-tables */ + markglyphs = allmarkglyphs(marks,classcnt); + coverage_offset = ftell(gpos); + dumpcoveragetable(gpos,markglyphs); + markarray_offset = ftell(gpos); + for ( cnt=0; markglyphs[cnt]!=NULL; ++cnt ); + putshort(gpos,cnt); + offset = 2+4*cnt; + for ( j=0; jnext ) { + for ( ap = markglyphs[j]->anchor; ap!=NULL && ap->anchor!=ac; ap=ap->next ); + if ( ap!=NULL ) + break; + } + putshort(gpos,k); + } + putshort(gpos,offset); + offset += 6; + } + for ( j=0; jnext ) { + for ( ap = markglyphs[j]->anchor; ap!=NULL && ap->anchor!=ac; ap=ap->next ); + if ( ap!=NULL ) + break; + } + putshort(gpos,1); /* Anchor format 1 */ + putshort(gpos,ap->me.x); /* X coord of attachment */ + putshort(gpos,ap->me.y); /* Y coord of attachment */ + } + if ( markglyphs!=marks[0] ) + free(markglyphs); + + fseek(gpos,new->offset+2,SEEK_SET); /* mark coverage table offset */ + putshort(gpos,coverage_offset-new->offset); + fseek(gpos,4,SEEK_CUR); + putshort(gpos,markarray_offset-new->offset); + + fseek(gpos,0,SEEK_END); + new->len = ftell(gpos)-new->offset; + +return( lookups ); +} + +static void dumpGPOSsimplepos(FILE *gpos,SplineFont *sf,SplineChar **glyphs, + struct tagflaglang *tfl) { + int cnt, cnt2; + int32 coverage_pos, end; + PST *pst, *first=NULL; + int bits = 0, same=true; + + for ( cnt=cnt2=0; glyphs[cnt]!=NULL; ++cnt) { + for ( pst=glyphs[cnt]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->tag==tfl->tag && pst->flags==tfl->flags && + pst->script_lang_index == tfl->script_lang_index && pst->type==pst_position ) { + if ( first==NULL ) first = pst; + else if ( same ) { + if ( first->u.pos.xoff!=pst->u.pos.xoff || + first->u.pos.yoff!=pst->u.pos.yoff || + first->u.pos.h_adv_off!=pst->u.pos.h_adv_off || + first->u.pos.v_adv_off!=pst->u.pos.v_adv_off ) + same = false; + } + if ( pst->u.pos.xoff!=0 ) bits |= 1; + if ( pst->u.pos.yoff!=0 ) bits |= 2; + if ( pst->u.pos.h_adv_off!=0 ) bits |= 4; + if ( pst->u.pos.v_adv_off!=0 ) bits |= 8; + ++cnt2; + break; + } + } + } + if ( bits==0 ) bits=1; + if ( cnt!=cnt2 ) + fprintf( stderr, "Count mismatch in dumpGPOSsimplepos#1 %d vs %d\n", cnt, cnt2 ); + + putshort(gpos,same?1:2); /* 1 means all value records same */ + coverage_pos = ftell(gpos); + putshort(gpos,0); /* offset to coverage table */ + putshort(gpos,bits); + if ( same ) { + if ( bits&1 ) putshort(gpos,first->u.pos.xoff); + if ( bits&2 ) putshort(gpos,first->u.pos.yoff); + if ( bits&4 ) putshort(gpos,first->u.pos.h_adv_off); + if ( bits&8 ) putshort(gpos,first->u.pos.v_adv_off); + } else { + putshort(gpos,cnt); + for ( cnt2 = 0; glyphs[cnt2]!=NULL; ++cnt2 ) { + for ( pst=glyphs[cnt2]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->tag==tfl->tag && pst->flags==tfl->flags && + pst->script_lang_index == tfl->script_lang_index && pst->type==pst_position ) { + if ( bits&1 ) putshort(gpos,pst->u.pos.xoff); + if ( bits&2 ) putshort(gpos,pst->u.pos.yoff); + if ( bits&4 ) putshort(gpos,pst->u.pos.h_adv_off); + if ( bits&8 ) putshort(gpos,pst->u.pos.v_adv_off); + break; + } + } + } + if ( cnt!=cnt2 ) + fprintf( stderr, "Count mismatch in dumpGPOSsimplepos#3 %d vs %d\n", cnt, cnt2 ); + } + end = ftell(gpos); + fseek(gpos,coverage_pos,SEEK_SET); + putshort(gpos,end-coverage_pos+2); + fseek(gpos,end,SEEK_SET); + dumpcoveragetable(gpos,glyphs); + fseek(gpos,0,SEEK_END); + free(glyphs); +} + + +static void dumpGPOSpairpos(FILE *gpos,SplineFont *sf,SplineChar **glyphs, + struct tagflaglang *tfl) { + int cnt; + int32 coverage_pos, offset_pos, end, start, pos; + PST *pst; + int vf1 = 0, vf2=0, i, subcnt; + SplineChar *sc; + + for ( cnt=0; glyphs[cnt]!=NULL; ++cnt) { + for ( pst=glyphs[cnt]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->tag==tfl->tag && pst->flags==tfl->flags && + pst->script_lang_index == tfl->script_lang_index && + pst->type==pst_pair ) { + if ( pst->u.pair.vr[0].xoff!=0 ) vf1 |= 1; + if ( pst->u.pair.vr[0].yoff!=0 ) vf1 |= 2; + if ( pst->u.pair.vr[0].h_adv_off!=0 ) vf1 |= 4; + if ( pst->u.pair.vr[0].v_adv_off!=0 ) vf1 |= 8; + if ( pst->u.pair.vr[1].xoff!=0 ) vf2 |= 1; + if ( pst->u.pair.vr[1].yoff!=0 ) vf2 |= 2; + if ( pst->u.pair.vr[1].h_adv_off!=0 ) vf2 |= 4; + if ( pst->u.pair.vr[1].v_adv_off!=0 ) vf2 |= 8; + } + } + } + if ( vf1==0 && vf2==0 ) vf1=1; + + start = ftell(gpos); + putshort(gpos,1); /* 1 means char pairs (ie. not classes) */ + coverage_pos = ftell(gpos); + putshort(gpos,0); /* offset to coverage table */ + putshort(gpos,vf1); + putshort(gpos,vf2); + putshort(gpos,cnt); + offset_pos = ftell(gpos); + for ( i=0; ipossub; pst!=NULL; pst=pst->next ) { + if ( pst->tag==tfl->tag && pst->flags==tfl->flags && + pst->script_lang_index == tfl->script_lang_index && + pst->type==pst_pair ) + ++subcnt; + } + putshort(gpos,subcnt); + for ( pst=glyphs[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->tag==tfl->tag && pst->flags==tfl->flags && + pst->script_lang_index == tfl->script_lang_index && + pst->type==pst_pair ) { + sc = SFGetCharDup(sf,-1,pst->u.pair.paired); + if ( sc==NULL || sc->ttf_glyph==-1 ) + putshort(gpos,0); + else + putshort(gpos,sc->ttf_glyph); + if ( vf1&1 ) putshort(gpos,pst->u.pair.vr[0].xoff); + if ( vf1&2 ) putshort(gpos,pst->u.pair.vr[0].yoff); + if ( vf1&4 ) putshort(gpos,pst->u.pair.vr[0].h_adv_off); + if ( vf1&8 ) putshort(gpos,pst->u.pair.vr[0].v_adv_off); + if ( vf2&1 ) putshort(gpos,pst->u.pair.vr[1].xoff); + if ( vf2&2 ) putshort(gpos,pst->u.pair.vr[1].yoff); + if ( vf2&4 ) putshort(gpos,pst->u.pair.vr[1].h_adv_off); + if ( vf2&8 ) putshort(gpos,pst->u.pair.vr[1].v_adv_off); + } + } + } + end = ftell(gpos); + fseek(gpos,coverage_pos,SEEK_SET); + putshort(gpos,end-start); + fseek(gpos,end,SEEK_SET); + dumpcoveragetable(gpos,glyphs); + free(glyphs); +} + +static void dumpgsubligdata(FILE *gsub,SplineFont *sf, + struct tagflaglang *ligtag, struct alltabs *at) { + int32 coverage_pos, next_val_pos, here, lig_list_start; + int cnt, i, pcnt, lcnt, max=100, j; + uint16 *offsets=NULL, *ligoffsets=galloc(max*sizeof(uint16)); + SplineChar **glyphs; + LigList *ll; + struct splinecharlist *scl; + + glyphs = generateGlyphList(sf,false,0,ligtag); + cnt=0; + if ( glyphs!=NULL ) for ( ; glyphs[cnt]!=NULL; ++cnt ); + + putshort(gsub,1); /* only one format for ligatures */ + coverage_pos = ftell(gsub); + putshort(gsub,0); /* offset to coverage table */ + putshort(gsub,cnt); + next_val_pos = ftell(gsub); + if ( glyphs!=NULL ) + offsets = galloc(cnt*sizeof(int16)); + for ( i=0; iligofme; ll!=NULL; ll=ll->next ) + if ( ll->lig->tag==ligtag->tag && ll->lig->flags == ligtag->flags && + ll->lig->script_lang_index == ligtag->script_lang_index && + AllToBeOutput(ll)) + ++pcnt; + putshort(gsub,pcnt); + if ( pcnt>=max ) { + max = pcnt+100; + ligoffsets = grealloc(ligoffsets,max*sizeof(int)); + } + lig_list_start = ftell(gsub); + for ( j=0; jligofme; ll!=NULL; ll=ll->next ) { + if ( ll->lig->tag==ligtag->tag && ll->lig->flags == ligtag->flags && + ll->lig->script_lang_index==ligtag->script_lang_index && + AllToBeOutput(ll)) { + ligoffsets[pcnt] = ftell(gsub)-lig_list_start+2; + putshort(gsub,ll->lig->u.lig.lig->ttf_glyph); + for ( lcnt=0, scl=ll->components; scl!=NULL; scl=scl->next ) ++lcnt; + putshort(gsub, lcnt+1); + if ( lcnt+1>at->os2.maxContext ) + at->os2.maxContext = lcnt+1; + for ( scl=ll->components; scl!=NULL; scl=scl->next ) + putshort(gsub, scl->sc->ttf_glyph ); + ++pcnt; + } + } + fseek(gsub,lig_list_start,SEEK_SET); + for ( j=0; jttf_glyph - glyphs[0]->ttf_glyph; + for ( cnt=0; glyphs[cnt]!=NULL; ++cnt) + if ( diff!= maps[cnt][0]->ttf_glyph-glyphs[cnt]->ttf_glyph ) ok = false; + + if ( ok ) { + putshort(gsub,1); /* delta format */ + coverage_pos = ftell(gsub); + putshort(gsub,0); /* offset to coverage table */ + putshort(gsub,diff); + } else { + putshort(gsub,2); /* glyph list format */ + coverage_pos = ftell(gsub); + putshort(gsub,0); /* offset to coverage table */ + putshort(gsub,cnt); + for ( cnt = 0; glyphs[cnt]!=NULL; ++cnt ) + putshort(gsub,(*maps[cnt])->ttf_glyph); + } + end = ftell(gsub); + fseek(gsub,coverage_pos,SEEK_SET); + putshort(gsub,end-coverage_pos+2); + fseek(gsub,end,SEEK_SET); + dumpcoveragetable(gsub,glyphs); +} + +static void dumpGSUBmultiplesubs(FILE *gsub,SplineFont *sf,SplineChar **glyphs, SplineChar ***maps) { + int cnt, offset; + int32 coverage_pos, end; + int gc; + + for ( cnt=0; glyphs[cnt]!=NULL; ++cnt); + + putshort(gsub,1); /* glyph list format */ + coverage_pos = ftell(gsub); + putshort(gsub,0); /* offset to coverage table */ + putshort(gsub,cnt); + offset = 6+2*cnt; + for ( cnt = 0; glyphs[cnt]!=NULL; ++cnt ) { + putshort(gsub,offset); + for ( gc=0; maps[cnt][gc]!=NULL; ++gc ); + offset += 2+2*gc; + } + for ( cnt = 0; glyphs[cnt]!=NULL; ++cnt ) { + for ( gc=0; maps[cnt][gc]!=NULL; ++gc ); + putshort(gsub,gc); + for ( gc=0; maps[cnt][gc]!=NULL; ++gc ) + putshort(gsub,maps[cnt][gc]->ttf_glyph); + } + end = ftell(gsub); + fseek(gsub,coverage_pos,SEEK_SET); + putshort(gsub,end-coverage_pos+2); + fseek(gsub,end,SEEK_SET); + dumpcoveragetable(gsub,glyphs); +} + +static struct lookup *LookupFromTagFlagLang(struct tagflaglang *tfl ) { + struct lookup *new; + + new = chunkalloc(sizeof(struct lookup)); + new->feature_tag = tfl->tag; + new->flags = tfl->flags; + new->script_lang_index = tfl->script_lang_index; +return( new ); +} + +static void TagFlagLangFromPST(struct tagflaglang *tfl,PST *pst) { + tfl->script_lang_index = pst->script_lang_index; + tfl->flags = pst->flags; + tfl->tag = pst->tag; +} + +void AnchorClassOrder(SplineFont *sf) { + AnchorClass *ac, *p, *ac2, *n, *last; + /* Order the AnchorClasses so that all those with the same: + tag + sli + merge field + are together. These will be treated as one sub-table (well we might + get 2 sub-tables if there are both ligature and normal base glyphs) + */ + for ( ac=sf->anchor; ac!=NULL; ac = ac->next ) { + last = ac; + for ( p=ac, ac2 = ac->next; ac2!=NULL; ac2 = n ) { + n = ac2->next; + if ( ac2->feature_tag==ac->feature_tag && + ac2->script_lang_index == ac->script_lang_index && + ac2->merge_with == ac->merge_with && + last!=p ) { /* if p==ac we don't need to do anything, already in place */ + ac2->next = last->next; + last->next = ac2; + p->next = n; + last = ac2; + } else + p = ac2; + } + } +} + +static int AnchorHasMark(SplineFont *sf,AnchorClass *ac) { + int i; + AnchorPoint *ap; + + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL ) { + for ( ap=sf->chars[i]->anchor; ap!=NULL ; ap=ap->next ) { + if ( ap->anchor==ac && ap->type==at_mark ) +return( true ); + } + } +return( false ); +} + +static uint16 *FigureInitialClasses(FPST *fpst) { + uint16 *initial = galloc((fpst->nccnt+1)*sizeof(uint16)); + int i, cnt, j; + + for ( i=cnt=0; irule_cnt; ++i ) { + for ( j=0; jrules[i].u.class.nclasses[0] ) + break; + if ( j==cnt ) + initial[cnt++] = fpst->rules[i].u.class.nclasses[0]; + } + initial[cnt] = 0xffff; +return( initial ); +} + +static SplineChar **OrderedInitialGlyphs(SplineFont *sf,FPST *fpst) { + SplineChar **glyphs, *sc; + int i, j, cnt, ch; + char *pt, *names; + + glyphs = galloc((fpst->rule_cnt+1)*sizeof(SplineChar *)); + for ( i=cnt=0; irule_cnt; ++i ) { + names = fpst->rules[i].u.glyph.names; + pt = strchr(names,' '); + if ( pt==NULL ) pt = names+strlen(names); + ch = *pt; *pt = '\0'; + sc = SFGetCharDup(sf,-1,names); + *pt = ch; + for ( j=0; jttf_glyph > glyphs[j]->ttf_glyph ) { + sc = glyphs[i]; + glyphs[i] = glyphs[j]; + glyphs[j] = sc; + } + } +return( glyphs ); +} + +static int NamesStartWith(SplineChar *sc,char *names ) { + char *pt; + + pt = strchr(names,' '); + if ( pt==NULL ) pt = names+strlen(names); + if ( pt-names!=strlen(sc->name)) +return( false ); + +return( strncmp(sc->name,names,pt-names)==0 ); +} + +static int CntRulesStartingWith(FPST *fpst,SplineChar *sc) { + int i, cnt; + + for ( i=cnt=0; irule_cnt; ++i ) { + if ( NamesStartWith(sc,fpst->rules[i].u.glyph.names)) + ++cnt; + } +return( cnt ); +} + +static int CntRulesStartingWithClass(FPST *fpst,uint16 cval) { + int i, cnt; + + for ( i=cnt=0; irule_cnt; ++i ) { + if ( fpst->rules[i].u.class.nclasses[0]==cval ) + ++cnt; + } +return( cnt ); +} + +static int g___FigureNest(struct lookup **nested, struct postponedlookup **pp, + struct alltabs *at, uint32 tag) { + struct lookup *l; + struct postponedlookup *p, *prev; + + for ( l=*nested; l!=NULL; l=l->next ) + if ( l->feature_tag == tag ) +return( l->lookup_cnt ); + prev = NULL; + for ( p = *pp; p!=NULL; p=p->next ) { + if ( p->feature_tag == tag ) +return( p->lookup_cnt ); + prev = p; + } + + p = chunkalloc(sizeof(struct postponedlookup)); + p->feature_tag = tag; + p->lookup_cnt = at->next_lookup++; + if ( prev!=NULL ) + prev->next = p; + else + *pp = p; +return( p->lookup_cnt ); +} + +static void dumpg___ContextChainGlyphs(FILE *lfile,FPST *fpst,SplineFont *sf, + struct lookup **nested, struct postponedlookup **pp, struct alltabs *at) { + int iscontext = fpst->type==pst_contextpos || fpst->type==pst_contextsub; + uint32 base = ftell(lfile); + int i,cnt, subcnt, j,k,l, maxcontext,curcontext; + SplineChar **glyphs, **subglyphs; + uint8 *exists; + int lc; + int ispos = (fpst->type==pst_contextpos || fpst->type==pst_chainpos); + + glyphs = OrderedInitialGlyphs(sf,fpst); + for ( cnt=0; glyphs[cnt]!=NULL; ++cnt ); + + putshort(lfile,1); /* Sub format 1 => glyph lists */ + putshort(lfile,(3+cnt)*sizeof(short)); /* offset to coverage */ + putshort(lfile,cnt); + for ( i=0; irule_cnt; ++k ) if ( NamesStartWith(glyphs[i],fpst->rules[k].u.glyph.names )) { + uint32 subpos = ftell(lfile); + fseek(lfile,pos+(1+j)*sizeof(short),SEEK_SET); + putshort(lfile,subpos-pos); + fseek(lfile,subpos,SEEK_SET); + + exists = galloc(fpst->rules[k].lookup_cnt*sizeof(uint8)); + for ( l=lc=0; lrules[k].lookup_cnt; ++l ) + lc += ( exists[l] = SFHasNestedLookupWithTag(sf,fpst->rules[k].lookups[l].lookup_tag,ispos)); + if ( iscontext ) { + subglyphs = SFGlyphsFromNames(sf,fpst->rules[k].u.glyph.names); + for ( l=0; subglyphs[l]!=NULL; ++l ); + putshort(lfile,l); + curcontext = l; + putshort(lfile,lc); + for ( l=1; subglyphs[l]!=NULL; ++l ) + putshort(lfile,subglyphs[l]->ttf_glyph); + free(subglyphs); + } else { + subglyphs = SFGlyphsFromNames(sf,fpst->rules[k].u.glyph.back); + for ( l=0; subglyphs[l]!=NULL; ++l ); + putshort(lfile,l); + curcontext = l; + for ( l=0; subglyphs[l]!=NULL; ++l ) + putshort(lfile,subglyphs[l]->ttf_glyph); + free(subglyphs); + subglyphs = SFGlyphsFromNames(sf,fpst->rules[k].u.glyph.names); + for ( l=0; subglyphs[l]!=NULL; ++l ); + putshort(lfile,l); + curcontext += l; + for ( l=1; subglyphs[l]!=NULL; ++l ) + putshort(lfile,subglyphs[l]->ttf_glyph); + free(subglyphs); + subglyphs = SFGlyphsFromNames(sf,fpst->rules[k].u.glyph.fore); + for ( l=0; subglyphs[l]!=NULL; ++l ); + putshort(lfile,l); + curcontext += l; + for ( l=0; subglyphs[l]!=NULL; ++l ) + putshort(lfile,subglyphs[l]->ttf_glyph); + free(subglyphs); + putshort(lfile,lc); + } + for ( l=0; lrules[k].lookup_cnt; ++l ) if ( exists[l] ) { + putshort(lfile,fpst->rules[k].lookups[l].seq); + putshort(lfile,g___FigureNest(nested,pp,at,fpst->rules[k].lookups[l].lookup_tag)); + } + free(exists); + ++j; + if ( curcontext>maxcontext ) maxcontext = curcontext; + } + } + free(glyphs); + + if ( maxcontext>at->os2.maxContext ) + at->os2.maxContext = maxcontext; +} + +static void dumpg___ContextChainClass(FILE *lfile,FPST *fpst,SplineFont *sf, + struct lookup **nested, struct postponedlookup **pp, struct alltabs *at) { + int iscontext = fpst->type==pst_contextpos || fpst->type==pst_contextsub; + uint32 base = ftell(lfile), rulebase, pos, subpos, npos; + uint16 *initialclasses, *iclass, *bclass, *lclass; + SplineChar **iglyphs, **bglyphs, **lglyphs, **glyphs; + int i,ii,cnt, subcnt, j,k,l , maxcontext,curcontext; + uint8 *exists; + int lc; + int ispos = (fpst->type==pst_contextpos || fpst->type==pst_chainpos); + + putshort(lfile,2); /* Sub format 2 => class */ + putshort(lfile,0); /* offset to coverage table */ + if ( iscontext ) + putshort(lfile,0); /* offset to input classdef */ + else { + putshort(lfile,0); /* offset to backtrack classdef */ + putshort(lfile,0); /* offset to input classdef */ + putshort(lfile,0); /* offset to lookahead classdef */ + } + initialclasses = FigureInitialClasses(fpst); + putshort(lfile,fpst->nccnt); + rulebase = ftell(lfile); + for ( cnt=0; cntnccnt; ++cnt ) + putshort(lfile,0); + + iclass = ClassesFromNames(sf,fpst->nclass,fpst->nccnt,at->maxp.numGlyphs,&iglyphs); + lglyphs = bglyphs = NULL; bclass = lclass = NULL; + if ( !iscontext ) { + bclass = ClassesFromNames(sf,fpst->bclass,fpst->bccnt,at->maxp.numGlyphs,&bglyphs); + lclass = ClassesFromNames(sf,fpst->fclass,fpst->fccnt,at->maxp.numGlyphs,&lglyphs); + } + pos = ftell(lfile); + fseek(lfile,base+2,SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + glyphs = GlyphsFromInitialClasses(iglyphs,at->maxp.numGlyphs,iclass,initialclasses); + dumpcoveragetable(lfile,glyphs); + free(glyphs); + free(iglyphs); free(bglyphs); free(lglyphs); + + if ( iscontext ) { + pos = ftell(lfile); + fseek(lfile,base+2*sizeof(uint16),SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + DumpClass(lfile,iclass,at->maxp.numGlyphs); + free(iclass); + } else { + pos = ftell(lfile); + fseek(lfile,base+2*sizeof(uint16),SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + DumpClass(lfile,bclass,at->maxp.numGlyphs); + if ( ClassesMatch(fpst->bccnt,fpst->bclass,fpst->nccnt,fpst->nclass)) { + npos = pos; + fseek(lfile,base+3*sizeof(uint16),SEEK_SET); + putshort(lfile,npos-base); + fseek(lfile,0,SEEK_END); + } else { + npos = ftell(lfile); + fseek(lfile,base+3*sizeof(uint16),SEEK_SET); + putshort(lfile,npos-base); + fseek(lfile,npos,SEEK_SET); + DumpClass(lfile,iclass,at->maxp.numGlyphs); + } + if ( ClassesMatch(fpst->fccnt,fpst->fclass,fpst->bccnt,fpst->bclass)) { + fseek(lfile,base+4*sizeof(uint16),SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,0,SEEK_END); + } else if ( ClassesMatch(fpst->fccnt,fpst->fclass,fpst->nccnt,fpst->nclass)) { + fseek(lfile,base+4*sizeof(uint16),SEEK_SET); + putshort(lfile,npos-base); + fseek(lfile,0,SEEK_END); + } else { + pos = ftell(lfile); + fseek(lfile,base+4*sizeof(uint16),SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + DumpClass(lfile,lclass,at->maxp.numGlyphs); + } + free(iclass); free(bclass); free(lclass); + } + + ii=0; + for ( i=0; inccnt; ++i ) { + if ( initialclasses[ii]!=i ) { + /* This class isn't an initial one, so leave it's rule pointer NULL */ + } else { + ++ii; + pos = ftell(lfile); + fseek(lfile,rulebase+i*sizeof(short),SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + subcnt = CntRulesStartingWithClass(fpst,i); + putshort(lfile,subcnt); + for ( j=0; jrule_cnt; ++k ) if ( i==fpst->rules[k].u.class.nclasses[0] ) { + subpos = ftell(lfile); + fseek(lfile,pos+(1+j)*sizeof(short),SEEK_SET); + putshort(lfile,subpos-pos); + fseek(lfile,subpos,SEEK_SET); + + exists = galloc(fpst->rules[k].lookup_cnt*sizeof(uint8)); + for ( l=lc=0; lrules[k].lookup_cnt; ++l ) + lc += ( exists[l] = SFHasNestedLookupWithTag(sf,fpst->rules[k].lookups[l].lookup_tag,ispos)); + if ( iscontext ) { + putshort(lfile,fpst->rules[k].u.class.ncnt); + putshort(lfile,lc); + for ( l=1; lrules[k].u.class.ncnt; ++l ) + putshort(lfile,fpst->rules[k].u.class.nclasses[l]); + } else { + putshort(lfile,fpst->rules[k].u.class.bcnt); + for ( l=0; lrules[k].u.class.bcnt; ++l ) + putshort(lfile,fpst->rules[k].u.class.bclasses[l]); + putshort(lfile,fpst->rules[k].u.class.ncnt); + for ( l=1; lrules[k].u.class.ncnt; ++l ) + putshort(lfile,fpst->rules[k].u.class.nclasses[l]); + putshort(lfile,fpst->rules[k].u.class.fcnt); + for ( l=0; lrules[k].u.class.fcnt; ++l ) + putshort(lfile,fpst->rules[k].u.class.fclasses[l]); + putshort(lfile,lc); + } + for ( l=0; lrules[k].lookup_cnt; ++l ) if ( exists[l] ) { + putshort(lfile,fpst->rules[k].lookups[l].seq); + putshort(lfile,g___FigureNest(nested,pp,at,fpst->rules[k].lookups[l].lookup_tag)); + } + free(exists); + ++j; + } + } + } + free(initialclasses); + + maxcontext = 0; + for ( i=0; irule_cnt; ++i ) { + curcontext = fpst->rules[i].u.class.ncnt+fpst->rules[i].u.class.bcnt+fpst->rules[i].u.class.fcnt; + if ( curcontext>maxcontext ) maxcontext = curcontext; + } + if ( maxcontext>at->os2.maxContext ) + at->os2.maxContext = maxcontext; +} + +static void dumpg___ContextChainCoverage(FILE *lfile,FPST *fpst,SplineFont *sf, + struct lookup **nested, struct postponedlookup **pp, struct alltabs *at) { + int iscontext = fpst->type==pst_contextpos || fpst->type==pst_contextsub; + uint32 base = ftell(lfile), ibase, lbase, bbase; + int i; + SplineChar **glyphs; + int curcontext; + uint8 *exists; + int lc; + int ispos = (fpst->type==pst_contextpos || fpst->type==pst_chainpos); + + if ( fpst->rule_cnt!=1 ) + GDrawIError("Bad rule cnt in coverage context lookup"); + if ( fpst->format==pst_reversecoverage && fpst->rules[0].u.rcoverage.always1!=1 ) + GDrawIError("Bad input count in reverse coverage lookup" ); + + putshort(lfile,3); /* Sub format 3 => coverage */ + exists = galloc(fpst->rules[0].lookup_cnt*sizeof(uint8)); + for ( i=lc=0; irules[0].lookup_cnt; ++i ) + lc += ( exists[i] = SFHasNestedLookupWithTag(sf,fpst->rules[0].lookups[i].lookup_tag,ispos)); + if ( iscontext ) { + putshort(lfile,fpst->rules[0].u.coverage.ncnt); + putshort(lfile,lc); + for ( i=0; irules[0].u.coverage.ncnt; ++i ) + putshort(lfile,0); + for ( i=0; irules[0].lookup_cnt; ++i ) if ( exists[i] ) { + putshort(lfile,fpst->rules[0].lookups[i].seq); + putshort(lfile,g___FigureNest(nested,pp,at,fpst->rules[0].lookups[i].lookup_tag)); + } + for ( i=0; irules[0].u.coverage.ncnt; ++i ) { + uint32 pos = ftell(lfile); + fseek(lfile,base+4+2*i,SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + glyphs = OrderedGlyphsFromNames(sf,fpst->rules[0].u.coverage.ncovers[i]); + dumpcoveragetable(lfile,glyphs); + free(glyphs); + } + } else { + if ( fpst->format==pst_reversecoverage ) { + ibase = ftell(lfile); + putshort(lfile,0); + } + putshort(lfile,fpst->rules[0].u.coverage.bcnt); + bbase = ftell(lfile); + for ( i=0; irules[0].u.coverage.bcnt; ++i ) + putshort(lfile,0); + if ( fpst->format==pst_coverage ) { + putshort(lfile,fpst->rules[0].u.coverage.ncnt); + ibase = ftell(lfile); + for ( i=0; irules[0].u.coverage.ncnt; ++i ) + putshort(lfile,0); + } + putshort(lfile,fpst->rules[0].u.coverage.fcnt); + lbase = ftell(lfile); + for ( i=0; irules[0].u.coverage.fcnt; ++i ) + putshort(lfile,0); + if ( fpst->format==pst_coverage ) { + putshort(lfile,lc); + for ( i=0; irules[0].lookup_cnt; ++i ) if ( exists[i] ) { + putshort(lfile,fpst->rules[0].lookups[i].seq); + putshort(lfile,g___FigureNest(nested,pp,at,fpst->rules[0].lookups[i].lookup_tag)); + } + } else { /* reverse coverage */ + glyphs = SFGlyphsFromNames(sf,fpst->rules[0].u.rcoverage.replacements); + for ( i=0; glyphs[i]!=0; ++i ); + putshort(lfile,i); + for ( i=0; glyphs[i]!=0; ++i ) + putshort(lfile,glyphs[i]->ttf_glyph); + } + for ( i=0; irules[0].u.coverage.ncnt; ++i ) { + uint32 pos = ftell(lfile); + fseek(lfile,ibase+2*i,SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + glyphs = OrderedGlyphsFromNames(sf,fpst->rules[0].u.coverage.ncovers[i]); + dumpcoveragetable(lfile,glyphs); + free(glyphs); + } + for ( i=0; irules[0].u.coverage.bcnt; ++i ) { + uint32 pos = ftell(lfile); + fseek(lfile,bbase+2*i,SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + glyphs = OrderedGlyphsFromNames(sf,fpst->rules[0].u.coverage.bcovers[i]); + dumpcoveragetable(lfile,glyphs); + free(glyphs); + } + for ( i=0; irules[0].u.coverage.fcnt; ++i ) { + uint32 pos = ftell(lfile); + fseek(lfile,lbase+2*i,SEEK_SET); + putshort(lfile,pos-base); + fseek(lfile,pos,SEEK_SET); + glyphs = OrderedGlyphsFromNames(sf,fpst->rules[0].u.coverage.fcovers[i]); + dumpcoveragetable(lfile,glyphs); + free(glyphs); + } + } + + curcontext = fpst->rules[0].u.coverage.ncnt+fpst->rules[0].u.coverage.bcnt+fpst->rules[0].u.coverage.fcnt; + if ( curcontext>at->os2.maxContext ) + at->os2.maxContext = curcontext; +} + +static void g___HandleNested(FILE *lfile,SplineFont *sf,int gpos, + struct lookup **nested,struct postponedlookup *pp, struct alltabs *at); + +static struct lookup *dumpg___ContextChain(FILE *lfile,FPST *fpst,SplineFont *sf, + struct lookup *lookups,struct lookup **nested,struct alltabs *at) { + struct lookup *new; + struct postponedlookup *pp = NULL; + + new = chunkalloc(sizeof(struct lookup)); + new->feature_tag = fpst->tag; + new->flags = fpst->flags; + new->script_lang_index = fpst->script_lang_index; + new->lookup_type = fpst->type == pst_contextpos ? 7 : + fpst->type == pst_chainpos ? 8 : + fpst->type == pst_contextsub ? 5 : + fpst->type == pst_chainsub ? 6 : + /* fpst->type == pst_reversesub */ 8; + new->offset = ftell(lfile); + new->next = lookups; + lookups = new; + + switch ( fpst->format ) { + case pst_glyphs: + dumpg___ContextChainGlyphs(lfile,fpst,sf,nested,&pp,at); + break; + case pst_class: + dumpg___ContextChainClass(lfile,fpst,sf,nested,&pp,at); + break; + case pst_coverage: + case pst_reversecoverage: + dumpg___ContextChainCoverage(lfile,fpst,sf,nested,&pp,at); + break; + } + + fseek(lfile,0,SEEK_END); + new->len = ftell(lfile)-new->offset; + + g___HandleNested(lfile,sf,fpst->type==pst_contextpos || fpst->type==pst_chainpos, + nested,pp,at); +return( lookups ); +} + +static struct lookup *AnchorsAway(FILE *lfile,SplineFont *sf,struct lookup *lookups, + uint32 tag ) { + SplineChar **base, **lig, **mkmk; + AnchorClass *ac, *ac2; + SplineChar ***marks; + int *subcnts; + int cmax, classcnt; + int i; + + marks = galloc((cmax=20)*sizeof(SplineChar **)); + subcnts = galloc(cmax*sizeof(int)); + + for ( ac=sf->anchor; ac!=NULL; ac = ac->next ) { + if ( !ac->processed && + ((tag==0 && ac->script_lang_index!=SLI_NESTED) || + (tag!=0 && ac->script_lang_index==SLI_NESTED && ac->feature_tag == tag))) { + if ( ac->type==act_curs ) + lookups = dumpgposCursiveAttach(lfile,ac,sf,lookups); + else if ( ac->has_mark ) { + ac->matches = ac->processed = true; + for ( ac2 = ac->next, classcnt=1; ac2!=NULL ; ac2 = ac2->next ) { + if ( ac2->has_mark && !ac2->processed && + ac2->feature_tag==ac->feature_tag && + ac2->script_lang_index == ac->script_lang_index && + ac2->merge_with == ac->merge_with ) { + ac2->matches = true; + ac2->processed = true; + ++classcnt; + } else + ac2->matches = false; + } + if ( classcnt>cmax ) { + marks = grealloc(marks,(cmax=classcnt+10)*sizeof(SplineChar **)); + subcnts = grealloc(subcnts,cmax*sizeof(int)); + } + AnchorClassDecompose(sf,ac,classcnt,subcnts,marks,&base,&lig,&mkmk); + if ( marks[0]!=NULL && base!=NULL ) + lookups = dumpgposAnchorData(lfile,ac,at_basechar,marks,base,lookups,classcnt); + if ( marks[0]!=NULL && lig!=NULL ) + lookups = dumpgposAnchorData(lfile,ac,at_baselig,marks,lig,lookups,classcnt); + if ( marks[0]!=NULL && mkmk!=NULL ) + lookups = dumpgposAnchorData(lfile,ac,at_basemark,marks,mkmk,lookups,classcnt); + for ( i=0; inext; + new = NULL; + + /* I don't think there is anything to be gained by nesting contexts */ + /* but they are easy to support, so do so */ + for ( fpst=sf->possub; fpst!=NULL; fpst = fpst->next ) { + if ((( gpos && (fpst->type==pst_contextpos || fpst->type==pst_chainpos)) || + (!gpos && (fpst->type==pst_contextsub || fpst->type==pst_chainsub || fpst->type==pst_reversesub ))) && + fpst->script_lang_index==SLI_NESTED && fpst->tag==pp->feature_tag ) { + new = dumpg___ContextChain(lfile,fpst,sf,NULL,nested,at); + break; + } + } + /* I don't handle kerning, that could be done with pst_pair if needed */ + if ( new==NULL && gpos ) { + for ( ac=sf->anchor; ac!=NULL; ac=ac->next ) + if ( ac->feature_tag==pp->feature_tag && ac->script_lang_index==SLI_NESTED ) { + new = AnchorsAway(lfile,sf,NULL,pp->feature_tag); + break; + } + } + if ( new==NULL && !gpos ) { + for ( i=0; icharcnt; i++ ) if ( sf->chars[i]!=NULL ) { + for ( ll = sf->chars[i]->ligofme; ll!=NULL; ll=ll->next ) { + if ( ll->lig->script_lang_index!=SLI_NESTED && + ll->lig->tag == pp->feature_tag ) { + ligtags.script_lang_index = SLI_NESTED; + ligtags.flags = ll->lig->flags; + ligtags.tag = pp->feature_tag; + new = LookupFromTagFlagLang(&ligtags); + new->lookup_type = 4; /* Ligature */ + new->offset = ftell(lfile); + dumpgsubligdata(lfile,sf,&ligtags,at); + new->len = ftell(lfile)-new->offset; + break; + } + } + if ( new!=NULL ) + break; + } + } + if ( new==NULL ) { + if ( gpos ) { + start = pst_position; + end = pst_pair; + } else { + start = pst_substitution; + end = pst_ligature; + } + for ( type=start; type<=end; ++type ) { + for ( i=0; icharcnt; i++ ) if ( sf->chars[i]!=NULL ) { + for ( pst = sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==type && + pst->script_lang_index == SLI_NESTED && + pst->tag == pp->feature_tag ) { + ligtags.script_lang_index = SLI_NESTED; + ligtags.flags = pst->flags; + ligtags.tag = pp->feature_tag; + glyphs = generateGlyphTypeList(sf,type,&ligtags,&map); + if ( glyphs==NULL ) + goto failure; + new = LookupFromTagFlagLang(&ligtags); + new->offset = ftell(lfile); + if ( type==pst_position ) { + new->lookup_type = 1; + dumpGPOSsimplepos(lfile,sf,glyphs,&ligtags); + } else if ( type==pst_pair ) { + dumpGPOSpairpos(lfile,sf,glyphs,&ligtags); + new->lookup_type = 2; + } else if ( type==pst_substitution ) { + dumpGSUBsimplesubs(lfile,sf,glyphs,map); + new->lookup_type = 1; + } else if ( type==pst_multiple ) { + new->lookup_type = 2; + dumpGSUBmultiplesubs(lfile,sf,glyphs,map); + } else if ( type==pst_alternate ) { + new->lookup_type = 3; + dumpGSUBmultiplesubs(lfile,sf,glyphs,map); + } else if ( type==pst_ligature ) { + /* Already done */; + } else + GDrawIError("Unknown PST type in GPOS/GSUB figure lookups" ); + new->len = ftell(lfile)-new->offset; + break; + } + } + if ( new!=NULL ) + break; + } + if ( new!=NULL ) + break; + } + } + failure: + buf[0] = pp->feature_tag>>24; buf[1] = (pp->feature_tag>>16)&0xff; + buf[2] = (pp->feature_tag>>8)&0xff; buf[3] = pp->feature_tag&0xff; + buf[4] = 0; + if ( new!=NULL ) { + new->lookup_cnt = pp->lookup_cnt; + if ( new->next ) + GWidgetErrorR(_STR_MultipleLookup,_STR_MultipleLookupLong,buf); + new->next = *nested; + *nested = new; + } else { + GWidgetErrorR(_STR_MissingLookup,_STR_MissingLookupLong,buf); + } + chunkfree(pp,sizeof(struct postponedlookup)); + } +} + +static struct lookup *GPOSfigureLookups(FILE *lfile,SplineFont *sf, + struct alltabs *at,struct lookup **nested) { + /* When we find a feature, we split it out into various scripts */ + /* dumping one lookup per script into the file */ + struct lookup *lookups = NULL, *new, *lo; + int i, j, cnt, max, isv; + SplineChar ***map, **glyphs; + AnchorClass *ac; + struct tagflaglang *ligtags; + enum possub_type type; + PST *pst; + KernPair *kp; + KernClass *kc; + FPST *fpst; + + *nested = NULL; + + max = 30; cnt = 0; + ligtags = galloc(max*sizeof(struct tagflaglang)); + + for ( type = pst_position; type<=pst_pair; ++type ) { + cnt = 0; + for ( i=0; icharcnt; i++ ) if ( sf->chars[i]!=NULL ) { + for ( pst = sf->chars[i]->possub; pst!=NULL; pst=pst->next ) if ( pst->type==type && pst->script_lang_index!=SLI_NESTED ) { + for ( j=0; jtag && pst->flags==ligtags[j].flags && + pst->script_lang_index == ligtags[j].script_lang_index ) + break; + if ( j==cnt ) { + if ( cnt>=max ) { + max += 30; + ligtags = grealloc(ligtags,max*sizeof(struct tagflaglang)); + } + TagFlagLangFromPST(&ligtags[cnt++],pst); + } + } + } + + /* Look for positions matching these tags */ + for ( j=0; joffset = ftell(lfile); + new->next = lookups; + lookups = new; + if ( type==pst_position ) { + new->lookup_type = 1; + dumpGPOSsimplepos(lfile,sf,glyphs,&ligtags[j]); + } else if ( type==pst_pair ) { + dumpGPOSpairpos(lfile,sf,glyphs,&ligtags[j]); + new->lookup_type = 2; + } else + GDrawIError("Unknown PST type in GPOS figure lookups" ); + new->len = ftell(lfile)-new->offset; + } + } + } + + for ( isv=0; isv<2; ++isv ) { + /* Look for kerns */ /* kerns now store langs but not flags */ + cnt = 0; + for ( i=0; icharcnt; i++ ) if ( sf->chars[i]!=NULL ) { + for ( kp = isv ? sf->chars[i]->vkerns : sf->chars[i]->kerns; kp!=NULL; kp=kp->next ) { + for ( j=0; jsli == ligtags[j].script_lang_index ) + break; + if ( j==cnt ) { + if ( cnt>=max ) { + max += 30; + ligtags = grealloc(ligtags,max*sizeof(struct tagflaglang)); + } + ligtags[cnt++].script_lang_index = kp->sli; + } + } + } + for ( j=0; jfeature_tag = isv ? CHR('v','k','r','n') : CHR('k','e','r','n'); + /* new->flags = pst_ignorecombiningmarks; */ /* yudit doesn't like this flag to be set 2.7.2 */ + if ( SLIContainsR2L(sf,ligtags[j].script_lang_index)) + new->flags = pst_r2l; + new->script_lang_index = ligtags[j].script_lang_index; + new->lookup_type = 2; /* Pair adjustment subtable type */ + new->offset = ftell(lfile); + new->next = lookups; + lookups = new; + dumpgposkerndata(lfile,sf,ligtags[j].script_lang_index,at,isv); + new->len = ftell(lfile)-new->offset; + } + + for ( kc=isv ? sf->vkerns : sf->kerns; kc!=NULL; kc=kc->next ) { + new = chunkalloc(sizeof(struct lookup)); + new->feature_tag = isv ? CHR('v','k','r','n') : CHR('k','e','r','n'); + new->flags = kc->flags; + new->script_lang_index = kc->sli; + new->lookup_type = 2; /* Pair adjustment subtable type */ + new->offset = ftell(lfile); + new->next = lookups; + lookups = new; + dumpgposkernclass(lfile,sf,kc,at,isv); + new->len = ftell(lfile)-new->offset; + } + } + free(ligtags); + + if ( sf->anchor ) { + AnchorClassOrder(sf); /* Don't really need this any more */ + for ( ac=sf->anchor; ac!=NULL; ac = ac->next ) { + ac->processed = false; + if ( ac->type!=act_curs ) + ac->has_mark = AnchorHasMark(sf,ac); + } + lookups = AnchorsAway(lfile,sf,lookups,0); + AnchorGuessContext(sf,at); + } + + for ( cnt=0, lo = lookups; lo!=NULL; lo = lo->next ) + ++cnt; + for ( fpst=sf->possub; fpst!=NULL; fpst=fpst->next ) if ( fpst->script_lang_index!=SLI_NESTED ) + if ( fpst->type==pst_contextpos || fpst->type==pst_chainpos ) + ++cnt; + at->next_lookup = cnt; + for ( fpst=sf->possub; fpst!=NULL; fpst=fpst->next ) if ( fpst->script_lang_index!=SLI_NESTED ) + if ( fpst->type==pst_contextpos || fpst->type==pst_chainpos ) + lookups = dumpg___ContextChain(lfile,fpst,sf,lookups,nested,at); + +return( lookups ); +} + +static struct lookup *GSUBfigureLookups(FILE *lfile,SplineFont *sf, + struct alltabs *at, struct lookup **nested) { + struct lookup *lookups = NULL, *new, *lo; + struct tagflaglang *ligtags; + int i, j, max, cnt; + LigList *ll; + PST *subs; + enum possub_type type; + SplineChar **glyphs, ***map; + FPST *fpst; + + *nested = NULL; + + /* Look for ligature tags used in the font */ + max = 30; cnt = 0; + ligtags = galloc(max*sizeof(struct tagflaglang)); + for ( i=0; icharcnt; i++ ) if ( SCWorthOutputting(sf->chars[i]) ) { + for ( ll = sf->chars[i]->ligofme; ll!=NULL; ll=ll->next ) { + if ( !ll->lig->macfeature && + ll->lig->script_lang_index!=SLI_NESTED && + SCWorthOutputting(ll->lig->u.lig.lig) ) { + for ( j=0; jlig->tag && ll->lig->flags==ligtags[j].flags && + ll->lig->script_lang_index == ligtags[j].script_lang_index ) + break; + if ( j==cnt ) { + if ( cnt>=max ) { + max += 30; + ligtags = grealloc(ligtags,max*sizeof(struct tagflaglang)); + } + TagFlagLangFromPST(&ligtags[cnt++],ll->lig); + } + } + } + } + + /* Look for ligatures matching these tags */ + for ( j=0; jlookup_type = 4; /* Ligature */ + new->offset = ftell(lfile); + new->next = lookups; + lookups = new; + dumpgsubligdata(lfile,sf,&ligtags[j],at); + new->len = ftell(lfile)-new->offset; + } + + /* Now do something very similar for substitution simple, mult & alt tags */ + for ( type = pst_substitution; type<=pst_multiple; ++type ) { + cnt = 0; + for ( i=0; icharcnt; i++ ) if ( sf->chars[i]!=NULL ) { + for ( subs = sf->chars[i]->possub; subs!=NULL; subs=subs->next ) if ( subs->type==type && !subs->macfeature && subs->script_lang_index!=SLI_NESTED ) { + for ( j=0; jtag && subs->flags==ligtags[j].flags && + subs->script_lang_index == ligtags[j].script_lang_index ) + break; + if ( j==cnt ) { + if ( cnt>=max ) { + max += 30; + ligtags = grealloc(ligtags,max*sizeof(struct tagflaglang)); + } + TagFlagLangFromPST(&ligtags[cnt++],subs); + } + } + } + + /* Look for substitutions/decompositions matching these tags */ + for ( j=0; jlookup_type = type==pst_substitution?1:type==pst_multiple?2:3; + new->offset = ftell(lfile); + new->next = lookups; + lookups = new; + if ( type==pst_substitution ) + dumpGSUBsimplesubs(lfile,sf,glyphs,map); + else /* the format for multiple and alternate subs is the same. Only the semantics differ */ + dumpGSUBmultiplesubs(lfile,sf,glyphs,map); + free(glyphs); + GlyphMapFree(map); + new->len = ftell(lfile)-new->offset; + } + } + } + free(ligtags); + + for ( cnt=0, lo = lookups; lo!=NULL; lo = lo->next ) + ++cnt; + for ( fpst=sf->possub; fpst!=NULL; fpst=fpst->next ) if ( fpst->script_lang_index!=SLI_NESTED ) + if ( fpst->type==pst_contextsub || fpst->type==pst_chainsub || fpst->type==pst_reversesub ) + ++cnt; + at->next_lookup = cnt; + for ( fpst=sf->possub; fpst!=NULL; fpst=fpst->next ) if ( fpst->script_lang_index!=SLI_NESTED ) + if ( fpst->type==pst_contextsub || fpst->type==pst_chainsub || fpst->type==pst_reversesub ) + lookups = dumpg___ContextChain(lfile,fpst,sf,lookups,nested,at); + +return( lookups ); +} + +int TTFFeatureIndex( uint32 tag, struct table_ordering *ord, int isgsub ) { + /* This is the order in which features should be executed */ + + if ( ord!=NULL ) { + int i; + for ( i=0; ord->ordered_features[i]!=0; ++i ) + if ( ord->ordered_features[i]==tag ) + break; +return( i ); + } + + if ( isgsub ) switch ( tag ) { +/* GSUB ordering */ + case CHR('c','c','m','p'): /* Must be first? */ +return( -2 ); + case CHR('l','o','c','l'): /* Dunno what this is, but needs to be done early */ +return( -1 ); + case CHR('i','s','o','l'): +return( 0 ); + case CHR('j','a','l','t'): /* must come after 'isol' */ +return( 1 ); + case CHR('f','i','n','a'): +return( 2 ); + case CHR('f','i','n','2'): + case CHR('f','a','l','t'): /* must come after 'fina' */ +return( 3 ); + case CHR('f','i','n','3'): +return( 4 ); + case CHR('m','e','d','i'): +return( 5 ); + case CHR('m','e','d','2'): +return( 6 ); + case CHR('i','n','i','t'): +return( 7 ); + + case CHR('r','t','l','a'): +return( 100 ); + case CHR('s','m','c','p'): case CHR('c','2','s','c'): +return( 200 ); + + case CHR('r','l','i','g'): +return( 300 ); + case CHR('c','a','l','t'): +return( 301 ); + case CHR('l','i','g','a'): +return( 302 ); + case CHR('d','l','i','g'): case CHR('h','l','i','g'): +return( 303 ); + case CHR('c','s','w','h'): +return( 304 ); + case CHR('m','s','e','t'): +return( 305 ); + + case CHR('f','r','a','c'): +return( 306 ); + +/* Indic processing */ + case CHR('n','u','k','t'): + case CHR('p','r','e','f'): +return( 301 ); + case CHR('a','k','h','n'): +return( 302 ); + case CHR('r','p','h','f'): +return( 303 ); + case CHR('b','l','w','f'): +return( 304 ); + case CHR('h','a','l','f'): + case CHR('a','b','v','f'): +return( 305 ); + case CHR('p','s','t','f'): +return( 306 ); + case CHR('v','a','t','u'): +return( 307 ); + + case CHR('p','r','e','s'): +return( 310 ); + case CHR('b','l','w','s'): +return( 311 ); + case CHR('a','b','v','s'): +return( 312 ); + case CHR('p','s','t','s'): +return( 313 ); + case CHR('c','l','i','g'): +return( 314 ); + + case CHR('h','a','l','n'): +return( 320 ); +/* end indic ordering */ + + case CHR('a','f','r','c'): + case CHR('l','j','m','o'): + case CHR('v','j','m','o'): +return( 350 ); + case CHR('v','r','t','2'): case CHR('v','e','r','t'): +return( 1010 ); /* Documented to come last */ + +/* Unknown things come after everything but vert/vrt2 */ + default: +return( 1000 ); + + } else switch ( tag ) { +/* GPOS ordering */ + case CHR('c','u','r','s'): +return( 0 ); + case CHR('d','i','s','t'): +return( 100 ); + case CHR('b','l','w','m'): +return( 201 ); + case CHR('a','b','v','m'): +return( 202 ); + case CHR('k','e','r','n'): +return( 300 ); + case CHR('m','a','r','k'): +return( 400 ); + case CHR('m','k','m','k'): +return( 500 ); +/* Unknown things come after everything */ + default: +return( 1000 ); + } +} + +static struct lookup *reverse_list(struct lookup *lookups) { + struct lookup *next, *prev=NULL; + + next = lookups->next; + while ( next!=NULL ) { + lookups->next = prev; + prev = lookups; + lookups = next; + next = lookups->next; + } + lookups->next = prev; +return( lookups ); +} + +static struct lookup *order_nested(struct lookup *nested ) { + int cnt; + struct lookup **array, *n; + int i,j; + + if ( nested==NULL || nested->next==NULL ) +return( nested ); + for ( n=nested, cnt=0; n!=NULL; n=n->next, ++cnt ); + array = galloc(cnt*sizeof(struct lookup *)); + for ( n=nested, cnt=0; n!=NULL; n=n->next) + array[cnt++] = n; + for ( i=0; ilookup_cnt>array[j]->lookup_cnt ) { + n = array[i]; + array[i] = array[j]; + array[j] = n; + } + } + for ( i=0; inext = array[i+1]; + array[cnt-1]->next = NULL; + nested = array[0]; + free(array ); +return( nested ); +} + +static struct lookup *orderlookups(struct lookup **_lookups, + struct table_ordering *ord, FILE *ordered, FILE *disordered, + struct lookup *nested,int isgsub) { + int cnt,i,j; + struct lookup **array, *l, *features, *temp; + struct lookup *lookups = *_lookups; + char *buf; + int bsize, len, totlen; + + for ( l=lookups, cnt=0; l!=NULL; l=l->next ) cnt++; + array = galloc(cnt*sizeof(struct lookup *)); + for ( l=lookups, cnt=0; l!=NULL; l=l->next ) + array[cnt++] = l; + + /* sort by feature execution order */ + for ( i=0; ifeature_tag,ord,isgsub)>TTFFeatureIndex(array[j]->feature_tag,ord,isgsub)) { + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + } + for ( i=0; inext = array[i+1]; + array[i]->lookup_cnt = i; + } + array[i]->next = NULL; + array[i]->lookup_cnt = i; + *_lookups = array[0]; + /* Now reorder the lookup file so that it's also in execution order */ + bsize = 16*1024; + buf = galloc(bsize); + for ( i=0; ioffset,SEEK_SET); + array[i]->offset = ftell(ordered); + totlen = array[i]->len; + while ( totlen>0 ) { + if ( (len = totlen)>bsize ) len = bsize; + len = fread(buf,1,len,disordered); + fwrite(buf,1,len,ordered); + totlen -= len; + } + } + for ( l = nested; l!=NULL; l=l->next ) { + fseek(disordered,l->offset,SEEK_SET); + l->offset = ftell(ordered); + totlen = l->len; + while ( totlen>0 ) { + if ( (len = totlen)>bsize ) len = bsize; + len = fread(buf,1,len,disordered); + fwrite(buf,1,len,ordered); + totlen -= len; + } + } + fclose(disordered); + free(buf); + + /* sort by feature */ + for ( i=0; ifeature_tag > array[j]->feature_tag || + (array[i]->feature_tag==array[j]->feature_tag )) { + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + } + for ( i=0; ifeature_next = array[i+1]; + /*array[i]->feature_cnt = i;*/ + } + /*array[i]->feature_cnt = i;*/ + features = array[0]; + + free(array); +return( features ); +} + +static int FeatureScriptLangMatch(struct feature *l,uint32 script,uint32 lang) { + struct sl *sl; + + for ( sl = l->sl; sl!=NULL; sl = sl->next ) + if ( sl->script == script && sl->lang == lang ) +return( true ); + +return( false ); +} + +static void dump_script_table(FILE *g___,SplineFont *sf, + struct feature *features, + uint32 script, int sc, uint8 *used, + uint32 *langs, int lc, uint8 *touched) { + struct feature *f; + int cnt, dflt_index=-1, total, offset; + int i,j,k,m; + int req_pos; + uint32 here,base; + + memset(touched,0,lc); + if ( sf->cidmaster ) sf = sf->cidmaster; + for ( i=0; sf->script_lang[i]!=NULL; ++i ) if ( used[i] ) { + for ( j=0; sf->script_lang[i][j].script!=0 && + sf->script_lang[i][j].script!=script; ++j ); + if ( sf->script_lang[i][j].script!=0 ) { + for ( k=0; sf->script_lang[i][j].langs[k]!=0; ++k ) { + for ( m=0; langs[m]!=0 && langs[m]!=sf->script_lang[i][j].langs[k]; ++m ); + ++touched[m]; + } + } + } + for ( k=total=i=0; i=0 && langs[dflt_index]!=DEFAULT_LANG; --dflt_index ); + if ( dflt_index!=-1 && !touched[dflt_index] ) dflt_index = -1; + if ( dflt_index!=-1 ) { + --k; + total -= touched[dflt_index]; + } + + /* Dump the script table */ + base = ftell(g___); + putshort(g___,dflt_index==-1?0:4+k*6);/* offset from start of script table */ + /* to data for default language */ + putshort(g___,k); /* count of all non-default languages */ + /* Now the lang sys records of non-default languages */ + for ( i=0; ifeature_next ) { + if ( FeatureScriptLangMatch(f,script,DEFAULT_LANG)) { + if ( f->feature_tag==REQUIRED_FEATURE ) + req_pos = f->feature_cnt; + else + ++cnt; + } + } + putshort(g___,req_pos); /* No required feature */ + putshort(g___,cnt); /* Number of features */ + for ( f=features; f!=NULL ; f=f->feature_next ) { + if ( FeatureScriptLangMatch(f,script,DEFAULT_LANG)) + if ( f->feature_tag!=REQUIRED_FEATURE ) + putshort(g___,f->feature_cnt); /* Index of each feature */ + } + } + /* Now the language system table for each language */ + offset = 2*2+4; + for ( i=0; ifeature_next ) { + if ( FeatureScriptLangMatch(f,script,langs[i])) { + if ( f->feature_tag==REQUIRED_FEATURE ) + req_pos = f->feature_cnt; + else + ++cnt; + } + } + putshort(g___,req_pos); /* No required feature */ + putshort(g___,cnt); /* Number of features */ + for ( f=features; f!=NULL ; f=f->feature_next ) { + if ( FeatureScriptLangMatch(f,script,langs[i])) + if ( f->feature_tag!=REQUIRED_FEATURE ) + putshort(g___,f->feature_cnt); /* Index of each feature */ + } + } +} + +static FILE *g___FigureExtensionSubTables(struct lookup *lookups,int is_gpos) { + struct lookup *l; + int cnt, estart, gotmore; + FILE *efile; + int i; + + if ( lookups==NULL ) +return( NULL ); + for ( l=lookups, cnt=1; l->next!=NULL; l=l->next, ++cnt ); + if ( l->offset<65536 ) +return( NULL ); + + estart=cnt; gotmore = true; + while ( gotmore ) { + gotmore = false; + for ( i=0, l=lookups; l!=NULL && inext, ++i ) { + if ( (cnt-i)*8+l->offset+(cnt-i-1)*8 >=65536 ) { + estart = i; + gotmore = true; + break; + } + } + } + if ( estart==cnt ) { /* Eh?, should never happen */ + fprintf( stderr, "Internal error in GPOS/SUB extension calculation\n" ); +return( NULL ); + } + + efile = tmpfile(); + for ( i=0, l=lookups; l!=NULL && inext, ++i ) + l->offset += (cnt-estart)*8; + while ( l!=NULL ) { + putshort(efile,1); /* Only one format for extensions */ + putshort(efile,l->lookup_type); + putlong(efile,(cnt-i)*8 + l->offset); + l->lookup_type = is_gpos ? 9 : 7; + l->offset = (i-estart)*8; + l = l->next; + ++i; + } +return( efile ); +} + +static int CountLangs(SplineFont *sf,int sli) { + int lcnt, l, s; + struct script_record *sr = sf->script_lang[sli]; + + lcnt = 0; + for ( s=0; sr[s].script!=0; ++s ) + for ( l=0; sr[s].langs[l]!=0; ++l ) + ++lcnt; +return( lcnt ); +} + +struct slusage { + uint32 script; + uint32 lang; + int processed; + union { + uint32 used; + uint32 *usedarr; + } u; +}; + +static int FindSL(struct slusage *slu,int lcnt,uint32 script,uint32 lang) { + int i; + + for ( i=lcnt-1; i>=0; --i ) + if ( slu[i].script==script && slu[i].lang == lang ) + break; +return( i ); +} + +/* Find all slus that have the same usage as that at this, and add their */ +/* script/langs to the feature */ +static void AddScriptLangsToFeature(struct feature *f,struct slusage *slu, + int this,int lcnt,int cnt ) { + int pos, match, i; + struct sl *sl; + + f->sl = NULL; + for ( pos=0; pos>5)-1 ; i>=0 ; --i ) + if ( slu[this].u.usedarr[i] != slu[pos].u.usedarr[i] ) { + match = false; + break; + } + } + if ( match ) { + sl = chunkalloc(sizeof(struct sl)); + sl->next = f->sl; + f->sl = sl; + sl->script = slu[pos].script; + sl->lang = slu[pos].lang; + slu[pos].processed = true; + } + } + if ( f->sl==NULL ) + GDrawIError("Impossible script lang in AddScriptLangsToFeature" ); +} + +static void AddSliToFeature(struct feature *f,SplineFont *sf,int sli) { + int s, l; + struct sl *sl; + struct script_record *sr = sf->script_lang[sli]; + + f->sl = NULL; + for ( s=0; sr[s].script!=0; ++s ) for ( l=0; sr[s].langs[l]!=0; ++l ) { + sl = chunkalloc(sizeof(struct sl)); + sl->next = f->sl; + f->sl = sl; + sl->script = sr[s].script; + sl->lang = sr[s].langs[l]; + } + if ( f->sl==NULL ) + GDrawIError("Impossible script lang in AddSliToFeature" ); +} + +/* Now we have a set of lookups. Each of which is used by some colection of */ +/* scripts and languages. We need to turn this around so that we know for */ +/* each script what lookups it uses, and we must also merge all lookups of */ +/* a given tag into one feature per script/lang. Of course some lookup */ +/* combinations may be shared by several script/lang settings and we should */ +/* use the same feature when possible */ +static struct feature *CoalesceLookups(SplineFont *sf, struct lookup *lookups) { + struct lookup *l, *last; + int cnt, lcnt, allsame; + struct slusage *slu=NULL; + int slumax=0; + struct feature *fhead = NULL, *flast=NULL, *f; + int lang, s, pos, which, tot; + int fcnt = 0; + + for ( ; lookups!=NULL; lookups = last->feature_next ) { + cnt = lcnt = 0; + allsame = true; + for ( l=lookups; l!=NULL && l->feature_tag==lookups->feature_tag; l = l->feature_next ) { + last = l; + ++cnt; + lcnt += CountLangs(sf,l->script_lang_index); + if ( l->script_lang_index!=lookups->script_lang_index ) + allsame = false; + } + if ( allsame ) { + f = chunkalloc(sizeof(struct feature)); + f->feature_tag = lookups->feature_tag; + f->lcnt = cnt; + f->lookups = galloc(cnt*sizeof(struct lookup *)); + f->feature_cnt = fcnt++; + cnt = 0; + for ( l=lookups; l!=NULL && l->feature_tag==lookups->feature_tag; l = l->feature_next ) + f->lookups[cnt++] = l; + AddSliToFeature(f,sf,lookups->script_lang_index); + if ( flast==NULL ) + fhead = f; + else + flast->feature_next = f; + flast = f; + continue; + } + if ( lcnt>slumax ) { + if ( slumax==0 ) + slu = galloc(lcnt*sizeof(struct slusage)); + else + slu = grealloc(slu,lcnt*sizeof(struct slusage)); + slumax = lcnt; + } + lcnt = 0; which = 0; + for ( l=lookups; l!=NULL && l->feature_tag==lookups->feature_tag; l = l->feature_next, ++which ) { + struct script_record *sr = sf->script_lang[l->script_lang_index]; + for ( s=0; sr[s].script!=0; ++s ) for ( lang=0; sr[s].langs[lang]!=0; ++lang ) { + pos = FindSL(slu,lcnt,sr[s].script,sr[s].langs[lang]); + if ( pos==-1 ) { + slu[lcnt].script = sr[s].script; + slu[lcnt].lang = sr[s].langs[lang]; + slu[lcnt].processed = false; + if ( cnt<32 ) + slu[lcnt].u.used = 0; + else + slu[lcnt].u.usedarr = gcalloc( (cnt+31)>>5,sizeof(uint32) ); + pos = lcnt++; + } + if ( cnt<=32 ) + slu[pos].u.used |= (1<>5] |= (1<<(which&0x1f)); + } + } + for ( pos=0; posfeature_tag = lookups->feature_tag; + for ( tot=which=0; which32 && (slu[pos].u.usedarr[which>>5]&(1<<(which&0x1f)))) ) + ++tot; + f->lcnt = tot; + f->lookups = galloc(cnt*sizeof(struct lookup *)); + f->feature_cnt = fcnt++; + tot = 0; + for ( which = 0, l=lookups; l!=NULL && l->feature_tag==lookups->feature_tag; l = l->feature_next, ++which ) + if ( (cnt<=32 && (slu[pos].u.used&(1<32 && (slu[pos].u.usedarr[which>>5]&(1<<(which&0x1f)))) ) + f->lookups[tot++] = l; + AddScriptLangsToFeature(f,slu,pos,lcnt,cnt); + if ( flast==NULL ) + fhead = f; + else + flast->feature_next = f; + flast = f; + } + if ( cnt>32 ) { + for ( pos=0; posscript_lang[i]!=NULL; ++i ) if ( used[i] ) { + for ( j=0; sf->script_lang[i][j].script!=0; ++j ) { + for ( k=0; sf->script_lang[i][j].langs[k]!=0; ++k ); + lmax += k; + } + smax += j; + } + + scripts = galloc((smax+1)*sizeof(uint32)); + langs = galloc((lmax+1)*sizeof(uint32)); + smax = lmax = 0; + for ( i=0; sf->script_lang[i]!=NULL; ++i ) if ( used[i] ) { + for ( j=0; sf->script_lang[i][j].script!=0; ++j ) { + uint32 script = sf->script_lang[i][j].script; + for ( k=0; sf->script_lang[i][j].langs[k]!=0; ++k ) { + uint32 lang = sf->script_lang[i][j].langs[k]; + for ( l=0; lscripts[j] ) { + uint32 temp = scripts[i]; + scripts[i] = scripts[j]; + scripts[j] = temp; + } + } + + for ( i=0; ilangs[j] ) { + uint32 temp = langs[i]; + langs[i] = langs[j]; + langs[j] = temp; + } + } + + *_langs = langs; + *scnt = smax; + *lcnt = lmax; +return( scripts ); +} + +static FILE *dumpg___info(struct alltabs *at, SplineFont *sf,int is_gpos) { + /* Dump out either a gpos or a gsub table. gpos handles kerns, gsub ligs */ + FILE *lfile, *lfile2, *g___, *efile; + struct lookup *lookups=NULL, *features_ordered, *l, *next, *nested; + struct feature *features, *f, *fnext; + struct sl *sl, *slnext; + int cnt, fcnt, offset, i; + char *buf; + uint32 *scripts, *langs; + uint32 lookup_list_table_start, feature_list_table_start, here, scripts_start_offset; + struct table_ordering *ord; + uint8 *touched, *used; + int lc; + SplineFont *master; + int lc_warned=false; + + lfile = tmpfile(); + if ( is_gpos ) { + lookups = GPOSfigureLookups(lfile,sf,at,&nested); + for ( ord = sf->orders; ord!=NULL && ord->table_tag!=CHR('G','P','O','S'); ord = ord->next ); + } else { + lookups = GSUBfigureLookups(lfile,sf,at,&nested); + for ( ord = sf->orders; ord!=NULL && ord->table_tag!=CHR('G','S','U','B'); ord = ord->next ); + } + if ( lookups==NULL ) { + fclose(lfile); +return( NULL ); + } + + lookups = reverse_list(lookups); + nested = order_nested(nested); + lfile2 = tmpfile(); + features_ordered = orderlookups(&lookups,ord,lfile2,lfile,nested,!is_gpos); + lfile = lfile2; + features = CoalesceLookups(sf,features_ordered); + + master = ( sf->cidmaster ) ? sf->cidmaster : sf; + for ( i=0; master->script_lang[i]!=NULL; ++i ); + used = gcalloc(i,1); + for ( l=lookups; l!=NULL; l=l->next ) + used[l->script_lang_index] = true; + + scripts = ScriptsFromFeatures(sf,used,&cnt,&langs,&lc); + touched = galloc(lc); + + g___ = tmpfile(); + putlong(g___,0x10000); /* version number */ + putshort(g___,10); /* offset to script table */ + putshort(g___,0); /* offset to features. Come back for this */ + putshort(g___,0); /* offset to lookups. Come back for this */ +/* Now the scripts */ + scripts_start_offset = ftell(g___); + putshort(g___,cnt); + for ( i=0; ifeature_next, ++fcnt ); + putshort(g___,fcnt); /* Number of features */ + offset = 2+6*fcnt; /* Offset to start of first feature table from beginning of feature_list */ + for ( f=features; f!=NULL; f=f->feature_next ) { + putlong(g___,f->feature_tag); + putshort(g___,offset); + offset += 4+2*f->lcnt; + } + /* for each feature, one feature table */ + for ( f=features; f!=NULL; f=f->feature_next ) { + putshort(g___,0); /* No feature params */ + putshort(g___,f->lcnt); /* this many lookups */ + for ( i=0; ilcnt; ++i ) + putshort(g___,f->lookups[i]->lookup_cnt); /* index of each lookup */ + } + /* And that should finish all the features */ + for ( f=features; f!=NULL; f=fnext ) { + fnext = f->feature_next; + free(f->lookups); + for ( sl=f->sl; sl!=NULL; sl=slnext ) { + slnext = sl->next; + chunkfree(sl,sizeof(struct sl)); + } + chunkfree(f,sizeof(struct feature)); + } + /* So free the feature list */ + + if ( lookups!=NULL ) { + for ( l=lookups; l->next!=NULL; l = l->next ); + l->next = nested; + } + for ( cnt=0, l=lookups; l!=NULL; l=l->next, ++cnt ) + if ( l->lookup_cnt!=cnt && !lc_warned ) { + GDrawIError("GPOS/GSUB: Lookup ordering mismatch"); + lc_warned = true; + } + lookup_list_table_start = ftell(g___); + fseek(g___,8,SEEK_SET); + putshort(g___,lookup_list_table_start); + fseek(g___,0,SEEK_END); + putshort(g___,cnt); + offset = 2+2*cnt; /* Offset to start of first feature table from beginning of feature_list */ + for ( l=lookups; l!=NULL; l=l->next ) { + putshort(g___,offset); + offset += 8; /* 8 bytes per lookup table */ + } + /* now the lookup tables */ + /* do we need any extension sub-tables? */ + efile=g___FigureExtensionSubTables(lookups,is_gpos); + for ( i=0, l=lookups; l!=NULL; l=l->next, ++i ) { + putshort(g___,l->lookup_type); + putshort(g___,l->flags); + putshort(g___,1); /* Each table controls one lookup */ + putshort(g___,(cnt-i)*8+l->offset); /* Offset to lookup data which is in the temp file */ + /* there are (cnt-i) lookup tables (of size 8) between here and */ + /* the place where the temp file will start, and then we need to */ + /* skip l->offset bytes in the temp file */ + /* If it's a big GPOS/SUB table we may also need some extension */ + /* pointers, but FigureExtension will adjust for that */ + } + + buf = galloc(1024); + if ( efile!=NULL ) { + rewind(efile); + while ( (i=fread(buf,1,1024,efile))>0 ) + fwrite(buf,1,i,g___); + fclose(efile); + } + rewind(lfile); + while ( (i=fread(buf,1,1024,lfile))>0 ) + fwrite(buf,1,i,g___); + fclose(lfile); + free(buf); + for ( l=lookups; l!=NULL; l=next ) { + next = l->next; + chunkfree(l,sizeof(*l)); + } + free(scripts); + free(langs); + free(touched); + free(used); +return( g___ ); +} + +void otf_dumpgpos(struct alltabs *at, SplineFont *sf) { + /* Open Type, bless its annoying little heart, doesn't store kern info */ + /* in the kern table. Of course not, how silly of me to think it might */ + /* be consistent. It stores it in the much more complicated gpos table */ + at->gpos = dumpg___info(at, sf,true); + if ( at->gpos!=NULL ) { + at->gposlen = ftell(at->gpos); + if ( at->gposlen&1 ) putc('\0',at->gpos); + if ( (at->gposlen+1)&2 ) putshort(at->gpos,0); + } +} + +void otf_dumpgsub(struct alltabs *at, SplineFont *sf) { + /* substitutions such as: Ligatures, cjk vertical rotation replacement, */ + /* arabic forms, small caps, ... */ + SFLigaturePrepare(sf); + at->gsub = dumpg___info(at, sf, false); + if ( at->gsub!=NULL ) { + at->gsublen = ftell(at->gsub); + if ( at->gsublen&1 ) putc('\0',at->gsub); + if ( (at->gsublen+1)&2 ) putshort(at->gsub,0); + } + SFLigatureCleanup(sf); +} + +static int LigCaretCnt(SplineChar *sc) { + PST *pst; + + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_lcaret ) +return( pst->u.lcaret.cnt ); + } +return( 0 ); +} + +static void DumpLigCarets(FILE *gdef,SplineChar *sc) { + PST *pst; + int i, j, offset; + + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_lcaret ) + break; + } + if ( pst==NULL ) +return; + + if ( SCRightToLeft(sc) ) { + for ( i=0; iu.lcaret.cnt-1; ++i ) + for ( j=i+1; ju.lcaret.cnt; ++j ) + if ( pst->u.lcaret.carets[i]u.lcaret.carets[j] ) { + int16 temp = pst->u.lcaret.carets[i]; + pst->u.lcaret.carets[i] = pst->u.lcaret.carets[j]; + pst->u.lcaret.carets[j] = temp; + } + } else { + for ( i=0; iu.lcaret.cnt-1; ++i ) + for ( j=i+1; ju.lcaret.cnt; ++j ) + if ( pst->u.lcaret.carets[i]>pst->u.lcaret.carets[j] ) { + int16 temp = pst->u.lcaret.carets[i]; + pst->u.lcaret.carets[i] = pst->u.lcaret.carets[j]; + pst->u.lcaret.carets[j] = temp; + } + } + + putshort(gdef,pst->u.lcaret.cnt); /* this many carets */ + offset = sizeof(uint16) + sizeof(uint16)*pst->u.lcaret.cnt; + for ( i=0; iu.lcaret.cnt; ++i ) { + putshort(gdef,offset); + offset+=4; + } + for ( i=0; iu.lcaret.cnt; ++i ) { + putshort(gdef,1); /* Format 1 */ + putshort(gdef,pst->u.lcaret.carets[i]); + } +} + +int gdefclass(SplineChar *sc) { + PST *pst; + AnchorPoint *ap; + + if ( sc->glyph_class!=0 ) +return( sc->glyph_class-1 ); + + if ( strcmp(sc->name,".notdef")==0 ) +return( 0 ); + + for ( pst=sc->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_ligature ) +return( 2 ); /* Ligature */ + } + + ap=sc->anchor; + while ( ap!=NULL && (ap->type==at_centry || ap->type==at_cexit) ) + ap = ap->next; + if ( ap!=NULL && (ap->type==at_mark || ap->type==at_basemark) ) +return( 3 ); + else +return( 1 ); + /* I not quite sure what a componant glyph is. Probably something that */ + /* is not in the cmap table and is referenced in other glyphs */ + /* Anyway I never return class 4 */ /* (I've never seen it used by others) */ +} + +void otf_dumpgdef(struct alltabs *at, SplineFont *_sf) { + /* In spite of what the open type docs say, this table does appear to be */ + /* required (at least the glyph class def table) if we do mark to base */ + /* positioning */ + /* I was wondering at the apperant contradiction: something can be both a */ + /* base glyph and a ligature component, but it appears that the component*/ + /* class is unused and everything is a base unless it is a ligature or */ + /* mark */ + /* All my example fonts ignore the attachment list subtable and the mark */ + /* attach class def subtable, so I shall too */ + /* All my example fonts contain a ligature caret list subtable, which is */ + /* empty. Odd, but perhaps important */ + PST *pst; + int i,j,k,l, lcnt,cmax, needsclass; + int pos, offset; + int cnt, start, last, lastval; + SplineChar **glyphs, *sc; + SplineFont *sf; + + if ( _sf->cidmaster ) _sf = _sf->cidmaster; + + glyphs = NULL; + for ( k=0; k<2; ++k ) { + lcnt = 0; + needsclass = false; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + if ( sf->chars[i]->glyph_class!=0 || gdefclass(sf->chars[i])!=1 ) + needsclass = true; + for ( pst=sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type == pst_lcaret ) { + for ( j=pst->u.lcaret.cnt-1; j>=0; --j ) + if ( pst->u.lcaret.carets[j]!=0 ) + break; + if ( j!=-1 ) + break; + } + } + if ( pst!=NULL ) { + if ( glyphs!=NULL ) glyphs[lcnt] = sf->chars[i]; + ++lcnt; + } + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( lcnt==0 ) + break; + if ( glyphs!=NULL ) + break; + glyphs = galloc((lcnt+1)*sizeof(SplineChar *)); + glyphs[lcnt] = NULL; + } + if ( !needsclass && lcnt==0 ) +return; /* No anchor positioning, no ligature carets */ + + at->gdef = tmpfile(); + putlong(at->gdef,0x00010000); /* Version */ + putshort(at->gdef, needsclass ? 12 : 0 ); /* glyph class defn table */ + putshort(at->gdef, 0 ); /* attachment list table */ + putshort(at->gdef, 0 ); /* ligature caret table (come back and fix up later) */ + putshort(at->gdef, 0 ); /* mark attachment class table */ + + if ( needsclass ) { + /* Mark shouldn't conflict with anything */ + /* Ligature is more important than Base */ + /* Component is not used */ + cmax = 0; + l = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + if ( cmaxcharcnt ) cmax = sf->charcnt; + ++l; + } while ( l<_sf->subfontcnt ); +#if 1 /* ttx can't seem to support class format type 1 so let's output type 2 */ + for ( j=0; j<2; ++j ) { + cnt = 0; + for ( i=0; isubfonts==NULL ? _sf : _sf->subfonts[l]; + if ( icharcnt && sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++l; + } while ( l<_sf->subfontcnt ); + if ( sc!=NULL && sc->ttf_glyph!=-1 ) { + lastval = gdefclass(sf->chars[i]); + start = last = i; + for ( ; icharcnt; ++i ) { + l = 0; + sc = NULL; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[l]; + if ( icharcnt && sf->chars[i]!=NULL ) { + sc = sf->chars[i]; + break; + } + ++l; + } while ( l<_sf->subfontcnt ); + if (sc!=NULL && sc->ttf_glyph!=-1 ) { + if ( gdefclass(sf->chars[i])!=lastval ) + break; + last = i; + } + } + --i; + if ( lastval!=0 ) { + if ( j==1 ) { + putshort(at->gdef,sf->chars[start]->ttf_glyph); + putshort(at->gdef,sf->chars[last]->ttf_glyph); + putshort(at->gdef,lastval); + } + ++cnt; + } + } + } + if ( j==0 ) { + putshort(at->gdef,2); /* class format 2, range list by class */ + putshort(at->gdef,cnt); + } + } +#else + putshort(at->gdef,1); /* class format 1 complete list of glyphs */ + putshort(at->gdef,0); /* First glyph */ + putshort(at->gdef,at->maxp.numGlyphs ); + j=0; + for ( i=0; icharcnt; ++i ) if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 ) { + for ( ; jchars[i]->ttf_glyph; ++j ) + putshort(at->gdef,1); /* Any hidden characters (like notdef) default to base */ + putshort(at->gdef,gdefclass(sf->chars[i])); + ++j; + } +#endif + } + + pos = ftell(at->gdef); + fseek(at->gdef,8,SEEK_SET); /* location of lig caret table offset */ + putshort(at->gdef,pos); + fseek(at->gdef,0,SEEK_END); + if ( lcnt==0 ) { + /* It always seems to be present, even if empty */ + putshort(at->gdef,4); /* Offset to (empty) coverage table */ + putshort(at->gdef,0); /* no ligatures */ + putshort(at->gdef,2); /* coverage table format 2 */ + putshort(at->gdef,0); /* no ranges in coverage table */ + } else { + pos = ftell(at->gdef); /* coverage location */ + putshort(at->gdef,0); /* Offset to coverage table (fix up later) */ + putshort(at->gdef,lcnt); + offset = 2*lcnt+4; + for ( i=0; igdef,offset); + offset+=2+6*LigCaretCnt(glyphs[i]); + } + for ( i=0; igdef,glyphs[i]); + offset = ftell(at->gdef); + fseek(at->gdef,pos,SEEK_SET); + putshort(at->gdef,offset-pos); + fseek(at->gdef,0,SEEK_END); + dumpcoveragetable(at->gdef,glyphs); + } + + at->gdeflen = ftell(at->gdef); + if ( at->gdeflen&1 ) putc('\0',at->gdef); + if ( (at->gdeflen+1)&2 ) putshort(at->gdef,0); +} + +/* ************************************************************************** */ +/* ************************* utility routines ************************* */ +/* ************************************************************************** */ + +#include "pfaeditui.h" +#include + +struct order_dlg { + uint32 table_tag; + SplineFont *sf; + struct table_ordering *ord; + int done; + GGadget *list; + GGadget *up, *down; + GGadget *top, *bottom; + GGadget *new, *del; + GGadget *ok, *cancel; +}; + +static uint32 *GetTags(SplineFont *sf, int isgsub) { + /* !!!! Don't currently handle gpos. Needs to look for kern, marks, curs, etc. */ + int max, cnt, i,j; + uint32 *tags; + PST *pst; + + max = 30; cnt = 0; + tags = galloc((max+1)*sizeof(uint32)); + for ( i=0; icharcnt; i++ ) if ( sf->chars[i]!=NULL ) { + for ( pst = sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==pst_substitution || pst->type==pst_alternate || + pst->type == pst_multiple || pst->type==pst_ligature ) { + for ( j=0; jtag ) + break; + if ( j==cnt ) { + if ( cnt>=max ) { + max += 30; + tags = grealloc(tags,(max+1)*sizeof(uint32)); + } + tags[cnt++] = pst->tag; + } + } + } + } + tags[cnt] = 0; + if ( cnt==0 ) { + free(tags); +return( NULL ); + } +return( tags ); +} + +static int order_e_h(GWindow gw, GEvent *event) { + struct order_dlg *d = GDrawGetUserData(gw); + int i; + int32 len; + GTextInfo **ti; + uint32 *new; + + if ( event->type==et_close ) { + d->done = true; + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("fontinfo.html#Order"); +return( true ); + } +return( false ); + } else if ( event->type==et_controlevent && event->u.control.subtype == et_buttonactivate ) { + if ( event->u.control.g == d->cancel ) { + d->done = true; + } else if ( event->u.control.g == d->top || + event->u.control.g == d->up || + event->u.control.g == d->down || + event->u.control.g == d->bottom ) { + GListMoveSelected(d->list,event->u.control.g == d->top ? 0x80000000 : + event->u.control.g == d->up ? -1 : + event->u.control.g == d->down ? 1 : 0x7fffffff ); + } else if ( event->u.control.g == d->del ) { + GListDelSelected(d->list); + } else if ( event->u.control.g == d->ok ) { + ti = GGadgetGetList(d->list,&len); + new = galloc((len+1)*sizeof(uint32)); + new[len] = 0; + for ( i=0; itext[0]<<24)|(ti[i]->text[1]<<16)|(ti[i]->text[2]<<8)|ti[i]->text[3]; + if ( d->ord==NULL ) { + d->ord = gcalloc(1,sizeof(struct table_ordering)); + d->ord->table_tag = d->table_tag; + d->ord->next = d->sf->orders; + d->sf->orders = d->ord; + } + free(d->ord->ordered_features); + d->ord->ordered_features = new; + d->done = true; + } + } +return( true ); +} + +void OrderTable(SplineFont *sf,uint32 table_tag) { + struct table_ordering *ord; + uint32 *tags_used, *merged; + int cnt1, cnt2; + int i,j,temp; + GTextInfo *ti; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[10]; + GTextInfo label[10]; + struct order_dlg d; + static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','c','l','e','a','r','l','y','u',',','u','n','i','f','o','n','t', '\0' }; + FontRequest rq; + GFont *font; + int isgsub = table_tag==CHR('G','S','U','B'); + + for ( ord = sf->orders; ord!=NULL && ord->table_tag!=table_tag; ord = ord->next ); + tags_used = GetTags(sf,isgsub); + cnt1 = cnt2 = 0; + if ( ord!=NULL ) + for ( cnt1=0; ord->ordered_features[cnt1]!=0; ++cnt1 ); + if ( tags_used!=NULL ) { + for ( cnt2=0; tags_used[cnt2]!=0; ++cnt2 ); + /* order this list using our default ordering */ + for ( i=0; iTTFFeatureIndex(tags_used[j],NULL,isgsub) ) { + temp = tags_used[i]; + tags_used[i] = tags_used[j]; + tags_used[j] = temp; + } + } + } + merged = galloc((cnt1+cnt2+1)*sizeof(uint32)); + if ( ord!=NULL ) + for ( cnt1=0; ord->ordered_features[cnt1]!=0; ++cnt1 ) + merged[cnt1] = ord->ordered_features[cnt1]; + i = cnt1; + if ( tags_used!=NULL ) { + for ( cnt2=0; tags_used[cnt2]!=0; ++cnt2 ) { + for ( j=0; j>24; + ti[i].text[1] = (merged[i]>>16)&0xff; + ti[i].text[2] = (merged[i]>>8)&0xff; + ti[i].text[3] = merged[i]&0xff; + ti[i].text[4] = '\0'; + } + free(merged); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<cidmaster!=NULL ) sf=sf->cidmaster; + if ( sf->script_lang==NULL ) +return; + + /* order the scripts in each scriptlist and then the languages attached */ + /* to each script */ + max = 0; + for ( i=0; sf->script_lang[i]!=NULL; ++i ) { + struct script_record *sl = sf->script_lang[i]; + for ( len = 0; sl[len].script!=0; ++len ); + for ( k=0; k sl[l].script ) { + struct script_record slr; + slr = sl[k]; + sl[k] = sl[l]; + sl[l] = slr; + } + } + for ( j=0; sl[j].script!=0; ++j ) { + uint32 *langs = sl[j].langs; + for ( len=0; langs[len]!=0; ++len ); + for ( k=0; klangs[l] ) { + uint32 temp = langs[k]; + langs[k] = langs[l]; + langs[l] = temp; + } + } + } + if ( j>max ) max = j; + } +} diff --git a/fontforge/transform.c b/fontforge/transform.c new file mode 100644 index 00000000..d0693b09 --- /dev/null +++ b/fontforge/transform.c @@ -0,0 +1,584 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include "ustring.h" +#include +#include + +#define TCnt 3 + +typedef struct transdata { + void *userdata; + void (*transfunc)(void *,real trans[6],int otype,BVTFunc *,enum fvtrans_flags); + int (*getorigin)(void *,BasePoint *bp,int otype); + GWindow tblock[TCnt]; + GWindow gw; + int done; +} TransData; + +#define CID_Origin 1101 +#define CID_DoBackground 1102 +#define CID_Round2Int 1103 + +#define CID_Type 1001 +#define CID_XMove 1002 +#define CID_YMove 1003 +#define CID_Angle 1004 +#define CID_Scale 1005 +#define CID_XScale 1006 +#define CID_YScale 1007 +#define CID_Horizontal 1008 +#define CID_Vertical 1009 +#define CID_SkewAng 1010 +#define CID_XLab 1011 +#define CID_YLab 1012 +#define CID_CounterClockwise 1013 +#define CID_Clockwise 1014 +#define CID_XPercent 1015 +#define CID_YPercent 1016 + +#define CID_First CID_Type +#define CID_Last CID_YPercent + +#define TBlock_Width 270 +#define TBlock_Height 40 +#define TBlock_Top 32 +#define TBlock_XStart 125 + +static GTextInfo origin[] = { + { (unichar_t *) _STR_CharacterOrigin, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_CenterOfSelection, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_LastPress, NULL, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { NULL }}; + +static int selcid[] = { 0, CID_XMove, CID_Angle, CID_Scale, CID_XScale, 0, CID_SkewAng }; +static GTextInfo transformtypes[] = { + { (unichar_t *) _STR_DoNothing, NULL, 0, 0, (void *) 0x1000, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_MoveDDD, NULL, 0, 0, (void *) 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_RotateDDD, NULL, 0, 0, (void *) 0x2, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_ScaleUniformlyDDD, NULL, 0, 0, (void *) 0x4, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_ScaleDDD, NULL, 0, 0, (void *) 0x8, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_FlipDDD, NULL, 0, 0, (void *) 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { (unichar_t *) _STR_SkewDDD, NULL, 0, 0, (void *) 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, + { NULL }}; + +void skewselect(BVTFunc *bvtf,real t) { + real off, bestoff; + int i, best; + + bestoff = 10; best = 0; + for ( i=1; i<=10; ++i ) { + if ( (off = t*i-rint(t*i))<0 ) off = -off; + if ( offfunc = bvt_skew; + bvtf->x = rint(t*best); + bvtf->y = best; +} + +static int Trans_OK(GGadget *g, GEvent *e) { + GWindow tw; + real transform[6], trans[6], t[6]; + real angle; + int i, index, err; + int dobackground = false, round_2_int = false; + BasePoint base; + int origin, bvpos=0; + BVTFunc bvts[TCnt+1]; + static int warned = false; + + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + TransData *td = GDrawGetUserData(GGadgetGetWindow(g)); + + transform[0] = transform[3] = 1.0; + transform[1] = transform[2] = transform[4] = transform[5] = 0; + base.x = base.y = 0; + + origin = GGadgetGetFirstListSelectedItem( GWidgetGetControl(td->gw,CID_Origin)); + if ( GWidgetGetControl(td->gw,CID_DoBackground)!=NULL ) + dobackground = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_DoBackground)); + round_2_int = GGadgetIsChecked(GWidgetGetControl(td->gw,CID_Round2Int)); + if ( td->getorigin!=NULL ) { + (td->getorigin)(td->userdata,&base,origin ); + transform[4] = -base.x; + transform[5] = -base.y; + } + for ( i=0; itblock[i]; + index = GGadgetGetFirstListSelectedItem( GWidgetGetControl(tw,CID_Type)); + trans[0] = trans[3] = 1.0; + trans[1] = trans[2] = trans[4] = trans[5] = 0; + err = 0; + switch ( index ) { + case 0: /* Do Nothing */ + break; + case 1: /* Move */ + trans[4] = GetReal(tw,CID_XMove,"X Movement",&err); + trans[5] = GetReal(tw,CID_YMove,"Y Movement",&err); + bvts[bvpos].x = trans[4]; bvts[bvpos].y = trans[5]; bvts[bvpos++].func = bvt_transmove; + break; + case 2: /* Rotate */ + angle = GetReal(tw,CID_Angle,"Rotation Angle",&err); + if ( GGadgetIsChecked( GWidgetGetControl(tw,CID_Clockwise)) ) + angle = -angle; + if ( fmod(angle,90)!=0 ) + bvts[0].func = bvt_none; /* Bad trans=> No trans */ + else { + angle = fmod(angle,360); + if ( angle<0 ) angle+=360; + if ( angle==90 ) bvts[bvpos++].func = bvt_rotate90ccw; + else if ( angle==180 ) bvts[bvpos++].func = bvt_rotate180; + else if ( angle==270 ) bvts[bvpos++].func = bvt_rotate90cw; + } + angle *= 3.1415926535897932/180; + trans[0] = trans[3] = cos(angle); + trans[2] = -(trans[1] = sin(angle)); + break; + case 3: /* Scale Uniformly */ + trans[0] = trans[3] = GetReal(tw,CID_Scale,"Scale Factor",&err)/100.0; + bvts[0].func = bvt_none; /* Bad trans=> No trans */ + break; + case 4: /* Scale */ + trans[0] = GetReal(tw,CID_XScale,"X Scale Factor",&err)/100.0; + trans[3] = GetReal(tw,CID_YScale,"Y Scale Factor",&err)/100.0; + bvts[0].func = bvt_none; /* Bad trans=> No trans */ + break; + case 5: /* Flip */ + if ( GGadgetIsChecked( GWidgetGetControl(tw,CID_Horizontal)) ) { + trans[0] = -1; + bvts[bvpos++].func = bvt_fliph; + } else { + trans[3] = -1; + bvts[bvpos++].func = bvt_flipv; + } + break; + case 6: /* Skew */ + angle = GetReal(tw,CID_SkewAng,"Skew Angle",&err); + if ( GGadgetIsChecked( GWidgetGetControl(tw,CID_Clockwise)) ) + angle = -angle; + angle *= 3.1415926535897932/180; + trans[2] = tan(angle); + skewselect(&bvts[bvpos],trans[2]); ++bvpos; + break; + default: + GDrawIError("Unexpected selection in Transform"); + err = 1; + break; + } + if ( err ) +return(true); +#if 0 + printf( "(%g,%g,%g,%g,%g,%g)*(%g,%g,%g,%g,%g,%g) = ", + trans[0], trans[1], trans[2], trans[3], trans[4], trans[5], + transform[0], transform[1], transform[2], transform[3], transform[4], transform[5]); +#endif + t[0] = transform[0]*trans[0] + + transform[1]*trans[2]; + t[1] = transform[0]*trans[1] + + transform[1]*trans[3]; + t[2] = transform[2]*trans[0] + + transform[3]*trans[2]; + t[3] = transform[2]*trans[1] + + transform[3]*trans[3]; + t[4] = transform[4]*trans[0] + + transform[5]*trans[2] + + trans[4]; + t[5] = transform[4]*trans[1] + + transform[5]*trans[3] + + trans[5]; + memcpy(transform,t,sizeof(t)); +#if 0 + printf( "(%g,%g,%g,%g,%g,%g)\n", + transform[0], transform[1], transform[2], transform[3], transform[4], transform[5]); +#endif + } + bvts[bvpos++].func = bvt_none; /* Done */ + for ( i=0; i<6; ++i ) + if ( RealNear(transform[i],0)) transform[i] = 0; + transform[4] += base.x; + transform[5] += base.y; + + if (( transform[1]!=0 || transform[2]!=0 ) && !warned ) { + GWidgetPostNoticeR(_STR_Warning,_STR_RotateSkewWarning); + warned = true; + } + (td->transfunc)(td->userdata,transform,origin,bvts, + dobackground|(round_2_int?fvt_round_to_int:0)); + td->done = true; + } +return( true ); +} + +static int Trans_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + TransData *td = GDrawGetUserData(GGadgetGetWindow(g)); + td->done = true; + } +return( true ); +} + +static int Trans_TypeChange(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listselected ) { + GWindow bw = GGadgetGetWindow(g); + int index = GGadgetGetFirstListSelectedItem(g); + int mask = (int) transformtypes[index].userdata; + int i; + + for ( i=CID_First; i<=CID_Last; ++i ) { + GGadget *sg; + sg = GWidgetGetControl(bw,i); + GGadgetSetVisible(sg, ( ((int) GGadgetGetUserData(sg))&mask )?1:0); + } + if ( selcid[index]!=0 ) { + GGadget *tf = GWidgetGetControl(bw,selcid[index]); + GWidgetIndicateFocusGadget(tf); + GTextFieldSelect(tf,0,-1); + } + GDrawRequestExpose(bw,NULL,false); + } +return( true ); +} + +static int trans_e_h(GWindow gw, GEvent *event) { + if ( event->type==et_close ) { + TransData *td = GDrawGetUserData(gw); + td->done = true; + } else if ( event->type == et_map ) { + /* Above palettes */ + GDrawRaise(gw); + } else if ( event->type==et_char ) { + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("transform.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +static void MakeTransBlock(TransData *td,int bnum) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[23]; + GTextInfo label[23]; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor; + wattrs.event_masks = ~(1<tblock[bnum] = gw = GDrawCreateSubWindow(td->gw,&pos,NULL,td,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gcd,0,sizeof(gcd)); + + gcd[0].gd.pos.x = 5; gcd[0].gd.pos.y = 9; + gcd[0].gd.flags = gg_visible | gg_enabled; + gcd[0].gd.label = &transformtypes[bnum==0?1:0]; + gcd[0].gd.u.list = transformtypes; + gcd[0].gd.cid = CID_Type; + gcd[0].creator = GListButtonCreate; + gcd[0].data = (void *) -1; + gcd[0].gd.handle_controlevent = Trans_TypeChange; + transformtypes[bnum==0].selected = true; + transformtypes[bnum!=0].selected = false; + + label[1].text = (unichar_t *) "X"; + label[1].text_is_1byte = true; + gcd[1].gd.label = &label[1]; + gcd[1].gd.pos.x = TBlock_XStart; gcd[1].gd.pos.y = 15; + gcd[1].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled; + gcd[1].data = (void *) 0x9; + gcd[1].gd.cid = CID_XLab; + gcd[1].creator = GLabelCreate; + + label[2].text = (unichar_t *) "0"; + label[2].text_is_1byte = true; + gcd[2].gd.label = &label[2]; + gcd[2].gd.pos.x = TBlock_XStart+10; gcd[2].gd.pos.y = 9; gcd[2].gd.pos.width = 40; + gcd[2].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled; + gcd[2].data = (void *) 0x1; + gcd[2].gd.cid = CID_XMove; + gcd[2].creator = GTextFieldCreate; + + label[3].text = (unichar_t *) "Y"; + label[3].text_is_1byte = true; + gcd[3].gd.label = &label[3]; + gcd[3].gd.pos.x = TBlock_XStart+70; gcd[3].gd.pos.y = 15; + gcd[3].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled; + gcd[3].data = (void *) 0x9; + gcd[3].gd.cid = CID_YLab; + gcd[3].creator = GLabelCreate; + + label[4].text = (unichar_t *) "0"; + label[4].text_is_1byte = true; + gcd[4].gd.label = &label[4]; + gcd[4].gd.pos.x = TBlock_XStart+80; gcd[4].gd.pos.y = 9; gcd[4].gd.pos.width = 40; + gcd[4].gd.flags = bnum==0? (gg_enabled|gg_visible) : gg_enabled; + gcd[4].data = (void *) 0x1; + gcd[4].gd.cid = CID_YMove; + gcd[4].creator = GTextFieldCreate; + + label[5].text = (unichar_t *) "100"; + label[5].text_is_1byte = true; + gcd[5].gd.label = &label[5]; + gcd[5].gd.pos.x = TBlock_XStart+10; gcd[5].gd.pos.y = 9; gcd[5].gd.pos.width = 40; + gcd[5].gd.flags = gg_enabled; + gcd[5].data = (void *) 0x8; + gcd[5].gd.cid = CID_XScale; + gcd[5].creator = GTextFieldCreate; + + label[6].text = (unichar_t *) "100"; + label[6].text_is_1byte = true; + gcd[6].gd.label = &label[6]; + gcd[6].gd.pos.x = TBlock_XStart+80; gcd[6].gd.pos.y = 9; gcd[6].gd.pos.width = 40; + gcd[6].gd.flags = gg_enabled; + gcd[6].data = (void *) 0x8; + gcd[6].gd.cid = CID_YScale; + gcd[6].creator = GTextFieldCreate; + + label[7].text = (unichar_t *) "100"; + label[7].text_is_1byte = true; + gcd[7].gd.label = &label[7]; + gcd[7].gd.pos.x = TBlock_XStart+10; gcd[7].gd.pos.y = 9; gcd[7].gd.pos.width = 40; + gcd[7].gd.flags = gg_enabled; + gcd[7].data = (void *) 0x4; + gcd[7].gd.cid = CID_Scale; + gcd[7].creator = GTextFieldCreate; + + label[8].text = (unichar_t *) "\260 Clockwise"; + label[8].text_is_1byte = true; + gcd[8].gd.label = &label[8]; + gcd[8].gd.pos.x = TBlock_XStart+53; gcd[8].gd.pos.y = 2; gcd[8].gd.pos.height = 12; + gcd[8].gd.flags = gg_enabled; + gcd[8].data = (void *) 0x22; + gcd[8].gd.cid = CID_Clockwise; + gcd[8].creator = GRadioCreate; + + label[9].text = (unichar_t *) "\260 Withershins"; /* deiseal */ + label[9].text_is_1byte = true; + gcd[9].gd.label = &label[9]; + gcd[9].gd.pos.x = TBlock_XStart+53; gcd[9].gd.pos.y = 17; gcd[9].gd.pos.height = 12; + gcd[9].gd.flags = gg_enabled | gg_cb_on; + gcd[9].data = (void *) 0x22; + gcd[9].gd.cid = CID_CounterClockwise; + gcd[9].creator = GRadioCreate; + + label[10].text = (unichar_t *) "180"; + label[10].text_is_1byte = true; + gcd[10].gd.label = &label[10]; + gcd[10].gd.pos.x = TBlock_XStart+10; gcd[10].gd.pos.y = 9; gcd[10].gd.pos.width = 40; + gcd[10].gd.flags = gg_enabled; + gcd[10].data = (void *) 0x2; + gcd[10].gd.cid = CID_Angle; + gcd[10].creator = GTextFieldCreate; + + label[11].text = (unichar_t *) "10"; /* -10 if we default clockwise */ + label[11].text_is_1byte = true; + gcd[11].gd.label = &label[11]; + gcd[11].gd.pos.x = TBlock_XStart+10; gcd[11].gd.pos.y = 9; gcd[11].gd.pos.width = 40; + gcd[11].gd.flags = gg_enabled; + gcd[11].data = (void *) 0x20; + gcd[11].gd.cid = CID_SkewAng; + gcd[11].creator = GTextFieldCreate; + + label[12].text = (unichar_t *) "Horizontal"; + label[12].text_is_1byte = true; + gcd[12].gd.label = &label[12]; + gcd[12].gd.pos.x = TBlock_XStart; gcd[12].gd.pos.y = 2; gcd[12].gd.pos.height = 12; + gcd[12].gd.flags = gg_enabled | gg_cb_on; + gcd[12].data = (void *) 0x10; + gcd[12].gd.cid = CID_Horizontal; + gcd[12].creator = GRadioCreate; + + label[13].text = (unichar_t *) "Vertical"; + label[13].text_is_1byte = true; + gcd[13].gd.label = &label[13]; + gcd[13].gd.pos.x = TBlock_XStart; gcd[13].gd.pos.y = 17; gcd[13].gd.pos.height = 12; + gcd[13].gd.flags = gg_enabled; + gcd[13].data = (void *) 0x10; + gcd[13].gd.cid = CID_Vertical; + gcd[13].creator = GRadioCreate; + + label[14].text = (unichar_t *) "%"; + label[14].text_is_1byte = true; + gcd[14].gd.label = &label[14]; + gcd[14].gd.pos.x = TBlock_XStart+51; gcd[14].gd.pos.y = 15; + gcd[14].gd.flags = gg_enabled; + gcd[14].data = (void *) 0xc; + gcd[14].gd.cid = CID_XPercent; + gcd[14].creator = GLabelCreate; + + label[15].text = (unichar_t *) "%"; + label[15].text_is_1byte = true; + gcd[15].gd.label = &label[15]; + gcd[15].gd.pos.x = TBlock_XStart+121; gcd[15].gd.pos.y = 15; + gcd[15].gd.flags = gg_enabled; + gcd[15].data = (void *) 0x8; + gcd[15].gd.cid = CID_YPercent; + gcd[15].creator = GLabelCreate; + + gcd[16].gd.pos.x = 2; gcd[16].gd.pos.y = 1; + gcd[16].gd.pos.width = TBlock_Width-3; gcd[16].gd.pos.height = TBlock_Height-2; + gcd[16].gd.flags = gg_enabled | gg_visible; + gcd[16].data = (void *) -1; + gcd[16].creator = GGroupCreate; + + GGadgetsCreate(gw,gcd); + GDrawSetVisible(gw,true); +} + +void TransformDlgCreate(void *data,void (*transfunc)(void *,real *,int,BVTFunc *,enum fvtrans_flags), + int (*getorigin)(void *,BasePoint *,int), int enableback) { + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[7]; + GTextInfo label[6]; + static TransData td; + int i, len, y; + GGadget *orig; + BasePoint junk; + GTextInfo **ti; + + td.userdata = data; + td.transfunc = transfunc; + td.getorigin = getorigin; + td.done = false; + + if ( td.gw==NULL ) { + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<disabled = !getorigin(data,&junk,i); + if ( ti[i]->disabled && ti[i]->selected ) { + ti[i]->selected = false; + ti[0]->selected = true; + GGadgetSetTitle(orig,ti[0]->text); + } + } + + for ( i=0; i" + +/* Some glyphs have multiple encodings ("A" might be used for Alpha and Cyrillic A) */ +struct dup { + SplineChar *sc; + int enc; + int uni; + struct dup *prev; +}; + +struct ttfinfo { + int emsize; /* ascent + descent? from the head table */ + int ascent, descent; /* from the hhea table */ + /* not the usWinAscent from the OS/2 table */ + int vertical_origin; /* if vmetrics are present */ + int width_cnt; /* from the hhea table, in the hmtx table */ + int glyph_cnt; /* from maxp table (or cff table) */ + unsigned int index_to_loc_is_long:1; /* in head table */ + unsigned int is_ttc:1; /* Is it a font collection? */ + unsigned int is_onebyte:1; /* Is it a one byte encoding? */ + unsigned int twobytesymbol:1; /* it had a symbol encoding which we converted to unicode */ + unsigned int complainedbeyondglyfend:1; /* Don't complain about this more than once */ + unsigned int extensionrequested:1; /* Only ask once for a copy of a font containing extension subtables */ + unsigned int to_order2:1; /* We are to leave the font as truetype (order2) splines, else convert to ps */ + unsigned int complainedmultname:1; /* Don't complain about this more than once */ + /* Mac fonts platform=0/1, platform specific enc id, roman=0, english is lang code 0 */ + /* iso platform=2, platform specific enc id, latin1=0/2, no language */ + /* microsoft platform=3, platform specific enc id, 1, english is lang code 0x??09 */ + char *copyright; /* from the name table, nameid=0 */ + char *familyname; /* nameid=1 */ + char *fullname; /* nameid=4 */ + char *weight; + char *version; /* nameid=5 */ + char *fontname; /* postscript font name, nameid=6 */ + char *xuid; /* Only for open type cff fonts */ + int uniqueid; + real italicAngle; /* from post table */ + int upos, uwidth; /* underline pos, width from post table */ + int fstype; + struct psdict *private; /* Only for open type cff fonts */ + enum charset encoding_name;/* from cmap */ + enum uni_interp uni_interp; + struct pfminfo pfminfo; + struct ttflangname *names; + char *fontcomments; + SplineChar **chars; /* from all over, glyf table for contours */ + /* cmap table for encodings */ + /* hmtx table for widths */ + /* post table for names */ + /* Or from CFF table for everything in opentype */ + BDFFont *bitmaps; + char *cidregistry, *ordering; + int supplement; + real cidfontversion; + int subfontcnt; + SplineFont **subfonts; + char *inuse; /* What glyphs are used by this font in the ttc */ + + int numtables; + /* CFF */ + int cff_start; /* Offset from sof to start of postscript compact font format */ + int cff_length; + /* cmap */ + int encoding_start; /* Offset from sof to start of encoding table */ + /* glyf */ + int glyph_start; /* Offset from sof to start of glyph table */ + int glyph_length; + /* GDEF */ + int gdef_start; /* Offset from sof to start of GDEF table (glyph class defn, ligature carets) */ + /* GPOS */ + int gpos_start; /* Offset from sof to start of GPOS table */ + /* GSUB */ + int gsub_start; /* Offset from sof to start of GSUB table */ + /* EBDT, bdat */ + int bitmapdata_start; /* Offset to start of bitmap data */ + /* EBLT, bloc */ + int bitmaploc_start; /* Offset to start of bitmap locator data */ + /* head */ + int head_start; + /* hhea */ + int hhea_start; + /* hmtx */ + int hmetrics_start; + /* kern */ + int kern_start; + /* loca */ + int glyphlocations_start; /* there are glyph_cnt of these, from maxp tab */ + int loca_length; /* actually glypn_cnt is wrong. Use the table length (divided by size) instead */ + /* maxp */ + int maxp_start; /* maximum number of glyphs */ + int maxp_len; + /* name */ + int copyright_start; /* copyright and fontname */ + /* post */ + int postscript_start; /* names for the glyphs, italic angle, etc. */ + /* OS/2 */ + int os2_start; + /* vhea */ + int vhea_start; + /* vmtx */ + int vmetrics_start; + /* VORG */ + int vorg_start; + + /* PfEd -- FontForge/PfaEdit specific info */ + int pfed_start; + + /* Apple Advanced Typography Tables */ + int prop_start; + int lcar_start; + int opbd_start; + int acnt_start; + int feat_start; + int mort_start; + int morx_start; + + /* Info for instructions */ + int cvt_start, cvt_len; + int prep_start, prep_len; + int fpgm_start, fpgm_len; + + struct dup *dups; + unsigned int one_of_many: 1; /* A TTCF file, or a opentype font with multiple fonts */ + unsigned int obscomplain: 1; /* We've complained about obsolete format 3 in EBDT table */ + unsigned int cmpcomplain: 1; /* We've complained about compressed format 4 in EBDT */ + unsigned int unkcomplain: 1; /* We've complained about unknown formats in EBDT */ + unsigned int comcomplain: 1; /* We've complained about composit formats in EBDT */ + unsigned int onlystrikes: 1; /* Only read in the bitmaps, not the outlines */ + unsigned int onlyonestrike: 1; /* Only read in one bitmap (strike) */ + unsigned int barecff: 1; /* pay attention to the encoding in the cff file, we won't have a cmap */ + + int platform, specific; /* values of the encoding we chose to use */ + + int anchor_class_cnt; /* For GPOS */ + int anchor_merge_cnt; + AnchorClass *ahead, *alast; + + KernClass *khead, *klast, *vkhead, *vklast; + + struct script_record **script_lang; + int16 sli_cnt; + + uint32 mort_subs_tag; + int mort_r2l, mort_tag_mac, mort_feat, mort_setting, mort_is_nested; + uint16 *morx_classes; + + uint32 *feats[2]; /* Order of gsub/gpos (morx) features */ + int mort_max; + + struct ttf_table *tabs; + FPST *possub; + ASM *sm; + MacFeat *features; + struct gentagtype gentags; + char *chosenname; + int macstyle; + int lookup_cnt; /* Max lookup in current GPOS/GSUB table */ +}; + +#define MAX_TAB 32 +struct tabdir { + int32 version; /* 0x00010000 */ + uint16 numtab; + uint16 searchRange; /* (Max power of 2 <= numtab) *16 */ + uint16 entrySel; /* Log2(Max power of 2 <= numtab ) */ + uint16 rangeShift; /* numtab*16 - searchRange */ + struct taboff { + uint32 tag; /* Table name */ + uint32 checksum;/* for table */ + uint32 offset; /* to start of table in file */ + uint32 length; + FILE *data; + uint16 dup_of; + uint16 orderingval; + } tabs[MAX_TAB]; /* room for all the above tables */ + struct taboff *ordered[MAX_TAB]; +}; + +struct glyphhead { + int16 numContours; + int16 xmin; + int16 ymin; + int16 xmax; + int16 ymax; +}; + +struct head { + int32 version; /* 0x00010000 */ + int32 revision; /* 0 */ + uint32 checksumAdj; /* set to 0, sum entire font, store 0xb1b0afba-sum */ + uint32 magicNum; /* 0x5f0f3cf5 */ + uint16 flags; /* 1 */ + uint16 emunits; /* sf->ascent+sf->descent */ + int32 createtime[2];/* number of seconds since 1904 */ + int32 modtime[2]; + int16 xmin; /* min for entire font */ + int16 ymin; + int16 xmax; + int16 ymax; + uint16 macstyle; /* 1=>Bold, 2=>Italic */ + uint16 lowestreadable; /* size in pixels. Say about 10? */ + int16 dirhint; /* 0=>mixed directional characters, */ + int16 locais32; /* is the location table 32bits or 16, 0=>16, 1=>32 */ + int16 glyphformat; /* 0 */ + uint16 mbz; /* padding */ +}; + +struct hhead { + int32 version; /* 0x00010000 */ + int16 ascender; /* sf->ascender */ + int16 descender; /* -sf->descender */ + int16 linegap; /* 0 */ + int16 maxwidth; /* of all characters */ + int16 minlsb; /* How is this different from xmin above? */ + int16 minrsb; + int16 maxextent; /* How is this different from xmax above? */ + int16 caretSlopeRise;/* Uh... let's say 1? */ + int16 caretSlopeRun;/* Uh... let's say 0 */ + int16 mbz[5]; + int16 metricformat; /* 0 */ + uint16 numMetrics; /* just set to glyph count */ +}; + +struct hmtx { + uint16 width; /* NOTE: TTF only allows positive widths!!! */ + int16 lsb; +}; + +struct kern { + uint16 version; /* 0 */ + uint16 ntab; /* 1, number of subtables */ + /* first (and only) subtable */ + uint16 stversion; /* 0 */ + uint16 length; /* length of subtable beginning at &stversion */ + uint16 coverage; /* 1, (set of flags&format) */ + uint16 nPairs; /* number of kern pairs */ + uint16 searchRange; /* (Max power of 2 <= nPairs) *6 */ + uint16 entrySel; /* Log2(Max power of 2 <= nPairs ) */ + uint16 rangeShift; /* numtab*6 - searchRange */ + struct kp { + uint16 left; /* left glyph num */ + uint16 right; /* right glyph num */ + /* table is ordered by these two above treated as uint32 */ + int16 offset; /* kern amount */ + } *kerns; /* Array should be nPairs big */ +}; + +struct maxp { + int32 version; /* 0x00010000 */ + uint16 numGlyphs; + uint16 maxPoints; /* max number of points in a simple glyph */ + uint16 maxContours; /* max number of paths in a simple glyph */ + uint16 maxCompositPts; + uint16 maxCompositCtrs; + uint16 maxZones; /* 1 */ + uint16 maxTwilightPts; /* 0 */ + uint16 maxStorage; /* 0 */ + uint16 maxFDEFs; /* 0 */ + uint16 maxIDEFs; /* 0 */ + uint16 maxStack; /* 0 */ + uint16 maxglyphInstr;/* 0 */ + uint16 maxnumcomponents; /* Maximum number of refs in any composit */ + uint16 maxcomponentdepth; + /* Apple docs say: 0 (if no composits), maximum value 1 (one level of composit) */ + /* OpenType docs say: 1 (if no composits), any depth allowed */ + uint16 mbz; /* pad out to a 4byte boundary */ +}; + +struct nametab { + uint16 format; /* 0 */ + uint16 numrec; /* 1 */ + uint16 startOfStrings; /* offset from start of table to start of strings */ + struct namerec { + uint16 platform; /* 3 => MS */ + uint16 specific; /* 1 */ + uint16 language; /* 0x0409 */ + uint16 nameid; /* 0=>copyright, 1=>family, 2=>weight, 4=>fullname */ + /* 5=>version, 6=>postscript name */ + uint16 strlen; + uint16 stroff; + } nr[6]; +}; + +struct os2 { + uint16 version; /* 1 */ + int16 avgCharWid; /* average width of a-z and space, if no lower case, then average all chars */ + uint16 weightClass; /* 100=>thin, 200=>extra-light, 300=>light, 400=>normal, */ + /* 500=>Medium, 600=>semi-bold, 700=>bold, 800=>extra-bold, */ + /* 900=>black */ + uint16 widthClass; /* 75=>condensed, 100, 125=>expanded */ + int16 fstype; /* 0x0008 => allow embedded editing */ + int16 ysubXSize; /* emsize/5 */ + int16 ysubYSize; /* emsize/5 */ + int16 ysubXOff; /* 0 */ + int16 ysubYOff; /* emsize/5 */ + int16 ysupXSize; /* emsize/5 */ + int16 ysupYSize; /* emsize/5 */ + int16 ysupXOff; /* 0 */ + int16 ysupYOff; /* emsize/5 */ + int16 yStrikeoutSize; /* 102/2048 *emsize */ + int16 yStrikeoutPos; /* 530/2048 *emsize */ + int16 sFamilyClass; /* ??? 0 */ + /* high order byte is the "class", low order byte the sub class */ + /* class = 0 => no classification */ + /* class = 1 => old style serifs */ + /* subclass 0, no class; 1 ibm rounded; 2 garalde; 3 venetian; 4 mod venitian; 5 dutch modern; 6 dutch trad; 7 contemporary; 8 caligraphic; 15 misc */ + /* class = 2 => transitional serifs */ + /* subclass 0, no class; 1 drect line; 2 script; 15 misc */ + /* class = 3 => modern serifs */ + /* subclass: 1, italian; 2, script */ + /* class = 4 => clarendon serifs */ + /* subclass: 1, clarendon; 2, modern; 3 trad; 4 newspaper; 5 stub; 6 monotone; 7 typewriter */ + /* class = 5 => slab serifs */ + /* subclass: 1, monotone; 2, humanist; 3 geometric; 4 swiss; 5 typewriter */ + /* class = 7 => freeform serifs */ + /* subclass: 1, modern */ + /* class = 8 => sans serif */ + /* subclass: 1, ibm neogrotesque; 2 humanist; 3 low-x rounded; 4 high-x rounded; 5 neo-grotesque; 6 mod neo-grot; 9 typewriter; 10 matrix */ + /* class = 9 => ornamentals */ + /* subclass: 1, engraver; 2 black letter; 3 decorative; 4 3D */ + /* class = 10 => scripts */ + /* subclass: 1, uncial; 2 brush joined; 3 formal joined; 4 monotone joined; 5 calligraphic; 6 brush unjoined; 7 formal unjoined; 8 monotone unjoined */ + /* class = 12 => symbolic */ + /* subclass: 3 mixed serif; 6 old style serif; 7 neo-grotesque sans; */ + char panose[10]; /* can be set to zero */ + uint32 unicoderange[4]; + /* 1<<0=>ascii, 1<<1 => latin1, 2=>100-17f, 3=>180-24f, 4=>250-2af */ + /* 5=> 2b0-2ff, 6=>300-36f, ... */ + char achVendID[4]; /* can be zero */ + uint16 fsSel; /* 1=> italic, 32=>bold, 64 => regular */ + uint16 firstcharindex; /* minimum unicode encoding */ + uint16 lastcharindex; /* maximum unicode encoding */ + uint16 ascender; /* font ascender height (not ascent) */ + uint16 descender; /* font descender height */ + uint16 linegap; /* 0 */ + uint16 winascent; /* ymax */ + uint16 windescent; /* ymin */ + uint32 ulCodePage[2]; + /* 1<<0 => latin1, 1<<1=>latin2, cyrillic, greek, turkish, hebrew, arabic */ + /* 1<<30 => mac, 1<<31 => symbol */ + /* OTF stuff (version 2 of OS/2) */ + short xHeight; + short capHeight; + short defChar; + short breakChar; + short maxContext; +}; + +struct post { + int32 formattype; /* 0x00020000 */ + int32 italicAngle; /* in fixed format */ + int16 upos; + int16 uwidth; + uint32 isfixed; + uint32 minmem42; + uint32 maxmem42; + uint32 minmem1; + uint32 maxmem1; + uint16 numglyphs; + uint16 glyphnameindex[1]; +}; + +struct glyphinfo { + struct maxp *maxp; /* this one is given to dumpglyphs, rest blank */ + uint32 *loca; + FILE *glyphs; + FILE *hmtx; + int hmtxlen; + FILE *vmtx; + int vmtxlen; + int next_glyph; + int glyph_len; + int xmin, ymin, xmax, ymax; + BlueData bd; + int strikecnt; /* number of bitmaps to dump */ + int lasthwidth, lastvwidth; /* encoding of last glyph for which we generate a full metrics entry */ + int hfullcnt, vfullcnt; + int flags; + int fixed_width; + int32 *bsizes; + unsigned int onlybitmaps: 1; + unsigned int has_instrs: 1; + SplineFont *sf; +}; + +struct vorg { + uint16 majorVersion; /* 1 */ + uint16 minorVersion; /* 0 */ + short defaultVertOriginY; /* Y coord of default vertical origin in the design coordinate system */ + uint16 numVertOriginYMetrics; /* exceptions to the above, elements in following array */ +#if 0 + struct { + uint16 glyphindex; /* ordered */ + short vertOrigin; + } origins[]; +#endif +}; + +struct alltabs { + struct tabdir tabdir; + struct head head; + struct hhead hhead; + struct hhead vhead; + struct maxp maxp; + struct os2 os2; + struct vorg vorg; + FILE *loca; + int localen; + FILE *name; + int namelen; + FILE *post; + int postlen; + FILE *gpos; /* Used instead of kern for opentype (and other glyph positioning) */ + int gposlen; + FILE *gsub; /* Used for ligatures and other substitutions */ + int gsublen; + FILE *gdef; /* If we use mark to base we need this to tell the text processor what things are marks (the opentype docs say it is optional. They are wrong) */ + int gdeflen; + FILE *kern; + int kernlen; + FILE *cmap; + int cmaplen; + FILE *headf; + int headlen; + FILE *hheadf; + int hheadlen; + FILE *maxpf; + int maxplen; + FILE *os2f; + int os2len; + FILE *cvtf; + int cvtlen; + FILE *fpgmf; /* Copied from an original ttf file and dumped out. Never generated */ + int fpgmlen; + FILE *prepf; /* Copied from an original ttf file and dumped out. Never generated */ + int preplen; + FILE *vheadf; + int vheadlen; + FILE *vorgf; + int vorglen; + FILE *gaspf; + int gasplen; + FILE *cfff; + int cfflen; + FILE *sidf; + FILE *sidh; + FILE *charset; + FILE *encoding; + FILE *private; + FILE *charstrings; + FILE *fdselect; + FILE *fdarray; + FILE *bdat; /* might be EBDT */ + int bdatlen; + FILE *bloc; /* might be EBLC */ + int bloclen; + FILE *ebsc; + int ebsclen; + FILE *prop; + int proplen; + FILE *opbd; + int opbdlen; + FILE *acnt; + int acntlen; + FILE *lcar; + int lcarlen; + FILE *feat; + int featlen; + FILE *morx; + int morxlen; + FILE *pfed; + int pfedlen; + int defwid, nomwid; + int sidcnt; + int lenpos; + int privatelen; + unsigned int sidlongoffset: 1; + unsigned int cfflongoffset: 1; + unsigned int applemode: 1; /* Where apple & ms differ do things apple's way (bitmaps, name table PostScript) */ + unsigned int opentypemode: 1; /* Where apple & ms differ do things opentype's way (bitmaps, name table PostScript) */ + /* If both are set then try to generate both types of tables. Some things can't be fudged though (name table postscript) */ + unsigned int msbitmaps: 1; + unsigned int otbbitmaps: 1; + unsigned int isotf: 1; + unsigned int error: 1; + struct glyphinfo gi; + int isfixed; + struct fd2data *fds; + + struct feat_name { int strid; struct macname *mn, *smn; } *feat_name; + struct macname2 *ordered_feat; + + int next_lookup; /* for doing nested lookups in contextual features */ + short *gn_sid; + enum fontformat format; +}; + +struct subhead { uint16 first, cnt, delta, rangeoff; }; /* a sub header in 8/16 cmap table */ + +enum touchflags { tf_x=1, tf_y=2, tf_d=4, tf_endcontour=0x80, tf_startcontour=0x40 }; + +struct contexttree { + int depth; + int branch_cnt; /* count of subbranches of this node */ + struct ct_branch { + uint16 classnum; + struct contexttree *branch; + } *branches; + struct fpst_rule *ends_here; + int rule_cnt; /* count of rules which are active here */ + struct ct_subs { + struct fpst_rule *rule; + struct contexttree *branch;/* if the rule ends here this will be null */ + uint16 thisclassnum; + } *rules; + int pending_pos; + uint32 applymarkedsubs; + uint32 applycursubs; + uint16 marked_index, cur_index; + uint8 markme; + int state, next_state; + struct contexttree *parent; +}; + + + /* Open type Advanced Typography Tables */ +extern void otf_orderlangs(SplineFont *sf); +extern void otf_dumpgpos(struct alltabs *at, SplineFont *sf); +extern void otf_dumpgsub(struct alltabs *at, SplineFont *sf); +extern void otf_dumpgdef(struct alltabs *at, SplineFont *sf); +extern int gdefclass(SplineChar *sc); + +extern int TTFFeatureIndex( uint32 tag, struct table_ordering *ord, int isgsub ); + + /* Apple Advanced Typography Tables */ +extern void aat_dumpacnt(struct alltabs *at, SplineFont *sf); +extern void ttf_dumpkerns(struct alltabs *at, SplineFont *sf); +extern void aat_dumplcar(struct alltabs *at, SplineFont *sf); +extern void aat_dumpmorx(struct alltabs *at, SplineFont *sf); +extern void aat_dumpopbd(struct alltabs *at, SplineFont *sf); +extern void aat_dumpprop(struct alltabs *at, SplineFont *sf); +extern int SLIHasDefault(SplineFont *sf,int sli); +extern int FPSTisMacable(SplineFont *sf, FPST *fpst, int checktag); +extern uint32 MacFeatureToOTTag(int featureType,int featureSetting); +extern int OTTagToMacFeature(uint32 tag, int *featureType,int *featureSetting); +extern uint16 *props_array(SplineFont *sf,int numGlyphs); +extern int haslrbounds(SplineChar *sc, PST **left, PST **right); + +extern struct macsettingname { + int mac_feature_type; + int mac_feature_setting; + uint32 otf_tag; +} macfeat_otftag[], *user_macfeat_otftag; + + /* TrueType instructions */ +extern struct ttf_table *SFFindTable(SplineFont *sf,uint32 tag); +extern int32 memlong(uint8 *data,int offset); +extern int memushort(uint8 *data,int offset); +extern void memputshort(uint8 *data,int offset,uint16 val); +extern int TTF__getcvtval(SplineFont *sf,int val); +extern int TTF_getcvtval(SplineFont *sf,int val); +extern void initforinstrs(SplineChar *sc); +extern int SSPointCnt(SplineSet *ss,int startcnt, int has_instrs); +extern int SSAddPoints(SplineSet *ss,int ptcnt,BasePoint *bp, char *flags,int has_instrs); + + /* Used by both otf and apple */ +extern uint16 *ClassesFromNames(SplineFont *sf,char **classnames,int class_cnt, + int numGlyphs, SplineChar ***glyphs); +extern SplineChar **SFGlyphsFromNames(SplineFont *sf,char *names); + + +extern void AnchorClassOrder(SplineFont *sf); +extern SplineChar **EntryExitDecompose(SplineFont *sf,AnchorClass *ac); +extern void AnchorClassDecompose(SplineFont *sf,AnchorClass *_ac, int classcnt, int *subcnts, + SplineChar ***marks,SplineChar ***base, + SplineChar ***lig,SplineChar ***mkmk); + + + /* Non-standard tables */ + /* My PfEd table for FontForge/PfaEdit specific info */ +extern void pfed_dump(struct alltabs *at, SplineFont *sf); +extern void pfed_read(FILE *ttf,struct ttfinfo *info); + + + /* Parsing advanced typography */ +extern void readmacfeaturemap(FILE *ttf,struct ttfinfo *info); +extern void readttfkerns(FILE *ttf,struct ttfinfo *info); +extern void readttfmort(FILE *ttf,struct ttfinfo *info); +extern void readttfopbd(FILE *ttf,struct ttfinfo *info); +extern void readttflcar(FILE *ttf,struct ttfinfo *info); +extern void readttfprop(FILE *ttf,struct ttfinfo *info); +extern void readttfgsubUsed(FILE *ttf,struct ttfinfo *info); +extern void GuessNamesFromGSUB(FILE *ttf,struct ttfinfo *info); +extern void readttfgpossub(FILE *ttf,struct ttfinfo *info,int gpos); +extern void readttfgdef(FILE *ttf,struct ttfinfo *info); diff --git a/fontforge/ttfinstrs.c b/fontforge/ttfinstrs.c new file mode 100644 index 00000000..6bbba24e --- /dev/null +++ b/fontforge/ttfinstrs.c @@ -0,0 +1,1884 @@ +/* Copyright (C) 2001-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include "pfaeditui.h" +#include "ttf.h" + +extern int _GScrollBar_Width; +#define EDGE_SPACING 2 + +#define ttf_width 16 +#define ttf_height 16 +static unsigned char ttf_bits[] = { + 0xff, 0x07, 0x21, 0x04, 0x20, 0x00, 0xfc, 0x7f, 0x24, 0x40, 0xf4, 0x5e, + 0xbc, 0x72, 0xa0, 0x02, 0xa0, 0x02, 0xa0, 0x02, 0xf0, 0x02, 0x80, 0x02, + 0xc0, 0x06, 0x40, 0x04, 0xc0, 0x07, 0x00, 0x00}; +GWindow ttf_icon = NULL; + +enum ttf_instructions { + ttf_npushb=0x40, ttf_npushw=0x41, ttf_pushb=0xb0, ttf_pushw=0xb8, + ttf_aa=0x7f, ttf_abs=0x64, ttf_add=0x60, ttf_alignpts=0x27, ttf_alignrp=0x3c, + ttf_and=0x5a, ttf_call=0x2b, ttf_ceiling=0x67, ttf_cindex=0x25, ttf_clear=0x22, + ttf_debug=0x4f, ttf_deltac1=0x73, ttf_deltac2=0x74, ttf_deltac3=0x75, + ttf_deltap1=0x5d, ttf_deltap2=0x71, ttf_deltap3=0x72, ttf_depth=0x24, + ttf_div=0x62, ttf_dup=0x20, ttf_eif=0x59, ttf_else=0x1b, ttf_endf=0x2d, + ttf_eq=0x54, ttf_even=0x57, ttf_fdef=0x2c, ttf_flipoff=0x4e, ttf_flipon=0x4d, + ttf_flippt=0x80, ttf_fliprgoff=0x82, ttf_fliprgon=0x81, ttf_floor=0x66, + ttf_gc=0x46, ttf_getinfo=0x88, ttf_gfv=0x0d, ttf_gpv=0x0c, ttf_gt=0x52, + ttf_gteq=0x53, ttf_idef=0x89, ttf_if=0x58, ttf_instctrl=0x8e, ttf_ip=0x39, + ttf_isect=0x0f, ttf_iup=0x30, ttf_jmpr=0x1c, ttf_jrof=0x79, ttf_jrot=0x78, + ttf_loopcall=0x2a, ttf_lt=0x50, ttf_lteq=0x51, ttf_max=0x8b, ttf_md=0x49, + ttf_mdap=0x2e, ttf_mdrp=0xc0, ttf_miap=0x3e, ttf_min=0x8c, ttf_mindex=0x26, + ttf_mirp=0xe0, ttf_mppem=0x4b, ttf_mps=0x4c, ttf_msirp=0x3a, ttf_mul=0x63, + ttf_neg=0x65, ttf_neq=0x55, ttf_not=0x5c, ttf_nround=0x6c, ttf_odd=0x56, + ttf_or=0x5b, ttf_pop=0x21, ttf_rcvt=0x45, ttf_rdtg=0x7d, ttf_roff=0x7a, + ttf_roll=0x8a, ttf_round=0x68, ttf_rs=0x43, ttf_rtdg=0x3d, ttf_rtg=0x18, + ttf_rthg=0x19, ttf_rutg=0x7c, ttf_s45round=0x77, ttf_sangw=0x7e, + ttf_scanctrl=0x85, ttf_scantype=0x8d, ttf_scfs=0x48, ttf_scvtci=0x1d, + ttf_sdb=0x5e, ttf_sdpvtl=0x86, ttf_sds=0x5f, ttf_sfvfs=0x0b, ttf_sfvtca=0x04, + ttf_sfvtl=0x08, ttf_sfvtpv=0x0e, ttf_shc=0x34, ttf_shp=0x32, ttf_shpix=0x38, + ttf_shz=0x36, ttf_sloop=0x17, ttf_smd=0x1a, ttf_spvfs=0x0a, ttf_spvtca=0x02, + ttf_spvtl=0x06, ttf_sround=0x76, ttf_srp0=0x10, ttf_srp1=0x11, ttf_srp2=0x12, + ttf_ssw=0x1f, ttf_sswci=0x1e, ttf_sub=0x61, ttf_svtca=0x00, ttf_swap=0x23, + ttf_szp0=0x13, ttf_szp1=0x14, ttf_szp2=0x15, ttf_szps=0x16, ttf_utp=0x29, + ttf_wcvtf=0x70, ttf_wcvtp=0x44, ttf_ws=0x42 +}; + +static const char *instrnames[] = { + "SVTCA[y-axis]", + "SVTCA[x-axis]", + "SPVTCA[y-axis]", + "SPVTCA[x-axis]", + "SFVTCA[y-axis]", + "SFVTCA[x-axis]", + "SPVTL[parallel]", + "SPVTL[orthog]", + "SFVTL[parallel]", + "SFVTL[orthog]", + "SPVFS", + "SFVFS", + "GPV", + "GFV", + "SFVTPV", + "ISECT", + "SRP0", + "SRP1", + "SRP2", + "SZP0", + "SZP1", + "SZP2", + "SZPS", + "SLOOP", + "RTG", + "RTHG", + "SMD", + "ELSE", + "JMPR", + "SCVTCI", + "SSWCI", + "SSW", + "DUP", + "POP", + "CLEAR", + "SWAP", + "DEPTH", + "CINDEX", + "MINDEX", + "ALIGNPTS", + "Unknown28", + "UTP", + "LOOPCALL", + "CALL", + "FDEF", + "ENDF", + "MDAP[no-rnd]", + "MDAP[rnd]", + "IUP[y]", + "IUP[x]", + "SHP[rp2]", + "SHP[rp1]", + "SHC[rp2]", + "SHC[rp1]", + "SHZ[rp2]", + "SHZ[rp1]", + "SHPIX", + "IP", + "MSIRP[no set rp0]", + "MSIRP[set rp0]", + "ALIGNRP", + "RTDG", + "MIAP[no-rnd]", + "MIAP[rnd]", + "NPUSHB", + "NPUSHW", + "WS", + "RS", + "WCVTP", + "RCVT", + "GC[cur]", + "GC[orig]", + "SCFS", + "MD[grid]", + "MD[orig]", + "MPPEM", + "MPS", + "FLIPON", + "FLIPOFF", + "DEBUG", + "LT", + "LTEQ", + "GT", + "GTEQ", + "EQ", + "NEQ", + "ODD", + "EVEN", + "IF", + "EIF", + "AND", + "OR", + "NOT", + "DELTAP1", + "SDB", + "SDS", + "ADD", + "SUB", + "DIV", + "MUL", + "ABS", + "NEG", + "FLOOR", + "CEILING", + "ROUND[Grey]", + "ROUND[Black]", + "ROUND[White]", + "ROUND[Undef4]", + "NROUND[Grey]", + "NROUND[Black]", + "NROUND[White]", + "NROUND[Undef4]", + "WCVTF", + "DELTAP2", + "DELTAP3", + "DELTAC1", + "DELTAC2", + "DELTAC3", + "SROUND", + "S45ROUND", + "JROT", + "JROF", + "ROFF", + "Unknown7B", + "RUTG", + "RDTG", + "SANGW", + "AA", + "FLIPPT", + "FLIPRGON", + "FLIPRGOFF", + "Unknown83", + "Unknown84", + "SCANCTRL", + "SDPVTL[parallel]", + "SDPVTL[orthog]", + "GETINFO", + "IDEF", + "ROLL", + "MAX", + "MIN", + "SCANTYPE", + "INSTCTRL", + "Unknown8F", + "Unknown90", + "Unknown91", + "Unknown92", + "Unknown93", + "Unknown94", + "Unknown95", + "Unknown96", + "Unknown97", + "Unknown98", + "Unknown99", + "Unknown9A", + "Unknown9B", + "Unknown9C", + "Unknown9D", + "Unknown9E", + "Unknown9F", + "UnknownA0", + "UnknownA1", + "UnknownA2", + "UnknownA3", + "UnknownA4", + "UnknownA5", + "UnknownA6", + "UnknownA7", + "UnknownA8", + "UnknownA9", + "UnknownAA", + "UnknownAB", + "UnknownAC", + "UnknownAD", + "UnknownAE", + "UnknownAF", + "PUSHB_1", + "PUSHB_2", + "PUSHB_3", + "PUSHB_4", + "PUSHB_5", + "PUSHB_6", + "PUSHB_7", + "PUSHB_8", + "PUSHW_1", + "PUSHW_2", + "PUSHW_3", + "PUSHW_4", + "PUSHW_5", + "PUSHW_6", + "PUSHW_7", + "PUSHW_8", + "MDRP[grey]", + "MDRP[black]", + "MDRP[white]", + "MDRP03", + "MDRP[rnd,grey]", + "MDRP[rnd,black]", + "MDRP[rnd,white]", + "MDRP07", + "MDRP[min,grey]", + "MDRP[min,black]", + "MDRP[min,white]", + "MDRP0b", + "MDRP[min,rnd,grey]", + "MDRP[min,rnd,black]", + "MDRP[min,rnd,white]", + "MDRP0f", + "MDRP[rp0,grey]", + "MDRP[rp0,black]", + "MDRP[rp0,white]", + "MDRP13", + "MDRP[rp0,rnd,grey]", + "MDRP[rp0,rnd,black]", + "MDRP[rp0,rnd,white]", + "MDRP17", + "MDRP[rp0,min,grey]", + "MDRP[rp0,min,black]", + "MDRP[rp0,min,white]", + "MDRP1b", + "MDRP[rp0,min,rnd,grey]", + "MDRP[rp0,min,rnd,black]", + "MDRP[rp0,min,rnd,white]", + "MDRP1f", + "MIRP[grey]", + "MIRP[black]", + "MIRP[white]", + "MIRP03", + "MIRP[rnd,grey]", + "MIRP[rnd,black]", + "MIRP[rnd,white]", + "MIRP07", + "MIRP[min,grey]", + "MIRP[min,black]", + "MIRP[min,white]", + "MIRP0b", + "MIRP[min,rnd,grey]", + "MIRP[min,rnd,black]", + "MIRP[min,rnd,white]", + "MIRP0f", + "MIRP[rp0,grey]", + "MIRP[rp0,black]", + "MIRP[rp0,white]", + "MIRP13", + "MIRP[rp0,rnd,grey]", + "MIRP[rp0,rnd,black]", + "MIRP[rp0,rnd,white]", + "MIRP17", + "MIRP[rp0,min,grey]", + "MIRP[rp0,min,black]", + "MIRP[rp0,min,white]", + "MIRP1b", + "MIRP[rp0,min,rnd,grey]", + "MIRP[rp0,min,rnd,black]", + "MIRP[rp0,min,rnd,white]", + "MIRP1f" +}; + +static unichar_t *instrhelppopup[256]; + +static void ihaddr(int bottom,int top,char *msg) { + unichar_t *um = uc_copy(msg); + while ( bottom<=top ) + instrhelppopup[bottom++] = um; +} + +static void ihadd(int p,char *msg) { + ihaddr(p,p,msg); +} + +static void instrhelpsetup(void) { + if ( instrhelppopup[0]!=NULL ) +return; + ihadd(0x7f,"Adjust Angle\nObsolete instruction\nPops one value"); + ihadd(0x64,"ABSolute Value\nReplaces top of stack with its abs"); + ihadd(0x60,"ADD\nPops two 26.6 fixed numbers from stack\nadds them, pushes result"); + ihadd(0x27,"ALIGN PoinTS\nAligns (&pops) the two points which are on the stack\nby moving along freedom vector to the average of their\npositions on projection vector"); + ihadd(0x3c,"ALIGN to Reference Point\nPops as many points as specified in loop counter\nAligns points with RP0 by moving each\nalong freedom vector until distance to\nRP0 on projection vector is 0"); + ihadd(0x5a,"logical AND\nPops two values, ands them, pushes result"); + ihadd(0x2b,"CALL function\nPops a value, calls the function represented by it"); + ihadd(0x67,"CEILING\nPops one 26.6 value, rounds upward to an int\npushes result"); + ihadd(0x25,"Copy INDEXed element to stack\nPops an index & copies stack\nelement[index] to top of stack"); + ihadd(0x22,"CLEAR\nPops all elements on stack"); + ihadd(0x4f,"DEBUG call\nPops a value and executes a debugging interpreter\n(if available)"); + ihadd(0x73,"DELTA exception C1\nPops a value n & then n exception specifications & cvt entries\nchanges each cvt entry at a given size by the pixel amount"); + ihadd(0x74,"DELTA exception C2\nPops a value n & then n exception specifications & cvt entries\nchanges each cvt entry at a given size by the amount"); + ihadd(0x75,"DELTA exception C3\nPops a value n & then n exception specifications & cvt entries\nchanges each cvt entry at a given size by the amount"); + ihadd(0x5D,"DELTA exception P1\nPops a value n & then n exception specifications & points\nmoves each point at a given size by the amount"); + ihadd(0x71,"DELTA exception P2\nPops a value n & then n exception specifications & points\nmoves each point at a given size by the amount"); + ihadd(0x72,"DELTA exception P3\nPops a value n & then n exception specifications & points\nmoves each point at a given size by the amount"); + ihadd(0x24,"DEPTH of stack\nPushes the number of elements on the stack"); + ihadd(0x62,"DIVide\nPops two 26.6 numbers, divides them, pushes result"); + ihadd(0x20,"DUPlicate top stack element\nPushes the top stack element again"); + ihadd(0x59,"End IF\nEnds and IF or IF-ELSE sequence"); + ihadd(0x1b,"ELSE clause\nStart of Else clause of preceding IF"); + ihadd(0x2d,"END Function definition"); + ihadd(0x54,"EQual\nPops two values, tests for equality, pushes result(0/1)"); + ihadd(0x57,"EVEN\nPops one value, rounds it and tests if it is even(0/1)"); + ihadd(0x2C,"Function DEFinition\nPops a value (n) and starts the nth\nfunction definition"); + ihadd(0x4e,"set the auto FLIP boolean to OFF"); + ihadd(0x4d,"set the auto FLIP boolean to ON"); + ihadd(0x80,"FLIP PoinT\nPops as many points as specified in loop counter\nFlips whether each point is on/off curve"); + ihadd(0x82,"FLIP RanGe OFF\nPops two point numbers\nsets all points between to be off curve points"); + ihadd(0x81,"FLIP RanGe ON\nPops two point numbers\nsets all points between to be on curve points"); + ihadd(0x66,"FLOOR\nPops a value, rounds to lowest int, pushes result"); + ihaddr(0x46,0x47,"Get Coordinate[a] projected onto projection vector\n 0=>use current pos\n 1=>use original pos\nPops one point, pushes the coordinate of\nthe point along projection vector"); + ihadd(0x88,"GET INFOrmation\nPops information type, pushes result"); + ihadd(0x0d,"Get Freedom Vector\nDecomposes freedom vector, pushes its\ntwo coordinates onto stack as 2.14"); + ihadd(0x0c,"Get Projection Vector\nDecomposes projection vector, pushes its\ntwo coordinates onto stack as 2.14"); + ihadd(0x52,"Greater Than\nPops two values, pushes (0/1) if bottom el > top"); + ihadd(0x53,"Greater Than or EQual\nPops two values, pushes (0/1) if bottom el >= top"); + ihadd(0x89,"Instruction DEFinition\nPops a value which becomes the opcode\nand begins definition of new instruction"); + ihadd(0x58,"IF test\nPops an integer,\nif 0 (false) next instruction is ELSE or EIF\nif non-0 execution continues normally\n(unless there's an ELSE)"); + ihadd(0x8e,"INSTRuction execution ConTRoL\nPops a selector and value\nSets a state variable"); + ihadd(0x39,"Interpolate Point\nPops as many points as specified in loop counter\nInterpolates each point to preserve original status\nwith respect to RP1 and RP2"); + ihadd(0x0f,"moves point to InterSECTion of two lines\nPops start,end start,end points of two lines\nand a point to move. Point is moved to\nintersection"); + ihaddr(0x30,0x31,"Interpolate Untouched Points[a]\n 0=> interpolate in y direction\n 1=> x direction"); + ihadd(0x1c,"JuMP Relative\nPops offset (in bytes) to move the instruction pointer"); + ihadd(0x79,"Jump Relative On False\nPops a boolean and an offset\nChanges instruction pointer by offset bytes\nif boolean is false"); + ihadd(0x78,"Jump Relative On True\nPops a boolean and an offset\nChanges instruction pointer by offset bytes\nif boolean is true"); + ihadd(0x2a,"LOOP and CALL function\nPops a function number & count\nCalls function count times"); + ihadd(0x50,"Less Than\nPops two values, pushes (0/1) if bottom el < top"); + ihadd(0x51,"Less Than or EQual\nPops two values, pushes (0/1) if bottom el <= top"); + ihadd(0x8b,"MAXimum of top two stack entries\nPops two values, pushes the maximum back"); + ihaddr(0x49,0x4a,"Measure Distance[a]\n 0=>distance with current positions\n 1=>distance with original positions\nPops two point numbers, pushes distance between them"); + ihaddr(0x2e,0x2f,"Move Direct Absolute Point[a]\n 0=>do not round\n 1=>round\nPops a point number, touches that point\nand perhaps rounds it to the grid along\nthe projection vector. Sets rp0&rp1 to the point"); + ihaddr(0xc0,0xdf,"Move Direct Relative Point[abcde]\n a=0=>don't set rp0\n a=1=>set rp0 to p\n b=0=>do not keep distance more than minimum\n b=1=>keep distance at least minimum\n c=0 do not round\n c=1 round\n de=0 => grey distance\n de=1 => black distance\n de=2 => white distance\nPops a point moves it so that it maintains\nits original distance to the rp0. Sets\nrp1 to rp0, rp2 to point, sometimes rp0 to point"); + ihaddr(0x3e,0x3f,"Move Indirect Absolute Point[a]\n 0=>do not round, don't use cvt cutin\n 1=>round\nPops a point number & a cvt entry,\ntouches the point and moves it to the coord\nspecified in the cvt (along the projection vector).\nSets rp0&rp1 to the point"); + ihadd(0x8c,"Minimum of top two stack entries\nPops two values, pushes the minimum back"); + ihadd(0x26,"Move INDEXed element to stack\nPops an index & moves stack\nelement[index] to top of stack\n(removing it from where it was)"); + ihaddr(0xe0,0xff,"Move Indirect Relative Point[abcde]\n a=0=>don't set rp0\n a=1=>set rp0 to p\n b=0=>do not keep distance more than minimum\n b=1=>keep distance at least minimum\n c=0 do not round nor use cvt cutin\n c=1 round & use cvt cutin\n de=0 => grey distance\n de=1 => black distance\n de=2 => white distance\nPops a cvt index and a point moves it so that it\nis cvt[index] from rp0. Sets\nrp1 to rp0, rp2 to point, sometimes rp0 to point"); + ihadd(0x4b,"Measure Pixels Per EM\nPushs the pixels per em (for current rasterization)"); + ihadd(0x4c,"Measure Point Size\nPushes the current point size"); + ihaddr(0x3a,0x3b,"Move Stack Indirect Relative Point[a]\n 0=>do not set rp0\n 1=>set rp0 to point\nPops a 26.6 distance and a point\nMoves point so it is distance from rp0"); + ihadd(0x63,"MULtiply\nPops two 26.6 numbers, multiplies them, pushes result"); + ihadd(0x65,"NEGate\nNegates the top of the stack"); + ihadd(0x55,"Not EQual\nPops two values, tests for inequality, pushes result(0/1)"); + ihadd(0x5c,"logical NOT\nPops a number, if 0 pushes 1, else pushes 0"); + ihadd(0x40,"N PUSH Bytes\nReads an (unsigned) count byte from the\ninstruction stream, then reads and pushes\nthat many unsigned bytes"); + ihadd(0x41,"N PUSH Words\nReads an (unsigned) count byte from the\ninstruction stream, then reads and pushes\nthat many signed 2byte words"); + ihaddr(0x6c,0x6f,"No ROUNDing of value[ab]\n ab=0 => grey distance\n ab=1 => black distance\n ab=2 => white distance\nPops a coordinate (26.6), changes it (without\nrounding) to compensate for engine effects\npushes it back" ); + ihadd(0x56,"ODD\nPops one value, rounds it and tests if it is odd(0/1)"); + ihadd(0x5b,"logical OR\nPops two values, ors them, pushes result"); + ihadd(0x21,"POP top stack element"); + ihaddr(0xb0,0xb7,"PUSH Byte[abc]\n abc is the number-1 of bytes to push\nReads abc+1 unsigned bytes from\nthe instruction stream and pushes them"); + ihaddr(0xb8,0xbf,"PUSH Word[abc]\n abc is the number-1 of words to push\nReads abc+1 signed words from\nthe instruction stream and pushes them"); + ihadd(0x45,"Read Control Value Table entry\nPops an index to the CVT and\npushes it in 26.6 format"); + ihadd(0x7d,"Round Down To Grid\n\nSets round state to the obvious"); + ihadd(0x7a,"Round OFF\nSets round state so that no rounding occurs\nbut engine compensation does"); + ihadd(0x8a,"ROLL the top three stack elements"); + ihaddr(0x68,0x6b,"ROUND value[ab]\n ab=0 => grey distance\n ab=1 => black distance\n ab=2 => white distance\nRounds a coordinate (26.6) at top of stack\nand compensates for engine effects" ); + ihadd(0x43,"Read Store\nPops an index into store array\nPushes value at that index"); + ihadd(0x3d,"Round To Double Grid\nSets the round state (round to closest .5/int)"); + ihadd(0x18,"Round To Grid\nSets the round state"); + ihadd(0x19,"Round To Half Grid\nSets the round state (round to closest .5 not int)"); + ihadd(0x7c,"Round Up To Grid\nSets the round state"); + ihadd(0x77,"Super 45\260 ROUND\nToo complicated. Look it up"); + ihadd(0x7e,"Set ANGle Weight\nPops an int, and sets the angle\nweight state variable to it\nObsolete"); + ihadd(0x85,"SCAN conversion ConTRoL\nPops a number which sets the\ndropout control mode"); + ihadd(0x8d,"SCANTYPE\nPops number which sets which scan\nconversion rules to use"); + ihadd(0x48,"Sets Coordinate From Stack using projection & freedom vectors\nPops a coordinate 26.6 and a point\nMoves point to given coordinate"); + ihadd(0x1d,"Sets Control Value Table Cut-In\nPops 26.6 from stack, sets cvt cutin"); + ihadd(0x5e,"Set Delta Base\nPops value sets delta base"); + ihaddr(0x86,0x87,"Set Dual Projection Vector To Line[a]\n 0 => parallel to line\n 1=>orthogonal to line\nPops two points used to establish the line\nSets a second projection vector based on original\npositions of points"); + ihadd(0x5F,"Set Delta Shift\nPops a new value for delta shift"); + ihadd(0x0b,"Set Freedom Vector From Stack\npops 2 2.14 values (x,y) from stack\nmust be a unit vector"); + ihaddr(0x04,0x05,"Set Freedom Vector To Coordinate Axis[a]\n 0=>y axis\n 1=>x axis\n" ); + ihaddr(0x08,0x09,"Set Fredom Vector To Line[a]\n 0 => parallel to line\n 1=>orthogonal to line\nPops two points used to establish the line\nSets the freedom vector" ); + ihadd(0x0e,"Set Freedom Vector To Projection Vector"); + ihaddr(0x34,0x35,"SHift Contour using reference point[a]\n 0=>uses rp2 in zp1\n 1=>uses rp1 in zp0\nPops number of contour to be shifted\nShifts the entire contour by the amount\nreference point was shifted"); + ihaddr(0x32,0x33,"SHift Point using reference point[a]\n 0=>uses rp2 in zp1\n 1=>uses rp1 in zp0\nPops as many points as specified by the loop count\nShifts each by the amount the reference\npoint was shifted"); + ihadd(0x38,"SHift point by a PIXel amount\nPops an amount (26.6) and as many points\nas the loop counter specifies\neach point is shifted along the FREEDOM vector"); + ihaddr(0x36,0x37,"SHift Zone using reference point[a]\n 0=>uses rp2 in zp1\n 1=>uses rp1 in zp0\nPops the zone to be shifted\nShifts all points in zone by the amount\nthe reference point was shifted"); + ihadd(0x17,"Set LOOP variable\nPops the new value for the loop counter\nDefaults to 1 after each use"); + ihadd(0x1a,"Set Minimum Distance\nPops a 26.6 value from stack to be new minimum distance"); + ihadd(0x0a,"Set Projection Vector From Stack\npops 2 2.14 values (x,y) from stack\nmust be a unit vector"); + ihaddr(0x02,0x03,"Set Projection Vector To Coordinate Axis[a]\n 0=>y axis\n 1=>x axis\n" ); + ihaddr(0x06,0x07,"Set Projection Vector To Line[a]\n 0 => parallel to line\n 1=>orthogonal to line\nPops two points used to establish the line\nSets the projection vector" ); + ihadd(0x76,"Super ROUND\nToo complicated. Look it up"); + ihadd(0x10,"Set Reference Point 0\nPops a point which becomes the new rp0"); + ihadd(0x11,"Set Reference Point 1\nPops a point which becomes the new rp1"); + ihadd(0x12,"Set Reference Point 2\nPops a point which becomes the new rp2"); + ihadd(0x1f,"Set Single Width\nPops value for single width value (FUnit)"); + ihadd(0x1e,"Set Single Width Cut-In\nPops value for single width cut-in value (26.6)"); + ihadd(0x61,"SUBtract\nPops two 26.6 fixed numbers from stack\nsubtracts them, pushes result"); + ihaddr(0x00,0x01,"Set freedom & projection Vectors To Coordinate Axis[a]\n 0=>both to y axis\n 1=>both to x axis\n" ); + ihadd(0x23,"SWAP top two elements on stack"); + ihadd(0x13,"Set Zone Pointer 0\nPops the zone number into zp0"); + ihadd(0x14,"Set Zone Pointer 1\nPops the zone number into zp1"); + ihadd(0x15,"Set Zone Pointer 2\nPops the zone number into zp2"); + ihadd(0x16,"Set Zone PointerS\nPops the zone number into zp0,zp1 and zp2"); + ihadd(0x29,"UnTouch Point\nPops a point number and marks it untouched"); + ihadd(0x70,"Write Control Value Table in Funits\nPops a number(Funits) and a\nCVT index and writes the number to cvt[index]"); + ihadd(0x44,"Write Control Value Table in Pixel units\nPops a number(26.6) and a\nCVT index and writes the number to cvt[index]"); + ihadd(0x42,"Write Store\nPops a value and an index and writes the value to storage[index]"); +} + +typedef struct instrdlg { + GWindow gw, v; + unsigned int inedit: 1; + struct instrdata *instrdata; + struct instrinfo instrinfo; + int oc_height; + GGadget *ok, *cancel, *edit, *parse, *text; +} InstrDlg; + +static void instr_typify(struct instrinfo *instrinfo) { + int i, len = instrinfo->instrdata->instr_cnt, cnt, j, lh; + uint8 *instrs = instrinfo->instrdata->instrs; + uint8 *bts; + + if ( instrinfo->instrdata->bts==NULL ) + instrinfo->instrdata->bts = galloc(len+1); + bts = instrinfo->instrdata->bts; + for ( i=lh=0; ilheight = lh; + if ( instrinfo->fh!=0 ) { + if ( instrinfo->lpos > lh-instrinfo->vheight/instrinfo->fh ) + instrinfo->lpos = lh-instrinfo->vheight/instrinfo->fh; + if ( instrinfo->lpos<0 ) + instrinfo->lpos = 0; + } +} + +static void instr_resize(InstrDlg *iv,GEvent *event) { + GRect pos, size; + int lh; + struct instrinfo *ii = &iv->instrinfo; + + /* Multiple of the number of lines we've got */ + if ( (event->u.resize.size.height-iv->oc_height-4)%ii->fh!=0 ) { + int lc = (event->u.resize.size.height-iv->oc_height+ii->fh/2)/ii->fh; + if ( lc<=0 ) lc = 1; + GDrawResize(iv->gw, event->u.resize.size.width,lc*ii->fh+iv->oc_height+4); +return; + } + + pos.width = GDrawPointsToPixels(iv->gw,_GScrollBar_Width); + pos.height = event->u.resize.size.height-iv->oc_height; + pos.x = event->u.resize.size.width-pos.width; pos.y = 0; + GGadgetResize(ii->vsb,pos.width,pos.height); + GGadgetMove(ii->vsb,pos.x,pos.y); + pos.width = pos.x; pos.x = 0; + GDrawResize(ii->v,pos.width,pos.height); + + GGadgetResize(iv->text,event->u.resize.size.width,pos.height); + + GGadgetGetSize(iv->cancel,&size); + GGadgetMove(iv->ok,10,event->u.resize.size.height-iv->oc_height+6); + GGadgetMove(iv->cancel,event->u.resize.size.width-13-size.width,event->u.resize.size.height-iv->oc_height+9); + GGadgetMove(iv->edit,(event->u.resize.size.width-size.width)/2,event->u.resize.size.height-iv->oc_height+9); + GGadgetMove(iv->parse,(event->u.resize.size.width-size.width)/2,event->u.resize.size.height-iv->oc_height+9); + + ii->vheight = pos.height; ii->vwidth = pos.width; + lh = ii->lheight; + + GScrollBarSetBounds(ii->vsb,0,lh+1,ii->vheight/ii->fh); + if ( ii->lpos + ii->vheight/ii->fh > lh ) + ii->lpos = lh-ii->vheight/ii->fh; + if ( ii->lpos<0 ) ii->lpos = 0; + GScrollBarSetPos(ii->vsb,ii->lpos); + GDrawRequestExpose(iv->gw,NULL,false); +} + +static void IVError(InstrDlg *iv,int msg,int offset) { + + GTextFieldSelect(iv->text,offset,offset); + GTextFieldShow(iv->text,offset); + GWidgetIndicateFocusGadget(iv->text); + GWidgetErrorR(_STR_ParseError,msg); +} + +static int IVParse(InstrDlg *iv) { + short numberstack[256]; + int npos=0, nread, i; + int push_left=0, push_size=0; + const unichar_t *text = _GGadgetGetTitle(iv->text), *pt; + unichar_t *end, *bend, *brack; + int icnt=0, imax=u_strlen(text)/2, val, temp; + uint8 *instrs = galloc(imax); + + for ( pt = text; *pt ; ++pt ) { + npos = 0; + while ( npos<256 ) { + while ( *pt==' ' || *pt=='\t' ) ++pt; + if ( isdigit( *pt ) || *pt=='-' ) { + val = u_strtol(pt,&end,0); + if ( val>32767 || val<-32768 ) { + IVError(iv,_STR_InvalidShort,pt-text); +return( false ); + } + numberstack[npos++] = val; + pt = end; + } else if ( uc_strnmatch(pt,"cvt",3)==0 ) { + pt += 3; + while ( *pt==' ' || *pt=='\t' ) ++pt; + if ( *pt!='(' ) { + IVError(iv,_STR_MissingLParenCvt,pt-text); +return( false ); + } + temp = u_strtol(pt+1,&end,0); + pt = end; + while ( *pt==' ' || *pt=='\t' ) ++pt; + if ( *pt!=')' ) { + IVError(iv,_STR_MissingRParenCvt,pt-text); +return( false ); + } + numberstack[npos++] = TTF__getcvtval(iv->instrdata->sf,temp); + ++pt; + } else + break; + } + while ( *pt==' ' || *pt=='\t' ) ++pt; + if ( npos==0 && *pt=='\n' ) + continue; + nread = 0; + if ( push_left==-1 ) { + /* we need a push count */ + if ( npos==0 ) + IVError(iv,_STR_NeedPushCount,pt-text); + else if ( numberstack[0]>255 || numberstack[0]<=0 ) { + IVError(iv,_STR_InvalidPushCount,pt-text); +return( false ); + } else { + nread = 1; + instrs[icnt++] = numberstack[0]; + push_left = numberstack[0]; + } + } + if ( push_left!=0 && push_left0 && nread>8; + instrs[icnt++] = numberstack[nread++]&0xff; + } else if ( numberstack[0]>255 || numberstack[0]<0 ) { + IVError(iv,_STR_InvalidUnsignedByte,pt-text); +return( false ); + } else + instrs[icnt++] = numberstack[nread++]; + --push_left; + } + if ( *pt=='\n' ) + continue; + if ( push_left>0 ) { + IVError(iv,_STR_MissingPushes,pt-text); +return( false ); + } + while ( nread=0 && numberstack[nread]<=255 ) { + while ( i=0 && numberstack[i]<=255 ) + ++i; + if ( i-nread<=8 ) + instrs[icnt++] = ttf_pushb+(i-nread)-1; + else { + instrs[icnt++] = ttf_npushb; + instrs[icnt++] = i-nread; + } + while ( nread255 ) + ++i; + if ( i-nread<=8 ) + instrs[icnt++] = ttf_pushw+(i-nread)-1; + else { + instrs[icnt++] = ttf_npushw; + instrs[icnt++] = i-nread; + } + while ( nread>8; + instrs[icnt++] = numberstack[nread++]&0xff; + } + } + } + brack = NULL; + for ( end=(unichar_t *) pt; *end!='\n' && *end!=' ' && *end!='\0'; ++end ) + if ( *end=='[' || *end=='_' ) brack=end; + for ( i=0; i<256; ++i ) + if ( uc_strnmatch(pt,instrnames[i],end-pt)==0 && end-pt==strlen(instrnames[i])) + break; + if ( i==256 && brack!=NULL ) { + for ( i=0; i<256; ++i ) + if ( uc_strnmatch(pt,instrnames[i],brack-pt+1)==0 ) + break; + val = u_strtol(brack+1,&bend,2); /* Stuff in brackets should be in binary */ + while ( *bend==' ' || *bend=='\t' ) ++bend; + if ( *bend!=']' ) { + IVError(iv,_STR_MissingRBracket,pt-text); +return( false ); + } + if ( val>=32 ) { + IVError(iv,_STR_BracketNumTooBig,pt-text); +return( false ); + } + i += val; + } + pt = end; + instrs[icnt++] = i; + if ( i==ttf_npushb || i==ttf_npushw || (i>=ttf_pushb && i<=ttf_pushw+7)) { + push_size = (i==ttf_npushb || (i>=ttf_pushb && i<=ttf_pushb+7))? 1 : 2; + if ( i==ttf_npushb || i==ttf_npushw ) + push_left = -1; + else if ( i>=ttf_pushb && i<=ttf_pushb+7 ) + push_left = i-ttf_pushb+1; + else + push_left = i-ttf_pushw+1; + } + if ( *pt=='\0' ) + break; + } + if ( icnt!=iv->instrdata->instr_cnt ) + iv->instrdata->changed = true; + else { + for ( i=0; iinstrdata->instrs[i]) + break; + if ( i==icnt ) { /* Unchanged */ + free(instrs); +return( true ); + } + } + free( iv->instrdata->instrs ); + iv->instrdata->instrs = instrs; + iv->instrdata->instr_cnt = icnt; + iv->instrdata->max = imax; + iv->instrdata->changed = true; + free(iv->instrdata->bts ); + iv->instrdata->bts = NULL; + instr_typify(&iv->instrinfo); + GScrollBarSetBounds(iv->instrinfo.vsb,0,iv->instrinfo.lheight+1, + iv->instrinfo.vheight/iv->instrinfo.fh); +return( true ); +} + +static void IVOk(InstrDlg *iv) { + struct instrdata *id = iv->instrdata; + + if ( id->changed ) { + if ( id->sc!=NULL ) { + SplineChar *sc = id->sc; + CharView *cv; + free(sc->ttf_instrs); + sc->ttf_instrs_len = id->instr_cnt; + if ( id->instr_cnt==0 ) + sc->ttf_instrs = NULL; + else { + sc->ttf_instrs = galloc( id->instr_cnt ); + memcpy(sc->ttf_instrs,id->instrs,id->instr_cnt ); + } + for ( cv=sc->views; cv!=NULL; cv=cv->next ) + cv->showpointnumbers = false; + SCCharChangedUpdate(sc); + } else { + struct ttf_table *tab, *prev; + if ( id->instr_cnt==0 ) { + for ( prev=NULL, tab=id->sf->ttf_tables; tab!=NULL && tab->tag!=id->tag; prev=tab, tab=tab->next ); + if ( tab==NULL ) + /* Nothing to be done */; + else if ( prev==NULL ) + id->sf->ttf_tables = tab->next; + else + prev->next = tab->next; + if ( tab!=NULL ) { + tab->next = NULL; + TtfTablesFree(tab); + } + } else { + tab = SFFindTable(id->sf,id->tag); + if ( tab==NULL ) { + tab = chunkalloc(sizeof(struct ttf_table)); + tab->next = id->sf->ttf_tables; + id->sf->ttf_tables = tab; + tab->tag = id->tag; + } + free( tab->data ); + tab->data = galloc( id->instr_cnt ); + memcpy(tab->data,id->instrs,id->instr_cnt ); + tab->len = id->instr_cnt; + } + } + } + /* Instructions get freed in et_destroy */ +} + +static void IVBuildEdit(InstrDlg *iv) { + char val[20]; + unichar_t *ubuf, *pt, *offset, *scroll; + int i,l; + + pt = ubuf = offset = scroll = galloc(iv->instrdata->instr_cnt*20*sizeof(unichar_t)); + for ( i=l=0; iinstrdata->instr_cnt; ++i ) { + if ( iv->instrinfo.lpos == l ) + scroll = pt; + if ( iv->instrinfo.isel_pos == l ) + offset = pt; + if ( iv->instrdata->bts[i]==bt_wordhi ) { + sprintf( val, " %d", (short) ((iv->instrdata->instrs[i]<<8) | iv->instrdata->instrs[i+1]) ); + uc_strcpy(pt,val); + ++i; + } else if ( iv->instrdata->bts[i]==bt_cnt || iv->instrdata->bts[i]==bt_byte ) { + sprintf( val, " %d", iv->instrdata->instrs[i]); + uc_strcpy(pt,val); + } else { + uc_strcpy(pt, instrnames[iv->instrdata->instrs[i]]); + } + pt += u_strlen(pt); + *pt++ = '\n'; + ++l; + } + *pt = '\0'; + GGadgetSetTitle(iv->text,ubuf); + GTextFieldSelect(iv->text,offset-ubuf,offset-ubuf); + GTextFieldShow(iv->text,scroll-ubuf); + free(ubuf); +} + +static void instr_expose(struct instrinfo *ii,GWindow pixmap,GRect *rect) { + int low, high; + int i,x,y; + char loc[8], ins[8], val[8]; unichar_t uloc[8], uins[8], uname[30]; + int addr_end, num_end; + static unichar_t nums[] = { '0', '0', '0', '0', '0', '0', '\0' }; + + GDrawSetFont(pixmap,ii->gfont); + GDrawSetLineWidth(pixmap,0); + addr_end = 0; + if ( ii->showaddr ) + addr_end = GDrawGetTextWidth(pixmap,nums,4,NULL)+EDGE_SPACING; + num_end = addr_end; + if ( ii->showhex ) + num_end = addr_end + GDrawGetTextWidth(pixmap,nums,5,NULL)+4; + else if ( addr_end<36+2*EDGE_SPACING ) + num_end = addr_end = 36+2*EDGE_SPACING; + + low = ( (rect->y-EDGE_SPACING)/ii->fh ) * ii->fh +EDGE_SPACING; + high = ( (rect->y+rect->height+ii->fh-1-EDGE_SPACING)/ii->fh ) * ii->fh +EDGE_SPACING; + + if ( ii->isel_pos!=-1 ) { + GRect r; + r.x = 0; r.width = ii->vwidth; + r.y = (ii->isel_pos-ii->lpos)*ii->fh+EDGE_SPACING; r.height = ii->fh; + GDrawFillRect(pixmap,&r,0xffff00); + } + + if ( ii->showaddr ) + GDrawDrawLine(pixmap,addr_end,rect->y,addr_end,rect->y+rect->height,0x000000); + if ( ii->showhex ) + GDrawDrawLine(pixmap,num_end,rect->y,num_end,rect->y+rect->height,0x000000); + + for ( i=0, y=EDGE_SPACING-ii->lpos*ii->fh; yinstrdata->instr_cnt; ++i ) { + if ( ii->instrdata->bts[i]==bt_wordhi ) + ++i; + y += ii->fh; + } + if ( y<=high && ii->instrdata->instr_cnt==0 && i==0 ) { + if ( ii->instrdata->in_composit ) { + uc_strcpy(uname,""); + GDrawDrawText(pixmap,num_end+EDGE_SPACING,y+ii->as,uname,-1,NULL,0xff0000); + y += ii->fh; + } + uc_strcpy(uname,""); + GDrawDrawText(pixmap,num_end+EDGE_SPACING,y+ii->as,uname,-1,NULL,0xff0000); + } else { + for ( ; y<=high && iinstrdata->instr_cnt+1; ++i ) { + sprintf( loc, "%d", i ); uc_strcpy(uloc,loc); + if ( ii->instrdata->bts[i]==bt_wordhi ) { + sprintf( ins, " %02x%02x", ii->instrdata->instrs[i], ii->instrdata->instrs[i+1]); uc_strcpy(uins,ins); + sprintf( val, " %d", (short) ((ii->instrdata->instrs[i]<<8) | ii->instrdata->instrs[i+1]) ); + uc_strcpy(uname,val); + ++i; + } else if ( ii->instrdata->bts[i]==bt_cnt || ii->instrdata->bts[i]==bt_byte ) { + sprintf( ins, " %02x", ii->instrdata->instrs[i] ); uc_strcpy(uins,ins); + sprintf( val, " %d", ii->instrdata->instrs[i]); + uc_strcpy(uname,val); + } else if ( ii->instrdata->bts[i]==bt_impliedreturn ) { + uc_strcpy(uname,""); + } else { + sprintf( ins, "%02x", ii->instrdata->instrs[i] ); uc_strcpy(uins,ins); + uc_strcpy(uname, instrnames[ii->instrdata->instrs[i]]); + } + + if ( ii->showaddr ) { + x = addr_end - EDGE_SPACING - GDrawGetTextWidth(pixmap,uloc,-1,NULL); + GDrawDrawText(pixmap,x,y+ii->as,uloc,-1,NULL,0x000000); + if ( ii->bpcheck && ii->bpcheck(ii,i)) + GDrawDrawImage(pixmap,&GIcon_Stop,NULL,EDGE_SPACING, + y+(ii->fh-8)/2-5); + } + x = addr_end + EDGE_SPACING; + if ( ii->showhex ) + GDrawDrawText(pixmap,x,y+ii->as,uins,-1,NULL,0x000000); + GDrawDrawText(pixmap,num_end+EDGE_SPACING,y+ii->as,uname,-1,NULL,0x000000); + y += ii->fh; + } + if ( ii->showaddr && ii->lstopped!=-1 ) { + GDrawDrawImage(pixmap,&GIcon_Stopped,NULL,EDGE_SPACING, + (ii->lstopped-ii->lpos)*ii->fh+(ii->fh-8)/2); + } + } +} + +static void instr_mousedown(struct instrinfo *ii,int pos) { + int i,l; + + pos = (pos-2)/ii->fh + ii->lpos; + if ( pos>=ii->lheight ) + pos = -1; + + for ( i=l=0; linstrdata->instr_cnt; ++i, ++l ) { + if ( ii->instrdata->bts[i]==bt_wordhi ) + ++i; + } + + ii->isel_pos=pos; + if ( ii->selection_callback!=NULL ) + (ii->selection_callback)(ii,i); + GDrawRequestExpose(ii->v,NULL,false); +} + +static void instr_mousemove(struct instrinfo *ii,int pos) { + int i,y; + static unichar_t buffer[1025]; + const unichar_t *msg; + + if ( ii->mousedown ) { + instr_mousedown(ii,y); +return; + } + if ( ii->instrdata->bts==NULL ) +return; + + pos = ((pos-2)/ii->fh) * ii->fh + 2; + + for ( i=0, y=2-ii->lpos*ii->fh; yinstrdata->instr_cnt; ++i ) { + if ( ii->instrdata->bts[i]==bt_wordhi ) + ++i; + y += ii->fh; + } + switch ( ii->instrdata->bts[i] ) { + case bt_wordhi: case bt_wordlo: + uc_strcpy(buffer,"A short to be pushed on the stack"); + msg = buffer; + break; + case bt_cnt: + uc_strcpy(buffer,"A count specifying how many bytes/shorts\nshould be pushed on the stack"); + msg = buffer; + break; + case bt_byte: + uc_strcpy(buffer,"An unsigned byte to be pushed on the stack"); + msg = buffer; + break; + case bt_instr: + msg = instrhelppopup[ii->instrdata->instrs[i]]; + if ( msg==NULL ) { + uc_strcpy(buffer,"???"); + msg = buffer; + } + break; + default: + uc_strcpy(buffer,"???"); + msg = buffer; + break; + } + GGadgetPreparePopup(GDrawGetParentWindow(ii->v),msg); +} + +void instr_scroll(struct instrinfo *ii,struct sbevent *sb) { + int newpos = ii->lpos; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= ii->vheight/ii->fh; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += ii->vheight/ii->fh; + break; + case et_sb_bottom: + newpos = ii->lheight-ii->vheight/ii->fh; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>ii->lheight-ii->vheight/ii->fh ) + newpos = ii->lheight-ii->vheight/ii->fh; + if ( newpos<0 ) newpos =0; + if ( newpos!=ii->lpos ) { + GRect r; + int diff = newpos-ii->lpos; + ii->lpos = newpos; + GScrollBarSetPos(ii->vsb,ii->lpos); + r.x=0; r.y = EDGE_SPACING; r.width=ii->vwidth; r.height=ii->vheight-2*EDGE_SPACING; + GDrawScroll(ii->v,&r,0,diff*ii->fh); + } +} + +static int IIChar(struct instrinfo *ii,GEvent *event) { + int pos = ii->isel_pos; + + if ( event->u.chr.keysym == GK_Up || event->u.chr.keysym == GK_KP_Up ) + --pos; + else if ( event->u.chr.keysym == GK_Down || event->u.chr.keysym == GK_KP_Down ) + ++pos; + else if ( event->u.chr.keysym == GK_Home || event->u.chr.keysym == GK_KP_Home || + event->u.chr.keysym == GK_Begin || event->u.chr.keysym == GK_KP_Begin ) + pos = 0; + else if ( event->u.chr.keysym == GK_End || event->u.chr.keysym == GK_KP_End ) { + pos = ii->lheight-1; + } else if ( ii->handle_char ) +return( (ii->handle_char)(ii,event)); + else +return( false ); + if ( pos==-2 ) pos = -1; + if ( pos!=ii->isel_pos ) { + ii->isel_pos = pos; + if ( pos!=-1 && (poslpos || pos>=ii->lpos+ii->vheight/ii->fh )) { + ii->lpos = pos-(ii->vheight/(3*ii->fh)); + if ( ii->lpos>=ii->lheight-ii->vheight/ii->fh ) + ii->lpos = ii->lheight-ii->vheight/ii->fh-1; + if ( ii->lpos<0 ) ii->lpos = 0; + GScrollBarSetPos(ii->vsb,ii->lpos); + } + } + if ( ii->selection_callback!=NULL ) { + int i,l; + for ( i=l=0; linstrdata->instr_cnt; ++i, ++l ) { + if ( ii->instrdata->bts[i]==bt_wordhi ) + ++i; + } + (ii->selection_callback)(ii,i); + } + GDrawRequestExpose(ii->v,NULL,false); +return( true ); +} + +int ii_v_e_h(GWindow gw, GEvent *event) { + struct instrinfo *ii = (struct instrinfo *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + instr_expose(ii,gw,&event->u.expose.rect); + break; + case et_char: + if ( IIChar(ii,event)) + /* All Done */; + else if ( event->u.chr.keysym == GK_Help || event->u.chr.keysym == GK_F1 ) + help("ttfinstrs.html"); + break; + case et_mousemove: case et_mousedown: case et_mouseup: + GGadgetEndPopup(); + if ( event->type==et_mousemove ) + instr_mousemove(ii,event->u.mouse.y); + else if ( event->type==et_mousedown ) { + instr_mousedown(ii,event->u.mouse.y); + if ( event->u.mouse.clicks==2 ) + /*InstrModCreate(ii)*/; + } else { + instr_mousemove(ii,event->u.mouse.y); + ii->mousedown = false; + } + break; + case et_timer: + break; + case et_focus: + break; + } +return( true ); +} + +static int iv_e_h(GWindow gw, GEvent *event) { + InstrDlg *iv = (InstrDlg *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + GDrawDrawLine(gw,0,iv->instrinfo.vheight, + iv->instrinfo.vwidth+400,iv->instrinfo.vheight,0x000000); + break; + case et_resize: + instr_resize(iv,event); + break; + case et_char: + if ( event->u.chr.keysym == GK_Help || event->u.chr.keysym == GK_F1 ) + help("ttfinstrs.html"); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + instr_scroll(&iv->instrinfo,&event->u.control.u.sb); + break; + case et_buttonactivate: + if ( event->u.control.g==iv->ok || event->u.control.g==iv->cancel ) { + if ( event->u.control.g == iv->ok ) { + if ( iv->inedit ) + if ( !IVParse(iv)) + break; + IVOk(iv); + } + GDrawDestroyWindow(iv->gw); + } else if ( event->u.control.g==iv->edit || event->u.control.g==iv->parse ) { + int toedit = event->u.control.g==iv->edit; + if ( toedit ) + IVBuildEdit(iv); + else if ( !IVParse(iv)) + break; + GGadgetSetVisible(iv->parse,toedit); + GGadgetSetVisible(iv->text,toedit); + GGadgetSetVisible(iv->edit,!toedit); + GGadgetSetVisible(iv->instrinfo.vsb,!toedit); + GDrawSetVisible(iv->instrinfo.v,!toedit); + iv->inedit = toedit; + } + break; + } + break; + case et_close: + GDrawDestroyWindow(iv->gw); + break; + case et_destroy: { + SplineFont *sf = iv->instrdata->sf; + struct instrdata *id, *prev; + for ( prev = NULL, id=sf->instr_dlgs; id!=iv->instrdata && id!=NULL; prev=id, id=id->next ); + if ( prev==NULL ) + sf->instr_dlgs = iv->instrdata->next; + else + prev->next = iv->instrdata->next; + free(iv->instrdata->instrs); + free(iv->instrdata->bts); + free(iv->instrdata); + free(iv); + } break; + } +return( true ); +} + +static void InstrDlgCreate(struct instrdata *id,unichar_t *title) { + InstrDlg *iv = gcalloc(1,sizeof(*iv)); + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + FontRequest rq; + static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','u','n','i','f','o','n','t', '\0' }; + int as,ds,ld, lh; + GGadgetData gd; + GGadget *sb; + GTextInfo label; + + instrhelpsetup(); + + id->next = id->sf->instr_dlgs; + id->sf->instr_dlgs = id; + id->id = iv; + + iv->instrdata = id; + iv->instrinfo.instrdata = id; + iv->instrinfo.showhex = iv->instrinfo.showaddr = true; + iv->instrinfo.lstopped = -1; + instr_typify(&iv->instrinfo); + + if ( ttf_icon==NULL ) + ttf_icon = GDrawCreateBitmap(NULL,ttf_width,ttf_height,ttf_bits); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_icon; + wattrs.event_masks = ~(1<oc_height = GDrawPointsToPixels(NULL,37); + pos.height = GDrawPointsToPixels(NULL,100) + iv->oc_height; + iv->gw = gw = GDrawCreateTopWindow(NULL,&pos,iv_e_h,iv,&wattrs); + + memset(&label,0,sizeof(label)); + memset(&gd,0,sizeof(gd)); + gd.pos.x = 5; gd.pos.y = 105; + gd.pos.width = -1; + label.text = (unichar_t *) _STR_OK; + label.text_in_resource = true; + gd.label = &label; + gd.flags = gg_visible|gg_enabled|gg_but_default; + iv->ok = GButtonCreate(gw,&gd,iv); + gd.pos.x = -8; gd.pos.y += 3; + gd.pos.width = -1; + label.text = (unichar_t *) _STR_Cancel; + label.text_in_resource = true; + gd.label = &label; + gd.flags = gg_visible|gg_enabled|gg_but_cancel; + iv->cancel = GButtonCreate(gw,&gd,iv); + + label.text = (unichar_t *) _STR_Edit; + label.text_in_resource = true; + gd.flags = gg_visible|gg_enabled; + iv->edit = GButtonCreate(gw,&gd,iv); + label.text = (unichar_t *) _STR_Parse; + label.text_in_resource = true; + gd.flags = gg_enabled; + iv->parse = GButtonCreate(gw,&gd,iv); + + gd.label = NULL; + gd.pos.x = 0; gd.pos.y = 0; + gd.pos.width = pos.width; gd.pos.height = pos.height-GDrawPointsToPixels(NULL,40); + gd.flags = gg_enabled|gg_pos_in_pixels|gg_textarea_wrap|gg_pos_use0; + iv->text = GTextAreaCreate(gw,&gd,iv); + + gd.pos.y = 0; gd.pos.height = pos.height-GDrawPointsToPixels(NULL,40); + gd.pos.width = GDrawPointsToPixels(gw,_GScrollBar_Width); + gd.pos.x = pos.width-gd.pos.width; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + iv->instrinfo.vsb = sb = GScrollBarCreate(gw,&gd,iv); + + wattrs.mask = wam_events|wam_cursor; + pos.x = 0; pos.y = 0; + pos.width = gd.pos.x; pos.height = gd.pos.height; + iv->instrinfo.v = GWidgetCreateSubWindow(gw,&pos,ii_v_e_h,&iv->instrinfo,&wattrs); + GDrawSetVisible(iv->instrinfo.v,true); + + memset(&rq,0,sizeof(rq)); + rq.family_name = monospace; + rq.point_size = -12; + rq.weight = 400; + iv->instrinfo.gfont = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawSetFont(iv->instrinfo.v,iv->instrinfo.gfont); + GGadgetSetFont(iv->text,iv->instrinfo.gfont); + GDrawFontMetrics(iv->instrinfo.gfont,&as,&ds,&ld); + iv->instrinfo.as = as+1; + iv->instrinfo.fh = iv->instrinfo.as+ds; + iv->instrinfo.isel_pos = -1; + + lh = iv->instrinfo.lheight; + if ( lh>40 ) lh = 40; + if ( lh<4 ) lh = 4; + GDrawResize(iv->gw,pos.width+gd.pos.width,iv->oc_height+lh*iv->instrinfo.fh+4); + + GDrawSetVisible(gw,true); +} + +void SCEditInstructions(SplineChar *sc) { + struct instrdata *id; + unichar_t title[100]; + CharView *cv; + + for ( id = sc->parent->instr_dlgs; id!=NULL && id->sc!=sc; id=id->next ); + if ( id!=NULL ) { + GDrawSetVisible(id->id->gw,true); + GDrawRaise(id->id->gw); +return; + } + + for ( cv=sc->views; cv!=NULL; cv=cv->next ) { + sc = cv->sc; + cv->showpointnumbers = true; + SCNumberPoints(sc); + GDrawRequestExpose(cv->v,NULL,false); + } + id = gcalloc(1,sizeof(*id)); + id->instr_cnt = id->max = sc->ttf_instrs_len; + id->sf = sc->parent; + id->sc = sc; + id->instrs = galloc(id->max+1); + if ( sc->ttf_instrs!=NULL ) + memcpy(id->instrs,sc->ttf_instrs,id->instr_cnt); + u_sprintf(title,GStringGetResource(_STR_TTFInstructionsFor,NULL),sc->name); + InstrDlgCreate(id,title); +} + +void SCMarkInstrDlgAsChanged(SplineChar *sc) { + struct instrdata *id; + + for ( id = sc->parent->instr_dlgs; id!=NULL && id->sc!=sc; id=id->next ); + if ( id!=NULL ) + id->changed = true; +} + +void IIScrollTo(struct instrinfo *ii,int ip,int mark_stop) { + int l, i; + + for ( i=l=0; iinstrdata->instr_cnt; ++i, ++l ) { + if ( ii->instrdata->bts[i]==bt_wordhi || ii->instrdata->bts[i]==bt_wordlo ) + ++i; + } + if ( ip==-1 ) + ii->lstopped = -1; + else { + if ( mark_stop ) + ii->lstopped = l; + if ( llpos || l>=ii->lpos+ii->vheight/ii->fh-1 ) { + if ( l+ii->vheight/ii->fh-1 >= ii->lheight+1 ) + l = ii->lheight+2-(ii->vheight/ii->fh); + if ( l<0 ) + l = 0; + ii->lpos = l; + GScrollBarSetPos(ii->vsb,l); + } + } + GDrawRequestExpose(ii->v,NULL,false); +} + +void IIReinit(struct instrinfo *ii,int ip) { + instrhelpsetup(); + free(ii->instrdata->bts); + ii->instrdata->bts = NULL; + instr_typify(ii); + GScrollBarSetBounds(ii->vsb,0,ii->lheight+1, ii->vheight/ii->fh); + IIScrollTo(ii,ip,true); +} + +/* ************************************************************************** */ +/* **************************** CVT table editor **************************** */ +/* ************************************************************************** */ + +#define ADDR_SPACER 4 +#define EDGE_SPACER 2 + +typedef struct shortview /* : tableview */ { + struct ttf_table *table; + GWindow gw, v; + SplineFont *sf; + unsigned int destroyed: 1; /* window has been destroyed */ + unsigned int changed: 1; + GGadget *vsb, *tf; + GGadget *ok, *cancel, *setsize; + int lpos, lheight; + int16 as, fh; + int16 vheight, vwidth; + int16 sbw, bh; + GFont *gfont; + int16 chrlen, addrend, hexend; + int16 active; + int16 *edits; + uint8 *data; + int32 len; + uint32 tag; +} ShortView; + +static int sfinishup(ShortView *sv,int showerr) { + const unichar_t *ret = _GGadgetGetTitle(sv->tf); + unichar_t *end; + int val, oldval; + + if ( sv->active==-1 ) +return( true ); + + val = u_strtol(ret,&end,10); + if ( *ret=='\0' || *end!='\0' || val<-32768 || val>32767 ) { + if ( showerr ) + GWidgetErrorR(_STR_BadNumber,_STR_BadNumber); +return( false ); + } + oldval = sv->edits[sv->active]; + if ( val != oldval ) { + sv->changed = true; + sv->edits[sv->active] = val; + } + sv->active = -1; + GGadgetMove(sv->tf,sv->addrend,-100); +return( true ); +} + +static void SV_SetScrollBar(ShortView *sv) { + int lh; + sv->lheight = lh = sv->len/2; + + GScrollBarSetBounds(sv->vsb,0,lh,sv->vheight/sv->fh); + if ( sv->lpos + sv->vheight/sv->fh > lh ) { + int lpos = lh-sv->vheight/sv->fh; + if ( lpos<0 ) lpos = 0; + if ( sv->lpos!=lpos && sv->active!=-1 ) + GGadgetMove(sv->tf,sv->addrend,(sv->active-lpos)*sv->fh); + sv->lpos = lpos; + } + GScrollBarSetPos(sv->vsb,sv->lpos); +} + +static int SV_ChangeLength(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ShortView *sv = GDrawGetUserData(GGadgetGetWindow(g)); + char buffer[12]; + unichar_t ubuf[12], *ret, *e; + int val,i; + + sprintf( buffer, "%d", sv->len/2 ); + uc_strcpy(ubuf,buffer); + ret = GWidgetAskStringR(_STR_ChangeLength, ubuf,_STR_EnterNewLength); + if ( ret==NULL ) +return( true ); /* Cancelled */ + val = u_strtol(ret,&e,10); + if ( *e || val<0 || val>65535 ) { + GWidgetErrorR(_STR_BadNumber,_STR_BadNumber); +return( false ); + } + if ( val*2>sv->len ) { + sv->edits = grealloc(sv->edits,val*2); + for ( i=sv->len/2; iedits[i] = 0; + } + sv->len = 2*val; + SV_SetScrollBar(sv); + } +return( true ); +} + +static void SV_DoClose(ShortView *sv) { + + sv->destroyed = true; + GDrawDestroyWindow(sv->gw); +} + +static int SV_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ShortView *sv = GDrawGetUserData(GGadgetGetWindow(g)); + + SV_DoClose(sv); + } +return( true ); +} + +static int SV_OK(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + ShortView *sv = GDrawGetUserData(GGadgetGetWindow(g)); + int i; + struct ttf_table *prev, *tab; + + if ( sv->len==0 ) { + if ( sv->table!=NULL ) { + prev = NULL; + for ( tab=sv->sf->ttf_tables; tab!=NULL && tab!=sv->table; prev=tab, tab=tab->next ); + if ( prev!=NULL ) + prev->next = tab->next; + else + sv->sf->ttf_tables = tab->next; + free(sv->table->data); + free(sv->table); + } + } else { + if ( sv->table!=NULL ) + free(sv->table->data); + else { + tab = chunkalloc(sizeof(struct ttf_table)); + tab->next = sv->sf->ttf_tables; + sv->sf->ttf_tables = tab; + tab->tag = sv->tag; + } + sv->table->data = galloc(sv->len); + for ( i=0; ilen/2; ++i ) { + sv->table->data[i<<1] = (sv->edits[i]>>8)&0xff; + sv->table->data[(i<<1)+1] = sv->edits[i]&0xff; + } + sv->table->len = sv->len; + } + sv->sf->changed = true; + SV_DoClose(sv); + } +return( true ); +} + +static void short_resize(ShortView *sv,GEvent *event) { + GRect pos, gsize; + int width; + + /* height must be a multiple of the line height */ + if ( (event->u.resize.size.height-2*EDGE_SPACER-sv->bh)%sv->fh!=0 || + (event->u.resize.size.height-2*EDGE_SPACER-sv->fh-sv->bh)<0 ) { + int lc = (event->u.resize.size.height+sv->fh/2-EDGE_SPACER)/sv->fh; + if ( lc<=0 ) lc = 1; + GDrawResize(sv->gw, event->u.resize.size.width, + lc*sv->fh+2*EDGE_SPACER+sv->bh); +return; + } + + pos.width = GDrawPointsToPixels(sv->gw,_GScrollBar_Width); + pos.height = event->u.resize.size.height-sv->bh; + pos.x = event->u.resize.size.width-pos.width; pos.y = 0; + GGadgetResize(sv->vsb,pos.width,pos.height+1); + GGadgetMove(sv->vsb,pos.x,pos.y); + pos.width = pos.x; pos.x = 0; + GDrawResize(sv->v,pos.width,pos.height); + + sv->vheight = pos.height; sv->vwidth = pos.width; + SV_SetScrollBar(sv); + + width = pos.width-sv->addrend; + if ( width < 5 ) width = 5; + GGadgetResize(sv->tf,width,sv->fh); + + GGadgetGetSize(sv->ok,&gsize); + GGadgetMove(sv->ok,gsize.x,event->u.resize.size.height-GDrawPointsToPixels(sv->gw,33)); + GGadgetMove(sv->cancel,event->u.resize.size.width-gsize.x-gsize.width,event->u.resize.size.height-GDrawPointsToPixels(sv->gw,30)); + GGadgetGetSize(sv->setsize,&gsize); + GGadgetMove(sv->setsize,(event->u.resize.size.width-gsize.width)/2, + event->u.resize.size.height-GDrawPointsToPixels(sv->gw,60)); + + GDrawRequestExpose(sv->gw,NULL,false); + GDrawRequestExpose(sv->v,NULL,false); +} + +static void short_expose(ShortView *sv,GWindow pixmap,GRect *rect) { + int low, high; + int x,y; + char cval[8], caddr[8]; unichar_t uval[8], uaddr[8]; + int index; + + GDrawSetFont(pixmap,sv->gfont); + + low = ( (rect->y-EDGE_SPACER)/sv->fh ) * sv->fh + EDGE_SPACER; + high = ( (rect->y+rect->height+sv->fh-1-EDGE_SPACER)/sv->fh ) * sv->fh +EDGE_SPACER; + if ( high>sv->vheight-EDGE_SPACER ) high = sv->vheight-EDGE_SPACER; + + GDrawDrawLine(pixmap,sv->addrend-ADDR_SPACER/2,rect->y,sv->addrend-ADDR_SPACER/2,rect->y+rect->height,0x000000); + + index = (sv->lpos+(low-EDGE_SPACER)/sv->fh); + y = low; + for ( ; y<=high && indexlen/2; ++index ) { + sprintf( caddr, "%d", index ); + uc_strcpy(uaddr,caddr); + x = sv->addrend - ADDR_SPACER - GDrawGetTextWidth(pixmap,uaddr,-1,NULL); + GDrawDrawText(pixmap,x,y+sv->as,uaddr,-1,NULL,0x000000); + + sprintf( cval, "%d", sv->edits[index] ); + uc_strcpy(uval,cval); + GDrawDrawText(pixmap,sv->addrend,y+sv->as,uval,-1,NULL,0x000000); + y += sv->fh; + } +} + +static void short_mousemove(ShortView *sv,int pos) { + /*GGadgetPreparePopup(sv->gw,msg);*/ +} + +static void short_scroll(ShortView *sv,struct sbevent *sb) { + int newpos = sv->lpos; + + switch( sb->type ) { + case et_sb_top: + newpos = 0; + break; + case et_sb_uppage: + newpos -= sv->vheight/sv->fh; + break; + case et_sb_up: + --newpos; + break; + case et_sb_down: + ++newpos; + break; + case et_sb_downpage: + newpos += sv->vheight/sv->fh; + break; + case et_sb_bottom: + newpos = sv->lheight-sv->vheight/sv->fh; + break; + case et_sb_thumb: + case et_sb_thumbrelease: + newpos = sb->pos; + break; + } + if ( newpos>sv->lheight-sv->vheight/sv->fh ) + newpos = sv->lheight-sv->vheight/sv->fh; + if ( newpos<0 ) newpos =0; + if ( newpos!=sv->lpos ) { + int diff = newpos-sv->lpos; + sv->lpos = newpos; + GScrollBarSetPos(sv->vsb,sv->lpos); + if ( sv->active!=-1 ) { + GRect pos; + GGadgetGetSize(sv->tf,&pos); + GGadgetMove(sv->tf,sv->addrend,pos.y+diff*sv->fh); + } + GDrawScroll(sv->v,NULL,0,diff*sv->fh); + } +} + +static void ShortViewFree(ShortView *sv) { + sv->sf->cvt_dlg = NULL; + free(sv->edits); + free(sv); +} + +static int sv_v_e_h(GWindow gw, GEvent *event) { + ShortView *sv = (ShortView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + short_expose(sv,gw,&event->u.expose.rect); + break; + case et_char: + if ( event->u.chr.keysym == GK_Help || event->u.chr.keysym == GK_F1 ) + help("ttfinstrs.html#cvt"); + break; + case et_mousemove: case et_mousedown: case et_mouseup: + GGadgetEndPopup(); + if ( event->type==et_mousemove ) + short_mousemove(sv,event->u.mouse.y); + else if ( event->type == et_mousedown ) { + int l = (event->u.mouse.y-EDGE_SPACER)/sv->fh + sv->lpos; + unichar_t ubuf[20]; char buf[20]; + if ( sfinishup(sv,true) && event->u.mouse.x>sv->addrend && + llen/2 && l!=sv->active ) { + sv->active = l; + GGadgetMove(sv->tf, sv->addrend, + (l-sv->lpos)*sv->fh+EDGE_SPACER+1); + sprintf( buf, "%d", sv->edits[sv->active] ); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(sv->tf,ubuf); + GDrawPostEvent(event); /* And we hope the tf catches it this time */ + } + } + break; + case et_timer: + break; + case et_focus: + break; + } +return( true ); +} + +static int sv_e_h(GWindow gw, GEvent *event) { + ShortView *sv = (ShortView *) GDrawGetUserData(gw); + + switch ( event->type ) { + case et_expose: + GDrawDrawLine(gw,0,sv->vheight,sv->vwidth,sv->vheight,0x000000); + break; + case et_resize: + short_resize(sv,event); + break; + case et_char: + if ( event->u.chr.keysym == GK_Help || event->u.chr.keysym == GK_F1 ) + help("ttfinstrs.html#cvt"); + break; + case et_controlevent: + switch ( event->u.control.subtype ) { + case et_scrollbarchange: + short_scroll(sv,&event->u.control.u.sb); + break; + } + break; + case et_close: + SV_DoClose(sv); + break; + case et_destroy: + ShortViewFree(sv); + break; + } +return( true ); +} + +/* cvt table */ +static void cvtCreateEditor(struct ttf_table *tab,SplineFont *sf,uint32 tag) { + ShortView *sv = gcalloc(1,sizeof(ShortView)); + unichar_t title[60]; + GRect pos, gsize; + GWindow gw; + GWindowAttrs wattrs; + FontRequest rq; + static unichar_t monospace[] = { 'c','o','u','r','i','e','r',',','m', 'o', 'n', 'o', 's', 'p', 'a', 'c', 'e',',','c','a','s','l','o','n',',','u','n','i','f','o','n','t', '\0' }; + int as,ds,ld, lh; + GGadgetData gd; + GTextInfo lab; + GGadget *sb; + static unichar_t num[] = { '0', '\0' }; + int numlen; + static GBox tfbox; + int i; + + sv->table = tab; + sv->sf = sf; + sf->cvt_dlg = sv; + sv->tag = tag; + if ( tab==NULL ) { + sv->edits = galloc(2); + sv->len = 0; + } else { + sv->len = tab->len; + sv->edits = galloc(tab->len+1); + for ( i=0; ilen/2; ++i ) + sv->edits[i] = (tab->data[i<<1]<<8) | tab->data[(i<<1)+1]; + } + + title[0] = (tag>>24)&0xff; + title[1] = (tag>>16)&0xff; + title[2] = (tag>>8 )&0xff; + title[3] = (tag )&0xff; + title[4] = ' '; + uc_strncpy(title+5, sf->fontname, sizeof(title)/sizeof(title[0])-6); + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_icon; + wattrs.event_masks = ~(1<gw = gw = GDrawCreateTopWindow(NULL,&pos,sv_e_h,sv,&wattrs); + + memset(&gd,0,sizeof(gd)); + memset(&lab,0,sizeof(lab)); + gd.pos.x = 5; gd.pos.y = 105; + gd.pos.width = -1; + lab.text = (unichar_t *) _STR_OK; + lab.text_in_resource = true; + gd.label = &lab; + gd.flags = gg_visible|gg_enabled|gg_but_default; + gd.handle_controlevent = SV_OK; + sv->ok = GButtonCreate(gw,&gd,sv); + gd.pos.x = -8; gd.pos.y += 3; + gd.pos.width = -1; + lab.text = (unichar_t *) _STR_Cancel; + lab.text_in_resource = true; + gd.label = &lab; + gd.flags = gg_visible|gg_enabled|gg_but_cancel; + gd.handle_controlevent = SV_Cancel; + sv->cancel = GButtonCreate(gw,&gd,sv); + lab.text = (unichar_t *) _STR_ChangeLength; + gd.pos.width = 90; + gd.flags = gg_visible|gg_enabled; + gd.handle_controlevent = SV_ChangeLength; + sv->setsize = GButtonCreate(gw,&gd,sv); + sv->bh = GDrawPointsToPixels(gw,64); + + gd.pos.y = 0; gd.pos.height = pos.height-sv->bh; + gd.pos.width = GDrawPointsToPixels(gw,_GScrollBar_Width); + gd.pos.x = pos.width-gd.pos.width; + gd.flags = gg_visible|gg_enabled|gg_pos_in_pixels|gg_sb_vert; + gd.handle_controlevent = NULL; + sv->vsb = sb = GScrollBarCreate(gw,&gd,sv); + GGadgetGetSize(sv->vsb,&gsize); + sv->sbw = gsize.width; + + wattrs.mask = wam_events|wam_cursor; + pos.x = 0; pos.y = 0; + pos.width = gd.pos.x; pos.height -= sv->bh; + sv->v = GWidgetCreateSubWindow(gw,&pos,sv_v_e_h,sv,&wattrs); + GDrawSetVisible(sv->v,true); + + memset(&rq,0,sizeof(rq)); + rq.family_name = monospace; + rq.point_size = -12; + rq.weight = 400; + sv->gfont = GDrawInstanciateFont(GDrawGetDisplayOfWindow(gw),&rq); + GDrawSetFont(sv->v,sv->gfont); + GDrawFontMetrics(sv->gfont,&as,&ds,&ld); + sv->as = as+1; + sv->fh = sv->as+ds; + + sv->chrlen = numlen = GDrawGetTextWidth(sv->v,num,1,NULL); + sv->addrend = 6*numlen + ADDR_SPACER + EDGE_SPACER; + + tfbox.main_background = tfbox.main_foreground = COLOR_DEFAULT; + gd.pos.y = -100; gd.pos.height = sv->fh; + gd.pos.x = sv->addrend; + memset(&lab,'\0',sizeof(lab)); + lab.text = num+1; + lab.font = sv->gfont; + gd.label = &lab; + gd.box = &tfbox; + gd.flags = gg_visible|gg_enabled|gg_sb_vert|gg_dontcopybox; + sv->tf = GTextFieldCreate(sv->v,&gd,NULL); + sv->active = -1; + + lh = sv->len/2; + if ( lh>40 ) lh = 40; + if ( lh<4 ) lh = 4; + if ( pos.widthaddrend+6*numlen+EDGE_SPACER+sv->sbw ) + pos.width = sv->addrend+6*numlen+EDGE_SPACER+sv->sbw; + GDrawResize(sv->gw,pos.width,lh*sv->fh+2*EDGE_SPACER); + + GDrawSetVisible(gw,true); +} + +int SFCloseAllInstrs(SplineFont *sf) { + struct instrdata *id, *next; + int changed; + char name[12], *npt; + static int buts[] = { _STR_OK, _STR_Cancel, 0 }; + + for ( id = sf->instr_dlgs; id!=NULL; id=next ) { + next = id->next; + changed = id->changed; + if ( !changed && id->id->inedit ) { + if ( !IVParse(id->id)) + changed = true; + else + changed = id->changed; + } + if ( changed ) { + if ( id->tag==0 ) + npt = id->sc->name; + else { + name[0] = name[5] = '\''; + name[1] = id->tag>>24; name[2] = (id->tag>>16)&0xff; name[3] = (id->tag>>8)&0xff; name[4] = id->tag&0xff; + name[6] = 0; + npt = name; + } + GDrawRaise(id->id->gw); + if ( GWidgetAskR(_STR_InstrChanged,buts,0,1,_STR_AskInstrChanged,npt)==1 ) +return( false ); + } + GDrawDestroyWindow(id->id->gw); + } + if ( sf->cvt_dlg!=NULL ) { + if ( sf->cvt_dlg->changed ) { + name[0] = name[5] = '\''; + name[1] = id->tag>>24; name[2] = (id->tag>>16)&0xff; name[3] = (id->tag>>8)&0xff; name[4] = id->tag&0xff; + name[6] = 0; + npt = name; + GDrawRaise(sf->cvt_dlg->gw); + if ( GWidgetAskR(_STR_InstrChanged,buts,0,1,_STR_AskInstrChanged,npt)==1 ) +return( false ); + } + GDrawDestroyWindow(sf->cvt_dlg->gw); + } + if ( screen_display!=NULL ) { + GDrawSync(NULL); + GDrawProcessPendingEvents(NULL); + } +return( true ); +} + +void SFEditTable(SplineFont *sf, uint32 tag) { + struct instrdata *id; + struct ttf_table *tab; + char name[12]; + unichar_t title[100]; + + tab = SFFindTable(sf,tag); + if ( tag!=CHR('c','v','t',' ') ) { + for ( id = sf->instr_dlgs; id!=NULL && id->tag!=tag; id=id->next ); + if ( id!=NULL ) { + GDrawSetVisible(id->id->gw,true); + GDrawRaise(id->id->gw); +return; + } + + id = gcalloc(1,sizeof(*id)); + id->sf = sf; + id->tag = tag; + id->instr_cnt = id->max = tab==NULL ? 0 : tab->len; + id->instrs = galloc(id->max+1); + if ( tab!=NULL && tab->data!=NULL ) + memcpy(id->instrs,tab->data,id->instr_cnt); + else + id->instrs[0]='\0'; + name[0] = name[5] = '\''; + name[1] = tag>>24; name[2] = (tag>>16)&0xff; name[3] = (tag>>8)&0xff; name[4] = tag&0xff; + name[6] = 0; + u_sprintf(title,GStringGetResource(_STR_TTFInstructionsFor,NULL),name); + InstrDlgCreate(id,title); + } else { + if ( sf->cvt_dlg!=NULL ) { + GDrawSetVisible(sf->cvt_dlg->gw,true); + GDrawRaise(sf->cvt_dlg->gw); +return; + } + cvtCreateEditor(tab,sf,tag); + } +} diff --git a/fontforge/ttfspecial.c b/fontforge/ttfspecial.c new file mode 100644 index 00000000..e4b8423e --- /dev/null +++ b/fontforge/ttfspecial.c @@ -0,0 +1,412 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include + +#include "ttf.h" + +/* This file contains routines to generate non-standard true/opentype tables */ +/* The first is the 'PfEd' table containing PfaEdit specific information */ +/* glyph comments & colours ... perhaps other info later */ + +/* ************************************************************************** */ +/* ************************* The 'PfEd' table ************************* */ +/* ************************* Output ************************* */ +/* ************************************************************************** */ + +/* 'PfEd' table format is as follows... */ +/* uint32 version number 0x00010000 */ +/* uint32 subtable count */ +/* struct { uint32 tab, offset } tag/offset for first subtable */ +/* struct { uint32 tab, offset } tag/offset for second subtable */ +/* ... */ + +/* 'PfEd' 'fcmt' font comment subtable format */ +/* short version number 0 */ +/* short string length */ +/* String in latin1 (ASCII is better) */ + +/* 'PfEd' 'cmnt' glyph comment subtable format */ +/* short version number 0 */ +/* short count-of-ranges */ +/* struct { short start-glyph, end-glyph, short offset } */ +/* ... */ +/* foreach glyph >=start-glyph, <=end-glyph(+1) */ +/* uint32 offset to glyph comment string (in UCS2) */ +/* ... */ +/* And one last offset pointing beyong the end of the last string to enable length calculations */ +/* String table in UCS2 (NUL terminated). All offsets from start*/ +/* of subtable */ + +/* 'PfEd' 'colr' glyph colour subtable */ +/* short version number 0 */ +/* short count-of-ranges */ +/* struct { short start-glyph, end-glyph, uint32 colour (rgb) } */ + +#define MAX_SUBTABLE_TYPES 3 + +struct PfEd_subtabs { + int next; + struct { + FILE *data; + uint32 tag; + uint32 offset; + } subtabs[MAX_SUBTABLE_TYPES]; +}; + +static void PfEd_FontComment(SplineFont *sf, struct PfEd_subtabs *pfed ) { + FILE *fcmt; + char *pt; + + if ( sf->comments==NULL || *sf->comments=='\0' ) +return; + pfed->subtabs[pfed->next].tag = CHR('f','c','m','t'); + pfed->subtabs[pfed->next++].data = fcmt = tmpfile(); + + putshort(fcmt,0); /* sub-table version number */ + putshort(fcmt,strlen(sf->comments)); + for ( pt = sf->comments; *pt; ++pt ) + putshort(fcmt,*pt); + putshort(fcmt,0); + if ( ftell(fcmt)&2 ) putshort(fcmt,0); +} + +static SplineChar *SCFromCID(SplineFont *_sf,int cid) { + int k; + + if ( _sf->subfonts==NULL ) +return( _sf->chars[cid] ); + + for ( k=0; k<_sf->subfontcnt; ++k ) + if ( _sf->subfonts[k]->chars[cid]!=NULL ) +return( _sf->subfonts[k]->chars[cid] ); + +return( NULL ); +} + +static void PfEd_GlyphComments(SplineFont *_sf, struct PfEd_subtabs *pfed ) { + int i, j, k, any, max, cnt, last, skipped, subcnt; + uint32 offset; + SplineFont *sf; + SplineChar *sc, *sc2, *sclast; + FILE *cmnt; + unichar_t *upt; + + max = any = k = 0; + do { + sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k++]; + if ( !any ) { + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 && + sf->chars[i]->comment!=NULL ) { + any = true; + break; + } + } + if ( sf->charcnt>max ) max = sf->charcnt; + } while ( k<_sf->subfontcnt ); + + if ( !any ) +return; + + pfed->subtabs[pfed->next].tag = CHR('c','m','n','t'); + pfed->subtabs[pfed->next++].data = cmnt = tmpfile(); + + putshort(cmnt,0); /* sub-table version number */ + + offset = 0; + for ( j=0; j<4; ++j ) { + cnt = 0; + for ( i=0; icomment!=NULL ) { + last = i; skipped = false; sclast = sc; + subcnt = 1; + for ( k=i+1; kttf_glyph==-1 ) + continue; + if ( sc2->comment==NULL && skipped ) + break; + if ( sc2->comment!=NULL ) { + last = k; + sclast = sc2; + skipped = false; + } else + skipped = true; + ++subcnt; + } + ++cnt; + if ( j==1 ) { + putshort(cmnt,sc->ttf_glyph); + putshort(cmnt,sclast->ttf_glyph); + putlong(cmnt,offset); + offset += sizeof(uint32)*(subcnt+1); + } else if ( j==2 ) { + for ( ; i<=last; ++i ) { + sc = SCFromCID(_sf,i); + if ( sc==NULL || sc->ttf_glyph==-1 ) + continue; + if ( sc->comment==NULL ) + putlong(cmnt,0); + else { + putlong(cmnt,offset); + offset += sizeof(unichar_t)*(u_strlen(sc->comment)+1); + } + } + putlong(cmnt,offset); /* Guard data, to let us calculate the string lengths */ + } else if ( j==3 ) { + for ( ; i<=last; ++i ) { + sc = SCFromCID(_sf,i); + if ( sc==NULL || sc->ttf_glyph==-1 || sc->comment==NULL ) + continue; + for ( upt = sc->comment; *upt; ++upt ) + putshort(cmnt,*upt); + putshort(cmnt,0); + } + } + i = last; + } + } + if ( j==0 ) { + putshort(cmnt,cnt); + offset = 2*sizeof(short) + cnt*(2*sizeof(short)+sizeof(uint32)); + } + } + if ( ftell(cmnt) & 2 ) + putshort(cmnt,0); +} + +static void PfEd_Colours(SplineFont *_sf, struct PfEd_subtabs *pfed ) { + int i, j, k, any, max, cnt, last; + SplineFont *sf; + SplineChar *sc, *sc2, *sclast; + FILE *colr; + + max = any = k = 0; + do { + sf = _sf->subfontcnt==0 ? _sf : _sf->subfonts[k++]; + if ( !any ) { + for ( i=0; icharcnt; ++i ) + if ( sf->chars[i]!=NULL && sf->chars[i]->ttf_glyph!=-1 && + sf->chars[i]->color!=COLOR_DEFAULT ) { + any = true; + break; + } + } + if ( sf->charcnt>max ) max = sf->charcnt; + } while ( k<_sf->subfontcnt ); + + if ( !any ) +return; + + pfed->subtabs[pfed->next].tag = CHR('c','o','l','r'); + pfed->subtabs[pfed->next++].data = colr = tmpfile(); + + putshort(colr,0); /* sub-table version number */ + for ( j=0; j<2; ++j ) { + cnt = 0; + for ( i=0; icolor!=COLOR_DEFAULT ) { + last = i; sclast = sc; + for ( k=i+1; kttf_glyph==-1 ) + continue; + if ( sc2->color != sc->color ) + break; + last = k; + sclast = sc2; + } + ++cnt; + if ( j==1 ) { + putshort(colr,sc->ttf_glyph); + putshort(colr,sclast->ttf_glyph); + putlong(colr,sc->color); + } + i = last; + } + } + if ( j==0 ) + putshort(colr,cnt); + } + if ( ftell(colr) & 2 ) + putshort(colr,0); +} + +void pfed_dump(struct alltabs *at, SplineFont *sf) { + struct PfEd_subtabs pfed; + FILE *file; + int i; + uint32 offset; + + memset(&pfed,0,sizeof(pfed)); + if ( at->gi.flags & ttf_flag_pfed_comments ) { + PfEd_FontComment(sf, &pfed ); + PfEd_GlyphComments(sf, &pfed ); + } + if ( at->gi.flags & ttf_flag_pfed_colors ) + PfEd_Colours(sf, &pfed ); + + if ( pfed.next==0 ) +return; /* No subtables */ + + at->pfed = file = tmpfile(); + putlong(file, 0x00010000); /* Version number */ + putlong(file, pfed.next); /* sub-table count */ + offset = 2*sizeof(uint32) + 2*pfed.next*sizeof(uint32); + for ( i=0; ipfedlen = ftell(file); +} + +/* ************************* The 'PfEd' table ************************* */ +/* ************************* Input ************************* */ + +static void pfed_readfontcomment(FILE *ttf,struct ttfinfo *info,uint32 base) { + int len; + char *pt, *end; + + fseek(ttf,base,SEEK_SET); + if ( getushort(ttf)!=0 ) +return; /* Bad version number */ + len = getushort(ttf); + pt = galloc(len+1); /* data are stored as UCS2, but currently are ASCII */ + info->fontcomments = pt; + end = pt+len; + while ( ptgrange[i].end || grange[i].end>info->glyph_cnt ) { + fprintf( stderr, "Bad glyph range specified in glyph comment subtable of PfEd table\n" ); + grange[i].start = 1; grange[i].end = 0; + } + } + for ( i=0; ichars[j]->comment = ReadUnicodeStr(ttf,base+offset,next-offset); + } + } + free(grange); +} + +static void pfed_readcolours(FILE *ttf,struct ttfinfo *info,uint32 base) { + int n, i, j, start, end; + uint32 col; + + fseek(ttf,base,SEEK_SET); + if ( getushort(ttf)!=0 ) +return; /* Bad version number */ + n = getushort(ttf); + for ( i=0; iend || end>info->glyph_cnt ) + fprintf( stderr, "Bad glyph range specified in colour subtable of PfEd table\n" ); + else { + for ( j=start; j<=end; ++j ) + info->chars[j]->color = col; + } + } +} + +void pfed_read(FILE *ttf,struct ttfinfo *info) { + int n,i; + struct tagoff { uint32 tag, offset; } tagoff[MAX_SUBTABLE_TYPES+30]; + + fseek(ttf,info->pfed_start,SEEK_SET); + + if ( getlong(ttf)!=0x00010000 ) +return; + n = getlong(ttf); + if ( n>=MAX_SUBTABLE_TYPES+30 ) + n = MAX_SUBTABLE_TYPES+30; + for ( i=0; ipfed_start+tagoff[i].offset); + break; + case CHR('c','m','n','t'): + pfed_readglyphcomments(ttf,info,info->pfed_start+tagoff[i].offset); + break; + case CHR('c','o','l','r'): + pfed_readcolours(ttf,info,info->pfed_start+tagoff[i].offset); + break; + default: + fprintf( stderr, "Unknown subtable '%c%c%c%c' in 'PfEd' table, ignored\n", + tagoff[i].tag>>24, (tagoff[i].tag>>16)&0xff, (tagoff[i].tag>>8)&0xff, tagoff[i].tag&0xff ); + break; + } +} diff --git a/fontforge/typofeatures.c b/fontforge/typofeatures.c new file mode 100644 index 00000000..c23f3e95 --- /dev/null +++ b/fontforge/typofeatures.c @@ -0,0 +1,1463 @@ +/* Copyright (C) 2003,2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include +#include + +enum possub_type SFGTagUsed(struct gentagtype *gentags,uint32 tag) { + int i; + + for ( i=0; itt_cur; ++i ) + if ( gentags->tagtype[i].tag==tag ) +return( gentags->tagtype[i].type ); + +return( pst_null ); +} + +uint32 SFGenerateNewFeatureTag(struct gentagtype *gentags,enum possub_type type, + uint32 suggested_tag) { + char buf[8],tbuf[8]; + int i,j,k,l; + + if ( gentags->tt_cur >= gentags->tt_max ) { + if ( gentags->tt_cur==0 ) { + gentags->tagtype = galloc((gentags->tt_max=32)*sizeof(struct tagtype)); + } else { + gentags->tt_max += 32; + gentags->tagtype = grealloc(gentags->tagtype,gentags->tt_max*sizeof(struct tagtype)); + } + } + for ( i=0; itt_cur && gentags->tagtype[i].type!=pst_null; ++i ); + if ( suggested_tag==0 ) { + sprintf(buf, i<1000 ? "G%03d" : "%04d", i ); + gentags->tagtype[i].type = type; + gentags->tagtype[i].tag = CHR(buf[0],buf[1],buf[2],buf[3]); + } else { + j = 0; + tbuf[0] = suggested_tag>>24; + tbuf[1] = (suggested_tag>>16)&0xff; + tbuf[2] = (suggested_tag>>8)&0xff; + tbuf[3] = suggested_tag&0xff; + while ( SFGTagUsed(gentags,suggested_tag)!=pst_null ) { + sprintf(buf,"%d",j++); + k = strlen(buf); + for ( l=0; ltagtype[i].type = type; + gentags->tagtype[i].tag = suggested_tag; + } + if ( i==gentags->tt_cur ) ++gentags->tt_cur; +return( gentags->tagtype[i].tag ); +} + +void SFFreeGenerateFeatureTag(struct gentagtype *gentags,uint32 tag) { + int i; + + for ( i=0; itt_cur; ++i ) + if ( gentags->tagtype[i].tag==tag ) + break; + if ( i==gentags->tt_cur-1 ) + --gentags->tt_cur; + else if ( itt_cur ) { + gentags->tagtype[i].type = pst_null; + gentags->tagtype[i].tag = CHR(' ',' ',' ',' '); + } else + GDrawIError("Attempt to free an invalid generated tag" ); +} + +int SFRemoveThisFeatureTag(SplineFont *sf, uint32 tag, int sli, int flags) { + /* if tag==0xffffffff treat as a wildcard (will match any tag) */ + /* if sli==SLI_UNKNOWN treat as a wildcard */ + /* if flags==-1 treat as a wildcard */ + int i,j,k; + SplineChar *sc; + PST *prev, *pst, *next; + FPST *fprev, *fpst, *fnext; + ASM *sprev, *sm, *snext; + AnchorClass *ac, *aprev, *anext; + KernPair *kp, *kprev, *knext; + KernClass *kc, *cprev, *cnext; + SplineFont *_sf; + int any = false; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + _sf = sf; + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( prev= NULL, pst = sc->possub; pst!=NULL; pst=next ) { + next = pst->next; + if ( ( tag==0xffffffff || tag==pst->tag ) && + ( sli==SLI_UNKNOWN || sli==pst->script_lang_index ) && + ( flags==-1 || flags==pst->flags )) { + if ( prev == NULL ) + sc->possub = next; + else + prev->next = next; + pst->next = NULL; + PSTFree(pst); + any = true; + } else + prev = pst; + } + } + ++k; + } while ( k<_sf->subfontcnt ); + + for ( j=0; j<2; ++j ) { + if ( tag==0xffffffff || + ((tag==CHR('k','e','r','n') && j==0) || + (tag==CHR('v','k','r','n') && j==1))) { + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( kprev=NULL, kp = j==0 ? sc->kerns : sc->vkerns ; kp!=NULL; kp = knext ) { + knext = kp->next; + if ( ( sli==SLI_UNKNOWN || sli==kp->sli ) && + ( flags==-1 || flags==kp->flags )) { + if ( kprev!=NULL ) + kprev->next = knext; + else if ( j==0 ) + sc->kerns = knext; + else + sc->vkerns = knext; + kp->next = NULL; + KernPairsFree(kp); + any = true; + } else + kprev = kp; + } + } + ++k; + } while ( k<_sf->subfontcnt ); + } + for ( cprev=NULL, kc = j==0 ? _sf->kerns : _sf->vkerns ; kc!=NULL; kc = cnext ) { + cnext = kc->next; + if ( ( sli==SLI_UNKNOWN || sli==kc->sli ) && + ( flags==-1 || flags==kc->flags )) { + if ( cprev!=NULL ) + cprev->next = cnext; + else if ( j==0 ) + _sf->kerns = cnext; + else + _sf->vkerns = cnext; + kc->next = NULL; + KernClassListFree(kc); + any = true; + } else + cprev = kc; + } + } + + for ( fprev = NULL, fpst = _sf->possub; fpst!=NULL; fpst=fnext ) { + fnext = fpst->next; + if ( ( tag==0xffffffff || tag==fpst->tag ) && + ( sli==SLI_UNKNOWN || sli==fpst->script_lang_index ) && + ( flags==-1 || flags==fpst->flags )) { + if ( fprev == NULL ) + sf->possub = fnext; + else + fprev->next = fnext; + fpst->next = NULL; + FPSTFree(fpst); + any = true; + } else + fprev = fpst; + } + + for ( aprev=NULL, ac=sf->anchor; ac!=NULL; ac=anext ) { + anext = ac->next; + if ( ( tag==0xffffffff || tag==ac->feature_tag ) && + ( sli==SLI_UNKNOWN || sli==ac->script_lang_index ) && + ( flags==-1 || flags==ac->flags )) { + SFRemoveAnchorClass(sf,ac); + any = true; + } else + aprev = ac; + } + + if ( tag!=0xffffffff || (sli==SLI_UNKNOWN && flags==-1)) { + int macflags; + if ( flags==-1 ) macflags = -1; + else if ( flags&pst_r2l ) macflags |= asm_descending; + else macflags = 0; + for ( sprev = NULL, sm = _sf->sm; sm!=NULL; sm=snext ) { + snext = sm->next; + if ( ( tag==0xffffffff || tag==((sm->feature<<16)|sm->setting) ) && + ( macflags==-1 || macflags==sm->flags )) { + if ( sprev == NULL ) + sf->sm = snext; + else + sprev->next = snext; + sm->next = NULL; + ASMFree(sm); + any = true; + } else + sprev = sm; + } + } + if ( any ) + _sf->changed = true; +return( any ); +} + +void RemoveGeneratedTagsAbove(SplineFont *sf, int old_top) { + int k; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + for ( k=sf->gentags.tt_cur-1; k>=old_top; --k ) + SFRemoveThisFeatureTag(sf, sf->gentags.tagtype[k].tag, SLI_NESTED, -1); + if ( old_topgentags.tt_cur ) + sf->gentags.tt_cur = old_top; +} + +int SFRenameTheseFeatureTags(SplineFont *sf, uint32 tag, int sli, int flags, + uint32 totag, int tosli, int toflags, int ismac) { + /* if tag==0xffffffff treat as a wildcard (will match any tag) */ + /* if sli==SLI_UNKNOWN treat as a wildcard */ + /* if flags==-1 treat as a wildcard */ + int i,k; + SplineChar *sc; + PST *pst; + SplineFont *_sf; + FPST *fpst; + AnchorClass *ac; + ASM *sm; + int any = false; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + _sf = sf; + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) { + if ( ( tag==0xffffffff || tag==pst->tag ) && + ( sli==SLI_UNKNOWN || sli==pst->script_lang_index ) && + ( flags==-1 || flags==pst->flags )) { + if ( totag!=0xffffffff ) { + pst->tag = totag; + pst->macfeature = ismac; + } + if ( tosli!=SLI_UNKNOWN ) + pst->script_lang_index = sli; + if ( toflags!=-1 ) + pst->flags = flags; + any = true; + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + + if ( !ismac ) { + for ( fpst = _sf->possub; fpst!=NULL; fpst=fpst->next ) { + if ( ( tag==0xffffffff || tag==fpst->tag ) && + ( sli==SLI_UNKNOWN || sli==fpst->script_lang_index ) && + ( flags==-1 || flags==fpst->flags )) { + if ( totag!=0xffffffff ) + fpst->tag = totag; + if ( tosli!=SLI_UNKNOWN ) + fpst->script_lang_index = sli; + if ( toflags!=-1 ) + fpst->flags = toflags; + any = true; + } + } + + for ( ac=sf->anchor; ac!=NULL; ac=ac->next ) { + if ( ( tag==0xffffffff || tag==ac->feature_tag ) && + ( sli==SLI_UNKNOWN || sli==ac->script_lang_index ) && + ( flags==-1 || flags==ac->flags )) { + if ( totag!=0xffffffff ) + ac->feature_tag = totag; + if ( tosli!=SLI_UNKNOWN ) + ac->script_lang_index = sli; + if ( toflags!=-1 ) + ac->flags = toflags; + any = true; + } + } + } + + if ( ismac && ( tag!=0xffffffff || (sli==SLI_UNKNOWN && flags==-1))) { + int macflags; + if ( flags==-1 ) macflags = -1; + else if ( flags&pst_r2l ) macflags |= asm_descending; + else macflags = 0; + for ( sm = _sf->sm; sm!=NULL; sm=sm->next ) { + if ( ( tag==0xffffffff || tag==((sm->feature<<16)|sm->setting) ) && + ( macflags==-1 || macflags==sm->flags )) { + if ( totag!=0xffffffff ) { + sm->feature = totag>>16; + sm->setting = totag&0xffff; + } + if ( toflags!=-1 ) { + if ( toflags&pst_r2l ) + sm->flags = asm_descending; + else + sm->flags = 0; + } + any = true; + } + } + } + if ( any ) + _sf->changed = true; +return( any ); +} + +struct copycontext { + uint32 *nested_map; + int *from_merge; + int *to_merge; + int mcur; +}; + +static int SFConvertSLI(SplineFont *fromsf,int sli,SplineFont *tosf) { + int i,j,k; + struct script_record *from_sr, *to_sr; + + if ( sli==SLI_NESTED ) +return( SLI_NESTED ); + from_sr = fromsf->script_lang[sli]; + if ( tosf->script_lang!=NULL ) { + for ( i=0; tosf->script_lang[i]!=NULL; ++i ) { + struct script_record *to_sr = tosf->script_lang[i]; + for ( j=0; to_sr[j].script!=0 && from_sr[j].script!=0 ; ++j ) { + if ( to_sr[j].script!=from_sr[j].script ) + break; + for ( k=0; to_sr[j].langs[k]!=0 && from_sr[j].langs[k]!=0; ++k ) { + if ( to_sr[j].langs[k]!=from_sr[j].langs[k] ) + break; + } + if ( to_sr[j].langs[k]!=0 || from_sr[j].langs[k]!=0 ) + break; + } + if ( to_sr[j].script==0 && from_sr[j].script==0 ) +return( i ); + } + } + if ( tosf->script_lang==NULL ) { + tosf->script_lang = gcalloc(2,sizeof(struct script_record *)); + i = 0; + } else { + tosf->script_lang = grealloc(tosf->script_lang,(i+2)*sizeof(struct script_record *)); + tosf->script_lang[i+1] = NULL; + } + for ( j=0; from_sr[j].script!=0 ; ++j ); + tosf->script_lang[i] = to_sr = gcalloc(j+1,sizeof(struct script_record)); + for ( j=0; from_sr[j].script!=0 ; ++j ) { + to_sr[j].script = from_sr[j].script; + for ( k=0; from_sr[j].langs[k]!=0; ++k ); + to_sr[j].langs = galloc((k+1)*sizeof(uint32)); + for ( k=0; from_sr[j].langs[k]!=0; ++k ) + to_sr[j].langs[k] = from_sr[j].langs[k]; + to_sr[j].langs[k] = 0; + } +return( i ); +} + +static uint32 ConvertNestedTag(SplineFont *tosf, SplineFont *fromsf,uint32 *nested_map, uint32 tag) { + int i; + + for ( i=0; igentags.tt_cur; ++i ) { + if ( fromsf->gentags.tagtype[i].type!=pst_null && fromsf->gentags.tagtype[i].tag==tag ) + break; + } + if ( i==fromsf->gentags.tt_cur ) /* Can't happen */ +return( tag ); + + if ( nested_map[i]!=0 ) +return( nested_map[i]); + + nested_map[i] = SFGenerateNewFeatureTag(&tosf->gentags, + fromsf->gentags.tagtype[i].type, + isdigit(tag&0xff)? 0 : tag ); + /* If the name ends in a digit, it is probably one of our generated tags */ + /* in which case we should rename it to match the sequence of generated */ + /* tags in the new font. If it doesn't end in a digit it is a user */ + /* supplied name and we should just pass it on */ +return( nested_map[i] ); +} + +static char **ClassCopy(int class_cnt,char **classes) { + char **newclasses; + int i; + + if ( classes==NULL || class_cnt==0 ) +return( NULL ); + newclasses = galloc(class_cnt*sizeof(char *)); + for ( i=0; iunicodeenc,sc->name); + PST *newpst; + + if ( to_index==-1 ) +return( false ); + tosc = SCDuplicate(SFMakeChar(tosf,to_index)); + if ( tosc==NULL ) +return( false ); + + newpst = chunkalloc(sizeof(PST)); + *newpst = *pst; + if ( pst->script_lang_index == SLI_NESTED ) + newpst->tag = ConvertNestedTag(tosf, fromsf,cc->nested_map, pst->tag); + newpst->script_lang_index = SFConvertSLI(fromsf,pst->script_lang_index,tosf); + newpst->next = tosc->possub; + tosc->possub = newpst; + tosf->changed = true; + + switch( newpst->type ) { + case pst_pair: + newpst->u.pair.paired = copy(pst->u.pair.paired); + newpst->u.pair.vr = chunkalloc(sizeof(struct vr [2])); + memcpy(newpst->u.pair.vr,pst->u.pair.vr,sizeof(struct vr [2])); + break; + case pst_ligature: + newpst->u.lig.lig = tosc; + /* Fall through */ + case pst_substitution: + case pst_alternate: + case pst_multiple: + newpst->u.subs.variant = copy(pst->u.subs.variant); + break; + } +return( true ); +} + +static void SF_SCAddAP(SplineFont *tosf,SplineChar *sc,AnchorPoint *ap, + SplineFont *fromsf, AnchorClass *newac) { + SplineChar *tosc; + int to_index = SFFindChar(tosf,sc->unicodeenc,sc->name); + AnchorPoint *newap; + + if ( to_index==-1 ) +return; + tosc = SCDuplicate(SFMakeChar(tosf,to_index)); + if ( tosc==NULL ) +return; + + newap = chunkalloc(sizeof(AnchorPoint)); + *newap = *ap; + newap->anchor = newac; + newap->next = tosc->anchor; + tosc->anchor = newap; +} + +static int SF_SCAddKP(SplineFont *tosf,SplineChar *sc,KernPair *kp, + SplineFont *fromsf, int isvkern) { + SplineChar *tosc, *tosecond; + int to_index = SFFindChar(tosf,sc->unicodeenc,sc->name); + int second_index = SFFindChar(tosf,kp->sc->unicodeenc,kp->sc->name); + KernPair *newkp; + + if ( to_index==-1 || second_index==-1 ) +return(false); + tosc = SCDuplicate(SFMakeChar(tosf,to_index)); + tosecond = SCDuplicate(SFMakeChar(tosf,second_index)); + if ( tosc==NULL || tosecond==NULL ) +return(false); + + newkp = chunkalloc(sizeof(AnchorPoint)); + *newkp = *kp; + newkp->sc = tosecond; + newkp->sli = SFConvertSLI(fromsf,kp->sli,tosf); + if ( isvkern ) { + newkp->next = tosc->vkerns; + tosc->vkerns = newkp; + } else { + newkp->next = tosc->kerns; + tosc->kerns = newkp; + } +return(true); +} + +static void SF_AddAnchor(SplineFont *tosf,AnchorClass *ac, struct copycontext *cc, + SplineFont *fromsf) { + AnchorClass *newac; + int i, k; + SplineFont *sf; + SplineChar *sc; + AnchorPoint *ap; + + for ( i=0; imcur && cc->from_merge[i]!=ac->merge_with; ++i ); + if ( i==cc->mcur ) { + AnchorClass *ac2; + int max = 0; + for ( ac2=tosf->anchor; ac2!=NULL; ac2=ac2->next ) + if ( maxmerge_with ) + max = ac2->merge_with; + cc->from_merge[i] = ac->merge_with; + cc->to_merge[i] = max+1; + ++cc->mcur; + } + + newac = chunkalloc(sizeof(AnchorClass)); + *newac = *ac; + if ( ac->script_lang_index == SLI_NESTED ) + newac->feature_tag = ConvertNestedTag(tosf, fromsf,cc->nested_map, ac->feature_tag); + newac->name = u_copy(ac->name); + newac->script_lang_index = SFConvertSLI(fromsf,ac->script_lang_index,tosf); + tosf->changed = true; + newac->next = tosf->anchor; + tosf->anchor = newac; + newac->merge_with = cc->to_merge[i]; + + k = 0; + do { + sf = fromsf->subfonts==NULL ? fromsf : fromsf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( ap = sc->anchor; ap!=NULL; ap=ap->next ) { + if ( ap->anchor==ac ) { + SF_SCAddAP(tosf,sc,ap, fromsf,newac); + } + } + } + ++k; + } while ( ksubfontcnt ); +} + +static void SF_AddKernClass(SplineFont *tosf,KernClass *kc, struct copycontext *cc, + SplineFont *fromsf, int isvkern) { + KernClass *newkc; + + newkc = chunkalloc(sizeof(KernClass)); + *newkc = *kc; + /* can't be nested */ + newkc->sli = SFConvertSLI(fromsf,kc->sli,tosf); + tosf->changed = true; + if ( isvkern ) { + newkc->next = tosf->vkerns; + tosf->vkerns = newkc; + } else { + newkc->next = tosf->kerns; + tosf->kerns = newkc; + } + + newkc->firsts = ClassCopy(newkc->first_cnt,newkc->firsts); + newkc->seconds = ClassCopy(newkc->second_cnt,newkc->seconds); + newkc->offsets = galloc(newkc->first_cnt*newkc->first_cnt*sizeof(int16)); + memcpy(newkc->offsets,kc->offsets,newkc->first_cnt*newkc->first_cnt*sizeof(int16)); +} + +static void SF_AddFPST(SplineFont *tosf,FPST *fpst, struct copycontext *cc, SplineFont *fromsf) { + FPST *newfpst; + int i, j, k, cur; + uint32 *fromtags, *totags; + + newfpst = chunkalloc(sizeof(FPST)); + *newfpst = *fpst; + if ( fpst->script_lang_index == SLI_NESTED ) + newfpst->tag = ConvertNestedTag(tosf, fromsf,cc->nested_map, fpst->tag); + newfpst->script_lang_index = SFConvertSLI(fromsf,fpst->script_lang_index,tosf); + tosf->changed = true; + newfpst->next = tosf->possub; + tosf->possub = newfpst; + + newfpst->nclass = ClassCopy(newfpst->nccnt,newfpst->nclass); + newfpst->bclass = ClassCopy(newfpst->bccnt,newfpst->bclass); + newfpst->fclass = ClassCopy(newfpst->fccnt,newfpst->fclass); + + newfpst->rules = galloc(newfpst->rule_cnt*sizeof(struct fpst_rule)); + memcpy(newfpst->rules,fpst->rules,newfpst->rule_cnt*sizeof(struct fpst_rule)); + + fromtags = galloc(fromsf->gentags.tt_cur*sizeof(uint32)); + totags = galloc(fromsf->gentags.tt_cur*sizeof(uint32)); + cur = 0; + for ( i=0; irule_cnt; ++i ) { + struct fpst_rule *r = &newfpst->rules[i], *oldr = &fpst->rules[i]; + + r->lookups = galloc(r->lookup_cnt*sizeof(struct seqlookup)); + memcpy(r->lookups,oldr->lookups,r->lookup_cnt*sizeof(struct seqlookup)); + for ( k=0; klookup_cnt; ++k ) { + for ( j=0 ; jlookups[k].lookup_tag ) + break; + if ( j==cur ) { + fromtags[cur] = r->lookups[k].lookup_tag; + totags[cur++] = ConvertNestedTag(tosf, fromsf,cc->nested_map, r->lookups[k].lookup_tag); + } + r->lookups[k].lookup_tag = totags[j]; + } + + switch ( newfpst->format ) { + case pst_glyphs: + r->u.glyph.names = copy( r->u.glyph.names ); + r->u.glyph.back = copy( r->u.glyph.back ); + r->u.glyph.fore = copy( r->u.glyph.fore ); + break; + case pst_class: + r->u.class.nclasses = galloc( r->u.class.ncnt*sizeof(uint16)); + memcpy(r->u.class.nclasses,oldr->u.class.nclasses, r->u.class.ncnt*sizeof(uint16)); + r->u.class.bclasses = galloc( r->u.class.bcnt*sizeof(uint16)); + memcpy(r->u.class.bclasses,oldr->u.class.bclasses, r->u.class.ncnt*sizeof(uint16)); + r->u.class.fclasses = galloc( r->u.class.fcnt*sizeof(uint16)); + memcpy(r->u.class.fclasses,oldr->u.class.fclasses, r->u.class.fcnt*sizeof(uint16)); + break; + case pst_coverage: + r->u.coverage.ncovers = ClassCopy( r->u.coverage.ncnt, r->u.coverage.ncovers ); + r->u.coverage.bcovers = ClassCopy( r->u.coverage.bcnt, r->u.coverage.bcovers ); + r->u.coverage.fcovers = ClassCopy( r->u.coverage.fcnt, r->u.coverage.fcovers ); + break; + case pst_reversecoverage: + r->u.rcoverage.ncovers = ClassCopy( r->u.rcoverage.always1, r->u.rcoverage.ncovers ); + r->u.rcoverage.bcovers = ClassCopy( r->u.rcoverage.bcnt, r->u.rcoverage.bcovers ); + r->u.rcoverage.fcovers = ClassCopy( r->u.rcoverage.fcnt, r->u.rcoverage.fcovers ); + r->u.rcoverage.replacements = copy( r->u.rcoverage.replacements ); + break; + } + } + for ( j=0; jnext = tosf->sm; + tosf->sm = newsm; + tosf->changed = true; + newsm->classes = ClassCopy(newsm->class_cnt, newsm->classes); + newsm->state = galloc(newsm->class_cnt*newsm->state_cnt*sizeof(struct asm_state)); + memcpy(newsm->state,sm->state, + newsm->class_cnt*newsm->state_cnt*sizeof(struct asm_state)); + if ( newsm->type == asm_insert ) { + for ( i=0; iclass_cnt*newsm->state_cnt; ++i ) { + struct asm_state *this = &newsm->state[i]; + this->u.insert.mark_ins = copy(this->u.insert.mark_ins); + this->u.insert.cur_ins = copy(this->u.insert.cur_ins); + } + } else if ( newsm->type == asm_context ) { + fromtags = gcalloc(newsm->class_cnt*newsm->state_cnt,sizeof(uint32)); + totags = gcalloc(newsm->class_cnt*newsm->state_cnt,sizeof(uint32)); + cur = 0; + for ( i=0; iclass_cnt*newsm->state_cnt; ++i ) { + for ( k=0; k<2; ++k ) { + uint32 *tagpt = &(&newsm->state[i].u.context.mark_tag)[k]; + if ( *tagpt==0 ) + continue; + for ( j=0 ; jnested_map, *tagpt); + } + *tagpt = totags[j]; + } + } + for ( j=0; jsubfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( pst = sc->possub; pst!=NULL; pst=pst->next ) { + if ( ( tag==0xffffffff || tag==pst->tag ) && + ( sli==SLI_UNKNOWN || sli==pst->script_lang_index ) && + ( flags==-1 || flags==pst->flags )) { + if ( SF_SCAddPST(tosf,sc,pst, cc,_sf)) + any = true; + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + + for ( ac=sf->anchor; ac!=NULL; ac=ac->next ) { + if ( ( tag==0xffffffff || tag==ac->feature_tag ) && + ( sli==SLI_UNKNOWN || sli==ac->script_lang_index ) && + ( flags==-1 || flags==ac->flags )) { + SF_AddAnchor(tosf,ac,cc,_sf); + any = true; + } + } + + for ( j=0; j<2; ++j ) { + if ( tag==0xffffffff || + ((tag==CHR('k','e','r','n') && j==0) || + (tag==CHR('v','k','r','n') && j==1))) { + k = 0; + do { + sf = _sf->subfonts==NULL ? _sf : _sf->subfonts[k]; + for ( i=0; icharcnt; ++i ) if ( (sc=sf->chars[i])!=NULL ) { + for ( kp = j==0 ? sc->kerns : sc->vkerns ; kp!=NULL; kp = kp->next ) { + if ( ( sli==SLI_UNKNOWN || sli==kp->sli ) && + ( flags==-1 || flags==kp->flags )) { + if ( SF_SCAddKP(tosf,sc,kp,_sf,j) ) + any = true; + } + } + } + ++k; + } while ( k<_sf->subfontcnt ); + } + for ( kc = j==0 ? _sf->kerns : _sf->vkerns ; kc!=NULL; kc = kc->next ) { + if ( ( sli==SLI_UNKNOWN || sli==kc->sli ) && + ( flags==-1 || flags==kc->flags )) { + SF_AddKernClass(tosf,kc,cc,_sf,j); + any = true; + } + } + } + + for ( fpst = _sf->possub; fpst!=NULL; fpst=fpst->next ) { + if ( ( tag==0xffffffff || tag==fpst->tag ) && + ( sli==SLI_UNKNOWN || sli==fpst->script_lang_index ) && + ( flags==-1 || flags==fpst->flags )) { + SF_AddFPST(tosf,fpst, cc,_sf); + any = true; + } + } + + if ( tag!=0xffffffff || (sli==SLI_UNKNOWN && flags==-1) ) { + int macflags; + if ( flags==-1 ) macflags = -1; + else if ( flags&pst_r2l ) macflags |= asm_descending; + else macflags = 0; + for ( sm = _sf->sm; sm!=NULL; sm=sm->next ) { + if ( ( tag==0xffffffff || tag==((sm->feature<<16)|sm->setting) ) && + ( macflags==-1 || macflags==sm->flags )) { + SF_AddASM(tosf,sm, cc,_sf); + any = true; + } + } + } +return( any ); +} + +int SFCopyTheseFeaturesToSF(SplineFont *sf, uint32 tag, int sli, int flags, + SplineFont *tosf) { + /* if tag==0xffffffff treat as a wildcard (will match any tag) */ + /* if sli==SLI_UNKNOWN treat as a wildcard */ + /* if flags==-1 treat as a wildcard */ + struct copycontext cc; + int any; + int i; + AnchorClass *ac; + + if ( sf->cidmaster!=NULL ) sf = sf->cidmaster; + if ( tosf->cidmaster!=NULL ) tosf = tosf->cidmaster; + for ( ac=sf->anchor, i=0; ac!=NULL; ++i, ac=ac->next ); + cc.nested_map = gcalloc(sf->gentags.tt_cur,sizeof(uint32)); + cc.from_merge = galloc(i*sizeof(int)); + cc.to_merge = galloc(i*sizeof(int)); + cc.mcur = i; + any = _SFCopyTheseFeaturesToSF(sf,tag,sli,flags,tosf,&cc); + free(cc.nested_map); free(cc.from_merge); free(cc.to_merge); + if ( any ) + tosf->changed = true; +return( any ); +} + +int SFRemoveUnusedNestedFeatures(SplineFont *sf) { + uint8 *used; + int i,j,k; + FPST *fpst; + ASM *sm; + int any = false; + + if ( sf->cidmaster ) sf = sf->cidmaster; + used = gcalloc(sf->gentags.tt_cur,sizeof(uint8)); + + for ( fpst=sf->possub; fpst!=NULL; fpst=fpst->next ) { + for ( i=0; irule_cnt; ++i ) { + struct fpst_rule *r = &fpst->rules[i]; + for ( j=0; jlookup_cnt; ++j ) { + for ( k=0; kgentags.tt_cur; ++k ) { + if ( r->lookups[j].lookup_tag == sf->gentags.tagtype[k].tag ) { + used[k] = true; + break; + } + } + } + } + } + for ( sm = sf->sm; sm!=NULL; sm=sm->next ) if ( sm->type == asm_context ) { + for ( i=0; istate_cnt*sm->class_cnt; ++i ) { + for ( j=0; j<2; ++j ) { + uint32 tag = (&sm->state[i].u.context.mark_tag)[j]; + for ( k=0; kgentags.tt_cur; ++k ) { + if ( sf->gentags.tagtype[k].tag == tag ) { + used[k] = true; + break; + } + } + } + } + } + + for ( i=0; igentags.tt_cur; ++i ) if ( !used[i] && sf->gentags.tagtype[i].type!=pst_null ) { + if ( SFRemoveThisFeatureTag(sf,sf->gentags.tagtype[i].tag,SLI_NESTED,-1)) + any = true; + sf->gentags.tagtype[i].type = pst_null; + } + free(used); + if ( any ) + sf->changed = true; +return( any ); +} + +static int typematch(int tagtype, int searchtype) { +return( tagtype==searchtype || + (searchtype==fpst_max && + (tagtype==pst_position || + tagtype==pst_pair || + tagtype==pst_kerning || + tagtype==pst_vkerning || + tagtype==pst_anchors || + tagtype==pst_contextpos || + tagtype==pst_chainpos )) || + (searchtype==fpst_max+1 && + (tagtype==pst_substitution || + tagtype==pst_alternate || + tagtype==pst_multiple || + tagtype==pst_ligature || + tagtype==pst_contextsub || + tagtype==pst_chainsub || + tagtype==pst_reversesub )) ); +} + +GTextInfo **SFGenTagListFromType(struct gentagtype *gentags,enum possub_type type) { + int len, i; + GTextInfo **ti; + char buf[8]; + + if ( type>=pst_lcaret && typett_cur; ++i ) + if ( typematch(gentags->tagtype[i].type,type)) + ++len; + } + + ti = galloc((len+1)*sizeof(GTextInfo *)); + ti[len] = gcalloc(1,sizeof(GTextInfo)); + buf[4] = 0; + if ( type=fpst_max ) { + len = 0; + for ( i=0; itt_cur; ++i ) + if ( typematch(gentags->tagtype[i].type,type) ) { + sprintf( buf, "%c%c%c%c", + gentags->tagtype[i].tag>>24, + (gentags->tagtype[i].tag>>16)&0xff, + (gentags->tagtype[i].tag>>8)&0xff, + gentags->tagtype[i].tag&0xff ); + ti[len] = gcalloc(1,sizeof(GTextInfo)); + ti[len]->userdata = (void *) gentags->tagtype[i].tag; + ti[len]->text = uc_copy(buf); + ti[len]->fg = ti[len]->bg = COLOR_DEFAULT; + ++len; + } + } +return( ti ); +} + +int SFHasNestedLookupWithTag(SplineFont *sf,uint32 tag,int ispos) { + FPST *fpst; + AnchorClass *ac; + int i,type,start,end; + PST *pst; + + for ( fpst=sf->possub; fpst!=NULL; fpst = fpst->next ) { + if ((( ispos && (fpst->type==pst_contextpos || fpst->type==pst_chainpos)) || + (!ispos && (fpst->type==pst_contextsub || fpst->type==pst_chainsub || fpst->type==pst_reversesub ))) && + fpst->script_lang_index==SLI_NESTED && fpst->tag==tag ) +return( true ); + } + + if ( ispos ) { + for ( ac=sf->anchor; ac!=NULL; ac=ac->next ) + if ( ac->feature_tag==tag && ac->script_lang_index==SLI_NESTED ) +return( true ); + } + + if ( ispos ) { + start = pst_position; + end = pst_pair; + } else { + start = pst_substitution; + end = pst_ligature; + } + for ( type=start; type<=end; ++type ) { + for ( i=0; icharcnt; i++ ) if ( sf->chars[i]!=NULL ) { + for ( pst = sf->chars[i]->possub; pst!=NULL; pst=pst->next ) { + if ( pst->type==type && + pst->script_lang_index == SLI_NESTED && + pst->tag == tag ) +return( true ); + } + } + } +return( false ); +} + +/* ************************************************************************** */ +/* ************************ Feature selection dialogs *********************** */ +/* ************************************************************************** */ + +enum selectfeaturedlg_type { sfd_remove, sfd_retag, sfd_copyto }; + +struct sf_dlg { + GWindow gw; + GGadget *active_tf; /* For menu routines */ + SplineFont *sf; + GMenuItem *tagmenu; + enum selectfeaturedlg_type which; + int done, ok; +}; + +struct select_res { + uint32 tag; + int ismac, sli, flags; +}; + +#define CID_Tag 100 +#define CID_SLI 101 +#define CID_AnyFlags 102 +#define CID_TheseFlags 103 +#define CID_R2L 104 +#define CID_IgnBase 105 +#define CID_IgnLig 106 +#define CID_IgnMark 107 +#define CID_TagMenu 108 +#define CID_FontList 109 + +static void SFD_OpenTypeTag(GWindow gw, GMenuItem *mi, GEvent *e) { + struct sf_dlg *d = GDrawGetUserData(gw); + unichar_t ubuf[6]; + uint32 tag = (uint32) (intpt) (mi->ti.userdata); + + ubuf[0] = tag>>24; + ubuf[1] = (tag>>16)&0xff; + ubuf[2] = (tag>>8)&0xff; + ubuf[3] = tag&0xff; + ubuf[4] = 0; + GGadgetSetTitle(d->active_tf,ubuf); +} + +static void SFD_MacTag(GWindow gw, GMenuItem *mi, GEvent *e) { + struct sf_dlg *d = GDrawGetUserData(gw); + unichar_t ubuf[20]; char buf[20]; + uint32 tag = (uint32) (intpt) (mi->ti.userdata); + + sprintf(buf,"<%d,%d>", tag>>16, tag&0xff); + uc_strcpy(ubuf,buf); + GGadgetSetTitle(d->active_tf,ubuf); +} + +static void GMenuItemListFree(GMenuItem *mi) { + int i; + + if ( mi==NULL ) +return; + + for ( i=0; mi[i].ti.text || mi[i].ti.line || mi[i].ti.image ; ++i ) { + if ( !mi[i].ti.text_in_resource ) + free( mi[i].ti.text ); + GMenuItemListFree(mi[i].sub); + } + free(mi); +} + +static GMenuItem *TIListToMI(GTextInfo *ti,void (*moveto)(struct gwindow *base,struct gmenuitem *mi,GEvent *)) { + int i; + GMenuItem *mi; + + for ( i=0; ti[i].text!=NULL || ti[i].line ; ++i ); + + mi = gcalloc((i+1), sizeof(GMenuItem)); + for ( i=0; ti[i].text!=NULL || ti[i].line ; ++i ) { + mi[i].ti = ti[i]; + if ( !mi[i].ti.text_in_resource ) + mi[i].ti.text = u_copy(mi[i].ti.text); + mi[i].ti.bg = mi[i].ti.fg = COLOR_DEFAULT; + mi[i].moveto = moveto; + } + memset(&mi[i],0,sizeof(GMenuItem)); +return( mi ); +} + +static GMenuItem *TagMenu(SplineFont *sf) { + GMenuItem *top; + extern GTextInfo *pst_tags[]; + static const int names[] = { _STR_SimpSubstitution, _STR_AltSubstitutions, _STR_MultSubstitution, + _STR_Ligatures, _STR_ContextSub, _STR_ChainSub, _STR_ReverseChainSub, + _STR_SimpPos, _STR_PairPos, _STR_ContextPos, _STR_ChainPos, + -1, + _STR_MacFeatures, 0 }; + static const int indeces[] = { pst_substitution, pst_alternate, pst_multiple, pst_ligature, + pst_contextsub, pst_chainsub, pst_reversesub, + pst_position, pst_pair, pst_contextpos, pst_chainpos, + -1 }; + int i; + GTextInfo *mac; + + for ( i=0; names[i]!=0; ++i ); + top = gcalloc((i+1),sizeof(GMenuItem)); + for ( i=0; names[i]!=-1; ++i ) { + top[i].ti.text = (unichar_t *) names[i]; + top[i].ti.text_in_resource = true; + top[i].ti.fg = top[i].ti.bg = COLOR_DEFAULT; + top[i].sub = TIListToMI(pst_tags[indeces[i]-1],SFD_OpenTypeTag); + } + + top[i].ti.fg = top[i].ti.bg = COLOR_DEFAULT; + top[i++].ti.line = true; + + top[i].ti.text = (unichar_t *) names[i]; + top[i].ti.text_in_resource = true; + top[i].ti.fg = top[i].ti.bg = COLOR_DEFAULT; + mac = AddMacFeatures(NULL,pst_max,sf); + top[i].sub = TIListToMI(mac,SFD_MacTag); + GTextInfoListFree(mac); +return( top ); +} + +static int SFD_TagMenu(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonpress ) { + struct sf_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_TagMenu; + GEvent dummy; + GRect pos; + d->active_tf = GWidgetGetControl(d->gw,CID_Tag+off); + if ( d->tagmenu==NULL ) + d->tagmenu = TagMenu(d->sf); + + GGadgetGetSize(g,&pos); + memset(&dummy,0,sizeof(GEvent)); + dummy.type = et_mousedown; + dummy.w = d->gw; + dummy.u.mouse.x = pos.x; + dummy.u.mouse.y = pos.y; + GMenuCreatePopupMenu(d->gw, &dummy, d->tagmenu); + } +return( true ); +} + +static int SFD_RadioChanged(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_radiochanged ) { + struct sf_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + int off = GGadgetGetCid(g)-CID_AnyFlags; + int enable; + if ( off&1 ) --off; + enable = GGadgetGetCid(g)-off == CID_TheseFlags; + + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_R2L+off),enable); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_IgnBase+off),enable); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_IgnLig+off),enable); + GGadgetSetEnabled(GWidgetGetControl(d->gw,CID_IgnMark+off),enable); + } +return( true ); +} + +static int SFD_ParseSelect(struct sf_dlg *d,int off,struct select_res *res) { + const unichar_t *ret; + unichar_t *end; + int f,s; + int i; + int32 len; + GTextInfo **ti; + + res->tag = 0xffffffff; + res->ismac = 0; + res->sli = SLI_UNKNOWN; + res->flags = -1; + + ret = _GGadgetGetTitle(GWidgetGetControl(d->gw,CID_Tag+off)); + if ( *ret=='\0' ) + res->tag = 0xffffffff; + else if ( *ret=='<' && (f=u_strtol(ret+1,&end,10), *end==',') && + (s=u_strtol(end+1,&end,10), *end=='>')) { + res->tag = (f<<16)|s; + res->ismac = true; + } else if ( *ret=='\'' && u_strlen(ret)==6 && ret[5]=='\'' ) { + res->tag = (ret[1]<<24) | (ret[2]<<16) | (ret[3]<<8) | ret[4]; + } else if ( u_strlen(ret)==4 ) { + res->tag = (ret[0]<<24) | (ret[1]<<16) | (ret[2]<<8) | ret[3]; + } else { + GWidgetErrorR(_STR_BadTag,_STR_TagMustBe4); +return( false ); + } + + ti = GGadgetGetList(GWidgetGetControl(d->gw,CID_SLI+off),&len); + for ( i=0; iselected ) { + res->sli = (intpt) ti[i]->userdata; + break; + } + } + + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,CID_TheseFlags+off)) ) { + res->flags = 0; + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,off+CID_R2L)) ) res->flags |= pst_r2l; + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,off+CID_IgnBase)) ) res->flags |= pst_ignorebaseglyphs; + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,off+CID_IgnLig)) ) res->flags |= pst_ignoreligatures; + if ( GGadgetIsChecked(GWidgetGetControl(d->gw,off+CID_IgnMark)) ) res->flags |= pst_ignorecombiningmarks; + } +return( true ); +} + +static int AddSelect(GGadgetCreateData *gcd, GTextInfo *label, int k, int y, + int off, SplineFont *sf ) { + int j; + + label[k].text = (unichar_t *) _STR_TagC; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = y+4; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+14; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_Tag+off; + gcd[k++].creator = GTextFieldCreate; + + label[k].image = &GIcon_menumark; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 115; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y-1; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.cid = CID_TagMenu+off; + gcd[k].gd.handle_controlevent = SFD_TagMenu; + gcd[k++].creator = GButtonCreate; + + label[k].text = (unichar_t *) _STR_ScriptAndLangC; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+26; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k++].creator = GLabelCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+14; + gcd[k].gd.pos.width = 140; + gcd[k].gd.flags = gg_enabled|gg_visible; + gcd[k].gd.u.list = SFLangList(sf,0xa,NULL); + for ( j=0; gcd[k].gd.u.list[j].text!=NULL; ++j ) + gcd[k].gd.u.list[j].selected = ((intpt) gcd[k].gd.u.list[j].userdata==SLI_UNKNOWN ); + gcd[k].gd.cid = CID_SLI+off; + gcd[k++].creator = GListButtonCreate; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+28; + gcd[k].gd.flags = gg_visible | gg_enabled | gg_cb_on; + label[k].text = (unichar_t *) _STR_AnyFlags; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_AnyFlags+off; + gcd[k].gd.handle_controlevent = SFD_RadioChanged; + gcd[k++].creator = GRadioCreate; + + gcd[k].gd.pos.x = 5; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+15; + gcd[k].gd.flags = gg_visible | gg_enabled ; + label[k].text = (unichar_t *) _STR_TheseFlags; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_TheseFlags+off; + gcd[k].gd.handle_controlevent = SFD_RadioChanged; + gcd[k++].creator = GRadioCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+15; + gcd[k].gd.flags = gg_visible; + label[k].text = (unichar_t *) _STR_RightToLeft; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_R2L+off; + gcd[k++].creator = GCheckBoxCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+15; + gcd[k].gd.flags = gg_visible; + label[k].text = (unichar_t *) _STR_IgnoreBaseGlyphs; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_IgnBase+off; + gcd[k++].creator = GCheckBoxCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+15; + gcd[k].gd.flags = gg_visible; + label[k].text = (unichar_t *) _STR_IgnoreLigatures; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_IgnLig+off; + gcd[k++].creator = GCheckBoxCreate; + + gcd[k].gd.pos.x = 10; gcd[k].gd.pos.y = gcd[k-1].gd.pos.y+15; + gcd[k].gd.flags = gg_visible; + label[k].text = (unichar_t *) _STR_IgnoreCombiningMarks; + label[k].text_in_resource = true; + gcd[k].gd.label = &label[k]; + gcd[k].gd.cid = CID_IgnMark+off; + gcd[k++].creator = GCheckBoxCreate; + +return( k ); +} + +static GTextInfo *SFD_FontList(SplineFont *notme) { + FontView *fv; + int i; + GTextInfo *ti; + + for ( i=0, fv=fv_list; fv!=NULL; fv=fv->next ) if ( fv->sf!=notme ) + ++i; + ti = gcalloc(i+1,sizeof(GTextInfo)); + for ( i=0, fv=fv_list; fv!=NULL; fv=fv->next ) if ( fv->sf!=notme ) { + ti[i].text = uc_copy(fv->sf->fontname); + ti[i].fg = ti[i].bg = COLOR_DEFAULT; + ti[i].userdata = fv->sf; + ++i; + } +return( ti ); +} + +static int SFD_FontSelected(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_listdoubleclick ) { + struct sf_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = d->ok = true; + } +return( true ); +} + +static int SFD_Ok(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct sf_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = d->ok = true; + } +return( true ); +} + +static int SFD_Cancel(GGadget *g, GEvent *e) { + if ( e->type==et_controlevent && e->u.control.subtype == et_buttonactivate ) { + struct sf_dlg *d = GDrawGetUserData(GGadgetGetWindow(g)); + d->done = true; + } +return( true ); +} + +static int sfd_e_h(GWindow gw, GEvent *event) { + struct sf_dlg *d = GDrawGetUserData(gw); + + switch ( event->type ) { + case et_close: + d->done = true; + break; + case et_char: + if ( event->u.chr.keysym == GK_F1 || event->u.chr.keysym == GK_Help ) { + help("typofeat.html"); +return( true ); + } +return( false ); + } +return( true ); +} + +static int SelectFeatureDlg(SplineFont *sf,enum selectfeaturedlg_type type) { + struct sf_dlg d; + static const int titles[] = { _STR_RemoveFeature, _STR_RetagFeature, _STR_CopyFeatureToFont }; + GRect pos; + GWindow gw; + GWindowAttrs wattrs; + GGadgetCreateData gcd[30]; + GTextInfo label[30]; + int i, k, y; + struct select_res res1, res2; + int ret; + + memset(&d,0,sizeof(d)); + d.sf = sf; + d.which = type; + + memset(&wattrs,0,sizeof(wattrs)); + wattrs.mask = wam_events|wam_cursor|wam_wtitle|wam_undercursor|wam_isdlg|wam_restrict; + wattrs.event_masks = ~(1<userdata)); + } + } + GDrawDestroyWindow(gw); + GMenuItemListFree(d.tagmenu); +return( ret ); +} + +void SFRemoveFeatureDlg(SplineFont *sf) { + if ( !SelectFeatureDlg(sf,sfd_remove)) + GWidgetErrorR(_STR_NoFeaturesRemoved,_STR_NoFeaturesRemoved); +} + +void SFCopyFeatureToFontDlg(SplineFont *sf) { + if ( !SelectFeatureDlg(sf,sfd_copyto)) + GWidgetErrorR(_STR_NoFeaturesCopied,_STR_NoFeaturesCopied); +} + +void SFRetagFeatureDlg(SplineFont *sf) { + if ( !SelectFeatureDlg(sf,sfd_retag)) + GWidgetErrorR(_STR_NoFeaturesRetagged,_STR_NoFeaturesRetagged); +} diff --git a/fontforge/uiutil.c b/fontforge/uiutil.c new file mode 100644 index 00000000..57a829dc --- /dev/null +++ b/fontforge/uiutil.c @@ -0,0 +1,397 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include +#include + +extern char *helpdir; + +#if __CygWin +#include +extern void cygwin_conv_to_full_posix_path(const char *win,char *unx); +extern void cygwin_conv_to_full_win32_path(const char *unx,char *win); +#endif + +void Protest(char *label) { + char buffer[80]; + unichar_t ubuf[80]; + sprintf( buffer, "Bad Number in %s", label ); + uc_strcpy(ubuf,buffer); + GWidgetPostNotice(ubuf,ubuf); +} + +real GetReal(GWindow gw,int cid,char *name,int *err) { + const unichar_t *txt; unichar_t *end; + double val; + + txt = _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + val = u_strtod(txt,&end); + if ( *end!='\0' ) { + GTextFieldSelect(GWidgetGetControl(gw,cid),0,-1); + Protest(name); + *err = true; + } +return( val ); +} + +int GetInt(GWindow gw,int cid,char *name,int *err) { + const unichar_t *txt; unichar_t *end; + int val; + + txt = _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + val = u_strtol(txt,&end,10); + if ( *end!='\0' ) { + GTextFieldSelect(GWidgetGetControl(gw,cid),0,-1); + Protest(name); + *err = true; + } +return( val ); +} + +void ProtestR(int labelr) { + unichar_t ubuf[80]; + u_strcpy(ubuf,GStringGetResource(_STR_Badnumberin,NULL)); + u_strcat(ubuf,GStringGetResource(labelr,NULL)); + if ( ubuf[u_strlen(ubuf)-1]==' ' ) + ubuf[u_strlen(ubuf)-1]='\0'; + if ( ubuf[u_strlen(ubuf)-1]==':' ) + ubuf[u_strlen(ubuf)-1]='\0'; + GWidgetPostNotice(ubuf,ubuf); +} + +real GetCalmRealR(GWindow gw,int cid,int namer,int *err) { + const unichar_t *txt; unichar_t *end; + real val; + + txt = _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + val = u_strtod(txt,&end); + if ( *txt=='-' && end==txt && txt[1]=='\0' ) +return( 0 ); + if ( *end!='\0' ) { + GTextFieldSelect(GWidgetGetControl(gw,cid),0,-1); + ProtestR(namer); + *err = true; + } +return( val ); +} + +real GetRealR(GWindow gw,int cid,int namer,int *err) { + const unichar_t *txt; unichar_t *end; + real val; + + txt = _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + val = u_strtod(txt,&end); + if ( *end!='\0' ) { + GTextFieldSelect(GWidgetGetControl(gw,cid),0,-1); + ProtestR(namer); + *err = true; + } +return( val ); +} + +int GetIntR(GWindow gw,int cid,int namer,int *err) { + const unichar_t *txt; unichar_t *end; + int val; + + txt = _GGadgetGetTitle(GWidgetGetControl(gw,cid)); + val = u_strtol(txt,&end,10); + if ( *end!='\0' ) { + GTextFieldSelect(GWidgetGetControl(gw,cid),0,-1); + ProtestR(namer); + *err = true; + } +return( val ); +} + +#if __CygWin +/* Try to find the default browser by looking it up in the windows registry */ +/* The registry is organized as a tree. We are interested in the subtree */ +/* starting at HKEY_CLASSES_ROOT. This contains two different kinds of things*/ +/* Extensions and Programs. First we look up the extension and it refers us */ +/* to a program. So we look up the program, and look up shell->open->command */ +/* in it. The value of command is a path followed by potential arguments */ +/* viz: c:\program files\foobar "%1" */ + +/* Extensions seem to contain the ".", so ".html" not "html" */ + +#include +#include +#include + +static char *win_program_from_extension(char *exten) { + DWORD type, dlen, err; + char programindicator[1000]; + char programpath[1000]; + HKEY hkey_prog, hkey_shell, hkey_open, hkey_exten, hkey_command; + char *pt; + + if ( RegOpenKeyEx(HKEY_CLASSES_ROOT,exten,0,KEY_READ,&hkey_exten)!=ERROR_SUCCESS ) { + /*fprintf( stderr, "Failed to find extension \"%s\", did it have a period?\n", exten );*/ +return( NULL ); + } + dlen = sizeof(programindicator); + if ( (err=RegQueryValueEx(hkey_exten,"",NULL,&type,(uint8 *)programindicator,&dlen))!=ERROR_SUCCESS ) { + fprintf( stderr, "Failed to default value of exten \"%s\".\n Error=%ld", exten, err ); + RegCloseKey(hkey_exten); +return( NULL ); + } + RegCloseKey(hkey_exten); + + if ( RegOpenKeyEx(HKEY_CLASSES_ROOT,programindicator,0,KEY_READ,&hkey_prog)!=ERROR_SUCCESS ) { + fprintf( stderr, "Failed to find program \"%s\"\n", programindicator ); +return( NULL ); + } + if ( RegOpenKeyEx(hkey_prog,"shell",0,KEY_READ,&hkey_shell)!=ERROR_SUCCESS ) { + fprintf( stderr, "Failed to find \"%s->shell\"\n", programindicator ); + RegCloseKey(hkey_prog); +return( NULL ); + } + if ( RegOpenKeyEx(hkey_shell,"open",0,KEY_READ,&hkey_open)!=ERROR_SUCCESS ) { + fprintf( stderr, "Failed to find \"%s->shell->open\"\n", programindicator ); + RegCloseKey(hkey_prog); RegCloseKey(hkey_shell); +return( NULL ); + } + if ( RegOpenKeyEx(hkey_open,"command",0,KEY_READ,&hkey_command)!=ERROR_SUCCESS ) { + fprintf( stderr, "Failed to find \"%s->shell->open\"\n", programindicator ); + RegCloseKey(hkey_prog); RegCloseKey(hkey_shell); RegCloseKey(hkey_command); +return( NULL ); + } + + dlen = sizeof(programpath); + if ( RegQueryValueEx(hkey_command,"",NULL,&type,(uint8 *)programpath,&dlen)!=ERROR_SUCCESS ) { + fprintf( stderr, "Failed to find default for \"%s->shell->open->command\"\n", programindicator ); + RegCloseKey(hkey_prog); RegCloseKey(hkey_shell); RegCloseKey(hkey_open); RegCloseKey(hkey_command); +return( NULL ); + } + + RegCloseKey(hkey_prog); RegCloseKey(hkey_shell); RegCloseKey(hkey_open); RegCloseKey(hkey_command); + + pt = strstr(programpath,"%1"); + if ( pt!=NULL ) + pt[1] = 's'; +return( copy(programpath)); +} + +static void do_windows_browser(char *fullspec) { + char *format, *start, *pt, ch, *temp, *cmd; + + format = win_program_from_extension(".html"); + if ( format==NULL ) + format = win_program_from_extension(".htm"); + if ( format==NULL ) { + GDrawError("Could not find a browser. Set the BROWSER environment variable to point to one" ); +return; + } + + if ( format[0]=='"' || format[0]=='\'' ) { + start = format+1; + pt = strchr(start,format[0]); + } else { + start = format; + pt = strchr(start,' '); + } + if ( pt==NULL ) pt = start+strlen(start); + ch = *pt; *pt='\0'; + + temp = galloc(strlen(start)+300+ (ch==0?0:strlen(pt+1))); + cygwin_conv_to_full_posix_path(start,temp+1); + temp[0]='"'; strcat(temp,"\" "); + if ( ch!='\0' ) + strcat(temp,pt+1); + cmd = galloc(strlen(temp)+strlen(fullspec)+8); + sprintf( cmd, temp, fullspec ); + strcat(cmd," &" ); + system(cmd); + free( cmd ); free( temp ); free( format ); +} +#endif + +static char browser[1025]; + +static void findbrowser(void) { +#if __CygWin + static char *stdbrowsers[] = { "netscape.exe", "opera.exe", "galeon.exe", "kfmclient.exe", + "mozilla.exe", "mosaic.exe", /*"grail",*/ + "iexplore.exe", + /*"lynx.exe",*/ +#else + static char *stdbrowsers[] = { "mozilla", "opera", "galeon", "kfmclient", + "netscape", "mosaic", /*"grail",*/ "lynx", +#endif + NULL }; + int i; + char *path; + + if ( getenv("BROWSER")!=NULL ) { + strcpy(browser,getenv("BROWSER")); +#if __CygWin /* Get rid of any dos style names */ + if ( isalpha(browser[0]) && browser[1]==':' && browser[2]=='\\' ) + cygwin_conv_to_full_posix_path(getenv("BROWSER"),browser); + else if ( strchr(browser,'/')==NULL ) { + if ( strstrmatch(browser,".exe")==NULL ) + strcat(browser,".exe"); + if ( (path=_GFile_find_program_dir(browser))!=NULL ) { + snprintf(browser,sizeof(browser),"%s/%s", path, getenv("BROWSER")); + free(path); + } + } +#endif + if ( strcmp(browser,"kde")==0 || strcmp(browser,"kfm")==0 || + strcmp(browser,"konqueror")==0 || strcmp(browser,"kfmclient")==0 ) + strcpy(browser,"kfmclient openURL"); +return; + } + for ( i=0; stdbrowsers[i]!=NULL; ++i ) { + if ( (path=_GFile_find_program_dir(stdbrowsers[i]))!=NULL ) { + if ( strcmp(stdbrowsers[i],"kfmclient")==0 ) + strcpy(browser,"kfmclient openURL"); + else +#if __CygWin + snprintf(browser,sizeof(browser),"%s/%s", path, stdbrowsers[i]); +#else + strcpy(browser,stdbrowsers[i]); +#endif + free(path); +return; + } + } +#if __Mac + strcpy(browser,"open"); /* thanks to riggle */ +#endif +} + +void help(char *file) { + char fullspec[1024], *temp, *pt; + + if ( browser[0]=='\0' ) + findbrowser(); +#ifndef __CygWin + if ( browser[0]=='\0' ) { + GDrawError("Could not find a browser. Set the BROWSER environment variable to point to one" ); +return; + } +#endif + + if ( strstr(file,"http://")==NULL ) { + fullspec[0] = 0; + if ( *file!='/' ) { + if ( helpdir==NULL || *helpdir=='\0' ) { +#ifdef DOCDIR + strcpy(fullspec,DOCDIR "/"); +#elif defined(SHAREDIR) + strcpy(fullspec,SHAREDIR "/../doc/fontforge/"); +#else + strcpy(fullspec,"/usr/local/share/doc/fontforge/"); +#endif + } else + strcpy(fullspec,helpdir); + } + strcat(fullspec,file); + if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; + if ( !GFileReadable( fullspec )) { + if ( *file!='/' ) { + strcpy(fullspec,"/usr/share/doc/fontforge/"); + strcat(fullspec,file); + if (( pt = strrchr(fullspec,'#') )!=NULL ) *pt ='\0'; + } + } + if ( !GFileReadable( fullspec )) { + strcpy(fullspec,"http://fontforge.sf.net/"); + strcat(fullspec,file); + } else if ( pt!=NULL ) + *pt = '#'; + } else + strcpy(fullspec,file); +#if __CygWin + if ( (strstrmatch(browser,"/cygdrive")!=NULL || browser[0]=='\0') && + strstr(fullspec,":/")==NULL ) { + /* It looks as though the browser is a windows application, so we */ + /* should give it a windows file name */ + char *pt, *tpt; + temp = galloc(1024); + cygwin_conv_to_full_win32_path(fullspec,temp); + for ( pt = fullspec, tpt = temp; *tpt && ptno, 1=>auto, 2=>always */ + int showmdx, showmdy; /* minimum distances x,y */ + int showhmetrics, showvmetrics; /* show advance width, baseline, etc. */ + int markextrema; + int showblues, showfamilyblues; + int showanchor; +} CVShows; + +extern struct bvshows { + int showfore, showoutline, showgrid; + int lastpixelsize; +} BVShows; + +typedef struct drect { + real x, y; + real width, height; +} DRect; + +typedef struct pressedOn { + int x,y; /* screen location of the press */ + real cx, cy; /* Translated into character space */ + SplinePoint *sp; + unsigned int nextcp: 1; /* Is the cursor on the "next" control point of */ + unsigned int prevcp: 1; /* the spline point, or the "prev" control point */ + unsigned int anysel: 1; /* did we hit anything? */ +/* unsigned int width: 1; /* we're moving the width rather than a spline */ +/* unsigned int vwidth: 1; /* we're moving the width rather than a spline */ + unsigned int pressed: 1; + unsigned int rubberbanding: 1; + unsigned int rubberlining: 1; + unsigned int transany: 1; + unsigned int transanyrefs: 1; + Spline *spline; + real t; /* location on the spline where we pressed */ + RefChar *ref; + SplinePointList *spl; /* containing spline or point */ + ImageList *img; + AnchorPoint *ap; + float ex, ey; /* end of last rubber band rectangle */ + BasePoint constrain; /* Point to which we constrain movement */ + BasePoint cp; /* Original control point position */ +} PressedOn; + +/* Note: These are ordered as they are displayed in the tools palette */ +enum cvtools { cvt_pointer, cvt_magnify, + cvt_freehand, cvt_hand, + cvt_curve, cvt_corner, cvt_tangent, cvt_pen, + cvt_knife, cvt_ruler, + cvt_scale, cvt_flip, + cvt_rotate, cvt_skew, + cvt_rect, cvt_poly, + cvt_elipse, cvt_star, + cvt_minify, cvt_max=cvt_minify, + cvt_none = -1}; +enum bvtools { bvt_pointer, bvt_magnify, + bvt_pencil, bvt_line, + bvt_shift, bvt_hand, + bvt_minify, bvt_eyedropper, bvt_max=bvt_eyedropper, + bvt_setwidth, + bvt_rect, bvt_filledrect, + bvt_elipse, bvt_filledelipse, + bvt_max2 = bvt_filledelipse, + bvt_none = -1, + bvt_fliph=0, bvt_flipv, bvt_rotate90cw, bvt_rotate90ccw, bvt_rotate180, bvt_skew, bvt_transmove }; +enum drawmode { dm_grid, dm_back, dm_fore, dm_max }; + +typedef struct bvtfunc { + enum bvtools func; + int x,y; /* used by skew and move */ +} BVTFunc; + +struct freetype_raster { + int16 rows, cols; + int16 as, lb; + int16 bytes_per_row; + int16 num_greys; + uint8 *bitmap; +}; + +enum byte_types { bt_instr, bt_cnt, bt_byte, bt_wordhi, bt_wordlo, bt_impliedreturn }; +struct instrdata { + uint8 *instrs; + int instr_cnt, max; + uint8 *bts; + unsigned int changed: 1; + unsigned int in_composit: 1; + SplineFont *sf; + SplineChar *sc; + uint32 tag; + struct instrdlg *id; + struct instrdata *next; +}; + +struct instrinfo { + GWindow v; + GGadget *vsb; + int16 sbw; + int16 vheight, vwidth; + int16 lheight,lpos; + int16 lstopped; + int16 as, fh; + struct instrdata *instrdata; + GFont *gfont; + int isel_pos; + unsigned int showaddr: 1; + unsigned int showhex: 1; + unsigned int mousedown: 1; + void *userdata; + void (*selection_callback)(struct instrinfo *,int ip); + int (*bpcheck)(struct instrinfo *,int ip); + int (*handle_char)(struct instrinfo *,GEvent *e); +}; + +typedef struct debugview { + struct debugger_context *dc; /* Local to freetype.c */ + GWindow dv, v; + struct instrdata id; + struct instrinfo ii; + int dwidth, toph; + struct charview *cv; + double scale; + /* Windows for twilight points, cvt, registers, stack, storage */ + GWindow points, points_v, cvt, regs, stack, storage; + int pts_head, cvt_offtop; + GGadget *cvtsb; +} DebugView; + +enum dv_coderange { cr_none=0, cr_fpgm, cr_prep, cr_glyph }; /* cleverly chosen to match ttobjs.h */ + +typedef struct charview { + SplineChar *sc; + unsigned int showback:1; + unsigned int showfore:1; + unsigned int showgrids:1; + unsigned int showhhints:1; + unsigned int showvhints:1; + unsigned int showdhints:1; + unsigned int showpoints:1; + unsigned int showfilled:1; + unsigned int showrulers:1; + unsigned int showrounds:2; /* 0=>no, 1=>auto, 2=>always */ + unsigned int showmdx:1; + unsigned int showmdy:1; + unsigned int showhmetrics:1; + unsigned int showvmetrics:1; + unsigned int showblues:1; /* 16 */ + unsigned int showfamilyblues:1; + unsigned int showanchor:1; + unsigned int showpointnumbers:1; + unsigned int markextrema:1; + unsigned int needsrasterize:1; /* Rasterization (of fill or fontview) needed on mouse up */ + unsigned int recentchange:1; /* a change happened in the grids or background. don't need to rasterize */ + unsigned int drawmode:2; + unsigned int info_within: 1; /* cursor is within main window */ + unsigned int back_img_out_of_date: 1; /* Force redraw of back image pixmap */ + unsigned int cntrldown:1; + unsigned int joinvalid:1; + unsigned int widthsel:1; + unsigned int vwidthsel:1; + unsigned int inactive:1; /* When in a search view */ + unsigned int show_ft_results: 1; /* 32 */ + unsigned int coderange: 2; /* For the debugger */ + Layer *layerheads[dm_max]; + real scale; + GWindow gw, v; + int width, height; + int xoff, yoff; + int mbh, infoh, rulerh; + GGadget *vsb, *hsb, *mb; + GFont *small, *normal; + int16 sas, sfh, nas, nfh; + BasePoint info; + SplinePoint *info_sp; + GPoint e; /* mouse location */ + GPoint olde; + BasePoint last_c; + BDFChar *filled; + GImage gi; + struct charview *next; + struct fontview *fv; + GWindow icon; + PressedOn p; + SplinePoint *lastselpt; + /*GWindow tools, layers;*/ + int8 b1_tool, cb1_tool, b2_tool, cb2_tool; /* Button 3 does a popup */ + int8 s1_tool, s2_tool, er_tool; /* Bindings for wacom stylus and eraser */ + int8 showing_tool, pressed_tool, pressed_display, had_control, active_tool; + SplinePointList *active_spl; + SplinePoint *active_sp; + IPoint handscroll_base; + GWindow ruler_w; + uint16 rfh, ras; + GFont *rfont; + BasePoint lastknife; + struct freehand { + struct tracedata *head, *last; /* for the freehand tool */ + SplinePointList *current_trace; + int ignore_wobble; /* Ignore wiggles smaller than this */ + int skip_cnt; + } freehand; + GTimer *pressed; + GWindow backimgs; + enum expandedge { ee_none, ee_nw, ee_up, ee_ne, ee_right, ee_se, ee_down, + ee_sw, ee_left, ee_max } expandedge; + BasePoint expandorigin; + real expandwidth, expandheight; + SplinePointList *active_shape; + SplinePoint joinpos; + SplineChar *template1, *template2; +#if HANYANG + struct jamodisplay *jamodisplay; +#endif + real oldwidth, oldvwidth; +#if _ModKeysAutoRepeat + GTimer *autorpt; + int keysym, oldstate; + int oldkeyx, oldkeyy; + GWindow oldkeyw; +#endif + struct searchview *searcher; /* The sv within which this view is embedded (if it is) */ + GIC *gic; + PST *lcarets; + int16 nearcaret; + /* freetype results display */ + int16 ft_dpi, ft_ppem, ft_gridfitwidth; + real ft_pointsize; + SplineSet *gridfit; + struct freetype_raster *raster; + DebugView *dv; + uint32 mmvisible; +} CharView; + +typedef struct bitmapview { + BDFChar *bc; + BDFFont *bdf; + struct fontview *fv; + GWindow gw, v; + int xoff, yoff; + GGadget *vsb, *hsb, *mb; + int width, height; + int infoh, mbh; + int scale; + real scscale; + struct bitmapview *next; + unsigned int showfore:1; + unsigned int showoutline:1; + unsigned int showgrid:1; + unsigned int cntrldown:1; + unsigned int recentchange:1; + unsigned int clearing:1; + unsigned int shades_hidden:1; + unsigned int shades_down:1; + /*GWindow tools, layers;*/ + GGadget *recalc; + int8 b1_tool, cb1_tool, b2_tool, cb2_tool; /* Button 3 does a popup */ + int8 s1_tool, s2_tool, er_tool; /* Bindings for wacom stylus and eraser */ + int8 showing_tool, pressed_tool, pressed_display, had_control, active_tool; + int pressed_x, pressed_y; + int info_x, info_y; + int event_x, event_y; + GFont *small; + int16 sas, sfh; +#if _ModKeysAutoRepeat + GTimer *autorpt; + int keysym, oldstate; +#endif + int color; /* for greyscale fonts */ +} BitmapView; + +struct aplist { AnchorPoint *ap; int connected_to, selected; struct aplist *next; }; + +typedef struct metricsview { + struct fontview *fv; + int pixelsize; + BDFFont *bdf; /* We can also see metric info on a bitmap font */ + GWindow gw; + int16 width, height, dwidth; + int16 mbh,sbh; + int16 topend; /* y value of the end of the region containing the text field */ + int16 displayend; /* y value of the end of the region showing filled characters */ + GFont *font; + int16 fh, as; + GGadget *hsb, *vsb, *mb, *text, *sli_list; + GGadget *namelab, *widthlab, *lbearinglab, *rbearinglab, *kernlab; + struct metricchar { + SplineChar *sc; + BDFChar *show; + int16 dx, dwidth; /* position and width of the displayed char */ + int16 dy, dheight; /* displayed info for vertical metrics */ + int16 mx, mwidth; /* position and width of the text underneath */ + int16 kernafter; + int16 xoff, yoff, hoff, voff; /* adjustments by GPOS other than 'kern' (scaled) */ + PST *active_pos; /* Only support one simple positioning GPOS feature at a time */ + unsigned int selected: 1; + GGadget *width, *lbearing, *rbearing, *kern, *name; + struct aplist *aps; + SplineChar *basesc; /* If we've done a substitution, this lets us go back */ + } *perchar; + SplineChar **sstr; /* An array the same size as perchar (well 1 bigger, trailing null) */ + int16 mwidth, mbase; + int16 charcnt, max; + int16 pressed_x, pressed_y; + int16 activeoff; + int xoff, coff, yoff; + struct metricsview *next; + unsigned int right_to_left: 1; + unsigned int pressed: 1; + unsigned int pressedwidth: 1; + unsigned int pressedkern: 1; + unsigned int showgrid: 1; + unsigned int antialias: 1; + unsigned int vertical: 1; + struct aplist *pressed_apl; + int xp, yp, ap_owner; + BasePoint ap_start; + int cursor; + int scale_index; + int cur_sli; +} MetricsView; + +enum fv_metrics { fvm_baseline=1, fvm_origin=2, fvm_advanceat=4, fvm_advanceto=8 }; +typedef struct fontview { + SplineFont *sf; + BDFFont *show, *filled; + GWindow gw, v; + int width, height; /* of v */ + int16 infoh,mbh; + int colcnt, rowcnt; + int rowoff, rowltot; + int cbw,cbh; /* width/height of a character box */ + GFont *header, *iheader; + GGadget *vsb, *mb; + struct fontview *next; /* Next on list of open fontviews */ + struct fontview *nextsame; /* Next fv looking at this font */ + int pressed_pos, end_pos; + GTimer *pressed; + uint8 *selected; + MetricsView *metrics; + unsigned int antialias:1; + unsigned int bbsized:1; /* displayed bitmap should be scaled by bounding box rather than emsize */ + unsigned int wasonlybitmaps:1; + unsigned int refstate: 3; /* 0x1 => paste orig of all non exist refs, 0x2=>don't, 0x3 => don't warn about non-exist refs with no source font */ + unsigned int touched: 1; + unsigned int showhmetrics: 4; + unsigned int showvmetrics: 4; + unsigned int drag_and_drop: 1; + unsigned int has_dd_no_cursor: 1; + unsigned int any_dd_events_sent: 1; + int16 magnify; + SplineFont *cidmaster; + int32 *mapping; /* an array mapping grid cells (0=upper left) to font indeces (enc, 0=NUL) */ + /* So the default array would contain NUL, ^A, ^B, ... */ + int mapcnt; /* Number of chars in the current group (mapping) */ + struct dictionary *fontvars; /* Scripting */ + struct searchview *sv; + GIC *gic; + GTimer *resize; + struct gfi_data *fontinfo; + SplineChar *sc_near_top; + int sel_index; +} FontView; + +typedef struct findsel { + GEvent *e; + real fudge; /* One pixel fudge factor */ + real xl,xh, yl, yh; /* One pixel fudge factor */ + unsigned int select_controls: 1; /* notice control points */ + unsigned int seek_controls: 1; /* notice control points before base points */ + real scale; + PressedOn *p; +} FindSel; + +enum widthtype { wt_width, wt_lbearing, wt_rbearing, wt_vwidth }; + +typedef struct searchview { + FontView dummy_fv; + SplineFont dummy_sf; + SplineChar sc_srch, sc_rpl; + SplineChar *chars[2]; + uint8 sel[2]; + CharView cv_srch, cv_rpl; + CharView *lastcv; +/* ****** */ + GWindow gw; + int mbh; + GGadget *mb; + GFont *plain, *bold; + int fh, as; + int rpl_x, cv_y; + int cv_width, cv_height; + short button_height, button_width; +/* ****** */ + FontView *fv; + SplineChar *curchar; + SplineSet *path, *revpath, *replacepath, *revreplace; + int pointcnt, rpointcnt; + real fudge; + real fudge_percent; /* a value of .05 here represents 5% (we don't store the integer) */ + unsigned int tryreverse: 1; + unsigned int tryflips: 1; + unsigned int tryrotate: 1; + unsigned int tryscale: 1; + unsigned int onlyselected: 1; + unsigned int subpatternsearch: 1; + unsigned int doreplace: 1; + unsigned int replaceall: 1; + unsigned int findall: 1; + unsigned int searchback: 1; + unsigned int wrap: 1; + unsigned int wasreversed: 1; + unsigned int isvisible: 1; + unsigned int findenabled: 1; + unsigned int rplallenabled: 1; + unsigned int rplenabled: 1; + unsigned int showsfindnext: 1; + SplineSet *matched_spl; + SplinePoint *matched_sp, *last_sp; + real matched_rot, matched_scale; + real matched_x, matched_y; + double matched_co, matched_si; /* Precomputed sin, cos */ + enum flipset { flip_none = 0, flip_x, flip_y, flip_xy } matched_flip; +#ifdef _HAS_LONGLONG + unsigned long long matched_refs; /* Bit map of which refs in the char were matched */ + unsigned long long matched_ss; /* Bit map of which splines in the char were matched */ + /* In multi-path mode */ +#else + unsigned long matched_refs; + unsigned long matched_ss; +#endif +} SearchView; + +enum fvtrans_flags { fvt_dobackground=1, fvt_round_to_int=2, + fvt_dontsetwidth=4, fvt_dontmovewidth=8 }; + +extern void FVSetTitle(FontView *fv); +extern FontView *_FontViewCreate(SplineFont *sf); +extern FontView *FontViewCreate(SplineFont *sf); +extern void FVScrollToChar(FontView *fv,int i); +extern void SplineFontSetUnChanged(SplineFont *sf); +extern FontView *ViewPostscriptFont(char *filename); +extern FontView *FontNew(void); +extern void FontViewFree(FontView *fv); +extern void FVToggleCharChanged(SplineChar *sc); +extern void FVRefreshChar(FontView *fv,BDFFont *bdf,int enc); +extern void FVRegenChar(FontView *fv,SplineChar *sc); +extern int _FVMenuSave(FontView *fv); +extern int _FVMenuSaveAs(FontView *fv); +extern int _FVMenuGenerate(FontView *fv,int family); +extern void _FVCloseWindows(FontView *fv); +extern void SCClearBackground(SplineChar *sc); +extern char *GetPostscriptFontName(char *defdir,int mult); +extern void MenuPrefs(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuSaveAll(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuExit(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuOpen(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuHelp(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuIndex(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuAbout(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuLicense(GWindow base,struct gmenuitem *mi,GEvent *e); +extern void MenuNew(GWindow gw,struct gmenuitem *mi,GEvent *e); +extern void MergeKernInfo(SplineFont *sf); +extern int32 *ParseBitmapSizes(GGadget *g,int msg,int *err); +#ifdef FONTFORGE_CONFIG_WRITE_PFM +extern int WritePfmFile(char *filename,SplineFont *sf, int type0); +#endif +extern int GenerateScript(SplineFont *sf,char *filename,char *bitmaptype, + int fmflags,int res, char *subfontdirectory,struct sflist *sfs); +extern int SFGenerateFont(SplineFont *sf,int family); +extern GTextInfo *AnchorClassesList(SplineFont *sf); +extern GTextInfo **AnchorClassesLList(SplineFont *sf); +extern GTextInfo **AnchorClassesSimpleLList(SplineFont *sf); +extern GTextInfo *AddMacFeatures(GTextInfo *opentype,enum possub_type type,SplineFont *sf); +extern unichar_t *ClassName(const unichar_t *name,uint32 feature_tag, + uint16 flags, int script_lang_index, int merge_with, int act_type, + int macfeature); +extern unichar_t *DecomposeClassName(const unichar_t *clsnm, unichar_t **name, + uint32 *feature_tag, int *macfeature, + uint16 *flags, uint16 *script_lang_index,int *merge_with,int *act_type); +extern unichar_t *AskNameTag(int title,unichar_t *def,uint32 def_tag,uint16 flags, + int script_lang_index, enum possub_type type, SplineFont *sf, SplineChar *default_script, + int merge_with,int act_type); +extern PST *AddSubs(PST *last,uint32 tag,char *name,uint16 flags, + uint16 sli,SplineChar *sc); +extern int SLICount(SplineFont *sf); +extern unichar_t *ShowScripts(unichar_t *usedef); +extern GTextInfo *SFLangList(SplineFont *sf,int addfinal,SplineChar *default_script); +extern GTextInfo **SFLangArray(SplineFont *sf,int addfinal); +extern int ScriptLangList(SplineFont *sf,GGadget *list,int sli); +extern void GListDelSelected(GGadget *list); +extern void GListMoveSelected(GGadget *list,int offset); +extern void GListChangeLine(GGadget *list,int pos, const unichar_t *line); +extern GTextInfo *GListAppendLine(GGadget *list,const unichar_t *line,int select); +extern void FontInfo(SplineFont *sf,int aspect,int sync); +extern void FontInfoDestroy(FontView *fv); +extern void FontMenuFontInfo(void *fv); +extern void GFI_FinishContextNew(struct gfi_data *d,FPST *fpst, unichar_t *newname, + int success); +extern void GFI_CCDEnd(struct gfi_data *d); +extern void DumpPfaEditEncodings(void); +extern void ParseEncodingFile(char *filename); +extern void LoadEncodingFile(void); +extern struct enc *MakeEncoding(SplineFont *sf); +extern void RemoveEncoding(void); +extern void SFPrivateInfo(SplineFont *sf); +extern void OrderTable(SplineFont *sf,uint32 table_tag); +extern void FontViewReformatAll(SplineFont *sf); +extern void FontViewReformatOne(FontView *fv); +extern void FVShowFilled(FontView *fv); +extern void FVChangeDisplayBitmap(FontView *fv,BDFFont *bdf); +extern void SCPreparePopup(GWindow gw,SplineChar *sc); +extern int SFScaleToEm(SplineFont *sf, int ascent, int descent); +extern void TransHints(StemInfo *stem,real mul1, real off1, real mul2, real off2, int round_to_int ); +extern void FVTransFunc(void *_fv,real transform[6],int otype, BVTFunc *bvts, + enum fvtrans_flags ); +extern void FVTrans(FontView *fv,SplineChar *sc,real transform[6],uint8 *sel, + enum fvtrans_flags); +extern int SFNLTrans(FontView *fv,char *x_expr,char *y_expr); +extern void FVApplySubstitution(FontView *fv,uint32 script, uint32 lang, uint32 tag); +extern void NonLinearDlg(FontView *fv,CharView *cv); +extern void FVBuildAccent(FontView *fv,int onlyaccents); +extern void FVChangeChar(FontView *fv,int encoding); +extern void SCClearContents(SplineChar *sc); +extern void SCClearAll(SplineChar *sc); +extern void BCClearAll(BDFChar *bc); +extern void UnlinkThisReference(FontView *fv,SplineChar *sc); +extern void FVFakeMenus(FontView *fv,int cmd); +extern void FVMetricsCenter(FontView *fv,int docenter); +extern void MergeFont(FontView *fv,SplineFont *other); +extern void FVMergeFonts(FontView *fv); +extern void FVInterpolateFonts(FontView *fv); +extern void FVRevert(FontView *fv); +extern void FVDelay(FontView *fv,void (*func)(FontView *)); + +extern void FVDeselectAll(FontView *fv); + +extern void FVAutoKern(FontView *fv); +extern void FVAutoWidth(FontView *fv); +extern void FVRemoveKerns(FontView *fv); +extern void FVRemoveVKerns(FontView *fv); +extern void FVVKernFromHKern(FontView *fv); +extern int AutoWidthScript(SplineFont *sf,int spacing); +extern int AutoKernScript(SplineFont *sf,int spacing, int threshold,char *kernfile); + +extern void CVDrawSplineSet(CharView *cv, GWindow pixmap, SplinePointList *set, + Color fg, int dopoints, DRect *clip ); + +extern GWindow CVMakeTools(CharView *cv); +extern GWindow CVMakeLayers(CharView *cv); +extern GWindow BVMakeTools(BitmapView *bv); +extern GWindow BVMakeLayers(BitmapView *bv); +extern int CVPaletteMnemonicCheck(GEvent *event); +extern real CVRoundRectRadius(void); +extern int CVRectElipseCenter(void); +extern real CVStarRatio(void); +extern int CVPolyStarPoints(void); +extern StrokeInfo *CVFreeHandInfo(void); +extern int TrueCharState(GEvent *event); +extern void BVToolsSetCursor(BitmapView *bv, int state,char *device); +extern void CVToolsSetCursor(CharView *cv, int state,char *device); +extern void CVToolsPopup(CharView *cv, GEvent *event); +extern void BVToolsPopup(BitmapView *bv, GEvent *event); +extern int CVPaletteIsVisible(CharView *cv,int which); +extern void CVPaletteSetVisible(CharView *cv,int which,int visible); +extern void CVPalettesRaise(CharView *cv); +extern void CVLayersSet(CharView *cv); +extern void _CVPaletteActivate(CharView *cv,int force); +extern void CVPaletteActivate(CharView *cv); +extern void CVPalettesHideIfMine(CharView *cv); +extern int BVPaletteIsVisible(BitmapView *bv,int which); +extern void BVPaletteSetVisible(BitmapView *bv,int which,int visible); +extern void BVPaletteActivate(BitmapView *bv); +extern void BVPalettesHideIfMine(BitmapView *bv); +extern void BVPaletteColorChange(BitmapView *bv); +extern void BVPaletteChangedChar(BitmapView *bv); +extern void CVPaletteDeactivate(void); +extern void PalettesChangeDocking(void); +extern int CVPalettesWidth(void); +extern int BVPalettesWidth(void); + +extern void BackgroundImageTransform(SplineChar *sc, ImageList *img,real transform[6]); +extern void CVTransFunc(CharView *cv,real transform[6],enum fvtrans_flags); +extern void skewselect(BVTFunc *bvtf,real t); +extern void TransformDlgCreate(void *data,void (*transfunc)(void *,real *,int,BVTFunc *,enum fvtrans_flags), + int (*getorigin)(void *,BasePoint *,int), int enableback); +extern void BitmapDlg(FontView *fv,SplineChar *sc, int isavail); +extern int BitmapControl(FontView *fv,int32 *sizes,int isavail); +extern void _FVSimplify(FontView *fv,struct simplifyinfo *smpl); +extern int SimplifyDlg(SplineFont *sf,struct simplifyinfo *smpl); +extern void CVReviewHints(CharView *cv); +extern void CVCreateHint(CharView *cv,int ishstem); +extern void SCClearRounds(SplineChar *sc); +extern void SCRemoveSelectedMinimumDistances(SplineChar *sc,int inx); +extern int _ExportPDF(FILE *pdf,SplineChar *sc); +extern int _ExportEPS(FILE *eps,SplineChar *sc); +extern int _ExportSVG(FILE *svg,SplineChar *sc); +extern int CVExport(CharView *cv); +extern int BVExport(BitmapView *bv); +extern void ScriptExport(SplineFont *sf, BDFFont *bdf, int format, int enc); + +extern void DrawAnchorPoint(GWindow pixmap,int x, int y,int selected); +extern void DefaultY(GRect *pos); +extern void CVResize(CharView *cv ); +extern CharView *CharViewCreate(SplineChar *sc,FontView *fv); +extern void CharViewFree(CharView *cv); +extern int CVValid(SplineFont *sf, SplineChar *sc, CharView *cv); +extern void CVDrawRubberRect(GWindow pixmap, CharView *cv); +extern void CVSetCharChanged(CharView *cv,int changed); +extern void _CVCharChangedUpdate(CharView *cv,int changed); +extern void CVCharChangedUpdate(CharView *cv); +extern void SCClearSelPt(SplineChar *sc); +extern void _SCCharChangedUpdate(SplineChar *sc,int changed); +extern void SCCharChangedUpdate(SplineChar *sc); +extern void SCSynchronizeWidth(SplineChar *sc,real newwidth, real oldwidth,FontView *fv); +extern void SCSynchronizeLBearing(SplineChar *sc,char *selected,real off); +extern int CVAnySel(CharView *cv, int *anyp, int *anyr, int *anyi, int *anya); +extern int CVTwoForePointsSelected(CharView *cv, SplinePoint **sp1, SplinePoint **sp2); +extern int CVIsDiagonalable(SplinePoint *sp1, SplinePoint *sp2, SplinePoint **sp3, SplinePoint **sp4); +extern int CVClearSel(CharView *cv); +extern int CVSetSel(CharView *cv,int mask); +extern int CVAllSelected(CharView *cv); +extern void SCUpdateAll(SplineChar *sc); +extern void SCOutOfDateBackground(SplineChar *sc); +extern SplinePointList *CVAnySelPointList(CharView *cv); +extern SplinePoint *CVAnySelPoint(CharView *cv); +extern int CVOneThingSel(CharView *cv, SplinePoint **sp, SplinePointList **spl, + RefChar **ref, ImageList **img, AnchorPoint **ap); +extern int CVOneContourSel(CharView *cv, SplinePointList **_spl, + RefChar **ref, ImageList **img); +extern void RevertedGlyphReferenceFixup(SplineChar *sc, SplineFont *sf); +extern void CVInfoDraw(CharView *cv, GWindow pixmap ); +enum fvformats { fv_bdf, fv_ttf, fv_pk, fv_pcf, fv_mac, fv_win, fv_image, + fv_imgtemplate, fv_eps, fv_epstemplate, fv_svg, fv_svgtemplate, + fv_fig }; +extern void SCImportSVG(SplineChar *sc,int layer,char *path,int doclear); +extern void SCImportPSFile(SplineChar *sc,int layer,FILE *ps,int doclear); +extern void SCAddScaleImage(SplineChar *sc,GImage *image,int doclear,int layer); +extern void SCInsertImage(SplineChar *sc,GImage *image,real scale,real yoff, real xoff, int layer); +extern void CVImport(CharView *cv); +extern void BVImport(BitmapView *bv); +extern void FVImport(FontView *bv); +extern int FVImportImages(FontView *fv,char *path,int isimage); +extern int FVImportImageTemplate(FontView *fv,char *path,int isimage); +extern int FVImportBDF(FontView *fv, char *filename,int ispk, int toback); +extern int FVImportMult(FontView *fv, char *filename,int toback,int bf); +extern SplineFont *SFFromBDF(char *filename,int ispk,int toback); +extern SplineFont *SFFromMF(char *filename); +extern BDFFont *SFImportBDF(SplineFont *sf, char *filename, int ispk, int toback); +extern void CVFindCenter(CharView *cv, BasePoint *bp, int nosel); +extern void CVStroke(CharView *cv); +extern void FVStroke(FontView *fv); +extern void FVStrokeItScript(FontView *fv, StrokeInfo *si); +extern void FreeHandStrokeDlg(StrokeInfo *si); +extern void SCStroke(SplineChar *sc); +extern void FVOutline(FontView *fv, real width); +extern void FVInline(FontView *fv, real width, real inset); +extern void FVShadow(FontView *fv,real angle, real outline_width, + real shadow_length,int wireframe); +extern void OutlineDlg(FontView *fv, CharView *cv,MetricsView *mv,int isinline); +extern void ShadowDlg(FontView *fv, CharView *cv,MetricsView *mv,int wireframe); +extern void CVTile(CharView *cv); +extern void FVTile(FontView *fv); +extern void SCTile(SplineChar *sc); +extern void MDReplace(MinimumDistance *md,SplineSet *old,SplineSet *rpl); +extern void SCAppendPosSub(SplineChar *sc,enum possub_type type, char **d); +extern void SCCharInfo(SplineChar *sc); +extern void CharInfoDestroy(struct charinfo *ci); +extern void PI_ShowHints(SplineChar *sc, GGadget *list, int set); +extern GTextInfo *SCHintList(SplineChar *sc,HintMask *); +extern void CVGetInfo(CharView *cv); +extern void CVPGetInfo(CharView *cv); +extern void SCRefBy(SplineChar *sc); +extern void ApGetInfo(CharView *cv, AnchorPoint *ap); +extern void CVAddAnchor(CharView *cv); +extern AnchorClass *AnchorClassUnused(SplineChar *sc,int *waslig); +extern void FVSetWidth(FontView *fv,enum widthtype wtype); +extern void CVSetWidth(CharView *cv,enum widthtype wtype); +extern void FVSetWidthScript(FontView *fv,enum widthtype wtype,int val,int incr); +extern void CVChangeSC(CharView *cv, SplineChar *sc ); +extern void SCRefreshTitles(SplineChar *sc); +extern void SPChangePointType(SplinePoint *sp, int pointtype); + +extern void CVAdjustPoint(CharView *cv, SplinePoint *sp); +extern void CVMergeSplineSets(CharView *cv, SplinePoint *active, SplineSet *activess, + SplinePoint *merge, SplineSet *mergess); +extern void CVChar(CharView *cv, GEvent *event ); +extern void CVAdjustControl(CharView *cv,BasePoint *cp, BasePoint *to); +extern int CVMoveSelection(CharView *cv, real dx, real dy); +extern int CVTestSelectFromEvent(CharView *cv,GEvent *event); +extern void CVMouseDownPoint(CharView *cv); +extern void CVMouseMovePoint(CharView *cv,PressedOn *); +extern void CVMouseMovePen(CharView *cv, PressedOn *p); +extern void CVMouseUpPoint(CharView *cv,GEvent *event); +extern void CVMouseUpPointer(CharView *cv ); +extern int CVMouseMovePointer(CharView *cv ); +extern void CVMouseDownPointer(CharView *cv, FindSel *fs, GEvent *event); +extern void CVCheckResizeCursors(CharView *cv); +extern void CVMouseDownRuler(CharView *cv, GEvent *event); +extern void CVMouseMoveRuler(CharView *cv, GEvent *event); +extern void CVMouseUpRuler(CharView *cv, GEvent *event); +extern void CVMouseDownHand(CharView *cv); +extern void CVMouseMoveHand(CharView *cv, GEvent *event); +extern void CVMouseUpHand(CharView *cv); +extern void CVMouseDownFreeHand(CharView *cv, GEvent *event); +extern void CVMouseMoveFreeHand(CharView *cv, GEvent *event); +extern void CVMouseUpFreeHand(CharView *cv, GEvent *event); +extern void CVMouseDownTransform(CharView *cv); +extern void CVMouseMoveTransform(CharView *cv); +extern void CVMouseUpTransform(CharView *cv); +extern void CVMouseDownKnife(CharView *cv); +extern void CVMouseMoveKnife(CharView *cv,PressedOn *); +extern void CVMouseUpKnife(CharView *cv); +extern void CVMouseDownShape(CharView *cv); +extern void CVMouseMoveShape(CharView *cv); +extern void CVMouseUpShape(CharView *cv); +extern void LogoExpose(GWindow pixmap,GEvent *event, GRect *r,enum drawmode dm); + +extern int GotoChar(SplineFont *sf); + +extern int CVLayer(CharView *cv); +extern Undoes *CVPreserveState(CharView *cv); +extern Undoes *CVPreserveTState(CharView *cv); +extern Undoes *CVPreserveWidth(CharView *cv,int width); +extern Undoes *CVPreserveVWidth(CharView *cv,int vwidth); +extern void CVDoRedo(CharView *cv); +extern void CVDoUndo(CharView *cv); +extern void SCDoRedo(SplineChar *sc,int layer); +extern void SCDoUndo(SplineChar *sc,int layer); +extern void CVRestoreTOriginalState(CharView *cv); +extern void CVUndoCleanup(CharView *cv); +extern void CVRemoveTopUndo(CharView *cv); +extern enum undotype CopyUndoType(void); +extern int CopyContainsSomething(void); +extern int CopyContainsBitmap(void); +extern RefChar *CopyContainsRef(SplineFont *); +extern char **CopyGetPosSubData(enum possub_type *type); +extern void CopyReference(SplineChar *sc); +extern void CopySelected(CharView *cv); +extern void CVCopyGridFit(CharView *cv); +extern void SCCopyWidth(SplineChar *sc,enum undotype); +extern void CopyWidth(CharView *cv,enum undotype); +extern void PasteToCV(CharView *cv); +extern void PasteRemoveSFAnchors(SplineFont *); +extern void PasteAnchorClassMerge(SplineFont *sf,AnchorClass *into,AnchorClass *from); +extern void PasteRemoveAnchorClass(SplineFont *sf,AnchorClass *dying); +extern void PosSubCopy(enum possub_type type, char **data); +extern void ClipboardClear(void); +extern SplineSet *ClipBoardToSplineSet(void); +extern void BCCopySelected(BDFChar *bc,int pixelsize,int depth); +extern void PasteToBC(BDFChar *bc,int pixelsize,int depth,FontView *fv); +extern void FVCopyWidth(FontView *fv,enum undotype ut); +extern void FVCopy(FontView *fv, int fullcopy); +extern void MVCopyChar(MetricsView *mv, SplineChar *sc, int fullcopy); +extern void PasteIntoFV(FontView *fv, int doclear); +void PasteIntoMV(MetricsView *mv,SplineChar *sc, int doclear); + +extern void CVShowPoint(CharView *cv, SplinePoint *sp); + +extern void WindowMenuBuild(GWindow base,struct gmenuitem *mi,GEvent *); +extern void MenuRecentBuild(GWindow base,struct gmenuitem *mi,GEvent *); +extern void MenuScriptsBuild(GWindow base,struct gmenuitem *mi,GEvent *); +extern int RecentFilesAny(void); +extern void _aplistbuild(struct gmenuitem *mi,SplineFont *sf, + void (*func)(GWindow,struct gmenuitem *,GEvent *)); + +extern GImage GIcon_sel2ptr, GIcon_rightpointer, GIcon_angle, GIcon_distance, + GIcon_selectedpoint, GIcon_mag; + +extern BitmapView *BitmapViewCreate(BDFChar *bc, BDFFont *bdf, FontView *fv); +extern BitmapView *BitmapViewCreatePick(int enc, FontView *fv); +extern void BitmapViewFree(BitmapView *bv); +extern void BCCharChangedUpdate(BDFChar *bc); +extern void BCFlattenFloat(BDFChar *bc); +extern BDFFloat *BDFFloatCreate(BDFChar *bc,int xmin,int xmax,int ymin,int ymax, int clear); +extern BDFFloat *BDFFloatCopy(BDFFloat *sel); +extern BDFFloat *BDFFloatConvert(BDFFloat *sel,int newdepth, int olddepth); +extern void BDFFloatFree(BDFFloat *sel); +extern void BVMenuRotateInvoked(GWindow gw,struct gmenuitem *mi, GEvent *e); +extern void BCTrans(BDFFont *bdf,BDFChar *bc,BVTFunc *bvts,FontView *fv ); +extern void BVRotateBitmap(BitmapView *bv,enum bvtools type ); +extern int BVColor(BitmapView *bv); +extern void BCSetPoint(BDFChar *bc, int x, int y, int color); +extern void BCGeneralFunction(BitmapView *bv, + void (*SetPoint)(BitmapView *,int x, int y, void *data),void *data); +extern int BVFlipNames[]; +extern void BVChangeBC(BitmapView *bv, BDFChar *bc, int fitit ); +extern void BVChar(BitmapView *cv, GEvent *event ); + +extern void MVSetSCs(MetricsView *mv, SplineChar **scs); +extern void MVRefreshChar(MetricsView *mv, SplineChar *sc); +extern void MVRegenChar(MetricsView *mv, SplineChar *sc); +extern void MVReKern(MetricsView *mv); +extern MetricsView *MetricsViewCreate(FontView *fv,SplineChar *sc,BDFFont *bdf); +extern void MetricsViewFree(MetricsView *mv); +extern void MVRefreshAll(MetricsView *mv); + +extern char *getPfaEditShareDir(void); +extern void LoadPrefs(void); +extern void SavePrefs(void); +extern void DoPrefs(void); +extern void LoadPfaEditEncodings(void); +extern void PfaEditSetFallback(void); +extern void RecentFilesRemember(char *filename); +extern int GetPrefs(char *name,Val *val); /* for scripting */ +extern int SetPrefs(char *name,Val *val1, Val *val2); /* for scripting */ +extern void GListAddStr(GGadget *list,unichar_t *str, void *ud); +extern void GListReplaceStr(GGadget *list,int index, unichar_t *str, void *ud); +extern void GCDFillMacFeat(GGadgetCreateData *mfgcd,GTextInfo *mflabels, int width, + MacFeat *all, int fromprefs); +extern int UserFeaturesDiffer(void); +extern void Prefs_ReplaceMacFeatures(GGadget *list); + +extern void FVAutoTrace(FontView *fv,int ask); +extern void SCAutoTrace(SplineChar *sc,GWindow v,int ask); +extern char *FindAutoTraceName(void); +extern char *FindMFName(void); +extern char *ProgramExists(char *prog,char *buffer); +extern void *GetAutoTraceArgs(void); +extern void SetAutoTraceArgs(void *a); +extern void MfArgsInit(void); + +extern unichar_t *FVOpenFont(const unichar_t *title, const unichar_t *defaultfile, + const unichar_t *initial_filter, unichar_t **mimetypes,int mult,int newok); + +extern unichar_t *PrtBuildDef( SplineFont *sf, int istwobyte ); +extern void PrintDlg(FontView *fv,SplineChar *sc,MetricsView *mv); +extern void ScriptPrint(FontView *fv,int type,int32 *pointsizes,char *samplefile, + char *outputfile); + +enum sftf_fonttype { sftf_pfb, sftf_ttf, sftf_httf, sftf_otf, sftf_bitmap, sftf_pfaedit }; +extern int SFTFSetFont(GGadget *g, int start, int end, SplineFont *sf, + enum sftf_fonttype, int size, int antialias); +extern void SFTFRegisterCallback(GGadget *g, void *cbcontext, + void (*changefontcallback)(void *,SplineFont *,enum sftf_fonttype,int size,int aa)); +extern GGadget *SFTextAreaCreate(struct gwindow *base, GGadgetData *gd,void *data); +extern void DisplayDlg(SplineFont *sf); + +extern void ShowAboutScreen(void); +extern void DelayEvent(void (*func)(void *), void *data); + +extern void FindProblems(FontView *fv,CharView *cv,SplineChar *sc); +extern void MetaFont(FontView *fv,CharView *cv,SplineChar *sc); +extern void CVConstrainSelection(CharView *cv,int type); +extern void CVMakeParallel(CharView *cv); + +extern void ScriptDlg(FontView *fv); +extern void ExecuteScriptFile(FontView *fv, char *filename); +extern void DictionaryFree(struct dictionary *dica); + +# if HANYANG +extern void MenuNewComposition(GWindow gw, struct gmenuitem *, GEvent *); +extern void CVDisplayCompositions(GWindow gw, struct gmenuitem *, GEvent *); +extern void Disp_DoFinish(struct jamodisplay *d, int cancel); +extern void Disp_RefreshChar(SplineFont *sf,SplineChar *sc); +extern void Disp_DefaultTemplate(CharView *cv); +# endif + +extern SearchView *SVCreate(FontView *fv); +extern void SVCharViewInits(SearchView *sv); +extern void SVMenuClose(GWindow gw,struct gmenuitem *mi,GEvent *e); +extern void SVChar(SearchView *sv, GEvent *event); +extern void SVMakeActive(SearchView *sv,CharView *cv); +extern int SVAttachFV(FontView *fv,int ask_if_difficult); +extern void SVDetachFV(FontView *fv); + +extern void ShowAtt(SplineFont *sf); +extern void SFShowKernPairs(SplineFont *sf,SplineChar *sc,AnchorClass *ac); +extern void SFShowLigatures(SplineFont *sf,SplineChar *sc); + +extern void SCEditInstructions(SplineChar *sc); +extern void SFEditTable(SplineFont *sf, uint32 tag); +extern void IIScrollTo(struct instrinfo *ii,int ip,int mark_stop); +extern void IIReinit(struct instrinfo *ii,int ip); +extern int ii_v_e_h(GWindow gw, GEvent *event); +extern void instr_scroll(struct instrinfo *ii,struct sbevent *sb); + +extern void CVGridFitChar(CharView *cv); +extern void CVFtPpemDlg(CharView *cv,int debug); +extern void SCDeGridFit(SplineChar *sc); + +extern void CVDebugReInit(CharView *cv,int restart_debug,int dbg_fpgm); +extern void CVDebugFree(DebugView *dv); +extern int DVChar(DebugView *dv, GEvent *e); + +struct debugger_context; +extern void DebuggerTerminate(struct debugger_context *dc); +extern void DebuggerReset(struct debugger_context *dc,real pointsize,int dpi,int dbg_fpgm); +extern struct debugger_context *DebuggerCreate(SplineChar *sc,real pointsize,int dpi,int dbg_fpgm); +enum debug_gotype { dgt_continue, dgt_step, dgt_next, dgt_stepout }; +extern void DebuggerGo(struct debugger_context *dc,enum debug_gotype); +extern struct TT_ExecContextRec_ *DebuggerGetEContext(struct debugger_context *dc); +extern void DebuggerToggleBp(struct debugger_context *dc,int range,int ip); +extern int DebuggerBpCheck(struct debugger_context *dc,int range,int ip); +extern void DebuggerSetWatches(struct debugger_context *dc,int n, uint8 *w); +extern uint8 *DebuggerGetWatches(struct debugger_context *dc, int *n); +extern int DebuggingFpgm(struct debugger_context *dc); + +extern unichar_t *ScriptLangLine(struct script_record *sr); +extern void ShowKernClasses(SplineFont *sf,MetricsView *mv,int isv); +extern void KCLD_End(struct kernclasslistdlg *kcld); +extern void KCLD_MvDetach(struct kernclasslistdlg *kcld,MetricsView *mv); + +extern void FVSelectByPST(FontView *fv); +extern int FVParseSelectByPST(FontView *fv,int type, + const unichar_t *tags,const unichar_t *contents, + int search_type); + +enum hist_type { hist_hstem, hist_vstem, hist_blues }; +struct psdict; +extern void SFHistogram(SplineFont *sf,struct psdict *private,uint8 *selected, + enum hist_type which); + +extern GTextInfo **SFGenTagListFromType(struct gentagtype *gentags,enum possub_type type); +extern struct contextchaindlg *ContextChainEdit(SplineFont *sf,FPST *fpst, + struct gfi_data *gfi,unichar_t *newname); +extern void CCD_Close(struct contextchaindlg *ccd); +extern int CCD_NameListCheck(SplineFont *sf,const unichar_t *ret,int empty_bad,int title); +extern int CCD_InvalidClassList(const unichar_t *ret,GGadget *list,int wasedit); +extern char *cu_copybetween(const unichar_t *start, const unichar_t *end); + +extern struct statemachinedlg *StateMachineEdit(SplineFont *sf,ASM *sm,struct gfi_data *d); +extern void SMD_Close(struct statemachinedlg *smd); +extern void GFI_FinishSMNew(struct gfi_data *d,ASM *sm, int success,int isnew); +extern void GFI_SMDEnd(struct gfi_data *d); +extern ASM *SMConvertDlg(SplineFont *sf); + +extern void SFRemoveFeatureDlg(SplineFont *sf); +extern void SFCopyFeatureToFontDlg(SplineFont *sf); +extern void SFRetagFeatureDlg(SplineFont *sf); + +extern void MMChangeBlend(MMSet *mm,FontView *fv); +extern void MMWizard(MMSet *mm); + +extern int LayerDialog(Layer *layer); +extern void SCMoreLayers(SplineChar *); +extern void SCLayersChange(SplineChar *sc); +extern void CVLayerChange(CharView *cv); +extern void SFLayerChange(SplineFont *sf); + +extern GMenuItem helplist[]; +#endif diff --git a/fontforge/windowmenu.c b/fontforge/windowmenu.c new file mode 100644 index 00000000..37cc9871 --- /dev/null +++ b/fontforge/windowmenu.c @@ -0,0 +1,238 @@ +/* Copyright (C) 2000-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaeditui.h" +#include +#include "splinefont.h" +#include "ustring.h" + +static void WindowSelect(GWindow base,struct gmenuitem *mi,GEvent *e) { + GDrawRaise(mi->ti.userdata); +} + +static void AddMI(GMenuItem *mi,GWindow gw,int changed, int top) { + mi->ti.userdata = gw; + mi->ti.bg = changed?0xffffff:GDrawGetDefaultBackground(GDrawGetDisplayOfWindow(gw)); + if ( top ) mi->ti.fg = 0x008000; + mi->invoke = WindowSelect; + mi->ti.text = GDrawGetWindowTitle(gw); + if ( u_strlen( mi->ti.text ) > 20 ) + mi->ti.text[20] = '\0'; +} + +/* Builds up a menu containing the titles of all the major windows */ +void WindowMenuBuild(GWindow base,struct gmenuitem *mi,GEvent *e) { + int i, cnt; + FontView *fv; + CharView *cv; + MetricsView *mv; + BitmapView *bv; + GMenuItem *sub; + BDFFont *bdf; + extern void GMenuItemArrayFree(GMenuItem *mi); + + if ( mi->sub!=NULL ) { + GMenuItemArrayFree(mi->sub); + mi->sub = NULL; + } + + cnt = 0; + for ( fv = fv_list; fv!=NULL; fv = fv->next ) { + ++cnt; /* for the font */ + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL ) { + for ( cv = fv->sf->chars[i]->views; cv!=NULL; cv=cv->next ) + ++cnt; /* for each char view in the font */ + } + for ( bdf= fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + for ( bv = bdf->chars[i]->views; bv!=NULL; bv=bv->next ) + ++cnt; + } + } + for ( mv=fv->metrics; mv!=NULL; mv=mv->next ) + ++cnt; + } + if ( cnt==0 ) { + /* This can't happen */ +return; + } + sub = gcalloc(cnt+1,sizeof(GMenuItem)); + cnt = 0; + for ( fv = fv_list; fv!=NULL; fv = fv->next ) { + AddMI(&sub[cnt++],fv->gw,fv->sf->changed,true); + for ( i=0; isf->charcnt; ++i ) if ( fv->sf->chars[i]!=NULL ) { + for ( cv = fv->sf->chars[i]->views; cv!=NULL; cv=cv->next ) + AddMI(&sub[cnt++],cv->gw,cv->sc->changed,false); + } + for ( bdf= fv->sf->bitmaps; bdf!=NULL; bdf = bdf->next ) { + for ( i=0; icharcnt; ++i ) if ( bdf->chars[i]!=NULL ) { + for ( bv = bdf->chars[i]->views; bv!=NULL; bv=bv->next ) + AddMI(&sub[cnt++],bv->gw,bv->bc->changed,false); + } + } + for ( mv=fv->metrics; mv!=NULL; mv=mv->next ) + AddMI(&sub[cnt++],mv->gw,false,false); + } + mi->sub = sub; +} + +static void RecentSelect(GWindow base,struct gmenuitem *mi,GEvent *e) { + ViewPostscriptFont((char *) (mi->ti.userdata)); +} + +/* Builds up a menu containing the titles of all the unused recent files */ +void MenuRecentBuild(GWindow base,struct gmenuitem *mi,GEvent *e) { + int i, cnt, cnt1; + FontView *fv; + extern void GMenuItemArrayFree(struct gmenuitem *mi); + GMenuItem *sub; + + if ( mi->sub!=NULL ) { + GMenuItemArrayFree(mi->sub); + mi->sub = NULL; + } + + cnt = 0; + for ( i=0; inext ) + if ( fv->sf->filename!=NULL && strcmp(fv->sf->filename,RecentFiles[i])==0 ) + break; + if ( fv==NULL ) + ++cnt; + } + if ( cnt==0 ) { + /* This can't happen */ +return; + } + sub = gcalloc(cnt+1,sizeof(GMenuItem)); + cnt1 = 0; + for ( i=0; inext ) + if ( fv->sf->filename!=NULL && strcmp(fv->sf->filename,RecentFiles[i])==0 ) + break; + if ( fv==NULL ) { + GMenuItem *mi = &sub[cnt1++]; + mi->ti.userdata = RecentFiles[i]; + mi->ti.bg = mi->ti.fg = COLOR_DEFAULT; + mi->invoke = RecentSelect; + mi->ti.text = def2u_copy(GFileNameTail(RecentFiles[i])); + } + } + if ( cnt!=cnt1 ) + GDrawIError( "Bad counts in MenuRecentBuild"); + mi->sub = sub; +} + +int RecentFilesAny(void) { + int i; + FontView *fvl; + + for ( i=0; inext ) + if ( fvl->sf->filename!=NULL && strcmp(fvl->sf->filename,RecentFiles[i])==0 ) + break; + if ( fvl==NULL ) +return( true ); + } +return( false ); +} + +static void ScriptSelect(GWindow base,struct gmenuitem *mi,GEvent *e) { + int index = (int) (mi->ti.userdata); + FontView *fv = (FontView *) GDrawGetUserData(base); + + /* the menu is not always up to date. If user changed prefs and then used */ + /* Alt|Ctl|Digit s/he would not get a new menu built and the old one might*/ + /* refer to something out of bounds. Hence the check */ + if ( index<0 || script_filenames[index]==NULL ) +return; + ExecuteScriptFile(fv,script_filenames[index]); +} + +/* Builds up a menu containing any user defined scripts */ +void MenuScriptsBuild(GWindow base,struct gmenuitem *mi,GEvent *e) { + int i; + extern void GMenuItemArrayFree(struct gmenuitem *mi); + GMenuItem *sub; + + if ( mi->sub!=NULL ) { + GMenuItemArrayFree(mi->sub); + mi->sub = NULL; + } + + for ( i=0; iti.userdata = (void *) i; + mi->ti.bg = mi->ti.fg = COLOR_DEFAULT; + mi->invoke = ScriptSelect; + mi->shortcut = i==9?'0':'1'+i; + mi->short_mask = ksm_control|ksm_meta; + mi->ti.text = u_copy(script_menu_names[i]); + } + mi->sub = sub; +} + +/* Builds up a menu containing all the anchor classes */ +void _aplistbuild(struct gmenuitem *top,SplineFont *sf, + void (*func)(GWindow,struct gmenuitem *,GEvent *)) { + int cnt; + GMenuItem *mi, *sub; + AnchorClass *ac; + + cnt = 0; + for ( ac = sf->anchor; ac!=NULL; ac=ac->next ) ++cnt; + if ( cnt==0 ) + cnt = 1; + else + cnt += 2; + sub = gcalloc(cnt+1,sizeof(GMenuItem)); + mi = &sub[0]; + mi->ti.userdata = (void *) (-1); + mi->ti.bg = mi->ti.fg = COLOR_DEFAULT; + mi->invoke = func; + mi->ti.text = u_copy(GStringGetResource(_STR_All,NULL)); + if ( cnt==1 ) + mi->ti.disabled = true; + else { + ++mi; + mi->ti.bg = mi->ti.fg = COLOR_DEFAULT; + mi->ti.line = true; + ++mi; + } + for ( ac=sf->anchor; ac!=NULL; ac = ac->next, ++mi ) { + mi->ti.userdata = (void *) ac; + mi->ti.bg = mi->ti.fg = COLOR_DEFAULT; + mi->invoke = func; + mi->ti.text = u_copy(ac->name); + } + top->sub = sub; +} diff --git a/fontforge/winfonts.c b/fontforge/winfonts.c new file mode 100644 index 00000000..d1b203b3 --- /dev/null +++ b/fontforge/winfonts.c @@ -0,0 +1,637 @@ +/* Copyright (C) 2002-2004 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "pfaedit.h" +#include +#include +#include "splinefont.h" +#include +#include +#include + +/* Look for +Source: Microsoft Windows 2.0 SDK Programmer's Refrence, pages 639 through 645 + Microsoft Windows Device Driver Kit, Device Driver Adaptaion Guide, pages 13-1-13-15 + +This is quoted directly from "The PC Programmer's Sourcebook, 2nd Edition", by +Thom Hogan, pages 6-18 through 6-19. You need this book. ISBN 1-55615-321-X. +*/ + +/* The information herein is derived from Windows 3 Developer's Notes summary */ +/* Spec for v3 */ +/* http://support.microsoft.com/default.aspx?scid=KB;en-us;q65123 */ +/* http://www.csdn.net/Dev/Format/text/font.htm */ +/* Spec for v2 */ +/* http://www.technoir.nu/hplx/hplx-l/9708/msg00404.html */ +/* Spec for FontDirEntry */ +/* http://www.sxlist.com/techref/os/win/api/win32/struc/src/str08_9.htm */ +/* Spec for ?FON? file? */ +/* http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/resfmt.txt*/ +/* and from the freetype source code (particularly: */ +/* ~freetype/src/winfonts/winfnt.c and ~freetype/include/freetype/internal/fntypes.h */ + +/* Windows FNT header. A FON file may contain several FNTs */ +struct fntheader { + uint16 version; /* Either 0x200 or 0x300 */ + uint32 filesize; + char copyright[60+1]; + uint16 type; +#define FNT_TYPE_VECTOR 0x0001 /* If set a vector FNT, else raster (we only parse rasters) */ +/* not used, mbz 0x0002 */ +#define FNT_TYPE_MEMORY 0x0004 /* If set font is in ROM */ +/* not used, mbz 0x0078 */ +#define FNT_TYPE_DEVICE 0x0080 /* If set font is "realized by a device" whatever that means */ +/* reserved for device 0xff00 */ + uint16 pointsize; /* design pointsize */ + uint16 vertres; /* Vertical resolution of font */ + uint16 hortres; /* Horizontal resolution of font */ + uint16 ascent; + uint16 internal_leading; + uint16 external_leading; + uint8 italic; /* set to 1 for italic fonts */ + uint8 underline; /* set to 1 for underlined fonts */ + uint8 strikeout; /* set to 1 for struckout fonts */ + uint16 weight; /* 1-1000 windows weight value */ + uint8 charset; /* ??? */ + uint16 width; /* non-0 => fixed width font, width of all chars */ + uint16 height; /* height of font bounding box */ + uint8 pitchfamily; +#define FNT_PITCH_VARIABLE 0x01 /* Variable width font */ +#define FNT_FAMILY_MASK 0xf0 +#define FNT_FAMILY_DONTCARE 0x00 +#define FNT_FAMILY_SERIF 0x10 +#define FNT_FAMILY_SANSSERIF 0x20 +#define FNT_FAMILY_FIXED 0x30 +#define FNT_FAMILY_SCRIPT 0x40 +#define FNT_FAMILY_DECORATIVE 0x50 + uint16 avgwidth; /* Width of "X" */ + uint16 maxwidth; + uint8 firstchar; + uint8 lastchar; + uint8 defchar; /* ?-firstchar */ + uint8 breakchar; /* 32-firstchar */ + uint16 widthbytes; /* Number of bytes in a row */ + uint32 deviceoffset; /* set to 0 */ + uint32 faceoffset; /* Offset from start of file to face name (C string) */ + uint32 bitspointer; /* set to 0 */ + uint32 bitsoffset; /* Offset from start of file to start of bitmap info */ + uint8 mbz1; +/* These fields are not present in 2.0 and are not meaningful in 3.0 */ +/* they are there for future expansion */ + uint32 flags; +#define FNT_FLAGS_FIXED 0x0001 +#define FNT_FLAGS_PROPORTIONAL 0x0002 +#define FNT_FLAGS_ABCFIXED 0x0004 +#define FNT_FLAGS_ABCPROP 0x0008 +#define FNT_FLAGS_1COLOR 0x0010 +#define FNT_FLAGS_16COLOR 0x0020 +#define FNT_FLAGS_256COLOR 0x0040 +#define FNT_FLAGS_RGBCOLOR 0x0080 + uint16 aspace; + uint16 bspace; + uint16 cspace; + uint32 coloroffset; /* Offset to color table */ + uint8 mbz2[16]; /* Freetype says 4. Online docs say 16 & earlier versions were wrong... */ +#if 0 /* Font data */ + union { + /* Width below is width of bitmap, and advance width */ + /* so no chars can extend before 0 or after advance */ + struct v2chars { uint16 width; uint16 offset; } v2; + struct v3chars { uint16 width; uint32 offset; } v3; + } chartable[/*lastchar-firstchar+2*/258]; + /* facename */ + /* devicename */ + /* bitmaps */ + /* Each character is stored in column-major order with one byte for each row */ + /* then the second byte for each row, ... */ +#endif +}; + + +struct v2chars { uint16 width; uint16 offset; }; + /* In v2 I get the impression that characters are stored as they are on the */ + /* ie. one huge bitmap. The offset gives the location in each row */ +struct v3chars { uint16 width; uint32 offset; }; + /* The offset gives the offset to the entire character (stored in a weird */ + /* format but basically contiguously) from the bitsoffset */ + +struct winmz_header { + uint16 magic; +#define FON_MZ_MAGIC 0x5A4D + uint16 skip[29]; + uint32 lfanew; +}; + +struct winne_header { + uint16 magic; +#define FON_NE_MAGIC 0x454E + uint8 skip[34]; + uint16 resource_tab_offset; + uint16 rname_tab_offset; +}; + +/* Little-endian routines. I hate eggs anyway. */ +static int lgetushort(FILE *f) { + int ch1, ch2; + ch1 = getc(f); + ch2 = getc(f); +return( (ch2<<8)|ch1 ); +} + +static int lgetlong(FILE *f) { + int ch1, ch2, ch3, ch4; + ch1 = getc(f); + ch2 = getc(f); + ch3 = getc(f); + ch4 = getc(f); +return( (ch4<<24)|(ch3<<16)|(ch2<<8)|ch1 ); +} + +static void lputshort(FILE *f,int val) { + putc(val&0xff,f); + putc((val>>8)&0xff,f); +} + +static void lputlong(FILE *f,int val) { + putc(val&0xff,f); + putc((val>>8),f); + putc((val>>16),f); + putc((val>>24)&0xff,f); +} + +static int FNT_Load(FILE *fnt,SplineFont *sf) { + struct fntheader fntheader; + struct v3chars charinfo[258]; /* Max size */ + int i, j, k, ch; + uint32 base = ftell(fnt); + char *pt, *spt, *temp; + BDFFont *bdf; + BDFChar *bdfc; + + memset(&fntheader,0,sizeof(fntheader)); + fntheader.version = lgetushort(fnt); + if ( fntheader.version != 0x200 && fntheader.version != 0x300 ) +return( false ); + fntheader.filesize = lgetlong(fnt); + for ( i=0; i<60; ++i ) + fntheader.copyright[i] = getc(fnt); + fntheader.copyright[i] = '\0'; + for ( --i; i>=0 && fntheader.copyright[i]==' '; --i ) + fntheader.copyright[i] = '\0'; + fntheader.type = lgetushort(fnt); + if ( fntheader.type & (FNT_TYPE_VECTOR|FNT_TYPE_MEMORY|FNT_TYPE_DEVICE)) +return( false ); + fntheader.pointsize = lgetushort(fnt); + fntheader.vertres = lgetushort(fnt); + fntheader.hortres = lgetushort(fnt); + fntheader.ascent = lgetushort(fnt); + fntheader.internal_leading = lgetushort(fnt); + fntheader.external_leading = lgetushort(fnt); + fntheader.italic = getc(fnt); + fntheader.underline = getc(fnt); + fntheader.strikeout = getc(fnt); + fntheader.weight = lgetushort(fnt); + fntheader.charset = getc(fnt); + fntheader.width = lgetushort(fnt); + fntheader.height = lgetushort(fnt); + fntheader.pitchfamily = getc(fnt); + fntheader.avgwidth = lgetushort(fnt); + fntheader.maxwidth = lgetushort(fnt); + fntheader.firstchar = getc(fnt); + fntheader.lastchar = getc(fnt); + fntheader.defchar = getc(fnt); + fntheader.breakchar = getc(fnt); + fntheader.widthbytes = lgetushort(fnt); + fntheader.deviceoffset = lgetlong(fnt); + fntheader.faceoffset = lgetlong(fnt); + fntheader.bitspointer = lgetlong(fnt); + fntheader.bitsoffset = lgetlong(fnt); + (void) getc(fnt); /* Not documented in the v2 spec but seems to be present */ + if ( fntheader.version == 0x300 ) { + fntheader.flags = lgetlong(fnt); + if ( fntheader.flags & (FNT_FLAGS_ABCFIXED|FNT_FLAGS_ABCPROP|FNT_FLAGS_16COLOR|FNT_FLAGS_256COLOR|FNT_FLAGS_RGBCOLOR)) +return( false ); + fntheader.aspace = lgetushort(fnt); + fntheader.bspace = lgetushort(fnt); + fntheader.cspace = lgetushort(fnt); + fntheader.coloroffset = lgetlong(fnt); + for ( i=0; i<16; ++i ) /* Freetype thinks this is 4 */ + (void) getc(fnt); +#if 0 +/* A font dir entry looks like this. It does not read bitspointer, bitsoffset */ + } else { + fntheader.deviceoffset = lgetlong(fnt); + fntheader.faceoffset = lgetlong(fnt); + (void) lgetlong(fnt); + while ( (ch=getc(fnt))!=EOF && ch!='\0' ); + fntheader.faceoffset = ftell(fnt)-base; + while ( (ch=getc(fnt))!=EOF && ch!='\0' ); +#endif + } + + memset(charinfo,0,sizeof(charinfo)); + for ( i=fntheader.firstchar; i<=fntheader.lastchar+2; ++i ) { + charinfo[i].width = lgetushort(fnt); + if ( fntheader.version==0x200 ) + charinfo[i].offset = lgetushort(fnt); + else + charinfo[i].offset = lgetlong(fnt); + } + + /* Set the font names and the pfminfo structure */ + sf->pfminfo.pfmset = true; + if ( fntheader.copyright[0]!='\0' ) { + free(sf->copyright); + sf->copyright = copy(fntheader.copyright); + } + free(sf->weight); + sf->weight = copy( fntheader.weight<=100 ? "Thin" : + fntheader.weight<=200 ? "Extralight" : + fntheader.weight<=300 ? "Light" : + fntheader.weight<=400 ? "Normal" : + fntheader.weight<=500 ? "Medium" : + fntheader.weight<=600 ? "Demibold" : + fntheader.weight<=700 ? "Bold" : + fntheader.weight<=800 ? "Heavy" : + fntheader.weight<=900 ? "Black" : "Nord" ); + sf->pfminfo.weight = fntheader.weight; + sf->pfminfo.panose[2] = fntheader.weight/100 + 1; + fseek(fnt,base+fntheader.faceoffset,SEEK_SET); + for ( i=0; (ch=getc(fnt))!=EOF && ch!=0; ++i ); + free(sf->familyname); + sf->familyname = galloc(i+2); + fseek(fnt,base+fntheader.faceoffset,SEEK_SET); + for ( i=0; (ch=getc(fnt))!=EOF && ch!=0; ++i ) + sf->familyname[i] = ch; + sf->familyname[i] = '\0'; + temp = galloc(i+50); + strcpy(temp,sf->familyname); + if ( fntheader.weight<=300 && fntheader.weight>500 ) { + strcat(temp," "); + strcat(temp,sf->weight); + } + if ( fntheader.italic ) + strcat(temp," Italic"); + free(sf->fullname); + sf->fullname = temp; + free(sf->fontname); + sf->fontname = copy(sf->fullname); + for ( pt=spt=sf->fontname; *spt; ++spt ) + if ( *spt!=' ' ) + *pt++ = *spt; + *pt = '\0'; + sf->pfminfo.pfmfamily = fntheader.pitchfamily; + sf->pfminfo.panose[0] = 2; + if ( (fntheader.pitchfamily&FNT_FAMILY_MASK)==FNT_FAMILY_SCRIPT ) + sf->pfminfo.panose[0] = 3; + sf->pfminfo.width = 5; /* No info about condensed/extended */ + sf->pfminfo.panose[3] = 3; + if ( !(fntheader.pitchfamily&FNT_PITCH_VARIABLE ) ) + sf->pfminfo.panose[3] = 9; + sf->pfminfo.linegap = (sf->ascent+sf->descent)*fntheader.external_leading/fntheader.height; + if ( fntheader.italic ) + sf->italicangle = 11.25; + + bdf = gcalloc(1,sizeof(BDFFont)); + bdf->sf = sf; + bdf->charcnt = sf->charcnt; + bdf->res = fntheader.vertres; + bdf->pixelsize = rint(fntheader.pointsize*fntheader.vertres/72.27); + bdf->chars = gcalloc(sf->charcnt,sizeof(BDFChar *)); + bdf->ascent = rint(.8*bdf->pixelsize); /* shouldn't use typographical ascent */ + bdf->descent = bdf->pixelsize-bdf->ascent; + bdf->encoding_name = sf->encoding_name; + for ( i=fntheader.firstchar; i<=fntheader.lastchar; ++i ) if ( charinfo[i].width!=0 ) { + sf->chars[i] = SFMakeChar(sf,i); + + bdf->chars[i] = bdfc = chunkalloc(sizeof(BDFChar)); + bdfc->xmin = 0; + bdfc->xmax = charinfo[i].width-1; + bdfc->ymin = fntheader.ascent-fntheader.height; + bdfc->ymax = fntheader.ascent-1; + bdfc->width = charinfo[i].width; + bdfc->bytes_per_line = (bdfc->xmax>>3)+1; + bdfc->bitmap = gcalloc(bdfc->bytes_per_line*fntheader.height,sizeof(uint8)); + bdfc->enc = i; + bdfc->sc = sf->chars[i]; + bdfc->sc->widthset = true; + + fseek(fnt,base+charinfo[i].offset,SEEK_SET); + for ( j=0; jbytes_per_line; ++j ) { + for ( k=0; kbitmap[k*bdfc->bytes_per_line+j] = getc(fnt); + } + BCCompressBitmap(bdfc); + + if ( feof(fnt) ) { + BDFFontFree(bdf); +return( false ); + } + } + + bdf->next = sf->bitmaps; + sf->bitmaps = bdf; +return( true ); +} + +SplineFont *SFReadWinFON(char *filename,int toback) { + FILE *fon; + int magic, i, shift_size; + SplineFont *sf; + uint32 neoffset, recoffset, recend; + int font_count; + BDFFont *bdf, *next; + + fon = fopen(filename,"rb"); + if ( fon==NULL ) +return( NULL ); + magic = lgetushort(fon); + fseek(fon,0,SEEK_SET); + if ( magic!=0x200 && magic!=0x300 && magic!=FON_MZ_MAGIC ) { + fclose(fon); +return( NULL ); + } + sf = SplineFontBlank(em_win,256); + + if ( magic == 0x200 || magic==0x300 ) + FNT_Load(fon,sf); + else { + /* Ok, we know it begins with a mz header (whatever that is) */ + /* all we care about is the offset to the ne header (whatever that is) */ + fseek(fon,30*sizeof(uint16),SEEK_SET); + neoffset = lgetlong(fon); + fseek(fon,neoffset,SEEK_SET); + if ( lgetushort(fon)!=FON_NE_MAGIC ) { + SplineFontFree(sf); + fclose(fon); +return( NULL ); + } + for ( i=0; i<34; ++i ) getc(fon); + recoffset = neoffset + lgetushort(fon); + recend = neoffset + lgetushort(fon); + + fseek(fon,recoffset,SEEK_SET); + shift_size = lgetushort(fon); + font_count = 0; + while ( ftell(fon)bitmaps==NULL ) { + SplineFontFree(sf); +return( NULL ); + } + + SFOrderBitmapList(sf); + if ( sf->bitmaps->next!=NULL && toback ) { + for ( bdf = sf->bitmaps; bdf->next!=NULL; bdf = next ) { + next = bdf->next; + BDFFontFree(bdf); + } + sf->bitmaps = bdf; + } + /* Find the biggest font, and adjust the metrics to match */ + for ( bdf = sf->bitmaps; bdf->next!=NULL; bdf = bdf->next ); + for ( i=0; icharcnt ; ++i ) if ( sf->chars[i]!=NULL && bdf->chars[i]!=NULL ) + sf->chars[i]->width = rint(bdf->chars[i]->width*1000.0/bdf->pixelsize); + sf->onlybitmaps = true; +return( sf ); +} + +static int _FONFontDump(FILE *file,BDFFont *font, int res) { + uint32 startpos, endpos, namelocpos, datapos, namepos; + int i, j, k, l; + int ch; + int cnt, badch, defch; + int first, last, avgwid, maxwid, samewid, maxy, miny, widbytes, spacesize; + struct pfminfo pfminfo; + int complained=false; + + if ( font->clut!=NULL ) +return( false ); + + avgwid = widbytes = maxwid = maxy = last = cnt = 0; + miny = first = 999999; + samewid = -1; + badch = -1; + defch = -1; + for ( i=0; icharcnt && i<256; ++i ) if ( font->chars[i]!=NULL && font->chars[i]->width>0 ) { + if ( i==0 || (i==0x80 && defch!=0) ) defch=i; + else if ( i!=' ' ) defch = i; + if ( ichars[i]->width; + widbytes += (font->chars[i]->width+7)>>3; + if ( font->chars[i]->ymax>maxy ) maxy = font->chars[i]->ymax; + if ( font->chars[i]->yminchars[i]->ymin; + if ( font->chars[i]->width>maxy ) maxwid = font->chars[i]->width; + if ( font->chars[i]->widthchars[i]->xmax || font->chars[i]->xmin<0 ) + badch = i; + if ( samewid==-1 ) samewid = font->chars[i]->width; + else if ( samewid!=font->chars[i]->width ) samewid = -2; + } + if (( spacesize = font->pixelsize/4 )==0 ) spacesize=1; + if ( font->chars[' ']!=NULL && font->chars[' ']->sc!=NULL && + font->chars[' ']->sc->unicodeenc == ' ' ) + spacesize = font->chars[' ']->width; + if ( badch!=-1 ) + fprintf( stderr, "At pixelsize %d the character %s either starts before the origin or extends beyond the advance width.\n", + font->pixelsize, font->chars[badch]->sc->name ); + SFDefaultOS2Info(&pfminfo,font->sf,font->sf->fontname); + widbytes = avgwid+spacesize; + if ( cnt!=0 ) avgwid = rint(avgwid/(double) cnt); + if ( font->chars['X']!=NULL && font->chars['X']->sc!=NULL && + font->chars['X']->sc->unicodeenc == 'X' ) + avgwid = font->chars['X']->width; + + if ( res<0 ) { + switch ( font->pixelsize ) { + case 13: case 16: case 32: + res = 96; + default: + res = 120; + break; + } + } + + startpos = ftell(file); + lputshort(file,0x200); + lputlong(file,0); /* Fix file size up later */ + i = 0; + if ( font->sf->copyright ) { + for ( i=0; i<59 && font->sf->copyright[i]!='\0'; ++i ) + putc(font->sf->copyright[i],file); + } + while ( i<60 ) { + putc('\0',file); + ++i; + } + lputshort(file,0); /* flags */ + lputshort(file,rint(font->pixelsize*72.0/res)); /* pointsize */ + lputshort(file,res); /* vertical res */ + lputshort(file,res); /* horizontal res */ + lputshort(file,maxy+1); /* ascent */ + lputshort(file,0); /* internal_leading */ + lputshort(file, /* external_leading */ + rint(pfminfo.linegap*font->pixelsize/(double)(font->sf->ascent+font->sf->descent)) ); + if ( font->sf->italicangle!=0 || + strstrmatch(font->sf->fontname,"ital")!=NULL || + strstrmatch(font->sf->fontname,"kurs")!=NULL || + strstrmatch(font->sf->fontname,"slanted")!=NULL || + strstrmatch(font->sf->fontname,"obli")!=NULL ) + putc('\1',file); + else + putc('\0',file); /* italic */ + putc('\0',file); /* underline */ + putc('\0',file); /* strikeout */ + lputshort(file,pfminfo.weight); /* weight */ + putc('\0',file); /* charset */ /* ??? */ + lputshort(file,samewid>0?samewid:0); /* fixed width */ + lputshort(file,maxy-miny+1); /* bounding box height */ + putc(pfminfo.pfmfamily,file); /* pitchfamily */ + lputshort(file,avgwid); /* average width */ + lputshort(file,maxwid); /* max width */ + putc(first,file); + putc(last,file); + putc(defch-first,file); + putc(' '-first,file); + lputshort(file,widbytes); /* bytes per row */ + lputlong(file,0); /* device name */ + namelocpos = ftell(file); + lputlong(file,0); /* face name, fill in later */ + lputlong(file,0); /* location in ROM */ + datapos = 118+(last-first+3)*4; + lputlong(file,datapos); /* bitmap data pointer */ + putc('\0',file); +/* End of FNT header */ + + widbytes = 0; + for ( i=first; i<=last; ++i ) { + if ( font->chars[i]!=NULL && font->chars[i]->width>0 ) + lputshort(file,font->chars[i]->width); + else + lputshort(file,0); + lputshort(file,datapos+widbytes); + if ( font->chars[i]!=NULL && font->chars[i]->width>0 ) + widbytes += ((font->chars[i]->width+7)>>3) * (maxy-miny+1); + } + /* And a space */ + lputshort(file,spacesize ); + lputshort(file,widbytes); + widbytes += spacesize; + /* And an end marker */ + lputshort(file,0); + lputshort(file,widbytes); + + if ( ftell(file)-startpos != datapos ) { + fprintf( stderr, "Internal error in creating FNT. file offset wrong\n" ); + complained = true; + } + + /* And finally the character data */ + widbytes = 0; + for ( i=first; i<=last; ++i ) { + BDFChar *bdfc = font->chars[i]; + if ( bdfc!=NULL && bdfc->width>0 ) { + widbytes += ((bdfc->width+7)>>3) * (maxy-miny+1); + for ( k=0 ; k< bdfc->width; k+= 8 ) { + for ( j=maxy; j>=miny; --j ) { + if ( j>bdfc->ymax || jymin ) + putc('\0',file); + else { + ch = 0; + for ( l=0; l<8; ++l ) { + if ( k+l>=bdfc->xmin && k+l<=bdfc->xmax && + (bdfc->bitmap[(bdfc->ymax-j)*bdfc->bytes_per_line+((k+l-bdfc->xmin)>>3)] + &(0x80>>((k+l-bdfc->xmin)&7))) ) + ch |= (0x80>>l); + } + putc(ch,file); + } + } + } + if ( ftell(file)-startpos != datapos+widbytes && !complained ) { + fprintf( stderr, "Internal error in creating FNT. file offset wrong in bitmap data\n" ); + complained = true; + } + } + } + /* And the space character */ + spacesize = (spacesize+7)>>3; + for ( i=0; isf->familyname,1,strlen(font->sf->familyname)+1,file); + + /* And now fixup the file size field */ + endpos = ftell(file); + fseek(file,startpos+2,SEEK_SET); + lputlong(file,endpos-startpos); + fseek(file,namelocpos,SEEK_SET); + lputlong(file,namepos); + fseek(file,endpos,SEEK_SET); +return( true ); +} + +int FONFontDump(char *filename,BDFFont *font, int res) { + FILE *file; + int ret; + + file = fopen(filename,"wb"); + if ( file==NULL ) { + fprintf( stderr, "Can't open %s\n", filename ); +return( 0 ); + } + ret = _FONFontDump(file,font,res); + if ( ferror(file)) + ret = 0; + if ( fclose(file)!=0 ) + ret = 0; +return( ret ); +} diff --git a/fontforge/zapfnomen.c b/fontforge/zapfnomen.c new file mode 100644 index 00000000..c2784881 --- /dev/null +++ b/fontforge/zapfnomen.c @@ -0,0 +1,287 @@ +/* Zapf dingbat info. Slot into unicode at 0x2700 */ +/* Taken from adobe's afm file */ + +char *zapfnomen[] = { + 0,"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",0, + 0,"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", + 0,"a201","a183","a184","a197","a185","a194","a198", + "a186","a195","a187","a188","a189","a190","a191",0 +}; + +short zapfwx[] = { + 0,974,961,974,980,719,789,790, + 791,690,960,939,549,855,911,933, + 911,945,974,755,846,762,761,571, + 677,763,760,759,754,494,552,537, + 577,692,786,788,788,790,793,794, + 816,823,789,841,823,833,816,831, + 923,744,723,749,790,792,695,776, + 768,792,759,707,708,682,701,826, + 815,789,789,707,687,696,689,786, + 787,713,791,785,791,873,761,762, + 762,759,759,892,892,788,784,438, + 138,277,415,392,392,668,668,0, + 0,732,544,544,910,667,760,760, + 776,595,694,626,788,788,788,788, + 788,788,788,788,788,788,788,788, + 788,788,788,788,788,788,788,788, + 788,788,788,788,788,788,788,788, + 788,788,788,788,788,788,788,788, + 788,788,788,788,894,838,1016,458, + 748,924,748,918,927,928,928,834, + 873,828,924,924,917,930,931,463, + 883,836,836,867,867,696,696,874, + 0,874,760,946,771,865,771,888, + 967,888,831,873,927,970,918,0 +}; + +short zapfbb[][4] = { + {0,0,0,0}, + {35,72,939,621}, + {35,81,927,611}, + {35,72,939,621}, + {35,0,945,692}, + {34,139,685,566}, + {35,-14,755,705}, + {35,-14,755,705}, + {35,-13,761,705}, + {35,138,655,553}, + {35,123,925,568}, + {35,134,904,559}, + {29,-11,516,705}, + {34,59,820,632}, + {35,50,876,642}, + {35,139,899,550}, + {35,50,876,642}, + {35,139,909,553}, + {35,104,938,587}, + {34,-13,721,705}, + {36,-14,811,705}, + {35,0,727,692}, + {35,0,727,692}, + {-1,-68,571,661}, + {36,-13,642,705}, + {35,0,728,692}, + {35,0,726,692}, + {35,0,725,692}, + {35,0,720,692}, + {35,0,460,692}, + {35,0,517,692}, + {35,0,503,692}, + {35,96,542,596}, + {35,-14,657,705}, + {35,-14,751,705}, + {35,-14,752,705}, + {35,-14,753,705}, + {35,-14,756,705}, + {35,-13,759,705}, + {35,-13,759,705}, + {35,-14,782,705}, + {35,-14,787,705}, + {35,-14,754,705}, + {35,-14,807,705}, + {35,-14,789,705}, + {35,-14,798,705}, + {35,-13,782,705}, + {35,-14,796,705}, + {35,-14,888,705}, + {35,0,710,692}, + {35,0,688,692}, + {35,0,714,692}, + {34,-14,756,705}, + {35,-14,758,705}, + {35,-14,661,706}, + {35,-6,741,699}, + {35,-7,734,699}, + {35,-14,757,705}, + {35,0,725,692}, + {35,-13,672,704}, + {35,-14,672,705}, + {35,-14,647,705}, + {35,-14,666,705}, + {35,-14,791,705}, + {35,-14,780,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {34,-14,673,705}, + {36,0,651,692}, + {35,0,661,691}, + {35,0,655,692}, + {34,-14,751,705}, + {35,-14,752,705}, + {35,-14,678,705}, + {35,-14,756,705}, + {36,-14,751,705}, + {35,-14,757,705}, + {35,-14,838,705}, + {35,0,726,692}, + {35,0,727,692}, + {35,0,727,692}, + {35,0,725,692}, + {35,0,725,692}, + {35,0,858,705}, + {35,-14,858,692}, + {35,-14,754,705}, + {35,-14,749,705}, + {35,-14,403,705}, + {35,0,104,692}, + {35,0,242,692}, + {35,0,380,692}, + {35,263,357,705}, + {34,263,357,705}, + {35,263,633,705}, + {36,263,634,705}, + {0,0,0,0}, + {0,0,0,0}, + {35,-143,697,806}, + {56,-14,488,706}, + {34,-14,508,705}, + {35,40,875,651}, + {35,-14,633,705}, + {35,-14,726,705}, + {0,121,758,569}, + {35,0,741,705}, + {34,-14,560,705}, + {35,-14,659,705}, + {34,0,591,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,-14,754,705}, + {35,58,860,634}, + {35,152,803,540}, + {34,152,981,540}, + {35,-127,422,820}, + {35,94,698,597}, + {35,140,890,552}, + {35,94,698,597}, + {35,166,884,526}, + {35,32,892,660}, + {35,129,891,562}, + {35,128,893,563}, + {35,155,799,537}, + {35,93,838,599}, + {35,104,791,588}, + {35,98,889,594}, + {35,98,889,594}, + {35,0,882,692}, + {35,84,896,608}, + {35,84,896,608}, + {35,-99,429,791}, + {35,71,848,623}, + {35,44,802,648}, + {35,44,802,648}, + {35,101,832,591}, + {35,101,832,591}, + {35,44,661,648}, + {35,44,661,648}, + {35,77,840,619}, + {0,0,0,0}, + {35,73,840,615}, + {35,0,725,692}, + {35,160,911,533}, + {34,37,736,655}, + {35,207,830,481}, + {34,37,736,655}, + {34,-19,853,712}, + {35,124,932,568}, + {34,-19,853,712}, + {35,113,796,579}, + {36,118,838,578}, + {35,150,891,542}, + {35,76,931,616}, + {34,99,884,593}, + {0,0,0,0} +}; + +char zapfexists[] = { + 0,1,1,1,1,0,1,1, + 1,1,0,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, + 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,0,1,0,1, + 1,1,1,0,0,0,1,0, + 1,1,1,1,1,1,1,0, + 0,1,1,1,1,1,1,1, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,1, + 1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1, + 1,1,1,1,1,0,0,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, + 0,1,1,1,1,1,1,1, + 1,1,1,1,1,1,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,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0 +}; diff --git a/install-sh b/install-sh new file mode 100755 index 00000000..e9de2384 --- /dev/null +++ b/install-sh @@ -0,0 +1,251 @@ +#!/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/ltmain.sh b/ltmain.sh new file mode 100644 index 00000000..c8c38c2c --- /dev/null +++ b/ltmain.sh @@ -0,0 +1,5064 @@ +# 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 +# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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. + +# 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 "$0" --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 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +# 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" + ;; + *) + 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" + exit 0 + ;; + + --config) + sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --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 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +# 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 + case $nonopt in + *cc | *++ | gcc* | *-gcc*) + 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 1 + 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= + prev= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + case $prev in + "") ;; + xcompiler) + # Aesthetically quote the previous argument. + prev= + lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + + case $arg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + # Accept any command-line options. + case $arg in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -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. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + case $user_target in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $lastarg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case $user_target in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + 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 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 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 1" 1 2 15 + else + 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 "$0" "$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 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + else + # Don't build PIC code + command="$base_compile $srcfile" + fi + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/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 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if (test -z "$pic_flag" || test "$pic_mode" != default) && + test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` + libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + # Now arrange that obj and lo_libobj become the same file + $show "(cd $xdir && $LN_S $baseobj $libobj)" + if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $run $rm "$lockfile" + fi + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $srcfile" + else + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/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 1 + fi + + # Just move the object if needed + if 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 + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $run $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link | relink) + modename="$modename: link" + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invokation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args="$nonopt" + compile_command="$nonopt" + finalize_command="$nonopt" + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -all-static | -static) + if test "X$arg" = "X-all-static"; then + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_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 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + release) + release="-$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 1 + ;; + 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 + ;; + *) + 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 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + 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*) + 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 + exit 1 + 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*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # 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 + ;; + + -o) prev=output ;; + + -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 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # 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 + ;; + + -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 + ;; + + # 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 + ;; + + *.lo | *.$objext) + # A library or standard object. + if test "$prev" = dlfiles; then + # This file was specified with -dlopen. + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $arg" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + else + case $arg in + *.lo) libobjs="$libobjs $arg" ;; + *) objs="$objs $arg" ;; + esac + 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 1 + 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 + + # 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 + status=$? + if test "$status" -ne 0 && test ! -d "$output_objdir"; then + 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 1 + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + 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_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 + notinst_path= # paths that contain 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 1 + ;; + 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" = prog; then + # Determine which files to process + case $pass in + dlopen) + libs="$dlfiles" + save_deplibs="$deplibs" # Collect dlpreopened libraries + deplibs= + ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -l*) + if test "$linkmode" = oldlib && test "$linkmode" = obj; then + $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 + continue + fi + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + # Search the libtool library + lib="$searchdir/lib${name}.la" + if test -f "$lib"; then + found=yes + break + fi + 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 + 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" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 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) + if test "$deplibs_check_method" != pass_all; then + echo + echo "*** Warning: This library needs some functionality provided by $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." + 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" = 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 + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit 1 + fi + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + 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 variable installed. + installed=yes + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" = oldlib && test "$linkmode" = obj; }; then + # Add dl[pre]opened files of deplib + 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 1 + 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 1 + 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 1 + 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 1 + 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. + dlprefiles="$dlprefiles $lib" + 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 + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + 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 1 + 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" + 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... + + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # Link against this shared library + + if test "$linkmode,$pass" = "prog,link" || + { 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 + if test "$linkmode" = prog; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + fi + 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 + + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + 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*) + 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='~' + eval cmds=\"$extract_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $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='~' + eval cmds=\"$old_archive_from_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $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" + 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" + 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 1 + 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 + # Try looking first in the location we're being installed to. + add_dir= + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="-L$inst_prefix_dir$libdir" + ;; + esac + fi + add_dir="$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" + else + # We cannot seem to hardcode it, guess we'll fake it. + # Try looking first in the location we're being installed to. + add_dir= + if test -n "$inst_prefix_dir"; then + case "$libdir" in + [\\/]*) + add_dir="-L$inst_prefix_dir$libdir" + ;; + esac + fi + add_dir="$add_dir -L$libdir" + 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 + 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 + + # Try to link the static library + # 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 library needs some functionality provided by $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 "*** Therefore, libtool will create a static module, that should work " + echo "*** as long as the dlopening 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 + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + 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="-L$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 1 + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="-L$absdir" + fi + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $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 + test "$pass" != scan && dependency_libs="$newdependency_libs" + 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 + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + *) + 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 + if test "$pass" = "conv" && + { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then + libs="$deplibs" # reset libs + deplibs= + fi + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + 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' 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 libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + 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 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 1 + 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. + libext=al + 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' 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 1 + fi + + current="$2" + revision="$3" + age="$4" + + # Check that each of the things are valid numbers. + case $current in + [0-9]*) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $revision in + [0-9]*) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $age in + [0-9]*) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + 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 1 + 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` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix) + major=`expr $current - $age + 1` + verstring="sgi$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="sgi$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 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + 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. + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + 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*) + # Do not include libc due to us having libc/libc_r. + ;; + *) + # 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 behaviour. + 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 + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $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." + 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 + 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 + 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 + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $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." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -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 + + # 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" + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + 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 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 + test -z "$dlname" && dlname=$soname + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) in case we are running --disable-static + for obj in $libobjs; do + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + if test ! -f $xdir/$oldobj; then + $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" + $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? + fi + 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 + eval cmds=\"$export_symbols_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + 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 + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + 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 -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || 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 $? + exit 0 + 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) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + 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 1 + 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 + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + 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" + eval cmds=\"$reload_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $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 0 + 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 0 + 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" + eval cmds=\"$reload_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$libobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + $show "(cd $xdir && $LN_S $oldobj $baseobj)" + $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + 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 + + 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*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + 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/$output.exp" + $run $rm $export_symbols + $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + 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" | sort +2 | 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. */ +const struct { + 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 -DPIC -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $CC -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. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + 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" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + 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 $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 0 + 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" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + 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" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case $0 in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --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 ;; + *) exeext= ;; + esac + $rm $output + trap "$rm $output; exit 1" 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' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + +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 1 + 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. +" + case $host in + # win32 systems need to use the prog path for dll + # lookup to work + *-*-cygwin* | *-*-pw32*) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} +" + ;; + + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + 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 1 + fi +fi\ +" + chmod +x $output + fi + exit 0 + ;; + 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="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test "$status" -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test "$status" -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place in case we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$oldobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` + obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + $show "(cd $xdir && ${LN_S} $obj $baseobj)" + $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + 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 $0 --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + + # 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 1 + 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 1 + 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 1 + fi + newdlprefiles="$newdlprefiles $libdir/$name" + 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) 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 + +# 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 0 + ;; + + # 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" | $Xsed | 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) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -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 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + 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 1 + 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 1 + 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 1 + ;; + 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 | egrep "^# 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 1 + 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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit 1 + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%%"` + 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 1 + 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. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || 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 1 + ;; + 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 0 + ;; + + *) + # 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 + + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + 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= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir=`mktemp -d $tmpdir/libtool-XXXXXX 2> /dev/null` + if test $? = 0 ; then : + else + tmpdir="$tmpdir/libtool-$$" + fi + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $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" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + 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 "$striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $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 $0 --finish$current_libdirs' + else + exit 0 + 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. + eval cmds=\"$finish_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $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 0 + + echo "----------------------------------------------------------------------" + 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 "----------------------------------------------------------------------" + exit 0 + ;; + + # 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 1 + 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 1 + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# 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 1 + 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 + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + 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 | egrep "^# 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 enviroment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # 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 0 + 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 1 + fi + + rmdirs= + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$objdir" + else + objdir="$dir/$objdir" + 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 | egrep "^# 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" + test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test "$mode" = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $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. + eval cmds=\"$old_postuninstall_cmds\" + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $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. + fi + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + ;; + + *) + # Do a test to see if this is a libtool program. + if test "$mode" = clean && + (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$file + + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + + # 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 1 + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit 1 +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 + --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." + exit 0 + ;; + +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 + -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 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 1 + ;; +esac + +echo +$echo "Try \`$modename --help' for more information about other modes." + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: -- cgit v1.2.3